/*
* Silicon Motion SM7XX 2D drawing engine functions.
*
* Copyright (C) 2006 Silicon Motion Technology Corp.
* Author: Boyod boyod.yang@siliconmotion.com.cn
*
* Copyright (C) 2009 Lemote, Inc.
* Author: Wu Zhangjin, wuzj@lemote.com
*
* 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@siliconmotion.com.cn>
*/
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