Skip to content

Commit c462ca4

Browse files
Alexander Antonovrdementi
authored andcommitted
Enable pcm-iio for SRF
1 parent 3416589 commit c462ca4

File tree

2 files changed

+261
-6
lines changed

2 files changed

+261
-6
lines changed

src/cpucounters.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2509,6 +2509,7 @@ class PCM_API PCM
25092509
|| cpu_model == PCM::SNOWRIDGE
25102510
|| cpu_model == PCM::SPR
25112511
|| cpu_model == PCM::EMR
2512+
|| cpu_model == PCM::SRF
25122513
);
25132514
}
25142515

src/pcm-iio.cpp

Lines changed: 260 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,103 @@ const std::map<estype, std::map<int, int>> es_sad_to_pmu_id_mapping = {
353353
{estype::esEmrXcc, emr_sad_to_pmu_id_mapping },
354354
};
355355

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+
356453
struct iio_counter : public counter {
357454
std::vector<result_content> data;
358455
};
@@ -1371,6 +1468,9 @@ class BirchStreamPlatform: public IPlatformMapping {
13711468
bool isPartHcStack(int unit);
13721469
bool isUboxStack(int unit);
13731470

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+
13741474
bool stackProbe(int unit, const struct bdf &address, struct iio_stacks_on_socket &iio_on_socket);
13751475
bool getRootBuses(std::map<int, std::map<int, struct bdf>> &root_buses);
13761476
public:
@@ -1379,34 +1479,187 @@ class BirchStreamPlatform: public IPlatformMapping {
13791479
bool pciTreeDiscover(std::vector<struct iio_stacks_on_socket>& iios) override;
13801480
};
13811481

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+
13821575
bool BirchStreamPlatform::isPcieStack(int unit)
13831576
{
1384-
return false;
1577+
return srf_pcie_stacks.find(unit) != srf_pcie_stacks.end();
13851578
}
13861579

1580+
/*
1581+
* HC is the name of DINO stacks as we had on SPR
1582+
*/
13871583
bool BirchStreamPlatform::isRootHcStack(int unit)
13881584
{
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;
13901587
}
13911588

13921589
bool BirchStreamPlatform::isPartHcStack(int unit)
13931590
{
1394-
return false;
1591+
return isRootHcStack(unit - 1) || isRootHcStack(unit - 2);
13951592
}
13961593

13971594
bool BirchStreamPlatform::isUboxStack(int unit)
13981595
{
1399-
return false;
1596+
return SRF_UBOXA_SAD_BUS_ID == unit || SRF_UBOXB_SAD_BUS_ID == unit;
14001597
}
14011598

14021599
bool BirchStreamPlatform::stackProbe(int unit, const struct bdf &address, struct iio_stacks_on_socket &iio_on_socket)
14031600
{
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;
14051621
}
14061622

14071623
bool BirchStreamPlatform::getRootBuses(std::map<int, std::map<int, struct bdf>> &root_buses)
14081624
{
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();
14101663
}
14111664

14121665
bool BirchStreamPlatform::pciTreeDiscover(std::vector<struct iio_stacks_on_socket>& iios)
@@ -1462,6 +1715,7 @@ ccr* get_ccr(PCM* m, uint64_t& ccr)
14621715
case PCM::SNOWRIDGE:
14631716
case PCM::SPR:
14641717
case PCM::EMR:
1718+
case PCM::SRF:
14651719
return new icx_ccr(ccr);
14661720
default:
14671721
cerr << m->getCPUFamilyModelString() << " is not supported! Program aborted" << endl;

0 commit comments

Comments
 (0)