qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCHv8 00/16] boot order specification
@ 2010-12-08 11:34 Gleb Natapov
  2010-12-08 11:34 ` [Qemu-devel] [PATCHv8 01/16] Introduce fw_name field to DeviceInfo structure Gleb Natapov
                   ` (17 more replies)
  0 siblings, 18 replies; 38+ messages in thread
From: Gleb Natapov @ 2010-12-08 11:34 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, kevin, kvm

Forget to save a couple of buffers before sending version 7 :(

Anthony, Blue can this be applied now?

Gleb Natapov (16):
  Introduce fw_name field to DeviceInfo structure.
  Introduce new BusInfo callback get_fw_dev_path.
  Keep track of ISA ports ISA device is using in qdev.
  Add get_fw_dev_path callback to ISA bus in qdev.
  Store IDE bus id in IDEBus structure for easy access.
  Add get_fw_dev_path callback to IDE bus.
  Add get_fw_dev_path callback for system bus.
  Add get_fw_dev_path callback for pci bus.
  Record which USBDevice USBPort belongs too.
  Add get_fw_dev_path callback for usb bus.
  Add get_fw_dev_path callback to scsi bus.
  Add bootindex parameter to net/block/fd device
  Change fw_cfg_add_file() to get full file path as a parameter.
  Add bootindex for option roms.
  Add notifier that will be called when machine is fully created.
  Pass boot device list to firmware.

 block_int.h       |    4 +-
 hw/cs4231a.c      |    1 +
 hw/e1000.c        |    4 ++
 hw/eepro100.c     |    3 +
 hw/fdc.c          |   12 ++++++
 hw/fw_cfg.c       |   30 ++++++++------
 hw/fw_cfg.h       |    4 +-
 hw/gus.c          |    4 ++
 hw/ide/cmd646.c   |    4 +-
 hw/ide/internal.h |    3 +-
 hw/ide/isa.c      |    5 ++-
 hw/ide/piix.c     |    4 +-
 hw/ide/qdev.c     |   22 ++++++++++-
 hw/ide/via.c      |    4 +-
 hw/isa-bus.c      |   42 +++++++++++++++++++
 hw/isa.h          |    4 ++
 hw/lance.c        |    1 +
 hw/loader.c       |   32 ++++++++++++---
 hw/loader.h       |    8 ++--
 hw/m48t59.c       |    1 +
 hw/mc146818rtc.c  |    1 +
 hw/multiboot.c    |    3 +-
 hw/ne2000-isa.c   |    3 +
 hw/ne2000.c       |    5 ++-
 hw/nseries.c      |    4 +-
 hw/palm.c         |    6 +-
 hw/parallel.c     |    5 ++
 hw/pc.c           |    7 ++-
 hw/pci.c          |  110 ++++++++++++++++++++++++++++++++++++++++-----------
 hw/pci_host.c     |    2 +
 hw/pckbd.c        |    3 +
 hw/pcnet-pci.c    |    2 +-
 hw/pcnet.c        |    4 ++
 hw/piix_pci.c     |    1 +
 hw/qdev.c         |   32 +++++++++++++++
 hw/qdev.h         |   14 ++++++
 hw/rtl8139.c      |    4 ++
 hw/sb16.c         |    4 ++
 hw/scsi-bus.c     |   23 +++++++++++
 hw/scsi-disk.c    |    2 +
 hw/serial.c       |    1 +
 hw/sysbus.c       |   30 ++++++++++++++
 hw/sysbus.h       |    4 ++
 hw/usb-bus.c      |   45 ++++++++++++++++++++-
 hw/usb-hub.c      |    3 +-
 hw/usb-musb.c     |    2 +-
 hw/usb-net.c      |    3 +
 hw/usb-ohci.c     |    2 +-
 hw/usb-uhci.c     |    2 +-
 hw/usb.h          |    3 +-
 hw/virtio-blk.c   |    2 +
 hw/virtio-net.c   |    2 +
 hw/virtio-pci.c   |    1 +
 net.h             |    4 +-
 qemu-config.c     |   17 ++++++++
 sysemu.h          |   11 +++++-
 vl.c              |  114 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 57 files changed, 593 insertions(+), 80 deletions(-)

-- 
1.7.2.3

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [Qemu-devel] [PATCHv8 01/16] Introduce fw_name field to DeviceInfo structure.
  2010-12-08 11:34 [Qemu-devel] [PATCHv8 00/16] boot order specification Gleb Natapov
@ 2010-12-08 11:34 ` Gleb Natapov
  2010-12-08 11:34 ` [Qemu-devel] [PATCHv8 02/16] Introduce new BusInfo callback get_fw_dev_path Gleb Natapov
                   ` (16 subsequent siblings)
  17 siblings, 0 replies; 38+ messages in thread
From: Gleb Natapov @ 2010-12-08 11:34 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, kevin, kvm

Add "fw_name" to DeviceInfo to use in device path building. In
contrast to "name" "fw_name" should refer to functionality device
provides instead of particular device model like "name" does.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
---
 hw/fdc.c        |    1 +
 hw/ide/isa.c    |    1 +
 hw/ide/qdev.c   |    1 +
 hw/isa-bus.c    |    1 +
 hw/lance.c      |    1 +
 hw/piix_pci.c   |    1 +
 hw/qdev.h       |    6 ++++++
 hw/scsi-disk.c  |    1 +
 hw/usb-hub.c    |    1 +
 hw/usb-net.c    |    1 +
 hw/virtio-pci.c |    1 +
 11 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/hw/fdc.c b/hw/fdc.c
index c159dcb..a467c4b 100644
--- a/hw/fdc.c
+++ b/hw/fdc.c
@@ -2040,6 +2040,7 @@ static const VMStateDescription vmstate_isa_fdc ={
 static ISADeviceInfo isa_fdc_info = {
     .init = isabus_fdc_init1,
     .qdev.name  = "isa-fdc",
+    .qdev.fw_name  = "fdc",
     .qdev.size  = sizeof(FDCtrlISABus),
     .qdev.no_user = 1,
     .qdev.vmsd  = &vmstate_isa_fdc,
diff --git a/hw/ide/isa.c b/hw/ide/isa.c
index 6b57e0d..9856435 100644
--- a/hw/ide/isa.c
+++ b/hw/ide/isa.c
@@ -98,6 +98,7 @@ ISADevice *isa_ide_init(int iobase, int iobase2, int isairq,
 
 static ISADeviceInfo isa_ide_info = {
     .qdev.name  = "isa-ide",
+    .qdev.fw_name  = "ide",
     .qdev.size  = sizeof(ISAIDEState),
     .init       = isa_ide_initfn,
     .qdev.reset = isa_ide_reset,
diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c
index 0808760..6d27b60 100644
--- a/hw/ide/qdev.c
+++ b/hw/ide/qdev.c
@@ -134,6 +134,7 @@ static int ide_drive_initfn(IDEDevice *dev)
 
 static IDEDeviceInfo ide_drive_info = {
     .qdev.name  = "ide-drive",
+    .qdev.fw_name  = "drive",
     .qdev.size  = sizeof(IDEDrive),
     .init       = ide_drive_initfn,
     .qdev.props = (Property[]) {
diff --git a/hw/isa-bus.c b/hw/isa-bus.c
index 4e306de..26036e0 100644
--- a/hw/isa-bus.c
+++ b/hw/isa-bus.c
@@ -153,6 +153,7 @@ static int isabus_bridge_init(SysBusDevice *dev)
 static SysBusDeviceInfo isabus_bridge_info = {
     .init = isabus_bridge_init,
     .qdev.name  = "isabus-bridge",
+    .qdev.fw_name  = "isa",
     .qdev.size  = sizeof(SysBusDevice),
     .qdev.no_user = 1,
 };
diff --git a/hw/lance.c b/hw/lance.c
index dc12144..1a3bb1a 100644
--- a/hw/lance.c
+++ b/hw/lance.c
@@ -141,6 +141,7 @@ static void lance_reset(DeviceState *dev)
 static SysBusDeviceInfo lance_info = {
     .init       = lance_init,
     .qdev.name  = "lance",
+    .qdev.fw_name  = "ethernet",
     .qdev.size  = sizeof(SysBusPCNetState),
     .qdev.reset = lance_reset,
     .qdev.vmsd  = &vmstate_lance,
diff --git a/hw/piix_pci.c b/hw/piix_pci.c
index b5589b9..38f9d9e 100644
--- a/hw/piix_pci.c
+++ b/hw/piix_pci.c
@@ -365,6 +365,7 @@ static PCIDeviceInfo i440fx_info[] = {
 static SysBusDeviceInfo i440fx_pcihost_info = {
     .init         = i440fx_pcihost_initfn,
     .qdev.name    = "i440FX-pcihost",
+    .qdev.fw_name = "pci",
     .qdev.size    = sizeof(I440FXState),
     .qdev.no_user = 1,
 };
diff --git a/hw/qdev.h b/hw/qdev.h
index 3fac364..bc71110 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -141,6 +141,7 @@ typedef void (*qdev_resetfn)(DeviceState *dev);
 
 struct DeviceInfo {
     const char *name;
+    const char *fw_name;
     const char *alias;
     const char *desc;
     size_t size;
@@ -306,6 +307,11 @@ void qdev_prop_set_defaults(DeviceState *dev, Property *props);
 void qdev_prop_register_global_list(GlobalProperty *props);
 void qdev_prop_set_globals(DeviceState *dev);
 
+static inline const char *qdev_fw_name(DeviceState *dev)
+{
+    return dev->info->fw_name ? : dev->info->alias ? : dev->info->name;
+}
+
 /* This is a nasty hack to allow passing a NULL bus to qdev_create.  */
 extern struct BusInfo system_bus_info;
 
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index 6e49404..851046f 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -1230,6 +1230,7 @@ static int scsi_disk_initfn(SCSIDevice *dev)
 
 static SCSIDeviceInfo scsi_disk_info = {
     .qdev.name    = "scsi-disk",
+    .qdev.fw_name = "disk",
     .qdev.desc    = "virtual scsi disk or cdrom",
     .qdev.size    = sizeof(SCSIDiskState),
     .qdev.reset   = scsi_disk_reset,
diff --git a/hw/usb-hub.c b/hw/usb-hub.c
index 2a1edfc..8e3a96b 100644
--- a/hw/usb-hub.c
+++ b/hw/usb-hub.c
@@ -545,6 +545,7 @@ static int usb_hub_initfn(USBDevice *dev)
 static struct USBDeviceInfo hub_info = {
     .product_desc   = "QEMU USB Hub",
     .qdev.name      = "usb-hub",
+    .qdev.fw_name    = "hub",
     .qdev.size      = sizeof(USBHubState),
     .init           = usb_hub_initfn,
     .handle_packet  = usb_hub_handle_packet,
diff --git a/hw/usb-net.c b/hw/usb-net.c
index 58c672f..f6bed21 100644
--- a/hw/usb-net.c
+++ b/hw/usb-net.c
@@ -1496,6 +1496,7 @@ static USBDevice *usb_net_init(const char *cmdline)
 static struct USBDeviceInfo net_info = {
     .product_desc   = "QEMU USB Network Interface",
     .qdev.name      = "usb-net",
+    .qdev.fw_name    = "network",
     .qdev.size      = sizeof(USBNetState),
     .init           = usb_net_initfn,
     .handle_packet  = usb_generic_handle_packet,
diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c
index c65765a..6186142 100644
--- a/hw/virtio-pci.c
+++ b/hw/virtio-pci.c
@@ -699,6 +699,7 @@ static int virtio_9p_init_pci(PCIDevice *pci_dev)
 static PCIDeviceInfo virtio_info[] = {
     {
         .qdev.name = "virtio-blk-pci",
+        .qdev.alias = "virtio-blk",
         .qdev.size = sizeof(VirtIOPCIProxy),
         .init      = virtio_blk_init_pci,
         .exit      = virtio_blk_exit_pci,
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [PATCHv8 02/16] Introduce new BusInfo callback get_fw_dev_path.
  2010-12-08 11:34 [Qemu-devel] [PATCHv8 00/16] boot order specification Gleb Natapov
  2010-12-08 11:34 ` [Qemu-devel] [PATCHv8 01/16] Introduce fw_name field to DeviceInfo structure Gleb Natapov
@ 2010-12-08 11:34 ` Gleb Natapov
  2010-12-08 11:34 ` [Qemu-devel] [PATCHv8 03/16] Keep track of ISA ports ISA device is using in qdev Gleb Natapov
                   ` (15 subsequent siblings)
  17 siblings, 0 replies; 38+ messages in thread
From: Gleb Natapov @ 2010-12-08 11:34 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, kevin, kvm

New get_fw_dev_path callback will be used for build device path usable
by firmware in contrast to qdev qemu internal device path.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
---
 hw/qdev.h |    7 +++++++
 1 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/hw/qdev.h b/hw/qdev.h
index bc71110..f72fbde 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -49,6 +49,12 @@ struct DeviceState {
 
 typedef void (*bus_dev_printfn)(Monitor *mon, DeviceState *dev, int indent);
 typedef char *(*bus_get_dev_path)(DeviceState *dev);
+/*
+ * This callback is used to create Open Firmware device path in accordance with
+ * OF spec http://forthworks.com/standards/of1275.pdf. Indicidual bus bindings
+ * can be found here http://playground.sun.com/1275/bindings/.
+ */
+typedef char *(*bus_get_fw_dev_path)(DeviceState *dev);
 typedef int (qbus_resetfn)(BusState *bus);
 
 struct BusInfo {
@@ -56,6 +62,7 @@ struct BusInfo {
     size_t size;
     bus_dev_printfn print_dev;
     bus_get_dev_path get_dev_path;
+    bus_get_fw_dev_path get_fw_dev_path;
     qbus_resetfn *reset;
     Property *props;
 };
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [PATCHv8 03/16] Keep track of ISA ports ISA device is using in qdev.
  2010-12-08 11:34 [Qemu-devel] [PATCHv8 00/16] boot order specification Gleb Natapov
  2010-12-08 11:34 ` [Qemu-devel] [PATCHv8 01/16] Introduce fw_name field to DeviceInfo structure Gleb Natapov
  2010-12-08 11:34 ` [Qemu-devel] [PATCHv8 02/16] Introduce new BusInfo callback get_fw_dev_path Gleb Natapov
@ 2010-12-08 11:34 ` Gleb Natapov
  2010-12-08 11:34 ` [Qemu-devel] [PATCHv8 04/16] Add get_fw_dev_path callback to ISA bus " Gleb Natapov
                   ` (14 subsequent siblings)
  17 siblings, 0 replies; 38+ messages in thread
From: Gleb Natapov @ 2010-12-08 11:34 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, kevin, kvm

Store all io ports used by device in ISADevice structure.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
---
 hw/cs4231a.c     |    1 +
 hw/fdc.c         |    3 +++
 hw/gus.c         |    4 ++++
 hw/ide/isa.c     |    2 ++
 hw/isa-bus.c     |   25 +++++++++++++++++++++++++
 hw/isa.h         |    4 ++++
 hw/m48t59.c      |    1 +
 hw/mc146818rtc.c |    1 +
 hw/ne2000-isa.c  |    3 +++
 hw/parallel.c    |    5 +++++
 hw/pckbd.c       |    3 +++
 hw/sb16.c        |    4 ++++
 hw/serial.c      |    1 +
 13 files changed, 57 insertions(+), 0 deletions(-)

diff --git a/hw/cs4231a.c b/hw/cs4231a.c
index 4d5ce5c..598f032 100644
--- a/hw/cs4231a.c
+++ b/hw/cs4231a.c
@@ -645,6 +645,7 @@ static int cs4231a_initfn (ISADevice *dev)
     isa_init_irq (dev, &s->pic, s->irq);
 
     for (i = 0; i < 4; i++) {
+        isa_init_ioport(dev, i);
         register_ioport_write (s->port + i, 1, 1, cs_write, s);
         register_ioport_read (s->port + i, 1, 1, cs_read, s);
     }
diff --git a/hw/fdc.c b/hw/fdc.c
index a467c4b..22fb64a 100644
--- a/hw/fdc.c
+++ b/hw/fdc.c
@@ -1983,6 +1983,9 @@ static int isabus_fdc_init1(ISADevice *dev)
                           &fdctrl_write_port, fdctrl);
     register_ioport_write(iobase + 0x07, 1, 1,
                           &fdctrl_write_port, fdctrl);
+    isa_init_ioport_range(dev, iobase, 6);
+    isa_init_ioport(dev, iobase + 7);
+
     isa_init_irq(&isa->busdev, &fdctrl->irq, isairq);
     fdctrl->dma_chann = dma_chann;
 
diff --git a/hw/gus.c b/hw/gus.c
index e9016d8..ff9e7c7 100644
--- a/hw/gus.c
+++ b/hw/gus.c
@@ -264,20 +264,24 @@ static int gus_initfn (ISADevice *dev)
 
     register_ioport_write (s->port, 1, 1, gus_writeb, s);
     register_ioport_write (s->port, 1, 2, gus_writew, s);
+    isa_init_ioport_range(dev, s->port, 2);
 
     register_ioport_read ((s->port + 0x100) & 0xf00, 1, 1, gus_readb, s);
     register_ioport_read ((s->port + 0x100) & 0xf00, 1, 2, gus_readw, s);
+    isa_init_ioport_range(dev, (s->port + 0x100) & 0xf00, 2);
 
     register_ioport_write (s->port + 6, 10, 1, gus_writeb, s);
     register_ioport_write (s->port + 6, 10, 2, gus_writew, s);
     register_ioport_read (s->port + 6, 10, 1, gus_readb, s);
     register_ioport_read (s->port + 6, 10, 2, gus_readw, s);
+    isa_init_ioport_range(dev, s->port + 6, 10);
 
 
     register_ioport_write (s->port + 0x100, 8, 1, gus_writeb, s);
     register_ioport_write (s->port + 0x100, 8, 2, gus_writew, s);
     register_ioport_read (s->port + 0x100, 8, 1, gus_readb, s);
     register_ioport_read (s->port + 0x100, 8, 2, gus_readw, s);
+    isa_init_ioport_range(dev, s->port + 0x100, 8);
 
     DMA_register_channel (s->emu.gusdma, GUS_read_DMA, s);
     s->emu.himemaddr = s->himem;
diff --git a/hw/ide/isa.c b/hw/ide/isa.c
index 9856435..4206afd 100644
--- a/hw/ide/isa.c
+++ b/hw/ide/isa.c
@@ -70,6 +70,8 @@ static int isa_ide_initfn(ISADevice *dev)
     ide_bus_new(&s->bus, &s->dev.qdev);
     ide_init_ioport(&s->bus, s->iobase, s->iobase2);
     isa_init_irq(dev, &s->irq, s->isairq);
+    isa_init_ioport_range(dev, s->iobase, 8);
+    isa_init_ioport(dev, s->iobase2);
     ide_init2(&s->bus, s->irq);
     vmstate_register(&dev->qdev, 0, &vmstate_ide_isa, s);
     return 0;
diff --git a/hw/isa-bus.c b/hw/isa-bus.c
index 26036e0..c0ac7e9 100644
--- a/hw/isa-bus.c
+++ b/hw/isa-bus.c
@@ -92,6 +92,31 @@ void isa_init_irq(ISADevice *dev, qemu_irq *p, int isairq)
     dev->nirqs++;
 }
 
