summaryrefslogtreecommitdiff
path: root/sys/dev/ic/i82801lpcreg.h
blob: 1684d4e5e1464dd4d426c035ba4c125173929069 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
/*	$NetBSD: i82801lpcreg.h,v 1.17 2023/04/12 06:39:15 riastradh Exp $	*/

/*-
 * Copyright (c) 2004 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Minoura Makoto.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

/*
 * Intel 82801 Series I/O Controller Hub (ICH) -- LPC Interface Bridge part
 *   register definitions.
 */

#ifndef _DEV_IC_I82801LPCREG_H_
#define _DEV_IC_I82801LPCREG_H_
/*
 * PCI configuration registers
 */
#define LPCIB_PCI_PMBASE	0x40
#define LPCIB_PCI_PM_SIZE	0x00000080
#define LPCIB_PCI_ACPI_CNTL	0x44
# define LPCIB_PCI_ACPI_CNTL_EN	(1 << 4)
/* GPIO config registers ICH6+ */
#define LPCIB_PCI_GPIO_BASE_ICH6	0x48
#define LPCIB_PCI_GPIO_CNTL_ICH6	0x4c
#define LPCIB_PCI_BIOS_CNTL	0x4c /* actually 0x4e */
#define LPCIB_PCI_BIOS_CNTL_BWE	(0x0001 << 16) /* write enable */
#define LPCIB_PCI_BIOS_CNTL_BLE	(0x0002 << 16) /* lock enable */
#define LPCIB_PCI_TCO_CNTL	0x54
/* GPIO config registers ICH0-ICH5 */
#define LPCIB_PCI_GPIO_BASE	0x58
#define LPCIB_PCI_GPIO_SIZE	0x00000080
#define LPCIB_PCI_GPIO_CNTL	0x5c
#define LPCIB_PCI_GPIO_CNTL_EN	(1 << 4)
#define LPCIB_PCI_PIRQA_ROUT	0x60
#define LPCIB_PCI_PIRQB_ROUT	0x61
#define LPCIB_PCI_PIRQC_ROUT	0x62
#define LPCIB_PCI_PIRQD_ROUT	0x63
#define LPCIB_PCI_SIRQ_CNTL	0x64
#define LPCIB_PCI_PIRQE_ROUT	0x68
#define LPCIB_PCI_PIRQF_ROUT	0x69
#define LPCIB_PCI_PIRQG_ROUT	0x6a
#define LPCIB_PCI_PIRQH_ROUT	0x6b
#define LPCIB_PCI_D31_ERR_CFG	0x88
#define LPCIB_PCI_D31_ERR_STS	0x8a
#define LPCIB_PCI_PCI_DMA_C	0x90
#define LPCIB_PCI_GEN_PMCON_1	0xa0
# define LPCIB_PCI_GEN_PMCON_1_SS_EN	0x08
#define LPCIB_PCI_GEN_PMCON_2	0xa2
#define LPCIB_PCI_GEN_PMCON_3	0xa4
#define LPCIB_PCI_STPCLK_DEL	0xa8
#define LPCIB_PCI_GPI_ROUT	0xb8
#define LPCIB_PCI_TRP_FWD_EN	0xc0
#define LPCIB_PCI_MON4_TRP_RNG	0xc4
#define LPCIB_PCI_MON5_TRP_RNG	0xc5
#define LPCIB_PCI_MON6_TRP_RNG	0xc6
#define LPCIB_PCI_MON7_TRP_RNG	0xc7
#define LPCIB_PCI_MON_TRP_MSK	0xcc
#define LPCIB_PCI_GEN_CNTL	0xd0
#define	LPCIB_ICH5_HPTC_EN		0x00020000
#define	LPCIB_ICH5_HPTC_WIN_MASK	0x0000c000
#define	LPCIB_ICH5_HPTC_0000		0x00000000
#define	LPCIB_ICH5_HPTC_0000_BASE	0xfed00000
#define	LPCIB_ICH5_HPTC_1000		0x00008000
#define	LPCIB_ICH5_HPTC_1000_BASE	0xfed01000
#define	LPCIB_ICH5_HPTC_2000		0x00010000
#define	LPCIB_ICH5_HPTC_2000_BASE	0xfed02000
#define	LPCIB_ICH5_HPTC_3000		0x00018000
#define	LPCIB_ICH5_HPTC_3000_BASE	0xfed03000
#define LPCIB_PCI_GEN_STA	0xd4
# define LPCIB_PCI_GEN_STA_SAFE_MODE	(1 << 2)
# define LPCIB_PCI_GEN_STA_NO_REBOOT	(1 << 1)
#define LPCIB_PCI_BACK_CNTL	0xd5
#define LPCIB_PCI_RTC_CONF	0xd8
#define LPCIB_PCI_COM_DEC	0xe0
#define LPCIB_PCI_LPCFDD_DEC	0xe1
#define LPCIB_PCI_SND_DEC	0xe2
#define LPCIB_PCI_FWH_DEC_EN1	0xe3
#define LPCIB_PCI_GEN1_DEC	0xe4
#define LPCIB_PCI_LPC_EN	0xe6
#define LPCIB_PCI_FWH_SEL1	0xe8
#define LPCIB_PCI_GEN2_DEC	0xec
#define LPCIB_PCI_FWH_SEL2	0xee
#define LPCIB_PCI_FWH_DEC_EN2	0xf0
#define LPCIB_PCI_FUNC_DIS	0xf2

