Skip to content

Commit d2fd467

Browse files
committed
[AMD][Zen5] Introduced a UMC capabilities decoder for STX families
1 parent edc23f2 commit d2fd467

File tree

1 file changed

+71
-1
lines changed

1 file changed

+71
-1
lines changed

x86_64/corefreqd.c

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6963,6 +6963,72 @@ void AMD_17h_IOMMU(RO(SHM_STRUCT) *RO(Shm), RO(PROC) *RO(Proc))
69636963
RO(Proc)->Uncore.Bus.IOMMU_HDR.CapRev & 0b01111;
69646964
}
69656965

6966+
void AMD_1Ah_STX_CAP( RO(SHM_STRUCT) *RO(Shm),
6967+
RO(PROC) *RO(Proc), RO(CORE) *RO(Core) )
6968+
{
6969+
unsigned short mc, clock_done = 0;
6970+
for (mc = 0; mc < RO(Shm)->Uncore.CtrlCount && !clock_done; mc++)
6971+
{
6972+
unsigned short cha;
6973+
for (cha = 0;
6974+
cha < RO(Shm)->Uncore.MC[mc].ChannelCount && !clock_done;
6975+
cha++)
6976+
{
6977+
const AMD_ZEN_UMC_CFG_MISC MISC = \
6978+
RO(Proc)->Uncore.MC[mc].Channel[cha].AMD17h.MISC;
6979+
6980+
unsigned short slot;
6981+
6982+
if (MISC.DDR5.MEMCLK)
6983+
{
6984+
const unsigned int correction = \
6985+
BITEXTRZ((unsigned long long)MISC.value, 0, 3) == 0 ? 0 : 2;
6986+
6987+
RO(Shm)->Uncore.Bus.Rate = 4U * MISC.DDR5.MEMCLK;
6988+
RO(Shm)->Uncore.Bus.Rate = RO(Shm)->Uncore.Bus.Rate + correction;
6989+
6990+
RO(Shm)->Uncore.Bus.Speed =(unsigned long long)RO(Shm)->Uncore.Bus.Rate;
6991+
RO(Shm)->Uncore.Bus.Speed = \
6992+
( RO(Shm)->Uncore.Bus.Speed * RO(Core)->Clock.Hz )
6993+
/ RO(Shm)->Proc.Features.Factory.Clock.Hz;
6994+
6995+
RO(Shm)->Uncore.CtrlSpeed = 2LLU * RO(Shm)->Uncore.Bus.Rate;
6996+
6997+
clock_done = 1;
6998+
}
6999+
switch(RO(Proc)->Uncore.MC[mc].Channel[cha].AMD17h.CONFIG.BurstLength) {
7000+
case 0x0: /* BL2 */
7001+
case 0x1: /* BL4 */
7002+
case 0x2: /* BL8 */
7003+
RO(Shm)->Uncore.Unit.DDR_Ver = 4;
7004+
RO(Shm)->Uncore.Unit.DDR_Std = RAM_STD_LPDDR;
7005+
break;
7006+
case 0x3: /* BL16 */
7007+
RO(Shm)->Uncore.Unit.DDR_Ver = 5;
7008+
RO(Shm)->Uncore.Unit.DDR_Std = RAM_STD_LPDDR;
7009+
break;
7010+
}
7011+
for (slot = 0; slot < RO(Shm)->Uncore.MC[mc].SlotCount; slot++)
7012+
{
7013+
if (RO(Proc)->Uncore.MC[mc].Channel[cha].DIMM[slot].AMD17h\
7014+
.CFG.value != 0xffffffff)
7015+
{
7016+
if (RO(Proc)->Uncore.MC[mc].Channel[cha].DIMM[slot].AMD17h.CFG.RDIMM
7017+
|| RO(Proc)->Uncore.MC[mc].Channel[cha].DIMM[slot].AMD17h.CFG.LRDIMM)
7018+
{
7019+
RO(Shm)->Uncore.Unit.DDR_Std = RAM_STD_RDIMM;
7020+
break;
7021+
}
7022+
}
7023+
}
7024+
}
7025+
}
7026+
RO(Shm)->Uncore.Unit.Bus_Rate = MC_MHZ;
7027+
RO(Shm)->Uncore.Unit.BusSpeed = MC_MHZ;
7028+
RO(Shm)->Uncore.Unit.DDR_Rate = MC_NIL;
7029+
RO(Shm)->Uncore.Unit.DDRSpeed = MC_MTS;
7030+
}
7031+
69667032
#undef TIMING
69677033

69687034
static char *Chipset[CHIPSETS] = {
@@ -7710,10 +7776,14 @@ void PCI_AMD(RO(SHM_STRUCT) *RO(Shm), RO(PROC) *RO(Proc), RO(CORE) *RO(Core),
77107776
case DID_AMD_19H_GENOA_DF_UMC:
77117777
case DID_AMD_19H_PHOENIX_DF_UMC:
77127778
case DID_AMD_1AH_TURIN_DF_UMC:
7779+
AMD_17h_UMC(RO(Shm), RO(Proc));
7780+
AMD_17h_CAP(RO(Shm), RO(Proc), RO(Core));
7781+
SET_CHIPSET(IC_ZEN);
7782+
break;
77137783
case DID_AMD_1AH_STX_DF_UMC:
77147784
case DID_AMD_1AH_STXH_DF_UMC:
77157785
AMD_17h_UMC(RO(Shm), RO(Proc));
7716-
AMD_17h_CAP(RO(Shm), RO(Proc), RO(Core));
7786+
AMD_1Ah_STX_CAP(RO(Shm), RO(Proc), RO(Core));
77177787
SET_CHIPSET(IC_ZEN);
77187788
break;
77197789
}

0 commit comments

Comments
 (0)