+static void isa_init_ioport_one(ISADevice *dev, uint16_t ioport)
+{
+    assert(dev->nioports < ARRAY_SIZE(dev->ioports));
+    dev->ioports[dev->nioports++] = ioport;
+}
+
+static int isa_cmp_ports(const void *p1, const void *p2)
+{
+    return *(uint16_t*)p1 - *(uint16_t*)p2;
+}
+
+void isa_init_ioport_range(ISADevice *dev, uint16_t start, uint16_t length)
+{
+    int i;
+    for (i = start; i < start + length; i++) {
+        isa_init_ioport_one(dev, i);
+    }
+    qsort(dev->ioports, dev->nioports, sizeof(dev->ioports[0]), isa_cmp_ports);
+}
+
+void isa_init_ioport(ISADevice *dev, uint16_t ioport)
+{
+    isa_init_ioport_range(dev, ioport, 1);
+}
+
 static int isa_qdev_init(DeviceState *qdev, DeviceInfo *base)
 {
     ISADevice *dev = DO_UPCAST(ISADevice, qdev, qdev);
diff --git a/hw/isa.h b/hw/isa.h
index aaf0272..4794b76 100644
--- a/hw/isa.h
+++ b/hw/isa.h
@@ -14,6 +14,8 @@ struct ISADevice {
     DeviceState qdev;
     uint32_t isairq[2];
     int nirqs;
+    uint16_t ioports[32];
+    int nioports;
 };
 
 typedef int (*isa_qdev_initfn)(ISADevice *dev);
@@ -26,6 +28,8 @@ ISABus *isa_bus_new(DeviceState *dev);
 void isa_bus_irqs(qemu_irq *irqs);
 qemu_irq isa_reserve_irq(int isairq);
 void isa_init_irq(ISADevice *dev, qemu_irq *p, int isairq);
+void isa_init_ioport(ISADevice *dev, uint16_t ioport);
+void isa_init_ioport_range(ISADevice *dev, uint16_t start, uint16_t length);
 void isa_qdev_register(ISADeviceInfo *info);
 ISADevice *isa_create(const char *name);
 ISADevice *isa_create_simple(const char *name);
diff --git a/hw/m48t59.c b/hw/m48t59.c
index c7492a6..75a94e1 100644
--- a/hw/m48t59.c
+++ b/hw/m48t59.c
@@ -680,6 +680,7 @@ M48t59State *m48t59_init_isa(uint32_t io_base, uint16_t size, int type)
     if (io_base != 0) {
         register_ioport_read(io_base, 0x04, 1, NVRAM_readb, s);
         register_ioport_write(io_base, 0x04, 1, NVRAM_writeb, s);
+        isa_init_ioport_range(dev, io_base, 4);
     }
 
     return s;
diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c
index 2b91fa8..6466aff 100644
--- a/hw/mc146818rtc.c
+++ b/hw/mc146818rtc.c
@@ -605,6 +605,7 @@ static int rtc_initfn(ISADevice *dev)
 
     register_ioport_write(base, 2, 1, cmos_ioport_write, s);
     register_ioport_read(base, 2, 1, cmos_ioport_read, s);
+    isa_init_ioport_range(dev, base, 2);
 
     qdev_set_legacy_instance_id(&dev->qdev, base, 2);
     qemu_register_reset(rtc_reset, s);
diff --git a/hw/ne2000-isa.c b/hw/ne2000-isa.c
index 03a5a1f..3ff0d89 100644
--- a/hw/ne2000-isa.c
+++ b/hw/ne2000-isa.c
@@ -68,14 +68,17 @@ static int isa_ne2000_initfn(ISADevice *dev)
 
     register_ioport_write(isa->iobase, 16, 1, ne2000_ioport_write, s);
     register_ioport_read(isa->iobase, 16, 1, ne2000_ioport_read, s);
+    isa_init_ioport_range(dev, isa->iobase, 16);
 
     register_ioport_write(isa->iobase + 0x10, 1, 1, ne2000_asic_ioport_write, s);
     register_ioport_read(isa->iobase + 0x10, 1, 1, ne2000_asic_ioport_read, s);
     register_ioport_write(isa->iobase + 0x10, 2, 2, ne2000_asic_ioport_write, s);
     register_ioport_read(isa->iobase + 0x10, 2, 2, ne2000_asic_ioport_read, s);
+    isa_init_ioport_range(dev, isa->iobase + 0x10, 2);
 
     register_ioport_write(isa->iobase + 0x1f, 1, 1, ne2000_reset_ioport_write, s);
     register_ioport_read(isa->iobase + 0x1f, 1, 1, ne2000_reset_ioport_read, s);
+    isa_init_ioport(dev, isa->iobase + 0x1f);
 
     isa_init_irq(dev, &s->irq, isa->isairq);
 
diff --git a/hw/parallel.c b/hw/parallel.c
index 6b11672..6270b53 100644
--- a/hw/parallel.c
+++ b/hw/parallel.c
@@ -481,16 +481,21 @@ static int parallel_isa_initfn(ISADevice *dev)
     if (s->hw_driver) {
         register_ioport_write(base, 8, 1, parallel_ioport_write_hw, s);
         register_ioport_read(base, 8, 1, parallel_ioport_read_hw, s);
+        isa_init_ioport_range(dev, base, 8);
+
         register_ioport_write(base+4, 1, 2, parallel_ioport_eppdata_write_hw2, s);
         register_ioport_read(base+4, 1, 2, parallel_ioport_eppdata_read_hw2, s);
         register_ioport_write(base+4, 1, 4, parallel_ioport_eppdata_write_hw4, s);
         register_ioport_read(base+4, 1, 4, parallel_ioport_eppdata_read_hw4, s);
+        isa_init_ioport(dev, base+4);
         register_ioport_write(base+0x400, 8, 1, parallel_ioport_ecp_write, s);
         register_ioport_read(base+0x400, 8, 1, parallel_ioport_ecp_read, s);
+        isa_init_ioport_range(dev, base+0x400, 8);
     }
     else {
         register_ioport_write(base, 8, 1, parallel_ioport_write_sw, s);
         register_ioport_read(base, 8, 1, parallel_ioport_read_sw, s);
+        isa_init_ioport_range(dev, base, 8);
     }
     return 0;
 }
diff --git a/hw/pckbd.c b/hw/pckbd.c
index 6e4e406..e736505 100644
--- a/hw/pckbd.c
+++ b/hw/pckbd.c
@@ -484,10 +484,13 @@ static int i8042_initfn(ISADevice *dev)
 
     register_ioport_read(0x60, 1, 1, kbd_read_data, s);
     register_ioport_write(0x60, 1, 1, kbd_write_data, s);
+    isa_init_ioport(dev, 0x60);
     register_ioport_read(0x64, 1, 1, kbd_read_status, s);
     register_ioport_write(0x64, 1, 1, kbd_write_command, s);
+    isa_init_ioport(dev, 0x64);
     register_ioport_read(0x92, 1, 1, ioport92_read, s);
     register_ioport_write(0x92, 1, 1, ioport92_write, s);
+    isa_init_ioport(dev, 0x92);
 
     s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s);
     s->mouse = ps2_mouse_init(kbd_update_aux_irq, s);
diff --git a/hw/sb16.c b/hw/sb16.c
index 78590a7..c9d37ad 100644
--- a/hw/sb16.c
+++ b/hw/sb16.c
@@ -1368,16 +1368,20 @@ static int sb16_initfn (ISADevice *dev)
 
     for (i = 0; i < ARRAY_SIZE (dsp_write_ports); i++) {
         register_ioport_write (s->port + dsp_write_ports[i], 1, 1, dsp_write, s);
+        isa_init_ioport(dev, s->port + dsp_write_ports[i]);
     }
 
     for (i = 0; i < ARRAY_SIZE (dsp_read_ports); i++) {
         register_ioport_read (s->port + dsp_read_ports[i], 1, 1, dsp_read, s);
+        isa_init_ioport(dev, s->port + dsp_read_ports[i]);
     }
 
     register_ioport_write (s->port + 0x4, 1, 1, mixer_write_indexb, s);
     register_ioport_write (s->port + 0x4, 1, 2, mixer_write_indexw, s);
+    isa_init_ioport(dev, s->port + 0x4);
     register_ioport_read (s->port + 0x5, 1, 1, mixer_read, s);
     register_ioport_write (s->port + 0x5, 1, 1, mixer_write_datab, s);
+    isa_init_ioport(dev, s->port + 0x5);
 
     DMA_register_channel (s->hdma, SB_read_DMA, s);
     DMA_register_channel (s->dma, SB_read_DMA, s);
diff --git a/hw/serial.c b/hw/serial.c
index 9ebc452..20902ae 100644
--- a/hw/serial.c
+++ b/hw/serial.c
@@ -778,6 +778,7 @@ static int serial_isa_initfn(ISADevice *dev)
 
     register_ioport_write(isa->iobase, 8, 1, serial_ioport_write, s);
     register_ioport_read(isa->iobase, 8, 1, serial_ioport_read, s);
+    isa_init_ioport_range(dev, isa->iobase, 8);
     return 0;
 }
 
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [PATCHv8 04/16] Add get_fw_dev_path callback to ISA bus in qdev.
  2010-12-08 11:34 [Qemu-devel] [PATCHv8 00/16] boot order specification Gleb Natapov
                   ` (2 preceding siblings ...)
  2010-12-08 11:34 ` [Qemu-devel] [PATCHv8 03/16] Keep track of ISA ports ISA device is using in qdev Gleb Natapov
@ 2010-12-08 11:34 ` Gleb Natapov
  2010-12-08 11:34 ` [Qemu-devel] [PATCHv8 05/16] Store IDE bus id in IDEBus structure for easy access Gleb Natapov
                   ` (13 subsequent siblings)
  17 siblings, 0 replies; 38+ messages in thread
From: Gleb Natapov @ 2010-12-08 11:34 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, kevin, kvm

Use device ioports to create unique device path.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
---
 hw/isa-bus.c |   16 ++++++++++++++++
 1 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/hw/isa-bus.c b/hw/isa-bus.c
index c0ac7e9..c423c1b 100644
--- a/hw/isa-bus.c
+++ b/hw/isa-bus.c
@@ -31,11 +31,13 @@ static ISABus *isabus;
 target_phys_addr_t isa_mem_base = 0;
 
 static void isabus_dev_print(Monitor *mon, DeviceState *dev, int indent);
+static char *isabus_get_fw_dev_path(DeviceState *dev);
 
 static struct BusInfo isa_bus_info = {
     .name      = "ISA",
     .size      = sizeof(ISABus),
     .print_dev = isabus_dev_print,
+    .get_fw_dev_path = isabus_get_fw_dev_path,
 };
 
 ISABus *isa_bus_new(DeviceState *dev)
@@ -188,4 +190,18 @@ static void isabus_register_devices(void)
     sysbus_register_withprop(&isabus_bridge_info);
 }
 
+static char *isabus_get_fw_dev_path(DeviceState *dev)
+{
+    ISADevice *d = (ISADevice*)dev;
+    char path[40];
+    int off;
+
+    off = snprintf(path, sizeof(path), "%s", qdev_fw_name(dev));
+    if (d->nioports) {
+        snprintf(path + off, sizeof(path) - off, "@%04x", d->ioports[0]);
+    }
+
+    return strdup(path);
+}
+
 device_init(isabus_register_devices)
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [PATCHv8 05/16] Store IDE bus id in IDEBus structure for easy access.
  2010-12-08 11:34 [Qemu-devel] [PATCHv8 00/16] boot order specification Gleb Natapov
                   ` (3 preceding siblings ...)
  2010-12-08 11:34 ` [Qemu-devel] [PATCHv8 04/16] Add get_fw_dev_path callback to ISA bus " Gleb Natapov
@ 2010-12-08 11:34 ` Gleb Natapov
  2010-12-08 11:34 ` [Qemu-devel] [PATCHv8 06/16] Add get_fw_dev_path callback to IDE bus Gleb Natapov
                   ` (12 subsequent siblings)
  17 siblings, 0 replies; 38+ messages in thread
From: Gleb Natapov @ 2010-12-08 11:34 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, kevin, kvm


Signed-off-by: Gleb Natapov <gleb@redhat.com>
---
 hw/ide/cmd646.c   |    4 ++--
 hw/ide/internal.h |    3 ++-
 hw/ide/isa.c      |    2 +-
 hw/ide/piix.c     |    4 ++--
 hw/ide/qdev.c     |    3 ++-
 hw/ide/via.c      |    4 ++--
 6 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/hw/ide/cmd646.c b/hw/ide/cmd646.c
index dfe6091..ea5d2dc 100644
--- a/hw/ide/cmd646.c
+++ b/hw/ide/cmd646.c
@@ -253,8 +253,8 @@ static int pci_cmd646_ide_initfn(PCIDevice *dev)
     pci_conf[PCI_INTERRUPT_PIN] = 0x01; // interrupt on pin 1
 
     irq = qemu_allocate_irqs(cmd646_set_irq, d, 2);
-    ide_bus_new(&d->bus[0], &d->dev.qdev);
-    ide_bus_new(&d->bus[1], &d->dev.qdev);
+    ide_bus_new(&d->bus[0], &d->dev.qdev, 0);
+    ide_bus_new(&d->bus[1], &d->dev.qdev, 1);
     ide_init2(&d->bus[0], irq[0]);
     ide_init2(&d->bus[1], irq[1]);
 
diff --git a/hw/ide/internal.h b/hw/ide/internal.h
index 85f4a16..71af66f 100644
--- a/hw/ide/internal.h
+++ b/hw/ide/internal.h
@@ -449,6 +449,7 @@ struct IDEBus {
     IDEDevice *slave;
     BMDMAState *bmdma;
     IDEState ifs[2];
+    int bus_id;
     uint8_t unit;
     uint8_t cmd;
     qemu_irq irq;
@@ -567,7 +568,7 @@ void ide_init2_with_non_qdev_drives(IDEBus *bus, DriveInfo *hd0,
 void ide_init_ioport(IDEBus *bus, int iobase, int iobase2);
 
 /* hw/ide/qdev.c */
-void ide_bus_new(IDEBus *idebus, DeviceState *dev);
+void ide_bus_new(IDEBus *idebus, DeviceState *dev, int bus_id);
 IDEDevice *ide_create_drive(IDEBus *bus, int unit, DriveInfo *drive);
 
 #endif /* HW_IDE_INTERNAL_H */
diff --git a/hw/ide/isa.c b/hw/ide/isa.c
index 4206afd..8c59c5a 100644
--- a/hw/ide/isa.c
+++ b/hw/ide/isa.c
@@ -67,7 +67,7 @@ static int isa_ide_initfn(ISADevice *dev)
 {
     ISAIDEState *s = DO_UPCAST(ISAIDEState, dev, dev);
 
-    ide_bus_new(&s->bus, &s->dev.qdev);
+    ide_bus_new(&s->bus, &s->dev.qdev, 0);
     ide_init_ioport(&s->bus, s->iobase, s->iobase2);
     isa_init_irq(dev, &s->irq, s->isairq);
     isa_init_ioport_range(dev, s->iobase, 8);
diff --git a/hw/ide/piix.c b/hw/ide/piix.c
index e02b89a..1c0cb0c 100644
--- a/hw/ide/piix.c
+++ b/hw/ide/piix.c
@@ -125,8 +125,8 @@ static int pci_piix_ide_initfn(PCIIDEState *d)
 
     vmstate_register(&d->dev.qdev, 0, &vmstate_ide_pci, d);
 
-    ide_bus_new(&d->bus[0], &d->dev.qdev);
-    ide_bus_new(&d->bus[1], &d->dev.qdev);
+    ide_bus_new(&d->bus[0], &d->dev.qdev, 0);
+    ide_bus_new(&d->bus[1], &d->dev.qdev, 1);
     ide_init_ioport(&d->bus[0], 0x1f0, 0x3f6);
     ide_init_ioport(&d->bus[1], 0x170, 0x376);
 
diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c
index 6d27b60..88ff657 100644
--- a/hw/ide/qdev.c
+++ b/hw/ide/qdev.c
@@ -29,9 +29,10 @@ static struct BusInfo ide_bus_info = {
     .size  = sizeof(IDEBus),
 };
 
-void ide_bus_new(IDEBus *idebus, DeviceState *dev)
+void ide_bus_new(IDEBus *idebus, DeviceState *dev, int bus_id)
 {
     qbus_create_inplace(&idebus->qbus, &ide_bus_info, dev, NULL);
+    idebus->bus_id = bus_id;
 }
 
 static int ide_qdev_init(DeviceState *qdev, DeviceInfo *base)
diff --git a/hw/ide/via.c b/hw/ide/via.c
index 66be0c4..78857e8 100644
--- a/hw/ide/via.c
+++ b/hw/ide/via.c
@@ -154,8 +154,8 @@ static int vt82c686b_ide_initfn(PCIDevice *dev)
 
     vmstate_register(&dev->qdev, 0, &vmstate_ide_pci, d);
 
-    ide_bus_new(&d->bus[0], &d->dev.qdev);
-    ide_bus_new(&d->bus[1], &d->dev.qdev);
+    ide_bus_new(&d->bus[0], &d->dev.qdev, 0);
+    ide_bus_new(&d->bus[1], &d->dev.qdev, 1);
     ide_init2(&d->bus[0], isa_reserve_irq(14));
     ide_init2(&d->bus[1], isa_reserve_irq(15));
     ide_init_ioport(&d->bus[0], 0x1f0, 0x3f6);
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [PATCHv8 06/16] Add get_fw_dev_path callback to IDE bus.
  2010-12-08 11:34 [Qemu-devel] [PATCHv8 00/16] boot order specification Gleb Natapov
                   ` (4 preceding siblings ...)
  2010-12-08 11:34 ` [Qemu-devel] [PATCHv8 05/16] Store IDE bus id in IDEBus structure for easy access Gleb Natapov
@ 2010-12-08 11:34 ` Gleb Natapov
  2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 07/16] Add get_fw_dev_path callback for system bus Gleb Natapov
                   ` (11 subsequent siblings)
  17 siblings, 0 replies; 38+ messages in thread
From: Gleb Natapov @ 2010-12-08 11:34 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, kevin, kvm


Signed-off-by: Gleb Natapov <gleb@redhat.com>
---
 hw/ide/qdev.c |   13 +++++++++++++
 1 files changed, 13 insertions(+), 0 deletions(-)

diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c
index 88ff657..01a181b 100644
--- a/hw/ide/qdev.c
+++ b/hw/ide/qdev.c
@@ -24,9 +24,12 @@
 
 /* --------------------------------- */
 
+static char *idebus_get_fw_dev_path(DeviceState *dev);
+
 static struct BusInfo ide_bus_info = {
     .name  = "IDE",
     .size  = sizeof(IDEBus),
+    .get_fw_dev_path = idebus_get_fw_dev_path,
 };
 
 void ide_bus_new(IDEBus *idebus, DeviceState *dev, int bus_id)
@@ -35,6 +38,16 @@ void ide_bus_new(IDEBus *idebus, DeviceState *dev, int bus_id)
     idebus->bus_id = bus_id;
 }
 
+static char *idebus_get_fw_dev_path(DeviceState *dev)
+{
+    char path[30];
+
+    snprintf(path, sizeof(path), "%s@%d", qdev_fw_name(dev),
+             ((IDEBus*)dev->parent_bus)->bus_id);
+
+    return strdup(path);
+}
+
 static int ide_qdev_init(DeviceState *qdev, DeviceInfo *base)
 {
     IDEDevice *dev = DO_UPCAST(IDEDevice, qdev, qdev);
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [PATCHv8 07/16] Add get_fw_dev_path callback for system bus.
  2010-12-08 11:34 [Qemu-devel] [PATCHv8 00/16] boot order specification Gleb Natapov
                   ` (5 preceding siblings ...)
  2010-12-08 11:34 ` [Qemu-devel] [PATCHv8 06/16] Add get_fw_dev_path callback to IDE bus Gleb Natapov
@ 2010-12-08 11:35 ` Gleb Natapov
  2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 08/16] Add get_fw_dev_path callback for pci bus Gleb Natapov
                   ` (10 subsequent siblings)
  17 siblings, 0 replies; 38+ messages in thread
From: Gleb Natapov @ 2010-12-08 11:35 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, kevin, kvm

Prints out mmio or pio used to access child device.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
---
 hw/pci_host.c |    2 ++
 hw/sysbus.c   |   30 ++++++++++++++++++++++++++++++
 hw/sysbus.h   |    4 ++++
 3 files changed, 36 insertions(+), 0 deletions(-)

diff --git a/hw/pci_host.c b/hw/pci_host.c
index bc5b771..28d45bf 100644
--- a/hw/pci_host.c
+++ b/hw/pci_host.c
@@ -197,6 +197,7 @@ void pci_host_conf_register_ioport(pio_addr_t ioport, PCIHostState *s)
 {
     pci_host_init(s);
     register_ioport_simple(&s->conf_noswap_handler, ioport, 4, 4);
+    sysbus_init_ioports(&s->busdev, ioport, 4);
 }
 
 int pci_host_data_register_mmio(PCIHostState *s, int swap)
@@ -215,4 +216,5 @@ void pci_host_data_register_ioport(pio_addr_t ioport, PCIHostState *s)
     register_ioport_simple(&s->data_noswap_handler, ioport, 4, 1);
     register_ioport_simple(&s->data_noswap_handler, ioport, 4, 2);
     register_ioport_simple(&s->data_noswap_handler, ioport, 4, 4);
+    sysbus_init_ioports(&s->busdev, ioport, 4);
 }
diff --git a/hw/sysbus.c b/hw/sysbus.c
index d817721..1583bd8 100644
--- a/hw/sysbus.c
+++ b/hw/sysbus.c
@@ -22,11 +22,13 @@
 #include "monitor.h"
 
 static void sysbus_dev_print(Monitor *mon, DeviceState *dev, int indent);
+static char *sysbus_get_fw_dev_path(DeviceState *dev);
 
 struct BusInfo system_bus_info = {
     .name       = "System",
     .size       = sizeof(BusState),
     .print_dev  = sysbus_dev_print,
+    .get_fw_dev_path = sysbus_get_fw_dev_path,
 };
 
 void sysbus_connect_irq(SysBusDevice *dev, int n, qemu_irq irq)
@@ -106,6 +108,16 @@ void sysbus_init_mmio_cb(SysBusDevice *dev, target_phys_addr_t size,
     dev->mmio[n].cb = cb;
 }
 
+void sysbus_init_ioports(SysBusDevice *dev, pio_addr_t ioport, pio_addr_t size)
+{
+    pio_addr_t i;
+
+    for (i = 0; i < size; i++) {
+        assert(dev->num_pio < QDEV_MAX_PIO);
+        dev->pio[dev->num_pio++] = ioport++;
+    }
+}
+
 static int sysbus_device_init(DeviceState *dev, DeviceInfo *base)
 {
     SysBusDeviceInfo *info = container_of(base, SysBusDeviceInfo, qdev);
@@ -171,3 +183,21 @@ static void sysbus_dev_print(Monitor *mon, DeviceState *dev, int indent)
                        indent, "", s->mmio[i].addr, s->mmio[i].size);
     }
 }
