+
+ memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_i3c_ops, s,
+ TYPE_ASPEED_I3C, ASPEED_I3C_NR_REGS << 2);
+
+ sysbus_init_mmio(sbd, &s->iomem);
I would add a container region containing all the regions :
memory_region_init(&s->iomem_container, OBJECT(s),
TYPE_ASPEED_I3C ".container", 0x8000);
sysbus_init_mmio(sbd, &s->iomem_container);
memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_i3c_ops, s,
TYPE_ASPEED_I3C ".regs", 0x70);
memory_region_add_subregion(&s->iomem_container, 0x0, &s->iomem);
The goal is to have a stricter layout so that you can catch errors :
000000001e7a0000-000000001e7a7fff (prio 0, i/o): aspeed.i3c.container
000000001e7a0000-000000001e7a006f (prio 0, i/o): aspeed.i3c.regs
000000001e7a2000-000000001e7a22ff (prio 0, i/o): aspeed.i3c.device.0
000000001e7a3000-000000001e7a32ff (prio 0, i/o): aspeed.i3c.device.1
000000001e7a4000-000000001e7a42ff (prio 0, i/o): aspeed.i3c.device.2
000000001e7a5000-000000001e7a52ff (prio 0, i/o): aspeed.i3c.device.3
000000001e7a6000-000000001e7a62ff (prio 0, i/o): aspeed.i3c.device.4
000000001e7a7000-000000001e7a72ff (prio 0, i/o): aspeed.i3c.device.5
and if under U-Boot, you peek into unimplemented regs, you get a warning :
ast# md 1e7a0000
1e7a0000: 00000000 00000000 00000000 00000000 ................
1e7a0010: 00000000 00000000 00000000 00000000 ................
1e7a0020: 00000000 00000000 00000000 00000000 ................
1e7a0030: 00000000 00000000 00000000 00000000 ................
1e7a0040: 00000000 00000000 00000000 00000000 ................
1e7a0050: 00000000 00000000 00000000 00000000 ................
1e7a0060: 00000000 00000000 00000000 00000000 ................
1e7a0070:aspeed_soc.io: unimplemented device read (size 4, offset
0x1a0070)
00000000aspeed_soc.io: unimplemented device read (size 4, offset
0x1a0074)