@@ -353,6 +353,103 @@ const std::map<estype, std::map<int, int>> es_sad_to_pmu_id_mapping = {
353
353
{estype::esEmrXcc, emr_sad_to_pmu_id_mapping },
354
354
};
355
355
356
+ #define SRF_PE0_PMON_ID 3
357
+ #define SRF_PE1_PMON_ID 4
358
+ #define SRF_PE2_PMON_ID 2
359
+ #define SRF_PE3_PMON_ID 5
360
+ /*
361
+ * There are platform configuration when FlexUPI stacks (stacks 5 and 6) are enabled as
362
+ * PCIe stack and PCIe ports are disabled (ports 2 and 3) and vice sersa. See details here:
363
+ * In these cases the PMON IDs are different.
364
+ * So, defines with _FLEX_ are applicable for cases when FlexUPI stacks
365
+ * are working as PCIe ports.
366
+ */
367
+ #define SRF_PE4_PMON_ID 11
368
+ #define SRF_FLEX_PE4_PMON_ID 13
369
+ #define SRF_PE5_PMON_ID 12
370
+ #define SRF_FLEX_PE5_PMON_ID 10
371
+
372
+ #define SRF_PE6_PMON_ID 0
373
+ #define SRF_PE7_PMON_ID 7
374
+ #define SRF_PE8_PMON_ID 8
375
+ #define SRF_HC0_PMON_ID 1
376
+ #define SRF_HC1_PMON_ID 6
377
+ #define SRF_HC2_PMON_ID 14
378
+ #define SRF_HC3_PMON_ID 9
379
+
380
+ #define SRF_PE0_SAD_BUS_ID 2
381
+ #define SRF_PE1_SAD_BUS_ID 3
382
+ #define SRF_PE2_SAD_BUS_ID 1
383
+ #define SRF_PE3_SAD_BUS_ID 4
384
+ #define SRF_PE4_SAD_BUS_ID 29
385
+ #define SRF_FLEX_PE4_SAD_BUS_ID SRF_PE4_SAD_BUS_ID
386
+ #define SRF_PE5_SAD_BUS_ID 26
387
+ #define SRF_FLEX_PE5_SAD_BUS_ID SRF_PE5_SAD_BUS_ID
388
+ #define SRF_PE6_SAD_BUS_ID 0 // UPI0
389
+ #define SRF_PE7_SAD_BUS_ID 5 // UPI1
390
+ #define SRF_PE8_SAD_BUS_ID 28 // UPI2
391
+ #define SRF_UBOXA_SAD_BUS_ID 30
392
+ #define SRF_UBOXB_SAD_BUS_ID 31
393
+
394
+ const std::set<int > srf_pcie_stacks ({
395
+ SRF_PE0_SAD_BUS_ID,
396
+ SRF_PE1_SAD_BUS_ID,
397
+ SRF_PE2_SAD_BUS_ID,
398
+ SRF_PE3_SAD_BUS_ID,
399
+ SRF_PE4_SAD_BUS_ID,
400
+ SRF_FLEX_PE4_SAD_BUS_ID,
401
+ SRF_PE5_SAD_BUS_ID,
402
+ SRF_FLEX_PE5_SAD_BUS_ID,
403
+ SRF_PE6_SAD_BUS_ID,
404
+ SRF_PE7_SAD_BUS_ID,
405
+ SRF_PE8_SAD_BUS_ID,
406
+ });
407
+
408
+ #define SRF_HC0_SAD_BUS_ID 8
409
+ #define SRF_HC1_SAD_BUS_ID 12
410
+ #define SRF_HC2_SAD_BUS_ID 20
411
+ #define SRF_HC3_SAD_BUS_ID 16
412
+
413
+ const std::map<int , int > srf_sad_to_pmu_id_mapping = {
414
+ { SRF_PE0_SAD_BUS_ID, SRF_PE0_PMON_ID },
415
+ { SRF_PE1_SAD_BUS_ID, SRF_PE1_PMON_ID },
416
+ { SRF_PE2_SAD_BUS_ID, SRF_PE2_PMON_ID },
417
+ { SRF_PE3_SAD_BUS_ID, SRF_PE3_PMON_ID },
418
+ { SRF_PE4_SAD_BUS_ID, SRF_PE4_PMON_ID },
419
+ { SRF_FLEX_PE4_SAD_BUS_ID, SRF_FLEX_PE4_PMON_ID },
420
+ { SRF_PE5_SAD_BUS_ID, SRF_PE5_PMON_ID },
421
+ { SRF_FLEX_PE5_SAD_BUS_ID, SRF_FLEX_PE5_PMON_ID },
422
+ { SRF_PE6_SAD_BUS_ID, SRF_PE6_PMON_ID },
423
+ { SRF_PE7_SAD_BUS_ID, SRF_PE7_PMON_ID },
424
+ { SRF_PE8_SAD_BUS_ID, SRF_PE8_PMON_ID },
425
+ { SRF_HC0_SAD_BUS_ID, SRF_HC0_PMON_ID },
426
+ { SRF_HC1_SAD_BUS_ID, SRF_HC1_PMON_ID },
427
+ { SRF_HC2_SAD_BUS_ID, SRF_HC2_PMON_ID },
428
+ { SRF_HC3_SAD_BUS_ID, SRF_HC3_PMON_ID },
429
+ };
430
+
431
+ #define SRF_DSA_IAX_PART_NUMBER 0
432
+ #define SRF_HQM_PART_NUMBER 5
433
+ #define SRF_QAT_PART_NUMBER 4
434
+
435
+ static const std::string srf_iio_stack_names[] = {
436
+ " IIO Stack 0 - PCIe6 " , // SRF_PE6_PMON_ID 0
437
+ " IIO Stack 1 - HCx0 " , // SRF_HC0_PMON_ID 1
438
+ " IIO Stack 2 - PCIe2 " , // SRF_PE2_PMON_ID 2
439
+ " IIO Stack 3 - PCIe0 " , // SRF_PE0_PMON_ID 3
440
+ " IIO Stack 4 - PCIe1 " , // SRF_PE1_PMON_ID 4
441
+ " IIO Stack 5 - PCIe3 " , // SRF_PE3_PMON_ID 5
442
+ " IIO Stack 6 - HCx1 " , // SRF_HC1_PMON_ID 6
443
+ " IIO Stack 7 - PCIe7 " , // SRF_PE7_PMON_ID 7
444
+ " IIO Stack 8 - PCIe8 " , // SRF_PE8_PMON_ID 8
445
+ " IIO Stack 9 - HCx3 " , // SRF_HC3_PMON_ID 9
446
+ " IIO Stack 10 - Flex PCIe5" , // SRF_FLEX_PE5_PMON_ID 10
447
+ " IIO Stack 11 - PCIe4 " , // SRF_PE4_PMON_ID 11
448
+ " IIO Stack 12 - PCIe5 " , // SRF_PE5_PMON_ID 12
449
+ " IIO Stack 13 - Flex PCIe4" , // SRF_FLEX_PE4_PMON_ID 13
450
+ " IIO Stack 14 - HCx2 " , // SRF_HC2_PMON_ID 14
451
+ };
452
+
356
453
struct iio_counter : public counter {
357
454
std::vector<result_content> data;
358
455
};
@@ -1371,6 +1468,9 @@ class BirchStreamPlatform: public IPlatformMapping {
1371
1468
bool isPartHcStack (int unit);
1372
1469
bool isUboxStack (int unit);
1373
1470
1471
+ bool birchStreamPciStackProbe (int unit, const struct bdf &address, struct iio_stacks_on_socket &iio_on_socket);
1472
+ bool birchStreamAcceleratorStackProbe (int unit, const struct bdf &address, struct iio_stacks_on_socket &iio_on_socket);
1473
+
1374
1474
bool stackProbe (int unit, const struct bdf &address, struct iio_stacks_on_socket &iio_on_socket);
1375
1475
bool getRootBuses (std::map<int , std::map<int , struct bdf >> &root_buses);
1376
1476
public:
@@ -1379,34 +1479,187 @@ class BirchStreamPlatform: public IPlatformMapping {
1379
1479
bool pciTreeDiscover (std::vector<struct iio_stacks_on_socket >& iios) override ;
1380
1480
};
1381
1481
1482
+ bool BirchStreamPlatform::birchStreamPciStackProbe (int unit, const struct bdf &address, struct iio_stacks_on_socket &iio_on_socket)
1483
+ {
1484
+ /*
1485
+ * All stacks manage PCIe 5.0 Root Ports. Bifurcated Root Ports A-H appear as devices 2-9.
1486
+ */
1487
+ struct iio_stack stack;
1488
+ stack.domain = address.domainno ;
1489
+ stack.busno = address.busno ;
1490
+ stack.iio_unit_id = srf_sad_to_pmu_id_mapping.at (unit);
1491
+ stack.stack_name = srf_iio_stack_names[stack.iio_unit_id ];
1492
+ for (int slot = 2 ; slot < 9 ; ++slot)
1493
+ {
1494
+ struct pci root_pci_dev;
1495
+ root_pci_dev.bdf = bdf (address.domainno , address.busno , slot, 0x0 );
1496
+ if (probe_pci (&root_pci_dev))
1497
+ {
1498
+ struct iio_bifurcated_part part;
1499
+ part.part_id = slot - 2 ;
1500
+ part.root_pci_dev = root_pci_dev;
1501
+ for (uint8_t b = root_pci_dev.secondary_bus_number ; b <= root_pci_dev.subordinate_bus_number ; ++b) {
1502
+ for (uint8_t d = 0 ; d < 32 ; ++d) {
1503
+ for (uint8_t f = 0 ; f < 8 ; ++f) {
1504
+ struct pci child_pci_dev (address.domainno, b, d, f);
1505
+ if (probe_pci (&child_pci_dev)) {
1506
+ child_pci_dev.parts_no .push_back (part.part_id );
1507
+ part.child_pci_devs .push_back (child_pci_dev);
1508
+ }
1509
+ }
1510
+ }
1511
+ }
1512
+ stack.parts .push_back (part);
1513
+ }
1514
+ }
1515
+ iio_on_socket.stacks .push_back (stack);
1516
+ return true ;
1517
+ }
1518
+
1519
+ bool BirchStreamPlatform::birchStreamAcceleratorStackProbe (int unit, const struct bdf &address, struct iio_stacks_on_socket &iio_on_socket)
1520
+ {
1521
+ struct iio_stack stack;
1522
+ stack.iio_unit_id = srf_sad_to_pmu_id_mapping.at (unit);
1523
+ stack.domain = address.domainno ;
1524
+ stack.busno = address.busno ;
1525
+ stack.stack_name = srf_iio_stack_names[stack.iio_unit_id ];
1526
+
1527
+ /*
1528
+ * Instance of DSA(0, 1, 2, 3) appears as PCIe device with SAD Bus ID (8, 12, 20, 16), device 1, function 0
1529
+ * Instance of IAX(0, 1, 2, 3) appears as PCIe device with SAD Bus ID (8, 12, 20, 16), device 2, function 0
1530
+ * Instance of QAT(0, 1, 2, 3) appears as PCIe device with SAD Bus ID (9, 13, 21, 17), device 0, function 0
1531
+ * Instance of HQM(0, 1, 2, 3) appears as PCIe device with SAD Bus ID (10, 14, 22, 18), device 0, function 0
1532
+ */
1533
+ auto process_pci_dev = [](int domainno, int busno, int devno, int part_number, iio_bifurcated_part& part)
1534
+ {
1535
+ struct pci pci_dev (domainno, busno, devno, 0 );
1536
+ if (probe_pci (&pci_dev) && pci_dev.isIntelDevice ()) {
1537
+ part.part_id = part_number;
1538
+ pci_dev.parts_no .push_back (part_number);
1539
+ part.child_pci_devs .push_back (pci_dev);
1540
+ return true ;
1541
+ }
1542
+ return false ;
1543
+ };
1544
+
1545
+ {
1546
+ struct iio_bifurcated_part part;
1547
+ if (process_pci_dev (address.domainno , address.busno , 1 , SRF_DSA_IAX_PART_NUMBER, part) ||
1548
+ process_pci_dev (address.domainno , address.busno , 2 , SRF_DSA_IAX_PART_NUMBER, part)) {
1549
+ stack.parts .push_back (part);
1550
+ }
1551
+ }
1552
+
1553
+ {
1554
+ struct iio_bifurcated_part part;
1555
+ if (process_pci_dev (address.domainno , address.busno + 1 , 0 , SRF_QAT_PART_NUMBER, part)) {
1556
+ stack.parts .push_back (part);
1557
+ }
1558
+ }
1559
+
1560
+ {
1561
+ /* Bus number for HQM is higher on 3 than DSA bus number */
1562
+ struct iio_bifurcated_part part;
1563
+ if (process_pci_dev (address.domainno , address.busno + 3 , 0 , SRF_HQM_PART_NUMBER, part)) {
1564
+ stack.parts .push_back (part);
1565
+ }
1566
+ }
1567
+
1568
+ if (!stack.parts .empty ()) {
1569
+ iio_on_socket.stacks .push_back (stack);
1570
+ }
1571
+
1572
+ return true ;
1573
+ }
1574
+
1382
1575
bool BirchStreamPlatform::isPcieStack (int unit)
1383
1576
{
1384
- return false ;
1577
+ return srf_pcie_stacks. find (unit) != srf_pcie_stacks. end () ;
1385
1578
}
1386
1579
1580
+ /*
1581
+ * HC is the name of DINO stacks as we had on SPR
1582
+ */
1387
1583
bool BirchStreamPlatform::isRootHcStack (int unit)
1388
1584
{
1389
- return false ;
1585
+ return SRF_HC0_SAD_BUS_ID == unit || SRF_HC1_SAD_BUS_ID == unit ||
1586
+ SRF_HC2_SAD_BUS_ID == unit || SRF_HC3_SAD_BUS_ID == unit;
1390
1587
}
1391
1588
1392
1589
bool BirchStreamPlatform::isPartHcStack (int unit)
1393
1590
{
1394
- return false ;
1591
+ return isRootHcStack (unit - 1 ) || isRootHcStack (unit - 2 ) ;
1395
1592
}
1396
1593
1397
1594
bool BirchStreamPlatform::isUboxStack (int unit)
1398
1595
{
1399
- return false ;
1596
+ return SRF_UBOXA_SAD_BUS_ID == unit || SRF_UBOXB_SAD_BUS_ID == unit ;
1400
1597
}
1401
1598
1402
1599
bool BirchStreamPlatform::stackProbe (int unit, const struct bdf &address, struct iio_stacks_on_socket &iio_on_socket)
1403
1600
{
1404
- return true ;
1601
+ if (isPcieStack (unit)) {
1602
+ return birchStreamPciStackProbe (unit, address, iio_on_socket);
1603
+ }
1604
+ else if (isRootHcStack (unit)) {
1605
+ return birchStreamAcceleratorStackProbe (unit, address, iio_on_socket);
1606
+ }
1607
+ else if (isPartHcStack (unit)) {
1608
+ cout << " Found a part of HC stack. Stack ID - " << unit << " domain " << address.domainno
1609
+ << " bus " << std::hex << std::setfill (' 0' ) << std::setw (2 ) << (int )address.busno << std::dec << " . Don't probe it again." << endl;
1610
+ return true ;
1611
+ }
1612
+ else if (isUboxStack (unit)) {
1613
+ cout << " Found UBOX stack. Stack ID - " << unit << " domain " << address.domainno
1614
+ << " bus " << std::hex << std::setfill (' 0' ) << std::setw (2 ) << (int )address.busno << std::dec << endl;
1615
+ return true ;
1616
+ }
1617
+
1618
+ cout << " Unknown stack ID " << unit << " domain " << address.domainno << " bus " << std::hex << std::setfill (' 0' ) << std::setw (2 ) << (int )address.busno << std::dec << endl;
1619
+
1620
+ return false ;
1405
1621
}
1406
1622
1407
1623
bool BirchStreamPlatform::getRootBuses (std::map<int , std::map<int , struct bdf >> &root_buses)
1408
1624
{
1409
- return true ;
1625
+ bool mapped = true ;
1626
+ for (uint32_t domain = 0 ; mapped; domain++) {
1627
+ mapped = false ;
1628
+ for (uint16_t b = 0 ; b < 256 ; b++) {
1629
+ for (uint8_t d = 0 ; d < 32 ; d++) {
1630
+ for (uint8_t f = 0 ; f < 8 ; f++) {
1631
+ struct pci pci_dev (domain, b, d, f);
1632
+ if (!probe_pci (&pci_dev)) {
1633
+ break ;
1634
+ }
1635
+ if (!((pci_dev.vendor_id == PCM_INTEL_PCI_VENDOR_ID) && (pci_dev.device_id == SPR_MSM_DEV_ID))) {
1636
+ continue ;
1637
+ }
1638
+
1639
+ std::uint32_t cpuBusValid;
1640
+ std::vector<std::uint32_t > cpuBusNo;
1641
+ int package_id;
1642
+
1643
+ if (get_cpu_bus (domain, b, d, f, cpuBusValid, cpuBusNo, package_id) == false ) {
1644
+ return false ;
1645
+ }
1646
+
1647
+ for (int cpuBusId = 0 ; cpuBusId < SPR_MSM_CPUBUSNO_MAX; ++cpuBusId) {
1648
+ if (!((cpuBusValid >> cpuBusId) & 0x1 )) {
1649
+ cout << " CPU bus " << cpuBusId << " is disabled on package " << package_id << endl;
1650
+ continue ;
1651
+ }
1652
+ int rootBus = (cpuBusNo[(int )(cpuBusId / 4 )] >> ((cpuBusId % 4 ) * 8 )) & 0xff ;
1653
+ root_buses[package_id][cpuBusId] = bdf (domain, rootBus, 0 , 0 );
1654
+ cout << " Mapped CPU bus #" << cpuBusId << " (domain " << domain << " bus " << std::hex << rootBus << std::dec << " )"
1655
+ << " package " << package_id << endl;
1656
+ mapped = true ;
1657
+ }
1658
+ }
1659
+ }
1660
+ }
1661
+ }
1662
+ return !root_buses.empty ();
1410
1663
}
1411
1664
1412
1665
bool BirchStreamPlatform::pciTreeDiscover (std::vector<struct iio_stacks_on_socket >& iios)
@@ -1462,6 +1715,7 @@ ccr* get_ccr(PCM* m, uint64_t& ccr)
1462
1715
case PCM::SNOWRIDGE:
1463
1716
case PCM::SPR:
1464
1717
case PCM::EMR:
1718
+ case PCM::SRF:
1465
1719
return new icx_ccr (ccr);
1466
1720
default :
1467
1721
cerr << m->getCPUFamilyModelString () << " is not supported! Program aborted" << endl;
0 commit comments