[Skiboot] [PATCH 16/17] Move platform specific PRD functionality to struct platform

Stewart Smith stewart at linux.ibm.com
Tue Jun 18 17:29:24 AEST 2019


Signed-off-by: Stewart Smith <stewart at linux.ibm.com>
---
 hw/prd.c                    | 36 +++++++++++++++++++++++++-----------
 include/platform.h          | 17 +++++++++++++++++
 platforms/ibm-fsp/common.c  |  9 +++++++++
 platforms/ibm-fsp/firenze.c |  1 +
 platforms/ibm-fsp/ibm-fsp.h |  1 +
 platforms/ibm-fsp/zz.c      |  1 +
 6 files changed, 54 insertions(+), 11 deletions(-)

diff --git a/hw/prd.c b/hw/prd.c
index fea8cf054c24..904ed2c2c64c 100644
--- a/hw/prd.c
+++ b/hw/prd.c
@@ -130,7 +130,9 @@ static void prd_msg_consumed(void *data, int status)
 			      "PRD: Failed to send FSP -> HBRT message\n");
 			notify_status = FSP_STATUS_GENERIC_FAILURE;
 		}
-		hservice_hbrt_msg_response(notify_status);
+		assert(platform.prd);
+		assert(platform.prd->msg_response);
+		platform.prd->msg_response(notify_status);
 		break;
 	case OPAL_PRD_MSG_TYPE_SBE_PASSTHROUGH:
 		proc = msg->sbe_passthrough.chip;
@@ -529,9 +531,11 @@ static int prd_msg_handle_firmware_req(struct opal_prd_msg *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);
+		assert(platform.prd);
+		assert(platform.prd->send_error_log);
+		rc = platform.prd->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);
@@ -604,7 +608,9 @@ static int prd_msg_handle_firmware_req(struct opal_prd_msg *msg)
 		unlock(&events_lock);
 
 		/* Send message to FSP */
-		rc = hservice_send_hbrt_msg(&(fw_resp->mbox_msg), data_len);
+		assert(platform.prd);
+		assert(platform.prd->send_hbrt_msg);
+		rc = platform.prd->send_hbrt_msg(&(fw_resp->mbox_msg), data_len);
 
 		/*
 		 * Callback handler from hservice_send_hbrt_msg will take
@@ -669,16 +675,24 @@ static int64_t opal_prd_msg(struct opal_prd_msg *msg)
 		rc = prd_msg_handle_firmware_req(msg);
 		break;
 	case OPAL_PRD_MSG_TYPE_FSP_OCC_RESET_STATUS:
-		rc = fsp_occ_reset_status(msg->fsp_occ_reset_status.chip,
-					  msg->fsp_occ_reset_status.status);
+		assert(platform.prd);
+		assert(platform.prd->fsp_occ_reset_status);
+		rc = platform.prd->fsp_occ_reset_status(
+			msg->fsp_occ_reset_status.chip,
+			msg->fsp_occ_reset_status.status);
 		break;
 	case OPAL_PRD_MSG_TYPE_CORE_SPECIAL_WAKEUP:
-		rc = hservice_wakeup(msg->spl_wakeup.core,
-				     msg->spl_wakeup.mode);
+		assert(platform.prd);
+		assert(platform.prd->wakeup);
+		rc = platform.prd->wakeup(msg->spl_wakeup.core,
+					  msg->spl_wakeup.mode);
 		break;
 	case OPAL_PRD_MSG_TYPE_FSP_OCC_LOAD_START_STATUS:
-		rc = fsp_occ_load_start_status(msg->fsp_occ_reset_status.chip,
-					msg->fsp_occ_reset_status.status);
+		assert(platform.prd);
+		assert(platform.prd->fsp_occ_load_start_status);
+		rc = platform.prd->fsp_occ_load_start_status(
+			msg->fsp_occ_reset_status.chip,
+			msg->fsp_occ_reset_status.status);
 		break;
 	default:
 		prlog(PR_DEBUG, "PRD: Unsupported prd message type : 0x%x\n",
diff --git a/include/platform.h b/include/platform.h
index f17847ac0d60..0326e1a247e4 100644
--- a/include/platform.h
+++ b/include/platform.h
@@ -89,6 +89,18 @@ struct platform_psi {
 	void (*fsp_interrupt)(void);
 };
 
+/*
+ * Some PRD functionality is platform specific.
+ */
+struct platform_prd {
+	void (*msg_response)(uint32_t rc);
+	int (*send_error_log)(uint32_t plid, uint32_t dsize, void *data);
+	int (*send_hbrt_msg)(void *data, u64 dsize);
+	int (*wakeup)(uint32_t i_core, uint32_t i_mode);
+	int (*fsp_occ_load_start_status)(u64 chipid, s64 status);
+	int (*fsp_occ_reset_status)(u64 chipid, s64 status);
+};
+
 /*
  * Each platform can provide a set of hooks
  * that can affect the generic code
@@ -108,6 +120,11 @@ struct platform {
 	 */
 	const struct platform_psi *psi;
 
