rk: ion: cma bitmap move to /d/ion/heaps/cma-heap node
authorCMY <cmy@rock-chips.com>
Wed, 9 Apr 2014 01:29:13 +0000 (09:29 +0800)
committerCMY <cmy@rock-chips.com>
Wed, 9 Apr 2014 02:22:47 +0000 (10:22 +0800)
drivers/staging/android/ion/ion.c
drivers/staging/android/ion/rockchip/rockchip_ion.c

index 9fbecf4c841570966bc5558c812aa0fa32515aae..00497a8671b5a3398e599e11bdca649c578c5856 100755 (executable)
@@ -36,6 +36,7 @@
 #include <linux/dma-buf.h>
 #include <linux/idr.h>
 #include <linux/rockchip_ion.h>
+#include <asm-generic/dma-contiguous.h>
 
 #include "ion.h"
 #include "ion_priv.h"
@@ -900,7 +901,8 @@ static int ion_debug_client_show_buffer(struct seq_file *s, void *unused)
        size_t len;
 
        seq_printf(s, "----------------------------------------------------\n");
-       seq_printf(s, "%16.s: %12.s %8.s %4.s %4.s %4.s\n", "heap_name", "addr", "size", "HC", "IBR", "IHR");
+       seq_printf(s, "%16.s: %12.s %8.s %4.s %4.s %4.s\n", "heap_name", "addr", 
+               "size", "HC", "IBR", "IHR");
        mutex_lock(&client->lock);
        for (n = rb_first(&client->handles); n; n = rb_next(n)) {
                struct ion_handle *handle = rb_entry(n, struct ion_handle, node);
@@ -909,7 +911,8 @@ static int ion_debug_client_show_buffer(struct seq_file *s, void *unused)
                        buffer->heap->ops->phys(buffer->heap, buffer, &addr, &len);
                        seq_printf(s, "%16.16s: 0x%08lx %8zuKB %4d %4d %4d\n",
                                buffer->heap->name, addr, len>>10, buffer->handle_count,
-                               atomic_read(&buffer->ref.refcount), atomic_read(&handle->ref.refcount));
+                               atomic_read(&buffer->ref.refcount), 
+                               atomic_read(&handle->ref.refcount));
                }
        }
        mutex_unlock(&client->lock);
@@ -1777,6 +1780,65 @@ DEFINE_SIMPLE_ATTRIBUTE(debug_shrink_fops, debug_shrink_get,
                        debug_shrink_set, "%llu\n");
 #endif
 
+#ifdef CONFIG_CMA
+// struct "cma" quoted from drivers/base/dma-contiguous.c
+struct cma {
+       unsigned long   base_pfn;
+       unsigned long   count;
+       unsigned long   *bitmap;
+};
+
+// struct "ion_cma_heap" quoted from drivers/staging/android/ion/ion_cma_heap.c
+struct ion_cma_heap {
+       struct ion_heap heap;
+       struct device *dev;
+};
+
+static int ion_cma_heap_debug_show(struct seq_file *s, void *unused)
+{
+       struct ion_heap *heap = s->private;
+       struct ion_cma_heap *cma_heap = container_of(heap,
+                                                       struct ion_cma_heap,
+                                                       heap);
+       struct device *dev = cma_heap->dev;
+       struct cma *cma = dev_get_cma_area(dev);
+       int i;
+       int rows = cma->count/(SZ_1M >> PAGE_SHIFT);
+       phys_addr_t base = __pfn_to_phys(cma->base_pfn);
+
+       seq_printf(s, "%s Heap bitmap:\n", heap->name);
+
+       for(i = rows - 1; i>= 0; i--){
+               seq_printf(s, "%.4uM@0x%08x: %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
+                               i+1, base+(i)*SZ_1M,
+                               cma->bitmap[i*8 + 7],
+                               cma->bitmap[i*8 + 6],
+                               cma->bitmap[i*8 + 5],
+                               cma->bitmap[i*8 + 4],
+                               cma->bitmap[i*8 + 3],
+                               cma->bitmap[i*8 + 2],
+                               cma->bitmap[i*8 + 1],
+                               cma->bitmap[i*8]);
+       }
+       seq_printf(s, "Heap size: %luM, Heap base: 0x%08x\n",
+               (cma->count)>>8, base);
+
+       return 0;
+}
+
+static int ion_debug_heap_bitmap_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, ion_cma_heap_debug_show, inode->i_private);
+}
+
+static const struct file_operations debug_heap_bitmap_fops = {
+       .open = ion_debug_heap_bitmap_open,
+       .read = seq_read,
+       .llseek = seq_lseek,
+       .release = single_release,
+};
+#endif
+
 void ion_device_add_heap(struct ion_device *dev, struct ion_heap *heap)
 {
        struct dentry *debug_file;
@@ -1824,6 +1886,22 @@ void ion_device_add_heap(struct ion_device *dev, struct ion_heap *heap)
                                path, debug_name);
                }
        }
