diff options
author | Mitchel Humpherys <mitchelh@codeaurora.org> | 2015-10-02 16:02:31 -0700 |
---|---|---|
committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-22 11:14:22 -0700 |
commit | 88a510ad7c00bfcb7265ec1cae94138655937d5c (patch) | |
tree | 75fd987690b36496274204b9689b72ca35a50d71 /drivers/iommu/iommu-debug.c | |
parent | e2dc9b365255804d272a7c50c4e73384e5a83453 (diff) |
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>
Diffstat (limited to 'drivers/iommu/iommu-debug.c')
-rw-r--r-- | drivers/iommu/iommu-debug.c | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/drivers/iommu/iommu-debug.c b/drivers/iommu/iommu-debug.c index 8438581ba171..48e903ab8373 100644 --- a/drivers/iommu/iommu-debug.c +++ b/drivers/iommu/iommu-debug.c @@ -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", |