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, ®); 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, ¶m); 1673 1.1 riastrad ddr3_init(ast, ¶m); 1674 1.1 riastrad } else { 1675 1.1 riastrad get_ddr2_info(ast, ¶m); 1676 1.1 riastrad ddr2_init(ast, ¶m); 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