powerpc/powernv: Add OPAL IPMI interface

Recent OPAL firmare adds a couple of functions to send and receive IPMI
messages:

  https://github.com/open-power/skiboot/commit/b2a374da

This change updates the token list and wrappers to suit, and adds the
platform devices for any IPMI interfaces.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
Jeremy Kerr 2014-11-06 11:38:27 +08:00 committed by Michael Ellerman
parent 0df1f2487d
commit 608b286d1d
3 changed files with 33 additions and 0 deletions

View file

@ -154,6 +154,8 @@ struct opal_sg_list {
#define OPAL_HANDLE_HMI 98 #define OPAL_HANDLE_HMI 98
#define OPAL_REGISTER_DUMP_REGION 101 #define OPAL_REGISTER_DUMP_REGION 101
#define OPAL_UNREGISTER_DUMP_REGION 102 #define OPAL_UNREGISTER_DUMP_REGION 102
#define OPAL_IPMI_SEND 107
#define OPAL_IPMI_RECV 108
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
@ -452,6 +454,17 @@ struct opal_msg {
__be64 params[8]; __be64 params[8];
}; };
enum {
OPAL_IPMI_MSG_FORMAT_VERSION_1 = 1,
};
struct opal_ipmi_msg {
uint8_t version;
uint8_t netfn;
uint8_t cmd;
uint8_t data[];
};
struct opal_machine_check_event { struct opal_machine_check_event {
enum OpalMCE_Version version:8; /* 0x00 */ enum OpalMCE_Version version:8; /* 0x00 */
uint8_t in_use; /* 0x01 */ uint8_t in_use; /* 0x01 */
@ -963,6 +976,10 @@ int64_t opal_handle_hmi(void);
int64_t opal_register_dump_region(uint32_t id, uint64_t start, uint64_t end); int64_t opal_register_dump_region(uint32_t id, uint64_t start, uint64_t end);
int64_t opal_unregister_dump_region(uint32_t id); int64_t opal_unregister_dump_region(uint32_t id);
int64_t opal_pci_set_phb_cxl_mode(uint64_t phb_id, uint64_t mode, uint64_t pe_number); int64_t opal_pci_set_phb_cxl_mode(uint64_t phb_id, uint64_t mode, uint64_t pe_number);
int64_t opal_ipmi_send(uint64_t interface, struct opal_ipmi_msg *msg,
uint64_t msg_len);
int64_t opal_ipmi_recv(uint64_t interface, struct opal_ipmi_msg *msg,
uint64_t *msg_len);
/* Internal functions */ /* Internal functions */
extern int early_init_dt_scan_opal(unsigned long node, const char *uname, extern int early_init_dt_scan_opal(unsigned long node, const char *uname,

View file

@ -250,3 +250,5 @@ OPAL_CALL(opal_handle_hmi, OPAL_HANDLE_HMI);
OPAL_CALL(opal_register_dump_region, OPAL_REGISTER_DUMP_REGION); OPAL_CALL(opal_register_dump_region, OPAL_REGISTER_DUMP_REGION);
OPAL_CALL(opal_unregister_dump_region, OPAL_UNREGISTER_DUMP_REGION); OPAL_CALL(opal_unregister_dump_region, OPAL_UNREGISTER_DUMP_REGION);
OPAL_CALL(opal_pci_set_phb_cxl_mode, OPAL_PCI_SET_PHB_CXL_MODE); OPAL_CALL(opal_pci_set_phb_cxl_mode, OPAL_PCI_SET_PHB_CXL_MODE);
OPAL_CALL(opal_ipmi_send, OPAL_IPMI_SEND);
OPAL_CALL(opal_ipmi_recv, OPAL_IPMI_RECV);

View file

@ -644,6 +644,16 @@ static void __init opal_dump_region_init(void)
pr_warn("DUMP: Failed to register kernel log buffer. " pr_warn("DUMP: Failed to register kernel log buffer. "
"rc = %d\n", rc); "rc = %d\n", rc);
} }
static void opal_ipmi_init(struct device_node *opal_node)
{
struct device_node *np;
for_each_child_of_node(opal_node, np)
if (of_device_is_compatible(np, "ibm,opal-ipmi"))
of_platform_device_create(np, NULL, NULL);
}
static int __init opal_init(void) static int __init opal_init(void)
{ {
struct device_node *np, *consoles; struct device_node *np, *consoles;
@ -707,6 +717,8 @@ static int __init opal_init(void)
opal_msglog_init(); opal_msglog_init();
} }
opal_ipmi_init(opal_node);
return 0; return 0;
} }
machine_subsys_initcall(powernv, opal_init); machine_subsys_initcall(powernv, opal_init);
@ -742,6 +754,8 @@ void opal_shutdown(void)
/* Export this so that test modules can use it */ /* Export this so that test modules can use it */
EXPORT_SYMBOL_GPL(opal_invalid_call); EXPORT_SYMBOL_GPL(opal_invalid_call);
EXPORT_SYMBOL_GPL(opal_ipmi_send);
EXPORT_SYMBOL_GPL(opal_ipmi_recv);
/* Convert a region of vmalloc memory to an opal sg list */ /* Convert a region of vmalloc memory to an opal sg list */
struct opal_sg_list *opal_vmalloc_to_sg_list(void *vmalloc_addr, struct opal_sg_list *opal_vmalloc_to_sg_list(void *vmalloc_addr,