On Sun, Feb 08, 2009 at 12:19:56AM +0100, Alessandro Rubini wrote: > +static inline int parity(int b) /* b is really a byte; returns 0 or ~0 */
If it's really a byte, then why not tell the compiler this with uint8_t? > +{ > + __asm__ __volatile__( > + "eor %0, %0, %0, lsr #4\n\t" > + "eor %0, %0, %0, lsr #2\n\t" > + "eor %0, %0, %0, lsr #1\n\t" > + "ands %0, %0, #1\n\t" > + "subne %0, %0, #2\t" > + : "=r" (b) : "0" (b)); > + return b; > +} Why is this volatile? The underscores are unnecessary, BTW. Have you verified that this is noticeably better than C code? > +/* > + * This is the ECC routine used in hardware, according to the manual. > + * HW claims to make the calculation but not the correction; so we must > + * recalculate the bytes for a comparison. > + */ Why must you recalculate? What does the hardware do with the ECC it calculates? > + diff = (r ^ c) & ((1<<24)-1); /* use 24 bits only */ Put spaces around binary operators. > +/* This is the layout used by older installations, we keep compatible */ > +struct nand_ecclayout nomadik_ecc_layout = { > + .eccbytes = 3 * 4, > + .eccpos = { /* each subpage has 16 bytes: pos 2,3,4 hosts ECC */ > + 0x02, 0x03, 0x04, > + 0x12, 0x13, 0x14, > + 0x22, 0x23, 0x24, > + 0x32, 0x33, 0x34}, > + .oobfree = { {0x08, 0x08}, {0x18, 0x08}, {0x28, 0x08}, {0x38, 0x08} }, > +}; Any particular reason why bytes 0x05-0x07, 0x10-0x11, 0x15-0x17, etc. aren't marked free? > +/* Copy a buffer 32bits at a time: faster than defualt method which is 8bit > */ > +static void nomadik_nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int > len) > +{ > + int i; > + struct nand_chip *chip = mtd->priv; > + u32 *p = (u32 *) buf; > + > + len >>= 2; > + writel(0, REG_FSMC_ECCR0); > + for (i = 0; i < len; i++) > + p[i] = readl(chip->IO_ADDR_R); > +} What if "len" isn't a multiple of 4? > +int board_nand_init(struct nand_chip *chip) > +{ > + /* Set up the FSMC_PCR0 for nand access*/ > + writel(0x0000004a, REG_FSMC_PCR0); > + /* Set up FSMC_PMEM0, FSMC_PATT0 with timing data for access */ > + writel(0x00020401, REG_FSMC_PMEM0); > + writel(0x00020404, REG_FSMC_PATT0); > + > + chip->options = NAND_COPYBACK | NAND_CACHEPRG | NAND_NO_PADDING; > + chip->cmd_ctrl = nomadik_nand_hwcontrol; > + chip->dev_ready = nomadik_nand_ready; > + /* The chip allows 32bit reads, so avoid the default 8bit copy */ > + chip->read_buf = nomadik_nand_read_buf; > + > + /* ECC: follow the hardware-defined rulse, but do it in sw */ "rules" > -#define CONFIG_SYS_NAND_BASE 0x40000000 > +#define CONFIG_SYS_NAND_BASE 0x40000000 /* SMPS0n */ What is "SMPS0n"? -Scott _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot