mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-09 18:44:58 -06:00
hw/cxl/cxl-mailbox-utils: Add mailbox commands to support add/release dynamic capacity response
Per CXL spec 3.1, two mailbox commands are implemented: Add Dynamic Capacity Response (Opcode 4802h) 8.2.9.9.9.3, and Release Dynamic Capacity (Opcode 4803h) 8.2.9.9.9.4. For the process of the above two commands, we use two-pass approach. Pass 1: Check whether the input payload is valid or not; if not, skip Pass 2 and return mailbox process error. Pass 2: Do the real work--add or release extents, respectively. Tested-by: Svetly Todorov <svetly.todorov@memverge.com> Reviewed-by: Gregory Price <gregory.price@memverge.com> Signed-off-by: Fan Ni <fan.ni@samsung.com> Message-Id: <20240523174651.1089554-11-nifan.cxl@gmail.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
1c9221f19e
commit
16fd1b1216
3 changed files with 409 additions and 0 deletions
|
@ -678,6 +678,15 @@ static bool cxl_create_dc_regions(CXLType3Dev *ct3d, Error **errp)
|
|||
return true;
|
||||
}
|
||||
|
||||
static void cxl_destroy_dc_regions(CXLType3Dev *ct3d)
|
||||
{
|
||||
CXLDCExtent *ent, *ent_next;
|
||||
|
||||
QTAILQ_FOREACH_SAFE(ent, &ct3d->dc.extents, node, ent_next) {
|
||||
cxl_remove_extent_from_extent_list(&ct3d->dc.extents, ent);
|
||||
}
|
||||
}
|
||||
|
||||
static bool cxl_setup_memory(CXLType3Dev *ct3d, Error **errp)
|
||||
{
|
||||
DeviceState *ds = DEVICE(ct3d);
|
||||
|
@ -874,6 +883,7 @@ err_free_special_ops:
|
|||
g_free(regs->special_ops);
|
||||
err_address_space_free:
|
||||
if (ct3d->dc.host_dc) {
|
||||
cxl_destroy_dc_regions(ct3d);
|
||||
address_space_destroy(&ct3d->dc.host_dc_as);
|
||||
}
|
||||
if (ct3d->hostpmem) {
|
||||
|
@ -895,6 +905,7 @@ static void ct3_exit(PCIDevice *pci_dev)
|
|||
cxl_doe_cdat_release(cxl_cstate);
|
||||
g_free(regs->special_ops);
|
||||
if (ct3d->dc.host_dc) {
|
||||
cxl_destroy_dc_regions(ct3d);
|
||||
address_space_destroy(&ct3d->dc.host_dc_as);
|
||||
}
|
||||
if (ct3d->hostpmem) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue