僕はジャックの苦悩を生み続ける親切心です。
Source code
前回 VanGogh APU のブートログを元に記事を書いたが、その補足的な雑記。
AMD VanGogh APU ブートログ | Coelacanth’s Dream
結論から、DDR5 256-bit というのは誤った情報が出力されたもので、実際には LPDDR5 64-bit と考えられる。
[ 99.984978] [drm] Detected VRAM RAM=1024M, BAR=1024M [ 99.984981] [drm] RAM width 256bits DDR5 [ 99.985223] [drm] amdgpu: 1024M of VRAM memory ready [ 99.985233] [drm] amdgpu: 3072M of GTT memory ready.
まず、元々は Linux Kernel のブートログ (dmesg
) で、Linux Kernel はオープンソースで開発、公開されているのだから、当然どこかにそのメッセージを出力するコードが記述されている。
それがどこかと言えば linux/amdgpu_object.c で、メモリ情報自体は linux/amdgpu_atomfirmware.c にてソースコードの外にあるファームウェアバイナリから読み取っている。
linux/amdgpu_atomfirmware.c のメモリ情報を取得する部分のコードが以下。APU の場合はファームウェアにある mem_channel_number
に 64 を掛けてメモリバス幅としている。
if (amdgpu_atom_parse_data_header(mode_info->atom_context, index, &size, &frev, &crev, &data_offset)) { if (adev->flags & AMD_IS_APU) { igp_info = (union igp_info *) (mode_info->atom_context->bios + data_offset); switch (frev) { case 1: switch (crev) { case 11: case 12: mem_channel_number = igp_info->v11.umachannelnumber; if (!mem_channel_number) mem_channel_number = 1; /* channel width is 64 */ if (vram_width) *vram_width = mem_channel_number * 64; mem_type = igp_info->v11.memorytype; if (vram_type) *vram_type = convert_atom_mem_type_to_vram_type(adev, mem_type); break; default: return -EINVAL; } break; case 2:
そして、メモリタイプ (vram_type
) もここで取得されるが、メモリとしてのアーキテクチャに違いがあろうと、LPDDR4 は DDR4 と、LPDDR5 は DDR5 と認識される。
if (adev->flags & AMD_IS_APU) { switch (atom_mem_type) { case Ddr2MemType: case LpDdr2MemType: vram_type = AMDGPU_VRAM_TYPE_DDR2; break; case Ddr3MemType: case LpDdr3MemType: vram_type = AMDGPU_VRAM_TYPE_DDR3; break; case Ddr4MemType: case LpDdr4MemType: vram_type = AMDGPU_VRAM_TYPE_DDR4; break; case Ddr5MemType: case LpDdr5MemType: vram_type = AMDGPU_VRAM_TYPE_DDR5; break; default: vram_type = AMDGPU_VRAM_TYPE_UNKNOWN; break; }
LPDDR4/LPDDR5 は内部的には 4-Channel のインターフェイスを持つ。1
そのため、ファームウェアが LPDDR5 のメモリチャネル数を正しく理解し、正直に 4-Channel だということを告げても、Linux Kenrel の GPUドライバーは今の所それに 64 を掛けてメモリバス幅としてしまう。
+-------------+--------+---------+ | Memory Type | Max Ch | Max DPC | +-------------+--------+---------+ | DDR4 | 1 | 2 | | LPDDR4(X) | 4 | 1 | | LPDDR5 | 4 | 1 | | DDR5 | 2 | 1 | +-------------+--------+---------+
以上のことと合わせ、前回も書いたが、ブートログから搭載されているメモリサイズは 7200304K 約 8 GB/7.45 GiB、予約分等があるため若干少なく表示される
と読み取れるため、LPDDR5 64-bit というのが正しいメモリ構成だと考えられる。
それならば [drm] RAM width 256bits DDR5
と出力されたことにも、約 8GB というメモリサイズにも説明が付く。
DDR5 128-bit (2x2ch) という可能性もあるが、VanGogh のディスプレイ部関連のソースファイルに、DDR4 と LPDDR5 用のパラメーターはあるのに対し、DDR5 は無いため、LPDDR5 の可能性のが高いように思う。2
ただこれが最大構成ではなく最小構成で、それ以上のメモリインターフェイスを持っている可能性もあるため、タイトルに (恐らく) を付けている。
それでも、ブートログから読み取れるのは DDR5 128-bit か LPDDR5 64-bit というメモリ構成である。
[ 0.044181] Memory: 6858688K/7200304K available (14345K kernel code, 9659K rwdata, 4980K rodata, 2484K init, 12292K bss, 341360K reserved, 0K cma-reserved)
Linux Kernel はオープンソースであり、自分が普段記事のネタにしてるのも OSS へのパッチであり、インターネットに接続されていれば誰でもソースを確認できる。
そういう点で、自分は Leaker とは無縁で、パッチとコードを眺めるだけの存在だ。
誰も興味がないということを知っている。