Commit 3ee2d00c authored by Felix Kuehling's avatar Felix Kuehling Committed by Oded Gabbay

drm/amdkfd: Conditionally enable PCIe atomics

This will be needed for most dGPUs.

CC: linux-pci@vger.kernel.org
Signed-off-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Reviewed-by: default avatarOded Gabbay <oded.gabbay@gmail.com>
Signed-off-by: default avatarOded Gabbay <oded.gabbay@gmail.com>
parent 3f866f5f
...@@ -41,6 +41,7 @@ static const struct kfd_device_info kaveri_device_info = { ...@@ -41,6 +41,7 @@ static const struct kfd_device_info kaveri_device_info = {
.num_of_watch_points = 4, .num_of_watch_points = 4,
.mqd_size_aligned = MQD_SIZE_ALIGNED, .mqd_size_aligned = MQD_SIZE_ALIGNED,
.supports_cwsr = false, .supports_cwsr = false,
.needs_pci_atomics = false,
}; };
static const struct kfd_device_info carrizo_device_info = { static const struct kfd_device_info carrizo_device_info = {
...@@ -53,6 +54,7 @@ static const struct kfd_device_info carrizo_device_info = { ...@@ -53,6 +54,7 @@ static const struct kfd_device_info carrizo_device_info = {
.num_of_watch_points = 4, .num_of_watch_points = 4,
.mqd_size_aligned = MQD_SIZE_ALIGNED, .mqd_size_aligned = MQD_SIZE_ALIGNED,
.supports_cwsr = true, .supports_cwsr = true,
.needs_pci_atomics = false,
}; };
struct kfd_deviceid { struct kfd_deviceid {
...@@ -127,6 +129,21 @@ struct kfd_dev *kgd2kfd_probe(struct kgd_dev *kgd, ...@@ -127,6 +129,21 @@ struct kfd_dev *kgd2kfd_probe(struct kgd_dev *kgd,
return NULL; return NULL;
} }
if (device_info->needs_pci_atomics) {
/* Allow BIF to recode atomics to PCIe 3.0
* AtomicOps. 32 and 64-bit requests are possible and
* must be supported.
*/
if (pci_enable_atomic_ops_to_root(pdev,
PCI_EXP_DEVCAP2_ATOMIC_COMP32 |
PCI_EXP_DEVCAP2_ATOMIC_COMP64) < 0) {
dev_info(kfd_device,
"skipped device %x:%x, PCI rejects atomics",
pdev->vendor, pdev->device);
return NULL;
}
}
kfd = kzalloc(sizeof(*kfd), GFP_KERNEL); kfd = kzalloc(sizeof(*kfd), GFP_KERNEL);
if (!kfd) if (!kfd)
return NULL; return NULL;
......
...@@ -158,6 +158,7 @@ struct kfd_device_info { ...@@ -158,6 +158,7 @@ struct kfd_device_info {
uint8_t num_of_watch_points; uint8_t num_of_watch_points;
uint16_t mqd_size_aligned; uint16_t mqd_size_aligned;
bool supports_cwsr; bool supports_cwsr;
bool needs_pci_atomics;
}; };
struct kfd_mem_obj { struct kfd_mem_obj {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment