blob: cc733c4318cda5d4c7af85e76fa5404930f65445 [file] [log] [blame]
Kyösti Mälkkic459f962014-05-04 17:07:45 +03001/*
2 * This file is part of the coreboot project.
3 *
4 * Copyright (C) 2011 Advanced Micro Devices, Inc.
Kyösti Mälkki36abdc42014-05-05 16:40:15 +03005 * Copyright (C) 2013 Sage Electronic Engineering, LLC
Kyösti Mälkkic459f962014-05-04 17:07:45 +03006 *
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älkkic459f962014-05-04 17:07:45 +030015 */
16
Kyösti Mälkki36abdc42014-05-05 16:40:15 +030017#include <cbfs.h>
18#include <spd_cache.h>
19
Kyösti Mälkkic459f962014-05-04 17:07:45 +030020#include "AGESA.h"
Kyösti Mälkki5e19fa42014-05-04 23:13:54 +030021#include "amdlib.h"
Kyösti Mälkkic459f962014-05-04 17:07:45 +030022#include "Ids.h"
Kyösti Mälkkif21c2ac2014-10-19 09:35:18 +030023#include <northbridge/amd/agesa/agesawrapper.h>
Kyösti Mälkki26f297e2014-05-26 11:27:54 +030024#include "BiosCallOuts.h"
Kyösti Mälkkic5cc9f22014-10-17 22:33:22 +030025#include "dimmSpd.h"
Kyösti Mälkkic459f962014-05-04 17:07:45 +030026
Stefan Reinauerdd132a52015-07-30 11:16:37 -070027AGESA_STATUS GetBiosCallout (UINT32 Func, UINTN Data, VOID *ConfigPtr)
Kyösti Mälkki6025efa2014-05-05 13:20:56 +030028{
Kyösti Mälkki82fbda72015-01-02 22:46:32 +020029 AGESA_STATUS status;
Kyösti Mälkki6025efa2014-05-05 13:20:56 +030030 UINTN i;
31
Kyösti Mälkki82fbda72015-01-02 22:46:32 +020032 /* One HeapManager serves them all. */
33 status = HeapManagerCallout(Func, Data, ConfigPtr);
34 if (status != AGESA_UNSUPPORTED)
35 return status;
36
Kyösti Mälkki6025efa2014-05-05 13:20:56 +030037 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 Reinauerdd132a52015-07-30 11:16:37 -070047AGESA_STATUS agesa_NoopUnsupported (UINT32 Func, UINTN Data, VOID *ConfigPtr)
Kyösti Mälkkic459f962014-05-04 17:07:45 +030048{
49 return AGESA_UNSUPPORTED;
50}
51
Stefan Reinauerdd132a52015-07-30 11:16:37 -070052AGESA_STATUS agesa_NoopSuccess (UINT32 Func, UINTN Data, VOID *ConfigPtr)
Kyösti Mälkkic459f962014-05-04 17:07:45 +030053{
54 return AGESA_SUCCESS;
55}
56
Stefan Reinauerdd132a52015-07-30 11:16:37 -070057AGESA_STATUS agesa_EmptyIdsInitData (UINT32 Func, UINTN Data, VOID *ConfigPtr)
Kyösti Mälkkic459f962014-05-04 17:07:45 +030058{
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älkki5e19fa42014-05-04 23:13:54 +030064
Stefan Reinauerdd132a52015-07-30 11:16:37 -070065AGESA_STATUS agesa_Reset (UINT32 Func, UINTN Data, VOID *ConfigPtr)
Kyösti Mälkki5e19fa42014-05-04 23:13:54 +030066{
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älkki6b4b1512014-05-05 12:05:53 +0300100
Stefan Reinauerdd132a52015-07-30 11:16:37 -0700101AGESA_STATUS agesa_RunFuncOnAp (UINT32 Func, UINTN Data, VOID *ConfigPtr)
Kyösti Mälkki6b4b1512014-05-05 12:05:53 +0300102{
103 AGESA_STATUS Status;
104
105 Status = agesawrapper_amdlaterunaptask (Func, Data, ConfigPtr);
106 return Status;
107}
108
Edward O'Callaghan12bb8f92014-11-21 02:45:10 +1100109#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älkkicb989f22014-05-04 23:13:08 +0300112/* FIXME: we would like GFX disable for fam14 too for headless systems. */
Stefan Reinauerdd132a52015-07-30 11:16:37 -0700113AGESA_STATUS agesa_GfxGetVbiosImage(UINT32 Func, UINTN FchData, VOID *ConfigPrt)
Kyösti Mälkkicb989f22014-05-04 23:13:08 +0300114{
115 GFX_VBIOS_IMAGE_INFO *pVbiosImageInfo = (GFX_VBIOS_IMAGE_INFO *)ConfigPrt;
Aaron Durbin899d13d2015-05-15 23:39:23 -0500116 pVbiosImageInfo->ImagePtr = cbfs_boot_map_with_leak(
117 "pci"CONFIG_VGA_BIOS_ID".rom",
Kyösti Mälkkicb989f22014-05-04 23:13:08 +0300118 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älkkia1ebbc42014-10-17 22:33:22 +0300122#endif
Kyösti Mälkkic5cc9f22014-10-17 22:33:22 +0300123
Stefan Reinauerdd132a52015-07-30 11:16:37 -0700124AGESA_STATUS agesa_ReadSpd (UINT32 Func, UINTN Data, VOID *ConfigPtr)
Kyösti Mälkkic5cc9f22014-10-17 22:33:22 +0300125{
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älkki36abdc42014-05-05 16:40:15 +0300132
Stefan Reinauerdd132a52015-07-30 11:16:37 -0700133AGESA_STATUS agesa_ReadSpd_from_cbfs(UINT32 Func, UINTN Data, VOID *ConfigPtr)
Kyösti Mälkki36abdc42014-05-05 16:40:15 +0300134{
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}