#include <asm/io.h>
#include <linux/sizes.h>
-#include <asm/arch/imx-regs.h>
+#include <asm/arch/sys_proto.h>
#include <asm/imx-common/regs-gpmi.h>
#include <asm/imx-common/regs-bch.h>
u32 disbb_search;
};
-struct mx6_dbbt_header {
- u32 checksum;
- u32 fingerprint;
- u32 version;
- u32 number_bb;
- u32 number_pages;
- u8 spare[492];
-};
-
-struct mx6_dbbt {
- u32 nand_number;
- u32 number_bb;
- u32 bb_num[2040 / 4];
-};
-
-struct mx6_ivt {
- u32 magic;
- u32 app_start_addr;
- u32 rsrvd1;
- void *dcd;
- void *boot_data;
- void *self;
- void *csf;
- u32 rsrvd2;
-};
-
-struct mx6_boot_data {
- void *start;
- u32 length;
- u32 plugin;
-};
-
#define BF_VAL(v, bf) (((v) & bf##_MASK) >> bf##_OFFSET)
static nand_info_t *mtd = &nand_info[0];
return ~chksum;
}
-/*
- Physical organisation of data in NAND flash:
- metadata
- payload chunk 0 (may be empty)
- ecc for metadata + payload chunk 0
- payload chunk 1
- ecc for payload chunk 1
-...
- payload chunk n
- ecc for payload chunk n
- */
-
-static inline int calc_bb_offset(nand_info_t *mtd, struct mx6_fcb *fcb)
-{
- int bb_mark_offset;
- int chunk_data_size = fcb->ecc_blockn_size * 8;
- int chunk_ecc_size = (fcb->ecc_blockn_type << 1) * 13;
- int chunk_total_size = chunk_data_size + chunk_ecc_size;
- int bb_mark_chunk, bb_mark_chunk_offs;
-
- bb_mark_offset = (mtd->writesize - fcb->metadata_size) * 8;
- if (fcb->ecc_block0_size == 0)
- bb_mark_offset -= (fcb->ecc_block0_type << 1) * 13;
-
- bb_mark_chunk = bb_mark_offset / chunk_total_size;
- bb_mark_chunk_offs = bb_mark_offset - (bb_mark_chunk * chunk_total_size);
- if (bb_mark_chunk_offs > chunk_data_size) {
- printf("Unsupported ECC layout; BB mark resides in ECC data: %u\n",
- bb_mark_chunk_offs);
- return -EINVAL;
- }
- bb_mark_offset -= bb_mark_chunk * chunk_ecc_size;
- return bb_mark_offset;
-}
-
/*
* return number of blocks to skip for a contiguous partition
* of given # blocks
u32 fl0, fl1;
u32 t0;
int metadata_size;
- int bb_mark_bit_offs;
struct mx6_fcb *fcb;
int fcb_offs;
pr_fcb_val(fcb, fw1_start_page);
pr_fcb_val(fcb, fw1_sectors);
- if (fw2_start_block != 0 && fw2_start_block < mtd->size / mtd->erasesize) {
+ if (fw2_start_block != 0 &&
+ fw2_start_block < lldiv(mtd->size, mtd->erasesize)) {
fcb->fw2_start_page = fw2_start_block * fcb->sectors_per_block;
fcb->fw2_sectors = fcb->fw1_sectors;
pr_fcb_val(fcb, fw2_start_page);
fcb->dbbt_search_area = 0;
- bb_mark_bit_offs = calc_bb_offset(mtd, fcb);
- if (bb_mark_bit_offs < 0)
- return ERR_PTR(bb_mark_bit_offs);
- fcb->bb_mark_byte = bb_mark_bit_offs / 8;
- fcb->bb_mark_startbit = bb_mark_bit_offs % 8;
- fcb->bb_mark_phys_offset = mtd->writesize;
-
- pr_fcb_val(fcb, bb_mark_byte);
- pr_fcb_val(fcb, bb_mark_startbit);
- pr_fcb_val(fcb, bb_mark_phys_offset);
-
fcb->checksum = calc_chksum(&fcb->fingerprint, 512 - 4);
return fcb;
}
size_t size = 0;
void *addr = NULL;
struct mx6_fcb *fcb;
- unsigned long mtd_num_blocks = mtd->size / mtd->erasesize;
+ unsigned long mtd_num_blocks = lldiv(mtd->size, mtd->erasesize);
#ifdef CONFIG_ENV_IS_IN_NAND
unsigned long env_start_block = CONFIG_ENV_OFFSET / mtd->erasesize;
unsigned long env_end_block = env_start_block +
unsigned long fw_num_blocks;
int fw1_skip, fw2_skip;
unsigned long extra_blocks = 0;
- size_t max_len1, max_len2;
+ u64 max_len1, max_len2;
struct mtd_device *dev;
struct part_info *part_info;
struct part_info *redund_part_info;
uboot_part, ret);
return ret;
}
- fw1_start_block = part_info->offset / mtd->erasesize;
+ fw1_start_block = lldiv(part_info->offset, mtd->erasesize);
max_len1 = part_info->size;
if (size == 0)
- fw_num_blocks = max_len1 / mtd->erasesize;
+ fw_num_blocks = lldiv(max_len1, mtd->erasesize);
} else {
- max_len1 = (fw_num_blocks + extra_blocks) * mtd->erasesize;
+ max_len1 = (u64)(fw_num_blocks + extra_blocks) * mtd->erasesize;
}
if (redund_part) {
redund_part, ret);
return ret;
}
- fw2_start_block = redund_part_info->offset / mtd->erasesize;
+ fw2_start_block = lldiv(redund_part_info->offset, mtd->erasesize);
max_len2 = redund_part_info->size;
if (fw2_start_block == fcb_start_block) {
fw2_start_block++;
max_len2 -= mtd->erasesize;
}
if (size == 0)
- fw_num_blocks = max_len2 / mtd->erasesize;
+ fw_num_blocks = lldiv(max_len2, mtd->erasesize);
} else if (fw2_set) {
- max_len2 = (fw_num_blocks + extra_blocks) * mtd->erasesize;
+ max_len2 = (u64)(fw_num_blocks + extra_blocks) * mtd->erasesize;
} else {
max_len2 = 0;
}
fw1_skip = find_contig_space(fw1_start_block, fw_num_blocks,
- max_len1 / mtd->erasesize);
+ lldiv(max_len1, mtd->erasesize));
if (fw1_skip < 0) {
- printf("Could not find %lu contiguous good blocks for fw image in blocks %lu..%lu\n",
+ printf("Could not find %lu contiguous good blocks for fw image in blocks %lu..%llu\n",
fw_num_blocks, fw1_start_block,
- fw1_start_block + max_len1 / mtd->erasesize - 1);
+ fw1_start_block + lldiv(max_len1, mtd->erasesize) - 1);
if (uboot_part) {
#ifdef CONFIG_ENV_IS_IN_NAND
if (part_info->offset <= CONFIG_ENV_OFFSET + TOTAL_ENV_SIZE) {
fw2_start_block = fw1_end_block + 1;
if (fw2_start_block > 0) {
fw2_skip = find_contig_space(fw2_start_block, fw_num_blocks,
- max_len2 / mtd->erasesize);
+ lldiv(max_len2, mtd->erasesize));
if (fw2_skip < 0) {
- printf("Could not find %lu contiguous good blocks for redundant fw image in blocks %lu..%lu\n",
+ printf("Could not find %lu contiguous good blocks for redundant fw image in blocks %lu..%llu\n",
fw_num_blocks, fw2_start_block,
- fw2_start_block + max_len2 / mtd->erasesize - 1);
+ fw2_start_block + lldiv(max_len2, mtd->erasesize) - 1);
if (redund_part) {
printf("Increase the size of the '%s' partition or use a different partition\n",
redund_part);