mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-11 07:03:09 -04:00
Merge "iommu/iommu-logger: Log IOMMU client name in debug structures"
This commit is contained in:
commit
a8cbc18ef6
3 changed files with 24 additions and 18 deletions
|
|
@ -1914,7 +1914,6 @@ static int arm_smmu_init_domain_context(struct iommu_domain *domain,
|
|||
&smmu_domain->pgtbl_info[1];
|
||||
struct arm_smmu_cfg *cfg = &smmu_domain->cfg;
|
||||
unsigned long quirks = 0;
|
||||
struct iommu_group *group;
|
||||
struct io_pgtable *iop;
|
||||
bool split_tables = false;
|
||||
|
||||
|
|
@ -2090,10 +2089,8 @@ static int arm_smmu_init_domain_context(struct iommu_domain *domain,
|
|||
}
|
||||
}
|
||||
|
||||
group = iommu_group_get_for_dev(smmu_domain->dev);
|
||||
iop = container_of(smmu_domain->pgtbl_ops[0], struct io_pgtable, ops);
|
||||
ret = iommu_logger_register(&smmu_domain->logger, domain, group, iop);
|
||||
iommu_group_put(group);
|
||||
ret = iommu_logger_register(&smmu_domain->logger, domain, dev, iop);
|
||||
if (ret)
|
||||
goto out_clear_smmu;
|
||||
|
||||
|
|
|
|||
|
|
@ -13,8 +13,7 @@
|
|||
static DEFINE_MUTEX(iommu_debug_attachments_lock);
|
||||
static LIST_HEAD(iommu_debug_attachments);
|
||||
|
||||
static unsigned int iommu_logger_pgtable_levels(struct iommu_domain *domain,
|
||||
struct io_pgtable *iop)
|
||||
static unsigned int iommu_logger_pgtable_levels(struct io_pgtable *iop)
|
||||
{
|
||||
unsigned int va_bits, pte_size, bits_per_level, pg_shift;
|
||||
unsigned long ias = iop->cfg.ias;
|
||||
|
|
@ -31,7 +30,7 @@ static unsigned int iommu_logger_pgtable_levels(struct iommu_domain *domain,
|
|||
return 0;
|
||||
}
|
||||
|
||||
pg_shift = __ffs(domain->pgsize_bitmap);
|
||||
pg_shift = __ffs(iop->cfg.pgsize_bitmap);
|
||||
bits_per_level = pg_shift - ilog2(pte_size);
|
||||
va_bits = ias - pg_shift;
|
||||
return DIV_ROUND_UP(va_bits, bits_per_level);
|
||||
|
|
@ -83,11 +82,13 @@ static int iommu_logger_domain_ttbrs(struct io_pgtable *iop, void **ttbr0_ptr,
|
|||
|
||||
static struct iommu_debug_attachment *iommu_logger_init(
|
||||
struct iommu_domain *domain,
|
||||
struct iommu_group *group,
|
||||
struct device *dev,
|
||||
struct io_pgtable *iop)
|
||||
{
|
||||
struct iommu_debug_attachment *logger;
|
||||
unsigned int levels = iommu_logger_pgtable_levels(domain, iop);
|
||||
char *client_name;
|
||||
struct iommu_group *group;
|
||||
unsigned int levels = iommu_logger_pgtable_levels(iop);
|
||||
enum iommu_logger_pgtable_fmt fmt = iommu_logger_pgtable_fmt_lut(
|
||||
iop->fmt);
|
||||
void *ttbr0, *ttbr1;
|
||||
|
|
@ -104,9 +105,19 @@ static struct iommu_debug_attachment *iommu_logger_init(
|
|||
if (!logger)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
client_name = kasprintf(GFP_KERNEL, "%s", kobject_name(&dev->kobj));
|
||||
if (!client_name) {
|
||||
kfree(logger);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
group = iommu_group_get_for_dev(dev);
|
||||
iommu_group_put(group);
|
||||
|
||||
INIT_LIST_HEAD(&logger->list);
|
||||
logger->domain = domain;
|
||||
logger->group = group;
|
||||
logger->client_name = client_name;
|
||||
logger->fmt = fmt;
|
||||
logger->levels = levels;
|
||||
logger->ttbr0 = ttbr0;
|
||||
|
|
@ -116,17 +127,16 @@ static struct iommu_debug_attachment *iommu_logger_init(
|
|||
}
|
||||
|
||||
int iommu_logger_register(struct iommu_debug_attachment **logger_out,
|
||||
struct iommu_domain *domain,
|
||||
struct iommu_group *group,
|
||||
struct iommu_domain *domain, struct device *dev,
|
||||
struct io_pgtable *iop)
|
||||
{
|
||||
struct iommu_debug_attachment *logger;
|
||||
|
||||
if (!logger_out || !domain || !group || !iop ||
|
||||
if (!logger_out || !dev || !iop ||
|
||||
iop->fmt >= IO_PGTABLE_NUM_FMTS)
|
||||
return -EINVAL;
|
||||
|
||||
logger = iommu_logger_init(domain, group, iop);
|
||||
logger = iommu_logger_init(domain, dev, iop);
|
||||
if (IS_ERR(logger))
|
||||
return PTR_ERR(logger);
|
||||
|
||||
|
|
@ -147,6 +157,7 @@ void iommu_logger_unregister(struct iommu_debug_attachment *logger)
|
|||
mutex_lock(&iommu_debug_attachments_lock);
|
||||
list_del(&logger->list);
|
||||
mutex_unlock(&iommu_debug_attachments_lock);
|
||||
kfree(logger->client_name);
|
||||
kfree(logger);
|
||||
}
|
||||
EXPORT_SYMBOL(iommu_logger_unregister);
|
||||
|
|
|
|||
|
|
@ -15,12 +15,11 @@ enum iommu_logger_pgtable_fmt {
|
|||
/*
|
||||
* Each group may have more than one domain; but each domain may
|
||||
* only have one group.
|
||||
* Used by debug tools to display the name of the device(s) associated
|
||||
* with a particular domain.
|
||||
*/
|
||||
struct iommu_debug_attachment {
|
||||
struct iommu_domain *domain;
|
||||
struct iommu_group *group;
|
||||
char *client_name;
|
||||
enum iommu_logger_pgtable_fmt fmt;
|
||||
unsigned int levels;
|
||||
/*
|
||||
|
|
@ -35,14 +34,13 @@ struct iommu_debug_attachment {
|
|||
#if IS_ENABLED(CONFIG_QTI_IOMMU_SUPPORT)
|
||||
|
||||
int iommu_logger_register(struct iommu_debug_attachment **a,
|
||||
struct iommu_domain *domain,
|
||||
struct iommu_group *group,
|
||||
struct iommu_domain *domain, struct device *dev,
|
||||
struct io_pgtable *iop);
|
||||
void iommu_logger_unregister(struct iommu_debug_attachment *a);
|
||||
#else
|
||||
static inline int iommu_logger_register(struct iommu_debug_attachment **a,
|
||||
struct iommu_domain *domain,
|
||||
struct iommu_group *group,
|
||||
struct device *dev,
|
||||
struct io_pgtable *iop)
|
||||
{
|
||||
return 0;
|
||||
|
|
|
|||
Loading…
Reference in a new issue