Hi Mark, this patch breaks booting with OBP:
Probing /iommu@0,10000000/sbus@0,10001000 at 5,0 espdma esp sd st SUNW,bpp ledma le Probing /iommu@0,10000000/sbus@0,10001000 at 4,0 SUNW,CS4231 power-management Probing /iommu@0,10000000/sbus@0,10001000 at 1,0 Nothing there Probing /iommu@0,10000000/sbus@0,10001000 at 2,0 Nothing there Probing /iommu@0,10000000/sbus@0,10001000 at 3,0 SUNW,tcx Memory Address not Aligned ^^^^ After the unaligned access OBP is not properly initialized. See the bug 1262081, reported by Peter Bartoli. Artyom On Sat, Nov 2, 2013 at 5:03 PM, Mark Cave-Ayland <mark.cave-ayl...@ilande.co.uk> wrote: > Upstream OpenBIOS now implements SBus probing in order to determine the > contents of a physical bus slot, which is required to allow OpenBIOS to > identify the framebuffer without help from the fw_cfg interface. > > SBus probing works by detecting the presence of an FCode program > (effectively tokenised Forth) at the base address of each slot, and if > present executes it so that it creates its own device node in the > OpenBIOS device tree. > > The FCode ROM is generated as part of the OpenBIOS build and should > generally be updated at the same time. > > Signed-off-by: Mark Cave-Ayland <mark.cave-ayl...@ilande.co.uk> > CC: Blue Swirl <blauwir...@gmail.com> > CC: Bob Breuer <breu...@mc.net> > CC: Artyom Tarasenko <atar4q...@gmail.com> > --- > Makefile | 2 +- > hw/display/tcx.c | 27 ++++++++++++++++++++++++++- > hw/sparc/sun4m.c | 17 ++++++++++------- > pc-bios/QEMU,tcx.bin | Bin 0 -> 1242 bytes > pc-bios/README | 4 ++-- > 5 files changed, 39 insertions(+), 11 deletions(-) > create mode 100644 pc-bios/QEMU,tcx.bin > > diff --git a/Makefile b/Makefile > index b15003f..3235039 100644 > --- a/Makefile > +++ b/Makefile > @@ -286,7 +286,7 @@ ifdef INSTALL_BLOBS > BLOBS=bios.bin sgabios.bin vgabios.bin vgabios-cirrus.bin \ > vgabios-stdvga.bin vgabios-vmware.bin vgabios-qxl.bin \ > acpi-dsdt.aml q35-acpi-dsdt.aml \ > -ppc_rom.bin openbios-sparc32 openbios-sparc64 openbios-ppc \ > +ppc_rom.bin openbios-sparc32 openbios-sparc64 openbios-ppc QEMU,tcx.bin \ > pxe-e1000.rom pxe-eepro100.rom pxe-ne2k_pci.rom \ > pxe-pcnet.rom pxe-rtl8139.rom pxe-virtio.rom \ > efi-e1000.rom efi-eepro100.rom efi-ne2k_pci.rom \ > diff --git a/hw/display/tcx.c b/hw/display/tcx.c > index 24876d3..06bf66f 100644 > --- a/hw/display/tcx.c > +++ b/hw/display/tcx.c > @@ -25,8 +25,12 @@ > #include "qemu-common.h" > #include "ui/console.h" > #include "ui/pixel_ops.h" > +#include "hw/loader.h" > #include "hw/sysbus.h" > > +#define TCX_ROM_FILE "QEMU,tcx.bin" > +#define FCODE_MAX_ROM_SIZE 0x10000 > + > #define MAXX 1024 > #define MAXY 768 > #define TCX_DAC_NREGS 16 > @@ -43,6 +47,8 @@ typedef struct TCXState { > QemuConsole *con; > uint8_t *vram; > uint32_t *vram24, *cplane; > + hwaddr prom_addr; > + MemoryRegion rom; > MemoryRegion vram_mem; > MemoryRegion vram_8bit; > MemoryRegion vram_24bit; > @@ -529,14 +535,32 @@ static int tcx_init1(SysBusDevice *dev) > { > TCXState *s = TCX(dev); > ram_addr_t vram_offset = 0; > - int size; > + int size, ret; > uint8_t *vram_base; > + char *fcode_filename; > > memory_region_init_ram(&s->vram_mem, OBJECT(s), "tcx.vram", > s->vram_size * (1 + 4 + 4)); > vmstate_register_ram_global(&s->vram_mem); > vram_base = memory_region_get_ram_ptr(&s->vram_mem); > > + /* FCode ROM */ > + memory_region_init_ram(&s->rom, NULL, "tcx.prom", FCODE_MAX_ROM_SIZE); > + vmstate_register_ram_global(&s->rom); > + memory_region_set_readonly(&s->rom, true); > + sysbus_init_mmio(dev, &s->rom); > + > + fcode_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, TCX_ROM_FILE); > + if (fcode_filename) { > + ret = load_image_targphys(fcode_filename, s->prom_addr, > + FCODE_MAX_ROM_SIZE); > + } > + > + if (ret < 0 || ret > FCODE_MAX_ROM_SIZE) { > + fprintf(stderr, "tcx: could not load prom '%s'\n", TCX_ROM_FILE); > + return -1; > + } > + > /* 8-bit plane */ > s->vram = vram_base; > size = s->vram_size; > @@ -598,6 +622,7 @@ static Property tcx_properties[] = { > DEFINE_PROP_UINT16("width", TCXState, width, -1), > DEFINE_PROP_UINT16("height", TCXState, height, -1), > DEFINE_PROP_UINT16("depth", TCXState, depth, -1), > + DEFINE_PROP_HEX64("prom_addr", TCXState, prom_addr, -1), > DEFINE_PROP_END_OF_LIST(), > }; > > diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c > index a0d366c..94f7950 100644 > --- a/hw/sparc/sun4m.c > +++ b/hw/sparc/sun4m.c > @@ -537,24 +537,27 @@ static void tcx_init(hwaddr addr, int vram_size, int > width, > qdev_prop_set_uint16(dev, "width", width); > qdev_prop_set_uint16(dev, "height", height); > qdev_prop_set_uint16(dev, "depth", depth); > + qdev_prop_set_uint64(dev, "prom_addr", addr); > qdev_init_nofail(dev); > s = SYS_BUS_DEVICE(dev); > + /* FCode ROM */ > + sysbus_mmio_map(s, 0, addr); > /* 8-bit plane */ > - sysbus_mmio_map(s, 0, addr + 0x00800000ULL); > + sysbus_mmio_map(s, 1, addr + 0x00800000ULL); > /* DAC */ > - sysbus_mmio_map(s, 1, addr + 0x00200000ULL); > + sysbus_mmio_map(s, 2, addr + 0x00200000ULL); > /* TEC (dummy) */ > - sysbus_mmio_map(s, 2, addr + 0x00700000ULL); > + sysbus_mmio_map(s, 3, addr + 0x00700000ULL); > /* THC 24 bit: NetBSD writes here even with 8-bit display: dummy */ > - sysbus_mmio_map(s, 3, addr + 0x00301000ULL); > + sysbus_mmio_map(s, 4, addr + 0x00301000ULL); > if (depth == 24) { > /* 24-bit plane */ > - sysbus_mmio_map(s, 4, addr + 0x02000000ULL); > + sysbus_mmio_map(s, 5, addr + 0x02000000ULL); > /* Control plane */ > - sysbus_mmio_map(s, 5, addr + 0x0a000000ULL); > + sysbus_mmio_map(s, 6, addr + 0x0a000000ULL); > } else { > /* THC 8 bit (dummy) */ > - sysbus_mmio_map(s, 4, addr + 0x00300000ULL); > + sysbus_mmio_map(s, 5, addr + 0x00300000ULL); > } > } > > diff --git a/pc-bios/QEMU,tcx.bin b/pc-bios/QEMU,tcx.bin <cut> -- Regards, Artyom Tarasenko linux/sparc and solaris/sparc under qemu blog: http://tyom.blogspot.com/search/label/qemu