+#endif
+#ifdef CONFIG_CMA
+       if (ION_HEAP_TYPE_DMA==heap->type) {
+               char* heap_bitmap_name = kasprintf(
+                       GFP_KERNEL, "%s-bitmap", heap->name);
+               debug_file = debugfs_create_file(heap_bitmap_name, 0664,
+                                               dev->heaps_debug_root, heap,
+                                               &debug_heap_bitmap_fops);
+               if (!debug_file) {
+                       char buf[256], *path;
+                       path = dentry_path(dev->heaps_debug_root, buf, 256);
+                       pr_err("Failed to create heap debugfs at %s/%s\n",
+                               path, heap_bitmap_name);
+               }
+               kfree(heap_bitmap_name);
+       }
 #endif
        up_write(&dev->lock);
 }
index 10a0a3926b597e4908f0ee68688cba33b23ef004..b752a2b79c9f7be37ec4109dbac29117ad33cf5b 100755 (executable)
@@ -176,55 +176,6 @@ free_heaps:
        return ERR_PTR(ret);
 }
 
-#ifdef CONFIG_CMA
-
-// struct "cma" quoted from drivers/base/dma-contiguous.c
-struct cma {
-       unsigned long   base_pfn;
-       unsigned long   count;
-       unsigned long   *bitmap;
-};
-
-// struct "ion_cma_heap" quoted from drivers/staging/android/ion/ion_cma_heap.c
-struct ion_cma_heap {
-       struct ion_heap heap;
-       struct device *dev;
-};
-
-static int ion_cma_heap_debug_show(struct ion_heap *heap, struct seq_file *s,
-                                     void *unused)
-{
-       struct ion_cma_heap *cma_heap = container_of(heap,
-                                                       struct ion_cma_heap,
-                                                       heap);
-       struct device *dev = cma_heap->dev;
-       struct cma *cma = dev_get_cma_area(dev);
-       int i;
-       int rows = cma->count/(SZ_1M >> PAGE_SHIFT);
-       phys_addr_t base = __pfn_to_phys(cma->base_pfn);
-
-       seq_printf(s, "Heap bitmap:\n");
-
-       for(i = rows - 1; i>= 0; i--){
-               seq_printf(s, "%.4uM@0x%08x: %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
-                               i+1, base+(i)*SZ_1M,
-                               cma->bitmap[i*8 + 7],
-                               cma->bitmap[i*8 + 6],
-                               cma->bitmap[i*8 + 5],
-                               cma->bitmap[i*8 + 4],
-                               cma->bitmap[i*8 + 3],
-                               cma->bitmap[i*8 + 2],
-                               cma->bitmap[i*8 + 1],
-                               cma->bitmap[i*8]);
-       }
-       seq_printf(s, "Heap size: %luM, Heap base: 0x%08x\n",
-               (cma->count)>>8, base);
-
-       return 0;
-}
-
-#endif
-
 struct ion_client *rockchip_ion_client_create(const char *name)
 {
        return ion_client_create(idev, name);
@@ -415,10 +366,6 @@ static int rockchip_ion_probe(struct platform_device *pdev)
                        err = PTR_ERR(heaps[i]);
                        goto err;
                }
-#ifdef CONFIG_CMA
-               if (ION_HEAP_TYPE_DMA==heap_data->type)
-                       heaps[i]->debug_show = ion_cma_heap_debug_show;
-#endif
                ion_device_add_heap(idev, heaps[i]);
        }
        platform_set_drvdata(pdev, idev);