[1/2] SBE: Add passthrough command support

Submitted by Vasant Hegde on April 19, 2017, 4:33 a.m.

Details

Message ID 20170419043337.14669-1-hegdevasant@linux.vnet.ibm.com
State New
Headers show

Commit Message

Vasant Hegde April 19, 2017, 4:33 a.m.
SBE sends passthrough command. We have to capture this interrupt and
send event HBRT via opal-prd.

This patch enables OPAL to capture interrupt and send event to kernel.
Next patch will add opal-prd (user space) support.

Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
Reviewed-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
---
This patch works on top of my SBE patchset [1].
[1] https://lists.ozlabs.org/pipermail/skiboot/2017-April/006984.html

-Vasant

 hw/prd.c           | 13 +++++++++++++
 hw/sbe-p9.c        |  5 +++++
 include/opal-api.h |  4 ++++
 include/sbe-p9.h   |  1 +
 include/skiboot.h  |  1 +
 5 files changed, 24 insertions(+)

Patch hide | download patch | download mbox

diff --git a/hw/prd.c b/hw/prd.c
index a44faa9..e19074e 100644
--- a/hw/prd.c
+++ b/hw/prd.c
@@ -27,6 +27,7 @@  enum events {
 	EVENT_ATTN	= 1 << 0,
 	EVENT_OCC_ERROR	= 1 << 1,
 	EVENT_OCC_RESET	= 1 << 2,
+	EVENT_SBE_PASSTHROUGH = 1 << 3,
 };
 
 static uint8_t events[MAX_CHIPS];
@@ -112,6 +113,10 @@  static void prd_msg_consumed(void *data)
 		proc = msg->occ_reset.chip;
 		event = EVENT_OCC_RESET;
 		break;
+	case OPAL_PRD_MSG_TYPE_SBE_PASSTHROUGH:
+		proc = msg->sbe_passthrough.chip;
+		event = EVENT_SBE_PASSTHROUGH;
+		break;
 	default:
 		prlog(PR_ERR, "PRD: invalid msg consumed, type: 0x%x\n",
 				msg->hdr.type);
@@ -183,6 +188,9 @@  static void send_next_pending_event(void)
 		prd_msg.hdr.type = OPAL_PRD_MSG_TYPE_OCC_RESET;
 		prd_msg.occ_reset.chip = proc;
 		occ_msg_queue_occ_reset();
+	} else if (event & EVENT_SBE_PASSTHROUGH) {
+		prd_msg.hdr.type = OPAL_PRD_MSG_TYPE_SBE_PASSTHROUGH;
+		prd_msg.sbe_passthrough.chip = proc;
 	}
 
 	queue_prd_msg(&prd_msg, prd_msg_consumed);
@@ -263,6 +271,11 @@  void prd_occ_reset(uint32_t proc)
 	prd_event(proc, EVENT_OCC_RESET);
 }
 
+void prd_sbe_passthrough(uint32_t proc)
+{
+	prd_event(proc, EVENT_SBE_PASSTHROUGH);
+}
+
 /* incoming message handlers */
 static int prd_msg_handle_attn_ack(struct opal_prd_msg *msg)
 {
diff --git a/hw/sbe-p9.c b/hw/sbe-p9.c
index 527e8ca..31bc885 100644
--- a/hw/sbe-p9.c
+++ b/hw/sbe-p9.c
@@ -546,6 +546,11 @@  void sbe_interrupt(uint32_t chip_id)
 		goto clr_interrupt;
 	}
 
+	/* SBE passtrhough command, call prd handler */
+	if (data & SBE_HOST_PASSTHROUGH) {
+		prd_sbe_passthrough(sbe->chip_id);
+	}
+
 	/* Handle SBE response */
 	if (data & SBE_HOST_RESPONSE_WAITING) {
 		lock(&sbe->lock);
diff --git a/include/opal-api.h b/include/opal-api.h
index 7966200..80915ac 100644
--- a/include/opal-api.h
+++ b/include/opal-api.h
@@ -962,6 +962,7 @@  enum opal_prd_msg_type {
 	OPAL_PRD_MSG_TYPE_OCC_ERROR,	/* HBRT <-- OPAL */
 	OPAL_PRD_MSG_TYPE_OCC_RESET,	/* HBRT <-- OPAL */
 	OPAL_PRD_MSG_TYPE_OCC_RESET_NOTIFY, /* HBRT --> OPAL */
+	OPAL_PRD_MSG_TYPE_SBE_PASSTHROUGH, /* HBRT <-- OPAL */
 };
 
 struct opal_prd_msg_header {
@@ -993,6 +994,9 @@  struct opal_prd_msg {
 		struct {
 			__be64	chip;
 		} occ_reset;
+		struct {
+			__be64	chip;
+		} sbe_passthrough;
 	};
 };
 
diff --git a/include/sbe-p9.h b/include/sbe-p9.h
index 3017003..2bc28f4 100644
--- a/include/sbe-p9.h
+++ b/include/sbe-p9.h
@@ -92,6 +92,7 @@ 
 #define SBE_HOST_MSG_READ		PPC_BIT(1)
 #define SBE_HOST_STOP15_EXIT		PPC_BIT(2)
 #define SBE_HOST_RESET			PPC_BIT(3)
+#define SBE_HOST_PASSTHROUGH		PPC_BIT(4)
 #define SBE_HOST_TIMER_EXPIRY		PPC_BIT(14)
 #define SBE_HOST_RESPONSE_CLEAR		0x00
 
diff --git a/include/skiboot.h b/include/skiboot.h
index eb05951..f966549 100644
--- a/include/skiboot.h
+++ b/include/skiboot.h
@@ -275,6 +275,7 @@  extern void occ_pnor_set_owner(enum pnor_owner owner);
 extern void prd_psi_interrupt(uint32_t proc);
 extern void prd_tmgt_interrupt(uint32_t proc);
 extern void prd_occ_reset(uint32_t proc);
+extern void prd_sbe_passthrough(uint32_t proc);
 extern void prd_init(void);
 extern void prd_register_reserved_memory(void);