@@ -329,7 +329,7 @@ static void hservice_start_elog_send(void)
goto again;
}
-static int hservice_send_error_log(uint32_t plid, uint32_t dsize, void *data)
+int hservice_send_error_log(uint32_t plid, uint32_t dsize, void *data)
{
struct hbrt_elog_ent *ent;
void *abuf;
@@ -23,6 +23,7 @@
#include <fsp.h>
#include <mem_region.h>
#include <prd-fw-msg.h>
+#include <hostservices.h>
enum events {
EVENT_ATTN = 1 << 0,
@@ -375,6 +376,18 @@ static int prd_msg_handle_firmware_req(struct opal_prd_msg *msg)
prd_msg->hdr.size = cpu_to_be16(sizeof(*prd_msg));
rc = 0;
break;
+ case PRD_FW_MSG_TYPE_ERROR_LOG:
+ rc = hservice_send_error_log(fw_req->errorlog.plid,
+ fw_req->errorlog.size,
+ fw_req->errorlog.data);
+ /* Return generic response to HBRT */
+ fw_resp->type = cpu_to_be64(PRD_FW_MSG_TYPE_RESP_GENERIC);
+ fw_resp->generic_resp.status = cpu_to_be64(rc);
+ prd_msg->fw_resp.len = cpu_to_be64(PRD_FW_MSG_BASE_SIZE +
+ sizeof(fw_resp->generic_resp));
+ prd_msg->hdr.size = cpu_to_be16(sizeof(*prd_msg));
+ rc = 0;
+ break;
default:
rc = -ENOSYS;
}
@@ -38,5 +38,6 @@ void host_services_occ_base_setup(void);
int find_master_and_slave_occ(uint64_t **master, uint64_t **slave,
int *nr_masters, int *nr_slaves);
+int hservice_send_error_log(uint32_t plid, uint32_t dsize, void *data);
#endif /* __HOSTSERVICES_H */
@@ -39,6 +39,11 @@ struct prd_fw_msg {
struct {
__be64 status;
} generic_resp;
+ struct {
+ __be32 plid;
+ __be32 size;
+ char data[];
+ } __packed errorlog;
};
};