/*
 * Power management I/O registers
 *  (offset from PMBASE)
 */
#define PMC_PM1_STS		0x00 /* ACPI PM1a_EVT_BLK fixed event status */
#define PMC_PM1_EN		0x02 /* ACPI PM1a_EVT_BLK fixed event enable */
#define PMC_PM1_CNT		0x04 /* ACPI PM1a_CNT_BLK */
#define PMC_PM1_TMR		0x08 /* ACPI PMTMR_BLK power mgmt timer */
#define PMC_PROC_CNT		0x10 /* ACPI P_BLK processor control */
#define PMC_LV2			0x14 /* ACPI P_BLK processor C2 control */
#define PMC_PM_CTRL		0x20 /* ACPI Power Management Control */
# define PMC_PM_SS_STATE_LOW		0x01 /* SpeedStep Low Power State */
#define PMC_GPE0_STS		0x28 /* ACPI GPE0_BLK GPE0 status */
#define PMC_GPE0_EN		0x2c /* ACPI GPE0_BLK GPE0 enable */
#define PMC_SMI_EN		0x30
# define PMC_SMI_EN_INTEL_USB2_EN	(1 << 18)
# define PMC_SMI_EN_LEGACY_USB2_EN	(1 << 17)
# define PMC_SMI_EN_PERIODIC_EN		(1 << 14)
# define PMC_SMI_EN_TCO_EN		(1 << 13)
# define PMC_SMI_EN_MCSMI_EN		(1 << 11)
# define PMC_SMI_EN_BIOS_RLS		(1 << 7)
# define PMC_SMI_EN_SWSMI_TMR_EN	(1 << 6)
# define PMC_SMI_EN_APMC_EN		(1 << 5)
# define PMC_SMI_EN_SLP_SMI_EN		(1 << 4)
# define PMC_SMI_EN_LEGACY_USB_EN	(1 << 3)
# define PMC_SMI_EN_BIOS_EN		(1 << 2)
# define PMC_SMI_EN_EOS			(1 << 1)
# define PMC_SMI_EN_GBL_SMI_EN		(1 << 0)
#define PMC_SMI_STS		0x34
#define PMC_ALT_GP_SMI_EN	0x38
#define PMC_ALT_GP_SMI_STS	0x3a
#define PMC_MON_SMI		0x40
#define PMC_DEVACT_STS		0x44
#define PMC_DEVTRAP_EN		0x48
#define PMC_BUS_ADDR_TRACK	0x4c
#define PMC_BUS_CYC_TRACK	0x4e
#define PMC_PM_SS_CNTL		0x50		/* SpeedStep control */
# define PMC_PM_SS_CNTL_ARB_DIS		0x01	/* disable arbiter */
#define PMC_TCO_BASE		0x60

