cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

hw.c (59334B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
      4 * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
      5
      6 */
      7
      8#include <linux/via-core.h>
      9#include "global.h"
     10#include "via_clock.h"
     11
     12static struct pll_limit cle266_pll_limits[] = {
     13	{19, 19, 4, 0},
     14	{26, 102, 5, 0},
     15	{53, 112, 6, 0},
     16	{41, 100, 7, 0},
     17	{83, 108, 8, 0},
     18	{87, 118, 9, 0},
     19	{95, 115, 12, 0},
     20	{108, 108, 13, 0},
     21	{83, 83, 17, 0},
     22	{67, 98, 20, 0},
     23	{121, 121, 24, 0},
     24	{99, 99, 29, 0},
     25	{33, 33, 3, 1},
     26	{15, 23, 4, 1},
     27	{37, 121, 5, 1},
     28	{82, 82, 6, 1},
     29	{31, 84, 7, 1},
     30	{83, 83, 8, 1},
     31	{76, 127, 9, 1},
     32	{33, 121, 4, 2},
     33	{91, 118, 5, 2},
     34	{83, 109, 6, 2},
     35	{90, 90, 7, 2},
     36	{93, 93, 2, 3},
     37	{53, 53, 3, 3},
     38	{73, 117, 4, 3},
     39	{101, 127, 5, 3},
     40	{99, 99, 7, 3}
     41};
     42
     43static struct pll_limit k800_pll_limits[] = {
     44	{22, 22, 2, 0},
     45	{28, 28, 3, 0},
     46	{81, 112, 3, 1},
     47	{86, 166, 4, 1},
     48	{109, 153, 5, 1},
     49	{66, 116, 3, 2},
     50	{93, 137, 4, 2},
     51	{117, 208, 5, 2},
     52	{30, 30, 2, 3},
     53	{69, 125, 3, 3},
     54	{89, 161, 4, 3},
     55	{121, 208, 5, 3},
     56	{66, 66, 2, 4},
     57	{85, 85, 3, 4},
     58	{141, 161, 4, 4},
     59	{177, 177, 5, 4}
     60};
     61
     62static struct pll_limit cx700_pll_limits[] = {
     63	{98, 98, 3, 1},
     64	{86, 86, 4, 1},
     65	{109, 208, 5, 1},
     66	{68, 68, 2, 2},
     67	{95, 116, 3, 2},
     68	{93, 166, 4, 2},
     69	{110, 206, 5, 2},
     70	{174, 174, 7, 2},
     71	{82, 109, 3, 3},
     72	{117, 161, 4, 3},
     73	{112, 208, 5, 3},
     74	{141, 202, 5, 4}
     75};
     76
     77static struct pll_limit vx855_pll_limits[] = {
     78	{86, 86, 4, 1},
     79	{108, 208, 5, 1},
     80	{110, 208, 5, 2},
     81	{83, 112, 3, 3},
     82	{103, 161, 4, 3},
     83	{112, 209, 5, 3},
     84	{142, 161, 4, 4},
     85	{141, 176, 5, 4}
     86};
     87
     88/* according to VIA Technologies these values are based on experiment */
     89static struct io_reg scaling_parameters[] = {
     90	{VIACR, CR7A, 0xFF, 0x01},	/* LCD Scaling Parameter 1 */
     91	{VIACR, CR7B, 0xFF, 0x02},	/* LCD Scaling Parameter 2 */
     92	{VIACR, CR7C, 0xFF, 0x03},	/* LCD Scaling Parameter 3 */
     93	{VIACR, CR7D, 0xFF, 0x04},	/* LCD Scaling Parameter 4 */
     94	{VIACR, CR7E, 0xFF, 0x07},	/* LCD Scaling Parameter 5 */
     95	{VIACR, CR7F, 0xFF, 0x0A},	/* LCD Scaling Parameter 6 */
     96	{VIACR, CR80, 0xFF, 0x0D},	/* LCD Scaling Parameter 7 */
     97	{VIACR, CR81, 0xFF, 0x13},	/* LCD Scaling Parameter 8 */
     98	{VIACR, CR82, 0xFF, 0x16},	/* LCD Scaling Parameter 9 */
     99	{VIACR, CR83, 0xFF, 0x19},	/* LCD Scaling Parameter 10 */
    100	{VIACR, CR84, 0xFF, 0x1C},	/* LCD Scaling Parameter 11 */
    101	{VIACR, CR85, 0xFF, 0x1D},	/* LCD Scaling Parameter 12 */
    102	{VIACR, CR86, 0xFF, 0x1E},	/* LCD Scaling Parameter 13 */
    103	{VIACR, CR87, 0xFF, 0x1F},	/* LCD Scaling Parameter 14 */
    104};
    105
    106static struct io_reg common_vga[] = {
    107	{VIACR, CR07, 0x10, 0x10}, /* [0] vertical total (bit 8)
    108					[1] vertical display end (bit 8)
    109					[2] vertical retrace start (bit 8)
    110					[3] start vertical blanking (bit 8)
    111					[4] line compare (bit 8)
    112					[5] vertical total (bit 9)
    113					[6] vertical display end (bit 9)
    114					[7] vertical retrace start (bit 9) */
    115	{VIACR, CR08, 0xFF, 0x00}, /* [0-4] preset row scan
    116					[5-6] byte panning */
    117	{VIACR, CR09, 0xDF, 0x40}, /* [0-4] max scan line
    118					[5] start vertical blanking (bit 9)
    119					[6] line compare (bit 9)
    120					[7] scan doubling */
    121	{VIACR, CR0A, 0xFF, 0x1E}, /* [0-4] cursor start
    122					[5] cursor disable */
    123	{VIACR, CR0B, 0xFF, 0x00}, /* [0-4] cursor end
    124					[5-6] cursor skew */
    125	{VIACR, CR0E, 0xFF, 0x00}, /* [0-7] cursor location (high) */
    126	{VIACR, CR0F, 0xFF, 0x00}, /* [0-7] cursor location (low) */
    127	{VIACR, CR11, 0xF0, 0x80}, /* [0-3] vertical retrace end
    128					[6] memory refresh bandwidth
    129					[7] CRTC register protect enable */
    130	{VIACR, CR14, 0xFF, 0x00}, /* [0-4] underline location
    131					[5] divide memory address clock by 4
    132					[6] double word addressing */
    133	{VIACR, CR17, 0xFF, 0x63}, /* [0-1] mapping of display address 13-14
    134					[2] divide scan line clock by 2
    135					[3] divide memory address clock by 2
    136					[5] address wrap
    137					[6] byte mode select
    138					[7] sync enable */
    139	{VIACR, CR18, 0xFF, 0xFF}, /* [0-7] line compare */
    140};
    141
    142static struct fifo_depth_select display_fifo_depth_reg = {
    143	/* IGA1 FIFO Depth_Select */
    144	{IGA1_FIFO_DEPTH_SELECT_REG_NUM, {{SR17, 0, 7} } },
    145	/* IGA2 FIFO Depth_Select */
    146	{IGA2_FIFO_DEPTH_SELECT_REG_NUM,
    147	 {{CR68, 4, 7}, {CR94, 7, 7}, {CR95, 7, 7} } }
    148};
    149
    150static struct fifo_threshold_select fifo_threshold_select_reg = {
    151	/* IGA1 FIFO Threshold Select */
    152	{IGA1_FIFO_THRESHOLD_REG_NUM, {{SR16, 0, 5}, {SR16, 7, 7} } },
    153	/* IGA2 FIFO Threshold Select */
    154	{IGA2_FIFO_THRESHOLD_REG_NUM, {{CR68, 0, 3}, {CR95, 4, 6} } }
    155};
    156
    157static struct fifo_high_threshold_select fifo_high_threshold_select_reg = {
    158	/* IGA1 FIFO High Threshold Select */
    159	{IGA1_FIFO_HIGH_THRESHOLD_REG_NUM, {{SR18, 0, 5}, {SR18, 7, 7} } },
    160	/* IGA2 FIFO High Threshold Select */
    161	{IGA2_FIFO_HIGH_THRESHOLD_REG_NUM, {{CR92, 0, 3}, {CR95, 0, 2} } }
    162};
    163
    164static struct display_queue_expire_num display_queue_expire_num_reg = {
    165	/* IGA1 Display Queue Expire Num */
    166	{IGA1_DISPLAY_QUEUE_EXPIRE_NUM_REG_NUM, {{SR22, 0, 4} } },
    167	/* IGA2 Display Queue Expire Num */
    168	{IGA2_DISPLAY_QUEUE_EXPIRE_NUM_REG_NUM, {{CR94, 0, 6} } }
    169};
    170
    171/* Definition Fetch Count Registers*/
    172static struct fetch_count fetch_count_reg = {
    173	/* IGA1 Fetch Count Register */
    174	{IGA1_FETCH_COUNT_REG_NUM, {{SR1C, 0, 7}, {SR1D, 0, 1} } },
    175	/* IGA2 Fetch Count Register */
    176	{IGA2_FETCH_COUNT_REG_NUM, {{CR65, 0, 7}, {CR67, 2, 3} } }
    177};
    178
    179static struct rgbLUT palLUT_table[] = {
    180	/* {R,G,B} */
    181	/* Index 0x00~0x03 */
    182	{0x00, 0x00, 0x00}, {0x00, 0x00, 0x2A}, {0x00, 0x2A, 0x00}, {0x00,
    183								     0x2A,
    184								     0x2A},
    185	/* Index 0x04~0x07 */
    186	{0x2A, 0x00, 0x00}, {0x2A, 0x00, 0x2A}, {0x2A, 0x15, 0x00}, {0x2A,
    187								     0x2A,
    188								     0x2A},
    189	/* Index 0x08~0x0B */
    190	{0x15, 0x15, 0x15}, {0x15, 0x15, 0x3F}, {0x15, 0x3F, 0x15}, {0x15,
    191								     0x3F,
    192								     0x3F},
    193	/* Index 0x0C~0x0F */
    194	{0x3F, 0x15, 0x15}, {0x3F, 0x15, 0x3F}, {0x3F, 0x3F, 0x15}, {0x3F,
    195								     0x3F,
    196								     0x3F},
    197	/* Index 0x10~0x13 */
    198	{0x00, 0x00, 0x00}, {0x05, 0x05, 0x05}, {0x08, 0x08, 0x08}, {0x0B,
    199								     0x0B,
    200								     0x0B},
    201	/* Index 0x14~0x17 */
    202	{0x0E, 0x0E, 0x0E}, {0x11, 0x11, 0x11}, {0x14, 0x14, 0x14}, {0x18,
    203								     0x18,
    204								     0x18},
    205	/* Index 0x18~0x1B */
    206	{0x1C, 0x1C, 0x1C}, {0x20, 0x20, 0x20}, {0x24, 0x24, 0x24}, {0x28,
    207								     0x28,
    208								     0x28},
    209	/* Index 0x1C~0x1F */
    210	{0x2D, 0x2D, 0x2D}, {0x32, 0x32, 0x32}, {0x38, 0x38, 0x38}, {0x3F,
    211								     0x3F,
    212								     0x3F},
    213	/* Index 0x20~0x23 */
    214	{0x00, 0x00, 0x3F}, {0x10, 0x00, 0x3F}, {0x1F, 0x00, 0x3F}, {0x2F,
    215								     0x00,
    216								     0x3F},
    217	/* Index 0x24~0x27 */
    218	{0x3F, 0x00, 0x3F}, {0x3F, 0x00, 0x2F}, {0x3F, 0x00, 0x1F}, {0x3F,
    219								     0x00,
    220								     0x10},
    221	/* Index 0x28~0x2B */
    222	{0x3F, 0x00, 0x00}, {0x3F, 0x10, 0x00}, {0x3F, 0x1F, 0x00}, {0x3F,
    223								     0x2F,
    224								     0x00},
    225	/* Index 0x2C~0x2F */
    226	{0x3F, 0x3F, 0x00}, {0x2F, 0x3F, 0x00}, {0x1F, 0x3F, 0x00}, {0x10,
    227								     0x3F,
    228								     0x00},
    229	/* Index 0x30~0x33 */
    230	{0x00, 0x3F, 0x00}, {0x00, 0x3F, 0x10}, {0x00, 0x3F, 0x1F}, {0x00,
    231								     0x3F,
    232								     0x2F},
    233	/* Index 0x34~0x37 */
    234	{0x00, 0x3F, 0x3F}, {0x00, 0x2F, 0x3F}, {0x00, 0x1F, 0x3F}, {0x00,
    235								     0x10,
    236								     0x3F},
    237	/* Index 0x38~0x3B */
    238	{0x1F, 0x1F, 0x3F}, {0x27, 0x1F, 0x3F}, {0x2F, 0x1F, 0x3F}, {0x37,
    239								     0x1F,
    240								     0x3F},
    241	/* Index 0x3C~0x3F */
    242	{0x3F, 0x1F, 0x3F}, {0x3F, 0x1F, 0x37}, {0x3F, 0x1F, 0x2F}, {0x3F,
    243								     0x1F,
    244								     0x27},
    245	/* Index 0x40~0x43 */
    246	{0x3F, 0x1F, 0x1F}, {0x3F, 0x27, 0x1F}, {0x3F, 0x2F, 0x1F}, {0x3F,
    247								     0x3F,
    248								     0x1F},
    249	/* Index 0x44~0x47 */
    250	{0x3F, 0x3F, 0x1F}, {0x37, 0x3F, 0x1F}, {0x2F, 0x3F, 0x1F}, {0x27,
    251								     0x3F,
    252								     0x1F},
    253	/* Index 0x48~0x4B */
    254	{0x1F, 0x3F, 0x1F}, {0x1F, 0x3F, 0x27}, {0x1F, 0x3F, 0x2F}, {0x1F,
    255								     0x3F,
    256								     0x37},
    257	/* Index 0x4C~0x4F */
    258	{0x1F, 0x3F, 0x3F}, {0x1F, 0x37, 0x3F}, {0x1F, 0x2F, 0x3F}, {0x1F,
    259								     0x27,
    260								     0x3F},
    261	/* Index 0x50~0x53 */
    262	{0x2D, 0x2D, 0x3F}, {0x31, 0x2D, 0x3F}, {0x36, 0x2D, 0x3F}, {0x3A,
    263								     0x2D,
    264								     0x3F},
    265	/* Index 0x54~0x57 */
    266	{0x3F, 0x2D, 0x3F}, {0x3F, 0x2D, 0x3A}, {0x3F, 0x2D, 0x36}, {0x3F,
    267								     0x2D,
    268								     0x31},
    269	/* Index 0x58~0x5B */
    270	{0x3F, 0x2D, 0x2D}, {0x3F, 0x31, 0x2D}, {0x3F, 0x36, 0x2D}, {0x3F,
    271								     0x3A,
    272								     0x2D},
    273	/* Index 0x5C~0x5F */
    274	{0x3F, 0x3F, 0x2D}, {0x3A, 0x3F, 0x2D}, {0x36, 0x3F, 0x2D}, {0x31,
    275								     0x3F,
    276								     0x2D},
    277	/* Index 0x60~0x63 */
    278	{0x2D, 0x3F, 0x2D}, {0x2D, 0x3F, 0x31}, {0x2D, 0x3F, 0x36}, {0x2D,
    279								     0x3F,
    280								     0x3A},
    281	/* Index 0x64~0x67 */
    282	{0x2D, 0x3F, 0x3F}, {0x2D, 0x3A, 0x3F}, {0x2D, 0x36, 0x3F}, {0x2D,
    283								     0x31,
    284								     0x3F},
    285	/* Index 0x68~0x6B */
    286	{0x00, 0x00, 0x1C}, {0x07, 0x00, 0x1C}, {0x0E, 0x00, 0x1C}, {0x15,
    287								     0x00,
    288								     0x1C},
    289	/* Index 0x6C~0x6F */
    290	{0x1C, 0x00, 0x1C}, {0x1C, 0x00, 0x15}, {0x1C, 0x00, 0x0E}, {0x1C,
    291								     0x00,
    292								     0x07},
    293	/* Index 0x70~0x73 */
    294	{0x1C, 0x00, 0x00}, {0x1C, 0x07, 0x00}, {0x1C, 0x0E, 0x00}, {0x1C,
    295								     0x15,
    296								     0x00},
    297	/* Index 0x74~0x77 */
    298	{0x1C, 0x1C, 0x00}, {0x15, 0x1C, 0x00}, {0x0E, 0x1C, 0x00}, {0x07,
    299								     0x1C,
    300								     0x00},
    301	/* Index 0x78~0x7B */
    302	{0x00, 0x1C, 0x00}, {0x00, 0x1C, 0x07}, {0x00, 0x1C, 0x0E}, {0x00,
    303								     0x1C,
    304								     0x15},
    305	/* Index 0x7C~0x7F */
    306	{0x00, 0x1C, 0x1C}, {0x00, 0x15, 0x1C}, {0x00, 0x0E, 0x1C}, {0x00,
    307								     0x07,
    308								     0x1C},
    309	/* Index 0x80~0x83 */
    310	{0x0E, 0x0E, 0x1C}, {0x11, 0x0E, 0x1C}, {0x15, 0x0E, 0x1C}, {0x18,
    311								     0x0E,
    312								     0x1C},
    313	/* Index 0x84~0x87 */
    314	{0x1C, 0x0E, 0x1C}, {0x1C, 0x0E, 0x18}, {0x1C, 0x0E, 0x15}, {0x1C,
    315								     0x0E,
    316								     0x11},
    317	/* Index 0x88~0x8B */
    318	{0x1C, 0x0E, 0x0E}, {0x1C, 0x11, 0x0E}, {0x1C, 0x15, 0x0E}, {0x1C,
    319								     0x18,
    320								     0x0E},
    321	/* Index 0x8C~0x8F */
    322	{0x1C, 0x1C, 0x0E}, {0x18, 0x1C, 0x0E}, {0x15, 0x1C, 0x0E}, {0x11,
    323								     0x1C,
    324								     0x0E},
    325	/* Index 0x90~0x93 */
    326	{0x0E, 0x1C, 0x0E}, {0x0E, 0x1C, 0x11}, {0x0E, 0x1C, 0x15}, {0x0E,
    327								     0x1C,
    328								     0x18},
    329	/* Index 0x94~0x97 */
    330	{0x0E, 0x1C, 0x1C}, {0x0E, 0x18, 0x1C}, {0x0E, 0x15, 0x1C}, {0x0E,
    331								     0x11,
    332								     0x1C},
    333	/* Index 0x98~0x9B */
    334	{0x14, 0x14, 0x1C}, {0x16, 0x14, 0x1C}, {0x18, 0x14, 0x1C}, {0x1A,
    335								     0x14,
    336								     0x1C},
    337	/* Index 0x9C~0x9F */
    338	{0x1C, 0x14, 0x1C}, {0x1C, 0x14, 0x1A}, {0x1C, 0x14, 0x18}, {0x1C,
    339								     0x14,
    340								     0x16},
    341	/* Index 0xA0~0xA3 */
    342	{0x1C, 0x14, 0x14}, {0x1C, 0x16, 0x14}, {0x1C, 0x18, 0x14}, {0x1C,
    343								     0x1A,
    344								     0x14},
    345	/* Index 0xA4~0xA7 */
    346	{0x1C, 0x1C, 0x14}, {0x1A, 0x1C, 0x14}, {0x18, 0x1C, 0x14}, {0x16,
    347								     0x1C,
    348								     0x14},
    349	/* Index 0xA8~0xAB */
    350	{0x14, 0x1C, 0x14}, {0x14, 0x1C, 0x16}, {0x14, 0x1C, 0x18}, {0x14,
    351								     0x1C,
    352								     0x1A},
    353	/* Index 0xAC~0xAF */
    354	{0x14, 0x1C, 0x1C}, {0x14, 0x1A, 0x1C}, {0x14, 0x18, 0x1C}, {0x14,
    355								     0x16,
    356								     0x1C},
    357	/* Index 0xB0~0xB3 */
    358	{0x00, 0x00, 0x10}, {0x04, 0x00, 0x10}, {0x08, 0x00, 0x10}, {0x0C,
    359								     0x00,
    360								     0x10},
    361	/* Index 0xB4~0xB7 */
    362	{0x10, 0x00, 0x10}, {0x10, 0x00, 0x0C}, {0x10, 0x00, 0x08}, {0x10,
    363								     0x00,
    364								     0x04},
    365	/* Index 0xB8~0xBB */
    366	{0x10, 0x00, 0x00}, {0x10, 0x04, 0x00}, {0x10, 0x08, 0x00}, {0x10,
    367								     0x0C,
    368								     0x00},
    369	/* Index 0xBC~0xBF */
    370	{0x10, 0x10, 0x00}, {0x0C, 0x10, 0x00}, {0x08, 0x10, 0x00}, {0x04,
    371								     0x10,
    372								     0x00},
    373	/* Index 0xC0~0xC3 */
    374	{0x00, 0x10, 0x00}, {0x00, 0x10, 0x04}, {0x00, 0x10, 0x08}, {0x00,
    375								     0x10,
    376								     0x0C},
    377	/* Index 0xC4~0xC7 */
    378	{0x00, 0x10, 0x10}, {0x00, 0x0C, 0x10}, {0x00, 0x08, 0x10}, {0x00,
    379								     0x04,
    380								     0x10},
    381	/* Index 0xC8~0xCB */
    382	{0x08, 0x08, 0x10}, {0x0A, 0x08, 0x10}, {0x0C, 0x08, 0x10}, {0x0E,
    383								     0x08,
    384								     0x10},
    385	/* Index 0xCC~0xCF */
    386	{0x10, 0x08, 0x10}, {0x10, 0x08, 0x0E}, {0x10, 0x08, 0x0C}, {0x10,
    387								     0x08,
    388								     0x0A},
    389	/* Index 0xD0~0xD3 */
    390	{0x10, 0x08, 0x08}, {0x10, 0x0A, 0x08}, {0x10, 0x0C, 0x08}, {0x10,
    391								     0x0E,
    392								     0x08},
    393	/* Index 0xD4~0xD7 */
    394	{0x10, 0x10, 0x08}, {0x0E, 0x10, 0x08}, {0x0C, 0x10, 0x08}, {0x0A,
    395								     0x10,
    396								     0x08},
    397	/* Index 0xD8~0xDB */
    398	{0x08, 0x10, 0x08}, {0x08, 0x10, 0x0A}, {0x08, 0x10, 0x0C}, {0x08,
    399								     0x10,
    400								     0x0E},
    401	/* Index 0xDC~0xDF */
    402	{0x08, 0x10, 0x10}, {0x08, 0x0E, 0x10}, {0x08, 0x0C, 0x10}, {0x08,
    403								     0x0A,
    404								     0x10},
    405	/* Index 0xE0~0xE3 */
    406	{0x0B, 0x0B, 0x10}, {0x0C, 0x0B, 0x10}, {0x0D, 0x0B, 0x10}, {0x0F,
    407								     0x0B,
    408								     0x10},
    409	/* Index 0xE4~0xE7 */
    410	{0x10, 0x0B, 0x10}, {0x10, 0x0B, 0x0F}, {0x10, 0x0B, 0x0D}, {0x10,
    411								     0x0B,
    412								     0x0C},
    413	/* Index 0xE8~0xEB */
    414	{0x10, 0x0B, 0x0B}, {0x10, 0x0C, 0x0B}, {0x10, 0x0D, 0x0B}, {0x10,
    415								     0x0F,
    416								     0x0B},
    417	/* Index 0xEC~0xEF */
    418	{0x10, 0x10, 0x0B}, {0x0F, 0x10, 0x0B}, {0x0D, 0x10, 0x0B}, {0x0C,
    419								     0x10,
    420								     0x0B},
    421	/* Index 0xF0~0xF3 */
    422	{0x0B, 0x10, 0x0B}, {0x0B, 0x10, 0x0C}, {0x0B, 0x10, 0x0D}, {0x0B,
    423								     0x10,
    424								     0x0F},
    425	/* Index 0xF4~0xF7 */
    426	{0x0B, 0x10, 0x10}, {0x0B, 0x0F, 0x10}, {0x0B, 0x0D, 0x10}, {0x0B,
    427								     0x0C,
    428								     0x10},
    429	/* Index 0xF8~0xFB */
    430	{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00,
    431								     0x00,
    432								     0x00},
    433	/* Index 0xFC~0xFF */
    434	{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00,
    435								     0x00,
    436								     0x00}
    437};
    438
    439static struct via_device_mapping device_mapping[] = {
    440	{VIA_LDVP0, "LDVP0"},
    441	{VIA_LDVP1, "LDVP1"},
    442	{VIA_DVP0, "DVP0"},
    443	{VIA_CRT, "CRT"},
    444	{VIA_DVP1, "DVP1"},
    445	{VIA_LVDS1, "LVDS1"},
    446	{VIA_LVDS2, "LVDS2"}
    447};
    448
    449/* structure with function pointers to support clock control */
    450static struct via_clock clock;
    451
    452static void load_fix_bit_crtc_reg(void);
    453static void init_gfx_chip_info(int chip_type);
    454static void init_tmds_chip_info(void);
    455static void init_lvds_chip_info(void);
    456static void device_screen_off(void);
    457static void device_screen_on(void);
    458static void set_display_channel(void);
    459static void device_off(void);
    460static void device_on(void);
    461static void enable_second_display_channel(void);
    462static void disable_second_display_channel(void);
    463
    464void viafb_lock_crt(void)
    465{
    466	viafb_write_reg_mask(CR11, VIACR, BIT7, BIT7);
    467}
    468
    469void viafb_unlock_crt(void)
    470{
    471	viafb_write_reg_mask(CR11, VIACR, 0, BIT7);
    472	viafb_write_reg_mask(CR47, VIACR, 0, BIT0);
    473}
    474
    475static void write_dac_reg(u8 index, u8 r, u8 g, u8 b)
    476{
    477	outb(index, LUT_INDEX_WRITE);
    478	outb(r, LUT_DATA);
    479	outb(g, LUT_DATA);
    480	outb(b, LUT_DATA);
    481}
    482
    483static u32 get_dvi_devices(int output_interface)
    484{
    485	switch (output_interface) {
    486	case INTERFACE_DVP0:
    487		return VIA_DVP0 | VIA_LDVP0;
    488
    489	case INTERFACE_DVP1:
    490		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
    491			return VIA_LDVP1;
    492		else
    493			return VIA_DVP1;
    494
    495	case INTERFACE_DFP_HIGH:
    496		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
    497			return 0;
    498		else
    499			return VIA_LVDS2 | VIA_DVP0;
    500
    501	case INTERFACE_DFP_LOW:
    502		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
    503			return 0;
    504		else
    505			return VIA_DVP1 | VIA_LVDS1;
    506
    507	case INTERFACE_TMDS:
    508		return VIA_LVDS1;
    509	}
    510
    511	return 0;
    512}
    513
    514static u32 get_lcd_devices(int output_interface)
    515{
    516	switch (output_interface) {
    517	case INTERFACE_DVP0:
    518		return VIA_DVP0;
    519
    520	case INTERFACE_DVP1:
    521		return VIA_DVP1;
    522
    523	case INTERFACE_DFP_HIGH:
    524		return VIA_LVDS2 | VIA_DVP0;
    525
    526	case INTERFACE_DFP_LOW:
    527		return VIA_LVDS1 | VIA_DVP1;
    528
    529	case INTERFACE_DFP:
    530		return VIA_LVDS1 | VIA_LVDS2;
    531
    532	case INTERFACE_LVDS0:
    533	case INTERFACE_LVDS0LVDS1:
    534		return VIA_LVDS1;
    535
    536	case INTERFACE_LVDS1:
    537		return VIA_LVDS2;
    538	}
    539
    540	return 0;
    541}
    542
    543/*Set IGA path for each device*/
    544void viafb_set_iga_path(void)
    545{
    546	int crt_iga_path = 0;
    547
    548	if (viafb_SAMM_ON == 1) {
    549		if (viafb_CRT_ON) {
    550			if (viafb_primary_dev == CRT_Device)
    551				crt_iga_path = IGA1;
    552			else
    553				crt_iga_path = IGA2;
    554		}
    555
    556		if (viafb_DVI_ON) {
    557			if (viafb_primary_dev == DVI_Device)
    558				viaparinfo->tmds_setting_info->iga_path = IGA1;
    559			else
    560				viaparinfo->tmds_setting_info->iga_path = IGA2;
    561		}
    562
    563		if (viafb_LCD_ON) {
    564			if (viafb_primary_dev == LCD_Device) {
    565				if (viafb_dual_fb &&
    566					(viaparinfo->chip_info->gfx_chip_name ==
    567					UNICHROME_CLE266)) {
    568					viaparinfo->
    569					lvds_setting_info->iga_path = IGA2;
    570					crt_iga_path = IGA1;
    571					viaparinfo->
    572					tmds_setting_info->iga_path = IGA1;
    573				} else
    574					viaparinfo->
    575					lvds_setting_info->iga_path = IGA1;
    576			} else {
    577				viaparinfo->lvds_setting_info->iga_path = IGA2;
    578			}
    579		}
    580		if (viafb_LCD2_ON) {
    581			if (LCD2_Device == viafb_primary_dev)
    582				viaparinfo->lvds_setting_info2->iga_path = IGA1;
    583			else
    584				viaparinfo->lvds_setting_info2->iga_path = IGA2;
    585		}
    586	} else {
    587		viafb_SAMM_ON = 0;
    588
    589		if (viafb_CRT_ON && viafb_LCD_ON) {
    590			crt_iga_path = IGA1;
    591			viaparinfo->lvds_setting_info->iga_path = IGA2;
    592		} else if (viafb_CRT_ON && viafb_DVI_ON) {
    593			crt_iga_path = IGA1;
    594			viaparinfo->tmds_setting_info->iga_path = IGA2;
    595		} else if (viafb_LCD_ON && viafb_DVI_ON) {
    596			viaparinfo->tmds_setting_info->iga_path = IGA1;
    597			viaparinfo->lvds_setting_info->iga_path = IGA2;
    598		} else if (viafb_LCD_ON && viafb_LCD2_ON) {
    599			viaparinfo->lvds_setting_info->iga_path = IGA2;
    600			viaparinfo->lvds_setting_info2->iga_path = IGA2;
    601		} else if (viafb_CRT_ON) {
    602			crt_iga_path = IGA1;
    603		} else if (viafb_LCD_ON) {
    604			viaparinfo->lvds_setting_info->iga_path = IGA2;
    605		} else if (viafb_DVI_ON) {
    606			viaparinfo->tmds_setting_info->iga_path = IGA1;
    607		}
    608	}
    609
    610	viaparinfo->shared->iga1_devices = 0;
    611	viaparinfo->shared->iga2_devices = 0;
    612	if (viafb_CRT_ON) {
    613		if (crt_iga_path == IGA1)
    614			viaparinfo->shared->iga1_devices |= VIA_CRT;
    615		else
    616			viaparinfo->shared->iga2_devices |= VIA_CRT;
    617	}
    618
    619	if (viafb_DVI_ON) {
    620		if (viaparinfo->tmds_setting_info->iga_path == IGA1)
    621			viaparinfo->shared->iga1_devices |= get_dvi_devices(
    622				viaparinfo->chip_info->
    623				tmds_chip_info.output_interface);
    624		else
    625			viaparinfo->shared->iga2_devices |= get_dvi_devices(
    626				viaparinfo->chip_info->
    627				tmds_chip_info.output_interface);
    628	}
    629
    630	if (viafb_LCD_ON) {
    631		if (viaparinfo->lvds_setting_info->iga_path == IGA1)
    632			viaparinfo->shared->iga1_devices |= get_lcd_devices(
    633				viaparinfo->chip_info->
    634				lvds_chip_info.output_interface);
    635		else
    636			viaparinfo->shared->iga2_devices |= get_lcd_devices(
    637				viaparinfo->chip_info->
    638				lvds_chip_info.output_interface);
    639	}
    640
    641	if (viafb_LCD2_ON) {
    642		if (viaparinfo->lvds_setting_info2->iga_path == IGA1)
    643			viaparinfo->shared->iga1_devices |= get_lcd_devices(
    644				viaparinfo->chip_info->
    645				lvds_chip_info2.output_interface);
    646		else
    647			viaparinfo->shared->iga2_devices |= get_lcd_devices(
    648				viaparinfo->chip_info->
    649				lvds_chip_info2.output_interface);
    650	}
    651
    652	/* looks like the OLPC has its display wired to DVP1 and LVDS2 */
    653	if (machine_is_olpc())
    654		viaparinfo->shared->iga2_devices = VIA_DVP1 | VIA_LVDS2;
    655}
    656
    657static void set_color_register(u8 index, u8 red, u8 green, u8 blue)
    658{
    659	outb(0xFF, 0x3C6); /* bit mask of palette */
    660	outb(index, 0x3C8);
    661	outb(red, 0x3C9);
    662	outb(green, 0x3C9);
    663	outb(blue, 0x3C9);
    664}
    665
    666void viafb_set_primary_color_register(u8 index, u8 red, u8 green, u8 blue)
    667{
    668	viafb_write_reg_mask(0x1A, VIASR, 0x00, 0x01);
    669	set_color_register(index, red, green, blue);
    670}
    671
    672void viafb_set_secondary_color_register(u8 index, u8 red, u8 green, u8 blue)
    673{
    674	viafb_write_reg_mask(0x1A, VIASR, 0x01, 0x01);
    675	set_color_register(index, red, green, blue);
    676}
    677
    678static void set_source_common(u8 index, u8 offset, u8 iga)
    679{
    680	u8 value, mask = 1 << offset;
    681
    682	switch (iga) {
    683	case IGA1:
    684		value = 0x00;
    685		break;
    686	case IGA2:
    687		value = mask;
    688		break;
    689	default:
    690		printk(KERN_WARNING "viafb: Unsupported source: %d\n", iga);
    691		return;
    692	}
    693
    694	via_write_reg_mask(VIACR, index, value, mask);
    695}
    696
    697static void set_crt_source(u8 iga)
    698{
    699	u8 value;
    700
    701	switch (iga) {
    702	case IGA1:
    703		value = 0x00;
    704		break;
    705	case IGA2:
    706		value = 0x40;
    707		break;
    708	default:
    709		printk(KERN_WARNING "viafb: Unsupported source: %d\n", iga);
    710		return;
    711	}
    712
    713	via_write_reg_mask(VIASR, 0x16, value, 0x40);
    714}
    715
    716static inline void set_ldvp0_source(u8 iga)
    717{
    718	set_source_common(0x6C, 7, iga);
    719}
    720
    721static inline void set_ldvp1_source(u8 iga)
    722{
    723	set_source_common(0x93, 7, iga);
    724}
    725
    726static inline void set_dvp0_source(u8 iga)
    727{
    728	set_source_common(0x96, 4, iga);
    729}
    730
    731static inline void set_dvp1_source(u8 iga)
    732{
    733	set_source_common(0x9B, 4, iga);
    734}
    735
    736static inline void set_lvds1_source(u8 iga)
    737{
    738	set_source_common(0x99, 4, iga);
    739}
    740
    741static inline void set_lvds2_source(u8 iga)
    742{
    743	set_source_common(0x97, 4, iga);
    744}
    745
    746void via_set_source(u32 devices, u8 iga)
    747{
    748	if (devices & VIA_LDVP0)
    749		set_ldvp0_source(iga);
    750	if (devices & VIA_LDVP1)
    751		set_ldvp1_source(iga);
    752	if (devices & VIA_DVP0)
    753		set_dvp0_source(iga);
    754	if (devices & VIA_CRT)
    755		set_crt_source(iga);
    756	if (devices & VIA_DVP1)
    757		set_dvp1_source(iga);
    758	if (devices & VIA_LVDS1)
    759		set_lvds1_source(iga);
    760	if (devices & VIA_LVDS2)
    761		set_lvds2_source(iga);
    762}
    763
    764static void set_crt_state(u8 state)
    765{
    766	u8 value;
    767
    768	switch (state) {
    769	case VIA_STATE_ON:
    770		value = 0x00;
    771		break;
    772	case VIA_STATE_STANDBY:
    773		value = 0x10;
    774		break;
    775	case VIA_STATE_SUSPEND:
    776		value = 0x20;
    777		break;
    778	case VIA_STATE_OFF:
    779		value = 0x30;
    780		break;
    781	default:
    782		return;
    783	}
    784
    785	via_write_reg_mask(VIACR, 0x36, value, 0x30);
    786}
    787
    788static void set_dvp0_state(u8 state)
    789{
    790	u8 value;
    791
    792	switch (state) {
    793	case VIA_STATE_ON:
    794		value = 0xC0;
    795		break;
    796	case VIA_STATE_OFF:
    797		value = 0x00;
    798		break;
    799	default:
    800		return;
    801	}
    802
    803	via_write_reg_mask(VIASR, 0x1E, value, 0xC0);
    804}
    805
    806static void set_dvp1_state(u8 state)
    807{
    808	u8 value;
    809
    810	switch (state) {
    811	case VIA_STATE_ON:
    812		value = 0x30;
    813		break;
    814	case VIA_STATE_OFF:
    815		value = 0x00;
    816		break;
    817	default:
    818		return;
    819	}
    820
    821	via_write_reg_mask(VIASR, 0x1E, value, 0x30);
    822}
    823
    824static void set_lvds1_state(u8 state)
    825{
    826	u8 value;
    827
    828	switch (state) {
    829	case VIA_STATE_ON:
    830		value = 0x03;
    831		break;
    832	case VIA_STATE_OFF:
    833		value = 0x00;
    834		break;
    835	default:
    836		return;
    837	}
    838
    839	via_write_reg_mask(VIASR, 0x2A, value, 0x03);
    840}
    841
    842static void set_lvds2_state(u8 state)
    843{
    844	u8 value;
    845
    846	switch (state) {
    847	case VIA_STATE_ON:
    848		value = 0x0C;
    849		break;
    850	case VIA_STATE_OFF:
    851		value = 0x00;
    852		break;
    853	default:
    854		return;
    855	}
    856
    857	via_write_reg_mask(VIASR, 0x2A, value, 0x0C);
    858}
    859
    860void via_set_state(u32 devices, u8 state)
    861{
    862	/*
    863	TODO: Can we enable/disable these devices? How?
    864	if (devices & VIA_LDVP0)
    865	if (devices & VIA_LDVP1)
    866	*/
    867	if (devices & VIA_DVP0)
    868		set_dvp0_state(state);
    869	if (devices & VIA_CRT)
    870		set_crt_state(state);
    871	if (devices & VIA_DVP1)
    872		set_dvp1_state(state);
    873	if (devices & VIA_LVDS1)
    874		set_lvds1_state(state);
    875	if (devices & VIA_LVDS2)
    876		set_lvds2_state(state);
    877}
    878
    879void via_set_sync_polarity(u32 devices, u8 polarity)
    880{
    881	if (polarity & ~(VIA_HSYNC_NEGATIVE | VIA_VSYNC_NEGATIVE)) {
    882		printk(KERN_WARNING "viafb: Unsupported polarity: %d\n",
    883			polarity);
    884		return;
    885	}
    886
    887	if (devices & VIA_CRT)
    888		via_write_misc_reg_mask(polarity << 6, 0xC0);
    889	if (devices & VIA_DVP1)
    890		via_write_reg_mask(VIACR, 0x9B, polarity << 5, 0x60);
    891	if (devices & VIA_LVDS1)
    892		via_write_reg_mask(VIACR, 0x99, polarity << 5, 0x60);
    893	if (devices & VIA_LVDS2)
    894		via_write_reg_mask(VIACR, 0x97, polarity << 5, 0x60);
    895}
    896
    897u32 via_parse_odev(char *input, char **end)
    898{
    899	char *ptr = input;
    900	u32 odev = 0;
    901	bool next = true;
    902	int i, len;
    903
    904	while (next) {
    905		next = false;
    906		for (i = 0; i < ARRAY_SIZE(device_mapping); i++) {
    907			len = strlen(device_mapping[i].name);
    908			if (!strncmp(ptr, device_mapping[i].name, len)) {
    909				odev |= device_mapping[i].device;
    910				ptr += len;
    911				if (*ptr == ',') {
    912					ptr++;
    913					next = true;
    914				}
    915			}
    916		}
    917	}
    918
    919	*end = ptr;
    920	return odev;
    921}
    922
    923void via_odev_to_seq(struct seq_file *m, u32 odev)
    924{
    925	int i, count = 0;
    926
    927	for (i = 0; i < ARRAY_SIZE(device_mapping); i++) {
    928		if (odev & device_mapping[i].device) {
    929			if (count > 0)
    930				seq_putc(m, ',');
    931
    932			seq_puts(m, device_mapping[i].name);
    933			count++;
    934		}
    935	}
    936
    937	seq_putc(m, '\n');
    938}
    939
    940static void load_fix_bit_crtc_reg(void)
    941{
    942	viafb_unlock_crt();
    943
    944	/* always set to 1 */
    945	viafb_write_reg_mask(CR03, VIACR, 0x80, BIT7);
    946	/* line compare should set all bits = 1 (extend modes) */
    947	viafb_write_reg_mask(CR35, VIACR, 0x10, BIT4);
    948	/* line compare should set all bits = 1 (extend modes) */
    949	viafb_write_reg_mask(CR33, VIACR, 0x06, BIT0 + BIT1 + BIT2);
    950	/*viafb_write_reg_mask(CR32, VIACR, 0x01, BIT0); */
    951
    952	viafb_lock_crt();
    953
    954	/* If K8M800, enable Prefetch Mode. */
    955	if ((viaparinfo->chip_info->gfx_chip_name == UNICHROME_K800)
    956		|| (viaparinfo->chip_info->gfx_chip_name == UNICHROME_K8M890))
    957		viafb_write_reg_mask(CR33, VIACR, 0x08, BIT3);
    958	if ((viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
    959	    && (viaparinfo->chip_info->gfx_chip_revision == CLE266_REVISION_AX))
    960		viafb_write_reg_mask(SR1A, VIASR, 0x02, BIT1);
    961
    962}
    963
    964void viafb_load_reg(int timing_value, int viafb_load_reg_num,
    965	struct io_register *reg,
    966	      int io_type)
    967{
    968	int reg_mask;
    969	int bit_num = 0;
    970	int data;
    971	int i, j;
    972	int shift_next_reg;
    973	int start_index, end_index, cr_index;
    974	u16 get_bit;
    975
    976	for (i = 0; i < viafb_load_reg_num; i++) {
    977		reg_mask = 0;
    978		data = 0;
    979		start_index = reg[i].start_bit;
    980		end_index = reg[i].end_bit;
    981		cr_index = reg[i].io_addr;
    982
    983		shift_next_reg = bit_num;
    984		for (j = start_index; j <= end_index; j++) {
    985			/*if (bit_num==8) timing_value = timing_value >>8; */
    986			reg_mask = reg_mask | (BIT0 << j);
    987			get_bit = (timing_value & (BIT0 << bit_num));
    988			data =
    989			    data | ((get_bit >> shift_next_reg) << start_index);
    990			bit_num++;
    991		}
    992		if (io_type == VIACR)
    993			viafb_write_reg_mask(cr_index, VIACR, data, reg_mask);
    994		else
    995			viafb_write_reg_mask(cr_index, VIASR, data, reg_mask);
    996	}
    997
    998}
    999
   1000/* Write Registers */
   1001void viafb_write_regx(struct io_reg RegTable[], int ItemNum)
   1002{
   1003	int i;
   1004
   1005	/*DEBUG_MSG(KERN_INFO "Table Size : %x!!\n",ItemNum ); */
   1006
   1007	for (i = 0; i < ItemNum; i++)
   1008		via_write_reg_mask(RegTable[i].port, RegTable[i].index,
   1009			RegTable[i].value, RegTable[i].mask);
   1010}
   1011
   1012void viafb_load_fetch_count_reg(int h_addr, int bpp_byte, int set_iga)
   1013{
   1014	int reg_value;
   1015	int viafb_load_reg_num;
   1016	struct io_register *reg = NULL;
   1017
   1018	switch (set_iga) {
   1019	case IGA1:
   1020		reg_value = IGA1_FETCH_COUNT_FORMULA(h_addr, bpp_byte);
   1021		viafb_load_reg_num = fetch_count_reg.
   1022			iga1_fetch_count_reg.reg_num;
   1023		reg = fetch_count_reg.iga1_fetch_count_reg.reg;
   1024		viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIASR);
   1025		break;
   1026	case IGA2:
   1027		reg_value = IGA2_FETCH_COUNT_FORMULA(h_addr, bpp_byte);
   1028		viafb_load_reg_num = fetch_count_reg.
   1029			iga2_fetch_count_reg.reg_num;
   1030		reg = fetch_count_reg.iga2_fetch_count_reg.reg;
   1031		viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIACR);
   1032		break;
   1033	}
   1034
   1035}
   1036
   1037void viafb_load_FIFO_reg(int set_iga, int hor_active, int ver_active)
   1038{
   1039	int reg_value;
   1040	int viafb_load_reg_num;
   1041	struct io_register *reg = NULL;
   1042	int iga1_fifo_max_depth = 0, iga1_fifo_threshold =
   1043	    0, iga1_fifo_high_threshold = 0, iga1_display_queue_expire_num = 0;
   1044	int iga2_fifo_max_depth = 0, iga2_fifo_threshold =
   1045	    0, iga2_fifo_high_threshold = 0, iga2_display_queue_expire_num = 0;
   1046
   1047	if (set_iga == IGA1) {
   1048		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_K800) {
   1049			iga1_fifo_max_depth = K800_IGA1_FIFO_MAX_DEPTH;
   1050			iga1_fifo_threshold = K800_IGA1_FIFO_THRESHOLD;
   1051			iga1_fifo_high_threshold =
   1052			    K800_IGA1_FIFO_HIGH_THRESHOLD;
   1053			/* If resolution > 1280x1024, expire length = 64, else
   1054			   expire length = 128 */
   1055			if ((hor_active > 1280) && (ver_active > 1024))
   1056				iga1_display_queue_expire_num = 16;
   1057			else
   1058				iga1_display_queue_expire_num =
   1059				    K800_IGA1_DISPLAY_QUEUE_EXPIRE_NUM;
   1060
   1061		}
   1062
   1063		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_PM800) {
   1064			iga1_fifo_max_depth = P880_IGA1_FIFO_MAX_DEPTH;
   1065			iga1_fifo_threshold = P880_IGA1_FIFO_THRESHOLD;
   1066			iga1_fifo_high_threshold =
   1067			    P880_IGA1_FIFO_HIGH_THRESHOLD;
   1068			iga1_display_queue_expire_num =
   1069			    P880_IGA1_DISPLAY_QUEUE_EXPIRE_NUM;
   1070
   1071			/* If resolution > 1280x1024, expire length = 64, else
   1072			   expire length = 128 */
   1073			if ((hor_active > 1280) && (ver_active > 1024))
   1074				iga1_display_queue_expire_num = 16;
   1075			else
   1076				iga1_display_queue_expire_num =
   1077				    P880_IGA1_DISPLAY_QUEUE_EXPIRE_NUM;
   1078		}
   1079
   1080		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CN700) {
   1081			iga1_fifo_max_depth = CN700_IGA1_FIFO_MAX_DEPTH;
   1082			iga1_fifo_threshold = CN700_IGA1_FIFO_THRESHOLD;
   1083			iga1_fifo_high_threshold =
   1084			    CN700_IGA1_FIFO_HIGH_THRESHOLD;
   1085
   1086			/* If resolution > 1280x1024, expire length = 64,
   1087			   else expire length = 128 */
   1088			if ((hor_active > 1280) && (ver_active > 1024))
   1089				iga1_display_queue_expire_num = 16;
   1090			else
   1091				iga1_display_queue_expire_num =
   1092				    CN700_IGA1_DISPLAY_QUEUE_EXPIRE_NUM;
   1093		}
   1094
   1095		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CX700) {
   1096			iga1_fifo_max_depth = CX700_IGA1_FIFO_MAX_DEPTH;
   1097			iga1_fifo_threshold = CX700_IGA1_FIFO_THRESHOLD;
   1098			iga1_fifo_high_threshold =
   1099			    CX700_IGA1_FIFO_HIGH_THRESHOLD;
   1100			iga1_display_queue_expire_num =
   1101			    CX700_IGA1_DISPLAY_QUEUE_EXPIRE_NUM;
   1102		}
   1103
   1104		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_K8M890) {
   1105			iga1_fifo_max_depth = K8M890_IGA1_FIFO_MAX_DEPTH;
   1106			iga1_fifo_threshold = K8M890_IGA1_FIFO_THRESHOLD;
   1107			iga1_fifo_high_threshold =
   1108			    K8M890_IGA1_FIFO_HIGH_THRESHOLD;
   1109			iga1_display_queue_expire_num =
   1110			    K8M890_IGA1_DISPLAY_QUEUE_EXPIRE_NUM;
   1111		}
   1112
   1113		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_P4M890) {
   1114			iga1_fifo_max_depth = P4M890_IGA1_FIFO_MAX_DEPTH;
   1115			iga1_fifo_threshold = P4M890_IGA1_FIFO_THRESHOLD;
   1116			iga1_fifo_high_threshold =
   1117			    P4M890_IGA1_FIFO_HIGH_THRESHOLD;
   1118			iga1_display_queue_expire_num =
   1119			    P4M890_IGA1_DISPLAY_QUEUE_EXPIRE_NUM;
   1120		}
   1121
   1122		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_P4M900) {
   1123			iga1_fifo_max_depth = P4M900_IGA1_FIFO_MAX_DEPTH;
   1124			iga1_fifo_threshold = P4M900_IGA1_FIFO_THRESHOLD;
   1125			iga1_fifo_high_threshold =
   1126			    P4M900_IGA1_FIFO_HIGH_THRESHOLD;
   1127			iga1_display_queue_expire_num =
   1128			    P4M900_IGA1_DISPLAY_QUEUE_EXPIRE_NUM;
   1129		}
   1130
   1131		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_VX800) {
   1132			iga1_fifo_max_depth = VX800_IGA1_FIFO_MAX_DEPTH;
   1133			iga1_fifo_threshold = VX800_IGA1_FIFO_THRESHOLD;
   1134			iga1_fifo_high_threshold =
   1135			    VX800_IGA1_FIFO_HIGH_THRESHOLD;
   1136			iga1_display_queue_expire_num =
   1137			    VX800_IGA1_DISPLAY_QUEUE_EXPIRE_NUM;
   1138		}
   1139
   1140		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_VX855) {
   1141			iga1_fifo_max_depth = VX855_IGA1_FIFO_MAX_DEPTH;
   1142			iga1_fifo_threshold = VX855_IGA1_FIFO_THRESHOLD;
   1143			iga1_fifo_high_threshold =
   1144			    VX855_IGA1_FIFO_HIGH_THRESHOLD;
   1145			iga1_display_queue_expire_num =
   1146			    VX855_IGA1_DISPLAY_QUEUE_EXPIRE_NUM;
   1147		}
   1148
   1149		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_VX900) {
   1150			iga1_fifo_max_depth = VX900_IGA1_FIFO_MAX_DEPTH;
   1151			iga1_fifo_threshold = VX900_IGA1_FIFO_THRESHOLD;
   1152			iga1_fifo_high_threshold =
   1153			    VX900_IGA1_FIFO_HIGH_THRESHOLD;
   1154			iga1_display_queue_expire_num =
   1155			    VX900_IGA1_DISPLAY_QUEUE_EXPIRE_NUM;
   1156		}
   1157
   1158		/* Set Display FIFO Depath Select */
   1159		reg_value = IGA1_FIFO_DEPTH_SELECT_FORMULA(iga1_fifo_max_depth);
   1160		viafb_load_reg_num =
   1161		    display_fifo_depth_reg.iga1_fifo_depth_select_reg.reg_num;
   1162		reg = display_fifo_depth_reg.iga1_fifo_depth_select_reg.reg;
   1163		viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIASR);
   1164
   1165		/* Set Display FIFO Threshold Select */
   1166		reg_value = IGA1_FIFO_THRESHOLD_FORMULA(iga1_fifo_threshold);
   1167		viafb_load_reg_num =
   1168		    fifo_threshold_select_reg.
   1169		    iga1_fifo_threshold_select_reg.reg_num;
   1170		reg =
   1171		    fifo_threshold_select_reg.
   1172		    iga1_fifo_threshold_select_reg.reg;
   1173		viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIASR);
   1174
   1175		/* Set FIFO High Threshold Select */
   1176		reg_value =
   1177		    IGA1_FIFO_HIGH_THRESHOLD_FORMULA(iga1_fifo_high_threshold);
   1178		viafb_load_reg_num =
   1179		    fifo_high_threshold_select_reg.
   1180		    iga1_fifo_high_threshold_select_reg.reg_num;
   1181		reg =
   1182		    fifo_high_threshold_select_reg.
   1183		    iga1_fifo_high_threshold_select_reg.reg;
   1184		viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIASR);
   1185
   1186		/* Set Display Queue Expire Num */
   1187		reg_value =
   1188		    IGA1_DISPLAY_QUEUE_EXPIRE_NUM_FORMULA
   1189		    (iga1_display_queue_expire_num);
   1190		viafb_load_reg_num =
   1191		    display_queue_expire_num_reg.
   1192		    iga1_display_queue_expire_num_reg.reg_num;
   1193		reg =
   1194		    display_queue_expire_num_reg.
   1195		    iga1_display_queue_expire_num_reg.reg;
   1196		viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIASR);
   1197
   1198	} else {
   1199		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_K800) {
   1200			iga2_fifo_max_depth = K800_IGA2_FIFO_MAX_DEPTH;
   1201			iga2_fifo_threshold = K800_IGA2_FIFO_THRESHOLD;
   1202			iga2_fifo_high_threshold =
   1203			    K800_IGA2_FIFO_HIGH_THRESHOLD;
   1204
   1205			/* If resolution > 1280x1024, expire length = 64,
   1206			   else  expire length = 128 */
   1207			if ((hor_active > 1280) && (ver_active > 1024))
   1208				iga2_display_queue_expire_num = 16;
   1209			else
   1210				iga2_display_queue_expire_num =
   1211				    K800_IGA2_DISPLAY_QUEUE_EXPIRE_NUM;
   1212		}
   1213
   1214		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_PM800) {
   1215			iga2_fifo_max_depth = P880_IGA2_FIFO_MAX_DEPTH;
   1216			iga2_fifo_threshold = P880_IGA2_FIFO_THRESHOLD;
   1217			iga2_fifo_high_threshold =
   1218			    P880_IGA2_FIFO_HIGH_THRESHOLD;
   1219
   1220			/* If resolution > 1280x1024, expire length = 64,
   1221			   else  expire length = 128 */
   1222			if ((hor_active > 1280) && (ver_active > 1024))
   1223				iga2_display_queue_expire_num = 16;
   1224			else
   1225				iga2_display_queue_expire_num =
   1226				    P880_IGA2_DISPLAY_QUEUE_EXPIRE_NUM;
   1227		}
   1228
   1229		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CN700) {
   1230			iga2_fifo_max_depth = CN700_IGA2_FIFO_MAX_DEPTH;
   1231			iga2_fifo_threshold = CN700_IGA2_FIFO_THRESHOLD;
   1232			iga2_fifo_high_threshold =
   1233			    CN700_IGA2_FIFO_HIGH_THRESHOLD;
   1234
   1235			/* If resolution > 1280x1024, expire length = 64,
   1236			   else expire length = 128 */
   1237			if ((hor_active > 1280) && (ver_active > 1024))
   1238				iga2_display_queue_expire_num = 16;
   1239			else
   1240				iga2_display_queue_expire_num =
   1241				    CN700_IGA2_DISPLAY_QUEUE_EXPIRE_NUM;
   1242		}
   1243
   1244		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CX700) {
   1245			iga2_fifo_max_depth = CX700_IGA2_FIFO_MAX_DEPTH;
   1246			iga2_fifo_threshold = CX700_IGA2_FIFO_THRESHOLD;
   1247			iga2_fifo_high_threshold =
   1248			    CX700_IGA2_FIFO_HIGH_THRESHOLD;
   1249			iga2_display_queue_expire_num =
   1250			    CX700_IGA2_DISPLAY_QUEUE_EXPIRE_NUM;
   1251		}
   1252
   1253		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_K8M890) {
   1254			iga2_fifo_max_depth = K8M890_IGA2_FIFO_MAX_DEPTH;
   1255			iga2_fifo_threshold = K8M890_IGA2_FIFO_THRESHOLD;
   1256			iga2_fifo_high_threshold =
   1257			    K8M890_IGA2_FIFO_HIGH_THRESHOLD;
   1258			iga2_display_queue_expire_num =
   1259			    K8M890_IGA2_DISPLAY_QUEUE_EXPIRE_NUM;
   1260		}
   1261
   1262		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_P4M890) {
   1263			iga2_fifo_max_depth = P4M890_IGA2_FIFO_MAX_DEPTH;
   1264			iga2_fifo_threshold = P4M890_IGA2_FIFO_THRESHOLD;
   1265			iga2_fifo_high_threshold =
   1266			    P4M890_IGA2_FIFO_HIGH_THRESHOLD;
   1267			iga2_display_queue_expire_num =
   1268			    P4M890_IGA2_DISPLAY_QUEUE_EXPIRE_NUM;
   1269		}
   1270
   1271		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_P4M900) {
   1272			iga2_fifo_max_depth = P4M900_IGA2_FIFO_MAX_DEPTH;
   1273			iga2_fifo_threshold = P4M900_IGA2_FIFO_THRESHOLD;
   1274			iga2_fifo_high_threshold =
   1275			    P4M900_IGA2_FIFO_HIGH_THRESHOLD;
   1276			iga2_display_queue_expire_num =
   1277			    P4M900_IGA2_DISPLAY_QUEUE_EXPIRE_NUM;
   1278		}
   1279
   1280		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_VX800) {
   1281			iga2_fifo_max_depth = VX800_IGA2_FIFO_MAX_DEPTH;
   1282			iga2_fifo_threshold = VX800_IGA2_FIFO_THRESHOLD;
   1283			iga2_fifo_high_threshold =
   1284			    VX800_IGA2_FIFO_HIGH_THRESHOLD;
   1285			iga2_display_queue_expire_num =
   1286			    VX800_IGA2_DISPLAY_QUEUE_EXPIRE_NUM;
   1287		}
   1288
   1289		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_VX855) {
   1290			iga2_fifo_max_depth = VX855_IGA2_FIFO_MAX_DEPTH;
   1291			iga2_fifo_threshold = VX855_IGA2_FIFO_THRESHOLD;
   1292			iga2_fifo_high_threshold =
   1293			    VX855_IGA2_FIFO_HIGH_THRESHOLD;
   1294			iga2_display_queue_expire_num =
   1295			    VX855_IGA2_DISPLAY_QUEUE_EXPIRE_NUM;
   1296		}
   1297
   1298		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_VX900) {
   1299			iga2_fifo_max_depth = VX900_IGA2_FIFO_MAX_DEPTH;
   1300			iga2_fifo_threshold = VX900_IGA2_FIFO_THRESHOLD;
   1301			iga2_fifo_high_threshold =
   1302			    VX900_IGA2_FIFO_HIGH_THRESHOLD;
   1303			iga2_display_queue_expire_num =
   1304			    VX900_IGA2_DISPLAY_QUEUE_EXPIRE_NUM;
   1305		}
   1306
   1307		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_K800) {
   1308			/* Set Display FIFO Depath Select */
   1309			reg_value =
   1310			    IGA2_FIFO_DEPTH_SELECT_FORMULA(iga2_fifo_max_depth)
   1311			    - 1;
   1312			/* Patch LCD in IGA2 case */
   1313			viafb_load_reg_num =
   1314			    display_fifo_depth_reg.
   1315			    iga2_fifo_depth_select_reg.reg_num;
   1316			reg =
   1317			    display_fifo_depth_reg.
   1318			    iga2_fifo_depth_select_reg.reg;
   1319			viafb_load_reg(reg_value,
   1320				viafb_load_reg_num, reg, VIACR);
   1321		} else {
   1322
   1323			/* Set Display FIFO Depath Select */
   1324			reg_value =
   1325			    IGA2_FIFO_DEPTH_SELECT_FORMULA(iga2_fifo_max_depth);
   1326			viafb_load_reg_num =
   1327			    display_fifo_depth_reg.
   1328			    iga2_fifo_depth_select_reg.reg_num;
   1329			reg =
   1330			    display_fifo_depth_reg.
   1331			    iga2_fifo_depth_select_reg.reg;
   1332			viafb_load_reg(reg_value,
   1333				viafb_load_reg_num, reg, VIACR);
   1334		}
   1335
   1336		/* Set Display FIFO Threshold Select */
   1337		reg_value = IGA2_FIFO_THRESHOLD_FORMULA(iga2_fifo_threshold);
   1338		viafb_load_reg_num =
   1339		    fifo_threshold_select_reg.
   1340		    iga2_fifo_threshold_select_reg.reg_num;
   1341		reg =
   1342		    fifo_threshold_select_reg.
   1343		    iga2_fifo_threshold_select_reg.reg;
   1344		viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIACR);
   1345
   1346		/* Set FIFO High Threshold Select */
   1347		reg_value =
   1348		    IGA2_FIFO_HIGH_THRESHOLD_FORMULA(iga2_fifo_high_threshold);
   1349		viafb_load_reg_num =
   1350		    fifo_high_threshold_select_reg.
   1351		    iga2_fifo_high_threshold_select_reg.reg_num;
   1352		reg =
   1353		    fifo_high_threshold_select_reg.
   1354		    iga2_fifo_high_threshold_select_reg.reg;
   1355		viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIACR);
   1356
   1357		/* Set Display Queue Expire Num */
   1358		reg_value =
   1359		    IGA2_DISPLAY_QUEUE_EXPIRE_NUM_FORMULA
   1360		    (iga2_display_queue_expire_num);
   1361		viafb_load_reg_num =
   1362		    display_queue_expire_num_reg.
   1363		    iga2_display_queue_expire_num_reg.reg_num;
   1364		reg =
   1365		    display_queue_expire_num_reg.
   1366		    iga2_display_queue_expire_num_reg.reg;
   1367		viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIACR);
   1368
   1369	}
   1370
   1371}
   1372
   1373static struct via_pll_config get_pll_config(struct pll_limit *limits, int size,
   1374	int clk)
   1375{
   1376	struct via_pll_config cur, up, down, best = {0, 1, 0};
   1377	const u32 f0 = 14318180; /* X1 frequency */
   1378	int i, f;
   1379
   1380	for (i = 0; i < size; i++) {
   1381		cur.rshift = limits[i].rshift;
   1382		cur.divisor = limits[i].divisor;
   1383		cur.multiplier = clk / ((f0 / cur.divisor)>>cur.rshift);
   1384		f = abs(get_pll_output_frequency(f0, cur) - clk);
   1385		up = down = cur;
   1386		up.multiplier++;
   1387		down.multiplier--;
   1388		if (abs(get_pll_output_frequency(f0, up) - clk) < f)
   1389			cur = up;
   1390		else if (abs(get_pll_output_frequency(f0, down) - clk) < f)
   1391			cur = down;
   1392
   1393		if (cur.multiplier < limits[i].multiplier_min)
   1394			cur.multiplier = limits[i].multiplier_min;
   1395		else if (cur.multiplier > limits[i].multiplier_max)
   1396			cur.multiplier = limits[i].multiplier_max;
   1397
   1398		f = abs(get_pll_output_frequency(f0, cur) - clk);
   1399		if (f < abs(get_pll_output_frequency(f0, best) - clk))
   1400			best = cur;
   1401	}
   1402
   1403	return best;
   1404}
   1405
   1406static struct via_pll_config get_best_pll_config(int clk)
   1407{
   1408	struct via_pll_config config;
   1409
   1410	switch (viaparinfo->chip_info->gfx_chip_name) {
   1411	case UNICHROME_CLE266:
   1412	case UNICHROME_K400:
   1413		config = get_pll_config(cle266_pll_limits,
   1414			ARRAY_SIZE(cle266_pll_limits), clk);
   1415		break;
   1416	case UNICHROME_K800:
   1417	case UNICHROME_PM800:
   1418	case UNICHROME_CN700:
   1419		config = get_pll_config(k800_pll_limits,
   1420			ARRAY_SIZE(k800_pll_limits), clk);
   1421		break;
   1422	case UNICHROME_CX700:
   1423	case UNICHROME_CN750:
   1424	case UNICHROME_K8M890:
   1425	case UNICHROME_P4M890:
   1426	case UNICHROME_P4M900:
   1427	case UNICHROME_VX800:
   1428		config = get_pll_config(cx700_pll_limits,
   1429			ARRAY_SIZE(cx700_pll_limits), clk);
   1430		break;
   1431	case UNICHROME_VX855:
   1432	case UNICHROME_VX900:
   1433		config = get_pll_config(vx855_pll_limits,
   1434			ARRAY_SIZE(vx855_pll_limits), clk);
   1435		break;
   1436	}
   1437
   1438	return config;
   1439}
   1440
   1441/* Set VCLK*/
   1442void viafb_set_vclock(u32 clk, int set_iga)
   1443{
   1444	struct via_pll_config config = get_best_pll_config(clk);
   1445
   1446	if (set_iga == IGA1)
   1447		clock.set_primary_pll(config);
   1448	if (set_iga == IGA2)
   1449		clock.set_secondary_pll(config);
   1450
   1451	/* Fire! */
   1452	via_write_misc_reg_mask(0x0C, 0x0C); /* select external clock */
   1453}
   1454
   1455struct via_display_timing var_to_timing(const struct fb_var_screeninfo *var,
   1456	u16 cxres, u16 cyres)
   1457{
   1458	struct via_display_timing timing;
   1459	u16 dx = (var->xres - cxres) / 2, dy = (var->yres - cyres) / 2;
   1460
   1461	timing.hor_addr = cxres;
   1462	timing.hor_sync_start = timing.hor_addr + var->right_margin + dx;
   1463	timing.hor_sync_end = timing.hor_sync_start + var->hsync_len;
   1464	timing.hor_total = timing.hor_sync_end + var->left_margin + dx;
   1465	timing.hor_blank_start = timing.hor_addr + dx;
   1466	timing.hor_blank_end = timing.hor_total - dx;
   1467	timing.ver_addr = cyres;
   1468	timing.ver_sync_start = timing.ver_addr + var->lower_margin + dy;
   1469	timing.ver_sync_end = timing.ver_sync_start + var->vsync_len;
   1470	timing.ver_total = timing.ver_sync_end + var->upper_margin + dy;
   1471	timing.ver_blank_start = timing.ver_addr + dy;
   1472	timing.ver_blank_end = timing.ver_total - dy;
   1473	return timing;
   1474}
   1475
   1476void viafb_fill_crtc_timing(const struct fb_var_screeninfo *var,
   1477	u16 cxres, u16 cyres, int iga)
   1478{
   1479	struct via_display_timing crt_reg = var_to_timing(var,
   1480		cxres ? cxres : var->xres, cyres ? cyres : var->yres);
   1481
   1482	if (iga == IGA1)
   1483		via_set_primary_timing(&crt_reg);
   1484	else if (iga == IGA2)
   1485		via_set_secondary_timing(&crt_reg);
   1486
   1487	viafb_load_fetch_count_reg(var->xres, var->bits_per_pixel / 8, iga);
   1488	if (viaparinfo->chip_info->gfx_chip_name != UNICHROME_CLE266
   1489		&& viaparinfo->chip_info->gfx_chip_name != UNICHROME_K400)
   1490		viafb_load_FIFO_reg(iga, var->xres, var->yres);
   1491
   1492	viafb_set_vclock(PICOS2KHZ(var->pixclock) * 1000, iga);
   1493}
   1494
   1495void viafb_init_chip_info(int chip_type)
   1496{
   1497	via_clock_init(&clock, chip_type);
   1498	init_gfx_chip_info(chip_type);
   1499	init_tmds_chip_info();
   1500	init_lvds_chip_info();
   1501
   1502	/*Set IGA path for each device */
   1503	viafb_set_iga_path();
   1504
   1505	viaparinfo->lvds_setting_info->display_method = viafb_lcd_dsp_method;
   1506	viaparinfo->lvds_setting_info->lcd_mode = viafb_lcd_mode;
   1507	viaparinfo->lvds_setting_info2->display_method =
   1508		viaparinfo->lvds_setting_info->display_method;
   1509	viaparinfo->lvds_setting_info2->lcd_mode =
   1510		viaparinfo->lvds_setting_info->lcd_mode;
   1511}
   1512
   1513void viafb_update_device_setting(int hres, int vres, int bpp, int flag)
   1514{
   1515	if (flag == 0) {
   1516		viaparinfo->tmds_setting_info->h_active = hres;
   1517		viaparinfo->tmds_setting_info->v_active = vres;
   1518	} else {
   1519
   1520		if (viaparinfo->tmds_setting_info->iga_path == IGA2) {
   1521			viaparinfo->tmds_setting_info->h_active = hres;
   1522			viaparinfo->tmds_setting_info->v_active = vres;
   1523		}
   1524
   1525	}
   1526}
   1527
   1528static void init_gfx_chip_info(int chip_type)
   1529{
   1530	u8 tmp;
   1531
   1532	viaparinfo->chip_info->gfx_chip_name = chip_type;
   1533
   1534	/* Check revision of CLE266 Chip */
   1535	if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266) {
   1536		/* CR4F only define in CLE266.CX chip */
   1537		tmp = viafb_read_reg(VIACR, CR4F);
   1538		viafb_write_reg(CR4F, VIACR, 0x55);
   1539		if (viafb_read_reg(VIACR, CR4F) != 0x55)
   1540			viaparinfo->chip_info->gfx_chip_revision =
   1541			CLE266_REVISION_AX;
   1542		else
   1543			viaparinfo->chip_info->gfx_chip_revision =
   1544			CLE266_REVISION_CX;
   1545		/* restore orignal CR4F value */
   1546		viafb_write_reg(CR4F, VIACR, tmp);
   1547	}
   1548
   1549	if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CX700) {
   1550		tmp = viafb_read_reg(VIASR, SR43);
   1551		DEBUG_MSG(KERN_INFO "SR43:%X\n", tmp);
   1552		if (tmp & 0x02) {
   1553			viaparinfo->chip_info->gfx_chip_revision =
   1554				CX700_REVISION_700M2;
   1555		} else if (tmp & 0x40) {
   1556			viaparinfo->chip_info->gfx_chip_revision =
   1557				CX700_REVISION_700M;
   1558		} else {
   1559			viaparinfo->chip_info->gfx_chip_revision =
   1560				CX700_REVISION_700;
   1561		}
   1562	}
   1563
   1564	/* Determine which 2D engine we have */
   1565	switch (viaparinfo->chip_info->gfx_chip_name) {
   1566	case UNICHROME_VX800:
   1567	case UNICHROME_VX855:
   1568	case UNICHROME_VX900:
   1569		viaparinfo->chip_info->twod_engine = VIA_2D_ENG_M1;
   1570		break;
   1571	case UNICHROME_K8M890:
   1572	case UNICHROME_P4M900:
   1573		viaparinfo->chip_info->twod_engine = VIA_2D_ENG_H5;
   1574		break;
   1575	default:
   1576		viaparinfo->chip_info->twod_engine = VIA_2D_ENG_H2;
   1577		break;
   1578	}
   1579}
   1580
   1581static void init_tmds_chip_info(void)
   1582{
   1583	viafb_tmds_trasmitter_identify();
   1584
   1585	if (INTERFACE_NONE == viaparinfo->chip_info->tmds_chip_info.
   1586		output_interface) {
   1587		switch (viaparinfo->chip_info->gfx_chip_name) {
   1588		case UNICHROME_CX700:
   1589			{
   1590				/* we should check support by hardware layout.*/
   1591				if ((viafb_display_hardware_layout ==
   1592				     HW_LAYOUT_DVI_ONLY)
   1593				    || (viafb_display_hardware_layout ==
   1594					HW_LAYOUT_LCD_DVI)) {
   1595					viaparinfo->chip_info->tmds_chip_info.
   1596					    output_interface = INTERFACE_TMDS;
   1597				} else {
   1598					viaparinfo->chip_info->tmds_chip_info.
   1599						output_interface =
   1600						INTERFACE_NONE;
   1601				}
   1602				break;
   1603			}
   1604		case UNICHROME_K8M890:
   1605		case UNICHROME_P4M900:
   1606		case UNICHROME_P4M890:
   1607			/* TMDS on PCIE, we set DFPLOW as default. */
   1608			viaparinfo->chip_info->tmds_chip_info.output_interface =
   1609			    INTERFACE_DFP_LOW;
   1610			break;
   1611		default:
   1612			{
   1613				/* set DVP1 default for DVI */
   1614				viaparinfo->chip_info->tmds_chip_info
   1615				.output_interface = INTERFACE_DVP1;
   1616			}
   1617		}
   1618	}
   1619
   1620	DEBUG_MSG(KERN_INFO "TMDS Chip = %d\n",
   1621		  viaparinfo->chip_info->tmds_chip_info.tmds_chip_name);
   1622	viafb_init_dvi_size(&viaparinfo->shared->chip_info.tmds_chip_info,
   1623		&viaparinfo->shared->tmds_setting_info);
   1624}
   1625
   1626static void init_lvds_chip_info(void)
   1627{
   1628	viafb_lvds_trasmitter_identify();
   1629	viafb_init_lcd_size();
   1630	viafb_init_lvds_output_interface(&viaparinfo->chip_info->lvds_chip_info,
   1631				   viaparinfo->lvds_setting_info);
   1632	if (viaparinfo->chip_info->lvds_chip_info2.lvds_chip_name) {
   1633		viafb_init_lvds_output_interface(&viaparinfo->chip_info->
   1634			lvds_chip_info2, viaparinfo->lvds_setting_info2);
   1635	}
   1636	/*If CX700,two singel LCD, we need to reassign
   1637	   LCD interface to different LVDS port */
   1638	if ((UNICHROME_CX700 == viaparinfo->chip_info->gfx_chip_name)
   1639	    && (HW_LAYOUT_LCD1_LCD2 == viafb_display_hardware_layout)) {
   1640		if ((INTEGRATED_LVDS == viaparinfo->chip_info->lvds_chip_info.
   1641			lvds_chip_name) && (INTEGRATED_LVDS ==
   1642			viaparinfo->chip_info->
   1643			lvds_chip_info2.lvds_chip_name)) {
   1644			viaparinfo->chip_info->lvds_chip_info.output_interface =
   1645				INTERFACE_LVDS0;
   1646			viaparinfo->chip_info->lvds_chip_info2.
   1647				output_interface =
   1648			    INTERFACE_LVDS1;
   1649		}
   1650	}
   1651
   1652	DEBUG_MSG(KERN_INFO "LVDS Chip = %d\n",
   1653		  viaparinfo->chip_info->lvds_chip_info.lvds_chip_name);
   1654	DEBUG_MSG(KERN_INFO "LVDS1 output_interface = %d\n",
   1655		  viaparinfo->chip_info->lvds_chip_info.output_interface);
   1656	DEBUG_MSG(KERN_INFO "LVDS2 output_interface = %d\n",
   1657		  viaparinfo->chip_info->lvds_chip_info.output_interface);
   1658}
   1659
   1660void viafb_init_dac(int set_iga)
   1661{
   1662	int i;
   1663	u8 tmp;
   1664
   1665	if (set_iga == IGA1) {
   1666		/* access Primary Display's LUT */
   1667		viafb_write_reg_mask(SR1A, VIASR, 0x00, BIT0);
   1668		/* turn off LCK */
   1669		viafb_write_reg_mask(SR1B, VIASR, 0x00, BIT7 + BIT6);
   1670		for (i = 0; i < 256; i++) {
   1671			write_dac_reg(i, palLUT_table[i].red,
   1672				      palLUT_table[i].green,
   1673				      palLUT_table[i].blue);
   1674		}
   1675		/* turn on LCK */
   1676		viafb_write_reg_mask(SR1B, VIASR, 0xC0, BIT7 + BIT6);
   1677	} else {
   1678		tmp = viafb_read_reg(VIACR, CR6A);
   1679		/* access Secondary Display's LUT */
   1680		viafb_write_reg_mask(CR6A, VIACR, 0x40, BIT6);
   1681		viafb_write_reg_mask(SR1A, VIASR, 0x01, BIT0);
   1682		for (i = 0; i < 256; i++) {
   1683			write_dac_reg(i, palLUT_table[i].red,
   1684				      palLUT_table[i].green,
   1685				      palLUT_table[i].blue);
   1686		}
   1687		/* set IGA1 DAC for default */
   1688		viafb_write_reg_mask(SR1A, VIASR, 0x00, BIT0);
   1689		viafb_write_reg(CR6A, VIACR, tmp);
   1690	}
   1691}
   1692
   1693static void device_screen_off(void)
   1694{
   1695	/* turn off CRT screen (IGA1) */
   1696	viafb_write_reg_mask(SR01, VIASR, 0x20, BIT5);
   1697}
   1698
   1699static void device_screen_on(void)
   1700{
   1701	/* turn on CRT screen (IGA1) */
   1702	viafb_write_reg_mask(SR01, VIASR, 0x00, BIT5);
   1703}
   1704
   1705static void set_display_channel(void)
   1706{
   1707	/*If viafb_LCD2_ON, on cx700, internal lvds's information
   1708	is keeped on lvds_setting_info2 */
   1709	if (viafb_LCD2_ON &&
   1710		viaparinfo->lvds_setting_info2->device_lcd_dualedge) {
   1711		/* For dual channel LCD: */
   1712		/* Set to Dual LVDS channel. */
   1713		viafb_write_reg_mask(CRD2, VIACR, 0x20, BIT4 + BIT5);
   1714	} else if (viafb_LCD_ON && viafb_DVI_ON) {
   1715		/* For LCD+DFP: */
   1716		/* Set to LVDS1 + TMDS channel. */
   1717		viafb_write_reg_mask(CRD2, VIACR, 0x10, BIT4 + BIT5);
   1718	} else if (viafb_DVI_ON) {
   1719		/* Set to single TMDS channel. */
   1720		viafb_write_reg_mask(CRD2, VIACR, 0x30, BIT4 + BIT5);
   1721	} else if (viafb_LCD_ON) {
   1722		if (viaparinfo->lvds_setting_info->device_lcd_dualedge) {
   1723			/* For dual channel LCD: */
   1724			/* Set to Dual LVDS channel. */
   1725			viafb_write_reg_mask(CRD2, VIACR, 0x20, BIT4 + BIT5);
   1726		} else {
   1727			/* Set to LVDS0 + LVDS1 channel. */
   1728			viafb_write_reg_mask(CRD2, VIACR, 0x00, BIT4 + BIT5);
   1729		}
   1730	}
   1731}
   1732
   1733static u8 get_sync(struct fb_var_screeninfo *var)
   1734{
   1735	u8 polarity = 0;
   1736
   1737	if (!(var->sync & FB_SYNC_HOR_HIGH_ACT))
   1738		polarity |= VIA_HSYNC_NEGATIVE;
   1739	if (!(var->sync & FB_SYNC_VERT_HIGH_ACT))
   1740		polarity |= VIA_VSYNC_NEGATIVE;
   1741	return polarity;
   1742}
   1743
   1744static void hw_init(void)
   1745{
   1746	int i;
   1747
   1748	inb(VIAStatus);
   1749	outb(0x00, VIAAR);
   1750
   1751	/* Write Common Setting for Video Mode */
   1752	viafb_write_regx(common_vga, ARRAY_SIZE(common_vga));
   1753	switch (viaparinfo->chip_info->gfx_chip_name) {
   1754	case UNICHROME_CLE266:
   1755		viafb_write_regx(CLE266_ModeXregs, NUM_TOTAL_CLE266_ModeXregs);
   1756		break;
   1757
   1758	case UNICHROME_K400:
   1759		viafb_write_regx(KM400_ModeXregs, NUM_TOTAL_KM400_ModeXregs);
   1760		break;
   1761
   1762	case UNICHROME_K800:
   1763	case UNICHROME_PM800:
   1764		viafb_write_regx(CN400_ModeXregs, NUM_TOTAL_CN400_ModeXregs);
   1765		break;
   1766
   1767	case UNICHROME_CN700:
   1768	case UNICHROME_K8M890:
   1769	case UNICHROME_P4M890:
   1770	case UNICHROME_P4M900:
   1771		viafb_write_regx(CN700_ModeXregs, NUM_TOTAL_CN700_ModeXregs);
   1772		break;
   1773
   1774	case UNICHROME_CX700:
   1775	case UNICHROME_VX800:
   1776		viafb_write_regx(CX700_ModeXregs, NUM_TOTAL_CX700_ModeXregs);
   1777		break;
   1778
   1779	case UNICHROME_VX855:
   1780	case UNICHROME_VX900:
   1781		viafb_write_regx(VX855_ModeXregs, NUM_TOTAL_VX855_ModeXregs);
   1782		break;
   1783	}
   1784
   1785	/* magic required on VX900 for correct modesetting on IGA1 */
   1786	via_write_reg_mask(VIACR, 0x45, 0x00, 0x01);
   1787
   1788	/* probably this should go to the scaling code one day */
   1789	via_write_reg_mask(VIACR, 0xFD, 0, 0x80); /* VX900 hw scale on IGA2 */
   1790	viafb_write_regx(scaling_parameters, ARRAY_SIZE(scaling_parameters));
   1791
   1792	/* Fill VPIT Parameters */
   1793	/* Write Misc Register */
   1794	outb(VPIT.Misc, VIA_MISC_REG_WRITE);
   1795
   1796	/* Write Sequencer */
   1797	for (i = 1; i <= StdSR; i++)
   1798		via_write_reg(VIASR, i, VPIT.SR[i - 1]);
   1799
   1800	viafb_write_reg_mask(0x15, VIASR, 0xA2, 0xA2);
   1801
   1802	/* Write Graphic Controller */
   1803	for (i = 0; i < StdGR; i++)
   1804		via_write_reg(VIAGR, i, VPIT.GR[i]);
   1805
   1806	/* Write Attribute Controller */
   1807	for (i = 0; i < StdAR; i++) {
   1808		inb(VIAStatus);
   1809		outb(i, VIAAR);
   1810		outb(VPIT.AR[i], VIAAR);
   1811	}
   1812
   1813	inb(VIAStatus);
   1814	outb(0x20, VIAAR);
   1815
   1816	load_fix_bit_crtc_reg();
   1817}
   1818
   1819int viafb_setmode(void)
   1820{
   1821	int j, cxres = 0, cyres = 0;
   1822	int port;
   1823	u32 devices = viaparinfo->shared->iga1_devices
   1824		| viaparinfo->shared->iga2_devices;
   1825	u8 value, index, mask;
   1826	struct fb_var_screeninfo var2;
   1827
   1828	device_screen_off();
   1829	device_off();
   1830	via_set_state(devices, VIA_STATE_OFF);
   1831
   1832	hw_init();
   1833
   1834	/* Update Patch Register */
   1835
   1836	if ((viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266
   1837		|| viaparinfo->chip_info->gfx_chip_name == UNICHROME_K400)
   1838		&& viafbinfo->var.xres == 1024 && viafbinfo->var.yres == 768) {
   1839		for (j = 0; j < res_patch_table[0].table_length; j++) {
   1840			index = res_patch_table[0].io_reg_table[j].index;
   1841			port = res_patch_table[0].io_reg_table[j].port;
   1842			value = res_patch_table[0].io_reg_table[j].value;
   1843			mask = res_patch_table[0].io_reg_table[j].mask;
   1844			viafb_write_reg_mask(index, port, value, mask);
   1845		}
   1846	}
   1847
   1848	via_set_primary_pitch(viafbinfo->fix.line_length);
   1849	via_set_secondary_pitch(viafb_dual_fb ? viafbinfo1->fix.line_length
   1850		: viafbinfo->fix.line_length);
   1851	via_set_primary_color_depth(viaparinfo->depth);
   1852	via_set_secondary_color_depth(viafb_dual_fb ? viaparinfo1->depth
   1853		: viaparinfo->depth);
   1854	via_set_source(viaparinfo->shared->iga1_devices, IGA1);
   1855	via_set_source(viaparinfo->shared->iga2_devices, IGA2);
   1856	if (viaparinfo->shared->iga2_devices)
   1857		enable_second_display_channel();
   1858	else
   1859		disable_second_display_channel();
   1860
   1861	/* Update Refresh Rate Setting */
   1862
   1863	/* Clear On Screen */
   1864
   1865	if (viafb_dual_fb) {
   1866		var2 = viafbinfo1->var;
   1867	} else if (viafb_SAMM_ON) {
   1868		viafb_fill_var_timing_info(&var2, viafb_get_best_mode(
   1869			viafb_second_xres, viafb_second_yres, viafb_refresh1));
   1870		cxres = viafbinfo->var.xres;
   1871		cyres = viafbinfo->var.yres;
   1872		var2.bits_per_pixel = viafbinfo->var.bits_per_pixel;
   1873	}
   1874
   1875	/* CRT set mode */
   1876	if (viafb_CRT_ON) {
   1877		if (viaparinfo->shared->iga2_devices & VIA_CRT
   1878			&& viafb_SAMM_ON)
   1879			viafb_fill_crtc_timing(&var2, cxres, cyres, IGA2);
   1880		else
   1881			viafb_fill_crtc_timing(&viafbinfo->var, 0, 0,
   1882				(viaparinfo->shared->iga1_devices & VIA_CRT)
   1883				? IGA1 : IGA2);
   1884
   1885		/* Patch if set_hres is not 8 alignment (1366) to viafb_setmode
   1886		to 8 alignment (1368),there is several pixels (2 pixels)
   1887		on right side of screen. */
   1888		if (viafbinfo->var.xres % 8) {
   1889			viafb_unlock_crt();
   1890			viafb_write_reg(CR02, VIACR,
   1891				viafb_read_reg(VIACR, CR02) - 1);
   1892			viafb_lock_crt();
   1893		}
   1894	}
   1895
   1896	if (viafb_DVI_ON) {
   1897		if (viaparinfo->shared->tmds_setting_info.iga_path == IGA2
   1898			&& viafb_SAMM_ON)
   1899			viafb_dvi_set_mode(&var2, cxres, cyres, IGA2);
   1900		else
   1901			viafb_dvi_set_mode(&viafbinfo->var, 0, 0,
   1902				viaparinfo->tmds_setting_info->iga_path);
   1903	}
   1904
   1905	if (viafb_LCD_ON) {
   1906		if (viafb_SAMM_ON &&
   1907			(viaparinfo->lvds_setting_info->iga_path == IGA2)) {
   1908			viafb_lcd_set_mode(&var2, cxres, cyres,
   1909				viaparinfo->lvds_setting_info,
   1910				&viaparinfo->chip_info->lvds_chip_info);
   1911		} else {
   1912			/* IGA1 doesn't have LCD scaling, so set it center. */
   1913			if (viaparinfo->lvds_setting_info->iga_path == IGA1) {
   1914				viaparinfo->lvds_setting_info->display_method =
   1915				    LCD_CENTERING;
   1916			}
   1917			viafb_lcd_set_mode(&viafbinfo->var, 0, 0,
   1918				viaparinfo->lvds_setting_info,
   1919				&viaparinfo->chip_info->lvds_chip_info);
   1920		}
   1921	}
   1922	if (viafb_LCD2_ON) {
   1923		if (viafb_SAMM_ON &&
   1924			(viaparinfo->lvds_setting_info2->iga_path == IGA2)) {
   1925			viafb_lcd_set_mode(&var2, cxres, cyres,
   1926				viaparinfo->lvds_setting_info2,
   1927				&viaparinfo->chip_info->lvds_chip_info2);
   1928		} else {
   1929			/* IGA1 doesn't have LCD scaling, so set it center. */
   1930			if (viaparinfo->lvds_setting_info2->iga_path == IGA1) {
   1931				viaparinfo->lvds_setting_info2->display_method =
   1932				    LCD_CENTERING;
   1933			}
   1934			viafb_lcd_set_mode(&viafbinfo->var, 0, 0,
   1935				viaparinfo->lvds_setting_info2,
   1936				&viaparinfo->chip_info->lvds_chip_info2);
   1937		}
   1938	}
   1939
   1940	if ((viaparinfo->chip_info->gfx_chip_name == UNICHROME_CX700)
   1941	    && (viafb_LCD_ON || viafb_DVI_ON))
   1942		set_display_channel();
   1943
   1944	/* If set mode normally, save resolution information for hot-plug . */
   1945	if (!viafb_hotplug) {
   1946		viafb_hotplug_Xres = viafbinfo->var.xres;
   1947		viafb_hotplug_Yres = viafbinfo->var.yres;
   1948		viafb_hotplug_bpp = viafbinfo->var.bits_per_pixel;
   1949		viafb_hotplug_refresh = viafb_refresh;
   1950
   1951		if (viafb_DVI_ON)
   1952			viafb_DeviceStatus = DVI_Device;
   1953		else
   1954			viafb_DeviceStatus = CRT_Device;
   1955	}
   1956	device_on();
   1957	if (!viafb_SAMM_ON)
   1958		via_set_sync_polarity(devices, get_sync(&viafbinfo->var));
   1959	else {
   1960		via_set_sync_polarity(viaparinfo->shared->iga1_devices,
   1961			get_sync(&viafbinfo->var));
   1962		via_set_sync_polarity(viaparinfo->shared->iga2_devices,
   1963			get_sync(&var2));
   1964	}
   1965
   1966	clock.set_engine_pll_state(VIA_STATE_ON);
   1967	clock.set_primary_clock_source(VIA_CLKSRC_X1, true);
   1968	clock.set_secondary_clock_source(VIA_CLKSRC_X1, true);
   1969
   1970#ifdef CONFIG_FB_VIA_X_COMPATIBILITY
   1971	clock.set_primary_pll_state(VIA_STATE_ON);
   1972	clock.set_primary_clock_state(VIA_STATE_ON);
   1973	clock.set_secondary_pll_state(VIA_STATE_ON);
   1974	clock.set_secondary_clock_state(VIA_STATE_ON);
   1975#else
   1976	if (viaparinfo->shared->iga1_devices) {
   1977		clock.set_primary_pll_state(VIA_STATE_ON);
   1978		clock.set_primary_clock_state(VIA_STATE_ON);
   1979	} else {
   1980		clock.set_primary_pll_state(VIA_STATE_OFF);
   1981		clock.set_primary_clock_state(VIA_STATE_OFF);
   1982	}
   1983
   1984	if (viaparinfo->shared->iga2_devices) {
   1985		clock.set_secondary_pll_state(VIA_STATE_ON);
   1986		clock.set_secondary_clock_state(VIA_STATE_ON);
   1987	} else {
   1988		clock.set_secondary_pll_state(VIA_STATE_OFF);
   1989		clock.set_secondary_clock_state(VIA_STATE_OFF);
   1990	}
   1991#endif /*CONFIG_FB_VIA_X_COMPATIBILITY*/
   1992
   1993	via_set_state(devices, VIA_STATE_ON);
   1994	device_screen_on();
   1995	return 1;
   1996}
   1997
   1998int viafb_get_refresh(int hres, int vres, u32 long_refresh)
   1999{
   2000	const struct fb_videomode *best;
   2001
   2002	best = viafb_get_best_mode(hres, vres, long_refresh);
   2003	if (!best)
   2004		return 60;
   2005
   2006	if (abs(best->refresh - long_refresh) > 3) {
   2007		if (hres == 1200 && vres == 900)
   2008			return 49; /* OLPC DCON only supports 50 Hz */
   2009		else
   2010			return 60;
   2011	}
   2012
   2013	return best->refresh;
   2014}
   2015
   2016static void device_off(void)
   2017{
   2018	viafb_dvi_disable();
   2019	viafb_lcd_disable();
   2020}
   2021
   2022static void device_on(void)
   2023{
   2024	if (viafb_DVI_ON == 1)
   2025		viafb_dvi_enable();
   2026	if (viafb_LCD_ON == 1)
   2027		viafb_lcd_enable();
   2028}
   2029
   2030static void enable_second_display_channel(void)
   2031{
   2032	/* to enable second display channel. */
   2033	viafb_write_reg_mask(CR6A, VIACR, 0x00, BIT6);
   2034	viafb_write_reg_mask(CR6A, VIACR, BIT7, BIT7);
   2035	viafb_write_reg_mask(CR6A, VIACR, BIT6, BIT6);
   2036}
   2037
   2038static void disable_second_display_channel(void)
   2039{
   2040	/* to disable second display channel. */
   2041	viafb_write_reg_mask(CR6A, VIACR, 0x00, BIT6);
   2042	viafb_write_reg_mask(CR6A, VIACR, 0x00, BIT7);
   2043	viafb_write_reg_mask(CR6A, VIACR, BIT6, BIT6);
   2044}
   2045
   2046void viafb_set_dpa_gfx(int output_interface, struct GFX_DPA_SETTING\
   2047					*p_gfx_dpa_setting)
   2048{
   2049	switch (output_interface) {
   2050	case INTERFACE_DVP0:
   2051		{
   2052			/* DVP0 Clock Polarity and Adjust: */
   2053			viafb_write_reg_mask(CR96, VIACR,
   2054				       p_gfx_dpa_setting->DVP0, 0x0F);
   2055
   2056			/* DVP0 Clock and Data Pads Driving: */
   2057			viafb_write_reg_mask(SR1E, VIASR,
   2058				       p_gfx_dpa_setting->DVP0ClockDri_S, BIT2);
   2059			viafb_write_reg_mask(SR2A, VIASR,
   2060				       p_gfx_dpa_setting->DVP0ClockDri_S1,
   2061				       BIT4);
   2062			viafb_write_reg_mask(SR1B, VIASR,
   2063				       p_gfx_dpa_setting->DVP0DataDri_S, BIT1);
   2064			viafb_write_reg_mask(SR2A, VIASR,
   2065				       p_gfx_dpa_setting->DVP0DataDri_S1, BIT5);
   2066			break;
   2067		}
   2068
   2069	case INTERFACE_DVP1:
   2070		{
   2071			/* DVP1 Clock Polarity and Adjust: */
   2072			viafb_write_reg_mask(CR9B, VIACR,
   2073				       p_gfx_dpa_setting->DVP1, 0x0F);
   2074
   2075			/* DVP1 Clock and Data Pads Driving: */
   2076			viafb_write_reg_mask(SR65, VIASR,
   2077				       p_gfx_dpa_setting->DVP1Driving, 0x0F);
   2078			break;
   2079		}
   2080
   2081	case INTERFACE_DFP_HIGH:
   2082		{
   2083			viafb_write_reg_mask(CR97, VIACR,
   2084				       p_gfx_dpa_setting->DFPHigh, 0x0F);
   2085			break;
   2086		}
   2087
   2088	case INTERFACE_DFP_LOW:
   2089		{
   2090			viafb_write_reg_mask(CR99, VIACR,
   2091				       p_gfx_dpa_setting->DFPLow, 0x0F);
   2092			break;
   2093		}
   2094
   2095	case INTERFACE_DFP:
   2096		{
   2097			viafb_write_reg_mask(CR97, VIACR,
   2098				       p_gfx_dpa_setting->DFPHigh, 0x0F);
   2099			viafb_write_reg_mask(CR99, VIACR,
   2100				       p_gfx_dpa_setting->DFPLow, 0x0F);
   2101			break;
   2102		}
   2103	}
   2104}
   2105
   2106void viafb_fill_var_timing_info(struct fb_var_screeninfo *var,
   2107	const struct fb_videomode *mode)
   2108{
   2109	var->pixclock = mode->pixclock;
   2110	var->xres = mode->xres;
   2111	var->yres = mode->yres;
   2112	var->left_margin = mode->left_margin;
   2113	var->right_margin = mode->right_margin;
   2114	var->hsync_len = mode->hsync_len;
   2115	var->upper_margin = mode->upper_margin;
   2116	var->lower_margin = mode->lower_margin;
   2117	var->vsync_len = mode->vsync_len;
   2118	var->sync = mode->sync;
   2119}