• Suzuki K Poulose's avatar
    arm64: capabilities: Handle shared entries · ba7d9233
    Suzuki K Poulose authored
    Some capabilities have different criteria for detection and associated
    actions based on the matching criteria, even though they all share the
    same capability bit. So far we have used multiple entries with the same
    capability bit to handle this. This is prone to errors, as the
    cpu_enable is invoked for each entry, irrespective of whether the
    detection rule applies to the CPU or not. And also this complicates
    other helpers, e.g, __this_cpu_has_cap.
    
    This patch adds a wrapper entry to cover all the possible variations
    of a capability by maintaining list of matches + cpu_enable callbacks.
    To avoid complicating the prototypes for the "matches()", we use
    arm64_cpu_capabilities maintain the list and we ignore all the other
    fields except the matches & cpu_enable.
    
    This ensures :
    
     1) The capabilitiy is set when at least one of the entry detects
     2) Action is only taken for the entries that "matches".
    
    This avoids explicit checks in the cpu_enable() take some action.
    The only constraint here is that, all the entries should have the
    same "type" (i.e, scope and conflict rules).
    
    If a cpu_enable() method is associated with multiple matches for a
    single capability, care should be taken that either the match criteria
    are mutually exclusive, or that the method is robust against being
    called multiple times.
    
    This also reverts the changes introduced by commit 67948af4
    ("arm64: capabilities: Handle duplicate entries for a capability").
    
    Cc: Robin Murphy <robin.murphy@arm.com>
    Reviewed-by: default avatarDave Martin <dave.martin@arm.com>
    Signed-off-by: default avatarSuzuki K Poulose <suzuki.poulose@arm.com>
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    ba7d9233
cpu_errata.c 13.5 KB