aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/iommu
diff options
context:
space:
mode:
authorHiroshi Doyu <hdoyu@nvidia.com>2012-09-14 12:22:00 -0400
committerJoerg Roedel <joerg.roedel@amd.com>2012-09-18 06:36:38 -0400
commit5a2c937a8be8c9c5a6d23308b5ee841b6394a1cf (patch)
treed38dc60a32b3112d19805cdcecd381f3140a6c80 /drivers/iommu
parent39abf8aa7dfad0badb4741373023cda369aacc8e (diff)
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.c52
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 {
246 spinlock_t client_lock; /* for client list */ 246 spinlock_t client_lock; /* for client list */
247}; 247};
248 248
249struct smmu_debugfs_info {
250 struct smmu_device *smmu;
251 int mc;
252 int cache;
253};
254
249/* 255/*
250 * Per SMMU device - IOMMU device 256 * Per SMMU device - IOMMU device
251 */ 257 */
@@ -267,6 +273,7 @@ struct smmu_device {
267 unsigned long asid_security; 273 unsigned long asid_security;
268 274
269 struct dentry *debugfs_root; 275 struct dentry *debugfs_root;
276 struct smmu_debugfs_info *debugfs_info;
270 277
271 struct device_node *ahb; 278 struct device_node *ahb;
272 279
@@ -917,9 +924,10 @@ static ssize_t smmu_debugfs_stats_write(struct file *file,
917 const char __user *buffer, 924 const char __user *buffer,
918 size_t count, loff_t *pos) 925 size_t count, loff_t *pos)
919{ 926{
927 struct smmu_debugfs_info *info;
920 struct smmu_device *smmu; 928 struct smmu_device *smmu;
921 struct dentry *dent; 929 struct dentry *dent;
922 int i, cache, mc; 930 int i;
923 enum { 931 enum {
924 _OFF = 0, 932 _OFF = 0,
925 _ON, 933 _ON,
@@ -947,11 +955,10 @@ static ssize_t smmu_debugfs_stats_write(struct file *file,
947 return -EINVAL; 955 return -EINVAL;
948 956
949 dent = file->f_dentry; 957 dent = file->f_dentry;
950 cache = (int)dent->d_inode->i_private; 958 info = dent->d_inode->i_private;
951 mc = (int)dent->d_parent->d_inode->i_private; 959 smmu = info->smmu;
952 smmu = dent->d_parent->d_parent->d_inode->i_private;
953 960
954 offs = SMMU_CACHE_CONFIG(cache); 961 offs = SMMU_CACHE_CONFIG(info->cache);
955 val = smmu_read(smmu, offs); 962 val = smmu_read(smmu, offs);
956 switch (i) { 963 switch (i) {
957 case _OFF: 964 case _OFF:
@@ -983,21 +990,21 @@ static ssize_t smmu_debugfs_stats_write(struct file *file,
983 990
984static int smmu_debugfs_stats_show(struct seq_file *s, void *v) 991static int smmu_debugfs_stats_show(struct seq_file *s, void *v)
985{ 992{
993 struct smmu_debugfs_info *info;
986 struct smmu_device *smmu; 994 struct smmu_device *smmu;
987 struct dentry *dent; 995 struct dentry *dent;
988 int i, cache, mc; 996 int i;
989 const char * const stats[] = { "hit", "miss", }; 997 const char * const stats[] = { "hit", "miss", };
990 998
991 dent = d_find_alias(s->private); 999 dent = d_find_alias(s->private);
992 cache = (int)dent->d_inode->i_private; 1000 info = dent->d_inode->i_private;
993 mc = (int)dent->d_parent->d_inode->i_private; 1001 smmu = info->smmu;
994 smmu = dent->d_parent->d_parent->d_inode->i_private;
995 1002
996 for (i = 0; i < ARRAY_SIZE(stats); i++) { 1003 for (i = 0; i < ARRAY_SIZE(stats); i++) {
997 u32 val; 1004 u32 val;
998 size_t offs; 1005 size_t offs;
999 1006
1000 offs = SMMU_STATS_CACHE_COUNT(mc, cache, i); 1007 offs = SMMU_STATS_CACHE_COUNT(info->mc, info->cache, i);
1001 val = smmu_read(smmu, offs); 1008 val = smmu_read(smmu, offs);
1002 seq_printf(s, "%s:%08x ", stats[i], val); 1009 seq_printf(s, "%s:%08x ", stats[i], val);
1003 1010
@@ -1025,16 +1032,22 @@ static const struct file_operations smmu_debugfs_stats_fops = {
1025static void smmu_debugfs_delete(struct smmu_device *smmu) 1032static void smmu_debugfs_delete(struct smmu_device *smmu)
1026{ 1033{
1027 debugfs_remove_recursive(smmu->debugfs_root); 1034 debugfs_remove_recursive(smmu->debugfs_root);
1035 kfree(smmu->debugfs_info);
1028} 1036}
1029 1037
1030static void smmu_debugfs_create(struct smmu_device *smmu) 1038static void smmu_debugfs_create(struct smmu_device *smmu)
1031{ 1039{
1032 int i; 1040 int i;
1041 size_t bytes;
1033 struct dentry *root; 1042 struct dentry *root;
1034 1043
1035 root = debugfs_create_file(dev_name(smmu->dev), 1044 bytes = ARRAY_SIZE(smmu_debugfs_mc) * ARRAY_SIZE(smmu_debugfs_cache) *
1036 S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO, 1045 sizeof(*smmu->debugfs_info);
1037 NULL, smmu, NULL); 1046 smmu->debugfs_info = kmalloc(bytes, GFP_KERNEL);
1047 if (!smmu->debugfs_info)
1048 return;
1049
1050 root = debugfs_create_dir(dev_name(smmu->dev), NULL);
1038 if (!root) 1051 if (!root)
1039 goto err_out; 1052 goto err_out;
1040 smmu->debugfs_root = root; 1053 smmu->debugfs_root = root;
@@ -1043,18 +1056,23 @@ static void smmu_debugfs_create(struct smmu_device *smmu)
1043 int j; 1056 int j;
1044 struct dentry *mc; 1057 struct dentry *mc;
1045 1058
1046 mc = debugfs_create_file(smmu_debugfs_mc[i], 1059 mc = debugfs_create_dir(smmu_debugfs_mc[i], root);
1047 S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO,
1048 root, (void *)i, NULL);
1049 if (!mc) 1060 if (!mc)
1050 goto err_out; 1061 goto err_out;
1051 1062
1052 for (j = 0; j < ARRAY_SIZE(smmu_debugfs_cache); j++) { 1063 for (j = 0; j < ARRAY_SIZE(smmu_debugfs_cache); j++) {
1053 struct dentry *cache; 1064 struct dentry *cache;
1065 struct smmu_debugfs_info *info;
1066
1067 info = smmu->debugfs_info;
1068 info += i * ARRAY_SIZE(smmu_debugfs_mc) + j;
1069 info->smmu = smmu;
1070 info->mc = i;
1071 info->cache = j;
1054 1072
1055 cache = debugfs_create_file(smmu_debugfs_cache[j], 1073 cache = debugfs_create_file(smmu_debugfs_cache[j],
1056 S_IWUGO | S_IRUGO, mc, 1074 S_IWUGO | S_IRUGO, mc,
1057 (void *)j, 1075 (void *)info,
1058 &smmu_debugfs_stats_fops); 1076 &smmu_debugfs_stats_fops);
1059 if (!cache) 1077 if (!cache)
1060 goto err_out; 1078 goto err_out;