ipmivars.h revision 155517
119304Speter/*-
219304Speter * Copyright (c) 2006 IronPort Systems Inc. <ambrisko@ironport.com>
319304Speter * All rights reserved.
419304Speter *
519304Speter * Redistribution and use in source and binary forms, with or without
619304Speter * modification, are permitted provided that the following conditions
719304Speter * are met:
819304Speter * 1. Redistributions of source code must retain the above copyright
919304Speter *    notice, this list of conditions and the following disclaimer.
1019304Speter * 2. Redistributions in binary form must reproduce the above copyright
1119304Speter *    notice, this list of conditions and the following disclaimer in the
1219304Speter *    documentation and/or other materials provided with the distribution.
1319304Speter *
1419304Speter * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1519304Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1619304Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1719304Speter * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1819304Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1919304Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2019304Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2119304Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2219304Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2319304Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2419304Speter * SUCH DAMAGE.
2519304Speter *
2619304Speter * $FreeBSD: head/sys/dev/ipmi/ipmivars.h 155517 2006-02-10 20:51:35Z ambrisko $
2719304Speter */
2819304Speter
2919304Speterstruct ipmi_get_info {
3019304Speter	int		kcs_mode;
3119304Speter	int		smic_mode;
3219304Speter	uint64_t	address;
3319304Speter	int		offset;
3419304Speter	int		io_mode;
3519304Speter};
3619304Speter
3719304Speterstruct ipmi_softc {
3819304Speter	device_t		ipmi_dev;
3919304Speter	device_t		ipmi_smbios_dev;
4019304Speter	struct cdev		*ipmi_dev_t;
4119304Speter	int			ipmi_refcnt;
4219304Speter	struct smbios_table_entry *ipmi_smbios;
4319304Speter	struct ipmi_get_info	ipmi_bios_info;
4419304Speter	int			ipmi_kcs_status_reg;
4519304Speter	int			ipmi_kcs_command_reg;
4619304Speter	int			ipmi_kcs_data_out_reg;
4719304Speter	int			ipmi_kcs_data_in_reg;
4819304Speter	int			ipmi_smic_data;
4919304Speter	int			ipmi_smic_ctl_sts;
5019304Speter	int			ipmi_smic_flags;
5119304Speter	int			ipmi_io_rid;
52	struct resource	*	ipmi_io_res;
53	int			ipmi_mem_rid;
54	struct resource	*	ipmi_mem_res;
55	int			ipmi_irq_rid;
56	struct resource	*	ipmi_irq_res;
57	void			*ipmi_irq;
58	u_char			ipmi_address;
59	u_char			ipmi_lun;
60	int			ipmi_busy;
61	struct selinfo		ipmi_select;
62	int			ipmi_timestamp;
63	int 			ipmi_requests;
64	struct callout_handle   ipmi_timeout_handle;
65	TAILQ_HEAD(,ipmi_done_list)	ipmi_done;
66	eventhandler_tag	ipmi_ev_tag;
67};
68
69struct ipmi_ipmb {
70	u_char foo;
71};
72
73/* KCS status flags */
74#define KCS_STATUS_OBF			0x01 /* Data Out ready from BMC */
75#define KCS_STATUS_IBF			0x02 /* Data In from System */
76#define KCS_STATUS_SMS_ATN		0x04 /* Ready in RX queue */
77#define KCS_STATUS_C_D			0x08 /* Command/Data register write*/
78#define KCS_STATUS_OEM1			0x10
79#define KCS_STATUS_OEM2			0x20
80#define KCS_STATUS_S0			0x40
81#define KCS_STATUS_S1			0x80
82 #define KCS_STATUS_STATE(x)		((x)>>6)
83 #define KCS_STATUS_STATE_IDLE		0x0
84 #define KCS_STATUS_STATE_READ		0x1
85 #define KCS_STATUS_STATE_WRITE		0x2
86 #define KCS_STATUS_STATE_ERROR		0x3
87#define KCS_IFACE_STATUS_ABORT		0x01
88#define KCS_IFACE_STATUS_ILLEGAL	0x02
89#define KCS_IFACE_STATUS_LENGTH_ERR	0x06
90
91/* KCD control codes */
92#define KCS_CONTROL_GET_STATUS_ABORT	0x60
93#define KCS_CONTROL_WRITE_START		0x61
94#define KCS_CONTROL_WRITE_END		0x62
95#define KCS_DATA_IN_READ		0x68
96
97/* SMIC status flags */
98#define SMIC_STATUS_BUSY		0x01 /* System set and BMC clears it */
99#define SMIC_STATUS_SMS_ATN		0x04 /* BMC has a message */
100#define SMIC_STATUS_EVT_ATN		0x08 /* Event has been RX */
101#define SMIC_STATUS_SMI			0x08 /* asserted SMI */
102#define SMIC_STATUS_TX_RDY		0x40 /* Ready to accept WRITE */
103#define SMIC_STATUS_RX_RDY		0x80 /* Ready to read */
104
105/* SMIC control codes */
106#define SMIC_CC_SMS_GET_STATUS		0x40
107#define SMIC_CC_SMS_WR_START		0x41
108#define SMIC_CC_SMS_WR_NEXT		0x42
109#define SMIC_CC_SMS_WR_END		0x43
110#define SMIC_CC_SMS_RD_START		0x44
111#define SMIC_CC_SMS_RD_NEXT		0x45
112#define SMIC_CC_SMS_RD_END		0x46
113
114/* SMIC status codes */
115#define SMIC_SC_SMS_RDY			0xc0
116#define SMIC_SC_SMS_WR_START		0xc1
117#define SMIC_SC_SMS_WR_NEXT		0xc2
118#define SMIC_SC_SMS_WR_END		0xc3
119#define SMIC_SC_SMS_RD_START		0xc4
120#define SMIC_SC_SMS_RD_NEXT		0xc5
121#define SMIC_SC_SMS_RD_END		0xc6
122
123#define RES(x) (x)->ipmi_io_res ? (x)->ipmi_io_res : (x)->ipmi_mem_res
124#define INB(sc, x) bus_space_read_1(rman_get_bustag(RES(sc)),	\
125    rman_get_bushandle(RES(sc)), (x))
126#define OUTB(sc, x, value) bus_space_write_1(rman_get_bustag(RES(sc)), \
127    rman_get_bushandle(RES(sc)), (x), value)
128
129int ipmi_attach(device_t);
130int ipmi_detach(device_t);
131int ipmi_smbios_query(device_t);
132int ipmi_smbios_probe(device_t);
133int ipmi_read(device_t, u_char *, int);
134void ipmi_intr(void *);
135
136device_t ipmi_smbios_identify (driver_t *driver, device_t parent);
137extern devclass_t ipmi_devclass;
138extern int ipmi_attached;
139