All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Durrant, Paul" <pdurrant@amazon.com>
To: "Philippe Mathieu-Daudé" <philmd@redhat.com>,
	"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>
Cc: Thomas Huth <thuth@redhat.com>,
	Stefano Stabellini <sstabellini@kernel.org>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	Paul Durrant <paul@xen.org>,
	Markus Armbruster <armbru@redhat.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Marcel Apfelbaum <marcel.apfelbaum@gmail.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Anthony Perard <anthony.perard@citrix.com>,
	"xen-devel@lists.xenproject.org" <xen-devel@lists.xenproject.org>
Subject: RE: [Xen-devel] [PATCH-for-5.0 v3 5/6] hw/pci-host/i440fx: Extract the IGD passthrough host bridge device
Date: Mon, 9 Dec 2019 10:08:04 +0000	[thread overview]
Message-ID: <1a3aea880e2640e88038e77f5bf14a13@EX13D32EUC003.ant.amazon.com> (raw)
In-Reply-To: <20191209095002.32194-6-philmd@redhat.com>

> -----Original Message-----
> From: Xen-devel <xen-devel-bounces@lists.xenproject.org> On Behalf Of
> Philippe Mathieu-Daudé
> Sent: 09 December 2019 09:50
> To: qemu-devel@nongnu.org
> Cc: Thomas Huth <thuth@redhat.com>; Stefano Stabellini
> <sstabellini@kernel.org>; Michael S. Tsirkin <mst@redhat.com>; Paul
> Durrant <paul@xen.org>; Markus Armbruster <armbru@redhat.com>; Alex
> Williamson <alex.williamson@redhat.com>; Marcel Apfelbaum
> <marcel.apfelbaum@gmail.com>; Paolo Bonzini <pbonzini@redhat.com>; Anthony
> Perard <anthony.perard@citrix.com>; xen-devel@lists.xenproject.org;
> Philippe Mathieu-Daudé <philmd@redhat.com>
> Subject: [Xen-devel] [PATCH-for-5.0 v3 5/6] hw/pci-host/i440fx: Extract
> the IGD passthrough host bridge device
> 
> We can use a i440FX without the IGD passthrough host bridge.
> Extract it into a new file, 'hw/pci-host/igd_pt.c'.
> 
> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>

Acked-by: Paul Durrant <paul@xen.org>

