3 #define COREBOOT_AST_FAILOVER_TIMEOUT 10000000
53 const u8 *ext_reg_info;
59 for (i = 0x81; i <= 0x9f; i++)
72 while (*ext_reg_info != 0xff) {
98 ast_write32(
ast, 0xf004, r & 0xffff0000);
99 ast_write32(
ast, 0xf000, 0x1);
103 data = ast_read32(
ast, 0xf004) & 0xffff0000;
108 return ast_read32(
ast, 0x10000 + (r & 0x0000ffff));
116 ast_write32(
ast, 0xf004, r & 0xffff0000);
117 ast_write32(
ast, 0xf000, 0x1);
120 data = ast_read32(
ast, 0xf004) & 0xffff0000;
125 ast_write32(
ast, 0x10000 + (r & 0x0000ffff), v);
131 #define CBR_SIZE_AST2150 ((16 << 10) - 1)
132 #define CBR_PASSNUM_AST2150 5
133 #define CBR_THRESHOLD_AST2150 10
134 #define CBR_THRESHOLD2_AST2150 10
135 #define TIMEOUT_AST2150 5000000
137 #define CBR_PATNUM_AST2150 8
189 for (i = 0; i < 8; i++)
213 u32 dll_min[4], dll_max[4], dlli, data, passcnt;
216 dll_min[0] = dll_min[1] = dll_min[2] = dll_min[3] = 0xff;
217 dll_max[0] = dll_max[1] = dll_max[2] = dll_max[3] = 0x0;
220 for (dlli = 0; dlli < 100; dlli++) {
221 ast_moutdwm(
ast, 0x1e6e0068, dlli | (dlli << 8) | (dlli << 16) | (dlli << 24));
225 if (dll_min[0] > dlli)
227 if (dll_max[0] < dlli)
237 dlli = dll_min[0] + (((dll_max[0] - dll_min[0]) * 7) >> 4);
238 ast_moutdwm(
ast, 0x1e6e0068, dlli | (dlli << 8) | (dlli << 16) | (dlli << 24));
251 if ((j & 0x80) == 0) {
254 ast_write32(
ast, 0xf004, 0x1e6e0000);
255 ast_write32(
ast, 0xf000, 0x1);
256 ast_write32(
ast, 0x10100, 0xa8);
263 dev_err(dev->
pdev,
"Timeout while waiting for register\n");
270 ast_write32(
ast, 0xf004, 0x1e6e0000);
271 ast_write32(
ast, 0xf000, 0x1);
272 ast_write32(
ast, 0x12000, 0x1688A8A8);
275 for (i = 0; i < 250; i++) {
276 if (ast_read32(
ast, 0x12000) == 0x01)
280 if (ast_read32(
ast, 0x12000) != 0x01)
281 dev_err(dev->
pdev,
"Unable to unlock SCU registers\n");
283 ast_write32(
ast, 0x10000, 0xfc600309);
286 for (i = 0; i < 250; i++) {
287 if (ast_read32(
ast, 0x10000) == 0x01)
291 if (ast_read32(
ast, 0x10000) != 0x01)
292 dev_err(dev->
pdev,
"Unable to unlock SDRAM control registers\n");
295 while (dram_reg_info->
index != 0xffff) {
296 if (dram_reg_info->
index == 0xff00) {
297 for (i = 0; i < 15; i++)
306 temp = ast_read32(
ast, 0x12070);
309 ast_write32(
ast, 0x10000 + dram_reg_info->
index,
data | temp);
311 ast_write32(
ast, 0x10000 + dram_reg_info->
index, dram_reg_info->
data);
316 data = ast_read32(
ast, 0x10120);
317 if (
data == 0x5061) {
318 data = ast_read32(
ast, 0x10004);
327 temp = ast_read32(
ast, 0x10140);
328 ast_write32(
ast, 0x10140, temp | 0x40);
334 temp = ast_read32(
ast, 0x1200c);
335 ast_write32(
ast, 0x1200c, temp & 0xfffffffd);
336 temp = ast_read32(
ast, 0x12040);
337 ast_write32(
ast, 0x12040, temp | 0x40);
346 for (i = 0; i < 250; i++) {
353 dev_err(dev->
pdev,
"Timeout while waiting for device to signal ready\n");
418 #define CBR_SIZE0 ((1 << 10) - 1)
419 #define CBR_SIZE1 ((4 << 10) - 1)
420 #define CBR_SIZE2 ((64 << 10) - 1)
421 #define CBR_PASSNUM 5
422 #define CBR_PASSNUM2 5
423 #define CBR_THRESHOLD 10
424 #define CBR_THRESHOLD2 10
425 #define TIMEOUT 5000000
474 data = (data | (data >> 16)) & 0xffff;
509 if ((data & 0xff) && (data & 0xff00))
511 for (i = 0; i < 8; i++) {
513 if ((data & 0xff) && (data & 0xff00))
518 else if (data & 0xff)
525 u32 data, data2, patcnt, loop;
528 for (patcnt = 0; patcnt <
CBR_PATNUM; patcnt++) {
555 return ~data & 0xffff;
560 u32 data, data2, patcnt, loop;
563 for (patcnt = 0; patcnt <
CBR_PATNUM; patcnt++) {
592 for (patcnt = 0; patcnt <
CBR_PATNUM; patcnt++) {
594 for (loop = 0; loop < 2; loop++) {
606 u32 gold_sadj[2], dllmin[16], dllmax[16], dlli, data, cnt,
mask, passcnt,
retry = 0;
609 for (cnt = 0; cnt < 16; cnt++) {
614 for (dlli = 0; dlli < 76; dlli++) {
615 ast_moutdwm(
ast, 0x1E6E0068, 0x00001400 | (dlli << 16) | (dlli << 24));
620 for (cnt = 0; cnt < 16; cnt++) {
622 if (dllmin[cnt] > dlli) {
625 if (dllmax[cnt] < dlli) {
638 for (cnt = 0; cnt < 16; cnt++) {
639 if ((dllmax[cnt] > dllmin[cnt]) && ((dllmax[cnt] - dllmin[cnt]) >=
CBR_THRESHOLD2)) {
640 gold_sadj[0] += dllmin[cnt];
651 gold_sadj[0] = gold_sadj[0] >> 4;
652 gold_sadj[1] = gold_sadj[0];
655 for (cnt = 0; cnt < 8; cnt++) {
657 if ((dllmax[cnt] > dllmin[cnt]) && ((dllmax[cnt] - dllmin[cnt]) >=
CBR_THRESHOLD2)) {
659 if (gold_sadj[0] >= dlli) {
660 dlli = ((gold_sadj[0] - dlli) * 19) >> 5;
665 dlli = ((dlli - gold_sadj[0]) * 19) >> 5;
669 dlli = (8 - dlli) & 0x7;
677 for (cnt = 8; cnt < 16; cnt++) {
679 if ((dllmax[cnt] > dllmin[cnt]) && ((dllmax[cnt] - dllmin[cnt]) >=
CBR_THRESHOLD2)) {
681 if (gold_sadj[1] >= dlli) {
682 dlli = ((gold_sadj[1] - dlli) * 19) >> 5;
686 dlli = (dlli - 1) & 0x7;
689 dlli = ((dlli - gold_sadj[1]) * 19) >> 5;
694 dlli = (8 - dlli) & 0x7;
705 u32 dlli, dqsip, dqidly;
706 u32 reg_mcr18, reg_mcr0c, passcnt[2], diff;
707 u32 g_dqidly, g_dqsip, g_margin, g_side;
714 reg_mcr18 &= 0x0000ffff;
717 for (dlli = 0; dlli < 76; dlli++) {
721 for (dqidly = 0; dqidly < 32; dqidly++) {
722 pass[dqidly][0][0] = 0xff;
723 pass[dqidly][0][1] = 0x0;
724 pass[dqidly][1][0] = 0xff;
725 pass[dqidly][1][1] = 0x0;
727 for (dqidly = 0; dqidly < 32; dqidly++) {
728 passcnt[0] = passcnt[1] = 0;
729 for (dqsip = 0; dqsip < 2; dqsip++) {
731 ast_moutdwm(
ast, 0x1E6E0018, reg_mcr18 | (dqidly << 16) | (dqsip << 23));
733 for (dlli = 0; dlli < 76; dlli++) {
734 ast_moutdwm(
ast, 0x1E6E0068, 0x00001300 | (dlli << 16) | (dlli << 24));
741 tag[dqsip][dlli] =
'P';
742 if (dlli < pass[dqidly][dqsip][0])
743 pass[dqidly][dqsip][0] = (
u16) dlli;
744 if (dlli > pass[dqidly][dqsip][1])
745 pass[dqidly][dqsip][1] = (
u16) dlli;
746 }
else if (passcnt[dqsip] >= 5)
749 pass[dqidly][dqsip][0] = 0xff;
750 pass[dqidly][dqsip][1] = 0x0;
754 if (passcnt[0] == 0 && passcnt[1] == 0)
758 g_dqidly = g_dqsip = g_margin = g_side = 0;
760 for (dqidly = 0; dqidly < 32; dqidly++) {
761 for (dqsip = 0; dqsip < 2; dqsip++) {
762 if (pass[dqidly][dqsip][0] > pass[dqidly][dqsip][1])
764 diff = pass[dqidly][dqsip][1] - pass[dqidly][dqsip][0];
765 if ((diff+2) < g_margin)
767 passcnt[0] = passcnt[1] = 0;
768 for (dlli = pass[dqidly][dqsip][0]; dlli > 0 && tag[dqsip][dlli] != 0; dlli--, passcnt[0]++);
769 for (dlli = pass[dqidly][dqsip][1]; dlli < 76 && tag[dqsip][dlli] != 0; dlli++, passcnt[1]++);
770 if (passcnt[0] > passcnt[1])
771 passcnt[0] = passcnt[1];
773 if (passcnt[0] > g_side)
774 passcnt[1] = passcnt[0] - g_side;
775 if (diff > (g_margin+1) && (passcnt[1] > 0 || passcnt[0] > 8)) {
780 }
else if (passcnt[1] > 1 && g_side < 8) {
789 reg_mcr18 = reg_mcr18 | (g_dqidly << 16) | (g_dqsip << 23);
795 u32 dllmin[2], dllmax[2], dlli, data, passcnt,
retry = 0;
803 dllmin[0] = dllmin[1] = 0xff;
804 dllmax[0] = dllmax[1] = 0x0;
806 for (dlli = 0; dlli < 76; dlli++) {
807 ast_moutdwm(
ast, 0x1E6E0068, 0x00001300 | (dlli << 16) | (dlli << 24));
812 if (dllmin[0] > dlli) {
815 if (dllmax[0] < dlli) {
820 if (dllmin[1] > dlli) {
823 if (dllmax[1] < dlli) {
834 if (dllmax[0] == 0 || (dllmax[0]-dllmin[0]) <
CBR_THRESHOLD) {
837 if (dllmax[1] == 0 || (dllmax[1]-dllmin[1]) <
CBR_THRESHOLD) {
842 dlli = (dllmin[1] + dllmax[1]) >> 1;
844 dlli += (dllmin[0] + dllmax[0]) >> 1;
851 u32 trap, trap_AC2, trap_MRS;
857 trap_AC2 = 0x00020000 + (trap << 16);
858 trap_AC2 |= 0x00300000 + ((trap & 0x2) << 19);
859 trap_MRS = 0x00000010 + (trap << 4);
860 trap_MRS |= ((trap & 0x2) << 18);
873 param->
reg_AC2 = 0xAA007613 | trap_AC2;
875 param->
reg_MRS = 0x04001400 | trap_MRS;
886 param->
reg_AC2 = 0xAA007613 | trap_AC2;
889 param->
reg_AC2 = 0xAA00761C | trap_AC2;
892 param->
reg_AC2 = 0xAA007636 | trap_AC2;
901 param->
reg_AC2 = 0xCC009617 | trap_AC2;
903 param->
reg_MRS = 0x04001600 | trap_MRS;
916 param->
reg_AC2 = 0xCC009617 | trap_AC2;
919 param->
reg_AC2 = 0xCC009622 | trap_AC2;
922 param->
reg_AC2 = 0xCC00963F | trap_AC2;
931 param->
reg_AC2 = 0xCC009617 | trap_AC2;
933 param->
reg_MRS = 0x04001600 | trap_MRS;
946 param->
reg_AC2 = 0xCC009617 | trap_AC2;
949 param->
reg_AC2 = 0xCC009622 | trap_AC2;
952 param->
reg_AC2 = 0xCC00963F | trap_AC2;
1140 dev_err(dev->pdev,
"Timeout while waiting for register\n");
1142 data = (data >> 8) & 0xff;
1146 if ((data2 & 0xff) > param->
madj_max) {
1150 if (data2 & 0x00100000) {
1151 data2 = ((data2 & 0xff) >> 3) + 3;
1153 data2 = ((data2 & 0xff) >> 2) + 5;
1156 data2 += data & 0xff;
1157 data = data | (data2 << 8);
1164 data = data | 0x200;
1172 dev_err(dev->pdev,
"Timeout while waiting for register\n");
1175 data = (data >> 8) & 0xff;
1180 dev_err(dev->pdev,
"Timeout while waiting for register\n");
1205 data = data | 0x3000 | ((param->
reg_AC2 & 0x60000) >> 3);
1211 goto ddr3_init_start;
1224 dev_err(dev->pdev,
"Timeout while waiting for register\n");
1234 u32 trap, trap_AC2, trap_MRS;
1240 trap_AC2 = (trap << 20) | (trap << 16);
1241 trap_AC2 += 0x00110000;
1242 trap_MRS = 0x00000040 | (trap << 4);
1270 param->
reg_AC2 = 0xAA009016 | trap_AC2;
1272 param->
reg_MRS = 0x00000A02 | trap_MRS;
1283 param->
reg_AC2 = 0xAA009012 | trap_AC2;
1286 param->
reg_AC2 = 0xAA009016 | trap_AC2;
1289 param->
reg_AC2 = 0xAA009023 | trap_AC2;
1292 param->
reg_AC2 = 0xAA00903B | trap_AC2;
1302 param->
reg_AC2 = 0xCC00B01B | trap_AC2;
1304 param->
reg_MRS = 0x00000C02 | trap_MRS;
1315 param->
reg_AC2 = 0xCC00B016 | trap_AC2;
1319 param->
reg_AC2 = 0xCC00B01B | trap_AC2;
1322 param->
reg_AC2 = 0xCC00B02B | trap_AC2;
1325 param->
reg_AC2 = 0xCC00B03F | trap_AC2;
1336 param->
reg_AC2 = 0xCC00B01B | trap_AC2;
1338 param->
reg_MRS = 0x00000C02 | trap_MRS;
1349 param->
reg_AC2 = 0xCC00B016 | trap_AC2;
1353 param->
reg_AC2 = 0xCC00B01B | trap_AC2;
1356 param->
reg_AC2 = 0xCC00B02B | trap_AC2;
1359 param->
reg_AC2 = 0xCC00B03F | trap_AC2;
1526 dev_err(dev->pdev,
"Timeout while waiting for register\n");
1528 data = (data >> 8) & 0xff;
1532 if ((data2 & 0xff) > param->
madj_max) {
1536 if (data2 & 0x00100000) {
1537 data2 = ((data2 & 0xff) >> 3) + 3;
1539 data2 = ((data2 & 0xff) >> 2) + 5;
1542 data2 += data & 0xff;
1543 data = data | (data2 << 8);
1550 data = data | 0x200;
1558 dev_err(dev->pdev,
"Timeout while waiting for register\n");
1561 data = (data >> 8) & 0xff;
1566 dev_err(dev->pdev,
"Timeout while waiting for register\n");
1596 data = data | 0x3000 | ((param->
reg_AC2 & 0x60000) >> 3);
1603 goto ddr2_init_start;
1615 dev_err(dev->pdev,
"Timeout while waiting for register\n");
1632 if ((reg & 0x80) == 0) {
1633 ast_write32(
ast, 0xf004, 0x1e6e0000);
1634 ast_write32(
ast, 0xf000, 0x1);
1635 ast_write32(
ast, 0x12000, 0x1688a8a8);
1641 dev_err(dev->
pdev,
"Timeout while waiting for register\n");
1643 ast_write32(
ast, 0x10000, 0xfc600309);
1649 dev_err(dev->
pdev,
"Timeout while waiting for register\n");
1652 temp = ast_read32(
ast, 0x12008);
1654 ast_write32(
ast, 0x12008, temp);
1659 if (temp & 0x01000000)
1661 switch (temp & 0x18000000) {
1676 switch (temp & 0x0c) {
1714 dev_err(dev->
pdev,
"Timeout while waiting for register\n");
1770 u32 data, pass, timecnt;
1775 for (timecnt = 0; timecnt <
TIMEOUT; timecnt++) {
1817 reg_14 |= (tRFC >> 24) & 0xFF;
1821 reg_14 |= (tRFC >> 16) & 0xFF;
1825 reg_14 |= (tRFC >> 8) & 0xFF;
1827 reg_14 |= tRFC & 0xFF;
1842 while (!(data & 0x80000));
1853 for (
addr = 0x1e6e0004;
addr < 0x1e6e0090;) {
1930 u32 data, data2, pass, retrycnt;
1931 u32 ddr_vref, phy_vref;
1932 u32 min_ddr_vref = 0, min_phy_vref = 0;
1933 u32 max_ddr_vref = 0, max_phy_vref = 0;
1967 for (retrycnt = 0; retrycnt < 4 && pass == 0; retrycnt++) {
1971 for (phy_vref = 0x40; phy_vref < 0x80; phy_vref++) {
1985 if (max_phy_vref < data) {
1986 max_phy_vref = data;
1987 min_phy_vref = phy_vref;
1989 }
else if (pass > 0)
1993 ast_moutdwm(
ast, 0x1E6E02CC, min_phy_vref | (min_phy_vref << 8));
1998 for (retrycnt = 0; retrycnt < 4 && pass == 0; retrycnt++) {
1999 min_ddr_vref = 0xFF;
2002 for (ddr_vref = 0x00; ddr_vref < 0x40; ddr_vref++) {
2011 if (min_ddr_vref > ddr_vref)
2012 min_ddr_vref = ddr_vref;
2013 if (max_ddr_vref < ddr_vref)
2014 max_ddr_vref = ddr_vref;
2015 }
else if (pass != 0)
2022 ddr_vref = (min_ddr_vref + max_ddr_vref + 1) >> 1;
2044 if (max_tries-- == 0)
2051 if (data & 0x01000000)
2073 if ((reg & 0x80) == 0) {
2079 ast_write32(
ast, 0xf004, 0x1e6e0000);
2080 ast_write32(
ast, 0xf000, 0x1);
2081 ast_write32(
ast, 0x12000, 0x1688a8a8);
2082 while (ast_read32(
ast, 0x12000) != 0x1)
2085 ast_write32(
ast, 0x10000, 0xfc600309);
2086 while (ast_read32(
ast, 0x10000) != 0x1)
2090 temp = ast_read32(
ast, 0x12008);
2092 ast_write32(
ast, 0x12008, temp);
2100 if (temp & 0x00800000) {
2116 }
while ((reg & 0x40) == 0);
static int pci_read_config_dword(struct pci_dev *dev, int where, u32 *val)
#define dev_err(dev, format, arg...)
static int pci_write_config_dword(struct pci_dev *dev, int where, u32 val)
void ast_init_3rdtx(struct drm_device *dev)
static const struct ast_dramstruct ast1100_dram_table_data[]
static const u32 ast2500_ddr4_1600_timing_table[REGTBL_NUM]
static const u32 ast2500_ddr3_1600_timing_table[REGTBL_NUM]
static const struct ast_dramstruct ast2000_dram_table_data[]
static const struct ast_dramstruct ast2100_dram_table_data[]
#define AST_VIDMEM_SIZE_8M
uint8_t ast_get_index_reg_mask(struct ast_private *ast, uint32_t base, uint8_t index, uint8_t mask)
#define AST_IO_VGA_ENABLE_PORT
#define AST_VIDMEM_SIZE_16M
void ast_set_index_reg_mask(struct ast_private *ast, uint32_t base, uint8_t index, uint8_t mask, uint8_t val)
#define AST_IO_MISC_PORT_WRITE
static void ast_set_index_reg(struct ast_private *ast, uint32_t base, uint8_t index, uint8_t val)
#define AST_VIDMEM_SIZE_32M
#define AST_VIDMEM_SIZE_64M
static void ast_open_key(struct ast_private *ast)
static struct ast_private * ast
static u32 mmc_test_burst2(struct ast_private *ast, u32 datagen)
static void ast_post_chip_2300(struct drm_device *dev)
static bool ast_dram_init_2500(struct ast_private *ast)
static bool cbr_test_2500(struct ast_private *ast)
static void enable_cache_2500(struct ast_private *ast)
static void ddr2_init(struct ast_private *ast, struct ast2300_dram_param *param)
static bool mmc_test(struct ast_private *ast, u32 datagen, u8 test_ctl)
static void ddr_phy_init_2500(struct ast_private *ast)
void ast_post_gpu(struct drm_device *dev)
static void get_ddr3_info(struct ast_private *ast, struct ast2300_dram_param *param)
static void ast_post_chip_2500(struct drm_device *dev)
#define CBR_THRESHOLD_AST2150
static bool finetuneDQI_L(struct ast_private *ast, struct ast2300_dram_param *param)
static u32 mmc_test2(struct ast_private *ast, u32 datagen, u8 test_ctl)
static const u8 extreginfo[]
static u32 cbr_scan2(struct ast_private *ast)
static void reset_mmc_2500(struct ast_private *ast)
static const u8 extreginfo_ast2300[]
static void get_ddr2_info(struct ast_private *ast, struct ast2300_dram_param *param)
static void ddr_init_common_2500(struct ast_private *ast)
static bool mmc_test_single(struct ast_private *ast, u32 datagen)
#define CBR_PASSNUM_AST2150
static void cbrdlli_ast2150(struct ast_private *ast, int busw)
static void ddr3_init(struct ast_private *ast, struct ast2300_dram_param *param)
static bool cbr_dll2(struct ast_private *ast, struct ast2300_dram_param *param)
static const u32 pattern[8]
static void ddr3_init_2500(struct ast_private *ast, const u32 *ddr_table)
static int cbr_scan(struct ast_private *ast)
static u32 mmc_test_single2(struct ast_private *ast, u32 datagen)
void ast_moutdwm(struct ast_private *ast, u32 r, u32 v)
static u32 mmctestburst2_ast2150(struct ast_private *ast, u32 datagen)
static void set_mpll_2500(struct ast_private *ast)
void ast_enable_mmio(struct drm_device *dev)
static bool cbr_test3(struct ast_private *ast)
static bool cbr_scan3(struct ast_private *ast)
static void check_dram_size_2500(struct ast_private *ast, u32 tRFC)
void ast_enable_vga(struct drm_device *dev)
static void finetuneDQSI(struct ast_private *ast)
bool ast_is_vga_enabled(struct drm_device *dev)
u32 ast_mindwm(struct ast_private *ast, u32 r)
static void ast_set_def_ext_reg(struct drm_device *dev)
static int cbr_test(struct ast_private *ast)
static u32 cbr_test2(struct ast_private *ast)
#define COREBOOT_AST_FAILOVER_TIMEOUT
static bool mmc_test_burst(struct ast_private *ast, u32 datagen)
#define CBR_PATNUM_AST2150
static const u32 pattern_AST2150[14]
static bool mmc_test_single_2500(struct ast_private *ast, u32 datagen)
static void ast_init_dram_reg(struct drm_device *dev)
static int cbrtest_ast2150(struct ast_private *ast)
static const u8 extreginfo_ast2300a0[]
static int cbrscan_ast2150(struct ast_private *ast, int busw)
static bool ddr_test_2500(struct ast_private *ast)
static void ddr4_init_2500(struct ast_private *ast, const u32 *ddr_table)
#define retry(attempts, condition,...)
#define printk(level,...)
void mdelay(unsigned int msecs)
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
static struct dramc_channel const ch[2]
enum ast_private::@25 config_mode
enum ast_tx_chip tx_chip_type