Cortex-A9ではSCU,GIC,PL310などのarmが仕様を決めたペリフェラルが入っています。
kernelコードはsys/arch/arm/cortexの下にあります。
これらはarmperiph0にぶら下がっています。これのアドレスはSOC毎に違うのですが、個別に設定する必要はなく、armreg_cbar_read()でCPUに問い合わせて取得しています。
このアドレスからハードコードされたサイズでマップしてペリフェラルにアクセスしています。
pl310.cはarmperiph0からbus_space_subregionでレジスタをマップしています。
また、CPUの情報としてL2の情報が必要なため、デバイスドライバーの初期化の前の起動直後に読み取っています。
TCC893Xがうまくいかないのでc2kを確認して見たのですが、c2kのlinuxのヘッダーには以下のようにあります。
#define COMCERTO_SCU_VADDR COMCERTO_SCU_BASE
#define COMCERTO_GIC_CPU_VADDR (COMCERTO_SCU_VADDR + 0x100)
#define COMCERTO_GIC_GLOBAL_TIMER_VADDR (COMCERTO_SCU_VADDR + 0x200)
#define COMCERTO_TWD_VADDR (COMCERTO_SCU_VADDR + 0x600)
#define COMCERTO_GIC_DIST_VADDR (COMCERTO_SCU_VADDR + 0x1000)
#define COMCERTO_L310_VADDR (COMCERTO_SCU_VADDR + 0x10000)
PL310のデフォルトでのオフセットは0x2000なので、プロパティディクショナリのoffsetで設定を変更できるようになっています。
ただ、armperiph0はA9の場合3*4096バイトしか確保していないので、ここから外れます。
このようなケースもあるので、サイズもプロパティディクショナリで設定できたほうが良いと思われます。
arml2cc0はkernelコンフィグのflagsが1の時にdisableで0の時にenableになります。
c2kで正しくattachされるようにして、enableとdisableでベンチマークを録ってみたのですが、変わりません。。。
TCC893Xなのですが、SCUは0x77200000からあるのですが、PL310は0x6C000000からのようです。なんでこうなったかな。。。
ペリフェラルのコードはNON FDTなカーネルでも使えるようになっていますが、プライベートタイマーだけはFDT専用になっています。これまclkにを使っていてこれがFDT専用のためと思われます。