由于GPU 多媒体解码 camera输入以及overlay显示等操作需要大块的连续物理内存,S5PV210开发板在初始化的过程中,会为这些多媒体相关驱动预留内存,这些预留的物理内存不能再被系统的其他部件使用,因此调整这些预留空间使之既能满足项目的需求,同时把浪费部分最小化,有必要分析每一部分内存需求的计算公式。
在arch/arm/plat-s5p/bootmem.c中,s5p_reserve_bootmem为media设备预留内存
80 void s5p_reserve_bootmem(struct s5p_media_device *mdevs, int nr_mdevs)
81 {
82 struct s5p_media_device *mdev;
83 void *virt_mem;
84 int i;
85
86 media_devs = mdevs;
87 nr_media_devs = nr_mdevs;
88
89 for (i = 0; i < nr_media_devs; i++) {
90 mdev = &media_devs[i];
91 if (mdev->memsize <= 0)
92 continue;
93
94 if (mdev->paddr)
95 virt_mem = __alloc_bootmem(mdev->memsize, PAGE_SIZE,
96 mdev->paddr);
97 else {
98 printk(KERN_INFO "s5pv210: meminfo.back[mdev->bank].start=0x%08lx\n",
99 meminfo.bank[mdev->bank].start);
100 virt_mem = __alloc_bootmem(mdev->memsize, PAGE_SIZE,
101 meminfo.bank[mdev->bank].start);
102 }
103
104 if (virt_mem != NULL) {
105 mdev->paddr = virt_to_phys(virt_mem);
106 } else {
107 mdev->paddr = (dma_addr_t)NULL;
108 printk(KERN_INFO "s5p: Failed to reserve system memory\n");
109 }
110
111 printk(KERN_INFO "s5pv210: %lu bytes system memory reserved "
112 "for %s at 0x%08x\n", (unsigned long) mdev->memsize,
113 mdev->name, mdev->paddr);
114 }
115 }
@mdevs 是在mach-s5pv210.c中定义的
174 #define S5PV210_VIDEO_SAMSUNG_MEMSIZE_FIMC0 (24576 * SZ_1K)
175 #define S5PV210_VIDEO_SAMSUNG_MEMSIZE_FIMC1 (9900 * SZ_1K)
177 #define S5PV210_VIDEO_SAMSUNG_MEMSIZE_FIMC2 (24576 * SZ_1K)
178 #define S5PV210_VIDEO_SAMSUNG_MEMSIZE_MFC0 (36864 * SZ_1K)
179 #define S5PV210_VIDEO_SAMSUNG_MEMSIZE_MFC1 (36864 * SZ_1K)
180 #define S5PV210_VIDEO_SAMSUNG_MEMSIZE_FIMD (S5PV210_LCD_WIDTH * \
181 S5PV210_LCD_HEIGHT * 4 * \
182 CONFIG_FB_S3C_NR_BUFFERS)
183 #define S5PV210_VIDEO_SAMSUNG_MEMSIZE_JPEG (8192 * SZ_1K)
184
185 /* 1920 * 1080 * 4 (RGBA)
186 * - framesize == 1080p : 1920 * 1080 * 2(16bpp) * 2(double buffer) = 8MB
187 * - framesize < 1080p : 1080 * 720 * 4(32bpp) * 2(double buffer) = under 8MB
188 **/
189 #define S5PV210_VIDEO_SAMSUNG_MEMSIZE_G2D (8192 * SZ_1K)
190 #define S5PV210_VIDEO_SAMSUNG_MEMSIZE_TEXSTREAM (3000 * SZ_1K)
191 #define S5PV210_ANDROID_PMEM_MEMSIZE_PMEM_GPU1 (3300 * SZ_1K)
192
193 static struct s5p_media_device smdkc110_media_devs[] = {
194 [0] = {
195 .id = S5P_MDEV_MFC,
196 .name = "mfc",
197 .bank = 0,
198 .memsize = S5PV210_VIDEO_SAMSUNG_MEMSIZE_MFC0,
199 .paddr = 0,
200 },
201 [1] = {
202 .id = S5P_MDEV_MFC,
203 .name = "mfc",
204 .bank = 1,
205 .memsize = S5PV210_VIDEO_SAMSUNG_MEMSIZE_MFC1,
206 .paddr = 0,
207 },
208 [2] = {
209 .id = S5P_MDEV_FIMC0,
210 .name = "fimc0",
211 .bank = 1,
212 .memsize = S5PV210_VIDEO_SAMSUNG_MEMSIZE_FIMC0,
213 .paddr = 0,
214 },
215 [3] = {
216 .id = S5P_MDEV_FIMC1,
217 .name = "fimc1",
218 .bank = 1,
219 .memsize = S5PV210_VIDEO_SAMSUNG_MEMSIZE_FIMC1,
220 .paddr = 0,
221 },
222 [4] = {
223 .id = S5P_MDEV_FIMC2,
224 .name = "fimc2",
225 .bank = 1,
226 .memsize = S5PV210_VIDEO_SAMSUNG_MEMSIZE_FIMC2,
227 .paddr = 0,
228 },
229 [5] = {
230 .id = S5P_MDEV_JPEG,
231 .name = "jpeg",
232 .bank = 0,