@@ -273,18 +273,26 @@ static void seq_buf_print_bus_devfn(struct seq_buf *buf, struct pci_dev *pdev)
273
273
seq_buf_printf (buf , "%s;" , pci_name (pdev ));
274
274
}
275
275
276
+ static bool cpu_supports_p2pdma (void )
277
+ {
278
+ #ifdef CONFIG_X86
279
+ struct cpuinfo_x86 * c = & cpu_data (0 );
280
+
281
+ /* Any AMD CPU whose family ID is Zen or newer supports p2pdma */
282
+ if (c -> x86_vendor == X86_VENDOR_AMD && c -> x86 >= 0x17 )
283
+ return true;
284
+ #endif
285
+
286
+ return false;
287
+ }
288
+
276
289
static const struct pci_p2pdma_whitelist_entry {
277
290
unsigned short vendor ;
278
291
unsigned short device ;
279
292
enum {
280
293
REQ_SAME_HOST_BRIDGE = 1 << 0 ,
281
294
} flags ;
282
295
} pci_p2pdma_whitelist [] = {
283
- /* AMD ZEN */
284
- {PCI_VENDOR_ID_AMD , 0x1450 , 0 },
285
- {PCI_VENDOR_ID_AMD , 0x15d0 , 0 },
286
- {PCI_VENDOR_ID_AMD , 0x1630 , 0 },
287
-
288
296
/* Intel Xeon E5/Core i7 */
289
297
{PCI_VENDOR_ID_INTEL , 0x3c00 , REQ_SAME_HOST_BRIDGE },
290
298
{PCI_VENDOR_ID_INTEL , 0x3c01 , REQ_SAME_HOST_BRIDGE },
@@ -473,7 +481,8 @@ upstream_bridge_distance(struct pci_dev *provider, struct pci_dev *client,
473
481
acs_redirects , acs_list );
474
482
475
483
if (map_type == PCI_P2PDMA_MAP_THRU_HOST_BRIDGE ) {
476
- if (!host_bridge_whitelist (provider , client ))
484
+ if (!cpu_supports_p2pdma () &&
485
+ !host_bridge_whitelist (provider , client ))
477
486
map_type = PCI_P2PDMA_MAP_NOT_SUPPORTED ;
478
487
}
479
488
0 commit comments