[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v1 4/4] acpi/gpex: patch guest DSDT for dev mem information
From: |
Igor Mammedov |
Subject: |
Re: [PATCH v1 4/4] acpi/gpex: patch guest DSDT for dev mem information |
Date: |
Fri, 15 Sep 2023 17:13:13 +0200 |
On Thu, 14 Sep 2023 19:45:59 -0700
<ankita@nvidia.com> wrote:
> From: Ankit Agrawal <ankita@nvidia.com>
>
> To add the memory in the guest as NUMA nodes, it needs the PXM node index
> and the total count of nodes associated with the memory. The range of
> proximity domains are communicated to the VM as part of the guest ACPI
> using the nvidia,gpu-mem-pxm-start and nvidia,gpu-mem-pxm-count DSD
above examples should use devices that are (or to be) available in QEMU,
not some out of tree ones.
> properties. These value respectively represent the staring proximity
> domain id and the count. Kernel modules can then fetch this information
> and determine the numa node id using pxm_to_node().
>
> Signed-off-by: Ankit Agrawal <ankita@nvidia.com>
> ---
> hw/pci-host/gpex-acpi.c | 69 +++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 69 insertions(+)
>
> diff --git a/hw/pci-host/gpex-acpi.c b/hw/pci-host/gpex-acpi.c
> index 7c7316bc96..0548feace1 100644
> --- a/hw/pci-host/gpex-acpi.c
> +++ b/hw/pci-host/gpex-acpi.c
> @@ -49,6 +49,72 @@ static void acpi_dsdt_add_pci_route_table(Aml *dev,
> uint32_t irq)
> }
> }
>
> +static void acpi_dsdt_add_cohmem_device(Aml *dev, int32_t devfn,
> + uint64_t dev_mem_pxm_start,
> + uint64_t dev_mem_pxm_count)
> +{
> + Aml *memdev = aml_device("CMD%X", PCI_SLOT(devfn));
> + Aml *pkg = aml_package(2);
> + Aml *pkg1 = aml_package(2);
> + Aml *pkg2 = aml_package(2);
> + Aml *dev_pkg = aml_package(2);
> + Aml *UUID;
> +
> + aml_append(memdev, aml_name_decl("_ADR", aml_int(PCI_SLOT(devfn) <<
> 16)));
PCI devices (especially endpoints) are typically enumerated by
bus specific means (i.e not by ACPI).
And whether OSPM will honor the remainder of AML here is very questionable.
> +
> + aml_append(pkg1, aml_string("dev-mem-pxm-start"));
> + aml_append(pkg1, aml_int(dev_mem_pxm_start));
> +
> + aml_append(pkg2, aml_string("dev-mem-pxm-count"));
> + aml_append(pkg2, aml_int(dev_mem_pxm_count));
> +
> + aml_append(pkg, pkg1);
> + aml_append(pkg, pkg2);
> +
> + UUID = aml_touuid("DAFFD814-6EBA-4D8C-8A91-BC9BBF4AA301");
I'm not a fun of free form UUIDs and above one seems to be the case:
https://uefi.org/sites/default/files/resources/_DSD-device-properties-UUID.pdf
looking at above doc this UUID also requires HID/ACPI ID
to describe data structure definition which this patch is missing.
It's also questionable whether _HID and _ADR are allowed to go together.
PS:
Commit message and comments here should have appropriate pointers
to relevant specs.
> + aml_append(dev_pkg, UUID);
> + aml_append(dev_pkg, pkg);
> +
> + aml_append(memdev, aml_name_decl("_DSD", dev_pkg));
> + aml_append(dev, memdev);
> +}
> +
> +static void find_mem_device(PCIBus *bus, PCIDevice *pdev,
> + void *opaque)
> +{
> + Aml *dev = (Aml *)opaque;
> +
> + if (bus == NULL) {
> + return;
> + }
> +
> + if (pdev->has_coherent_memory) {
> + Object *po = OBJECT(pdev);
> +
> + if (po == NULL) {
> + return;
> + }
> +
> + uint64_t pxm_start
> + = object_property_get_uint(po, "dev_mem_pxm_start", NULL);
> + uint64_t pxm_count
> + = object_property_get_uint(po, "dev_mem_pxm_count", NULL);
> +
> + acpi_dsdt_add_cohmem_device(dev, pdev->devfn, pxm_start, pxm_count);
> + }
> +}
> +
> +static void acpi_dsdt_find_and_add_cohmem_device(PCIBus *bus, Aml *dev)
> +{
> + if (bus == NULL) {
> + return;
> + }
> +
> + pci_for_each_device_reverse(bus, pci_bus_num(bus),
> + find_mem_device, dev);
> +
> +}
> +
> static void acpi_dsdt_add_pci_osc(Aml *dev)
> {
> Aml *method, *UUID, *ifctx, *ifctx1, *elsectx, *buf;
> @@ -207,7 +273,10 @@ void acpi_dsdt_add_gpex(Aml *scope, struct GPEXConfig
> *cfg)
>
> acpi_dsdt_add_pci_route_table(dev, cfg->irq);
>
> + acpi_dsdt_find_and_add_cohmem_device(cfg->bus, dev);
> +
> method = aml_method("_CBA", 0, AML_NOTSERIALIZED);
> +
> aml_append(method, aml_return(aml_int(cfg->ecam.base)));
> aml_append(dev, method);
>
- Re: [PATCH v1 3/4] hw/arm/virt-acpi-build: patch guest SRAT for NUMA nodes, (continued)
- [PATCH v1 2/4] vfio: assign default values to node params, ankita, 2023/09/14
- [PATCH v1 4/4] acpi/gpex: patch guest DSDT for dev mem information, ankita, 2023/09/14
- Re: [PATCH v1 0/4] vfio: report NUMA nodes for device memory, Cédric Le Goater, 2023/09/15
- Re: [PATCH v1 0/4] vfio: report NUMA nodes for device memory, Alex Williamson, 2023/09/15
- Re: [PATCH v1 0/4] vfio: report NUMA nodes for device memory, David Hildenbrand, 2023/09/15
- RE: [PATCH v1 0/4] vfio: report NUMA nodes for device memory, Ankit Agrawal, 2023/09/22
- Re: [PATCH v1 0/4] vfio: report NUMA nodes for device memory, David Hildenbrand, 2023/09/22
- Re: [PATCH v1 0/4] vfio: report NUMA nodes for device memory, Ankit Agrawal, 2023/09/26
- Re: [PATCH v1 0/4] vfio: report NUMA nodes for device memory, David Hildenbrand, 2023/09/26
- Re: [PATCH v1 0/4] vfio: report NUMA nodes for device memory, Alex Williamson, 2023/09/26
- Re: [PATCH v1 0/4] vfio: report NUMA nodes for device memory, Ankit Agrawal, 2023/09/27