/*
 * General Purpose I/O Registers
 *  (offset from GPIO_BASE)
 */
#define LPCIB_GPIO_GPIO_USE_SEL		0x00
#define LPCIB_GPIO_GP_IO_SEL		0x04
#define LPCIB_GPIO_GP_LVL		0x0c
#define LPCIB_GPIO_GPO_TTL		0x14
#define LPCIB_GPIO_GPO_BLINK		0x18
#define LPCIB_GPIO_GPI_INV		0x2c
#define LPCIB_GPIO_GPIO_USE_SEL2	0x30
#define LPCIB_GPIO_GP_IO_SEL2		0x34
#define LPCIB_GPIO_GP_LVL2		0x38

/*
 * SMBus controller registers.
 */

/* PCI configuration registers */
#define SMB_BASE	0x20		/* SMBus base address */
#define SMB_HOSTC	0x40		/* host configuration */
#define SMB_HOSTC_HSTEN		(1 << 0)	/* enable host controller */
#define SMB_HOSTC_SMIEN		(1 << 1)	/* generate SMI */
#define SMB_HOSTC_I2CEN		(1 << 2)	/* enable I2C commands */
#define SMB_TCOBASE	0x50		/* TCO Base Address */
#define  SMB_TCOBASE_TCOBA	__BITS(15,5)	/* TCO Base Address */
#define  SMB_TCOBASE_IOS	__BIT(0)	/* I/O Space */
#define SMB_TCOCTL	0x54		/* TCO Control */
#define  SMB_TCOCTL_TCO_BASE_EN	__BIT(8)	/* TCO Base Enable */

/* SMBus I/O registers */
#define SMB_HS		0x00		/* host status */
#define SMB_HS_BUSY		(1 << 0)	/* running a command */
#define SMB_HS_INTR		(1 << 1)	/* command completed */
#define SMB_HS_DEVERR		(1 << 2)	/* command error */
#define SMB_HS_BUSERR		(1 << 3)	/* transaction collision */
#define SMB_HS_FAILED		(1 << 4)	/* failed bus transaction */
#define SMB_HS_SMBAL		(1 << 5)	/* SMBALERT# asserted */
#define SMB_HS_INUSE		(1 << 6)	/* bus semaphore */
#define SMB_HS_BDONE		(1 << 7)	/* byte received/transmitted */
#define SMB_HS_BITS		"\020\001BUSY\002INTR\003DEVERR\004BUSERR\005FAILED\006SMBAL\007INUSE\010BDONE"
#define SMB_HC		0x02		/* host control */
#define SMB_HC_INTREN		(1 << 0)	/* enable interrupts */
#define SMB_HC_KILL		(1 << 1)	/* kill current transaction */
#define SMB_HC_CMD_QUICK	(0 << 2)	/* QUICK command */
#define SMB_HC_CMD_BYTE		(1 << 2)	/* BYTE command */
#define SMB_HC_CMD_BDATA	(2 << 2)	/* BYTE DATA command */
#define SMB_HC_CMD_WDATA	(3 << 2)	/* WORD DATA command */
#define SMB_HC_CMD_PCALL	(4 << 2)	/* PROCESS CALL command */
#define SMB_HC_CMD_BLOCK	(5 << 2)	/* BLOCK command */
#define SMB_HC_CMD_I2CREAD	(6 << 2)	/* I2C READ command */
#define SMB_HC_CMD_BLOCKP	(7 << 2)	/* BLOCK PROCESS command */
#define SMB_HC_LASTB		(1 << 5)	/* last byte in block */
#define SMB_HC_START		(1 << 6)	/* start transaction */
#define SMB_HC_PECEN		(1 << 7)	/* enable PEC */
#define SMB_HCMD	0x03		/* host command */
#define SMB_TXSLVA	0x04		/* transmit slave address */
#define SMB_TXSLVA_READ		(1 << 0)	/* read direction */
#define SMB_TXSLVA_ADDR(x)	(((x) & 0x7f) << 1) /* 7-bit address */
#define SMB_HD0		0x05		/* host data 0 */
#define SMB_HD1		0x06		/* host data 1 */
#define SMB_HBDB	0x07		/* host block data byte */
#define SMB_PEC		0x08		/* PEC data */
#define SMB_RXSLVA	0x09		/* receive slave address */
#define SMB_SD		0x0a		/* receive slave data */
#define SMB_SD_MSG0(x)		((x) & 0xff)	/* data message byte 0 */
#define SMB_SD_MSG1(x)		((x) >> 8)	/* data message byte 1 */
#define SMB_AS		0x0c		/* auxiliary status */
#define SMB_AS_CRCE		(1 << 0)	/* CRC error */
#define SMB_AS_TCO		(1 << 1)	/* advanced TCO mode */
#define SMB_AC		0x0d		/* auxiliary control */
#define SMB_AC_AAC		(1 << 0)	/* automatically append CRC */
#define SMB_AC_E32B		(1 << 1)	/* enable 32-byte buffer */
#define SMB_SMLPC	0x0e		/* SMLink pin control */
#define SMB_SMLPC_LINK0		(1 << 0)	/* SMLINK0 pin state */
#define SMB_SMLPC_LINK1		(1 << 1)	/* SMLINK1 pin state */
#define SMB_SMLPC_CLKC		(1 << 2)	/* SMLINK0 pin is untouched */
#define SMB_SMBPC	0x0f		/* SMBus pin control */
#define SMB_SMBPC_CLK		(1 << 0)	/* SMBCLK pin state */
#define SMB_SMBPC_DATA		(1 << 1)	/* SMBDATA pin state */
#define SMB_SMBPC_CLKC		(1 << 2)	/* SMBCLK pin is untouched */
#define SMB_SS		0x10		/* slave status */
#define SMB_SS_HN		(1 << 0)	/* Host Notify command */
#define SMB_SCMD	0x11		/* slave command */
#define SMB_SCMD_INTREN		(1 << 0)	/* enable interrupts on HN */
#define SMB_SCMD_WKEN		(1 << 1)	/* wake on HN */
#define SMB_SCMD_SMBALDS	(1 << 2)	/* disable SMBALERT# intr */
#define SMB_NDADDR	0x14		/* notify device address */
#define SMB_NDADDR_ADDR(x)	((x) >> 1)	/* 7-bit address */
#define SMB_NDLOW	0x16		/* notify data low byte */
#define SMB_NDHIGH	0x17		/* notify data high byte */