+
+static char *sysbus_get_fw_dev_path(DeviceState *dev)
+{
+    SysBusDevice *s = sysbus_from_qdev(dev);
+    char path[40];
+    int off;
+
+    off = snprintf(path, sizeof(path), "%s", qdev_fw_name(dev));
+
+    if (s->num_mmio) {
+        snprintf(path + off, sizeof(path) - off, "@"TARGET_FMT_plx,
+                 s->mmio[0].addr);
+    } else if (s->num_pio) {
+        snprintf(path + off, sizeof(path) - off, "@i%04x", s->pio[0]);
+    }
+
+    return strdup(path);
+}
diff --git a/hw/sysbus.h b/hw/sysbus.h
index 5980901..e9eb618 100644
--- a/hw/sysbus.h
+++ b/hw/sysbus.h
@@ -6,6 +6,7 @@
 #include "qdev.h"
 
 #define QDEV_MAX_MMIO 32
+#define QDEV_MAX_PIO 32
 #define QDEV_MAX_IRQ 256
 
 typedef struct SysBusDevice SysBusDevice;
@@ -23,6 +24,8 @@ struct SysBusDevice {
         mmio_mapfunc cb;
         ram_addr_t iofunc;
     } mmio[QDEV_MAX_MMIO];
+    int num_pio;
+    pio_addr_t pio[QDEV_MAX_PIO];
 };
 
 typedef int (*sysbus_initfn)(SysBusDevice *dev);
@@ -45,6 +48,7 @@ void sysbus_init_mmio_cb(SysBusDevice *dev, target_phys_addr_t size,
                             mmio_mapfunc cb);
 void sysbus_init_irq(SysBusDevice *dev, qemu_irq *p);
 void sysbus_pass_irq(SysBusDevice *dev, SysBusDevice *target);
+void sysbus_init_ioports(SysBusDevice *dev, pio_addr_t ioport, pio_addr_t size);
 
 
 void sysbus_connect_irq(SysBusDevice *dev, int n, qemu_irq irq);
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [PATCHv8 08/16] Add get_fw_dev_path callback for pci bus.
  2010-12-08 11:34 [Qemu-devel] [PATCHv8 00/16] boot order specification Gleb Natapov
                   ` (6 preceding siblings ...)
  2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 07/16] Add get_fw_dev_path callback for system bus Gleb Natapov
@ 2010-12-08 11:35 ` Gleb Natapov
  2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 09/16] Record which USBDevice USBPort belongs too Gleb Natapov
                   ` (9 subsequent siblings)
  17 siblings, 0 replies; 38+ messages in thread
From: Gleb Natapov @ 2010-12-08 11:35 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, kevin, kvm


Signed-off-by: Gleb Natapov <gleb@redhat.com>
---
 hw/pci.c |  108 ++++++++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 85 insertions(+), 23 deletions(-)

diff --git a/hw/pci.c b/hw/pci.c
index 0c15b13..e7ea907 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -43,6 +43,7 @@
 
 static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent);
 static char *pcibus_get_dev_path(DeviceState *dev);
+static char *pcibus_get_fw_dev_path(DeviceState *dev);
 static int pcibus_reset(BusState *qbus);
 
 struct BusInfo pci_bus_info = {
@@ -50,6 +51,7 @@ struct BusInfo pci_bus_info = {
     .size       = sizeof(PCIBus),
     .print_dev  = pcibus_dev_print,
     .get_dev_path = pcibus_get_dev_path,
+    .get_fw_dev_path = pcibus_get_fw_dev_path,
     .reset      = pcibus_reset,
     .props      = (Property[]) {
         DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1),
@@ -1117,45 +1119,63 @@ void pci_msi_notify(PCIDevice *dev, unsigned int vector)
 typedef struct {
     uint16_t class;
     const char *desc;
+    const char *fw_name;
+    uint16_t fw_ign_bits;
 } pci_class_desc;
 
 static const pci_class_desc pci_class_descriptions[] =
 {
-    { 0x0100, "SCSI controller"},
-    { 0x0101, "IDE controller"},
-    { 0x0102, "Floppy controller"},
-    { 0x0103, "IPI controller"},
-    { 0x0104, "RAID controller"},
+    { 0x0001, "VGA controller", "display"},
+    { 0x0100, "SCSI controller", "scsi"},
+    { 0x0101, "IDE controller", "ide"},
+    { 0x0102, "Floppy controller", "fdc"},
+    { 0x0103, "IPI controller", "ipi"},
+    { 0x0104, "RAID controller", "raid"},
     { 0x0106, "SATA controller"},
     { 0x0107, "SAS controller"},
     { 0x0180, "Storage controller"},
-    { 0x0200, "Ethernet controller"},
-    { 0x0201, "Token Ring controller"},
-    { 0x0202, "FDDI controller"},
-    { 0x0203, "ATM controller"},
+    { 0x0200, "Ethernet controller", "ethernet"},
+    { 0x0201, "Token Ring controller", "token-ring"},
+    { 0x0202, "FDDI controller", "fddi"},
+    { 0x0203, "ATM controller", "atm"},
     { 0x0280, "Network controller"},
-    { 0x0300, "VGA controller"},
+    { 0x0300, "VGA controller", "display", 0x00ff},
     { 0x0301, "XGA controller"},
     { 0x0302, "3D controller"},
     { 0x0380, "Display controller"},
-    { 0x0400, "Video controller"},
-    { 0x0401, "Audio controller"},
+    { 0x0400, "Video controller", "video"},
+    { 0x0401, "Audio controller", "sound"},
     { 0x0402, "Phone"},
     { 0x0480, "Multimedia controller"},
-    { 0x0500, "RAM controller"},
-    { 0x0501, "Flash controller"},
+    { 0x0500, "RAM controller", "memory"},
+    { 0x0501, "Flash controller", "flash"},
     { 0x0580, "Memory controller"},
-    { 0x0600, "Host bridge"},
-    { 0x0601, "ISA bridge"},
-    { 0x0602, "EISA bridge"},
-    { 0x0603, "MC bridge"},
-    { 0x0604, "PCI bridge"},
-    { 0x0605, "PCMCIA bridge"},
-    { 0x0606, "NUBUS bridge"},
-    { 0x0607, "CARDBUS bridge"},
+    { 0x0600, "Host bridge", "host"},
+    { 0x0601, "ISA bridge", "isa"},
+    { 0x0602, "EISA bridge", "eisa"},
+    { 0x0603, "MC bridge", "mca"},
+    { 0x0604, "PCI bridge", "pci"},
+    { 0x0605, "PCMCIA bridge", "pcmcia"},
+    { 0x0606, "NUBUS bridge", "nubus"},
+    { 0x0607, "CARDBUS bridge", "cardbus"},
     { 0x0608, "RACEWAY bridge"},
     { 0x0680, "Bridge"},
-    { 0x0c03, "USB controller"},
+    { 0x0700, "Serial port", "serial"},
+    { 0x0701, "Parallel port", "parallel"},
+    { 0x0800, "Interrupt controller", "interrupt-controller"},
+    { 0x0801, "DMA controller", "dma-controller"},
+    { 0x0802, "Timer", "timer"},
+    { 0x0803, "RTC", "rtc"},
+    { 0x0900, "Keyboard", "keyboard"},
+    { 0x0901, "Pen", "pen"},
+    { 0x0902, "Mouse", "mouse"},
+    { 0x0A00, "Dock station", "dock", 0x00ff},
+    { 0x0B00, "i386 cpu", "cpu", 0x00ff},
+    { 0x0c00, "Fireware contorller", "fireware"},
+    { 0x0c01, "Access bus controller", "access-bus"},
+    { 0x0c02, "SSA controller", "ssa"},
+    { 0x0c03, "USB controller", "usb"},
+    { 0x0c04, "Fibre channel controller", "fibre-channel"},
     { 0, NULL}
 };
 
@@ -1960,6 +1980,48 @@ static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent)
     }
 }
 
+static char *pci_dev_fw_name(DeviceState *dev, char *buf, int len)
+{
+    PCIDevice *d = (PCIDevice *)dev;
+    const char *name = NULL;
+    const pci_class_desc *desc =  pci_class_descriptions;
+    int class = pci_get_word(d->config + PCI_CLASS_DEVICE);
+
+    while (desc->desc &&
+          (class & ~desc->fw_ign_bits) !=
+          (desc->class & ~desc->fw_ign_bits)) {
+        desc++;
+    }
+
+    if (desc->desc) {
+        name = desc->fw_name;
+    }
+
+    if (name) {
+        pstrcpy(buf, len, name);
+    } else {
+        snprintf(buf, len, "pci%04x,%04x",
+                 pci_get_word(d->config + PCI_VENDOR_ID),
+                 pci_get_word(d->config + PCI_DEVICE_ID));
+    }
+
+    return buf;
+}
+
+static char *pcibus_get_fw_dev_path(DeviceState *dev)
+{
+    PCIDevice *d = (PCIDevice *)dev;
+    char path[50], name[33];
+    int off;
+
+    off = snprintf(path, sizeof(path), "%s@%x",
+                   pci_dev_fw_name(dev, name, sizeof name),
+                   PCI_SLOT(d->devfn));
+    if (PCI_FUNC(d->devfn))
+        snprintf(path + off, sizeof(path) + off, ",%x", PCI_FUNC(d->devfn));
+    return strdup(path);
+}
+
 static char *pcibus_get_dev_path(DeviceState *dev)
 {
     PCIDevice *d = (PCIDevice *)dev;
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [PATCHv8 09/16] Record which USBDevice USBPort belongs too.
  2010-12-08 11:34 [Qemu-devel] [PATCHv8 00/16] boot order specification Gleb Natapov
                   ` (7 preceding siblings ...)
  2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 08/16] Add get_fw_dev_path callback for pci bus Gleb Natapov
@ 2010-12-08 11:35 ` Gleb Natapov
  2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 10/16] Add get_fw_dev_path callback for usb bus Gleb Natapov
                   ` (8 subsequent siblings)
  17 siblings, 0 replies; 38+ messages in thread
From: Gleb Natapov @ 2010-12-08 11:35 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, kevin, kvm

Ports on root hub will have NULL here. This is needed to reconstruct
path from device to its root hub to build device path.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
---
 hw/usb-bus.c  |    3 ++-
 hw/usb-hub.c  |    2 +-
 hw/usb-musb.c |    2 +-
 hw/usb-ohci.c |    2 +-
 hw/usb-uhci.c |    2 +-
 hw/usb.h      |    3 ++-
 6 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/hw/usb-bus.c b/hw/usb-bus.c
index b692503..256b881 100644
--- a/hw/usb-bus.c
+++ b/hw/usb-bus.c
@@ -110,11 +110,12 @@ USBDevice *usb_create_simple(USBBus *bus, const char *name)
 }
 
 void usb_register_port(USBBus *bus, USBPort *port, void *opaque, int index,
-                       usb_attachfn attach)
+                       USBDevice *pdev, usb_attachfn attach)
 {
     port->opaque = opaque;
     port->index = index;
     port->attach = attach;
+    port->pdev = pdev;
     QTAILQ_INSERT_TAIL(&bus->free, port, next);
     bus->nfree++;
 }
diff --git a/hw/usb-hub.c b/hw/usb-hub.c
index 8e3a96b..8a3f829 100644
--- a/hw/usb-hub.c
+++ b/hw/usb-hub.c
@@ -535,7 +535,7 @@ static int usb_hub_initfn(USBDevice *dev)
     for (i = 0; i < s->nb_ports; i++) {
         port = &s->ports[i];
         usb_register_port(usb_bus_from_device(dev),
-                          &port->port, s, i, usb_hub_attach);
+                          &port->port, s, i, &s->dev, usb_hub_attach);
         port->wPortStatus = PORT_STAT_POWER;
         port->wPortChange = 0;
     }
diff --git a/hw/usb-musb.c b/hw/usb-musb.c
index 7f15842..9efe7a6 100644
--- a/hw/usb-musb.c
+++ b/hw/usb-musb.c
@@ -343,7 +343,7 @@ struct MUSBState {
     }
 
     usb_bus_new(&s->bus, NULL /* FIXME */);
-    usb_register_port(&s->bus, &s->port, s, 0, musb_attach);
+    usb_register_port(&s->bus, &s->port, s, 0, NULL, musb_attach);
 
     return s;
 }
diff --git a/hw/usb-ohci.c b/hw/usb-ohci.c
index 8fb2f83..1247295 100644
--- a/hw/usb-ohci.c
+++ b/hw/usb-ohci.c
@@ -1705,7 +1705,7 @@ static void usb_ohci_init(OHCIState *ohci, DeviceState *dev,
     usb_bus_new(&ohci->bus, dev);
     ohci->num_ports = num_ports;
     for (i = 0; i < num_ports; i++) {
-        usb_register_port(&ohci->bus, &ohci->rhport[i].port, ohci, i, ohci_attach);
+        usb_register_port(&ohci->bus, &ohci->rhport[i].port, ohci, i, NULL, ohci_attach);
     }
 
     ohci->async_td = 0;
diff --git a/hw/usb-uhci.c b/hw/usb-uhci.c
index 1d83400..b9b822f 100644
--- a/hw/usb-uhci.c
+++ b/hw/usb-uhci.c
@@ -1115,7 +1115,7 @@ static int usb_uhci_common_initfn(UHCIState *s)
 
     usb_bus_new(&s->bus, &s->dev.qdev);
     for(i = 0; i < NB_PORTS; i++) {
-        usb_register_port(&s->bus, &s->ports[i].port, s, i, uhci_attach);
+        usb_register_port(&s->bus, &s->ports[i].port, s, i, NULL, uhci_attach);
     }
     s->frame_timer = qemu_new_timer(vm_clock, uhci_frame_timer, s);
     s->expire_time = qemu_get_clock(vm_clock) +
diff --git a/hw/usb.h b/hw/usb.h
index 00d2802..0b32d77 100644
--- a/hw/usb.h
+++ b/hw/usb.h
@@ -203,6 +203,7 @@ struct USBPort {
     USBDevice *dev;
     usb_attachfn attach;
     void *opaque;
+    USBDevice *pdev;
     int index; /* internal port index, may be used with the opaque */
     QTAILQ_ENTRY(USBPort) next;
 };
@@ -312,7 +313,7 @@ USBDevice *usb_create(USBBus *bus, const char *name);
 USBDevice *usb_create_simple(USBBus *bus, const char *name);
 USBDevice *usbdevice_create(const char *cmdline);
 void usb_register_port(USBBus *bus, USBPort *port, void *opaque, int index,
-                       usb_attachfn attach);
+                       USBDevice *pdev, usb_attachfn attach);
 void usb_unregister_port(USBBus *bus, USBPort *port);
 int usb_device_attach(USBDevice *dev);
 int usb_device_detach(USBDevice *dev);
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [PATCHv8 10/16] Add get_fw_dev_path callback for usb bus.
  2010-12-08 11:34 [Qemu-devel] [PATCHv8 00/16] boot order specification Gleb Natapov
                   ` (8 preceding siblings ...)
  2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 09/16] Record which USBDevice USBPort belongs too Gleb Natapov
@ 2010-12-08 11:35 ` Gleb Natapov
  2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 11/16] Add get_fw_dev_path callback to scsi bus Gleb Natapov
                   ` (7 subsequent siblings)
  17 siblings, 0 replies; 38+ messages in thread
From: Gleb Natapov @ 2010-12-08 11:35 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, kevin, kvm


Signed-off-by: Gleb Natapov <gleb@redhat.com>
---
 hw/usb-bus.c |   42 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 42 insertions(+), 0 deletions(-)

diff --git a/hw/usb-bus.c b/hw/usb-bus.c
index 256b881..8b4583c 100644
--- a/hw/usb-bus.c
+++ b/hw/usb-bus.c
@@ -5,11 +5,13 @@
 #include "monitor.h"
 
 static void usb_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent);
+static char *usbbus_get_fw_dev_path(DeviceState *dev);
 
 static struct BusInfo usb_bus_info = {
     .name      = "USB",
     .size      = sizeof(USBBus),
     .print_dev = usb_bus_dev_print,
+    .get_fw_dev_path = usbbus_get_fw_dev_path,
 };
 static int next_usb_bus = 0;
 static QTAILQ_HEAD(, USBBus) busses = QTAILQ_HEAD_INITIALIZER(busses);
@@ -307,3 +309,43 @@ USBDevice *usbdevice_create(const char *cmdline)
     }
     return usb->usbdevice_init(params);
 }
+
+static int usbbus_get_fw_dev_path_helper(USBDevice *d, USBBus *bus, char *p,
+                                         int len)
+{
+    int l = 0;
+    USBPort *port;
+
+    QTAILQ_FOREACH(port, &bus->used, next) {
+        if (port->dev == d) {
+            if (port->pdev) {
+                l = usbbus_get_fw_dev_path_helper(port->pdev, bus, p, len);
+            }
+            l += snprintf(p + l, len - l, "%s@%x/", qdev_fw_name(&d->qdev),
+                          port->index);
+            break;
+        }
+    }
+
+    return l;
+}
+
+static char *usbbus_get_fw_dev_path(DeviceState *dev)
+{
+    USBDevice *d = (USBDevice*)dev;
+    USBBus *bus = usb_bus_from_device(d);
+    char path[100];
+    int l;
+
+    assert(d->attached != 0);
+
+    l = usbbus_get_fw_dev_path_helper(d, bus, path, sizeof(path));
+
+    if (l == 0) {
+        abort();
+    }
+
+    path[l-1] = '\0';
+
+    return strdup(path);
+}
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [PATCHv8 11/16] Add get_fw_dev_path callback to scsi bus.
  2010-12-08 11:34 [Qemu-devel] [PATCHv8 00/16] boot order specification Gleb Natapov
                   ` (9 preceding siblings ...)
  2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 10/16] Add get_fw_dev_path callback for usb bus Gleb Natapov
@ 2010-12-08 11:35 ` Gleb Natapov
  2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 12/16] Add bootindex parameter to net/block/fd device Gleb Natapov
                   ` (6 subsequent siblings)
  17 siblings, 0 replies; 38+ messages in thread
From: Gleb Natapov @ 2010-12-08 11:35 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, kevin, kvm


Signed-off-by: Gleb Natapov <gleb@redhat.com>
---
 hw/scsi-bus.c |   23 +++++++++++++++++++++++
 1 files changed, 23 insertions(+), 0 deletions(-)

diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c
index 93f0e9a..7febb86 100644
--- a/hw/scsi-bus.c
+++ b/hw/scsi-bus.c
@@ -5,9 +5,12 @@
 #include "qdev.h"
 #include "blockdev.h"
 
+static char *scsibus_get_fw_dev_path(DeviceState *dev);
+
 static struct BusInfo scsi_bus_info = {
     .name  = "SCSI",
     .size  = sizeof(SCSIBus),
+    .get_fw_dev_path = scsibus_get_fw_dev_path,
     .props = (Property[]) {
         DEFINE_PROP_UINT32("scsi-id", SCSIDevice, id, -1),
         DEFINE_PROP_END_OF_LIST(),
@@ -518,3 +521,23 @@ void scsi_req_complete(SCSIRequest *req)
                        req->tag,
                        req->status);
 }
