qemu/qapi
Jonathan Cameron aadfe32091 hw/cxl/host: Add support for CXL Fixed Memory Windows.
The concept of these is introduced in [1] in terms of the
description the CEDT ACPI table. The principal is more general.
Unlike once traffic hits the CXL root bridges, the host system
memory address routing is implementation defined and effectively
static once observable by standard / generic system software.
Each CXL Fixed Memory Windows (CFMW) is a region of PA space
which has fixed system dependent routing configured so that
accesses can be routed to the CXL devices below a set of target
root bridges. The accesses may be interleaved across multiple
root bridges.

For QEMU we could have fully specified these regions in terms
of a base PA + size, but as the absolute address does not matter
it is simpler to let individual platforms place the memory regions.

ExampleS:
-cxl-fixed-memory-window targets.0=cxl.0,size=128G
-cxl-fixed-memory-window targets.0=cxl.1,size=128G
-cxl-fixed-memory-window targets.0=cxl0,targets.1=cxl.1,size=256G,interleave-granularity=2k

Specifies
* 2x 128G regions not interleaved across root bridges, one for each of
  the root bridges with ids cxl.0 and cxl.1
* 256G region interleaved across root bridges with ids cxl.0 and cxl.1
with a 2k interleave granularity.

When system software enumerates the devices below a given root bridge
it can then decide which CFMW to use. If non interleave is desired
(or possible) it can use the appropriate CFMW for the root bridge in
question.  If there are suitable devices to interleave across the
two root bridges then it may use the 3rd CFMS.

A number of other designs were considered but the following constraints
made it hard to adapt existing QEMU approaches to this particular problem.
1) The size must be known before a specific architecture / board brings
   up it's PA memory map.  We need to set up an appropriate region.
2) Using links to the host bridges provides a clean command line interface
   but these links cannot be established until command line devices have
   been added.

Hence the two step process used here of first establishing the size,
interleave-ways and granularity + caching the ids of the host bridges
and then, once available finding the actual host bridges so they can
be used later to support interleave decoding.

[1] CXL 2.0 ECN: CEDT CFMWS & QTG DSM (computeexpresslink.org / specifications)

