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