[PATCH 2/3] drm/amdgpu: Add peer-to-peer support among PCIe connected AMD GPUs

Felix Kuehling felix.kuehling at amd.com
Mon Jun 6 20:22:50 UTC 2022


Am 2022-06-06 um 16:04 schrieb Felix Kuehling:
> Am 2022-06-06 um 14:07 schrieb Ramesh Errabolu:
>> Add support for peer-to-peer communication among AMD GPUs over PCIe
>> bus. Support REQUIRES enablement of config HSA_AMD_P2P.
>>
>> Signed-off-by: Ramesh Errabolu <Ramesh.Errabolu at amd.com>
>
> Sorry, one more nit-pick inline. With that fixed, the patch is
>
> Reviewed-by: Felix Kuehling <Felix.Kuehling at amd.com>

Really inline now ...


>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>> index be0baacc5942..8e88e7c88d26 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>> @@ -34,6 +34,7 @@
>>   #include <linux/pci.h>
>>   #include <linux/devcoredump.h>
>>   #include <generated/utsrelease.h>
>> +#include <linux/pci-p2pdma.h>
>>     #include <drm/drm_atomic_helper.h>
>>   #include <drm/drm_probe_helper.h>
>> @@ -129,6 +130,8 @@ const char *amdgpu_asic_name[] = {
>>       "LAST",
>>   };
>>   +extern bool pcie_p2p;
>> +

This should be declared in amdgpu.h along with other module parameters.


>>   /**
>>    * DOC: pcie_replay_count
>>    *
>> @@ -5498,6 +5501,36 @@ static void amdgpu_device_get_pcie_info(struct 
>> amdgpu_device *adev)
>>       }
>>   }
>>   +/**
>> + * amdgpu_device_is_peer_accessible - Check peer access through PCIe 
>> BAR
>> + *
>> + * @adev: amdgpu_device pointer
>> + * @peer_adev: amdgpu_device pointer for peer device trying to 
>> access @adev
>> + *
>> + * Return true if @peer_adev can access (DMA) @adev through the PCIe
>> + * BAR, i.e. @adev is "large BAR" and the BAR matches the DMA mask of
>> + * @peer_adev.
>> + */
>> +bool amdgpu_device_is_peer_accessible(struct amdgpu_device *adev,
>> +                      struct amdgpu_device *peer_adev)
>> +{
>> +#ifdef CONFIG_HSA_AMD_P2P
>> +    uint64_t address_mask = peer_adev->dev->dma_mask ?
>> +        ~*peer_adev->dev->dma_mask : ~((1ULL << 32) - 1);
>> +    resource_size_t aper_limit =
>> +        adev->gmc.aper_base + adev->gmc.aper_size - 1;
>> +    bool p2p_access = !(pci_p2pdma_distance_many(adev->pdev,
>> +                    &peer_adev->dev, 1, true) < 0);
>> +
>> +    return pcie_p2p && p2p_access && (adev->gmc.visible_vram_size &&
>> +        adev->gmc.real_vram_size == adev->gmc.visible_vram_size &&
>> +        !(adev->gmc.aper_base & address_mask ||
>> +          aper_limit & address_mask));
>> +#else
>> +    return false;
>> +#endif
>> +}
>> +
>>   int amdgpu_device_baco_enter(struct drm_device *dev)
>>   {
>>       struct amdgpu_device *adev = drm_to_adev(dev);
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c 
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
>> index bed4ed88951f..d1c82a9e8569 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
>> @@ -802,6 +802,14 @@ MODULE_PARM_DESC(no_queue_eviction_on_vm_fault, 
>> "No queue eviction on VM fault (
>>   module_param_named(no_queue_eviction_on_vm_fault, 
>> amdgpu_no_queue_eviction_on_vm_fault, int, 0444);
>>   #endif
>>   +/**
>> + * DOC: pcie_p2p (bool)
>> + * Enable PCIe P2P (requires large-BAR). Default value: true (on)
>> + */
>> +bool pcie_p2p = true;
>> +module_param(pcie_p2p, bool, 0444);
>> +MODULE_PARM_DESC(pcie_p2p, "Enable PCIe P2P (requires large-BAR). (N 
>> = off, Y = on(default))");
>> +
>>   /**
>>    * DOC: dcfeaturemask (uint)
>>    * Override display features enabled. See enum DC_FEATURE_MASK in 
>> drivers/gpu/drm/amd/include/amd_shared.h.


More information about the amd-gfx mailing list