[Pdbg] [PATCH] libpdbg: Add xbus hardware unit
Alistair Popple
alistair at popple.id.au
Tue Oct 23 14:35:26 AEDT 2018
Signed-off-by: Alistair Popple <alistair at popple.id.au>
---
Makefile.am | 1 +
libpdbg/target.h | 6 ++++++
libpdbg/xbus.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 69 insertions(+)
create mode 100644 libpdbg/xbus.c
diff --git a/Makefile.am b/Makefile.am
index 0d451d3..1bed1c2 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -116,6 +116,7 @@ libfdt_la_SOURCES = \
libpdbg_la_SOURCES = \
libpdbg/libpdbg.c \
+ libpdbg/xbus.c \
libpdbg/host.c \
libpdbg/kernel.c \
libpdbg/fake.c \
diff --git a/libpdbg/target.h b/libpdbg/target.h
index 1cb6b13..258c576 100644
--- a/libpdbg/target.h
+++ b/libpdbg/target.h
@@ -172,4 +172,10 @@ struct chiplet {
int (*getring)(struct chiplet *, uint64_t, int64_t, uint32_t[]);
};
#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..b6e190d
--- /dev/null
+++ b/libpdbg/xbus.c
@@ -0,0 +1,62 @@
+/* Copyright 2016 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 drunk. Which is to say that it is different. 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_BITMASK32(18, 21), addr, 0x3 + xbus->ring_id);
+ else if (ring >= 0x6 && ring <= 8)
+ addr = SETFIELD(PPC_BITMASK32(18, 21), 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