[Pdbg] [PATCH 1/3] libpdbg: Move P9 chiplet definition into FAPI targets
Alistair Popple
alistair at popple.id.au
Thu Mar 12 12:25:05 AEDT 2020
The chiplets are being treated like FAPI targets for address
translation now so move the definition into the same file as the rest
of the FAPI targets.
Signed-off-by: Alistair Popple <alistair at popple.id.au>
---
libpdbg/p9_fapi_targets.c | 100 ++++++++++++++++++++++++++++++++++++++
libpdbg/p9chip.c | 98 -------------------------------------
2 files changed, 100 insertions(+), 98 deletions(-)
diff --git a/libpdbg/p9_fapi_targets.c b/libpdbg/p9_fapi_targets.c
index 94c58ea..9ff35d9 100644
--- a/libpdbg/p9_fapi_targets.c
+++ b/libpdbg/p9_fapi_targets.c
@@ -608,6 +608,105 @@ struct pauc p9_pauc = {
};
DECLARE_HW_UNIT(p9_pauc);
+#define HEADER_CHECK_DATA ((uint64_t) 0xc0ffee03 << 32)
+
+static int p9_chiplet_getring(struct chiplet *chiplet, uint64_t ring_addr, int64_t ring_len, uint32_t result[])
+{
+ uint64_t scan_type_addr;
+ uint64_t scan_data_addr;
+ uint64_t scan_header_addr;
+ uint64_t scan_type_data;
+ uint64_t set_pulse = 1;
+ uint64_t bits = 32;
+ uint64_t data;
+
+ /* We skip the first word in the results so we can write it later as it
+ * should contain the header read out at the end */
+ int i = 0;
+
+ scan_type_addr = (ring_addr & 0x7fff0000) | 0x7;
+ scan_data_addr = (scan_type_addr & 0xffff0000) | 0x8000;
+ scan_header_addr = scan_data_addr & 0xffffe000;
+
+ scan_type_data = (ring_addr & 0xfff0) << 13;
+ scan_type_data |= 0x800 >> (ring_addr & 0xf);
+ scan_type_data <<= 32;
+
+ pib_write(&chiplet->target, scan_type_addr, scan_type_data);
+ pib_write(&chiplet->target, scan_header_addr, HEADER_CHECK_DATA);
+
+ /* The final 32 bit read is the header which we do at the end */
+ ring_len -= 32;
+ i = 1;
+
+ while (ring_len > 0) {
+ ring_len -= bits;
+ if (set_pulse) {
+ scan_data_addr |= 0x4000;
+ set_pulse = 0;
+ } else
+ scan_data_addr &= ~0x4000ULL;
+
+ scan_data_addr &= ~0xffull;
+ scan_data_addr |= bits;
+ pib_read(&chiplet->target, scan_data_addr, &data);
+
+ /* Discard lower 32 bits */
+ /* TODO: We always read 64-bits from the ring on P9 so we could
+ * optimise here by reading 64-bits at a time, but I'm not
+ * confident I've figured that out and 32-bits is what Hostboot
+ * does and seems to work. */
+ data >>= 32;
+
+ /* Left-align data */
+ data <<= 32 - bits;
+ result[i++] = data;
+ if (ring_len > 0 && (ring_len < bits))
+ bits = ring_len;
+ }
+
+ pib_read(&chiplet->target, scan_header_addr | 0x20, &data);
+ data &= 0xffffffff00000000;
+ result[0] = data >> 32;
+ if (data != HEADER_CHECK_DATA)
+ printf("WARNING: Header check failed. Make sure you specified the right ring length!\n"
+ "Ring data is probably corrupt now.\n");
+
+ return 0;
+}
+
+#define NET_CTRL0 0xf0040
+#define NET_CTRL0_CHIPLET_ENABLE PPC_BIT(0)
+static int p9_chiplet_probe(struct pdbg_target *target)
+{
+ uint64_t value;
+
+ if (pib_read(target, NET_CTRL0, &value))
+ return -1;
+
+ if (!(value & NET_CTRL0_CHIPLET_ENABLE))
+ return -1;
+
+ return 0;
+}
+
+static uint64_t p9_chiplet_translate(struct pdbg_target *target, uint64_t addr)
+{
+ return (addr & 0xffffffffc0ffffffULL) + pdbg_target_address(target, NULL);
+}
+
+static struct chiplet p9_chiplet = {
+ .target = {
+ .name = "POWER9 Chiplet",
+ .compatible = "ibm,power9-chiplet",
+ .class = "chiplet",
+ .probe = p9_chiplet_probe,
+ .translate = p9_chiplet_translate,
+ },
+ .getring = p9_chiplet_getring,
+};
+DECLARE_HW_UNIT(p9_chiplet);
+
__attribute__((constructor))
static void register_p9_fapi_targets(void)
{
@@ -635,4 +734,5 @@ static void register_p9_fapi_targets(void)
pdbg_hwunit_register(&p9_iohs_hw_unit);
pdbg_hwunit_register(&p9_fc_hw_unit);
pdbg_hwunit_register(&p9_pauc_hw_unit);
+ pdbg_hwunit_register(&p9_chiplet_hw_unit);
}
diff --git a/libpdbg/p9chip.c b/libpdbg/p9chip.c
index 8f76295..e5169ab 100644
--- a/libpdbg/p9chip.c
+++ b/libpdbg/p9chip.c
@@ -443,73 +443,6 @@ static struct thread p9_thread = {
};
DECLARE_HW_UNIT(p9_thread);
-#define HEADER_CHECK_DATA ((uint64_t) 0xc0ffee03 << 32)
-
-static int p9_chiplet_getring(struct chiplet *chiplet, uint64_t ring_addr, int64_t ring_len, uint32_t result[])
-{
- uint64_t scan_type_addr;
- uint64_t scan_data_addr;
- uint64_t scan_header_addr;
- uint64_t scan_type_data;
- uint64_t set_pulse = 1;
- uint64_t bits = 32;
- uint64_t data;
-
- /* We skip the first word in the results so we can write it later as it
- * should contain the header read out at the end */
- int i = 0;
-
- scan_type_addr = (ring_addr & 0x7fff0000) | 0x7;
- scan_data_addr = (scan_type_addr & 0xffff0000) | 0x8000;
- scan_header_addr = scan_data_addr & 0xffffe000;
-
- scan_type_data = (ring_addr & 0xfff0) << 13;
- scan_type_data |= 0x800 >> (ring_addr & 0xf);
- scan_type_data <<= 32;
-
- pib_write(&chiplet->target, scan_type_addr, scan_type_data);
- pib_write(&chiplet->target, scan_header_addr, HEADER_CHECK_DATA);
-
- /* The final 32 bit read is the header which we do at the end */
- ring_len -= 32;
- i = 1;
-
- while (ring_len > 0) {
- ring_len -= bits;
- if (set_pulse) {
- scan_data_addr |= 0x4000;
- set_pulse = 0;
- } else
- scan_data_addr &= ~0x4000ULL;
-
- scan_data_addr &= ~0xffull;
- scan_data_addr |= bits;
- pib_read(&chiplet->target, scan_data_addr, &data);
-
- /* Discard lower 32 bits */
- /* TODO: We always read 64-bits from the ring on P9 so we could
- * optimise here by reading 64-bits at a time, but I'm not
- * confident I've figured that out and 32-bits is what Hostboot
- * does and seems to work. */
- data >>= 32;
-
- /* Left-align data */
- data <<= 32 - bits;
- result[i++] = data;
- if (ring_len > 0 && (ring_len < bits))
- bits = ring_len;
- }
-
- pib_read(&chiplet->target, scan_header_addr | 0x20, &data);
- data &= 0xffffffff00000000;
- result[0] = data >> 32;
- if (data != HEADER_CHECK_DATA)
- printf("WARNING: Header check failed. Make sure you specified the right ring length!\n"
- "Ring data is probably corrupt now.\n");
-
- return 0;
-}
-
static int p9_core_probe(struct pdbg_target *target)
{
struct core *core = target_to_core(target);
@@ -584,40 +517,9 @@ static struct core p9_core = {
};
DECLARE_HW_UNIT(p9_core);
-static int p9_chiplet_probe(struct pdbg_target *target)
-{
- uint64_t value;
-
- if (pib_read(target, NET_CTRL0, &value))
- return -1;
-
- if (!(value & NET_CTRL0_CHIPLET_ENABLE))
- return -1;
-
- return 0;
-}
-
-static uint64_t p9_chiplet_translate(struct pdbg_target *target, uint64_t addr)
-{
- return (addr & 0xffffffffc0ffffffULL) + pdbg_target_address(target, NULL);
-}
-
-static struct chiplet p9_chiplet = {
- .target = {
- .name = "POWER9 Chiplet",
- .compatible = "ibm,power9-chiplet",
- .class = "chiplet",
- .probe = p9_chiplet_probe,
- .translate = p9_chiplet_translate,
- },
- .getring = p9_chiplet_getring,
-};
-DECLARE_HW_UNIT(p9_chiplet);
-
__attribute__((constructor))
static void register_p9chip(void)
{
pdbg_hwunit_register(&p9_thread_hw_unit);
pdbg_hwunit_register(&p9_core_hw_unit);
- pdbg_hwunit_register(&p9_chiplet_hw_unit);
}
--
2.20.1
More information about the Pdbg
mailing list