• Jon Hunter's avatar
    irqdomain: Fix handling of type settings for existing mappings · b62b2cf5
    Jon Hunter authored
    When mapping an IRQ, it is possible that a mapping for the IRQ already
    exists. If mapping does exist then there are the following issues with
    regard to the handling of the IRQ type settings ...
    1. If the domain is part of a hierarchy, then:
       a. We do not check that the type settings for the existing mapping
          match those of the new mapping.
       b. We do not check to see if the type settings have been programmed
          yet (and they might not have been) and so we may never set the
          type.
    2. If the domain is NOT part of a hierarchy, we will overwrite the
       current type settings programmed if they are different from the
       previous mapping. Please note that irq_create_mapping()
       calls irq_find_mapping() to check if a mapping already exists.
    
    Although, it may be unlikely that the type settings for a shared
    interrupt would not match, nonetheless we should check for this.
    Therefore, to fix this check if a mapping exists (regardless of whether
    the domain is part of a hierarchy or not) and if it does then:
    1. Return the IRQ number if the type settings match or are not
       specified.
    2. Program the type settings and return the IRQ number if the type
       settings have not been programmed yet.
    3. Otherwise if the type setting do not match, then print a warning
       and don't return the IRQ number.
    
    Furthermore, add a warning if the type return by irq_domain_translate()
    has bits outside the sense mask set and then clear these bits. If these
    bits are not cleared then this will cause the comparision of the type
    settings for an existing mapping to fail with that of the new mapping
    even if the sense bit themselves match. The reason being is that the
    existing type settings are read by calling irq_get_trigger_type() which
    will clear any bits outside the sense mask. This will allow us to detect
    irqchips that are not correctly clearing these bits and fix them.
    Signed-off-by: default avatarJon Hunter <jonathanh@nvidia.com>
    Reviewed-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
    Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
    b62b2cf5
irqdomain.c 39.4 KB