+	/*
+	 * Platform specific PRD handling
+	 */
+	const struct platform_prd *prd;
+
 	/* OpenCAPI platform-specific I2C information */
 	const struct platform_ocapi *ocapi;
 
diff --git a/platforms/ibm-fsp/common.c b/platforms/ibm-fsp/common.c
index ba20d5070353..7f7a1f246206 100644
--- a/platforms/ibm-fsp/common.c
+++ b/platforms/ibm-fsp/common.c
@@ -275,3 +275,12 @@ struct platform_psi fsp_platform_psi = {
 	.link_established = fsp_reinit_fsp,
 	.fsp_interrupt = fsp_interrupt,
 };
+
+struct platform_prd fsp_platform_prd = {
+	.msg_response = hservice_hbrt_msg_response,
+	.send_error_log = hservice_send_error_log,
+	.send_hbrt_msg = hservice_send_hbrt_msg,
+	.wakeup = hservice_wakeup,
+	.fsp_occ_load_start_status = fsp_occ_load_start_status,
+	.fsp_occ_reset_status = fsp_occ_reset_status,
+};
diff --git a/platforms/ibm-fsp/firenze.c b/platforms/ibm-fsp/firenze.c
index 6c25023235e7..232833480f75 100644
--- a/platforms/ibm-fsp/firenze.c
+++ b/platforms/ibm-fsp/firenze.c
@@ -210,6 +210,7 @@ static void firenze_init(void)
 DECLARE_PLATFORM(firenze) = {
 	.name			= "Firenze",
 	.psi			= &fsp_platform_psi,
+	.prd			= &fsp_platform_prd,
 	.probe			= firenze_probe,
 	.init			= firenze_init,
 	.fast_reboot_init	= fsp_console_reset,
diff --git a/platforms/ibm-fsp/ibm-fsp.h b/platforms/ibm-fsp/ibm-fsp.h
index 66139f0c06de..dc3969ec688d 100644
--- a/platforms/ibm-fsp/ibm-fsp.h
+++ b/platforms/ibm-fsp/ibm-fsp.h
@@ -51,5 +51,6 @@ void vpd_preload(struct dt_node *hub_node);
 int fsp_heartbeat_time(void);
 
 extern struct platform_psi fsp_platform_psi;
+extern struct platform_prd fsp_platform_prd;
 
 #endif /*  __IBM_FSP_COMMON_H */
diff --git a/platforms/ibm-fsp/zz.c b/platforms/ibm-fsp/zz.c
index 9e18e406a6f2..ac608f6aba7e 100644
--- a/platforms/ibm-fsp/zz.c
+++ b/platforms/ibm-fsp/zz.c
@@ -72,6 +72,7 @@ static void zz_init(void)
 DECLARE_PLATFORM(zz) = {
 	.name			= "ZZ",
 	.psi			= &fsp_platform_psi,
+	.prd			= &fsp_platform_prd,
 	.probe			= zz_probe,
 	.init			= zz_init,
 	.fast_reboot_init	= fsp_console_reset,
-- 
2.21.0



More information about the Skiboot mailing list