BIOS开发笔记 12 – MR5中获取内存的Manufacturer

前段时间,碰到了一个奇怪的问题,BIOS Setup显示的内存厂商与实际贴的内存不一致,我查了代码中的SPDModule Manufacturer IDDRAM 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。于是,事情便明了了,除了SPDMR5中也可以取得Manufacturer。

MR5是什么呢?翻了DRAM的手册,MR5是一个模式寄存器(Mode Register),定义的正是Manufacturer ID

为了对模式寄存器有个清晰的认识,再贴个图:

找找Mode Register在哪?

版权声明:
作者:bin
链接:https://ay123.net/mystudy/bios/1781/
来源:爱影博客
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
海报
BIOS开发笔记 12 – MR5中获取内存的Manufacturer
前段时间,碰到了一个奇怪的问题,BIOS Setup显示的内存厂商与实际贴的内存不一致,我查了代码中的SPD,Module Manufacturer ID和DRAM Manufacturer ID设置的……
<<上一篇
下一篇>>
文章目录
关闭
目 录