iommu/iommu-debug: Add support for secure domain profiling

Secure domains do different amounts of work than non-secure domains, so
we need to be able to profile them separately.  Add another debugfs
file, "secure_profiling", that does the same thing as the "profiling"
file.

Change-Id: I6968036bfdcc63449f27336771b3956a2b7754f6
Signed-off-by: Mitchel Humpherys <mitchelh@codeaurora.org>
Signed-off-by: Patrick Daly <pdaly@codeaurora.org>
diff --git a/drivers/iommu/iommu-debug.c b/drivers/iommu/iommu-debug.c
index 8f7594c..2e2ea1a 100644
--- a/drivers/iommu/iommu-debug.c
+++ b/drivers/iommu/iommu-debug.c
@@ -455,7 +455,8 @@
 	return "unknown size, please add to _size_to_string";
 }
 
-static void iommu_debug_device_profiling(struct seq_file *s, struct device *dev)
+static void iommu_debug_device_profiling(struct seq_file *s, struct device *dev,
+					 bool secure)
 {
 	unsigned long sizes[] = { SZ_4K, SZ_64K, SZ_2M, SZ_1M * 12,
 				  SZ_1M * 20, 0 };
@@ -478,6 +479,17 @@
 		goto out_domain_free;
 	}
 
+	if (secure) {
+		int secure_vmid = VMID_CP_PIXEL;
+
+		if (iommu_domain_set_attr(domain, DOMAIN_ATTR_SECURE_VMID,
+					  &secure_vmid)) {
+			seq_printf(s, "Couldn't set secure vmid to %d\n",
+				   secure_vmid);
+			goto out_domain_free;
+		}
+	}
+
 	if (iommu_attach_device(domain, dev)) {
 		seq_puts(s,
 			 "Couldn't attach new domain to device. Is it already attached?\n");
@@ -571,7 +583,7 @@
 {
 	struct iommu_debug_device *ddev = s->private;
 
-	iommu_debug_device_profiling(s, ddev->dev);
+	iommu_debug_device_profiling(s, ddev->dev, false);
 
 	return 0;
 }
@@ -588,6 +600,29 @@
 	.release = single_release,
 };
 
+static int iommu_debug_secure_profiling_show(struct seq_file *s, void *ignored)
+{
+	struct iommu_debug_device *ddev = s->private;
+
+	iommu_debug_device_profiling(s, ddev->dev, true);
+
+	return 0;
+}
+
+static int iommu_debug_secure_profiling_open(struct inode *inode,
+					     struct file *file)
+{
+	return single_open(file, iommu_debug_secure_profiling_show,
+			   inode->i_private);
+}
+
+static const struct file_operations iommu_debug_secure_profiling_fops = {
+	.open	 = iommu_debug_secure_profiling_open,
+	.read	 = seq_read,
+	.llseek	 = seq_lseek,
+	.release = single_release,
+};
+
 static int iommu_debug_attach_do_attach(struct iommu_debug_device *ddev,
 					int val, bool is_secure)
 {
@@ -952,6 +987,13 @@
 		goto err_rmdir;
 	}
 
+	if (!debugfs_create_file("secure_profiling", S_IRUSR, dir, ddev,
+				 &iommu_debug_secure_profiling_fops)) {
+		pr_err("Couldn't create iommu/devices/%s/secure_profiling debugfs file\n",
+		       dev_name(dev));
+		goto err_rmdir;
+	}
+
 	if (!debugfs_create_file("attach", S_IRUSR, dir, ddev,
 				 &iommu_debug_attach_fops)) {
 		pr_err("Couldn't create iommu/devices/%s/attach debugfs file\n",