34static void edram_write(
int addr,
unsigned int value)
48static void edram_rmw(
int addr,
int bit,
int mask,
int val)
50 edram_write(addr, (edram_read(addr) & ~mask) | ((
val << bit) & mask));
57 for (chip = 0; chip < 9; ++chip)
60 for (phase = 0; phase < 4; ++phase)
62 edram_write(0x5002, 0x15555 * phase);
63 int v = edram_read(0x5005);
64 for (chip = 0; chip < 9; ++chip)
66 int bit = (v >> chip) & 1;
68 res[chip] |= bit << phase;
77 for (chip = 0; chip < 6; ++chip)
80 for (phase = 0; phase < 4; ++phase)
85 for (chip = 0; chip < 6; ++chip)
87 int bit = (r >> chip) & 1;
89 res[chip] |= bit << phase;
94int edram_p2(
int r3,
int r4,
int r5,
int r6,
int r7,
int r8,
int r9,
int r10)
96 int a = edram_read(0x5002);
97 edram_write(0x5002, 0xa53ca53c);
98 int b = edram_read(0x5002);
99 if ((b & 0x1ffff) != 0xA53C)
101 edram_write(0x5002, 0xfee1caa9);
102 b = edram_read(0x5002);
103 if ((b & 0x1ffff) != 0x1caa9)
105 edram_write(0x5002, a);
121 edram_write(0x4000, 0xC0);
132 edram_write(0xffff, 1);
134 edram_write(0x5001, 7);
146 s = edram_read(0x5003);
148 edram_write(0x5003, s);
149 edram_write(0x5003, s &~ 0x15555);
190 edram_rmw(0x5000, 1, 2, 0);
191 edram_write(0x500c, 0x3faaa);
192 edram_write(0x5006, 0x30);
193 edram_write(0x5007, 0x30);
194 edram_write(0x5008, 0x30);
195 edram_write(0x5009, 0x30);
196 edram_write(0x500a, 0x30);
197 edram_write(0x500b, 0x30);
198 edram_rmw(0x5006, 7, 0x3f80, 0);
199 edram_rmw(0x5007, 7, 0x3f80, 0);
200 edram_rmw(0x5008, 7, 0x3f80, 0);
201 edram_rmw(0x5009, 7, 0x3f80, 0);
202 edram_rmw(0x500a, 7, 0x3f80, 0);
203 edram_rmw(0x500b, 7, 0x3f80, 0);
205 edram_rmw(0x5006, 14, 0x1fc000, 0);
206 edram_rmw(0x5007, 14, 0x1fc000, 0);
207 edram_rmw(0x5008, 14, 0x1fc000, 0);
208 edram_rmw(0x5009, 14, 0x1fc000, 0);
209 edram_rmw(0x500a, 14, 0x1fc000, 0);
210 edram_rmw(0x500b, 14, 0x1fc000, 0);
212 edram_write(0x500c, 0x3f000);
215 edram_rmw(0x5000, 1, 2, 1);
226 int res_cur[9], temp[9], res_base[9];
227 int valid[36] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
228 int useful[64] = {0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0};
229 int phase_count[9] = {4,4,4,4,4,4,4,4,4};
230 int stable[9] = {1,1,1,1,1,1,1,1,1};
231 int defaults[4] = {11,7,15,13};
232 int data6_old[16] = {1,3,0,3,1,1,0,0,2,2,1,3,1,2,1,1};
233 int data6_new[16] = {0,2,3,2,0,0,3,3,1,1,0,2,0,1,0,0};
234 int data7[16] = {0,2,3,2,0,0,3,3,1,1,0,2,0,1,0,0};
240 for (i = 0; i < 50; ++i)
255 memcpy(res_cur, temp,
sizeof(res_cur));
257 memcpy(res_base, temp,
sizeof(res_cur));
259 for (chip = 0; chip < 9; ++chip)
261 for (phase = 0; phase < 4; phase++)
263 if (valid[chip + phase * 9])
264 if (!useful[res_cur[chip] + phase * 4])
266 valid[chip + phase * 9] = 0;
270 if (res_base[chip] != res_cur[chip])
275 for (chip = 0; chip < 9; ++chip)
277 if (!stable[chip] && phase_count[chip] == 1)
279 for (phase = 0; phase < 4; ++phase)
281 if (valid[chip + phase * 9])
283 res_cur[chip] = defaults[phase];
294 for (chip = 0; chip < 9; ++chip)
297 res |= data6[res_cur[chip]] << (chip * 2);
299 printf(
"final cfg: %08x\n", res);
303 memset(rp, 0xff,
sizeof rp);
304 for (i = 0; i < 10; ++i)
308 for (
j = 0;
j < 9; ++
j)
314 for (i = 0; i < 9; ++i)
316 for (
j = 0;
j < 4; ++
j)
320 printf(
"ed chip %d, inv\n", i);
326 edram_write(0x5002, res);
331 edram_rmw(0x5000, 2, 4, 1);
332 edram_rmw(0x5000, 2, 4, 0);
333 edram_rmw(0x5000, 3, 8, 1);
334 edram_rmw(0x5000, 3, 8, 0);
340 edram_write(0x5001, s);
341 edram_rmw(0x5000, 0, 1, 1);
346 edram_rmw(0x5000, 1, 2, r9 ? 0 : 1);
352 edram_rmw(0x5000, 5, 0x20, 1);
353 edram_rmw(0x5000, 5, 0x20, 0);
354 for (i = 0; i < 9; ++i)
356 for (i = 0; i < 9; ++i)
358 for (i = 0; i < 9; ++i)
359 valid[i] = valid[i + 9] = valid[i + 18] = valid[i + 27] = 1;
364 for (i = 0; i < 50; ++i)
375 memcpy(res_cur, ht,
sizeof(ht));
377 memcpy(res_base, ht,
sizeof(ht));
378 for (chip = 0; chip < 6; ++chip)
380 for (phase = 0; phase < 4; ++phase)
382 if (valid[chip + phase * 9] && !useful[res_cur[chip] + phase * 4])
384 valid[chip + phase * 9] = 0;
388 if (res_cur[chip] != res_base[chip])
393 for (chip = 0; chip < 6; ++chip)
395 if (!stable[chip] && phase_count[chip] == 1)
397 for (phase = 0; phase < 4; ++phase)
398 if (valid[chip + phase * 9])
399 res_cur[chip] = defaults[phase];
405 for (chip = 0; chip < 6; ++chip)
406 res |= data7[res_cur[chip]] << (chip*2);
407 printf(
"final cfg: %08x\n", res);
410 memset(rp, 0xff,
sizeof rp);
411 for (i = 0; i < 10; ++i)
415 for (
j = 0;
j < 6; ++
j)
421 for (i = 0; i < 6; ++i)
423 for (
j = 0;
j < 4; ++
j)
427 printf(
"gp chip %d, inv\n", i);
435 edram_rmw(0x5000, 5, 0x20, 1);
436 edram_rmw(0x5000, 5, 0x20, 0);
451 edram_rmw(0x5001, 0, 3, 3);
452 edram_rmw(0x5001, 2, 4, 1);
454 edram_rmw(0x5001, 0, 3, 3);
455 edram_rmw(0x5001, 2, 4, 1);
459 if (r6 >= 0x10 && !r7)
467 edram_rmw(0x5000, 0, 1, 1);
468 edram_rmw(0x5000, 8, 0x100, 1);
486 edram_rmw(0x5000, 0, 1, 0);
487 edram_rmw(0x5000, 8, 0x100, 0);
492 printf(
"ping test timed out\n");
495 printf(
"ping test okay\n");
502 edram_rmw(0x5000, 8, 0x100, 0);
503 edram_rmw(0x5000, 0, 1, 0);
505 edram_write(0x100f, 1);
507 edram_write(0x100f, 0);
508 edram_write(0xffff, 1);
509 edram_rmw(0x5001, 2, 4, 0);
530 for (i = 0; i < 6; ++i)
536 for (i = 0; i < 6; ++i)
542 for (i = 0; i < 6; ++i)
545 for (i = 0; i < 6; ++i)
555 for (i = 0; i < 6; ++i)
564 for (i = 0; i < 6; ++i)
574 for (i = 0; i < 6; ++i)
581 for (i = 0; i < 6; ++i)
594 int v = (edram_read(0x4000) &~ 4) | 0x2A;
595 edram_write(0x4000, v);
596 edram_write(0x4001,
xenos_id<0x5821 ? 0x2709f1 : 0x31);
597 v = (v &~ 0x20) | 0xC;
598 edram_write(0x4000, v);
600 edram_write(0x4000, v);
601 edram_write(0xFFFF, 1);
603 edram_write(0x4000, v);
604 edram_write(0x4001,
xenos_id<0x5821 ? 0x2709f1 : 0x31);
606 edram_write(0x4000, v);
607 edram_write(0xFFFF, 1);
612 printf(
"Xenos EDRAM ID=%08x\n",
edram_id);
614 if (
edram_p2(0, 0, 0, 0x11, 0, 0, 0, 1))
616 printf(
"edram_p2 failed\n");
1194 if ((v0 & 0x00006000) == 0x00006000)
1196 if ((v0 & 0x00018000) == 0x00018000)
1198 if ((v0 & 0x00410000) == 0x00410000)
1200 if ((v0 & 0x00082000) == 0x00082000)
1202 if ((v0 & 0x00700000) == 0x00700000)
1204 if ((v0 & 0x00180000) == 0x00180000)
1214 Xe_Fatal(xe,
"damnit, EDRAM init failed, again and again.");
1220 printf(
"waiting for temperature to stabilize...\n");
1222 for (i = 0; i < 40; ++i)
1227 printf(
"%f %f %f %f\n",
data[0] / 256.0,
data[1] / 256.0,
data[2] / 256.0,
data[3] / 256.0);
1246 reloc[8] = (
base + 0x0000) | (0x43 << 1);
1249 memset(
ptr + 0, 1, 0x1000);
1251 memset(
ptr + 0x1000, 0x99, 0x1000);
1253 *(
u32*)(
ptr + 0x108) = 0x1000;
1254 *(
u32*)(
ptr + 0x118) = 0x1;
1255 *(
u32*)(
ptr + 0x128) = 0x1100;
1256 *(
u32*)(
ptr + 0x12c) = 0x1000;
1257 *(
u32*)(
ptr + 0x13c) = 0;
1260 -0.5, 7.5, 0.0, 1.0,
1261 -0.5, -0.5, 0.0, 0.0,
1262 15.5, 7.5, 1.0, 1.0,
1263 15.5, -0.5, 1.0, 0.0
1266 -0.5, 31.5, 0.0, 1.0,
1267 -0.5, -0.5, 0.0, 0.0,
1268 31.5, 31.5, 1.0, 1.0,
1269 31.5, -0.5, 1.0, 0.0
1277 float reg_80[] = {-.5, 7.5, -.5, -.5, 15.5, -.5};
1278 float reg_98[] = {-.5, 31.5, -.5, -.5, 31.5, -.5};
1279 float reg_d0[] = {-.5, -.5, -.5, 1599.5, -.5};
1281 memcpy(
ptr + 0x2000 + 0x00, reg_00,
sizeof(reg_00));
1282 memcpy(
ptr + 0x2000 + 0x40, reg_40,
sizeof(reg_40));
1283 memcpy(
ptr + 0x2000 + 0xb0, reg_b0,
sizeof(reg_b0));
1284 memcpy(
ptr + 0x2000 + 0x80, reg_80,
sizeof(reg_80));
1285 memcpy(
ptr + 0x2000 + 0x98, reg_98,
sizeof(reg_98));
1286 memcpy(
ptr + 0x2000 + 0xd0, reg_d0,
sizeof(reg_d0));
1290 w32(0x3c04,
r32(0x3c04) &~ 0x100);
1294 int var_1 = 0x111111;
1295 w32(0x3cb4, 0x888888 | var_1);
1302 memset(
ptr + 0x1000,
'Z', 0x1000);
1305 w32(0x3c94, (
r32(0x3c94) &~0x800000FF) | 0xb);
1307 w32(0x3c94,
r32(0x3c94) | 0x80000000);
1310 memset(
ptr + 0x1000, 0, 0x1000);
1316 for (var_2 = 0xb; var_2 < 0x13; ++var_2)
1320 for (i = 0; i < 0x20 * 0x20; ++i)
1325 int p1 = (seed >> 16) & 0x7fff;
1330 int p2 = (seed >> 16) & 0x7fff;
1332 int v = (p2<<16) + p1;
1334 ((
int*)
ptr) [i] = v;
1336 memset(
ptr + 0x1000, 0x44, 0x1000);
1339 w32(0x3c94, (
r32(0x3c94) &~0x800000FF) | var_2);
1341 w32(0x3c94,
r32(0x3c94) | 0x80000000);
1355 0xEBBCB7D0, 0xB7599E02, 0x0AEA2A7A, 0x2CABD6B8,
1356 0xA5A5A5A5, 0xA5A5A5A5, 0xE57C27BE, 0x43FA90AA,
1357 0x9D065F66, 0x360A6AD8, 0xA5A5A5A5, 0xA5A5A5A5,
1358 0xA5A5A5A5, 0xEBBCB7D0, 0xB7599E02, 0x0AEA2A7A,
1359 0x2CABD6B8, 0xA5A5A5A5, 0xA5A5A5A5, 0xE57C27BE,
1360 0x43FA90AA, 0x9D065F66, 0x360A6AD8, 0xA5A5A5A5
1364 fail = determine_broken(fail);
1369 if (!fail)
goto worked;
1376 for (ixxx = 0; ixxx < 6; ++ixxx)
1379 if (!(fail & (1<<ixxx)))
1384 for (vxxx = 0; vxxx < 4; ++vxxx)
1386 var_1 &= ~(0xF<<(ixxx*4));
1387 var_1 |= vxxx << (ixxx * 4);
1389 memset(
ptr + 0, 1, 0x1000);
1390 *(
u32*)(
ptr + 0x108) = 0x1000;
1391 *(
u32*)(
ptr + 0x118) = 0x1;
1392 *(
u32*)(
ptr + 0x128) = 0x1100;
1393 *(
u32*)(
ptr + 0x12c) = 0x1000;
1394 *(
u32*)(
ptr + 0x13c) = 0;
1399 w32(0x3cb4, var_1 | 0x888888);
1410 for (i = 0; i < 0x20 * 0x20; ++i)
1415 int p1 = (seed >> 16) & 0x7fff;
1420 int p2 = (seed >> 16) & 0x7fff;
1422 int v = (p2<<16) + p1;
1424 ((
int*)
ptr) [i] = v;
1426 memset(
ptr + 0x1000, 0x44, 0x1000);
1429 w32(0x3c94, (
r32(0x3c94) &~0x800000FF) | var_2);
1431 w32(0x3c94,
r32(0x3c94) | 0x80000000);
1445 0xEBBCB7D0, 0xB7599E02, 0x0AEA2A7A, 0x2CABD6B8,
1446 0xA5A5A5A5, 0xA5A5A5A5, 0xE57C27BE, 0x43FA90AA,
1447 0x9D065F66, 0x360A6AD8, 0xA5A5A5A5, 0xA5A5A5A5,
1448 0xA5A5A5A5, 0xEBBCB7D0, 0xB7599E02, 0x0AEA2A7A,
1449 0x2CABD6B8, 0xA5A5A5A5, 0xA5A5A5A5, 0xE57C27BE,
1450 0x43FA90AA, 0x9D065F66, 0x360A6AD8, 0xA5A5A5A5
1455 if (!(fail & (1<< ixxx)))
1472 printf(
"EDRAM %08x, %08x\n", var_1, var_2);
void edram_9e4(struct XenosDevice *xe)
int edram_p2(int r3, int r4, int r5, int r6, int r7, int r8, int r9, int r10)
uint32_t xenos_read32(int reg)
void edram_init_state1(void)
void edram_bec(struct XenosDevice *xe)
void xenos_write32(int reg, uint32_t val)
void edram_4c(struct XenosDevice *xe)
int edram_compare_crc(uint32_t *crc)
void edram_init(struct XenosDevice *xe)
void edram_974(struct XenosDevice *xe)
void edram_72c(struct XenosDevice *xe)
void Xe_pDebugSync(struct XenosDevice *xe)
void * Xe_pAlloc(struct XenosDevice *xe, u32 *phys, int size, int align)
void Xe_pSyncToDevice(struct XenosDevice *xe, volatile void *data, int len)
void Xe_pSyncFromDevice(struct XenosDevice *xe, volatile void *data, int len)
void Xe_Fatal(struct XenosDevice *xe, const char *fmt,...)
void xenon_smc_query_sensors(uint16_t *data)
uint32_t u32
32bit unsigned integer