Add APIs to initialize XGMI speed, width details and get to max bandwidth supported. It is assumed that a device only supports same generation of XGMI links with uniform width. Signed-off-by: Lijo Lazar <lijo.lazar@xxxxxxx> --- v2: Use GC versions as XGMI version is not populated for all SOCs (Hawking) Rename xgmi_init_info to early_init Denote speeds in MT instead of GT, rename enums accordingly. Don't associate enum with protocol version as speed is dependent on PHY. drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c | 48 ++++++++++++++++++++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.h | 11 ++++++ 2 files changed, 59 insertions(+) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c index 03d909c7b14b..f303ec159cd5 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c @@ -1679,3 +1679,51 @@ bool amdgpu_xgmi_same_hive(struct amdgpu_device *adev, adev->gmc.xgmi.hive_id && adev->gmc.xgmi.hive_id == bo_adev->gmc.xgmi.hive_id); } + +static inline uint32_t +__amdgpu_xgmi_get_max_bandwidth(uint8_t link_width, + enum amdgpu_xgmi_link_speed max_speed) +{ + /* Returns unidirectional bandwidth in Mbps */ + return max_speed * link_width; +} + +/** + * amdgpu_xgmi_get_max_bandwidth - Get max possible bandwidth of a single XGMI + * link of the device in Mbps + * @adev: Target device. + * + * Gets the max possible bandwidth of a single XGMI link of the device in Mbps. + * Assumption is all links of the device have the same width and are of the + * same XGMI generation. + */ +uint32_t amdgpu_xgmi_get_max_bandwidth(struct amdgpu_device *adev) +{ + if (!adev->gmc.xgmi.supported) + return 0; + + return __amdgpu_xgmi_get_max_bandwidth(adev->gmc.xgmi.max_width, adev->gmc.xgmi.max_speed); +} + +void amdgpu_xgmi_early_init(struct amdgpu_device *adev) +{ + if (!adev->gmc.xgmi.supported) + return; + + switch (amdgpu_ip_version(adev, GC_HWIP, 0)) { + case IP_VERSION(9, 4, 0): + case IP_VERSION(9, 4, 1): + case IP_VERSION(9, 4, 2): + adev->gmc.xgmi.max_speed = XGMI_SPEED_25MT; + adev->gmc.xgmi.max_width = 16; + break; + case IP_VERSION(9, 4, 3): + case IP_VERSION(9, 4, 4): + case IP_VERSION(9, 5, 0): + adev->gmc.xgmi.max_speed = XGMI_SPEED_32MT; + adev->gmc.xgmi.max_width = 16; + break; + default: + break; + } +} diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.h index 044c4f6be44a..a711af24fb63 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.h @@ -25,6 +25,12 @@ #include <drm/task_barrier.h> #include "amdgpu_ras.h" +enum amdgpu_xgmi_link_speed { + XGMI_SPEED_16MT = 16000, + XGMI_SPEED_25MT = 25000, + XGMI_SPEED_32MT = 32000 +}; + struct amdgpu_hive_info { struct kobject kobj; uint64_t hive_id; @@ -75,6 +81,8 @@ struct amdgpu_xgmi { struct ras_common_if *ras_if; bool connected_to_cpu; struct amdgpu_xgmi_ras *ras; + enum amdgpu_xgmi_link_speed max_speed; + uint8_t max_width; }; struct amdgpu_hive_info *amdgpu_get_xgmi_hive(struct amdgpu_device *adev); @@ -102,4 +110,7 @@ int amdgpu_xgmi_request_nps_change(struct amdgpu_device *adev, int amdgpu_get_xgmi_link_status(struct amdgpu_device *adev, int global_link_num); +void amdgpu_xgmi_early_init(struct amdgpu_device *adev); +uint32_t amdgpu_xgmi_get_max_bandwidth(struct amdgpu_device *adev); + #endif -- 2.25.1