Skip to content

Commit

Permalink
acpi/cxl: Introduce CFMWS structures in CEDT
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Ben Widawsky authored and mstsirkin committed May 13, 2022
1 parent aadfe32 commit 21df6ab
Showing 1 changed file with 59 additions and 0 deletions.
59 changes: 59 additions & 0 deletions hw/acpi/cxl.c
Expand Up @@ -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;
Expand All @@ -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);
Expand Down

0 comments on commit 21df6ab

Please sign in to comment.