diff options
| author | Alistair Popple <alistair@popple.id.au> | 2018-11-07 15:24:53 +1100 |
|---|---|---|
| committer | Alistair Popple <alistair@popple.id.au> | 2018-11-09 11:20:04 +1100 |
| commit | 38a52bfc56506b75b4e127c2b9cd8974a55107a6 (patch) | |
| tree | 9f3c4546c4697c1047fdcee4a1b7c65548a4f23c | |
| parent | 3d3c21524af1d4c41b07ed82d5c188cf01505506 (diff) | |
| download | pdbg-38a52bfc56506b75b4e127c2b9cd8974a55107a6.tar.gz pdbg-38a52bfc56506b75b4e127c2b9cd8974a55107a6.zip | |
libpdbg: Add xbus hardware unit
Signed-off-by: Alistair Popple <alistair@popple.id.au>
| -rw-r--r-- | Makefile.am | 3 | ||||
| -rw-r--r-- | libpdbg/target.h | 5 | ||||
| -rw-r--r-- | libpdbg/xbus.c | 62 |
3 files changed, 69 insertions, 1 deletions
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); |

