#ifndef _SYS_AMDZEN_THM_H
#define _SYS_AMDZEN_THM_H
#include <sys/bitext.h>
#include <sys/amdzen/smn.h>
#ifdef __cplusplus
extern "C" {
#endif
#define SMU_THM_APERTURE_MASK 0xfffffffffffff800
AMDZEN_MAKE_SMN_REG_FN(amdzen_smuthm_smn_reg, SMU_THM, 0x59800,
SMU_THM_APERTURE_MASK, 1, 0);
#define THM_CURTEMP SMN_MAKE_REG(0x59800)
#define THM_CURTEMP_GET_TEMP(r) bitx32(r, 31, 21)
#define THM_CURTEMP_TEMP_DEC_BITS 3
#define THM_CURTEMP_TEMP_DEC_MASK 0x7
#define THM_CURTEMP_TEMP_DEC_GRAN 8
#define THM_CURTEMP_GET_MCM(r) bitx32(r, 20, 20)
#define THM_CURTEMP_GET_RANGE(r) bitx32(r, 19, 19)
#define THM_CURTEMP_RANGE_O_225 0
#define THM_CURTEMP_RANGE_N49_206 1
#define THM_CURTEMP_RANGE_ADJ (-49)
#define THM_CURTEMP_GET_SLEW_SEL(r) bitx32(r, 18, 18)
#define THM_CURTEMP_GET_TJ_SEL(r) bitx32(r, 17, 16)
#define THM_CURTEMP_TJ_SEL_TCTL 0
#define THM_CURTEMP_TJ_SEL_TJ 2
#define THM_CURTEMP_TJ_SEL_RW 3
#define THM_CURTEMP_GET_TIME_DOWN(r) bitx32(r, 12, 8)
#define THM_CURTEMP_GET_SLEW_DOWN_EN(r) bitx32(r, 7, 7)
#define THM_CURTEMP_GET_MAX_DIFF(r) bitx32(r, 6, 5)
#define THM_CURTEMP_GET_TIME_UP(r) bitx32(r, 4, 0)
static inline uint16_t
THM_DIE_MAX_UNITS(x86_processor_family_t fam)
{
switch (fam) {
case X86_PF_AMD_STRIX_HALO:
return (2);
case X86_PF_AMD_NAPLES:
case X86_PF_AMD_PINNACLE_RIDGE:
case X86_PF_AMD_RAVEN_RIDGE:
case X86_PF_AMD_PICASSO:
case X86_PF_AMD_DALI:
case X86_PF_HYGON_DHYANA:
return (4);
case X86_PF_AMD_ROME:
case X86_PF_AMD_RENOIR:
case X86_PF_AMD_MATISSE:
case X86_PF_AMD_VAN_GOGH:
case X86_PF_AMD_MILAN:
case X86_PF_AMD_VERMEER:
case X86_PF_AMD_CEZANNE:
case X86_PF_AMD_MENDOCINO:
case X86_PF_AMD_REMBRANDT:
case X86_PF_AMD_RAPHAEL:
case X86_PF_AMD_PHOENIX:
case X86_PF_AMD_GRANITE_RIDGE:
return (8);
case X86_PF_AMD_GENOA:
case X86_PF_AMD_BERGAMO:
return (12);
case X86_PF_AMD_TURIN:
case X86_PF_AMD_DENSE_TURIN:
return (16);
case X86_PF_AMD_STRIX:
case X86_PF_AMD_KRACKAN:
default:
return (0);
}
}
static inline smn_reg_t
THM_DIE(uint8_t dieno, x86_processor_family_t fam)
{
smn_reg_def_t regdef = { 0 };
regdef.srd_unit = SMN_UNIT_SMU_THM;
regdef.srd_nents = THM_DIE_MAX_UNITS(fam);
ASSERT3U(regdef.srd_nents, !=, 0);
switch (fam) {
case X86_PF_AMD_NAPLES:
case X86_PF_AMD_PINNACLE_RIDGE:
case X86_PF_AMD_RAVEN_RIDGE:
case X86_PF_AMD_PICASSO:
case X86_PF_AMD_DALI:
case X86_PF_HYGON_DHYANA:
case X86_PF_AMD_ROME:
case X86_PF_AMD_RENOIR:
case X86_PF_AMD_MATISSE:
case X86_PF_AMD_VAN_GOGH:
case X86_PF_AMD_MILAN:
case X86_PF_AMD_VERMEER:
case X86_PF_AMD_CEZANNE:
regdef.srd_reg = 0x154;
break;
case X86_PF_AMD_MENDOCINO:
case X86_PF_AMD_REMBRANDT:
case X86_PF_AMD_GENOA:
case X86_PF_AMD_BERGAMO:
regdef.srd_reg = 0x300;
break;
case X86_PF_AMD_RAPHAEL:
case X86_PF_AMD_PHOENIX:
case X86_PF_AMD_GRANITE_RIDGE:
regdef.srd_reg = 0x308;
break;
case X86_PF_AMD_TURIN:
case X86_PF_AMD_DENSE_TURIN:
regdef.srd_reg = 0x1f0;
break;
case X86_PF_AMD_STRIX_HALO:
regdef.srd_reg = 0x78;
break;
default:
panic("encountered unknown family 0x%x while constructing "
"SMU::THM::THM_DIEX_TEMP", fam);
}
return (amdzen_smuthm_smn_reg(0, regdef, dieno));
}
#define THM_DIE_GET_VALID(r) bitx32(r, 11, 11)
#define THM_DIE_GET_TEMP(r) bitx32(r, 10, 0)
#ifdef __cplusplus
}
#endif
#endif