Kyösti Mälkki | c459f96 | 2014-05-04 17:07:45 +0300 | [diff] [blame] | 1 | /* |
| 2 | * This file is part of the coreboot project. |
| 3 | * |
| 4 | * Copyright (C) 2011 Advanced Micro Devices, Inc. |
Kyösti Mälkki | 36abdc4 | 2014-05-05 16:40:15 +0300 | [diff] [blame] | 5 | * Copyright (C) 2013 Sage Electronic Engineering, LLC |
Kyösti Mälkki | c459f96 | 2014-05-04 17:07:45 +0300 | [diff] [blame] | 6 | * |
| 7 | * This program is free software; you can redistribute it and/or modify |
| 8 | * it under the terms of the GNU General Public License as published by |
| 9 | * the Free Software Foundation; version 2 of the License. |
| 10 | * |
| 11 | * This program is distributed in the hope that it will be useful, |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 14 | * GNU General Public License for more details. |
Kyösti Mälkki | c459f96 | 2014-05-04 17:07:45 +0300 | [diff] [blame] | 15 | */ |
| 16 | |
Kyösti Mälkki | 36abdc4 | 2014-05-05 16:40:15 +0300 | [diff] [blame] | 17 | #include <cbfs.h> |
| 18 | #include <spd_cache.h> |
| 19 | |
Kyösti Mälkki | c459f96 | 2014-05-04 17:07:45 +0300 | [diff] [blame] | 20 | #include "AGESA.h" |
Kyösti Mälkki | 5e19fa4 | 2014-05-04 23:13:54 +0300 | [diff] [blame] | 21 | #include "amdlib.h" |
Kyösti Mälkki | c459f96 | 2014-05-04 17:07:45 +0300 | [diff] [blame] | 22 | #include "Ids.h" |
Kyösti Mälkki | f21c2ac | 2014-10-19 09:35:18 +0300 | [diff] [blame] | 23 | #include <northbridge/amd/agesa/agesawrapper.h> |
Kyösti Mälkki | 26f297e | 2014-05-26 11:27:54 +0300 | [diff] [blame] | 24 | #include "BiosCallOuts.h" |
Kyösti Mälkki | c5cc9f2 | 2014-10-17 22:33:22 +0300 | [diff] [blame] | 25 | #include "dimmSpd.h" |
Kyösti Mälkki | c459f96 | 2014-05-04 17:07:45 +0300 | [diff] [blame] | 26 | |
Stefan Reinauer | dd132a5 | 2015-07-30 11:16:37 -0700 | [diff] [blame] | 27 | AGESA_STATUS GetBiosCallout (UINT32 Func, UINTN Data, VOID *ConfigPtr) |
Kyösti Mälkki | 6025efa | 2014-05-05 13:20:56 +0300 | [diff] [blame] | 28 | { |
Kyösti Mälkki | 82fbda7 | 2015-01-02 22:46:32 +0200 | [diff] [blame] | 29 | AGESA_STATUS status; |
Kyösti Mälkki | 6025efa | 2014-05-05 13:20:56 +0300 | [diff] [blame] | 30 | UINTN i; |
| 31 | |
Kyösti Mälkki | 82fbda7 | 2015-01-02 22:46:32 +0200 | [diff] [blame] | 32 | /* One HeapManager serves them all. */ |
| 33 | status = HeapManagerCallout(Func, Data, ConfigPtr); |
| 34 | if (status != AGESA_UNSUPPORTED) |
| 35 | return status; |
| 36 | |
Kyösti Mälkki | 6025efa | 2014-05-05 13:20:56 +0300 | [diff] [blame] | 37 | for (i = 0; i < BiosCalloutsLen; i++) { |
| 38 | if (BiosCallouts[i].CalloutName == Func) |
| 39 | break; |
| 40 | } |
| 41 | if(i >= BiosCalloutsLen) |
| 42 | return AGESA_UNSUPPORTED; |
| 43 | |
| 44 | return BiosCallouts[i].CalloutPtr (Func, Data, ConfigPtr); |
| 45 | } |
| 46 | |
Stefan Reinauer | dd132a5 | 2015-07-30 11:16:37 -0700 | [diff] [blame] | 47 | AGESA_STATUS agesa_NoopUnsupported (UINT32 Func, UINTN Data, VOID *ConfigPtr) |
Kyösti Mälkki | c459f96 | 2014-05-04 17:07:45 +0300 | [diff] [blame] | 48 | { |
| 49 | return AGESA_UNSUPPORTED; |
| 50 | } |
| 51 | |
Stefan Reinauer | dd132a5 | 2015-07-30 11:16:37 -0700 | [diff] [blame] | 52 | AGESA_STATUS agesa_NoopSuccess (UINT32 Func, UINTN Data, VOID *ConfigPtr) |
Kyösti Mälkki | c459f96 | 2014-05-04 17:07:45 +0300 | [diff] [blame] | 53 | { |
| 54 | return AGESA_SUCCESS; |
| 55 | } |
| 56 | |
Stefan Reinauer | dd132a5 | 2015-07-30 11:16:37 -0700 | [diff] [blame] | 57 | AGESA_STATUS agesa_EmptyIdsInitData (UINT32 Func, UINTN Data, VOID *ConfigPtr) |
Kyösti Mälkki | c459f96 | 2014-05-04 17:07:45 +0300 | [diff] [blame] | 58 | { |
| 59 | IDS_NV_ITEM *IdsPtr = ((IDS_CALLOUT_STRUCT *) ConfigPtr)->IdsNvPtr; |
| 60 | if (Data == IDS_CALLOUT_INIT) |
| 61 | IdsPtr[0].IdsNvValue = IdsPtr[0].IdsNvId = 0xffff; |
| 62 | return AGESA_SUCCESS; |
| 63 | } |
Kyösti Mälkki | 5e19fa4 | 2014-05-04 23:13:54 +0300 | [diff] [blame] | 64 | |
Stefan Reinauer | dd132a5 | 2015-07-30 11:16:37 -0700 | [diff] [blame] | 65 | AGESA_STATUS agesa_Reset (UINT32 Func, UINTN Data, VOID *ConfigPtr) |
Kyösti Mälkki | 5e19fa4 | 2014-05-04 23:13:54 +0300 | [diff] [blame] | 66 | { |
| 67 | AGESA_STATUS Status; |
| 68 | UINT8 Value; |
| 69 | UINTN ResetType; |
| 70 | AMD_CONFIG_PARAMS *StdHeader; |
| 71 | |
| 72 | ResetType = Data; |
| 73 | StdHeader = ConfigPtr; |
| 74 | |
| 75 | // |
| 76 | // Perform the RESET based upon the ResetType. In case of |
| 77 | // WARM_RESET_WHENVER and COLD_RESET_WHENEVER, the request will go to |
| 78 | // AmdResetManager. During the critical condition, where reset is required |
| 79 | // immediately, the reset will be invoked directly by writing 0x04 to port |
| 80 | // 0xCF9 (Reset Port). |
| 81 | // |
| 82 | switch (ResetType) { |
| 83 | case WARM_RESET_WHENEVER: |
| 84 | case COLD_RESET_WHENEVER: |
| 85 | break; |
| 86 | |
| 87 | case WARM_RESET_IMMEDIATELY: |
| 88 | case COLD_RESET_IMMEDIATELY: |
| 89 | Value = 0x06; |
| 90 | LibAmdIoWrite (AccessWidth8, 0xCf9, &Value, StdHeader); |
| 91 | break; |
| 92 | |
| 93 | default: |
| 94 | break; |
| 95 | } |
| 96 | |
| 97 | Status = 0; |
| 98 | return Status; |
| 99 | } |
Kyösti Mälkki | 6b4b151 | 2014-05-05 12:05:53 +0300 | [diff] [blame] | 100 | |
Stefan Reinauer | dd132a5 | 2015-07-30 11:16:37 -0700 | [diff] [blame] | 101 | AGESA_STATUS agesa_RunFuncOnAp (UINT32 Func, UINTN Data, VOID *ConfigPtr) |
Kyösti Mälkki | 6b4b151 | 2014-05-05 12:05:53 +0300 | [diff] [blame] | 102 | { |
| 103 | AGESA_STATUS Status; |
| 104 | |
| 105 | Status = agesawrapper_amdlaterunaptask (Func, Data, ConfigPtr); |
| 106 | return Status; |
| 107 | } |
| 108 | |
Edward O'Callaghan | 12bb8f9 | 2014-11-21 02:45:10 +1100 | [diff] [blame] | 109 | #if IS_ENABLED(CONFIG_NORTHBRIDGE_AMD_AGESA_FAMILY15_TN) || \ |
| 110 | IS_ENABLED(CONFIG_NORTHBRIDGE_AMD_AGESA_FAMILY15_RL) || \ |
| 111 | IS_ENABLED(CONFIG_NORTHBRIDGE_AMD_AGESA_FAMILY16_KB) |
Kyösti Mälkki | cb989f2 | 2014-05-04 23:13:08 +0300 | [diff] [blame] | 112 | /* FIXME: we would like GFX disable for fam14 too for headless systems. */ |
Stefan Reinauer | dd132a5 | 2015-07-30 11:16:37 -0700 | [diff] [blame] | 113 | AGESA_STATUS agesa_GfxGetVbiosImage(UINT32 Func, UINTN FchData, VOID *ConfigPrt) |
Kyösti Mälkki | cb989f2 | 2014-05-04 23:13:08 +0300 | [diff] [blame] | 114 | { |
| 115 | GFX_VBIOS_IMAGE_INFO *pVbiosImageInfo = (GFX_VBIOS_IMAGE_INFO *)ConfigPrt; |
Aaron Durbin | 899d13d | 2015-05-15 23:39:23 -0500 | [diff] [blame] | 116 | pVbiosImageInfo->ImagePtr = cbfs_boot_map_with_leak( |
| 117 | "pci"CONFIG_VGA_BIOS_ID".rom", |
Kyösti Mälkki | cb989f2 | 2014-05-04 23:13:08 +0300 | [diff] [blame] | 118 | CBFS_TYPE_OPTIONROM, NULL); |
| 119 | /* printk(BIOS_DEBUG, "IMGptr=%x\n", pVbiosImageInfo->ImagePtr); */ |
| 120 | return pVbiosImageInfo->ImagePtr == NULL ? AGESA_WARNING : AGESA_SUCCESS; |
| 121 | } |
Kyösti Mälkki | a1ebbc4 | 2014-10-17 22:33:22 +0300 | [diff] [blame] | 122 | #endif |
Kyösti Mälkki | c5cc9f2 | 2014-10-17 22:33:22 +0300 | [diff] [blame] | 123 | |
Stefan Reinauer | dd132a5 | 2015-07-30 11:16:37 -0700 | [diff] [blame] | 124 | AGESA_STATUS agesa_ReadSpd (UINT32 Func, UINTN Data, VOID *ConfigPtr) |
Kyösti Mälkki | c5cc9f2 | 2014-10-17 22:33:22 +0300 | [diff] [blame] | 125 | { |
| 126 | AGESA_STATUS Status = AGESA_UNSUPPORTED; |
| 127 | #ifdef __PRE_RAM__ |
| 128 | Status = AmdMemoryReadSPD (Func, Data, ConfigPtr); |
| 129 | #endif |
| 130 | return Status; |
| 131 | } |
Kyösti Mälkki | 36abdc4 | 2014-05-05 16:40:15 +0300 | [diff] [blame] | 132 | |
Stefan Reinauer | dd132a5 | 2015-07-30 11:16:37 -0700 | [diff] [blame] | 133 | AGESA_STATUS agesa_ReadSpd_from_cbfs(UINT32 Func, UINTN Data, VOID *ConfigPtr) |
Kyösti Mälkki | 36abdc4 | 2014-05-05 16:40:15 +0300 | [diff] [blame] | 134 | { |
| 135 | AGESA_STATUS Status = AGESA_UNSUPPORTED; |
| 136 | #ifdef __PRE_RAM__ |
| 137 | AGESA_READ_SPD_PARAMS *info = ConfigPtr; |
| 138 | if (info->MemChannelId > 0) |
| 139 | return AGESA_UNSUPPORTED; |
| 140 | if (info->SocketId != 0) |
| 141 | return AGESA_UNSUPPORTED; |
| 142 | if (info->DimmId != 0) |
| 143 | return AGESA_UNSUPPORTED; |
| 144 | |
| 145 | /* Read index 0, first SPD_SIZE bytes of spd.bin file. */ |
| 146 | if (read_spd_from_cbfs((u8*)info->Buffer, 0) < 0) |
| 147 | die("No SPD data\n"); |
| 148 | |
| 149 | Status = AGESA_SUCCESS; |
| 150 | #endif |
| 151 | return Status; |
| 152 | } |