xref: /illumos-gate/usr/src/uts/intel/sys/amdzen/thm.h (revision 92279cb6e70fd12428e1d9e6270e7e2d877cbeec)
171536d92SRobert Mustacchi /*
271536d92SRobert Mustacchi  * This file and its contents are supplied under the terms of the
371536d92SRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
471536d92SRobert Mustacchi  * You may only use this file in accordance with the terms of version
571536d92SRobert Mustacchi  * 1.0 of the CDDL.
671536d92SRobert Mustacchi  *
771536d92SRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
871536d92SRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
971536d92SRobert Mustacchi  * http://www.illumos.org/license/CDDL.
1071536d92SRobert Mustacchi  */
1171536d92SRobert Mustacchi 
1271536d92SRobert Mustacchi /*
13*92279cb6SRobert Mustacchi  * Copyright 2025 Oxide Computer Company
1471536d92SRobert Mustacchi  */
1571536d92SRobert Mustacchi 
1671536d92SRobert Mustacchi #ifndef _SYS_AMDZEN_THM_H
1771536d92SRobert Mustacchi #define	_SYS_AMDZEN_THM_H
1871536d92SRobert Mustacchi 
1971536d92SRobert Mustacchi #include <sys/bitext.h>
2071536d92SRobert Mustacchi #include <sys/amdzen/smn.h>
2171536d92SRobert Mustacchi 
2271536d92SRobert Mustacchi /*
2371536d92SRobert Mustacchi  * This header covers the SMU's (system management unit) thermal block. The SMU,
2471536d92SRobert Mustacchi  * often called MP1 in various AMD docs, exists as a single entity in the I/O
2571536d92SRobert Mustacchi  * die (or a Zen 1 Zeppelin die), leaving most registers at a fixed entry point
2671536d92SRobert Mustacchi  * and block.
2771536d92SRobert Mustacchi  *
2871536d92SRobert Mustacchi  * The thermal block SMN registers are generally shadows or calculated
2971536d92SRobert Mustacchi  * information based on a series of internal diodes, slewing, and other related
3071536d92SRobert Mustacchi  * features that exist within the SOC. Only a subset of the overall thermal
3171536d92SRobert Mustacchi  * registers are described here which are used by us to obtain information. The
3271536d92SRobert Mustacchi  * majority of the other registers are only used by the SMU and perhaps the PSP.
3371536d92SRobert Mustacchi  * Note, similar information is provided over the sideband temperature interface
3471536d92SRobert Mustacchi  * (SB-TSI), which is consumed by the service processor on a system board that
3571536d92SRobert Mustacchi  * maintains a thermal loop.
3671536d92SRobert Mustacchi  *
3771536d92SRobert Mustacchi  * Note, CCDs have their own separate thermal block, SMU::THMCCD.
3871536d92SRobert Mustacchi  */
3971536d92SRobert Mustacchi 
4071536d92SRobert Mustacchi #ifdef __cplusplus
4171536d92SRobert Mustacchi extern "C" {
4271536d92SRobert Mustacchi #endif
4371536d92SRobert Mustacchi 
4471536d92SRobert Mustacchi /*
4571536d92SRobert Mustacchi  * SMU::THM registers, per-die.  This functional unit is present in all Zen CPUs
4671536d92SRobert Mustacchi  * and is effectively a singleton.
4771536d92SRobert Mustacchi  */
4871536d92SRobert Mustacchi #define	SMU_THM_APERTURE_MASK	0xfffffffffffff800
4971536d92SRobert Mustacchi AMDZEN_MAKE_SMN_REG_FN(amdzen_smuthm_smn_reg, SMU_THM, 0x59800,
5071536d92SRobert Mustacchi     SMU_THM_APERTURE_MASK, 1, 0);
5171536d92SRobert Mustacchi 
5271536d92SRobert Mustacchi /*
5371536d92SRobert Mustacchi  * SMU::THM::THM_TCON_CUR_TMP -- the primary thermal sensor in a given die. This
5471536d92SRobert Mustacchi  * is where Tctl generally comes from. Regardless of whether it encodes Tctl or
5571536d92SRobert Mustacchi  * Tj, the value is measured in 0.125 steps, hence a granularity of 8. The three
5671536d92SRobert Mustacchi  * lower bits of the temperature are to the right of the decimal.
5771536d92SRobert Mustacchi  */
5871536d92SRobert Mustacchi #define	THM_CURTEMP		SMN_MAKE_REG(0x59800)
5971536d92SRobert Mustacchi #define	THM_CURTEMP_GET_TEMP(r)		bitx32(r, 31, 21)
6071536d92SRobert Mustacchi #define	THM_CURTEMP_TEMP_DEC_BITS	3
6171536d92SRobert Mustacchi #define	THM_CURTEMP_TEMP_DEC_MASK	0x7
6271536d92SRobert Mustacchi #define	THM_CURTEMP_TEMP_DEC_GRAN	8
6371536d92SRobert Mustacchi #define	THM_CURTEMP_GET_MCM(r)		bitx32(r, 20, 20)
6471536d92SRobert Mustacchi #define	THM_CURTEMP_GET_RANGE(r)	bitx32(r, 19, 19)
6571536d92SRobert Mustacchi #define	THM_CURTEMP_RANGE_O_225		0
6671536d92SRobert Mustacchi #define	THM_CURTEMP_RANGE_N49_206	1
6771536d92SRobert Mustacchi #define	THM_CURTEMP_RANGE_ADJ		(-49)
6871536d92SRobert Mustacchi #define	THM_CURTEMP_GET_SLEW_SEL(r)	bitx32(r, 18, 18)
6971536d92SRobert Mustacchi #define	THM_CURTEMP_GET_TJ_SEL(r)	bitx32(r, 17, 16)
7071536d92SRobert Mustacchi #define	THM_CURTEMP_TJ_SEL_TCTL		0
7171536d92SRobert Mustacchi #define	THM_CURTEMP_TJ_SEL_TJ		2
7271536d92SRobert Mustacchi #define	THM_CURTEMP_TJ_SEL_RW		3
7371536d92SRobert Mustacchi #define	THM_CURTEMP_GET_TIME_DOWN(r)	bitx32(r, 12, 8)
7471536d92SRobert Mustacchi #define	THM_CURTEMP_GET_SLEW_DOWN_EN(r)	bitx32(r, 7, 7)
7571536d92SRobert Mustacchi #define	THM_CURTEMP_GET_MAX_DIFF(r)	bitx32(r, 6, 5)
7671536d92SRobert Mustacchi #define	THM_CURTEMP_GET_TIME_UP(r)	bitx32(r, 4, 0)
7771536d92SRobert Mustacchi 
7871536d92SRobert Mustacchi /*
7971536d92SRobert Mustacchi  * SMU::THM::THM_DIEX_TEMP -- this is a per-die measurement that comes from the
8071536d92SRobert Mustacchi  * thermal monitor. It measures Tdie and is in degrees C. The value is otherwise
8171536d92SRobert Mustacchi  * in the same format as described for SMU::THM::THM_TCON_CUR_TMP. Unlike Tctl
8271536d92SRobert Mustacchi  * above, this has a valid bit that must be consulted. Our understanding is that
8371536d92SRobert Mustacchi  * the valid bit, once set, will generally remain true.
8471536d92SRobert Mustacchi  *
8571536d92SRobert Mustacchi  * This register has a bit of an unfortunate history. The number of these that
8671536d92SRobert Mustacchi  * are valid and their location unfortunately changes on a per-CPU basis. This
8771536d92SRobert Mustacchi  * results in a much more complicated function for getting this with
8871536d92SRobert Mustacchi  * corresponding limits.
8971536d92SRobert Mustacchi  */
9071536d92SRobert Mustacchi static inline uint16_t
THM_DIE_MAX_UNITS(x86_processor_family_t fam)9171536d92SRobert Mustacchi THM_DIE_MAX_UNITS(x86_processor_family_t fam)
9271536d92SRobert Mustacchi {
9371536d92SRobert Mustacchi 	switch (fam) {
94*92279cb6SRobert Mustacchi 	case X86_PF_AMD_STRIX_HALO:
95*92279cb6SRobert Mustacchi 		return (2);
9671536d92SRobert Mustacchi 	case X86_PF_AMD_NAPLES:
9771536d92SRobert Mustacchi 	case X86_PF_AMD_PINNACLE_RIDGE:
9871536d92SRobert Mustacchi 	case X86_PF_AMD_RAVEN_RIDGE:
9971536d92SRobert Mustacchi 	case X86_PF_AMD_PICASSO:
10071536d92SRobert Mustacchi 	case X86_PF_AMD_DALI:
10171536d92SRobert Mustacchi 	case X86_PF_HYGON_DHYANA:
10271536d92SRobert Mustacchi 		return (4);
10371536d92SRobert Mustacchi 	case X86_PF_AMD_ROME:
10471536d92SRobert Mustacchi 	case X86_PF_AMD_RENOIR:
10571536d92SRobert Mustacchi 	case X86_PF_AMD_MATISSE:
10671536d92SRobert Mustacchi 	case X86_PF_AMD_VAN_GOGH:
10771536d92SRobert Mustacchi 	case X86_PF_AMD_MILAN:
10871536d92SRobert Mustacchi 	case X86_PF_AMD_VERMEER:
10971536d92SRobert Mustacchi 	case X86_PF_AMD_CEZANNE:
11071536d92SRobert Mustacchi 	case X86_PF_AMD_MENDOCINO:
11171536d92SRobert Mustacchi 	case X86_PF_AMD_REMBRANDT:
11271536d92SRobert Mustacchi 	case X86_PF_AMD_RAPHAEL:
11371536d92SRobert Mustacchi 	case X86_PF_AMD_PHOENIX:
1145a33fb2dSRobert Mustacchi 	case X86_PF_AMD_GRANITE_RIDGE:
11571536d92SRobert Mustacchi 		return (8);
11671536d92SRobert Mustacchi 	case X86_PF_AMD_GENOA:
11771536d92SRobert Mustacchi 	case X86_PF_AMD_BERGAMO:
11871536d92SRobert Mustacchi 		return (12);
11971536d92SRobert Mustacchi 	case X86_PF_AMD_TURIN:
12071536d92SRobert Mustacchi 	case X86_PF_AMD_DENSE_TURIN:
12171536d92SRobert Mustacchi 		return (16);
1225a33fb2dSRobert Mustacchi 	case X86_PF_AMD_STRIX:
123*92279cb6SRobert Mustacchi 	case X86_PF_AMD_KRACKAN:
12471536d92SRobert Mustacchi 	default:
12571536d92SRobert Mustacchi 		return (0);
12671536d92SRobert Mustacchi 	}
12771536d92SRobert Mustacchi }
12871536d92SRobert Mustacchi 
12971536d92SRobert Mustacchi static inline smn_reg_t
THM_DIE(uint8_t dieno,x86_processor_family_t fam)13071536d92SRobert Mustacchi THM_DIE(uint8_t dieno, x86_processor_family_t fam)
13171536d92SRobert Mustacchi {
13271536d92SRobert Mustacchi 	smn_reg_def_t regdef = { 0 };
13371536d92SRobert Mustacchi 	regdef.srd_unit = SMN_UNIT_SMU_THM;
13471536d92SRobert Mustacchi 	regdef.srd_nents = THM_DIE_MAX_UNITS(fam);
13571536d92SRobert Mustacchi 	ASSERT3U(regdef.srd_nents, !=, 0);
13671536d92SRobert Mustacchi 
13771536d92SRobert Mustacchi 	switch (fam) {
13871536d92SRobert Mustacchi 	case X86_PF_AMD_NAPLES:
13971536d92SRobert Mustacchi 	case X86_PF_AMD_PINNACLE_RIDGE:
14071536d92SRobert Mustacchi 	case X86_PF_AMD_RAVEN_RIDGE:
14171536d92SRobert Mustacchi 	case X86_PF_AMD_PICASSO:
14271536d92SRobert Mustacchi 	case X86_PF_AMD_DALI:
14371536d92SRobert Mustacchi 	case X86_PF_HYGON_DHYANA:
14471536d92SRobert Mustacchi 	case X86_PF_AMD_ROME:
14571536d92SRobert Mustacchi 	case X86_PF_AMD_RENOIR:
14671536d92SRobert Mustacchi 	case X86_PF_AMD_MATISSE:
14771536d92SRobert Mustacchi 	case X86_PF_AMD_VAN_GOGH:
14871536d92SRobert Mustacchi 	case X86_PF_AMD_MILAN:
14971536d92SRobert Mustacchi 	case X86_PF_AMD_VERMEER:
15071536d92SRobert Mustacchi 	case X86_PF_AMD_CEZANNE:
15171536d92SRobert Mustacchi 		regdef.srd_reg = 0x154;
15271536d92SRobert Mustacchi 		break;
15371536d92SRobert Mustacchi 	case X86_PF_AMD_MENDOCINO:
15471536d92SRobert Mustacchi 	case X86_PF_AMD_REMBRANDT:
15571536d92SRobert Mustacchi 	case X86_PF_AMD_GENOA:
15671536d92SRobert Mustacchi 	case X86_PF_AMD_BERGAMO:
15771536d92SRobert Mustacchi 		regdef.srd_reg = 0x300;
15871536d92SRobert Mustacchi 		break;
15971536d92SRobert Mustacchi 	case X86_PF_AMD_RAPHAEL:
16071536d92SRobert Mustacchi 	case X86_PF_AMD_PHOENIX:
1615a33fb2dSRobert Mustacchi 	case X86_PF_AMD_GRANITE_RIDGE:
16271536d92SRobert Mustacchi 		regdef.srd_reg = 0x308;
16371536d92SRobert Mustacchi 		break;
16471536d92SRobert Mustacchi 	case X86_PF_AMD_TURIN:
16571536d92SRobert Mustacchi 	case X86_PF_AMD_DENSE_TURIN:
16671536d92SRobert Mustacchi 		regdef.srd_reg = 0x1f0;
16771536d92SRobert Mustacchi 		break;
168*92279cb6SRobert Mustacchi 	case X86_PF_AMD_STRIX_HALO:
169*92279cb6SRobert Mustacchi 		regdef.srd_reg = 0x78;
170*92279cb6SRobert Mustacchi 		break;
17171536d92SRobert Mustacchi 	default:
17271536d92SRobert Mustacchi 		panic("encountered unknown family 0x%x while constructing "
17371536d92SRobert Mustacchi 		    "SMU::THM::THM_DIEX_TEMP", fam);
17471536d92SRobert Mustacchi 	}
17571536d92SRobert Mustacchi 
17671536d92SRobert Mustacchi 	return (amdzen_smuthm_smn_reg(0, regdef, dieno));
17771536d92SRobert Mustacchi }
17871536d92SRobert Mustacchi #define	THM_DIE_GET_VALID(r)	bitx32(r, 11, 11)
17971536d92SRobert Mustacchi #define	THM_DIE_GET_TEMP(r)	bitx32(r, 10, 0)
18071536d92SRobert Mustacchi 
18171536d92SRobert Mustacchi #ifdef __cplusplus
18271536d92SRobert Mustacchi }
18371536d92SRobert Mustacchi #endif
18471536d92SRobert Mustacchi 
18571536d92SRobert Mustacchi #endif /* _SYS_AMDZEN_THM_H */
186