+
+static char *scsibus_get_fw_dev_path(DeviceState *dev)
+{
+    SCSIDevice *d = (SCSIDevice*)dev;
+    SCSIBus *bus = scsi_bus_from_device(d);
+    char path[100];
+    int i;
+
+    for (i = 0; i < bus->ndev; i++) {
+        if (bus->devs[i] == d) {
+            break;
+        }
+    }
+
+    assert(i != bus->ndev);
+
+    snprintf(path, sizeof(path), "%s@%x", qdev_fw_name(dev), i);
+
+    return strdup(path);
+}
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [PATCHv8 12/16] Add bootindex parameter to net/block/fd device
  2010-12-08 11:34 [Qemu-devel] [PATCHv8 00/16] boot order specification Gleb Natapov
                   ` (10 preceding siblings ...)
  2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 11/16] Add get_fw_dev_path callback to scsi bus Gleb Natapov
@ 2010-12-08 11:35 ` Gleb Natapov
  2011-01-28 13:29   ` Markus Armbruster
  2011-02-02 15:08   ` Markus Armbruster
  2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 13/16] Change fw_cfg_add_file() to get full file path as a parameter Gleb Natapov
                   ` (5 subsequent siblings)
  17 siblings, 2 replies; 38+ messages in thread
From: Gleb Natapov @ 2010-12-08 11:35 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, kevin, kvm

If bootindex is specified on command line a string that describes device
in firmware readable way is added into sorted list. Later this list will
be passed into firmware to control boot order.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
---
 block_int.h     |    4 +++-
 hw/e1000.c      |    4 ++++
 hw/eepro100.c   |    3 +++
 hw/fdc.c        |    8 ++++++++
 hw/ide/qdev.c   |    5 +++++
 hw/ne2000.c     |    3 +++
 hw/pcnet.c      |    4 ++++
 hw/qdev.c       |   32 ++++++++++++++++++++++++++++++++
 hw/qdev.h       |    1 +
 hw/rtl8139.c    |    4 ++++
 hw/scsi-disk.c  |    1 +
 hw/usb-net.c    |    2 ++
 hw/virtio-blk.c |    2 ++
 hw/virtio-net.c |    2 ++
 net.h           |    4 +++-
 sysemu.h        |    2 ++
 vl.c            |   40 ++++++++++++++++++++++++++++++++++++++++
 17 files changed, 119 insertions(+), 2 deletions(-)

diff --git a/block_int.h b/block_int.h
index 3c3adb5..0a0e47d 100644
--- a/block_int.h
+++ b/block_int.h
@@ -227,6 +227,7 @@ typedef struct BlockConf {
     uint16_t logical_block_size;
     uint16_t min_io_size;
     uint32_t opt_io_size;
+    int32_t bootindex;
 } BlockConf;
 
 static inline unsigned int get_physical_block_exp(BlockConf *conf)
@@ -249,6 +250,7 @@ static inline unsigned int get_physical_block_exp(BlockConf *conf)
     DEFINE_PROP_UINT16("physical_block_size", _state,                   \
                        _conf.physical_block_size, 512),                 \
     DEFINE_PROP_UINT16("min_io_size", _state, _conf.min_io_size, 0),  \
-    DEFINE_PROP_UINT32("opt_io_size", _state, _conf.opt_io_size, 0)
+    DEFINE_PROP_UINT32("opt_io_size", _state, _conf.opt_io_size, 0),    \
+    DEFINE_PROP_INT32("bootindex", _state, _conf.bootindex, -1)         \
 
 #endif /* BLOCK_INT_H */
diff --git a/hw/e1000.c b/hw/e1000.c
index 57d08cf..e411b03 100644
--- a/hw/e1000.c
+++ b/hw/e1000.c
@@ -30,6 +30,7 @@
 #include "net.h"
 #include "net/checksum.h"
 #include "loader.h"
+#include "sysemu.h"
 
 #include "e1000_hw.h"
 
@@ -1154,6 +1155,9 @@ static int pci_e1000_init(PCIDevice *pci_dev)
                           d->dev.qdev.info->name, d->dev.qdev.id, d);
 
     qemu_format_nic_info_str(&d->nic->nc, macaddr);
+
+    add_boot_device_path(d->conf.bootindex, &pci_dev->qdev, "/ethernet-phy@0");
+
     return 0;
 }
 
diff --git a/hw/eepro100.c b/hw/eepro100.c
index f8a700a..a464e9b 100644
--- a/hw/eepro100.c
+++ b/hw/eepro100.c
@@ -46,6 +46,7 @@
 #include "pci.h"
 #include "net.h"
 #include "eeprom93xx.h"
+#include "sysemu.h"
 
 #define KiB 1024
 
@@ -1907,6 +1908,8 @@ static int e100_nic_init(PCIDevice *pci_dev)
     s->vmstate->name = s->nic->nc.model;
     vmstate_register(&pci_dev->qdev, -1, s->vmstate, s);
 
+    add_boot_device_path(s->conf.bootindex, &pci_dev->qdev, "/ethernet-phy@0");
+
     return 0;
 }
 
diff --git a/hw/fdc.c b/hw/fdc.c
index 22fb64a..a7c7c17 100644
--- a/hw/fdc.c
+++ b/hw/fdc.c
@@ -35,6 +35,7 @@
 #include "sysbus.h"
 #include "qdev-addr.h"
 #include "blockdev.h"
+#include "sysemu.h"
 
 /********************************************************/
 /* debug Floppy devices */
@@ -523,6 +524,8 @@ typedef struct FDCtrlSysBus {
 typedef struct FDCtrlISABus {
     ISADevice busdev;
     struct FDCtrl state;
+    int32_t bootindexA;
+    int32_t bootindexB;
 } FDCtrlISABus;
 
 static uint32_t fdctrl_read (void *opaque, uint32_t reg)
@@ -1992,6 +1995,9 @@ static int isabus_fdc_init1(ISADevice *dev)
     qdev_set_legacy_instance_id(&dev->qdev, iobase, 2);
     ret = fdctrl_init_common(fdctrl);
 
+    add_boot_device_path(isa->bootindexA, &dev->qdev, "/floppy@0");
+    add_boot_device_path(isa->bootindexB, &dev->qdev, "/floppy@1");
+
     return ret;
 }
 
@@ -2051,6 +2057,8 @@ static ISADeviceInfo isa_fdc_info = {
     .qdev.props = (Property[]) {
         DEFINE_PROP_DRIVE("driveA", FDCtrlISABus, state.drives[0].bs),
         DEFINE_PROP_DRIVE("driveB", FDCtrlISABus, state.drives[1].bs),
+        DEFINE_PROP_INT32("bootindexA", FDCtrlISABus, bootindexA, -1),
+        DEFINE_PROP_INT32("bootindexB", FDCtrlISABus, bootindexB, -1),
         DEFINE_PROP_END_OF_LIST(),
     },
 };
diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c
index 01a181b..2bb5c27 100644
--- a/hw/ide/qdev.c
+++ b/hw/ide/qdev.c
@@ -21,6 +21,7 @@
 #include "qemu-error.h"
 #include <hw/ide/internal.h>
 #include "blockdev.h"
+#include "sysemu.h"
 
 /* --------------------------------- */
 
@@ -143,6 +144,10 @@ static int ide_drive_initfn(IDEDevice *dev)
     if (!dev->serial) {
         dev->serial = qemu_strdup(s->drive_serial_str);
     }
+
+    add_boot_device_path(dev->conf.bootindex, &dev->qdev,
+                         dev->unit ? "/disk@1" : "/disk@0");
+
     return 0;
 }
 
diff --git a/hw/ne2000.c b/hw/ne2000.c
index 126e7cf..a030106 100644
--- a/hw/ne2000.c
+++ b/hw/ne2000.c
@@ -26,6 +26,7 @@
 #include "net.h"
 #include "ne2000.h"
 #include "loader.h"
+#include "sysemu.h"
 
 /* debug NE2000 card */
 //#define DEBUG_NE2000
@@ -746,6 +747,8 @@ static int pci_ne2000_init(PCIDevice *pci_dev)
         }
     }
 
+    add_boot_device_path(s->c.bootindex, &pci_dev->qdev, "/ethernet-phy@0");
+
     return 0;
 }
 
diff --git a/hw/pcnet.c b/hw/pcnet.c
index 37010b8..db52dc5 100644
--- a/hw/pcnet.c
+++ b/hw/pcnet.c
@@ -39,6 +39,7 @@
 #include "net.h"
 #include "qemu-timer.h"
 #include "qemu_socket.h"
+#include "sysemu.h"
 
 #include "pcnet.h"
 
@@ -1740,5 +1741,8 @@ int pcnet_common_init(DeviceState *dev, PCNetState *s, NetClientInfo *info)
     qemu_macaddr_default_if_unset(&s->conf.macaddr);
     s->nic = qemu_new_nic(info, &s->conf, dev->info->name, dev->id, s);
     qemu_format_nic_info_str(&s->nic->nc, s->conf.macaddr.a);
+
+    add_boot_device_path(s->conf.bootindex, dev, "/ethernet-phy@0");
+
     return 0;
 }
diff --git a/hw/qdev.c b/hw/qdev.c
index b65b63e..10e28df 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -889,3 +889,35 @@ int do_device_del(Monitor *mon, const QDict *qdict, QObject **ret_data)
     }
     return qdev_unplug(dev);
 }
+
+static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
+{
+    int l = 0;
+
+    if (dev && dev->parent_bus) {
+        char *d;
+        l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
+        if (dev->parent_bus->info->get_fw_dev_path) {
+            d = dev->parent_bus->info->get_fw_dev_path(dev);
+            l += snprintf(p + l, size - l, "%s", d);
+            qemu_free(d);
+        } else {
+            l += snprintf(p + l, size - l, "%s", dev->info->name);
+        }
+    }
+    l += snprintf(p + l , size - l, "/");
+
+    return l;
+}
+
+char* qdev_get_fw_dev_path(DeviceState *dev)
+{
+    char path[128];
+    int l;
+
+    l = qdev_get_fw_dev_path_helper(dev, path, 128);
+
+    path[l-1] = '\0';
+
+    return strdup(path);
+}
diff --git a/hw/qdev.h b/hw/qdev.h
index f72fbde..aaaf55a 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -319,6 +319,7 @@ static inline const char *qdev_fw_name(DeviceState *dev)
     return dev->info->fw_name ? : dev->info->alias ? : dev->info->name;
 }
 
+char *qdev_get_fw_dev_path(DeviceState *dev);
 /* This is a nasty hack to allow passing a NULL bus to qdev_create.  */
 extern struct BusInfo system_bus_info;
 
diff --git a/hw/rtl8139.c b/hw/rtl8139.c
index d92981d..80a2813 100644
--- a/hw/rtl8139.c
+++ b/hw/rtl8139.c
@@ -52,6 +52,7 @@
 #include "qemu-timer.h"
 #include "net.h"
 #include "loader.h"
+#include "sysemu.h"
 
 /* debug RTL8139 card */
 //#define DEBUG_RTL8139 1
@@ -3387,6 +3388,9 @@ static int pci_rtl8139_init(PCIDevice *dev)
     s->TimerExpire = 0;
     s->timer = qemu_new_timer(vm_clock, rtl8139_timer, s);
     rtl8139_set_next_tctr_time(s, qemu_get_clock(vm_clock));
+
+    add_boot_device_path(s->conf.bootindex, &dev->qdev, "/ethernet-phy@0");
+
     return 0;
 }
 
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index 851046f..87f9e86 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -1225,6 +1225,7 @@ static int scsi_disk_initfn(SCSIDevice *dev)
     s->qdev.type = TYPE_DISK;
     qemu_add_vm_change_state_handler(scsi_dma_restart_cb, s);
     bdrv_set_removable(s->bs, is_cd);
+    add_boot_device_path(s->qdev.conf.bootindex, &dev->qdev, ",0");
     return 0;
 }
 
diff --git a/hw/usb-net.c b/hw/usb-net.c
index f6bed21..8492455 100644
--- a/hw/usb-net.c
+++ b/hw/usb-net.c
@@ -27,6 +27,7 @@
 #include "usb.h"
 #include "net.h"
 #include "qemu-queue.h"
+#include "sysemu.h"
 
 /*#define TRAFFIC_DEBUG*/
 /* Thanks to NetChip Technologies for donating this product ID.
@@ -1463,6 +1464,7 @@ static int usb_net_initfn(USBDevice *dev)
              s->conf.macaddr.a[4],
              s->conf.macaddr.a[5]);
 
+    add_boot_device_path(s->conf.bootindex, &dev->qdev, "/ethernet@0");
     return 0;
 }
 
diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c
index e5f9b27..f62ccd1 100644
--- a/hw/virtio-blk.c
+++ b/hw/virtio-blk.c
@@ -548,6 +548,8 @@ VirtIODevice *virtio_blk_init(DeviceState *dev, BlockConf *conf)
     bdrv_set_removable(s->bs, 0);
     s->bs->buffer_alignment = conf->logical_block_size;
 
+    add_boot_device_path(conf->bootindex, dev, "/disk@0,0");
+
     return &s->vdev;
 }
 
diff --git a/hw/virtio-net.c b/hw/virtio-net.c
index 1d61f19..3472f6b 100644
--- a/hw/virtio-net.c
+++ b/hw/virtio-net.c
@@ -1017,6 +1017,8 @@ VirtIODevice *virtio_net_init(DeviceState *dev, NICConf *conf,
                     virtio_net_save, virtio_net_load, n);
     n->vmstate = qemu_add_vm_change_state_handler(virtio_net_vmstate_change, n);
 
+    add_boot_device_path(conf->bootindex, dev, "/ethernet-phy@0");
+
     return &n->vdev;
 }
 
diff --git a/net.h b/net.h
index 44c31a9..6ceca50 100644
--- a/net.h
+++ b/net.h
@@ -17,12 +17,14 @@ typedef struct NICConf {
     MACAddr macaddr;
     VLANState *vlan;
     VLANClientState *peer;
+    int32_t bootindex;
 } NICConf;
 
 #define DEFINE_NIC_PROPERTIES(_state, _conf)                            \
     DEFINE_PROP_MACADDR("mac",   _state, _conf.macaddr),                \
     DEFINE_PROP_VLAN("vlan",     _state, _conf.vlan),                   \
-    DEFINE_PROP_NETDEV("netdev", _state, _conf.peer)
+    DEFINE_PROP_NETDEV("netdev", _state, _conf.peer),                   \
+    DEFINE_PROP_INT32("bootindex", _state, _conf.bootindex, -1)
 
 /* VLANs support */
 
diff --git a/sysemu.h b/sysemu.h
index b81a70e..fe9a582 100644
--- a/sysemu.h
+++ b/sysemu.h
@@ -188,4 +188,6 @@ void rtc_change_mon_event(struct tm *tm);
 
 void register_devices(void);
 
+void add_boot_device_path(int32_t bootindex, DeviceState *dev,
+                          const char *suffix);
 #endif
diff --git a/vl.c b/vl.c
index 2cd263e..dadc161 100644
--- a/vl.c
+++ b/vl.c
@@ -229,6 +229,17 @@ unsigned int nb_prom_envs = 0;
 const char *prom_envs[MAX_PROM_ENVS];
 int boot_menu;
 
+typedef struct FWBootEntry FWBootEntry;
+
+struct FWBootEntry {
+    QTAILQ_ENTRY(FWBootEntry) link;
+    int32_t bootindex;
+    DeviceState *dev;
+    char *suffix;
+};
+
+QTAILQ_HEAD(, FWBootEntry) fw_boot_order = QTAILQ_HEAD_INITIALIZER(fw_boot_order);
+
 int nb_numa_nodes;
 uint64_t node_mem[MAX_NODES];
 uint64_t node_cpumask[MAX_NODES];
@@ -693,6 +704,35 @@ static void restore_boot_devices(void *opaque)
     qemu_free(standard_boot_devices);
 }
 
+void add_boot_device_path(int32_t bootindex, DeviceState *dev,
+                          const char *suffix)
+{
+    FWBootEntry *node, *i;
+
+    if (bootindex < 0) {
+        return;
+    }
+
+    assert(dev != NULL || suffix != NULL);
+
+    node = qemu_mallocz(sizeof(FWBootEntry));
+    node->bootindex = bootindex;
+    node->suffix = strdup(suffix);
+    node->dev = dev;
+
+    QTAILQ_FOREACH(i, &fw_boot_order, link) {
+        if (i->bootindex == bootindex) {
+            fprintf(stderr, "Two devices with same boot index %d\n", bootindex);
+            exit(1);
+        } else if (i->bootindex < bootindex) {
+            continue;
+        }
+        QTAILQ_INSERT_BEFORE(i, node, link);
+        return;
+    }
+    QTAILQ_INSERT_TAIL(&fw_boot_order, node, link);
+}
+
 static void numa_add(const char *optarg)
 {
     char option[128];
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [PATCHv8 13/16] Change fw_cfg_add_file() to get full file path as a parameter.
  2010-12-08 11:34 [Qemu-devel] [PATCHv8 00/16] boot order specification Gleb Natapov
                   ` (11 preceding siblings ...)
  2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 12/16] Add bootindex parameter to net/block/fd device Gleb Natapov
@ 2010-12-08 11:35 ` Gleb Natapov
  2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 14/16] Add bootindex for option roms Gleb Natapov
                   ` (4 subsequent siblings)
  17 siblings, 0 replies; 38+ messages in thread
From: Gleb Natapov @ 2010-12-08 11:35 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, kevin, kvm

Change fw_cfg_add_file() to get full file path as a parameter instead
of building one internally. Two reasons for that. First caller may need
to know how file is named. Second this moves policy of file naming out
from fw_cfg. Platform may want to use more then two levels of
directories for instance.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
---
 hw/fw_cfg.c |   16 ++++------------
 hw/fw_cfg.h |    4 ++--
 hw/loader.c |   16 ++++++++++++++--
 3 files changed, 20 insertions(+), 16 deletions(-)

diff --git a/hw/fw_cfg.c b/hw/fw_cfg.c
index 72866ae..7b9434f 100644
--- a/hw/fw_cfg.c
+++ b/hw/fw_cfg.c
@@ -277,10 +277,9 @@ int fw_cfg_add_callback(FWCfgState *s, uint16_t key, FWCfgCallback callback,
     return 1;
 }
 
