virtio,pc,pci: fixes,cleanups,features
more CXL patches VIOT Igor's huge AML rework fixes, cleanups all over the place Signed-off-by: Michael S. Tsirkin <mst@redhat.com> -----BEGIN PGP SIGNATURE----- iQFDBAABCAAtFiEEXQn9CHHI+FuUyooNKB8NuNKNVGkFAmKj4YcPHG1zdEByZWRo YXQuY29tAAoJECgfDbjSjVRpkNcIAKTsMfUVueTjelC2RwIdegQkypycKhCweKzc QxddaEr0w+N2164byT3IUy9h53hV3qAAmMuGE4d8B2r5rykf+SwDfIeNmHNqntnA oLraXIxSSAf4/1cTsRCVL/BXo2E9P+WHI3huw37HClmPLdyMjQa1AtpTpKnIsbmO sBZf7t5yHDJ2WGZwBQ1IbAxvsdGo1fa1TCt1jZ9g1dmnQSTteQG8DHkGoRnkwTi7 510jb0e8uQEgKytCdLTHqESHlfgjvoI73OFOAR2dzTKy6KelFmdLYSo2FtsIdtT5 1fZNaDjtl6zQ4b2iLBgPpHtikKch9BzzhDMbCsq7FpvasZ8u2FE= =LXG0 -----END PGP SIGNATURE----- Merge tag 'for_upstream' of git://git.kernel.org/pub/scm/virt/kvm/mst/qemu into staging virtio,pc,pci: fixes,cleanups,features more CXL patches VIOT Igor's huge AML rework fixes, cleanups all over the place Signed-off-by: Michael S. Tsirkin <mst@redhat.com> # -----BEGIN PGP SIGNATURE----- # # iQFDBAABCAAtFiEEXQn9CHHI+FuUyooNKB8NuNKNVGkFAmKj4YcPHG1zdEByZWRo # YXQuY29tAAoJECgfDbjSjVRpkNcIAKTsMfUVueTjelC2RwIdegQkypycKhCweKzc # QxddaEr0w+N2164byT3IUy9h53hV3qAAmMuGE4d8B2r5rykf+SwDfIeNmHNqntnA # oLraXIxSSAf4/1cTsRCVL/BXo2E9P+WHI3huw37HClmPLdyMjQa1AtpTpKnIsbmO # sBZf7t5yHDJ2WGZwBQ1IbAxvsdGo1fa1TCt1jZ9g1dmnQSTteQG8DHkGoRnkwTi7 # 510jb0e8uQEgKytCdLTHqESHlfgjvoI73OFOAR2dzTKy6KelFmdLYSo2FtsIdtT5 # 1fZNaDjtl6zQ4b2iLBgPpHtikKch9BzzhDMbCsq7FpvasZ8u2FE= # =LXG0 # -----END PGP SIGNATURE----- # gpg: Signature made Fri 10 Jun 2022 05:27:51 PM PDT # gpg: using RSA key 5D09FD0871C8F85B94CA8A0D281F0DB8D28D5469 # gpg: issuer "mst@redhat.com" # gpg: Good signature from "Michael S. Tsirkin <mst@kernel.org>" [undefined] # gpg: aka "Michael S. Tsirkin <mst@redhat.com>" [undefined] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 0270 606B 6F3C DF3D 0B17 0970 C350 3912 AFBE 8E67 # Subkey fingerprint: 5D09 FD08 71C8 F85B 94CA 8A0D 281F 0DB8 D28D 5469 * tag 'for_upstream' of git://git.kernel.org/pub/scm/virt/kvm/mst/qemu: (53 commits) hw/vhost-user-scsi|blk: set `supports_config` flag correctly hw/virtio/vhost-user: don't use uninitialized variable tests/acpi: virt: update golden masters for VIOT hw/acpi/viot: sort VIOT ACPI table entries by PCI host bridge min_bus tests/acpi: virt: allow VIOT acpi table changes hw/acpi/viot: build array of PCI host bridges before generating VIOT ACPI table hw/acpi/viot: move the individual PCI host bridge entry generation to a new function hw/acpi/viot: rename build_pci_range_node() to enumerate_pci_host_bridges() hw/cxl: Fix missing write mask for HDM decoder target list registers pci: fix overflow in snprintf string formatting hw/machine: Drop cxl_supported flag as no longer useful hw/cxl: Move the CXLState from MachineState to machine type specific state. tests/acpi: Update q35/CEDT.cxl for new memory addresses. pci/pci_expander_bridge: For CXL HB delay the HB register memory region setup. tests/acpi: Allow modification of q35 CXL CEDT table. hw/cxl: Push linking of CXL targets into i386/pc rather than in machine.c hw/acpi/cxl: Pass in the CXLState directly rather than MachineState hw/cxl: Make the CXL fixed memory window setup a machine parameter. x86: acpi-build: do not include hw/isa/isa.h directly tests: acpi: update expected DSDT.tis.tpm2/DSDT.tis.tpm12 blobs ... Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
30796f5567
@ -251,7 +251,7 @@ A very simple setup with just one directly attached CXL Type 3 device::
|
||||
-device pxb-cxl,bus_nr=12,bus=pcie.0,id=cxl.1 \
|
||||
-device cxl-rp,port=0,bus=cxl.1,id=root_port13,chassis=0,slot=2 \
|
||||
-device cxl-type3,bus=root_port13,memdev=cxl-mem1,lsa=cxl-lsa1,id=cxl-pmem0 \
|
||||
-cxl-fixed-memory-window targets.0=cxl.1,size=4G
|
||||
-M cxl-fmw.0.targets.0=cxl.1,cxl-fmw.0.size=4G
|
||||
|
||||
A setup suitable for 4 way interleave. Only one fixed window provided, to enable 2 way
|
||||
interleave across 2 CXL host bridges. Each host bridge has 2 CXL Root Ports, with
|
||||
@ -277,7 +277,7 @@ the CXL Type3 device directly attached (no switches).::
|
||||
-device cxl-type3,bus=root_port15,memdev=cxl-mem3,lsa=cxl-lsa3,id=cxl-pmem2 \
|
||||
-device cxl-rp,port=1,bus=cxl.2,id=root_port16,chassis=0,slot=6 \
|
||||
-device cxl-type3,bus=root_port16,memdev=cxl-mem4,lsa=cxl-lsa4,id=cxl-pmem3 \
|
||||
-cxl-fixed-memory-window targets.0=cxl.1,targets.1=cxl.2,size=4G,interleave-granularity=8k
|
||||
-M cxl-fmw.0.targets.0=cxl.1,cxl-fmw.0.targets.1=cxl.2,cxl-fmw.0.size=4G,cxl-fmw.0.interleave-granularity=8k
|
||||
|
||||
Kernel Configuration Options
|
||||
----------------------------
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include "qemu/osdep.h"
|
||||
#include "hw/acpi/acpi_dev_interface.h"
|
||||
#include "hw/acpi/acpi_aml_interface.h"
|
||||
#include "qemu/module.h"
|
||||
|
||||
void acpi_send_event(DeviceState *dev, AcpiEventStatusBits event)
|
||||
@ -18,8 +19,15 @@ static void register_types(void)
|
||||
.parent = TYPE_INTERFACE,
|
||||
.class_size = sizeof(AcpiDeviceIfClass),
|
||||
};
|
||||
static const TypeInfo acpi_dev_aml_if_info = {
|
||||
.name = TYPE_ACPI_DEV_AML_IF,
|
||||
.parent = TYPE_INTERFACE,
|
||||
.class_size = sizeof(AcpiDevAmlIfClass),
|
||||
};
|
||||
|
||||
|
||||
type_register_static(&acpi_dev_if_info);
|
||||
type_register_static(&acpi_dev_aml_if_info);
|
||||
}
|
||||
|
||||
type_init(register_types)
|
||||
|
@ -65,9 +65,8 @@ static void cedt_build_chbs(GArray *table_data, PXBDev *cxl)
|
||||
* Interleave ways encoding in CXL 2.0 ECN: 3, 6, 12 and 16-way memory
|
||||
* interleaving.
|
||||
*/
|
||||
static void cedt_build_cfmws(GArray *table_data, MachineState *ms)
|
||||
static void cedt_build_cfmws(GArray *table_data, CXLState *cxls)
|
||||
{
|
||||
CXLState *cxls = ms->cxl_devices_state;
|
||||
GList *it;
|
||||
|
||||
for (it = cxls->fixed_windows; it; it = it->next) {
|
||||
@ -129,9 +128,9 @@ static int cxl_foreach_pxb_hb(Object *obj, void *opaque)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void cxl_build_cedt(MachineState *ms, GArray *table_offsets, GArray *table_data,
|
||||
void cxl_build_cedt(GArray *table_offsets, GArray *table_data,
|
||||
BIOSLinker *linker, const char *oem_id,
|
||||
const char *oem_table_id)
|
||||
const char *oem_table_id, CXLState *cxl_state)
|
||||
{
|
||||
Aml *cedt;
|
||||
AcpiTable table = { .sig = "CEDT", .rev = 1, .oem_id = oem_id,
|
||||
@ -144,7 +143,7 @@ void cxl_build_cedt(MachineState *ms, GArray *table_offsets, GArray *table_data,
|
||||
/* reserve space for CEDT header */
|
||||
|
||||
object_child_foreach_recursive(object_get_root(), cxl_foreach_pxb_hb, cedt);
|
||||
cedt_build_cfmws(cedt->buf, ms);
|
||||
cedt_build_cfmws(cedt->buf, cxl_state);
|
||||
|
||||
/* copy AML table into ACPI tables blob and patch header there */
|
||||
g_array_append_vals(table_data, cedt->buf->data, cedt->buf->len);
|
||||
|
@ -10,6 +10,6 @@
|
||||
#include "qemu/osdep.h"
|
||||
#include "hw/acpi/ipmi.h"
|
||||
|
||||
void build_acpi_ipmi_devices(Aml *table, BusState *bus, const char *resource)
|
||||
void build_ipmi_dev_aml(AcpiDevAmlIf *adev, Aml *scope)
|
||||
{
|
||||
}
|
||||
|
@ -13,7 +13,7 @@
|
||||
#include "hw/acpi/acpi.h"
|
||||
#include "hw/acpi/ipmi.h"
|
||||
|
||||
static Aml *aml_ipmi_crs(IPMIFwInfo *info, const char *resource)
|
||||
static Aml *aml_ipmi_crs(IPMIFwInfo *info)
|
||||
{
|
||||
Aml *crs = aml_resource_template();
|
||||
|
||||
@ -49,7 +49,7 @@ static Aml *aml_ipmi_crs(IPMIFwInfo *info, const char *resource)
|
||||
break;
|
||||
case IPMI_MEMSPACE_SMBUS:
|
||||
aml_append(crs, aml_i2c_serial_bus_device(info->base_address,
|
||||
resource));
|
||||
"^"));
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
@ -62,46 +62,27 @@ static Aml *aml_ipmi_crs(IPMIFwInfo *info, const char *resource)
|
||||
return crs;
|
||||
}
|
||||
|
||||
static Aml *aml_ipmi_device(IPMIFwInfo *info, const char *resource)
|
||||
void build_ipmi_dev_aml(AcpiDevAmlIf *adev, Aml *scope)
|
||||
{
|
||||
Aml *dev;
|
||||
uint16_t version = ((info->ipmi_spec_major_revision << 8)
|
||||
| (info->ipmi_spec_minor_revision << 4));
|
||||
IPMIFwInfo info = {};
|
||||
IPMIInterface *ii = IPMI_INTERFACE(adev);
|
||||
IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
|
||||
uint16_t version;
|
||||
|
||||
assert(info->ipmi_spec_minor_revision <= 15);
|
||||
iic->get_fwinfo(ii, &info);
|
||||
assert(info.ipmi_spec_minor_revision <= 15);
|
||||
version = ((info.ipmi_spec_major_revision << 8)
|
||||
| (info.ipmi_spec_minor_revision << 4));
|
||||
|
||||
dev = aml_device("MI%d", info->uuid);
|
||||
dev = aml_device("MI%d", info.uuid);
|
||||
aml_append(dev, aml_name_decl("_HID", aml_eisaid("IPI0001")));
|
||||
aml_append(dev, aml_name_decl("_STR", aml_string("ipmi_%s",
|
||||
info->interface_name)));
|
||||
aml_append(dev, aml_name_decl("_UID", aml_int(info->uuid)));
|
||||
aml_append(dev, aml_name_decl("_CRS", aml_ipmi_crs(info, resource)));
|
||||
aml_append(dev, aml_name_decl("_IFT", aml_int(info->interface_type)));
|
||||
info.interface_name)));
|
||||
aml_append(dev, aml_name_decl("_UID", aml_int(info.uuid)));
|
||||
aml_append(dev, aml_name_decl("_CRS", aml_ipmi_crs(&info)));
|
||||
aml_append(dev, aml_name_decl("_IFT", aml_int(info.interface_type)));
|
||||
aml_append(dev, aml_name_decl("_SRV", aml_int(version)));
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
||||
void build_acpi_ipmi_devices(Aml *scope, BusState *bus, const char *resource)
|
||||
{
|
||||
|
||||
BusChild *kid;
|
||||
|
||||
QTAILQ_FOREACH(kid, &bus->children, sibling) {
|
||||
IPMIInterface *ii;
|
||||
IPMIInterfaceClass *iic;
|
||||
IPMIFwInfo info;
|
||||
Object *obj = object_dynamic_cast(OBJECT(kid->child),
|
||||
TYPE_IPMI_INTERFACE);
|
||||
|
||||
if (!obj) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ii = IPMI_INTERFACE(obj);
|
||||
iic = IPMI_INTERFACE_GET_CLASS(obj);
|
||||
memset(&info, 0, sizeof(info));
|
||||
iic->get_fwinfo(ii, &info);
|
||||
aml_append(scope, aml_ipmi_device(&info, resource));
|
||||
}
|
||||
aml_append(scope, dev);
|
||||
}
|
||||
|
@ -29,7 +29,7 @@ acpi_ss.add(when: 'CONFIG_PC', if_false: files('acpi-x86-stub.c'))
|
||||
if have_tpm
|
||||
acpi_ss.add(files('tpm.c'))
|
||||
endif
|
||||
softmmu_ss.add(when: 'CONFIG_ACPI', if_false: files('acpi-stub.c', 'aml-build-stub.c', 'ghes-stub.c'))
|
||||
softmmu_ss.add(when: 'CONFIG_ACPI', if_false: files('acpi-stub.c', 'aml-build-stub.c', 'ghes-stub.c', 'acpi_interface.c'))
|
||||
softmmu_ss.add_all(when: 'CONFIG_ACPI', if_true: acpi_ss)
|
||||
softmmu_ss.add(when: 'CONFIG_ALL', if_true: files('acpi-stub.c', 'aml-build-stub.c',
|
||||
'acpi-x86-stub.c', 'ipmi-stub.c', 'ghes-stub.c',
|
||||
|
109
hw/acpi/viot.c
109
hw/acpi/viot.c
@ -10,17 +10,40 @@
|
||||
#include "hw/pci/pci.h"
|
||||
#include "hw/pci/pci_host.h"
|
||||
|
||||
struct viot_pci_ranges {
|
||||
GArray *blob;
|
||||
size_t count;
|
||||
uint16_t output_node;
|
||||
struct viot_pci_host_range {
|
||||
int min_bus;
|
||||
int max_bus;
|
||||
};
|
||||
|
||||
/* Build PCI range for a given PCI host bridge */
|
||||
static int build_pci_range_node(Object *obj, void *opaque)
|
||||
static void build_pci_host_range(GArray *table_data, int min_bus, int max_bus,
|
||||
uint16_t output_node)
|
||||
{
|
||||
struct viot_pci_ranges *pci_ranges = opaque;
|
||||
GArray *blob = pci_ranges->blob;
|
||||
/* Type */
|
||||
build_append_int_noprefix(table_data, 1 /* PCI range */, 1);
|
||||
/* Reserved */
|
||||
build_append_int_noprefix(table_data, 0, 1);
|
||||
/* Length */
|
||||
build_append_int_noprefix(table_data, 24, 2);
|
||||
/* Endpoint start */
|
||||
build_append_int_noprefix(table_data, PCI_BUILD_BDF(min_bus, 0), 4);
|
||||
/* PCI Segment start */
|
||||
build_append_int_noprefix(table_data, 0, 2);
|
||||
/* PCI Segment end */
|
||||
build_append_int_noprefix(table_data, 0, 2);
|
||||
/* PCI BDF start */
|
||||
build_append_int_noprefix(table_data, PCI_BUILD_BDF(min_bus, 0), 2);
|
||||
/* PCI BDF end */
|
||||
build_append_int_noprefix(table_data, PCI_BUILD_BDF(max_bus, 0xff), 2);
|
||||
/* Output node */
|
||||
build_append_int_noprefix(table_data, output_node, 2);
|
||||
/* Reserved */
|
||||
build_append_int_noprefix(table_data, 0, 6);
|
||||
}
|
||||
|
||||
/* Build PCI range for a given PCI host bridge */
|
||||
static int enumerate_pci_host_bridges(Object *obj, void *opaque)
|
||||
{
|
||||
GArray *pci_host_ranges = opaque;
|
||||
|
||||
if (object_dynamic_cast(obj, TYPE_PCI_HOST_BRIDGE)) {
|
||||
PCIBus *bus = PCI_HOST_BRIDGE(obj)->bus;
|
||||
@ -30,34 +53,31 @@ static int build_pci_range_node(Object *obj, void *opaque)
|
||||
|
||||
pci_bus_range(bus, &min_bus, &max_bus);
|
||||
|
||||
/* Type */
|
||||
build_append_int_noprefix(blob, 1 /* PCI range */, 1);
|
||||
/* Reserved */
|
||||
build_append_int_noprefix(blob, 0, 1);
|
||||
/* Length */
|
||||
build_append_int_noprefix(blob, 24, 2);
|
||||
/* Endpoint start */
|
||||
build_append_int_noprefix(blob, PCI_BUILD_BDF(min_bus, 0), 4);
|
||||
/* PCI Segment start */
|
||||
build_append_int_noprefix(blob, 0, 2);
|
||||
/* PCI Segment end */
|
||||
build_append_int_noprefix(blob, 0, 2);
|
||||
/* PCI BDF start */
|
||||
build_append_int_noprefix(blob, PCI_BUILD_BDF(min_bus, 0), 2);
|
||||
/* PCI BDF end */
|
||||
build_append_int_noprefix(blob, PCI_BUILD_BDF(max_bus, 0xff), 2);
|
||||
/* Output node */
|
||||
build_append_int_noprefix(blob, pci_ranges->output_node, 2);
|
||||
/* Reserved */
|
||||
build_append_int_noprefix(blob, 0, 6);
|
||||
|
||||
pci_ranges->count++;
|
||||
const struct viot_pci_host_range pci_host_range = {
|
||||
.min_bus = min_bus,
|
||||
.max_bus = max_bus,
|
||||
};
|
||||
g_array_append_val(pci_host_ranges, pci_host_range);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static gint pci_host_range_compare(gconstpointer a, gconstpointer b)
|
||||
{
|
||||
struct viot_pci_host_range *range_a = (struct viot_pci_host_range *)a;
|
||||
struct viot_pci_host_range *range_b = (struct viot_pci_host_range *)b;
|
||||
|
||||
if (range_a->min_bus < range_b->min_bus) {
|
||||
return -1;
|
||||
} else if (range_a->min_bus > range_b->min_bus) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Generate a VIOT table with one PCI-based virtio-iommu that manages PCI
|
||||
* endpoints.
|
||||
@ -72,19 +92,22 @@ void build_viot(MachineState *ms, GArray *table_data, BIOSLinker *linker,
|
||||
int viommu_off = 48;
|
||||
AcpiTable table = { .sig = "VIOT", .rev = 0,
|
||||
.oem_id = oem_id, .oem_table_id = oem_table_id };
|
||||
struct viot_pci_ranges pci_ranges = {
|
||||
.output_node = viommu_off,
|
||||
.blob = g_array_new(false, true /* clear */, 1),
|
||||
};
|
||||
GArray *pci_host_ranges = g_array_new(false, true,
|
||||
sizeof(struct viot_pci_host_range));
|
||||
struct viot_pci_host_range *pci_host_range;
|
||||
int i;
|
||||
|
||||
/* Build the list of PCI ranges that this viommu manages */
|
||||
object_child_foreach_recursive(OBJECT(ms), build_pci_range_node,
|
||||
&pci_ranges);
|
||||
object_child_foreach_recursive(OBJECT(ms), enumerate_pci_host_bridges,
|
||||
pci_host_ranges);
|
||||
|
||||
/* Sort the pci host ranges by min_bus */
|
||||
g_array_sort(pci_host_ranges, pci_host_range_compare);
|
||||
|
||||
/* ACPI table header */
|
||||
acpi_table_begin(&table, table_data);
|
||||
/* Node count */
|
||||
build_append_int_noprefix(table_data, pci_ranges.count + 1, 2);
|
||||
build_append_int_noprefix(table_data, pci_host_ranges->len + 1, 2);
|
||||
/* Node offset */
|
||||
build_append_int_noprefix(table_data, viommu_off, 2);
|
||||
/* Reserved */
|
||||
@ -105,9 +128,15 @@ void build_viot(MachineState *ms, GArray *table_data, BIOSLinker *linker,
|
||||
build_append_int_noprefix(table_data, 0, 8);
|
||||
|
||||
/* PCI ranges found above */
|
||||
g_array_append_vals(table_data, pci_ranges.blob->data,
|
||||
pci_ranges.blob->len);
|
||||
g_array_free(pci_ranges.blob, true);
|
||||
for (i = 0; i < pci_host_ranges->len; i++) {
|
||||
pci_host_range = &g_array_index(pci_host_ranges,
|
||||
struct viot_pci_host_range, i);
|
||||
|
||||
build_pci_host_range(table_data, pci_host_range->min_bus,
|
||||
pci_host_range->max_bus, viommu_off);
|
||||
}
|
||||
|
||||
g_array_free(pci_host_ranges, true);
|
||||
|
||||
acpi_table_end(linker, &table);
|
||||
}
|
||||
|
@ -32,7 +32,7 @@
|
||||
#include "qapi/error.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qemu/timer.h"
|
||||
#include "hw/acpi/aml-build.h"
|
||||
#include "hw/acpi/acpi_aml_interface.h"
|
||||
#include "hw/irq.h"
|
||||
#include "hw/isa/isa.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
@ -214,9 +214,9 @@ int cmos_get_fd_drive_type(FloppyDriveType fd0)
|
||||
return val;
|
||||
}
|
||||
|
||||
static void fdc_isa_build_aml(ISADevice *isadev, Aml *scope)
|
||||
static void build_fdc_aml(AcpiDevAmlIf *adev, Aml *scope)
|
||||
{
|
||||
FDCtrlISABus *isa = ISA_FDC(isadev);
|
||||
FDCtrlISABus *isa = ISA_FDC(adev);
|
||||
Aml *dev;
|
||||
Aml *crs;
|
||||
int i;
|
||||
@ -241,7 +241,7 @@ static void fdc_isa_build_aml(ISADevice *isadev, Aml *scope)
|
||||
aml_append(dev, aml_name_decl("_CRS", crs));
|
||||
|
||||
for (i = 0; i < MIN(MAX_FD, ACPI_FDE_MAX_FD); i++) {
|
||||
FloppyDriveType type = isa_fdc_get_drive_type(isadev, i);
|
||||
FloppyDriveType type = isa_fdc_get_drive_type(ISA_DEVICE(adev), i);
|
||||
|
||||
if (type < FLOPPY_DRIVE_TYPE_NONE) {
|
||||
fde_buf[i] = cpu_to_le32(1); /* drive present */
|
||||
@ -283,14 +283,14 @@ static Property isa_fdc_properties[] = {
|
||||
static void isabus_fdc_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
ISADeviceClass *isa = ISA_DEVICE_CLASS(klass);
|
||||
AcpiDevAmlIfClass *adevc = ACPI_DEV_AML_IF_CLASS(klass);
|
||||
|
||||
dc->desc = "virtual floppy controller";
|
||||
dc->realize = isabus_fdc_realize;
|
||||
dc->fw_name = "fdc";
|
||||
dc->reset = fdctrl_external_reset_isa;
|
||||
dc->vmsd = &vmstate_isa_fdc;
|
||||
isa->build_aml = fdc_isa_build_aml;
|
||||
adevc->build_dev_aml = build_fdc_aml;
|
||||
device_class_set_props(dc, isa_fdc_properties);
|
||||
set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
|
||||
}
|
||||
@ -313,6 +313,10 @@ static const TypeInfo isa_fdc_info = {
|
||||
.instance_size = sizeof(FDCtrlISABus),
|
||||
.class_init = isabus_fdc_class_init,
|
||||
.instance_init = isabus_fdc_instance_init,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ TYPE_ACPI_DEV_AML_IF },
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static void isa_fdc_register_types(void)
|
||||
|
@ -337,6 +337,7 @@ static int vhost_user_blk_connect(DeviceState *dev, Error **errp)
|
||||
|
||||
vhost_dev_set_config_notifier(&s->dev, &blk_ops);
|
||||
|
||||
s->vhost_user.supports_config = true;
|
||||
ret = vhost_dev_init(&s->dev, &s->vhost_user, VHOST_BACKEND_TYPE_USER, 0,
|
||||
errp);
|
||||
if (ret < 0) {
|
||||
|
@ -28,7 +28,7 @@
|
||||
#include "qemu/module.h"
|
||||
#include "chardev/char-parallel.h"
|
||||
#include "chardev/char-fe.h"
|
||||
#include "hw/acpi/aml-build.h"
|
||||
#include "hw/acpi/acpi_aml_interface.h"
|
||||
#include "hw/irq.h"
|
||||
#include "hw/isa/isa.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
@ -570,9 +570,9 @@ static void parallel_isa_realizefn(DeviceState *dev, Error **errp)
|
||||
s, "parallel");
|
||||
}
|
||||
|
||||
static void parallel_isa_build_aml(ISADevice *isadev, Aml *scope)
|
||||
static void parallel_isa_build_aml(AcpiDevAmlIf *adev, Aml *scope)
|
||||
{
|
||||
ISAParallelState *isa = ISA_PARALLEL(isadev);
|
||||
ISAParallelState *isa = ISA_PARALLEL(adev);
|
||||
Aml *dev;
|
||||
Aml *crs;
|
||||
|
||||
@ -645,11 +645,11 @@ static Property parallel_isa_properties[] = {
|
||||
static void parallel_isa_class_initfn(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
ISADeviceClass *isa = ISA_DEVICE_CLASS(klass);
|
||||
AcpiDevAmlIfClass *adevc = ACPI_DEV_AML_IF_CLASS(klass);
|
||||
|
||||
dc->realize = parallel_isa_realizefn;
|
||||
dc->vmsd = &vmstate_parallel_isa;
|
||||
isa->build_aml = parallel_isa_build_aml;
|
||||
adevc->build_dev_aml = parallel_isa_build_aml;
|
||||
device_class_set_props(dc, parallel_isa_properties);
|
||||
set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
|
||||
}
|
||||
@ -659,6 +659,10 @@ static const TypeInfo parallel_isa_info = {
|
||||
.parent = TYPE_ISA_DEVICE,
|
||||
.instance_size = sizeof(ISAParallelState),
|
||||
.class_init = parallel_isa_class_initfn,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ TYPE_ACPI_DEV_AML_IF },
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static void parallel_register_types(void)
|
||||
|
@ -27,7 +27,7 @@
|
||||
#include "qapi/error.h"
|
||||
#include "qemu/module.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "hw/acpi/aml-build.h"
|
||||
#include "hw/acpi/acpi_aml_interface.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/isa/isa.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
@ -83,9 +83,9 @@ static void serial_isa_realizefn(DeviceState *dev, Error **errp)
|
||||
isa_register_ioport(isadev, &s->io, isa->iobase);
|
||||
}
|
||||
|
||||
static void serial_isa_build_aml(ISADevice *isadev, Aml *scope)
|
||||
static void serial_isa_build_aml(AcpiDevAmlIf *adev, Aml *scope)
|
||||
{
|
||||
ISASerialState *isa = ISA_SERIAL(isadev);
|
||||
ISASerialState *isa = ISA_SERIAL(adev);
|
||||
Aml *dev;
|
||||
Aml *crs;
|
||||
|
||||
@ -122,11 +122,11 @@ static Property serial_isa_properties[] = {
|
||||
static void serial_isa_class_initfn(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
ISADeviceClass *isa = ISA_DEVICE_CLASS(klass);
|
||||
AcpiDevAmlIfClass *adevc = ACPI_DEV_AML_IF_CLASS(klass);
|
||||
|
||||
dc->realize = serial_isa_realizefn;
|
||||
dc->vmsd = &vmstate_isa_serial;
|
||||
isa->build_aml = serial_isa_build_aml;
|
||||
adevc->build_dev_aml = serial_isa_build_aml;
|
||||
device_class_set_props(dc, serial_isa_properties);
|
||||
set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
|
||||
}
|
||||
@ -146,6 +146,10 @@ static const TypeInfo serial_isa_info = {
|
||||
.instance_size = sizeof(ISASerialState),
|
||||
.instance_init = serial_isa_initfn,
|
||||
.class_init = serial_isa_class_initfn,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ TYPE_ACPI_DEV_AML_IF },
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static void serial_register_types(void)
|
||||
|
@ -33,7 +33,6 @@
|
||||
#include "sysemu/qtest.h"
|
||||
#include "hw/pci/pci.h"
|
||||
#include "hw/mem/nvdimm.h"
|
||||
#include "hw/cxl/cxl.h"
|
||||
#include "migration/global_state.h"
|
||||
#include "migration/vmstate.h"
|
||||
#include "exec/confidential-guest-support.h"
|
||||
@ -629,20 +628,6 @@ static void machine_set_nvdimm_persistence(Object *obj, const char *value,
|
||||
nvdimms_state->persistence_string = g_strdup(value);
|
||||
}
|
||||
|
||||
static bool machine_get_cxl(Object *obj, Error **errp)
|
||||
{
|
||||
MachineState *ms = MACHINE(obj);
|
||||
|
||||
return ms->cxl_devices_state->is_enabled;
|
||||
}
|
||||
|
||||
static void machine_set_cxl(Object *obj, bool value, Error **errp)
|
||||
{
|
||||
MachineState *ms = MACHINE(obj);
|
||||
|
||||
ms->cxl_devices_state->is_enabled = value;
|
||||
}
|
||||
|
||||
void machine_class_allow_dynamic_sysbus_dev(MachineClass *mc, const char *type)
|
||||
{
|
||||
QAPI_LIST_PREPEND(mc->allowed_dynamic_sysbus_devices, g_strdup(type));
|
||||
@ -929,8 +914,6 @@ static void machine_class_init(ObjectClass *oc, void *data)
|
||||
mc->default_ram_size = 128 * MiB;
|
||||
mc->rom_file_has_mr = true;
|
||||
|
||||
/* Few machines support CXL, so default to off */
|
||||
mc->cxl_supported = false;
|
||||
/* numa node memory size aligned on 8MB by default.
|
||||
* On Linux, each node's border has to be 8MB aligned
|
||||
*/
|
||||
@ -1091,16 +1074,6 @@ static void machine_initfn(Object *obj)
|
||||
"Valid values are cpu, mem-ctrl");
|
||||
}
|
||||
|
||||
if (mc->cxl_supported) {
|
||||
Object *obj = OBJECT(ms);
|
||||
|
||||
ms->cxl_devices_state = g_new0(CXLState, 1);
|
||||
object_property_add_bool(obj, "cxl", machine_get_cxl, machine_set_cxl);
|
||||
object_property_set_description(obj, "cxl",
|
||||
"Set on/off to enable/disable "
|
||||
"CXL instantiation");
|
||||
}
|
||||
|
||||
if (mc->cpu_index_to_instance_props && mc->get_default_cpu_node_id) {
|
||||
ms->numa_state = g_new0(NumaState, 1);
|
||||
object_property_add_bool(obj, "hmat",
|
||||
@ -1138,7 +1111,6 @@ static void machine_finalize(Object *obj)
|
||||
g_free(ms->device_memory);
|
||||
g_free(ms->nvdimms_state);
|
||||
g_free(ms->numa_state);
|
||||
g_free(ms->cxl_devices_state);
|
||||
}
|
||||
|
||||
bool machine_usb(MachineState *machine)
|
||||
|
@ -154,7 +154,8 @@ static void ras_init_common(uint32_t *reg_state, uint32_t *write_msk)
|
||||
reg_state[R_CXL_RAS_ERR_CAP_CTRL] = 0x00;
|
||||
}
|
||||
|
||||
static void hdm_init_common(uint32_t *reg_state, uint32_t *write_msk)
|
||||
static void hdm_init_common(uint32_t *reg_state, uint32_t *write_msk,
|
||||
enum reg_type type)
|
||||
{
|
||||
int decoder_count = 1;
|
||||
int i;
|
||||
@ -174,6 +175,14 @@ static void hdm_init_common(uint32_t *reg_state, uint32_t *write_msk)
|
||||
write_msk[R_CXL_HDM_DECODER0_SIZE_LO + i * 0x20] = 0xf0000000;
|
||||
write_msk[R_CXL_HDM_DECODER0_SIZE_HI + i * 0x20] = 0xffffffff;
|
||||
write_msk[R_CXL_HDM_DECODER0_CTRL + i * 0x20] = 0x13ff;
|
||||
if (type == CXL2_DEVICE ||
|
||||
type == CXL2_TYPE3_DEVICE ||
|
||||
type == CXL2_LOGICAL_DEVICE) {
|
||||
write_msk[R_CXL_HDM_DECODER0_TARGET_LIST_LO + i * 0x20] = 0xf0000000;
|
||||
} else {
|
||||
write_msk[R_CXL_HDM_DECODER0_TARGET_LIST_LO + i * 0x20] = 0xffffffff;
|
||||
}
|
||||
write_msk[R_CXL_HDM_DECODER0_TARGET_LIST_HI + i * 0x20] = 0xffffffff;
|
||||
}
|
||||
}
|
||||
|
||||
@ -239,7 +248,7 @@ void cxl_component_register_init_common(uint32_t *reg_state, uint32_t *write_msk
|
||||
}
|
||||
|
||||
init_cap_reg(HDM, 5, 1);
|
||||
hdm_init_common(reg_state, write_msk);
|
||||
hdm_init_common(reg_state, write_msk, type);
|
||||
|
||||
if (caps < 5) {
|
||||
return;
|
||||
|
@ -6,11 +6,10 @@
|
||||
#include "qemu/osdep.h"
|
||||
#include "qapi/error.h"
|
||||
#include "hw/cxl/cxl.h"
|
||||
#include "hw/cxl/cxl_host.h"
|
||||
|
||||
void cxl_fixed_memory_window_config(MachineState *ms,
|
||||
CXLFixedMemoryWindowOptions *object,
|
||||
Error **errp) {};
|
||||
|
||||
void cxl_fixed_memory_window_link_targets(Error **errp) {};
|
||||
void cxl_fmws_link_targets(CXLState *stat, Error **errp) {};
|
||||
void cxl_machine_init(Object *obj, CXLState *state) {};
|
||||
void cxl_hook_up_pxb_registers(PCIBus *bus, CXLState *state, Error **errp) {};
|
||||
|
||||
const MemoryRegionOps cfmws_ops;
|
||||
|
@ -15,14 +15,16 @@
|
||||
|
||||
#include "qapi/qapi-visit-machine.h"
|
||||
#include "hw/cxl/cxl.h"
|
||||
#include "hw/cxl/cxl_host.h"
|
||||
#include "hw/pci/pci_bus.h"
|
||||
#include "hw/pci/pci_bridge.h"
|
||||
#include "hw/pci/pci_host.h"
|
||||
#include "hw/pci/pcie_port.h"
|
||||
#include "hw/pci-bridge/pci_expander_bridge.h"
|
||||
|
||||
void cxl_fixed_memory_window_config(MachineState *ms,
|
||||
CXLFixedMemoryWindowOptions *object,
|
||||
Error **errp)
|
||||
static void cxl_fixed_memory_window_config(CXLState *cxl_state,
|
||||
CXLFixedMemoryWindowOptions *object,
|
||||
Error **errp)
|
||||
{
|
||||
CXLFixedWindow *fw = g_malloc0(sizeof(*fw));
|
||||
strList *target;
|
||||
@ -62,20 +64,17 @@ void cxl_fixed_memory_window_config(MachineState *ms,
|
||||
fw->enc_int_gran = 0;
|
||||
}
|
||||
|
||||
ms->cxl_devices_state->fixed_windows =
|
||||
g_list_append(ms->cxl_devices_state->fixed_windows, fw);
|
||||
cxl_state->fixed_windows = g_list_append(cxl_state->fixed_windows, fw);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void cxl_fixed_memory_window_link_targets(Error **errp)
|
||||
void cxl_fmws_link_targets(CXLState *cxl_state, Error **errp)
|
||||
{
|
||||
MachineState *ms = MACHINE(qdev_get_machine());
|
||||
|
||||
if (ms->cxl_devices_state && ms->cxl_devices_state->fixed_windows) {
|
||||
if (cxl_state && cxl_state->fixed_windows) {
|
||||
GList *it;
|
||||
|
||||
for (it = ms->cxl_devices_state->fixed_windows; it; it = it->next) {
|
||||
for (it = cxl_state->fixed_windows; it; it = it->next) {
|
||||
CXLFixedWindow *fw = it->data;
|
||||
int i;
|
||||
|
||||
@ -220,3 +219,84 @@ const MemoryRegionOps cfmws_ops = {
|
||||
.unaligned = true,
|
||||
},
|
||||
};
|
||||
|
||||
static void machine_get_cxl(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
CXLState *cxl_state = opaque;
|
||||
bool value = cxl_state->is_enabled;
|
||||
|
||||
visit_type_bool(v, name, &value, errp);
|
||||
}
|
||||
|
||||
static void machine_set_cxl(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
CXLState *cxl_state = opaque;
|
||||
bool value;
|
||||
|
||||
if (!visit_type_bool(v, name, &value, errp)) {
|
||||
return;
|
||||
}
|
||||
cxl_state->is_enabled = value;
|
||||
}
|
||||
|
||||
static void machine_get_cfmw(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
CXLFixedMemoryWindowOptionsList **list = opaque;
|
||||
|
||||
visit_type_CXLFixedMemoryWindowOptionsList(v, name, list, errp);
|
||||
}
|
||||
|
||||
static void machine_set_cfmw(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
CXLState *state = opaque;
|
||||
CXLFixedMemoryWindowOptionsList *cfmw_list = NULL;
|
||||
CXLFixedMemoryWindowOptionsList *it;
|
||||
|
||||
visit_type_CXLFixedMemoryWindowOptionsList(v, name, &cfmw_list, errp);
|
||||
if (!cfmw_list) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (it = cfmw_list; it; it = it->next) {
|
||||
cxl_fixed_memory_window_config(state, it->value, errp);
|
||||
}
|
||||
state->cfmw_list = cfmw_list;
|
||||
}
|
||||
|
||||
void cxl_machine_init(Object *obj, CXLState *state)
|
||||
{
|
||||
object_property_add(obj, "cxl", "bool", machine_get_cxl,
|
||||
machine_set_cxl, NULL, state);
|
||||
object_property_set_description(obj, "cxl",
|
||||
"Set on/off to enable/disable "
|
||||
"CXL instantiation");
|
||||
|
||||
object_property_add(obj, "cxl-fmw", "CXLFixedMemoryWindow",
|
||||
machine_get_cfmw, machine_set_cfmw,
|
||||
NULL, state);
|
||||
object_property_set_description(obj, "cxl-fmw",
|
||||
"CXL Fixed Memory Windows (array)");
|
||||
}
|
||||
|
||||
void cxl_hook_up_pxb_registers(PCIBus *bus, CXLState *state, Error **errp)
|
||||
{
|
||||
/* Walk the pci busses looking for pxb busses to hook up */
|
||||
if (bus) {
|
||||
QLIST_FOREACH(bus, &bus->child, sibling) {
|
||||
if (!pci_bus_is_root(bus)) {
|
||||
continue;
|
||||
}
|
||||
if (pci_bus_is_cxl(bus)) {
|
||||
if (!state->is_enabled) {
|
||||
error_setg(errp, "CXL host bridges present, but cxl=off");
|
||||
return;
|
||||
}
|
||||
pxb_cxl_hook_up_registers(state, bus, errp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -29,6 +29,7 @@
|
||||
|
||||
#include "hw/i386/ich9.h"
|
||||
#include "qom/object.h"
|
||||
#include "hw/acpi/acpi_aml_interface.h"
|
||||
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(ICH9SMBState, ICH9_SMB_DEVICE)
|
||||
|
||||
@ -94,10 +95,22 @@ static void ich9_smbus_realize(PCIDevice *d, Error **errp)
|
||||
&s->smb.io);
|
||||
}
|
||||
|
||||
static void build_ich9_smb_aml(AcpiDevAmlIf *adev, Aml *scope)
|
||||
{
|
||||
BusChild *kid;
|
||||
ICH9SMBState *s = ICH9_SMB_DEVICE(adev);
|
||||
BusState *bus = BUS(s->smb.smbus);
|
||||
|
||||
QTAILQ_FOREACH(kid, &bus->children, sibling) {
|
||||
call_dev_aml_func(DEVICE(kid->child), scope);
|
||||
}
|
||||
}
|
||||
|
||||
static void ich9_smb_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
||||
AcpiDevAmlIfClass *adevc = ACPI_DEV_AML_IF_CLASS(klass);
|
||||
|
||||
k->vendor_id = PCI_VENDOR_ID_INTEL;
|
||||
k->device_id = PCI_DEVICE_ID_INTEL_ICH9_6;
|
||||
@ -112,6 +125,7 @@ static void ich9_smb_class_init(ObjectClass *klass, void *data)
|
||||
* pc_q35_init()
|
||||
*/
|
||||
dc->user_creatable = false;
|
||||
adevc->build_dev_aml = build_ich9_smb_aml;
|
||||
}
|
||||
|
||||
static void ich9_smb_set_irq(PMSMBus *pmsmb, bool enabled)
|
||||
@ -143,6 +157,7 @@ static const TypeInfo ich9_smb_info = {
|
||||
.class_init = ich9_smb_class_init,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ INTERFACE_CONVENTIONAL_PCI_DEVICE },
|
||||
{ TYPE_ACPI_DEV_AML_IF },
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
@ -31,16 +31,14 @@
|
||||
#include "hw/cxl/cxl.h"
|
||||
#include "hw/core/cpu.h"
|
||||
#include "target/i386/cpu.h"
|
||||
#include "hw/misc/pvpanic.h"
|
||||
#include "hw/timer/hpet.h"
|
||||
#include "hw/acpi/acpi-defs.h"
|
||||
#include "hw/acpi/acpi.h"
|
||||
#include "hw/acpi/cpu.h"
|
||||
#include "hw/nvram/fw_cfg.h"
|
||||
#include "hw/acpi/bios-linker-loader.h"
|
||||
#include "hw/isa/isa.h"
|
||||
#include "hw/acpi/acpi_aml_interface.h"
|
||||
#include "hw/input/i8042.h"
|
||||
#include "hw/block/fdc.h"
|
||||
#include "hw/acpi/memory_hotplug.h"
|
||||
#include "sysemu/tpm.h"
|
||||
#include "hw/acpi/tpm.h"
|
||||
@ -74,7 +72,6 @@
|
||||
#include "hw/i386/intel_iommu.h"
|
||||
#include "hw/virtio/virtio-iommu.h"
|
||||
|
||||
#include "hw/acpi/ipmi.h"
|
||||
#include "hw/acpi/hmat.h"
|
||||
#include "hw/acpi/viot.h"
|
||||
#include "hw/acpi/cxl.h"
|
||||
@ -121,8 +118,6 @@ typedef struct AcpiMiscInfo {
|
||||
#endif
|
||||
const unsigned char *dsdt_code;
|
||||
unsigned dsdt_size;
|
||||
uint16_t pvpanic_port;
|
||||
uint16_t applesmc_io_base;
|
||||
} AcpiMiscInfo;
|
||||
|
||||
typedef struct AcpiBuildPciBusHotplugState {
|
||||
@ -307,8 +302,6 @@ static void acpi_get_misc_info(AcpiMiscInfo *info)
|
||||
#ifdef CONFIG_TPM
|
||||
info->tpm_version = tpm_get_version(tpm_find());
|
||||
#endif
|
||||
info->pvpanic_port = pvpanic_port();
|
||||
info->applesmc_io_base = applesmc_port();
|
||||
}
|
||||
|
||||
/*
|
||||
@ -865,21 +858,6 @@ static Aml *build_vmbus_device_aml(VMBusBridge *vmbus_bridge)
|
||||
return dev;
|
||||
}
|
||||
|
||||
static void build_isa_devices_aml(Aml *table)
|
||||
{
|
||||
bool ambiguous;
|
||||
Object *obj = object_resolve_path_type("", TYPE_ISA_BUS, &ambiguous);
|
||||
Aml *scope;
|
||||
|
||||
assert(obj && !ambiguous);
|
||||
|
||||
scope = aml_scope("_SB.PCI0.ISA");
|
||||
build_acpi_ipmi_devices(scope, BUS(obj), "\\_SB.PCI0.ISA");
|
||||
isa_build_aml(ISA_BUS(obj), scope);
|
||||
|
||||
aml_append(table, scope);
|
||||
}
|
||||
|
||||
static void build_dbg_aml(Aml *table)
|
||||
{
|
||||
Aml *field;
|
||||
@ -1265,15 +1243,22 @@ static void build_q35_isa_bridge(Aml *table)
|
||||
{
|
||||
Aml *dev;
|
||||
Aml *scope;
|
||||
Object *obj;
|
||||
bool ambiguous;
|
||||
|
||||
/*
|
||||
* temporarily fish out isa bridge, build_q35_isa_bridge() will be dropped
|
||||
* once PCI is converted to AcpiDevAmlIf and would be ble to generate
|
||||
* AML for bridge itself
|
||||
*/
|
||||
obj = object_resolve_path_type("", TYPE_ICH9_LPC_DEVICE, &ambiguous);
|
||||
assert(obj && !ambiguous);
|
||||
|
||||
scope = aml_scope("_SB.PCI0");
|
||||
dev = aml_device("ISA");
|
||||
aml_append(dev, aml_name_decl("_ADR", aml_int(0x001F0000)));
|
||||
|
||||
/* ICH9 PCI to ISA irq remapping */
|
||||
aml_append(dev, aml_operation_region("PIRQ", AML_PCI_CONFIG,
|
||||
aml_int(0x60), 0x0C));
|
||||
|
||||
call_dev_aml_func(DEVICE(obj), dev);
|
||||
aml_append(scope, dev);
|
||||
aml_append(table, scope);
|
||||
}
|
||||
@ -1282,15 +1267,22 @@ static void build_piix4_isa_bridge(Aml *table)
|
||||
{
|
||||
Aml *dev;
|
||||
Aml *scope;
|
||||
Object *obj;
|
||||
bool ambiguous;
|
||||
|
||||
/*
|
||||
* temporarily fish out isa bridge, build_piix4_isa_bridge() will be dropped
|
||||
* once PCI is converted to AcpiDevAmlIf and would be ble to generate
|
||||
* AML for bridge itself
|
||||
*/
|
||||
obj = object_resolve_path_type("", TYPE_PIIX3_PCI_DEVICE, &ambiguous);
|
||||
assert(obj && !ambiguous);
|
||||
|
||||
scope = aml_scope("_SB.PCI0");
|
||||
dev = aml_device("ISA");
|
||||
aml_append(dev, aml_name_decl("_ADR", aml_int(0x00010000)));
|
||||
|
||||
/* PIIX PCI to ISA irq remapping */
|
||||
aml_append(dev, aml_operation_region("P40C", AML_PCI_CONFIG,
|
||||
aml_int(0x60), 0x04));
|
||||
|
||||
call_dev_aml_func(DEVICE(obj), dev);
|
||||
aml_append(scope, dev);
|
||||
aml_append(table, scope);
|
||||
}
|
||||
@ -1401,13 +1393,21 @@ static Aml *build_q35_osc_method(bool enable_native_pcie_hotplug)
|
||||
return method;
|
||||
}
|
||||
|
||||
static void build_smb0(Aml *table, I2CBus *smbus, int devnr, int func)
|
||||
static void build_smb0(Aml *table, int devnr, int func)
|
||||
{
|
||||
Aml *scope = aml_scope("_SB.PCI0");
|
||||
Aml *dev = aml_device("SMB0");
|
||||
bool ambiguous;
|
||||
Object *obj;
|
||||
/*
|
||||
* temporarily fish out device hosting SMBUS, build_smb0 will be gone once
|
||||
* PCI enumeration will be switched to call_dev_aml_func()
|
||||
*/
|
||||
obj = object_resolve_path_type("", TYPE_ICH9_SMB_DEVICE, &ambiguous);
|
||||
assert(obj && !ambiguous);
|
||||
|
||||
aml_append(dev, aml_name_decl("_ADR", aml_int(devnr << 16 | func)));
|
||||
build_acpi_ipmi_devices(dev, BUS(smbus), "\\_SB.PCI0.SMB0");
|
||||
call_dev_aml_func(DEVICE(obj), dev);
|
||||
aml_append(scope, dev);
|
||||
aml_append(table, scope);
|
||||
}
|
||||
@ -1470,7 +1470,6 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
|
||||
build_hpet_aml(dsdt);
|
||||
}
|
||||
build_piix4_isa_bridge(dsdt);
|
||||
build_isa_devices_aml(dsdt);
|
||||
if (pm->pcihp_bridge_en || pm->pcihp_root_en) {
|
||||
build_x86_acpi_pci_hotplug(dsdt, pm->pcihp_io_base);
|
||||
}
|
||||
@ -1519,13 +1518,12 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
|
||||
build_hpet_aml(dsdt);
|
||||
}
|
||||
build_q35_isa_bridge(dsdt);
|
||||
build_isa_devices_aml(dsdt);
|
||||
if (pm->pcihp_bridge_en) {
|
||||
build_x86_acpi_pci_hotplug(dsdt, pm->pcihp_io_base);
|
||||
}
|
||||
build_q35_pci0_int(dsdt);
|
||||
if (pcms->smbus && !pcmc->do_not_add_smb_acpi) {
|
||||
build_smb0(dsdt, pcms->smbus, ICH9_SMB_DEV, ICH9_SMB_FUNC);
|
||||
if (pcms->smbus) {
|
||||
build_smb0(dsdt, ICH9_SMB_DEV, ICH9_SMB_FUNC);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1633,7 +1631,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
|
||||
|
||||
/* Handle the ranges for the PXB expanders */
|
||||
if (pci_bus_is_cxl(bus)) {
|
||||
MemoryRegion *mr = &machine->cxl_devices_state->host_mr;
|
||||
MemoryRegion *mr = &pcms->cxl_devices_state.host_mr;
|
||||
uint64_t base = mr->addr;
|
||||
|
||||
cxl_present = true;
|
||||
@ -1796,110 +1794,15 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
|
||||
aml_append(dsdt, scope);
|
||||
}
|
||||
|
||||
if (misc->applesmc_io_base) {
|
||||
scope = aml_scope("\\_SB.PCI0.ISA");
|
||||
dev = aml_device("SMC");
|
||||
|
||||
aml_append(dev, aml_name_decl("_HID", aml_eisaid("APP0001")));
|
||||
/* device present, functioning, decoding, not shown in UI */
|
||||
aml_append(dev, aml_name_decl("_STA", aml_int(0xB)));
|
||||
|
||||
crs = aml_resource_template();
|
||||
aml_append(crs,
|
||||
aml_io(AML_DECODE16, misc->applesmc_io_base, misc->applesmc_io_base,
|
||||
0x01, APPLESMC_MAX_DATA_LENGTH)
|
||||
);
|
||||
aml_append(crs, aml_irq_no_flags(6));
|
||||
aml_append(dev, aml_name_decl("_CRS", crs));
|
||||
|
||||
aml_append(scope, dev);
|
||||
aml_append(dsdt, scope);
|
||||
}
|
||||
|
||||
if (misc->pvpanic_port) {
|
||||
scope = aml_scope("\\_SB.PCI0.ISA");
|
||||
|
||||
dev = aml_device("PEVT");
|
||||
aml_append(dev, aml_name_decl("_HID", aml_string("QEMU0001")));
|
||||
|
||||
crs = aml_resource_template();
|
||||
aml_append(crs,
|
||||
aml_io(AML_DECODE16, misc->pvpanic_port, misc->pvpanic_port, 1, 1)
|
||||
);
|
||||
aml_append(dev, aml_name_decl("_CRS", crs));
|
||||
|
||||
aml_append(dev, aml_operation_region("PEOR", AML_SYSTEM_IO,
|
||||
aml_int(misc->pvpanic_port), 1));
|
||||
field = aml_field("PEOR", AML_BYTE_ACC, AML_NOLOCK, AML_PRESERVE);
|
||||
aml_append(field, aml_named_field("PEPT", 8));
|
||||
aml_append(dev, field);
|
||||
|
||||
/* device present, functioning, decoding, shown in UI */
|
||||
aml_append(dev, aml_name_decl("_STA", aml_int(0xF)));
|
||||
|
||||
method = aml_method("RDPT", 0, AML_NOTSERIALIZED);
|
||||
aml_append(method, aml_store(aml_name("PEPT"), aml_local(0)));
|
||||
aml_append(method, aml_return(aml_local(0)));
|
||||
aml_append(dev, method);
|
||||
|
||||
method = aml_method("WRPT", 1, AML_NOTSERIALIZED);
|
||||
aml_append(method, aml_store(aml_arg(0), aml_name("PEPT")));
|
||||
aml_append(dev, method);
|
||||
|
||||
aml_append(scope, dev);
|
||||
aml_append(dsdt, scope);
|
||||
}
|
||||
|
||||
sb_scope = aml_scope("\\_SB");
|
||||
{
|
||||
Object *pci_host;
|
||||
PCIBus *bus = NULL;
|
||||
|
||||
pci_host = acpi_get_i386_pci_host();
|
||||
Object *pci_host = acpi_get_i386_pci_host();
|
||||
|
||||
if (pci_host) {
|
||||
bus = PCI_HOST_BRIDGE(pci_host)->bus;
|
||||
}
|
||||
|
||||
if (bus) {
|
||||
PCIBus *bus = PCI_HOST_BRIDGE(pci_host)->bus;
|
||||
Aml *scope = aml_scope("PCI0");
|
||||
/* Scan all PCI buses. Generate tables to support hotplug. */
|
||||
build_append_pci_bus_devices(scope, bus, pm->pcihp_bridge_en);
|
||||
|
||||
#ifdef CONFIG_TPM
|
||||
if (TPM_IS_TIS_ISA(tpm)) {
|
||||
if (misc->tpm_version == TPM_VERSION_2_0) {
|
||||
dev = aml_device("TPM");
|
||||
aml_append(dev, aml_name_decl("_HID",
|
||||
aml_string("MSFT0101")));
|
||||
aml_append(dev,
|
||||
aml_name_decl("_STR",
|
||||
aml_string("TPM 2.0 Device")));
|
||||
} else {
|
||||
dev = aml_device("ISA.TPM");
|
||||
aml_append(dev, aml_name_decl("_HID",
|
||||
aml_eisaid("PNP0C31")));
|
||||
}
|
||||
aml_append(dev, aml_name_decl("_UID", aml_int(1)));
|
||||
|
||||
aml_append(dev, aml_name_decl("_STA", aml_int(0xF)));
|
||||
crs = aml_resource_template();
|
||||
aml_append(crs, aml_memory32_fixed(TPM_TIS_ADDR_BASE,
|
||||
TPM_TIS_ADDR_SIZE, AML_READ_WRITE));
|
||||
/*
|
||||
FIXME: TPM_TIS_IRQ=5 conflicts with PNP0C0F irqs,
|
||||
Rewrite to take IRQ from TPM device model and
|
||||
fix default IRQ value there to use some unused IRQ
|
||||
*/
|
||||
/* aml_append(crs, aml_irq_no_flags(TPM_TIS_IRQ)); */
|
||||
aml_append(dev, aml_name_decl("_CRS", crs));
|
||||
|
||||
tpm_build_ppi_acpi(tpm, dev);
|
||||
|
||||
aml_append(scope, dev);
|
||||
}
|
||||
#endif
|
||||
|
||||
aml_append(sb_scope, scope);
|
||||
}
|
||||
}
|
||||
@ -2711,9 +2614,9 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine)
|
||||
machine->nvdimms_state, machine->ram_slots,
|
||||
x86ms->oem_id, x86ms->oem_table_id);
|
||||
}
|
||||
if (machine->cxl_devices_state->is_enabled) {
|
||||
cxl_build_cedt(machine, table_offsets, tables_blob, tables->linker,
|
||||
x86ms->oem_id, x86ms->oem_table_id);
|
||||
if (pcms->cxl_devices_state.is_enabled) {
|
||||
cxl_build_cedt(table_offsets, tables_blob, tables->linker,
|
||||
x86ms->oem_id, x86ms->oem_table_id, &pcms->cxl_devices_state);
|
||||
}
|
||||
|
||||
acpi_add_table(table_offsets, tables_blob);
|
||||
|
31
hw/i386/pc.c
31
hw/i386/pc.c
@ -37,6 +37,7 @@
|
||||
#include "hw/ide.h"
|
||||
#include "hw/pci/pci.h"
|
||||
#include "hw/pci/pci_bus.h"
|
||||
#include "hw/pci-bridge/pci_expander_bridge.h"
|
||||
#include "hw/nvram/fw_cfg.h"
|
||||
#include "hw/timer/hpet.h"
|
||||
#include "hw/firmware/smbios.h"
|
||||
@ -76,6 +77,7 @@
|
||||
#include "hw/mem/pc-dimm.h"
|
||||
#include "hw/mem/nvdimm.h"
|
||||
#include "hw/cxl/cxl.h"
|
||||
#include "hw/cxl/cxl_host.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qapi/qapi-visit-common.h"
|
||||
#include "qapi/qapi-visit-machine.h"
|
||||
@ -732,6 +734,13 @@ void pc_machine_done(Notifier *notifier, void *data)
|
||||
PCMachineState, machine_done);
|
||||
X86MachineState *x86ms = X86_MACHINE(pcms);
|
||||
|
||||
cxl_hook_up_pxb_registers(pcms->bus, &pcms->cxl_devices_state,
|
||||
&error_fatal);
|
||||
|
||||
if (pcms->cxl_devices_state.is_enabled) {
|
||||
cxl_fmws_link_targets(&pcms->cxl_devices_state, &error_fatal);
|
||||
}
|
||||
|
||||
/* set the number of CPUs */
|
||||
x86_rtc_set_cpus_count(x86ms->rtc, x86ms->boot_cpus);
|
||||
|
||||
@ -899,8 +908,8 @@ void pc_memory_init(PCMachineState *pcms,
|
||||
&machine->device_memory->mr);
|
||||
}
|
||||
|
||||
if (machine->cxl_devices_state->is_enabled) {
|
||||
MemoryRegion *mr = &machine->cxl_devices_state->host_mr;
|
||||
if (pcms->cxl_devices_state.is_enabled) {
|
||||
MemoryRegion *mr = &pcms->cxl_devices_state.host_mr;
|
||||
hwaddr cxl_size = MiB;
|
||||
|
||||
if (pcmc->has_reserved_memory && machine->device_memory->base) {
|
||||
@ -918,12 +927,12 @@ void pc_memory_init(PCMachineState *pcms,
|
||||
memory_region_init(mr, OBJECT(machine), "cxl_host_reg", cxl_size);
|
||||
memory_region_add_subregion(system_memory, cxl_base, mr);
|
||||
cxl_resv_end = cxl_base + cxl_size;
|
||||
if (machine->cxl_devices_state->fixed_windows) {
|
||||
if (pcms->cxl_devices_state.fixed_windows) {
|
||||
hwaddr cxl_fmw_base;
|
||||
GList *it;
|
||||
|
||||
cxl_fmw_base = ROUND_UP(cxl_base + cxl_size, 256 * MiB);
|
||||
for (it = machine->cxl_devices_state->fixed_windows; it; it = it->next) {
|
||||
for (it = pcms->cxl_devices_state.fixed_windows; it; it = it->next) {
|
||||
CXLFixedWindow *fw = it->data;
|
||||
|
||||
fw->base = cxl_fmw_base;
|
||||
@ -965,7 +974,7 @@ void pc_memory_init(PCMachineState *pcms,
|
||||
res_mem_end += memory_region_size(&machine->device_memory->mr);
|
||||
}
|
||||
|
||||
if (machine->cxl_devices_state->is_enabled) {
|
||||
if (pcms->cxl_devices_state.is_enabled) {
|
||||
res_mem_end = cxl_resv_end;
|
||||
}
|
||||
*val = cpu_to_le64(ROUND_UP(res_mem_end, 1 * GiB));
|
||||
@ -1001,12 +1010,12 @@ uint64_t pc_pci_hole64_start(void)
|
||||
X86MachineState *x86ms = X86_MACHINE(pcms);
|
||||
uint64_t hole64_start = 0;
|
||||
|
||||
if (ms->cxl_devices_state->host_mr.addr) {
|
||||
hole64_start = ms->cxl_devices_state->host_mr.addr +
|
||||
memory_region_size(&ms->cxl_devices_state->host_mr);
|
||||
if (ms->cxl_devices_state->fixed_windows) {
|
||||
if (pcms->cxl_devices_state.host_mr.addr) {
|
||||
hole64_start = pcms->cxl_devices_state.host_mr.addr +
|
||||
memory_region_size(&pcms->cxl_devices_state.host_mr);
|
||||
if (pcms->cxl_devices_state.fixed_windows) {
|
||||
GList *it;
|
||||
for (it = ms->cxl_devices_state->fixed_windows; it; it = it->next) {
|
||||
for (it = pcms->cxl_devices_state.fixed_windows; it; it = it->next) {
|
||||
CXLFixedWindow *fw = it->data;
|
||||
hole64_start = fw->mr.addr + memory_region_size(&fw->mr);
|
||||
}
|
||||
@ -1706,6 +1715,7 @@ static void pc_machine_initfn(Object *obj)
|
||||
pcms->pcspk = isa_new(TYPE_PC_SPEAKER);
|
||||
object_property_add_alias(OBJECT(pcms), "pcspk-audiodev",
|
||||
OBJECT(pcms->pcspk), "audiodev");
|
||||
cxl_machine_init(obj, &pcms->cxl_devices_state);
|
||||
}
|
||||
|
||||
static void pc_machine_reset(MachineState *machine)
|
||||
@ -1794,7 +1804,6 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
|
||||
mc->default_cpu_type = TARGET_DEFAULT_CPU_TYPE;
|
||||
mc->nvdimm_supported = true;
|
||||
mc->smp_props.dies_supported = true;
|
||||
mc->cxl_supported = true;
|
||||
mc->default_ram_id = "pc.ram";
|
||||
|
||||
object_class_property_add(oc, PC_MACHINE_MAX_RAM_BELOW_4G, "size",
|
||||
|
@ -563,7 +563,6 @@ static void pc_i440fx_3_1_machine_options(MachineClass *m)
|
||||
|
||||
pc_i440fx_4_0_machine_options(m);
|
||||
m->is_default = false;
|
||||
pcmc->do_not_add_smb_acpi = true;
|
||||
m->smbus_no_migration_support = true;
|
||||
m->alias = NULL;
|
||||
pcmc->pvh_enabled = false;
|
||||
|
@ -514,7 +514,6 @@ static void pc_q35_3_1_machine_options(MachineClass *m)
|
||||
|
||||
pc_q35_4_0_machine_options(m);
|
||||
m->default_kernel_irqchip_split = false;
|
||||
pcmc->do_not_add_smb_acpi = true;
|
||||
m->smbus_no_migration_support = true;
|
||||
m->alias = NULL;
|
||||
pcmc->pvh_enabled = false;
|
||||
|
@ -29,7 +29,7 @@
|
||||
#include "qapi/error.h"
|
||||
#include "hw/isa/isa.h"
|
||||
#include "migration/vmstate.h"
|
||||
#include "hw/acpi/aml-build.h"
|
||||
#include "hw/acpi/acpi_aml_interface.h"
|
||||
#include "hw/input/ps2.h"
|
||||
#include "hw/irq.h"
|
||||
#include "hw/input/i8042.h"
|
||||
@ -767,9 +767,9 @@ static void i8042_realizefn(DeviceState *dev, Error **errp)
|
||||
qemu_register_reset(kbd_reset, s);
|
||||
}
|
||||
|
||||
static void i8042_build_aml(ISADevice *isadev, Aml *scope)
|
||||
static void i8042_build_aml(AcpiDevAmlIf *adev, Aml *scope)
|
||||
{
|
||||
ISAKBDState *isa_s = I8042(isadev);
|
||||
ISAKBDState *isa_s = I8042(adev);
|
||||
Aml *kbd;
|
||||
Aml *mou;
|
||||
Aml *crs;
|
||||
@ -807,12 +807,12 @@ static Property i8042_properties[] = {
|
||||
static void i8042_class_initfn(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
ISADeviceClass *isa = ISA_DEVICE_CLASS(klass);
|
||||
AcpiDevAmlIfClass *adevc = ACPI_DEV_AML_IF_CLASS(klass);
|
||||
|
||||
device_class_set_props(dc, i8042_properties);
|
||||
dc->realize = i8042_realizefn;
|
||||
dc->vmsd = &vmstate_kbd_isa;
|
||||
isa->build_aml = i8042_build_aml;
|
||||
adevc->build_dev_aml = i8042_build_aml;
|
||||
set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
|
||||
}
|
||||
|
||||
@ -822,6 +822,10 @@ static const TypeInfo i8042_info = {
|
||||
.instance_size = sizeof(ISAKBDState),
|
||||
.instance_init = i8042_initfn,
|
||||
.class_init = i8042_class_initfn,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ TYPE_ACPI_DEV_AML_IF },
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static void i8042_register_types(void)
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "migration/vmstate.h"
|
||||
#include "qom/object.h"
|
||||
#include "hw/acpi/ipmi.h"
|
||||
|
||||
#define TYPE_ISA_IPMI_BT "isa-ipmi-bt"
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(ISAIPMIBTDevice, ISA_IPMI_BT)
|
||||
@ -144,6 +145,7 @@ static void isa_ipmi_bt_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(oc);
|
||||
IPMIInterfaceClass *iic = IPMI_INTERFACE_CLASS(oc);
|
||||
AcpiDevAmlIfClass *adevc = ACPI_DEV_AML_IF_CLASS(oc);
|
||||
|
||||
dc->realize = isa_ipmi_bt_realize;
|
||||
device_class_set_props(dc, ipmi_isa_properties);
|
||||
@ -151,6 +153,7 @@ static void isa_ipmi_bt_class_init(ObjectClass *oc, void *data)
|
||||
iic->get_backend_data = isa_ipmi_bt_get_backend_data;
|
||||
ipmi_bt_class_init(iic);
|
||||
iic->get_fwinfo = isa_ipmi_bt_get_fwinfo;
|
||||
adevc->build_dev_aml = build_ipmi_dev_aml;
|
||||
}
|
||||
|
||||
static const TypeInfo isa_ipmi_bt_info = {
|
||||
@ -161,6 +164,7 @@ static const TypeInfo isa_ipmi_bt_info = {
|
||||
.class_init = isa_ipmi_bt_class_init,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ TYPE_IPMI_INTERFACE },
|
||||
{ TYPE_ACPI_DEV_AML_IF },
|
||||
{ }
|
||||
}
|
||||
};
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "migration/vmstate.h"
|
||||
#include "qom/object.h"
|
||||
#include "hw/acpi/ipmi.h"
|
||||
|
||||
#define TYPE_ISA_IPMI_KCS "isa-ipmi-kcs"
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(ISAIPMIKCSDevice, ISA_IPMI_KCS)
|
||||
@ -151,6 +152,7 @@ static void isa_ipmi_kcs_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(oc);
|
||||
IPMIInterfaceClass *iic = IPMI_INTERFACE_CLASS(oc);
|
||||
AcpiDevAmlIfClass *adevc = ACPI_DEV_AML_IF_CLASS(oc);
|
||||
|
||||
dc->realize = ipmi_isa_realize;
|
||||
device_class_set_props(dc, ipmi_isa_properties);
|
||||
@ -158,6 +160,7 @@ static void isa_ipmi_kcs_class_init(ObjectClass *oc, void *data)
|
||||
iic->get_backend_data = isa_ipmi_kcs_get_backend_data;
|
||||
ipmi_kcs_class_init(iic);
|
||||
iic->get_fwinfo = isa_ipmi_kcs_get_fwinfo;
|
||||
adevc->build_dev_aml = build_ipmi_dev_aml;
|
||||
}
|
||||
|
||||
static const TypeInfo isa_ipmi_kcs_info = {
|
||||
@ -168,6 +171,7 @@ static const TypeInfo isa_ipmi_kcs_info = {
|
||||
.class_init = isa_ipmi_kcs_class_init,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ TYPE_IPMI_INTERFACE },
|
||||
{ TYPE_ACPI_DEV_AML_IF },
|
||||
{ }
|
||||
}
|
||||
};
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "qemu/error-report.h"
|
||||
#include "hw/ipmi/ipmi.h"
|
||||
#include "qom/object.h"
|
||||
#include "hw/acpi/ipmi.h"
|
||||
|
||||
#define TYPE_SMBUS_IPMI "smbus-ipmi"
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(SMBusIPMIDevice, SMBUS_IPMI)
|
||||
@ -353,6 +354,7 @@ static void smbus_ipmi_class_init(ObjectClass *oc, void *data)
|
||||
DeviceClass *dc = DEVICE_CLASS(oc);
|
||||
IPMIInterfaceClass *iic = IPMI_INTERFACE_CLASS(oc);
|
||||
SMBusDeviceClass *sc = SMBUS_DEVICE_CLASS(oc);
|
||||
AcpiDevAmlIfClass *adevc = ACPI_DEV_AML_IF_CLASS(oc);
|
||||
|
||||
sc->receive_byte = ipmi_receive_byte;
|
||||
sc->write_data = ipmi_write_data;
|
||||
@ -363,6 +365,7 @@ static void smbus_ipmi_class_init(ObjectClass *oc, void *data)
|
||||
iic->handle_if_event = smbus_ipmi_handle_event;
|
||||
iic->set_irq_enable = smbus_ipmi_set_irq_enable;
|
||||
iic->get_fwinfo = smbus_ipmi_get_fwinfo;
|
||||
adevc->build_dev_aml = build_ipmi_dev_aml;
|
||||
}
|
||||
|
||||
static const TypeInfo smbus_ipmi_info = {
|
||||
@ -373,6 +376,7 @@ static const TypeInfo smbus_ipmi_info = {
|
||||
.class_init = smbus_ipmi_class_init,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ TYPE_IPMI_INTERFACE },
|
||||
{ TYPE_ACPI_DEV_AML_IF },
|
||||
{ }
|
||||
}
|
||||
};
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "hw/sysbus.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "hw/isa/isa.h"
|
||||
#include "hw/acpi/acpi_aml_interface.h"
|
||||
|
||||
static ISABus *isabus;
|
||||
|
||||
@ -190,15 +191,9 @@ ISADevice *isa_vga_init(ISABus *bus)
|
||||
void isa_build_aml(ISABus *bus, Aml *scope)
|
||||
{
|
||||
BusChild *kid;
|
||||
ISADevice *dev;
|
||||
ISADeviceClass *dc;
|
||||
|
||||
QTAILQ_FOREACH(kid, &bus->parent_obj.children, sibling) {
|
||||
dev = ISA_DEVICE(kid->child);
|
||||
dc = ISA_DEVICE_GET_CLASS(dev);
|
||||
if (dc->build_aml) {
|
||||
dc->build_aml(dev, scope);
|
||||
}
|
||||
call_dev_aml_func(DEVICE(kid->child), scope);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -50,6 +50,7 @@
|
||||
#include "hw/core/cpu.h"
|
||||
#include "hw/nvram/fw_cfg.h"
|
||||
#include "qemu/cutils.h"
|
||||
#include "hw/acpi/acpi_aml_interface.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
/* ICH9 LPC PCI to ISA bridge */
|
||||
@ -803,12 +804,28 @@ static void ich9_send_gpe(AcpiDeviceIf *adev, AcpiEventStatusBits ev)
|
||||
acpi_send_gpe_event(&s->pm.acpi_regs, s->pm.irq, ev);
|
||||
}
|
||||
|
||||
static void build_ich9_isa_aml(AcpiDevAmlIf *adev, Aml *scope)
|
||||
{
|
||||
BusChild *kid;
|
||||
ICH9LPCState *s = ICH9_LPC_DEVICE(adev);
|
||||
BusState *bus = BUS(s->isa_bus);
|
||||
|
||||
/* ICH9 PCI to ISA irq remapping */
|
||||
aml_append(scope, aml_operation_region("PIRQ", AML_PCI_CONFIG,
|
||||
aml_int(0x60), 0x0C));
|
||||
|
||||
QTAILQ_FOREACH(kid, &bus->children, sibling) {
|
||||
call_dev_aml_func(DEVICE(kid->child), scope);
|
||||
}
|
||||
}
|
||||
|
||||
static void ich9_lpc_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
||||
HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
|
||||
AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_CLASS(klass);
|
||||
AcpiDevAmlIfClass *amldevc = ACPI_DEV_AML_IF_CLASS(klass);
|
||||
|
||||
set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
|
||||
dc->reset = ich9_lpc_reset;
|
||||
@ -833,6 +850,7 @@ static void ich9_lpc_class_init(ObjectClass *klass, void *data)
|
||||
adevc->ospm_status = ich9_pm_ospm_status;
|
||||
adevc->send_event = ich9_send_gpe;
|
||||
adevc->madt_cpu = pc_madt_cpu_entry;
|
||||
amldevc->build_dev_aml = build_ich9_isa_aml;
|
||||
}
|
||||
|
||||
static const TypeInfo ich9_lpc_info = {
|
||||
@ -845,6 +863,7 @@ static const TypeInfo ich9_lpc_info = {
|
||||
{ TYPE_HOTPLUG_HANDLER },
|
||||
{ TYPE_ACPI_DEVICE_IF },
|
||||
{ INTERFACE_CONVENTIONAL_PCI_DEVICE },
|
||||
{ TYPE_ACPI_DEV_AML_IF },
|
||||
{ }
|
||||
}
|
||||
};
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include "sysemu/reset.h"
|
||||
#include "sysemu/runstate.h"
|
||||
#include "migration/vmstate.h"
|
||||
#include "hw/acpi/acpi_aml_interface.h"
|
||||
|
||||
#define XEN_PIIX_NUM_PIRQS 128ULL
|
||||
|
||||
@ -286,10 +287,24 @@ static void piix3_realize(PCIDevice *dev, Error **errp)
|
||||
qemu_register_reset(piix3_reset, d);
|
||||
}
|
||||
|
||||
static void build_pci_isa_aml(AcpiDevAmlIf *adev, Aml *scope)
|
||||
{
|
||||
BusChild *kid;
|
||||
BusState *bus = qdev_get_child_bus(DEVICE(adev), "isa.0");
|
||||
|
||||
/* PIIX PCI to ISA irq remapping */
|
||||
aml_append(scope, aml_operation_region("P40C", AML_PCI_CONFIG,
|
||||
aml_int(0x60), 0x04));
|
||||
QTAILQ_FOREACH(kid, &bus->children, sibling) {
|
||||
call_dev_aml_func(DEVICE(kid->child), scope);
|
||||
}
|
||||
}
|
||||
|
||||
static void pci_piix3_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
||||
AcpiDevAmlIfClass *adevc = ACPI_DEV_AML_IF_CLASS(klass);
|
||||
|
||||
dc->desc = "ISA bridge";
|
||||
dc->vmsd = &vmstate_piix3;
|
||||
@ -304,6 +319,7 @@ static void pci_piix3_class_init(ObjectClass *klass, void *data)
|
||||
* pc_piix.c's pc_init1()
|
||||
*/
|
||||
dc->user_creatable = false;
|
||||
adevc->build_dev_aml = build_pci_isa_aml;
|
||||
}
|
||||
|
||||
static const TypeInfo piix3_pci_type_info = {
|
||||
@ -314,6 +330,7 @@ static const TypeInfo piix3_pci_type_info = {
|
||||
.class_init = pci_piix3_class_init,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ INTERFACE_CONVENTIONAL_PCI_DEVICE },
|
||||
{ TYPE_ACPI_DEV_AML_IF },
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
@ -37,10 +37,14 @@
|
||||
#include "qemu/module.h"
|
||||
#include "qemu/timer.h"
|
||||
#include "qom/object.h"
|
||||
#include "hw/acpi/acpi_aml_interface.h"
|
||||
|
||||
/* #define DEBUG_SMC */
|
||||
|
||||
#define APPLESMC_DEFAULT_IOBASE 0x300
|
||||
#define TYPE_APPLE_SMC "isa-applesmc"
|
||||
#define APPLESMC_MAX_DATA_LENGTH 32
|
||||
#define APPLESMC_PROP_IO_BASE "iobase"
|
||||
|
||||
enum {
|
||||
APPLESMC_DATA_PORT = 0x00,
|
||||
@ -347,14 +351,35 @@ static Property applesmc_isa_properties[] = {
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
static void build_applesmc_aml(AcpiDevAmlIf *adev, Aml *scope)
|
||||
{
|
||||
Aml *crs;
|
||||
AppleSMCState *s = APPLE_SMC(adev);
|
||||
uint32_t iobase = s->iobase;
|
||||
Aml *dev = aml_device("SMC");
|
||||
|
||||
aml_append(dev, aml_name_decl("_HID", aml_eisaid("APP0001")));
|
||||
/* device present, functioning, decoding, not shown in UI */
|
||||
aml_append(dev, aml_name_decl("_STA", aml_int(0xB)));
|
||||
crs = aml_resource_template();
|
||||
aml_append(crs,
|
||||
aml_io(AML_DECODE16, iobase, iobase, 0x01, APPLESMC_MAX_DATA_LENGTH)
|
||||
);
|
||||
aml_append(crs, aml_irq_no_flags(6));
|
||||
aml_append(dev, aml_name_decl("_CRS", crs));
|
||||
aml_append(scope, dev);
|
||||
}
|
||||
|
||||
static void qdev_applesmc_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
AcpiDevAmlIfClass *adevc = ACPI_DEV_AML_IF_CLASS(klass);
|
||||
|
||||
dc->realize = applesmc_isa_realize;
|
||||
dc->reset = qdev_applesmc_isa_reset;
|
||||
device_class_set_props(dc, applesmc_isa_properties);
|
||||
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
|
||||
adevc->build_dev_aml = build_applesmc_aml;
|
||||
}
|
||||
|
||||
static const TypeInfo applesmc_isa_info = {
|
||||
@ -362,6 +387,10 @@ static const TypeInfo applesmc_isa_info = {
|
||||
.parent = TYPE_ISA_DEVICE,
|
||||
.instance_size = sizeof(AppleSMCState),
|
||||
.class_init = qdev_applesmc_class_init,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ TYPE_ACPI_DEV_AML_IF },
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static void applesmc_register_types(void)
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include "qom/object.h"
|
||||
#include "hw/isa/isa.h"
|
||||
#include "standard-headers/linux/pvpanic.h"
|
||||
#include "hw/acpi/acpi_aml_interface.h"
|
||||
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(PVPanicISAState, PVPANIC_ISA_DEVICE)
|
||||
|
||||
@ -63,6 +64,41 @@ static void pvpanic_isa_realizefn(DeviceState *dev, Error **errp)
|
||||
isa_register_ioport(d, &ps->mr, s->ioport);
|
||||
}
|
||||
|
||||
static void build_pvpanic_isa_aml(AcpiDevAmlIf *adev, Aml *scope)
|
||||
{
|
||||
Aml *crs, *field, *method;
|
||||
PVPanicISAState *s = PVPANIC_ISA_DEVICE(adev);
|
||||
Aml *dev = aml_device("PEVT");
|
||||
|
||||
aml_append(dev, aml_name_decl("_HID", aml_string("QEMU0001")));
|
||||
|
||||
crs = aml_resource_template();
|
||||
aml_append(crs,
|
||||
aml_io(AML_DECODE16, s->ioport, s->ioport, 1, 1)
|
||||
);
|
||||
aml_append(dev, aml_name_decl("_CRS", crs));
|
||||
|
||||
aml_append(dev, aml_operation_region("PEOR", AML_SYSTEM_IO,
|
||||
aml_int(s->ioport), 1));
|
||||
field = aml_field("PEOR", AML_BYTE_ACC, AML_NOLOCK, AML_PRESERVE);
|
||||
aml_append(field, aml_named_field("PEPT", 8));
|
||||
aml_append(dev, field);
|
||||
|
||||
/* device present, functioning, decoding, shown in UI */
|
||||
aml_append(dev, aml_name_decl("_STA", aml_int(0xF)));
|
||||
|
||||
method = aml_method("RDPT", 0, AML_NOTSERIALIZED);
|
||||
aml_append(method, aml_store(aml_name("PEPT"), aml_local(0)));
|
||||
aml_append(method, aml_return(aml_local(0)));
|
||||
aml_append(dev, method);
|
||||
|
||||
method = aml_method("WRPT", 1, AML_NOTSERIALIZED);
|
||||
aml_append(method, aml_store(aml_arg(0), aml_name("PEPT")));
|
||||
aml_append(dev, method);
|
||||
|
||||
aml_append(scope, dev);
|
||||
}
|
||||
|
||||
static Property pvpanic_isa_properties[] = {
|
||||
DEFINE_PROP_UINT16(PVPANIC_IOPORT_PROP, PVPanicISAState, ioport, 0x505),
|
||||
DEFINE_PROP_UINT8("events", PVPanicISAState, pvpanic.events,
|
||||
@ -73,10 +109,12 @@ static Property pvpanic_isa_properties[] = {
|
||||
static void pvpanic_isa_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
AcpiDevAmlIfClass *adevc = ACPI_DEV_AML_IF_CLASS(klass);
|
||||
|
||||
dc->realize = pvpanic_isa_realizefn;
|
||||
device_class_set_props(dc, pvpanic_isa_properties);
|
||||
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
|
||||
adevc->build_dev_aml = build_pvpanic_isa_aml;
|
||||
}
|
||||
|
||||
static const TypeInfo pvpanic_isa_info = {
|
||||
@ -85,6 +123,10 @@ static const TypeInfo pvpanic_isa_info = {
|
||||
.instance_size = sizeof(PVPanicISAState),
|
||||
.instance_init = pvpanic_isa_initfn,
|
||||
.class_init = pvpanic_isa_class_init,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ TYPE_ACPI_DEV_AML_IF },
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static void pvpanic_register_types(void)
|
||||
|
@ -3,7 +3,8 @@ pci_ss.add(files('pci_bridge_dev.c'))
|
||||
pci_ss.add(when: 'CONFIG_I82801B11', if_true: files('i82801b11.c'))
|
||||
pci_ss.add(when: 'CONFIG_IOH3420', if_true: files('ioh3420.c'))
|
||||
pci_ss.add(when: 'CONFIG_PCIE_PORT', if_true: files('pcie_root_port.c', 'gen_pcie_root_port.c', 'pcie_pci_bridge.c'))
|
||||
pci_ss.add(when: 'CONFIG_PXB', if_true: files('pci_expander_bridge.c'))
|
||||
pci_ss.add(when: 'CONFIG_PXB', if_true: files('pci_expander_bridge.c'),
|
||||
if_false: files('pci_expander_bridge_stubs.c'))
|
||||
pci_ss.add(when: 'CONFIG_XIO3130', if_true: files('xio3130_upstream.c', 'xio3130_downstream.c'))
|
||||
pci_ss.add(when: 'CONFIG_CXL', if_true: files('cxl_root_port.c'))
|
||||
|
||||
@ -13,3 +14,5 @@ pci_ss.add(when: 'CONFIG_DEC_PCI', if_true: files('dec.c'))
|
||||
pci_ss.add(when: 'CONFIG_SIMBA', if_true: files('simba.c'))
|
||||
|
||||
softmmu_ss.add_all(when: 'CONFIG_PCI', if_true: pci_ss)
|
||||
|
||||
softmmu_ss.add(when: 'CONFIG_ALL', if_true: files('pci_expander_bridge_stubs.c'))
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include "hw/pci/pci_host.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "hw/pci/pci_bridge.h"
|
||||
#include "hw/pci-bridge/pci_expander_bridge.h"
|
||||
#include "hw/cxl/cxl.h"
|
||||
#include "qemu/range.h"
|
||||
#include "qemu/error-report.h"
|
||||
@ -186,25 +187,38 @@ static const TypeInfo pxb_host_info = {
|
||||
|
||||
static void pxb_cxl_realize(DeviceState *dev, Error **errp)
|
||||
{
|
||||
MachineState *ms = MACHINE(qdev_get_machine());
|
||||
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
|
||||
CXLHost *cxl = PXB_CXL_HOST(dev);
|
||||
CXLComponentState *cxl_cstate = &cxl->cxl_cstate;
|
||||
struct MemoryRegion *mr = &cxl_cstate->crb.component_registers;
|
||||
hwaddr offset;
|
||||
|
||||
cxl_component_register_block_init(OBJECT(dev), cxl_cstate,
|
||||
TYPE_PXB_CXL_HOST);
|
||||
sysbus_init_mmio(sbd, mr);
|
||||
}
|
||||
|
||||
offset = memory_region_size(mr) * ms->cxl_devices_state->next_mr_idx;
|
||||
if (offset > memory_region_size(&ms->cxl_devices_state->host_mr)) {
|
||||
/*
|
||||
* Host bridge realization has no means of knowning state associated
|
||||
* with a particular machine. As such, it is nececssary to delay
|
||||
* final setup of the host bridge register space until later in the
|
||||
* machine bring up.
|
||||
*/
|
||||
void pxb_cxl_hook_up_registers(CXLState *cxl_state, PCIBus *bus, Error **errp)
|
||||
{
|
||||
PXBDev *pxb = PXB_CXL_DEV(pci_bridge_get_device(bus));
|
||||
CXLHost *cxl = pxb->cxl.cxl_host_bridge;
|
||||
CXLComponentState *cxl_cstate = &cxl->cxl_cstate;
|
||||
struct MemoryRegion *mr = &cxl_cstate->crb.component_registers;
|
||||
hwaddr offset;
|
||||
|
||||
offset = memory_region_size(mr) * cxl_state->next_mr_idx;
|
||||
if (offset > memory_region_size(&cxl_state->host_mr)) {
|
||||
error_setg(errp, "Insufficient space for pxb cxl host register space");
|
||||
return;
|
||||
}
|
||||
|
||||
memory_region_add_subregion(&ms->cxl_devices_state->host_mr, offset, mr);
|
||||
ms->cxl_devices_state->next_mr_idx++;
|
||||
memory_region_add_subregion(&cxl_state->host_mr, offset, mr);
|
||||
cxl_state->next_mr_idx++;
|
||||
}
|
||||
|
||||
static void pxb_cxl_host_class_init(ObjectClass *class, void *data)
|
||||
@ -461,17 +475,11 @@ static const TypeInfo pxb_pcie_dev_info = {
|
||||
|
||||
static void pxb_cxl_dev_realize(PCIDevice *dev, Error **errp)
|
||||
{
|
||||
MachineState *ms = MACHINE(qdev_get_machine());
|
||||
|
||||
/* A CXL PXB's parent bus is still PCIe */
|
||||
if (!pci_bus_is_express(pci_get_bus(dev))) {
|
||||
error_setg(errp, "pxb-cxl devices cannot reside on a PCI bus");
|
||||
return;
|
||||
}
|
||||
if (!ms->cxl_devices_state->is_enabled) {
|
||||
error_setg(errp, "Machine does not have cxl=on");
|
||||
return;
|
||||
}
|
||||
|
||||
pxb_dev_realize_common(dev, CXL, errp);
|
||||
pxb_dev_reset(DEVICE(dev));
|
||||
|
14
hw/pci-bridge/pci_expander_bridge_stubs.c
Normal file
14
hw/pci-bridge/pci_expander_bridge_stubs.c
Normal file
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*
|
||||
* Stubs for calls made from machines to handle the case where CONFIG_PXB
|
||||
* is not enabled.
|
||||
*/
|
||||
#include "qemu/osdep.h"
|
||||
#include "qapi/error.h"
|
||||
#include "hw/pci/pci.h"
|
||||
#include "hw/pci/pci_bus.h"
|
||||
#include "hw/pci-bridge/pci_expander_bridge.h"
|
||||
#include "hw/cxl/cxl.h"
|
||||
|
||||
void pxb_cxl_hook_up_registers(CXLState *state, PCIBus *bus, Error **errp) {};
|
16
hw/pci/pci.c
16
hw/pci/pci.c
@ -2640,15 +2640,15 @@ static char *pci_dev_fw_name(DeviceState *dev, char *buf, int len)
|
||||
static char *pcibus_get_fw_dev_path(DeviceState *dev)
|
||||
{
|
||||
PCIDevice *d = (PCIDevice *)dev;
|
||||
char path[50], name[33];
|
||||
int off;
|
||||
char name[33];
|
||||
int has_func = !!PCI_FUNC(d->devfn);
|
||||
|
||||
off = snprintf(path, sizeof(path), "%s@%x",
|
||||
pci_dev_fw_name(dev, name, sizeof name),
|
||||
PCI_SLOT(d->devfn));
|
||||
if (PCI_FUNC(d->devfn))
|
||||
snprintf(path + off, sizeof(path) + off, ",%x", PCI_FUNC(d->devfn));
|
||||
return g_strdup(path);
|
||||
return g_strdup_printf("%s@%x%s%.*x",
|
||||
pci_dev_fw_name(dev, name, sizeof(name)),
|
||||
PCI_SLOT(d->devfn),
|
||||
has_func ? "," : "",
|
||||
has_func,
|
||||
PCI_FUNC(d->devfn));
|
||||
}
|
||||
|
||||
static char *pcibus_get_dev_path(DeviceState *dev)
|
||||
|
@ -26,7 +26,7 @@
|
||||
#include "qemu/cutils.h"
|
||||
#include "qemu/module.h"
|
||||
#include "qemu/bcd.h"
|
||||
#include "hw/acpi/aml-build.h"
|
||||
#include "hw/acpi/acpi_aml_interface.h"
|
||||
#include "hw/irq.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "hw/qdev-properties-system.h"
|
||||
@ -1017,9 +1017,9 @@ static void rtc_reset_hold(Object *obj)
|
||||
qemu_irq_lower(s->irq);
|
||||
}
|
||||
|
||||
static void rtc_build_aml(ISADevice *isadev, Aml *scope)
|
||||
static void rtc_build_aml(AcpiDevAmlIf *adev, Aml *scope)
|
||||
{
|
||||
RTCState *s = MC146818_RTC(isadev);
|
||||
RTCState *s = MC146818_RTC(adev);
|
||||
Aml *dev;
|
||||
Aml *crs;
|
||||
|
||||
@ -1043,13 +1043,13 @@ static void rtc_class_initfn(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
ResettableClass *rc = RESETTABLE_CLASS(klass);
|
||||
ISADeviceClass *isa = ISA_DEVICE_CLASS(klass);
|
||||
AcpiDevAmlIfClass *adevc = ACPI_DEV_AML_IF_CLASS(klass);
|
||||
|
||||
dc->realize = rtc_realizefn;
|
||||
dc->vmsd = &vmstate_rtc;
|
||||
rc->phases.enter = rtc_reset_enter;
|
||||
rc->phases.hold = rtc_reset_hold;
|
||||
isa->build_aml = rtc_build_aml;
|
||||
adevc->build_dev_aml = rtc_build_aml;
|
||||
device_class_set_props(dc, mc146818rtc_properties);
|
||||
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
|
||||
}
|
||||
@ -1059,6 +1059,10 @@ static const TypeInfo mc146818rtc_info = {
|
||||
.parent = TYPE_ISA_DEVICE,
|
||||
.instance_size = sizeof(RTCState),
|
||||
.class_init = rtc_class_initfn,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ TYPE_ACPI_DEV_AML_IF },
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static void mc146818rtc_register_types(void)
|
||||
|
@ -121,7 +121,6 @@ static void vhost_user_scsi_realize(DeviceState *dev, Error **errp)
|
||||
vsc->dev.backend_features = 0;
|
||||
vqs = vsc->dev.vqs;
|
||||
|
||||
s->vhost_user.supports_config = true;
|
||||
ret = vhost_dev_init(&vsc->dev, &s->vhost_user,
|
||||
VHOST_BACKEND_TYPE_USER, 0, errp);
|
||||
if (ret < 0) {
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include "tpm_prop.h"
|
||||
#include "tpm_tis.h"
|
||||
#include "qom/object.h"
|
||||
#include "hw/acpi/acpi_aml_interface.h"
|
||||
|
||||
struct TPMStateISA {
|
||||
/*< private >*/
|
||||
@ -138,10 +139,39 @@ static void tpm_tis_isa_realizefn(DeviceState *dev, Error **errp)
|
||||
}
|
||||
}
|
||||
|
||||
static void build_tpm_tis_isa_aml(AcpiDevAmlIf *adev, Aml *scope)
|
||||
{
|
||||
Aml *dev, *crs;
|
||||
TPMStateISA *isadev = TPM_TIS_ISA(adev);
|
||||
TPMIf *ti = TPM_IF(isadev);
|
||||
|
||||
dev = aml_device("TPM");
|
||||
if (tpm_tis_isa_get_tpm_version(ti) == TPM_VERSION_2_0) {
|
||||
aml_append(dev, aml_name_decl("_HID", aml_string("MSFT0101")));
|
||||
aml_append(dev, aml_name_decl("_STR", aml_string("TPM 2.0 Device")));
|
||||
} else {
|
||||
aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0C31")));
|
||||
}
|
||||
aml_append(dev, aml_name_decl("_UID", aml_int(1)));
|
||||
aml_append(dev, aml_name_decl("_STA", aml_int(0xF)));
|
||||
crs = aml_resource_template();
|
||||
aml_append(crs, aml_memory32_fixed(TPM_TIS_ADDR_BASE, TPM_TIS_ADDR_SIZE,
|
||||
AML_READ_WRITE));
|
||||
/*
|
||||
* FIXME: TPM_TIS_IRQ=5 conflicts with PNP0C0F irqs,
|
||||
* fix default TPM_TIS_IRQ value there to use some unused IRQ
|
||||
*/
|
||||
/* aml_append(crs, aml_irq_no_flags(isadev->state.irq_num)); */
|
||||
aml_append(dev, aml_name_decl("_CRS", crs));
|
||||
tpm_build_ppi_acpi(ti, dev);
|
||||
aml_append(scope, dev);
|
||||
}
|
||||
|
||||
static void tpm_tis_isa_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
TPMIfClass *tc = TPM_IF_CLASS(klass);
|
||||
AcpiDevAmlIfClass *adevc = ACPI_DEV_AML_IF_CLASS(klass);
|
||||
|
||||
device_class_set_props(dc, tpm_tis_isa_properties);
|
||||
dc->vmsd = &vmstate_tpm_tis_isa;
|
||||
@ -151,6 +181,7 @@ static void tpm_tis_isa_class_init(ObjectClass *klass, void *data)
|
||||
tc->request_completed = tpm_tis_isa_request_completed;
|
||||
tc->get_version = tpm_tis_isa_get_tpm_version;
|
||||
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
|
||||
adevc->build_dev_aml = build_tpm_tis_isa_aml;
|
||||
}
|
||||
|
||||
static const TypeInfo tpm_tis_isa_info = {
|
||||
@ -161,6 +192,7 @@ static const TypeInfo tpm_tis_isa_info = {
|
||||
.class_init = tpm_tis_isa_class_init,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ TYPE_TPM_IF },
|
||||
{ TYPE_ACPI_DEV_AML_IF },
|
||||
{ }
|
||||
}
|
||||
};
|
||||
|
@ -2031,18 +2031,16 @@ static int vhost_user_backend_init(struct vhost_dev *dev, void *opaque,
|
||||
if (supports_f_config) {
|
||||
if (!virtio_has_feature(protocol_features,
|
||||
VHOST_USER_PROTOCOL_F_CONFIG)) {
|
||||
error_setg(errp, "vhost-user device %s expecting "
|
||||
error_setg(errp, "vhost-user device expecting "
|
||||
"VHOST_USER_PROTOCOL_F_CONFIG but the vhost-user backend does "
|
||||
"not support it.", dev->vdev->name);
|
||||
"not support it.");
|
||||
return -EPROTO;
|
||||
}
|
||||
} else {
|
||||
if (virtio_has_feature(protocol_features,
|
||||
VHOST_USER_PROTOCOL_F_CONFIG)) {
|
||||
warn_reportf_err(*errp, "vhost-user backend supports "
|
||||
"VHOST_USER_PROTOCOL_F_CONFIG for "
|
||||
"device %s but QEMU does not.",
|
||||
dev->vdev->name);
|
||||
"VHOST_USER_PROTOCOL_F_CONFIG but QEMU does not.");
|
||||
protocol_features &= ~(1ULL << VHOST_USER_PROTOCOL_F_CONFIG);
|
||||
}
|
||||
}
|
||||
|
40
include/hw/acpi/acpi_aml_interface.h
Normal file
40
include/hw/acpi/acpi_aml_interface.h
Normal file
@ -0,0 +1,40 @@
|
||||
#ifndef ACPI_AML_INTERFACE_H
|
||||
#define ACPI_AML_INTERFACE_H
|
||||
|
||||
#include "qom/object.h"
|
||||
#include "hw/acpi/aml-build.h"
|
||||
|
||||
#define TYPE_ACPI_DEV_AML_IF "acpi-dev-aml-interface"
|
||||
typedef struct AcpiDevAmlIfClass AcpiDevAmlIfClass;
|
||||
DECLARE_CLASS_CHECKERS(AcpiDevAmlIfClass, ACPI_DEV_AML_IF, TYPE_ACPI_DEV_AML_IF)
|
||||
#define ACPI_DEV_AML_IF(obj) \
|
||||
INTERFACE_CHECK(AcpiDevAmlIf, (obj), TYPE_ACPI_DEV_AML_IF)
|
||||
|
||||
typedef struct AcpiDevAmlIf AcpiDevAmlIf;
|
||||
typedef void (*dev_aml_fn)(AcpiDevAmlIf *adev, Aml *scope);
|
||||
|
||||
/**
|
||||
* AcpiDevAmlIfClass:
|
||||
*
|
||||
* build_dev_aml: adds device specific AML blob to provided scope
|
||||
*
|
||||
* Interface is designed for providing generic callback that builds device
|
||||
* specific AML blob.
|
||||
*/
|
||||
struct AcpiDevAmlIfClass {
|
||||
/* <private> */
|
||||
InterfaceClass parent_class;
|
||||
|
||||
/* <public> */
|
||||
dev_aml_fn build_dev_aml;
|
||||
};
|
||||
|
||||
static inline void call_dev_aml_func(DeviceState *dev, Aml *scope)
|
||||
{
|
||||
if (object_dynamic_cast(OBJECT(dev), TYPE_ACPI_DEV_AML_IF)) {
|
||||
AcpiDevAmlIfClass *klass = ACPI_DEV_AML_IF_GET_CLASS(dev);
|
||||
klass->build_dev_aml(ACPI_DEV_AML_IF(dev), scope);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
@ -19,10 +19,11 @@
|
||||
#define HW_ACPI_CXL_H
|
||||
|
||||
#include "hw/acpi/bios-linker-loader.h"
|
||||
#include "hw/cxl/cxl.h"
|
||||
|
||||
void cxl_build_cedt(MachineState *ms, GArray *table_offsets, GArray *table_data,
|
||||
void cxl_build_cedt(GArray *table_offsets, GArray *table_data,
|
||||
BIOSLinker *linker, const char *oem_id,
|
||||
const char *oem_table_id);
|
||||
const char *oem_table_id, CXLState *cxl_state);
|
||||
void build_cxl_osc_method(Aml *dev);
|
||||
|
||||
#endif
|
||||
|
@ -9,13 +9,8 @@
|
||||
#ifndef HW_ACPI_IPMI_H
|
||||
#define HW_ACPI_IPMI_H
|
||||
|
||||
#include "hw/acpi/aml-build.h"
|
||||
#include "hw/acpi/acpi_aml_interface.h"
|
||||
|
||||
/*
|
||||
* Add ACPI IPMI entries for all registered IPMI devices whose parent
|
||||
* bus matches the given bus. The resource is the ACPI resource that
|
||||
* contains the IPMI device, this is required for the I2C CRS.
|
||||
*/
|
||||
void build_acpi_ipmi_devices(Aml *table, BusState *bus, const char *resource);
|
||||
void build_ipmi_dev_aml(AcpiDevAmlIf *adev, Aml *scope);
|
||||
|
||||
#endif /* HW_ACPI_IPMI_H */
|
||||
|
@ -269,7 +269,6 @@ struct MachineClass {
|
||||
bool ignore_boot_device_suffixes;
|
||||
bool smbus_no_migration_support;
|
||||
bool nvdimm_supported;
|
||||
bool cxl_supported;
|
||||
bool numa_mem_supported;
|
||||
bool auto_enable_numa;
|
||||
SMPCompatProps smp_props;
|
||||
@ -360,8 +359,8 @@ struct MachineState {
|
||||
CPUArchIdList *possible_cpus;
|
||||
CpuTopology smp;
|
||||
struct NVDIMMState *nvdimms_state;
|
||||
struct CXLState *cxl_devices_state;
|
||||
struct NumaState *numa_state;
|
||||
CXLFixedMemoryWindowOptionsList *cfmws_list;
|
||||
};
|
||||
|
||||
#define DEFINE_MACHINE(namestr, machine_initfn) \
|
||||
|
@ -12,6 +12,7 @@
|
||||
|
||||
|
||||
#include "qapi/qapi-types-machine.h"
|
||||
#include "qapi/qapi-visit-machine.h"
|
||||
#include "hw/pci/pci_bridge.h"
|
||||
#include "hw/pci/pci_host.h"
|
||||
#include "cxl_pci.h"
|
||||
@ -40,6 +41,7 @@ typedef struct CXLState {
|
||||
MemoryRegion host_mr;
|
||||
unsigned int next_mr_idx;
|
||||
GList *fixed_windows;
|
||||
CXLFixedMemoryWindowOptionsList *cfmw_list;
|
||||
} CXLState;
|
||||
|
||||
struct CXLHost {
|
||||
@ -51,11 +53,4 @@ struct CXLHost {
|
||||
#define TYPE_PXB_CXL_HOST "pxb-cxl-host"
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(CXLHost, PXB_CXL_HOST)
|
||||
|
||||
void cxl_fixed_memory_window_config(MachineState *ms,
|
||||
CXLFixedMemoryWindowOptions *object,
|
||||
Error **errp);
|
||||
void cxl_fixed_memory_window_link_targets(Error **errp);
|
||||
|
||||
extern const MemoryRegionOps cfmws_ops;
|
||||
|
||||
#endif
|
||||
|
23
include/hw/cxl/cxl_host.h
Normal file
23
include/hw/cxl/cxl_host.h
Normal file
@ -0,0 +1,23 @@
|
||||
/*
|
||||
* QEMU CXL Host Setup
|
||||
*
|
||||
* Copyright (c) 2022 Huawei
|
||||
*
|
||||
* This work is licensed under the terms of the GNU GPL, version 2. See the
|
||||
* COPYING file in the top-level directory.
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "hw/cxl/cxl.h"
|
||||
#include "hw/boards.h"
|
||||
|
||||
#ifndef CXL_HOST_H
|
||||
#define CXL_HOST_H
|
||||
|
||||
void cxl_machine_init(Object *obj, CXLState *state);
|
||||
void cxl_fmws_link_targets(CXLState *stat, Error **errp);
|
||||
void cxl_hook_up_pxb_registers(PCIBus *bus, CXLState *state, Error **errp);
|
||||
|
||||
extern const MemoryRegionOps cfmws_ops;
|
||||
|
||||
#endif
|
@ -14,6 +14,7 @@
|
||||
#include "qom/object.h"
|
||||
#include "hw/i386/sgx-epc.h"
|
||||
#include "hw/firmware/smbios.h"
|
||||
#include "hw/cxl/cxl.h"
|
||||
|
||||
#define HPET_INTCAP "hpet-intcap"
|
||||
|
||||
@ -55,6 +56,7 @@ typedef struct PCMachineState {
|
||||
hwaddr memhp_io_base;
|
||||
|
||||
SGXEPCState sgx_epc;
|
||||
CXLState cxl_devices_state;
|
||||
} PCMachineState;
|
||||
|
||||
#define PC_MACHINE_ACPI_DEVICE_PROP "acpi-device"
|
||||
@ -104,7 +106,6 @@ struct PCMachineClass {
|
||||
bool rsdp_in_ram;
|
||||
int legacy_acpi_table_size;
|
||||
unsigned acpi_data_size;
|
||||
bool do_not_add_smb_acpi;
|
||||
int pci_root_uid;
|
||||
|
||||
/* SMBIOS compat: */
|
||||
|
@ -16,20 +16,6 @@ OBJECT_DECLARE_TYPE(ISADevice, ISADeviceClass, ISA_DEVICE)
|
||||
#define TYPE_ISA_BUS "ISA"
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(ISABus, ISA_BUS)
|
||||
|
||||
#define TYPE_APPLE_SMC "isa-applesmc"
|
||||
#define APPLESMC_MAX_DATA_LENGTH 32
|
||||
#define APPLESMC_PROP_IO_BASE "iobase"
|
||||
|
||||
static inline uint16_t applesmc_port(void)
|
||||
{
|
||||
Object *obj = object_resolve_path_type("", TYPE_APPLE_SMC, NULL);
|
||||
|
||||
if (obj) {
|
||||
return object_property_get_uint(obj, APPLESMC_PROP_IO_BASE, NULL);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define TYPE_ISADMA "isa-dma"
|
||||
|
||||
typedef struct IsaDmaClass IsaDmaClass;
|
||||
@ -64,7 +50,6 @@ struct IsaDmaClass {
|
||||
|
||||
struct ISADeviceClass {
|
||||
DeviceClass parent_class;
|
||||
void (*build_aml)(ISADevice *dev, Aml *scope);
|
||||
};
|
||||
|
||||
struct ISABus {
|
||||
|
@ -33,13 +33,4 @@ struct PVPanicState {
|
||||
|
||||
void pvpanic_setup_io(PVPanicState *s, DeviceState *dev, unsigned size);
|
||||
|
||||
static inline uint16_t pvpanic_port(void)
|
||||
{
|
||||
Object *o = object_resolve_path_type("", TYPE_PVPANIC_ISA_DEVICE, NULL);
|
||||
if (!o) {
|
||||
return 0;
|
||||
}
|
||||
return object_property_get_uint(o, PVPANIC_IOPORT_PROP, NULL);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
12
include/hw/pci-bridge/pci_expander_bridge.h
Normal file
12
include/hw/pci-bridge/pci_expander_bridge.h
Normal file
@ -0,0 +1,12 @@
|
||||
/*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#ifndef PCI_EXPANDER_BRIDGE_H
|
||||
#define PCI_EXPANDER_BRIDGE_H
|
||||
|
||||
#include "hw/cxl/cxl.h"
|
||||
|
||||
void pxb_cxl_hook_up_registers(CXLState *state, PCIBus *bus, Error **errp);
|
||||
|
||||
#endif /* PCI_EXPANDER_BRIDGE_H */
|
@ -523,6 +523,19 @@
|
||||
'*interleave-granularity': 'size',
|
||||
'targets': ['str'] }}
|
||||
|
||||
##
|
||||
# @CXLFMWProperties:
|
||||
#
|
||||
# List of CXL Fixed Memory Windows.
|
||||
#
|
||||
# @cxl-fmw: List of CXLFixedMemoryWindowOptions
|
||||
#
|
||||
# Since 7.1
|
||||
##
|
||||
{ 'struct' : 'CXLFMWProperties',
|
||||
'data': { 'cxl-fmw': ['CXLFixedMemoryWindowOptions'] }
|
||||
}
|
||||
|
||||
##
|
||||
# @X86CPURegister32:
|
||||
#
|
||||
|
@ -36,7 +36,8 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \
|
||||
" nvdimm=on|off controls NVDIMM support (default=off)\n"
|
||||
" memory-encryption=@var{} memory encryption object to use (default=none)\n"
|
||||
" hmat=on|off controls ACPI HMAT support (default=off)\n"
|
||||
" memory-backend='backend-id' specifies explicitly provided backend for main RAM (default=none)\n",
|
||||
" memory-backend='backend-id' specifies explicitly provided backend for main RAM (default=none)\n"
|
||||
" cxl-fmw.0.targets.0=firsttarget,cxl-fmw.0.targets.1=secondtarget,cxl-fmw.0.size=size[,cxl-fmw.0.interleave-granularity=granularity]\n",
|
||||
QEMU_ARCH_ALL)
|
||||
SRST
|
||||
``-machine [type=]name[,prop=value[,...]]``
|
||||
@ -124,6 +125,38 @@ SRST
|
||||
-object memory-backend-ram,id=pc.ram,size=512M,x-use-canonical-path-for-ramblock-id=off
|
||||
-machine memory-backend=pc.ram
|
||||
-m 512M
|
||||
|
||||
``cxl-fmw.0.targets.0=firsttarget,cxl-fmw.0.targets.1=secondtarget,cxl-fmw.0.size=size[,cxl-fmw.0.interleave-granularity=granularity]``
|
||||
Define a CXL Fixed Memory Window (CFMW).
|
||||
|
||||
Described in the CXL 2.0 ECN: CEDT CFMWS & QTG _DSM.
|
||||
|
||||
They are regions of Host Physical Addresses (HPA) on a system which
|
||||
may be interleaved across one or more CXL host bridges. The system
|
||||
software will assign particular devices into these windows and
|
||||
configure the downstream Host-managed Device Memory (HDM) decoders
|
||||
in root ports, switch ports and devices appropriately to meet the
|
||||
interleave requirements before enabling the memory devices.
|
||||
|
||||
``targets.X=target`` provides the mapping to CXL host bridges
|
||||
which may be identified by the id provied in the -device entry.
|
||||
Multiple entries are needed to specify all the targets when
|
||||
the fixed memory window represents interleaved memory. X is the
|
||||
target index from 0.
|
||||
|
||||
``size=size`` sets the size of the CFMW. This must be a multiple of
|
||||
256MiB. The region will be aligned to 256MiB but the location is
|
||||
platform and configuration dependent.
|
||||
|
||||
``interleave-granularity=granularity`` sets the granularity of
|
||||
interleave. Default 256KiB. Only 256KiB, 512KiB, 1024KiB, 2048KiB
|
||||
4096KiB, 8192KiB and 16384KiB granularities supported.
|
||||
|
||||
Example:
|
||||
|
||||
::
|
||||
|
||||
-machine cxl-fmw.0.targets.0=cxl.0,cxl-fmw.0.targets.1=cxl.1,cxl-fmw.0.size=128G,cxl-fmw.0.interleave-granularity=512k
|
||||
ERST
|
||||
|
||||
DEF("M", HAS_ARG, QEMU_OPTION_M,
|
||||
@ -467,44 +500,6 @@ SRST
|
||||
-numa hmat-cache,node-id=1,size=10K,level=1,associativity=direct,policy=write-back,line=8
|
||||
ERST
|
||||
|
||||
DEF("cxl-fixed-memory-window", HAS_ARG, QEMU_OPTION_cxl_fixed_memory_window,
|
||||
"-cxl-fixed-memory-window targets.0=firsttarget,targets.1=secondtarget,size=size[,interleave-granularity=granularity]\n",
|
||||
QEMU_ARCH_ALL)
|
||||
SRST
|
||||
``-cxl-fixed-memory-window targets.0=firsttarget,targets.1=secondtarget,size=size[,interleave-granularity=granularity]``
|
||||
Define a CXL Fixed Memory Window (CFMW).
|
||||
|
||||
Described in the CXL 2.0 ECN: CEDT CFMWS & QTG _DSM.
|
||||
|
||||
They are regions of Host Physical Addresses (HPA) on a system which
|
||||
may be interleaved across one or more CXL host bridges. The system
|
||||
software will assign particular devices into these windows and
|
||||
configure the downstream Host-managed Device Memory (HDM) decoders
|
||||
in root ports, switch ports and devices appropriately to meet the
|
||||
interleave requirements before enabling the memory devices.
|
||||
|
||||
``targets.X=firsttarget`` provides the mapping to CXL host bridges
|
||||
which may be identified by the id provied in the -device entry.
|
||||
Multiple entries are needed to specify all the targets when
|
||||
the fixed memory window represents interleaved memory. X is the
|
||||
target index from 0.
|
||||
|
||||
``size=size`` sets the size of the CFMW. This must be a multiple of
|
||||
256MiB. The region will be aligned to 256MiB but the location is
|
||||
platform and configuration dependent.
|
||||
|
||||
``interleave-granularity=granularity`` sets the granularity of
|
||||
interleave. Default 256KiB. Only 256KiB, 512KiB, 1024KiB, 2048KiB
|
||||
4096KiB, 8192KiB and 16384KiB granularities supported.
|
||||
|
||||
Example:
|
||||
|
||||
::
|
||||
|
||||
-cxl-fixed-memory-window targets.0=cxl.0,targets.1=cxl.1,size=128G,interleave-granularity=512k
|
||||
|
||||
ERST
|
||||
|
||||
DEF("add-fd", HAS_ARG, QEMU_OPTION_add_fd,
|
||||
"-add-fd fd=fd,set=set[,opaque=opaque]\n"
|
||||
" Add 'fd' to fd 'set'\n", QEMU_ARCH_ALL)
|
||||
|
46
softmmu/vl.c
46
softmmu/vl.c
@ -93,7 +93,6 @@
|
||||
#include "qemu/config-file.h"
|
||||
#include "qemu/qemu-options.h"
|
||||
#include "qemu/main-loop.h"
|
||||
#include "hw/cxl/cxl.h"
|
||||
#ifdef CONFIG_VIRTFS
|
||||
#include "fsdev/qemu-fsdev.h"
|
||||
#endif
|
||||
@ -147,12 +146,6 @@ typedef struct BlockdevOptionsQueueEntry {
|
||||
|
||||
typedef QSIMPLEQ_HEAD(, BlockdevOptionsQueueEntry) BlockdevOptionsQueue;
|
||||
|
||||
typedef struct CXLFMWOptionQueueEntry {
|
||||
CXLFixedMemoryWindowOptions *opts;
|
||||
Location loc;
|
||||
QSIMPLEQ_ENTRY(CXLFMWOptionQueueEntry) entry;
|
||||
} CXLFMWOptionQueueEntry;
|
||||
|
||||
typedef struct ObjectOption {
|
||||
ObjectOptions *opts;
|
||||
QTAILQ_ENTRY(ObjectOption) next;
|
||||
@ -179,8 +172,6 @@ static int snapshot;
|
||||
static bool preconfig_requested;
|
||||
static QemuPluginList plugin_list = QTAILQ_HEAD_INITIALIZER(plugin_list);
|
||||
static BlockdevOptionsQueue bdo_queue = QSIMPLEQ_HEAD_INITIALIZER(bdo_queue);
|
||||
static QSIMPLEQ_HEAD(, CXLFMWOptionQueueEntry) CXLFMW_opts =
|
||||
QSIMPLEQ_HEAD_INITIALIZER(CXLFMW_opts);
|
||||
static bool nographic = false;
|
||||
static int mem_prealloc; /* force preallocation of physical target memory */
|
||||
static const char *vga_model = NULL;
|
||||
@ -1072,24 +1063,6 @@ static void parse_display(const char *p)
|
||||
}
|
||||
}
|
||||
|
||||
static void parse_cxl_fixed_memory_window(const char *optarg)
|
||||
{
|
||||
CXLFMWOptionQueueEntry *cfmws_entry;
|
||||
Visitor *v;
|
||||
|
||||
v = qobject_input_visitor_new_str(optarg, "cxl-fixed-memory-window",
|
||||
&error_fatal);
|
||||
cfmws_entry = g_new(CXLFMWOptionQueueEntry, 1);
|
||||
visit_type_CXLFixedMemoryWindowOptions(v, NULL, &cfmws_entry->opts,
|
||||
&error_fatal);
|
||||
if (!cfmws_entry->opts) {
|
||||
exit(1);
|
||||
}
|
||||
visit_free(v);
|
||||
loc_save(&cfmws_entry->loc);
|
||||
QSIMPLEQ_INSERT_TAIL(&CXLFMW_opts, cfmws_entry, entry);
|
||||
}
|
||||
|
||||
static inline bool nonempty_str(const char *str)
|
||||
{
|
||||
return str && *str;
|
||||
@ -1948,20 +1921,6 @@ static void qemu_create_late_backends(void)
|
||||
qemu_semihosting_console_init();
|
||||
}
|
||||
|
||||
static void cxl_set_opts(void)
|
||||
{
|
||||
while (!QSIMPLEQ_EMPTY(&CXLFMW_opts)) {
|
||||
CXLFMWOptionQueueEntry *cfmws_entry = QSIMPLEQ_FIRST(&CXLFMW_opts);
|
||||
|
||||
loc_restore(&cfmws_entry->loc);
|
||||
QSIMPLEQ_REMOVE_HEAD(&CXLFMW_opts, entry);
|
||||
cxl_fixed_memory_window_config(current_machine, cfmws_entry->opts,
|
||||
&error_fatal);
|
||||
qapi_free_CXLFixedMemoryWindowOptions(cfmws_entry->opts);
|
||||
g_free(cfmws_entry);
|
||||
}
|
||||
}
|
||||
|
||||
static void qemu_resolve_machine_memdev(void)
|
||||
{
|
||||
if (ram_memdev_id) {
|
||||
@ -2608,7 +2567,6 @@ void qmp_x_exit_preconfig(Error **errp)
|
||||
|
||||
qemu_init_board();
|
||||
qemu_create_cli_devices();
|
||||
cxl_fixed_memory_window_link_targets(errp);
|
||||
qemu_machine_creation_done();
|
||||
|
||||
if (loadvm) {
|
||||
@ -2789,9 +2747,6 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||
exit(1);
|
||||
}
|
||||
break;
|
||||
case QEMU_OPTION_cxl_fixed_memory_window:
|
||||
parse_cxl_fixed_memory_window(optarg);
|
||||
break;
|
||||
case QEMU_OPTION_display:
|
||||
parse_display(optarg);
|
||||
break;
|
||||
@ -3598,7 +3553,6 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||
|
||||
qemu_resolve_machine_memdev();
|
||||
parse_numa_opts(current_machine);
|
||||
cxl_set_opts();
|
||||
|
||||
if (vmstate_dump_file) {
|
||||
/* dump and exit */
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
tests/data/acpi/q35/DSDT.applesmc
Normal file
BIN
tests/data/acpi/q35/DSDT.applesmc
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
tests/data/acpi/q35/DSDT.ipmismbus
Normal file
BIN
tests/data/acpi/q35/DSDT.ipmismbus
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
tests/data/acpi/q35/DSDT.pvpanic-isa
Normal file
BIN
tests/data/acpi/q35/DSDT.pvpanic-isa
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -955,6 +955,21 @@ static void test_acpi_q35_tcg_ipmi(void)
|
||||
free_test_data(&data);
|
||||
}
|
||||
|
||||
static void test_acpi_q35_tcg_smbus_ipmi(void)
|
||||
{
|
||||
test_data data;
|
||||
|
||||
memset(&data, 0, sizeof(data));
|
||||
data.machine = MACHINE_Q35;
|
||||
data.variant = ".ipmismbus";
|
||||
data.required_struct_types = ipmi_required_struct_types;
|
||||
data.required_struct_types_len = ARRAY_SIZE(ipmi_required_struct_types);
|
||||
test_acpi_one("-device ipmi-bmc-sim,id=bmc0"
|
||||
" -device smbus-ipmi,bmc=bmc0",
|
||||
&data);
|
||||
free_test_data(&data);
|
||||
}
|
||||
|
||||
static void test_acpi_piix4_tcg_ipmi(void)
|
||||
{
|
||||
test_data data;
|
||||
@ -1567,8 +1582,8 @@ static void test_acpi_q35_cxl(void)
|
||||
" -device cxl-type3,bus=rp3,memdev=cxl-mem3,lsa=lsa3"
|
||||
" -device cxl-rp,port=1,bus=cxl.2,id=rp4,chassis=0,slot=6"
|
||||
" -device cxl-type3,bus=rp4,memdev=cxl-mem4,lsa=lsa4"
|
||||
" -cxl-fixed-memory-window targets.0=cxl.1,size=4G,interleave-granularity=8k"
|
||||
" -cxl-fixed-memory-window targets.0=cxl.1,targets.1=cxl.2,size=4G,interleave-granularity=8k",
|
||||
" -M cxl-fmw.0.targets.0=cxl.1,cxl-fmw.0.size=4G,cxl-fmw.0.interleave-granularity=8k,"
|
||||
"cxl-fmw.1.targets.0=cxl.1,cxl-fmw.1.targets.1=cxl.2,cxl-fmw.1.size=4G,cxl-fmw.1.interleave-granularity=8k",
|
||||
tmp_path, tmp_path, tmp_path, tmp_path,
|
||||
tmp_path, tmp_path, tmp_path, tmp_path);
|
||||
test_acpi_one(params, &data);
|
||||
@ -1610,6 +1625,28 @@ static void test_acpi_q35_slic(void)
|
||||
free_test_data(&data);
|
||||
}
|
||||
|
||||
static void test_acpi_q35_applesmc(void)
|
||||
{
|
||||
test_data data = {
|
||||
.machine = MACHINE_Q35,
|
||||
.variant = ".applesmc",
|
||||
};
|
||||
|
||||
test_acpi_one("-device isa-applesmc", &data);
|
||||
free_test_data(&data);
|
||||
}
|
||||
|
||||
static void test_acpi_q35_pvpanic_isa(void)
|
||||
{
|
||||
test_data data = {
|
||||
.machine = MACHINE_Q35,
|
||||
.variant = ".pvpanic-isa",
|
||||
};
|
||||
|
||||
test_acpi_one("-device pvpanic", &data);
|
||||
free_test_data(&data);
|
||||
}
|
||||
|
||||
static void test_oem_fields(test_data *data)
|
||||
{
|
||||
int i;
|
||||
@ -1743,6 +1780,7 @@ int main(int argc, char *argv[])
|
||||
qtest_add_func("acpi/q35/mmio64", test_acpi_q35_tcg_mmio64);
|
||||
qtest_add_func("acpi/piix4/ipmi", test_acpi_piix4_tcg_ipmi);
|
||||
qtest_add_func("acpi/q35/ipmi", test_acpi_q35_tcg_ipmi);
|
||||
qtest_add_func("acpi/q35/smbus/ipmi", test_acpi_q35_tcg_smbus_ipmi);
|
||||
qtest_add_func("acpi/piix4/cpuhp", test_acpi_piix4_tcg_cphp);
|
||||
qtest_add_func("acpi/q35/cpuhp", test_acpi_q35_tcg_cphp);
|
||||
qtest_add_func("acpi/piix4/memhp", test_acpi_piix4_tcg_memhp);
|
||||
@ -1767,6 +1805,8 @@ int main(int argc, char *argv[])
|
||||
qtest_add_func("acpi/q35/acpihmat", test_acpi_q35_tcg_acpi_hmat);
|
||||
qtest_add_func("acpi/piix4/acpierst", test_acpi_piix4_acpi_erst);
|
||||
qtest_add_func("acpi/q35/acpierst", test_acpi_q35_acpi_erst);
|
||||
qtest_add_func("acpi/q35/applesmc", test_acpi_q35_applesmc);
|
||||
qtest_add_func("acpi/q35/pvpanic-isa", test_acpi_q35_pvpanic_isa);
|
||||
qtest_add_func("acpi/microvm", test_acpi_microvm_tcg);
|
||||
qtest_add_func("acpi/microvm/usb", test_acpi_microvm_usb_tcg);
|
||||
qtest_add_func("acpi/microvm/rtc", test_acpi_microvm_rtc_tcg);
|
||||
|
@ -10,12 +10,12 @@
|
||||
|
||||
#define QEMU_PXB_CMD "-machine q35,cxl=on " \
|
||||
"-device pxb-cxl,id=cxl.0,bus=pcie.0,bus_nr=52 " \
|
||||
"-cxl-fixed-memory-window targets.0=cxl.0,size=4G "
|
||||
"-M cxl-fmw.0.targets.0=cxl.0,cxl-fmw.0.size=4G "
|
||||
|
||||
#define QEMU_2PXB_CMD "-machine q35,cxl=on " \
|
||||
"-device pxb-cxl,id=cxl.0,bus=pcie.0,bus_nr=52 " \
|
||||
"-device pxb-cxl,id=cxl.1,bus=pcie.0,bus_nr=53 " \
|
||||
"-cxl-fixed-memory-window targets.0=cxl.0,targets.1=cxl.1,size=4G "
|
||||
"-M cxl-fmw.0.targets.0=cxl.0,cxl-fmw.0.targets.1=cxl.1,cxl-fmw.0.size=4G "
|
||||
|
||||
#define QEMU_RP "-device cxl-rp,id=rp0,bus=cxl.0,chassis=0,slot=0 "
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user