aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2018-09-20 19:52:21 -0400
committerDave Airlie <airlied@redhat.com>2018-09-20 19:52:27 -0400
commit4fcb7f8be829d21bcbb24eef2204fb6b34ed1f80 (patch)
treef45b2387962e1d22867830d316efb64ac1f87087 /drivers/gpu/drm/amd
parent618cc1514b1eed3bc1c46914d73a9914211aa9a4 (diff)
parent44d8cc6f1a905e4bb1d4221a898abb0d7e9d100a (diff)
Merge branch 'drm-fixes-4.19' of git://people.freedesktop.org/~agd5f/linux into drm-fixes
A few fixes for 4.19: - Add a new polaris pci id - KFD fixes for raven and gfx7 Signed-off-by: Dave Airlie <airlied@redhat.com> From: Alex Deucher <alexdeucher@gmail.com> Link: https://patchwork.freedesktop.org/patch/msgid/20180920155850.5455-1-alexander.deucher@amd.com
Diffstat (limited to 'drivers/gpu/drm/amd')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c14
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c1
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_device.c3
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_iommu.c13
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c2
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_priv.h1
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_topology.c21
-rw-r--r--drivers/gpu/drm/amd/include/kgd_kfd_interface.h2
11 files changed, 49 insertions, 18 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
index f8bbbb3a9504..0c791e35acf0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
@@ -272,7 +272,7 @@ void amdgpu_amdkfd_gpu_reset(struct kgd_dev *kgd)
272 272
273int alloc_gtt_mem(struct kgd_dev *kgd, size_t size, 273int alloc_gtt_mem(struct kgd_dev *kgd, size_t size,
274 void **mem_obj, uint64_t *gpu_addr, 274 void **mem_obj, uint64_t *gpu_addr,
275 void **cpu_ptr) 275 void **cpu_ptr, bool mqd_gfx9)
276{ 276{
277 struct amdgpu_device *adev = (struct amdgpu_device *)kgd; 277 struct amdgpu_device *adev = (struct amdgpu_device *)kgd;
278 struct amdgpu_bo *bo = NULL; 278 struct amdgpu_bo *bo = NULL;
@@ -287,6 +287,10 @@ int alloc_gtt_mem(struct kgd_dev *kgd, size_t size,
287 bp.flags = AMDGPU_GEM_CREATE_CPU_GTT_USWC; 287 bp.flags = AMDGPU_GEM_CREATE_CPU_GTT_USWC;
288 bp.type = ttm_bo_type_kernel; 288 bp.type = ttm_bo_type_kernel;
289 bp.resv = NULL; 289 bp.resv = NULL;
290
291 if (mqd_gfx9)
292 bp.flags |= AMDGPU_GEM_CREATE_MQD_GFX9;
293
290 r = amdgpu_bo_create(adev, &bp, &bo); 294 r = amdgpu_bo_create(adev, &bp, &bo);
291 if (r) { 295 if (r) {
292 dev_err(adev->dev, 296 dev_err(adev->dev,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
index 2f379c183ed2..cc9aeab5468c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
@@ -136,7 +136,7 @@ void amdgpu_amdkfd_gpu_reset(struct kgd_dev *kgd);
136/* Shared API */ 136/* Shared API */
137int alloc_gtt_mem(struct kgd_dev *kgd, size_t size, 137int alloc_gtt_mem(struct kgd_dev *kgd, size_t size,
138 void **mem_obj, uint64_t *gpu_addr, 138 void **mem_obj, uint64_t *gpu_addr,
139 void **cpu_ptr); 139 void **cpu_ptr, bool mqd_gfx9);
140void free_gtt_mem(struct kgd_dev *kgd, void *mem_obj); 140void free_gtt_mem(struct kgd_dev *kgd, void *mem_obj);
141void get_local_mem_info(struct kgd_dev *kgd, 141void get_local_mem_info(struct kgd_dev *kgd,
142 struct kfd_local_mem_info *mem_info); 142 struct kfd_local_mem_info *mem_info);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
index ea3f698aef5e..9803b91f3e77 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
@@ -685,7 +685,7 @@ static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
685 685
686 while (true) { 686 while (true) {
687 temp = RREG32(sdma_base_addr + mmSDMA0_RLC0_CONTEXT_STATUS); 687 temp = RREG32(sdma_base_addr + mmSDMA0_RLC0_CONTEXT_STATUS);
688 if (temp & SDMA0_STATUS_REG__RB_CMD_IDLE__SHIFT) 688 if (temp & SDMA0_RLC0_CONTEXT_STATUS__IDLE_MASK)
689 break; 689 break;
690 if (time_after(jiffies, end_jiffies)) 690 if (time_after(jiffies, end_jiffies))
691 return -ETIME; 691 return -ETIME;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
index 693ec5ea4950..8816c697b205 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
@@ -367,12 +367,14 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,
367 break; 367 break;
368 case CHIP_POLARIS10: 368 case CHIP_POLARIS10:
369 if (type == CGS_UCODE_ID_SMU) { 369 if (type == CGS_UCODE_ID_SMU) {
370 if ((adev->pdev->device == 0x67df) && 370 if (((adev->pdev->device == 0x67df) &&
371 ((adev->pdev->revision == 0xe0) || 371 ((adev->pdev->revision == 0xe0) ||
372 (adev->pdev->revision == 0xe3) || 372 (adev->pdev->revision == 0xe3) ||
373 (adev->pdev->revision == 0xe4) || 373 (adev->pdev->revision == 0xe4) ||
374 (adev->pdev->revision == 0xe5) || 374 (adev->pdev->revision == 0xe5) ||
375 (adev->pdev->revision == 0xe7) || 375 (adev->pdev->revision == 0xe7) ||
376 (adev->pdev->revision == 0xef))) ||
377 ((adev->pdev->device == 0x6fdf) &&
376 (adev->pdev->revision == 0xef))) { 378 (adev->pdev->revision == 0xef))) {
377 info->is_kicker = true; 379 info->is_kicker = true;
378 strcpy(fw_name, "amdgpu/polaris10_k_smc.bin"); 380 strcpy(fw_name, "amdgpu/polaris10_k_smc.bin");
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 8843a06360fa..0f41d8647376 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -740,6 +740,7 @@ static const struct pci_device_id pciidlist[] = {
740 {0x1002, 0x67CA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10}, 740 {0x1002, 0x67CA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
741 {0x1002, 0x67CC, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10}, 741 {0x1002, 0x67CC, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
742 {0x1002, 0x67CF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10}, 742 {0x1002, 0x67CF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
743 {0x1002, 0x6FDF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
743 /* Polaris12 */ 744 /* Polaris12 */
744 {0x1002, 0x6980, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12}, 745 {0x1002, 0x6980, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12},
745 {0x1002, 0x6981, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12}, 746 {0x1002, 0x6981, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12},
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
index 1b048715ab8a..29ac74f40dce 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
@@ -457,7 +457,8 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
457 457
458 if (kfd->kfd2kgd->init_gtt_mem_allocation( 458 if (kfd->kfd2kgd->init_gtt_mem_allocation(
459 kfd->kgd, size, &kfd->gtt_mem, 459 kfd->kgd, size, &kfd->gtt_mem,
460 &kfd->gtt_start_gpu_addr, &kfd->gtt_start_cpu_ptr)){ 460 &kfd->gtt_start_gpu_addr, &kfd->gtt_start_cpu_ptr,
461 false)) {
461 dev_err(kfd_device, "Could not allocate %d bytes\n", size); 462 dev_err(kfd_device, "Could not allocate %d bytes\n", size);
462 goto out; 463 goto out;
463 } 464 }
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_iommu.c b/drivers/gpu/drm/amd/amdkfd/kfd_iommu.c
index 7a61f38c09e6..01494752c36a 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_iommu.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_iommu.c
@@ -62,9 +62,20 @@ int kfd_iommu_device_init(struct kfd_dev *kfd)
62 struct amd_iommu_device_info iommu_info; 62 struct amd_iommu_device_info iommu_info;
63 unsigned int pasid_limit; 63 unsigned int pasid_limit;
64 int err; 64 int err;
65 struct kfd_topology_device *top_dev;
65 66
66 if (!kfd->device_info->needs_iommu_device) 67 top_dev = kfd_topology_device_by_id(kfd->id);
68
69 /*
70 * Overwrite ATS capability according to needs_iommu_device to fix
71 * potential missing corresponding bit in CRAT of BIOS.
72 */
73 if (!kfd->device_info->needs_iommu_device) {
74 top_dev->node_props.capability &= ~HSA_CAP_ATS_PRESENT;
67 return 0; 75 return 0;
76 }
77
78 top_dev->node_props.capability |= HSA_CAP_ATS_PRESENT;
68 79
69 iommu_info.flags = 0; 80 iommu_info.flags = 0;
70 err = amd_iommu_device_info(kfd->pdev, &iommu_info); 81 err = amd_iommu_device_info(kfd->pdev, &iommu_info);
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
index f5fc3675f21e..0cedb37cf513 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
@@ -88,7 +88,7 @@ static int init_mqd(struct mqd_manager *mm, void **mqd,
88 ALIGN(sizeof(struct v9_mqd), PAGE_SIZE), 88 ALIGN(sizeof(struct v9_mqd), PAGE_SIZE),
89 &((*mqd_mem_obj)->gtt_mem), 89 &((*mqd_mem_obj)->gtt_mem),
90 &((*mqd_mem_obj)->gpu_addr), 90 &((*mqd_mem_obj)->gpu_addr),
91 (void *)&((*mqd_mem_obj)->cpu_ptr)); 91 (void *)&((*mqd_mem_obj)->cpu_ptr), true);
92 } else 92 } else
93 retval = kfd_gtt_sa_allocate(mm->dev, sizeof(struct v9_mqd), 93 retval = kfd_gtt_sa_allocate(mm->dev, sizeof(struct v9_mqd),
94 mqd_mem_obj); 94 mqd_mem_obj);
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
index f971710f1c91..92b285ca73aa 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
@@ -806,6 +806,7 @@ int kfd_topology_add_device(struct kfd_dev *gpu);
806int kfd_topology_remove_device(struct kfd_dev *gpu); 806int kfd_topology_remove_device(struct kfd_dev *gpu);
807struct kfd_topology_device *kfd_topology_device_by_proximity_domain( 807struct kfd_topology_device *kfd_topology_device_by_proximity_domain(
808 uint32_t proximity_domain); 808 uint32_t proximity_domain);
809struct kfd_topology_device *kfd_topology_device_by_id(uint32_t gpu_id);
809struct kfd_dev *kfd_device_by_id(uint32_t gpu_id); 810struct kfd_dev *kfd_device_by_id(uint32_t gpu_id);
810struct kfd_dev *kfd_device_by_pci_dev(const struct pci_dev *pdev); 811struct kfd_dev *kfd_device_by_pci_dev(const struct pci_dev *pdev);
811int kfd_topology_enum_kfd_devices(uint8_t idx, struct kfd_dev **kdev); 812int kfd_topology_enum_kfd_devices(uint8_t idx, struct kfd_dev **kdev);
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
index bc95d4dfee2e..80f5db4ef75f 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
@@ -63,22 +63,33 @@ struct kfd_topology_device *kfd_topology_device_by_proximity_domain(
63 return device; 63 return device;
64} 64}
65 65
66struct kfd_dev *kfd_device_by_id(uint32_t gpu_id) 66struct kfd_topology_device *kfd_topology_device_by_id(uint32_t gpu_id)
67{ 67{
68 struct kfd_topology_device *top_dev; 68 struct kfd_topology_device *top_dev = NULL;
69 struct kfd_dev *device = NULL; 69 struct kfd_topology_device *ret = NULL;
70 70
71 down_read(&topology_lock); 71 down_read(&topology_lock);
72 72
73 list_for_each_entry(top_dev, &topology_device_list, list) 73 list_for_each_entry(top_dev, &topology_device_list, list)
74 if (top_dev->gpu_id == gpu_id) { 74 if (top_dev->gpu_id == gpu_id) {
75 device = top_dev->gpu; 75 ret = top_dev;
76 break; 76 break;
77 } 77 }
78 78
79 up_read(&topology_lock); 79 up_read(&topology_lock);
80 80
81 return device; 81 return ret;
82}
83
84struct kfd_dev *kfd_device_by_id(uint32_t gpu_id)
85{
86 struct kfd_topology_device *top_dev;
87
88 top_dev = kfd_topology_device_by_id(gpu_id);
89 if (!top_dev)
90 return NULL;
91
92 return top_dev->gpu;
82} 93}
83 94
84struct kfd_dev *kfd_device_by_pci_dev(const struct pci_dev *pdev) 95struct kfd_dev *kfd_device_by_pci_dev(const struct pci_dev *pdev)
diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
index 14391b06080c..43b82e14007e 100644
--- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
+++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
@@ -292,7 +292,7 @@ struct tile_config {
292struct kfd2kgd_calls { 292struct kfd2kgd_calls {
293 int (*init_gtt_mem_allocation)(struct kgd_dev *kgd, size_t size, 293 int (*init_gtt_mem_allocation)(struct kgd_dev *kgd, size_t size,
294 void **mem_obj, uint64_t *gpu_addr, 294 void **mem_obj, uint64_t *gpu_addr,
295 void **cpu_ptr); 295 void **cpu_ptr, bool mqd_gfx9);
296 296
297 void (*free_gtt_mem)(struct kgd_dev *kgd, void *mem_obj); 297 void (*free_gtt_mem)(struct kgd_dev *kgd, void *mem_obj);
298 298