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()を呼ぶ。