[Linux] aarch64 CPU の対応確認 (Kernel, Toolchain, TF-A)

CPU やアーキテクチャがどんどん更新していくにつれて、kernel や toolchain はどれを使えばいいのか? という質問が寄せられることがあるので、aarch64 についてどこに CPU の対応情報があるのかを見てみました。

Linux kernel

kernel ソースから CPU に関係あるファイルを探します。例えば Cortex-A76 の定義が cputype.h に見つけることができます。これがない kernel version では少なくとも Cortex-A76 の対応はありません。

include/asm/cputype.h:
#define MIDR_CORTEX_A76 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A76)

また、CPU 固有のエラッタがあるかどうかを cpu_errata.c や Kconfig で見つけることができます。

arch/arm64/kernel/cpu_errata.c:
DEFINE_PER_CPU(int, __in_cortex_a76_erratum_1463225_wa);

Cortex-A76 は v4.19 には対応があり、v4.14 にはないようです。

GCC toolchain

以下のドキュメントにオプション一覧があります。ここから該当する CPU の指定ができるかどうかを探します。HTML なので lynx などを使います。

$ lynx share/doc/as.html/AArch64-Options.html
...
-mcpu=processor[+extension...]
This option specifies the target processor. The assembler will issue an error message if an attempt is
made to assemble an instruction which will not execute on the target processor. The following processor
names are recognized: cortex-a34, cortex-a35, cortex-a53, cortex-a55, cortex-a57, cortex-a65,
cortex-a65ae, cortex-a72, cortex-a73, cortex-a75, cortex-a76, cortex-a76ae, cortex-a77, ares,
exynos-m1, falkor, neoverse-n1, neoverse-e1, qdf24xx, saphira, thunderx, vulcan, xgene1 and xgene2. The
special name all may be used to allow the assembler to accept instructions valid for any supported
processor, including all optional extensions.
...

Cortex-A76 としては gcc-9 には対応があり、gcc-8 にはないようです。Armv8.2 自身は gcc-8 でも対応しているので、アーキテクチャとしては最適コードが期待できます。

なお、gcc toolchain は gcc-7 までは Linaro 、gcc-8 以降は Armがホスティングしています。

gcc の CPU 指定は以下のように行います。

$ aarch64-none-linux-gnu-gcc -march=armv8.2-a -mcpu=cortex-a76 -o hello hello.c

Trusted Firmware-A

TF-A のソースの該当箇所を探します。以下に CPU 固有ソースがあります。

$ cd lib/cpus/aarch64/
$ ls
aem_generic.S cortex_a65.S cortex_a76.S cpuamu.c neoverse_n1_pubsub.c
cortex_a35.S cortex_a72.S cortex_a77.S cpuamu_helpers.S neoverse_n1.S
cortex_a53.S cortex_a73.S cortex_a78.S cpu_helpers.S neoverse_zeus.S
cortex_a55.S cortex_a75_pubsub.c cortex_hercules_ae.S denver.S wa_cve_2017_5715_bpiall.S
cortex_a57.S cortex_a75.S cortex_klein.S dsu_helpers.S wa_cve_2017_5715_mmu.S
cortex_a65ae.S cortex_a76ae.S cortex_matterhorn.S neoverse_e1.S

git log でどのバージョンから入ったかを探ります。

$ git log -- lib/cpus/aarch64/cortex_a76.S
...
commit abbffe98ed6a2fff519cc5590b947c9751cdd235
Author: Isla Mitchell <isla.mitchell@arm.com>
Date: Thu Aug 3 16:04:46 2017 +0100

    Add support for Cortex-Ares and Cortex-A76 CPUs
...

v1.6 以降でこの commit を見つけることができました。

最後に

これらの検索方法はあくまで CPU の対応に主眼を置いているので、driver が新機能に対応しているかはそれぞれの driver を調査する必要があります。
例えば Armv8.2 に搭載された DynamIQ 対応の perf は drivers/perf/arm_dsu-pmu.c に見つけることができます。


コメント

タイトルとURLをコピーしました