From 569bc625e3123f9c9bf7406c2cd37f93d2cdc416 Mon Sep 17 00:00:00 2001 From: Macpaul Lin Date: Mon, 24 Oct 2011 16:43:17 +0800 Subject: nds32: Use getenv_ulong() in place of getenv(), strtoul This changes the board code to use the new getenv_ulong() function. Signed-off-by: Macpaul Lin --- arch/nds32/lib/board.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/arch/nds32/lib/board.c b/arch/nds32/lib/board.c index 1776a72..2fd0e93 100644 --- a/arch/nds32/lib/board.c +++ b/arch/nds32/lib/board.c @@ -50,13 +50,7 @@ ulong monitor_flash_len; #endif static int init_baudrate(void) { - char tmp[64]; /* long enough for environment variables */ - int i = getenv_f("baudrate", tmp, sizeof(tmp)); - - gd->bd->bi_baudrate = gd->baudrate = (i > 0) - ? (int) simple_strtoul(tmp, NULL, 10) - : CONFIG_BAUDRATE; - + gd->baudrate = getenv_ulong("baudrate", 10, CONFIG_BAUDRATE); return 0; } @@ -400,9 +394,7 @@ void board_init_r(gd_t *id, ulong dest_addr) #endif /* Initialize from environment */ - s = getenv("loadaddr"); - if (s != NULL) - load_addr = simple_strtoul(s, NULL, 16); + load_addr = getenv_ulong("loadaddr", 16, load_addr); #if defined(CONFIG_CMD_NET) s = getenv("bootfile"); -- cgit v1.1 From 466e73b19b34a1500303faffc4b17d849438fad0 Mon Sep 17 00:00:00 2001 From: Macpaul Lin Date: Mon, 24 Oct 2011 16:48:39 +0800 Subject: nds32: cache: define ARCH_DMA_MINALIGN for DMA buffer alignment Add ARCH_DMA_MINALIGN definition to asm/cache.h Signed-off-by: Macpaul Lin --- arch/nds32/include/asm/cache.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/arch/nds32/include/asm/cache.h b/arch/nds32/include/asm/cache.h index d769196..fc22c7b 100644 --- a/arch/nds32/include/asm/cache.h +++ b/arch/nds32/include/asm/cache.h @@ -51,4 +51,15 @@ DEFINE_GET_SYS_REG(DCM_CFG); #define DCM_CFG_OFF_DSZ 6 /* D-cache line size */ #define DCM_CFG_MSK_DSZ (0x7UL << DCM_CFG_OFF_DSZ) +/* + * The current upper bound for NDS32 L1 data cache line sizes is 32 bytes. + * We use that value for aligning DMA buffers unless the board config has + * specified an alternate cache line size. + */ +#ifdef CONFIG_SYS_CACHELINE_SIZE +#define ARCH_DMA_MINALIGN CONFIG_SYS_CACHELINE_SIZE +#else +#define ARCH_DMA_MINALIGN 32 +#endif + #endif /* _ASM_CACHE_H */ -- cgit v1.1 From a53ef5e4bac750d0e84cd2b79f9f7855382b561d Mon Sep 17 00:00:00 2001 From: Macpaul Lin Date: Mon, 24 Oct 2011 13:31:05 +0800 Subject: nds32: asm/io.h: add __iormb __iowmb and inline io support 1. This patch add required __iormb and __iowmb to io.h. This also fix some misbehavior to periphal drivers. This io.h has been fixed with referencing arm/include/asm/io.h. 2. This patch replaced macro writeb and readb into inline function. Signed-off-by: Macpaul Lin --- arch/nds32/include/asm/io.h | 72 ++++++++++++++++++++++++++++++++------------- 1 file changed, 52 insertions(+), 20 deletions(-) diff --git a/arch/nds32/include/asm/io.h b/arch/nds32/include/asm/io.h index 2504c2b..2c105f7 100644 --- a/arch/nds32/include/asm/io.h +++ b/arch/nds32/include/asm/io.h @@ -98,13 +98,59 @@ extern void __raw_readsl(unsigned int addr, void *data, int longlen); #define __raw_readw(a) __arch_getw(a) #define __raw_readl(a) __arch_getl(a) -#define writeb(v, a) __arch_putb(v, a) -#define writew(v, a) __arch_putw(v, a) -#define writel(v, a) __arch_putl(v, a) +/* + * TODO: The kernel offers some more advanced versions of barriers, it might + * have some advantages to use them instead of the simple one here. + */ +#define dmb() __asm__ __volatile__ ("" : : : "memory") +#define __iormb() dmb() +#define __iowmb() dmb() + +static inline void writeb(unsigned char val, unsigned char *addr) +{ + __iowmb(); + __arch_putb(val, addr); +} + +static inline void writew(unsigned short val, unsigned short *addr) +{ + __iowmb(); + __arch_putw(val, addr); + +} + +static inline void writel(unsigned int val, unsigned int *addr) +{ + __iowmb(); + __arch_putl(val, addr); +} + +static inline unsigned char readb(unsigned char *addr) +{ + u8 val; -#define readb(a) __arch_getb(a) -#define readw(a) __arch_getw(a) -#define readl(a) __arch_getl(a) + val = __arch_getb(addr); + __iormb(); + return val; +} + +static inline unsigned short readw(unsigned short *addr) +{ + u16 val; + + val = __arch_getw(addr); + __iormb(); + return val; +} + +static inline unsigned int readl(unsigned int *addr) +{ + u32 val; + + val = __arch_getl(addr); + __iormb(); + return val; +} /* * The compiler seems to be incapable of optimising constants @@ -338,20 +384,6 @@ check_signature(unsigned long io_addr, const unsigned char *signature, out: return retval; } - -#elif !defined(readb) - -#define readb(addr) (__readwrite_bug("readb"), 0) -#define readw(addr) (__readwrite_bug("readw"), 0) -#define readl(addr) (__readwrite_bug("readl"), 0) -#define writeb(v, addr) __readwrite_bug("writeb") -#define writew(v, addr) __readwrite_bug("writew") -#define writel(v, addr) __readwrite_bug("writel") - -#define eth_io_copy_and_sum(a, b, c, d) __readwrite_bug("eth_io_copy_and_sum") - -#define check_signature(io, sig, len) (0) - #endif /* __mem_pci */ /* -- cgit v1.1