From: Igor Mammedov <imammedo@redhat.com>
To: Jean-Philippe Brucker <jean-philippe@linaro.org>
Cc: peter.maydell@linaro.org, ehabkost@redhat.com,
shannon.zhaosl@gmail.com, mst@redhat.com,
richard.henderson@linaro.org, qemu-devel@nongnu.org,
eric.auger@redhat.com, qemu-arm@nongnu.org,
marcel.apfelbaum@gmail.com, pbonzini@redhat.com
Subject: Re: [PATCH 2/6] hw/acpi: Add VIOT table
Date: Tue, 10 Aug 2021 11:22:27 +0200 [thread overview]
Message-ID: <20210810112227.05bfbd9b@redhat.com> (raw)
In-Reply-To: <20210810084505.2257983-3-jean-philippe@linaro.org>
On Tue, 10 Aug 2021 10:45:02 +0200
Jean-Philippe Brucker <jean-philippe@linaro.org> wrote:
> Add a function that generates a Virtual I/O Translation table (VIOT),
> describing the topology of paravirtual IOMMUs. The table is created when
> instantiating a virtio-iommu device. It contains a virtio-iommu node and
> PCI Range nodes for endpoints managed by the IOMMU. By default, a single
> node describes all PCI devices. When passing the "default_bus_bypass_iommu"
> machine option and "bypass_iommu" PXB option, only buses that do not
> bypass the IOMMU are described by PCI Range nodes.
>
> Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
using packed structures for composing ACPI tables is discouraged,
pls use build_append_int_noprefix() API instead. You can look at
build_amd_iommu() as an example.
PS:
Also note field comments format.
/it should be verbatim copy of entry name from respective table in spec/
> ---
> hw/acpi/viot.h | 13 +++++++
> hw/acpi/viot.c | 82 +++++++++++++++++++++++++++++++++++++++++++++
> hw/acpi/Kconfig | 4 +++
> hw/acpi/meson.build | 1 +
> 4 files changed, 100 insertions(+)
> create mode 100644 hw/acpi/viot.h
> create mode 100644 hw/acpi/viot.c
>
> diff --git a/hw/acpi/viot.h b/hw/acpi/viot.h
> new file mode 100644
> index 0000000000..4cef29a640
> --- /dev/null
> +++ b/hw/acpi/viot.h
> @@ -0,0 +1,13 @@
> +/*
> + * ACPI Virtual I/O Translation Table implementation
> + *
> + * SPDX-License-Identifier: GPL-2.0-or-later
> + */
> +#ifndef VIOT_H
> +#define VIOT_H
> +
> +void build_viot(GArray *table_data, BIOSLinker *linker,
> + uint16_t virtio_iommu_bdf, const char *oem_id,
> + const char *oem_table_id);
> +
> +#endif /* VIOT_H */
> diff --git a/hw/acpi/viot.c b/hw/acpi/viot.c
> new file mode 100644
> index 0000000000..5cd10e9553
> --- /dev/null
> +++ b/hw/acpi/viot.c
> @@ -0,0 +1,82 @@
> +/*
> + * ACPI Virtual I/O Translation table implementation
> + *
> + * SPDX-License-Identifier: GPL-2.0-or-later
> + */
> +#include "qemu/osdep.h"
> +#include "hw/acpi/acpi.h"
> +#include "hw/acpi/aml-build.h"
> +#include "hw/acpi/viot.h"
> +#include "hw/pci/pci.h"
> +#include "hw/pci/pci_host.h"
> +
> +/* Build PCI range for a given PCI host bridge */
> +static int viot_host_bridges(Object *obj, void *opaque)
> +{
> + GArray *pci_range_blob = opaque;
> +
> + if (object_dynamic_cast(obj, TYPE_PCI_HOST_BRIDGE)) {
> + PCIBus *bus = PCI_HOST_BRIDGE(obj)->bus;
> +
> + if (bus && !pci_bus_bypass_iommu(bus)) {
> + int min_bus, max_bus;
> +
> + pci_bus_range(bus, &min_bus, &max_bus);
> +
> + AcpiViotPciRange pci_range = {
> + .type = ACPI_VIOT_NODE_PCI_RANGE,
> + .length = cpu_to_le16(sizeof(pci_range)),
> + .bdf_start = cpu_to_le16(PCI_BUILD_BDF(min_bus, 0)),
> + .bdf_end = cpu_to_le16(PCI_BUILD_BDF(max_bus, 0xff)),
> + .endpoint_start = cpu_to_le32(PCI_BUILD_BDF(min_bus, 0)),
> + };
> +
> + g_array_append_val(pci_range_blob, pci_range);
> + }
> + }
> +
> + return 0;
> +}
> +
> +/*
> + * Generate a VIOT table with one PCI-based virtio-iommu that manages PCI
> + * endpoints.
> + */
> +void build_viot(GArray *table_data, BIOSLinker *linker,
> + uint16_t virtio_iommu_bdf, const char *oem_id,
> + const char *oem_table_id)
> +{
> + int i;
> + AcpiViot *viot;
> + AcpiViotPciRange *pci_range;
> + AcpiViotVirtioIommuPci *viommu;
> + int viommu_off = sizeof(*viot);
> + int viot_start = table_data->len;
> + GArray *pci_ranges = g_array_new(false, true, sizeof(*pci_range));
> +
> + viot = acpi_data_push(table_data, sizeof(*viot));
> + viot->node_offset = cpu_to_le16(viommu_off);
> +
> + viommu = acpi_data_push(table_data, sizeof(*viommu));
> + viommu->type = ACPI_VIOT_NODE_VIRTIO_IOMMU_PCI;
> + viommu->length = cpu_to_le16(sizeof(*viommu));
> + viommu->bdf = cpu_to_le16(virtio_iommu_bdf);
> +
> + /* Build the list of PCI ranges that this viommu manages */
> + object_child_foreach_recursive(object_get_root(), viot_host_bridges,
> + pci_ranges);
> +
> + for (i = 0; i < pci_ranges->len; i++) {
> + pci_range = &g_array_index(pci_ranges, AcpiViotPciRange, i);
> + pci_range->output_node = cpu_to_le16(viommu_off);
> + }
> + viot->node_count = cpu_to_le16(pci_ranges->len + 1);
> +
> + g_array_append_vals(table_data, pci_ranges->data,
> + pci_ranges->len * sizeof(*pci_range));
> + g_array_free(pci_ranges, true);
> +
> + build_header(linker, table_data, (void *)(table_data->data + viot_start),
> + "VIOT", table_data->len - viot_start, 0, oem_id, oem_table_id);
> +}
> +
> diff --git a/hw/acpi/Kconfig b/hw/acpi/Kconfig
> index cfc4ede8d9..abad79c103 100644
> --- a/hw/acpi/Kconfig
> +++ b/hw/acpi/Kconfig
> @@ -41,6 +41,10 @@ config ACPI_VMGENID
> default y
> depends on PC
>
> +config ACPI_VIOT
> + bool
> + depends on ACPI
> +
> config ACPI_HW_REDUCED
> bool
> select ACPI
> diff --git a/hw/acpi/meson.build b/hw/acpi/meson.build
> index 29f804d13e..a510988b27 100644
> --- a/hw/acpi/meson.build
> +++ b/hw/acpi/meson.build
> @@ -16,6 +16,7 @@ acpi_ss.add(when: 'CONFIG_ACPI_HW_REDUCED', if_true: files('generic_event_device
> acpi_ss.add(when: 'CONFIG_ACPI_HMAT', if_true: files('hmat.c'))
> acpi_ss.add(when: 'CONFIG_ACPI_APEI', if_true: files('ghes.c'), if_false: files('ghes-stub.c'))
> acpi_ss.add(when: 'CONFIG_ACPI_X86', if_true: files('piix4.c', 'pcihp.c'))
> +acpi_ss.add(when: 'CONFIG_ACPI_VIOT', if_true: files('viot.c'))
> acpi_ss.add(when: 'CONFIG_ACPI_X86_ICH', if_true: files('ich9.c', 'tco.c'))
> acpi_ss.add(when: 'CONFIG_IPMI', if_true: files('ipmi.c'), if_false: files('ipmi-stub.c'))
> acpi_ss.add(when: 'CONFIG_PC', if_false: files('acpi-x86-stub.c'))
WARNING: multiple messages have this Message-ID (diff)
From: Igor Mammedov <imammedo@redhat.com>
To: Jean-Philippe Brucker <jean-philippe@linaro.org>
Cc: peter.maydell@linaro.org, ehabkost@redhat.com,
shannon.zhaosl@gmail.com, mst@redhat.com,
richard.henderson@linaro.org, qemu-devel@nongnu.org,
eric.auger@redhat.com, qemu-arm@nongnu.org, pbonzini@redhat.com
Subject: Re: [PATCH 2/6] hw/acpi: Add VIOT table
Date: Tue, 10 Aug 2021 11:22:27 +0200 [thread overview]
Message-ID: <20210810112227.05bfbd9b@redhat.com> (raw)
In-Reply-To: <20210810084505.2257983-3-jean-philippe@linaro.org>
On Tue, 10 Aug 2021 10:45:02 +0200
Jean-Philippe Brucker <jean-philippe@linaro.org> wrote:
> Add a function that generates a Virtual I/O Translation table (VIOT),
> describing the topology of paravirtual IOMMUs. The table is created when
> instantiating a virtio-iommu device. It contains a virtio-iommu node and
> PCI Range nodes for endpoints managed by the IOMMU. By default, a single
> node describes all PCI devices. When passing the "default_bus_bypass_iommu"
> machine option and "bypass_iommu" PXB option, only buses that do not
> bypass the IOMMU are described by PCI Range nodes.
>
> Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
using packed structures for composing ACPI tables is discouraged,
pls use build_append_int_noprefix() API instead. You can look at
build_amd_iommu() as an example.
PS:
Also note field comments format.
/it should be verbatim copy of entry name from respective table in spec/
> ---
> hw/acpi/viot.h | 13 +++++++
> hw/acpi/viot.c | 82 +++++++++++++++++++++++++++++++++++++++++++++
> hw/acpi/Kconfig | 4 +++
> hw/acpi/meson.build | 1 +
> 4 files changed, 100 insertions(+)
> create mode 100644 hw/acpi/viot.h
> create mode 100644 hw/acpi/viot.c
>
> diff --git a/hw/acpi/viot.h b/hw/acpi/viot.h
> new file mode 100644
> index 0000000000..4cef29a640
> --- /dev/null
> +++ b/hw/acpi/viot.h
> @@ -0,0 +1,13 @@
> +/*
> + * ACPI Virtual I/O Translation Table implementation
> + *
> + * SPDX-License-Identifier: GPL-2.0-or-later
> + */
> +#ifndef VIOT_H
> +#define VIOT_H
> +
> +void build_viot(GArray *table_data, BIOSLinker *linker,
> + uint16_t virtio_iommu_bdf, const char *oem_id,
> + const char *oem_table_id);
> +
> +#endif /* VIOT_H */
> diff --git a/hw/acpi/viot.c b/hw/acpi/viot.c
> new file mode 100644
> index 0000000000..5cd10e9553
> --- /dev/null
> +++ b/hw/acpi/viot.c
> @@ -0,0 +1,82 @@
> +/*
> + * ACPI Virtual I/O Translation table implementation
> + *
> + * SPDX-License-Identifier: GPL-2.0-or-later
> + */
> +#include "qemu/osdep.h"
> +#include "hw/acpi/acpi.h"
> +#include "hw/acpi/aml-build.h"
> +#include "hw/acpi/viot.h"
> +#include "hw/pci/pci.h"
> +#include "hw/pci/pci_host.h"
> +
> +/* Build PCI range for a given PCI host bridge */
> +static int viot_host_bridges(Object *obj, void *opaque)
> +{
> + GArray *pci_range_blob = opaque;
> +
> + if (object_dynamic_cast(obj, TYPE_PCI_HOST_BRIDGE)) {
> + PCIBus *bus = PCI_HOST_BRIDGE(obj)->bus;
> +
> + if (bus && !pci_bus_bypass_iommu(bus)) {
> + int min_bus, max_bus;
> +
> + pci_bus_range(bus, &min_bus, &max_bus);
> +
> + AcpiViotPciRange pci_range = {
> + .type = ACPI_VIOT_NODE_PCI_RANGE,
> + .length = cpu_to_le16(sizeof(pci_range)),
> + .bdf_start = cpu_to_le16(PCI_BUILD_BDF(min_bus, 0)),
> + .bdf_end = cpu_to_le16(PCI_BUILD_BDF(max_bus, 0xff)),
> + .endpoint_start = cpu_to_le32(PCI_BUILD_BDF(min_bus, 0)),
> + };
> +
> + g_array_append_val(pci_range_blob, pci_range);
> + }
> + }
> +
> + return 0;
> +}
> +
> +/*
> + * Generate a VIOT table with one PCI-based virtio-iommu that manages PCI
> + * endpoints.
> + */
> +void build_viot(GArray *table_data, BIOSLinker *linker,
> + uint16_t virtio_iommu_bdf, const char *oem_id,
> + const char *oem_table_id)
> +{
> + int i;
> + AcpiViot *viot;
> + AcpiViotPciRange *pci_range;
> + AcpiViotVirtioIommuPci *viommu;
> + int viommu_off = sizeof(*viot);
> + int viot_start = table_data->len;
> + GArray *pci_ranges = g_array_new(false, true, sizeof(*pci_range));
> +
> + viot = acpi_data_push(table_data, sizeof(*viot));
> + viot->node_offset = cpu_to_le16(viommu_off);
> +
> + viommu = acpi_data_push(table_data, sizeof(*viommu));
> + viommu->type = ACPI_VIOT_NODE_VIRTIO_IOMMU_PCI;
> + viommu->length = cpu_to_le16(sizeof(*viommu));
> + viommu->bdf = cpu_to_le16(virtio_iommu_bdf);
> +
> + /* Build the list of PCI ranges that this viommu manages */
> + object_child_foreach_recursive(object_get_root(), viot_host_bridges,
> + pci_ranges);
> +
> + for (i = 0; i < pci_ranges->len; i++) {
> + pci_range = &g_array_index(pci_ranges, AcpiViotPciRange, i);
> + pci_range->output_node = cpu_to_le16(viommu_off);
> + }
> + viot->node_count = cpu_to_le16(pci_ranges->len + 1);
> +
> + g_array_append_vals(table_data, pci_ranges->data,
> + pci_ranges->len * sizeof(*pci_range));
> + g_array_free(pci_ranges, true);
> +
> + build_header(linker, table_data, (void *)(table_data->data + viot_start),
> + "VIOT", table_data->len - viot_start, 0, oem_id, oem_table_id);
> +}
> +
> diff --git a/hw/acpi/Kconfig b/hw/acpi/Kconfig
> index cfc4ede8d9..abad79c103 100644
> --- a/hw/acpi/Kconfig
> +++ b/hw/acpi/Kconfig
> @@ -41,6 +41,10 @@ config ACPI_VMGENID
> default y
> depends on PC
>
> +config ACPI_VIOT
> + bool
> + depends on ACPI
> +
> config ACPI_HW_REDUCED
> bool
> select ACPI
> diff --git a/hw/acpi/meson.build b/hw/acpi/meson.build
> index 29f804d13e..a510988b27 100644
> --- a/hw/acpi/meson.build
> +++ b/hw/acpi/meson.build
> @@ -16,6 +16,7 @@ acpi_ss.add(when: 'CONFIG_ACPI_HW_REDUCED', if_true: files('generic_event_device
> acpi_ss.add(when: 'CONFIG_ACPI_HMAT', if_true: files('hmat.c'))
> acpi_ss.add(when: 'CONFIG_ACPI_APEI', if_true: files('ghes.c'), if_false: files('ghes-stub.c'))
> acpi_ss.add(when: 'CONFIG_ACPI_X86', if_true: files('piix4.c', 'pcihp.c'))
> +acpi_ss.add(when: 'CONFIG_ACPI_VIOT', if_true: files('viot.c'))
> acpi_ss.add(when: 'CONFIG_ACPI_X86_ICH', if_true: files('ich9.c', 'tco.c'))
> acpi_ss.add(when: 'CONFIG_IPMI', if_true: files('ipmi.c'), if_false: files('ipmi-stub.c'))
> acpi_ss.add(when: 'CONFIG_PC', if_false: files('acpi-x86-stub.c'))
next prev parent reply other threads:[~2021-08-10 9:23 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-10 8:45 [PATCH 0/6] virtio-iommu: Add ACPI support Jean-Philippe Brucker
2021-08-10 8:45 ` [PATCH 1/6] acpi: Add VIOT structure definitions Jean-Philippe Brucker
2021-08-10 8:45 ` Jean-Philippe Brucker
2021-08-10 8:45 ` [PATCH 2/6] hw/acpi: Add VIOT table Jean-Philippe Brucker
2021-08-10 9:22 ` Igor Mammedov [this message]
2021-08-10 9:22 ` Igor Mammedov
2021-08-27 13:29 ` Jean-Philippe Brucker
2021-08-27 13:29 ` Jean-Philippe Brucker
2021-08-10 8:45 ` [PATCH 3/6] hw/arm/virt-acpi-build: Add VIOT table for virtio-iommu Jean-Philippe Brucker
2021-08-10 8:45 ` Jean-Philippe Brucker
2021-08-10 8:45 ` [PATCH 4/6] hw/arm/virt: Remove device tree restriction " Jean-Philippe Brucker
2021-08-10 8:45 ` Jean-Philippe Brucker
2021-08-17 13:42 ` Eric Auger
2021-08-17 13:42 ` Eric Auger
2021-08-27 13:29 ` Jean-Philippe Brucker
2021-08-27 13:29 ` Jean-Philippe Brucker
2021-08-10 8:45 ` [PATCH 5/6] pc: Add VIOT table " Jean-Philippe Brucker
2021-08-10 8:45 ` [PATCH 6/6] pc: Allow instantiating a virtio-iommu device Jean-Philippe Brucker
2021-08-17 14:11 ` Eric Auger
2021-08-27 13:26 ` Jean-Philippe Brucker
2021-08-27 13:26 ` Jean-Philippe Brucker
2021-09-02 9:36 ` Eric Auger
2021-09-02 9:36 ` Eric Auger
2021-08-17 14:58 ` [PATCH 0/6] virtio-iommu: Add ACPI support Eric Auger
2021-08-17 14:58 ` Eric Auger
2021-08-27 13:30 ` Jean-Philippe Brucker
2021-08-27 13:30 ` Jean-Philippe Brucker
2021-09-29 9:18 ` Eric Auger
2021-09-29 9:18 ` Eric Auger
2021-09-29 17:08 ` Jean-Philippe Brucker
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=20210810112227.05bfbd9b@redhat.com \
--to=imammedo@redhat.com \
--cc=ehabkost@redhat.com \
--cc=eric.auger@redhat.com \
--cc=jean-philippe@linaro.org \
--cc=marcel.apfelbaum@gmail.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=shannon.zhaosl@gmail.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 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.