b7dae28d4a
to work with ipmitools. It works with other tools that have an OpenIPMI driver interface. The port will need to get updated to used this. I have not implemented the IPMB mode yet so ioctl's for that don't really do much otherwise it should work like the OpenIPMI version. The ipmi.h definitions was derived from the ipmitool header file. The bus attachments are done for smbios and pci/smbios. Differences in bus probe order for modules/static are delt with. ACPI attachment should be done. This drivers registers with the watchdod(4) interface Work to do: - BT interface - IPMB mode This has been tested on Dell PE2850, PE2650 & PE850 with i386 & amd64 kernel. I will link this into the build on next week. Tom Rhodes, helped me with the man page. Sponsored by: IronPort Systems Inc. Inspired from: ipmitool & Linux
139 lines
4.6 KiB
C
139 lines
4.6 KiB
C
/*-
|
|
* Copyright (c) 2006 IronPort Systems Inc. <ambrisko@ironport.com>
|
|
* All rights reserved.
|
|
*
|
|
* 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 AUTHOR 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 AUTHOR 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.
|
|
*
|
|
* $FreeBSD$
|
|
*/
|
|
|
|
struct ipmi_get_info {
|
|
int kcs_mode;
|
|
int smic_mode;
|
|
uint64_t address;
|
|
int offset;
|
|
int io_mode;
|
|
};
|
|
|
|
struct ipmi_softc {
|
|
device_t ipmi_dev;
|
|
device_t ipmi_smbios_dev;
|
|
struct cdev *ipmi_dev_t;
|
|
int ipmi_refcnt;
|
|
struct smbios_table_entry *ipmi_smbios;
|
|
struct ipmi_get_info ipmi_bios_info;
|
|
int ipmi_kcs_status_reg;
|
|
int ipmi_kcs_command_reg;
|
|
int ipmi_kcs_data_out_reg;
|
|
int ipmi_kcs_data_in_reg;
|
|
int ipmi_smic_data;
|
|
int ipmi_smic_ctl_sts;
|
|
int ipmi_smic_flags;
|
|
int ipmi_io_rid;
|
|
struct resource * ipmi_io_res;
|
|
int ipmi_mem_rid;
|
|
struct resource * ipmi_mem_res;
|
|
int ipmi_irq_rid;
|
|
struct resource * ipmi_irq_res;
|
|
void *ipmi_irq;
|
|
u_char ipmi_address;
|
|
u_char ipmi_lun;
|
|
int ipmi_busy;
|
|
struct selinfo ipmi_select;
|
|
int ipmi_timestamp;
|
|
int ipmi_requests;
|
|
struct callout_handle ipmi_timeout_handle;
|
|
TAILQ_HEAD(,ipmi_done_list) ipmi_done;
|
|
eventhandler_tag ipmi_ev_tag;
|
|
};
|
|
|
|
struct ipmi_ipmb {
|
|
u_char foo;
|
|
};
|
|
|
|
/* KCS status flags */
|
|
#define KCS_STATUS_OBF 0x01 /* Data Out ready from BMC */
|
|
#define KCS_STATUS_IBF 0x02 /* Data In from System */
|
|
#define KCS_STATUS_SMS_ATN 0x04 /* Ready in RX queue */
|
|
#define KCS_STATUS_C_D 0x08 /* Command/Data register write*/
|
|
#define KCS_STATUS_OEM1 0x10
|
|
#define KCS_STATUS_OEM2 0x20
|
|
#define KCS_STATUS_S0 0x40
|
|
#define KCS_STATUS_S1 0x80
|
|
#define KCS_STATUS_STATE(x) ((x)>>6)
|
|
#define KCS_STATUS_STATE_IDLE 0x0
|
|
#define KCS_STATUS_STATE_READ 0x1
|
|
#define KCS_STATUS_STATE_WRITE 0x2
|
|
#define KCS_STATUS_STATE_ERROR 0x3
|
|
#define KCS_IFACE_STATUS_ABORT 0x01
|
|
#define KCS_IFACE_STATUS_ILLEGAL 0x02
|
|
#define KCS_IFACE_STATUS_LENGTH_ERR 0x06
|
|
|
|
/* KCD control codes */
|
|
#define KCS_CONTROL_GET_STATUS_ABORT 0x60
|
|
#define KCS_CONTROL_WRITE_START 0x61
|
|
#define KCS_CONTROL_WRITE_END 0x62
|
|
#define KCS_DATA_IN_READ 0x68
|
|
|
|
/* SMIC status flags */
|
|
#define SMIC_STATUS_BUSY 0x01 /* System set and BMC clears it */
|
|
#define SMIC_STATUS_SMS_ATN 0x04 /* BMC has a message */
|
|
#define SMIC_STATUS_EVT_ATN 0x08 /* Event has been RX */
|
|
#define SMIC_STATUS_SMI 0x08 /* asserted SMI */
|
|
#define SMIC_STATUS_TX_RDY 0x40 /* Ready to accept WRITE */
|
|
#define SMIC_STATUS_RX_RDY 0x80 /* Ready to read */
|
|
|
|
/* SMIC control codes */
|
|
#define SMIC_CC_SMS_GET_STATUS 0x40
|
|
#define SMIC_CC_SMS_WR_START 0x41
|
|
#define SMIC_CC_SMS_WR_NEXT 0x42
|
|
#define SMIC_CC_SMS_WR_END 0x43
|
|
#define SMIC_CC_SMS_RD_START 0x44
|
|
#define SMIC_CC_SMS_RD_NEXT 0x45
|
|
#define SMIC_CC_SMS_RD_END 0x46
|
|
|
|
/* SMIC status codes */
|
|
#define SMIC_SC_SMS_RDY 0xc0
|
|
#define SMIC_SC_SMS_WR_START 0xc1
|
|
#define SMIC_SC_SMS_WR_NEXT 0xc2
|
|
#define SMIC_SC_SMS_WR_END 0xc3
|
|
#define SMIC_SC_SMS_RD_START 0xc4
|
|
#define SMIC_SC_SMS_RD_NEXT 0xc5
|
|
#define SMIC_SC_SMS_RD_END 0xc6
|
|
|
|
#define RES(x) (x)->ipmi_io_res ? (x)->ipmi_io_res : (x)->ipmi_mem_res
|
|
#define INB(sc, x) bus_space_read_1(rman_get_bustag(RES(sc)), \
|
|
rman_get_bushandle(RES(sc)), (x))
|
|
#define OUTB(sc, x, value) bus_space_write_1(rman_get_bustag(RES(sc)), \
|
|
rman_get_bushandle(RES(sc)), (x), value)
|
|
|
|
int ipmi_attach(device_t);
|
|
int ipmi_detach(device_t);
|
|
int ipmi_smbios_query(device_t);
|
|
int ipmi_smbios_probe(device_t);
|
|
int ipmi_read(device_t, u_char *, int);
|
|
void ipmi_intr(void *);
|
|
|
|
device_t ipmi_smbios_identify (driver_t *driver, device_t parent);
|
|
extern devclass_t ipmi_devclass;
|
|
extern int ipmi_attached;
|