diff options
Diffstat (limited to 'ubi-utils/src/ubiinfo')
-rw-r--r-- | ubi-utils/src/ubiinfo/ubiflash.h | 185 | ||||
-rw-r--r-- | ubi-utils/src/ubiinfo/ubiinfo.c | 406 | ||||
-rw-r--r-- | ubi-utils/src/ubiinfo/ubiipl.h | 87 |
3 files changed, 0 insertions, 678 deletions
diff --git a/ubi-utils/src/ubiinfo/ubiflash.h b/ubi-utils/src/ubiinfo/ubiflash.h deleted file mode 100644 index 6883879..0000000 --- a/ubi-utils/src/ubiinfo/ubiflash.h +++ /dev/null @@ -1,185 +0,0 @@ -#ifndef _UBI_FLASH_H -#define _UBI_FLASH_H -/* - * Copyright (c) International Business Machines Corp., 2006 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -/* - * FLASH related data structures and constants for UBI. - * UBI scan analysis. - * - * IPL Initial Program Loader - * SPL Secondary Program Loader - */ - -#include <stdint.h> -#include <asm/byteorder.h> -#include <mtd/ubi-header.h> - -#define UBI_BLOCK_IDENT_MAX 16 - -/* Block status information constants */ -enum blockstat { - /* IO Error */ - STAT_IO_FAILED = 1, /* 0xffffffff */ - /* Block is bad */ - STAT_BLOCK_BAD = 2, /* 0xfffffffe */ - /* ECC unrecoverable error */ - STAT_ECC_ERROR = 3, /* 0xfffffffd */ - /* CRC checksum failed */ - STAT_CRC_ERROR = 4, /* 0xfffffffc */ - /* Magic number not available */ - STAT_NO_MAGIC = 5, /* 0xfffffffb */ - /* No image available */ - STAT_NO_IMAGE = 6, - /* Image is invalid */ - STAT_INVALID_IMAGE = 7, - /* Image is defect */ - STAT_DEFECT_IMAGE = 8, -}; - -/* - * Flash types - */ -enum flashtypes { - FLASH_TYPE_NAND = 1, - FLASH_TYPE_NOR, -}; - -/* Nand read buffer size: 2KiB + 64byte spare */ -#define NAND_READ_BUF_SIZE (2048 + 64) - -/* Size of the CRC table */ -#define CRC32_TABLE_SIZE 256 - -/* Image is not available marker for image offs */ -#define UBI_IMAGE_NOT_AVAILABLE 0xFFFFFFFF - -/* Increment this number, whenever you change the structure */ -#define UBI_SCAN_INFO_VERSION 2 - -/* Time measurement as far as the code size allows us to do this */ -#define UBI_TIMESTAMPS 16 - -/** - * struct ubi_scan_info - RAM table filled by IPL scan - * - * @version: Version of the structure - * @bootstatus: Boot status of the current boot - * @flashtype: Flash type (NAND/NOR) - * @flashid: ID of the flash chip - * @flashmfr: Manufacturer ID of the flash chip - * @flashsize: Size of the FLASH - * @blocksize: Eraseblock size - * @blockshift: Shift count to calc block number from offset - * @nrblocks: Number of erase blocks on flash - * @pagesize: Pagesize (NAND) - * @blockinfo: Pointer to an array of block status information - * filled by FLASH scan - * @images: Pointer to FLASH block translation table sorted - * by image type and load order - * @imageblocks: Number of blocks found per image - * @imageoffs: Offset per imagetype to the first - * block in the translation table - * @imagedups duplicate blocks (max. one per volume) - * @imagelen: Length of the loaded image - * @crc32_table: CRC32 table buffer - * @page_buf: Page buffer for NAND FLASH - */ -struct ubi_scan_info { - int version; - unsigned int bootstatus; - unsigned int flashtype; - unsigned int flashid; - unsigned int flashmfr; - unsigned int flashsize; - unsigned int blocksize; - unsigned int blockshift; - unsigned int nrblocks; - unsigned int pagesize; - - struct ubi_vid_hdr *blockinfo; - struct ubi_vid_hdr **images; - unsigned int imageblocks[UBI_BLOCK_IDENT_MAX]; - unsigned int imageoffs[UBI_BLOCK_IDENT_MAX]; - struct ubi_vid_hdr *imagedups[UBI_BLOCK_IDENT_MAX]; - unsigned int imagelen; - uint32_t crc32_table[CRC32_TABLE_SIZE]; - uint8_t page_buf[NAND_READ_BUF_SIZE]; - unsigned int times[UBI_TIMESTAMPS]; -}; - -/* External function definition */ -extern int flash_read(void *buf, unsigned int offs, int len); -extern int flash_read_slice(struct ubi_scan_info *fi, void *buf, - unsigned int offs, int len); -extern void ipl_main(struct ubi_scan_info *fi); - -#ifndef CFG_EXAMPLE_IPL -extern int ipl_scan(struct ubi_scan_info *fi); -extern int ipl_load(struct ubi_scan_info *fi, int nr, uint8_t *loadaddr); - -#define IPL_STATIC - -#else -#define IPL_STATIC static -#endif - -/** - * get_boot_status - get the boot status register - * - * Shift the lower 16 bit into the upper 16 bit and return - * the result. - */ -uint32_t get_boot_status(void); - -/** - * set_boot_status - Set the boot status register - * - * @status: The status value to set - * - */ -void set_boot_status(uint32_t status); - -static inline unsigned int ubi_vid_offset(struct ubi_scan_info *fi) -{ - if (fi->flashtype == FLASH_TYPE_NOR) - return UBI_EC_HDR_SIZE; - else - return fi->pagesize - UBI_VID_HDR_SIZE; -} - -static inline unsigned int ubi_data_offset(struct ubi_scan_info *fi) -{ - if (fi->flashtype == FLASH_TYPE_NOR) - return UBI_EC_HDR_SIZE + UBI_VID_HDR_SIZE; - else - return fi->pagesize; -} - -/** - * IPL checkpoints - */ -#define CHKP_HWINIT 0x3030 -#define CHKP_IPLSCAN_FAILED 0x3034 -#define CHKP_SPL_START 0x3037 -#define CHKP_SPLLOAD_STATUS 0x3130 - -extern void checkpoint(uint32_t cpoint); -extern void switch_watchdog(void); - -#endif diff --git a/ubi-utils/src/ubiinfo/ubiinfo.c b/ubi-utils/src/ubiinfo/ubiinfo.c deleted file mode 100644 index 6f7443b..0000000 --- a/ubi-utils/src/ubiinfo/ubiinfo.c +++ /dev/null @@ -1,406 +0,0 @@ -/* - * Copyright (c) International Business Machines Corp., 2006 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -/* - * Print out information about the UBI table this IPL is using. This - * can be used afterwards to analyze misbehavior of the IPL code. The - * input this program requires is the last 1 MiB DDRAM of our system - * where the scanning table is placed into. - * - * Author: Frank Haverkamp <haver@vnet.ibm.com> - */ - -#include <stdlib.h> -#include <stdio.h> -#include <unistd.h> -#include <string.h> -#include <time.h> -#include <argp.h> -#include <getopt.h> -#include <stdint.h> -#include <sys/time.h> -#include <netinet/in.h> - -#define __unused __attribute__((unused)) - -/* This should hopefully be constant and the same in all - * configurations. - */ -#define CFG_IPLSIZE 512 -#define CFG_SPLCODE 512 -#define MEMTOP 0x06600000 /* Sunray 102 MiB */ -#define MEMSIZE 0x00100000 /* 1 MiB */ -#define CODE_SIZE (64 * 1024) - -/* FIXME Except of the memory size this should be defined via - * parameters - * - * CFG_MEMTOP_BAMBOO 0x02000000 - * CFG_MEMTOP_SUNRAY 0x06600000 - */ - -#include "ubiipl.h" -#include "ubiflash.h" - -#define MIN(x,y) ((x)<(y)?(x):(y)) - -#define ERR_RET(rc) { \ - fprintf(stderr, "%s:%d failed rc=%d\n", __func__, \ - __LINE__, (rc)); \ - return (rc); \ - } - -#define VERSION "1.3" - -static error_t parse_opt (int key, char *arg, struct argp_state *state); -const char *argp_program_version = VERSION; -const char *argp_program_bug_address = "<haver@vnet.ibm.com>"; - -static char doc[] = "\nVersion: " VERSION "\n\t" - " at "__DATE__" "__TIME__"\n" - "\n" - "Test program\n"; - -static struct argp_option options[] = { - /* common settings */ - { .name = "verbose", - .key = 'v', - .arg = "<level>", - .flags = 0, - .doc = "Set verbosity level to <level>", - .group = OPTION_ARG_OPTIONAL }, - - { .name = "memtop", - .key = 'm', - .arg = "<memtop>", - .flags = 0, - .doc = "Set top of memory, 102 MiB for Sunray and 16 MiB for Bamboo", - .group = OPTION_ARG_OPTIONAL }, - - { .name = NULL, - .key = 0, - .arg = NULL, - .flags = 0, - .doc = NULL, - .group = 0 }, -}; - -typedef struct test_args { - int verbose; - unsigned long memtop; - char *arg1; - char **options; -} test_args; - -static struct test_args g_args = { - .memtop = MEMTOP, - .verbose = 0, - .arg1 = NULL, - .options = NULL, -}; - -static struct argp argp = { - options: options, - parser: parse_opt, - args_doc: "[last_1MiB_memory.bin]", - doc: doc, - children: NULL, - help_filter: NULL, - argp_domain: NULL, -}; - -static int verbose = 0; - -/** - * @brief Parse the arguments passed into the test case. - * - * @param key The parameter. - * @param arg Argument passed to parameter. - * @param state Location to put information on parameters. - * - * @return error_t - */ -static error_t -parse_opt(int key, char *arg, struct argp_state *state) -{ - /* Get the `input' argument from `argp_parse', which we - know is a pointer to our arguments structure. */ - test_args *args = state->input; - - switch (key) { - /* common settings */ - case 'v': /* --verbose=<level> */ - verbose = args->verbose = strtoul(arg, (char **)NULL, 0); - break; - - case 'm': /* --memtop */ - args->memtop = strtoul(arg, (char **)NULL, 0); - break; - - case ARGP_KEY_NO_ARGS: - /* argp_usage(state); */ - break; - - case ARGP_KEY_ARG: - args->arg1 = arg; - /* Now we consume all the rest of the arguments. - `state->next' is the index in `state->argv' of the - next argument to be parsed, which is the first STRING - we're interested in, so we can just use - `&state->argv[state->next]' as the value for - arguments->strings. - - _In addition_, by setting `state->next' to the end - of the arguments, we can force argp to stop parsing - here and return. */ - - args->options = &state->argv[state->next]; - state->next = state->argc; - break; - - case ARGP_KEY_END: - /* print out message if no arguments are given but PFI - write should be done */ - break; - - default: - return(ARGP_ERR_UNKNOWN); - } - return 0; -} - -static void -hexdump(const char *buf, int len) -{ - char line[16]; - char str[256]; - char dummy[256]; - int j = 0; - - while (len > 0) { - int i; - - strcpy(str, " "); - - for (j = 0; j < MIN(16, len); j++) - line[j] = *buf++; - - for (i = 0; i < j; i++) { - if (!(i & 3)) { - sprintf(dummy, " %.2x", line[i] & 0xff); - strcat(str, dummy); - } else { - sprintf(dummy, "%.2x", line[i] & 0xff); - strcat(str, dummy); - } - } - - /* Print empty space */ - for (; i < 16; i++) - if (!(i & 1)) - strcat(str, " "); - else - strcat(str, " "); - - strcat(str, " "); - for (i = 0; i < j; i++) { - if (isprint(line[i])) { - sprintf(dummy, "%c", line[i]); - strcat(str, dummy); - } else { - strcat(str, "."); - } - } - printf("%s\n", str); - len -= 16; - } -} - -static void -print_status_help(void) -{ - printf("Error Codes from IPL\n"); - printf(" IO Error %d\n", STAT_IO_FAILED); - printf(" Block is bad %d\n", STAT_BLOCK_BAD); - printf(" ECC unrec error %d\n", STAT_ECC_ERROR); - printf(" CRC csum failed %d\n", STAT_CRC_ERROR); - printf(" Magic not avail %d\n", STAT_NO_MAGIC); - printf(" No image avail %d\n", STAT_NO_IMAGE); - printf(" Image is invalid %d\n", STAT_INVALID_IMAGE); - printf(" Image is defect %d\n\n", STAT_DEFECT_IMAGE); - -} - -static void -print_ubi_scan_info(struct ubi_scan_info *fi) -{ - int i; - - printf("ubi_scan_info\n"); - printf(" version %08x\n", ntohl(fi->version)); - printf(" bootstatus %08x\n", ntohl(fi->bootstatus)); - printf(" flashtype %08x\n", ntohl(fi->flashtype)); - printf(" flashid %08x\n", ntohl(fi->flashid)); - printf(" flashmfgr %08x\n", ntohl(fi->flashmfr)); - printf(" flashsize %d bytes (%dM)\n", - ntohl(fi->flashsize), ntohl(fi->flashsize) / (1024 * 1024)); - printf(" blocksize %d bytes\n", ntohl(fi->blocksize)); - printf(" blockshift %d\n", ntohl(fi->blockshift)); - printf(" nrblocks %d\n", ntohl(fi->nrblocks)); - printf(" pagesize %d\n", ntohl(fi->pagesize)); - printf(" imagelen %d\n", ntohl(fi->imagelen)); - printf(" blockinfo %08x\n", ntohl((int)fi->blockinfo)); - - printf(" nr imageblocks imageoffs\n"); - for (i = 0; i < UBI_BLOCK_IDENT_MAX; i++) - printf(" [%2d] %08x %08x\n", i, - ntohl(fi->imageblocks[i]), - ntohl(fi->imageoffs[i])); - - for (i = 0; i < UBI_TIMESTAMPS; i++) { - if (!ntohl(fi->times[i])) - continue; - printf("time[%3d] = %08x %.3f sec\n", i, ntohl(fi->times[i]), - (double)ntohl(fi->times[i]) / 500000000.0); - } - - printf("crc32_table\n"); - hexdump((char *)&fi->crc32_table, sizeof(fi->crc32_table)); - printf("\npage_buf\n"); - hexdump((char *)&fi->page_buf, sizeof(fi->page_buf)); - - printf("\n"); - -} - -static void -print_ubi_block_info(struct ubi_scan_info *fi, - struct ubi_vid_hdr *bi, int nr) -{ - int i; - int unknown = 0; - - printf("\nBINFO\n"); - - for (i = 0; i < nr; i++) { - if ((int)ubi32_to_cpu(bi[i].magic) != UBI_VID_HDR_MAGIC) { - printf("block=%d %08x\n", - i, i * ntohl(fi->blocksize)); -#if 0 - printf("."); - if ((unknown & 0x3f) == 0x3f) - printf("\n"); - unknown++; -#else - hexdump((char *)&bi[i], - sizeof(struct ubi_vid_hdr)); -#endif - } else { - if (unknown) - printf("\n"); - printf("block=%d %08x\n" - " leb_ver=0x%x data_size=%d " - "lnum=%d used_ebs=0x%x\n" - " data_crc=%08x hdr_crc=%08x\n", - i, i * ntohl(fi->blocksize), - ubi32_to_cpu(bi[i].leb_ver), - ubi32_to_cpu(bi[i].data_size), - ubi32_to_cpu(bi[i].lnum), - ubi32_to_cpu(bi[i].used_ebs), - ubi32_to_cpu(bi[i].data_crc), - ubi32_to_cpu(bi[i].hdr_crc)); - hexdump((char *)&bi[i], - sizeof(struct ubi_vid_hdr)); - unknown = 0; - } - } -} - -static int do_read(unsigned int memtop, char *buf, int buf_len __unused) -{ - unsigned long finfo_addr; - unsigned long binfo_addr; - unsigned long images_addr; - unsigned long nrblocks; - unsigned long bi_size; - unsigned long images_size; - struct ubi_scan_info *fi; - struct ubi_vid_hdr *bi; - char *images; - unsigned long memaddr = memtop - MEMSIZE; - - print_status_help(); - - /* Read and print FINFO */ - finfo_addr = MEMSIZE - CFG_IPLSIZE * 1024; - - printf("read info at addr %08lx\n", finfo_addr); - fi = (struct ubi_scan_info *)(buf + finfo_addr); - - binfo_addr = ntohl((unsigned long)fi->blockinfo) - memaddr; - images_addr = ntohl((unsigned long)fi->images) - memaddr; - nrblocks = ntohl(fi->nrblocks); - - printf("BINFO %08lx\n", binfo_addr); - - bi_size = nrblocks * sizeof(struct ubi_vid_hdr); - images_size = nrblocks * sizeof(unsigned int); - - printf("FINFO\n"); - print_ubi_scan_info(fi); - /* hexdump((char *)fi, sizeof(*fi)); */ - - /* Read and print BINFO */ - bi = (struct ubi_vid_hdr *)(buf + binfo_addr); - print_ubi_block_info(fi, bi, nrblocks); - - /* Read and print IMAGES */ - images = buf + images_addr; - printf("\nIMAGES\n"); - hexdump(images, images_size); - - return 0; -} - -int main(int argc, char *argv[]) -{ - char buf[MEMSIZE]; - FILE *fp; - int rc; - - argp_parse(&argp, argc, argv, ARGP_IN_ORDER, 0, &g_args); - - if (!g_args.arg1) { - fprintf(stderr, "Please specify a file " - "name for memory dump!\n"); - exit(EXIT_FAILURE); - } - - memset(buf, 0xAB, sizeof(buf)); - - fp = fopen(g_args.arg1, "r"); - if (!fp) - exit(EXIT_FAILURE); - rc = fread(buf, 1, sizeof(buf), fp); - if (rc != sizeof(buf)) - exit(EXIT_FAILURE); - fclose(fp); - do_read(g_args.memtop, buf, sizeof(buf)); - - exit(EXIT_SUCCESS); -} diff --git a/ubi-utils/src/ubiinfo/ubiipl.h b/ubi-utils/src/ubiinfo/ubiipl.h deleted file mode 100644 index 3a8b900..0000000 --- a/ubi-utils/src/ubiinfo/ubiipl.h +++ /dev/null @@ -1,87 +0,0 @@ -#ifndef _UBI_IPL_H -#define _UBI_IPL_H -/* - * Copyright (c) International Business Machines Corp., 2006 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -/* - * Constants calculated from the CFG_XXX defines - * - * Declaration of the loader function which is invoked by the - * assembler part of the IPL - */ - -/* Size of IPL - is 4K for NAND and can also be 4K for NOR */ -#define IPL_SIZE 4096 - -/* Needed in asm code to upload the data, needed in C-code for CRC32 */ -#define IPL_RAMADDR (CFG_MEMTOP - IPL_SIZE) - -#if !defined(__ASSEMBLY__) - -#include <stdint.h> -#include <mtd/ubi-header.h> - -/* Address of the flash info structure */ -#define FINFO_ADDR (struct ubi_scan_info *) (CFG_MEMTOP - CFG_IPLSIZE * 1024) - -/* Size of the flash info structure */ -#define FINFO_SIZE sizeof(struct ubi_scan_info) - -/* Blockinfo array address */ -#define BINFO_ADDR (struct ubi_vid_hdr *) ((void *)FINFO_ADDR + FINFO_SIZE) - -/* Number of erase blocks */ -#define NR_ERASE_BLOCKS ((CFG_FLASHSIZE * 1024) / CFG_BLOCKSIZE) - -/* Blockinfo size */ -#define BINFO_SIZE (NR_ERASE_BLOCKS * sizeof(struct ubi_vid_hdr)) - -/* Images array address */ -#define IMAGES_ADDR (struct ubi_vid_hdr **) ((void *)BINFO_ADDR + BINFO_SIZE) - -/* Images array size */ -#define IMAGES_SIZE (NR_ERASE_BLOCKS * sizeof(unsigned int)) - -/* Total size of flash info + blockinfo + images */ -#define INFO_SIZE ((FINFO_SIZE + BINFO_SIZE + IMAGES_SIZE) / sizeof(uint32_t)) - -/* Load address of the SPL */ -#define SPL_ADDR (void *) ((void *)FINFO_ADDR - CFG_SPLCODE * 1024) - -#define IPL_SIZE_CRC32 (IPL_SIZE - sizeof(uint32_t)) -#define IPL_RAMADDR_CRC32 ((void *)(IPL_RAMADDR + sizeof(uint32_t))) - -/* - * Linker script magic to ensure that load_spl() is linked to the - * right place - */ -#define __crc32 __attribute__((__section__(".crc32"))) -#define __entry __attribute__((__section__(".entry.text"))) -#define __unused __attribute__((unused)) - -#define MIN(x,y) ((x)<(y)?(x):(y)) - -#define stop_on_error(x) \ - { while (1); } - -void __entry load_spl(void); -void hardware_init(void); - -#endif /* __ASSEMBLY__ */ - -#endif |