blob: 82fbb659a62e02b2a197c156fce06b93a1eceba2 [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;
Carl Vanderlip7b8b6402012-03-01 10:58:03 -0800361 struct mdp_hist_mgmt *mgmt = NULL;
362 char *base_addr;
363 int i, ret;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700364
365 mdp_is_in_isr = TRUE;
366
367 /* complete all the reads before reading the interrupt
368 * status register - eliminate effects of speculative
369 * reads by the cpu
370 */
371 rmb();
372 isr = inpdw(MDP_INTR_STATUS);
373 if (isr == 0)
374 goto out;
375
376 mdp4_stat.intr_tot++;
377 mask = inpdw(MDP_INTR_ENABLE);
378 outpdw(MDP_INTR_CLEAR, isr);
379
380 if (isr & INTR_PRIMARY_INTF_UDERRUN) {
381 mdp4_stat.intr_underrun_p++;
382 /* When underun occurs mdp clear the histogram registers
383 that are set before in hw_init so restore them back so
384 that histogram works.*/
Carl Vanderlip7b8b6402012-03-01 10:58:03 -0800385 for (i = 0; i < MDP_HIST_MGMT_MAX; i++) {
386 mgmt = mdp_hist_mgmt_array[i];
387 if (!mgmt)
388 continue;
389 base_addr = MDP_BASE + mgmt->base;
390 MDP_OUTP(base_addr + 0x010, 1);
391 outpdw(base_addr + 0x01c, INTR_HIST_DONE |
392 INTR_HIST_RESET_SEQ_DONE);
393 mgmt->mdp_is_hist_valid = FALSE;
394 __mdp_histogram_reset(mgmt);
395 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700396 }
397
398 if (isr & INTR_EXTERNAL_INTF_UDERRUN)
399 mdp4_stat.intr_underrun_e++;
400
401 isr &= mask;
402
403 if (isr == 0)
404 goto out;
405
406 panel = mdp4_overlay_panel_list();
407 if (isr & INTR_PRIMARY_VSYNC) {
kuogee hsieh0948c682011-10-31 16:50:43 -0700408 mdp4_stat.intr_vsync_p++;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700409 dma = &dma2_data;
410 spin_lock(&mdp_spin_lock);
411 mdp_intr_mask &= ~INTR_PRIMARY_VSYNC;
412 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
413 dma->waiting = FALSE;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700414 if (panel & MDP4_PANEL_LCDC)
415 mdp4_primary_vsync_lcdc();
416#ifdef CONFIG_FB_MSM_MIPI_DSI
417 else if (panel & MDP4_PANEL_DSI_VIDEO)
418 mdp4_primary_vsync_dsi_video();
419#endif
kuogee hsieh3de11f32011-07-08 14:09:11 -0700420 spin_unlock(&mdp_spin_lock);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700421 }
422#ifdef CONFIG_FB_MSM_DTV
423 if (isr & INTR_EXTERNAL_VSYNC) {
kuogee hsieh0948c682011-10-31 16:50:43 -0700424 mdp4_stat.intr_vsync_e++;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700425 dma = &dma_e_data;
426 spin_lock(&mdp_spin_lock);
427 mdp_intr_mask &= ~INTR_EXTERNAL_VSYNC;
428 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
429 dma->waiting = FALSE;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700430 if (panel & MDP4_PANEL_DTV)
431 mdp4_external_vsync_dtv();
kuogee hsieh3de11f32011-07-08 14:09:11 -0700432 spin_unlock(&mdp_spin_lock);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700433 }
434#endif
kuogee hsieh40a43402011-10-04 08:48:18 -0700435
436#ifdef CONFIG_FB_MSM_OVERLAY
437 if (isr & INTR_OVERLAY0_DONE) {
438 mdp4_stat.intr_overlay0++;
439 dma = &dma2_data;
440 if (panel & (MDP4_PANEL_LCDC | MDP4_PANEL_DSI_VIDEO)) {
441 /* disable LCDC interrupt */
442 spin_lock(&mdp_spin_lock);
443 mdp_intr_mask &= ~INTR_OVERLAY0_DONE;
444 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
445 dma->waiting = FALSE;
446 spin_unlock(&mdp_spin_lock);
447 if (panel & MDP4_PANEL_LCDC)
448 mdp4_overlay0_done_lcdc(dma);
449#ifdef CONFIG_FB_MSM_MIPI_DSI
450 else if (panel & MDP4_PANEL_DSI_VIDEO)
451 mdp4_overlay0_done_dsi_video(dma);
452#endif
453 } else { /* MDDI, DSI_CMD */
454#ifdef CONFIG_FB_MSM_MIPI_DSI
455 if (panel & MDP4_PANEL_DSI_CMD)
456 mdp4_overlay0_done_dsi_cmd(dma);
457#else
458 if (panel & MDP4_PANEL_MDDI)
459 mdp4_overlay0_done_mddi(dma);
460#endif
461 }
462 mdp_hw_cursor_done();
463 }
464 if (isr & INTR_OVERLAY1_DONE) {
465 mdp4_stat.intr_overlay1++;
466 /* disable DTV interrupt */
467 dma = &dma_e_data;
468 spin_lock(&mdp_spin_lock);
469 mdp_intr_mask &= ~INTR_OVERLAY1_DONE;
470 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
471 dma->waiting = FALSE;
472 spin_unlock(&mdp_spin_lock);
473#if defined(CONFIG_FB_MSM_DTV)
474 if (panel & MDP4_PANEL_DTV)
475 mdp4_overlay1_done_dtv();
476#endif
477#if defined(CONFIG_FB_MSM_TVOUT)
478 if (panel & MDP4_PANEL_ATV)
479 mdp4_overlay1_done_atv();
480#endif
Rajesh Sastrulab52368b2011-12-22 12:09:17 -0800481 }
Vinay Kalia27020d12011-10-14 17:50:29 -0700482#if defined(CONFIG_FB_MSM_WRITEBACK_MSM_PANEL)
Rajesh Sastrulab52368b2011-12-22 12:09:17 -0800483 if (isr & INTR_OVERLAY2_DONE) {
484 mdp4_stat.intr_overlay2++;
485 /* disable DTV interrupt */
486 dma = &dma_wb_data;
487 spin_lock(&mdp_spin_lock);
488 mdp_intr_mask &= ~INTR_OVERLAY2_DONE;
489 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
490 dma->waiting = FALSE;
491 spin_unlock(&mdp_spin_lock);
Vinay Kalia27020d12011-10-14 17:50:29 -0700492 if (panel & MDP4_PANEL_WRITEBACK)
493 mdp4_overlay1_done_writeback(dma);
kuogee hsieh40a43402011-10-04 08:48:18 -0700494 }
Rajesh Sastrulab52368b2011-12-22 12:09:17 -0800495#endif
kuogee hsieh40a43402011-10-04 08:48:18 -0700496#endif /* OVERLAY */
497
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700498 if (isr & INTR_DMA_P_DONE) {
499 mdp4_stat.intr_dma_p++;
500 dma = &dma2_data;
501 if (panel & MDP4_PANEL_LCDC) {
502 /* disable LCDC interrupt */
503 spin_lock(&mdp_spin_lock);
504 mdp_intr_mask &= ~INTR_DMA_P_DONE;
505 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
506 dma->waiting = FALSE;
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700507 mdp4_dma_p_done_lcdc();
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700508 spin_unlock(&mdp_spin_lock);
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700509 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700510#ifdef CONFIG_FB_MSM_OVERLAY
511#ifdef CONFIG_FB_MSM_MIPI_DSI
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700512 else if (panel & MDP4_PANEL_DSI_VIDEO) {
513 /* disable LCDC interrupt */
514 spin_lock(&mdp_spin_lock);
515 mdp_intr_mask &= ~INTR_DMA_P_DONE;
516 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
517 dma->waiting = FALSE;
Kuogee Hsieh5ff2cb62012-04-11 10:43:07 -0700518 mdp4_dma_p_done_dsi_video(dma);
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700519 spin_unlock(&mdp_spin_lock);
520 } else if (panel & MDP4_PANEL_DSI_CMD) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700521 mdp4_dma_p_done_dsi(dma);
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700522 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700523#else
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700524 else { /* MDDI */
Mayank Chopra33a7d722012-02-29 12:25:31 +0530525 mdp4_dma_p_done_mddi(dma);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700526 mdp_pipe_ctrl(MDP_DMA2_BLOCK,
527 MDP_BLOCK_POWER_OFF, TRUE);
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700528 complete(&dma->comp);
529 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700530#endif
531#else
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700532 else {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700533 spin_lock(&mdp_spin_lock);
534 dma->busy = FALSE;
535 spin_unlock(&mdp_spin_lock);
kuogee hsiehc4b8b2f2011-07-12 13:32:14 -0700536 complete(&dma->comp);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700537 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700538#endif
539 }
540 if (isr & INTR_DMA_S_DONE) {
541 mdp4_stat.intr_dma_s++;
542#if defined(CONFIG_FB_MSM_OVERLAY) && defined(CONFIG_FB_MSM_MDDI)
543 dma = &dma2_data;
544#else
545 dma = &dma_s_data;
546#endif
547
548 dma->busy = FALSE;
549 mdp_pipe_ctrl(MDP_DMA_S_BLOCK,
550 MDP_BLOCK_POWER_OFF, TRUE);
551 complete(&dma->comp);
552 }
553 if (isr & INTR_DMA_E_DONE) {
554 mdp4_stat.intr_dma_e++;
555 dma = &dma_e_data;
556 spin_lock(&mdp_spin_lock);
557 mdp_intr_mask &= ~INTR_DMA_E_DONE;
558 outp32(MDP_INTR_ENABLE, mdp_intr_mask);
559 dma->busy = FALSE;
Huaibin Yang0da46922011-11-29 15:08:04 -0800560 mdp4_dma_e_done_dtv();
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700561 if (dma->waiting) {
562 dma->waiting = FALSE;
563 complete(&dma->comp);
564 }
565 spin_unlock(&mdp_spin_lock);
566 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700567 if (isr & INTR_DMA_P_HISTOGRAM) {
kuogee hsieh0948c682011-10-31 16:50:43 -0700568 mdp4_stat.intr_histogram++;
Carl Vanderlip7b8b6402012-03-01 10:58:03 -0800569 ret = mdp_histogram_block2mgmt(MDP_BLOCK_DMA_P, &mgmt);
570 if (!ret)
571 mdp_histogram_handle_isr(mgmt);
572 }
573 if (isr & INTR_DMA_S_HISTOGRAM) {
574 mdp4_stat.intr_histogram++;
575 ret = mdp_histogram_block2mgmt(MDP_BLOCK_DMA_S, &mgmt);
576 if (!ret)
577 mdp_histogram_handle_isr(mgmt);
578 }
579 if (isr & INTR_VG1_HISTOGRAM) {
580 mdp4_stat.intr_histogram++;
581 ret = mdp_histogram_block2mgmt(MDP_BLOCK_VG_1, &mgmt);
582 if (!ret)
583 mdp_histogram_handle_isr(mgmt);
584 }
585 if (isr & INTR_VG2_HISTOGRAM) {
586 mdp4_stat.intr_histogram++;
587 ret = mdp_histogram_block2mgmt(MDP_BLOCK_VG_2, &mgmt);
588 if (!ret)
589 mdp_histogram_handle_isr(mgmt);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700590 }
591
592out:
593 mdp_is_in_isr = FALSE;
594
595 return IRQ_HANDLED;
596}
597
598
599/*
600 * QSEED tables
601 */
602
603static uint32 vg_qseed_table0[] = {
604 0x5556aaff, 0x00000000, 0x00000000, 0x00000000
605};
606
607static uint32 vg_qseed_table1[] = {
Carl Vanderlipd89c0e72012-03-28 10:17:20 -0700608 0x00000000, 0x20000000,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700609};
610
611static uint32 vg_qseed_table2[] = {
612 0x02000000, 0x00000000, 0x01ff0ff9, 0x00000008,
613 0x01fb0ff2, 0x00000013, 0x01f50fed, 0x0ffe0020,
614 0x01ed0fe8, 0x0ffd002e, 0x01e30fe4, 0x0ffb003e,
615 0x01d80fe1, 0x0ff9004e, 0x01cb0fde, 0x0ff70060,
616 0x01bc0fdc, 0x0ff40074, 0x01ac0fdb, 0x0ff20087,
617 0x019a0fdb, 0x0fef009c, 0x01870fdb, 0x0fed00b1,
618 0x01740fdb, 0x0fea00c7, 0x01600fdc, 0x0fe700dd,
619 0x014b0fdd, 0x0fe500f3, 0x01350fdf, 0x0fe30109,
620 0x01200fe0, 0x0fe00120, 0x01090fe3, 0x0fdf0135,
621 0x00f30fe5, 0x0fdd014b, 0x00dd0fe7, 0x0fdc0160,
622 0x00c70fea, 0x0fdb0174, 0x00b10fed, 0x0fdb0187,
623 0x009c0fef, 0x0fdb019a, 0x00870ff2, 0x0fdb01ac,
624 0x00740ff4, 0x0fdc01bc, 0x00600ff7, 0x0fde01cb,
625 0x004e0ff9, 0x0fe101d8, 0x003e0ffb, 0x0fe401e3,
626 0x002e0ffd, 0x0fe801ed, 0x00200ffe, 0x0fed01f5,
627 0x00130000, 0x0ff201fb, 0x00080000, 0x0ff901ff,
628
629 0x02000000, 0x00000000, 0x02000000, 0x00000000,
630 0x02000000, 0x00000000, 0x02000000, 0x00000000,
631 0x02000000, 0x00000000, 0x02000000, 0x00000000,
632 0x02000000, 0x00000000, 0x02000000, 0x00000000,
633 0x02000000, 0x00000000, 0x02000000, 0x00000000,
634 0x02000000, 0x00000000, 0x02000000, 0x00000000,
635 0x02000000, 0x00000000, 0x02000000, 0x00000000,
636 0x02000000, 0x00000000, 0x02000000, 0x00000000,
637 0x02000000, 0x00000000, 0x02000000, 0x00000000,
638 0x02000000, 0x00000000, 0x02000000, 0x00000000,
639 0x02000000, 0x00000000, 0x02000000, 0x00000000,
640 0x02000000, 0x00000000, 0x02000000, 0x00000000,
641 0x02000000, 0x00000000, 0x02000000, 0x00000000,
642 0x02000000, 0x00000000, 0x02000000, 0x00000000,
643 0x02000000, 0x00000000, 0x02000000, 0x00000000,
644 0x02000000, 0x00000000, 0x02000000, 0x00000000,
645
646 0x02000000, 0x00000000, 0x01fc0ff9, 0x0ffe000d,
647 0x01f60ff3, 0x0ffb001c, 0x01ef0fed, 0x0ff9002b,
648 0x01e60fe8, 0x0ff6003c, 0x01dc0fe4, 0x0ff3004d,
649 0x01d00fe0, 0x0ff1005f, 0x01c30fde, 0x0fee0071,
650 0x01b50fdb, 0x0feb0085, 0x01a70fd9, 0x0fe80098,
651 0x01960fd8, 0x0fe600ac, 0x01850fd7, 0x0fe300c1,
652 0x01730fd7, 0x0fe100d5, 0x01610fd7, 0x0fdf00e9,
653 0x014e0fd8, 0x0fdd00fd, 0x013b0fd8, 0x0fdb0112,
654 0x01250fda, 0x0fda0127, 0x01120fdb, 0x0fd8013b,
655 0x00fd0fdd, 0x0fd8014e, 0x00e90fdf, 0x0fd70161,
656 0x00d50fe1, 0x0fd70173, 0x00c10fe3, 0x0fd70185,
657 0x00ac0fe6, 0x0fd80196, 0x00980fe8, 0x0fd901a7,
658 0x00850feb, 0x0fdb01b5, 0x00710fee, 0x0fde01c3,
659 0x005f0ff1, 0x0fe001d0, 0x004d0ff3, 0x0fe401dc,
660 0x003c0ff6, 0x0fe801e6, 0x002b0ff9, 0x0fed01ef,
661 0x001c0ffb, 0x0ff301f6, 0x000d0ffe, 0x0ff901fc,
662
663 0x020f0034, 0x0f7a0043, 0x01e80023, 0x0fa8004d,
664 0x01d30016, 0x0fbe0059, 0x01c6000a, 0x0fc90067,
665 0x01bd0000, 0x0fce0075, 0x01b50ff7, 0x0fcf0085,
666 0x01ae0fee, 0x0fcf0095, 0x01a70fe6, 0x0fcd00a6,
667 0x019d0fe0, 0x0fcb00b8, 0x01940fd9, 0x0fc900ca,
668 0x01890fd4, 0x0fc700dc, 0x017d0fcf, 0x0fc600ee,
669 0x01700fcc, 0x0fc40100, 0x01620fc9, 0x0fc40111,
670 0x01540fc6, 0x0fc30123, 0x01430fc5, 0x0fc40134,
671 0x01340fc4, 0x0fc50143, 0x01230fc3, 0x0fc60154,
672 0x01110fc4, 0x0fc90162, 0x01000fc4, 0x0fcc0170,
673 0x00ee0fc6, 0x0fcf017d, 0x00dc0fc7, 0x0fd40189,
674 0x00ca0fc9, 0x0fd90194, 0x00b80fcb, 0x0fe0019d,
675 0x00a60fcd, 0x0fe601a7, 0x00950fcf, 0x0fee01ae,
676 0x00850fcf, 0x0ff701b5, 0x00750fce, 0x000001bd,
677 0x00670fc9, 0x000a01c6, 0x00590fbe, 0x001601d3,
678 0x004d0fa8, 0x002301e8, 0x00430f7a, 0x0034020f,
679
680 0x015c005e, 0x0fde0068, 0x015c0054, 0x0fdd0073,
681 0x015b004b, 0x0fdc007e, 0x015a0042, 0x0fdb0089,
682 0x01590039, 0x0fda0094, 0x01560030, 0x0fda00a0,
683 0x01530028, 0x0fda00ab, 0x014f0020, 0x0fda00b7,
684 0x014a0019, 0x0fdb00c2, 0x01450011, 0x0fdc00ce,
685 0x013e000b, 0x0fde00d9, 0x01390004, 0x0fdf00e4,
686 0x01310ffe, 0x0fe200ef, 0x01290ff9, 0x0fe400fa,
687 0x01200ff4, 0x0fe80104, 0x01180fef, 0x0feb010e,
688 0x010e0feb, 0x0fef0118, 0x01040fe8, 0x0ff40120,
689 0x00fa0fe4, 0x0ff90129, 0x00ef0fe2, 0x0ffe0131,
690 0x00e40fdf, 0x00040139, 0x00d90fde, 0x000b013e,
691 0x00ce0fdc, 0x00110145, 0x00c20fdb, 0x0019014a,
692 0x00b70fda, 0x0020014f, 0x00ab0fda, 0x00280153,
693 0x00a00fda, 0x00300156, 0x00940fda, 0x00390159,
694 0x00890fdb, 0x0042015a, 0x007e0fdc, 0x004b015b,
695 0x00730fdd, 0x0054015c, 0x00680fde, 0x005e015c,
696
697 0x01300068, 0x0ff80070, 0x01300060, 0x0ff80078,
698 0x012f0059, 0x0ff80080, 0x012d0052, 0x0ff80089,
699 0x012b004b, 0x0ff90091, 0x01290044, 0x0ff9009a,
700 0x0126003d, 0x0ffa00a3, 0x01220037, 0x0ffb00ac,
701 0x011f0031, 0x0ffc00b4, 0x011a002b, 0x0ffe00bd,
702 0x01150026, 0x000000c5, 0x010f0021, 0x000200ce,
703 0x010a001c, 0x000400d6, 0x01030018, 0x000600df,
704 0x00fd0014, 0x000900e6, 0x00f60010, 0x000c00ee,
705 0x00ee000c, 0x001000f6, 0x00e60009, 0x001400fd,
706 0x00df0006, 0x00180103, 0x00d60004, 0x001c010a,
707 0x00ce0002, 0x0021010f, 0x00c50000, 0x00260115,
708 0x00bd0ffe, 0x002b011a, 0x00b40ffc, 0x0031011f,
709 0x00ac0ffb, 0x00370122, 0x00a30ffa, 0x003d0126,
710 0x009a0ff9, 0x00440129, 0x00910ff9, 0x004b012b,
711 0x00890ff8, 0x0052012d, 0x00800ff8, 0x0059012f,
712 0x00780ff8, 0x00600130, 0x00700ff8, 0x00680130,
713
714 0x01050079, 0x0003007f, 0x01040073, 0x00030086,
715 0x0103006d, 0x0004008c, 0x01030066, 0x00050092,
716 0x01010060, 0x00060099, 0x0100005a, 0x0007009f,
717 0x00fe0054, 0x000900a5, 0x00fa004f, 0x000b00ac,
718 0x00f80049, 0x000d00b2, 0x00f50044, 0x000f00b8,
719 0x00f2003f, 0x001200bd, 0x00ef0039, 0x001500c3,
720 0x00ea0035, 0x001800c9, 0x00e60030, 0x001c00ce,
721 0x00e3002b, 0x001f00d3, 0x00dd0027, 0x002300d9,
722 0x00d90023, 0x002700dd, 0x00d3001f, 0x002b00e3,
723 0x00ce001c, 0x003000e6, 0x00c90018, 0x003500ea,
724 0x00c30015, 0x003900ef, 0x00bd0012, 0x003f00f2,
725 0x00b8000f, 0x004400f5, 0x00b2000d, 0x004900f8,
726 0x00ac000b, 0x004f00fa, 0x00a50009, 0x005400fe,
727 0x009f0007, 0x005a0100, 0x00990006, 0x00600101,
728 0x00920005, 0x00660103, 0x008c0004, 0x006d0103,
729 0x00860003, 0x00730104, 0x007f0003, 0x00790105,
730
731 0x00cf0088, 0x001d008c, 0x00ce0084, 0x0020008e,
732 0x00cd0080, 0x00210092, 0x00cd007b, 0x00240094,
733 0x00ca0077, 0x00270098, 0x00c90073, 0x0029009b,
734 0x00c8006f, 0x002c009d, 0x00c6006b, 0x002f00a0,
735 0x00c50067, 0x003200a2, 0x00c30062, 0x003600a5,
736 0x00c0005f, 0x003900a8, 0x00c0005b, 0x003b00aa,
737 0x00be0057, 0x003e00ad, 0x00ba0054, 0x004200b0,
738 0x00b90050, 0x004500b2, 0x00b7004c, 0x004900b4,
739 0x00b40049, 0x004c00b7, 0x00b20045, 0x005000b9,
740 0x00b00042, 0x005400ba, 0x00ad003e, 0x005700be,
741 0x00aa003b, 0x005b00c0, 0x00a80039, 0x005f00c0,
742 0x00a50036, 0x006200c3, 0x00a20032, 0x006700c5,
743 0x00a0002f, 0x006b00c6, 0x009d002c, 0x006f00c8,
744 0x009b0029, 0x007300c9, 0x00980027, 0x007700ca,
745 0x00940024, 0x007b00cd, 0x00920021, 0x008000cd,
746 0x008e0020, 0x008400ce, 0x008c001d, 0x008800cf,
747
748 0x008e0083, 0x006b0084, 0x008d0083, 0x006c0084,
749 0x008d0082, 0x006d0084, 0x008d0081, 0x006d0085,
750 0x008d0080, 0x006e0085, 0x008c007f, 0x006f0086,
751 0x008b007f, 0x00700086, 0x008b007e, 0x00710086,
752 0x008b007d, 0x00720086, 0x008a007d, 0x00730086,
753 0x008a007c, 0x00730087, 0x008a007b, 0x00740087,
754 0x0089007b, 0x00750087, 0x008a0079, 0x00750088,
755 0x008a0078, 0x00760088, 0x008a0077, 0x00770088,
756 0x00880077, 0x0077008a, 0x00880076, 0x0078008a,
757 0x00880075, 0x0079008a, 0x00870075, 0x007b0089,
758 0x00870074, 0x007b008a, 0x00870073, 0x007c008a,
759 0x00860073, 0x007d008a, 0x00860072, 0x007d008b,
760 0x00860071, 0x007e008b, 0x00860070, 0x007f008b,
761 0x0086006f, 0x007f008c, 0x0085006e, 0x0080008d,
762 0x0085006d, 0x0081008d, 0x0084006d, 0x0082008d,
763 0x0084006c, 0x0083008d, 0x0084006b, 0x0083008e,
764
765 0x023c0fe2, 0x00000fe2, 0x023a0fdb, 0x00000feb,
766 0x02360fd3, 0x0fff0ff8, 0x022e0fcf, 0x0ffc0007,
767 0x02250fca, 0x0ffa0017, 0x021a0fc6, 0x0ff70029,
768 0x020c0fc4, 0x0ff4003c, 0x01fd0fc1, 0x0ff10051,
769 0x01eb0fc0, 0x0fed0068, 0x01d80fc0, 0x0fe9007f,
770 0x01c30fc1, 0x0fe50097, 0x01ac0fc2, 0x0fe200b0,
771 0x01960fc3, 0x0fdd00ca, 0x017e0fc5, 0x0fd900e4,
772 0x01650fc8, 0x0fd500fe, 0x014b0fcb, 0x0fd20118,
773 0x01330fcd, 0x0fcd0133, 0x01180fd2, 0x0fcb014b,
774 0x00fe0fd5, 0x0fc80165, 0x00e40fd9, 0x0fc5017e,
775 0x00ca0fdd, 0x0fc30196, 0x00b00fe2, 0x0fc201ac,
776 0x00970fe5, 0x0fc101c3, 0x007f0fe9, 0x0fc001d8,
777 0x00680fed, 0x0fc001eb, 0x00510ff1, 0x0fc101fd,
778 0x003c0ff4, 0x0fc4020c, 0x00290ff7, 0x0fc6021a,
779 0x00170ffa, 0x0fca0225, 0x00070ffc, 0x0fcf022e,
780 0x0ff80fff, 0x0fd30236, 0x0feb0000, 0x0fdb023a,
781
782 0x02780fc4, 0x00000fc4, 0x02770fbc, 0x0fff0fce,
783 0x02710fb5, 0x0ffe0fdc, 0x02690fb0, 0x0ffa0fed,
784 0x025f0fab, 0x0ff70fff, 0x02500fa8, 0x0ff30015,
785 0x02410fa6, 0x0fef002a, 0x022f0fa4, 0x0feb0042,
786 0x021a0fa4, 0x0fe5005d, 0x02040fa5, 0x0fe10076,
787 0x01eb0fa7, 0x0fdb0093, 0x01d20fa9, 0x0fd600af,
788 0x01b80fab, 0x0fd000cd, 0x019d0faf, 0x0fca00ea,
789 0x01810fb2, 0x0fc50108, 0x01620fb7, 0x0fc10126,
790 0x01440fbb, 0x0fbb0146, 0x01260fc1, 0x0fb70162,
791 0x01080fc5, 0x0fb20181, 0x00ea0fca, 0x0faf019d,
792 0x00cd0fd0, 0x0fab01b8, 0x00af0fd6, 0x0fa901d2,
793 0x00930fdb, 0x0fa701eb, 0x00760fe1, 0x0fa50204,
794 0x005d0fe5, 0x0fa4021a, 0x00420feb, 0x0fa4022f,
795 0x002a0fef, 0x0fa60241, 0x00150ff3, 0x0fa80250,
796 0x0fff0ff7, 0x0fab025f, 0x0fed0ffa, 0x0fb00269,
797 0x0fdc0ffe, 0x0fb50271, 0x0fce0fff, 0x0fbc0277,
798
799 0x02a00fb0, 0x00000fb0, 0x029e0fa8, 0x0fff0fbb,
800 0x02980fa1, 0x0ffd0fca, 0x028f0f9c, 0x0ff90fdc,
801 0x02840f97, 0x0ff50ff0, 0x02740f94, 0x0ff10007,
802 0x02640f92, 0x0fec001e, 0x02500f91, 0x0fe70038,
803 0x023a0f91, 0x0fe00055, 0x02220f92, 0x0fdb0071,
804 0x02080f95, 0x0fd4008f, 0x01ec0f98, 0x0fce00ae,
805 0x01cf0f9b, 0x0fc700cf, 0x01b10f9f, 0x0fc100ef,
806 0x01920fa4, 0x0fbb010f, 0x01710faa, 0x0fb50130,
807 0x01520fae, 0x0fae0152, 0x01300fb5, 0x0faa0171,
808 0x010f0fbb, 0x0fa40192, 0x00ef0fc1, 0x0f9f01b1,
809 0x00cf0fc7, 0x0f9b01cf, 0x00ae0fce, 0x0f9801ec,
810 0x008f0fd4, 0x0f950208, 0x00710fdb, 0x0f920222,
811 0x00550fe0, 0x0f91023a, 0x00380fe7, 0x0f910250,
812 0x001e0fec, 0x0f920264, 0x00070ff1, 0x0f940274,
813 0x0ff00ff5, 0x0f970284, 0x0fdc0ff9, 0x0f9c028f,
814 0x0fca0ffd, 0x0fa10298, 0x0fbb0fff, 0x0fa8029e,
815
816 0x02c80f9c, 0x00000f9c, 0x02c70f94, 0x0ffe0fa7,
817 0x02c10f8c, 0x0ffc0fb7, 0x02b70f87, 0x0ff70fcb,
818 0x02aa0f83, 0x0ff30fe0, 0x02990f80, 0x0fee0ff9,
819 0x02870f7f, 0x0fe80012, 0x02720f7e, 0x0fe2002e,
820 0x025a0f7e, 0x0fdb004d, 0x02400f80, 0x0fd5006b,
821 0x02230f84, 0x0fcd008c, 0x02050f87, 0x0fc700ad,
822 0x01e60f8b, 0x0fbf00d0, 0x01c60f90, 0x0fb700f3,
823 0x01a30f96, 0x0fb00117, 0x01800f9c, 0x0faa013a,
824 0x015d0fa2, 0x0fa2015f, 0x013a0faa, 0x0f9c0180,
825 0x01170fb0, 0x0f9601a3, 0x00f30fb7, 0x0f9001c6,
826 0x00d00fbf, 0x0f8b01e6, 0x00ad0fc7, 0x0f870205,
827 0x008c0fcd, 0x0f840223, 0x006b0fd5, 0x0f800240,
828 0x004d0fdb, 0x0f7e025a, 0x002e0fe2, 0x0f7e0272,
829 0x00120fe8, 0x0f7f0287, 0x0ff90fee, 0x0f800299,
830 0x0fe00ff3, 0x0f8302aa, 0x0fcb0ff7, 0x0f8702b7,
831 0x0fb70ffc, 0x0f8c02c1, 0x0fa70ffe, 0x0f9402c7,
832
833 0x02f00f88, 0x00000f88, 0x02ee0f80, 0x0ffe0f94,
834 0x02e70f78, 0x0ffc0fa5, 0x02dd0f73, 0x0ff60fba,
835 0x02ce0f6f, 0x0ff20fd1, 0x02be0f6c, 0x0feb0feb,
836 0x02aa0f6b, 0x0fe50006, 0x02940f6a, 0x0fde0024,
837 0x02790f6c, 0x0fd60045, 0x025e0f6e, 0x0fcf0065,
838 0x023f0f72, 0x0fc60089, 0x021d0f77, 0x0fbf00ad,
839 0x01fd0f7b, 0x0fb600d2, 0x01da0f81, 0x0fad00f8,
840 0x01b50f87, 0x0fa6011e, 0x018f0f8f, 0x0f9e0144,
841 0x016b0f95, 0x0f95016b, 0x01440f9e, 0x0f8f018f,
842 0x011e0fa6, 0x0f8701b5, 0x00f80fad, 0x0f8101da,
843 0x00d20fb6, 0x0f7b01fd, 0x00ad0fbf, 0x0f77021d,
844 0x00890fc6, 0x0f72023f, 0x00650fcf, 0x0f6e025e,
845 0x00450fd6, 0x0f6c0279, 0x00240fde, 0x0f6a0294,
846 0x00060fe5, 0x0f6b02aa, 0x0feb0feb, 0x0f6c02be,
847 0x0fd10ff2, 0x0f6f02ce, 0x0fba0ff6, 0x0f7302dd,
848 0x0fa50ffc, 0x0f7802e7, 0x0f940ffe, 0x0f8002ee,
849
850 0x03180f74, 0x00000f74, 0x03160f6b, 0x0ffe0f81,
851 0x030e0f64, 0x0ffb0f93, 0x03030f5f, 0x0ff50fa9,
852 0x02f40f5b, 0x0ff00fc1, 0x02e20f58, 0x0fe90fdd,
853 0x02cd0f57, 0x0fe20ffa, 0x02b60f57, 0x0fda0019,
854 0x02990f59, 0x0fd1003d, 0x027b0f5c, 0x0fc90060,
855 0x02590f61, 0x0fc00086, 0x02370f66, 0x0fb700ac,
856 0x02130f6b, 0x0fae00d4, 0x01ee0f72, 0x0fa400fc,
857 0x01c70f79, 0x0f9b0125, 0x019f0f81, 0x0f93014d,
858 0x01760f89, 0x0f890178, 0x014d0f93, 0x0f81019f,
859 0x01250f9b, 0x0f7901c7, 0x00fc0fa4, 0x0f7201ee,
860 0x00d40fae, 0x0f6b0213, 0x00ac0fb7, 0x0f660237,
861 0x00860fc0, 0x0f610259, 0x00600fc9, 0x0f5c027b,
862 0x003d0fd1, 0x0f590299, 0x00190fda, 0x0f5702b6,
863 0x0ffa0fe2, 0x0f5702cd, 0x0fdd0fe9, 0x0f5802e2,
864 0x0fc10ff0, 0x0f5b02f4, 0x0fa90ff5, 0x0f5f0303,
865 0x0f930ffb, 0x0f64030e, 0x0f810ffe, 0x0f6b0316,
866
867 0x03400f60, 0x00000f60, 0x033e0f57, 0x0ffe0f6d,
868 0x03370f4f, 0x0ffa0f80, 0x032a0f4b, 0x0ff30f98,
869 0x031a0f46, 0x0fee0fb2, 0x03070f44, 0x0fe60fcf,
870 0x02f10f44, 0x0fde0fed, 0x02d70f44, 0x0fd6000f,
871 0x02b80f46, 0x0fcc0036, 0x02990f4a, 0x0fc3005a,
872 0x02750f4f, 0x0fb90083, 0x02500f55, 0x0fb000ab,
873 0x022a0f5b, 0x0fa500d6, 0x02020f63, 0x0f9a0101,
874 0x01d80f6b, 0x0f91012c, 0x01ae0f74, 0x0f870157,
875 0x01840f7c, 0x0f7c0184, 0x01570f87, 0x0f7401ae,
876 0x012c0f91, 0x0f6b01d8, 0x01010f9a, 0x0f630202,
877 0x00d60fa5, 0x0f5b022a, 0x00ab0fb0, 0x0f550250,
878 0x00830fb9, 0x0f4f0275, 0x005a0fc3, 0x0f4a0299,
879 0x00360fcc, 0x0f4602b8, 0x000f0fd6, 0x0f4402d7,
880 0x0fed0fde, 0x0f4402f1, 0x0fcf0fe6, 0x0f440307,
881 0x0fb20fee, 0x0f46031a, 0x0f980ff3, 0x0f4b032a,
882 0x0f800ffa, 0x0f4f0337, 0x0f6d0ffe, 0x0f57033e,
883
884 0x02000000, 0x00000000, 0x01ff0ff9, 0x00000008,
885 0x01fb0ff2, 0x00000013, 0x01f50fed, 0x0ffe0020,
886 0x01ed0fe8, 0x0ffd002e, 0x01e30fe4, 0x0ffb003e,
887 0x01d80fe1, 0x0ff9004e, 0x01cb0fde, 0x0ff70060,
888 0x01bc0fdc, 0x0ff40074, 0x01ac0fdb, 0x0ff20087,
889 0x019a0fdb, 0x0fef009c, 0x01870fdb, 0x0fed00b1,
890 0x01740fdb, 0x0fea00c7, 0x01600fdc, 0x0fe700dd,
891 0x014b0fdd, 0x0fe500f3, 0x01350fdf, 0x0fe30109,
892 0x01200fe0, 0x0fe00120, 0x01090fe3, 0x0fdf0135,
893 0x00f30fe5, 0x0fdd014b, 0x00dd0fe7, 0x0fdc0160,
894 0x00c70fea, 0x0fdb0174, 0x00b10fed, 0x0fdb0187,
895 0x009c0fef, 0x0fdb019a, 0x00870ff2, 0x0fdb01ac,
896 0x00740ff4, 0x0fdc01bc, 0x00600ff7, 0x0fde01cb,
897 0x004e0ff9, 0x0fe101d8, 0x003e0ffb, 0x0fe401e3,
898 0x002e0ffd, 0x0fe801ed, 0x00200ffe, 0x0fed01f5,
899 0x00130000, 0x0ff201fb, 0x00080000, 0x0ff901ff,
900
901 0x02000000, 0x00000000, 0x02000000, 0x00000000,
902 0x02000000, 0x00000000, 0x02000000, 0x00000000,
903 0x02000000, 0x00000000, 0x02000000, 0x00000000,
904 0x02000000, 0x00000000, 0x02000000, 0x00000000,
905 0x02000000, 0x00000000, 0x02000000, 0x00000000,
906 0x02000000, 0x00000000, 0x02000000, 0x00000000,
907 0x02000000, 0x00000000, 0x02000000, 0x00000000,
908 0x02000000, 0x00000000, 0x02000000, 0x00000000,
909 0x02000000, 0x00000000, 0x02000000, 0x00000000,
910 0x02000000, 0x00000000, 0x02000000, 0x00000000,
911 0x02000000, 0x00000000, 0x02000000, 0x00000000,
912 0x02000000, 0x00000000, 0x02000000, 0x00000000,
913 0x02000000, 0x00000000, 0x02000000, 0x00000000,
914 0x02000000, 0x00000000, 0x02000000, 0x00000000,
915 0x02000000, 0x00000000, 0x02000000, 0x00000000,
916 0x02000000, 0x00000000, 0x02000000, 0x00000000,
917
918 0x02000000, 0x00000000, 0x01fc0ff9, 0x0ffe000d,
919 0x01f60ff3, 0x0ffb001c, 0x01ef0fed, 0x0ff9002b,
920 0x01e60fe8, 0x0ff6003c, 0x01dc0fe4, 0x0ff3004d,
921 0x01d00fe0, 0x0ff1005f, 0x01c30fde, 0x0fee0071,
922 0x01b50fdb, 0x0feb0085, 0x01a70fd9, 0x0fe80098,
923 0x01960fd8, 0x0fe600ac, 0x01850fd7, 0x0fe300c1,
924 0x01730fd7, 0x0fe100d5, 0x01610fd7, 0x0fdf00e9,
925 0x014e0fd8, 0x0fdd00fd, 0x013b0fd8, 0x0fdb0112,
926 0x01250fda, 0x0fda0127, 0x01120fdb, 0x0fd8013b,
927 0x00fd0fdd, 0x0fd8014e, 0x00e90fdf, 0x0fd70161,
928 0x00d50fe1, 0x0fd70173, 0x00c10fe3, 0x0fd70185,
929 0x00ac0fe6, 0x0fd80196, 0x00980fe8, 0x0fd901a7,
930 0x00850feb, 0x0fdb01b5, 0x00710fee, 0x0fde01c3,
931 0x005f0ff1, 0x0fe001d0, 0x004d0ff3, 0x0fe401dc,
932 0x003c0ff6, 0x0fe801e6, 0x002b0ff9, 0x0fed01ef,
933 0x001c0ffb, 0x0ff301f6, 0x000d0ffe, 0x0ff901fc,
934
935 0x020f0034, 0x0f7a0043, 0x01e80023, 0x0fa8004d,
936 0x01d30016, 0x0fbe0059, 0x01c6000a, 0x0fc90067,
937 0x01bd0000, 0x0fce0075, 0x01b50ff7, 0x0fcf0085,
938 0x01ae0fee, 0x0fcf0095, 0x01a70fe6, 0x0fcd00a6,
939 0x019d0fe0, 0x0fcb00b8, 0x01940fd9, 0x0fc900ca,
940 0x01890fd4, 0x0fc700dc, 0x017d0fcf, 0x0fc600ee,
941 0x01700fcc, 0x0fc40100, 0x01620fc9, 0x0fc40111,
942 0x01540fc6, 0x0fc30123, 0x01430fc5, 0x0fc40134,
943 0x01340fc4, 0x0fc50143, 0x01230fc3, 0x0fc60154,
944 0x01110fc4, 0x0fc90162, 0x01000fc4, 0x0fcc0170,
945 0x00ee0fc6, 0x0fcf017d, 0x00dc0fc7, 0x0fd40189,
946 0x00ca0fc9, 0x0fd90194, 0x00b80fcb, 0x0fe0019d,
947 0x00a60fcd, 0x0fe601a7, 0x00950fcf, 0x0fee01ae,
948 0x00850fcf, 0x0ff701b5, 0x00750fce, 0x000001bd,
949 0x00670fc9, 0x000a01c6, 0x00590fbe, 0x001601d3,
950 0x004d0fa8, 0x002301e8, 0x00430f7a, 0x0034020f,
951
952 0x015c005e, 0x0fde0068, 0x015c0054, 0x0fdd0073,
953 0x015b004b, 0x0fdc007e, 0x015a0042, 0x0fdb0089,
954 0x01590039, 0x0fda0094, 0x01560030, 0x0fda00a0,
955 0x01530028, 0x0fda00ab, 0x014f0020, 0x0fda00b7,
956 0x014a0019, 0x0fdb00c2, 0x01450011, 0x0fdc00ce,
957 0x013e000b, 0x0fde00d9, 0x01390004, 0x0fdf00e4,
958 0x01310ffe, 0x0fe200ef, 0x01290ff9, 0x0fe400fa,
959 0x01200ff4, 0x0fe80104, 0x01180fef, 0x0feb010e,
960 0x010e0feb, 0x0fef0118, 0x01040fe8, 0x0ff40120,
961 0x00fa0fe4, 0x0ff90129, 0x00ef0fe2, 0x0ffe0131,
962 0x00e40fdf, 0x00040139, 0x00d90fde, 0x000b013e,
963 0x00ce0fdc, 0x00110145, 0x00c20fdb, 0x0019014a,
964 0x00b70fda, 0x0020014f, 0x00ab0fda, 0x00280153,
965 0x00a00fda, 0x00300156, 0x00940fda, 0x00390159,
966 0x00890fdb, 0x0042015a, 0x007e0fdc, 0x004b015b,
967 0x00730fdd, 0x0054015c, 0x00680fde, 0x005e015c,
968
969 0x01300068, 0x0ff80070, 0x01300060, 0x0ff80078,
970 0x012f0059, 0x0ff80080, 0x012d0052, 0x0ff80089,
971 0x012b004b, 0x0ff90091, 0x01290044, 0x0ff9009a,
972 0x0126003d, 0x0ffa00a3, 0x01220037, 0x0ffb00ac,
973 0x011f0031, 0x0ffc00b4, 0x011a002b, 0x0ffe00bd,
974 0x01150026, 0x000000c5, 0x010f0021, 0x000200ce,
975 0x010a001c, 0x000400d6, 0x01030018, 0x000600df,
976 0x00fd0014, 0x000900e6, 0x00f60010, 0x000c00ee,
977 0x00ee000c, 0x001000f6, 0x00e60009, 0x001400fd,
978 0x00df0006, 0x00180103, 0x00d60004, 0x001c010a,
979 0x00ce0002, 0x0021010f, 0x00c50000, 0x00260115,
980 0x00bd0ffe, 0x002b011a, 0x00b40ffc, 0x0031011f,
981 0x00ac0ffb, 0x00370122, 0x00a30ffa, 0x003d0126,
982 0x009a0ff9, 0x00440129, 0x00910ff9, 0x004b012b,
983 0x00890ff8, 0x0052012d, 0x00800ff8, 0x0059012f,
984 0x00780ff8, 0x00600130, 0x00700ff8, 0x00680130,
985
986 0x01050079, 0x0003007f, 0x01040073, 0x00030086,
987 0x0103006d, 0x0004008c, 0x01030066, 0x00050092,
988 0x01010060, 0x00060099, 0x0100005a, 0x0007009f,
989 0x00fe0054, 0x000900a5, 0x00fa004f, 0x000b00ac,
990 0x00f80049, 0x000d00b2, 0x00f50044, 0x000f00b8,
991 0x00f2003f, 0x001200bd, 0x00ef0039, 0x001500c3,
992 0x00ea0035, 0x001800c9, 0x00e60030, 0x001c00ce,
993 0x00e3002b, 0x001f00d3, 0x00dd0027, 0x002300d9,
994 0x00d90023, 0x002700dd, 0x00d3001f, 0x002b00e3,
995 0x00ce001c, 0x003000e6, 0x00c90018, 0x003500ea,
996 0x00c30015, 0x003900ef, 0x00bd0012, 0x003f00f2,
997 0x00b8000f, 0x004400f5, 0x00b2000d, 0x004900f8,
998 0x00ac000b, 0x004f00fa, 0x00a50009, 0x005400fe,
999 0x009f0007, 0x005a0100, 0x00990006, 0x00600101,
1000 0x00920005, 0x00660103, 0x008c0004, 0x006d0103,
1001 0x00860003, 0x00730104, 0x007f0003, 0x00790105,
1002
1003 0x00cf0088, 0x001d008c, 0x00ce0084, 0x0020008e,
1004 0x00cd0080, 0x00210092, 0x00cd007b, 0x00240094,
1005 0x00ca0077, 0x00270098, 0x00c90073, 0x0029009b,
1006 0x00c8006f, 0x002c009d, 0x00c6006b, 0x002f00a0,
1007 0x00c50067, 0x003200a2, 0x00c30062, 0x003600a5,
1008 0x00c0005f, 0x003900a8, 0x00c0005b, 0x003b00aa,
1009 0x00be0057, 0x003e00ad, 0x00ba0054, 0x004200b0,
1010 0x00b90050, 0x004500b2, 0x00b7004c, 0x004900b4,
1011 0x00b40049, 0x004c00b7, 0x00b20045, 0x005000b9,
1012 0x00b00042, 0x005400ba, 0x00ad003e, 0x005700be,
1013 0x00aa003b, 0x005b00c0, 0x00a80039, 0x005f00c0,
1014 0x00a50036, 0x006200c3, 0x00a20032, 0x006700c5,
1015 0x00a0002f, 0x006b00c6, 0x009d002c, 0x006f00c8,
1016 0x009b0029, 0x007300c9, 0x00980027, 0x007700ca,
1017 0x00940024, 0x007b00cd, 0x00920021, 0x008000cd,
1018 0x008e0020, 0x008400ce, 0x008c001d, 0x008800cf,
1019
1020 0x008e0083, 0x006b0084, 0x008d0083, 0x006c0084,
1021 0x008d0082, 0x006d0084, 0x008d0081, 0x006d0085,
1022 0x008d0080, 0x006e0085, 0x008c007f, 0x006f0086,
1023 0x008b007f, 0x00700086, 0x008b007e, 0x00710086,
1024 0x008b007d, 0x00720086, 0x008a007d, 0x00730086,
1025 0x008a007c, 0x00730087, 0x008a007b, 0x00740087,
1026 0x0089007b, 0x00750087, 0x008a0079, 0x00750088,
1027 0x008a0078, 0x00760088, 0x008a0077, 0x00770088,
1028 0x00880077, 0x0077008a, 0x00880076, 0x0078008a,
1029 0x00880075, 0x0079008a, 0x00870075, 0x007b0089,
1030 0x00870074, 0x007b008a, 0x00870073, 0x007c008a,
1031 0x00860073, 0x007d008a, 0x00860072, 0x007d008b,
1032 0x00860071, 0x007e008b, 0x00860070, 0x007f008b,
1033 0x0086006f, 0x007f008c, 0x0085006e, 0x0080008d,
1034 0x0085006d, 0x0081008d, 0x0084006d, 0x0082008d,
1035 0x0084006c, 0x0083008d, 0x0084006b, 0x0083008e,
1036
1037 0x023c0fe2, 0x00000fe2, 0x023a0fdb, 0x00000feb,
1038 0x02360fd3, 0x0fff0ff8, 0x022e0fcf, 0x0ffc0007,
1039 0x02250fca, 0x0ffa0017, 0x021a0fc6, 0x0ff70029,
1040 0x020c0fc4, 0x0ff4003c, 0x01fd0fc1, 0x0ff10051,
1041 0x01eb0fc0, 0x0fed0068, 0x01d80fc0, 0x0fe9007f,
1042 0x01c30fc1, 0x0fe50097, 0x01ac0fc2, 0x0fe200b0,
1043 0x01960fc3, 0x0fdd00ca, 0x017e0fc5, 0x0fd900e4,
1044 0x01650fc8, 0x0fd500fe, 0x014b0fcb, 0x0fd20118,
1045 0x01330fcd, 0x0fcd0133, 0x01180fd2, 0x0fcb014b,
1046 0x00fe0fd5, 0x0fc80165, 0x00e40fd9, 0x0fc5017e,
1047 0x00ca0fdd, 0x0fc30196, 0x00b00fe2, 0x0fc201ac,
1048 0x00970fe5, 0x0fc101c3, 0x007f0fe9, 0x0fc001d8,
1049 0x00680fed, 0x0fc001eb, 0x00510ff1, 0x0fc101fd,
1050 0x003c0ff4, 0x0fc4020c, 0x00290ff7, 0x0fc6021a,
1051 0x00170ffa, 0x0fca0225, 0x00070ffc, 0x0fcf022e,
1052 0x0ff80fff, 0x0fd30236, 0x0feb0000, 0x0fdb023a,
1053
1054 0x02780fc4, 0x00000fc4, 0x02770fbc, 0x0fff0fce,
1055 0x02710fb5, 0x0ffe0fdc, 0x02690fb0, 0x0ffa0fed,
1056 0x025f0fab, 0x0ff70fff, 0x02500fa8, 0x0ff30015,
1057 0x02410fa6, 0x0fef002a, 0x022f0fa4, 0x0feb0042,
1058 0x021a0fa4, 0x0fe5005d, 0x02040fa5, 0x0fe10076,
1059 0x01eb0fa7, 0x0fdb0093, 0x01d20fa9, 0x0fd600af,
1060 0x01b80fab, 0x0fd000cd, 0x019d0faf, 0x0fca00ea,
1061 0x01810fb2, 0x0fc50108, 0x01620fb7, 0x0fc10126,
1062 0x01440fbb, 0x0fbb0146, 0x01260fc1, 0x0fb70162,
1063 0x01080fc5, 0x0fb20181, 0x00ea0fca, 0x0faf019d,
1064 0x00cd0fd0, 0x0fab01b8, 0x00af0fd6, 0x0fa901d2,
1065 0x00930fdb, 0x0fa701eb, 0x00760fe1, 0x0fa50204,
1066 0x005d0fe5, 0x0fa4021a, 0x00420feb, 0x0fa4022f,
1067 0x002a0fef, 0x0fa60241, 0x00150ff3, 0x0fa80250,
1068 0x0fff0ff7, 0x0fab025f, 0x0fed0ffa, 0x0fb00269,
1069 0x0fdc0ffe, 0x0fb50271, 0x0fce0fff, 0x0fbc0277,
1070
1071 0x02a00fb0, 0x00000fb0, 0x029e0fa8, 0x0fff0fbb,
1072 0x02980fa1, 0x0ffd0fca, 0x028f0f9c, 0x0ff90fdc,
1073 0x02840f97, 0x0ff50ff0, 0x02740f94, 0x0ff10007,
1074 0x02640f92, 0x0fec001e, 0x02500f91, 0x0fe70038,
1075 0x023a0f91, 0x0fe00055, 0x02220f92, 0x0fdb0071,
1076 0x02080f95, 0x0fd4008f, 0x01ec0f98, 0x0fce00ae,
1077 0x01cf0f9b, 0x0fc700cf, 0x01b10f9f, 0x0fc100ef,
1078 0x01920fa4, 0x0fbb010f, 0x01710faa, 0x0fb50130,
1079 0x01520fae, 0x0fae0152, 0x01300fb5, 0x0faa0171,
1080 0x010f0fbb, 0x0fa40192, 0x00ef0fc1, 0x0f9f01b1,
1081 0x00cf0fc7, 0x0f9b01cf, 0x00ae0fce, 0x0f9801ec,
1082 0x008f0fd4, 0x0f950208, 0x00710fdb, 0x0f920222,
1083 0x00550fe0, 0x0f91023a, 0x00380fe7, 0x0f910250,
1084 0x001e0fec, 0x0f920264, 0x00070ff1, 0x0f940274,
1085 0x0ff00ff5, 0x0f970284, 0x0fdc0ff9, 0x0f9c028f,
1086 0x0fca0ffd, 0x0fa10298, 0x0fbb0fff, 0x0fa8029e,
1087
1088 0x02c80f9c, 0x00000f9c, 0x02c70f94, 0x0ffe0fa7,
1089 0x02c10f8c, 0x0ffc0fb7, 0x02b70f87, 0x0ff70fcb,
1090 0x02aa0f83, 0x0ff30fe0, 0x02990f80, 0x0fee0ff9,
1091 0x02870f7f, 0x0fe80012, 0x02720f7e, 0x0fe2002e,
1092 0x025a0f7e, 0x0fdb004d, 0x02400f80, 0x0fd5006b,
1093 0x02230f84, 0x0fcd008c, 0x02050f87, 0x0fc700ad,
1094 0x01e60f8b, 0x0fbf00d0, 0x01c60f90, 0x0fb700f3,
1095 0x01a30f96, 0x0fb00117, 0x01800f9c, 0x0faa013a,
1096 0x015d0fa2, 0x0fa2015f, 0x013a0faa, 0x0f9c0180,
1097 0x01170fb0, 0x0f9601a3, 0x00f30fb7, 0x0f9001c6,
1098 0x00d00fbf, 0x0f8b01e6, 0x00ad0fc7, 0x0f870205,
1099 0x008c0fcd, 0x0f840223, 0x006b0fd5, 0x0f800240,
1100 0x004d0fdb, 0x0f7e025a, 0x002e0fe2, 0x0f7e0272,
1101 0x00120fe8, 0x0f7f0287, 0x0ff90fee, 0x0f800299,
1102 0x0fe00ff3, 0x0f8302aa, 0x0fcb0ff7, 0x0f8702b7,
1103 0x0fb70ffc, 0x0f8c02c1, 0x0fa70ffe, 0x0f9402c7,
1104
1105 0x02f00f88, 0x00000f88, 0x02ee0f80, 0x0ffe0f94,
1106 0x02e70f78, 0x0ffc0fa5, 0x02dd0f73, 0x0ff60fba,
1107 0x02ce0f6f, 0x0ff20fd1, 0x02be0f6c, 0x0feb0feb,
1108 0x02aa0f6b, 0x0fe50006, 0x02940f6a, 0x0fde0024,
1109 0x02790f6c, 0x0fd60045, 0x025e0f6e, 0x0fcf0065,
1110 0x023f0f72, 0x0fc60089, 0x021d0f77, 0x0fbf00ad,
1111 0x01fd0f7b, 0x0fb600d2, 0x01da0f81, 0x0fad00f8,
1112 0x01b50f87, 0x0fa6011e, 0x018f0f8f, 0x0f9e0144,
1113 0x016b0f95, 0x0f95016b, 0x01440f9e, 0x0f8f018f,
1114 0x011e0fa6, 0x0f8701b5, 0x00f80fad, 0x0f8101da,
1115 0x00d20fb6, 0x0f7b01fd, 0x00ad0fbf, 0x0f77021d,
1116 0x00890fc6, 0x0f72023f, 0x00650fcf, 0x0f6e025e,
1117 0x00450fd6, 0x0f6c0279, 0x00240fde, 0x0f6a0294,
1118 0x00060fe5, 0x0f6b02aa, 0x0feb0feb, 0x0f6c02be,
1119 0x0fd10ff2, 0x0f6f02ce, 0x0fba0ff6, 0x0f7302dd,
1120 0x0fa50ffc, 0x0f7802e7, 0x0f940ffe, 0x0f8002ee,
1121
1122 0x03180f74, 0x00000f74, 0x03160f6b, 0x0ffe0f81,
1123 0x030e0f64, 0x0ffb0f93, 0x03030f5f, 0x0ff50fa9,
1124 0x02f40f5b, 0x0ff00fc1, 0x02e20f58, 0x0fe90fdd,
1125 0x02cd0f57, 0x0fe20ffa, 0x02b60f57, 0x0fda0019,
1126 0x02990f59, 0x0fd1003d, 0x027b0f5c, 0x0fc90060,
1127 0x02590f61, 0x0fc00086, 0x02370f66, 0x0fb700ac,
1128 0x02130f6b, 0x0fae00d4, 0x01ee0f72, 0x0fa400fc,
1129 0x01c70f79, 0x0f9b0125, 0x019f0f81, 0x0f93014d,
1130 0x01760f89, 0x0f890178, 0x014d0f93, 0x0f81019f,
1131 0x01250f9b, 0x0f7901c7, 0x00fc0fa4, 0x0f7201ee,
1132 0x00d40fae, 0x0f6b0213, 0x00ac0fb7, 0x0f660237,
1133 0x00860fc0, 0x0f610259, 0x00600fc9, 0x0f5c027b,
1134 0x003d0fd1, 0x0f590299, 0x00190fda, 0x0f5702b6,
1135 0x0ffa0fe2, 0x0f5702cd, 0x0fdd0fe9, 0x0f5802e2,
1136 0x0fc10ff0, 0x0f5b02f4, 0x0fa90ff5, 0x0f5f0303,
1137 0x0f930ffb, 0x0f64030e, 0x0f810ffe, 0x0f6b0316,
1138
1139 0x03400f60, 0x00000f60, 0x033e0f57, 0x0ffe0f6d,
1140 0x03370f4f, 0x0ffa0f80, 0x032a0f4b, 0x0ff30f98,
1141 0x031a0f46, 0x0fee0fb2, 0x03070f44, 0x0fe60fcf,
1142 0x02f10f44, 0x0fde0fed, 0x02d70f44, 0x0fd6000f,
1143 0x02b80f46, 0x0fcc0036, 0x02990f4a, 0x0fc3005a,
1144 0x02750f4f, 0x0fb90083, 0x02500f55, 0x0fb000ab,
1145 0x022a0f5b, 0x0fa500d6, 0x02020f63, 0x0f9a0101,
1146 0x01d80f6b, 0x0f91012c, 0x01ae0f74, 0x0f870157,
1147 0x01840f7c, 0x0f7c0184, 0x01570f87, 0x0f7401ae,
1148 0x012c0f91, 0x0f6b01d8, 0x01010f9a, 0x0f630202,
1149 0x00d60fa5, 0x0f5b022a, 0x00ab0fb0, 0x0f550250,
1150 0x00830fb9, 0x0f4f0275, 0x005a0fc3, 0x0f4a0299,
1151 0x00360fcc, 0x0f4602b8, 0x000f0fd6, 0x0f4402d7,
1152 0x0fed0fde, 0x0f4402f1, 0x0fcf0fe6, 0x0f440307,
1153 0x0fb20fee, 0x0f46031a, 0x0f980ff3, 0x0f4b032a,
1154 0x0f800ffa, 0x0f4f0337, 0x0f6d0ffe, 0x0f57033e
1155};
1156
1157
1158#define MDP4_QSEED_TABLE0_OFF 0x8100
1159#define MDP4_QSEED_TABLE1_OFF 0x8200
1160#define MDP4_QSEED_TABLE2_OFF 0x9000
1161
1162void mdp4_vg_qseed_init(int vp_num)
1163{
1164 uint32 *off;
1165 int i, voff;
1166
1167 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1168
1169 voff = MDP4_VIDEO_OFF * vp_num;
1170 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1171 MDP4_QSEED_TABLE0_OFF);
1172 for (i = 0; i < (sizeof(vg_qseed_table0) / sizeof(uint32)); i++) {
1173 outpdw(off, vg_qseed_table0[i]);
1174 off++;
1175 /* This code is added to workaround the 1K Boundary AXI
1176 Interleave operations from Scorpion that can potentially
1177 corrupt the QSEED table. The idea is to complete the prevous
1178 to the buffer before making the next write when address is
1179 1KB aligned to ensure the write has been committed prior to
1180 next instruction write that can go out from the secondary AXI
1181 port.This happens also because of the expected write sequence
1182 from QSEED table, where LSP has to be written first then the
1183 MSP to trigger both to write out to SRAM, if this has not been
1184 the expectation, then corruption wouldn't have happened.*/
1185
1186 if (!((uint32)off & 0x3FF))
1187 wmb();
1188 }
1189
1190 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1191 MDP4_QSEED_TABLE1_OFF);
1192 for (i = 0; i < (sizeof(vg_qseed_table1) / sizeof(uint32)); i++) {
1193 outpdw(off, vg_qseed_table1[i]);
1194 off++;
1195 if (!((uint32)off & 0x3FF))
1196 wmb();
1197 }
1198
1199 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1200 MDP4_QSEED_TABLE2_OFF);
1201 for (i = 0; i < (sizeof(vg_qseed_table2) / sizeof(uint32)); i++) {
1202 outpdw(off, vg_qseed_table2[i]);
1203 off++;
1204 if (!((uint32)off & 0x3FF))
1205 wmb();
1206 }
1207
1208 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1209
1210}
1211
1212void mdp4_mixer_blend_init(mixer_num)
1213{
1214 unsigned char *overlay_base;
1215 int off;
1216
1217 if (mixer_num) /* mixer number, /dev/fb0, /dev/fb1 */
1218 overlay_base = MDP_BASE + MDP4_OVERLAYPROC1_BASE;/* 0x18000 */
1219 else
1220 overlay_base = MDP_BASE + MDP4_OVERLAYPROC0_BASE;/* 0x10000 */
1221
1222 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1223
1224 /* stage 0 to stage 2 */
1225 off = 0;
1226 outpdw(overlay_base + off + 0x104, 0x010);
1227 outpdw(overlay_base + off + 0x108, 0xff);/* FG */
1228 outpdw(overlay_base + off + 0x10c, 0x00);/* BG */
1229
1230 off += 0x20;
1231 outpdw(overlay_base + off + 0x104, 0x010);
1232 outpdw(overlay_base + off + 0x108, 0xff);/* FG */
1233 outpdw(overlay_base + off + 0x10c, 0x00);/* BG */
1234
1235 off += 0x20;
1236 outpdw(overlay_base + off + 0x104, 0x010);
1237 outpdw(overlay_base + off + 0x108, 0xff);/* FG */
1238 outpdw(overlay_base + off + 0x10c, 0x00);/* BG */
1239
1240 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1241}
1242
Carl Vanderlipfa1de672011-12-05 12:37:59 -08001243struct mdp_csc_cfg mdp_csc_convert[4] = {
1244 { /*RGB2RGB*/
1245 0,
1246 {
1247 0x0200, 0x0000, 0x0000,
1248 0x0000, 0x0200, 0x0000,
1249 0x0000, 0x0000, 0x0200,
1250 },
1251 { 0x0, 0x0, 0x0, },
1252 { 0x0, 0x0, 0x0, },
1253 { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, },
1254 { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, },
1255 },
1256 { /*YUV2RGB*/
1257 0,
1258 {
1259 0x0254, 0x0000, 0x0331,
1260 0x0254, 0xff37, 0xfe60,
1261 0x0254, 0x0409, 0x0000,
1262 },
1263 { 0xfff0, 0xff80, 0xff80, },
1264 { 0x0, 0x0, 0x0, },
1265 { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, },
1266 { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, },
1267 },
1268 { /*RGB2YUV*/
1269 0,
1270 {
1271 0x0083, 0x0102, 0x0032,
1272 0x1fb5, 0x1f6c, 0x00e1,
1273 0x00e1, 0x1f45, 0x1fdc
1274 },
1275 { 0x0, 0x0, 0x0, },
1276 { 0x0010, 0x0080, 0x0080, },
1277 { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, },
1278 { 0x0010, 0x00eb, 0x0010, 0x00f0, 0x0010, 0x00f0, },
1279 },
1280 { /*YUV2YUV ???*/
1281 0,
1282 {
1283 0x0200, 0x0000, 0x0000,
1284 0x0000, 0x0200, 0x0000,
1285 0x0000, 0x0000, 0x0200,
1286 },
1287 { 0x0, 0x0, 0x0, },
1288 { 0x0, 0x0, 0x0, },
1289 { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, },
1290 { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, },
1291 },
1292};
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001293
Carl Vanderlipfa1de672011-12-05 12:37:59 -08001294struct mdp_csc_cfg csc_matrix[3] = {
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001295 {
Carl Vanderlipfa1de672011-12-05 12:37:59 -08001296 (MDP_CSC_FLAG_YUV_OUT),
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001297 {
1298 0x0254, 0x0000, 0x0331,
1299 0x0254, 0xff37, 0xfe60,
1300 0x0254, 0x0409, 0x0000,
1301 },
1302 {
1303 0xfff0, 0xff80, 0xff80,
1304 },
1305 {
1306 0, 0, 0,
1307 },
1308 {
1309 0, 0xff, 0, 0xff, 0, 0xff,
1310 },
1311 {
1312 0, 0xff, 0, 0xff, 0, 0xff,
1313 },
1314 },
1315 {
Carl Vanderlipfa1de672011-12-05 12:37:59 -08001316 (MDP_CSC_FLAG_YUV_OUT),
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001317 {
1318 0x0254, 0x0000, 0x0331,
1319 0x0254, 0xff37, 0xfe60,
1320 0x0254, 0x0409, 0x0000,
1321 },
1322 {
1323 0xfff0, 0xff80, 0xff80,
1324 },
1325 {
1326 0, 0, 0,
1327 },
1328 {
1329 0, 0xff, 0, 0xff, 0, 0xff,
1330 },
1331 {
1332 0, 0xff, 0, 0xff, 0, 0xff,
1333 },
1334 },
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08001335 {
Carl Vanderlipfa1de672011-12-05 12:37:59 -08001336 (0),
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08001337 {
1338 0x0200, 0x0000, 0x0000,
1339 0x0000, 0x0200, 0x0000,
1340 0x0000, 0x0000, 0x0200,
1341 },
1342 {
1343 0x0, 0x0, 0x0,
1344 },
1345 {
1346 0, 0, 0,
1347 },
1348 {
1349 0, 0xff, 0, 0xff, 0, 0xff,
1350 },
1351 {
1352 0, 0xff, 0, 0xff, 0, 0xff,
1353 },
1354 },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001355};
1356
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001357
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001358
1359#define MDP4_CSC_MV_OFF 0x4400
1360#define MDP4_CSC_PRE_BV_OFF 0x4500
1361#define MDP4_CSC_POST_BV_OFF 0x4580
1362#define MDP4_CSC_PRE_LV_OFF 0x4600
1363#define MDP4_CSC_POST_LV_OFF 0x4680
1364
1365void mdp4_vg_csc_mv_setup(int vp_num)
1366{
1367 uint32 *off;
1368 int i, voff;
1369
1370 voff = MDP4_VIDEO_OFF * vp_num;
1371 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1372 MDP4_CSC_MV_OFF);
1373
1374 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1375 for (i = 0; i < 9; i++) {
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001376 outpdw(off, csc_matrix[vp_num].csc_mv[i]);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001377 off++;
1378 }
1379 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1380}
1381
1382void mdp4_vg_csc_pre_bv_setup(int vp_num)
1383{
1384 uint32 *off;
1385 int i, voff;
1386
1387 voff = MDP4_VIDEO_OFF * vp_num;
1388 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1389 MDP4_CSC_PRE_BV_OFF);
1390
1391 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1392 for (i = 0; i < 3; i++) {
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001393 outpdw(off, csc_matrix[vp_num].csc_pre_bv[i]);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001394 off++;
1395 }
1396 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1397}
1398
1399void mdp4_vg_csc_post_bv_setup(int vp_num)
1400{
1401 uint32 *off;
1402 int i, voff;
1403
1404 voff = MDP4_VIDEO_OFF * vp_num;
1405 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1406 MDP4_CSC_POST_BV_OFF);
1407
1408 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1409 for (i = 0; i < 3; i++) {
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001410 outpdw(off, csc_matrix[vp_num].csc_post_bv[i]);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001411 off++;
1412 }
1413 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1414}
1415
1416void mdp4_vg_csc_pre_lv_setup(int vp_num)
1417{
1418 uint32 *off;
1419 int i, voff;
1420
1421 voff = MDP4_VIDEO_OFF * vp_num;
1422 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1423 MDP4_CSC_PRE_LV_OFF);
1424
1425 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1426 for (i = 0; i < 6; i++) {
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001427 outpdw(off, csc_matrix[vp_num].csc_pre_lv[i]);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001428 off++;
1429 }
1430 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1431}
1432
1433void mdp4_vg_csc_post_lv_setup(int vp_num)
1434{
1435 uint32 *off;
1436 int i, voff;
1437
1438 voff = MDP4_VIDEO_OFF * vp_num;
1439 off = (uint32 *)(MDP_BASE + MDP4_VIDEO_BASE + voff +
1440 MDP4_CSC_POST_LV_OFF);
1441
1442 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1443 for (i = 0; i < 6; i++) {
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001444 outpdw(off, csc_matrix[vp_num].csc_post_lv[i]);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001445 off++;
1446 }
1447 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1448}
1449
Carl Vanderlipfa1de672011-12-05 12:37:59 -08001450void mdp4_vg_csc_convert_setup(int vp_num)
1451{
1452 struct mdp_csc_cfg_data cfg;
1453
1454 switch (vp_num) {
1455 case 0:
1456 cfg.block = MDP_BLOCK_VG_1;
1457 break;
1458 case 1:
1459 cfg.block = MDP_BLOCK_VG_2;
1460 break;
1461 default:
1462 pr_err("%s - invalid vp_num = %d", __func__, vp_num);
1463 return;
1464 }
1465 cfg.csc_data = csc_matrix[vp_num];
1466 mdp4_csc_enable(&cfg);
1467}
1468
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001469void mdp4_vg_csc_setup(int vp_num)
1470{
1471 /* yuv2rgb */
1472 mdp4_vg_csc_mv_setup(vp_num);
1473 mdp4_vg_csc_pre_bv_setup(vp_num);
1474 mdp4_vg_csc_post_bv_setup(vp_num);
1475 mdp4_vg_csc_pre_lv_setup(vp_num);
1476 mdp4_vg_csc_post_lv_setup(vp_num);
Carl Vanderlipfa1de672011-12-05 12:37:59 -08001477 mdp4_vg_csc_convert_setup(vp_num);
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001478}
1479void mdp4_vg_csc_update(struct mdp_csc *p)
1480{
1481 struct mdp4_overlay_pipe *pipe;
1482 int vp_num;
1483
1484 pipe = mdp4_overlay_ndx2pipe(p->id);
1485 if (pipe == NULL) {
1486 pr_err("%s: p->id = %d Error\n", __func__, p->id);
1487 return;
1488 }
1489
1490 vp_num = pipe->pipe_num - OVERLAY_PIPE_VG1;
1491
1492 if (vp_num == 0 || vp_num == 1) {
1493 memcpy(csc_matrix[vp_num].csc_mv, p->csc_mv, sizeof(p->csc_mv));
1494 memcpy(csc_matrix[vp_num].csc_pre_bv, p->csc_pre_bv,
1495 sizeof(p->csc_pre_bv));
1496 memcpy(csc_matrix[vp_num].csc_post_bv, p->csc_post_bv,
1497 sizeof(p->csc_post_bv));
1498 memcpy(csc_matrix[vp_num].csc_pre_lv, p->csc_pre_lv,
1499 sizeof(p->csc_pre_lv));
1500 memcpy(csc_matrix[vp_num].csc_post_lv, p->csc_post_lv,
1501 sizeof(p->csc_post_lv));
1502 mdp4_vg_csc_setup(vp_num);
1503 }
1504}
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001505static uint32 csc_rgb2yuv_matrix_tab[9] = {
1506 0x0083, 0x0102, 0x0032,
1507 0x1fb5, 0x1f6c, 0x00e1,
1508 0x00e1, 0x1f45, 0x1fdc
1509};
1510
1511static uint32 csc_rgb2yuv_pre_bv_tab[3] = {0, 0, 0};
1512
1513static uint32 csc_rgb2yuv_post_bv_tab[3] = {0x0010, 0x0080, 0x0080};
1514
1515static uint32 csc_rgb2yuv_pre_lv_tab[6] = {
1516 0x00, 0xff, 0x00,
1517 0xff, 0x00, 0xff
1518};
1519
1520static uint32 csc_rgb2yuv_post_lv_tab[6] = {
1521 0x0010, 0x00eb, 0x0010,
1522 0x00f0, 0x0010, 0x00f0
1523};
1524
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001525void mdp4_mixer_csc_mv_setup(uint32 mixer)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001526{
1527 uint32 *off;
1528 int i;
1529
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001530 if (mixer == MDP4_MIXER1)
1531 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC1_BASE + 0x2400);
1532 else
1533 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC2_BASE + 0x2400);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001534
1535 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1536 for (i = 0; i < 9; i++) {
1537 outpdw(off, csc_rgb2yuv_matrix_tab[i]);
1538 off++;
1539 }
1540 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1541}
1542
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001543void mdp4_mixer_csc_pre_bv_setup(uint32 mixer)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001544{
1545 uint32 *off;
1546 int i;
1547
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001548 if (mixer == MDP4_MIXER1)
1549 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC1_BASE + 0x2500);
1550 else
1551 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC2_BASE + 0x2500);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001552
1553 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1554 for (i = 0; i < 3; i++) {
1555 outpdw(off, csc_rgb2yuv_pre_bv_tab[i]);
1556 off++;
1557 }
1558 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1559}
1560
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001561void mdp4_mixer_csc_post_bv_setup(uint32 mixer)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001562{
1563 uint32 *off;
1564 int i;
1565
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001566 if (mixer == MDP4_MIXER1)
1567 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC1_BASE + 0x2580);
1568 else
1569 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC2_BASE + 0x2580);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001570
1571 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1572 for (i = 0; i < 3; i++) {
1573 outpdw(off, csc_rgb2yuv_post_bv_tab[i]);
1574 off++;
1575 }
1576 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1577}
1578
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001579void mdp4_mixer_csc_pre_lv_setup(uint32 mixer)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001580{
1581 uint32 *off;
1582 int i;
1583
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001584 if (mixer == MDP4_MIXER1)
1585 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC1_BASE + 0x2600);
1586 else
1587 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC2_BASE + 0x2600);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001588
1589 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1590 for (i = 0; i < 6; i++) {
1591 outpdw(off, csc_rgb2yuv_pre_lv_tab[i]);
1592 off++;
1593 }
1594 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1595}
1596
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001597void mdp4_mixer_csc_post_lv_setup(uint32 mixer)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001598{
1599 uint32 *off;
1600 int i;
1601
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001602 if (mixer == MDP4_MIXER1)
1603 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC1_BASE + 0x2680);
1604 else
1605 off = (uint32 *)(MDP_BASE + MDP4_OVERLAYPROC2_BASE + 0x2680);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001606
1607 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1608 for (i = 0; i < 6; i++) {
1609 outpdw(off, csc_rgb2yuv_post_lv_tab[i]);
1610 off++;
1611 }
1612 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1613}
1614
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001615void mdp4_mixer_csc_setup(uint32 mixer)
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001616{
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001617 if (mixer >= MDP4_MIXER1) {
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001618 /* rgb2yuv */
Rajesh Sastrulab52368b2011-12-22 12:09:17 -08001619 mdp4_mixer_csc_mv_setup(mixer);
1620 mdp4_mixer_csc_pre_bv_setup(mixer);
1621 mdp4_mixer_csc_post_bv_setup(mixer);
1622 mdp4_mixer_csc_pre_lv_setup(mixer);
1623 mdp4_mixer_csc_post_lv_setup(mixer);
1624 }
Nagamalleswararao Ganji4b991722011-01-28 13:24:34 -08001625}
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001626
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08001627#define DMA_P_BASE 0x90000
1628void mdp4_dmap_csc_mv_setup(void)
1629{
1630 uint32 *off;
1631 int i;
1632
1633 off = (uint32 *)(MDP_BASE + DMA_P_BASE + 0x3400);
1634
1635 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1636 for (i = 0; i < 9; i++) {
1637 outpdw(off, csc_matrix[2].csc_mv[i]);
1638 off++;
1639 }
1640 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1641}
1642
1643void mdp4_dmap_csc_pre_bv_setup(void)
1644{
1645 uint32 *off;
1646 int i;
1647
1648 off = (uint32 *)(MDP_BASE + DMA_P_BASE + 0x3500);
1649
1650 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1651 for (i = 0; i < 3; i++) {
1652 outpdw(off, csc_matrix[2].csc_pre_bv[i]);
1653 off++;
1654 }
1655 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1656}
1657
1658void mdp4_dmap_csc_post_bv_setup(void)
1659{
1660 uint32 *off;
1661 int i;
1662
1663 off = (uint32 *)(MDP_BASE + DMA_P_BASE + 0x3580);
1664
1665 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1666 for (i = 0; i < 3; i++) {
1667 outpdw(off, csc_matrix[2].csc_post_bv[i]);
1668 off++;
1669 }
1670 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1671}
1672
1673void mdp4_dmap_csc_pre_lv_setup(void)
1674{
1675 uint32 *off;
1676 int i;
1677
1678 off = (uint32 *)(MDP_BASE + DMA_P_BASE + 0x3600);
1679
1680 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1681 for (i = 0; i < 6; i++) {
1682 outpdw(off, csc_matrix[2].csc_pre_lv[i]);
1683 off++;
1684 }
1685 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1686}
1687
1688void mdp4_dmap_csc_post_lv_setup(void)
1689{
1690 uint32 *off;
1691 int i;
1692
1693 off = (uint32 *)(MDP_BASE + DMA_P_BASE + 0x3680);
1694
1695 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
1696 for (i = 0; i < 6; i++) {
1697 outpdw(off, csc_matrix[2].csc_post_lv[i]);
1698 off++;
1699 }
1700 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
1701}
1702
1703void mdp4_dmap_csc_setup(void)
1704{
1705 mdp4_dmap_csc_mv_setup();
1706 mdp4_dmap_csc_pre_bv_setup();
1707 mdp4_dmap_csc_post_bv_setup();
1708 mdp4_dmap_csc_pre_lv_setup();
1709 mdp4_dmap_csc_post_lv_setup();
1710}
1711
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001712char gc_lut[] = {
1713 0x0, 0x1, 0x2, 0x2, 0x3, 0x4, 0x5, 0x6,
1714 0x6, 0x7, 0x8, 0x9, 0xA, 0xA, 0xB, 0xC,
1715 0xD, 0xD, 0xE, 0xF, 0xF, 0x10, 0x10, 0x11,
1716 0x12, 0x12, 0x13, 0x13, 0x14, 0x14, 0x15, 0x15,
1717 0x16, 0x16, 0x17, 0x17, 0x17, 0x18, 0x18, 0x19,
1718 0x19, 0x19, 0x1A, 0x1A, 0x1B, 0x1B, 0x1B, 0x1C,
1719 0x1C, 0x1D, 0x1D, 0x1D, 0x1E, 0x1E, 0x1E, 0x1F,
1720 0x1F, 0x1F, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21,
1721 0x22, 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, 0x24,
1722 0x24, 0x24, 0x25, 0x25, 0x25, 0x25, 0x26, 0x26,
1723 0x26, 0x26, 0x27, 0x27, 0x27, 0x28, 0x28, 0x28,
1724 0x28, 0x29, 0x29, 0x29, 0x29, 0x2A, 0x2A, 0x2A,
1725 0x2A, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2C, 0x2C,
1726 0x2C, 0x2C, 0x2D, 0x2D, 0x2D, 0x2D, 0x2E, 0x2E,
1727 0x2E, 0x2E, 0x2E, 0x2F, 0x2F, 0x2F, 0x2F, 0x30,
1728 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x31,
1729 0x31, 0x32, 0x32, 0x32, 0x32, 0x32, 0x33, 0x33,
1730 0x33, 0x33, 0x33, 0x34, 0x34, 0x34, 0x34, 0x34,
1731 0x35, 0x35, 0x35, 0x35, 0x35, 0x36, 0x36, 0x36,
1732 0x36, 0x36, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37,
1733 0x38, 0x38, 0x38, 0x38, 0x38, 0x39, 0x39, 0x39,
1734 0x39, 0x39, 0x39, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A,
1735 0x3A, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3C,
1736 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3D, 0x3D, 0x3D,
1737 0x3D, 0x3D, 0x3D, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E,
1738 0x3E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x40,
1739 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41,
1740 0x41, 0x41, 0x41, 0x41, 0x42, 0x42, 0x42, 0x42,
1741 0x42, 0x42, 0x42, 0x43, 0x43, 0x43, 0x43, 0x43,
1742 0x43, 0x43, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1743 0x44, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45,
1744 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x47,
1745 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x48, 0x48,
1746 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x49, 0x49,
1747 0x49, 0x49, 0x49, 0x49, 0x49, 0x4A, 0x4A, 0x4A,
1748 0x4A, 0x4A, 0x4A, 0x4A, 0x4A, 0x4B, 0x4B, 0x4B,
1749 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4C, 0x4C, 0x4C,
1750 0x4C, 0x4C, 0x4C, 0x4C, 0x4D, 0x4D, 0x4D, 0x4D,
1751 0x4D, 0x4D, 0x4D, 0x4D, 0x4E, 0x4E, 0x4E, 0x4E,
1752 0x4E, 0x4E, 0x4E, 0x4E, 0x4E, 0x4F, 0x4F, 0x4F,
1753 0x4F, 0x4F, 0x4F, 0x4F, 0x4F, 0x50, 0x50, 0x50,
1754 0x50, 0x50, 0x50, 0x50, 0x50, 0x51, 0x51, 0x51,
1755 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x52, 0x52,
1756 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x53, 0x53,
1757 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x54,
1758 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54,
1759 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
1760 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56,
1761 0x56, 0x56, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57,
1762 0x57, 0x57, 0x57, 0x58, 0x58, 0x58, 0x58, 0x58,
1763 0x58, 0x58, 0x58, 0x58, 0x58, 0x59, 0x59, 0x59,
1764 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x5A, 0x5A,
1765 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A,
1766 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
1767 0x5B, 0x5B, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C,
1768 0x5C, 0x5C, 0x5C, 0x5C, 0x5D, 0x5D, 0x5D, 0x5D,
1769 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5E, 0x5E,
1770 0x5E, 0x5E, 0x5E, 0x5E, 0x5E, 0x5E, 0x5E, 0x5E,
1771 0x5F, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F,
1772 0x5F, 0x5F, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60,
1773 0x60, 0x60, 0x60, 0x60, 0x60, 0x61, 0x61, 0x61,
1774 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x62,
1775 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62,
1776 0x62, 0x62, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
1777 0x63, 0x63, 0x63, 0x63, 0x63, 0x64, 0x64, 0x64,
1778 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64,
1779 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65,
1780 0x65, 0x65, 0x65, 0x66, 0x66, 0x66, 0x66, 0x66,
1781 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x67,
1782 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
1783 0x67, 0x67, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68,
1784 0x68, 0x68, 0x68, 0x68, 0x68, 0x69, 0x69, 0x69,
1785 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69,
1786 0x69, 0x6A, 0x6A, 0x6A, 0x6A, 0x6A, 0x6A, 0x6A,
1787 0x6A, 0x6A, 0x6A, 0x6A, 0x6A, 0x6B, 0x6B, 0x6B,
1788 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B,
1789 0x6B, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
1790 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6D, 0x6D, 0x6D,
1791 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D,
1792 0x6D, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
1793 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6F, 0x6F, 0x6F,
1794 0x6F, 0x6F, 0x6F, 0x6F, 0x6F, 0x6F, 0x6F, 0x6F,
1795 0x6F, 0x6F, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70,
1796 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x71, 0x71,
1797 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71,
1798 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72,
1799 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72,
1800 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73,
1801 0x73, 0x73, 0x73, 0x73, 0x73, 0x74, 0x74, 0x74,
1802 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74,
1803 0x74, 0x74, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75,
1804 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75,
1805 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76,
1806 0x76, 0x76, 0x76, 0x76, 0x76, 0x77, 0x77, 0x77,
1807 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
1808 0x77, 0x77, 0x77, 0x78, 0x78, 0x78, 0x78, 0x78,
1809 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
1810 0x78, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79,
1811 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x7A, 0x7A,
1812 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A,
1813 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x7B, 0x7B, 0x7B,
1814 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B,
1815 0x7B, 0x7B, 0x7B, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C,
1816 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C,
1817 0x7C, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D,
1818 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D,
1819 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E,
1820 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F,
1821 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F,
1822 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x80,
1823 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
1824 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81,
1825 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
1826 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82,
1827 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
1828 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
1829 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
1830 0x83, 0x83, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
1831 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
1832 0x84, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
1833 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
1834 0x85, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
1835 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
1836 0x86, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
1837 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
1838 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
1839 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
1840 0x88, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
1841 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
1842 0x89, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A,
1843 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A,
1844 0x8A, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B,
1845 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B,
1846 0x8B, 0x8B, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C,
1847 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C,
1848 0x8C, 0x8C, 0x8C, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D,
1849 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D,
1850 0x8D, 0x8D, 0x8D, 0x8D, 0x8E, 0x8E, 0x8E, 0x8E,
1851 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E,
1852 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8F, 0x8F, 0x8F,
1853 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F,
1854 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x90, 0x90,
1855 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
1856 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x91,
1857 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91,
1858 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91,
1859 0x91, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92,
1860 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92,
1861 0x92, 0x92, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93,
1862 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93,
1863 0x93, 0x93, 0x93, 0x93, 0x94, 0x94, 0x94, 0x94,
1864 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94,
1865 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x95, 0x95,
1866 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95,
1867 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95,
1868 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96,
1869 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96,
1870 0x96, 0x96, 0x96, 0x97, 0x97, 0x97, 0x97, 0x97,
1871 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97,
1872 0x97, 0x97, 0x97, 0x97, 0x97, 0x98, 0x98, 0x98,
1873 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98,
1874 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98,
1875 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
1876 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
1877 0x99, 0x99, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A,
1878 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A,
1879 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9B, 0x9B, 0x9B,
1880 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B,
1881 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B,
1882 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C,
1883 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C,
1884 0x9C, 0x9C, 0x9C, 0x9C, 0x9D, 0x9D, 0x9D, 0x9D,
1885 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D,
1886 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9E,
1887 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E,
1888 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E,
1889 0x9E, 0x9E, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F,
1890 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F,
1891 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xA0, 0xA0,
1892 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0,
1893 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0,
1894 0xA0, 0xA0, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1,
1895 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1,
1896 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA2, 0xA2,
1897 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2,
1898 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2,
1899 0xA2, 0xA2, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3,
1900 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3,
1901 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA4, 0xA4,
1902 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
1903 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
1904 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5,
1905 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5,
1906 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5,
1907 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6,
1908 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6,
1909 0xA6, 0xA6, 0xA6, 0xA6, 0xA7, 0xA7, 0xA7, 0xA7,
1910 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7,
1911 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7,
1912 0xA7, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,
1913 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,
1914 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA9,
1915 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9,
1916 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9,
1917 0xA9, 0xA9, 0xA9, 0xA9, 0xAA, 0xAA, 0xAA, 0xAA,
1918 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
1919 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
1920 0xAA, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB,
1921 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB,
1922 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAC,
1923 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC,
1924 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC,
1925 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAD, 0xAD, 0xAD,
1926 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD,
1927 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD,
1928 0xAD, 0xAD, 0xAD, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE,
1929 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE,
1930 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE,
1931 0xAE, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF,
1932 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF,
1933 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xB0,
1934 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0,
1935 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0,
1936 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB1, 0xB1,
1937 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1,
1938 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1,
1939 0xB1, 0xB1, 0xB1, 0xB1, 0xB2, 0xB2, 0xB2, 0xB2,
1940 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2,
1941 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2,
1942 0xB2, 0xB2, 0xB2, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3,
1943 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3,
1944 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3,
1945 0xB3, 0xB3, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4,
1946 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4,
1947 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4,
1948 0xB4, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5,
1949 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5,
1950 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5,
1951 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6,
1952 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6,
1953 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6,
1954 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7,
1955 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7,
1956 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB8,
1957 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8,
1958 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8,
1959 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB9,
1960 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9,
1961 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9,
1962 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xBA,
1963 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA,
1964 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA,
1965 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBB,
1966 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
1967 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
1968 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
1969 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC,
1970 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC,
1971 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC,
1972 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
1973 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
1974 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
1975 0xBD, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE,
1976 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE,
1977 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE,
1978 0xBE, 0xBE, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF,
1979 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF,
1980 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF,
1981 0xBF, 0xBF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
1982 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
1983 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
1984 0xC0, 0xC0, 0xC0, 0xC0, 0xC1, 0xC1, 0xC1, 0xC1,
1985 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1,
1986 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1,
1987 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC2, 0xC2, 0xC2,
1988 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2,
1989 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2,
1990 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC3, 0xC3,
1991 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
1992 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
1993 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
1994 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4,
1995 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4,
1996 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4,
1997 0xC4, 0xC4, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5,
1998 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5,
1999 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5,
2000 0xC5, 0xC5, 0xC5, 0xC5, 0xC6, 0xC6, 0xC6, 0xC6,
2001 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
2002 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
2003 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC7, 0xC7,
2004 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7,
2005 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7,
2006 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7,
2007 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8,
2008 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8,
2009 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8,
2010 0xC8, 0xC8, 0xC8, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9,
2011 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9,
2012 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9,
2013 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xCA, 0xCA,
2014 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
2015 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
2016 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
2017 0xCA, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB,
2018 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB,
2019 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB,
2020 0xCB, 0xCB, 0xCB, 0xCB, 0xCC, 0xCC, 0xCC, 0xCC,
2021 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
2022 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
2023 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD,
2024 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,
2025 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,
2026 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,
2027 0xCD, 0xCD, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE,
2028 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE,
2029 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE,
2030 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCF, 0xCF,
2031 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF,
2032 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF,
2033 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF,
2034 0xCF, 0xCF, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0,
2035 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0,
2036 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0,
2037 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD1, 0xD1, 0xD1,
2038 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1,
2039 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1,
2040 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1,
2041 0xD1, 0xD1, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2,
2042 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2,
2043 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2,
2044 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD3, 0xD3,
2045 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3,
2046 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3,
2047 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3,
2048 0xD3, 0xD3, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4,
2049 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4,
2050 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4,
2051 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD5,
2052 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5,
2053 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5,
2054 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5,
2055 0xD5, 0xD5, 0xD5, 0xD5, 0xD6, 0xD6, 0xD6, 0xD6,
2056 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6,
2057 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6,
2058 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6,
2059 0xD6, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
2060 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
2061 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
2062 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD8, 0xD8,
2063 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
2064 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
2065 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
2066 0xD8, 0xD8, 0xD8, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9,
2067 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9,
2068 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9,
2069 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9,
2070 0xD9, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA,
2071 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA,
2072 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA,
2073 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDB, 0xDB,
2074 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB,
2075 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB,
2076 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB,
2077 0xDB, 0xDB, 0xDB, 0xDB, 0xDC, 0xDC, 0xDC, 0xDC,
2078 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC,
2079 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC,
2080 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC,
2081 0xDC, 0xDC, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
2082 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
2083 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
2084 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
2085 0xDD, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE,
2086 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE,
2087 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE,
2088 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDF,
2089 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF,
2090 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF,
2091 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF,
2092 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xE0, 0xE0,
2093 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
2094 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
2095 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
2096 0xE0, 0xE0, 0xE0, 0xE0, 0xE1, 0xE1, 0xE1, 0xE1,
2097 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1,
2098 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1,
2099 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1,
2100 0xE1, 0xE1, 0xE1, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2,
2101 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2,
2102 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2,
2103 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2,
2104 0xE2, 0xE2, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3,
2105 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3,
2106 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3,
2107 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3,
2108 0xE3, 0xE3, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4,
2109 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4,
2110 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4,
2111 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4,
2112 0xE4, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5,
2113 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5,
2114 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5,
2115 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5,
2116 0xE5, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6,
2117 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6,
2118 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6,
2119 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6,
2120 0xE6, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7,
2121 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7,
2122 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7,
2123 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7,
2124 0xE7, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8,
2125 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8,
2126 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8,
2127 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8,
2128 0xE8, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9,
2129 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9,
2130 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9,
2131 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9,
2132 0xE9, 0xE9, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA,
2133 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA,
2134 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA,
2135 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA,
2136 0xEA, 0xEA, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB,
2137 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB,
2138 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB,
2139 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB,
2140 0xEB, 0xEB, 0xEB, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
2141 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
2142 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
2143 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
2144 0xEC, 0xEC, 0xEC, 0xEC, 0xED, 0xED, 0xED, 0xED,
2145 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED,
2146 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED,
2147 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED,
2148 0xED, 0xED, 0xED, 0xED, 0xED, 0xEE, 0xEE, 0xEE,
2149 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
2150 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
2151 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
2152 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0xEF,
2153 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF,
2154 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF,
2155 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF,
2156 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF,
2157 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
2158 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
2159 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
2160 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
2161 0xF0, 0xF0, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1,
2162 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1,
2163 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1,
2164 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1,
2165 0xF1, 0xF1, 0xF1, 0xF1, 0xF2, 0xF2, 0xF2, 0xF2,
2166 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
2167 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
2168 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
2169 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF3, 0xF3,
2170 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
2171 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
2172 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
2173 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
2174 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
2175 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
2176 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
2177 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
2178 0xF4, 0xF4, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5,
2179 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5,
2180 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5,
2181 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5,
2182 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF6, 0xF6, 0xF6,
2183 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6,
2184 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6,
2185 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6,
2186 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6, 0xF6,
2187 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
2188 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
2189 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
2190 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
2191 0xF7, 0xF7, 0xF7, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
2192 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
2193 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
2194 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
2195 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF9, 0xF9,
2196 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9,
2197 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9,
2198 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9,
2199 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9,
2200 0xF9, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA,
2201 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA,
2202 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA,
2203 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA,
2204 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFB, 0xFB, 0xFB,
2205 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB,
2206 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB,
2207 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB,
2208 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB,
2209 0xFB, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
2210 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
2211 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
2212 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
2213 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFD, 0xFD, 0xFD,
2214 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
2215 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
2216 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
2217 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
2218 0xFD, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
2219 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
2220 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
2221 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
2222 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF,
2223 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
2224 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
2225};
2226
2227void mdp4_mixer_gc_lut_setup(int mixer_num)
2228{
2229 unsigned char *base;
2230 uint32 data;
2231 char val;
2232 int i, off;
2233
2234 if (mixer_num) /* mixer number, /dev/fb0, /dev/fb1 */
2235 base = MDP_BASE + MDP4_OVERLAYPROC1_BASE;/* 0x18000 */
2236 else
2237 base = MDP_BASE + MDP4_OVERLAYPROC0_BASE;/* 0x10000 */
2238
2239 base += 0x4000; /* GC_LUT offset */
2240
2241 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
2242 off = 0;
2243 for (i = 0; i < 4096; i++) {
2244 val = gc_lut[i];
2245 data = (val << 16 | val << 8 | val); /* R, B, and G are same */
2246 outpdw(base + off, data);
2247 off += 4;
2248 }
2249 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
2250}
2251
2252uint32 igc_video_lut[] = { /* non linear */
2253 0x0, 0x1, 0x2, 0x4, 0x5, 0x6, 0x7, 0x9,
2254 0xA, 0xB, 0xC, 0xE, 0xF, 0x10, 0x12, 0x14,
2255 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F, 0x21, 0x23,
2256 0x25, 0x28, 0x2A, 0x2D, 0x30, 0x32, 0x35, 0x38,
2257 0x3B, 0x3E, 0x42, 0x45, 0x48, 0x4C, 0x4F, 0x53,
2258 0x57, 0x5B, 0x5F, 0x63, 0x67, 0x6B, 0x70, 0x74,
2259 0x79, 0x7E, 0x83, 0x88, 0x8D, 0x92, 0x97, 0x9C,
2260 0xA2, 0xA8, 0xAD, 0xB3, 0xB9, 0xBF, 0xC5, 0xCC,
2261 0xD2, 0xD8, 0xDF, 0xE6, 0xED, 0xF4, 0xFB, 0x102,
2262 0x109, 0x111, 0x118, 0x120, 0x128, 0x130, 0x138, 0x140,
2263 0x149, 0x151, 0x15A, 0x162, 0x16B, 0x174, 0x17D, 0x186,
2264 0x190, 0x199, 0x1A3, 0x1AC, 0x1B6, 0x1C0, 0x1CA, 0x1D5,
2265 0x1DF, 0x1EA, 0x1F4, 0x1FF, 0x20A, 0x215, 0x220, 0x22B,
2266 0x237, 0x242, 0x24E, 0x25A, 0x266, 0x272, 0x27F, 0x28B,
2267 0x298, 0x2A4, 0x2B1, 0x2BE, 0x2CB, 0x2D8, 0x2E6, 0x2F3,
2268 0x301, 0x30F, 0x31D, 0x32B, 0x339, 0x348, 0x356, 0x365,
2269 0x374, 0x383, 0x392, 0x3A1, 0x3B1, 0x3C0, 0x3D0, 0x3E0,
2270 0x3F0, 0x400, 0x411, 0x421, 0x432, 0x443, 0x454, 0x465,
2271 0x476, 0x487, 0x499, 0x4AB, 0x4BD, 0x4CF, 0x4E1, 0x4F3,
2272 0x506, 0x518, 0x52B, 0x53E, 0x551, 0x565, 0x578, 0x58C,
2273 0x5A0, 0x5B3, 0x5C8, 0x5DC, 0x5F0, 0x605, 0x61A, 0x62E,
2274 0x643, 0x659, 0x66E, 0x684, 0x699, 0x6AF, 0x6C5, 0x6DB,
2275 0x6F2, 0x708, 0x71F, 0x736, 0x74D, 0x764, 0x77C, 0x793,
2276 0x7AB, 0x7C3, 0x7DB, 0x7F3, 0x80B, 0x824, 0x83D, 0x855,
2277 0x86F, 0x888, 0x8A1, 0x8BB, 0x8D4, 0x8EE, 0x908, 0x923,
2278 0x93D, 0x958, 0x973, 0x98E, 0x9A9, 0x9C4, 0x9DF, 0x9FB,
2279 0xA17, 0xA33, 0xA4F, 0xA6C, 0xA88, 0xAA5, 0xAC2, 0xADF,
2280 0xAFC, 0xB19, 0xB37, 0xB55, 0xB73, 0xB91, 0xBAF, 0xBCE,
2281 0xBEC, 0xC0B, 0xC2A, 0xC4A, 0xC69, 0xC89, 0xCA8, 0xCC8,
2282 0xCE8, 0xD09, 0xD29, 0xD4A, 0xD6B, 0xD8C, 0xDAD, 0xDCF,
2283 0xDF0, 0xE12, 0xE34, 0xE56, 0xE79, 0xE9B, 0xEBE, 0xEE1,
2284 0xF04, 0xF27, 0xF4B, 0xF6E, 0xF92, 0xFB6, 0xFDB, 0xFFF,
2285};
2286
2287void mdp4_vg_igc_lut_setup(int vp_num)
2288{
2289 unsigned char *base;
2290 int i, voff, off;
2291 uint32 data, val;
2292
2293 voff = MDP4_VIDEO_OFF * vp_num;
2294 base = MDP_BASE + MDP4_VIDEO_BASE + voff + 0x5000;
2295
2296 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
2297 off = 0;
2298 for (i = 0; i < 256; i++) {
2299 val = igc_video_lut[i];
2300 data = (val << 16 | val); /* color 0 and 1 */
2301 outpdw(base + off, data);
2302 outpdw(base + off + 0x800, val); /* color 2 */
2303 off += 4;
2304 }
2305 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
2306}
2307
2308uint32 igc_rgb_lut[] = { /* linear */
2309 0x0, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
2310 0x80, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1,
2311 0x101, 0x111, 0x121, 0x131, 0x141, 0x151, 0x161, 0x171,
2312 0x181, 0x191, 0x1A2, 0x1B2, 0x1C2, 0x1D2, 0x1E2, 0x1F2,
2313 0x202, 0x212, 0x222, 0x232, 0x242, 0x252, 0x262, 0x272,
2314 0x282, 0x292, 0x2A2, 0x2B3, 0x2C3, 0x2D3, 0x2E3, 0x2F3,
2315 0x303, 0x313, 0x323, 0x333, 0x343, 0x353, 0x363, 0x373,
2316 0x383, 0x393, 0x3A3, 0x3B3, 0x3C4, 0x3D4, 0x3E4, 0x3F4,
2317 0x404, 0x414, 0x424, 0x434, 0x444, 0x454, 0x464, 0x474,
2318 0x484, 0x494, 0x4A4, 0x4B4, 0x4C4, 0x4D5, 0x4E5, 0x4F5,
2319 0x505, 0x515, 0x525, 0x535, 0x545, 0x555, 0x565, 0x575,
2320 0x585, 0x595, 0x5A5, 0x5B5, 0x5C5, 0x5D5, 0x5E6, 0x5F6,
2321 0x606, 0x616, 0x626, 0x636, 0x646, 0x656, 0x666, 0x676,
2322 0x686, 0x696, 0x6A6, 0x6B6, 0x6C6, 0x6D6, 0x6E6, 0x6F7,
2323 0x707, 0x717, 0x727, 0x737, 0x747, 0x757, 0x767, 0x777,
2324 0x787, 0x797, 0x7A7, 0x7B7, 0x7C7, 0x7D7, 0x7E7, 0x7F7,
2325 0x808, 0x818, 0x828, 0x838, 0x848, 0x858, 0x868, 0x878,
2326 0x888, 0x898, 0x8A8, 0x8B8, 0x8C8, 0x8D8, 0x8E8, 0x8F8,
2327 0x908, 0x919, 0x929, 0x939, 0x949, 0x959, 0x969, 0x979,
2328 0x989, 0x999, 0x9A9, 0x9B9, 0x9C9, 0x9D9, 0x9E9, 0x9F9,
2329 0xA09, 0xA19, 0xA2A, 0xA3A, 0xA4A, 0xA5A, 0xA6A, 0xA7A,
2330 0xA8A, 0xA9A, 0xAAA, 0xABA, 0xACA, 0xADA, 0xAEA, 0xAFA,
2331 0xB0A, 0xB1A, 0xB2A, 0xB3B, 0xB4B, 0xB5B, 0xB6B, 0xB7B,
2332 0xB8B, 0xB9B, 0xBAB, 0xBBB, 0xBCB, 0xBDB, 0xBEB, 0xBFB,
2333 0xC0B, 0xC1B, 0xC2B, 0xC3B, 0xC4C, 0xC5C, 0xC6C, 0xC7C,
2334 0xC8C, 0xC9C, 0xCAC, 0xCBC, 0xCCC, 0xCDC, 0xCEC, 0xCFC,
2335 0xD0C, 0xD1C, 0xD2C, 0xD3C, 0xD4C, 0xD5D, 0xD6D, 0xD7D,
2336 0xD8D, 0xD9D, 0xDAD, 0xDBD, 0xDCD, 0xDDD, 0xDED, 0xDFD,
2337 0xE0D, 0xE1D, 0xE2D, 0xE3D, 0xE4D, 0xE5D, 0xE6E, 0xE7E,
2338 0xE8E, 0xE9E, 0xEAE, 0xEBE, 0xECE, 0xEDE, 0xEEE, 0xEFE,
2339 0xF0E, 0xF1E, 0xF2E, 0xF3E, 0xF4E, 0xF5E, 0xF6E, 0xF7F,
2340 0xF8F, 0xF9F, 0xFAF, 0xFBF, 0xFCF, 0xFDF, 0xFEF, 0xFFF,
2341};
2342
2343void mdp4_rgb_igc_lut_setup(int num)
2344{
2345 unsigned char *base;
2346 int i, voff, off;
2347 uint32 data, val;
2348
2349 voff = MDP4_RGB_OFF * num;
2350 base = MDP_BASE + MDP4_RGB_BASE + voff + 0x5000;
2351
2352 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
2353 off = 0;
2354 for (i = 0; i < 256; i++) {
2355 val = igc_rgb_lut[i];
2356 data = (val << 16 | val); /* color 0 and 1 */
2357 outpdw(base + off, data);
2358 outpdw(base + off + 0x800, val); /* color 2 */
2359 off += 4;
2360 }
2361 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
2362}
2363
2364uint32 mdp4_rgb_igc_lut_cvt(uint32 ndx)
2365{
2366 return igc_rgb_lut[ndx & 0x0ff];
2367}
2368
2369uint32_t mdp4_ss_table_value(int8_t value, int8_t index)
2370{
2371 uint32_t out = 0x0;
2372 int8_t level = -1;
2373 uint32_t mask = 0xffffffff;
2374
2375 if (value < 0) {
2376 if (value == -128)
2377 value = 127;
2378 else
2379 value = -value;
2380 out = 0x11111111;
2381 } else {
2382 out = 0x88888888;
2383 mask = 0x0fffffff;
2384 }
2385
2386 if (value == 0)
2387 level = 0;
2388 else {
2389 while (value > 0 && level < 7) {
2390 level++;
2391 value -= 16;
2392 }
2393 }
2394
2395 if (level == 0) {
2396 if (index == 0)
2397 out = 0x0;
2398 else
2399 out = 0x20000000;
2400 } else {
2401 out += (0x11111111 * level);
2402 if (index == 1)
2403 out &= mask;
2404 }
2405
2406 return out;
2407}
2408
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002409static uint32_t mdp4_csc_block2base(uint32_t block)
2410{
2411 uint32_t base = 0x0;
2412 switch (block) {
2413 case MDP_BLOCK_OVERLAY_1:
2414 base = 0x1A000;
2415 break;
Pravin Tamkhaneb18c9e22012-04-13 18:29:34 -07002416 case MDP_BLOCK_OVERLAY_2:
2417 base = (mdp_rev >= MDP_REV_44) ? 0x8A000 : 0x0;
2418 break;
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002419 case MDP_BLOCK_VG_1:
2420 base = 0x24000;
2421 break;
2422 case MDP_BLOCK_VG_2:
2423 base = 0x34000;
2424 break;
2425 case MDP_BLOCK_DMA_P:
2426 base = 0x93000;
2427 break;
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002428 case MDP_BLOCK_DMA_S:
2429 base = (mdp_rev >= MDP_REV_42) ? 0xA3000 : 0x0;
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002430 default:
2431 break;
2432 }
2433 return base;
2434}
2435
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002436int mdp4_csc_enable(struct mdp_csc_cfg_data *config)
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002437{
2438 uint32_t output, base, temp, mask;
2439
2440 switch (config->block) {
2441 case MDP_BLOCK_DMA_P:
2442 base = 0x90070;
2443 output = (config->csc_data.flags << 3) & (0x08);
2444 temp = (config->csc_data.flags << 10) & (0x1800);
2445 output |= temp;
2446 mask = 0x08 | 0x1800;
2447 break;
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002448 case MDP_BLOCK_DMA_S:
2449 base = 0xA0028;
2450 output = (config->csc_data.flags << 3) & (0x08);
2451 temp = (config->csc_data.flags << 10) & (0x1800);
2452 output |= temp;
2453 mask = 0x08 | 0x1800;
2454 break;
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002455 case MDP_BLOCK_VG_1:
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002456 base = 0x20058;
2457 output = (config->csc_data.flags << 11) & (0x800);
2458 temp = (config->csc_data.flags << 8) & (0x600);
2459 output |= temp;
2460 mask = 0x800 | 0x600;
2461 break;
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002462 case MDP_BLOCK_VG_2:
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002463 base = 0x30058;
2464 output = (config->csc_data.flags << 11) & (0x800);
2465 temp = (config->csc_data.flags << 8) & (0x600);
2466 output |= temp;
2467 mask = 0x800 | 0x600;
2468 break;
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002469 case MDP_BLOCK_OVERLAY_1:
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002470 base = 0x18200;
2471 output = config->csc_data.flags;
2472 mask = 0x07;
2473 break;
Pravin Tamkhaneb18c9e22012-04-13 18:29:34 -07002474 case MDP_BLOCK_OVERLAY_2:
2475 base = 0x88200;
2476 output = config->csc_data.flags;
2477 mask = 0x07;
2478 break;
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002479 default:
2480 pr_err("%s - CSC block does not exist on MDP_BLOCK = %d\n",
2481 __func__, config->block);
2482 return -EINVAL;
2483 }
2484
2485 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
2486 temp = inpdw(MDP_BASE + base) & ~mask;
2487 output |= temp;
2488 outpdw(MDP_BASE + base, output);
2489 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
2490 return 0;
2491}
2492
2493#define CSC_MV_OFF 0x400
2494#define CSC_BV_OFF 0x500
2495#define CSC_LV_OFF 0x600
2496#define CSC_POST_OFF 0x80
2497
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002498void mdp4_csc_write(struct mdp_csc_cfg *data, uint32_t base)
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002499{
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002500 int i;
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002501 uint32_t *off;
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002502
2503 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002504 off = (uint32_t *) ((uint32_t) base + CSC_MV_OFF);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002505 for (i = 0; i < 9; i++) {
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002506 outpdw(off, data->csc_mv[i]);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002507 off++;
2508 }
2509
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002510 off = (uint32_t *) ((uint32_t) base + CSC_BV_OFF);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002511 for (i = 0; i < 3; i++) {
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002512 outpdw(off, data->csc_pre_bv[i]);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002513 outpdw((uint32_t *)((uint32_t)off + CSC_POST_OFF),
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002514 data->csc_post_bv[i]);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002515 off++;
2516 }
2517
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002518 off = (uint32_t *) ((uint32_t) base + CSC_LV_OFF);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002519 for (i = 0; i < 6; i++) {
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002520 outpdw(off, data->csc_pre_lv[i]);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002521 outpdw((uint32_t *)((uint32_t)off + CSC_POST_OFF),
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002522 data->csc_post_lv[i]);
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002523 off++;
2524 }
2525 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
Carl Vanderlipfa1de672011-12-05 12:37:59 -08002526}
2527
2528int mdp4_csc_config(struct mdp_csc_cfg_data *config)
2529{
2530 int ret = 0;
2531 uint32_t base;
2532
2533 base = mdp4_csc_block2base(config->block);
2534 if (!base) {
2535 pr_warn("%s: Block type %d isn't supported by CSC.\n",
2536 __func__, config->block);
2537 return -EINVAL;
2538 }
2539
2540 mdp4_csc_write(&config->csc_data, (uint32_t) (MDP_BASE + base));
Carl Vanderlipdaa069f2011-11-28 14:09:24 -08002541
2542 ret = mdp4_csc_enable(config);
2543
2544 return ret;
2545}
2546
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002547void mdp4_init_writeback_buf(struct msm_fb_data_type *mfd, u32 mix_num)
2548{
2549 struct mdp_buf_type *buf;
2550
2551 if (mix_num == MDP4_MIXER0)
2552 buf = mfd->ov0_wb_buf;
2553 else
2554 buf = mfd->ov1_wb_buf;
2555
2556 buf->ihdl = NULL;
2557 buf->phys_addr = 0;
2558}
2559
2560u32 mdp4_allocate_writeback_buf(struct msm_fb_data_type *mfd, u32 mix_num)
2561{
2562 struct mdp_buf_type *buf;
2563 ion_phys_addr_t addr;
Ravishangar Kalyanam6b7005c2012-04-06 18:58:44 -07002564 size_t buffer_size;
Ravishangar Kalyanam6bc448a2012-03-14 11:31:52 -07002565 unsigned long len;
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002566
2567 if (mix_num == MDP4_MIXER0)
2568 buf = mfd->ov0_wb_buf;
2569 else
2570 buf = mfd->ov1_wb_buf;
2571
2572 if (buf->phys_addr || !IS_ERR_OR_NULL(buf->ihdl))
2573 return 0;
2574
2575 if (!buf->size) {
Ravishangar Kalyanam175d1282012-01-20 16:57:23 -08002576 pr_err("%s:%d In valid size\n", __func__, __LINE__);
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002577 return -EINVAL;
2578 }
2579
Ravishangar Kalyanam6b7005c2012-04-06 18:58:44 -07002580 buffer_size = roundup(mfd->panel_info.xres * \
2581 mfd->panel_info.yres * 3 * 2, SZ_4K);
2582
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002583 if (!IS_ERR_OR_NULL(mfd->iclient)) {
Ravishangar Kalyanama3b168b2012-03-26 11:13:11 -07002584 pr_info("%s:%d ion based allocation mfd->mem_hid 0x%x\n",
2585 __func__, __LINE__, mfd->mem_hid);
Ravishangar Kalyanam6b7005c2012-04-06 18:58:44 -07002586 buf->ihdl = ion_alloc(mfd->iclient, buffer_size, SZ_4K,
Ravishangar Kalyanama3b168b2012-03-26 11:13:11 -07002587 mfd->mem_hid);
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002588 if (!IS_ERR_OR_NULL(buf->ihdl)) {
Ravishangar Kalyanam6bc448a2012-03-14 11:31:52 -07002589 if (ion_map_iommu(mfd->iclient, buf->ihdl,
2590 DISPLAY_DOMAIN, GEN_POOL, SZ_4K, 0, &addr,
2591 &len, 0, 0)) {
2592 pr_err("ion_map_iommu() failed\n");
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002593 return -ENOMEM;
2594 }
2595 } else {
Ravishangar Kalyanam175d1282012-01-20 16:57:23 -08002596 pr_err("%s:%d: ion_alloc failed\n", __func__,
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002597 __LINE__);
2598 return -ENOMEM;
2599 }
2600 } else {
Ravishangar Kalyanam6b7005c2012-04-06 18:58:44 -07002601 addr = allocate_contiguous_memory_nomap(buffer_size,
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002602 mfd->mem_hid, 4);
2603 }
2604 if (addr) {
2605 pr_info("allocating %d bytes at %x for mdp writeback\n",
Ravishangar Kalyanam6b7005c2012-04-06 18:58:44 -07002606 buffer_size, (u32) addr);
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002607 buf->phys_addr = addr;
2608 return 0;
2609 } else {
2610 pr_err("%s cannot allocate memory for mdp writeback!\n",
2611 __func__);
2612 return -ENOMEM;
2613 }
2614}
2615
2616void mdp4_free_writeback_buf(struct msm_fb_data_type *mfd, u32 mix_num)
2617{
2618 struct mdp_buf_type *buf;
2619
2620 if (mix_num == MDP4_MIXER0)
2621 buf = mfd->ov0_wb_buf;
2622 else
2623 buf = mfd->ov1_wb_buf;
2624
2625 if (!IS_ERR_OR_NULL(mfd->iclient)) {
Ravishangar Kalyanam175d1282012-01-20 16:57:23 -08002626 if (!IS_ERR_OR_NULL(buf->ihdl)) {
Ravishangar Kalyanam6bc448a2012-03-14 11:31:52 -07002627 ion_unmap_iommu(mfd->iclient, buf->ihdl,
2628 DISPLAY_DOMAIN, GEN_POOL);
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002629 ion_free(mfd->iclient, buf->ihdl);
Jeff Ohlstein9cb0ead2011-12-16 13:30:08 -08002630 pr_debug("%s:%d free writeback imem\n", __func__,
Ravishangar Kalyanam175d1282012-01-20 16:57:23 -08002631 __LINE__);
2632 buf->ihdl = NULL;
2633 }
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002634 } else {
Ravishangar Kalyanam175d1282012-01-20 16:57:23 -08002635 if (buf->phys_addr) {
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002636 free_contiguous_memory_by_paddr(buf->phys_addr);
Jeff Ohlstein9cb0ead2011-12-16 13:30:08 -08002637 pr_debug("%s:%d free writeback pmem\n", __func__,
Ravishangar Kalyanam175d1282012-01-20 16:57:23 -08002638 __LINE__);
2639 }
Nagamalleswararao Ganji880f8472011-12-14 03:52:28 -08002640 }
2641 buf->phys_addr = 0;
2642}
Pravin Tamkhane85153bd2011-12-13 13:56:46 -08002643
2644static int mdp4_update_pcc_regs(uint32_t offset,
2645 struct mdp_pcc_cfg_data *cfg_ptr)
2646{
2647 int ret = -1;
2648
2649 if (offset && cfg_ptr) {
2650
2651 outpdw(offset, cfg_ptr->r.c);
2652 outpdw(offset + 0x30, cfg_ptr->g.c);
2653 outpdw(offset + 0x60, cfg_ptr->b.c);
2654 offset += 4;
2655
2656 outpdw(offset, cfg_ptr->r.r);
2657 outpdw(offset + 0x30, cfg_ptr->g.r);
2658 outpdw(offset + 0x60, cfg_ptr->b.r);
2659 offset += 4;
2660
2661 outpdw(offset, cfg_ptr->r.g);
2662 outpdw(offset + 0x30, cfg_ptr->g.g);
2663 outpdw(offset + 0x60, cfg_ptr->b.g);
2664 offset += 4;
2665
2666 outpdw(offset, cfg_ptr->r.b);
2667 outpdw(offset + 0x30, cfg_ptr->g.b);
2668 outpdw(offset + 0x60, cfg_ptr->b.b);
2669 offset += 4;
2670
2671 outpdw(offset, cfg_ptr->r.rr);
2672 outpdw(offset + 0x30, cfg_ptr->g.rr);
2673 outpdw(offset + 0x60, cfg_ptr->b.rr);
2674 offset += 4;
2675
2676 outpdw(offset, cfg_ptr->r.gg);
2677 outpdw(offset + 0x30, cfg_ptr->g.gg);
2678 outpdw(offset + 0x60, cfg_ptr->b.gg);
2679 offset += 4;
2680
2681 outpdw(offset, cfg_ptr->r.bb);
2682 outpdw(offset + 0x30, cfg_ptr->g.bb);
2683 outpdw(offset + 0x60, cfg_ptr->b.bb);
2684 offset += 4;
2685
2686 outpdw(offset, cfg_ptr->r.rg);
2687 outpdw(offset + 0x30, cfg_ptr->g.rg);
2688 outpdw(offset + 0x60, cfg_ptr->b.rg);
2689 offset += 4;
2690
2691 outpdw(offset, cfg_ptr->r.gb);
2692 outpdw(offset + 0x30, cfg_ptr->g.gb);
2693 outpdw(offset + 0x60, cfg_ptr->b.gb);
2694 offset += 4;
2695
2696 outpdw(offset, cfg_ptr->r.rb);
2697 outpdw(offset + 0x30, cfg_ptr->g.rb);
2698 outpdw(offset + 0x60, cfg_ptr->b.rb);
2699 offset += 4;
2700
2701 outpdw(offset, cfg_ptr->r.rgb_0);
2702 outpdw(offset + 0x30, cfg_ptr->g.rgb_0);
2703 outpdw(offset + 0x60, cfg_ptr->b.rgb_0);
2704 offset += 4;
2705
2706 outpdw(offset, cfg_ptr->r.rgb_1);
2707 outpdw(offset + 0x30, cfg_ptr->g.rgb_1);
2708 outpdw(offset + 0x60, cfg_ptr->b.rgb_1);
2709
2710 ret = 0;
2711 }
2712
2713 return ret;
2714}
2715
2716static int mdp4_read_pcc_regs(uint32_t offset,
2717 struct mdp_pcc_cfg_data *cfg_ptr)
2718{
2719 int ret = -1;
2720
2721 if (offset && cfg_ptr) {
2722 cfg_ptr->r.c = inpdw(offset);
2723 cfg_ptr->g.c = inpdw(offset + 0x30);
2724 cfg_ptr->b.c = inpdw(offset + 0x60);
2725 offset += 4;
2726
2727 cfg_ptr->r.r = inpdw(offset);
2728 cfg_ptr->g.r = inpdw(offset + 0x30);
2729 cfg_ptr->b.r = inpdw(offset + 0x60);
2730 offset += 4;
2731
2732 cfg_ptr->r.g = inpdw(offset);
2733 cfg_ptr->g.g = inpdw(offset + 0x30);
2734 cfg_ptr->b.g = inpdw(offset + 0x60);
2735 offset += 4;
2736
2737 cfg_ptr->r.b = inpdw(offset);
2738 cfg_ptr->g.b = inpdw(offset + 0x30);
2739 cfg_ptr->b.b = inpdw(offset + 0x60);
2740 offset += 4;
2741
2742 cfg_ptr->r.rr = inpdw(offset);
2743 cfg_ptr->g.rr = inpdw(offset + 0x30);
2744 cfg_ptr->b.rr = inpdw(offset + 0x60);
2745 offset += 4;
2746
2747 cfg_ptr->r.gg = inpdw(offset);
2748 cfg_ptr->g.gg = inpdw(offset + 0x30);
2749 cfg_ptr->b.gg = inpdw(offset + 0x60);
2750 offset += 4;
2751
2752 cfg_ptr->r.bb = inpdw(offset);
2753 cfg_ptr->g.bb = inpdw(offset + 0x30);
2754 cfg_ptr->b.bb = inpdw(offset + 0x60);
2755 offset += 4;
2756
2757 cfg_ptr->r.rg = inpdw(offset);
2758 cfg_ptr->g.rg = inpdw(offset + 0x30);
2759 cfg_ptr->b.rg = inpdw(offset + 0x60);
2760 offset += 4;
2761
2762 cfg_ptr->r.gb = inpdw(offset);
2763 cfg_ptr->g.gb = inpdw(offset + 0x30);
2764 cfg_ptr->b.gb = inpdw(offset + 0x60);
2765 offset += 4;
2766
2767 cfg_ptr->r.rb = inpdw(offset);
2768 cfg_ptr->g.rb = inpdw(offset + 0x30);
2769 cfg_ptr->b.rb = inpdw(offset + 0x60);
2770 offset += 4;
2771
2772 cfg_ptr->r.rgb_0 = inpdw(offset);
2773 cfg_ptr->g.rgb_0 = inpdw(offset + 0x30);
2774 cfg_ptr->b.rgb_0 = inpdw(offset + 0x60);
2775 offset += 4;
2776
2777 cfg_ptr->r.rgb_1 = inpdw(offset);
2778 cfg_ptr->g.rgb_1 = inpdw(offset + 0x30);
2779 cfg_ptr->b.rgb_1 = inpdw(offset + 0x60);
2780
2781 ret = 0;
2782 }
2783
2784 return ret;
2785}
2786
Pravin Tamkhane85153bd2011-12-13 13:56:46 -08002787
2788#define MDP_PCC_OFFSET 0xA000
Pravin Tamkhane22515242012-03-01 17:45:52 -08002789#define MDP_DMA_GC_OFFSET 0x8800
Pravin Tamkhaneb18c9e22012-04-13 18:29:34 -07002790#define MDP_LM_GC_OFFSET 0x4800
Pravin Tamkhane85153bd2011-12-13 13:56:46 -08002791
2792#define MDP_DMA_P_OP_MODE_OFFSET 0x70
2793#define MDP_DMA_S_OP_MODE_OFFSET 0x28
Pravin Tamkhaneb18c9e22012-04-13 18:29:34 -07002794#define MDP_LM_OP_MODE_OFFSET 0x14
Pravin Tamkhane85153bd2011-12-13 13:56:46 -08002795
2796#define DMA_PCC_R2_OFFSET 0x100
2797
Pravin Tamkhane22515242012-03-01 17:45:52 -08002798#define MDP_GC_COLOR_OFFSET 0x100
2799#define MDP_GC_PARMS_OFFSET 0x80
2800
2801#define MDP_AR_GC_MAX_STAGES 16
2802
2803static uint32_t mdp_pp_block2pcc(uint32_t block)
2804{
2805 uint32_t valid = 0;
2806
2807 switch (block) {
2808 case MDP_BLOCK_DMA_P:
2809 case MDP_BLOCK_DMA_S:
2810 valid = (mdp_rev >= MDP_REV_42) ? 1 : 0;
2811 break;
2812
2813 default:
2814 break;
2815 }
2816
2817 return valid;
2818}
2819
Pravin Tamkhane85153bd2011-12-13 13:56:46 -08002820int mdp4_pcc_cfg(struct mdp_pcc_cfg_data *cfg_ptr)
2821{
2822 int ret = -1;
2823 uint32_t pcc_offset = 0, mdp_cfg_offset = 0;
2824 uint32_t mdp_dma_op_mode = 0;
Pravin Tamkhane22515242012-03-01 17:45:52 -08002825 uint32_t blockbase;
2826
2827 if (!mdp_pp_block2pcc(cfg_ptr->block))
2828 return ret;
2829
2830 blockbase = mdp_block2base(cfg_ptr->block);
2831 if (!blockbase)
2832 return ret;
2833
2834 blockbase += (uint32_t) MDP_BASE;
Pravin Tamkhane85153bd2011-12-13 13:56:46 -08002835
2836 switch (cfg_ptr->block) {
2837 case MDP_BLOCK_DMA_P:
Pravin Tamkhane85153bd2011-12-13 13:56:46 -08002838 case MDP_BLOCK_DMA_S:
Pravin Tamkhane22515242012-03-01 17:45:52 -08002839 pcc_offset = blockbase + MDP_PCC_OFFSET;
2840 mdp_cfg_offset = blockbase;
2841 mdp_dma_op_mode = blockbase +
2842 (MDP_BLOCK_DMA_P == cfg_ptr->block ?
2843 MDP_DMA_P_OP_MODE_OFFSET
2844 : MDP_DMA_S_OP_MODE_OFFSET);
Pravin Tamkhane85153bd2011-12-13 13:56:46 -08002845 break;
2846
2847 default:
2848 break;
2849 }
2850
2851 if (0x8 & cfg_ptr->ops)
2852 pcc_offset += DMA_PCC_R2_OFFSET;
2853
2854 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
2855
2856 switch ((0x6 & cfg_ptr->ops)>>1) {
2857 case 0x1:
2858 ret = mdp4_read_pcc_regs(pcc_offset, cfg_ptr);
2859 break;
2860
2861 case 0x2:
2862 ret = mdp4_update_pcc_regs(pcc_offset, cfg_ptr);
2863 break;
2864
2865 default:
2866 break;
2867 }
2868
2869 if (0x8 & cfg_ptr->ops)
2870 outpdw(mdp_dma_op_mode,
Carl Vanderlip59e7b0e2012-04-06 15:51:44 -07002871 ((inpdw(mdp_dma_op_mode) & ~(0x1<<10)) |
2872 ((0x8 & cfg_ptr->ops)<<10)));
Pravin Tamkhane85153bd2011-12-13 13:56:46 -08002873
2874 outpdw(mdp_cfg_offset,
Carl Vanderlip59e7b0e2012-04-06 15:51:44 -07002875 ((inpdw(mdp_cfg_offset) & ~(0x1<<29)) |
2876 ((cfg_ptr->ops & 0x1)<<29)));
Pravin Tamkhane85153bd2011-12-13 13:56:46 -08002877
2878 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
2879
2880 return ret;
2881}
2882
Pravin Tamkhane22515242012-03-01 17:45:52 -08002883static uint32_t mdp_pp_block2argc(uint32_t block)
2884{
2885 uint32_t valid = 0;
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002886
Pravin Tamkhane22515242012-03-01 17:45:52 -08002887 switch (block) {
2888 case MDP_BLOCK_DMA_P:
2889 case MDP_BLOCK_DMA_S:
2890 case MDP_BLOCK_OVERLAY_0:
2891 case MDP_BLOCK_OVERLAY_1:
2892 valid = (mdp_rev >= MDP_REV_42) ? 1 : 0;
2893 break;
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002894
Pravin Tamkhaneb18c9e22012-04-13 18:29:34 -07002895 case MDP_BLOCK_OVERLAY_2:
2896 valid = (mdp_rev >= MDP_REV_44) ? 1 : 0;
2897 break;
2898
Pravin Tamkhane22515242012-03-01 17:45:52 -08002899 default:
2900 break;
2901 }
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002902
Pravin Tamkhane22515242012-03-01 17:45:52 -08002903 return valid;
2904}
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002905
2906static int update_ar_gc_lut(uint32_t *offset, struct mdp_pgc_lut_data *lut_data)
2907{
Pravin Tamkhane5c1fa462012-03-07 17:49:09 -08002908 int count = 0;
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002909
2910 uint32_t *c0_offset = offset;
2911 uint32_t *c0_params_offset = (uint32_t *)((uint32_t)c0_offset
2912 + MDP_GC_PARMS_OFFSET);
2913
2914 uint32_t *c1_offset = (uint32_t *)((uint32_t)offset
2915 + MDP_GC_COLOR_OFFSET);
2916
2917 uint32_t *c1_params_offset = (uint32_t *)((uint32_t)c1_offset
2918 + MDP_GC_PARMS_OFFSET);
2919
2920 uint32_t *c2_offset = (uint32_t *)((uint32_t)offset
2921 + 2*MDP_GC_COLOR_OFFSET);
2922
2923 uint32_t *c2_params_offset = (uint32_t *)((uint32_t)c2_offset
2924 +MDP_GC_PARMS_OFFSET);
2925
2926
Pravin Tamkhane5c1fa462012-03-07 17:49:09 -08002927 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002928 for (count = 0; count < MDP_AR_GC_MAX_STAGES; count++) {
2929 if (count < lut_data->num_r_stages) {
2930 outpdw(c0_offset+count,
2931 ((0xfff & lut_data->r_data[count].x_start)
2932 | 0x10000));
2933
2934 outpdw(c0_params_offset+count,
2935 ((0x7fff & lut_data->r_data[count].slope)
2936 | ((0xffff
2937 & lut_data->r_data[count].offset)
2938 << 16)));
2939 } else
2940 outpdw(c0_offset+count, 0);
2941
2942 if (count < lut_data->num_b_stages) {
2943 outpdw(c1_offset+count,
2944 ((0xfff & lut_data->b_data[count].x_start)
2945 | 0x10000));
2946
2947 outpdw(c1_params_offset+count,
2948 ((0x7fff & lut_data->b_data[count].slope)
2949 | ((0xffff
2950 & lut_data->b_data[count].offset)
2951 << 16)));
2952 } else
2953 outpdw(c1_offset+count, 0);
2954
2955 if (count < lut_data->num_g_stages) {
2956 outpdw(c2_offset+count,
2957 ((0xfff & lut_data->g_data[count].x_start)
2958 | 0x10000));
2959
2960 outpdw(c2_params_offset+count,
2961 ((0x7fff & lut_data->g_data[count].slope)
2962 | ((0xffff
2963 & lut_data->g_data[count].offset)
2964 << 16)));
2965 } else
2966 outpdw(c2_offset+count, 0);
2967 }
2968
Pravin Tamkhane5c1fa462012-03-07 17:49:09 -08002969 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002970
Pravin Tamkhane5c1fa462012-03-07 17:49:09 -08002971 return 0;
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002972}
2973
Pravin Tamkhane5c1fa462012-03-07 17:49:09 -08002974static int mdp4_argc_process_write_req(uint32_t *offset,
2975 struct mdp_pgc_lut_data *pgc_ptr)
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002976{
Pravin Tamkhane22515242012-03-01 17:45:52 -08002977 int ret = -1;
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002978 struct mdp_ar_gc_lut_data r[MDP_AR_GC_MAX_STAGES];
2979 struct mdp_ar_gc_lut_data g[MDP_AR_GC_MAX_STAGES];
2980 struct mdp_ar_gc_lut_data b[MDP_AR_GC_MAX_STAGES];
2981
2982 ret = copy_from_user(&r[0], pgc_ptr->r_data,
Pravin Tamkhane22515242012-03-01 17:45:52 -08002983 pgc_ptr->num_r_stages * sizeof(struct mdp_ar_gc_lut_data));
2984
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002985 if (!ret) {
2986 ret = copy_from_user(&g[0],
Pravin Tamkhane22515242012-03-01 17:45:52 -08002987 pgc_ptr->g_data,
2988 pgc_ptr->num_g_stages
2989 * sizeof(struct mdp_ar_gc_lut_data));
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002990 if (!ret)
2991 ret = copy_from_user(&b[0],
Pravin Tamkhane22515242012-03-01 17:45:52 -08002992 pgc_ptr->b_data,
2993 pgc_ptr->num_b_stages
2994 * sizeof(struct mdp_ar_gc_lut_data));
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08002995 }
2996
2997 if (ret)
2998 return ret;
2999
3000 pgc_ptr->r_data = &r[0];
3001 pgc_ptr->g_data = &g[0];
3002 pgc_ptr->b_data = &b[0];
3003
Pravin Tamkhane5c1fa462012-03-07 17:49:09 -08003004 ret = update_ar_gc_lut(offset, pgc_ptr);
3005 return ret;
3006}
3007
3008int mdp4_argc_cfg(struct mdp_pgc_lut_data *pgc_ptr)
3009{
3010 int ret = -1;
3011 uint32_t *offset = 0, *pgc_enable_offset = 0, lshift_bits = 0;
3012 uint32_t blockbase;
3013
3014 if (!mdp_pp_block2argc(pgc_ptr->block))
3015 return ret;
3016
3017 blockbase = mdp_block2base(pgc_ptr->block);
3018 if (!blockbase)
3019 return ret;
3020
Pravin Tamkhane22515242012-03-01 17:45:52 -08003021 blockbase += (uint32_t) MDP_BASE;
Pravin Tamkhane5c1fa462012-03-07 17:49:09 -08003022 ret = 0;
Pravin Tamkhane22515242012-03-01 17:45:52 -08003023
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08003024 switch (pgc_ptr->block) {
3025 case MDP_BLOCK_DMA_P:
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08003026 case MDP_BLOCK_DMA_S:
Pravin Tamkhane22515242012-03-01 17:45:52 -08003027 offset = (uint32_t *)(blockbase + MDP_DMA_GC_OFFSET);
3028 pgc_enable_offset = (uint32_t *) blockbase;
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08003029 lshift_bits = 28;
3030 break;
3031
3032 case MDP_BLOCK_OVERLAY_0:
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08003033 case MDP_BLOCK_OVERLAY_1:
Pravin Tamkhaneb18c9e22012-04-13 18:29:34 -07003034 case MDP_BLOCK_OVERLAY_2:
3035 offset = (uint32_t *)(blockbase + MDP_LM_GC_OFFSET);
Pravin Tamkhane22515242012-03-01 17:45:52 -08003036 pgc_enable_offset = (uint32_t *)(blockbase
3037 + MDP_LM_OP_MODE_OFFSET);
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08003038 lshift_bits = 2;
3039 break;
3040
3041 default:
3042 ret = -1;
3043 break;
3044 }
3045
3046 if (!ret) {
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08003047
Pravin Tamkhane5c1fa462012-03-07 17:49:09 -08003048 switch ((0x6 & pgc_ptr->flags)>>1) {
3049 case 0x1:
3050 ret = -ENOTTY;
3051 break;
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08003052
Pravin Tamkhane5c1fa462012-03-07 17:49:09 -08003053 case 0x2:
3054 ret = mdp4_argc_process_write_req(offset, pgc_ptr);
3055 break;
3056
3057 default:
3058 break;
3059 }
3060
3061 if (!ret) {
3062 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
Carl Vanderlip59e7b0e2012-04-06 15:51:44 -07003063 outpdw(pgc_enable_offset, (inpdw(pgc_enable_offset) &
3064 ~(0x1<<lshift_bits)) |
3065 ((0x1 & pgc_ptr->flags) << lshift_bits));
Pravin Tamkhane5c1fa462012-03-07 17:49:09 -08003066 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF,
3067 FALSE);
3068 }
Pravin Tamkhanec7a7cc62011-12-15 16:25:45 -08003069 }
3070
3071 return ret;
3072}
3073
Carl Vanderlipacde4b62011-12-16 15:50:56 -08003074static uint32_t mdp4_pp_block2igc(uint32_t block)
3075{
3076 uint32_t valid = 0;
3077 switch (block) {
3078 case MDP_BLOCK_VG_1:
3079 valid = 0x1;
3080 break;
3081 case MDP_BLOCK_VG_2:
3082 valid = 0x1;
3083 break;
3084 case MDP_BLOCK_RGB_1:
3085 valid = 0x1;
3086 break;
3087 case MDP_BLOCK_RGB_2:
3088 valid = 0x1;
3089 break;
3090 case MDP_BLOCK_DMA_P:
3091 valid = (mdp_rev >= MDP_REV_40) ? 1 : 0;
3092 break;
3093 case MDP_BLOCK_DMA_S:
3094 valid = (mdp_rev >= MDP_REV_40) ? 1 : 0;
3095 break;
3096 default:
3097 break;
3098 }
3099 return valid;
3100}
3101
3102static int mdp4_igc_lut_write(struct mdp_igc_lut_data *cfg, uint32_t en_off,
3103 uint32_t lut_off)
3104{
3105 int i;
3106 uint32_t base, *off_low, *off_high;
3107 uint32_t low[cfg->len];
3108 uint32_t high[cfg->len];
3109
3110 base = mdp_block2base(cfg->block);
3111
3112 if (cfg->len != 256)
3113 return -EINVAL;
3114
3115 off_low = (uint32_t *)(MDP_BASE + base + lut_off);
3116 off_high = (uint32_t *)(MDP_BASE + base + lut_off + 0x800);
3117 if (copy_from_user(&low, cfg->c0_c1_data, cfg->len * sizeof(uint32_t)))
3118 return -EFAULT;
3119 if (copy_from_user(&high, cfg->c2_data, cfg->len * sizeof(uint32_t)))
3120 return -EFAULT;
3121
3122 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
3123 for (i = 0; i < cfg->len; i++) {
3124 MDP_OUTP(off_low++, low[i]);
3125 /*low address write should occur before high address write*/
3126 wmb();
3127 MDP_OUTP(off_high++, high[i]);
3128 }
3129 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
3130 return 0;
3131}
3132
3133static int mdp4_igc_lut_ctrl(struct mdp_igc_lut_data *cfg)
3134{
3135 uint32_t mask, out;
3136 uint32_t base = mdp_block2base(cfg->block);
3137 int8_t shift = 0;
3138
3139 switch (cfg->block) {
3140 case MDP_BLOCK_DMA_P:
3141 case MDP_BLOCK_DMA_S:
3142 base = base;
3143 shift = 30;
3144 break;
3145 case MDP_BLOCK_VG_1:
3146 case MDP_BLOCK_VG_2:
3147 case MDP_BLOCK_RGB_1:
3148 case MDP_BLOCK_RGB_2:
3149 base += 0x58;
3150 shift = 16;
3151 break;
3152 default:
3153 return -EINVAL;
3154
3155 }
3156 out = 1<<shift;
3157 mask = ~out;
3158 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
3159 out = inpdw(MDP_BASE + base) & mask;
3160 MDP_OUTP(MDP_BASE + base, out | ((cfg->ops & 0x1)<<shift));
3161 mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
3162
3163 return 0;
3164}
3165
3166static int mdp4_igc_lut_write_cfg(struct mdp_igc_lut_data *cfg)
3167{
3168 int ret = 0;
3169
3170 switch (cfg->block) {
3171 case MDP_BLOCK_DMA_P:
3172 case MDP_BLOCK_DMA_S:
3173 ret = mdp4_igc_lut_write(cfg, 0x00, 0x9000);
3174 break;
3175 case MDP_BLOCK_VG_1:
3176 case MDP_BLOCK_VG_2:
3177 case MDP_BLOCK_RGB_1:
3178 case MDP_BLOCK_RGB_2:
3179 ret = mdp4_igc_lut_write(cfg, 0x58, 0x5000);
3180 break;
3181 default:
3182 ret = -EINVAL;
3183 }
3184
3185 return ret;
3186}
3187
3188int mdp4_igc_lut_config(struct mdp_igc_lut_data *cfg)
3189{
3190 int ret = 0;
3191
3192 if (!mdp4_pp_block2igc(cfg->block)) {
3193 ret = -ENOTTY;
3194 goto error;
3195 }
3196
3197 switch ((cfg->ops & 0x6) >> 1) {
3198 case 0x1:
3199 pr_info("%s: IGC LUT read not supported\n", __func__);
3200 break;
3201 case 0x2:
3202 ret = mdp4_igc_lut_write_cfg(cfg);
3203 if (ret)
3204 goto error;
3205 break;
3206 default:
3207 break;
3208 }
3209
3210 ret = mdp4_igc_lut_ctrl(cfg);
3211
3212error:
3213 return ret;
3214}
Carl Vanderlipe01bb5a2012-04-24 15:14:26 -07003215
3216#define QSEED_TABLE_1_COUNT 2
3217#define QSEED_TABLE_2_COUNT 1024
3218
3219static uint32_t mdp4_pp_block2qseed(uint32_t block)
3220{
3221 uint32_t valid = 0;
3222 switch (block) {
3223 case MDP_BLOCK_VG_1:
3224 case MDP_BLOCK_VG_2:
3225 valid = 0x1;
3226 break;
3227 default:
3228 break;
3229 }
3230 return valid;
3231}
3232
3233static int mdp4_qseed_write_cfg(struct mdp_qseed_cfg_data *cfg)
3234{
3235 int i, ret = 0;
3236 uint32_t base = (uint32_t) (MDP_BASE + mdp_block2base(cfg->block));
3237 uint32_t *values;
3238
3239 if ((cfg->table_num != 1) && (cfg->table_num != 2)) {
3240 ret = -ENOTTY;
3241 goto error;
3242 }
3243
3244 if (((cfg->table_num == 1) && (cfg->len != QSEED_TABLE_1_COUNT)) ||
3245 ((cfg->table_num == 2) && (cfg->len != QSEED_TABLE_2_COUNT))) {
3246 ret = -EINVAL;
3247 goto error;
3248 }
3249
3250 values = kmalloc(cfg->len * sizeof(uint32_t), GFP_KERNEL);
3251 if (!values) {
3252 ret = -ENOMEM;
3253 goto error;
3254 }
3255
3256 ret = copy_from_user(values, cfg->data, sizeof(uint32_t) * cfg->len);
3257
3258 base += (cfg->table_num == 1) ? MDP4_QSEED_TABLE1_OFF :
3259 MDP4_QSEED_TABLE2_OFF;
3260 for (i = 0; i < cfg->len; i++) {
3261 MDP_OUTP(base , values[i]);
3262 base += sizeof(uint32_t);
3263 }
3264
3265 kfree(values);
3266error:
3267 return ret;
3268}
3269
3270int mdp4_qseed_cfg(struct mdp_qseed_cfg_data *cfg)
3271{
3272 int ret = 0;
3273
3274 if (!mdp4_pp_block2qseed(cfg->block)) {
3275 ret = -ENOTTY;
3276 goto error;
3277 }
3278
3279 if (cfg->table_num != 1) {
3280 ret = -ENOTTY;
3281 pr_info("%s: Only QSEED table1 supported.\n", __func__);
3282 goto error;
3283 }
3284
3285 switch ((cfg->ops & 0x6) >> 1) {
3286 case 0x1:
3287 pr_info("%s: QSEED read not supported\n", __func__);
3288 ret = -ENOTTY;
3289 break;
3290 case 0x2:
3291 ret = mdp4_qseed_write_cfg(cfg);
3292 if (ret)
3293 goto error;
3294 break;
3295 default:
3296 break;
3297 }
3298
3299error:
3300 return ret;
3301}