Add acpi_iort_map_pci_smmuv3().

This new function allows us to find the SMMU instance assigned
for a particular PCI RID.

Reviewed by:	andrew
Sponsored by:	DARPA, AFRL
Differential Revision:	https://reviews.freebsd.org/D25687
This commit is contained in:
Ruslan Bukin 2020-07-17 14:51:51 +00:00
parent e5587cbbc2
commit f3856e6881
2 changed files with 21 additions and 1 deletions

View File

@ -160,7 +160,7 @@ iort_entry_lookup(struct iort_node *node, u_int id, u_int *outid)
if (i == node->nentries)
return (NULL);
if ((entry->flags & ACPI_IORT_ID_SINGLE_MAPPING) == 0)
*outid = entry->outbase + (id - entry->base);
*outid = entry->outbase + (id - entry->base);
else
*outid = entry->outbase;
return (entry->out_node);
@ -564,3 +564,22 @@ acpi_iort_map_pci_msi(u_int seg, u_int rid, u_int *xref, u_int *devid)
*xref = node->entries.its[0].xref;
return (0);
}
int
acpi_iort_map_pci_smmuv3(u_int seg, u_int rid, u_int *xref, u_int *sid)
{
ACPI_IORT_SMMU_V3 *smmu;
struct iort_node *node;
node = iort_pci_rc_map(seg, rid, ACPI_IORT_NODE_SMMU_V3, sid);
if (node == NULL)
return (ENOENT);
/* This should be an SMMU node. */
KASSERT(node->type == ACPI_IORT_NODE_SMMU_V3, ("bad node"));
smmu = (ACPI_IORT_SMMU_V3 *)&node->data.smmu_v3;
*xref = smmu->BaseAddress;
return (0);
}

View File

@ -556,6 +556,7 @@ int acpi_get_domain(device_t dev, device_t child, int *domain);
* ARM specific ACPI interfaces, relating to IORT table.
*/
int acpi_iort_map_pci_msi(u_int seg, u_int rid, u_int *xref, u_int *devid);
int acpi_iort_map_pci_smmuv3(u_int seg, u_int rid, u_int *xref, u_int *devid);
int acpi_iort_its_lookup(u_int its_id, u_int *xref, int *pxm);
#endif
#endif /* _KERNEL */