-int fw_cfg_add_file(FWCfgState *s,  const char *dir, const char *filename,
-                    uint8_t *data, uint32_t len)
+int fw_cfg_add_file(FWCfgState *s,  const char *filename, uint8_t *data,
+                    uint32_t len)
 {
-    const char *basename;
     int i, index;
 
     if (!s->files) {
@@ -297,15 +296,8 @@ int fw_cfg_add_file(FWCfgState *s,  const char *dir, const char *filename,
 
     fw_cfg_add_bytes(s, FW_CFG_FILE_FIRST + index, data, len);
 
-    basename = strrchr(filename, '/');
-    if (basename) {
-        basename++;
-    } else {
-        basename = filename;
-    }
-
-    snprintf(s->files->f[index].name, sizeof(s->files->f[index].name),
-             "%s/%s", dir, basename);
+    pstrcpy(s->files->f[index].name, sizeof(s->files->f[index].name),
+            filename);
     for (i = 0; i < index; i++) {
         if (strcmp(s->files->f[index].name, s->files->f[i].name) == 0) {
             FW_CFG_DPRINTF("%s: skip duplicate: %s\n", __FUNCTION__,
diff --git a/hw/fw_cfg.h b/hw/fw_cfg.h
index 4d13a4f..856bf91 100644
--- a/hw/fw_cfg.h
+++ b/hw/fw_cfg.h
@@ -60,8 +60,8 @@ int fw_cfg_add_i32(FWCfgState *s, uint16_t key, uint32_t value);
 int fw_cfg_add_i64(FWCfgState *s, uint16_t key, uint64_t value);
 int fw_cfg_add_callback(FWCfgState *s, uint16_t key, FWCfgCallback callback,
                         void *callback_opaque, uint8_t *data, size_t len);
-int fw_cfg_add_file(FWCfgState *s, const char *dir, const char *filename,
-                    uint8_t *data, uint32_t len);
+int fw_cfg_add_file(FWCfgState *s, const char *filename, uint8_t *data,
+                    uint32_t len);
 FWCfgState *fw_cfg_init(uint32_t ctl_port, uint32_t data_port,
                         target_phys_addr_t crl_addr, target_phys_addr_t data_addr);
 
diff --git a/hw/loader.c b/hw/loader.c
index 49ac1fa..1e98326 100644
--- a/hw/loader.c
+++ b/hw/loader.c
@@ -592,8 +592,20 @@ int rom_add_file(const char *file, const char *fw_dir,
     }
     close(fd);
     rom_insert(rom);
-    if (rom->fw_file && fw_cfg)
-        fw_cfg_add_file(fw_cfg, rom->fw_dir, rom->fw_file, rom->data, rom->romsize);
+    if (rom->fw_file && fw_cfg) {
+        const char *basename;
+        char fw_file_name[56];
+
+        basename = strrchr(rom->fw_file, '/');
+        if (basename) {
+            basename++;
+        } else {
+            basename = rom->fw_file;
+        }
+        snprintf(fw_file_name, sizeof(fw_file_name), "%s/%s", rom->fw_dir,
+                 basename);
+        fw_cfg_add_file(fw_cfg, fw_file_name, rom->data, rom->romsize);
+    }
     return 0;
 
 err:
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [PATCHv8 14/16] Add bootindex for option roms.
  2010-12-08 11:34 [Qemu-devel] [PATCHv8 00/16] boot order specification Gleb Natapov
                   ` (12 preceding siblings ...)
  2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 13/16] Change fw_cfg_add_file() to get full file path as a parameter Gleb Natapov
@ 2010-12-08 11:35 ` Gleb Natapov
  2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 15/16] Add notifier that will be called when machine is fully created Gleb Natapov
                   ` (3 subsequent siblings)
  17 siblings, 0 replies; 38+ messages in thread
From: Gleb Natapov @ 2010-12-08 11:35 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, kevin, kvm

Extend -option-rom command to have additional parameter ,bootindex=.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
---
 hw/loader.c    |   16 +++++++++++-----
 hw/loader.h    |    8 ++++----
 hw/multiboot.c |    3 ++-
 hw/ne2000.c    |    2 +-
 hw/nseries.c   |    4 ++--
 hw/palm.c      |    6 +++---
 hw/pc.c        |    7 ++++---
 hw/pci.c       |    2 +-
 hw/pcnet-pci.c |    2 +-
 qemu-config.c  |   17 +++++++++++++++++
 sysemu.h       |    6 +++++-
 vl.c           |   11 +++++++++--
 12 files changed, 60 insertions(+), 24 deletions(-)

diff --git a/hw/loader.c b/hw/loader.c
index 1e98326..eb198f6 100644
--- a/hw/loader.c
+++ b/hw/loader.c
@@ -107,7 +107,7 @@ int load_image_targphys(const char *filename,
 
     size = get_image_size(filename);
     if (size > 0)
-        rom_add_file_fixed(filename, addr);
+        rom_add_file_fixed(filename, addr, -1);
     return size;
 }
 
@@ -557,10 +557,11 @@ static void rom_insert(Rom *rom)
 }
 
 int rom_add_file(const char *file, const char *fw_dir,
-                 target_phys_addr_t addr)
+                 target_phys_addr_t addr, int32_t bootindex)
 {
     Rom *rom;
     int rc, fd = -1;
+    char devpath[100];
 
     rom = qemu_mallocz(sizeof(*rom));
     rom->name = qemu_strdup(file);
@@ -605,7 +606,12 @@ int rom_add_file(const char *file, const char *fw_dir,
         snprintf(fw_file_name, sizeof(fw_file_name), "%s/%s", rom->fw_dir,
                  basename);
         fw_cfg_add_file(fw_cfg, fw_file_name, rom->data, rom->romsize);
+        snprintf(devpath, sizeof(devpath), "/rom@%s", fw_file_name);
+    } else {
+        snprintf(devpath, sizeof(devpath), "/rom@" TARGET_FMT_plx, addr);
     }
+
+    add_boot_device_path(bootindex, NULL, devpath);
     return 0;
 
 err:
@@ -635,12 +641,12 @@ int rom_add_blob(const char *name, const void *blob, size_t len,
 
 int rom_add_vga(const char *file)
 {
-    return rom_add_file(file, "vgaroms", 0);
+    return rom_add_file(file, "vgaroms", 0, -1);
 }
 
-int rom_add_option(const char *file)
+int rom_add_option(const char *file, int32_t bootindex)
 {
-    return rom_add_file(file, "genroms", 0);
+    return rom_add_file(file, "genroms", 0, bootindex);
 }
 
 static void rom_reset(void *unused)
diff --git a/hw/loader.h b/hw/loader.h
index 1f82fc5..fc6bdff 100644
--- a/hw/loader.h
+++ b/hw/loader.h
@@ -22,7 +22,7 @@ void pstrcpy_targphys(const char *name,
 
 
 int rom_add_file(const char *file, const char *fw_dir,
-                 target_phys_addr_t addr);
+                 target_phys_addr_t addr, int32_t bootindex);
 int rom_add_blob(const char *name, const void *blob, size_t len,
                  target_phys_addr_t addr);
 int rom_load_all(void);
@@ -31,8 +31,8 @@ int rom_copy(uint8_t *dest, target_phys_addr_t addr, size_t size);
 void *rom_ptr(target_phys_addr_t addr);
 void do_info_roms(Monitor *mon);
 
-#define rom_add_file_fixed(_f, _a)              \
-    rom_add_file(_f, NULL, _a)
+#define rom_add_file_fixed(_f, _a, _i)          \
+    rom_add_file(_f, NULL, _a, _i)
 #define rom_add_blob_fixed(_f, _b, _l, _a)      \
     rom_add_blob(_f, _b, _l, _a)
 
@@ -43,6 +43,6 @@ void do_info_roms(Monitor *mon);
 #define PC_ROM_SIZE        (PC_ROM_MAX - PC_ROM_MIN_VGA)
 
 int rom_add_vga(const char *file);
-int rom_add_option(const char *file);
+int rom_add_option(const char *file, int32_t bootindex);
 
 #endif
diff --git a/hw/multiboot.c b/hw/multiboot.c
index e710bbb..7cc3055 100644
--- a/hw/multiboot.c
+++ b/hw/multiboot.c
@@ -331,7 +331,8 @@ int load_multiboot(void *fw_cfg,
     fw_cfg_add_bytes(fw_cfg, FW_CFG_INITRD_DATA, mb_bootinfo_data,
                      sizeof(bootinfo));
 
-    option_rom[nb_option_roms] = "multiboot.bin";
+    option_rom[nb_option_roms].name = "multiboot.bin";
+    option_rom[nb_option_roms].bootindex = 0;
     nb_option_roms++;
 
     return 1; /* yes, we are multiboot */
diff --git a/hw/ne2000.c b/hw/ne2000.c
index a030106..5966359 100644
--- a/hw/ne2000.c
+++ b/hw/ne2000.c
@@ -742,7 +742,7 @@ static int pci_ne2000_init(PCIDevice *pci_dev)
     if (!pci_dev->qdev.hotplugged) {
         static int loaded = 0;
         if (!loaded) {
-            rom_add_option("pxe-ne2k_pci.bin");
+            rom_add_option("pxe-ne2k_pci.bin", -1);
             loaded = 1;
         }
     }
diff --git a/hw/nseries.c b/hw/nseries.c
index 04a028d..2f6f473 100644
--- a/hw/nseries.c
+++ b/hw/nseries.c
@@ -1326,7 +1326,7 @@ static void n8x0_init(ram_addr_t ram_size, const char *boot_device,
         qemu_register_reset(n8x0_boot_init, s);
     }
 
-    if (option_rom[0] && (boot_device[0] == 'n' || !kernel_filename)) {
+    if (option_rom[0].name && (boot_device[0] == 'n' || !kernel_filename)) {
         int rom_size;
         uint8_t nolo_tags[0x10000];
         /* No, wait, better start at the ROM.  */
@@ -1341,7 +1341,7 @@ static void n8x0_init(ram_addr_t ram_size, const char *boot_device,
          *
          * The code above is for loading the `zImage' file from Nokia
          * images.  */
-        rom_size = load_image_targphys(option_rom[0],
+        rom_size = load_image_targphys(option_rom[0].name,
                                        OMAP2_Q2_BASE + 0x400000,
                                        sdram_size - 0x400000);
         printf("%i bytes of image loaded\n", rom_size);
diff --git a/hw/palm.c b/hw/palm.c
index 193aa11..dafc487 100644
--- a/hw/palm.c
+++ b/hw/palm.c
@@ -234,20 +234,20 @@ static void palmte_init(ram_addr_t ram_size,
 
     /* Setup initial (reset) machine state */
     if (nb_option_roms) {
-        rom_size = get_image_size(option_rom[0]);
+        rom_size = get_image_size(option_rom[0].name);
         if (rom_size > flash_size) {
             fprintf(stderr, "%s: ROM image too big (%x > %x)\n",
                             __FUNCTION__, rom_size, flash_size);
             rom_size = 0;
         }
         if (rom_size > 0) {
-            rom_size = load_image_targphys(option_rom[0], OMAP_CS0_BASE,
+            rom_size = load_image_targphys(option_rom[0].name, OMAP_CS0_BASE,
                                            flash_size);
             rom_loaded = 1;
         }
         if (rom_size < 0) {
             fprintf(stderr, "%s: error loading '%s'\n",
-                            __FUNCTION__, option_rom[0]);
+                            __FUNCTION__, option_rom[0].name);
         }
     }
 
diff --git a/hw/pc.c b/hw/pc.c
index 119c110..e1b2667 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -733,7 +733,8 @@ static void load_linux(void *fw_cfg,
     fw_cfg_add_i32(fw_cfg, FW_CFG_SETUP_SIZE, setup_size);
     fw_cfg_add_bytes(fw_cfg, FW_CFG_SETUP_DATA, setup, setup_size);
 
-    option_rom[nb_option_roms] = "linuxboot.bin";
+    option_rom[nb_option_roms].name = "linuxboot.bin";
+    option_rom[nb_option_roms].bootindex = 0;
     nb_option_roms++;
 }
 
@@ -937,7 +938,7 @@ void pc_memory_init(ram_addr_t ram_size,
         goto bios_error;
     }
     bios_offset = qemu_ram_alloc(NULL, "pc.bios", bios_size);
-    ret = rom_add_file_fixed(bios_name, (uint32_t)(-bios_size));
+    ret = rom_add_file_fixed(bios_name, (uint32_t)(-bios_size), -1);
     if (ret != 0) {
     bios_error:
         fprintf(stderr, "qemu: could not load PC BIOS '%s'\n", bios_name);
@@ -969,7 +970,7 @@ void pc_memory_init(ram_addr_t ram_size,
     }
 
     for (i = 0; i < nb_option_roms; i++) {
-        rom_add_option(option_rom[i]);
+        rom_add_option(option_rom[i].name, option_rom[i].bootindex);
     }
 }
 
diff --git a/hw/pci.c b/hw/pci.c
index e7ea907..24e650a 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -1832,7 +1832,7 @@ static int pci_add_option_rom(PCIDevice *pdev, bool is_default_rom)
         if (class == 0x0300) {
             rom_add_vga(pdev->romfile);
         } else {
-            rom_add_option(pdev->romfile);
+            rom_add_option(pdev->romfile, -1);
         }
         return 0;
     }
diff --git a/hw/pcnet-pci.c b/hw/pcnet-pci.c
index 3dfbe46..10613d7 100644
--- a/hw/pcnet-pci.c
+++ b/hw/pcnet-pci.c
@@ -309,7 +309,7 @@ static int pci_pcnet_init(PCIDevice *pci_dev)
     if (!pci_dev->qdev.hotplugged) {
         static int loaded = 0;
         if (!loaded) {
-            rom_add_option("pxe-pcnet.bin");
+            rom_add_option("pxe-pcnet.bin", -1);
             loaded = 1;
         }
     }
diff --git a/qemu-config.c b/qemu-config.c
index 52f18be..965fa46 100644
--- a/qemu-config.c
+++ b/qemu-config.c
@@ -429,6 +429,22 @@ QemuOptsList qemu_spice_opts = {
     },
 };
 
+QemuOptsList qemu_option_rom_opts = {
+    .name = "option-rom",
+    .implied_opt_name = "romfile",
+    .head = QTAILQ_HEAD_INITIALIZER(qemu_option_rom_opts.head),
+    .desc = {
+        {
+            .name = "bootindex",
+            .type = QEMU_OPT_NUMBER,
+        }, {
+            .name = "romfile",
+            .type = QEMU_OPT_STRING,
+        },
+        { /* end if list */ }
+    },
+};
+
 static QemuOptsList *vm_config_groups[32] = {
     &qemu_drive_opts,
     &qemu_chardev_opts,
@@ -442,6 +458,7 @@ static QemuOptsList *vm_config_groups[32] = {
 #ifdef CONFIG_SIMPLE_TRACE
     &qemu_trace_opts,
 #endif
+    &qemu_option_rom_opts,
     NULL,
 };
 
diff --git a/sysemu.h b/sysemu.h
index fe9a582..48f8eee 100644
--- a/sysemu.h
+++ b/sysemu.h
@@ -139,7 +139,11 @@ extern uint64_t node_mem[MAX_NODES];
 extern uint64_t node_cpumask[MAX_NODES];
 
 #define MAX_OPTION_ROMS 16
-extern const char *option_rom[MAX_OPTION_ROMS];
+typedef struct QEMUOptionRom {
+    const char *name;
+    int32_t bootindex;
+} QEMUOptionRom;
+extern QEMUOptionRom option_rom[MAX_OPTION_ROMS];
 extern int nb_option_roms;
 
 #define MAX_PROM_ENVS 128
diff --git a/vl.c b/vl.c
index dadc161..844d6a5 100644
--- a/vl.c
+++ b/vl.c
@@ -218,7 +218,7 @@ int cursor_hide = 1;
 int graphic_rotate = 0;
 uint8_t irq0override = 1;
 const char *watchdog;
-const char *option_rom[MAX_OPTION_ROMS];
+QEMUOptionRom option_rom[MAX_OPTION_ROMS];
 int nb_option_roms;
 int semihosting_enabled = 0;
 int old_param = 0;
@@ -2520,7 +2520,14 @@ int main(int argc, char **argv, char **envp)
 		    fprintf(stderr, "Too many option ROMs\n");
 		    exit(1);
 		}
-		option_rom[nb_option_roms] = optarg;
+                opts = qemu_opts_parse(qemu_find_opts("option-rom"), optarg, 1);
+                option_rom[nb_option_roms].name = qemu_opt_get(opts, "romfile");
+                option_rom[nb_option_roms].bootindex =
+                    qemu_opt_get_number(opts, "bootindex", -1);
+                if (!option_rom[nb_option_roms].name) {
+                    fprintf(stderr, "Option ROM file is not specified\n");
+                    exit(1);
+                }
 		nb_option_roms++;
 		break;
             case QEMU_OPTION_semihosting:
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [PATCHv8 15/16] Add notifier that will be called when machine is fully created.
  2010-12-08 11:34 [Qemu-devel] [PATCHv8 00/16] boot order specification Gleb Natapov
                   ` (13 preceding siblings ...)
  2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 14/16] Add bootindex for option roms Gleb Natapov
@ 2010-12-08 11:35 ` Gleb Natapov
  2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 16/16] Pass boot device list to firmware Gleb Natapov
                   ` (2 subsequent siblings)
  17 siblings, 0 replies; 38+ messages in thread
From: Gleb Natapov @ 2010-12-08 11:35 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, kevin, kvm

Action that depends on fully initialized device model should register
with this notifier chain.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
---
 sysemu.h |    2 ++
 vl.c     |   15 +++++++++++++++
 2 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/sysemu.h b/sysemu.h
index 48f8eee..c42f33a 100644
--- a/sysemu.h
+++ b/sysemu.h
@@ -60,6 +60,8 @@ void qemu_system_reset(void);
 void qemu_add_exit_notifier(Notifier *notify);
 void qemu_remove_exit_notifier(Notifier *notify);
 
+void qemu_add_machine_init_done_notifier(Notifier *notify);
+
 void do_savevm(Monitor *mon, const QDict *qdict);
 int load_vmstate(const char *name);
 void do_delvm(Monitor *mon, const QDict *qdict);
diff --git a/vl.c b/vl.c
index 844d6a5..0d20d26 100644
--- a/vl.c
+++ b/vl.c
@@ -254,6 +254,9 @@ static void *boot_set_opaque;
 static NotifierList exit_notifiers =
     NOTIFIER_LIST_INITIALIZER(exit_notifiers);
 
+static NotifierList machine_init_done_notifiers =
+    NOTIFIER_LIST_INITIALIZER(machine_init_done_notifiers);
+
 int kvm_allowed = 0;
 uint32_t xen_domid;
 enum xen_mode xen_mode = XEN_EMULATE;
@@ -1782,6 +1785,16 @@ static void qemu_run_exit_notifiers(void)
     notifier_list_notify(&exit_notifiers);
 }
 
+void qemu_add_machine_init_done_notifier(Notifier *notify)
+{
+    notifier_list_add(&machine_init_done_notifiers, notify);
+}
+
+static void qemu_run_machine_init_done_notifiers(void)
+{
+    notifier_list_notify(&machine_init_done_notifiers);
+}
+
 static const QEMUOption *lookup_opt(int argc, char **argv,
                                     const char **poptarg, int *poptind)
 {
@@ -3028,6 +3041,8 @@ int main(int argc, char **argv, char **envp)
     }
 
     qemu_register_reset((void *)qbus_reset_all, sysbus_get_default());
+    qemu_run_machine_init_done_notifiers();
+
     qemu_system_reset();
     if (loadvm) {
         if (load_vmstate(loadvm) < 0) {
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] [PATCHv8 16/16] Pass boot device list to firmware.
  2010-12-08 11:34 [Qemu-devel] [PATCHv8 00/16] boot order specification Gleb Natapov
                   ` (14 preceding siblings ...)
  2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 15/16] Add notifier that will be called when machine is fully created Gleb Natapov
@ 2010-12-08 11:35 ` Gleb Natapov
  2010-12-11 15:13 ` [Qemu-devel] Re: [PATCHv8 00/16] boot order specification Blue Swirl
  2010-12-11 22:10 ` Blue Swirl
  17 siblings, 0 replies; 38+ messages in thread
From: Gleb Natapov @ 2010-12-08 11:35 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, kevin, kvm


Signed-off-by: Gleb Natapov <gleb@redhat.com>
---
 hw/fw_cfg.c |   14 ++++++++++++++
 sysemu.h    |    1 +
 vl.c        |   48 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 63 insertions(+), 0 deletions(-)

diff --git a/hw/fw_cfg.c b/hw/fw_cfg.c
index 7b9434f..20a816f 100644
--- a/hw/fw_cfg.c
+++ b/hw/fw_cfg.c
@@ -53,6 +53,7 @@ struct FWCfgState {
     FWCfgFiles *files;
     uint16_t cur_entry;
     uint32_t cur_offset;
+    Notifier machine_ready;
 };
 
 static void fw_cfg_write(FWCfgState *s, uint8_t value)
@@ -315,6 +316,15 @@ int fw_cfg_add_file(FWCfgState *s,  const char *filename, uint8_t *data,
     return 1;
 }
 
+static void fw_cfg_machine_ready(struct Notifier* n)
+{
+    uint32_t len;
+    FWCfgState *s = container_of(n, FWCfgState, machine_ready);
+    char *bootindex = get_boot_devices_list(&len);
+
+    fw_cfg_add_file(s, "bootorder", (uint8_t*)bootindex, len);
+}
+
 FWCfgState *fw_cfg_init(uint32_t ctl_port, uint32_t data_port,
                         target_phys_addr_t ctl_addr, target_phys_addr_t data_addr)
 {
@@ -343,6 +353,10 @@ FWCfgState *fw_cfg_init(uint32_t ctl_port, uint32_t data_port,
     fw_cfg_add_i16(s, FW_CFG_MAX_CPUS, (uint16_t)max_cpus);
     fw_cfg_add_i16(s, FW_CFG_BOOT_MENU, (uint16_t)boot_menu);
 
+
+    s->machine_ready.notify = fw_cfg_machine_ready;
+    qemu_add_machine_init_done_notifier(&s->machine_ready);
+
     return s;
 }
 
diff --git a/sysemu.h b/sysemu.h
index c42f33a..38a20a3 100644
--- a/sysemu.h
+++ b/sysemu.h
@@ -196,4 +196,5 @@ void register_devices(void);
 
 void add_boot_device_path(int32_t bootindex, DeviceState *dev,
                           const char *suffix);
+char *get_boot_devices_list(uint32_t *size);
 #endif
diff --git a/vl.c b/vl.c
index 0d20d26..c4d3fc0 100644
--- a/vl.c
+++ b/vl.c
@@ -736,6 +736,54 @@ void add_boot_device_path(int32_t bootindex, DeviceState *dev,
     QTAILQ_INSERT_TAIL(&fw_boot_order, node, link);
 }
 
+/*
+ * This function returns null terminated string that consist of new line
+ * separated device pathes.
+ *
+ * memory pointed by "size" is assigned total length of the array in bytes
+ *
+ */
+char *get_boot_devices_list(uint32_t *size)
+{
+    FWBootEntry *i;
+    uint32_t total = 0;
+    char *list = NULL;
+
+    QTAILQ_FOREACH(i, &fw_boot_order, link) {
+        char *devpath = NULL, *bootpath;
+        int len;
+
+        if (i->dev) {
+            devpath = qdev_get_fw_dev_path(i->dev);
+            assert(devpath);
+        }
+
+        if (i->suffix && devpath) {
+            bootpath = qemu_malloc(strlen(devpath) + strlen(i->suffix) + 1);
+            sprintf(bootpath, "%s%s", devpath, i->suffix);
+            qemu_free(devpath);
+        } else if (devpath) {
+            bootpath = devpath;
+        } else {
+            bootpath = strdup(i->suffix);
+            assert(bootpath);
+        }
+
+        if (total) {
+            list[total-1] = '\n';
+        }
+        len = strlen(bootpath) + 1;
+        list = qemu_realloc(list, total + len);
+        memcpy(&list[total], bootpath, len);
+        total += len;
+        qemu_free(bootpath);
+    }
+
+    *size = total;
+
+    return list;
+}
+
 static void numa_add(const char *optarg)
 {
     char option[128];
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [Qemu-devel] Re: [PATCHv8 00/16] boot order specification
  2010-12-08 11:34 [Qemu-devel] [PATCHv8 00/16] boot order specification Gleb Natapov
                   ` (15 preceding siblings ...)
  2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 16/16] Pass boot device list to firmware Gleb Natapov
@ 2010-12-11 15:13 ` Blue Swirl
  2010-12-11 16:06   ` Gleb Natapov
  2010-12-11 22:10 ` Blue Swirl
  17 siblings, 1 reply; 38+ messages in thread
From: Blue Swirl @ 2010-12-11 15:13 UTC (permalink / raw)
  To: Gleb Natapov; +Cc: kevin, qemu-devel, kvm, The OpenBIOS Mailinglist

[-- Attachment #1: Type: text/plain, Size: 3328 bytes --]

On Wed, Dec 8, 2010 at 11:34 AM, Gleb Natapov <gleb@redhat.com> wrote:
> Forget to save a couple of buffers before sending version 7 :(
>
> Anthony, Blue can this be applied now?

I made some more tests, this time with PPC. I modified OpenBIOS to
print out the boot device list:

$ qemu-system-ppc -drive if=none,id=hda,file=/dev/null -device
ide-drive,drive=hda,bootindex=1 -drive if=none,id=cd,file=/dev/null
-device ide-drive,drive=cd,bootindex=0 -nographic -prom-env
'auto-boot?=false' -L .
qemu-system-ppc: pci_add_option_rom: failed to find romfile "vgabios-stdvga.bin"
Could not open option rom 'pxe-ne2k_pci.bin': No such file or directory

>> =============================================================
>> OpenBIOS 1.0 [Nov 28 2010 19:37]
>> Configuration device id QEMU version 1 machine id 2
>> CPUs: 1
>> Memory: 128M
>> UUID: 00000000-0000-0000-0000-000000000000
>> CPU type PowerPC,750
>> bootindex /grackle@fec00000/ide@3/drive@1/disk@1
>> /grackle@fec00000/ide@3/drive@1/disk@0
Welcome to OpenBIOS v1.0 built on Nov 28 2010 19:37

0 > show-devs
7be6324 /
7be6440 /aliases
7be64e4 /openprom (BootROM)
7bebfa0 /openprom/client-services
7be668c /options
7be6704 /chosen
7be67e8 /builtin
7be688c /builtin/console
7bebcac /packages
7becda8 /packages/cmdline
7becee8 /packages/disk-label
7bedb58 /packages/terminal-emulator
7bee548 /packages/deblocker
7bee89c /packages/hfsplus-files
7beeb3c /packages/hfs-files
7beedd8 /packages/ext2-files
7bef010 /packages/iso9660-files
7bef248 /packages/grubfs-files
7bef480 /packages/mac-parts
7bef6b8 /packages/pc-parts
7bef8ec /packages/xcoff-loader
7bef9b8 /packages/elf-loader
7befa80 /packages/bootinfo-loader
7bed958 /cpus
7bf2fe8 /cpus/PowerPC,750@0 (cpu)
7beda58 /memory@0 (memory)
7befb4c /pci@80000000 (pci)
7beff64 /pci@80000000/QEMU,VGA@1 (display)
7bf0438 /pci@80000000/NE2000@2 (network)
7bf0814 /pci@80000000/pci-ata@3 (pci-ide)
7bf0c50 /pci@80000000/pci-ata@3/ata-1@500 (ata)
7bf0dd0 /pci@80000000/pci-ata@3/ata-2@600 (ata)
7bf0f50 /pci@80000000/pci-ata@3/ata-2@600/disk@1 (block)
7bf131c /pci@80000000/pci-ata@3/ata-2@600/disk@0 (block)
7bf1674 /pci@80000000/mac-io@4 (mac-io)
7bf1b54 /pci@80000000/mac-io@4/via-cuda@16000 (via-cuda)
7bf1d70 /pci@80000000/mac-io@4/via-cuda@16000/adb (adb)
7bf1ed8 /pci@80000000/mac-io@4/via-cuda@16000/adb/keyboard@8 (keyboard)
7bf2080 /pci@80000000/mac-io@4/via-cuda@16000/adb/mouse@9 (mouse)
7bf220c /pci@80000000/mac-io@4/via-cuda@16000/rtc (rtc)
7bf23f4 /pci@80000000/mac-io@4/nvram@60000 (nvram)
7bf2614 /pci@80000000/mac-io@4/escc@13000 (escc)
7bf271c /pci@80000000/mac-io@4/escc@13000/ch-a@13020 (serial)
7bf29b4 /pci@80000000/mac-io@4/escc@13000/ch-b@13000 (serial)
7bf2c20 /pci@80000000/mac-io@4/ata-3@20000 (ata)
 ok

/grackle@fec00000/ide@3/drive@1/disk@1 does not match
/pci@80000000/pci-ata@3/ata-2@600/disk@1.

I wonder where '@80000000' comes from. A dump of original g3beige
device tree is here:
http://penguinppc.org/historical/dev-trees-html/g3_beige_300.html

But actually the tree generated by OpenBIOS looks more like g3bw one:
http://penguinppc.org/historical/dev-trees-html/g3bw_400.html

How can we get the names to be more compatible? At least
s/grackle/pci/ is easy to do in QEMU, but which instance (QEMU or
OpenBIOS) should handle pci-ata vs ide change? What should we do with
ata-2@600 vs drive@1?

[-- Attachment #2: 0001-Use-bootindex.patch --]
[-- Type: application/x-patch, Size: 3321 bytes --]

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [Qemu-devel] Re: [PATCHv8 00/16] boot order specification
  2010-12-11 15:13 ` [Qemu-devel] Re: [PATCHv8 00/16] boot order specification Blue Swirl
@ 2010-12-11 16:06   ` Gleb Natapov
  2010-12-11 17:19     ` Blue Swirl
  2010-12-11 23:22     ` Benjamin Herrenschmidt
  0 siblings, 2 replies; 38+ messages in thread
From: Gleb Natapov @ 2010-12-11 16:06 UTC (permalink / raw)
  To: Blue Swirl; +Cc: kevin, qemu-devel, kvm, The OpenBIOS Mailinglist

On Sat, Dec 11, 2010 at 03:13:35PM +0000, Blue Swirl wrote:
> On Wed, Dec 8, 2010 at 11:34 AM, Gleb Natapov <gleb@redhat.com> wrote:
> > Forget to save a couple of buffers before sending version 7 :(
> >
> > Anthony, Blue can this be applied now?
> 
> I made some more tests, this time with PPC. I modified OpenBIOS to
> print out the boot device list:
> 
> $ qemu-system-ppc -drive if=none,id=hda,file=/dev/null -device
> ide-drive,drive=hda,bootindex=1 -drive if=none,id=cd,file=/dev/null
> -device ide-drive,drive=cd,bootindex=0 -nographic -prom-env
> 'auto-boot?=false' -L .
> qemu-system-ppc: pci_add_option_rom: failed to find romfile "vgabios-stdvga.bin"
> Could not open option rom 'pxe-ne2k_pci.bin': No such file or directory
> 
> >> =============================================================
> >> OpenBIOS 1.0 [Nov 28 2010 19:37]
> >> Configuration device id QEMU version 1 machine id 2
> >> CPUs: 1
> >> Memory: 128M
> >> UUID: 00000000-0000-0000-0000-000000000000
> >> CPU type PowerPC,750
> >> bootindex /grackle@fec00000/ide@3/drive@1/disk@1
> >> /grackle@fec00000/ide@3/drive@1/disk@0
> Welcome to OpenBIOS v1.0 built on Nov 28 2010 19:37
> 
> 0 > show-devs
> 7be6324 /
> 7be6440 /aliases
> 7be64e4 /openprom (BootROM)
> 7bebfa0 /openprom/client-services
> 7be668c /options
> 7be6704 /chosen
> 7be67e8 /builtin
> 7be688c /builtin/console
> 7bebcac /packages
> 7becda8 /packages/cmdline
> 7becee8 /packages/disk-label
> 7bedb58 /packages/terminal-emulator
> 7bee548 /packages/deblocker
> 7bee89c /packages/hfsplus-files
> 7beeb3c /packages/hfs-files
> 7beedd8 /packages/ext2-files
> 7bef010 /packages/iso9660-files
> 7bef248 /packages/grubfs-files
> 7bef480 /packages/mac-parts
> 7bef6b8 /packages/pc-parts
> 7bef8ec /packages/xcoff-loader
> 7bef9b8 /packages/elf-loader
> 7befa80 /packages/bootinfo-loader
> 7bed958 /cpus
> 7bf2fe8 /cpus/PowerPC,750@0 (cpu)
> 7beda58 /memory@0 (memory)
> 7befb4c /pci@80000000 (pci)
> 7beff64 /pci@80000000/QEMU,VGA@1 (display)
> 7bf0438 /pci@80000000/NE2000@2 (network)
> 7bf0814 /pci@80000000/pci-ata@3 (pci-ide)
> 7bf0c50 /pci@80000000/pci-ata@3/ata-1@500 (ata)
> 7bf0dd0 /pci@80000000/pci-ata@3/ata-2@600 (ata)
> 7bf0f50 /pci@80000000/pci-ata@3/ata-2@600/disk@1 (block)
> 7bf131c /pci@80000000/pci-ata@3/ata-2@600/disk@0 (block)
> 7bf1674 /pci@80000000/mac-io@4 (mac-io)
> 7bf1b54 /pci@80000000/mac-io@4/via-cuda@16000 (via-cuda)
> 7bf1d70 /pci@80000000/mac-io@4/via-cuda@16000/adb (adb)
> 7bf1ed8 /pci@80000000/mac-io@4/via-cuda@16000/adb/keyboard@8 (keyboard)
> 7bf2080 /pci@80000000/mac-io@4/via-cuda@16000/adb/mouse@9 (mouse)
> 7bf220c /pci@80000000/mac-io@4/via-cuda@16000/rtc (rtc)
> 7bf23f4 /pci@80000000/mac-io@4/nvram@60000 (nvram)
> 7bf2614 /pci@80000000/mac-io@4/escc@13000 (escc)
> 7bf271c /pci@80000000/mac-io@4/escc@13000/ch-a@13020 (serial)
> 7bf29b4 /pci@80000000/mac-io@4/escc@13000/ch-b@13000 (serial)
> 7bf2c20 /pci@80000000/mac-io@4/ata-3@20000 (ata)
>  ok
> 
> /grackle@fec00000/ide@3/drive@1/disk@1 does not match
> /pci@80000000/pci-ata@3/ata-2@600/disk@1.
> 
hw/ppc_oldworld.c has:
pci_bus = pci_grackle_init(0xfec00000, pic);
i.e it registers pci controller at MMIO address 0xfec00000. 0x80000000
is isa mmio base. Why OpenBIOS uses 80000000 as address of pci
controller? May be on real HW all memory access above 0x80000000 is
redirected to pci controller and it emulates isa? Then we should fix
qemu to do the same.

> I wonder where '@80000000' comes from. A dump of original g3beige
> device tree is here:
> http://penguinppc.org/historical/dev-trees-html/g3_beige_300.html
> 
> But actually the tree generated by OpenBIOS looks more like g3bw one:
> http://penguinppc.org/historical/dev-trees-html/g3bw_400.html
> 
> How can we get the names to be more compatible? At least
> s/grackle/pci/ is easy to do in QEMU, but which instance (QEMU or
> OpenBIOS) should handle pci-ata vs ide change?
http://playground.sun.com/pub/p1275/bindings/pci/pci2_1.pdf has table on
page 10 that defines how pci class code should be translated into OF
name. This is what my patch is using. pci-ata does not look spec
compliant (or is there more up-to-date spec?)

>                                                 What should we do with
> ata-2@600 vs drive@1?
There is no available IDE OF binding spec, so I when with the way
OpenBIOS reports ata on qemu-x86. I have no idea what 600 in ata-2@600
may mean, but looking at g3_beige_300.html there is no such node there
and looking at any other device tree in http://penguinppc.org/historical/dev-trees-html/
I haven't found one that use this kind of addressing for pci-ata. 
http://penguinppc.org/historical/dev-trees-html/g3bw_400.html for
instance has pci@80000000/pci-bridge@d/pci-ata@1/ata-4. ata-2@600 kind of
addressing is used by devices on mac-io bus which I do not think we
emulate in qemu. So it looks like OpneBIOS is wrong here.

--
			Gleb.

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [Qemu-devel] Re: [PATCHv8 00/16] boot order specification
  2010-12-11 16:06   ` Gleb Natapov
@ 2010-12-11 17:19     ` Blue Swirl
  2010-12-11 18:02       ` Gleb Natapov
  2010-12-11 23:22     ` Benjamin Herrenschmidt
  1 sibling, 1 reply; 38+ messages in thread
From: Blue Swirl @ 2010-12-11 17:19 UTC (permalink / raw)
  To: Gleb Natapov; +Cc: kevin, qemu-devel, kvm, The OpenBIOS Mailinglist

On Sat, Dec 11, 2010 at 4:06 PM, Gleb Natapov <gleb@redhat.com> wrote:
> On Sat, Dec 11, 2010 at 03:13:35PM +0000, Blue Swirl wrote:
>> On Wed, Dec 8, 2010 at 11:34 AM, Gleb Natapov <gleb@redhat.com> wrote:
>> > Forget to save a couple of buffers before sending version 7 :(
>> >
>> > Anthony, Blue can this be applied now?
>>
>> I made some more tests, this time with PPC. I modified OpenBIOS to
>> print out the boot device list:
>>
>> $ qemu-system-ppc -drive if=none,id=hda,file=/dev/null -device
>> ide-drive,drive=hda,bootindex=1 -drive if=none,id=cd,file=/dev/null
>> -device ide-drive,drive=cd,bootindex=0 -nographic -prom-env
>> 'auto-boot?=false' -L .
>> qemu-system-ppc: pci_add_option_rom: failed to find romfile "vgabios-stdvga.bin"
>> Could not open option rom 'pxe-ne2k_pci.bin': No such file or directory
>>
>> >> =============================================================
>> >> OpenBIOS 1.0 [Nov 28 2010 19:37]
>> >> Configuration device id QEMU version 1 machine id 2
>> >> CPUs: 1
>> >> Memory: 128M
>> >> UUID: 00000000-0000-0000-0000-000000000000
>> >> CPU type PowerPC,750
>> >> bootindex /grackle@fec00000/ide@3/drive@1/disk@1
>> >> /grackle@fec00000/ide@3/drive@1/disk@0
>> Welcome to OpenBIOS v1.0 built on Nov 28 2010 19:37
>>
>> 0 > show-devs
>> 7be6324 /
>> 7be6440 /aliases
>> 7be64e4 /openprom (BootROM)
>> 7bebfa0 /openprom/client-services
>> 7be668c /options
>> 7be6704 /chosen
>> 7be67e8 /builtin
>> 7be688c /builtin/console
>> 7bebcac /packages
>> 7becda8 /packages/cmdline
>> 7becee8 /packages/disk-label
>> 7bedb58 /packages/terminal-emulator
>> 7bee548 /packages/deblocker
>> 7bee89c /packages/hfsplus-files
>> 7beeb3c /packages/hfs-files
>> 7beedd8 /packages/ext2-files
>> 7bef010 /packages/iso9660-files
>> 7bef248 /packages/grubfs-files
>> 7bef480 /packages/mac-parts
>> 7bef6b8 /packages/pc-parts
>> 7bef8ec /packages/xcoff-loader
>> 7bef9b8 /packages/elf-loader
>> 7befa80 /packages/bootinfo-loader
>> 7bed958 /cpus
>> 7bf2fe8 /cpus/PowerPC,750@0 (cpu)
>> 7beda58 /memory@0 (memory)
>> 7befb4c /pci@80000000 (pci)
>> 7beff64 /pci@80000000/QEMU,VGA@1 (display)
>> 7bf0438 /pci@80000000/NE2000@2 (network)
>> 7bf0814 /pci@80000000/pci-ata@3 (pci-ide)
>> 7bf0c50 /pci@80000000/pci-ata@3/ata-1@500 (ata)
>> 7bf0dd0 /pci@80000000/pci-ata@3/ata-2@600 (ata)
>> 7bf0f50 /pci@80000000/pci-ata@3/ata-2@600/disk@1 (block)
>> 7bf131c /pci@80000000/pci-ata@3/ata-2@600/disk@0 (block)
>> 7bf1674 /pci@80000000/mac-io@4 (mac-io)
>> 7bf1b54 /pci@80000000/mac-io@4/via-cuda@16000 (via-cuda)
>> 7bf1d70 /pci@80000000/mac-io@4/via-cuda@16000/adb (adb)
>> 7bf1ed8 /pci@80000000/mac-io@4/via-cuda@16000/adb/keyboard@8 (keyboard)
>> 7bf2080 /pci@80000000/mac-io@4/via-cuda@16000/adb/mouse@9 (mouse)
>> 7bf220c /pci@80000000/mac-io@4/via-cuda@16000/rtc (rtc)
>> 7bf23f4 /pci@80000000/mac-io@4/nvram@60000 (nvram)
>> 7bf2614 /pci@80000000/mac-io@4/escc@13000 (escc)
>> 7bf271c /pci@80000000/mac-io@4/escc@13000/ch-a@13020 (serial)
>> 7bf29b4 /pci@80000000/mac-io@4/escc@13000/ch-b@13000 (serial)
>> 7bf2c20 /pci@80000000/mac-io@4/ata-3@20000 (ata)
>>  ok
>>
>> /grackle@fec00000/ide@3/drive@1/disk@1 does not match
>> /pci@80000000/pci-ata@3/ata-2@600/disk@1.
>>
> hw/ppc_oldworld.c has:
> pci_bus = pci_grackle_init(0xfec00000, pic);
> i.e it registers pci controller at MMIO address 0xfec00000. 0x80000000
> is isa mmio base. Why OpenBIOS uses 80000000 as address of pci
> controller? May be on real HW all memory access above 0x80000000 is
> redirected to pci controller and it emulates isa? Then we should fix
> qemu to do the same.
>
>> I wonder where '@80000000' comes from. A dump of original g3beige
>> device tree is here:
>> http://penguinppc.org/historical/dev-trees-html/g3_beige_300.html
>>
>> But actually the tree generated by OpenBIOS looks more like g3bw one:
>> http://penguinppc.org/historical/dev-trees-html/g3bw_400.html
>>
>> How can we get the names to be more compatible? At least
>> s/grackle/pci/ is easy to do in QEMU, but which instance (QEMU or
>> OpenBIOS) should handle pci-ata vs ide change?
> http://playground.sun.com/pub/p1275/bindings/pci/pci2_1.pdf has table on
> page 10 that defines how pci class code should be translated into OF
> name. This is what my patch is using. pci-ata does not look spec
> compliant (or is there more up-to-date spec?)

There could be a FCode Program which sets the name.

>>                                                 What should we do with
>> ata-2@600 vs drive@1?
> There is no available IDE OF binding spec, so I when with the way
> OpenBIOS reports ata on qemu-x86. I have no idea what 600 in ata-2@600
> may mean, but looking at g3_beige_300.html there is no such node there
> and looking at any other device tree in http://penguinppc.org/historical/dev-trees-html/
> I haven't found one that use this kind of addressing for pci-ata.
> http://penguinppc.org/historical/dev-trees-html/g3bw_400.html for
> instance has pci@80000000/pci-bridge@d/pci-ata@1/ata-4. ata-2@600 kind of
> addressing is used by devices on mac-io bus which I do not think we
> emulate in qemu. So it looks like OpneBIOS is wrong here.

We have PMAC IDE, but this device is CMD646, so mac-io bus addressing
rules should not be used.

In this tree there are two disks connected to CMD646, named
/pci@80000000/pci-bridge@d/pci-ata@1/ata-4/disk and
/pci@80000000/pci-bridge@d/pci-ata@1/ata-4/disk@1:
http://penguinppc.org/historical/dev-trees-html/g4_pci_350.html

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [Qemu-devel] Re: [PATCHv8 00/16] boot order specification
  2010-12-11 17:19     ` Blue Swirl
@ 2010-12-11 18:02       ` Gleb Natapov
  2010-12-11 18:27         ` Gleb Natapov
  2010-12-11 18:59         ` Blue Swirl
  0 siblings, 2 replies; 38+ messages in thread
From: Gleb Natapov @ 2010-12-11 18:02 UTC (permalink / raw)
  To: Blue Swirl; +Cc: kevin, qemu-devel, kvm, The OpenBIOS Mailinglist

On Sat, Dec 11, 2010 at 05:19:01PM +0000, Blue Swirl wrote:
> >>                                                 What should we do with
> >> ata-2@600 vs drive@1?
> > There is no available IDE OF binding spec, so I when with the way
> > OpenBIOS reports ata on qemu-x86. I have no idea what 600 in ata-2@600
> > may mean, but looking at g3_beige_300.html there is no such node there
> > and looking at any other device tree in http://penguinppc.org/historical/dev-trees-html/
> > I haven't found one that use this kind of addressing for pci-ata.
> > http://penguinppc.org/historical/dev-trees-html/g3bw_400.html for
> > instance has pci@80000000/pci-bridge@d/pci-ata@1/ata-4. ata-2@600 kind of
> > addressing is used by devices on mac-io bus which I do not think we
> > emulate in qemu. So it looks like OpneBIOS is wrong here.
> 
> We have PMAC IDE, but this device is CMD646, so mac-io bus addressing
> rules should not be used.
> 
So you agree that OpenBIOS is wrong here?

> In this tree there are two disks connected to CMD646, named
> /pci@80000000/pci-bridge@d/pci-ata@1/ata-4/disk and
> /pci@80000000/pci-bridge@d/pci-ata@1/ata-4/disk@1:
> http://penguinppc.org/historical/dev-trees-html/g4_pci_350.html
You are saying that qemu creates paths like:
/grackle@fec00000/ide@3/drive@1/disk@0
/grackle@fec00000/ide@3/drive@1/disk@1

I do not understand why qemu creates node drive@1. It should be drive@0
according to the code. I'll look at why unit-address is incorrect for
the node. But assuming that this problem is fixed then paths created by
qemu is very similar to the paths in g4_pci_350.html. It looks like in 
g4_pci_350.html they omit unit address if it is zero.

--
			Gleb.

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] Re: [PATCHv8 00/16] boot order specification
  2010-12-11 18:02       ` Gleb Natapov
@ 2010-12-11 18:27         ` Gleb Natapov
  2010-12-11 19:06           ` Blue Swirl
  2010-12-11 18:59         ` Blue Swirl
  1 sibling, 1 reply; 38+ messages in thread
From: Gleb Natapov @ 2010-12-11 18:27 UTC (permalink / raw)
  To: Blue Swirl; +Cc: The OpenBIOS Mailinglist, kevin, qemu-devel, kvm

On Sat, Dec 11, 2010 at 08:02:23PM +0200, Gleb Natapov wrote:
> On Sat, Dec 11, 2010 at 05:19:01PM +0000, Blue Swirl wrote:
> > >>                                                 What should we do with
> > >> ata-2@600 vs drive@1?
> > > There is no available IDE OF binding spec, so I when with the way
> > > OpenBIOS reports ata on qemu-x86. I have no idea what 600 in ata-2@600
> > > may mean, but looking at g3_beige_300.html there is no such node there
> > > and looking at any other device tree in http://penguinppc.org/historical/dev-trees-html/
> > > I haven't found one that use this kind of addressing for pci-ata.
> > > http://penguinppc.org/historical/dev-trees-html/g3bw_400.html for
> > > instance has pci@80000000/pci-bridge@d/pci-ata@1/ata-4. ata-2@600 kind of
> > > addressing is used by devices on mac-io bus which I do not think we
> > > emulate in qemu. So it looks like OpneBIOS is wrong here.
> > 
> > We have PMAC IDE, but this device is CMD646, so mac-io bus addressing
> > rules should not be used.
> > 
> So you agree that OpenBIOS is wrong here?
> 
> > In this tree there are two disks connected to CMD646, named
> > /pci@80000000/pci-bridge@d/pci-ata@1/ata-4/disk and
> > /pci@80000000/pci-bridge@d/pci-ata@1/ata-4/disk@1:
> > http://penguinppc.org/historical/dev-trees-html/g4_pci_350.html
> You are saying that qemu creates paths like:
> /grackle@fec00000/ide@3/drive@1/disk@0
> /grackle@fec00000/ide@3/drive@1/disk@1
> 
> I do not understand why qemu creates node drive@1. It should be drive@0
> according to the code. I'll look at why unit-address is incorrect for
> the node. But assuming that this problem is fixed then paths created by
> qemu is very similar to the paths in g4_pci_350.html. It looks like in 
> g4_pci_350.html they omit unit address if it is zero.
> 
Ah the problem is that we have not qdevified mac io bus. Since first to
ide disks are automatically attached to mac-io bus device paths for them
are incorrect. Next two ide devices will be attached to CMD646 and qemu
will generate correct device paths for them:

qemu-system-ppc -drive if=none,id=hda,file=/dev/null -device ide-drive,drive=hda,bootindex=1
-drive if=none,id=cd,file=/dev/null -device ide-drive,drive=cd,bootindex=0 -nographic -drive
if=none,id=hdb,file=/dev/null -device ide-drive,drive=hdb,bus=ide.0,bootindex=2 -drive
if=none,id=hdc,file=/dev/null -device ide-drive,drive=hdc,bus=ide.0,bootindex=3
adding '/grackle@fec00000/ide@3/drive@1/disk@1' at index 0
adding '/grackle@fec00000/ide@3/drive@1/disk@0' at index 1
adding '/grackle@fec00000/ide@3/drive@0/disk@0' at index 2
adding '/grackle@fec00000/ide@3/drive@0/disk@1' at index 3

So the fix is to qdevify mac io bus.

--
			Gleb.

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [Qemu-devel] Re: [PATCHv8 00/16] boot order specification
  2010-12-11 18:02       ` Gleb Natapov
  2010-12-11 18:27         ` Gleb Natapov
@ 2010-12-11 18:59         ` Blue Swirl
  1 sibling, 0 replies; 38+ messages in thread
From: Blue Swirl @ 2010-12-11 18:59 UTC (permalink / raw)
  To: Gleb Natapov; +Cc: kevin, qemu-devel, kvm, The OpenBIOS Mailinglist

2010/12/11 Gleb Natapov <gleb@redhat.com>:
> On Sat, Dec 11, 2010 at 05:19:01PM +0000, Blue Swirl wrote:
>> >>                                                 What should we do with
>> >> ata-2@600 vs drive@1?
>> > There is no available IDE OF binding spec, so I when with the way
>> > OpenBIOS reports ata on qemu-x86. I have no idea what 600 in ata-2@600
>> > may mean, but looking at g3_beige_300.html there is no such node there
>> > and looking at any other device tree in http://penguinppc.org/historical/dev-trees-html/
>> > I haven't found one that use this kind of addressing for pci-ata.
>> > http://penguinppc.org/historical/dev-trees-html/g3bw_400.html for
>> > instance has pci@80000000/pci-bridge@d/pci-ata@1/ata-4. ata-2@600 kind of
>> > addressing is used by devices on mac-io bus which I do not think we
>> > emulate in qemu. So it looks like OpneBIOS is wrong here.
>>
>> We have PMAC IDE, but this device is CMD646, so mac-io bus addressing
>> rules should not be used.
>>
> So you agree that OpenBIOS is wrong here?

I think so.

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] Re: [PATCHv8 00/16] boot order specification
  2010-12-11 18:27         ` Gleb Natapov
@ 2010-12-11 19:06           ` Blue Swirl
  2010-12-11 19:11             ` Gleb Natapov
  0 siblings, 1 reply; 38+ messages in thread
From: Blue Swirl @ 2010-12-11 19:06 UTC (permalink / raw)
  To: Gleb Natapov; +Cc: The OpenBIOS Mailinglist, kevin, qemu-devel, kvm

2010/12/11 Gleb Natapov <gleb@redhat.com>:
> On Sat, Dec 11, 2010 at 08:02:23PM +0200, Gleb Natapov wrote:
>> On Sat, Dec 11, 2010 at 05:19:01PM +0000, Blue Swirl wrote:
>> > >>                                                 What should we do with
>> > >> ata-2@600 vs drive@1?
>> > > There is no available IDE OF binding spec, so I when with the way
>> > > OpenBIOS reports ata on qemu-x86. I have no idea what 600 in ata-2@600
>> > > may mean, but looking at g3_beige_300.html there is no such node there
>> > > and looking at any other device tree in http://penguinppc.org/historical/dev-trees-html/
>> > > I haven't found one that use this kind of addressing for pci-ata.
>> > > http://penguinppc.org/historical/dev-trees-html/g3bw_400.html for
>> > > instance has pci@80000000/pci-bridge@d/pci-ata@1/ata-4. ata-2@600 kind of
>> > > addressing is used by devices on mac-io bus which I do not think we
>> > > emulate in qemu. So it looks like OpneBIOS is wrong here.
>> >
>> > We have PMAC IDE, but this device is CMD646, so mac-io bus addressing
>> > rules should not be used.
>> >
>> So you agree that OpenBIOS is wrong here?
>>
>> > In this tree there are two disks connected to CMD646, named
>> > /pci@80000000/pci-bridge@d/pci-ata@1/ata-4/disk and
>> > /pci@80000000/pci-bridge@d/pci-ata@1/ata-4/disk@1:
>> > http://penguinppc.org/historical/dev-trees-html/g4_pci_350.html
>> You are saying that qemu creates paths like:
>> /grackle@fec00000/ide@3/drive@1/disk@0
>> /grackle@fec00000/ide@3/drive@1/disk@1
>>
>> I do not understand why qemu creates node drive@1. It should be drive@0
>> according to the code. I'll look at why unit-address is incorrect for
>> the node. But assuming that this problem is fixed then paths created by
>> qemu is very similar to the paths in g4_pci_350.html. It looks like in
>> g4_pci_350.html they omit unit address if it is zero.
>>
> Ah the problem is that we have not qdevified mac io bus. Since first to
> ide disks are automatically attached to mac-io bus device paths for them
> are incorrect. Next two ide devices will be attached to CMD646 and qemu
> will generate correct device paths for them:
>
> qemu-system-ppc -drive if=none,id=hda,file=/dev/null -device ide-drive,drive=hda,bootindex=1
> -drive if=none,id=cd,file=/dev/null -device ide-drive,drive=cd,bootindex=0 -nographic -drive
> if=none,id=hdb,file=/dev/null -device ide-drive,drive=hdb,bus=ide.0,bootindex=2 -drive
> if=none,id=hdc,file=/dev/null -device ide-drive,drive=hdc,bus=ide.0,bootindex=3
> adding '/grackle@fec00000/ide@3/drive@1/disk@1' at index 0
> adding '/grackle@fec00000/ide@3/drive@1/disk@0' at index 1
> adding '/grackle@fec00000/ide@3/drive@0/disk@0' at index 2
> adding '/grackle@fec00000/ide@3/drive@0/disk@1' at index 3

But why is the path almost the same as CMD646, shouldn't 'ide@3' be
different since the PCI device is not the same?

> So the fix is to qdevify mac io bus.

OK.

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] Re: [PATCHv8 00/16] boot order specification
  2010-12-11 19:06           ` Blue Swirl
@ 2010-12-11 19:11             ` Gleb Natapov
  2010-12-11 23:27               ` Benjamin Herrenschmidt
  0 siblings, 1 reply; 38+ messages in thread
From: Gleb Natapov @ 2010-12-11 19:11 UTC (permalink / raw)
  To: Blue Swirl; +Cc: The OpenBIOS Mailinglist, kevin, qemu-devel, kvm

On Sat, Dec 11, 2010 at 07:06:04PM +0000, Blue Swirl wrote:
> 2010/12/11 Gleb Natapov <gleb@redhat.com>:
> > On Sat, Dec 11, 2010 at 08:02:23PM +0200, Gleb Natapov wrote:
> >> On Sat, Dec 11, 2010 at 05:19:01PM +0000, Blue Swirl wrote:
> >> > >>                                                 What should we do with
> >> > >> ata-2@600 vs drive@1?
> >> > > There is no available IDE OF binding spec, so I when with the way
> >> > > OpenBIOS reports ata on qemu-x86. I have no idea what 600 in ata-2@600
> >> > > may mean, but looking at g3_beige_300.html there is no such node there
> >> > > and looking at any other device tree in http://penguinppc.org/historical/dev-trees-html/
> >> > > I haven't found one that use this kind of addressing for pci-ata.
> >> > > http://penguinppc.org/historical/dev-trees-html/g3bw_400.html for
> >> > > instance has pci@80000000/pci-bridge@d/pci-ata@1/ata-4. ata-2@600 kind of
> >> > > addressing is used by devices on mac-io bus which I do not think we
> >> > > emulate in qemu. So it looks like OpneBIOS is wrong here.
> >> >
> >> > We have PMAC IDE, but this device is CMD646, so mac-io bus addressing
> >> > rules should not be used.
> >> >
> >> So you agree that OpenBIOS is wrong here?
> >>
> >> > In this tree there are two disks connected to CMD646, named
> >> > /pci@80000000/pci-bridge@d/pci-ata@1/ata-4/disk and
> >> > /pci@80000000/pci-bridge@d/pci-ata@1/ata-4/disk@1:
> >> > http://penguinppc.org/historical/dev-trees-html/g4_pci_350.html
> >> You are saying that qemu creates paths like:
> >> /grackle@fec00000/ide@3/drive@1/disk@0
> >> /grackle@fec00000/ide@3/drive@1/disk@1
> >>
> >> I do not understand why qemu creates node drive@1. It should be drive@0
> >> according to the code. I'll look at why unit-address is incorrect for
> >> the node. But assuming that this problem is fixed then paths created by
> >> qemu is very similar to the paths in g4_pci_350.html. It looks like in
> >> g4_pci_350.html they omit unit address if it is zero.
> >>
> > Ah the problem is that we have not qdevified mac io bus. Since first to
> > ide disks are automatically attached to mac-io bus device paths for them
> > are incorrect. Next two ide devices will be attached to CMD646 and qemu
> > will generate correct device paths for them:
> >
> > qemu-system-ppc -drive if=none,id=hda,file=/dev/null -device ide-drive,drive=hda,bootindex=1
> > -drive if=none,id=cd,file=/dev/null -device ide-drive,drive=cd,bootindex=0 -nographic -drive
> > if=none,id=hdb,file=/dev/null -device ide-drive,drive=hdb,bus=ide.0,bootindex=2 -drive
> > if=none,id=hdc,file=/dev/null -device ide-drive,drive=hdc,bus=ide.0,bootindex=3
> > adding '/grackle@fec00000/ide@3/drive@1/disk@1' at index 0
> > adding '/grackle@fec00000/ide@3/drive@1/disk@0' at index 1
> > adding '/grackle@fec00000/ide@3/drive@0/disk@0' at index 2
> > adding '/grackle@fec00000/ide@3/drive@0/disk@1' at index 3
> 
> But why is the path almost the same as CMD646, shouldn't 'ide@3' be
> different since the PCI device is not the same?
>
It should, but since the mac io is not qdevified there is no qdev pci
device for it.
 
> > So the fix is to qdevify mac io bus.
> 
> OK.

--
			Gleb.

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [Qemu-devel] Re: [PATCHv8 00/16] boot order specification
  2010-12-08 11:34 [Qemu-devel] [PATCHv8 00/16] boot order specification Gleb Natapov
                   ` (16 preceding siblings ...)
  2010-12-11 15:13 ` [Qemu-devel] Re: [PATCHv8 00/16] boot order specification Blue Swirl
@ 2010-12-11 22:10 ` Blue Swirl
  17 siblings, 0 replies; 38+ messages in thread
From: Blue Swirl @ 2010-12-11 22:10 UTC (permalink / raw)
  To: Gleb Natapov; +Cc: kevin, qemu-devel, kvm

Thanks, applied all.

On Wed, Dec 8, 2010 at 11:34 AM, Gleb Natapov <gleb@redhat.com> wrote:
> Forget to save a couple of buffers before sending version 7 :(
>
> Anthony, Blue can this be applied now?
>
> Gleb Natapov (16):
>  Introduce fw_name field to DeviceInfo structure.
>  Introduce new BusInfo callback get_fw_dev_path.
>  Keep track of ISA ports ISA device is using in qdev.
>  Add get_fw_dev_path callback to ISA bus in qdev.
>  Store IDE bus id in IDEBus structure for easy access.
>  Add get_fw_dev_path callback to IDE bus.
>  Add get_fw_dev_path callback for system bus.
>  Add get_fw_dev_path callback for pci bus.
>  Record which USBDevice USBPort belongs too.
>  Add get_fw_dev_path callback for usb bus.
>  Add get_fw_dev_path callback to scsi bus.
>  Add bootindex parameter to net/block/fd device
>  Change fw_cfg_add_file() to get full file path as a parameter.
>  Add bootindex for option roms.
>  Add notifier that will be called when machine is fully created.
>  Pass boot device list to firmware.
>
>  block_int.h       |    4 +-
>  hw/cs4231a.c      |    1 +
>  hw/e1000.c        |    4 ++
>  hw/eepro100.c     |    3 +
>  hw/fdc.c          |   12 ++++++
>  hw/fw_cfg.c       |   30 ++++++++------
>  hw/fw_cfg.h       |    4 +-
>  hw/gus.c          |    4 ++
>  hw/ide/cmd646.c   |    4 +-
>  hw/ide/internal.h |    3 +-
>  hw/ide/isa.c      |    5 ++-
>  hw/ide/piix.c     |    4 +-
>  hw/ide/qdev.c     |   22 ++++++++++-
>  hw/ide/via.c      |    4 +-
>  hw/isa-bus.c      |   42 +++++++++++++++++++
>  hw/isa.h          |    4 ++
>  hw/lance.c        |    1 +
>  hw/loader.c       |   32 ++++++++++++---
>  hw/loader.h       |    8 ++--
>  hw/m48t59.c       |    1 +
>  hw/mc146818rtc.c  |    1 +
>  hw/multiboot.c    |    3 +-
>  hw/ne2000-isa.c   |    3 +
>  hw/ne2000.c       |    5 ++-
>  hw/nseries.c      |    4 +-
>  hw/palm.c         |    6 +-
>  hw/parallel.c     |    5 ++
>  hw/pc.c           |    7 ++-
>  hw/pci.c          |  110 ++++++++++++++++++++++++++++++++++++++++-----------
>  hw/pci_host.c     |    2 +
>  hw/pckbd.c        |    3 +
>  hw/pcnet-pci.c    |    2 +-
>  hw/pcnet.c        |    4 ++
>  hw/piix_pci.c     |    1 +
>  hw/qdev.c         |   32 +++++++++++++++
>  hw/qdev.h         |   14 ++++++
>  hw/rtl8139.c      |    4 ++
>  hw/sb16.c         |    4 ++
>  hw/scsi-bus.c     |   23 +++++++++++
>  hw/scsi-disk.c    |    2 +
>  hw/serial.c       |    1 +
>  hw/sysbus.c       |   30 ++++++++++++++
>  hw/sysbus.h       |    4 ++
>  hw/usb-bus.c      |   45 ++++++++++++++++++++-
>  hw/usb-hub.c      |    3 +-
>  hw/usb-musb.c     |    2 +-
>  hw/usb-net.c      |    3 +
>  hw/usb-ohci.c     |    2 +-
>  hw/usb-uhci.c     |    2 +-
>  hw/usb.h          |    3 +-
>  hw/virtio-blk.c   |    2 +
>  hw/virtio-net.c   |    2 +
>  hw/virtio-pci.c   |    1 +
>  net.h             |    4 +-
>  qemu-config.c     |   17 ++++++++
>  sysemu.h          |   11 +++++-
>  vl.c              |  114 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  57 files changed, 593 insertions(+), 80 deletions(-)
>
> --
> 1.7.2.3
>
>

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] Re: [PATCHv8 00/16] boot order specification
  2010-12-11 16:06   ` Gleb Natapov
  2010-12-11 17:19     ` Blue Swirl
@ 2010-12-11 23:22     ` Benjamin Herrenschmidt
  2010-12-14 19:59       ` Andreas Färber
  1 sibling, 1 reply; 38+ messages in thread
From: Benjamin Herrenschmidt @ 2010-12-11 23:22 UTC (permalink / raw)
  To: Gleb Natapov; +Cc: Blue Swirl, kevin, qemu-devel, kvm, The OpenBIOS Mailinglist

On Sat, 2010-12-11 at 18:06 +0200, Gleb Natapov wrote:
> http://playground.sun.com/pub/p1275/bindings/pci/pci2_1.pdf has table
> on
> page 10 that defines how pci class code should be translated into OF
> name. This is what my patch is using. pci-ata does not look spec
> compliant (or is there more up-to-date spec?)
> 
> >                                                 What should we do
> with
> > ata-2@600 vs drive@1?
> There is no available IDE OF binding spec, so I when with the way
> OpenBIOS reports ata on qemu-x86. I have no idea what 600 in ata-2@600
> may mean, but looking at g3_beige_300.html there is no such node there
> and looking at any other device tree in
> http://penguinppc.org/historical/dev-trees-html/

Those are old and I wouldn't look too closely at what Apple does.

ATA doesn't really need anything complex, mostly the ata controller,
generally named "ata" nowadays with a #address-cells of 1 and a
#size-cells of 0. Children are then typically disk, cdrom, ... (ie block
devices) with a unit address of 0 for master and 1 for slave.

In the case of controllers with multiple ports, typically you have one
such "ata" node per bus. "pci-ata" is a liberal use by Apple here
representing the actual host controller PCI device.

In any case, what matters is the "compatible" property. This is what
defines the programming interface of a device.

> I haven't found one that use this kind of addressing for pci-ata. 
> http://penguinppc.org/historical/dev-trees-html/g3bw_400.html for
> instance has pci@80000000/pci-bridge@d/pci-ata@1/ata-4. ata-2@600 kind
> of
> addressing is used by devices on mac-io bus which I do not think we
> emulate in qemu. So it looks like OpneBIOS is wrong here. 

Well, it's possible that the @600 represents a register offset within
pci-ata, this is entirely up to pci-ata to do as it wishes there to
define it's own internal binding. Is there a "ranges" property defining
translation accross "pci-ata" ?

Cheers,
Ben.

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] Re: [PATCHv8 00/16] boot order specification
  2010-12-11 19:11             ` Gleb Natapov
@ 2010-12-11 23:27               ` Benjamin Herrenschmidt
  0 siblings, 0 replies; 38+ messages in thread
From: Benjamin Herrenschmidt @ 2010-12-11 23:27 UTC (permalink / raw)
  To: Gleb Natapov; +Cc: Blue Swirl, kevin, The OpenBIOS Mailinglist, qemu-devel, kvm


> > > Ah the problem is that we have not qdevified mac io bus. Since first to
> > > ide disks are automatically attached to mac-io bus device paths for them
> > > are incorrect. Next two ide devices will be attached to CMD646 and qemu
> > > will generate correct device paths for them:
> > >
> > > qemu-system-ppc -drive if=none,id=hda,file=/dev/null -device ide-drive,drive=hda,bootindex=1
> > > -drive if=none,id=cd,file=/dev/null -device ide-drive,drive=cd,bootindex=0 -nographic -drive
> > > if=none,id=hdb,file=/dev/null -device ide-drive,drive=hdb,bus=ide.0,bootindex=2 -drive
> > > if=none,id=hdc,file=/dev/null -device ide-drive,drive=hdc,bus=ide.0,bootindex=3
> > > adding '/grackle@fec00000/ide@3/drive@1/disk@1' at index 0
> > > adding '/grackle@fec00000/ide@3/drive@1/disk@0' at index 1
> > > adding '/grackle@fec00000/ide@3/drive@0/disk@0' at index 2
> > > adding '/grackle@fec00000/ide@3/drive@0/disk@1' at index 3
> > 
> > But why is the path almost the same as CMD646, shouldn't 'ide@3' be
> > different since the PCI device is not the same?
> >
> It should, but since the mac io is not qdevified there is no qdev pci
> device for it.

Note that a better long term solution for all these is to have qemu
maintain the device-tree, using libfdt, and pass it to the firmware.

I have a port of SLOF that I can't release just yet (soon hopefully) on
top of another ppc "machine" for qemu that will also hopefully be soon
out there, but basically, what I do there is pass the FDT to SLOF, in
which I use forth code to expand it into a real OF device-tree.

Then, my SLOF code "populates" methods for known devices.

The only problem with that approach is the phandles. OpenBIOS/SLOF/OFW
will "assign" it's own phandle to nodes it creates, ignoring the
"phandle" properties created by libfdt.

That means that linkage within the device-tree will be potentially
broken accross the transition (ie, interrupt-parent, interrupt-map
etc... all contain phandle values to reference another node).

The way I get away with it right now is that I never use such linkage in
SLOF and I preserve the original "phandle" properties, which Linux will
then pickup and use instead of the SLOF "native" phandle when parsing
the tree.

A better long run option would be to have OF itself (whichever variant)
use some remapping on the phandles (instead of making them just
pointers) so it can create nodes with specific phandles.

Once you have your device-tree in qemu, everything looks simpler, you no
longer have to play guess work as to what the path will look like inside
the firmware. It also opens the door for passing bits of the device-tree
dynamically to the kernel for hotplug etc...

Cheers,
Ben.

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] Re: [PATCHv8 00/16] boot order specification
  2010-12-11 23:22     ` Benjamin Herrenschmidt
@ 2010-12-14 19:59       ` Andreas Färber
  2010-12-14 20:31         ` Benjamin Herrenschmidt
  0 siblings, 1 reply; 38+ messages in thread
From: Andreas Färber @ 2010-12-14 19:59 UTC (permalink / raw)
  To: Benjamin Herrenschmidt
  Cc: kvm, Gleb Natapov, qemu-devel, Blue Swirl, kevin, Alexander Graf,
	The OpenBIOS Mailinglist

Am 12.12.2010 um 00:22 schrieb Benjamin Herrenschmidt:

> On Sat, 2010-12-11 at 18:06 +0200, Gleb Natapov wrote:
>> http://playground.sun.com/pub/p1275/bindings/pci/pci2_1.pdf has table
>> on
>> page 10 that defines how pci class code should be translated into OF
>> name. This is what my patch is using. pci-ata does not look spec
>> compliant (or is there more up-to-date spec?)
>>
>>>                                               What should we do
>> with
>>> ata-2@600 vs drive@1?
>> There is no available IDE OF binding spec, so I when with the way
>> OpenBIOS reports ata on qemu-x86. I have no idea what 600 in  
>> ata-2@600
>> may mean, but looking at g3_beige_300.html there is no such node  
>> there
>> and looking at any other device tree in
>> http://penguinppc.org/historical/dev-trees-html/
>
> Those are old and I wouldn't look too closely at what Apple does.

The only working system emulation we have are Macs (G3 beige, G4, G5),  
so we can't just ignore Apple.
Alex even made me stick to their odd 0x41 rtas-version property. ;)