/* ICH Chipset Configuration Registers (ICH6 and newer) */
#define LPCIB_RCBA		0xf0
#define LPCIB_RCBA_EN		0x00000001
#define	LPCIB_RCBA_SIZE		0x00004000
#define LPCIB_GCS_OFFSET		0x3410
#define LPCIB_GCS_NO_REBOOT		0x20
#define	LPCIB_RCBA_HPTC			0x00003404
#define	LPCIB_RCBA_HPTC_EN		0x00000080
#define	LPCIB_RCBA_HPTC_WIN_MASK	0x00000003
#define	LPCIB_RCBA_HPTC_0000		0x00000000
#define	LPCIB_RCBA_HPTC_0000_BASE	0xfed00000
#define	LPCIB_RCBA_HPTC_1000		0x00000001
#define	LPCIB_RCBA_HPTC_1000_BASE	0xfed01000
#define	LPCIB_RCBA_HPTC_2000		0x00000002
#define	LPCIB_RCBA_HPTC_2000_BASE	0xfed02000
#define	LPCIB_RCBA_HPTC_3000		0x00000003
#define	LPCIB_RCBA_HPTC_3000_BASE	0xfed03000

/*
 * System management TCO registers
 */
#define TCO_RLD			0x00
#define TCO_TMR			0x01 /* ICH5 and older */
# define TCO_TMR_MASK 		0x3f
#define TCO_DAT_IN		0x02
#define TCO_DAT_OUT		0x03
#define TCO1_STS		0x04
# define TCO1_STS_TIMEOUT 		0x08
#define TCO2_STS		0x06
# define TCO2_STS_BOOT_STS 		0x04
# define TCO2_STS_SECONDS_TO_STS 	0x02
#define TCO1_CNT		0x08
# define TCO1_CNT_TCO_LOCK 		(1 << 12)
# define TCO1_CNT_TCO_TMR_HLT		(1 << 11)
# define TCO1_CNT_SEND_NOW		(1 << 10)
# define TCO1_CNT_NMI2SMI_EN		(1 << 9)
# define TCO1_CNT_NMI_NOW		(1 << 8)
#define TCO2_CNT		0x0a
#define TCO_MESSAGE1		0x0c
#define TCO_MESSAGE2		0x0d
#define TCO_WDSTATUS		0x0e
#define TCO_SW_IRQ_GEN		0x10
#define TCO_TMR2		0x12 /* ICH6 and newer */
#define	TCO_REGSIZE		0x20

