[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