diff options
author | Hiroshi Doyu <hdoyu@nvidia.com> | 2012-09-14 18:22:00 +0200 |
---|---|---|
committer | Joerg Roedel <joerg.roedel@amd.com> | 2012-09-18 12:36:38 +0200 |
commit | 5a2c937a8be8c9c5a6d23308b5ee841b6394a1cf (patch) | |
tree | d38dc60a32b3112d19805cdcecd381f3140a6c80 /drivers/iommu | |
parent | iommu/tegra: smmu: debugfs for TLB/PTC statistics (diff) | |
download | linux-5a2c937a8be8c9c5a6d23308b5ee841b6394a1cf.tar.xz linux-5a2c937a8be8c9c5a6d23308b5ee841b6394a1cf.zip |
iommu/tegra: smmu: Use debugfs_create_dir for directory
The commit c3b1a35 "debugfs: make sure that debugfs_create_file() gets
used only for regulars" doesn't allow to use debugfs_create_file() for
dir. Keep debugfs data in smmu_device instead of directory's i_private.
Signed-off-by: Hiroshi Doyu <hdoyu@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Diffstat (limited to 'drivers/iommu')
-rw-r--r-- | drivers/iommu/tegra-smmu.c | 52 |
1 files changed, 35 insertions, 17 deletions
diff --git a/drivers/iommu/tegra-smmu.c b/drivers/iommu/tegra-smmu.c index 95b4698abd3e..7e42c71c1ffc 100644 --- a/drivers/iommu/tegra-smmu.c +++ b/drivers/iommu/tegra-smmu.c @@ -246,6 +246,12 @@ struct smmu_as { spinlock_t client_lock; /* for client list */ }; +struct smmu_debugfs_info { + struct smmu_device *smmu; + int mc; + int cache; +}; + /* * Per SMMU device - IOMMU device */ @@ -267,6 +273,7 @@ struct smmu_device { unsigned long asid_security; struct dentry *debugfs_root; + struct smmu_debugfs_info *debugfs_info; struct device_node *ahb; @@ -917,9 +924,10 @@ static ssize_t smmu_debugfs_stats_write(struct file *file, const char __user *buffer, size_t count, loff_t *pos) { + struct smmu_debugfs_info *info; struct smmu_device *smmu; struct dentry *dent; - int i, cache, mc; + int i; enum { _OFF = 0, _ON, @@ -947,11 +955,10 @@ static ssize_t smmu_debugfs_stats_write(struct file *file, return -EINVAL; dent = file->f_dentry; - cache = (int)dent->d_inode->i_private; - mc = (int)dent->d_parent->d_inode->i_private; - smmu = dent->d_parent->d_parent->d_inode->i_private; + info = dent->d_inode->i_private; + smmu = info->smmu; - offs = SMMU_CACHE_CONFIG(cache); + offs = SMMU_CACHE_CONFIG(info->cache); val = smmu_read(smmu, offs); switch (i) { case _OFF: @@ -983,21 +990,21 @@ static ssize_t smmu_debugfs_stats_write(struct file *file, static int smmu_debugfs_stats_show(struct seq_file *s, void *v) { + struct smmu_debugfs_info *info; struct smmu_device *smmu; struct dentry *dent; - int i, cache, mc; + int i; const char * const stats[] = { "hit", "miss", }; dent = d_find_alias(s->private); - cache = (int)dent->d_inode->i_private; - mc = (int)dent->d_parent->d_inode->i_private; - smmu = dent->d_parent->d_parent->d_inode->i_private; + info = dent->d_inode->i_private; + smmu = info->smmu; for (i = 0; i < ARRAY_SIZE(stats); i++) { u32 val; size_t offs; - offs = SMMU_STATS_CACHE_COUNT(mc, cache, i); + offs = SMMU_STATS_CACHE_COUNT(info->mc, info->cache, i); val = smmu_read(smmu, offs); seq_printf(s, "%s:%08x ", stats[i], val); @@ -1025,16 +1032,22 @@ static const struct file_operations smmu_debugfs_stats_fops = { static void smmu_debugfs_delete(struct smmu_device *smmu) { debugfs_remove_recursive(smmu->debugfs_root); + kfree(smmu->debugfs_info); } static void smmu_debugfs_create(struct smmu_device *smmu) { int i; + size_t bytes; struct dentry *root; - root = debugfs_create_file(dev_name(smmu->dev), - S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO, - NULL, smmu, NULL); + bytes = ARRAY_SIZE(smmu_debugfs_mc) * ARRAY_SIZE(smmu_debugfs_cache) * + sizeof(*smmu->debugfs_info); + smmu->debugfs_info = kmalloc(bytes, GFP_KERNEL); + if (!smmu->debugfs_info) + return; + + root = debugfs_create_dir(dev_name(smmu->dev), NULL); if (!root) goto err_out; smmu->debugfs_root = root; @@ -1043,18 +1056,23 @@ static void smmu_debugfs_create(struct smmu_device *smmu) int j; struct dentry *mc; - mc = debugfs_create_file(smmu_debugfs_mc[i], - S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO, - root, (void *)i, NULL); + mc = debugfs_create_dir(smmu_debugfs_mc[i], root); if (!mc) goto err_out; for (j = 0; j < ARRAY_SIZE(smmu_debugfs_cache); j++) { struct dentry *cache; + struct smmu_debugfs_info *info; + + info = smmu->debugfs_info; + info += i * ARRAY_SIZE(smmu_debugfs_mc) + j; + info->smmu = smmu; + info->mc = i; + info->cache = j; cache = debugfs_create_file(smmu_debugfs_cache[j], S_IWUGO | S_IRUGO, mc, - (void *)j, + (void *)info, &smmu_debugfs_stats_fops); if (!cache) goto err_out; |