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; }
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; }