> ---
> v3:
> - Rename as 'xen_igd_pt.c' (Alex Williamson)
> - Add an entry in MAINTAINERS::Xen
> ---
>  hw/pci-host/i440fx.c      |  84 --------------------------
>  hw/pci-host/xen_igd_pt.c  | 120 ++++++++++++++++++++++++++++++++++++++
>  MAINTAINERS               |   1 +
>  hw/pci-host/Makefile.objs |   1 +
>  4 files changed, 122 insertions(+), 84 deletions(-)
>  create mode 100644 hw/pci-host/xen_igd_pt.c
> 
> diff --git a/hw/pci-host/i440fx.c b/hw/pci-host/i440fx.c
> index 414138595b..bae7b42327 100644
> --- a/hw/pci-host/i440fx.c
> +++ b/hw/pci-host/i440fx.c
> @@ -368,89 +368,6 @@ static const TypeInfo i440fx_info = {
>      },
>  };
> 
> -/* IGD Passthrough Host Bridge. */
> -typedef struct {
> -    uint8_t offset;
> -    uint8_t len;
> -} IGDHostInfo;
> -
> -/* Here we just expose minimal host bridge offset subset. */
> -static const IGDHostInfo igd_host_bridge_infos[] = {
> -    {PCI_REVISION_ID,         2},
> -    {PCI_SUBSYSTEM_VENDOR_ID, 2},
> -    {PCI_SUBSYSTEM_ID,        2},
> -    {0x50,                    2}, /* SNB: processor graphics control
> register */
> -    {0x52,                    2}, /* processor graphics control register
> */
> -    {0xa4,                    4}, /* SNB: graphics base of stolen memory
> */
> -    {0xa8,                    4}, /* SNB: base of GTT stolen memory */
> -};
> -
> -static void host_pci_config_read(int pos, int len, uint32_t *val, Error
> **errp)
> -{
> -    int rc, config_fd;
> -    /* Access real host bridge. */
> -    char *path =
> g_strdup_printf("/sys/bus/pci/devices/%04x:%02x:%02x.%d/%s",
> -                                 0, 0, 0, 0, "config");
> -
> -    config_fd = open(path, O_RDWR);
> -    if (config_fd < 0) {
> -        error_setg_errno(errp, errno, "Failed to open: %s", path);
> -        goto out;
> -    }
> -
> -    if (lseek(config_fd, pos, SEEK_SET) != pos) {
> -        error_setg_errno(errp, errno, "Failed to seek: %s", path);
> -        goto out_close_fd;
> -    }
> -
> -    do {
> -        rc = read(config_fd, (uint8_t *)val, len);
> -    } while (rc < 0 && (errno == EINTR || errno == EAGAIN));
> -    if (rc != len) {
> -        error_setg_errno(errp, errno, "Failed to read: %s", path);
> -    }
> -
> -out_close_fd:
> -    close(config_fd);
> -out:
> -    g_free(path);
> -}
> -
> -static void igd_pt_i440fx_realize(PCIDevice *pci_dev, Error **errp)
> -{
> -    uint32_t val = 0;
> -    size_t i;
> -    int pos, len;
> -    Error *local_err = NULL;
> -
> -    for (i = 0; i < ARRAY_SIZE(igd_host_bridge_infos); i++) {
> -        pos = igd_host_bridge_infos[i].offset;
> -        len = igd_host_bridge_infos[i].len;
> -        host_pci_config_read(pos, len, &val, &local_err);
> -        if (local_err) {
> -            error_propagate(errp, local_err);
> -            return;
> -        }
> -        pci_default_write_config(pci_dev, pos, val, len);
> -    }
> -}
> -
> -static void igd_passthrough_i440fx_class_init(ObjectClass *klass, void
> *data)
> -{
> -    DeviceClass *dc = DEVICE_CLASS(klass);
> -    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
> -
> -    k->realize = igd_pt_i440fx_realize;
> -    dc->desc = "IGD Passthrough Host bridge";
> -}
> -
> -static const TypeInfo igd_passthrough_i440fx_info = {
> -    .name          = TYPE_IGD_PASSTHROUGH_I440FX_PCI_DEVICE,
> -    .parent        = TYPE_I440FX_PCI_DEVICE,
> -    .instance_size = sizeof(PCII440FXState),
> -    .class_init    = igd_passthrough_i440fx_class_init,
> -};
> -
>  static const char *i440fx_pcihost_root_bus_path(PCIHostState
> *host_bridge,
>                                                  PCIBus *rootbus)
>  {
> @@ -495,7 +412,6 @@ static const TypeInfo i440fx_pcihost_info = {
>  static void i440fx_register_types(void)
>  {
>      type_register_static(&i440fx_info);
> -    type_register_static(&igd_passthrough_i440fx_info);
>      type_register_static(&i440fx_pcihost_info);
>  }
> 
> diff --git a/hw/pci-host/xen_igd_pt.c b/hw/pci-host/xen_igd_pt.c
> new file mode 100644
> index 0000000000..efcc9347ff
> --- /dev/null
> +++ b/hw/pci-host/xen_igd_pt.c
> @@ -0,0 +1,120 @@
> +/*
> + * QEMU Intel IGD Passthrough Host Bridge Emulation
> + *
> + * Copyright (c) 2006 Fabrice Bellard
> + *
> + * SPDX-License-Identifier: MIT
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining
> a copy
> + * of this software and associated documentation files (the "Software"),
> to deal
> + * in the Software without restriction, including without limitation the
> rights
> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or
> sell
> + * copies of the Software, and to permit persons to whom the Software is
> + * furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be
> included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
> SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
> OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> ARISING FROM,
> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> IN
> + * THE SOFTWARE.
> + */
> +
> +#include "qemu/osdep.h"
> +#include "hw/pci/pci.h"
> +#include "hw/pci/pci_host.h"
> +#include "hw/pci-host/i440fx.h"
> +#include "qapi/error.h"
> +
> +typedef struct {
> +    uint8_t offset;
> +    uint8_t len;
> +} IGDHostInfo;
> +
> +/* Here we just expose minimal host bridge offset subset. */
> +static const IGDHostInfo igd_host_bridge_infos[] = {
> +    {PCI_REVISION_ID,         2},
> +    {PCI_SUBSYSTEM_VENDOR_ID, 2},
> +    {PCI_SUBSYSTEM_ID,        2},
> +    {0x50,                    2}, /* SNB: processor graphics control
> register */
> +    {0x52,                    2}, /* processor graphics control register
> */
> +    {0xa4,                    4}, /* SNB: graphics base of stolen memory
> */
> +    {0xa8,                    4}, /* SNB: base of GTT stolen memory */
> +};
> +
> +static void host_pci_config_read(int pos, int len, uint32_t *val, Error
> **errp)
> +{
> +    int rc, config_fd;
> +    /* Access real host bridge. */
> +    char *path =
> g_strdup_printf("/sys/bus/pci/devices/%04x:%02x:%02x.%d/%s",
> +                                 0, 0, 0, 0, "config");
> +
> +    config_fd = open(path, O_RDWR);
> +    if (config_fd < 0) {
> +        error_setg_errno(errp, errno, "Failed to open: %s", path);
> +        goto out;
> +    }
> +
> +    if (lseek(config_fd, pos, SEEK_SET) != pos) {
> +        error_setg_errno(errp, errno, "Failed to seek: %s", path);
> +        goto out_close_fd;
> +    }
> +
> +    do {
> +        rc = read(config_fd, (uint8_t *)val, len);
> +    } while (rc < 0 && (errno == EINTR || errno == EAGAIN));
> +    if (rc != len) {
> +        error_setg_errno(errp, errno, "Failed to read: %s", path);
> +    }
> +
> + out_close_fd:
> +    close(config_fd);
> + out:
> +    g_free(path);
> +}
> +
> +static void igd_pt_i440fx_realize(PCIDevice *pci_dev, Error **errp)
> +{
> +    uint32_t val = 0;
> +    size_t i;
> +    int pos, len;
> +    Error *local_err = NULL;
> +
> +    for (i = 0; i < ARRAY_SIZE(igd_host_bridge_infos); i++) {
> +        pos = igd_host_bridge_infos[i].offset;
> +        len = igd_host_bridge_infos[i].len;
> +        host_pci_config_read(pos, len, &val, &local_err);
> +        if (local_err) {
> +            error_propagate(errp, local_err);
> +            return;
> +        }
> +        pci_default_write_config(pci_dev, pos, val, len);
> +    }
> +}
> +
> +static void igd_passthrough_i440fx_class_init(ObjectClass *klass, void
> *data)
> +{
> +    DeviceClass *dc = DEVICE_CLASS(klass);
> +    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
> +
> +    k->realize = igd_pt_i440fx_realize;
> +    dc->desc = "IGD Passthrough Host bridge";
> +}
> +
> +static const TypeInfo igd_passthrough_i440fx_info = {
> +    .name          = TYPE_IGD_PASSTHROUGH_I440FX_PCI_DEVICE,
> +    .parent        = TYPE_I440FX_PCI_DEVICE,
> +    .instance_size = sizeof(PCII440FXState),
> +    .class_init    = igd_passthrough_i440fx_class_init,
> +};
> +
> +static void igd_pt_i440fx_register_types(void)
> +{
> +    type_register_static(&igd_passthrough_i440fx_info);
> +}
> +
> +type_init(igd_pt_i440fx_register_types)
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 5e5e3e52d6..62bcf5e94e 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -419,6 +419,7 @@ F: hw/block/dataplane/xen*
>  F: hw/xen/
>  F: hw/xenpv/
>  F: hw/i386/xen/
> +F: hw/pci-host/xen_igd_pt.c
>  F: include/hw/block/dataplane/xen*
>  F: include/hw/xen/
>  F: include/sysemu/xen-mapcache.h
> diff --git a/hw/pci-host/Makefile.objs b/hw/pci-host/Makefile.objs
> index efd752b766..fa6d1556c0 100644
> --- a/hw/pci-host/Makefile.objs
> +++ b/hw/pci-host/Makefile.objs
> @@ -14,6 +14,7 @@ common-obj-$(CONFIG_VERSATILE_PCI) += versatile.o
>  common-obj-$(CONFIG_PCI_SABRE) += sabre.o
>  common-obj-$(CONFIG_FULONG) += bonito.o
>  common-obj-$(CONFIG_PCI_I440FX) += i440fx.o
> +common-obj-$(CONFIG_PCI_I440FX) += xen_igd_pt.o
>  common-obj-$(CONFIG_PCI_EXPRESS_Q35) += q35.o
>  common-obj-$(CONFIG_PCI_EXPRESS_GENERIC_BRIDGE) += gpex.o
>  common-obj-$(CONFIG_PCI_EXPRESS_XILINX) += xilinx-pcie.o
> --
> 2.21.0
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xenproject.org
> https://lists.xenproject.org/mailman/listinfo/xen-devel

WARNING: multiple messages have this Message-ID (diff)
From: "Durrant, Paul" <pdurrant@amazon.com>
To: "Philippe Mathieu-Daudé" <philmd@redhat.com>,
	"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>
Cc: Thomas Huth <thuth@redhat.com>,
	Stefano Stabellini <sstabellini@kernel.org>,
	Paul Durrant <paul@xen.org>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	Markus Armbruster <armbru@redhat.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Marcel Apfelbaum <marcel.apfelbaum@gmail.com>,
	"xen-devel@lists.xenproject.org" <xen-devel@lists.xenproject.org>,
	Anthony Perard <anthony.perard@citrix.com>,
	Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [Xen-devel] [PATCH-for-5.0 v3 5/6] hw/pci-host/i440fx: Extract the IGD passthrough host bridge device
Date: Mon, 9 Dec 2019 10:08:04 +0000	[thread overview]
Message-ID: <1a3aea880e2640e88038e77f5bf14a13@EX13D32EUC003.ant.amazon.com> (raw)
In-Reply-To: <20191209095002.32194-6-philmd@redhat.com>

> -----Original Message-----
> From: Xen-devel <xen-devel-bounces@lists.xenproject.org> On Behalf Of
> Philippe Mathieu-Daudé
> Sent: 09 December 2019 09:50
> To: qemu-devel@nongnu.org
> Cc: Thomas Huth <thuth@redhat.com>; Stefano Stabellini
> <sstabellini@kernel.org>; Michael S. Tsirkin <mst@redhat.com>; Paul
> Durrant <paul@xen.org>; Markus Armbruster <armbru@redhat.com>; Alex
> Williamson <alex.williamson@redhat.com>; Marcel Apfelbaum
> <marcel.apfelbaum@gmail.com>; Paolo Bonzini <pbonzini@redhat.com>; Anthony
> Perard <anthony.perard@citrix.com>; xen-devel@lists.xenproject.org;
> Philippe Mathieu-Daudé <philmd@redhat.com>
> Subject: [Xen-devel] [PATCH-for-5.0 v3 5/6] hw/pci-host/i440fx: Extract
> the IGD passthrough host bridge device
> 
> We can use a i440FX without the IGD passthrough host bridge.
> Extract it into a new file, 'hw/pci-host/igd_pt.c'.
> 
> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>

Acked-by: Paul Durrant <paul@xen.org>

> ---
> v3:
> - Rename as 'xen_igd_pt.c' (Alex Williamson)
> - Add an entry in MAINTAINERS::Xen
> ---
>  hw/pci-host/i440fx.c      |  84 --------------------------
>  hw/pci-host/xen_igd_pt.c  | 120 ++++++++++++++++++++++++++++++++++++++
>  MAINTAINERS               |   1 +
>  hw/pci-host/Makefile.objs |   1 +
>  4 files changed, 122 insertions(+), 84 deletions(-)
>  create mode 100644 hw/pci-host/xen_igd_pt.c
> 
> diff --git a/hw/pci-host/i440fx.c b/hw/pci-host/i440fx.c
> index 414138595b..bae7b42327 100644
> --- a/hw/pci-host/i440fx.c
> +++ b/hw/pci-host/i440fx.c
> @@ -368,89 +368,6 @@ static const TypeInfo i440fx_info = {
>      },
>  };
> 
> -/* IGD Passthrough Host Bridge. */
> -typedef struct {
> -    uint8_t offset;
> -    uint8_t len;
> -} IGDHostInfo;
> -
> -/* Here we just expose minimal host bridge offset subset. */
> -static const IGDHostInfo igd_host_bridge_infos[] = {
> -    {PCI_REVISION_ID,         2},
> -    {PCI_SUBSYSTEM_VENDOR_ID, 2},
> -    {PCI_SUBSYSTEM_ID,        2},
> -    {0x50,                    2}, /* SNB: processor graphics control
> register */
> -    {0x52,                    2}, /* processor graphics control register
> */
> -    {0xa4,                    4}, /* SNB: graphics base of stolen memory
> */
> -    {0xa8,                    4}, /* SNB: base of GTT stolen memory */
> -};
> -
> -static void host_pci_config_read(int pos, int len, uint32_t *val, Error
> **errp)
> -{
> -    int rc, config_fd;
> -    /* Access real host bridge. */
> -    char *path =
> g_strdup_printf("/sys/bus/pci/devices/%04x:%02x:%02x.%d/%s",
> -                                 0, 0, 0, 0, "config");
> -
> -    config_fd = open(path, O_RDWR);
> -    if (config_fd < 0) {
> -        error_setg_errno(errp, errno, "Failed to open: %s", path);
> -        goto out;
> -    }
> -
> -    if (lseek(config_fd, pos, SEEK_SET) != pos) {
> -        error_setg_errno(errp, errno, "Failed to seek: %s", path);
> -        goto out_close_fd;
> -    }
> -
> -    do {
> -        rc = read(config_fd, (uint8_t *)val, len);
> -    } while (rc < 0 && (errno == EINTR || errno == EAGAIN));
> -    if (rc != len) {
> -        error_setg_errno(errp, errno, "Failed to read: %s", path);
> -    }
> -
> -out_close_fd:
> -    close(config_fd);
> -out:
> -    g_free(path);
> -}
> -
> -static void igd_pt_i440fx_realize(PCIDevice *pci_dev, Error **errp)
> -{
> -    uint32_t val = 0;
> -    size_t i;
> -    int pos, len;
> -    Error *local_err = NULL;
> -
> -    for (i = 0; i < ARRAY_SIZE(igd_host_bridge_infos); i++) {
> -        pos = igd_host_bridge_infos[i].offset;
> -        len = igd_host_bridge_infos[i].len;
> -        host_pci_config_read(pos, len, &val, &local_err);
> -        if (local_err) {
> -            error_propagate(errp, local_err);
> -            return;
> -        }
> -        pci_default_write_config(pci_dev, pos, val, len);
> -    }
> -}
> -
> -static void igd_passthrough_i440fx_class_init(ObjectClass *klass, void
> *data)
> -{
> -    DeviceClass *dc = DEVICE_CLASS(klass);
> -    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
> -
> -    k->realize = igd_pt_i440fx_realize;
> -    dc->desc = "IGD Passthrough Host bridge";
> -}
> -
> -static const TypeInfo igd_passthrough_i440fx_info = {
> -    .name          = TYPE_IGD_PASSTHROUGH_I440FX_PCI_DEVICE,
> -    .parent        = TYPE_I440FX_PCI_DEVICE,
> -    .instance_size = sizeof(PCII440FXState),
> -    .class_init    = igd_passthrough_i440fx_class_init,
> -};
> -
>  static const char *i440fx_pcihost_root_bus_path(PCIHostState
> *host_bridge,
>                                                  PCIBus *rootbus)
>  {
> @@ -495,7 +412,6 @@ static const TypeInfo i440fx_pcihost_info = {
>  static void i440fx_register_types(void)
>  {
>      type_register_static(&i440fx_info);
> -    type_register_static(&igd_passthrough_i440fx_info);
>      type_register_static(&i440fx_pcihost_info);
>  }
> 
> diff --git a/hw/pci-host/xen_igd_pt.c b/hw/pci-host/xen_igd_pt.c
> new file mode 100644
> index 0000000000..efcc9347ff
> --- /dev/null
> +++ b/hw/pci-host/xen_igd_pt.c
> @@ -0,0 +1,120 @@
> +/*
> + * QEMU Intel IGD Passthrough Host Bridge Emulation
> + *
> + * Copyright (c) 2006 Fabrice Bellard
> + *
> + * SPDX-License-Identifier: MIT
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining
> a copy
> + * of this software and associated documentation files (the "Software"),
> to deal
> + * in the Software without restriction, including without limitation the
> rights
> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or
> sell
> + * copies of the Software, and to permit persons to whom the Software is
> + * furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be
> included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
> SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
> OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> ARISING FROM,
> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> IN
> + * THE SOFTWARE.
> + */
> +
> +#include "qemu/osdep.h"
> +#include "hw/pci/pci.h"
> +#include "hw/pci/pci_host.h"
> +#include "hw/pci-host/i440fx.h"
> +#include "qapi/error.h"
> +
> +typedef struct {
> +    uint8_t offset;
> +    uint8_t len;
> +} IGDHostInfo;
> +
> +/* Here we just expose minimal host bridge offset subset. */
> +static const IGDHostInfo igd_host_bridge_infos[] = {
> +    {PCI_REVISION_ID,         2},
> +    {PCI_SUBSYSTEM_VENDOR_ID, 2},
> +    {PCI_SUBSYSTEM_ID,        2},
> +    {0x50,                    2}, /* SNB: processor graphics control
> register */
> +    {0x52,                    2}, /* processor graphics control register
> */
> +    {0xa4,                    4}, /* SNB: graphics base of stolen memory
> */
> +    {0xa8,                    4}, /* SNB: base of GTT stolen memory */
> +};
> +
> +static void host_pci_config_read(int pos, int len, uint32_t *val, Error
> **errp)
> +{
> +    int rc, config_fd;
> +    /* Access real host bridge. */
> +    char *path =
> g_strdup_printf("/sys/bus/pci/devices/%04x:%02x:%02x.%d/%s",
> +                                 0, 0, 0, 0, "config");
> +
> +    config_fd = open(path, O_RDWR);
> +    if (config_fd < 0) {
> +        error_setg_errno(errp, errno, "Failed to open: %s", path);
> +        goto out;
> +    }
> +
> +    if (lseek(config_fd, pos, SEEK_SET) != pos) {
> +        error_setg_errno(errp, errno, "Failed to seek: %s", path);
> +        goto out_close_fd;
> +    }
> +
> +    do {
> +        rc = read(config_fd, (uint8_t *)val, len);
> +    } while (rc < 0 && (errno == EINTR || errno == EAGAIN));
> +    if (rc != len) {
> +        error_setg_errno(errp, errno, "Failed to read: %s", path);
> +    }
> +
> + out_close_fd:
> +    close(config_fd);
> + out:
> +    g_free(path);
> +}
> +
> +static void igd_pt_i440fx_realize(PCIDevice *pci_dev, Error **errp)
> +{
> +    uint32_t val = 0;
> +    size_t i;
> +    int pos, len;
> +    Error *local_err = NULL;
> +
> +    for (i = 0; i < ARRAY_SIZE(igd_host_bridge_infos); i++) {
> +        pos = igd_host_bridge_infos[i].offset;
> +        len = igd_host_bridge_infos[i].len;
> +        host_pci_config_read(pos, len, &val, &local_err);
> +        if (local_err) {
> +            error_propagate(errp, local_err);
> +            return;
> +        }
> +        pci_default_write_config(pci_dev, pos, val, len);
> +    }
> +}
> +
> +static void igd_passthrough_i440fx_class_init(ObjectClass *klass, void
> *data)
> +{
> +    DeviceClass *dc = DEVICE_CLASS(klass);
> +    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
> +
> +    k->realize = igd_pt_i440fx_realize;
> +    dc->desc = "IGD Passthrough Host bridge";
> +}
> +
> +static const TypeInfo igd_passthrough_i440fx_info = {
> +    .name          = TYPE_IGD_PASSTHROUGH_I440FX_PCI_DEVICE,
> +    .parent        = TYPE_I440FX_PCI_DEVICE,
> +    .instance_size = sizeof(PCII440FXState),
> +    .class_init    = igd_passthrough_i440fx_class_init,
> +};
> +
> +static void igd_pt_i440fx_register_types(void)
> +{
> +    type_register_static(&igd_passthrough_i440fx_info);
> +}
> +
> +type_init(igd_pt_i440fx_register_types)
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 5e5e3e52d6..62bcf5e94e 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -419,6 +419,7 @@ F: hw/block/dataplane/xen*
>  F: hw/xen/
>  F: hw/xenpv/
>  F: hw/i386/xen/
> +F: hw/pci-host/xen_igd_pt.c
>  F: include/hw/block/dataplane/xen*
>  F: include/hw/xen/
>  F: include/sysemu/xen-mapcache.h
> diff --git a/hw/pci-host/Makefile.objs b/hw/pci-host/Makefile.objs
> index efd752b766..fa6d1556c0 100644
> --- a/hw/pci-host/Makefile.objs
> +++ b/hw/pci-host/Makefile.objs
> @@ -14,6 +14,7 @@ common-obj-$(CONFIG_VERSATILE_PCI) += versatile.o
>  common-obj-$(CONFIG_PCI_SABRE) += sabre.o
>  common-obj-$(CONFIG_FULONG) += bonito.o
>  common-obj-$(CONFIG_PCI_I440FX) += i440fx.o
> +common-obj-$(CONFIG_PCI_I440FX) += xen_igd_pt.o
>  common-obj-$(CONFIG_PCI_EXPRESS_Q35) += q35.o
>  common-obj-$(CONFIG_PCI_EXPRESS_GENERIC_BRIDGE) += gpex.o
>  common-obj-$(CONFIG_PCI_EXPRESS_XILINX) += xilinx-pcie.o
> --
> 2.21.0
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xenproject.org
> https://lists.xenproject.org/mailman/listinfo/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

  reply	other threads:[~2019-12-09 13:40 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-09  9:49 [PATCH-for-5.0 v3 0/6] hw/pci-host: Add Kconfig selector for IGD PCIe pass-through Philippe Mathieu-Daudé
2019-12-09  9:49 ` [Xen-devel] " Philippe Mathieu-Daudé
2019-12-09  9:49 ` [PATCH-for-5.0 v3 1/6] hw/pci-host/i440fx: Correct the header description Philippe Mathieu-Daudé
2019-12-09  9:49   ` [Xen-devel] " Philippe Mathieu-Daudé
2019-12-09 10:02   ` Thomas Huth
2019-12-09 10:02     ` [Xen-devel] " Thomas Huth
2019-12-18 11:57     ` Laurent Vivier
2019-12-18 11:57       ` [Xen-devel] " Laurent Vivier
2019-12-09  9:49 ` [PATCH-for-5.0 v3 2/6] hw/pci-host/i440fx: Extract PCII440FXState to "hw/pci-host/i440fx.h" Philippe Mathieu-Daudé
2019-12-09  9:49   ` [Xen-devel] " Philippe Mathieu-Daudé
2019-12-09 10:03   ` Thomas Huth
2019-12-09 10:03     ` [Xen-devel] " Thomas Huth
2019-12-09  9:49 ` [PATCH-for-5.0 v3 3/6] hw/pci-host/i440fx: Use size_t to iterate over ARRAY_SIZE() Philippe Mathieu-Daudé
2019-12-09  9:49   ` [Xen-devel] " Philippe Mathieu-Daudé
2019-12-09 10:05   ` Thomas Huth
2019-12-09 10:05     ` [Xen-devel] " Thomas Huth
2019-12-18 11:57     ` Laurent Vivier
2019-12-18 11:57       ` [Xen-devel] " Laurent Vivier
2019-12-18 12:01       ` Paolo Bonzini
2019-12-18 12:01         ` [Xen-devel] " Paolo Bonzini
2019-12-18 12:31         ` Laurent Vivier
2019-12-18 12:31           ` [Xen-devel] " Laurent Vivier
2019-12-09  9:50 ` [PATCH-for-5.0 v3 4/6] hw/pci-host/i440fx: Use definitions instead of magic values Philippe Mathieu-Daudé
2019-12-09  9:50   ` [Xen-devel] " Philippe Mathieu-Daudé
2019-12-09 10:08   ` Thomas Huth
2019-12-09 10:08     ` [Xen-devel] " Thomas Huth
2019-12-09  9:50 ` [PATCH-for-5.0 v3 5/6] hw/pci-host/i440fx: Extract the IGD passthrough host bridge device Philippe Mathieu-Daudé
2019-12-09  9:50   ` [Xen-devel] " Philippe Mathieu-Daudé
2019-12-09 10:08   ` Durrant, Paul [this message]
2019-12-09 10:08     ` Durrant, Paul
2019-12-09  9:50 ` [PATCH-for-5.0 v3 6/6] hw/pci-host: Add Kconfig entry to select the IGD Passthrough Host Bridge Philippe Mathieu-Daudé
2019-12-09  9:50   ` [Xen-devel] " Philippe Mathieu-Daudé
2019-12-09 10:10   ` Durrant, Paul
2019-12-09 10:10     ` Durrant, Paul
2019-12-09 10:42     ` Paolo Bonzini
2019-12-09 10:42       ` Paolo Bonzini
2019-12-09 10:56       ` Philippe Mathieu-Daudé
2019-12-09 10:56         ` Philippe Mathieu-Daudé
2019-12-09 11:12         ` Paolo Bonzini
2019-12-09 11:12           ` Paolo Bonzini
2019-12-09 10:39   ` Paolo Bonzini
2019-12-09 10:39     ` [Xen-devel] " Paolo Bonzini
2019-12-09 18:39 ` [PATCH-for-5.0 v3 0/6] hw/pci-host: Add Kconfig selector for IGD PCIe pass-through no-reply
2019-12-09 18:39   ` [Xen-devel] " no-reply
2019-12-09 18:49 ` no-reply
2019-12-09 18:49   ` [Xen-devel] " no-reply

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=1a3aea880e2640e88038e77f5bf14a13@EX13D32EUC003.ant.amazon.com \
    --to=pdurrant@amazon.com \
    --cc=alex.williamson@redhat.com \
    --cc=anthony.perard@citrix.com \
    --cc=armbru@redhat.com \
    --cc=marcel.apfelbaum@gmail.com \
    --cc=mst@redhat.com \
    --cc=paul@xen.org \
    --cc=pbonzini@redhat.com \
    --cc=philmd@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=sstabellini@kernel.org \
    --cc=thuth@redhat.com \
    --cc=xen-devel@lists.xenproject.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.