Renesas SH のメモ
CONFIG_UNCACHED_MAPPING
uncached_start: arch/sh/mm/uncached.c の uncached_init で初期化される。
29bit の場合は P2SEG で初期化。 memory_end で初期化。memory_end は物理メモリアドレスの最後。
uncached_end: uncached_start + uncached_size
- cached_to_uncached : 512MB
- uncached_size: 512MB
- PAGE_OFFSET: CONFIG_PAGE_OFFSET で定義。0x80000000。P1領域の先頭アドレス。
UNCAC_ADDR / uncache アドレスに変換(P2)
#define UNCAC_ADDR(addr) ((addr) - PAGE_OFFSET + uncached_start)
CAC_ADDR / cache アドレスに変換(P1)
#define CAC_ADDR(addr) ((addr) - uncached_start + PAGE_OFFSET)
I/O 周 り
SH には inX/outX が基本的にない。 CONFIG_HAS_IOPORT が有効になっているボードでは使えるようになっている。
__raw_readX/__raw_writeX
コードは以下の通り。
#define __raw_writeb(v,a) (__chk_io_ptr(a), *(volatile u8 __force *)(a) = (v))
chkioptr は以下で定義されていて、0 になっている。指定されたメモリに値 へwrite/からread する。
include/linux/compiler.h:extern void __chk_io_ptr(const volatile void __iomem *);
include/linux/compiler.h:# define __chk_io_ptr(x) (void)0
__raw_readsX/__raw_writesX
readX/writeX
readsX/writesX
readX_relaxed/writeX_relaxed
readX_uncached/writeX_uncached
__raw_readX/__raw_writeX を呼ぶ前に jump_to_uncached() を呼び、後にback_to_cached()を呼ぶ。