[Skiboot] [PATCH v3 5/7] hw/imc: Refactor opal init call for core-imc

Anju T Sudhakar anju at linux.vnet.ibm.com
Fri Mar 22 17:43:50 AEDT 2019


Factor out core-imc stop api code from opal_imc_counters_init() for
better readability.

Also fix the error message if, wake_up_engine_state is not
"WAKEUP_ENGINE_PRESENT".

Signed-off-by: Anju T Sudhakar <anju at linux.vnet.ibm.com>
Cc: Akshay Adiga <akshay.adiga at linux.vnet.ibm.com>
---
 hw/imc.c | 70 ++++++++++++++++++++++++++++++++++----------------------
 1 file changed, 43 insertions(+), 27 deletions(-)

diff --git a/hw/imc.c b/hw/imc.c
index 354a5454..843ffe3d 100644
--- a/hw/imc.c
+++ b/hw/imc.c
@@ -604,6 +604,30 @@ err:
 	free(imc_xz);
 }
 
+static int stop_api_init(struct proc_chip *chip, int phys_core_id,
+			uint32_t scoms,  uint64_t data,
+			const ScomOperation_t operation,
+			const ScomSection_t section,
+			const char *type)
+{
+	int ret;
+
+	prlog(PR_DEBUG, "Configuring stopapi for IMC\n");
+	ret = p9_stop_save_scom((void *)chip->homer_base, scoms,
+				data, operation, section);
+	if (ret) {
+		prerror("IMC %s stopapi ret = %d, scoms = %x (core id = %x)\n",\
+				type, ret, scoms, phys_core_id);
+		if (ret != STOP_SAVE_SCOM_ENTRY_UPDATE_FAILED)
+			wakeup_engine_state = WAKEUP_ENGINE_FAILED;
+		else
+			prerror("SCOM entries are full\n");
+		return OPAL_HARDWARE;
+	}
+
+	return ret;
+}
+
 /*
  * opal_imc_counters_init : This call initialize the IMC engine.
  *
@@ -663,34 +687,26 @@ static int64_t opal_imc_counters_init(uint32_t type, uint64_t addr, uint64_t cpu
 			if (wakeup_engine_state == WAKEUP_ENGINE_PRESENT) {
 				struct proc_chip *chip = get_chip(c->chip_id);
 
-				prlog(PR_INFO, "Configuring stopapi for IMC\n");
-				scoms = XSCOM_ADDR_P9_EP(phys_core_id,pdbar_scom_index[port_id]);
-				ret = p9_stop_save_scom(( void *)chip->homer_base,scoms,
-					(u64)(CORE_IMC_PDBAR_MASK & addr),
-					P9_STOP_SCOM_REPLACE,
-					P9_STOP_SECTION_EQ_SCOM);
-				if ( ret ) {
-					prerror("IMC pdbar stopapi ret = %d, scoms = %x (core id = %x)\n", ret, scoms, phys_core_id);
-					if ( ret != STOP_SAVE_SCOM_ENTRY_UPDATE_FAILED )
-						wakeup_engine_state = WAKEUP_ENGINE_FAILED;
-					else
-						prerror("SCOM entries are full\n");
-					return OPAL_HARDWARE;
-				}
-				scoms = XSCOM_ADDR_P9_EC(phys_core_id,CORE_IMC_EVENT_MASK_ADDR);
-				ret = p9_stop_save_scom(( void *)chip->homer_base,scoms,
-				(u64)CORE_IMC_EVENT_MASK, P9_STOP_SCOM_REPLACE,
-				P9_STOP_SECTION_CORE_SCOM);
-				if ( ret ) {
-					prerror("IMC event_mask stopapi ret = %d, scoms = %x (core id = %x)\n", ret, scoms, phys_core_id);
-					if ( ret != STOP_SAVE_SCOM_ENTRY_UPDATE_FAILED )
-						wakeup_engine_state = WAKEUP_ENGINE_FAILED;
-					else
-						prerror("SCOM entries are full\n");
-					return OPAL_HARDWARE;
-				}
+				scoms = XSCOM_ADDR_P9_EP(phys_core_id,
+						pdbar_scom_index[port_id]);
+				ret = stop_api_init(chip, phys_core_id, scoms,
+						(u64)(CORE_IMC_PDBAR_MASK & addr),
+						P9_STOP_SCOM_REPLACE,
+						P9_STOP_SECTION_EQ_SCOM,
+						"pdbar");
+				if (ret)
+					return ret;
+				scoms = XSCOM_ADDR_P9_EC(phys_core_id,
+						CORE_IMC_EVENT_MASK_ADDR);
+				ret = stop_api_init(chip, phys_core_id, scoms,
+						(u64)CORE_IMC_EVENT_MASK,
+						P9_STOP_SCOM_REPLACE,
+						P9_STOP_SECTION_CORE_SCOM,
+						"event_mask");
+				if (ret)
+					return ret;
 			} else {
-				prerror("IMC: Wakeup engine in error state!");
+				prerror("IMC: Wakeup engine not present!");
 				return OPAL_HARDWARE;
 			}
 		}
-- 
2.17.2



More information about the Skiboot mailing list