[Pdbg] [PATCH v2 20/24] libpdbg: Separate sbefifo chipops into a separate hwunit

Amitay Isaacs amitay at ozlabs.org
Thu Nov 7 13:28:04 AEDT 2019


This makes sbefifo driver only responsible for the transport and ffdc.
And chipop hwunit can now be independent of the backend.

Signed-off-by: Amitay Isaacs <amitay at ozlabs.org>
---
 libpdbg/chip.c    | 32 ++++++++++-----------
 libpdbg/hwunit.h  | 17 ++++++++----
 libpdbg/sbefifo.c | 71 ++++++++++++++++++++++++++++-------------------
 libpdbg/target.c  | 35 +++++++++++++++++------
 libpdbg/target.h  |  1 +
 5 files changed, 98 insertions(+), 58 deletions(-)

diff --git a/libpdbg/chip.c b/libpdbg/chip.c
index 830c3ec..908b20d 100644
--- a/libpdbg/chip.c
+++ b/libpdbg/chip.c
@@ -160,17 +160,17 @@ int thread_step_all(void)
 	int rc = 0, count = 0;
 
 	pdbg_for_each_class_target("pib", pib) {
-		struct sbefifo *sbefifo;
+		struct chipop *chipop;
 
-		sbefifo = pib_to_sbefifo(pib);
-		if (!sbefifo)
+		chipop = pib_to_chipop(pib);
+		if (!chipop)
 			break;
 
 		/*
 		 * core_id = 0xff (all SMT4 cores)
 		 * thread_id = 0xf (all 4 threads in the SMT4 core)
 		 */
-		rc |= sbefifo->thread_step(sbefifo, 0xff, 0xf);
+		rc |= chipop->thread_step(chipop, 0xff, 0xf);
 		count++;
 	}
 
@@ -193,17 +193,17 @@ int thread_start_all(void)
 	int rc = 0, count = 0;
 
 	pdbg_for_each_class_target("pib", pib) {
-		struct sbefifo *sbefifo;
+		struct chipop *chipop;
 
-		sbefifo = pib_to_sbefifo(pib);
-		if (!sbefifo)
+		chipop = pib_to_chipop(pib);
+		if (!chipop)
 			break;
 
 		/*
 		 * core_id = 0xff (all SMT4 cores)
 		 * thread_id = 0xf (all 4 threads in the SMT4 core)
 		 */
-		rc |= sbefifo->thread_start(sbefifo, 0xff, 0xf);
+		rc |= chipop->thread_start(chipop, 0xff, 0xf);
 		count++;
 	}
 
@@ -226,17 +226,17 @@ int thread_stop_all(void)
 	int rc = 0, count = 0;
 
 	pdbg_for_each_class_target("pib", pib) {
-		struct sbefifo *sbefifo;
+		struct chipop *chipop;
 
-		sbefifo = pib_to_sbefifo(pib);
-		if (!sbefifo)
+		chipop = pib_to_chipop(pib);
+		if (!chipop)
 			break;
 
 		/*
 		 * core_id = 0xff (all SMT4 cores)
 		 * thread_id = 0xf (all 4 threads in the SMT4 core)
 		 */
-		rc |= sbefifo->thread_stop(sbefifo, 0xff, 0xf);
+		rc |= chipop->thread_stop(chipop, 0xff, 0xf);
 		count++;
 	}
 
@@ -259,17 +259,17 @@ int thread_sreset_all(void)
 	int rc = 0, count = 0;
 
 	pdbg_for_each_class_target("pib", pib) {
-		struct sbefifo *sbefifo;
+		struct chipop *chipop;
 
-		sbefifo = pib_to_sbefifo(pib);
-		if (!sbefifo)
+		chipop = pib_to_chipop(pib);
+		if (!chipop)
 			break;
 
 		/*
 		 * core_id = 0xff (all SMT4 cores)
 		 * thread_id = 0xf (all 4 threads in the SMT4 core)
 		 */
-		rc |= sbefifo->thread_sreset(sbefifo, 0xff, 0xf);
+		rc |= chipop->thread_sreset(chipop, 0xff, 0xf);
 		count++;
 	}
 
diff --git a/libpdbg/hwunit.h b/libpdbg/hwunit.h
index 06e5fca..40689df 100644
--- a/libpdbg/hwunit.h
+++ b/libpdbg/hwunit.h
@@ -65,14 +65,19 @@ struct mem {
 };
 #define target_to_mem(x) container_of(x, struct mem, target)
 