> ATA doesn't really need anything complex, mostly the ata controller,
> generally named "ata" nowadays with a #address-cells of 1 and a
> #size-cells of 0. Children are then typically disk, cdrom, ... (ie  
> block
> devices) with a unit address of 0 for master and 1 for slave.
>
> In the case of controllers with multiple ports, typically you have one
> such "ata" node per bus. "pci-ata" is a liberal use by Apple here
> representing the actual host controller PCI device.
>
> In any case, what matters is the "compatible" property. This is what
> defines the programming interface of a device.
>
>> I haven't found one that use this kind of addressing for pci-ata.
>> http://penguinppc.org/historical/dev-trees-html/g3bw_400.html for
>> instance has pci@80000000/pci-bridge@d/pci-ata@1/ata-4. ata-2@600  
>> kind
>> of
>> addressing is used by devices on mac-io bus which I do not think we
>> emulate in qemu. So it looks like OpneBIOS is wrong here.
>
> Well, it's possible that the @600 represents a register offset within
> pci-ata, this is entirely up to pci-ata to do as it wishes there to
> define it's own internal binding. Is there a "ranges" property  
> defining
> translation accross "pci-ata" ?

No, but that may be OpenBIOS' fault. Here's its reg, in case it helps:

reg                       00001800 00000000 00000000   00000000 00000000
                          01001810 00000000 00000000   00000000 00000008
                          01001814 00000000 00000000   00000000 00000004
                          01001818 00000000 00000000   00000000 00000008
                          0100181c 00000000 00000000   00000000 00000004
                          01001820 00000000 00000000   00000000 00000010

