BIOS實戰之Memory配置

瀟灑Anthony發表於2020-12-13

目前有SPD和SMIP兩種,現在主要配置SMIP,soft:BMP;需要修改的相關檔案smip.c

BGA:貼片式,Dimm:插槽,MemoryDown:貼片必須要用到的:

 

ch0 RankEnable-->ch0 Option,這些選項的配置看Memory Spec和Gen,其中Ch0_RankEnable:only for memorydown 這個和CS以及channel有關

RMT mode 執行邊緣檢驗模式,這個如果有問題說明很有可能是電路問題,這個功能開啟是給硬體做Debug用的,在巨集定義中,Set的值是不變的,option的值為0或者1,config可以是數字,字元,字串

smip.c的增刪改查:(待定)

DQ Mapping for CHO to CH3:

bit0~31對應的ch0、ch2為DQ 8~15,0~7,24~31,16~23

bit0~31對應的ch1、ch3為DQ 0~31

另外有關project.h這個檔案,一些基礎的資訊被收集在了project.h檔案中,其中有setup介面中main選項中的眾多子選項,其中包括bios vendor,bios version, build time等相關資訊,但是這個project.h這個檔案是在Build後生成的。

 

#ifdef CONFIG_ODM_PROJECT_ID

Status = GetMemSkuId (&MemSkuId);

if (EFI_ERROR (Status)) {

MemSkuId = 0x00;

}

DEBUG ((EFI_D_INFO, "=====================================================\n"));

// Bit3 Bit2========Bit1 Bit0

// ID3 ID2========ID1 ID0

//2G 0 0 Hynix----: 0 0

//4G 1 0 Samsung-: 1 0

//8G 0 1 Micron---: 0 1

// ID4,Bit4 0 DDR3L,1 LP4

MemSkuId &=0x0F;//now only for LP4

#if (CONFIG_ODM_PROJECT_ID == 0)

MemSkuId = 0x10;//DDR3L

#endif

DEBUG ((EFI_D_INFO, "Memory ID: 0x%2X\n", MemSkuId));

DEBUG ((EFI_D_INFO, "Memory Type: %s %s\n",MemMfg[MemSkuId&0x03],MemSize[((MemSkuId>>2)&0x03)]));

switch ((MemSkuId>>4)&0x01) {

case 0://for LP4

//Bit[4,3]=00 2G(Single Channel), 10 4G(Dual Channel), 01 8G(Dual Channel),11 4G(Single Channel)

switch ((MemSkuId>>2)&0x03) {//Memory Size

case 0x00://2G(Single Channel)8Gb

case 0x02://4G(Dual Channel)8Gb

DramConfig = &(DramConfigData->PlatformDram0);//8Gb Profile

DEBUG ((EFI_D_INFO, "Profile set to 0\n"));

break;

case 0x01://8G(Dual Channel)16Gb

case 0x03://4G(Single Channel)16Gb

DramConfig = &(DramConfigData->PlatformDram1);//16Gb Profile

DEBUG ((EFI_D_INFO, "Profile set to 1\n"));

break;

}

break;

case 1://For DDR3L

DramConfig = &(DramConfigData->PlatformDram5);

DEBUG ((EFI_D_INFO, "Profile set to 5, DDR3L\n"));

break;

}

Memory中channel,DIMM,rank,bank,cs,chip之間的聯絡:

 

一個channel對應一組記憶體控制器

相關文章