BIOS开发笔记 12 – MR5中获取内存的Manufacturer
前段时间,碰到了一个奇怪的问题,BIOS Setup显示的内存厂商与实际贴的内存不一致,我查了代码中的SPD
,Module Manufacturer ID
和DRAM Manufacturer ID
设置的都是0,那 setup中显示的厂商是如何获取的呢?
带着这个问题,开始追踪代码,最终找到如下:
// MR5 - Manufacturer ID MrAddr = 5; MrcIssueMrr (MrcData, Controller, Channel, Rank, MrAddr, MrrResult, MRC_PRINTS_ON); for (Device = 0; Device < MaxDevices; Device++) { MRC_DEBUG_MSG (Debug, MSG_LEVEL_NOTE, "\tDevice[%u]= 0x%02X", Device, MrrResult[Device]); VendorFound = FALSE; for (Index = 0; Index < sizeof (DramVendorList) / sizeof (DramVendorList[0]); Index++) { if (DramVendorList[Index].VendorId == MrrResult[Device]) { MRC_DEBUG_MSG (Debug, MSG_LEVEL_NOTE, " %s\n", DramVendorList[Index].VendorName); VendorFound = TRUE; if (Inputs->ExtInputs->WckOffsetWa && (MrrResult[Device] == HYNIX_VENDOR_ID)) { HynixFound = TRUE; } break; } } if (!VendorFound) { MRC_DEBUG_MSG (Debug, MSG_LEVEL_NOTE, " Unknown\n"); } } if (VendorFound) { // Patch SPD data with vendor ID code. // This is consumed by BIOS Setup and SMBIOS Type 17 table creation code. // If SAGV enabled, only do this on the last pass: SaveData->SaGvLast. if ((!MrcIsSaGvEnabled (MrcData)) || (MrcIntData->SaGvPoint == Outputs->SaGvLast)) { JedecId = DramVendorList[Index].JedecId; SpdIn = &Inputs->Controller[Controller].Channel[Channel].Dimm[dDIMM0].Spd.Data; SpdIn->Lpddr.ManufactureInfo.ModuleId.IdCode.Data = JedecId; SpdIn->Lpddr.ManufactureInfo.DramIdCode.Data = JedecId; } }
这段代码中,通过MrcIssueMrr
函数从MR5
中获取到了Manufacturer ID
。于是,事情便明了了,除了SPD
,MR5
中也可以取得Manufacturer。
MR5
是什么呢?翻了DRAM的手册,MR5
是一个模式寄存器(Mode Register
),定义的正是Manufacturer ID
。
为了对模式寄存器有个清晰的认识,再贴个图:
找找Mode Register
在哪?
版权声明:
作者:bin
链接:https://ay123.net/mystudy/bios/1781/
来源:爱影博客
文章版权归作者所有,未经允许请勿转载。
THE END
0
二维码
海报
BIOS开发笔记 12 – MR5中获取内存的Manufacturer
前段时间,碰到了一个奇怪的问题,BIOS Setup显示的内存厂商与实际贴的内存不一致,我查了代码中的SPD,Module Manufacturer ID和DRAM Manufacturer ID设置的……
文章目录
关闭
共有 0 条评论