blob: d82672ecb563c02fabd478a6f0aed10ed9660fe0 [file] [log] [blame]
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08001/* Copyright (c) 2009-2012, Code Aurora Forum. All rights reserved.
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13
14#include <linux/module.h>
15#include <linux/kernel.h>
16#include <linux/sched.h>
17#include <linux/time.h>
18#include <linux/init.h>
19#include <linux/interrupt.h>
20#include <linux/spinlock.h>
21#include <linux/hrtimer.h>
22#include <linux/clk.h>
23#include <linux/io.h>
24#include <linux/debugfs.h>
25#include <linux/semaphore.h>
26#include <linux/uaccess.h>
27#include <asm/system.h>
28#include <asm/mach-types.h>
29#include <mach/hardware.h>
30#include "mdp.h"
31#include "msm_fb.h"
32#include "mdp4.h"
33
34struct mdp4_statistic mdp4_stat;
35
36unsigned is_mdp4_hw_reset(void)
37{
38 unsigned hw_reset = 0;
39
40 /* Only revisions > v2.1 may be reset or powered off/on at runtime */
41 if (mdp_hw_revision > MDP4_REVISION_V2_1) {
42 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
43 hw_reset = !inpdw(MDP_BASE + 0x003c);
44 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
45 }
46
47 return hw_reset;
48}
49
50void mdp4_sw_reset(ulong bits)
51{
52 /* MDP cmd block enable */
53 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
54
55 bits &= 0x1f; /* 5 bits */
56 outpdw(MDP_BASE + 0x001c, bits); /* MDP_SW_RESET */
57
58 while (inpdw(MDP_BASE + 0x001c) & bits) /* self clear when complete */
59 ;
60 /* MDP cmd block disable */
61 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
62
63 MSM_FB_DEBUG("mdp4_sw_reset: 0x%x\n", (int)bits);
64}
65
66void mdp4_overlay_cfg(int overlayer, int blt_mode, int refresh, int direct_out)
67{
68 ulong bits = 0;
69
70 if (blt_mode)
71 bits |= (1 << 3);
72 refresh &= 0x03; /* 2 bites */
73 bits |= (refresh << 1);
74 direct_out &= 0x01;
75 bits |= direct_out;
76 /* MDP cmd block enable */
77 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
78
79
80 if (overlayer == MDP4_MIXER0)
81 outpdw(MDP_BASE + 0x10004, bits); /* MDP_OVERLAY0_CFG */
Rajesh Sastrulab52368b2011-12-22 12:09:17 -080082 else if (overlayer == MDP4_MIXER1)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070083 outpdw(MDP_BASE + 0x18004, bits); /* MDP_OVERLAY1_CFG */
84
85 MSM_FB_DEBUG("mdp4_overlay_cfg: 0x%x\n",
86 (int)inpdw(MDP_BASE + 0x10004));
87 /* MDP cmd block disable */
88 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
89}
90
91void mdp4_display_intf_sel(int output, ulong intf)
92{
93 ulong bits, mask, data;
94 /* MDP cmd block enable */
95 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
96
97 bits = inpdw(MDP_BASE + 0x0038); /* MDP_DISP_INTF_SEL */
98
99 if (intf == DSI_VIDEO_INTF) {
100 data = 0x40; /* bit 6 */
101 intf = MDDI_LCDC_INTF;
102 if (output == SECONDARY_INTF_SEL) {
103 MSM_FB_INFO("%s: Illegal INTF selected, output=%d \
104 intf=%d\n", __func__, output, (int)intf);
105 }
106 } else if (intf == DSI_CMD_INTF) {
107 data = 0x80; /* bit 7 */
108 intf = MDDI_INTF;
109 if (output == EXTERNAL_INTF_SEL) {
110 MSM_FB_INFO("%s: Illegal INTF selected, output=%d \
111 intf=%d\n", __func__, output, (int)intf);
112 }
113 } else
114 data = 0;
115
116 mask = 0x03; /* 2 bits */
117 intf &= 0x03; /* 2 bits */
118
119 switch (output) {
120 case EXTERNAL_INTF_SEL:
121 intf <<= 4;
122 mask <<= 4;
123 break;
124 case SECONDARY_INTF_SEL:
125 intf &= 0x02; /* only MDDI and EBI2 support */
126 intf <<= 2;
127 mask <<= 2;
128 break;
129 default:
130 break;
131 }
132
133 intf |= data;
134 mask |= data;
135
136 bits &= ~mask;
137 bits |= intf;
138
139 outpdw(MDP_BASE + 0x0038, bits); /* MDP_DISP_INTF_SEL */
140 /* MDP cmd block disable */
141 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
142
143 MSM_FB_DEBUG("mdp4_display_intf_sel: 0x%x\n", (int)inpdw(MDP_BASE + 0x0038));
144}
145
146unsigned long mdp4_display_status(void)
147{
148 ulong status;
149 /* MDP cmd block enable */
150 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
151
152 status = inpdw(MDP_BASE + 0x0018) & 0x3ff; /* MDP_DISPLAY_STATUS */
153
154 /* MDP cmd block disable */
155 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
156 return status;
157}
158
159void mdp4_ebi2_lcd_setup(int lcd, ulong base, int ystride)
160{
161 /* always use memory map */
162 ystride &= 0x01fff; /* 13 bits */
163 /* MDP cmd block enable */
164 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
165
166 if (lcd == EBI2_LCD0) {
167 outpdw(MDP_BASE + 0x0060, base);/* MDP_EBI2_LCD0 */
168 outpdw(MDP_BASE + 0x0068, ystride);/* MDP_EBI2_LCD0_YSTRIDE */
169 } else {
170 outpdw(MDP_BASE + 0x0064, base);/* MDP_EBI2_LCD1 */
171 outpdw(MDP_BASE + 0x006c, ystride);/* MDP_EBI2_LCD1_YSTRIDE */
172 }
173 /* MDP cmd block disable */
174 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
175}
176
177void mdp4_mddi_setup(int mddi, unsigned long id)
178{
179 ulong bits;
180
181 if (mddi == MDDI_EXTERNAL_SET)
182 bits = 0x02;
183 else if (mddi == MDDI_SECONDARY_SET)
184 bits = 0x01;
185 else
186 bits = 0; /* PRIMARY_SET */
187
188 id <<= 16;
189
190 bits |= id;
191 /* MDP cmd block enable */
192 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
193
194 outpdw(MDP_BASE + 0x0090, bits); /* MDP_MDDI_PARAM_WR_SEL */
195 /* MDP cmd block disable */
196 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
197}
198
199int mdp_ppp_blit(struct fb_info *info, struct mdp_blit_req *req)
200{
201
202 /* not implemented yet */
203 return -1;
204}
205
206void mdp4_fetch_cfg(uint32 core_clk)
207{
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700208 uint32 dmap_data, vg_data;
209 char *base;
210 int i;
211 /* MDP cmd block enable */
212 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
213
Adrian Salido-Moreno3436dae2011-08-08 12:13:07 -0700214 if (mdp_rev >= MDP_REV_41 || core_clk >= 90000000) { /* 90 Mhz */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700215 dmap_data = 0x47; /* 16 bytes-burst x 8 req */
216 vg_data = 0x47; /* 16 bytes-burs x 8 req */
217 } else {
218 dmap_data = 0x27; /* 8 bytes-burst x 8 req */
219 vg_data = 0x43; /* 16 bytes-burst x 4 req */
220 }
221
222 MSM_FB_DEBUG("mdp4_fetch_cfg: dmap=%x vg=%x\n",
223 dmap_data, vg_data);
224
225 /* dma_p fetch config */
226 outpdw(MDP_BASE + 0x91004, dmap_data);
227 /* dma_e fetch config */
228 outpdw(MDP_BASE + 0xB1004, dmap_data);
229
230 /*
231 * set up two vg pipes and two rgb pipes
232 */
233 base = MDP_BASE + MDP4_VIDEO_BASE;
234 for (i = 0; i < 4; i++) {
235 outpdw(base + 0x1004, vg_data);
236 base += MDP4_VIDEO_OFF;
237 }
238 /* MDP cmd block disable */
239 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
240}
241
242void mdp4_hw_init(void)
243{
244 ulong bits;
Ravishangar Kalyanam419051b2011-08-31 19:07:53 -0700245 uint32 clk_rate;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700246
247 /* MDP cmd block enable */
248 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
249
Nagamalleswararao Ganji074ee022011-09-02 12:06:37 -0700250 mdp4_update_perf_level(OVERLAY_PERF_LEVEL4);
251
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700252#ifdef MDP4_ERROR
253 /*
254 * Issue software reset on DMA_P will casue DMA_P dma engine stall
255 * on LCDC mode. However DMA_P does not stall at MDDI mode.
256 * This need further investigation.
257 */
258 mdp4_sw_reset(0x17);
259#endif
260
kuogee hsieh4b910f22011-11-15 09:43:04 -0800261 if (mdp_rev > MDP_REV_41) {
262 /* mdp chip select controller */
263 outpdw(MDP_BASE + 0x00c0, CS_CONTROLLER_0);
264 outpdw(MDP_BASE + 0x00c4, CS_CONTROLLER_1);
265 }
266
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700267 mdp4_clear_lcdc();
268
269 mdp4_mixer_blend_init(0);
270 mdp4_mixer_blend_init(1);
271 mdp4_vg_qseed_init(0);
272 mdp4_vg_qseed_init(1);
273
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -0800274 mdp4_vg_csc_setup(0);
275 mdp4_vg_csc_setup(1);
Rajesh Sastrulab52368b2011-12-22 12:09:17 -0800276 mdp4_mixer_csc_setup(1);
277 mdp4_mixer_csc_setup(2);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -0800278 mdp4_dmap_csc_setup();
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700279
Ravishangar Kalyaname7833e22011-07-22 16:20:19 -0700280 if (mdp_rev <= MDP_REV_41) {
281 mdp4_mixer_gc_lut_setup(0);
282 mdp4_mixer_gc_lut_setup(1);
283 }
284
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700285 mdp4_vg_igc_lut_setup(0);
286 mdp4_vg_igc_lut_setup(1);
287
288 mdp4_rgb_igc_lut_setup(0);
289 mdp4_rgb_igc_lut_setup(1);
290
291 outp32(MDP_EBI2_PORTMAP_MODE, 0x3);
292
293 /* system interrupts */
294
295 bits = mdp_intr_mask;
296 outpdw(MDP_BASE + 0x0050, bits);/* enable specififed interrupts */
297
298 /* histogram */
299 MDP_OUTP(MDP_BASE + 0x95010, 1); /* auto clear HIST */
300
301 /* enable histogram interrupts */
302 outpdw(MDP_BASE + 0x9501c, INTR_HIST_DONE);
303
304 /* For the max read pending cmd config below, if the MDP clock */
305 /* is less than the AXI clock, then we must use 3 pending */
306 /* pending requests. Otherwise, we should use 8 pending requests. */
307 /* In the future we should do this detection automatically. */
308
309 /* max read pending cmd config */
310 outpdw(MDP_BASE + 0x004c, 0x02222); /* 3 pending requests */
311
312#ifndef CONFIG_FB_MSM_OVERLAY
313 /* both REFRESH_MODE and DIRECT_OUT are ignored at BLT mode */
314 mdp4_overlay_cfg(MDP4_MIXER0, OVERLAY_MODE_BLT, 0, 0);
315 mdp4_overlay_cfg(MDP4_MIXER1, OVERLAY_MODE_BLT, 0, 0);
316#endif
317
Ravishangar Kalyanam419051b2011-08-31 19:07:53 -0700318 clk_rate = mdp_get_core_clk();
319 mdp4_fetch_cfg(clk_rate);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700320
321 /* Mark hardware as initialized. Only revisions > v2.1 have a register
322 * for tracking core reset status. */
323 if (mdp_hw_revision > MDP4_REVISION_V2_1)
324 outpdw(MDP_BASE + 0x003c, 1);
Ravishangar Kalyanam419051b2011-08-31 19:07:53 -0700325
326 /* MDP cmd block disable */
327 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700328}
329
330
331void mdp4_clear_lcdc(void)
332{
333 uint32 bits;
334
335 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
336
337 bits = inpdw(MDP_BASE + 0xc0000);
338 if (bits & 0x01) { /* enabled already */
339 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
340 return;
341 }
342
343 outpdw(MDP_BASE + 0xc0004, 0); /* vsync ctrl out */
344 outpdw(MDP_BASE + 0xc0008, 0); /* vsync period */
345 outpdw(MDP_BASE + 0xc000c, 0); /* vsync pusle width */
346 outpdw(MDP_BASE + 0xc0010, 0); /* lcdc display HCTL */
347 outpdw(MDP_BASE + 0xc0014, 0); /* lcdc display v start */
348 outpdw(MDP_BASE + 0xc0018, 0); /* lcdc display v end */
349 outpdw(MDP_BASE + 0xc001c, 0); /* lcdc active hctl */
350 outpdw(MDP_BASE + 0xc0020, 0); /* lcdc active v start */
351 outpdw(MDP_BASE + 0xc0024, 0); /* lcdc active v end */
352 outpdw(MDP_BASE + 0xc0028, 0); /* lcdc board color */
353 outpdw(MDP_BASE + 0xc002c, 0); /* lcdc underflow ctrl */
354 outpdw(MDP_BASE + 0xc0030, 0); /* lcdc hsync skew */
355 outpdw(MDP_BASE + 0xc0034, 0); /* lcdc test ctl */
356 outpdw(MDP_BASE + 0xc0038, 0); /* lcdc ctl polarity */
357
358 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
359}
360
361irqreturn_t mdp4_isr(int irq, void *ptr)
362{
363 uint32 isr, mask, panel;
364 struct mdp_dma_data *dma;
365
366 mdp_is_in_isr = TRUE;
367
368 /* complete all the reads before reading the interrupt
369 * status register - eliminate effects of speculative
370 * reads by the cpu
371 */
372 rmb();
373 isr = inpdw(MDP_INTR_STATUS);
374 if (isr == 0)
375 goto out;
376
377 mdp4_stat.intr_tot++;
378 mask = inpdw(MDP_INTR_ENABLE);
379 outpdw(MDP_INTR_CLEAR, isr);
380
381 if (isr & INTR_PRIMARY_INTF_UDERRUN) {
382 mdp4_stat.intr_underrun_p++;
383 /* When underun occurs mdp clear the histogram registers
384 that are set before in hw_init so restore them back so
385 that histogram works.*/
386 MDP_OUTP(MDP_BASE + 0x95010, 1);
387 outpdw(MDP_BASE + 0x9501c, INTR_HIST_DONE);
388 if (mdp_is_hist_start == TRUE) {
389 MDP_OUTP(MDP_BASE + 0x95004,
Ravishangar Kalyanam8fef09a2011-08-09 17:36:23 -0700390 mdp_hist_frame_cnt);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700391 MDP_OUTP(MDP_BASE + 0x95000, 1);
392 }
393 }
394
395 if (isr & INTR_EXTERNAL_INTF_UDERRUN)
396 mdp4_stat.intr_underrun_e++;
397
398 isr &= mask;
399
400 if (isr == 0)
401 goto out;
402
403 panel = mdp4_overlay_panel_list();
404 if (isr & INTR_PRIMARY_VSYNC) {
kuogee hsieh0948c682011-10-31 16:50:43 -0700405 mdp4_stat.intr_vsync_p++;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700406 dma = &dma2_data;
407 spin_lock(&mdp_spin_lock);
408 mdp_intr_mask &= ~INTR_PRIMARY_VSYNC;
409 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
410 dma->waiting = FALSE;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700411 if (panel & MDP4_PANEL_LCDC)
412 mdp4_primary_vsync_lcdc();
413#ifdef CONFIG_FB_MSM_MIPI_DSI
414 else if (panel & MDP4_PANEL_DSI_VIDEO)
415 mdp4_primary_vsync_dsi_video();
416#endif
kuogee hsieh3de11f32011-07-08 14:09:11 -0700417 spin_unlock(&mdp_spin_lock);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700418 }
419#ifdef CONFIG_FB_MSM_DTV
420 if (isr & INTR_EXTERNAL_VSYNC) {
kuogee hsieh0948c682011-10-31 16:50:43 -0700421 mdp4_stat.intr_vsync_e++;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700422 dma = &dma_e_data;
423 spin_lock(&mdp_spin_lock);
424 mdp_intr_mask &= ~INTR_EXTERNAL_VSYNC;
425 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
426 dma->waiting = FALSE;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700427 if (panel & MDP4_PANEL_DTV)
428 mdp4_external_vsync_dtv();
kuogee hsieh3de11f32011-07-08 14:09:11 -0700429 spin_unlock(&mdp_spin_lock);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700430 }
431#endif
kuogee hsieh40a43402011-10-04 08:48:18 -0700432
433#ifdef CONFIG_FB_MSM_OVERLAY
434 if (isr & INTR_OVERLAY0_DONE) {
435 mdp4_stat.intr_overlay0++;
436 dma = &dma2_data;
437 if (panel & (MDP4_PANEL_LCDC | MDP4_PANEL_DSI_VIDEO)) {
438 /* disable LCDC interrupt */
439 spin_lock(&mdp_spin_lock);
440 mdp_intr_mask &= ~INTR_OVERLAY0_DONE;
441 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
442 dma->waiting = FALSE;
443 spin_unlock(&mdp_spin_lock);
444 if (panel & MDP4_PANEL_LCDC)
445 mdp4_overlay0_done_lcdc(dma);
446#ifdef CONFIG_FB_MSM_MIPI_DSI
447 else if (panel & MDP4_PANEL_DSI_VIDEO)
448 mdp4_overlay0_done_dsi_video(dma);
449#endif
450 } else { /* MDDI, DSI_CMD */
451#ifdef CONFIG_FB_MSM_MIPI_DSI
452 if (panel & MDP4_PANEL_DSI_CMD)
453 mdp4_overlay0_done_dsi_cmd(dma);
454#else
455 if (panel & MDP4_PANEL_MDDI)
456 mdp4_overlay0_done_mddi(dma);
457#endif
458 }
459 mdp_hw_cursor_done();
460 }
461 if (isr & INTR_OVERLAY1_DONE) {
462 mdp4_stat.intr_overlay1++;
463 /* disable DTV interrupt */
464 dma = &dma_e_data;
465 spin_lock(&mdp_spin_lock);
466 mdp_intr_mask &= ~INTR_OVERLAY1_DONE;
467 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
468 dma->waiting = FALSE;
469 spin_unlock(&mdp_spin_lock);
470#if defined(CONFIG_FB_MSM_DTV)
471 if (panel & MDP4_PANEL_DTV)
472 mdp4_overlay1_done_dtv();
473#endif
474#if defined(CONFIG_FB_MSM_TVOUT)
475 if (panel & MDP4_PANEL_ATV)
476 mdp4_overlay1_done_atv();
477#endif
Rajesh Sastrulab52368b2011-12-22 12:09:17 -0800478 }
Vinay Kalia27020d12011-10-14 17:50:29 -0700479#if defined(CONFIG_FB_MSM_WRITEBACK_MSM_PANEL)
Rajesh Sastrulab52368b2011-12-22 12:09:17 -0800480 if (isr & INTR_OVERLAY2_DONE) {
481 mdp4_stat.intr_overlay2++;
482 /* disable DTV interrupt */
483 dma = &dma_wb_data;
484 spin_lock(&mdp_spin_lock);
485 mdp_intr_mask &= ~INTR_OVERLAY2_DONE;
486 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
487 dma->waiting = FALSE;
488 spin_unlock(&mdp_spin_lock);
Vinay Kalia27020d12011-10-14 17:50:29 -0700489 if (panel & MDP4_PANEL_WRITEBACK)
490 mdp4_overlay1_done_writeback(dma);
kuogee hsieh40a43402011-10-04 08:48:18 -0700491 }
Rajesh Sastrulab52368b2011-12-22 12:09:17 -0800492#endif
kuogee hsieh40a43402011-10-04 08:48:18 -0700493#endif /* OVERLAY */
494
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700495 if (isr & INTR_DMA_P_DONE) {
496 mdp4_stat.intr_dma_p++;
497 dma = &dma2_data;
498 if (panel & MDP4_PANEL_LCDC) {
499 /* disable LCDC interrupt */
500 spin_lock(&mdp_spin_lock);
501 mdp_intr_mask &= ~INTR_DMA_P_DONE;
502 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
503 dma->waiting = FALSE;
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700504 mdp4_dma_p_done_lcdc();
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700505 spin_unlock(&mdp_spin_lock);
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700506 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700507#ifdef CONFIG_FB_MSM_OVERLAY
508#ifdef CONFIG_FB_MSM_MIPI_DSI
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700509 else if (panel & MDP4_PANEL_DSI_VIDEO) {
510 /* disable LCDC interrupt */
511 spin_lock(&mdp_spin_lock);
512 mdp_intr_mask &= ~INTR_DMA_P_DONE;
513 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
514 dma->waiting = FALSE;
515 mdp4_dma_p_done_dsi_video();
516 spin_unlock(&mdp_spin_lock);
517 } else if (panel & MDP4_PANEL_DSI_CMD) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700518 mdp4_dma_p_done_dsi(dma);
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700519 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700520#else
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700521 else { /* MDDI */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700522 mdp4_dma_p_done_mddi();
523 mdp_pipe_ctrl(MDP_DMA2_BLOCK,
524 MDP_BLOCK_POWER_OFF, TRUE);
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700525 complete(&dma->comp);
526 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700527#endif
528#else
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700529 else {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700530 spin_lock(&mdp_spin_lock);
531 dma->busy = FALSE;
532 spin_unlock(&mdp_spin_lock);
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700533 complete(&dma->comp);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700534 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700535#endif
536 }
537 if (isr & INTR_DMA_S_DONE) {
538 mdp4_stat.intr_dma_s++;
539#if defined(CONFIG_FB_MSM_OVERLAY) && defined(CONFIG_FB_MSM_MDDI)
540 dma = &dma2_data;
541#else
542 dma = &dma_s_data;
543#endif
544
545 dma->busy = FALSE;
546 mdp_pipe_ctrl(MDP_DMA_S_BLOCK,
547 MDP_BLOCK_POWER_OFF, TRUE);
548 complete(&dma->comp);
549 }
550 if (isr & INTR_DMA_E_DONE) {
551 mdp4_stat.intr_dma_e++;
552 dma = &dma_e_data;
553 spin_lock(&mdp_spin_lock);
554 mdp_intr_mask &= ~INTR_DMA_E_DONE;
555 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
556 dma->busy = FALSE;
Huaibin Yang0da46922011-11-29 15:08:04 -0800557 mdp4_dma_e_done_dtv();
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700558 if (dma->waiting) {
559 dma->waiting = FALSE;
560 complete(&dma->comp);
561 }
562 spin_unlock(&mdp_spin_lock);
563 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700564 if (isr & INTR_DMA_P_HISTOGRAM) {
kuogee hsieh0948c682011-10-31 16:50:43 -0700565 mdp4_stat.intr_histogram++;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700566 isr = inpdw(MDP_DMA_P_HIST_INTR_STATUS);
567 mask = inpdw(MDP_DMA_P_HIST_INTR_ENABLE);
568 outpdw(MDP_DMA_P_HIST_INTR_CLEAR, isr);
Ravishangar Kalyanam115d7972011-08-09 12:52:14 -0700569 mb();
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700570 isr &= mask;
Carl Vanderlipe2833e92011-09-27 13:26:01 -0700571 if (isr & INTR_HIST_DONE) {
572 if (waitqueue_active(&(mdp_hist_comp.wait))) {
573 complete(&mdp_hist_comp);
574 } else {
575 if (mdp_is_hist_start == TRUE) {
576 MDP_OUTP(MDP_BASE + 0x95004,
577 mdp_hist_frame_cnt);
578 MDP_OUTP(MDP_BASE + 0x95000, 1);
579 }
580 }
581 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700582 }
583
584out:
585 mdp_is_in_isr = FALSE;
586
587 return IRQ_HANDLED;
588}
589
590
591/*
592 * QSEED tables
593 */
594
595static uint32 vg_qseed_table0[] = {
596 0x5556aaff, 0x00000000, 0x00000000, 0x00000000
597};
598
599static uint32 vg_qseed_table1[] = {
600 0x76543210, 0xfedcba98
601};
602
603static uint32 vg_qseed_table2[] = {
604 0x02000000, 0x00000000, 0x01ff0ff9, 0x00000008,
605 0x01fb0ff2, 0x00000013, 0x01f50fed, 0x0ffe0020,
606 0x01ed0fe8, 0x0ffd002e, 0x01e30fe4, 0x0ffb003e,
607 0x01d80fe1, 0x0ff9004e, 0x01cb0fde, 0x0ff70060,
608 0x01bc0fdc, 0x0ff40074, 0x01ac0fdb, 0x0ff20087,
609 0x019a0fdb, 0x0fef009c, 0x01870fdb, 0x0fed00b1,
610 0x01740fdb, 0x0fea00c7, 0x01600fdc, 0x0fe700dd,
611 0x014b0fdd, 0x0fe500f3, 0x01350fdf, 0x0fe30109,
612 0x01200fe0, 0x0fe00120, 0x01090fe3, 0x0fdf0135,
613 0x00f30fe5, 0x0fdd014b, 0x00dd0fe7, 0x0fdc0160,
614 0x00c70fea, 0x0fdb0174, 0x00b10fed, 0x0fdb0187,
615 0x009c0fef, 0x0fdb019a, 0x00870ff2, 0x0fdb01ac,
616 0x00740ff4, 0x0fdc01bc, 0x00600ff7, 0x0fde01cb,
617 0x004e0ff9, 0x0fe101d8, 0x003e0ffb, 0x0fe401e3,
618 0x002e0ffd, 0x0fe801ed, 0x00200ffe, 0x0fed01f5,
619 0x00130000, 0x0ff201fb, 0x00080000, 0x0ff901ff,
620
621 0x02000000, 0x00000000, 0x02000000, 0x00000000,
622 0x02000000, 0x00000000, 0x02000000, 0x00000000,
623 0x02000000, 0x00000000, 0x02000000, 0x00000000,
624 0x02000000, 0x00000000, 0x02000000, 0x00000000,
625 0x02000000, 0x00000000, 0x02000000, 0x00000000,
626 0x02000000, 0x00000000, 0x02000000, 0x00000000,
627 0x02000000, 0x00000000, 0x02000000, 0x00000000,
628 0x02000000, 0x00000000, 0x02000000, 0x00000000,
629 0x02000000, 0x00000000, 0x02000000, 0x00000000,
630 0x02000000, 0x00000000, 0x02000000, 0x00000000,
631 0x02000000, 0x00000000, 0x02000000, 0x00000000,
632 0x02000000, 0x00000000, 0x02000000, 0x00000000,
633 0x02000000, 0x00000000, 0x02000000, 0x00000000,
634 0x02000000, 0x00000000, 0x02000000, 0x00000000,
635 0x02000000, 0x00000000, 0x02000000, 0x00000000,
636 0x02000000, 0x00000000, 0x02000000, 0x00000000,
637
638 0x02000000, 0x00000000, 0x01fc0ff9, 0x0ffe000d,
639 0x01f60ff3, 0x0ffb001c, 0x01ef0fed, 0x0ff9002b,
640 0x01e60fe8, 0x0ff6003c, 0x01dc0fe4, 0x0ff3004d,
641 0x01d00fe0, 0x0ff1005f, 0x01c30fde, 0x0fee0071,
642 0x01b50fdb, 0x0feb0085, 0x01a70fd9, 0x0fe80098,
643 0x01960fd8, 0x0fe600ac, 0x01850fd7, 0x0fe300c1,
644 0x01730fd7, 0x0fe100d5, 0x01610fd7, 0x0fdf00e9,
645 0x014e0fd8, 0x0fdd00fd, 0x013b0fd8, 0x0fdb0112,
646 0x01250fda, 0x0fda0127, 0x01120fdb, 0x0fd8013b,
647 0x00fd0fdd, 0x0fd8014e, 0x00e90fdf, 0x0fd70161,
648 0x00d50fe1, 0x0fd70173, 0x00c10fe3, 0x0fd70185,
649 0x00ac0fe6, 0x0fd80196, 0x00980fe8, 0x0fd901a7,
650 0x00850feb, 0x0fdb01b5, 0x00710fee, 0x0fde01c3,
651 0x005f0ff1, 0x0fe001d0, 0x004d0ff3, 0x0fe401dc,
652 0x003c0ff6, 0x0fe801e6, 0x002b0ff9, 0x0fed01ef,
653 0x001c0ffb, 0x0ff301f6, 0x000d0ffe, 0x0ff901fc,
654
655 0x020f0034, 0x0f7a0043, 0x01e80023, 0x0fa8004d,
656 0x01d30016, 0x0fbe0059, 0x01c6000a, 0x0fc90067,
657 0x01bd0000, 0x0fce0075, 0x01b50ff7, 0x0fcf0085,
658 0x01ae0fee, 0x0fcf0095, 0x01a70fe6, 0x0fcd00a6,
659 0x019d0fe0, 0x0fcb00b8, 0x01940fd9, 0x0fc900ca,
660 0x01890fd4, 0x0fc700dc, 0x017d0fcf, 0x0fc600ee,
661 0x01700fcc, 0x0fc40100, 0x01620fc9, 0x0fc40111,
662 0x01540fc6, 0x0fc30123, 0x01430fc5, 0x0fc40134,
663 0x01340fc4, 0x0fc50143, 0x01230fc3, 0x0fc60154,
664 0x01110fc4, 0x0fc90162, 0x01000fc4, 0x0fcc0170,
665 0x00ee0fc6, 0x0fcf017d, 0x00dc0fc7, 0x0fd40189,
666 0x00ca0fc9, 0x0fd90194, 0x00b80fcb, 0x0fe0019d,
667 0x00a60fcd, 0x0fe601a7, 0x00950fcf, 0x0fee01ae,
668 0x00850fcf, 0x0ff701b5, 0x00750fce, 0x000001bd,
669 0x00670fc9, 0x000a01c6, 0x00590fbe, 0x001601d3,
670 0x004d0fa8, 0x002301e8, 0x00430f7a, 0x0034020f,
671
672 0x015c005e, 0x0fde0068, 0x015c0054, 0x0fdd0073,
673 0x015b004b, 0x0fdc007e, 0x015a0042, 0x0fdb0089,
674 0x01590039, 0x0fda0094, 0x01560030, 0x0fda00a0,
675 0x01530028, 0x0fda00ab, 0x014f0020, 0x0fda00b7,
676 0x014a0019, 0x0fdb00c2, 0x01450011, 0x0fdc00ce,
677 0x013e000b, 0x0fde00d9, 0x01390004, 0x0fdf00e4,
678 0x01310ffe, 0x0fe200ef, 0x01290ff9, 0x0fe400fa,
679 0x01200ff4, 0x0fe80104, 0x01180fef, 0x0feb010e,
680 0x010e0feb, 0x0fef0118, 0x01040fe8, 0x0ff40120,
681 0x00fa0fe4, 0x0ff90129, 0x00ef0fe2, 0x0ffe0131,
682 0x00e40fdf, 0x00040139, 0x00d90fde, 0x000b013e,
683 0x00ce0fdc, 0x00110145, 0x00c20fdb, 0x0019014a,
684 0x00b70fda, 0x0020014f, 0x00ab0fda, 0x00280153,
685 0x00a00fda, 0x00300156, 0x00940fda, 0x00390159,
686 0x00890fdb, 0x0042015a, 0x007e0fdc, 0x004b015b,
687 0x00730fdd, 0x0054015c, 0x00680fde, 0x005e015c,
688
689 0x01300068, 0x0ff80070, 0x01300060, 0x0ff80078,
690 0x012f0059, 0x0ff80080, 0x012d0052, 0x0ff80089,
691 0x012b004b, 0x0ff90091, 0x01290044, 0x0ff9009a,
692 0x0126003d, 0x0ffa00a3, 0x01220037, 0x0ffb00ac,
693 0x011f0031, 0x0ffc00b4, 0x011a002b, 0x0ffe00bd,
694 0x01150026, 0x000000c5, 0x010f0021, 0x000200ce,
695 0x010a001c, 0x000400d6, 0x01030018, 0x000600df,
696 0x00fd0014, 0x000900e6, 0x00f60010, 0x000c00ee,
697 0x00ee000c, 0x001000f6, 0x00e60009, 0x001400fd,
698 0x00df0006, 0x00180103, 0x00d60004, 0x001c010a,
699 0x00ce0002, 0x0021010f, 0x00c50000, 0x00260115,
700 0x00bd0ffe, 0x002b011a, 0x00b40ffc, 0x0031011f,
701 0x00ac0ffb, 0x00370122, 0x00a30ffa, 0x003d0126,
702 0x009a0ff9, 0x00440129, 0x00910ff9, 0x004b012b,
703 0x00890ff8, 0x0052012d, 0x00800ff8, 0x0059012f,
704 0x00780ff8, 0x00600130, 0x00700ff8, 0x00680130,
705
706 0x01050079, 0x0003007f, 0x01040073, 0x00030086,
707 0x0103006d, 0x0004008c, 0x01030066, 0x00050092,
708 0x01010060, 0x00060099, 0x0100005a, 0x0007009f,
709 0x00fe0054, 0x000900a5, 0x00fa004f, 0x000b00ac,
710 0x00f80049, 0x000d00b2, 0x00f50044, 0x000f00b8,
711 0x00f2003f, 0x001200bd, 0x00ef0039, 0x001500c3,
712 0x00ea0035, 0x001800c9, 0x00e60030, 0x001c00ce,
713 0x00e3002b, 0x001f00d3, 0x00dd0027, 0x002300d9,
714 0x00d90023, 0x002700dd, 0x00d3001f, 0x002b00e3,
715 0x00ce001c, 0x003000e6, 0x00c90018, 0x003500ea,
716 0x00c30015, 0x003900ef, 0x00bd0012, 0x003f00f2,
717 0x00b8000f, 0x004400f5, 0x00b2000d, 0x004900f8,
718 0x00ac000b, 0x004f00fa, 0x00a50009, 0x005400fe,
719 0x009f0007, 0x005a0100, 0x00990006, 0x00600101,
720 0x00920005, 0x00660103, 0x008c0004, 0x006d0103,
721 0x00860003, 0x00730104, 0x007f0003, 0x00790105,
722
723 0x00cf0088, 0x001d008c, 0x00ce0084, 0x0020008e,
724 0x00cd0080, 0x00210092, 0x00cd007b, 0x00240094,
725 0x00ca0077, 0x00270098, 0x00c90073, 0x0029009b,
726 0x00c8006f, 0x002c009d, 0x00c6006b, 0x002f00a0,
727 0x00c50067, 0x003200a2, 0x00c30062, 0x003600a5,
728 0x00c0005f, 0x003900a8, 0x00c0005b, 0x003b00aa,
729 0x00be0057, 0x003e00ad, 0x00ba0054, 0x004200b0,
730 0x00b90050, 0x004500b2, 0x00b7004c, 0x004900b4,
731 0x00b40049, 0x004c00b7, 0x00b20045, 0x005000b9,
732 0x00b00042, 0x005400ba, 0x00ad003e, 0x005700be,
733 0x00aa003b, 0x005b00c0, 0x00a80039, 0x005f00c0,
734 0x00a50036, 0x006200c3, 0x00a20032, 0x006700c5,
735 0x00a0002f, 0x006b00c6, 0x009d002c, 0x006f00c8,
736 0x009b0029, 0x007300c9, 0x00980027, 0x007700ca,
737 0x00940024, 0x007b00cd, 0x00920021, 0x008000cd,
738 0x008e0020, 0x008400ce, 0x008c001d, 0x008800cf,
739
740 0x008e0083, 0x006b0084, 0x008d0083, 0x006c0084,
741 0x008d0082, 0x006d0084, 0x008d0081, 0x006d0085,
742 0x008d0080, 0x006e0085, 0x008c007f, 0x006f0086,
743 0x008b007f, 0x00700086, 0x008b007e, 0x00710086,
744 0x008b007d, 0x00720086, 0x008a007d, 0x00730086,
745 0x008a007c, 0x00730087, 0x008a007b, 0x00740087,
746 0x0089007b, 0x00750087, 0x008a0079, 0x00750088,
747 0x008a0078, 0x00760088, 0x008a0077, 0x00770088,
748 0x00880077, 0x0077008a, 0x00880076, 0x0078008a,
749 0x00880075, 0x0079008a, 0x00870075, 0x007b0089,
750 0x00870074, 0x007b008a, 0x00870073, 0x007c008a,
751 0x00860073, 0x007d008a, 0x00860072, 0x007d008b,
752 0x00860071, 0x007e008b, 0x00860070, 0x007f008b,
753 0x0086006f, 0x007f008c, 0x0085006e, 0x0080008d,
754 0x0085006d, 0x0081008d, 0x0084006d, 0x0082008d,
755 0x0084006c, 0x0083008d, 0x0084006b, 0x0083008e,
756
757 0x023c0fe2, 0x00000fe2, 0x023a0fdb, 0x00000feb,
758 0x02360fd3, 0x0fff0ff8, 0x022e0fcf, 0x0ffc0007,
759 0x02250fca, 0x0ffa0017, 0x021a0fc6, 0x0ff70029,
760 0x020c0fc4, 0x0ff4003c, 0x01fd0fc1, 0x0ff10051,
761 0x01eb0fc0, 0x0fed0068, 0x01d80fc0, 0x0fe9007f,
762 0x01c30fc1, 0x0fe50097, 0x01ac0fc2, 0x0fe200b0,
763 0x01960fc3, 0x0fdd00ca, 0x017e0fc5, 0x0fd900e4,
764 0x01650fc8, 0x0fd500fe, 0x014b0fcb, 0x0fd20118,
765 0x01330fcd, 0x0fcd0133, 0x01180fd2, 0x0fcb014b,
766 0x00fe0fd5, 0x0fc80165, 0x00e40fd9, 0x0fc5017e,
767 0x00ca0fdd, 0x0fc30196, 0x00b00fe2, 0x0fc201ac,
768 0x00970fe5, 0x0fc101c3, 0x007f0fe9, 0x0fc001d8,
769 0x00680fed, 0x0fc001eb, 0x00510ff1, 0x0fc101fd,
770 0x003c0ff4, 0x0fc4020c, 0x00290ff7, 0x0fc6021a,
771 0x00170ffa, 0x0fca0225, 0x00070ffc, 0x0fcf022e,
772 0x0ff80fff, 0x0fd30236, 0x0feb0000, 0x0fdb023a,
773
774 0x02780fc4, 0x00000fc4, 0x02770fbc, 0x0fff0fce,
775 0x02710fb5, 0x0ffe0fdc, 0x02690fb0, 0x0ffa0fed,
776 0x025f0fab, 0x0ff70fff, 0x02500fa8, 0x0ff30015,
777 0x02410fa6, 0x0fef002a, 0x022f0fa4, 0x0feb0042,
778 0x021a0fa4, 0x0fe5005d, 0x02040fa5, 0x0fe10076,
779 0x01eb0fa7, 0x0fdb0093, 0x01d20fa9, 0x0fd600af,
780 0x01b80fab, 0x0fd000cd, 0x019d0faf, 0x0fca00ea,
781 0x01810fb2, 0x0fc50108, 0x01620fb7, 0x0fc10126,
782 0x01440fbb, 0x0fbb0146, 0x01260fc1, 0x0fb70162,
783 0x01080fc5, 0x0fb20181, 0x00ea0fca, 0x0faf019d,
784 0x00cd0fd0, 0x0fab01b8, 0x00af0fd6, 0x0fa901d2,
785 0x00930fdb, 0x0fa701eb, 0x00760fe1, 0x0fa50204,
786 0x005d0fe5, 0x0fa4021a, 0x00420feb, 0x0fa4022f,
787 0x002a0fef, 0x0fa60241, 0x00150ff3, 0x0fa80250,
788 0x0fff0ff7, 0x0fab025f, 0x0fed0ffa, 0x0fb00269,
789 0x0fdc0ffe, 0x0fb50271, 0x0fce0fff, 0x0fbc0277,
790
791 0x02a00fb0, 0x00000fb0, 0x029e0fa8, 0x0fff0fbb,
792 0x02980fa1, 0x0ffd0fca, 0x028f0f9c, 0x0ff90fdc,
793 0x02840f97, 0x0ff50ff0, 0x02740f94, 0x0ff10007,
794 0x02640f92, 0x0fec001e, 0x02500f91, 0x0fe70038,
795 0x023a0f91, 0x0fe00055, 0x02220f92, 0x0fdb0071,
796 0x02080f95, 0x0fd4008f, 0x01ec0f98, 0x0fce00ae,
797 0x01cf0f9b, 0x0fc700cf, 0x01b10f9f, 0x0fc100ef,
798 0x01920fa4, 0x0fbb010f, 0x01710faa, 0x0fb50130,
799 0x01520fae, 0x0fae0152, 0x01300fb5, 0x0faa0171,
800 0x010f0fbb, 0x0fa40192, 0x00ef0fc1, 0x0f9f01b1,
801 0x00cf0fc7, 0x0f9b01cf, 0x00ae0fce, 0x0f9801ec,
802 0x008f0fd4, 0x0f950208, 0x00710fdb, 0x0f920222,
803 0x00550fe0, 0x0f91023a, 0x00380fe7, 0x0f910250,
804 0x001e0fec, 0x0f920264, 0x00070ff1, 0x0f940274,
805 0x0ff00ff5, 0x0f970284, 0x0fdc0ff9, 0x0f9c028f,
806 0x0fca0ffd, 0x0fa10298, 0x0fbb0fff, 0x0fa8029e,
807
808 0x02c80f9c, 0x00000f9c, 0x02c70f94, 0x0ffe0fa7,
809 0x02c10f8c, 0x0ffc0fb7, 0x02b70f87, 0x0ff70fcb,
810 0x02aa0f83, 0x0ff30fe0, 0x02990f80, 0x0fee0ff9,
811 0x02870f7f, 0x0fe80012, 0x02720f7e, 0x0fe2002e,
812 0x025a0f7e, 0x0fdb004d, 0x02400f80, 0x0fd5006b,
813 0x02230f84, 0x0fcd008c, 0x02050f87, 0x0fc700ad,
814 0x01e60f8b, 0x0fbf00d0, 0x01c60f90, 0x0fb700f3,
815 0x01a30f96, 0x0fb00117, 0x01800f9c, 0x0faa013a,
816 0x015d0fa2, 0x0fa2015f, 0x013a0faa, 0x0f9c0180,
817 0x01170fb0, 0x0f9601a3, 0x00f30fb7, 0x0f9001c6,
818 0x00d00fbf, 0x0f8b01e6, 0x00ad0fc7, 0x0f870205,
819 0x008c0fcd, 0x0f840223, 0x006b0fd5, 0x0f800240,
820 0x004d0fdb, 0x0f7e025a, 0x002e0fe2, 0x0f7e0272,
821 0x00120fe8, 0x0f7f0287, 0x0ff90fee, 0x0f800299,
822 0x0fe00ff3, 0x0f8302aa, 0x0fcb0ff7, 0x0f8702b7,
823 0x0fb70ffc, 0x0f8c02c1, 0x0fa70ffe, 0x0f9402c7,
824
825 0x02f00f88, 0x00000f88, 0x02ee0f80, 0x0ffe0f94,
826 0x02e70f78, 0x0ffc0fa5, 0x02dd0f73, 0x0ff60fba,
827 0x02ce0f6f, 0x0ff20fd1, 0x02be0f6c, 0x0feb0feb,
828 0x02aa0f6b, 0x0fe50006, 0x02940f6a, 0x0fde0024,
829 0x02790f6c, 0x0fd60045, 0x025e0f6e, 0x0fcf0065,
830 0x023f0f72, 0x0fc60089, 0x021d0f77, 0x0fbf00ad,
831 0x01fd0f7b, 0x0fb600d2, 0x01da0f81, 0x0fad00f8,
832 0x01b50f87, 0x0fa6011e, 0x018f0f8f, 0x0f9e0144,
833 0x016b0f95, 0x0f95016b, 0x01440f9e, 0x0f8f018f,
834 0x011e0fa6, 0x0f8701b5, 0x00f80fad, 0x0f8101da,
835 0x00d20fb6, 0x0f7b01fd, 0x00ad0fbf, 0x0f77021d,
836 0x00890fc6, 0x0f72023f, 0x00650fcf, 0x0f6e025e,
837 0x00450fd6, 0x0f6c0279, 0x00240fde, 0x0f6a0294,
838 0x00060fe5, 0x0f6b02aa, 0x0feb0feb, 0x0f6c02be,
839 0x0fd10ff2, 0x0f6f02ce, 0x0fba0ff6, 0x0f7302dd,
840 0x0fa50ffc, 0x0f7802e7, 0x0f940ffe, 0x0f8002ee,
841
842 0x03180f74, 0x00000f74, 0x03160f6b, 0x0ffe0f81,
843 0x030e0f64, 0x0ffb0f93, 0x03030f5f, 0x0ff50fa9,
844 0x02f40f5b, 0x0ff00fc1, 0x02e20f58, 0x0fe90fdd,
845 0x02cd0f57, 0x0fe20ffa, 0x02b60f57, 0x0fda0019,
846 0x02990f59, 0x0fd1003d, 0x027b0f5c, 0x0fc90060,
847 0x02590f61, 0x0fc00086, 0x02370f66, 0x0fb700ac,
848 0x02130f6b, 0x0fae00d4, 0x01ee0f72, 0x0fa400fc,
849 0x01c70f79, 0x0f9b0125, 0x019f0f81, 0x0f93014d,
850 0x01760f89, 0x0f890178, 0x014d0f93, 0x0f81019f,
851 0x01250f9b, 0x0f7901c7, 0x00fc0fa4, 0x0f7201ee,
852 0x00d40fae, 0x0f6b0213, 0x00ac0fb7, 0x0f660237,
853 0x00860fc0, 0x0f610259, 0x00600fc9, 0x0f5c027b,
854 0x003d0fd1, 0x0f590299, 0x00190fda, 0x0f5702b6,
855 0x0ffa0fe2, 0x0f5702cd, 0x0fdd0fe9, 0x0f5802e2,
856 0x0fc10ff0, 0x0f5b02f4, 0x0fa90ff5, 0x0f5f0303,
857 0x0f930ffb, 0x0f64030e, 0x0f810ffe, 0x0f6b0316,
858
859 0x03400f60, 0x00000f60, 0x033e0f57, 0x0ffe0f6d,
860 0x03370f4f, 0x0ffa0f80, 0x032a0f4b, 0x0ff30f98,
861 0x031a0f46, 0x0fee0fb2, 0x03070f44, 0x0fe60fcf,
862 0x02f10f44, 0x0fde0fed, 0x02d70f44, 0x0fd6000f,
863 0x02b80f46, 0x0fcc0036, 0x02990f4a, 0x0fc3005a,
864 0x02750f4f, 0x0fb90083, 0x02500f55, 0x0fb000ab,
865 0x022a0f5b, 0x0fa500d6, 0x02020f63, 0x0f9a0101,
866 0x01d80f6b, 0x0f91012c, 0x01ae0f74, 0x0f870157,
867 0x01840f7c, 0x0f7c0184, 0x01570f87, 0x0f7401ae,
868 0x012c0f91, 0x0f6b01d8, 0x01010f9a, 0x0f630202,
869 0x00d60fa5, 0x0f5b022a, 0x00ab0fb0, 0x0f550250,
870 0x00830fb9, 0x0f4f0275, 0x005a0fc3, 0x0f4a0299,
871 0x00360fcc, 0x0f4602b8, 0x000f0fd6, 0x0f4402d7,
872 0x0fed0fde, 0x0f4402f1, 0x0fcf0fe6, 0x0f440307,
873 0x0fb20fee, 0x0f46031a, 0x0f980ff3, 0x0f4b032a,
874 0x0f800ffa, 0x0f4f0337, 0x0f6d0ffe, 0x0f57033e,
875
876 0x02000000, 0x00000000, 0x01ff0ff9, 0x00000008,
877 0x01fb0ff2, 0x00000013, 0x01f50fed, 0x0ffe0020,
878 0x01ed0fe8, 0x0ffd002e, 0x01e30fe4, 0x0ffb003e,
879 0x01d80fe1, 0x0ff9004e, 0x01cb0fde, 0x0ff70060,
880 0x01bc0fdc, 0x0ff40074, 0x01ac0fdb, 0x0ff20087,
881 0x019a0fdb, 0x0fef009c, 0x01870fdb, 0x0fed00b1,
882 0x01740fdb, 0x0fea00c7, 0x01600fdc, 0x0fe700dd,
883 0x014b0fdd, 0x0fe500f3, 0x01350fdf, 0x0fe30109,
884 0x01200fe0, 0x0fe00120, 0x01090fe3, 0x0fdf0135,
885 0x00f30fe5, 0x0fdd014b, 0x00dd0fe7, 0x0fdc0160,
886 0x00c70fea, 0x0fdb0174, 0x00b10fed, 0x0fdb0187,
887 0x009c0fef, 0x0fdb019a, 0x00870ff2, 0x0fdb01ac,
888 0x00740ff4, 0x0fdc01bc, 0x00600ff7, 0x0fde01cb,
889 0x004e0ff9, 0x0fe101d8, 0x003e0ffb, 0x0fe401e3,
890 0x002e0ffd, 0x0fe801ed, 0x00200ffe, 0x0fed01f5,
891 0x00130000, 0x0ff201fb, 0x00080000, 0x0ff901ff,
892
893 0x02000000, 0x00000000, 0x02000000, 0x00000000,
894 0x02000000, 0x00000000, 0x02000000, 0x00000000,
895 0x02000000, 0x00000000, 0x02000000, 0x00000000,
896 0x02000000, 0x00000000, 0x02000000, 0x00000000,
897 0x02000000, 0x00000000, 0x02000000, 0x00000000,
898 0x02000000, 0x00000000, 0x02000000, 0x00000000,
899 0x02000000, 0x00000000, 0x02000000, 0x00000000,
900 0x02000000, 0x00000000, 0x02000000, 0x00000000,
901 0x02000000, 0x00000000, 0x02000000, 0x00000000,
902 0x02000000, 0x00000000, 0x02000000, 0x00000000,
903 0x02000000, 0x00000000, 0x02000000, 0x00000000,
904 0x02000000, 0x00000000, 0x02000000, 0x00000000,
905 0x02000000, 0x00000000, 0x02000000, 0x00000000,
906 0x02000000, 0x00000000, 0x02000000, 0x00000000,
907 0x02000000, 0x00000000, 0x02000000, 0x00000000,
908 0x02000000, 0x00000000, 0x02000000, 0x00000000,
909
910 0x02000000, 0x00000000, 0x01fc0ff9, 0x0ffe000d,
911 0x01f60ff3, 0x0ffb001c, 0x01ef0fed, 0x0ff9002b,
912 0x01e60fe8, 0x0ff6003c, 0x01dc0fe4, 0x0ff3004d,
913 0x01d00fe0, 0x0ff1005f, 0x01c30fde, 0x0fee0071,
914 0x01b50fdb, 0x0feb0085, 0x01a70fd9, 0x0fe80098,
915 0x01960fd8, 0x0fe600ac, 0x01850fd7, 0x0fe300c1,
916 0x01730fd7, 0x0fe100d5, 0x01610fd7, 0x0fdf00e9,
917 0x014e0fd8, 0x0fdd00fd, 0x013b0fd8, 0x0fdb0112,
918 0x01250fda, 0x0fda0127, 0x01120fdb, 0x0fd8013b,
919 0x00fd0fdd, 0x0fd8014e, 0x00e90fdf, 0x0fd70161,
920 0x00d50fe1, 0x0fd70173, 0x00c10fe3, 0x0fd70185,
921 0x00ac0fe6, 0x0fd80196, 0x00980fe8, 0x0fd901a7,
922 0x00850feb, 0x0fdb01b5, 0x00710fee, 0x0fde01c3,
923 0x005f0ff1, 0x0fe001d0, 0x004d0ff3, 0x0fe401dc,
924 0x003c0ff6, 0x0fe801e6, 0x002b0ff9, 0x0fed01ef,
925 0x001c0ffb, 0x0ff301f6, 0x000d0ffe, 0x0ff901fc,
926
927 0x020f0034, 0x0f7a0043, 0x01e80023, 0x0fa8004d,
928 0x01d30016, 0x0fbe0059, 0x01c6000a, 0x0fc90067,
929 0x01bd0000, 0x0fce0075, 0x01b50ff7, 0x0fcf0085,
930 0x01ae0fee, 0x0fcf0095, 0x01a70fe6, 0x0fcd00a6,
931 0x019d0fe0, 0x0fcb00b8, 0x01940fd9, 0x0fc900ca,
932 0x01890fd4, 0x0fc700dc, 0x017d0fcf, 0x0fc600ee,
933 0x01700fcc, 0x0fc40100, 0x01620fc9, 0x0fc40111,
934 0x01540fc6, 0x0fc30123, 0x01430fc5, 0x0fc40134,
935 0x01340fc4, 0x0fc50143, 0x01230fc3, 0x0fc60154,
936 0x01110fc4, 0x0fc90162, 0x01000fc4, 0x0fcc0170,
937 0x00ee0fc6, 0x0fcf017d, 0x00dc0fc7, 0x0fd40189,
938 0x00ca0fc9, 0x0fd90194, 0x00b80fcb, 0x0fe0019d,
939 0x00a60fcd, 0x0fe601a7, 0x00950fcf, 0x0fee01ae,
940 0x00850fcf, 0x0ff701b5, 0x00750fce, 0x000001bd,
941 0x00670fc9, 0x000a01c6, 0x00590fbe, 0x001601d3,
942 0x004d0fa8, 0x002301e8, 0x00430f7a, 0x0034020f,
943
944 0x015c005e, 0x0fde0068, 0x015c0054, 0x0fdd0073,
945 0x015b004b, 0x0fdc007e, 0x015a0042, 0x0fdb0089,
946 0x01590039, 0x0fda0094, 0x01560030, 0x0fda00a0,
947 0x01530028, 0x0fda00ab, 0x014f0020, 0x0fda00b7,
948 0x014a0019, 0x0fdb00c2, 0x01450011, 0x0fdc00ce,
949 0x013e000b, 0x0fde00d9, 0x01390004, 0x0fdf00e4,
950 0x01310ffe, 0x0fe200ef, 0x01290ff9, 0x0fe400fa,
951 0x01200ff4, 0x0fe80104, 0x01180fef, 0x0feb010e,
952 0x010e0feb, 0x0fef0118, 0x01040fe8, 0x0ff40120,
953 0x00fa0fe4, 0x0ff90129, 0x00ef0fe2, 0x0ffe0131,
954 0x00e40fdf, 0x00040139, 0x00d90fde, 0x000b013e,
955 0x00ce0fdc, 0x00110145, 0x00c20fdb, 0x0019014a,
956 0x00b70fda, 0x0020014f, 0x00ab0fda, 0x00280153,
957 0x00a00fda, 0x00300156, 0x00940fda, 0x00390159,
958 0x00890fdb, 0x0042015a, 0x007e0fdc, 0x004b015b,
959 0x00730fdd, 0x0054015c, 0x00680fde, 0x005e015c,
960
961 0x01300068, 0x0ff80070, 0x01300060, 0x0ff80078,
962 0x012f0059, 0x0ff80080, 0x012d0052, 0x0ff80089,
963 0x012b004b, 0x0ff90091, 0x01290044, 0x0ff9009a,
964 0x0126003d, 0x0ffa00a3, 0x01220037, 0x0ffb00ac,
965 0x011f0031, 0x0ffc00b4, 0x011a002b, 0x0ffe00bd,
966 0x01150026, 0x000000c5, 0x010f0021, 0x000200ce,
967 0x010a001c, 0x000400d6, 0x01030018, 0x000600df,
968 0x00fd0014, 0x000900e6, 0x00f60010, 0x000c00ee,
969 0x00ee000c, 0x001000f6, 0x00e60009, 0x001400fd,
970 0x00df0006, 0x00180103, 0x00d60004, 0x001c010a,
971 0x00ce0002, 0x0021010f, 0x00c50000, 0x00260115,
972 0x00bd0ffe, 0x002b011a, 0x00b40ffc, 0x0031011f,
973 0x00ac0ffb, 0x00370122, 0x00a30ffa, 0x003d0126,
974 0x009a0ff9, 0x00440129, 0x00910ff9, 0x004b012b,
975 0x00890ff8, 0x0052012d, 0x00800ff8, 0x0059012f,
976 0x00780ff8, 0x00600130, 0x00700ff8, 0x00680130,
977
978 0x01050079, 0x0003007f, 0x01040073, 0x00030086,
979 0x0103006d, 0x0004008c, 0x01030066, 0x00050092,
980 0x01010060, 0x00060099, 0x0100005a, 0x0007009f,
981 0x00fe0054, 0x000900a5, 0x00fa004f, 0x000b00ac,
982 0x00f80049, 0x000d00b2, 0x00f50044, 0x000f00b8,
983 0x00f2003f, 0x001200bd, 0x00ef0039, 0x001500c3,
984 0x00ea0035, 0x001800c9, 0x00e60030, 0x001c00ce,
985 0x00e3002b, 0x001f00d3, 0x00dd0027, 0x002300d9,
986 0x00d90023, 0x002700dd, 0x00d3001f, 0x002b00e3,
987 0x00ce001c, 0x003000e6, 0x00c90018, 0x003500ea,
988 0x00c30015, 0x003900ef, 0x00bd0012, 0x003f00f2,
989 0x00b8000f, 0x004400f5, 0x00b2000d, 0x004900f8,
990 0x00ac000b, 0x004f00fa, 0x00a50009, 0x005400fe,
991 0x009f0007, 0x005a0100, 0x00990006, 0x00600101,
992 0x00920005, 0x00660103, 0x008c0004, 0x006d0103,
993 0x00860003, 0x00730104, 0x007f0003, 0x00790105,
994
995 0x00cf0088, 0x001d008c, 0x00ce0084, 0x0020008e,
996 0x00cd0080, 0x00210092, 0x00cd007b, 0x00240094,
997 0x00ca0077, 0x00270098, 0x00c90073, 0x0029009b,
998 0x00c8006f, 0x002c009d, 0x00c6006b, 0x002f00a0,
999 0x00c50067, 0x003200a2, 0x00c30062, 0x003600a5,
1000 0x00c0005f, 0x003900a8, 0x00c0005b, 0x003b00aa,
1001 0x00be0057, 0x003e00ad, 0x00ba0054, 0x004200b0,
1002 0x00b90050, 0x004500b2, 0x00b7004c, 0x004900b4,
1003 0x00b40049, 0x004c00b7, 0x00b20045, 0x005000b9,
1004 0x00b00042, 0x005400ba, 0x00ad003e, 0x005700be,
1005 0x00aa003b, 0x005b00c0, 0x00a80039, 0x005f00c0,
1006 0x00a50036, 0x006200c3, 0x00a20032, 0x006700c5,
1007 0x00a0002f, 0x006b00c6, 0x009d002c, 0x006f00c8,
1008 0x009b0029, 0x007300c9, 0x00980027, 0x007700ca,
1009 0x00940024, 0x007b00cd, 0x00920021, 0x008000cd,
1010 0x008e0020, 0x008400ce, 0x008c001d, 0x008800cf,
1011
1012 0x008e0083, 0x006b0084, 0x008d0083, 0x006c0084,
1013 0x008d0082, 0x006d0084, 0x008d0081, 0x006d0085,
1014 0x008d0080, 0x006e0085, 0x008c007f, 0x006f0086,
1015 0x008b007f, 0x00700086, 0x008b007e, 0x00710086,
1016 0x008b007d, 0x00720086, 0x008a007d, 0x00730086,
1017 0x008a007c, 0x00730087, 0x008a007b, 0x00740087,
1018 0x0089007b, 0x00750087, 0x008a0079, 0x00750088,
1019 0x008a0078, 0x00760088, 0x008a0077, 0x00770088,
1020 0x00880077, 0x0077008a, 0x00880076, 0x0078008a,
1021 0x00880075, 0x0079008a, 0x00870075, 0x007b0089,
1022 0x00870074, 0x007b008a, 0x00870073, 0x007c008a,
1023 0x00860073, 0x007d008a, 0x00860072, 0x007d008b,
1024 0x00860071, 0x007e008b, 0x00860070, 0x007f008b,
1025 0x0086006f, 0x007f008c, 0x0085006e, 0x0080008d,
1026 0x0085006d, 0x0081008d, 0x0084006d, 0x0082008d,
1027 0x0084006c, 0x0083008d, 0x0084006b, 0x0083008e,
1028
1029 0x023c0fe2, 0x00000fe2, 0x023a0fdb, 0x00000feb,
1030 0x02360fd3, 0x0fff0ff8, 0x022e0fcf, 0x0ffc0007,
1031 0x02250fca, 0x0ffa0017, 0x021a0fc6, 0x0ff70029,
1032 0x020c0fc4, 0x0ff4003c, 0x01fd0fc1, 0x0ff10051,
1033 0x01eb0fc0, 0x0fed0068, 0x01d80fc0, 0x0fe9007f,
1034 0x01c30fc1, 0x0fe50097, 0x01ac0fc2, 0x0fe200b0,
1035 0x01960fc3, 0x0fdd00ca, 0x017e0fc5, 0x0fd900e4,
1036 0x01650fc8, 0x0fd500fe, 0x014b0fcb, 0x0fd20118,
1037 0x01330fcd, 0x0fcd0133, 0x01180fd2, 0x0fcb014b,
1038 0x00fe0fd5, 0x0fc80165, 0x00e40fd9, 0x0fc5017e,
1039 0x00ca0fdd, 0x0fc30196, 0x00b00fe2, 0x0fc201ac,
1040 0x00970fe5, 0x0fc101c3, 0x007f0fe9, 0x0fc001d8,
1041 0x00680fed, 0x0fc001eb, 0x00510ff1, 0x0fc101fd,
1042 0x003c0ff4, 0x0fc4020c, 0x00290ff7, 0x0fc6021a,
1043 0x00170ffa, 0x0fca0225, 0x00070ffc, 0x0fcf022e,
1044 0x0ff80fff, 0x0fd30236, 0x0feb0000, 0x0fdb023a,
1045
1046 0x02780fc4, 0x00000fc4, 0x02770fbc, 0x0fff0fce,
1047 0x02710fb5, 0x0ffe0fdc, 0x02690fb0, 0x0ffa0fed,
1048 0x025f0fab, 0x0ff70fff, 0x02500fa8, 0x0ff30015,
1049 0x02410fa6, 0x0fef002a, 0x022f0fa4, 0x0feb0042,
1050 0x021a0fa4, 0x0fe5005d, 0x02040fa5, 0x0fe10076,
1051 0x01eb0fa7, 0x0fdb0093, 0x01d20fa9, 0x0fd600af,
1052 0x01b80fab, 0x0fd000cd, 0x019d0faf, 0x0fca00ea,
1053 0x01810fb2, 0x0fc50108, 0x01620fb7, 0x0fc10126,
1054 0x01440fbb, 0x0fbb0146, 0x01260fc1, 0x0fb70162,
1055 0x01080fc5, 0x0fb20181, 0x00ea0fca, 0x0faf019d,
1056 0x00cd0fd0, 0x0fab01b8, 0x00af0fd6, 0x0fa901d2,
1057 0x00930fdb, 0x0fa701eb, 0x00760fe1, 0x0fa50204,
1058 0x005d0fe5, 0x0fa4021a, 0x00420feb, 0x0fa4022f,
1059 0x002a0fef, 0x0fa60241, 0x00150ff3, 0x0fa80250,
1060 0x0fff0ff7, 0x0fab025f, 0x0fed0ffa, 0x0fb00269,
1061 0x0fdc0ffe, 0x0fb50271, 0x0fce0fff, 0x0fbc0277,
1062
1063 0x02a00fb0, 0x00000fb0, 0x029e0fa8, 0x0fff0fbb,
1064 0x02980fa1, 0x0ffd0fca, 0x028f0f9c, 0x0ff90fdc,
1065 0x02840f97, 0x0ff50ff0, 0x02740f94, 0x0ff10007,
1066 0x02640f92, 0x0fec001e, 0x02500f91, 0x0fe70038,
1067 0x023a0f91, 0x0fe00055, 0x02220f92, 0x0fdb0071,
1068 0x02080f95, 0x0fd4008f, 0x01ec0f98, 0x0fce00ae,
1069 0x01cf0f9b, 0x0fc700cf, 0x01b10f9f, 0x0fc100ef,
1070 0x01920fa4, 0x0fbb010f, 0x01710faa, 0x0fb50130,
1071 0x01520fae, 0x0fae0152, 0x01300fb5, 0x0faa0171,
1072 0x010f0fbb, 0x0fa40192, 0x00ef0fc1, 0x0f9f01b1,
1073 0x00cf0fc7, 0x0f9b01cf, 0x00ae0fce, 0x0f9801ec,
1074 0x008f0fd4, 0x0f950208, 0x00710fdb, 0x0f920222,
1075 0x00550fe0, 0x0f91023a, 0x00380fe7, 0x0f910250,
1076 0x001e0fec, 0x0f920264, 0x00070ff1, 0x0f940274,
1077 0x0ff00ff5, 0x0f970284, 0x0fdc0ff9, 0x0f9c028f,
1078 0x0fca0ffd, 0x0fa10298, 0x0fbb0fff, 0x0fa8029e,
1079
1080 0x02c80f9c, 0x00000f9c, 0x02c70f94, 0x0ffe0fa7,
1081 0x02c10f8c, 0x0ffc0fb7, 0x02b70f87, 0x0ff70fcb,
1082 0x02aa0f83, 0x0ff30fe0, 0x02990f80, 0x0fee0ff9,
1083 0x02870f7f, 0x0fe80012, 0x02720f7e, 0x0fe2002e,
1084 0x025a0f7e, 0x0fdb004d, 0x02400f80, 0x0fd5006b,
1085 0x02230f84, 0x0fcd008c, 0x02050f87, 0x0fc700ad,
1086 0x01e60f8b, 0x0fbf00d0, 0x01c60f90, 0x0fb700f3,
1087 0x01a30f96, 0x0fb00117, 0x01800f9c, 0x0faa013a,
1088 0x015d0fa2, 0x0fa2015f, 0x013a0faa, 0x0f9c0180,
1089 0x01170fb0, 0x0f9601a3, 0x00f30fb7, 0x0f9001c6,
1090 0x00d00fbf, 0x0f8b01e6, 0x00ad0fc7, 0x0f870205,
1091 0x008c0fcd, 0x0f840223, 0x006b0fd5, 0x0f800240,
1092 0x004d0fdb, 0x0f7e025a, 0x002e0fe2, 0x0f7e0272,
1093 0x00120fe8, 0x0f7f0287, 0x0ff90fee, 0x0f800299,
1094 0x0fe00ff3, 0x0f8302aa, 0x0fcb0ff7, 0x0f8702b7,
1095 0x0fb70ffc, 0x0f8c02c1, 0x0fa70ffe, 0x0f9402c7,
1096
1097 0x02f00f88, 0x00000f88, 0x02ee0f80, 0x0ffe0f94,
1098 0x02e70f78, 0x0ffc0fa5, 0x02dd0f73, 0x0ff60fba,
1099 0x02ce0f6f, 0x0ff20fd1, 0x02be0f6c, 0x0feb0feb,
1100 0x02aa0f6b, 0x0fe50006, 0x02940f6a, 0x0fde0024,
1101 0x02790f6c, 0x0fd60045, 0x025e0f6e, 0x0fcf0065,
1102 0x023f0f72, 0x0fc60089, 0x021d0f77, 0x0fbf00ad,
1103 0x01fd0f7b, 0x0fb600d2, 0x01da0f81, 0x0fad00f8,
1104 0x01b50f87, 0x0fa6011e, 0x018f0f8f, 0x0f9e0144,
1105 0x016b0f95, 0x0f95016b, 0x01440f9e, 0x0f8f018f,
1106 0x011e0fa6, 0x0f8701b5, 0x00f80fad, 0x0f8101da,
1107 0x00d20fb6, 0x0f7b01fd, 0x00ad0fbf, 0x0f77021d,
1108 0x00890fc6, 0x0f72023f, 0x00650fcf, 0x0f6e025e,
1109 0x00450fd6, 0x0f6c0279, 0x00240fde, 0x0f6a0294,
1110 0x00060fe5, 0x0f6b02aa, 0x0feb0feb, 0x0f6c02be,
1111 0x0fd10ff2, 0x0f6f02ce, 0x0fba0ff6, 0x0f7302dd,
1112 0x0fa50ffc, 0x0f7802e7, 0x0f940ffe, 0x0f8002ee,
1113
1114 0x03180f74, 0x00000f74, 0x03160f6b, 0x0ffe0f81,
1115 0x030e0f64, 0x0ffb0f93, 0x03030f5f, 0x0ff50fa9,
1116 0x02f40f5b, 0x0ff00fc1, 0x02e20f58, 0x0fe90fdd,
1117 0x02cd0f57, 0x0fe20ffa, 0x02b60f57, 0x0fda0019,
1118 0x02990f59, 0x0fd1003d, 0x027b0f5c, 0x0fc90060,
1119 0x02590f61, 0x0fc00086, 0x02370f66, 0x0fb700ac,
1120 0x02130f6b, 0x0fae00d4, 0x01ee0f72, 0x0fa400fc,
1121 0x01c70f79, 0x0f9b0125, 0x019f0f81, 0x0f93014d,
1122 0x01760f89, 0x0f890178, 0x014d0f93, 0x0f81019f,
1123 0x01250f9b, 0x0f7901c7, 0x00fc0fa4, 0x0f7201ee,
1124 0x00d40fae, 0x0f6b0213, 0x00ac0fb7, 0x0f660237,
1125 0x00860fc0, 0x0f610259, 0x00600fc9, 0x0f5c027b,
1126 0x003d0fd1, 0x0f590299, 0x00190fda, 0x0f5702b6,
1127 0x0ffa0fe2, 0x0f5702cd, 0x0fdd0fe9, 0x0f5802e2,
1128 0x0fc10ff0, 0x0f5b02f4, 0x0fa90ff5, 0x0f5f0303,
1129 0x0f930ffb, 0x0f64030e, 0x0f810ffe, 0x0f6b0316,
1130
1131 0x03400f60, 0x00000f60, 0x033e0f57, 0x0ffe0f6d,
1132 0x03370f4f, 0x0ffa0f80, 0x032a0f4b, 0x0ff30f98,
1133 0x031a0f46, 0x0fee0fb2, 0x03070f44, 0x0fe60fcf,
1134 0x02f10f44, 0x0fde0fed, 0x02d70f44, 0x0fd6000f,
1135 0x02b80f46, 0x0fcc0036, 0x02990f4a, 0x0fc3005a,
1136 0x02750f4f, 0x0fb90083, 0x02500f55, 0x0fb000ab,
1137 0x022a0f5b, 0x0fa500d6, 0x02020f63, 0x0f9a0101,
1138 0x01d80f6b, 0x0f91012c, 0x01ae0f74, 0x0f870157,
1139 0x01840f7c, 0x0f7c0184, 0x01570f87, 0x0f7401ae,
1140 0x012c0f91, 0x0f6b01d8, 0x01010f9a, 0x0f630202,
1141 0x00d60fa5, 0x0f5b022a, 0x00ab0fb0, 0x0f550250,
1142 0x00830fb9, 0x0f4f0275, 0x005a0fc3, 0x0f4a0299,
1143 0x00360fcc, 0x0f4602b8, 0x000f0fd6, 0x0f4402d7,
1144 0x0fed0fde, 0x0f4402f1, 0x0fcf0fe6, 0x0f440307,
1145 0x0fb20fee, 0x0f46031a, 0x0f980ff3, 0x0f4b032a,
1146 0x0f800ffa, 0x0f4f0337, 0x0f6d0ffe, 0x0f57033e
1147};
1148
1149
1150#define MDP4_QSEED_TABLE0_OFF 0x8100
1151#define MDP4_QSEED_TABLE1_OFF 0x8200
1152#define MDP4_QSEED_TABLE2_OFF 0x9000
1153
1154void mdp4_vg_qseed_init(int vp_num)
1155{
1156 uint32 *off;
1157 int i, voff;
1158
1159 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1160
1161 voff = MDP4_VIDEO_OFF * vp_num;
1162 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1163 MDP4_QSEED_TABLE0_OFF);
1164 for (i = 0; i < (sizeof(vg_qseed_table0) / sizeof(uint32)); i++) {
1165 outpdw(off, vg_qseed_table0[i]);
1166 off++;
1167 /* This code is added to workaround the 1K Boundary AXI
1168 Interleave operations from Scorpion that can potentially
1169 corrupt the QSEED table. The idea is to complete the prevous
1170 to the buffer before making the next write when address is
1171 1KB aligned to ensure the write has been committed prior to
1172 next instruction write that can go out from the secondary AXI
1173 port.This happens also because of the expected write sequence
1174 from QSEED table, where LSP has to be written first then the
1175 MSP to trigger both to write out to SRAM, if this has not been
1176 the expectation, then corruption wouldn't have happened.*/
1177
1178 if (!((uint32)off & 0x3FF))
1179 wmb();
1180 }
1181
1182 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1183 MDP4_QSEED_TABLE1_OFF);
1184 for (i = 0; i < (sizeof(vg_qseed_table1) / sizeof(uint32)); i++) {
1185 outpdw(off, vg_qseed_table1[i]);
1186 off++;
1187 if (!((uint32)off & 0x3FF))
1188 wmb();
1189 }
1190
1191 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1192 MDP4_QSEED_TABLE2_OFF);
1193 for (i = 0; i < (sizeof(vg_qseed_table2) / sizeof(uint32)); i++) {
1194 outpdw(off, vg_qseed_table2[i]);
1195 off++;
1196 if (!((uint32)off & 0x3FF))
1197 wmb();
1198 }
1199
1200 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1201
1202}
1203
1204void mdp4_mixer_blend_init(mixer_num)
1205{
1206 unsigned char *overlay_base;
1207 int off;
1208
1209 if (mixer_num) /* mixer number, /dev/fb0, /dev/fb1 */
1210 overlay_base = MDP_BASE + MDP4_OVERLAYPROC1_BASE;/* 0x18000 */
1211 else
1212 overlay_base = MDP_BASE + MDP4_OVERLAYPROC0_BASE;/* 0x10000 */
1213
1214 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1215
1216 /* stage 0 to stage 2 */
1217 off = 0;
1218 outpdw(overlay_base + off + 0x104, 0x010);
1219 outpdw(overlay_base + off + 0x108, 0xff);/* FG */
1220 outpdw(overlay_base + off + 0x10c, 0x00);/* BG */
1221
1222 off += 0x20;
1223 outpdw(overlay_base + off + 0x104, 0x010);
1224 outpdw(overlay_base + off + 0x108, 0xff);/* FG */
1225 outpdw(overlay_base + off + 0x10c, 0x00);/* BG */
1226
1227 off += 0x20;
1228 outpdw(overlay_base + off + 0x104, 0x010);
1229 outpdw(overlay_base + off + 0x108, 0xff);/* FG */
1230 outpdw(overlay_base + off + 0x10c, 0x00);/* BG */
1231
1232 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1233}
1234
Carl Vanderlipfa1de672011-12-05 12:37:59 -08001235struct mdp_csc_cfg mdp_csc_convert[4] = {
1236 { /*RGB2RGB*/
1237 0,
1238 {
1239 0x0200, 0x0000, 0x0000,
1240 0x0000, 0x0200, 0x0000,
1241 0x0000, 0x0000, 0x0200,
1242 },
1243 { 0x0, 0x0, 0x0, },
1244 { 0x0, 0x0, 0x0, },
1245 { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, },
1246 { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, },
1247 },
1248 { /*YUV2RGB*/
1249 0,
1250 {
1251 0x0254, 0x0000, 0x0331,
1252 0x0254, 0xff37, 0xfe60,
1253 0x0254, 0x0409, 0x0000,
1254 },
1255 { 0xfff0, 0xff80, 0xff80, },
1256 { 0x0, 0x0, 0x0, },
1257 { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, },
1258 { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, },
1259 },
1260 { /*RGB2YUV*/
1261 0,
1262 {
1263 0x0083, 0x0102, 0x0032,
1264 0x1fb5, 0x1f6c, 0x00e1,
1265 0x00e1, 0x1f45, 0x1fdc
1266 },
1267 { 0x0, 0x0, 0x0, },
1268 { 0x0010, 0x0080, 0x0080, },
1269 { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, },
1270 { 0x0010, 0x00eb, 0x0010, 0x00f0, 0x0010, 0x00f0, },
1271 },
1272 { /*YUV2YUV ???*/
1273 0,
1274 {
1275 0x0200, 0x0000, 0x0000,
1276 0x0000, 0x0200, 0x0000,
1277 0x0000, 0x0000, 0x0200,
1278 },
1279 { 0x0, 0x0, 0x0, },
1280 { 0x0, 0x0, 0x0, },
1281 { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, },
1282 { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, },
1283 },
1284};
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001285
Carl Vanderlipfa1de672011-12-05 12:37:59 -08001286struct mdp_csc_cfg csc_matrix[3] = {
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001287 {
Carl Vanderlipfa1de672011-12-05 12:37:59 -08001288 (MDP_CSC_FLAG_YUV_OUT),
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001289 {
1290 0x0254, 0x0000, 0x0331,
1291 0x0254, 0xff37, 0xfe60,
1292 0x0254, 0x0409, 0x0000,
1293 },
1294 {
1295 0xfff0, 0xff80, 0xff80,
1296 },
1297 {
1298 0, 0, 0,
1299 },
1300 {
1301 0, 0xff, 0, 0xff, 0, 0xff,
1302 },
1303 {
1304 0, 0xff, 0, 0xff, 0, 0xff,
1305 },
1306 },
1307 {
Carl Vanderlipfa1de672011-12-05 12:37:59 -08001308 (MDP_CSC_FLAG_YUV_OUT),
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001309 {
1310 0x0254, 0x0000, 0x0331,
1311 0x0254, 0xff37, 0xfe60,
1312 0x0254, 0x0409, 0x0000,
1313 },
1314 {
1315 0xfff0, 0xff80, 0xff80,
1316 },
1317 {
1318 0, 0, 0,
1319 },
1320 {
1321 0, 0xff, 0, 0xff, 0, 0xff,
1322 },
1323 {
1324 0, 0xff, 0, 0xff, 0, 0xff,
1325 },
1326 },
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08001327 {
Carl Vanderlipfa1de672011-12-05 12:37:59 -08001328 (0),
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08001329 {
1330 0x0200, 0x0000, 0x0000,
1331 0x0000, 0x0200, 0x0000,
1332 0x0000, 0x0000, 0x0200,
1333 },
1334 {
1335 0x0, 0x0, 0x0,
1336 },
1337 {
1338 0, 0, 0,
1339 },
1340 {
1341 0, 0xff, 0, 0xff, 0, 0xff,
1342 },
1343 {
1344 0, 0xff, 0, 0xff, 0, 0xff,
1345 },
1346 },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001347};
1348
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001349
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001350
1351#define MDP4_CSC_MV_OFF 0x4400
1352#define MDP4_CSC_PRE_BV_OFF 0x4500
1353#define MDP4_CSC_POST_BV_OFF 0x4580
1354#define MDP4_CSC_PRE_LV_OFF 0x4600
1355#define MDP4_CSC_POST_LV_OFF 0x4680
1356
1357void mdp4_vg_csc_mv_setup(int vp_num)
1358{
1359 uint32 *off;
1360 int i, voff;
1361
1362 voff = MDP4_VIDEO_OFF * vp_num;
1363 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1364 MDP4_CSC_MV_OFF);
1365
1366 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1367 for (i = 0; i < 9; i++) {
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001368 outpdw(off, csc_matrix[vp_num].csc_mv[i]);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001369 off++;
1370 }
1371 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1372}
1373
1374void mdp4_vg_csc_pre_bv_setup(int vp_num)
1375{
1376 uint32 *off;
1377 int i, voff;
1378
1379 voff = MDP4_VIDEO_OFF * vp_num;
1380 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1381 MDP4_CSC_PRE_BV_OFF);
1382
1383 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1384 for (i = 0; i < 3; i++) {
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001385 outpdw(off, csc_matrix[vp_num].csc_pre_bv[i]);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001386 off++;
1387 }
1388 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1389}
1390
1391void mdp4_vg_csc_post_bv_setup(int vp_num)
1392{
1393 uint32 *off;
1394 int i, voff;
1395
1396 voff = MDP4_VIDEO_OFF * vp_num;
1397 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1398 MDP4_CSC_POST_BV_OFF);
1399
1400 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1401 for (i = 0; i < 3; i++) {
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001402 outpdw(off, csc_matrix[vp_num].csc_post_bv[i]);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001403 off++;
1404 }
1405 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1406}
1407
1408void mdp4_vg_csc_pre_lv_setup(int vp_num)
1409{
1410 uint32 *off;
1411 int i, voff;
1412
1413 voff = MDP4_VIDEO_OFF * vp_num;
1414 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1415 MDP4_CSC_PRE_LV_OFF);
1416
1417 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1418 for (i = 0; i < 6; i++) {
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001419 outpdw(off, csc_matrix[vp_num].csc_pre_lv[i]);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001420 off++;
1421 }
1422 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1423}
1424
1425void mdp4_vg_csc_post_lv_setup(int vp_num)
1426{
1427 uint32 *off;
1428 int i, voff;
1429
1430 voff = MDP4_VIDEO_OFF * vp_num;
1431 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1432 MDP4_CSC_POST_LV_OFF);
1433
1434 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1435 for (i = 0; i < 6; i++) {
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001436 outpdw(off, csc_matrix[vp_num].csc_post_lv[i]);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001437 off++;
1438 }
1439 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1440}
1441
Carl Vanderlipfa1de672011-12-05 12:37:59 -08001442void mdp4_vg_csc_convert_setup(int vp_num)
1443{
1444 struct mdp_csc_cfg_data cfg;
1445
1446 switch (vp_num) {
1447 case 0:
1448 cfg.block = MDP_BLOCK_VG_1;
1449 break;
1450 case 1:
1451 cfg.block = MDP_BLOCK_VG_2;
1452 break;
1453 default:
1454 pr_err("%s - invalid vp_num = %d", __func__, vp_num);
1455 return;
1456 }
1457 cfg.csc_data = csc_matrix[vp_num];
1458 mdp4_csc_enable(&cfg);
1459}
1460
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001461void mdp4_vg_csc_setup(int vp_num)
1462{
1463 /* yuv2rgb */
1464 mdp4_vg_csc_mv_setup(vp_num);
1465 mdp4_vg_csc_pre_bv_setup(vp_num);
1466 mdp4_vg_csc_post_bv_setup(vp_num);
1467 mdp4_vg_csc_pre_lv_setup(vp_num);
1468 mdp4_vg_csc_post_lv_setup(vp_num);
Carl Vanderlipfa1de672011-12-05 12:37:59 -08001469 mdp4_vg_csc_convert_setup(vp_num);
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001470}
1471void mdp4_vg_csc_update(struct mdp_csc *p)
1472{
1473 struct mdp4_overlay_pipe *pipe;
1474 int vp_num;
1475
1476 pipe = mdp4_overlay_ndx2pipe(p->id);
1477 if (pipe == NULL) {
1478 pr_err("%s: p->id = %d Error\n", __func__, p->id);
1479 return;
1480 }
1481
1482 vp_num = pipe->pipe_num - OVERLAY_PIPE_VG1;
1483
1484 if (vp_num == 0 || vp_num == 1) {
1485 memcpy(csc_matrix[vp_num].csc_mv, p->csc_mv, sizeof(p->csc_mv));
1486 memcpy(csc_matrix[vp_num].csc_pre_bv, p->csc_pre_bv,
1487 sizeof(p->csc_pre_bv));
1488 memcpy(csc_matrix[vp_num].csc_post_bv, p->csc_post_bv,
1489 sizeof(p->csc_post_bv));
1490 memcpy(csc_matrix[vp_num].csc_pre_lv, p->csc_pre_lv,
1491 sizeof(p->csc_pre_lv));
1492 memcpy(csc_matrix[vp_num].csc_post_lv, p->csc_post_lv,
1493 sizeof(p->csc_post_lv));
1494 mdp4_vg_csc_setup(vp_num);
1495 }
1496}
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001497static uint32 csc_rgb2yuv_matrix_tab[9] = {
1498 0x0083, 0x0102, 0x0032,
1499 0x1fb5, 0x1f6c, 0x00e1,
1500 0x00e1, 0x1f45, 0x1fdc
1501};
1502
1503static uint32 csc_rgb2yuv_pre_bv_tab[3] = {0, 0, 0};
1504
1505static uint32 csc_rgb2yuv_post_bv_tab[3] = {0x0010, 0x0080, 0x0080};
1506
1507static uint32 csc_rgb2yuv_pre_lv_tab[6] = {
1508 0x00, 0xff, 0x00,
1509 0xff, 0x00, 0xff
1510};
1511
1512static uint32 csc_rgb2yuv_post_lv_tab[6] = {
1513 0x0010, 0x00eb, 0x0010,
1514 0x00f0, 0x0010, 0x00f0
1515};
1516
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001517void mdp4_mixer_csc_mv_setup(uint32 mixer)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001518{
1519 uint32 *off;
1520 int i;
1521
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001522 if (mixer == MDP4_MIXER1)
1523 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC1_BASE + 0x2400);
1524 else
1525 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC2_BASE + 0x2400);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001526
1527 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1528 for (i = 0; i < 9; i++) {
1529 outpdw(off, csc_rgb2yuv_matrix_tab[i]);
1530 off++;
1531 }
1532 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1533}
1534
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001535void mdp4_mixer_csc_pre_bv_setup(uint32 mixer)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001536{
1537 uint32 *off;
1538 int i;
1539
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001540 if (mixer == MDP4_MIXER1)
1541 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC1_BASE + 0x2500);
1542 else
1543 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC2_BASE + 0x2500);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001544
1545 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1546 for (i = 0; i < 3; i++) {
1547 outpdw(off, csc_rgb2yuv_pre_bv_tab[i]);
1548 off++;
1549 }
1550 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1551}
1552
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001553void mdp4_mixer_csc_post_bv_setup(uint32 mixer)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001554{
1555 uint32 *off;
1556 int i;
1557
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001558 if (mixer == MDP4_MIXER1)
1559 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC1_BASE + 0x2580);
1560 else
1561 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC2_BASE + 0x2580);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001562
1563 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1564 for (i = 0; i < 3; i++) {
1565 outpdw(off, csc_rgb2yuv_post_bv_tab[i]);
1566 off++;
1567 }
1568 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1569}
1570
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001571void mdp4_mixer_csc_pre_lv_setup(uint32 mixer)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001572{
1573 uint32 *off;
1574 int i;
1575
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001576 if (mixer == MDP4_MIXER1)
1577 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC1_BASE + 0x2600);
1578 else
1579 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC2_BASE + 0x2600);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001580
1581 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1582 for (i = 0; i < 6; i++) {
1583 outpdw(off, csc_rgb2yuv_pre_lv_tab[i]);
1584 off++;
1585 }
1586 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1587}
1588
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001589void mdp4_mixer_csc_post_lv_setup(uint32 mixer)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001590{
1591 uint32 *off;
1592 int i;
1593
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001594 if (mixer == MDP4_MIXER1)
1595 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC1_BASE + 0x2680);
1596 else
1597 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC2_BASE + 0x2680);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001598
1599 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1600 for (i = 0; i < 6; i++) {
1601 outpdw(off, csc_rgb2yuv_post_lv_tab[i]);
1602 off++;
1603 }
1604 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1605}
1606
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001607void mdp4_mixer_csc_setup(uint32 mixer)
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001608{
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001609 if (mixer >= MDP4_MIXER1) {
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001610 /* rgb2yuv */
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001611 mdp4_mixer_csc_mv_setup(mixer);
1612 mdp4_mixer_csc_pre_bv_setup(mixer);
1613 mdp4_mixer_csc_post_bv_setup(mixer);
1614 mdp4_mixer_csc_pre_lv_setup(mixer);
1615 mdp4_mixer_csc_post_lv_setup(mixer);
1616 }
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001617}
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001618
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08001619#define DMA_P_BASE 0x90000
1620void mdp4_dmap_csc_mv_setup(void)
1621{
1622 uint32 *off;
1623 int i;
1624
1625 off = (uint32 *)(MDP_BASE + DMA_P_BASE + 0x3400);
1626
1627 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1628 for (i = 0; i < 9; i++) {
1629 outpdw(off, csc_matrix[2].csc_mv[i]);
1630 off++;
1631 }
1632 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1633}
1634
1635void mdp4_dmap_csc_pre_bv_setup(void)
1636{
1637 uint32 *off;
1638 int i;
1639
1640 off = (uint32 *)(MDP_BASE + DMA_P_BASE + 0x3500);
1641
1642 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1643 for (i = 0; i < 3; i++) {
1644 outpdw(off, csc_matrix[2].csc_pre_bv[i]);
1645 off++;
1646 }
1647 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1648}
1649
1650void mdp4_dmap_csc_post_bv_setup(void)
1651{
1652 uint32 *off;
1653 int i;
1654
1655 off = (uint32 *)(MDP_BASE + DMA_P_BASE + 0x3580);
1656
1657 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1658 for (i = 0; i < 3; i++) {
1659 outpdw(off, csc_matrix[2].csc_post_bv[i]);
1660 off++;
1661 }
1662 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1663}
1664
1665void mdp4_dmap_csc_pre_lv_setup(void)
1666{
1667 uint32 *off;
1668 int i;
1669
1670 off = (uint32 *)(MDP_BASE + DMA_P_BASE + 0x3600);
1671
1672 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1673 for (i = 0; i < 6; i++) {
1674 outpdw(off, csc_matrix[2].csc_pre_lv[i]);
1675 off++;
1676 }
1677 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1678}
1679
1680void mdp4_dmap_csc_post_lv_setup(void)
1681{
1682 uint32 *off;
1683 int i;
1684
1685 off = (uint32 *)(MDP_BASE + DMA_P_BASE + 0x3680);
1686
1687 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1688 for (i = 0; i < 6; i++) {
1689 outpdw(off, csc_matrix[2].csc_post_lv[i]);
1690 off++;
1691 }
1692 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1693}
1694
1695void mdp4_dmap_csc_setup(void)
1696{
1697 mdp4_dmap_csc_mv_setup();
1698 mdp4_dmap_csc_pre_bv_setup();
1699 mdp4_dmap_csc_post_bv_setup();
1700 mdp4_dmap_csc_pre_lv_setup();
1701 mdp4_dmap_csc_post_lv_setup();
1702}
1703
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001704char gc_lut[] = {
1705 0x0, 0x1, 0x2, 0x2, 0x3, 0x4, 0x5, 0x6,
1706 0x6, 0x7, 0x8, 0x9, 0xA, 0xA, 0xB, 0xC,
1707 0xD, 0xD, 0xE, 0xF, 0xF, 0x10, 0x10, 0x11,
1708 0x12, 0x12, 0x13, 0x13, 0x14, 0x14, 0x15, 0x15,
1709 0x16, 0x16, 0x17, 0x17, 0x17, 0x18, 0x18, 0x19,
1710 0x19, 0x19, 0x1A, 0x1A, 0x1B, 0x1B, 0x1B, 0x1C,
1711 0x1C, 0x1D, 0x1D, 0x1D, 0x1E, 0x1E, 0x1E, 0x1F,
1712 0x1F, 0x1F, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21,
1713 0x22, 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, 0x24,
1714 0x24, 0x24, 0x25, 0x25, 0x25, 0x25, 0x26, 0x26,
1715 0x26, 0x26, 0x27, 0x27, 0x27, 0x28, 0x28, 0x28,
1716 0x28, 0x29, 0x29, 0x29, 0x29, 0x2A, 0x2A, 0x2A,
1717 0x2A, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2C, 0x2C,
1718 0x2C, 0x2C, 0x2D, 0x2D, 0x2D, 0x2D, 0x2E, 0x2E,
1719 0x2E, 0x2E, 0x2E, 0x2F, 0x2F, 0x2F, 0x2F, 0x30,
1720 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x31,
1721 0x31, 0x32, 0x32, 0x32, 0x32, 0x32, 0x33, 0x33,
1722 0x33, 0x33, 0x33, 0x34, 0x34, 0x34, 0x34, 0x34,
1723 0x35, 0x35, 0x35, 0x35, 0x35, 0x36, 0x36, 0x36,
1724 0x36, 0x36, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37,
1725 0x38, 0x38, 0x38, 0x38, 0x38, 0x39, 0x39, 0x39,
1726 0x39, 0x39, 0x39, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A,
1727 0x3A, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3C,
1728 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3D, 0x3D, 0x3D,
1729 0x3D, 0x3D, 0x3D, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E,
1730 0x3E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x40,
1731 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41,
1732 0x41, 0x41, 0x41, 0x41, 0x42, 0x42, 0x42, 0x42,
1733 0x42, 0x42, 0x42, 0x43, 0x43, 0x43, 0x43, 0x43,
1734 0x43, 0x43, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1735 0x44, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45,
1736 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x47,
1737 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x48, 0x48,
1738 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x49, 0x49,
1739 0x49, 0x49, 0x49, 0x49, 0x49, 0x4A, 0x4A, 0x4A,
1740 0x4A, 0x4A, 0x4A, 0x4A, 0x4A, 0x4B, 0x4B, 0x4B,
1741 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4C, 0x4C, 0x4C,
1742 0x4C, 0x4C, 0x4C, 0x4C, 0x4D, 0x4D, 0x4D, 0x4D,
1743 0x4D, 0x4D, 0x4D, 0x4D, 0x4E, 0x4E, 0x4E, 0x4E,
1744 0x4E, 0x4E, 0x4E, 0x4E, 0x4E, 0x4F, 0x4F, 0x4F,
1745 0x4F, 0x4F, 0x4F, 0x4F, 0x4F, 0x50, 0x50, 0x50,
1746 0x50, 0x50, 0x50, 0x50, 0x50, 0x51, 0x51, 0x51,
1747 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x52, 0x52,
1748 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x53, 0x53,
1749 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x54,
1750 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54,
1751 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
1752 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56,
1753 0x56, 0x56, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57,
1754 0x57, 0x57, 0x57, 0x58, 0x58, 0x58, 0x58, 0x58,
1755 0x58, 0x58, 0x58, 0x58, 0x58, 0x59, 0x59, 0x59,
1756 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x5A, 0x5A,
1757 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A,
1758 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
1759 0x5B, 0x5B, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C,
1760 0x5C, 0x5C, 0x5C, 0x5C, 0x5D, 0x5D, 0x5D, 0x5D,
1761 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5E, 0x5E,
1762 0x5E, 0x5E, 0x5E, 0x5E, 0x5E, 0x5E, 0x5E, 0x5E,
1763 0x5F, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F,
1764 0x5F, 0x5F, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60,
1765 0x60, 0x60, 0x60, 0x60, 0x60, 0x61, 0x61, 0x61,
1766 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x62,
1767 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62,
1768 0x62, 0x62, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
1769 0x63, 0x63, 0x63, 0x63, 0x63, 0x64, 0x64, 0x64,
1770 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64,
1771 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65,
1772 0x65, 0x65, 0x65, 0x66, 0x66, 0x66, 0x66, 0x66,
1773 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x67,
1774 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
1775 0x67, 0x67, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68,
1776 0x68, 0x68, 0x68, 0x68, 0x68, 0x69, 0x69, 0x69,
1777 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69,
1778 0x69, 0x6A, 0x6A, 0x6A, 0x6A, 0x6A, 0x6A, 0x6A,
1779 0x6A, 0x6A, 0x6A, 0x6A, 0x6A, 0x6B, 0x6B, 0x6B,
1780 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B,
1781 0x6B, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
1782 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6D, 0x6D, 0x6D,
1783 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D,
1784 0x6D, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
1785 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6F, 0x6F, 0x6F,
1786 0x6F, 0x6F, 0x6F, 0x6F, 0x6F, 0x6F, 0x6F, 0x6F,
1787 0x6F, 0x6F, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70,
1788 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x71, 0x71,
1789 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71,
1790 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72,
1791 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72,
1792 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73,
1793 0x73, 0x73, 0x73, 0x73, 0x73, 0x74, 0x74, 0x74,
1794 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74,
1795 0x74, 0x74, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75,
1796 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75,
1797 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76,
1798 0x76, 0x76, 0x76, 0x76, 0x76, 0x77, 0x77, 0x77,
1799 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
1800 0x77, 0x77, 0x77, 0x78, 0x78, 0x78, 0x78, 0x78,
1801 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
1802 0x78, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79,
1803 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x7A, 0x7A,
1804 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A,
1805 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x7B, 0x7B, 0x7B,
1806 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B,
1807 0x7B, 0x7B, 0x7B, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C,
1808 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C,
1809 0x7C, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D,
1810 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D,
1811 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E,
1812 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F,
1813 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F,
1814 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x80,
1815 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
1816 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81,
1817 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
1818 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82,
1819 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
1820 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
1821 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
1822 0x83, 0x83, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
1823 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
1824 0x84, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
1825 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
1826 0x85, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
1827 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
1828 0x86, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
1829 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
1830 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
1831 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
1832 0x88, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
1833 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
1834 0x89, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A,
1835 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A,
1836 0x8A, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B,
1837 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B,
1838 0x8B, 0x8B, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C,
1839 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C,
1840 0x8C, 0x8C, 0x8C, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D,
1841 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D,
1842 0x8D, 0x8D, 0x8D, 0x8D, 0x8E, 0x8E, 0x8E, 0x8E,
1843 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E,
1844 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8F, 0x8F, 0x8F,
1845 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F,
1846 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x90, 0x90,
1847 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
1848 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x91,
1849 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91,
1850 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91,
1851 0x91, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92,
1852 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92,
1853 0x92, 0x92, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93,
1854 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93,
1855 0x93, 0x93, 0x93, 0x93, 0x94, 0x94, 0x94, 0x94,
1856 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94,
1857 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x95, 0x95,
1858 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95,
1859 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95,
1860 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96,
1861 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96,
1862 0x96, 0x96, 0x96, 0x97, 0x97, 0x97, 0x97, 0x97,
1863 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97,
1864 0x97, 0x97, 0x97, 0x97, 0x97, 0x98, 0x98, 0x98,
1865 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98,
1866 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98,
1867 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
1868 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
1869 0x99, 0x99, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A,
1870 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A,
1871 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9B, 0x9B, 0x9B,
1872 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B,
1873 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B,
1874 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C,
1875 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C,
1876 0x9C, 0x9C, 0x9C, 0x9C, 0x9D, 0x9D, 0x9D, 0x9D,
1877 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D,
1878 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9E,
1879 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E,
1880 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E,
1881 0x9E, 0x9E, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F,
1882 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F,
1883 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xA0, 0xA0,
1884 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0,
1885 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0,
1886 0xA0, 0xA0, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1,
1887 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1,
1888 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA2, 0xA2,
1889 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2,
1890 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2,
1891 0xA2, 0xA2, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3,
1892 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3,
1893 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA4, 0xA4,
1894 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
1895 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
1896 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5,
1897 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5,
1898 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5,
1899 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6,
1900 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6,
1901 0xA6, 0xA6, 0xA6, 0xA6, 0xA7, 0xA7, 0xA7, 0xA7,
1902 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7,
1903 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7,
1904 0xA7, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,
1905 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,
1906 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA9,
1907 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9,
1908 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9,
1909 0xA9, 0xA9, 0xA9, 0xA9, 0xAA, 0xAA, 0xAA, 0xAA,
1910 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
1911 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
1912 0xAA, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB,
1913 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB,
1914 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAC,
1915 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC,
1916 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC,
1917 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAD, 0xAD, 0xAD,
1918 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD,
1919 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD,
1920 0xAD, 0xAD, 0xAD, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE,
1921 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE,
1922 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE,
1923 0xAE, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF,
1924 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF,
1925 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xB0,
1926 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0,
1927 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0,
1928 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB1, 0xB1,
1929 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1,
1930 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1,
1931 0xB1, 0xB1, 0xB1, 0xB1, 0xB2, 0xB2, 0xB2, 0xB2,
1932 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2,
1933 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2,
1934 0xB2, 0xB2, 0xB2, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3,
1935 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3,
1936 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3,
1937 0xB3, 0xB3, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4,
1938 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4,
1939 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4,
1940 0xB4, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5,
1941 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5,
1942 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5,
1943 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6,
1944 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6,
1945 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6,
1946 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7,
1947 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7,
1948 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB8,
1949 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8,
1950 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8,
1951 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB9,
1952 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9,
1953 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9,
1954 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xBA,
1955 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA,
1956 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA,
1957 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBB,
1958 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
1959 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
1960 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
1961 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC,
1962 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC,
1963 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC,
1964 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
1965 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
1966 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
1967 0xBD, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE,
1968 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE,
1969 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE,
1970 0xBE, 0xBE, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF,
1971 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF,
1972 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF,
1973 0xBF, 0xBF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
1974 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
1975 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
1976 0xC0, 0xC0, 0xC0, 0xC0, 0xC1, 0xC1, 0xC1, 0xC1,
1977 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1,
1978 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1,
1979 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC2, 0xC2, 0xC2,
1980 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2,
1981 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2,
1982 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC3, 0xC3,
1983 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
1984 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
1985 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
1986 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4,
1987 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4,
1988 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4,
1989 0xC4, 0xC4, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5,
1990 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5,
1991 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5,
1992 0xC5, 0xC5, 0xC5, 0xC5, 0xC6, 0xC6, 0xC6, 0xC6,
1993 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1994 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1995 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC7, 0xC7,
1996 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7,
1997 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7,
1998 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7,
1999 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8,
2000 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8,
2001 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8,
2002 0xC8, 0xC8, 0xC8, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9,
2003 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9,
2004 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9,
2005 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xCA, 0xCA,
2006 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
2007 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
2008 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
2009 0xCA, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB,
2010 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB,
2011 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB,
2012 0xCB, 0xCB, 0xCB, 0xCB, 0xCC, 0xCC, 0xCC, 0xCC,
2013 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
2014 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
2015 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD,
2016 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,
2017 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,
2018 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,
2019 0xCD, 0xCD, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE,
2020 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE,
2021 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE,
2022 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCF, 0xCF,
2023 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF,
2024 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF,
2025 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF,
2026 0xCF, 0xCF, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0,
2027 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0,
2028 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0,
2029 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD1, 0xD1, 0xD1,
2030 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1,
2031 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1,
2032 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1,
2033 0xD1, 0xD1, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2,
2034 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2,
2035 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2,
2036 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD3, 0xD3,
2037 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3,
2038 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3,
2039 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3,
2040 0xD3, 0xD3, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4,
2041 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4,
2042 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4,
2043 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD5,
2044 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5,
2045 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5,
2046 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5,
2047 0xD5, 0xD5, 0xD5, 0xD5, 0xD6, 0xD6, 0xD6, 0xD6,
2048 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6,
2049 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6,
2050 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6,
2051 0xD6, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
2052 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
2053 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
2054 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD8, 0xD8,
2055 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
2056 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
2057 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
2058 0xD8, 0xD8, 0xD8, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9,
2059 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9,
2060 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9,
2061 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9,
2062 0xD9, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA,
2063 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA,
2064 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA,
2065 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDB, 0xDB,
2066 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB,
2067 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB,
2068 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB,
2069 0xDB, 0xDB, 0xDB, 0xDB, 0xDC, 0xDC, 0xDC, 0xDC,
2070 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC,
2071 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC,
2072 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC,
2073 0xDC, 0xDC, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
2074 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
2075 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
2076 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
2077 0xDD, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE,
2078 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE,
2079 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE,
2080 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDF,
2081 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF,
2082 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF,
2083 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF,
2084 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xE0, 0xE0,
2085 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
2086 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
2087 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
2088 0xE0, 0xE0, 0xE0, 0xE0, 0xE1, 0xE1, 0xE1, 0xE1,
2089 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1,
2090 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1,
2091 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1,
2092 0xE1, 0xE1, 0xE1, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2,
2093 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2,
2094 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2,
2095 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2,
2096 0xE2, 0xE2, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3,
2097 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3,
2098 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3,
2099 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3,
2100 0xE3, 0xE3, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4,
2101 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4,
2102 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4,
2103 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4,
2104 0xE4, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5,
2105 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5,
2106 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5,
2107 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5,
2108 0xE5, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6,
2109 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6,
2110 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6,
2111 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6,
2112 0xE6, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7,
2113 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7,
2114 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7,
2115 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7,
2116 0xE7, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8,
2117 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8,
2118 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8,
2119 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8,
2120 0xE8, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9,
2121 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9,
2122 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9,
2123 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9,
2124 0xE9, 0xE9, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA,
2125 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA,
2126 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA,
2127 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA,
2128 0xEA, 0xEA, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB,
2129 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB,
2130 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB,
2131 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB,
2132 0xEB, 0xEB, 0xEB, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
2133 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
2134 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
2135 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
2136 0xEC, 0xEC, 0xEC, 0xEC, 0xED, 0xED, 0xED, 0xED,
2137 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED,
2138 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED,
2139 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED,
2140 0xED, 0xED, 0xED, 0xED, 0xED, 0xEE, 0xEE, 0xEE,
2141 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
2142 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
2143 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
2144 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0xEF,
2145 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF,
2146 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF,
2147 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF,
2148 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF,
2149 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
2150 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
2151 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
2152 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
2153 0xF0, 0xF0, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1,
2154 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1,
2155 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1,
2156 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1,
2157 0xF1, 0xF1, 0xF1, 0xF1, 0xF2, 0xF2, 0xF2, 0xF2,
2158 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
2159 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
2160 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
2161 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF3, 0xF3,
2162 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
2163 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
2164 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
2165 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
2166 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
2167 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
2168 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
2169 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
2170 0xF4, 0xF4, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5,
2171 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5,
2172 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5,
2173 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5,
2174 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF6, 0xF6, 0xF6,
2175 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6,
2176 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6,
2177 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6,
2178 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6,
2179 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
2180 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
2181 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
2182 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
2183 0xF7, 0xF7, 0xF7, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
2184 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
2185 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
2186 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
2187 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF9, 0xF9,
2188 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9,
2189 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9,
2190 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9,
2191 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9,
2192 0xF9, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA,
2193 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA,
2194 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA,
2195 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA,
2196 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFB, 0xFB, 0xFB,
2197 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB,
2198 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB,
2199 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB,
2200 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB,
2201 0xFB, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
2202 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
2203 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
2204 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
2205 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFD, 0xFD, 0xFD,
2206 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
2207 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
2208 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
2209 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
2210 0xFD, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
2211 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
2212 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
2213 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
2214 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF,
2215 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
2216 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
2217};
2218
2219void mdp4_mixer_gc_lut_setup(int mixer_num)
2220{
2221 unsigned char *base;
2222 uint32 data;
2223 char val;
2224 int i, off;
2225
2226 if (mixer_num) /* mixer number, /dev/fb0, /dev/fb1 */
2227 base = MDP_BASE + MDP4_OVERLAYPROC1_BASE;/* 0x18000 */
2228 else
2229 base = MDP_BASE + MDP4_OVERLAYPROC0_BASE;/* 0x10000 */
2230
2231 base += 0x4000; /* GC_LUT offset */
2232
2233 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
2234 off = 0;
2235 for (i = 0; i < 4096; i++) {
2236 val = gc_lut[i];
2237 data = (val << 16 | val << 8 | val); /* R, B, and G are same */
2238 outpdw(base + off, data);
2239 off += 4;
2240 }
2241 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
2242}
2243
2244uint32 igc_video_lut[] = { /* non linear */
2245 0x0, 0x1, 0x2, 0x4, 0x5, 0x6, 0x7, 0x9,
2246 0xA, 0xB, 0xC, 0xE, 0xF, 0x10, 0x12, 0x14,
2247 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F, 0x21, 0x23,
2248 0x25, 0x28, 0x2A, 0x2D, 0x30, 0x32, 0x35, 0x38,
2249 0x3B, 0x3E, 0x42, 0x45, 0x48, 0x4C, 0x4F, 0x53,
2250 0x57, 0x5B, 0x5F, 0x63, 0x67, 0x6B, 0x70, 0x74,
2251 0x79, 0x7E, 0x83, 0x88, 0x8D, 0x92, 0x97, 0x9C,
2252 0xA2, 0xA8, 0xAD, 0xB3, 0xB9, 0xBF, 0xC5, 0xCC,
2253 0xD2, 0xD8, 0xDF, 0xE6, 0xED, 0xF4, 0xFB, 0x102,
2254 0x109, 0x111, 0x118, 0x120, 0x128, 0x130, 0x138, 0x140,
2255 0x149, 0x151, 0x15A, 0x162, 0x16B, 0x174, 0x17D, 0x186,
2256 0x190, 0x199, 0x1A3, 0x1AC, 0x1B6, 0x1C0, 0x1CA, 0x1D5,
2257 0x1DF, 0x1EA, 0x1F4, 0x1FF, 0x20A, 0x215, 0x220, 0x22B,
2258 0x237, 0x242, 0x24E, 0x25A, 0x266, 0x272, 0x27F, 0x28B,
2259 0x298, 0x2A4, 0x2B1, 0x2BE, 0x2CB, 0x2D8, 0x2E6, 0x2F3,
2260 0x301, 0x30F, 0x31D, 0x32B, 0x339, 0x348, 0x356, 0x365,
2261 0x374, 0x383, 0x392, 0x3A1, 0x3B1, 0x3C0, 0x3D0, 0x3E0,
2262 0x3F0, 0x400, 0x411, 0x421, 0x432, 0x443, 0x454, 0x465,
2263 0x476, 0x487, 0x499, 0x4AB, 0x4BD, 0x4CF, 0x4E1, 0x4F3,
2264 0x506, 0x518, 0x52B, 0x53E, 0x551, 0x565, 0x578, 0x58C,
2265 0x5A0, 0x5B3, 0x5C8, 0x5DC, 0x5F0, 0x605, 0x61A, 0x62E,
2266 0x643, 0x659, 0x66E, 0x684, 0x699, 0x6AF, 0x6C5, 0x6DB,
2267 0x6F2, 0x708, 0x71F, 0x736, 0x74D, 0x764, 0x77C, 0x793,
2268 0x7AB, 0x7C3, 0x7DB, 0x7F3, 0x80B, 0x824, 0x83D, 0x855,
2269 0x86F, 0x888, 0x8A1, 0x8BB, 0x8D4, 0x8EE, 0x908, 0x923,
2270 0x93D, 0x958, 0x973, 0x98E, 0x9A9, 0x9C4, 0x9DF, 0x9FB,
2271 0xA17, 0xA33, 0xA4F, 0xA6C, 0xA88, 0xAA5, 0xAC2, 0xADF,
2272 0xAFC, 0xB19, 0xB37, 0xB55, 0xB73, 0xB91, 0xBAF, 0xBCE,
2273 0xBEC, 0xC0B, 0xC2A, 0xC4A, 0xC69, 0xC89, 0xCA8, 0xCC8,
2274 0xCE8, 0xD09, 0xD29, 0xD4A, 0xD6B, 0xD8C, 0xDAD, 0xDCF,
2275 0xDF0, 0xE12, 0xE34, 0xE56, 0xE79, 0xE9B, 0xEBE, 0xEE1,
2276 0xF04, 0xF27, 0xF4B, 0xF6E, 0xF92, 0xFB6, 0xFDB, 0xFFF,
2277};
2278
2279void mdp4_vg_igc_lut_setup(int vp_num)
2280{
2281 unsigned char *base;
2282 int i, voff, off;
2283 uint32 data, val;
2284
2285 voff = MDP4_VIDEO_OFF * vp_num;
2286 base = MDP_BASE + MDP4_VIDEO_BASE + voff + 0x5000;
2287
2288 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
2289 off = 0;
2290 for (i = 0; i < 256; i++) {
2291 val = igc_video_lut[i];
2292 data = (val << 16 | val); /* color 0 and 1 */
2293 outpdw(base + off, data);
2294 outpdw(base + off + 0x800, val); /* color 2 */
2295 off += 4;
2296 }
2297 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
2298}
2299
2300uint32 igc_rgb_lut[] = { /* linear */
2301 0x0, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
2302 0x80, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1,
2303 0x101, 0x111, 0x121, 0x131, 0x141, 0x151, 0x161, 0x171,
2304 0x181, 0x191, 0x1A2, 0x1B2, 0x1C2, 0x1D2, 0x1E2, 0x1F2,
2305 0x202, 0x212, 0x222, 0x232, 0x242, 0x252, 0x262, 0x272,
2306 0x282, 0x292, 0x2A2, 0x2B3, 0x2C3, 0x2D3, 0x2E3, 0x2F3,
2307 0x303, 0x313, 0x323, 0x333, 0x343, 0x353, 0x363, 0x373,
2308 0x383, 0x393, 0x3A3, 0x3B3, 0x3C4, 0x3D4, 0x3E4, 0x3F4,
2309 0x404, 0x414, 0x424, 0x434, 0x444, 0x454, 0x464, 0x474,
2310 0x484, 0x494, 0x4A4, 0x4B4, 0x4C4, 0x4D5, 0x4E5, 0x4F5,
2311 0x505, 0x515, 0x525, 0x535, 0x545, 0x555, 0x565, 0x575,
2312 0x585, 0x595, 0x5A5, 0x5B5, 0x5C5, 0x5D5, 0x5E6, 0x5F6,
2313 0x606, 0x616, 0x626, 0x636, 0x646, 0x656, 0x666, 0x676,
2314 0x686, 0x696, 0x6A6, 0x6B6, 0x6C6, 0x6D6, 0x6E6, 0x6F7,
2315 0x707, 0x717, 0x727, 0x737, 0x747, 0x757, 0x767, 0x777,
2316 0x787, 0x797, 0x7A7, 0x7B7, 0x7C7, 0x7D7, 0x7E7, 0x7F7,
2317 0x808, 0x818, 0x828, 0x838, 0x848, 0x858, 0x868, 0x878,
2318 0x888, 0x898, 0x8A8, 0x8B8, 0x8C8, 0x8D8, 0x8E8, 0x8F8,
2319 0x908, 0x919, 0x929, 0x939, 0x949, 0x959, 0x969, 0x979,
2320 0x989, 0x999, 0x9A9, 0x9B9, 0x9C9, 0x9D9, 0x9E9, 0x9F9,
2321 0xA09, 0xA19, 0xA2A, 0xA3A, 0xA4A, 0xA5A, 0xA6A, 0xA7A,
2322 0xA8A, 0xA9A, 0xAAA, 0xABA, 0xACA, 0xADA, 0xAEA, 0xAFA,
2323 0xB0A, 0xB1A, 0xB2A, 0xB3B, 0xB4B, 0xB5B, 0xB6B, 0xB7B,
2324 0xB8B, 0xB9B, 0xBAB, 0xBBB, 0xBCB, 0xBDB, 0xBEB, 0xBFB,
2325 0xC0B, 0xC1B, 0xC2B, 0xC3B, 0xC4C, 0xC5C, 0xC6C, 0xC7C,
2326 0xC8C, 0xC9C, 0xCAC, 0xCBC, 0xCCC, 0xCDC, 0xCEC, 0xCFC,
2327 0xD0C, 0xD1C, 0xD2C, 0xD3C, 0xD4C, 0xD5D, 0xD6D, 0xD7D,
2328 0xD8D, 0xD9D, 0xDAD, 0xDBD, 0xDCD, 0xDDD, 0xDED, 0xDFD,
2329 0xE0D, 0xE1D, 0xE2D, 0xE3D, 0xE4D, 0xE5D, 0xE6E, 0xE7E,
2330 0xE8E, 0xE9E, 0xEAE, 0xEBE, 0xECE, 0xEDE, 0xEEE, 0xEFE,
2331 0xF0E, 0xF1E, 0xF2E, 0xF3E, 0xF4E, 0xF5E, 0xF6E, 0xF7F,
2332 0xF8F, 0xF9F, 0xFAF, 0xFBF, 0xFCF, 0xFDF, 0xFEF, 0xFFF,
2333};
2334
2335void mdp4_rgb_igc_lut_setup(int num)
2336{
2337 unsigned char *base;
2338 int i, voff, off;
2339 uint32 data, val;
2340
2341 voff = MDP4_RGB_OFF * num;
2342 base = MDP_BASE + MDP4_RGB_BASE + voff + 0x5000;
2343
2344 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
2345 off = 0;
2346 for (i = 0; i < 256; i++) {
2347 val = igc_rgb_lut[i];
2348 data = (val << 16 | val); /* color 0 and 1 */
2349 outpdw(base + off, data);
2350 outpdw(base + off + 0x800, val); /* color 2 */
2351 off += 4;
2352 }
2353 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
2354}
2355
2356uint32 mdp4_rgb_igc_lut_cvt(uint32 ndx)
2357{
2358 return igc_rgb_lut[ndx & 0x0ff];
2359}
2360
2361uint32_t mdp4_ss_table_value(int8_t value, int8_t index)
2362{
2363 uint32_t out = 0x0;
2364 int8_t level = -1;
2365 uint32_t mask = 0xffffffff;
2366
2367 if (value < 0) {
2368 if (value == -128)
2369 value = 127;
2370 else
2371 value = -value;
2372 out = 0x11111111;
2373 } else {
2374 out = 0x88888888;
2375 mask = 0x0fffffff;
2376 }
2377
2378 if (value == 0)
2379 level = 0;
2380 else {
2381 while (value > 0 && level < 7) {
2382 level++;
2383 value -= 16;
2384 }
2385 }
2386
2387 if (level == 0) {
2388 if (index == 0)
2389 out = 0x0;
2390 else
2391 out = 0x20000000;
2392 } else {
2393 out += (0x11111111 * level);
2394 if (index == 1)
2395 out &= mask;
2396 }
2397
2398 return out;
2399}
2400
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002401static uint32_t mdp4_csc_block2base(uint32_t block)
2402{
2403 uint32_t base = 0x0;
2404 switch (block) {
2405 case MDP_BLOCK_OVERLAY_1:
2406 base = 0x1A000;
2407 break;
2408 case MDP_BLOCK_VG_1:
2409 base = 0x24000;
2410 break;
2411 case MDP_BLOCK_VG_2:
2412 base = 0x34000;
2413 break;
2414 case MDP_BLOCK_DMA_P:
2415 base = 0x93000;
2416 break;
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002417 case MDP_BLOCK_DMA_S:
2418 base = (mdp_rev >= MDP_REV_42) ? 0xA3000 : 0x0;
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002419 default:
2420 break;
2421 }
2422 return base;
2423}
2424
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002425int mdp4_csc_enable(struct mdp_csc_cfg_data *config)
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002426{
2427 uint32_t output, base, temp, mask;
2428
2429 switch (config->block) {
2430 case MDP_BLOCK_DMA_P:
2431 base = 0x90070;
2432 output = (config->csc_data.flags << 3) & (0x08);
2433 temp = (config->csc_data.flags << 10) & (0x1800);
2434 output |= temp;
2435 mask = 0x08 | 0x1800;
2436 break;
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002437 case MDP_BLOCK_DMA_S:
2438 base = 0xA0028;
2439 output = (config->csc_data.flags << 3) & (0x08);
2440 temp = (config->csc_data.flags << 10) & (0x1800);
2441 output |= temp;
2442 mask = 0x08 | 0x1800;
2443 break;
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002444 case MDP_BLOCK_VG_1:
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002445 base = 0x20058;
2446 output = (config->csc_data.flags << 11) & (0x800);
2447 temp = (config->csc_data.flags << 8) & (0x600);
2448 output |= temp;
2449 mask = 0x800 | 0x600;
2450 break;
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002451 case MDP_BLOCK_VG_2:
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002452 base = 0x30058;
2453 output = (config->csc_data.flags << 11) & (0x800);
2454 temp = (config->csc_data.flags << 8) & (0x600);
2455 output |= temp;
2456 mask = 0x800 | 0x600;
2457 break;
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002458 case MDP_BLOCK_OVERLAY_1:
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002459 base = 0x18200;
2460 output = config->csc_data.flags;
2461 mask = 0x07;
2462 break;
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002463 default:
2464 pr_err("%s - CSC block does not exist on MDP_BLOCK = %d\n",
2465 __func__, config->block);
2466 return -EINVAL;
2467 }
2468
2469 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
2470 temp = inpdw(MDP_BASE + base) & ~mask;
2471 output |= temp;
2472 outpdw(MDP_BASE + base, output);
2473 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
2474 return 0;
2475}
2476
2477#define CSC_MV_OFF 0x400
2478#define CSC_BV_OFF 0x500
2479#define CSC_LV_OFF 0x600
2480#define CSC_POST_OFF 0x80
2481
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002482void mdp4_csc_write(struct mdp_csc_cfg *data, uint32_t base)
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002483{
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002484 int i;
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002485 uint32_t *off;
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002486
2487 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002488 off = (uint32_t *) ((uint32_t) base + CSC_MV_OFF);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002489 for (i = 0; i < 9; i++) {
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002490 outpdw(off, data->csc_mv[i]);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002491 off++;
2492 }
2493
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002494 off = (uint32_t *) ((uint32_t) base + CSC_BV_OFF);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002495 for (i = 0; i < 3; i++) {
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002496 outpdw(off, data->csc_pre_bv[i]);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002497 outpdw((uint32_t *)((uint32_t)off + CSC_POST_OFF),
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002498 data->csc_post_bv[i]);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002499 off++;
2500 }
2501
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002502 off = (uint32_t *) ((uint32_t) base + CSC_LV_OFF);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002503 for (i = 0; i < 6; i++) {
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002504 outpdw(off, data->csc_pre_lv[i]);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002505 outpdw((uint32_t *)((uint32_t)off + CSC_POST_OFF),
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002506 data->csc_post_lv[i]);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002507 off++;
2508 }
2509 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002510}
2511
2512int mdp4_csc_config(struct mdp_csc_cfg_data *config)
2513{
2514 int ret = 0;
2515 uint32_t base;
2516
2517 base = mdp4_csc_block2base(config->block);
2518 if (!base) {
2519 pr_warn("%s: Block type %d isn't supported by CSC.\n",
2520 __func__, config->block);
2521 return -EINVAL;
2522 }
2523
2524 mdp4_csc_write(&config->csc_data, (uint32_t) (MDP_BASE + base));
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002525
2526 ret = mdp4_csc_enable(config);
2527
2528 return ret;
2529}
2530
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002531void mdp4_init_writeback_buf(struct msm_fb_data_type *mfd, u32 mix_num)
2532{
2533 struct mdp_buf_type *buf;
2534
2535 if (mix_num == MDP4_MIXER0)
2536 buf = mfd->ov0_wb_buf;
2537 else
2538 buf = mfd->ov1_wb_buf;
2539
2540 buf->ihdl = NULL;
2541 buf->phys_addr = 0;
2542}
2543
2544u32 mdp4_allocate_writeback_buf(struct msm_fb_data_type *mfd, u32 mix_num)
2545{
2546 struct mdp_buf_type *buf;
2547 ion_phys_addr_t addr;
2548 u32 len;
2549
2550 if (mix_num == MDP4_MIXER0)
2551 buf = mfd->ov0_wb_buf;
2552 else
2553 buf = mfd->ov1_wb_buf;
2554
2555 if (buf->phys_addr || !IS_ERR_OR_NULL(buf->ihdl))
2556 return 0;
2557
2558 if (!buf->size) {
Ravishangar Kalyanam175d1282012-01-20 16:57:23 -08002559 pr_err("%s:%d In valid size\n", __func__, __LINE__);
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002560 return -EINVAL;
2561 }
2562
2563 if (!IS_ERR_OR_NULL(mfd->iclient)) {
Ravishangar Kalyanam175d1282012-01-20 16:57:23 -08002564 pr_info("%s:%d ion based allocation\n", __func__, __LINE__);
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002565 buf->ihdl = ion_alloc(mfd->iclient, buf->size, 4,
2566 (1 << mfd->mem_hid));
2567 if (!IS_ERR_OR_NULL(buf->ihdl)) {
2568 if (ion_phys(mfd->iclient, buf->ihdl,
2569 &addr, &len)) {
Ravishangar Kalyanam175d1282012-01-20 16:57:23 -08002570 pr_err("%s:%d: ion_phys map failed\n",
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002571 __func__, __LINE__);
2572 return -ENOMEM;
2573 }
2574 } else {
Ravishangar Kalyanam175d1282012-01-20 16:57:23 -08002575 pr_err("%s:%d: ion_alloc failed\n", __func__,
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002576 __LINE__);
2577 return -ENOMEM;
2578 }
2579 } else {
2580 addr = allocate_contiguous_memory_nomap(buf->size,
2581 mfd->mem_hid, 4);
2582 }
2583 if (addr) {
2584 pr_info("allocating %d bytes at %x for mdp writeback\n",
2585 buf->size, (u32) addr);
2586 buf->phys_addr = addr;
2587 return 0;
2588 } else {
2589 pr_err("%s cannot allocate memory for mdp writeback!\n",
2590 __func__);
2591 return -ENOMEM;
2592 }
2593}
2594
2595void mdp4_free_writeback_buf(struct msm_fb_data_type *mfd, u32 mix_num)
2596{
2597 struct mdp_buf_type *buf;
2598
2599 if (mix_num == MDP4_MIXER0)
2600 buf = mfd->ov0_wb_buf;
2601 else
2602 buf = mfd->ov1_wb_buf;
2603
2604 if (!IS_ERR_OR_NULL(mfd->iclient)) {
Ravishangar Kalyanam175d1282012-01-20 16:57:23 -08002605 if (!IS_ERR_OR_NULL(buf->ihdl)) {
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002606 ion_free(mfd->iclient, buf->ihdl);
Jeff Ohlstein9cb0ead2011-12-16 13:30:08 -08002607 pr_debug("%s:%d free writeback imem\n", __func__,
Ravishangar Kalyanam175d1282012-01-20 16:57:23 -08002608 __LINE__);
2609 buf->ihdl = NULL;
2610 }
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002611 } else {
Ravishangar Kalyanam175d1282012-01-20 16:57:23 -08002612 if (buf->phys_addr) {
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002613 free_contiguous_memory_by_paddr(buf->phys_addr);
Jeff Ohlstein9cb0ead2011-12-16 13:30:08 -08002614 pr_debug("%s:%d free writeback pmem\n", __func__,
Ravishangar Kalyanam175d1282012-01-20 16:57:23 -08002615 __LINE__);
2616 }
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002617 }
2618 buf->phys_addr = 0;
2619}