1 /* linux/drivers/media/video/samsung/jpeg/jpeg_mem.c
3 * Copyright (c) 2010 Samsung Electronics Co., Ltd.
4 * http://www.samsung.com/
6 * Managent memory of the jpeg driver for encoder/docoder.
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.
14 #include <linux/vmalloc.h>
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>
25 #include "jpeg_core.h"
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 */
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 */
41 int jpeg_init_mem(struct device *dev, unsigned int *base)
43 #ifdef CONFIG_S5P_MEM_CMA
44 struct cma_info mem_info;
49 #if defined(CONFIG_S5P_SYSMMU_JPEG)
50 #if !defined(CONFIG_S5P_VMEM)
52 addr = vmalloc(JPEG_MEM_SIZE);
55 *base = (unsigned int)addr;
56 #endif /* CONFIG_S5P_VMEM */
58 #ifdef CONFIG_S5P_MEM_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);
67 printk("%s: get cma info failed\n", __func__);
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);
76 *base = s5p_get_media_memory_bank(S5P_MDEV_JPEG, 0);
78 #endif /* CONFIG_S5P_SYSMMU_JPEG */
82 int jpeg_mem_free(void)
84 #if defined(CONFIG_S5P_SYSMMU_JPEG) && defined(CONFIG_S5P_VMEM)
97 unsigned long jpeg_get_stream_buf(unsigned long arg)
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);
104 return (unsigned long)s_cookie;
106 return arg + JPEG_MAIN_START;
110 unsigned long jpeg_get_frame_buf(unsigned long arg)
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);
117 return (unsigned long)f_cookie;
119 return arg + JPEG_S_BUF_SIZE;
123 void jpeg_set_stream_buf(unsigned int *str_buf, unsigned int base)
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));
137 void jpeg_set_frame_buf(unsigned int *fra_buf, unsigned int base)
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));
147 *fra_buf = base + JPEG_S_BUF_SIZE;
151 void jpeg_set_stream_base(unsigned int base)
153 #if defined(CONFIG_S5P_SYSMMU_JPEG) && defined(CONFIG_VIDEO_UMP)
154 #if defined(CONFIG_UMP_VCM_ALLOC)
155 struct vcm_res *vcm_res;
157 vcm_res = (struct vcm_res *)
158 ump_dd_meminfo_get(str_s_id, (void*)VCM_DEV_JPEG);
160 str_base = vcm_res->start;
165 #endif /* CONFIG_UMP_VCM_ALLOC */
169 void jpeg_set_frame_base(unsigned int base)
171 #if defined(CONFIG_S5P_SYSMMU_JPEG) && defined(CONFIG_VIDEO_UMP)
172 #if defined(CONFIG_UMP_VCM_ALLOC)
173 struct vcm_res *vcm_res;
175 vcm_res = (struct vcm_res *)
176 ump_dd_meminfo_get(fra_s_id, (void*)VCM_DEV_JPEG);
178 fra_base = vcm_res->start;
183 #endif /* CONFIG_UMP_VCM_ALLOC */