mirror of https://github.com/xemu-project/xemu.git
acpi/cxl: Introduce CFMWS structures in CEDT
The CEDT CXL Fixed Window Memory Window Structures (CFMWs) define regions of the host phyiscal address map which (via an impdef means) are configured such that they have a particular interleave setup across one or more CXL Host Bridges. Reported-by: Alison Schofield <alison.schofield@intel.com> Signed-off-by: Ben Widawsky <ben.widawsky@intel.com> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20220429144110.25167-29-Jonathan.Cameron@huawei.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
aadfe32091
commit
21df6ab97f
|
@ -60,6 +60,64 @@ static void cedt_build_chbs(GArray *table_data, PXBDev *cxl)
|
|||
build_append_int_noprefix(table_data, memory_region_size(mr), 8);
|
||||
}
|
||||
|
||||
/*
|
||||
* CFMWS entries in CXL 2.0 ECN: CEDT CFMWS & QTG _DSM.
|
||||
* 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)
|
||||
{
|
||||
CXLState *cxls = ms->cxl_devices_state;
|
||||
GList *it;
|
||||
|
||||
for (it = cxls->fixed_windows; it; it = it->next) {
|
||||
CXLFixedWindow *fw = it->data;
|
||||
int i;
|
||||
|
||||
/* Type */
|
||||
build_append_int_noprefix(table_data, 1, 1);
|
||||
|
||||
/* Reserved */
|
||||
build_append_int_noprefix(table_data, 0, 1);
|
||||
|
||||
/* Record Length */
|
||||
build_append_int_noprefix(table_data, 36 + 4 * fw->num_targets, 2);
|
||||
|
||||
/* Reserved */
|
||||
build_append_int_noprefix(table_data, 0, 4);
|
||||
|
||||
/* Base HPA */
|
||||
build_append_int_noprefix(table_data, fw->mr.addr, 8);
|
||||
|
||||
/* Window Size */
|
||||
build_append_int_noprefix(table_data, fw->size, 8);
|
||||
|
||||
/* Host Bridge Interleave Ways */
|
||||
build_append_int_noprefix(table_data, fw->enc_int_ways, 1);
|
||||
|
||||
/* Host Bridge Interleave Arithmetic */
|
||||
build_append_int_noprefix(table_data, 0, 1);
|
||||
|
||||
/* Reserved */
|
||||
build_append_int_noprefix(table_data, 0, 2);
|
||||
|
||||
/* Host Bridge Interleave Granularity */
|
||||
build_append_int_noprefix(table_data, fw->enc_int_gran, 4);
|
||||
|
||||
/* Window Restrictions */
|
||||
build_append_int_noprefix(table_data, 0x0f, 2); /* No restrictions */
|
||||
|
||||
/* QTG ID */
|
||||
build_append_int_noprefix(table_data, 0, 2);
|
||||
|
||||
/* Host Bridge List (list of UIDs - currently bus_nr) */
|
||||
for (i = 0; i < fw->num_targets; i++) {
|
||||
g_assert(fw->target_hbs[i]);
|
||||
build_append_int_noprefix(table_data, fw->target_hbs[i]->bus_nr, 4);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int cxl_foreach_pxb_hb(Object *obj, void *opaque)
|
||||
{
|
||||
Aml *cedt = opaque;
|
||||
|
@ -86,6 +144,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);
|
||||
|
||||
/* copy AML table into ACPI tables blob and patch header there */
|
||||
g_array_append_vals(table_data, cedt->buf->data, cedt->buf->len);
|
||||
|
|
Loading…
Reference in New Issue