From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
To: peter.maydell@linaro.org
Cc: Tiejun Chen <tiejun.chen@intel.com>,
xen-devel@lists.xensource.com, qemu-devel@nongnu.org,
Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Qemu-devel] [PULL 07/29] xen, gfx passthrough: retrieve VGA BIOS to work
Date: Thu, 10 Sep 2015 18:15:39 +0100 [thread overview]
Message-ID: <1441905361-31967-7-git-send-email-stefano.stabellini@eu.citrix.com> (raw)
In-Reply-To: <alpine.DEB.2.02.1509101751470.2672@kaball.uk.xensource.com>
From: Tiejun Chen <tiejun.chen@intel.com>
Now we retrieve VGA bios like kvm stuff in qemu but we need to
fix Device Identification in case if its not matched with the
real IGD device since Seabios is always trying to compare this
ID to work out VGA BIOS.
Signed-off-by: Tiejun Chen <tiejun.chen@intel.com>
Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
hw/xen/xen_pt.c | 10 ++++++
hw/xen/xen_pt.h | 5 +++
hw/xen/xen_pt_graphics.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 94 insertions(+)
diff --git a/hw/xen/xen_pt.c b/hw/xen/xen_pt.c
index 42380c3..15b02cb 100644
--- a/hw/xen/xen_pt.c
+++ b/hw/xen/xen_pt.c
@@ -725,6 +725,16 @@ static int xen_pt_initfn(PCIDevice *d)
s->memory_listener = xen_pt_memory_listener;
s->io_listener = xen_pt_io_listener;
+ /* Setup VGA bios for passthrough GFX */
+ if ((s->real_device.domain == 0) && (s->real_device.bus == 0) &&
+ (s->real_device.dev == 2) && (s->real_device.func == 0)) {
+ if (xen_pt_setup_vga(s, &s->real_device) < 0) {
+ XEN_PT_ERR(d, "Setup VGA BIOS of passthrough GFX failed!\n");
+ xen_host_pci_device_put(&s->real_device);
+ return -1;
+ }
+ }
+
/* Handle real device's MMIO/PIO BARs */
xen_pt_register_regions(s, &cmd);
diff --git a/hw/xen/xen_pt.h b/hw/xen/xen_pt.h
index 5eb3c52..a33e95c 100644
--- a/hw/xen/xen_pt.h
+++ b/hw/xen/xen_pt.h
@@ -305,6 +305,11 @@ static inline bool xen_pt_has_msix_mapping(XenPCIPassthroughState *s, int bar)
return s->msix && s->msix->bar_index == bar;
}
+extern void *pci_assign_dev_load_option_rom(PCIDevice *dev,
+ struct Object *owner, int *size,
+ unsigned int domain,
+ unsigned int bus, unsigned int slot,
+ unsigned int function);
extern bool has_igd_gfx_passthru;
static inline bool is_igd_vga_passthrough(XenHostPCIDevice *dev)
{
diff --git a/hw/xen/xen_pt_graphics.c b/hw/xen/xen_pt_graphics.c
index 9b3df81..3232296 100644
--- a/hw/xen/xen_pt_graphics.c
+++ b/hw/xen/xen_pt_graphics.c
@@ -109,3 +109,82 @@ int xen_pt_unregister_vga_regions(XenHostPCIDevice *dev)
return 0;
}
+
+static void *get_vgabios(XenPCIPassthroughState *s, int *size,
+ XenHostPCIDevice *dev)
+{
+ return pci_assign_dev_load_option_rom(&s->dev, OBJECT(&s->dev), size,
+ dev->domain, dev->bus,
+ dev->dev, dev->func);
+}
+
+/* Refer to Seabios. */
+struct rom_header {
+ uint16_t signature;
+ uint8_t size;
+ uint8_t initVector[4];
+ uint8_t reserved[17];
+ uint16_t pcioffset;
+ uint16_t pnpoffset;
+} __attribute__((packed));
+
+struct pci_data {
+ uint32_t signature;
+ uint16_t vendor;
+ uint16_t device;
+ uint16_t vitaldata;
+ uint16_t dlen;
+ uint8_t drevision;
+ uint8_t class_lo;
+ uint16_t class_hi;
+ uint16_t ilen;
+ uint16_t irevision;
+ uint8_t type;
+ uint8_t indicator;
+ uint16_t reserved;
+} __attribute__((packed));
+
+int xen_pt_setup_vga(XenPCIPassthroughState *s, XenHostPCIDevice *dev)
+{
+ unsigned char *bios = NULL;
+ struct rom_header *rom;
+ int bios_size;
+ char *c = NULL;
+ char checksum = 0;
+ uint32_t len = 0;
+ struct pci_data *pd = NULL;
+
+ if (!is_igd_vga_passthrough(dev)) {
+ return -1;
+ }
+
+ bios = get_vgabios(s, &bios_size, dev);
+ if (!bios) {
+ XEN_PT_ERR(&s->dev, "VGA: Can't getting VBIOS!\n");
+ return -1;
+ }
+
+ /* Currently we fixed this address as a primary. */
+ rom = (struct rom_header *)bios;
+ pd = (void *)(bios + (unsigned char)rom->pcioffset);
+
+ /* We may need to fixup Device Identification. */
+ if (pd->device != s->real_device.device_id) {
+ pd->device = s->real_device.device_id;
+
+ len = rom->size * 512;
+ /* Then adjust the bios checksum */
+ for (c = (char *)bios; c < ((char *)bios + len); c++) {
+ checksum += *c;
+ }
+ if (checksum) {
+ bios[len - 1] -= checksum;
+ XEN_PT_LOG(&s->dev, "vga bios checksum is adjusted %x!\n",
+ checksum);
+ }
+ }
+
+ /* Currently we fixed this address as a primary for legacy BIOS. */
+ cpu_physical_memory_rw(0xc0000, bios, bios_size, 1);
+ return 0;
+}
--
1.7.10.4
next prev parent reply other threads:[~2015-09-10 17:18 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-10 17:15 [Qemu-devel] [PULL 00/29] xen-2015-09-10-tag Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 01/29] xen-hvm: Add trace to ioreq Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 02/29] i440fx: make types configurable at run-time Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 03/29] pc_init1: pass parameters just with types Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 04/29] piix: create host bridge to passthrough Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 05/29] hw/pci-assign: split pci-assign.c Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 06/29] xen, gfx passthrough: basic graphics passthrough support Stefano Stabellini
2015-09-10 17:15 ` Stefano Stabellini [this message]
2015-09-10 17:15 ` [Qemu-devel] [PULL 08/29] igd gfx passthrough: create a isa bridge Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 09/29] xen, gfx passthrough: register " Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 10/29] xen, gfx passthrough: register host bridge specific to passthrough Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 11/29] xen, gfx passthrough: add opregion mapping Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 12/29] xen-hvm: When using xc_domain_add_to_physmap also include errno when reporting Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 13/29] xen/HVM: atomically access pointers in bufioreq handling Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 14/29] xen/pt: Update comments with proper function name Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 15/29] xen/pt: Make xen_pt_msi_set_enable static Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 16/29] xen/pt: xen_host_pci_config_read returns -errno, not -1 on failure Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 17/29] xen: use errno instead of rc for xc_domain_add_to_physmap Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 18/29] xen/pt/msi: Add the register value when printing logging and error messages Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 19/29] xen/pt: Use XEN_PT_LOG properly to guard against compiler warnings Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 20/29] xen/pt: Use xen_host_pci_get_[byte|word] instead of dev.config Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 21/29] xen/pt: Sync up the dev.config and data values Stefano Stabellini
2015-09-14 10:01 ` Paolo Bonzini
2015-09-15 10:07 ` Stefano Stabellini
2015-09-15 13:25 ` Konrad Rzeszutek Wilk
2015-09-15 13:28 ` Stefano Stabellini
2015-09-15 13:32 ` Paolo Bonzini
2015-09-15 13:55 ` Konrad Rzeszutek Wilk
2015-09-10 17:15 ` [Qemu-devel] [PULL 22/29] xen/pt: Check if reg->init function sets the 'data' past the reg->size Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 23/29] xen/pt: Remove XenPTReg->data field Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 24/29] xen/pt: Log xen_host_pci_get in two init functions Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 25/29] xen/pt: Log xen_host_pci_get/set errors in MSI code Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 26/29] xen/pt: Make xen_pt_unregister_device idempotent Stefano Stabellini
2015-09-10 17:15 ` [Qemu-devel] [PULL 27/29] xen/pt: Move bulk of xen_pt_unregister_device in its own routine Stefano Stabellini
2015-09-10 17:16 ` [Qemu-devel] [PULL 28/29] xen/pt: Check for return values for xen_host_pci_[get|set] in init Stefano Stabellini
2015-09-10 17:16 ` [Qemu-devel] [PULL 29/29] xen/pt: Don't slurp wholesale the PCI configuration registers Stefano Stabellini
2015-09-10 19:02 ` [Qemu-devel] [PULL 00/29] xen-2015-09-10-tag Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1441905361-31967-7-git-send-email-stefano.stabellini@eu.citrix.com \
--to=stefano.stabellini@eu.citrix.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=tiejun.chen@intel.com \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).