+struct chipop {
+	struct pdbg_target target;
+	uint32_t (*ffdc_get)(struct chipop *, const uint8_t **, uint32_t *);
+	int (*istep)(struct chipop *, uint32_t major, uint32_t minor);
+	int (*thread_start)(struct chipop *, uint32_t core_id, uint32_t thread_id);
+	int (*thread_stop)(struct chipop *, uint32_t core_id, uint32_t thread_id);
+	int (*thread_step)(struct chipop *, uint32_t core_id, uint32_t thread_id);
+	int (*thread_sreset)(struct chipop *, uint32_t core_id, uint32_t thread_id);
+};
+#define target_to_chipop(x) container_of(x, struct chipop, target)
+
 struct sbefifo {
 	struct pdbg_target target;
-	int (*istep)(struct sbefifo *, uint32_t major, uint32_t minor);
-	int (*thread_start)(struct sbefifo *, uint32_t core_id, uint32_t thread_id);
-	int (*thread_stop)(struct sbefifo *, uint32_t core_id, uint32_t thread_id);
-	int (*thread_step)(struct sbefifo *, uint32_t core_id, uint32_t thread_id);
-	int (*thread_sreset)(struct sbefifo *, uint32_t core_id, uint32_t thread_id);
-	uint32_t (*ffdc_get)(struct sbefifo *, const uint8_t **, uint32_t *);
 	struct sbefifo_context *sf_ctx;
 };
 #define target_to_sbefifo(x) container_of(x, struct sbefifo, target)
diff --git a/libpdbg/sbefifo.c b/libpdbg/sbefifo.c
index e53a4f8..98f3442 100644
--- a/libpdbg/sbefifo.c
+++ b/libpdbg/sbefifo.c
@@ -25,19 +25,6 @@
 #include "hwunit.h"
 #include "debug.h"
 
-static uint32_t sbefifo_op_ffdc_get(struct sbefifo *sbefifo, const uint8_t **ffdc, uint32_t *ffdc_len)
-{
-	return sbefifo_ffdc_get(sbefifo->sf_ctx, ffdc, ffdc_len);
-}
-
-static int sbefifo_op_istep(struct sbefifo *sbefifo,
-			    uint32_t major, uint32_t minor)
-{
-	PR_NOTICE("sbefifo: istep %u.%u\n", major, minor);
-
-	return sbefifo_istep_execute(sbefifo->sf_ctx, major & 0xff, minor & 0xff);
-}
-
 static int sbefifo_op_getmem(struct mem *sbefifo_mem,
 			     uint64_t addr, uint8_t *data, uint64_t size,
 			     uint8_t block_size, bool ci)
@@ -105,10 +92,28 @@ static int sbefifo_op_putmem(struct mem *sbefifo_mem,
 	return 0;
 }
 
