OSDN Git Service

iommu/iommu-debug: Add support for secure domain profiling
authorMitchel Humpherys <mitchelh@codeaurora.org>
Fri, 2 Oct 2015 23:02:31 +0000 (16:02 -0700)
committerDavid Keitel <dkeitel@codeaurora.org>
Tue, 22 Mar 2016 18:14:22 +0000 (11:14 -0700)
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>
drivers/iommu/iommu-debug.c

index 8438581..48e903a 100644 (file)
@@ -424,7 +424,8 @@ static const char * const _size_to_string(unsigned long size)
        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 };
@@ -458,6 +459,17 @@ static void iommu_debug_device_profiling(struct seq_file *s, struct device *dev)
                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");
@@ -551,7 +563,7 @@ static int iommu_debug_profiling_show(struct seq_file *s, void *ignored)
 {
        struct iommu_debug_device *ddev = s->private;
 
-       iommu_debug_device_profiling(s, ddev->dev);
+       iommu_debug_device_profiling(s, ddev->dev, false);
 
        return 0;
 }
@@ -568,6 +580,29 @@ static const struct file_operations iommu_debug_profiling_fops = {
        .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)
 {
@@ -946,6 +981,13 @@ static int snarf_iommu_devices(struct device *dev, const char *name)
                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",
+                      name);
+               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",