11 #include "irx_imports.h"
19 const void *ImageStart;
20 const void *RomdirStart;
21 const void *RomdirEnd;
47 #ifdef IGREETING_DTL_T
51 const char *m_device_name;
52 void *m_delay_register;
53 int m_delay_register_value;
56 int m_config_offset_1;
57 int m_config_offset_2;
62 int m_address_register;
65 int m_flash_blocksize;
68 struct romflash_sigcheck_res
70 void *m_config_addr_1;
71 void *m_config_addr_2;
74 int m_manufacturer_res;
79 #ifdef IGREETING_DTL_T
80 static void do_get_dip_switch_values_chr(
char *str,
int val,
int count);
82 static struct RomImgData *GetIOPRPStat(
const u32 *start_addr,
const u32 *end_addr,
struct RomImgData *rid);
86 do_find_extinfo_entry(
const struct RomdirFileStat *rdfs,
unsigned int extinfo_type);
87 #ifdef IGREETING_DTL_T
88 static const struct rominfo_item *flash_probe(
const struct rominfo_item *rii);
91 #ifdef IGREETING_DTL_T
92 static const char *boardinfo_uma_dsw202 =
93 "\r\nUMA board DSW202\r\n --- PS kernel --\r\n Sw8 bit0 0^ use H1500, 1_ no use H1500 (CD-BOOT "
94 "only)\r\n Sw7 bit1 0^ display color bar 1_ no color bar\r\n Sw6 bit2 0^ IOP Kernel 1_ PS Kernel "
95 "(when PS mode)\r\n Sw5 bit3 0^ check cd-rom 1_ ignore cdrom always\r\n Sw4 bit4 0^ Dram 16M "
96 "1_ Dram 2M\r\n Sw3 bit5 0^ disable 1_ enable EE ssbus access\r\n --- IOP kernel --\r\n Sw5 bit3 "
97 "0^ Extr Wide DMA 1_ Extr Wide DMA disable\r\n Sw4 bit4 0^ Dram 16M 1_ Dram 2M\r\n Sw3 bit5 "
98 "0^ disable 1_ enable EE ssbus access\r\n --- EE --\r\n Sw2 bit6 0^ -- 1_ --\r\n "
99 "Sw1 bit7 0^ EE normal boot 1_ EE/GS self test\r\n\r\n";
100 static const char *boardinfo_common =
101 " --- PS kernel --\r\n D0 0^ use H1500, 1_ no use H1500 (CD-BOOT only)\r\n D1 0^ display color bar "
102 "1_ no color bar\r\n D2 0^ IOP Kernel 1_ PS Kernel (when PS mode)\r\n D3 0^ check cd-rom 1_ "
103 "ignore cdrom always\r\n D4 0^ Dram 8M 1_ Dram 2M\r\n D5 0^ disable 1_ enable EE ssbus "
104 "access\r\n --- IOP kernel --\r\n D0 0^ NTSC mode 1_ PAL mode\r\n D3 0^ Extr Wide DMA 1_ Extr "
105 "Wide DMA disable\r\n D4 0^ Dram 8M 1_ Dram 2M\r\n D5 0^ disable 1_ enable EE ssbus "
106 "access\r\n --- EE --\r\n D6 0^ -- 1_ --\r\n D7 0^ EE normal boot 1_ EE/GS self "
108 static const char *boardinfo_unknown =
"\r\nUnknown board\r\n";
110 static const char *romgen_eq_str =
" ROMGEN=";
111 #ifdef IGREETING_DTL_T
112 static const char *cpuid_eq_str =
" CPUID=";
114 static const char *cpuid_eq_str =
", IOP info (CPUID=";
116 static const char *cach_config_eq_str =
", CACH_CONFIG=";
117 #ifdef IGREETING_DTL_T
118 static struct rominfo_item default_list[] = {
119 {
"Gmain1-3, flash mode, Fujitsu 512K flash",
133 {
"Gmain4..., flash mode, Fujitsu 2M flash",
147 {
"Gmain4..., flash mode, AMD 2M flash",
161 {
"shimakawa sp, flash mode, Fujitsu 4M flash",
175 {NULL, NULL, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
178 int _start(
int ac,
char **av)
181 int cop0_processor_mode;
182 const char *iop_or_ps_mode_str;
184 const char *extinfo_id_str;
185 const char *comma_index;
188 #ifdef IGREETING_DTL_T
191 const char *board_type_str;
192 const char *board_info_str;
194 int board_has_wide_dma;
195 const char *rom_or_flashrom_boot_str;
197 char switch_values_str[16];
199 USE_IOP_MMIO_HWPORT();
204 boot_mode_4 = QueryBootMode(4);
205 #ifndef IGREETING_DTL_T
206 printf(
"\nPlayStation 2 ======== ");
210 switch ( *(u16 *)boot_mode_4 )
212 #ifndef IGREETING_DTL_T
214 printf(
"Hard reset boot");
218 printf(
"Soft reboot");
221 printf(
"Update rebooting..");
222 #ifdef IGREETING_DTL_T
223 boot_mode_3 = QueryBootMode(3);
225 printf(
" reset parameter for IOP=%08x_%08x", boot_mode_3[2], boot_mode_3[1]);
229 printf(
"Update reboot complete");
236 if ( !boot_mode_4 || !*(u16 *)boot_mode_4 )
239 #ifdef IGREETING_DTL_T
241 boardtype_int = iop_mmio_hwport->exp2_r2[4612];
242 board_info_str = boardinfo_common;
243 board_has_wide_dma = 1;
244 switch ( boardtype_int & 0xF8 )
247 board_type_str =
"\r\nGmain-1.0 board DSW602\r\n";
250 board_type_str =
"\r\nGmain-2.0 board DSW602\r\n";
253 board_type_str =
"\r\nGmain-3.0 board DSW602\r\n";
256 board_type_str =
"\r\nB3system-1.0 front dipsw\r\n";
257 board_has_wide_dma = 0;
260 board_type_str =
"\r\nGmain-4.0 board DSW602\r\n";
263 board_type_str =
"\r\nGmain-5.0 board DSW602\r\n";
266 board_type_str =
"\r\nMPU-4.0 board DSW602\r\n";
267 board_has_wide_dma = 0;
270 board_type_str =
"\r\nGmain-10.0/11.0 board DSW602\r\n";
273 board_type_str =
"\r\nGmain-12.0 board DSW602\r\n";
276 board_type_str =
"\r\nGmain-13.0 board DSW602\r\n";
279 board_info_str = boardinfo_unknown;
280 board_has_wide_dma = 0;
283 if ( boardtype_int < 2 )
285 board_info_str = boardinfo_uma_dsw202;
286 board_has_wide_dma = (boardtype_int & 0xFE) == 0;
288 write(1, (
char *)board_type_str, strlen(board_type_str));
290 write(1, (
char *)board_info_str, strlen(board_info_str));
291 write(1, (
char *)cpuid_eq_str, strlen(cpuid_eq_str));
292 printf(
"%x", cop0_processor_mode);
293 write(1, (
char *)romgen_eq_str, strlen(romgen_eq_str));
294 printf(
"%04x-%04x", *(vu16 *)(0xBFC00102), *(vu16 *)(0xBFC00100));
296 write(1, (
char *)romgen_eq_str, strlen(romgen_eq_str));
297 printf(
"%04x-%04x", *(vu16 *)(0xBFC00102), *(vu16 *)(0xBFC00100));
298 write(1, (
char *)cpuid_eq_str, strlen(cpuid_eq_str));
299 printf(
"%x", cop0_processor_mode);
301 write(1, (
char *)cach_config_eq_str, strlen(cach_config_eq_str));
302 printf(
"%lx, %ldMB", (
unsigned long)*(vu32 *)(0xFFFE0130), (
long)((u32)QueryMemSize() + 256) >> 20);
303 if ( cop0_processor_mode >= 16 )
305 #ifdef IGREETING_DTL_T
306 iop_or_ps_mode_str = ((iop_mmio_hwport->iop_sbus_ctrl[0] & 8) != 0) ?
", PS mode" :
", IOP mode";
308 iop_or_ps_mode_str = ((iop_mmio_hwport->iop_sbus_ctrl[0] & 8) != 0) ?
", PS mode)\r\n" :
", IOP mode)\r\n";
310 write(1, (
char *)iop_or_ps_mode_str, strlen(iop_or_ps_mode_str));
312 #ifdef IGREETING_DTL_T
314 rom_or_flashrom_boot_str = (flash_probe(default_list)) ?
", FlashROM boot\r\n" :
", ROM boot\r\n";
316 write(1, (
char *)rom_or_flashrom_boot_str, strlen(rom_or_flashrom_boot_str));
320 GetIOPRPStat((u32 *)0xBFC00000, (u32 *)0xBFC10000, &rid)
321 && GetFileStatFromImage(&rid,
"ROMDIR\x00\x00\x00\x00\x00", &rdfs) )
323 extinfo_entry = do_find_extinfo_entry(&rdfs, 3);
326 extinfo_id_str = (
const char *)extinfo_entry->payload;
327 comma_index = rindex(extinfo_id_str,
',');
330 write(1, (
char *)extinfo_id_str, comma_index ? (comma_index - extinfo_id_str) : (
int)strlen(extinfo_id_str));
331 printf(
":%ld>\n", (
long)(u16)(uiptr)extinfo_id_str);
334 #ifdef IGREETING_DTL_T
335 write(1,
" SW=b7:", 7);
336 do_get_dip_switch_values_chr(switch_values_str, (u8)iop_mmio_hwport->exp2_r2[4352], 8);
337 write(1, switch_values_str, 8);
339 boot_mode_2 = QueryBootMode(2);
342 printf(
", RESET parameter EE=%08x_%08x", boot_mode_2[2], boot_mode_2[1]);
343 boot_mode_3 = QueryBootMode(3);
345 printf(
", IOP=%08x_%08x", boot_mode_3[2], boot_mode_3[1]);
348 if ( board_has_wide_dma )
350 tmp_dma_wide_ch = iop_mmio_hwport->exp2_r2[4608];
351 iop_mmio_hwport->exp2_r2[4608] = -1;
352 printf(
" DMA_WIDE_CH=%x\n", (u8)iop_mmio_hwport->exp2_r2[4608]);
353 iop_mmio_hwport->exp2_r2[4608] = tmp_dma_wide_ch;
355 if ( (iop_mmio_hwport->exp2_r2[4352] & (1 << 5)) != 0 )
357 iop_mmio_hwport->iop_sbus_ctrl[0] |= 1;
364 #ifdef IGREETING_DTL_T
365 static void do_get_dip_switch_values_chr(
char *str,
int val,
int count)
369 for ( i = 0; i <
count; i += 1 )
371 str[i] = (((val >> ((
count - i) - 1)) & 1) != 0) ?
'_' :
'^';
376 static struct RomImgData *GetIOPRPStat(
const u32 *start_addr,
const u32 *end_addr,
struct RomImgData *rid)
378 unsigned int cur_offset;
380 for ( cur_offset = 0; &start_addr[cur_offset >> 2] < end_addr; cur_offset += 16 )
383 start_addr[cur_offset >> 2] == 0x45534552 && start_addr[(cur_offset >> 2) + 1] == 0x54
384 && !(start_addr[(cur_offset >> 2) + 2] & 0xFFFF)
385 && ((start_addr[(cur_offset >> 2) + 3] + 15) & 0xFFFFFFF0) == cur_offset )
387 rid->ImageStart = start_addr;
388 rid->RomdirStart = &start_addr[cur_offset >> 2];
389 rid->RomdirEnd = (
char *)&start_addr[cur_offset >> 2] + *(&start_addr[cur_offset >> 2] + 7);
400 int cur_addr_aligned;
401 int total_extinfo_size;
404 char cur_romdir_name[12];
406 cur_addr_aligned = 0;
407 total_extinfo_size = 0;
408 memset(cur_romdir_name, 0,
sizeof(cur_romdir_name));
409 for ( i = 0; i < 12 && filename[i] >=
' '; i += 1 )
411 cur_romdir_name[i] = filename[i];
413 for ( RomdirStart = (
const struct RomDirEntry *)rid->RomdirStart;
414 (u32 *)(RomdirStart->name) != (u32 *)(cur_romdir_name)
415 && (u32 *)(RomdirStart->name + 4) != (u32 *)(cur_romdir_name + 4)
416 && (u16 *)(RomdirStart->name + 8) != (u16 *)(cur_romdir_name + 8);
419 cur_addr_aligned += ((RomdirStart->size) + 15) & 0xFFFFFFF0;
420 total_extinfo_size += (s16)RomdirStart->ExtInfoEntrySize;
422 if ( !*(u32 *)RomdirStart->name )
424 rdfs->romdirent = RomdirStart;
425 rdfs->extinfo = RomdirStart->ExtInfoEntrySize ?
426 (
const struct ExtInfoFieldEntry *)((
const char *)rid->RomdirEnd + total_extinfo_size) :
428 rdfs->data = &((
char *)rid->ImageStart)[cur_addr_aligned];
437 extinfo = rdfs->extinfo;
438 extinfo_end = &extinfo[(
unsigned int)((s16)rdfs->romdirent->ExtInfoEntrySize) >> 2];
439 for ( ; extinfo < extinfo_end;
440 extinfo = (
const struct ExtInfoFieldEntry *)((
char *)extinfo + ((extinfo->ExtLength) & 0xFC) + 4) )
442 if ( extinfo->type == extinfo_type )
450 #ifdef IGREETING_DTL_T
451 static void flash_reset(
const struct rominfo_item *rii)
454 switch ( rii->m_write_width )
457 *((vu8 *)rii->m_base_address + rii->m_config_offset_1) = 0xF0;
460 *((vu16 *)rii->m_base_address + rii->m_config_offset_1) = 0xF0;
468 static int checksig(
const struct rominfo_item *rii,
struct romflash_sigcheck_res *rsr,
int offset)
470 u8 *effective_address_1;
471 u16 *effective_address_2;
472 int tmp_manufacturer;
473 USE_IOP_MMIO_HWPORT();
476 tmp_manufacturer = rii->m_manufacturer;
477 switch ( rii->m_write_width )
480 effective_address_1 = (u8 *)((u8 *)rii->m_base_address + offset);
481 rsr->m_config_addr_1 = &effective_address_1[rii->m_config_offset_1];
482 rsr->m_config_addr_2 = &effective_address_1[rii->m_config_offset_2];
483 rsr->m_base = effective_address_1;
484 rsr->m_base_end = &effective_address_1[rii->m_chunk_size];
485 *(vu8 *)rsr->m_config_addr_1 = 0xAA;
486 *(vu8 *)rsr->m_config_addr_2 = 0x55;
487 *(vu8 *)rsr->m_config_addr_1 = 0x90;
488 *(vu32 *)&iop_mmio_hwport->exp2_r2[4352] = 0xFFFFFF6F;
489 rsr->m_manufacturer_res = *((vu8 *)rsr->m_base);
490 rsr->m_device_id_res = *((vu8 *)rsr->m_base_end);
493 effective_address_2 = (u16 *)((u8 *)rii->m_base_address + offset);
494 rsr->m_config_addr_1 = &effective_address_2[rii->m_config_offset_1];
495 rsr->m_config_addr_2 = &effective_address_2[rii->m_config_offset_2];
496 rsr->m_base = effective_address_2;
497 rsr->m_base_end = &effective_address_2[rii->m_chunk_size];
498 *(vu16 *)rsr->m_config_addr_1 = 0xAA;
499 *(vu16 *)rsr->m_config_addr_2 = 0x55;
500 *(vu16 *)rsr->m_config_addr_1 = 0x90;
501 *(vu32 *)&iop_mmio_hwport->exp2_r2[4352] = 0xFFFFFF6F;
502 rsr->m_manufacturer_res = *((vu16 *)rsr->m_base);
503 rsr->m_device_id_res = *((vu16 *)rsr->m_base_end);
509 if ( !tmp_manufacturer && (rsr->m_manufacturer_res == 1 || rsr->m_manufacturer_res == 4) )
510 tmp_manufacturer = rsr->m_manufacturer_res;
511 return (rsr->m_manufacturer_res == tmp_manufacturer) && (rsr->m_device_id_res == rii->m_device_id);
514 static int flash_checksig(
const struct rominfo_item *rii)
521 struct romflash_sigcheck_res rsr;
522 USE_IOP_MMIO_HWPORT();
524 memset(&rsr, 0,
sizeof(rsr));
527 if ( rii->m_address_register )
529 old_address_reg = iop_mmio_hwport->ssbus2.ind_1_address;
530 iop_mmio_hwport->ssbus2.ind_1_address = rii->m_address_register;
532 if ( rii->m_delay_register )
534 old_delay_reg = *((vu32 *)rii->m_delay_register);
535 *((vu32 *)rii->m_delay_register) = rii->m_delay_register_value;
536 *(vu32 *)&iop_mmio_hwport->exp2_r2[4352] = *(vu32 *)rii->m_delay_register;
538 flash_chunks = rii->m_flash_size / rii->m_flash_blocksize;
539 for ( cur_flash_chunk = 0;
540 (condtmp1 = checksig(rii, &rsr, flash_chunks * cur_flash_chunk)) && (cur_flash_chunk < rii->m_flash_blocksize);
541 cur_flash_chunk += 1 )
546 if ( rii->m_delay_register )
548 *((vu32 *)rii->m_delay_register) = old_delay_reg;
549 *(vu32 *)&iop_mmio_hwport->exp2_r2[4352] = *(vu32 *)rii->m_delay_register;
551 if ( rii->m_address_register )
552 iop_mmio_hwport->ssbus2.ind_1_address = old_address_reg;
557 static const struct rominfo_item *flash_probe(
const struct rominfo_item *rii)
560 for ( ; rii->m_write_width; rii += 1 )
562 if ( flash_checksig(rii) )