diff options
Diffstat (limited to 'drivers/iommu')
-rw-r--r-- | drivers/iommu/omap-iommu-debug.c | 55 |
1 files changed, 43 insertions, 12 deletions
diff --git a/drivers/iommu/omap-iommu-debug.c b/drivers/iommu/omap-iommu-debug.c index 288da5c1499d..bad9f9da990d 100644 --- a/drivers/iommu/omap-iommu-debug.c +++ b/drivers/iommu/omap-iommu-debug.c | |||
@@ -44,7 +44,8 @@ static ssize_t debug_read_ver(struct file *file, char __user *userbuf, | |||
44 | static ssize_t debug_read_regs(struct file *file, char __user *userbuf, | 44 | static ssize_t debug_read_regs(struct file *file, char __user *userbuf, |
45 | size_t count, loff_t *ppos) | 45 | size_t count, loff_t *ppos) |
46 | { | 46 | { |
47 | struct omap_iommu *obj = file->private_data; | 47 | struct device *dev = file->private_data; |
48 | struct omap_iommu *obj = dev_to_omap_iommu(dev); | ||
48 | char *p, *buf; | 49 | char *p, *buf; |
49 | ssize_t bytes; | 50 | ssize_t bytes; |
50 | 51 | ||
@@ -67,7 +68,8 @@ static ssize_t debug_read_regs(struct file *file, char __user *userbuf, | |||
67 | static ssize_t debug_read_tlb(struct file *file, char __user *userbuf, | 68 | static ssize_t debug_read_tlb(struct file *file, char __user *userbuf, |
68 | size_t count, loff_t *ppos) | 69 | size_t count, loff_t *ppos) |
69 | { | 70 | { |
70 | struct omap_iommu *obj = file->private_data; | 71 | struct device *dev = file->private_data; |
72 | struct omap_iommu *obj = dev_to_omap_iommu(dev); | ||
71 | char *p, *buf; | 73 | char *p, *buf; |
72 | ssize_t bytes, rest; | 74 | ssize_t bytes, rest; |
73 | 75 | ||
@@ -97,7 +99,8 @@ static ssize_t debug_write_pagetable(struct file *file, | |||
97 | struct iotlb_entry e; | 99 | struct iotlb_entry e; |
98 | struct cr_regs cr; | 100 | struct cr_regs cr; |
99 | int err; | 101 | int err; |
100 | struct omap_iommu *obj = file->private_data; | 102 | struct device *dev = file->private_data; |
103 | struct omap_iommu *obj = dev_to_omap_iommu(dev); | ||
101 | char buf[MAXCOLUMN], *p = buf; | 104 | char buf[MAXCOLUMN], *p = buf; |
102 | 105 | ||
103 | count = min(count, sizeof(buf)); | 106 | count = min(count, sizeof(buf)); |
@@ -184,7 +187,8 @@ out: | |||
184 | static ssize_t debug_read_pagetable(struct file *file, char __user *userbuf, | 187 | static ssize_t debug_read_pagetable(struct file *file, char __user *userbuf, |
185 | size_t count, loff_t *ppos) | 188 | size_t count, loff_t *ppos) |
186 | { | 189 | { |
187 | struct omap_iommu *obj = file->private_data; | 190 | struct device *dev = file->private_data; |
191 | struct omap_iommu *obj = dev_to_omap_iommu(dev); | ||
188 | char *p, *buf; | 192 | char *p, *buf; |
189 | size_t bytes; | 193 | size_t bytes; |
190 | 194 | ||
@@ -212,7 +216,8 @@ static ssize_t debug_read_pagetable(struct file *file, char __user *userbuf, | |||
212 | static ssize_t debug_read_mmap(struct file *file, char __user *userbuf, | 216 | static ssize_t debug_read_mmap(struct file *file, char __user *userbuf, |
213 | size_t count, loff_t *ppos) | 217 | size_t count, loff_t *ppos) |
214 | { | 218 | { |
215 | struct omap_iommu *obj = file->private_data; | 219 | struct device *dev = file->private_data; |
220 | struct omap_iommu *obj = dev_to_omap_iommu(dev); | ||
216 | char *p, *buf; | 221 | char *p, *buf; |
217 | struct iovm_struct *tmp; | 222 | struct iovm_struct *tmp; |
218 | int uninitialized_var(i); | 223 | int uninitialized_var(i); |
@@ -254,7 +259,7 @@ static ssize_t debug_read_mmap(struct file *file, char __user *userbuf, | |||
254 | static ssize_t debug_read_mem(struct file *file, char __user *userbuf, | 259 | static ssize_t debug_read_mem(struct file *file, char __user *userbuf, |
255 | size_t count, loff_t *ppos) | 260 | size_t count, loff_t *ppos) |
256 | { | 261 | { |
257 | struct omap_iommu *obj = file->private_data; | 262 | struct device *dev = file->private_data; |
258 | char *p, *buf; | 263 | char *p, *buf; |
259 | struct iovm_struct *area; | 264 | struct iovm_struct *area; |
260 | ssize_t bytes; | 265 | ssize_t bytes; |
@@ -268,7 +273,7 @@ static ssize_t debug_read_mem(struct file *file, char __user *userbuf, | |||
268 | 273 | ||
269 | mutex_lock(&iommu_debug_lock); | 274 | mutex_lock(&iommu_debug_lock); |
270 | 275 | ||
271 | area = omap_find_iovm_area(obj, (u32)ppos); | 276 | area = omap_find_iovm_area(dev, (u32)ppos); |
272 | if (IS_ERR(area)) { | 277 | if (IS_ERR(area)) { |
273 | bytes = -EINVAL; | 278 | bytes = -EINVAL; |
274 | goto err_out; | 279 | goto err_out; |
@@ -287,7 +292,7 @@ err_out: | |||
287 | static ssize_t debug_write_mem(struct file *file, const char __user *userbuf, | 292 | static ssize_t debug_write_mem(struct file *file, const char __user *userbuf, |
288 | size_t count, loff_t *ppos) | 293 | size_t count, loff_t *ppos) |
289 | { | 294 | { |
290 | struct omap_iommu *obj = file->private_data; | 295 | struct device *dev = file->private_data; |
291 | struct iovm_struct *area; | 296 | struct iovm_struct *area; |
292 | char *p, *buf; | 297 | char *p, *buf; |
293 | 298 | ||
@@ -305,7 +310,7 @@ static ssize_t debug_write_mem(struct file *file, const char __user *userbuf, | |||
305 | goto err_out; | 310 | goto err_out; |
306 | } | 311 | } |
307 | 312 | ||
308 | area = omap_find_iovm_area(obj, (u32)ppos); | 313 | area = omap_find_iovm_area(dev, (u32)ppos); |
309 | if (IS_ERR(area)) { | 314 | if (IS_ERR(area)) { |
310 | count = -EINVAL; | 315 | count = -EINVAL; |
311 | goto err_out; | 316 | goto err_out; |
@@ -350,7 +355,7 @@ DEBUG_FOPS(mem); | |||
350 | { \ | 355 | { \ |
351 | struct dentry *dent; \ | 356 | struct dentry *dent; \ |
352 | dent = debugfs_create_file(#attr, mode, parent, \ | 357 | dent = debugfs_create_file(#attr, mode, parent, \ |
353 | obj, &debug_##attr##_fops); \ | 358 | dev, &debug_##attr##_fops); \ |
354 | if (!dent) \ | 359 | if (!dent) \ |
355 | return -ENOMEM; \ | 360 | return -ENOMEM; \ |
356 | } | 361 | } |
@@ -362,20 +367,29 @@ static int iommu_debug_register(struct device *dev, void *data) | |||
362 | { | 367 | { |
363 | struct platform_device *pdev = to_platform_device(dev); | 368 | struct platform_device *pdev = to_platform_device(dev); |
364 | struct omap_iommu *obj = platform_get_drvdata(pdev); | 369 | struct omap_iommu *obj = platform_get_drvdata(pdev); |
370 | struct omap_iommu_arch_data *arch_data; | ||
365 | struct dentry *d, *parent; | 371 | struct dentry *d, *parent; |
366 | 372 | ||
367 | if (!obj || !obj->dev) | 373 | if (!obj || !obj->dev) |
368 | return -EINVAL; | 374 | return -EINVAL; |
369 | 375 | ||
376 | arch_data = kzalloc(sizeof(*arch_data), GFP_KERNEL); | ||
377 | if (!arch_data) | ||
378 | return -ENOMEM; | ||
379 | |||
380 | arch_data->iommu_dev = obj; | ||
381 | |||
382 | dev->archdata.iommu = arch_data; | ||
383 | |||
370 | d = debugfs_create_dir(obj->name, iommu_debug_root); | 384 | d = debugfs_create_dir(obj->name, iommu_debug_root); |
371 | if (!d) | 385 | if (!d) |
372 | return -ENOMEM; | 386 | goto nomem; |
373 | parent = d; | 387 | parent = d; |
374 | 388 | ||
375 | d = debugfs_create_u8("nr_tlb_entries", 400, parent, | 389 | d = debugfs_create_u8("nr_tlb_entries", 400, parent, |
376 | (u8 *)&obj->nr_tlb_entries); | 390 | (u8 *)&obj->nr_tlb_entries); |
377 | if (!d) | 391 | if (!d) |
378 | return -ENOMEM; | 392 | goto nomem; |
379 | 393 | ||
380 | DEBUG_ADD_FILE_RO(ver); | 394 | DEBUG_ADD_FILE_RO(ver); |
381 | DEBUG_ADD_FILE_RO(regs); | 395 | DEBUG_ADD_FILE_RO(regs); |
@@ -385,6 +399,22 @@ static int iommu_debug_register(struct device *dev, void *data) | |||
385 | DEBUG_ADD_FILE(mem); | 399 | DEBUG_ADD_FILE(mem); |
386 | 400 | ||
387 | return 0; | 401 | return 0; |
402 | |||
403 | nomem: | ||
404 | kfree(arch_data); | ||
405 | return -ENOMEM; | ||
406 | } | ||
407 | |||
408 | static int iommu_debug_unregister(struct device *dev, void *data) | ||
409 | { | ||
410 | if (!dev->archdata.iommu) | ||
411 | return 0; | ||
412 | |||
413 | kfree(dev->archdata.iommu); | ||
414 | |||
415 | dev->archdata.iommu = NULL; | ||
416 | |||
417 | return 0; | ||
388 | } | 418 | } |
389 | 419 | ||
390 | static int __init iommu_debug_init(void) | 420 | static int __init iommu_debug_init(void) |
@@ -411,6 +441,7 @@ module_init(iommu_debug_init) | |||
411 | static void __exit iommu_debugfs_exit(void) | 441 | static void __exit iommu_debugfs_exit(void) |
412 | { | 442 | { |
413 | debugfs_remove_recursive(iommu_debug_root); | 443 | debugfs_remove_recursive(iommu_debug_root); |
444 | omap_foreach_iommu_device(NULL, iommu_debug_unregister); | ||
414 | } | 445 | } |
415 | module_exit(iommu_debugfs_exit) | 446 | module_exit(iommu_debugfs_exit) |
416 | 447 | ||