xref: /qemu/include/hw/ipmi/ipmi.h (revision 23076bb34b049f5908fefae19266d3f25f55fd3e)
1*23076bb3SCorey Minyard /*
2*23076bb3SCorey Minyard  * IPMI base class
3*23076bb3SCorey Minyard  *
4*23076bb3SCorey Minyard  * Copyright (c) 2015 Corey Minyard, MontaVista Software, LLC
5*23076bb3SCorey Minyard  *
6*23076bb3SCorey Minyard  * Permission is hereby granted, free of charge, to any person obtaining a copy
7*23076bb3SCorey Minyard  * of this software and associated documentation files (the "Software"), to deal
8*23076bb3SCorey Minyard  * in the Software without restriction, including without limitation the rights
9*23076bb3SCorey Minyard  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10*23076bb3SCorey Minyard  * copies of the Software, and to permit persons to whom the Software is
11*23076bb3SCorey Minyard  * furnished to do so, subject to the following conditions:
12*23076bb3SCorey Minyard  *
13*23076bb3SCorey Minyard  * The above copyright notice and this permission notice shall be included in
14*23076bb3SCorey Minyard  * all copies or substantial portions of the Software.
15*23076bb3SCorey Minyard  *
16*23076bb3SCorey Minyard  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*23076bb3SCorey Minyard  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*23076bb3SCorey Minyard  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19*23076bb3SCorey Minyard  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*23076bb3SCorey Minyard  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21*23076bb3SCorey Minyard  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22*23076bb3SCorey Minyard  * THE SOFTWARE.
23*23076bb3SCorey Minyard  */
24*23076bb3SCorey Minyard 
25*23076bb3SCorey Minyard #ifndef HW_IPMI_H
26*23076bb3SCorey Minyard #define HW_IPMI_H
27*23076bb3SCorey Minyard 
28*23076bb3SCorey Minyard #include "exec/memory.h"
29*23076bb3SCorey Minyard #include "qemu-common.h"
30*23076bb3SCorey Minyard #include "hw/qdev.h"
31*23076bb3SCorey Minyard 
32*23076bb3SCorey Minyard #define MAX_IPMI_MSG_SIZE 300
33*23076bb3SCorey Minyard 
34*23076bb3SCorey Minyard enum ipmi_op {
35*23076bb3SCorey Minyard     IPMI_RESET_CHASSIS,
36*23076bb3SCorey Minyard     IPMI_POWEROFF_CHASSIS,
37*23076bb3SCorey Minyard     IPMI_POWERON_CHASSIS,
38*23076bb3SCorey Minyard     IPMI_POWERCYCLE_CHASSIS,
39*23076bb3SCorey Minyard     IPMI_PULSE_DIAG_IRQ,
40*23076bb3SCorey Minyard     IPMI_SHUTDOWN_VIA_ACPI_OVERTEMP,
41*23076bb3SCorey Minyard     IPMI_SEND_NMI
42*23076bb3SCorey Minyard };
43*23076bb3SCorey Minyard 
44*23076bb3SCorey Minyard #define IPMI_CC_INVALID_CMD                              0xc1
45*23076bb3SCorey Minyard #define IPMI_CC_COMMAND_INVALID_FOR_LUN                  0xc2
46*23076bb3SCorey Minyard #define IPMI_CC_TIMEOUT                                  0xc3
47*23076bb3SCorey Minyard #define IPMI_CC_OUT_OF_SPACE                             0xc4
48*23076bb3SCorey Minyard #define IPMI_CC_INVALID_RESERVATION                      0xc5
49*23076bb3SCorey Minyard #define IPMI_CC_REQUEST_DATA_TRUNCATED                   0xc6
50*23076bb3SCorey Minyard #define IPMI_CC_REQUEST_DATA_LENGTH_INVALID              0xc7
51*23076bb3SCorey Minyard #define IPMI_CC_PARM_OUT_OF_RANGE                        0xc9
52*23076bb3SCorey Minyard #define IPMI_CC_CANNOT_RETURN_REQ_NUM_BYTES              0xca
53*23076bb3SCorey Minyard #define IPMI_CC_REQ_ENTRY_NOT_PRESENT                    0xcb
54*23076bb3SCorey Minyard #define IPMI_CC_INVALID_DATA_FIELD                       0xcc
55*23076bb3SCorey Minyard #define IPMI_CC_BMC_INIT_IN_PROGRESS                     0xd2
56*23076bb3SCorey Minyard #define IPMI_CC_COMMAND_NOT_SUPPORTED                    0xd5
57*23076bb3SCorey Minyard 
58*23076bb3SCorey Minyard #define IPMI_NETFN_APP                0x06
59*23076bb3SCorey Minyard 
60*23076bb3SCorey Minyard #define IPMI_DEBUG 1
61*23076bb3SCorey Minyard 
62*23076bb3SCorey Minyard /* Specified in the SMBIOS spec. */
63*23076bb3SCorey Minyard #define IPMI_SMBIOS_KCS         0x01
64*23076bb3SCorey Minyard #define IPMI_SMBIOS_SMIC        0x02
65*23076bb3SCorey Minyard #define IPMI_SMBIOS_BT          0x03
66*23076bb3SCorey Minyard #define IPMI_SMBIOS_SSIF        0x04
67*23076bb3SCorey Minyard 
68*23076bb3SCorey Minyard /* IPMI Interface types (KCS, SMIC, BT) are prefixed with this */
69*23076bb3SCorey Minyard #define TYPE_IPMI_INTERFACE_PREFIX "ipmi-interface-"
70*23076bb3SCorey Minyard 
71*23076bb3SCorey Minyard /*
72*23076bb3SCorey Minyard  * An IPMI Interface, the interface for talking between the target
73*23076bb3SCorey Minyard  * and the BMC.
74*23076bb3SCorey Minyard  */
75*23076bb3SCorey Minyard #define TYPE_IPMI_INTERFACE "ipmi-interface"
76*23076bb3SCorey Minyard #define IPMI_INTERFACE(obj) \
77*23076bb3SCorey Minyard      INTERFACE_CHECK(IPMIInterface, (obj), TYPE_IPMI_INTERFACE)
78*23076bb3SCorey Minyard #define IPMI_INTERFACE_CLASS(class) \
79*23076bb3SCorey Minyard      OBJECT_CLASS_CHECK(IPMIInterfaceClass, (class), TYPE_IPMI_INTERFACE)
80*23076bb3SCorey Minyard #define IPMI_INTERFACE_GET_CLASS(class) \
81*23076bb3SCorey Minyard      OBJECT_GET_CLASS(IPMIInterfaceClass, (class), TYPE_IPMI_INTERFACE)
82*23076bb3SCorey Minyard 
83*23076bb3SCorey Minyard typedef struct IPMIInterface {
84*23076bb3SCorey Minyard     Object parent;
85*23076bb3SCorey Minyard } IPMIInterface;
86*23076bb3SCorey Minyard 
87*23076bb3SCorey Minyard typedef struct IPMIInterfaceClass {
88*23076bb3SCorey Minyard     InterfaceClass parent;
89*23076bb3SCorey Minyard 
90*23076bb3SCorey Minyard     void (*init)(struct IPMIInterface *s, Error **errp);
91*23076bb3SCorey Minyard 
92*23076bb3SCorey Minyard     /*
93*23076bb3SCorey Minyard      * Perform various operations on the hardware.  If checkonly is
94*23076bb3SCorey Minyard      * true, it will return if the operation can be performed, but it
95*23076bb3SCorey Minyard      * will not do the operation.
96*23076bb3SCorey Minyard      */
97*23076bb3SCorey Minyard     int (*do_hw_op)(struct IPMIInterface *s, enum ipmi_op op, int checkonly);
98*23076bb3SCorey Minyard 
99*23076bb3SCorey Minyard     /*
100*23076bb3SCorey Minyard      * Enable/disable irqs on the interface when the BMC requests this.
101*23076bb3SCorey Minyard      */
102*23076bb3SCorey Minyard     void (*set_irq_enable)(struct IPMIInterface *s, int val);
103*23076bb3SCorey Minyard 
104*23076bb3SCorey Minyard     /*
105*23076bb3SCorey Minyard      * Handle an event that occurred on the interface, generally the.
106*23076bb3SCorey Minyard      * target writing to a register.
107*23076bb3SCorey Minyard      */
108*23076bb3SCorey Minyard     void (*handle_if_event)(struct IPMIInterface *s);
109*23076bb3SCorey Minyard 
110*23076bb3SCorey Minyard     /*
111*23076bb3SCorey Minyard      * The interfaces use this to perform certain ops
112*23076bb3SCorey Minyard      */
113*23076bb3SCorey Minyard     void (*set_atn)(struct IPMIInterface *s, int val, int irq);
114*23076bb3SCorey Minyard 
115*23076bb3SCorey Minyard     /*
116*23076bb3SCorey Minyard      * Got an IPMI warm/cold reset.
117*23076bb3SCorey Minyard      */
118*23076bb3SCorey Minyard     void (*reset)(struct IPMIInterface *s, bool is_cold);
119*23076bb3SCorey Minyard 
120*23076bb3SCorey Minyard     /*
121*23076bb3SCorey Minyard      * Handle a response from the bmc.
122*23076bb3SCorey Minyard      */
123*23076bb3SCorey Minyard     void (*handle_rsp)(struct IPMIInterface *s, uint8_t msg_id,
124*23076bb3SCorey Minyard                        unsigned char *rsp, unsigned int rsp_len);
125*23076bb3SCorey Minyard 
126*23076bb3SCorey Minyard     /*
127*23076bb3SCorey Minyard      * Set by the owner to hold the backend data for the interface.
128*23076bb3SCorey Minyard      */
129*23076bb3SCorey Minyard     void *(*get_backend_data)(struct IPMIInterface *s);
130*23076bb3SCorey Minyard } IPMIInterfaceClass;
131*23076bb3SCorey Minyard 
132*23076bb3SCorey Minyard /*
133*23076bb3SCorey Minyard  * Define a BMC simulator (or perhaps a connection to a real BMC)
134*23076bb3SCorey Minyard  */
135*23076bb3SCorey Minyard #define TYPE_IPMI_BMC "ipmi-bmc"
136*23076bb3SCorey Minyard #define IPMI_BMC(obj) \
137*23076bb3SCorey Minyard      OBJECT_CHECK(IPMIBmc, (obj), TYPE_IPMI_BMC)
138*23076bb3SCorey Minyard #define IPMI_BMC_CLASS(obj_class) \
139*23076bb3SCorey Minyard      OBJECT_CLASS_CHECK(IPMIBmcClass, (obj_class), TYPE_IPMI_BMC)
140*23076bb3SCorey Minyard #define IPMI_BMC_GET_CLASS(obj) \
141*23076bb3SCorey Minyard      OBJECT_GET_CLASS(IPMIBmcClass, (obj), TYPE_IPMI_BMC)
142*23076bb3SCorey Minyard 
143*23076bb3SCorey Minyard typedef struct IPMIBmc {
144*23076bb3SCorey Minyard     DeviceState parent;
145*23076bb3SCorey Minyard 
146*23076bb3SCorey Minyard     uint8_t slave_addr;
147*23076bb3SCorey Minyard 
148*23076bb3SCorey Minyard     IPMIInterface *intf;
149*23076bb3SCorey Minyard } IPMIBmc;
150*23076bb3SCorey Minyard 
151*23076bb3SCorey Minyard typedef struct IPMIBmcClass {
152*23076bb3SCorey Minyard     DeviceClass parent;
153*23076bb3SCorey Minyard 
154*23076bb3SCorey Minyard     /* Called when the system resets to report to the bmc. */
155*23076bb3SCorey Minyard     void (*handle_reset)(struct IPMIBmc *s);
156*23076bb3SCorey Minyard 
157*23076bb3SCorey Minyard     /*
158*23076bb3SCorey Minyard      * Handle a command to the bmc.
159*23076bb3SCorey Minyard      */
160*23076bb3SCorey Minyard     void (*handle_command)(struct IPMIBmc *s,
161*23076bb3SCorey Minyard                            uint8_t *cmd, unsigned int cmd_len,
162*23076bb3SCorey Minyard                            unsigned int max_cmd_len,
163*23076bb3SCorey Minyard                            uint8_t msg_id);
164*23076bb3SCorey Minyard } IPMIBmcClass;
165*23076bb3SCorey Minyard 
166*23076bb3SCorey Minyard /*
167*23076bb3SCorey Minyard  * Add a link property to obj that points to a BMC.
168*23076bb3SCorey Minyard  */
169*23076bb3SCorey Minyard void ipmi_bmc_find_and_link(Object *obj, Object **bmc);
170*23076bb3SCorey Minyard 
171*23076bb3SCorey Minyard #ifdef IPMI_DEBUG
172*23076bb3SCorey Minyard #define ipmi_debug(fs, ...) \
173*23076bb3SCorey Minyard     fprintf(stderr, "IPMI (%s): " fs, __func__, ##__VA_ARGS__)
174*23076bb3SCorey Minyard #else
175*23076bb3SCorey Minyard #define ipmi_debug(fs, ...)
176*23076bb3SCorey Minyard #endif
177*23076bb3SCorey Minyard 
178*23076bb3SCorey Minyard #endif
179