• Alison Schofield's avatar
    cxl/region: Refactor granularity select in cxl_port_setup_targets() · 18f35dc9
    Alison Schofield authored
    In cxl_port_setup_targets() the region driver validates the
    configuration of auto-discovered region decoders, as well
    as decoders the driver is preparing to program.
    
    The existing calculations use the encoded interleave granularity
    value to create an interleave granularity that properly fans out
    when routing an x1 interleave to a greater than x1 interleave.
    
    That all worked well, until this config came along:
    Host Bridge: 2 way at 256 granularity
        Switch Decoder_A:	1 way at 512
            Endpoint_X:	2 way at 256
        Switch Decoder_B:	1 way at 512
            Endpoint_Y:	2 way at 256
    
    When the Host Bridge interleave is greater than 1 and the root
    decoder interleave is exactly 1, the region driver needs to
    consider the number of targets in the region when calculating
    the expected granularity.
    
    While examining the existing logic, and trying to cover the case
    above, a couple of simplifications appeared, hence this proposed
    refactoring.
    
    The first simplification is to apply the logic to the nominal
    values and use the existing helper function granularity_to_eig() to
    translate the desired granularity to the encoded form. This means
    the comment and code regarding setting address bits is discarded.
    Although that logic is not wrong, it adds a level of complexity that
    is not required in the granularity selection. The eig and eiw are
    indeed part of the routing instructions programmed into the decoders.
    Up-level the discussion to nominal ways and granularity for clearer
    analysis.
    
    The second simplification reduces the logic to a single granularity
    calculation that works for all cases. The new calculation doesn't
    care if parent_iw => 1 because parent_iw is used as a multiplier.
    
    The refactor cleans up a useless assignment of eiw made after the
    iw is already calculated.
    
    Regression testing included an examination of all of the ways and
    granularity selections made during a run of the cxl_test unit tests.
    There were no differences in selections before and after this patch.
    
    Fixes: ("27b3f8d1 cxl/region: Program target lists")
    Signed-off-by: default avatarAlison Schofield <alison.schofield@intel.com>
    Reviewed-by: default avatarDave Jiang <dave.jiang@intel.com>
    Link: https://lore.kernel.org/r/20230822180928.117596-1-alison.schofield@intel.comSigned-off-by: default avatarDan Williams <dan.j.williams@intel.com>
    18f35dc9
region.c 71.8 KB