📄 syscon_platform.c
字号:
************************************************************************/static UINT32com_iic_baudrate_atlas_read( void *param, void *data, UINT32 size ){ *(UINT8*)param = ATLAS_IICFREQ_103125HZ; return OK;}/************************************************************************ * board_eeprom_def_generic_read ************************************************************************/static UINT32board_eeprom_def_generic_read( void *param, void *data, UINT32 size ){ *(t_syscon_eeprom_def **)param = eeprom_def; return OK;}/************************************************************************ * * eeprom_read * Description : * ------------- * * Read eeprom data by calling EEPROM driver * * Return values : * --------------- * * Driver return value (OK in case of no error) * ************************************************************************/static INT32 eeprom_read( UINT32 minor, /* Minor device number */ UINT32 offset, /* Byte position */ UINT32 length, /* Byte count */ void *user_variable ) /* Buffer for data */{ t_EEPROM_read_descriptor readbuf; readbuf.offset = offset + EEPROM_COM_EN0_BASE; readbuf.length = length; readbuf.buffer = user_variable; return IO_read( SYS_MAJOR_EEPROM_IIC, minor, &readbuf );}/************************************************************************ * Implementation : Public functions ************************************************************************//************************************************************************ * * syscon_get_eeprom_data * Description : * ------------- * * Read data store in EEPROM. * Data is stored in the format defined in file eeprom_nm24c09_layout.h * * Return values : * --------------- * * None * ************************************************************************/voidsyscon_get_eeprom_data( t_mac_addr **mac_addr, /* Set to mac addr (NULL if invalid) */ t_sn_bcd **sn ) /* Set to S/N (NULL if invalid) */{ t_eeprom_layout eeprom; UINT32 minor = EEPROM_MINOR_NM24C09; UINT8 csum, csum_read; UINT32 pos; UINT8 id, len; UINT8 value[255]; UINT32 *amd_base; static bool first = TRUE; if( (sys_platform != PRODUCT_MALTA_ID) && (sys_platform != PRODUCT_ATLASA_ID) ) { goto eeprom_error; } /* Self-initialisation */ if( first ) first = FALSE; else { if( mac_addr ) *mac_addr = mac_addr_read; if( sn ) *sn = sn_read; return; } /* Initial values */ pos = 0; mac_addr_read = NULL; sn_read = NULL; /* Version */ if( eeprom_read( minor, pos++, 1, &eeprom.version ) != OK ) goto eeprom_error; csum = eeprom.version; switch( eeprom.version ) { case EEPROM_VERSION_1 : /* Count */ if( eeprom_read( minor, pos++, 1, &eeprom.count ) != OK ) goto eeprom_error; csum += eeprom.count; while( eeprom.count-- ) { /**** Read field ****/ /* ID */ if( eeprom_read( minor, pos++, 1, &id ) != OK ) goto eeprom_error; csum += id; /* len */ if( eeprom_read( minor, pos++, 1, &len ) != OK ) goto eeprom_error; csum += len; /* Read field */ if( eeprom_read( minor, pos, len, value ) != OK ) goto eeprom_error; switch( id ) { case EEPROM_ID_MAC : /* MAC address */ if( len == SYS_MAC_ADDR_SIZE ) { mac_addr_read = &mac_addr_buffer; memcpy( mac_addr_buffer, value, len ); } else goto eeprom_error; break; case EEPROM_ID_SN : /* Serial number */ if( len == SYS_SN_BCD_SIZE ) { sn_read = &sn_buffer; memcpy( sn_buffer, value, len ); } else goto eeprom_error; break; default : /* Ignore */ break; } pos += len; while( len-- ) csum += value[len]; } /* Read checksum */ if( eeprom_read( minor, pos, 1, &csum_read ) != OK ) goto eeprom_error; if( csum_read != csum ) goto eeprom_error; break; default : /* Unknown eeprom format */ goto eeprom_error; } if( sys_platform == PRODUCT_MALTA_ID ) { /* Get MAC-address from AMD-EEPROM */ if( SYSCON_read( SYSCON_BOARD_AM79C973_BASE_ID, &(amd_base), sizeof(amd_base) ) == OK ) { amd_base = (void *)KSEG1( amd_base ) ; REG( &amd_mac_addr, WORD0 ) = LE32_TO_CPU( REG( amd_base, WORD0 ) ) ; REG( &amd_mac_addr, WORD1 ) = LE32_TO_CPU( REG( amd_base, WORD1 ) ) ; mac_addr_read = (void*)&amd_mac_addr ; } else { mac_addr_read = NULL ; } } if( mac_addr ) *mac_addr = mac_addr_read; if( sn ) *sn = sn_read; return;eeprom_error : mac_addr_read = NULL; sn_read = NULL; if( mac_addr ) *mac_addr = NULL; if( sn ) *sn = NULL;}/************************************************************************ * * syscon_arch_board_init * Description : * ------------- * * Initialize platform specific part of SYSCON (except TTY related parts) * * Return values : * --------------- * * None * ************************************************************************/void syscon_arch_board_init( t_syscon_obj *objects ) /* Array of SYSCON objects */{ syscon_objects = objects; switch( sys_platform ) { case PRODUCT_MALTA_ID : case PRODUCT_ATLASA_ID : /* Core card specifics */ if( sys_platform == PRODUCT_MALTA_ID ) { syscon_arch_core_init( objects, /* RAM size */ MALTA_SYSTEMRAM_SIZE, /* PCI memory space (transparent) */ MALTA_PCI_MEM_BASE, MALTA_PCI_MEM_SIZE, 0, /* PCI IO space (non-transparent) */ 0, MALTA_PCI_IO_SIZE, MALTA_PCI_IO_BASE ); } else { syscon_arch_core_init( objects, /* RAM size */ ATLAS_SYSTEMRAM_SIZE, /* PCI Memory space (transparent) */ ATLAS_PCI_MEM_BASE, ATLAS_PCI_MEM_SIZE, 0, /* PCI IO space (transparent) */ ATLAS_PCI_IO_BASE, ATLAS_PCI_IO_SIZE, 0 ); } /* Setup LED display addresses. * Atlas and Malta have same mapping. */ alpha_display_size = 8; alpha_io[0] = (UINT32 *)(KSEG1BASE + ATLAS_ASCIIPOS0); alpha_io[1] = (UINT32 *)(KSEG1BASE + ATLAS_ASCIIPOS1); alpha_io[2] = (UINT32 *)(KSEG1BASE + ATLAS_ASCIIPOS2); alpha_io[3] = (UINT32 *)(KSEG1BASE + ATLAS_ASCIIPOS3); alpha_io[4] = (UINT32 *)(KSEG1BASE + ATLAS_ASCIIPOS4); alpha_io[5] = (UINT32 *)(KSEG1BASE + ATLAS_ASCIIPOS5); alpha_io[6] = (UINT32 *)(KSEG1BASE + ATLAS_ASCIIPOS6); alpha_io[7] = (UINT32 *)(KSEG1BASE + ATLAS_ASCIIPOS7); /* Setup EEPROM data */ eeprom_count = 2; eeprom_def[0].minor = EEPROM_MINOR_NM24C09; eeprom_def[0].name = eeprom_system_name; eeprom_def[0].descr = eeprom_system_descr; eeprom_def[1].minor = EEPROM_MINOR_SPD000; eeprom_def[1].name = eeprom_spd0_name; eeprom_def[1].descr = eeprom_spd0_descr; break; case PRODUCT_SEAD_ID : case PRODUCT_SEAD2_ID : if (sys_corecard == MIPS_REVISION_CORID_SEAD_MSC01) { sys_nb_base = KSEG1(SEAD_MSC01_REG_BASE); syscon_arch_core_init( objects, 0, 0, 0, 0, 0, 0, 0 ); } /* Setup LED display addresses */ alpha_display_size = 8; alpha_io[0] = (UINT32 *)(KSEG1BASE + SEAD_ASCIIPOS0); alpha_io[1] = (UINT32 *)(KSEG1BASE + SEAD_ASCIIPOS1); alpha_io[2] = (UINT32 *)(KSEG1BASE + SEAD_ASCIIPOS2); alpha_io[3] = (UINT32 *)(KSEG1BASE + SEAD_ASCIIPOS3); alpha_io[4] = (UINT32 *)(KSEG1BASE + SEAD_ASCIIPOS4); alpha_io[5] = (UINT32 *)(KSEG1BASE + SEAD_ASCIIPOS5); alpha_io[6] = (UINT32 *)(KSEG1BASE + SEAD_ASCIIPOS6); alpha_io[7] = (UINT32 *)(KSEG1BASE + SEAD_ASCIIPOS7); /* Setup EEPROM data */ eeprom_count = 1; eeprom_def[0].minor = EEPROM_MINOR_SPD000; eeprom_def[0].name = eeprom_spd0_name; eeprom_def[0].descr = eeprom_spd0_descr; /* The objects below are usually registered by * syscon_arch_core_init(), but this function is not called * for SEAD and SEAD-2 cards, since they don't have a core * card. */ syscon_register_generic( SYSCON_BOARD_SYSTEMRAM_BASE_ID, board_systemram_base_sead_read, NULL, NULL, NULL ); syscon_register_generic( SYSCON_BOARD_SYSTEMRAM_SIZE_ID, board_systemram_size_sead_read, NULL, NULL, NULL ); if (sys_corecard == MIPS_REVISION_CORID_SEAD_MSC01) break; syscon_register_generic( SYSCON_BOARD_SYSTEMRAM_REFRESH_NS_CFG_ID, board_systemram_refresh_ns_sead_read, NULL, board_systemram_refresh_ns_sead_write, NULL ); syscon_register_generic( SYSCON_BOARD_SYSTEMRAM_SRASPRCHG_CYCLES_CFG_ID, board_systemram_srasprchg_cycles_sead_read, NULL, board_systemram_srasprchg_cycles_sead_write, NULL ); syscon_register_generic( SYSCON_BOARD_SYSTEMRAM_SRAS2SCAS_CYCLES_CFG_ID, board_systemram_sras2scas_cycles_sead_read, NULL, board_systemram_sras2scas_cycles_sead_write, NULL ); syscon_register_generic( SYSCON_BOARD_SYSTEMRAM_CASLAT_CYCLES_CFG_ID, board_systemram_caslat_cycles_sead_read, NULL, NULL, NULL ); syscon_register_generic( SYSCON_BOARD_SYSTEMRAM_READ_BURSTLEN_CFG_ID, board_systemram_read_burstlen_sead_read, NULL, NULL, NULL ); syscon_register_generic( SYSCON_BOARD_SYSTEMRAM_WRITE_BURSTLEN_CFG_ID, board_systemram_write_burstlen_sead_read, NULL, NULL, NULL ); break; default : break; } /* Register objects */ syscon_register_generic( SYSCON_BOARD_PRODUCTID_ID, board_productid_generic_read, NULL, NULL, NULL ); syscon_register_generic( SYSCON_BOARD_PRODUCTREV_ID, board_productrev_generic_read, NULL, NULL, NULL ); syscon_register_generic( SYSCON_BOARD_REVISION_ID, board_revision_generic_read, NULL, NULL, NULL ); syscon_register_generic( SYSCON_BOARD_NMI_STATUS_ID, board_nmi_status_generic_read, NULL, NULL, NULL ); syscon_register_id_board( SYSCON_BOARD_PRODUCTNAME_ID, /* Atlas */ board_productname_read, (void *)name_atlas, NULL, NULL, /* SEAD */ board_productname_read, (sys_platform == PRODUCT_SEAD_ID) ? (void *)name_sead : (void *)name_sead2, NULL, NULL, /* Malta */ board_productname_read, (void *)name_malta, NULL, NULL ); syscon_register_id_board( SYSCON_BOARD_NMI_WERR_ID, /* Atlas */ board_nmi_werr_atlas_malta_read, NULL, NULL, NULL, /* SEAD */ board_nmi_werr_sead_read, NULL, NULL, NULL, /* Malta */ board_nmi_werr_atlas_malta_read, NULL, NULL, NULL ); syscon_register_id_board( SYSCON_BOARD_NMI_ACK_ID, /* Atlas */ NULL, NULL, board_nmi_ack_atlas_malta_write, NULL, /* SEAD */ NULL, NULL, board_nmi_ack_sead_write, NULL, /* Malta */ NULL, NULL, board_nmi_ack_atlas_malta_write, NULL ); syscon_register_id_board( SYSCON_BOARD_CORECARDID_ID, /* Atlas */ board_corecardid_atlas_malta_read, NULL, NULL, NULL, /* SEAD */ NULL, NULL, NULL, NULL, /* Malta */ board_corecardid_atlas_malta_read, NULL, NULL, NULL ); syscon_register_id_board( SYSCON_BOARD_CORECARDREV_ID, /* Atlas */ board_corecardrev_atlas_malta_read, NULL, NULL, NULL, /* SEAD */ NULL, NULL, NULL, NULL, /* Malta */ board_corecardrev_atlas_malta_read, NULL, NULL, NULL ); syscon_register_id_board( SYSCON_BOARD_FPGAREV_ID, /* Atlas */ board_fpgarev_atlas_malta_read, NULL, NULL, NULL, /* SEAD */ NULL, NULL, NULL, NULL, board_fpgarev_atlas_malta_read, NULL, NULL, NULL ); syscon_register_id
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -