Skip to content

Commit 1be76b6

Browse files
committed
add IRP and IIO PMUs for BDX
1 parent 2737961 commit 1be76b6

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

src/cpucounters.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2456,6 +2456,47 @@ void PCM::initUncorePMUsDirect()
24562456
}
24572457
}
24582458
}
2459+
auto findPCICFGPMU = [](uint32 did,
2460+
const int s,
2461+
const uint32 CtlOffset,
2462+
const std::vector<uint32> & CounterControlOffsets,
2463+
const std::vector<uint32> & CounterValueOffsets)
2464+
{
2465+
int found = 0;
2466+
UncorePMU out;
2467+
forAllIntelDevices([&](const uint32 group, const uint32 bus, const uint32 device, const uint32 function, const uint32 device_id)
2468+
{
2469+
if (device_id == did)
2470+
{
2471+
if (s == found)
2472+
{
2473+
auto handle = std::make_shared<PciHandleType>(group, bus, device, function);
2474+
const size_t n_regs = 4;
2475+
std::vector<std::shared_ptr<HWRegister> > CounterControlRegs, CounterValueRegs;
2476+
for (size_t r = 0; r < n_regs; ++r)
2477+
{
2478+
CounterControlRegs.push_back(std::make_shared<PCICFGRegister32>(handle, CounterControlOffsets[r]));
2479+
CounterValueRegs.push_back(std::make_shared<PCICFGRegister64>(handle, CounterValueOffsets[r]));
2480+
}
2481+
auto boxCtlRegister = std::make_shared<PCICFGRegister32>(handle, CtlOffset);
2482+
out = UncorePMU(boxCtlRegister, CounterControlRegs, CounterValueRegs);
2483+
return;
2484+
}
2485+
++found;
2486+
}
2487+
});
2488+
return out;
2489+
};
2490+
for (uint32 s = 0; s < (uint32)num_sockets; ++s)
2491+
{
2492+
switch (cpu_model)
2493+
{
2494+
case BDX:
2495+
irpPMUs[s][0] = findPCICFGPMU(0x6f2a, s, 0xF4, {0xD8, 0xDC, 0xE0, 0xE4}, {0xA0, 0xB0, 0xB8, 0xC0});
2496+
iioPMUs[s][0] = findPCICFGPMU(0x6f34, s, 0xF4, {0xD8, 0xDC, 0xE0, 0xE4}, {0xA0, 0xA8, 0xB0, 0xB8});
2497+
break;
2498+
}
2499+
}
24592500

24602501
if (hasPCICFGUncore() && MSR.size())
24612502
{
@@ -9329,6 +9370,9 @@ void PCM::programIIOCounters(uint64 rawEvents[4], int IIOStack)
93299370
case PCM::SNOWRIDGE:
93309371
stacks_count = SNR_IIO_STACK_COUNT;
93319372
break;
9373+
case PCM::BDX:
9374+
stacks_count = BDX_IIO_STACK_COUNT;
9375+
break;
93329376
case PCM::SKX:
93339377
default:
93349378
stacks_count = SKX_IIO_STACK_COUNT;
@@ -9364,6 +9408,7 @@ void PCM::programIIOCounters(uint64 rawEvents[4], int IIOStack)
93649408

93659409
void PCM::programIRPCounters(uint64 rawEvents[4], int IIOStack)
93669410
{
9411+
// std::cerr << "PCM::programIRPCounters IRP PMU unit (stack) " << IIOStack << " getMaxNumOfIIOStacks(): " << getMaxNumOfIIOStacks()<< "\n";
93679412
std::vector<int32> IIO_units;
93689413
if (IIOStack == -1)
93699414
{
@@ -9389,6 +9434,7 @@ void PCM::programIRPCounters(uint64 rawEvents[4], int IIOStack)
93899434
std::cerr << "IRP PMU unit (stack) " << unit << " is not found \n";
93909435
continue;
93919436
}
9437+
// std::cerr << "Programming IRP PMU unit (stack) " << unit << " on socket " << i << " \n";
93929438
auto& pmu = irpPMUs[i][unit];
93939439
pmu.initFreeze(UNC_PMON_UNIT_CTL_RSV);
93949440

src/cpucounters.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -981,6 +981,10 @@ class PCM_API PCM
981981
SNR_IIO_STACK_COUNT = 5
982982
};
983983

984+
enum BDXIIOStacks {
985+
BDX_IIO_STACK_COUNT = 1
986+
};
987+
984988
enum IDX_IP
985989
{
986990
IDX_IAA = 0,

0 commit comments

Comments
 (0)