rk: ion: get reserve cma memory for ion from device tree
authorCMY <cmy@rock-chips.com>
Wed, 12 Mar 2014 02:49:32 +0000 (10:49 +0800)
committerCMY <cmy@rock-chips.com>
Wed, 12 Mar 2014 03:27:51 +0000 (11:27 +0800)
         restore default CMA size to 16M

arch/arm/boot/dts/rk3188.dtsi
arch/arm/boot/dts/rk3288.dtsi
arch/arm/configs/rockchip_defconfig
arch/arm/mach-rockchip/rk3188.c [changed mode: 0644->0755]
drivers/staging/android/ion/rockchip/rockchip_ion.c

index c702126c7b4493e6710a6c460cf5098cc924e8c1..8cb5081981122e428000046fea9dc220b2de387d 100755 (executable)
                #address-cells = <1>;
                #size-cells = <0>;
                rockchip,ion-heap@1 { /* CMA HEAP */
+                       compatible = "rockchip,ion-reserve";
                        reg = <1>;
+                       memory-reservation = <0x00000000 0x10000000>; /* 256MB */
                };
                rockchip,ion-heap@3 { /* SYSTEM HEAP */
                        reg = <3>;
index 9eb911f9fdacf87e466dd99b1288e2690af535fc..88231724bbb6fb5b0aa844b4848cabb46b128f83 100755 (executable)
                #address-cells = <1>;
                #size-cells = <0>;
                rockchip,ion-heap@1 { /* CMA HEAP */
+                       compatible = "rockchip,ion-reserve";
                        reg = <1>;
+                       memory-reservation = <0x00000000 0x10000000>; /* 256MB */
                };
                rockchip,ion-heap@3 { /* SYSTEM HEAP */
                        reg = <3>;
index 56482e38f02cbbb175ef4ffe062b209e35e13cef..f87bcbadc891a654a01ebd4e98c26185321774dd 100755 (executable)
@@ -207,7 +207,7 @@ CONFIG_RFKILL=y
 CONFIG_RFKILL_RK=y
 CONFIG_DEVTMPFS=y
 CONFIG_CMA=y
-CONFIG_CMA_SIZE_MBYTES=256
+CONFIG_CMA_SIZE_MBYTES=16
 CONFIG_MTD=y
 CONFIG_MTD_CMDLINE_PARTS=y
 CONFIG_MTD_BLOCK=y
old mode 100644 (file)
new mode 100755 (executable)
index 976de3a..1871cf6
@@ -21,6 +21,7 @@
 #include <linux/kernel.h>
 #include <linux/of_address.h>
 #include <linux/of_platform.h>
+#include <linux/of_fdt.h>
 #include <linux/rockchip/dvfs.h>
 #include <linux/rockchip/common.h>
 #include <linux/rockchip/cpu.h>
@@ -262,6 +263,14 @@ static void __init rk3188_dt_init_timer(void)
        of_dvfs_init();
 }
 
+extern int __init rockchip_ion_find_reserve_mem(unsigned long node,
+                               const char *uname, int depth, void *data);
+static void __init rk3188_reserve(void)
+{
+       printk("%s\n", __func__);
+       of_scan_flat_dt(rockchip_ion_find_reserve_mem, NULL);
+}
+
 static const char * const rk3188_dt_compat[] __initconst = {
        "rockchip,rk3188",
        NULL,
@@ -295,6 +304,7 @@ DT_MACHINE_START(RK3188_DT, "RK30board")
        .init_time      = rk3188_dt_init_timer,
        .dt_compat      = rk3188_dt_compat,
        .init_late      = rockchip_suspend_init,
+       .reserve        = rk3188_reserve,
        .restart        = rk3188_restart,
 MACHINE_END
 
index e537a55a8129aac98086319ce71263bfeb4453d9..5cb1cd19f156cf50ae91d9863a74617bab21321b 100755 (executable)
@@ -27,6 +27,7 @@
 #include <linux/of.h>
 #include <linux/of_gpio.h>
 #include <video/of_display_timing.h>
+#include <linux/of_fdt.h>
 #endif
 
 static struct ion_device *idev;
@@ -66,6 +67,11 @@ static struct ion_heap_desc ion_heap_meta[] = {
        },
 };
 
+struct device rockchip_ion_cma_dev = {
+       .coherent_dma_mask = DMA_BIT_MASK(32),
+       .init_name = "rockchip_ion_cma",
+};
+
 static int rockchip_ion_populate_heap(struct ion_platform_heap *heap)
 {
        unsigned int i;
@@ -75,6 +81,8 @@ static int rockchip_ion_populate_heap(struct ion_platform_heap *heap)
                if (ion_heap_meta[i].id == heap->id) {
                        heap->name = ion_heap_meta[i].name;
                        heap->type = ion_heap_meta[i].type;
+                       if(heap->id == ION_CMA_HEAP_ID)
+                               heap->priv = &rockchip_ion_cma_dev;
                        ret = 0;
                        break;
                }
@@ -144,7 +152,6 @@ static struct ion_platform_data *rockchip_ion_parse_dt(
                        goto free_heaps;
 
 //             rockchip_ion_get_heap_adjacent(node, &pdata->heaps[idx]);
-               pdata->heaps[idx].priv = dev;
                pr_info("%d:  %d  %d  %s  0x%p\n", idx, pdata->heaps[idx].type, pdata->heaps[idx].id, pdata->heaps[idx].name, pdata->heaps[idx].priv);
 
                ++idx;
@@ -255,7 +262,7 @@ static long rockchip_custom_ioctl (struct ion_client *client, unsigned int cmd,
                        return PTR_ERR(dmabuf);
 
                data.id = (unsigned int)dmabuf;
-               dma_buf_put(dmabuf);
+//             dma_buf_put(dmabuf);
 
                if (copy_to_user((void __user *)arg, &data, sizeof(struct ion_share_id_data)))
                        return -EFAULT;
@@ -357,6 +364,31 @@ static int rockchip_ion_remove(struct platform_device *pdev)
        return 0;
 }
 
+int __init rockchip_ion_find_reserve_mem(unsigned long node, const char *uname,
+                               int depth, void *data)
+{
+       __be32 *prop;
+       unsigned long len;
+       phys_addr_t size;
+       phys_addr_t base;
+
+       if (!of_flat_dt_is_compatible(node, "rockchip,ion-reserve"))
+               return 0;
+
+       prop = of_get_flat_dt_prop(node, "memory-reservation", &len);
+       if (!prop || (len != 2 * sizeof(unsigned long)))
+               return 0;
+
+       base = be32_to_cpu(prop[0]);
+       size = be32_to_cpu(prop[1]);
+
+       pr_info("%s: reserve cma memory: %x %x\n", __func__, base, size);
+
+       dma_declare_contiguous(&rockchip_ion_cma_dev, size, base, 0);
+
+       return 1;
+}
+
 static const struct of_device_id rockchip_ion_dt_ids[] = {
        { .compatible = "rockchip,ion", },
        {}