The TrustZone peripheral protection controller (tz-ppc) sits between
peripherals and the main system. However this results in "info mtree"
looking at bit confusing, especially as the sequence numbers can
overlap and miss steps:
0000000000000000-ffffffffffffffff (prio -2, i/o): system
0000000000000000-00000000003fffff (prio 0, i/o): tz-mpc-upstream
0000000000400000-00000000007fffff (prio 0, i/o): alias ssram-0-alias @tz-mpc-upstream 0000000000000000-00000000003fffff
0000000028000000-00000000281fffff (prio 0, i/o): tz-mpc-upstream
0000000028200000-00000000283fffff (prio 0, i/o): tz-mpc-upstream
0000000040080000-0000000040080fff (prio 0, i/o): iotkit-secctl-ns-regs
0000000040100000-0000000040100fff (prio 0, i/o): tz-ppc-port[1]
0000000040101000-0000000040101fff (prio 0, i/o): tz-ppc-port[2]
0000000040102000-0000000040102fff (prio 0, i/o): tz-ppc-port[3]
0000000040103000-0000000040103fff (prio 0, i/o): tz-ppc-port[4]
0000000040110000-0000000040110fff (prio 0, i/o): tz-ppc-port[0]
0000000040111000-0000000040111fff (prio 0, i/o): tz-ppc-port[1]
0000000040112000-0000000040112fff (prio 0, i/o): tz-ppc-port[2]
0000000040113000-0000000040113fff (prio 0, i/o): tz-ppc-port[3]
0000000040200000-0000000040200fff (prio 0, i/o): tz-ppc-port[5]
0000000040201000-0000000040201fff (prio 0, i/o): tz-ppc-port[6]
0000000040202000-0000000040202fff (prio 0, i/o): tz-ppc-port[7]
0000000040203000-0000000040203fff (prio 0, i/o): tz-ppc-port[8]
0000000040204000-0000000040204fff (prio 0, i/o): tz-ppc-port[9]
0000000040205000-0000000040205fff (prio 0, i/o): tz-ppc-port[0]
0000000040206000-0000000040206fff (prio 0, i/o): tz-ppc-port[1]
0000000040207000-0000000040207fff (prio 0, i/o): tz-ppc-port[10]
0000000040208000-0000000040208fff (prio 0, i/o): tz-ppc-port[11]
0000000040209000-0000000040209fff (prio 0, i/o): tz-ppc-port[2]
000000004020a000-000000004020afff (prio 0, i/o): tz-ppc-port[3]
000000004020b000-000000004020bfff (prio 0, i/o): tz-ppc-port[4]
000000004020c000-000000004020cfff (prio 0, i/o): tz-ppc-port[12]
000000004020d000-000000004020dfff (prio 0, i/o): tz-ppc-port[13]
0000000040300000-0000000040300fff (prio 0, i/o): tz-ppc-port[0]
0000000040301000-0000000040301fff (prio 0, i/o): tz-ppc-port[1]
0000000040302000-0000000040302fff (prio 0, i/o): tz-ppc-port[2]
0000000041000000-000000004113ffff (prio 0, i/o): tz-ppc-port[0]
0000000042000000-00000000420000ff (prio 0, i/o): tz-ppc-port[5]
0000000048007000-0000000048007fff (prio -1000, i/o): FPGA NS PC
0000000050080000-0000000050080fff (prio 0, i/o): iotkit-secctl-s-regs
0000000058007000-0000000058007fff (prio 0, i/o): tz-ppc-port[0]
0000000058008000-0000000058008fff (prio 0, i/o): tz-ppc-port[1]
0000000058009000-0000000058009fff (prio 0, i/o): tz-ppc-port[2]
0000000080000000-0000000080ffffff (prio 0, ram): mps.ram
So as a quality of life feature lets expose the name of the underlying
region so we get something more useful:
0000000000000000-ffffffffffffffff (prio -2, i/o): system
0000000000000000-00000000003fffff (prio 0, i/o): tz-mpc-upstream
0000000000400000-00000000007fffff (prio 0, i/o): alias ssram-0-alias @tz-mpc-upstream 0000000000000000-00000000003fffff
0000000028000000-00000000281fffff (prio 0, i/o): tz-mpc-upstream
0000000028200000-00000000283fffff (prio 0, i/o): tz-mpc-upstream
0000000040080000-0000000040080fff (prio 0, i/o): iotkit-secctl-ns-regs
0000000040100000-0000000040100fff (prio 0, i/o): tz-ppc-port[gpio0]
0000000040101000-0000000040101fff (prio 0, i/o): tz-ppc-port[gpio1]
0000000040102000-0000000040102fff (prio 0, i/o): tz-ppc-port[gpio2]
0000000040103000-0000000040103fff (prio 0, i/o): tz-ppc-port[gpio3]
0000000040110000-0000000040110fff (prio 0, i/o): tz-ppc-port[pl080]
0000000040111000-0000000040111fff (prio 0, i/o): tz-ppc-port[pl080]
0000000040112000-0000000040112fff (prio 0, i/o): tz-ppc-port[pl080]
0000000040113000-0000000040113fff (prio 0, i/o): tz-ppc-port[pl080]
0000000040200000-0000000040200fff (prio 0, i/o): tz-ppc-port[uart]
0000000040201000-0000000040201fff (prio 0, i/o): tz-ppc-port[uart]
0000000040202000-0000000040202fff (prio 0, i/o): tz-ppc-port[uart]
0000000040203000-0000000040203fff (prio 0, i/o): tz-ppc-port[uart]
0000000040204000-0000000040204fff (prio 0, i/o): tz-ppc-port[uart]
0000000040205000-0000000040205fff (prio 0, i/o): tz-ppc-port[pl022]
0000000040206000-0000000040206fff (prio 0, i/o): tz-ppc-port[pl022]
0000000040207000-0000000040207fff (prio 0, i/o): tz-ppc-port[arm_sbcon_i2c]
0000000040208000-0000000040208fff (prio 0, i/o): tz-ppc-port[arm_sbcon_i2c]
0000000040209000-0000000040209fff (prio 0, i/o): tz-ppc-port[pl022]
000000004020a000-000000004020afff (prio 0, i/o): tz-ppc-port[pl022]
000000004020b000-000000004020bfff (prio 0, i/o): tz-ppc-port[pl022]
000000004020c000-000000004020cfff (prio 0, i/o): tz-ppc-port[arm_sbcon_i2c]
000000004020d000-000000004020dfff (prio 0, i/o): tz-ppc-port[arm_sbcon_i2c]
0000000040300000-0000000040300fff (prio 0, i/o): tz-ppc-port[mps2-scc]
0000000040301000-0000000040301fff (prio 0, i/o): tz-ppc-port[i2s-audio]
0000000040302000-0000000040302fff (prio 0, i/o): tz-ppc-port[mps2-fpgaio]
0000000041000000-000000004113ffff (prio 0, i/o): tz-ppc-port[gfx]
0000000042000000-00000000420000ff (prio 0, i/o): tz-ppc-port[lan9118-mmio]
0000000048007000-0000000048007fff (prio -1000, i/o): FPGA NS PC
0000000050080000-0000000050080fff (prio 0, i/o): iotkit-secctl-s-regs
0000000058007000-0000000058007fff (prio 0, i/o): tz-ppc-port[tz-mpc-regs]
0000000058008000-0000000058008fff (prio 0, i/o): tz-ppc-port[tz-mpc-regs]
0000000058009000-0000000058009fff (prio 0, i/o): tz-ppc-port[tz-mpc-regs]
0000000080000000-0000000080ffffff (prio 0, ram): mps.ram
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Cc: Jim MacArthur <jim.macarthur@linaro.org>
---
hw/misc/tz-ppc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hw/misc/tz-ppc.c b/hw/misc/tz-ppc.c
index e4235a846d4..fd305f9f62f 100644
--- a/hw/misc/tz-ppc.c
+++ b/hw/misc/tz-ppc.c
@@ -273,7 +273,7 @@ static void tz_ppc_realize(DeviceState *dev, Error **errp)
continue;
}
- name = g_strdup_printf("tz-ppc-port[%d]", i);
+ name = g_strdup_printf("tz-ppc-port[%s]", memory_region_name(port->downstream));
port->ppc = s;
address_space_init(&port->downstream_as, port->downstream, name);
--
2.47.3
On Mon, 15 Dec 2025 at 17:05, Alex Bennée <alex.bennee@linaro.org> wrote: > > The TrustZone peripheral protection controller (tz-ppc) sits between > peripherals and the main system. However this results in "info mtree" > looking at bit confusing, especially as the sequence numbers can > overlap and miss steps: > > 0000000000000000-ffffffffffffffff (prio -2, i/o): system > 0000000000000000-00000000003fffff (prio 0, i/o): tz-mpc-upstream > 0000000000400000-00000000007fffff (prio 0, i/o): alias ssram-0-alias @tz-mpc-upstream 0000000000000000-00000000003fffff > 0000000028000000-00000000281fffff (prio 0, i/o): tz-mpc-upstream > 0000000028200000-00000000283fffff (prio 0, i/o): tz-mpc-upstream > 0000000040080000-0000000040080fff (prio 0, i/o): iotkit-secctl-ns-regs > 0000000040100000-0000000040100fff (prio 0, i/o): tz-ppc-port[1] > 0000000040101000-0000000040101fff (prio 0, i/o): tz-ppc-port[2] > 0000000040102000-0000000040102fff (prio 0, i/o): tz-ppc-port[3] > 0000000040103000-0000000040103fff (prio 0, i/o): tz-ppc-port[4] > 0000000040110000-0000000040110fff (prio 0, i/o): tz-ppc-port[0] > 0000000040111000-0000000040111fff (prio 0, i/o): tz-ppc-port[1] > So as a quality of life feature lets expose the name of the underlying > region so we get something more useful: > > 0000000000000000-ffffffffffffffff (prio -2, i/o): system > 0000000000000000-00000000003fffff (prio 0, i/o): tz-mpc-upstream > 0000000000400000-00000000007fffff (prio 0, i/o): alias ssram-0-alias @tz-mpc-upstream 0000000000000000-00000000003fffff > 0000000028000000-00000000281fffff (prio 0, i/o): tz-mpc-upstream > 0000000028200000-00000000283fffff (prio 0, i/o): tz-mpc-upstream > 0000000040080000-0000000040080fff (prio 0, i/o): iotkit-secctl-ns-regs > 0000000040100000-0000000040100fff (prio 0, i/o): tz-ppc-port[gpio0] > 0000000040101000-0000000040101fff (prio 0, i/o): tz-ppc-port[gpio1] > 0000000040102000-0000000040102fff (prio 0, i/o): tz-ppc-port[gpio2] > 0000000040103000-0000000040103fff (prio 0, i/o): tz-ppc-port[gpio3] Maybe we should print both the port number and the downstream device, so eg tz-ppc-port[1:gpio0], etc ? Especially for the uart ports this would disambiguate: > 0000000040200000-0000000040200fff (prio 0, i/o): tz-ppc-port[uart] > 0000000040201000-0000000040201fff (prio 0, i/o): tz-ppc-port[uart] > 0000000040202000-0000000040202fff (prio 0, i/o): tz-ppc-port[uart] > 0000000040203000-0000000040203fff (prio 0, i/o): tz-ppc-port[uart] > 0000000040204000-0000000040204fff (prio 0, i/o): tz-ppc-port[uart] (and if you are actually programming the thing then knowing which port is which might be helpful). The other thing that is confusing in this output is that there are multiple TYPE_TZ_PPC devices in this system, but we don't have any indication of that in the output. (This is why the port numbers repeat: port 1 on one TZ_PPC is different from port 1 on a different TZ_PPC.) I was going to suggest that we could make "info mtree" print the owner of the MR, but it looks like we already have that, we just don't document it: there's an "owner=' suboption that can be set to true... thanks -- PMM
On 15/12/25 18:05, Alex Bennée wrote: > The TrustZone peripheral protection controller (tz-ppc) sits between > peripherals and the main system. However this results in "info mtree" > looking at bit confusing, especially as the sequence numbers can > overlap and miss steps: > > 0000000000000000-ffffffffffffffff (prio -2, i/o): system > 0000000000000000-00000000003fffff (prio 0, i/o): tz-mpc-upstream > 0000000000400000-00000000007fffff (prio 0, i/o): alias ssram-0-alias @tz-mpc-upstream 0000000000000000-00000000003fffff > 0000000028000000-00000000281fffff (prio 0, i/o): tz-mpc-upstream > 0000000028200000-00000000283fffff (prio 0, i/o): tz-mpc-upstream > 0000000040080000-0000000040080fff (prio 0, i/o): iotkit-secctl-ns-regs > 0000000040100000-0000000040100fff (prio 0, i/o): tz-ppc-port[1] > 0000000040101000-0000000040101fff (prio 0, i/o): tz-ppc-port[2] > 0000000040102000-0000000040102fff (prio 0, i/o): tz-ppc-port[3] > 0000000040103000-0000000040103fff (prio 0, i/o): tz-ppc-port[4] > 0000000040110000-0000000040110fff (prio 0, i/o): tz-ppc-port[0] > 0000000040111000-0000000040111fff (prio 0, i/o): tz-ppc-port[1] > 0000000040112000-0000000040112fff (prio 0, i/o): tz-ppc-port[2] > 0000000040113000-0000000040113fff (prio 0, i/o): tz-ppc-port[3] > 0000000040200000-0000000040200fff (prio 0, i/o): tz-ppc-port[5] > 0000000040201000-0000000040201fff (prio 0, i/o): tz-ppc-port[6] > 0000000040202000-0000000040202fff (prio 0, i/o): tz-ppc-port[7] > 0000000040203000-0000000040203fff (prio 0, i/o): tz-ppc-port[8] > 0000000040204000-0000000040204fff (prio 0, i/o): tz-ppc-port[9] > 0000000040205000-0000000040205fff (prio 0, i/o): tz-ppc-port[0] > 0000000040206000-0000000040206fff (prio 0, i/o): tz-ppc-port[1] > 0000000040207000-0000000040207fff (prio 0, i/o): tz-ppc-port[10] > 0000000040208000-0000000040208fff (prio 0, i/o): tz-ppc-port[11] > 0000000040209000-0000000040209fff (prio 0, i/o): tz-ppc-port[2] > 000000004020a000-000000004020afff (prio 0, i/o): tz-ppc-port[3] > 000000004020b000-000000004020bfff (prio 0, i/o): tz-ppc-port[4] > 000000004020c000-000000004020cfff (prio 0, i/o): tz-ppc-port[12] > 000000004020d000-000000004020dfff (prio 0, i/o): tz-ppc-port[13] > 0000000040300000-0000000040300fff (prio 0, i/o): tz-ppc-port[0] > 0000000040301000-0000000040301fff (prio 0, i/o): tz-ppc-port[1] > 0000000040302000-0000000040302fff (prio 0, i/o): tz-ppc-port[2] > 0000000041000000-000000004113ffff (prio 0, i/o): tz-ppc-port[0] > 0000000042000000-00000000420000ff (prio 0, i/o): tz-ppc-port[5] > 0000000048007000-0000000048007fff (prio -1000, i/o): FPGA NS PC > 0000000050080000-0000000050080fff (prio 0, i/o): iotkit-secctl-s-regs > 0000000058007000-0000000058007fff (prio 0, i/o): tz-ppc-port[0] > 0000000058008000-0000000058008fff (prio 0, i/o): tz-ppc-port[1] > 0000000058009000-0000000058009fff (prio 0, i/o): tz-ppc-port[2] > 0000000080000000-0000000080ffffff (prio 0, ram): mps.ram > > So as a quality of life feature lets expose the name of the underlying > region so we get something more useful: > > 0000000000000000-ffffffffffffffff (prio -2, i/o): system > 0000000000000000-00000000003fffff (prio 0, i/o): tz-mpc-upstream > 0000000000400000-00000000007fffff (prio 0, i/o): alias ssram-0-alias @tz-mpc-upstream 0000000000000000-00000000003fffff > 0000000028000000-00000000281fffff (prio 0, i/o): tz-mpc-upstream > 0000000028200000-00000000283fffff (prio 0, i/o): tz-mpc-upstream > 0000000040080000-0000000040080fff (prio 0, i/o): iotkit-secctl-ns-regs > 0000000040100000-0000000040100fff (prio 0, i/o): tz-ppc-port[gpio0] > 0000000040101000-0000000040101fff (prio 0, i/o): tz-ppc-port[gpio1] > 0000000040102000-0000000040102fff (prio 0, i/o): tz-ppc-port[gpio2] > 0000000040103000-0000000040103fff (prio 0, i/o): tz-ppc-port[gpio3] > 0000000040110000-0000000040110fff (prio 0, i/o): tz-ppc-port[pl080] > 0000000040111000-0000000040111fff (prio 0, i/o): tz-ppc-port[pl080] > 0000000040112000-0000000040112fff (prio 0, i/o): tz-ppc-port[pl080] > 0000000040113000-0000000040113fff (prio 0, i/o): tz-ppc-port[pl080] > 0000000040200000-0000000040200fff (prio 0, i/o): tz-ppc-port[uart] > 0000000040201000-0000000040201fff (prio 0, i/o): tz-ppc-port[uart] > 0000000040202000-0000000040202fff (prio 0, i/o): tz-ppc-port[uart] > 0000000040203000-0000000040203fff (prio 0, i/o): tz-ppc-port[uart] > 0000000040204000-0000000040204fff (prio 0, i/o): tz-ppc-port[uart] > 0000000040205000-0000000040205fff (prio 0, i/o): tz-ppc-port[pl022] > 0000000040206000-0000000040206fff (prio 0, i/o): tz-ppc-port[pl022] > 0000000040207000-0000000040207fff (prio 0, i/o): tz-ppc-port[arm_sbcon_i2c] > 0000000040208000-0000000040208fff (prio 0, i/o): tz-ppc-port[arm_sbcon_i2c] > 0000000040209000-0000000040209fff (prio 0, i/o): tz-ppc-port[pl022] > 000000004020a000-000000004020afff (prio 0, i/o): tz-ppc-port[pl022] > 000000004020b000-000000004020bfff (prio 0, i/o): tz-ppc-port[pl022] > 000000004020c000-000000004020cfff (prio 0, i/o): tz-ppc-port[arm_sbcon_i2c] > 000000004020d000-000000004020dfff (prio 0, i/o): tz-ppc-port[arm_sbcon_i2c] > 0000000040300000-0000000040300fff (prio 0, i/o): tz-ppc-port[mps2-scc] > 0000000040301000-0000000040301fff (prio 0, i/o): tz-ppc-port[i2s-audio] > 0000000040302000-0000000040302fff (prio 0, i/o): tz-ppc-port[mps2-fpgaio] > 0000000041000000-000000004113ffff (prio 0, i/o): tz-ppc-port[gfx] > 0000000042000000-00000000420000ff (prio 0, i/o): tz-ppc-port[lan9118-mmio] > 0000000048007000-0000000048007fff (prio -1000, i/o): FPGA NS PC > 0000000050080000-0000000050080fff (prio 0, i/o): iotkit-secctl-s-regs > 0000000058007000-0000000058007fff (prio 0, i/o): tz-ppc-port[tz-mpc-regs] > 0000000058008000-0000000058008fff (prio 0, i/o): tz-ppc-port[tz-mpc-regs] > 0000000058009000-0000000058009fff (prio 0, i/o): tz-ppc-port[tz-mpc-regs] > 0000000080000000-0000000080ffffff (prio 0, ram): mps.ram > > Signed-off-by: Alex Bennée <alex.bennee@linaro.org> > Cc: Jim MacArthur <jim.macarthur@linaro.org> > --- > hw/misc/tz-ppc.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
© 2016 - 2026 Red Hat, Inc.