[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v11 1/2] hw/arm/virt: Basic CXL enablement on pci_expander_br
From: |
Peter Maydell |
Subject: |
Re: [PATCH v11 1/2] hw/arm/virt: Basic CXL enablement on pci_expander_bridge instances pxb-cxl |
Date: |
Fri, 24 Jun 2022 11:48:47 +0100 |
On Thu, 16 Jun 2022 at 15:20, Jonathan Cameron
<Jonathan.Cameron@huawei.com> wrote:
>
> Code based on i386/pc enablement.
> The memory layout places space for 16 host bridge register regions after
> the GIC_REDIST2 in the extended memmap.
> The CFMWs are placed above the extended memmap.
>
> Only create the CEDT table if cxl=on set for the machine.
>
> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This seems to be missing code to advertise the new devices in the
device tree.
Somebody else had better review the ACPI changes :-)
> #define DEFINE_VIRT_MACHINE_LATEST(major, minor, latest) \
> @@ -178,6 +181,7 @@ static const MemMapEntry base_memmap[] = {
> static MemMapEntry extended_memmap[] = {
> /* Additional 64 MB redist region (can contain up to 512 redistributors)
> */
> [VIRT_HIGH_GIC_REDIST2] = { 0x0, 64 * MiB },
> + [VIRT_CXL_HOST] = { 0x0, 64 * KiB * 16 }, /* 16 UID */
Does this reshuffle the memory layout so that all the stuff after it
moves up ? If so, that's an incompatible change and would need
versioning somehow.
More generally, should this new addition to the machine be
versioned? What did we do for the pc machine types?
> [VIRT_HIGH_PCIE_ECAM] = { 0x0, 256 * MiB },
> /* Second PCIe window */
> [VIRT_HIGH_PCIE_MMIO] = { 0x0, 512 * GiB },
> @@ -1525,6 +1529,16 @@ static void create_pcie(VirtMachineState *vms)
> }
> }
>
> +static void create_cxl_host_reg_region(VirtMachineState *vms)
> +{
> + MemoryRegion *sysmem = get_system_memory();
> + MemoryRegion *mr = &vms->cxl_devices_state.host_mr;
> +
> + memory_region_init(mr, OBJECT(vms), "cxl_host_reg",
> + vms->memmap[VIRT_CXL_HOST].size);
> + memory_region_add_subregion(sysmem, vms->memmap[VIRT_CXL_HOST].base, mr);
> +}
> @@ -1779,6 +1799,20 @@ static void virt_set_memmap(VirtMachineState *vms, int
> pa_bits)
> memory_region_init(&ms->device_memory->mr, OBJECT(vms),
> "device-memory", device_memory_size);
> }
> +
> + if (vms->cxl_devices_state.fixed_windows) {
> + GList *it;
> +
> + base = ROUND_UP(base, 256 * MiB);
> + for (it = vms->cxl_devices_state.fixed_windows; it; it = it->next) {
> + CXLFixedWindow *fw = it->data;
> +
> + fw->base = base;
> + memory_region_init_io(&fw->mr, OBJECT(vms), &cfmws_ops, fw,
> + "cxl-fixed-memory-region", fw->size);
Why is board model code having to init memory regions for this
device? Shouldn't the device be creating the memory regions itself
and then exposing them for the board code to map them ?
> + base += fw->size;
> + }
> + }
> }
>
> /*
> @@ -2215,6 +2249,14 @@ static void machvirt_init(MachineState *machine)
> memory_region_add_subregion(sysmem, machine->device_memory->base,
> &machine->device_memory->mr);
> }
> + if (vms->cxl_devices_state.fixed_windows) {
> + GList *it;
> + for (it = vms->cxl_devices_state.fixed_windows; it; it = it->next) {
> + CXLFixedWindow *fw = it->data;
> +
> + memory_region_add_subregion(sysmem, fw->base, &fw->mr);
> + }
> + }
>
> virt_flash_fdt(vms, sysmem, secure_sysmem ?: sysmem);
>
> @@ -2241,6 +2283,7 @@ static void machvirt_init(MachineState *machine)
> create_rtc(vms);
>
> create_pcie(vms);
> + create_cxl_host_reg_region(vms);
>
> if (has_ged && aarch64 && firmware_loaded && virt_is_acpi_enabled(vms)) {
> vms->acpi_dev = create_acpi_ged(vms);
> @@ -3070,6 +3113,7 @@ static void virt_instance_init(Object *obj)
>
> vms->oem_id = g_strndup(ACPI_BUILD_APPNAME6, 6);
> vms->oem_table_id = g_strndup(ACPI_BUILD_APPNAME8, 8);
> + cxl_machine_init(obj, &vms->cxl_devices_state);
> }
>
> static const TypeInfo virt_machine_info = {
> diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
> index 15feabac63..403c9107e5 100644
> --- a/include/hw/arm/virt.h
> +++ b/include/hw/arm/virt.h
> @@ -35,6 +35,7 @@
> #include "hw/boards.h"
> #include "hw/arm/boot.h"
> #include "hw/block/flash.h"
> +#include "hw/cxl/cxl.h"
> #include "sysemu/kvm.h"
> #include "hw/intc/arm_gicv3_common.h"
> #include "qom/object.h"
> @@ -92,6 +93,7 @@ enum {
> /* indices of IO regions located after the RAM */
> enum {
> VIRT_HIGH_GIC_REDIST2 = VIRT_LOWMEMMAP_LAST,
> + VIRT_CXL_HOST,
> VIRT_HIGH_PCIE_ECAM,
> VIRT_HIGH_PCIE_MMIO,
> };
> @@ -176,6 +178,7 @@ struct VirtMachineState {
> PCIBus *bus;
> char *oem_id;
> char *oem_table_id;
> + CXLState cxl_devices_state;
> };
I just looked at the CXLState struct. Why isn't this a device object ?
thanks
-- PMM
- [PATCH v11 0/2] arm/virt: CXL support via pxb_cxl, Jonathan Cameron, 2022/06/16
- [PATCH v11 1/2] hw/arm/virt: Basic CXL enablement on pci_expander_bridge instances pxb-cxl, Jonathan Cameron, 2022/06/16
- Re: [PATCH v11 1/2] hw/arm/virt: Basic CXL enablement on pci_expander_bridge instances pxb-cxl,
Peter Maydell <=
- Re: [PATCH v11 1/2] hw/arm/virt: Basic CXL enablement on pci_expander_bridge instances pxb-cxl, Jonathan Cameron, 2022/06/24
- Re: [PATCH v11 1/2] hw/arm/virt: Basic CXL enablement on pci_expander_bridge instances pxb-cxl, Peter Maydell, 2022/06/24
- Re: [PATCH v11 1/2] hw/arm/virt: Basic CXL enablement on pci_expander_bridge instances pxb-cxl, Jonathan Cameron, 2022/06/24
- Re: [PATCH v11 1/2] hw/arm/virt: Basic CXL enablement on pci_expander_bridge instances pxb-cxl, Jonathan Cameron, 2022/06/24
- Re: [PATCH v11 1/2] hw/arm/virt: Basic CXL enablement on pci_expander_bridge instances pxb-cxl, Peter Maydell, 2022/06/24
- Re: [PATCH v11 1/2] hw/arm/virt: Basic CXL enablement on pci_expander_bridge instances pxb-cxl, Jonathan Cameron, 2022/06/24
[PATCH v11 2/2] qtest/cxl: Add aarch64 virt test for CXL, Jonathan Cameron, 2022/06/16