• Dan Williams's avatar
    cxl/region: Fix 'distance' calculation with passthrough ports · e4f6dfa9
    Dan Williams authored
    When programming port decode targets, the algorithm wants to ensure that
    two devices are compatible to be programmed as peers beneath a given
    port. A compatible peer is a target that shares the same dport, and
    where that target's interleave position also routes it to the same
    dport. Compatibility is determined by the device's interleave position
    being >= to distance. For example, if a given dport can only map every
    Nth position then positions less than N away from the last target
    programmed are incompatible.
    
    The @distance for the host-bridge's cxl_port in a simple dual-ported
    host-bridge configuration with 2 direct-attached devices is 1, i.e. An
    x2 region divided by 2 dports to reach 2 region targets.
    
    An x4 region under an x2 host-bridge would need 2 intervening switches
    where the @distance at the host bridge level is 2 (x4 region divided by
    2 switches to reach 4 devices).
    
    However, the distance between peers underneath a single ported
    host-bridge is always zero because there is no limit to the number of
    devices that can be mapped. In other words, there are no decoders to
    program in a passthrough, all descendants are mapped and distance only
    starts matters for the intervening descendant ports of the passthrough
    port.
    
    Add tracking for the number of dports mapped to a port, and use that to
    detect the passthrough case for calculating @distance.
    
    Cc: <stable@vger.kernel.org>
    Reported-by: default avatarBobo WL <lmw.bobo@gmail.com>
    Reported-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
    Link: http://lore.kernel.org/r/20221010172057.00001559@huawei.com
    Fixes: 27b3f8d1 ("cxl/region: Program target lists")
    Reviewed-by: default avatarVishal Verma <vishal.l.verma@intel.com>
    Link: https://lore.kernel.org/r/166752185440.947915.6617495912508299445.stgit@dwillia2-xfh.jf.intel.comSigned-off-by: default avatarDan Williams <dan.j.williams@intel.com>
    e4f6dfa9
region.c 46 KB