195b296d0Smrg/*
295b296d0Smrg * VIA TV additions
395b296d0Smrg */
495b296d0Smrg
595b296d0Smrg
695b296d0Smrg#ifdef HAVE_CONFIG_H
795b296d0Smrg#include "config.h"
895b296d0Smrg#endif
995b296d0Smrg
1095b296d0Smrg#include "trident.h"
1195b296d0Smrg#include "trident_regs.h"
1295b296d0Smrg
1395b296d0Smrg/***************************************************************************
1495b296d0Smrg *
1595b296d0Smrg * TV parameters for VT1621
1695b296d0Smrg *
1795b296d0Smrg ***************************************************************************/
1895b296d0Smrg#define TV_MODE  8
1995b296d0Smrg#define TVX_MODE_SIZE 0X72
2095b296d0Smrg#define TVX_CRTC_NUM 0x10
2195b296d0Smrg#define TVX_REG_NUM 0x62
2295b296d0Smrg#define TVX_VT1621_PORT 0x40
2395b296d0Smrg#define SMBUS_BASE 0x5000
2495b296d0Smrgunsigned char TVX_VT1621_Table[TV_MODE][TVX_MODE_SIZE] = {
2595b296d0Smrg{
2695b296d0Smrg/* NTSC, 640x480, bpp=8,16 */
2795b296d0Smrg0x02, 0x54, 0xE0, 0xFA, 0x11, 0x5D, 0x11, 0x57, 0x5A, 0x56,
2895b296d0Smrg0xA0, 0x26, 0x0A, 0x55, 0x37, 0x86,
2995b296d0Smrg
3095b296d0Smrg0x6A, 0x0B, 0x22, 0x27, 0x43, 0x50, 0x13, 0x50,
3195b296d0Smrg0xB0, 0x07, 0xEE, 0x15, 0x90, 0xE4, 0x00, 0xA8,
3295b296d0Smrg0x00, 0x00, 0x0E, 0x48, 0x38, 0x38, 0x00, 0x1C,
3395b296d0Smrg0x00, 0x40, 0x0C, 0x02, 0x01, 0x80, 0x00, 0x00,
3495b296d0Smrg0x0F, 0x06, 0x99, 0x7C, 0x04, 0x5D, 0x36, 0x9B,
3595b296d0Smrg0x54, 0x00, 0x00, 0xB4, 0x2F, 0x85, 0xFF, 0x00,
3695b296d0Smrg0x00, 0x17, 0x15, 0x21, 0x15, 0x05, 0x05, 0x02,
3795b296d0Smrg0x1B, 0x1B, 0x24, 0xF8, 0x07, 0x00, 0x00, 0x0F,
3895b296d0Smrg0x0F, 0x60, 0x01, 0x0A, 0x00, 0x05, 0x04, 0xFF,
3995b296d0Smrg0x03, 0x01, 0x90, 0x33, 0x00, 0x00, 0x00, 0x00,
4095b296d0Smrg0x00, 0x04, 0x47, 0x02, 0x02, 0xFD, 0x06, 0xf8,
4195b296d0Smrg0x0B, 0xF3, 0x0F, 0x70, 0x05, 0xF9, 0x0B, 0xF1,
4295b296d0Smrg0x11, 0x6E
4395b296d0Smrg},
4495b296d0Smrg{
4595b296d0Smrg/* NTSC, 800x600, bpp=8,16 */
4695b296d0Smrg0X02, 0x79, 0XE0, 0x73, 0x02, 0x80, 0x01, 0x7A, 0x7E, 0xEC,
4795b296d0Smrg0xA0, 0x8A, 0x0E, 0xEB, 0x8B, 0x89,
4895b296d0Smrg
4995b296d0Smrg0x8B, 0x0B, 0x6A, 0x27, 0x43, 0x50, 0x12, 0x50,
5095b296d0Smrg0xBC, 0x0A, 0XE8, 0x15, 0x88, 0xDC, 0x00, 0x98,
5195b296d0Smrg0x00, 0x00, 0x0A, 0x48, 0x1C, 0x28, 0x03, 0x20,
5295b296d0Smrg0x00, 0x40, 0x36, 0x02, 0x03, 0x80, 0x00, 0x00,
5395b296d0Smrg0x0D, 0x04, 0x04, 0x7B, 0x00, 0x5D, 0xC1, 0x9B,
5495b296d0Smrg0x6B, 0x00, 0x00, 0xA1, 0x3F, 0x9D, 0x2F, 0x10,
5595b296d0Smrg0x00, 0x17, 0x15, 0x21, 0x15, 0x05, 0x05, 0x02,
5695b296d0Smrg0x1B, 0x1B, 0x24, 0xF8, 0x07, 0x00, 0x00, 0x0F,
5795b296d0Smrg0x0F, 0x60, 0x01, 0x0A, 0x00, 0x05, 0x04, 0xFF,
5895b296d0Smrg0x03, 0x01, 0xD6, 0x80, 0x00, 0x00, 0x00, 0x00,
5995b296d0Smrg0x00, 0x0C, 0x46, 0x02, 0x02, 0xFD, 0x06, 0xF8,
6095b296d0Smrg0x0B, 0xF3, 0x0F, 0x70, 0x05, 0xF9, 0x0B, 0xF1,
6195b296d0Smrg0x11, 0x6E
6295b296d0Smrg},
6395b296d0Smrg{
6495b296d0Smrg/* NTSC, 640x480, bpp=32 */
6595b296d0Smrg0X02, 0x54, 0XE0, 0xFA, 0x11, 0x5D, 0x01, 0x57, 0x5A, 0x56,
6695b296d0Smrg0xA0, 0x26, 0x0A, 0X55, 0x37, 0x46,
6795b296d0Smrg
6895b296d0Smrg0x6A, 0x0B, 0x23, 0x33, 0x43, 0x50, 0x13, 0x51,
6995b296d0Smrg0xB0, 0x07, 0xAB, 0x15, 0x90, 0xA9, 0x00, 0x98,
7095b296d0Smrg0x00, 0x00, 0x0E, 0x48, 0x38, 0x38, 0x03, 0x1C,
7195b296d0Smrg0x00, 0x40, 0x0C, 0x02, 0x03, 0x80, 0x00, 0x00,
7295b296d0Smrg0x0F, 0x04, 0x99, 0x7A, 0x04, 0x5E, 0xB6, 0x90,
7395b296d0Smrg0x5B, 0x00, 0x00, 0x67, 0x2F, 0x88, 0xFA, 0x00,
7495b296d0Smrg0x00, 0x17, 0x15, 0x21, 0x15, 0x05, 0x05, 0x02,
7595b296d0Smrg0x1B, 0x1B, 0x24, 0xF8, 0x07, 0x00, 0x00, 0x0F,
7695b296d0Smrg0x0F, 0x60, 0x01, 0x0A, 0x00, 0x05, 0x04, 0xFF,
7795b296d0Smrg0x03, 0x01, 0xA0, 0x33, 0x1B, 0x00, 0X00, 0x00,
7895b296d0Smrg0x00, 0x08, 0x47, 0x02, 0x02, 0xFD, 0x06, 0xf8,
7995b296d0Smrg0x0B, 0xF3, 0x0F, 0x70, 0x05, 0xF9, 0x0B, 0xF1,
8095b296d0Smrg0x11, 0x6E
8195b296d0Smrg},
8295b296d0Smrg{
8395b296d0Smrg/* NTSC, 800x600, bpp=32 */
8495b296d0Smrg0X02, 0x79, 0XE0, 0x73, 0x02, 0x80, 0x01, 0x7B, 0x7E, 0xEC,
8595b296d0Smrg0xA0, 0x8A, 0x0E, 0xEB, 0x8B, 0x49,
8695b296d0Smrg
8795b296d0Smrg0x8B, 0x0B, 0x6B, 0x27, 0x43, 0x50, 0x12, 0x2D,
8895b296d0Smrg0xBC, 0x0C, 0xED, 0x15, 0x88, 0xEE, 0x00, 0x99,
8995b296d0Smrg0x00, 0x00, 0x0A, 0x48, 0x1C, 0x28, 0x03, 0x20,
9095b296d0Smrg0x00, 0x40, 0x36, 0x02, 0x03, 0x80, 0x00, 0x00,
9195b296d0Smrg0x0D, 0x04, 0x04, 0x7A, 0x00, 0x5D, 0xC1, 0x9B,
9295b296d0Smrg0x6B, 0x00, 0x00, 0xA1, 0x3F, 0x9D, 0x2F, 0x10,
9395b296d0Smrg0x00, 0x17, 0x15, 0x21, 0x15, 0x05, 0x05, 0x02,
9495b296d0Smrg0x1B, 0x1B, 0x24, 0xF8, 0x07, 0x00, 0x00, 0x0F,
9595b296d0Smrg0x0F, 0x60, 0x01, 0x0A, 0x00, 0x05, 0x04, 0xFF,
9695b296d0Smrg0x03, 0x01, 0xC6, 0x90, 0x00, 0x00, 0x00, 0x00,
9795b296d0Smrg0x00, 0x08, 0x46, 0x02, 0x02, 0xFD, 0x06, 0xF8,
9895b296d0Smrg0x0B, 0xF3, 0x0F, 0x70, 0x05, 0xF9, 0x0B, 0xF1,
9995b296d0Smrg0x11, 0x6E
10095b296d0Smrg},
10195b296d0Smrg{
10295b296d0Smrg/* PAL, 640x480, bpp=8,16 */
10395b296d0Smrg0X82, 0x5D, 0XE0, 0x23, 0x02, 0x64, 0x01, 0x56, 0x5A, 0x6F,
10495b296d0Smrg0xA0, 0x0D, 0x0F, 0x6E, 0x24, 0xC1,
10595b296d0Smrg
10695b296d0Smrg0x6B, 0x0B, 0x03, 0x67, 0x40, 0x50, 0x12, 0x96,
10795b296d0Smrg0xCE, 0x32, 0xFF, 0x01, 0x7E, 0xF6, 0x00, 0xA8,
10895b296d0Smrg0x00, 0x00, 0x07, 0x48, 0x20, 0x1C, 0x44, 0x60,
10995b296d0Smrg0x44, 0x4F, 0x1B, 0x02, 0x03, 0x80, 0x00, 0x00,
11095b296d0Smrg0x0C, 0x0C, 0xD7, 0x84, 0x04, 0x68, 0x3B, 0x9C,
11195b296d0Smrg0x57, 0x63, 0x17, 0xAC, 0x25, 0x80, 0x29, 0x10,
11295b296d0Smrg0x00, 0x1A, 0x22, 0x2A, 0x22, 0x05, 0x02, 0x00,
11395b296d0Smrg0x1C, 0x3D, 0x14, 0xFE, 0x03, 0x54, 0x01, 0xFE,
11495b296d0Smrg0x7E, 0x60, 0x00, 0x08, 0x00, 0x04, 0x07, 0x55,
11595b296d0Smrg0x01, 0x01, 0xA0, 0x33, 0x00, 0x00, 0x00, 0x00,
11695b296d0Smrg0x00, 0x0C, 0x4E, 0xFE, 0x03, 0xFB, 0x06, 0xF8,
11795b296d0Smrg0x0A, 0xF5, 0x0C, 0x73, 0x06, 0xF8, 0x0B, 0xF2,
11895b296d0Smrg0x10, 0x6F
11995b296d0Smrg},
12095b296d0Smrg{
12195b296d0Smrg/* PAL, 800x600, bpp=8,16 */
12295b296d0Smrg0X82, 0x5B, 0XE0, 0x91, 0x02, 0x73, 0x07, 0x6C, 0x70, 0xEC,
12395b296d0Smrg0xA0, 0xA8, 0x0B, 0xEB, 0xAD, 0xC7,
12495b296d0Smrg
12595b296d0Smrg0x8B, 0x0B, 0x1A, 0x47, 0x40, 0x50, 0x12, 0x56,
12695b296d0Smrg0x00, 0x37, 0xF7, 0x00, 0x7D, 0xE2, 0x00, 0xB9,
12795b296d0Smrg0x00, 0x00, 0x0E, 0x48, 0x38, 0x38, 0x44, 0x62,
12895b296d0Smrg0x44, 0x4F, 0x53, 0x02, 0x07, 0x80, 0x00, 0x00,
12995b296d0Smrg0x0A, 0x05, 0xA2, 0x83, 0x08, 0x68, 0x46, 0x99,
13095b296d0Smrg0x68, 0x63, 0x17, 0xAC, 0x25, 0x80, 0x6B, 0x10,
13195b296d0Smrg0x00, 0x1A, 0x22, 0x2A, 0x22, 0x05, 0x02, 0x00,
13295b296d0Smrg0x1C, 0x3D, 0x14, 0xFE, 0x03, 0x54, 0x01, 0xFE,
13395b296d0Smrg0x7E, 0x60, 0x00, 0x08, 0x00, 0x04, 0x07, 0x55,
13495b296d0Smrg0x01, 0x01, 0xE6, 0x90, 0x00, 0x00, 0x00, 0x00,
13595b296d0Smrg0x00, 0x0C, 0x4D, 0xFB, 0x04, 0xFB, 0x07, 0xF8,
13695b296d0Smrg0x09, 0xF6, 0x0A, 0x74, 0x06, 0xF8, 0x0B, 0xF2,
13795b296d0Smrg0x10, 0x6F
13895b296d0Smrg},
13995b296d0Smrg{
14095b296d0Smrg/* PAL, 640x480, bpp=32 */
14195b296d0Smrg0X82, 0x5D, 0XE0, 0x23, 0x02, 0x64, 0x01, 0x56, 0x5A, 0x6F,
14295b296d0Smrg0xA0, 0x0D, 0x0F, 0x6E, 0x24, 0x81,
14395b296d0Smrg
14495b296d0Smrg0x6B, 0x0B, 0x02, 0x67, 0x40, 0x50, 0x12, 0x93,
14595b296d0Smrg0xCE, 0x32, 0xF0, 0x01, 0x88, 0xE8, 0x00, 0xA8,
14695b296d0Smrg0x00, 0x00, 0x07, 0x48, 0x20, 0x1C, 0x44, 0x60,
14795b296d0Smrg0x44, 0x4F, 0x1B, 0x02, 0x03, 0x80, 0x00, 0x00,
14895b296d0Smrg0x0C, 0x05, 0xE2, 0x84, 0x00, 0x68, 0x3B, 0x9C,
14995b296d0Smrg0x57, 0x63, 0x17, 0xAC, 0x25, 0x80, 0x29, 0x10,
15095b296d0Smrg0x00, 0x1A, 0x22, 0x2A, 0x22, 0x05, 0x02, 0x00,
15195b296d0Smrg0x1C, 0x3D, 0x14, 0xFE, 0x03, 0x54, 0x01, 0xFE,
15295b296d0Smrg0x7E, 0x60, 0x00, 0x08, 0x00, 0x04, 0x07, 0x55,
15395b296d0Smrg0x01, 0x01, 0xA0, 0x33, 0x00, 0x00, 0x00, 0x00,
15495b296d0Smrg0x00, 0x0C, 0x4E, 0xFE, 0x03, 0xFB, 0x06, 0xF8,
15595b296d0Smrg0x0A, 0xF5, 0x0C, 0x73, 0x06, 0xF8, 0x0B, 0xF2,
15695b296d0Smrg0x10, 0x6F
15795b296d0Smrg},
15895b296d0Smrg{
15995b296d0Smrg/* PAL, 800x600, bpp=32 */
16095b296d0Smrg0X82, 0x5B, 0XE0, 0x91, 0x02, 0x73, 0x07, 0x6C, 0x70, 0xEC,
16195b296d0Smrg0xA0, 0xA8, 0x0B, 0xEB, 0xAD, 0x87,
16295b296d0Smrg
16395b296d0Smrg0x8B, 0x0B, 0x1A, 0x67, 0x40, 0x50, 0x12, 0x53,
16495b296d0Smrg0x00, 0x37, 0xEE, 0x00, 0x83, 0xEB, 0x00, 0xB9,
16595b296d0Smrg0x00, 0x00, 0x0E, 0x48, 0x38, 0x38, 0x44, 0x62,
16695b296d0Smrg0x44, 0x4F, 0x53, 0x02, 0x07, 0x80, 0x00, 0x00,
16795b296d0Smrg0x0A, 0x05, 0x5E, 0x83, 0x08, 0x68, 0x46, 0x99,
16895b296d0Smrg0x68, 0x63, 0x17, 0xAC, 0x25, 0x80, 0x6B, 0x10,
16995b296d0Smrg0x00, 0x1A, 0x22, 0x2A, 0x22, 0x05, 0x02, 0x00,
17095b296d0Smrg0x1C, 0x3D, 0x14, 0xFE, 0x03, 0x54, 0x01, 0xFE,
17195b296d0Smrg0x7E, 0x60, 0x00, 0x08, 0x00, 0x04, 0x07, 0x55,
17295b296d0Smrg0x01, 0x01, 0xA0, 0x22, 0x00, 0x00, 0x00, 0x00,
17395b296d0Smrg0x00, 0x0C, 0x4D, 0xFB, 0x04, 0xFB, 0x07, 0xF8,
17495b296d0Smrg0x09, 0xF6, 0x0A, 0x74, 0x06, 0xF8, 0x0B, 0xF2,
17595b296d0Smrg0x10, 0x6F
17695b296d0Smrg}
17795b296d0Smrg};
17895b296d0Smrg/* TV Parameters for CH7005C */
17995b296d0Smrg#define TV_CH7005C_MODE_SIZE 45
18095b296d0Smrg#define TV_CH7005C_CRTC_NUM 0x10
18195b296d0Smrg#define TV_CH7005C_TVREG_NUM 29
18295b296d0Smrg#define TV_CH7005C_PORT 0xEA
18395b296d0Smrgunsigned char TV_CH7005C_Table[TV_MODE][TV_CH7005C_MODE_SIZE]={
18495b296d0Smrg{
18595b296d0Smrg/* NTSC 640x480 bpp=8,16 */
18695b296d0Smrg0x02, 0x80, 0x20, 0x02, 0x00, 0x5D, 0X80, 0X57, 0X80, 0X56,
18795b296d0Smrg0XBA, 0X10, 0X8C, 0X50, 0XF8, 0X7F,
18895b296d0Smrg
18995b296d0Smrg0X6A, 0X7A, 0X00, 0X09, 0X80, 0X66, 0X00, 0X60,
19095b296d0Smrg0X2E, 0XFF, 0X01, 0X0B, 0X0C, 0X03, 0X40, 0X3F,
19195b296d0Smrg0X7E, 0X40, 0X02, 0X00, 0X08, 0X00, 0X00, 0X00,
19295b296d0Smrg0X00, 0X00, 0X0A, 0X02, 0X05
19395b296d0Smrg},
19495b296d0Smrg{
19595b296d0Smrg/* NTSC 800X600 bpp=8,16 */
19695b296d0Smrg0x02, 0x80, 0x20, 0x02, 0x00, 0x7D, 0X80, 0X6E, 0X1C, 0XBA,
19795b296d0Smrg0XF0, 0X70, 0X8C, 0XBA, 0X78, 0X53,
19895b296d0Smrg
19995b296d0Smrg0X8C, 0X4A, 0X00, 0X09, 0X80, 0XAE, 0X01, 0X80,
20095b296d0Smrg0X2E, 0X02, 0X01, 0X0B, 0X7E, 0X7E, 0X7E, 0X7E,
20195b296d0Smrg0X7E, 0X40, 0X01, 0X0C, 0X00, 0X00, 0X00, 0X00,
20295b296d0Smrg0X00, 0X00, 0X0A, 0X00, 0X05
20395b296d0Smrg},
20495b296d0Smrg{
20595b296d0Smrg/* NTSC 640x480 bpp=32 */
20695b296d0Smrg0x02, 0x80, 0x20, 0x02, 0x00, 0x5D, 0X80, 0X57, 0X80, 0X56,
20795b296d0Smrg0XBA, 0X10, 0X8C, 0X50, 0XBD, 0X57,
20895b296d0Smrg
20995b296d0Smrg0X6A, 0X7A, 0X00, 0X09, 0X80, 0X67, 0X00, 0X60,
21095b296d0Smrg0X2E, 0XFF, 0X01, 0X0B, 0X0C, 0X03, 0X40, 0X3F,
21195b296d0Smrg0X7E, 0X40, 0X02, 0X00, 0X07, 0X0C, 0X0D, 0X00,
21295b296d0Smrg0X00, 0X00, 0X0A, 0X02, 0X05
21395b296d0Smrg},
21495b296d0Smrg{
21595b296d0Smrg/* NTSC 800X600 bpp=32 */
21695b296d0Smrg0x02, 0x80, 0x20, 0x02, 0x00, 0x7D, 0X80, 0X6E, 0X1C, 0XBA,
21795b296d0Smrg0XF0, 0X70, 0X8C, 0XBA, 0XF8, 0X53,
21895b296d0Smrg
21995b296d0Smrg0X8C, 0X4A, 0X00, 0X09, 0X80, 0XAF, 0X01, 0X80,
22095b296d0Smrg0X2E, 0X02, 0X01, 0X0B, 0X0C, 0X03, 0X40, 0X3F,
22195b296d0Smrg0X7E, 0X40, 0X01, 0X0C, 0X00, 0X00, 0X00, 0X00,
22295b296d0Smrg0X00, 0X00, 0X0A, 0X00, 0X05
22395b296d0Smrg},
22495b296d0Smrg{
22595b296d0Smrg/* PAL 640x480 bpp=8,16 */
22695b296d0Smrg0x82, 0x80, 0x20, 0x02, 0x00, 0x71, 0X74, 0X62, 0X84, 0X6F,
22795b296d0Smrg0XF0, 0X10, 0X09, 0XEB, 0X80, 0X5F,
22895b296d0Smrg
22995b296d0Smrg0X81, 0X4A, 0X00, 0X09, 0X80, 0X84, 0X00, 0X70,
23095b296d0Smrg0X28, 0X02, 0X01, 0X0B, 0X0C, 0X03, 0X40, 0X3F,
23195b296d0Smrg0X7E, 0X40, 0X02, 0X00, 0X08, 0X00, 0X00, 0X00,
23295b296d0Smrg0X00, 0X00, 0X0A, 0X01, 0X05
23395b296d0Smrg},
23495b296d0Smrg{
23595b296d0Smrg/* PAL 800x600 bpp=8,16 */
23695b296d0Smrg0x82, 0x80, 0x20, 0x02, 0x00, 0x73, 0X76, 0X6A, 0X8C, 0XEC,
23795b296d0Smrg0XF0, 0X7E, 0X09, 0XEB, 0X8F, 0X8D,
23895b296d0Smrg
23995b296d0Smrg0X83, 0X4A, 0X00, 0X09, 0X80, 0X7E, 0X00, 0X70,
24095b296d0Smrg0X3F, 0X02, 0X01, 0X0B, 0X0C, 0X03, 0X40, 0X3F,
24195b296d0Smrg0X7E, 0X40, 0X02, 0X00, 0X08, 0X00, 0X00, 0X00,
24295b296d0Smrg0X00, 0X00, 0X0A, 0X01, 0X05
24395b296d0Smrg},
24495b296d0Smrg{
24595b296d0Smrg/* PAL 640x480 bpp=32 */
24695b296d0Smrg0x82, 0x80, 0x20, 0x02, 0x00, 0x71, 0X74, 0X62, 0X84, 0X6F,
24795b296d0Smrg0XF0, 0X10, 0X09, 0XEB, 0X80, 0X1F,
24895b296d0Smrg
24995b296d0Smrg0X81, 0X4A, 0X00, 0X09, 0X80, 0X84, 0X00, 0X70,
25095b296d0Smrg0X28, 0X02, 0X01, 0X0B, 0X0C, 0X03, 0X40, 0X3F,
25195b296d0Smrg0X7E, 0X40, 0X02, 0X00, 0X08, 0X00, 0X00, 0X00,
25295b296d0Smrg0X00, 0X00, 0X0A, 0X01, 0X05
25395b296d0Smrg},
25495b296d0Smrg{
25595b296d0Smrg/* PAL 800X600 bpp=32 */
25695b296d0Smrg0x82, 0x80, 0x20, 0x02, 0x00, 0x73, 0X76, 0X6A, 0X8C, 0XEC,
25795b296d0Smrg0XF0, 0X7E, 0X09, 0XEB, 0X5D, 0X48,
25895b296d0Smrg
25995b296d0Smrg0X83, 0X4A, 0X00, 0X09, 0X80, 0X7E, 0X00, 0X70,
26095b296d0Smrg0X3F, 0X02, 0X01, 0X0B, 0X0C, 0X03, 0X40, 0X3F,
26195b296d0Smrg0X7E, 0X40, 0X02, 0X00, 0X08, 0X00, 0X00, 0X00,
26295b296d0Smrg0X00, 0X00, 0X0A, 0X01, 0X05
26395b296d0Smrg}
26495b296d0Smrg};
26595b296d0Smrg
26695b296d0Smrgstatic unsigned char smbus_read(ScrnInfoPtr pScrn, unsigned char bIndex, unsigned char devAdr)
26795b296d0Smrg{
26895b296d0Smrg    TRIDENTPtr pTrident=TRIDENTPTR(pScrn);
26995b296d0Smrg    unsigned short i;
27095b296d0Smrg    unsigned char  bData;
27195b296d0Smrg
27295b296d0Smrg    /* clear host status */
27395b296d0Smrg    OUTB(SMBUS_BASE, 0xFF);
27495b296d0Smrg
27595b296d0Smrg    /* check SMBUS ready */
27695b296d0Smrg    for ( i = 0; i < 0xFFFF; i++ )
27795b296d0Smrg        if ( (INB(SMBUS_BASE) & 0x01) == 0 )
27895b296d0Smrg            break;
27995b296d0Smrg
28095b296d0Smrg    /* set host command */
28195b296d0Smrg    OUTB(SMBUS_BASE+3, bIndex);
28295b296d0Smrg
28395b296d0Smrg    /* set slave address */
28495b296d0Smrg    OUTB(SMBUS_BASE+4, devAdr | 0x01);
28595b296d0Smrg
28695b296d0Smrg    /* start */
28795b296d0Smrg    OUTB(SMBUS_BASE+2, 0x48);
28895b296d0Smrg
28995b296d0Smrg    /* SMBUS Wait Ready */
29095b296d0Smrg    for ( i = 0; i < 0xFFFF; i++ )
29195b296d0Smrg        if ( (INB(SMBUS_BASE) & 0x01) == 0 )
29295b296d0Smrg            break;
29395b296d0Smrg    bData=INB(SMBUS_BASE+5);
29495b296d0Smrg
29595b296d0Smrg    return bData;
29695b296d0Smrg
29795b296d0Smrg}
29895b296d0Smrg
29995b296d0Smrgstatic void smbus_write(ScrnInfoPtr pScrn, unsigned char bData, unsigned char bIndex, unsigned char devAdr)
30095b296d0Smrg{
30195b296d0Smrg    TRIDENTPtr pTrident=TRIDENTPTR(pScrn);
30295b296d0Smrg    unsigned short i;
30395b296d0Smrg
30495b296d0Smrg    /* clear host status */
30595b296d0Smrg    OUTB(SMBUS_BASE, 0xFF);
30695b296d0Smrg
30795b296d0Smrg    /* check SMBUS ready */
30895b296d0Smrg    for ( i = 0; i < 0xFFFF; i++ )
30995b296d0Smrg        if ( (INB(SMBUS_BASE) & 0x01) == 0 )
31095b296d0Smrg           break;
31195b296d0Smrg
31295b296d0Smrg    OUTB(SMBUS_BASE+2, 0x08);
31395b296d0Smrg
31495b296d0Smrg    /* set host command */
31595b296d0Smrg    OUTB(SMBUS_BASE+3, bIndex);
31695b296d0Smrg
31795b296d0Smrg    /* set slave address */
31895b296d0Smrg    OUTB(SMBUS_BASE+4, devAdr & 0xFE);
31995b296d0Smrg
32095b296d0Smrg    OUTB(SMBUS_BASE+5, bData);
32195b296d0Smrg
32295b296d0Smrg    /* start */
32395b296d0Smrg    OUTB(SMBUS_BASE+2, 0x48);
32495b296d0Smrg
32595b296d0Smrg    /* SMBUS Wait Ready */
32695b296d0Smrg    for ( i = 0; i < 0xFFFF; i++ )
32795b296d0Smrg    if ( (INB(SMBUS_BASE) & 0x01) == 0 )
32895b296d0Smrg       break;
32995b296d0Smrg}
33095b296d0Smrgvoid VIA_SaveTVDepentVGAReg(ScrnInfoPtr pScrn)
33195b296d0Smrg{
33295b296d0Smrg    TRIDENTPtr pTrident=TRIDENTPTR(pScrn);
33395b296d0Smrg    unsigned char protect;
33495b296d0Smrg    unsigned char bTmp;
33595b296d0Smrg    int i;
33695b296d0Smrg    unsigned char VGA_RegIdx_about_TV[VGA_REGNUM_ABOUT_TV]={
33795b296d0Smrg                  0xD8,0XD9,/* SR */
33895b296d0Smrg                  0X33,/* GR */
33995b296d0Smrg                  0XC0,0XD0,0XD1,0XD2,0XD3,0XE0,0XE3,0XE4,0XE5,/* CR */
34095b296d0Smrg                  0XE6,0XE7,0XF0,0XF1,0XF6,0XFE,0XFF
34195b296d0Smrg                  };
34295b296d0Smrg    unsigned char TV_CH7005C_RegIdx[TV_CH7005C_TVREG_NUM]={
34395b296d0Smrg                  0X00,0X01,0X03,0X04,0X06,0X07,0X08,0X09,
34495b296d0Smrg		  0X0A,0X0B,0X0D,0X0E,0X10,0X11,0X13,0X14,
34595b296d0Smrg		  0X15,0X17,0X18,0X19,0X1A,0X1B,0X1C,0X1D,
34695b296d0Smrg		  0X1E,0X1F,0X20,0X21,0X3D
34795b296d0Smrg                  };
34895b296d0Smrg
34995b296d0Smrg    /*ErrorF("VIAB3D: VIA_SaveTVDepentVGAReg:\n");*/
35095b296d0Smrg
35195b296d0Smrg    /* Unprotect */
35295b296d0Smrg    OUTB(0x3C4, 0x11);
35395b296d0Smrg    protect = INB(0x3C5);
35495b296d0Smrg    OUTB(0x3C5, 0x92);
35595b296d0Smrg
35695b296d0Smrg    /* Set TV Hw environment */
35795b296d0Smrg    OUTB(0x3d4,0xc1);
35895b296d0Smrg    OUTB(0x3d5,0x41);
35995b296d0Smrg
36095b296d0Smrg    /* SR_d8,SR_d9 */
36195b296d0Smrg    for (i=0; i<2; i++)
36295b296d0Smrg    {
36395b296d0Smrg        OUTB(0x3c4,VGA_RegIdx_about_TV[i]);
36495b296d0Smrg        bTmp=INB(0x3c5);
36595b296d0Smrg        pTrident->DefaultTVDependVGASetting[i]=bTmp;
36695b296d0Smrg    }
36795b296d0Smrg
36895b296d0Smrg    /* GR_33 */
36995b296d0Smrg    OUTB(0x3ce,0x33);
37095b296d0Smrg    bTmp=INB(0x3cf);
37195b296d0Smrg    pTrident->DefaultTVDependVGASetting[2]=bTmp;
37295b296d0Smrg
37395b296d0Smrg    /* CR_c0,d0,d1,d2,d3,e0,e3,e4,e5,e6,e7,f0,f1,f6,fe,ff */
37495b296d0Smrg    for (i=3; i<VGA_REGNUM_ABOUT_TV; i++)
37595b296d0Smrg    {
37695b296d0Smrg        OUTB(0x3d4,VGA_RegIdx_about_TV[i]);
37795b296d0Smrg        bTmp=INB(0x3d5);
37895b296d0Smrg        pTrident->DefaultTVDependVGASetting[i]=bTmp;
37995b296d0Smrg    }
38095b296d0Smrg
38195b296d0Smrg    switch (pTrident->TVChipset)
38295b296d0Smrg    {
38395b296d0Smrg       case 1:
38495b296d0Smrg             for (i=0; i<TVX_REG_NUM; i++)
38595b296d0Smrg             {
38695b296d0Smrg                 bTmp=smbus_read(pScrn,i,TVX_VT1621_PORT);
38795b296d0Smrg                 pTrident->DefaultTVDependVGASetting[VGA_REGNUM_ABOUT_TV+i]=bTmp;
38895b296d0Smrg             }
38995b296d0Smrg	     break;
39095b296d0Smrg       case 2:
39195b296d0Smrg             for (i=0; i<TV_CH7005C_TVREG_NUM; i++)
39295b296d0Smrg	     {
39395b296d0Smrg                 bTmp=smbus_read(pScrn,TV_CH7005C_RegIdx[i],TV_CH7005C_PORT);
39495b296d0Smrg                 pTrident->DefaultTVDependVGASetting[VGA_REGNUM_ABOUT_TV+i]=bTmp;
39595b296d0Smrg	     }
39695b296d0Smrg	     break;
39795b296d0Smrg       default:
39895b296d0Smrg             ErrorF("VIAB3D: VIA_SaveTVDepentVGAReg: Wrong Chipset setting\n");
39995b296d0Smrg	     break;
40095b296d0Smrg
40195b296d0Smrg    }
40295b296d0Smrg    /* protect */
40395b296d0Smrg    OUTB(0x3C4, 0x11);
40495b296d0Smrg    OUTB(0x3C5, protect);
40595b296d0Smrg}
40695b296d0Smrgvoid VIA_RestoreTVDependVGAReg(ScrnInfoPtr pScrn)
40795b296d0Smrg{
40895b296d0Smrg    TRIDENTPtr pTrident=TRIDENTPTR(pScrn);
40995b296d0Smrg    unsigned char protect;
41095b296d0Smrg    unsigned char bTmp;
41195b296d0Smrg    int i;
41295b296d0Smrg    unsigned char VGA_RegIdx_about_TV[VGA_REGNUM_ABOUT_TV]={
41395b296d0Smrg                  0xD8,0XD9,/* SR */
41495b296d0Smrg                  0X33,/* GR */
41595b296d0Smrg                  0XC0,0XD0,0XD1,0XD2,0XD3,0XE0,0XE3,0XE4,0XE5,/* CR */
41695b296d0Smrg                  0XE6,0XE7,0XF0,0XF1,0XF6,0XFE,0XFF
41795b296d0Smrg                  };
41895b296d0Smrg    unsigned char TV_CH7005C_RegIdx[TV_CH7005C_TVREG_NUM]={
41995b296d0Smrg                  0X00,0X01,0X03,0X04,0X06,0X07,0X08,0X09,
42095b296d0Smrg		  0X0A,0X0B,0X0D,0X0E,0X10,0X11,0X13,0X14,
42195b296d0Smrg		  0X15,0X17,0X18,0X19,0X1A,0X1B,0X1C,0X1D,
42295b296d0Smrg		  0X1E,0X1F,0X20,0X21,0X3D
42395b296d0Smrg                  };
42495b296d0Smrg
42595b296d0Smrg    /*ErrorF("VIAB3D: VIA_RestoreTVDependVGAReg:\n");*/
42695b296d0Smrg
42795b296d0Smrg    /* Unprotect */
42895b296d0Smrg    OUTB(0x3C4, 0x11);
42995b296d0Smrg    protect = INB(0x3C5);
43095b296d0Smrg    OUTB(0x3C5, 0x92);
43195b296d0Smrg
43295b296d0Smrg    /* Set TV Hw environment */
43395b296d0Smrg    OUTB(0x3d4,0xc1);
43495b296d0Smrg    OUTB(0x3d5,0x41);
43595b296d0Smrg
43695b296d0Smrg    /* SR_d8,SR_d9 */
43795b296d0Smrg    for (i=0; i<2; i++)
43895b296d0Smrg    {
43995b296d0Smrg        OUTB(0x3c4,VGA_RegIdx_about_TV[i]);
44095b296d0Smrg        bTmp=pTrident->DefaultTVDependVGASetting[i];
44195b296d0Smrg        OUTB(0x3c5,bTmp);
44295b296d0Smrg    }
44395b296d0Smrg    /* GR_33 */
44495b296d0Smrg    OUTB(0x3ce,0x33);
44595b296d0Smrg    bTmp=pTrident->DefaultTVDependVGASetting[2];
44695b296d0Smrg    OUTB(0x3cf,bTmp);
44795b296d0Smrg
44895b296d0Smrg    /* CR_c0,d0,d1,d2,d3,e0,e3,e4,e5,e6,e7,f0,f1,f6,fe,ff */
44995b296d0Smrg    for (i=3; i<VGA_REGNUM_ABOUT_TV; i++)
45095b296d0Smrg    {
45195b296d0Smrg        OUTB(0x3d4,VGA_RegIdx_about_TV[i]);
45295b296d0Smrg        bTmp=pTrident->DefaultTVDependVGASetting[i];
45395b296d0Smrg        OUTB(0x3d5,bTmp);
45495b296d0Smrg    }
45595b296d0Smrg    switch (pTrident->TVChipset)
45695b296d0Smrg    {
45795b296d0Smrg         case 1:
45895b296d0Smrg                for (i=0; i<TVX_REG_NUM; i++)
45995b296d0Smrg                {
46095b296d0Smrg                    bTmp=pTrident->DefaultTVDependVGASetting[VGA_REGNUM_ABOUT_TV+i];
46195b296d0Smrg                    smbus_write(pScrn,bTmp,i,TVX_VT1621_PORT);
46295b296d0Smrg		}
46395b296d0Smrg		break;
46495b296d0Smrg         case 2:
46595b296d0Smrg	        for (i=0; i<TV_CH7005C_TVREG_NUM; i++)
46695b296d0Smrg		{
46795b296d0Smrg                    bTmp=pTrident->DefaultTVDependVGASetting[VGA_REGNUM_ABOUT_TV+i];
46895b296d0Smrg                    smbus_write(pScrn,bTmp,TV_CH7005C_RegIdx[i],TV_CH7005C_PORT);
46995b296d0Smrg		}
47095b296d0Smrg		break;
47195b296d0Smrg       default:
47295b296d0Smrg             ErrorF("VIAB3D: VIA_SaveTVDepentVGAReg: Wrong Chipset setting\n");
47395b296d0Smrg	     break;
47495b296d0Smrg    }
47595b296d0Smrg    /* protect */
47695b296d0Smrg    OUTB(0x3C4, 0x11);
47795b296d0Smrg    OUTB(0x3C5, protect);
47895b296d0Smrg}
47995b296d0Smrgvoid VIA_TVInit(ScrnInfoPtr pScrn)
48095b296d0Smrg{
48195b296d0Smrg    TRIDENTPtr pTrident=TRIDENTPTR(pScrn);
48295b296d0Smrg    unsigned char idx=0;
48395b296d0Smrg    unsigned char i;
48495b296d0Smrg    unsigned char protect;
48595b296d0Smrg    unsigned char TV_CRTC[TVX_CRTC_NUM] =
48695b296d0Smrg       { 0xC0,0xD0,0xD1,0xD2,0xD3,0xE0,0xE3,0xE4,0xE5,
48795b296d0Smrg         0xE6,0xE7,0xF0,0xF1,0xF6,0xFE,0xFF  };
48895b296d0Smrg    unsigned char TV_CH7005C_RegIdx[TV_CH7005C_TVREG_NUM]={
48995b296d0Smrg                  0X00,0X01,0X03,0X04,0X06,0X07,0X08,0X09,
49095b296d0Smrg		  0X0A,0X0B,0X0D,0X0E,0X10,0X11,0X13,0X14,
49195b296d0Smrg		  0X15,0X17,0X18,0X19,0X1A,0X1B,0X1C,0X1D,
49295b296d0Smrg		  0X1E,0X1F,0X20,0X21,0X3D
49395b296d0Smrg                  };
49495b296d0Smrg
49595b296d0Smrg#ifdef DEBUG_CODE_TRACE
49695b296d0Smrg    ErrorF("VIAB3D: VIA_TVInit:\n");
49795b296d0Smrg#endif
49895b296d0Smrg
49995b296d0Smrg    if (pScrn->currentMode->HDisplay==640 && pScrn->currentMode->VDisplay==480 && (pScrn->depth==8 || pScrn->depth==16) && pTrident->TVSignalMode == 0)
50095b296d0Smrg    {
50195b296d0Smrg       /* Overlay window 1 position OK */
50295b296d0Smrg       ErrorF("VIAB3D: VIA_TVInit: TV Params 640x480x8(16) NTSC\n");
50395b296d0Smrg       idx=0;
50495b296d0Smrg       pTrident->OverrideHsync=-71;
50595b296d0Smrg       pTrident->OverrideVsync=15;
50695b296d0Smrg     }
50795b296d0Smrg    else if (pScrn->currentMode->HDisplay==800 && pScrn->currentMode->VDisplay==600 && (pScrn->depth==8 || pScrn->depth==16) && pTrident->TVSignalMode == 0)
50895b296d0Smrg    {
50995b296d0Smrg       /* Overlay window 1 position OK */
51095b296d0Smrg       ErrorF("VIAB3D: VIA_TVInit: TV Params 800x600x8(16) NTSC\n");
51195b296d0Smrg       idx=1;
51295b296d0Smrg       pTrident->OverrideHsync=-152;
51395b296d0Smrg       pTrident->OverrideVsync=72;
51495b296d0Smrg       }
51595b296d0Smrg    else if (pScrn->currentMode->HDisplay==640 && pScrn->currentMode->VDisplay==480 && pScrn->depth==24 && pTrident->TVSignalMode == 0)
51695b296d0Smrg    {
51795b296d0Smrg       ErrorF("VIAB3D: VIA_TVInit: TV Params 640x480x32 NTSC\n");
51895b296d0Smrg       idx=2;
51995b296d0Smrg       pTrident->OverrideHsync=-65;
52095b296d0Smrg       pTrident->OverrideVsync=14;
52195b296d0Smrg       }
52295b296d0Smrg    else if (pScrn->currentMode->HDisplay==800 && pScrn->currentMode->VDisplay==600 && pScrn->depth==24 && pTrident->TVSignalMode == 0)
52395b296d0Smrg    {
52495b296d0Smrg       ErrorF("VIAB3D: VIA_TVInit: TV Params 800x600x32 NTSC\n");
52595b296d0Smrg       idx=3;
52695b296d0Smrg       pTrident->OverrideHsync=-158;
52795b296d0Smrg       pTrident->OverrideVsync=72;
52895b296d0Smrg       }
52995b296d0Smrg    else if (pScrn->currentMode->HDisplay==640 && pScrn->currentMode->VDisplay==480 && (pScrn->depth==8 || pScrn->depth==16) && pTrident->TVSignalMode == 1)
53095b296d0Smrg    {
53195b296d0Smrg       /* Overlay window 1 position OK */
53295b296d0Smrg       ErrorF("VIAB3D: VIA_TVInit: TV Params 640x480x8(16) PAL\n");
53395b296d0Smrg       idx=4;
53495b296d0Smrg       pTrident->OverrideHsync=2;
53595b296d0Smrg       pTrident->OverrideVsync=65;
53695b296d0Smrg       }
53795b296d0Smrg    else if (pScrn->currentMode->HDisplay==800 && pScrn->currentMode->VDisplay==600 && (pScrn->depth==8 || pScrn->depth==16) && pTrident->TVSignalMode == 1)
53895b296d0Smrg    {
53995b296d0Smrg       ErrorF("VIAB3D: VIA_TVInit: TV Params 800x600x8(16) PAL\n");
54095b296d0Smrg       /* patch TV screen defection */
54195b296d0Smrg       idx=5;
54295b296d0Smrg       /* patch 800x600 screen defect */
54395b296d0Smrg       OUTB(0x3d4,0x2f);
54495b296d0Smrg       OUTB(0x3d5,0xbf);
54595b296d0Smrg       pTrident->OverrideHsync=-145;
54695b296d0Smrg       pTrident->OverrideVsync=43;
54795b296d0Smrg       }
54895b296d0Smrg    else if (pScrn->currentMode->HDisplay==640 && pScrn->currentMode->VDisplay==480 && pScrn->depth==24 && pTrident->TVSignalMode == 1)
54995b296d0Smrg    {
55095b296d0Smrg       ErrorF("VIAB3D: VIA_TVInit: TV Params 640x480x32 PAL\n");
55195b296d0Smrg       idx=6;
55295b296d0Smrg       pTrident->OverrideHsync=0;
55395b296d0Smrg       pTrident->OverrideVsync=63;
55495b296d0Smrg       }
55595b296d0Smrg    else if (pScrn->currentMode->HDisplay==800 && pScrn->currentMode->VDisplay==600 && pScrn->depth==24 && pTrident->TVSignalMode == 1)
55695b296d0Smrg    {
55795b296d0Smrg       ErrorF("VIAB3D: VIA_TVInit: TV Params 800x600x32 PAL\n");
55895b296d0Smrg       idx=7;
55995b296d0Smrg       OUTB(0x3d4,0x2f);
56095b296d0Smrg       OUTB(0x3d5,0xbf);
56195b296d0Smrg       pTrident->OverrideHsync=-141;
56295b296d0Smrg       pTrident->OverrideVsync=42;
56395b296d0Smrg       }
56495b296d0Smrg    else
56595b296d0Smrg    {
56695b296d0Smrg       ErrorF("VIAB3D: VIA_TVInit: TV Params default mode\n");
56795b296d0Smrg       return;
56895b296d0Smrg    }
56995b296d0Smrg
57095b296d0Smrg    /* Unprotect */
57195b296d0Smrg    OUTB(0x3C4, 0x11);
57295b296d0Smrg    protect = INB(0x3C5);
57395b296d0Smrg    OUTB(0x3C5, 0x92);
57495b296d0Smrg
57595b296d0Smrg    /* Set TV hw environment */
57695b296d0Smrg    OUTB(0x3c4,0x24);
57795b296d0Smrg    OUTB(0x3c5,0x4f);
57895b296d0Smrg    OUTB(0x3d4,0xc1);
57995b296d0Smrg    OUTB(0x3d5,0x41);
58095b296d0Smrg    OUTB(0x3ce,0x23);
58195b296d0Smrg    OUTB(0x3cf,0x88);
58295b296d0Smrg
58395b296d0Smrg    /* set CRT + TV */
58495b296d0Smrg    OUTB(0x3CE,0x33);
58595b296d0Smrg    OUTB(0x3CF,0x20);
58695b296d0Smrg
58795b296d0Smrg    /* set CRTC */
58895b296d0Smrg    for( i = 0; i < TVX_CRTC_NUM; i++ )
58995b296d0Smrg    {
59095b296d0Smrg         OUTB(0x3D4, TV_CRTC[i]);
59195b296d0Smrg
59295b296d0Smrg	 if (pTrident->TVChipset==2) {
59395b296d0Smrg            OUTB(0x3D5, TV_CH7005C_Table[idx][i]);
59495b296d0Smrg	 }
59595b296d0Smrg	 else {
59695b296d0Smrg	    OUTB(0x3D5, TVX_VT1621_Table[idx][i]);
59795b296d0Smrg	 }
59895b296d0Smrg    }
59995b296d0Smrg
60095b296d0Smrg
60195b296d0Smrg    /* Digital TV interface control */
60295b296d0Smrg    switch (pTrident->TVChipset)
60395b296d0Smrg    {
60495b296d0Smrg           case 1: OUTB(0x3C4,0xD8);
60595b296d0Smrg                   OUTB(0x3C5,0x60);
60695b296d0Smrg                   OUTB(0x3C4,0xD9);
60795b296d0Smrg                   OUTB(0x3C5,0x38);
60895b296d0Smrg		   break;
60995b296d0Smrg           case 2: OUTB(0x3c4,0xd8);
61095b296d0Smrg	           OUTB(0x3c5,0x24);
61195b296d0Smrg                   OUTB(0x3C4,0xD9);
61295b296d0Smrg                   OUTB(0x3C5,0x18);
61395b296d0Smrg		   break;
61495b296d0Smrg    }
61595b296d0Smrg
61695b296d0Smrg    switch (pTrident->TVChipset)
61795b296d0Smrg    {
61895b296d0Smrg           case 1:
61995b296d0Smrg                  /* set TVX registers */
62095b296d0Smrg                  for (i=0; i < TVX_REG_NUM; i++ )
62195b296d0Smrg                  {
62295b296d0Smrg                      smbus_write(pScrn,TVX_VT1621_Table[idx][TVX_CRTC_NUM+i], i, TVX_VT1621_PORT);
62395b296d0Smrg                  }
62495b296d0Smrg		  break;
62595b296d0Smrg           case 2:
62695b296d0Smrg	          for (i=0; i<TV_CH7005C_TVREG_NUM; i++)
62795b296d0Smrg		  {
62895b296d0Smrg                      smbus_write(pScrn,TV_CH7005C_Table[idx][TV_CH7005C_CRTC_NUM+i], TV_CH7005C_RegIdx[i], TV_CH7005C_PORT);
62995b296d0Smrg		  }
63095b296d0Smrg	          break;
63195b296d0Smrg    }
63295b296d0Smrg
63395b296d0Smrg    /*VIA_DumpReg(pScrn);*/
63495b296d0Smrg
63595b296d0Smrg    /* protect */
63695b296d0Smrg    OUTB(0x3C4, 0x11);
63795b296d0Smrg    OUTB(0x3C5, protect);
63895b296d0Smrg}
63995b296d0Smrgvoid VIA_DumpReg(ScrnInfoPtr pScrn)
64095b296d0Smrg{
64195b296d0Smrg    TRIDENTPtr pTrident=TRIDENTPTR(pScrn);
64295b296d0Smrg    int i,j;
64395b296d0Smrg    unsigned char bTmp;
64495b296d0Smrg    unsigned char protect;
64595b296d0Smrg
64695b296d0Smrg    /* Unprotect */
64795b296d0Smrg    OUTB(0x3C4, 0x11);
64895b296d0Smrg    protect = INB(0x3C5);
64995b296d0Smrg    OUTB(0x3C5, 0x92);
65095b296d0Smrg
65195b296d0Smrg    /* SR */
65295b296d0Smrg    for (i=0; i<16; i++)
65395b296d0Smrg    {
65495b296d0Smrg        for (j=0; j<16; j++)
65595b296d0Smrg	{
65695b296d0Smrg            OUTB(0x3c4,(16*i+j));
65795b296d0Smrg	    bTmp=INB(0x3c5);
65895b296d0Smrg
65995b296d0Smrg	    ErrorF("SR%02x=%02x ",(16*i+j),bTmp);
66095b296d0Smrg	}
66195b296d0Smrg	ErrorF("\n");
66295b296d0Smrg    }
66395b296d0Smrg    ErrorF("\n");
66495b296d0Smrg    /* CR */
66595b296d0Smrg    for (i=0; i<16; i++)
66695b296d0Smrg    {
66795b296d0Smrg        for (j=0; j<16; j++)
66895b296d0Smrg	{
66995b296d0Smrg            OUTB(0x3d4,(16*i+j));
67095b296d0Smrg	    bTmp=INB(0x3d5);
67195b296d0Smrg
67295b296d0Smrg	    ErrorF("CR%02x=%02x ",(16*i+j),bTmp);
67395b296d0Smrg	}
67495b296d0Smrg	ErrorF("\n");
67595b296d0Smrg    }
67695b296d0Smrg    ErrorF("\n");
67795b296d0Smrg    /* GR */
67895b296d0Smrg    for (i=0; i<16; i++)
67995b296d0Smrg    {
68095b296d0Smrg        for (j=0; j<16; j++)
68195b296d0Smrg	{
68295b296d0Smrg            OUTB(0x3ce,(16*i+j));
68395b296d0Smrg	    bTmp=INB(0x3cf);
68495b296d0Smrg
68595b296d0Smrg	    ErrorF("GR%02x=%02x ",(16*i+j),bTmp);
68695b296d0Smrg	}
68795b296d0Smrg	ErrorF("\n");
68895b296d0Smrg    }
68995b296d0Smrg    ErrorF("\n");
69095b296d0Smrg    /* SM */
69195b296d0Smrg    for (i=0; i<16; i++)
69295b296d0Smrg    {
69395b296d0Smrg        for (j=0; j<16; j++)
69495b296d0Smrg	{
69595b296d0Smrg	    if (pTrident->TVChipset==2)
69695b296d0Smrg               bTmp=smbus_read(pScrn,(16*i+j),TV_CH7005C_PORT);
69795b296d0Smrg	    else bTmp=smbus_read(pScrn,(16*i+j),TVX_VT1621_PORT);
69895b296d0Smrg	    ErrorF("SM%02x=%02x ",(16*i+j),bTmp);
69995b296d0Smrg	}
70095b296d0Smrg	ErrorF("\n");
70195b296d0Smrg    }
70295b296d0Smrg    ErrorF("\n");
70395b296d0Smrg    /* protect */
70495b296d0Smrg    OUTB(0x3C4, 0x11);
70595b296d0Smrg    OUTB(0x3C5, protect);
70695b296d0Smrg
70795b296d0Smrg}
708