Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 778d88fe authored by Isaac J. Manjarres's avatar Isaac J. Manjarres
Browse files

iommu/iommu-logger: Log IOMMU client name in debug structures



Log IOMMU client name in debug structures so that tools can
directly read the IOMMU client name without having to access
other structures outside of the IOMMU debug attachments structure.

Change-Id: I36c13fd63e6ca7260b69d01573126e276eb5835b
Signed-off-by: default avatarIsaac J. Manjarres <isaacm@codeaurora.org>
parent 901b25ee
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
@@ -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;

+20 −9
Original line number Diff line number Diff line
@@ -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);
+3 −5
Original line number Diff line number Diff line
@@ -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;