mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-04 09:59:32 +00:00
![Lorenzo Pieralisi](/assets/img/avatar_default.png)
Some HW devices are created as child devices of proprietary busses, that have a bus specific policy defining how the child devices wires representing the devices ID are translated into IOMMU and IRQ controllers device IDs. Current IORT code provides translations for: - PCI devices, where the device ID is well identified at bus level as the requester ID (RID) - Platform devices that are endpoint devices where the device ID is retrieved from the ACPI object IORT mappings (Named components single mappings). A platform device is represented in IORT as a named component node For devices that are child devices of proprietary busses the IORT firmware represents the bus node as a named component node in IORT and it is up to that named component node to define in/out bus specific ID translations for the bus child devices that are allocated and created in a bus specific manner. In order to make IORT ID translations available for proprietary bus child devices, the current ACPI (and IORT) code must be augmented to provide an additional ID parameter to acpi_dma_configure() representing the child devices input ID. This ID is bus specific and it is retrieved in bus specific code. By adding an ID parameter to acpi_dma_configure(), the IORT code can map the child device ID to an IOMMU stream ID through the IORT named component representing the bus in/out ID mappings. Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Cc: Will Deacon <will@kernel.org> Cc: Hanjun Guo <guohanjun@huawei.com> Cc: Sudeep Holla <sudeep.holla@arm.com> Cc: Robin Murphy <robin.murphy@arm.com> Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net> Link: https://lore.kernel.org/r/20200619082013.13661-6-lorenzo.pieralisi@arm.com Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
60 lines
2.2 KiB
C
60 lines
2.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (C) 2016, Semihalf
|
|
* Author: Tomasz Nowicki <tn@semihalf.com>
|
|
*/
|
|
|
|
#ifndef __ACPI_IORT_H__
|
|
#define __ACPI_IORT_H__
|
|
|
|
#include <linux/acpi.h>
|
|
#include <linux/fwnode.h>
|
|
#include <linux/irqdomain.h>
|
|
|
|
#define IORT_IRQ_MASK(irq) (irq & 0xffffffffULL)
|
|
#define IORT_IRQ_TRIGGER_MASK(irq) ((irq >> 32) & 0xffffffffULL)
|
|
|
|
/*
|
|
* PMCG model identifiers for use in smmu pmu driver. Please note
|
|
* that this is purely for the use of software and has nothing to
|
|
* do with hardware or with IORT specification.
|
|
*/
|
|
#define IORT_SMMU_V3_PMCG_GENERIC 0x00000000 /* Generic SMMUv3 PMCG */
|
|
#define IORT_SMMU_V3_PMCG_HISI_HIP08 0x00000001 /* HiSilicon HIP08 PMCG */
|
|
|
|
int iort_register_domain_token(int trans_id, phys_addr_t base,
|
|
struct fwnode_handle *fw_node);
|
|
void iort_deregister_domain_token(int trans_id);
|
|
struct fwnode_handle *iort_find_domain_token(int trans_id);
|
|
#ifdef CONFIG_ACPI_IORT
|
|
void acpi_iort_init(void);
|
|
u32 iort_msi_map_id(struct device *dev, u32 id);
|
|
struct irq_domain *iort_get_device_domain(struct device *dev, u32 id,
|
|
enum irq_domain_bus_token bus_token);
|
|
void acpi_configure_pmsi_domain(struct device *dev);
|
|
int iort_pmsi_get_dev_id(struct device *dev, u32 *dev_id);
|
|
/* IOMMU interface */
|
|
void iort_dma_setup(struct device *dev, u64 *dma_addr, u64 *size);
|
|
const struct iommu_ops *iort_iommu_configure_id(struct device *dev,
|
|
const u32 *id_in);
|
|
int iort_iommu_msi_get_resv_regions(struct device *dev, struct list_head *head);
|
|
#else
|
|
static inline void acpi_iort_init(void) { }
|
|
static inline u32 iort_msi_map_id(struct device *dev, u32 id)
|
|
{ return id; }
|
|
static inline struct irq_domain *iort_get_device_domain(
|
|
struct device *dev, u32 id, enum irq_domain_bus_token bus_token)
|
|
{ return NULL; }
|
|
static inline void acpi_configure_pmsi_domain(struct device *dev) { }
|
|
/* IOMMU interface */
|
|
static inline void iort_dma_setup(struct device *dev, u64 *dma_addr,
|
|
u64 *size) { }
|
|
static inline const struct iommu_ops *iort_iommu_configure_id(
|
|
struct device *dev, const u32 *id_in)
|
|
{ return NULL; }
|
|
static inline
|
|
int iort_iommu_msi_get_resv_regions(struct device *dev, struct list_head *head)
|
|
{ return 0; }
|
|
#endif
|
|
|
|
#endif /* __ACPI_IORT_H__ */
|