Regards,
Andreas

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] Re: [PATCHv8 00/16] boot order specification
  2010-12-14 19:59       ` Andreas Färber
@ 2010-12-14 20:31         ` Benjamin Herrenschmidt
  2010-12-14 23:02           ` Alexander Graf
  0 siblings, 1 reply; 38+ messages in thread
From: Benjamin Herrenschmidt @ 2010-12-14 20:31 UTC (permalink / raw)
  To: Andreas Färber
  Cc: kvm, Gleb Natapov, qemu-devel, Blue Swirl, kevin, Alexander Graf,
	The, OpenBIOS Mailinglist


> The only working system emulation we have are Macs (G3 beige, G4, G5),  
> so we can't just ignore Apple.
> Alex even made me stick to their odd 0x41 rtas-version property. ;)

Hah :-) Nothing ever used RTAS on these... afaik, it didn't even work
properly.

> No, but that may be OpenBIOS' fault. Here's its reg, in case it helps:
> 
> reg                       00001800 00000000 00000000   00000000 00000000
>                           01001810 00000000 00000000   00000000 00000008
>                           01001814 00000000 00000000   00000000 00000004
>                           01001818 00000000 00000000   00000000 00000008
>                           0100181c 00000000 00000000   00000000 00000004
>                           01001820 00000000 00000000   00000000 00000010
> 

That looks like PCI.... odd to keep a PCI addressing scheme below a PCI
device...

Cheers,
Ben.

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] Re: [PATCHv8 00/16] boot order specification
  2010-12-14 20:31         ` Benjamin Herrenschmidt
