@@ -2365,8 +2365,8 @@ int amdgpu_device_ip_block_add(struct amdgpu_device *adev,
2365
2365
break ;
2366
2366
}
2367
2367
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 );
2370
2370
2371
2371
adev -> ip_blocks [adev -> num_ip_blocks ].adev = adev ;
2372
2372
@@ -6157,6 +6157,44 @@ static void amdgpu_device_partner_bandwidth(struct amdgpu_device *adev,
6157
6157
}
6158
6158
}
6159
6159
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
+
6160
6198
/**
6161
6199
* amdgpu_device_get_pcie_info - fence pcie info about the PCIE slot
6162
6200
*
@@ -6168,9 +6206,8 @@ static void amdgpu_device_partner_bandwidth(struct amdgpu_device *adev,
6168
6206
*/
6169
6207
static void amdgpu_device_get_pcie_info (struct amdgpu_device * adev )
6170
6208
{
6171
- struct pci_dev * pdev ;
6172
6209
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 ;
6174
6211
6175
6212
if (amdgpu_pcie_gen_cap )
6176
6213
adev -> pm .pcie_gen_mask = amdgpu_pcie_gen_cap ;
@@ -6192,11 +6229,10 @@ static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev)
6192
6229
6193
6230
amdgpu_device_partner_bandwidth (adev , & platform_speed_cap ,
6194
6231
& platform_link_width );
6232
+ amdgpu_device_gpu_bandwidth (adev , & speed_cap , & link_width );
6195
6233
6196
6234
if (adev -> pm .pcie_gen_mask == 0 ) {
6197
6235
/* asic caps */
6198
- pdev = adev -> pdev ;
6199
- speed_cap = pcie_get_speed_cap (pdev );
6200
6236
if (speed_cap == PCI_SPEED_UNKNOWN ) {
6201
6237
adev -> pm .pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
6202
6238
CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 |
@@ -6252,51 +6288,103 @@ static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev)
6252
6288
}
6253
6289
}
6254
6290
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 */
6255
6343
if (platform_link_width == PCIE_LNK_WIDTH_UNKNOWN ) {
6256
6344
adev -> pm .pcie_mlw_mask |= AMDGPU_DEFAULT_PCIE_MLW_MASK ;
6257
6345
} else {
6258
6346
switch (platform_link_width ) {
6259
6347
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 );
6267
6355
break ;
6268
6356
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 );
6275
6363
break ;
6276
6364
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 );
6282
6370
break ;
6283
6371
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 );
6288
6376
break ;
6289
6377
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 );
6293
6381
break ;
6294
6382
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 );
6297
6385
break ;
6298
6386
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 ;
6300
6388
break ;
6301
6389
default :
6302
6390
break ;
0 commit comments