• Ben Widawsky's avatar
    cxl/region: Add region creation support · 779dd20c
    Ben Widawsky authored
    CXL 2.0 allows for dynamic provisioning of new memory regions (system
    physical address resources like "System RAM" and "Persistent Memory").
    Whereas DDR and PMEM resources are conveyed statically at boot, CXL
    allows for assembling and instantiating new regions from the available
    capacity of CXL memory expanders in the system.
    
    Sysfs with an "echo $region_name > $create_region_attribute" interface
    is chosen as the mechanism to initiate the provisioning process. This
    was chosen over ioctl() and netlink() to keep the configuration
    interface entirely in a pseudo-fs interface, and it was chosen over
    configfs since, aside from this one creation event, the interface is
    read-mostly. I.e. configfs supports cases where an object is designed to
    be provisioned each boot, like an iSCSI storage target, and CXL region
    creation is mostly for PMEM regions which are created usually once
    per-lifetime of a server instance. This is an improvement over nvdimm
    that pre-created "seed" devices that tended to confuse users looking to
    determine which devices are active and which are idle.
    
    Recall that the major change that CXL brings over previous persistent
    memory architectures is the ability to dynamically define new regions.
    Compare that to drivers like 'nfit' where the region configuration is
    statically defined by platform firmware.
    
    Regions are created as a child of a root decoder that encompasses an
    address space with constraints. When created through sysfs, the root
    decoder is explicit. When created from an LSA's region structure a root
    decoder will possibly need to be inferred by the driver.
    
    Upon region creation through sysfs, a vacant region is created with a
    unique name. Regions have a number of attributes that must be configured
    before the region can be bound to the driver where HDM decoder program
    is completed.
    
    An example of creating a new region:
    
    - Allocate a new region name:
    region=$(cat /sys/bus/cxl/devices/decoder0.0/create_pmem_region)
    
    - Create a new region by name:
    while
    region=$(cat /sys/bus/cxl/devices/decoder0.0/create_pmem_region)
    ! echo $region > /sys/bus/cxl/devices/decoder0.0/create_pmem_region
    do true; done
    
    - Region now exists in sysfs:
    stat -t /sys/bus/cxl/devices/decoder0.0/$region
    
    - Delete the region, and name:
    echo $region > /sys/bus/cxl/devices/decoder0.0/delete_region
    Signed-off-by: default avatarBen Widawsky <bwidawsk@kernel.org>
    Reviewed-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
    Link: https://lore.kernel.org/r/165784333909.1758207.794374602146306032.stgit@dwillia2-xfh.jf.intel.com
    [djbw: simplify locking, reword changelog]
    Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
    779dd20c
Kconfig 3.93 KB