Home | History | Annotate | Line # | Download | only in ast
      1  1.2  riastrad /*	$NetBSD: ast_post.c,v 1.3 2021/12/18 23:45:27 riastradh Exp $	*/
      2  1.2  riastrad 
      3  1.1  riastrad /*
      4  1.1  riastrad  * Copyright 2012 Red Hat Inc.
      5  1.1  riastrad  *
      6  1.1  riastrad  * Permission is hereby granted, free of charge, to any person obtaining a
      7  1.1  riastrad  * copy of this software and associated documentation files (the
      8  1.1  riastrad  * "Software"), to deal in the Software without restriction, including
      9  1.1  riastrad  * without limitation the rights to use, copy, modify, merge, publish,
     10  1.1  riastrad  * distribute, sub license, and/or sell copies of the Software, and to
     11  1.1  riastrad  * permit persons to whom the Software is furnished to do so, subject to
     12  1.1  riastrad  * the following conditions:
     13  1.1  riastrad  *
     14  1.1  riastrad  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     15  1.1  riastrad  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     16  1.1  riastrad  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
     17  1.1  riastrad  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
     18  1.1  riastrad  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
     19  1.1  riastrad  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
     20  1.1  riastrad  * USE OR OTHER DEALINGS IN THE SOFTWARE.
     21  1.1  riastrad  *
     22  1.1  riastrad  * The above copyright notice and this permission notice (including the
     23  1.1  riastrad  * next paragraph) shall be included in all copies or substantial portions
     24  1.1  riastrad  * of the Software.
     25  1.1  riastrad  *
     26  1.1  riastrad  */
     27  1.1  riastrad /*
     28  1.1  riastrad  * Authors: Dave Airlie <airlied (at) redhat.com>
     29  1.1  riastrad  */
     30  1.1  riastrad 
     31  1.2  riastrad #include <sys/cdefs.h>
     32  1.2  riastrad __KERNEL_RCSID(0, "$NetBSD: ast_post.c,v 1.3 2021/12/18 23:45:27 riastradh Exp $");
     33  1.2  riastrad 
     34  1.3  riastrad #include <linux/delay.h>
     35  1.3  riastrad #include <linux/pci.h>
     36  1.3  riastrad 
     37  1.3  riastrad #include <drm/drm_print.h>
     38  1.1  riastrad 
     39  1.1  riastrad #include "ast_dram_tables.h"
     40  1.3  riastrad #include "ast_drv.h"
     41  1.1  riastrad 
     42  1.3  riastrad static void ast_post_chip_2300(struct drm_device *dev);
     43  1.3  riastrad static void ast_post_chip_2500(struct drm_device *dev);
     44  1.1  riastrad 
     45  1.2  riastrad void ast_enable_vga(struct drm_device *dev)
     46  1.2  riastrad {
     47  1.2  riastrad 	struct ast_private *ast = dev->dev_private;
     48  1.2  riastrad 
     49  1.2  riastrad 	ast_io_write8(ast, AST_IO_VGA_ENABLE_PORT, 0x01);
     50  1.2  riastrad 	ast_io_write8(ast, AST_IO_MISC_PORT_WRITE, 0x01);
     51  1.2  riastrad }
     52  1.2  riastrad 
     53  1.2  riastrad void ast_enable_mmio(struct drm_device *dev)
     54  1.1  riastrad {
     55  1.1  riastrad 	struct ast_private *ast = dev->dev_private;
     56  1.1  riastrad 
     57  1.3  riastrad 	ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xa1, 0x06);
     58  1.1  riastrad }
     59  1.1  riastrad 
     60  1.2  riastrad 
     61  1.2  riastrad bool ast_is_vga_enabled(struct drm_device *dev)
     62  1.1  riastrad {
     63  1.1  riastrad 	struct ast_private *ast = dev->dev_private;
     64  1.1  riastrad 	u8 ch;
     65  1.1  riastrad 
     66  1.1  riastrad 	if (ast->chip == AST1180) {
     67  1.1  riastrad 		/* TODO 1180 */
     68  1.1  riastrad 	} else {
     69  1.2  riastrad 		ch = ast_io_read8(ast, AST_IO_VGA_ENABLE_PORT);
     70  1.2  riastrad 		return !!(ch & 0x01);
     71  1.1  riastrad 	}
     72  1.2  riastrad 	return false;
     73  1.1  riastrad }
     74  1.1  riastrad 
     75  1.1  riastrad static const u8 extreginfo[] = { 0x0f, 0x04, 0x1c, 0xff };
     76  1.1  riastrad static const u8 extreginfo_ast2300a0[] = { 0x0f, 0x04, 0x1c, 0xff };
     77  1.1  riastrad static const u8 extreginfo_ast2300[] = { 0x0f, 0x04, 0x1f, 0xff };
     78  1.1  riastrad 
     79  1.1  riastrad static void
     80  1.1  riastrad ast_set_def_ext_reg(struct drm_device *dev)
     81  1.1  riastrad {
     82  1.1  riastrad 	struct ast_private *ast = dev->dev_private;
     83  1.1  riastrad 	u8 i, index, reg;
     84  1.1  riastrad 	const u8 *ext_reg_info;
     85  1.1  riastrad 
     86  1.1  riastrad 	/* reset scratch */
     87  1.3  riastrad 	for (i = 0x81; i <= 0x9f; i++)
     88  1.1  riastrad 		ast_set_index_reg(ast, AST_IO_CRTC_PORT, i, 0x00);
     89  1.1  riastrad 
     90  1.3  riastrad 	if (ast->chip == AST2300 || ast->chip == AST2400 ||
     91  1.3  riastrad 	    ast->chip == AST2500) {
     92  1.1  riastrad 		if (dev->pdev->revision >= 0x20)
     93  1.1  riastrad 			ext_reg_info = extreginfo_ast2300;
     94  1.1  riastrad 		else
     95  1.1  riastrad 			ext_reg_info = extreginfo_ast2300a0;
     96  1.1  riastrad 	} else
     97  1.1  riastrad 		ext_reg_info = extreginfo;
     98  1.1  riastrad 
     99  1.1  riastrad 	index = 0xa0;
    100  1.1  riastrad 	while (*ext_reg_info != 0xff) {
    101  1.1  riastrad 		ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, index, 0x00, *ext_reg_info);
    102  1.1  riastrad 		index++;
    103  1.1  riastrad 		ext_reg_info++;
    104  1.1  riastrad 	}
    105  1.1  riastrad 
    106  1.1  riastrad 	/* disable standard IO/MEM decode if secondary */
    107  1.1  riastrad 	/* ast_set_index_reg-mask(ast, AST_IO_CRTC_PORT, 0xa1, 0xff, 0x3); */
    108  1.1  riastrad 
    109  1.1  riastrad 	/* Set Ext. Default */
    110  1.1  riastrad 	ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x8c, 0x00, 0x01);
    111  1.1  riastrad 	ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x00, 0x00);
    112  1.1  riastrad 
    113  1.1  riastrad 	/* Enable RAMDAC for A1 */
    114  1.1  riastrad 	reg = 0x04;
    115  1.3  riastrad 	if (ast->chip == AST2300 || ast->chip == AST2400 ||
    116  1.3  riastrad 	    ast->chip == AST2500)
    117  1.1  riastrad 		reg |= 0x20;
    118  1.1  riastrad 	ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb6, 0xff, reg);
    119  1.1  riastrad }
    120  1.1  riastrad 
    121  1.2  riastrad u32 ast_mindwm(struct ast_private *ast, u32 r)
    122  1.1  riastrad {
    123  1.2  riastrad 	uint32_t data;
    124  1.2  riastrad 
    125  1.1  riastrad 	ast_write32(ast, 0xf004, r & 0xffff0000);
    126  1.1  riastrad 	ast_write32(ast, 0xf000, 0x1);
    127  1.1  riastrad 
    128  1.2  riastrad 	do {
    129  1.2  riastrad 		data = ast_read32(ast, 0xf004) & 0xffff0000;
    130  1.2  riastrad 	} while (data != (r & 0xffff0000));
    131  1.1  riastrad 	return ast_read32(ast, 0x10000 + (r & 0x0000ffff));
    132  1.1  riastrad }
    133  1.1  riastrad 
    134  1.2  riastrad void ast_moutdwm(struct ast_private *ast, u32 r, u32 v)
    135  1.1  riastrad {
    136  1.2  riastrad 	uint32_t data;
    137  1.1  riastrad 	ast_write32(ast, 0xf004, r & 0xffff0000);
    138  1.1  riastrad 	ast_write32(ast, 0xf000, 0x1);
    139  1.2  riastrad 	do {
    140  1.2  riastrad 		data = ast_read32(ast, 0xf004) & 0xffff0000;
    141  1.2  riastrad 	} while (data != (r & 0xffff0000));
    142  1.1  riastrad 	ast_write32(ast, 0x10000 + (r & 0x0000ffff), v);
    143  1.1  riastrad }
    144  1.1  riastrad 
    145  1.1  riastrad /*
    146  1.1  riastrad  * AST2100/2150 DLL CBR Setting
    147  1.1  riastrad  */
    148  1.1  riastrad #define CBR_SIZE_AST2150	     ((16 << 10) - 1)
    149  1.1  riastrad #define CBR_PASSNUM_AST2150          5
    150  1.1  riastrad #define CBR_THRESHOLD_AST2150        10
    151  1.1  riastrad #define CBR_THRESHOLD2_AST2150       10
    152  1.1  riastrad #define TIMEOUT_AST2150              5000000
    153  1.1  riastrad 
    154  1.1  riastrad #define CBR_PATNUM_AST2150           8
    155  1.1  riastrad 
    156  1.1  riastrad static const u32 pattern_AST2150[14] = {
    157  1.1  riastrad 	0xFF00FF00,
    158  1.1  riastrad 	0xCC33CC33,
    159  1.1  riastrad 	0xAA55AA55,
    160  1.1  riastrad 	0xFFFE0001,
    161  1.1  riastrad 	0x683501FE,
    162  1.1  riastrad 	0x0F1929B0,
    163  1.1  riastrad 	0x2D0B4346,
    164  1.1  riastrad 	0x60767F02,
    165  1.1  riastrad 	0x6FBE36A6,
    166  1.1  riastrad 	0x3A253035,
    167  1.1  riastrad 	0x3019686D,
    168  1.1  riastrad 	0x41C6167E,
    169  1.1  riastrad 	0x620152BF,
    170  1.1  riastrad 	0x20F050E0
    171  1.1  riastrad };
    172  1.1  riastrad 
    173  1.1  riastrad static u32 mmctestburst2_ast2150(struct ast_private *ast, u32 datagen)
    174  1.1  riastrad {
    175  1.1  riastrad 	u32 data, timeout;
    176  1.1  riastrad 
    177  1.2  riastrad 	ast_moutdwm(ast, 0x1e6e0070, 0x00000000);
    178  1.2  riastrad 	ast_moutdwm(ast, 0x1e6e0070, 0x00000001 | (datagen << 3));
    179  1.1  riastrad 	timeout = 0;
    180  1.1  riastrad 	do {
    181  1.2  riastrad 		data = ast_mindwm(ast, 0x1e6e0070) & 0x40;
    182  1.1  riastrad 		if (++timeout > TIMEOUT_AST2150) {
    183  1.2  riastrad 			ast_moutdwm(ast, 0x1e6e0070, 0x00000000);
    184  1.1  riastrad 			return 0xffffffff;
    185  1.1  riastrad 		}
    186  1.1  riastrad 	} while (!data);
    187  1.2  riastrad 	ast_moutdwm(ast, 0x1e6e0070, 0x00000000);
    188  1.2  riastrad 	ast_moutdwm(ast, 0x1e6e0070, 0x00000003 | (datagen << 3));
    189  1.1  riastrad 	timeout = 0;
    190  1.1  riastrad 	do {
    191  1.2  riastrad 		data = ast_mindwm(ast, 0x1e6e0070) & 0x40;
    192  1.1  riastrad 		if (++timeout > TIMEOUT_AST2150) {
    193  1.2  riastrad 			ast_moutdwm(ast, 0x1e6e0070, 0x00000000);
    194  1.1  riastrad 			return 0xffffffff;
    195  1.1  riastrad 		}
    196  1.1  riastrad 	} while (!data);
    197  1.2  riastrad 	data = (ast_mindwm(ast, 0x1e6e0070) & 0x80) >> 7;
    198  1.2  riastrad 	ast_moutdwm(ast, 0x1e6e0070, 0x00000000);
    199  1.1  riastrad 	return data;
    200  1.1  riastrad }
    201  1.1  riastrad 
    202  1.1  riastrad #if 0 /* unused in DDX driver - here for completeness */
    203  1.1  riastrad static u32 mmctestsingle2_ast2150(struct ast_private *ast, u32 datagen)
    204  1.1  riastrad {
    205  1.1  riastrad 	u32 data, timeout;
    206  1.1  riastrad 
    207  1.2  riastrad 	ast_moutdwm(ast, 0x1e6e0070, 0x00000000);
    208  1.2  riastrad 	ast_moutdwm(ast, 0x1e6e0070, 0x00000005 | (datagen << 3));
    209  1.1  riastrad 	timeout = 0;
    210  1.1  riastrad 	do {
    211  1.2  riastrad 		data = ast_mindwm(ast, 0x1e6e0070) & 0x40;
    212  1.1  riastrad 		if (++timeout > TIMEOUT_AST2150) {
    213  1.2  riastrad 			ast_moutdwm(ast, 0x1e6e0070, 0x00000000);
    214  1.1  riastrad 			return 0xffffffff;
    215  1.1  riastrad 		}
    216  1.1  riastrad 	} while (!data);
    217  1.2  riastrad 	data = (ast_mindwm(ast, 0x1e6e0070) & 0x80) >> 7;
    218  1.2  riastrad 	ast_moutdwm(ast, 0x1e6e0070, 0x00000000);
    219  1.1  riastrad 	return data;
    220  1.1  riastrad }
    221  1.1  riastrad #endif
    222  1.1  riastrad 
    223  1.1  riastrad static int cbrtest_ast2150(struct ast_private *ast)
    224  1.1  riastrad {
    225  1.1  riastrad 	int i;
    226  1.1  riastrad 
    227  1.1  riastrad 	for (i = 0; i < 8; i++)
    228  1.1  riastrad 		if (mmctestburst2_ast2150(ast, i))
    229  1.1  riastrad 			return 0;
    230  1.1  riastrad 	return 1;
    231  1.1  riastrad }
    232  1.1  riastrad 
    233  1.1  riastrad static int cbrscan_ast2150(struct ast_private *ast, int busw)
    234  1.1  riastrad {
    235  1.1  riastrad 	u32 patcnt, loop;
    236  1.1  riastrad 
    237  1.1  riastrad 	for (patcnt = 0; patcnt < CBR_PATNUM_AST2150; patcnt++) {
    238  1.2  riastrad 		ast_moutdwm(ast, 0x1e6e007c, pattern_AST2150[patcnt]);
    239  1.1  riastrad 		for (loop = 0; loop < CBR_PASSNUM_AST2150; loop++) {
    240  1.1  riastrad 			if (cbrtest_ast2150(ast))
    241  1.1  riastrad 				break;
    242  1.1  riastrad 		}
    243  1.1  riastrad 		if (loop == CBR_PASSNUM_AST2150)
    244  1.1  riastrad 			return 0;
    245  1.1  riastrad 	}
    246  1.1  riastrad 	return 1;
    247  1.1  riastrad }
    248  1.1  riastrad 
    249  1.1  riastrad 
    250  1.1  riastrad static void cbrdlli_ast2150(struct ast_private *ast, int busw)
    251  1.1  riastrad {
    252  1.1  riastrad 	u32 dll_min[4], dll_max[4], dlli, data, passcnt;
    253  1.1  riastrad 
    254  1.1  riastrad cbr_start:
    255  1.1  riastrad 	dll_min[0] = dll_min[1] = dll_min[2] = dll_min[3] = 0xff;
    256  1.1  riastrad 	dll_max[0] = dll_max[1] = dll_max[2] = dll_max[3] = 0x0;
    257  1.1  riastrad 	passcnt = 0;
    258  1.1  riastrad 
    259  1.1  riastrad 	for (dlli = 0; dlli < 100; dlli++) {
    260  1.2  riastrad 		ast_moutdwm(ast, 0x1e6e0068, dlli | (dlli << 8) | (dlli << 16) | (dlli << 24));
    261  1.1  riastrad 		data = cbrscan_ast2150(ast, busw);
    262  1.1  riastrad 		if (data != 0) {
    263  1.1  riastrad 			if (data & 0x1) {
    264  1.1  riastrad 				if (dll_min[0] > dlli)
    265  1.1  riastrad 					dll_min[0] = dlli;
    266  1.1  riastrad 				if (dll_max[0] < dlli)
    267  1.1  riastrad 					dll_max[0] = dlli;
    268  1.1  riastrad 			}
    269  1.1  riastrad 			passcnt++;
    270  1.1  riastrad 		} else if (passcnt >= CBR_THRESHOLD_AST2150)
    271  1.1  riastrad 			goto cbr_start;
    272  1.1  riastrad 	}
    273  1.1  riastrad 	if (dll_max[0] == 0 || (dll_max[0]-dll_min[0]) < CBR_THRESHOLD_AST2150)
    274  1.1  riastrad 		goto cbr_start;
    275  1.1  riastrad 
    276  1.1  riastrad 	dlli = dll_min[0] + (((dll_max[0] - dll_min[0]) * 7) >> 4);
    277  1.2  riastrad 	ast_moutdwm(ast, 0x1e6e0068, dlli | (dlli << 8) | (dlli << 16) | (dlli << 24));
    278  1.1  riastrad }
    279  1.1  riastrad 
    280  1.1  riastrad 
    281  1.1  riastrad 
    282  1.1  riastrad static void ast_init_dram_reg(struct drm_device *dev)
    283  1.1  riastrad {
    284  1.1  riastrad 	struct ast_private *ast = dev->dev_private;
    285  1.1  riastrad 	u8 j;
    286  1.1  riastrad 	u32 data, temp, i;
    287  1.1  riastrad 	const struct ast_dramstruct *dram_reg_info;
    288  1.1  riastrad 
    289  1.1  riastrad 	j = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xd0, 0xff);
    290  1.1  riastrad 
    291  1.1  riastrad 	if ((j & 0x80) == 0) { /* VGA only */
    292  1.1  riastrad 		if (ast->chip == AST2000) {
    293  1.1  riastrad 			dram_reg_info = ast2000_dram_table_data;
    294  1.1  riastrad 			ast_write32(ast, 0xf004, 0x1e6e0000);
    295  1.1  riastrad 			ast_write32(ast, 0xf000, 0x1);
    296  1.1  riastrad 			ast_write32(ast, 0x10100, 0xa8);
    297  1.1  riastrad 
    298  1.1  riastrad 			do {
    299  1.1  riastrad 				;
    300  1.1  riastrad 			} while (ast_read32(ast, 0x10100) != 0xa8);
    301  1.1  riastrad 		} else {/* AST2100/1100 */
    302  1.1  riastrad 			if (ast->chip == AST2100 || ast->chip == 2200)
    303  1.1  riastrad 				dram_reg_info = ast2100_dram_table_data;
    304  1.1  riastrad 			else
    305  1.1  riastrad 				dram_reg_info = ast1100_dram_table_data;
    306  1.1  riastrad 
    307  1.1  riastrad 			ast_write32(ast, 0xf004, 0x1e6e0000);
    308  1.1  riastrad 			ast_write32(ast, 0xf000, 0x1);
    309  1.1  riastrad 			ast_write32(ast, 0x12000, 0x1688A8A8);
    310  1.1  riastrad 			do {
    311  1.1  riastrad 				;
    312  1.1  riastrad 			} while (ast_read32(ast, 0x12000) != 0x01);
    313  1.1  riastrad 
    314  1.1  riastrad 			ast_write32(ast, 0x10000, 0xfc600309);
    315  1.1  riastrad 			do {
    316  1.1  riastrad 				;
    317  1.1  riastrad 			} while (ast_read32(ast, 0x10000) != 0x01);
    318  1.1  riastrad 		}
    319  1.1  riastrad 
    320  1.1  riastrad 		while (dram_reg_info->index != 0xffff) {
    321  1.1  riastrad 			if (dram_reg_info->index == 0xff00) {/* delay fn */
    322  1.1  riastrad 				for (i = 0; i < 15; i++)
    323  1.1  riastrad 					udelay(dram_reg_info->data);
    324  1.1  riastrad 			} else if (dram_reg_info->index == 0x4 && ast->chip != AST2000) {
    325  1.1  riastrad 				data = dram_reg_info->data;
    326  1.1  riastrad 				if (ast->dram_type == AST_DRAM_1Gx16)
    327  1.1  riastrad 					data = 0x00000d89;
    328  1.1  riastrad 				else if (ast->dram_type == AST_DRAM_1Gx32)
    329  1.1  riastrad 					data = 0x00000c8d;
    330  1.1  riastrad 
    331  1.1  riastrad 				temp = ast_read32(ast, 0x12070);
    332  1.1  riastrad 				temp &= 0xc;
    333  1.1  riastrad 				temp <<= 2;
    334  1.1  riastrad 				ast_write32(ast, 0x10000 + dram_reg_info->index, data | temp);
    335  1.1  riastrad 			} else
    336  1.1  riastrad 				ast_write32(ast, 0x10000 + dram_reg_info->index, dram_reg_info->data);
    337  1.1  riastrad 			dram_reg_info++;
    338  1.1  riastrad 		}
    339  1.1  riastrad 
    340  1.1  riastrad 		/* AST 2100/2150 DRAM calibration */
    341  1.1  riastrad 		data = ast_read32(ast, 0x10120);
    342  1.1  riastrad 		if (data == 0x5061) { /* 266Mhz */
    343  1.1  riastrad 			data = ast_read32(ast, 0x10004);
    344  1.1  riastrad 			if (data & 0x40)
    345  1.1  riastrad 				cbrdlli_ast2150(ast, 16); /* 16 bits */
    346  1.1  riastrad 			else
    347  1.1  riastrad 				cbrdlli_ast2150(ast, 32); /* 32 bits */
    348  1.1  riastrad 		}
    349  1.1  riastrad 
    350  1.1  riastrad 		switch (ast->chip) {
    351  1.1  riastrad 		case AST2000:
    352  1.1  riastrad 			temp = ast_read32(ast, 0x10140);
    353  1.1  riastrad 			ast_write32(ast, 0x10140, temp | 0x40);
    354  1.1  riastrad 			break;
    355  1.1  riastrad 		case AST1100:
    356  1.1  riastrad 		case AST2100:
    357  1.1  riastrad 		case AST2200:
    358  1.1  riastrad 		case AST2150:
    359  1.1  riastrad 			temp = ast_read32(ast, 0x1200c);
    360  1.1  riastrad 			ast_write32(ast, 0x1200c, temp & 0xfffffffd);
    361  1.1  riastrad 			temp = ast_read32(ast, 0x12040);
    362  1.1  riastrad 			ast_write32(ast, 0x12040, temp | 0x40);
    363  1.1  riastrad 			break;
    364  1.1  riastrad 		default:
    365  1.1  riastrad 			break;
    366  1.1  riastrad 		}
    367  1.1  riastrad 	}
    368  1.1  riastrad 
    369  1.1  riastrad 	/* wait ready */
    370  1.1  riastrad 	do {
    371  1.1  riastrad 		j = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xd0, 0xff);
    372  1.1  riastrad 	} while ((j & 0x40) == 0);
    373  1.1  riastrad }
    374  1.1  riastrad 
    375  1.1  riastrad void ast_post_gpu(struct drm_device *dev)
    376  1.1  riastrad {
    377  1.1  riastrad 	u32 reg;
    378  1.1  riastrad 	struct ast_private *ast = dev->dev_private;
    379  1.1  riastrad 
    380  1.1  riastrad 	pci_read_config_dword(ast->dev->pdev, 0x04, &reg);
    381  1.1  riastrad 	reg |= 0x3;
    382  1.1  riastrad 	pci_write_config_dword(ast->dev->pdev, 0x04, reg);
    383  1.1  riastrad 
    384  1.1  riastrad 	ast_enable_vga(dev);
    385  1.1  riastrad 	ast_open_key(ast);
    386  1.2  riastrad 	ast_enable_mmio(dev);
    387  1.1  riastrad 	ast_set_def_ext_reg(dev);
    388  1.1  riastrad 
    389  1.2  riastrad 	if (ast->config_mode == ast_use_p2a) {
    390  1.3  riastrad 		if (ast->chip == AST2500)
    391  1.3  riastrad 			ast_post_chip_2500(dev);
    392  1.3  riastrad 		else if (ast->chip == AST2300 || ast->chip == AST2400)
    393  1.3  riastrad 			ast_post_chip_2300(dev);
    394  1.2  riastrad 		else
    395  1.2  riastrad 			ast_init_dram_reg(dev);
    396  1.2  riastrad 
    397  1.2  riastrad 		ast_init_3rdtx(dev);
    398  1.2  riastrad 	} else {
    399  1.2  riastrad 		if (ast->tx_chip_type != AST_TX_NONE)
    400  1.2  riastrad 			ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xa3, 0xcf, 0x80);	/* Enable DVO */
    401  1.2  riastrad 	}
    402  1.1  riastrad }
    403  1.1  riastrad 
    404  1.1  riastrad /* AST 2300 DRAM settings */
    405  1.1  riastrad #define AST_DDR3 0
    406  1.1  riastrad #define AST_DDR2 1
    407  1.1  riastrad 
    408  1.1  riastrad struct ast2300_dram_param {
    409  1.1  riastrad 	u32 dram_type;
    410  1.1  riastrad 	u32 dram_chipid;
    411  1.1  riastrad 	u32 dram_freq;
    412  1.1  riastrad 	u32 vram_size;
    413  1.1  riastrad 	u32 odt;
    414  1.1  riastrad 	u32 wodt;
    415  1.1  riastrad 	u32 rodt;
    416  1.1  riastrad 	u32 dram_config;
    417  1.1  riastrad 	u32 reg_PERIOD;
    418  1.1  riastrad 	u32 reg_MADJ;
    419  1.1  riastrad 	u32 reg_SADJ;
    420  1.1  riastrad 	u32 reg_MRS;
    421  1.1  riastrad 	u32 reg_EMRS;
    422  1.1  riastrad 	u32 reg_AC1;
    423  1.1  riastrad 	u32 reg_AC2;
    424  1.1  riastrad 	u32 reg_DQSIC;
    425  1.1  riastrad 	u32 reg_DRV;
    426  1.1  riastrad 	u32 reg_IOZ;
    427  1.1  riastrad 	u32 reg_DQIDLY;
    428  1.1  riastrad 	u32 reg_FREQ;
    429  1.1  riastrad 	u32 madj_max;
    430  1.1  riastrad 	u32 dll2_finetune_step;
    431  1.1  riastrad };
    432  1.1  riastrad 
    433  1.1  riastrad /*
    434  1.1  riastrad  * DQSI DLL CBR Setting
    435  1.1  riastrad  */
    436  1.2  riastrad #define CBR_SIZE0            ((1  << 10) - 1)
    437  1.1  riastrad #define CBR_SIZE1            ((4  << 10) - 1)
    438  1.1  riastrad #define CBR_SIZE2            ((64 << 10) - 1)
    439  1.1  riastrad #define CBR_PASSNUM          5
    440  1.1  riastrad #define CBR_PASSNUM2         5
    441  1.1  riastrad #define CBR_THRESHOLD        10
    442  1.1  riastrad #define CBR_THRESHOLD2       10
    443  1.1  riastrad #define TIMEOUT              5000000
    444  1.1  riastrad #define CBR_PATNUM           8
    445  1.1  riastrad 
    446  1.1  riastrad static const u32 pattern[8] = {
    447  1.1  riastrad 	0xFF00FF00,
    448  1.1  riastrad 	0xCC33CC33,
    449  1.1  riastrad 	0xAA55AA55,
    450  1.1  riastrad 	0x88778877,
    451  1.1  riastrad 	0x92CC4D6E,
    452  1.1  riastrad 	0x543D3CDE,
    453  1.1  riastrad 	0xF1E843C7,
    454  1.1  riastrad 	0x7C61D253
    455  1.1  riastrad };
    456  1.1  riastrad 
    457  1.3  riastrad static bool mmc_test(struct ast_private *ast, u32 datagen, u8 test_ctl)
    458  1.1  riastrad {
    459  1.1  riastrad 	u32 data, timeout;
    460  1.1  riastrad 
    461  1.2  riastrad 	ast_moutdwm(ast, 0x1e6e0070, 0x00000000);
    462  1.3  riastrad 	ast_moutdwm(ast, 0x1e6e0070, (datagen << 3) | test_ctl);
    463  1.1  riastrad 	timeout = 0;
    464  1.1  riastrad 	do {
    465  1.2  riastrad 		data = ast_mindwm(ast, 0x1e6e0070) & 0x3000;
    466  1.3  riastrad 		if (data & 0x2000)
    467  1.3  riastrad 			return false;
    468  1.1  riastrad 		if (++timeout > TIMEOUT) {
    469  1.2  riastrad 			ast_moutdwm(ast, 0x1e6e0070, 0x00000000);
    470  1.3  riastrad 			return false;
    471  1.1  riastrad 		}
    472  1.1  riastrad 	} while (!data);
    473  1.3  riastrad 	ast_moutdwm(ast, 0x1e6e0070, 0x0);
    474  1.3  riastrad 	return true;
    475  1.1  riastrad }
    476  1.1  riastrad 
    477  1.3  riastrad static u32 mmc_test2(struct ast_private *ast, u32 datagen, u8 test_ctl)
    478  1.1  riastrad {
    479  1.1  riastrad 	u32 data, timeout;
    480  1.1  riastrad 
    481  1.2  riastrad 	ast_moutdwm(ast, 0x1e6e0070, 0x00000000);
    482  1.3  riastrad 	ast_moutdwm(ast, 0x1e6e0070, (datagen << 3) | test_ctl);
    483  1.1  riastrad 	timeout = 0;
    484  1.1  riastrad 	do {
    485  1.2  riastrad 		data = ast_mindwm(ast, 0x1e6e0070) & 0x1000;
    486  1.1  riastrad 		if (++timeout > TIMEOUT) {
    487  1.2  riastrad 			ast_moutdwm(ast, 0x1e6e0070, 0x0);
    488  1.3  riastrad 			return 0xffffffff;
    489  1.1  riastrad 		}
    490  1.1  riastrad 	} while (!data);
    491  1.2  riastrad 	data = ast_mindwm(ast, 0x1e6e0078);
    492  1.1  riastrad 	data = (data | (data >> 16)) & 0xffff;
    493  1.3  riastrad 	ast_moutdwm(ast, 0x1e6e0070, 0x00000000);
    494  1.1  riastrad 	return data;
    495  1.1  riastrad }
    496  1.1  riastrad 
    497  1.3  riastrad 
    498  1.3  riastrad static bool mmc_test_burst(struct ast_private *ast, u32 datagen)
    499  1.3  riastrad {
    500  1.3  riastrad 	return mmc_test(ast, datagen, 0xc1);
    501  1.3  riastrad }
    502  1.3  riastrad 
    503  1.3  riastrad static u32 mmc_test_burst2(struct ast_private *ast, u32 datagen)
    504  1.1  riastrad {
    505  1.3  riastrad 	return mmc_test2(ast, datagen, 0x41);
    506  1.3  riastrad }
    507  1.1  riastrad 
    508  1.3  riastrad static bool mmc_test_single(struct ast_private *ast, u32 datagen)
    509  1.3  riastrad {
    510  1.3  riastrad 	return mmc_test(ast, datagen, 0xc5);
    511  1.1  riastrad }
    512  1.1  riastrad 
    513  1.3  riastrad static u32 mmc_test_single2(struct ast_private *ast, u32 datagen)
    514  1.1  riastrad {
    515  1.3  riastrad 	return mmc_test2(ast, datagen, 0x05);
    516  1.3  riastrad }
    517  1.1  riastrad 
    518  1.3  riastrad static bool mmc_test_single_2500(struct ast_private *ast, u32 datagen)
    519  1.3  riastrad {
    520  1.3  riastrad 	return mmc_test(ast, datagen, 0x85);
    521  1.1  riastrad }
    522  1.1  riastrad 
    523  1.1  riastrad static int cbr_test(struct ast_private *ast)
    524  1.1  riastrad {
    525  1.1  riastrad 	u32 data;
    526  1.1  riastrad 	int i;
    527  1.1  riastrad 	data = mmc_test_single2(ast, 0);
    528  1.1  riastrad 	if ((data & 0xff) && (data & 0xff00))
    529  1.1  riastrad 		return 0;
    530  1.1  riastrad 	for (i = 0; i < 8; i++) {
    531  1.1  riastrad 		data = mmc_test_burst2(ast, i);
    532  1.1  riastrad 		if ((data & 0xff) && (data & 0xff00))
    533  1.1  riastrad 			return 0;
    534  1.1  riastrad 	}
    535  1.1  riastrad 	if (!data)
    536  1.1  riastrad 		return 3;
    537  1.1  riastrad 	else if (data & 0xff)
    538  1.1  riastrad 		return 2;
    539  1.1  riastrad 	return 1;
    540  1.1  riastrad }
    541  1.1  riastrad 
    542  1.1  riastrad static int cbr_scan(struct ast_private *ast)
    543  1.1  riastrad {
    544  1.1  riastrad 	u32 data, data2, patcnt, loop;
    545  1.1  riastrad 
    546  1.1  riastrad 	data2 = 3;
    547  1.1  riastrad 	for (patcnt = 0; patcnt < CBR_PATNUM; patcnt++) {
    548  1.2  riastrad 		ast_moutdwm(ast, 0x1e6e007c, pattern[patcnt]);
    549  1.1  riastrad 		for (loop = 0; loop < CBR_PASSNUM2; loop++) {
    550  1.1  riastrad 			if ((data = cbr_test(ast)) != 0) {
    551  1.1  riastrad 				data2 &= data;
    552  1.1  riastrad 				if (!data2)
    553  1.1  riastrad 					return 0;
    554  1.1  riastrad 				break;
    555  1.1  riastrad 			}
    556  1.1  riastrad 		}
    557  1.1  riastrad 		if (loop == CBR_PASSNUM2)
    558  1.1  riastrad 			return 0;
    559  1.1  riastrad 	}
    560  1.1  riastrad 	return data2;
    561  1.1  riastrad }
    562  1.1  riastrad 
    563  1.1  riastrad static u32 cbr_test2(struct ast_private *ast)
    564  1.1  riastrad {
    565  1.1  riastrad 	u32 data;
    566  1.1  riastrad 
    567  1.1  riastrad 	data = mmc_test_burst2(ast, 0);
    568  1.1  riastrad 	if (data == 0xffff)
    569  1.1  riastrad 		return 0;
    570  1.1  riastrad 	data |= mmc_test_single2(ast, 0);
    571  1.1  riastrad 	if (data == 0xffff)
    572  1.1  riastrad 		return 0;
    573  1.1  riastrad 
    574  1.1  riastrad 	return ~data & 0xffff;
    575  1.1  riastrad }
    576  1.1  riastrad 
    577  1.1  riastrad static u32 cbr_scan2(struct ast_private *ast)
    578  1.1  riastrad {
    579  1.1  riastrad 	u32 data, data2, patcnt, loop;
    580  1.1  riastrad 
    581  1.1  riastrad 	data2 = 0xffff;
    582  1.1  riastrad 	for (patcnt = 0; patcnt < CBR_PATNUM; patcnt++) {
    583  1.2  riastrad 		ast_moutdwm(ast, 0x1e6e007c, pattern[patcnt]);
    584  1.1  riastrad 		for (loop = 0; loop < CBR_PASSNUM2; loop++) {
    585  1.1  riastrad 			if ((data = cbr_test2(ast)) != 0) {
    586  1.1  riastrad 				data2 &= data;
    587  1.2  riastrad 				if (!data2)
    588  1.1  riastrad 					return 0;
    589  1.1  riastrad 				break;
    590  1.1  riastrad 			}
    591  1.1  riastrad 		}
    592  1.1  riastrad 		if (loop == CBR_PASSNUM2)
    593  1.1  riastrad 			return 0;
    594  1.1  riastrad 	}
    595  1.1  riastrad 	return data2;
    596  1.1  riastrad }
    597  1.1  riastrad 
    598  1.3  riastrad static bool cbr_test3(struct ast_private *ast)
    599  1.1  riastrad {
    600  1.2  riastrad 	if (!mmc_test_burst(ast, 0))
    601  1.3  riastrad 		return false;
    602  1.2  riastrad 	if (!mmc_test_single(ast, 0))
    603  1.3  riastrad 		return false;
    604  1.3  riastrad 	return true;
    605  1.2  riastrad }
    606  1.1  riastrad 
    607  1.3  riastrad static bool cbr_scan3(struct ast_private *ast)
    608  1.2  riastrad {
    609  1.2  riastrad 	u32 patcnt, loop;
    610  1.1  riastrad 
    611  1.2  riastrad 	for (patcnt = 0; patcnt < CBR_PATNUM; patcnt++) {
    612  1.2  riastrad 		ast_moutdwm(ast, 0x1e6e007c, pattern[patcnt]);
    613  1.2  riastrad 		for (loop = 0; loop < 2; loop++) {
    614  1.2  riastrad 			if (cbr_test3(ast))
    615  1.2  riastrad 				break;
    616  1.1  riastrad 		}
    617  1.2  riastrad 		if (loop == 2)
    618  1.3  riastrad 			return false;
    619  1.1  riastrad 	}
    620  1.3  riastrad 	return true;
    621  1.2  riastrad }
    622  1.1  riastrad 
    623  1.2  riastrad static bool finetuneDQI_L(struct ast_private *ast, struct ast2300_dram_param *param)
    624  1.1  riastrad {
    625  1.2  riastrad 	u32 gold_sadj[2], dllmin[16], dllmax[16], dlli, data, cnt, mask, passcnt, retry = 0;
    626  1.2  riastrad 	bool status = false;
    627  1.1  riastrad FINETUNE_START:
    628  1.1  riastrad 	for (cnt = 0; cnt < 16; cnt++) {
    629  1.1  riastrad 		dllmin[cnt] = 0xff;
    630  1.1  riastrad 		dllmax[cnt] = 0x0;
    631  1.1  riastrad 	}
    632  1.1  riastrad 	passcnt = 0;
    633  1.1  riastrad 	for (dlli = 0; dlli < 76; dlli++) {
    634  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E0068, 0x00001400 | (dlli << 16) | (dlli << 24));
    635  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E0074, CBR_SIZE1);
    636  1.1  riastrad 		data = cbr_scan2(ast);
    637  1.1  riastrad 		if (data != 0) {
    638  1.1  riastrad 			mask = 0x00010001;
    639  1.1  riastrad 			for (cnt = 0; cnt < 16; cnt++) {
    640  1.1  riastrad 				if (data & mask) {
    641  1.1  riastrad 					if (dllmin[cnt] > dlli) {
    642  1.1  riastrad 						dllmin[cnt] = dlli;
    643  1.1  riastrad 					}
    644  1.1  riastrad 					if (dllmax[cnt] < dlli) {
    645  1.1  riastrad 						dllmax[cnt] = dlli;
    646  1.1  riastrad 					}
    647  1.1  riastrad 				}
    648  1.1  riastrad 				mask <<= 1;
    649  1.1  riastrad 			}
    650  1.1  riastrad 			passcnt++;
    651  1.1  riastrad 		} else if (passcnt >= CBR_THRESHOLD2) {
    652  1.1  riastrad 			break;
    653  1.1  riastrad 		}
    654  1.1  riastrad 	}
    655  1.1  riastrad 	gold_sadj[0] = 0x0;
    656  1.1  riastrad 	passcnt = 0;
    657  1.1  riastrad 	for (cnt = 0; cnt < 16; cnt++) {
    658  1.1  riastrad 		if ((dllmax[cnt] > dllmin[cnt]) && ((dllmax[cnt] - dllmin[cnt]) >= CBR_THRESHOLD2)) {
    659  1.1  riastrad 			gold_sadj[0] += dllmin[cnt];
    660  1.1  riastrad 			passcnt++;
    661  1.1  riastrad 		}
    662  1.1  riastrad 	}
    663  1.2  riastrad 	if (retry++ > 10)
    664  1.2  riastrad 		goto FINETUNE_DONE;
    665  1.1  riastrad 	if (passcnt != 16) {
    666  1.1  riastrad 		goto FINETUNE_START;
    667  1.1  riastrad 	}
    668  1.2  riastrad 	status = true;
    669  1.2  riastrad FINETUNE_DONE:
    670  1.1  riastrad 	gold_sadj[0] = gold_sadj[0] >> 4;
    671  1.1  riastrad 	gold_sadj[1] = gold_sadj[0];
    672  1.1  riastrad 
    673  1.1  riastrad 	data = 0;
    674  1.1  riastrad 	for (cnt = 0; cnt < 8; cnt++) {
    675  1.1  riastrad 		data >>= 3;
    676  1.1  riastrad 		if ((dllmax[cnt] > dllmin[cnt]) && ((dllmax[cnt] - dllmin[cnt]) >= CBR_THRESHOLD2)) {
    677  1.1  riastrad 			dlli = dllmin[cnt];
    678  1.1  riastrad 			if (gold_sadj[0] >= dlli) {
    679  1.1  riastrad 				dlli = ((gold_sadj[0] - dlli) * 19) >> 5;
    680  1.1  riastrad 				if (dlli > 3) {
    681  1.1  riastrad 					dlli = 3;
    682  1.1  riastrad 				}
    683  1.1  riastrad 			} else {
    684  1.1  riastrad 				dlli = ((dlli - gold_sadj[0]) * 19) >> 5;
    685  1.1  riastrad 				if (dlli > 4) {
    686  1.1  riastrad 					dlli = 4;
    687  1.1  riastrad 				}
    688  1.1  riastrad 				dlli = (8 - dlli) & 0x7;
    689  1.1  riastrad 			}
    690  1.1  riastrad 			data |= dlli << 21;
    691  1.1  riastrad 		}
    692  1.1  riastrad 	}
    693  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0080, data);
    694  1.1  riastrad 
    695  1.1  riastrad 	data = 0;
    696  1.1  riastrad 	for (cnt = 8; cnt < 16; cnt++) {
    697  1.1  riastrad 		data >>= 3;
    698  1.1  riastrad 		if ((dllmax[cnt] > dllmin[cnt]) && ((dllmax[cnt] - dllmin[cnt]) >= CBR_THRESHOLD2)) {
    699  1.1  riastrad 			dlli = dllmin[cnt];
    700  1.1  riastrad 			if (gold_sadj[1] >= dlli) {
    701  1.1  riastrad 				dlli = ((gold_sadj[1] - dlli) * 19) >> 5;
    702  1.1  riastrad 				if (dlli > 3) {
    703  1.1  riastrad 					dlli = 3;
    704  1.1  riastrad 				} else {
    705  1.1  riastrad 					dlli = (dlli - 1) & 0x7;
    706  1.1  riastrad 				}
    707  1.1  riastrad 			} else {
    708  1.1  riastrad 				dlli = ((dlli - gold_sadj[1]) * 19) >> 5;
    709  1.1  riastrad 				dlli += 1;
    710  1.1  riastrad 				if (dlli > 4) {
    711  1.1  riastrad 					dlli = 4;
    712  1.1  riastrad 				}
    713  1.1  riastrad 				dlli = (8 - dlli) & 0x7;
    714  1.1  riastrad 			}
    715  1.1  riastrad 			data |= dlli << 21;
    716  1.1  riastrad 		}
    717  1.1  riastrad 	}
    718  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0084, data);
    719  1.2  riastrad 	return status;
    720  1.1  riastrad } /* finetuneDQI_L */
    721  1.1  riastrad 
    722  1.2  riastrad static void finetuneDQSI(struct ast_private *ast)
    723  1.1  riastrad {
    724  1.2  riastrad 	u32 dlli, dqsip, dqidly;
    725  1.2  riastrad 	u32 reg_mcr18, reg_mcr0c, passcnt[2], diff;
    726  1.2  riastrad 	u32 g_dqidly, g_dqsip, g_margin, g_side;
    727  1.2  riastrad 	u16 pass[32][2][2];
    728  1.2  riastrad 	char tag[2][76];
    729  1.2  riastrad 
    730  1.2  riastrad 	/* Disable DQI CBR */
    731  1.2  riastrad 	reg_mcr0c  = ast_mindwm(ast, 0x1E6E000C);
    732  1.2  riastrad 	reg_mcr18  = ast_mindwm(ast, 0x1E6E0018);
    733  1.2  riastrad 	reg_mcr18 &= 0x0000ffff;
    734  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0018, reg_mcr18);
    735  1.1  riastrad 
    736  1.1  riastrad 	for (dlli = 0; dlli < 76; dlli++) {
    737  1.2  riastrad 		tag[0][dlli] = 0x0;
    738  1.2  riastrad 		tag[1][dlli] = 0x0;
    739  1.1  riastrad 	}
    740  1.2  riastrad 	for (dqidly = 0; dqidly < 32; dqidly++) {
    741  1.2  riastrad 		pass[dqidly][0][0] = 0xff;
    742  1.2  riastrad 		pass[dqidly][0][1] = 0x0;
    743  1.2  riastrad 		pass[dqidly][1][0] = 0xff;
    744  1.2  riastrad 		pass[dqidly][1][1] = 0x0;
    745  1.2  riastrad 	}
    746  1.2  riastrad 	for (dqidly = 0; dqidly < 32; dqidly++) {
    747  1.2  riastrad 		passcnt[0] = passcnt[1] = 0;
    748  1.2  riastrad 		for (dqsip = 0; dqsip < 2; dqsip++) {
    749  1.2  riastrad 			ast_moutdwm(ast, 0x1E6E000C, 0);
    750  1.2  riastrad 			ast_moutdwm(ast, 0x1E6E0018, reg_mcr18 | (dqidly << 16) | (dqsip << 23));
    751  1.2  riastrad 			ast_moutdwm(ast, 0x1E6E000C, reg_mcr0c);
    752  1.2  riastrad 			for (dlli = 0; dlli < 76; dlli++) {
    753  1.2  riastrad 				ast_moutdwm(ast, 0x1E6E0068, 0x00001300 | (dlli << 16) | (dlli << 24));
    754  1.2  riastrad 				ast_moutdwm(ast, 0x1E6E0070, 0);
    755  1.2  riastrad 				ast_moutdwm(ast, 0x1E6E0074, CBR_SIZE0);
    756  1.2  riastrad 				if (cbr_scan3(ast)) {
    757  1.2  riastrad 					if (dlli == 0)
    758  1.2  riastrad 						break;
    759  1.2  riastrad 					passcnt[dqsip]++;
    760  1.2  riastrad 					tag[dqsip][dlli] = 'P';
    761  1.2  riastrad 					if (dlli < pass[dqidly][dqsip][0])
    762  1.2  riastrad 						pass[dqidly][dqsip][0] = (u16) dlli;
    763  1.2  riastrad 					if (dlli > pass[dqidly][dqsip][1])
    764  1.2  riastrad 						pass[dqidly][dqsip][1] = (u16) dlli;
    765  1.2  riastrad 				} else if (passcnt[dqsip] >= 5)
    766  1.2  riastrad 					break;
    767  1.2  riastrad 				else {
    768  1.2  riastrad 					pass[dqidly][dqsip][0] = 0xff;
    769  1.2  riastrad 					pass[dqidly][dqsip][1] = 0x0;
    770  1.1  riastrad 				}
    771  1.1  riastrad 			}
    772  1.1  riastrad 		}
    773  1.2  riastrad 		if (passcnt[0] == 0 && passcnt[1] == 0)
    774  1.2  riastrad 			dqidly++;
    775  1.1  riastrad 	}
    776  1.2  riastrad 	/* Search margin */
    777  1.2  riastrad 	g_dqidly = g_dqsip = g_margin = g_side = 0;
    778  1.1  riastrad 
    779  1.2  riastrad 	for (dqidly = 0; dqidly < 32; dqidly++) {
    780  1.2  riastrad 		for (dqsip = 0; dqsip < 2; dqsip++) {
    781  1.2  riastrad 			if (pass[dqidly][dqsip][0] > pass[dqidly][dqsip][1])
    782  1.2  riastrad 				continue;
    783  1.2  riastrad 			diff = pass[dqidly][dqsip][1] - pass[dqidly][dqsip][0];
    784  1.2  riastrad 			if ((diff+2) < g_margin)
    785  1.2  riastrad 				continue;
    786  1.2  riastrad 			passcnt[0] = passcnt[1] = 0;
    787  1.2  riastrad 			for (dlli = pass[dqidly][dqsip][0]; dlli > 0  && tag[dqsip][dlli] != 0; dlli--, passcnt[0]++);
    788  1.2  riastrad 			for (dlli = pass[dqidly][dqsip][1]; dlli < 76 && tag[dqsip][dlli] != 0; dlli++, passcnt[1]++);
    789  1.2  riastrad 			if (passcnt[0] > passcnt[1])
    790  1.2  riastrad 				passcnt[0] = passcnt[1];
    791  1.2  riastrad 			passcnt[1] = 0;
    792  1.2  riastrad 			if (passcnt[0] > g_side)
    793  1.2  riastrad 				passcnt[1] = passcnt[0] - g_side;
    794  1.2  riastrad 			if (diff > (g_margin+1) && (passcnt[1] > 0 || passcnt[0] > 8)) {
    795  1.2  riastrad 				g_margin = diff;
    796  1.2  riastrad 				g_dqidly = dqidly;
    797  1.2  riastrad 				g_dqsip  = dqsip;
    798  1.2  riastrad 				g_side   = passcnt[0];
    799  1.2  riastrad 			} else if (passcnt[1] > 1 && g_side < 8) {
    800  1.2  riastrad 				if (diff > g_margin)
    801  1.2  riastrad 					g_margin = diff;
    802  1.2  riastrad 				g_dqidly = dqidly;
    803  1.2  riastrad 				g_dqsip  = dqsip;
    804  1.2  riastrad 				g_side   = passcnt[0];
    805  1.1  riastrad 			}
    806  1.1  riastrad 		}
    807  1.1  riastrad 	}
    808  1.2  riastrad 	reg_mcr18 = reg_mcr18 | (g_dqidly << 16) | (g_dqsip << 23);
    809  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0018, reg_mcr18);
    810  1.1  riastrad 
    811  1.2  riastrad }
    812  1.2  riastrad static bool cbr_dll2(struct ast_private *ast, struct ast2300_dram_param *param)
    813  1.1  riastrad {
    814  1.2  riastrad 	u32 dllmin[2], dllmax[2], dlli, data, passcnt, retry = 0;
    815  1.2  riastrad 	bool status = false;
    816  1.1  riastrad 
    817  1.2  riastrad 	finetuneDQSI(ast);
    818  1.2  riastrad 	if (finetuneDQI_L(ast, param) == false)
    819  1.2  riastrad 		return status;
    820  1.1  riastrad 
    821  1.1  riastrad CBR_START2:
    822  1.1  riastrad 	dllmin[0] = dllmin[1] = 0xff;
    823  1.1  riastrad 	dllmax[0] = dllmax[1] = 0x0;
    824  1.1  riastrad 	passcnt = 0;
    825  1.1  riastrad 	for (dlli = 0; dlli < 76; dlli++) {
    826  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E0068, 0x00001300 | (dlli << 16) | (dlli << 24));
    827  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E0074, CBR_SIZE2);
    828  1.1  riastrad 		data = cbr_scan(ast);
    829  1.1  riastrad 		if (data != 0) {
    830  1.1  riastrad 			if (data & 0x1) {
    831  1.1  riastrad 				if (dllmin[0] > dlli) {
    832  1.1  riastrad 					dllmin[0] = dlli;
    833  1.1  riastrad 				}
    834  1.1  riastrad 				if (dllmax[0] < dlli) {
    835  1.1  riastrad 					dllmax[0] = dlli;
    836  1.1  riastrad 				}
    837  1.1  riastrad 			}
    838  1.1  riastrad 			if (data & 0x2) {
    839  1.1  riastrad 				if (dllmin[1] > dlli) {
    840  1.1  riastrad 					dllmin[1] = dlli;
    841  1.1  riastrad 				}
    842  1.1  riastrad 				if (dllmax[1] < dlli) {
    843  1.1  riastrad 					dllmax[1] = dlli;
    844  1.1  riastrad 				}
    845  1.1  riastrad 			}
    846  1.1  riastrad 			passcnt++;
    847  1.1  riastrad 		} else if (passcnt >= CBR_THRESHOLD) {
    848  1.1  riastrad 			break;
    849  1.1  riastrad 		}
    850  1.1  riastrad 	}
    851  1.2  riastrad 	if (retry++ > 10)
    852  1.2  riastrad 		goto CBR_DONE2;
    853  1.1  riastrad 	if (dllmax[0] == 0 || (dllmax[0]-dllmin[0]) < CBR_THRESHOLD) {
    854  1.1  riastrad 		goto CBR_START2;
    855  1.1  riastrad 	}
    856  1.1  riastrad 	if (dllmax[1] == 0 || (dllmax[1]-dllmin[1]) < CBR_THRESHOLD) {
    857  1.1  riastrad 		goto CBR_START2;
    858  1.1  riastrad 	}
    859  1.2  riastrad 	status = true;
    860  1.2  riastrad CBR_DONE2:
    861  1.1  riastrad 	dlli  = (dllmin[1] + dllmax[1]) >> 1;
    862  1.1  riastrad 	dlli <<= 8;
    863  1.1  riastrad 	dlli += (dllmin[0] + dllmax[0]) >> 1;
    864  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0068, ast_mindwm(ast, 0x1E720058) | (dlli << 16));
    865  1.2  riastrad 	return status;
    866  1.1  riastrad } /* CBRDLL2 */
    867  1.1  riastrad 
    868  1.1  riastrad static void get_ddr3_info(struct ast_private *ast, struct ast2300_dram_param *param)
    869  1.1  riastrad {
    870  1.1  riastrad 	u32 trap, trap_AC2, trap_MRS;
    871  1.1  riastrad 
    872  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E2000, 0x1688A8A8);
    873  1.1  riastrad 
    874  1.1  riastrad 	/* Ger trap info */
    875  1.2  riastrad 	trap = (ast_mindwm(ast, 0x1E6E2070) >> 25) & 0x3;
    876  1.1  riastrad 	trap_AC2  = 0x00020000 + (trap << 16);
    877  1.1  riastrad 	trap_AC2 |= 0x00300000 + ((trap & 0x2) << 19);
    878  1.1  riastrad 	trap_MRS  = 0x00000010 + (trap << 4);
    879  1.1  riastrad 	trap_MRS |= ((trap & 0x2) << 18);
    880  1.1  riastrad 
    881  1.1  riastrad 	param->reg_MADJ       = 0x00034C4C;
    882  1.1  riastrad 	param->reg_SADJ       = 0x00001800;
    883  1.1  riastrad 	param->reg_DRV        = 0x000000F0;
    884  1.1  riastrad 	param->reg_PERIOD     = param->dram_freq;
    885  1.1  riastrad 	param->rodt           = 0;
    886  1.1  riastrad 
    887  1.1  riastrad 	switch (param->dram_freq) {
    888  1.1  riastrad 	case 336:
    889  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E2020, 0x0190);
    890  1.1  riastrad 		param->wodt          = 0;
    891  1.1  riastrad 		param->reg_AC1       = 0x22202725;
    892  1.1  riastrad 		param->reg_AC2       = 0xAA007613 | trap_AC2;
    893  1.1  riastrad 		param->reg_DQSIC     = 0x000000BA;
    894  1.1  riastrad 		param->reg_MRS       = 0x04001400 | trap_MRS;
    895  1.1  riastrad 		param->reg_EMRS      = 0x00000000;
    896  1.2  riastrad 		param->reg_IOZ       = 0x00000023;
    897  1.1  riastrad 		param->reg_DQIDLY    = 0x00000074;
    898  1.1  riastrad 		param->reg_FREQ      = 0x00004DC0;
    899  1.1  riastrad 		param->madj_max      = 96;
    900  1.1  riastrad 		param->dll2_finetune_step = 3;
    901  1.2  riastrad 		switch (param->dram_chipid) {
    902  1.2  riastrad 		default:
    903  1.2  riastrad 		case AST_DRAM_512Mx16:
    904  1.2  riastrad 		case AST_DRAM_1Gx16:
    905  1.2  riastrad 			param->reg_AC2   = 0xAA007613 | trap_AC2;
    906  1.2  riastrad 			break;
    907  1.2  riastrad 		case AST_DRAM_2Gx16:
    908  1.2  riastrad 			param->reg_AC2   = 0xAA00761C | trap_AC2;
    909  1.2  riastrad 			break;
    910  1.2  riastrad 		case AST_DRAM_4Gx16:
    911  1.2  riastrad 			param->reg_AC2   = 0xAA007636 | trap_AC2;
    912  1.2  riastrad 			break;
    913  1.2  riastrad 		}
    914  1.1  riastrad 		break;
    915  1.1  riastrad 	default:
    916  1.1  riastrad 	case 396:
    917  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E2020, 0x03F1);
    918  1.1  riastrad 		param->wodt          = 1;
    919  1.1  riastrad 		param->reg_AC1       = 0x33302825;
    920  1.1  riastrad 		param->reg_AC2       = 0xCC009617 | trap_AC2;
    921  1.1  riastrad 		param->reg_DQSIC     = 0x000000E2;
    922  1.1  riastrad 		param->reg_MRS       = 0x04001600 | trap_MRS;
    923  1.1  riastrad 		param->reg_EMRS      = 0x00000000;
    924  1.1  riastrad 		param->reg_IOZ       = 0x00000034;
    925  1.1  riastrad 		param->reg_DRV       = 0x000000FA;
    926  1.1  riastrad 		param->reg_DQIDLY    = 0x00000089;
    927  1.2  riastrad 		param->reg_FREQ      = 0x00005040;
    928  1.1  riastrad 		param->madj_max      = 96;
    929  1.1  riastrad 		param->dll2_finetune_step = 4;
    930  1.1  riastrad 
    931  1.1  riastrad 		switch (param->dram_chipid) {
    932  1.1  riastrad 		default:
    933  1.1  riastrad 		case AST_DRAM_512Mx16:
    934  1.1  riastrad 		case AST_DRAM_1Gx16:
    935  1.1  riastrad 			param->reg_AC2   = 0xCC009617 | trap_AC2;
    936  1.1  riastrad 			break;
    937  1.1  riastrad 		case AST_DRAM_2Gx16:
    938  1.1  riastrad 			param->reg_AC2   = 0xCC009622 | trap_AC2;
    939  1.1  riastrad 			break;
    940  1.1  riastrad 		case AST_DRAM_4Gx16:
    941  1.1  riastrad 			param->reg_AC2   = 0xCC00963F | trap_AC2;
    942  1.1  riastrad 			break;
    943  1.1  riastrad 		}
    944  1.1  riastrad 		break;
    945  1.1  riastrad 
    946  1.1  riastrad 	case 408:
    947  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E2020, 0x01F0);
    948  1.1  riastrad 		param->wodt          = 1;
    949  1.1  riastrad 		param->reg_AC1       = 0x33302825;
    950  1.1  riastrad 		param->reg_AC2       = 0xCC009617 | trap_AC2;
    951  1.1  riastrad 		param->reg_DQSIC     = 0x000000E2;
    952  1.1  riastrad 		param->reg_MRS       = 0x04001600 | trap_MRS;
    953  1.1  riastrad 		param->reg_EMRS      = 0x00000000;
    954  1.2  riastrad 		param->reg_IOZ       = 0x00000023;
    955  1.1  riastrad 		param->reg_DRV       = 0x000000FA;
    956  1.1  riastrad 		param->reg_DQIDLY    = 0x00000089;
    957  1.1  riastrad 		param->reg_FREQ      = 0x000050C0;
    958  1.1  riastrad 		param->madj_max      = 96;
    959  1.1  riastrad 		param->dll2_finetune_step = 4;
    960  1.1  riastrad 
    961  1.1  riastrad 		switch (param->dram_chipid) {
    962  1.1  riastrad 		default:
    963  1.1  riastrad 		case AST_DRAM_512Mx16:
    964  1.1  riastrad 		case AST_DRAM_1Gx16:
    965  1.1  riastrad 			param->reg_AC2   = 0xCC009617 | trap_AC2;
    966  1.1  riastrad 			break;
    967  1.1  riastrad 		case AST_DRAM_2Gx16:
    968  1.1  riastrad 			param->reg_AC2   = 0xCC009622 | trap_AC2;
    969  1.1  riastrad 			break;
    970  1.1  riastrad 		case AST_DRAM_4Gx16:
    971  1.1  riastrad 			param->reg_AC2   = 0xCC00963F | trap_AC2;
    972  1.1  riastrad 			break;
    973  1.1  riastrad 		}
    974  1.1  riastrad 
    975  1.1  riastrad 		break;
    976  1.1  riastrad 	case 456:
    977  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E2020, 0x0230);
    978  1.1  riastrad 		param->wodt          = 0;
    979  1.1  riastrad 		param->reg_AC1       = 0x33302926;
    980  1.1  riastrad 		param->reg_AC2       = 0xCD44961A;
    981  1.1  riastrad 		param->reg_DQSIC     = 0x000000FC;
    982  1.1  riastrad 		param->reg_MRS       = 0x00081830;
    983  1.1  riastrad 		param->reg_EMRS      = 0x00000000;
    984  1.1  riastrad 		param->reg_IOZ       = 0x00000045;
    985  1.1  riastrad 		param->reg_DQIDLY    = 0x00000097;
    986  1.1  riastrad 		param->reg_FREQ      = 0x000052C0;
    987  1.1  riastrad 		param->madj_max      = 88;
    988  1.1  riastrad 		param->dll2_finetune_step = 4;
    989  1.1  riastrad 		break;
    990  1.1  riastrad 	case 504:
    991  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E2020, 0x0270);
    992  1.1  riastrad 		param->wodt          = 1;
    993  1.1  riastrad 		param->reg_AC1       = 0x33302926;
    994  1.1  riastrad 		param->reg_AC2       = 0xDE44A61D;
    995  1.1  riastrad 		param->reg_DQSIC     = 0x00000117;
    996  1.1  riastrad 		param->reg_MRS       = 0x00081A30;
    997  1.1  riastrad 		param->reg_EMRS      = 0x00000000;
    998  1.1  riastrad 		param->reg_IOZ       = 0x070000BB;
    999  1.1  riastrad 		param->reg_DQIDLY    = 0x000000A0;
   1000  1.1  riastrad 		param->reg_FREQ      = 0x000054C0;
   1001  1.1  riastrad 		param->madj_max      = 79;
   1002  1.1  riastrad 		param->dll2_finetune_step = 4;
   1003  1.1  riastrad 		break;
   1004  1.1  riastrad 	case 528:
   1005  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E2020, 0x0290);
   1006  1.1  riastrad 		param->wodt          = 1;
   1007  1.1  riastrad 		param->rodt          = 1;
   1008  1.1  riastrad 		param->reg_AC1       = 0x33302926;
   1009  1.1  riastrad 		param->reg_AC2       = 0xEF44B61E;
   1010  1.1  riastrad 		param->reg_DQSIC     = 0x00000125;
   1011  1.1  riastrad 		param->reg_MRS       = 0x00081A30;
   1012  1.1  riastrad 		param->reg_EMRS      = 0x00000040;
   1013  1.1  riastrad 		param->reg_DRV       = 0x000000F5;
   1014  1.1  riastrad 		param->reg_IOZ       = 0x00000023;
   1015  1.1  riastrad 		param->reg_DQIDLY    = 0x00000088;
   1016  1.1  riastrad 		param->reg_FREQ      = 0x000055C0;
   1017  1.1  riastrad 		param->madj_max      = 76;
   1018  1.1  riastrad 		param->dll2_finetune_step = 3;
   1019  1.1  riastrad 		break;
   1020  1.1  riastrad 	case 576:
   1021  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E2020, 0x0140);
   1022  1.1  riastrad 		param->reg_MADJ      = 0x00136868;
   1023  1.1  riastrad 		param->reg_SADJ      = 0x00004534;
   1024  1.1  riastrad 		param->wodt          = 1;
   1025  1.1  riastrad 		param->rodt          = 1;
   1026  1.1  riastrad 		param->reg_AC1       = 0x33302A37;
   1027  1.1  riastrad 		param->reg_AC2       = 0xEF56B61E;
   1028  1.1  riastrad 		param->reg_DQSIC     = 0x0000013F;
   1029  1.1  riastrad 		param->reg_MRS       = 0x00101A50;
   1030  1.1  riastrad 		param->reg_EMRS      = 0x00000040;
   1031  1.1  riastrad 		param->reg_DRV       = 0x000000FA;
   1032  1.1  riastrad 		param->reg_IOZ       = 0x00000023;
   1033  1.1  riastrad 		param->reg_DQIDLY    = 0x00000078;
   1034  1.1  riastrad 		param->reg_FREQ      = 0x000057C0;
   1035  1.1  riastrad 		param->madj_max      = 136;
   1036  1.1  riastrad 		param->dll2_finetune_step = 3;
   1037  1.1  riastrad 		break;
   1038  1.1  riastrad 	case 600:
   1039  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E2020, 0x02E1);
   1040  1.1  riastrad 		param->reg_MADJ      = 0x00136868;
   1041  1.1  riastrad 		param->reg_SADJ      = 0x00004534;
   1042  1.1  riastrad 		param->wodt          = 1;
   1043  1.1  riastrad 		param->rodt          = 1;
   1044  1.1  riastrad 		param->reg_AC1       = 0x32302A37;
   1045  1.1  riastrad 		param->reg_AC2       = 0xDF56B61F;
   1046  1.1  riastrad 		param->reg_DQSIC     = 0x0000014D;
   1047  1.1  riastrad 		param->reg_MRS       = 0x00101A50;
   1048  1.1  riastrad 		param->reg_EMRS      = 0x00000004;
   1049  1.1  riastrad 		param->reg_DRV       = 0x000000F5;
   1050  1.1  riastrad 		param->reg_IOZ       = 0x00000023;
   1051  1.1  riastrad 		param->reg_DQIDLY    = 0x00000078;
   1052  1.1  riastrad 		param->reg_FREQ      = 0x000058C0;
   1053  1.1  riastrad 		param->madj_max      = 132;
   1054  1.1  riastrad 		param->dll2_finetune_step = 3;
   1055  1.1  riastrad 		break;
   1056  1.1  riastrad 	case 624:
   1057  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E2020, 0x0160);
   1058  1.1  riastrad 		param->reg_MADJ      = 0x00136868;
   1059  1.1  riastrad 		param->reg_SADJ      = 0x00004534;
   1060  1.1  riastrad 		param->wodt          = 1;
   1061  1.1  riastrad 		param->rodt          = 1;
   1062  1.1  riastrad 		param->reg_AC1       = 0x32302A37;
   1063  1.1  riastrad 		param->reg_AC2       = 0xEF56B621;
   1064  1.1  riastrad 		param->reg_DQSIC     = 0x0000015A;
   1065  1.1  riastrad 		param->reg_MRS       = 0x02101A50;
   1066  1.1  riastrad 		param->reg_EMRS      = 0x00000004;
   1067  1.1  riastrad 		param->reg_DRV       = 0x000000F5;
   1068  1.1  riastrad 		param->reg_IOZ       = 0x00000034;
   1069  1.1  riastrad 		param->reg_DQIDLY    = 0x00000078;
   1070  1.1  riastrad 		param->reg_FREQ      = 0x000059C0;
   1071  1.1  riastrad 		param->madj_max      = 128;
   1072  1.1  riastrad 		param->dll2_finetune_step = 3;
   1073  1.1  riastrad 		break;
   1074  1.1  riastrad 	} /* switch freq */
   1075  1.1  riastrad 
   1076  1.1  riastrad 	switch (param->dram_chipid) {
   1077  1.1  riastrad 	case AST_DRAM_512Mx16:
   1078  1.1  riastrad 		param->dram_config = 0x130;
   1079  1.1  riastrad 		break;
   1080  1.1  riastrad 	default:
   1081  1.1  riastrad 	case AST_DRAM_1Gx16:
   1082  1.1  riastrad 		param->dram_config = 0x131;
   1083  1.1  riastrad 		break;
   1084  1.1  riastrad 	case AST_DRAM_2Gx16:
   1085  1.1  riastrad 		param->dram_config = 0x132;
   1086  1.1  riastrad 		break;
   1087  1.1  riastrad 	case AST_DRAM_4Gx16:
   1088  1.1  riastrad 		param->dram_config = 0x133;
   1089  1.1  riastrad 		break;
   1090  1.2  riastrad 	} /* switch size */
   1091  1.1  riastrad 
   1092  1.1  riastrad 	switch (param->vram_size) {
   1093  1.1  riastrad 	default:
   1094  1.1  riastrad 	case AST_VIDMEM_SIZE_8M:
   1095  1.1  riastrad 		param->dram_config |= 0x00;
   1096  1.1  riastrad 		break;
   1097  1.1  riastrad 	case AST_VIDMEM_SIZE_16M:
   1098  1.1  riastrad 		param->dram_config |= 0x04;
   1099  1.1  riastrad 		break;
   1100  1.1  riastrad 	case AST_VIDMEM_SIZE_32M:
   1101  1.1  riastrad 		param->dram_config |= 0x08;
   1102  1.1  riastrad 		break;
   1103  1.1  riastrad 	case AST_VIDMEM_SIZE_64M:
   1104  1.1  riastrad 		param->dram_config |= 0x0c;
   1105  1.1  riastrad 		break;
   1106  1.1  riastrad 	}
   1107  1.1  riastrad 
   1108  1.1  riastrad }
   1109  1.1  riastrad 
   1110  1.1  riastrad static void ddr3_init(struct ast_private *ast, struct ast2300_dram_param *param)
   1111  1.1  riastrad {
   1112  1.2  riastrad 	u32 data, data2, retry = 0;
   1113  1.1  riastrad 
   1114  1.2  riastrad ddr3_init_start:
   1115  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0000, 0xFC600309);
   1116  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0018, 0x00000100);
   1117  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0024, 0x00000000);
   1118  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0034, 0x00000000);
   1119  1.1  riastrad 	udelay(10);
   1120  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0064, param->reg_MADJ);
   1121  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0068, param->reg_SADJ);
   1122  1.1  riastrad 	udelay(10);
   1123  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0064, param->reg_MADJ | 0xC0000);
   1124  1.1  riastrad 	udelay(10);
   1125  1.1  riastrad 
   1126  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0004, param->dram_config);
   1127  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0008, 0x90040f);
   1128  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0010, param->reg_AC1);
   1129  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0014, param->reg_AC2);
   1130  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0020, param->reg_DQSIC);
   1131  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0080, 0x00000000);
   1132  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0084, 0x00000000);
   1133  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0088, param->reg_DQIDLY);
   1134  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0018, 0x4000A170);
   1135  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0018, 0x00002370);
   1136  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0038, 0x00000000);
   1137  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0040, 0xFF444444);
   1138  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0044, 0x22222222);
   1139  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0048, 0x22222222);
   1140  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E004C, 0x00000002);
   1141  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0050, 0x80000000);
   1142  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0050, 0x00000000);
   1143  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0054, 0);
   1144  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0060, param->reg_DRV);
   1145  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E006C, param->reg_IOZ);
   1146  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0070, 0x00000000);
   1147  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0074, 0x00000000);
   1148  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0078, 0x00000000);
   1149  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E007C, 0x00000000);
   1150  1.1  riastrad 	/* Wait MCLK2X lock to MCLK */
   1151  1.1  riastrad 	do {
   1152  1.2  riastrad 		data = ast_mindwm(ast, 0x1E6E001C);
   1153  1.1  riastrad 	} while (!(data & 0x08000000));
   1154  1.2  riastrad 	data = ast_mindwm(ast, 0x1E6E001C);
   1155  1.1  riastrad 	data = (data >> 8) & 0xff;
   1156  1.1  riastrad 	while ((data & 0x08) || ((data & 0x7) < 2) || (data < 4)) {
   1157  1.2  riastrad 		data2 = (ast_mindwm(ast, 0x1E6E0064) & 0xfff3ffff) + 4;
   1158  1.1  riastrad 		if ((data2 & 0xff) > param->madj_max) {
   1159  1.1  riastrad 			break;
   1160  1.1  riastrad 		}
   1161  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E0064, data2);
   1162  1.1  riastrad 		if (data2 & 0x00100000) {
   1163  1.1  riastrad 			data2 = ((data2 & 0xff) >> 3) + 3;
   1164  1.1  riastrad 		} else {
   1165  1.1  riastrad 			data2 = ((data2 & 0xff) >> 2) + 5;
   1166  1.1  riastrad 		}
   1167  1.2  riastrad 		data = ast_mindwm(ast, 0x1E6E0068) & 0xffff00ff;
   1168  1.1  riastrad 		data2 += data & 0xff;
   1169  1.1  riastrad 		data = data | (data2 << 8);
   1170  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E0068, data);
   1171  1.1  riastrad 		udelay(10);
   1172  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E0064, ast_mindwm(ast, 0x1E6E0064) | 0xC0000);
   1173  1.1  riastrad 		udelay(10);
   1174  1.2  riastrad 		data = ast_mindwm(ast, 0x1E6E0018) & 0xfffff1ff;
   1175  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E0018, data);
   1176  1.1  riastrad 		data = data | 0x200;
   1177  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E0018, data);
   1178  1.1  riastrad 		do {
   1179  1.2  riastrad 			data = ast_mindwm(ast, 0x1E6E001C);
   1180  1.1  riastrad 		} while (!(data & 0x08000000));
   1181  1.1  riastrad 
   1182  1.2  riastrad 		data = ast_mindwm(ast, 0x1E6E001C);
   1183  1.1  riastrad 		data = (data >> 8) & 0xff;
   1184  1.1  riastrad 	}
   1185  1.2  riastrad 	ast_moutdwm(ast, 0x1E720058, ast_mindwm(ast, 0x1E6E0068) & 0xffff);
   1186  1.2  riastrad 	data = ast_mindwm(ast, 0x1E6E0018) | 0xC00;
   1187  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0018, data);
   1188  1.1  riastrad 
   1189  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0034, 0x00000001);
   1190  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E000C, 0x00000040);
   1191  1.1  riastrad 	udelay(50);
   1192  1.1  riastrad 	/* Mode Register Setting */
   1193  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E002C, param->reg_MRS | 0x100);
   1194  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0030, param->reg_EMRS);
   1195  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0028, 0x00000005);
   1196  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0028, 0x00000007);
   1197  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0028, 0x00000003);
   1198  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0028, 0x00000001);
   1199  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E002C, param->reg_MRS);
   1200  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E000C, 0x00005C08);
   1201  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0028, 0x00000001);
   1202  1.1  riastrad 
   1203  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E000C, 0x00005C01);
   1204  1.1  riastrad 	data = 0;
   1205  1.1  riastrad 	if (param->wodt) {
   1206  1.1  riastrad 		data = 0x300;
   1207  1.1  riastrad 	}
   1208  1.1  riastrad 	if (param->rodt) {
   1209  1.1  riastrad 		data = data | 0x3000 | ((param->reg_AC2 & 0x60000) >> 3);
   1210  1.1  riastrad 	}
   1211  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0034, data | 0x3);
   1212  1.1  riastrad 
   1213  1.1  riastrad 	/* Calibrate the DQSI delay */
   1214  1.2  riastrad 	if ((cbr_dll2(ast, param) == false) && (retry++ < 10))
   1215  1.2  riastrad 		goto ddr3_init_start;
   1216  1.1  riastrad 
   1217  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0120, param->reg_FREQ);
   1218  1.1  riastrad 	/* ECC Memory Initialization */
   1219  1.1  riastrad #ifdef ECC
   1220  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E007C, 0x00000000);
   1221  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0070, 0x221);
   1222  1.1  riastrad 	do {
   1223  1.2  riastrad 		data = ast_mindwm(ast, 0x1E6E0070);
   1224  1.1  riastrad 	} while (!(data & 0x00001000));
   1225  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0070, 0x00000000);
   1226  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0050, 0x80000000);
   1227  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0050, 0x00000000);
   1228  1.1  riastrad #endif
   1229  1.1  riastrad 
   1230  1.1  riastrad 
   1231  1.1  riastrad }
   1232  1.1  riastrad 
   1233  1.1  riastrad static void get_ddr2_info(struct ast_private *ast, struct ast2300_dram_param *param)
   1234  1.1  riastrad {
   1235  1.1  riastrad 	u32 trap, trap_AC2, trap_MRS;
   1236  1.1  riastrad 
   1237  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E2000, 0x1688A8A8);
   1238  1.1  riastrad 
   1239  1.1  riastrad 	/* Ger trap info */
   1240  1.2  riastrad 	trap = (ast_mindwm(ast, 0x1E6E2070) >> 25) & 0x3;
   1241  1.1  riastrad 	trap_AC2  = (trap << 20) | (trap << 16);
   1242  1.1  riastrad 	trap_AC2 += 0x00110000;
   1243  1.1  riastrad 	trap_MRS  = 0x00000040 | (trap << 4);
   1244  1.1  riastrad 
   1245  1.1  riastrad 
   1246  1.1  riastrad 	param->reg_MADJ       = 0x00034C4C;
   1247  1.1  riastrad 	param->reg_SADJ       = 0x00001800;
   1248  1.1  riastrad 	param->reg_DRV        = 0x000000F0;
   1249  1.1  riastrad 	param->reg_PERIOD     = param->dram_freq;
   1250  1.1  riastrad 	param->rodt           = 0;
   1251  1.1  riastrad 
   1252  1.1  riastrad 	switch (param->dram_freq) {
   1253  1.1  riastrad 	case 264:
   1254  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E2020, 0x0130);
   1255  1.1  riastrad 		param->wodt          = 0;
   1256  1.1  riastrad 		param->reg_AC1       = 0x11101513;
   1257  1.1  riastrad 		param->reg_AC2       = 0x78117011;
   1258  1.1  riastrad 		param->reg_DQSIC     = 0x00000092;
   1259  1.1  riastrad 		param->reg_MRS       = 0x00000842;
   1260  1.1  riastrad 		param->reg_EMRS      = 0x00000000;
   1261  1.1  riastrad 		param->reg_DRV       = 0x000000F0;
   1262  1.1  riastrad 		param->reg_IOZ       = 0x00000034;
   1263  1.1  riastrad 		param->reg_DQIDLY    = 0x0000005A;
   1264  1.1  riastrad 		param->reg_FREQ      = 0x00004AC0;
   1265  1.1  riastrad 		param->madj_max      = 138;
   1266  1.1  riastrad 		param->dll2_finetune_step = 3;
   1267  1.1  riastrad 		break;
   1268  1.1  riastrad 	case 336:
   1269  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E2020, 0x0190);
   1270  1.1  riastrad 		param->wodt          = 1;
   1271  1.1  riastrad 		param->reg_AC1       = 0x22202613;
   1272  1.1  riastrad 		param->reg_AC2       = 0xAA009016 | trap_AC2;
   1273  1.1  riastrad 		param->reg_DQSIC     = 0x000000BA;
   1274  1.1  riastrad 		param->reg_MRS       = 0x00000A02 | trap_MRS;
   1275  1.1  riastrad 		param->reg_EMRS      = 0x00000040;
   1276  1.1  riastrad 		param->reg_DRV       = 0x000000FA;
   1277  1.1  riastrad 		param->reg_IOZ       = 0x00000034;
   1278  1.1  riastrad 		param->reg_DQIDLY    = 0x00000074;
   1279  1.1  riastrad 		param->reg_FREQ      = 0x00004DC0;
   1280  1.1  riastrad 		param->madj_max      = 96;
   1281  1.1  riastrad 		param->dll2_finetune_step = 3;
   1282  1.2  riastrad 		switch (param->dram_chipid) {
   1283  1.2  riastrad 		default:
   1284  1.2  riastrad 		case AST_DRAM_512Mx16:
   1285  1.2  riastrad 			param->reg_AC2   = 0xAA009012 | trap_AC2;
   1286  1.2  riastrad 			break;
   1287  1.2  riastrad 		case AST_DRAM_1Gx16:
   1288  1.2  riastrad 			param->reg_AC2   = 0xAA009016 | trap_AC2;
   1289  1.2  riastrad 			break;
   1290  1.2  riastrad 		case AST_DRAM_2Gx16:
   1291  1.2  riastrad 			param->reg_AC2   = 0xAA009023 | trap_AC2;
   1292  1.2  riastrad 			break;
   1293  1.2  riastrad 		case AST_DRAM_4Gx16:
   1294  1.2  riastrad 			param->reg_AC2   = 0xAA00903B | trap_AC2;
   1295  1.2  riastrad 			break;
   1296  1.2  riastrad 		}
   1297  1.1  riastrad 		break;
   1298  1.1  riastrad 	default:
   1299  1.1  riastrad 	case 396:
   1300  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E2020, 0x03F1);
   1301  1.1  riastrad 		param->wodt          = 1;
   1302  1.1  riastrad 		param->rodt          = 0;
   1303  1.1  riastrad 		param->reg_AC1       = 0x33302714;
   1304  1.1  riastrad 		param->reg_AC2       = 0xCC00B01B | trap_AC2;
   1305  1.1  riastrad 		param->reg_DQSIC     = 0x000000E2;
   1306  1.1  riastrad 		param->reg_MRS       = 0x00000C02 | trap_MRS;
   1307  1.1  riastrad 		param->reg_EMRS      = 0x00000040;
   1308  1.1  riastrad 		param->reg_DRV       = 0x000000FA;
   1309  1.1  riastrad 		param->reg_IOZ       = 0x00000034;
   1310  1.1  riastrad 		param->reg_DQIDLY    = 0x00000089;
   1311  1.2  riastrad 		param->reg_FREQ      = 0x00005040;
   1312  1.1  riastrad 		param->madj_max      = 96;
   1313  1.1  riastrad 		param->dll2_finetune_step = 4;
   1314  1.1  riastrad 
   1315  1.1  riastrad 		switch (param->dram_chipid) {
   1316  1.1  riastrad 		case AST_DRAM_512Mx16:
   1317  1.1  riastrad 			param->reg_AC2   = 0xCC00B016 | trap_AC2;
   1318  1.1  riastrad 			break;
   1319  1.1  riastrad 		default:
   1320  1.1  riastrad 		case AST_DRAM_1Gx16:
   1321  1.1  riastrad 			param->reg_AC2   = 0xCC00B01B | trap_AC2;
   1322  1.1  riastrad 			break;
   1323  1.1  riastrad 		case AST_DRAM_2Gx16:
   1324  1.1  riastrad 			param->reg_AC2   = 0xCC00B02B | trap_AC2;
   1325  1.1  riastrad 			break;
   1326  1.1  riastrad 		case AST_DRAM_4Gx16:
   1327  1.1  riastrad 			param->reg_AC2   = 0xCC00B03F | trap_AC2;
   1328  1.1  riastrad 			break;
   1329  1.1  riastrad 		}
   1330  1.1  riastrad 
   1331  1.1  riastrad 		break;
   1332  1.1  riastrad 
   1333  1.1  riastrad 	case 408:
   1334  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E2020, 0x01F0);
   1335  1.1  riastrad 		param->wodt          = 1;
   1336  1.1  riastrad 		param->rodt          = 0;
   1337  1.1  riastrad 		param->reg_AC1       = 0x33302714;
   1338  1.1  riastrad 		param->reg_AC2       = 0xCC00B01B | trap_AC2;
   1339  1.1  riastrad 		param->reg_DQSIC     = 0x000000E2;
   1340  1.1  riastrad 		param->reg_MRS       = 0x00000C02 | trap_MRS;
   1341  1.1  riastrad 		param->reg_EMRS      = 0x00000040;
   1342  1.1  riastrad 		param->reg_DRV       = 0x000000FA;
   1343  1.1  riastrad 		param->reg_IOZ       = 0x00000034;
   1344  1.1  riastrad 		param->reg_DQIDLY    = 0x00000089;
   1345  1.1  riastrad 		param->reg_FREQ      = 0x000050C0;
   1346  1.1  riastrad 		param->madj_max      = 96;
   1347  1.1  riastrad 		param->dll2_finetune_step = 4;
   1348  1.1  riastrad 
   1349  1.1  riastrad 		switch (param->dram_chipid) {
   1350  1.1  riastrad 		case AST_DRAM_512Mx16:
   1351  1.1  riastrad 			param->reg_AC2   = 0xCC00B016 | trap_AC2;
   1352  1.1  riastrad 			break;
   1353  1.1  riastrad 		default:
   1354  1.1  riastrad 		case AST_DRAM_1Gx16:
   1355  1.1  riastrad 			param->reg_AC2   = 0xCC00B01B | trap_AC2;
   1356  1.1  riastrad 			break;
   1357  1.1  riastrad 		case AST_DRAM_2Gx16:
   1358  1.1  riastrad 			param->reg_AC2   = 0xCC00B02B | trap_AC2;
   1359  1.1  riastrad 			break;
   1360  1.1  riastrad 		case AST_DRAM_4Gx16:
   1361  1.1  riastrad 			param->reg_AC2   = 0xCC00B03F | trap_AC2;
   1362  1.1  riastrad 			break;
   1363  1.1  riastrad 		}
   1364  1.1  riastrad 
   1365  1.1  riastrad 		break;
   1366  1.1  riastrad 	case 456:
   1367  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E2020, 0x0230);
   1368  1.1  riastrad 		param->wodt          = 0;
   1369  1.1  riastrad 		param->reg_AC1       = 0x33302815;
   1370  1.1  riastrad 		param->reg_AC2       = 0xCD44B01E;
   1371  1.1  riastrad 		param->reg_DQSIC     = 0x000000FC;
   1372  1.1  riastrad 		param->reg_MRS       = 0x00000E72;
   1373  1.1  riastrad 		param->reg_EMRS      = 0x00000000;
   1374  1.1  riastrad 		param->reg_DRV       = 0x00000000;
   1375  1.1  riastrad 		param->reg_IOZ       = 0x00000034;
   1376  1.1  riastrad 		param->reg_DQIDLY    = 0x00000097;
   1377  1.1  riastrad 		param->reg_FREQ      = 0x000052C0;
   1378  1.1  riastrad 		param->madj_max      = 88;
   1379  1.1  riastrad 		param->dll2_finetune_step = 3;
   1380  1.1  riastrad 		break;
   1381  1.1  riastrad 	case 504:
   1382  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E2020, 0x0261);
   1383  1.1  riastrad 		param->wodt          = 1;
   1384  1.1  riastrad 		param->rodt          = 1;
   1385  1.1  riastrad 		param->reg_AC1       = 0x33302815;
   1386  1.1  riastrad 		param->reg_AC2       = 0xDE44C022;
   1387  1.1  riastrad 		param->reg_DQSIC     = 0x00000117;
   1388  1.1  riastrad 		param->reg_MRS       = 0x00000E72;
   1389  1.1  riastrad 		param->reg_EMRS      = 0x00000040;
   1390  1.1  riastrad 		param->reg_DRV       = 0x0000000A;
   1391  1.1  riastrad 		param->reg_IOZ       = 0x00000045;
   1392  1.1  riastrad 		param->reg_DQIDLY    = 0x000000A0;
   1393  1.1  riastrad 		param->reg_FREQ      = 0x000054C0;
   1394  1.1  riastrad 		param->madj_max      = 79;
   1395  1.1  riastrad 		param->dll2_finetune_step = 3;
   1396  1.1  riastrad 		break;
   1397  1.1  riastrad 	case 528:
   1398  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E2020, 0x0120);
   1399  1.1  riastrad 		param->wodt          = 1;
   1400  1.1  riastrad 		param->rodt          = 1;
   1401  1.1  riastrad 		param->reg_AC1       = 0x33302815;
   1402  1.1  riastrad 		param->reg_AC2       = 0xEF44D024;
   1403  1.1  riastrad 		param->reg_DQSIC     = 0x00000125;
   1404  1.1  riastrad 		param->reg_MRS       = 0x00000E72;
   1405  1.1  riastrad 		param->reg_EMRS      = 0x00000004;
   1406  1.1  riastrad 		param->reg_DRV       = 0x000000F9;
   1407  1.1  riastrad 		param->reg_IOZ       = 0x00000045;
   1408  1.1  riastrad 		param->reg_DQIDLY    = 0x000000A7;
   1409  1.1  riastrad 		param->reg_FREQ      = 0x000055C0;
   1410  1.1  riastrad 		param->madj_max      = 76;
   1411  1.1  riastrad 		param->dll2_finetune_step = 3;
   1412  1.1  riastrad 		break;
   1413  1.1  riastrad 	case 552:
   1414  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E2020, 0x02A1);
   1415  1.1  riastrad 		param->wodt          = 1;
   1416  1.1  riastrad 		param->rodt          = 1;
   1417  1.1  riastrad 		param->reg_AC1       = 0x43402915;
   1418  1.1  riastrad 		param->reg_AC2       = 0xFF44E025;
   1419  1.1  riastrad 		param->reg_DQSIC     = 0x00000132;
   1420  1.1  riastrad 		param->reg_MRS       = 0x00000E72;
   1421  1.1  riastrad 		param->reg_EMRS      = 0x00000040;
   1422  1.1  riastrad 		param->reg_DRV       = 0x0000000A;
   1423  1.1  riastrad 		param->reg_IOZ       = 0x00000045;
   1424  1.1  riastrad 		param->reg_DQIDLY    = 0x000000AD;
   1425  1.1  riastrad 		param->reg_FREQ      = 0x000056C0;
   1426  1.1  riastrad 		param->madj_max      = 76;
   1427  1.1  riastrad 		param->dll2_finetune_step = 3;
   1428  1.1  riastrad 		break;
   1429  1.1  riastrad 	case 576:
   1430  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E2020, 0x0140);
   1431  1.1  riastrad 		param->wodt          = 1;
   1432  1.1  riastrad 		param->rodt          = 1;
   1433  1.1  riastrad 		param->reg_AC1       = 0x43402915;
   1434  1.1  riastrad 		param->reg_AC2       = 0xFF44E027;
   1435  1.1  riastrad 		param->reg_DQSIC     = 0x0000013F;
   1436  1.1  riastrad 		param->reg_MRS       = 0x00000E72;
   1437  1.1  riastrad 		param->reg_EMRS      = 0x00000004;
   1438  1.1  riastrad 		param->reg_DRV       = 0x000000F5;
   1439  1.1  riastrad 		param->reg_IOZ       = 0x00000045;
   1440  1.1  riastrad 		param->reg_DQIDLY    = 0x000000B3;
   1441  1.1  riastrad 		param->reg_FREQ      = 0x000057C0;
   1442  1.1  riastrad 		param->madj_max      = 76;
   1443  1.1  riastrad 		param->dll2_finetune_step = 3;
   1444  1.1  riastrad 		break;
   1445  1.1  riastrad 	}
   1446  1.1  riastrad 
   1447  1.1  riastrad 	switch (param->dram_chipid) {
   1448  1.1  riastrad 	case AST_DRAM_512Mx16:
   1449  1.1  riastrad 		param->dram_config = 0x100;
   1450  1.1  riastrad 		break;
   1451  1.1  riastrad 	default:
   1452  1.1  riastrad 	case AST_DRAM_1Gx16:
   1453  1.1  riastrad 		param->dram_config = 0x121;
   1454  1.1  riastrad 		break;
   1455  1.1  riastrad 	case AST_DRAM_2Gx16:
   1456  1.1  riastrad 		param->dram_config = 0x122;
   1457  1.1  riastrad 		break;
   1458  1.1  riastrad 	case AST_DRAM_4Gx16:
   1459  1.1  riastrad 		param->dram_config = 0x123;
   1460  1.1  riastrad 		break;
   1461  1.2  riastrad 	} /* switch size */
   1462  1.1  riastrad 
   1463  1.1  riastrad 	switch (param->vram_size) {
   1464  1.1  riastrad 	default:
   1465  1.1  riastrad 	case AST_VIDMEM_SIZE_8M:
   1466  1.1  riastrad 		param->dram_config |= 0x00;
   1467  1.1  riastrad 		break;
   1468  1.1  riastrad 	case AST_VIDMEM_SIZE_16M:
   1469  1.1  riastrad 		param->dram_config |= 0x04;
   1470  1.1  riastrad 		break;
   1471  1.1  riastrad 	case AST_VIDMEM_SIZE_32M:
   1472  1.1  riastrad 		param->dram_config |= 0x08;
   1473  1.1  riastrad 		break;
   1474  1.1  riastrad 	case AST_VIDMEM_SIZE_64M:
   1475  1.1  riastrad 		param->dram_config |= 0x0c;
   1476  1.1  riastrad 		break;
   1477  1.1  riastrad 	}
   1478  1.1  riastrad }
   1479  1.1  riastrad 
   1480  1.1  riastrad static void ddr2_init(struct ast_private *ast, struct ast2300_dram_param *param)
   1481  1.1  riastrad {
   1482  1.2  riastrad 	u32 data, data2, retry = 0;
   1483  1.1  riastrad 
   1484  1.2  riastrad ddr2_init_start:
   1485  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0000, 0xFC600309);
   1486  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0018, 0x00000100);
   1487  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0024, 0x00000000);
   1488  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0064, param->reg_MADJ);
   1489  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0068, param->reg_SADJ);
   1490  1.1  riastrad 	udelay(10);
   1491  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0064, param->reg_MADJ | 0xC0000);
   1492  1.1  riastrad 	udelay(10);
   1493  1.1  riastrad 
   1494  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0004, param->dram_config);
   1495  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0008, 0x90040f);
   1496  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0010, param->reg_AC1);
   1497  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0014, param->reg_AC2);
   1498  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0020, param->reg_DQSIC);
   1499  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0080, 0x00000000);
   1500  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0084, 0x00000000);
   1501  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0088, param->reg_DQIDLY);
   1502  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0018, 0x4000A130);
   1503  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0018, 0x00002330);
   1504  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0038, 0x00000000);
   1505  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0040, 0xFF808000);
   1506  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0044, 0x88848466);
   1507  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0048, 0x44440008);
   1508  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E004C, 0x00000000);
   1509  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0050, 0x80000000);
   1510  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0050, 0x00000000);
   1511  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0054, 0);
   1512  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0060, param->reg_DRV);
   1513  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E006C, param->reg_IOZ);
   1514  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0070, 0x00000000);
   1515  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0074, 0x00000000);
   1516  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0078, 0x00000000);
   1517  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E007C, 0x00000000);
   1518  1.1  riastrad 
   1519  1.1  riastrad 	/* Wait MCLK2X lock to MCLK */
   1520  1.1  riastrad 	do {
   1521  1.2  riastrad 		data = ast_mindwm(ast, 0x1E6E001C);
   1522  1.1  riastrad 	} while (!(data & 0x08000000));
   1523  1.2  riastrad 	data = ast_mindwm(ast, 0x1E6E001C);
   1524  1.1  riastrad 	data = (data >> 8) & 0xff;
   1525  1.1  riastrad 	while ((data & 0x08) || ((data & 0x7) < 2) || (data < 4)) {
   1526  1.2  riastrad 		data2 = (ast_mindwm(ast, 0x1E6E0064) & 0xfff3ffff) + 4;
   1527  1.1  riastrad 		if ((data2 & 0xff) > param->madj_max) {
   1528  1.1  riastrad 			break;
   1529  1.1  riastrad 		}
   1530  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E0064, data2);
   1531  1.1  riastrad 		if (data2 & 0x00100000) {
   1532  1.1  riastrad 			data2 = ((data2 & 0xff) >> 3) + 3;
   1533  1.1  riastrad 		} else {
   1534  1.1  riastrad 			data2 = ((data2 & 0xff) >> 2) + 5;
   1535  1.1  riastrad 		}
   1536  1.2  riastrad 		data = ast_mindwm(ast, 0x1E6E0068) & 0xffff00ff;
   1537  1.1  riastrad 		data2 += data & 0xff;
   1538  1.1  riastrad 		data = data | (data2 << 8);
   1539  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E0068, data);
   1540  1.1  riastrad 		udelay(10);
   1541  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E0064, ast_mindwm(ast, 0x1E6E0064) | 0xC0000);
   1542  1.1  riastrad 		udelay(10);
   1543  1.2  riastrad 		data = ast_mindwm(ast, 0x1E6E0018) & 0xfffff1ff;
   1544  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E0018, data);
   1545  1.1  riastrad 		data = data | 0x200;
   1546  1.2  riastrad 		ast_moutdwm(ast, 0x1E6E0018, data);
   1547  1.1  riastrad 		do {
   1548  1.2  riastrad 			data = ast_mindwm(ast, 0x1E6E001C);
   1549  1.1  riastrad 		} while (!(data & 0x08000000));
   1550  1.1  riastrad 
   1551  1.2  riastrad 		data = ast_mindwm(ast, 0x1E6E001C);
   1552  1.1  riastrad 		data = (data >> 8) & 0xff;
   1553  1.1  riastrad 	}
   1554  1.2  riastrad 	ast_moutdwm(ast, 0x1E720058, ast_mindwm(ast, 0x1E6E0008) & 0xffff);
   1555  1.2  riastrad 	data = ast_mindwm(ast, 0x1E6E0018) | 0xC00;
   1556  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0018, data);
   1557  1.1  riastrad 
   1558  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0034, 0x00000001);
   1559  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E000C, 0x00000000);
   1560  1.1  riastrad 	udelay(50);
   1561  1.1  riastrad 	/* Mode Register Setting */
   1562  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E002C, param->reg_MRS | 0x100);
   1563  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0030, param->reg_EMRS);
   1564  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0028, 0x00000005);
   1565  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0028, 0x00000007);
   1566  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0028, 0x00000003);
   1567  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0028, 0x00000001);
   1568  1.2  riastrad 
   1569  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E000C, 0x00005C08);
   1570  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E002C, param->reg_MRS);
   1571  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0028, 0x00000001);
   1572  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0030, param->reg_EMRS | 0x380);
   1573  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0028, 0x00000003);
   1574  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0030, param->reg_EMRS);
   1575  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0028, 0x00000003);
   1576  1.1  riastrad 
   1577  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E000C, 0x7FFF5C01);
   1578  1.1  riastrad 	data = 0;
   1579  1.1  riastrad 	if (param->wodt) {
   1580  1.1  riastrad 		data = 0x500;
   1581  1.1  riastrad 	}
   1582  1.1  riastrad 	if (param->rodt) {
   1583  1.1  riastrad 		data = data | 0x3000 | ((param->reg_AC2 & 0x60000) >> 3);
   1584  1.1  riastrad 	}
   1585  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0034, data | 0x3);
   1586  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0120, param->reg_FREQ);
   1587  1.1  riastrad 
   1588  1.1  riastrad 	/* Calibrate the DQSI delay */
   1589  1.2  riastrad 	if ((cbr_dll2(ast, param) == false) && (retry++ < 10))
   1590  1.2  riastrad 		goto ddr2_init_start;
   1591  1.1  riastrad 
   1592  1.1  riastrad 	/* ECC Memory Initialization */
   1593  1.1  riastrad #ifdef ECC
   1594  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E007C, 0x00000000);
   1595  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0070, 0x221);
   1596  1.1  riastrad 	do {
   1597  1.2  riastrad 		data = ast_mindwm(ast, 0x1E6E0070);
   1598  1.1  riastrad 	} while (!(data & 0x00001000));
   1599  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0070, 0x00000000);
   1600  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0050, 0x80000000);
   1601  1.2  riastrad 	ast_moutdwm(ast, 0x1E6E0050, 0x00000000);
   1602  1.1  riastrad #endif
   1603  1.1  riastrad 
   1604  1.1  riastrad }
   1605  1.1  riastrad 
   1606  1.3  riastrad static void ast_post_chip_2300(struct drm_device *dev)
   1607  1.1  riastrad {
   1608  1.1  riastrad 	struct ast_private *ast = dev->dev_private;
   1609  1.1  riastrad 	struct ast2300_dram_param param;
   1610  1.1  riastrad 	u32 temp;
   1611  1.1  riastrad 	u8 reg;
   1612  1.1  riastrad 
   1613  1.1  riastrad 	reg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xd0, 0xff);
   1614  1.1  riastrad 	if ((reg & 0x80) == 0) {/* vga only */
   1615  1.1  riastrad 		ast_write32(ast, 0xf004, 0x1e6e0000);
   1616  1.1  riastrad 		ast_write32(ast, 0xf000, 0x1);
   1617  1.1  riastrad 		ast_write32(ast, 0x12000, 0x1688a8a8);
   1618  1.1  riastrad 		do {
   1619  1.1  riastrad 			;
   1620  1.1  riastrad 		} while (ast_read32(ast, 0x12000) != 0x1);
   1621  1.1  riastrad 
   1622  1.1  riastrad 		ast_write32(ast, 0x10000, 0xfc600309);
   1623  1.1  riastrad 		do {
   1624  1.1  riastrad 			;
   1625  1.1  riastrad 		} while (ast_read32(ast, 0x10000) != 0x1);
   1626  1.1  riastrad 
   1627  1.1  riastrad 		/* Slow down CPU/AHB CLK in VGA only mode */
   1628  1.1  riastrad 		temp = ast_read32(ast, 0x12008);
   1629  1.1  riastrad 		temp |= 0x73;
   1630  1.1  riastrad 		ast_write32(ast, 0x12008, temp);
   1631  1.1  riastrad 
   1632  1.2  riastrad 		param.dram_freq = 396;
   1633  1.1  riastrad 		param.dram_type = AST_DDR3;
   1634  1.2  riastrad 		temp = ast_mindwm(ast, 0x1e6e2070);
   1635  1.1  riastrad 		if (temp & 0x01000000)
   1636  1.1  riastrad 			param.dram_type = AST_DDR2;
   1637  1.2  riastrad                 switch (temp & 0x18000000) {
   1638  1.2  riastrad 		case 0:
   1639  1.2  riastrad 			param.dram_chipid = AST_DRAM_512Mx16;
   1640  1.2  riastrad 			break;
   1641  1.2  riastrad 		default:
   1642  1.2  riastrad 		case 0x08000000:
   1643  1.2  riastrad 			param.dram_chipid = AST_DRAM_1Gx16;
   1644  1.2  riastrad 			break;
   1645  1.2  riastrad 		case 0x10000000:
   1646  1.2  riastrad 			param.dram_chipid = AST_DRAM_2Gx16;
   1647  1.2  riastrad 			break;
   1648  1.2  riastrad 		case 0x18000000:
   1649  1.2  riastrad 			param.dram_chipid = AST_DRAM_4Gx16;
   1650  1.2  riastrad 			break;
   1651  1.2  riastrad 		}
   1652  1.2  riastrad                 switch (temp & 0x0c) {
   1653  1.2  riastrad                 default:
   1654  1.2  riastrad 		case 0x00:
   1655  1.2  riastrad 			param.vram_size = AST_VIDMEM_SIZE_8M;
   1656  1.2  riastrad 			break;
   1657  1.2  riastrad 
   1658  1.2  riastrad 		case 0x04:
   1659  1.2  riastrad 			param.vram_size = AST_VIDMEM_SIZE_16M;
   1660  1.2  riastrad 			break;
   1661  1.2  riastrad 
   1662  1.2  riastrad 		case 0x08:
   1663  1.2  riastrad 			param.vram_size = AST_VIDMEM_SIZE_32M;
   1664  1.2  riastrad 			break;
   1665  1.2  riastrad 
   1666  1.2  riastrad 		case 0x0c:
   1667  1.2  riastrad 			param.vram_size = AST_VIDMEM_SIZE_64M;
   1668  1.2  riastrad 			break;
   1669  1.2  riastrad 		}
   1670  1.1  riastrad 
   1671  1.1  riastrad 		if (param.dram_type == AST_DDR3) {
   1672  1.1  riastrad 			get_ddr3_info(ast, &param);
   1673  1.1  riastrad 			ddr3_init(ast, &param);
   1674  1.1  riastrad 		} else {
   1675  1.1  riastrad 			get_ddr2_info(ast, &param);
   1676  1.1  riastrad 			ddr2_init(ast, &param);
   1677  1.1  riastrad 		}
   1678  1.1  riastrad 
   1679  1.2  riastrad 		temp = ast_mindwm(ast, 0x1e6e2040);
   1680  1.2  riastrad 		ast_moutdwm(ast, 0x1e6e2040, temp | 0x40);
   1681  1.1  riastrad 	}
   1682  1.1  riastrad 
   1683  1.1  riastrad 	/* wait ready */
   1684  1.1  riastrad 	do {
   1685  1.1  riastrad 		reg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xd0, 0xff);
   1686  1.1  riastrad 	} while ((reg & 0x40) == 0);
   1687  1.1  riastrad }
   1688  1.1  riastrad 
   1689  1.3  riastrad static bool cbr_test_2500(struct ast_private *ast)
   1690  1.3  riastrad {
   1691  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0074, 0x0000FFFF);
   1692  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E007C, 0xFF00FF00);
   1693  1.3  riastrad 	if (!mmc_test_burst(ast, 0))
   1694  1.3  riastrad 		return false;
   1695  1.3  riastrad 	if (!mmc_test_single_2500(ast, 0))
   1696  1.3  riastrad 		return false;
   1697  1.3  riastrad 	return true;
   1698  1.3  riastrad }
   1699  1.3  riastrad 
   1700  1.3  riastrad static bool ddr_test_2500(struct ast_private *ast)
   1701  1.3  riastrad {
   1702  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0074, 0x0000FFFF);
   1703  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E007C, 0xFF00FF00);
   1704  1.3  riastrad 	if (!mmc_test_burst(ast, 0))
   1705  1.3  riastrad 		return false;
   1706  1.3  riastrad 	if (!mmc_test_burst(ast, 1))
   1707  1.3  riastrad 		return false;
   1708  1.3  riastrad 	if (!mmc_test_burst(ast, 2))
   1709  1.3  riastrad 		return false;
   1710  1.3  riastrad 	if (!mmc_test_burst(ast, 3))
   1711  1.3  riastrad 		return false;
   1712  1.3  riastrad 	if (!mmc_test_single_2500(ast, 0))
   1713  1.3  riastrad 		return false;
   1714  1.3  riastrad 	return true;
   1715  1.3  riastrad }
   1716  1.3  riastrad 
   1717  1.3  riastrad static void ddr_init_common_2500(struct ast_private *ast)
   1718  1.3  riastrad {
   1719  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0034, 0x00020080);
   1720  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0008, 0x2003000F);
   1721  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0038, 0x00000FFF);
   1722  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0040, 0x88448844);
   1723  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0044, 0x24422288);
   1724  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0048, 0x22222222);
   1725  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E004C, 0x22222222);
   1726  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0050, 0x80000000);
   1727  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0208, 0x00000000);
   1728  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0218, 0x00000000);
   1729  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0220, 0x00000000);
   1730  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0228, 0x00000000);
   1731  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0230, 0x00000000);
   1732  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E02A8, 0x00000000);
   1733  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E02B0, 0x00000000);
   1734  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0240, 0x86000000);
   1735  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0244, 0x00008600);
   1736  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0248, 0x80000000);
   1737  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E024C, 0x80808080);
   1738  1.3  riastrad }
   1739  1.3  riastrad 
   1740  1.3  riastrad static void ddr_phy_init_2500(struct ast_private *ast)
   1741  1.3  riastrad {
   1742  1.3  riastrad 	u32 data, pass, timecnt;
   1743  1.3  riastrad 
   1744  1.3  riastrad 	pass = 0;
   1745  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0060, 0x00000005);
   1746  1.3  riastrad 	while (!pass) {
   1747  1.3  riastrad 		for (timecnt = 0; timecnt < TIMEOUT; timecnt++) {
   1748  1.3  riastrad 			data = ast_mindwm(ast, 0x1E6E0060) & 0x1;
   1749  1.3  riastrad 			if (!data)
   1750  1.3  riastrad 				break;
   1751  1.3  riastrad 		}
   1752  1.3  riastrad 		if (timecnt != TIMEOUT) {
   1753  1.3  riastrad 			data = ast_mindwm(ast, 0x1E6E0300) & 0x000A0000;
   1754  1.3  riastrad 			if (!data)
   1755  1.3  riastrad 				pass = 1;
   1756  1.3  riastrad 		}
   1757  1.3  riastrad 		if (!pass) {
   1758  1.3  riastrad 			ast_moutdwm(ast, 0x1E6E0060, 0x00000000);
   1759  1.3  riastrad 			udelay(10); /* delay 10 us */
   1760  1.3  riastrad 			ast_moutdwm(ast, 0x1E6E0060, 0x00000005);
   1761  1.3  riastrad 		}
   1762  1.3  riastrad 	}
   1763  1.3  riastrad 
   1764  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0060, 0x00000006);
   1765  1.3  riastrad }
   1766  1.3  riastrad 
   1767  1.3  riastrad /*
   1768  1.3  riastrad  * Check DRAM Size
   1769  1.3  riastrad  * 1Gb : 0x80000000 ~ 0x87FFFFFF
   1770  1.3  riastrad  * 2Gb : 0x80000000 ~ 0x8FFFFFFF
   1771  1.3  riastrad  * 4Gb : 0x80000000 ~ 0x9FFFFFFF
   1772  1.3  riastrad  * 8Gb : 0x80000000 ~ 0xBFFFFFFF
   1773  1.3  riastrad  */
   1774  1.3  riastrad static void check_dram_size_2500(struct ast_private *ast, u32 tRFC)
   1775  1.3  riastrad {
   1776  1.3  riastrad 	u32 reg_04, reg_14;
   1777  1.3  riastrad 
   1778  1.3  riastrad 	reg_04 = ast_mindwm(ast, 0x1E6E0004) & 0xfffffffc;
   1779  1.3  riastrad 	reg_14 = ast_mindwm(ast, 0x1E6E0014) & 0xffffff00;
   1780  1.3  riastrad 
   1781  1.3  riastrad 	ast_moutdwm(ast, 0xA0100000, 0x41424344);
   1782  1.3  riastrad 	ast_moutdwm(ast, 0x90100000, 0x35363738);
   1783  1.3  riastrad 	ast_moutdwm(ast, 0x88100000, 0x292A2B2C);
   1784  1.3  riastrad 	ast_moutdwm(ast, 0x80100000, 0x1D1E1F10);
   1785  1.3  riastrad 
   1786  1.3  riastrad 	/* Check 8Gbit */
   1787  1.3  riastrad 	if (ast_mindwm(ast, 0xA0100000) == 0x41424344) {
   1788  1.3  riastrad 		reg_04 |= 0x03;
   1789  1.3  riastrad 		reg_14 |= (tRFC >> 24) & 0xFF;
   1790  1.3  riastrad 		/* Check 4Gbit */
   1791  1.3  riastrad 	} else if (ast_mindwm(ast, 0x90100000) == 0x35363738) {
   1792  1.3  riastrad 		reg_04 |= 0x02;
   1793  1.3  riastrad 		reg_14 |= (tRFC >> 16) & 0xFF;
   1794  1.3  riastrad 		/* Check 2Gbit */
   1795  1.3  riastrad 	} else if (ast_mindwm(ast, 0x88100000) == 0x292A2B2C) {
   1796  1.3  riastrad 		reg_04 |= 0x01;
   1797  1.3  riastrad 		reg_14 |= (tRFC >> 8) & 0xFF;
   1798  1.3  riastrad 	} else {
   1799  1.3  riastrad 		reg_14 |= tRFC & 0xFF;
   1800  1.3  riastrad 	}
   1801  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0004, reg_04);
   1802  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0014, reg_14);
   1803  1.3  riastrad }
   1804  1.3  riastrad 
   1805  1.3  riastrad static void enable_cache_2500(struct ast_private *ast)
   1806  1.3  riastrad {
   1807  1.3  riastrad 	u32 reg_04, data;
   1808  1.3  riastrad 
   1809  1.3  riastrad 	reg_04 = ast_mindwm(ast, 0x1E6E0004);
   1810  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0004, reg_04 | 0x1000);
   1811  1.3  riastrad 
   1812  1.3  riastrad 	do
   1813  1.3  riastrad 		data = ast_mindwm(ast, 0x1E6E0004);
   1814  1.3  riastrad 	while (!(data & 0x80000));
   1815  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0004, reg_04 | 0x400);
   1816  1.3  riastrad }
   1817  1.3  riastrad 
   1818  1.3  riastrad static void set_mpll_2500(struct ast_private *ast)
   1819  1.3  riastrad {
   1820  1.3  riastrad 	u32 addr, data, param;
   1821  1.3  riastrad 
   1822  1.3  riastrad 	/* Reset MMC */
   1823  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0000, 0xFC600309);
   1824  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0034, 0x00020080);
   1825  1.3  riastrad 	for (addr = 0x1e6e0004; addr < 0x1e6e0090;) {
   1826  1.3  riastrad 		ast_moutdwm(ast, addr, 0x0);
   1827  1.3  riastrad 		addr += 4;
   1828  1.3  riastrad 	}
   1829  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0034, 0x00020000);
   1830  1.3  riastrad 
   1831  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E2000, 0x1688A8A8);
   1832  1.3  riastrad 	data = ast_mindwm(ast, 0x1E6E2070) & 0x00800000;
   1833  1.3  riastrad 	if (data) {
   1834  1.3  riastrad 		/* CLKIN = 25MHz */
   1835  1.3  riastrad 		param = 0x930023E0;
   1836  1.3  riastrad 		ast_moutdwm(ast, 0x1E6E2160, 0x00011320);
   1837  1.3  riastrad 	} else {
   1838  1.3  riastrad 		/* CLKIN = 24MHz */
   1839  1.3  riastrad 		param = 0x93002400;
   1840  1.3  riastrad 	}
   1841  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E2020, param);
   1842  1.3  riastrad 	udelay(100);
   1843  1.3  riastrad }
   1844  1.3  riastrad 
   1845  1.3  riastrad static void reset_mmc_2500(struct ast_private *ast)
   1846  1.3  riastrad {
   1847  1.3  riastrad 	ast_moutdwm(ast, 0x1E78505C, 0x00000004);
   1848  1.3  riastrad 	ast_moutdwm(ast, 0x1E785044, 0x00000001);
   1849  1.3  riastrad 	ast_moutdwm(ast, 0x1E785048, 0x00004755);
   1850  1.3  riastrad 	ast_moutdwm(ast, 0x1E78504C, 0x00000013);
   1851  1.3  riastrad 	mdelay(100);
   1852  1.3  riastrad 	ast_moutdwm(ast, 0x1E785054, 0x00000077);
   1853  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0000, 0xFC600309);
   1854  1.3  riastrad }
   1855  1.3  riastrad 
   1856  1.3  riastrad static void ddr3_init_2500(struct ast_private *ast, const u32 *ddr_table)
   1857  1.3  riastrad {
   1858  1.3  riastrad 
   1859  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0004, 0x00000303);
   1860  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0010, ddr_table[REGIDX_010]);
   1861  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0014, ddr_table[REGIDX_014]);
   1862  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0018, ddr_table[REGIDX_018]);
   1863  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0020, ddr_table[REGIDX_020]);	     /* MODEREG4/6 */
   1864  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0024, ddr_table[REGIDX_024]);	     /* MODEREG5 */
   1865  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E002C, ddr_table[REGIDX_02C] | 0x100); /* MODEREG0/2 */
   1866  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0030, ddr_table[REGIDX_030]);	     /* MODEREG1/3 */
   1867  1.3  riastrad 
   1868  1.3  riastrad 	/* DDR PHY Setting */
   1869  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0200, 0x02492AAE);
   1870  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0204, 0x00001001);
   1871  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E020C, 0x55E00B0B);
   1872  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0210, 0x20000000);
   1873  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0214, ddr_table[REGIDX_214]);
   1874  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E02E0, ddr_table[REGIDX_2E0]);
   1875  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E02E4, ddr_table[REGIDX_2E4]);
   1876  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E02E8, ddr_table[REGIDX_2E8]);
   1877  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E02EC, ddr_table[REGIDX_2EC]);
   1878  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E02F0, ddr_table[REGIDX_2F0]);
   1879  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E02F4, ddr_table[REGIDX_2F4]);
   1880  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E02F8, ddr_table[REGIDX_2F8]);
   1881  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0290, 0x00100008);
   1882  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E02C0, 0x00000006);
   1883  1.3  riastrad 
   1884  1.3  riastrad 	/* Controller Setting */
   1885  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0034, 0x00020091);
   1886  1.3  riastrad 
   1887  1.3  riastrad 	/* Wait DDR PHY init done */
   1888  1.3  riastrad 	ddr_phy_init_2500(ast);
   1889  1.3  riastrad 
   1890  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0120, ddr_table[REGIDX_PLL]);
   1891  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E000C, 0x42AA5C81);
   1892  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0034, 0x0001AF93);
   1893  1.3  riastrad 
   1894  1.3  riastrad 	check_dram_size_2500(ast, ddr_table[REGIDX_RFC]);
   1895  1.3  riastrad 	enable_cache_2500(ast);
   1896  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E001C, 0x00000008);
   1897  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0038, 0xFFFFFF00);
   1898  1.3  riastrad }
   1899  1.3  riastrad 
   1900  1.3  riastrad static void ddr4_init_2500(struct ast_private *ast, const u32 *ddr_table)
   1901  1.3  riastrad {
   1902  1.3  riastrad 	u32 data, data2, pass, retrycnt;
   1903  1.3  riastrad 	u32 ddr_vref, phy_vref;
   1904  1.3  riastrad 	u32 min_ddr_vref = 0, min_phy_vref = 0;
   1905  1.3  riastrad 	u32 max_ddr_vref = 0, max_phy_vref = 0;
   1906  1.3  riastrad 
   1907  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0004, 0x00000313);
   1908  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0010, ddr_table[REGIDX_010]);
   1909  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0014, ddr_table[REGIDX_014]);
   1910  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0018, ddr_table[REGIDX_018]);
   1911  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0020, ddr_table[REGIDX_020]);	     /* MODEREG4/6 */
   1912  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0024, ddr_table[REGIDX_024]);	     /* MODEREG5 */
   1913  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E002C, ddr_table[REGIDX_02C] | 0x100); /* MODEREG0/2 */
   1914  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0030, ddr_table[REGIDX_030]);	     /* MODEREG1/3 */
   1915  1.3  riastrad 
   1916  1.3  riastrad 	/* DDR PHY Setting */
   1917  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0200, 0x42492AAE);
   1918  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0204, 0x09002000);
   1919  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E020C, 0x55E00B0B);
   1920  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0210, 0x20000000);
   1921  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0214, ddr_table[REGIDX_214]);
   1922  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E02E0, ddr_table[REGIDX_2E0]);
   1923  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E02E4, ddr_table[REGIDX_2E4]);
   1924  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E02E8, ddr_table[REGIDX_2E8]);
   1925  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E02EC, ddr_table[REGIDX_2EC]);
   1926  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E02F0, ddr_table[REGIDX_2F0]);
   1927  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E02F4, ddr_table[REGIDX_2F4]);
   1928  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E02F8, ddr_table[REGIDX_2F8]);
   1929  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0290, 0x00100008);
   1930  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E02C4, 0x3C183C3C);
   1931  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E02C8, 0x00631E0E);
   1932  1.3  riastrad 
   1933  1.3  riastrad 	/* Controller Setting */
   1934  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0034, 0x0001A991);
   1935  1.3  riastrad 
   1936  1.3  riastrad 	/* Train PHY Vref first */
   1937  1.3  riastrad 	pass = 0;
   1938  1.3  riastrad 
   1939  1.3  riastrad 	for (retrycnt = 0; retrycnt < 4 && pass == 0; retrycnt++) {
   1940  1.3  riastrad 		max_phy_vref = 0x0;
   1941  1.3  riastrad 		pass = 0;
   1942  1.3  riastrad 		ast_moutdwm(ast, 0x1E6E02C0, 0x00001C06);
   1943  1.3  riastrad 		for (phy_vref = 0x40; phy_vref < 0x80; phy_vref++) {
   1944  1.3  riastrad 			ast_moutdwm(ast, 0x1E6E000C, 0x00000000);
   1945  1.3  riastrad 			ast_moutdwm(ast, 0x1E6E0060, 0x00000000);
   1946  1.3  riastrad 			ast_moutdwm(ast, 0x1E6E02CC, phy_vref | (phy_vref << 8));
   1947  1.3  riastrad 			/* Fire DFI Init */
   1948  1.3  riastrad 			ddr_phy_init_2500(ast);
   1949  1.3  riastrad 			ast_moutdwm(ast, 0x1E6E000C, 0x00005C01);
   1950  1.3  riastrad 			if (cbr_test_2500(ast)) {
   1951  1.3  riastrad 				pass++;
   1952  1.3  riastrad 				data = ast_mindwm(ast, 0x1E6E03D0);
   1953  1.3  riastrad 				data2 = data >> 8;
   1954  1.3  riastrad 				data  = data & 0xff;
   1955  1.3  riastrad 				if (data > data2)
   1956  1.3  riastrad 					data = data2;
   1957  1.3  riastrad 				if (max_phy_vref < data) {
   1958  1.3  riastrad 					max_phy_vref = data;
   1959  1.3  riastrad 					min_phy_vref = phy_vref;
   1960  1.3  riastrad 				}
   1961  1.3  riastrad 			} else if (pass > 0)
   1962  1.3  riastrad 				break;
   1963  1.3  riastrad 		}
   1964  1.3  riastrad 	}
   1965  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E02CC, min_phy_vref | (min_phy_vref << 8));
   1966  1.3  riastrad 
   1967  1.3  riastrad 	/* Train DDR Vref next */
   1968  1.3  riastrad 	pass = 0;
   1969  1.3  riastrad 
   1970  1.3  riastrad 	for (retrycnt = 0; retrycnt < 4 && pass == 0; retrycnt++) {
   1971  1.3  riastrad 		min_ddr_vref = 0xFF;
   1972  1.3  riastrad 		max_ddr_vref = 0x0;
   1973  1.3  riastrad 		pass = 0;
   1974  1.3  riastrad 		for (ddr_vref = 0x00; ddr_vref < 0x40; ddr_vref++) {
   1975  1.3  riastrad 			ast_moutdwm(ast, 0x1E6E000C, 0x00000000);
   1976  1.3  riastrad 			ast_moutdwm(ast, 0x1E6E0060, 0x00000000);
   1977  1.3  riastrad 			ast_moutdwm(ast, 0x1E6E02C0, 0x00000006 | (ddr_vref << 8));
   1978  1.3  riastrad 			/* Fire DFI Init */
   1979  1.3  riastrad 			ddr_phy_init_2500(ast);
   1980  1.3  riastrad 			ast_moutdwm(ast, 0x1E6E000C, 0x00005C01);
   1981  1.3  riastrad 			if (cbr_test_2500(ast)) {
   1982  1.3  riastrad 				pass++;
   1983  1.3  riastrad 				if (min_ddr_vref > ddr_vref)
   1984  1.3  riastrad 					min_ddr_vref = ddr_vref;
   1985  1.3  riastrad 				if (max_ddr_vref < ddr_vref)
   1986  1.3  riastrad 					max_ddr_vref = ddr_vref;
   1987  1.3  riastrad 			} else if (pass != 0)
   1988  1.3  riastrad 				break;
   1989  1.3  riastrad 		}
   1990  1.3  riastrad 	}
   1991  1.3  riastrad 
   1992  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E000C, 0x00000000);
   1993  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0060, 0x00000000);
   1994  1.3  riastrad 	ddr_vref = (min_ddr_vref + max_ddr_vref + 1) >> 1;
   1995  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E02C0, 0x00000006 | (ddr_vref << 8));
   1996  1.3  riastrad 
   1997  1.3  riastrad 	/* Wait DDR PHY init done */
   1998  1.3  riastrad 	ddr_phy_init_2500(ast);
   1999  1.3  riastrad 
   2000  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0120, ddr_table[REGIDX_PLL]);
   2001  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E000C, 0x42AA5C81);
   2002  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0034, 0x0001AF93);
   2003  1.3  riastrad 
   2004  1.3  riastrad 	check_dram_size_2500(ast, ddr_table[REGIDX_RFC]);
   2005  1.3  riastrad 	enable_cache_2500(ast);
   2006  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E001C, 0x00000008);
   2007  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E0038, 0xFFFFFF00);
   2008  1.3  riastrad }
   2009  1.3  riastrad 
   2010  1.3  riastrad static bool ast_dram_init_2500(struct ast_private *ast)
   2011  1.3  riastrad {
   2012  1.3  riastrad 	u32 data;
   2013  1.3  riastrad 	u32 max_tries = 5;
   2014  1.3  riastrad 
   2015  1.3  riastrad 	do {
   2016  1.3  riastrad 		if (max_tries-- == 0)
   2017  1.3  riastrad 			return false;
   2018  1.3  riastrad 		set_mpll_2500(ast);
   2019  1.3  riastrad 		reset_mmc_2500(ast);
   2020  1.3  riastrad 		ddr_init_common_2500(ast);
   2021  1.3  riastrad 
   2022  1.3  riastrad 		data = ast_mindwm(ast, 0x1E6E2070);
   2023  1.3  riastrad 		if (data & 0x01000000)
   2024  1.3  riastrad 			ddr4_init_2500(ast, ast2500_ddr4_1600_timing_table);
   2025  1.3  riastrad 		else
   2026  1.3  riastrad 			ddr3_init_2500(ast, ast2500_ddr3_1600_timing_table);
   2027  1.3  riastrad 	} while (!ddr_test_2500(ast));
   2028  1.3  riastrad 
   2029  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E2040, ast_mindwm(ast, 0x1E6E2040) | 0x41);
   2030  1.3  riastrad 
   2031  1.3  riastrad 	/* Patch code */
   2032  1.3  riastrad 	data = ast_mindwm(ast, 0x1E6E200C) & 0xF9FFFFFF;
   2033  1.3  riastrad 	ast_moutdwm(ast, 0x1E6E200C, data | 0x10000000);
   2034  1.3  riastrad 
   2035  1.3  riastrad 	return true;
   2036  1.3  riastrad }
   2037  1.3  riastrad 
   2038  1.3  riastrad void ast_post_chip_2500(struct drm_device *dev)
   2039  1.3  riastrad {
   2040  1.3  riastrad 	struct ast_private *ast = dev->dev_private;
   2041  1.3  riastrad 	u32 temp;
   2042  1.3  riastrad 	u8 reg;
   2043  1.3  riastrad 
   2044  1.3  riastrad 	reg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xd0, 0xff);
   2045  1.3  riastrad 	if ((reg & 0x80) == 0) {/* vga only */
   2046  1.3  riastrad 		/* Clear bus lock condition */
   2047  1.3  riastrad 		ast_moutdwm(ast, 0x1e600000, 0xAEED1A03);
   2048  1.3  riastrad 		ast_moutdwm(ast, 0x1e600084, 0x00010000);
   2049  1.3  riastrad 		ast_moutdwm(ast, 0x1e600088, 0x00000000);
   2050  1.3  riastrad 		ast_moutdwm(ast, 0x1e6e2000, 0x1688A8A8);
   2051  1.3  riastrad 		ast_write32(ast, 0xf004, 0x1e6e0000);
   2052  1.3  riastrad 		ast_write32(ast, 0xf000, 0x1);
   2053  1.3  riastrad 		ast_write32(ast, 0x12000, 0x1688a8a8);
   2054  1.3  riastrad 		while (ast_read32(ast, 0x12000) != 0x1)
   2055  1.3  riastrad 			;
   2056  1.3  riastrad 
   2057  1.3  riastrad 		ast_write32(ast, 0x10000, 0xfc600309);
   2058  1.3  riastrad 		while (ast_read32(ast, 0x10000) != 0x1)
   2059  1.3  riastrad 			;
   2060  1.3  riastrad 
   2061  1.3  riastrad 		/* Slow down CPU/AHB CLK in VGA only mode */
   2062  1.3  riastrad 		temp = ast_read32(ast, 0x12008);
   2063  1.3  riastrad 		temp |= 0x73;
   2064  1.3  riastrad 		ast_write32(ast, 0x12008, temp);
   2065  1.3  riastrad 
   2066  1.3  riastrad 		/* Reset USB port to patch USB unknown device issue */
   2067  1.3  riastrad 		ast_moutdwm(ast, 0x1e6e2090, 0x20000000);
   2068  1.3  riastrad 		temp  = ast_mindwm(ast, 0x1e6e2094);
   2069  1.3  riastrad 		temp |= 0x00004000;
   2070  1.3  riastrad 		ast_moutdwm(ast, 0x1e6e2094, temp);
   2071  1.3  riastrad 		temp  = ast_mindwm(ast, 0x1e6e2070);
   2072  1.3  riastrad 		if (temp & 0x00800000) {
   2073  1.3  riastrad 			ast_moutdwm(ast, 0x1e6e207c, 0x00800000);
   2074  1.3  riastrad 			mdelay(100);
   2075  1.3  riastrad 			ast_moutdwm(ast, 0x1e6e2070, 0x00800000);
   2076  1.3  riastrad 		}
   2077  1.3  riastrad 
   2078  1.3  riastrad 		if (!ast_dram_init_2500(ast))
   2079  1.3  riastrad 			DRM_ERROR("DRAM init failed !\n");
   2080  1.3  riastrad 
   2081  1.3  riastrad 		temp = ast_mindwm(ast, 0x1e6e2040);
   2082  1.3  riastrad 		ast_moutdwm(ast, 0x1e6e2040, temp | 0x40);
   2083  1.3  riastrad 	}
   2084  1.3  riastrad 
   2085  1.3  riastrad 	/* wait ready */
   2086  1.3  riastrad 	do {
   2087  1.3  riastrad 		reg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xd0, 0xff);
   2088  1.3  riastrad 	} while ((reg & 0x40) == 0);
   2089  1.3  riastrad }
   2090