• Hanjun Guo's avatar
    ACPI/IORT: Enable special index ITS group mappings for IORT nodes · 8c8df8dc
    Hanjun Guo authored
    IORT revision C introduced SMMUv3 and PMCG MSI support by adding
    specific mapping entries in the SMMUv3/PMCG subtables to retrieve
    the device ID and the ITS group it maps to for a given SMMUv3/PMCG
    IORT node.
    
    Introduce a mapping function (ie iort_get_id_mapping_index()), that
    for a given IORT node looks up if an ITS specific ID mapping entry
    exists and if so retrieve the corresponding mapping index in the IORT
    node mapping array.
    
    Since an ITS specific index mapping can be present for an IORT
    node that is not a leaf node (eg SMMUv3 - to describe its own
    ITS device ID) special handling is required for two steps mapping
    cases such as PCI/NamedComponent--->SMMUv3--->ITS because the SMMUv3
    ITS specific index mapping entry should be skipped to prevent the
    IORT API from considering the mapping entry as a regular mapping one.
    
    If we take the following IORT topology example:
    
    |----------------------|
    |  Root Complex Node   |
    |----------------------|
    |    map entry[x]      |
    |----------------------|
    |       id value       |
    | output_reference     |
    |---|------------------|
        |
        |   |----------------------|
        |-->|        SMMUv3        |
            |----------------------|
            |     SMMUv3 dev ID    |
            |     mapping index 0  |
            |----------------------|
            |      map entry[0]    |
            |----------------------|
            |       id value       |
            | output_reference-----------> ITS 1 (SMMU MSI domain)
            |----------------------|
            |      map entry[1]    |
            |----------------------|
            |       id value       |
            | output_reference-----------> ITS 2 (PCI MSI domain)
            |----------------------|
    
    where the SMMUv3 ITS specific mapping entry is index 0 and it
    represents the SMMUv3 ITS specific index mapping entry (describing its
    own ITS device ID), we need to skip that mapping entry while carrying
    out the Root Complex Node regular mappings to prevent erroneous
    translations.
    
    Reuse the iort_get_id_mapping_index() function to detect the ITS
    specific mapping index for a specific IORT node and skip it in the IORT
    mapping API (ie iort_node_map_id()) loop to prevent considering it a
    normal PCI/Named Component ID mapping entry.
    Signed-off-by: default avatarHanjun Guo <hanjun.guo@linaro.org>
    [lorenzo.pieralisi@arm.com: split patch/rewrote commit log]
    Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    8c8df8dc
iort.c 31.7 KB