Added linux-fbdev-devel@xxxxxxxxxxxxxxxxxxxxx On Tue, May 26, 2009 at 21:07, <wuzhangjin@xxxxxxxxx> wrote:> From: Wu Zhangjin <wuzj@xxxxxxxxxx>>> yeeloong(2f) laptop has a SMI video card, need this driver.>> this source code is originally from> http://dev.lemote.com/code/linux_loongson>> tons of warnings have been fixed, the main warning is:>> warning: left shift count >= width of type>> have been fixed via the following modification:>> drivers/video/smi/smtc2d.h:>> #define _F_MASK(f) ((((1 << _F_SIZE(f)) - 1) << _F_START(f))> #define _F_MASK(f) (((1ULL << _F_SIZE(f)) - 1) << _F_START(f))>> besides, the coding style is changed to follow the kernel style, and two> non-used header files are removed: sm501hw.h, sm7xxhw.h.>> Signed-off-by: Wu Zhangjin <wuzhangjin@xxxxxxxxx>> ---> drivers/video/Kconfig | 23 +> drivers/video/Makefile | 1 +> drivers/video/smi/Makefile | 8 +> drivers/video/smi/smtc2d.c | 979 +++++++++++++++++++++++++++++++++++++> drivers/video/smi/smtc2d.h | 530 ++++++++++++++++++++> drivers/video/smi/smtcfb.c | 1141 ++++++++++++++++++++++++++++++++++++++++++++> drivers/video/smi/smtcfb.h | 793 ++++++++++++++++++++++++++++++> 7 files changed, 3475 insertions(+), 0 deletions(-)> create mode 100644 drivers/video/smi/Makefile> create mode 100644 drivers/video/smi/smtc2d.c> create mode 100644 drivers/video/smi/smtc2d.h> create mode 100644 drivers/video/smi/smtcfb.c> create mode 100644 drivers/video/smi/smtcfb.h>> diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig> index 0048f11..b6ba27f 100644> --- a/drivers/video/Kconfig> +++ b/drivers/video/Kconfig> @@ -1930,6 +1930,29 @@ config FB_S3C2410_DEBUG> Turn on debugging messages. Note that you can set/unset at run time> through sysfs>> +config FB_SILICONMOTION> + bool "Silicon Motion Display Support"> + depends on FB> + help> + Frame Buffer driver for the Silicon Motion serial graphic card.> +> +config FB_SM7XX> + bool "Silicon Motion SM7XX Frame Buffer Support"> + depends on FB_SILICONMOTION> + depends on FB> + select FB_CFB_FILLRECT> + select FB_CFB_COPYAREA> + select FB_CFB_IMAGEBLIT> + help> + Frame Buffer driver for the Silicon Motion SM7XX serial graphic card.> +> +config FB_SM7XX_ACCEL> + bool "Siliconmotion Acceleration functions (EXPERIMENTAL)"> + depends on FB_SM7XX && EXPERIMENTAL> + help> + This will compile the Trident frame buffer device with> + acceleration functions.> +> config FB_SM501> tristate "Silicon Motion SM501 framebuffer support"> depends on FB && MFD_SM501> diff --git a/drivers/video/Makefile b/drivers/video/Makefile> index d8d0be5..caf6d8c 100644> --- a/drivers/video/Makefile> +++ b/drivers/video/Makefile> @@ -70,6 +70,7 @@ obj-$(CONFIG_FB_P9100) += p9100.o sbuslib.o> obj-$(CONFIG_FB_TCX) += tcx.o sbuslib.o> obj-$(CONFIG_FB_LEO) += leo.o sbuslib.o> obj-$(CONFIG_FB_SGIVW) += sgivwfb.o> +obj-$(CONFIG_FB_SILICONMOTION) += smi/> obj-$(CONFIG_FB_ACORN) += acornfb.o> obj-$(CONFIG_FB_ATARI) += atafb.o c2p_iplan2.o atafb_mfb.o \> atafb_iplan2p2.o atafb_iplan2p4.o atafb_iplan2p8.o> diff --git a/drivers/video/smi/Makefile b/drivers/video/smi/Makefile> new file mode 100644> index 0000000..0058148> --- /dev/null> +++ b/drivers/video/smi/Makefile> @@ -0,0 +1,8 @@> +obj-y += smi.o> +> +smi-y := $(DRIVER_OBJS)> +> +smi-y += smtcfb.o> +> +EXTRA_CFLAGS += -Werror> +> diff --git a/drivers/video/smi/smtc2d.c b/drivers/video/smi/smtc2d.c> new file mode 100644> index 0000000..2a9c3bd> --- /dev/null> +++ b/drivers/video/smi/smtc2d.c> @@ -0,0 +1,979 @@> +/*> + * smtc2d.c -- Silicon Motion SM501 and SM7xx 2D drawing engine functions.> + *> + * Copyright (C) 2006 Silicon Motion Technology Corp.> + * Author: Boyod boyod.yang@xxxxxxxxxxxxxxxxxxxx> + *> + * Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology> + * Author: Wu Zhangjin, wuzj@xxxxxxxxxx> + *> + * This file is subject to the terms and conditions of the GNU General Public> + * License. See the file COPYING in the main directory of this archive for> + * more details.> + *> + * Version 0.10.26192.21.01> + * - Add PowerPC support> + * - Add 2D support for Lynx -> + * Verified on 2.6.19.2> + * Boyod.yang <boyod.yang@xxxxxxxxxxxxxxxxxxxx>> + */> +> +unsigned char smtc_de_busy;> +> +void SMTC_write2Dreg(unsigned long nOffset, unsigned long nData)> +{> + writel(nData, smtc_2DBaseAddress + nOffset);> +}> +> +unsigned long SMTC_read2Dreg(unsigned long nOffset)> +{> + return readl(smtc_2DBaseAddress + nOffset);> +}> +> +void SMTC_write2Ddataport(unsigned long nOffset, unsigned long nData)> +{> + writel(nData, smtc_2Ddataport + nOffset);> +}> +> +/**********************************************************************> + *> + * deInit> + *> + * Purpose> + * Drawing engine initialization.> + *> + **********************************************************************/> +> +void deInit(unsigned int nModeWidth, unsigned int nModeHeight,> + unsigned int bpp)> +{> + /* Get current power configuration. */> + unsigned char clock;> + clock = smtc_seqr(0x21);> +> + /* initialize global 'mutex lock' variable */> + smtc_de_busy = 0;> +> + /* Enable 2D Drawing Engine */> + smtc_seqw(0x21, clock & 0xF8);> +> + SMTC_write2Dreg(DE_CLIP_TL,> + FIELD_VALUE(0, DE_CLIP_TL, TOP, 0) |> + FIELD_SET(0, DE_CLIP_TL, STATUS, DISABLE) |> + FIELD_SET(0, DE_CLIP_TL, INHIBIT, OUTSIDE) |> + FIELD_VALUE(0, DE_CLIP_TL, LEFT, 0));> +> + if (bpp >= 24) {> + SMTC_write2Dreg(DE_PITCH,> + FIELD_VALUE(0, DE_PITCH, DESTINATION,> + nModeWidth * 3) | FIELD_VALUE(0,> + DE_PITCH,> + SOURCE,> + nModeWidth> + * 3));> + } else {> + SMTC_write2Dreg(DE_PITCH,> + FIELD_VALUE(0, DE_PITCH, DESTINATION,> + nModeWidth) | FIELD_VALUE(0,> + DE_PITCH,> + SOURCE,> + nModeWidth));> + }> +> + SMTC_write2Dreg(DE_WINDOW_WIDTH,> + FIELD_VALUE(0, DE_WINDOW_WIDTH, DESTINATION,> + nModeWidth) | FIELD_VALUE(0,> + DE_WINDOW_WIDTH,> + SOURCE,> + nModeWidth));> +> + switch (bpp) {> + case 8:> + SMTC_write2Dreg(DE_STRETCH_FORMAT,> + FIELD_SET(0, DE_STRETCH_FORMAT, PATTERN_XY,> + NORMAL) | FIELD_VALUE(0,> + DE_STRETCH_FORMAT,> + PATTERN_Y,> + 0) |> + FIELD_VALUE(0, DE_STRETCH_FORMAT, PATTERN_X,> + 0) | FIELD_SET(0, DE_STRETCH_FORMAT,> + PIXEL_FORMAT,> + 8) | FIELD_SET(0,> + DE_STRETCH_FORMAT,> + ADDRESSING,> + XY) |> + FIELD_VALUE(0, DE_STRETCH_FORMAT,> + SOURCE_HEIGHT, 3));> + break;> + case 24:> + SMTC_write2Dreg(DE_STRETCH_FORMAT,> + FIELD_SET(0, DE_STRETCH_FORMAT, PATTERN_XY,> + NORMAL) | FIELD_VALUE(0,> + DE_STRETCH_FORMAT,> + PATTERN_Y,> + 0) |> + FIELD_VALUE(0, DE_STRETCH_FORMAT, PATTERN_X,> + 0) | FIELD_SET(0, DE_STRETCH_FORMAT,> + PIXEL_FORMAT,> + 24) | FIELD_SET(0,> + DE_STRETCH_FORMAT,> + ADDRESSING,> + XY) |> + FIELD_VALUE(0, DE_STRETCH_FORMAT,> + SOURCE_HEIGHT, 3));> + break;> + case 16:> + default:> + SMTC_write2Dreg(DE_STRETCH_FORMAT,> + FIELD_SET(0, DE_STRETCH_FORMAT, PATTERN_XY,> + NORMAL) | FIELD_VALUE(0,> + DE_STRETCH_FORMAT,> + PATTERN_Y,> + 0) |> + FIELD_VALUE(0, DE_STRETCH_FORMAT, PATTERN_X,> + 0) | FIELD_SET(0, DE_STRETCH_FORMAT,> + PIXEL_FORMAT,> + 16) | FIELD_SET(0,> + DE_STRETCH_FORMAT,> + ADDRESSING,> + XY) |> + FIELD_VALUE(0, DE_STRETCH_FORMAT,> + SOURCE_HEIGHT, 3));> + break;> + }> +> + SMTC_write2Dreg(DE_MASKS,> + FIELD_VALUE(0, DE_MASKS, BYTE_MASK, 0xFFFF) |> + FIELD_VALUE(0, DE_MASKS, BIT_MASK, 0xFFFF));> + SMTC_write2Dreg(DE_COLOR_COMPARE_MASK,> + FIELD_VALUE(0, DE_COLOR_COMPARE_MASK, MASKS, \> + 0xFFFFFF));> + SMTC_write2Dreg(DE_COLOR_COMPARE,> + FIELD_VALUE(0, DE_COLOR_COMPARE, COLOR, 0xFFFFFF));> +}> +> +void deVerticalLine(unsigned long dst_base,> + unsigned long dst_pitch,> + unsigned long nX,> + unsigned long nY,> + unsigned long dst_height, unsigned long nColor)> +{> + deWaitForNotBusy();> +> + SMTC_write2Dreg(DE_WINDOW_DESTINATION_BASE,> + FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, ADDRESS,> + dst_base));> +> + SMTC_write2Dreg(DE_PITCH,> + FIELD_VALUE(0, DE_PITCH, DESTINATION, dst_pitch) |> + FIELD_VALUE(0, DE_PITCH, SOURCE, dst_pitch));> +> + SMTC_write2Dreg(DE_WINDOW_WIDTH,> + FIELD_VALUE(0, DE_WINDOW_WIDTH, DESTINATION,> + dst_pitch) | FIELD_VALUE(0, DE_WINDOW_WIDTH,> + SOURCE,> + dst_pitch));> +> + SMTC_write2Dreg(DE_FOREGROUND,> + FIELD_VALUE(0, DE_FOREGROUND, COLOR, nColor));> +> + SMTC_write2Dreg(DE_DESTINATION,> + FIELD_SET(0, DE_DESTINATION, WRAP, DISABLE) |> + FIELD_VALUE(0, DE_DESTINATION, X, nX) |> + FIELD_VALUE(0, DE_DESTINATION, Y, nY));> +> + SMTC_write2Dreg(DE_DIMENSION,> + FIELD_VALUE(0, DE_DIMENSION, X, 1) |> + FIELD_VALUE(0, DE_DIMENSION, Y_ET, dst_height));> +> + SMTC_write2Dreg(DE_CONTROL,> + FIELD_SET(0, DE_CONTROL, STATUS, START) |> + FIELD_SET(0, DE_CONTROL, DIRECTION, LEFT_TO_RIGHT) |> + FIELD_SET(0, DE_CONTROL, MAJOR, Y) |> + FIELD_SET(0, DE_CONTROL, STEP_X, NEGATIVE) |> + FIELD_SET(0, DE_CONTROL, STEP_Y, POSITIVE) |> + FIELD_SET(0, DE_CONTROL, LAST_PIXEL, OFF) |> + FIELD_SET(0, DE_CONTROL, COMMAND, SHORT_STROKE) |> + FIELD_SET(0, DE_CONTROL, ROP_SELECT, ROP2) |> + FIELD_VALUE(0, DE_CONTROL, ROP, 0x0C));> +> + smtc_de_busy = 1;> +}> +> +void deHorizontalLine(unsigned long dst_base,> + unsigned long dst_pitch,> + unsigned long nX,> + unsigned long nY,> + unsigned long dst_width, unsigned long nColor)> +{> + deWaitForNotBusy();> +> + SMTC_write2Dreg(DE_WINDOW_DESTINATION_BASE,> + FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, ADDRESS,> + dst_base));> +> + SMTC_write2Dreg(DE_PITCH,> + FIELD_VALUE(0, DE_PITCH, DESTINATION, dst_pitch) |> + FIELD_VALUE(0, DE_PITCH, SOURCE, dst_pitch));> +> + SMTC_write2Dreg(DE_WINDOW_WIDTH,> + FIELD_VALUE(0, DE_WINDOW_WIDTH, DESTINATION,> + dst_pitch) | FIELD_VALUE(0, DE_WINDOW_WIDTH,> + SOURCE,> + dst_pitch));> + SMTC_write2Dreg(DE_FOREGROUND,> + FIELD_VALUE(0, DE_FOREGROUND, COLOR, nColor));> + SMTC_write2Dreg(DE_DESTINATION,> + FIELD_SET(0, DE_DESTINATION, WRAP,> + DISABLE) | FIELD_VALUE(0, DE_DESTINATION, X,> + nX) | FIELD_VALUE(0,> + DE_DESTINATION,> + Y,> + nY));> + SMTC_write2Dreg(DE_DIMENSION,> + FIELD_VALUE(0, DE_DIMENSION, X,> + dst_width) | FIELD_VALUE(0, DE_DIMENSION,> + Y_ET, 1));> + SMTC_write2Dreg(DE_CONTROL,> + FIELD_SET(0, DE_CONTROL, STATUS, START) | FIELD_SET(0,> + DE_CONTROL,> + DIRECTION,> + RIGHT_TO_LEFT)> + | FIELD_SET(0, DE_CONTROL, MAJOR, X) | FIELD_SET(0,> + DE_CONTROL,> + STEP_X,> + POSITIVE)> + | FIELD_SET(0, DE_CONTROL, STEP_Y,> + NEGATIVE) | FIELD_SET(0, DE_CONTROL,> + LAST_PIXEL,> + OFF) | FIELD_SET(0,> + DE_CONTROL,> + COMMAND,> + SHORT_STROKE)> + | FIELD_SET(0, DE_CONTROL, ROP_SELECT,> + ROP2) | FIELD_VALUE(0, DE_CONTROL, ROP,> + 0x0C));> +> + smtc_de_busy = 1;> +}> +> +void deLine(unsigned long dst_base,> + unsigned long dst_pitch,> + unsigned long nX1,> + unsigned long nY1,> + unsigned long nX2, unsigned long nY2, unsigned long nColor)> +{> + unsigned long nCommand => + FIELD_SET(0, DE_CONTROL, STATUS, START) |> + FIELD_SET(0, DE_CONTROL, DIRECTION, LEFT_TO_RIGHT) |> + FIELD_SET(0, DE_CONTROL, MAJOR, X) |> + FIELD_SET(0, DE_CONTROL, STEP_X, POSITIVE) |> + FIELD_SET(0, DE_CONTROL, STEP_Y, POSITIVE) |> + FIELD_SET(0, DE_CONTROL, LAST_PIXEL, OFF) |> + FIELD_SET(0, DE_CONTROL, ROP_SELECT, ROP2) |> + FIELD_VALUE(0, DE_CONTROL, ROP, 0x0C);> + unsigned long DeltaX;> + unsigned long DeltaY;> +> + /* Calculate delta X */> + if (nX1 <= nX2)> + DeltaX = nX2 - nX1;> + else {> + DeltaX = nX1 - nX2;> + nCommand = FIELD_SET(nCommand, DE_CONTROL, STEP_X, NEGATIVE);> + }> +> + /* Calculate delta Y */> + if (nY1 <= nY2)> + DeltaY = nY2 - nY1;> + else {> + DeltaY = nY1 - nY2;> + nCommand = FIELD_SET(nCommand, DE_CONTROL, STEP_Y, NEGATIVE);> + }> +> + /* Determine the major axis */> + if (DeltaX < DeltaY)> + nCommand = FIELD_SET(nCommand, DE_CONTROL, MAJOR, Y);> +> + /* Vertical line? */> + if (nX1 == nX2)> + deVerticalLine(dst_base, dst_pitch, nX1, nY1, DeltaY, nColor);> +> + /* Horizontal line? */> + else if (nY1 == nY2)> + deHorizontalLine(dst_base, dst_pitch, nX1, nY1, \> + DeltaX, nColor);> +> + /* Diagonal line? */> + else if (DeltaX == DeltaY) {> + deWaitForNotBusy();> +> + SMTC_write2Dreg(DE_WINDOW_DESTINATION_BASE,> + FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE,> + ADDRESS, dst_base));> +> + SMTC_write2Dreg(DE_PITCH,> + FIELD_VALUE(0, DE_PITCH, DESTINATION,> + dst_pitch) | FIELD_VALUE(0,> + DE_PITCH,> + SOURCE,> + dst_pitch));> +> + SMTC_write2Dreg(DE_WINDOW_WIDTH,> + FIELD_VALUE(0, DE_WINDOW_WIDTH, DESTINATION,> + dst_pitch) | FIELD_VALUE(0,> + DE_WINDOW_WIDTH,> + SOURCE,> + dst_pitch));> +> + SMTC_write2Dreg(DE_FOREGROUND,> + FIELD_VALUE(0, DE_FOREGROUND, COLOR, nColor));> +> + SMTC_write2Dreg(DE_DESTINATION,> + FIELD_SET(0, DE_DESTINATION, WRAP, DISABLE) |> + FIELD_VALUE(0, DE_DESTINATION, X, 1) |> + FIELD_VALUE(0, DE_DESTINATION, Y, nY1));> +> + SMTC_write2Dreg(DE_DIMENSION,> + FIELD_VALUE(0, DE_DIMENSION, X, 1) |> + FIELD_VALUE(0, DE_DIMENSION, Y_ET, DeltaX));> +> + SMTC_write2Dreg(DE_CONTROL,> + FIELD_SET(nCommand, DE_CONTROL, COMMAND,> + SHORT_STROKE));> + }> +> + /* Generic line */> + else {> + unsigned int k1, k2, et, w;> + if (DeltaX < DeltaY) {> + k1 = 2 * DeltaX;> + et = k1 - DeltaY;> + k2 = et - DeltaY;> + w = DeltaY + 1;> + } else {> + k1 = 2 * DeltaY;> + et = k1 - DeltaX;> + k2 = et - DeltaX;> + w = DeltaX + 1;> + }> +> + deWaitForNotBusy();> +> + SMTC_write2Dreg(DE_WINDOW_DESTINATION_BASE,> + FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE,> + ADDRESS, dst_base));> +> + SMTC_write2Dreg(DE_PITCH,> + FIELD_VALUE(0, DE_PITCH, DESTINATION,> + dst_pitch) | FIELD_VALUE(0,> + DE_PITCH,> + SOURCE,> + dst_pitch));> +> + SMTC_write2Dreg(DE_WINDOW_WIDTH,> + FIELD_VALUE(0, DE_WINDOW_WIDTH, DESTINATION,> + dst_pitch) | FIELD_VALUE(0,> + DE_WINDOW_WIDTH,> + SOURCE,> + dst_pitch));> +> + SMTC_write2Dreg(DE_FOREGROUND,> + FIELD_VALUE(0, DE_FOREGROUND, COLOR, nColor));> +> + SMTC_write2Dreg(DE_SOURCE,> + FIELD_SET(0, DE_SOURCE, WRAP, DISABLE) |> + FIELD_VALUE(0, DE_SOURCE, X_K1, k1) |> + FIELD_VALUE(0, DE_SOURCE, Y_K2, k2));> +> + SMTC_write2Dreg(DE_DESTINATION,> + FIELD_SET(0, DE_DESTINATION, WRAP, DISABLE) |> + FIELD_VALUE(0, DE_DESTINATION, X, nX1) |> + FIELD_VALUE(0, DE_DESTINATION, Y, nY1));> +> + SMTC_write2Dreg(DE_DIMENSION,> + FIELD_VALUE(0, DE_DIMENSION, X, w) |> + FIELD_VALUE(0, DE_DIMENSION, Y_ET, et));> +> + SMTC_write2Dreg(DE_CONTROL,> + FIELD_SET(nCommand, DE_CONTROL, COMMAND,> + LINE_DRAW));> + }> +> + smtc_de_busy = 1;> +}> +> +void deFillRect(unsigned long dst_base,> + unsigned long dst_pitch,> + unsigned long dst_X,> + unsigned long dst_Y,> + unsigned long dst_width,> + unsigned long dst_height, unsigned long nColor)> +{> + deWaitForNotBusy();> +> + SMTC_write2Dreg(DE_WINDOW_DESTINATION_BASE,> + FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, ADDRESS,> + dst_base));> +> + if (dst_pitch) {> + SMTC_write2Dreg(DE_PITCH,> + FIELD_VALUE(0, DE_PITCH, DESTINATION,> + dst_pitch) | FIELD_VALUE(0,> + DE_PITCH,> + SOURCE,> + dst_pitch));> +> + SMTC_write2Dreg(DE_WINDOW_WIDTH,> + FIELD_VALUE(0, DE_WINDOW_WIDTH, DESTINATION,> + dst_pitch) | FIELD_VALUE(0,> + DE_WINDOW_WIDTH,> + SOURCE,> + dst_pitch));> + }> +> + SMTC_write2Dreg(DE_FOREGROUND,> + FIELD_VALUE(0, DE_FOREGROUND, COLOR, nColor));> +> + SMTC_write2Dreg(DE_DESTINATION,> + FIELD_SET(0, DE_DESTINATION, WRAP, DISABLE) |> + FIELD_VALUE(0, DE_DESTINATION, X, dst_X) |> + FIELD_VALUE(0, DE_DESTINATION, Y, dst_Y));> +> + SMTC_write2Dreg(DE_DIMENSION,> + FIELD_VALUE(0, DE_DIMENSION, X, dst_width) |> + FIELD_VALUE(0, DE_DIMENSION, Y_ET, dst_height));> +> + SMTC_write2Dreg(DE_CONTROL,> + FIELD_SET(0, DE_CONTROL, STATUS, START) |> + FIELD_SET(0, DE_CONTROL, DIRECTION, LEFT_TO_RIGHT) |> + FIELD_SET(0, DE_CONTROL, LAST_PIXEL, OFF) |> + FIELD_SET(0, DE_CONTROL, COMMAND, RECTANGLE_FILL) |> + FIELD_SET(0, DE_CONTROL, ROP_SELECT, ROP2) |> + FIELD_VALUE(0, DE_CONTROL, ROP, 0x0C));> +> + smtc_de_busy = 1;> +}> +> +/**********************************************************************> + *> + * deRotatePattern> + *> + * Purpose> + * Rotate the given pattern if necessary> + *> + * Parameters> + * [in]> + * pPattern - Pointer to DE_SURFACE structure containing> + * pattern attributes> + * patternX - X position (0-7) of pattern origin> + * patternY - Y position (0-7) of pattern origin> + *> + * [out]> + * pattern_dstaddr - Pointer to pre-allocated buffer containing> + * rotated pattern> + *> + **********************************************************************/> +void deRotatePattern(unsigned char *pattern_dstaddr,> + unsigned long pattern_src_addr,> + unsigned long pattern_BPP,> + unsigned long pattern_stride, int patternX, int patternY)> +{> + unsigned int i;> + unsigned long pattern[PATTERN_WIDTH * PATTERN_HEIGHT];> + unsigned int x, y;> + unsigned char *pjPatByte;> +> + if (pattern_dstaddr != NULL) {> + deWaitForNotBusy();> +> + if (patternX || patternY) {> + /* Rotate pattern */> + pjPatByte = (unsigned char *)pattern;> +> + switch (pattern_BPP) {> + case 8:> + {> + for (y = 0; y < 8; y++) {> + unsigned char *pjBuffer => + pattern_dstaddr +> + ((patternY + y) & 7) * 8;> + for (x = 0; x < 8; x++) {> + pjBuffer[(patternX +> + x) & 7] => + pjPatByte[x];> + }> + pjPatByte += pattern_stride;> + }> + break;> + }> +> + case 16:> + {> + for (y = 0; y < 8; y++) {> + unsigned short *pjBuffer => + (unsigned short *)> + pattern_dstaddr +> + ((patternY + y) & 7) * 8;> + for (x = 0; x < 8; x++) {> + pjBuffer[(patternX +> + x) & 7] => + ((unsigned short *)> + pjPatByte)[x];> + }> + pjPatByte += pattern_stride;> + }> + break;> + }> +> + case 32:> + {> + for (y = 0; y < 8; y++) {> + unsigned long *pjBuffer => + (unsigned long *)> + pattern_dstaddr +> + ((patternY + y) & 7) * 8;> + for (x = 0; x < 8; x++) {> + pjBuffer[(patternX +> + x) & 7] => + ((unsigned long *)> + pjPatByte)[x];> + }> + pjPatByte += pattern_stride;> + }> + break;> + }> + }> + } else {> + /*Don't rotate,just copy pattern into pattern_dstaddr*/> + for (i = 0; i < (pattern_BPP * 2); i++) {> + ((unsigned long *)pattern_dstaddr)[i] => + pattern[i];> + }> + }> +> + }> +}> +> +/**********************************************************************> + *> + * deCopy> + *> + * Purpose> + * Copy a rectangular area of the source surface to a destination surface> + *> + * Remarks> + * Source bitmap must have the same color depth (BPP) as the destination> + * bitmap.> + *> +**********************************************************************/> +void deCopy(unsigned long dst_base,> + unsigned long dst_pitch,> + unsigned long dst_BPP,> + unsigned long dst_X,> + unsigned long dst_Y,> + unsigned long dst_width,> + unsigned long dst_height,> + unsigned long src_base,> + unsigned long src_pitch,> + unsigned long src_X,> + unsigned long src_Y, pTransparent pTransp, unsigned char nROP2)> +{> + unsigned long nDirection = 0;> + unsigned long nTransparent = 0;> + /* Direction of ROP2 operation:> + * 1 = Left to Right,> + * (-1) = Right to Left> + */> + unsigned long opSign = 1;> + /* xWidth is in pixels */> + unsigned long xWidth = 192 / (dst_BPP / 8);> + unsigned long de_ctrl = 0;> +> + deWaitForNotBusy();> +> + SMTC_write2Dreg(DE_WINDOW_DESTINATION_BASE,> + FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, ADDRESS,> + dst_base));> +> + SMTC_write2Dreg(DE_WINDOW_SOURCE_BASE,> + FIELD_VALUE(0, DE_WINDOW_SOURCE_BASE, ADDRESS,> + src_base));> +> + if (dst_pitch && src_pitch) {> + SMTC_write2Dreg(DE_PITCH,> + FIELD_VALUE(0, DE_PITCH, DESTINATION,> + dst_pitch) | FIELD_VALUE(0,> + DE_PITCH,> + SOURCE,> + src_pitch));> +> + SMTC_write2Dreg(DE_WINDOW_WIDTH,> + FIELD_VALUE(0, DE_WINDOW_WIDTH, DESTINATION,> + dst_pitch) | FIELD_VALUE(0,> + DE_WINDOW_WIDTH,> + SOURCE,> + src_pitch));> + }> +> + /* Set transparent bits if necessary */> + if (pTransp != NULL) {> + nTransparent => + pTransp->match | pTransp->select | pTransp->control;> +> + /* Set color compare register */> + SMTC_write2Dreg(DE_COLOR_COMPARE,> + FIELD_VALUE(0, DE_COLOR_COMPARE, COLOR,> + pTransp->color));> + }> +> + /* Determine direction of operation */> + if (src_Y < dst_Y) {> + /* +----------+> + |S |> + | +----------+> + | | | |> + | | | |> + +---|------+ |> + | D |> + +----------+ */> +> + nDirection = BOTTOM_TO_TOP;> + } else if (src_Y > dst_Y) {> + /* +----------+> + |D |> + | +----------+> + | | | |> + | | | |> + +---|------+ |> + | S |> + +----------+ */> +> + nDirection = TOP_TO_BOTTOM;> + } else {> + /* src_Y == dst_Y */> +> + if (src_X <= dst_X) {> + /* +------+---+------+> + |S | | D|> + | | | |> + | | | |> + | | | |> + +------+---+------+ */> +> + nDirection = RIGHT_TO_LEFT;> + } else {> + /* src_X > dst_X */> +> + /* +------+---+------+> + |D | | S|> + | | | |> + | | | |> + | | | |> + +------+---+------+ */> +> + nDirection = LEFT_TO_RIGHT;> + }> + }> +> + if ((nDirection == BOTTOM_TO_TOP) || (nDirection == RIGHT_TO_LEFT)) {> + src_X += dst_width - 1;> + src_Y += dst_height - 1;> + dst_X += dst_width - 1;> + dst_Y += dst_height - 1;> + opSign = (-1);> + }> +> + if (dst_BPP >= 24) {> + src_X *= 3;> + src_Y *= 3;> + dst_X *= 3;> + dst_Y *= 3;> + dst_width *= 3;> + if ((nDirection == BOTTOM_TO_TOP)> + || (nDirection == RIGHT_TO_LEFT)) {> + src_X += 2;> + dst_X += 2;> + }> + }> +> + /* Workaround for 192 byte hw bug */> + if ((nROP2 != 0x0C) && ((dst_width * (dst_BPP / 8)) >= 192)) {> + /*> + * Perform the ROP2 operation in chunks of (xWidth *> + * dst_height)> + */> + while (1) {> + deWaitForNotBusy();> +> + SMTC_write2Dreg(DE_SOURCE,> + FIELD_SET(0, DE_SOURCE, WRAP, DISABLE) |> + FIELD_VALUE(0, DE_SOURCE, X_K1, src_X) |> + FIELD_VALUE(0, DE_SOURCE, Y_K2, src_Y));> +> + SMTC_write2Dreg(DE_DESTINATION,> + FIELD_SET(0, DE_DESTINATION, WRAP,> + DISABLE) | FIELD_VALUE(0,> + DE_DESTINATION,> + X,> + dst_X)> + | FIELD_VALUE(0, DE_DESTINATION, Y,> + dst_Y));> +> + SMTC_write2Dreg(DE_DIMENSION,> + FIELD_VALUE(0, DE_DIMENSION, X,> + xWidth) | FIELD_VALUE(0,> + DE_DIMENSION,> + Y_ET,> + dst_height));> +> + de_ctrl => + FIELD_VALUE(0, DE_CONTROL, ROP,> + nROP2) | nTransparent | FIELD_SET(0,> + DE_CONTROL,> + ROP_SELECT,> + ROP2)> + | FIELD_SET(0, DE_CONTROL, COMMAND,> + BITBLT) | ((nDirection ==> + 1) ? FIELD_SET(0,> + DE_CONTROL,> + DIRECTION,> + RIGHT_TO_LEFT)> + : FIELD_SET(0, DE_CONTROL,> + DIRECTION,> + LEFT_TO_RIGHT)) |> + FIELD_SET(0, DE_CONTROL, STATUS, START);> +> + SMTC_write2Dreg(DE_CONTROL, de_ctrl);> +> + src_X += (opSign * xWidth);> + dst_X += (opSign * xWidth);> + dst_width -= xWidth;> +> + if (dst_width <= 0) {> + /* ROP2 operation is complete */> + break;> + }> +> + if (xWidth > dst_width)> + xWidth = dst_width;> + }> + } else {> + deWaitForNotBusy();> + SMTC_write2Dreg(DE_SOURCE,> + FIELD_SET(0, DE_SOURCE, WRAP, DISABLE) |> + FIELD_VALUE(0, DE_SOURCE, X_K1, src_X) |> + FIELD_VALUE(0, DE_SOURCE, Y_K2, src_Y));> +> + SMTC_write2Dreg(DE_DESTINATION,> + FIELD_SET(0, DE_DESTINATION, WRAP, DISABLE) |> + FIELD_VALUE(0, DE_DESTINATION, X, dst_X) |> + FIELD_VALUE(0, DE_DESTINATION, Y, dst_Y));> +> + SMTC_write2Dreg(DE_DIMENSION,> + FIELD_VALUE(0, DE_DIMENSION, X, dst_width) |> + FIELD_VALUE(0, DE_DIMENSION, Y_ET, dst_height));> +> + de_ctrl = FIELD_VALUE(0, DE_CONTROL, ROP, nROP2) |> + nTransparent |> + FIELD_SET(0, DE_CONTROL, ROP_SELECT, ROP2) |> + FIELD_SET(0, DE_CONTROL, COMMAND, BITBLT) |> + ((nDirection == 1) ? FIELD_SET(0, DE_CONTROL, DIRECTION,> + RIGHT_TO_LEFT)> + : FIELD_SET(0, DE_CONTROL, DIRECTION,> + LEFT_TO_RIGHT)) | FIELD_SET(0, DE_CONTROL,> + STATUS, START);> + SMTC_write2Dreg(DE_CONTROL, de_ctrl);> + }> +> + smtc_de_busy = 1;> +}> +> +/*> + * This function sets the pixel format that will apply to the 2D Engine.> + */> +void deSetPixelFormat(unsigned long bpp)> +{> + unsigned long de_format;> +> + de_format = SMTC_read2Dreg(DE_STRETCH_FORMAT);> +> + switch (bpp) {> + case 8:> + de_format => + FIELD_SET(de_format, DE_STRETCH_FORMAT, PIXEL_FORMAT, 8);> + break;> + default:> + case 16:> + de_format => + FIELD_SET(de_format, DE_STRETCH_FORMAT, PIXEL_FORMAT, 16);> + break;> + case 32:> + de_format => + FIELD_SET(de_format, DE_STRETCH_FORMAT, PIXEL_FORMAT, 32);> + break;> + }> +> + SMTC_write2Dreg(DE_STRETCH_FORMAT, de_format);> +}> +> +/*> + * System memory to Video memory monochrome expansion.> + *> + * Source is monochrome image in system memory. This function expands the> + * monochrome data to color image in video memory.> + */> +> +long deSystemMem2VideoMemMonoBlt(const char *pSrcbuf,> + long srcDelta,> + unsigned long startBit,> + unsigned long dBase,> + unsigned long dPitch,> + unsigned long bpp,> + unsigned long dx, unsigned long dy,> + unsigned long width, unsigned long height,> + unsigned long fColor,> + unsigned long bColor,> + unsigned long rop2) {> + unsigned long bytePerPixel;> + unsigned long ulBytesPerScan;> + unsigned long ul4BytesPerScan;> + unsigned long ulBytesRemain;> + unsigned long de_ctrl = 0;> + unsigned char ajRemain[4];> + long i, j;> +> + bytePerPixel = bpp / 8;> +> + /* Just make sure the start bit is within legal range */> + startBit &= 7;> +> + ulBytesPerScan = (width + startBit + 7) / 8;> + ul4BytesPerScan = ulBytesPerScan & ~3;> + ulBytesRemain = ulBytesPerScan & 3;> +> + if (smtc_de_busy)> + deWaitForNotBusy();> +> + /*> + * 2D Source Base. Use 0 for HOST Blt.> + */> +> + SMTC_write2Dreg(DE_WINDOW_SOURCE_BASE, 0);> +> + /*> + * 2D Destination Base.> + *> + * It is an address offset (128 bit aligned) from the beginning of> + * frame buffer.> + */> +> + SMTC_write2Dreg(DE_WINDOW_DESTINATION_BASE, dBase);> +> + if (dPitch) {> +> + /*> + * Program pitch (distance between the 1st points of two> + * adjacent lines).> + *> + * Note that input pitch is BYTE value, but the 2D Pitch> + * register uses pixel values. Need Byte to pixel convertion.> + */> +> + SMTC_write2Dreg(DE_PITCH,> + FIELD_VALUE(0, DE_PITCH, DESTINATION,> + dPitch /> + bytePerPixel) | FIELD_VALUE(0,> + DE_PITCH,> + SOURCE,> + dPitch /> + bytePerPixel));> +> + /* Screen Window width in Pixels.> + *> + * 2D engine uses this value to calculate the linear address in> + * frame buffer for a given point.> + */> +> + SMTC_write2Dreg(DE_WINDOW_WIDTH,> + FIELD_VALUE(0, DE_WINDOW_WIDTH, DESTINATION,> + (dPitch /> + bytePerPixel)) | FIELD_VALUE(0,> + DE_WINDOW_WIDTH,> + SOURCE,> + (dPitch> + /> + bytePerPixel)));> + }> + /* Note: For 2D Source in Host Write, only X_K1 field is needed, and> + * Y_K2 field is not used. For mono bitmap, use startBit for X_K1.> + */> +> + SMTC_write2Dreg(DE_SOURCE,> + FIELD_SET(0, DE_SOURCE, WRAP, DISABLE) |> + FIELD_VALUE(0, DE_SOURCE, X_K1, startBit) |> + FIELD_VALUE(0, DE_SOURCE, Y_K2, 0));> +> + SMTC_write2Dreg(DE_DESTINATION,> + FIELD_SET(0, DE_DESTINATION, WRAP, DISABLE) |> + FIELD_VALUE(0, DE_DESTINATION, X, dx) |> + FIELD_VALUE(0, DE_DESTINATION, Y, dy));> +> + SMTC_write2Dreg(DE_DIMENSION,> + FIELD_VALUE(0, DE_DIMENSION, X, width) |> + FIELD_VALUE(0, DE_DIMENSION, Y_ET, height));> +> + SMTC_write2Dreg(DE_FOREGROUND, fColor);> + SMTC_write2Dreg(DE_BACKGROUND, bColor);> +> + if (bpp)> + deSetPixelFormat(bpp);> + /* Set the pixel format of the destination */> +> + de_ctrl = FIELD_VALUE(0, DE_CONTROL, ROP, rop2) |> + FIELD_SET(0, DE_CONTROL, ROP_SELECT, ROP2) |> + FIELD_SET(0, DE_CONTROL, COMMAND, HOST_WRITE) |> + FIELD_SET(0, DE_CONTROL, HOST, MONO) |> + FIELD_SET(0, DE_CONTROL, STATUS, START);> +> + SMTC_write2Dreg(DE_CONTROL, de_ctrl | deGetTransparency());> +> + /* Write MONO data (line by line) to 2D Engine data port */> + for (i = 0; i < height; i++) {> + /* For each line, send the data in chunks of 4 bytes */> + for (j = 0; j < (ul4BytesPerScan / 4); j++)> + SMTC_write2Ddataport(0,> + *(unsigned long *)(pSrcbuf +> + (j * 4)));> +> + if (ulBytesRemain) {> + memcpy(ajRemain, pSrcbuf + ul4BytesPerScan,> + ulBytesRemain);> + SMTC_write2Ddataport(0, *(unsigned long *)ajRemain);> + }> +> + pSrcbuf += srcDelta;> + }> + smtc_de_busy = 1;> +> + return 0;> +}> +> +/*> + * This function gets the transparency status from DE_CONTROL register.> + * It returns a double word with the transparent fields properly set,> + * while other fields are 0.> + */> +unsigned long deGetTransparency(void)> +{> + unsigned long de_ctrl;> +> + de_ctrl = SMTC_read2Dreg(DE_CONTROL);> +> + de_ctrl &=> + FIELD_MASK(DE_CONTROL_TRANSPARENCY_MATCH) |> + FIELD_MASK(DE_CONTROL_TRANSPARENCY_SELECT) |> + FIELD_MASK(DE_CONTROL_TRANSPARENCY);> +> + return de_ctrl;> +}> diff --git a/drivers/video/smi/smtc2d.h b/drivers/video/smi/smtc2d.h> new file mode 100644> index 0000000..3cd640c> --- /dev/null> +++ b/drivers/video/smi/smtc2d.h> @@ -0,0 +1,530 @@> +/*> + * smtc2d.h -- Silicon Motion SM501 and SM7xx 2D drawing engine functions.> + *> + * Copyright (C) 2006 Silicon Motion Technology Corp.> + * Author: Ge Wang, gewang@xxxxxxxxxxxxxxxxx> + *> + * Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology> + * Author: Wu Zhangjin, wuzj@xxxxxxxxxx> + *> + * This file is subject to the terms and conditions of the GNU General Public> + * License. See the file COPYING in the main directory of this archive for> + * more details.> + */> +> +#ifndef NULL> +#define NULL 0> +#endif> +> +/* Internal macros */> +> +#define _F_START(f) (0 ? f)> +#define _F_END(f) (1 ? f)> +#define _F_SIZE(f) (1 + _F_END(f) - _F_START(f))> +#define _F_MASK(f) (((1ULL << _F_SIZE(f)) - 1) << _F_START(f))> +#define _F_NORMALIZE(v, f) (((v) & _F_MASK(f)) >> _F_START(f))> +#define _F_DENORMALIZE(v, f) (((v) << _F_START(f)) & _F_MASK(f))> +> +/* Global macros */> +> +#define FIELD_GET(x, reg, field) \> +( \> + _F_NORMALIZE((x), reg ## _ ## field) \> +)> +> +#define FIELD_SET(x, reg, field, value) \> +( \> + (x & ~_F_MASK(reg ## _ ## field)) \> + | _F_DENORMALIZE(reg ## _ ## field ## _ ## value, reg ## _ ## field) \> +)> +> +#define FIELD_VALUE(x, reg, field, value) \> +( \> + (x & ~_F_MASK(reg ## _ ## field)) \> + | _F_DENORMALIZE(value, reg ## _ ## field) \> +)> +> +#define FIELD_CLEAR(reg, field) \> +( \> + ~_F_MASK(reg ## _ ## field) \> +)> +> +/* Field Macros */> +> +#define FIELD_START(field) (0 ? field)> +#define FIELD_END(field) (1 ? field)> +#define FIELD_SIZE(field) \> + (1 + FIELD_END(field) - FIELD_START(field))> +> +#define FIELD_MASK(field) \> + (((1 << (FIELD_SIZE(field)-1)) \> + | ((1 << (FIELD_SIZE(field)-1)) - 1)) \> + << FIELD_START(field))> +> +#define FIELD_NORMALIZE(reg, field) \> + (((reg) & FIELD_MASK(field)) >> FIELD_START(field))> +> +#define FIELD_DENORMALIZE(field, value) \> + (((value) << FIELD_START(field)) & FIELD_MASK(field))> +> +#define FIELD_INIT(reg, field, value) \> + FIELD_DENORMALIZE(reg ## _ ## field, \> + reg ## _ ## field ## _ ## value)> +> +#define FIELD_INIT_VAL(reg, field, value) \> + (FIELD_DENORMALIZE(reg ## _ ## field, value))> +> +#define FIELD_VAL_SET(x, r, f, v) ({ \> + x = (x & ~FIELD_MASK(r ## _ ## f)) \> + | FIELD_DENORMALIZE(r ## _ ## f, r ## _ ## f ## _ ## v) \> +})> +> +#define RGB(r, g, b) ((unsigned long)(((r) << 16) | ((g) << 8) | (b)))> +> +/* Transparent info definition */> +typedef struct {> + unsigned long match; /* Matching pixel is OPAQUE/TRANSPARENT */> + unsigned long select; /* Transparency controlled by SRC/DST */> + unsigned long control; /* ENABLE/DISABLE transparency */> + unsigned long color; /* Transparent color */> +} Transparent, *pTransparent;> +> +#define PIXEL_DEPTH_1_BP 0 /* 1 bit per pixel */> +#define PIXEL_DEPTH_8_BPP 1 /* 8 bits per pixel */> +#define PIXEL_DEPTH_16_BPP 2 /* 16 bits per pixel */> +#define PIXEL_DEPTH_32_BPP 3 /* 32 bits per pixel */> +#define PIXEL_DEPTH_YUV422 8 /* 16 bits per pixel YUV422 */> +#define PIXEL_DEPTH_YUV420 9 /* 16 bits per pixel YUV420 */> +> +#define PATTERN_WIDTH 8> +#define PATTERN_HEIGHT 8> +> +#define TOP_TO_BOTTOM 0> +#define BOTTOM_TO_TOP 1> +#define RIGHT_TO_LEFT BOTTOM_TO_TOP> +#define LEFT_TO_RIGHT TOP_TO_BOTTOM> +> +/* Constants used in Transparent structure */> +#define MATCH_OPAQUE 0x00000000> +#define MATCH_TRANSPARENT 0x00000400> +#define SOURCE 0x00000000> +#define DESTINATION 0x00000200> +> +/* 2D registers. */> +> +#define DE_SOURCE 0x000000> +#define DE_SOURCE_WRAP 31 : 31> +#define DE_SOURCE_WRAP_DISABLE 0> +#define DE_SOURCE_WRAP_ENABLE 1> +#define DE_SOURCE_X_K1 29 : 16> +#define DE_SOURCE_Y_K2 15 : 0> +> +#define DE_DESTINATION 0x000004> +#define DE_DESTINATION_WRAP 31 : 31> +#define DE_DESTINATION_WRAP_DISABLE 0> +#define DE_DESTINATION_WRAP_ENABLE 1> +#define DE_DESTINATION_X 28 : 16> +#define DE_DESTINATION_Y 15 : 0> +> +#define DE_DIMENSION 0x000008> +#define DE_DIMENSION_X 28 : 16> +#define DE_DIMENSION_Y_ET 15 : 0> +> +#define DE_CONTROL 0x00000C> +#define DE_CONTROL_STATUS 31 : 31> +#define DE_CONTROL_STATUS_STOP 0> +#define DE_CONTROL_STATUS_START 1> +#define DE_CONTROL_PATTERN 30 : 30> +#define DE_CONTROL_PATTERN_MONO 0> +#define DE_CONTROL_PATTERN_COLOR 1> +#define DE_CONTROL_UPDATE_DESTINATION_X 29 : 29> +#define DE_CONTROL_UPDATE_DESTINATION_X_DISABLE 0> +#define DE_CONTROL_UPDATE_DESTINATION_X_ENABLE 1> +#define DE_CONTROL_QUICK_START 28 : 28> +#define DE_CONTROL_QUICK_START_DISABLE 0> +#define DE_CONTROL_QUICK_START_ENABLE 1> +#define DE_CONTROL_DIRECTION 27 : 27> +#define DE_CONTROL_DIRECTION_LEFT_TO_RIGHT 0> +#define DE_CONTROL_DIRECTION_RIGHT_TO_LEFT 1> +#define DE_CONTROL_MAJOR 26 : 26> +#define DE_CONTROL_MAJOR_X 0> +#define DE_CONTROL_MAJOR_Y 1> +#define DE_CONTROL_STEP_X 25 : 25> +#define DE_CONTROL_STEP_X_POSITIVE 1> +#define DE_CONTROL_STEP_X_NEGATIVE 0> +#define DE_CONTROL_STEP_Y 24 : 24> +#define DE_CONTROL_STEP_Y_POSITIVE 1> +#define DE_CONTROL_STEP_Y_NEGATIVE 0> +#define DE_CONTROL_STRETCH 23 : 23> +#define DE_CONTROL_STRETCH_DISABLE 0> +#define DE_CONTROL_STRETCH_ENABLE 1> +#define DE_CONTROL_HOST 22 : 22> +#define DE_CONTROL_HOST_COLOR 0> +#define DE_CONTROL_HOST_MONO 1> +#define DE_CONTROL_LAST_PIXEL 21 : 21> +#define DE_CONTROL_LAST_PIXEL_OFF 0> +#define DE_CONTROL_LAST_PIXEL_ON 1> +#define DE_CONTROL_COMMAND 20 : 16> +#define DE_CONTROL_COMMAND_BITBLT 0> +#define DE_CONTROL_COMMAND_RECTANGLE_FILL 1> +#define DE_CONTROL_COMMAND_DE_TILE 2> +#define DE_CONTROL_COMMAND_TRAPEZOID_FILL 3> +#define DE_CONTROL_COMMAND_ALPHA_BLEND 4> +#define DE_CONTROL_COMMAND_RLE_STRIP 5> +#define DE_CONTROL_COMMAND_SHORT_STROKE 6> +#define DE_CONTROL_COMMAND_LINE_DRAW 7> +#define DE_CONTROL_COMMAND_HOST_WRITE 8> +#define DE_CONTROL_COMMAND_HOST_READ 9> +#define DE_CONTROL_COMMAND_HOST_WRITE_BOTTOM_UP 10> +#define DE_CONTROL_COMMAND_ROTATE 11> +#define DE_CONTROL_COMMAND_FONT 12> +#define DE_CONTROL_COMMAND_TEXTURE_LOAD 15> +#define DE_CONTROL_ROP_SELECT 15 : 15> +#define DE_CONTROL_ROP_SELECT_ROP3 0> +#define DE_CONTROL_ROP_SELECT_ROP2 1> +#define DE_CONTROL_ROP2_SOURCE 14 : 14> +#define DE_CONTROL_ROP2_SOURCE_BITMAP 0> +#define DE_CONTROL_ROP2_SOURCE_PATTERN 1> +#define DE_CONTROL_MONO_DATA 13 : 12> +#define DE_CONTROL_MONO_DATA_NOT_PACKED 0> +#define DE_CONTROL_MONO_DATA_8_PACKED 1> +#define DE_CONTROL_MONO_DATA_16_PACKED 2> +#define DE_CONTROL_MONO_DATA_32_PACKED 3> +#define DE_CONTROL_REPEAT_ROTATE 11 : 11> +#define DE_CONTROL_REPEAT_ROTATE_DISABLE 0> +#define DE_CONTROL_REPEAT_ROTATE_ENABLE 1> +#define DE_CONTROL_TRANSPARENCY_MATCH 10 : 10> +#define DE_CONTROL_TRANSPARENCY_MATCH_OPAQUE 0> +#define DE_CONTROL_TRANSPARENCY_MATCH_TRANSPARENT 1> +#define DE_CONTROL_TRANSPARENCY_SELECT 9 : 9> +#define DE_CONTROL_TRANSPARENCY_SELECT_SOURCE 0> +#define DE_CONTROL_TRANSPARENCY_SELECT_DESTINATION 1> +#define DE_CONTROL_TRANSPARENCY 8 : 8> +#define DE_CONTROL_TRANSPARENCY_DISABLE 0> +#define DE_CONTROL_TRANSPARENCY_ENABLE 1> +#define DE_CONTROL_ROP 7 : 0> +> +/* Pseudo fields. */> +> +#define DE_CONTROL_SHORT_STROKE_DIR 27 : 24> +#define DE_CONTROL_SHORT_STROKE_DIR_225 0> +#define DE_CONTROL_SHORT_STROKE_DIR_135 1> +#define DE_CONTROL_SHORT_STROKE_DIR_315 2> +#define DE_CONTROL_SHORT_STROKE_DIR_45 3> +#define DE_CONTROL_SHORT_STROKE_DIR_270 4> +#define DE_CONTROL_SHORT_STROKE_DIR_90 5> +#define DE_CONTROL_SHORT_STROKE_DIR_180 8> +#define DE_CONTROL_SHORT_STROKE_DIR_0 10> +#define DE_CONTROL_ROTATION 25 : 24> +#define DE_CONTROL_ROTATION_0 0> +#define DE_CONTROL_ROTATION_270 1> +#define DE_CONTROL_ROTATION_90 2> +#define DE_CONTROL_ROTATION_180 3> +> +#define DE_PITCH 0x000010> +#define DE_PITCH_DESTINATION 28 : 16> +#define DE_PITCH_SOURCE 12 : 0> +> +#define DE_FOREGROUND 0x000014> +#define DE_FOREGROUND_COLOR 31 : 0> +> +#define DE_BACKGROUND 0x000018> +#define DE_BACKGROUND_COLOR 31 : 0> +> +#define DE_STRETCH_FORMAT 0x00001C> +#define DE_STRETCH_FORMAT_PATTERN_XY 30 : 30> +#define DE_STRETCH_FORMAT_PATTERN_XY_NORMAL 0> +#define DE_STRETCH_FORMAT_PATTERN_XY_OVERWRITE 1> +#define DE_STRETCH_FORMAT_PATTERN_Y 29 : 27> +#define DE_STRETCH_FORMAT_PATTERN_X 25 : 23> +#define DE_STRETCH_FORMAT_PIXEL_FORMAT 21 : 20> +#define DE_STRETCH_FORMAT_PIXEL_FORMAT_8 0> +#define DE_STRETCH_FORMAT_PIXEL_FORMAT_16 1> +#define DE_STRETCH_FORMAT_PIXEL_FORMAT_24 3> +#define DE_STRETCH_FORMAT_PIXEL_FORMAT_32 2> +#define DE_STRETCH_FORMAT_ADDRESSING 19 : 16> +#define DE_STRETCH_FORMAT_ADDRESSING_XY 0> +#define DE_STRETCH_FORMAT_ADDRESSING_LINEAR 15> +#define DE_STRETCH_FORMAT_SOURCE_HEIGHT 11 : 0> +> +#define DE_COLOR_COMPARE 0x000020> +#define DE_COLOR_COMPARE_COLOR 23 : 0> +> +#define DE_COLOR_COMPARE_MASK 0x000024> +#define DE_COLOR_COMPARE_MASK_MASKS 23 : 0> +> +#define DE_MASKS 0x000028> +#define DE_MASKS_BYTE_MASK 31 : 16> +#define DE_MASKS_BIT_MASK 15 : 0> +> +#define DE_CLIP_TL 0x00002C> +#define DE_CLIP_TL_TOP 31 : 16> +#define DE_CLIP_TL_STATUS 13 : 13> +#define DE_CLIP_TL_STATUS_DISABLE 0> +#define DE_CLIP_TL_STATUS_ENABLE 1> +#define DE_CLIP_TL_INHIBIT 12 : 12> +#define DE_CLIP_TL_INHIBIT_OUTSIDE 0> +#define DE_CLIP_TL_INHIBIT_INSIDE 1> +#define DE_CLIP_TL_LEFT 11 : 0> +> +#define DE_CLIP_BR 0x000030> +#define DE_CLIP_BR_BOTTOM 31 : 16> +#define DE_CLIP_BR_RIGHT 12 : 0> +> +#define DE_MONO_PATTERN_LOW 0x000034> +#define DE_MONO_PATTERN_LOW_PATTERN 31 : 0> +> +#define DE_MONO_PATTERN_HIGH 0x000038> +#define DE_MONO_PATTERN_HIGH_PATTERN 31 : 0> +> +#define DE_WINDOW_WIDTH 0x00003C> +#define DE_WINDOW_WIDTH_DESTINATION 28 : 16> +#define DE_WINDOW_WIDTH_SOURCE 12 : 0> +> +#define DE_WINDOW_SOURCE_BASE 0x000040> +#define DE_WINDOW_SOURCE_BASE_EXT 27 : 27> +#define DE_WINDOW_SOURCE_BASE_EXT_LOCAL 0> +#define DE_WINDOW_SOURCE_BASE_EXT_EXTERNAL 1> +#define DE_WINDOW_SOURCE_BASE_CS 26 : 26> +#define DE_WINDOW_SOURCE_BASE_CS_0 0> +#define DE_WINDOW_SOURCE_BASE_CS_1 1> +#define DE_WINDOW_SOURCE_BASE_ADDRESS 25 : 0> +> +#define DE_WINDOW_DESTINATION_BASE 0x000044> +#define DE_WINDOW_DESTINATION_BASE_EXT 27 : 27> +#define DE_WINDOW_DESTINATION_BASE_EXT_LOCAL 0> +#define DE_WINDOW_DESTINATION_BASE_EXT_EXTERNAL 1> +#define DE_WINDOW_DESTINATION_BASE_CS 26 : 26> +#define DE_WINDOW_DESTINATION_BASE_CS_0 0> +#define DE_WINDOW_DESTINATION_BASE_CS_1 1> +#define DE_WINDOW_DESTINATION_BASE_ADDRESS 25 : 0> +> +#define DE_ALPHA 0x000048> +#define DE_ALPHA_VALUE 7 : 0> +> +#define DE_WRAP 0x00004C> +#define DE_WRAP_X 31 : 16> +#define DE_WRAP_Y 15 : 0> +> +#define DE_STATUS 0x000050> +#define DE_STATUS_CSC 1 : 1> +#define DE_STATUS_CSC_CLEAR 0> +#define DE_STATUS_CSC_NOT_ACTIVE 0> +#define DE_STATUS_CSC_ACTIVE 1> +#define DE_STATUS_2D 0 : 0> +#define DE_STATUS_2D_CLEAR 0> +#define DE_STATUS_2D_NOT_ACTIVE 0> +#define DE_STATUS_2D_ACTIVE 1> +> +/* Color Space Conversion registers. */> +> +#define CSC_Y_SOURCE_BASE 0x0000C8> +#define CSC_Y_SOURCE_BASE_EXT 27 : 27> +#define CSC_Y_SOURCE_BASE_EXT_LOCAL 0> +#define CSC_Y_SOURCE_BASE_EXT_EXTERNAL 1> +#define CSC_Y_SOURCE_BASE_CS 26 : 26> +#define CSC_Y_SOURCE_BASE_CS_0 0> +#define CSC_Y_SOURCE_BASE_CS_1 1> +#define CSC_Y_SOURCE_BASE_ADDRESS 25 : 0> +> +#define CSC_CONSTANTS 0x0000CC> +#define CSC_CONSTANTS_Y 31 : 24> +#define CSC_CONSTANTS_R 23 : 16> +#define CSC_CONSTANTS_G 15 : 8> +#define CSC_CONSTANTS_B 7 : 0> +> +#define CSC_Y_SOURCE_X 0x0000D0> +#define CSC_Y_SOURCE_X_INTEGER 26 : 16> +#define CSC_Y_SOURCE_X_FRACTION 15 : 3> +> +#define CSC_Y_SOURCE_Y 0x0000D4> +#define CSC_Y_SOURCE_Y_INTEGER 27 : 16> +#define CSC_Y_SOURCE_Y_FRACTION 15 : 3> +> +#define CSC_U_SOURCE_BASE 0x0000D8> +#define CSC_U_SOURCE_BASE_EXT 27 : 27> +#define CSC_U_SOURCE_BASE_EXT_LOCAL 0> +#define CSC_U_SOURCE_BASE_EXT_EXTERNAL 1> +#define CSC_U_SOURCE_BASE_CS 26 : 26> +#define CSC_U_SOURCE_BASE_CS_0 0> +#define CSC_U_SOURCE_BASE_CS_1 1> +#define CSC_U_SOURCE_BASE_ADDRESS 25 : 0> +> +#define CSC_V_SOURCE_BASE 0x0000DC> +#define CSC_V_SOURCE_BASE_EXT 27 : 27> +#define CSC_V_SOURCE_BASE_EXT_LOCAL 0> +#define CSC_V_SOURCE_BASE_EXT_EXTERNAL 1> +#define CSC_V_SOURCE_BASE_CS 26 : 26> +#define CSC_V_SOURCE_BASE_CS_0 0> +#define CSC_V_SOURCE_BASE_CS_1 1> +#define CSC_V_SOURCE_BASE_ADDRESS 25 : 0> +> +#define CSC_SOURCE_DIMENSION 0x0000E0> +#define CSC_SOURCE_DIMENSION_X 31 : 16> +#define CSC_SOURCE_DIMENSION_Y 15 : 0> +> +#define CSC_SOURCE_PITCH 0x0000E4> +#define CSC_SOURCE_PITCH_Y 31 : 16> +#define CSC_SOURCE_PITCH_UV 15 : 0> +> +#define CSC_DESTINATION 0x0000E8> +#define CSC_DESTINATION_WRAP 31 : 31> +#define CSC_DESTINATION_WRAP_DISABLE 0> +#define CSC_DESTINATION_WRAP_ENABLE 1> +#define CSC_DESTINATION_X 27 : 16> +#define CSC_DESTINATION_Y 11 : 0> +> +#define CSC_DESTINATION_DIMENSION 0x0000EC> +#define CSC_DESTINATION_DIMENSION_X 31 : 16> +#define CSC_DESTINATION_DIMENSION_Y 15 : 0> +> +#define CSC_DESTINATION_PITCH 0x0000F0> +#define CSC_DESTINATION_PITCH_X 31 : 16> +#define CSC_DESTINATION_PITCH_Y 15 : 0> +> +#define CSC_SCALE_FACTOR 0x0000F4> +#define CSC_SCALE_FACTOR_HORIZONTAL 31 : 16> +#define CSC_SCALE_FACTOR_VERTICAL 15 : 0> +> +#define CSC_DESTINATION_BASE 0x0000F8> +#define CSC_DESTINATION_BASE_EXT 27 : 27> +#define CSC_DESTINATION_BASE_EXT_LOCAL 0> +#define CSC_DESTINATION_BASE_EXT_EXTERNAL 1> +#define CSC_DESTINATION_BASE_CS 26 : 26> +#define CSC_DESTINATION_BASE_CS_0 0> +#define CSC_DESTINATION_BASE_CS_1 1> +#define CSC_DESTINATION_BASE_ADDRESS 25 : 0> +> +#define CSC_CONTROL 0x0000FC> +#define CSC_CONTROL_STATUS 31 : 31> +#define CSC_CONTROL_STATUS_STOP 0> +#define CSC_CONTROL_STATUS_START 1> +#define CSC_CONTROL_SOURCE_FORMAT 30 : 28> +#define CSC_CONTROL_SOURCE_FORMAT_YUV422 0> +#define CSC_CONTROL_SOURCE_FORMAT_YUV420I 1> +#define CSC_CONTROL_SOURCE_FORMAT_YUV420 2> +#define CSC_CONTROL_SOURCE_FORMAT_YVU9 3> +#define CSC_CONTROL_SOURCE_FORMAT_IYU1 4> +#define CSC_CONTROL_SOURCE_FORMAT_IYU2 5> +#define CSC_CONTROL_SOURCE_FORMAT_RGB565 6> +#define CSC_CONTROL_SOURCE_FORMAT_RGB8888 7> +#define CSC_CONTROL_DESTINATION_FORMAT 27 : 26> +#define CSC_CONTROL_DESTINATION_FORMAT_RGB565 0> +#define CSC_CONTROL_DESTINATION_FORMAT_RGB8888 1> +#define CSC_CONTROL_HORIZONTAL_FILTER 25 : 25> +#define CSC_CONTROL_HORIZONTAL_FILTER_DISABLE 0> +#define CSC_CONTROL_HORIZONTAL_FILTER_ENABLE 1> +#define CSC_CONTROL_VERTICAL_FILTER 24 : 24> +#define CSC_CONTROL_VERTICAL_FILTER_DISABLE 0> +#define CSC_CONTROL_VERTICAL_FILTER_ENABLE 1> +#define CSC_CONTROL_BYTE_ORDER 23 : 23> +#define CSC_CONTROL_BYTE_ORDER_YUYV 0> +#define CSC_CONTROL_BYTE_ORDER_UYVY 1> +> +#define DE_DATA_PORT_501 0x110000> +#define DE_DATA_PORT_712 0x400000> +#define DE_DATA_PORT_722 0x6000> +> +/* point to virtual Memory Map IO starting address */> +extern char *smtc_RegBaseAddress;> +/* point to virtual video memory starting address */> +extern char *smtc_VRAMBaseAddress;> +extern unsigned char smtc_de_busy;> +> +extern unsigned long memRead32(unsigned long nOffset);> +extern void memWrite32(unsigned long nOffset, unsigned long nData);> +extern unsigned long SMTC_read2Dreg(unsigned long nOffset);> +> +/* 2D functions */> +extern void deInit(unsigned int nModeWidth, unsigned int nModeHeight,> + unsigned int bpp);> +> +extern void deWaitForNotBusy(void);> +> +extern void deVerticalLine(unsigned long dst_base,> + unsigned long dst_pitch,> + unsigned long nX,> + unsigned long nY,> + unsigned long dst_height,> + unsigned long nColor);> +> +extern void deHorizontalLine(unsigned long dst_base,> + unsigned long dst_pitch,> + unsigned long nX,> + unsigned long nY,> + unsigned long dst_width,> + unsigned long nColor);> +> +extern void deLine(unsigned long dst_base,> + unsigned long dst_pitch,> + unsigned long nX1,> + unsigned long nY1,> + unsigned long nX2,> + unsigned long nY2,> + unsigned long nColor);> +> +extern void deFillRect(unsigned long dst_base,> + unsigned long dst_pitch,> + unsigned long dst_X,> + unsigned long dst_Y,> + unsigned long dst_width,> + unsigned long dst_height,> + unsigned long nColor);> +> +extern void deRotatePattern(unsigned char *pattern_dstaddr,> + unsigned long pattern_src_addr,> + unsigned long pattern_BPP,> + unsigned long pattern_stride,> + int patternX,> + int patternY);> +> +extern void deCopy(unsigned long dst_base,> + unsigned long dst_pitch,> + unsigned long dst_BPP,> + unsigned long dst_X,> + unsigned long dst_Y,> + unsigned long dst_width,> + unsigned long dst_height,> + unsigned long src_base,> + unsigned long src_pitch,> + unsigned long src_X,> + unsigned long src_Y,> + pTransparent pTransp,> + unsigned char nROP2);> +> +/*> + * System memory to Video memory monochrome expansion.> + *> + * Source is monochrome image in system memory. This function expands the> + * monochrome data to color image in video memory.> + *> + * @pSrcbuf: pointer to start of source buffer in system memory> + * @srcDelta: Pitch value (in bytes) of the source buffer, +ive means top> + * down and -ive mean button up> + * @startBit: Mono data can start at any bit in a byte, this value should> + * be 0 to 7> + * @dBase: Address of destination : offset in frame buffer> + * @dPitch: Pitch value of destination surface in BYTE> + * @bpp: Color depth of destination surface> + * @dx, dy: Starting coordinate of destination surface> + * @width, height: width and height of rectange in pixel value> + * @fColor,bColor: Foreground, Background color (corresponding to a 1, 0 in> + * the monochrome data)> + * @rop2: ROP value> + */> +> +extern long deSystemMem2VideoMemMonoBlt(> + const char *pSrcbuf,> + long srcDelta,> + unsigned long startBit,> + unsigned long dBase,> + unsigned long dPitch,> + unsigned long bpp,> + unsigned long dx, unsigned long dy,> + unsigned long width, unsigned long height,> + unsigned long fColor,> + unsigned long bColor,> + unsigned long rop2);> +> +extern unsigned long deGetTransparency(void);> +extern void deSetPixelFormat(unsigned long bpp);> diff --git a/drivers/video/smi/smtcfb.c b/drivers/video/smi/smtcfb.c> new file mode 100644> index 0000000..33ce878> --- /dev/null> +++ b/drivers/video/smi/smtcfb.c> @@ -0,0 +1,1141 @@> +/*> + * smtcfb.c -- Silicon Motion SM501 and SM7xx frame buffer device> + *> + * Copyright (C) 2006 Silicon Motion Technology Corp.> + * Authors: Ge Wang, gewang@xxxxxxxxxxxxxxxxx> + * Boyod boyod.yang@xxxxxxxxxxxxxxxxxxxx> + *> + * Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology> + * Author: Wu Zhangjin, wuzj@xxxxxxxxxx> + *> + * This file is subject to the terms and conditions of the GNU General Public> + * License. See the file COPYING in the main directory of this archive for> + * more details.> + *> + * Version 0.10.26192.21.01> + * - Add PowerPC/Big endian support> + * - Add 2D support for Lynx> + * - Verified on2.6.19.2 Boyod.yang <boyod.yang@xxxxxxxxxxxxxxxxxxxx>> + *> + * Version 0.09.2621.00.01> + * - Only support Linux Kernel's version 2.6.21.> + * Boyod.yang <boyod.yang@xxxxxxxxxxxxxxxxxxxx>> + *> + * Version 0.09> + * - Only support Linux Kernel's version 2.6.12.> + * Boyod.yang <boyod.yang@xxxxxxxxxxxxxxxxxxxx>> + */> +> +#ifndef __KERNEL__> +#define __KERNEL__> +#endif> +> +#include <linux/io.h>> +#include <linux/fb.h>> +#include <linux/pci.h>> +#include <linux/init.h>> +#include <linux/uaccess.h>> +#include <linux/screen_info.h>> +> +#ifdef CONFIG_PM> +#include <linux/pm.h>> +#endif> +> +#include "smtcfb.h"> +#include "smtc2d.h"> +> +#ifdef DEBUG> +#define smdbg(format, arg...) printk(KERN_DEBUG format , ## arg)> +#else> +#define smdbg(format, arg...)> +#endif> +> +#ifdef __BIG_ENDIAN> +struct screen_info screen_info;> +#endif> +> +/*> +* Private structure> +*/> +struct smtcfb_info {> + /*> + * The following is a pointer to be passed into the> + * functions below. The modules outside the main> + * voyager.c driver have no knowledge as to what> + * is within this structure.> + */> + struct fb_info fb;> + struct display_switch *dispsw;> + struct pci_dev *dev;> + signed int currcon;> +> + struct {> + u8 red, green, blue;> + } palette[NR_RGB];> +> + u_int palette_size;> +};> +> +struct par_info {> + /*> + * Hardware> + */> + u16 chipID;> + unsigned char __iomem *m_pMMIO;> + char __iomem *m_pLFB;> + char *m_pDPR;> + char *m_pVPR;> + char *m_pCPR;> +> + u_int width;> + u_int height;> + u_int hz;> + u_long BaseAddressInVRAM;> + u8 chipRevID;> +};> +> +#ifdef __BIG_ENDIAN> +struct vesa_mode_table {> + char mode_index[6];> + u16 lfb_width;> + u16 lfb_height;> + u16 lfb_depth;> +};> +> +static struct vesa_mode_table vesa_mode[] = {> + {"0x301", 640, 480, 8},> + {"0x303", 800, 600, 8},> + {"0x305", 1024, 768, 8},> + {"0x307", 1280, 1024, 8},> +> + {"0x311", 640, 480, 16},> + {"0x314", 800, 600, 16},> + {"0x317", 1024, 768, 16},> + {"0x31A", 1280, 1024, 16},> +> + {"0x312", 640, 480, 24},> + {"0x315", 800, 600, 24},> + {"0x318", 1024, 768, 24},> + {"0x31B", 1280, 1024, 24},> +> +};> +#endif> +> +char __iomem *smtc_RegBaseAddress; /* Memory Map IO starting address */> +char __iomem *smtc_VRAMBaseAddress; /* video memory starting address */> +> +char *smtc_2DBaseAddress; /* 2D engine starting address */> +char *smtc_2Ddataport; /* 2D data port offset */> +short smtc_2Dacceleration;> +> +static u32 colreg[17];> +static struct par_info hw; /* hardware information */> +> +#if defined(CONFIG_FB_SM7XX_DUALHEAD)> +> +static u32 colreg2[17];> +/* hardware information for second display (CRT) */> +static struct par_info hw2;> +/* fb_info for second display (CRT) */> +struct smtcfb_info smtcfb_info2;> +> +#endif /* CONFIG_FB_SM501_DUALHEAD */> +> +u16 smtc_ChipIDs[] = {> + 0x710,> + 0x712,> + 0x720> +};> +> +int sm712be_flag;> +> +#define numSMTCchipIDs (sizeof(smtc_ChipIDs) / sizeof(u16))> +> +void deWaitForNotBusy(void)> +{> + unsigned long i = 0x1000000;> + while (i--) {> + if ((smtc_seqr(0x16) & 0x18) == 0x10)> + break;> + }> + smtc_de_busy = 0;> +}> +> +static void sm712_set_timing(struct smtcfb_info *sfb,> + struct par_info *ppar_info)> +{> + int i = 0, j = 0;> + u32 m_nScreenStride;> +> + smdbg("\nppar_info->width = %d ppar_info->height = %d"> + "sfb->fb.var.bits_per_pixel = %d ppar_info->hz = %d\n",> + ppar_info->width, ppar_info->height,> + sfb->fb.var.bits_per_pixel, ppar_info->hz);> +> + for (j = 0; j < numVGAModes; j++) {> + if (VGAMode[j].mmSizeX == ppar_info->width &&> + VGAMode[j].mmSizeY == ppar_info->height &&> + VGAMode[j].bpp == sfb->fb.var.bits_per_pixel &&> + VGAMode[j].hz == ppar_info->hz) {> +> + smdbg("\nVGAMode[j].mmSizeX = %d VGAMode[j].mmSizeY ="> + "%d VGAMode[j].bpp = %d"> + "VGAMode[j].hz=%d\n",> + VGAMode[j].mmSizeX, VGAMode[j].mmSizeY,> + VGAMode[j].bpp, VGAMode[j].hz);> +> + smdbg("VGAMode index=%d\n", j);> +> + smtc_mmiowb(0x0, 0x3c6);> +> + smtc_seqw(0, 0x1);> +> + smtc_mmiowb(VGAMode[j].Init_MISC, 0x3c2);> +> + /* init SEQ register SR00 - SR04 */> + for (i = 0; i < SIZE_SR00_SR04; i++)> + smtc_seqw(i, VGAMode[j].Init_SR00_SR04[i]);> +> + /* init SEQ register SR10 - SR24 */> + for (i = 0; i < SIZE_SR10_SR24; i++)> + smtc_seqw(i + 0x10,> + VGAMode[j].Init_SR10_SR24[i]);> +> + /* init SEQ register SR30 - SR75 */> + for (i = 0; i < SIZE_SR30_SR75; i++)> + if (((i + 0x30) != 0x62) \> + && ((i + 0x30) != 0x6a) \> + && ((i + 0x30) != 0x6b))> + smtc_seqw(i + 0x30,> + VGAMode[j].Init_SR30_SR75[i]);> +> + /* init SEQ register SR80 - SR93 */> + for (i = 0; i < SIZE_SR80_SR93; i++)> + smtc_seqw(i + 0x80,> + VGAMode[j].Init_SR80_SR93[i]);> +> + /* init SEQ register SRA0 - SRAF */> + for (i = 0; i < SIZE_SRA0_SRAF; i++)> + smtc_seqw(i + 0xa0,> + VGAMode[j].Init_SRA0_SRAF[i]);> +> + /* init Graphic register GR00 - GR08 */> + for (i = 0; i < SIZE_GR00_GR08; i++)> + smtc_grphw(i, VGAMode[j].Init_GR00_GR08[i]);> +> + /* init Attribute register AR00 - AR14 */> + for (i = 0; i < SIZE_AR00_AR14; i++)> + smtc_attrw(i, VGAMode[j].Init_AR00_AR14[i]);> +> + /* init CRTC register CR00 - CR18 */> + for (i = 0; i < SIZE_CR00_CR18; i++)> + smtc_crtcw(i, VGAMode[j].Init_CR00_CR18[i]);> +> + /* init CRTC register CR30 - CR4D */> + for (i = 0; i < SIZE_CR30_CR4D; i++)> + smtc_crtcw(i + 0x30,> + VGAMode[j].Init_CR30_CR4D[i]);> +> + /* init CRTC register CR90 - CRA7 */> + for (i = 0; i < SIZE_CR90_CRA7; i++)> + smtc_crtcw(i + 0x90,> + VGAMode[j].Init_CR90_CRA7[i]);> + }> + }> + smtc_mmiowb(0x67, 0x3c2);> +> + /* set VPR registers */> + writel(0x0, ppar_info->m_pVPR + 0x0C);> + writel(0x0, ppar_info->m_pVPR + 0x40);> +> + /* set data width */> + m_nScreenStride => + (ppar_info->width * sfb->fb.var.bits_per_pixel) / 64;> + switch (sfb->fb.var.bits_per_pixel) {> + case 8:> + writel(0x0, ppar_info->m_pVPR + 0x0);> + break;> + case 16:> + writel(0x00020000, ppar_info->m_pVPR + 0x0);> + break;> + case 24:> + writel(0x00040000, ppar_info->m_pVPR + 0x0);> + break;> + case 32:> + writel(0x00030000, ppar_info->m_pVPR + 0x0);> + break;> + }> + writel((u32) (((m_nScreenStride + 2) << 16) | m_nScreenStride),> + ppar_info->m_pVPR + 0x10);> +> +}> +> +static void sm712_setpalette(int regno, unsigned red, unsigned green,> + unsigned blue, struct fb_info *info)> +{> + struct par_info *cur_par = (struct par_info *)info->par;> +> + if (cur_par->BaseAddressInVRAM)> + /*> + * second display palette for dual head. Enable CRT RAM, 6-bit> + * RAM> + */> + smtc_seqw(0x66, (smtc_seqr(0x66) & 0xC3) | 0x20);> + else> + /* primary display palette. Enable LCD RAM only, 6-bit RAM */> + smtc_seqw(0x66, (smtc_seqr(0x66) & 0xC3) | 0x10);> + smtc_mmiowb(regno, dac_reg);> + smtc_mmiowb(red >> 10, dac_val);> + smtc_mmiowb(green >> 10, dac_val);> + smtc_mmiowb(blue >> 10, dac_val);> +}> +> +static void smtc_set_timing(struct smtcfb_info *sfb, struct par_info> + *ppar_info)> +{> + switch (ppar_info->chipID) {> + case 0x710:> + case 0x712:> + case 0x720:> + sm712_set_timing(sfb, ppar_info);> + break;> + }> +}> +> +static struct fb_var_screeninfo smtcfb_var = {> + .xres = 1024,> + .yres = 600,> + .xres_virtual = 1024,> + .yres_virtual = 600,> + .bits_per_pixel = 16,> + .red = {16, 8, 0},> + .green = {8, 8, 0},> + .blue = {0, 8, 0},> + .activate = FB_ACTIVATE_NOW,> + .height = -1,> + .width = -1,> + .vmode = FB_VMODE_NONINTERLACED,> +};> +> +static struct fb_fix_screeninfo smtcfb_fix = {> + .id = "sm712fb",> + .type = FB_TYPE_PACKED_PIXELS,> + .visual = FB_VISUAL_TRUECOLOR,> + .line_length = 800 * 3,> + .accel = FB_ACCEL_SMI_LYNX,> +};> +> +/* chan_to_field> + *> + * convert a colour value into a field position> + *> + * from pxafb.c> + */> +> +static inline unsigned int chan_to_field(unsigned int chan,> + struct fb_bitfield *bf)> +{> + chan &= 0xffff;> + chan >>= 16 - bf->length;> + return chan << bf->offset;> +}> +> +static int smtc_setcolreg(unsigned regno, unsigned red, unsigned green,> + unsigned blue, unsigned trans, struct fb_info *info)> +{> + struct smtcfb_info *sfb = (struct smtcfb_info *)info;> + u32 val;> +> + if (regno > 255)> + return 1;> +> + switch (sfb->fb.fix.visual) {> + case FB_VISUAL_DIRECTCOLOR:> + case FB_VISUAL_TRUECOLOR:> + /*> + * 16/32 bit true-colour, use pseuo-palette for 16 base color> + */> + if (regno < 16) {> + if (sfb->fb.var.bits_per_pixel == 16) {> + u32 *pal = sfb->fb.pseudo_palette;> + val = chan_to_field(red, &sfb->fb.var.red);> + val |= chan_to_field(green, \> + &sfb->fb.var.green);> + val |= chan_to_field(blue, &sfb->fb.var.blue);> +#ifdef __BIG_ENDIAN> + pal[regno] => + ((red & 0xf800) >> 8) |> + ((green & 0xe000) >> 13) |> + ((green & 0x1c00) << 3) |> + ((blue & 0xf800) >> 3);> +#else> + pal[regno] = val;> +#endif> + } else {> + u32 *pal = sfb->fb.pseudo_palette;> + val = chan_to_field(red, &sfb->fb.var.red);> + val |= chan_to_field(green, \> + &sfb->fb.var.green);> + val |= chan_to_field(blue, &sfb->fb.var.blue);> +#ifdef __BIG_ENDIAN> + val => + (val & 0xff00ff00 >> 8) |> + (val & 0x00ff00ff << 8);> +#endif> + pal[regno] = val;> + }> + }> + break;> +> + case FB_VISUAL_PSEUDOCOLOR:> + /* color depth 8 bit */> + sm712_setpalette(regno, red, green, blue, info);> + break;> +> + default:> + return 1; /* unknown type */> + }> +> + return 0;> +> +}> +> +#ifdef __BIG_ENDIAN> +static ssize_t> +smtcfb_read(struct file *file, char __user * buf, size_t count, loff_t * ppos)> +{> + unsigned long p = *ppos;> +> + struct inode *inode = file->f_dentry->d_inode;> + int fbidx = iminor(inode);> + struct fb_info *info = registered_fb[fbidx];> +> + u32 *buffer, *dst;> + u32 __iomem *src;> + int c, i, cnt = 0, err = 0;> + unsigned long total_size;> +> + if (!info || !info->screen_base)> + return -ENODEV;> +> + if (info->state != FBINFO_STATE_RUNNING)> + return -EPERM;> +> + total_size = info->screen_size;> +> + if (total_size == 0)> + total_size = info->fix.smem_len;> +> + if (p >= total_size)> + return 0;> +> + if (count >= total_size)> + count = total_size;> +> + if (count + p > total_size)> + count = total_size - p;> +> + buffer = kmalloc((count > PAGE_SIZE) ? PAGE_SIZE : count, GFP_KERNEL);> + if (!buffer)> + return -ENOMEM;> +> + src = (u32 __iomem *) (info->screen_base + p);> +> + if (info->fbops->fb_sync)> + info->fbops->fb_sync(info);> +> + while (count) {> + c = (count > PAGE_SIZE) ? PAGE_SIZE : count;> + dst = buffer;> + for (i = c >> 2; i--;) {> + *dst = fb_readl(src++);> + *dst => + (*dst & 0xff00ff00 >> 8) |> + (*dst & 0x00ff00ff << 8);> + dst++;> + }> + if (c & 3) {> + u8 *dst8 = (u8 *) dst;> + u8 __iomem *src8 = (u8 __iomem *) src;> +> + for (i = c & 3; i--;) {> + if (i & 1) {> + *dst8++ = fb_readb(++src8);> + } else {> + *dst8++ = fb_readb(--src8);> + src8 += 2;> + }> + }> + src = (u32 __iomem *) src8;> + }> +> + if (copy_to_user(buf, buffer, c)) {> + err = -EFAULT;> + break;> + }> + *ppos += c;> + buf += c;> + cnt += c;> + count -= c;> + }> +> + kfree(buffer);> +> + return (err) ? err : cnt;> +}> +> +static ssize_t> +smtcfb_write(struct file *file, const char __user *buf, size_t count,> + loff_t *ppos)> +{> + unsigned long p = *ppos;> + struct inode *inode = file->f_dentry->d_inode;> + int fbidx = iminor(inode);> + struct fb_info *info = registered_fb[fbidx];> + u32 *buffer, *src;> + u32 __iomem *dst;> + int c, i, cnt = 0, err = 0;> + unsigned long total_size;> +> + if (!info || !info->screen_base)> + return -ENODEV;> +> + if (info->state != FBINFO_STATE_RUNNING)> + return -EPERM;> +> + total_size = info->screen_size;> +> + if (total_size == 0)> + total_size = info->fix.smem_len;> +> + if (p > total_size)> + return -EFBIG;> +> + if (count > total_size) {> + err = -EFBIG;> + count = total_size;> + }> +> + if (count + p > total_size) {> + if (!err)> + err = -ENOSPC;> +> + count = total_size - p;> + }> +> + buffer = kmalloc((count > PAGE_SIZE) ? PAGE_SIZE : count, GFP_KERNEL);> + if (!buffer)> + return -ENOMEM;> +> + dst = (u32 __iomem *) (info->screen_base + p);> +> + if (info->fbops->fb_sync)> + info->fbops->fb_sync(info);> +> + while (count) {> + c = (count > PAGE_SIZE) ? PAGE_SIZE : count;> + src = buffer;> +> + if (copy_from_user(src, buf, c)) {> + err = -EFAULT;> + break;> + }> +> + for (i = c >> 2; i--;) {> + fb_writel((*src & 0xff00ff00 >> 8) |> + (*src & 0x00ff00ff << 8), dst++);> + src++;> + }> + if (c & 3) {> + u8 *src8 = (u8 *) src;> + u8 __iomem *dst8 = (u8 __iomem *) dst;> +> + for (i = c & 3; i--;) {> + if (i & 1) {> + fb_writeb(*src8++, ++dst8);> + } else {> + fb_writeb(*src8++, --dst8);> + dst8 += 2;> + }> + }> + dst = (u32 __iomem *) dst8;> + }> +> + *ppos += c;> + buf += c;> + cnt += c;> + count -= c;> + }> +> + kfree(buffer);> +> + return (cnt) ? cnt : err;> +}> +#endif /* ! __BIG_ENDIAN */> +> +#include "smtc2d.c"> +> +void smtcfb_copyarea(struct fb_info *info, const struct fb_copyarea *area)> +{> + struct par_info *p = (struct par_info *)info->par;> +> + if (smtc_2Dacceleration) {> + if (!area->width || !area->height)> + return;> +> + deCopy(p->BaseAddressInVRAM, 0, info->var.bits_per_pixel,> + area->dx, area->dy, area->width, area->height,> + p->BaseAddressInVRAM, 0, area->sx, area->sy, 0, 0xC);> +> + } else> + cfb_copyarea(info, area);> +}> +> +void smtcfb_fillrect(struct fb_info *info, const struct fb_fillrect *rect)> +{> + struct par_info *p = (struct par_info *)info->par;> +> + if (smtc_2Dacceleration) {> + if (!rect->width || !rect->height)> + return;> + if (info->var.bits_per_pixel >= 24)> + deFillRect(p->BaseAddressInVRAM, 0, rect->dx * 3,> + rect->dy * 3, rect->width * 3, rect->height,> + rect->color);> + else> + deFillRect(p->BaseAddressInVRAM, 0, rect->dx, rect->dy,> + rect->width, rect->height, rect->color);> + } else> + cfb_fillrect(info, rect);> +}> +> +void smtcfb_imageblit(struct fb_info *info, const struct fb_image *image)> +{> + struct par_info *p = (struct par_info *)info->par;> + u32 bg_col = 0, fg_col = 0;> +> + if ((smtc_2Dacceleration) && (image->depth == 1)) {> + if (smtc_de_busy)> + deWaitForNotBusy();> +> + switch (info->var.bits_per_pixel) {> + case 8:> + bg_col = image->bg_color;> + fg_col = image->fg_color;> + break;> + case 16:> + bg_col => + ((u32 *) (info->pseudo_palette))[image->bg_color];> + fg_col => + ((u32 *) (info->pseudo_palette))[image->fg_color];> + break;> + case 32:> + bg_col => + ((u32 *) (info->pseudo_palette))[image->bg_color];> + fg_col => + ((u32 *) (info->pseudo_palette))[image->fg_color];> + break;> + }> +> + deSystemMem2VideoMemMonoBlt(> + image->data,> + image->width / 8,> + 0,> + p->BaseAddressInVRAM,> + 0,> + 0,> + image->dx, image->dy,> + image->width, image->height,> + fg_col, bg_col,> + 0x0C);> +> + } else> + cfb_imageblit(info, image);> +}> +> +static struct fb_ops smtcfb_ops = {> + .owner = THIS_MODULE,> + .fb_setcolreg = smtc_setcolreg,> + .fb_fillrect = smtcfb_fillrect,> + .fb_imageblit = smtcfb_imageblit,> + .fb_copyarea = smtcfb_copyarea,> +#ifdef __BIG_ENDIAN> + .fb_read = smtcfb_read,> + .fb_write = smtcfb_write,> +#endif> +> +};> +> +void smtcfb_setmode(struct smtcfb_info *sfb)> +{> + switch (sfb->fb.var.bits_per_pixel) {> + case 32:> + sfb->fb.fix.visual = FB_VISUAL_TRUECOLOR;> + sfb->fb.fix.line_length = sfb->fb.var.xres * 4;> + sfb->fb.var.red.length = 8;> + sfb->fb.var.green.length = 8;> + sfb->fb.var.blue.length = 8;> + sfb->fb.var.red.offset = 16;> + sfb->fb.var.green.offset = 8;> + sfb->fb.var.blue.offset = 0;> +> + break;> + case 8:> + sfb->fb.fix.visual = FB_VISUAL_PSEUDOCOLOR;> + sfb->fb.fix.line_length = sfb->fb.var.xres;> + sfb->fb.var.red.offset = 5;> + sfb->fb.var.red.length = 3;> + sfb->fb.var.green.offset = 2;> + sfb->fb.var.green.length = 3;> + sfb->fb.var.blue.offset = 0;> + sfb->fb.var.blue.length = 2;> + break;> + case 24:> + sfb->fb.fix.visual = FB_VISUAL_TRUECOLOR;> + sfb->fb.fix.line_length = sfb->fb.var.xres * 3;> + sfb->fb.var.red.length = 8;> + sfb->fb.var.green.length = 8;> + sfb->fb.var.blue.length = 8;> +> + sfb->fb.var.red.offset = 16;> + sfb->fb.var.green.offset = 8;> + sfb->fb.var.blue.offset = 0;> +> + break;> + case 16:> + default:> + sfb->fb.fix.visual = FB_VISUAL_TRUECOLOR;> + sfb->fb.fix.line_length = sfb->fb.var.xres * 2;> +> + sfb->fb.var.red.length = 5;> + sfb->fb.var.green.length = 6;> + sfb->fb.var.blue.length = 5;> +> + sfb->fb.var.red.offset = 11;> + sfb->fb.var.green.offset = 5;> + sfb->fb.var.blue.offset = 0;> +> + break;> + }> +> + hw.width = sfb->fb.var.xres;> + hw.height = sfb->fb.var.yres;> + hw.hz = 60;> + smtc_set_timing(sfb, &hw);> + if (smtc_2Dacceleration) {> + printk("2D acceleration enabled!\n");> + /* Init smtc drawing engine */> + deInit(sfb->fb.var.xres, sfb->fb.var.yres,> + sfb->fb.var.bits_per_pixel);> + }> +}> +> +#if defined(CONFIG_FB_SM7XX_DUALHEAD)> +void smtc_head2_init(struct smtcfb_info *sfb)> +{> + smtcfb_info2 = *sfb;> + smtcfb_info2.fb.pseudo_palette = &colreg2;> + smtcfb_info2.fb.par = &hw2;> + sprintf(smtcfb_info2.fb.fix.id, "sm%Xfb2", hw.chipID);> + hw2.chipID = hw.chipID;> + hw2.chipRevID = hw.chipRevID;> + hw2.width = smtcfb_info2.fb.var.xres;> + hw2.height = smtcfb_info2.fb.var.yres;> + hw2.hz = 60;> + hw2.m_pMMIO = smtc_RegBaseAddress;> +> + /*hard code 2nd head starting from half VRAM size postion */> + hw2.BaseAddressInVRAM = smtcfb_info2.fb.fix.smem_len / 2;> +> + hw2.m_pLFB = smtc_VRAMBaseAddress + hw2.BaseAddressInVRAM;> + smtcfb_info2.fb.screen_base = hw2.m_pLFB;> +> + writel(hw2.BaseAddressInVRAM >> 3, hw2.m_pVPR + 0x10);> +}> +#endif> +> +/*> + * Alloc struct smtcfb_info and assign the default value> + */> +static struct smtcfb_info *__devinit smtc_alloc_fb_info(struct pci_dev *dev,> + char *name)> +{> + struct smtcfb_info *sfb;> +> + sfb = kmalloc(sizeof(struct smtcfb_info), GFP_KERNEL);> +> + if (!sfb)> + return NULL;> +> + memset(sfb, 0, sizeof(struct smtcfb_info));> +> + sfb->currcon = -1;> + sfb->dev = dev;> +> + /*** Init sfb->fb with default value ***/> + sfb->fb.flags = FBINFO_FLAG_DEFAULT;> + sfb->fb.fbops = &smtcfb_ops;> + sfb->fb.var = smtcfb_var;> + sfb->fb.fix = smtcfb_fix;> +> + strcpy(sfb->fb.fix.id, name);> +> + sfb->fb.fix.type = FB_TYPE_PACKED_PIXELS;> + sfb->fb.fix.type_aux = 0;> + sfb->fb.fix.xpanstep = 0;> + sfb->fb.fix.ypanstep = 0;> + sfb->fb.fix.ywrapstep = 0;> + sfb->fb.fix.accel = FB_ACCEL_SMI_LYNX;> +> + sfb->fb.var.nonstd = 0;> + sfb->fb.var.activate = FB_ACTIVATE_NOW;> + sfb->fb.var.height = -1;> + sfb->fb.var.width = -1;> + /* text mode acceleration */> + sfb->fb.var.accel_flags = FB_ACCELF_TEXT;> + sfb->fb.var.vmode = FB_VMODE_NONINTERLACED;> + sfb->fb.par = &hw;> + sfb->fb.pseudo_palette = colreg;> +> + return sfb;> +}> +> +/*> + * Unmap in the memory mapped IO registers> + */> +> +static void __devinit smtc_unmap_mmio(struct smtcfb_info *sfb)> +{> + if (sfb && smtc_RegBaseAddress)> + smtc_RegBaseAddress = NULL;> +}> +> +/*> + * Map in the screen memory> + */> +> +static int __devinit smtc_map_smem(struct smtcfb_info *sfb,> + struct pci_dev *dev, u_long smem_len)> +{> + if (sfb->fb.var.bits_per_pixel == 32) {> +#ifdef __BIG_ENDIAN> + sfb->fb.fix.smem_start = pci_resource_start(dev, 0)> + + 0x800000;> +#else> + sfb->fb.fix.smem_start = pci_resource_start(dev, 0);> +#endif> + } else {> + sfb->fb.fix.smem_start = pci_resource_start(dev, 0);> + }> +> + sfb->fb.fix.smem_len = smem_len;> +> + sfb->fb.screen_base = smtc_VRAMBaseAddress;> +> + if (!sfb->fb.screen_base) {> + printk(KERN_INFO "%s: unable to map screen memory\n",> + sfb->fb.fix.id);> + return -ENOMEM;> + }> +> + return 0;> +}> +> +/*> + * Unmap in the screen memory> + *> + */> +static void __devinit smtc_unmap_smem(struct smtcfb_info *sfb)> +{> + if (sfb && sfb->fb.screen_base) {> + iounmap(sfb->fb.screen_base);> + sfb->fb.screen_base = NULL;> + }> +}> +> +/*> + * We need to wake up the LynxEM+, and make sure its in linear memory mode.> + */> +static inline void __devinit sm7xx_init_hw(void)> +{> + outb_p(0x18, 0x3c4);> + outb_p(0x11, 0x3c5);> +}> +> +static void __devinit smtc_free_fb_info(struct smtcfb_info *sfb)> +{> + if (sfb) {> + fb_alloc_cmap(&sfb->fb.cmap, 0, 0);> + kfree(sfb);> + }> +}> +> +static int __init smtcfb_init(void)> +{> + struct smtcfb_info *sfb;> + u_long smem_size = 0x00800000; /* default 8MB */> + char name[16];> + int err, i = 0;> + unsigned long pFramebufferPhysical;> + struct pci_dev *pdev = NULL;> +> + printk(KERN_INFO> + "Silicon Motion display driver " SMTC_LINUX_FB_VERSION "\n");> +> + /* init the global variable */> + smtc_2Dacceleration = 0; /* default no 2D acceleration */> +> + do {> + pdev = pci_get_device(0x126f, smtc_ChipIDs[i], pdev);> + if (pdev == NULL) {> + i++;> + } else {> + hw.chipID = smtc_ChipIDs[i];> + break;> + }> + } while (i < numSMTCchipIDs);> +> + err = pci_enable_device(pdev); /* enable SMTC chip */> +> + if (err)> + return err;> +> + err = -ENOMEM;> +> + sprintf(name, "sm%Xfb", hw.chipID);> +> + sfb = smtc_alloc_fb_info(pdev, name);> +> + if (!sfb)> + goto failed;> +> + sm7xx_init_hw();> +> + /*get mode parameter from screen_info */> + if (screen_info.lfb_width != 0) {> + sfb->fb.var.xres = screen_info.lfb_width;> + sfb->fb.var.yres = screen_info.lfb_height;> + sfb->fb.var.bits_per_pixel = screen_info.lfb_depth;> + } else {> + /* default resolution 1024x600 16bit mode */> + sfb->fb.var.xres = SCREEN_X_RES;> + sfb->fb.var.yres = SCREEN_Y_RES;> + sfb->fb.var.bits_per_pixel = SCREEN_BPP;> + }> +> + smdbg("\nsfb->fb.var.bits_per_pixel = %d sm712be_flag = %d\n",> + sfb->fb.var.bits_per_pixel, sm712be_flag);> +#ifdef __BIG_ENDIAN> + if (sm712be_flag == 1 && sfb->fb.var.bits_per_pixel == 24)> + sfb->fb.var.bits_per_pixel = (screen_info.lfb_depth = 32);> +#endif> + /* Map address and memory detection */> + pFramebufferPhysical = pci_resource_start(pdev, 0);> + pci_read_config_byte(pdev, PCI_REVISION_ID, &hw.chipRevID);> +> + switch (hw.chipID) {> + case 0x710:> + case 0x712:> + sfb->fb.fix.mmio_start = pFramebufferPhysical + 0x00400000;> + sfb->fb.fix.mmio_len = 0x00400000;> + smem_size = SM712_VIDEOMEMORYSIZE;> +#ifdef __BIG_ENDIAN> + hw.m_pLFB = (smtc_VRAMBaseAddress => + ioremap(pFramebufferPhysical, 0x00c00000));> +#else> + hw.m_pLFB = (smtc_VRAMBaseAddress => + ioremap(pFramebufferPhysical, 0x00800000));> +#endif> + hw.m_pMMIO = (smtc_RegBaseAddress => + smtc_VRAMBaseAddress + 0x00700000);> + smtc_2DBaseAddress = (hw.m_pDPR => + smtc_VRAMBaseAddress + 0x00408000);> + smtc_2Ddataport = smtc_VRAMBaseAddress + DE_DATA_PORT_712;> + hw.m_pVPR = hw.m_pLFB + 0x0040c000;> + if (sfb->fb.var.bits_per_pixel == 32) {> +#ifdef __BIG_ENDIAN> + smtc_VRAMBaseAddress += 0x800000;> + hw.m_pLFB += 0x800000;> + printk(KERN_INFO> + "\nsmtc_VRAMBaseAddress=0x%X hw.m_pLFB=0x%X\n",> + smtc_VRAMBaseAddress, hw.m_pLFB);> +#endif> + }> + if (!smtc_RegBaseAddress) {> +> + printk(KERN_INFO> + "%s: unable to map memory mapped IO\n",> + sfb->fb.fix.id);> +> + return -ENOMEM;> + }> +> + /* set MCLK = 14.31818 * (0x16 / 0x2) */> + smtc_seqw(0x6a, 0x16);> + smtc_seqw(0x6b, 0x02);> + smtc_seqw(0x62, 0x3e);> + /* enable PCI burst */> + smtc_seqw(0x17, 0x20);> + /* enabel word swap */> + if (sfb->fb.var.bits_per_pixel == 32) {> +#ifdef __BIG_ENDIAN> + smtc_seqw(0x17, 0x30);> +#endif> + }> +#ifdef CONFIG_FB_SM7XX_ACCEL> + smtc_2Dacceleration = 1;> +#endif> +> + break;> +> + case 0x720:> + sfb->fb.fix.mmio_start = pFramebufferPhysical;> + sfb->fb.fix.mmio_len = 0x00200000;> + smem_size = SM722_VIDEOMEMORYSIZE;> + smtc_2DBaseAddress = (hw.m_pDPR => + ioremap(pFramebufferPhysical, 0x00a00000));> + hw.m_pLFB = (smtc_VRAMBaseAddress => + smtc_2DBaseAddress + 0x00200000);> + hw.m_pMMIO = (smtc_RegBaseAddress => + smtc_2DBaseAddress + 0x000c0000);> + smtc_2Ddataport = smtc_2DBaseAddress + DE_DATA_PORT_722;> + hw.m_pVPR = smtc_2DBaseAddress + 0x800;> +> + smtc_seqw(0x62, 0xff);> + smtc_seqw(0x6a, 0x0d);> + smtc_seqw(0x6b, 0x02);> + smtc_2Dacceleration = 0;> + break;> + default:> + printk(KERN_INFO> + "No valid Silicon Motion display chip was detected!\n");> +> + smtc_free_fb_info(sfb);> + return err;> + }> +> + /* can support 32 bpp */> + if (15 == sfb->fb.var.bits_per_pixel)> + sfb->fb.var.bits_per_pixel = 16;> +> + sfb->fb.var.xres_virtual = sfb->fb.var.xres;> +> + sfb->fb.var.yres_virtual = sfb->fb.var.yres;> + err = smtc_map_smem(sfb, pdev, smem_size);> + if (err)> + goto failed;> +> + smtcfb_setmode(sfb);> + /* Primary display starting from 0 postion */> + hw.BaseAddressInVRAM = 0;> + sfb->fb.par = &hw;> +> + err = register_framebuffer(&sfb->fb);> + if (err < 0)> + goto failed;> +> + printk(KERN_INFO "Silicon Motion SM%X Rev%X primary display mode"> + "%dx%d-%d Init Complete.\n", hw.chipID, hw.chipRevID,> + sfb->fb.var.xres, sfb->fb.var.yres,> + sfb->fb.var.bits_per_pixel);> +> +#if defined(CONFIG_FB_SM7XX_DUALHEAD)> + smtc_head2_init(sfb);> + err = register_framebuffer(&smtcfb_info2.fb);> +> + /* if second head display fails, also fails the primary display */> + if (err < 0) {> + printk(KERN_INFO> + "Silicon Motion, Inc. second head init fail\n");> + goto failed;> + }> +> + printk(KERN_INFO "Silicon Motion SM%X Rev%X secondary display mode"> + "%dx%d-%d Init Complete.\n", hw.chipID, hw.chipRevID,> + hw2.width, hw2.height,> + smtcfb_info2.fb.var.bits_per_pixel);> +#endif> +> + return 0;> +> + failed:> + printk(KERN_INFO "Silicon Motion, Inc. primary display init fail\n");> +> + smtc_unmap_smem(sfb);> + smtc_unmap_mmio(sfb);> + smtc_free_fb_info(sfb);> +> + return err;> +}> +> +static void __exit smtcfb_exit(void)> +{> +}> +> +module_init(smtcfb_init);> +module_exit(smtcfb_exit);> +> +/*> + * sm712be_setup - process command line options> + * @options: string of options> + * Returns zero.> + *> + */> +static int __init sm712be_setup(char *options)> +{> + int retval = 0;> + sm712be_flag = 0;> + if (!options || !*options) {> + retval = 1;> + smdbg("\n No sm712be parameter\n", __LINE__);> + }> + if (!retval && strstr(options, "enable"))> + sm712be_flag = 1;> + smdbg("\nsm712be_setup = %s sm712be_flag = %d\n", options,> + sm712be_flag);> + return 1;> +}> +> +__setup("sm712be=", sm712be_setup);> +> +#ifdef __BIG_ENDIAN> +/*> + * sm712vga_setup - process command line options, get vga parameter> + * @options: string of options> + * Returns zero.> + *> + */> +static int __init sm712vga_setup(char *options)> +{> + int retval = 0;> + int index;> + sm712be_flag = 0;> +> + if (!options || !*options) {> + retval = 1;> + smdbg("\n No vga parameter\n", __LINE__);> + }> +> + screen_info.lfb_width = 0;> + screen_info.lfb_height = 0;> + screen_info.lfb_depth = 0;> +> + for (index = 0;> + index < (sizeof(vesa_mode) / sizeof(struct vesa_mode_table));> + index++) {> + if (strstr(options, vesa_mode[index].mode_index)) {> + screen_info.lfb_width = vesa_mode[index].lfb_width;> + screen_info.lfb_height = vesa_mode[index].lfb_height;> + screen_info.lfb_depth = vesa_mode[index].lfb_depth;> + }> + }> + smdbg("\nsm712vga_setup = %s\n", options);> + return 1;> +}> +> +__setup("vga=", sm712vga_setup);> +#endif> +> +MODULE_AUTHOR("Siliconmotion ");> +MODULE_DESCRIPTION("Framebuffer driver for SMI Graphic Cards");> +MODULE_LICENSE("GPL");> diff --git a/drivers/video/smi/smtcfb.h b/drivers/video/smi/smtcfb.h> new file mode 100644> index 0000000..6b8ed8a> --- /dev/null> +++ b/drivers/video/smi/smtcfb.h> @@ -0,0 +1,793 @@> +/*> + * smtcfb.h -- Silicon Motion SM501 and SM7xx frame buffer device> + *> + * Copyright (C) 2006 Silicon Motion Technology Corp.> + * Authors: Ge Wang, gewang@xxxxxxxxxxxxxxxxx> + * Boyod boyod.yang@xxxxxxxxxxxxxxxxxxxx> + *> + * Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology> + * Author: Wu Zhangjin, wuzj@xxxxxxxxxx> + *> + * This file is subject to the terms and conditions of the GNU General Public> + * License. See the file COPYING in the main directory of this archive for> + * more details.> + */> +> +#define SMTC_LINUX_FB_VERSION "version 0.11.2619.21.01 July 27, 2008"> +> +#define NR_PALETTE 256> +#define NR_RGB 2> +> +#define FB_ACCEL_SMI_LYNX 88> +> +#ifdef __BIG_ENDIAN> +#define PC_VGA 0> +#else> +#define PC_VGA 1> +#endif> +> +#define SCREEN_X_RES 1024> +#define SCREEN_Y_RES 600> +#define SCREEN_BPP 16> +> +#ifndef FIELD_OFFSET> +#define FIELD_OFSFET(type, field) \> + ((unsigned long) (PUCHAR) & (((type *)0)->field))> +#endif> +> +/*Assume SM712 graphics chip has 4MB VRAM */> +#define SM712_VIDEOMEMORYSIZE 0x00400000> +/*Assume SM722 graphics chip has 8MB VRAM */> +#define SM722_VIDEOMEMORYSIZE 0x00800000> +> +#define dac_reg (0x3c8)> +#define dac_val (0x3c9)> +> +extern char *smtc_RegBaseAddress;> +#define smtc_mmiowb(dat, reg) writeb(dat, smtc_RegBaseAddress + reg)> +#define smtc_mmioww(dat, reg) writew(dat, smtc_RegBaseAddress + reg)> +#define smtc_mmiowl(dat, reg) writel(dat, smtc_RegBaseAddress + reg)> +> +#define smtc_mmiorb(reg) readb(smtc_RegBaseAddress + reg)> +#define smtc_mmiorw(reg) readw(smtc_RegBaseAddress + reg)> +#define smtc_mmiorl(reg) readl(smtc_RegBaseAddress + reg)> +> +#define SIZE_SR00_SR04 (0x04 - 0x00 + 1)> +#define SIZE_SR10_SR24 (0x24 - 0x10 + 1)> +#define SIZE_SR30_SR75 (0x75 - 0x30 + 1)> +#define SIZE_SR80_SR93 (0x93 - 0x80 + 1)> +#define SIZE_SRA0_SRAF (0xAF - 0xA0 + 1)> +#define SIZE_GR00_GR08 (0x08 - 0x00 + 1)> +#define SIZE_AR00_AR14 (0x14 - 0x00 + 1)> +#define SIZE_CR00_CR18 (0x18 - 0x00 + 1)> +#define SIZE_CR30_CR4D (0x4D - 0x30 + 1)> +#define SIZE_CR90_CRA7 (0xA7 - 0x90 + 1)> +#define SIZE_VPR (0x6C + 1)> +#define SIZE_DPR (0x44 + 1)> +> +static inline void smtc_crtcw(int reg, int val)> +{> + smtc_mmiowb(reg, 0x3d4);> + smtc_mmiowb(val, 0x3d5);> +}> +> +static inline unsigned int smtc_crtcr(int reg)> +{> + smtc_mmiowb(reg, 0x3d4);> + return smtc_mmiorb(0x3d5);> +}> +> +static inline void smtc_grphw(int reg, int val)> +{> + smtc_mmiowb(reg, 0x3ce);> + smtc_mmiowb(val, 0x3cf);> +}> +> +static inline unsigned int smtc_grphr(int reg)> +{> + smtc_mmiowb(reg, 0x3ce);> + return smtc_mmiorb(0x3cf);> +}> +> +static inline void smtc_attrw(int reg, int val)> +{> + smtc_mmiorb(0x3da);> + smtc_mmiowb(reg, 0x3c0);> + smtc_mmiorb(0x3c1);> + smtc_mmiowb(val, 0x3c0);> +}> +> +static inline void smtc_seqw(int reg, int val)> +{> + smtc_mmiowb(reg, 0x3c4);> + smtc_mmiowb(val, 0x3c5);> +}> +> +static inline unsigned int smtc_seqr(int reg)> +{> + smtc_mmiowb(reg, 0x3c4);> + return smtc_mmiorb(0x3c5);> +}> +> +/* The next structure holds all information relevant for a specific video mode.> + */> +> +struct ModeInit {> + int mmSizeX;> + int mmSizeY;> + int bpp;> + int hz;> + unsigned char Init_MISC;> + unsigned char Init_SR00_SR04[SIZE_SR00_SR04];> + unsigned char Init_SR10_SR24[SIZE_SR10_SR24];> + unsigned char Init_SR30_SR75[SIZE_SR30_SR75];> + unsigned char Init_SR80_SR93[SIZE_SR80_SR93];> + unsigned char Init_SRA0_SRAF[SIZE_SRA0_SRAF];> + unsigned char Init_GR00_GR08[SIZE_GR00_GR08];> + unsigned char Init_AR00_AR14[SIZE_AR00_AR14];> + unsigned char Init_CR00_CR18[SIZE_CR00_CR18];> + unsigned char Init_CR30_CR4D[SIZE_CR30_CR4D];> + unsigned char Init_CR90_CRA7[SIZE_CR90_CRA7];> +};> +> +/**********************************************************************> + SM712 Mode table.> + **********************************************************************/> +struct ModeInit VGAMode[] = {> + {> + /* mode#0: 640 x 480 16Bpp 60Hz */> + 640, 480, 16, 60,> + /* Init_MISC */> + 0xE3,> + { /* Init_SR0_SR4 */> + 0x03, 0x01, 0x0F, 0x00, 0x0E,> + },> + { /* Init_SR10_SR24 */> + 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C,> + 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,> + 0xC4, 0x30, 0x02, 0x01, 0x01,> + },> + { /* Init_SR30_SR75 */> + 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32,> + 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF,> + 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,> + 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32,> + 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA,> + 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32,> + 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,> + 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04,> + 0x00, 0x45, 0x30, 0x30, 0x40, 0x30,> + },> + { /* Init_SR80_SR93 */> + 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32,> + 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32,> + 0x00, 0x00, 0x00, 0x00,> + },> + { /* Init_SRA0_SRAF */> + 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,> + 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF,> + },> + { /* Init_GR00_GR08 */> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,> + 0xFF,> + },> + { /* Init_AR00_AR14 */> + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,> + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,> + 0x41, 0x00, 0x0F, 0x00, 0x00,> + },> + { /* Init_CR00_CR18 */> + 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E,> + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,> + 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3,> + 0xFF,> + },> + { /* Init_CR30_CR4D */> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20,> + 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD,> + 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00,> + 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF,> + },> + { /* Init_CR90_CRA7 */> + 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55,> + 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00,> + 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00,> + },> + },> + {> + /* mode#1: 640 x 480 24Bpp 60Hz */> + 640, 480, 24, 60,> + /* Init_MISC */> + 0xE3,> + { /* Init_SR0_SR4 */> + 0x03, 0x01, 0x0F, 0x00, 0x0E,> + },> + { /* Init_SR10_SR24 */> + 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C,> + 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,> + 0xC4, 0x30, 0x02, 0x01, 0x01,> + },> + { /* Init_SR30_SR75 */> + 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32,> + 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF,> + 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,> + 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32,> + 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA,> + 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32,> + 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,> + 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04,> + 0x00, 0x45, 0x30, 0x30, 0x40, 0x30,> + },> + { /* Init_SR80_SR93 */> + 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32,> + 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32,> + 0x00, 0x00, 0x00, 0x00,> + },> + { /* Init_SRA0_SRAF */> + 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,> + 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF,> + },> + { /* Init_GR00_GR08 */> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,> + 0xFF,> + },> + { /* Init_AR00_AR14 */> + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,> + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,> + 0x41, 0x00, 0x0F, 0x00, 0x00,> + },> + { /* Init_CR00_CR18 */> + 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E,> + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,> + 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3,> + 0xFF,> + },> + { /* Init_CR30_CR4D */> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20,> + 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD,> + 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00,> + 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF,> + },> + { /* Init_CR90_CRA7 */> + 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55,> + 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00,> + 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00,> + },> + },> + {> + /* mode#0: 640 x 480 32Bpp 60Hz */> + 640, 480, 32, 60,> + /* Init_MISC */> + 0xE3,> + { /* Init_SR0_SR4 */> + 0x03, 0x01, 0x0F, 0x00, 0x0E,> + },> + { /* Init_SR10_SR24 */> + 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C,> + 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,> + 0xC4, 0x30, 0x02, 0x01, 0x01,> + },> + { /* Init_SR30_SR75 */> + 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32,> + 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF,> + 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,> + 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32,> + 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA,> + 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32,> + 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,> + 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04,> + 0x00, 0x45, 0x30, 0x30, 0x40, 0x30,> + },> + { /* Init_SR80_SR93 */> + 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32,> + 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32,> + 0x00, 0x00, 0x00, 0x00,> + },> + { /* Init_SRA0_SRAF */> + 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,> + 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF,> + },> + { /* Init_GR00_GR08 */> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,> + 0xFF,> + },> + { /* Init_AR00_AR14 */> + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,> + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,> + 0x41, 0x00, 0x0F, 0x00, 0x00,> + },> + { /* Init_CR00_CR18 */> + 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E,> + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,> + 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3,> + 0xFF,> + },> + { /* Init_CR30_CR4D */> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20,> + 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD,> + 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00,> + 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF,> + },> + { /* Init_CR90_CRA7 */> + 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55,> + 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00,> + 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00,> + },> + },> +> + { /* mode#2: 800 x 600 16Bpp 60Hz */> + 800, 600, 16, 60,> + /* Init_MISC */> + 0x2B,> + { /* Init_SR0_SR4 */> + 0x03, 0x01, 0x0F, 0x03, 0x0E,> + },> + { /* Init_SR10_SR24 */> + 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C,> + 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,> + 0xC4, 0x30, 0x02, 0x01, 0x01,> + },> + { /* Init_SR30_SR75 */> + 0x34, 0x03, 0x20, 0x09, 0xC0, 0x24, 0x24, 0x24,> + 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x03, 0xFF,> + 0x00, 0xFC, 0x00, 0x00, 0x20, 0x38, 0x00, 0xFC,> + 0x20, 0x0C, 0x44, 0x20, 0x00, 0x24, 0x24, 0x24,> + 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58,> + 0x04, 0x55, 0x59, 0x24, 0x24, 0x00, 0x00, 0x24,> + 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00,> + 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13,> + 0x02, 0x45, 0x30, 0x35, 0x40, 0x20,> + },> + { /* Init_SR80_SR93 */> + 0x00, 0x00, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x24,> + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x24, 0x24,> + 0x00, 0x00, 0x00, 0x00,> + },> + { /* Init_SRA0_SRAF */> + 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,> + 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF,> + },> + { /* Init_GR00_GR08 */> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,> + 0xFF,> + },> + { /* Init_AR00_AR14 */> + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,> + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,> + 0x41, 0x00, 0x0F, 0x00, 0x00,> + },> + { /* Init_CR00_CR18 */> + 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0,> + 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,> + 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3,> + 0xFF,> + },> + { /* Init_CR30_CR4D */> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20,> + 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD,> + 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00,> + 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57,> + },> + { /* Init_CR90_CRA7 */> + 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA,> + 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00,> + 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00,> + },> + },> + { /* mode#3: 800 x 600 24Bpp 60Hz */> + 800, 600, 24, 60,> + 0x2B,> + { /* Init_SR0_SR4 */> + 0x03, 0x01, 0x0F, 0x03, 0x0E,> + },> + { /* Init_SR10_SR24 */> + 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C,> + 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,> + 0xC4, 0x30, 0x02, 0x01, 0x01,> + },> + { /* Init_SR30_SR75 */> + 0x36, 0x03, 0x20, 0x09, 0xC0, 0x36, 0x36, 0x36,> + 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x03, 0xFF,> + 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,> + 0x20, 0x0C, 0x44, 0x20, 0x00, 0x36, 0x36, 0x36,> + 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58,> + 0x04, 0x55, 0x59, 0x36, 0x36, 0x00, 0x00, 0x36,> + 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,> + 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13,> + 0x02, 0x45, 0x30, 0x30, 0x40, 0x20,> + },> + { /* Init_SR80_SR93 */> + 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x36,> + 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x36, 0x36,> + 0x00, 0x00, 0x00, 0x00,> + },> + { /* Init_SRA0_SRAF */> + 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,> + 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF,> + },> + { /* Init_GR00_GR08 */> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,> + 0xFF,> + },> + { /* Init_AR00_AR14 */> + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,> + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,> + 0x41, 0x00, 0x0F, 0x00, 0x00,> + },> + { /* Init_CR00_CR18 */> + 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0,> + 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,> + 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3,> + 0xFF,> + },> + { /* Init_CR30_CR4D */> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20,> + 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD,> + 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00,> + 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57,> + },> + { /* Init_CR90_CRA7 */> + 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA,> + 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00,> + 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00,> + },> + },> + { /* mode#7: 800 x 600 32Bpp 60Hz */> + 800, 600, 32, 60,> + /* Init_MISC */> + 0x2B,> + { /* Init_SR0_SR4 */> + 0x03, 0x01, 0x0F, 0x03, 0x0E,> + },> + { /* Init_SR10_SR24 */> + 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C,> + 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,> + 0xC4, 0x30, 0x02, 0x01, 0x01,> + },> + { /* Init_SR30_SR75 */> + 0x34, 0x03, 0x20, 0x09, 0xC0, 0x24, 0x24, 0x24,> + 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x03, 0xFF,> + 0x00, 0xFC, 0x00, 0x00, 0x20, 0x38, 0x00, 0xFC,> + 0x20, 0x0C, 0x44, 0x20, 0x00, 0x24, 0x24, 0x24,> + 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58,> + 0x04, 0x55, 0x59, 0x24, 0x24, 0x00, 0x00, 0x24,> + 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00,> + 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13,> + 0x02, 0x45, 0x30, 0x35, 0x40, 0x20,> + },> + { /* Init_SR80_SR93 */> + 0x00, 0x00, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x24,> + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x24, 0x24,> + 0x00, 0x00, 0x00, 0x00,> + },> + { /* Init_SRA0_SRAF */> + 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,> + 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF,> + },> + { /* Init_GR00_GR08 */> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,> + 0xFF,> + },> + { /* Init_AR00_AR14 */> + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,> + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,> + 0x41, 0x00, 0x0F, 0x00, 0x00,> + },> + { /* Init_CR00_CR18 */> + 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0,> + 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,> + 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3,> + 0xFF,> + },> + { /* Init_CR30_CR4D */> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20,> + 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD,> + 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00,> + 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57,> + },> + { /* Init_CR90_CRA7 */> + 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA,> + 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00,> + 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00,> + },> + },> + /* We use 1024x768 table to light 1024x600 panel for lemote */> + { /* mode#4: 1024 x 600 16Bpp 60Hz */> + 1024, 600, 16, 60,> + /* Init_MISC */> + 0xEB,> + { /* Init_SR0_SR4 */> + 0x03, 0x01, 0x0F, 0x00, 0x0E,> + },> + { /* Init_SR10_SR24 */> + 0xC8, 0x40, 0x14, 0x60, 0x00, 0x0A, 0x17, 0x20,> + 0x51, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,> + 0xC4, 0x30, 0x02, 0x00, 0x01,> + },> + { /* Init_SR30_SR75 */> + 0x22, 0x03, 0x24, 0x09, 0xC0, 0x22, 0x22, 0x22,> + 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x03, 0xFF,> + 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,> + 0x20, 0x0C, 0x44, 0x20, 0x00, 0x22, 0x22, 0x22,> + 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03,> + 0x00, 0x60, 0x59, 0x22, 0x22, 0x00, 0x00, 0x22,> + 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00,> + 0x50, 0x03, 0x16, 0x02, 0x0D, 0x82, 0x09, 0x02,> + 0x04, 0x45, 0x3F, 0x30, 0x40, 0x20,> + },> + { /* Init_SR80_SR93 */> + 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A,> + 0xF7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3A, 0x3A,> + 0x00, 0x00, 0x00, 0x00,> + },> + { /* Init_SRA0_SRAF */> + 0x00, 0xFB, 0x9F, 0x01, 0x00, 0xED, 0xED, 0xED,> + 0x7B, 0xFB, 0xFF, 0xFF, 0x97, 0xEF, 0xBF, 0xDF,> + },> + { /* Init_GR00_GR08 */> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,> + 0xFF,> + },> + { /* Init_AR00_AR14 */> + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,> + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,> + 0x41, 0x00, 0x0F, 0x00, 0x00,> + },> + { /* Init_CR00_CR18 */> + 0xA3, 0x7F, 0x7F, 0x00, 0x85, 0x16, 0x24, 0xF5,> + 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,> + 0x03, 0x09, 0xFF, 0x80, 0x40, 0xFF, 0x00, 0xE3,> + 0xFF,> + },> + { /* Init_CR30_CR4D */> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20,> + 0x00, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xBF, 0xFF,> + 0xA3, 0x7F, 0x00, 0x82, 0x0b, 0x6f, 0x57, 0x00,> + 0x5c, 0x0f, 0xE0, 0xe0, 0x7F, 0x57,> + },> + { /* Init_CR90_CRA7 */> + 0x55, 0xD9, 0x5D, 0xE1, 0x86, 0x1B, 0x8E, 0x26,> + 0xDA, 0x8D, 0xDE, 0x94, 0x00, 0x00, 0x18, 0x00,> + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03,> + },> + },> + { /* mode#5: 1024 x 768 24Bpp 60Hz */> + 1024, 768, 24, 60,> + /* Init_MISC */> + 0xEB,> + { /* Init_SR0_SR4 */> + 0x03, 0x01, 0x0F, 0x03, 0x0E,> + },> + { /* Init_SR10_SR24 */> + 0xF3, 0xB6, 0xC0, 0xDD, 0x00, 0x0E, 0x17, 0x2C,> + 0x99, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,> + 0xC4, 0x30, 0x02, 0x01, 0x01,> + },> + { /* Init_SR30_SR75 */> + 0x38, 0x03, 0x20, 0x09, 0xC0, 0x3A, 0x3A, 0x3A,> + 0x3A, 0x3A, 0x3A, 0x3A, 0x00, 0x00, 0x03, 0xFF,> + 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,> + 0x20, 0x0C, 0x44, 0x20, 0x00, 0x00, 0x00, 0x3A,> + 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03,> + 0x00, 0x60, 0x59, 0x3A, 0x3A, 0x00, 0x00, 0x3A,> + 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,> + 0x50, 0x03, 0x74, 0x14, 0x3B, 0x0D, 0x09, 0x02,> + 0x04, 0x45, 0x30, 0x30, 0x40, 0x20,> + },> + { /* Init_SR80_SR93 */> + 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A,> + 0xF7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3A, 0x3A,> + 0x00, 0x00, 0x00, 0x00,> + },> + { /* Init_SRA0_SRAF */> + 0x00, 0xFB, 0x9F, 0x01, 0x00, 0xED, 0xED, 0xED,> + 0x7B, 0xFB, 0xFF, 0xFF, 0x97, 0xEF, 0xBF, 0xDF,> + },> + { /* Init_GR00_GR08 */> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,> + 0xFF,> + },> + { /* Init_AR00_AR14 */> + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,> + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,> + 0x41, 0x00, 0x0F, 0x00, 0x00,> + },> + { /* Init_CR00_CR18 */> + 0xA3, 0x7F, 0x7F, 0x00, 0x85, 0x16, 0x24, 0xF5,> + 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,> + 0x03, 0x09, 0xFF, 0x80, 0x40, 0xFF, 0x00, 0xE3,> + 0xFF,> + },> + { /* Init_CR30_CR4D */> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20,> + 0x00, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xBF, 0xFF,> + 0xA3, 0x7F, 0x00, 0x86, 0x15, 0x24, 0xFF, 0x00,> + 0x01, 0x07, 0xE5, 0x20, 0x7F, 0xFF,> + },> + { /* Init_CR90_CRA7 */> + 0x55, 0xD9, 0x5D, 0xE1, 0x86, 0x1B, 0x8E, 0x26,> + 0xDA, 0x8D, 0xDE, 0x94, 0x00, 0x00, 0x18, 0x00,> + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03,> + },> + },> + { /* mode#4: 1024 x 768 32Bpp 60Hz */> + 1024, 768, 32, 60,> + /* Init_MISC */> + 0xEB,> + { /* Init_SR0_SR4 */> + 0x03, 0x01, 0x0F, 0x03, 0x0E,> + },> + { /* Init_SR10_SR24 */> + 0xF3, 0xB6, 0xC0, 0xDD, 0x00, 0x0E, 0x17, 0x2C,> + 0x99, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,> + 0xC4, 0x32, 0x02, 0x01, 0x01,> + },> + { /* Init_SR30_SR75 */> + 0x38, 0x03, 0x20, 0x09, 0xC0, 0x3A, 0x3A, 0x3A,> + 0x3A, 0x3A, 0x3A, 0x3A, 0x00, 0x00, 0x03, 0xFF,> + 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,> + 0x20, 0x0C, 0x44, 0x20, 0x00, 0x00, 0x00, 0x3A,> + 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03,> + 0x00, 0x60, 0x59, 0x3A, 0x3A, 0x00, 0x00, 0x3A,> + 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,> + 0x50, 0x03, 0x74, 0x14, 0x3B, 0x0D, 0x09, 0x02,> + 0x04, 0x45, 0x30, 0x30, 0x40, 0x20,> + },> + { /* Init_SR80_SR93 */> + 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A,> + 0xF7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3A, 0x3A,> + 0x00, 0x00, 0x00, 0x00,> + },> + { /* Init_SRA0_SRAF */> + 0x00, 0xFB, 0x9F, 0x01, 0x00, 0xED, 0xED, 0xED,> + 0x7B, 0xFB, 0xFF, 0xFF, 0x97, 0xEF, 0xBF, 0xDF,> + },> + { /* Init_GR00_GR08 */> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,> + 0xFF,> + },> + { /* Init_AR00_AR14 */> + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,> + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,> + 0x41, 0x00, 0x0F, 0x00, 0x00,> + },> + { /* Init_CR00_CR18 */> + 0xA3, 0x7F, 0x7F, 0x00, 0x85, 0x16, 0x24, 0xF5,> + 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,> + 0x03, 0x09, 0xFF, 0x80, 0x40, 0xFF, 0x00, 0xE3,> + 0xFF,> + },> + { /* Init_CR30_CR4D */> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20,> + 0x00, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xBF, 0xFF,> + 0xA3, 0x7F, 0x00, 0x86, 0x15, 0x24, 0xFF, 0x00,> + 0x01, 0x07, 0xE5, 0x20, 0x7F, 0xFF,> + },> + { /* Init_CR90_CRA7 */> + 0x55, 0xD9, 0x5D, 0xE1, 0x86, 0x1B, 0x8E, 0x26,> + 0xDA, 0x8D, 0xDE, 0x94, 0x00, 0x00, 0x18, 0x00,> + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03,> + },> + },> + { /* mode#6: 320 x 240 16Bpp 60Hz */> + 320, 240, 16, 60,> + /* Init_MISC */> + 0xEB,> + { /* Init_SR0_SR4 */> + 0x03, 0x01, 0x0F, 0x03, 0x0E,> + },> + { /* Init_SR10_SR24 */> + 0xF3, 0xB6, 0xC0, 0xDD, 0x00, 0x0E, 0x17, 0x2C,> + 0x99, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,> + 0xC4, 0x32, 0x02, 0x01, 0x01,> + },> + { /* Init_SR30_SR75 */> + 0x38, 0x03, 0x20, 0x09, 0xC0, 0x3A, 0x3A, 0x3A,> + 0x3A, 0x3A, 0x3A, 0x3A, 0x00, 0x00, 0x03, 0xFF,> + 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,> + 0x20, 0x0C, 0x44, 0x20, 0x00, 0x00, 0x00, 0x3A,> + 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03,> + 0x00, 0x60, 0x59, 0x3A, 0x3A, 0x00, 0x00, 0x3A,> + 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,> + 0x50, 0x03, 0x74, 0x14, 0x08, 0x43, 0x08, 0x43,> + 0x04, 0x45, 0x30, 0x30, 0x40, 0x20,> + },> + { /* Init_SR80_SR93 */> + 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A,> + 0xF7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3A, 0x3A,> + 0x00, 0x00, 0x00, 0x00,> + },> + { /* Init_SRA0_SRAF */> + 0x00, 0xFB, 0x9F, 0x01, 0x00, 0xED, 0xED, 0xED,> + 0x7B, 0xFB, 0xFF, 0xFF, 0x97, 0xEF, 0xBF, 0xDF,> + },> + { /* Init_GR00_GR08 */> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,> + 0xFF,> + },> + { /* Init_AR00_AR14 */> + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,> + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,> + 0x41, 0x00, 0x0F, 0x00, 0x00,> + },> + { /* Init_CR00_CR18 */> + 0xA3, 0x7F, 0x7F, 0x00, 0x85, 0x16, 0x24, 0xF5,> + 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,> + 0x03, 0x09, 0xFF, 0x80, 0x40, 0xFF, 0x00, 0xE3,> + 0xFF,> + },> + { /* Init_CR30_CR4D */> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20,> + 0x00, 0x00, 0x30, 0x40, 0x00, 0xFF, 0xBF, 0xFF,> + 0x2E, 0x27, 0x00, 0x2b, 0x0c, 0x0F, 0xEF, 0x00,> + 0xFe, 0x0f, 0x01, 0xC0, 0x27, 0xEF,> + },> + { /* Init_CR90_CRA7 */> + 0x55, 0xD9, 0x5D, 0xE1, 0x86, 0x1B, 0x8E, 0x26,> + 0xDA, 0x8D, 0xDE, 0x94, 0x00, 0x00, 0x18, 0x00,> + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03,> + },> + },> +> + { /* mode#8: 320 x 240 32Bpp 60Hz */> + 320, 240, 32, 60,> + /* Init_MISC */> + 0xEB,> + { /* Init_SR0_SR4 */> + 0x03, 0x01, 0x0F, 0x03, 0x0E,> + },> + { /* Init_SR10_SR24 */> + 0xF3, 0xB6, 0xC0, 0xDD, 0x00, 0x0E, 0x17, 0x2C,> + 0x99, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,> + 0xC4, 0x32, 0x02, 0x01, 0x01,> + },> + { /* Init_SR30_SR75 */> + 0x38, 0x03, 0x20, 0x09, 0xC0, 0x3A, 0x3A, 0x3A,> + 0x3A, 0x3A, 0x3A, 0x3A, 0x00, 0x00, 0x03, 0xFF,> + 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,> + 0x20, 0x0C, 0x44, 0x20, 0x00, 0x00, 0x00, 0x3A,> + 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03,> + 0x00, 0x60, 0x59, 0x3A, 0x3A, 0x00, 0x00, 0x3A,> + 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,> + 0x50, 0x03, 0x74, 0x14, 0x08, 0x43, 0x08, 0x43,> + 0x04, 0x45, 0x30, 0x30, 0x40, 0x20,> + },> + { /* Init_SR80_SR93 */> + 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A,> + 0xF7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3A, 0x3A,> + 0x00, 0x00, 0x00, 0x00,> + },> + { /* Init_SRA0_SRAF */> + 0x00, 0xFB, 0x9F, 0x01, 0x00, 0xED, 0xED, 0xED,> + 0x7B, 0xFB, 0xFF, 0xFF, 0x97, 0xEF, 0xBF, 0xDF,> + },> + { /* Init_GR00_GR08 */> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,> + 0xFF,> + },> + { /* Init_AR00_AR14 */> + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,> + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,> + 0x41, 0x00, 0x0F, 0x00, 0x00,> + },> + { /* Init_CR00_CR18 */> + 0xA3, 0x7F, 0x7F, 0x00, 0x85, 0x16, 0x24, 0xF5,> + 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,> + 0x03, 0x09, 0xFF, 0x80, 0x40, 0xFF, 0x00, 0xE3,> + 0xFF,> + },> + { /* Init_CR30_CR4D */> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20,> + 0x00, 0x00, 0x30, 0x40, 0x00, 0xFF, 0xBF, 0xFF,> + 0x2E, 0x27, 0x00, 0x2b, 0x0c, 0x0F, 0xEF, 0x00,> + 0xFe, 0x0f, 0x01, 0xC0, 0x27, 0xEF,> + },> + { /* Init_CR90_CRA7 */> + 0x55, 0xD9, 0x5D, 0xE1, 0x86, 0x1B, 0x8E, 0x26,> + 0xDA, 0x8D, 0xDE, 0x94, 0x00, 0x00, 0x18, 0x00,> + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03,> + },> + },> +};> +> +#define numVGAModes (sizeof(VGAMode) / sizeof(struct ModeInit))> --> 1.6.0.4 Gr{oetje,eeting}s, Geert --Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx In personal conversations with technical people, I call myself a hacker. Butwhen I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds