From 0b685485cffa7afeed6c51de923c7649cc6bb72e Mon Sep 17 00:00:00 2001 From: Jay Cornwall Date: Thu, 1 Dec 2016 19:39:17 -0600 Subject: [PATCH 1214/4131] drm/amdkfd: Reject devices without host atomic support HSA requires atomic operations from device to host for all ASICs from Gfx8 onwards. APUs implicitly support this through ATS. Discrete GPUs require PCI support to route atomics to the host bridge and complete them. Do not bind to PCI devices which cannot route atomics to the host. Change-Id: Ieea113713229a81296a8f2565762b422eaf7122c Signed-off-by: Jay Cornwall Conflicts: drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c --- drivers/gpu/drm/amd/amdkfd/kfd_device.c | 18 ++++++++++++++++++ drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 1 + 2 files changed, 19 insertions(+) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c index e426663..5aae159 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c @@ -44,6 +44,7 @@ static const struct kfd_device_info kaveri_device_info = { .mqd_size_aligned = MQD_SIZE_ALIGNED, .is_need_iommu_device = true, .supports_cwsr = false, + .needs_pci_atomics = false, }; static const struct kfd_device_info hawaii_device_info = { @@ -57,6 +58,7 @@ static const struct kfd_device_info hawaii_device_info = { .mqd_size_aligned = MQD_SIZE_ALIGNED, .is_need_iommu_device = false, .supports_cwsr = false, + .needs_pci_atomics = false, }; static const struct kfd_device_info carrizo_device_info = { @@ -70,6 +72,7 @@ static const struct kfd_device_info carrizo_device_info = { .mqd_size_aligned = MQD_SIZE_ALIGNED, .is_need_iommu_device = true, .supports_cwsr = true, + .needs_pci_atomics = false, }; static const struct kfd_device_info tonga_device_info = { @@ -82,6 +85,7 @@ static const struct kfd_device_info tonga_device_info = { .mqd_size_aligned = MQD_SIZE_ALIGNED, .is_need_iommu_device = false, .supports_cwsr = false, + .needs_pci_atomics = true, }; static const struct kfd_device_info fiji_device_info = { @@ -94,6 +98,7 @@ static const struct kfd_device_info fiji_device_info = { .mqd_size_aligned = MQD_SIZE_ALIGNED, .is_need_iommu_device = false, .supports_cwsr = true, + .needs_pci_atomics = true, }; static const struct kfd_device_info polaris10_device_info = { @@ -106,6 +111,7 @@ static const struct kfd_device_info polaris10_device_info = { .mqd_size_aligned = MQD_SIZE_ALIGNED, .is_need_iommu_device = false, .supports_cwsr = true, + .needs_pci_atomics = true, }; static const struct kfd_device_info polaris11_device_info = { @@ -118,6 +124,7 @@ static const struct kfd_device_info polaris11_device_info = { .mqd_size_aligned = MQD_SIZE_ALIGNED, .is_need_iommu_device = false, .supports_cwsr = true, + .needs_pci_atomics = true, }; struct kfd_deviceid { @@ -226,6 +233,17 @@ struct kfd_dev *kgd2kfd_probe(struct kgd_dev *kgd, if (!device_info) return NULL; + if (device_info->needs_pci_atomics) { + /* Allow BIF to recode atomics to PCIe 3.0 AtomicOps. + */ + if (pci_enable_atomic_ops_to_root(pdev) < 0) { + dev_info(kfd_device, + "skipped device (%x:%x), PCI rejects atomics", + pdev->vendor, pdev->device); + return NULL; + } + } + BUG_ON(!f2g); kfd = kzalloc(sizeof(*kfd), GFP_KERNEL); diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h index 207b5bc..de34698 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h @@ -190,6 +190,7 @@ struct kfd_device_info { uint16_t mqd_size_aligned; bool is_need_iommu_device; bool supports_cwsr; + bool needs_pci_atomics; }; struct kfd_mem_obj { -- 2.7.4