Signed-off-by: Jonathan Cameron <jonathan.cameron@huawei.com>
Acked-by: Markus Armbruster <armbru@redhat.com> # QAPI Schema
Message-Id: <20220429144110.25167-28-Jonathan.Cameron@huawei.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
2022-05-13 07:57:26 -04:00
..
acpi.json qapi: fix example of ACPI_DEVICE_OST event 2022-03-31 12:35:59 +02:00
audio.json schemas: add missing vim modeline 2022-01-27 11:20:50 +01:00
authz.json qapi/qom: Add ObjectOptions for authz-* 2021-03-19 10:17:13 +01:00
block-core.json qapi: rename BlockDirtyBitmapMergeSource to BlockDirtyBitmapOrStr 2022-04-26 13:13:50 -05:00
block-export.json nbd/server: Allow MULTI_CONN for shared writable exports 2022-05-12 13:10:52 +02:00
block.json block: add 'force' parameter to 'blockdev-change-medium' command 2022-04-25 12:02:36 +02:00
char.json ui/dbus: add chardev backend & interface 2021-12-21 10:50:22 +04:00
common.json monitor: introduce HumanReadableText and HMP support 2021-11-02 15:55:13 +00:00
compat.json qapi: Belatedly adjust limitations documentation 2022-02-28 11:39:35 +01:00
control.json monitor: remove 'query-events' QMP command 2021-03-18 09:22:55 +00:00
crypto.json crypto: replace 'des-rfb' cipher with 'des' 2021-07-14 14:15:52 +01:00
dump.json qapi: fix example of dump-guest-memory 2022-03-31 12:35:59 +02:00
error.json schemas: Add vim modeline 2020-08-03 08:28:08 +02:00
introspect.json qapi: Add feature flags to enum members 2021-10-27 17:18:55 +02:00
job.json migration: introduce snapshot-{save, load, delete} QMP commands 2021-02-08 11:19:52 +00:00
machine-target.json qapi: make 'if' condition strings simple identifiers 2021-08-26 13:53:56 +02:00
machine.json hw/cxl/host: Add support for CXL Fixed Memory Windows. 2022-05-13 07:57:26 -04:00
meson.build qapi: generate trace events by default 2022-01-27 15:17:35 +01:00
migration.json qapi: Fix documentation for query-xen-replication-status 2022-04-21 10:22:33 +02:00
misc-target.json qapi: Fix version of cpu0-id field 2022-04-21 10:23:06 +02:00
misc.json rtc: Have event RTC_CHANGE identify the RTC by QOM path 2022-02-28 11:39:35 +01:00
net.json qapi: fix example of netdev_add command 2022-04-05 12:30:45 +02:00
opts-visitor.c qapi, qemu-options: make all parsing visitors parse boolean options the same 2020-11-04 12:00:40 -05:00
pci.json qapi: Normalize version references x.y.0 to just x.y 2020-12-10 17:16:44 +01:00
pragma.json schemas: add missing vim modeline 2022-03-31 12:34:51 +02:00
qapi-clone-visitor.c qapi: Make visitor functions taking Error ** return bool, not void 2020-07-10 15:18:08 +02:00
qapi-dealloc-visitor.c qapi: Make visitor functions taking Error ** return bool, not void 2020-07-10 15:18:08 +02:00
qapi-forward-visitor.c qapi: remove needless include 2022-03-22 14:46:18 +04:00
qapi-schema.json qemu-options: New -compat to set policy for deprecated interfaces 2021-03-19 15:43:33 +01:00
qapi-type-helpers.c monitor: introduce HumanReadableText and HMP support 2021-11-02 15:55:13 +00:00
qapi-util.c qapi: Fix stale reference to scripts/qapi.py in a comment 2022-02-28 11:39:35 +01:00
qapi-visit-core.c qapi: Factor out compat_policy_input_ok() 2021-10-29 21:27:20 +02:00
qdev.json softmmu: fix device deletion events with -device JSON syntax 2022-01-14 12:03:16 +01:00
qmp-dispatch.c qapi: remove needless include 2022-03-22 14:46:17 +04:00
qmp-event.c Replace qemu_gettimeofday() with g_get_real_time() 2022-04-06 10:50:37 +02:00
qmp-registry.c qapi: Generalize command policy checking 2021-10-29 18:24:46 +02:00
qobject-input-visitor.c include: add qemu/keyval.h 2022-04-21 17:03:51 +04:00
qobject-output-visitor.c qapi: Extend -compat to set policy for unstable interfaces 2021-10-29 21:28:01 +02:00
qom.json util/event-loop-base: Introduce options to set the thread pool size 2022-05-09 10:43:23 +01:00
rdma.json schemas: Add vim modeline 2020-08-03 08:28:08 +02:00
replay.json qapi: fix examples: replay-break and replay-seek 2022-04-05 12:30:45 +02:00
rocker.json schemas: Add vim modeline 2020-08-03 08:28:08 +02:00
run-state.json qapi: fix example of MEMORY_FAILURE 2022-03-31 12:35:40 +02:00
sockets.json qapi: Fix typo 2022-04-21 10:22:54 +02:00
string-input-visitor.c qapi, qemu-options: make all parsing visitors parse boolean options the same 2020-11-04 12:00:40 -05:00
string-output-visitor.c qapi: remove needless include 2022-03-22 14:46:18 +04:00
tpm.json qapi: Convert simple union TpmTypeOptions to flat one 2021-09-27 08:22:25 +02:00
trace-events qapi: Generalize struct member policy checking 2021-10-29 18:23:09 +02:00
trace.h trace: switch position of headers to what Meson requires 2020-08-21 06:18:24 -04:00
trace.json qapi: fix example of trace-event-get-state command 2022-04-05 12:30:45 +02:00
transaction.json qapi: deprecate drive-backup 2021-11-09 18:21:19 +01:00
ui.json qapi/ui: add 'display-update' command for changing listen address 2022-04-27 07:51:01 +02:00
yank.json Introduce yank feature 2021-01-13 10:21:17 +01:00