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

Commit a8cbc18e authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

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

parents 66641c7b 778d88fe
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;