upload tizen1.0 source
[kernel/linux-2.6.36.git] / drivers / media / video / samsung / jpeg / jpeg_mem.c
1 /* linux/drivers/media/video/samsung/jpeg/jpeg_mem.c
2  *
3  * Copyright (c) 2010 Samsung Electronics Co., Ltd.
4  * http://www.samsung.com/
5  *
6  * Managent memory of the jpeg driver for encoder/docoder.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11 */
12
13 #include <asm/page.h>
14 #include <linux/vmalloc.h>
15 #include <linux/mm.h>
16
17 #if defined(CONFIG_S5P_MEM_CMA)
18 #include <linux/cma.h>
19 #elif defined(CONFIG_S5P_MEM_BOOTMEM)
20 #include <mach/media.h>
21 #include <plat/media.h>
22 #endif
23
24 #include "jpeg_mem.h"
25 #include "jpeg_core.h"
26
27 #if defined(CONFIG_S5P_SYSMMU_JPEG) && defined(CONFIG_S5P_VMEM)
28 unsigned int s_cookie;  /* for stream buffer */
29 unsigned int f_cookie;  /* for frame buffer */
30 #endif
31
32 #if defined(CONFIG_S5P_SYSMMU_JPEG) && defined(CONFIG_VIDEO_UMP)
33 #if defined(CONFIG_VCM_MMU)
34 unsigned int str_s_id;  /* secure id for stream buffer */
35 unsigned int fra_s_id;  /* secure id for frame buffer */
36 #endif /* CONFIG_VCM_MMU */
37 unsigned int str_base;  /* for stream buffer */
38 unsigned int fra_base;  /* for frame buffer */
39 #endif
40
41 int jpeg_init_mem(struct device *dev, unsigned int *base)
42 {
43 #ifdef CONFIG_S5P_MEM_CMA
44         struct cma_info mem_info;
45         int err;
46         int size;
47         char cma_name[8];
48 #endif
49 #if defined(CONFIG_S5P_SYSMMU_JPEG)
50 #if !defined(CONFIG_S5P_VMEM)
51         unsigned char *addr;
52         addr = vmalloc(JPEG_MEM_SIZE);
53         if (addr == NULL)
54                 return -1;
55         *base = (unsigned int)addr;
56 #endif /* CONFIG_S5P_VMEM */
57 #else
58 #ifdef CONFIG_S5P_MEM_CMA
59         /* CMA */
60         sprintf(cma_name, "jpeg");
61         err = cma_info(&mem_info, dev, 0);
62         jpeg_info("[cma_info] start_addr : 0x%x, end_addr : 0x%x, "
63                         "total_size : 0x%x, free_size : 0x%x\n",
64                         mem_info.lower_bound, mem_info.upper_bound,
65                         mem_info.total_size, mem_info.free_size);
66         if (err) {
67                 printk("%s: get cma info failed\n", __func__);
68                 return -1;
69         }
70         size = mem_info.total_size;
71         *base = (dma_addr_t)cma_alloc
72                 (dev, cma_name, (size_t)size, 0);
73         jpeg_info("size = 0x%x\n", size);
74         jpeg_info("*base = 0x%x\n", *base);
75 #else
76         *base = s5p_get_media_memory_bank(S5P_MDEV_JPEG, 0);
77 #endif
78 #endif /* CONFIG_S5P_SYSMMU_JPEG */
79         return 0;
80 }
81
82 int jpeg_mem_free(void)
83 {
84 #if defined(CONFIG_S5P_SYSMMU_JPEG) && defined(CONFIG_S5P_VMEM)
85         if (s_cookie != 0) {
86                 s5p_vfree(s_cookie);
87                 s_cookie = 0;
88         }
89         if (f_cookie != 0) {
90                 s5p_vfree(f_cookie);
91                 f_cookie = 0;
92         }
93 #endif
94         return 0;
95 }
96
97 unsigned long jpeg_get_stream_buf(unsigned long arg)
98 {
99 #if defined(CONFIG_S5P_SYSMMU_JPEG) && defined(CONFIG_S5P_VMEM)
100         arg = ((arg / PAGE_SIZE + 1) * PAGE_SIZE);
101         s_cookie = (unsigned int)s5p_vmalloc(arg);
102         if (s_cookie == 0)
103                 return -1;
104         return (unsigned long)s_cookie;
105 #else
106         return arg + JPEG_MAIN_START;
107 #endif
108 }
109
110 unsigned long jpeg_get_frame_buf(unsigned long arg)
111 {
112 #if defined(CONFIG_S5P_SYSMMU_JPEG) && defined(CONFIG_S5P_VMEM)
113         arg = ((arg / PAGE_SIZE + 1) * PAGE_SIZE);
114         f_cookie = (unsigned int)s5p_vmalloc(arg);
115         if (f_cookie == 0)
116                 return -1;
117         return (unsigned long)f_cookie;
118 #else
119         return arg + JPEG_S_BUF_SIZE;
120 #endif
121 }
122
123 void jpeg_set_stream_buf(unsigned int *str_buf, unsigned int base)
124 {
125 #if defined(CONFIG_S5P_SYSMMU_JPEG) && defined(CONFIG_S5P_VMEM)
126         *str_buf = (unsigned int)s5p_getaddress(s_cookie);
127 #elif defined(CONFIG_S5P_SYSMMU_JPEG) && defined(CONFIG_VIDEO_UMP)
128 #if !defined(CONFIG_VCM)
129         sysmmu_set_tablebase_pgd(SYSMMU_JPEG, __pa(current->mm->pgd));
130 #endif
131         *str_buf = str_base;
132 #else
133         *str_buf = base;
134 #endif
135 }
136
137 void jpeg_set_frame_buf(unsigned int *fra_buf, unsigned int base)
138 {
139 #if defined(CONFIG_S5P_SYSMMU_JPEG) && defined(CONFIG_S5P_VMEM)
140         *fra_buf = (unsigned int)s5p_getaddress(f_cookie);
141 #elif defined(CONFIG_S5P_SYSMMU_JPEG) && defined(CONFIG_VIDEO_UMP)
142 #if !defined(CONFIG_VCM)
143         sysmmu_set_tablebase_pgd(SYSMMU_JPEG, __pa(current->mm->pgd));
144 #endif
145         *fra_buf = fra_base;
146 #else
147         *fra_buf = base + JPEG_S_BUF_SIZE;
148 #endif
149 }
150
151 void jpeg_set_stream_base(unsigned int base)
152 {
153 #if defined(CONFIG_S5P_SYSMMU_JPEG) && defined(CONFIG_VIDEO_UMP)
154 #if defined(CONFIG_UMP_VCM_ALLOC)
155         struct vcm_res *vcm_res;
156         str_s_id = base;
157         vcm_res = (struct vcm_res *)
158                 ump_dd_meminfo_get(str_s_id, (void*)VCM_DEV_JPEG);
159         if (vcm_res)
160                 str_base = vcm_res->start;
161         else
162                 str_base = 0;
163 #else
164         str_base = base;
165 #endif /* CONFIG_UMP_VCM_ALLOC */
166 #endif
167 }
168
169 void jpeg_set_frame_base(unsigned int base)
170 {
171 #if defined(CONFIG_S5P_SYSMMU_JPEG) && defined(CONFIG_VIDEO_UMP)
172 #if defined(CONFIG_UMP_VCM_ALLOC)
173         struct vcm_res *vcm_res;
174         fra_s_id = base;
175         vcm_res = (struct vcm_res *)
176                 ump_dd_meminfo_get(fra_s_id, (void*)VCM_DEV_JPEG);
177         if (vcm_res)
178                 fra_base = vcm_res->start;
179         else
180                 fra_base = 0;
181 #else
182         fra_base = base;
183 #endif /* CONFIG_UMP_VCM_ALLOC */
184 #endif
185 }
186