/*
 * TCO timer tick.  ICH datasheets say:
 *  - The timer is clocked at approximately 0.6 seconds
 *  - 6 bit; values of 0-3 will be ignored and should not be attempted
 */
static __inline int
tcotimer_tick_to_second(int ltick)
{
	return ltick * 6 / 10;
}

static __inline int
tcotimer_second_to_tick(int ltick)
{
	return ltick * 10 / 6;
}

#define TCOTIMER_MIN_TICK 	4
#define TCOTIMER2_MIN_TICK	2
#define TCOTIMER_MAX_TICK 	0x3f 	/* 39 seconds max */
#define TCOTIMER2_MAX_TICK 	0x265	/* 613 seconds max */

/*
 * P2SB: Primary to Sideband Bridge, PCI configuration registers
 */
#define	P2SB_SBREG_BAR		0x10	/* Sideband Register Access BAR */
#define	P2SB_SBREG_BARH		0x14	/* Sideband BAR High DWORD */
#define	P2SB_P2SBC		0xe0	/* P2SB Control */
#define	 P2SB_P2SBC_HIDE	__BIT(8)	/* Hide Device */

/*
 * PCH Private Configuration Space -- Sideband
 */
#define	SB_PORTID		__BITS(23,16)
#define	 SB_PORTID_SMBUS		0xc6

#define	SB_PORT(id)		__SHIFTIN(id, SB_PORTID)

#define	SB_SMBUS_BASE		(SB_PORT(SB_PORTID_SMBUS) + 0x00)
#define	SB_SMBUS_SIZE		0x14

#define	SB_SMBUS_TCOCFG		0x00	/* TCO Configuration */
#define	 SB_SMBUS_TCOCFG_IE	__BIT(7)	/* TCO IRQ Enable */
#define	 SB_SMBUS_TCOCFG_IS	__BITS(2,0)	/* TCO IRQ Select */
#define	 SB_SMBUS_TCOCFG_IS_IRQ9	0	/* maps to 8259 and APIC */
#define	 SB_SMBUS_TCOCFG_IS_IRQ10	1	/* maps to 8259 and APIC */
#define	 SB_SMBUS_TCOCFG_IS_IRQ11	2	/* maps to 8259 and APIC */
#define	 SB_SMBUS_TCOCFG_IS_IRQ20	4	/* maps to APIC */
#define	 SB_SMBUS_TCOCFG_IS_IRQ21	3	/* maps to APIC */
#define	 SB_SMBUS_TCOCFG_IS_IRQ22	4	/* maps to APIC */
#define	 SB_SMBUS_TCOCFG_IS_IRQ23	5	/* maps to APIC */
#define	SB_SMBUS_GC		0x0c	/* General Control */
#define	 SB_SMBUS_GC_NR		__BIT(1)	/* No Reboot */
#define	 SB_SMBUS_GC_FD		__BIT(0)	/* Function Disable */
#define	SB_SMBUS_PCE		0x10	/* Power Control Enable */
#define	 SB_SMBUS_PCE_SE	__BIT(3)	/* Sleep Enable */
#define	 SB_SMBUS_PCE_D3HE	__BIT(2)	/* D3-Hot Enable */
#define	 SB_SMBUS_PCE_I3E	__BIT(1)	/* I3 Enable */
#define	 SB_SMBUS_PCE_PMCRE	__BIT(0)	/* PMC Request Enable */

#endif /*  _DEV_IC_I82801LPCREG_H_ */