From f77d4ff8506ca4f608052486d87f8a3ed03d5202 Mon Sep 17 00:00:00 2001 From: Alexey Kardashevskiy Date: Wed, 19 Oct 2016 10:05:26 +1100 Subject: [PATCH 01/73] pseries: Update SLOF firmware image to 20161019 The main changes are: * virtio-serial * booting speed imrovement * better PCI bridge support The complete changelog is: > virtio-serial: Fix compile error > scsi: Remove debug functions from scsi-loader.fs > scsi: Remove unused read-6 command > obp-tftp: Remove the ciregs-buffer > libnet: Simplify the net-load arguments passing > libnet: Simplify the Forth-to-C wrapper of ping() > Do not link libnet to net-snk anymore, and remove net-snk from board-qemu > Add a Forth-to-C wrapper for the ping command, too > Link libnet code to Paflof and add a wrapper for netboot() > Remember execution tokens of "write" and "read" for socket operations > Add virtio-serial device support > Generalize output banner write routine > Improve indentation in OF.fs > scsi: implement READ (16) command > rtas: Improve rtas-do-config-@ and rtas-do-config-! a little bit > libnet: Make netapps.h includable from .code files > libnet: Remove unused prototypes from netapps.h > libnet: Fix the printout of the ping command > libnet: Make sure to close sockets when we're done > scsi: implement read-capacity-16 > pci: Fix secondary and subordinate PCI bus enumeration with board-qemu > pci-phb: Fix stack underflow in phb-pci-walk-bridge > paflof: Add a read() function to read keyboard input > paflof: Add socket(), send() and recv() functions to paflof > paflof: Provide get_timer() and set_timer() helper functions > paflof: Add a write_mm_log helper function > paflof: Copy sbrk code from net-snk > paflof: Use CFLAGS from make.rules instead of completely redefining them > Do not include the FCode evaluator by default anymore > Source code beautification of board-qemu/slof/pci-interrupts.fs > Allow PCI devices in PCI bridge slots greater than 4 > Fix bad interrupt pin numbering in interrupt-map property of PCI bridges > Improve SLOF_alloc_mem_aligned() > instance: Fix set-my-args for empty arguments > Fix remaining compiler warnings in sloffs.c > Remove misleading padding fields from ROM header definition > Improve indentation in calculatecrc.h > Do not include calculatecrc.h from assembler files > Remove unused defines in calculatecrc.h > libnet: Re-initialize global variables at the beginning of tftp() > Remove dependency on cpu/@0 for booting > usb: Set XHCI slot speed according to port status > usb: Build correct route string for USB3 devices behind a hub > usb: Initialize USB3 devices on a hub and keep track of hub topology > usb: Increase amount of maximum slot IDs and add a sanity check > usb: Move XHCI port state arrays from header to .c file > tools: add copy functionality > tools: added support to sloffs to read from /dev/slof_flash > tools: added file append functionality > tools: use crc checking code from romfs/tools > tools: added initial version of sloffs > romfs: factored out crc code, to make it usable from other locations > tools: remove unused parts from the Makefile > usb-hid: Fix non-working comma key > fat-files: Fix access to FAT32 dir/files when cluster > 16-bits > virtio-net: fix ring handling in receive > net: Remove remainders of the MTFTP code > net: Move also files from clients/net-snk/app/netapps/ to lib/libnet/ > net: Move files from clients/net-snk/app/netlib/ to lib/libnet/ > net-snk: Get rid of netlib and netapps prefixes in include statements > usb-xhci: assign field4 before conditional > Improve F12 key handling in boot menu > Fix stack underflow that occurs with duplicated ESC in input > rtas-nvram: optimize erase > ipv6: Replace magic number 1500 with ETH_MTU_SIZE (i.e. 1518) > ipv6: Fix NULL pointer dereference in ip6addr_add() > ipv6: Fix memory leak in set_ipv6_address() / ip6_create_ll_address() > ipv6: Clear memory after malloc if necessary > ipv6: Fix possible NULL-pointer dereference in send_ipv6() > ping: use gateway address for routing > ping: add netmask in the ping argument > xhci: fix missing keys from keyboard > xhci: add memory barrier after filling the trb > loaders: Remove netflash command > boot: Remove legacy Forth words for network loading > base: Move cnt-bits and bcd-to-bin to board-js2x folder > base: Move huge-tftp-load variable to obp-tftp package > base: Remove unused IP address conversion functions > virtio: White space cleanup in virtio-9p.c > virtio: Add modern version 1.0 support to 9p driver > virtio: Set a proper name for virtio-9p device tree nodes > pci: Fix mistype in "unkown-bridge" > ipv6: Indent code with tabs, not with spaces > ipv6: send_ipv6() has to return after doing NDP > ipv6: Do not use unitialized MAC address array > ipv6: Add support for sending packets through a router > Remove unused sms code. > virtio-net: initialize to populate mac address > libbootmsg: Do not use '\b' characters when printing checkpoints > dev-null: The "read" function has to return 0 if nothing has been read Signed-off-by: Alexey Kardashevskiy Signed-off-by: David Gibson --- pc-bios/README | 2 +- pc-bios/slof.bin | Bin 923832 -> 898232 bytes roms/SLOF | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pc-bios/README b/pc-bios/README index 5a8a93193e..779192eb7c 100644 --- a/pc-bios/README +++ b/pc-bios/README @@ -17,7 +17,7 @@ - SLOF (Slimline Open Firmware) is a free IEEE 1275 Open Firmware implementation for certain IBM POWER hardware. The sources are at https://github.com/aik/SLOF, and the image currently in qemu is - built from git tag qemu-slof-20160223. + built from git tag qemu-slof-20161019. - sgabios (the Serial Graphics Adapter option ROM) provides a means for legacy x86 software to communicate with an attached serial console as diff --git a/pc-bios/slof.bin b/pc-bios/slof.bin index f2384939efd167dad1153ac744d0624ad8591cfa..30ce7ac384146c1a30c2b3067ccd532efe78f189 100644 GIT binary patch literal 898232 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%0ArF>GL4 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[i?YR|cl=na9X5oEDkluu^$ifqOq&MM@F+PFP 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 Yea$_n%4~ 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 NgOk-nI{4s|`ZyOk!{G*0z%ba^8RKbIxRD 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 diff --git a/roms/SLOF b/roms/SLOF index e3d05727a0..efd65f4992 160000 --- a/roms/SLOF +++ b/roms/SLOF @@ -1 +1 @@ -Subproject commit e3d05727a074619fc12d0a67f05cf2c42c875cce +Subproject commit efd65f49929d7db775b26066d538c8120ae3db94 From b1fc72f0fb0aeae4194ff89c454aabe019983d0d Mon Sep 17 00:00:00 2001 From: Benjamin Herrenschmidt Date: Mon, 17 Oct 2016 22:33:14 +0200 Subject: [PATCH 02/73] ppc/xics: Add xics to the monitor "info pic" command MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Useful to debug interrupt problems. Signed-off-by: Benjamin Herrenschmidt [clg: - updated for qemu-2.7 - added a test on ->irqs as it is not necessarily allocated (PHB3_MSI) - removed static variable g_xics and replace with a loop on all children to find the xics objects. - rebased on InterruptStatsProvider interface ] Signed-off-by: Cédric Le Goater Signed-off-by: David Gibson --- hw/intc/xics.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/hw/intc/xics.c b/hw/intc/xics.c index f40b00003a..7fac964fbd 100644 --- a/hw/intc/xics.c +++ b/hw/intc/xics.c @@ -35,6 +35,8 @@ #include "hw/ppc/xics.h" #include "qemu/error-report.h" #include "qapi/visitor.h" +#include "monitor/monitor.h" +#include "hw/intc/intc.h" int xics_get_cpu_index_by_dt_id(int cpu_dt_id) { @@ -90,6 +92,47 @@ void xics_cpu_setup(XICSState *xics, PowerPCCPU *cpu) } } +static void xics_common_pic_print_info(InterruptStatsProvider *obj, + Monitor *mon) +{ + XICSState *xics = XICS_COMMON(obj); + ICSState *ics; + uint32_t i; + + for (i = 0; i < xics->nr_servers; i++) { + ICPState *icp = &xics->ss[i]; + + if (!icp->output) { + continue; + } + monitor_printf(mon, "CPU %d XIRR=%08x (%p) PP=%02x MFRR=%02x\n", + i, icp->xirr, icp->xirr_owner, + icp->pending_priority, icp->mfrr); + } + + QLIST_FOREACH(ics, &xics->ics, list) { + monitor_printf(mon, "ICS %4x..%4x %p\n", + ics->offset, ics->offset + ics->nr_irqs - 1, ics); + + if (!ics->irqs) { + continue; + } + + for (i = 0; i < ics->nr_irqs; i++) { + ICSIRQState *irq = ics->irqs + i; + + if (!(irq->flags & XICS_FLAGS_IRQ_MASK)) { + continue; + } + monitor_printf(mon, " %4x %s %02x %02x\n", + ics->offset + i, + (irq->flags & XICS_FLAGS_IRQ_LSI) ? + "LSI" : "MSI", + irq->priority, irq->status); + } + } +} + /* * XICS Common class - parent for emulated XICS and KVM-XICS */ @@ -190,8 +233,10 @@ static void xics_common_initfn(Object *obj) static void xics_common_class_init(ObjectClass *oc, void *data) { DeviceClass *dc = DEVICE_CLASS(oc); + InterruptStatsProviderClass *ic = INTERRUPT_STATS_PROVIDER_CLASS(oc); dc->reset = xics_common_reset; + ic->print_info = xics_common_pic_print_info; } static const TypeInfo xics_common_info = { @@ -201,6 +246,10 @@ static const TypeInfo xics_common_info = { .class_size = sizeof(XICSStateClass), .instance_init = xics_common_initfn, .class_init = xics_common_class_init, + .interfaces = (InterfaceInfo[]) { + { TYPE_INTERRUPT_STATS_PROVIDER }, + { } + }, }; /* From f62e0bbb39eec088ff4fbe6a7ec38af51fac5e94 Mon Sep 17 00:00:00 2001 From: Laurent Vivier Date: Mon, 17 Oct 2016 12:30:19 +0200 Subject: [PATCH 03/73] tests: fix memory leak in virtio-scsi-test vs is allocated in qvirtio_scsi_pci_init() and never freed. Signed-off-by: Laurent Vivier Reviewed-by: Greg Kurz Reviewed-by: Thomas Huth Signed-off-by: David Gibson --- tests/virtio-scsi-test.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/virtio-scsi-test.c b/tests/virtio-scsi-test.c index 79088bb249..94d75b1493 100644 --- a/tests/virtio-scsi-test.c +++ b/tests/virtio-scsi-test.c @@ -64,6 +64,7 @@ static void qvirtio_scsi_pci_free(QVirtIOSCSI *vs) qvirtio_pci_device_disable(container_of(vs->dev, QVirtioPCIDevice, vdev)); g_free(vs->dev); qpci_free_pc(vs->bus); + g_free(vs); } static uint64_t qvirtio_scsi_alloc(QVirtIOSCSI *vs, size_t alloc_size, From 458f3b2c953bdc7110896cb3691251023652523f Mon Sep 17 00:00:00 2001 From: Laurent Vivier Date: Mon, 17 Oct 2016 12:30:20 +0200 Subject: [PATCH 04/73] tests: don't check if qtest_spapr_boot() returns NULL qtest_spapr_boot()/qtest_pc_boot()/qtest_boot() call qtest_vboot() and qtest_vboot() calls g_malloc(), and g_malloc() never fails: if memory allocation fails, the application is terminated. Signed-off-by: Laurent Vivier Reviewed-by: Thomas Huth Reviewed-by: Greg Kurz Signed-off-by: David Gibson --- tests/libqos/libqos.c | 2 ++ tests/rtas-test.c | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/libqos/libqos.c b/tests/libqos/libqos.c index 7abb48254e..6226546c28 100644 --- a/tests/libqos/libqos.c +++ b/tests/libqos/libqos.c @@ -10,6 +10,8 @@ /** * Launch QEMU with the given command line, * and then set up interrupts and our guest malloc interface. + * Never returns NULL: + * Terminates the application in case an error is encountered. */ QOSState *qtest_vboot(QOSOps *ops, const char *cmdline_fmt, va_list ap) { diff --git a/tests/rtas-test.c b/tests/rtas-test.c index ba0867afbd..276c87ef84 100644 --- a/tests/rtas-test.c +++ b/tests/rtas-test.c @@ -14,7 +14,6 @@ static void test_rtas_get_time_of_day(void) time_t t1, t2; qs = qtest_spapr_boot("-machine pseries"); - g_assert(qs != NULL); t1 = time(NULL); ret = qrtas_get_time_of_day(qs->alloc, &tm, &ns); From 6b9cdf4cf1fd52c1a59a7640a02a718176bfd217 Mon Sep 17 00:00:00 2001 From: Laurent Vivier Date: Mon, 17 Oct 2016 12:30:21 +0200 Subject: [PATCH 05/73] tests: move QVirtioBus pointer into QVirtioDevice This allows to not have to pass bus and device for every virtio functions. Signed-off-by: Laurent Vivier Reviewed-by: Greg Kurz Reviewed-by: Thomas Huth [dwg: Fix style nit] Signed-off-by: David Gibson --- tests/libqos/virtio-mmio.c | 1 + tests/libqos/virtio-pci.c | 2 + tests/libqos/virtio.c | 78 +++++++++----------- tests/libqos/virtio.h | 47 ++++++------ tests/vhost-user-test.c | 33 ++++----- tests/virtio-9p-test.c | 15 ++-- tests/virtio-blk-test.c | 147 +++++++++++++++++-------------------- tests/virtio-net-test.c | 59 +++++++-------- tests/virtio-scsi-test.c | 17 ++--- 9 files changed, 184 insertions(+), 215 deletions(-) diff --git a/tests/libqos/virtio-mmio.c b/tests/libqos/virtio-mmio.c index 0cab38f296..bced6803e6 100644 --- a/tests/libqos/virtio-mmio.c +++ b/tests/libqos/virtio-mmio.c @@ -199,6 +199,7 @@ QVirtioMMIODevice *qvirtio_mmio_init_device(uint64_t addr, uint32_t page_size) dev->addr = addr; dev->page_size = page_size; dev->vdev.device_type = readl(addr + QVIRTIO_MMIO_DEVICE_ID); + dev->vdev.bus = &qvirtio_mmio; writel(addr + QVIRTIO_MMIO_GUEST_PAGE_SIZE, page_size); diff --git a/tests/libqos/virtio-pci.c b/tests/libqos/virtio-pci.c index 6e005c1835..bbfed58dcf 100644 --- a/tests/libqos/virtio-pci.c +++ b/tests/libqos/virtio-pci.c @@ -286,6 +286,8 @@ QVirtioPCIDevice *qvirtio_pci_device_find(QPCIBus *bus, uint16_t device_type) QVirtioPCIDevice *dev = NULL; qvirtio_pci_foreach(bus, device_type, qvirtio_pci_assign_device, &dev); + dev->vdev.bus = &qvirtio_pci; + return dev; } diff --git a/tests/libqos/virtio.c b/tests/libqos/virtio.c index 105bccecaa..ec30cb99b2 100644 --- a/tests/libqos/virtio.c +++ b/tests/libqos/virtio.c @@ -13,45 +13,40 @@ #include "standard-headers/linux/virtio_config.h" #include "standard-headers/linux/virtio_ring.h" -uint8_t qvirtio_config_readb(const QVirtioBus *bus, QVirtioDevice *d, - uint64_t addr) +uint8_t qvirtio_config_readb(QVirtioDevice *d, uint64_t addr) { - return bus->config_readb(d, addr); + return d->bus->config_readb(d, addr); } -uint16_t qvirtio_config_readw(const QVirtioBus *bus, QVirtioDevice *d, - uint64_t addr) +uint16_t qvirtio_config_readw(QVirtioDevice *d, uint64_t addr) { - return bus->config_readw(d, addr); + return d->bus->config_readw(d, addr); } -uint32_t qvirtio_config_readl(const QVirtioBus *bus, QVirtioDevice *d, - uint64_t addr) +uint32_t qvirtio_config_readl(QVirtioDevice *d, uint64_t addr) { - return bus->config_readl(d, addr); + return d->bus->config_readl(d, addr); } -uint64_t qvirtio_config_readq(const QVirtioBus *bus, QVirtioDevice *d, - uint64_t addr) +uint64_t qvirtio_config_readq(QVirtioDevice *d, uint64_t addr) { - return bus->config_readq(d, addr); + return d->bus->config_readq(d, addr); } -uint32_t qvirtio_get_features(const QVirtioBus *bus, QVirtioDevice *d) +uint32_t qvirtio_get_features(QVirtioDevice *d) { - return bus->get_features(d); + return d->bus->get_features(d); } -void qvirtio_set_features(const QVirtioBus *bus, QVirtioDevice *d, - uint32_t features) +void qvirtio_set_features(QVirtioDevice *d, uint32_t features) { - bus->set_features(d, features); + d->bus->set_features(d, features); } -QVirtQueue *qvirtqueue_setup(const QVirtioBus *bus, QVirtioDevice *d, - QGuestAllocator *alloc, uint16_t index) +QVirtQueue *qvirtqueue_setup(QVirtioDevice *d, + QGuestAllocator *alloc, uint16_t index) { - return bus->virtqueue_setup(d, alloc, index); + return d->bus->virtqueue_setup(d, alloc, index); } void qvirtqueue_cleanup(const QVirtioBus *bus, QVirtQueue *vq, @@ -60,40 +55,40 @@ void qvirtqueue_cleanup(const QVirtioBus *bus, QVirtQueue *vq, return bus->virtqueue_cleanup(vq, alloc); } -void qvirtio_reset(const QVirtioBus *bus, QVirtioDevice *d) +void qvirtio_reset(QVirtioDevice *d) { - bus->set_status(d, 0); - g_assert_cmphex(bus->get_status(d), ==, 0); + d->bus->set_status(d, 0); + g_assert_cmphex(d->bus->get_status(d), ==, 0); } -void qvirtio_set_acknowledge(const QVirtioBus *bus, QVirtioDevice *d) +void qvirtio_set_acknowledge(QVirtioDevice *d) { - bus->set_status(d, bus->get_status(d) | VIRTIO_CONFIG_S_ACKNOWLEDGE); - g_assert_cmphex(bus->get_status(d), ==, VIRTIO_CONFIG_S_ACKNOWLEDGE); + d->bus->set_status(d, d->bus->get_status(d) | VIRTIO_CONFIG_S_ACKNOWLEDGE); + g_assert_cmphex(d->bus->get_status(d), ==, VIRTIO_CONFIG_S_ACKNOWLEDGE); } -void qvirtio_set_driver(const QVirtioBus *bus, QVirtioDevice *d) +void qvirtio_set_driver(QVirtioDevice *d) { - bus->set_status(d, bus->get_status(d) | VIRTIO_CONFIG_S_DRIVER); - g_assert_cmphex(bus->get_status(d), ==, + d->bus->set_status(d, d->bus->get_status(d) | VIRTIO_CONFIG_S_DRIVER); + g_assert_cmphex(d->bus->get_status(d), ==, VIRTIO_CONFIG_S_DRIVER | VIRTIO_CONFIG_S_ACKNOWLEDGE); } -void qvirtio_set_driver_ok(const QVirtioBus *bus, QVirtioDevice *d) +void qvirtio_set_driver_ok(QVirtioDevice *d) { - bus->set_status(d, bus->get_status(d) | VIRTIO_CONFIG_S_DRIVER_OK); - g_assert_cmphex(bus->get_status(d), ==, VIRTIO_CONFIG_S_DRIVER_OK | + d->bus->set_status(d, d->bus->get_status(d) | VIRTIO_CONFIG_S_DRIVER_OK); + g_assert_cmphex(d->bus->get_status(d), ==, VIRTIO_CONFIG_S_DRIVER_OK | VIRTIO_CONFIG_S_DRIVER | VIRTIO_CONFIG_S_ACKNOWLEDGE); } -void qvirtio_wait_queue_isr(const QVirtioBus *bus, QVirtioDevice *d, +void qvirtio_wait_queue_isr(QVirtioDevice *d, QVirtQueue *vq, gint64 timeout_us) { gint64 start_time = g_get_monotonic_time(); for (;;) { clock_step(100); - if (bus->get_queue_isr_status(d, vq)) { + if (d->bus->get_queue_isr_status(d, vq)) { return; } g_assert(g_get_monotonic_time() - start_time <= timeout_us); @@ -105,8 +100,7 @@ void qvirtio_wait_queue_isr(const QVirtioBus *bus, QVirtioDevice *d, * The virtqueue interrupt must not be raised, making this useful for testing * event_index functionality. */ -uint8_t qvirtio_wait_status_byte_no_isr(const QVirtioBus *bus, - QVirtioDevice *d, +uint8_t qvirtio_wait_status_byte_no_isr(QVirtioDevice *d, QVirtQueue *vq, uint64_t addr, gint64 timeout_us) @@ -116,20 +110,19 @@ uint8_t qvirtio_wait_status_byte_no_isr(const QVirtioBus *bus, while ((val = readb(addr)) == 0xff) { clock_step(100); - g_assert(!bus->get_queue_isr_status(d, vq)); + g_assert(!d->bus->get_queue_isr_status(d, vq)); g_assert(g_get_monotonic_time() - start_time <= timeout_us); } return val; } -void qvirtio_wait_config_isr(const QVirtioBus *bus, QVirtioDevice *d, - gint64 timeout_us) +void qvirtio_wait_config_isr(QVirtioDevice *d, gint64 timeout_us) { gint64 start_time = g_get_monotonic_time(); for (;;) { clock_step(100); - if (bus->get_config_isr_status(d)) { + if (d->bus->get_config_isr_status(d)) { return; } g_assert(g_get_monotonic_time() - start_time <= timeout_us); @@ -253,8 +246,7 @@ uint32_t qvirtqueue_add_indirect(QVirtQueue *vq, QVRingIndirectDesc *indirect) return vq->free_head++; /* Return and increase, in this order */ } -void qvirtqueue_kick(const QVirtioBus *bus, QVirtioDevice *d, QVirtQueue *vq, - uint32_t free_head) +void qvirtqueue_kick(QVirtioDevice *d, QVirtQueue *vq, uint32_t free_head) { /* vq->avail->idx */ uint16_t idx = readw(vq->avail + 2); @@ -276,7 +268,7 @@ void qvirtqueue_kick(const QVirtioBus *bus, QVirtioDevice *d, QVirtQueue *vq, /* < 1 because we add elements to avail queue one by one */ if ((flags & VRING_USED_F_NO_NOTIFY) == 0 && (!vq->event || (uint16_t)(idx-avail_event) < 1)) { - bus->virtqueue_kick(d, vq); + d->bus->virtqueue_kick(d, vq); } } diff --git a/tests/libqos/virtio.h b/tests/libqos/virtio.h index 0250842bf2..ac4669a11b 100644 --- a/tests/libqos/virtio.h +++ b/tests/libqos/virtio.h @@ -15,7 +15,10 @@ #define QVIRTIO_F_BAD_FEATURE 0x40000000 +typedef struct QVirtioBus QVirtioBus; + typedef struct QVirtioDevice { + const QVirtioBus *bus; /* Device type */ uint16_t device_type; } QVirtioDevice; @@ -39,7 +42,7 @@ typedef struct QVRingIndirectDesc { uint16_t elem; } QVRingIndirectDesc; -typedef struct QVirtioBus { +struct QVirtioBus { uint8_t (*config_readb)(QVirtioDevice *d, uint64_t addr); uint16_t (*config_readw)(QVirtioDevice *d, uint64_t addr); uint32_t (*config_readl)(QVirtioDevice *d, uint64_t addr); @@ -84,7 +87,7 @@ typedef struct QVirtioBus { /* Notify changes in virtqueue */ void (*virtqueue_kick)(QVirtioDevice *d, QVirtQueue *vq); -} QVirtioBus; +}; static inline uint32_t qvring_size(uint32_t num, uint32_t align) { @@ -93,34 +96,27 @@ static inline uint32_t qvring_size(uint32_t num, uint32_t align) + sizeof(uint16_t) * 3 + sizeof(struct vring_used_elem) * num; } -uint8_t qvirtio_config_readb(const QVirtioBus *bus, QVirtioDevice *d, - uint64_t addr); -uint16_t qvirtio_config_readw(const QVirtioBus *bus, QVirtioDevice *d, - uint64_t addr); -uint32_t qvirtio_config_readl(const QVirtioBus *bus, QVirtioDevice *d, - uint64_t addr); -uint64_t qvirtio_config_readq(const QVirtioBus *bus, QVirtioDevice *d, - uint64_t addr); -uint32_t qvirtio_get_features(const QVirtioBus *bus, QVirtioDevice *d); -void qvirtio_set_features(const QVirtioBus *bus, QVirtioDevice *d, - uint32_t features); +uint8_t qvirtio_config_readb(QVirtioDevice *d, uint64_t addr); +uint16_t qvirtio_config_readw(QVirtioDevice *d, uint64_t addr); +uint32_t qvirtio_config_readl(QVirtioDevice *d, uint64_t addr); +uint64_t qvirtio_config_readq(QVirtioDevice *d, uint64_t addr); +uint32_t qvirtio_get_features(QVirtioDevice *d); +void qvirtio_set_features(QVirtioDevice *d, uint32_t features); -void qvirtio_reset(const QVirtioBus *bus, QVirtioDevice *d); -void qvirtio_set_acknowledge(const QVirtioBus *bus, QVirtioDevice *d); -void qvirtio_set_driver(const QVirtioBus *bus, QVirtioDevice *d); -void qvirtio_set_driver_ok(const QVirtioBus *bus, QVirtioDevice *d); +void qvirtio_reset(QVirtioDevice *d); +void qvirtio_set_acknowledge(QVirtioDevice *d); +void qvirtio_set_driver(QVirtioDevice *d); +void qvirtio_set_driver_ok(QVirtioDevice *d); -void qvirtio_wait_queue_isr(const QVirtioBus *bus, QVirtioDevice *d, +void qvirtio_wait_queue_isr(QVirtioDevice *d, QVirtQueue *vq, gint64 timeout_us); -uint8_t qvirtio_wait_status_byte_no_isr(const QVirtioBus *bus, - QVirtioDevice *d, +uint8_t qvirtio_wait_status_byte_no_isr(QVirtioDevice *d, QVirtQueue *vq, uint64_t addr, gint64 timeout_us); -void qvirtio_wait_config_isr(const QVirtioBus *bus, QVirtioDevice *d, - gint64 timeout_us); -QVirtQueue *qvirtqueue_setup(const QVirtioBus *bus, QVirtioDevice *d, - QGuestAllocator *alloc, uint16_t index); +void qvirtio_wait_config_isr(QVirtioDevice *d, gint64 timeout_us); +QVirtQueue *qvirtqueue_setup(QVirtioDevice *d, + QGuestAllocator *alloc, uint16_t index); void qvirtqueue_cleanup(const QVirtioBus *bus, QVirtQueue *vq, QGuestAllocator *alloc); @@ -132,8 +128,7 @@ void qvring_indirect_desc_add(QVRingIndirectDesc *indirect, uint64_t data, uint32_t qvirtqueue_add(QVirtQueue *vq, uint64_t data, uint32_t len, bool write, bool next); uint32_t qvirtqueue_add_indirect(QVirtQueue *vq, QVRingIndirectDesc *indirect); -void qvirtqueue_kick(const QVirtioBus *bus, QVirtioDevice *d, QVirtQueue *vq, - uint32_t free_head); +void qvirtqueue_kick(QVirtioDevice *d, QVirtQueue *vq, uint32_t free_head); void qvirtqueue_set_used_event(QVirtQueue *vq, uint16_t idx); #endif diff --git a/tests/vhost-user-test.c b/tests/vhost-user-test.c index a7f06291cb..e4b2900898 100644 --- a/tests/vhost-user-test.c +++ b/tests/vhost-user-test.c @@ -172,15 +172,15 @@ static void init_virtio_dev(TestServer *s) g_assert_nonnull(dev); qvirtio_pci_device_enable(dev); - qvirtio_reset(&qvirtio_pci, &dev->vdev); - qvirtio_set_acknowledge(&qvirtio_pci, &dev->vdev); - qvirtio_set_driver(&qvirtio_pci, &dev->vdev); + qvirtio_reset(&dev->vdev); + qvirtio_set_acknowledge(&dev->vdev); + qvirtio_set_driver(&dev->vdev); - features = qvirtio_get_features(&qvirtio_pci, &dev->vdev); + features = qvirtio_get_features(&dev->vdev); features = features & VIRTIO_NET_F_MAC; - qvirtio_set_features(&qvirtio_pci, &dev->vdev, features); + qvirtio_set_features(&dev->vdev, features); - qvirtio_set_driver_ok(&qvirtio_pci, &dev->vdev); + qvirtio_set_driver_ok(&dev->vdev); } static void wait_for_fds(TestServer *s) @@ -847,24 +847,24 @@ static QVirtioPCIDevice *virtio_net_pci_init(QPCIBus *bus, int slot) g_assert_cmphex(dev->vdev.device_type, ==, VIRTIO_ID_NET); qvirtio_pci_device_enable(dev); - qvirtio_reset(&qvirtio_pci, &dev->vdev); - qvirtio_set_acknowledge(&qvirtio_pci, &dev->vdev); - qvirtio_set_driver(&qvirtio_pci, &dev->vdev); + qvirtio_reset(&dev->vdev); + qvirtio_set_acknowledge(&dev->vdev); + qvirtio_set_driver(&dev->vdev); return dev; } -static void driver_init(const QVirtioBus *bus, QVirtioDevice *dev) +static void driver_init(QVirtioDevice *dev) { uint32_t features; - features = qvirtio_get_features(bus, dev); + features = qvirtio_get_features(dev); features = features & ~(QVIRTIO_F_BAD_FEATURE | (1u << VIRTIO_RING_F_INDIRECT_DESC) | (1u << VIRTIO_RING_F_EVENT_IDX)); - qvirtio_set_features(bus, dev, features); + qvirtio_set_features(dev, features); - qvirtio_set_driver_ok(bus, dev); + qvirtio_set_driver_ok(dev); } #define PCI_SLOT 0x04 @@ -896,16 +896,15 @@ static void test_multiqueue(void) alloc = pc_alloc_init(); for (i = 0; i < queues * 2; i++) { - vq[i] = (QVirtQueuePCI *)qvirtqueue_setup(&qvirtio_pci, &dev->vdev, - alloc, i); + vq[i] = (QVirtQueuePCI *)qvirtqueue_setup(&dev->vdev, alloc, i); } - driver_init(&qvirtio_pci, &dev->vdev); + driver_init(&dev->vdev); wait_for_rings_started(s, queues * 2); /* End test */ for (i = 0; i < queues * 2; i++) { - qvirtqueue_cleanup(&qvirtio_pci, &vq[i]->vq, alloc); + qvirtqueue_cleanup(dev->vdev.bus, &vq[i]->vq, alloc); } pc_alloc_uninit(alloc); qvirtio_pci_device_disable(dev); diff --git a/tests/virtio-9p-test.c b/tests/virtio-9p-test.c index e8b21967d8..2341622a3b 100644 --- a/tests/virtio-9p-test.c +++ b/tests/virtio-9p-test.c @@ -71,17 +71,17 @@ static QVirtIO9P *qvirtio_9p_pci_init(void) v9p->dev = (QVirtioDevice *) dev; qvirtio_pci_device_enable(dev); - qvirtio_reset(&qvirtio_pci, v9p->dev); - qvirtio_set_acknowledge(&qvirtio_pci, v9p->dev); - qvirtio_set_driver(&qvirtio_pci, v9p->dev); + qvirtio_reset(v9p->dev); + qvirtio_set_acknowledge(v9p->dev); + qvirtio_set_driver(v9p->dev); - v9p->vq = qvirtqueue_setup(&qvirtio_pci, v9p->dev, v9p->alloc, 0); + v9p->vq = qvirtqueue_setup(v9p->dev, v9p->alloc, 0); return v9p; } static void qvirtio_9p_pci_free(QVirtIO9P *v9p) { - qvirtqueue_cleanup(&qvirtio_pci, v9p->vq, v9p->alloc); + qvirtqueue_cleanup(v9p->dev->bus, v9p->vq, v9p->alloc); pc_alloc_uninit(v9p->alloc); qvirtio_pci_device_disable(container_of(v9p->dev, QVirtioPCIDevice, vdev)); g_free(v9p->dev); @@ -101,15 +101,14 @@ static void pci_basic_config(void) v9p = qvirtio_9p_pci_init(); addr = ((QVirtioPCIDevice *) v9p->dev)->addr + VIRTIO_PCI_CONFIG_OFF(false); - tag_len = qvirtio_config_readw(&qvirtio_pci, v9p->dev, + tag_len = qvirtio_config_readw(v9p->dev, (uint64_t)(uintptr_t)addr); g_assert_cmpint(tag_len, ==, strlen(mount_tag)); addr += sizeof(uint16_t); tag = g_malloc(tag_len); for (i = 0; i < tag_len; i++) { - tag[i] = qvirtio_config_readb(&qvirtio_pci, v9p->dev, - (uint64_t)(uintptr_t)addr + i); + tag[i] = qvirtio_config_readb(v9p->dev, (uint64_t)(uintptr_t)addr + i); } g_assert_cmpmem(tag, tag_len, mount_tag, tag_len); g_free(tag); diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c index 0506917341..9a6f2cff97 100644 --- a/tests/virtio-blk-test.c +++ b/tests/virtio-blk-test.c @@ -110,9 +110,9 @@ static QVirtioPCIDevice *virtio_blk_pci_init(QPCIBus *bus, int slot) g_assert_cmphex(dev->pdev->devfn, ==, ((slot << 3) | PCI_FN)); qvirtio_pci_device_enable(dev); - qvirtio_reset(&qvirtio_pci, &dev->vdev); - qvirtio_set_acknowledge(&qvirtio_pci, &dev->vdev); - qvirtio_set_driver(&qvirtio_pci, &dev->vdev); + qvirtio_reset(&dev->vdev); + qvirtio_set_acknowledge(&dev->vdev); + qvirtio_set_driver(&dev->vdev); return dev; } @@ -150,8 +150,8 @@ static uint64_t virtio_blk_request(QGuestAllocator *alloc, QVirtioBlkReq *req, return addr; } -static void test_basic(const QVirtioBus *bus, QVirtioDevice *dev, - QGuestAllocator *alloc, QVirtQueue *vq, uint64_t device_specific) +static void test_basic(QVirtioDevice *dev, QGuestAllocator *alloc, + QVirtQueue *vq, uint64_t device_specific) { QVirtioBlkReq req; uint64_t req_addr; @@ -161,18 +161,18 @@ static void test_basic(const QVirtioBus *bus, QVirtioDevice *dev, uint8_t status; char *data; - capacity = qvirtio_config_readq(bus, dev, device_specific); + capacity = qvirtio_config_readq(dev, device_specific); g_assert_cmpint(capacity, ==, TEST_IMAGE_SIZE / 512); - features = qvirtio_get_features(bus, dev); + features = qvirtio_get_features(dev); features = features & ~(QVIRTIO_F_BAD_FEATURE | (1u << VIRTIO_RING_F_INDIRECT_DESC) | (1u << VIRTIO_RING_F_EVENT_IDX) | (1u << VIRTIO_BLK_F_SCSI)); - qvirtio_set_features(bus, dev, features); + qvirtio_set_features(dev, features); - qvirtio_set_driver_ok(bus, dev); + qvirtio_set_driver_ok(dev); /* Write and read with 3 descriptor layout */ /* Write request */ @@ -190,9 +190,9 @@ static void test_basic(const QVirtioBus *bus, QVirtioDevice *dev, qvirtqueue_add(vq, req_addr + 16, 512, false, true); qvirtqueue_add(vq, req_addr + 528, 1, true, false); - qvirtqueue_kick(bus, dev, vq, free_head); + qvirtqueue_kick(dev, vq, free_head); - qvirtio_wait_queue_isr(bus, dev, vq, QVIRTIO_BLK_TIMEOUT_US); + qvirtio_wait_queue_isr(dev, vq, QVIRTIO_BLK_TIMEOUT_US); status = readb(req_addr + 528); g_assert_cmpint(status, ==, 0); @@ -212,9 +212,9 @@ static void test_basic(const QVirtioBus *bus, QVirtioDevice *dev, qvirtqueue_add(vq, req_addr + 16, 512, true, true); qvirtqueue_add(vq, req_addr + 528, 1, true, false); - qvirtqueue_kick(bus, dev, vq, free_head); + qvirtqueue_kick(dev, vq, free_head); - qvirtio_wait_queue_isr(bus, dev, vq, QVIRTIO_BLK_TIMEOUT_US); + qvirtio_wait_queue_isr(dev, vq, QVIRTIO_BLK_TIMEOUT_US); status = readb(req_addr + 528); g_assert_cmpint(status, ==, 0); @@ -240,9 +240,9 @@ static void test_basic(const QVirtioBus *bus, QVirtioDevice *dev, free_head = qvirtqueue_add(vq, req_addr, 528, false, true); qvirtqueue_add(vq, req_addr + 528, 1, true, false); - qvirtqueue_kick(bus, dev, vq, free_head); + qvirtqueue_kick(dev, vq, free_head); - qvirtio_wait_queue_isr(bus, dev, vq, QVIRTIO_BLK_TIMEOUT_US); + qvirtio_wait_queue_isr(dev, vq, QVIRTIO_BLK_TIMEOUT_US); status = readb(req_addr + 528); g_assert_cmpint(status, ==, 0); @@ -261,9 +261,9 @@ static void test_basic(const QVirtioBus *bus, QVirtioDevice *dev, free_head = qvirtqueue_add(vq, req_addr, 16, false, true); qvirtqueue_add(vq, req_addr + 16, 513, true, false); - qvirtqueue_kick(bus, dev, vq, free_head); + qvirtqueue_kick(dev, vq, free_head); - qvirtio_wait_queue_isr(bus, dev, vq, QVIRTIO_BLK_TIMEOUT_US); + qvirtio_wait_queue_isr(dev, vq, QVIRTIO_BLK_TIMEOUT_US); status = readb(req_addr + 528); g_assert_cmpint(status, ==, 0); @@ -288,17 +288,15 @@ static void pci_basic(void) dev = virtio_blk_pci_init(bus, PCI_SLOT); alloc = pc_alloc_init(); - vqpci = (QVirtQueuePCI *)qvirtqueue_setup(&qvirtio_pci, &dev->vdev, - alloc, 0); + vqpci = (QVirtQueuePCI *)qvirtqueue_setup(&dev->vdev, alloc, 0); /* MSI-X is not enabled */ addr = dev->addr + VIRTIO_PCI_CONFIG_OFF(false); - test_basic(&qvirtio_pci, &dev->vdev, alloc, &vqpci->vq, - (uint64_t)(uintptr_t)addr); + test_basic(&dev->vdev, alloc, &vqpci->vq, (uint64_t)(uintptr_t)addr); /* End test */ - qvirtqueue_cleanup(&qvirtio_pci, &vqpci->vq, alloc); + qvirtqueue_cleanup(dev->vdev.bus, &vqpci->vq, alloc); pc_alloc_uninit(alloc); qvirtio_pci_device_disable(dev); g_free(dev); @@ -329,21 +327,19 @@ static void pci_indirect(void) /* MSI-X is not enabled */ addr = dev->addr + VIRTIO_PCI_CONFIG_OFF(false); - capacity = qvirtio_config_readq(&qvirtio_pci, &dev->vdev, - (uint64_t)(uintptr_t)addr); + capacity = qvirtio_config_readq(&dev->vdev, (uint64_t)(uintptr_t)addr); g_assert_cmpint(capacity, ==, TEST_IMAGE_SIZE / 512); - features = qvirtio_get_features(&qvirtio_pci, &dev->vdev); + features = qvirtio_get_features(&dev->vdev); g_assert_cmphex(features & (1u << VIRTIO_RING_F_INDIRECT_DESC), !=, 0); features = features & ~(QVIRTIO_F_BAD_FEATURE | (1u << VIRTIO_RING_F_EVENT_IDX) | (1u << VIRTIO_BLK_F_SCSI)); - qvirtio_set_features(&qvirtio_pci, &dev->vdev, features); + qvirtio_set_features(&dev->vdev, features); alloc = pc_alloc_init(); - vqpci = (QVirtQueuePCI *)qvirtqueue_setup(&qvirtio_pci, &dev->vdev, - alloc, 0); - qvirtio_set_driver_ok(&qvirtio_pci, &dev->vdev); + vqpci = (QVirtQueuePCI *)qvirtqueue_setup(&dev->vdev, alloc, 0); + qvirtio_set_driver_ok(&dev->vdev); /* Write request */ req.type = VIRTIO_BLK_T_OUT; @@ -360,9 +356,9 @@ static void pci_indirect(void) qvring_indirect_desc_add(indirect, req_addr, 528, false); qvring_indirect_desc_add(indirect, req_addr + 528, 1, true); free_head = qvirtqueue_add_indirect(&vqpci->vq, indirect); - qvirtqueue_kick(&qvirtio_pci, &dev->vdev, &vqpci->vq, free_head); + qvirtqueue_kick(&dev->vdev, &vqpci->vq, free_head); - qvirtio_wait_queue_isr(&qvirtio_pci, &dev->vdev, &vqpci->vq, + qvirtio_wait_queue_isr(&dev->vdev, &vqpci->vq, QVIRTIO_BLK_TIMEOUT_US); status = readb(req_addr + 528); g_assert_cmpint(status, ==, 0); @@ -385,9 +381,9 @@ static void pci_indirect(void) qvring_indirect_desc_add(indirect, req_addr, 16, false); qvring_indirect_desc_add(indirect, req_addr + 16, 513, true); free_head = qvirtqueue_add_indirect(&vqpci->vq, indirect); - qvirtqueue_kick(&qvirtio_pci, &dev->vdev, &vqpci->vq, free_head); + qvirtqueue_kick(&dev->vdev, &vqpci->vq, free_head); - qvirtio_wait_queue_isr(&qvirtio_pci, &dev->vdev, &vqpci->vq, + qvirtio_wait_queue_isr(&dev->vdev, &vqpci->vq, QVIRTIO_BLK_TIMEOUT_US); status = readb(req_addr + 528); g_assert_cmpint(status, ==, 0); @@ -401,7 +397,7 @@ static void pci_indirect(void) guest_free(alloc, req_addr); /* End test */ - qvirtqueue_cleanup(&qvirtio_pci, &vqpci->vq, alloc); + qvirtqueue_cleanup(dev->vdev.bus, &vqpci->vq, alloc); pc_alloc_uninit(alloc); qvirtio_pci_device_disable(dev); g_free(dev); @@ -424,18 +420,16 @@ static void pci_config(void) /* MSI-X is not enabled */ addr = dev->addr + VIRTIO_PCI_CONFIG_OFF(false); - capacity = qvirtio_config_readq(&qvirtio_pci, &dev->vdev, - (uint64_t)(uintptr_t)addr); + capacity = qvirtio_config_readq(&dev->vdev, (uint64_t)(uintptr_t)addr); g_assert_cmpint(capacity, ==, TEST_IMAGE_SIZE / 512); - qvirtio_set_driver_ok(&qvirtio_pci, &dev->vdev); + qvirtio_set_driver_ok(&dev->vdev); qmp("{ 'execute': 'block_resize', 'arguments': { 'device': 'drive0', " " 'size': %d } }", n_size); - qvirtio_wait_config_isr(&qvirtio_pci, &dev->vdev, QVIRTIO_BLK_TIMEOUT_US); + qvirtio_wait_config_isr(&dev->vdev, QVIRTIO_BLK_TIMEOUT_US); - capacity = qvirtio_config_readq(&qvirtio_pci, &dev->vdev, - (uint64_t)(uintptr_t)addr); + capacity = qvirtio_config_readq(&dev->vdev, (uint64_t)(uintptr_t)addr); g_assert_cmpint(capacity, ==, n_size / 512); qvirtio_pci_device_disable(dev); @@ -471,30 +465,27 @@ static void pci_msix(void) /* MSI-X is enabled */ addr = dev->addr + VIRTIO_PCI_CONFIG_OFF(true); - capacity = qvirtio_config_readq(&qvirtio_pci, &dev->vdev, - (uint64_t)(uintptr_t)addr); + capacity = qvirtio_config_readq(&dev->vdev, (uint64_t)(uintptr_t)addr); g_assert_cmpint(capacity, ==, TEST_IMAGE_SIZE / 512); - features = qvirtio_get_features(&qvirtio_pci, &dev->vdev); + features = qvirtio_get_features(&dev->vdev); features = features & ~(QVIRTIO_F_BAD_FEATURE | (1u << VIRTIO_RING_F_INDIRECT_DESC) | (1u << VIRTIO_RING_F_EVENT_IDX) | (1u << VIRTIO_BLK_F_SCSI)); - qvirtio_set_features(&qvirtio_pci, &dev->vdev, features); + qvirtio_set_features(&dev->vdev, features); - vqpci = (QVirtQueuePCI *)qvirtqueue_setup(&qvirtio_pci, &dev->vdev, - alloc, 0); + vqpci = (QVirtQueuePCI *)qvirtqueue_setup(&dev->vdev, alloc, 0); qvirtqueue_pci_msix_setup(dev, vqpci, alloc, 1); - qvirtio_set_driver_ok(&qvirtio_pci, &dev->vdev); + qvirtio_set_driver_ok(&dev->vdev); qmp("{ 'execute': 'block_resize', 'arguments': { 'device': 'drive0', " " 'size': %d } }", n_size); - qvirtio_wait_config_isr(&qvirtio_pci, &dev->vdev, QVIRTIO_BLK_TIMEOUT_US); + qvirtio_wait_config_isr(&dev->vdev, QVIRTIO_BLK_TIMEOUT_US); - capacity = qvirtio_config_readq(&qvirtio_pci, &dev->vdev, - (uint64_t)(uintptr_t)addr); + capacity = qvirtio_config_readq(&dev->vdev, (uintptr_t)addr); g_assert_cmpint(capacity, ==, n_size / 512); /* Write request */ @@ -511,9 +502,9 @@ static void pci_msix(void) free_head = qvirtqueue_add(&vqpci->vq, req_addr, 16, false, true); qvirtqueue_add(&vqpci->vq, req_addr + 16, 512, false, true); qvirtqueue_add(&vqpci->vq, req_addr + 528, 1, true, false); - qvirtqueue_kick(&qvirtio_pci, &dev->vdev, &vqpci->vq, free_head); + qvirtqueue_kick(&dev->vdev, &vqpci->vq, free_head); - qvirtio_wait_queue_isr(&qvirtio_pci, &dev->vdev, &vqpci->vq, + qvirtio_wait_queue_isr(&dev->vdev, &vqpci->vq, QVIRTIO_BLK_TIMEOUT_US); status = readb(req_addr + 528); @@ -535,10 +526,10 @@ static void pci_msix(void) qvirtqueue_add(&vqpci->vq, req_addr + 16, 512, true, true); qvirtqueue_add(&vqpci->vq, req_addr + 528, 1, true, false); - qvirtqueue_kick(&qvirtio_pci, &dev->vdev, &vqpci->vq, free_head); + qvirtqueue_kick(&dev->vdev, &vqpci->vq, free_head); - qvirtio_wait_queue_isr(&qvirtio_pci, &dev->vdev, &vqpci->vq, + qvirtio_wait_queue_isr(&dev->vdev, &vqpci->vq, QVIRTIO_BLK_TIMEOUT_US); status = readb(req_addr + 528); @@ -552,7 +543,7 @@ static void pci_msix(void) guest_free(alloc, req_addr); /* End test */ - qvirtqueue_cleanup(&qvirtio_pci, &vqpci->vq, alloc); + qvirtqueue_cleanup(dev->vdev.bus, &vqpci->vq, alloc); pc_alloc_uninit(alloc); qpci_msix_disable(dev->pdev); qvirtio_pci_device_disable(dev); @@ -587,22 +578,20 @@ static void pci_idx(void) /* MSI-X is enabled */ addr = dev->addr + VIRTIO_PCI_CONFIG_OFF(true); - capacity = qvirtio_config_readq(&qvirtio_pci, &dev->vdev, - (uint64_t)(uintptr_t)addr); + capacity = qvirtio_config_readq(&dev->vdev, (uint64_t)(uintptr_t)addr); g_assert_cmpint(capacity, ==, TEST_IMAGE_SIZE / 512); - features = qvirtio_get_features(&qvirtio_pci, &dev->vdev); + features = qvirtio_get_features(&dev->vdev); features = features & ~(QVIRTIO_F_BAD_FEATURE | (1u << VIRTIO_RING_F_INDIRECT_DESC) | (1u << VIRTIO_F_NOTIFY_ON_EMPTY) | (1u << VIRTIO_BLK_F_SCSI)); - qvirtio_set_features(&qvirtio_pci, &dev->vdev, features); + qvirtio_set_features(&dev->vdev, features); - vqpci = (QVirtQueuePCI *)qvirtqueue_setup(&qvirtio_pci, &dev->vdev, - alloc, 0); + vqpci = (QVirtQueuePCI *)qvirtqueue_setup(&dev->vdev, alloc, 0); qvirtqueue_pci_msix_setup(dev, vqpci, alloc, 1); - qvirtio_set_driver_ok(&qvirtio_pci, &dev->vdev); + qvirtio_set_driver_ok(&dev->vdev); /* Write request */ req.type = VIRTIO_BLK_T_OUT; @@ -618,10 +607,9 @@ static void pci_idx(void) free_head = qvirtqueue_add(&vqpci->vq, req_addr, 16, false, true); qvirtqueue_add(&vqpci->vq, req_addr + 16, 512, false, true); qvirtqueue_add(&vqpci->vq, req_addr + 528, 1, true, false); - qvirtqueue_kick(&qvirtio_pci, &dev->vdev, &vqpci->vq, free_head); + qvirtqueue_kick(&dev->vdev, &vqpci->vq, free_head); - qvirtio_wait_queue_isr(&qvirtio_pci, &dev->vdev, &vqpci->vq, - QVIRTIO_BLK_TIMEOUT_US); + qvirtio_wait_queue_isr(&dev->vdev, &vqpci->vq, QVIRTIO_BLK_TIMEOUT_US); /* Write request */ req.type = VIRTIO_BLK_T_OUT; @@ -639,10 +627,10 @@ static void pci_idx(void) free_head = qvirtqueue_add(&vqpci->vq, req_addr, 16, false, true); qvirtqueue_add(&vqpci->vq, req_addr + 16, 512, false, true); qvirtqueue_add(&vqpci->vq, req_addr + 528, 1, true, false); - qvirtqueue_kick(&qvirtio_pci, &dev->vdev, &vqpci->vq, free_head); + qvirtqueue_kick(&dev->vdev, &vqpci->vq, free_head); /* No notification expected */ - status = qvirtio_wait_status_byte_no_isr(&qvirtio_pci, &dev->vdev, + status = qvirtio_wait_status_byte_no_isr(&dev->vdev, &vqpci->vq, req_addr + 528, QVIRTIO_BLK_TIMEOUT_US); g_assert_cmpint(status, ==, 0); @@ -663,9 +651,9 @@ static void pci_idx(void) qvirtqueue_add(&vqpci->vq, req_addr + 16, 512, true, true); qvirtqueue_add(&vqpci->vq, req_addr + 528, 1, true, false); - qvirtqueue_kick(&qvirtio_pci, &dev->vdev, &vqpci->vq, free_head); + qvirtqueue_kick(&dev->vdev, &vqpci->vq, free_head); - qvirtio_wait_queue_isr(&qvirtio_pci, &dev->vdev, &vqpci->vq, + qvirtio_wait_queue_isr(&dev->vdev, &vqpci->vq, QVIRTIO_BLK_TIMEOUT_US); status = readb(req_addr + 528); @@ -679,7 +667,7 @@ static void pci_idx(void) guest_free(alloc, req_addr); /* End test */ - qvirtqueue_cleanup(&qvirtio_pci, &vqpci->vq, alloc); + qvirtqueue_cleanup(dev->vdev.bus, &vqpci->vq, alloc); pc_alloc_uninit(alloc); qpci_msix_disable(dev->pdev); qvirtio_pci_device_disable(dev); @@ -724,28 +712,25 @@ static void mmio_basic(void) g_assert(dev != NULL); g_assert_cmphex(dev->vdev.device_type, ==, VIRTIO_ID_BLOCK); - qvirtio_reset(&qvirtio_mmio, &dev->vdev); - qvirtio_set_acknowledge(&qvirtio_mmio, &dev->vdev); - qvirtio_set_driver(&qvirtio_mmio, &dev->vdev); + qvirtio_reset(&dev->vdev); + qvirtio_set_acknowledge(&dev->vdev); + qvirtio_set_driver(&dev->vdev); alloc = generic_alloc_init(MMIO_RAM_ADDR, MMIO_RAM_SIZE, MMIO_PAGE_SIZE); - vq = qvirtqueue_setup(&qvirtio_mmio, &dev->vdev, alloc, 0); + vq = qvirtqueue_setup(&dev->vdev, alloc, 0); - test_basic(&qvirtio_mmio, &dev->vdev, alloc, vq, - QVIRTIO_MMIO_DEVICE_SPECIFIC); + test_basic(&dev->vdev, alloc, vq, QVIRTIO_MMIO_DEVICE_SPECIFIC); qmp("{ 'execute': 'block_resize', 'arguments': { 'device': 'drive0', " " 'size': %d } }", n_size); - qvirtio_wait_queue_isr(&qvirtio_mmio, &dev->vdev, vq, - QVIRTIO_BLK_TIMEOUT_US); + qvirtio_wait_queue_isr(&dev->vdev, vq, QVIRTIO_BLK_TIMEOUT_US); - capacity = qvirtio_config_readq(&qvirtio_mmio, &dev->vdev, - QVIRTIO_MMIO_DEVICE_SPECIFIC); + capacity = qvirtio_config_readq(&dev->vdev, QVIRTIO_MMIO_DEVICE_SPECIFIC); g_assert_cmpint(capacity, ==, n_size / 512); /* End test */ - qvirtqueue_cleanup(&qvirtio_mmio, vq, alloc); + qvirtqueue_cleanup(dev->vdev.bus, vq, alloc); generic_alloc_uninit(alloc); g_free(dev); test_end(); diff --git a/tests/virtio-net-test.c b/tests/virtio-net-test.c index a343a6b048..6fa385e90e 100644 --- a/tests/virtio-net-test.c +++ b/tests/virtio-net-test.c @@ -46,9 +46,9 @@ static QVirtioPCIDevice *virtio_net_pci_init(QPCIBus *bus, int slot) g_assert_cmphex(dev->vdev.device_type, ==, VIRTIO_ID_NET); qvirtio_pci_device_enable(dev); - qvirtio_reset(&qvirtio_pci, &dev->vdev); - qvirtio_set_acknowledge(&qvirtio_pci, &dev->vdev); - qvirtio_set_driver(&qvirtio_pci, &dev->vdev); + qvirtio_reset(&dev->vdev); + qvirtio_set_acknowledge(&dev->vdev); + qvirtio_set_driver(&dev->vdev); return dev; } @@ -65,20 +65,20 @@ static QPCIBus *pci_test_start(int socket) return qpci_init_pc(NULL); } -static void driver_init(const QVirtioBus *bus, QVirtioDevice *dev) +static void driver_init(QVirtioDevice *dev) { uint32_t features; - features = qvirtio_get_features(bus, dev); + features = qvirtio_get_features(dev); features = features & ~(QVIRTIO_F_BAD_FEATURE | (1u << VIRTIO_RING_F_INDIRECT_DESC) | (1u << VIRTIO_RING_F_EVENT_IDX)); - qvirtio_set_features(bus, dev, features); + qvirtio_set_features(dev, features); - qvirtio_set_driver_ok(bus, dev); + qvirtio_set_driver_ok(dev); } -static void rx_test(const QVirtioBus *bus, QVirtioDevice *dev, +static void rx_test(QVirtioDevice *dev, QGuestAllocator *alloc, QVirtQueue *vq, int socket) { @@ -101,19 +101,19 @@ static void rx_test(const QVirtioBus *bus, QVirtioDevice *dev, req_addr = guest_alloc(alloc, 64); free_head = qvirtqueue_add(vq, req_addr, 64, true, false); - qvirtqueue_kick(bus, dev, vq, free_head); + qvirtqueue_kick(dev, vq, free_head); ret = iov_send(socket, iov, 2, 0, sizeof(len) + sizeof(test)); g_assert_cmpint(ret, ==, sizeof(test) + sizeof(len)); - qvirtio_wait_queue_isr(bus, dev, vq, QVIRTIO_NET_TIMEOUT_US); + qvirtio_wait_queue_isr(dev, vq, QVIRTIO_NET_TIMEOUT_US); memread(req_addr + VNET_HDR_SIZE, buffer, sizeof(test)); g_assert_cmpstr(buffer, ==, "TEST"); guest_free(alloc, req_addr); } -static void tx_test(const QVirtioBus *bus, QVirtioDevice *dev, +static void tx_test(QVirtioDevice *dev, QGuestAllocator *alloc, QVirtQueue *vq, int socket) { @@ -127,9 +127,9 @@ static void tx_test(const QVirtioBus *bus, QVirtioDevice *dev, memwrite(req_addr + VNET_HDR_SIZE, "TEST", 4); free_head = qvirtqueue_add(vq, req_addr, 64, false, false); - qvirtqueue_kick(bus, dev, vq, free_head); + qvirtqueue_kick(dev, vq, free_head); - qvirtio_wait_queue_isr(bus, dev, vq, QVIRTIO_NET_TIMEOUT_US); + qvirtio_wait_queue_isr(dev, vq, QVIRTIO_NET_TIMEOUT_US); guest_free(alloc, req_addr); ret = qemu_recv(socket, &len, sizeof(len), 0); @@ -140,7 +140,7 @@ static void tx_test(const QVirtioBus *bus, QVirtioDevice *dev, g_assert_cmpstr(buffer, ==, "TEST"); } -static void rx_stop_cont_test(const QVirtioBus *bus, QVirtioDevice *dev, +static void rx_stop_cont_test(QVirtioDevice *dev, QGuestAllocator *alloc, QVirtQueue *vq, int socket) { @@ -164,7 +164,7 @@ static void rx_stop_cont_test(const QVirtioBus *bus, QVirtioDevice *dev, req_addr = guest_alloc(alloc, 64); free_head = qvirtqueue_add(vq, req_addr, 64, true, false); - qvirtqueue_kick(bus, dev, vq, free_head); + qvirtqueue_kick(dev, vq, free_head); rsp = qmp("{ 'execute' : 'stop'}"); QDECREF(rsp); @@ -180,26 +180,26 @@ static void rx_stop_cont_test(const QVirtioBus *bus, QVirtioDevice *dev, rsp = qmp("{ 'execute' : 'cont'}"); QDECREF(rsp); - qvirtio_wait_queue_isr(bus, dev, vq, QVIRTIO_NET_TIMEOUT_US); + qvirtio_wait_queue_isr(dev, vq, QVIRTIO_NET_TIMEOUT_US); memread(req_addr + VNET_HDR_SIZE, buffer, sizeof(test)); g_assert_cmpstr(buffer, ==, "TEST"); guest_free(alloc, req_addr); } -static void send_recv_test(const QVirtioBus *bus, QVirtioDevice *dev, +static void send_recv_test(QVirtioDevice *dev, QGuestAllocator *alloc, QVirtQueue *rvq, QVirtQueue *tvq, int socket) { - rx_test(bus, dev, alloc, rvq, socket); - tx_test(bus, dev, alloc, tvq, socket); + rx_test(dev, alloc, rvq, socket); + tx_test(dev, alloc, tvq, socket); } -static void stop_cont_test(const QVirtioBus *bus, QVirtioDevice *dev, +static void stop_cont_test(QVirtioDevice *dev, QGuestAllocator *alloc, QVirtQueue *rvq, QVirtQueue *tvq, int socket) { - rx_stop_cont_test(bus, dev, alloc, rvq, socket); + rx_stop_cont_test(dev, alloc, rvq, socket); } static void pci_basic(gconstpointer data) @@ -208,8 +208,7 @@ static void pci_basic(gconstpointer data) QPCIBus *bus; QVirtQueuePCI *tx, *rx; QGuestAllocator *alloc; - void (*func) (const QVirtioBus *bus, - QVirtioDevice *dev, + void (*func) (QVirtioDevice *dev, QGuestAllocator *alloc, QVirtQueue *rvq, QVirtQueue *tvq, @@ -223,18 +222,16 @@ static void pci_basic(gconstpointer data) dev = virtio_net_pci_init(bus, PCI_SLOT); alloc = pc_alloc_init(); - rx = (QVirtQueuePCI *)qvirtqueue_setup(&qvirtio_pci, &dev->vdev, - alloc, 0); - tx = (QVirtQueuePCI *)qvirtqueue_setup(&qvirtio_pci, &dev->vdev, - alloc, 1); + rx = (QVirtQueuePCI *)qvirtqueue_setup(&dev->vdev, alloc, 0); + tx = (QVirtQueuePCI *)qvirtqueue_setup(&dev->vdev, alloc, 1); - driver_init(&qvirtio_pci, &dev->vdev); - func(&qvirtio_pci, &dev->vdev, alloc, &rx->vq, &tx->vq, sv[0]); + driver_init(&dev->vdev); + func(&dev->vdev, alloc, &rx->vq, &tx->vq, sv[0]); /* End test */ close(sv[0]); - qvirtqueue_cleanup(&qvirtio_pci, &tx->vq, alloc); - qvirtqueue_cleanup(&qvirtio_pci, &rx->vq, alloc); + qvirtqueue_cleanup(dev->vdev.bus, &tx->vq, alloc); + qvirtqueue_cleanup(dev->vdev.bus, &rx->vq, alloc); pc_alloc_uninit(alloc); qvirtio_pci_device_disable(dev); g_free(dev->pdev); diff --git a/tests/virtio-scsi-test.c b/tests/virtio-scsi-test.c index 94d75b1493..3dbec2f5f0 100644 --- a/tests/virtio-scsi-test.c +++ b/tests/virtio-scsi-test.c @@ -58,7 +58,7 @@ static void qvirtio_scsi_pci_free(QVirtIOSCSI *vs) int i; for (i = 0; i < vs->num_queues + 2; i++) { - qvirtqueue_cleanup(&qvirtio_pci, vs->vq[i], vs->alloc); + qvirtqueue_cleanup(vs->dev->bus, vs->vq[i], vs->alloc); } pc_alloc_uninit(vs->alloc); qvirtio_pci_device_disable(container_of(vs->dev, QVirtioPCIDevice, vdev)); @@ -119,8 +119,8 @@ static uint8_t virtio_scsi_do_command(QVirtIOSCSI *vs, const uint8_t *cdb, qvirtqueue_add(vq, data_in_addr, data_in_len, true, false); } - qvirtqueue_kick(&qvirtio_pci, vs->dev, vq, free_head); - qvirtio_wait_queue_isr(&qvirtio_pci, vs->dev, vq, QVIRTIO_SCSI_TIMEOUT_US); + qvirtqueue_kick(vs->dev, vq, free_head); + qvirtio_wait_queue_isr(vs->dev, vq, QVIRTIO_SCSI_TIMEOUT_US); response = readb(resp_addr + offsetof(struct virtio_scsi_cmd_resp, response)); @@ -155,18 +155,17 @@ static QVirtIOSCSI *qvirtio_scsi_pci_init(int slot) g_assert_cmphex(vs->dev->device_type, ==, VIRTIO_ID_SCSI); qvirtio_pci_device_enable(dev); - qvirtio_reset(&qvirtio_pci, vs->dev); - qvirtio_set_acknowledge(&qvirtio_pci, vs->dev); - qvirtio_set_driver(&qvirtio_pci, vs->dev); + qvirtio_reset(vs->dev); + qvirtio_set_acknowledge(vs->dev); + qvirtio_set_driver(vs->dev); addr = dev->addr + VIRTIO_PCI_CONFIG_OFF(false); - vs->num_queues = qvirtio_config_readl(&qvirtio_pci, vs->dev, - (uint64_t)(uintptr_t)addr); + vs->num_queues = qvirtio_config_readl(vs->dev, (uint64_t)(uintptr_t)addr); g_assert_cmpint(vs->num_queues, <, MAX_NUM_QUEUES); for (i = 0; i < vs->num_queues + 2; i++) { - vs->vq[i] = qvirtqueue_setup(&qvirtio_pci, vs->dev, vs->alloc, i); + vs->vq[i] = qvirtqueue_setup(vs->dev, vs->alloc, i); } /* Clear the POWER ON OCCURRED unit attention */ From 8b4b80c37630e976f2dd02a7d42bd9bea1ce676e Mon Sep 17 00:00:00 2001 From: Laurent Vivier Date: Mon, 17 Oct 2016 12:30:22 +0200 Subject: [PATCH 06/73] tests: rename target_big_endian() as qvirtio_is_big_endian() Move the definition to libqos/virtio.h as it must be used only with virtio functions. Add a QVirtioDevice parameter as it will be needed to know if the virtio device is using virtio 1.0 specification and thus is always little-endian (to do) Signed-off-by: Laurent Vivier Reviewed-by: Greg Kurz Reviewed-by: Thomas Huth Signed-off-by: David Gibson --- tests/libqos/virtio-pci.c | 2 +- tests/libqos/virtio.h | 6 ++++++ tests/libqtest.h | 10 ---------- tests/virtio-blk-test.c | 36 ++++++++++++++++++------------------ 4 files changed, 25 insertions(+), 29 deletions(-) diff --git a/tests/libqos/virtio-pci.c b/tests/libqos/virtio-pci.c index bbfed58dcf..7aa29b1a9c 100644 --- a/tests/libqos/virtio-pci.c +++ b/tests/libqos/virtio-pci.c @@ -86,7 +86,7 @@ static uint64_t qvirtio_pci_config_readq(QVirtioDevice *d, uint64_t addr) int i; uint64_t u64 = 0; - if (target_big_endian()) { + if (qvirtio_is_big_endian(d)) { for (i = 0; i < 8; ++i) { u64 |= (uint64_t)qpci_io_readb(dev->pdev, (void *)(uintptr_t)addr + i) << (7 - i) * 8; diff --git a/tests/libqos/virtio.h b/tests/libqos/virtio.h index ac4669a11b..3397a080e9 100644 --- a/tests/libqos/virtio.h +++ b/tests/libqos/virtio.h @@ -89,6 +89,12 @@ struct QVirtioBus { void (*virtqueue_kick)(QVirtioDevice *d, QVirtQueue *vq); }; +static inline bool qvirtio_is_big_endian(QVirtioDevice *d) +{ + /* FIXME: virtio 1.0 is always little-endian */ + return qtest_big_endian(global_qtest); +} + static inline uint32_t qvring_size(uint32_t num, uint32_t align) { return ((sizeof(struct vring_desc) * num + sizeof(uint16_t) * (3 + num) diff --git a/tests/libqtest.h b/tests/libqtest.h index 4be1f77877..0224f06d65 100644 --- a/tests/libqtest.h +++ b/tests/libqtest.h @@ -881,16 +881,6 @@ static inline int64_t clock_set(int64_t val) return qtest_clock_set(global_qtest, val); } -/** - * target_big_endian: - * - * Returns: True if the architecture under test has a big endian configuration. - */ -static inline bool target_big_endian(void) -{ - return qtest_big_endian(global_qtest); -} - QDict *qmp_fd_receive(int fd); void qmp_fd_sendv(int fd, const char *fmt, va_list ap); void qmp_fd_send(int fd, const char *fmt, ...); diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c index 9a6f2cff97..79e21c5daa 100644 --- a/tests/virtio-blk-test.c +++ b/tests/virtio-blk-test.c @@ -117,23 +117,23 @@ static QVirtioPCIDevice *virtio_blk_pci_init(QPCIBus *bus, int slot) return dev; } -static inline void virtio_blk_fix_request(QVirtioBlkReq *req) +static inline void virtio_blk_fix_request(QVirtioDevice *d, QVirtioBlkReq *req) { #ifdef HOST_WORDS_BIGENDIAN - bool host_endian = true; + const bool host_is_big_endian = true; #else - bool host_endian = false; + const bool host_is_big_endian = false; #endif - if (target_big_endian() != host_endian) { + if (qvirtio_is_big_endian(d) != host_is_big_endian) { req->type = bswap32(req->type); req->ioprio = bswap32(req->ioprio); req->sector = bswap64(req->sector); } } -static uint64_t virtio_blk_request(QGuestAllocator *alloc, QVirtioBlkReq *req, - uint64_t data_size) +static uint64_t virtio_blk_request(QGuestAllocator *alloc, QVirtioDevice *d, + QVirtioBlkReq *req, uint64_t data_size) { uint64_t addr; uint8_t status = 0xFF; @@ -141,7 +141,7 @@ static uint64_t virtio_blk_request(QGuestAllocator *alloc, QVirtioBlkReq *req, g_assert_cmpuint(data_size % 512, ==, 0); addr = guest_alloc(alloc, sizeof(*req) + data_size); - virtio_blk_fix_request(req); + virtio_blk_fix_request(d, req); memwrite(addr, req, 16); memwrite(addr + 16, req->data, data_size); @@ -182,7 +182,7 @@ static void test_basic(QVirtioDevice *dev, QGuestAllocator *alloc, req.data = g_malloc0(512); strcpy(req.data, "TEST"); - req_addr = virtio_blk_request(alloc, &req, 512); + req_addr = virtio_blk_request(alloc, dev, &req, 512); g_free(req.data); @@ -204,7 +204,7 @@ static void test_basic(QVirtioDevice *dev, QGuestAllocator *alloc, req.sector = 0; req.data = g_malloc0(512); - req_addr = virtio_blk_request(alloc, &req, 512); + req_addr = virtio_blk_request(alloc, dev, &req, 512); g_free(req.data); @@ -234,7 +234,7 @@ static void test_basic(QVirtioDevice *dev, QGuestAllocator *alloc, req.data = g_malloc0(512); strcpy(req.data, "TEST"); - req_addr = virtio_blk_request(alloc, &req, 512); + req_addr = virtio_blk_request(alloc, dev, &req, 512); g_free(req.data); @@ -254,7 +254,7 @@ static void test_basic(QVirtioDevice *dev, QGuestAllocator *alloc, req.sector = 1; req.data = g_malloc0(512); - req_addr = virtio_blk_request(alloc, &req, 512); + req_addr = virtio_blk_request(alloc, dev, &req, 512); g_free(req.data); @@ -348,7 +348,7 @@ static void pci_indirect(void) req.data = g_malloc0(512); strcpy(req.data, "TEST"); - req_addr = virtio_blk_request(alloc, &req, 512); + req_addr = virtio_blk_request(alloc, &dev->vdev, &req, 512); g_free(req.data); @@ -373,7 +373,7 @@ static void pci_indirect(void) req.data = g_malloc0(512); strcpy(req.data, "TEST"); - req_addr = virtio_blk_request(alloc, &req, 512); + req_addr = virtio_blk_request(alloc, &dev->vdev, &req, 512); g_free(req.data); @@ -495,7 +495,7 @@ static void pci_msix(void) req.data = g_malloc0(512); strcpy(req.data, "TEST"); - req_addr = virtio_blk_request(alloc, &req, 512); + req_addr = virtio_blk_request(alloc, &dev->vdev, &req, 512); g_free(req.data); @@ -518,7 +518,7 @@ static void pci_msix(void) req.sector = 0; req.data = g_malloc0(512); - req_addr = virtio_blk_request(alloc, &req, 512); + req_addr = virtio_blk_request(alloc, &dev->vdev, &req, 512); g_free(req.data); @@ -600,7 +600,7 @@ static void pci_idx(void) req.data = g_malloc0(512); strcpy(req.data, "TEST"); - req_addr = virtio_blk_request(alloc, &req, 512); + req_addr = virtio_blk_request(alloc, &dev->vdev, &req, 512); g_free(req.data); @@ -618,7 +618,7 @@ static void pci_idx(void) req.data = g_malloc0(512); strcpy(req.data, "TEST"); - req_addr = virtio_blk_request(alloc, &req, 512); + req_addr = virtio_blk_request(alloc, &dev->vdev, &req, 512); g_free(req.data); @@ -643,7 +643,7 @@ static void pci_idx(void) req.sector = 1; req.data = g_malloc0(512); - req_addr = virtio_blk_request(alloc, &req, 512); + req_addr = virtio_blk_request(alloc, &dev->vdev, &req, 512); g_free(req.data); From a980f7f2c2f4d7e9a1eba4f804cd66dbd458b6d4 Mon Sep 17 00:00:00 2001 From: Laurent Vivier Date: Mon, 17 Oct 2016 12:30:23 +0200 Subject: [PATCH 07/73] tests: use qtest_pc_boot()/qtest_shutdown() in virtio tests This patch replaces calls to qtest_start() and qtest_end() by calls to qtest_pc_boot() and qtest_shutdown(). This allows to initialize memory allocator and PCI interface functions. This will ease to enable virtio tests on other architectures by only adding a specific qtest_XXX_boot() (like qtest_spapr_boot()). Signed-off-by: Laurent Vivier Reviewed-by: Greg Kurz Signed-off-by: David Gibson --- tests/virtio-9p-test.c | 50 ++++++------- tests/virtio-blk-test.c | 148 +++++++++++++++++---------------------- tests/virtio-net-test.c | 39 ++++------- tests/virtio-scsi-test.c | 65 ++++++++--------- 4 files changed, 127 insertions(+), 175 deletions(-) diff --git a/tests/virtio-9p-test.c b/tests/virtio-9p-test.c index 2341622a3b..851ec99404 100644 --- a/tests/virtio-9p-test.c +++ b/tests/virtio-9p-test.c @@ -10,62 +10,57 @@ #include "qemu/osdep.h" #include "libqtest.h" #include "qemu-common.h" -#include "libqos/pci-pc.h" +#include "libqos/libqos-pc.h" #include "libqos/virtio.h" #include "libqos/virtio-pci.h" -#include "libqos/malloc.h" -#include "libqos/malloc-pc.h" #include "standard-headers/linux/virtio_ids.h" #include "standard-headers/linux/virtio_pci.h" static const char mount_tag[] = "qtest"; static char *test_share; -static void qvirtio_9p_start(void) + +static QOSState *qvirtio_9p_start(void) { - char *args; + const char *cmd = "-fsdev local,id=fsdev0,security_model=none,path=%s " + "-device virtio-9p-pci,fsdev=fsdev0,mount_tag=%s"; test_share = g_strdup("/tmp/qtest.XXXXXX"); g_assert_nonnull(mkdtemp(test_share)); - args = g_strdup_printf("-fsdev local,id=fsdev0,security_model=none,path=%s " - "-device virtio-9p-pci,fsdev=fsdev0,mount_tag=%s", - test_share, mount_tag); - - qtest_start(args); - g_free(args); + return qtest_pc_boot(cmd, test_share, mount_tag); } -static void qvirtio_9p_stop(void) +static void qvirtio_9p_stop(QOSState *qs) { - qtest_end(); + qtest_shutdown(qs); rmdir(test_share); g_free(test_share); } static void pci_nop(void) { - qvirtio_9p_start(); - qvirtio_9p_stop(); + QOSState *qs; + + qs = qvirtio_9p_start(); + qvirtio_9p_stop(qs); } typedef struct { QVirtioDevice *dev; - QGuestAllocator *alloc; - QPCIBus *bus; + QOSState *qs; QVirtQueue *vq; } QVirtIO9P; -static QVirtIO9P *qvirtio_9p_pci_init(void) +static QVirtIO9P *qvirtio_9p_pci_init(QOSState *qs) { QVirtIO9P *v9p; QVirtioPCIDevice *dev; v9p = g_new0(QVirtIO9P, 1); - v9p->alloc = pc_alloc_init(); - v9p->bus = qpci_init_pc(NULL); - dev = qvirtio_pci_device_find(v9p->bus, VIRTIO_ID_9P); + v9p->qs = qs; + dev = qvirtio_pci_device_find(v9p->qs->pcibus, VIRTIO_ID_9P); g_assert_nonnull(dev); g_assert_cmphex(dev->vdev.device_type, ==, VIRTIO_ID_9P); v9p->dev = (QVirtioDevice *) dev; @@ -75,17 +70,15 @@ static QVirtIO9P *qvirtio_9p_pci_init(void) qvirtio_set_acknowledge(v9p->dev); qvirtio_set_driver(v9p->dev); - v9p->vq = qvirtqueue_setup(v9p->dev, v9p->alloc, 0); + v9p->vq = qvirtqueue_setup(v9p->dev, v9p->qs->alloc, 0); return v9p; } static void qvirtio_9p_pci_free(QVirtIO9P *v9p) { - qvirtqueue_cleanup(v9p->dev->bus, v9p->vq, v9p->alloc); - pc_alloc_uninit(v9p->alloc); + qvirtqueue_cleanup(v9p->dev->bus, v9p->vq, v9p->qs->alloc); qvirtio_pci_device_disable(container_of(v9p->dev, QVirtioPCIDevice, vdev)); g_free(v9p->dev); - qpci_free_pc(v9p->bus); g_free(v9p); } @@ -96,9 +89,10 @@ static void pci_basic_config(void) size_t tag_len; char *tag; int i; + QOSState *qs; - qvirtio_9p_start(); - v9p = qvirtio_9p_pci_init(); + qs = qvirtio_9p_start(); + v9p = qvirtio_9p_pci_init(qs); addr = ((QVirtioPCIDevice *) v9p->dev)->addr + VIRTIO_PCI_CONFIG_OFF(false); tag_len = qvirtio_config_readw(v9p->dev, @@ -114,7 +108,7 @@ static void pci_basic_config(void) g_free(tag); qvirtio_9p_pci_free(v9p); - qvirtio_9p_stop(); + qvirtio_9p_stop(qs); } int main(int argc, char **argv) diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c index 79e21c5daa..2382eb5cc1 100644 --- a/tests/virtio-blk-test.c +++ b/tests/virtio-blk-test.c @@ -10,12 +10,10 @@ #include "qemu/osdep.h" #include "libqtest.h" +#include "libqos/libqos-pc.h" #include "libqos/virtio.h" #include "libqos/virtio-pci.h" #include "libqos/virtio-mmio.h" -#include "libqos/pci-pc.h" -#include "libqos/malloc.h" -#include "libqos/malloc-pc.h" #include "libqos/malloc-generic.h" #include "qemu/bswap.h" #include "standard-headers/linux/virtio_ids.h" @@ -58,24 +56,21 @@ static char *drive_create(void) return tmp_path; } -static QPCIBus *pci_test_start(void) +static QOSState *pci_test_start(void) { - char *cmdline; + QOSState *qs; char *tmp_path; + const char *cmd = "-drive if=none,id=drive0,file=%s,format=raw " + "-drive if=none,id=drive1,file=/dev/null,format=raw " + "-device virtio-blk-pci,id=drv0,drive=drive0," + "addr=%x.%x"; tmp_path = drive_create(); - cmdline = g_strdup_printf("-drive if=none,id=drive0,file=%s,format=raw " - "-drive if=none,id=drive1,file=/dev/null,format=raw " - "-device virtio-blk-pci,id=drv0,drive=drive0," - "addr=%x.%x", - tmp_path, PCI_SLOT, PCI_FN); - qtest_start(cmdline); + qs = qtest_pc_boot(cmd, tmp_path, PCI_SLOT, PCI_FN); unlink(tmp_path); g_free(tmp_path); - g_free(cmdline); - - return qpci_init_pc(NULL); + return qs; } static void arm_test_start(void) @@ -279,37 +274,32 @@ static void test_basic(QVirtioDevice *dev, QGuestAllocator *alloc, static void pci_basic(void) { QVirtioPCIDevice *dev; - QPCIBus *bus; + QOSState *qs; QVirtQueuePCI *vqpci; - QGuestAllocator *alloc; void *addr; - bus = pci_test_start(); - dev = virtio_blk_pci_init(bus, PCI_SLOT); + qs = pci_test_start(); + dev = virtio_blk_pci_init(qs->pcibus, PCI_SLOT); - alloc = pc_alloc_init(); - vqpci = (QVirtQueuePCI *)qvirtqueue_setup(&dev->vdev, alloc, 0); + vqpci = (QVirtQueuePCI *)qvirtqueue_setup(&dev->vdev, qs->alloc, 0); /* MSI-X is not enabled */ addr = dev->addr + VIRTIO_PCI_CONFIG_OFF(false); - test_basic(&dev->vdev, alloc, &vqpci->vq, (uint64_t)(uintptr_t)addr); + test_basic(&dev->vdev, qs->alloc, &vqpci->vq, (uint64_t)(uintptr_t)addr); /* End test */ - qvirtqueue_cleanup(dev->vdev.bus, &vqpci->vq, alloc); - pc_alloc_uninit(alloc); + qvirtqueue_cleanup(dev->vdev.bus, &vqpci->vq, qs->alloc); qvirtio_pci_device_disable(dev); g_free(dev); - qpci_free_pc(bus); - test_end(); + qtest_shutdown(qs); } static void pci_indirect(void) { QVirtioPCIDevice *dev; - QPCIBus *bus; QVirtQueuePCI *vqpci; - QGuestAllocator *alloc; + QOSState *qs; QVirtioBlkReq req; QVRingIndirectDesc *indirect; void *addr; @@ -320,9 +310,9 @@ static void pci_indirect(void) uint8_t status; char *data; - bus = pci_test_start(); + qs = pci_test_start(); - dev = virtio_blk_pci_init(bus, PCI_SLOT); + dev = virtio_blk_pci_init(qs->pcibus, PCI_SLOT); /* MSI-X is not enabled */ addr = dev->addr + VIRTIO_PCI_CONFIG_OFF(false); @@ -337,8 +327,7 @@ static void pci_indirect(void) (1u << VIRTIO_BLK_F_SCSI)); qvirtio_set_features(&dev->vdev, features); - alloc = pc_alloc_init(); - vqpci = (QVirtQueuePCI *)qvirtqueue_setup(&dev->vdev, alloc, 0); + vqpci = (QVirtQueuePCI *)qvirtqueue_setup(&dev->vdev, qs->alloc, 0); qvirtio_set_driver_ok(&dev->vdev); /* Write request */ @@ -348,11 +337,11 @@ static void pci_indirect(void) req.data = g_malloc0(512); strcpy(req.data, "TEST"); - req_addr = virtio_blk_request(alloc, &dev->vdev, &req, 512); + req_addr = virtio_blk_request(qs->alloc, &dev->vdev, &req, 512); g_free(req.data); - indirect = qvring_indirect_desc_setup(&dev->vdev, alloc, 2); + indirect = qvring_indirect_desc_setup(&dev->vdev, qs->alloc, 2); qvring_indirect_desc_add(indirect, req_addr, 528, false); qvring_indirect_desc_add(indirect, req_addr + 528, 1, true); free_head = qvirtqueue_add_indirect(&vqpci->vq, indirect); @@ -364,7 +353,7 @@ static void pci_indirect(void) g_assert_cmpint(status, ==, 0); g_free(indirect); - guest_free(alloc, req_addr); + guest_free(qs->alloc, req_addr); /* Read request */ req.type = VIRTIO_BLK_T_IN; @@ -373,11 +362,11 @@ static void pci_indirect(void) req.data = g_malloc0(512); strcpy(req.data, "TEST"); - req_addr = virtio_blk_request(alloc, &dev->vdev, &req, 512); + req_addr = virtio_blk_request(qs->alloc, &dev->vdev, &req, 512); g_free(req.data); - indirect = qvring_indirect_desc_setup(&dev->vdev, alloc, 2); + indirect = qvring_indirect_desc_setup(&dev->vdev, qs->alloc, 2); qvring_indirect_desc_add(indirect, req_addr, 16, false); qvring_indirect_desc_add(indirect, req_addr + 16, 513, true); free_head = qvirtqueue_add_indirect(&vqpci->vq, indirect); @@ -394,28 +383,26 @@ static void pci_indirect(void) g_free(data); g_free(indirect); - guest_free(alloc, req_addr); + guest_free(qs->alloc, req_addr); /* End test */ - qvirtqueue_cleanup(dev->vdev.bus, &vqpci->vq, alloc); - pc_alloc_uninit(alloc); + qvirtqueue_cleanup(dev->vdev.bus, &vqpci->vq, qs->alloc); qvirtio_pci_device_disable(dev); g_free(dev); - qpci_free_pc(bus); - test_end(); + qtest_shutdown(qs); } static void pci_config(void) { QVirtioPCIDevice *dev; - QPCIBus *bus; + QOSState *qs; int n_size = TEST_IMAGE_SIZE / 2; void *addr; uint64_t capacity; - bus = pci_test_start(); + qs = pci_test_start(); - dev = virtio_blk_pci_init(bus, PCI_SLOT); + dev = virtio_blk_pci_init(qs->pcibus, PCI_SLOT); /* MSI-X is not enabled */ addr = dev->addr + VIRTIO_PCI_CONFIG_OFF(false); @@ -434,16 +421,15 @@ static void pci_config(void) qvirtio_pci_device_disable(dev); g_free(dev); - qpci_free_pc(bus); - test_end(); + + qtest_shutdown(qs); } static void pci_msix(void) { QVirtioPCIDevice *dev; - QPCIBus *bus; + QOSState *qs; QVirtQueuePCI *vqpci; - QGuestAllocator *alloc; QVirtioBlkReq req; int n_size = TEST_IMAGE_SIZE / 2; void *addr; @@ -454,13 +440,12 @@ static void pci_msix(void) uint8_t status; char *data; - bus = pci_test_start(); - alloc = pc_alloc_init(); + qs = pci_test_start(); - dev = virtio_blk_pci_init(bus, PCI_SLOT); + dev = virtio_blk_pci_init(qs->pcibus, PCI_SLOT); qpci_msix_enable(dev->pdev); - qvirtio_pci_set_msix_configuration_vector(dev, alloc, 0); + qvirtio_pci_set_msix_configuration_vector(dev, qs->alloc, 0); /* MSI-X is enabled */ addr = dev->addr + VIRTIO_PCI_CONFIG_OFF(true); @@ -475,8 +460,8 @@ static void pci_msix(void) (1u << VIRTIO_BLK_F_SCSI)); qvirtio_set_features(&dev->vdev, features); - vqpci = (QVirtQueuePCI *)qvirtqueue_setup(&dev->vdev, alloc, 0); - qvirtqueue_pci_msix_setup(dev, vqpci, alloc, 1); + vqpci = (QVirtQueuePCI *)qvirtqueue_setup(&dev->vdev, qs->alloc, 0); + qvirtqueue_pci_msix_setup(dev, vqpci, qs->alloc, 1); qvirtio_set_driver_ok(&dev->vdev); @@ -495,7 +480,7 @@ static void pci_msix(void) req.data = g_malloc0(512); strcpy(req.data, "TEST"); - req_addr = virtio_blk_request(alloc, &dev->vdev, &req, 512); + req_addr = virtio_blk_request(qs->alloc, &dev->vdev, &req, 512); g_free(req.data); @@ -510,7 +495,7 @@ static void pci_msix(void) status = readb(req_addr + 528); g_assert_cmpint(status, ==, 0); - guest_free(alloc, req_addr); + guest_free(qs->alloc, req_addr); /* Read request */ req.type = VIRTIO_BLK_T_IN; @@ -518,7 +503,7 @@ static void pci_msix(void) req.sector = 0; req.data = g_malloc0(512); - req_addr = virtio_blk_request(alloc, &dev->vdev, &req, 512); + req_addr = virtio_blk_request(qs->alloc, &dev->vdev, &req, 512); g_free(req.data); @@ -540,24 +525,21 @@ static void pci_msix(void) g_assert_cmpstr(data, ==, "TEST"); g_free(data); - guest_free(alloc, req_addr); + guest_free(qs->alloc, req_addr); /* End test */ - qvirtqueue_cleanup(dev->vdev.bus, &vqpci->vq, alloc); - pc_alloc_uninit(alloc); + qvirtqueue_cleanup(dev->vdev.bus, &vqpci->vq, qs->alloc); qpci_msix_disable(dev->pdev); qvirtio_pci_device_disable(dev); g_free(dev); - qpci_free_pc(bus); - test_end(); + qtest_shutdown(qs); } static void pci_idx(void) { QVirtioPCIDevice *dev; - QPCIBus *bus; + QOSState *qs; QVirtQueuePCI *vqpci; - QGuestAllocator *alloc; QVirtioBlkReq req; void *addr; uint64_t req_addr; @@ -567,13 +549,12 @@ static void pci_idx(void) uint8_t status; char *data; - bus = pci_test_start(); - alloc = pc_alloc_init(); + qs = pci_test_start(); - dev = virtio_blk_pci_init(bus, PCI_SLOT); + dev = virtio_blk_pci_init(qs->pcibus, PCI_SLOT); qpci_msix_enable(dev->pdev); - qvirtio_pci_set_msix_configuration_vector(dev, alloc, 0); + qvirtio_pci_set_msix_configuration_vector(dev, qs->alloc, 0); /* MSI-X is enabled */ addr = dev->addr + VIRTIO_PCI_CONFIG_OFF(true); @@ -588,8 +569,8 @@ static void pci_idx(void) (1u << VIRTIO_BLK_F_SCSI)); qvirtio_set_features(&dev->vdev, features); - vqpci = (QVirtQueuePCI *)qvirtqueue_setup(&dev->vdev, alloc, 0); - qvirtqueue_pci_msix_setup(dev, vqpci, alloc, 1); + vqpci = (QVirtQueuePCI *)qvirtqueue_setup(&dev->vdev, qs->alloc, 0); + qvirtqueue_pci_msix_setup(dev, vqpci, qs->alloc, 1); qvirtio_set_driver_ok(&dev->vdev); @@ -600,7 +581,7 @@ static void pci_idx(void) req.data = g_malloc0(512); strcpy(req.data, "TEST"); - req_addr = virtio_blk_request(alloc, &dev->vdev, &req, 512); + req_addr = virtio_blk_request(qs->alloc, &dev->vdev, &req, 512); g_free(req.data); @@ -618,7 +599,7 @@ static void pci_idx(void) req.data = g_malloc0(512); strcpy(req.data, "TEST"); - req_addr = virtio_blk_request(alloc, &dev->vdev, &req, 512); + req_addr = virtio_blk_request(qs->alloc, &dev->vdev, &req, 512); g_free(req.data); @@ -635,7 +616,7 @@ static void pci_idx(void) QVIRTIO_BLK_TIMEOUT_US); g_assert_cmpint(status, ==, 0); - guest_free(alloc, req_addr); + guest_free(qs->alloc, req_addr); /* Read request */ req.type = VIRTIO_BLK_T_IN; @@ -643,7 +624,7 @@ static void pci_idx(void) req.sector = 1; req.data = g_malloc0(512); - req_addr = virtio_blk_request(alloc, &dev->vdev, &req, 512); + req_addr = virtio_blk_request(qs->alloc, &dev->vdev, &req, 512); g_free(req.data); @@ -664,38 +645,35 @@ static void pci_idx(void) g_assert_cmpstr(data, ==, "TEST"); g_free(data); - guest_free(alloc, req_addr); + guest_free(qs->alloc, req_addr); /* End test */ - qvirtqueue_cleanup(dev->vdev.bus, &vqpci->vq, alloc); - pc_alloc_uninit(alloc); + qvirtqueue_cleanup(dev->vdev.bus, &vqpci->vq, qs->alloc); qpci_msix_disable(dev->pdev); qvirtio_pci_device_disable(dev); g_free(dev); - qpci_free_pc(bus); - test_end(); + qtest_shutdown(qs); } static void pci_hotplug(void) { - QPCIBus *bus; QVirtioPCIDevice *dev; + QOSState *qs; - bus = pci_test_start(); + qs = pci_test_start(); /* plug secondary disk */ qpci_plug_device_test("virtio-blk-pci", "drv1", PCI_SLOT_HP, "'drive': 'drive1'"); - dev = virtio_blk_pci_init(bus, PCI_SLOT_HP); + dev = virtio_blk_pci_init(qs->pcibus, PCI_SLOT_HP); g_assert(dev); qvirtio_pci_device_disable(dev); g_free(dev); /* unplug secondary disk */ qpci_unplug_acpi_device_test("drv1", PCI_SLOT_HP); - qpci_free_pc(bus); - test_end(); + qtest_shutdown(qs); } static void mmio_basic(void) @@ -731,8 +709,8 @@ static void mmio_basic(void) /* End test */ qvirtqueue_cleanup(dev->vdev.bus, vq, alloc); - generic_alloc_uninit(alloc); g_free(dev); + generic_alloc_uninit(alloc); test_end(); } diff --git a/tests/virtio-net-test.c b/tests/virtio-net-test.c index 6fa385e90e..6bec784f81 100644 --- a/tests/virtio-net-test.c +++ b/tests/virtio-net-test.c @@ -12,12 +12,9 @@ #include "qemu-common.h" #include "qemu/sockets.h" #include "qemu/iov.h" -#include "libqos/pci-pc.h" +#include "libqos/libqos-pc.h" #include "libqos/virtio.h" #include "libqos/virtio-pci.h" -#include "libqos/malloc.h" -#include "libqos/malloc-pc.h" -#include "libqos/malloc-generic.h" #include "qemu/bswap.h" #include "hw/virtio/virtio-net.h" #include "standard-headers/linux/virtio_ids.h" @@ -53,16 +50,12 @@ static QVirtioPCIDevice *virtio_net_pci_init(QPCIBus *bus, int slot) return dev; } -static QPCIBus *pci_test_start(int socket) +static QOSState *pci_test_start(int socket) { - char *cmdline; + const char *cmd = "-netdev socket,fd=%d,id=hs0 -device " + "virtio-net-pci,netdev=hs0"; - cmdline = g_strdup_printf("-netdev socket,fd=%d,id=hs0 -device " - "virtio-net-pci,netdev=hs0", socket); - qtest_start(cmdline); - g_free(cmdline); - - return qpci_init_pc(NULL); + return qtest_pc_boot(cmd, socket); } static void driver_init(QVirtioDevice *dev) @@ -205,9 +198,8 @@ static void stop_cont_test(QVirtioDevice *dev, static void pci_basic(gconstpointer data) { QVirtioPCIDevice *dev; - QPCIBus *bus; + QOSState *qs; QVirtQueuePCI *tx, *rx; - QGuestAllocator *alloc; void (*func) (QVirtioDevice *dev, QGuestAllocator *alloc, QVirtQueue *rvq, @@ -218,26 +210,23 @@ static void pci_basic(gconstpointer data) ret = socketpair(PF_UNIX, SOCK_STREAM, 0, sv); g_assert_cmpint(ret, !=, -1); - bus = pci_test_start(sv[1]); - dev = virtio_net_pci_init(bus, PCI_SLOT); + qs = pci_test_start(sv[1]); + dev = virtio_net_pci_init(qs->pcibus, PCI_SLOT); - alloc = pc_alloc_init(); - rx = (QVirtQueuePCI *)qvirtqueue_setup(&dev->vdev, alloc, 0); - tx = (QVirtQueuePCI *)qvirtqueue_setup(&dev->vdev, alloc, 1); + rx = (QVirtQueuePCI *)qvirtqueue_setup(&dev->vdev, qs->alloc, 0); + tx = (QVirtQueuePCI *)qvirtqueue_setup(&dev->vdev, qs->alloc, 1); driver_init(&dev->vdev); - func(&dev->vdev, alloc, &rx->vq, &tx->vq, sv[0]); + func(&dev->vdev, qs->alloc, &rx->vq, &tx->vq, sv[0]); /* End test */ close(sv[0]); - qvirtqueue_cleanup(dev->vdev.bus, &tx->vq, alloc); - qvirtqueue_cleanup(dev->vdev.bus, &rx->vq, alloc); - pc_alloc_uninit(alloc); + qvirtqueue_cleanup(dev->vdev.bus, &tx->vq, qs->alloc); + qvirtqueue_cleanup(dev->vdev.bus, &rx->vq, qs->alloc); qvirtio_pci_device_disable(dev); g_free(dev->pdev); g_free(dev); - qpci_free_pc(bus); - test_end(); + qtest_shutdown(qs); } #endif diff --git a/tests/virtio-scsi-test.c b/tests/virtio-scsi-test.c index 3dbec2f5f0..7d697abac0 100644 --- a/tests/virtio-scsi-test.c +++ b/tests/virtio-scsi-test.c @@ -11,12 +11,9 @@ #include "qemu/osdep.h" #include "libqtest.h" #include "block/scsi.h" +#include "libqos/libqos-pc.h" #include "libqos/virtio.h" #include "libqos/virtio-pci.h" -#include "libqos/pci-pc.h" -#include "libqos/malloc.h" -#include "libqos/malloc-pc.h" -#include "libqos/malloc-generic.h" #include "standard-headers/linux/virtio_ids.h" #include "standard-headers/linux/virtio_pci.h" #include "standard-headers/linux/virtio_scsi.h" @@ -29,28 +26,23 @@ typedef struct { QVirtioDevice *dev; - QGuestAllocator *alloc; - QPCIBus *bus; + QOSState *qs; int num_queues; QVirtQueue *vq[MAX_NUM_QUEUES + 2]; } QVirtIOSCSI; -static void qvirtio_scsi_start(const char *extra_opts) +static QOSState *qvirtio_scsi_start(const char *extra_opts) { - char *cmdline; + const char *cmd = "-drive id=drv0,if=none,file=/dev/null,format=raw " + "-device virtio-scsi-pci,id=vs0 " + "-device scsi-hd,bus=vs0.0,drive=drv0 %s"; - cmdline = g_strdup_printf( - "-drive id=drv0,if=none,file=/dev/null,format=raw " - "-device virtio-scsi-pci,id=vs0 " - "-device scsi-hd,bus=vs0.0,drive=drv0 %s", - extra_opts ? : ""); - qtest_start(cmdline); - g_free(cmdline); + return qtest_pc_boot(cmd, extra_opts ? : ""); } -static void qvirtio_scsi_stop(void) +static void qvirtio_scsi_stop(QOSState *qs) { - qtest_end(); + qtest_shutdown(qs); } static void qvirtio_scsi_pci_free(QVirtIOSCSI *vs) @@ -58,12 +50,11 @@ static void qvirtio_scsi_pci_free(QVirtIOSCSI *vs) int i; for (i = 0; i < vs->num_queues + 2; i++) { - qvirtqueue_cleanup(vs->dev->bus, vs->vq[i], vs->alloc); + qvirtqueue_cleanup(vs->dev->bus, vs->vq[i], vs->qs->alloc); } - pc_alloc_uninit(vs->alloc); qvirtio_pci_device_disable(container_of(vs->dev, QVirtioPCIDevice, vdev)); g_free(vs->dev); - qpci_free_pc(vs->bus); + qvirtio_scsi_stop(vs->qs); g_free(vs); } @@ -72,7 +63,7 @@ static uint64_t qvirtio_scsi_alloc(QVirtIOSCSI *vs, size_t alloc_size, { uint64_t addr; - addr = guest_alloc(vs->alloc, alloc_size); + addr = guest_alloc(vs->qs->alloc, alloc_size); if (data) { memwrite(addr, data, alloc_size); } @@ -129,10 +120,10 @@ static uint8_t virtio_scsi_do_command(QVirtIOSCSI *vs, const uint8_t *cdb, memread(resp_addr, resp_out, sizeof(*resp_out)); } - guest_free(vs->alloc, req_addr); - guest_free(vs->alloc, resp_addr); - guest_free(vs->alloc, data_in_addr); - guest_free(vs->alloc, data_out_addr); + guest_free(vs->qs->alloc, req_addr); + guest_free(vs->qs->alloc, resp_addr); + guest_free(vs->qs->alloc, data_in_addr); + guest_free(vs->qs->alloc, data_out_addr); return response; } @@ -146,10 +137,11 @@ static QVirtIOSCSI *qvirtio_scsi_pci_init(int slot) int i; vs = g_new0(QVirtIOSCSI, 1); - vs->alloc = pc_alloc_init(); - vs->bus = qpci_init_pc(NULL); - dev = qvirtio_pci_device_find(vs->bus, VIRTIO_ID_SCSI); + vs->qs = qvirtio_scsi_start("-drive file=blkdebug::null-co://," + "if=none,id=dr1,format=raw,file.align=4k " + "-device scsi-disk,drive=dr1,lun=0,scsi-id=1"); + dev = qvirtio_pci_device_find(vs->qs->pcibus, VIRTIO_ID_SCSI); vs->dev = (QVirtioDevice *)dev; g_assert(dev != NULL); g_assert_cmphex(vs->dev->device_type, ==, VIRTIO_ID_SCSI); @@ -165,7 +157,7 @@ static QVirtIOSCSI *qvirtio_scsi_pci_init(int slot) g_assert_cmpint(vs->num_queues, <, MAX_NUM_QUEUES); for (i = 0; i < vs->num_queues + 2; i++) { - vs->vq[i] = qvirtqueue_setup(vs->dev, vs->alloc, i); + vs->vq[i] = qvirtqueue_setup(vs->dev, vs->qs->alloc, i); } /* Clear the POWER ON OCCURRED unit attention */ @@ -184,15 +176,18 @@ static QVirtIOSCSI *qvirtio_scsi_pci_init(int slot) /* Tests only initialization so far. TODO: Replace with functional tests */ static void pci_nop(void) { - qvirtio_scsi_start(NULL); - qvirtio_scsi_stop(); + QOSState *qs; + + qs = qvirtio_scsi_start(NULL); + qvirtio_scsi_stop(qs); } static void hotplug(void) { QDict *response; + QOSState *qs; - qvirtio_scsi_start("-drive id=drv1,if=none,file=/dev/null,format=raw"); + qs = qvirtio_scsi_start("-drive id=drv1,if=none,file=/dev/null,format=raw"); response = qmp("{\"execute\": \"device_add\"," " \"arguments\": {" " \"driver\": \"scsi-hd\"," @@ -214,7 +209,7 @@ static void hotplug(void) g_assert(qdict_haskey(response, "event")); g_assert(!strcmp(qdict_get_str(response, "event"), "DEVICE_DELETED")); QDECREF(response); - qvirtio_scsi_stop(); + qvirtio_scsi_stop(qs); } /* Test WRITE SAME with the lba not aligned */ @@ -230,9 +225,6 @@ static void test_unaligned_write_same(void) 0x41, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x33, 0x00, 0x00 }; - qvirtio_scsi_start("-drive file=blkdebug::null-co://,if=none,id=dr1" - ",format=raw,file.align=4k " - "-device scsi-disk,drive=dr1,lun=0,scsi-id=1"); vs = qvirtio_scsi_pci_init(PCI_SLOT); g_assert_cmphex(0, ==, @@ -242,7 +234,6 @@ static void test_unaligned_write_same(void) virtio_scsi_do_command(vs, write_same_cdb_2, NULL, 0, buf2, 512, NULL)); qvirtio_scsi_pci_free(vs); - qvirtio_scsi_stop(); } int main(int argc, char **argv) From 30ca440eec9fe1d7eec5a48addac656438778278 Mon Sep 17 00:00:00 2001 From: Laurent Vivier Date: Mon, 17 Oct 2016 12:30:24 +0200 Subject: [PATCH 08/73] tests: enable virtio tests on SPAPR but disable MSI-X tests on SPAPR as we can't check the result (the memory region used on PC is not readable on SPAPR). Signed-off-by: Laurent Vivier Signed-off-by: David Gibson --- tests/Makefile.include | 3 ++- tests/libqos/virtio-pci.c | 24 ++++++++++++++++++++++-- tests/virtio-9p-test.c | 12 +++++++++++- tests/virtio-blk-test.c | 25 ++++++++++++++++++++----- tests/virtio-net-test.c | 18 ++++++++++++++++-- tests/virtio-rng-test.c | 7 ++++++- tests/virtio-scsi-test.c | 12 +++++++++++- 7 files changed, 88 insertions(+), 13 deletions(-) diff --git a/tests/Makefile.include b/tests/Makefile.include index 22656eaf26..1a135d2340 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -282,6 +282,7 @@ check-qtest-ppc64-y += tests/usb-hcd-uhci-test$(EXESUF) gcov-files-ppc64-y += hw/usb/hcd-uhci.c check-qtest-ppc64-y += tests/usb-hcd-xhci-test$(EXESUF) gcov-files-ppc64-y += hw/usb/hcd-xhci.c +check-qtest-ppc64-y += $(check-qtest-virtio-y) check-qtest-sh4-y = tests/endianness-test$(EXESUF) @@ -615,7 +616,7 @@ libqos-pc-obj-y += tests/libqos/ahci.o libqos-omap-obj-y = $(libqos-obj-y) tests/libqos/i2c-omap.o libqos-imx-obj-y = $(libqos-obj-y) tests/libqos/i2c-imx.o libqos-usb-obj-y = $(libqos-spapr-obj-y) $(libqos-pc-obj-y) tests/libqos/usb.o -libqos-virtio-obj-y = $(libqos-pc-obj-y) tests/libqos/virtio.o tests/libqos/virtio-pci.o tests/libqos/virtio-mmio.o tests/libqos/malloc-generic.o +libqos-virtio-obj-y = $(libqos-spapr-obj-y) $(libqos-pc-obj-y) tests/libqos/virtio.o tests/libqos/virtio-pci.o tests/libqos/virtio-mmio.o tests/libqos/malloc-generic.o tests/device-introspect-test$(EXESUF): tests/device-introspect-test.o tests/rtc-test$(EXESUF): tests/rtc-test.o diff --git a/tests/libqos/virtio-pci.c b/tests/libqos/virtio-pci.c index 7aa29b1a9c..7e60b3a427 100644 --- a/tests/libqos/virtio-pci.c +++ b/tests/libqos/virtio-pci.c @@ -68,16 +68,36 @@ static uint8_t qvirtio_pci_config_readb(QVirtioDevice *d, uint64_t addr) return qpci_io_readb(dev->pdev, (void *)(uintptr_t)addr); } +/* PCI is always read in little-endian order + * but virtio ( < 1.0) is in guest order + * so with a big-endian guest the order has been reversed, + * reverse it again + * virtio-1.0 is always little-endian, like PCI, but this + * case will be managed inside qvirtio_is_big_endian() + */ + static uint16_t qvirtio_pci_config_readw(QVirtioDevice *d, uint64_t addr) { QVirtioPCIDevice *dev = (QVirtioPCIDevice *)d; - return qpci_io_readw(dev->pdev, (void *)(uintptr_t)addr); + uint16_t value; + + value = qpci_io_readw(dev->pdev, (void *)(uintptr_t)addr); + if (qvirtio_is_big_endian(d)) { + value = bswap16(value); + } + return value; } static uint32_t qvirtio_pci_config_readl(QVirtioDevice *d, uint64_t addr) { QVirtioPCIDevice *dev = (QVirtioPCIDevice *)d; - return qpci_io_readl(dev->pdev, (void *)(uintptr_t)addr); + uint32_t value; + + value = qpci_io_readl(dev->pdev, (void *)(uintptr_t)addr); + if (qvirtio_is_big_endian(d)) { + value = bswap32(value); + } + return value; } static uint64_t qvirtio_pci_config_readq(QVirtioDevice *d, uint64_t addr) diff --git a/tests/virtio-9p-test.c b/tests/virtio-9p-test.c index 851ec99404..693920af5f 100644 --- a/tests/virtio-9p-test.c +++ b/tests/virtio-9p-test.c @@ -11,6 +11,7 @@ #include "libqtest.h" #include "qemu-common.h" #include "libqos/libqos-pc.h" +#include "libqos/libqos-spapr.h" #include "libqos/virtio.h" #include "libqos/virtio-pci.h" #include "standard-headers/linux/virtio_ids.h" @@ -22,13 +23,22 @@ static char *test_share; static QOSState *qvirtio_9p_start(void) { + const char *arch = qtest_get_arch(); const char *cmd = "-fsdev local,id=fsdev0,security_model=none,path=%s " "-device virtio-9p-pci,fsdev=fsdev0,mount_tag=%s"; test_share = g_strdup("/tmp/qtest.XXXXXX"); g_assert_nonnull(mkdtemp(test_share)); - return qtest_pc_boot(cmd, test_share, mount_tag); + if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) { + return qtest_pc_boot(cmd, test_share, mount_tag); + } + if (strcmp(arch, "ppc64") == 0) { + return qtest_spapr_boot(cmd, test_share, mount_tag); + } + + g_printerr("virtio-9p tests are only available on x86 or ppc64\n"); + exit(EXIT_FAILURE); } static void qvirtio_9p_stop(QOSState *qs) diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c index 2382eb5cc1..f737c406e3 100644 --- a/tests/virtio-blk-test.c +++ b/tests/virtio-blk-test.c @@ -11,6 +11,7 @@ #include "qemu/osdep.h" #include "libqtest.h" #include "libqos/libqos-pc.h" +#include "libqos/libqos-spapr.h" #include "libqos/virtio.h" #include "libqos/virtio-pci.h" #include "libqos/virtio-mmio.h" @@ -59,6 +60,7 @@ static char *drive_create(void) static QOSState *pci_test_start(void) { QOSState *qs; + const char *arch = qtest_get_arch(); char *tmp_path; const char *cmd = "-drive if=none,id=drive0,file=%s,format=raw " "-drive if=none,id=drive1,file=/dev/null,format=raw " @@ -67,7 +69,14 @@ static QOSState *pci_test_start(void) tmp_path = drive_create(); - qs = qtest_pc_boot(cmd, tmp_path, PCI_SLOT, PCI_FN); + if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) { + qs = qtest_pc_boot(cmd, tmp_path, PCI_SLOT, PCI_FN); + } else if (strcmp(arch, "ppc64") == 0) { + qs = qtest_spapr_boot(cmd, tmp_path, PCI_SLOT, PCI_FN); + } else { + g_printerr("virtio-blk tests are only available on x86 or ppc64\n"); + exit(EXIT_FAILURE); + } unlink(tmp_path); g_free(tmp_path); return qs; @@ -659,6 +668,7 @@ static void pci_hotplug(void) { QVirtioPCIDevice *dev; QOSState *qs; + const char *arch = qtest_get_arch(); qs = pci_test_start(); @@ -672,7 +682,9 @@ static void pci_hotplug(void) g_free(dev); /* unplug secondary disk */ - qpci_unplug_acpi_device_test("drv1", PCI_SLOT_HP); + if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) { + qpci_unplug_acpi_device_test("drv1", PCI_SLOT_HP); + } qtest_shutdown(qs); } @@ -720,12 +732,15 @@ int main(int argc, char **argv) g_test_init(&argc, &argv, NULL); - if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) { + if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0 || + strcmp(arch, "ppc64") == 0) { qtest_add_func("/virtio/blk/pci/basic", pci_basic); qtest_add_func("/virtio/blk/pci/indirect", pci_indirect); qtest_add_func("/virtio/blk/pci/config", pci_config); - qtest_add_func("/virtio/blk/pci/msix", pci_msix); - qtest_add_func("/virtio/blk/pci/idx", pci_idx); + if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) { + qtest_add_func("/virtio/blk/pci/msix", pci_msix); + qtest_add_func("/virtio/blk/pci/idx", pci_idx); + } qtest_add_func("/virtio/blk/pci/hotplug", pci_hotplug); } else if (strcmp(arch, "arm") == 0) { qtest_add_func("/virtio/blk/mmio/basic", mmio_basic); diff --git a/tests/virtio-net-test.c b/tests/virtio-net-test.c index 6bec784f81..8f94360480 100644 --- a/tests/virtio-net-test.c +++ b/tests/virtio-net-test.c @@ -13,6 +13,7 @@ #include "qemu/sockets.h" #include "qemu/iov.h" #include "libqos/libqos-pc.h" +#include "libqos/libqos-spapr.h" #include "libqos/virtio.h" #include "libqos/virtio-pci.h" #include "qemu/bswap.h" @@ -52,10 +53,18 @@ static QVirtioPCIDevice *virtio_net_pci_init(QPCIBus *bus, int slot) static QOSState *pci_test_start(int socket) { + const char *arch = qtest_get_arch(); const char *cmd = "-netdev socket,fd=%d,id=hs0 -device " "virtio-net-pci,netdev=hs0"; - return qtest_pc_boot(cmd, socket); + if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) { + return qtest_pc_boot(cmd, socket); + } + if (strcmp(arch, "ppc64") == 0) { + return qtest_spapr_boot(cmd, socket); + } + g_printerr("virtio-net tests are only available on x86 or ppc64\n"); + exit(EXIT_FAILURE); } static void driver_init(QVirtioDevice *dev) @@ -232,10 +241,15 @@ static void pci_basic(gconstpointer data) static void hotplug(void) { + const char *arch = qtest_get_arch(); + qtest_start("-device virtio-net-pci"); qpci_plug_device_test("virtio-net-pci", "net1", PCI_SLOT_HP, NULL); - qpci_unplug_acpi_device_test("net1", PCI_SLOT_HP); + + if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) { + qpci_unplug_acpi_device_test("net1", PCI_SLOT_HP); + } test_end(); } diff --git a/tests/virtio-rng-test.c b/tests/virtio-rng-test.c index e1b26401f9..dcecf77463 100644 --- a/tests/virtio-rng-test.c +++ b/tests/virtio-rng-test.c @@ -20,8 +20,13 @@ static void pci_nop(void) static void hotplug(void) { + const char *arch = qtest_get_arch(); + qpci_plug_device_test("virtio-rng-pci", "rng1", PCI_SLOT_HP, NULL); - qpci_unplug_acpi_device_test("rng1", PCI_SLOT_HP); + + if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) { + qpci_unplug_acpi_device_test("rng1", PCI_SLOT_HP); + } } int main(int argc, char **argv) diff --git a/tests/virtio-scsi-test.c b/tests/virtio-scsi-test.c index 7d697abac0..60dc9abd60 100644 --- a/tests/virtio-scsi-test.c +++ b/tests/virtio-scsi-test.c @@ -12,6 +12,7 @@ #include "libqtest.h" #include "block/scsi.h" #include "libqos/libqos-pc.h" +#include "libqos/libqos-spapr.h" #include "libqos/virtio.h" #include "libqos/virtio-pci.h" #include "standard-headers/linux/virtio_ids.h" @@ -33,11 +34,20 @@ typedef struct { static QOSState *qvirtio_scsi_start(const char *extra_opts) { + const char *arch = qtest_get_arch(); const char *cmd = "-drive id=drv0,if=none,file=/dev/null,format=raw " "-device virtio-scsi-pci,id=vs0 " "-device scsi-hd,bus=vs0.0,drive=drv0 %s"; - return qtest_pc_boot(cmd, extra_opts ? : ""); + if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) { + return qtest_pc_boot(cmd, extra_opts ? : ""); + } + if (strcmp(arch, "ppc64") == 0) { + return qtest_spapr_boot(cmd, extra_opts ? : ""); + } + + g_printerr("virtio-scsi tests are only available on x86 or ppc64\n"); + exit(EXIT_FAILURE); } static void qvirtio_scsi_stop(QOSState *qs) From 4bcfa56ca9f6970974255dd5621b08e5aa9e5af5 Mon Sep 17 00:00:00 2001 From: Michael Roth Date: Tue, 18 Oct 2016 15:50:23 -0500 Subject: [PATCH 09/73] spapr_pci: advertise explicit numa IDs even when there's 1 node With the addition of "numa_node" properties for PHBs we began advertising NUMA affinity in cases where nb_numa_nodes > 1. Since the default on the guest side is to make no assumptions about PHB NUMA affinity (defaulting to -1), there is still a valid use-case for explicitly defining a PHB's NUMA affinity even when there's just one node. In particular, some workloads make faulty assumptions about /sys/bus/pci//numa_node being >= 0, warranting the use of this property as a workaround even if there's just 1 PHB or NUMA node. Enable this use-case by always advertising the PHB's NUMA affinity if "numa_node" has been explicitly set. We could achieve this by relaxing the check to simply be nb_numa_nodes > 0, but even safer would be to check numa_info[nodeid].present explicitly, and to fail at start time for cases where it does not exist. This has an additional affect of no longer advertising PHB NUMA affinity unconditionally if nb_numa_nodes > 1 and "numa_node" property is unset/-1, but since the default value on the guest side for each PHB is also -1, the behavior should be the same for that situation. We could still retain the old behavior if desired, but the decision seems arbitrary, so we take the simpler route. Cc: Alexey Kardashevskiy Cc: Shivaprasad G. Bhat Signed-off-by: Michael Roth Signed-off-by: David Gibson --- hw/ppc/spapr_pci.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c index 2a1ccf59ea..7cde30ee09 100644 --- a/hw/ppc/spapr_pci.c +++ b/hw/ppc/spapr_pci.c @@ -1392,6 +1392,12 @@ static void spapr_phb_realize(DeviceState *dev, Error **errp) return; } + if (sphb->numa_node != -1 && + (sphb->numa_node >= MAX_NODES || !numa_info[sphb->numa_node].present)) { + error_setg(errp, "Invalid NUMA node ID for PCI host bridge"); + return; + } + sphb->dtbusname = g_strdup_printf("pci@%" PRIx64, sphb->buid); namebuf = alloca(strlen(sphb->dtbusname) + 32); @@ -1880,7 +1886,7 @@ int spapr_populate_pci_dt(sPAPRPHBState *phb, } /* Advertise NUMA via ibm,associativity */ - if (nb_numa_nodes > 1) { + if (phb->numa_node != -1) { _FDT(fdt_setprop(fdt, bus_off, "ibm,associativity", associativity, sizeof(associativity))); } From 55d9950aaa8e87372cfae2a7efc810f078f36818 Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Tue, 18 Oct 2016 22:46:40 +0200 Subject: [PATCH 10/73] nvram: Introduce helper functions for CHRP "system" and "free space" partitions The "system partition" and "free space" partition layouts are defined by the CHRP and LoPAPR specification, and used by OpenBIOS and SLOF. We can re-use this code for other machines that use OpenBIOS and SLOF, too. So let's make this code independent from the MAC NVRAM environment and put it into two proper helper functions. Signed-off-by: Thomas Huth Tested-by: Mark Cave-Ayland Signed-off-by: David Gibson --- hw/nvram/Makefile.objs | 1 + hw/nvram/chrp_nvram.c | 76 +++++++++++++++++++++++++++++++++++ hw/nvram/mac_nvram.c | 38 ++++-------------- include/hw/nvram/chrp_nvram.h | 24 +++++++++++ 4 files changed, 108 insertions(+), 31 deletions(-) create mode 100644 hw/nvram/chrp_nvram.c create mode 100644 include/hw/nvram/chrp_nvram.h diff --git a/hw/nvram/Makefile.objs b/hw/nvram/Makefile.objs index e9a66940e0..c018f6b2ff 100644 --- a/hw/nvram/Makefile.objs +++ b/hw/nvram/Makefile.objs @@ -1,5 +1,6 @@ common-obj-$(CONFIG_DS1225Y) += ds1225y.o common-obj-y += eeprom93xx.o common-obj-y += fw_cfg.o +common-obj-y += chrp_nvram.o common-obj-$(CONFIG_MAC_NVRAM) += mac_nvram.o obj-$(CONFIG_PSERIES) += spapr_nvram.o diff --git a/hw/nvram/chrp_nvram.c b/hw/nvram/chrp_nvram.c new file mode 100644 index 0000000000..f6183ed044 --- /dev/null +++ b/hw/nvram/chrp_nvram.c @@ -0,0 +1,76 @@ +/* + * Common Hardware Reference Platform NVRAM helper functions. + * + * The CHRP NVRAM layout is used by OpenBIOS and SLOF. See CHRP + * specification, chapter 8, or the LoPAPR specification for details + * about the NVRAM layout. + * + * This code is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2 of the License, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +#include "qemu/osdep.h" +#include "qemu/cutils.h" +#include "hw/hw.h" +#include "hw/nvram/chrp_nvram.h" +#include "hw/nvram/openbios_firmware_abi.h" +#include "sysemu/sysemu.h" + +/** + * Create a "system partition", used for the Open Firmware + * environment variables. + */ +int chrp_nvram_create_system_partition(uint8_t *data, int min_len) +{ + struct OpenBIOS_nvpart_v1 *part_header; + unsigned int i; + int end; + + part_header = (struct OpenBIOS_nvpart_v1 *)data; + part_header->signature = OPENBIOS_PART_SYSTEM; + pstrcpy(part_header->name, sizeof(part_header->name), "system"); + + end = sizeof(struct OpenBIOS_nvpart_v1); + for (i = 0; i < nb_prom_envs; i++) { + end = OpenBIOS_set_var(data, end, prom_envs[i]); + } + + /* End marker */ + data[end++] = '\0'; + + end = (end + 15) & ~15; + /* XXX: OpenBIOS is not able to grow up a partition. Leave some space for + new variables. */ + if (end < min_len) { + end = min_len; + } + OpenBIOS_finish_partition(part_header, end); + + return end; +} + +/** + * Create a "free space" partition + */ +int chrp_nvram_create_free_partition(uint8_t *data, int len) +{ + struct OpenBIOS_nvpart_v1 *part_header; + + part_header = (struct OpenBIOS_nvpart_v1 *)data; + part_header->signature = OPENBIOS_PART_FREE; + pstrcpy(part_header->name, sizeof(part_header->name), "free"); + + OpenBIOS_finish_partition(part_header, len); + + return len; +} diff --git a/hw/nvram/mac_nvram.c b/hw/nvram/mac_nvram.c index 24f61212ba..c0e62a52b3 100644 --- a/hw/nvram/mac_nvram.c +++ b/hw/nvram/mac_nvram.c @@ -25,7 +25,7 @@ #include "qemu/osdep.h" #include "hw/hw.h" #include "hw/nvram/openbios_firmware_abi.h" -#include "sysemu/sysemu.h" +#include "hw/nvram/chrp_nvram.h" #include "hw/ppc/mac.h" #include "qemu/cutils.h" #include @@ -146,38 +146,14 @@ static void macio_nvram_register_types(void) static void pmac_format_nvram_partition_of(MacIONVRAMState *nvr, int off, int len) { - unsigned int i; - uint32_t start = off, end; - struct OpenBIOS_nvpart_v1 *part_header; + int sysp_end; - // OpenBIOS nvram variables - // Variable partition - part_header = (struct OpenBIOS_nvpart_v1 *)&nvr->data[start]; - part_header->signature = OPENBIOS_PART_SYSTEM; - pstrcpy(part_header->name, sizeof(part_header->name), "system"); + /* OpenBIOS nvram variables partition */ + sysp_end = chrp_nvram_create_system_partition(&nvr->data[off], + DEF_SYSTEM_SIZE) + off; - end = start + sizeof(struct OpenBIOS_nvpart_v1); - for (i = 0; i < nb_prom_envs; i++) - end = OpenBIOS_set_var(nvr->data, end, prom_envs[i]); - - // End marker - nvr->data[end++] = '\0'; - - end = start + ((end - start + 15) & ~15); - /* XXX: OpenBIOS is not able to grow up a partition. Leave some space for - new variables. */ - if (end < DEF_SYSTEM_SIZE) - end = DEF_SYSTEM_SIZE; - OpenBIOS_finish_partition(part_header, end - start); - - // free partition - start = end; - part_header = (struct OpenBIOS_nvpart_v1 *)&nvr->data[start]; - part_header->signature = OPENBIOS_PART_FREE; - pstrcpy(part_header->name, sizeof(part_header->name), "free"); - - end = len; - OpenBIOS_finish_partition(part_header, end - start); + /* Free space partition */ + chrp_nvram_create_free_partition(&nvr->data[sysp_end], len - sysp_end); } #define OSX_NVRAM_SIGNATURE (0x5A) diff --git a/include/hw/nvram/chrp_nvram.h b/include/hw/nvram/chrp_nvram.h new file mode 100644 index 0000000000..18d19765d0 --- /dev/null +++ b/include/hw/nvram/chrp_nvram.h @@ -0,0 +1,24 @@ +/* + * Common Hardware Reference Platform NVRAM functions. + * + * This code is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2 of the License, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +#ifndef CHRP_NVRAM_H +#define CHRP_NVRAM_H + +int chrp_nvram_create_system_partition(uint8_t *data, int min_len); +int chrp_nvram_create_free_partition(uint8_t *data, int len); + +#endif From 2024c01421eb990e7043afa0e0e4d67f4477596f Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Tue, 18 Oct 2016 22:46:41 +0200 Subject: [PATCH 11/73] sparc: Use the new common NVRAM functions for system and free space partition The system and free space NVRAM partitions (for OpenBIOS) are created in exactly the same way as the Mac-style CHRP NVRAM partitions, so we can use the new common helper functions to do this job here, too. Signed-off-by: Thomas Huth Tested-by: Mark Cave-Ayland Signed-off-by: David Gibson --- hw/sparc/sun4m.c | 33 ++++++--------------------------- hw/sparc64/sun4u.c | 33 ++++++--------------------------- 2 files changed, 12 insertions(+), 54 deletions(-) diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c index b3915e4fd6..1b8d172c4e 100644 --- a/hw/sparc/sun4m.c +++ b/hw/sparc/sun4m.c @@ -39,6 +39,7 @@ #include "hw/scsi/esp.h" #include "hw/i386/pc.h" #include "hw/isa/isa.h" +#include "hw/nvram/chrp_nvram.h" #include "hw/nvram/fw_cfg.h" #include "hw/char/escc.h" #include "hw/empty_slot.h" @@ -117,39 +118,17 @@ static void nvram_init(Nvram *nvram, uint8_t *macaddr, int nvram_machine_id, const char *arch) { unsigned int i; - uint32_t start, end; + int sysp_end; uint8_t image[0x1ff0]; - struct OpenBIOS_nvpart_v1 *part_header; NvramClass *k = NVRAM_GET_CLASS(nvram); memset(image, '\0', sizeof(image)); - start = 0; + /* OpenBIOS nvram variables partition */ + sysp_end = chrp_nvram_create_system_partition(image, 0); - // OpenBIOS nvram variables - // Variable partition - part_header = (struct OpenBIOS_nvpart_v1 *)&image[start]; - part_header->signature = OPENBIOS_PART_SYSTEM; - pstrcpy(part_header->name, sizeof(part_header->name), "system"); - - end = start + sizeof(struct OpenBIOS_nvpart_v1); - for (i = 0; i < nb_prom_envs; i++) - end = OpenBIOS_set_var(image, end, prom_envs[i]); - - // End marker - image[end++] = '\0'; - - end = start + ((end - start + 15) & ~15); - OpenBIOS_finish_partition(part_header, end - start); - - // free partition - start = end; - part_header = (struct OpenBIOS_nvpart_v1 *)&image[start]; - part_header->signature = OPENBIOS_PART_FREE; - pstrcpy(part_header->name, sizeof(part_header->name), "free"); - - end = 0x1fd0; - OpenBIOS_finish_partition(part_header, end - start); + /* Free space partition */ + chrp_nvram_create_free_partition(&image[sysp_end], 0x1fd0 - sysp_end); Sun_init_header((struct Sun_nvram *)&image[0x1fd8], macaddr, nvram_machine_id); diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c index 7b8134ef51..83708abbf4 100644 --- a/hw/sparc64/sun4u.c +++ b/hw/sparc64/sun4u.c @@ -37,6 +37,7 @@ #include "sysemu/sysemu.h" #include "hw/boards.h" #include "hw/nvram/openbios_firmware_abi.h" +#include "hw/nvram/chrp_nvram.h" #include "hw/nvram/fw_cfg.h" #include "hw/sysbus.h" #include "hw/ide.h" @@ -124,39 +125,17 @@ static int sun4u_NVRAM_set_params(Nvram *nvram, uint16_t NVRAM_size, const uint8_t *macaddr) { unsigned int i; - uint32_t start, end; + int sysp_end; uint8_t image[0x1ff0]; - struct OpenBIOS_nvpart_v1 *part_header; NvramClass *k = NVRAM_GET_CLASS(nvram); memset(image, '\0', sizeof(image)); - start = 0; + /* OpenBIOS nvram variables partition */ + sysp_end = chrp_nvram_create_system_partition(image, 0); - // OpenBIOS nvram variables - // Variable partition - part_header = (struct OpenBIOS_nvpart_v1 *)&image[start]; - part_header->signature = OPENBIOS_PART_SYSTEM; - pstrcpy(part_header->name, sizeof(part_header->name), "system"); - - end = start + sizeof(struct OpenBIOS_nvpart_v1); - for (i = 0; i < nb_prom_envs; i++) - end = OpenBIOS_set_var(image, end, prom_envs[i]); - - // End marker - image[end++] = '\0'; - - end = start + ((end - start + 15) & ~15); - OpenBIOS_finish_partition(part_header, end - start); - - // free partition - start = end; - part_header = (struct OpenBIOS_nvpart_v1 *)&image[start]; - part_header->signature = OPENBIOS_PART_FREE; - pstrcpy(part_header->name, sizeof(part_header->name), "free"); - - end = 0x1fd0; - OpenBIOS_finish_partition(part_header, end - start); + /* Free space partition */ + chrp_nvram_create_free_partition(&image[sysp_end], 0x1fd0 - sysp_end); Sun_init_header((struct Sun_nvram *)&image[0x1fd8], macaddr, 0x80); From ad723fe5a050b685e496f2202a919f9e32c45c43 Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Tue, 18 Oct 2016 22:46:43 +0200 Subject: [PATCH 12/73] nvram: Move the remaining CHRP NVRAM related code to chrp_nvram.[ch] Everything that is related to CHRP NVRAM should rather reside in chrp_nvram.c / chrp_nvram.h instead of openbios_firmware_abi.h. Signed-off-by: Thomas Huth Tested-by: Mark Cave-Ayland Signed-off-by: David Gibson --- hw/nvram/chrp_nvram.c | 31 +++++++++++------- hw/nvram/mac_nvram.c | 7 ++-- include/hw/nvram/chrp_nvram.h | 30 +++++++++++++++++ include/hw/nvram/openbios_firmware_abi.h | 41 ------------------------ tests/postcopy-test.c | 8 ++--- 5 files changed, 57 insertions(+), 60 deletions(-) diff --git a/hw/nvram/chrp_nvram.c b/hw/nvram/chrp_nvram.c index f6183ed044..3837510dd2 100644 --- a/hw/nvram/chrp_nvram.c +++ b/hw/nvram/chrp_nvram.c @@ -23,26 +23,35 @@ #include "qemu/cutils.h" #include "hw/hw.h" #include "hw/nvram/chrp_nvram.h" -#include "hw/nvram/openbios_firmware_abi.h" #include "sysemu/sysemu.h" +static int chrp_nvram_set_var(uint8_t *nvram, int addr, const char *str) +{ + int len; + + len = strlen(str) + 1; + memcpy(&nvram[addr], str, len); + + return addr + len; +} + /** * Create a "system partition", used for the Open Firmware * environment variables. */ int chrp_nvram_create_system_partition(uint8_t *data, int min_len) { - struct OpenBIOS_nvpart_v1 *part_header; + ChrpNvramPartHdr *part_header; unsigned int i; int end; - part_header = (struct OpenBIOS_nvpart_v1 *)data; - part_header->signature = OPENBIOS_PART_SYSTEM; + part_header = (ChrpNvramPartHdr *)data; + part_header->signature = CHRP_NVPART_SYSTEM; pstrcpy(part_header->name, sizeof(part_header->name), "system"); - end = sizeof(struct OpenBIOS_nvpart_v1); + end = sizeof(ChrpNvramPartHdr); for (i = 0; i < nb_prom_envs; i++) { - end = OpenBIOS_set_var(data, end, prom_envs[i]); + end = chrp_nvram_set_var(data, end, prom_envs[i]); } /* End marker */ @@ -54,7 +63,7 @@ int chrp_nvram_create_system_partition(uint8_t *data, int min_len) if (end < min_len) { end = min_len; } - OpenBIOS_finish_partition(part_header, end); + chrp_nvram_finish_partition(part_header, end); return end; } @@ -64,13 +73,13 @@ int chrp_nvram_create_system_partition(uint8_t *data, int min_len) */ int chrp_nvram_create_free_partition(uint8_t *data, int len) { - struct OpenBIOS_nvpart_v1 *part_header; + ChrpNvramPartHdr *part_header; - part_header = (struct OpenBIOS_nvpart_v1 *)data; - part_header->signature = OPENBIOS_PART_FREE; + part_header = (ChrpNvramPartHdr *)data; + part_header->signature = CHRP_NVPART_FREE; pstrcpy(part_header->name, sizeof(part_header->name), "free"); - OpenBIOS_finish_partition(part_header, len); + chrp_nvram_finish_partition(part_header, len); return len; } diff --git a/hw/nvram/mac_nvram.c b/hw/nvram/mac_nvram.c index c0e62a52b3..63f9ed1d82 100644 --- a/hw/nvram/mac_nvram.c +++ b/hw/nvram/mac_nvram.c @@ -24,7 +24,6 @@ */ #include "qemu/osdep.h" #include "hw/hw.h" -#include "hw/nvram/openbios_firmware_abi.h" #include "hw/nvram/chrp_nvram.h" #include "hw/ppc/mac.h" #include "qemu/cutils.h" @@ -163,15 +162,15 @@ static void pmac_format_nvram_partition_osx(MacIONVRAMState *nvr, int off, int len) { uint32_t start = off; - struct OpenBIOS_nvpart_v1 *part_header; + ChrpNvramPartHdr *part_header; unsigned char *data = &nvr->data[start]; /* empty partition */ - part_header = (struct OpenBIOS_nvpart_v1 *)data; + part_header = (ChrpNvramPartHdr *)data; part_header->signature = OSX_NVRAM_SIGNATURE; pstrcpy(part_header->name, sizeof(part_header->name), "wwwwwwwwwwww"); - OpenBIOS_finish_partition(part_header, len); + chrp_nvram_finish_partition(part_header, len); /* Generation */ stl_be_p(&data[20], 2); diff --git a/include/hw/nvram/chrp_nvram.h b/include/hw/nvram/chrp_nvram.h index 18d19765d0..b4f5b2b104 100644 --- a/include/hw/nvram/chrp_nvram.h +++ b/include/hw/nvram/chrp_nvram.h @@ -18,6 +18,36 @@ #ifndef CHRP_NVRAM_H #define CHRP_NVRAM_H +/* OpenBIOS NVRAM partition */ +typedef struct { + uint8_t signature; + uint8_t checksum; + uint16_t len; /* Big endian, length divided by 16 */ + char name[12]; +} ChrpNvramPartHdr; + +#define CHRP_NVPART_SYSTEM 0x70 +#define CHRP_NVPART_FREE 0x7f + +static inline void +chrp_nvram_finish_partition(ChrpNvramPartHdr *header, uint32_t size) +{ + unsigned int i, sum; + uint8_t *tmpptr; + + /* Length divided by 16 */ + header->len = cpu_to_be16(size >> 4); + + /* Checksum */ + tmpptr = (uint8_t *)header; + sum = *tmpptr; + for (i = 0; i < 14; i++) { + sum += tmpptr[2 + i]; + sum = (sum + ((sum & 0xff00) >> 8)) & 0xff; + } + header->checksum = sum & 0xff; +} + int chrp_nvram_create_system_partition(uint8_t *data, int min_len); int chrp_nvram_create_free_partition(uint8_t *data, int len); diff --git a/include/hw/nvram/openbios_firmware_abi.h b/include/hw/nvram/openbios_firmware_abi.h index 74cfd56180..27ce9f4a53 100644 --- a/include/hw/nvram/openbios_firmware_abi.h +++ b/include/hw/nvram/openbios_firmware_abi.h @@ -1,47 +1,6 @@ #ifndef OPENBIOS_FIRMWARE_ABI_H #define OPENBIOS_FIRMWARE_ABI_H -/* OpenBIOS NVRAM partition */ -struct OpenBIOS_nvpart_v1 { - uint8_t signature; - uint8_t checksum; - uint16_t len; // BE, length divided by 16 - char name[12]; -}; - -#define OPENBIOS_PART_SYSTEM 0x70 -#define OPENBIOS_PART_FREE 0x7f - -static inline void -OpenBIOS_finish_partition(struct OpenBIOS_nvpart_v1 *header, uint32_t size) -{ - unsigned int i, sum; - uint8_t *tmpptr; - - // Length divided by 16 - header->len = cpu_to_be16(size >> 4); - - // Checksum - tmpptr = (uint8_t *)header; - sum = *tmpptr; - for (i = 0; i < 14; i++) { - sum += tmpptr[2 + i]; - sum = (sum + ((sum & 0xff00) >> 8)) & 0xff; - } - header->checksum = sum & 0xff; -} - -static inline uint32_t -OpenBIOS_set_var(uint8_t *nvram, uint32_t addr, const char *str) -{ - uint32_t len; - - len = strlen(str) + 1; - memcpy(&nvram[addr], str, len); - - return addr + len; -} - /* Sun IDPROM structure at the end of NVRAM */ /* from http://www.squirrel.com/squirrel/sun-nvram-hostid.faq.html */ struct Sun_nvram { diff --git a/tests/postcopy-test.c b/tests/postcopy-test.c index 41ed1a976f..d6613c5fa4 100644 --- a/tests/postcopy-test.c +++ b/tests/postcopy-test.c @@ -18,7 +18,7 @@ #include "qemu/sockets.h" #include "sysemu/char.h" #include "sysemu/sysemu.h" -#include "hw/nvram/openbios_firmware_abi.h" +#include "hw/nvram/chrp_nvram.h" #define MIN_NVRAM_SIZE 8192 /* from spapr_nvram.c */ @@ -137,15 +137,15 @@ static void init_bootfile_ppc(const char *bootpath) { FILE *bootfile; char buf[MIN_NVRAM_SIZE]; - struct OpenBIOS_nvpart_v1 *header = (struct OpenBIOS_nvpart_v1 *)buf; + ChrpNvramPartHdr *header = (ChrpNvramPartHdr *)buf; memset(buf, 0, MIN_NVRAM_SIZE); /* Create a "common" partition in nvram to store boot-command property */ - header->signature = OPENBIOS_PART_SYSTEM; + header->signature = CHRP_NVPART_SYSTEM; memcpy(header->name, "common", 6); - OpenBIOS_finish_partition(header, MIN_NVRAM_SIZE); + chrp_nvram_finish_partition(header, MIN_NVRAM_SIZE); /* FW_MAX_SIZE is 4MB, but slof.bin is only 900KB, * so let's modify memory between 1MB and 100MB From c6363bae1731754a7153bf8b08c616f52c635304 Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Tue, 18 Oct 2016 22:46:44 +0200 Subject: [PATCH 13/73] nvram: Rename openbios_firmware_abi.h into sun_nvram.h The header now only contains inline functions related to the Sun NVRAM, so the a name like sun_nvram.h seems to be more appropriate now. Signed-off-by: Thomas Huth Tested-by: Mark Cave-Ayland Signed-off-by: David Gibson --- hw/sparc/sun4m.c | 2 +- hw/sparc64/sun4u.c | 2 +- include/hw/nvram/{openbios_firmware_abi.h => sun_nvram.h} | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) rename include/hw/nvram/{openbios_firmware_abi.h => sun_nvram.h} (90%) diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c index 1b8d172c4e..6224288ac3 100644 --- a/hw/sparc/sun4m.c +++ b/hw/sparc/sun4m.c @@ -35,10 +35,10 @@ #include "sysemu/sysemu.h" #include "net/net.h" #include "hw/boards.h" -#include "hw/nvram/openbios_firmware_abi.h" #include "hw/scsi/esp.h" #include "hw/i386/pc.h" #include "hw/isa/isa.h" +#include "hw/nvram/sun_nvram.h" #include "hw/nvram/chrp_nvram.h" #include "hw/nvram/fw_cfg.h" #include "hw/char/escc.h" diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c index 83708abbf4..271d8bc592 100644 --- a/hw/sparc64/sun4u.c +++ b/hw/sparc64/sun4u.c @@ -36,7 +36,7 @@ #include "qemu/timer.h" #include "sysemu/sysemu.h" #include "hw/boards.h" -#include "hw/nvram/openbios_firmware_abi.h" +#include "hw/nvram/sun_nvram.h" #include "hw/nvram/chrp_nvram.h" #include "hw/nvram/fw_cfg.h" #include "hw/sysbus.h" diff --git a/include/hw/nvram/openbios_firmware_abi.h b/include/hw/nvram/sun_nvram.h similarity index 90% rename from include/hw/nvram/openbios_firmware_abi.h rename to include/hw/nvram/sun_nvram.h index 27ce9f4a53..68eaa60308 100644 --- a/include/hw/nvram/openbios_firmware_abi.h +++ b/include/hw/nvram/sun_nvram.h @@ -1,5 +1,5 @@ -#ifndef OPENBIOS_FIRMWARE_ABI_H -#define OPENBIOS_FIRMWARE_ABI_H +#ifndef SUN_NVRAM_H +#define SUN_NVRAM_H /* Sun IDPROM structure at the end of NVRAM */ /* from http://www.squirrel.com/squirrel/sun-nvram-hostid.faq.html */ @@ -31,4 +31,4 @@ Sun_init_header(struct Sun_nvram *header, const uint8_t *macaddr, int machine_id header->checksum = tmp; } -#endif /* OPENBIOS_FIRMWARE_ABI_H */ +#endif /* SUN_NVRAM_H */ From cc8b6e76e3d924de7a4413706a3749e413ccf6fb Mon Sep 17 00:00:00 2001 From: Nikunj A Dadhania Date: Wed, 19 Oct 2016 11:36:46 +0530 Subject: [PATCH 14/73] target-ppc: implement vnegw/d instructions Vector Integer Negate Instructions: vnegw: Vector Negate Word vnegd: Vector Negate Doubleword Signed-off-by: Nikunj A Dadhania Reviewed-by: Thomas Huth Reviewed-by: Richard Henderson Signed-off-by: David Gibson --- target-ppc/helper.h | 2 ++ target-ppc/int_helper.c | 12 ++++++++++++ target-ppc/translate/vmx-impl.inc.c | 2 ++ target-ppc/translate/vmx-ops.inc.c | 2 ++ 4 files changed, 18 insertions(+) diff --git a/target-ppc/helper.h b/target-ppc/helper.h index 04c64217b7..5fcc546078 100644 --- a/target-ppc/helper.h +++ b/target-ppc/helper.h @@ -272,6 +272,8 @@ DEF_HELPER_2(vextsh2w, void, avr, avr) DEF_HELPER_2(vextsb2d, void, avr, avr) DEF_HELPER_2(vextsh2d, void, avr, avr) DEF_HELPER_2(vextsw2d, void, avr, avr) +DEF_HELPER_2(vnegw, void, avr, avr) +DEF_HELPER_2(vnegd, void, avr, avr) DEF_HELPER_2(vupkhpx, void, avr, avr) DEF_HELPER_2(vupklpx, void, avr, avr) DEF_HELPER_2(vupkhsb, void, avr, avr) diff --git a/target-ppc/int_helper.c b/target-ppc/int_helper.c index 5aee0a81c7..dca479838d 100644 --- a/target-ppc/int_helper.c +++ b/target-ppc/int_helper.c @@ -1949,6 +1949,18 @@ VEXT_SIGNED(vextsh2d, s64, UINT16_MAX, int16_t, int64_t) VEXT_SIGNED(vextsw2d, s64, UINT32_MAX, int32_t, int64_t) #undef VEXT_SIGNED +#define VNEG(name, element) \ +void helper_##name(ppc_avr_t *r, ppc_avr_t *b) \ +{ \ + int i; \ + VECTOR_FOR_INORDER_I(i, element) { \ + r->element[i] = -b->element[i]; \ + } \ +} +VNEG(vnegw, s32) +VNEG(vnegd, s64) +#undef VNEG + #define VSPLTI(suffix, element, splat_type) \ void helper_vspltis##suffix(ppc_avr_t *r, uint32_t splat) \ { \ diff --git a/target-ppc/translate/vmx-impl.inc.c b/target-ppc/translate/vmx-impl.inc.c index c8998f3eab..563f101642 100644 --- a/target-ppc/translate/vmx-impl.inc.c +++ b/target-ppc/translate/vmx-impl.inc.c @@ -815,6 +815,8 @@ GEN_VXFORM_NOA(vclzb, 1, 28) GEN_VXFORM_NOA(vclzh, 1, 29) GEN_VXFORM_NOA(vclzw, 1, 30) GEN_VXFORM_NOA(vclzd, 1, 31) +GEN_VXFORM_NOA_2(vnegw, 1, 24, 6) +GEN_VXFORM_NOA_2(vnegd, 1, 24, 7) GEN_VXFORM_NOA_2(vextsb2w, 1, 24, 16) GEN_VXFORM_NOA_2(vextsh2w, 1, 24, 17) GEN_VXFORM_NOA_2(vextsb2d, 1, 24, 24) diff --git a/target-ppc/translate/vmx-ops.inc.c b/target-ppc/translate/vmx-ops.inc.c index 68cba3e474..ab64ab2e01 100644 --- a/target-ppc/translate/vmx-ops.inc.c +++ b/target-ppc/translate/vmx-ops.inc.c @@ -215,6 +215,8 @@ GEN_VXFORM_DUAL_INV(vspltish, vinserth, 6, 13, 0x00000000, 0x100000, GEN_VXFORM_DUAL_INV(vspltisw, vinsertw, 6, 14, 0x00000000, 0x100000, PPC_ALTIVEC), GEN_VXFORM_300_EXT(vinsertd, 6, 15, 0x100000), +GEN_VXFORM_300_EO(vnegw, 0x01, 0x18, 0x06), +GEN_VXFORM_300_EO(vnegd, 0x01, 0x18, 0x07), GEN_VXFORM_300_EO(vextsb2w, 0x01, 0x18, 0x10), GEN_VXFORM_300_EO(vextsh2w, 0x01, 0x18, 0x11), GEN_VXFORM_300_EO(vextsb2d, 0x01, 0x18, 0x18), From 14fd8ab26752c725b16766c823952e3138924293 Mon Sep 17 00:00:00 2001 From: Nikunj A Dadhania Date: Wed, 19 Oct 2016 11:36:47 +0530 Subject: [PATCH 15/73] target-ppc: implement xxbr[qdwh] instruction Add required helpers (GEN_XX2FORM_EO) for supporting this instruction. xxbrh: VSX Vector Byte-Reverse Halfword xxbrw: VSX Vector Byte-Reverse Word xxbrd: VSX Vector Byte-Reverse Doubleword xxbrq: VSX Vector Byte-Reverse Quadword Signed-off-by: Nikunj A Dadhania Reviewed-by: Richard Henderson Signed-off-by: David Gibson --- target-ppc/translate.c | 32 ++++++++++++ target-ppc/translate/vsx-impl.inc.c | 77 +++++++++++++++++++++++++++++ target-ppc/translate/vsx-ops.inc.c | 8 +++ 3 files changed, 117 insertions(+) diff --git a/target-ppc/translate.c b/target-ppc/translate.c index dab8f19a91..94989b2abd 100644 --- a/target-ppc/translate.c +++ b/target-ppc/translate.c @@ -376,6 +376,9 @@ GEN_OPCODE2(name, onam, opc1, opc2, opc3, inval, type, type2) #define GEN_HANDLER_E_2(name, opc1, opc2, opc3, opc4, inval, type, type2) \ GEN_OPCODE3(name, opc1, opc2, opc3, opc4, inval, type, type2) +#define GEN_HANDLER2_E_2(name, onam, opc1, opc2, opc3, opc4, inval, typ, typ2) \ +GEN_OPCODE4(name, onam, opc1, opc2, opc3, opc4, inval, typ, typ2) + typedef struct opcode_t { unsigned char opc1, opc2, opc3, opc4; #if HOST_LONG_BITS == 64 /* Explicitly align to 64 bits */ @@ -662,6 +665,21 @@ EXTRACT_HELPER(IMM8, 11, 8); }, \ .oname = stringify(name), \ } +#define GEN_OPCODE4(name, onam, op1, op2, op3, op4, invl, _typ, _typ2) \ +{ \ + .opc1 = op1, \ + .opc2 = op2, \ + .opc3 = op3, \ + .opc4 = op4, \ + .handler = { \ + .inval1 = invl, \ + .type = _typ, \ + .type2 = _typ2, \ + .handler = &gen_##name, \ + .oname = onam, \ + }, \ + .oname = onam, \ +} #else #define GEN_OPCODE(name, op1, op2, op3, invl, _typ, _typ2) \ { \ @@ -720,6 +738,20 @@ EXTRACT_HELPER(IMM8, 11, 8); }, \ .oname = stringify(name), \ } +#define GEN_OPCODE4(name, onam, op1, op2, op3, op4, invl, _typ, _typ2) \ +{ \ + .opc1 = op1, \ + .opc2 = op2, \ + .opc3 = op3, \ + .opc4 = op4, \ + .handler = { \ + .inval1 = invl, \ + .type = _typ, \ + .type2 = _typ2, \ + .handler = &gen_##name, \ + }, \ + .oname = onam, \ +} #endif /* SPR load/store helpers */ diff --git a/target-ppc/translate/vsx-impl.inc.c b/target-ppc/translate/vsx-impl.inc.c index 23ec1e115c..1508bd13e3 100644 --- a/target-ppc/translate/vsx-impl.inc.c +++ b/target-ppc/translate/vsx-impl.inc.c @@ -132,6 +132,22 @@ static void gen_bswap16x8(TCGv_i64 outh, TCGv_i64 outl, tcg_temp_free_i64(mask); } +static void gen_bswap32x4(TCGv_i64 outh, TCGv_i64 outl, + TCGv_i64 inh, TCGv_i64 inl) +{ + TCGv_i64 hi = tcg_temp_new_i64(); + TCGv_i64 lo = tcg_temp_new_i64(); + + tcg_gen_bswap64_i64(hi, inh); + tcg_gen_bswap64_i64(lo, inl); + tcg_gen_shri_i64(outh, hi, 32); + tcg_gen_deposit_i64(outh, outh, hi, 32, 32); + tcg_gen_shri_i64(outl, lo, 32); + tcg_gen_deposit_i64(outl, outl, lo, 32, 32); + + tcg_temp_free_i64(hi); + tcg_temp_free_i64(lo); +} static void gen_lxvh8x(DisasContext *ctx) { TCGv EA; @@ -717,6 +733,67 @@ GEN_VSX_HELPER_2(xvrspim, 0x12, 0x0B, 0, PPC2_VSX) GEN_VSX_HELPER_2(xvrspip, 0x12, 0x0A, 0, PPC2_VSX) GEN_VSX_HELPER_2(xvrspiz, 0x12, 0x09, 0, PPC2_VSX) +static void gen_xxbrd(DisasContext *ctx) +{ + TCGv_i64 xth = cpu_vsrh(xT(ctx->opcode)); + TCGv_i64 xtl = cpu_vsrl(xT(ctx->opcode)); + TCGv_i64 xbh = cpu_vsrh(xB(ctx->opcode)); + TCGv_i64 xbl = cpu_vsrl(xB(ctx->opcode)); + + if (unlikely(!ctx->vsx_enabled)) { + gen_exception(ctx, POWERPC_EXCP_VSXU); + return; + } + tcg_gen_bswap64_i64(xth, xbh); + tcg_gen_bswap64_i64(xtl, xbl); +} + +static void gen_xxbrh(DisasContext *ctx) +{ + TCGv_i64 xth = cpu_vsrh(xT(ctx->opcode)); + TCGv_i64 xtl = cpu_vsrl(xT(ctx->opcode)); + TCGv_i64 xbh = cpu_vsrh(xB(ctx->opcode)); + TCGv_i64 xbl = cpu_vsrl(xB(ctx->opcode)); + + if (unlikely(!ctx->vsx_enabled)) { + gen_exception(ctx, POWERPC_EXCP_VSXU); + return; + } + gen_bswap16x8(xth, xtl, xbh, xbl); +} + +static void gen_xxbrq(DisasContext *ctx) +{ + TCGv_i64 xth = cpu_vsrh(xT(ctx->opcode)); + TCGv_i64 xtl = cpu_vsrl(xT(ctx->opcode)); + TCGv_i64 xbh = cpu_vsrh(xB(ctx->opcode)); + TCGv_i64 xbl = cpu_vsrl(xB(ctx->opcode)); + TCGv_i64 t0 = tcg_temp_new_i64(); + + if (unlikely(!ctx->vsx_enabled)) { + gen_exception(ctx, POWERPC_EXCP_VSXU); + return; + } + tcg_gen_bswap64_i64(t0, xbl); + tcg_gen_bswap64_i64(xtl, xbh); + tcg_gen_mov_i64(xth, t0); + tcg_temp_free_i64(t0); +} + +static void gen_xxbrw(DisasContext *ctx) +{ + TCGv_i64 xth = cpu_vsrh(xT(ctx->opcode)); + TCGv_i64 xtl = cpu_vsrl(xT(ctx->opcode)); + TCGv_i64 xbh = cpu_vsrh(xB(ctx->opcode)); + TCGv_i64 xbl = cpu_vsrl(xB(ctx->opcode)); + + if (unlikely(!ctx->vsx_enabled)) { + gen_exception(ctx, POWERPC_EXCP_VSXU); + return; + } + gen_bswap32x4(xth, xtl, xbh, xbl); +} + #define VSX_LOGICAL(name, tcg_op) \ static void glue(gen_, name)(DisasContext * ctx) \ { \ diff --git a/target-ppc/translate/vsx-ops.inc.c b/target-ppc/translate/vsx-ops.inc.c index 10eb4b9470..af0d27e012 100644 --- a/target-ppc/translate/vsx-ops.inc.c +++ b/target-ppc/translate/vsx-ops.inc.c @@ -39,6 +39,10 @@ GEN_HANDLER2_E(name, #name, 0x3C, opc2 | 1, opc3, 0, PPC_NONE, fl2) GEN_HANDLER2_E(name, #name, 0x3C, opc2 | 0, opc3, 0, PPC_NONE, fl2), \ GEN_HANDLER2_E(name, #name, 0x3C, opc2 | 1, opc3, 0, PPC_NONE, fl2) +#define GEN_XX2FORM_EO(name, opc2, opc3, opc4, fl2) \ +GEN_HANDLER2_E_2(name, #name, 0x3C, opc2 | 0, opc3, opc4, 0, PPC_NONE, fl2), \ +GEN_HANDLER2_E_2(name, #name, 0x3C, opc2 | 1, opc3, opc4, 0, PPC_NONE, fl2) + #define GEN_XX3FORM(name, opc2, opc3, fl2) \ GEN_HANDLER2_E(name, #name, 0x3C, opc2 | 0, opc3, 0, PPC_NONE, fl2), \ GEN_HANDLER2_E(name, #name, 0x3C, opc2 | 1, opc3, 0, PPC_NONE, fl2), \ @@ -222,6 +226,10 @@ GEN_XX2FORM(xvrspic, 0x16, 0x0A, PPC2_VSX), GEN_XX2FORM(xvrspim, 0x12, 0x0B, PPC2_VSX), GEN_XX2FORM(xvrspip, 0x12, 0x0A, PPC2_VSX), GEN_XX2FORM(xvrspiz, 0x12, 0x09, PPC2_VSX), +GEN_XX2FORM_EO(xxbrh, 0x16, 0x1D, 0x07, PPC2_ISA300), +GEN_XX2FORM_EO(xxbrw, 0x16, 0x1D, 0x0F, PPC2_ISA300), +GEN_XX2FORM_EO(xxbrd, 0x16, 0x1D, 0x17, PPC2_ISA300), +GEN_XX2FORM_EO(xxbrq, 0x16, 0x1D, 0x1F, PPC2_ISA300), #define VSX_LOGICAL(name, opc2, opc3, fl2) \ GEN_XX3FORM(name, opc2, opc3, fl2) From 2bb0d10aebf2018d98b9413ab960dc8d728b2f5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= Date: Tue, 18 Oct 2016 10:06:32 +0200 Subject: [PATCH 16/73] ppc/xics: add a xics_set_nr_servers common routine MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit xics_spapr and xics_kvm nearly define the same 'set_nr_servers' handler. Only the type of the ICP differs. So let's make a common one to remove some duplicated code. Signed-off-by: Cédric Le Goater Signed-off-by: David Gibson --- hw/intc/xics.c | 24 +++++++++++++++++++++--- hw/intc/xics_kvm.c | 13 +------------ hw/intc/xics_spapr.c | 13 +------------ include/hw/ppc/xics.h | 2 ++ 4 files changed, 25 insertions(+), 27 deletions(-) diff --git a/hw/intc/xics.c b/hw/intc/xics.c index 7fac964fbd..c051eebb44 100644 --- a/hw/intc/xics.c +++ b/hw/intc/xics.c @@ -183,6 +183,24 @@ static void xics_prop_set_nr_irqs(Object *obj, Visitor *v, const char *name, info->set_nr_irqs(xics, value, errp); } +void xics_set_nr_servers(XICSState *xics, uint32_t nr_servers, + const char *typename, Error **errp) +{ + int i; + + xics->nr_servers = nr_servers; + + xics->ss = g_malloc0(xics->nr_servers * sizeof(ICPState)); + for (i = 0; i < xics->nr_servers; i++) { + char name[32]; + ICPState *icp = &xics->ss[i]; + + object_initialize(icp, sizeof(*icp), typename); + snprintf(name, sizeof(name), "icp[%d]", i); + object_property_add_child(OBJECT(xics), name, OBJECT(icp), errp); + } +} + static void xics_prop_get_nr_servers(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) @@ -198,7 +216,7 @@ static void xics_prop_set_nr_servers(Object *obj, Visitor *v, Error **errp) { XICSState *xics = XICS_COMMON(obj); - XICSStateClass *info = XICS_COMMON_GET_CLASS(xics); + XICSStateClass *xsc = XICS_COMMON_GET_CLASS(xics); Error *error = NULL; int64_t value; @@ -213,8 +231,8 @@ static void xics_prop_set_nr_servers(Object *obj, Visitor *v, return; } - assert(info->set_nr_servers); - info->set_nr_servers(xics, value, errp); + assert(xsc->set_nr_servers); + xsc->set_nr_servers(xics, value, errp); } static void xics_common_initfn(Object *obj) diff --git a/hw/intc/xics_kvm.c b/hw/intc/xics_kvm.c index 9c2f198fd1..17694eaa87 100644 --- a/hw/intc/xics_kvm.c +++ b/hw/intc/xics_kvm.c @@ -373,18 +373,7 @@ static void xics_kvm_set_nr_irqs(XICSState *xics, uint32_t nr_irqs, static void xics_kvm_set_nr_servers(XICSState *xics, uint32_t nr_servers, Error **errp) { - int i; - - xics->nr_servers = nr_servers; - - xics->ss = g_malloc0(xics->nr_servers * sizeof(ICPState)); - for (i = 0; i < xics->nr_servers; i++) { - char buffer[32]; - object_initialize(&xics->ss[i], sizeof(xics->ss[i]), TYPE_KVM_ICP); - snprintf(buffer, sizeof(buffer), "icp[%d]", i); - object_property_add_child(OBJECT(xics), buffer, OBJECT(&xics->ss[i]), - errp); - } + xics_set_nr_servers(xics, nr_servers, TYPE_KVM_ICP, errp); } static void rtas_dummy(PowerPCCPU *cpu, sPAPRMachineState *spapr, diff --git a/hw/intc/xics_spapr.c b/hw/intc/xics_spapr.c index e8d0623c2c..a09e1b033d 100644 --- a/hw/intc/xics_spapr.c +++ b/hw/intc/xics_spapr.c @@ -249,18 +249,7 @@ static void xics_spapr_set_nr_irqs(XICSState *xics, uint32_t nr_irqs, static void xics_spapr_set_nr_servers(XICSState *xics, uint32_t nr_servers, Error **errp) { - int i; - - xics->nr_servers = nr_servers; - - xics->ss = g_malloc0(xics->nr_servers * sizeof(ICPState)); - for (i = 0; i < xics->nr_servers; i++) { - char buffer[32]; - object_initialize(&xics->ss[i], sizeof(xics->ss[i]), TYPE_ICP); - snprintf(buffer, sizeof(buffer), "icp[%d]", i); - object_property_add_child(OBJECT(xics), buffer, OBJECT(&xics->ss[i]), - errp); - } + xics_set_nr_servers(xics, nr_servers, TYPE_ICP, errp); } static void xics_spapr_realize(DeviceState *dev, Error **errp) diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h index 66ae55ded3..573b192053 100644 --- a/include/hw/ppc/xics.h +++ b/include/hw/ppc/xics.h @@ -188,6 +188,8 @@ void xics_spapr_free(XICSState *icp, int irq, int num); void xics_cpu_setup(XICSState *icp, PowerPCCPU *cpu); void xics_cpu_destroy(XICSState *icp, PowerPCCPU *cpu); +void xics_set_nr_servers(XICSState *xics, uint32_t nr_servers, + const char *typename, Error **errp); /* Internal XICS interfaces */ int xics_get_cpu_index_by_dt_id(int cpu_dt_id); From d49c603b37e6c9d025f58c09f55d0c7cefe88987 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= Date: Tue, 18 Oct 2016 10:06:33 +0200 Subject: [PATCH 17/73] ppc/xics: add a XICSState backlink in ICPState MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The link will be used to change the API of the icp_* routines which are still using an XICSState as an argument. Signed-off-by: Cédric Le Goater Signed-off-by: David Gibson --- hw/intc/xics.c | 1 + include/hw/ppc/xics.h | 2 ++ 2 files changed, 3 insertions(+) diff --git a/hw/intc/xics.c b/hw/intc/xics.c index c051eebb44..9f2c81a7f1 100644 --- a/hw/intc/xics.c +++ b/hw/intc/xics.c @@ -198,6 +198,7 @@ void xics_set_nr_servers(XICSState *xics, uint32_t nr_servers, object_initialize(icp, sizeof(*icp), typename); snprintf(name, sizeof(name), "icp[%d]", i); object_property_add_child(OBJECT(xics), name, OBJECT(icp), errp); + icp->xics = xics; } } diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h index 573b192053..1468d6a890 100644 --- a/include/hw/ppc/xics.h +++ b/include/hw/ppc/xics.h @@ -117,6 +117,8 @@ struct ICPState { uint8_t mfrr; qemu_irq output; bool cap_irq_xics_enabled; + + XICSState *xics; }; #define TYPE_ICS_BASE "ics-base" From e3403258a20c61859ca1917bb86bc206e5846784 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= Date: Tue, 18 Oct 2016 10:06:34 +0200 Subject: [PATCH 18/73] ppc/xics: change the icp_ routines API to use an 'ICPState *' argument MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The routines : void icp_set_cppr(ICPState *icp, uint8_t cppr); void icp_set_mfrr(ICPState *icp, uint8_t mfrr); void icp_eoi(ICPState *icp, uint32_t xirr); now use one 'ICPState *icp' argument instead of a 'XICSState *' and a server arguments. The backlink on XICSState* is used whenever needed. Signed-off-by: Cédric Le Goater Signed-off-by: David Gibson --- hw/intc/xics.c | 25 ++++++++++--------------- hw/intc/xics_spapr.c | 18 +++++++++++------- include/hw/ppc/xics.h | 6 +++--- 3 files changed, 24 insertions(+), 25 deletions(-) diff --git a/hw/intc/xics.c b/hw/intc/xics.c index 9f2c81a7f1..095c16a300 100644 --- a/hw/intc/xics.c +++ b/hw/intc/xics.c @@ -326,22 +326,20 @@ static void icp_check_ipi(ICPState *ss) qemu_irq_raise(ss->output); } -static void icp_resend(XICSState *xics, int server) +static void icp_resend(ICPState *ss) { - ICPState *ss = xics->ss + server; ICSState *ics; if (ss->mfrr < CPPR(ss)) { icp_check_ipi(ss); } - QLIST_FOREACH(ics, &xics->ics, list) { + QLIST_FOREACH(ics, &ss->xics->ics, list) { ics_resend(ics); } } -void icp_set_cppr(XICSState *xics, int server, uint8_t cppr) +void icp_set_cppr(ICPState *ss, uint8_t cppr) { - ICPState *ss = xics->ss + server; uint8_t old_cppr; uint32_t old_xisr; @@ -361,15 +359,13 @@ void icp_set_cppr(XICSState *xics, int server, uint8_t cppr) } } else { if (!XISR(ss)) { - icp_resend(xics, server); + icp_resend(ss); } } } -void icp_set_mfrr(XICSState *xics, int server, uint8_t mfrr) +void icp_set_mfrr(ICPState *ss, uint8_t mfrr) { - ICPState *ss = xics->ss + server; - ss->mfrr = mfrr; if (mfrr < CPPR(ss)) { icp_check_ipi(ss); @@ -398,23 +394,22 @@ uint32_t icp_ipoll(ICPState *ss, uint32_t *mfrr) return ss->xirr; } -void icp_eoi(XICSState *xics, int server, uint32_t xirr) +void icp_eoi(ICPState *ss, uint32_t xirr) { - ICPState *ss = xics->ss + server; ICSState *ics; uint32_t irq; /* Send EOI -> ICS */ ss->xirr = (ss->xirr & ~CPPR_MASK) | (xirr & CPPR_MASK); - trace_xics_icp_eoi(server, xirr, ss->xirr); + trace_xics_icp_eoi(ss->cs->cpu_index, xirr, ss->xirr); irq = xirr & XISR_MASK; - QLIST_FOREACH(ics, &xics->ics, list) { + QLIST_FOREACH(ics, &ss->xics->ics, list) { if (ics_valid_irq(ics, irq)) { ics_eoi(ics, irq); } } if (!XISR(ss)) { - icp_resend(xics, server); + icp_resend(ss); } } @@ -673,7 +668,7 @@ static int ics_simple_post_load(ICSState *ics, int version_id) int i; for (i = 0; i < ics->xics->nr_servers; i++) { - icp_resend(ics->xics, i); + icp_resend(&ics->xics->ss[i]); } return 0; diff --git a/hw/intc/xics_spapr.c b/hw/intc/xics_spapr.c index a09e1b033d..b4e55012e0 100644 --- a/hw/intc/xics_spapr.c +++ b/hw/intc/xics_spapr.c @@ -43,9 +43,10 @@ static target_ulong h_cppr(PowerPCCPU *cpu, sPAPRMachineState *spapr, target_ulong opcode, target_ulong *args) { CPUState *cs = CPU(cpu); + ICPState *icp = &spapr->xics->ss[cs->cpu_index]; target_ulong cppr = args[0]; - icp_set_cppr(spapr->xics, cs->cpu_index, cppr); + icp_set_cppr(icp, cppr); return H_SUCCESS; } @@ -59,7 +60,7 @@ static target_ulong h_ipi(PowerPCCPU *cpu, sPAPRMachineState *spapr, return H_PARAMETER; } - icp_set_mfrr(spapr->xics, server, mfrr); + icp_set_mfrr(spapr->xics->ss + server, mfrr); return H_SUCCESS; } @@ -67,7 +68,8 @@ static target_ulong h_xirr(PowerPCCPU *cpu, sPAPRMachineState *spapr, target_ulong opcode, target_ulong *args) { CPUState *cs = CPU(cpu); - uint32_t xirr = icp_accept(spapr->xics->ss + cs->cpu_index); + ICPState *icp = &spapr->xics->ss[cs->cpu_index]; + uint32_t xirr = icp_accept(icp); args[0] = xirr; return H_SUCCESS; @@ -77,8 +79,8 @@ static target_ulong h_xirr_x(PowerPCCPU *cpu, sPAPRMachineState *spapr, target_ulong opcode, target_ulong *args) { CPUState *cs = CPU(cpu); - ICPState *ss = &spapr->xics->ss[cs->cpu_index]; - uint32_t xirr = icp_accept(ss); + ICPState *icp = &spapr->xics->ss[cs->cpu_index]; + uint32_t xirr = icp_accept(icp); args[0] = xirr; args[1] = cpu_get_host_ticks(); @@ -89,9 +91,10 @@ static target_ulong h_eoi(PowerPCCPU *cpu, sPAPRMachineState *spapr, target_ulong opcode, target_ulong *args) { CPUState *cs = CPU(cpu); + ICPState *icp = &spapr->xics->ss[cs->cpu_index]; target_ulong xirr = args[0]; - icp_eoi(spapr->xics, cs->cpu_index, xirr); + icp_eoi(icp, xirr); return H_SUCCESS; } @@ -99,8 +102,9 @@ static target_ulong h_ipoll(PowerPCCPU *cpu, sPAPRMachineState *spapr, target_ulong opcode, target_ulong *args) { CPUState *cs = CPU(cpu); + ICPState *icp = &spapr->xics->ss[cs->cpu_index]; uint32_t mfrr; - uint32_t xirr = icp_ipoll(spapr->xics->ss + cs->cpu_index, &mfrr); + uint32_t xirr = icp_ipoll(icp, &mfrr); args[0] = xirr; args[1] = mfrr; diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h index 1468d6a890..6e5a113332 100644 --- a/include/hw/ppc/xics.h +++ b/include/hw/ppc/xics.h @@ -196,11 +196,11 @@ void xics_set_nr_servers(XICSState *xics, uint32_t nr_servers, /* Internal XICS interfaces */ int xics_get_cpu_index_by_dt_id(int cpu_dt_id); -void icp_set_cppr(XICSState *icp, int server, uint8_t cppr); -void icp_set_mfrr(XICSState *icp, int server, uint8_t mfrr); +void icp_set_cppr(ICPState *icp, uint8_t cppr); +void icp_set_mfrr(ICPState *icp, uint8_t mfrr); uint32_t icp_accept(ICPState *ss); uint32_t icp_ipoll(ICPState *ss, uint32_t *mfrr); -void icp_eoi(XICSState *icp, int server, uint32_t xirr); +void icp_eoi(ICPState *icp, uint32_t xirr); void ics_simple_write_xive(ICSState *ics, int nr, int server, uint8_t priority, uint8_t saved_priority); From f85bcec31ee578eccf6182be158d6ac6d9b90a4c Mon Sep 17 00:00:00 2001 From: Nicholas Piggin Date: Thu, 20 Oct 2016 17:59:10 +1100 Subject: [PATCH 19/73] ppc: fix MSR_ME handling for system reset interrupt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Power ISA specifies ME bit handling for system reset interrupt: if the interrupt occurred while the thread was in power-saving mode, set to 1; otherwise not altered Power ISA 3.0, section 6.5 "Interrupt Definitions", Figure 64. Signed-off-by: Nicholas Piggin Reviewed-by: Greg Kurz Reviewed-by: Cédric Le Goater Signed-off-by: David Gibson --- target-ppc/excp_helper.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/target-ppc/excp_helper.c b/target-ppc/excp_helper.c index 921c39d33f..53c407576b 100644 --- a/target-ppc/excp_helper.c +++ b/target-ppc/excp_helper.c @@ -385,11 +385,11 @@ static inline void powerpc_excp(PowerPCCPU *cpu, int excp_model, int excp) srr1 = SPR_BOOKE_CSRR1; break; case POWERPC_EXCP_RESET: /* System reset exception */ + /* A power-saving exception sets ME, otherwise it is unchanged */ if (msr_pow) { /* indicate that we resumed from power save mode */ msr |= 0x10000; - } else { - new_msr &= ~((target_ulong)1 << MSR_ME); + new_msr |= ((target_ulong)1 << MSR_ME); } new_msr |= (target_ulong)MSR_HVB; From e763da234454c2bcdf065e360f69ca1d11d81224 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Thu, 20 Oct 2016 15:29:25 +1100 Subject: [PATCH 20/73] pseries: Remove unused callbacks from sPAPR VIO bus state The original QOMification of the spapr VIO devices in 3954d33 "spapr: convert to QEMU Object Model (v2)" moved some callbacks from the VIOsPAPRBus structure to the VIOsPAPRDeviceClass. Except, that it forgot to actually remove them from the VIOsPAPRBus structure (which still exists, though it doesn't fulfill quite the same function as it did pre-QOM). This patch removes those now unused callback fields. Signed-off-by: David Gibson Reviewed-by: Alexey Kardashevskiy Reviewed-by: Thomas Huth --- include/hw/ppc/spapr_vio.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/include/hw/ppc/spapr_vio.h b/include/hw/ppc/spapr_vio.h index 40d0e5f6a3..0b025fd66b 100644 --- a/include/hw/ppc/spapr_vio.h +++ b/include/hw/ppc/spapr_vio.h @@ -76,8 +76,6 @@ struct VIOsPAPRDevice { struct VIOsPAPRBus { BusState bus; uint32_t next_reg; - int (*init)(VIOsPAPRDevice *dev); - int (*devnode)(VIOsPAPRDevice *dev, void *fdt, int node_off); }; extern VIOsPAPRBus *spapr_vio_bus_init(void); From 1f0e657d3f108c4cbd0ae16cf18de8dcb801cc1a Mon Sep 17 00:00:00 2001 From: Benjamin Herrenschmidt Date: Sat, 6 Aug 2016 10:11:49 +1000 Subject: [PATCH 21/73] ppc: Fix single step with gdb stub Signed-off-by: Benjamin Herrenschmidt Signed-off-by: David Gibson --- target-ppc/translate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target-ppc/translate.c b/target-ppc/translate.c index 94989b2abd..43505a936c 100644 --- a/target-ppc/translate.c +++ b/target-ppc/translate.c @@ -322,7 +322,7 @@ static void gen_debug_exception(DisasContext *ctx) */ if ((ctx->exception != POWERPC_EXCP_BRANCH) && (ctx->exception != POWERPC_EXCP_SYNC)) { - gen_update_nip(ctx, ctx->nip - 4); + gen_update_nip(ctx, ctx->nip); } t0 = tcg_const_i32(EXCP_DEBUG); gen_helper_raise_exception(cpu_env, t0); From bcad45de6a0b5bf10a274872d2e45da3403232da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= Date: Sat, 22 Oct 2016 11:46:34 +0200 Subject: [PATCH 22/73] ppc: add skiboot firmware for the pnv platform MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is the initial image of skiboot 5.3.7 (commit 762d0082) for the PowerPC PowerNV (Non-Virtualized) platform. Built from submodule. Signed-off-by: Cédric Le Goater Signed-off-by: David Gibson --- .gitmodules | 3 +++ MAINTAINERS | 1 + Makefile | 2 +- pc-bios/README | 5 +++++ pc-bios/skiboot.lid | Bin 0 -> 983893 bytes roms/Makefile | 8 +++++++- roms/skiboot | 1 + 7 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 pc-bios/skiboot.lid create mode 160000 roms/skiboot diff --git a/.gitmodules b/.gitmodules index 9da9ede261..ca323b4d87 100644 --- a/.gitmodules +++ b/.gitmodules @@ -31,3 +31,6 @@ [submodule "roms/u-boot"] path = roms/u-boot url = git://git.qemu-project.org/u-boot.git +[submodule "roms/skiboot"] + path = roms/skiboot + url = git://git.qemu.org/skiboot.git diff --git a/MAINTAINERS b/MAINTAINERS index b01fec0a7b..280ee1fcd2 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -656,6 +656,7 @@ F: include/hw/*/xics* F: pc-bios/spapr-rtas/* F: pc-bios/spapr-rtas.bin F: pc-bios/slof.bin +F: pc-bios/skiboot.lid F: docs/specs/ppc-spapr-hcalls.txt F: docs/specs/ppc-spapr-hotplug.txt F: tests/spapr* diff --git a/Makefile b/Makefile index 3bcb0565b6..11f5154c81 100644 --- a/Makefile +++ b/Makefile @@ -421,7 +421,7 @@ qemu-icon.bmp qemu_logo_no_text.svg \ bamboo.dtb petalogix-s3adsp1800.dtb petalogix-ml605.dtb \ multiboot.bin linuxboot.bin linuxboot_dma.bin kvmvapic.bin \ s390-ccw.img \ -spapr-rtas.bin slof.bin \ +spapr-rtas.bin slof.bin skiboot.lid \ palcode-clipper \ u-boot.e500 else diff --git a/pc-bios/README b/pc-bios/README index 779192eb7c..47a913f9c7 100644 --- a/pc-bios/README +++ b/pc-bios/README @@ -42,3 +42,8 @@ it was compiled using the qemu-ppce500 target. A git mirror is available at: git://git.qemu-project.org/u-boot.git The hash used to compile the current version is: 2072e72 + +- Skiboot (https://github.com/open-power/skiboot/) is an OPAL + (OpenPower Abstraction Layer) firmware for OpenPOWER systems. It can + run an hypervisor OS or simply a host OS on the "baremetal" + platform, also known as the PowerNV (Non-Virtualized) platform. diff --git a/pc-bios/skiboot.lid b/pc-bios/skiboot.lid new file mode 100644 index 0000000000000000000000000000000000000000..0e59a8280d26342bc769f04e49dfccbed48ead1b GIT binary patch literal 983893 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

    EC?BX+IHdjLI+l2y?5MyTDZ={izooyuS8TU#$)7 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 z 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

    Wv-^bM)nWbL(099OIMikxv6L^o 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 literal 0 HcmV?d00001 diff --git a/roms/Makefile b/roms/Makefile index 88b3709d4d..b5e5a69e91 100644 --- a/roms/Makefile +++ b/roms/Makefile @@ -63,6 +63,7 @@ default: @echo " efirom -- update nic roms (bios+efi, this needs" @echo " the EfiRom utility from edk2 / tianocore)" @echo " slof -- update slof.bin" + @echo " skiboot -- update skiboot.lid" @echo " u-boot.e500 -- update u-boot.e500" bios: build-seabios-config-seabios-128k build-seabios-config-seabios-256k @@ -103,7 +104,7 @@ build-lgplvgabios: $(MAKE) -C vgabios $(vgabios_targets) -.PHONY: sgabios +.PHONY: sgabios skiboot sgabios: $(MAKE) -C sgabios cp sgabios/sgabios.bin ../pc-bios @@ -146,6 +147,10 @@ u-boot.e500: $(powerpc_cross_prefix)strip u-boot/build.e500/u-boot -o \ ../pc-bios/u-boot.e500 +skiboot: + $(MAKE) -C skiboot CROSS=$(powerpc64_cross_prefix) + cp skiboot/skiboot.lid ../pc-bios/skiboot.lid + clean: rm -rf seabios/.config seabios/out seabios/builds $(MAKE) -C vgabios clean @@ -155,3 +160,4 @@ clean: $(MAKE) -C ipxe/src veryclean $(MAKE) -C SLOF clean rm -rf u-boot/build.e500 + $(MAKE) -C skiboot clean diff --git a/roms/skiboot b/roms/skiboot new file mode 160000 index 0000000000..762d0082f1 --- /dev/null +++ b/roms/skiboot @@ -0,0 +1 @@ +Subproject commit 762d0082f18e4fb921a2d44a1051b02d8b0f6381 From 225a9ab8833e5191d180e23a23b8fb381fbaf9c3 Mon Sep 17 00:00:00 2001 From: Alexey Kardashevskiy Date: Wed, 26 Oct 2016 13:18:03 +1100 Subject: [PATCH 23/73] configure, ppc64: Copy skiboot.lid to build directory when configuring When configured to compile out of tree, the configure script copies BIOS blobs to the build directory. However since the PPC64 powernv machine ROM has .lid extension, it is ignored and "make check" fails when trying the powernv machine. This adds *.lid to the list of copied blobs. Signed-off-by: Alexey Kardashevskiy Signed-off-by: David Gibson --- configure | 1 + 1 file changed, 1 insertion(+) diff --git a/configure b/configure index 8e10059607..7b8e77f45b 100755 --- a/configure +++ b/configure @@ -6131,6 +6131,7 @@ FILES="$FILES roms/seabios/Makefile roms/vgabios/Makefile" FILES="$FILES pc-bios/qemu-icon.bmp" for bios_file in \ $source_path/pc-bios/*.bin \ + $source_path/pc-bios/*.lid \ $source_path/pc-bios/*.aml \ $source_path/pc-bios/*.rom \ $source_path/pc-bios/*.dtb \ From 9e933f4a620ca485356205f5cac8a6c3db0b861d Mon Sep 17 00:00:00 2001 From: Benjamin Herrenschmidt Date: Sat, 22 Oct 2016 11:46:35 +0200 Subject: [PATCH 24/73] ppc/pnv: add skeleton PowerNV platform MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The goal is to emulate a PowerNV system at the level of the skiboot firmware, which loads the OS and provides some runtime services. Power Systems have a lower firmware (HostBoot) that does low level system initialization, like DRAM training. This is beyond the scope of what qemu will address in a PowerNV guest. No devices yet, not even an interrupt controller. Just to get started, some RAM to load the skiboot firmware, the kernel and initrd. The device tree is fully created in the machine reset op. Signed-off-by: Benjamin Herrenschmidt [clg: - updated for qemu-2.7 - replaced fprintf by error_report - used a common definition of _FDT macro - removed VMStateDescription as migration is not yet supported - added IBM Copyright statements - reworked kernel_filename handling - merged PnvSystem and sPowerNVMachineState - removed PHANDLE_XICP - added ppc_create_page_sizes_prop helper - removed nmi support - removed kvm support - updated powernv machine to version 2.8 - removed chips and cpus, They will be provided in another patches - added a machine reset routine to initialize the device tree (also) - french has a squelette and english a skeleton. - improved commit log. - reworked prototypes parameters - added a check on the ram size (thanks to Michael Ellerman) - fixed chip-id cell - changed MAX_CPUS to 2048 - simplified memory node creation to one node only - removed machine version - rewrote the device tree creation with the fdt "rw" routines - s/sPowerNVMachineState/PnvMachineState/ - etc.] Signed-off-by: Cédric Le Goater Reviewed-by: David Gibson Signed-off-by: David Gibson --- default-configs/ppc64-softmmu.mak | 1 + hw/ppc/Makefile.objs | 2 + hw/ppc/pnv.c | 226 ++++++++++++++++++++++++++++++ include/hw/ppc/pnv.h | 38 +++++ 4 files changed, 267 insertions(+) create mode 100644 hw/ppc/pnv.c create mode 100644 include/hw/ppc/pnv.h diff --git a/default-configs/ppc64-softmmu.mak b/default-configs/ppc64-softmmu.mak index db5a4d6f5e..67a9bcaa67 100644 --- a/default-configs/ppc64-softmmu.mak +++ b/default-configs/ppc64-softmmu.mak @@ -39,6 +39,7 @@ CONFIG_I8259=y CONFIG_XILINX=y CONFIG_XILINX_ETHLITE=y CONFIG_PSERIES=y +CONFIG_POWERNV=y CONFIG_PREP=y CONFIG_MAC=y CONFIG_E500=y diff --git a/hw/ppc/Makefile.objs b/hw/ppc/Makefile.objs index 99a0d4e581..8105db7d56 100644 --- a/hw/ppc/Makefile.objs +++ b/hw/ppc/Makefile.objs @@ -5,6 +5,8 @@ obj-$(CONFIG_PSERIES) += spapr.o spapr_vio.o spapr_events.o obj-$(CONFIG_PSERIES) += spapr_hcall.o spapr_iommu.o spapr_rtas.o obj-$(CONFIG_PSERIES) += spapr_pci.o spapr_rtc.o spapr_drc.o spapr_rng.o obj-$(CONFIG_PSERIES) += spapr_cpu_core.o +# IBM PowerNV +obj-$(CONFIG_POWERNV) += pnv.o ifeq ($(CONFIG_PCI)$(CONFIG_PSERIES)$(CONFIG_LINUX), yyy) obj-y += spapr_pci_vfio.o endif diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c new file mode 100644 index 0000000000..8d9850989b --- /dev/null +++ b/hw/ppc/pnv.c @@ -0,0 +1,226 @@ +/* + * QEMU PowerPC PowerNV machine model + * + * Copyright (c) 2016, IBM Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "sysemu/sysemu.h" +#include "sysemu/numa.h" +#include "hw/hw.h" +#include "target-ppc/cpu.h" +#include "qemu/log.h" +#include "hw/ppc/fdt.h" +#include "hw/ppc/ppc.h" +#include "hw/ppc/pnv.h" +#include "hw/loader.h" +#include "exec/address-spaces.h" +#include "qemu/cutils.h" + +#include + +#define FDT_MAX_SIZE 0x00100000 + +#define FW_FILE_NAME "skiboot.lid" +#define FW_LOAD_ADDR 0x0 +#define FW_MAX_SIZE 0x00400000 + +#define KERNEL_LOAD_ADDR 0x20000000 +#define INITRD_LOAD_ADDR 0x40000000 + +/* + * On Power Systems E880 (POWER8), the max cpus (threads) should be : + * 4 * 4 sockets * 12 cores * 8 threads = 1536 + * Let's make it 2^11 + */ +#define MAX_CPUS 2048 + +/* + * Memory nodes are created by hostboot, one for each range of memory + * that has a different "affinity". In practice, it means one range + * per chip. + */ +static void powernv_populate_memory_node(void *fdt, int chip_id, hwaddr start, + hwaddr size) +{ + char *mem_name; + uint64_t mem_reg_property[2]; + int off; + + mem_reg_property[0] = cpu_to_be64(start); + mem_reg_property[1] = cpu_to_be64(size); + + mem_name = g_strdup_printf("memory@%"HWADDR_PRIx, start); + off = fdt_add_subnode(fdt, 0, mem_name); + g_free(mem_name); + + _FDT((fdt_setprop_string(fdt, off, "device_type", "memory"))); + _FDT((fdt_setprop(fdt, off, "reg", mem_reg_property, + sizeof(mem_reg_property)))); + _FDT((fdt_setprop_cell(fdt, off, "ibm,chip-id", chip_id))); +} + +static void *powernv_create_fdt(MachineState *machine) +{ + const char plat_compat[] = "qemu,powernv\0ibm,powernv"; + PnvMachineState *pnv = POWERNV_MACHINE(machine); + void *fdt; + char *buf; + int off; + + fdt = g_malloc0(FDT_MAX_SIZE); + _FDT((fdt_create_empty_tree(fdt, FDT_MAX_SIZE))); + + /* Root node */ + _FDT((fdt_setprop_cell(fdt, 0, "#address-cells", 0x2))); + _FDT((fdt_setprop_cell(fdt, 0, "#size-cells", 0x2))); + _FDT((fdt_setprop_string(fdt, 0, "model", + "IBM PowerNV (emulated by qemu)"))); + _FDT((fdt_setprop(fdt, 0, "compatible", plat_compat, + sizeof(plat_compat)))); + + buf = qemu_uuid_unparse_strdup(&qemu_uuid); + _FDT((fdt_setprop_string(fdt, 0, "vm,uuid", buf))); + if (qemu_uuid_set) { + _FDT((fdt_property_string(fdt, "system-id", buf))); + } + g_free(buf); + + off = fdt_add_subnode(fdt, 0, "chosen"); + if (machine->kernel_cmdline) { + _FDT((fdt_setprop_string(fdt, off, "bootargs", + machine->kernel_cmdline))); + } + + if (pnv->initrd_size) { + uint32_t start_prop = cpu_to_be32(pnv->initrd_base); + uint32_t end_prop = cpu_to_be32(pnv->initrd_base + pnv->initrd_size); + + _FDT((fdt_setprop(fdt, off, "linux,initrd-start", + &start_prop, sizeof(start_prop)))); + _FDT((fdt_setprop(fdt, off, "linux,initrd-end", + &end_prop, sizeof(end_prop)))); + } + + /* TODO: put all the memory in one node on chip 0 until we find a + * way to specify different ranges for each chip + */ + powernv_populate_memory_node(fdt, 0, 0, machine->ram_size); + + return fdt; +} + +static void ppc_powernv_reset(void) +{ + MachineState *machine = MACHINE(qdev_get_machine()); + void *fdt; + + qemu_devices_reset(); + + fdt = powernv_create_fdt(machine); + + /* Pack resulting tree */ + _FDT((fdt_pack(fdt))); + + cpu_physical_memory_write(PNV_FDT_ADDR, fdt, fdt_totalsize(fdt)); +} + +static void ppc_powernv_init(MachineState *machine) +{ + PnvMachineState *pnv = POWERNV_MACHINE(machine); + MemoryRegion *ram; + char *fw_filename; + long fw_size; + + /* allocate RAM */ + if (machine->ram_size < (1 * G_BYTE)) { + error_report("Warning: skiboot may not work with < 1GB of RAM"); + } + + ram = g_new(MemoryRegion, 1); + memory_region_allocate_system_memory(ram, NULL, "ppc_powernv.ram", + machine->ram_size); + memory_region_add_subregion(get_system_memory(), 0, ram); + + /* load skiboot firmware */ + if (bios_name == NULL) { + bios_name = FW_FILE_NAME; + } + + fw_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name); + + fw_size = load_image_targphys(fw_filename, FW_LOAD_ADDR, FW_MAX_SIZE); + if (fw_size < 0) { + hw_error("qemu: could not load OPAL '%s'\n", fw_filename); + exit(1); + } + g_free(fw_filename); + + /* load kernel */ + if (machine->kernel_filename) { + long kernel_size; + + kernel_size = load_image_targphys(machine->kernel_filename, + KERNEL_LOAD_ADDR, 0x2000000); + if (kernel_size < 0) { + hw_error("qemu: could not load kernel'%s'\n", + machine->kernel_filename); + exit(1); + } + } + + /* load initrd */ + if (machine->initrd_filename) { + pnv->initrd_base = INITRD_LOAD_ADDR; + pnv->initrd_size = load_image_targphys(machine->initrd_filename, + pnv->initrd_base, 0x10000000); /* 128MB max */ + if (pnv->initrd_size < 0) { + error_report("qemu: could not load initial ram disk '%s'", + machine->initrd_filename); + exit(1); + } + } +} + +static void powernv_machine_class_init(ObjectClass *oc, void *data) +{ + MachineClass *mc = MACHINE_CLASS(oc); + + mc->desc = "IBM PowerNV (Non-Virtualized)"; + mc->init = ppc_powernv_init; + mc->reset = ppc_powernv_reset; + mc->max_cpus = MAX_CPUS; + mc->block_default_type = IF_IDE; /* Pnv provides a AHCI device for + * storage */ + mc->no_parallel = 1; + mc->default_boot_order = NULL; + mc->default_ram_size = 1 * G_BYTE; +} + +static const TypeInfo powernv_machine_info = { + .name = TYPE_POWERNV_MACHINE, + .parent = TYPE_MACHINE, + .instance_size = sizeof(PnvMachineState), + .class_init = powernv_machine_class_init, +}; + +static void powernv_machine_register_types(void) +{ + type_register_static(&powernv_machine_info); +} + +type_init(powernv_machine_register_types) diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h new file mode 100644 index 0000000000..474fe9c697 --- /dev/null +++ b/include/hw/ppc/pnv.h @@ -0,0 +1,38 @@ +/* + * QEMU PowerPC PowerNV various definitions + * + * Copyright (c) 2014-2016 BenH, IBM Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +#ifndef _PPC_PNV_H +#define _PPC_PNV_H + +#include "hw/boards.h" + +#define TYPE_POWERNV_MACHINE MACHINE_TYPE_NAME("powernv") +#define POWERNV_MACHINE(obj) \ + OBJECT_CHECK(PnvMachineState, (obj), TYPE_POWERNV_MACHINE) + +typedef struct PnvMachineState { + /*< private >*/ + MachineState parent_obj; + + uint32_t initrd_base; + long initrd_size; +} PnvMachineState; + +#define PNV_FDT_ADDR 0x01000000 + +#endif /* _PPC_PNV_H */ From e997040e3f02f6d1c6ab76e569f3593f5e3670fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= Date: Sat, 22 Oct 2016 11:46:36 +0200 Subject: [PATCH 25/73] ppc/pnv: add a PnvChip object MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is is an abstraction of a POWER8 chip which is a set of cores plus other 'units', like the pervasive unit, the interrupt controller, the memory controller, the on-chip microcontroller, etc. The whole can be seen as a socket. It depends on a cpu model and its characteristics: max cores and specific inits are defined in a PnvChipClass. We start with an near empty PnvChip with only a few cpu constants which we will grow in the subsequent patches with the controllers required to run the system. The Chip CFAM (Common FRU Access Module) ID gives the model of the chip and its version number. It is generally the first thing firmwares fetch, available at XSCOM PCB address 0xf000f, to start initialization. Signed-off-by: Cédric Le Goater Reviewed-by: David Gibson Signed-off-by: David Gibson --- hw/ppc/pnv.c | 213 ++++++++++++++++++++++++++++++++++++++++++- include/hw/ppc/pnv.h | 63 +++++++++++++ 2 files changed, 271 insertions(+), 5 deletions(-) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 8d9850989b..aeafd7e894 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -30,6 +30,7 @@ #include "hw/loader.h" #include "exec/address-spaces.h" #include "qemu/cutils.h" +#include "qapi/visitor.h" #include @@ -74,6 +75,14 @@ static void powernv_populate_memory_node(void *fdt, int chip_id, hwaddr start, _FDT((fdt_setprop_cell(fdt, off, "ibm,chip-id", chip_id))); } +static void powernv_populate_chip(PnvChip *chip, void *fdt) +{ + if (chip->ram_size) { + powernv_populate_memory_node(fdt, chip->chip_id, chip->ram_start, + chip->ram_size); + } +} + static void *powernv_create_fdt(MachineState *machine) { const char plat_compat[] = "qemu,powernv\0ibm,powernv"; @@ -81,6 +90,7 @@ static void *powernv_create_fdt(MachineState *machine) void *fdt; char *buf; int off; + int i; fdt = g_malloc0(FDT_MAX_SIZE); _FDT((fdt_create_empty_tree(fdt, FDT_MAX_SIZE))); @@ -116,11 +126,10 @@ static void *powernv_create_fdt(MachineState *machine) &end_prop, sizeof(end_prop)))); } - /* TODO: put all the memory in one node on chip 0 until we find a - * way to specify different ranges for each chip - */ - powernv_populate_memory_node(fdt, 0, 0, machine->ram_size); - + /* Populate device tree for each chip */ + for (i = 0; i < pnv->num_chips; i++) { + powernv_populate_chip(pnv->chips[i], fdt); + } return fdt; } @@ -145,6 +154,8 @@ static void ppc_powernv_init(MachineState *machine) MemoryRegion *ram; char *fw_filename; long fw_size; + int i; + char *chip_typename; /* allocate RAM */ if (machine->ram_size < (1 * G_BYTE)) { @@ -194,6 +205,190 @@ static void ppc_powernv_init(MachineState *machine) exit(1); } } + + /* We need some cpu model to instantiate the PnvChip class */ + if (machine->cpu_model == NULL) { + machine->cpu_model = "POWER8"; + } + + /* Create the processor chips */ + chip_typename = g_strdup_printf(TYPE_PNV_CHIP "-%s", machine->cpu_model); + if (!object_class_by_name(chip_typename)) { + error_report("qemu: invalid CPU model '%s' for %s machine", + machine->cpu_model, MACHINE_GET_CLASS(machine)->name); + exit(1); + } + + pnv->chips = g_new0(PnvChip *, pnv->num_chips); + for (i = 0; i < pnv->num_chips; i++) { + char chip_name[32]; + Object *chip = object_new(chip_typename); + + pnv->chips[i] = PNV_CHIP(chip); + + /* TODO: put all the memory in one node on chip 0 until we find a + * way to specify different ranges for each chip + */ + if (i == 0) { + object_property_set_int(chip, machine->ram_size, "ram-size", + &error_fatal); + } + + snprintf(chip_name, sizeof(chip_name), "chip[%d]", PNV_CHIP_HWID(i)); + object_property_add_child(OBJECT(pnv), chip_name, chip, &error_fatal); + object_property_set_int(chip, PNV_CHIP_HWID(i), "chip-id", + &error_fatal); + object_property_set_bool(chip, true, "realized", &error_fatal); + } + g_free(chip_typename); +} + +static void pnv_chip_power8e_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + PnvChipClass *k = PNV_CHIP_CLASS(klass); + + k->cpu_model = "POWER8E"; + k->chip_type = PNV_CHIP_POWER8E; + k->chip_cfam_id = 0x221ef04980000000ull; /* P8 Murano DD2.1 */ + dc->desc = "PowerNV Chip POWER8E"; +} + +static const TypeInfo pnv_chip_power8e_info = { + .name = TYPE_PNV_CHIP_POWER8E, + .parent = TYPE_PNV_CHIP, + .instance_size = sizeof(PnvChip), + .class_init = pnv_chip_power8e_class_init, +}; + +static void pnv_chip_power8_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + PnvChipClass *k = PNV_CHIP_CLASS(klass); + + k->cpu_model = "POWER8"; + k->chip_type = PNV_CHIP_POWER8; + k->chip_cfam_id = 0x220ea04980000000ull; /* P8 Venice DD2.0 */ + dc->desc = "PowerNV Chip POWER8"; +} + +static const TypeInfo pnv_chip_power8_info = { + .name = TYPE_PNV_CHIP_POWER8, + .parent = TYPE_PNV_CHIP, + .instance_size = sizeof(PnvChip), + .class_init = pnv_chip_power8_class_init, +}; + +static void pnv_chip_power8nvl_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + PnvChipClass *k = PNV_CHIP_CLASS(klass); + + k->cpu_model = "POWER8NVL"; + k->chip_type = PNV_CHIP_POWER8NVL; + k->chip_cfam_id = 0x120d304980000000ull; /* P8 Naples DD1.0 */ + dc->desc = "PowerNV Chip POWER8NVL"; +} + +static const TypeInfo pnv_chip_power8nvl_info = { + .name = TYPE_PNV_CHIP_POWER8NVL, + .parent = TYPE_PNV_CHIP, + .instance_size = sizeof(PnvChip), + .class_init = pnv_chip_power8nvl_class_init, +}; + +static void pnv_chip_power9_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + PnvChipClass *k = PNV_CHIP_CLASS(klass); + + k->cpu_model = "POWER9"; + k->chip_type = PNV_CHIP_POWER9; + k->chip_cfam_id = 0x100d104980000000ull; /* P9 Nimbus DD1.0 */ + dc->desc = "PowerNV Chip POWER9"; +} + +static const TypeInfo pnv_chip_power9_info = { + .name = TYPE_PNV_CHIP_POWER9, + .parent = TYPE_PNV_CHIP, + .instance_size = sizeof(PnvChip), + .class_init = pnv_chip_power9_class_init, +}; + +static void pnv_chip_realize(DeviceState *dev, Error **errp) +{ + /* left purposely empty */ +} + +static Property pnv_chip_properties[] = { + DEFINE_PROP_UINT32("chip-id", PnvChip, chip_id, 0), + DEFINE_PROP_UINT64("ram-start", PnvChip, ram_start, 0), + DEFINE_PROP_UINT64("ram-size", PnvChip, ram_size, 0), + DEFINE_PROP_END_OF_LIST(), +}; + +static void pnv_chip_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + + dc->realize = pnv_chip_realize; + dc->props = pnv_chip_properties; + dc->desc = "PowerNV Chip"; +} + +static const TypeInfo pnv_chip_info = { + .name = TYPE_PNV_CHIP, + .parent = TYPE_SYS_BUS_DEVICE, + .class_init = pnv_chip_class_init, + .class_size = sizeof(PnvChipClass), + .abstract = true, +}; + +static void pnv_get_num_chips(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + visit_type_uint32(v, name, &POWERNV_MACHINE(obj)->num_chips, errp); +} + +static void pnv_set_num_chips(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + PnvMachineState *pnv = POWERNV_MACHINE(obj); + uint32_t num_chips; + Error *local_err = NULL; + + visit_type_uint32(v, name, &num_chips, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + /* + * TODO: should we decide on how many chips we can create based + * on #cores and Venice vs. Murano vs. Naples chip type etc..., + */ + if (!is_power_of_2(num_chips) || num_chips > 4) { + error_setg(errp, "invalid number of chips: '%d'", num_chips); + return; + } + + pnv->num_chips = num_chips; +} + +static void powernv_machine_initfn(Object *obj) +{ + PnvMachineState *pnv = POWERNV_MACHINE(obj); + pnv->num_chips = 1; +} + +static void powernv_machine_class_props_init(ObjectClass *oc) +{ + object_class_property_add(oc, "num-chips", "uint32_t", + pnv_get_num_chips, pnv_set_num_chips, + NULL, NULL, NULL); + object_class_property_set_description(oc, "num-chips", + "Specifies the number of processor chips", + NULL); } static void powernv_machine_class_init(ObjectClass *oc, void *data) @@ -209,18 +404,26 @@ static void powernv_machine_class_init(ObjectClass *oc, void *data) mc->no_parallel = 1; mc->default_boot_order = NULL; mc->default_ram_size = 1 * G_BYTE; + + powernv_machine_class_props_init(oc); } static const TypeInfo powernv_machine_info = { .name = TYPE_POWERNV_MACHINE, .parent = TYPE_MACHINE, .instance_size = sizeof(PnvMachineState), + .instance_init = powernv_machine_initfn, .class_init = powernv_machine_class_init, }; static void powernv_machine_register_types(void) { type_register_static(&powernv_machine_info); + type_register_static(&pnv_chip_info); + type_register_static(&pnv_chip_power8e_info); + type_register_static(&pnv_chip_power8_info); + type_register_static(&pnv_chip_power8nvl_info); + type_register_static(&pnv_chip_power9_info); } type_init(powernv_machine_register_types) diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index 474fe9c697..7189961e1f 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -20,6 +20,66 @@ #define _PPC_PNV_H #include "hw/boards.h" +#include "hw/sysbus.h" + +#define TYPE_PNV_CHIP "powernv-chip" +#define PNV_CHIP(obj) OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP) +#define PNV_CHIP_CLASS(klass) \ + OBJECT_CLASS_CHECK(PnvChipClass, (klass), TYPE_PNV_CHIP) +#define PNV_CHIP_GET_CLASS(obj) \ + OBJECT_GET_CLASS(PnvChipClass, (obj), TYPE_PNV_CHIP) + +typedef enum PnvChipType { + PNV_CHIP_POWER8E, /* AKA Murano (default) */ + PNV_CHIP_POWER8, /* AKA Venice */ + PNV_CHIP_POWER8NVL, /* AKA Naples */ + PNV_CHIP_POWER9, /* AKA Nimbus */ +} PnvChipType; + +typedef struct PnvChip { + /*< private >*/ + SysBusDevice parent_obj; + + /*< public >*/ + uint32_t chip_id; + uint64_t ram_start; + uint64_t ram_size; +} PnvChip; + +typedef struct PnvChipClass { + /*< private >*/ + SysBusDeviceClass parent_class; + + /*< public >*/ + const char *cpu_model; + PnvChipType chip_type; + uint64_t chip_cfam_id; +} PnvChipClass; + +#define TYPE_PNV_CHIP_POWER8E TYPE_PNV_CHIP "-POWER8E" +#define PNV_CHIP_POWER8E(obj) \ + OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP_POWER8E) + +#define TYPE_PNV_CHIP_POWER8 TYPE_PNV_CHIP "-POWER8" +#define PNV_CHIP_POWER8(obj) \ + OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP_POWER8) + +#define TYPE_PNV_CHIP_POWER8NVL TYPE_PNV_CHIP "-POWER8NVL" +#define PNV_CHIP_POWER8NVL(obj) \ + OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP_POWER8NVL) + +#define TYPE_PNV_CHIP_POWER9 TYPE_PNV_CHIP "-POWER9" +#define PNV_CHIP_POWER9(obj) \ + OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP_POWER9) + +/* + * This generates a HW chip id depending on an index: + * + * 0x0, 0x1, 0x10, 0x11 + * + * 4 chips should be the maximum + */ +#define PNV_CHIP_HWID(i) ((((i) & 0x3e) << 3) | ((i) & 0x1)) #define TYPE_POWERNV_MACHINE MACHINE_TYPE_NAME("powernv") #define POWERNV_MACHINE(obj) \ @@ -31,6 +91,9 @@ typedef struct PnvMachineState { uint32_t initrd_base; long initrd_size; + + uint32_t num_chips; + PnvChip **chips; } PnvMachineState; #define PNV_FDT_ADDR 0x01000000 From 397a79e7575c4ea98507ff9d1d2629b58725d484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= Date: Sat, 22 Oct 2016 11:46:37 +0200 Subject: [PATCH 26/73] ppc/pnv: add a core mask to PnvChip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This will be used to build real HW ids for the cores and enforce some limits on the available cores per chip. Signed-off-by: Cédric Le Goater Reviewed-by: David Gibson Signed-off-by: David Gibson --- hw/ppc/pnv.c | 73 +++++++++++++++++++++++++++++++++++++++++++- include/hw/ppc/pnv.h | 4 +++ 2 files changed, 76 insertions(+), 1 deletion(-) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index aeafd7e894..1705699ef8 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -238,11 +238,38 @@ static void ppc_powernv_init(MachineState *machine) object_property_add_child(OBJECT(pnv), chip_name, chip, &error_fatal); object_property_set_int(chip, PNV_CHIP_HWID(i), "chip-id", &error_fatal); + object_property_set_int(chip, smp_cores, "nr-cores", &error_fatal); object_property_set_bool(chip, true, "realized", &error_fatal); } g_free(chip_typename); } +/* Allowed core identifiers on a POWER8 Processor Chip : + * + * + * EX1 - Venice only + * EX2 - Venice only + * EX3 - Venice only + * EX4 + * EX5 + * EX6 + * + * EX9 - Venice only + * EX10 - Venice only + * EX11 - Venice only + * EX12 + * EX13 + * EX14 + * + */ +#define POWER8E_CORE_MASK (0x7070ull) +#define POWER8_CORE_MASK (0x7e7eull) + +/* + * POWER9 has 24 cores, ids starting at 0x20 + */ +#define POWER9_CORE_MASK (0xffffff00000000ull) + static void pnv_chip_power8e_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); @@ -251,6 +278,7 @@ static void pnv_chip_power8e_class_init(ObjectClass *klass, void *data) k->cpu_model = "POWER8E"; k->chip_type = PNV_CHIP_POWER8E; k->chip_cfam_id = 0x221ef04980000000ull; /* P8 Murano DD2.1 */ + k->cores_mask = POWER8E_CORE_MASK; dc->desc = "PowerNV Chip POWER8E"; } @@ -269,6 +297,7 @@ static void pnv_chip_power8_class_init(ObjectClass *klass, void *data) k->cpu_model = "POWER8"; k->chip_type = PNV_CHIP_POWER8; k->chip_cfam_id = 0x220ea04980000000ull; /* P8 Venice DD2.0 */ + k->cores_mask = POWER8_CORE_MASK; dc->desc = "PowerNV Chip POWER8"; } @@ -287,6 +316,7 @@ static void pnv_chip_power8nvl_class_init(ObjectClass *klass, void *data) k->cpu_model = "POWER8NVL"; k->chip_type = PNV_CHIP_POWER8NVL; k->chip_cfam_id = 0x120d304980000000ull; /* P8 Naples DD1.0 */ + k->cores_mask = POWER8_CORE_MASK; dc->desc = "PowerNV Chip POWER8NVL"; } @@ -305,6 +335,7 @@ static void pnv_chip_power9_class_init(ObjectClass *klass, void *data) k->cpu_model = "POWER9"; k->chip_type = PNV_CHIP_POWER9; k->chip_cfam_id = 0x100d104980000000ull; /* P9 Nimbus DD1.0 */ + k->cores_mask = POWER9_CORE_MASK; dc->desc = "PowerNV Chip POWER9"; } @@ -315,15 +346,55 @@ static const TypeInfo pnv_chip_power9_info = { .class_init = pnv_chip_power9_class_init, }; +static void pnv_chip_core_sanitize(PnvChip *chip, Error **errp) +{ + PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip); + int cores_max; + + /* + * No custom mask for this chip, let's use the default one from * + * the chip class + */ + if (!chip->cores_mask) { + chip->cores_mask = pcc->cores_mask; + } + + /* filter alien core ids ! some are reserved */ + if ((chip->cores_mask & pcc->cores_mask) != chip->cores_mask) { + error_setg(errp, "warning: invalid core mask for chip Ox%"PRIx64" !", + chip->cores_mask); + return; + } + chip->cores_mask &= pcc->cores_mask; + + /* now that we have a sane layout, let check the number of cores */ + cores_max = hweight_long(chip->cores_mask); + if (chip->nr_cores > cores_max) { + error_setg(errp, "warning: too many cores for chip ! Limit is %d", + cores_max); + return; + } +} + static void pnv_chip_realize(DeviceState *dev, Error **errp) { - /* left purposely empty */ + PnvChip *chip = PNV_CHIP(dev); + Error *error = NULL; + + /* Early checks on the core settings */ + pnv_chip_core_sanitize(chip, &error); + if (error) { + error_propagate(errp, error); + return; + } } static Property pnv_chip_properties[] = { DEFINE_PROP_UINT32("chip-id", PnvChip, chip_id, 0), DEFINE_PROP_UINT64("ram-start", PnvChip, ram_start, 0), DEFINE_PROP_UINT64("ram-size", PnvChip, ram_size, 0), + DEFINE_PROP_UINT32("nr-cores", PnvChip, nr_cores, 1), + DEFINE_PROP_UINT64("cores-mask", PnvChip, cores_mask, 0x0), DEFINE_PROP_END_OF_LIST(), }; diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index 7189961e1f..e084a8c303 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -44,6 +44,9 @@ typedef struct PnvChip { uint32_t chip_id; uint64_t ram_start; uint64_t ram_size; + + uint32_t nr_cores; + uint64_t cores_mask; } PnvChip; typedef struct PnvChipClass { @@ -54,6 +57,7 @@ typedef struct PnvChipClass { const char *cpu_model; PnvChipType chip_type; uint64_t chip_cfam_id; + uint64_t cores_mask; } PnvChipClass; #define TYPE_PNV_CHIP_POWER8E TYPE_PNV_CHIP "-POWER8E" From 631adaff31d9e127fecccb4a811c20ae13cd7194 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= Date: Sat, 22 Oct 2016 11:46:38 +0200 Subject: [PATCH 27/73] ppc/pnv: add a PIR handler to PnvChip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Processor Identification Register (PIR) is a register that holds a processor identifier which is used for bus transactions (XSCOM) and for processor differentiation in multiprocessor systems. It also used in the interrupt vector entries (IVE) to identify the thread serving the interrupts. P9 and P8 have some differences in the CPU PIR encoding. Signed-off-by: Cédric Le Goater Reviewed-by: David Gibson Signed-off-by: David Gibson --- hw/ppc/pnv.c | 30 ++++++++++++++++++++++++++++++ include/hw/ppc/pnv.h | 2 ++ 2 files changed, 32 insertions(+) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 1705699ef8..825d28ca75 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -244,6 +244,32 @@ static void ppc_powernv_init(MachineState *machine) g_free(chip_typename); } +/* + * 0:21 Reserved - Read as zeros + * 22:24 Chip ID + * 25:28 Core number + * 29:31 Thread ID + */ +static uint32_t pnv_chip_core_pir_p8(PnvChip *chip, uint32_t core_id) +{ + return (chip->chip_id << 7) | (core_id << 3); +} + +/* + * 0:48 Reserved - Read as zeroes + * 49:52 Node ID + * 53:55 Chip ID + * 56 Reserved - Read as zero + * 57:61 Core number + * 62:63 Thread ID + * + * We only care about the lower bits. uint32_t is fine for the moment. + */ +static uint32_t pnv_chip_core_pir_p9(PnvChip *chip, uint32_t core_id) +{ + return (chip->chip_id << 8) | (core_id << 2); +} + /* Allowed core identifiers on a POWER8 Processor Chip : * * @@ -279,6 +305,7 @@ static void pnv_chip_power8e_class_init(ObjectClass *klass, void *data) k->chip_type = PNV_CHIP_POWER8E; k->chip_cfam_id = 0x221ef04980000000ull; /* P8 Murano DD2.1 */ k->cores_mask = POWER8E_CORE_MASK; + k->core_pir = pnv_chip_core_pir_p8; dc->desc = "PowerNV Chip POWER8E"; } @@ -298,6 +325,7 @@ static void pnv_chip_power8_class_init(ObjectClass *klass, void *data) k->chip_type = PNV_CHIP_POWER8; k->chip_cfam_id = 0x220ea04980000000ull; /* P8 Venice DD2.0 */ k->cores_mask = POWER8_CORE_MASK; + k->core_pir = pnv_chip_core_pir_p8; dc->desc = "PowerNV Chip POWER8"; } @@ -317,6 +345,7 @@ static void pnv_chip_power8nvl_class_init(ObjectClass *klass, void *data) k->chip_type = PNV_CHIP_POWER8NVL; k->chip_cfam_id = 0x120d304980000000ull; /* P8 Naples DD1.0 */ k->cores_mask = POWER8_CORE_MASK; + k->core_pir = pnv_chip_core_pir_p8; dc->desc = "PowerNV Chip POWER8NVL"; } @@ -336,6 +365,7 @@ static void pnv_chip_power9_class_init(ObjectClass *klass, void *data) k->chip_type = PNV_CHIP_POWER9; k->chip_cfam_id = 0x100d104980000000ull; /* P9 Nimbus DD1.0 */ k->cores_mask = POWER9_CORE_MASK; + k->core_pir = pnv_chip_core_pir_p9; dc->desc = "PowerNV Chip POWER9"; } diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index e084a8c303..b7987f8208 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -58,6 +58,8 @@ typedef struct PnvChipClass { PnvChipType chip_type; uint64_t chip_cfam_id; uint64_t cores_mask; + + uint32_t (*core_pir)(PnvChip *chip, uint32_t core_id); } PnvChipClass; #define TYPE_PNV_CHIP_POWER8E TYPE_PNV_CHIP "-POWER8E" From d2fd9612eedfbfda8461d1a5f897546e3c457abb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= Date: Sat, 22 Oct 2016 11:46:39 +0200 Subject: [PATCH 28/73] ppc/pnv: add a PnvCore object MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is largy inspired by sPAPRCPUCore with some simplification, no hotplug for instance. A set of PnvCore objects is added to the PnvChip and the device tree is populated looping on these cores. Real HW cpu ids are now generated depending on the chip cpu model, the chip id and a core mask. The id is propagated to the CPU object, using properties, to set the SPR_PIR (Processor Identification Register) Signed-off-by: Cédric Le Goater Signed-off-by: David Gibson --- hw/ppc/Makefile.objs | 2 +- hw/ppc/pnv.c | 189 +++++++++++++++++++++++++++++++++++++- hw/ppc/pnv_core.c | 182 ++++++++++++++++++++++++++++++++++++ include/hw/ppc/pnv.h | 2 + include/hw/ppc/pnv_core.h | 48 ++++++++++ 5 files changed, 421 insertions(+), 2 deletions(-) create mode 100644 hw/ppc/pnv_core.c create mode 100644 include/hw/ppc/pnv_core.h diff --git a/hw/ppc/Makefile.objs b/hw/ppc/Makefile.objs index 8105db7d56..f8c7d1db9a 100644 --- a/hw/ppc/Makefile.objs +++ b/hw/ppc/Makefile.objs @@ -6,7 +6,7 @@ obj-$(CONFIG_PSERIES) += spapr_hcall.o spapr_iommu.o spapr_rtas.o obj-$(CONFIG_PSERIES) += spapr_pci.o spapr_rtc.o spapr_drc.o spapr_rng.o obj-$(CONFIG_PSERIES) += spapr_cpu_core.o # IBM PowerNV -obj-$(CONFIG_POWERNV) += pnv.o +obj-$(CONFIG_POWERNV) += pnv.o pnv_core.o ifeq ($(CONFIG_PCI)$(CONFIG_PSERIES)$(CONFIG_LINUX), yyy) obj-y += spapr_pci_vfio.o endif diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 825d28ca75..3413107697 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -27,6 +27,7 @@ #include "hw/ppc/fdt.h" #include "hw/ppc/ppc.h" #include "hw/ppc/pnv.h" +#include "hw/ppc/pnv_core.h" #include "hw/loader.h" #include "exec/address-spaces.h" #include "qemu/cutils.h" @@ -75,12 +76,160 @@ static void powernv_populate_memory_node(void *fdt, int chip_id, hwaddr start, _FDT((fdt_setprop_cell(fdt, off, "ibm,chip-id", chip_id))); } +static int get_cpus_node(void *fdt) +{ + int cpus_offset = fdt_path_offset(fdt, "/cpus"); + + if (cpus_offset < 0) { + cpus_offset = fdt_add_subnode(fdt, fdt_path_offset(fdt, "/"), + "cpus"); + if (cpus_offset) { + _FDT((fdt_setprop_cell(fdt, cpus_offset, "#address-cells", 0x1))); + _FDT((fdt_setprop_cell(fdt, cpus_offset, "#size-cells", 0x0))); + } + } + _FDT(cpus_offset); + return cpus_offset; +} + +/* + * The PowerNV cores (and threads) need to use real HW ids and not an + * incremental index like it has been done on other platforms. This HW + * id is stored in the CPU PIR, it is used to create cpu nodes in the + * device tree, used in XSCOM to address cores and in interrupt + * servers. + */ +static void powernv_create_core_node(PnvChip *chip, PnvCore *pc, void *fdt) +{ + CPUState *cs = CPU(DEVICE(pc->threads)); + DeviceClass *dc = DEVICE_GET_CLASS(cs); + PowerPCCPU *cpu = POWERPC_CPU(cs); + int smt_threads = ppc_get_compat_smt_threads(cpu); + CPUPPCState *env = &cpu->env; + PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cs); + uint32_t servers_prop[smt_threads]; + int i; + uint32_t segs[] = {cpu_to_be32(28), cpu_to_be32(40), + 0xffffffff, 0xffffffff}; + uint32_t tbfreq = PNV_TIMEBASE_FREQ; + uint32_t cpufreq = 1000000000; + uint32_t page_sizes_prop[64]; + size_t page_sizes_prop_size; + const uint8_t pa_features[] = { 24, 0, + 0xf6, 0x3f, 0xc7, 0xc0, 0x80, 0xf0, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00 }; + int offset; + char *nodename; + int cpus_offset = get_cpus_node(fdt); + + nodename = g_strdup_printf("%s@%x", dc->fw_name, pc->pir); + offset = fdt_add_subnode(fdt, cpus_offset, nodename); + _FDT(offset); + g_free(nodename); + + _FDT((fdt_setprop_cell(fdt, offset, "ibm,chip-id", chip->chip_id))); + + _FDT((fdt_setprop_cell(fdt, offset, "reg", pc->pir))); + _FDT((fdt_setprop_cell(fdt, offset, "ibm,pir", pc->pir))); + _FDT((fdt_setprop_string(fdt, offset, "device_type", "cpu"))); + + _FDT((fdt_setprop_cell(fdt, offset, "cpu-version", env->spr[SPR_PVR]))); + _FDT((fdt_setprop_cell(fdt, offset, "d-cache-block-size", + env->dcache_line_size))); + _FDT((fdt_setprop_cell(fdt, offset, "d-cache-line-size", + env->dcache_line_size))); + _FDT((fdt_setprop_cell(fdt, offset, "i-cache-block-size", + env->icache_line_size))); + _FDT((fdt_setprop_cell(fdt, offset, "i-cache-line-size", + env->icache_line_size))); + + if (pcc->l1_dcache_size) { + _FDT((fdt_setprop_cell(fdt, offset, "d-cache-size", + pcc->l1_dcache_size))); + } else { + error_report("Warning: Unknown L1 dcache size for cpu"); + } + if (pcc->l1_icache_size) { + _FDT((fdt_setprop_cell(fdt, offset, "i-cache-size", + pcc->l1_icache_size))); + } else { + error_report("Warning: Unknown L1 icache size for cpu"); + } + + _FDT((fdt_setprop_cell(fdt, offset, "timebase-frequency", tbfreq))); + _FDT((fdt_setprop_cell(fdt, offset, "clock-frequency", cpufreq))); + _FDT((fdt_setprop_cell(fdt, offset, "ibm,slb-size", env->slb_nr))); + _FDT((fdt_setprop_string(fdt, offset, "status", "okay"))); + _FDT((fdt_setprop(fdt, offset, "64-bit", NULL, 0))); + + if (env->spr_cb[SPR_PURR].oea_read) { + _FDT((fdt_setprop(fdt, offset, "ibm,purr", NULL, 0))); + } + + if (env->mmu_model & POWERPC_MMU_1TSEG) { + _FDT((fdt_setprop(fdt, offset, "ibm,processor-segment-sizes", + segs, sizeof(segs)))); + } + + /* Advertise VMX/VSX (vector extensions) if available + * 0 / no property == no vector extensions + * 1 == VMX / Altivec available + * 2 == VSX available */ + if (env->insns_flags & PPC_ALTIVEC) { + uint32_t vmx = (env->insns_flags2 & PPC2_VSX) ? 2 : 1; + + _FDT((fdt_setprop_cell(fdt, offset, "ibm,vmx", vmx))); + } + + /* Advertise DFP (Decimal Floating Point) if available + * 0 / no property == no DFP + * 1 == DFP available */ + if (env->insns_flags2 & PPC2_DFP) { + _FDT((fdt_setprop_cell(fdt, offset, "ibm,dfp", 1))); + } + + page_sizes_prop_size = ppc_create_page_sizes_prop(env, page_sizes_prop, + sizeof(page_sizes_prop)); + if (page_sizes_prop_size) { + _FDT((fdt_setprop(fdt, offset, "ibm,segment-page-sizes", + page_sizes_prop, page_sizes_prop_size))); + } + + _FDT((fdt_setprop(fdt, offset, "ibm,pa-features", + pa_features, sizeof(pa_features)))); + + if (cpu->cpu_version) { + _FDT((fdt_setprop_cell(fdt, offset, "cpu-version", cpu->cpu_version))); + } + + /* Build interrupt servers properties */ + for (i = 0; i < smt_threads; i++) { + servers_prop[i] = cpu_to_be32(pc->pir + i); + } + _FDT((fdt_setprop(fdt, offset, "ibm,ppc-interrupt-server#s", + servers_prop, sizeof(servers_prop)))); +} + static void powernv_populate_chip(PnvChip *chip, void *fdt) { + PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip); + char *typename = pnv_core_typename(pcc->cpu_model); + size_t typesize = object_type_get_instance_size(typename); + int i; + + for (i = 0; i < chip->nr_cores; i++) { + PnvCore *pnv_core = PNV_CORE(chip->cores + i * typesize); + + powernv_create_core_node(chip, pnv_core, fdt); + } + if (chip->ram_size) { powernv_populate_memory_node(fdt, chip->chip_id, chip->ram_start, chip->ram_size); } + g_free(typename); } static void *powernv_create_fdt(MachineState *machine) @@ -410,13 +559,51 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp) { PnvChip *chip = PNV_CHIP(dev); Error *error = NULL; + PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip); + char *typename = pnv_core_typename(pcc->cpu_model); + size_t typesize = object_type_get_instance_size(typename); + int i, core_hwid; - /* Early checks on the core settings */ + if (!object_class_by_name(typename)) { + error_setg(errp, "Unable to find PowerNV CPU Core '%s'", typename); + return; + } + + /* Cores */ pnv_chip_core_sanitize(chip, &error); if (error) { error_propagate(errp, error); return; } + + chip->cores = g_malloc0(typesize * chip->nr_cores); + + for (i = 0, core_hwid = 0; (core_hwid < sizeof(chip->cores_mask) * 8) + && (i < chip->nr_cores); core_hwid++) { + char core_name[32]; + void *pnv_core = chip->cores + i * typesize; + + if (!(chip->cores_mask & (1ull << core_hwid))) { + continue; + } + + object_initialize(pnv_core, typesize, typename); + snprintf(core_name, sizeof(core_name), "core[%d]", core_hwid); + object_property_add_child(OBJECT(chip), core_name, OBJECT(pnv_core), + &error_fatal); + object_property_set_int(OBJECT(pnv_core), smp_threads, "nr-threads", + &error_fatal); + object_property_set_int(OBJECT(pnv_core), core_hwid, + CPU_CORE_PROP_CORE_ID, &error_fatal); + object_property_set_int(OBJECT(pnv_core), + pcc->core_pir(chip, core_hwid), + "pir", &error_fatal); + object_property_set_bool(OBJECT(pnv_core), true, "realized", + &error_fatal); + object_unref(OBJECT(pnv_core)); + i++; + } + g_free(typename); } static Property pnv_chip_properties[] = { diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c new file mode 100644 index 0000000000..04713caa3b --- /dev/null +++ b/hw/ppc/pnv_core.c @@ -0,0 +1,182 @@ +/* + * QEMU PowerPC PowerNV CPU Core model + * + * Copyright (c) 2016, IBM Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +#include "qemu/osdep.h" +#include "sysemu/sysemu.h" +#include "qapi/error.h" +#include "target-ppc/cpu.h" +#include "hw/ppc/ppc.h" +#include "hw/ppc/pnv.h" +#include "hw/ppc/pnv_core.h" + +static void powernv_cpu_reset(void *opaque) +{ + PowerPCCPU *cpu = opaque; + CPUState *cs = CPU(cpu); + CPUPPCState *env = &cpu->env; + + cpu_reset(cs); + + /* + * the skiboot firmware elects a primary thread to initialize the + * system and it can be any. + */ + env->gpr[3] = PNV_FDT_ADDR; + env->nip = 0x10; + env->msr |= MSR_HVB; /* Hypervisor mode */ +} + +static void powernv_cpu_init(PowerPCCPU *cpu, Error **errp) +{ + CPUPPCState *env = &cpu->env; + int core_pir; + int thread_index = 0; /* TODO: TCG supports only one thread */ + ppc_spr_t *pir = &env->spr_cb[SPR_PIR]; + + core_pir = object_property_get_int(OBJECT(cpu), "core-pir", &error_abort); + + /* + * The PIR of a thread is the core PIR + the thread index. We will + * need to find a way to get the thread index when TCG supports + * more than 1. We could use the object name ? + */ + pir->default_value = core_pir + thread_index; + + /* Set time-base frequency to 512 MHz */ + cpu_ppc_tb_init(env, PNV_TIMEBASE_FREQ); + + qemu_register_reset(powernv_cpu_reset, cpu); +} + +static void pnv_core_realize_child(Object *child, Error **errp) +{ + Error *local_err = NULL; + CPUState *cs = CPU(child); + PowerPCCPU *cpu = POWERPC_CPU(cs); + + object_property_set_bool(child, true, "realized", &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + powernv_cpu_init(cpu, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } +} + +static void pnv_core_realize(DeviceState *dev, Error **errp) +{ + PnvCore *pc = PNV_CORE(OBJECT(dev)); + CPUCore *cc = CPU_CORE(OBJECT(dev)); + PnvCoreClass *pcc = PNV_CORE_GET_CLASS(OBJECT(dev)); + const char *typename = object_class_get_name(pcc->cpu_oc); + size_t size = object_type_get_instance_size(typename); + Error *local_err = NULL; + void *obj; + int i, j; + char name[32]; + + pc->threads = g_malloc0(size * cc->nr_threads); + for (i = 0; i < cc->nr_threads; i++) { + obj = pc->threads + i * size; + + object_initialize(obj, size, typename); + + snprintf(name, sizeof(name), "thread[%d]", i); + object_property_add_child(OBJECT(pc), name, obj, &local_err); + object_property_add_alias(obj, "core-pir", OBJECT(pc), + "pir", &local_err); + if (local_err) { + goto err; + } + object_unref(obj); + } + + for (j = 0; j < cc->nr_threads; j++) { + obj = pc->threads + j * size; + + pnv_core_realize_child(obj, &local_err); + if (local_err) { + goto err; + } + } + return; + +err: + while (--i >= 0) { + obj = pc->threads + i * size; + object_unparent(obj); + } + g_free(pc->threads); + error_propagate(errp, local_err); +} + +static Property pnv_core_properties[] = { + DEFINE_PROP_UINT32("pir", PnvCore, pir, 0), + DEFINE_PROP_END_OF_LIST(), +}; + +static void pnv_core_class_init(ObjectClass *oc, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(oc); + PnvCoreClass *pcc = PNV_CORE_CLASS(oc); + + dc->realize = pnv_core_realize; + dc->props = pnv_core_properties; + pcc->cpu_oc = cpu_class_by_name(TYPE_POWERPC_CPU, data); +} + +static const TypeInfo pnv_core_info = { + .name = TYPE_PNV_CORE, + .parent = TYPE_CPU_CORE, + .instance_size = sizeof(PnvCore), + .class_size = sizeof(PnvCoreClass), + .abstract = true, +}; + +static const char *pnv_core_models[] = { + "POWER8E", "POWER8", "POWER8NVL", "POWER9" +}; + +static void pnv_core_register_types(void) +{ + int i ; + + type_register_static(&pnv_core_info); + for (i = 0; i < ARRAY_SIZE(pnv_core_models); ++i) { + TypeInfo ti = { + .parent = TYPE_PNV_CORE, + .instance_size = sizeof(PnvCore), + .class_init = pnv_core_class_init, + .class_data = (void *) pnv_core_models[i], + }; + ti.name = pnv_core_typename(pnv_core_models[i]); + type_register(&ti); + g_free((void *)ti.name); + } +} + +type_init(pnv_core_register_types) + +char *pnv_core_typename(const char *model) +{ + return g_strdup_printf(TYPE_PNV_CORE "-%s", model); +} diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index b7987f8208..cec869ce6b 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -47,6 +47,7 @@ typedef struct PnvChip { uint32_t nr_cores; uint64_t cores_mask; + void *cores; } PnvChip; typedef struct PnvChipClass { @@ -103,5 +104,6 @@ typedef struct PnvMachineState { } PnvMachineState; #define PNV_FDT_ADDR 0x01000000 +#define PNV_TIMEBASE_FREQ 512000000ULL #endif /* _PPC_PNV_H */ diff --git a/include/hw/ppc/pnv_core.h b/include/hw/ppc/pnv_core.h new file mode 100644 index 0000000000..a151e281c0 --- /dev/null +++ b/include/hw/ppc/pnv_core.h @@ -0,0 +1,48 @@ +/* + * QEMU PowerPC PowerNV CPU Core model + * + * Copyright (c) 2016, IBM Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +#ifndef _PPC_PNV_CORE_H +#define _PPC_PNV_CORE_H + +#include "hw/cpu/core.h" + +#define TYPE_PNV_CORE "powernv-cpu-core" +#define PNV_CORE(obj) \ + OBJECT_CHECK(PnvCore, (obj), TYPE_PNV_CORE) +#define PNV_CORE_CLASS(klass) \ + OBJECT_CLASS_CHECK(PnvCoreClass, (klass), TYPE_PNV_CORE) +#define PNV_CORE_GET_CLASS(obj) \ + OBJECT_GET_CLASS(PnvCoreClass, (obj), TYPE_PNV_CORE) + +typedef struct PnvCore { + /*< private >*/ + CPUCore parent_obj; + + /*< public >*/ + void *threads; + uint32_t pir; +} PnvCore; + +typedef struct PnvCoreClass { + DeviceClass parent_class; + ObjectClass *cpu_oc; +} PnvCoreClass; + +extern char *pnv_core_typename(const char *model); + +#endif /* _PPC_PNV_CORE_H */ From 967b75230b9720ea2b3ae49f38f8287026125f9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= Date: Sat, 22 Oct 2016 11:46:40 +0200 Subject: [PATCH 29/73] ppc/pnv: add XSCOM infrastructure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On a real POWER8 system, the Pervasive Interconnect Bus (PIB) serves as a backbone to connect different units of the system. The host firmware connects to the PIB through a bridge unit, the Alter-Display-Unit (ADU), which gives him access to all the chiplets on the PCB network (Pervasive Connect Bus), the PIB acting as the root of this network. XSCOM (serial communication) is the interface to the sideband bus provided by the POWER8 pervasive unit to read and write to chiplets resources. This is needed by the host firmware, OPAL and to a lesser extent, Linux. This is among others how the PCI Host bridges get configured at boot or how the LPC bus is accessed. To represent the ADU of a real system, we introduce a specific AddressSpace to dispatch XSCOM accesses to the targeted chiplets. The translation of an XSCOM address into a PCB register address is slightly different between the P9 and the P8. This is handled before the dispatch using a 8byte alignment for all. To customize the device tree, a QOM InterfaceClass, PnvXScomInterface, is provided with a populate() handler. The chip populates the device tree by simply looping on its children. Therefore, each model needing custom nodes should not forget to declare itself as a child at instantiation time. Based on previous work done by : Benjamin Herrenschmidt Signed-off-by: Cédric Le Goater [dwg: Added cpu parameter to xscom_complete()] Signed-off-by: David Gibson --- hw/ppc/Makefile.objs | 2 +- hw/ppc/pnv.c | 25 ++++ hw/ppc/pnv_xscom.c | 275 +++++++++++++++++++++++++++++++++++++ include/hw/ppc/pnv.h | 15 ++ include/hw/ppc/pnv_xscom.h | 56 ++++++++ 5 files changed, 372 insertions(+), 1 deletion(-) create mode 100644 hw/ppc/pnv_xscom.c create mode 100644 include/hw/ppc/pnv_xscom.h diff --git a/hw/ppc/Makefile.objs b/hw/ppc/Makefile.objs index f8c7d1db9a..08c213c406 100644 --- a/hw/ppc/Makefile.objs +++ b/hw/ppc/Makefile.objs @@ -6,7 +6,7 @@ obj-$(CONFIG_PSERIES) += spapr_hcall.o spapr_iommu.o spapr_rtas.o obj-$(CONFIG_PSERIES) += spapr_pci.o spapr_rtc.o spapr_drc.o spapr_rng.o obj-$(CONFIG_PSERIES) += spapr_cpu_core.o # IBM PowerNV -obj-$(CONFIG_POWERNV) += pnv.o pnv_core.o +obj-$(CONFIG_POWERNV) += pnv.o pnv_xscom.o pnv_core.o ifeq ($(CONFIG_PCI)$(CONFIG_PSERIES)$(CONFIG_LINUX), yyy) obj-y += spapr_pci_vfio.o endif diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 3413107697..96ba36cc27 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -33,6 +33,8 @@ #include "qemu/cutils.h" #include "qapi/visitor.h" +#include "hw/ppc/pnv_xscom.h" + #include #define FDT_MAX_SIZE 0x00100000 @@ -219,6 +221,8 @@ static void powernv_populate_chip(PnvChip *chip, void *fdt) size_t typesize = object_type_get_instance_size(typename); int i; + pnv_xscom_populate(chip, fdt, 0); + for (i = 0; i < chip->nr_cores; i++) { PnvCore *pnv_core = PNV_CORE(chip->cores + i * typesize); @@ -455,6 +459,7 @@ static void pnv_chip_power8e_class_init(ObjectClass *klass, void *data) k->chip_cfam_id = 0x221ef04980000000ull; /* P8 Murano DD2.1 */ k->cores_mask = POWER8E_CORE_MASK; k->core_pir = pnv_chip_core_pir_p8; + k->xscom_base = 0x003fc0000000000ull; dc->desc = "PowerNV Chip POWER8E"; } @@ -475,6 +480,7 @@ static void pnv_chip_power8_class_init(ObjectClass *klass, void *data) k->chip_cfam_id = 0x220ea04980000000ull; /* P8 Venice DD2.0 */ k->cores_mask = POWER8_CORE_MASK; k->core_pir = pnv_chip_core_pir_p8; + k->xscom_base = 0x003fc0000000000ull; dc->desc = "PowerNV Chip POWER8"; } @@ -495,6 +501,7 @@ static void pnv_chip_power8nvl_class_init(ObjectClass *klass, void *data) k->chip_cfam_id = 0x120d304980000000ull; /* P8 Naples DD1.0 */ k->cores_mask = POWER8_CORE_MASK; k->core_pir = pnv_chip_core_pir_p8; + k->xscom_base = 0x003fc0000000000ull; dc->desc = "PowerNV Chip POWER8NVL"; } @@ -515,6 +522,7 @@ static void pnv_chip_power9_class_init(ObjectClass *klass, void *data) k->chip_cfam_id = 0x100d104980000000ull; /* P9 Nimbus DD1.0 */ k->cores_mask = POWER9_CORE_MASK; k->core_pir = pnv_chip_core_pir_p9; + k->xscom_base = 0x00603fc00000000ull; dc->desc = "PowerNV Chip POWER9"; } @@ -555,6 +563,14 @@ static void pnv_chip_core_sanitize(PnvChip *chip, Error **errp) } } +static void pnv_chip_init(Object *obj) +{ + PnvChip *chip = PNV_CHIP(obj); + PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip); + + chip->xscom_base = pcc->xscom_base; +} + static void pnv_chip_realize(DeviceState *dev, Error **errp) { PnvChip *chip = PNV_CHIP(dev); @@ -569,6 +585,14 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp) return; } + /* XSCOM bridge */ + pnv_xscom_realize(chip, &error); + if (error) { + error_propagate(errp, error); + return; + } + sysbus_mmio_map(SYS_BUS_DEVICE(chip), 0, PNV_XSCOM_BASE(chip)); + /* Cores */ pnv_chip_core_sanitize(chip, &error); if (error) { @@ -628,6 +652,7 @@ static const TypeInfo pnv_chip_info = { .name = TYPE_PNV_CHIP, .parent = TYPE_SYS_BUS_DEVICE, .class_init = pnv_chip_class_init, + .instance_init = pnv_chip_init, .class_size = sizeof(PnvChipClass), .abstract = true, }; diff --git a/hw/ppc/pnv_xscom.c b/hw/ppc/pnv_xscom.c new file mode 100644 index 0000000000..5aaa264bd7 --- /dev/null +++ b/hw/ppc/pnv_xscom.c @@ -0,0 +1,275 @@ +/* + * QEMU PowerPC PowerNV XSCOM bus + * + * Copyright (c) 2016, IBM Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "hw/hw.h" +#include "qemu/log.h" +#include "sysemu/kvm.h" +#include "target-ppc/cpu.h" +#include "hw/sysbus.h" + +#include "hw/ppc/fdt.h" +#include "hw/ppc/pnv_xscom.h" +#include "hw/ppc/pnv.h" + +#include + +static void xscom_complete(CPUState *cs, uint64_t hmer_bits) +{ + /* + * TODO: When the read/write comes from the monitor, NULL is + * passed for the cpu, and no CPU completion is generated. + */ + if (cs) { + PowerPCCPU *cpu = POWERPC_CPU(cs); + CPUPPCState *env = &cpu->env; + + /* + * TODO: Need a CPU helper to set HMER, also handle generation + * of HMIs + */ + cpu_synchronize_state(cs); + env->spr[SPR_HMER] |= hmer_bits; + } +} + +static uint32_t pnv_xscom_pcba(PnvChip *chip, uint64_t addr) +{ + PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip); + + addr &= (PNV_XSCOM_SIZE - 1); + if (pcc->chip_type == PNV_CHIP_POWER9) { + return addr >> 3; + } else { + return ((addr >> 4) & ~0xfull) | ((addr >> 3) & 0xf); + } +} + +static uint64_t xscom_read_default(PnvChip *chip, uint32_t pcba) +{ + switch (pcba) { + case 0xf000f: + return PNV_CHIP_GET_CLASS(chip)->chip_cfam_id; + case 0x1010c00: /* PIBAM FIR */ + case 0x1010c03: /* PIBAM FIR MASK */ + case 0x2020007: /* ADU stuff */ + case 0x2020009: /* ADU stuff */ + case 0x202000f: /* ADU stuff */ + return 0; + case 0x2013f00: /* PBA stuff */ + case 0x2013f01: /* PBA stuff */ + case 0x2013f02: /* PBA stuff */ + case 0x2013f03: /* PBA stuff */ + case 0x2013f04: /* PBA stuff */ + case 0x2013f05: /* PBA stuff */ + case 0x2013f06: /* PBA stuff */ + case 0x2013f07: /* PBA stuff */ + return 0; + case 0x2013028: /* CAPP stuff */ + case 0x201302a: /* CAPP stuff */ + case 0x2013801: /* CAPP stuff */ + case 0x2013802: /* CAPP stuff */ + return 0; + default: + return -1; + } +} + +static bool xscom_write_default(PnvChip *chip, uint32_t pcba, uint64_t val) +{ + /* We ignore writes to these */ + switch (pcba) { + case 0xf000f: /* chip id is RO */ + case 0x1010c00: /* PIBAM FIR */ + case 0x1010c01: /* PIBAM FIR */ + case 0x1010c02: /* PIBAM FIR */ + case 0x1010c03: /* PIBAM FIR MASK */ + case 0x1010c04: /* PIBAM FIR MASK */ + case 0x1010c05: /* PIBAM FIR MASK */ + case 0x2020007: /* ADU stuff */ + case 0x2020009: /* ADU stuff */ + case 0x202000f: /* ADU stuff */ + return true; + default: + return false; + } +} + +static uint64_t xscom_read(void *opaque, hwaddr addr, unsigned width) +{ + PnvChip *chip = opaque; + uint32_t pcba = pnv_xscom_pcba(chip, addr); + uint64_t val = 0; + MemTxResult result; + + /* Handle some SCOMs here before dispatch */ + val = xscom_read_default(chip, pcba); + if (val != -1) { + goto complete; + } + + val = address_space_ldq(&chip->xscom_as, pcba << 3, MEMTXATTRS_UNSPECIFIED, + &result); + if (result != MEMTX_OK) { + qemu_log_mask(LOG_GUEST_ERROR, "XSCOM read failed at @0x%" + HWADDR_PRIx " pcba=0x%08x\n", addr, pcba); + xscom_complete(current_cpu, HMER_XSCOM_FAIL | HMER_XSCOM_DONE); + return 0; + } + +complete: + xscom_complete(current_cpu, HMER_XSCOM_DONE); + return val; +} + +static void xscom_write(void *opaque, hwaddr addr, uint64_t val, + unsigned width) +{ + PnvChip *chip = opaque; + uint32_t pcba = pnv_xscom_pcba(chip, addr); + MemTxResult result; + + /* Handle some SCOMs here before dispatch */ + if (xscom_write_default(chip, pcba, val)) { + goto complete; + } + + address_space_stq(&chip->xscom_as, pcba << 3, val, MEMTXATTRS_UNSPECIFIED, + &result); + if (result != MEMTX_OK) { + qemu_log_mask(LOG_GUEST_ERROR, "XSCOM write failed at @0x%" + HWADDR_PRIx " pcba=0x%08x data=0x%" PRIx64 "\n", + addr, pcba, val); + xscom_complete(current_cpu, HMER_XSCOM_FAIL | HMER_XSCOM_DONE); + return; + } + +complete: + xscom_complete(current_cpu, HMER_XSCOM_DONE); +} + +const MemoryRegionOps pnv_xscom_ops = { + .read = xscom_read, + .write = xscom_write, + .valid.min_access_size = 8, + .valid.max_access_size = 8, + .impl.min_access_size = 8, + .impl.max_access_size = 8, + .endianness = DEVICE_BIG_ENDIAN, +}; + +void pnv_xscom_realize(PnvChip *chip, Error **errp) +{ + SysBusDevice *sbd = SYS_BUS_DEVICE(chip); + char *name; + + name = g_strdup_printf("xscom-%x", chip->chip_id); + memory_region_init_io(&chip->xscom_mmio, OBJECT(chip), &pnv_xscom_ops, + chip, name, PNV_XSCOM_SIZE); + sysbus_init_mmio(sbd, &chip->xscom_mmio); + + memory_region_init(&chip->xscom, OBJECT(chip), name, PNV_XSCOM_SIZE); + address_space_init(&chip->xscom_as, &chip->xscom, name); + g_free(name); +} + +static const TypeInfo pnv_xscom_interface_info = { + .name = TYPE_PNV_XSCOM_INTERFACE, + .parent = TYPE_INTERFACE, + .class_size = sizeof(PnvXScomInterfaceClass), +}; + +static void pnv_xscom_register_types(void) +{ + type_register_static(&pnv_xscom_interface_info); +} + +type_init(pnv_xscom_register_types) + +typedef struct ForeachPopulateArgs { + void *fdt; + int xscom_offset; +} ForeachPopulateArgs; + +static int xscom_populate_child(Object *child, void *opaque) +{ + if (object_dynamic_cast(child, TYPE_PNV_XSCOM_INTERFACE)) { + ForeachPopulateArgs *args = opaque; + PnvXScomInterface *xd = PNV_XSCOM_INTERFACE(child); + PnvXScomInterfaceClass *xc = PNV_XSCOM_INTERFACE_GET_CLASS(xd); + + if (xc->populate) { + _FDT((xc->populate(xd, args->fdt, args->xscom_offset))); + } + } + return 0; +} + +static const char compat_p8[] = "ibm,power8-xscom\0ibm,xscom"; +static const char compat_p9[] = "ibm,power9-xscom\0ibm,xscom"; + +int pnv_xscom_populate(PnvChip *chip, void *fdt, int root_offset) +{ + uint64_t reg[] = { cpu_to_be64(PNV_XSCOM_BASE(chip)), + cpu_to_be64(PNV_XSCOM_SIZE) }; + int xscom_offset; + ForeachPopulateArgs args; + char *name; + PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip); + + name = g_strdup_printf("xscom@%" PRIx64, be64_to_cpu(reg[0])); + xscom_offset = fdt_add_subnode(fdt, root_offset, name); + _FDT(xscom_offset); + g_free(name); + _FDT((fdt_setprop_cell(fdt, xscom_offset, "ibm,chip-id", chip->chip_id))); + _FDT((fdt_setprop_cell(fdt, xscom_offset, "#address-cells", 1))); + _FDT((fdt_setprop_cell(fdt, xscom_offset, "#size-cells", 1))); + _FDT((fdt_setprop(fdt, xscom_offset, "reg", reg, sizeof(reg)))); + + if (pcc->chip_type == PNV_CHIP_POWER9) { + _FDT((fdt_setprop(fdt, xscom_offset, "compatible", compat_p9, + sizeof(compat_p9)))); + } else { + _FDT((fdt_setprop(fdt, xscom_offset, "compatible", compat_p8, + sizeof(compat_p8)))); + } + + _FDT((fdt_setprop(fdt, xscom_offset, "scom-controller", NULL, 0))); + + args.fdt = fdt; + args.xscom_offset = xscom_offset; + + object_child_foreach(OBJECT(chip), xscom_populate_child, &args); + return 0; +} + +void pnv_xscom_add_subregion(PnvChip *chip, hwaddr offset, MemoryRegion *mr) +{ + memory_region_add_subregion(&chip->xscom, offset << 3, mr); +} + +void pnv_xscom_region_init(MemoryRegion *mr, + struct Object *owner, + const MemoryRegionOps *ops, + void *opaque, + const char *name, + uint64_t size) +{ + memory_region_init_io(mr, owner, ops, opaque, name, size << 3); +} diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index cec869ce6b..7db922e285 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -21,6 +21,7 @@ #include "hw/boards.h" #include "hw/sysbus.h" +#include "hw/ppc/pnv_xscom.h" #define TYPE_PNV_CHIP "powernv-chip" #define PNV_CHIP(obj) OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP) @@ -48,6 +49,11 @@ typedef struct PnvChip { uint32_t nr_cores; uint64_t cores_mask; void *cores; + + hwaddr xscom_base; + MemoryRegion xscom_mmio; + MemoryRegion xscom; + AddressSpace xscom_as; } PnvChip; typedef struct PnvChipClass { @@ -60,6 +66,8 @@ typedef struct PnvChipClass { uint64_t chip_cfam_id; uint64_t cores_mask; + hwaddr xscom_base; + uint32_t (*core_pir)(PnvChip *chip, uint32_t core_id); } PnvChipClass; @@ -106,4 +114,11 @@ typedef struct PnvMachineState { #define PNV_FDT_ADDR 0x01000000 #define PNV_TIMEBASE_FREQ 512000000ULL +/* + * POWER8 MMIO base addresses + */ +#define PNV_XSCOM_SIZE 0x800000000ull +#define PNV_XSCOM_BASE(chip) \ + (chip->xscom_base + ((uint64_t)(chip)->chip_id) * PNV_XSCOM_SIZE) + #endif /* _PPC_PNV_H */ diff --git a/include/hw/ppc/pnv_xscom.h b/include/hw/ppc/pnv_xscom.h new file mode 100644 index 0000000000..ee25ec455e --- /dev/null +++ b/include/hw/ppc/pnv_xscom.h @@ -0,0 +1,56 @@ +/* + * QEMU PowerPC PowerNV XSCOM bus definitions + * + * Copyright (c) 2016, IBM Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +#ifndef _PPC_PNV_XSCOM_H +#define _PPC_PNV_XSCOM_H + +#include "qom/object.h" + +typedef struct PnvChip PnvChip; + +typedef struct PnvXScomInterface { + Object parent; +} PnvXScomInterface; + +#define TYPE_PNV_XSCOM_INTERFACE "pnv-xscom-interface" +#define PNV_XSCOM_INTERFACE(obj) \ + OBJECT_CHECK(PnvXScomInterface, (obj), TYPE_PNV_XSCOM_INTERFACE) +#define PNV_XSCOM_INTERFACE_CLASS(klass) \ + OBJECT_CLASS_CHECK(PnvXScomInterfaceClass, (klass), \ + TYPE_PNV_XSCOM_INTERFACE) +#define PNV_XSCOM_INTERFACE_GET_CLASS(obj) \ + OBJECT_GET_CLASS(PnvXScomInterfaceClass, (obj), TYPE_PNV_XSCOM_INTERFACE) + +typedef struct PnvXScomInterfaceClass { + InterfaceClass parent; + int (*populate)(PnvXScomInterface *dev, void *fdt, int offset); +} PnvXScomInterfaceClass; + +extern void pnv_xscom_realize(PnvChip *chip, Error **errp); +extern int pnv_xscom_populate(PnvChip *chip, void *fdt, int offset); + +extern void pnv_xscom_add_subregion(PnvChip *chip, hwaddr offset, + MemoryRegion *mr); +extern void pnv_xscom_region_init(MemoryRegion *mr, + struct Object *owner, + const MemoryRegionOps *ops, + void *opaque, + const char *name, + uint64_t size); + +#endif /* _PPC_PNV_XSCOM_H */ From 24ece072504b8c8b03861168d601d174a7948099 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= Date: Sat, 22 Oct 2016 11:46:41 +0200 Subject: [PATCH 30/73] ppc/pnv: add XSCOM handlers to PnvCore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now that we are using real HW ids for the cores in PowerNV chips, we can route the XSCOM accesses to them. We just need to attach a specific XSCOM memory region to each core in the appropriate window for the core number. To start with, let's install the DTS (Digital Thermal Sensor) handlers which should return 38°C for each core. Signed-off-by: Cédric Le Goater Signed-off-by: David Gibson --- hw/ppc/pnv.c | 4 +++ hw/ppc/pnv_core.c | 50 ++++++++++++++++++++++++++++++++++++++ include/hw/ppc/pnv_core.h | 2 ++ include/hw/ppc/pnv_xscom.h | 19 +++++++++++++++ 4 files changed, 75 insertions(+) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 96ba36cc27..df55a89cb9 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -625,6 +625,10 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp) object_property_set_bool(OBJECT(pnv_core), true, "realized", &error_fatal); object_unref(OBJECT(pnv_core)); + + /* Each core has an XSCOM MMIO region */ + pnv_xscom_add_subregion(chip, PNV_XSCOM_EX_CORE_BASE(core_hwid), + &PNV_CORE(pnv_core)->xscom_regs); i++; } g_free(typename); diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c index 04713caa3b..2acda9637d 100644 --- a/hw/ppc/pnv_core.c +++ b/hw/ppc/pnv_core.c @@ -19,6 +19,7 @@ #include "qemu/osdep.h" #include "sysemu/sysemu.h" #include "qapi/error.h" +#include "qemu/log.h" #include "target-ppc/cpu.h" #include "hw/ppc/ppc.h" #include "hw/ppc/pnv.h" @@ -63,6 +64,51 @@ static void powernv_cpu_init(PowerPCCPU *cpu, Error **errp) qemu_register_reset(powernv_cpu_reset, cpu); } +/* + * These values are read by the PowerNV HW monitors under Linux + */ +#define PNV_XSCOM_EX_DTS_RESULT0 0x50000 +#define PNV_XSCOM_EX_DTS_RESULT1 0x50001 + +static uint64_t pnv_core_xscom_read(void *opaque, hwaddr addr, + unsigned int width) +{ + uint32_t offset = addr >> 3; + uint64_t val = 0; + + /* The result should be 38 C */ + switch (offset) { + case PNV_XSCOM_EX_DTS_RESULT0: + val = 0x26f024f023f0000ull; + break; + case PNV_XSCOM_EX_DTS_RESULT1: + val = 0x24f000000000000ull; + break; + default: + qemu_log_mask(LOG_UNIMP, "Warning: reading reg=0x%" HWADDR_PRIx, + addr); + } + + return val; +} + +static void pnv_core_xscom_write(void *opaque, hwaddr addr, uint64_t val, + unsigned int width) +{ + qemu_log_mask(LOG_UNIMP, "Warning: writing to reg=0x%" HWADDR_PRIx, + addr); +} + +static const MemoryRegionOps pnv_core_xscom_ops = { + .read = pnv_core_xscom_read, + .write = pnv_core_xscom_write, + .valid.min_access_size = 8, + .valid.max_access_size = 8, + .impl.min_access_size = 8, + .impl.max_access_size = 8, + .endianness = DEVICE_BIG_ENDIAN, +}; + static void pnv_core_realize_child(Object *child, Error **errp) { Error *local_err = NULL; @@ -118,6 +164,10 @@ static void pnv_core_realize(DeviceState *dev, Error **errp) goto err; } } + + snprintf(name, sizeof(name), "xscom-core.%d", cc->core_id); + pnv_xscom_region_init(&pc->xscom_regs, OBJECT(dev), &pnv_core_xscom_ops, + pc, name, PNV_XSCOM_EX_CORE_SIZE); return; err: diff --git a/include/hw/ppc/pnv_core.h b/include/hw/ppc/pnv_core.h index a151e281c0..2955a41c90 100644 --- a/include/hw/ppc/pnv_core.h +++ b/include/hw/ppc/pnv_core.h @@ -36,6 +36,8 @@ typedef struct PnvCore { /*< public >*/ void *threads; uint32_t pir; + + MemoryRegion xscom_regs; } PnvCore; typedef struct PnvCoreClass { diff --git a/include/hw/ppc/pnv_xscom.h b/include/hw/ppc/pnv_xscom.h index ee25ec455e..5da6e92e69 100644 --- a/include/hw/ppc/pnv_xscom.h +++ b/include/hw/ppc/pnv_xscom.h @@ -41,6 +41,25 @@ typedef struct PnvXScomInterfaceClass { int (*populate)(PnvXScomInterface *dev, void *fdt, int offset); } PnvXScomInterfaceClass; +/* + * Layout of the XSCOM PCB addresses of EX core 1 + * + * GPIO 0x1100xxxx + * SCOM 0x1101xxxx + * OHA 0x1102xxxx + * CLOCK CTL 0x1103xxxx + * FIR 0x1104xxxx + * THERM 0x1105xxxx + * 0x1106xxxx + * .. + * 0x110Exxxx + * PCB SLAVE 0x110Fxxxx + */ + +#define PNV_XSCOM_EX_BASE 0x10000000 +#define PNV_XSCOM_EX_CORE_BASE(i) (PNV_XSCOM_EX_BASE | (((uint64_t)i) << 24)) +#define PNV_XSCOM_EX_CORE_SIZE 0x100000 + extern void pnv_xscom_realize(PnvChip *chip, Error **errp); extern int pnv_xscom_populate(PnvChip *chip, void *fdt, int offset); From a3980bf51702d05690f07db2f6f07ab0f55d49b9 Mon Sep 17 00:00:00 2001 From: Benjamin Herrenschmidt Date: Sat, 22 Oct 2016 11:46:42 +0200 Subject: [PATCH 31/73] ppc/pnv: add a LPC controller MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The LPC (Low Pin Count) interface on a POWER8 is made accessible to the system through the ADU (XSCOM interface). This interface is part of set of units connected together via a local OPB (On-Chip Peripheral Bus) which act as a bridge between the ADU and the off chip LPC endpoints, like external flash modules. The most important units of this OPB are : - OPB Master: contains the ADU slave logic, a set of internal registers and the logic to control the OPB. - LPCHC (LPC HOST Controller): which implements a OPB Slave, a set of internal registers and the LPC HOST Controller to control the LPC interface. Four address spaces are provided to the ADU : - LPC Bus Firmware Memory - LPC Bus Memory - LPC Bus I/O (ISA bus) - and the registers for the OPB Master and the LPC Host Controller On POWER8, an intermediate hop is necessary to reach the OPB, through a unit called the ECCB. OPB commands are simply mangled in ECCB write commands. On POWER9, the OPB master address space can be accessed via MMIO. The logic is same but the code will be simpler as the XSCOM and ECCB hops are not necessary anymore. This version of the LPC controller model doesn't yet implement support for the SerIRQ deserializer present in the Naples version of the chip though some preliminary work is there. Signed-off-by: Benjamin Herrenschmidt [clg: - updated for qemu-2.7 - ported on latest PowerNV patchset - changed the XSCOM interface to fit new model - QOMified the model - moved the ISA hunks in another patch - removed printf logging - added a couple of UNIMP logging - rewrote commit log ] Signed-off-by: Cédric Le Goater Reviewed-by: David Gibson Signed-off-by: David Gibson --- hw/ppc/Makefile.objs | 2 +- hw/ppc/pnv.c | 8 + hw/ppc/pnv_lpc.c | 471 +++++++++++++++++++++++++++++++++++++ include/hw/ppc/pnv.h | 3 + include/hw/ppc/pnv_lpc.h | 67 ++++++ include/hw/ppc/pnv_xscom.h | 3 + 6 files changed, 553 insertions(+), 1 deletion(-) create mode 100644 hw/ppc/pnv_lpc.c create mode 100644 include/hw/ppc/pnv_lpc.h diff --git a/hw/ppc/Makefile.objs b/hw/ppc/Makefile.objs index 08c213c406..ebc72af0a7 100644 --- a/hw/ppc/Makefile.objs +++ b/hw/ppc/Makefile.objs @@ -6,7 +6,7 @@ obj-$(CONFIG_PSERIES) += spapr_hcall.o spapr_iommu.o spapr_rtas.o obj-$(CONFIG_PSERIES) += spapr_pci.o spapr_rtc.o spapr_drc.o spapr_rng.o obj-$(CONFIG_PSERIES) += spapr_cpu_core.o # IBM PowerNV -obj-$(CONFIG_POWERNV) += pnv.o pnv_xscom.o pnv_core.o +obj-$(CONFIG_POWERNV) += pnv.o pnv_xscom.o pnv_core.o pnv_lpc.o ifeq ($(CONFIG_PCI)$(CONFIG_PSERIES)$(CONFIG_LINUX), yyy) obj-y += spapr_pci_vfio.o endif diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index df55a89cb9..aa712fd6f5 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -569,6 +569,9 @@ static void pnv_chip_init(Object *obj) PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip); chip->xscom_base = pcc->xscom_base; + + object_initialize(&chip->lpc, sizeof(chip->lpc), TYPE_PNV_LPC); + object_property_add_child(obj, "lpc", OBJECT(&chip->lpc), NULL); } static void pnv_chip_realize(DeviceState *dev, Error **errp) @@ -632,6 +635,11 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp) i++; } g_free(typename); + + /* Create LPC controller */ + object_property_set_bool(OBJECT(&chip->lpc), true, "realized", + &error_fatal); + pnv_xscom_add_subregion(chip, PNV_XSCOM_LPC_BASE, &chip->lpc.xscom_regs); } static Property pnv_chip_properties[] = { diff --git a/hw/ppc/pnv_lpc.c b/hw/ppc/pnv_lpc.c new file mode 100644 index 0000000000..00dbd8b07b --- /dev/null +++ b/hw/ppc/pnv_lpc.c @@ -0,0 +1,471 @@ +/* + * QEMU PowerPC PowerNV LPC controller + * + * Copyright (c) 2016, IBM Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "qemu/osdep.h" +#include "sysemu/sysemu.h" +#include "target-ppc/cpu.h" +#include "qapi/error.h" +#include "qemu/log.h" + +#include "hw/ppc/pnv_lpc.h" +#include "hw/ppc/pnv.h" +#include "hw/ppc/fdt.h" + +#include + +enum { + ECCB_CTL = 0, + ECCB_RESET = 1, + ECCB_STAT = 2, + ECCB_DATA = 3, +}; + +/* OPB Master LS registers */ +#define OPB_MASTER_LS_IRQ_STAT 0x50 +#define OPB_MASTER_IRQ_LPC 0x00000800 +#define OPB_MASTER_LS_IRQ_MASK 0x54 +#define OPB_MASTER_LS_IRQ_POL 0x58 +#define OPB_MASTER_LS_IRQ_INPUT 0x5c + +/* LPC HC registers */ +#define LPC_HC_FW_SEG_IDSEL 0x24 +#define LPC_HC_FW_RD_ACC_SIZE 0x28 +#define LPC_HC_FW_RD_1B 0x00000000 +#define LPC_HC_FW_RD_2B 0x01000000 +#define LPC_HC_FW_RD_4B 0x02000000 +#define LPC_HC_FW_RD_16B 0x04000000 +#define LPC_HC_FW_RD_128B 0x07000000 +#define LPC_HC_IRQSER_CTRL 0x30 +#define LPC_HC_IRQSER_EN 0x80000000 +#define LPC_HC_IRQSER_QMODE 0x40000000 +#define LPC_HC_IRQSER_START_MASK 0x03000000 +#define LPC_HC_IRQSER_START_4CLK 0x00000000 +#define LPC_HC_IRQSER_START_6CLK 0x01000000 +#define LPC_HC_IRQSER_START_8CLK 0x02000000 +#define LPC_HC_IRQMASK 0x34 /* same bit defs as LPC_HC_IRQSTAT */ +#define LPC_HC_IRQSTAT 0x38 +#define LPC_HC_IRQ_SERIRQ0 0x80000000 /* all bits down to ... */ +#define LPC_HC_IRQ_SERIRQ16 0x00008000 /* IRQ16=IOCHK#, IRQ2=SMI# */ +#define LPC_HC_IRQ_SERIRQ_ALL 0xffff8000 +#define LPC_HC_IRQ_LRESET 0x00000400 +#define LPC_HC_IRQ_SYNC_ABNORM_ERR 0x00000080 +#define LPC_HC_IRQ_SYNC_NORESP_ERR 0x00000040 +#define LPC_HC_IRQ_SYNC_NORM_ERR 0x00000020 +#define LPC_HC_IRQ_SYNC_TIMEOUT_ERR 0x00000010 +#define LPC_HC_IRQ_SYNC_TARG_TAR_ERR 0x00000008 +#define LPC_HC_IRQ_SYNC_BM_TAR_ERR 0x00000004 +#define LPC_HC_IRQ_SYNC_BM0_REQ 0x00000002 +#define LPC_HC_IRQ_SYNC_BM1_REQ 0x00000001 +#define LPC_HC_ERROR_ADDRESS 0x40 + +#define LPC_OPB_SIZE 0x100000000ull + +#define ISA_IO_SIZE 0x00010000 +#define ISA_MEM_SIZE 0x10000000 +#define LPC_IO_OPB_ADDR 0xd0010000 +#define LPC_IO_OPB_SIZE 0x00010000 +#define LPC_MEM_OPB_ADDR 0xe0010000 +#define LPC_MEM_OPB_SIZE 0x10000000 +#define LPC_FW_OPB_ADDR 0xf0000000 +#define LPC_FW_OPB_SIZE 0x10000000 + +#define LPC_OPB_REGS_OPB_ADDR 0xc0010000 +#define LPC_OPB_REGS_OPB_SIZE 0x00002000 +#define LPC_HC_REGS_OPB_ADDR 0xc0012000 +#define LPC_HC_REGS_OPB_SIZE 0x00001000 + + +/* + * TODO: the "primary" cell should only be added on chip 0. This is + * how skiboot chooses the default LPC controller on multichip + * systems. + * + * It would be easly done if we can change the populate() interface to + * replace the PnvXScomInterface parameter by a PnvChip one + */ +static int pnv_lpc_populate(PnvXScomInterface *dev, void *fdt, int xscom_offset) +{ + const char compat[] = "ibm,power8-lpc\0ibm,lpc"; + char *name; + int offset; + uint32_t lpc_pcba = PNV_XSCOM_LPC_BASE; + uint32_t reg[] = { + cpu_to_be32(lpc_pcba), + cpu_to_be32(PNV_XSCOM_LPC_SIZE) + }; + + name = g_strdup_printf("isa@%x", lpc_pcba); + offset = fdt_add_subnode(fdt, xscom_offset, name); + _FDT(offset); + g_free(name); + + _FDT((fdt_setprop(fdt, offset, "reg", reg, sizeof(reg)))); + _FDT((fdt_setprop_cell(fdt, offset, "#address-cells", 2))); + _FDT((fdt_setprop_cell(fdt, offset, "#size-cells", 1))); + _FDT((fdt_setprop(fdt, offset, "primary", NULL, 0))); + _FDT((fdt_setprop(fdt, offset, "compatible", compat, sizeof(compat)))); + return 0; +} + +/* + * These read/write handlers of the OPB address space should be common + * with the P9 LPC Controller which uses direct MMIOs. + * + * TODO: rework to use address_space_stq() and address_space_ldq() + * instead. + */ +static bool opb_read(PnvLpcController *lpc, uint32_t addr, uint8_t *data, + int sz) +{ + bool success; + + /* XXX Handle access size limits and FW read caching here */ + success = !address_space_rw(&lpc->opb_as, addr, MEMTXATTRS_UNSPECIFIED, + data, sz, false); + + return success; +} + +static bool opb_write(PnvLpcController *lpc, uint32_t addr, uint8_t *data, + int sz) +{ + bool success; + + /* XXX Handle access size limits here */ + success = !address_space_rw(&lpc->opb_as, addr, MEMTXATTRS_UNSPECIFIED, + data, sz, true); + + return success; +} + +#define ECCB_CTL_READ (1ull << (63 - 15)) +#define ECCB_CTL_SZ_LSH (63 - 7) +#define ECCB_CTL_SZ_MASK (0xfull << ECCB_CTL_SZ_LSH) +#define ECCB_CTL_ADDR_MASK 0xffffffffu; + +#define ECCB_STAT_OP_DONE (1ull << (63 - 52)) +#define ECCB_STAT_OP_ERR (1ull << (63 - 52)) +#define ECCB_STAT_RD_DATA_LSH (63 - 37) +#define ECCB_STAT_RD_DATA_MASK (0xffffffff << ECCB_STAT_RD_DATA_LSH) + +static void pnv_lpc_do_eccb(PnvLpcController *lpc, uint64_t cmd) +{ + /* XXX Check for magic bits at the top, addr size etc... */ + unsigned int sz = (cmd & ECCB_CTL_SZ_MASK) >> ECCB_CTL_SZ_LSH; + uint32_t opb_addr = cmd & ECCB_CTL_ADDR_MASK; + uint8_t data[4]; + bool success; + + if (cmd & ECCB_CTL_READ) { + success = opb_read(lpc, opb_addr, data, sz); + if (success) { + lpc->eccb_stat_reg = ECCB_STAT_OP_DONE | + (((uint64_t)data[0]) << 24 | + ((uint64_t)data[1]) << 16 | + ((uint64_t)data[2]) << 8 | + ((uint64_t)data[3])) << ECCB_STAT_RD_DATA_LSH; + } else { + lpc->eccb_stat_reg = ECCB_STAT_OP_DONE | + (0xffffffffull << ECCB_STAT_RD_DATA_LSH); + } + } else { + data[0] = lpc->eccb_data_reg >> 24; + data[1] = lpc->eccb_data_reg >> 16; + data[2] = lpc->eccb_data_reg >> 8; + data[3] = lpc->eccb_data_reg; + + success = opb_write(lpc, opb_addr, data, sz); + lpc->eccb_stat_reg = ECCB_STAT_OP_DONE; + } + /* XXX Which error bit (if any) to signal OPB error ? */ +} + +static uint64_t pnv_lpc_xscom_read(void *opaque, hwaddr addr, unsigned size) +{ + PnvLpcController *lpc = PNV_LPC(opaque); + uint32_t offset = addr >> 3; + uint64_t val = 0; + + switch (offset & 3) { + case ECCB_CTL: + case ECCB_RESET: + val = 0; + break; + case ECCB_STAT: + val = lpc->eccb_stat_reg; + lpc->eccb_stat_reg = 0; + break; + case ECCB_DATA: + val = ((uint64_t)lpc->eccb_data_reg) << 32; + break; + } + return val; +} + +static void pnv_lpc_xscom_write(void *opaque, hwaddr addr, + uint64_t val, unsigned size) +{ + PnvLpcController *lpc = PNV_LPC(opaque); + uint32_t offset = addr >> 3; + + switch (offset & 3) { + case ECCB_CTL: + pnv_lpc_do_eccb(lpc, val); + break; + case ECCB_RESET: + /* XXXX */ + break; + case ECCB_STAT: + break; + case ECCB_DATA: + lpc->eccb_data_reg = val >> 32; + break; + } +} + +static const MemoryRegionOps pnv_lpc_xscom_ops = { + .read = pnv_lpc_xscom_read, + .write = pnv_lpc_xscom_write, + .valid.min_access_size = 8, + .valid.max_access_size = 8, + .impl.min_access_size = 8, + .impl.max_access_size = 8, + .endianness = DEVICE_BIG_ENDIAN, +}; + +static uint64_t lpc_hc_read(void *opaque, hwaddr addr, unsigned size) +{ + PnvLpcController *lpc = opaque; + uint64_t val = 0xfffffffffffffffful; + + switch (addr) { + case LPC_HC_FW_SEG_IDSEL: + val = lpc->lpc_hc_fw_seg_idsel; + break; + case LPC_HC_FW_RD_ACC_SIZE: + val = lpc->lpc_hc_fw_rd_acc_size; + break; + case LPC_HC_IRQSER_CTRL: + val = lpc->lpc_hc_irqser_ctrl; + break; + case LPC_HC_IRQMASK: + val = lpc->lpc_hc_irqmask; + break; + case LPC_HC_IRQSTAT: + val = lpc->lpc_hc_irqstat; + break; + case LPC_HC_ERROR_ADDRESS: + val = lpc->lpc_hc_error_addr; + break; + default: + qemu_log_mask(LOG_UNIMP, "LPC HC Unimplemented register: Ox%" + HWADDR_PRIx "\n", addr); + } + return val; +} + +static void lpc_hc_write(void *opaque, hwaddr addr, uint64_t val, + unsigned size) +{ + PnvLpcController *lpc = opaque; + + /* XXX Filter out reserved bits */ + + switch (addr) { + case LPC_HC_FW_SEG_IDSEL: + /* XXX Actually figure out how that works as this impact + * memory regions/aliases + */ + lpc->lpc_hc_fw_seg_idsel = val; + break; + case LPC_HC_FW_RD_ACC_SIZE: + lpc->lpc_hc_fw_rd_acc_size = val; + break; + case LPC_HC_IRQSER_CTRL: + lpc->lpc_hc_irqser_ctrl = val; + break; + case LPC_HC_IRQMASK: + lpc->lpc_hc_irqmask = val; + break; + case LPC_HC_IRQSTAT: + lpc->lpc_hc_irqstat &= ~val; + break; + case LPC_HC_ERROR_ADDRESS: + break; + default: + qemu_log_mask(LOG_UNIMP, "LPC HC Unimplemented register: Ox%" + HWADDR_PRIx "\n", addr); + } +} + +static const MemoryRegionOps lpc_hc_ops = { + .read = lpc_hc_read, + .write = lpc_hc_write, + .endianness = DEVICE_BIG_ENDIAN, + .valid = { + .min_access_size = 4, + .max_access_size = 4, + }, + .impl = { + .min_access_size = 4, + .max_access_size = 4, + }, +}; + +static uint64_t opb_master_read(void *opaque, hwaddr addr, unsigned size) +{ + PnvLpcController *lpc = opaque; + uint64_t val = 0xfffffffffffffffful; + + switch (addr) { + case OPB_MASTER_LS_IRQ_STAT: + val = lpc->opb_irq_stat; + break; + case OPB_MASTER_LS_IRQ_MASK: + val = lpc->opb_irq_mask; + break; + case OPB_MASTER_LS_IRQ_POL: + val = lpc->opb_irq_pol; + break; + case OPB_MASTER_LS_IRQ_INPUT: + val = lpc->opb_irq_input; + break; + default: + qemu_log_mask(LOG_UNIMP, "OPB MASTER Unimplemented register: Ox%" + HWADDR_PRIx "\n", addr); + } + + return val; +} + +static void opb_master_write(void *opaque, hwaddr addr, + uint64_t val, unsigned size) +{ + PnvLpcController *lpc = opaque; + + switch (addr) { + case OPB_MASTER_LS_IRQ_STAT: + lpc->opb_irq_stat &= ~val; + break; + case OPB_MASTER_LS_IRQ_MASK: + /* XXX Filter out reserved bits */ + lpc->opb_irq_mask = val; + break; + case OPB_MASTER_LS_IRQ_POL: + /* XXX Filter out reserved bits */ + lpc->opb_irq_pol = val; + break; + case OPB_MASTER_LS_IRQ_INPUT: + /* Read only */ + break; + default: + qemu_log_mask(LOG_UNIMP, "OPB MASTER Unimplemented register: Ox%" + HWADDR_PRIx "\n", addr); + } +} + +static const MemoryRegionOps opb_master_ops = { + .read = opb_master_read, + .write = opb_master_write, + .endianness = DEVICE_BIG_ENDIAN, + .valid = { + .min_access_size = 4, + .max_access_size = 4, + }, + .impl = { + .min_access_size = 4, + .max_access_size = 4, + }, +}; + +static void pnv_lpc_realize(DeviceState *dev, Error **errp) +{ + PnvLpcController *lpc = PNV_LPC(dev); + + /* Reg inits */ + lpc->lpc_hc_fw_rd_acc_size = LPC_HC_FW_RD_4B; + + /* Create address space and backing MR for the OPB bus */ + memory_region_init(&lpc->opb_mr, OBJECT(dev), "lpc-opb", 0x100000000ull); + address_space_init(&lpc->opb_as, &lpc->opb_mr, "lpc-opb"); + + /* Create ISA IO and Mem space regions which are the root of + * the ISA bus (ie, ISA address spaces). We don't create a + * separate one for FW which we alias to memory. + */ + memory_region_init(&lpc->isa_io, OBJECT(dev), "isa-io", ISA_IO_SIZE); + memory_region_init(&lpc->isa_mem, OBJECT(dev), "isa-mem", ISA_MEM_SIZE); + + /* Create windows from the OPB space to the ISA space */ + memory_region_init_alias(&lpc->opb_isa_io, OBJECT(dev), "lpc-isa-io", + &lpc->isa_io, 0, LPC_IO_OPB_SIZE); + memory_region_add_subregion(&lpc->opb_mr, LPC_IO_OPB_ADDR, + &lpc->opb_isa_io); + memory_region_init_alias(&lpc->opb_isa_mem, OBJECT(dev), "lpc-isa-mem", + &lpc->isa_mem, 0, LPC_MEM_OPB_SIZE); + memory_region_add_subregion(&lpc->opb_mr, LPC_MEM_OPB_ADDR, + &lpc->opb_isa_mem); + memory_region_init_alias(&lpc->opb_isa_fw, OBJECT(dev), "lpc-isa-fw", + &lpc->isa_mem, 0, LPC_FW_OPB_SIZE); + memory_region_add_subregion(&lpc->opb_mr, LPC_FW_OPB_ADDR, + &lpc->opb_isa_fw); + + /* Create MMIO regions for LPC HC and OPB registers */ + memory_region_init_io(&lpc->opb_master_regs, OBJECT(dev), &opb_master_ops, + lpc, "lpc-opb-master", LPC_OPB_REGS_OPB_SIZE); + memory_region_add_subregion(&lpc->opb_mr, LPC_OPB_REGS_OPB_ADDR, + &lpc->opb_master_regs); + memory_region_init_io(&lpc->lpc_hc_regs, OBJECT(dev), &lpc_hc_ops, lpc, + "lpc-hc", LPC_HC_REGS_OPB_SIZE); + memory_region_add_subregion(&lpc->opb_mr, LPC_HC_REGS_OPB_ADDR, + &lpc->lpc_hc_regs); + + /* XScom region for LPC registers */ + pnv_xscom_region_init(&lpc->xscom_regs, OBJECT(dev), + &pnv_lpc_xscom_ops, lpc, "xscom-lpc", + PNV_XSCOM_LPC_SIZE); +} + +static void pnv_lpc_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + PnvXScomInterfaceClass *xdc = PNV_XSCOM_INTERFACE_CLASS(klass); + + xdc->populate = pnv_lpc_populate; + + dc->realize = pnv_lpc_realize; +} + +static const TypeInfo pnv_lpc_info = { + .name = TYPE_PNV_LPC, + .parent = TYPE_DEVICE, + .instance_size = sizeof(PnvLpcController), + .class_init = pnv_lpc_class_init, + .interfaces = (InterfaceInfo[]) { + { TYPE_PNV_XSCOM_INTERFACE }, + { } + } +}; + +static void pnv_lpc_register_types(void) +{ + type_register_static(&pnv_lpc_info); +} + +type_init(pnv_lpc_register_types) diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index 7db922e285..ce16e47724 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -22,6 +22,7 @@ #include "hw/boards.h" #include "hw/sysbus.h" #include "hw/ppc/pnv_xscom.h" +#include "hw/ppc/pnv_lpc.h" #define TYPE_PNV_CHIP "powernv-chip" #define PNV_CHIP(obj) OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP) @@ -54,6 +55,8 @@ typedef struct PnvChip { MemoryRegion xscom_mmio; MemoryRegion xscom; AddressSpace xscom_as; + + PnvLpcController lpc; } PnvChip; typedef struct PnvChipClass { diff --git a/include/hw/ppc/pnv_lpc.h b/include/hw/ppc/pnv_lpc.h new file mode 100644 index 0000000000..38e5506975 --- /dev/null +++ b/include/hw/ppc/pnv_lpc.h @@ -0,0 +1,67 @@ +/* + * QEMU PowerPC PowerNV LPC controller + * + * Copyright (c) 2016, IBM Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +#ifndef _PPC_PNV_LPC_H +#define _PPC_PNV_LPC_H + +#define TYPE_PNV_LPC "pnv-lpc" +#define PNV_LPC(obj) \ + OBJECT_CHECK(PnvLpcController, (obj), TYPE_PNV_LPC) + +typedef struct PnvLpcController { + DeviceState parent; + + uint64_t eccb_stat_reg; + uint32_t eccb_data_reg; + + /* OPB bus */ + MemoryRegion opb_mr; + AddressSpace opb_as; + + /* ISA IO and Memory space */ + MemoryRegion isa_io; + MemoryRegion isa_mem; + + /* Windows from OPB to ISA (aliases) */ + MemoryRegion opb_isa_io; + MemoryRegion opb_isa_mem; + MemoryRegion opb_isa_fw; + + /* Registers */ + MemoryRegion lpc_hc_regs; + MemoryRegion opb_master_regs; + + /* OPB Master LS registers */ + uint32_t opb_irq_stat; + uint32_t opb_irq_mask; + uint32_t opb_irq_pol; + uint32_t opb_irq_input; + + /* LPC HC registers */ + uint32_t lpc_hc_fw_seg_idsel; + uint32_t lpc_hc_fw_rd_acc_size; + uint32_t lpc_hc_irqser_ctrl; + uint32_t lpc_hc_irqmask; + uint32_t lpc_hc_irqstat; + uint32_t lpc_hc_error_addr; + + /* XSCOM registers */ + MemoryRegion xscom_regs; +} PnvLpcController; + +#endif /* _PPC_PNV_LPC_H */ diff --git a/include/hw/ppc/pnv_xscom.h b/include/hw/ppc/pnv_xscom.h index 5da6e92e69..c0a2fbb9f6 100644 --- a/include/hw/ppc/pnv_xscom.h +++ b/include/hw/ppc/pnv_xscom.h @@ -60,6 +60,9 @@ typedef struct PnvXScomInterfaceClass { #define PNV_XSCOM_EX_CORE_BASE(i) (PNV_XSCOM_EX_BASE | (((uint64_t)i) << 24)) #define PNV_XSCOM_EX_CORE_SIZE 0x100000 +#define PNV_XSCOM_LPC_BASE 0xb0020 +#define PNV_XSCOM_LPC_SIZE 0x4 + extern void pnv_xscom_realize(PnvChip *chip, Error **errp); extern int pnv_xscom_populate(PnvChip *chip, void *fdt, int offset); From 3495b6b6101e680b6a7b27674f5d3e446b1cf013 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= Date: Sat, 22 Oct 2016 11:46:43 +0200 Subject: [PATCH 32/73] ppc/pnv: add a ISA bus MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As Qemu only supports a single instance of the ISA bus, we use the LPC controller of chip 0 to create one and plug in a couple of useful devices, like an UART and RTC. An IPMI BT device, which is also an ISA device, can be defined on the command line to connect an external BMC. That is for later. The PowerNV machine now has a console. Skiboot should load a kernel and jump into it but execution will stop quite early because we lack a model for the native XICS controller for the moment : [ 0.000000] NR_IRQS:512 nr_irqs:512 16 [ 0.000000] XICS: Cannot find a Presentation Controller ! [ 0.000000] ------------[ cut here ]------------ [ 0.000000] WARNING: at arch/powerpc/platforms/powernv/setup.c:81 ... [ 0.000000] NIP [c00000000079d65c] pnv_init_IRQ+0x30/0x44 You can still do a few things under xmon. Based on previous work from : Benjamin Herrenschmidt Signed-off-by: Cédric Le Goater Reviewed-by: David Gibson [dwg: Trivial fix for a change in the serial_hds_isa_init() interface] Signed-off-by: David Gibson --- hw/ppc/pnv.c | 65 ++++++++++++++++++++++++++++++++++++++++++++ include/hw/ppc/pnv.h | 2 ++ 2 files changed, 67 insertions(+) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index aa712fd6f5..82276e0857 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -35,6 +35,10 @@ #include "hw/ppc/pnv_xscom.h" +#include "hw/isa/isa.h" +#include "hw/char/serial.h" +#include "hw/timer/mc146818rtc.h" + #include #define FDT_MAX_SIZE 0x00100000 @@ -301,6 +305,58 @@ static void ppc_powernv_reset(void) cpu_physical_memory_write(PNV_FDT_ADDR, fdt, fdt_totalsize(fdt)); } +/* If we don't use the built-in LPC interrupt deserializer, we need + * to provide a set of qirqs for the ISA bus or things will go bad. + * + * Most machines using pre-Naples chips (without said deserializer) + * have a CPLD that will collect the SerIRQ and shoot them as a + * single level interrupt to the P8 chip. So let's setup a hook + * for doing just that. + * + * Note: The actual interrupt input isn't emulated yet, this will + * come with the PSI bridge model. + */ +static void pnv_lpc_isa_irq_handler_cpld(void *opaque, int n, int level) +{ + /* We don't yet emulate the PSI bridge which provides the external + * interrupt, so just drop interrupts on the floor + */ +} + +static void pnv_lpc_isa_irq_handler(void *opaque, int n, int level) +{ + /* XXX TODO */ +} + +static ISABus *pnv_isa_create(PnvChip *chip) +{ + PnvLpcController *lpc = &chip->lpc; + ISABus *isa_bus; + qemu_irq *irqs; + PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip); + + /* let isa_bus_new() create its own bridge on SysBus otherwise + * devices speficied on the command line won't find the bus and + * will fail to create. + */ + isa_bus = isa_bus_new(NULL, &lpc->isa_mem, &lpc->isa_io, + &error_fatal); + + /* Not all variants have a working serial irq decoder. If not, + * handling of LPC interrupts becomes a platform issue (some + * platforms have a CPLD to do it). + */ + if (pcc->chip_type == PNV_CHIP_POWER8NVL) { + irqs = qemu_allocate_irqs(pnv_lpc_isa_irq_handler, chip, ISA_NUM_IRQS); + } else { + irqs = qemu_allocate_irqs(pnv_lpc_isa_irq_handler_cpld, chip, + ISA_NUM_IRQS); + } + + isa_bus_irqs(isa_bus, irqs); + return isa_bus; +} + static void ppc_powernv_init(MachineState *machine) { PnvMachineState *pnv = POWERNV_MACHINE(machine); @@ -395,6 +451,15 @@ static void ppc_powernv_init(MachineState *machine) object_property_set_bool(chip, true, "realized", &error_fatal); } g_free(chip_typename); + + /* Instantiate ISA bus on chip 0 */ + pnv->isa_bus = pnv_isa_create(pnv->chips[0]); + + /* Create serial port */ + serial_hds_isa_init(pnv->isa_bus, 0, MAX_SERIAL_PORTS); + + /* Create an RTC ISA device too */ + rtc_init(pnv->isa_bus, 2000, NULL); } /* diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index ce16e47724..02ac1c5f42 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -112,6 +112,8 @@ typedef struct PnvMachineState { uint32_t num_chips; PnvChip **chips; + + ISABus *isa_bus; } PnvMachineState; #define PNV_FDT_ADDR 0x01000000 From 37ad52ba7ae415e7a78676aa7bb5e9f4fc6c8030 Mon Sep 17 00:00:00 2001 From: Vasant Hegde Date: Mon, 24 Oct 2016 14:44:58 +0530 Subject: [PATCH 33/73] target-ppc: add vmul10[u,eu,cu,ecu]q instructions vmul10uq : Vector Multiply-by-10 Unsigned Quadword VX-form vmul10euq : Vector Multiply-by-10 Extended Unsigned Quadword VX-form vmul10cuq : Vector Multiply-by-10 & write Carry Unsigned Quadword VX-form vmul10ecuq: Vector Multiply-by-10 Extended & write Carry Unsigned Quadword VX-form Signed-off-by: Vasant Hegde [ Add GEN_VXFORM_DUAL_EXT with invalid bit mask ] Signed-off-by: Nikunj A Dadhania Signed-off-by: David Gibson --- target-ppc/translate/vmx-impl.inc.c | 72 +++++++++++++++++++++++++++++ target-ppc/translate/vmx-ops.inc.c | 8 ++-- 2 files changed, 76 insertions(+), 4 deletions(-) diff --git a/target-ppc/translate/vmx-impl.inc.c b/target-ppc/translate/vmx-impl.inc.c index 563f101642..fc612d9f37 100644 --- a/target-ppc/translate/vmx-impl.inc.c +++ b/target-ppc/translate/vmx-impl.inc.c @@ -182,6 +182,52 @@ static void gen_mtvscr(DisasContext *ctx) tcg_temp_free_ptr(p); } +#define GEN_VX_VMUL10(name, add_cin, ret_carry) \ +static void glue(gen_, name)(DisasContext *ctx) \ +{ \ + TCGv_i64 t0 = tcg_temp_new_i64(); \ + TCGv_i64 t1 = tcg_temp_new_i64(); \ + TCGv_i64 t2 = tcg_temp_new_i64(); \ + TCGv_i64 ten, z; \ + \ + if (unlikely(!ctx->altivec_enabled)) { \ + gen_exception(ctx, POWERPC_EXCP_VPU); \ + return; \ + } \ + \ + ten = tcg_const_i64(10); \ + z = tcg_const_i64(0); \ + \ + if (add_cin) { \ + tcg_gen_mulu2_i64(t0, t1, cpu_avrl[rA(ctx->opcode)], ten); \ + tcg_gen_andi_i64(t2, cpu_avrl[rB(ctx->opcode)], 0xF); \ + tcg_gen_add2_i64(cpu_avrl[rD(ctx->opcode)], t2, t0, t1, t2, z); \ + } else { \ + tcg_gen_mulu2_i64(cpu_avrl[rD(ctx->opcode)], t2, \ + cpu_avrl[rA(ctx->opcode)], ten); \ + } \ + \ + if (ret_carry) { \ + tcg_gen_mulu2_i64(t0, t1, cpu_avrh[rA(ctx->opcode)], ten); \ + tcg_gen_add2_i64(t0, cpu_avrl[rD(ctx->opcode)], t0, t1, t2, z); \ + tcg_gen_movi_i64(cpu_avrh[rD(ctx->opcode)], 0); \ + } else { \ + tcg_gen_mul_i64(t0, cpu_avrh[rA(ctx->opcode)], ten); \ + tcg_gen_add_i64(cpu_avrh[rD(ctx->opcode)], t0, t2); \ + } \ + \ + tcg_temp_free_i64(t0); \ + tcg_temp_free_i64(t1); \ + tcg_temp_free_i64(t2); \ + tcg_temp_free_i64(ten); \ + tcg_temp_free_i64(z); \ +} \ + +GEN_VX_VMUL10(vmul10uq, 0, 0); +GEN_VX_VMUL10(vmul10euq, 1, 0); +GEN_VX_VMUL10(vmul10cuq, 0, 1); +GEN_VX_VMUL10(vmul10ecuq, 1, 1); + /* Logical operations */ #define GEN_VX_LOGICAL(name, tcg_op, opc2, opc3) \ static void glue(gen_, name)(DisasContext *ctx) \ @@ -276,8 +322,30 @@ static void glue(gen_, name0##_##name1)(DisasContext *ctx) \ } \ } +/* Adds support to provide invalid mask */ +#define GEN_VXFORM_DUAL_EXT(name0, flg0, flg2_0, inval0, \ + name1, flg1, flg2_1, inval1) \ +static void glue(gen_, name0##_##name1)(DisasContext *ctx) \ +{ \ + if ((Rc(ctx->opcode) == 0) && \ + ((ctx->insns_flags & flg0) || (ctx->insns_flags2 & flg2_0)) && \ + !(ctx->opcode & inval0)) { \ + gen_##name0(ctx); \ + } else if ((Rc(ctx->opcode) == 1) && \ + ((ctx->insns_flags & flg1) || (ctx->insns_flags2 & flg2_1)) && \ + !(ctx->opcode & inval1)) { \ + gen_##name1(ctx); \ + } else { \ + gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL); \ + } \ +} + GEN_VXFORM(vaddubm, 0, 0); +GEN_VXFORM_DUAL_EXT(vaddubm, PPC_ALTIVEC, PPC_NONE, 0, \ + vmul10cuq, PPC_NONE, PPC2_ISA300, 0x0000F800) GEN_VXFORM(vadduhm, 0, 1); +GEN_VXFORM_DUAL(vadduhm, PPC_ALTIVEC, PPC_NONE, \ + vmul10ecuq, PPC_NONE, PPC2_ISA300) GEN_VXFORM(vadduwm, 0, 2); GEN_VXFORM(vaddudm, 0, 3); GEN_VXFORM(vsububm, 0, 16); @@ -390,7 +458,11 @@ GEN_VXFORM(vsro, 6, 17); GEN_VXFORM(vaddcuw, 0, 6); GEN_VXFORM(vsubcuw, 0, 22); GEN_VXFORM_ENV(vaddubs, 0, 8); +GEN_VXFORM_DUAL_EXT(vaddubs, PPC_ALTIVEC, PPC_NONE, 0, \ + vmul10uq, PPC_NONE, PPC2_ISA300, 0x0000F800) GEN_VXFORM_ENV(vadduhs, 0, 9); +GEN_VXFORM_DUAL(vadduhs, PPC_ALTIVEC, PPC_NONE, \ + vmul10euq, PPC_NONE, PPC2_ISA300) GEN_VXFORM_ENV(vadduws, 0, 10); GEN_VXFORM_ENV(vaddsbs, 0, 12); GEN_VXFORM_ENV(vaddshs, 0, 13); diff --git a/target-ppc/translate/vmx-ops.inc.c b/target-ppc/translate/vmx-ops.inc.c index ab64ab2e01..cc7ed7eeed 100644 --- a/target-ppc/translate/vmx-ops.inc.c +++ b/target-ppc/translate/vmx-ops.inc.c @@ -55,8 +55,8 @@ GEN_HANDLER_E(name0##_##name1, 0x4, opc2, opc3, 0x00000000, type0, type1) GEN_HANDLER_E(name0##_##name1, 0x4, opc2, opc3, 0x00000000, tp0, tp1), \ GEN_HANDLER_E(name0##_##name1, 0x4, opc2, (opc3 | 0x10), 0x00000000, tp0, tp1), -GEN_VXFORM(vaddubm, 0, 0), -GEN_VXFORM(vadduhm, 0, 1), +GEN_VXFORM_DUAL(vaddubm, vmul10cuq, 0, 0, PPC_ALTIVEC, PPC_NONE), +GEN_VXFORM_DUAL(vadduhm, vmul10ecuq, 0, 1, PPC_ALTIVEC, PPC_NONE), GEN_VXFORM(vadduwm, 0, 2), GEN_VXFORM_207(vaddudm, 0, 3), GEN_VXFORM_DUAL(vsububm, bcdadd, 0, 16, PPC_ALTIVEC, PPC_NONE), @@ -123,8 +123,8 @@ GEN_VXFORM(vslo, 6, 16), GEN_VXFORM(vsro, 6, 17), GEN_VXFORM(vaddcuw, 0, 6), GEN_VXFORM(vsubcuw, 0, 22), -GEN_VXFORM(vaddubs, 0, 8), -GEN_VXFORM(vadduhs, 0, 9), +GEN_VXFORM_DUAL(vaddubs, vmul10uq, 0, 8, PPC_ALTIVEC, PPC_NONE), +GEN_VXFORM_DUAL(vadduhs, vmul10euq, 0, 9, PPC_ALTIVEC, PPC_NONE), GEN_VXFORM(vadduws, 0, 10), GEN_VXFORM(vaddsbs, 0, 12), GEN_VXFORM(vaddshs, 0, 13), From 997b6cfc3d13aa145fcdbf294521e581d6617bde Mon Sep 17 00:00:00 2001 From: David Gibson Date: Tue, 25 Oct 2016 11:51:33 +1100 Subject: [PATCH 34/73] pseries: Split device tree construction from device tree load spapr_finalize_fdt() both finishes building the device tree for the guest and loads it into guest memory. For future cleanups, it's going to be more convenient to do these two things separately. The loading portion is pretty trivial, so we move it inline into the caller, ppc_spapr_reset(). We also rename spapr_finalize_fdt(), because the current name is going to become inaccurate. Signed-off-by: David Gibson Reviewed-by: Michael Roth Reviewed-by: Alexey Kardashevskiy --- hw/ppc/spapr.c | 42 ++++++++++++++++++++++------------------- hw/ppc/spapr_cpu_core.c | 2 +- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 486f57d6f6..874f53d8f0 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -900,10 +900,9 @@ int spapr_h_cas_compose_response(sPAPRMachineState *spapr, return 0; } -static void spapr_finalize_fdt(sPAPRMachineState *spapr, - hwaddr fdt_addr, - hwaddr rtas_addr, - hwaddr rtas_size) +static void *spapr_build_fdt(sPAPRMachineState *spapr, + hwaddr rtas_addr, + hwaddr rtas_size) { MachineState *machine = MACHINE(qdev_get_machine()); MachineClass *mc = MACHINE_GET_CLASS(machine); @@ -999,19 +998,8 @@ static void spapr_finalize_fdt(sPAPRMachineState *spapr, } } - _FDT((fdt_pack(fdt))); - - if (fdt_totalsize(fdt) > FDT_MAX_SIZE) { - error_report("FDT too big ! 0x%x bytes (max is 0x%x)", - fdt_totalsize(fdt), FDT_MAX_SIZE); - exit(1); - } - - qemu_fdt_dumpdtb(fdt, fdt_totalsize(fdt)); - cpu_physical_memory_write(fdt_addr, fdt, fdt_totalsize(fdt)); - g_free(bootlist); - g_free(fdt); + return fdt; } static uint64_t translate_kernel_address(void *opaque, uint64_t addr) @@ -1147,6 +1135,8 @@ static void ppc_spapr_reset(void) sPAPRMachineState *spapr = SPAPR_MACHINE(machine); PowerPCCPU *first_ppc_cpu; uint32_t rtas_limit; + void *fdt; + int rc; /* Check for unknown sysbus devices */ foreach_dynamic_sysbus_device(find_unknown_sysbus_device, NULL); @@ -1173,14 +1163,28 @@ static void ppc_spapr_reset(void) spapr->rtas_addr = rtas_limit - RTAS_MAX_SIZE; spapr->fdt_addr = spapr->rtas_addr - FDT_MAX_SIZE; - /* Load the fdt */ - spapr_finalize_fdt(spapr, spapr->fdt_addr, spapr->rtas_addr, - spapr->rtas_size); + fdt = spapr_build_fdt(spapr, spapr->rtas_addr, spapr->rtas_size); /* Copy RTAS over */ cpu_physical_memory_write(spapr->rtas_addr, spapr->rtas_blob, spapr->rtas_size); + rc = fdt_pack(fdt); + + /* Should only fail if we've built a corrupted tree */ + assert(rc == 0); + + if (fdt_totalsize(fdt) > FDT_MAX_SIZE) { + error_report("FDT too big ! 0x%x bytes (max is 0x%x)", + fdt_totalsize(fdt), FDT_MAX_SIZE); + exit(1); + } + + /* Load the fdt */ + qemu_fdt_dumpdtb(fdt, fdt_totalsize(fdt)); + cpu_physical_memory_write(spapr->fdt_addr, fdt, fdt_totalsize(fdt)); + g_free(fdt); + /* Set up the entry state */ first_ppc_cpu = POWERPC_CPU(first_cpu); first_ppc_cpu->env.gpr[3] = spapr->fdt_addr; diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c index bc922bc86f..e0c14f6b77 100644 --- a/hw/ppc/spapr_cpu_core.c +++ b/hw/ppc/spapr_cpu_core.c @@ -184,7 +184,7 @@ void spapr_core_plug(HotplugHandler *hotplug_dev, DeviceState *dev, /* * Setup CPU DT entries only for hotplugged CPUs. For boot time or - * coldplugged CPUs DT entries are setup in spapr_finalize_fdt(). + * coldplugged CPUs DT entries are setup in spapr_build_fdt(). */ if (dev->hotplugged) { fdt = spapr_populate_hotplug_cpu_dt(cs, &fdt_offset, spapr); From cae172ab6daa18e1edc789c237a11d6dbc858ee0 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Thu, 20 Oct 2016 15:30:53 +1100 Subject: [PATCH 35/73] pseries: Remove rtas_addr and fdt_addr fields from machinestate These values are used only within ppc_spapr_reset(), so just change them to local variables. Signed-off-by: David Gibson Reviewed-by: Thomas Huth Reviewed-by: Alexey Kardashevskiy Reviewed-by: Michael Roth --- hw/ppc/spapr.c | 14 +++++++------- include/hw/ppc/spapr.h | 1 - 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 874f53d8f0..9c38fe04b4 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -1135,6 +1135,7 @@ static void ppc_spapr_reset(void) sPAPRMachineState *spapr = SPAPR_MACHINE(machine); PowerPCCPU *first_ppc_cpu; uint32_t rtas_limit; + hwaddr rtas_addr, fdt_addr; void *fdt; int rc; @@ -1160,14 +1161,13 @@ static void ppc_spapr_reset(void) * processed with 32-bit real mode code if necessary */ rtas_limit = MIN(spapr->rma_size, RTAS_MAX_ADDR); - spapr->rtas_addr = rtas_limit - RTAS_MAX_SIZE; - spapr->fdt_addr = spapr->rtas_addr - FDT_MAX_SIZE; + rtas_addr = rtas_limit - RTAS_MAX_SIZE; + fdt_addr = rtas_addr - FDT_MAX_SIZE; - fdt = spapr_build_fdt(spapr, spapr->rtas_addr, spapr->rtas_size); + fdt = spapr_build_fdt(spapr, rtas_addr, spapr->rtas_size); /* Copy RTAS over */ - cpu_physical_memory_write(spapr->rtas_addr, spapr->rtas_blob, - spapr->rtas_size); + cpu_physical_memory_write(rtas_addr, spapr->rtas_blob, spapr->rtas_size); rc = fdt_pack(fdt); @@ -1182,12 +1182,12 @@ static void ppc_spapr_reset(void) /* Load the fdt */ qemu_fdt_dumpdtb(fdt, fdt_totalsize(fdt)); - cpu_physical_memory_write(spapr->fdt_addr, fdt, fdt_totalsize(fdt)); + cpu_physical_memory_write(fdt_addr, fdt, fdt_totalsize(fdt)); g_free(fdt); /* Set up the entry state */ first_ppc_cpu = POWERPC_CPU(first_cpu); - first_ppc_cpu->env.gpr[3] = spapr->fdt_addr; + first_ppc_cpu->env.gpr[3] = fdt_addr; first_ppc_cpu->env.gpr[5] = 0; first_cpu->halted = 0; first_ppc_cpu->env.nip = SPAPR_ENTRY_POINT; diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index aeaba3edf9..1174741d0b 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -63,7 +63,6 @@ struct sPAPRMachineState { uint32_t htab_shift; hwaddr rma_size; int vrma_adjust; - hwaddr fdt_addr, rtas_addr; ssize_t rtas_size; void *rtas_blob; void *fdt_skel; From a19f7fb0456b3d1329a2086d81418a49c1eae9b9 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Thu, 20 Oct 2016 15:31:45 +1100 Subject: [PATCH 36/73] pseries: Make spapr_create_fdt_skel() get information from machine state Currently spapr_create_fdt_skel() takes a bunch of individual parameters for various things it will put in the device tree. Some of these can already be taken directly from sPAPRMachineState. This patch alters it so that all of them can be taken from there, which will allow this code to be moved away from its current caller in future. Signed-off-by: David Gibson Reviewed-by: Alexey Kardashevskiy Reviewed-by: Thomas Huth Reviewed-by: Michael Roth --- hw/ppc/spapr.c | 79 +++++++++++++++++++----------------------- include/hw/ppc/spapr.h | 4 +++ 2 files changed, 39 insertions(+), 44 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 9c38fe04b4..3b23920f5d 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -271,16 +271,12 @@ static void add_str(GString *s, const gchar *s1) g_string_append_len(s, s1, strlen(s1) + 1); } -static void *spapr_create_fdt_skel(hwaddr initrd_base, - hwaddr initrd_size, - hwaddr kernel_size, - bool little_endian, - const char *kernel_cmdline, - uint32_t epow_irq) +static void *spapr_create_fdt_skel(sPAPRMachineState *spapr) { + MachineState *machine = MACHINE(spapr); void *fdt; - uint32_t start_prop = cpu_to_be32(initrd_base); - uint32_t end_prop = cpu_to_be32(initrd_base + initrd_size); + uint32_t start_prop = cpu_to_be32(spapr->initrd_base); + uint32_t end_prop = cpu_to_be32(spapr->initrd_base + spapr->initrd_size); GString *hypertas = g_string_sized_new(256); GString *qemu_hypertas = g_string_sized_new(256); uint32_t refpoints[] = {cpu_to_be32(0x4), cpu_to_be32(0x4)}; @@ -305,11 +301,13 @@ static void *spapr_create_fdt_skel(hwaddr initrd_base, fdt = g_malloc0(FDT_MAX_SIZE); _FDT((fdt_create(fdt, FDT_MAX_SIZE))); - if (kernel_size) { - _FDT((fdt_add_reservemap_entry(fdt, KERNEL_LOAD_ADDR, kernel_size))); + if (spapr->kernel_size) { + _FDT((fdt_add_reservemap_entry(fdt, KERNEL_LOAD_ADDR, + spapr->kernel_size))); } - if (initrd_size) { - _FDT((fdt_add_reservemap_entry(fdt, initrd_base, initrd_size))); + if (spapr->initrd_size) { + _FDT((fdt_add_reservemap_entry(fdt, spapr->initrd_base, + spapr->initrd_size))); } _FDT((fdt_finish_reservemap(fdt))); @@ -354,17 +352,17 @@ static void *spapr_create_fdt_skel(hwaddr initrd_base, /* Set Form1_affinity */ _FDT((fdt_property(fdt, "ibm,architecture-vec-5", vec5, sizeof(vec5)))); - _FDT((fdt_property_string(fdt, "bootargs", kernel_cmdline))); + _FDT((fdt_property_string(fdt, "bootargs", machine->kernel_cmdline))); _FDT((fdt_property(fdt, "linux,initrd-start", &start_prop, sizeof(start_prop)))); _FDT((fdt_property(fdt, "linux,initrd-end", &end_prop, sizeof(end_prop)))); - if (kernel_size) { + if (spapr->kernel_size) { uint64_t kprop[2] = { cpu_to_be64(KERNEL_LOAD_ADDR), - cpu_to_be64(kernel_size) }; + cpu_to_be64(spapr->kernel_size) }; _FDT((fdt_property(fdt, "qemu,boot-kernel", &kprop, sizeof(kprop)))); - if (little_endian) { + if (spapr->kernel_le) { _FDT((fdt_property(fdt, "qemu,boot-kernel-le", NULL, 0))); } } @@ -441,7 +439,7 @@ static void *spapr_create_fdt_skel(hwaddr initrd_base, _FDT((fdt_end_node(fdt))); /* event-sources */ - spapr_events_fdt_skel(fdt, epow_irq); + spapr_events_fdt_skel(fdt, spapr->check_exception_irq); /* /hypervisor node */ if (kvm_enabled()) { @@ -1686,7 +1684,6 @@ static void ppc_spapr_init(MachineState *machine) MachineClass *mc = MACHINE_GET_CLASS(machine); sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine); const char *kernel_filename = machine->kernel_filename; - const char *kernel_cmdline = machine->kernel_cmdline; const char *initrd_filename = machine->initrd_filename; PCIHostState *phb; int i; @@ -1696,10 +1693,7 @@ static void ppc_spapr_init(MachineState *machine) void *rma = NULL; hwaddr rma_alloc_size; hwaddr node0_size = spapr_node0_size(); - uint32_t initrd_base = 0; - long kernel_size = 0, initrd_size = 0; long load_limit, fw_size; - bool kernel_le = false; char *filename; int smt = kvmppc_smt_threads(); int spapr_cores = smp_cpus / smp_threads; @@ -1972,19 +1966,19 @@ static void ppc_spapr_init(MachineState *machine) if (kernel_filename) { uint64_t lowaddr = 0; - kernel_size = load_elf(kernel_filename, translate_kernel_address, NULL, - NULL, &lowaddr, NULL, 1, PPC_ELF_MACHINE, - 0, 0); - if (kernel_size == ELF_LOAD_WRONG_ENDIAN) { - kernel_size = load_elf(kernel_filename, - translate_kernel_address, NULL, - NULL, &lowaddr, NULL, 0, PPC_ELF_MACHINE, - 0, 0); - kernel_le = kernel_size > 0; + spapr->kernel_size = load_elf(kernel_filename, translate_kernel_address, + NULL, NULL, &lowaddr, NULL, 1, + PPC_ELF_MACHINE, 0, 0); + if (spapr->kernel_size == ELF_LOAD_WRONG_ENDIAN) { + spapr->kernel_size = load_elf(kernel_filename, + translate_kernel_address, NULL, NULL, + &lowaddr, NULL, 0, PPC_ELF_MACHINE, + 0, 0); + spapr->kernel_le = spapr->kernel_size > 0; } - if (kernel_size < 0) { - error_report("error loading %s: %s", - kernel_filename, load_elf_strerror(kernel_size)); + if (spapr->kernel_size < 0) { + error_report("error loading %s: %s", kernel_filename, + load_elf_strerror(spapr->kernel_size)); exit(1); } @@ -1993,17 +1987,17 @@ static void ppc_spapr_init(MachineState *machine) /* Try to locate the initrd in the gap between the kernel * and the firmware. Add a bit of space just in case */ - initrd_base = (KERNEL_LOAD_ADDR + kernel_size + 0x1ffff) & ~0xffff; - initrd_size = load_image_targphys(initrd_filename, initrd_base, - load_limit - initrd_base); - if (initrd_size < 0) { + spapr->initrd_base = (KERNEL_LOAD_ADDR + spapr->kernel_size + + 0x1ffff) & ~0xffff; + spapr->initrd_size = load_image_targphys(initrd_filename, + spapr->initrd_base, + load_limit + - spapr->initrd_base); + if (spapr->initrd_size < 0) { error_report("could not load initial ram disk '%s'", initrd_filename); exit(1); } - } else { - initrd_base = 0; - initrd_size = 0; } } @@ -2030,10 +2024,7 @@ static void ppc_spapr_init(MachineState *machine) &savevm_htab_handlers, spapr); /* Prepare the device tree */ - spapr->fdt_skel = spapr_create_fdt_skel(initrd_base, initrd_size, - kernel_size, kernel_le, - kernel_cmdline, - spapr->check_exception_irq); + spapr->fdt_skel = spapr_create_fdt_skel(spapr); assert(spapr->fdt_skel != NULL); /* used by RTAS */ diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 1174741d0b..a0b4bf80e0 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -65,6 +65,10 @@ struct sPAPRMachineState { int vrma_adjust; ssize_t rtas_size; void *rtas_blob; + long kernel_size; + bool kernel_le; + uint32_t initrd_base; + long initrd_size; void *fdt_skel; uint64_t rtc_offset; /* Now used only during incoming migration */ struct PPCTimebase tb; From cf6e522390126bdd20406481f3df79c194a431bd Mon Sep 17 00:00:00 2001 From: David Gibson Date: Thu, 20 Oct 2016 15:34:59 +1100 Subject: [PATCH 37/73] pseries: Move adding of fdt reserve map entries The flattened device tree passed to pseries guests contains a list of reserved memory areas. Currently we construct this list early in spapr_create_fdt_skel() as we sequentially write the fdt. This will be inconvenient for upcoming cleanups, so this patch moves the reserve map changes to the end of fdt construction. This changes fdt_add_reservemap_entry() calls - which work when writing the fdt sequentially to fdt_add_mem_rsv() calls used when altering the fdt in random access mode. Signed-off-by: David Gibson Reviewed-by: Thomas Huth Reviewed-by: Michael Roth --- hw/ppc/spapr.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 3b23920f5d..8e58d8670d 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -301,14 +301,6 @@ static void *spapr_create_fdt_skel(sPAPRMachineState *spapr) fdt = g_malloc0(FDT_MAX_SIZE); _FDT((fdt_create(fdt, FDT_MAX_SIZE))); - if (spapr->kernel_size) { - _FDT((fdt_add_reservemap_entry(fdt, KERNEL_LOAD_ADDR, - spapr->kernel_size))); - } - if (spapr->initrd_size) { - _FDT((fdt_add_reservemap_entry(fdt, spapr->initrd_base, - spapr->initrd_size))); - } _FDT((fdt_finish_reservemap(fdt))); /* Root node */ @@ -997,6 +989,15 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr, } g_free(bootlist); + + /* Build memory reserve map */ + if (spapr->kernel_size) { + _FDT((fdt_add_mem_rsv(fdt, KERNEL_LOAD_ADDR, spapr->kernel_size))); + } + if (spapr->initrd_size) { + _FDT((fdt_add_mem_rsv(fdt, spapr->initrd_base, spapr->initrd_size))); + } + return fdt; } From 2cac78c12ade9a87b6251f8d854c2e43a30f41bf Mon Sep 17 00:00:00 2001 From: David Gibson Date: Thu, 20 Oct 2016 15:37:41 +1100 Subject: [PATCH 38/73] pseries: Consolidate RTAS loading At each system reset, the pseries machine needs to load RTAS (the runtime portion of the guest firmware) into the VM. This means copying the actual RTAS code into guest memory, and also updating the device tree so that the guest OS and boot firmware can locate it. For historical reasons the copy and update to the device tree were in different parts of the code. This cleanup brings them both together in an spapr_load_rtas() function. Signed-off-by: David Gibson Reviewed-by: Alexey Kardashevskiy Reviewed-by: Thomas Huth Reviewed-by: Michael Roth --- hw/ppc/spapr.c | 3 +- hw/ppc/spapr_rtas.c | 72 ++++++++++++++++++++++++------------------ include/hw/ppc/spapr.h | 1 + 3 files changed, 43 insertions(+), 33 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 8e58d8670d..17733dffa3 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -1165,8 +1165,7 @@ static void ppc_spapr_reset(void) fdt = spapr_build_fdt(spapr, rtas_addr, spapr->rtas_size); - /* Copy RTAS over */ - cpu_physical_memory_write(rtas_addr, spapr->rtas_blob, spapr->rtas_size); + spapr_load_rtas(spapr, fdt, rtas_addr); rc = fdt_pack(fdt); diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c index 0db84c816d..54b4ad3305 100644 --- a/hw/ppc/spapr_rtas.c +++ b/hw/ppc/spapr_rtas.c @@ -721,37 +721,6 @@ int spapr_rtas_device_tree_setup(void *fdt, hwaddr rtas_addr, uint64_t max_hotplug_addr = spapr->hotplug_memory.base + memory_region_size(&spapr->hotplug_memory.mr); - ret = fdt_add_mem_rsv(fdt, rtas_addr, rtas_size); - if (ret < 0) { - error_report("Couldn't add RTAS reserve entry: %s", - fdt_strerror(ret)); - return ret; - } - - ret = qemu_fdt_setprop_cell(fdt, "/rtas", "linux,rtas-base", - rtas_addr); - if (ret < 0) { - error_report("Couldn't add linux,rtas-base property: %s", - fdt_strerror(ret)); - return ret; - } - - ret = qemu_fdt_setprop_cell(fdt, "/rtas", "linux,rtas-entry", - rtas_addr); - if (ret < 0) { - error_report("Couldn't add linux,rtas-entry property: %s", - fdt_strerror(ret)); - return ret; - } - - ret = qemu_fdt_setprop_cell(fdt, "/rtas", "rtas-size", - rtas_size); - if (ret < 0) { - error_report("Couldn't add rtas-size property: %s", - fdt_strerror(ret)); - return ret; - } - for (i = 0; i < RTAS_TOKEN_MAX - RTAS_TOKEN_BASE; i++) { struct rtas_call *call = &rtas_table[i]; @@ -784,6 +753,47 @@ int spapr_rtas_device_tree_setup(void *fdt, hwaddr rtas_addr, return 0; } +void spapr_load_rtas(sPAPRMachineState *spapr, void *fdt, hwaddr addr) +{ + int rtas_node; + int ret; + + /* Copy RTAS blob into guest RAM */ + cpu_physical_memory_write(addr, spapr->rtas_blob, spapr->rtas_size); + + ret = fdt_add_mem_rsv(fdt, addr, spapr->rtas_size); + if (ret < 0) { + error_report("Couldn't add RTAS reserve entry: %s", + fdt_strerror(ret)); + exit(1); + } + + /* Update the device tree with the blob's location */ + rtas_node = fdt_path_offset(fdt, "/rtas"); + assert(rtas_node >= 0); + + ret = fdt_setprop_cell(fdt, rtas_node, "linux,rtas-base", addr); + if (ret < 0) { + error_report("Couldn't add linux,rtas-base property: %s", + fdt_strerror(ret)); + exit(1); + } + + ret = fdt_setprop_cell(fdt, rtas_node, "linux,rtas-entry", addr); + if (ret < 0) { + error_report("Couldn't add linux,rtas-entry property: %s", + fdt_strerror(ret)); + exit(1); + } + + ret = fdt_setprop_cell(fdt, rtas_node, "rtas-size", spapr->rtas_size); + if (ret < 0) { + error_report("Couldn't add rtas-size property: %s", + fdt_strerror(ret)); + exit(1); + } +} + static void core_rtas_register_types(void) { spapr_rtas_register(RTAS_DISPLAY_CHARACTER, "display-character", diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index a0b4bf80e0..847ae88186 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -532,6 +532,7 @@ target_ulong spapr_rtas_call(PowerPCCPU *cpu, sPAPRMachineState *sm, uint32_t nret, target_ulong rets); int spapr_rtas_device_tree_setup(void *fdt, hwaddr rtas_addr, hwaddr rtas_size); +void spapr_load_rtas(sPAPRMachineState *spapr, void *fdt, hwaddr addr); #define SPAPR_TCE_PAGE_SHIFT 12 #define SPAPR_TCE_PAGE_SIZE (1ULL << SPAPR_TCE_PAGE_SHIFT) From 9b9a19080a6e548b91420ce7925f2ac81ef63ae8 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Thu, 20 Oct 2016 16:07:56 +1100 Subject: [PATCH 39/73] pseries: Move construction of /interrupt-controller fdt node Currently the device tree node for the XICS interrupt controller is in spapr_create_fdt_skel(). As part of consolidating device tree construction to reset time, this moves it to a function called from spapr_build_fdt(). In addition we move the actual code into hw/intc/xics_spapr.c with the rest of the PAPR specific interrupt controller code. Signed-off-by: David Gibson Reviewed-by: Thomas Huth Reviewed-by: Michael Roth --- hw/intc/xics_spapr.c | 22 ++++++++++++++++++++++ hw/ppc/spapr.c | 20 +++----------------- include/hw/ppc/xics.h | 1 + 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/hw/intc/xics_spapr.c b/hw/intc/xics_spapr.c index b4e55012e0..2e3f1c5e95 100644 --- a/hw/intc/xics_spapr.c +++ b/hw/intc/xics_spapr.c @@ -32,6 +32,7 @@ #include "qemu/timer.h" #include "hw/ppc/spapr.h" #include "hw/ppc/xics.h" +#include "hw/ppc/fdt.h" #include "qapi/visitor.h" #include "qapi/error.h" @@ -449,6 +450,27 @@ void xics_spapr_free(XICSState *xics, int irq, int num) } } +void spapr_dt_xics(XICSState *xics, void *fdt, uint32_t phandle) +{ + uint32_t interrupt_server_ranges_prop[] = { + 0, cpu_to_be32(xics->nr_servers), + }; + int node; + + _FDT(node = fdt_add_subnode(fdt, 0, "interrupt-controller")); + + _FDT(fdt_setprop_string(fdt, node, "device_type", + "PowerPC-External-Interrupt-Presentation")); + _FDT(fdt_setprop_string(fdt, node, "compatible", "IBM,ppc-xicp")); + _FDT(fdt_setprop(fdt, node, "interrupt-controller", NULL, 0)); + _FDT(fdt_setprop(fdt, node, "ibm,interrupt-server-ranges", + interrupt_server_ranges_prop, + sizeof(interrupt_server_ranges_prop))); + _FDT(fdt_setprop_cell(fdt, node, "#interrupt-cells", 2)); + _FDT(fdt_setprop_cell(fdt, node, "linux,phandle", phandle)); + _FDT(fdt_setprop_cell(fdt, node, "phandle", phandle)); +} + static void xics_spapr_register_types(void) { type_register_static(&xics_spapr_info); diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 17733dffa3..102f0081ec 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -280,7 +280,6 @@ static void *spapr_create_fdt_skel(sPAPRMachineState *spapr) GString *hypertas = g_string_sized_new(256); GString *qemu_hypertas = g_string_sized_new(256); uint32_t refpoints[] = {cpu_to_be32(0x4), cpu_to_be32(0x4)}; - uint32_t interrupt_server_ranges_prop[] = {0, cpu_to_be32(max_cpus)}; unsigned char vec5[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x80}; char *buf; @@ -402,22 +401,6 @@ static void *spapr_create_fdt_skel(sPAPRMachineState *spapr) _FDT((fdt_end_node(fdt))); - /* interrupt controller */ - _FDT((fdt_begin_node(fdt, "interrupt-controller"))); - - _FDT((fdt_property_string(fdt, "device_type", - "PowerPC-External-Interrupt-Presentation"))); - _FDT((fdt_property_string(fdt, "compatible", "IBM,ppc-xicp"))); - _FDT((fdt_property(fdt, "interrupt-controller", NULL, 0))); - _FDT((fdt_property(fdt, "ibm,interrupt-server-ranges", - interrupt_server_ranges_prop, - sizeof(interrupt_server_ranges_prop)))); - _FDT((fdt_property_cell(fdt, "#interrupt-cells", 2))); - _FDT((fdt_property_cell(fdt, "linux,phandle", PHANDLE_XICP))); - _FDT((fdt_property_cell(fdt, "phandle", PHANDLE_XICP))); - - _FDT((fdt_end_node(fdt))); - /* vdevice */ _FDT((fdt_begin_node(fdt, "vdevice"))); @@ -909,6 +892,9 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr, /* open out the base tree into a temp buffer for the final tweaks */ _FDT((fdt_open_into(spapr->fdt_skel, fdt, FDT_MAX_SIZE))); + /* /interrupt controller */ + spapr_dt_xics(spapr->xics, fdt, PHANDLE_XICP); + ret = spapr_populate_memory(spapr, fdt); if (ret < 0) { error_report("couldn't setup memory nodes in fdt"); diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h index 6e5a113332..3f0c31610a 100644 --- a/include/hw/ppc/xics.h +++ b/include/hw/ppc/xics.h @@ -187,6 +187,7 @@ int xics_spapr_alloc(XICSState *icp, int irq_hint, bool lsi, Error **errp); int xics_spapr_alloc_block(XICSState *icp, int num, bool lsi, bool align, Error **errp); void xics_spapr_free(XICSState *icp, int irq, int num); +void spapr_dt_xics(XICSState *xics, void *fdt, uint32_t phandle); void xics_cpu_setup(XICSState *icp, PowerPCCPU *cpu); void xics_cpu_destroy(XICSState *icp, PowerPCCPU *cpu); From 7c866c6a600e435cf92f764b831d9cb3234ca0b4 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Mon, 24 Oct 2016 12:05:57 +1100 Subject: [PATCH 40/73] pseries: Consolidate construction of /chosen device tree node For historical reasons, building the /chosen node in the guest device tree is split across several places and includes both parts which write the DT sequentially and others which use random access functions. This patch consolidates construction of the node into one place, using random access functions throughout. Signed-off-by: David Gibson Reviewed-by: Thomas Huth Reviewed-by: Michael Roth --- hw/ppc/spapr.c | 131 ++++++++++++++++++------------------- hw/ppc/spapr_vio.c | 17 ++--- include/hw/ppc/spapr_vio.h | 2 +- 3 files changed, 70 insertions(+), 80 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 102f0081ec..1d8dd7f5b9 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -273,14 +273,10 @@ static void add_str(GString *s, const gchar *s1) static void *spapr_create_fdt_skel(sPAPRMachineState *spapr) { - MachineState *machine = MACHINE(spapr); void *fdt; - uint32_t start_prop = cpu_to_be32(spapr->initrd_base); - uint32_t end_prop = cpu_to_be32(spapr->initrd_base + spapr->initrd_size); GString *hypertas = g_string_sized_new(256); GString *qemu_hypertas = g_string_sized_new(256); uint32_t refpoints[] = {cpu_to_be32(0x4), cpu_to_be32(0x4)}; - unsigned char vec5[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x80}; char *buf; add_str(hypertas, "hcall-pft"); @@ -337,35 +333,6 @@ static void *spapr_create_fdt_skel(sPAPRMachineState *spapr) _FDT((fdt_property_cell(fdt, "#address-cells", 0x2))); _FDT((fdt_property_cell(fdt, "#size-cells", 0x2))); - /* /chosen */ - _FDT((fdt_begin_node(fdt, "chosen"))); - - /* Set Form1_affinity */ - _FDT((fdt_property(fdt, "ibm,architecture-vec-5", vec5, sizeof(vec5)))); - - _FDT((fdt_property_string(fdt, "bootargs", machine->kernel_cmdline))); - _FDT((fdt_property(fdt, "linux,initrd-start", - &start_prop, sizeof(start_prop)))); - _FDT((fdt_property(fdt, "linux,initrd-end", - &end_prop, sizeof(end_prop)))); - if (spapr->kernel_size) { - uint64_t kprop[2] = { cpu_to_be64(KERNEL_LOAD_ADDR), - cpu_to_be64(spapr->kernel_size) }; - - _FDT((fdt_property(fdt, "qemu,boot-kernel", &kprop, sizeof(kprop)))); - if (spapr->kernel_le) { - _FDT((fdt_property(fdt, "qemu,boot-kernel-le", NULL, 0))); - } - } - if (boot_menu) { - _FDT((fdt_property_cell(fdt, "qemu,boot-menu", boot_menu))); - } - _FDT((fdt_property_cell(fdt, "qemu,graphic-width", graphic_width))); - _FDT((fdt_property_cell(fdt, "qemu,graphic-height", graphic_height))); - _FDT((fdt_property_cell(fdt, "qemu,graphic-depth", graphic_depth))); - - _FDT((fdt_end_node(fdt))); - /* RTAS */ _FDT((fdt_begin_node(fdt, "rtas"))); @@ -873,6 +840,68 @@ int spapr_h_cas_compose_response(sPAPRMachineState *spapr, return 0; } +static void spapr_dt_chosen(sPAPRMachineState *spapr, void *fdt) +{ + MachineState *machine = MACHINE(spapr); + int chosen; + const char *boot_device = machine->boot_order; + char *stdout_path = spapr_vio_stdout_path(spapr->vio_bus); + size_t cb = 0; + char *bootlist = get_boot_devices_list(&cb, true); + unsigned char vec5[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x80}; + + _FDT(chosen = fdt_add_subnode(fdt, 0, "chosen")); + + /* Set Form1_affinity */ + _FDT(fdt_setprop(fdt, chosen, "ibm,architecture-vec-5", + vec5, sizeof(vec5))); + + _FDT(fdt_setprop_string(fdt, chosen, "bootargs", machine->kernel_cmdline)); + _FDT(fdt_setprop_cell(fdt, chosen, "linux,initrd-start", + spapr->initrd_base)); + _FDT(fdt_setprop_cell(fdt, chosen, "linux,initrd-end", + spapr->initrd_base + spapr->initrd_size)); + + if (spapr->kernel_size) { + uint64_t kprop[2] = { cpu_to_be64(KERNEL_LOAD_ADDR), + cpu_to_be64(spapr->kernel_size) }; + + _FDT(fdt_setprop(fdt, chosen, "qemu,boot-kernel", + &kprop, sizeof(kprop))); + if (spapr->kernel_le) { + _FDT(fdt_setprop(fdt, chosen, "qemu,boot-kernel-le", NULL, 0)); + } + } + if (boot_menu) { + _FDT((fdt_setprop_cell(fdt, chosen, "qemu,boot-menu", boot_menu))); + } + _FDT(fdt_setprop_cell(fdt, chosen, "qemu,graphic-width", graphic_width)); + _FDT(fdt_setprop_cell(fdt, chosen, "qemu,graphic-height", graphic_height)); + _FDT(fdt_setprop_cell(fdt, chosen, "qemu,graphic-depth", graphic_depth)); + + if (cb && bootlist) { + int i; + + for (i = 0; i < cb; i++) { + if (bootlist[i] == '\n') { + bootlist[i] = ' '; + } + } + _FDT(fdt_setprop_string(fdt, chosen, "qemu,boot-list", bootlist)); + } + + if (boot_device && strlen(boot_device)) { + _FDT(fdt_setprop_string(fdt, chosen, "qemu,boot-device", boot_device)); + } + + if (!spapr->has_graphics && stdout_path) { + _FDT(fdt_setprop_string(fdt, chosen, "linux,stdout-path", stdout_path)); + } + + g_free(stdout_path); + g_free(bootlist); +} + static void *spapr_build_fdt(sPAPRMachineState *spapr, hwaddr rtas_addr, hwaddr rtas_size) @@ -880,10 +909,7 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr, MachineState *machine = MACHINE(qdev_get_machine()); MachineClass *mc = MACHINE_GET_CLASS(machine); sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine); - const char *boot_device = machine->boot_order; - int ret, i; - size_t cb = 0; - char *bootlist; + int ret; void *fdt; sPAPRPHBState *phb; @@ -932,34 +958,6 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr, /* cpus */ spapr_populate_cpus_dt_node(fdt, spapr); - bootlist = get_boot_devices_list(&cb, true); - if (cb && bootlist) { - int offset = fdt_path_offset(fdt, "/chosen"); - if (offset < 0) { - exit(1); - } - for (i = 0; i < cb; i++) { - if (bootlist[i] == '\n') { - bootlist[i] = ' '; - } - - } - ret = fdt_setprop_string(fdt, offset, "qemu,boot-list", bootlist); - } - - if (boot_device && strlen(boot_device)) { - int offset = fdt_path_offset(fdt, "/chosen"); - - if (offset < 0) { - exit(1); - } - fdt_setprop_string(fdt, offset, "qemu,boot-device", boot_device); - } - - if (!spapr->has_graphics) { - spapr_populate_chosen_stdout(fdt, spapr->vio_bus); - } - if (smc->dr_lmb_enabled) { _FDT(spapr_drc_populate_dt(fdt, 0, NULL, SPAPR_DR_CONNECTOR_TYPE_LMB)); } @@ -974,7 +972,8 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr, } } - g_free(bootlist); + /* /chosen */ + spapr_dt_chosen(spapr, fdt); /* Build memory reserve map */ if (spapr->kernel_size) { diff --git a/hw/ppc/spapr_vio.c b/hw/ppc/spapr_vio.c index 3648aa5960..2b67df0a97 100644 --- a/hw/ppc/spapr_vio.c +++ b/hw/ppc/spapr_vio.c @@ -665,28 +665,19 @@ out: return ret; } -int spapr_populate_chosen_stdout(void *fdt, VIOsPAPRBus *bus) +gchar *spapr_vio_stdout_path(VIOsPAPRBus *bus) { VIOsPAPRDevice *dev; char *name, *path; - int ret, offset; dev = spapr_vty_get_default(bus); - if (!dev) - return 0; - - offset = fdt_path_offset(fdt, "/chosen"); - if (offset < 0) { - return offset; + if (!dev) { + return NULL; } name = spapr_vio_get_dev_name(DEVICE(dev)); path = g_strdup_printf("/vdevice/%s", name); - ret = fdt_setprop_string(fdt, offset, "linux,stdout-path", path); - g_free(name); - g_free(path); - - return ret; + return path; } diff --git a/include/hw/ppc/spapr_vio.h b/include/hw/ppc/spapr_vio.h index 0b025fd66b..a0e75424fa 100644 --- a/include/hw/ppc/spapr_vio.h +++ b/include/hw/ppc/spapr_vio.h @@ -81,7 +81,7 @@ struct VIOsPAPRBus { extern VIOsPAPRBus *spapr_vio_bus_init(void); extern VIOsPAPRDevice *spapr_vio_find_by_reg(VIOsPAPRBus *bus, uint32_t reg); extern int spapr_populate_vdevice(VIOsPAPRBus *bus, void *fdt); -extern int spapr_populate_chosen_stdout(void *fdt, VIOsPAPRBus *bus); +extern gchar *spapr_vio_stdout_path(VIOsPAPRBus *bus); static inline qemu_irq spapr_vio_qirq(VIOsPAPRDevice *dev) { From 3f5dabceba246e502555a9046b98174d7548e696 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Thu, 20 Oct 2016 15:55:36 +1100 Subject: [PATCH 41/73] pseries: Consolidate construction of /rtas device tree node For historical reasons construction of the /rtas node in the device tree (amongst others) is split into several places. In particular it's split between spapr_create_fdt_skel(), spapr_build_fdt() and spapr_rtas_device_tree_setup(). In fact, as well as adding the actual RTAS tokens to the device tree, spapr_rtas_device_tree_setup() just adds the ibm,lrdr-capacity property, which despite going in the /rtas node, doesn't have a lot to do with RTAS. This patch consolidates the code constructing /rtas together into a new spapr_dt_rtas() function. spapr_rtas_device_tree_setup() is renamed to spapr_dt_rtas_tokens() and now only adds the token properties. Signed-off-by: David Gibson Reviewed-by: Thomas Huth Reviewed-by: Michael Roth --- hw/ppc/spapr.c | 130 +++++++++++++++++++++++------------------ hw/ppc/spapr_rtas.c | 33 +---------- include/hw/ppc/spapr.h | 3 +- 3 files changed, 76 insertions(+), 90 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 1d8dd7f5b9..1b61de250d 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -274,25 +274,8 @@ static void add_str(GString *s, const gchar *s1) static void *spapr_create_fdt_skel(sPAPRMachineState *spapr) { void *fdt; - GString *hypertas = g_string_sized_new(256); - GString *qemu_hypertas = g_string_sized_new(256); - uint32_t refpoints[] = {cpu_to_be32(0x4), cpu_to_be32(0x4)}; char *buf; - add_str(hypertas, "hcall-pft"); - add_str(hypertas, "hcall-term"); - add_str(hypertas, "hcall-dabr"); - add_str(hypertas, "hcall-interrupt"); - add_str(hypertas, "hcall-tce"); - add_str(hypertas, "hcall-vio"); - add_str(hypertas, "hcall-splpar"); - add_str(hypertas, "hcall-bulk"); - add_str(hypertas, "hcall-set-mode"); - add_str(hypertas, "hcall-sprg0"); - add_str(hypertas, "hcall-copy"); - add_str(hypertas, "hcall-debug"); - add_str(qemu_hypertas, "hcall-memop1"); - fdt = g_malloc0(FDT_MAX_SIZE); _FDT((fdt_create(fdt, FDT_MAX_SIZE))); @@ -333,41 +316,6 @@ static void *spapr_create_fdt_skel(sPAPRMachineState *spapr) _FDT((fdt_property_cell(fdt, "#address-cells", 0x2))); _FDT((fdt_property_cell(fdt, "#size-cells", 0x2))); - /* RTAS */ - _FDT((fdt_begin_node(fdt, "rtas"))); - - if (!kvm_enabled() || kvmppc_spapr_use_multitce()) { - add_str(hypertas, "hcall-multi-tce"); - } - _FDT((fdt_property(fdt, "ibm,hypertas-functions", hypertas->str, - hypertas->len))); - g_string_free(hypertas, TRUE); - _FDT((fdt_property(fdt, "qemu,hypertas-functions", qemu_hypertas->str, - qemu_hypertas->len))); - g_string_free(qemu_hypertas, TRUE); - - _FDT((fdt_property(fdt, "ibm,associativity-reference-points", - refpoints, sizeof(refpoints)))); - - _FDT((fdt_property_cell(fdt, "rtas-error-log-max", RTAS_ERROR_LOG_MAX))); - _FDT((fdt_property_cell(fdt, "rtas-event-scan-rate", - RTAS_EVENT_SCAN_RATE))); - - if (msi_nonbroken) { - _FDT((fdt_property(fdt, "ibm,change-msix-capable", NULL, 0))); - } - - /* - * According to PAPR, rtas ibm,os-term does not guarantee a return - * back to the guest cpu. - * - * While an additional ibm,extended-os-term property indicates that - * rtas call return will always occur. Set this property. - */ - _FDT((fdt_property(fdt, "ibm,extended-os-term", NULL, 0))); - - _FDT((fdt_end_node(fdt))); - /* vdevice */ _FDT((fdt_begin_node(fdt, "vdevice"))); @@ -840,6 +788,75 @@ int spapr_h_cas_compose_response(sPAPRMachineState *spapr, return 0; } +static void spapr_dt_rtas(sPAPRMachineState *spapr, void *fdt) +{ + int rtas; + GString *hypertas = g_string_sized_new(256); + GString *qemu_hypertas = g_string_sized_new(256); + uint32_t refpoints[] = { cpu_to_be32(0x4), cpu_to_be32(0x4) }; + uint64_t max_hotplug_addr = spapr->hotplug_memory.base + + memory_region_size(&spapr->hotplug_memory.mr); + uint32_t lrdr_capacity[] = { + cpu_to_be32(max_hotplug_addr >> 32), + cpu_to_be32(max_hotplug_addr & 0xffffffff), + 0, cpu_to_be32(SPAPR_MEMORY_BLOCK_SIZE), + cpu_to_be32(max_cpus / smp_threads), + }; + + _FDT(rtas = fdt_add_subnode(fdt, 0, "rtas")); + + /* hypertas */ + add_str(hypertas, "hcall-pft"); + add_str(hypertas, "hcall-term"); + add_str(hypertas, "hcall-dabr"); + add_str(hypertas, "hcall-interrupt"); + add_str(hypertas, "hcall-tce"); + add_str(hypertas, "hcall-vio"); + add_str(hypertas, "hcall-splpar"); + add_str(hypertas, "hcall-bulk"); + add_str(hypertas, "hcall-set-mode"); + add_str(hypertas, "hcall-sprg0"); + add_str(hypertas, "hcall-copy"); + add_str(hypertas, "hcall-debug"); + add_str(qemu_hypertas, "hcall-memop1"); + + if (!kvm_enabled() || kvmppc_spapr_use_multitce()) { + add_str(hypertas, "hcall-multi-tce"); + } + _FDT(fdt_setprop(fdt, rtas, "ibm,hypertas-functions", + hypertas->str, hypertas->len)); + g_string_free(hypertas, TRUE); + _FDT(fdt_setprop(fdt, rtas, "qemu,hypertas-functions", + qemu_hypertas->str, qemu_hypertas->len)); + g_string_free(qemu_hypertas, TRUE); + + _FDT(fdt_setprop(fdt, rtas, "ibm,associativity-reference-points", + refpoints, sizeof(refpoints))); + + _FDT(fdt_setprop_cell(fdt, rtas, "rtas-error-log-max", + RTAS_ERROR_LOG_MAX)); + _FDT(fdt_setprop_cell(fdt, rtas, "rtas-event-scan-rate", + RTAS_EVENT_SCAN_RATE)); + + if (msi_nonbroken) { + _FDT(fdt_setprop(fdt, rtas, "ibm,change-msix-capable", NULL, 0)); + } + + /* + * According to PAPR, rtas ibm,os-term does not guarantee a return + * back to the guest cpu. + * + * While an additional ibm,extended-os-term property indicates + * that rtas call return will always occur. Set this property. + */ + _FDT(fdt_setprop(fdt, rtas, "ibm,extended-os-term", NULL, 0)); + + _FDT(fdt_setprop(fdt, rtas, "ibm,lrdr-capacity", + lrdr_capacity, sizeof(lrdr_capacity))); + + spapr_dt_rtas_tokens(fdt, rtas); +} + static void spapr_dt_chosen(sPAPRMachineState *spapr, void *fdt) { MachineState *machine = MACHINE(spapr); @@ -949,12 +966,6 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr, } } - /* RTAS */ - ret = spapr_rtas_device_tree_setup(fdt, rtas_addr, rtas_size); - if (ret < 0) { - error_report("Couldn't set up RTAS device tree properties"); - } - /* cpus */ spapr_populate_cpus_dt_node(fdt, spapr); @@ -972,6 +983,9 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr, } } + /* /rtas */ + spapr_dt_rtas(spapr, fdt); + /* /chosen */ spapr_dt_chosen(spapr, fdt); diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c index 54b4ad3305..bb19944686 100644 --- a/hw/ppc/spapr_rtas.c +++ b/hw/ppc/spapr_rtas.c @@ -46,6 +46,7 @@ #include "hw/ppc/spapr_drc.h" #include "qemu/cutils.h" #include "trace.h" +#include "hw/ppc/fdt.h" static sPAPRConfigureConnectorState *spapr_ccs_find(sPAPRMachineState *spapr, uint32_t drc_index) @@ -710,16 +711,9 @@ void spapr_rtas_register(int token, const char *name, spapr_rtas_fn fn) rtas_table[token].fn = fn; } -int spapr_rtas_device_tree_setup(void *fdt, hwaddr rtas_addr, - hwaddr rtas_size) +void spapr_dt_rtas_tokens(void *fdt, int rtas) { - int ret; int i; - uint32_t lrdr_capacity[5]; - MachineState *machine = MACHINE(qdev_get_machine()); - sPAPRMachineState *spapr = SPAPR_MACHINE(machine); - uint64_t max_hotplug_addr = spapr->hotplug_memory.base + - memory_region_size(&spapr->hotplug_memory.mr); for (i = 0; i < RTAS_TOKEN_MAX - RTAS_TOKEN_BASE; i++) { struct rtas_call *call = &rtas_table[i]; @@ -728,29 +722,8 @@ int spapr_rtas_device_tree_setup(void *fdt, hwaddr rtas_addr, continue; } - ret = qemu_fdt_setprop_cell(fdt, "/rtas", call->name, - i + RTAS_TOKEN_BASE); - if (ret < 0) { - error_report("Couldn't add rtas token for %s: %s", - call->name, fdt_strerror(ret)); - return ret; - } - + _FDT(fdt_setprop_cell(fdt, rtas, call->name, i + RTAS_TOKEN_BASE)); } - - lrdr_capacity[0] = cpu_to_be32(max_hotplug_addr >> 32); - lrdr_capacity[1] = cpu_to_be32(max_hotplug_addr & 0xffffffff); - lrdr_capacity[2] = 0; - lrdr_capacity[3] = cpu_to_be32(SPAPR_MEMORY_BLOCK_SIZE); - lrdr_capacity[4] = cpu_to_be32(max_cpus/smp_threads); - ret = qemu_fdt_setprop(fdt, "/rtas", "ibm,lrdr-capacity", lrdr_capacity, - sizeof(lrdr_capacity)); - if (ret < 0) { - error_report("Couldn't add ibm,lrdr-capacity rtas property"); - return ret; - } - - return 0; } void spapr_load_rtas(sPAPRMachineState *spapr, void *fdt, hwaddr addr) diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 847ae88186..8b8bb97634 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -530,8 +530,7 @@ void spapr_rtas_register(int token, const char *name, spapr_rtas_fn fn); target_ulong spapr_rtas_call(PowerPCCPU *cpu, sPAPRMachineState *sm, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets); -int spapr_rtas_device_tree_setup(void *fdt, hwaddr rtas_addr, - hwaddr rtas_size); +void spapr_dt_rtas_tokens(void *fdt, int rtas); void spapr_load_rtas(sPAPRMachineState *spapr, void *fdt, hwaddr addr); #define SPAPR_TCE_PAGE_SHIFT 12 From ffb1e275a67cfeb957d0d0df2ec1f0999e321f69 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Thu, 20 Oct 2016 15:56:48 +1100 Subject: [PATCH 42/73] pseries: Move /event-sources construction to spapr_build_fdt() The /event-sources device tree node is built from spapr_create_fdt_skel(). As part of consolidating device tree construction to reset time, this moves it to spapr_build_fdt(). Signed-off-by: David Gibson Reviewed-by: Thomas Huth Reviewed-by: Michael Roth --- hw/ppc/spapr.c | 6 +++--- hw/ppc/spapr_events.c | 21 ++++++++++----------- include/hw/ppc/spapr.h | 2 +- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 1b61de250d..048fb3d7cb 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -328,9 +328,6 @@ static void *spapr_create_fdt_skel(sPAPRMachineState *spapr) _FDT((fdt_end_node(fdt))); - /* event-sources */ - spapr_events_fdt_skel(fdt, spapr->check_exception_irq); - /* /hypervisor node */ if (kvm_enabled()) { uint8_t hypercall[16]; @@ -983,6 +980,9 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr, } } + /* /event-sources */ + spapr_dt_events(fdt, spapr->check_exception_irq); + /* /rtas */ spapr_dt_rtas(spapr, fdt); diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c index 6d3534541c..89aa5a7926 100644 --- a/hw/ppc/spapr_events.c +++ b/hw/ppc/spapr_events.c @@ -211,23 +211,22 @@ struct hp_log_full { #define EVENT_MASK_HOTPLUG 0x10000000 #define EVENT_MASK_IO 0x08000000 -void spapr_events_fdt_skel(void *fdt, uint32_t check_exception_irq) +void spapr_dt_events(void *fdt, uint32_t check_exception_irq) { + int event_sources, epow_events; uint32_t irq_ranges[] = {cpu_to_be32(check_exception_irq), cpu_to_be32(1)}; uint32_t interrupts[] = {cpu_to_be32(check_exception_irq), 0}; - _FDT((fdt_begin_node(fdt, "event-sources"))); + _FDT(event_sources = fdt_add_subnode(fdt, 0, "event-sources")); - _FDT((fdt_property(fdt, "interrupt-controller", NULL, 0))); - _FDT((fdt_property_cell(fdt, "#interrupt-cells", 2))); - _FDT((fdt_property(fdt, "interrupt-ranges", - irq_ranges, sizeof(irq_ranges)))); + _FDT(fdt_setprop(fdt, event_sources, "interrupt-controller", NULL, 0)); + _FDT(fdt_setprop_cell(fdt, event_sources, "#interrupt-cells", 2)); + _FDT(fdt_setprop(fdt, event_sources, "interrupt-ranges", + irq_ranges, sizeof(irq_ranges))); - _FDT((fdt_begin_node(fdt, "epow-events"))); - _FDT((fdt_property(fdt, "interrupts", interrupts, sizeof(interrupts)))); - _FDT((fdt_end_node(fdt))); - - _FDT((fdt_end_node(fdt))); + _FDT(epow_events = fdt_add_subnode(fdt, event_sources, "epow-events")); + _FDT(fdt_setprop(fdt, epow_events, "interrupts", + interrupts, sizeof(interrupts))); } static void rtas_event_log_queue(int log_type, void *data, bool exception) diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 8b8bb97634..ae7d1d7043 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -581,7 +581,7 @@ struct sPAPREventLogEntry { }; void spapr_events_init(sPAPRMachineState *sm); -void spapr_events_fdt_skel(void *fdt, uint32_t epow_irq); +void spapr_dt_events(void *fdt, uint32_t check_exception_irq); int spapr_h_cas_compose_response(sPAPRMachineState *sm, target_ulong addr, target_ulong size, bool cpu_update, bool memory_update); From fca5f2dc6ca03afa78a11835a9a6b6d223fa4575 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Thu, 20 Oct 2016 15:59:36 +1100 Subject: [PATCH 43/73] pseries: Move /hypervisor node construction to fdt_build_fdt() Currently the /hypervisor device tree node is constructed in spapr_create_fdt_skel(). As part of consolidating device tree construction to reset time, move it to a function called from spapr_build_fdt(). Signed-off-by: David Gibson Reviewed-by: Thomas Huth Reviewed-by: Michael Roth --- hw/ppc/spapr.c | 49 ++++++++++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 048fb3d7cb..261be68920 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -328,27 +328,6 @@ static void *spapr_create_fdt_skel(sPAPRMachineState *spapr) _FDT((fdt_end_node(fdt))); - /* /hypervisor node */ - if (kvm_enabled()) { - uint8_t hypercall[16]; - - /* indicate KVM hypercall interface */ - _FDT((fdt_begin_node(fdt, "hypervisor"))); - _FDT((fdt_property_string(fdt, "compatible", "linux,kvm"))); - if (kvmppc_has_cap_fixup_hcalls()) { - /* - * Older KVM versions with older guest kernels were broken with the - * magic page, don't allow the guest to map it. - */ - if (!kvmppc_get_hypercall(first_cpu->env_ptr, hypercall, - sizeof(hypercall))) { - _FDT((fdt_property(fdt, "hcall-instructions", hypercall, - sizeof(hypercall)))); - } - } - _FDT((fdt_end_node(fdt))); - } - _FDT((fdt_end_node(fdt))); /* close root node */ _FDT((fdt_finish(fdt))); @@ -916,6 +895,29 @@ static void spapr_dt_chosen(sPAPRMachineState *spapr, void *fdt) g_free(bootlist); } +static void spapr_dt_hypervisor(sPAPRMachineState *spapr, void *fdt) +{ + /* The /hypervisor node isn't in PAPR - this is a hack to allow PR + * KVM to work under pHyp with some guest co-operation */ + int hypervisor; + uint8_t hypercall[16]; + + _FDT(hypervisor = fdt_add_subnode(fdt, 0, "hypervisor")); + /* indicate KVM hypercall interface */ + _FDT(fdt_setprop_string(fdt, hypervisor, "compatible", "linux,kvm")); + if (kvmppc_has_cap_fixup_hcalls()) { + /* + * Older KVM versions with older guest kernels were broken + * with the magic page, don't allow the guest to map it. + */ + if (!kvmppc_get_hypercall(first_cpu->env_ptr, hypercall, + sizeof(hypercall))) { + _FDT(fdt_setprop(fdt, hypervisor, "hcall-instructions", + hypercall, sizeof(hypercall))); + } + } +} + static void *spapr_build_fdt(sPAPRMachineState *spapr, hwaddr rtas_addr, hwaddr rtas_size) @@ -989,6 +991,11 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr, /* /chosen */ spapr_dt_chosen(spapr, fdt); + /* /hypervisor */ + if (kvm_enabled()) { + spapr_dt_hypervisor(spapr, fdt); + } + /* Build memory reserve map */ if (spapr->kernel_size) { _FDT((fdt_add_mem_rsv(fdt, KERNEL_LOAD_ADDR, spapr->kernel_size))); From bf5a6696ba95ee6efa29489dd7d53b6fbcf18469 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Thu, 20 Oct 2016 16:01:17 +1100 Subject: [PATCH 44/73] pseries: Consolidate construction of /vdevice device tree node Construction of the /vdevice node (and its children) is divided between spapr_create_fdt_skel() (at init time), which creates the base node, and spapr_populate_vdevice() (at reset time) which creates the nodes for each individual virtual device. This consolidates both into a single function called from spapr_build_fdt(). Signed-off-by: David Gibson Reviewed-by: Thomas Huth Reviewed-by: Michael Roth --- hw/ppc/spapr.c | 19 ++----------------- hw/ppc/spapr_vio.c | 23 ++++++++++++++++------- include/hw/ppc/spapr_vio.h | 2 +- 3 files changed, 19 insertions(+), 25 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 261be68920..34846da81c 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -316,18 +316,6 @@ static void *spapr_create_fdt_skel(sPAPRMachineState *spapr) _FDT((fdt_property_cell(fdt, "#address-cells", 0x2))); _FDT((fdt_property_cell(fdt, "#size-cells", 0x2))); - /* vdevice */ - _FDT((fdt_begin_node(fdt, "vdevice"))); - - _FDT((fdt_property_string(fdt, "device_type", "vdevice"))); - _FDT((fdt_property_string(fdt, "compatible", "IBM,vdevice"))); - _FDT((fdt_property_cell(fdt, "#address-cells", 0x1))); - _FDT((fdt_property_cell(fdt, "#size-cells", 0x0))); - _FDT((fdt_property_cell(fdt, "#interrupt-cells", 0x2))); - _FDT((fdt_property(fdt, "interrupt-controller", NULL, 0))); - - _FDT((fdt_end_node(fdt))); - _FDT((fdt_end_node(fdt))); /* close root node */ _FDT((fdt_finish(fdt))); @@ -943,11 +931,8 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr, exit(1); } - ret = spapr_populate_vdevice(spapr->vio_bus, fdt); - if (ret < 0) { - error_report("couldn't setup vio devices in fdt"); - exit(1); - } + /* /vdevice */ + spapr_dt_vdevice(spapr->vio_bus, fdt); if (object_resolve_path_type("", TYPE_SPAPR_RNG, NULL)) { ret = spapr_rng_populate_dt(fdt); diff --git a/hw/ppc/spapr_vio.c b/hw/ppc/spapr_vio.c index 2b67df0a97..cc1e09c568 100644 --- a/hw/ppc/spapr_vio.c +++ b/hw/ppc/spapr_vio.c @@ -36,6 +36,7 @@ #include "hw/ppc/spapr.h" #include "hw/ppc/spapr_vio.h" #include "hw/ppc/xics.h" +#include "hw/ppc/fdt.h" #include "trace.h" #include @@ -624,11 +625,21 @@ static int compare_reg(const void *p1, const void *p2) return 1; } -int spapr_populate_vdevice(VIOsPAPRBus *bus, void *fdt) +void spapr_dt_vdevice(VIOsPAPRBus *bus, void *fdt) { DeviceState *qdev, **qdevs; BusChild *kid; int i, num, ret = 0; + int node; + + _FDT(node = fdt_add_subnode(fdt, 0, "vdevice")); + + _FDT(fdt_setprop_string(fdt, node, "device_type", "vdevice")); + _FDT(fdt_setprop_string(fdt, node, "compatible", "IBM,vdevice")); + _FDT(fdt_setprop_cell(fdt, node, "#address-cells", 1)); + _FDT(fdt_setprop_cell(fdt, node, "#size-cells", 0)); + _FDT(fdt_setprop_cell(fdt, node, "#interrupt-cells", 2)); + _FDT(fdt_setprop(fdt, node, "interrupt-controller", NULL, 0)); /* Count qdevs on the bus list */ num = 0; @@ -650,19 +661,17 @@ int spapr_populate_vdevice(VIOsPAPRBus *bus, void *fdt) * to know that will mean they are in forward order in the tree. */ for (i = num - 1; i >= 0; i--) { VIOsPAPRDevice *dev = (VIOsPAPRDevice *)(qdevs[i]); + VIOsPAPRDeviceClass *vdc = VIO_SPAPR_DEVICE_GET_CLASS(dev); ret = vio_make_devnode(dev, fdt); - if (ret < 0) { - goto out; + error_report("Couldn't create device node /vdevice/%s@%"PRIx32, + vdc->dt_name, dev->reg); + exit(1); } } - ret = 0; -out: g_free(qdevs); - - return ret; } gchar *spapr_vio_stdout_path(VIOsPAPRBus *bus) diff --git a/include/hw/ppc/spapr_vio.h b/include/hw/ppc/spapr_vio.h index a0e75424fa..14f502240e 100644 --- a/include/hw/ppc/spapr_vio.h +++ b/include/hw/ppc/spapr_vio.h @@ -80,7 +80,7 @@ struct VIOsPAPRBus { extern VIOsPAPRBus *spapr_vio_bus_init(void); extern VIOsPAPRDevice *spapr_vio_find_by_reg(VIOsPAPRBus *bus, uint32_t reg); -extern int spapr_populate_vdevice(VIOsPAPRBus *bus, void *fdt); +void spapr_dt_vdevice(VIOsPAPRBus *bus, void *fdt); extern gchar *spapr_vio_stdout_path(VIOsPAPRBus *bus); static inline qemu_irq spapr_vio_qirq(VIOsPAPRDevice *dev) From 398a0bd5ae7e03b5b9bdde1dc76451ff57471a55 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Thu, 20 Oct 2016 16:05:00 +1100 Subject: [PATCH 45/73] pseries: Remove spapr_create_fdt_skel() For historical reasons construction of the guest device tree in spapr is divided between spapr_create_fdt_skel() which is called at init time, and spapr_build_fdt() which runs at reset time. Over time, more and more things have needed to be moved to reset time. Previous cleanups mean the only things left in spapr_create_fdt_skel() are the properties of the root node itself. Finish consolidating these two parts of device tree construction, by moving this to the start of spapr_build_fdt(), and removing spapr_create_fdt_skel() entirely. Signed-off-by: David Gibson Reviewed-by: Thomas Huth Reviewed-by: Michael Roth --- hw/ppc/spapr.c | 94 ++++++++++++++++-------------------------- include/hw/ppc/spapr.h | 1 - 2 files changed, 36 insertions(+), 59 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 34846da81c..209bc8404b 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -271,57 +271,6 @@ static void add_str(GString *s, const gchar *s1) g_string_append_len(s, s1, strlen(s1) + 1); } -static void *spapr_create_fdt_skel(sPAPRMachineState *spapr) -{ - void *fdt; - char *buf; - - fdt = g_malloc0(FDT_MAX_SIZE); - _FDT((fdt_create(fdt, FDT_MAX_SIZE))); - - _FDT((fdt_finish_reservemap(fdt))); - - /* Root node */ - _FDT((fdt_begin_node(fdt, ""))); - _FDT((fdt_property_string(fdt, "device_type", "chrp"))); - _FDT((fdt_property_string(fdt, "model", "IBM pSeries (emulated by qemu)"))); - _FDT((fdt_property_string(fdt, "compatible", "qemu,pseries"))); - - /* - * Add info to guest to indentify which host is it being run on - * and what is the uuid of the guest - */ - if (kvmppc_get_host_model(&buf)) { - _FDT((fdt_property_string(fdt, "host-model", buf))); - g_free(buf); - } - if (kvmppc_get_host_serial(&buf)) { - _FDT((fdt_property_string(fdt, "host-serial", buf))); - g_free(buf); - } - - buf = qemu_uuid_unparse_strdup(&qemu_uuid); - - _FDT((fdt_property_string(fdt, "vm,uuid", buf))); - if (qemu_uuid_set) { - _FDT((fdt_property_string(fdt, "system-id", buf))); - } - g_free(buf); - - if (qemu_get_vm_name()) { - _FDT((fdt_property_string(fdt, "ibm,partition-name", - qemu_get_vm_name()))); - } - - _FDT((fdt_property_cell(fdt, "#address-cells", 0x2))); - _FDT((fdt_property_cell(fdt, "#size-cells", 0x2))); - - _FDT((fdt_end_node(fdt))); /* close root node */ - _FDT((fdt_finish(fdt))); - - return fdt; -} - static int spapr_populate_memory_node(void *fdt, int nodeid, hwaddr start, hwaddr size) { @@ -916,11 +865,44 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr, int ret; void *fdt; sPAPRPHBState *phb; + char *buf; - fdt = g_malloc(FDT_MAX_SIZE); + fdt = g_malloc0(FDT_MAX_SIZE); + _FDT((fdt_create_empty_tree(fdt, FDT_MAX_SIZE))); - /* open out the base tree into a temp buffer for the final tweaks */ - _FDT((fdt_open_into(spapr->fdt_skel, fdt, FDT_MAX_SIZE))); + /* Root node */ + _FDT(fdt_setprop_string(fdt, 0, "device_type", "chrp")); + _FDT(fdt_setprop_string(fdt, 0, "model", "IBM pSeries (emulated by qemu)")); + _FDT(fdt_setprop_string(fdt, 0, "compatible", "qemu,pseries")); + + /* + * Add info to guest to indentify which host is it being run on + * and what is the uuid of the guest + */ + if (kvmppc_get_host_model(&buf)) { + _FDT(fdt_setprop_string(fdt, 0, "host-model", buf)); + g_free(buf); + } + if (kvmppc_get_host_serial(&buf)) { + _FDT(fdt_setprop_string(fdt, 0, "host-serial", buf)); + g_free(buf); + } + + buf = qemu_uuid_unparse_strdup(&qemu_uuid); + + _FDT(fdt_setprop_string(fdt, 0, "vm,uuid", buf)); + if (qemu_uuid_set) { + _FDT(fdt_setprop_string(fdt, 0, "system-id", buf)); + } + g_free(buf); + + if (qemu_get_vm_name()) { + _FDT(fdt_setprop_string(fdt, 0, "ibm,partition-name", + qemu_get_vm_name())); + } + + _FDT(fdt_setprop_cell(fdt, 0, "#address-cells", 2)); + _FDT(fdt_setprop_cell(fdt, 0, "#size-cells", 2)); /* /interrupt controller */ spapr_dt_xics(spapr->xics, fdt, PHANDLE_XICP); @@ -2014,10 +1996,6 @@ static void ppc_spapr_init(MachineState *machine) register_savevm_live(NULL, "spapr/htab", -1, 1, &savevm_htab_handlers, spapr); - /* Prepare the device tree */ - spapr->fdt_skel = spapr_create_fdt_skel(spapr); - assert(spapr->fdt_skel != NULL); - /* used by RTAS */ QTAILQ_INIT(&spapr->ccs_list); qemu_register_reset(spapr_ccs_reset_hook, spapr); diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index ae7d1d7043..d5d6e57c41 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -69,7 +69,6 @@ struct sPAPRMachineState { bool kernel_le; uint32_t initrd_base; long initrd_size; - void *fdt_skel; uint64_t rtc_offset; /* Now used only during incoming migration */ struct PPCTimebase tb; bool has_graphics; From b20b7b7adda4e2228892670a94e0a4af41c065b9 Mon Sep 17 00:00:00 2001 From: Michael Roth Date: Mon, 24 Oct 2016 23:47:27 -0500 Subject: [PATCH 46/73] spapr_ovec: initial implementation of option vector helpers PAPR guests advertise their capabilities to the platform by passing an ibm,architecture-vec structure via an ibm,client-architecture-support hcall as described by LoPAPR v11, B.6.2.3. during early boot. Using this information, the platform enables the capabilities it supports, then encodes a subset of those enabled capabilities (the 5th option vector of the ibm,architecture-vec structure passed to ibm,client-architecture-support) into the guest device tree via "/chosen/ibm,architecture-vec-5". The logical format of these these option vectors is a bit-vector, where individual bits are addressed/documented based on the byte-wise offset from the beginning of the bit-vector, followed by the bit-wise index starting from the byte-wise offset. Thus the bits of each of these bytes are stored in reverse order. Additionally, the first byte of each option vector is encodes the length of the option vector, so byte offsets begin at 1, and bit offset at 0. This is not very intuitive for the purposes of mapping these bits to a particular documented capability, so this patch introduces a set of abstractions that encapsulate the work of parsing/encoding these options vectors and testing for individual capabilities. Cc: Bharata B Rao Signed-off-by: Michael Roth [dwg: Tweaked double-include protection to not trigger a checkpatch false positive] Signed-off-by: David Gibson --- hw/ppc/Makefile.objs | 2 +- hw/ppc/spapr_ovec.c | 242 ++++++++++++++++++++++++++++++++++++ include/hw/ppc/spapr_ovec.h | 62 +++++++++ 3 files changed, 305 insertions(+), 1 deletion(-) create mode 100644 hw/ppc/spapr_ovec.c create mode 100644 include/hw/ppc/spapr_ovec.h diff --git a/hw/ppc/Makefile.objs b/hw/ppc/Makefile.objs index ebc72af0a7..8025129377 100644 --- a/hw/ppc/Makefile.objs +++ b/hw/ppc/Makefile.objs @@ -4,7 +4,7 @@ obj-y += ppc.o ppc_booke.o fdt.o obj-$(CONFIG_PSERIES) += spapr.o spapr_vio.o spapr_events.o obj-$(CONFIG_PSERIES) += spapr_hcall.o spapr_iommu.o spapr_rtas.o obj-$(CONFIG_PSERIES) += spapr_pci.o spapr_rtc.o spapr_drc.o spapr_rng.o -obj-$(CONFIG_PSERIES) += spapr_cpu_core.o +obj-$(CONFIG_PSERIES) += spapr_cpu_core.o spapr_ovec.o # IBM PowerNV obj-$(CONFIG_POWERNV) += pnv.o pnv_xscom.o pnv_core.o pnv_lpc.o ifeq ($(CONFIG_PCI)$(CONFIG_PSERIES)$(CONFIG_LINUX), yyy) diff --git a/hw/ppc/spapr_ovec.c b/hw/ppc/spapr_ovec.c new file mode 100644 index 0000000000..c2a0d18577 --- /dev/null +++ b/hw/ppc/spapr_ovec.c @@ -0,0 +1,242 @@ +/* + * QEMU SPAPR Architecture Option Vector Helper Functions + * + * Copyright IBM Corp. 2016 + * + * Authors: + * Bharata B Rao + * Michael Roth + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "hw/ppc/spapr_ovec.h" +#include "qemu/bitmap.h" +#include "exec/address-spaces.h" +#include "qemu/error-report.h" +#include + +/* #define DEBUG_SPAPR_OVEC */ + +#ifdef DEBUG_SPAPR_OVEC +#define DPRINTFN(fmt, ...) \ + do { fprintf(stderr, fmt "\n", ## __VA_ARGS__); } while (0) +#else +#define DPRINTFN(fmt, ...) \ + do { } while (0) +#endif + +#define OV_MAXBYTES 256 /* not including length byte */ +#define OV_MAXBITS (OV_MAXBYTES * BITS_PER_BYTE) + +/* we *could* work with bitmaps directly, but handling the bitmap privately + * allows us to more safely make assumptions about the bitmap size and + * simplify the calling code somewhat + */ +struct sPAPROptionVector { + unsigned long *bitmap; +}; + +sPAPROptionVector *spapr_ovec_new(void) +{ + sPAPROptionVector *ov; + + ov = g_new0(sPAPROptionVector, 1); + ov->bitmap = bitmap_new(OV_MAXBITS); + + return ov; +} + +sPAPROptionVector *spapr_ovec_clone(sPAPROptionVector *ov_orig) +{ + sPAPROptionVector *ov; + + g_assert(ov_orig); + + ov = spapr_ovec_new(); + bitmap_copy(ov->bitmap, ov_orig->bitmap, OV_MAXBITS); + + return ov; +} + +void spapr_ovec_intersect(sPAPROptionVector *ov, + sPAPROptionVector *ov1, + sPAPROptionVector *ov2) +{ + g_assert(ov); + g_assert(ov1); + g_assert(ov2); + + bitmap_and(ov->bitmap, ov1->bitmap, ov2->bitmap, OV_MAXBITS); +} + +/* returns true if options bits were removed, false otherwise */ +bool spapr_ovec_diff(sPAPROptionVector *ov, + sPAPROptionVector *ov_old, + sPAPROptionVector *ov_new) +{ + unsigned long *change_mask = bitmap_new(OV_MAXBITS); + unsigned long *removed_bits = bitmap_new(OV_MAXBITS); + bool bits_were_removed = false; + + g_assert(ov); + g_assert(ov_old); + g_assert(ov_new); + + bitmap_xor(change_mask, ov_old->bitmap, ov_new->bitmap, OV_MAXBITS); + bitmap_and(ov->bitmap, ov_new->bitmap, change_mask, OV_MAXBITS); + bitmap_and(removed_bits, ov_old->bitmap, change_mask, OV_MAXBITS); + + if (!bitmap_empty(removed_bits, OV_MAXBITS)) { + bits_were_removed = true; + } + + g_free(change_mask); + g_free(removed_bits); + + return bits_were_removed; +} + +void spapr_ovec_cleanup(sPAPROptionVector *ov) +{ + if (ov) { + g_free(ov->bitmap); + g_free(ov); + } +} + +void spapr_ovec_set(sPAPROptionVector *ov, long bitnr) +{ + g_assert(ov); + g_assert_cmpint(bitnr, <, OV_MAXBITS); + + set_bit(bitnr, ov->bitmap); +} + +void spapr_ovec_clear(sPAPROptionVector *ov, long bitnr) +{ + g_assert(ov); + g_assert_cmpint(bitnr, <, OV_MAXBITS); + + clear_bit(bitnr, ov->bitmap); +} + +bool spapr_ovec_test(sPAPROptionVector *ov, long bitnr) +{ + g_assert(ov); + g_assert_cmpint(bitnr, <, OV_MAXBITS); + + return test_bit(bitnr, ov->bitmap) ? true : false; +} + +static void guest_byte_to_bitmap(uint8_t entry, unsigned long *bitmap, + long bitmap_offset) +{ + int i; + + for (i = 0; i < BITS_PER_BYTE; i++) { + if (entry & (1 << (BITS_PER_BYTE - 1 - i))) { + bitmap_set(bitmap, bitmap_offset + i, 1); + } + } +} + +static uint8_t guest_byte_from_bitmap(unsigned long *bitmap, long bitmap_offset) +{ + uint8_t entry = 0; + int i; + + for (i = 0; i < BITS_PER_BYTE; i++) { + if (test_bit(bitmap_offset + i, bitmap)) { + entry |= (1 << (BITS_PER_BYTE - 1 - i)); + } + } + + return entry; +} + +static target_ulong vector_addr(target_ulong table_addr, int vector) +{ + uint16_t vector_count, vector_len; + int i; + + vector_count = ldub_phys(&address_space_memory, table_addr) + 1; + if (vector > vector_count) { + return 0; + } + table_addr++; /* skip nr option vectors */ + + for (i = 0; i < vector - 1; i++) { + vector_len = ldub_phys(&address_space_memory, table_addr) + 1; + table_addr += vector_len + 1; /* bit-vector + length byte */ + } + return table_addr; +} + +sPAPROptionVector *spapr_ovec_parse_vector(target_ulong table_addr, int vector) +{ + sPAPROptionVector *ov; + target_ulong addr; + uint16_t vector_len; + int i; + + g_assert(table_addr); + g_assert_cmpint(vector, >=, 1); /* vector numbering starts at 1 */ + + addr = vector_addr(table_addr, vector); + if (!addr) { + /* specified vector isn't present */ + return NULL; + } + + vector_len = ldub_phys(&address_space_memory, addr++) + 1; + g_assert_cmpint(vector_len, <=, OV_MAXBYTES); + ov = spapr_ovec_new(); + + for (i = 0; i < vector_len; i++) { + uint8_t entry = ldub_phys(&address_space_memory, addr + i); + if (entry) { + DPRINTFN("read guest vector %2d, byte %3d / %3d: 0x%.2x", + vector, i + 1, vector_len, entry); + guest_byte_to_bitmap(entry, ov->bitmap, i * BITS_PER_BYTE); + } + } + + return ov; +} + +int spapr_ovec_populate_dt(void *fdt, int fdt_offset, + sPAPROptionVector *ov, const char *name) +{ + uint8_t vec[OV_MAXBYTES + 1]; + uint16_t vec_len; + unsigned long lastbit; + int i; + + g_assert(ov); + + lastbit = find_last_bit(ov->bitmap, OV_MAXBITS); + /* if no bits are set, include at least 1 byte of the vector so we can + * still encoded this in the device tree while abiding by the same + * encoding/sizing expected in ibm,client-architecture-support + */ + vec_len = (lastbit == OV_MAXBITS) ? 1 : lastbit / BITS_PER_BYTE + 1; + g_assert_cmpint(vec_len, <=, OV_MAXBYTES); + /* guest expects vector len encoded as vec_len - 1, since the length byte + * is assumed and not included, and the first byte of the vector + * is assumed as well + */ + vec[0] = vec_len - 1; + + for (i = 1; i < vec_len + 1; i++) { + vec[i] = guest_byte_from_bitmap(ov->bitmap, (i - 1) * BITS_PER_BYTE); + if (vec[i]) { + DPRINTFN("encoding guest vector byte %3d / %3d: 0x%.2x", + i, vec_len, vec[i]); + } + } + + return fdt_setprop(fdt, fdt_offset, name, vec, vec_len); +} diff --git a/include/hw/ppc/spapr_ovec.h b/include/hw/ppc/spapr_ovec.h new file mode 100644 index 0000000000..7ee07770c4 --- /dev/null +++ b/include/hw/ppc/spapr_ovec.h @@ -0,0 +1,62 @@ +/* + * QEMU SPAPR Option/Architecture Vector Definitions + * + * Each architecture option is organized/documented by the following + * in LoPAPR 1.1, Table 244: + * + * : the bit-vector in which the option is located + * : the byte offset of the vector entry + * : the bit offset within the vector entry + * + * where each vector entry can be one or more bytes. + * + * Firmware expects a somewhat literal encoding of this bit-vector + * structure, where each entry is stored in little-endian so that the + * byte ordering reflects that of the documentation, but where each bit + * offset is from "left-to-right" in the traditional representation of + * a byte value where the MSB is the left-most bit. Thus, each + * individual byte encodes the option bits in reverse order of the + * documented bit. + * + * These definitions/helpers attempt to abstract away this internal + * representation so that we can define/set/test for individual option + * bits using only the documented values. This is done mainly by relying + * on a bitmap to approximate the documented "bit-vector" structure and + * handling conversations to-from the internal representation under the + * covers. + * + * Copyright IBM Corp. 2016 + * + * Authors: + * Michael Roth + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ +#ifndef _SPAPR_OVEC_H +#define _SPAPR_OVEC_H + +#include "cpu.h" + +typedef struct sPAPROptionVector sPAPROptionVector; + +#define OV_BIT(byte, bit) ((byte - 1) * BITS_PER_BYTE + bit) + +/* interfaces */ +sPAPROptionVector *spapr_ovec_new(void); +sPAPROptionVector *spapr_ovec_clone(sPAPROptionVector *ov_orig); +void spapr_ovec_intersect(sPAPROptionVector *ov, + sPAPROptionVector *ov1, + sPAPROptionVector *ov2); +bool spapr_ovec_diff(sPAPROptionVector *ov, + sPAPROptionVector *ov_old, + sPAPROptionVector *ov_new); +void spapr_ovec_cleanup(sPAPROptionVector *ov); +void spapr_ovec_set(sPAPROptionVector *ov, long bitnr); +void spapr_ovec_clear(sPAPROptionVector *ov, long bitnr); +bool spapr_ovec_test(sPAPROptionVector *ov, long bitnr); +sPAPROptionVector *spapr_ovec_parse_vector(target_ulong table_addr, int vector); +int spapr_ovec_populate_dt(void *fdt, int fdt_offset, + sPAPROptionVector *ov, const char *name); + +#endif /* !defined (_SPAPR_OVEC_H) */ From facdb8b63baf56bc7c0ce2f16a32900866889f03 Mon Sep 17 00:00:00 2001 From: Michael Roth Date: Mon, 24 Oct 2016 23:47:28 -0500 Subject: [PATCH 47/73] spapr_hcall: use spapr_ovec_* interfaces for CAS options Currently we access individual bytes of an option vector via ldub_phys() to test for the presence of a particular capability within that byte. Currently this is only done for the "dynamic reconfiguration memory" capability bit. If that bit is present, we pass a boolean value to spapr_h_cas_compose_response() to generate a modified device tree segment with the additional properties required to enable this functionality. As more capability bits are added, will would need to modify the code to add additional option vector accesses and extend the param list for spapr_h_cas_compose_response() to include similar boolean values for these parameters. Avoid this by switching to spapr_ovec_* helpers so we can do all the parsing in one shot and then test for these additional bits within spapr_h_cas_compose_response() directly. Cc: Bharata B Rao Signed-off-by: Michael Roth Reviewed-by: David Gibson Reviewed-by: Bharata B Rao Signed-off-by: David Gibson --- hw/ppc/spapr.c | 10 +++++-- hw/ppc/spapr_hcall.c | 56 ++++++++++--------------------------- include/hw/ppc/spapr.h | 5 +++- include/hw/ppc/spapr_ovec.h | 3 ++ 4 files changed, 30 insertions(+), 44 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 209bc8404b..9300824c2a 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -657,7 +657,7 @@ out: int spapr_h_cas_compose_response(sPAPRMachineState *spapr, target_ulong addr, target_ulong size, - bool cpu_update, bool memory_update) + bool cpu_update) { void *fdt, *fdt_skel; sPAPRDeviceTreeUpdateHeader hdr = { .version_id = 1 }; @@ -681,7 +681,8 @@ int spapr_h_cas_compose_response(sPAPRMachineState *spapr, } /* Generate ibm,dynamic-reconfiguration-memory node if required */ - if (memory_update && smc->dr_lmb_enabled) { + if (spapr_ovec_test(spapr->ov5_cas, OV5_DRCONF_MEMORY)) { + g_assert(smc->dr_lmb_enabled); _FDT((spapr_populate_drconf_memory(spapr, fdt))); } @@ -1740,7 +1741,12 @@ static void ppc_spapr_init(MachineState *machine) DIV_ROUND_UP(max_cpus * smt, smp_threads), XICS_IRQS_SPAPR, &error_fatal); + /* Set up containers for ibm,client-set-architecture negotiated options */ + spapr->ov5 = spapr_ovec_new(); + spapr->ov5_cas = spapr_ovec_new(); + if (smc->dr_lmb_enabled) { + spapr_ovec_set(spapr->ov5, OV5_DRCONF_MEMORY); spapr_validate_node_memory(machine, &error_fatal); } diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c index c5e7e8c995..f1d081b095 100644 --- a/hw/ppc/spapr_hcall.c +++ b/hw/ppc/spapr_hcall.c @@ -11,6 +11,7 @@ #include "trace.h" #include "sysemu/kvm.h" #include "kvm_ppc.h" +#include "hw/ppc/spapr_ovec.h" struct SPRSyncState { int spr; @@ -880,32 +881,6 @@ static target_ulong h_set_mode(PowerPCCPU *cpu, sPAPRMachineState *spapr, return ret; } -/* - * Return the offset to the requested option vector @vector in the - * option vector table @table. - */ -static target_ulong cas_get_option_vector(int vector, target_ulong table) -{ - int i; - char nr_vectors, nr_entries; - - if (!table) { - return 0; - } - - nr_vectors = (ldl_phys(&address_space_memory, table) >> 24) + 1; - if (!vector || vector > nr_vectors) { - return 0; - } - table++; /* skip nr option vectors */ - - for (i = 0; i < vector - 1; i++) { - nr_entries = ldl_phys(&address_space_memory, table) >> 24; - table += nr_entries + 2; - } - return table; -} - typedef struct { uint32_t cpu_version; Error *err; @@ -961,23 +936,21 @@ static void cas_handle_compat_cpu(PowerPCCPUClass *pcc, uint32_t pvr, } } -#define OV5_DRCONF_MEMORY 0x20 - static target_ulong h_client_architecture_support(PowerPCCPU *cpu_, sPAPRMachineState *spapr, target_ulong opcode, target_ulong *args) { target_ulong list = ppc64_phys_to_real(args[0]); - target_ulong ov_table, ov5; + target_ulong ov_table; PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu_); CPUState *cs; - bool cpu_match = false, cpu_update = true, memory_update = false; + bool cpu_match = false, cpu_update = true; unsigned old_cpu_version = cpu_->cpu_version; unsigned compat_lvl = 0, cpu_version = 0; unsigned max_lvl = get_compat_level(cpu_->max_compat); int counter; - char ov5_byte2; + sPAPROptionVector *ov5_guest; /* Parse PVR list */ for (counter = 0; counter < 512; ++counter) { @@ -1033,19 +1006,20 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu_, /* For the future use: here @ov_table points to the first option vector */ ov_table = list; - ov5 = cas_get_option_vector(5, ov_table); - if (!ov5) { - return H_SUCCESS; - } + ov5_guest = spapr_ovec_parse_vector(ov_table, 5); - /* @list now points to OV 5 */ - ov5_byte2 = ldub_phys(&address_space_memory, ov5 + 2); - if (ov5_byte2 & OV5_DRCONF_MEMORY) { - memory_update = true; - } + /* NOTE: there are actually a number of ov5 bits where input from the + * guest is always zero, and the platform/QEMU enables them independently + * of guest input. To model these properly we'd want some sort of mask, + * but since they only currently apply to memory migration as defined + * by LoPAPR 1.1, 14.5.4.8, which QEMU doesn't implement, we don't need + * to worry about this. + */ + spapr_ovec_intersect(spapr->ov5_cas, spapr->ov5, ov5_guest); + spapr_ovec_cleanup(ov5_guest); if (spapr_h_cas_compose_response(spapr, args[1], args[2], - cpu_update, memory_update)) { + cpu_update)) { qemu_system_reset_request(); } diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index d5d6e57c41..a37eee870f 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -6,6 +6,7 @@ #include "hw/ppc/xics.h" #include "hw/ppc/spapr_drc.h" #include "hw/mem/pc-dimm.h" +#include "hw/ppc/spapr_ovec.h" struct VIOsPAPRBus; struct sPAPRPHBState; @@ -72,6 +73,8 @@ struct sPAPRMachineState { uint64_t rtc_offset; /* Now used only during incoming migration */ struct PPCTimebase tb; bool has_graphics; + sPAPROptionVector *ov5; /* QEMU-supported option vectors */ + sPAPROptionVector *ov5_cas; /* negotiated (via CAS) option vectors */ uint32_t check_exception_irq; Notifier epow_notifier; @@ -583,7 +586,7 @@ void spapr_events_init(sPAPRMachineState *sm); void spapr_dt_events(void *fdt, uint32_t check_exception_irq); int spapr_h_cas_compose_response(sPAPRMachineState *sm, target_ulong addr, target_ulong size, - bool cpu_update, bool memory_update); + bool cpu_update); sPAPRTCETable *spapr_tce_new_table(DeviceState *owner, uint32_t liobn); void spapr_tce_table_enable(sPAPRTCETable *tcet, uint32_t page_shift, uint64_t bus_offset, diff --git a/include/hw/ppc/spapr_ovec.h b/include/hw/ppc/spapr_ovec.h index 7ee07770c4..a9a3f3a5bb 100644 --- a/include/hw/ppc/spapr_ovec.h +++ b/include/hw/ppc/spapr_ovec.h @@ -42,6 +42,9 @@ typedef struct sPAPROptionVector sPAPROptionVector; #define OV_BIT(byte, bit) ((byte - 1) * BITS_PER_BYTE + bit) +/* option vector 5 */ +#define OV5_DRCONF_MEMORY OV_BIT(2, 2) + /* interfaces */ sPAPROptionVector *spapr_ovec_new(void); sPAPROptionVector *spapr_ovec_clone(sPAPROptionVector *ov_orig); From 6787d27b04a79524c547c60701400eb0418e3533 Mon Sep 17 00:00:00 2001 From: Michael Roth Date: Mon, 24 Oct 2016 23:47:29 -0500 Subject: [PATCH 48/73] spapr: add option vector handling in CAS-generated resets In some cases, ibm,client-architecture-support calls can fail. This could happen in the current code for situations where the modified device tree segment exceeds the buffer size provided by the guest via the call parameters. In these cases, QEMU will reset, allowing an opportunity to regenerate the device tree from scratch via boot-time handling. There are potentially other scenarios as well, not currently reachable in the current code, but possible in theory, such as cases where device-tree properties or nodes need to be removed. We currently don't handle either of these properly for option vector capabilities however. Instead of carrying the negotiated capability beyond the reset and creating the boot-time device tree accordingly, we start from scratch, generating the same boot-time device tree as we did prior to the CAS-generated and the same device tree updates as we did before. This could (in theory) cause us to get stuck in a reset loop. This hasn't been observed, but depending on the extensiveness of CAS-induced device tree updates in the future, could eventually become an issue. Address this by pulling capability-related device tree updates resulting from CAS calls into a common routine, spapr_dt_cas_updates(), and adding an sPAPROptionVector* parameter that allows us to test for newly-negotiated capabilities. We invoke it as follows: 1) When ibm,client-architecture-support gets called, we call spapr_dt_cas_updates() with the set of capabilities added since the previous call to ibm,client-architecture-support. For the initial boot, or a system reset generated by something other than the CAS call itself, this set will consist of *all* options supported both the platform and the guest. For calls to ibm,client-architecture-support immediately after a CAS-induced reset, we call spapr_dt_cas_updates() with only the set of capabilities added since the previous call, since the other capabilities will have already been addressed by the boot-time device-tree this time around. In the unlikely event that capabilities are *removed* since the previous CAS, we will generate a CAS-induced reset. In the unlikely event that we cannot fit the device-tree updates into the buffer provided by the guest, well generate a CAS-induced reset. 2) When a CAS update results in the need to reset the machine and include the updates in the boot-time device tree, we call the spapr_dt_cas_updates() using the full set of negotiated capabilities as part of the reset path. At initial boot, or after a reset generated by something other than the CAS call itself, this set will be empty, resulting in what should be the same boot-time device-tree as we generated prior to this patch. For CAS-induced reset, this routine will be called with the full set of capabilities negotiated by the platform/guest in the previous CAS call, which should result in CAS updates from previous call being accounted for in the initial boot-time device tree. Signed-off-by: Michael Roth Reviewed-by: David Gibson [dwg: Changed an int -> bool conversion to be more explicit] Signed-off-by: David Gibson --- hw/ppc/spapr.c | 40 ++++++++++++++++++++++++++++++++++------ hw/ppc/spapr_hcall.c | 22 ++++++++++++++++++---- include/hw/ppc/spapr.h | 4 +++- 3 files changed, 55 insertions(+), 11 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 9300824c2a..aa6a07073d 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -655,13 +655,28 @@ out: return ret; } +static int spapr_dt_cas_updates(sPAPRMachineState *spapr, void *fdt, + sPAPROptionVector *ov5_updates) +{ + sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr); + int ret = 0; + + /* Generate ibm,dynamic-reconfiguration-memory node if required */ + if (spapr_ovec_test(ov5_updates, OV5_DRCONF_MEMORY)) { + g_assert(smc->dr_lmb_enabled); + ret = spapr_populate_drconf_memory(spapr, fdt); + } + + return ret; +} + int spapr_h_cas_compose_response(sPAPRMachineState *spapr, target_ulong addr, target_ulong size, - bool cpu_update) + bool cpu_update, + sPAPROptionVector *ov5_updates) { void *fdt, *fdt_skel; sPAPRDeviceTreeUpdateHeader hdr = { .version_id = 1 }; - sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(qdev_get_machine()); size -= sizeof(hdr); @@ -680,10 +695,8 @@ int spapr_h_cas_compose_response(sPAPRMachineState *spapr, _FDT((spapr_fixup_cpu_dt(fdt, spapr))); } - /* Generate ibm,dynamic-reconfiguration-memory node if required */ - if (spapr_ovec_test(spapr->ov5_cas, OV5_DRCONF_MEMORY)) { - g_assert(smc->dr_lmb_enabled); - _FDT((spapr_populate_drconf_memory(spapr, fdt))); + if (spapr_dt_cas_updates(spapr, fdt, ov5_updates)) { + return -1; } /* Pack resulting tree */ @@ -972,6 +985,13 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr, _FDT((fdt_add_mem_rsv(fdt, spapr->initrd_base, spapr->initrd_size))); } + /* ibm,client-architecture-support updates */ + ret = spapr_dt_cas_updates(spapr, fdt, spapr->ov5_cas); + if (ret < 0) { + error_report("couldn't setup CAS properties fdt"); + exit(1); + } + return fdt; } @@ -1137,6 +1157,13 @@ static void ppc_spapr_reset(void) rtas_addr = rtas_limit - RTAS_MAX_SIZE; fdt_addr = rtas_addr - FDT_MAX_SIZE; + /* if this reset wasn't generated by CAS, we should reset our + * negotiated options and start from scratch */ + if (!spapr->cas_reboot) { + spapr_ovec_cleanup(spapr->ov5_cas); + spapr->ov5_cas = spapr_ovec_new(); + } + fdt = spapr_build_fdt(spapr, rtas_addr, spapr->rtas_size); spapr_load_rtas(spapr, fdt, rtas_addr); @@ -1164,6 +1191,7 @@ static void ppc_spapr_reset(void) first_cpu->halted = 0; first_ppc_cpu->env.nip = SPAPR_ENTRY_POINT; + spapr->cas_reboot = false; } static void spapr_create_nvram(sPAPRMachineState *spapr) diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c index f1d081b095..7c46d4625b 100644 --- a/hw/ppc/spapr_hcall.c +++ b/hw/ppc/spapr_hcall.c @@ -950,7 +950,7 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu_, unsigned compat_lvl = 0, cpu_version = 0; unsigned max_lvl = get_compat_level(cpu_->max_compat); int counter; - sPAPROptionVector *ov5_guest; + sPAPROptionVector *ov5_guest, *ov5_cas_old, *ov5_updates; /* Parse PVR list */ for (counter = 0; counter < 512; ++counter) { @@ -1013,13 +1013,27 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu_, * of guest input. To model these properly we'd want some sort of mask, * but since they only currently apply to memory migration as defined * by LoPAPR 1.1, 14.5.4.8, which QEMU doesn't implement, we don't need - * to worry about this. + * to worry about this for now. */ + ov5_cas_old = spapr_ovec_clone(spapr->ov5_cas); + /* full range of negotiated ov5 capabilities */ spapr_ovec_intersect(spapr->ov5_cas, spapr->ov5, ov5_guest); spapr_ovec_cleanup(ov5_guest); + /* capabilities that have been added since CAS-generated guest reset. + * if capabilities have since been removed, generate another reset + */ + ov5_updates = spapr_ovec_new(); + spapr->cas_reboot = spapr_ovec_diff(ov5_updates, + ov5_cas_old, spapr->ov5_cas); - if (spapr_h_cas_compose_response(spapr, args[1], args[2], - cpu_update)) { + if (!spapr->cas_reboot) { + spapr->cas_reboot = + (spapr_h_cas_compose_response(spapr, args[1], args[2], cpu_update, + ov5_updates) != 0); + } + spapr_ovec_cleanup(ov5_updates); + + if (spapr->cas_reboot) { qemu_system_reset_request(); } diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index a37eee870f..b6f9f1b632 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -75,6 +75,7 @@ struct sPAPRMachineState { bool has_graphics; sPAPROptionVector *ov5; /* QEMU-supported option vectors */ sPAPROptionVector *ov5_cas; /* negotiated (via CAS) option vectors */ + bool cas_reboot; uint32_t check_exception_irq; Notifier epow_notifier; @@ -586,7 +587,8 @@ void spapr_events_init(sPAPRMachineState *sm); void spapr_dt_events(void *fdt, uint32_t check_exception_irq); int spapr_h_cas_compose_response(sPAPRMachineState *sm, target_ulong addr, target_ulong size, - bool cpu_update); + bool cpu_update, + sPAPROptionVector *ov5_updates); sPAPRTCETable *spapr_tce_new_table(DeviceState *owner, uint32_t liobn); void spapr_tce_table_enable(sPAPRTCETable *tcet, uint32_t page_shift, uint64_t bus_offset, From 417ece33fc1095f8acfa31208a5502bb8957f000 Mon Sep 17 00:00:00 2001 From: Michael Roth Date: Mon, 24 Oct 2016 23:47:30 -0500 Subject: [PATCH 49/73] spapr: improve ibm,architecture-vec-5 property handling ibm,architecture-vec-5 is supposed to encode all option vector 5 bits negotiated between platform/guest. Currently we hardcode this property in the boot-time device tree to advertise a single negotiated capability, "Form 1" NUMA Affinity, regardless of whether or not CAS has been invoked or that capability has actually been negotiated. Improve this by generating ibm,architecture-vec-5 based on the full set of option vector 5 capabilities negotiated via CAS. Signed-off-by: Michael Roth Signed-off-by: David Gibson --- hw/ppc/spapr.c | 23 +++++++++++++++++------ include/hw/ppc/spapr_ovec.h | 1 + 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index aa6a07073d..0b3820bbcf 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -659,14 +659,28 @@ static int spapr_dt_cas_updates(sPAPRMachineState *spapr, void *fdt, sPAPROptionVector *ov5_updates) { sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr); - int ret = 0; + int ret = 0, offset; /* Generate ibm,dynamic-reconfiguration-memory node if required */ if (spapr_ovec_test(ov5_updates, OV5_DRCONF_MEMORY)) { g_assert(smc->dr_lmb_enabled); ret = spapr_populate_drconf_memory(spapr, fdt); + if (ret) { + goto out; + } } + offset = fdt_path_offset(fdt, "/chosen"); + if (offset < 0) { + offset = fdt_add_subnode(fdt, 0, "chosen"); + if (offset < 0) { + return offset; + } + } + ret = spapr_ovec_populate_dt(fdt, offset, spapr->ov5_cas, + "ibm,architecture-vec-5"); + +out: return ret; } @@ -792,14 +806,9 @@ static void spapr_dt_chosen(sPAPRMachineState *spapr, void *fdt) char *stdout_path = spapr_vio_stdout_path(spapr->vio_bus); size_t cb = 0; char *bootlist = get_boot_devices_list(&cb, true); - unsigned char vec5[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x80}; _FDT(chosen = fdt_add_subnode(fdt, 0, "chosen")); - /* Set Form1_affinity */ - _FDT(fdt_setprop(fdt, chosen, "ibm,architecture-vec-5", - vec5, sizeof(vec5))); - _FDT(fdt_setprop_string(fdt, chosen, "bootargs", machine->kernel_cmdline)); _FDT(fdt_setprop_cell(fdt, chosen, "linux,initrd-start", spapr->initrd_base)); @@ -1778,6 +1787,8 @@ static void ppc_spapr_init(MachineState *machine) spapr_validate_node_memory(machine, &error_fatal); } + spapr_ovec_set(spapr->ov5, OV5_FORM1_AFFINITY); + /* init CPUs */ if (machine->cpu_model == NULL) { machine->cpu_model = kvm_enabled() ? "host" : smc->tcg_default_cpu; diff --git a/include/hw/ppc/spapr_ovec.h b/include/hw/ppc/spapr_ovec.h index a9a3f3a5bb..81cdd14f64 100644 --- a/include/hw/ppc/spapr_ovec.h +++ b/include/hw/ppc/spapr_ovec.h @@ -44,6 +44,7 @@ typedef struct sPAPROptionVector sPAPROptionVector; /* option vector 5 */ #define OV5_DRCONF_MEMORY OV_BIT(2, 2) +#define OV5_FORM1_AFFINITY OV_BIT(5, 0) /* interfaces */ sPAPROptionVector *spapr_ovec_new(void); From a37eb9fccdd423e4f430b0261ee78c1692b7c252 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Tue, 25 Oct 2016 09:01:01 +0200 Subject: [PATCH 50/73] adb: change handler only when recognized MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ADB devices must take new handler into account only when they recognize it. This lets operating systems probe for valid/invalid handles, to know device capabilities. Add a FIXME in keyboard handler, which should use a different translation table depending of the selected handler. Signed-off-by: Hervé Poussineau Signed-off-by: David Gibson --- hw/input/adb.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/hw/input/adb.c b/hw/input/adb.c index 3d39368909..43d3205472 100644 --- a/hw/input/adb.c +++ b/hw/input/adb.c @@ -396,9 +396,15 @@ static int adb_kbd_request(ADBDevice *d, uint8_t *obuf, d->devaddr = buf[1] & 0xf; break; default: - /* XXX: check this */ d->devaddr = buf[1] & 0xf; - d->handler = buf[2]; + /* we support handlers: + * 1: Apple Standard Keyboard + * 2: Apple Extended Keyboard (LShift = RShift) + * 3: Apple Extended Keyboard (LShift != RShift) + */ + if (buf[2] == 1 || buf[2] == 2 || buf[2] == 3) { + d->handler = buf[2]; + } break; } } @@ -437,6 +443,7 @@ static void adb_keyboard_event(DeviceState *dev, QemuConsole *src, if (qcode >= ARRAY_SIZE(qcode_to_adb_keycode)) { return; } + /* FIXME: take handler into account when translating qcode */ keycode = qcode_to_adb_keycode[qcode]; if (keycode == NO_KEY) { /* We don't want to send this to the guest */ ADB_DPRINTF("Ignoring NO_KEY\n"); @@ -631,8 +638,21 @@ static int adb_mouse_request(ADBDevice *d, uint8_t *obuf, d->devaddr = buf[1] & 0xf; break; default: - /* XXX: check this */ d->devaddr = buf[1] & 0xf; + /* we support handlers: + * 0x01: Classic Apple Mouse Protocol / 100 cpi operations + * 0x02: Classic Apple Mouse Protocol / 200 cpi operations + * we don't support handlers (at least): + * 0x03: Mouse systems A3 trackball + * 0x04: Extended Apple Mouse Protocol + * 0x2f: Microspeed mouse + * 0x42: Macally + * 0x5f: Microspeed mouse + * 0x66: Microspeed mouse + */ + if (buf[2] == 1 || buf[2] == 2) { + d->handler = buf[2]; + } break; } } From 246fc0fb66cbf861b0e76320626b059e2d49ea12 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Thu, 20 Oct 2016 14:08:07 +1100 Subject: [PATCH 51/73] libqos: Give qvirtio_config_read*() consistent semantics The 'addr' parameter to qvirtio_config_read*() doesn't have a consistent meaning: when using the virtio-pci versions, it's a full PCI space address, but for virtio-mmio, it's an offset from the device's base mmio address. This means that the callers need to do different things to calculate the addresses in the two cases, which rather defeats the purpose of function pointer backends. All the current users of these functions are using them to retrieve variables from the device specific portion of the virtio config space. So, this patch alters the semantics to always be an offset into that device specific config area. Signed-off-by: David Gibson Reviewed-by: Laurent Vivier Reviewed-by: Greg Kurz --- tests/libqos/virtio-mmio.c | 16 +++++++-------- tests/libqos/virtio-pci.c | 25 +++++++++++++---------- tests/virtio-9p-test.c | 8 ++------ tests/virtio-blk-test.c | 42 ++++++++++---------------------------- tests/virtio-scsi-test.c | 4 +--- 5 files changed, 36 insertions(+), 59 deletions(-) diff --git a/tests/libqos/virtio-mmio.c b/tests/libqos/virtio-mmio.c index bced6803e6..7aa8383338 100644 --- a/tests/libqos/virtio-mmio.c +++ b/tests/libqos/virtio-mmio.c @@ -15,28 +15,28 @@ #include "libqos/malloc-generic.h" #include "standard-headers/linux/virtio_ring.h" -static uint8_t qvirtio_mmio_config_readb(QVirtioDevice *d, uint64_t addr) +static uint8_t qvirtio_mmio_config_readb(QVirtioDevice *d, uint64_t off) { QVirtioMMIODevice *dev = (QVirtioMMIODevice *)d; - return readb(dev->addr + addr); + return readb(dev->addr + QVIRTIO_MMIO_DEVICE_SPECIFIC + off); } -static uint16_t qvirtio_mmio_config_readw(QVirtioDevice *d, uint64_t addr) +static uint16_t qvirtio_mmio_config_readw(QVirtioDevice *d, uint64_t off) { QVirtioMMIODevice *dev = (QVirtioMMIODevice *)d; - return readw(dev->addr + addr); + return readw(dev->addr + QVIRTIO_MMIO_DEVICE_SPECIFIC + off); } -static uint32_t qvirtio_mmio_config_readl(QVirtioDevice *d, uint64_t addr) +static uint32_t qvirtio_mmio_config_readl(QVirtioDevice *d, uint64_t off) { QVirtioMMIODevice *dev = (QVirtioMMIODevice *)d; - return readl(dev->addr + addr); + return readl(dev->addr + QVIRTIO_MMIO_DEVICE_SPECIFIC + off); } -static uint64_t qvirtio_mmio_config_readq(QVirtioDevice *d, uint64_t addr) +static uint64_t qvirtio_mmio_config_readq(QVirtioDevice *d, uint64_t off) { QVirtioMMIODevice *dev = (QVirtioMMIODevice *)d; - return readq(dev->addr + addr); + return readq(dev->addr + QVIRTIO_MMIO_DEVICE_SPECIFIC + off); } static uint32_t qvirtio_mmio_get_features(QVirtioDevice *d) diff --git a/tests/libqos/virtio-pci.c b/tests/libqos/virtio-pci.c index 7e60b3a427..fa82132ab7 100644 --- a/tests/libqos/virtio-pci.c +++ b/tests/libqos/virtio-pci.c @@ -62,10 +62,13 @@ static void qvirtio_pci_assign_device(QVirtioDevice *d, void *data) *vpcidev = (QVirtioPCIDevice *)d; } -static uint8_t qvirtio_pci_config_readb(QVirtioDevice *d, uint64_t addr) +#define CONFIG_BASE(dev) \ + ((dev)->addr + VIRTIO_PCI_CONFIG_OFF((dev)->pdev->msix_enabled)) + +static uint8_t qvirtio_pci_config_readb(QVirtioDevice *d, uint64_t off) { QVirtioPCIDevice *dev = (QVirtioPCIDevice *)d; - return qpci_io_readb(dev->pdev, (void *)(uintptr_t)addr); + return qpci_io_readb(dev->pdev, CONFIG_BASE(dev) + off); } /* PCI is always read in little-endian order @@ -76,31 +79,31 @@ static uint8_t qvirtio_pci_config_readb(QVirtioDevice *d, uint64_t addr) * case will be managed inside qvirtio_is_big_endian() */ -static uint16_t qvirtio_pci_config_readw(QVirtioDevice *d, uint64_t addr) +static uint16_t qvirtio_pci_config_readw(QVirtioDevice *d, uint64_t off) { QVirtioPCIDevice *dev = (QVirtioPCIDevice *)d; uint16_t value; - value = qpci_io_readw(dev->pdev, (void *)(uintptr_t)addr); + value = qpci_io_readw(dev->pdev, CONFIG_BASE(dev) + off); if (qvirtio_is_big_endian(d)) { value = bswap16(value); } return value; } -static uint32_t qvirtio_pci_config_readl(QVirtioDevice *d, uint64_t addr) +static uint32_t qvirtio_pci_config_readl(QVirtioDevice *d, uint64_t off) { QVirtioPCIDevice *dev = (QVirtioPCIDevice *)d; uint32_t value; - value = qpci_io_readl(dev->pdev, (void *)(uintptr_t)addr); + value = qpci_io_readl(dev->pdev, CONFIG_BASE(dev) + off); if (qvirtio_is_big_endian(d)) { value = bswap32(value); } return value; } -static uint64_t qvirtio_pci_config_readq(QVirtioDevice *d, uint64_t addr) +static uint64_t qvirtio_pci_config_readq(QVirtioDevice *d, uint64_t off) { QVirtioPCIDevice *dev = (QVirtioPCIDevice *)d; int i; @@ -108,13 +111,13 @@ static uint64_t qvirtio_pci_config_readq(QVirtioDevice *d, uint64_t addr) if (qvirtio_is_big_endian(d)) { for (i = 0; i < 8; ++i) { - u64 |= (uint64_t)qpci_io_readb(dev->pdev, - (void *)(uintptr_t)addr + i) << (7 - i) * 8; + u64 |= (uint64_t)qpci_io_readb(dev->pdev, CONFIG_BASE(dev) + + off + i) << (7 - i) * 8; } } else { for (i = 0; i < 8; ++i) { - u64 |= (uint64_t)qpci_io_readb(dev->pdev, - (void *)(uintptr_t)addr + i) << i * 8; + u64 |= (uint64_t)qpci_io_readb(dev->pdev, CONFIG_BASE(dev) + + off + i) << i * 8; } } diff --git a/tests/virtio-9p-test.c b/tests/virtio-9p-test.c index 693920af5f..9c4f6cb406 100644 --- a/tests/virtio-9p-test.c +++ b/tests/virtio-9p-test.c @@ -95,7 +95,6 @@ static void qvirtio_9p_pci_free(QVirtIO9P *v9p) static void pci_basic_config(void) { QVirtIO9P *v9p; - void *addr; size_t tag_len; char *tag; int i; @@ -104,15 +103,12 @@ static void pci_basic_config(void) qs = qvirtio_9p_start(); v9p = qvirtio_9p_pci_init(qs); - addr = ((QVirtioPCIDevice *) v9p->dev)->addr + VIRTIO_PCI_CONFIG_OFF(false); - tag_len = qvirtio_config_readw(v9p->dev, - (uint64_t)(uintptr_t)addr); + tag_len = qvirtio_config_readw(v9p->dev, 0); g_assert_cmpint(tag_len, ==, strlen(mount_tag)); - addr += sizeof(uint16_t); tag = g_malloc(tag_len); for (i = 0; i < tag_len; i++) { - tag[i] = qvirtio_config_readb(v9p->dev, (uint64_t)(uintptr_t)addr + i); + tag[i] = qvirtio_config_readb(v9p->dev, i + 2); } g_assert_cmpmem(tag, tag_len, mount_tag, tag_len); g_free(tag); diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c index f737c406e3..0e32e416dd 100644 --- a/tests/virtio-blk-test.c +++ b/tests/virtio-blk-test.c @@ -155,7 +155,7 @@ static uint64_t virtio_blk_request(QGuestAllocator *alloc, QVirtioDevice *d, } static void test_basic(QVirtioDevice *dev, QGuestAllocator *alloc, - QVirtQueue *vq, uint64_t device_specific) + QVirtQueue *vq) { QVirtioBlkReq req; uint64_t req_addr; @@ -165,7 +165,7 @@ static void test_basic(QVirtioDevice *dev, QGuestAllocator *alloc, uint8_t status; char *data; - capacity = qvirtio_config_readq(dev, device_specific); + capacity = qvirtio_config_readq(dev, 0); g_assert_cmpint(capacity, ==, TEST_IMAGE_SIZE / 512); @@ -285,17 +285,13 @@ static void pci_basic(void) QVirtioPCIDevice *dev; QOSState *qs; QVirtQueuePCI *vqpci; - void *addr; qs = pci_test_start(); dev = virtio_blk_pci_init(qs->pcibus, PCI_SLOT); vqpci = (QVirtQueuePCI *)qvirtqueue_setup(&dev->vdev, qs->alloc, 0); - /* MSI-X is not enabled */ - addr = dev->addr + VIRTIO_PCI_CONFIG_OFF(false); - - test_basic(&dev->vdev, qs->alloc, &vqpci->vq, (uint64_t)(uintptr_t)addr); + test_basic(&dev->vdev, qs->alloc, &vqpci->vq); /* End test */ qvirtqueue_cleanup(dev->vdev.bus, &vqpci->vq, qs->alloc); @@ -311,7 +307,6 @@ static void pci_indirect(void) QOSState *qs; QVirtioBlkReq req; QVRingIndirectDesc *indirect; - void *addr; uint64_t req_addr; uint64_t capacity; uint32_t features; @@ -323,10 +318,7 @@ static void pci_indirect(void) dev = virtio_blk_pci_init(qs->pcibus, PCI_SLOT); - /* MSI-X is not enabled */ - addr = dev->addr + VIRTIO_PCI_CONFIG_OFF(false); - - capacity = qvirtio_config_readq(&dev->vdev, (uint64_t)(uintptr_t)addr); + capacity = qvirtio_config_readq(&dev->vdev, 0); g_assert_cmpint(capacity, ==, TEST_IMAGE_SIZE / 512); features = qvirtio_get_features(&dev->vdev); @@ -406,17 +398,13 @@ static void pci_config(void) QVirtioPCIDevice *dev; QOSState *qs; int n_size = TEST_IMAGE_SIZE / 2; - void *addr; uint64_t capacity; qs = pci_test_start(); dev = virtio_blk_pci_init(qs->pcibus, PCI_SLOT); - /* MSI-X is not enabled */ - addr = dev->addr + VIRTIO_PCI_CONFIG_OFF(false); - - capacity = qvirtio_config_readq(&dev->vdev, (uint64_t)(uintptr_t)addr); + capacity = qvirtio_config_readq(&dev->vdev, 0); g_assert_cmpint(capacity, ==, TEST_IMAGE_SIZE / 512); qvirtio_set_driver_ok(&dev->vdev); @@ -425,7 +413,7 @@ static void pci_config(void) " 'size': %d } }", n_size); qvirtio_wait_config_isr(&dev->vdev, QVIRTIO_BLK_TIMEOUT_US); - capacity = qvirtio_config_readq(&dev->vdev, (uint64_t)(uintptr_t)addr); + capacity = qvirtio_config_readq(&dev->vdev, 0); g_assert_cmpint(capacity, ==, n_size / 512); qvirtio_pci_device_disable(dev); @@ -441,7 +429,6 @@ static void pci_msix(void) QVirtQueuePCI *vqpci; QVirtioBlkReq req; int n_size = TEST_IMAGE_SIZE / 2; - void *addr; uint64_t req_addr; uint64_t capacity; uint32_t features; @@ -456,10 +443,7 @@ static void pci_msix(void) qvirtio_pci_set_msix_configuration_vector(dev, qs->alloc, 0); - /* MSI-X is enabled */ - addr = dev->addr + VIRTIO_PCI_CONFIG_OFF(true); - - capacity = qvirtio_config_readq(&dev->vdev, (uint64_t)(uintptr_t)addr); + capacity = qvirtio_config_readq(&dev->vdev, 0); g_assert_cmpint(capacity, ==, TEST_IMAGE_SIZE / 512); features = qvirtio_get_features(&dev->vdev); @@ -479,7 +463,7 @@ static void pci_msix(void) qvirtio_wait_config_isr(&dev->vdev, QVIRTIO_BLK_TIMEOUT_US); - capacity = qvirtio_config_readq(&dev->vdev, (uintptr_t)addr); + capacity = qvirtio_config_readq(&dev->vdev, 0); g_assert_cmpint(capacity, ==, n_size / 512); /* Write request */ @@ -550,7 +534,6 @@ static void pci_idx(void) QOSState *qs; QVirtQueuePCI *vqpci; QVirtioBlkReq req; - void *addr; uint64_t req_addr; uint64_t capacity; uint32_t features; @@ -565,10 +548,7 @@ static void pci_idx(void) qvirtio_pci_set_msix_configuration_vector(dev, qs->alloc, 0); - /* MSI-X is enabled */ - addr = dev->addr + VIRTIO_PCI_CONFIG_OFF(true); - - capacity = qvirtio_config_readq(&dev->vdev, (uint64_t)(uintptr_t)addr); + capacity = qvirtio_config_readq(&dev->vdev, 0); g_assert_cmpint(capacity, ==, TEST_IMAGE_SIZE / 512); features = qvirtio_get_features(&dev->vdev); @@ -709,14 +689,14 @@ static void mmio_basic(void) alloc = generic_alloc_init(MMIO_RAM_ADDR, MMIO_RAM_SIZE, MMIO_PAGE_SIZE); vq = qvirtqueue_setup(&dev->vdev, alloc, 0); - test_basic(&dev->vdev, alloc, vq, QVIRTIO_MMIO_DEVICE_SPECIFIC); + test_basic(&dev->vdev, alloc, vq); qmp("{ 'execute': 'block_resize', 'arguments': { 'device': 'drive0', " " 'size': %d } }", n_size); qvirtio_wait_queue_isr(&dev->vdev, vq, QVIRTIO_BLK_TIMEOUT_US); - capacity = qvirtio_config_readq(&dev->vdev, QVIRTIO_MMIO_DEVICE_SPECIFIC); + capacity = qvirtio_config_readq(&dev->vdev, 0); g_assert_cmpint(capacity, ==, n_size / 512); /* End test */ diff --git a/tests/virtio-scsi-test.c b/tests/virtio-scsi-test.c index 60dc9abd60..69220ef07b 100644 --- a/tests/virtio-scsi-test.c +++ b/tests/virtio-scsi-test.c @@ -143,7 +143,6 @@ static QVirtIOSCSI *qvirtio_scsi_pci_init(int slot) QVirtIOSCSI *vs; QVirtioPCIDevice *dev; struct virtio_scsi_cmd_resp resp; - void *addr; int i; vs = g_new0(QVirtIOSCSI, 1); @@ -161,8 +160,7 @@ static QVirtIOSCSI *qvirtio_scsi_pci_init(int slot) qvirtio_set_acknowledge(vs->dev); qvirtio_set_driver(vs->dev); - addr = dev->addr + VIRTIO_PCI_CONFIG_OFF(false); - vs->num_queues = qvirtio_config_readl(vs->dev, (uint64_t)(uintptr_t)addr); + vs->num_queues = qvirtio_config_readl(vs->dev, 0); g_assert_cmpint(vs->num_queues, <, MAX_NUM_QUEUES); From a795fc08f2636013fe097e51bdac62d089ac505a Mon Sep 17 00:00:00 2001 From: David Gibson Date: Tue, 18 Oct 2016 17:02:49 +1100 Subject: [PATCH 52/73] libqos: Handle PCI IO de-multiplexing in common code The PCI IO space (aka PIO, aka legacy IO) and PCI memory space (aka MMIO) are distinct address spaces by the PCI spec (although parts of one might be aliased to parts of the other in some cases). However, qpci_io_read*() and qpci_io_write*() can perform accesses to either space depending on parameter. That's convenient for test case drivers, since there are a fair few devices which can be controlled via either a PIO or MMIO BAR but with an otherwise identical driver. This is implemented by having addresses below 64kiB treated as PIO, and those above treated as MMIO. This works because low addresses in memory space are generally reserved for DMA rather than MMIO. At the moment, this demultiplexing must be handled by each PCI backend (pc and spapr, so far). There's no real reason for this - the current encoding is likely to work for all platforms, and even if it doesn't we can still use a more complex common encoding since the value returned from iomap are semi-opaque. This patch moves the demultiplexing into the common part of the libqos PCI code, with the backends having simpler, separate accessors for PIO and MMIO space. This also means we have a way of explicitly accessing either space if it's necessary for some special case. Signed-off-by: David Gibson Reviewed-by: Laurent Vivier Reviewed-by: Greg Kurz --- tests/libqos/pci-pc.c | 117 ++++++++++++++++++-------------------- tests/libqos/pci-spapr.c | 118 ++++++++++++++++++++------------------- tests/libqos/pci.c | 49 +++++++++++++--- tests/libqos/pci.h | 22 ++++++-- 4 files changed, 175 insertions(+), 131 deletions(-) diff --git a/tests/libqos/pci-pc.c b/tests/libqos/pci-pc.c index 9600ed6e41..51dff8a7fa 100644 --- a/tests/libqos/pci-pc.c +++ b/tests/libqos/pci-pc.c @@ -36,79 +36,64 @@ typedef struct QPCIBusPC uint16_t pci_iohole_alloc; } QPCIBusPC; -static uint8_t qpci_pc_io_readb(QPCIBus *bus, void *addr) +static uint8_t qpci_pc_pio_readb(QPCIBus *bus, uint32_t addr) { - uintptr_t port = (uintptr_t)addr; - uint8_t value; - - if (port < 0x10000) { - value = inb(port); - } else { - value = readb(port); - } - - return value; + return inb(addr); } -static uint16_t qpci_pc_io_readw(QPCIBus *bus, void *addr) +static uint8_t qpci_pc_mmio_readb(QPCIBus *bus, uint32_t addr) { - uintptr_t port = (uintptr_t)addr; - uint16_t value; - - if (port < 0x10000) { - value = inw(port); - } else { - value = readw(port); - } - - return value; + return readb(addr); } -static uint32_t qpci_pc_io_readl(QPCIBus *bus, void *addr) +static void qpci_pc_pio_writeb(QPCIBus *bus, uint32_t addr, uint8_t val) { - uintptr_t port = (uintptr_t)addr; - uint32_t value; - - if (port < 0x10000) { - value = inl(port); - } else { - value = readl(port); - } - - return value; + outb(addr, val); } -static void qpci_pc_io_writeb(QPCIBus *bus, void *addr, uint8_t value) +static void qpci_pc_mmio_writeb(QPCIBus *bus, uint32_t addr, uint8_t val) { - uintptr_t port = (uintptr_t)addr; - - if (port < 0x10000) { - outb(port, value); - } else { - writeb(port, value); - } + writeb(addr, val); } -static void qpci_pc_io_writew(QPCIBus *bus, void *addr, uint16_t value) +static uint16_t qpci_pc_pio_readw(QPCIBus *bus, uint32_t addr) { - uintptr_t port = (uintptr_t)addr; - - if (port < 0x10000) { - outw(port, value); - } else { - writew(port, value); - } + return inw(addr); } -static void qpci_pc_io_writel(QPCIBus *bus, void *addr, uint32_t value) +static uint16_t qpci_pc_mmio_readw(QPCIBus *bus, uint32_t addr) { - uintptr_t port = (uintptr_t)addr; + return readw(addr); +} - if (port < 0x10000) { - outl(port, value); - } else { - writel(port, value); - } +static void qpci_pc_pio_writew(QPCIBus *bus, uint32_t addr, uint16_t val) +{ + outw(addr, val); +} + +static void qpci_pc_mmio_writew(QPCIBus *bus, uint32_t addr, uint16_t val) +{ + writew(addr, val); +} + +static uint32_t qpci_pc_pio_readl(QPCIBus *bus, uint32_t addr) +{ + return inl(addr); +} + +static uint32_t qpci_pc_mmio_readl(QPCIBus *bus, uint32_t addr) +{ + return readl(addr); +} + +static void qpci_pc_pio_writel(QPCIBus *bus, uint32_t addr, uint32_t val) +{ + outl(addr, val); +} + +static void qpci_pc_mmio_writel(QPCIBus *bus, uint32_t addr, uint32_t val) +{ + writel(addr, val); } static uint8_t qpci_pc_config_readb(QPCIBus *bus, int devfn, uint8_t offset) @@ -218,13 +203,21 @@ QPCIBus *qpci_init_pc(QGuestAllocator *alloc) ret = g_malloc(sizeof(*ret)); - ret->bus.io_readb = qpci_pc_io_readb; - ret->bus.io_readw = qpci_pc_io_readw; - ret->bus.io_readl = qpci_pc_io_readl; + ret->bus.pio_readb = qpci_pc_pio_readb; + ret->bus.pio_readw = qpci_pc_pio_readw; + ret->bus.pio_readl = qpci_pc_pio_readl; - ret->bus.io_writeb = qpci_pc_io_writeb; - ret->bus.io_writew = qpci_pc_io_writew; - ret->bus.io_writel = qpci_pc_io_writel; + ret->bus.pio_writeb = qpci_pc_pio_writeb; + ret->bus.pio_writew = qpci_pc_pio_writew; + ret->bus.pio_writel = qpci_pc_pio_writel; + + ret->bus.mmio_readb = qpci_pc_mmio_readb; + ret->bus.mmio_readw = qpci_pc_mmio_readw; + ret->bus.mmio_readl = qpci_pc_mmio_readl; + + ret->bus.mmio_writeb = qpci_pc_mmio_writeb; + ret->bus.mmio_writew = qpci_pc_mmio_writew; + ret->bus.mmio_writel = qpci_pc_mmio_writel; ret->bus.config_readb = qpci_pc_config_readb; ret->bus.config_readw = qpci_pc_config_readw; diff --git a/tests/libqos/pci-spapr.c b/tests/libqos/pci-spapr.c index 2eaaf9159a..2d26a94dab 100644 --- a/tests/libqos/pci-spapr.c +++ b/tests/libqos/pci-spapr.c @@ -50,78 +50,76 @@ typedef struct QPCIBusSPAPR { * so PCI accessors need to swap data endianness */ -static uint8_t qpci_spapr_io_readb(QPCIBus *bus, void *addr) +static uint8_t qpci_spapr_pio_readb(QPCIBus *bus, uint32_t addr) { QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); - uint64_t port = (uintptr_t)addr; - uint8_t v; - if (port < s->pio.size) { - v = readb(s->pio_cpu_base + port); - } else { - v = readb(s->mmio32_cpu_base + port); - } - return v; + return readb(s->pio_cpu_base + addr); } -static uint16_t qpci_spapr_io_readw(QPCIBus *bus, void *addr) +static uint8_t qpci_spapr_mmio32_readb(QPCIBus *bus, uint32_t addr) { QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); - uint64_t port = (uintptr_t)addr; - uint16_t v; - if (port < s->pio.size) { - v = readw(s->pio_cpu_base + port); - } else { - v = readw(s->mmio32_cpu_base + port); - } - return bswap16(v); + return readb(s->mmio32_cpu_base + addr); } -static uint32_t qpci_spapr_io_readl(QPCIBus *bus, void *addr) +static void qpci_spapr_pio_writeb(QPCIBus *bus, uint32_t addr, uint8_t val) { QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); - uint64_t port = (uintptr_t)addr; - uint32_t v; - if (port < s->pio.size) { - v = readl(s->pio_cpu_base + port); - } else { - v = readl(s->mmio32_cpu_base + port); - } - return bswap32(v); + writeb(s->pio_cpu_base + addr, val); } -static void qpci_spapr_io_writeb(QPCIBus *bus, void *addr, uint8_t value) +static void qpci_spapr_mmio32_writeb(QPCIBus *bus, uint32_t addr, uint8_t val) { QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); - uint64_t port = (uintptr_t)addr; - if (port < s->pio.size) { - writeb(s->pio_cpu_base + port, value); - } else { - writeb(s->mmio32_cpu_base + port, value); - } + writeb(s->mmio32_cpu_base + addr, val); } -static void qpci_spapr_io_writew(QPCIBus *bus, void *addr, uint16_t value) +static uint16_t qpci_spapr_pio_readw(QPCIBus *bus, uint32_t addr) { QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); - uint64_t port = (uintptr_t)addr; - value = bswap16(value); - if (port < s->pio.size) { - writew(s->pio_cpu_base + port, value); - } else { - writew(s->mmio32_cpu_base + port, value); - } + return bswap16(readw(s->pio_cpu_base + addr)); } -static void qpci_spapr_io_writel(QPCIBus *bus, void *addr, uint32_t value) +static uint16_t qpci_spapr_mmio32_readw(QPCIBus *bus, uint32_t addr) { QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); - uint64_t port = (uintptr_t)addr; - value = bswap32(value); - if (port < s->pio.size) { - writel(s->pio_cpu_base + port, value); - } else { - writel(s->mmio32_cpu_base + port, value); - } + return bswap16(readw(s->mmio32_cpu_base + addr)); +} + +static void qpci_spapr_pio_writew(QPCIBus *bus, uint32_t addr, uint16_t val) +{ + QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); + writew(s->pio_cpu_base + addr, bswap16(val)); +} + +static void qpci_spapr_mmio32_writew(QPCIBus *bus, uint32_t addr, uint16_t val) +{ + QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); + writew(s->mmio32_cpu_base + addr, bswap16(val)); +} + +static uint32_t qpci_spapr_pio_readl(QPCIBus *bus, uint32_t addr) +{ + QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); + return bswap32(readl(s->pio_cpu_base + addr)); +} + +static uint32_t qpci_spapr_mmio32_readl(QPCIBus *bus, uint32_t addr) +{ + QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); + return bswap32(readl(s->mmio32_cpu_base + addr)); +} + +static void qpci_spapr_pio_writel(QPCIBus *bus, uint32_t addr, uint32_t val) +{ + QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); + writel(s->pio_cpu_base + addr, bswap32(val)); +} + +static void qpci_spapr_mmio32_writel(QPCIBus *bus, uint32_t addr, uint32_t val) +{ + QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); + writel(s->mmio32_cpu_base + addr, bswap32(val)); } static uint8_t qpci_spapr_config_readb(QPCIBus *bus, int devfn, uint8_t offset) @@ -248,13 +246,21 @@ QPCIBus *qpci_init_spapr(QGuestAllocator *alloc) ret->alloc = alloc; - ret->bus.io_readb = qpci_spapr_io_readb; - ret->bus.io_readw = qpci_spapr_io_readw; - ret->bus.io_readl = qpci_spapr_io_readl; + ret->bus.pio_readb = qpci_spapr_pio_readb; + ret->bus.pio_readw = qpci_spapr_pio_readw; + ret->bus.pio_readl = qpci_spapr_pio_readl; - ret->bus.io_writeb = qpci_spapr_io_writeb; - ret->bus.io_writew = qpci_spapr_io_writew; - ret->bus.io_writel = qpci_spapr_io_writel; + ret->bus.pio_writeb = qpci_spapr_pio_writeb; + ret->bus.pio_writew = qpci_spapr_pio_writew; + ret->bus.pio_writel = qpci_spapr_pio_writel; + + ret->bus.mmio_readb = qpci_spapr_mmio32_readb; + ret->bus.mmio_readw = qpci_spapr_mmio32_readw; + ret->bus.mmio_readl = qpci_spapr_mmio32_readl; + + ret->bus.mmio_writeb = qpci_spapr_mmio32_writeb; + ret->bus.mmio_writew = qpci_spapr_mmio32_writew; + ret->bus.mmio_writel = qpci_spapr_mmio32_writel; ret->bus.config_readb = qpci_spapr_config_readb; ret->bus.config_readw = qpci_spapr_config_readw; diff --git a/tests/libqos/pci.c b/tests/libqos/pci.c index c3f3382b7c..55b01df37b 100644 --- a/tests/libqos/pci.c +++ b/tests/libqos/pci.c @@ -224,33 +224,68 @@ void qpci_config_writel(QPCIDevice *dev, uint8_t offset, uint32_t value) uint8_t qpci_io_readb(QPCIDevice *dev, void *data) { - return dev->bus->io_readb(dev->bus, data); + uintptr_t addr = (uintptr_t)data; + + if (addr < QPCI_PIO_LIMIT) { + return dev->bus->pio_readb(dev->bus, addr); + } else { + return dev->bus->mmio_readb(dev->bus, addr); + } } uint16_t qpci_io_readw(QPCIDevice *dev, void *data) { - return dev->bus->io_readw(dev->bus, data); + uintptr_t addr = (uintptr_t)data; + + if (addr < QPCI_PIO_LIMIT) { + return dev->bus->pio_readw(dev->bus, addr); + } else { + return dev->bus->mmio_readw(dev->bus, addr); + } } uint32_t qpci_io_readl(QPCIDevice *dev, void *data) { - return dev->bus->io_readl(dev->bus, data); -} + uintptr_t addr = (uintptr_t)data; + if (addr < QPCI_PIO_LIMIT) { + return dev->bus->pio_readl(dev->bus, addr); + } else { + return dev->bus->mmio_readl(dev->bus, addr); + } +} void qpci_io_writeb(QPCIDevice *dev, void *data, uint8_t value) { - dev->bus->io_writeb(dev->bus, data, value); + uintptr_t addr = (uintptr_t)data; + + if (addr < QPCI_PIO_LIMIT) { + dev->bus->pio_writeb(dev->bus, addr, value); + } else { + dev->bus->mmio_writeb(dev->bus, addr, value); + } } void qpci_io_writew(QPCIDevice *dev, void *data, uint16_t value) { - dev->bus->io_writew(dev->bus, data, value); + uintptr_t addr = (uintptr_t)data; + + if (addr < QPCI_PIO_LIMIT) { + dev->bus->pio_writew(dev->bus, addr, value); + } else { + dev->bus->mmio_writew(dev->bus, addr, value); + } } void qpci_io_writel(QPCIDevice *dev, void *data, uint32_t value) { - dev->bus->io_writel(dev->bus, data, value); + uintptr_t addr = (uintptr_t)data; + + if (addr < QPCI_PIO_LIMIT) { + dev->bus->pio_writel(dev->bus, addr, value); + } else { + dev->bus->mmio_writel(dev->bus, addr, value); + } } void *qpci_iomap(QPCIDevice *dev, int barno, uint64_t *sizeptr) diff --git a/tests/libqos/pci.h b/tests/libqos/pci.h index c06add8dbf..72a2245c05 100644 --- a/tests/libqos/pci.h +++ b/tests/libqos/pci.h @@ -15,6 +15,8 @@ #include "libqtest.h" +#define QPCI_PIO_LIMIT 0x10000 + #define QPCI_DEVFN(dev, fn) (((dev) << 3) | (fn)) typedef struct QPCIDevice QPCIDevice; @@ -22,13 +24,21 @@ typedef struct QPCIBus QPCIBus; struct QPCIBus { - uint8_t (*io_readb)(QPCIBus *bus, void *addr); - uint16_t (*io_readw)(QPCIBus *bus, void *addr); - uint32_t (*io_readl)(QPCIBus *bus, void *addr); + uint8_t (*pio_readb)(QPCIBus *bus, uint32_t addr); + uint16_t (*pio_readw)(QPCIBus *bus, uint32_t addr); + uint32_t (*pio_readl)(QPCIBus *bus, uint32_t addr); - void (*io_writeb)(QPCIBus *bus, void *addr, uint8_t value); - void (*io_writew)(QPCIBus *bus, void *addr, uint16_t value); - void (*io_writel)(QPCIBus *bus, void *addr, uint32_t value); + uint8_t (*mmio_readb)(QPCIBus *bus, uint32_t addr); + uint16_t (*mmio_readw)(QPCIBus *bus, uint32_t addr); + uint32_t (*mmio_readl)(QPCIBus *bus, uint32_t addr); + + void (*pio_writeb)(QPCIBus *bus, uint32_t addr, uint8_t value); + void (*pio_writew)(QPCIBus *bus, uint32_t addr, uint16_t value); + void (*pio_writel)(QPCIBus *bus, uint32_t addr, uint32_t value); + + void (*mmio_writeb)(QPCIBus *bus, uint32_t addr, uint8_t value); + void (*mmio_writew)(QPCIBus *bus, uint32_t addr, uint16_t value); + void (*mmio_writel)(QPCIBus *bus, uint32_t addr, uint32_t value); uint8_t (*config_readb)(QPCIBus *bus, int devfn, uint8_t offset); uint16_t (*config_readw)(QPCIBus *bus, int devfn, uint8_t offset); From b8cc4d0231b97c3dd7930d91ab91657b5a105b78 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Wed, 19 Oct 2016 14:06:51 +1100 Subject: [PATCH 53/73] libqos: Move BAR assignment to common code The PCI backends in libqos each supply an iomap() and iounmap() function which is used to set up a specified PCI BAR. But PCI BAR allocation takes place entirely within PCI space, so doesn't really need per-backend versions. For example, Linux includes generic BAR allocation code used on platforms where that isn't done by firmware. This patch merges the BAR allocation from the two existing backends into a single simplified copy. The back ends just need to set up some parameters describing the window of PCI IO and PCI memory addresses which are available for allocation. Like both the existing versions the new one uses a simple bump allocator. Note that (again like the existing versions) this doesn't really handle 64-bit memory BARs properly. It is actually used for such a BAR by the ivshmem test, and apparently the 32-bit MMIO BAR logic is close enough to work, as long as the BAR isn't too big. Fixing that to properly handle 64-bit BAR allocation is a problem for another time. Signed-off-by: David Gibson Reviewed-by: Laurent Vivier Reviewed-by: Greg Kurz --- tests/libqos/pci-pc.c | 87 ++------------------------------------- tests/libqos/pci-spapr.c | 89 ++-------------------------------------- tests/libqos/pci.c | 56 ++++++++++++++++++++++++- tests/libqos/pci.h | 7 ++-- 4 files changed, 63 insertions(+), 176 deletions(-) diff --git a/tests/libqos/pci-pc.c b/tests/libqos/pci-pc.c index 51dff8a7fa..d0eb84a134 100644 --- a/tests/libqos/pci-pc.c +++ b/tests/libqos/pci-pc.c @@ -17,7 +17,6 @@ #include "hw/pci/pci_regs.h" #include "qemu-common.h" -#include "qemu/host-utils.h" #define ACPI_PCIHP_ADDR 0xae00 @@ -26,14 +25,6 @@ typedef struct QPCIBusPC { QPCIBus bus; - - uint32_t pci_hole_start; - uint32_t pci_hole_size; - uint32_t pci_hole_alloc; - - uint16_t pci_iohole_start; - uint16_t pci_iohole_size; - uint16_t pci_iohole_alloc; } QPCIBusPC; static uint8_t qpci_pc_pio_readb(QPCIBus *bus, uint32_t addr) @@ -132,71 +123,6 @@ static void qpci_pc_config_writel(QPCIBus *bus, int devfn, uint8_t offset, uint3 outl(0xcfc, value); } -static void *qpci_pc_iomap(QPCIBus *bus, QPCIDevice *dev, int barno, uint64_t *sizeptr) -{ - QPCIBusPC *s = container_of(bus, QPCIBusPC, bus); - static const int bar_reg_map[] = { - PCI_BASE_ADDRESS_0, PCI_BASE_ADDRESS_1, PCI_BASE_ADDRESS_2, - PCI_BASE_ADDRESS_3, PCI_BASE_ADDRESS_4, PCI_BASE_ADDRESS_5, - }; - int bar_reg; - uint32_t addr; - uint64_t size; - uint32_t io_type; - - g_assert(barno >= 0 && barno <= 5); - bar_reg = bar_reg_map[barno]; - - qpci_config_writel(dev, bar_reg, 0xFFFFFFFF); - addr = qpci_config_readl(dev, bar_reg); - - io_type = addr & PCI_BASE_ADDRESS_SPACE; - if (io_type == PCI_BASE_ADDRESS_SPACE_IO) { - addr &= PCI_BASE_ADDRESS_IO_MASK; - } else { - addr &= PCI_BASE_ADDRESS_MEM_MASK; - } - - size = (1ULL << ctzl(addr)); - if (size == 0) { - return NULL; - } - if (sizeptr) { - *sizeptr = size; - } - - if (io_type == PCI_BASE_ADDRESS_SPACE_IO) { - uint16_t loc; - - g_assert(QEMU_ALIGN_UP(s->pci_iohole_alloc, size) + size - <= s->pci_iohole_size); - s->pci_iohole_alloc = QEMU_ALIGN_UP(s->pci_iohole_alloc, size); - loc = s->pci_iohole_start + s->pci_iohole_alloc; - s->pci_iohole_alloc += size; - - qpci_config_writel(dev, bar_reg, loc | PCI_BASE_ADDRESS_SPACE_IO); - - return (void *)(intptr_t)loc; - } else { - uint64_t loc; - - g_assert(QEMU_ALIGN_UP(s->pci_hole_alloc, size) + size - <= s->pci_hole_size); - s->pci_hole_alloc = QEMU_ALIGN_UP(s->pci_hole_alloc, size); - loc = s->pci_hole_start + s->pci_hole_alloc; - s->pci_hole_alloc += size; - - qpci_config_writel(dev, bar_reg, loc); - - return (void *)(intptr_t)loc; - } -} - -static void qpci_pc_iounmap(QPCIBus *bus, void *data) -{ - /* FIXME */ -} - QPCIBus *qpci_init_pc(QGuestAllocator *alloc) { QPCIBusPC *ret; @@ -227,16 +153,9 @@ QPCIBus *qpci_init_pc(QGuestAllocator *alloc) ret->bus.config_writew = qpci_pc_config_writew; ret->bus.config_writel = qpci_pc_config_writel; - ret->bus.iomap = qpci_pc_iomap; - ret->bus.iounmap = qpci_pc_iounmap; - - ret->pci_hole_start = 0xE0000000; - ret->pci_hole_size = 0x20000000; - ret->pci_hole_alloc = 0; - - ret->pci_iohole_start = 0xc000; - ret->pci_iohole_size = 0x4000; - ret->pci_iohole_alloc = 0; + ret->bus.pio_alloc_ptr = 0xc000; + ret->bus.mmio_alloc_ptr = 0xE0000000; + ret->bus.mmio_limit = 0x100000000ULL; return &ret->bus; } diff --git a/tests/libqos/pci-spapr.c b/tests/libqos/pci-spapr.c index 2d26a94dab..70a24b5579 100644 --- a/tests/libqos/pci-spapr.c +++ b/tests/libqos/pci-spapr.c @@ -34,14 +34,6 @@ typedef struct QPCIBusSPAPR { uint64_t mmio32_cpu_base; QPCIWindow mmio32; - - uint64_t pci_hole_start; - uint64_t pci_hole_size; - uint64_t pci_hole_alloc; - - uint32_t pci_iohole_start; - uint32_t pci_iohole_size; - uint32_t pci_iohole_alloc; } QPCIBusSPAPR; /* @@ -167,72 +159,6 @@ static void qpci_spapr_config_writel(QPCIBus *bus, int devfn, uint8_t offset, qrtas_ibm_write_pci_config(s->alloc, s->buid, config_addr, 4, value); } -static void *qpci_spapr_iomap(QPCIBus *bus, QPCIDevice *dev, int barno, - uint64_t *sizeptr) -{ - QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); - static const int bar_reg_map[] = { - PCI_BASE_ADDRESS_0, PCI_BASE_ADDRESS_1, PCI_BASE_ADDRESS_2, - PCI_BASE_ADDRESS_3, PCI_BASE_ADDRESS_4, PCI_BASE_ADDRESS_5, - }; - int bar_reg; - uint32_t addr; - uint64_t size; - uint32_t io_type; - - g_assert(barno >= 0 && barno <= 5); - bar_reg = bar_reg_map[barno]; - - qpci_config_writel(dev, bar_reg, 0xFFFFFFFF); - addr = qpci_config_readl(dev, bar_reg); - - io_type = addr & PCI_BASE_ADDRESS_SPACE; - if (io_type == PCI_BASE_ADDRESS_SPACE_IO) { - addr &= PCI_BASE_ADDRESS_IO_MASK; - } else { - addr &= PCI_BASE_ADDRESS_MEM_MASK; - } - - size = (1ULL << ctzl(addr)); - if (size == 0) { - return NULL; - } - if (sizeptr) { - *sizeptr = size; - } - - if (io_type == PCI_BASE_ADDRESS_SPACE_IO) { - uint16_t loc; - - g_assert(QEMU_ALIGN_UP(s->pci_iohole_alloc, size) + size - <= s->pci_iohole_size); - s->pci_iohole_alloc = QEMU_ALIGN_UP(s->pci_iohole_alloc, size); - loc = s->pci_iohole_start + s->pci_iohole_alloc; - s->pci_iohole_alloc += size; - - qpci_config_writel(dev, bar_reg, loc | PCI_BASE_ADDRESS_SPACE_IO); - - return (void *)(unsigned long)loc; - } else { - uint64_t loc; - - g_assert(QEMU_ALIGN_UP(s->pci_hole_alloc, size) + size - <= s->pci_hole_size); - s->pci_hole_alloc = QEMU_ALIGN_UP(s->pci_hole_alloc, size); - loc = s->pci_hole_start + s->pci_hole_alloc; - s->pci_hole_alloc += size; - - qpci_config_writel(dev, bar_reg, loc); - - return (void *)(unsigned long)loc; - } -} - -static void qpci_spapr_iounmap(QPCIBus *bus, void *data) -{ - /* FIXME */ -} - #define SPAPR_PCI_BASE (1ULL << 45) #define SPAPR_PCI_MMIO32_WIN_SIZE 0x80000000 /* 2 GiB */ @@ -270,9 +196,6 @@ QPCIBus *qpci_init_spapr(QGuestAllocator *alloc) ret->bus.config_writew = qpci_spapr_config_writew; ret->bus.config_writel = qpci_spapr_config_writel; - ret->bus.iomap = qpci_spapr_iomap; - ret->bus.iounmap = qpci_spapr_iounmap; - /* FIXME: We assume the default location of the PHB for now. * Ideally we'd parse the device tree deposited in the guest to * get the window locations */ @@ -287,15 +210,9 @@ QPCIBus *qpci_init_spapr(QGuestAllocator *alloc) ret->mmio32.pci_base = 0x80000000; /* 2 GiB */ ret->mmio32.size = SPAPR_PCI_MMIO32_WIN_SIZE; - ret->pci_hole_start = 0xC0000000; - ret->pci_hole_size = - ret->mmio32.pci_base + ret->mmio32.size - ret->pci_hole_start; - ret->pci_hole_alloc = 0; - - ret->pci_iohole_start = 0xc000; - ret->pci_iohole_size = - ret->pio.pci_base + ret->pio.size - ret->pci_iohole_start; - ret->pci_iohole_alloc = 0; + ret->bus.pio_alloc_ptr = 0xc000; + ret->bus.mmio_alloc_ptr = ret->mmio32.pci_base; + ret->bus.mmio_limit = ret->mmio32.pci_base + ret->mmio32.size; return &ret->bus; } diff --git a/tests/libqos/pci.c b/tests/libqos/pci.c index 55b01df37b..bf1c53240b 100644 --- a/tests/libqos/pci.c +++ b/tests/libqos/pci.c @@ -14,6 +14,7 @@ #include "libqos/pci.h" #include "hw/pci/pci_regs.h" +#include "qemu/host-utils.h" void qpci_device_foreach(QPCIBus *bus, int vendor_id, int device_id, void (*func)(QPCIDevice *dev, int devfn, void *data), @@ -290,12 +291,63 @@ void qpci_io_writel(QPCIDevice *dev, void *data, uint32_t value) void *qpci_iomap(QPCIDevice *dev, int barno, uint64_t *sizeptr) { - return dev->bus->iomap(dev->bus, dev, barno, sizeptr); + QPCIBus *bus = dev->bus; + static const int bar_reg_map[] = { + PCI_BASE_ADDRESS_0, PCI_BASE_ADDRESS_1, PCI_BASE_ADDRESS_2, + PCI_BASE_ADDRESS_3, PCI_BASE_ADDRESS_4, PCI_BASE_ADDRESS_5, + }; + int bar_reg; + uint32_t addr, size; + uint32_t io_type; + uint64_t loc; + + g_assert(barno >= 0 && barno <= 5); + bar_reg = bar_reg_map[barno]; + + qpci_config_writel(dev, bar_reg, 0xFFFFFFFF); + addr = qpci_config_readl(dev, bar_reg); + + io_type = addr & PCI_BASE_ADDRESS_SPACE; + if (io_type == PCI_BASE_ADDRESS_SPACE_IO) { + addr &= PCI_BASE_ADDRESS_IO_MASK; + } else { + addr &= PCI_BASE_ADDRESS_MEM_MASK; + } + + g_assert(addr); /* Must have *some* size bits */ + + size = 1U << ctz32(addr); + if (sizeptr) { + *sizeptr = size; + } + + if (io_type == PCI_BASE_ADDRESS_SPACE_IO) { + loc = QEMU_ALIGN_UP(bus->pio_alloc_ptr, size); + + g_assert(loc >= bus->pio_alloc_ptr); + g_assert(loc + size <= QPCI_PIO_LIMIT); /* Keep PIO below 64kiB */ + + bus->pio_alloc_ptr = loc + size; + + qpci_config_writel(dev, bar_reg, loc | PCI_BASE_ADDRESS_SPACE_IO); + } else { + loc = QEMU_ALIGN_UP(bus->mmio_alloc_ptr, size); + + /* Check for space */ + g_assert(loc >= bus->mmio_alloc_ptr); + g_assert(loc + size <= bus->mmio_limit); + + bus->mmio_alloc_ptr = loc + size; + + qpci_config_writel(dev, bar_reg, loc); + } + + return (void *)(uintptr_t)loc; } void qpci_iounmap(QPCIDevice *dev, void *data) { - dev->bus->iounmap(dev->bus, data); + /* FIXME */ } void qpci_plug_device_test(const char *driver, const char *id, diff --git a/tests/libqos/pci.h b/tests/libqos/pci.h index 72a2245c05..f6f916dca7 100644 --- a/tests/libqos/pci.h +++ b/tests/libqos/pci.h @@ -22,8 +22,7 @@ typedef struct QPCIDevice QPCIDevice; typedef struct QPCIBus QPCIBus; -struct QPCIBus -{ +struct QPCIBus { uint8_t (*pio_readb)(QPCIBus *bus, uint32_t addr); uint16_t (*pio_readw)(QPCIBus *bus, uint32_t addr); uint32_t (*pio_readl)(QPCIBus *bus, uint32_t addr); @@ -51,8 +50,8 @@ struct QPCIBus void (*config_writel)(QPCIBus *bus, int devfn, uint8_t offset, uint32_t value); - void *(*iomap)(QPCIBus *bus, QPCIDevice *dev, int barno, uint64_t *sizeptr); - void (*iounmap)(QPCIBus *bus, void *data); + uint16_t pio_alloc_ptr; + uint64_t mmio_alloc_ptr, mmio_limit; }; struct QPCIDevice From a7b85b60623a862e2c55d5a6cd2e17f5fc26b256 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Wed, 19 Oct 2016 17:43:42 +1100 Subject: [PATCH 54/73] libqos: Better handling of PCI legacy IO The usual model for PCI IO with libqos is to use qpci_iomap() to map a specific BAR for a PCI device, then perform IOs within that BAR using qpci_io_{read,write}*(). However, certain devices also have legacy PCI IO. In this case, instead of (or as well as) being accessed via PCI BARs, the device can be accessed via certain well-known, fixed addresses in PCI IO space. Two existing tests use legacy PCI IO, and take different flawed approaches to it: * tco-test manually constructs a tco_io_base value instead of calling qpci_iomap(), which assumes internal knowledge of the structure of the value it shouldn't have * ide-test uses direct in*() and out*() calls instead of using qpci_io_*() accessors, meaning it's not portable to non-x86 machine types. This patch implements a new qpci_iomap_legacy() interface which gets a handle in the same format as qpci_iomap() but refers to a region in the legacy PIO space. For a device which has the same registers available both in a BAR and in legacy space (quite common), this allows the same test code to test both options with just a different iomap() at the beginning. Signed-off-by: David Gibson Reviewed-by: Laurent Vivier Reviewed-by: Greg Kurz --- tests/libqos/pci.c | 5 +++++ tests/libqos/pci.h | 1 + 2 files changed, 6 insertions(+) diff --git a/tests/libqos/pci.c b/tests/libqos/pci.c index bf1c53240b..98a2e56569 100644 --- a/tests/libqos/pci.c +++ b/tests/libqos/pci.c @@ -350,6 +350,11 @@ void qpci_iounmap(QPCIDevice *dev, void *data) /* FIXME */ } +void *qpci_legacy_iomap(QPCIDevice *dev, uint16_t addr) +{ + return (void *)(uintptr_t)addr; +} + void qpci_plug_device_test(const char *driver, const char *id, uint8_t slot, const char *opts) { diff --git a/tests/libqos/pci.h b/tests/libqos/pci.h index f6f916dca7..b6f855e3b6 100644 --- a/tests/libqos/pci.h +++ b/tests/libqos/pci.h @@ -94,6 +94,7 @@ void qpci_io_writel(QPCIDevice *dev, void *data, uint32_t value); void *qpci_iomap(QPCIDevice *dev, int barno, uint64_t *sizeptr); void qpci_iounmap(QPCIDevice *dev, void *data); +void *qpci_legacy_iomap(QPCIDevice *dev, uint16_t addr); void qpci_plug_device_test(const char *driver, const char *id, uint8_t slot, const char *opts); From 9ff50be2ffb3c116811cfc63dd1fa0ef8c4a9c75 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Wed, 19 Oct 2016 21:49:39 +1100 Subject: [PATCH 55/73] tests: Adjust tco-test to use qpci_legacy_iomap() Avoid tco-test making assumptions about the internal format of the address tokens passed to PCI IO accessors, by using the new qpci_legacy_iomap() function. Signed-off-by: David Gibson Reviewed-by: Laurent Vivier Reviewed-by: Greg Kurz --- tests/tco-test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tco-test.c b/tests/tco-test.c index 0d201b1fcb..129577d1c0 100644 --- a/tests/tco-test.c +++ b/tests/tco-test.c @@ -70,7 +70,7 @@ static void test_init(TestData *d) /* set Root Complex BAR */ qpci_config_writel(d->dev, ICH9_LPC_RCBA, RCBA_BASE_ADDR | 0x1); - d->tco_io_base = (void *)((uintptr_t)PM_IO_BASE_ADDR + 0x60); + d->tco_io_base = qpci_legacy_iomap(d->dev, PM_IO_BASE_ADDR + 0x60); } static void stop_tco(const TestData *d) From 9a84f889471de50144632100109f93aabea68ff6 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Wed, 19 Oct 2016 14:19:47 +1100 Subject: [PATCH 56/73] libqos: Add streaming accessors for PCI MMIO Currently PCI memory (aka MMIO) space is accessed via a set of readb/writeb style accessors. This is what we want for accessing discrete registers of a certain size. However, there are a few cases where we instead need a "bag of bytes" style streaming interface to PCI MMIO space. This can be either for streaming data style registers or when there's actual memory rather than registers in PCI space, for example frame buffers or ivshmem. This patch adds backend callbacks, and libqos wrappers for this type of byte address order preserving accesses. Signed-off-by: David Gibson Reviewed-by: Laurent Vivier Reviewed-by: Greg Kurz --- tests/libqos/pci-pc.c | 14 ++++++++++++++ tests/libqos/pci-spapr.c | 17 +++++++++++++++++ tests/libqos/pci.c | 16 ++++++++++++++++ tests/libqos/pci.h | 6 ++++++ 4 files changed, 53 insertions(+) diff --git a/tests/libqos/pci-pc.c b/tests/libqos/pci-pc.c index d0eb84a134..84aee25350 100644 --- a/tests/libqos/pci-pc.c +++ b/tests/libqos/pci-pc.c @@ -87,6 +87,17 @@ static void qpci_pc_mmio_writel(QPCIBus *bus, uint32_t addr, uint32_t val) writel(addr, val); } +static void qpci_pc_memread(QPCIBus *bus, uint32_t addr, void *buf, size_t len) +{ + memread(addr, buf, len); +} + +static void qpci_pc_memwrite(QPCIBus *bus, uint32_t addr, + const void *buf, size_t len) +{ + memwrite(addr, buf, len); +} + static uint8_t qpci_pc_config_readb(QPCIBus *bus, int devfn, uint8_t offset) { outl(0xcf8, (1U << 31) | (devfn << 8) | offset); @@ -145,6 +156,9 @@ QPCIBus *qpci_init_pc(QGuestAllocator *alloc) ret->bus.mmio_writew = qpci_pc_mmio_writew; ret->bus.mmio_writel = qpci_pc_mmio_writel; + ret->bus.memread = qpci_pc_memread; + ret->bus.memwrite = qpci_pc_memwrite; + ret->bus.config_readb = qpci_pc_config_readb; ret->bus.config_readw = qpci_pc_config_readw; ret->bus.config_readl = qpci_pc_config_readl; diff --git a/tests/libqos/pci-spapr.c b/tests/libqos/pci-spapr.c index 70a24b5579..ad12c2e582 100644 --- a/tests/libqos/pci-spapr.c +++ b/tests/libqos/pci-spapr.c @@ -114,6 +114,20 @@ static void qpci_spapr_mmio32_writel(QPCIBus *bus, uint32_t addr, uint32_t val) writel(s->mmio32_cpu_base + addr, bswap32(val)); } +static void qpci_spapr_memread(QPCIBus *bus, uint32_t addr, + void *buf, size_t len) +{ + QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); + memread(s->mmio32_cpu_base + addr, buf, len); +} + +static void qpci_spapr_memwrite(QPCIBus *bus, uint32_t addr, + const void *buf, size_t len) +{ + QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); + memwrite(s->mmio32_cpu_base + addr, buf, len); +} + static uint8_t qpci_spapr_config_readb(QPCIBus *bus, int devfn, uint8_t offset) { QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); @@ -188,6 +202,9 @@ QPCIBus *qpci_init_spapr(QGuestAllocator *alloc) ret->bus.mmio_writew = qpci_spapr_mmio32_writew; ret->bus.mmio_writel = qpci_spapr_mmio32_writel; + ret->bus.memread = qpci_spapr_memread; + ret->bus.memwrite = qpci_spapr_memwrite; + ret->bus.config_readb = qpci_spapr_config_readb; ret->bus.config_readw = qpci_spapr_config_readw; ret->bus.config_readl = qpci_spapr_config_readl; diff --git a/tests/libqos/pci.c b/tests/libqos/pci.c index 98a2e56569..146b06311c 100644 --- a/tests/libqos/pci.c +++ b/tests/libqos/pci.c @@ -289,6 +289,22 @@ void qpci_io_writel(QPCIDevice *dev, void *data, uint32_t value) } } +void qpci_memread(QPCIDevice *dev, void *data, void *buf, size_t len) +{ + uintptr_t addr = (uintptr_t)data; + + g_assert(addr >= QPCI_PIO_LIMIT); + dev->bus->memread(dev->bus, addr, buf, len); +} + +void qpci_memwrite(QPCIDevice *dev, void *data, const void *buf, size_t len) +{ + uintptr_t addr = (uintptr_t)data; + + g_assert(addr >= QPCI_PIO_LIMIT); + dev->bus->memwrite(dev->bus, addr, buf, len); +} + void *qpci_iomap(QPCIDevice *dev, int barno, uint64_t *sizeptr) { QPCIBus *bus = dev->bus; diff --git a/tests/libqos/pci.h b/tests/libqos/pci.h index b6f855e3b6..2b083624ef 100644 --- a/tests/libqos/pci.h +++ b/tests/libqos/pci.h @@ -39,6 +39,9 @@ struct QPCIBus { void (*mmio_writew)(QPCIBus *bus, uint32_t addr, uint16_t value); void (*mmio_writel)(QPCIBus *bus, uint32_t addr, uint32_t value); + void (*memread)(QPCIBus *bus, uint32_t addr, void *buf, size_t len); + void (*memwrite)(QPCIBus *bus, uint32_t addr, const void *buf, size_t len); + uint8_t (*config_readb)(QPCIBus *bus, int devfn, uint8_t offset); uint16_t (*config_readw)(QPCIBus *bus, int devfn, uint8_t offset); uint32_t (*config_readl)(QPCIBus *bus, int devfn, uint8_t offset); @@ -92,6 +95,9 @@ void qpci_io_writeb(QPCIDevice *dev, void *data, uint8_t value); void qpci_io_writew(QPCIDevice *dev, void *data, uint16_t value); void qpci_io_writel(QPCIDevice *dev, void *data, uint32_t value); +void qpci_memread(QPCIDevice *bus, void *data, void *buf, size_t len); +void qpci_memwrite(QPCIDevice *bus, void *data, const void *buf, size_t len); + void *qpci_iomap(QPCIDevice *dev, int barno, uint64_t *sizeptr); void qpci_iounmap(QPCIDevice *dev, void *data); void *qpci_legacy_iomap(QPCIDevice *dev, uint16_t addr); From 352d664cce514a94228fbf6e05d03920b2d6bd69 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Wed, 19 Oct 2016 14:20:44 +1100 Subject: [PATCH 57/73] libqos: Implement mmio accessors in terms of mem{read,write} In the libqos PCI code we now have accessors both for registers (byte significance preserving) and for streaming data (byte address order preserving). These exist in both the interface for qtest drivers and in the machine specific backends. However, the register-style accessors aren't actually necessary in the backend. They can be implemented in terms of the byte address order preserving accessors by the libqos wrappers. This works because PCI is always little endian. This does assume that the back end byte address order preserving accessors will perform the equivalent of a single bus transaction for short lengths. This is the case, and in fact they currently end up using the same cpu_physical_memory_rw() implementation within the qtest accelerator. Signed-off-by: David Gibson Reviewed-by: Laurent Vivier Reviewed-by: Greg Kurz --- tests/libqos/pci-pc.c | 38 ---------------------------------- tests/libqos/pci-spapr.c | 44 ---------------------------------------- tests/libqos/pci.c | 20 ++++++++++++------ tests/libqos/pci.h | 8 -------- 4 files changed, 14 insertions(+), 96 deletions(-) diff --git a/tests/libqos/pci-pc.c b/tests/libqos/pci-pc.c index 84aee25350..849ea56da4 100644 --- a/tests/libqos/pci-pc.c +++ b/tests/libqos/pci-pc.c @@ -32,61 +32,31 @@ static uint8_t qpci_pc_pio_readb(QPCIBus *bus, uint32_t addr) return inb(addr); } -static uint8_t qpci_pc_mmio_readb(QPCIBus *bus, uint32_t addr) -{ - return readb(addr); -} - static void qpci_pc_pio_writeb(QPCIBus *bus, uint32_t addr, uint8_t val) { outb(addr, val); } -static void qpci_pc_mmio_writeb(QPCIBus *bus, uint32_t addr, uint8_t val) -{ - writeb(addr, val); -} - static uint16_t qpci_pc_pio_readw(QPCIBus *bus, uint32_t addr) { return inw(addr); } -static uint16_t qpci_pc_mmio_readw(QPCIBus *bus, uint32_t addr) -{ - return readw(addr); -} - static void qpci_pc_pio_writew(QPCIBus *bus, uint32_t addr, uint16_t val) { outw(addr, val); } -static void qpci_pc_mmio_writew(QPCIBus *bus, uint32_t addr, uint16_t val) -{ - writew(addr, val); -} - static uint32_t qpci_pc_pio_readl(QPCIBus *bus, uint32_t addr) { return inl(addr); } -static uint32_t qpci_pc_mmio_readl(QPCIBus *bus, uint32_t addr) -{ - return readl(addr); -} - static void qpci_pc_pio_writel(QPCIBus *bus, uint32_t addr, uint32_t val) { outl(addr, val); } -static void qpci_pc_mmio_writel(QPCIBus *bus, uint32_t addr, uint32_t val) -{ - writel(addr, val); -} - static void qpci_pc_memread(QPCIBus *bus, uint32_t addr, void *buf, size_t len) { memread(addr, buf, len); @@ -148,14 +118,6 @@ QPCIBus *qpci_init_pc(QGuestAllocator *alloc) ret->bus.pio_writew = qpci_pc_pio_writew; ret->bus.pio_writel = qpci_pc_pio_writel; - ret->bus.mmio_readb = qpci_pc_mmio_readb; - ret->bus.mmio_readw = qpci_pc_mmio_readw; - ret->bus.mmio_readl = qpci_pc_mmio_readl; - - ret->bus.mmio_writeb = qpci_pc_mmio_writeb; - ret->bus.mmio_writew = qpci_pc_mmio_writew; - ret->bus.mmio_writel = qpci_pc_mmio_writel; - ret->bus.memread = qpci_pc_memread; ret->bus.memwrite = qpci_pc_memwrite; diff --git a/tests/libqos/pci-spapr.c b/tests/libqos/pci-spapr.c index ad12c2e582..f26488ae5e 100644 --- a/tests/libqos/pci-spapr.c +++ b/tests/libqos/pci-spapr.c @@ -48,72 +48,36 @@ static uint8_t qpci_spapr_pio_readb(QPCIBus *bus, uint32_t addr) return readb(s->pio_cpu_base + addr); } -static uint8_t qpci_spapr_mmio32_readb(QPCIBus *bus, uint32_t addr) -{ - QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); - return readb(s->mmio32_cpu_base + addr); -} - static void qpci_spapr_pio_writeb(QPCIBus *bus, uint32_t addr, uint8_t val) { QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); writeb(s->pio_cpu_base + addr, val); } -static void qpci_spapr_mmio32_writeb(QPCIBus *bus, uint32_t addr, uint8_t val) -{ - QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); - writeb(s->mmio32_cpu_base + addr, val); -} - static uint16_t qpci_spapr_pio_readw(QPCIBus *bus, uint32_t addr) { QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); return bswap16(readw(s->pio_cpu_base + addr)); } -static uint16_t qpci_spapr_mmio32_readw(QPCIBus *bus, uint32_t addr) -{ - QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); - return bswap16(readw(s->mmio32_cpu_base + addr)); -} - static void qpci_spapr_pio_writew(QPCIBus *bus, uint32_t addr, uint16_t val) { QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); writew(s->pio_cpu_base + addr, bswap16(val)); } -static void qpci_spapr_mmio32_writew(QPCIBus *bus, uint32_t addr, uint16_t val) -{ - QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); - writew(s->mmio32_cpu_base + addr, bswap16(val)); -} - static uint32_t qpci_spapr_pio_readl(QPCIBus *bus, uint32_t addr) { QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); return bswap32(readl(s->pio_cpu_base + addr)); } -static uint32_t qpci_spapr_mmio32_readl(QPCIBus *bus, uint32_t addr) -{ - QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); - return bswap32(readl(s->mmio32_cpu_base + addr)); -} - static void qpci_spapr_pio_writel(QPCIBus *bus, uint32_t addr, uint32_t val) { QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); writel(s->pio_cpu_base + addr, bswap32(val)); } -static void qpci_spapr_mmio32_writel(QPCIBus *bus, uint32_t addr, uint32_t val) -{ - QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); - writel(s->mmio32_cpu_base + addr, bswap32(val)); -} - static void qpci_spapr_memread(QPCIBus *bus, uint32_t addr, void *buf, size_t len) { @@ -194,14 +158,6 @@ QPCIBus *qpci_init_spapr(QGuestAllocator *alloc) ret->bus.pio_writew = qpci_spapr_pio_writew; ret->bus.pio_writel = qpci_spapr_pio_writel; - ret->bus.mmio_readb = qpci_spapr_mmio32_readb; - ret->bus.mmio_readw = qpci_spapr_mmio32_readw; - ret->bus.mmio_readl = qpci_spapr_mmio32_readl; - - ret->bus.mmio_writeb = qpci_spapr_mmio32_writeb; - ret->bus.mmio_writew = qpci_spapr_mmio32_writew; - ret->bus.mmio_writel = qpci_spapr_mmio32_writel; - ret->bus.memread = qpci_spapr_memread; ret->bus.memwrite = qpci_spapr_memwrite; diff --git a/tests/libqos/pci.c b/tests/libqos/pci.c index 146b06311c..bdffeb3ec2 100644 --- a/tests/libqos/pci.c +++ b/tests/libqos/pci.c @@ -230,7 +230,9 @@ uint8_t qpci_io_readb(QPCIDevice *dev, void *data) if (addr < QPCI_PIO_LIMIT) { return dev->bus->pio_readb(dev->bus, addr); } else { - return dev->bus->mmio_readb(dev->bus, addr); + uint8_t val; + dev->bus->memread(dev->bus, addr, &val, sizeof(val)); + return val; } } @@ -241,7 +243,9 @@ uint16_t qpci_io_readw(QPCIDevice *dev, void *data) if (addr < QPCI_PIO_LIMIT) { return dev->bus->pio_readw(dev->bus, addr); } else { - return dev->bus->mmio_readw(dev->bus, addr); + uint16_t val; + dev->bus->memread(dev->bus, addr, &val, sizeof(val)); + return le16_to_cpu(val); } } @@ -252,7 +256,9 @@ uint32_t qpci_io_readl(QPCIDevice *dev, void *data) if (addr < QPCI_PIO_LIMIT) { return dev->bus->pio_readl(dev->bus, addr); } else { - return dev->bus->mmio_readl(dev->bus, addr); + uint32_t val; + dev->bus->memread(dev->bus, addr, &val, sizeof(val)); + return le32_to_cpu(val); } } @@ -263,7 +269,7 @@ void qpci_io_writeb(QPCIDevice *dev, void *data, uint8_t value) if (addr < QPCI_PIO_LIMIT) { dev->bus->pio_writeb(dev->bus, addr, value); } else { - dev->bus->mmio_writeb(dev->bus, addr, value); + dev->bus->memwrite(dev->bus, addr, &value, sizeof(value)); } } @@ -274,7 +280,8 @@ void qpci_io_writew(QPCIDevice *dev, void *data, uint16_t value) if (addr < QPCI_PIO_LIMIT) { dev->bus->pio_writew(dev->bus, addr, value); } else { - dev->bus->mmio_writew(dev->bus, addr, value); + value = cpu_to_le16(value); + dev->bus->memwrite(dev->bus, addr, &value, sizeof(value)); } } @@ -285,7 +292,8 @@ void qpci_io_writel(QPCIDevice *dev, void *data, uint32_t value) if (addr < QPCI_PIO_LIMIT) { dev->bus->pio_writel(dev->bus, addr, value); } else { - dev->bus->mmio_writel(dev->bus, addr, value); + value = cpu_to_le32(value); + dev->bus->memwrite(dev->bus, addr, &value, sizeof(value)); } } diff --git a/tests/libqos/pci.h b/tests/libqos/pci.h index 2b083624ef..ce6ed08f2a 100644 --- a/tests/libqos/pci.h +++ b/tests/libqos/pci.h @@ -27,18 +27,10 @@ struct QPCIBus { uint16_t (*pio_readw)(QPCIBus *bus, uint32_t addr); uint32_t (*pio_readl)(QPCIBus *bus, uint32_t addr); - uint8_t (*mmio_readb)(QPCIBus *bus, uint32_t addr); - uint16_t (*mmio_readw)(QPCIBus *bus, uint32_t addr); - uint32_t (*mmio_readl)(QPCIBus *bus, uint32_t addr); - void (*pio_writeb)(QPCIBus *bus, uint32_t addr, uint8_t value); void (*pio_writew)(QPCIBus *bus, uint32_t addr, uint16_t value); void (*pio_writel)(QPCIBus *bus, uint32_t addr, uint32_t value); - void (*mmio_writeb)(QPCIBus *bus, uint32_t addr, uint8_t value); - void (*mmio_writew)(QPCIBus *bus, uint32_t addr, uint16_t value); - void (*mmio_writel)(QPCIBus *bus, uint32_t addr, uint32_t value); - void (*memread)(QPCIBus *bus, uint32_t addr, void *buf, size_t len); void (*memwrite)(QPCIBus *bus, uint32_t addr, const void *buf, size_t len); From 9c268f8ae84ae18679ba2c3b16394e1828e9a006 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Fri, 21 Oct 2016 10:46:37 +1100 Subject: [PATCH 58/73] tests: Clean up IO handling in ide-test ide-test uses many explicit inb() / outb() operations for its IO, which means it's not portable to non-x86 platforms. This cleans it up to use the libqos PCI accessors instead. Signed-off-by: David Gibson Reviewed-by: Greg Kurz --- tests/ide-test.c | 179 +++++++++++++++++++++++++++++++---------------- 1 file changed, 118 insertions(+), 61 deletions(-) diff --git a/tests/ide-test.c b/tests/ide-test.c index a8a4081f78..86c4373792 100644 --- a/tests/ide-test.c +++ b/tests/ide-test.c @@ -137,7 +137,7 @@ static void ide_test_quit(void) qtest_end(); } -static QPCIDevice *get_pci_device(uint16_t *bmdma_base) +static QPCIDevice *get_pci_device(void **bmdma_base, void **ide_base) { QPCIDevice *dev; uint16_t vendor_id, device_id; @@ -156,7 +156,9 @@ static QPCIDevice *get_pci_device(uint16_t *bmdma_base) g_assert(device_id == PCI_DEVICE_ID_INTEL_82371SB_1); /* Map bmdma BAR */ - *bmdma_base = (uint16_t)(uintptr_t) qpci_iomap(dev, 4, NULL); + *bmdma_base = qpci_iomap(dev, 4, NULL); + + *ide_base = qpci_legacy_iomap(dev, IDE_BASE); qpci_device_enable(dev); @@ -179,17 +181,19 @@ typedef struct PrdtEntry { static int send_dma_request(int cmd, uint64_t sector, int nb_sectors, PrdtEntry *prdt, int prdt_entries, - void(*post_exec)(uint64_t sector, int nb_sectors)) + void(*post_exec)(QPCIDevice *dev, void *ide_base, + uint64_t sector, int nb_sectors)) { QPCIDevice *dev; - uint16_t bmdma_base; + void *bmdma_base; + void *ide_base; uintptr_t guest_prdt; size_t len; bool from_dev; uint8_t status; int flags; - dev = get_pci_device(&bmdma_base); + dev = get_pci_device(&bmdma_base, &ide_base); flags = cmd & ~0xff; cmd &= 0xff; @@ -214,59 +218,60 @@ static int send_dma_request(int cmd, uint64_t sector, int nb_sectors, } /* Select device 0 */ - outb(IDE_BASE + reg_device, 0 | LBA); + qpci_io_writeb(dev, ide_base + reg_device, 0 | LBA); /* Stop any running transfer, clear any pending interrupt */ - outb(bmdma_base + bmreg_cmd, 0); - outb(bmdma_base + bmreg_status, BM_STS_INTR); + qpci_io_writeb(dev, bmdma_base + bmreg_cmd, 0); + qpci_io_writeb(dev, bmdma_base + bmreg_status, BM_STS_INTR); /* Setup PRDT */ len = sizeof(*prdt) * prdt_entries; guest_prdt = guest_alloc(guest_malloc, len); memwrite(guest_prdt, prdt, len); - outl(bmdma_base + bmreg_prdt, guest_prdt); + qpci_io_writel(dev, bmdma_base + bmreg_prdt, guest_prdt); /* ATA DMA command */ if (cmd == CMD_PACKET) { /* Enables ATAPI DMA; otherwise PIO is attempted */ - outb(IDE_BASE + reg_feature, 0x01); + qpci_io_writeb(dev, ide_base + reg_feature, 0x01); } else { - outb(IDE_BASE + reg_nsectors, nb_sectors); - outb(IDE_BASE + reg_lba_low, sector & 0xff); - outb(IDE_BASE + reg_lba_middle, (sector >> 8) & 0xff); - outb(IDE_BASE + reg_lba_high, (sector >> 16) & 0xff); + qpci_io_writeb(dev, ide_base + reg_nsectors, nb_sectors); + qpci_io_writeb(dev, ide_base + reg_lba_low, sector & 0xff); + qpci_io_writeb(dev, ide_base + reg_lba_middle, (sector >> 8) & 0xff); + qpci_io_writeb(dev, ide_base + reg_lba_high, (sector >> 16) & 0xff); } - outb(IDE_BASE + reg_command, cmd); + qpci_io_writeb(dev, ide_base + reg_command, cmd); if (post_exec) { - post_exec(sector, nb_sectors); + post_exec(dev, ide_base, sector, nb_sectors); } /* Start DMA transfer */ - outb(bmdma_base + bmreg_cmd, BM_CMD_START | (from_dev ? BM_CMD_WRITE : 0)); + qpci_io_writeb(dev, bmdma_base + bmreg_cmd, + BM_CMD_START | (from_dev ? BM_CMD_WRITE : 0)); if (flags & CMDF_ABORT) { - outb(bmdma_base + bmreg_cmd, 0); + qpci_io_writeb(dev, bmdma_base + bmreg_cmd, 0); } /* Wait for the DMA transfer to complete */ do { - status = inb(bmdma_base + bmreg_status); + status = qpci_io_readb(dev, bmdma_base + bmreg_status); } while ((status & (BM_STS_ACTIVE | BM_STS_INTR)) == BM_STS_ACTIVE); g_assert_cmpint(get_irq(IDE_PRIMARY_IRQ), ==, !!(status & BM_STS_INTR)); /* Check IDE status code */ - assert_bit_set(inb(IDE_BASE + reg_status), DRDY); - assert_bit_clear(inb(IDE_BASE + reg_status), BSY | DRQ); + assert_bit_set(qpci_io_readb(dev, ide_base + reg_status), DRDY); + assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), BSY | DRQ); /* Reading the status register clears the IRQ */ g_assert(!get_irq(IDE_PRIMARY_IRQ)); /* Stop DMA transfer if still active */ if (status & BM_STS_ACTIVE) { - outb(bmdma_base + bmreg_cmd, 0); + qpci_io_writeb(dev, bmdma_base + bmreg_cmd, 0); } free_pci_device(dev); @@ -276,6 +281,8 @@ static int send_dma_request(int cmd, uint64_t sector, int nb_sectors, static void test_bmdma_simple_rw(void) { + QPCIDevice *dev; + void *bmdma_base, *ide_base; uint8_t status; uint8_t *buf; uint8_t *cmpbuf; @@ -289,6 +296,8 @@ static void test_bmdma_simple_rw(void) }, }; + dev = get_pci_device(&bmdma_base, &ide_base); + buf = g_malloc(len); cmpbuf = g_malloc(len); @@ -299,7 +308,7 @@ static void test_bmdma_simple_rw(void) status = send_dma_request(CMD_WRITE_DMA, 0, 1, prdt, ARRAY_SIZE(prdt), NULL); g_assert_cmphex(status, ==, BM_STS_INTR); - assert_bit_clear(inb(IDE_BASE + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); /* Write 0xaa pattern to sector 1 */ memset(buf, 0xaa, len); @@ -308,14 +317,14 @@ static void test_bmdma_simple_rw(void) status = send_dma_request(CMD_WRITE_DMA, 1, 1, prdt, ARRAY_SIZE(prdt), NULL); g_assert_cmphex(status, ==, BM_STS_INTR); - assert_bit_clear(inb(IDE_BASE + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); /* Read and verify 0x55 pattern in sector 0 */ memset(cmpbuf, 0x55, len); status = send_dma_request(CMD_READ_DMA, 0, 1, prdt, ARRAY_SIZE(prdt), NULL); g_assert_cmphex(status, ==, BM_STS_INTR); - assert_bit_clear(inb(IDE_BASE + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); memread(guest_buf, buf, len); g_assert(memcmp(buf, cmpbuf, len) == 0); @@ -325,7 +334,7 @@ static void test_bmdma_simple_rw(void) status = send_dma_request(CMD_READ_DMA, 1, 1, prdt, ARRAY_SIZE(prdt), NULL); g_assert_cmphex(status, ==, BM_STS_INTR); - assert_bit_clear(inb(IDE_BASE + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); memread(guest_buf, buf, len); g_assert(memcmp(buf, cmpbuf, len) == 0); @@ -337,6 +346,8 @@ static void test_bmdma_simple_rw(void) static void test_bmdma_short_prdt(void) { + QPCIDevice *dev; + void *bmdma_base, *ide_base; uint8_t status; PrdtEntry prdt[] = { @@ -346,21 +357,25 @@ static void test_bmdma_short_prdt(void) }, }; + dev = get_pci_device(&bmdma_base, &ide_base); + /* Normal request */ status = send_dma_request(CMD_READ_DMA, 0, 1, prdt, ARRAY_SIZE(prdt), NULL); g_assert_cmphex(status, ==, 0); - assert_bit_clear(inb(IDE_BASE + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); /* Abort the request before it completes */ status = send_dma_request(CMD_READ_DMA | CMDF_ABORT, 0, 1, prdt, ARRAY_SIZE(prdt), NULL); g_assert_cmphex(status, ==, 0); - assert_bit_clear(inb(IDE_BASE + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); } static void test_bmdma_one_sector_short_prdt(void) { + QPCIDevice *dev; + void *bmdma_base, *ide_base; uint8_t status; /* Read 2 sectors but only give 1 sector in PRDT */ @@ -371,21 +386,25 @@ static void test_bmdma_one_sector_short_prdt(void) }, }; + dev = get_pci_device(&bmdma_base, &ide_base); + /* Normal request */ status = send_dma_request(CMD_READ_DMA, 0, 2, prdt, ARRAY_SIZE(prdt), NULL); g_assert_cmphex(status, ==, 0); - assert_bit_clear(inb(IDE_BASE + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); /* Abort the request before it completes */ status = send_dma_request(CMD_READ_DMA | CMDF_ABORT, 0, 2, prdt, ARRAY_SIZE(prdt), NULL); g_assert_cmphex(status, ==, 0); - assert_bit_clear(inb(IDE_BASE + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); } static void test_bmdma_long_prdt(void) { + QPCIDevice *dev; + void *bmdma_base, *ide_base; uint8_t status; PrdtEntry prdt[] = { @@ -395,23 +414,29 @@ static void test_bmdma_long_prdt(void) }, }; + dev = get_pci_device(&bmdma_base, &ide_base); + /* Normal request */ status = send_dma_request(CMD_READ_DMA, 0, 1, prdt, ARRAY_SIZE(prdt), NULL); g_assert_cmphex(status, ==, BM_STS_ACTIVE | BM_STS_INTR); - assert_bit_clear(inb(IDE_BASE + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); /* Abort the request before it completes */ status = send_dma_request(CMD_READ_DMA | CMDF_ABORT, 0, 1, prdt, ARRAY_SIZE(prdt), NULL); g_assert_cmphex(status, ==, BM_STS_INTR); - assert_bit_clear(inb(IDE_BASE + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); } static void test_bmdma_no_busmaster(void) { + QPCIDevice *dev; + void *bmdma_base, *ide_base; uint8_t status; + dev = get_pci_device(&bmdma_base, &ide_base); + /* No PRDT_EOT, each entry addr 0/size 64k, and in theory qemu shouldn't be * able to access it anyway because the Bus Master bit in the PCI command * register isn't set. This is complete nonsense, but it used to be pretty @@ -424,7 +449,7 @@ static void test_bmdma_no_busmaster(void) /* Not entirely clear what the expected result is, but this is what we get * in practice. At least we want to be aware of any changes. */ g_assert_cmphex(status, ==, BM_STS_ACTIVE | BM_STS_INTR); - assert_bit_clear(inb(IDE_BASE + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); } static void test_bmdma_setup(void) @@ -454,6 +479,8 @@ static void string_cpu_to_be16(uint16_t *s, size_t bytes) static void test_identify(void) { + QPCIDevice *dev; + void *bmdma_base, *ide_base; uint8_t data; uint16_t buf[256]; int i; @@ -464,23 +491,25 @@ static void test_identify(void) "-global ide-hd.ver=%s", tmp_path, "testdisk", "version"); + dev = get_pci_device(&bmdma_base, &ide_base); + /* IDENTIFY command on device 0*/ - outb(IDE_BASE + reg_device, 0); - outb(IDE_BASE + reg_command, CMD_IDENTIFY); + qpci_io_writeb(dev, ide_base + reg_device, 0); + qpci_io_writeb(dev, ide_base + reg_command, CMD_IDENTIFY); /* Read in the IDENTIFY buffer and check registers */ - data = inb(IDE_BASE + reg_device); + data = qpci_io_readb(dev, ide_base + reg_device); g_assert_cmpint(data & DEV, ==, 0); for (i = 0; i < 256; i++) { - data = inb(IDE_BASE + reg_status); + data = qpci_io_readb(dev, ide_base + reg_status); assert_bit_set(data, DRDY | DRQ); assert_bit_clear(data, BSY | DF | ERR); - ((uint16_t*) buf)[i] = inw(IDE_BASE + reg_data); + buf[i] = qpci_io_readw(dev, ide_base + reg_data); } - data = inb(IDE_BASE + reg_status); + data = qpci_io_readb(dev, ide_base + reg_status); assert_bit_set(data, DRDY); assert_bit_clear(data, BSY | DF | ERR | DRQ); @@ -505,11 +534,15 @@ static void test_identify(void) */ static void make_dirty(uint8_t device) { + QPCIDevice *dev; + void *bmdma_base, *ide_base; uint8_t status; size_t len = 512; uintptr_t guest_buf; void* buf; + dev = get_pci_device(&bmdma_base, &ide_base); + guest_buf = guest_alloc(guest_malloc, len); buf = g_malloc(len); g_assert(guest_buf); @@ -527,19 +560,23 @@ static void make_dirty(uint8_t device) status = send_dma_request(CMD_WRITE_DMA, 1, 1, prdt, ARRAY_SIZE(prdt), NULL); g_assert_cmphex(status, ==, BM_STS_INTR); - assert_bit_clear(inb(IDE_BASE + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); g_free(buf); } static void test_flush(void) { + QPCIDevice *dev; + void *bmdma_base, *ide_base; uint8_t data; ide_test_start( "-drive file=blkdebug::%s,if=ide,cache=writeback,format=raw", tmp_path); + dev = get_pci_device(&bmdma_base, &ide_base); + qtest_irq_intercept_in(global_qtest, "ioapic"); /* Dirty media so that CMD_FLUSH_CACHE will actually go to disk */ @@ -549,11 +586,11 @@ static void test_flush(void) g_free(hmp("qemu-io ide0-hd0 \"break flush_to_os A\"")); /* FLUSH CACHE command on device 0*/ - outb(IDE_BASE + reg_device, 0); - outb(IDE_BASE + reg_command, CMD_FLUSH_CACHE); + qpci_io_writeb(dev, ide_base + reg_device, 0); + qpci_io_writeb(dev, ide_base + reg_command, CMD_FLUSH_CACHE); /* Check status while request is in flight*/ - data = inb(IDE_BASE + reg_status); + data = qpci_io_readb(dev, ide_base + reg_status); assert_bit_set(data, BSY | DRDY); assert_bit_clear(data, DF | ERR | DRQ); @@ -561,11 +598,11 @@ static void test_flush(void) g_free(hmp("qemu-io ide0-hd0 \"resume A\"")); /* Check registers */ - data = inb(IDE_BASE + reg_device); + data = qpci_io_readb(dev, ide_base + reg_device); g_assert_cmpint(data & DEV, ==, 0); do { - data = inb(IDE_BASE + reg_status); + data = qpci_io_readb(dev, ide_base + reg_status); } while (data & BSY); assert_bit_set(data, DRDY); @@ -576,6 +613,8 @@ static void test_flush(void) static void test_retry_flush(const char *machine) { + QPCIDevice *dev; + void *bmdma_base, *ide_base; uint8_t data; const char *s; @@ -587,17 +626,19 @@ static void test_retry_flush(const char *machine) "rerror=stop,werror=stop", debug_path, tmp_path); + dev = get_pci_device(&bmdma_base, &ide_base); + qtest_irq_intercept_in(global_qtest, "ioapic"); /* Dirty media so that CMD_FLUSH_CACHE will actually go to disk */ make_dirty(0); /* FLUSH CACHE command on device 0*/ - outb(IDE_BASE + reg_device, 0); - outb(IDE_BASE + reg_command, CMD_FLUSH_CACHE); + qpci_io_writeb(dev, ide_base + reg_device, 0); + qpci_io_writeb(dev, ide_base + reg_command, CMD_FLUSH_CACHE); /* Check status while request is in flight*/ - data = inb(IDE_BASE + reg_status); + data = qpci_io_readb(dev, ide_base + reg_status); assert_bit_set(data, BSY | DRDY); assert_bit_clear(data, DF | ERR | DRQ); @@ -608,11 +649,11 @@ static void test_retry_flush(const char *machine) qmp_discard_response(s); /* Check registers */ - data = inb(IDE_BASE + reg_device); + data = qpci_io_readb(dev, ide_base + reg_device); g_assert_cmpint(data & DEV, ==, 0); do { - data = inb(IDE_BASE + reg_status); + data = qpci_io_readb(dev, ide_base + reg_status); } while (data & BSY); assert_bit_set(data, DRDY); @@ -623,11 +664,16 @@ static void test_retry_flush(const char *machine) static void test_flush_nodev(void) { + QPCIDevice *dev; + void *bmdma_base, *ide_base; + ide_test_start(""); + dev = get_pci_device(&bmdma_base, &ide_base); + /* FLUSH CACHE command on device 0*/ - outb(IDE_BASE + reg_device, 0); - outb(IDE_BASE + reg_command, CMD_FLUSH_CACHE); + qpci_io_writeb(dev, ide_base + reg_device, 0); + qpci_io_writeb(dev, ide_base + reg_command, CMD_FLUSH_CACHE); /* Just testing that qemu doesn't crash... */ @@ -654,7 +700,8 @@ typedef struct Read10CDB { uint16_t padding; } __attribute__((__packed__)) Read10CDB; -static void send_scsi_cdb_read10(uint64_t lba, int nblocks) +static void send_scsi_cdb_read10(QPCIDevice *dev, void *ide_base, + uint64_t lba, int nblocks) { Read10CDB pkt = { .padding = 0 }; int i; @@ -670,7 +717,8 @@ static void send_scsi_cdb_read10(uint64_t lba, int nblocks) /* Send Packet */ for (i = 0; i < sizeof(Read10CDB)/2; i++) { - outw(IDE_BASE + reg_data, cpu_to_le16(((uint16_t *)&pkt)[i])); + qpci_io_writew(dev, ide_base + reg_data, + le16_to_cpu(((uint16_t *)&pkt)[i])); } } @@ -683,13 +731,17 @@ static void nsleep(int64_t nsecs) static uint8_t ide_wait_clear(uint8_t flag) { + QPCIDevice *dev; + void *bmdma_base, *ide_base; uint8_t data; time_t st; + dev = get_pci_device(&bmdma_base, &ide_base); + /* Wait with a 5 second timeout */ time(&st); while (true) { - data = inb(IDE_BASE + reg_status); + data = qpci_io_readb(dev, ide_base + reg_status); if (!(data & flag)) { return data; } @@ -723,6 +775,8 @@ static void ide_wait_intr(int irq) static void cdrom_pio_impl(int nblocks) { + QPCIDevice *dev; + void *bmdma_base, *ide_base; FILE *fh; int patt_blocks = MAX(16, nblocks); size_t patt_len = ATAPI_BLOCK_SIZE * patt_blocks; @@ -741,13 +795,15 @@ static void cdrom_pio_impl(int nblocks) ide_test_start("-drive if=none,file=%s,media=cdrom,format=raw,id=sr0,index=0 " "-device ide-cd,drive=sr0,bus=ide.0", tmp_path); + dev = get_pci_device(&bmdma_base, &ide_base); qtest_irq_intercept_in(global_qtest, "ioapic"); /* PACKET command on device 0 */ - outb(IDE_BASE + reg_device, 0); - outb(IDE_BASE + reg_lba_middle, BYTE_COUNT_LIMIT & 0xFF); - outb(IDE_BASE + reg_lba_high, (BYTE_COUNT_LIMIT >> 8 & 0xFF)); - outb(IDE_BASE + reg_command, CMD_PACKET); + qpci_io_writeb(dev, ide_base + reg_device, 0); + qpci_io_writeb(dev, ide_base + reg_lba_middle, BYTE_COUNT_LIMIT & 0xFF); + qpci_io_writeb(dev, ide_base + reg_lba_high, + (BYTE_COUNT_LIMIT >> 8 & 0xFF)); + qpci_io_writeb(dev, ide_base + reg_command, CMD_PACKET); /* HP0: Check_Status_A State */ nsleep(400); data = ide_wait_clear(BSY); @@ -756,7 +812,7 @@ static void cdrom_pio_impl(int nblocks) assert_bit_clear(data, ERR | DF | BSY); /* SCSI CDB (READ10) -- read n*2048 bytes from block 0 */ - send_scsi_cdb_read10(0, nblocks); + send_scsi_cdb_read10(dev, ide_base, 0, nblocks); /* Read data back: occurs in bursts of 'BYTE_COUNT_LIMIT' bytes. * If BYTE_COUNT_LIMIT is odd, we transfer BYTE_COUNT_LIMIT - 1 bytes. @@ -780,7 +836,8 @@ static void cdrom_pio_impl(int nblocks) /* HP4: Transfer_Data */ for (j = 0; j < MIN((limit / 2), rem); j++) { - rx[offset + j] = le16_to_cpu(inw(IDE_BASE + reg_data)); + rx[offset + j] = cpu_to_le16(qpci_io_readw(dev, + ide_base + reg_data)); } } From f775f45ab866f8e2d26720de9cb3c8f0ba5684d3 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Wed, 19 Oct 2016 15:00:21 +1100 Subject: [PATCH 59/73] libqos: Add 64-bit PCI IO accessors Currently the libqos PCI layer includes accessor helpers for 8, 16 and 32 bit reads and writes. It's likely that we'll want 64-bit accesses in the future (plenty of modern peripherals will have 64-bit reigsters). This adds them. For PIO (not MMIO) accesses on the PC backend, this is implemented as two 32-bit ins or outs. That's not ideal but AFAICT x86 doesn't have 64-bit versions of in and out. This patch also converts the single current user of 64-bit accesses - virtio-pci.c to use the new mechanism, rather than a sequence of 8 byte reads. Signed-off-by: David Gibson Reviewed-by: Laurent Vivier Reviewed-by: Greg Kurz --- tests/libqos/pci-pc.c | 13 +++++++++++++ tests/libqos/pci-spapr.c | 14 ++++++++++++++ tests/libqos/pci.c | 25 +++++++++++++++++++++++++ tests/libqos/pci.h | 4 ++++ tests/libqos/virtio-pci.c | 16 ++++------------ 5 files changed, 60 insertions(+), 12 deletions(-) diff --git a/tests/libqos/pci-pc.c b/tests/libqos/pci-pc.c index 849ea56da4..ded1c54c06 100644 --- a/tests/libqos/pci-pc.c +++ b/tests/libqos/pci-pc.c @@ -57,6 +57,17 @@ static void qpci_pc_pio_writel(QPCIBus *bus, uint32_t addr, uint32_t val) outl(addr, val); } +static uint64_t qpci_pc_pio_readq(QPCIBus *bus, uint32_t addr) +{ + return (uint64_t)inl(addr) + ((uint64_t)inl(addr + 4) << 32); +} + +static void qpci_pc_pio_writeq(QPCIBus *bus, uint32_t addr, uint64_t val) +{ + outl(addr, val & 0xffffffff); + outl(addr + 4, val >> 32); +} + static void qpci_pc_memread(QPCIBus *bus, uint32_t addr, void *buf, size_t len) { memread(addr, buf, len); @@ -113,10 +124,12 @@ QPCIBus *qpci_init_pc(QGuestAllocator *alloc) ret->bus.pio_readb = qpci_pc_pio_readb; ret->bus.pio_readw = qpci_pc_pio_readw; ret->bus.pio_readl = qpci_pc_pio_readl; + ret->bus.pio_readq = qpci_pc_pio_readq; ret->bus.pio_writeb = qpci_pc_pio_writeb; ret->bus.pio_writew = qpci_pc_pio_writew; ret->bus.pio_writel = qpci_pc_pio_writel; + ret->bus.pio_writeq = qpci_pc_pio_writeq; ret->bus.memread = qpci_pc_memread; ret->bus.memwrite = qpci_pc_memwrite; diff --git a/tests/libqos/pci-spapr.c b/tests/libqos/pci-spapr.c index f26488ae5e..1e5d015bd4 100644 --- a/tests/libqos/pci-spapr.c +++ b/tests/libqos/pci-spapr.c @@ -78,6 +78,18 @@ static void qpci_spapr_pio_writel(QPCIBus *bus, uint32_t addr, uint32_t val) writel(s->pio_cpu_base + addr, bswap32(val)); } +static uint64_t qpci_spapr_pio_readq(QPCIBus *bus, uint32_t addr) +{ + QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); + return bswap64(readq(s->pio_cpu_base + addr)); +} + +static void qpci_spapr_pio_writeq(QPCIBus *bus, uint32_t addr, uint64_t val) +{ + QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus); + writeq(s->pio_cpu_base + addr, bswap64(val)); +} + static void qpci_spapr_memread(QPCIBus *bus, uint32_t addr, void *buf, size_t len) { @@ -153,10 +165,12 @@ QPCIBus *qpci_init_spapr(QGuestAllocator *alloc) ret->bus.pio_readb = qpci_spapr_pio_readb; ret->bus.pio_readw = qpci_spapr_pio_readw; ret->bus.pio_readl = qpci_spapr_pio_readl; + ret->bus.pio_readq = qpci_spapr_pio_readq; ret->bus.pio_writeb = qpci_spapr_pio_writeb; ret->bus.pio_writew = qpci_spapr_pio_writew; ret->bus.pio_writel = qpci_spapr_pio_writel; + ret->bus.pio_writeq = qpci_spapr_pio_writeq; ret->bus.memread = qpci_spapr_memread; ret->bus.memwrite = qpci_spapr_memwrite; diff --git a/tests/libqos/pci.c b/tests/libqos/pci.c index bdffeb3ec2..3021651ee4 100644 --- a/tests/libqos/pci.c +++ b/tests/libqos/pci.c @@ -262,6 +262,19 @@ uint32_t qpci_io_readl(QPCIDevice *dev, void *data) } } +uint64_t qpci_io_readq(QPCIDevice *dev, void *data) +{ + uintptr_t addr = (uintptr_t)data; + + if (addr < QPCI_PIO_LIMIT) { + return dev->bus->pio_readq(dev->bus, addr); + } else { + uint64_t val; + dev->bus->memread(dev->bus, addr, &val, sizeof(val)); + return le64_to_cpu(val); + } +} + void qpci_io_writeb(QPCIDevice *dev, void *data, uint8_t value) { uintptr_t addr = (uintptr_t)data; @@ -297,6 +310,18 @@ void qpci_io_writel(QPCIDevice *dev, void *data, uint32_t value) } } +void qpci_io_writeq(QPCIDevice *dev, void *data, uint64_t value) +{ + uintptr_t addr = (uintptr_t)data; + + if (addr < QPCI_PIO_LIMIT) { + dev->bus->pio_writeq(dev->bus, addr, value); + } else { + value = cpu_to_le64(value); + dev->bus->memwrite(dev->bus, addr, &value, sizeof(value)); + } +} + void qpci_memread(QPCIDevice *dev, void *data, void *buf, size_t len) { uintptr_t addr = (uintptr_t)data; diff --git a/tests/libqos/pci.h b/tests/libqos/pci.h index ce6ed08f2a..531e3f79e9 100644 --- a/tests/libqos/pci.h +++ b/tests/libqos/pci.h @@ -26,10 +26,12 @@ struct QPCIBus { uint8_t (*pio_readb)(QPCIBus *bus, uint32_t addr); uint16_t (*pio_readw)(QPCIBus *bus, uint32_t addr); uint32_t (*pio_readl)(QPCIBus *bus, uint32_t addr); + uint64_t (*pio_readq)(QPCIBus *bus, uint32_t addr); void (*pio_writeb)(QPCIBus *bus, uint32_t addr, uint8_t value); void (*pio_writew)(QPCIBus *bus, uint32_t addr, uint16_t value); void (*pio_writel)(QPCIBus *bus, uint32_t addr, uint32_t value); + void (*pio_writeq)(QPCIBus *bus, uint32_t addr, uint64_t value); void (*memread)(QPCIBus *bus, uint32_t addr, void *buf, size_t len); void (*memwrite)(QPCIBus *bus, uint32_t addr, const void *buf, size_t len); @@ -82,10 +84,12 @@ void qpci_config_writel(QPCIDevice *dev, uint8_t offset, uint32_t value); uint8_t qpci_io_readb(QPCIDevice *dev, void *data); uint16_t qpci_io_readw(QPCIDevice *dev, void *data); uint32_t qpci_io_readl(QPCIDevice *dev, void *data); +uint64_t qpci_io_readq(QPCIDevice *dev, void *data); void qpci_io_writeb(QPCIDevice *dev, void *data, uint8_t value); void qpci_io_writew(QPCIDevice *dev, void *data, uint16_t value); void qpci_io_writel(QPCIDevice *dev, void *data, uint32_t value); +void qpci_io_writeq(QPCIDevice *dev, void *data, uint64_t value); void qpci_memread(QPCIDevice *bus, void *data, void *buf, size_t len); void qpci_memwrite(QPCIDevice *bus, void *data, const void *buf, size_t len); diff --git a/tests/libqos/virtio-pci.c b/tests/libqos/virtio-pci.c index fa82132ab7..c69d09ddb2 100644 --- a/tests/libqos/virtio-pci.c +++ b/tests/libqos/virtio-pci.c @@ -106,22 +106,14 @@ static uint32_t qvirtio_pci_config_readl(QVirtioDevice *d, uint64_t off) static uint64_t qvirtio_pci_config_readq(QVirtioDevice *d, uint64_t off) { QVirtioPCIDevice *dev = (QVirtioPCIDevice *)d; - int i; - uint64_t u64 = 0; + uint64_t val; + val = qpci_io_readq(dev->pdev, CONFIG_BASE(dev) + off); if (qvirtio_is_big_endian(d)) { - for (i = 0; i < 8; ++i) { - u64 |= (uint64_t)qpci_io_readb(dev->pdev, CONFIG_BASE(dev) - + off + i) << (7 - i) * 8; - } - } else { - for (i = 0; i < 8; ++i) { - u64 |= (uint64_t)qpci_io_readb(dev->pdev, CONFIG_BASE(dev) - + off + i) << i * 8; - } + val = bswap64(val); } - return u64; + return val; } static uint32_t qvirtio_pci_get_features(QVirtioDevice *d) From 204e54b86d123d091f0b2d14541c491ece7b864f Mon Sep 17 00:00:00 2001 From: David Gibson Date: Tue, 18 Oct 2016 16:18:45 +1100 Subject: [PATCH 60/73] tests: Use qpci_mem{read,write} in ivshmem-test ivshmem implements a block of shared memory in a PCI BAR. Currently our test case accesses this using qtest_mem{read,write}. However, deducing the correct addresses for these requires making assumptions about the internel format returned by qpci_iomap(), along with some ugly casts. This patch changes the test to use the new qpci_mem{read,write} interfaces which is neater. Signed-off-by: David Gibson Reviewed-by: Laurent Vivier Reviewed-by: Greg Kurz --- tests/ivshmem-test.c | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/tests/ivshmem-test.c b/tests/ivshmem-test.c index f36bfe7d0a..fbd8258c7b 100644 --- a/tests/ivshmem-test.c +++ b/tests/ivshmem-test.c @@ -93,6 +93,25 @@ static inline void out_reg(IVState *s, enum Reg reg, unsigned v) global_qtest = qtest; } +static inline void read_mem(IVState *s, uint64_t off, void *buf, size_t len) +{ + QTestState *qtest = global_qtest; + + global_qtest = s->qtest; + qpci_memread(s->dev, s->mem_base + off, buf, len); + global_qtest = qtest; +} + +static inline void write_mem(IVState *s, uint64_t off, + const void *buf, size_t len) +{ + QTestState *qtest = global_qtest; + + global_qtest = s->qtest; + qpci_memwrite(s->dev, s->mem_base + off, buf, len); + global_qtest = qtest; +} + static void cleanup_vm(IVState *s) { g_free(s->dev); @@ -169,7 +188,7 @@ static void test_ivshmem_single(void) for (i = 0; i < G_N_ELEMENTS(data); i++) { data[i] = i; } - qtest_memwrite(s->qtest, (uintptr_t)s->mem_base, data, sizeof(data)); + write_mem(s, 0, data, sizeof(data)); /* verify write */ for (i = 0; i < G_N_ELEMENTS(data); i++) { @@ -178,7 +197,7 @@ static void test_ivshmem_single(void) /* read it back and verify read */ memset(data, 0, sizeof(data)); - qtest_memread(s->qtest, (uintptr_t)s->mem_base, data, sizeof(data)); + read_mem(s, 0, data, sizeof(data)); for (i = 0; i < G_N_ELEMENTS(data); i++) { g_assert_cmpuint(data[i], ==, i); } @@ -201,29 +220,29 @@ static void test_ivshmem_pair(void) /* host write, guest 1 & 2 read */ memset(tmpshmem, 0x42, TMPSHMSIZE); - qtest_memread(s1->qtest, (uintptr_t)s1->mem_base, data, TMPSHMSIZE); + read_mem(s1, 0, data, TMPSHMSIZE); for (i = 0; i < TMPSHMSIZE; i++) { g_assert_cmpuint(data[i], ==, 0x42); } - qtest_memread(s2->qtest, (uintptr_t)s2->mem_base, data, TMPSHMSIZE); + read_mem(s2, 0, data, TMPSHMSIZE); for (i = 0; i < TMPSHMSIZE; i++) { g_assert_cmpuint(data[i], ==, 0x42); } /* guest 1 write, guest 2 read */ memset(data, 0x43, TMPSHMSIZE); - qtest_memwrite(s1->qtest, (uintptr_t)s1->mem_base, data, TMPSHMSIZE); + write_mem(s1, 0, data, TMPSHMSIZE); memset(data, 0, TMPSHMSIZE); - qtest_memread(s2->qtest, (uintptr_t)s2->mem_base, data, TMPSHMSIZE); + read_mem(s2, 0, data, TMPSHMSIZE); for (i = 0; i < TMPSHMSIZE; i++) { g_assert_cmpuint(data[i], ==, 0x43); } /* guest 2 write, guest 1 read */ memset(data, 0x44, TMPSHMSIZE); - qtest_memwrite(s2->qtest, (uintptr_t)s2->mem_base, data, TMPSHMSIZE); + write_mem(s2, 0, data, TMPSHMSIZE); memset(data, 0, TMPSHMSIZE); - qtest_memread(s1->qtest, (uintptr_t)s2->mem_base, data, TMPSHMSIZE); + read_mem(s1, 0, data, TMPSHMSIZE); for (i = 0; i < TMPSHMSIZE; i++) { g_assert_cmpuint(data[i], ==, 0x44); } From e7c8526b2a1482a9b14319fda9f8ad4bfda5b958 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Mon, 24 Oct 2016 15:50:22 +1100 Subject: [PATCH 61/73] tests: Don't assume structure of PCI IO base in ahci-test In a couple of places ahci-test makes assumptions about how the tokens returned from qpci_iomap() are formatted in ways it probably shouldn't. First in verify_state() it uses a non-NULL token to indicate that the AHCI device has been enabled (part of enabling is to iomap()). This changes it to use an explicit 'enabled' flag instead. Second, it uses the fact that the token contains a PCI address, stored when the BAR is mapped during initialization to check that the BAR has the same value after a migration. This changes it to explicitly read the BAR register before and after the migration and compare. Together, these changes will make the test more robust against changes to the internals of the libqos PCI layer. Signed-off-by: David Gibson Reviewed-by: John Snow Reviewed-by: Greg Kurz --- tests/ahci-test.c | 13 +++++++------ tests/libqos/ahci.c | 1 + tests/libqos/ahci.h | 1 + 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/ahci-test.c b/tests/ahci-test.c index 9c0adce220..70bcafa9e4 100644 --- a/tests/ahci-test.c +++ b/tests/ahci-test.c @@ -78,25 +78,23 @@ static void string_bswap16(uint16_t *s, size_t bytes) /** * Verify that the transfer did not corrupt our state at all. */ -static void verify_state(AHCIQState *ahci) +static void verify_state(AHCIQState *ahci, uint64_t hba_old) { int i, j; uint32_t ahci_fingerprint; uint64_t hba_base; - uint64_t hba_stored; AHCICommandHeader cmd; ahci_fingerprint = qpci_config_readl(ahci->dev, PCI_VENDOR_ID); g_assert_cmphex(ahci_fingerprint, ==, ahci->fingerprint); /* If we haven't initialized, this is as much as can be validated. */ - if (!ahci->hba_base) { + if (!ahci->enabled) { return; } hba_base = (uint64_t)qpci_config_readl(ahci->dev, PCI_BASE_ADDRESS_5); - hba_stored = (uint64_t)(uintptr_t)ahci->hba_base; - g_assert_cmphex(hba_base, ==, hba_stored); + g_assert_cmphex(hba_base, ==, hba_old); g_assert_cmphex(ahci_rreg(ahci, AHCI_CAP), ==, ahci->cap); g_assert_cmphex(ahci_rreg(ahci, AHCI_CAP2), ==, ahci->cap2); @@ -119,12 +117,15 @@ static void ahci_migrate(AHCIQState *from, AHCIQState *to, const char *uri) QOSState *tmp = to->parent; QPCIDevice *dev = to->dev; char *uri_local = NULL; + uint64_t hba_old; if (uri == NULL) { uri_local = g_strdup_printf("%s%s", "unix:", mig_socket); uri = uri_local; } + hba_old = (uint64_t)qpci_config_readl(from->dev, PCI_BASE_ADDRESS_5); + /* context will be 'to' after completion. */ migrate(from->parent, to->parent, uri); @@ -141,7 +142,7 @@ static void ahci_migrate(AHCIQState *from, AHCIQState *to, const char *uri) from->parent = tmp; from->dev = dev; - verify_state(to); + verify_state(to, hba_old); g_free(uri_local); } diff --git a/tests/libqos/ahci.c b/tests/libqos/ahci.c index 716ab7939e..8e789d8407 100644 --- a/tests/libqos/ahci.c +++ b/tests/libqos/ahci.c @@ -351,6 +351,7 @@ void ahci_hba_enable(AHCIQState *ahci) reg = ahci_rreg(ahci, AHCI_GHC); ASSERT_BIT_SET(reg, AHCI_GHC_IE); + ahci->enabled = true; /* TODO: The device should now be idling and waiting for commands. * In the future, a small test-case to inspect the Register D2H FIS * and clear the initial interrupts might be good. */ diff --git a/tests/libqos/ahci.h b/tests/libqos/ahci.h index c69fb5ae90..9b0c1d705b 100644 --- a/tests/libqos/ahci.h +++ b/tests/libqos/ahci.h @@ -327,6 +327,7 @@ typedef struct AHCIQState { uint32_t cap; uint32_t cap2; AHCIPortQState port[32]; + bool enabled; } AHCIQState; /** From b4ba67d9a702507793c2724e56f98e9b0f7be02b Mon Sep 17 00:00:00 2001 From: David Gibson Date: Mon, 24 Oct 2016 15:52:06 +1100 Subject: [PATCH 62/73] libqos: Change PCI accessors to take opaque BAR handle The usual use model for the libqos PCI functions is to map a specific PCI BAR using qpci_iomap() then pass the returned token into IO accessor functions. This, and the fact that iomap() returns a (void *) which actually contains a PCI space address, kind of suggests that the return value from iomap is supposed to be an opaque token. ..except that the callers expect to be able to add offsets to it. Which also assumes the compiler will support pointer arithmetic on a (void *), and treat it as working with byte offsets. To clarify this situation change iomap() and the IO accessors to take a definitely opaque BAR handle (enforced with a wrapper struct) along with an offset within the BAR. This changes both the functions and all the callers. There were a number of places that checked if iomap() returned non-NULL, and or initialized it to NULL before hand. Since iomap() already assert()s if it fails to map the BAR, these tests were mostly pointless and are removed. Signed-off-by: David Gibson Reviewed-by: Greg Kurz --- tests/e1000e-test.c | 7 +- tests/ide-test.c | 176 +++++++++++++++++++------------------- tests/ivshmem-test.c | 16 ++-- tests/libqos/ahci.c | 3 +- tests/libqos/ahci.h | 6 +- tests/libqos/pci.c | 149 +++++++++++++++----------------- tests/libqos/pci.h | 42 +++++---- tests/libqos/usb.c | 6 +- tests/libqos/usb.h | 2 +- tests/libqos/virtio-pci.c | 95 ++++++++++---------- tests/libqos/virtio-pci.h | 2 +- tests/rtl8139-test.c | 10 +-- tests/tco-test.c | 80 ++++++++--------- tests/usb-hcd-ehci-test.c | 5 +- 14 files changed, 295 insertions(+), 304 deletions(-) diff --git a/tests/e1000e-test.c b/tests/e1000e-test.c index 3979b20bb0..8c42ca919f 100644 --- a/tests/e1000e-test.c +++ b/tests/e1000e-test.c @@ -87,7 +87,7 @@ typedef struct e1000e_device { QPCIDevice *pci_dev; - void *mac_regs; + QPCIBar mac_regs; uint64_t tx_ring; uint64_t rx_ring; @@ -119,12 +119,12 @@ static QPCIDevice *e1000e_device_find(QPCIBus *bus) static void e1000e_macreg_write(e1000e_device *d, uint32_t reg, uint32_t val) { - qpci_io_writel(d->pci_dev, d->mac_regs + reg, val); + qpci_io_writel(d->pci_dev, d->mac_regs, reg, val); } static uint32_t e1000e_macreg_read(e1000e_device *d, uint32_t reg) { - return qpci_io_readl(d->pci_dev, d->mac_regs + reg); + return qpci_io_readl(d->pci_dev, d->mac_regs, reg); } static void e1000e_device_init(QPCIBus *bus, e1000e_device *d) @@ -138,7 +138,6 @@ static void e1000e_device_init(QPCIBus *bus, e1000e_device *d) /* Map BAR0 (mac registers) */ d->mac_regs = qpci_iomap(d->pci_dev, 0, NULL); - g_assert_nonnull(d->mac_regs); /* Reset the device */ val = e1000e_macreg_read(d, E1000E_CTRL); diff --git a/tests/ide-test.c b/tests/ide-test.c index 86c4373792..67c7df0c8d 100644 --- a/tests/ide-test.c +++ b/tests/ide-test.c @@ -137,7 +137,7 @@ static void ide_test_quit(void) qtest_end(); } -static QPCIDevice *get_pci_device(void **bmdma_base, void **ide_base) +static QPCIDevice *get_pci_device(QPCIBar *bmdma_bar, QPCIBar *ide_bar) { QPCIDevice *dev; uint16_t vendor_id, device_id; @@ -156,9 +156,9 @@ static QPCIDevice *get_pci_device(void **bmdma_base, void **ide_base) g_assert(device_id == PCI_DEVICE_ID_INTEL_82371SB_1); /* Map bmdma BAR */ - *bmdma_base = qpci_iomap(dev, 4, NULL); + *bmdma_bar = qpci_iomap(dev, 4, NULL); - *ide_base = qpci_legacy_iomap(dev, IDE_BASE); + *ide_bar = qpci_legacy_iomap(dev, IDE_BASE); qpci_device_enable(dev); @@ -181,19 +181,18 @@ typedef struct PrdtEntry { static int send_dma_request(int cmd, uint64_t sector, int nb_sectors, PrdtEntry *prdt, int prdt_entries, - void(*post_exec)(QPCIDevice *dev, void *ide_base, + void(*post_exec)(QPCIDevice *dev, QPCIBar ide_bar, uint64_t sector, int nb_sectors)) { QPCIDevice *dev; - void *bmdma_base; - void *ide_base; + QPCIBar bmdma_bar, ide_bar; uintptr_t guest_prdt; size_t len; bool from_dev; uint8_t status; int flags; - dev = get_pci_device(&bmdma_base, &ide_base); + dev = get_pci_device(&bmdma_bar, &ide_bar); flags = cmd & ~0xff; cmd &= 0xff; @@ -218,60 +217,60 @@ static int send_dma_request(int cmd, uint64_t sector, int nb_sectors, } /* Select device 0 */ - qpci_io_writeb(dev, ide_base + reg_device, 0 | LBA); + qpci_io_writeb(dev, ide_bar, reg_device, 0 | LBA); /* Stop any running transfer, clear any pending interrupt */ - qpci_io_writeb(dev, bmdma_base + bmreg_cmd, 0); - qpci_io_writeb(dev, bmdma_base + bmreg_status, BM_STS_INTR); + qpci_io_writeb(dev, bmdma_bar, bmreg_cmd, 0); + qpci_io_writeb(dev, bmdma_bar, bmreg_status, BM_STS_INTR); /* Setup PRDT */ len = sizeof(*prdt) * prdt_entries; guest_prdt = guest_alloc(guest_malloc, len); memwrite(guest_prdt, prdt, len); - qpci_io_writel(dev, bmdma_base + bmreg_prdt, guest_prdt); + qpci_io_writel(dev, bmdma_bar, bmreg_prdt, guest_prdt); /* ATA DMA command */ if (cmd == CMD_PACKET) { /* Enables ATAPI DMA; otherwise PIO is attempted */ - qpci_io_writeb(dev, ide_base + reg_feature, 0x01); + qpci_io_writeb(dev, ide_bar, reg_feature, 0x01); } else { - qpci_io_writeb(dev, ide_base + reg_nsectors, nb_sectors); - qpci_io_writeb(dev, ide_base + reg_lba_low, sector & 0xff); - qpci_io_writeb(dev, ide_base + reg_lba_middle, (sector >> 8) & 0xff); - qpci_io_writeb(dev, ide_base + reg_lba_high, (sector >> 16) & 0xff); + qpci_io_writeb(dev, ide_bar, reg_nsectors, nb_sectors); + qpci_io_writeb(dev, ide_bar, reg_lba_low, sector & 0xff); + qpci_io_writeb(dev, ide_bar, reg_lba_middle, (sector >> 8) & 0xff); + qpci_io_writeb(dev, ide_bar, reg_lba_high, (sector >> 16) & 0xff); } - qpci_io_writeb(dev, ide_base + reg_command, cmd); + qpci_io_writeb(dev, ide_bar, reg_command, cmd); if (post_exec) { - post_exec(dev, ide_base, sector, nb_sectors); + post_exec(dev, ide_bar, sector, nb_sectors); } /* Start DMA transfer */ - qpci_io_writeb(dev, bmdma_base + bmreg_cmd, + qpci_io_writeb(dev, bmdma_bar, bmreg_cmd, BM_CMD_START | (from_dev ? BM_CMD_WRITE : 0)); if (flags & CMDF_ABORT) { - qpci_io_writeb(dev, bmdma_base + bmreg_cmd, 0); + qpci_io_writeb(dev, bmdma_bar, bmreg_cmd, 0); } /* Wait for the DMA transfer to complete */ do { - status = qpci_io_readb(dev, bmdma_base + bmreg_status); + status = qpci_io_readb(dev, bmdma_bar, bmreg_status); } while ((status & (BM_STS_ACTIVE | BM_STS_INTR)) == BM_STS_ACTIVE); g_assert_cmpint(get_irq(IDE_PRIMARY_IRQ), ==, !!(status & BM_STS_INTR)); /* Check IDE status code */ - assert_bit_set(qpci_io_readb(dev, ide_base + reg_status), DRDY); - assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), BSY | DRQ); + assert_bit_set(qpci_io_readb(dev, ide_bar, reg_status), DRDY); + assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), BSY | DRQ); /* Reading the status register clears the IRQ */ g_assert(!get_irq(IDE_PRIMARY_IRQ)); /* Stop DMA transfer if still active */ if (status & BM_STS_ACTIVE) { - qpci_io_writeb(dev, bmdma_base + bmreg_cmd, 0); + qpci_io_writeb(dev, bmdma_bar, bmreg_cmd, 0); } free_pci_device(dev); @@ -282,7 +281,7 @@ static int send_dma_request(int cmd, uint64_t sector, int nb_sectors, static void test_bmdma_simple_rw(void) { QPCIDevice *dev; - void *bmdma_base, *ide_base; + QPCIBar bmdma_bar, ide_bar; uint8_t status; uint8_t *buf; uint8_t *cmpbuf; @@ -296,7 +295,7 @@ static void test_bmdma_simple_rw(void) }, }; - dev = get_pci_device(&bmdma_base, &ide_base); + dev = get_pci_device(&bmdma_bar, &ide_bar); buf = g_malloc(len); cmpbuf = g_malloc(len); @@ -308,7 +307,7 @@ static void test_bmdma_simple_rw(void) status = send_dma_request(CMD_WRITE_DMA, 0, 1, prdt, ARRAY_SIZE(prdt), NULL); g_assert_cmphex(status, ==, BM_STS_INTR); - assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), DF | ERR); /* Write 0xaa pattern to sector 1 */ memset(buf, 0xaa, len); @@ -317,14 +316,14 @@ static void test_bmdma_simple_rw(void) status = send_dma_request(CMD_WRITE_DMA, 1, 1, prdt, ARRAY_SIZE(prdt), NULL); g_assert_cmphex(status, ==, BM_STS_INTR); - assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), DF | ERR); /* Read and verify 0x55 pattern in sector 0 */ memset(cmpbuf, 0x55, len); status = send_dma_request(CMD_READ_DMA, 0, 1, prdt, ARRAY_SIZE(prdt), NULL); g_assert_cmphex(status, ==, BM_STS_INTR); - assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), DF | ERR); memread(guest_buf, buf, len); g_assert(memcmp(buf, cmpbuf, len) == 0); @@ -334,7 +333,7 @@ static void test_bmdma_simple_rw(void) status = send_dma_request(CMD_READ_DMA, 1, 1, prdt, ARRAY_SIZE(prdt), NULL); g_assert_cmphex(status, ==, BM_STS_INTR); - assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), DF | ERR); memread(guest_buf, buf, len); g_assert(memcmp(buf, cmpbuf, len) == 0); @@ -347,7 +346,7 @@ static void test_bmdma_simple_rw(void) static void test_bmdma_short_prdt(void) { QPCIDevice *dev; - void *bmdma_base, *ide_base; + QPCIBar bmdma_bar, ide_bar; uint8_t status; PrdtEntry prdt[] = { @@ -357,25 +356,25 @@ static void test_bmdma_short_prdt(void) }, }; - dev = get_pci_device(&bmdma_base, &ide_base); + dev = get_pci_device(&bmdma_bar, &ide_bar); /* Normal request */ status = send_dma_request(CMD_READ_DMA, 0, 1, prdt, ARRAY_SIZE(prdt), NULL); g_assert_cmphex(status, ==, 0); - assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), DF | ERR); /* Abort the request before it completes */ status = send_dma_request(CMD_READ_DMA | CMDF_ABORT, 0, 1, prdt, ARRAY_SIZE(prdt), NULL); g_assert_cmphex(status, ==, 0); - assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), DF | ERR); } static void test_bmdma_one_sector_short_prdt(void) { QPCIDevice *dev; - void *bmdma_base, *ide_base; + QPCIBar bmdma_bar, ide_bar; uint8_t status; /* Read 2 sectors but only give 1 sector in PRDT */ @@ -386,25 +385,25 @@ static void test_bmdma_one_sector_short_prdt(void) }, }; - dev = get_pci_device(&bmdma_base, &ide_base); + dev = get_pci_device(&bmdma_bar, &ide_bar); /* Normal request */ status = send_dma_request(CMD_READ_DMA, 0, 2, prdt, ARRAY_SIZE(prdt), NULL); g_assert_cmphex(status, ==, 0); - assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), DF | ERR); /* Abort the request before it completes */ status = send_dma_request(CMD_READ_DMA | CMDF_ABORT, 0, 2, prdt, ARRAY_SIZE(prdt), NULL); g_assert_cmphex(status, ==, 0); - assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), DF | ERR); } static void test_bmdma_long_prdt(void) { QPCIDevice *dev; - void *bmdma_base, *ide_base; + QPCIBar bmdma_bar, ide_bar; uint8_t status; PrdtEntry prdt[] = { @@ -414,28 +413,28 @@ static void test_bmdma_long_prdt(void) }, }; - dev = get_pci_device(&bmdma_base, &ide_base); + dev = get_pci_device(&bmdma_bar, &ide_bar); /* Normal request */ status = send_dma_request(CMD_READ_DMA, 0, 1, prdt, ARRAY_SIZE(prdt), NULL); g_assert_cmphex(status, ==, BM_STS_ACTIVE | BM_STS_INTR); - assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), DF | ERR); /* Abort the request before it completes */ status = send_dma_request(CMD_READ_DMA | CMDF_ABORT, 0, 1, prdt, ARRAY_SIZE(prdt), NULL); g_assert_cmphex(status, ==, BM_STS_INTR); - assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), DF | ERR); } static void test_bmdma_no_busmaster(void) { QPCIDevice *dev; - void *bmdma_base, *ide_base; + QPCIBar bmdma_bar, ide_bar; uint8_t status; - dev = get_pci_device(&bmdma_base, &ide_base); + dev = get_pci_device(&bmdma_bar, &ide_bar); /* No PRDT_EOT, each entry addr 0/size 64k, and in theory qemu shouldn't be * able to access it anyway because the Bus Master bit in the PCI command @@ -449,7 +448,7 @@ static void test_bmdma_no_busmaster(void) /* Not entirely clear what the expected result is, but this is what we get * in practice. At least we want to be aware of any changes. */ g_assert_cmphex(status, ==, BM_STS_ACTIVE | BM_STS_INTR); - assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), DF | ERR); } static void test_bmdma_setup(void) @@ -480,7 +479,7 @@ static void string_cpu_to_be16(uint16_t *s, size_t bytes) static void test_identify(void) { QPCIDevice *dev; - void *bmdma_base, *ide_base; + QPCIBar bmdma_bar, ide_bar; uint8_t data; uint16_t buf[256]; int i; @@ -491,25 +490,25 @@ static void test_identify(void) "-global ide-hd.ver=%s", tmp_path, "testdisk", "version"); - dev = get_pci_device(&bmdma_base, &ide_base); + dev = get_pci_device(&bmdma_bar, &ide_bar); /* IDENTIFY command on device 0*/ - qpci_io_writeb(dev, ide_base + reg_device, 0); - qpci_io_writeb(dev, ide_base + reg_command, CMD_IDENTIFY); + qpci_io_writeb(dev, ide_bar, reg_device, 0); + qpci_io_writeb(dev, ide_bar, reg_command, CMD_IDENTIFY); /* Read in the IDENTIFY buffer and check registers */ - data = qpci_io_readb(dev, ide_base + reg_device); + data = qpci_io_readb(dev, ide_bar, reg_device); g_assert_cmpint(data & DEV, ==, 0); for (i = 0; i < 256; i++) { - data = qpci_io_readb(dev, ide_base + reg_status); + data = qpci_io_readb(dev, ide_bar, reg_status); assert_bit_set(data, DRDY | DRQ); assert_bit_clear(data, BSY | DF | ERR); - buf[i] = qpci_io_readw(dev, ide_base + reg_data); + buf[i] = qpci_io_readw(dev, ide_bar, reg_data); } - data = qpci_io_readb(dev, ide_base + reg_status); + data = qpci_io_readb(dev, ide_bar, reg_status); assert_bit_set(data, DRDY); assert_bit_clear(data, BSY | DF | ERR | DRQ); @@ -535,13 +534,13 @@ static void test_identify(void) static void make_dirty(uint8_t device) { QPCIDevice *dev; - void *bmdma_base, *ide_base; + QPCIBar bmdma_bar, ide_bar; uint8_t status; size_t len = 512; uintptr_t guest_buf; void* buf; - dev = get_pci_device(&bmdma_base, &ide_base); + dev = get_pci_device(&bmdma_bar, &ide_bar); guest_buf = guest_alloc(guest_malloc, len); buf = g_malloc(len); @@ -560,7 +559,7 @@ static void make_dirty(uint8_t device) status = send_dma_request(CMD_WRITE_DMA, 1, 1, prdt, ARRAY_SIZE(prdt), NULL); g_assert_cmphex(status, ==, BM_STS_INTR); - assert_bit_clear(qpci_io_readb(dev, ide_base + reg_status), DF | ERR); + assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), DF | ERR); g_free(buf); } @@ -568,14 +567,14 @@ static void make_dirty(uint8_t device) static void test_flush(void) { QPCIDevice *dev; - void *bmdma_base, *ide_base; + QPCIBar bmdma_bar, ide_bar; uint8_t data; ide_test_start( "-drive file=blkdebug::%s,if=ide,cache=writeback,format=raw", tmp_path); - dev = get_pci_device(&bmdma_base, &ide_base); + dev = get_pci_device(&bmdma_bar, &ide_bar); qtest_irq_intercept_in(global_qtest, "ioapic"); @@ -586,11 +585,11 @@ static void test_flush(void) g_free(hmp("qemu-io ide0-hd0 \"break flush_to_os A\"")); /* FLUSH CACHE command on device 0*/ - qpci_io_writeb(dev, ide_base + reg_device, 0); - qpci_io_writeb(dev, ide_base + reg_command, CMD_FLUSH_CACHE); + qpci_io_writeb(dev, ide_bar, reg_device, 0); + qpci_io_writeb(dev, ide_bar, reg_command, CMD_FLUSH_CACHE); /* Check status while request is in flight*/ - data = qpci_io_readb(dev, ide_base + reg_status); + data = qpci_io_readb(dev, ide_bar, reg_status); assert_bit_set(data, BSY | DRDY); assert_bit_clear(data, DF | ERR | DRQ); @@ -598,11 +597,11 @@ static void test_flush(void) g_free(hmp("qemu-io ide0-hd0 \"resume A\"")); /* Check registers */ - data = qpci_io_readb(dev, ide_base + reg_device); + data = qpci_io_readb(dev, ide_bar, reg_device); g_assert_cmpint(data & DEV, ==, 0); do { - data = qpci_io_readb(dev, ide_base + reg_status); + data = qpci_io_readb(dev, ide_bar, reg_status); } while (data & BSY); assert_bit_set(data, DRDY); @@ -614,7 +613,7 @@ static void test_flush(void) static void test_retry_flush(const char *machine) { QPCIDevice *dev; - void *bmdma_base, *ide_base; + QPCIBar bmdma_bar, ide_bar; uint8_t data; const char *s; @@ -626,7 +625,7 @@ static void test_retry_flush(const char *machine) "rerror=stop,werror=stop", debug_path, tmp_path); - dev = get_pci_device(&bmdma_base, &ide_base); + dev = get_pci_device(&bmdma_bar, &ide_bar); qtest_irq_intercept_in(global_qtest, "ioapic"); @@ -634,11 +633,11 @@ static void test_retry_flush(const char *machine) make_dirty(0); /* FLUSH CACHE command on device 0*/ - qpci_io_writeb(dev, ide_base + reg_device, 0); - qpci_io_writeb(dev, ide_base + reg_command, CMD_FLUSH_CACHE); + qpci_io_writeb(dev, ide_bar, reg_device, 0); + qpci_io_writeb(dev, ide_bar, reg_command, CMD_FLUSH_CACHE); /* Check status while request is in flight*/ - data = qpci_io_readb(dev, ide_base + reg_status); + data = qpci_io_readb(dev, ide_bar, reg_status); assert_bit_set(data, BSY | DRDY); assert_bit_clear(data, DF | ERR | DRQ); @@ -649,11 +648,11 @@ static void test_retry_flush(const char *machine) qmp_discard_response(s); /* Check registers */ - data = qpci_io_readb(dev, ide_base + reg_device); + data = qpci_io_readb(dev, ide_bar, reg_device); g_assert_cmpint(data & DEV, ==, 0); do { - data = qpci_io_readb(dev, ide_base + reg_status); + data = qpci_io_readb(dev, ide_bar, reg_status); } while (data & BSY); assert_bit_set(data, DRDY); @@ -665,15 +664,15 @@ static void test_retry_flush(const char *machine) static void test_flush_nodev(void) { QPCIDevice *dev; - void *bmdma_base, *ide_base; + QPCIBar bmdma_bar, ide_bar; ide_test_start(""); - dev = get_pci_device(&bmdma_base, &ide_base); + dev = get_pci_device(&bmdma_bar, &ide_bar); /* FLUSH CACHE command on device 0*/ - qpci_io_writeb(dev, ide_base + reg_device, 0); - qpci_io_writeb(dev, ide_base + reg_command, CMD_FLUSH_CACHE); + qpci_io_writeb(dev, ide_bar, reg_device, 0); + qpci_io_writeb(dev, ide_bar, reg_command, CMD_FLUSH_CACHE); /* Just testing that qemu doesn't crash... */ @@ -700,7 +699,7 @@ typedef struct Read10CDB { uint16_t padding; } __attribute__((__packed__)) Read10CDB; -static void send_scsi_cdb_read10(QPCIDevice *dev, void *ide_base, +static void send_scsi_cdb_read10(QPCIDevice *dev, QPCIBar ide_bar, uint64_t lba, int nblocks) { Read10CDB pkt = { .padding = 0 }; @@ -717,7 +716,7 @@ static void send_scsi_cdb_read10(QPCIDevice *dev, void *ide_base, /* Send Packet */ for (i = 0; i < sizeof(Read10CDB)/2; i++) { - qpci_io_writew(dev, ide_base + reg_data, + qpci_io_writew(dev, ide_bar, reg_data, le16_to_cpu(((uint16_t *)&pkt)[i])); } } @@ -732,16 +731,16 @@ static void nsleep(int64_t nsecs) static uint8_t ide_wait_clear(uint8_t flag) { QPCIDevice *dev; - void *bmdma_base, *ide_base; + QPCIBar bmdma_bar, ide_bar; uint8_t data; time_t st; - dev = get_pci_device(&bmdma_base, &ide_base); + dev = get_pci_device(&bmdma_bar, &ide_bar); /* Wait with a 5 second timeout */ time(&st); while (true) { - data = qpci_io_readb(dev, ide_base + reg_status); + data = qpci_io_readb(dev, ide_bar, reg_status); if (!(data & flag)) { return data; } @@ -776,7 +775,7 @@ static void ide_wait_intr(int irq) static void cdrom_pio_impl(int nblocks) { QPCIDevice *dev; - void *bmdma_base, *ide_base; + QPCIBar bmdma_bar, ide_bar; FILE *fh; int patt_blocks = MAX(16, nblocks); size_t patt_len = ATAPI_BLOCK_SIZE * patt_blocks; @@ -795,15 +794,14 @@ static void cdrom_pio_impl(int nblocks) ide_test_start("-drive if=none,file=%s,media=cdrom,format=raw,id=sr0,index=0 " "-device ide-cd,drive=sr0,bus=ide.0", tmp_path); - dev = get_pci_device(&bmdma_base, &ide_base); + dev = get_pci_device(&bmdma_bar, &ide_bar); qtest_irq_intercept_in(global_qtest, "ioapic"); /* PACKET command on device 0 */ - qpci_io_writeb(dev, ide_base + reg_device, 0); - qpci_io_writeb(dev, ide_base + reg_lba_middle, BYTE_COUNT_LIMIT & 0xFF); - qpci_io_writeb(dev, ide_base + reg_lba_high, - (BYTE_COUNT_LIMIT >> 8 & 0xFF)); - qpci_io_writeb(dev, ide_base + reg_command, CMD_PACKET); + qpci_io_writeb(dev, ide_bar, reg_device, 0); + qpci_io_writeb(dev, ide_bar, reg_lba_middle, BYTE_COUNT_LIMIT & 0xFF); + qpci_io_writeb(dev, ide_bar, reg_lba_high, (BYTE_COUNT_LIMIT >> 8 & 0xFF)); + qpci_io_writeb(dev, ide_bar, reg_command, CMD_PACKET); /* HP0: Check_Status_A State */ nsleep(400); data = ide_wait_clear(BSY); @@ -812,7 +810,7 @@ static void cdrom_pio_impl(int nblocks) assert_bit_clear(data, ERR | DF | BSY); /* SCSI CDB (READ10) -- read n*2048 bytes from block 0 */ - send_scsi_cdb_read10(dev, ide_base, 0, nblocks); + send_scsi_cdb_read10(dev, ide_bar, 0, nblocks); /* Read data back: occurs in bursts of 'BYTE_COUNT_LIMIT' bytes. * If BYTE_COUNT_LIMIT is odd, we transfer BYTE_COUNT_LIMIT - 1 bytes. @@ -836,8 +834,8 @@ static void cdrom_pio_impl(int nblocks) /* HP4: Transfer_Data */ for (j = 0; j < MIN((limit / 2), rem); j++) { - rx[offset + j] = cpu_to_le16(qpci_io_readw(dev, - ide_base + reg_data)); + rx[offset + j] = cpu_to_le16(qpci_io_readw(dev, ide_bar, + reg_data)); } } diff --git a/tests/ivshmem-test.c b/tests/ivshmem-test.c index fbd8258c7b..04a5c5dc7d 100644 --- a/tests/ivshmem-test.c +++ b/tests/ivshmem-test.c @@ -41,7 +41,7 @@ static QPCIDevice *get_device(QPCIBus *pcibus) typedef struct _IVState { QTestState *qtest; - void *reg_base, *mem_base; + QPCIBar reg_bar, mem_bar; QPCIBus *pcibus; QPCIDevice *dev; } IVState; @@ -75,7 +75,7 @@ static inline unsigned in_reg(IVState *s, enum Reg reg) unsigned res; global_qtest = s->qtest; - res = qpci_io_readl(s->dev, s->reg_base + reg); + res = qpci_io_readl(s->dev, s->reg_bar, reg); g_test_message("*%s -> %x\n", name, res); global_qtest = qtest; @@ -89,7 +89,7 @@ static inline void out_reg(IVState *s, enum Reg reg, unsigned v) global_qtest = s->qtest; g_test_message("%x -> *%s\n", v, name); - qpci_io_writel(s->dev, s->reg_base + reg, v); + qpci_io_writel(s->dev, s->reg_bar, reg, v); global_qtest = qtest; } @@ -98,7 +98,7 @@ static inline void read_mem(IVState *s, uint64_t off, void *buf, size_t len) QTestState *qtest = global_qtest; global_qtest = s->qtest; - qpci_memread(s->dev, s->mem_base + off, buf, len); + qpci_memread(s->dev, s->mem_bar, off, buf, len); global_qtest = qtest; } @@ -108,7 +108,7 @@ static inline void write_mem(IVState *s, uint64_t off, QTestState *qtest = global_qtest; global_qtest = s->qtest; - qpci_memwrite(s->dev, s->mem_base + off, buf, len); + qpci_memwrite(s->dev, s->mem_bar, off, buf, len); global_qtest = qtest; } @@ -127,16 +127,14 @@ static void setup_vm_cmd(IVState *s, const char *cmd, bool msix) s->pcibus = qpci_init_pc(NULL); s->dev = get_device(s->pcibus); - s->reg_base = qpci_iomap(s->dev, 0, &barsize); - g_assert_nonnull(s->reg_base); + s->reg_bar = qpci_iomap(s->dev, 0, &barsize); g_assert_cmpuint(barsize, ==, 256); if (msix) { qpci_msix_enable(s->dev); } - s->mem_base = qpci_iomap(s->dev, 2, &barsize); - g_assert_nonnull(s->mem_base); + s->mem_bar = qpci_iomap(s->dev, 2, &barsize); g_assert_cmpuint(barsize, ==, TMPSHMSIZE); qpci_device_enable(s->dev); diff --git a/tests/libqos/ahci.c b/tests/libqos/ahci.c index 8e789d8407..5180d65279 100644 --- a/tests/libqos/ahci.c +++ b/tests/libqos/ahci.c @@ -210,8 +210,7 @@ void ahci_pci_enable(AHCIQState *ahci) void start_ahci_device(AHCIQState *ahci) { /* Map AHCI's ABAR (BAR5) */ - ahci->hba_base = qpci_iomap(ahci->dev, 5, &ahci->barsize); - g_assert(ahci->hba_base); + ahci->hba_bar = qpci_iomap(ahci->dev, 5, &ahci->barsize); /* turns on pci.cmd.iose, pci.cmd.mse and pci.cmd.bme */ qpci_device_enable(ahci->dev); diff --git a/tests/libqos/ahci.h b/tests/libqos/ahci.h index 9b0c1d705b..caaafe3fdf 100644 --- a/tests/libqos/ahci.h +++ b/tests/libqos/ahci.h @@ -321,7 +321,7 @@ typedef struct AHCIPortQState { typedef struct AHCIQState { QOSState *parent; QPCIDevice *dev; - void *hba_base; + QPCIBar hba_bar; uint64_t barsize; uint32_t fingerprint; uint32_t cap; @@ -489,12 +489,12 @@ typedef struct AHCIOpts { static inline uint32_t ahci_mread(AHCIQState *ahci, size_t offset) { - return qpci_io_readl(ahci->dev, ahci->hba_base + offset); + return qpci_io_readl(ahci->dev, ahci->hba_bar, offset); } static inline void ahci_mwrite(AHCIQState *ahci, size_t offset, uint32_t value) { - qpci_io_writel(ahci->dev, ahci->hba_base + offset, value); + qpci_io_writel(ahci->dev, ahci->hba_bar, offset, value); } static inline uint32_t ahci_rreg(AHCIQState *ahci, uint32_t reg_num) diff --git a/tests/libqos/pci.c b/tests/libqos/pci.c index 3021651ee4..2dcdeade2a 100644 --- a/tests/libqos/pci.c +++ b/tests/libqos/pci.c @@ -104,7 +104,6 @@ void qpci_msix_enable(QPCIDevice *dev) uint32_t table; uint8_t bir_table; uint8_t bir_pba; - void *offset; addr = qpci_find_capability(dev, PCI_CAP_ID_MSIX); g_assert_cmphex(addr, !=, 0); @@ -114,18 +113,16 @@ void qpci_msix_enable(QPCIDevice *dev) table = qpci_config_readl(dev, addr + PCI_MSIX_TABLE); bir_table = table & PCI_MSIX_FLAGS_BIRMASK; - offset = qpci_iomap(dev, bir_table, NULL); - dev->msix_table = offset + (table & ~PCI_MSIX_FLAGS_BIRMASK); + dev->msix_table_bar = qpci_iomap(dev, bir_table, NULL); + dev->msix_table_off = table & ~PCI_MSIX_FLAGS_BIRMASK; table = qpci_config_readl(dev, addr + PCI_MSIX_PBA); bir_pba = table & PCI_MSIX_FLAGS_BIRMASK; if (bir_pba != bir_table) { - offset = qpci_iomap(dev, bir_pba, NULL); + dev->msix_pba_bar = qpci_iomap(dev, bir_pba, NULL); } - dev->msix_pba = offset + (table & ~PCI_MSIX_FLAGS_BIRMASK); + dev->msix_pba_off = table & ~PCI_MSIX_FLAGS_BIRMASK; - g_assert(dev->msix_table != NULL); - g_assert(dev->msix_pba != NULL); dev->msix_enabled = true; } @@ -141,22 +138,23 @@ void qpci_msix_disable(QPCIDevice *dev) qpci_config_writew(dev, addr + PCI_MSIX_FLAGS, val & ~PCI_MSIX_FLAGS_ENABLE); - qpci_iounmap(dev, dev->msix_table); - qpci_iounmap(dev, dev->msix_pba); + qpci_iounmap(dev, dev->msix_table_bar); + qpci_iounmap(dev, dev->msix_pba_bar); dev->msix_enabled = 0; - dev->msix_table = NULL; - dev->msix_pba = NULL; + dev->msix_table_off = 0; + dev->msix_pba_off = 0; } bool qpci_msix_pending(QPCIDevice *dev, uint16_t entry) { uint32_t pba_entry; uint8_t bit_n = entry % 32; - void *addr = dev->msix_pba + (entry / 32) * PCI_MSIX_ENTRY_SIZE / 4; + uint64_t off = (entry / 32) * PCI_MSIX_ENTRY_SIZE / 4; g_assert(dev->msix_enabled); - pba_entry = qpci_io_readl(dev, addr); - qpci_io_writel(dev, addr, pba_entry & ~(1 << bit_n)); + pba_entry = qpci_io_readl(dev, dev->msix_pba_bar, dev->msix_pba_off + off); + qpci_io_writel(dev, dev->msix_pba_bar, dev->msix_pba_off + off, + pba_entry & ~(1 << bit_n)); return (pba_entry & (1 << bit_n)) != 0; } @@ -164,7 +162,7 @@ bool qpci_msix_masked(QPCIDevice *dev, uint16_t entry) { uint8_t addr; uint16_t val; - void *vector_addr = dev->msix_table + (entry * PCI_MSIX_ENTRY_SIZE); + uint64_t vector_off = dev->msix_table_off + entry * PCI_MSIX_ENTRY_SIZE; g_assert(dev->msix_enabled); addr = qpci_find_capability(dev, PCI_CAP_ID_MSIX); @@ -174,8 +172,9 @@ bool qpci_msix_masked(QPCIDevice *dev, uint16_t entry) if (val & PCI_MSIX_FLAGS_MASKALL) { return true; } else { - return (qpci_io_readl(dev, vector_addr + PCI_MSIX_ENTRY_VECTOR_CTRL) - & PCI_MSIX_ENTRY_CTRL_MASKBIT) != 0; + return (qpci_io_readl(dev, dev->msix_table_bar, + vector_off + PCI_MSIX_ENTRY_VECTOR_CTRL) + & PCI_MSIX_ENTRY_CTRL_MASKBIT) != 0; } } @@ -222,129 +221,115 @@ void qpci_config_writel(QPCIDevice *dev, uint8_t offset, uint32_t value) dev->bus->config_writel(dev->bus, dev->devfn, offset, value); } - -uint8_t qpci_io_readb(QPCIDevice *dev, void *data) +uint8_t qpci_io_readb(QPCIDevice *dev, QPCIBar token, uint64_t off) { - uintptr_t addr = (uintptr_t)data; - - if (addr < QPCI_PIO_LIMIT) { - return dev->bus->pio_readb(dev->bus, addr); + if (token.addr < QPCI_PIO_LIMIT) { + return dev->bus->pio_readb(dev->bus, token.addr + off); } else { uint8_t val; - dev->bus->memread(dev->bus, addr, &val, sizeof(val)); + dev->bus->memread(dev->bus, token.addr + off, &val, sizeof(val)); return val; } } -uint16_t qpci_io_readw(QPCIDevice *dev, void *data) +uint16_t qpci_io_readw(QPCIDevice *dev, QPCIBar token, uint64_t off) { - uintptr_t addr = (uintptr_t)data; - - if (addr < QPCI_PIO_LIMIT) { - return dev->bus->pio_readw(dev->bus, addr); + if (token.addr < QPCI_PIO_LIMIT) { + return dev->bus->pio_readw(dev->bus, token.addr + off); } else { uint16_t val; - dev->bus->memread(dev->bus, addr, &val, sizeof(val)); + dev->bus->memread(dev->bus, token.addr + off, &val, sizeof(val)); return le16_to_cpu(val); } } -uint32_t qpci_io_readl(QPCIDevice *dev, void *data) +uint32_t qpci_io_readl(QPCIDevice *dev, QPCIBar token, uint64_t off) { - uintptr_t addr = (uintptr_t)data; - - if (addr < QPCI_PIO_LIMIT) { - return dev->bus->pio_readl(dev->bus, addr); + if (token.addr < QPCI_PIO_LIMIT) { + return dev->bus->pio_readl(dev->bus, token.addr + off); } else { uint32_t val; - dev->bus->memread(dev->bus, addr, &val, sizeof(val)); + dev->bus->memread(dev->bus, token.addr + off, &val, sizeof(val)); return le32_to_cpu(val); } } -uint64_t qpci_io_readq(QPCIDevice *dev, void *data) +uint64_t qpci_io_readq(QPCIDevice *dev, QPCIBar token, uint64_t off) { - uintptr_t addr = (uintptr_t)data; - - if (addr < QPCI_PIO_LIMIT) { - return dev->bus->pio_readq(dev->bus, addr); + if (token.addr < QPCI_PIO_LIMIT) { + return dev->bus->pio_readq(dev->bus, token.addr + off); } else { uint64_t val; - dev->bus->memread(dev->bus, addr, &val, sizeof(val)); + dev->bus->memread(dev->bus, token.addr + off, &val, sizeof(val)); return le64_to_cpu(val); } } -void qpci_io_writeb(QPCIDevice *dev, void *data, uint8_t value) +void qpci_io_writeb(QPCIDevice *dev, QPCIBar token, uint64_t off, + uint8_t value) { - uintptr_t addr = (uintptr_t)data; - - if (addr < QPCI_PIO_LIMIT) { - dev->bus->pio_writeb(dev->bus, addr, value); + if (token.addr < QPCI_PIO_LIMIT) { + dev->bus->pio_writeb(dev->bus, token.addr + off, value); } else { - dev->bus->memwrite(dev->bus, addr, &value, sizeof(value)); + dev->bus->memwrite(dev->bus, token.addr + off, &value, sizeof(value)); } } -void qpci_io_writew(QPCIDevice *dev, void *data, uint16_t value) +void qpci_io_writew(QPCIDevice *dev, QPCIBar token, uint64_t off, + uint16_t value) { - uintptr_t addr = (uintptr_t)data; - - if (addr < QPCI_PIO_LIMIT) { - dev->bus->pio_writew(dev->bus, addr, value); + if (token.addr < QPCI_PIO_LIMIT) { + dev->bus->pio_writew(dev->bus, token.addr + off, value); } else { value = cpu_to_le16(value); - dev->bus->memwrite(dev->bus, addr, &value, sizeof(value)); + dev->bus->memwrite(dev->bus, token.addr + off, &value, sizeof(value)); } } -void qpci_io_writel(QPCIDevice *dev, void *data, uint32_t value) +void qpci_io_writel(QPCIDevice *dev, QPCIBar token, uint64_t off, + uint32_t value) { - uintptr_t addr = (uintptr_t)data; - - if (addr < QPCI_PIO_LIMIT) { - dev->bus->pio_writel(dev->bus, addr, value); + if (token.addr < QPCI_PIO_LIMIT) { + dev->bus->pio_writel(dev->bus, token.addr + off, value); } else { value = cpu_to_le32(value); - dev->bus->memwrite(dev->bus, addr, &value, sizeof(value)); + dev->bus->memwrite(dev->bus, token.addr + off, &value, sizeof(value)); } } -void qpci_io_writeq(QPCIDevice *dev, void *data, uint64_t value) +void qpci_io_writeq(QPCIDevice *dev, QPCIBar token, uint64_t off, + uint64_t value) { - uintptr_t addr = (uintptr_t)data; - - if (addr < QPCI_PIO_LIMIT) { - dev->bus->pio_writeq(dev->bus, addr, value); + if (token.addr < QPCI_PIO_LIMIT) { + dev->bus->pio_writeq(dev->bus, token.addr + off, value); } else { value = cpu_to_le64(value); - dev->bus->memwrite(dev->bus, addr, &value, sizeof(value)); + dev->bus->memwrite(dev->bus, token.addr + off, &value, sizeof(value)); } } -void qpci_memread(QPCIDevice *dev, void *data, void *buf, size_t len) +void qpci_memread(QPCIDevice *dev, QPCIBar token, uint64_t off, + void *buf, size_t len) { - uintptr_t addr = (uintptr_t)data; - - g_assert(addr >= QPCI_PIO_LIMIT); - dev->bus->memread(dev->bus, addr, buf, len); + g_assert(token.addr >= QPCI_PIO_LIMIT); + dev->bus->memread(dev->bus, token.addr + off, buf, len); } -void qpci_memwrite(QPCIDevice *dev, void *data, const void *buf, size_t len) +void qpci_memwrite(QPCIDevice *dev, QPCIBar token, uint64_t off, + const void *buf, size_t len) { - uintptr_t addr = (uintptr_t)data; - - g_assert(addr >= QPCI_PIO_LIMIT); - dev->bus->memwrite(dev->bus, addr, buf, len); + g_assert(token.addr >= QPCI_PIO_LIMIT); + dev->bus->memwrite(dev->bus, token.addr + off, buf, len); } -void *qpci_iomap(QPCIDevice *dev, int barno, uint64_t *sizeptr) +QPCIBar qpci_iomap(QPCIDevice *dev, int barno, uint64_t *sizeptr) { QPCIBus *bus = dev->bus; static const int bar_reg_map[] = { PCI_BASE_ADDRESS_0, PCI_BASE_ADDRESS_1, PCI_BASE_ADDRESS_2, PCI_BASE_ADDRESS_3, PCI_BASE_ADDRESS_4, PCI_BASE_ADDRESS_5, }; + QPCIBar bar; int bar_reg; uint32_t addr, size; uint32_t io_type; @@ -391,17 +376,19 @@ void *qpci_iomap(QPCIDevice *dev, int barno, uint64_t *sizeptr) qpci_config_writel(dev, bar_reg, loc); } - return (void *)(uintptr_t)loc; + bar.addr = loc; + return bar; } -void qpci_iounmap(QPCIDevice *dev, void *data) +void qpci_iounmap(QPCIDevice *dev, QPCIBar bar) { /* FIXME */ } -void *qpci_legacy_iomap(QPCIDevice *dev, uint16_t addr) +QPCIBar qpci_legacy_iomap(QPCIDevice *dev, uint16_t addr) { - return (void *)(uintptr_t)addr; + QPCIBar bar = { .addr = addr }; + return bar; } void qpci_plug_device_test(const char *driver, const char *id, diff --git a/tests/libqos/pci.h b/tests/libqos/pci.h index 531e3f79e9..ed480614ff 100644 --- a/tests/libqos/pci.h +++ b/tests/libqos/pci.h @@ -21,6 +21,7 @@ typedef struct QPCIDevice QPCIDevice; typedef struct QPCIBus QPCIBus; +typedef struct QPCIBar QPCIBar; struct QPCIBus { uint8_t (*pio_readb)(QPCIBus *bus, uint32_t addr); @@ -51,13 +52,17 @@ struct QPCIBus { uint64_t mmio_alloc_ptr, mmio_limit; }; +struct QPCIBar { + uint64_t addr; +}; + struct QPCIDevice { QPCIBus *bus; int devfn; bool msix_enabled; - void *msix_table; - void *msix_pba; + QPCIBar msix_table_bar, msix_pba_bar; + uint64_t msix_table_off, msix_pba_off; }; void qpci_device_foreach(QPCIBus *bus, int vendor_id, int device_id, @@ -81,22 +86,27 @@ void qpci_config_writeb(QPCIDevice *dev, uint8_t offset, uint8_t value); void qpci_config_writew(QPCIDevice *dev, uint8_t offset, uint16_t value); void qpci_config_writel(QPCIDevice *dev, uint8_t offset, uint32_t value); -uint8_t qpci_io_readb(QPCIDevice *dev, void *data); -uint16_t qpci_io_readw(QPCIDevice *dev, void *data); -uint32_t qpci_io_readl(QPCIDevice *dev, void *data); -uint64_t qpci_io_readq(QPCIDevice *dev, void *data); +uint8_t qpci_io_readb(QPCIDevice *dev, QPCIBar token, uint64_t off); +uint16_t qpci_io_readw(QPCIDevice *dev, QPCIBar token, uint64_t off); +uint32_t qpci_io_readl(QPCIDevice *dev, QPCIBar token, uint64_t off); +uint64_t qpci_io_readq(QPCIDevice *dev, QPCIBar token, uint64_t off); -void qpci_io_writeb(QPCIDevice *dev, void *data, uint8_t value); -void qpci_io_writew(QPCIDevice *dev, void *data, uint16_t value); -void qpci_io_writel(QPCIDevice *dev, void *data, uint32_t value); -void qpci_io_writeq(QPCIDevice *dev, void *data, uint64_t value); +void qpci_io_writeb(QPCIDevice *dev, QPCIBar token, uint64_t off, + uint8_t value); +void qpci_io_writew(QPCIDevice *dev, QPCIBar token, uint64_t off, + uint16_t value); +void qpci_io_writel(QPCIDevice *dev, QPCIBar token, uint64_t off, + uint32_t value); +void qpci_io_writeq(QPCIDevice *dev, QPCIBar token, uint64_t off, + uint64_t value); -void qpci_memread(QPCIDevice *bus, void *data, void *buf, size_t len); -void qpci_memwrite(QPCIDevice *bus, void *data, const void *buf, size_t len); - -void *qpci_iomap(QPCIDevice *dev, int barno, uint64_t *sizeptr); -void qpci_iounmap(QPCIDevice *dev, void *data); -void *qpci_legacy_iomap(QPCIDevice *dev, uint16_t addr); +void qpci_memread(QPCIDevice *bus, QPCIBar token, uint64_t off, + void *buf, size_t len); +void qpci_memwrite(QPCIDevice *bus, QPCIBar token, uint64_t off, + const void *buf, size_t len); +QPCIBar qpci_iomap(QPCIDevice *dev, int barno, uint64_t *sizeptr); +void qpci_iounmap(QPCIDevice *dev, QPCIBar addr); +QPCIBar qpci_legacy_iomap(QPCIDevice *dev, uint16_t addr); void qpci_plug_device_test(const char *driver, const char *id, uint8_t slot, const char *opts); diff --git a/tests/libqos/usb.c b/tests/libqos/usb.c index f794d92da5..72d7a961fe 100644 --- a/tests/libqos/usb.c +++ b/tests/libqos/usb.c @@ -21,14 +21,12 @@ void qusb_pci_init_one(QPCIBus *pcibus, struct qhc *hc, uint32_t devfn, int bar) hc->dev = qpci_device_find(pcibus, devfn); g_assert(hc->dev != NULL); qpci_device_enable(hc->dev); - hc->base = qpci_iomap(hc->dev, bar, NULL); - g_assert(hc->base != NULL); + hc->bar = qpci_iomap(hc->dev, bar, NULL); } void uhci_port_test(struct qhc *hc, int port, uint16_t expect) { - void *addr = hc->base + 0x10 + 2 * port; - uint16_t value = qpci_io_readw(hc->dev, addr); + uint16_t value = qpci_io_readw(hc->dev, hc->bar, 0x10 + 2 * port); uint16_t mask = ~(UHCI_PORT_WRITE_CLEAR | UHCI_PORT_RSVD1); g_assert((value & mask) == (expect & mask)); diff --git a/tests/libqos/usb.h b/tests/libqos/usb.h index 8fe56872b7..423dcfd82f 100644 --- a/tests/libqos/usb.h +++ b/tests/libqos/usb.h @@ -5,7 +5,7 @@ struct qhc { QPCIDevice *dev; - void *base; + QPCIBar bar; }; void qusb_pci_init_one(QPCIBus *pcibus, struct qhc *hc, diff --git a/tests/libqos/virtio-pci.c b/tests/libqos/virtio-pci.c index c69d09ddb2..d4bf841f23 100644 --- a/tests/libqos/virtio-pci.c +++ b/tests/libqos/virtio-pci.c @@ -62,13 +62,12 @@ static void qvirtio_pci_assign_device(QVirtioDevice *d, void *data) *vpcidev = (QVirtioPCIDevice *)d; } -#define CONFIG_BASE(dev) \ - ((dev)->addr + VIRTIO_PCI_CONFIG_OFF((dev)->pdev->msix_enabled)) +#define CONFIG_BASE(dev) (VIRTIO_PCI_CONFIG_OFF((dev)->pdev->msix_enabled)) static uint8_t qvirtio_pci_config_readb(QVirtioDevice *d, uint64_t off) { QVirtioPCIDevice *dev = (QVirtioPCIDevice *)d; - return qpci_io_readb(dev->pdev, CONFIG_BASE(dev) + off); + return qpci_io_readb(dev->pdev, dev->bar, CONFIG_BASE(dev) + off); } /* PCI is always read in little-endian order @@ -84,7 +83,7 @@ static uint16_t qvirtio_pci_config_readw(QVirtioDevice *d, uint64_t off) QVirtioPCIDevice *dev = (QVirtioPCIDevice *)d; uint16_t value; - value = qpci_io_readw(dev->pdev, CONFIG_BASE(dev) + off); + value = qpci_io_readw(dev->pdev, dev->bar, CONFIG_BASE(dev) + off); if (qvirtio_is_big_endian(d)) { value = bswap16(value); } @@ -96,7 +95,7 @@ static uint32_t qvirtio_pci_config_readl(QVirtioDevice *d, uint64_t off) QVirtioPCIDevice *dev = (QVirtioPCIDevice *)d; uint32_t value; - value = qpci_io_readl(dev->pdev, CONFIG_BASE(dev) + off); + value = qpci_io_readl(dev->pdev, dev->bar, CONFIG_BASE(dev) + off); if (qvirtio_is_big_endian(d)) { value = bswap32(value); } @@ -108,7 +107,7 @@ static uint64_t qvirtio_pci_config_readq(QVirtioDevice *d, uint64_t off) QVirtioPCIDevice *dev = (QVirtioPCIDevice *)d; uint64_t val; - val = qpci_io_readq(dev->pdev, CONFIG_BASE(dev) + off); + val = qpci_io_readq(dev->pdev, dev->bar, CONFIG_BASE(dev) + off); if (qvirtio_is_big_endian(d)) { val = bswap64(val); } @@ -119,31 +118,31 @@ static uint64_t qvirtio_pci_config_readq(QVirtioDevice *d, uint64_t off) static uint32_t qvirtio_pci_get_features(QVirtioDevice *d) { QVirtioPCIDevice *dev = (QVirtioPCIDevice *)d; - return qpci_io_readl(dev->pdev, dev->addr + VIRTIO_PCI_HOST_FEATURES); + return qpci_io_readl(dev->pdev, dev->bar, VIRTIO_PCI_HOST_FEATURES); } static void qvirtio_pci_set_features(QVirtioDevice *d, uint32_t features) { QVirtioPCIDevice *dev = (QVirtioPCIDevice *)d; - qpci_io_writel(dev->pdev, dev->addr + VIRTIO_PCI_GUEST_FEATURES, features); + qpci_io_writel(dev->pdev, dev->bar, VIRTIO_PCI_GUEST_FEATURES, features); } static uint32_t qvirtio_pci_get_guest_features(QVirtioDevice *d) { QVirtioPCIDevice *dev = (QVirtioPCIDevice *)d; - return qpci_io_readl(dev->pdev, dev->addr + VIRTIO_PCI_GUEST_FEATURES); + return qpci_io_readl(dev->pdev, dev->bar, VIRTIO_PCI_GUEST_FEATURES); } static uint8_t qvirtio_pci_get_status(QVirtioDevice *d) { QVirtioPCIDevice *dev = (QVirtioPCIDevice *)d; - return qpci_io_readb(dev->pdev, dev->addr + VIRTIO_PCI_STATUS); + return qpci_io_readb(dev->pdev, dev->bar, VIRTIO_PCI_STATUS); } static void qvirtio_pci_set_status(QVirtioDevice *d, uint8_t status) { QVirtioPCIDevice *dev = (QVirtioPCIDevice *)d; - qpci_io_writeb(dev->pdev, dev->addr + VIRTIO_PCI_STATUS, status); + qpci_io_writeb(dev->pdev, dev->bar, VIRTIO_PCI_STATUS, status); } static bool qvirtio_pci_get_queue_isr_status(QVirtioDevice *d, QVirtQueue *vq) @@ -167,7 +166,7 @@ static bool qvirtio_pci_get_queue_isr_status(QVirtioDevice *d, QVirtQueue *vq) } } } else { - return qpci_io_readb(dev->pdev, dev->addr + VIRTIO_PCI_ISR) & 1; + return qpci_io_readb(dev->pdev, dev->bar, VIRTIO_PCI_ISR) & 1; } } @@ -191,26 +190,26 @@ static bool qvirtio_pci_get_config_isr_status(QVirtioDevice *d) } } } else { - return qpci_io_readb(dev->pdev, dev->addr + VIRTIO_PCI_ISR) & 2; + return qpci_io_readb(dev->pdev, dev->bar, VIRTIO_PCI_ISR) & 2; } } static void qvirtio_pci_queue_select(QVirtioDevice *d, uint16_t index) { QVirtioPCIDevice *dev = (QVirtioPCIDevice *)d; - qpci_io_writeb(dev->pdev, dev->addr + VIRTIO_PCI_QUEUE_SEL, index); + qpci_io_writeb(dev->pdev, dev->bar, VIRTIO_PCI_QUEUE_SEL, index); } static uint16_t qvirtio_pci_get_queue_size(QVirtioDevice *d) { QVirtioPCIDevice *dev = (QVirtioPCIDevice *)d; - return qpci_io_readw(dev->pdev, dev->addr + VIRTIO_PCI_QUEUE_NUM); + return qpci_io_readw(dev->pdev, dev->bar, VIRTIO_PCI_QUEUE_NUM); } static void qvirtio_pci_set_queue_address(QVirtioDevice *d, uint32_t pfn) { QVirtioPCIDevice *dev = (QVirtioPCIDevice *)d; - qpci_io_writel(dev->pdev, dev->addr + VIRTIO_PCI_QUEUE_PFN, pfn); + qpci_io_writel(dev->pdev, dev->bar, VIRTIO_PCI_QUEUE_PFN, pfn); } static QVirtQueue *qvirtio_pci_virtqueue_setup(QVirtioDevice *d, @@ -262,7 +261,7 @@ static void qvirtio_pci_virtqueue_cleanup(QVirtQueue *vq, static void qvirtio_pci_virtqueue_kick(QVirtioDevice *d, QVirtQueue *vq) { QVirtioPCIDevice *dev = (QVirtioPCIDevice *)d; - qpci_io_writew(dev->pdev, dev->addr + VIRTIO_PCI_QUEUE_NOTIFY, vq->index); + qpci_io_writew(dev->pdev, dev->bar, VIRTIO_PCI_QUEUE_NOTIFY, vq->index); } const QVirtioBus qvirtio_pci = { @@ -309,14 +308,12 @@ QVirtioPCIDevice *qvirtio_pci_device_find(QPCIBus *bus, uint16_t device_type) void qvirtio_pci_device_enable(QVirtioPCIDevice *d) { qpci_device_enable(d->pdev); - d->addr = qpci_iomap(d->pdev, 0, NULL); - g_assert(d->addr != NULL); + d->bar = qpci_iomap(d->pdev, 0, NULL); } void qvirtio_pci_device_disable(QVirtioPCIDevice *d) { - qpci_iounmap(d->pdev, d->addr); - d->addr = NULL; + qpci_iounmap(d->pdev, d->bar); } void qvirtqueue_pci_msix_setup(QVirtioPCIDevice *d, QVirtQueuePCI *vqpci, @@ -324,29 +321,33 @@ void qvirtqueue_pci_msix_setup(QVirtioPCIDevice *d, QVirtQueuePCI *vqpci, { uint16_t vector; uint32_t control; - void *addr; + uint64_t off; g_assert(d->pdev->msix_enabled); - addr = d->pdev->msix_table + (entry * 16); + off = d->pdev->msix_table_off + (entry * 16); g_assert_cmpint(entry, >=, 0); g_assert_cmpint(entry, <, qpci_msix_table_size(d->pdev)); vqpci->msix_entry = entry; vqpci->msix_addr = guest_alloc(alloc, 4); - qpci_io_writel(d->pdev, addr + PCI_MSIX_ENTRY_LOWER_ADDR, - vqpci->msix_addr & ~0UL); - qpci_io_writel(d->pdev, addr + PCI_MSIX_ENTRY_UPPER_ADDR, - (vqpci->msix_addr >> 32) & ~0UL); - qpci_io_writel(d->pdev, addr + PCI_MSIX_ENTRY_DATA, vqpci->msix_data); + qpci_io_writel(d->pdev, d->pdev->msix_table_bar, + off + PCI_MSIX_ENTRY_LOWER_ADDR, vqpci->msix_addr & ~0UL); + qpci_io_writel(d->pdev, d->pdev->msix_table_bar, + off + PCI_MSIX_ENTRY_UPPER_ADDR, + (vqpci->msix_addr >> 32) & ~0UL); + qpci_io_writel(d->pdev, d->pdev->msix_table_bar, + off + PCI_MSIX_ENTRY_DATA, vqpci->msix_data); - control = qpci_io_readl(d->pdev, addr + PCI_MSIX_ENTRY_VECTOR_CTRL); - qpci_io_writel(d->pdev, addr + PCI_MSIX_ENTRY_VECTOR_CTRL, - control & ~PCI_MSIX_ENTRY_CTRL_MASKBIT); + control = qpci_io_readl(d->pdev, d->pdev->msix_table_bar, + off + PCI_MSIX_ENTRY_VECTOR_CTRL); + qpci_io_writel(d->pdev, d->pdev->msix_table_bar, + off + PCI_MSIX_ENTRY_VECTOR_CTRL, + control & ~PCI_MSIX_ENTRY_CTRL_MASKBIT); qvirtio_pci_queue_select(&d->vdev, vqpci->vq.index); - qpci_io_writew(d->pdev, d->addr + VIRTIO_MSI_QUEUE_VECTOR, entry); - vector = qpci_io_readw(d->pdev, d->addr + VIRTIO_MSI_QUEUE_VECTOR); + qpci_io_writew(d->pdev, d->bar, VIRTIO_MSI_QUEUE_VECTOR, entry); + vector = qpci_io_readw(d->pdev, d->bar, VIRTIO_MSI_QUEUE_VECTOR); g_assert_cmphex(vector, !=, VIRTIO_MSI_NO_VECTOR); } @@ -355,10 +356,10 @@ void qvirtio_pci_set_msix_configuration_vector(QVirtioPCIDevice *d, { uint16_t vector; uint32_t control; - void *addr; + uint64_t off; g_assert(d->pdev->msix_enabled); - addr = d->pdev->msix_table + (entry * 16); + off = d->pdev->msix_table_off + (entry * 16); g_assert_cmpint(entry, >=, 0); g_assert_cmpint(entry, <, qpci_msix_table_size(d->pdev)); @@ -367,17 +368,21 @@ void qvirtio_pci_set_msix_configuration_vector(QVirtioPCIDevice *d, d->config_msix_data = 0x12345678; d->config_msix_addr = guest_alloc(alloc, 4); - qpci_io_writel(d->pdev, addr + PCI_MSIX_ENTRY_LOWER_ADDR, - d->config_msix_addr & ~0UL); - qpci_io_writel(d->pdev, addr + PCI_MSIX_ENTRY_UPPER_ADDR, - (d->config_msix_addr >> 32) & ~0UL); - qpci_io_writel(d->pdev, addr + PCI_MSIX_ENTRY_DATA, d->config_msix_data); + qpci_io_writel(d->pdev, d->pdev->msix_table_bar, + off + PCI_MSIX_ENTRY_LOWER_ADDR, d->config_msix_addr & ~0UL); + qpci_io_writel(d->pdev, d->pdev->msix_table_bar, + off + PCI_MSIX_ENTRY_UPPER_ADDR, + (d->config_msix_addr >> 32) & ~0UL); + qpci_io_writel(d->pdev, d->pdev->msix_table_bar, + off + PCI_MSIX_ENTRY_DATA, d->config_msix_data); - control = qpci_io_readl(d->pdev, addr + PCI_MSIX_ENTRY_VECTOR_CTRL); - qpci_io_writel(d->pdev, addr + PCI_MSIX_ENTRY_VECTOR_CTRL, - control & ~PCI_MSIX_ENTRY_CTRL_MASKBIT); + control = qpci_io_readl(d->pdev, d->pdev->msix_table_bar, + off + PCI_MSIX_ENTRY_VECTOR_CTRL); + qpci_io_writel(d->pdev, d->pdev->msix_table_bar, + off + PCI_MSIX_ENTRY_VECTOR_CTRL, + control & ~PCI_MSIX_ENTRY_CTRL_MASKBIT); - qpci_io_writew(d->pdev, d->addr + VIRTIO_MSI_CONFIG_VECTOR, entry); - vector = qpci_io_readw(d->pdev, d->addr + VIRTIO_MSI_CONFIG_VECTOR); + qpci_io_writew(d->pdev, d->bar, VIRTIO_MSI_CONFIG_VECTOR, entry); + vector = qpci_io_readw(d->pdev, d->bar, VIRTIO_MSI_CONFIG_VECTOR); g_assert_cmphex(vector, !=, VIRTIO_MSI_NO_VECTOR); } diff --git a/tests/libqos/virtio-pci.h b/tests/libqos/virtio-pci.h index efcac2d3de..38c54c63ea 100644 --- a/tests/libqos/virtio-pci.h +++ b/tests/libqos/virtio-pci.h @@ -16,7 +16,7 @@ typedef struct QVirtioPCIDevice { QVirtioDevice vdev; QPCIDevice *pdev; - void *addr; + QPCIBar bar; uint16_t config_msix_entry; uint64_t config_msix_addr; uint32_t config_msix_data; diff --git a/tests/rtl8139-test.c b/tests/rtl8139-test.c index c2f601a380..7de7dc45ae 100644 --- a/tests/rtl8139-test.c +++ b/tests/rtl8139-test.c @@ -22,7 +22,7 @@ static void nop(void) static QPCIBus *pcibus; static QPCIDevice *dev; -static void *dev_base; +static QPCIBar dev_bar; static void save_fn(QPCIDevice *dev, int devfn, void *data) { @@ -45,14 +45,14 @@ static QPCIDevice *get_device(void) #define PORT(name, len, val) \ static unsigned __attribute__((unused)) in_##name(void) \ { \ - unsigned res = qpci_io_read##len(dev, dev_base+(val)); \ + unsigned res = qpci_io_read##len(dev, dev_bar, (val)); \ g_test_message("*%s -> %x\n", #name, res); \ return res; \ } \ static void out_##name(unsigned v) \ { \ g_test_message("%x -> *%s\n", v, #name); \ - qpci_io_write##len(dev, dev_base+(val), v); \ + qpci_io_write##len(dev, dev_bar, (val), v); \ } PORT(Timer, l, 0x48) @@ -186,9 +186,7 @@ static void test_init(void) dev = get_device(); - dev_base = qpci_iomap(dev, 0, &barsize); - - g_assert(dev_base != NULL); + dev_bar = qpci_iomap(dev, 0, &barsize); qpci_device_enable(dev); diff --git a/tests/tco-test.c b/tests/tco-test.c index 129577d1c0..ef02ec5903 100644 --- a/tests/tco-test.c +++ b/tests/tco-test.c @@ -41,7 +41,7 @@ typedef struct { const char *args; bool noreboot; QPCIDevice *dev; - void *tco_io_base; + QPCIBar tco_io_bar; } TestData; static void test_init(TestData *d) @@ -70,42 +70,42 @@ static void test_init(TestData *d) /* set Root Complex BAR */ qpci_config_writel(d->dev, ICH9_LPC_RCBA, RCBA_BASE_ADDR | 0x1); - d->tco_io_base = qpci_legacy_iomap(d->dev, PM_IO_BASE_ADDR + 0x60); + d->tco_io_bar = qpci_legacy_iomap(d->dev, PM_IO_BASE_ADDR + 0x60); } static void stop_tco(const TestData *d) { uint32_t val; - val = qpci_io_readw(d->dev, d->tco_io_base + TCO1_CNT); + val = qpci_io_readw(d->dev, d->tco_io_bar, TCO1_CNT); val |= TCO_TMR_HLT; - qpci_io_writew(d->dev, d->tco_io_base + TCO1_CNT, val); + qpci_io_writew(d->dev, d->tco_io_bar, TCO1_CNT, val); } static void start_tco(const TestData *d) { uint32_t val; - val = qpci_io_readw(d->dev, d->tco_io_base + TCO1_CNT); + val = qpci_io_readw(d->dev, d->tco_io_bar, TCO1_CNT); val &= ~TCO_TMR_HLT; - qpci_io_writew(d->dev, d->tco_io_base + TCO1_CNT, val); + qpci_io_writew(d->dev, d->tco_io_bar, TCO1_CNT, val); } static void load_tco(const TestData *d) { - qpci_io_writew(d->dev, d->tco_io_base + TCO_RLD, 4); + qpci_io_writew(d->dev, d->tco_io_bar, TCO_RLD, 4); } static void set_tco_timeout(const TestData *d, uint16_t ticks) { - qpci_io_writew(d->dev, d->tco_io_base + TCO_TMR, ticks); + qpci_io_writew(d->dev, d->tco_io_bar, TCO_TMR, ticks); } static void clear_tco_status(const TestData *d) { - qpci_io_writew(d->dev, d->tco_io_base + TCO1_STS, 0x0008); - qpci_io_writew(d->dev, d->tco_io_base + TCO2_STS, 0x0002); - qpci_io_writew(d->dev, d->tco_io_base + TCO2_STS, 0x0004); + qpci_io_writew(d->dev, d->tco_io_bar, TCO1_STS, 0x0008); + qpci_io_writew(d->dev, d->tco_io_bar, TCO2_STS, 0x0002); + qpci_io_writew(d->dev, d->tco_io_bar, TCO2_STS, 0x0004); } static void reset_on_second_timeout(bool enable) @@ -128,25 +128,25 @@ static void test_tco_defaults(void) d.args = NULL; d.noreboot = true; test_init(&d); - g_assert_cmpint(qpci_io_readw(d.dev, d.tco_io_base + TCO_RLD), ==, + g_assert_cmpint(qpci_io_readw(d.dev, d.tco_io_bar, TCO_RLD), ==, TCO_RLD_DEFAULT); /* TCO_DAT_IN & TCO_DAT_OUT */ - g_assert_cmpint(qpci_io_readw(d.dev, d.tco_io_base + TCO_DAT_IN), ==, + g_assert_cmpint(qpci_io_readw(d.dev, d.tco_io_bar, TCO_DAT_IN), ==, (TCO_DAT_OUT_DEFAULT << 8) | TCO_DAT_IN_DEFAULT); /* TCO1_STS & TCO2_STS */ - g_assert_cmpint(qpci_io_readl(d.dev, d.tco_io_base + TCO1_STS), ==, + g_assert_cmpint(qpci_io_readl(d.dev, d.tco_io_bar, TCO1_STS), ==, (TCO2_STS_DEFAULT << 16) | TCO1_STS_DEFAULT); /* TCO1_CNT & TCO2_CNT */ - g_assert_cmpint(qpci_io_readl(d.dev, d.tco_io_base + TCO1_CNT), ==, + g_assert_cmpint(qpci_io_readl(d.dev, d.tco_io_bar, TCO1_CNT), ==, (TCO2_CNT_DEFAULT << 16) | TCO1_CNT_DEFAULT); /* TCO_MESSAGE1 & TCO_MESSAGE2 */ - g_assert_cmpint(qpci_io_readw(d.dev, d.tco_io_base + TCO_MESSAGE1), ==, + g_assert_cmpint(qpci_io_readw(d.dev, d.tco_io_bar, TCO_MESSAGE1), ==, (TCO_MESSAGE2_DEFAULT << 8) | TCO_MESSAGE1_DEFAULT); - g_assert_cmpint(qpci_io_readb(d.dev, d.tco_io_base + TCO_WDCNT), ==, + g_assert_cmpint(qpci_io_readb(d.dev, d.tco_io_bar, TCO_WDCNT), ==, TCO_WDCNT_DEFAULT); - g_assert_cmpint(qpci_io_readb(d.dev, d.tco_io_base + SW_IRQ_GEN), ==, + g_assert_cmpint(qpci_io_readb(d.dev, d.tco_io_bar, SW_IRQ_GEN), ==, SW_IRQ_GEN_DEFAULT); - g_assert_cmpint(qpci_io_readw(d.dev, d.tco_io_base + TCO_TMR), ==, + g_assert_cmpint(qpci_io_readw(d.dev, d.tco_io_bar, TCO_TMR), ==, TCO_TMR_DEFAULT); qtest_end(); } @@ -171,23 +171,23 @@ static void test_tco_timeout(void) clock_step(ticks * TCO_TICK_NSEC); /* test first timeout */ - val = qpci_io_readw(d.dev, d.tco_io_base + TCO1_STS); + val = qpci_io_readw(d.dev, d.tco_io_bar, TCO1_STS); ret = val & TCO_TIMEOUT ? 1 : 0; g_assert(ret == 1); /* test clearing timeout bit */ val |= TCO_TIMEOUT; - qpci_io_writew(d.dev, d.tco_io_base + TCO1_STS, val); - val = qpci_io_readw(d.dev, d.tco_io_base + TCO1_STS); + qpci_io_writew(d.dev, d.tco_io_bar, TCO1_STS, val); + val = qpci_io_readw(d.dev, d.tco_io_bar, TCO1_STS); ret = val & TCO_TIMEOUT ? 1 : 0; g_assert(ret == 0); /* test second timeout */ clock_step(ticks * TCO_TICK_NSEC); - val = qpci_io_readw(d.dev, d.tco_io_base + TCO1_STS); + val = qpci_io_readw(d.dev, d.tco_io_bar, TCO1_STS); ret = val & TCO_TIMEOUT ? 1 : 0; g_assert(ret == 1); - val = qpci_io_readw(d.dev, d.tco_io_base + TCO2_STS); + val = qpci_io_readw(d.dev, d.tco_io_bar, TCO2_STS); ret = val & TCO_SECOND_TO_STS ? 1 : 0; g_assert(ret == 1); @@ -214,13 +214,13 @@ static void test_tco_max_timeout(void) start_tco(&d); clock_step(((ticks & TCO_TMR_MASK) - 1) * TCO_TICK_NSEC); - val = qpci_io_readw(d.dev, d.tco_io_base + TCO_RLD); + val = qpci_io_readw(d.dev, d.tco_io_bar, TCO_RLD); g_assert_cmpint(val & TCO_RLD_MASK, ==, 1); - val = qpci_io_readw(d.dev, d.tco_io_base + TCO1_STS); + val = qpci_io_readw(d.dev, d.tco_io_bar, TCO1_STS); ret = val & TCO_TIMEOUT ? 1 : 0; g_assert(ret == 0); clock_step(TCO_TICK_NSEC); - val = qpci_io_readw(d.dev, d.tco_io_base + TCO1_STS); + val = qpci_io_readw(d.dev, d.tco_io_bar, TCO1_STS); ret = val & TCO_TIMEOUT ? 1 : 0; g_assert(ret == 1); @@ -358,11 +358,11 @@ static void test_tco_ticks_counter(void) start_tco(&d); do { - rld = qpci_io_readw(d.dev, d.tco_io_base + TCO_RLD) & TCO_RLD_MASK; + rld = qpci_io_readw(d.dev, d.tco_io_bar, TCO_RLD) & TCO_RLD_MASK; g_assert_cmpint(rld, ==, ticks); clock_step(TCO_TICK_NSEC); ticks--; - } while (!(qpci_io_readw(d.dev, d.tco_io_base + TCO1_STS) & TCO_TIMEOUT)); + } while (!(qpci_io_readw(d.dev, d.tco_io_bar, TCO1_STS) & TCO_TIMEOUT)); stop_tco(&d); qtest_end(); @@ -378,10 +378,10 @@ static void test_tco1_control_bits(void) test_init(&d); val = TCO_LOCK; - qpci_io_writew(d.dev, d.tco_io_base + TCO1_CNT, val); + qpci_io_writew(d.dev, d.tco_io_bar, TCO1_CNT, val); val &= ~TCO_LOCK; - qpci_io_writew(d.dev, d.tco_io_base + TCO1_CNT, val); - g_assert_cmpint(qpci_io_readw(d.dev, d.tco_io_base + TCO1_CNT), ==, + qpci_io_writew(d.dev, d.tco_io_bar, TCO1_CNT, val); + g_assert_cmpint(qpci_io_readw(d.dev, d.tco_io_bar, TCO1_CNT), ==, TCO_LOCK); qtest_end(); } @@ -405,13 +405,13 @@ static void test_tco1_status_bits(void) start_tco(&d); clock_step(ticks * TCO_TICK_NSEC); - qpci_io_writeb(d.dev, d.tco_io_base + TCO_DAT_IN, 0); - qpci_io_writeb(d.dev, d.tco_io_base + TCO_DAT_OUT, 0); - val = qpci_io_readw(d.dev, d.tco_io_base + TCO1_STS); + qpci_io_writeb(d.dev, d.tco_io_bar, TCO_DAT_IN, 0); + qpci_io_writeb(d.dev, d.tco_io_bar, TCO_DAT_OUT, 0); + val = qpci_io_readw(d.dev, d.tco_io_bar, TCO1_STS); ret = val & (TCO_TIMEOUT | SW_TCO_SMI | TCO_INT_STS) ? 1 : 0; g_assert(ret == 1); - qpci_io_writew(d.dev, d.tco_io_base + TCO1_STS, val); - g_assert_cmpint(qpci_io_readw(d.dev, d.tco_io_base + TCO1_STS), ==, 0); + qpci_io_writew(d.dev, d.tco_io_bar, TCO1_STS, val); + g_assert_cmpint(qpci_io_readw(d.dev, d.tco_io_bar, TCO1_STS), ==, 0); qtest_end(); } @@ -434,11 +434,11 @@ static void test_tco2_status_bits(void) start_tco(&d); clock_step(ticks * TCO_TICK_NSEC * 2); - val = qpci_io_readw(d.dev, d.tco_io_base + TCO2_STS); + val = qpci_io_readw(d.dev, d.tco_io_bar, TCO2_STS); ret = val & (TCO_SECOND_TO_STS | TCO_BOOT_STS) ? 1 : 0; g_assert(ret == 1); - qpci_io_writew(d.dev, d.tco_io_base + TCO2_STS, val); - g_assert_cmpint(qpci_io_readw(d.dev, d.tco_io_base + TCO2_STS), ==, 0); + qpci_io_writew(d.dev, d.tco_io_bar, TCO2_STS, val); + g_assert_cmpint(qpci_io_readw(d.dev, d.tco_io_bar, TCO2_STS), ==, 0); qtest_end(); } diff --git a/tests/usb-hcd-ehci-test.c b/tests/usb-hcd-ehci-test.c index a4ceeaaa43..57af8a034e 100644 --- a/tests/usb-hcd-ehci-test.c +++ b/tests/usb-hcd-ehci-test.c @@ -38,8 +38,7 @@ static void uhci_port_update(struct qhc *hc, int port, static void ehci_port_test(struct qhc *hc, int port, uint32_t expect) { - void *addr = hc->base + 0x64 + 4 * port; - uint32_t value = qpci_io_readl(hc->dev, addr); + uint32_t value = qpci_io_readl(hc->dev, hc->bar, 0x64 + 4 * port); uint16_t mask = ~(PORTSC_CSC | PORTSC_PEDC | PORTSC_OCC); #if 0 @@ -91,7 +90,7 @@ static void pci_ehci_port_1(void) static void pci_ehci_config(void) { /* hands over all ports from companion uhci to ehci */ - qpci_io_writew(ehci1.dev, ehci1.base + 0x60, 1); + qpci_io_writew(ehci1.dev, ehci1.bar, 0x60, 1); } static void pci_uhci_port_2(void) From 61f20b9dc5b78c603354a4ec170079479dcb6657 Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Wed, 26 Oct 2016 09:35:40 +0200 Subject: [PATCH 63/73] spapr_nvram: Pre-initialize the NVRAM to support the -prom-env parameter In case we do not load the NVRAM contents from a file and the user specified the "-prom-env" parameter, use the new CHRP NVRAM helper functions to pre-initialize the NVRAM partitions, so that the SLOF firmware now can pick up the environment variables from the -prom-env parameter, too. Signed-off-by: Thomas Huth Signed-off-by: David Gibson --- hw/nvram/spapr_nvram.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/hw/nvram/spapr_nvram.c b/hw/nvram/spapr_nvram.c index 4de5f705d8..eb42ea323f 100644 --- a/hw/nvram/spapr_nvram.c +++ b/hw/nvram/spapr_nvram.c @@ -31,6 +31,7 @@ #include "sysemu/block-backend.h" #include "sysemu/device_tree.h" #include "hw/sysbus.h" +#include "hw/nvram/chrp_nvram.h" #include "hw/ppc/spapr.h" #include "hw/ppc/spapr_vio.h" @@ -162,6 +163,11 @@ static void spapr_nvram_realize(VIOsPAPRDevice *dev, Error **errp) error_setg(errp, "can't read spapr-nvram contents"); return; } + } else if (nb_prom_envs > 0) { + /* Create a system partition to pass the -prom-env variables */ + chrp_nvram_create_system_partition(nvram->buf, MIN_NVRAM_SIZE / 4); + chrp_nvram_create_free_partition(&nvram->buf[MIN_NVRAM_SIZE / 4], + nvram->size - MIN_NVRAM_SIZE / 4); } spapr_rtas_register(RTAS_NVRAM_FETCH, "nvram-fetch", rtas_nvram_fetch); From 53687348813196551874409fecb49c94d20b1ae6 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Fri, 28 Oct 2016 11:17:31 +1100 Subject: [PATCH 64/73] tests: Add pseries machine to the prom-env-test, too Now that we also support the "-prom-env" parameter for the pseries machine, we can enable this test for this machine, too. Since booting with TCG is rather slow with the pseries machine, we also enable the "-nodefaults" parameter for this test now, so that SLOF does not have to check that much devices during boot and thus runs a little bit faster. Signed-off-by: Thomas Huth [dwg: Don't add -nodefaults to the command line, it causes extra warnings for the sparc testcases] Signed-off-by: David Gibson --- tests/prom-env-test.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/tests/prom-env-test.c b/tests/prom-env-test.c index 7a628574c3..0ba6f48607 100644 --- a/tests/prom-env-test.c +++ b/tests/prom-env-test.c @@ -9,11 +9,12 @@ * This work is licensed under the terms of the GNU GPL, version 2 * or later. See the COPYING file in the top-level directory. * - * This test is used to check that some OpenBIOS machines can be started - * successfully in TCG mode. To do this, we first put some Forth code into - * the "boot-command" Open Firmware environment variable. This Forth code - * writes a well-known magic value to a known location in memory. Then we - * start the guest so that OpenBIOS can boot and finally run the Forth code. + * This test is used to check that some Open Firmware based machines (i.e. + * OpenBIOS or SLOF) can be started successfully in TCG mode. To do this, we + * first put some Forth code into the "boot-command" Open Firmware environment + * variable. This Forth code writes a well-known magic value to a known location + * in memory. Then we start the guest so that the firmware can boot and finally + * run the Forth code. * The testing code here then can finally check whether the value has been * successfully written into the guest memory. */ @@ -71,13 +72,16 @@ int main(int argc, char *argv[]) { const char *sparc_machines[] = { "SPARCbook", "Voyager", "SS-20", NULL }; const char *sparc64_machines[] = { "sun4u", "sun4v", NULL }; - const char *mac_machines[] = { "mac99", "g3beige", NULL }; + const char *ppc_machines[] = { "mac99", "g3beige", NULL }; + const char *ppc64_machines[] = { "mac99", "g3beige", "pseries", NULL }; const char *arch = qtest_get_arch(); g_test_init(&argc, &argv, NULL); - if (!strcmp(arch, "ppc") || !strcmp(arch, "ppc64")) { - add_tests(mac_machines); + if (!strcmp(arch, "ppc")) { + add_tests(ppc_machines); + } else if (!strcmp(arch, "ppc64")) { + add_tests(ppc64_machines); } else if (!strcmp(arch, "sparc")) { add_tests(sparc_machines); } else if (!strcmp(arch, "sparc64")) { From 6d1ff9a7b396b3193eaea1983b3d7283a743e60a Mon Sep 17 00:00:00 2001 From: Sandipan Das Date: Wed, 26 Oct 2016 11:56:24 +0530 Subject: [PATCH 65/73] target-ppc: add xscmp[eq,gt,ge,ne]dp instructions xscmpeqdp: VSX Scalar Compare Equal Double-Precision xscmpgedp: VSX Scalar Compare Greater Than or Equal Double-Precision xscmpgtdp: VSX Scalar Compare Greater Than Double-Precision xscmpnedp: VSX Scalar Compare Not Equal Double-Precision Signed-off-by: Sandipan Das Signed-off-by: Nikunj A Dadhania Signed-off-by: David Gibson --- target-ppc/fpu_helper.c | 52 +++++++++++++++++++++++++++++ target-ppc/helper.h | 4 +++ target-ppc/translate/vsx-impl.inc.c | 4 +++ target-ppc/translate/vsx-ops.inc.c | 4 +++ 4 files changed, 64 insertions(+) diff --git a/target-ppc/fpu_helper.c b/target-ppc/fpu_helper.c index b0760f041d..4906372ae4 100644 --- a/target-ppc/fpu_helper.c +++ b/target-ppc/fpu_helper.c @@ -2362,6 +2362,58 @@ VSX_MADD(xvnmaddmsp, 4, float32, VsrW(i), NMADD_FLGS, 0, 0, 0) VSX_MADD(xvnmsubasp, 4, float32, VsrW(i), NMSUB_FLGS, 1, 0, 0) VSX_MADD(xvnmsubmsp, 4, float32, VsrW(i), NMSUB_FLGS, 0, 0, 0) +/* VSX_SCALAR_CMP_DP - VSX scalar floating point compare double precision + * op - instruction mnemonic + * cmp - comparison operation + * exp - expected result of comparison + * svxvc - set VXVC bit + */ +#define VSX_SCALAR_CMP_DP(op, cmp, exp, svxvc) \ +void helper_##op(CPUPPCState *env, uint32_t opcode) \ +{ \ + ppc_vsr_t xt, xa, xb; \ + bool vxsnan_flag = false, vxvc_flag = false, vex_flag = false; \ + \ + getVSR(xA(opcode), &xa, env); \ + getVSR(xB(opcode), &xb, env); \ + getVSR(xT(opcode), &xt, env); \ + \ + if (float64_is_signaling_nan(xa.VsrD(0), &env->fp_status) || \ + float64_is_signaling_nan(xb.VsrD(0), &env->fp_status)) { \ + vxsnan_flag = true; \ + if (fpscr_ve == 0 && svxvc) { \ + vxvc_flag = true; \ + } \ + } else if (svxvc) { \ + vxvc_flag = float64_is_quiet_nan(xa.VsrD(0), &env->fp_status) || \ + float64_is_quiet_nan(xb.VsrD(0), &env->fp_status); \ + } \ + if (vxsnan_flag) { \ + float_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 0); \ + } \ + if (vxvc_flag) { \ + float_invalid_op_excp(env, POWERPC_EXCP_FP_VXVC, 0); \ + } \ + vex_flag = fpscr_ve && (vxvc_flag || vxsnan_flag); \ + \ + if (!vex_flag) { \ + if (float64_##cmp(xb.VsrD(0), xa.VsrD(0), &env->fp_status) == exp) { \ + xt.VsrD(0) = -1; \ + xt.VsrD(1) = 0; \ + } else { \ + xt.VsrD(0) = 0; \ + xt.VsrD(1) = 0; \ + } \ + } \ + putVSR(xT(opcode), &xt, env); \ + helper_float_check_status(env); \ +} + +VSX_SCALAR_CMP_DP(xscmpeqdp, eq, 1, 0) +VSX_SCALAR_CMP_DP(xscmpgedp, le, 1, 1) +VSX_SCALAR_CMP_DP(xscmpgtdp, lt, 1, 1) +VSX_SCALAR_CMP_DP(xscmpnedp, eq, 0, 0) + #define VSX_SCALAR_CMP(op, ordered) \ void helper_##op(CPUPPCState *env, uint32_t opcode) \ { \ diff --git a/target-ppc/helper.h b/target-ppc/helper.h index 5fcc546078..0337292440 100644 --- a/target-ppc/helper.h +++ b/target-ppc/helper.h @@ -389,6 +389,10 @@ DEF_HELPER_2(xsnmaddadp, void, env, i32) DEF_HELPER_2(xsnmaddmdp, void, env, i32) DEF_HELPER_2(xsnmsubadp, void, env, i32) DEF_HELPER_2(xsnmsubmdp, void, env, i32) +DEF_HELPER_2(xscmpeqdp, void, env, i32) +DEF_HELPER_2(xscmpgtdp, void, env, i32) +DEF_HELPER_2(xscmpgedp, void, env, i32) +DEF_HELPER_2(xscmpnedp, void, env, i32) DEF_HELPER_2(xscmpodp, void, env, i32) DEF_HELPER_2(xscmpudp, void, env, i32) DEF_HELPER_2(xsmaxdp, void, env, i32) diff --git a/target-ppc/translate/vsx-impl.inc.c b/target-ppc/translate/vsx-impl.inc.c index 1508bd13e3..bf167d0488 100644 --- a/target-ppc/translate/vsx-impl.inc.c +++ b/target-ppc/translate/vsx-impl.inc.c @@ -620,6 +620,10 @@ GEN_VSX_HELPER_2(xsnmaddadp, 0x04, 0x14, 0, PPC2_VSX) GEN_VSX_HELPER_2(xsnmaddmdp, 0x04, 0x15, 0, PPC2_VSX) GEN_VSX_HELPER_2(xsnmsubadp, 0x04, 0x16, 0, PPC2_VSX) GEN_VSX_HELPER_2(xsnmsubmdp, 0x04, 0x17, 0, PPC2_VSX) +GEN_VSX_HELPER_2(xscmpeqdp, 0x0C, 0x00, 0, PPC2_ISA300) +GEN_VSX_HELPER_2(xscmpgtdp, 0x0C, 0x01, 0, PPC2_ISA300) +GEN_VSX_HELPER_2(xscmpgedp, 0x0C, 0x02, 0, PPC2_ISA300) +GEN_VSX_HELPER_2(xscmpnedp, 0x0C, 0x03, 0, PPC2_ISA300) GEN_VSX_HELPER_2(xscmpodp, 0x0C, 0x05, 0, PPC2_VSX) GEN_VSX_HELPER_2(xscmpudp, 0x0C, 0x04, 0, PPC2_VSX) GEN_VSX_HELPER_2(xsmaxdp, 0x00, 0x14, 0, PPC2_VSX) diff --git a/target-ppc/translate/vsx-ops.inc.c b/target-ppc/translate/vsx-ops.inc.c index af0d27e012..202c557fd8 100644 --- a/target-ppc/translate/vsx-ops.inc.c +++ b/target-ppc/translate/vsx-ops.inc.c @@ -114,6 +114,10 @@ GEN_XX3FORM(xsnmaddadp, 0x04, 0x14, PPC2_VSX), GEN_XX3FORM(xsnmaddmdp, 0x04, 0x15, PPC2_VSX), GEN_XX3FORM(xsnmsubadp, 0x04, 0x16, PPC2_VSX), GEN_XX3FORM(xsnmsubmdp, 0x04, 0x17, PPC2_VSX), +GEN_XX3FORM(xscmpeqdp, 0x0C, 0x00, PPC2_ISA300), +GEN_XX3FORM(xscmpgtdp, 0x0C, 0x01, PPC2_ISA300), +GEN_XX3FORM(xscmpgedp, 0x0C, 0x02, PPC2_ISA300), +GEN_XX3FORM(xscmpnedp, 0x0C, 0x03, PPC2_ISA300), GEN_XX2IFORM(xscmpodp, 0x0C, 0x05, PPC2_VSX), GEN_XX2IFORM(xscmpudp, 0x0C, 0x04, PPC2_VSX), GEN_XX3FORM(xsmaxdp, 0x00, 0x14, PPC2_VSX), From 6db246f93a7e308ff1d5aecf89d5772e83cafe61 Mon Sep 17 00:00:00 2001 From: Swapnil Bokade Date: Wed, 26 Oct 2016 11:56:29 +0530 Subject: [PATCH 66/73] target-ppc: Add xvcmpnesp, xvcmpnedp instructions xvcmpnedp[.]: VSX Vector Compare Not Equal Double-Precision xvcmpnesp[.]: VSX Vector Compare Not Equal Single-Precision Signed-off-by: Swapnil Bokade Signed-off-by: Nikunj A Dadhania Signed-off-by: David Gibson --- target-ppc/fpu_helper.c | 19 +++++++++++-------- target-ppc/helper.h | 2 ++ target-ppc/translate/vsx-impl.inc.c | 2 ++ target-ppc/translate/vsx-ops.inc.c | 2 ++ 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/target-ppc/fpu_helper.c b/target-ppc/fpu_helper.c index 4906372ae4..8a389e19af 100644 --- a/target-ppc/fpu_helper.c +++ b/target-ppc/fpu_helper.c @@ -2497,8 +2497,9 @@ VSX_MAX_MIN(xvminsp, minnum, 4, float32, VsrW(i)) * fld - vsr_t field (VsrD(*) or VsrW(*)) * cmp - comparison operation * svxvc - set VXVC bit + * exp - expected result of comparison */ -#define VSX_CMP(op, nels, tp, fld, cmp, svxvc) \ +#define VSX_CMP(op, nels, tp, fld, cmp, svxvc, exp) \ void helper_##op(CPUPPCState *env, uint32_t opcode) \ { \ ppc_vsr_t xt, xa, xb; \ @@ -2523,7 +2524,7 @@ void helper_##op(CPUPPCState *env, uint32_t opcode) \ xt.fld = 0; \ all_true = 0; \ } else { \ - if (tp##_##cmp(xb.fld, xa.fld, &env->fp_status) == 1) { \ + if (tp##_##cmp(xb.fld, xa.fld, &env->fp_status) == exp) { \ xt.fld = -1; \ all_false = 0; \ } else { \ @@ -2540,12 +2541,14 @@ void helper_##op(CPUPPCState *env, uint32_t opcode) \ float_check_status(env); \ } -VSX_CMP(xvcmpeqdp, 2, float64, VsrD(i), eq, 0) -VSX_CMP(xvcmpgedp, 2, float64, VsrD(i), le, 1) -VSX_CMP(xvcmpgtdp, 2, float64, VsrD(i), lt, 1) -VSX_CMP(xvcmpeqsp, 4, float32, VsrW(i), eq, 0) -VSX_CMP(xvcmpgesp, 4, float32, VsrW(i), le, 1) -VSX_CMP(xvcmpgtsp, 4, float32, VsrW(i), lt, 1) +VSX_CMP(xvcmpeqdp, 2, float64, VsrD(i), eq, 0, 1) +VSX_CMP(xvcmpgedp, 2, float64, VsrD(i), le, 1, 1) +VSX_CMP(xvcmpgtdp, 2, float64, VsrD(i), lt, 1, 1) +VSX_CMP(xvcmpnedp, 2, float64, VsrD(i), eq, 0, 0) +VSX_CMP(xvcmpeqsp, 4, float32, VsrW(i), eq, 0, 1) +VSX_CMP(xvcmpgesp, 4, float32, VsrW(i), le, 1, 1) +VSX_CMP(xvcmpgtsp, 4, float32, VsrW(i), lt, 1, 1) +VSX_CMP(xvcmpnesp, 4, float32, VsrW(i), eq, 0, 0) /* VSX_CVT_FP_TO_FP - VSX floating point/floating point conversion * op - instruction mnemonic diff --git a/target-ppc/helper.h b/target-ppc/helper.h index 0337292440..3916b2eddc 100644 --- a/target-ppc/helper.h +++ b/target-ppc/helper.h @@ -454,6 +454,7 @@ DEF_HELPER_2(xvmindp, void, env, i32) DEF_HELPER_2(xvcmpeqdp, void, env, i32) DEF_HELPER_2(xvcmpgedp, void, env, i32) DEF_HELPER_2(xvcmpgtdp, void, env, i32) +DEF_HELPER_2(xvcmpnedp, void, env, i32) DEF_HELPER_2(xvcvdpsp, void, env, i32) DEF_HELPER_2(xvcvdpsxds, void, env, i32) DEF_HELPER_2(xvcvdpsxws, void, env, i32) @@ -491,6 +492,7 @@ DEF_HELPER_2(xvminsp, void, env, i32) DEF_HELPER_2(xvcmpeqsp, void, env, i32) DEF_HELPER_2(xvcmpgesp, void, env, i32) DEF_HELPER_2(xvcmpgtsp, void, env, i32) +DEF_HELPER_2(xvcmpnesp, void, env, i32) DEF_HELPER_2(xvcvspdp, void, env, i32) DEF_HELPER_2(xvcvspsxds, void, env, i32) DEF_HELPER_2(xvcvspsxws, void, env, i32) diff --git a/target-ppc/translate/vsx-impl.inc.c b/target-ppc/translate/vsx-impl.inc.c index bf167d0488..5a27be4bd4 100644 --- a/target-ppc/translate/vsx-impl.inc.c +++ b/target-ppc/translate/vsx-impl.inc.c @@ -685,6 +685,7 @@ GEN_VSX_HELPER_2(xvmindp, 0x00, 0x1D, 0, PPC2_VSX) GEN_VSX_HELPER_2(xvcmpeqdp, 0x0C, 0x0C, 0, PPC2_VSX) GEN_VSX_HELPER_2(xvcmpgtdp, 0x0C, 0x0D, 0, PPC2_VSX) GEN_VSX_HELPER_2(xvcmpgedp, 0x0C, 0x0E, 0, PPC2_VSX) +GEN_VSX_HELPER_2(xvcmpnedp, 0x0C, 0x0F, 0, PPC2_ISA300) GEN_VSX_HELPER_2(xvcvdpsp, 0x12, 0x18, 0, PPC2_VSX) GEN_VSX_HELPER_2(xvcvdpsxds, 0x10, 0x1D, 0, PPC2_VSX) GEN_VSX_HELPER_2(xvcvdpsxws, 0x10, 0x0D, 0, PPC2_VSX) @@ -722,6 +723,7 @@ GEN_VSX_HELPER_2(xvminsp, 0x00, 0x19, 0, PPC2_VSX) GEN_VSX_HELPER_2(xvcmpeqsp, 0x0C, 0x08, 0, PPC2_VSX) GEN_VSX_HELPER_2(xvcmpgtsp, 0x0C, 0x09, 0, PPC2_VSX) GEN_VSX_HELPER_2(xvcmpgesp, 0x0C, 0x0A, 0, PPC2_VSX) +GEN_VSX_HELPER_2(xvcmpnesp, 0x0C, 0x0B, 0, PPC2_VSX) GEN_VSX_HELPER_2(xvcvspdp, 0x12, 0x1C, 0, PPC2_VSX) GEN_VSX_HELPER_2(xvcvspsxds, 0x10, 0x19, 0, PPC2_VSX) GEN_VSX_HELPER_2(xvcvspsxws, 0x10, 0x09, 0, PPC2_VSX) diff --git a/target-ppc/translate/vsx-ops.inc.c b/target-ppc/translate/vsx-ops.inc.c index 202c557fd8..3d9104155a 100644 --- a/target-ppc/translate/vsx-ops.inc.c +++ b/target-ppc/translate/vsx-ops.inc.c @@ -179,6 +179,7 @@ GEN_XX3FORM(xvmindp, 0x00, 0x1D, PPC2_VSX), GEN_XX3_RC_FORM(xvcmpeqdp, 0x0C, 0x0C, PPC2_VSX), GEN_XX3_RC_FORM(xvcmpgtdp, 0x0C, 0x0D, PPC2_VSX), GEN_XX3_RC_FORM(xvcmpgedp, 0x0C, 0x0E, PPC2_VSX), +GEN_XX3_RC_FORM(xvcmpnedp, 0x0C, 0x0F, PPC2_ISA300), GEN_XX2FORM(xvcvdpsp, 0x12, 0x18, PPC2_VSX), GEN_XX2FORM(xvcvdpsxds, 0x10, 0x1D, PPC2_VSX), GEN_XX2FORM(xvcvdpsxws, 0x10, 0x0D, PPC2_VSX), @@ -216,6 +217,7 @@ GEN_XX3FORM(xvminsp, 0x00, 0x19, PPC2_VSX), GEN_XX3_RC_FORM(xvcmpeqsp, 0x0C, 0x08, PPC2_VSX), GEN_XX3_RC_FORM(xvcmpgtsp, 0x0C, 0x09, PPC2_VSX), GEN_XX3_RC_FORM(xvcmpgesp, 0x0C, 0x0A, PPC2_VSX), +GEN_XX3_RC_FORM(xvcmpnesp, 0x0C, 0x0B, PPC2_ISA300), GEN_XX2FORM(xvcvspdp, 0x12, 0x1C, PPC2_VSX), GEN_XX2FORM(xvcvspsxds, 0x10, 0x19, PPC2_VSX), GEN_XX2FORM(xvcvspsxws, 0x10, 0x09, PPC2_VSX), From 9f992cca93de808bccbd02e14ce9200e8f25b8eb Mon Sep 17 00:00:00 2001 From: Michael Roth Date: Wed, 26 Oct 2016 21:20:25 -0500 Subject: [PATCH 67/73] spapr: update spapr hotplug documentation This updates the existing documentation to reflect recent updates to the hotplug event structure, which are in draft form but slated for inclusion in PAPR/LoPAPR. Signed-off-by: Michael Roth Reviewed-by: David Gibson Signed-off-by: David Gibson --- docs/specs/ppc-spapr-hotplug.txt | 55 ++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/docs/specs/ppc-spapr-hotplug.txt b/docs/specs/ppc-spapr-hotplug.txt index 631b0cadae..f57e2a09c6 100644 --- a/docs/specs/ppc-spapr-hotplug.txt +++ b/docs/specs/ppc-spapr-hotplug.txt @@ -233,12 +233,27 @@ tools by host-level management such as an HMC. This level of management is not applicable to PowerKVM, hence the reason for extending the notification framework to support hotplug events. -Note that these events are not yet formally part of the PAPR+ specification, -but support for this format has already been implemented in DR-related -guest tools such as powerpc-utils/librtas, as well as kernel patches that have -been submitted to handle in-kernel processing of memory/cpu-related hotplug -events[1], and is planned for formal inclusion is PAPR+ specification. The -hotplug-specific payload is QEMU implemented as follows (with all values +The format for these EPOW-signalled events is described below under +"hotplug/unplug event structure". Note that these events are not +formally part of the PAPR+ specification, and have been superseded by a +newer format, also described below under "hotplug/unplug event structure", +and so are now deemed a "legacy" format. The formats are similar, but the +"modern" format contains additional fields/flags, which are denoted for the +purposes of this documentation with "#ifdef GUEST_SUPPORTS_MODERN" guards. + +QEMU should assume support only for "legacy" fields/flags unless the guest +advertises support for the "modern" format via ibm,client-architecture-support +hcall by setting byte 5, bit 6 of it's ibm,architecture-vec-5 option vector +structure (as described by LoPAPR v11, B.6.2.3). As with "legacy" format events, +"modern" format events are surfaced to the guest via check-exception RTAS calls, +but use a dedicated event source to signal the guest. This event source is +advertised to the guest by the addition of a "hot-plug-events" node under +"/event-sources" node of the guest's device tree using the standard format +described in LoPAPR v11, B.6.12.1. + +== hotplug/unplug event structure == + +The hotplug-specific payload in QEMU is implemented as follows (with all values encoded in big-endian format): struct rtas_event_log_v6_hp { @@ -263,14 +278,23 @@ struct rtas_event_log_v6_hp { #define RTAS_LOG_V6_HP_ACTION_ADD 1 #define RTAS_LOG_V6_HP_ACTION_REMOVE 2 uint8_t hotplug_action; /* action (add/remove) */ -#define RTAS_LOG_V6_HP_ID_DRC_NAME 1 -#define RTAS_LOG_V6_HP_ID_DRC_INDEX 2 -#define RTAS_LOG_V6_HP_ID_DRC_COUNT 3 +#define RTAS_LOG_V6_HP_ID_DRC_NAME 1 +#define RTAS_LOG_V6_HP_ID_DRC_INDEX 2 +#define RTAS_LOG_V6_HP_ID_DRC_COUNT 3 +#ifdef GUEST_SUPPORTS_MODERN +#define RTAS_LOG_V6_HP_ID_DRC_COUNT_INDEXED 4 +#endif uint8_t hotplug_identifier; /* type of the resource identifier, * which serves as the discriminator * for the 'drc' union field below */ +#ifdef GUEST_SUPPORTS_MODERN + uint8_t capabilities; /* capability flags, currently unused + * by QEMU + */ +#else uint8_t reserved; +#endif union { uint32_t index; /* DRC index of resource to take action * on @@ -278,6 +302,19 @@ struct rtas_event_log_v6_hp { uint32_t count; /* number of DR resources to take * action on (guest chooses which) */ +#ifdef GUEST_SUPPORTS_MODERN + struct { + uint32_t count; /* number of DR resources to take + * action on + */ + uint32_t index; /* DRC index of first resource to take + * action on. guest will take action + * on DRC index through + * DRC index in + * sequential order + */ + } count_indexed; +#endif char name[1]; /* string representing the name of the * DRC to take action on */ From ffbb1705a33df8e2fb12b24d96663d63b22eaf8b Mon Sep 17 00:00:00 2001 From: Michael Roth Date: Wed, 26 Oct 2016 21:20:26 -0500 Subject: [PATCH 68/73] spapr_events: add support for dedicated hotplug event source Hotplug events were previously delivered using an EPOW interrupt and were queued by linux guests into a circular buffer. For traditional EPOW events like shutdown/resets, this isn't an issue, but for hotplug events there are cases where this buffer can be exhausted, resulting in the loss of hotplug events, resets, etc. Newer-style hotplug event are delivered using a dedicated event source. We enable this in supported guests by adding standard an additional event source in the guest device-tree via /event-sources, and, if the guest advertises support for the newer-style hotplug events, using the corresponding interrupt to signal the available of hotplug/unplug events. Signed-off-by: Michael Roth Signed-off-by: David Gibson --- hw/ppc/spapr.c | 9 +- hw/ppc/spapr_events.c | 202 +++++++++++++++++++++++++++++------- include/hw/ppc/spapr.h | 6 +- include/hw/ppc/spapr_ovec.h | 1 + 4 files changed, 177 insertions(+), 41 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 0b3820bbcf..9ddf2ff520 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -973,7 +973,7 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr, } /* /event-sources */ - spapr_dt_events(fdt, spapr->check_exception_irq); + spapr_dt_events(spapr, fdt); /* /rtas */ spapr_dt_rtas(spapr, fdt); @@ -1789,6 +1789,11 @@ static void ppc_spapr_init(MachineState *machine) spapr_ovec_set(spapr->ov5, OV5_FORM1_AFFINITY); + /* advertise support for dedicated HP event source to guests */ + if (spapr->use_hotplug_event_source) { + spapr_ovec_set(spapr->ov5, OV5_HP_EVT); + } + /* init CPUs */ if (machine->cpu_model == NULL) { machine->cpu_model = kvm_enabled() ? "host" : smc->tcg_default_cpu; @@ -1912,7 +1917,7 @@ static void ppc_spapr_init(MachineState *machine) } g_free(filename); - /* Set up EPOW events infrastructure */ + /* Set up RTAS event infrastructure */ spapr_events_init(spapr); /* Set up the RTC RTAS interfaces */ diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c index 89aa5a7926..9b0bd410bb 100644 --- a/hw/ppc/spapr_events.c +++ b/hw/ppc/spapr_events.c @@ -40,6 +40,7 @@ #include "hw/ppc/spapr_drc.h" #include "qemu/help_option.h" #include "qemu/bcd.h" +#include "hw/ppc/spapr_ovec.h" #include struct rtas_error_log { @@ -206,27 +207,132 @@ struct hp_log_full { struct rtas_event_log_v6_hp hp; } QEMU_PACKED; -#define EVENT_MASK_INTERNAL_ERRORS 0x80000000 -#define EVENT_MASK_EPOW 0x40000000 -#define EVENT_MASK_HOTPLUG 0x10000000 -#define EVENT_MASK_IO 0x08000000 +typedef enum EventClass { + EVENT_CLASS_INTERNAL_ERRORS = 0, + EVENT_CLASS_EPOW = 1, + EVENT_CLASS_RESERVED = 2, + EVENT_CLASS_HOT_PLUG = 3, + EVENT_CLASS_IO = 4, + EVENT_CLASS_MAX +} EventClassIndex; +#define EVENT_CLASS_MASK(index) (1 << (31 - index)) -void spapr_dt_events(void *fdt, uint32_t check_exception_irq) +static const char * const event_names[EVENT_CLASS_MAX] = { + [EVENT_CLASS_INTERNAL_ERRORS] = "internal-errors", + [EVENT_CLASS_EPOW] = "epow-events", + [EVENT_CLASS_HOT_PLUG] = "hot-plug-events", + [EVENT_CLASS_IO] = "ibm,io-events", +}; + +struct sPAPREventSource { + int irq; + uint32_t mask; + bool enabled; +}; + +static sPAPREventSource *spapr_event_sources_new(void) { - int event_sources, epow_events; - uint32_t irq_ranges[] = {cpu_to_be32(check_exception_irq), cpu_to_be32(1)}; - uint32_t interrupts[] = {cpu_to_be32(check_exception_irq), 0}; + return g_new0(sPAPREventSource, EVENT_CLASS_MAX); +} + +static void spapr_event_sources_register(sPAPREventSource *event_sources, + EventClassIndex index, int irq) +{ + /* we only support 1 irq per event class at the moment */ + g_assert(event_sources); + g_assert(!event_sources[index].enabled); + event_sources[index].irq = irq; + event_sources[index].mask = EVENT_CLASS_MASK(index); + event_sources[index].enabled = true; +} + +static const sPAPREventSource * +spapr_event_sources_get_source(sPAPREventSource *event_sources, + EventClassIndex index) +{ + g_assert(index < EVENT_CLASS_MAX); + g_assert(event_sources); + + return &event_sources[index]; +} + +void spapr_dt_events(sPAPRMachineState *spapr, void *fdt) +{ + uint32_t irq_ranges[EVENT_CLASS_MAX * 2]; + int i, count = 0, event_sources; + sPAPREventSource *events = spapr->event_sources; + + g_assert(events); _FDT(event_sources = fdt_add_subnode(fdt, 0, "event-sources")); - _FDT(fdt_setprop(fdt, event_sources, "interrupt-controller", NULL, 0)); - _FDT(fdt_setprop_cell(fdt, event_sources, "#interrupt-cells", 2)); - _FDT(fdt_setprop(fdt, event_sources, "interrupt-ranges", - irq_ranges, sizeof(irq_ranges))); + for (i = 0, count = 0; i < EVENT_CLASS_MAX; i++) { + int node_offset; + uint32_t interrupts[2]; + const sPAPREventSource *source = + spapr_event_sources_get_source(events, i); + const char *source_name = event_names[i]; - _FDT(epow_events = fdt_add_subnode(fdt, event_sources, "epow-events")); - _FDT(fdt_setprop(fdt, epow_events, "interrupts", - interrupts, sizeof(interrupts))); + if (!source->enabled) { + continue; + } + + interrupts[0] = cpu_to_be32(source->irq); + interrupts[1] = 0; + + _FDT(node_offset = fdt_add_subnode(fdt, event_sources, source_name)); + _FDT(fdt_setprop(fdt, node_offset, "interrupts", interrupts, + sizeof(interrupts))); + + irq_ranges[count++] = interrupts[0]; + irq_ranges[count++] = cpu_to_be32(1); + } + + irq_ranges[count] = cpu_to_be32(count); + count++; + + _FDT((fdt_setprop(fdt, event_sources, "interrupt-controller", NULL, 0))); + _FDT((fdt_setprop_cell(fdt, event_sources, "#interrupt-cells", 2))); + _FDT((fdt_setprop(fdt, event_sources, "interrupt-ranges", + irq_ranges, count * sizeof(uint32_t)))); +} + +static const sPAPREventSource * +rtas_event_log_to_source(sPAPRMachineState *spapr, int log_type) +{ + const sPAPREventSource *source; + + g_assert(spapr->event_sources); + + switch (log_type) { + case RTAS_LOG_TYPE_HOTPLUG: + source = spapr_event_sources_get_source(spapr->event_sources, + EVENT_CLASS_HOT_PLUG); + if (spapr_ovec_test(spapr->ov5_cas, OV5_HP_EVT)) { + g_assert(source->enabled); + break; + } + /* fall back to epow for legacy hotplug interrupt source */ + case RTAS_LOG_TYPE_EPOW: + source = spapr_event_sources_get_source(spapr->event_sources, + EVENT_CLASS_EPOW); + break; + default: + source = NULL; + } + + return source; +} + +static int rtas_event_log_to_irq(sPAPRMachineState *spapr, int log_type) +{ + const sPAPREventSource *source; + + source = rtas_event_log_to_source(spapr, log_type); + g_assert(source); + g_assert(source->enabled); + + return source->irq; } static void rtas_event_log_queue(int log_type, void *data, bool exception) @@ -247,19 +353,15 @@ static sPAPREventLogEntry *rtas_event_log_dequeue(uint32_t event_mask, sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine()); sPAPREventLogEntry *entry = NULL; - /* we only queue EPOW events atm. */ - if ((event_mask & EVENT_MASK_EPOW) == 0) { - return NULL; - } - QTAILQ_FOREACH(entry, &spapr->pending_events, next) { + const sPAPREventSource *source = + rtas_event_log_to_source(spapr, entry->log_type); + if (entry->exception != exception) { continue; } - /* EPOW and hotplug events are surfaced in the same manner */ - if (entry->log_type == RTAS_LOG_TYPE_EPOW || - entry->log_type == RTAS_LOG_TYPE_HOTPLUG) { + if (source->mask & event_mask) { break; } } @@ -276,19 +378,15 @@ static bool rtas_event_log_contains(uint32_t event_mask, bool exception) sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine()); sPAPREventLogEntry *entry = NULL; - /* we only queue EPOW events atm. */ - if ((event_mask & EVENT_MASK_EPOW) == 0) { - return false; - } - QTAILQ_FOREACH(entry, &spapr->pending_events, next) { + const sPAPREventSource *source = + rtas_event_log_to_source(spapr, entry->log_type); + if (entry->exception != exception) { continue; } - /* EPOW and hotplug events are surfaced in the same manner */ - if (entry->log_type == RTAS_LOG_TYPE_EPOW || - entry->log_type == RTAS_LOG_TYPE_HOTPLUG) { + if (source->mask & event_mask) { return true; } } @@ -376,7 +474,9 @@ static void spapr_powerdown_req(Notifier *n, void *opaque) rtas_event_log_queue(RTAS_LOG_TYPE_EPOW, new_epow, true); - qemu_irq_pulse(xics_get_qirq(spapr->xics, spapr->check_exception_irq)); + qemu_irq_pulse(xics_get_qirq(spapr->xics, + rtas_event_log_to_irq(spapr, + RTAS_LOG_TYPE_EPOW))); } static void spapr_hotplug_set_signalled(uint32_t drc_index) @@ -458,7 +558,9 @@ static void spapr_hotplug_req_event(uint8_t hp_id, uint8_t hp_action, rtas_event_log_queue(RTAS_LOG_TYPE_HOTPLUG, new_hp, true); - qemu_irq_pulse(xics_get_qirq(spapr->xics, spapr->check_exception_irq)); + qemu_irq_pulse(xics_get_qirq(spapr->xics, + rtas_event_log_to_irq(spapr, + RTAS_LOG_TYPE_HOTPLUG))); } void spapr_hotplug_req_add_by_index(sPAPRDRConnector *drc) @@ -504,6 +606,7 @@ static void check_exception(PowerPCCPU *cpu, sPAPRMachineState *spapr, uint64_t xinfo; sPAPREventLogEntry *event; struct rtas_error_log *hdr; + int i; if ((nargs < 6) || (nargs > 7) || nret != 1) { rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); @@ -540,8 +643,14 @@ static void check_exception(PowerPCCPU *cpu, sPAPRMachineState *spapr, * do the latter here, since our code relies on edge-triggered * interrupts. */ - if (rtas_event_log_contains(mask, true)) { - qemu_irq_pulse(xics_get_qirq(spapr->xics, spapr->check_exception_irq)); + for (i = 0; i < EVENT_CLASS_MAX; i++) { + if (rtas_event_log_contains(EVENT_CLASS_MASK(i), true)) { + const sPAPREventSource *source = + spapr_event_sources_get_source(spapr->event_sources, i); + + g_assert(source->enabled); + qemu_irq_pulse(xics_get_qirq(spapr->xics, source->irq)); + } } return; @@ -593,8 +702,27 @@ out_no_events: void spapr_events_init(sPAPRMachineState *spapr) { QTAILQ_INIT(&spapr->pending_events); - spapr->check_exception_irq = xics_spapr_alloc(spapr->xics, 0, false, - &error_fatal); + + spapr->event_sources = spapr_event_sources_new(); + + spapr_event_sources_register(spapr->event_sources, EVENT_CLASS_EPOW, + xics_spapr_alloc(spapr->xics, 0, false, + &error_fatal)); + + /* NOTE: if machine supports modern/dedicated hotplug event source, + * we add it to the device-tree unconditionally. This means we may + * have cases where the source is enabled in QEMU, but unused by the + * guest because it does not support modern hotplug events, so we + * take care to rely on checking for negotiation of OV5_HP_EVT option + * before attempting to use it to signal events, rather than simply + * checking that it's enabled. + */ + if (spapr->use_hotplug_event_source) { + spapr_event_sources_register(spapr->event_sources, EVENT_CLASS_HOT_PLUG, + xics_spapr_alloc(spapr->xics, 0, false, + &error_fatal)); + } + spapr->epow_notifier.notify = spapr_powerdown_req; qemu_register_powerdown_notifier(&spapr->epow_notifier); spapr_rtas_register(RTAS_CHECK_EXCEPTION, "check-exception", diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index b6f9f1b632..21af971239 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -13,6 +13,7 @@ struct sPAPRPHBState; struct sPAPRNVRAM; typedef struct sPAPRConfigureConnectorState sPAPRConfigureConnectorState; typedef struct sPAPREventLogEntry sPAPREventLogEntry; +typedef struct sPAPREventSource sPAPREventSource; #define HPTE64_V_HPTE_DIRTY 0x0000000000000040ULL #define SPAPR_ENTRY_POINT 0x100 @@ -77,9 +78,10 @@ struct sPAPRMachineState { sPAPROptionVector *ov5_cas; /* negotiated (via CAS) option vectors */ bool cas_reboot; - uint32_t check_exception_irq; Notifier epow_notifier; QTAILQ_HEAD(, sPAPREventLogEntry) pending_events; + bool use_hotplug_event_source; + sPAPREventSource *event_sources; /* Migration state */ int htab_save_index; @@ -584,7 +586,7 @@ struct sPAPREventLogEntry { }; void spapr_events_init(sPAPRMachineState *sm); -void spapr_dt_events(void *fdt, uint32_t check_exception_irq); +void spapr_dt_events(sPAPRMachineState *sm, void *fdt); int spapr_h_cas_compose_response(sPAPRMachineState *sm, target_ulong addr, target_ulong size, bool cpu_update, diff --git a/include/hw/ppc/spapr_ovec.h b/include/hw/ppc/spapr_ovec.h index 81cdd14f64..6a06da32e6 100644 --- a/include/hw/ppc/spapr_ovec.h +++ b/include/hw/ppc/spapr_ovec.h @@ -45,6 +45,7 @@ typedef struct sPAPROptionVector sPAPROptionVector; /* option vector 5 */ #define OV5_DRCONF_MEMORY OV_BIT(2, 2) #define OV5_FORM1_AFFINITY OV_BIT(5, 0) +#define OV5_HP_EVT OV_BIT(6, 5) /* interfaces */ sPAPROptionVector *spapr_ovec_new(void); From f622921430adbb4ac5aa641534e13e2cafae099a Mon Sep 17 00:00:00 2001 From: Michael Roth Date: Wed, 26 Oct 2016 21:20:27 -0500 Subject: [PATCH 69/73] spapr: add hotplug interrupt machine options This adds machine options of the form: -machine pseries,modern-hotplug-events=true -machine pseries,modern-hotplug-events=false If false, QEMU will force the use of "legacy" style hotplug events, which are surfaced through EPOW events instead of a dedicated hot plug event source, and lack certain features necessary, mainly, for memory unplug support. If true, QEMU will enable support for "modern" dedicated hot plug event source. Note that we will still default to "legacy" style unless the guest advertises support for the "modern" hotplug events via ibm,client-architecture-support hcall during early boot. For pseries-2.7 and earlier we default to false, for newer machine types we default to true. Signed-off-by: Michael Roth Signed-off-by: David Gibson --- hw/ppc/spapr.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 9ddf2ff520..fe918833cc 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -2143,16 +2143,41 @@ static void spapr_set_kvm_type(Object *obj, const char *value, Error **errp) spapr->kvm_type = g_strdup(value); } +static bool spapr_get_modern_hotplug_events(Object *obj, Error **errp) +{ + sPAPRMachineState *spapr = SPAPR_MACHINE(obj); + + return spapr->use_hotplug_event_source; +} + +static void spapr_set_modern_hotplug_events(Object *obj, bool value, + Error **errp) +{ + sPAPRMachineState *spapr = SPAPR_MACHINE(obj); + + spapr->use_hotplug_event_source = value; +} + static void spapr_machine_initfn(Object *obj) { sPAPRMachineState *spapr = SPAPR_MACHINE(obj); spapr->htab_fd = -1; + spapr->use_hotplug_event_source = true; object_property_add_str(obj, "kvm-type", spapr_get_kvm_type, spapr_set_kvm_type, NULL); object_property_set_description(obj, "kvm-type", "Specifies the KVM virtualization mode (HV, PR)", NULL); + object_property_add_bool(obj, "modern-hotplug-events", + spapr_get_modern_hotplug_events, + spapr_set_modern_hotplug_events, + NULL); + object_property_set_description(obj, "modern-hotplug-events", + "Use dedicated hotplug event mechanism in" + " place of standard EPOW events when possible" + " (required for memory hot-unplug support)", + NULL); } static void spapr_machine_finalizefn(Object *obj) @@ -2599,7 +2624,10 @@ static void phb_placement_2_7(sPAPRMachineState *spapr, uint32_t index, static void spapr_machine_2_7_instance_options(MachineState *machine) { + sPAPRMachineState *spapr = SPAPR_MACHINE(machine); + spapr_machine_2_8_instance_options(machine); + spapr->use_hotplug_event_source = false; } static void spapr_machine_2_7_class_options(MachineClass *mc) From afdbd403563fe91bccc9c8ddce84838817f06a66 Mon Sep 17 00:00:00 2001 From: Bharata B Rao Date: Wed, 26 Oct 2016 21:20:28 -0500 Subject: [PATCH 70/73] spapr: Add DRC count indexed hotplug identifier type Add support for DRC count indexed hotplug ID type which is primarily needed for memory hot unplug. This type allows for specifying the number of DRs that should be plugged/unplugged starting from a given DRC index. Signed-off-by: Bharata B Rao * updated rtas_event_log_v6_hp to reflect count/index field ordering used in PAPR hotplug ACR Signed-off-by: Michael Roth Reviewed-by: David Gibson Signed-off-by: David Gibson --- hw/ppc/spapr_events.c | 76 +++++++++++++++++++++++++++++++++--------- include/hw/ppc/spapr.h | 4 +++ 2 files changed, 65 insertions(+), 15 deletions(-) diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c index 9b0bd410bb..f85a9c32a7 100644 --- a/hw/ppc/spapr_events.c +++ b/hw/ppc/spapr_events.c @@ -175,6 +175,16 @@ struct epow_log_full { struct rtas_event_log_v6_epow epow; } QEMU_PACKED; +union drc_identifier { + uint32_t index; + uint32_t count; + struct { + uint32_t count; + uint32_t index; + } count_indexed; + char name[1]; +} QEMU_PACKED; + struct rtas_event_log_v6_hp { #define RTAS_LOG_V6_SECTION_ID_HOTPLUG 0x4850 /* HP */ struct rtas_event_log_v6_section_header hdr; @@ -191,12 +201,9 @@ struct rtas_event_log_v6_hp { #define RTAS_LOG_V6_HP_ID_DRC_NAME 1 #define RTAS_LOG_V6_HP_ID_DRC_INDEX 2 #define RTAS_LOG_V6_HP_ID_DRC_COUNT 3 +#define RTAS_LOG_V6_HP_ID_DRC_COUNT_INDEXED 4 uint8_t reserved; - union { - uint32_t index; - uint32_t count; - char name[1]; - } drc; + union drc_identifier drc_id; } QEMU_PACKED; struct hp_log_full { @@ -488,7 +495,7 @@ static void spapr_hotplug_set_signalled(uint32_t drc_index) static void spapr_hotplug_req_event(uint8_t hp_id, uint8_t hp_action, sPAPRDRConnectorType drc_type, - uint32_t drc) + union drc_identifier *drc_id) { sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine()); struct hp_log_full *new_hp; @@ -533,7 +540,7 @@ static void spapr_hotplug_req_event(uint8_t hp_id, uint8_t hp_action, case SPAPR_DR_CONNECTOR_TYPE_PCI: hp->hotplug_type = RTAS_LOG_V6_HP_TYPE_PCI; if (hp->hotplug_action == RTAS_LOG_V6_HP_ACTION_ADD) { - spapr_hotplug_set_signalled(drc); + spapr_hotplug_set_signalled(drc_id->index); } break; case SPAPR_DR_CONNECTOR_TYPE_LMB: @@ -551,9 +558,18 @@ static void spapr_hotplug_req_event(uint8_t hp_id, uint8_t hp_action, } if (hp_id == RTAS_LOG_V6_HP_ID_DRC_COUNT) { - hp->drc.count = cpu_to_be32(drc); + hp->drc_id.count = cpu_to_be32(drc_id->count); } else if (hp_id == RTAS_LOG_V6_HP_ID_DRC_INDEX) { - hp->drc.index = cpu_to_be32(drc); + hp->drc_id.index = cpu_to_be32(drc_id->index); + } else if (hp_id == RTAS_LOG_V6_HP_ID_DRC_COUNT_INDEXED) { + /* we should not be using count_indexed value unless the guest + * supports dedicated hotplug event source + */ + g_assert(spapr_ovec_test(spapr->ov5_cas, OV5_HP_EVT)); + hp->drc_id.count_indexed.count = + cpu_to_be32(drc_id->count_indexed.count); + hp->drc_id.count_indexed.index = + cpu_to_be32(drc_id->count_indexed.index); } rtas_event_log_queue(RTAS_LOG_TYPE_HOTPLUG, new_hp, true); @@ -567,34 +583,64 @@ void spapr_hotplug_req_add_by_index(sPAPRDRConnector *drc) { sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); sPAPRDRConnectorType drc_type = drck->get_type(drc); - uint32_t index = drck->get_index(drc); + union drc_identifier drc_id; + drc_id.index = drck->get_index(drc); spapr_hotplug_req_event(RTAS_LOG_V6_HP_ID_DRC_INDEX, - RTAS_LOG_V6_HP_ACTION_ADD, drc_type, index); + RTAS_LOG_V6_HP_ACTION_ADD, drc_type, &drc_id); } void spapr_hotplug_req_remove_by_index(sPAPRDRConnector *drc) { sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); sPAPRDRConnectorType drc_type = drck->get_type(drc); - uint32_t index = drck->get_index(drc); + union drc_identifier drc_id; + drc_id.index = drck->get_index(drc); spapr_hotplug_req_event(RTAS_LOG_V6_HP_ID_DRC_INDEX, - RTAS_LOG_V6_HP_ACTION_REMOVE, drc_type, index); + RTAS_LOG_V6_HP_ACTION_REMOVE, drc_type, &drc_id); } void spapr_hotplug_req_add_by_count(sPAPRDRConnectorType drc_type, uint32_t count) { + union drc_identifier drc_id; + + drc_id.count = count; spapr_hotplug_req_event(RTAS_LOG_V6_HP_ID_DRC_COUNT, - RTAS_LOG_V6_HP_ACTION_ADD, drc_type, count); + RTAS_LOG_V6_HP_ACTION_ADD, drc_type, &drc_id); } void spapr_hotplug_req_remove_by_count(sPAPRDRConnectorType drc_type, uint32_t count) { + union drc_identifier drc_id; + + drc_id.count = count; spapr_hotplug_req_event(RTAS_LOG_V6_HP_ID_DRC_COUNT, - RTAS_LOG_V6_HP_ACTION_REMOVE, drc_type, count); + RTAS_LOG_V6_HP_ACTION_REMOVE, drc_type, &drc_id); +} + +void spapr_hotplug_req_add_by_count_indexed(sPAPRDRConnectorType drc_type, + uint32_t count, uint32_t index) +{ + union drc_identifier drc_id; + + drc_id.count_indexed.count = count; + drc_id.count_indexed.index = index; + spapr_hotplug_req_event(RTAS_LOG_V6_HP_ID_DRC_COUNT_INDEXED, + RTAS_LOG_V6_HP_ACTION_ADD, drc_type, &drc_id); +} + +void spapr_hotplug_req_remove_by_count_indexed(sPAPRDRConnectorType drc_type, + uint32_t count, uint32_t index) +{ + union drc_identifier drc_id; + + drc_id.count_indexed.count = count; + drc_id.count_indexed.index = index; + spapr_hotplug_req_event(RTAS_LOG_V6_HP_ID_DRC_COUNT_INDEXED, + RTAS_LOG_V6_HP_ACTION_REMOVE, drc_type, &drc_id); } static void check_exception(PowerPCCPU *cpu, sPAPRMachineState *spapr, diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 21af971239..bd5bcf70de 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -610,6 +610,10 @@ void spapr_hotplug_req_add_by_count(sPAPRDRConnectorType drc_type, uint32_t count); void spapr_hotplug_req_remove_by_count(sPAPRDRConnectorType drc_type, uint32_t count); +void spapr_hotplug_req_add_by_count_indexed(sPAPRDRConnectorType drc_type, + uint32_t count, uint32_t index); +void spapr_hotplug_req_remove_by_count_indexed(sPAPRDRConnectorType drc_type, + uint32_t count, uint32_t index); void spapr_cpu_init(sPAPRMachineState *spapr, PowerPCCPU *cpu, Error **errp); void *spapr_populate_hotplug_cpu_dt(CPUState *cs, int *fdt_offset, sPAPRMachineState *spapr); From 79b78a6bd47722ce23bc74287cd6322756698f09 Mon Sep 17 00:00:00 2001 From: Michael Roth Date: Wed, 26 Oct 2016 21:20:29 -0500 Subject: [PATCH 71/73] spapr: use count+index for memory hotplug Commit 0a417869: spapr: Move memory hotplug to RTAS_LOG_V6_HP_ID_DRC_COUNT type dropped per-DRC/per-LMB hotplugs event in favor of a bulk add via a single LMB count value. This was to avoid overrunning the guest EPOW event queue with hotplug events. This works fine, but relies on the guest exhaustively scanning for pluggable LMBs to satisfy the requested count by issuing rtas-get-sensor(DR_ENTITY_SENSE, ...) calls until all the LMBs associated with the DIMM are identified. With newer support for dedicated hotplug event source, this queue exhaustion is no longer as much of an issue due to implementation details on the guest side, but we still try to avoid excessive hotplug events by now supporting both a count and a starting index to avoid unecessary work. This patch makes use of that approach when the capability is available. Cc: bharata@linux.vnet.ibm.com Signed-off-by: Michael Roth Reviewed-by: David Gibson Signed-off-by: David Gibson --- hw/ppc/spapr.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index fe918833cc..531dfeb645 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -2202,14 +2202,16 @@ static void spapr_nmi(NMIState *n, int cpu_index, Error **errp) } } -static void spapr_add_lmbs(DeviceState *dev, uint64_t addr, uint64_t size, - uint32_t node, Error **errp) +static void spapr_add_lmbs(DeviceState *dev, uint64_t addr_start, uint64_t size, + uint32_t node, bool dedicated_hp_event_source, + Error **errp) { sPAPRDRConnector *drc; sPAPRDRConnectorClass *drck; uint32_t nr_lmbs = size/SPAPR_MEMORY_BLOCK_SIZE; int i, fdt_offset, fdt_size; void *fdt; + uint64_t addr = addr_start; for (i = 0; i < nr_lmbs; i++) { drc = spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_LMB, @@ -2228,7 +2230,17 @@ static void spapr_add_lmbs(DeviceState *dev, uint64_t addr, uint64_t size, * guest only in case of hotplugged memory */ if (dev->hotplugged) { - spapr_hotplug_req_add_by_count(SPAPR_DR_CONNECTOR_TYPE_LMB, nr_lmbs); + if (dedicated_hp_event_source) { + drc = spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_LMB, + addr_start / SPAPR_MEMORY_BLOCK_SIZE); + drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); + spapr_hotplug_req_add_by_count_indexed(SPAPR_DR_CONNECTOR_TYPE_LMB, + nr_lmbs, + drck->get_index(drc)); + } else { + spapr_hotplug_req_add_by_count(SPAPR_DR_CONNECTOR_TYPE_LMB, + nr_lmbs); + } } } @@ -2261,7 +2273,9 @@ static void spapr_memory_plug(HotplugHandler *hotplug_dev, DeviceState *dev, goto out; } - spapr_add_lmbs(dev, addr, size, node, &error_abort); + spapr_add_lmbs(dev, addr, size, node, + spapr_ovec_test(ms->ov5_cas, OV5_HP_EVT), + &error_abort); out: error_propagate(errp, local_err); From cf63246319019c330a214c1ca9284c9405a6eb7a Mon Sep 17 00:00:00 2001 From: Bharata B Rao Date: Wed, 26 Oct 2016 21:20:30 -0500 Subject: [PATCH 72/73] spapr: Memory hot-unplug support Add support to hot remove pc-dimm memory devices. Since we're introducing a machine-level unplug_request hook, we also had handling for CPU unplug there as well to ensure CPU unplug continues to work as it did before. Signed-off-by: Bharata B Rao * add hooks to CAS/cmdline enablement of hotplug ACR support * add hook for CPU unplug Signed-off-by: Michael Roth Reviewed-by: David Gibson Signed-off-by: David Gibson --- hw/ppc/spapr.c | 119 ++++++++++++++++++++++++++++++++++++++++++++- hw/ppc/spapr_drc.c | 17 +++++++ 2 files changed, 135 insertions(+), 1 deletion(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 531dfeb645..c8e29212cb 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -2281,6 +2281,90 @@ out: error_propagate(errp, local_err); } +typedef struct sPAPRDIMMState { + uint32_t nr_lmbs; +} sPAPRDIMMState; + +static void spapr_lmb_release(DeviceState *dev, void *opaque) +{ + sPAPRDIMMState *ds = (sPAPRDIMMState *)opaque; + HotplugHandler *hotplug_ctrl; + + if (--ds->nr_lmbs) { + return; + } + + g_free(ds); + + /* + * Now that all the LMBs have been removed by the guest, call the + * pc-dimm unplug handler to cleanup up the pc-dimm device. + */ + hotplug_ctrl = qdev_get_hotplug_handler(dev); + hotplug_handler_unplug(hotplug_ctrl, dev, &error_abort); +} + +static void spapr_del_lmbs(DeviceState *dev, uint64_t addr_start, uint64_t size, + Error **errp) +{ + sPAPRDRConnector *drc; + sPAPRDRConnectorClass *drck; + uint32_t nr_lmbs = size / SPAPR_MEMORY_BLOCK_SIZE; + int i; + sPAPRDIMMState *ds = g_malloc0(sizeof(sPAPRDIMMState)); + uint64_t addr = addr_start; + + ds->nr_lmbs = nr_lmbs; + for (i = 0; i < nr_lmbs; i++) { + drc = spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_LMB, + addr / SPAPR_MEMORY_BLOCK_SIZE); + g_assert(drc); + + drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); + drck->detach(drc, dev, spapr_lmb_release, ds, errp); + addr += SPAPR_MEMORY_BLOCK_SIZE; + } + + drc = spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_LMB, + addr_start / SPAPR_MEMORY_BLOCK_SIZE); + drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); + spapr_hotplug_req_remove_by_count_indexed(SPAPR_DR_CONNECTOR_TYPE_LMB, + nr_lmbs, + drck->get_index(drc)); +} + +static void spapr_memory_unplug(HotplugHandler *hotplug_dev, DeviceState *dev, + Error **errp) +{ + sPAPRMachineState *ms = SPAPR_MACHINE(hotplug_dev); + PCDIMMDevice *dimm = PC_DIMM(dev); + PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm); + MemoryRegion *mr = ddc->get_memory_region(dimm); + + pc_dimm_memory_unplug(dev, &ms->hotplug_memory, mr); + object_unparent(OBJECT(dev)); +} + +static void spapr_memory_unplug_request(HotplugHandler *hotplug_dev, + DeviceState *dev, Error **errp) +{ + Error *local_err = NULL; + PCDIMMDevice *dimm = PC_DIMM(dev); + PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm); + MemoryRegion *mr = ddc->get_memory_region(dimm); + uint64_t size = memory_region_size(mr); + uint64_t addr; + + addr = object_property_get_int(OBJECT(dimm), PC_DIMM_ADDR_PROP, &local_err); + if (local_err) { + goto out; + } + + spapr_del_lmbs(dev, addr, size, &error_abort); +out: + error_propagate(errp, local_err); +} + void *spapr_populate_hotplug_cpu_dt(CPUState *cs, int *fdt_offset, sPAPRMachineState *spapr) { @@ -2354,10 +2438,42 @@ static void spapr_machine_device_plug(HotplugHandler *hotplug_dev, static void spapr_machine_device_unplug(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp) { + sPAPRMachineState *sms = SPAPR_MACHINE(qdev_get_machine()); MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine()); if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { - error_setg(errp, "Memory hot unplug not supported by sPAPR"); + if (spapr_ovec_test(sms->ov5_cas, OV5_HP_EVT)) { + spapr_memory_unplug(hotplug_dev, dev, errp); + } else { + error_setg(errp, "Memory hot unplug not supported for this guest"); + } + } else if (object_dynamic_cast(OBJECT(dev), TYPE_SPAPR_CPU_CORE)) { + if (!mc->query_hotpluggable_cpus) { + error_setg(errp, "CPU hot unplug not supported on this machine"); + return; + } + spapr_core_unplug(hotplug_dev, dev, errp); + } +} + +static void spapr_machine_device_unplug_request(HotplugHandler *hotplug_dev, + DeviceState *dev, Error **errp) +{ + sPAPRMachineState *sms = SPAPR_MACHINE(qdev_get_machine()); + MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine()); + + if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { + if (spapr_ovec_test(sms->ov5_cas, OV5_HP_EVT)) { + spapr_memory_unplug_request(hotplug_dev, dev, errp); + } else { + /* NOTE: this means there is a window after guest reset, prior to + * CAS negotiation, where unplug requests will fail due to the + * capability not being detected yet. This is a bit different than + * the case with PCI unplug, where the events will be queued and + * eventually handled by the guest after boot + */ + error_setg(errp, "Memory hot unplug not supported for this guest"); + } } else if (object_dynamic_cast(OBJECT(dev), TYPE_SPAPR_CPU_CORE)) { if (!mc->query_hotpluggable_cpus) { error_setg(errp, "CPU hot unplug not supported on this machine"); @@ -2503,6 +2619,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data) hc->plug = spapr_machine_device_plug; hc->unplug = spapr_machine_device_unplug; mc->cpu_index_to_socket_id = spapr_cpu_index_to_socket_id; + hc->unplug_request = spapr_machine_device_unplug_request; smc->dr_lmb_enabled = true; smc->tcg_default_cpu = "POWER8"; diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c index 6e54fd4743..a0c44ee593 100644 --- a/hw/ppc/spapr_drc.c +++ b/hw/ppc/spapr_drc.c @@ -68,6 +68,23 @@ static uint32_t set_isolation_state(sPAPRDRConnector *drc, } } + /* + * Fail any requests to ISOLATE the LMB DRC if this LMB doesn't + * belong to a DIMM device that is marked for removal. + * + * Currently the guest userspace tool drmgr that drives the memory + * hotplug/unplug will just try to remove a set of 'removable' LMBs + * in response to a hot unplug request that is based on drc-count. + * If the LMB being removed doesn't belong to a DIMM device that is + * actually being unplugged, fail the isolation request here. + */ + if (drc->type == SPAPR_DR_CONNECTOR_TYPE_LMB) { + if ((state == SPAPR_DR_ISOLATION_STATE_ISOLATED) && + !drc->awaiting_release) { + return RTAS_OUT_HW_ERROR; + } + } + drc->isolation_state = state; if (drc->isolation_state == SPAPR_DR_ISOLATION_STATE_ISOLATED) { From 10c21b5c20bf3d20b7b0ad279db37ae89cc7937d Mon Sep 17 00:00:00 2001 From: Nicholas Piggin Date: Thu, 27 Oct 2016 23:50:58 +1100 Subject: [PATCH 73/73] ppc: allow certain HV interrupts to be delivered to guests ppc hypervisors have delivered system reset and machine check exception interrupts to guests in some situations (e.g., see FWNMI feature of LoPAPR, or NMI injection in QEMU). These exceptions are architected to set the HV bit in hardware, however when injected into a guest, the HV bit should be cleared. Current code masks off the HV bit before setting the new MSR, however this happens after the interrupt delivery model has calculated delivery mode for the exception. This can result in the guest's MSR LE bit being lost. Account for this in the exception handler and don't set HV bit for guest delivery. Also add another sanity check to ensure similar bugs get caught. Signed-off-by: Nicholas Piggin Signed-off-by: David Gibson --- target-ppc/excp_helper.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/target-ppc/excp_helper.c b/target-ppc/excp_helper.c index 53c407576b..808760bf53 100644 --- a/target-ppc/excp_helper.c +++ b/target-ppc/excp_helper.c @@ -213,7 +213,12 @@ static inline void powerpc_excp(PowerPCCPU *cpu, int excp_model, int excp) cs->halted = 1; cs->interrupt_request |= CPU_INTERRUPT_EXITTB; } - new_msr |= (target_ulong)MSR_HVB; + if (env->msr_mask & MSR_HVB) { + /* ISA specifies HV, but can be delivered to guest with HV clear + * (e.g., see FWNMI in PAPR). + */ + new_msr |= (target_ulong)MSR_HVB; + } ail = 0; /* machine check exceptions don't have ME set */ @@ -391,8 +396,17 @@ static inline void powerpc_excp(PowerPCCPU *cpu, int excp_model, int excp) msr |= 0x10000; new_msr |= ((target_ulong)1 << MSR_ME); } - - new_msr |= (target_ulong)MSR_HVB; + if (env->msr_mask & MSR_HVB) { + /* ISA specifies HV, but can be delivered to guest with HV clear + * (e.g., see FWNMI in PAPR, NMI injection in QEMU). + */ + new_msr |= (target_ulong)MSR_HVB; + } else { + if (msr_pow) { + cpu_abort(cs, "Trying to deliver power-saving system reset " + "exception %d with no HV support\n", excp); + } + } ail = 0; break; case POWERPC_EXCP_DSEG: /* Data segment exception */ @@ -609,9 +623,15 @@ static inline void powerpc_excp(PowerPCCPU *cpu, int excp_model, int excp) env->spr[srr1] = msr; /* Sanity check */ - if (!(env->msr_mask & MSR_HVB) && (srr0 == SPR_HSRR0)) { - cpu_abort(cs, "Trying to deliver HV exception %d with " - "no HV support\n", excp); + if (!(env->msr_mask & MSR_HVB)) { + if (new_msr & MSR_HVB) { + cpu_abort(cs, "Trying to deliver HV exception (MSR) %d with " + "no HV support\n", excp); + } + if (srr0 == SPR_HSRR0) { + cpu_abort(cs, "Trying to deliver HV exception (HSRR) %d with " + "no HV support\n", excp); + } } /* If any alternate SRR register are defined, duplicate saved values */