void load_board_hw_info(void) { unsigned int size = HW_INFO_TOTAL_SIZE; int ret; #if defined(CONFIG_LOAD_ONE_WIRE) ret = load_1wire_info(buffer, size, &sn, &rev); #endif #if defined(CONFIG_LOAD_EEPROM) ret = load_eeprom_info(buffer, size, 0, &sn, &rev); #endif if (ret) { #if defined(CONFIG_LOAD_ONE_WIRE) dbg_info("\n1-Wire: "); #endif #if defined(CONFIG_LOAD_EEPROM) dbg_info("\nEEPROM: "); #endif dbg_info("Using default information\n"); sn = set_default_sn(); rev = set_default_rev(); } #ifdef AT91C_BASE_GPBR writel(sn, AT91C_BASE_GPBR + 4 * 2); writel(rev, AT91C_BASE_GPBR + 4 * 3); #endif #if defined(CONFIG_LOAD_ONE_WIRE) dbg_info("\n1-Wire: "); #endif #if defined(CONFIG_LOAD_EEPROM) dbg_info("\nEEPROM: "); #endif dbg_info("Board sn: %x revision: %x\n\n", sn, rev); return; }
/******************************************************************************* * SN layout * * 31 30 25 20 15 10 5 0 * ----------------------------------------------------------------------- * | | Vendor ID| Board ID | Vendor ID| Board ID | Vendor ID| Board ID | * ----------------------------------------------------------------------- * | EK | DM | CPU | * * Rev layout * * 31 24 21 18 15 10 5 0 * ----------------------------------------------------------------------- * | | EK | DM | CPU | EK | DM | CPU | * ----------------------------------------------------------------------- * | Revision id | Revision Code | * ******************************************************************************* */ void load_1wire_info(void) { int i, j; unsigned int cnt; unsigned int size = LEN_ONE_WIRE_INFO; struct board_info board_info; struct board_info *bd_info; #if defined(CONFIG_SAMA5D4EK) int missing = BOARD_TYPE_EK_MASK | BOARD_TYPE_DM_MASK; #else int missing = BOARD_TYPE_MASK; #endif unsigned char *tmp = buf; memset(&board_info, 0, sizeof(board_info)); bd_info= &board_info; dbg_info("1-Wire: Loading 1-Wire information ...\n"); sn = rev = 0; cnt = enumerate_all_rom(); if (!cnt) { dbg_info("WARNING: 1-Wire: No 1-Wire chip found\n "); goto err; } dbg_info("1-Wire: BoardName | [Revid] | VendorName\n"); for (i = 0; i < cnt; i++) { if (ds24xx_read_memory(i, 0, 0, size, buf) < 0) { dbg_info("WARNING: 1-Wire: Failed to read from 1-Wire chip!\n"); goto err; } dbg_loud("board: #%d: ", i); for (j = 0; j < size; j++) dbg_loud("%d ", *tmp++); dbg_loud("\n"); if (get_board_info(buf, i, bd_info)) { continue; } switch (bd_info->board_type) { case BOARD_TYPE_CPU: missing &= (BOARD_TYPE_MASK & ~BOARD_TYPE_CPU_MASK); sn |= (bd_info->board_id & SN_MASK); sn |= ((bd_info->vendor_id & VENDOR_MASK) << CM_VENDOR_OFFSET); rev |= ((bd_info->revision_code - 'A') & REV_MASK); rev |= (((bd_info->revision_id - '0') & REV_ID_MASK) << CM_REV_ID_OFFSET); break; case BOARD_TYPE_DM: missing &= (BOARD_TYPE_MASK & ~BOARD_TYPE_DM_MASK); sn |= ((bd_info->board_id & SN_MASK) << DM_SN_OFFSET); sn |= ((bd_info->vendor_id & VENDOR_MASK) << DM_VENDOR_OFFSET); rev |= (((bd_info->revision_code - 'A') & REV_MASK) << DM_REV_OFFSET); rev |= (((bd_info->revision_id - '0') & REV_ID_MASK) << DM_REV_ID_OFFSET); break; case BOARD_TYPE_EK: missing &= (BOARD_TYPE_MASK & ~BOARD_TYPE_EK_MASK); sn |= ((bd_info->board_id & SN_MASK) << EK_SN_OFFSET); sn |= ((bd_info->vendor_id & VENDOR_MASK) << EK_VENDOR_OFFSET); rev |= (((bd_info->revision_code - 'A') & REV_MASK) << EK_REV_OFFSET); rev |= (((bd_info->revision_id - '0') & REV_ID_MASK) << EK_REV_ID_OFFSET); break; default: dbg_info("WARNING: 1-Wire: Unknown board type\n"); goto err; } } if (missing & BOARD_TYPE_CPU_MASK) dbg_info("1-Wire: Failed to read CM board information\n"); if (missing & BOARD_TYPE_DM_MASK) dbg_info("1-Wire: Failed to read DM board information\n"); if (missing & BOARD_TYPE_EK_MASK) dbg_info("1-Wire: Failed to read EK board information\n"); goto save_info; err: dbg_info("\n1-Wire: Using defalt information\n"); sn = set_default_sn(); rev = set_default_rev(); save_info: #ifdef AT91C_BASE_GPBR /* save to GPBR #2 and #3 */ dbg_info("\n1-Wire: SYS_GPBR2: %d, SYS_GPBR3: %d\n\n", sn, rev); writel(sn, AT91C_BASE_GPBR + 4 * 2); writel(rev, AT91C_BASE_GPBR + 4 * 3); #else dbg_info("\n1-Wire: Board sn: %d, revsion: %d\n\n", sn, rev); #endif return; }
/******************************************************************************* * SN layout * * 32 30 25 20 15 10 5 0 * ----------------------------------------------------------------------- * | | Vendor ID| Board ID | Vendor ID| Board ID | Vendor ID| Board ID | * ----------------------------------------------------------------------- * | EK | DM | CPU | * * Rev layout * * 32 24 21 18 15 10 5 0 * ----------------------------------------------------------------------- * | | EK | DM | CPU | EK | DM | CPU | * ----------------------------------------------------------------------- * | Revision id | Revision Code | * ******************************************************************************* */ void load_1wire_info() { int i; unsigned int cnt; unsigned int size = LEN_ONE_WIRE_INFO; struct board_info board_info; struct board_info *bd_info; memset(&board_info, 0, sizeof(board_info)); bd_info= &board_info; dbg_log(1, "1-Wire: Loading 1-Wire information ...\n\r"); sn = rev = 0; cnt = enumerate_all_rom(); if (!cnt) { dbg_log(1, "WARNING: 1-Wire: No 1-Wire chip found\n\r "); goto err; } dbg_log(1, "1-Wire: BoardName | [Revid] | VendorName\n\r"); for (i = 0; i < cnt; i++) { if (ds24xx_read_memory(i, 0, 0, size, buf) < 0) { dbg_log(1, "WARNING: 1-Wire: Failed to read from 1-Wire chip!\n\r"); goto err; } if (get_board_info(buf, i, bd_info)) { dbg_log(1, "WARNING: 1-Wire: Failed to get board information\n\r"); goto err; } switch (bd_info->board_type) { case BOARD_TYPE_CPU: sn |= (bd_info->board_id & SN_MASK); sn |= ((bd_info->vendor_id & VENDOR_MASK) << CM_VENDOR_OFFSET); rev |= ((bd_info->revision_code - 'A') & REV_MASK); rev |= (((bd_info->revision_id - '0') & REV_ID_MASK) << CM_REV_ID_OFFSET); break; case BOARD_TYPE_DM: sn |= ((bd_info->board_id & SN_MASK) << DM_SN_OFFSET); sn |= ((bd_info->vendor_id & VENDOR_MASK) << DM_VENDOR_OFFSET); rev |= (((bd_info->revision_code - 'A') & REV_MASK) << DM_REV_OFFSET); rev |= (((bd_info->revision_id - '0') & REV_ID_MASK) << DM_REV_ID_OFFSET); break; case BOARD_TYPE_EK: sn |= ((bd_info->board_id & SN_MASK) << EK_SN_OFFSET); sn |= ((bd_info->vendor_id & VENDOR_MASK) << EK_VENDOR_OFFSET); rev |= (((bd_info->revision_code - 'A') & REV_MASK) << EK_REV_OFFSET); rev |= (((bd_info->revision_id - '0') & REV_ID_MASK) << EK_REV_ID_OFFSET); break; default: dbg_log(1, "WARNING: 1-Wire: Unknown board type\n\r"); goto err; } } /* save to GPBR #2 and #3 */ dbg_log(1, "\n\r1-Wire: SYS_GPBR2: %d, SYS_GPBR3: %d\n\r\n\r", sn, rev); writel(sn, AT91C_BASE_GPBR + 4 * 2); writel(rev, AT91C_BASE_GPBR + 4 * 3); return; err: sn = set_default_sn(); rev = set_default_rev(); dbg_log(1, "\n\r1-Wire: Using defalt value SYS_GPBR2: %d, SYS_GPBR3: %d\n\r\n\r", sn, rev); writel(sn, AT91C_BASE_GPBR + 4 * 2); writel(rev, AT91C_BASE_GPBR + 4 * 3); return; }