blob: 1f5904b64984acf2337875fca9a8b290878b5998 [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>
Ravishangar Kalyanam6bc448a2012-03-14 11:31:52 -070031#include <mach/iommu_domains.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070032#include "mdp.h"
33#include "msm_fb.h"
34#include "mdp4.h"
35
36struct mdp4_statistic mdp4_stat;
37
38unsigned is_mdp4_hw_reset(void)
39{
40 unsigned hw_reset = 0;
41
42 /* Only revisions > v2.1 may be reset or powered off/on at runtime */
43 if (mdp_hw_revision > MDP4_REVISION_V2_1) {
44 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
45 hw_reset = !inpdw(MDP_BASE + 0x003c);
46 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
47 }
48
49 return hw_reset;
50}
51
52void mdp4_sw_reset(ulong bits)
53{
54 /* MDP cmd block enable */
55 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
56
57 bits &= 0x1f; /* 5 bits */
58 outpdw(MDP_BASE + 0x001c, bits); /* MDP_SW_RESET */
59
60 while (inpdw(MDP_BASE + 0x001c) & bits) /* self clear when complete */
61 ;
62 /* MDP cmd block disable */
63 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
64
65 MSM_FB_DEBUG("mdp4_sw_reset: 0x%x\n", (int)bits);
66}
67
68void mdp4_overlay_cfg(int overlayer, int blt_mode, int refresh, int direct_out)
69{
70 ulong bits = 0;
71
72 if (blt_mode)
73 bits |= (1 << 3);
74 refresh &= 0x03; /* 2 bites */
75 bits |= (refresh << 1);
76 direct_out &= 0x01;
77 bits |= direct_out;
78 /* MDP cmd block enable */
79 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
80
81
82 if (overlayer == MDP4_MIXER0)
83 outpdw(MDP_BASE + 0x10004, bits); /* MDP_OVERLAY0_CFG */
Rajesh Sastrulab52368b2011-12-22 12:09:17 -080084 else if (overlayer == MDP4_MIXER1)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070085 outpdw(MDP_BASE + 0x18004, bits); /* MDP_OVERLAY1_CFG */
86
87 MSM_FB_DEBUG("mdp4_overlay_cfg: 0x%x\n",
88 (int)inpdw(MDP_BASE + 0x10004));
89 /* MDP cmd block disable */
90 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
91}
92
93void mdp4_display_intf_sel(int output, ulong intf)
94{
95 ulong bits, mask, data;
96 /* MDP cmd block enable */
97 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
98
99 bits = inpdw(MDP_BASE + 0x0038); /* MDP_DISP_INTF_SEL */
100
101 if (intf == DSI_VIDEO_INTF) {
102 data = 0x40; /* bit 6 */
103 intf = MDDI_LCDC_INTF;
104 if (output == SECONDARY_INTF_SEL) {
105 MSM_FB_INFO("%s: Illegal INTF selected, output=%d \
106 intf=%d\n", __func__, output, (int)intf);
107 }
108 } else if (intf == DSI_CMD_INTF) {
109 data = 0x80; /* bit 7 */
110 intf = MDDI_INTF;
111 if (output == EXTERNAL_INTF_SEL) {
112 MSM_FB_INFO("%s: Illegal INTF selected, output=%d \
113 intf=%d\n", __func__, output, (int)intf);
114 }
115 } else
116 data = 0;
117
118 mask = 0x03; /* 2 bits */
119 intf &= 0x03; /* 2 bits */
120
121 switch (output) {
122 case EXTERNAL_INTF_SEL:
123 intf <<= 4;
124 mask <<= 4;
125 break;
126 case SECONDARY_INTF_SEL:
127 intf &= 0x02; /* only MDDI and EBI2 support */
128 intf <<= 2;
129 mask <<= 2;
130 break;
131 default:
132 break;
133 }
134
135 intf |= data;
136 mask |= data;
137
138 bits &= ~mask;
139 bits |= intf;
140
141 outpdw(MDP_BASE + 0x0038, bits); /* MDP_DISP_INTF_SEL */
142 /* MDP cmd block disable */
143 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
144
145 MSM_FB_DEBUG("mdp4_display_intf_sel: 0x%x\n", (int)inpdw(MDP_BASE + 0x0038));
146}
147
148unsigned long mdp4_display_status(void)
149{
150 ulong status;
151 /* MDP cmd block enable */
152 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
153
154 status = inpdw(MDP_BASE + 0x0018) & 0x3ff; /* MDP_DISPLAY_STATUS */
155
156 /* MDP cmd block disable */
157 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
158 return status;
159}
160
161void mdp4_ebi2_lcd_setup(int lcd, ulong base, int ystride)
162{
163 /* always use memory map */
164 ystride &= 0x01fff; /* 13 bits */
165 /* MDP cmd block enable */
166 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
167
168 if (lcd == EBI2_LCD0) {
169 outpdw(MDP_BASE + 0x0060, base);/* MDP_EBI2_LCD0 */
170 outpdw(MDP_BASE + 0x0068, ystride);/* MDP_EBI2_LCD0_YSTRIDE */
171 } else {
172 outpdw(MDP_BASE + 0x0064, base);/* MDP_EBI2_LCD1 */
173 outpdw(MDP_BASE + 0x006c, ystride);/* MDP_EBI2_LCD1_YSTRIDE */
174 }
175 /* MDP cmd block disable */
176 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
177}
178
179void mdp4_mddi_setup(int mddi, unsigned long id)
180{
181 ulong bits;
182
183 if (mddi == MDDI_EXTERNAL_SET)
184 bits = 0x02;
185 else if (mddi == MDDI_SECONDARY_SET)
186 bits = 0x01;
187 else
188 bits = 0; /* PRIMARY_SET */
189
190 id <<= 16;
191
192 bits |= id;
193 /* MDP cmd block enable */
194 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
195
196 outpdw(MDP_BASE + 0x0090, bits); /* MDP_MDDI_PARAM_WR_SEL */
197 /* MDP cmd block disable */
198 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
199}
200
201int mdp_ppp_blit(struct fb_info *info, struct mdp_blit_req *req)
202{
203
204 /* not implemented yet */
205 return -1;
206}
207
208void mdp4_fetch_cfg(uint32 core_clk)
209{
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700210 uint32 dmap_data, vg_data;
211 char *base;
212 int i;
213 /* MDP cmd block enable */
214 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
215
Adrian Salido-Moreno3436dae2011-08-08 12:13:07 -0700216 if (mdp_rev >= MDP_REV_41 || core_clk >= 90000000) { /* 90 Mhz */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700217 dmap_data = 0x47; /* 16 bytes-burst x 8 req */
218 vg_data = 0x47; /* 16 bytes-burs x 8 req */
219 } else {
220 dmap_data = 0x27; /* 8 bytes-burst x 8 req */
221 vg_data = 0x43; /* 16 bytes-burst x 4 req */
222 }
223
224 MSM_FB_DEBUG("mdp4_fetch_cfg: dmap=%x vg=%x\n",
225 dmap_data, vg_data);
226
227 /* dma_p fetch config */
228 outpdw(MDP_BASE + 0x91004, dmap_data);
229 /* dma_e fetch config */
230 outpdw(MDP_BASE + 0xB1004, dmap_data);
231
232 /*
233 * set up two vg pipes and two rgb pipes
234 */
235 base = MDP_BASE + MDP4_VIDEO_BASE;
236 for (i = 0; i < 4; i++) {
237 outpdw(base + 0x1004, vg_data);
238 base += MDP4_VIDEO_OFF;
239 }
240 /* MDP cmd block disable */
241 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
242}
243
244void mdp4_hw_init(void)
245{
246 ulong bits;
Ravishangar Kalyanam419051b2011-08-31 19:07:53 -0700247 uint32 clk_rate;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700248
249 /* MDP cmd block enable */
250 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
251
Nagamalleswararao Ganji074ee022011-09-02 12:06:37 -0700252 mdp4_update_perf_level(OVERLAY_PERF_LEVEL4);
253
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700254#ifdef MDP4_ERROR
255 /*
256 * Issue software reset on DMA_P will casue DMA_P dma engine stall
257 * on LCDC mode. However DMA_P does not stall at MDDI mode.
258 * This need further investigation.
259 */
260 mdp4_sw_reset(0x17);
261#endif
262
kuogee hsieh4b910f22011-11-15 09:43:04 -0800263 if (mdp_rev > MDP_REV_41) {
264 /* mdp chip select controller */
265 outpdw(MDP_BASE + 0x00c0, CS_CONTROLLER_0);
266 outpdw(MDP_BASE + 0x00c4, CS_CONTROLLER_1);
267 }
268
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700269 mdp4_clear_lcdc();
270
271 mdp4_mixer_blend_init(0);
272 mdp4_mixer_blend_init(1);
273 mdp4_vg_qseed_init(0);
274 mdp4_vg_qseed_init(1);
275
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -0800276 mdp4_vg_csc_setup(0);
277 mdp4_vg_csc_setup(1);
Rajesh Sastrulab52368b2011-12-22 12:09:17 -0800278 mdp4_mixer_csc_setup(1);
279 mdp4_mixer_csc_setup(2);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -0800280 mdp4_dmap_csc_setup();
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700281
Ravishangar Kalyaname7833e22011-07-22 16:20:19 -0700282 if (mdp_rev <= MDP_REV_41) {
283 mdp4_mixer_gc_lut_setup(0);
284 mdp4_mixer_gc_lut_setup(1);
285 }
286
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700287 mdp4_vg_igc_lut_setup(0);
288 mdp4_vg_igc_lut_setup(1);
289
290 mdp4_rgb_igc_lut_setup(0);
291 mdp4_rgb_igc_lut_setup(1);
292
293 outp32(MDP_EBI2_PORTMAP_MODE, 0x3);
294
295 /* system interrupts */
296
297 bits = mdp_intr_mask;
298 outpdw(MDP_BASE + 0x0050, bits);/* enable specififed interrupts */
299
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700300 /* For the max read pending cmd config below, if the MDP clock */
301 /* is less than the AXI clock, then we must use 3 pending */
302 /* pending requests. Otherwise, we should use 8 pending requests. */
303 /* In the future we should do this detection automatically. */
304
305 /* max read pending cmd config */
306 outpdw(MDP_BASE + 0x004c, 0x02222); /* 3 pending requests */
307
308#ifndef CONFIG_FB_MSM_OVERLAY
309 /* both REFRESH_MODE and DIRECT_OUT are ignored at BLT mode */
310 mdp4_overlay_cfg(MDP4_MIXER0, OVERLAY_MODE_BLT, 0, 0);
311 mdp4_overlay_cfg(MDP4_MIXER1, OVERLAY_MODE_BLT, 0, 0);
312#endif
313
Ravishangar Kalyanam419051b2011-08-31 19:07:53 -0700314 clk_rate = mdp_get_core_clk();
315 mdp4_fetch_cfg(clk_rate);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700316
317 /* Mark hardware as initialized. Only revisions > v2.1 have a register
318 * for tracking core reset status. */
319 if (mdp_hw_revision > MDP4_REVISION_V2_1)
320 outpdw(MDP_BASE + 0x003c, 1);
Ravishangar Kalyanam419051b2011-08-31 19:07:53 -0700321
322 /* MDP cmd block disable */
323 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700324}
325
326
327void mdp4_clear_lcdc(void)
328{
329 uint32 bits;
330
331 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
332
333 bits = inpdw(MDP_BASE + 0xc0000);
334 if (bits & 0x01) { /* enabled already */
335 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
336 return;
337 }
338
339 outpdw(MDP_BASE + 0xc0004, 0); /* vsync ctrl out */
340 outpdw(MDP_BASE + 0xc0008, 0); /* vsync period */
341 outpdw(MDP_BASE + 0xc000c, 0); /* vsync pusle width */
342 outpdw(MDP_BASE + 0xc0010, 0); /* lcdc display HCTL */
343 outpdw(MDP_BASE + 0xc0014, 0); /* lcdc display v start */
344 outpdw(MDP_BASE + 0xc0018, 0); /* lcdc display v end */
345 outpdw(MDP_BASE + 0xc001c, 0); /* lcdc active hctl */
346 outpdw(MDP_BASE + 0xc0020, 0); /* lcdc active v start */
347 outpdw(MDP_BASE + 0xc0024, 0); /* lcdc active v end */
348 outpdw(MDP_BASE + 0xc0028, 0); /* lcdc board color */
349 outpdw(MDP_BASE + 0xc002c, 0); /* lcdc underflow ctrl */
350 outpdw(MDP_BASE + 0xc0030, 0); /* lcdc hsync skew */
351 outpdw(MDP_BASE + 0xc0034, 0); /* lcdc test ctl */
352 outpdw(MDP_BASE + 0xc0038, 0); /* lcdc ctl polarity */
353
354 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
355}
356
357irqreturn_t mdp4_isr(int irq, void *ptr)
358{
359 uint32 isr, mask, panel;
360 struct mdp_dma_data *dma;
361
362 mdp_is_in_isr = TRUE;
363
364 /* complete all the reads before reading the interrupt
365 * status register - eliminate effects of speculative
366 * reads by the cpu
367 */
368 rmb();
369 isr = inpdw(MDP_INTR_STATUS);
370 if (isr == 0)
371 goto out;
372
373 mdp4_stat.intr_tot++;
374 mask = inpdw(MDP_INTR_ENABLE);
375 outpdw(MDP_INTR_CLEAR, isr);
376
377 if (isr & INTR_PRIMARY_INTF_UDERRUN) {
378 mdp4_stat.intr_underrun_p++;
379 /* When underun occurs mdp clear the histogram registers
380 that are set before in hw_init so restore them back so
381 that histogram works.*/
382 MDP_OUTP(MDP_BASE + 0x95010, 1);
383 outpdw(MDP_BASE + 0x9501c, INTR_HIST_DONE);
Carl Vanderlip6cc11c42012-02-07 15:25:46 -0800384 mdp_is_hist_valid = FALSE;
385 __mdp_histogram_reset();
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700386 }
387
388 if (isr & INTR_EXTERNAL_INTF_UDERRUN)
389 mdp4_stat.intr_underrun_e++;
390
391 isr &= mask;
392
393 if (isr == 0)
394 goto out;
395
396 panel = mdp4_overlay_panel_list();
397 if (isr & INTR_PRIMARY_VSYNC) {
kuogee hsieh0948c682011-10-31 16:50:43 -0700398 mdp4_stat.intr_vsync_p++;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700399 dma = &dma2_data;
400 spin_lock(&mdp_spin_lock);
401 mdp_intr_mask &= ~INTR_PRIMARY_VSYNC;
402 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
403 dma->waiting = FALSE;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700404 if (panel & MDP4_PANEL_LCDC)
405 mdp4_primary_vsync_lcdc();
406#ifdef CONFIG_FB_MSM_MIPI_DSI
407 else if (panel & MDP4_PANEL_DSI_VIDEO)
408 mdp4_primary_vsync_dsi_video();
409#endif
kuogee hsieh3de11f32011-07-08 14:09:11 -0700410 spin_unlock(&mdp_spin_lock);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700411 }
412#ifdef CONFIG_FB_MSM_DTV
413 if (isr & INTR_EXTERNAL_VSYNC) {
kuogee hsieh0948c682011-10-31 16:50:43 -0700414 mdp4_stat.intr_vsync_e++;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700415 dma = &dma_e_data;
416 spin_lock(&mdp_spin_lock);
417 mdp_intr_mask &= ~INTR_EXTERNAL_VSYNC;
418 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
419 dma->waiting = FALSE;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700420 if (panel & MDP4_PANEL_DTV)
421 mdp4_external_vsync_dtv();
kuogee hsieh3de11f32011-07-08 14:09:11 -0700422 spin_unlock(&mdp_spin_lock);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700423 }
424#endif
kuogee hsieh40a43402011-10-04 08:48:18 -0700425
426#ifdef CONFIG_FB_MSM_OVERLAY
427 if (isr & INTR_OVERLAY0_DONE) {
428 mdp4_stat.intr_overlay0++;
429 dma = &dma2_data;
430 if (panel & (MDP4_PANEL_LCDC | MDP4_PANEL_DSI_VIDEO)) {
431 /* disable LCDC interrupt */
432 spin_lock(&mdp_spin_lock);
433 mdp_intr_mask &= ~INTR_OVERLAY0_DONE;
434 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
435 dma->waiting = FALSE;
436 spin_unlock(&mdp_spin_lock);
437 if (panel & MDP4_PANEL_LCDC)
438 mdp4_overlay0_done_lcdc(dma);
439#ifdef CONFIG_FB_MSM_MIPI_DSI
440 else if (panel & MDP4_PANEL_DSI_VIDEO)
441 mdp4_overlay0_done_dsi_video(dma);
442#endif
443 } else { /* MDDI, DSI_CMD */
444#ifdef CONFIG_FB_MSM_MIPI_DSI
445 if (panel & MDP4_PANEL_DSI_CMD)
446 mdp4_overlay0_done_dsi_cmd(dma);
447#else
448 if (panel & MDP4_PANEL_MDDI)
449 mdp4_overlay0_done_mddi(dma);
450#endif
451 }
452 mdp_hw_cursor_done();
453 }
454 if (isr & INTR_OVERLAY1_DONE) {
455 mdp4_stat.intr_overlay1++;
456 /* disable DTV interrupt */
457 dma = &dma_e_data;
458 spin_lock(&mdp_spin_lock);
459 mdp_intr_mask &= ~INTR_OVERLAY1_DONE;
460 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
461 dma->waiting = FALSE;
462 spin_unlock(&mdp_spin_lock);
463#if defined(CONFIG_FB_MSM_DTV)
464 if (panel & MDP4_PANEL_DTV)
465 mdp4_overlay1_done_dtv();
466#endif
467#if defined(CONFIG_FB_MSM_TVOUT)
468 if (panel & MDP4_PANEL_ATV)
469 mdp4_overlay1_done_atv();
470#endif
Rajesh Sastrulab52368b2011-12-22 12:09:17 -0800471 }
Vinay Kalia27020d12011-10-14 17:50:29 -0700472#if defined(CONFIG_FB_MSM_WRITEBACK_MSM_PANEL)
Rajesh Sastrulab52368b2011-12-22 12:09:17 -0800473 if (isr & INTR_OVERLAY2_DONE) {
474 mdp4_stat.intr_overlay2++;
475 /* disable DTV interrupt */
476 dma = &dma_wb_data;
477 spin_lock(&mdp_spin_lock);
478 mdp_intr_mask &= ~INTR_OVERLAY2_DONE;
479 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
480 dma->waiting = FALSE;
481 spin_unlock(&mdp_spin_lock);
Vinay Kalia27020d12011-10-14 17:50:29 -0700482 if (panel & MDP4_PANEL_WRITEBACK)
483 mdp4_overlay1_done_writeback(dma);
kuogee hsieh40a43402011-10-04 08:48:18 -0700484 }
Rajesh Sastrulab52368b2011-12-22 12:09:17 -0800485#endif
kuogee hsieh40a43402011-10-04 08:48:18 -0700486#endif /* OVERLAY */
487
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700488 if (isr & INTR_DMA_P_DONE) {
489 mdp4_stat.intr_dma_p++;
490 dma = &dma2_data;
491 if (panel & MDP4_PANEL_LCDC) {
492 /* disable LCDC interrupt */
493 spin_lock(&mdp_spin_lock);
494 mdp_intr_mask &= ~INTR_DMA_P_DONE;
495 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
496 dma->waiting = FALSE;
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700497 mdp4_dma_p_done_lcdc();
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700498 spin_unlock(&mdp_spin_lock);
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700499 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700500#ifdef CONFIG_FB_MSM_OVERLAY
501#ifdef CONFIG_FB_MSM_MIPI_DSI
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700502 else if (panel & MDP4_PANEL_DSI_VIDEO) {
503 /* disable LCDC interrupt */
504 spin_lock(&mdp_spin_lock);
505 mdp_intr_mask &= ~INTR_DMA_P_DONE;
506 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
507 dma->waiting = FALSE;
508 mdp4_dma_p_done_dsi_video();
509 spin_unlock(&mdp_spin_lock);
510 } else if (panel & MDP4_PANEL_DSI_CMD) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700511 mdp4_dma_p_done_dsi(dma);
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700512 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700513#else
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700514 else { /* MDDI */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700515 mdp4_dma_p_done_mddi();
516 mdp_pipe_ctrl(MDP_DMA2_BLOCK,
517 MDP_BLOCK_POWER_OFF, TRUE);
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700518 complete(&dma->comp);
519 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700520#endif
521#else
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700522 else {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700523 spin_lock(&mdp_spin_lock);
524 dma->busy = FALSE;
525 spin_unlock(&mdp_spin_lock);
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700526 complete(&dma->comp);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700527 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700528#endif
529 }
530 if (isr & INTR_DMA_S_DONE) {
531 mdp4_stat.intr_dma_s++;
532#if defined(CONFIG_FB_MSM_OVERLAY) && defined(CONFIG_FB_MSM_MDDI)
533 dma = &dma2_data;
534#else
535 dma = &dma_s_data;
536#endif
537
538 dma->busy = FALSE;
539 mdp_pipe_ctrl(MDP_DMA_S_BLOCK,
540 MDP_BLOCK_POWER_OFF, TRUE);
541 complete(&dma->comp);
542 }
543 if (isr & INTR_DMA_E_DONE) {
544 mdp4_stat.intr_dma_e++;
545 dma = &dma_e_data;
546 spin_lock(&mdp_spin_lock);
547 mdp_intr_mask &= ~INTR_DMA_E_DONE;
548 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
549 dma->busy = FALSE;
Huaibin Yang0da46922011-11-29 15:08:04 -0800550 mdp4_dma_e_done_dtv();
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700551 if (dma->waiting) {
552 dma->waiting = FALSE;
553 complete(&dma->comp);
554 }
555 spin_unlock(&mdp_spin_lock);
556 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700557 if (isr & INTR_DMA_P_HISTOGRAM) {
kuogee hsieh0948c682011-10-31 16:50:43 -0700558 mdp4_stat.intr_histogram++;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700559 isr = inpdw(MDP_DMA_P_HIST_INTR_STATUS);
560 mask = inpdw(MDP_DMA_P_HIST_INTR_ENABLE);
561 outpdw(MDP_DMA_P_HIST_INTR_CLEAR, isr);
Ravishangar Kalyanam115d7972011-08-09 12:52:14 -0700562 mb();
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700563 isr &= mask;
Carl Vanderlip6cc11c42012-02-07 15:25:46 -0800564 if (isr & INTR_HIST_RESET_SEQ_DONE)
565 __mdp_histogram_kickoff();
566
Carl Vanderlipe2833e92011-09-27 13:26:01 -0700567 if (isr & INTR_HIST_DONE) {
Carl Vanderlip6cc11c42012-02-07 15:25:46 -0800568 if (waitqueue_active(&mdp_hist_comp.wait)) {
569 if (!queue_work(mdp_hist_wq,
570 &mdp_histogram_worker)) {
571 pr_err("%s - can't queue hist_read\n",
572 __func__);
Carl Vanderlipe2833e92011-09-27 13:26:01 -0700573 }
Carl Vanderlip6cc11c42012-02-07 15:25:46 -0800574 } else
575 __mdp_histogram_reset();
Carl Vanderlipe2833e92011-09-27 13:26:01 -0700576 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700577 }
578
579out:
580 mdp_is_in_isr = FALSE;
581
582 return IRQ_HANDLED;
583}
584
585
586/*
587 * QSEED tables
588 */
589
590static uint32 vg_qseed_table0[] = {
591 0x5556aaff, 0x00000000, 0x00000000, 0x00000000
592};
593
594static uint32 vg_qseed_table1[] = {
Carl Vanderlipd89c0e72012-03-28 10:17:20 -0700595 0x00000000, 0x20000000,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700596};
597
598static uint32 vg_qseed_table2[] = {
599 0x02000000, 0x00000000, 0x01ff0ff9, 0x00000008,
600 0x01fb0ff2, 0x00000013, 0x01f50fed, 0x0ffe0020,
601 0x01ed0fe8, 0x0ffd002e, 0x01e30fe4, 0x0ffb003e,
602 0x01d80fe1, 0x0ff9004e, 0x01cb0fde, 0x0ff70060,
603 0x01bc0fdc, 0x0ff40074, 0x01ac0fdb, 0x0ff20087,
604 0x019a0fdb, 0x0fef009c, 0x01870fdb, 0x0fed00b1,
605 0x01740fdb, 0x0fea00c7, 0x01600fdc, 0x0fe700dd,
606 0x014b0fdd, 0x0fe500f3, 0x01350fdf, 0x0fe30109,
607 0x01200fe0, 0x0fe00120, 0x01090fe3, 0x0fdf0135,
608 0x00f30fe5, 0x0fdd014b, 0x00dd0fe7, 0x0fdc0160,
609 0x00c70fea, 0x0fdb0174, 0x00b10fed, 0x0fdb0187,
610 0x009c0fef, 0x0fdb019a, 0x00870ff2, 0x0fdb01ac,
611 0x00740ff4, 0x0fdc01bc, 0x00600ff7, 0x0fde01cb,
612 0x004e0ff9, 0x0fe101d8, 0x003e0ffb, 0x0fe401e3,
613 0x002e0ffd, 0x0fe801ed, 0x00200ffe, 0x0fed01f5,
614 0x00130000, 0x0ff201fb, 0x00080000, 0x0ff901ff,
615
616 0x02000000, 0x00000000, 0x02000000, 0x00000000,
617 0x02000000, 0x00000000, 0x02000000, 0x00000000,
618 0x02000000, 0x00000000, 0x02000000, 0x00000000,
619 0x02000000, 0x00000000, 0x02000000, 0x00000000,
620 0x02000000, 0x00000000, 0x02000000, 0x00000000,
621 0x02000000, 0x00000000, 0x02000000, 0x00000000,
622 0x02000000, 0x00000000, 0x02000000, 0x00000000,
623 0x02000000, 0x00000000, 0x02000000, 0x00000000,
624 0x02000000, 0x00000000, 0x02000000, 0x00000000,
625 0x02000000, 0x00000000, 0x02000000, 0x00000000,
626 0x02000000, 0x00000000, 0x02000000, 0x00000000,
627 0x02000000, 0x00000000, 0x02000000, 0x00000000,
628 0x02000000, 0x00000000, 0x02000000, 0x00000000,
629 0x02000000, 0x00000000, 0x02000000, 0x00000000,
630 0x02000000, 0x00000000, 0x02000000, 0x00000000,
631 0x02000000, 0x00000000, 0x02000000, 0x00000000,
632
633 0x02000000, 0x00000000, 0x01fc0ff9, 0x0ffe000d,
634 0x01f60ff3, 0x0ffb001c, 0x01ef0fed, 0x0ff9002b,
635 0x01e60fe8, 0x0ff6003c, 0x01dc0fe4, 0x0ff3004d,
636 0x01d00fe0, 0x0ff1005f, 0x01c30fde, 0x0fee0071,
637 0x01b50fdb, 0x0feb0085, 0x01a70fd9, 0x0fe80098,
638 0x01960fd8, 0x0fe600ac, 0x01850fd7, 0x0fe300c1,
639 0x01730fd7, 0x0fe100d5, 0x01610fd7, 0x0fdf00e9,
640 0x014e0fd8, 0x0fdd00fd, 0x013b0fd8, 0x0fdb0112,
641 0x01250fda, 0x0fda0127, 0x01120fdb, 0x0fd8013b,
642 0x00fd0fdd, 0x0fd8014e, 0x00e90fdf, 0x0fd70161,
643 0x00d50fe1, 0x0fd70173, 0x00c10fe3, 0x0fd70185,
644 0x00ac0fe6, 0x0fd80196, 0x00980fe8, 0x0fd901a7,
645 0x00850feb, 0x0fdb01b5, 0x00710fee, 0x0fde01c3,
646 0x005f0ff1, 0x0fe001d0, 0x004d0ff3, 0x0fe401dc,
647 0x003c0ff6, 0x0fe801e6, 0x002b0ff9, 0x0fed01ef,
648 0x001c0ffb, 0x0ff301f6, 0x000d0ffe, 0x0ff901fc,
649
650 0x020f0034, 0x0f7a0043, 0x01e80023, 0x0fa8004d,
651 0x01d30016, 0x0fbe0059, 0x01c6000a, 0x0fc90067,
652 0x01bd0000, 0x0fce0075, 0x01b50ff7, 0x0fcf0085,
653 0x01ae0fee, 0x0fcf0095, 0x01a70fe6, 0x0fcd00a6,
654 0x019d0fe0, 0x0fcb00b8, 0x01940fd9, 0x0fc900ca,
655 0x01890fd4, 0x0fc700dc, 0x017d0fcf, 0x0fc600ee,
656 0x01700fcc, 0x0fc40100, 0x01620fc9, 0x0fc40111,
657 0x01540fc6, 0x0fc30123, 0x01430fc5, 0x0fc40134,
658 0x01340fc4, 0x0fc50143, 0x01230fc3, 0x0fc60154,
659 0x01110fc4, 0x0fc90162, 0x01000fc4, 0x0fcc0170,
660 0x00ee0fc6, 0x0fcf017d, 0x00dc0fc7, 0x0fd40189,
661 0x00ca0fc9, 0x0fd90194, 0x00b80fcb, 0x0fe0019d,
662 0x00a60fcd, 0x0fe601a7, 0x00950fcf, 0x0fee01ae,
663 0x00850fcf, 0x0ff701b5, 0x00750fce, 0x000001bd,
664 0x00670fc9, 0x000a01c6, 0x00590fbe, 0x001601d3,
665 0x004d0fa8, 0x002301e8, 0x00430f7a, 0x0034020f,
666
667 0x015c005e, 0x0fde0068, 0x015c0054, 0x0fdd0073,
668 0x015b004b, 0x0fdc007e, 0x015a0042, 0x0fdb0089,
669 0x01590039, 0x0fda0094, 0x01560030, 0x0fda00a0,
670 0x01530028, 0x0fda00ab, 0x014f0020, 0x0fda00b7,
671 0x014a0019, 0x0fdb00c2, 0x01450011, 0x0fdc00ce,
672 0x013e000b, 0x0fde00d9, 0x01390004, 0x0fdf00e4,
673 0x01310ffe, 0x0fe200ef, 0x01290ff9, 0x0fe400fa,
674 0x01200ff4, 0x0fe80104, 0x01180fef, 0x0feb010e,
675 0x010e0feb, 0x0fef0118, 0x01040fe8, 0x0ff40120,
676 0x00fa0fe4, 0x0ff90129, 0x00ef0fe2, 0x0ffe0131,
677 0x00e40fdf, 0x00040139, 0x00d90fde, 0x000b013e,
678 0x00ce0fdc, 0x00110145, 0x00c20fdb, 0x0019014a,
679 0x00b70fda, 0x0020014f, 0x00ab0fda, 0x00280153,
680 0x00a00fda, 0x00300156, 0x00940fda, 0x00390159,
681 0x00890fdb, 0x0042015a, 0x007e0fdc, 0x004b015b,
682 0x00730fdd, 0x0054015c, 0x00680fde, 0x005e015c,
683
684 0x01300068, 0x0ff80070, 0x01300060, 0x0ff80078,
685 0x012f0059, 0x0ff80080, 0x012d0052, 0x0ff80089,
686 0x012b004b, 0x0ff90091, 0x01290044, 0x0ff9009a,
687 0x0126003d, 0x0ffa00a3, 0x01220037, 0x0ffb00ac,
688 0x011f0031, 0x0ffc00b4, 0x011a002b, 0x0ffe00bd,
689 0x01150026, 0x000000c5, 0x010f0021, 0x000200ce,
690 0x010a001c, 0x000400d6, 0x01030018, 0x000600df,
691 0x00fd0014, 0x000900e6, 0x00f60010, 0x000c00ee,
692 0x00ee000c, 0x001000f6, 0x00e60009, 0x001400fd,
693 0x00df0006, 0x00180103, 0x00d60004, 0x001c010a,
694 0x00ce0002, 0x0021010f, 0x00c50000, 0x00260115,
695 0x00bd0ffe, 0x002b011a, 0x00b40ffc, 0x0031011f,
696 0x00ac0ffb, 0x00370122, 0x00a30ffa, 0x003d0126,
697 0x009a0ff9, 0x00440129, 0x00910ff9, 0x004b012b,
698 0x00890ff8, 0x0052012d, 0x00800ff8, 0x0059012f,
699 0x00780ff8, 0x00600130, 0x00700ff8, 0x00680130,
700
701 0x01050079, 0x0003007f, 0x01040073, 0x00030086,
702 0x0103006d, 0x0004008c, 0x01030066, 0x00050092,
703 0x01010060, 0x00060099, 0x0100005a, 0x0007009f,
704 0x00fe0054, 0x000900a5, 0x00fa004f, 0x000b00ac,
705 0x00f80049, 0x000d00b2, 0x00f50044, 0x000f00b8,
706 0x00f2003f, 0x001200bd, 0x00ef0039, 0x001500c3,
707 0x00ea0035, 0x001800c9, 0x00e60030, 0x001c00ce,
708 0x00e3002b, 0x001f00d3, 0x00dd0027, 0x002300d9,
709 0x00d90023, 0x002700dd, 0x00d3001f, 0x002b00e3,
710 0x00ce001c, 0x003000e6, 0x00c90018, 0x003500ea,
711 0x00c30015, 0x003900ef, 0x00bd0012, 0x003f00f2,
712 0x00b8000f, 0x004400f5, 0x00b2000d, 0x004900f8,
713 0x00ac000b, 0x004f00fa, 0x00a50009, 0x005400fe,
714 0x009f0007, 0x005a0100, 0x00990006, 0x00600101,
715 0x00920005, 0x00660103, 0x008c0004, 0x006d0103,
716 0x00860003, 0x00730104, 0x007f0003, 0x00790105,
717
718 0x00cf0088, 0x001d008c, 0x00ce0084, 0x0020008e,
719 0x00cd0080, 0x00210092, 0x00cd007b, 0x00240094,
720 0x00ca0077, 0x00270098, 0x00c90073, 0x0029009b,
721 0x00c8006f, 0x002c009d, 0x00c6006b, 0x002f00a0,
722 0x00c50067, 0x003200a2, 0x00c30062, 0x003600a5,
723 0x00c0005f, 0x003900a8, 0x00c0005b, 0x003b00aa,
724 0x00be0057, 0x003e00ad, 0x00ba0054, 0x004200b0,
725 0x00b90050, 0x004500b2, 0x00b7004c, 0x004900b4,
726 0x00b40049, 0x004c00b7, 0x00b20045, 0x005000b9,
727 0x00b00042, 0x005400ba, 0x00ad003e, 0x005700be,
728 0x00aa003b, 0x005b00c0, 0x00a80039, 0x005f00c0,
729 0x00a50036, 0x006200c3, 0x00a20032, 0x006700c5,
730 0x00a0002f, 0x006b00c6, 0x009d002c, 0x006f00c8,
731 0x009b0029, 0x007300c9, 0x00980027, 0x007700ca,
732 0x00940024, 0x007b00cd, 0x00920021, 0x008000cd,
733 0x008e0020, 0x008400ce, 0x008c001d, 0x008800cf,
734
735 0x008e0083, 0x006b0084, 0x008d0083, 0x006c0084,
736 0x008d0082, 0x006d0084, 0x008d0081, 0x006d0085,
737 0x008d0080, 0x006e0085, 0x008c007f, 0x006f0086,
738 0x008b007f, 0x00700086, 0x008b007e, 0x00710086,
739 0x008b007d, 0x00720086, 0x008a007d, 0x00730086,
740 0x008a007c, 0x00730087, 0x008a007b, 0x00740087,
741 0x0089007b, 0x00750087, 0x008a0079, 0x00750088,
742 0x008a0078, 0x00760088, 0x008a0077, 0x00770088,
743 0x00880077, 0x0077008a, 0x00880076, 0x0078008a,
744 0x00880075, 0x0079008a, 0x00870075, 0x007b0089,
745 0x00870074, 0x007b008a, 0x00870073, 0x007c008a,
746 0x00860073, 0x007d008a, 0x00860072, 0x007d008b,
747 0x00860071, 0x007e008b, 0x00860070, 0x007f008b,
748 0x0086006f, 0x007f008c, 0x0085006e, 0x0080008d,
749 0x0085006d, 0x0081008d, 0x0084006d, 0x0082008d,
750 0x0084006c, 0x0083008d, 0x0084006b, 0x0083008e,
751
752 0x023c0fe2, 0x00000fe2, 0x023a0fdb, 0x00000feb,
753 0x02360fd3, 0x0fff0ff8, 0x022e0fcf, 0x0ffc0007,
754 0x02250fca, 0x0ffa0017, 0x021a0fc6, 0x0ff70029,
755 0x020c0fc4, 0x0ff4003c, 0x01fd0fc1, 0x0ff10051,
756 0x01eb0fc0, 0x0fed0068, 0x01d80fc0, 0x0fe9007f,
757 0x01c30fc1, 0x0fe50097, 0x01ac0fc2, 0x0fe200b0,
758 0x01960fc3, 0x0fdd00ca, 0x017e0fc5, 0x0fd900e4,
759 0x01650fc8, 0x0fd500fe, 0x014b0fcb, 0x0fd20118,
760 0x01330fcd, 0x0fcd0133, 0x01180fd2, 0x0fcb014b,
761 0x00fe0fd5, 0x0fc80165, 0x00e40fd9, 0x0fc5017e,
762 0x00ca0fdd, 0x0fc30196, 0x00b00fe2, 0x0fc201ac,
763 0x00970fe5, 0x0fc101c3, 0x007f0fe9, 0x0fc001d8,
764 0x00680fed, 0x0fc001eb, 0x00510ff1, 0x0fc101fd,
765 0x003c0ff4, 0x0fc4020c, 0x00290ff7, 0x0fc6021a,
766 0x00170ffa, 0x0fca0225, 0x00070ffc, 0x0fcf022e,
767 0x0ff80fff, 0x0fd30236, 0x0feb0000, 0x0fdb023a,
768
769 0x02780fc4, 0x00000fc4, 0x02770fbc, 0x0fff0fce,
770 0x02710fb5, 0x0ffe0fdc, 0x02690fb0, 0x0ffa0fed,
771 0x025f0fab, 0x0ff70fff, 0x02500fa8, 0x0ff30015,
772 0x02410fa6, 0x0fef002a, 0x022f0fa4, 0x0feb0042,
773 0x021a0fa4, 0x0fe5005d, 0x02040fa5, 0x0fe10076,
774 0x01eb0fa7, 0x0fdb0093, 0x01d20fa9, 0x0fd600af,
775 0x01b80fab, 0x0fd000cd, 0x019d0faf, 0x0fca00ea,
776 0x01810fb2, 0x0fc50108, 0x01620fb7, 0x0fc10126,
777 0x01440fbb, 0x0fbb0146, 0x01260fc1, 0x0fb70162,
778 0x01080fc5, 0x0fb20181, 0x00ea0fca, 0x0faf019d,
779 0x00cd0fd0, 0x0fab01b8, 0x00af0fd6, 0x0fa901d2,
780 0x00930fdb, 0x0fa701eb, 0x00760fe1, 0x0fa50204,
781 0x005d0fe5, 0x0fa4021a, 0x00420feb, 0x0fa4022f,
782 0x002a0fef, 0x0fa60241, 0x00150ff3, 0x0fa80250,
783 0x0fff0ff7, 0x0fab025f, 0x0fed0ffa, 0x0fb00269,
784 0x0fdc0ffe, 0x0fb50271, 0x0fce0fff, 0x0fbc0277,
785
786 0x02a00fb0, 0x00000fb0, 0x029e0fa8, 0x0fff0fbb,
787 0x02980fa1, 0x0ffd0fca, 0x028f0f9c, 0x0ff90fdc,
788 0x02840f97, 0x0ff50ff0, 0x02740f94, 0x0ff10007,
789 0x02640f92, 0x0fec001e, 0x02500f91, 0x0fe70038,
790 0x023a0f91, 0x0fe00055, 0x02220f92, 0x0fdb0071,
791 0x02080f95, 0x0fd4008f, 0x01ec0f98, 0x0fce00ae,
792 0x01cf0f9b, 0x0fc700cf, 0x01b10f9f, 0x0fc100ef,
793 0x01920fa4, 0x0fbb010f, 0x01710faa, 0x0fb50130,
794 0x01520fae, 0x0fae0152, 0x01300fb5, 0x0faa0171,
795 0x010f0fbb, 0x0fa40192, 0x00ef0fc1, 0x0f9f01b1,
796 0x00cf0fc7, 0x0f9b01cf, 0x00ae0fce, 0x0f9801ec,
797 0x008f0fd4, 0x0f950208, 0x00710fdb, 0x0f920222,
798 0x00550fe0, 0x0f91023a, 0x00380fe7, 0x0f910250,
799 0x001e0fec, 0x0f920264, 0x00070ff1, 0x0f940274,
800 0x0ff00ff5, 0x0f970284, 0x0fdc0ff9, 0x0f9c028f,
801 0x0fca0ffd, 0x0fa10298, 0x0fbb0fff, 0x0fa8029e,
802
803 0x02c80f9c, 0x00000f9c, 0x02c70f94, 0x0ffe0fa7,
804 0x02c10f8c, 0x0ffc0fb7, 0x02b70f87, 0x0ff70fcb,
805 0x02aa0f83, 0x0ff30fe0, 0x02990f80, 0x0fee0ff9,
806 0x02870f7f, 0x0fe80012, 0x02720f7e, 0x0fe2002e,
807 0x025a0f7e, 0x0fdb004d, 0x02400f80, 0x0fd5006b,
808 0x02230f84, 0x0fcd008c, 0x02050f87, 0x0fc700ad,
809 0x01e60f8b, 0x0fbf00d0, 0x01c60f90, 0x0fb700f3,
810 0x01a30f96, 0x0fb00117, 0x01800f9c, 0x0faa013a,
811 0x015d0fa2, 0x0fa2015f, 0x013a0faa, 0x0f9c0180,
812 0x01170fb0, 0x0f9601a3, 0x00f30fb7, 0x0f9001c6,
813 0x00d00fbf, 0x0f8b01e6, 0x00ad0fc7, 0x0f870205,
814 0x008c0fcd, 0x0f840223, 0x006b0fd5, 0x0f800240,
815 0x004d0fdb, 0x0f7e025a, 0x002e0fe2, 0x0f7e0272,
816 0x00120fe8, 0x0f7f0287, 0x0ff90fee, 0x0f800299,
817 0x0fe00ff3, 0x0f8302aa, 0x0fcb0ff7, 0x0f8702b7,
818 0x0fb70ffc, 0x0f8c02c1, 0x0fa70ffe, 0x0f9402c7,
819
820 0x02f00f88, 0x00000f88, 0x02ee0f80, 0x0ffe0f94,
821 0x02e70f78, 0x0ffc0fa5, 0x02dd0f73, 0x0ff60fba,
822 0x02ce0f6f, 0x0ff20fd1, 0x02be0f6c, 0x0feb0feb,
823 0x02aa0f6b, 0x0fe50006, 0x02940f6a, 0x0fde0024,
824 0x02790f6c, 0x0fd60045, 0x025e0f6e, 0x0fcf0065,
825 0x023f0f72, 0x0fc60089, 0x021d0f77, 0x0fbf00ad,
826 0x01fd0f7b, 0x0fb600d2, 0x01da0f81, 0x0fad00f8,
827 0x01b50f87, 0x0fa6011e, 0x018f0f8f, 0x0f9e0144,
828 0x016b0f95, 0x0f95016b, 0x01440f9e, 0x0f8f018f,
829 0x011e0fa6, 0x0f8701b5, 0x00f80fad, 0x0f8101da,
830 0x00d20fb6, 0x0f7b01fd, 0x00ad0fbf, 0x0f77021d,
831 0x00890fc6, 0x0f72023f, 0x00650fcf, 0x0f6e025e,
832 0x00450fd6, 0x0f6c0279, 0x00240fde, 0x0f6a0294,
833 0x00060fe5, 0x0f6b02aa, 0x0feb0feb, 0x0f6c02be,
834 0x0fd10ff2, 0x0f6f02ce, 0x0fba0ff6, 0x0f7302dd,
835 0x0fa50ffc, 0x0f7802e7, 0x0f940ffe, 0x0f8002ee,
836
837 0x03180f74, 0x00000f74, 0x03160f6b, 0x0ffe0f81,
838 0x030e0f64, 0x0ffb0f93, 0x03030f5f, 0x0ff50fa9,
839 0x02f40f5b, 0x0ff00fc1, 0x02e20f58, 0x0fe90fdd,
840 0x02cd0f57, 0x0fe20ffa, 0x02b60f57, 0x0fda0019,
841 0x02990f59, 0x0fd1003d, 0x027b0f5c, 0x0fc90060,
842 0x02590f61, 0x0fc00086, 0x02370f66, 0x0fb700ac,
843 0x02130f6b, 0x0fae00d4, 0x01ee0f72, 0x0fa400fc,
844 0x01c70f79, 0x0f9b0125, 0x019f0f81, 0x0f93014d,
845 0x01760f89, 0x0f890178, 0x014d0f93, 0x0f81019f,
846 0x01250f9b, 0x0f7901c7, 0x00fc0fa4, 0x0f7201ee,
847 0x00d40fae, 0x0f6b0213, 0x00ac0fb7, 0x0f660237,
848 0x00860fc0, 0x0f610259, 0x00600fc9, 0x0f5c027b,
849 0x003d0fd1, 0x0f590299, 0x00190fda, 0x0f5702b6,
850 0x0ffa0fe2, 0x0f5702cd, 0x0fdd0fe9, 0x0f5802e2,
851 0x0fc10ff0, 0x0f5b02f4, 0x0fa90ff5, 0x0f5f0303,
852 0x0f930ffb, 0x0f64030e, 0x0f810ffe, 0x0f6b0316,
853
854 0x03400f60, 0x00000f60, 0x033e0f57, 0x0ffe0f6d,
855 0x03370f4f, 0x0ffa0f80, 0x032a0f4b, 0x0ff30f98,
856 0x031a0f46, 0x0fee0fb2, 0x03070f44, 0x0fe60fcf,
857 0x02f10f44, 0x0fde0fed, 0x02d70f44, 0x0fd6000f,
858 0x02b80f46, 0x0fcc0036, 0x02990f4a, 0x0fc3005a,
859 0x02750f4f, 0x0fb90083, 0x02500f55, 0x0fb000ab,
860 0x022a0f5b, 0x0fa500d6, 0x02020f63, 0x0f9a0101,
861 0x01d80f6b, 0x0f91012c, 0x01ae0f74, 0x0f870157,
862 0x01840f7c, 0x0f7c0184, 0x01570f87, 0x0f7401ae,
863 0x012c0f91, 0x0f6b01d8, 0x01010f9a, 0x0f630202,
864 0x00d60fa5, 0x0f5b022a, 0x00ab0fb0, 0x0f550250,
865 0x00830fb9, 0x0f4f0275, 0x005a0fc3, 0x0f4a0299,
866 0x00360fcc, 0x0f4602b8, 0x000f0fd6, 0x0f4402d7,
867 0x0fed0fde, 0x0f4402f1, 0x0fcf0fe6, 0x0f440307,
868 0x0fb20fee, 0x0f46031a, 0x0f980ff3, 0x0f4b032a,
869 0x0f800ffa, 0x0f4f0337, 0x0f6d0ffe, 0x0f57033e,
870
871 0x02000000, 0x00000000, 0x01ff0ff9, 0x00000008,
872 0x01fb0ff2, 0x00000013, 0x01f50fed, 0x0ffe0020,
873 0x01ed0fe8, 0x0ffd002e, 0x01e30fe4, 0x0ffb003e,
874 0x01d80fe1, 0x0ff9004e, 0x01cb0fde, 0x0ff70060,
875 0x01bc0fdc, 0x0ff40074, 0x01ac0fdb, 0x0ff20087,
876 0x019a0fdb, 0x0fef009c, 0x01870fdb, 0x0fed00b1,
877 0x01740fdb, 0x0fea00c7, 0x01600fdc, 0x0fe700dd,
878 0x014b0fdd, 0x0fe500f3, 0x01350fdf, 0x0fe30109,
879 0x01200fe0, 0x0fe00120, 0x01090fe3, 0x0fdf0135,
880 0x00f30fe5, 0x0fdd014b, 0x00dd0fe7, 0x0fdc0160,
881 0x00c70fea, 0x0fdb0174, 0x00b10fed, 0x0fdb0187,
882 0x009c0fef, 0x0fdb019a, 0x00870ff2, 0x0fdb01ac,
883 0x00740ff4, 0x0fdc01bc, 0x00600ff7, 0x0fde01cb,
884 0x004e0ff9, 0x0fe101d8, 0x003e0ffb, 0x0fe401e3,
885 0x002e0ffd, 0x0fe801ed, 0x00200ffe, 0x0fed01f5,
886 0x00130000, 0x0ff201fb, 0x00080000, 0x0ff901ff,
887
888 0x02000000, 0x00000000, 0x02000000, 0x00000000,
889 0x02000000, 0x00000000, 0x02000000, 0x00000000,
890 0x02000000, 0x00000000, 0x02000000, 0x00000000,
891 0x02000000, 0x00000000, 0x02000000, 0x00000000,
892 0x02000000, 0x00000000, 0x02000000, 0x00000000,
893 0x02000000, 0x00000000, 0x02000000, 0x00000000,
894 0x02000000, 0x00000000, 0x02000000, 0x00000000,
895 0x02000000, 0x00000000, 0x02000000, 0x00000000,
896 0x02000000, 0x00000000, 0x02000000, 0x00000000,
897 0x02000000, 0x00000000, 0x02000000, 0x00000000,
898 0x02000000, 0x00000000, 0x02000000, 0x00000000,
899 0x02000000, 0x00000000, 0x02000000, 0x00000000,
900 0x02000000, 0x00000000, 0x02000000, 0x00000000,
901 0x02000000, 0x00000000, 0x02000000, 0x00000000,
902 0x02000000, 0x00000000, 0x02000000, 0x00000000,
903 0x02000000, 0x00000000, 0x02000000, 0x00000000,
904
905 0x02000000, 0x00000000, 0x01fc0ff9, 0x0ffe000d,
906 0x01f60ff3, 0x0ffb001c, 0x01ef0fed, 0x0ff9002b,
907 0x01e60fe8, 0x0ff6003c, 0x01dc0fe4, 0x0ff3004d,
908 0x01d00fe0, 0x0ff1005f, 0x01c30fde, 0x0fee0071,
909 0x01b50fdb, 0x0feb0085, 0x01a70fd9, 0x0fe80098,
910 0x01960fd8, 0x0fe600ac, 0x01850fd7, 0x0fe300c1,
911 0x01730fd7, 0x0fe100d5, 0x01610fd7, 0x0fdf00e9,
912 0x014e0fd8, 0x0fdd00fd, 0x013b0fd8, 0x0fdb0112,
913 0x01250fda, 0x0fda0127, 0x01120fdb, 0x0fd8013b,
914 0x00fd0fdd, 0x0fd8014e, 0x00e90fdf, 0x0fd70161,
915 0x00d50fe1, 0x0fd70173, 0x00c10fe3, 0x0fd70185,
916 0x00ac0fe6, 0x0fd80196, 0x00980fe8, 0x0fd901a7,
917 0x00850feb, 0x0fdb01b5, 0x00710fee, 0x0fde01c3,
918 0x005f0ff1, 0x0fe001d0, 0x004d0ff3, 0x0fe401dc,
919 0x003c0ff6, 0x0fe801e6, 0x002b0ff9, 0x0fed01ef,
920 0x001c0ffb, 0x0ff301f6, 0x000d0ffe, 0x0ff901fc,
921
922 0x020f0034, 0x0f7a0043, 0x01e80023, 0x0fa8004d,
923 0x01d30016, 0x0fbe0059, 0x01c6000a, 0x0fc90067,
924 0x01bd0000, 0x0fce0075, 0x01b50ff7, 0x0fcf0085,
925 0x01ae0fee, 0x0fcf0095, 0x01a70fe6, 0x0fcd00a6,
926 0x019d0fe0, 0x0fcb00b8, 0x01940fd9, 0x0fc900ca,
927 0x01890fd4, 0x0fc700dc, 0x017d0fcf, 0x0fc600ee,
928 0x01700fcc, 0x0fc40100, 0x01620fc9, 0x0fc40111,
929 0x01540fc6, 0x0fc30123, 0x01430fc5, 0x0fc40134,
930 0x01340fc4, 0x0fc50143, 0x01230fc3, 0x0fc60154,
931 0x01110fc4, 0x0fc90162, 0x01000fc4, 0x0fcc0170,
932 0x00ee0fc6, 0x0fcf017d, 0x00dc0fc7, 0x0fd40189,
933 0x00ca0fc9, 0x0fd90194, 0x00b80fcb, 0x0fe0019d,
934 0x00a60fcd, 0x0fe601a7, 0x00950fcf, 0x0fee01ae,
935 0x00850fcf, 0x0ff701b5, 0x00750fce, 0x000001bd,
936 0x00670fc9, 0x000a01c6, 0x00590fbe, 0x001601d3,
937 0x004d0fa8, 0x002301e8, 0x00430f7a, 0x0034020f,
938
939 0x015c005e, 0x0fde0068, 0x015c0054, 0x0fdd0073,
940 0x015b004b, 0x0fdc007e, 0x015a0042, 0x0fdb0089,
941 0x01590039, 0x0fda0094, 0x01560030, 0x0fda00a0,
942 0x01530028, 0x0fda00ab, 0x014f0020, 0x0fda00b7,
943 0x014a0019, 0x0fdb00c2, 0x01450011, 0x0fdc00ce,
944 0x013e000b, 0x0fde00d9, 0x01390004, 0x0fdf00e4,
945 0x01310ffe, 0x0fe200ef, 0x01290ff9, 0x0fe400fa,
946 0x01200ff4, 0x0fe80104, 0x01180fef, 0x0feb010e,
947 0x010e0feb, 0x0fef0118, 0x01040fe8, 0x0ff40120,
948 0x00fa0fe4, 0x0ff90129, 0x00ef0fe2, 0x0ffe0131,
949 0x00e40fdf, 0x00040139, 0x00d90fde, 0x000b013e,
950 0x00ce0fdc, 0x00110145, 0x00c20fdb, 0x0019014a,
951 0x00b70fda, 0x0020014f, 0x00ab0fda, 0x00280153,
952 0x00a00fda, 0x00300156, 0x00940fda, 0x00390159,
953 0x00890fdb, 0x0042015a, 0x007e0fdc, 0x004b015b,
954 0x00730fdd, 0x0054015c, 0x00680fde, 0x005e015c,
955
956 0x01300068, 0x0ff80070, 0x01300060, 0x0ff80078,
957 0x012f0059, 0x0ff80080, 0x012d0052, 0x0ff80089,
958 0x012b004b, 0x0ff90091, 0x01290044, 0x0ff9009a,
959 0x0126003d, 0x0ffa00a3, 0x01220037, 0x0ffb00ac,
960 0x011f0031, 0x0ffc00b4, 0x011a002b, 0x0ffe00bd,
961 0x01150026, 0x000000c5, 0x010f0021, 0x000200ce,
962 0x010a001c, 0x000400d6, 0x01030018, 0x000600df,
963 0x00fd0014, 0x000900e6, 0x00f60010, 0x000c00ee,
964 0x00ee000c, 0x001000f6, 0x00e60009, 0x001400fd,
965 0x00df0006, 0x00180103, 0x00d60004, 0x001c010a,
966 0x00ce0002, 0x0021010f, 0x00c50000, 0x00260115,
967 0x00bd0ffe, 0x002b011a, 0x00b40ffc, 0x0031011f,
968 0x00ac0ffb, 0x00370122, 0x00a30ffa, 0x003d0126,
969 0x009a0ff9, 0x00440129, 0x00910ff9, 0x004b012b,
970 0x00890ff8, 0x0052012d, 0x00800ff8, 0x0059012f,
971 0x00780ff8, 0x00600130, 0x00700ff8, 0x00680130,
972
973 0x01050079, 0x0003007f, 0x01040073, 0x00030086,
974 0x0103006d, 0x0004008c, 0x01030066, 0x00050092,
975 0x01010060, 0x00060099, 0x0100005a, 0x0007009f,
976 0x00fe0054, 0x000900a5, 0x00fa004f, 0x000b00ac,
977 0x00f80049, 0x000d00b2, 0x00f50044, 0x000f00b8,
978 0x00f2003f, 0x001200bd, 0x00ef0039, 0x001500c3,
979 0x00ea0035, 0x001800c9, 0x00e60030, 0x001c00ce,
980 0x00e3002b, 0x001f00d3, 0x00dd0027, 0x002300d9,
981 0x00d90023, 0x002700dd, 0x00d3001f, 0x002b00e3,
982 0x00ce001c, 0x003000e6, 0x00c90018, 0x003500ea,
983 0x00c30015, 0x003900ef, 0x00bd0012, 0x003f00f2,
984 0x00b8000f, 0x004400f5, 0x00b2000d, 0x004900f8,
985 0x00ac000b, 0x004f00fa, 0x00a50009, 0x005400fe,
986 0x009f0007, 0x005a0100, 0x00990006, 0x00600101,
987 0x00920005, 0x00660103, 0x008c0004, 0x006d0103,
988 0x00860003, 0x00730104, 0x007f0003, 0x00790105,
989
990 0x00cf0088, 0x001d008c, 0x00ce0084, 0x0020008e,
991 0x00cd0080, 0x00210092, 0x00cd007b, 0x00240094,
992 0x00ca0077, 0x00270098, 0x00c90073, 0x0029009b,
993 0x00c8006f, 0x002c009d, 0x00c6006b, 0x002f00a0,
994 0x00c50067, 0x003200a2, 0x00c30062, 0x003600a5,
995 0x00c0005f, 0x003900a8, 0x00c0005b, 0x003b00aa,
996 0x00be0057, 0x003e00ad, 0x00ba0054, 0x004200b0,
997 0x00b90050, 0x004500b2, 0x00b7004c, 0x004900b4,
998 0x00b40049, 0x004c00b7, 0x00b20045, 0x005000b9,
999 0x00b00042, 0x005400ba, 0x00ad003e, 0x005700be,
1000 0x00aa003b, 0x005b00c0, 0x00a80039, 0x005f00c0,
1001 0x00a50036, 0x006200c3, 0x00a20032, 0x006700c5,
1002 0x00a0002f, 0x006b00c6, 0x009d002c, 0x006f00c8,
1003 0x009b0029, 0x007300c9, 0x00980027, 0x007700ca,
1004 0x00940024, 0x007b00cd, 0x00920021, 0x008000cd,
1005 0x008e0020, 0x008400ce, 0x008c001d, 0x008800cf,
1006
1007 0x008e0083, 0x006b0084, 0x008d0083, 0x006c0084,
1008 0x008d0082, 0x006d0084, 0x008d0081, 0x006d0085,
1009 0x008d0080, 0x006e0085, 0x008c007f, 0x006f0086,
1010 0x008b007f, 0x00700086, 0x008b007e, 0x00710086,
1011 0x008b007d, 0x00720086, 0x008a007d, 0x00730086,
1012 0x008a007c, 0x00730087, 0x008a007b, 0x00740087,
1013 0x0089007b, 0x00750087, 0x008a0079, 0x00750088,
1014 0x008a0078, 0x00760088, 0x008a0077, 0x00770088,
1015 0x00880077, 0x0077008a, 0x00880076, 0x0078008a,
1016 0x00880075, 0x0079008a, 0x00870075, 0x007b0089,
1017 0x00870074, 0x007b008a, 0x00870073, 0x007c008a,
1018 0x00860073, 0x007d008a, 0x00860072, 0x007d008b,
1019 0x00860071, 0x007e008b, 0x00860070, 0x007f008b,
1020 0x0086006f, 0x007f008c, 0x0085006e, 0x0080008d,
1021 0x0085006d, 0x0081008d, 0x0084006d, 0x0082008d,
1022 0x0084006c, 0x0083008d, 0x0084006b, 0x0083008e,
1023
1024 0x023c0fe2, 0x00000fe2, 0x023a0fdb, 0x00000feb,
1025 0x02360fd3, 0x0fff0ff8, 0x022e0fcf, 0x0ffc0007,
1026 0x02250fca, 0x0ffa0017, 0x021a0fc6, 0x0ff70029,
1027 0x020c0fc4, 0x0ff4003c, 0x01fd0fc1, 0x0ff10051,
1028 0x01eb0fc0, 0x0fed0068, 0x01d80fc0, 0x0fe9007f,
1029 0x01c30fc1, 0x0fe50097, 0x01ac0fc2, 0x0fe200b0,
1030 0x01960fc3, 0x0fdd00ca, 0x017e0fc5, 0x0fd900e4,
1031 0x01650fc8, 0x0fd500fe, 0x014b0fcb, 0x0fd20118,
1032 0x01330fcd, 0x0fcd0133, 0x01180fd2, 0x0fcb014b,
1033 0x00fe0fd5, 0x0fc80165, 0x00e40fd9, 0x0fc5017e,
1034 0x00ca0fdd, 0x0fc30196, 0x00b00fe2, 0x0fc201ac,
1035 0x00970fe5, 0x0fc101c3, 0x007f0fe9, 0x0fc001d8,
1036 0x00680fed, 0x0fc001eb, 0x00510ff1, 0x0fc101fd,
1037 0x003c0ff4, 0x0fc4020c, 0x00290ff7, 0x0fc6021a,
1038 0x00170ffa, 0x0fca0225, 0x00070ffc, 0x0fcf022e,
1039 0x0ff80fff, 0x0fd30236, 0x0feb0000, 0x0fdb023a,
1040
1041 0x02780fc4, 0x00000fc4, 0x02770fbc, 0x0fff0fce,
1042 0x02710fb5, 0x0ffe0fdc, 0x02690fb0, 0x0ffa0fed,
1043 0x025f0fab, 0x0ff70fff, 0x02500fa8, 0x0ff30015,
1044 0x02410fa6, 0x0fef002a, 0x022f0fa4, 0x0feb0042,
1045 0x021a0fa4, 0x0fe5005d, 0x02040fa5, 0x0fe10076,
1046 0x01eb0fa7, 0x0fdb0093, 0x01d20fa9, 0x0fd600af,
1047 0x01b80fab, 0x0fd000cd, 0x019d0faf, 0x0fca00ea,
1048 0x01810fb2, 0x0fc50108, 0x01620fb7, 0x0fc10126,
1049 0x01440fbb, 0x0fbb0146, 0x01260fc1, 0x0fb70162,
1050 0x01080fc5, 0x0fb20181, 0x00ea0fca, 0x0faf019d,
1051 0x00cd0fd0, 0x0fab01b8, 0x00af0fd6, 0x0fa901d2,
1052 0x00930fdb, 0x0fa701eb, 0x00760fe1, 0x0fa50204,
1053 0x005d0fe5, 0x0fa4021a, 0x00420feb, 0x0fa4022f,
1054 0x002a0fef, 0x0fa60241, 0x00150ff3, 0x0fa80250,
1055 0x0fff0ff7, 0x0fab025f, 0x0fed0ffa, 0x0fb00269,
1056 0x0fdc0ffe, 0x0fb50271, 0x0fce0fff, 0x0fbc0277,
1057
1058 0x02a00fb0, 0x00000fb0, 0x029e0fa8, 0x0fff0fbb,
1059 0x02980fa1, 0x0ffd0fca, 0x028f0f9c, 0x0ff90fdc,
1060 0x02840f97, 0x0ff50ff0, 0x02740f94, 0x0ff10007,
1061 0x02640f92, 0x0fec001e, 0x02500f91, 0x0fe70038,
1062 0x023a0f91, 0x0fe00055, 0x02220f92, 0x0fdb0071,
1063 0x02080f95, 0x0fd4008f, 0x01ec0f98, 0x0fce00ae,
1064 0x01cf0f9b, 0x0fc700cf, 0x01b10f9f, 0x0fc100ef,
1065 0x01920fa4, 0x0fbb010f, 0x01710faa, 0x0fb50130,
1066 0x01520fae, 0x0fae0152, 0x01300fb5, 0x0faa0171,
1067 0x010f0fbb, 0x0fa40192, 0x00ef0fc1, 0x0f9f01b1,
1068 0x00cf0fc7, 0x0f9b01cf, 0x00ae0fce, 0x0f9801ec,
1069 0x008f0fd4, 0x0f950208, 0x00710fdb, 0x0f920222,
1070 0x00550fe0, 0x0f91023a, 0x00380fe7, 0x0f910250,
1071 0x001e0fec, 0x0f920264, 0x00070ff1, 0x0f940274,
1072 0x0ff00ff5, 0x0f970284, 0x0fdc0ff9, 0x0f9c028f,
1073 0x0fca0ffd, 0x0fa10298, 0x0fbb0fff, 0x0fa8029e,
1074
1075 0x02c80f9c, 0x00000f9c, 0x02c70f94, 0x0ffe0fa7,
1076 0x02c10f8c, 0x0ffc0fb7, 0x02b70f87, 0x0ff70fcb,
1077 0x02aa0f83, 0x0ff30fe0, 0x02990f80, 0x0fee0ff9,
1078 0x02870f7f, 0x0fe80012, 0x02720f7e, 0x0fe2002e,
1079 0x025a0f7e, 0x0fdb004d, 0x02400f80, 0x0fd5006b,
1080 0x02230f84, 0x0fcd008c, 0x02050f87, 0x0fc700ad,
1081 0x01e60f8b, 0x0fbf00d0, 0x01c60f90, 0x0fb700f3,
1082 0x01a30f96, 0x0fb00117, 0x01800f9c, 0x0faa013a,
1083 0x015d0fa2, 0x0fa2015f, 0x013a0faa, 0x0f9c0180,
1084 0x01170fb0, 0x0f9601a3, 0x00f30fb7, 0x0f9001c6,
1085 0x00d00fbf, 0x0f8b01e6, 0x00ad0fc7, 0x0f870205,
1086 0x008c0fcd, 0x0f840223, 0x006b0fd5, 0x0f800240,
1087 0x004d0fdb, 0x0f7e025a, 0x002e0fe2, 0x0f7e0272,
1088 0x00120fe8, 0x0f7f0287, 0x0ff90fee, 0x0f800299,
1089 0x0fe00ff3, 0x0f8302aa, 0x0fcb0ff7, 0x0f8702b7,
1090 0x0fb70ffc, 0x0f8c02c1, 0x0fa70ffe, 0x0f9402c7,
1091
1092 0x02f00f88, 0x00000f88, 0x02ee0f80, 0x0ffe0f94,
1093 0x02e70f78, 0x0ffc0fa5, 0x02dd0f73, 0x0ff60fba,
1094 0x02ce0f6f, 0x0ff20fd1, 0x02be0f6c, 0x0feb0feb,
1095 0x02aa0f6b, 0x0fe50006, 0x02940f6a, 0x0fde0024,
1096 0x02790f6c, 0x0fd60045, 0x025e0f6e, 0x0fcf0065,
1097 0x023f0f72, 0x0fc60089, 0x021d0f77, 0x0fbf00ad,
1098 0x01fd0f7b, 0x0fb600d2, 0x01da0f81, 0x0fad00f8,
1099 0x01b50f87, 0x0fa6011e, 0x018f0f8f, 0x0f9e0144,
1100 0x016b0f95, 0x0f95016b, 0x01440f9e, 0x0f8f018f,
1101 0x011e0fa6, 0x0f8701b5, 0x00f80fad, 0x0f8101da,
1102 0x00d20fb6, 0x0f7b01fd, 0x00ad0fbf, 0x0f77021d,
1103 0x00890fc6, 0x0f72023f, 0x00650fcf, 0x0f6e025e,
1104 0x00450fd6, 0x0f6c0279, 0x00240fde, 0x0f6a0294,
1105 0x00060fe5, 0x0f6b02aa, 0x0feb0feb, 0x0f6c02be,
1106 0x0fd10ff2, 0x0f6f02ce, 0x0fba0ff6, 0x0f7302dd,
1107 0x0fa50ffc, 0x0f7802e7, 0x0f940ffe, 0x0f8002ee,
1108
1109 0x03180f74, 0x00000f74, 0x03160f6b, 0x0ffe0f81,
1110 0x030e0f64, 0x0ffb0f93, 0x03030f5f, 0x0ff50fa9,
1111 0x02f40f5b, 0x0ff00fc1, 0x02e20f58, 0x0fe90fdd,
1112 0x02cd0f57, 0x0fe20ffa, 0x02b60f57, 0x0fda0019,
1113 0x02990f59, 0x0fd1003d, 0x027b0f5c, 0x0fc90060,
1114 0x02590f61, 0x0fc00086, 0x02370f66, 0x0fb700ac,
1115 0x02130f6b, 0x0fae00d4, 0x01ee0f72, 0x0fa400fc,
1116 0x01c70f79, 0x0f9b0125, 0x019f0f81, 0x0f93014d,
1117 0x01760f89, 0x0f890178, 0x014d0f93, 0x0f81019f,
1118 0x01250f9b, 0x0f7901c7, 0x00fc0fa4, 0x0f7201ee,
1119 0x00d40fae, 0x0f6b0213, 0x00ac0fb7, 0x0f660237,
1120 0x00860fc0, 0x0f610259, 0x00600fc9, 0x0f5c027b,
1121 0x003d0fd1, 0x0f590299, 0x00190fda, 0x0f5702b6,
1122 0x0ffa0fe2, 0x0f5702cd, 0x0fdd0fe9, 0x0f5802e2,
1123 0x0fc10ff0, 0x0f5b02f4, 0x0fa90ff5, 0x0f5f0303,
1124 0x0f930ffb, 0x0f64030e, 0x0f810ffe, 0x0f6b0316,
1125
1126 0x03400f60, 0x00000f60, 0x033e0f57, 0x0ffe0f6d,
1127 0x03370f4f, 0x0ffa0f80, 0x032a0f4b, 0x0ff30f98,
1128 0x031a0f46, 0x0fee0fb2, 0x03070f44, 0x0fe60fcf,
1129 0x02f10f44, 0x0fde0fed, 0x02d70f44, 0x0fd6000f,
1130 0x02b80f46, 0x0fcc0036, 0x02990f4a, 0x0fc3005a,
1131 0x02750f4f, 0x0fb90083, 0x02500f55, 0x0fb000ab,
1132 0x022a0f5b, 0x0fa500d6, 0x02020f63, 0x0f9a0101,
1133 0x01d80f6b, 0x0f91012c, 0x01ae0f74, 0x0f870157,
1134 0x01840f7c, 0x0f7c0184, 0x01570f87, 0x0f7401ae,
1135 0x012c0f91, 0x0f6b01d8, 0x01010f9a, 0x0f630202,
1136 0x00d60fa5, 0x0f5b022a, 0x00ab0fb0, 0x0f550250,
1137 0x00830fb9, 0x0f4f0275, 0x005a0fc3, 0x0f4a0299,
1138 0x00360fcc, 0x0f4602b8, 0x000f0fd6, 0x0f4402d7,
1139 0x0fed0fde, 0x0f4402f1, 0x0fcf0fe6, 0x0f440307,
1140 0x0fb20fee, 0x0f46031a, 0x0f980ff3, 0x0f4b032a,
1141 0x0f800ffa, 0x0f4f0337, 0x0f6d0ffe, 0x0f57033e
1142};
1143
1144
1145#define MDP4_QSEED_TABLE0_OFF 0x8100
1146#define MDP4_QSEED_TABLE1_OFF 0x8200
1147#define MDP4_QSEED_TABLE2_OFF 0x9000
1148
1149void mdp4_vg_qseed_init(int vp_num)
1150{
1151 uint32 *off;
1152 int i, voff;
1153
1154 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1155
1156 voff = MDP4_VIDEO_OFF * vp_num;
1157 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1158 MDP4_QSEED_TABLE0_OFF);
1159 for (i = 0; i < (sizeof(vg_qseed_table0) / sizeof(uint32)); i++) {
1160 outpdw(off, vg_qseed_table0[i]);
1161 off++;
1162 /* This code is added to workaround the 1K Boundary AXI
1163 Interleave operations from Scorpion that can potentially
1164 corrupt the QSEED table. The idea is to complete the prevous
1165 to the buffer before making the next write when address is
1166 1KB aligned to ensure the write has been committed prior to
1167 next instruction write that can go out from the secondary AXI
1168 port.This happens also because of the expected write sequence
1169 from QSEED table, where LSP has to be written first then the
1170 MSP to trigger both to write out to SRAM, if this has not been
1171 the expectation, then corruption wouldn't have happened.*/
1172
1173 if (!((uint32)off & 0x3FF))
1174 wmb();
1175 }
1176
1177 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1178 MDP4_QSEED_TABLE1_OFF);
1179 for (i = 0; i < (sizeof(vg_qseed_table1) / sizeof(uint32)); i++) {
1180 outpdw(off, vg_qseed_table1[i]);
1181 off++;
1182 if (!((uint32)off & 0x3FF))
1183 wmb();
1184 }
1185
1186 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1187 MDP4_QSEED_TABLE2_OFF);
1188 for (i = 0; i < (sizeof(vg_qseed_table2) / sizeof(uint32)); i++) {
1189 outpdw(off, vg_qseed_table2[i]);
1190 off++;
1191 if (!((uint32)off & 0x3FF))
1192 wmb();
1193 }
1194
1195 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1196
1197}
1198
1199void mdp4_mixer_blend_init(mixer_num)
1200{
1201 unsigned char *overlay_base;
1202 int off;
1203
1204 if (mixer_num) /* mixer number, /dev/fb0, /dev/fb1 */
1205 overlay_base = MDP_BASE + MDP4_OVERLAYPROC1_BASE;/* 0x18000 */
1206 else
1207 overlay_base = MDP_BASE + MDP4_OVERLAYPROC0_BASE;/* 0x10000 */
1208
1209 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1210
1211 /* stage 0 to stage 2 */
1212 off = 0;
1213 outpdw(overlay_base + off + 0x104, 0x010);
1214 outpdw(overlay_base + off + 0x108, 0xff);/* FG */
1215 outpdw(overlay_base + off + 0x10c, 0x00);/* BG */
1216
1217 off += 0x20;
1218 outpdw(overlay_base + off + 0x104, 0x010);
1219 outpdw(overlay_base + off + 0x108, 0xff);/* FG */
1220 outpdw(overlay_base + off + 0x10c, 0x00);/* BG */
1221
1222 off += 0x20;
1223 outpdw(overlay_base + off + 0x104, 0x010);
1224 outpdw(overlay_base + off + 0x108, 0xff);/* FG */
1225 outpdw(overlay_base + off + 0x10c, 0x00);/* BG */
1226
1227 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1228}
1229
Carl Vanderlipfa1de672011-12-05 12:37:59 -08001230struct mdp_csc_cfg mdp_csc_convert[4] = {
1231 { /*RGB2RGB*/
1232 0,
1233 {
1234 0x0200, 0x0000, 0x0000,
1235 0x0000, 0x0200, 0x0000,
1236 0x0000, 0x0000, 0x0200,
1237 },
1238 { 0x0, 0x0, 0x0, },
1239 { 0x0, 0x0, 0x0, },
1240 { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, },
1241 { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, },
1242 },
1243 { /*YUV2RGB*/
1244 0,
1245 {
1246 0x0254, 0x0000, 0x0331,
1247 0x0254, 0xff37, 0xfe60,
1248 0x0254, 0x0409, 0x0000,
1249 },
1250 { 0xfff0, 0xff80, 0xff80, },
1251 { 0x0, 0x0, 0x0, },
1252 { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, },
1253 { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, },
1254 },
1255 { /*RGB2YUV*/
1256 0,
1257 {
1258 0x0083, 0x0102, 0x0032,
1259 0x1fb5, 0x1f6c, 0x00e1,
1260 0x00e1, 0x1f45, 0x1fdc
1261 },
1262 { 0x0, 0x0, 0x0, },
1263 { 0x0010, 0x0080, 0x0080, },
1264 { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, },
1265 { 0x0010, 0x00eb, 0x0010, 0x00f0, 0x0010, 0x00f0, },
1266 },
1267 { /*YUV2YUV ???*/
1268 0,
1269 {
1270 0x0200, 0x0000, 0x0000,
1271 0x0000, 0x0200, 0x0000,
1272 0x0000, 0x0000, 0x0200,
1273 },
1274 { 0x0, 0x0, 0x0, },
1275 { 0x0, 0x0, 0x0, },
1276 { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, },
1277 { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, },
1278 },
1279};
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001280
Carl Vanderlipfa1de672011-12-05 12:37:59 -08001281struct mdp_csc_cfg csc_matrix[3] = {
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001282 {
Carl Vanderlipfa1de672011-12-05 12:37:59 -08001283 (MDP_CSC_FLAG_YUV_OUT),
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001284 {
1285 0x0254, 0x0000, 0x0331,
1286 0x0254, 0xff37, 0xfe60,
1287 0x0254, 0x0409, 0x0000,
1288 },
1289 {
1290 0xfff0, 0xff80, 0xff80,
1291 },
1292 {
1293 0, 0, 0,
1294 },
1295 {
1296 0, 0xff, 0, 0xff, 0, 0xff,
1297 },
1298 {
1299 0, 0xff, 0, 0xff, 0, 0xff,
1300 },
1301 },
1302 {
Carl Vanderlipfa1de672011-12-05 12:37:59 -08001303 (MDP_CSC_FLAG_YUV_OUT),
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001304 {
1305 0x0254, 0x0000, 0x0331,
1306 0x0254, 0xff37, 0xfe60,
1307 0x0254, 0x0409, 0x0000,
1308 },
1309 {
1310 0xfff0, 0xff80, 0xff80,
1311 },
1312 {
1313 0, 0, 0,
1314 },
1315 {
1316 0, 0xff, 0, 0xff, 0, 0xff,
1317 },
1318 {
1319 0, 0xff, 0, 0xff, 0, 0xff,
1320 },
1321 },
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08001322 {
Carl Vanderlipfa1de672011-12-05 12:37:59 -08001323 (0),
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08001324 {
1325 0x0200, 0x0000, 0x0000,
1326 0x0000, 0x0200, 0x0000,
1327 0x0000, 0x0000, 0x0200,
1328 },
1329 {
1330 0x0, 0x0, 0x0,
1331 },
1332 {
1333 0, 0, 0,
1334 },
1335 {
1336 0, 0xff, 0, 0xff, 0, 0xff,
1337 },
1338 {
1339 0, 0xff, 0, 0xff, 0, 0xff,
1340 },
1341 },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001342};
1343
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001344
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001345
1346#define MDP4_CSC_MV_OFF 0x4400
1347#define MDP4_CSC_PRE_BV_OFF 0x4500
1348#define MDP4_CSC_POST_BV_OFF 0x4580
1349#define MDP4_CSC_PRE_LV_OFF 0x4600
1350#define MDP4_CSC_POST_LV_OFF 0x4680
1351
1352void mdp4_vg_csc_mv_setup(int vp_num)
1353{
1354 uint32 *off;
1355 int i, voff;
1356
1357 voff = MDP4_VIDEO_OFF * vp_num;
1358 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1359 MDP4_CSC_MV_OFF);
1360
1361 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1362 for (i = 0; i < 9; i++) {
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001363 outpdw(off, csc_matrix[vp_num].csc_mv[i]);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001364 off++;
1365 }
1366 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1367}
1368
1369void mdp4_vg_csc_pre_bv_setup(int vp_num)
1370{
1371 uint32 *off;
1372 int i, voff;
1373
1374 voff = MDP4_VIDEO_OFF * vp_num;
1375 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1376 MDP4_CSC_PRE_BV_OFF);
1377
1378 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1379 for (i = 0; i < 3; i++) {
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001380 outpdw(off, csc_matrix[vp_num].csc_pre_bv[i]);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001381 off++;
1382 }
1383 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1384}
1385
1386void mdp4_vg_csc_post_bv_setup(int vp_num)
1387{
1388 uint32 *off;
1389 int i, voff;
1390
1391 voff = MDP4_VIDEO_OFF * vp_num;
1392 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1393 MDP4_CSC_POST_BV_OFF);
1394
1395 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1396 for (i = 0; i < 3; i++) {
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001397 outpdw(off, csc_matrix[vp_num].csc_post_bv[i]);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001398 off++;
1399 }
1400 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1401}
1402
1403void mdp4_vg_csc_pre_lv_setup(int vp_num)
1404{
1405 uint32 *off;
1406 int i, voff;
1407
1408 voff = MDP4_VIDEO_OFF * vp_num;
1409 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1410 MDP4_CSC_PRE_LV_OFF);
1411
1412 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1413 for (i = 0; i < 6; i++) {
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001414 outpdw(off, csc_matrix[vp_num].csc_pre_lv[i]);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001415 off++;
1416 }
1417 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1418}
1419
1420void mdp4_vg_csc_post_lv_setup(int vp_num)
1421{
1422 uint32 *off;
1423 int i, voff;
1424
1425 voff = MDP4_VIDEO_OFF * vp_num;
1426 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1427 MDP4_CSC_POST_LV_OFF);
1428
1429 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1430 for (i = 0; i < 6; i++) {
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001431 outpdw(off, csc_matrix[vp_num].csc_post_lv[i]);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001432 off++;
1433 }
1434 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1435}
1436
Carl Vanderlipfa1de672011-12-05 12:37:59 -08001437void mdp4_vg_csc_convert_setup(int vp_num)
1438{
1439 struct mdp_csc_cfg_data cfg;
1440
1441 switch (vp_num) {
1442 case 0:
1443 cfg.block = MDP_BLOCK_VG_1;
1444 break;
1445 case 1:
1446 cfg.block = MDP_BLOCK_VG_2;
1447 break;
1448 default:
1449 pr_err("%s - invalid vp_num = %d", __func__, vp_num);
1450 return;
1451 }
1452 cfg.csc_data = csc_matrix[vp_num];
1453 mdp4_csc_enable(&cfg);
1454}
1455
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001456void mdp4_vg_csc_setup(int vp_num)
1457{
1458 /* yuv2rgb */
1459 mdp4_vg_csc_mv_setup(vp_num);
1460 mdp4_vg_csc_pre_bv_setup(vp_num);
1461 mdp4_vg_csc_post_bv_setup(vp_num);
1462 mdp4_vg_csc_pre_lv_setup(vp_num);
1463 mdp4_vg_csc_post_lv_setup(vp_num);
Carl Vanderlipfa1de672011-12-05 12:37:59 -08001464 mdp4_vg_csc_convert_setup(vp_num);
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001465}
1466void mdp4_vg_csc_update(struct mdp_csc *p)
1467{
1468 struct mdp4_overlay_pipe *pipe;
1469 int vp_num;
1470
1471 pipe = mdp4_overlay_ndx2pipe(p->id);
1472 if (pipe == NULL) {
1473 pr_err("%s: p->id = %d Error\n", __func__, p->id);
1474 return;
1475 }
1476
1477 vp_num = pipe->pipe_num - OVERLAY_PIPE_VG1;
1478
1479 if (vp_num == 0 || vp_num == 1) {
1480 memcpy(csc_matrix[vp_num].csc_mv, p->csc_mv, sizeof(p->csc_mv));
1481 memcpy(csc_matrix[vp_num].csc_pre_bv, p->csc_pre_bv,
1482 sizeof(p->csc_pre_bv));
1483 memcpy(csc_matrix[vp_num].csc_post_bv, p->csc_post_bv,
1484 sizeof(p->csc_post_bv));
1485 memcpy(csc_matrix[vp_num].csc_pre_lv, p->csc_pre_lv,
1486 sizeof(p->csc_pre_lv));
1487 memcpy(csc_matrix[vp_num].csc_post_lv, p->csc_post_lv,
1488 sizeof(p->csc_post_lv));
1489 mdp4_vg_csc_setup(vp_num);
1490 }
1491}
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001492static uint32 csc_rgb2yuv_matrix_tab[9] = {
1493 0x0083, 0x0102, 0x0032,
1494 0x1fb5, 0x1f6c, 0x00e1,
1495 0x00e1, 0x1f45, 0x1fdc
1496};
1497
1498static uint32 csc_rgb2yuv_pre_bv_tab[3] = {0, 0, 0};
1499
1500static uint32 csc_rgb2yuv_post_bv_tab[3] = {0x0010, 0x0080, 0x0080};
1501
1502static uint32 csc_rgb2yuv_pre_lv_tab[6] = {
1503 0x00, 0xff, 0x00,
1504 0xff, 0x00, 0xff
1505};
1506
1507static uint32 csc_rgb2yuv_post_lv_tab[6] = {
1508 0x0010, 0x00eb, 0x0010,
1509 0x00f0, 0x0010, 0x00f0
1510};
1511
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001512void mdp4_mixer_csc_mv_setup(uint32 mixer)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001513{
1514 uint32 *off;
1515 int i;
1516
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001517 if (mixer == MDP4_MIXER1)
1518 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC1_BASE + 0x2400);
1519 else
1520 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC2_BASE + 0x2400);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001521
1522 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1523 for (i = 0; i < 9; i++) {
1524 outpdw(off, csc_rgb2yuv_matrix_tab[i]);
1525 off++;
1526 }
1527 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1528}
1529
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001530void mdp4_mixer_csc_pre_bv_setup(uint32 mixer)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001531{
1532 uint32 *off;
1533 int i;
1534
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001535 if (mixer == MDP4_MIXER1)
1536 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC1_BASE + 0x2500);
1537 else
1538 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC2_BASE + 0x2500);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001539
1540 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1541 for (i = 0; i < 3; i++) {
1542 outpdw(off, csc_rgb2yuv_pre_bv_tab[i]);
1543 off++;
1544 }
1545 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1546}
1547
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001548void mdp4_mixer_csc_post_bv_setup(uint32 mixer)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001549{
1550 uint32 *off;
1551 int i;
1552
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001553 if (mixer == MDP4_MIXER1)
1554 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC1_BASE + 0x2580);
1555 else
1556 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC2_BASE + 0x2580);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001557
1558 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1559 for (i = 0; i < 3; i++) {
1560 outpdw(off, csc_rgb2yuv_post_bv_tab[i]);
1561 off++;
1562 }
1563 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1564}
1565
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001566void mdp4_mixer_csc_pre_lv_setup(uint32 mixer)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001567{
1568 uint32 *off;
1569 int i;
1570
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001571 if (mixer == MDP4_MIXER1)
1572 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC1_BASE + 0x2600);
1573 else
1574 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC2_BASE + 0x2600);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001575
1576 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1577 for (i = 0; i < 6; i++) {
1578 outpdw(off, csc_rgb2yuv_pre_lv_tab[i]);
1579 off++;
1580 }
1581 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1582}
1583
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001584void mdp4_mixer_csc_post_lv_setup(uint32 mixer)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001585{
1586 uint32 *off;
1587 int i;
1588
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001589 if (mixer == MDP4_MIXER1)
1590 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC1_BASE + 0x2680);
1591 else
1592 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC2_BASE + 0x2680);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001593
1594 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1595 for (i = 0; i < 6; i++) {
1596 outpdw(off, csc_rgb2yuv_post_lv_tab[i]);
1597 off++;
1598 }
1599 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1600}
1601
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001602void mdp4_mixer_csc_setup(uint32 mixer)
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001603{
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001604 if (mixer >= MDP4_MIXER1) {
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001605 /* rgb2yuv */
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001606 mdp4_mixer_csc_mv_setup(mixer);
1607 mdp4_mixer_csc_pre_bv_setup(mixer);
1608 mdp4_mixer_csc_post_bv_setup(mixer);
1609 mdp4_mixer_csc_pre_lv_setup(mixer);
1610 mdp4_mixer_csc_post_lv_setup(mixer);
1611 }
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001612}
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001613
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08001614#define DMA_P_BASE 0x90000
1615void mdp4_dmap_csc_mv_setup(void)
1616{
1617 uint32 *off;
1618 int i;
1619
1620 off = (uint32 *)(MDP_BASE + DMA_P_BASE + 0x3400);
1621
1622 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1623 for (i = 0; i < 9; i++) {
1624 outpdw(off, csc_matrix[2].csc_mv[i]);
1625 off++;
1626 }
1627 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1628}
1629
1630void mdp4_dmap_csc_pre_bv_setup(void)
1631{
1632 uint32 *off;
1633 int i;
1634
1635 off = (uint32 *)(MDP_BASE + DMA_P_BASE + 0x3500);
1636
1637 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1638 for (i = 0; i < 3; i++) {
1639 outpdw(off, csc_matrix[2].csc_pre_bv[i]);
1640 off++;
1641 }
1642 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1643}
1644
1645void mdp4_dmap_csc_post_bv_setup(void)
1646{
1647 uint32 *off;
1648 int i;
1649
1650 off = (uint32 *)(MDP_BASE + DMA_P_BASE + 0x3580);
1651
1652 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1653 for (i = 0; i < 3; i++) {
1654 outpdw(off, csc_matrix[2].csc_post_bv[i]);
1655 off++;
1656 }
1657 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1658}
1659
1660void mdp4_dmap_csc_pre_lv_setup(void)
1661{
1662 uint32 *off;
1663 int i;
1664
1665 off = (uint32 *)(MDP_BASE + DMA_P_BASE + 0x3600);
1666
1667 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1668 for (i = 0; i < 6; i++) {
1669 outpdw(off, csc_matrix[2].csc_pre_lv[i]);
1670 off++;
1671 }
1672 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1673}
1674
1675void mdp4_dmap_csc_post_lv_setup(void)
1676{
1677 uint32 *off;
1678 int i;
1679
1680 off = (uint32 *)(MDP_BASE + DMA_P_BASE + 0x3680);
1681
1682 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1683 for (i = 0; i < 6; i++) {
1684 outpdw(off, csc_matrix[2].csc_post_lv[i]);
1685 off++;
1686 }
1687 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1688}
1689
1690void mdp4_dmap_csc_setup(void)
1691{
1692 mdp4_dmap_csc_mv_setup();
1693 mdp4_dmap_csc_pre_bv_setup();
1694 mdp4_dmap_csc_post_bv_setup();
1695 mdp4_dmap_csc_pre_lv_setup();
1696 mdp4_dmap_csc_post_lv_setup();
1697}
1698
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001699char gc_lut[] = {
1700 0x0, 0x1, 0x2, 0x2, 0x3, 0x4, 0x5, 0x6,
1701 0x6, 0x7, 0x8, 0x9, 0xA, 0xA, 0xB, 0xC,
1702 0xD, 0xD, 0xE, 0xF, 0xF, 0x10, 0x10, 0x11,
1703 0x12, 0x12, 0x13, 0x13, 0x14, 0x14, 0x15, 0x15,
1704 0x16, 0x16, 0x17, 0x17, 0x17, 0x18, 0x18, 0x19,
1705 0x19, 0x19, 0x1A, 0x1A, 0x1B, 0x1B, 0x1B, 0x1C,
1706 0x1C, 0x1D, 0x1D, 0x1D, 0x1E, 0x1E, 0x1E, 0x1F,
1707 0x1F, 0x1F, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21,
1708 0x22, 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, 0x24,
1709 0x24, 0x24, 0x25, 0x25, 0x25, 0x25, 0x26, 0x26,
1710 0x26, 0x26, 0x27, 0x27, 0x27, 0x28, 0x28, 0x28,
1711 0x28, 0x29, 0x29, 0x29, 0x29, 0x2A, 0x2A, 0x2A,
1712 0x2A, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2C, 0x2C,
1713 0x2C, 0x2C, 0x2D, 0x2D, 0x2D, 0x2D, 0x2E, 0x2E,
1714 0x2E, 0x2E, 0x2E, 0x2F, 0x2F, 0x2F, 0x2F, 0x30,
1715 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x31,
1716 0x31, 0x32, 0x32, 0x32, 0x32, 0x32, 0x33, 0x33,
1717 0x33, 0x33, 0x33, 0x34, 0x34, 0x34, 0x34, 0x34,
1718 0x35, 0x35, 0x35, 0x35, 0x35, 0x36, 0x36, 0x36,
1719 0x36, 0x36, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37,
1720 0x38, 0x38, 0x38, 0x38, 0x38, 0x39, 0x39, 0x39,
1721 0x39, 0x39, 0x39, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A,
1722 0x3A, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3C,
1723 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3D, 0x3D, 0x3D,
1724 0x3D, 0x3D, 0x3D, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E,
1725 0x3E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x40,
1726 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41,
1727 0x41, 0x41, 0x41, 0x41, 0x42, 0x42, 0x42, 0x42,
1728 0x42, 0x42, 0x42, 0x43, 0x43, 0x43, 0x43, 0x43,
1729 0x43, 0x43, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1730 0x44, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45,
1731 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x47,
1732 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x48, 0x48,
1733 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x49, 0x49,
1734 0x49, 0x49, 0x49, 0x49, 0x49, 0x4A, 0x4A, 0x4A,
1735 0x4A, 0x4A, 0x4A, 0x4A, 0x4A, 0x4B, 0x4B, 0x4B,
1736 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4C, 0x4C, 0x4C,
1737 0x4C, 0x4C, 0x4C, 0x4C, 0x4D, 0x4D, 0x4D, 0x4D,
1738 0x4D, 0x4D, 0x4D, 0x4D, 0x4E, 0x4E, 0x4E, 0x4E,
1739 0x4E, 0x4E, 0x4E, 0x4E, 0x4E, 0x4F, 0x4F, 0x4F,
1740 0x4F, 0x4F, 0x4F, 0x4F, 0x4F, 0x50, 0x50, 0x50,
1741 0x50, 0x50, 0x50, 0x50, 0x50, 0x51, 0x51, 0x51,
1742 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x52, 0x52,
1743 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x53, 0x53,
1744 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x54,
1745 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54,
1746 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
1747 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56,
1748 0x56, 0x56, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57,
1749 0x57, 0x57, 0x57, 0x58, 0x58, 0x58, 0x58, 0x58,
1750 0x58, 0x58, 0x58, 0x58, 0x58, 0x59, 0x59, 0x59,
1751 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x5A, 0x5A,
1752 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A,
1753 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
1754 0x5B, 0x5B, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C,
1755 0x5C, 0x5C, 0x5C, 0x5C, 0x5D, 0x5D, 0x5D, 0x5D,
1756 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5E, 0x5E,
1757 0x5E, 0x5E, 0x5E, 0x5E, 0x5E, 0x5E, 0x5E, 0x5E,
1758 0x5F, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F,
1759 0x5F, 0x5F, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60,
1760 0x60, 0x60, 0x60, 0x60, 0x60, 0x61, 0x61, 0x61,
1761 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x62,
1762 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62,
1763 0x62, 0x62, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
1764 0x63, 0x63, 0x63, 0x63, 0x63, 0x64, 0x64, 0x64,
1765 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64,
1766 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65,
1767 0x65, 0x65, 0x65, 0x66, 0x66, 0x66, 0x66, 0x66,
1768 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x67,
1769 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
1770 0x67, 0x67, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68,
1771 0x68, 0x68, 0x68, 0x68, 0x68, 0x69, 0x69, 0x69,
1772 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69,
1773 0x69, 0x6A, 0x6A, 0x6A, 0x6A, 0x6A, 0x6A, 0x6A,
1774 0x6A, 0x6A, 0x6A, 0x6A, 0x6A, 0x6B, 0x6B, 0x6B,
1775 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B,
1776 0x6B, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
1777 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6D, 0x6D, 0x6D,
1778 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D,
1779 0x6D, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
1780 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6F, 0x6F, 0x6F,
1781 0x6F, 0x6F, 0x6F, 0x6F, 0x6F, 0x6F, 0x6F, 0x6F,
1782 0x6F, 0x6F, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70,
1783 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x71, 0x71,
1784 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71,
1785 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72,
1786 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72,
1787 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73,
1788 0x73, 0x73, 0x73, 0x73, 0x73, 0x74, 0x74, 0x74,
1789 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74,
1790 0x74, 0x74, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75,
1791 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75,
1792 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76,
1793 0x76, 0x76, 0x76, 0x76, 0x76, 0x77, 0x77, 0x77,
1794 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
1795 0x77, 0x77, 0x77, 0x78, 0x78, 0x78, 0x78, 0x78,
1796 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
1797 0x78, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79,
1798 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x7A, 0x7A,
1799 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A,
1800 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x7B, 0x7B, 0x7B,
1801 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B,
1802 0x7B, 0x7B, 0x7B, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C,
1803 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C,
1804 0x7C, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D,
1805 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D,
1806 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E,
1807 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F,
1808 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F,
1809 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x80,
1810 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
1811 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81,
1812 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
1813 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82,
1814 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
1815 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
1816 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
1817 0x83, 0x83, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
1818 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
1819 0x84, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
1820 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
1821 0x85, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
1822 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
1823 0x86, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
1824 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
1825 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
1826 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
1827 0x88, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
1828 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
1829 0x89, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A,
1830 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A,
1831 0x8A, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B,
1832 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B,
1833 0x8B, 0x8B, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C,
1834 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C,
1835 0x8C, 0x8C, 0x8C, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D,
1836 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D,
1837 0x8D, 0x8D, 0x8D, 0x8D, 0x8E, 0x8E, 0x8E, 0x8E,
1838 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E,
1839 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8F, 0x8F, 0x8F,
1840 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F,
1841 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x90, 0x90,
1842 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
1843 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x91,
1844 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91,
1845 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91,
1846 0x91, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92,
1847 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92,
1848 0x92, 0x92, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93,
1849 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93,
1850 0x93, 0x93, 0x93, 0x93, 0x94, 0x94, 0x94, 0x94,
1851 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94,
1852 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x95, 0x95,
1853 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95,
1854 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95,
1855 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96,
1856 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96,
1857 0x96, 0x96, 0x96, 0x97, 0x97, 0x97, 0x97, 0x97,
1858 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97,
1859 0x97, 0x97, 0x97, 0x97, 0x97, 0x98, 0x98, 0x98,
1860 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98,
1861 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98,
1862 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
1863 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
1864 0x99, 0x99, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A,
1865 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A,
1866 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9B, 0x9B, 0x9B,
1867 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B,
1868 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B,
1869 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C,
1870 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C,
1871 0x9C, 0x9C, 0x9C, 0x9C, 0x9D, 0x9D, 0x9D, 0x9D,
1872 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D,
1873 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9E,
1874 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E,
1875 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E,
1876 0x9E, 0x9E, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F,
1877 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F,
1878 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xA0, 0xA0,
1879 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0,
1880 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0,
1881 0xA0, 0xA0, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1,
1882 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1,
1883 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA2, 0xA2,
1884 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2,
1885 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2,
1886 0xA2, 0xA2, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3,
1887 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3,
1888 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA4, 0xA4,
1889 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
1890 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
1891 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5,
1892 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5,
1893 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5,
1894 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6,
1895 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6,
1896 0xA6, 0xA6, 0xA6, 0xA6, 0xA7, 0xA7, 0xA7, 0xA7,
1897 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7,
1898 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7,
1899 0xA7, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,
1900 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,
1901 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA9,
1902 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9,
1903 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9,
1904 0xA9, 0xA9, 0xA9, 0xA9, 0xAA, 0xAA, 0xAA, 0xAA,
1905 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
1906 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
1907 0xAA, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB,
1908 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB,
1909 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAC,
1910 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC,
1911 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC,
1912 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAD, 0xAD, 0xAD,
1913 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD,
1914 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD,
1915 0xAD, 0xAD, 0xAD, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE,
1916 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE,
1917 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE,
1918 0xAE, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF,
1919 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF,
1920 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xB0,
1921 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0,
1922 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0,
1923 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB1, 0xB1,
1924 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1,
1925 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1,
1926 0xB1, 0xB1, 0xB1, 0xB1, 0xB2, 0xB2, 0xB2, 0xB2,
1927 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2,
1928 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2,
1929 0xB2, 0xB2, 0xB2, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3,
1930 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3,
1931 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3,
1932 0xB3, 0xB3, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4,
1933 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4,
1934 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4,
1935 0xB4, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5,
1936 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5,
1937 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5,
1938 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6,
1939 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6,
1940 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6,
1941 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7,
1942 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7,
1943 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB8,
1944 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8,
1945 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8,
1946 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB9,
1947 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9,
1948 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9,
1949 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xBA,
1950 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA,
1951 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA,
1952 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBB,
1953 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
1954 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
1955 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
1956 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC,
1957 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC,
1958 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC,
1959 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
1960 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
1961 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
1962 0xBD, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE,
1963 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE,
1964 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE,
1965 0xBE, 0xBE, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF,
1966 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF,
1967 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF,
1968 0xBF, 0xBF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
1969 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
1970 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
1971 0xC0, 0xC0, 0xC0, 0xC0, 0xC1, 0xC1, 0xC1, 0xC1,
1972 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1,
1973 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1,
1974 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC2, 0xC2, 0xC2,
1975 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2,
1976 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2,
1977 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC3, 0xC3,
1978 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
1979 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
1980 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
1981 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4,
1982 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4,
1983 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4,
1984 0xC4, 0xC4, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5,
1985 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5,
1986 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5,
1987 0xC5, 0xC5, 0xC5, 0xC5, 0xC6, 0xC6, 0xC6, 0xC6,
1988 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1989 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1990 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC7, 0xC7,
1991 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7,
1992 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7,
1993 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7,
1994 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8,
1995 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8,
1996 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8,
1997 0xC8, 0xC8, 0xC8, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9,
1998 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9,
1999 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9,
2000 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xCA, 0xCA,
2001 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
2002 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
2003 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
2004 0xCA, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB,
2005 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB,
2006 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB,
2007 0xCB, 0xCB, 0xCB, 0xCB, 0xCC, 0xCC, 0xCC, 0xCC,
2008 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
2009 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
2010 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD,
2011 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,
2012 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,
2013 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,
2014 0xCD, 0xCD, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE,
2015 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE,
2016 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE,
2017 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCF, 0xCF,
2018 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF,
2019 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF,
2020 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF,
2021 0xCF, 0xCF, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0,
2022 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0,
2023 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0,
2024 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD1, 0xD1, 0xD1,
2025 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1,
2026 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1,
2027 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1,
2028 0xD1, 0xD1, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2,
2029 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2,
2030 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2,
2031 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD3, 0xD3,
2032 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3,
2033 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3,
2034 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3,
2035 0xD3, 0xD3, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4,
2036 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4,
2037 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4,
2038 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD5,
2039 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5,
2040 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5,
2041 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5,
2042 0xD5, 0xD5, 0xD5, 0xD5, 0xD6, 0xD6, 0xD6, 0xD6,
2043 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6,
2044 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6,
2045 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6,
2046 0xD6, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
2047 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
2048 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
2049 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD8, 0xD8,
2050 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
2051 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
2052 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
2053 0xD8, 0xD8, 0xD8, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9,
2054 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9,
2055 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9,
2056 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9,
2057 0xD9, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA,
2058 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA,
2059 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA,
2060 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDB, 0xDB,
2061 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB,
2062 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB,
2063 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB,
2064 0xDB, 0xDB, 0xDB, 0xDB, 0xDC, 0xDC, 0xDC, 0xDC,
2065 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC,
2066 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC,
2067 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC,
2068 0xDC, 0xDC, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
2069 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
2070 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
2071 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
2072 0xDD, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE,
2073 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE,
2074 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE,
2075 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDF,
2076 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF,
2077 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF,
2078 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF,
2079 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xE0, 0xE0,
2080 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
2081 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
2082 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
2083 0xE0, 0xE0, 0xE0, 0xE0, 0xE1, 0xE1, 0xE1, 0xE1,
2084 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1,
2085 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1,
2086 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1,
2087 0xE1, 0xE1, 0xE1, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2,
2088 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2,
2089 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2,
2090 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2,
2091 0xE2, 0xE2, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3,
2092 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3,
2093 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3,
2094 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3,
2095 0xE3, 0xE3, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4,
2096 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4,
2097 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4,
2098 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4,
2099 0xE4, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5,
2100 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5,
2101 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5,
2102 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5,
2103 0xE5, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6,
2104 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6,
2105 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6,
2106 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6,
2107 0xE6, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7,
2108 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7,
2109 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7,
2110 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7,
2111 0xE7, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8,
2112 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8,
2113 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8,
2114 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8,
2115 0xE8, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9,
2116 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9,
2117 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9,
2118 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9,
2119 0xE9, 0xE9, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA,
2120 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA,
2121 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA,
2122 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA,
2123 0xEA, 0xEA, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB,
2124 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB,
2125 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB,
2126 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB,
2127 0xEB, 0xEB, 0xEB, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
2128 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
2129 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
2130 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
2131 0xEC, 0xEC, 0xEC, 0xEC, 0xED, 0xED, 0xED, 0xED,
2132 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED,
2133 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED,
2134 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED,
2135 0xED, 0xED, 0xED, 0xED, 0xED, 0xEE, 0xEE, 0xEE,
2136 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
2137 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
2138 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
2139 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0xEF,
2140 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF,
2141 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF,
2142 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF,
2143 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF,
2144 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
2145 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
2146 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
2147 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
2148 0xF0, 0xF0, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1,
2149 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1,
2150 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1,
2151 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1,
2152 0xF1, 0xF1, 0xF1, 0xF1, 0xF2, 0xF2, 0xF2, 0xF2,
2153 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
2154 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
2155 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
2156 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF3, 0xF3,
2157 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
2158 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
2159 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
2160 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
2161 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
2162 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
2163 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
2164 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
2165 0xF4, 0xF4, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5,
2166 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5,
2167 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5,
2168 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5,
2169 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF6, 0xF6, 0xF6,
2170 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6,
2171 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6,
2172 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6,
2173 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6,
2174 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
2175 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
2176 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
2177 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
2178 0xF7, 0xF7, 0xF7, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
2179 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
2180 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
2181 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
2182 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF9, 0xF9,
2183 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9,
2184 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9,
2185 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9,
2186 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9,
2187 0xF9, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA,
2188 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA,
2189 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA,
2190 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA,
2191 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFB, 0xFB, 0xFB,
2192 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB,
2193 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB,
2194 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB,
2195 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB,
2196 0xFB, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
2197 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
2198 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
2199 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
2200 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFD, 0xFD, 0xFD,
2201 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
2202 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
2203 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
2204 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
2205 0xFD, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
2206 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
2207 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
2208 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
2209 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF,
2210 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
2211 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
2212};
2213
2214void mdp4_mixer_gc_lut_setup(int mixer_num)
2215{
2216 unsigned char *base;
2217 uint32 data;
2218 char val;
2219 int i, off;
2220
2221 if (mixer_num) /* mixer number, /dev/fb0, /dev/fb1 */
2222 base = MDP_BASE + MDP4_OVERLAYPROC1_BASE;/* 0x18000 */
2223 else
2224 base = MDP_BASE + MDP4_OVERLAYPROC0_BASE;/* 0x10000 */
2225
2226 base += 0x4000; /* GC_LUT offset */
2227
2228 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
2229 off = 0;
2230 for (i = 0; i < 4096; i++) {
2231 val = gc_lut[i];
2232 data = (val << 16 | val << 8 | val); /* R, B, and G are same */
2233 outpdw(base + off, data);
2234 off += 4;
2235 }
2236 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
2237}
2238
2239uint32 igc_video_lut[] = { /* non linear */
2240 0x0, 0x1, 0x2, 0x4, 0x5, 0x6, 0x7, 0x9,
2241 0xA, 0xB, 0xC, 0xE, 0xF, 0x10, 0x12, 0x14,
2242 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F, 0x21, 0x23,
2243 0x25, 0x28, 0x2A, 0x2D, 0x30, 0x32, 0x35, 0x38,
2244 0x3B, 0x3E, 0x42, 0x45, 0x48, 0x4C, 0x4F, 0x53,
2245 0x57, 0x5B, 0x5F, 0x63, 0x67, 0x6B, 0x70, 0x74,
2246 0x79, 0x7E, 0x83, 0x88, 0x8D, 0x92, 0x97, 0x9C,
2247 0xA2, 0xA8, 0xAD, 0xB3, 0xB9, 0xBF, 0xC5, 0xCC,
2248 0xD2, 0xD8, 0xDF, 0xE6, 0xED, 0xF4, 0xFB, 0x102,
2249 0x109, 0x111, 0x118, 0x120, 0x128, 0x130, 0x138, 0x140,
2250 0x149, 0x151, 0x15A, 0x162, 0x16B, 0x174, 0x17D, 0x186,
2251 0x190, 0x199, 0x1A3, 0x1AC, 0x1B6, 0x1C0, 0x1CA, 0x1D5,
2252 0x1DF, 0x1EA, 0x1F4, 0x1FF, 0x20A, 0x215, 0x220, 0x22B,
2253 0x237, 0x242, 0x24E, 0x25A, 0x266, 0x272, 0x27F, 0x28B,
2254 0x298, 0x2A4, 0x2B1, 0x2BE, 0x2CB, 0x2D8, 0x2E6, 0x2F3,
2255 0x301, 0x30F, 0x31D, 0x32B, 0x339, 0x348, 0x356, 0x365,
2256 0x374, 0x383, 0x392, 0x3A1, 0x3B1, 0x3C0, 0x3D0, 0x3E0,
2257 0x3F0, 0x400, 0x411, 0x421, 0x432, 0x443, 0x454, 0x465,
2258 0x476, 0x487, 0x499, 0x4AB, 0x4BD, 0x4CF, 0x4E1, 0x4F3,
2259 0x506, 0x518, 0x52B, 0x53E, 0x551, 0x565, 0x578, 0x58C,
2260 0x5A0, 0x5B3, 0x5C8, 0x5DC, 0x5F0, 0x605, 0x61A, 0x62E,
2261 0x643, 0x659, 0x66E, 0x684, 0x699, 0x6AF, 0x6C5, 0x6DB,
2262 0x6F2, 0x708, 0x71F, 0x736, 0x74D, 0x764, 0x77C, 0x793,
2263 0x7AB, 0x7C3, 0x7DB, 0x7F3, 0x80B, 0x824, 0x83D, 0x855,
2264 0x86F, 0x888, 0x8A1, 0x8BB, 0x8D4, 0x8EE, 0x908, 0x923,
2265 0x93D, 0x958, 0x973, 0x98E, 0x9A9, 0x9C4, 0x9DF, 0x9FB,
2266 0xA17, 0xA33, 0xA4F, 0xA6C, 0xA88, 0xAA5, 0xAC2, 0xADF,
2267 0xAFC, 0xB19, 0xB37, 0xB55, 0xB73, 0xB91, 0xBAF, 0xBCE,
2268 0xBEC, 0xC0B, 0xC2A, 0xC4A, 0xC69, 0xC89, 0xCA8, 0xCC8,
2269 0xCE8, 0xD09, 0xD29, 0xD4A, 0xD6B, 0xD8C, 0xDAD, 0xDCF,
2270 0xDF0, 0xE12, 0xE34, 0xE56, 0xE79, 0xE9B, 0xEBE, 0xEE1,
2271 0xF04, 0xF27, 0xF4B, 0xF6E, 0xF92, 0xFB6, 0xFDB, 0xFFF,
2272};
2273
2274void mdp4_vg_igc_lut_setup(int vp_num)
2275{
2276 unsigned char *base;
2277 int i, voff, off;
2278 uint32 data, val;
2279
2280 voff = MDP4_VIDEO_OFF * vp_num;
2281 base = MDP_BASE + MDP4_VIDEO_BASE + voff + 0x5000;
2282
2283 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
2284 off = 0;
2285 for (i = 0; i < 256; i++) {
2286 val = igc_video_lut[i];
2287 data = (val << 16 | val); /* color 0 and 1 */
2288 outpdw(base + off, data);
2289 outpdw(base + off + 0x800, val); /* color 2 */
2290 off += 4;
2291 }
2292 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
2293}
2294
2295uint32 igc_rgb_lut[] = { /* linear */
2296 0x0, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
2297 0x80, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1,
2298 0x101, 0x111, 0x121, 0x131, 0x141, 0x151, 0x161, 0x171,
2299 0x181, 0x191, 0x1A2, 0x1B2, 0x1C2, 0x1D2, 0x1E2, 0x1F2,
2300 0x202, 0x212, 0x222, 0x232, 0x242, 0x252, 0x262, 0x272,
2301 0x282, 0x292, 0x2A2, 0x2B3, 0x2C3, 0x2D3, 0x2E3, 0x2F3,
2302 0x303, 0x313, 0x323, 0x333, 0x343, 0x353, 0x363, 0x373,
2303 0x383, 0x393, 0x3A3, 0x3B3, 0x3C4, 0x3D4, 0x3E4, 0x3F4,
2304 0x404, 0x414, 0x424, 0x434, 0x444, 0x454, 0x464, 0x474,
2305 0x484, 0x494, 0x4A4, 0x4B4, 0x4C4, 0x4D5, 0x4E5, 0x4F5,
2306 0x505, 0x515, 0x525, 0x535, 0x545, 0x555, 0x565, 0x575,
2307 0x585, 0x595, 0x5A5, 0x5B5, 0x5C5, 0x5D5, 0x5E6, 0x5F6,
2308 0x606, 0x616, 0x626, 0x636, 0x646, 0x656, 0x666, 0x676,
2309 0x686, 0x696, 0x6A6, 0x6B6, 0x6C6, 0x6D6, 0x6E6, 0x6F7,
2310 0x707, 0x717, 0x727, 0x737, 0x747, 0x757, 0x767, 0x777,
2311 0x787, 0x797, 0x7A7, 0x7B7, 0x7C7, 0x7D7, 0x7E7, 0x7F7,
2312 0x808, 0x818, 0x828, 0x838, 0x848, 0x858, 0x868, 0x878,
2313 0x888, 0x898, 0x8A8, 0x8B8, 0x8C8, 0x8D8, 0x8E8, 0x8F8,
2314 0x908, 0x919, 0x929, 0x939, 0x949, 0x959, 0x969, 0x979,
2315 0x989, 0x999, 0x9A9, 0x9B9, 0x9C9, 0x9D9, 0x9E9, 0x9F9,
2316 0xA09, 0xA19, 0xA2A, 0xA3A, 0xA4A, 0xA5A, 0xA6A, 0xA7A,
2317 0xA8A, 0xA9A, 0xAAA, 0xABA, 0xACA, 0xADA, 0xAEA, 0xAFA,
2318 0xB0A, 0xB1A, 0xB2A, 0xB3B, 0xB4B, 0xB5B, 0xB6B, 0xB7B,
2319 0xB8B, 0xB9B, 0xBAB, 0xBBB, 0xBCB, 0xBDB, 0xBEB, 0xBFB,
2320 0xC0B, 0xC1B, 0xC2B, 0xC3B, 0xC4C, 0xC5C, 0xC6C, 0xC7C,
2321 0xC8C, 0xC9C, 0xCAC, 0xCBC, 0xCCC, 0xCDC, 0xCEC, 0xCFC,
2322 0xD0C, 0xD1C, 0xD2C, 0xD3C, 0xD4C, 0xD5D, 0xD6D, 0xD7D,
2323 0xD8D, 0xD9D, 0xDAD, 0xDBD, 0xDCD, 0xDDD, 0xDED, 0xDFD,
2324 0xE0D, 0xE1D, 0xE2D, 0xE3D, 0xE4D, 0xE5D, 0xE6E, 0xE7E,
2325 0xE8E, 0xE9E, 0xEAE, 0xEBE, 0xECE, 0xEDE, 0xEEE, 0xEFE,
2326 0xF0E, 0xF1E, 0xF2E, 0xF3E, 0xF4E, 0xF5E, 0xF6E, 0xF7F,
2327 0xF8F, 0xF9F, 0xFAF, 0xFBF, 0xFCF, 0xFDF, 0xFEF, 0xFFF,
2328};
2329
2330void mdp4_rgb_igc_lut_setup(int num)
2331{
2332 unsigned char *base;
2333 int i, voff, off;
2334 uint32 data, val;
2335
2336 voff = MDP4_RGB_OFF * num;
2337 base = MDP_BASE + MDP4_RGB_BASE + voff + 0x5000;
2338
2339 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
2340 off = 0;
2341 for (i = 0; i < 256; i++) {
2342 val = igc_rgb_lut[i];
2343 data = (val << 16 | val); /* color 0 and 1 */
2344 outpdw(base + off, data);
2345 outpdw(base + off + 0x800, val); /* color 2 */
2346 off += 4;
2347 }
2348 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
2349}
2350
2351uint32 mdp4_rgb_igc_lut_cvt(uint32 ndx)
2352{
2353 return igc_rgb_lut[ndx & 0x0ff];
2354}
2355
2356uint32_t mdp4_ss_table_value(int8_t value, int8_t index)
2357{
2358 uint32_t out = 0x0;
2359 int8_t level = -1;
2360 uint32_t mask = 0xffffffff;
2361
2362 if (value < 0) {
2363 if (value == -128)
2364 value = 127;
2365 else
2366 value = -value;
2367 out = 0x11111111;
2368 } else {
2369 out = 0x88888888;
2370 mask = 0x0fffffff;
2371 }
2372
2373 if (value == 0)
2374 level = 0;
2375 else {
2376 while (value > 0 && level < 7) {
2377 level++;
2378 value -= 16;
2379 }
2380 }
2381
2382 if (level == 0) {
2383 if (index == 0)
2384 out = 0x0;
2385 else
2386 out = 0x20000000;
2387 } else {
2388 out += (0x11111111 * level);
2389 if (index == 1)
2390 out &= mask;
2391 }
2392
2393 return out;
2394}
2395
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002396static uint32_t mdp4_csc_block2base(uint32_t block)
2397{
2398 uint32_t base = 0x0;
2399 switch (block) {
2400 case MDP_BLOCK_OVERLAY_1:
2401 base = 0x1A000;
2402 break;
2403 case MDP_BLOCK_VG_1:
2404 base = 0x24000;
2405 break;
2406 case MDP_BLOCK_VG_2:
2407 base = 0x34000;
2408 break;
2409 case MDP_BLOCK_DMA_P:
2410 base = 0x93000;
2411 break;
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002412 case MDP_BLOCK_DMA_S:
2413 base = (mdp_rev >= MDP_REV_42) ? 0xA3000 : 0x0;
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002414 default:
2415 break;
2416 }
2417 return base;
2418}
2419
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002420int mdp4_csc_enable(struct mdp_csc_cfg_data *config)
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002421{
2422 uint32_t output, base, temp, mask;
2423
2424 switch (config->block) {
2425 case MDP_BLOCK_DMA_P:
2426 base = 0x90070;
2427 output = (config->csc_data.flags << 3) & (0x08);
2428 temp = (config->csc_data.flags << 10) & (0x1800);
2429 output |= temp;
2430 mask = 0x08 | 0x1800;
2431 break;
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002432 case MDP_BLOCK_DMA_S:
2433 base = 0xA0028;
2434 output = (config->csc_data.flags << 3) & (0x08);
2435 temp = (config->csc_data.flags << 10) & (0x1800);
2436 output |= temp;
2437 mask = 0x08 | 0x1800;
2438 break;
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002439 case MDP_BLOCK_VG_1:
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002440 base = 0x20058;
2441 output = (config->csc_data.flags << 11) & (0x800);
2442 temp = (config->csc_data.flags << 8) & (0x600);
2443 output |= temp;
2444 mask = 0x800 | 0x600;
2445 break;
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002446 case MDP_BLOCK_VG_2:
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002447 base = 0x30058;
2448 output = (config->csc_data.flags << 11) & (0x800);
2449 temp = (config->csc_data.flags << 8) & (0x600);
2450 output |= temp;
2451 mask = 0x800 | 0x600;
2452 break;
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002453 case MDP_BLOCK_OVERLAY_1:
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002454 base = 0x18200;
2455 output = config->csc_data.flags;
2456 mask = 0x07;
2457 break;
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002458 default:
2459 pr_err("%s - CSC block does not exist on MDP_BLOCK = %d\n",
2460 __func__, config->block);
2461 return -EINVAL;
2462 }
2463
2464 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
2465 temp = inpdw(MDP_BASE + base) & ~mask;
2466 output |= temp;
2467 outpdw(MDP_BASE + base, output);
2468 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
2469 return 0;
2470}
2471
2472#define CSC_MV_OFF 0x400
2473#define CSC_BV_OFF 0x500
2474#define CSC_LV_OFF 0x600
2475#define CSC_POST_OFF 0x80
2476
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002477void mdp4_csc_write(struct mdp_csc_cfg *data, uint32_t base)
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002478{
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002479 int i;
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002480 uint32_t *off;
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002481
2482 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002483 off = (uint32_t *) ((uint32_t) base + CSC_MV_OFF);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002484 for (i = 0; i < 9; i++) {
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002485 outpdw(off, data->csc_mv[i]);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002486 off++;
2487 }
2488
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002489 off = (uint32_t *) ((uint32_t) base + CSC_BV_OFF);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002490 for (i = 0; i < 3; i++) {
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002491 outpdw(off, data->csc_pre_bv[i]);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002492 outpdw((uint32_t *)((uint32_t)off + CSC_POST_OFF),
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002493 data->csc_post_bv[i]);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002494 off++;
2495 }
2496
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002497 off = (uint32_t *) ((uint32_t) base + CSC_LV_OFF);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002498 for (i = 0; i < 6; i++) {
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002499 outpdw(off, data->csc_pre_lv[i]);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002500 outpdw((uint32_t *)((uint32_t)off + CSC_POST_OFF),
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002501 data->csc_post_lv[i]);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002502 off++;
2503 }
2504 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002505}
2506
2507int mdp4_csc_config(struct mdp_csc_cfg_data *config)
2508{
2509 int ret = 0;
2510 uint32_t base;
2511
2512 base = mdp4_csc_block2base(config->block);
2513 if (!base) {
2514 pr_warn("%s: Block type %d isn't supported by CSC.\n",
2515 __func__, config->block);
2516 return -EINVAL;
2517 }
2518
2519 mdp4_csc_write(&config->csc_data, (uint32_t) (MDP_BASE + base));
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002520
2521 ret = mdp4_csc_enable(config);
2522
2523 return ret;
2524}
2525
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002526void mdp4_init_writeback_buf(struct msm_fb_data_type *mfd, u32 mix_num)
2527{
2528 struct mdp_buf_type *buf;
2529
2530 if (mix_num == MDP4_MIXER0)
2531 buf = mfd->ov0_wb_buf;
2532 else
2533 buf = mfd->ov1_wb_buf;
2534
2535 buf->ihdl = NULL;
2536 buf->phys_addr = 0;
2537}
2538
2539u32 mdp4_allocate_writeback_buf(struct msm_fb_data_type *mfd, u32 mix_num)
2540{
2541 struct mdp_buf_type *buf;
2542 ion_phys_addr_t addr;
Ravishangar Kalyanam6bc448a2012-03-14 11:31:52 -07002543 unsigned long len;
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002544
2545 if (mix_num == MDP4_MIXER0)
2546 buf = mfd->ov0_wb_buf;
2547 else
2548 buf = mfd->ov1_wb_buf;
2549
2550 if (buf->phys_addr || !IS_ERR_OR_NULL(buf->ihdl))
2551 return 0;
2552
2553 if (!buf->size) {
Ravishangar Kalyanam175d1282012-01-20 16:57:23 -08002554 pr_err("%s:%d In valid size\n", __func__, __LINE__);
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002555 return -EINVAL;
2556 }
2557
2558 if (!IS_ERR_OR_NULL(mfd->iclient)) {
Ravishangar Kalyanama3b168b2012-03-26 11:13:11 -07002559 pr_info("%s:%d ion based allocation mfd->mem_hid 0x%x\n",
2560 __func__, __LINE__, mfd->mem_hid);
2561 buf->ihdl = ion_alloc(mfd->iclient, buf->size, SZ_4K,
2562 mfd->mem_hid);
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002563 if (!IS_ERR_OR_NULL(buf->ihdl)) {
Ravishangar Kalyanam6bc448a2012-03-14 11:31:52 -07002564 if (ion_map_iommu(mfd->iclient, buf->ihdl,
2565 DISPLAY_DOMAIN, GEN_POOL, SZ_4K, 0, &addr,
2566 &len, 0, 0)) {
2567 pr_err("ion_map_iommu() failed\n");
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002568 return -ENOMEM;
2569 }
2570 } else {
Ravishangar Kalyanam175d1282012-01-20 16:57:23 -08002571 pr_err("%s:%d: ion_alloc failed\n", __func__,
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002572 __LINE__);
2573 return -ENOMEM;
2574 }
2575 } else {
2576 addr = allocate_contiguous_memory_nomap(buf->size,
2577 mfd->mem_hid, 4);
2578 }
2579 if (addr) {
2580 pr_info("allocating %d bytes at %x for mdp writeback\n",
2581 buf->size, (u32) addr);
2582 buf->phys_addr = addr;
2583 return 0;
2584 } else {
2585 pr_err("%s cannot allocate memory for mdp writeback!\n",
2586 __func__);
2587 return -ENOMEM;
2588 }
2589}
2590
2591void mdp4_free_writeback_buf(struct msm_fb_data_type *mfd, u32 mix_num)
2592{
2593 struct mdp_buf_type *buf;
2594
2595 if (mix_num == MDP4_MIXER0)
2596 buf = mfd->ov0_wb_buf;
2597 else
2598 buf = mfd->ov1_wb_buf;
2599
2600 if (!IS_ERR_OR_NULL(mfd->iclient)) {
Ravishangar Kalyanam175d1282012-01-20 16:57:23 -08002601 if (!IS_ERR_OR_NULL(buf->ihdl)) {
Ravishangar Kalyanam6bc448a2012-03-14 11:31:52 -07002602 ion_unmap_iommu(mfd->iclient, buf->ihdl,
2603 DISPLAY_DOMAIN, GEN_POOL);
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002604 ion_free(mfd->iclient, buf->ihdl);
Jeff Ohlstein9cb0ead2011-12-16 13:30:08 -08002605 pr_debug("%s:%d free writeback imem\n", __func__,
Ravishangar Kalyanam175d1282012-01-20 16:57:23 -08002606 __LINE__);
2607 buf->ihdl = NULL;
2608 }
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002609 } else {
Ravishangar Kalyanam175d1282012-01-20 16:57:23 -08002610 if (buf->phys_addr) {
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002611 free_contiguous_memory_by_paddr(buf->phys_addr);
Jeff Ohlstein9cb0ead2011-12-16 13:30:08 -08002612 pr_debug("%s:%d free writeback pmem\n", __func__,
Ravishangar Kalyanam175d1282012-01-20 16:57:23 -08002613 __LINE__);
2614 }
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002615 }
2616 buf->phys_addr = 0;
2617}
Pravin Tamkhane85153bd2011-12-13 13:56:46 -08002618
2619static int mdp4_update_pcc_regs(uint32_t offset,
2620 struct mdp_pcc_cfg_data *cfg_ptr)
2621{
2622 int ret = -1;
2623
2624 if (offset && cfg_ptr) {
2625
2626 outpdw(offset, cfg_ptr->r.c);
2627 outpdw(offset + 0x30, cfg_ptr->g.c);
2628 outpdw(offset + 0x60, cfg_ptr->b.c);
2629 offset += 4;
2630
2631 outpdw(offset, cfg_ptr->r.r);
2632 outpdw(offset + 0x30, cfg_ptr->g.r);
2633 outpdw(offset + 0x60, cfg_ptr->b.r);
2634 offset += 4;
2635
2636 outpdw(offset, cfg_ptr->r.g);
2637 outpdw(offset + 0x30, cfg_ptr->g.g);
2638 outpdw(offset + 0x60, cfg_ptr->b.g);
2639 offset += 4;
2640
2641 outpdw(offset, cfg_ptr->r.b);
2642 outpdw(offset + 0x30, cfg_ptr->g.b);
2643 outpdw(offset + 0x60, cfg_ptr->b.b);
2644 offset += 4;
2645
2646 outpdw(offset, cfg_ptr->r.rr);
2647 outpdw(offset + 0x30, cfg_ptr->g.rr);
2648 outpdw(offset + 0x60, cfg_ptr->b.rr);
2649 offset += 4;
2650
2651 outpdw(offset, cfg_ptr->r.gg);
2652 outpdw(offset + 0x30, cfg_ptr->g.gg);
2653 outpdw(offset + 0x60, cfg_ptr->b.gg);
2654 offset += 4;
2655
2656 outpdw(offset, cfg_ptr->r.bb);
2657 outpdw(offset + 0x30, cfg_ptr->g.bb);
2658 outpdw(offset + 0x60, cfg_ptr->b.bb);
2659 offset += 4;
2660
2661 outpdw(offset, cfg_ptr->r.rg);
2662 outpdw(offset + 0x30, cfg_ptr->g.rg);
2663 outpdw(offset + 0x60, cfg_ptr->b.rg);
2664 offset += 4;
2665
2666 outpdw(offset, cfg_ptr->r.gb);
2667 outpdw(offset + 0x30, cfg_ptr->g.gb);
2668 outpdw(offset + 0x60, cfg_ptr->b.gb);
2669 offset += 4;
2670
2671 outpdw(offset, cfg_ptr->r.rb);
2672 outpdw(offset + 0x30, cfg_ptr->g.rb);
2673 outpdw(offset + 0x60, cfg_ptr->b.rb);
2674 offset += 4;
2675
2676 outpdw(offset, cfg_ptr->r.rgb_0);
2677 outpdw(offset + 0x30, cfg_ptr->g.rgb_0);
2678 outpdw(offset + 0x60, cfg_ptr->b.rgb_0);
2679 offset += 4;
2680
2681 outpdw(offset, cfg_ptr->r.rgb_1);
2682 outpdw(offset + 0x30, cfg_ptr->g.rgb_1);
2683 outpdw(offset + 0x60, cfg_ptr->b.rgb_1);
2684
2685 ret = 0;
2686 }
2687
2688 return ret;
2689}
2690
2691static int mdp4_read_pcc_regs(uint32_t offset,
2692 struct mdp_pcc_cfg_data *cfg_ptr)
2693{
2694 int ret = -1;
2695
2696 if (offset && cfg_ptr) {
2697 cfg_ptr->r.c = inpdw(offset);
2698 cfg_ptr->g.c = inpdw(offset + 0x30);
2699 cfg_ptr->b.c = inpdw(offset + 0x60);
2700 offset += 4;
2701
2702 cfg_ptr->r.r = inpdw(offset);
2703 cfg_ptr->g.r = inpdw(offset + 0x30);
2704 cfg_ptr->b.r = inpdw(offset + 0x60);
2705 offset += 4;
2706
2707 cfg_ptr->r.g = inpdw(offset);
2708 cfg_ptr->g.g = inpdw(offset + 0x30);
2709 cfg_ptr->b.g = inpdw(offset + 0x60);
2710 offset += 4;
2711
2712 cfg_ptr->r.b = inpdw(offset);
2713 cfg_ptr->g.b = inpdw(offset + 0x30);
2714 cfg_ptr->b.b = inpdw(offset + 0x60);
2715 offset += 4;
2716
2717 cfg_ptr->r.rr = inpdw(offset);
2718 cfg_ptr->g.rr = inpdw(offset + 0x30);
2719 cfg_ptr->b.rr = inpdw(offset + 0x60);
2720 offset += 4;
2721
2722 cfg_ptr->r.gg = inpdw(offset);
2723 cfg_ptr->g.gg = inpdw(offset + 0x30);
2724 cfg_ptr->b.gg = inpdw(offset + 0x60);
2725 offset += 4;
2726
2727 cfg_ptr->r.bb = inpdw(offset);
2728 cfg_ptr->g.bb = inpdw(offset + 0x30);
2729 cfg_ptr->b.bb = inpdw(offset + 0x60);
2730 offset += 4;
2731
2732 cfg_ptr->r.rg = inpdw(offset);
2733 cfg_ptr->g.rg = inpdw(offset + 0x30);
2734 cfg_ptr->b.rg = inpdw(offset + 0x60);
2735 offset += 4;
2736
2737 cfg_ptr->r.gb = inpdw(offset);
2738 cfg_ptr->g.gb = inpdw(offset + 0x30);
2739 cfg_ptr->b.gb = inpdw(offset + 0x60);
2740 offset += 4;
2741
2742 cfg_ptr->r.rb = inpdw(offset);
2743 cfg_ptr->g.rb = inpdw(offset + 0x30);
2744 cfg_ptr->b.rb = inpdw(offset + 0x60);
2745 offset += 4;
2746
2747 cfg_ptr->r.rgb_0 = inpdw(offset);
2748 cfg_ptr->g.rgb_0 = inpdw(offset + 0x30);
2749 cfg_ptr->b.rgb_0 = inpdw(offset + 0x60);
2750 offset += 4;
2751
2752 cfg_ptr->r.rgb_1 = inpdw(offset);
2753 cfg_ptr->g.rgb_1 = inpdw(offset + 0x30);
2754 cfg_ptr->b.rgb_1 = inpdw(offset + 0x60);
2755
2756 ret = 0;
2757 }
2758
2759 return ret;
2760}
2761
Pravin Tamkhane85153bd2011-12-13 13:56:46 -08002762
2763#define MDP_PCC_OFFSET 0xA000
Pravin Tamkhane22515242012-03-01 17:45:52 -08002764#define MDP_DMA_GC_OFFSET 0x8800
2765#define MDP_LM_0_GC_OFFSET 0x4800
2766#define MDP_LM_1_GC_OFFSET 0x4880
2767
Pravin Tamkhane85153bd2011-12-13 13:56:46 -08002768
2769#define MDP_DMA_P_OP_MODE_OFFSET 0x70
2770#define MDP_DMA_S_OP_MODE_OFFSET 0x28
Pravin Tamkhane22515242012-03-01 17:45:52 -08002771#define MDP_LM_OP_MODE_OFFSET 0x10
Pravin Tamkhane85153bd2011-12-13 13:56:46 -08002772
2773#define DMA_PCC_R2_OFFSET 0x100
2774
Pravin Tamkhane22515242012-03-01 17:45:52 -08002775#define MDP_GC_COLOR_OFFSET 0x100
2776#define MDP_GC_PARMS_OFFSET 0x80
2777
2778#define MDP_AR_GC_MAX_STAGES 16
2779
2780static uint32_t mdp_pp_block2pcc(uint32_t block)
2781{
2782 uint32_t valid = 0;
2783
2784 switch (block) {
2785 case MDP_BLOCK_DMA_P:
2786 case MDP_BLOCK_DMA_S:
2787 valid = (mdp_rev >= MDP_REV_42) ? 1 : 0;
2788 break;
2789
2790 default:
2791 break;
2792 }
2793
2794 return valid;
2795}
2796
Pravin Tamkhane85153bd2011-12-13 13:56:46 -08002797int mdp4_pcc_cfg(struct mdp_pcc_cfg_data *cfg_ptr)
2798{
2799 int ret = -1;
2800 uint32_t pcc_offset = 0, mdp_cfg_offset = 0;
2801 uint32_t mdp_dma_op_mode = 0;
Pravin Tamkhane22515242012-03-01 17:45:52 -08002802 uint32_t blockbase;
2803
2804 if (!mdp_pp_block2pcc(cfg_ptr->block))
2805 return ret;
2806
2807 blockbase = mdp_block2base(cfg_ptr->block);
2808 if (!blockbase)
2809 return ret;
2810
2811 blockbase += (uint32_t) MDP_BASE;
Pravin Tamkhane85153bd2011-12-13 13:56:46 -08002812
2813 switch (cfg_ptr->block) {
2814 case MDP_BLOCK_DMA_P:
Pravin Tamkhane85153bd2011-12-13 13:56:46 -08002815 case MDP_BLOCK_DMA_S:
Pravin Tamkhane22515242012-03-01 17:45:52 -08002816 pcc_offset = blockbase + MDP_PCC_OFFSET;
2817 mdp_cfg_offset = blockbase;
2818 mdp_dma_op_mode = blockbase +
2819 (MDP_BLOCK_DMA_P == cfg_ptr->block ?
2820 MDP_DMA_P_OP_MODE_OFFSET
2821 : MDP_DMA_S_OP_MODE_OFFSET);
Pravin Tamkhane85153bd2011-12-13 13:56:46 -08002822 break;
2823
2824 default:
2825 break;
2826 }
2827
2828 if (0x8 & cfg_ptr->ops)
2829 pcc_offset += DMA_PCC_R2_OFFSET;
2830
2831 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
2832
2833 switch ((0x6 & cfg_ptr->ops)>>1) {
2834 case 0x1:
2835 ret = mdp4_read_pcc_regs(pcc_offset, cfg_ptr);
2836 break;
2837
2838 case 0x2:
2839 ret = mdp4_update_pcc_regs(pcc_offset, cfg_ptr);
2840 break;
2841
2842 default:
2843 break;
2844 }
2845
2846 if (0x8 & cfg_ptr->ops)
2847 outpdw(mdp_dma_op_mode,
2848 (inpdw(mdp_dma_op_mode)|((0x8&cfg_ptr->ops)<<10)));
2849
2850 outpdw(mdp_cfg_offset,
2851 (inpdw(mdp_cfg_offset)|((cfg_ptr->ops&0x1)<<29)));
2852
2853 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
2854
2855 return ret;
2856}
2857
Pravin Tamkhane22515242012-03-01 17:45:52 -08002858static uint32_t mdp_pp_block2argc(uint32_t block)
2859{
2860 uint32_t valid = 0;
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002861
Pravin Tamkhane22515242012-03-01 17:45:52 -08002862 switch (block) {
2863 case MDP_BLOCK_DMA_P:
2864 case MDP_BLOCK_DMA_S:
2865 case MDP_BLOCK_OVERLAY_0:
2866 case MDP_BLOCK_OVERLAY_1:
2867 valid = (mdp_rev >= MDP_REV_42) ? 1 : 0;
2868 break;
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002869
Pravin Tamkhane22515242012-03-01 17:45:52 -08002870 default:
2871 break;
2872 }
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002873
Pravin Tamkhane22515242012-03-01 17:45:52 -08002874 return valid;
2875}
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002876
2877static int update_ar_gc_lut(uint32_t *offset, struct mdp_pgc_lut_data *lut_data)
2878{
Pravin Tamkhane5c1fa462012-03-07 17:49:09 -08002879 int count = 0;
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002880
2881 uint32_t *c0_offset = offset;
2882 uint32_t *c0_params_offset = (uint32_t *)((uint32_t)c0_offset
2883 + MDP_GC_PARMS_OFFSET);
2884
2885 uint32_t *c1_offset = (uint32_t *)((uint32_t)offset
2886 + MDP_GC_COLOR_OFFSET);
2887
2888 uint32_t *c1_params_offset = (uint32_t *)((uint32_t)c1_offset
2889 + MDP_GC_PARMS_OFFSET);
2890
2891 uint32_t *c2_offset = (uint32_t *)((uint32_t)offset
2892 + 2*MDP_GC_COLOR_OFFSET);
2893
2894 uint32_t *c2_params_offset = (uint32_t *)((uint32_t)c2_offset
2895 +MDP_GC_PARMS_OFFSET);
2896
2897
Pravin Tamkhane5c1fa462012-03-07 17:49:09 -08002898 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002899 for (count = 0; count < MDP_AR_GC_MAX_STAGES; count++) {
2900 if (count < lut_data->num_r_stages) {
2901 outpdw(c0_offset+count,
2902 ((0xfff & lut_data->r_data[count].x_start)
2903 | 0x10000));
2904
2905 outpdw(c0_params_offset+count,
2906 ((0x7fff & lut_data->r_data[count].slope)
2907 | ((0xffff
2908 & lut_data->r_data[count].offset)
2909 << 16)));
2910 } else
2911 outpdw(c0_offset+count, 0);
2912
2913 if (count < lut_data->num_b_stages) {
2914 outpdw(c1_offset+count,
2915 ((0xfff & lut_data->b_data[count].x_start)
2916 | 0x10000));
2917
2918 outpdw(c1_params_offset+count,
2919 ((0x7fff & lut_data->b_data[count].slope)
2920 | ((0xffff
2921 & lut_data->b_data[count].offset)
2922 << 16)));
2923 } else
2924 outpdw(c1_offset+count, 0);
2925
2926 if (count < lut_data->num_g_stages) {
2927 outpdw(c2_offset+count,
2928 ((0xfff & lut_data->g_data[count].x_start)
2929 | 0x10000));
2930
2931 outpdw(c2_params_offset+count,
2932 ((0x7fff & lut_data->g_data[count].slope)
2933 | ((0xffff
2934 & lut_data->g_data[count].offset)
2935 << 16)));
2936 } else
2937 outpdw(c2_offset+count, 0);
2938 }
2939
Pravin Tamkhane5c1fa462012-03-07 17:49:09 -08002940 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002941
Pravin Tamkhane5c1fa462012-03-07 17:49:09 -08002942 return 0;
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002943}
2944
Pravin Tamkhane5c1fa462012-03-07 17:49:09 -08002945static int mdp4_argc_process_write_req(uint32_t *offset,
2946 struct mdp_pgc_lut_data *pgc_ptr)
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002947{
Pravin Tamkhane22515242012-03-01 17:45:52 -08002948 int ret = -1;
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002949 struct mdp_ar_gc_lut_data r[MDP_AR_GC_MAX_STAGES];
2950 struct mdp_ar_gc_lut_data g[MDP_AR_GC_MAX_STAGES];
2951 struct mdp_ar_gc_lut_data b[MDP_AR_GC_MAX_STAGES];
2952
2953 ret = copy_from_user(&r[0], pgc_ptr->r_data,
Pravin Tamkhane22515242012-03-01 17:45:52 -08002954 pgc_ptr->num_r_stages * sizeof(struct mdp_ar_gc_lut_data));
2955
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002956 if (!ret) {
2957 ret = copy_from_user(&g[0],
Pravin Tamkhane22515242012-03-01 17:45:52 -08002958 pgc_ptr->g_data,
2959 pgc_ptr->num_g_stages
2960 * sizeof(struct mdp_ar_gc_lut_data));
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002961 if (!ret)
2962 ret = copy_from_user(&b[0],
Pravin Tamkhane22515242012-03-01 17:45:52 -08002963 pgc_ptr->b_data,
2964 pgc_ptr->num_b_stages
2965 * sizeof(struct mdp_ar_gc_lut_data));
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002966 }
2967
2968 if (ret)
2969 return ret;
2970
2971 pgc_ptr->r_data = &r[0];
2972 pgc_ptr->g_data = &g[0];
2973 pgc_ptr->b_data = &b[0];
2974
Pravin Tamkhane5c1fa462012-03-07 17:49:09 -08002975 ret = update_ar_gc_lut(offset, pgc_ptr);
2976 return ret;
2977}
2978
2979int mdp4_argc_cfg(struct mdp_pgc_lut_data *pgc_ptr)
2980{
2981 int ret = -1;
2982 uint32_t *offset = 0, *pgc_enable_offset = 0, lshift_bits = 0;
2983 uint32_t blockbase;
2984
2985 if (!mdp_pp_block2argc(pgc_ptr->block))
2986 return ret;
2987
2988 blockbase = mdp_block2base(pgc_ptr->block);
2989 if (!blockbase)
2990 return ret;
2991
Pravin Tamkhane22515242012-03-01 17:45:52 -08002992 blockbase += (uint32_t) MDP_BASE;
Pravin Tamkhane5c1fa462012-03-07 17:49:09 -08002993 ret = 0;
Pravin Tamkhane22515242012-03-01 17:45:52 -08002994
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002995 switch (pgc_ptr->block) {
2996 case MDP_BLOCK_DMA_P:
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002997 case MDP_BLOCK_DMA_S:
Pravin Tamkhane22515242012-03-01 17:45:52 -08002998 offset = (uint32_t *)(blockbase + MDP_DMA_GC_OFFSET);
2999 pgc_enable_offset = (uint32_t *) blockbase;
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08003000 lshift_bits = 28;
3001 break;
3002
3003 case MDP_BLOCK_OVERLAY_0:
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08003004 case MDP_BLOCK_OVERLAY_1:
Pravin Tamkhane22515242012-03-01 17:45:52 -08003005 offset = (uint32_t *)(blockbase +
3006 (MDP_BLOCK_OVERLAY_0 == pgc_ptr->block ?
3007 MDP_LM_0_GC_OFFSET
3008 : MDP_LM_1_GC_OFFSET));
3009
3010 pgc_enable_offset = (uint32_t *)(blockbase
3011 + MDP_LM_OP_MODE_OFFSET);
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08003012 lshift_bits = 2;
3013 break;
3014
3015 default:
3016 ret = -1;
3017 break;
3018 }
3019
3020 if (!ret) {
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08003021
Pravin Tamkhane5c1fa462012-03-07 17:49:09 -08003022 switch ((0x6 & pgc_ptr->flags)>>1) {
3023 case 0x1:
3024 ret = -ENOTTY;
3025 break;
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08003026
Pravin Tamkhane5c1fa462012-03-07 17:49:09 -08003027 case 0x2:
3028 ret = mdp4_argc_process_write_req(offset, pgc_ptr);
3029 break;
3030
3031 default:
3032 break;
3033 }
3034
3035 if (!ret) {
3036 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
3037 outpdw(pgc_enable_offset, (inpdw(pgc_enable_offset) |
3038 ((0x1 & pgc_ptr->flags) << lshift_bits)));
3039 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF,
3040 FALSE);
3041 }
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08003042 }
3043
3044 return ret;
3045}
3046
Carl Vanderlipacde4b62011-12-16 15:50:56 -08003047static uint32_t mdp4_pp_block2igc(uint32_t block)
3048{
3049 uint32_t valid = 0;
3050 switch (block) {
3051 case MDP_BLOCK_VG_1:
3052 valid = 0x1;
3053 break;
3054 case MDP_BLOCK_VG_2:
3055 valid = 0x1;
3056 break;
3057 case MDP_BLOCK_RGB_1:
3058 valid = 0x1;
3059 break;
3060 case MDP_BLOCK_RGB_2:
3061 valid = 0x1;
3062 break;
3063 case MDP_BLOCK_DMA_P:
3064 valid = (mdp_rev >= MDP_REV_40) ? 1 : 0;
3065 break;
3066 case MDP_BLOCK_DMA_S:
3067 valid = (mdp_rev >= MDP_REV_40) ? 1 : 0;
3068 break;
3069 default:
3070 break;
3071 }
3072 return valid;
3073}
3074
3075static int mdp4_igc_lut_write(struct mdp_igc_lut_data *cfg, uint32_t en_off,
3076 uint32_t lut_off)
3077{
3078 int i;
3079 uint32_t base, *off_low, *off_high;
3080 uint32_t low[cfg->len];
3081 uint32_t high[cfg->len];
3082
3083 base = mdp_block2base(cfg->block);
3084
3085 if (cfg->len != 256)
3086 return -EINVAL;
3087
3088 off_low = (uint32_t *)(MDP_BASE + base + lut_off);
3089 off_high = (uint32_t *)(MDP_BASE + base + lut_off + 0x800);
3090 if (copy_from_user(&low, cfg->c0_c1_data, cfg->len * sizeof(uint32_t)))
3091 return -EFAULT;
3092 if (copy_from_user(&high, cfg->c2_data, cfg->len * sizeof(uint32_t)))
3093 return -EFAULT;
3094
3095 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
3096 for (i = 0; i < cfg->len; i++) {
3097 MDP_OUTP(off_low++, low[i]);
3098 /*low address write should occur before high address write*/
3099 wmb();
3100 MDP_OUTP(off_high++, high[i]);
3101 }
3102 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
3103 return 0;
3104}
3105
3106static int mdp4_igc_lut_ctrl(struct mdp_igc_lut_data *cfg)
3107{
3108 uint32_t mask, out;
3109 uint32_t base = mdp_block2base(cfg->block);
3110 int8_t shift = 0;
3111
3112 switch (cfg->block) {
3113 case MDP_BLOCK_DMA_P:
3114 case MDP_BLOCK_DMA_S:
3115 base = base;
3116 shift = 30;
3117 break;
3118 case MDP_BLOCK_VG_1:
3119 case MDP_BLOCK_VG_2:
3120 case MDP_BLOCK_RGB_1:
3121 case MDP_BLOCK_RGB_2:
3122 base += 0x58;
3123 shift = 16;
3124 break;
3125 default:
3126 return -EINVAL;
3127
3128 }
3129 out = 1<<shift;
3130 mask = ~out;
3131 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
3132 out = inpdw(MDP_BASE + base) & mask;
3133 MDP_OUTP(MDP_BASE + base, out | ((cfg->ops & 0x1)<<shift));
3134 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
3135
3136 return 0;
3137}
3138
3139static int mdp4_igc_lut_write_cfg(struct mdp_igc_lut_data *cfg)
3140{
3141 int ret = 0;
3142
3143 switch (cfg->block) {
3144 case MDP_BLOCK_DMA_P:
3145 case MDP_BLOCK_DMA_S:
3146 ret = mdp4_igc_lut_write(cfg, 0x00, 0x9000);
3147 break;
3148 case MDP_BLOCK_VG_1:
3149 case MDP_BLOCK_VG_2:
3150 case MDP_BLOCK_RGB_1:
3151 case MDP_BLOCK_RGB_2:
3152 ret = mdp4_igc_lut_write(cfg, 0x58, 0x5000);
3153 break;
3154 default:
3155 ret = -EINVAL;
3156 }
3157
3158 return ret;
3159}
3160
3161int mdp4_igc_lut_config(struct mdp_igc_lut_data *cfg)
3162{
3163 int ret = 0;
3164
3165 if (!mdp4_pp_block2igc(cfg->block)) {
3166 ret = -ENOTTY;
3167 goto error;
3168 }
3169
3170 switch ((cfg->ops & 0x6) >> 1) {
3171 case 0x1:
3172 pr_info("%s: IGC LUT read not supported\n", __func__);
3173 break;
3174 case 0x2:
3175 ret = mdp4_igc_lut_write_cfg(cfg);
3176 if (ret)
3177 goto error;
3178 break;
3179 default:
3180 break;
3181 }
3182
3183 ret = mdp4_igc_lut_ctrl(cfg);
3184
3185error:
3186 return ret;
3187}