Commit 608b286d authored by Jeremy Kerr's avatar Jeremy Kerr Committed by Michael Ellerman

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: default avatarJeremy Kerr <jk@ozlabs.org>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 0df1f248
...@@ -154,6 +154,8 @@ struct opal_sg_list { ...@@ -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 { ...@@ -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); ...@@ -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,
......
...@@ -250,3 +250,5 @@ OPAL_CALL(opal_handle_hmi, OPAL_HANDLE_HMI); ...@@ -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);
...@@ -644,6 +644,16 @@ static void __init opal_dump_region_init(void) ...@@ -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) ...@@ -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) ...@@ -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,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment