qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH for-1.7 1/3] sun4m: Add FCode ROM for TCX frameb


From: Artyom Tarasenko
Subject: Re: [Qemu-devel] [PATCH for-1.7 1/3] sun4m: Add FCode ROM for TCX framebuffer
Date: Thu, 19 Dec 2013 13:59:54 +0100

Hi Mark,

this patch breaks booting with OBP:

Probing /address@hidden,10000000/address@hidden,10001000 at 5,0  espdma esp sd 
st
SUNW,bpp ledma le
Probing /address@hidden,10000000/address@hidden,10001000 at 4,0  SUNW,CS4231 
power-management
Probing /address@hidden,10000000/address@hidden,10001000 at 1,0  Nothing there
Probing /address@hidden,10000000/address@hidden,10001000 at 2,0  Nothing there
Probing /address@hidden,10000000/address@hidden,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
<address@hidden> 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 <address@hidden>
> CC: Blue Swirl <address@hidden>
> CC: Bob Breuer <address@hidden>
> CC: Artyom Tarasenko <address@hidden>
> ---
>  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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]