@ 2010-12-14 23:02           ` Alexander Graf
  2010-12-17 14:05             ` Andreas Färber
  0 siblings, 1 reply; 38+ messages in thread
From: Alexander Graf @ 2010-12-14 23:02 UTC (permalink / raw)
  To: Benjamin Herrenschmidt
  Cc: kvm, Gleb Natapov, qemu-devel, Blue Swirl, Andreas Färber,
	kevin, The OpenBIOS Mailinglist


On 14.12.2010, at 21:31, Benjamin Herrenschmidt wrote:

> 
>> The only working system emulation we have are Macs (G3 beige, G4, G5),  
>> so we can't just ignore Apple.
>> Alex even made me stick to their odd 0x41 rtas-version property. ;)
> 
> Hah :-) Nothing ever used RTAS on these... afaik, it didn't even work
> properly.

Then let's not use rtas for the Mac machine, but rather go with Andreas' new machine. Changing the value there to what real FW uses on that machine is more than reasonable :)


Alex

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] Re: [PATCHv8 00/16] boot order specification
  2010-12-14 23:02           ` Alexander Graf
@ 2010-12-17 14:05             ` Andreas Färber
  0 siblings, 0 replies; 38+ messages in thread
From: Andreas Färber @ 2010-12-17 14:05 UTC (permalink / raw)
  To: Alexander Graf
  Cc: kvm, Gleb Natapov, qemu-devel, Blue Swirl, kevin,
	The OpenBIOS Mailinglist

Am 15.12.2010 um 00:02 schrieb Alexander Graf:

> On 14.12.2010, at 21:31, Benjamin Herrenschmidt wrote:
>
>>
>>> The only working system emulation we have are Macs (G3 beige, G4,  
>>> G5),
>>> so we can't just ignore Apple.
>>> Alex even made me stick to their odd 0x41 rtas-version property. ;)
>>
>> Hah :-) Nothing ever used RTAS on these... afaik, it didn't even work
>> properly.
>
> Then let's not use rtas for the Mac machine, but rather go with  
> Andreas' new machine. Changing the value there to what real FW uses  
> on that machine is more than reasonable :)

The value is already conditional on is_apple(), so I don't think it  
needs changing.
I just mustn't forget to fix the old is_apple() {  return 1; }  
implementation for the new machines. :)

Andreas

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] [PATCHv8 12/16] Add bootindex parameter to net/block/fd device
  2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 12/16] Add bootindex parameter to net/block/fd device Gleb Natapov
@ 2011-01-28 13:29   ` Markus Armbruster
  2011-01-28 15:53     ` Gleb Natapov
  2011-02-02 15:08   ` Markus Armbruster
  1 sibling, 1 reply; 38+ messages in thread
From: Markus Armbruster @ 2011-01-28 13:29 UTC (permalink / raw)
  To: Gleb Natapov; +Cc: blauwirbel, kevin, qemu-devel, kvm

Gleb Natapov <gleb@redhat.com> writes:

> If bootindex is specified on command line a string that describes device
> in firmware readable way is added into sorted list. Later this list will
> be passed into firmware to control boot order.
>
> Signed-off-by: Gleb Natapov <gleb@redhat.com>

Out of curiosity: what about qdev "scsi-generic"?  Can't we boot from
that?

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] [PATCHv8 12/16] Add bootindex parameter to net/block/fd device
  2011-01-28 13:29   ` Markus Armbruster
@ 2011-01-28 15:53     ` Gleb Natapov
  2011-01-28 17:19       ` Markus Armbruster
  0 siblings, 1 reply; 38+ messages in thread
From: Gleb Natapov @ 2011-01-28 15:53 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: blauwirbel, kevin, qemu-devel, kvm

On Fri, Jan 28, 2011 at 02:29:50PM +0100, Markus Armbruster wrote:
> Gleb Natapov <gleb@redhat.com> writes:
> 
> > If bootindex is specified on command line a string that describes device
> > in firmware readable way is added into sorted list. Later this list will
> > be passed into firmware to control boot order.
> >
> > Signed-off-by: Gleb Natapov <gleb@redhat.com>
> 
> Out of curiosity: what about qdev "scsi-generic"?  Can't we boot from
> that?
What device exactly scsi-generic supports? scsi-disk has call to
add_boot_device_path() though we cannot boot from it without extboot
now.

--
			Gleb.

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] [PATCHv8 12/16] Add bootindex parameter to net/block/fd device
  2011-01-28 15:53     ` Gleb Natapov
@ 2011-01-28 17:19       ` Markus Armbruster
  0 siblings, 0 replies; 38+ messages in thread
From: Markus Armbruster @ 2011-01-28 17:19 UTC (permalink / raw)
  To: Gleb Natapov; +Cc: blauwirbel, kevin, qemu-devel, kvm

Gleb Natapov <gleb@redhat.com> writes:

> On Fri, Jan 28, 2011 at 02:29:50PM +0100, Markus Armbruster wrote:
>> Gleb Natapov <gleb@redhat.com> writes:
>> 
>> > If bootindex is specified on command line a string that describes device
>> > in firmware readable way is added into sorted list. Later this list will
>> > be passed into firmware to control boot order.
>> >
>> > Signed-off-by: Gleb Natapov <gleb@redhat.com>
>> 
>> Out of curiosity: what about qdev "scsi-generic"?  Can't we boot from
>> that?
> What device exactly scsi-generic supports? scsi-disk has call to
> add_boot_device_path() though we cannot boot from it without extboot
> now.

It's host SCSI generic device (/dev/sg*) pass through.  So it's whatever
real device is passed through.

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] [PATCHv8 12/16] Add bootindex parameter to net/block/fd device
  2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 12/16] Add bootindex parameter to net/block/fd device Gleb Natapov
  2011-01-28 13:29   ` Markus Armbruster
@ 2011-02-02 15:08   ` Markus Armbruster
  2011-02-02 15:10     ` Gleb Natapov
  1 sibling, 1 reply; 38+ messages in thread
From: Markus Armbruster @ 2011-02-02 15:08 UTC (permalink / raw)
  To: Gleb Natapov; +Cc: blauwirbel, kevin, qemu-devel, kvm

Gleb Natapov <gleb@redhat.com> writes:

> If bootindex is specified on command line a string that describes device
> in firmware readable way is added into sorted list. Later this list will
> be passed into firmware to control boot order.
>
> Signed-off-by: Gleb Natapov <gleb@redhat.com>

Just noticed something that slipped through review:

[...]
> diff --git a/vl.c b/vl.c
> index 2cd263e..dadc161 100644
> --- a/vl.c
> +++ b/vl.c
[...]
> @@ -693,6 +704,35 @@ static void restore_boot_devices(void *opaque)
>      qemu_free(standard_boot_devices);
>  }
>  
> +void add_boot_device_path(int32_t bootindex, DeviceState *dev,
> +                          const char *suffix)
> +{
> +    FWBootEntry *node, *i;
> +
> +    if (bootindex < 0) {
> +        return;
> +    }
> +
> +    assert(dev != NULL || suffix != NULL);
> +
> +    node = qemu_mallocz(sizeof(FWBootEntry));
> +    node->bootindex = bootindex;
> +    node->suffix = strdup(suffix);

qemu_strdup()?

> +    node->dev = dev;
> +
> +    QTAILQ_FOREACH(i, &fw_boot_order, link) {
> +        if (i->bootindex == bootindex) {
> +            fprintf(stderr, "Two devices with same boot index %d\n", bootindex);
> +            exit(1);
> +        } else if (i->bootindex < bootindex) {
> +            continue;
> +        }
> +        QTAILQ_INSERT_BEFORE(i, node, link);
> +        return;
> +    }
> +    QTAILQ_INSERT_TAIL(&fw_boot_order, node, link);
> +}
> +
>  static void numa_add(const char *optarg)
>  {
>      char option[128];

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] [PATCHv8 12/16] Add bootindex parameter to net/block/fd device
  2011-02-02 15:08   ` Markus Armbruster
@ 2011-02-02 15:10     ` Gleb Natapov
  2011-02-02 15:12       ` Gleb Natapov
  0 siblings, 1 reply; 38+ messages in thread
From: Gleb Natapov @ 2011-02-02 15:10 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: blauwirbel, kevin, qemu-devel, kvm

On Wed, Feb 02, 2011 at 04:08:07PM +0100, Markus Armbruster wrote:
> Gleb Natapov <gleb@redhat.com> writes:
> 
> > If bootindex is specified on command line a string that describes device
> > in firmware readable way is added into sorted list. Later this list will
> > be passed into firmware to control boot order.
> >
> > Signed-off-by: Gleb Natapov <gleb@redhat.com>
> 
> Just noticed something that slipped through review:
> 
> [...]
> > diff --git a/vl.c b/vl.c
> > index 2cd263e..dadc161 100644
> > --- a/vl.c
> > +++ b/vl.c
> [...]
> > @@ -693,6 +704,35 @@ static void restore_boot_devices(void *opaque)
> >      qemu_free(standard_boot_devices);
> >  }
> >  
> > +void add_boot_device_path(int32_t bootindex, DeviceState *dev,
> > +                          const char *suffix)
> > +{
> > +    FWBootEntry *node, *i;
> > +
> > +    if (bootindex < 0) {
> > +        return;
> > +    }
> > +
> > +    assert(dev != NULL || suffix != NULL);
> > +
> > +    node = qemu_mallocz(sizeof(FWBootEntry));
> > +    node->bootindex = bootindex;
> > +    node->suffix = strdup(suffix);
> 
> qemu_strdup()?
> 
Yap. Will fix.

> > +    node->dev = dev;
> > +
> > +    QTAILQ_FOREACH(i, &fw_boot_order, link) {
> > +        if (i->bootindex == bootindex) {
> > +            fprintf(stderr, "Two devices with same boot index %d\n", bootindex);
> > +            exit(1);
> > +        } else if (i->bootindex < bootindex) {
> > +            continue;
> > +        }
> > +        QTAILQ_INSERT_BEFORE(i, node, link);
> > +        return;
> > +    }
> > +    QTAILQ_INSERT_TAIL(&fw_boot_order, node, link);
> > +}
> > +
> >  static void numa_add(const char *optarg)
> >  {
> >      char option[128];

--
			Gleb.

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [Qemu-devel] [PATCHv8 12/16] Add bootindex parameter to net/block/fd device
  2011-02-02 15:10     ` Gleb Natapov
@ 2011-02-02 15:12       ` Gleb Natapov
  0 siblings, 0 replies; 38+ messages in thread
From: Gleb Natapov @ 2011-02-02 15:12 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: blauwirbel, kevin, qemu-devel, kvm

On Wed, Feb 02, 2011 at 05:10:04PM +0200, Gleb Natapov wrote:
> On Wed, Feb 02, 2011 at 04:08:07PM +0100, Markus Armbruster wrote:
> > Gleb Natapov <gleb@redhat.com> writes:
> > 
> > > If bootindex is specified on command line a string that describes device
> > > in firmware readable way is added into sorted list. Later this list will
> > > be passed into firmware to control boot order.
> > >
> > > Signed-off-by: Gleb Natapov <gleb@redhat.com>
> > 
> > Just noticed something that slipped through review:
> > 
> > [...]
> > > diff --git a/vl.c b/vl.c
> > > index 2cd263e..dadc161 100644
> > > --- a/vl.c
> > > +++ b/vl.c
> > [...]
> > > @@ -693,6 +704,35 @@ static void restore_boot_devices(void *opaque)
> > >      qemu_free(standard_boot_devices);
> > >  }
> > >  
> > > +void add_boot_device_path(int32_t bootindex, DeviceState *dev,
> > > +                          const char *suffix)
> > > +{
> > > +    FWBootEntry *node, *i;
> > > +
> > > +    if (bootindex < 0) {
> > > +        return;
> > > +    }
> > > +
> > > +    assert(dev != NULL || suffix != NULL);
> > > +
> > > +    node = qemu_mallocz(sizeof(FWBootEntry));
> > > +    node->bootindex = bootindex;
> > > +    node->suffix = strdup(suffix);
> > 
> > qemu_strdup()?
> > 
> Yap. Will fix.
> 
BTW we have 40 uses of strdup and 75 uses of qemu_strdup.

> > > +    node->dev = dev;
> > > +
> > > +    QTAILQ_FOREACH(i, &fw_boot_order, link) {
> > > +        if (i->bootindex == bootindex) {
> > > +            fprintf(stderr, "Two devices with same boot index %d\n", bootindex);
> > > +            exit(1);
> > > +        } else if (i->bootindex < bootindex) {
> > > +            continue;
> > > +        }
> > > +        QTAILQ_INSERT_BEFORE(i, node, link);
> > > +        return;
> > > +    }
> > > +    QTAILQ_INSERT_TAIL(&fw_boot_order, node, link);
> > > +}
> > > +
> > >  static void numa_add(const char *optarg)
> > >  {
> > >      char option[128];
> 
> --
> 			Gleb.
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
			Gleb.

^ permalink raw reply	[flat|nested] 38+ messages in thread

end of thread, other threads:[~2011-02-02 15:12 UTC | newest]

Thread overview: 38+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-12-08 11:34 [Qemu-devel] [PATCHv8 00/16] boot order specification Gleb Natapov
2010-12-08 11:34 ` [Qemu-devel] [PATCHv8 01/16] Introduce fw_name field to DeviceInfo structure Gleb Natapov
2010-12-08 11:34 ` [Qemu-devel] [PATCHv8 02/16] Introduce new BusInfo callback get_fw_dev_path Gleb Natapov
2010-12-08 11:34 ` [Qemu-devel] [PATCHv8 03/16] Keep track of ISA ports ISA device is using in qdev Gleb Natapov
2010-12-08 11:34 ` [Qemu-devel] [PATCHv8 04/16] Add get_fw_dev_path callback to ISA bus " Gleb Natapov
2010-12-08 11:34 ` [Qemu-devel] [PATCHv8 05/16] Store IDE bus id in IDEBus structure for easy access Gleb Natapov
2010-12-08 11:34 ` [Qemu-devel] [PATCHv8 06/16] Add get_fw_dev_path callback to IDE bus Gleb Natapov
2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 07/16] Add get_fw_dev_path callback for system bus Gleb Natapov
2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 08/16] Add get_fw_dev_path callback for pci bus Gleb Natapov
2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 09/16] Record which USBDevice USBPort belongs too Gleb Natapov
2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 10/16] Add get_fw_dev_path callback for usb bus Gleb Natapov
2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 11/16] Add get_fw_dev_path callback to scsi bus Gleb Natapov
2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 12/16] Add bootindex parameter to net/block/fd device Gleb Natapov
2011-01-28 13:29   ` Markus Armbruster
2011-01-28 15:53     ` Gleb Natapov
2011-01-28 17:19       ` Markus Armbruster
2011-02-02 15:08   ` Markus Armbruster
2011-02-02 15:10     ` Gleb Natapov
2011-02-02 15:12       ` Gleb Natapov
2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 13/16] Change fw_cfg_add_file() to get full file path as a parameter Gleb Natapov
2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 14/16] Add bootindex for option roms Gleb Natapov
2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 15/16] Add notifier that will be called when machine is fully created Gleb Natapov
2010-12-08 11:35 ` [Qemu-devel] [PATCHv8 16/16] Pass boot device list to firmware Gleb Natapov
2010-12-11 15:13 ` [Qemu-devel] Re: [PATCHv8 00/16] boot order specification Blue Swirl
2010-12-11 16:06   ` Gleb Natapov
2010-12-11 17:19     ` Blue Swirl
2010-12-11 18:02       ` Gleb Natapov
2010-12-11 18:27         ` Gleb Natapov
2010-12-11 19:06           ` Blue Swirl
2010-12-11 19:11             ` Gleb Natapov
2010-12-11 23:27               ` Benjamin Herrenschmidt
2010-12-11 18:59         ` Blue Swirl
2010-12-11 23:22     ` Benjamin Herrenschmidt
2010-12-14 19:59       ` Andreas Färber
2010-12-14 20:31         ` Benjamin Herrenschmidt
2010-12-14 23:02           ` Alexander Graf
2010-12-17 14:05             ` Andreas Färber
2010-12-11 22:10 ` Blue Swirl

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).