History

Merge tag 'amd-drm-next-6.12-2024-09-13' of https://gitlab.freedesktop.org/agd5f/linux into drm-next

amd-drm-next-6.12-2024-09-13: amdgpu: - GPUVM sync fixes - kdoc fixes - Misc spelling mistakes - Add some raven GFXOFF quirks - Use clamp helper - DC fixes - JPEG fixes - Process isolation fix - Queue reset fix - W=1 cleanup - SMU14 fixes - JPEG fixes amdkfd: - Fetch cacheline info from IP discovery - Queue reset fix - RAS fix - Document SVM events - CRIU fixes - Race fix in dma-buf handling drm: - dma-buf fd race fixes Signed-off-by: Dave Airlie <airlied@redhat.com>

Dave Airlie committed 2 years ago

Commit 26df39d2 parents bf05aea 0c8c5bd50 files · +678 −366Browse files

Unified · Split

50 files
  1. drivers/gpu/drm/amd/amdgpu/Makefile +1 −17
  2. drivers/gpu/drm/amd/amdgpu/amdgpu.h +1 −0
  3. drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c +0 −1
  4. drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +3 −9
  5. drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +17 −0
  6. drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c +19 −16
  7. drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c +1 −0
  8. drivers/gpu/drm/amd/amdgpu/amdgpu_pll.c +1 −1
  9. drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c +0 −1
  10. drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +57 −42
  11. drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +6 −5
  12. drivers/gpu/drm/amd/amdgpu/amdgpu_vm_cpu.c +4 −6
  13. drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c +1 −1
  14. drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c +4 −12
  15. drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +4 −0
  16. drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.c +75 −1
  17. drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.h +11 −0
  18. drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c +62 −1
  19. drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.h +6 −0
  20. drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c +2 −0
  21. drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c +1 −0
  22. drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c +1 −0
  23. drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.h +0 −1
  24. drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c +17 −76
  25. drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.h +1 −6
  26. drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.c +1 −0
  27. drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_0.c +2 −1
  28. drivers/gpu/drm/amd/amdgpu/mes_v11_0.c +1 −1
  29. drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +46 −18
  30. drivers/gpu/drm/amd/amdkfd/kfd_crat.c +7 −1
  31. drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +3 −2
  32. drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c +32 −8
  33. drivers/gpu/drm/amd/amdkfd/kfd_priv.h +6 −0
  34. drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c +1 −0
  35. drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c +22 −23
  36. drivers/gpu/drm/amd/amdkfd/kfd_svm.c +15 −7
  37. drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +12 −1
  38. drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +1 −1
  39. drivers/gpu/drm/amd/display/dc/dccg/dcn35/dcn35_dccg.c +34 −45
  40. drivers/gpu/drm/amd/display/dc/dccg/dcn35/dcn35_dccg.h +1 −0
  41. drivers/gpu/drm/amd/display/dc/dpp/dcn401/dcn401_dpp_dscl.c +2 −0
  42. drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.c +12 −8
  43. drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c +16 −8
  44. drivers/gpu/drm/amd/display/dc/inc/hw/dccg.h +1 −0
  45. drivers/gpu/drm/amd/include/atomfirmware.h +2 −2
  46. drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h +10 −1
  47. drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c +12 −0
  48. drivers/gpu/drm/drm_prime.c +54 −30
  49. include/drm/drm_prime.h +3 −0
  50. include/uapi/linux/kfd_ioctl.h +87 −13
