[coreboot] ASRock E350M1: How to set RAM voltages under coreboot?

Paul Menzel paulepanter at users.sourceforge.net
Sat Apr 20 12:36:51 CEST 2013


Dear coreboot folks,


currently the ASRock E350M1 has the following code copied from AMD
Inagua for setting voltages.

        $ nl -ba src/mainboard/amd/inagua/BiosCallOuts.c
        […]
           487	/*  Call the host environment interface to provide a user hook opportunity. */
           488	AGESA_STATUS BiosHookBeforeDramInit(UINT32 Func, UINT32 Data, VOID * ConfigPtr)
           489	{
           490		AGESA_STATUS Status;
           491		UINTN FcnData;
           492		MEM_DATA_STRUCT *MemData;
           493		UINT32 AcpiMmioAddr;
           494		UINT32 GpioMmioAddr;
           495		UINT8 Data8;
           496		UINT16 Data16;
           497		UINT8 TempData8;
           498	
           499		FcnData = Data;
           500		MemData = ConfigPtr;
           501	
           502		Status = AGESA_SUCCESS;
           503		/* Get SB MMIO Base (AcpiMmioAddr) */
           504		WriteIo8(0xCD6, 0x27);
           505		Data8 = ReadIo8(0xCD7);
           506		Data16 = Data8 << 8;
           507		WriteIo8(0xCD6, 0x26);
           508		Data8 = ReadIo8(0xCD7);
           509		Data16 |= Data8;
           510		AcpiMmioAddr = (UINT32) Data16 << 16;
           511		GpioMmioAddr = AcpiMmioAddr + GPIO_BASE;
           512	
           513		Data8 = Read64Mem8(GpioMmioAddr + SB_GPIO_REG178);
           514		Data8 &= ~BIT5;
           515		TempData8 = Read64Mem8(GpioMmioAddr + SB_GPIO_REG178);
           516		TempData8 &= 0x03;
           517		TempData8 |= Data8;
           518		Write64Mem8(GpioMmioAddr + SB_GPIO_REG178, TempData8);
           519	
           520		Data8 |= BIT2 + BIT3;
           521		Data8 &= ~BIT4;
           522		TempData8 = Read64Mem8(GpioMmioAddr + SB_GPIO_REG178);
           523		TempData8 &= 0x23;
           524		TempData8 |= Data8;
           525		Write64Mem8(GpioMmioAddr + SB_GPIO_REG178, TempData8);
           526	
           527		Data8 = Read64Mem8(GpioMmioAddr + SB_GPIO_REG179);
           528		Data8 &= ~BIT5;
           529		TempData8 = Read64Mem8(GpioMmioAddr + SB_GPIO_REG179);
           530		TempData8 &= 0x03;
           531		TempData8 |= Data8;
           532		Write64Mem8(GpioMmioAddr + SB_GPIO_REG179, TempData8);
           533	
           534		Data8 |= BIT2 + BIT3;
           535		Data8 &= ~BIT4;
           536		TempData8 = Read64Mem8(GpioMmioAddr + SB_GPIO_REG179);
           537		TempData8 &= 0x23;
           538		TempData8 |= Data8;
           539		Write64Mem8(GpioMmioAddr + SB_GPIO_REG179, TempData8);
           540	
           541		switch (MemData->ParameterListPtr->DDR3Voltage) {
           542		case VOLT1_35:
           543			Data8 = Read64Mem8(GpioMmioAddr + SB_GPIO_REG178);
           544			Data8 &= ~(UINT8) BIT6;
           545			Write64Mem8(GpioMmioAddr + SB_GPIO_REG178, Data8);
           546			Data8 = Read64Mem8(GpioMmioAddr + SB_GPIO_REG179);
           547			Data8 |= (UINT8) BIT6;
           548			Write64Mem8(GpioMmioAddr + SB_GPIO_REG179, Data8);
           549			break;
           550		case VOLT1_25:
           551			Data8 = Read64Mem8(GpioMmioAddr + SB_GPIO_REG178);
           552			Data8 &= ~(UINT8) BIT6;
           553			Write64Mem8(GpioMmioAddr + SB_GPIO_REG178, Data8);
           554			Data8 = Read64Mem8(GpioMmioAddr + SB_GPIO_REG179);
           555			Data8 &= ~(UINT8) BIT6;
           556			Write64Mem8(GpioMmioAddr + SB_GPIO_REG179, Data8);
           557			break;
           558		case VOLT1_5:
           559		default:
           560			Data8 = Read64Mem8(GpioMmioAddr + SB_GPIO_REG178);
           561			Data8 |= (UINT8) BIT6;
           562			Write64Mem8(GpioMmioAddr + SB_GPIO_REG178, Data8);
           563			Data8 = Read64Mem8(GpioMmioAddr + SB_GPIO_REG179);
           564			Data8 &= ~(UINT8) BIT6;
           565			Write64Mem8(GpioMmioAddr + SB_GPIO_REG179, Data8);
           566		}
           567		return Status;
           568	}
        […]

The attached screenshot from Alvaro shows, that the vendor BIOS of the
ASRock E350M1 [1] offers even more options for the voltages. Especially
the AUTO options sounds nice.

First I have to say, that I have not tried yet to change the voltage on
my ASRock E350M1, so I have no idea if the code from AMD Inagua works or
not.

Secondly I have no idea how to check under the operating system, what
the voltage is.

So how would I find out what to do on the ASRock E350M1 without having
any schematics?

a) Disassemble the vendor BIOS binary?
b) Use SerialICE and look at the differences when changing the option in
the vendor BIOS menu?


Thanks,

Paul


[1] http://www.asrock.com/mb/overview.asp?cat=Download&os=BIOS&Model=E350M1
-------------- next part --------------
A non-text attachment was scrubbed...
Name: asrock_e350m1--vendor_BIOS--volatages.jpg
Type: image/jpeg
Size: 506309 bytes
Desc: not available
URL: <http://www.coreboot.org/pipermail/coreboot/attachments/20130420/2a9fc115/attachment-0001.jpg>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: This is a digitally signed message part
URL: <http://www.coreboot.org/pipermail/coreboot/attachments/20130420/2a9fc115/attachment-0001.sig>


More information about the coreboot mailing list