[Pdbg] [PATCH v2 05/16] libpdbg: Add xbus hardware unit

Alistair Popple alistair at popple.id.au
Wed Nov 7 16:39:32 AEDT 2018


Signed-off-by: Alistair Popple <alistair at popple.id.au>
---
 Makefile.am      |  3 ++-
 libpdbg/target.h |  5 +++++
 libpdbg/xbus.c   | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 69 insertions(+), 1 deletion(-)
 create mode 100644 libpdbg/xbus.c

diff --git a/Makefile.am b/Makefile.am
index 41a030d..94a112d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -163,7 +163,8 @@ libpdbg_la_SOURCES = \
 	libpdbg/p8chip.c \
 	libpdbg/p9chip.c \
 	libpdbg/target.c \
-	libpdbg/target.h
+	libpdbg/target.h \
+	libpdbg/xbus.c
 
 libpdbg_la_LIBADD = libfdt.la
 
diff --git a/libpdbg/target.h b/libpdbg/target.h
index 289c1ee..258c576 100644
--- a/libpdbg/target.h
+++ b/libpdbg/target.h
@@ -173,4 +173,9 @@ struct chiplet {
 };
 #define target_to_chiplet(x) container_of(x, struct chiplet, target)
 
+struct xbus {
+	struct pdbg_target target;
+	uint32_t ring_id;
+};
+#define target_to_xbus(x) container_of(x, struct xbus, target)
 #endif
diff --git a/libpdbg/xbus.c b/libpdbg/xbus.c
new file mode 100644
index 0000000..69489bb
--- /dev/null
+++ b/libpdbg/xbus.c
@@ -0,0 +1,62 @@
+/* Copyright 2018 IBM Corp.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * 	http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <inttypes.h>
+
+#include "target.h"
+#include "bitutils.h"
+
+/* XBus addressing is more complicated. This comes from p9_scominfo.C
+ * in the ekb. */
+static uint64_t xbus_translate(struct xbus *xbus, uint64_t addr)
+{
+	uint64_t ring = (addr >> 10) & 0xf;
+
+	if (ring >= 0x3 && ring <= 0x5)
+		addr = SETFIELD(PPC_BITMASK(50, 53), addr, 0x3 + xbus->ring_id);
+	else if (ring >= 0x6 && ring <= 8)
+		addr = SETFIELD(PPC_BITMASK(50, 53), addr, 0x6 + xbus->ring_id);
+
+	return addr;
+}
+
+static int xbus_probe(struct pdbg_target *target)
+{
+	struct xbus *xbus = target_to_xbus(target);
+
+	if (pdbg_get_target_u32_property(&xbus->target, "ring-id", &xbus->ring_id)) {
+		printf("Unknown ring-id on %s@%d\n", pdbg_target_name(&xbus->target),
+		       pdbg_target_index(&xbus->target));
+		return -1;
+	}
+
+	return 0;
+}
+
+struct xbus p9_xbus = {
+        .target = {
+                .name = "POWER9 XBus",
+                .compatible = "ibm,xbus",
+                .class = "xbus",
+		.probe = xbus_probe,
+		.translate = translate_cast(xbus_translate),
+        },
+};
+DECLARE_HW_UNIT(p9_xbus);
-- 
2.11.0



More information about the Pdbg mailing list