04-04-2021, 10:28 PM
(04-04-2021, 09:56 PM)waitlamp 提到: 唯一不确定的,就是有说法称部分厂商会使用电阻对 SPD 进行配置
但我觉得,既然 Coreboot 是开源固件,如果有这样的识别配置,也一定可以通过修改源代码来让大容量的 SPD 识别
刚接触C,也不知天高地厚去看源码,然后就晕了
实在是代码新手,如果有任何不对的地方还请见谅
我不太明白的是
src/mainboard/google/glados/variants/caroline/Makefile.inc - coreboot - Gitiles
src/mainboard/google/glados/variants/caroline/variant.c - coreboot - Gitiles
src/mainboard/google/glados/spd/spd.c - coreboot - Gitiles
makefile.inc 决定了哪些型号的内存颗粒的 SPD hex 文件将会被编译成 spd.bin 进而编译进固件中
在 caroline 的 variant.c 的确有 gpio 配置来决定 spd_index 的值
但似乎并没有被内存初始化函数调用(或者是我太菜没看出来)
然后 CBFS 对 spd.bin 的操作也没看懂
你需要看 src/mainboard/google/glados/romstage.c. 里面的 mainboard_memory_init_params() 写得很清楚:
代码:
/* Get SPD index */
const gpio_t spd_gpios[] = {
GPIO_MEM_CONFIG_0,
GPIO_MEM_CONFIG_1,
GPIO_MEM_CONFIG_2,
GPIO_MEM_CONFIG_3,
};
const int spd_idx = gpio_base2_value(spd_gpios, ARRAY_SIZE(spd_gpios));
mem_cfg->MemorySpdDataLen = SPD_LEN;
mem_cfg->DqPinsInterleaved = FALSE;
spd_memory_init_params(mupd, spd_idx);
variant_memory_init_params(mupd, spd_idx);
这段代码是从4个GPIO引脚读取spd_idx,然后调用 spd_memory_init_params() (.../glados/spd/spd.c) 根据这个索引号从 CBFS 的 spd.bin 中读取 SPD. 如果你要把你的SPD填进固件的话,完全可以自己硬编码一个SPD,然后让 .../glados/spd/spd.c 里面 spd_memory_init_params() 里的 mem_cfg->MemorySpdPtr00, mem_cfg->MemorySpdPtr10 指向你的SPD数据。
(04-04-2021, 09:56 PM)waitlamp 提到: 但是内存初始化大部分似乎都被 Intel FSP 承担了
至于 DQByte MAPS 部分的话,版主发的 Intel FSP leak 刚好 leak 的是 skylake 平台的
Chromebook Pro 的处理器是 M3 6Y30
里面还正好有内存初始化的部分代码
虽然我的 Chromebook 是 Skylake 的 CoreM,但也算是对应上了
虽然文档里面有提及Memory Reference Code (MRC) 里面的 DQByte MAPS 和 Rcomp resistor
但还是看不懂,尤其是不知道 Rcomp resistor 是不是所谓配置内存的电阻
这个问题归根到底
Coreboot 的内存初始化流程是怎样的?
对于没有外置 SPD EEPROM的板载内存颗粒谁负责了容量、时序,频率的识别?Intel FSP 还是 SPD hex 文件?
Rcomp resistor 和 DQByte MAPS到底是什么?电阻/GPIO 对内存频率,时序,容量的配置是否存在?
修改 SPD Hex 文件能否起到使大容量内存被识别的作用?
( Chromebook 几乎不可能找到硬件电路图 / 原理图,只能寄希望于对 Coreboot 的修改)
我对DRAM硬件这块不熟,我也不清楚Rcomp,dq_map,dqs_map这些概念是什么。