xref: /illumos-gate/usr/src/uts/i86pc/sys/cpu_acpi.h (revision 56b56c0d)
15cff7825Smh /*
25cff7825Smh  * CDDL HEADER START
35cff7825Smh  *
45cff7825Smh  * The contents of this file are subject to the terms of the
55cff7825Smh  * Common Development and Distribution License (the "License").
65cff7825Smh  * You may not use this file except in compliance with the License.
75cff7825Smh  *
85cff7825Smh  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95cff7825Smh  * or http://www.opensolaris.org/os/licensing.
105cff7825Smh  * See the License for the specific language governing permissions
115cff7825Smh  * and limitations under the License.
125cff7825Smh  *
135cff7825Smh  * When distributing Covered Code, include this CDDL HEADER in each
145cff7825Smh  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155cff7825Smh  * If applicable, add the following below this CDDL HEADER, with the
165cff7825Smh  * fields enclosed by brackets "[]" replaced with your own identifying
175cff7825Smh  * information: Portions Copyright [yyyy] [name of copyright owner]
185cff7825Smh  *
195cff7825Smh  * CDDL HEADER END
205cff7825Smh  */
215cff7825Smh /*
220e751525SEric Saxe  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
235cff7825Smh  * Use is subject to license terms.
245cff7825Smh  */
255cff7825Smh 
265cff7825Smh #ifndef	_CPU_ACPI_H
275cff7825Smh #define	_CPU_ACPI_H
285cff7825Smh 
290e751525SEric Saxe #include <sys/cpuvar.h>
305cff7825Smh #include <sys/acpi/acpi.h>
31*aa2aa9a6SDana Myers #include <sys/acpi/accommon.h>
325cff7825Smh #include <sys/acpi/acresrc.h>
335cff7825Smh #include <sys/acpica.h>
345cff7825Smh 
355cff7825Smh #ifdef __cplusplus
365cff7825Smh extern "C" {
375cff7825Smh #endif
385cff7825Smh 
397f606aceSMark Haywood /*
407f606aceSMark Haywood  * P-state related macros
417f606aceSMark Haywood  */
425cff7825Smh #define	CPU_ACPI_PPC(sp)		sp->cs_ppc
435cff7825Smh #define	CPU_ACPI_PSD(sp)		sp->cs_psd
445cff7825Smh #define	CPU_ACPI_PCT(sp)		sp->cs_pct
455cff7825Smh #define	CPU_ACPI_PCT_CTRL(sp)		&sp->cs_pct[0]
465cff7825Smh #define	CPU_ACPI_PCT_STATUS(sp)		&sp->cs_pct[1]
477f606aceSMark Haywood #define	CPU_ACPI_PSTATES(sp)		sp->cs_pstates.ss_states
487f606aceSMark Haywood #define	CPU_ACPI_PSTATES_COUNT(sp)	sp->cs_pstates.ss_count
495cff7825Smh 
505cff7825Smh #define	CPU_ACPI_FREQ(pstate)		pstate->ps_freq
517f606aceSMark Haywood #define	CPU_ACPI_PSTATE_TRANSLAT(pstate) pstate->ps_translat
527f606aceSMark Haywood #define	CPU_ACPI_PSTATE_CTRL(pstate)	pstate->ps_ctrl
537f606aceSMark Haywood 
547f606aceSMark Haywood /*
557f606aceSMark Haywood  * T-state related macros
567f606aceSMark Haywood  */
577f606aceSMark Haywood #define	CPU_ACPI_TPC(sp)		sp->cs_tpc
587f606aceSMark Haywood #define	CPU_ACPI_TSD(sp)		sp->cs_tsd
597f606aceSMark Haywood #define	CPU_ACPI_PTC(sp)		sp->cs_ptc
607f606aceSMark Haywood #define	CPU_ACPI_PTC_CTRL(sp)		&sp->cs_ptc[0]
617f606aceSMark Haywood #define	CPU_ACPI_PTC_STATUS(sp)		&sp->cs_ptc[1]
627f606aceSMark Haywood #define	CPU_ACPI_TSTATES(sp)		sp->cs_tstates.ss_states
637f606aceSMark Haywood #define	CPU_ACPI_TSTATES_COUNT(sp)	sp->cs_tstates.ss_count
647f606aceSMark Haywood 
657f606aceSMark Haywood #define	CPU_ACPI_FREQPER(tstate)	tstate->ts_freqper
667f606aceSMark Haywood #define	CPU_ACPI_TSTATE_TRANSLAT(tstate) tstate->ts_translat
677f606aceSMark Haywood #define	CPU_ACPI_TSTATE_CTRL(tstate)	tstate->ts_ctrl
687f606aceSMark Haywood #define	CPU_ACPI_TSTATE_STAT(tstate)	tstate->ts_state
695cff7825Smh 
700e751525SEric Saxe /*
710e751525SEric Saxe  * C-state realted macros
720e751525SEric Saxe  */
730e751525SEric Saxe #define	CPU_ACPI_CSD(sp)		sp->cs_csd
740e751525SEric Saxe #define	CPU_ACPI_CSTATES(sp)		sp->cs_cstates.ss_states
750e751525SEric Saxe #define	CPU_ACPI_CSTATES_COUNT(sp)	sp->cs_cstates.ss_count
760e751525SEric Saxe 
770e751525SEric Saxe #define	CPU_ACPI_NONE_CACHED		0x0000
780e751525SEric Saxe #define	CPU_ACPI_PCT_CACHED		0x0001
790e751525SEric Saxe #define	CPU_ACPI_PSS_CACHED		0x0002
800e751525SEric Saxe #define	CPU_ACPI_PSD_CACHED		0x0004
810e751525SEric Saxe #define	CPU_ACPI_PPC_CACHED		0x0008
820e751525SEric Saxe #define	CPU_ACPI_PTC_CACHED		0x0010
830e751525SEric Saxe #define	CPU_ACPI_TSS_CACHED		0x0020
840e751525SEric Saxe #define	CPU_ACPI_TSD_CACHED		0x0040
850e751525SEric Saxe #define	CPU_ACPI_TPC_CACHED		0x0080
860e751525SEric Saxe #define	CPU_ACPI_CST_CACHED		0x0100
870e751525SEric Saxe #define	CPU_ACPI_CSD_CACHED		0x0200
885cff7825Smh 
895cff7825Smh #define	CPU_ACPI_IS_OBJ_CACHED(sp, obj)	(sp->cpu_acpi_cached & obj)
905cff7825Smh #define	CPU_ACPI_OBJ_IS_CACHED(sp, obj)	(sp->cpu_acpi_cached |= obj)
915cff7825Smh #define	CPU_ACPI_OBJ_IS_NOT_CACHED(sp, obj) (sp->cpu_acpi_cached &= ~obj)
925cff7825Smh 
937f606aceSMark Haywood #define	CPU_ACPI_PSTATES_SIZE(cnt) (cnt * sizeof (cpu_acpi_pstate_t))
947f606aceSMark Haywood #define	CPU_ACPI_PSS_CNT (sizeof (cpu_acpi_pstate_t) / sizeof (uint32_t))
957f606aceSMark Haywood #define	CPU_ACPI_TSTATES_SIZE(cnt) (cnt * sizeof (cpu_acpi_tstate_t))
967f606aceSMark Haywood #define	CPU_ACPI_TSS_CNT (sizeof (cpu_acpi_tstate_t) / sizeof (uint32_t))
970e751525SEric Saxe #define	CPU_ACPI_CSTATES_SIZE(cnt) (cnt * sizeof (cpu_acpi_cstate_t))
980e751525SEric Saxe #define	CPU_ACPI_CST_CNT (sizeof (cpu_acpi_cstate_t) / sizeof (uint32_t))
995cff7825Smh /*
1007f606aceSMark Haywood  * CPU Domain Coordination Types
1015cff7825Smh  */
1027f606aceSMark Haywood #define	CPU_ACPI_SW_ALL	0xfc
1037f606aceSMark Haywood #define	CPU_ACPI_SW_ANY	0xfd
1047f606aceSMark Haywood #define	CPU_ACPI_HW_ALL	0xfe
1057f606aceSMark Haywood 
1067f606aceSMark Haywood /*
1077f606aceSMark Haywood  * Container for ACPI processor state dependency information
1087f606aceSMark Haywood  */
1097f606aceSMark Haywood typedef struct cpu_acpi_state_dependency
1105cff7825Smh {
1117f606aceSMark Haywood 	uint8_t sd_entries;
1127f606aceSMark Haywood 	uint8_t sd_revision;
1137f606aceSMark Haywood 	uint32_t sd_domain;
1147f606aceSMark Haywood 	uint32_t sd_type;
1157f606aceSMark Haywood 	uint32_t sd_num;
1160e751525SEric Saxe 	uint32_t sd_index;
1177f606aceSMark Haywood } cpu_acpi_state_dependency_t;
1187f606aceSMark Haywood 
1197f606aceSMark Haywood typedef cpu_acpi_state_dependency_t cpu_acpi_psd_t;
1207f606aceSMark Haywood typedef cpu_acpi_state_dependency_t cpu_acpi_tsd_t;
1210e751525SEric Saxe typedef cpu_acpi_state_dependency_t cpu_acpi_csd_t;
1225cff7825Smh 
1235cff7825Smh /*
1247f606aceSMark Haywood  * Container for ACPI processor control register information
1255cff7825Smh  */
1267f606aceSMark Haywood typedef struct cpu_acpi_ctrl_regs
1275cff7825Smh {
1287f606aceSMark Haywood 	uint8_t cr_addrspace_id;
1297f606aceSMark Haywood 	uint8_t cr_width;
1307f606aceSMark Haywood 	uint8_t cr_offset;
1317f606aceSMark Haywood 	uint8_t cr_asize;
1327f606aceSMark Haywood 	ACPI_IO_ADDRESS cr_address;
1337f606aceSMark Haywood } cpu_acpi_ctrl_regs_t;
1347f606aceSMark Haywood 
1357f606aceSMark Haywood typedef cpu_acpi_ctrl_regs_t cpu_acpi_pct_t;
1367f606aceSMark Haywood typedef cpu_acpi_ctrl_regs_t cpu_acpi_ptc_t;
1375cff7825Smh 
1385cff7825Smh /*
1397f606aceSMark Haywood  * Container for ACPI _PSS information
1405cff7825Smh  */
1415cff7825Smh typedef struct cpu_acpi_pstate
1425cff7825Smh {
1435cff7825Smh 	uint32_t ps_freq;
1445cff7825Smh 	uint32_t ps_disp;
1455cff7825Smh 	uint32_t ps_translat;
1465cff7825Smh 	uint32_t ps_buslat;
1475cff7825Smh 	uint32_t ps_ctrl;
1485cff7825Smh 	uint32_t ps_state;
1495cff7825Smh } cpu_acpi_pstate_t;
1505cff7825Smh 
1517f606aceSMark Haywood /*
1527f606aceSMark Haywood  * Container for _TSS information
1537f606aceSMark Haywood  */
1547f606aceSMark Haywood typedef struct cpu_acpi_tstate
1557f606aceSMark Haywood {
1567f606aceSMark Haywood 	uint32_t ts_freqper;
1577f606aceSMark Haywood 	uint32_t ts_disp;
1587f606aceSMark Haywood 	uint32_t ts_translat;
1597f606aceSMark Haywood 	uint32_t ts_ctrl;
1607f606aceSMark Haywood 	uint32_t ts_state;
1617f606aceSMark Haywood 
1627f606aceSMark Haywood } cpu_acpi_tstate_t;
1637f606aceSMark Haywood 
1640e751525SEric Saxe /*
1650e751525SEric Saxe  * Container for _CST information
1660e751525SEric Saxe  */
1670e751525SEric Saxe typedef struct cpu_acpi_cstate
1680e751525SEric Saxe {
1690e751525SEric Saxe 	uint32_t cs_addrspace_id;
1700e751525SEric Saxe 	uint32_t cs_address;
1710e751525SEric Saxe 	uint32_t cs_type;
1720e751525SEric Saxe 	uint32_t cs_latency;
1730e751525SEric Saxe 	uint32_t cs_power;
1740e751525SEric Saxe 	kstat_t	*cs_ksp;
1750e751525SEric Saxe } cpu_acpi_cstate_t;
1760e751525SEric Saxe 
1777f606aceSMark Haywood typedef struct cpu_acpi_supported_states {
1787f606aceSMark Haywood 	void *ss_states;
1797f606aceSMark Haywood 	uint32_t ss_count;
1807f606aceSMark Haywood } cpu_acpi_supported_states_t;
1815cff7825Smh 
1827f606aceSMark Haywood typedef cpu_acpi_supported_states_t cpu_acpi_pstates_t;
1837f606aceSMark Haywood typedef cpu_acpi_supported_states_t cpu_acpi_tstates_t;
1840e751525SEric Saxe typedef cpu_acpi_supported_states_t cpu_acpi_cstates_t;
1857f606aceSMark Haywood 
1867f606aceSMark Haywood typedef int cpu_acpi_present_capabilities_t;
1875cff7825Smh typedef int cpu_acpi_ppc_t;
1887f606aceSMark Haywood typedef int cpu_acpi_tpc_t;
1895cff7825Smh 
1905cff7825Smh /*
1915cff7825Smh  * Container for cached ACPI data.
1925cff7825Smh  */
1935cff7825Smh typedef struct cpu_acpi_state {
1945cff7825Smh 	ACPI_HANDLE cs_handle;
1950e751525SEric Saxe 	int cs_id;
1965cff7825Smh 	uint_t cpu_acpi_cached;
1977f606aceSMark Haywood 	cpu_acpi_pstates_t cs_pstates;
1985cff7825Smh 	cpu_acpi_pct_t cs_pct[2];
1995cff7825Smh 	cpu_acpi_psd_t cs_psd;
2005cff7825Smh 	cpu_acpi_ppc_t cs_ppc;
2017f606aceSMark Haywood 	cpu_acpi_tstates_t cs_tstates;
2027f606aceSMark Haywood 	cpu_acpi_ptc_t cs_ptc[2];
2037f606aceSMark Haywood 	cpu_acpi_tsd_t cs_tsd;
2047f606aceSMark Haywood 	cpu_acpi_tpc_t cs_tpc;
2050e751525SEric Saxe 	cpu_acpi_cstates_t cs_cstates;
2060e751525SEric Saxe 	cpu_acpi_csd_t cs_csd;
2075cff7825Smh } cpu_acpi_state_t;
2085cff7825Smh 
2095cff7825Smh typedef cpu_acpi_state_t *cpu_acpi_handle_t;
2105cff7825Smh 
2115cff7825Smh extern void cpu_acpi_cache_ppc(cpu_acpi_handle_t);
2127f606aceSMark Haywood extern void cpu_acpi_cache_tpc(cpu_acpi_handle_t);
2137f606aceSMark Haywood extern int cpu_acpi_cache_pstate_data(cpu_acpi_handle_t);
2147f606aceSMark Haywood extern void cpu_acpi_free_pstate_data(cpu_acpi_handle_t);
2157f606aceSMark Haywood extern int cpu_acpi_cache_tstate_data(cpu_acpi_handle_t);
2167f606aceSMark Haywood extern void cpu_acpi_free_tstate_data(cpu_acpi_handle_t);
2170e751525SEric Saxe extern int cpu_acpi_cache_cstate_data(cpu_acpi_handle_t);
2180e751525SEric Saxe extern void cpu_acpi_free_cstate_data(cpu_acpi_handle_t);
2197f606aceSMark Haywood extern void cpu_acpi_install_notify_handler(cpu_acpi_handle_t,
2200e751525SEric Saxe     ACPI_NOTIFY_HANDLER, void *);
2210e751525SEric Saxe extern void cpu_acpi_remove_notify_handler(cpu_acpi_handle_t,
2220e751525SEric Saxe     ACPI_NOTIFY_HANDLER);
2235cff7825Smh extern int cpu_acpi_write_pdc(cpu_acpi_handle_t, uint32_t, uint32_t,
2245cff7825Smh     uint32_t *);
2255cff7825Smh extern int cpu_acpi_write_port(ACPI_IO_ADDRESS, uint32_t, uint32_t);
2265cff7825Smh extern int cpu_acpi_read_port(ACPI_IO_ADDRESS, uint32_t *, uint32_t);
2270e751525SEric Saxe extern void cpu_acpi_set_register(uint32_t, uint32_t);
2280e751525SEric Saxe extern void cpu_acpi_get_register(uint32_t, uint32_t *);
2295cff7825Smh extern uint_t cpu_acpi_get_speeds(cpu_acpi_handle_t, int **);
2300e751525SEric Saxe extern uint_t cpu_acpi_get_max_cstates(cpu_acpi_handle_t);
2315cff7825Smh extern void cpu_acpi_free_speeds(int *, uint_t);
2320e751525SEric Saxe extern cpu_acpi_handle_t cpu_acpi_init(cpu_t *);
2337f606aceSMark Haywood extern void cpu_acpi_fini(cpu_acpi_handle_t);
2345cff7825Smh 
2355cff7825Smh #ifdef __cplusplus
2365cff7825Smh }
2375cff7825Smh #endif
2385cff7825Smh 
2395cff7825Smh #endif	/* _CPU_ACPI_H */
240