diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2012-04-25 17:55:41 +0000 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2012-05-01 21:47:00 +0200 |
commit | d601fac478eee7391f3e7005a9321fbf38d74809 (patch) | |
tree | 1cab637a7d0fe97299b8591b1dda492b63db247a /hw/spapr_vio.h | |
parent | 892c587f22fc97362a595d3c84669a39ce1cd2f5 (diff) |
pseries: Implement automatic PAPR VIO address allocation
PAPR virtual IO (VIO) devices require a unique, but otherwise arbitrary,
"address" used as a token to the hypercalls which manipulate them.
Currently the pseries machine code does an ok job of allocating these
addresses when the legacy -net nic / -serial and so forth options are used
but will fail to allocate them properly when using -device.
Specifically, you can use -device if all addresses are explicitly assigned.
Without explicit assignment, only one VIO device of each type (network,
console, SCSI) will be assigned properly, any further ones will attempt
to take the same address leading to a fatal error.
This patch fixes the situation by adding a proper address allocator to the
VIO "bus" code. This is used both by -device and the legacy options and
default devices. Addresses can still be explicitly assigned with -device
options if desired.
This patch changes the (guest visible) numbering of VIO devices, but since
their addresses are discovered using the device tree and already differ
from the numbering found on existing PowerVM systems, this does not break
compatibility.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'hw/spapr_vio.h')
-rw-r--r-- | hw/spapr_vio.h | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/hw/spapr_vio.h b/hw/spapr_vio.h index 10ab3594c0..87816e456d 100644 --- a/hw/spapr_vio.h +++ b/hw/spapr_vio.h @@ -32,8 +32,6 @@ enum VIOsPAPR_TCEAccess { SPAPR_TCE_RW = 3, }; -#define SPAPR_VTY_BASE_ADDRESS 0x30000000 - #define TYPE_VIO_SPAPR_DEVICE "vio-spapr-device" #define VIO_SPAPR_DEVICE(obj) \ OBJECT_CHECK(VIOsPAPRDevice, (obj), TYPE_VIO_SPAPR_DEVICE) @@ -82,13 +80,14 @@ struct VIOsPAPRDevice { VIOsPAPR_CRQ crq; }; -#define DEFINE_SPAPR_PROPERTIES(type, field, default_reg, default_dma_window) \ - DEFINE_PROP_UINT32("reg", type, field.reg, default_reg), \ +#define DEFINE_SPAPR_PROPERTIES(type, field, default_dma_window) \ + DEFINE_PROP_UINT32("reg", type, field.reg, -1), \ DEFINE_PROP_UINT32("dma-window", type, field.rtce_window_size, \ default_dma_window) struct VIOsPAPRBus { BusState bus; + uint32_t next_reg; int (*init)(VIOsPAPRDevice *dev); int (*devnode)(VIOsPAPRDevice *dev, void *fdt, int node_off); }; @@ -119,9 +118,9 @@ int spapr_vio_send_crq(VIOsPAPRDevice *dev, uint8_t *crq); VIOsPAPRDevice *vty_lookup(sPAPREnvironment *spapr, target_ulong reg); void vty_putchars(VIOsPAPRDevice *sdev, uint8_t *buf, int len); -void spapr_vty_create(VIOsPAPRBus *bus, uint32_t reg, CharDriverState *chardev); -void spapr_vlan_create(VIOsPAPRBus *bus, uint32_t reg, NICInfo *nd); -void spapr_vscsi_create(VIOsPAPRBus *bus, uint32_t reg); +void spapr_vty_create(VIOsPAPRBus *bus, CharDriverState *chardev); +void spapr_vlan_create(VIOsPAPRBus *bus, NICInfo *nd); +void spapr_vscsi_create(VIOsPAPRBus *bus); VIOsPAPRDevice *spapr_vty_get_default(VIOsPAPRBus *bus); |