@@ -2365,8 +2365,8 @@ int amdgpu_device_ip_block_add(struct amdgpu_device *adev,
23652365 break ;
23662366 }
23672367
2368- DRM_INFO ( "add ip block number %d <%s>\n", adev -> num_ip_blocks ,
2369- ip_block_version -> funcs -> name );
2368+ dev_info ( adev -> dev , "detected ip block number %d <%s>\n" ,
2369+ adev -> num_ip_blocks , ip_block_version -> funcs -> name );
23702370
23712371 adev -> ip_blocks [adev -> num_ip_blocks ].adev = adev ;
23722372
@@ -6157,6 +6157,44 @@ static void amdgpu_device_partner_bandwidth(struct amdgpu_device *adev,
61576157 }
61586158}
61596159
6160+ /**
6161+ * amdgpu_device_gpu_bandwidth - find the bandwidth of the GPU
6162+ *
6163+ * @adev: amdgpu_device pointer
6164+ * @speed: pointer to the speed of the link
6165+ * @width: pointer to the width of the link
6166+ *
6167+ * Evaluate the hierarchy to find the speed and bandwidth capabilities of the
6168+ * AMD dGPU which may be a virtual upstream bridge.
6169+ */
6170+ static void amdgpu_device_gpu_bandwidth (struct amdgpu_device * adev ,
6171+ enum pci_bus_speed * speed ,
6172+ enum pcie_link_width * width )
6173+ {
6174+ struct pci_dev * parent = adev -> pdev ;
6175+
6176+ if (!speed || !width )
6177+ return ;
6178+
6179+ parent = pci_upstream_bridge (parent );
6180+ if (parent && parent -> vendor == PCI_VENDOR_ID_ATI ) {
6181+ /* use the upstream/downstream switches internal to dGPU */
6182+ * speed = pcie_get_speed_cap (parent );
6183+ * width = pcie_get_width_cap (parent );
6184+ while ((parent = pci_upstream_bridge (parent ))) {
6185+ if (parent -> vendor == PCI_VENDOR_ID_ATI ) {
6186+ /* use the upstream/downstream switches internal to dGPU */
6187+ * speed = pcie_get_speed_cap (parent );
6188+ * width = pcie_get_width_cap (parent );
6189+ }
6190+ }
6191+ } else {
6192+ /* use the device itself */
6193+ * speed = pcie_get_speed_cap (adev -> pdev );
6194+ * width = pcie_get_width_cap (adev -> pdev );
6195+ }
6196+ }
6197+
61606198/**
61616199 * amdgpu_device_get_pcie_info - fence pcie info about the PCIE slot
61626200 *
@@ -6168,9 +6206,8 @@ static void amdgpu_device_partner_bandwidth(struct amdgpu_device *adev,
61686206 */
61696207static void amdgpu_device_get_pcie_info (struct amdgpu_device * adev )
61706208{
6171- struct pci_dev * pdev ;
61726209 enum pci_bus_speed speed_cap , platform_speed_cap ;
6173- enum pcie_link_width platform_link_width ;
6210+ enum pcie_link_width platform_link_width , link_width ;
61746211
61756212 if (amdgpu_pcie_gen_cap )
61766213 adev -> pm .pcie_gen_mask = amdgpu_pcie_gen_cap ;
@@ -6192,11 +6229,10 @@ static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev)
61926229
61936230 amdgpu_device_partner_bandwidth (adev , & platform_speed_cap ,
61946231 & platform_link_width );
6232+ amdgpu_device_gpu_bandwidth (adev , & speed_cap , & link_width );
61956233
61966234 if (adev -> pm .pcie_gen_mask == 0 ) {
61976235 /* asic caps */
6198- pdev = adev -> pdev ;
6199- speed_cap = pcie_get_speed_cap (pdev );
62006236 if (speed_cap == PCI_SPEED_UNKNOWN ) {
62016237 adev -> pm .pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
62026238 CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 |
@@ -6252,51 +6288,103 @@ static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev)
62526288 }
62536289 }
62546290 if (adev -> pm .pcie_mlw_mask == 0 ) {
6291+ /* asic caps */
6292+ if (link_width == PCIE_LNK_WIDTH_UNKNOWN ) {
6293+ adev -> pm .pcie_mlw_mask |= AMDGPU_DEFAULT_ASIC_PCIE_MLW_MASK ;
6294+ } else {
6295+ switch (link_width ) {
6296+ case PCIE_LNK_X32 :
6297+ adev -> pm .pcie_mlw_mask |= (CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X32 |
6298+ CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X16 |
6299+ CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X12 |
6300+ CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X8 |
6301+ CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X4 |
6302+ CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X2 |
6303+ CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X1 );
6304+ break ;
6305+ case PCIE_LNK_X16 :
6306+ adev -> pm .pcie_mlw_mask |= (CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X16 |
6307+ CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X12 |
6308+ CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X8 |
6309+ CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X4 |
6310+ CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X2 |
6311+ CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X1 );
6312+ break ;
6313+ case PCIE_LNK_X12 :
6314+ adev -> pm .pcie_mlw_mask |= (CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X12 |
6315+ CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X8 |
6316+ CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X4 |
6317+ CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X2 |
6318+ CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X1 );
6319+ break ;
6320+ case PCIE_LNK_X8 :
6321+ adev -> pm .pcie_mlw_mask |= (CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X8 |
6322+ CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X4 |
6323+ CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X2 |
6324+ CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X1 );
6325+ break ;
6326+ case PCIE_LNK_X4 :
6327+ adev -> pm .pcie_mlw_mask |= (CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X4 |
6328+ CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X2 |
6329+ CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X1 );
6330+ break ;
6331+ case PCIE_LNK_X2 :
6332+ adev -> pm .pcie_mlw_mask |= (CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X2 |
6333+ CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X1 );
6334+ break ;
6335+ case PCIE_LNK_X1 :
6336+ adev -> pm .pcie_mlw_mask |= CAIL_ASIC_PCIE_LINK_WIDTH_SUPPORT_X1 ;
6337+ break ;
6338+ default :
6339+ break ;
6340+ }
6341+ }
6342+ /* platform caps */
62556343 if (platform_link_width == PCIE_LNK_WIDTH_UNKNOWN ) {
62566344 adev -> pm .pcie_mlw_mask |= AMDGPU_DEFAULT_PCIE_MLW_MASK ;
62576345 } else {
62586346 switch (platform_link_width ) {
62596347 case PCIE_LNK_X32 :
6260- adev -> pm .pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 |
6261- CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
6262- CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
6263- CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
6264- CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
6265- CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
6266- CAIL_PCIE_LINK_WIDTH_SUPPORT_X1 );
6348+ adev -> pm .pcie_mlw_mask | = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 |
6349+ CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
6350+ CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
6351+ CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
6352+ CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
6353+ CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
6354+ CAIL_PCIE_LINK_WIDTH_SUPPORT_X1 );
62676355 break ;
62686356 case PCIE_LNK_X16 :
6269- adev -> pm .pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
6270- CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
6271- CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
6272- CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
6273- CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
6274- CAIL_PCIE_LINK_WIDTH_SUPPORT_X1 );
6357+ adev -> pm .pcie_mlw_mask | = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
6358+ CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
6359+ CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
6360+ CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
6361+ CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
6362+ CAIL_PCIE_LINK_WIDTH_SUPPORT_X1 );
62756363 break ;
62766364 case PCIE_LNK_X12 :
6277- adev -> pm .pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
6278- CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
6279- CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
6280- CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
6281- CAIL_PCIE_LINK_WIDTH_SUPPORT_X1 );
6365+ adev -> pm .pcie_mlw_mask | = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
6366+ CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
6367+ CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
6368+ CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
6369+ CAIL_PCIE_LINK_WIDTH_SUPPORT_X1 );
62826370 break ;
62836371 case PCIE_LNK_X8 :
6284- adev -> pm .pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
6285- CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
6286- CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
6287- CAIL_PCIE_LINK_WIDTH_SUPPORT_X1 );
6372+ adev -> pm .pcie_mlw_mask | = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
6373+ CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
6374+ CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
6375+ CAIL_PCIE_LINK_WIDTH_SUPPORT_X1 );
62886376 break ;
62896377 case PCIE_LNK_X4 :
6290- adev -> pm .pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
6291- CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
6292- CAIL_PCIE_LINK_WIDTH_SUPPORT_X1 );
6378+ adev -> pm .pcie_mlw_mask | = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
6379+ CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
6380+ CAIL_PCIE_LINK_WIDTH_SUPPORT_X1 );
62936381 break ;
62946382 case PCIE_LNK_X2 :
6295- adev -> pm .pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
6296- CAIL_PCIE_LINK_WIDTH_SUPPORT_X1 );
6383+ adev -> pm .pcie_mlw_mask | = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
6384+ CAIL_PCIE_LINK_WIDTH_SUPPORT_X1 );
62976385 break ;
62986386 case PCIE_LNK_X1 :
6299- adev -> pm .pcie_mlw_mask = CAIL_PCIE_LINK_WIDTH_SUPPORT_X1 ;
6387+ adev -> pm .pcie_mlw_mask | = CAIL_PCIE_LINK_WIDTH_SUPPORT_X1 ;
63006388 break ;
63016389 default :
63026390 break ;
0 commit comments