Xen queue:
- fix for graphic passthrough with 'xenfv' machine - fix uninitialized variable -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEE+AwAYwjiLP2KkueYDPVXL9f7Va8FAmQF8fgACgkQDPVXL9f7 Va/nSQf/XVfmhe2W1ailKJxuvGeMLRW/tmY/dsNAZNXXBMjRYEaF4Eps51pjYdb7 6UUY/atT1fm9v/AYhxc+k8weIE/mxCDbaRStQUzHlrWPof1NsmEeYZ3NVdVq5w7s FmDCR+yiP2tcrBPhPD0aFBB7Lsayfy0P5qLFMMeeerlkZmk1O3fB04EKtus3YD1r hVSH+H8i5b8vg0d/5fGGrRzKalh5E2xGGUfz4ukp3+AYWNCl2m65K0JsX42+G79b Cg+OpeNp9CEXZSUvkfVoRxH9OJp6GpGZIHA9U3nvH31KR4OnDeCSZuCiPvoUuvZT Q0fd8eA4DRTEtt9gJ+ecQEpON5dcSA== =kvNV -----END PGP SIGNATURE----- Merge tag 'pull-xen-20230306' of https://xenbits.xen.org/git-http/people/aperard/qemu-dm into staging Xen queue: - fix for graphic passthrough with 'xenfv' machine - fix uninitialized variable # -----BEGIN PGP SIGNATURE----- # # iQEzBAABCgAdFiEE+AwAYwjiLP2KkueYDPVXL9f7Va8FAmQF8fgACgkQDPVXL9f7 # Va/nSQf/XVfmhe2W1ailKJxuvGeMLRW/tmY/dsNAZNXXBMjRYEaF4Eps51pjYdb7 # 6UUY/atT1fm9v/AYhxc+k8weIE/mxCDbaRStQUzHlrWPof1NsmEeYZ3NVdVq5w7s # FmDCR+yiP2tcrBPhPD0aFBB7Lsayfy0P5qLFMMeeerlkZmk1O3fB04EKtus3YD1r # hVSH+H8i5b8vg0d/5fGGrRzKalh5E2xGGUfz4ukp3+AYWNCl2m65K0JsX42+G79b # Cg+OpeNp9CEXZSUvkfVoRxH9OJp6GpGZIHA9U3nvH31KR4OnDeCSZuCiPvoUuvZT # Q0fd8eA4DRTEtt9gJ+ecQEpON5dcSA== # =kvNV # -----END PGP SIGNATURE----- # gpg: Signature made Mon 06 Mar 2023 14:00:24 GMT # gpg: using RSA key F80C006308E22CFD8A92E7980CF5572FD7FB55AF # gpg: Good signature from "Anthony PERARD <anthony.perard@gmail.com>" [marginal] # gpg: aka "Anthony PERARD <anthony.perard@citrix.com>" [marginal] # gpg: WARNING: This key is not certified with sufficiently trusted signatures! # gpg: It is not certain that the signature belongs to the owner. # Primary key fingerprint: 5379 2F71 024C 600F 778A 7161 D8D5 7199 DF83 42C8 # Subkey fingerprint: F80C 0063 08E2 2CFD 8A92 E798 0CF5 572F D7FB 55AF * tag 'pull-xen-20230306' of https://xenbits.xen.org/git-http/people/aperard/qemu-dm: hw/xen/xen_pt: fix uninitialized variable xen/pt: reserve PCI slot 2 for Intel igd-passthru Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
67128074c9
|
@ -422,6 +422,7 @@ static void pc_xen_hvm_init(MachineState *machine)
|
||||||
}
|
}
|
||||||
|
|
||||||
pc_xen_hvm_init_pci(machine);
|
pc_xen_hvm_init_pci(machine);
|
||||||
|
xen_igd_reserve_slot(pcms->bus);
|
||||||
pci_create_simple(pcms->bus, -1, "xen-platform");
|
pci_create_simple(pcms->bus, -1, "xen-platform");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -57,6 +57,7 @@
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
|
||||||
#include "hw/pci/pci.h"
|
#include "hw/pci/pci.h"
|
||||||
|
#include "hw/pci/pci_bus.h"
|
||||||
#include "hw/qdev-properties.h"
|
#include "hw/qdev-properties.h"
|
||||||
#include "hw/qdev-properties-system.h"
|
#include "hw/qdev-properties-system.h"
|
||||||
#include "hw/xen/xen.h"
|
#include "hw/xen/xen.h"
|
||||||
|
@ -780,15 +781,6 @@ static void xen_pt_realize(PCIDevice *d, Error **errp)
|
||||||
s->hostaddr.bus, s->hostaddr.slot, s->hostaddr.function,
|
s->hostaddr.bus, s->hostaddr.slot, s->hostaddr.function,
|
||||||
s->dev.devfn);
|
s->dev.devfn);
|
||||||
|
|
||||||
xen_host_pci_device_get(&s->real_device,
|
|
||||||
s->hostaddr.domain, s->hostaddr.bus,
|
|
||||||
s->hostaddr.slot, s->hostaddr.function,
|
|
||||||
errp);
|
|
||||||
if (*errp) {
|
|
||||||
error_append_hint(errp, "Failed to \"open\" the real pci device");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
s->is_virtfn = s->real_device.is_virtfn;
|
s->is_virtfn = s->real_device.is_virtfn;
|
||||||
if (s->is_virtfn) {
|
if (s->is_virtfn) {
|
||||||
XEN_PT_LOG(d, "%04x:%02x:%02x.%d is a SR-IOV Virtual Function\n",
|
XEN_PT_LOG(d, "%04x:%02x:%02x.%d is a SR-IOV Virtual Function\n",
|
||||||
|
@ -803,8 +795,10 @@ static void xen_pt_realize(PCIDevice *d, Error **errp)
|
||||||
s->io_listener = xen_pt_io_listener;
|
s->io_listener = xen_pt_io_listener;
|
||||||
|
|
||||||
/* Setup VGA bios for passthrough GFX */
|
/* Setup VGA bios for passthrough GFX */
|
||||||
if ((s->real_device.domain == 0) && (s->real_device.bus == 0) &&
|
if ((s->real_device.domain == XEN_PCI_IGD_DOMAIN) &&
|
||||||
(s->real_device.dev == 2) && (s->real_device.func == 0)) {
|
(s->real_device.bus == XEN_PCI_IGD_BUS) &&
|
||||||
|
(s->real_device.dev == XEN_PCI_IGD_DEV) &&
|
||||||
|
(s->real_device.func == XEN_PCI_IGD_FN)) {
|
||||||
if (!is_igd_vga_passthrough(&s->real_device)) {
|
if (!is_igd_vga_passthrough(&s->real_device)) {
|
||||||
error_setg(errp, "Need to enable igd-passthru if you're trying"
|
error_setg(errp, "Need to enable igd-passthru if you're trying"
|
||||||
" to passthrough IGD GFX");
|
" to passthrough IGD GFX");
|
||||||
|
@ -950,11 +944,58 @@ static void xen_pci_passthrough_instance_init(Object *obj)
|
||||||
PCI_DEVICE(obj)->cap_present |= QEMU_PCI_CAP_EXPRESS;
|
PCI_DEVICE(obj)->cap_present |= QEMU_PCI_CAP_EXPRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void xen_igd_reserve_slot(PCIBus *pci_bus)
|
||||||
|
{
|
||||||
|
if (!xen_igd_gfx_pt_enabled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
XEN_PT_LOG(0, "Reserving PCI slot 2 for IGD\n");
|
||||||
|
pci_bus->slot_reserved_mask |= XEN_PCI_IGD_SLOT_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void xen_igd_clear_slot(DeviceState *qdev, Error **errp)
|
||||||
|
{
|
||||||
|
ERRP_GUARD();
|
||||||
|
PCIDevice *pci_dev = (PCIDevice *)qdev;
|
||||||
|
XenPCIPassthroughState *s = XEN_PT_DEVICE(pci_dev);
|
||||||
|
XenPTDeviceClass *xpdc = XEN_PT_DEVICE_GET_CLASS(s);
|
||||||
|
PCIBus *pci_bus = pci_get_bus(pci_dev);
|
||||||
|
|
||||||
|
xen_host_pci_device_get(&s->real_device,
|
||||||
|
s->hostaddr.domain, s->hostaddr.bus,
|
||||||
|
s->hostaddr.slot, s->hostaddr.function,
|
||||||
|
errp);
|
||||||
|
if (*errp) {
|
||||||
|
error_append_hint(errp, "Failed to \"open\" the real pci device");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(pci_bus->slot_reserved_mask & XEN_PCI_IGD_SLOT_MASK)) {
|
||||||
|
xpdc->pci_qdev_realize(qdev, errp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_igd_vga_passthrough(&s->real_device) &&
|
||||||
|
s->real_device.domain == XEN_PCI_IGD_DOMAIN &&
|
||||||
|
s->real_device.bus == XEN_PCI_IGD_BUS &&
|
||||||
|
s->real_device.dev == XEN_PCI_IGD_DEV &&
|
||||||
|
s->real_device.func == XEN_PCI_IGD_FN &&
|
||||||
|
s->real_device.vendor_id == PCI_VENDOR_ID_INTEL) {
|
||||||
|
pci_bus->slot_reserved_mask &= ~XEN_PCI_IGD_SLOT_MASK;
|
||||||
|
XEN_PT_LOG(pci_dev, "Intel IGD found, using slot 2\n");
|
||||||
|
}
|
||||||
|
xpdc->pci_qdev_realize(qdev, errp);
|
||||||
|
}
|
||||||
|
|
||||||
static void xen_pci_passthrough_class_init(ObjectClass *klass, void *data)
|
static void xen_pci_passthrough_class_init(ObjectClass *klass, void *data)
|
||||||
{
|
{
|
||||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||||
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
||||||
|
|
||||||
|
XenPTDeviceClass *xpdc = XEN_PT_DEVICE_CLASS(klass);
|
||||||
|
xpdc->pci_qdev_realize = dc->realize;
|
||||||
|
dc->realize = xen_igd_clear_slot;
|
||||||
k->realize = xen_pt_realize;
|
k->realize = xen_pt_realize;
|
||||||
k->exit = xen_pt_unregister_device;
|
k->exit = xen_pt_unregister_device;
|
||||||
k->config_read = xen_pt_pci_read_config;
|
k->config_read = xen_pt_pci_read_config;
|
||||||
|
@ -977,6 +1018,7 @@ static const TypeInfo xen_pci_passthrough_info = {
|
||||||
.instance_size = sizeof(XenPCIPassthroughState),
|
.instance_size = sizeof(XenPCIPassthroughState),
|
||||||
.instance_finalize = xen_pci_passthrough_finalize,
|
.instance_finalize = xen_pci_passthrough_finalize,
|
||||||
.class_init = xen_pci_passthrough_class_init,
|
.class_init = xen_pci_passthrough_class_init,
|
||||||
|
.class_size = sizeof(XenPTDeviceClass),
|
||||||
.instance_init = xen_pci_passthrough_instance_init,
|
.instance_init = xen_pci_passthrough_instance_init,
|
||||||
.interfaces = (InterfaceInfo[]) {
|
.interfaces = (InterfaceInfo[]) {
|
||||||
{ INTERFACE_CONVENTIONAL_PCI_DEVICE },
|
{ INTERFACE_CONVENTIONAL_PCI_DEVICE },
|
||||||
|
|
|
@ -40,7 +40,20 @@ typedef struct XenPTReg XenPTReg;
|
||||||
#define TYPE_XEN_PT_DEVICE "xen-pci-passthrough"
|
#define TYPE_XEN_PT_DEVICE "xen-pci-passthrough"
|
||||||
OBJECT_DECLARE_SIMPLE_TYPE(XenPCIPassthroughState, XEN_PT_DEVICE)
|
OBJECT_DECLARE_SIMPLE_TYPE(XenPCIPassthroughState, XEN_PT_DEVICE)
|
||||||
|
|
||||||
|
#define XEN_PT_DEVICE_CLASS(klass) \
|
||||||
|
OBJECT_CLASS_CHECK(XenPTDeviceClass, klass, TYPE_XEN_PT_DEVICE)
|
||||||
|
#define XEN_PT_DEVICE_GET_CLASS(obj) \
|
||||||
|
OBJECT_GET_CLASS(XenPTDeviceClass, obj, TYPE_XEN_PT_DEVICE)
|
||||||
|
|
||||||
|
typedef void (*XenPTQdevRealize)(DeviceState *qdev, Error **errp);
|
||||||
|
|
||||||
|
typedef struct XenPTDeviceClass {
|
||||||
|
PCIDeviceClass parent_class;
|
||||||
|
XenPTQdevRealize pci_qdev_realize;
|
||||||
|
} XenPTDeviceClass;
|
||||||
|
|
||||||
uint32_t igd_read_opregion(XenPCIPassthroughState *s);
|
uint32_t igd_read_opregion(XenPCIPassthroughState *s);
|
||||||
|
void xen_igd_reserve_slot(PCIBus *pci_bus);
|
||||||
void igd_write_opregion(XenPCIPassthroughState *s, uint32_t val);
|
void igd_write_opregion(XenPCIPassthroughState *s, uint32_t val);
|
||||||
void xen_igd_passthrough_isa_bridge_create(XenPCIPassthroughState *s,
|
void xen_igd_passthrough_isa_bridge_create(XenPCIPassthroughState *s,
|
||||||
XenHostPCIDevice *dev);
|
XenHostPCIDevice *dev);
|
||||||
|
@ -75,6 +88,13 @@ typedef int (*xen_pt_conf_byte_read)
|
||||||
|
|
||||||
#define XEN_PCI_INTEL_OPREGION 0xfc
|
#define XEN_PCI_INTEL_OPREGION 0xfc
|
||||||
|
|
||||||
|
#define XEN_PCI_IGD_DOMAIN 0
|
||||||
|
#define XEN_PCI_IGD_BUS 0
|
||||||
|
#define XEN_PCI_IGD_DEV 2
|
||||||
|
#define XEN_PCI_IGD_FN 0
|
||||||
|
#define XEN_PCI_IGD_SLOT_MASK \
|
||||||
|
(1UL << PCI_SLOT(PCI_DEVFN(XEN_PCI_IGD_DEV, XEN_PCI_IGD_FN)))
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
XEN_PT_GRP_TYPE_HARDWIRED = 0, /* 0 Hardwired reg group */
|
XEN_PT_GRP_TYPE_HARDWIRED = 0, /* 0 Hardwired reg group */
|
||||||
XEN_PT_GRP_TYPE_EMU, /* emul reg group */
|
XEN_PT_GRP_TYPE_EMU, /* emul reg group */
|
||||||
|
|
|
@ -1924,7 +1924,7 @@ static void xen_pt_config_reg_init(XenPCIPassthroughState *s,
|
||||||
if (reg->init) {
|
if (reg->init) {
|
||||||
uint32_t host_mask, size_mask;
|
uint32_t host_mask, size_mask;
|
||||||
unsigned int offset;
|
unsigned int offset;
|
||||||
uint32_t val;
|
uint32_t val = 0;
|
||||||
|
|
||||||
/* initialize emulate register */
|
/* initialize emulate register */
|
||||||
rc = reg->init(s, reg_entry->reg,
|
rc = reg->init(s, reg_entry->reg,
|
||||||
|
|
|
@ -20,3 +20,7 @@ void xen_igd_gfx_pt_set(bool value, Error **errp)
|
||||||
error_setg(errp, "Xen PCI passthrough support not built in");
|
error_setg(errp, "Xen PCI passthrough support not built in");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void xen_igd_reserve_slot(PCIBus *pci_bus)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue