コード例 #1
0
ファイル: dimmSpd.c プロジェクト: hustcalm/coreboot-hacking
AGESA_STATUS
AmdMemoryReadSPD (
		IN UINT32 Func,
		IN UINT32 Data,
		IN OUT AGESA_READ_SPD_PARAMS *SpdData
		)
{
	AGESA_STATUS Status;
	UINT8  SmBusAddress = 0;
	UINTN  Index;
	UINTN  MaxSocket = DIMENSION (SpdAddrLookup);

	for (Index = 0; Index < MaxSocket; Index ++){
		if ((SpdData->SocketId     == SpdAddrLookup[Index].SocketId)     &&
				(SpdData->MemChannelId == SpdAddrLookup[Index].MemChannelId) &&
				(SpdData->DimmId       == SpdAddrLookup[Index].DimmId)) {
			SmBusAddress = SpdAddrLookup[Index].SmbusAddress;
			break;
		}
	}


	if (SmBusAddress == 0) return AGESA_ERROR;

	SetupFch (SMBUS_BASE_ADDR);

	Status = WriteSmbusByteData (SMBUS_BASE_ADDR, LTC4305_SMBUS_ADDR, 0x80, 0x03);

	switch (SpdData->SocketId) {
		case 0:
			/* Switch onto the  First CPU Socket SMBUS */
			WriteSmbusByteData (SMBUS_BASE_ADDR, LTC4305_SMBUS_ADDR, 0x80, 0x03);
			break;
		case 1:
			/* Switch onto the  Second CPU Socket SMBUS */
			WriteSmbusByteData (SMBUS_BASE_ADDR, LTC4305_SMBUS_ADDR, 0x40, 0x03);
			break;
		default:
			/* Switch off two CPU Sockets SMBUS */
			WriteSmbusByteData (SMBUS_BASE_ADDR, LTC4305_SMBUS_ADDR, 0x00, 0x03);
			break;
	}
	Status =  ReadSpd (SMBUS_BASE_ADDR, SmBusAddress, SpdData->Buffer, 256);

	/*Output SPD Debug Message*/
	printk(BIOS_EMERG, "file '%s',line %d, %s()\n", __FILE__, __LINE__, __func__);
	printk(BIOS_DEBUG, " Status = %d\n",Status);
	printk(BIOS_DEBUG, "SocketId MemChannelId SpdData->DimmId SmBusAddress Buffer\n");
	printk(BIOS_DEBUG, "%x, %x, %x, %x, %x\n", SpdData->SocketId, SpdData->MemChannelId, SpdData->DimmId, SmBusAddress, SpdData->Buffer);

	/* Switch off two CPU Sockets SMBUS */
	WriteSmbusByteData (SMBUS_BASE_ADDR, LTC4305_SMBUS_ADDR, 0x00, 0x03);
	return Status;
}
コード例 #2
0
ファイル: Dimm.c プロジェクト: shijunjing/edk2
EFI_STATUS
EFIAPI
GetDimmState (
  IN      EFI_PEI_SERVICES        **PeiServices,
  IN      PEI_PLATFORM_DIMM_PPI   *This,
  IN      UINT8                   Dimm,
  OUT     PEI_PLATFORM_DIMM_STATE *State
  )
{
  EFI_STATUS                    Status;
  UINT8                         Buffer;

  PEI_ASSERT (PeiServices, (Dimm < This->DimmSockets));

  //
  // A failure here does not necessarily mean that no DIMM is present.
  // Read a single byte.  All we care about is the return status.
  //
  Status = ReadSpd (
             PeiServices,
             This,
             Dimm,
             0,
             1,
             &Buffer
             );

  if (EFI_ERROR (Status)) {
    State->Present = 0;
  } else {
    State->Present = 1;
  }

  //
  // BUGBUG: Update to check platform variable when it is available
  //
  State->Disabled = 0;
  State->Reserved = 0;

  return EFI_SUCCESS;
}