drivers/gpu/drm/amd/amdgpu/Makefile+1−17
@@ -39,23 +39,7 @@ ccflags-y := -I$(FULL_AMD_PATH)/include/asic_reg \ · 38 unmodified lines
3939 -I$(FULL_AMD_DISPLAY_PATH)/amdgpu_dm \
4040 -I$(FULL_AMD_PATH)/amdkfd
4141
42−subdir-ccflags-y := -Wextra
43−subdir-ccflags-y += -Wunused
44−subdir-ccflags-y += -Wmissing-prototypes
45−subdir-ccflags-y += -Wmissing-declarations
46−subdir-ccflags-y += -Wmissing-include-dirs
47−subdir-ccflags-y += -Wold-style-definition
48−subdir-ccflags-y += -Wmissing-format-attribute
49−# Need this to avoid recursive variable evaluation issues
50−cond-flags := $(call cc-option, -Wunused-but-set-variable) \
51− $(call cc-option, -Wunused-const-variable) \
52− $(call cc-option, -Wstringop-truncation) \
53− $(call cc-option, -Wpacked-not-aligned)
54−subdir-ccflags-y += $(cond-flags)
55−subdir-ccflags-y += -Wno-unused-parameter
56−subdir-ccflags-y += -Wno-type-limits
57−subdir-ccflags-y += -Wno-sign-compare
58−subdir-ccflags-y += -Wno-missing-field-initializers
42+# Locally disable W=1 warnings enabled in drm subsystem Makefile
5943 subdir-ccflags-y += -Wno-override-init
6044 subdir-ccflags-$(CONFIG_DRM_AMDGPU_WERROR) += -Werror
6145
drivers/gpu/drm/amd/amdgpu/amdgpu.h+1−0
@@ -237,6 +237,7 @@ extern int sched_policy; · 236 unmodified lines
237237 extern bool debug_evictions;
238238 extern bool no_system_mem_limit;
239239 extern int halt_if_hws_hang;
240+extern uint amdgpu_svm_default_granularity;
240241 #else
241242 static const int __maybe_unused sched_policy = KFD_SCHED_POLICY_HWS;
242243 static const bool __maybe_unused debug_evictions; /* = false */
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c+0−1
@@ -20,7 +20,6 @@ · 19 unmodified lines
2020 * OTHER DEALINGS IN THE SOFTWARE.
2121 */
2222 #include <linux/module.h>
23−#include <linux/fdtable.h>
2423 #include <linux/uaccess.h>
2524 #include <linux/firmware.h>
2625 #include "amdgpu.h"
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c+3−9
@@ -25,7 +25,6 @@ · 24 unmodified lines
2525 #include <linux/pagemap.h>
2626 #include <linux/sched/mm.h>
2727 #include <linux/sched/task.h>
28−#include <linux/fdtable.h>
2928 #include <drm/ttm/ttm_tt.h>
3029
3130 #include <drm/drm_exec.h>
@@ -818,18 +817,13 @@ static int kfd_mem_export_dmabuf(struct kgd_mem *mem) · 786 unmodified lines
818817 if (!mem->dmabuf) {
819818 struct amdgpu_device *bo_adev;
820819 struct dma_buf *dmabuf;
821− int r, fd;
822820
823821 bo_adev = amdgpu_ttm_adev(mem->bo->tbo.bdev);
824− r = drm_gem_prime_handle_to_fd(&bo_adev->ddev, bo_adev->kfd.client.file,
822+ dmabuf = drm_gem_prime_handle_to_dmabuf(&bo_adev->ddev, bo_adev->kfd.client.file,
825823 mem->gem_handle,
826824 mem->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE ?
827− DRM_RDWR : 0, &fd);
828− if (r)
829− return r;
830− dmabuf = dma_buf_get(fd);
831− close_fd(fd);
832− if (WARN_ON_ONCE(IS_ERR(dmabuf)))
825+ DRM_RDWR : 0);
826+ if (IS_ERR(dmabuf))
833827 return PTR_ERR(dmabuf);
834828 mem->dmabuf = dmabuf;
835829 }
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c+17−0
@@ -169,6 +169,16 @@ uint amdgpu_sdma_phase_quantum = 32; · 168 unmodified lines
169169 char *amdgpu_disable_cu;
170170 char *amdgpu_virtual_display;
171171 bool enforce_isolation;
172+
173+/* Specifies the default granularity for SVM, used in buffer
174+ * migration and restoration of backing memory when handling
175+ * recoverable page faults.
176+ *
177+ * The value is given as log(numPages(buffer)); for a 2 MiB
178+ * buffer it computes to be 9
179+ */
180+uint amdgpu_svm_default_granularity = 9;
181+
172182 /*
173183 * OverDrive(bit 14) disabled by default
174184 * GFX DCS(bit 19) disabled by default
@@ -320,6 +330,13 @@ module_param_named(pcie_gen2, amdgpu_pcie_gen2, int, 0444); · 145 unmodified lines
320330 MODULE_PARM_DESC(msi, "MSI support (1 = enable, 0 = disable, -1 = auto)");
321331 module_param_named(msi, amdgpu_msi, int, 0444);
322332
333+/**
334+ * DOC: svm_default_granularity (uint)
335+ * Used in buffer migration and handling of recoverable page faults
336+ */
337+MODULE_PARM_DESC(svm_default_granularity, "SVM's default granularity in log(2^Pages), default 9 = 2^9 = 2 MiB");
338+module_param_named(svm_default_granularity, amdgpu_svm_default_granularity, uint, 0644);
339+
323340 /**
324341 * DOC: lockup_timeout (string)
325342 * Set GPU scheduler timeout value in ms.
drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c+19−16
@@ -1397,14 +1397,23 @@ static ssize_t amdgpu_gfx_get_available_compute_partition(struct device *dev, · 1396 unmodified lines
13971397 static int amdgpu_gfx_run_cleaner_shader_job(struct amdgpu_ring *ring)
13981398 {
13991399 struct amdgpu_device *adev = ring->adev;
1400− long timeout = msecs_to_jiffies(1000);
1401− struct dma_fence *f = NULL;
1400+ struct drm_gpu_scheduler *sched = &ring->sched;
1401+ struct drm_sched_entity entity;
1402+ struct dma_fence *f;
14021403 struct amdgpu_job *job;
14031404 struct amdgpu_ib *ib;
14041405 int i, r;
14051406
1406− r = amdgpu_job_alloc_with_ib(adev, NULL, NULL,
1407− 64, AMDGPU_IB_POOL_DIRECT,
1407+ /* Initialize the scheduler entity */
1408+ r = drm_sched_entity_init(&entity, DRM_SCHED_PRIORITY_NORMAL,
1409+ &sched, 1, NULL);
1410+ if (r) {
1411+ dev_err(adev->dev, "Failed setting up GFX kernel entity.\n");
1412+ goto err;
1413+ }
1414+
1415+ r = amdgpu_job_alloc_with_ib(ring->adev, &entity, NULL,
1416+ 64, 0,
14081417 &job);
14091418 if (r)
14101419 goto err;
@@ -1416,24 +1425,18 @@ static int amdgpu_gfx_run_cleaner_shader_job(struct amdgpu_ring *ring) · 5 unmodified lines
14161425 ib->ptr[i] = ring->funcs->nop;
14171426 ib->length_dw = ring->funcs->align_mask + 1;
14181427
1419− r = amdgpu_job_submit_direct(job, ring, &f);
1420− if (r)
1421− goto err_free;
1428+ f = amdgpu_job_submit(job);
14221429
1423− r = dma_fence_wait_timeout(f, false, timeout);
1424− if (r == 0)
1425− r = -ETIMEDOUT;
1426− else if (r > 0)
1427− r = 0;
1430+ r = dma_fence_wait(f, false);
1431+ if (r)
1432+ goto err;
14281433
1429− amdgpu_ib_free(adev, ib, f);
14301434 dma_fence_put(f);
14311435
1436+ /* Clean up the scheduler entity */
1437+ drm_sched_entity_destroy(&entity);
14321438 return 0;
14331439
1434−err_free:
1435− amdgpu_job_free(job);
1436− amdgpu_ib_free(adev, ib, f);
14371440 err:
14381441 return r;
14391442 }
drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c+1−0
@@ -832,6 +832,7 @@ int amdgpu_mes_reset_hw_queue_mmio(struct amdgpu_device *adev, int queue_type, · 831 unmodified lines
832832 struct mes_reset_queue_input queue_input;
833833 int r;
834834
835+ queue_input.queue_type = queue_type;
835836 queue_input.use_mmio = true;
836837 queue_input.me_id = me_id;
837838 queue_input.pipe_id = pipe_id;
drivers/gpu/drm/amd/amdgpu/amdgpu_pll.c+1−1
@@ -94,7 +94,7 @@ static void amdgpu_pll_get_fb_ref_div(struct amdgpu_device *adev, unsigned int n · 93 unmodified lines
9494 ref_div_max = min(128 / post_div, ref_div_max);
9595
9696 /* get matching reference and feedback divider */
97− *ref_div = min(max(DIV_ROUND_CLOSEST(den, post_div), 1u), ref_div_max);
97+ *ref_div = clamp(DIV_ROUND_CLOSEST(den, post_div), 1u, ref_div_max);
9898 *fb_div = DIV_ROUND_CLOSEST(nom * *ref_div * post_div, den);
9999
100100 /* limit fb divider to its maximum */
drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c+0−1
@@ -22,7 +22,6 @@ · 21 unmodified lines
2222 * Authors: Andres Rodriguez <andresx7@gmail.com>
2323 */
2424
25−#include <linux/fdtable.h>
2625 #include <linux/file.h>
2726 #include <linux/pid.h>
2827
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c+57−42
@@ -844,7 +844,7 @@ int amdgpu_vm_update_pdes(struct amdgpu_device *adev, · 843 unmodified lines
844844 params.vm = vm;
845845 params.immediate = immediate;
846846
847− r = vm->update_funcs->prepare(&params, NULL, AMDGPU_SYNC_EXPLICIT);
847+ r = vm->update_funcs->prepare(&params, NULL);
848848 if (r)
849849 goto error;
850850
@@ -908,10 +908,12 @@ amdgpu_vm_tlb_flush(struct amdgpu_vm_update_params *params, · 57 unmodified lines
908908 {
909909 struct amdgpu_vm *vm = params->vm;
910910
911− if (!fence || !*fence)
911+ tlb_cb->vm = vm;
912+ if (!fence || !*fence) {
913+ amdgpu_vm_tlb_seq_cb(NULL, &tlb_cb->cb);
912914 return;
915+ }
913916
914− tlb_cb->vm = vm;
915917 if (!dma_fence_add_callback(*fence, &tlb_cb->cb,
916918 amdgpu_vm_tlb_seq_cb)) {
917919 dma_fence_put(vm->last_tlb_flush);
@@ -939,7 +941,7 @@ amdgpu_vm_tlb_flush(struct amdgpu_vm_update_params *params, · 21 unmodified lines
939941 * @unlocked: unlocked invalidation during MM callback
940942 * @flush_tlb: trigger tlb invalidation after update completed
941943 * @allow_override: change MTYPE for local NUMA nodes
942− * @resv: fences we need to sync to
944+ * @sync: fences we need to sync to
943945 * @start: start of mapped range
944946 * @last: last mapped entry
945947 * @flags: flags for the entries
@@ -955,16 +957,16 @@ amdgpu_vm_tlb_flush(struct amdgpu_vm_update_params *params, · 9 unmodified lines
955957 * 0 for success, negative erro code for failure.
956958 */
957959 int amdgpu_vm_update_range(struct amdgpu_device *adev, struct amdgpu_vm *vm,
958− bool immediate, bool unlocked, bool flush_tlb, bool allow_override,
959− struct dma_resv *resv, uint64_t start, uint64_t last,
960− uint64_t flags, uint64_t offset, uint64_t vram_base,
960+ bool immediate, bool unlocked, bool flush_tlb,
961+ bool allow_override, struct amdgpu_sync *sync,
962+ uint64_t start, uint64_t last, uint64_t flags,
963+ uint64_t offset, uint64_t vram_base,
961964 struct ttm_resource *res, dma_addr_t *pages_addr,
962965 struct dma_fence **fence)
963966 {
964967 struct amdgpu_vm_tlb_seq_struct *tlb_cb;
965968 struct amdgpu_vm_update_params params;
966969 struct amdgpu_res_cursor cursor;
967− enum amdgpu_sync_mode sync_mode;
968970 int r, idx;
969971
970972 if (!drm_dev_enter(adev_to_drm(adev), &idx))
@@ -997,14 +999,6 @@ int amdgpu_vm_update_range(struct amdgpu_device *adev, struct amdgpu_vm *vm, · 26 unmodified lines
997999 params.allow_override = allow_override;
9981000 INIT_LIST_HEAD(&params.tlb_flush_waitlist);
9991001
1000− /* Implicitly sync to command submissions in the same VM before
1001− * unmapping. Sync to moving fences before mapping.
1002− */
1003− if (!(flags & AMDGPU_PTE_VALID))
1004− sync_mode = AMDGPU_SYNC_EQ_OWNER;
1005− else
1006− sync_mode = AMDGPU_SYNC_EXPLICIT;
1007−
10081002 amdgpu_vm_eviction_lock(vm);
10091003 if (vm->evicting) {
10101004 r = -EBUSY;
@@ -1019,7 +1013,7 @@ int amdgpu_vm_update_range(struct amdgpu_device *adev, struct amdgpu_vm *vm, · 8 unmodified lines
10191013 dma_fence_put(tmp);
10201014 }
10211015
1022− r = vm->update_funcs->prepare(&params, resv, sync_mode);
1016+ r = vm->update_funcs->prepare(&params, sync);
10231017 if (r)
10241018 goto error_free;
10251019
@@ -1161,23 +1155,30 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev, struct amdgpu_bo_va *bo_va, · 135 unmodified lines
11611155 struct amdgpu_bo *bo = bo_va->base.bo;
11621156 struct amdgpu_vm *vm = bo_va->base.vm;
11631157 struct amdgpu_bo_va_mapping *mapping;
1158+ struct dma_fence **last_update;
11641159 dma_addr_t *pages_addr = NULL;
11651160 struct ttm_resource *mem;
1166− struct dma_fence **last_update;
1161+ struct amdgpu_sync sync;
11671162 bool flush_tlb = clear;
1168− bool uncached;
1169− struct dma_resv *resv;
11701163 uint64_t vram_base;
11711164 uint64_t flags;
1165+ bool uncached;
11721166 int r;
11731167
1168+ amdgpu_sync_create(&sync);
11741169 if (clear || !bo) {
11751170 mem = NULL;
1176− resv = vm->root.bo->tbo.base.resv;
1171+
1172+ /* Implicitly sync to command submissions in the same VM before
1173+ * unmapping.
1174+ */
1175+ r = amdgpu_sync_resv(adev, &sync, vm->root.bo->tbo.base.resv,
1176+ AMDGPU_SYNC_EQ_OWNER, vm);
1177+ if (r)
1178+ goto error_free;
11771179 } else {
11781180 struct drm_gem_object *obj = &bo->tbo.base;
11791181
1180− resv = bo->tbo.base.resv;
11811182 if (obj->import_attach && bo_va->is_xgmi) {
11821183 struct dma_buf *dma_buf = obj->import_attach->dmabuf;
11831184 struct drm_gem_object *gobj = dma_buf->priv;
@@ -1191,6 +1192,12 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev, struct amdgpu_bo_va *bo_va, · 7 unmodified lines
11911192 if (mem && (mem->mem_type == TTM_PL_TT ||
11921193 mem->mem_type == AMDGPU_PL_PREEMPT))
11931194 pages_addr = bo->tbo.ttm->dma_address;
1195+
1196+ /* Implicitly sync to moving fences before mapping anything */
1197+ r = amdgpu_sync_resv(adev, &sync, bo->tbo.base.resv,
1198+ AMDGPU_SYNC_EXPLICIT, vm);
1199+ if (r)
1200+ goto error_free;
11941201 }
11951202
11961203 if (bo) {
@@ -1240,12 +1247,12 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev, struct amdgpu_bo_va *bo_va, · 43 unmodified lines
12401247 trace_amdgpu_vm_bo_update(mapping);
12411248
12421249 r = amdgpu_vm_update_range(adev, vm, false, false, flush_tlb,
1243− !uncached, resv, mapping->start, mapping->last,
1244− update_flags, mapping->offset,
1245− vram_base, mem, pages_addr,
1246− last_update);
1250+ !uncached, &sync, mapping->start,
1251+ mapping->last, update_flags,
1252+ mapping->offset, vram_base, mem,
1253+ pages_addr, last_update);
12471254 if (r)
1248− return r;
1255+ goto error_free;
12491256 }
12501257
12511258 /* If the BO is not in its preferred location add it back to
@@ -1273,7 +1280,9 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev, struct amdgpu_bo_va *bo_va, · 21 unmodified lines
12731280 trace_amdgpu_vm_bo_mapping(mapping);
12741281 }
12751282
1276− return 0;
1283+error_free:
1284+ amdgpu_sync_free(&sync);
1285+ return r;
12771286 }
12781287
12791288 /**
@@ -1420,25 +1429,34 @@ int amdgpu_vm_clear_freed(struct amdgpu_device *adev, · 140 unmodified lines
14201429 struct amdgpu_vm *vm,
14211430 struct dma_fence **fence)
14221431 {
1423− struct dma_resv *resv = vm->root.bo->tbo.base.resv;
14241432 struct amdgpu_bo_va_mapping *mapping;
1425− uint64_t init_pte_value = 0;
14261433 struct dma_fence *f = NULL;
1434+ struct amdgpu_sync sync;
14271435 int r;
14281436
1437+
1438+ /*
1439+ * Implicitly sync to command submissions in the same VM before
1440+ * unmapping.
1441+ */
1442+ amdgpu_sync_create(&sync);
1443+ r = amdgpu_sync_resv(adev, &sync, vm->root.bo->tbo.base.resv,
1444+ AMDGPU_SYNC_EQ_OWNER, vm);
1445+ if (r)
1446+ goto error_free;
1447+
14291448 while (!list_empty(&vm->freed)) {
14301449 mapping = list_first_entry(&vm->freed,
14311450 struct amdgpu_bo_va_mapping, list);
14321451 list_del(&mapping->list);
14331452
14341453 r = amdgpu_vm_update_range(adev, vm, false, false, true, false,
1435− resv, mapping->start, mapping->last,
1436− init_pte_value, 0, 0, NULL, NULL,
1437− &f);
1454+ &sync, mapping->start, mapping->last,
1455+ 0, 0, 0, NULL, NULL, &f);
14381456 amdgpu_vm_free_mapping(adev, vm, mapping, f);
14391457 if (r) {
14401458 dma_fence_put(f);
1441− return r;
1459+ goto error_free;
14421460 }
14431461 }
14441462
@@ -1449,7 +1467,9 @@ int amdgpu_vm_clear_freed(struct amdgpu_device *adev, · 4 unmodified lines
14491467 dma_fence_put(f);
14501468 }
14511469
1452− return 0;
1470+error_free:
1471+ amdgpu_sync_free(&sync);
1472+ return r;
14531473
14541474 }
14551475
@@ -2224,7 +2244,7 @@ void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t min_vm_size, · 768 unmodified lines
22242244 phys_ram_gb = ((uint64_t)si.totalram * si.mem_unit +
22252245 (1 << 30) - 1) >> 30;
22262246 vm_size = roundup_pow_of_two(
2227− min(max(phys_ram_gb * 3, min_vm_size), max_size));
2247+ clamp(phys_ram_gb * 3, min_vm_size, max_size));
22282248 }
22292249
22302250 adev->vm_manager.max_pfn = (uint64_t)vm_size << 18;
@@ -2403,7 +2423,6 @@ void amdgpu_vm_set_task_info(struct amdgpu_vm *vm) · 172 unmodified lines
24032423 int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,
24042424 int32_t xcp_id)
24052425 {
2406− struct amdgpu_ip_block *ip_block;
24072426 struct amdgpu_bo *root_bo;
24082427 struct amdgpu_bo_vm *root;
24092428 int r, i;
@@ -2435,11 +2454,6 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm, · 25 unmodified lines
24352454 vm->use_cpu_for_update = !!(adev->vm_manager.vm_update_mode &
24362455 AMDGPU_VM_USE_CPU_FOR_GFX);
24372456
2438− /* use CPU for page table update if SDMA is unavailable */
2439− ip_block = amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_SDMA);
2440− if (!ip_block || ip_block->status.valid == false)
2441− vm->use_cpu_for_update = true;
2442−
24432457 DRM_DEBUG_DRIVER("VM update mode is %s\n",
24442458 vm->use_cpu_for_update ? "CPU" : "SDMA");
24452459 WARN_ONCE((vm->use_cpu_for_update &&
@@ -2770,6 +2784,7 @@ int amdgpu_vm_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) · 324 unmodified lines
27702784 * amdgpu_vm_handle_fault - graceful handling of VM faults.
27712785 * @adev: amdgpu device pointer
27722786 * @pasid: PASID of the VM
2787+ * @ts: Timestamp of the fault
27732788 * @vmid: VMID, only used for GFX 9.4.3.
27742789 * @node_id: Node_id received in IH cookie. Only applicable for
27752790 * GFX 9.4.3.
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h+6−5
@@ -304,8 +304,8 @@ struct amdgpu_vm_update_params { · 303 unmodified lines
304304
305305 struct amdgpu_vm_update_funcs {
306306 int (*map_table)(struct amdgpu_bo_vm *bo);
307− int (*prepare)(struct amdgpu_vm_update_params *p, struct dma_resv *resv,
308− enum amdgpu_sync_mode sync_mode);
307+ int (*prepare)(struct amdgpu_vm_update_params *p,
308+ struct amdgpu_sync *sync);
309309 int (*update)(struct amdgpu_vm_update_params *p,
310310 struct amdgpu_bo_vm *bo, uint64_t pe, uint64_t addr,
311311 unsigned count, uint32_t incr, uint64_t flags);
@@ -505,9 +505,10 @@ int amdgpu_vm_flush_compute_tlb(struct amdgpu_device *adev, · 193 unmodified lines
505505 void amdgpu_vm_bo_base_init(struct amdgpu_vm_bo_base *base,
506506 struct amdgpu_vm *vm, struct amdgpu_bo *bo);
507507 int amdgpu_vm_update_range(struct amdgpu_device *adev, struct amdgpu_vm *vm,
508− bool immediate, bool unlocked, bool flush_tlb, bool allow_override,
509− struct dma_resv *resv, uint64_t start, uint64_t last,
510− uint64_t flags, uint64_t offset, uint64_t vram_base,
508+ bool immediate, bool unlocked, bool flush_tlb,
509+ bool allow_override, struct amdgpu_sync *sync,
510+ uint64_t start, uint64_t last, uint64_t flags,
511+ uint64_t offset, uint64_t vram_base,
511512 struct ttm_resource *res, dma_addr_t *pages_addr,
512513 struct dma_fence **fence);
513514 int amdgpu_vm_bo_update(struct amdgpu_device *adev,
drivers/gpu/drm/amd/amdgpu/amdgpu_vm_cpu.c+4−6
@@ -39,20 +39,18 @@ static int amdgpu_vm_cpu_map_table(struct amdgpu_bo_vm *table) · 38 unmodified lines
3939 * amdgpu_vm_cpu_prepare - prepare page table update with the CPU
4040 *
4141 * @p: see amdgpu_vm_update_params definition
42− * @resv: reservation object with embedded fence
43− * @sync_mode: synchronization mode
42+ * @sync: sync obj with fences to wait on
4443 *
4544 * Returns:
4645 * Negativ errno, 0 for success.
4746 */
4847 static int amdgpu_vm_cpu_prepare(struct amdgpu_vm_update_params *p,
49− struct dma_resv *resv,
50− enum amdgpu_sync_mode sync_mode)
48+ struct amdgpu_sync *sync)
5149 {
52− if (!resv)
50+ if (!sync)
5351 return 0;
5452
55− return amdgpu_bo_sync_wait_resv(p->adev, resv, sync_mode, p->vm, true);
53+ return amdgpu_sync_wait(sync, true);
5654 }
5755
5856 /**
drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c+1−1
@@ -403,7 +403,7 @@ int amdgpu_vm_pt_clear(struct amdgpu_device *adev, struct amdgpu_vm *vm, · 402 unmodified lines
403403 params.vm = vm;
404404 params.immediate = immediate;
405405
406− r = vm->update_funcs->prepare(&params, NULL, AMDGPU_SYNC_EXPLICIT);
406+ r = vm->update_funcs->prepare(&params, NULL);
407407 if (r)
408408 goto exit;
409409
drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c+4−12
@@ -77,32 +77,24 @@ static int amdgpu_vm_sdma_alloc_job(struct amdgpu_vm_update_params *p, · 76 unmodified lines
7777 * amdgpu_vm_sdma_prepare - prepare SDMA command submission
7878 *
7979 * @p: see amdgpu_vm_update_params definition
80− * @resv: reservation object with embedded fence
81− * @sync_mode: synchronization mode
80+ * @sync: amdgpu_sync object with fences to wait for
8281 *
8382 * Returns:
8483 * Negativ errno, 0 for success.
8584 */
8685 static int amdgpu_vm_sdma_prepare(struct amdgpu_vm_update_params *p,
87− struct dma_resv *resv,
88− enum amdgpu_sync_mode sync_mode)
86+ struct amdgpu_sync *sync)
8987 {
90− struct amdgpu_sync sync;
9188 int r;
9289
9390 r = amdgpu_vm_sdma_alloc_job(p, 0);
9491 if (r)
9592 return r;
9693
97− if (!resv)
94+ if (!sync)
9895 return 0;
9996
100− amdgpu_sync_create(&sync);
101− r = amdgpu_sync_resv(p->adev, &sync, resv, sync_mode, p->vm);
102− if (!r)
103− r = amdgpu_sync_push_to_job(&sync, p->job);
104− amdgpu_sync_free(&sync);
105−
97+ r = amdgpu_sync_push_to_job(sync, p->job);
10698 if (r) {
10799 p->num_dw_left = 0;
108100 amdgpu_job_free(p->job);
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c+4−0
@@ -1345,6 +1345,10 @@ static const struct amdgpu_gfxoff_quirk amdgpu_gfxoff_quirk_list[] = { · 1344 unmodified lines
13451345 { 0x1002, 0x15dd, 0x1002, 0x15dd, 0xc6 },
13461346 /* Apple MacBook Pro (15-inch, 2019) Radeon Pro Vega 20 4 GB */
13471347 { 0x1002, 0x69af, 0x106b, 0x019a, 0xc0 },
1348+ /* https://bbs.openkylin.top/t/topic/171497 */
1349+ { 0x1002, 0x15d8, 0x19e5, 0x3e14, 0xc2 },
1350+ /* HP 705G4 DM with R5 2400G */
1351+ { 0x1002, 0x15dd, 0x103c, 0x8464, 0xd6 },
13481352 { 0, 0, 0, 0, 0 },
13491353 };
13501354
drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.c+75−1
@@ -23,6 +23,7 @@ · 22 unmodified lines
2323
2424 #include "amdgpu.h"
2525 #include "amdgpu_jpeg.h"
26+#include "amdgpu_cs.h"
2627 #include "soc15.h"
2728 #include "soc15d.h"
2829 #include "vcn_v1_0.h"
@@ -34,6 +35,9 @@ · 5 unmodified lines
3435 static void jpeg_v1_0_set_dec_ring_funcs(struct amdgpu_device *adev);
3536 static void jpeg_v1_0_set_irq_funcs(struct amdgpu_device *adev);
3637 static void jpeg_v1_0_ring_begin_use(struct amdgpu_ring *ring);
38+static int jpeg_v1_dec_ring_parse_cs(struct amdgpu_cs_parser *parser,
39+ struct amdgpu_job *job,
40+ struct amdgpu_ib *ib);
3741
3842 static void jpeg_v1_0_decode_ring_patch_wreg(struct amdgpu_ring *ring, uint32_t *ptr, uint32_t reg_offset, uint32_t val)
3943 {
@@ -300,7 +304,10 @@ static void jpeg_v1_0_decode_ring_emit_ib(struct amdgpu_ring *ring, · 260 unmodified lines
300304
301305 amdgpu_ring_write(ring,
302306 PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JRBC_IB_VMID), 0, 0, PACKETJ_TYPE0));
303− amdgpu_ring_write(ring, (vmid | (vmid << 4)));
307+ if (ring->funcs->parse_cs)
308+ amdgpu_ring_write(ring, 0);
309+ else
310+ amdgpu_ring_write(ring, (vmid | (vmid << 4)));
304311
305312 amdgpu_ring_write(ring,
306313 PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JPEG_VMID), 0, 0, PACKETJ_TYPE0));
@@ -554,6 +561,7 @@ static const struct amdgpu_ring_funcs jpeg_v1_0_decode_ring_vm_funcs = { · 247 unmodified lines
554561 .get_rptr = jpeg_v1_0_decode_ring_get_rptr,
555562 .get_wptr = jpeg_v1_0_decode_ring_get_wptr,
556563 .set_wptr = jpeg_v1_0_decode_ring_set_wptr,
564+ .parse_cs = jpeg_v1_dec_ring_parse_cs,
557565 .emit_frame_size =
558566 6 + 6 + /* hdp invalidate / flush */
559567 SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
@@ -611,3 +619,69 @@ static void jpeg_v1_0_ring_begin_use(struct amdgpu_ring *ring) · 51 unmodified lines
611619
612620 vcn_v1_0_set_pg_for_begin_use(ring, set_clocks);
613621 }
622+
623+/**
624+ * jpeg_v1_dec_ring_parse_cs - command submission parser
625+ *
626+ * @parser: Command submission parser context
627+ * @job: the job to parse
628+ * @ib: the IB to parse
629+ *
630+ * Parse the command stream, return -EINVAL for invalid packet,
631+ * 0 otherwise
632+ */
633+static int jpeg_v1_dec_ring_parse_cs(struct amdgpu_cs_parser *parser,
634+ struct amdgpu_job *job,
635+ struct amdgpu_ib *ib)
636+{
637+ u32 i, reg, res, cond, type;
638+ int ret = 0;
639+ struct amdgpu_device *adev = parser->adev;
640+
641+ for (i = 0; i < ib->length_dw ; i += 2) {
642+ reg = CP_PACKETJ_GET_REG(ib->ptr[i]);
643+ res = CP_PACKETJ_GET_RES(ib->ptr[i]);
644+ cond = CP_PACKETJ_GET_COND(ib->ptr[i]);
645+ type = CP_PACKETJ_GET_TYPE(ib->ptr[i]);
646+
647+ if (res || cond != PACKETJ_CONDITION_CHECK0) /* only allow 0 for now */
648+ return -EINVAL;
649+
650+ if (reg >= JPEG_V1_REG_RANGE_START && reg <= JPEG_V1_REG_RANGE_END)
651+ continue;
652+
653+ switch (type) {
654+ case PACKETJ_TYPE0:
655+ if (reg != JPEG_V1_LMI_JPEG_WRITE_64BIT_BAR_HIGH &&
656+ reg != JPEG_V1_LMI_JPEG_WRITE_64BIT_BAR_LOW &&
657+ reg != JPEG_V1_LMI_JPEG_READ_64BIT_BAR_HIGH &&
658+ reg != JPEG_V1_LMI_JPEG_READ_64BIT_BAR_LOW &&
659+ reg != JPEG_V1_REG_CTX_INDEX &&
660+ reg != JPEG_V1_REG_CTX_DATA) {
661+ ret = -EINVAL;
662+ }
663+ break;
664+ case PACKETJ_TYPE1:
665+ if (reg != JPEG_V1_REG_CTX_DATA)
666+ ret = -EINVAL;
667+ break;
668+ case PACKETJ_TYPE3:
669+ if (reg != JPEG_V1_REG_SOFT_RESET)
670+ ret = -EINVAL;
671+ break;
672+ case PACKETJ_TYPE6:
673+ if (ib->ptr[i] != CP_PACKETJ_NOP)
674+ ret = -EINVAL;
675+ break;
676+ default:
677+ ret = -EINVAL;
678+ }
679+
680+ if (ret) {
681+ dev_err(adev->dev, "Invalid packet [0x%08x]!\n", ib->ptr[i]);
682+ break;
683+ }
684+ }
685+
686+ return ret;
687+}
drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.h+11−0
@@ -29,4 +29,15 @@ int jpeg_v1_0_sw_init(void *handle); · 28 unmodified lines
2929 void jpeg_v1_0_sw_fini(void *handle);
3030 void jpeg_v1_0_start(struct amdgpu_device *adev, int mode);
3131
32+#define JPEG_V1_REG_RANGE_START 0x8000
33+#define JPEG_V1_REG_RANGE_END 0x803f
34+
35+#define JPEG_V1_LMI_JPEG_WRITE_64BIT_BAR_HIGH 0x8238
36+#define JPEG_V1_LMI_JPEG_WRITE_64BIT_BAR_LOW 0x8239
37+#define JPEG_V1_LMI_JPEG_READ_64BIT_BAR_HIGH 0x825a
38+#define JPEG_V1_LMI_JPEG_READ_64BIT_BAR_LOW 0x825b
39+#define JPEG_V1_REG_CTX_INDEX 0x8328
40+#define JPEG_V1_REG_CTX_DATA 0x8329
41+#define JPEG_V1_REG_SOFT_RESET 0x83a0
42+
3243 #endif /*__JPEG_V1_0_H__*/
drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c+62−1
@@ -23,6 +23,7 @@ · 22 unmodified lines
2323
2424 #include "amdgpu.h"
2525 #include "amdgpu_jpeg.h"
26+#include "amdgpu_cs.h"
2627 #include "amdgpu_pm.h"
2728 #include "soc15.h"
2829 #include "soc15d.h"
@@ -538,7 +539,11 @@ void jpeg_v2_0_dec_ring_emit_ib(struct amdgpu_ring *ring, · 509 unmodified lines
538539
539540 amdgpu_ring_write(ring, PACKETJ(mmUVD_LMI_JRBC_IB_VMID_INTERNAL_OFFSET,
540541 0, 0, PACKETJ_TYPE0));
541− amdgpu_ring_write(ring, (vmid | (vmid << 4) | (vmid << 8)));
542+
543+ if (ring->funcs->parse_cs)
544+ amdgpu_ring_write(ring, 0);
545+ else
546+ amdgpu_ring_write(ring, (vmid | (vmid << 4) | (vmid << 8)));
542547
543548 amdgpu_ring_write(ring, PACKETJ(mmUVD_LMI_JPEG_VMID_INTERNAL_OFFSET,
544549 0, 0, PACKETJ_TYPE0));
@@ -764,6 +769,7 @@ static const struct amdgpu_ring_funcs jpeg_v2_0_dec_ring_vm_funcs = { · 219 unmodified lines
764769 .get_rptr = jpeg_v2_0_dec_ring_get_rptr,
765770 .get_wptr = jpeg_v2_0_dec_ring_get_wptr,
766771 .set_wptr = jpeg_v2_0_dec_ring_set_wptr,
772+ .parse_cs = jpeg_v2_dec_ring_parse_cs,
767773 .emit_frame_size =
768774 SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
769775 SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 8 +
@@ -810,3 +816,58 @@ const struct amdgpu_ip_block_version jpeg_v2_0_ip_block = { · 40 unmodified lines
810816 .rev = 0,
811817 .funcs = &jpeg_v2_0_ip_funcs,
812818 };
819+
820+/**
821+ * jpeg_v2_dec_ring_parse_cs - command submission parser
822+ *
823+ * @parser: Command submission parser context
824+ * @job: the job to parse
825+ * @ib: the IB to parse
826+ *
827+ * Parse the command stream, return -EINVAL for invalid packet,
828+ * 0 otherwise
829+ */
830+int jpeg_v2_dec_ring_parse_cs(struct amdgpu_cs_parser *parser,
831+ struct amdgpu_job *job,
832+ struct amdgpu_ib *ib)
833+{
834+ u32 i, reg, res, cond, type;
835+ struct amdgpu_device *adev = parser->adev;
836+
837+ for (i = 0; i < ib->length_dw ; i += 2) {
838+ reg = CP_PACKETJ_GET_REG(ib->ptr[i]);
839+ res = CP_PACKETJ_GET_RES(ib->ptr[i]);
840+ cond = CP_PACKETJ_GET_COND(ib->ptr[i]);
841+ type = CP_PACKETJ_GET_TYPE(ib->ptr[i]);
842+
843+ if (res) /* only support 0 at the moment */
844+ return -EINVAL;
845+
846+ switch (type) {
847+ case PACKETJ_TYPE0:
848+ if (cond != PACKETJ_CONDITION_CHECK0 || reg < JPEG_REG_RANGE_START ||
849+ reg > JPEG_REG_RANGE_END) {
850+ dev_err(adev->dev, "Invalid packet [0x%08x]!\n", ib->ptr[i]);
851+ return -EINVAL;
852+ }
853+ break;
854+ case PACKETJ_TYPE3:
855+ if (cond != PACKETJ_CONDITION_CHECK3 || reg < JPEG_REG_RANGE_START ||
856+ reg > JPEG_REG_RANGE_END) {
857+ dev_err(adev->dev, "Invalid packet [0x%08x]!\n", ib->ptr[i]);
858+ return -EINVAL;
859+ }
860+ break;
861+ case PACKETJ_TYPE6:
862+ if (ib->ptr[i] == CP_PACKETJ_NOP)
863+ continue;
864+ dev_err(adev->dev, "Invalid packet [0x%08x]!\n", ib->ptr[i]);
865+ return -EINVAL;
866+ default:
867+ dev_err(adev->dev, "Unknown packet type %d !\n", type);
868+ return -EINVAL;
869+ }
870+ }
871+
872+ return 0;
873+}
drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.h+6−0
@@ -45,6 +45,9 @@ · 44 unmodified lines
4545
4646 #define JRBC_DEC_EXTERNAL_REG_WRITE_ADDR 0x18000
4747
48+#define JPEG_REG_RANGE_START 0x4000
49+#define JPEG_REG_RANGE_END 0x41c2
50+
4851 void jpeg_v2_0_dec_ring_insert_start(struct amdgpu_ring *ring);
4952 void jpeg_v2_0_dec_ring_insert_end(struct amdgpu_ring *ring);
5053 void jpeg_v2_0_dec_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq,
@@ -57,6 +60,9 @@ void jpeg_v2_0_dec_ring_emit_vm_flush(struct amdgpu_ring *ring, · 6 unmodified lines
5760 unsigned vmid, uint64_t pd_addr);
5861 void jpeg_v2_0_dec_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, uint32_t val);
5962 void jpeg_v2_0_dec_ring_nop(struct amdgpu_ring *ring, uint32_t count);
63+int jpeg_v2_dec_ring_parse_cs(struct amdgpu_cs_parser *parser,
64+ struct amdgpu_job *job,
65+ struct amdgpu_ib *ib);
6066
6167 extern const struct amdgpu_ip_block_version jpeg_v2_0_ip_block;
6268
drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c+2−0
@@ -662,6 +662,7 @@ static const struct amdgpu_ring_funcs jpeg_v2_5_dec_ring_vm_funcs = { · 661 unmodified lines
662662 .get_rptr = jpeg_v2_5_dec_ring_get_rptr,
663663 .get_wptr = jpeg_v2_5_dec_ring_get_wptr,
664664 .set_wptr = jpeg_v2_5_dec_ring_set_wptr,
665+ .parse_cs = jpeg_v2_dec_ring_parse_cs,
665666 .emit_frame_size =
666667 SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
667668 SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 8 +
@@ -691,6 +692,7 @@ static const struct amdgpu_ring_funcs jpeg_v2_6_dec_ring_vm_funcs = { · 23 unmodified lines
691692 .get_rptr = jpeg_v2_5_dec_ring_get_rptr,
692693 .get_wptr = jpeg_v2_5_dec_ring_get_wptr,
693694 .set_wptr = jpeg_v2_5_dec_ring_set_wptr,
695+ .parse_cs = jpeg_v2_dec_ring_parse_cs,
694696 .emit_frame_size =
695697 SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
696698 SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 8 +
drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c+1−0
@@ -560,6 +560,7 @@ static const struct amdgpu_ring_funcs jpeg_v3_0_dec_ring_vm_funcs = { · 559 unmodified lines
560560 .get_rptr = jpeg_v3_0_dec_ring_get_rptr,
561561 .get_wptr = jpeg_v3_0_dec_ring_get_wptr,
562562 .set_wptr = jpeg_v3_0_dec_ring_set_wptr,
563+ .parse_cs = jpeg_v2_dec_ring_parse_cs,
563564 .emit_frame_size =
564565 SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
565566 SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 8 +
drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c+1−0
@@ -727,6 +727,7 @@ static const struct amdgpu_ring_funcs jpeg_v4_0_dec_ring_vm_funcs = { · 726 unmodified lines
727727 .get_rptr = jpeg_v4_0_dec_ring_get_rptr,
728728 .get_wptr = jpeg_v4_0_dec_ring_get_wptr,
729729 .set_wptr = jpeg_v4_0_dec_ring_set_wptr,
730+ .parse_cs = jpeg_v2_dec_ring_parse_cs,
730731 .emit_frame_size =
731732 SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
732733 SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 8 +
drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.h+0−1
@@ -32,5 +32,4 @@ enum amdgpu_jpeg_v4_0_sub_block { · 31 unmodified lines
3232 };
3333
3434 extern const struct amdgpu_ip_block_version jpeg_v4_0_ip_block;
35−
3635 #endif /* __JPEG_V4_0_H__ */
drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c+17−76
@@ -23,9 +23,9 @@ · 22 unmodified lines
2323
2424 #include "amdgpu.h"
2525 #include "amdgpu_jpeg.h"
26−#include "amdgpu_cs.h"
2726 #include "soc15.h"
2827 #include "soc15d.h"
28+#include "jpeg_v2_0.h"
2929 #include "jpeg_v4_0_3.h"
3030 #include "mmsch_v4_0_3.h"
3131
@@ -59,6 +59,12 @@ static int amdgpu_ih_srcid_jpeg[] = { · 27 unmodified lines
5959 VCN_4_0__SRCID__JPEG7_DECODE
6060 };
6161
62+static inline bool jpeg_v4_0_3_normalizn_reqd(struct amdgpu_device *adev)
63+{
64+ return amdgpu_sriov_vf(adev) ||
65+ (amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 4));
66+}
67+
6268 /**
6369 * jpeg_v4_0_3_early_init - set function pointers
6470 *
@@ -734,32 +740,20 @@ void jpeg_v4_0_3_dec_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq · 669 unmodified lines
734740 0, PACKETJ_CONDITION_CHECK0, PACKETJ_TYPE4));
735741 amdgpu_ring_write(ring, 0);
736742
737− if (ring->adev->jpeg.inst[ring->me].aid_id) {
738− amdgpu_ring_write(ring, PACKETJ(regUVD_JRBC_EXTERNAL_MCM_ADDR_INTERNAL_OFFSET,
739− 0, PACKETJ_CONDITION_CHECK0, PACKETJ_TYPE0));
740− amdgpu_ring_write(ring, 0x4);
741− } else {
742− amdgpu_ring_write(ring, PACKETJ(0, 0, 0, PACKETJ_TYPE6));
743− amdgpu_ring_write(ring, 0);
744− }
743+ amdgpu_ring_write(ring, PACKETJ(0, 0, 0, PACKETJ_TYPE6));
744+ amdgpu_ring_write(ring, 0);
745745
746746 amdgpu_ring_write(ring, PACKETJ(regUVD_JRBC_EXTERNAL_REG_INTERNAL_OFFSET,
747747 0, 0, PACKETJ_TYPE0));
748748 amdgpu_ring_write(ring, 0x3fbc);
749749
750− if (ring->adev->jpeg.inst[ring->me].aid_id) {
751− amdgpu_ring_write(ring, PACKETJ(regUVD_JRBC_EXTERNAL_MCM_ADDR_INTERNAL_OFFSET,
752− 0, PACKETJ_CONDITION_CHECK0, PACKETJ_TYPE0));
753− amdgpu_ring_write(ring, 0x0);
754− } else {
755− amdgpu_ring_write(ring, PACKETJ(0, 0, 0, PACKETJ_TYPE6));
756− amdgpu_ring_write(ring, 0);
757− }
758−
759750 amdgpu_ring_write(ring, PACKETJ(JRBC_DEC_EXTERNAL_REG_WRITE_ADDR,
760751 0, 0, PACKETJ_TYPE0));
761752 amdgpu_ring_write(ring, 0x1);
762753
754+ amdgpu_ring_write(ring, PACKETJ(0, 0, 0, PACKETJ_TYPE6));
755+ amdgpu_ring_write(ring, 0);
756+
763757 amdgpu_ring_write(ring, PACKETJ(0, 0, 0, PACKETJ_TYPE7));
764758 amdgpu_ring_write(ring, 0);
765759 }
@@ -834,8 +828,8 @@ void jpeg_v4_0_3_dec_ring_emit_reg_wait(struct amdgpu_ring *ring, uint32_t reg, · 68 unmodified lines
834828 {
835829 uint32_t reg_offset;
836830
837− /* For VF, only local offsets should be used */
838− if (amdgpu_sriov_vf(ring->adev))
831+ /* Use normalized offsets if required */
832+ if (jpeg_v4_0_3_normalizn_reqd(ring->adev))
839833 reg = NORMALIZE_JPEG_REG_OFFSET(reg);
840834
841835 reg_offset = (reg << 2);
@@ -881,8 +875,8 @@ void jpeg_v4_0_3_dec_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, uint · 39 unmodified lines
881875 {
882876 uint32_t reg_offset;
883877
884− /* For VF, only local offsets should be used */
885− if (amdgpu_sriov_vf(ring->adev))
878+ /* Use normalized offsets if required */
879+ if (jpeg_v4_0_3_normalizn_reqd(ring->adev))
886880 reg = NORMALIZE_JPEG_REG_OFFSET(reg);
887881
888882 reg_offset = (reg << 2);
@@ -1089,7 +1083,7 @@ static const struct amdgpu_ring_funcs jpeg_v4_0_3_dec_ring_vm_funcs = { · 200 unmodified lines
10891083 .get_rptr = jpeg_v4_0_3_dec_ring_get_rptr,
10901084 .get_wptr = jpeg_v4_0_3_dec_ring_get_wptr,
10911085 .set_wptr = jpeg_v4_0_3_dec_ring_set_wptr,
1092− .parse_cs = jpeg_v4_0_3_dec_ring_parse_cs,
1086+ .parse_cs = jpeg_v2_dec_ring_parse_cs,
10931087 .emit_frame_size =
10941088 SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
10951089 SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 8 +
@@ -1254,56 +1248,3 @@ static void jpeg_v4_0_3_set_ras_funcs(struct amdgpu_device *adev) · 158 unmodified lines
12541248 {
12551249 adev->jpeg.ras = &jpeg_v4_0_3_ras;
12561250 }
1257−
1258−/**
1259− * jpeg_v4_0_3_dec_ring_parse_cs - command submission parser
1260− *
1261− * @parser: Command submission parser context
1262− * @job: the job to parse
1263− * @ib: the IB to parse
1264− *
1265− * Parse the command stream, return -EINVAL for invalid packet,
1266− * 0 otherwise
1267− */
1268−int jpeg_v4_0_3_dec_ring_parse_cs(struct amdgpu_cs_parser *parser,
1269− struct amdgpu_job *job,
1270− struct amdgpu_ib *ib)
1271−{
1272− uint32_t i, reg, res, cond, type;
1273− struct amdgpu_device *adev = parser->adev;
1274−
1275− for (i = 0; i < ib->length_dw ; i += 2) {
1276− reg = CP_PACKETJ_GET_REG(ib->ptr[i]);
1277− res = CP_PACKETJ_GET_RES(ib->ptr[i]);
1278− cond = CP_PACKETJ_GET_COND(ib->ptr[i]);
1279− type = CP_PACKETJ_GET_TYPE(ib->ptr[i]);
1280−
1281− if (res) /* only support 0 at the moment */
1282− return -EINVAL;
1283−
1284− switch (type) {
1285− case PACKETJ_TYPE0:
1286− if (cond != PACKETJ_CONDITION_CHECK0 || reg < JPEG_REG_RANGE_START || reg > JPEG_REG_RANGE_END) {
1287− dev_err(adev->dev, "Invalid packet [0x%08x]!\n", ib->ptr[i]);
1288− return -EINVAL;
1289− }
1290− break;
1291− case PACKETJ_TYPE3:
1292− if (cond != PACKETJ_CONDITION_CHECK3 || reg < JPEG_REG_RANGE_START || reg > JPEG_REG_RANGE_END) {
1293− dev_err(adev->dev, "Invalid packet [0x%08x]!\n", ib->ptr[i]);
1294− return -EINVAL;
1295− }
1296− break;
1297− case PACKETJ_TYPE6:
1298− if (ib->ptr[i] == CP_PACKETJ_NOP)
1299− continue;
1300− dev_err(adev->dev, "Invalid packet [0x%08x]!\n", ib->ptr[i]);
1301− return -EINVAL;
1302− default:
1303− dev_err(adev->dev, "Unknown packet type %d !\n", type);
1304− return -EINVAL;
1305− }
1306− }
1307−
1308− return 0;
1309−}
drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.h+1−6
@@ -46,9 +46,6 @@ · 45 unmodified lines
4646
4747 #define JRBC_DEC_EXTERNAL_REG_WRITE_ADDR 0x18000
4848
49−#define JPEG_REG_RANGE_START 0x4000
50−#define JPEG_REG_RANGE_END 0x41c2
51−
5249 extern const struct amdgpu_ip_block_version jpeg_v4_0_3_ip_block;
5350
5451 void jpeg_v4_0_3_dec_ring_emit_ib(struct amdgpu_ring *ring,
@@ -65,7 +62,5 @@ void jpeg_v4_0_3_dec_ring_insert_end(struct amdgpu_ring *ring); · 10 unmodified lines
6562 void jpeg_v4_0_3_dec_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, uint32_t val);
6663 void jpeg_v4_0_3_dec_ring_emit_reg_wait(struct amdgpu_ring *ring, uint32_t reg,
6764 uint32_t val, uint32_t mask);
68−int jpeg_v4_0_3_dec_ring_parse_cs(struct amdgpu_cs_parser *parser,
69− struct amdgpu_job *job,
70− struct amdgpu_ib *ib);
65+
7166 #endif /* __JPEG_V4_0_3_H__ */
drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.c+1−0
@@ -768,6 +768,7 @@ static const struct amdgpu_ring_funcs jpeg_v4_0_5_dec_ring_vm_funcs = { · 767 unmodified lines
768768 .get_rptr = jpeg_v4_0_5_dec_ring_get_rptr,
769769 .get_wptr = jpeg_v4_0_5_dec_ring_get_wptr,
770770 .set_wptr = jpeg_v4_0_5_dec_ring_set_wptr,
771+ .parse_cs = jpeg_v2_dec_ring_parse_cs,
771772 .emit_frame_size =
772773 SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
773774 SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 8 +
drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_0.c+2−1
@@ -26,6 +26,7 @@ · 25 unmodified lines
2626 #include "amdgpu_pm.h"
2727 #include "soc15.h"
2828 #include "soc15d.h"
29+#include "jpeg_v2_0.h"
2930 #include "jpeg_v4_0_3.h"
3031
3132 #include "vcn/vcn_5_0_0_offset.h"
@@ -646,7 +647,7 @@ static const struct amdgpu_ring_funcs jpeg_v5_0_0_dec_ring_vm_funcs = { · 614 unmodified lines
646647 .get_rptr = jpeg_v5_0_0_dec_ring_get_rptr,
647648 .get_wptr = jpeg_v5_0_0_dec_ring_get_wptr,
648649 .set_wptr = jpeg_v5_0_0_dec_ring_set_wptr,
649− .parse_cs = jpeg_v4_0_3_dec_ring_parse_cs,
650+ .parse_cs = jpeg_v2_dec_ring_parse_cs,
650651 .emit_frame_size =
651652 SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
652653 SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 8 +
drivers/gpu/drm/amd/amdgpu/mes_v11_0.c+1−1
@@ -415,7 +415,7 @@ static int mes_v11_0_reset_queue_mmio(struct amdgpu_mes *mes, uint32_t queue_typ · 414 unmodified lines
415415 /* wait till dequeue take effects */
416416 for (i = 0; i < adev->usec_timeout; i++) {
417417 if (!(RREG32_SOC15(GC, 0, regCP_HQD_ACTIVE) & 1))
418− break;
418+ break;
419419 udelay(1);
420420 }
421421 if (i >= adev->usec_timeout) {
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c+46−18
@@ -36,7 +36,6 @@ · 35 unmodified lines
3636 #include <linux/mman.h>
3737 #include <linux/ptrace.h>
3838 #include <linux/dma-buf.h>
39−#include <linux/fdtable.h>
4039 #include <linux/processor.h>
4140 #include "kfd_priv.h"
4241 #include "kfd_device_queue_manager.h"
@@ -1835,7 +1834,8 @@ static uint32_t get_process_num_bos(struct kfd_process *p) · 1792 unmodified lines
18351834 }
18361835
18371836 static int criu_get_prime_handle(struct kgd_mem *mem,
1838− int flags, u32 *shared_fd)
1837+ int flags, u32 *shared_fd,
1838+ struct file **file)
18391839 {
18401840 struct dma_buf *dmabuf;
18411841 int ret;
@@ -1846,13 +1846,14 @@ static int criu_get_prime_handle(struct kgd_mem *mem, · 4 unmodified lines
18461846 return ret;
18471847 }
18481848
1849− ret = dma_buf_fd(dmabuf, flags);
1849+ ret = get_unused_fd_flags(flags);
18501850 if (ret < 0) {
18511851 pr_err("dmabuf create fd failed, ret:%d\n", ret);
18521852 goto out_free_dmabuf;
18531853 }
18541854
18551855 *shared_fd = ret;
1856+ *file = dmabuf->file;
18561857 return 0;
18571858
18581859 out_free_dmabuf:
@@ -1860,6 +1861,25 @@ out_free_dmabuf: · 1 unmodified line
18601861 return ret;
18611862 }
18621863
1864+static void commit_files(struct file **files,
1865+ struct kfd_criu_bo_bucket *bo_buckets,
1866+ unsigned int count,
1867+ int err)
1868+{
1869+ while (count--) {
1870+ struct file *file = files[count];
1871+
1872+ if (!file)
1873+ continue;
1874+ if (err) {
1875+ fput(file);
1876+ put_unused_fd(bo_buckets[count].dmabuf_fd);
1877+ } else {
1878+ fd_install(bo_buckets[count].dmabuf_fd, file);
1879+ }
1880+ }
1881+}
1882+
18631883 static int criu_checkpoint_bos(struct kfd_process *p,
18641884 uint32_t num_bos,
18651885 uint8_t __user *user_bos,
@@ -1868,6 +1888,7 @@ static int criu_checkpoint_bos(struct kfd_process *p, · 2 unmodified lines
18681888 {
18691889 struct kfd_criu_bo_bucket *bo_buckets;
18701890 struct kfd_criu_bo_priv_data *bo_privs;
1891+ struct file **files = NULL;
18711892 int ret = 0, pdd_index, bo_index = 0, id;
18721893 void *mem;
18731894
@@ -1881,6 +1902,12 @@ static int criu_checkpoint_bos(struct kfd_process *p, · 7 unmodified lines
18811902 goto exit;
18821903 }
18831904
1905+ files = kvzalloc(num_bos * sizeof(struct file *), GFP_KERNEL);
1906+ if (!files) {
1907+ ret = -ENOMEM;
1908+ goto exit;
1909+ }
1910+
18841911 for (pdd_index = 0; pdd_index < p->n_pdds; pdd_index++) {
18851912 struct kfd_process_device *pdd = p->pdds[pdd_index];
18861913 struct amdgpu_bo *dumper_bo;
@@ -1923,7 +1950,7 @@ static int criu_checkpoint_bos(struct kfd_process *p, · 36 unmodified lines
19231950 ret = criu_get_prime_handle(kgd_mem,
19241951 bo_bucket->alloc_flags &
19251952 KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE ? DRM_RDWR : 0,
1926− &bo_bucket->dmabuf_fd);
1953+ &bo_bucket->dmabuf_fd, &files[bo_index]);
19271954 if (ret)
19281955 goto exit;
19291956 } else {
@@ -1974,12 +2001,8 @@ static int criu_checkpoint_bos(struct kfd_process *p, · 44 unmodified lines
19742001 *priv_offset += num_bos * sizeof(*bo_privs);
19752002
19762003 exit:
1977− while (ret && bo_index--) {
1978− if (bo_buckets[bo_index].alloc_flags
1979− & (KFD_IOC_ALLOC_MEM_FLAGS_VRAM | KFD_IOC_ALLOC_MEM_FLAGS_GTT))
1980− close_fd(bo_buckets[bo_index].dmabuf_fd);
1981− }
1982−
2004+ commit_files(files, bo_buckets, bo_index, ret);
2005+ kvfree(files);
19832006 kvfree(bo_buckets);
19842007 kvfree(bo_privs);
19852008 return ret;
@@ -2331,7 +2354,8 @@ static int criu_restore_memory_of_gpu(struct kfd_process_device *pdd, · 345 unmodified lines
23312354
23322355 static int criu_restore_bo(struct kfd_process *p,
23332356 struct kfd_criu_bo_bucket *bo_bucket,
2334− struct kfd_criu_bo_priv_data *bo_priv)
2357+ struct kfd_criu_bo_priv_data *bo_priv,
2358+ struct file **file)
23352359 {
23362360 struct kfd_process_device *pdd;
23372361 struct kgd_mem *kgd_mem;
@@ -2383,7 +2407,7 @@ static int criu_restore_bo(struct kfd_process *p, · 45 unmodified lines
23832407 if (bo_bucket->alloc_flags
23842408 & (KFD_IOC_ALLOC_MEM_FLAGS_VRAM | KFD_IOC_ALLOC_MEM_FLAGS_GTT)) {
23852409 ret = criu_get_prime_handle(kgd_mem, DRM_RDWR,
2386− &bo_bucket->dmabuf_fd);
2410+ &bo_bucket->dmabuf_fd, file);
23872411 if (ret)
23882412 return ret;
23892413 } else {
@@ -2400,6 +2424,7 @@ static int criu_restore_bos(struct kfd_process *p, · 10 unmodified lines
24002424 {
24012425 struct kfd_criu_bo_bucket *bo_buckets = NULL;
24022426 struct kfd_criu_bo_priv_data *bo_privs = NULL;
2427+ struct file **files = NULL;
24032428 int ret = 0;
24042429 uint32_t i = 0;
24052430
@@ -2413,6 +2438,12 @@ static int criu_restore_bos(struct kfd_process *p, · 7 unmodified lines
24132438 if (!bo_buckets)
24142439 return -ENOMEM;
24152440
2441+ files = kvzalloc(args->num_bos * sizeof(struct file *), GFP_KERNEL);
2442+ if (!files) {
2443+ ret = -ENOMEM;
2444+ goto exit;
2445+ }
2446+
24162447 ret = copy_from_user(bo_buckets, (void __user *)args->bos,
24172448 args->num_bos * sizeof(*bo_buckets));
24182449 if (ret) {
@@ -2438,7 +2469,7 @@ static int criu_restore_bos(struct kfd_process *p, · 19 unmodified lines
24382469
24392470 /* Create and map new BOs */
24402471 for (; i < args->num_bos; i++) {
2441− ret = criu_restore_bo(p, &bo_buckets[i], &bo_privs[i]);
2472+ ret = criu_restore_bo(p, &bo_buckets[i], &bo_privs[i], &files[i]);
24422473 if (ret) {
24432474 pr_debug("Failed to restore BO[%d] ret%d\n", i, ret);
24442475 goto exit;
@@ -2453,11 +2484,8 @@ static int criu_restore_bos(struct kfd_process *p, · 8 unmodified lines
24532484 ret = -EFAULT;
24542485
24552486 exit:
2456− while (ret && i--) {
2457− if (bo_buckets[i].alloc_flags
2458− & (KFD_IOC_ALLOC_MEM_FLAGS_VRAM | KFD_IOC_ALLOC_MEM_FLAGS_GTT))
2459− close_fd(bo_buckets[i].dmabuf_fd);
2460− }
2487+ commit_files(files, bo_buckets, i, ret);
2488+ kvfree(files);
24612489 kvfree(bo_buckets);
24622490 kvfree(bo_privs);
24632491 return ret;
drivers/gpu/drm/amd/amdkfd/kfd_crat.c+7−1
@@ -1434,7 +1434,8 @@ static int kfd_fill_gpu_cache_info_from_gfx_config(struct kfd_dev *kdev, · 1433 unmodified lines
14341434 pcache_info[i].flags = (CRAT_CACHE_FLAGS_ENABLED |
14351435 CRAT_CACHE_FLAGS_DATA_CACHE |
14361436 CRAT_CACHE_FLAGS_SIMD_CACHE);
1437− pcache_info[0].num_cu_shared = adev->gfx.config.gc_num_tcp_per_wpg / 2;
1437+ pcache_info[i].num_cu_shared = adev->gfx.config.gc_num_tcp_per_wpg / 2;
1438+ pcache_info[i].cache_line_size = adev->gfx.config.gc_tcp_cache_line_size;
14381439 i++;
14391440 }
14401441 /* Scalar L1 Instruction Cache per SQC */
@@ -1446,6 +1447,7 @@ static int kfd_fill_gpu_cache_info_from_gfx_config(struct kfd_dev *kdev, · 5 unmodified lines
14461447 CRAT_CACHE_FLAGS_INST_CACHE |
14471448 CRAT_CACHE_FLAGS_SIMD_CACHE);
14481449 pcache_info[i].num_cu_shared = adev->gfx.config.gc_num_sqc_per_wgp * 2;
1450+ pcache_info[i].cache_line_size = adev->gfx.config.gc_instruction_cache_line_size;
14491451 i++;
14501452 }
14511453 /* Scalar L1 Data Cache per SQC */
@@ -1456,6 +1458,7 @@ static int kfd_fill_gpu_cache_info_from_gfx_config(struct kfd_dev *kdev, · 4 unmodified lines
14561458 CRAT_CACHE_FLAGS_DATA_CACHE |
14571459 CRAT_CACHE_FLAGS_SIMD_CACHE);
14581460 pcache_info[i].num_cu_shared = adev->gfx.config.gc_num_sqc_per_wgp * 2;
1461+ pcache_info[i].cache_line_size = adev->gfx.config.gc_scalar_data_cache_line_size;
14591462 i++;
14601463 }
14611464 /* GL1 Data Cache per SA */
@@ -1468,6 +1471,7 @@ static int kfd_fill_gpu_cache_info_from_gfx_config(struct kfd_dev *kdev, · 6 unmodified lines
14681471 CRAT_CACHE_FLAGS_DATA_CACHE |
14691472 CRAT_CACHE_FLAGS_SIMD_CACHE);
14701473 pcache_info[i].num_cu_shared = adev->gfx.config.max_cu_per_sh;
1474+ pcache_info[i].cache_line_size = 0;
14711475 i++;
14721476 }
14731477 /* L2 Data Cache per GPU (Total Tex Cache) */
@@ -1478,6 +1482,7 @@ static int kfd_fill_gpu_cache_info_from_gfx_config(struct kfd_dev *kdev, · 4 unmodified lines
14781482 CRAT_CACHE_FLAGS_DATA_CACHE |
14791483 CRAT_CACHE_FLAGS_SIMD_CACHE);
14801484 pcache_info[i].num_cu_shared = adev->gfx.config.max_cu_per_sh;
1485+ pcache_info[i].cache_line_size = adev->gfx.config.gc_tcc_cache_line_size;
14811486 i++;
14821487 }
14831488 /* L3 Data Cache per GPU */
@@ -1488,6 +1493,7 @@ static int kfd_fill_gpu_cache_info_from_gfx_config(struct kfd_dev *kdev, · 4 unmodified lines
14881493 CRAT_CACHE_FLAGS_DATA_CACHE |
14891494 CRAT_CACHE_FLAGS_SIMD_CACHE);
14901495 pcache_info[i].num_cu_shared = adev->gfx.config.max_cu_per_sh;
1496+ pcache_info[i].cache_line_size = 0;
14911497 i++;
14921498 }
14931499 return i;
drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c+3−2
@@ -2407,10 +2407,9 @@ static int destroy_queue_cpsch(struct device_queue_manager *dqm, · 2406 unmodified lines
24072407 pdd->sdma_past_activity_counter += sdma_val;
24082408 }
24092409
2410− list_del(&q->list);
2411− qpd->queue_count--;
24122410 if (q->properties.is_active) {
24132411 decrement_queue_count(dqm, qpd, q);
2412+ q->properties.is_active = false;
24142413 if (!dqm->dev->kfd->shared_resources.enable_mes) {
24152414 retval = execute_queues_cpsch(dqm,
24162415 KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0,
@@ -2421,6 +2420,8 @@ static int destroy_queue_cpsch(struct device_queue_manager *dqm, · 4 unmodified lines
24212420 retval = remove_queue_mes(dqm, q, qpd);
24222421 }
24232422 }
2423+ list_del(&q->list);
2424+ qpd->queue_count--;
24242425
24252426 /*
24262427 * Unconditionally decrement this counter, regardless of the queue's
drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c+32−8
@@ -167,11 +167,23 @@ static void event_interrupt_poison_consumption_v9(struct kfd_node *dev, · 166 unmodified lines
167167 case SOC15_IH_CLIENTID_SE3SH:
168168 case SOC15_IH_CLIENTID_UTCL2:
169169 block = AMDGPU_RAS_BLOCK__GFX;
170− if (amdgpu_ip_version(dev->adev, GC_HWIP, 0) == IP_VERSION(9, 4, 3) ||
171− amdgpu_ip_version(dev->adev, GC_HWIP, 0) == IP_VERSION(9, 4, 4))
172− reset = AMDGPU_RAS_GPU_RESET_MODE1_RESET;
173− else
170+ if (amdgpu_ip_version(dev->adev, GC_HWIP, 0) == IP_VERSION(9, 4, 3)) {
171+ /* driver mode-2 for gfx poison is only supported by
172+ * pmfw 0x00557300 and onwards */
173+ if (dev->adev->pm.fw_version < 0x00557300)
174+ reset = AMDGPU_RAS_GPU_RESET_MODE1_RESET;
175+ else
176+ reset = AMDGPU_RAS_GPU_RESET_MODE2_RESET;
177+ } else if (amdgpu_ip_version(dev->adev, GC_HWIP, 0) == IP_VERSION(9, 4, 4)) {
178+ /* driver mode-2 for gfx poison is only supported by
179+ * pmfw 0x05550C00 and onwards */
180+ if (dev->adev->pm.fw_version < 0x05550C00)
181+ reset = AMDGPU_RAS_GPU_RESET_MODE1_RESET;
182+ else
183+ reset = AMDGPU_RAS_GPU_RESET_MODE2_RESET;
184+ } else {
174185 reset = AMDGPU_RAS_GPU_RESET_MODE2_RESET;
186+ }
175187 break;
176188 case SOC15_IH_CLIENTID_VMC:
177189 case SOC15_IH_CLIENTID_VMC1:
@@ -184,11 +196,23 @@ static void event_interrupt_poison_consumption_v9(struct kfd_node *dev, · 6 unmodified lines
184196 case SOC15_IH_CLIENTID_SDMA3:
185197 case SOC15_IH_CLIENTID_SDMA4:
186198 block = AMDGPU_RAS_BLOCK__SDMA;
187− if (amdgpu_ip_version(dev->adev, GC_HWIP, 0) == IP_VERSION(9, 4, 3) ||
188− amdgpu_ip_version(dev->adev, GC_HWIP, 0) == IP_VERSION(9, 4, 4))
189− reset = AMDGPU_RAS_GPU_RESET_MODE1_RESET;
190− else
199+ if (amdgpu_ip_version(dev->adev, SDMA0_HWIP, 0) == IP_VERSION(4, 4, 2)) {
200+ /* driver mode-2 for gfx poison is only supported by
201+ * pmfw 0x00557300 and onwards */
202+ if (dev->adev->pm.fw_version < 0x00557300)
203+ reset = AMDGPU_RAS_GPU_RESET_MODE1_RESET;
204+ else
205+ reset = AMDGPU_RAS_GPU_RESET_MODE2_RESET;
206+ } else if (amdgpu_ip_version(dev->adev, SDMA0_HWIP, 0) == IP_VERSION(4, 4, 5)) {
207+ /* driver mode-2 for gfx poison is only supported by
208+ * pmfw 0x05550C00 and onwards */
209+ if (dev->adev->pm.fw_version < 0x05550C00)
210+ reset = AMDGPU_RAS_GPU_RESET_MODE1_RESET;
211+ else
212+ reset = AMDGPU_RAS_GPU_RESET_MODE2_RESET;
213+ } else {
191214 reset = AMDGPU_RAS_GPU_RESET_MODE2_RESET;
215+ }
192216 break;
193217 default:
194218 dev_warn(dev->adev->dev,
drivers/gpu/drm/amd/amdkfd/kfd_priv.h+6−0
@@ -868,6 +868,12 @@ struct svm_range_list { · 867 unmodified lines
868868 struct task_struct *faulting_task;
869869 /* check point ts decides if page fault recovery need be dropped */
870870 uint64_t checkpoint_ts[MAX_GPU_INSTANCE];
871+
872+ /* Default granularity to use in buffer migration
873+ * and restoration of backing memory while handling
874+ * recoverable page faults
875+ */
876+ uint8_t default_granularity;
871877 };
872878
873879 /* Process data */
drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c+1−0
@@ -1046,6 +1046,7 @@ exit: · 1045 unmodified lines
10461046 pr_debug("Queue id %d was restored successfully\n", queue_id);
10471047
10481048 kfree(q_data);
1049+ kfree(q_extra_data);
10491050
10501051 return ret;
10511052 }
drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c+22−23
@@ -235,17 +235,16 @@ void kfd_smi_event_update_gpu_reset(struct kfd_node *dev, bool post_reset, · 234 unmodified lines
235235 amdgpu_reset_get_desc(reset_context, reset_cause,
236236 sizeof(reset_cause));
237237
238− kfd_smi_event_add(0, dev, event, "%x %s\n",
239− dev->reset_seq_num,
240− reset_cause);
238+ kfd_smi_event_add(0, dev, event, KFD_EVENT_FMT_UPDATE_GPU_RESET(
239+ dev->reset_seq_num, reset_cause));
241240 }
242241
243242 void kfd_smi_event_update_thermal_throttling(struct kfd_node *dev,
244243 uint64_t throttle_bitmask)
245244 {
246− kfd_smi_event_add(0, dev, KFD_SMI_EVENT_THERMAL_THROTTLE, "%llx:%llx\n",
245+ kfd_smi_event_add(0, dev, KFD_SMI_EVENT_THERMAL_THROTTLE, KFD_EVENT_FMT_THERMAL_THROTTLING(
247246 throttle_bitmask,
248− amdgpu_dpm_get_thermal_throttling_counter(dev->adev));
247+ amdgpu_dpm_get_thermal_throttling_counter(dev->adev)));
249248 }
250249
251250 void kfd_smi_event_update_vmfault(struct kfd_node *dev, uint16_t pasid)
@@ -256,8 +255,8 @@ void kfd_smi_event_update_vmfault(struct kfd_node *dev, uint16_t pasid) · 4 unmodified lines
256255 if (task_info) {
257256 /* Report VM faults from user applications, not retry from kernel */
258257 if (task_info->pid)
259− kfd_smi_event_add(0, dev, KFD_SMI_EVENT_VMFAULT, "%x:%s\n",
260− task_info->pid, task_info->task_name);
258+ kfd_smi_event_add(0, dev, KFD_SMI_EVENT_VMFAULT, KFD_EVENT_FMT_VMFAULT(
259+ task_info->pid, task_info->task_name));
261260 amdgpu_vm_put_task_info(task_info);
262261 }
263262 }
@@ -267,16 +266,16 @@ void kfd_smi_event_page_fault_start(struct kfd_node *node, pid_t pid, · 3 unmodified lines
267266 ktime_t ts)
268267 {
269268 kfd_smi_event_add(pid, node, KFD_SMI_EVENT_PAGE_FAULT_START,
270− "%lld -%d @%lx(%x) %c\n", ktime_to_ns(ts), pid,
271− address, node->id, write_fault ? 'W' : 'R');
269+ KFD_EVENT_FMT_PAGEFAULT_START(ktime_to_ns(ts), pid,
270+ address, node->id, write_fault ? 'W' : 'R'));
272271 }
273272
274273 void kfd_smi_event_page_fault_end(struct kfd_node *node, pid_t pid,
275274 unsigned long address, bool migration)
276275 {
277276 kfd_smi_event_add(pid, node, KFD_SMI_EVENT_PAGE_FAULT_END,
278− "%lld -%d @%lx(%x) %c\n", ktime_get_boottime_ns(),
279− pid, address, node->id, migration ? 'M' : 'U');
277+ KFD_EVENT_FMT_PAGEFAULT_END(ktime_get_boottime_ns(),
278+ pid, address, node->id, migration ? 'M' : 'U'));
280279 }
281280
282281 void kfd_smi_event_migration_start(struct kfd_node *node, pid_t pid,
@@ -286,9 +285,9 @@ void kfd_smi_event_migration_start(struct kfd_node *node, pid_t pid, · 3 unmodified lines
286285 uint32_t trigger)
287286 {
288287 kfd_smi_event_add(pid, node, KFD_SMI_EVENT_MIGRATE_START,
289− "%lld -%d @%lx(%lx) %x->%x %x:%x %d\n",
288+ KFD_EVENT_FMT_MIGRATE_START(
290289 ktime_get_boottime_ns(), pid, start, end - start,
291− from, to, prefetch_loc, preferred_loc, trigger);
290+ from, to, prefetch_loc, preferred_loc, trigger));
292291 }
293292
294293 void kfd_smi_event_migration_end(struct kfd_node *node, pid_t pid,
@@ -296,24 +295,24 @@ void kfd_smi_event_migration_end(struct kfd_node *node, pid_t pid, · 1 unmodified line
296295 uint32_t from, uint32_t to, uint32_t trigger)
297296 {
298297 kfd_smi_event_add(pid, node, KFD_SMI_EVENT_MIGRATE_END,
299− "%lld -%d @%lx(%lx) %x->%x %d\n",
298+ KFD_EVENT_FMT_MIGRATE_END(
300299 ktime_get_boottime_ns(), pid, start, end - start,
301− from, to, trigger);
300+ from, to, trigger));
302301 }
303302
304303 void kfd_smi_event_queue_eviction(struct kfd_node *node, pid_t pid,
305304 uint32_t trigger)
306305 {
307306 kfd_smi_event_add(pid, node, KFD_SMI_EVENT_QUEUE_EVICTION,
308− "%lld -%d %x %d\n", ktime_get_boottime_ns(), pid,
309− node->id, trigger);
307+ KFD_EVENT_FMT_QUEUE_EVICTION(ktime_get_boottime_ns(), pid,
308+ node->id, trigger));
310309 }
311310
312311 void kfd_smi_event_queue_restore(struct kfd_node *node, pid_t pid)
313312 {
314313 kfd_smi_event_add(pid, node, KFD_SMI_EVENT_QUEUE_RESTORE,
315− "%lld -%d %x\n", ktime_get_boottime_ns(), pid,
316− node->id);
314+ KFD_EVENT_FMT_QUEUE_RESTORE(ktime_get_boottime_ns(), pid,
315+ node->id, 0));
317316 }
318317
319318 void kfd_smi_event_queue_restore_rescheduled(struct mm_struct *mm)
@@ -330,8 +329,8 @@ void kfd_smi_event_queue_restore_rescheduled(struct mm_struct *mm) · 10 unmodified lines
330329
331330 kfd_smi_event_add(p->lead_thread->pid, pdd->dev,
332331 KFD_SMI_EVENT_QUEUE_RESTORE,
333− "%lld -%d %x %c\n", ktime_get_boottime_ns(),
334− p->lead_thread->pid, pdd->dev->id, 'R');
332+ KFD_EVENT_FMT_QUEUE_RESTORE(ktime_get_boottime_ns(),
333+ p->lead_thread->pid, pdd->dev->id, 'R'));
335334 }
336335 kfd_unref_process(p);
337336 }
@@ -341,8 +340,8 @@ void kfd_smi_event_unmap_from_gpu(struct kfd_node *node, pid_t pid, · 3 unmodified lines
341340 uint32_t trigger)
342341 {
343342 kfd_smi_event_add(pid, node, KFD_SMI_EVENT_UNMAP_FROM_GPU,
344− "%lld -%d @%lx(%lx) %x %d\n", ktime_get_boottime_ns(),
345− pid, address, last - address + 1, node->id, trigger);
343+ KFD_EVENT_FMT_UNMAP_FROM_GPU(ktime_get_boottime_ns(),
344+ pid, address, last - address + 1, node->id, trigger));
346345 }
347346
348347 int kfd_smi_event_open(struct kfd_node *dev, uint32_t *fd)
drivers/gpu/drm/amd/amdkfd/kfd_svm.c+15−7
@@ -309,12 +309,13 @@ static void svm_range_free(struct svm_range *prange, bool do_unmap) · 308 unmodified lines
309309 }
310310
311311 static void
312−svm_range_set_default_attributes(int32_t *location, int32_t *prefetch_loc,
313− uint8_t *granularity, uint32_t *flags)
312+svm_range_set_default_attributes(struct svm_range_list *svms, int32_t *location,
313+ int32_t *prefetch_loc, uint8_t *granularity,
314+ uint32_t *flags)
314315 {
315316 *location = KFD_IOCTL_SVM_LOCATION_UNDEFINED;
316317 *prefetch_loc = KFD_IOCTL_SVM_LOCATION_UNDEFINED;
317− *granularity = 9;
318+ *granularity = svms->default_granularity;
318319 *flags =
319320 KFD_IOCTL_SVM_FLAG_HOST_ACCESS | KFD_IOCTL_SVM_FLAG_COHERENT;
320321 }
@@ -358,7 +359,7 @@ svm_range *svm_range_new(struct svm_range_list *svms, uint64_t start, · 37 unmodified lines
358359 bitmap_copy(prange->bitmap_access, svms->bitmap_supported,
359360 MAX_GPU_INSTANCE);
360361
361− svm_range_set_default_attributes(&prange->preferred_loc,
362+ svm_range_set_default_attributes(svms, &prange->preferred_loc,
362363 &prange->prefetch_loc,
363364 &prange->granularity, &prange->flags);
364365
@@ -2703,9 +2704,10 @@ svm_range_get_range_boundaries(struct kfd_process *p, int64_t addr, · 2338 unmodified lines
27032704 *is_heap_stack = vma_is_initial_heap(vma) || vma_is_initial_stack(vma);
27042705
27052706 start_limit = max(vma->vm_start >> PAGE_SHIFT,
2706− (unsigned long)ALIGN_DOWN(addr, 2UL << 8));
2707+ (unsigned long)ALIGN_DOWN(addr, 1UL << p->svms.default_granularity));
27072708 end_limit = min(vma->vm_end >> PAGE_SHIFT,
2708− (unsigned long)ALIGN(addr + 1, 2UL << 8));
2709+ (unsigned long)ALIGN(addr + 1, 1UL << p->svms.default_granularity));
2710+
27092711 /* First range that starts after the fault address */
27102712 node = interval_tree_iter_first(&p->svms.objects, addr + 1, ULONG_MAX);
27112713 if (node) {
@@ -3249,6 +3251,12 @@ int svm_range_list_init(struct kfd_process *p) · 537 unmodified lines
32493251 if (KFD_IS_SVM_API_SUPPORTED(p->pdds[i]->dev->adev))
32503252 bitmap_set(svms->bitmap_supported, i, 1);
32513253
3254+ /* Value of default granularity cannot exceed 0x1B, the
3255+ * number of pages supported by a 4-level paging table
3256+ */
3257+ svms->default_granularity = min_t(u8, amdgpu_svm_default_granularity, 0x1B);
3258+ pr_debug("Default SVM Granularity to use: %d\n", svms->default_granularity);
3259+
32523260 return 0;
32533261 }
32543262
@@ -3776,7 +3784,7 @@ svm_range_get_attr(struct kfd_process *p, struct mm_struct *mm, · 521 unmodified lines
37763784 node = interval_tree_iter_first(&svms->objects, start, last);
37773785 if (!node) {
37783786 pr_debug("range attrs not found return default values\n");
3779− svm_range_set_default_attributes(&location, &prefetch_loc,
3787+ svm_range_set_default_attributes(svms, &location, &prefetch_loc,
37803788 &granularity, &flags_and);
37813789 flags_or = flags_and;
37823790 if (p->xnack_enabled)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c+12−1
@@ -10610,7 +10610,7 @@ static bool should_reset_plane(struct drm_atomic_state *state, · 10609 unmodified lines
1061010610 * TODO: We can likely skip bandwidth validation if the only thing that
1061110611 * changed about the plane was it'z z-ordering.
1061210612 */
10613− if (new_crtc_state->zpos_changed)
10613+ if (old_plane_state->normalized_zpos != new_plane_state->normalized_zpos)
1061410614 return true;
1061510615
1061610616 if (drm_atomic_crtc_needs_modeset(new_crtc_state))
@@ -11458,6 +11458,17 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev, · 841 unmodified lines
1145811458 drm_dbg(dev, "Failed to determine cursor mode\n");
1145911459 goto fail;
1146011460 }
11461+
11462+ /*
11463+ * If overlay cursor is needed, DC cannot go through the
11464+ * native cursor update path. All enabled planes on the CRTC
11465+ * need to be added for DC to not disable a plane by mistake
11466+ */
11467+ if (dm_new_crtc_state->cursor_mode == DM_CURSOR_OVERLAY_MODE) {
11468+ ret = drm_atomic_add_affected_planes(state, crtc);
11469+ if (ret)
11470+ goto fail;
11471+ }
1146111472 }
1146211473
1146311474 /* Remove exiting planes if they are modified */
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c+1−1
@@ -1325,7 +1325,7 @@ static bool is_dsc_need_re_compute( · 1324 unmodified lines
13251325 if (new_crtc_state->enable && new_crtc_state->active) {
13261326 if (new_crtc_state->mode_changed || new_crtc_state->active_changed ||
13271327 new_crtc_state->connectors_changed) {
1328− DRM_DEBUG_DRIVER("%s:%d MST_DSC dsc recompte required."
1328+ DRM_DEBUG_DRIVER("%s:%d MST_DSC dsc recompute required."
13291329 "stream 0x%p in new dc_state\n",
13301330 __func__, __LINE__, stream);
13311331 is_dsc_need_re_compute = true;
drivers/gpu/drm/amd/display/dc/dccg/dcn35/dcn35_dccg.c+34−45
@@ -1748,10 +1748,6 @@ void dccg35_init(struct dccg *dccg) · 1747 unmodified lines
17481748 dccg35_set_dpstreamclk_root_clock_gating(dccg, otg_inst, false);
17491749 }
17501750
1751− if (dccg->ctx->dc->debug.root_clock_optimization.bits.dpp)
1752− for (otg_inst = 0; otg_inst < 4; otg_inst++)
1753− dccg35_set_dppclk_root_clock_gating(dccg, otg_inst, 0);
1754−
17551751 /*
17561752 dccg35_enable_global_fgcg_rep(
17571753 dccg, dccg->ctx->dc->debug.enable_fine_grain_clock_gating.bits
@@ -1932,47 +1928,32 @@ static void dccg35_enable_symclk_se(struct dccg *dccg, uint32_t stream_enc_inst, · 174 unmodified lines
19321928 }
19331929
19341930 /*get other front end connected to this backend*/
1935−static uint8_t dccg35_get_other_enabled_symclk_fe(struct dccg *dccg, uint32_t stream_enc_inst, uint32_t link_enc_inst)
1931+static uint8_t dccg35_get_number_enabled_symclk_fe_connected_to_be(struct dccg *dccg, uint32_t link_enc_inst)
19361932 {
19371933 uint8_t num_enabled_symclk_fe = 0;
1938− uint32_t be_clk_en = 0, fe_clk_en[5] = {0}, be_clk_sel[5] = {0};
1934+ uint32_t fe_clk_en[5] = {0}, be_clk_sel[5] = {0};
19391935 struct dcn_dccg *dccg_dcn = TO_DCN_DCCG(dccg);
19401936
1941− switch (link_enc_inst) {
1942− case 0:
1943− REG_GET_3(SYMCLKA_CLOCK_ENABLE, SYMCLKA_CLOCK_ENABLE, &be_clk_en,
1944− SYMCLKA_FE_EN, &fe_clk_en[0],
1945− SYMCLKA_FE_SRC_SEL, &be_clk_sel[0]);
1946− break;
1947− case 1:
1948− REG_GET_3(SYMCLKB_CLOCK_ENABLE, SYMCLKB_CLOCK_ENABLE, &be_clk_en,
1949− SYMCLKB_FE_EN, &fe_clk_en[1],
1950− SYMCLKB_FE_SRC_SEL, &be_clk_sel[1]);
1951− break;
1952− case 2:
1953− REG_GET_3(SYMCLKC_CLOCK_ENABLE, SYMCLKC_CLOCK_ENABLE, &be_clk_en,
1954− SYMCLKC_FE_EN, &fe_clk_en[2],
1955− SYMCLKC_FE_SRC_SEL, &be_clk_sel[2]);
1956− break;
1957− case 3:
1958− REG_GET_3(SYMCLKD_CLOCK_ENABLE, SYMCLKD_CLOCK_ENABLE, &be_clk_en,
1959− SYMCLKD_FE_EN, &fe_clk_en[3],
1960− SYMCLKD_FE_SRC_SEL, &be_clk_sel[3]);
1961− break;
1962− case 4:
1963− REG_GET_3(SYMCLKE_CLOCK_ENABLE, SYMCLKE_CLOCK_ENABLE, &be_clk_en,
1964− SYMCLKE_FE_EN, &fe_clk_en[4],
1965− SYMCLKE_FE_SRC_SEL, &be_clk_sel[4]);
1966− break;
1967− }
1968− if (be_clk_en) {
1969− /* for DPMST, this backend could be used by multiple front end.
1970− only disable the backend if this stream_enc_ins is the last active stream enc connected to this back_end*/
1971− uint8_t i;
1972− for (i = 0; i != link_enc_inst && i < ARRAY_SIZE(fe_clk_en); i++) {
1973− if (fe_clk_en[i] && be_clk_sel[i] == link_enc_inst)
1974− num_enabled_symclk_fe++;
1975− }
1937+ REG_GET_2(SYMCLKA_CLOCK_ENABLE, SYMCLKA_FE_EN, &fe_clk_en[0],
1938+ SYMCLKA_FE_SRC_SEL, &be_clk_sel[0]);
1939+
1940+ REG_GET_2(SYMCLKB_CLOCK_ENABLE, SYMCLKB_FE_EN, &fe_clk_en[1],
1941+ SYMCLKB_FE_SRC_SEL, &be_clk_sel[1]);
1942+
1943+ REG_GET_2(SYMCLKC_CLOCK_ENABLE, SYMCLKC_FE_EN, &fe_clk_en[2],
1944+ SYMCLKC_FE_SRC_SEL, &be_clk_sel[2]);
1945+
1946+ REG_GET_2(SYMCLKD_CLOCK_ENABLE, SYMCLKD_FE_EN, &fe_clk_en[3],
1947+ SYMCLKD_FE_SRC_SEL, &be_clk_sel[3]);
1948+
1949+ REG_GET_2(SYMCLKE_CLOCK_ENABLE, SYMCLKE_FE_EN, &fe_clk_en[4],
1950+ SYMCLKE_FE_SRC_SEL, &be_clk_sel[4]);
1951+
1952+ uint8_t i;
1953+
1954+ for (i = 0; i < ARRAY_SIZE(fe_clk_en); i++) {
1955+ if (fe_clk_en[i] && be_clk_sel[i] == link_enc_inst)
1956+ num_enabled_symclk_fe++;
19761957 }
19771958 return num_enabled_symclk_fe;
19781959 }
@@ -2020,9 +2001,9 @@ static void dccg35_disable_symclk_se(struct dccg *dccg, uint32_t stream_enc_inst · 41 unmodified lines
20202001 break;
20212002 }
20222003
2023− /*check other enabled symclk fe */
2024− num_enabled_symclk_fe = dccg35_get_other_enabled_symclk_fe(dccg, stream_enc_inst, link_enc_inst);
2025− /*only turn off backend clk if other front end attachecd to this backend are all off,
2004+ /*check other enabled symclk fe connected to this be */
2005+ num_enabled_symclk_fe = dccg35_get_number_enabled_symclk_fe_connected_to_be(dccg, link_enc_inst);
2006+ /*only turn off backend clk if other front end attached to this backend are all off,
20262007 for mst, only turn off the backend if this is the last front end*/
20272008 if (num_enabled_symclk_fe == 0) {
20282009 switch (link_enc_inst) {
@@ -2351,6 +2332,14 @@ static void dccg35_disable_symclk_se_cb( · 322 unmodified lines
23512332 /* DMU PHY sequence switches SYMCLK_BE (link_enc_inst) to ref clock once PHY is turned off */
23522333 }
23532334
2335+void dccg35_root_gate_disable_control(struct dccg *dccg, uint32_t pipe_idx, uint32_t disable_clock_gating)
2336+{
2337+
2338+ if (dccg->ctx->dc->debug.root_clock_optimization.bits.dpp) {
2339+ dccg35_set_dppclk_root_clock_gating(dccg, pipe_idx, disable_clock_gating);
2340+ }
2341+}
2342+
23542343 static const struct dccg_funcs dccg35_funcs_new = {
23552344 .update_dpp_dto = dccg35_update_dpp_dto_cb,
23562345 .dpp_root_clock_control = dccg35_dpp_root_clock_control_cb,
@@ -2411,7 +2400,7 @@ static const struct dccg_funcs dccg35_funcs = { · 54 unmodified lines
24112400 .enable_symclk_se = dccg35_enable_symclk_se,
24122401 .disable_symclk_se = dccg35_disable_symclk_se,
24132402 .set_dtbclk_p_src = dccg35_set_dtbclk_p_src,
2414−
2403+ .dccg_root_gate_disable_control = dccg35_root_gate_disable_control,
24152404 };
24162405
24172406 struct dccg *dccg35_create(
drivers/gpu/drm/amd/display/dc/dccg/dcn35/dcn35_dccg.h+1−0
@@ -241,6 +241,7 @@ struct dccg *dccg35_create( · 240 unmodified lines
241241 void dccg35_init(struct dccg *dccg);
242242
243243 void dccg35_enable_global_fgcg_rep(struct dccg *dccg, bool value);
244+void dccg35_root_gate_disable_control(struct dccg *dccg, uint32_t pipe_idx, uint32_t disable_clock_gating);
244245
245246
246247 #endif //__DCN35_DCCG_H__
drivers/gpu/drm/amd/display/dc/dpp/dcn401/dcn401_dpp_dscl.c+2−0
@@ -951,6 +951,8 @@ static void dpp401_dscl_set_isharp_filter( · 950 unmodified lines
951951 *
952952 * @dpp_base: High level DPP struct
953953 * @scl_data: scalaer_data info
954+ * @program_isharp_1dlut: flag to program isharp 1D LUT
955+ * @bs_coeffs_updated: Blur and Scale Coefficients update flag
954956 *
955957 * This is the primary function to program isharp
956958 *
drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.c+12−8
@@ -3212,15 +3212,19 @@ void dcn10_set_drr(struct pipe_ctx **pipe_ctx, · 3211 unmodified lines
32123212 * as well.
32133213 */
32143214 for (i = 0; i < num_pipes; i++) {
3215− if ((pipe_ctx[i]->stream_res.tg != NULL) && pipe_ctx[i]->stream_res.tg->funcs) {
3216− if (pipe_ctx[i]->stream_res.tg->funcs->set_drr)
3217− pipe_ctx[i]->stream_res.tg->funcs->set_drr(
3218− pipe_ctx[i]->stream_res.tg, &params);
3215+ /* dc_state_destruct() might null the stream resources, so fetch tg
3216+ * here first to avoid a race condition. The lifetime of the pointee
3217+ * itself (the timing_generator object) is not a problem here.
3218+ */
3219+ struct timing_generator *tg = pipe_ctx[i]->stream_res.tg;
3220+
3221+ if ((tg != NULL) && tg->funcs) {
3222+ if (tg->funcs->set_drr)
3223+ tg->funcs->set_drr(tg, &params);
32193224 if (adjust.v_total_max != 0 && adjust.v_total_min != 0)
3220− if (pipe_ctx[i]->stream_res.tg->funcs->set_static_screen_control)
3221− pipe_ctx[i]->stream_res.tg->funcs->set_static_screen_control(
3222− pipe_ctx[i]->stream_res.tg,
3223− event_triggers, num_frames);
3225+ if (tg->funcs->set_static_screen_control)
3226+ tg->funcs->set_static_screen_control(
3227+ tg, event_triggers, num_frames);
32243228 }
32253229 }
32263230 }
drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c+16−8
@@ -240,6 +240,10 @@ void dcn35_init_hw(struct dc *dc) · 239 unmodified lines
240240 dc->res_pool->hubbub->funcs->allow_self_refresh_control(dc->res_pool->hubbub,
241241 !dc->res_pool->hubbub->ctx->dc->debug.disable_stutter);
242242 }
243+ if (res_pool->dccg->funcs->dccg_root_gate_disable_control) {
244+ for (i = 0; i < res_pool->pipe_count; i++)
245+ res_pool->dccg->funcs->dccg_root_gate_disable_control(res_pool->dccg, i, 0);
246+ }
243247
244248 for (i = 0; i < res_pool->audio_count; i++) {
245249 struct audio *audio = res_pool->audios[i];
@@ -1414,7 +1418,13 @@ void dcn35_set_drr(struct pipe_ctx **pipe_ctx, · 1168 unmodified lines
14141418 params.vertical_total_mid_frame_num = adjust.v_total_mid_frame_num;
14151419
14161420 for (i = 0; i < num_pipes; i++) {
1417− if ((pipe_ctx[i]->stream_res.tg != NULL) && pipe_ctx[i]->stream_res.tg->funcs) {
1421+ /* dc_state_destruct() might null the stream resources, so fetch tg
1422+ * here first to avoid a race condition. The lifetime of the pointee
1423+ * itself (the timing_generator object) is not a problem here.
1424+ */
1425+ struct timing_generator *tg = pipe_ctx[i]->stream_res.tg;
1426+
1427+ if ((tg != NULL) && tg->funcs) {
14181428 if (pipe_ctx[i]->stream && pipe_ctx[i]->stream->ctx->dc->debug.static_screen_wait_frames) {
14191429 struct dc_crtc_timing *timing = &pipe_ctx[i]->stream->timing;
14201430 struct dc *dc = pipe_ctx[i]->stream->ctx->dc;
@@ -1426,14 +1436,12 @@ void dcn35_set_drr(struct pipe_ctx **pipe_ctx, · 5 unmodified lines
14261436 num_frames = 2 * (frame_rate % 60);
14271437 }
14281438 }
1429− if (pipe_ctx[i]->stream_res.tg->funcs->set_drr)
1430− pipe_ctx[i]->stream_res.tg->funcs->set_drr(
1431− pipe_ctx[i]->stream_res.tg, &params);
1439+ if (tg->funcs->set_drr)
1440+ tg->funcs->set_drr(tg, &params);
14321441 if (adjust.v_total_max != 0 && adjust.v_total_min != 0)
1433− if (pipe_ctx[i]->stream_res.tg->funcs->set_static_screen_control)
1434− pipe_ctx[i]->stream_res.tg->funcs->set_static_screen_control(
1435− pipe_ctx[i]->stream_res.tg,
1436− event_triggers, num_frames);
1442+ if (tg->funcs->set_static_screen_control)
1443+ tg->funcs->set_static_screen_control(
1444+ tg, event_triggers, num_frames);
14371445 }
14381446 }
14391447 }
drivers/gpu/drm/amd/display/dc/inc/hw/dccg.h+1−0
@@ -213,6 +213,7 @@ struct dccg_funcs { · 212 unmodified lines
213213 uint32_t otg_inst);
214214 void (*set_dto_dscclk)(struct dccg *dccg, uint32_t dsc_inst);
215215 void (*set_ref_dscclk)(struct dccg *dccg, uint32_t dsc_inst);
216+ void (*dccg_root_gate_disable_control)(struct dccg *dccg, uint32_t pipe_idx, uint32_t disable_clock_gating);
216217 };
217218
218219 #endif //__DAL_DCCG_H__
drivers/gpu/drm/amd/include/atomfirmware.h+2−2
@@ -1038,7 +1038,7 @@ struct display_object_info_table_v1_4 · 1037 unmodified lines
10381038 uint16_t supporteddevices;
10391039 uint8_t number_of_path;
10401040 uint8_t reserved;
1041− struct atom_display_object_path_v2 display_path[8]; //the real number of this included in the structure is calculated by using the (whole structure size - the header size- number_of_path)/size of atom_display_object_path
1041+ struct atom_display_object_path_v2 display_path[]; //the real number of this included in the structure is calculated by using the (whole structure size - the header size- number_of_path)/size of atom_display_object_path
10421042 };
10431043
10441044 struct display_object_info_table_v1_5 {
@@ -1048,7 +1048,7 @@ struct display_object_info_table_v1_5 { · 3 unmodified lines
10481048 uint8_t reserved;
10491049 // the real number of this included in the structure is calculated by using the
10501050 // (whole structure size - the header size- number_of_path)/size of atom_display_object_path
1051− struct atom_display_object_path_v3 display_path[8];
1051+ struct atom_display_object_path_v3 display_path[];
10521052 };
10531053
10541054 /*
drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h+10−1
@@ -439,7 +439,16 @@ enum smu_clk_type { · 438 unmodified lines
439439 __SMU_DUMMY_MAP(BACO_CG), \
440440 __SMU_DUMMY_MAP(SOC_CG), \
441441 __SMU_DUMMY_MAP(LOW_POWER_DCNCLKS), \
442− __SMU_DUMMY_MAP(WHISPER_MODE),
442+ __SMU_DUMMY_MAP(WHISPER_MODE), \
443+ __SMU_DUMMY_MAP(EDC_PWRBRK), \
444+ __SMU_DUMMY_MAP(SOC_EDC_XVMIN), \
445+ __SMU_DUMMY_MAP(GFX_PSM_DIDT), \
446+ __SMU_DUMMY_MAP(APT_ALL_ENABLE), \
447+ __SMU_DUMMY_MAP(APT_SQ_THROTTLE), \
448+ __SMU_DUMMY_MAP(APT_PF_DCS), \
449+ __SMU_DUMMY_MAP(GFX_EDC_XVMIN), \
450+ __SMU_DUMMY_MAP(GFX_DIDT_XVMIN), \
451+ __SMU_DUMMY_MAP(FAN_ABNORMAL),
443452
444453 #undef __SMU_DUMMY_MAP
445454 #define __SMU_DUMMY_MAP(feature) SMU_FEATURE_##feature##_BIT
drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c+12−0
@@ -199,6 +199,15 @@ static struct cmn2asic_mapping smu_v14_0_2_feature_mask_map[SMU_FEATURE_COUNT] = · 198 unmodified lines
199199 FEA_MAP(MEM_TEMP_READ),
200200 FEA_MAP(ATHUB_MMHUB_PG),
201201 FEA_MAP(SOC_PCC),
202+ FEA_MAP(EDC_PWRBRK),
203+ FEA_MAP(SOC_EDC_XVMIN),
204+ FEA_MAP(GFX_PSM_DIDT),
205+ FEA_MAP(APT_ALL_ENABLE),
206+ FEA_MAP(APT_SQ_THROTTLE),
207+ FEA_MAP(APT_PF_DCS),
208+ FEA_MAP(GFX_EDC_XVMIN),
209+ FEA_MAP(GFX_DIDT_XVMIN),
210+ FEA_MAP(FAN_ABNORMAL),
202211 [SMU_FEATURE_DPM_VCLK_BIT] = {1, FEATURE_MM_DPM_BIT},
203212 [SMU_FEATURE_DPM_DCLK_BIT] = {1, FEATURE_MM_DPM_BIT},
204213 [SMU_FEATURE_PPT_BIT] = {1, FEATURE_THROTTLERS_BIT},
@@ -687,6 +696,9 @@ static int smu_v14_0_2_set_default_dpm_table(struct smu_context *smu) · 482 unmodified lines
687696 pcie_table->clk_freq[pcie_table->num_of_link_levels] =
688697 skutable->LclkFreq[link_level];
689698 pcie_table->num_of_link_levels++;
699+
700+ if (link_level == 0)
701+ link_level++;
690702 }
691703
692704 /* dcefclk dpm table setup */
drivers/gpu/drm/drm_prime.c+54−30
@@ -410,22 +410,30 @@ static struct dma_buf *export_and_register_object(struct drm_device *dev, · 409 unmodified lines
410410 }
411411
412412 /**
413− * drm_gem_prime_handle_to_fd - PRIME export function for GEM drivers
413+ * drm_gem_prime_handle_to_dmabuf - PRIME export function for GEM drivers
414414 * @dev: dev to export the buffer from
415415 * @file_priv: drm file-private structure
416416 * @handle: buffer handle to export
417417 * @flags: flags like DRM_CLOEXEC
418− * @prime_fd: pointer to storage for the fd id of the create dma-buf
419418 *
420419 * This is the PRIME export function which must be used mandatorily by GEM
421420 * drivers to ensure correct lifetime management of the underlying GEM object.
422421 * The actual exporting from GEM object to a dma-buf is done through the
423422 * &drm_gem_object_funcs.export callback.
423+ *
424+ * Unlike drm_gem_prime_handle_to_fd(), it returns the struct dma_buf it
425+ * has created, without attaching it to any file descriptors. The difference
426+ * between those two is similar to that between anon_inode_getfile() and
427+ * anon_inode_getfd(); insertion into descriptor table is something you
428+ * can not revert if any cleanup is needed, so the descriptor-returning
429+ * variants should only be used when you are past the last failure exit
430+ * and the only thing left is passing the new file descriptor to userland.
431+ * When all you need is the object itself or when you need to do something
432+ * else that might fail, use that one instead.
424433 */
425−int drm_gem_prime_handle_to_fd(struct drm_device *dev,
434+struct dma_buf *drm_gem_prime_handle_to_dmabuf(struct drm_device *dev,
426435 struct drm_file *file_priv, uint32_t handle,
427− uint32_t flags,
428− int *prime_fd)
436+ uint32_t flags)
429437 {
430438 struct drm_gem_object *obj;
431439 int ret = 0;
@@ -434,14 +442,14 @@ int drm_gem_prime_handle_to_fd(struct drm_device *dev, · 2 unmodified lines
434442 mutex_lock(&file_priv->prime.lock);
435443 obj = drm_gem_object_lookup(file_priv, handle);
436444 if (!obj) {
437− ret = -ENOENT;
445+ dmabuf = ERR_PTR(-ENOENT);
438446 goto out_unlock;
439447 }
440448
441449 dmabuf = drm_prime_lookup_buf_by_handle(&file_priv->prime, handle);
442450 if (dmabuf) {
443451 get_dma_buf(dmabuf);
444− goto out_have_handle;
452+ goto out;
445453 }
446454
447455 mutex_lock(&dev->object_name_lock);
@@ -463,7 +471,6 @@ int drm_gem_prime_handle_to_fd(struct drm_device *dev, · 15 unmodified lines
463471 /* normally the created dma-buf takes ownership of the ref,
464472 * but if that fails then drop the ref
465473 */
466− ret = PTR_ERR(dmabuf);
467474 mutex_unlock(&dev->object_name_lock);
468475 goto out;
469476 }
@@ -478,34 +485,51 @@ out_have_obj: · 8 unmodified lines
478485 ret = drm_prime_add_buf_handle(&file_priv->prime,
479486 dmabuf, handle);
480487 mutex_unlock(&dev->object_name_lock);
481− if (ret)
482− goto fail_put_dmabuf;
483−
484−out_have_handle:
485− ret = dma_buf_fd(dmabuf, flags);
486− /*
487− * We must _not_ remove the buffer from the handle cache since the newly
488− * created dma buf is already linked in the global obj->dma_buf pointer,
489− * and that is invariant as long as a userspace gem handle exists.
490− * Closing the handle will clean out the cache anyway, so we don't leak.
491− */
492− if (ret < 0) {
493− goto fail_put_dmabuf;
494− } else {
495− *prime_fd = ret;
496− ret = 0;
488+ if (ret) {
489+ dma_buf_put(dmabuf);
490+ dmabuf = ERR_PTR(ret);
497491 }
498−
499− goto out;
500−
501−fail_put_dmabuf:
502− dma_buf_put(dmabuf);
503492 out:
504493 drm_gem_object_put(obj);
505494 out_unlock:
506495 mutex_unlock(&file_priv->prime.lock);
496+ return dmabuf;
497+}
498+EXPORT_SYMBOL(drm_gem_prime_handle_to_dmabuf);
507499
508− return ret;
500+/**
501+ * drm_gem_prime_handle_to_fd - PRIME export function for GEM drivers
502+ * @dev: dev to export the buffer from
503+ * @file_priv: drm file-private structure
504+ * @handle: buffer handle to export
505+ * @flags: flags like DRM_CLOEXEC
506+ * @prime_fd: pointer to storage for the fd id of the create dma-buf
507+ *
508+ * This is the PRIME export function which must be used mandatorily by GEM
509+ * drivers to ensure correct lifetime management of the underlying GEM object.
510+ * The actual exporting from GEM object to a dma-buf is done through the
511+ * &drm_gem_object_funcs.export callback.
512+ */
513+int drm_gem_prime_handle_to_fd(struct drm_device *dev,
514+ struct drm_file *file_priv, uint32_t handle,
515+ uint32_t flags,
516+ int *prime_fd)
517+{
518+ struct dma_buf *dmabuf;
519+ int fd = get_unused_fd_flags(flags);
520+
521+ if (fd < 0)
522+ return fd;
523+
524+ dmabuf = drm_gem_prime_handle_to_dmabuf(dev, file_priv, handle, flags);
525+ if (IS_ERR(dmabuf)) {
526+ put_unused_fd(fd);
527+ return PTR_ERR(dmabuf);
528+ }
529+
530+ fd_install(fd, dmabuf->file);
531+ *prime_fd = fd;
532+ return 0;
509533 }
510534 EXPORT_SYMBOL(drm_gem_prime_handle_to_fd);
511535
include/drm/drm_prime.h+3−0
@@ -69,6 +69,9 @@ void drm_gem_dmabuf_release(struct dma_buf *dma_buf); · 68 unmodified lines
6969
7070 int drm_gem_prime_fd_to_handle(struct drm_device *dev,
7171 struct drm_file *file_priv, int prime_fd, uint32_t *handle);
72+struct dma_buf *drm_gem_prime_handle_to_dmabuf(struct drm_device *dev,
73+ struct drm_file *file_priv, uint32_t handle,
74+ uint32_t flags);
7275 int drm_gem_prime_handle_to_fd(struct drm_device *dev,
7376 struct drm_file *file_priv, uint32_t handle, uint32_t flags,
7477 int *prime_fd);
include/uapi/linux/kfd_ioctl.h+87−13
@@ -540,26 +540,29 @@ enum kfd_smi_event { · 539 unmodified lines
540540 KFD_SMI_EVENT_ALL_PROCESS = 64
541541 };
542542
543+/* The reason of the page migration event */
543544 enum KFD_MIGRATE_TRIGGERS {
544− KFD_MIGRATE_TRIGGER_PREFETCH,
545− KFD_MIGRATE_TRIGGER_PAGEFAULT_GPU,
546− KFD_MIGRATE_TRIGGER_PAGEFAULT_CPU,
547− KFD_MIGRATE_TRIGGER_TTM_EVICTION
545+ KFD_MIGRATE_TRIGGER_PREFETCH, /* Prefetch to GPU VRAM or system memory */
546+ KFD_MIGRATE_TRIGGER_PAGEFAULT_GPU, /* GPU page fault recover */
547+ KFD_MIGRATE_TRIGGER_PAGEFAULT_CPU, /* CPU page fault recover */
548+ KFD_MIGRATE_TRIGGER_TTM_EVICTION /* TTM eviction */
548549 };
549550
551+/* The reason of user queue evition event */
550552 enum KFD_QUEUE_EVICTION_TRIGGERS {
551− KFD_QUEUE_EVICTION_TRIGGER_SVM,
552− KFD_QUEUE_EVICTION_TRIGGER_USERPTR,
553− KFD_QUEUE_EVICTION_TRIGGER_TTM,
554− KFD_QUEUE_EVICTION_TRIGGER_SUSPEND,
555− KFD_QUEUE_EVICTION_CRIU_CHECKPOINT,
556− KFD_QUEUE_EVICTION_CRIU_RESTORE
553+ KFD_QUEUE_EVICTION_TRIGGER_SVM, /* SVM buffer migration */
554+ KFD_QUEUE_EVICTION_TRIGGER_USERPTR, /* userptr movement */
555+ KFD_QUEUE_EVICTION_TRIGGER_TTM, /* TTM move buffer */
556+ KFD_QUEUE_EVICTION_TRIGGER_SUSPEND, /* GPU suspend */
557+ KFD_QUEUE_EVICTION_CRIU_CHECKPOINT, /* CRIU checkpoint */
558+ KFD_QUEUE_EVICTION_CRIU_RESTORE /* CRIU restore */
557559 };
558560
561+/* The reason of unmap buffer from GPU event */
559562 enum KFD_SVM_UNMAP_TRIGGERS {
560− KFD_SVM_UNMAP_TRIGGER_MMU_NOTIFY,
561− KFD_SVM_UNMAP_TRIGGER_MMU_NOTIFY_MIGRATE,
562− KFD_SVM_UNMAP_TRIGGER_UNMAP_FROM_CPU
563+ KFD_SVM_UNMAP_TRIGGER_MMU_NOTIFY, /* MMU notifier CPU buffer movement */
564+ KFD_SVM_UNMAP_TRIGGER_MMU_NOTIFY_MIGRATE,/* MMU notifier page migration */
565+ KFD_SVM_UNMAP_TRIGGER_UNMAP_FROM_CPU /* Unmap to free the buffer */
563566 };
564567
565568 #define KFD_SMI_EVENT_MASK_FROM_INDEX(i) (1ULL << ((i) - 1))
@@ -570,6 +573,77 @@ struct kfd_ioctl_smi_events_args { · 4 unmodified lines
570573 __u32 anon_fd; /* from KFD */
571574 };
572575
576+/*
577+ * SVM event tracing via SMI system management interface
578+ *
579+ * Open event file descriptor
580+ * use ioctl AMDKFD_IOC_SMI_EVENTS, pass in gpuid and return a anonymous file
581+ * descriptor to receive SMI events.
582+ * If calling with sudo permission, then file descriptor can be used to receive
583+ * SVM events from all processes, otherwise, to only receive SVM events of same
584+ * process.
585+ *
586+ * To enable the SVM event
587+ * Write event file descriptor with KFD_SMI_EVENT_MASK_FROM_INDEX(event) bitmap
588+ * mask to start record the event to the kfifo, use bitmap mask combination
589+ * for multiple events. New event mask will overwrite the previous event mask.
590+ * KFD_SMI_EVENT_MASK_FROM_INDEX(KFD_SMI_EVENT_ALL_PROCESS) bit requires sudo
591+ * permisson to receive SVM events from all process.
592+ *
593+ * To receive the event
594+ * Application can poll file descriptor to wait for the events, then read event
595+ * from the file into a buffer. Each event is one line string message, starting
596+ * with the event id, then the event specific information.
597+ *
598+ * To decode event information
599+ * The following event format string macro can be used with sscanf to decode
600+ * the specific event information.
601+ * event triggers: the reason to generate the event, defined as enum for unmap,
602+ * eviction and migrate events.
603+ * node, from, to, prefetch_loc, preferred_loc: GPU ID, or 0 for system memory.
604+ * addr: user mode address, in pages
605+ * size: in pages
606+ * pid: the process ID to generate the event
607+ * ns: timestamp in nanosecond-resolution, starts at system boot time but
608+ * stops during suspend
609+ * migrate_update: GPU page fault is recovered by 'M' for migrate, 'U' for update
610+ * rw: 'W' for write page fault, 'R' for read page fault
611+ * rescheduled: 'R' if the queue restore failed and rescheduled to try again
612+ */
613+#define KFD_EVENT_FMT_UPDATE_GPU_RESET(reset_seq_num, reset_cause)\
614+ "%x %s\n", (reset_seq_num), (reset_cause)
615+
616+#define KFD_EVENT_FMT_THERMAL_THROTTLING(bitmask, counter)\
617+ "%llx:%llx\n", (bitmask), (counter)
618+
619+#define KFD_EVENT_FMT_VMFAULT(pid, task_name)\
620+ "%x:%s\n", (pid), (task_name)
621+
622+#define KFD_EVENT_FMT_PAGEFAULT_START(ns, pid, addr, node, rw)\
623+ "%lld -%d @%lx(%x) %c\n", (ns), (pid), (addr), (node), (rw)
624+
625+#define KFD_EVENT_FMT_PAGEFAULT_END(ns, pid, addr, node, migrate_update)\
626+ "%lld -%d @%lx(%x) %c\n", (ns), (pid), (addr), (node), (migrate_update)
627+
628+#define KFD_EVENT_FMT_MIGRATE_START(ns, pid, start, size, from, to, prefetch_loc,\
629+ preferred_loc, migrate_trigger)\
630+ "%lld -%d @%lx(%lx) %x->%x %x:%x %d\n", (ns), (pid), (start), (size),\
631+ (from), (to), (prefetch_loc), (preferred_loc), (migrate_trigger)
632+
633+#define KFD_EVENT_FMT_MIGRATE_END(ns, pid, start, size, from, to, migrate_trigger)\
634+ "%lld -%d @%lx(%lx) %x->%x %d\n", (ns), (pid), (start), (size),\
635+ (from), (to), (migrate_trigger)
636+
637+#define KFD_EVENT_FMT_QUEUE_EVICTION(ns, pid, node, evict_trigger)\
638+ "%lld -%d %x %d\n", (ns), (pid), (node), (evict_trigger)
639+
640+#define KFD_EVENT_FMT_QUEUE_RESTORE(ns, pid, node, rescheduled)\
641+ "%lld -%d %x %c\n", (ns), (pid), (node), (rescheduled)
642+
643+#define KFD_EVENT_FMT_UNMAP_FROM_GPU(ns, pid, addr, size, node, unmap_trigger)\
644+ "%lld -%d @%lx(%lx) %x %d\n", (ns), (pid), (addr), (size),\
645+ (node), (unmap_trigger)
646+
573647 /**************************************************************************************************
574648 * CRIU IOCTLs (Checkpoint Restore In Userspace)
575649 *