-static int sbefifo_op_control(struct sbefifo *sbefifo,
+static uint32_t sbefifo_op_ffdc_get(struct chipop *chipop, const uint8_t **ffdc, uint32_t *ffdc_len)
+{
+	struct sbefifo *sbefifo = target_to_sbefifo(chipop->target.parent);
+
+	return sbefifo_ffdc_get(sbefifo->sf_ctx, ffdc, ffdc_len);
+}
+
+static int sbefifo_op_istep(struct chipop *chipop,
+			    uint32_t major, uint32_t minor)
+{
+	struct sbefifo *sbefifo = target_to_sbefifo(chipop->target.parent);
+
+	PR_NOTICE("sbefifo: istep %u.%u\n", major, minor);
+
+	return sbefifo_istep_execute(sbefifo->sf_ctx, major & 0xff, minor & 0xff);
+}
+
+static int sbefifo_op_control(struct chipop *chipop,
 			      uint32_t core_id, uint32_t thread_id,
 			      uint32_t oper)
 {
+	struct sbefifo *sbefifo = target_to_sbefifo(chipop->target.parent);
 	uint8_t mode = 0;
 
 	/* Enforce special-wakeup for thread stop and sreset */
@@ -121,28 +126,28 @@ static int sbefifo_op_control(struct sbefifo *sbefifo,
 	return sbefifo_control_insn(sbefifo->sf_ctx, core_id & 0xff, thread_id & 0xff, oper & 0xff, mode);
 }
 
-static int sbefifo_op_thread_start(struct sbefifo *sbefifo,
+static int sbefifo_op_thread_start(struct chipop *chipop,
 				   uint32_t core_id, uint32_t thread_id)
 {
-	return sbefifo_op_control(sbefifo, core_id, thread_id, SBEFIFO_INSN_OP_START);
+	return sbefifo_op_control(chipop, core_id, thread_id, SBEFIFO_INSN_OP_START);
 }
 
-static int sbefifo_op_thread_stop(struct sbefifo *sbefifo,
+static int sbefifo_op_thread_stop(struct chipop *chipop,
 				  uint32_t core_id, uint32_t thread_id)
 {
-	return sbefifo_op_control(sbefifo, core_id, thread_id, SBEFIFO_INSN_OP_STOP);
+	return sbefifo_op_control(chipop, core_id, thread_id, SBEFIFO_INSN_OP_STOP);
 }
 
-static int sbefifo_op_thread_step(struct sbefifo *sbefifo,
+static int sbefifo_op_thread_step(struct chipop *chipop,
 				  uint32_t core_id, uint32_t thread_id)
 {
-	return sbefifo_op_control(sbefifo, core_id, thread_id, SBEFIFO_INSN_OP_STEP);
+	return sbefifo_op_control(chipop, core_id, thread_id, SBEFIFO_INSN_OP_STEP);
 }
 
-static int sbefifo_op_thread_sreset(struct sbefifo *sbefifo,
+static int sbefifo_op_thread_sreset(struct chipop *chipop,
 				    uint32_t core_id, uint32_t thread_id)
 {
-	return sbefifo_op_control(sbefifo, core_id, thread_id, SBEFIFO_INSN_OP_SRESET);
+	return sbefifo_op_control(chipop, core_id, thread_id, SBEFIFO_INSN_OP_SRESET);
 }
 
 static int sbefifo_probe(struct pdbg_target *target)
@@ -181,6 +186,21 @@ static struct mem sbefifo_mem = {
 };
 DECLARE_HW_UNIT(sbefifo_mem);
 
+static struct chipop sbefifo_chipop = {
+	.target = {
+		.name = "SBE FIFO Chip-op engine",
+		.compatible = "ibm,sbefifo-chipop",
+		.class = "chipop",
+	},
+	.ffdc_get = sbefifo_op_ffdc_get,
+	.istep = sbefifo_op_istep,
+	.thread_start = sbefifo_op_thread_start,
+	.thread_stop = sbefifo_op_thread_stop,
+	.thread_step = sbefifo_op_thread_step,
+	.thread_sreset = sbefifo_op_thread_sreset,
+};
+DECLARE_HW_UNIT(sbefifo_chipop);
+
 static struct sbefifo kernel_sbefifo = {
 	.target = {
 		.name =	"Kernel based FSI SBE FIFO",
@@ -189,12 +209,6 @@ static struct sbefifo kernel_sbefifo = {
 		.probe = sbefifo_probe,
 		.release = sbefifo_release,
 	},
-	.istep = sbefifo_op_istep,
-	.thread_start = sbefifo_op_thread_start,
-	.thread_stop = sbefifo_op_thread_stop,
-	.thread_step = sbefifo_op_thread_step,
-	.thread_sreset = sbefifo_op_thread_sreset,
-	.ffdc_get = sbefifo_op_ffdc_get,
 };
 DECLARE_HW_UNIT(kernel_sbefifo);
 
@@ -202,5 +216,6 @@ __attribute__((constructor))
 static void register_sbefifo(void)
 {
 	pdbg_hwunit_register(&kernel_sbefifo_hw_unit);
+	pdbg_hwunit_register(&sbefifo_chipop_hw_unit);
 	pdbg_hwunit_register(&sbefifo_mem_hw_unit);
 }
diff --git a/libpdbg/target.c b/libpdbg/target.c
index da7814b..603f206 100644
--- a/libpdbg/target.c
+++ b/libpdbg/target.c
@@ -290,26 +290,45 @@ struct sbefifo *pib_to_sbefifo(struct pdbg_target *pib)
 	return NULL;
 }
 
+struct chipop *pib_to_chipop(struct pdbg_target *pib)
+{
+	struct pdbg_target *chipop;
+	uint32_t index;
+
+	assert(pdbg_target_is_class(pib, "pib"));
+	index = pdbg_target_index(pib);
+
+	pdbg_for_each_class_target("chipop", chipop) {
+		if (pdbg_target_index(chipop) != index)
+			continue;
+
+		if (pdbg_target_probe(chipop) == PDBG_TARGET_ENABLED)
+			return target_to_chipop(chipop);
+	}
+
+	return NULL;
+}
+
 int sbe_istep(struct pdbg_target *target, uint32_t major, uint32_t minor)
 {
-	struct sbefifo *sbefifo;
+	struct chipop *chipop;
 
-	sbefifo = pib_to_sbefifo(target);
-	if (!sbefifo)
+	chipop = pib_to_chipop(target);
+	if (!chipop)
 		return -1;
 
-	return sbefifo->istep(sbefifo, major, minor);
+	return chipop->istep(chipop, major, minor);
 }
 
 uint32_t sbe_ffdc_get(struct pdbg_target *target, const uint8_t **ffdc, uint32_t *ffdc_len)
 {
-	struct sbefifo *sbefifo;
+	struct chipop *chipop;
 
-	sbefifo = pib_to_sbefifo(target);
-	if (!sbefifo)
+	chipop = pib_to_chipop(target);
+	if (!chipop)
 		return -1;
 
-	return sbefifo->ffdc_get(sbefifo, ffdc, ffdc_len);
+	return chipop->ffdc_get(chipop, ffdc, ffdc_len);
 }
 
 /* Finds the given class. Returns NULL if not found. */
diff --git a/libpdbg/target.h b/libpdbg/target.h
index 35e822b..ca79a84 100644
--- a/libpdbg/target.h
+++ b/libpdbg/target.h
@@ -73,6 +73,7 @@ void pdbg_default_dtb(struct pdbg_dtb *pdtb);
 const char *pdbg_get_backend_option(void);
 
 struct sbefifo *pib_to_sbefifo(struct pdbg_target *target);
+struct chipop *pib_to_chipop(struct pdbg_target *target);
 bool target_is_virtual(struct pdbg_target *target);
 struct pdbg_target *target_to_real(struct pdbg_target *target, bool strict);
 struct pdbg_target *target_to_virtual(struct pdbg_target *target, bool strict);
-- 
2.21.0



More information about the Pdbg mailing list