blob: 9d9675329835826cbb81969ee6e5948d8d643c6b [file] [log] [blame]
Rudolf Marekc8eab2c2013-03-20 21:43:50 +01001/*
2 * This file is part of the coreboot project.
3 *
4 * Copyright (C) 2012 Advanced Micro Devices, Inc.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
Rudolf Marekc8eab2c2013-03-20 21:43:50 +010014 */
15
Elyes HAOUAS19f5ba82018-10-14 14:52:06 +020016#include <Porting.h>
17#include <AGESA.h>
Idwer Volleringfa02e162014-03-29 13:13:10 +010018
Kyösti Mälkkiffa52702017-03-04 07:33:35 +020019#include <northbridge/amd/agesa/state_machine.h>
Kyösti Mälkki53052fe2016-04-27 09:04:11 +030020#include <PlatformMemoryConfiguration.h>
Rudolf Marekc8eab2c2013-03-20 21:43:50 +010021
Rudolf Marekcd1cef42013-05-04 00:08:34 +020022/*
23 * Lane ID Mapping (from Fam15h BKDG: Table 45: Lane Id Mapping)
24 *
25 * Lane Id
26 * 0 P_UMI_[T,R]X[P,N]0 - southbridge link, connect via dev 8
27 * 1 P_UMI_[T,R]X[P,N]1 - southbridge link, connect via dev 8
28 * 2 P_UMI_[T,R]X[P,N]2 - southbridge link, connect via dev 8
29 * 3 P_UMI_[T,R]X[P,N]3 - southbridge link, connect via dev 8
30 * 4 P_GPP_[T,R]X[P,N]0 - may connect to PCI dev 4 - 7
31 * 5 P_GPP_[T,R]X[P,N]1 - may connect to PCI dev 4 - 7
32 * 6 P_GPP_[T,R]X[P,N]2 - may connect to PCI dev 4 - 7
33 * 7 P_GPP_[T,R]X[P,N]3 - may connect to PCI dev 4 - 7
34 * 8 P_GFX_[T,R]X[P,N]0 - may be used to form GFX slot or DDI
35 * 9 P_GFX_[T,R]X[P,N]1 - may be used to form GFX slot or DDI
36 * 10 P_GFX_[T,R]X[P,N]2 - may be used to form GFX slot or DDI
37 * 11 P_GFX_[T,R]X[P,N]3 - may be used to form GFX slot or DDI
38 * 12 P_GFX_[T,R]X[P,N]4 - may be used to form GFX slot or DDI
39 * 13 P_GFX_[T,R]X[P,N]5 - may be used to form GFX slot or DDI
40 * 14 P_GFX_[T,R]X[P,N]6 - may be used to form GFX slot or DDI
41 * 15 P_GFX_[T,R]X[P,N]7 - may be used to form GFX slot or DDI
42 * 16 P_GFX_[T,R]X[P,N]8 - may be used to form GFX slot or DDI
43 * 17 P_GFX_[T,R]X[P,N]9 - may be used to form GFX slot or DDI
44 * 18 P_GFX_[T,R]X[P,N]10 - may be used to form GFX slot or DDI
45 * 19 P_GFX_[T,R]X[P,N]11 - may be used to form GFX slot or DDI
46 * 20 P_GFX_[T,R]X[P,N]12 - may be used to form GFX slot or DDI
47 * 21 P_GFX_[T,R]X[P,N]13 - may be used to form GFX slot or DDI
48 * 22 P_GFX_[T,R]X[P,N]14 - may be used to form GFX slot or DDI
49 * 23 P_GFX_[T,R]X[P,N]15 - may be used to form GFX slot or DDI
50 * 24 DP0_TX[P,N]0 - rest is just for DDI (graphics outputs)
51 * 25 DP0_TX[P,N]1
52 * 26 DP0_TX[P,N]2
53 * 27 DP0_TX[P,N]3
54 * 28 DP1_TX[P,N]0
55 * 29 DP1_TX[P,N]1
56 * 30 DP1_TX[P,N]2
57 * 31 DP1_TX[P,N]3
58 * 32 DP2_TX[P,N]0
59 * 33 DP2_TX[P,N]1
60 * 34 DP2_TX[P,N]2
61 * 35 DP2_TX[P,N]3
62 * 36 DP2_TX[P,N]4
63 * 37 DP2_TX[P,N]5
64 * 38 DP2_TX[P,N]6
65 */
66
Kyösti Mälkkie52738b2017-09-21 12:32:43 +030067static const PCIe_PORT_DESCRIPTOR PortList[] = {
Rudolf Marek8f485de2013-05-04 00:08:34 +020068 /* PCIe port, Lanes 8:23, PCI Device Number 2, blue x16 slot */
Rudolf Marekc8eab2c2013-03-20 21:43:50 +010069 {
Kyösti Mälkki9d035fa2015-05-23 14:27:44 +030070 0,
Kyösti Mälkkie52738b2017-09-21 12:32:43 +030071 PCIE_ENGINE_DATA_INITIALIZER(PciePortEngine, 8, 23),
Kyösti Mälkki9fee35c2017-09-23 19:10:04 +030072 PCIE_PORT_DATA_INITIALIZER(PortEnabled, ChannelTypeExt6db, 2,
73 HotplugDisabled,
74 PcieGenMaxSupported,
75 PcieGenMaxSupported,
76 AspmDisabled, 1)
Rudolf Marekc8eab2c2013-03-20 21:43:50 +010077 },
Rudolf Marek8f485de2013-05-04 00:08:34 +020078 /* PCIe port, Lanes 4:7, PCI Device Number 4, black x16 slot (in fact x4) */
Rudolf Marekc8eab2c2013-03-20 21:43:50 +010079 {
Kyösti Mälkki9d035fa2015-05-23 14:27:44 +030080 0,
Kyösti Mälkkie52738b2017-09-21 12:32:43 +030081 PCIE_ENGINE_DATA_INITIALIZER(PciePortEngine, 4, 7),
Kyösti Mälkki9fee35c2017-09-23 19:10:04 +030082 PCIE_PORT_DATA_INITIALIZER(PortEnabled, ChannelTypeExt6db, 4,
83 HotplugDisabled,
84 PcieGenMaxSupported,
85 PcieGenMaxSupported,
86 AspmDisabled, 1)
Rudolf Marekc8eab2c2013-03-20 21:43:50 +010087 },
Rudolf Marek8f485de2013-05-04 00:08:34 +020088 /* PCIe port, Lanes 0:3, UMI link to SB, PCI Device Number 8 */
Rudolf Marekc8eab2c2013-03-20 21:43:50 +010089 {
Kyösti Mälkki9d035fa2015-05-23 14:27:44 +030090 DESCRIPTOR_TERMINATE_LIST,
Kyösti Mälkkie52738b2017-09-21 12:32:43 +030091 PCIE_ENGINE_DATA_INITIALIZER(PciePortEngine, 0, 3),
Kyösti Mälkki9fee35c2017-09-23 19:10:04 +030092 PCIE_PORT_DATA_INITIALIZER(PortEnabled, ChannelTypeExt6db, 8,
93 HotplugDisabled,
94 PcieGenMaxSupported,
95 PcieGenMaxSupported,
96 AspmDisabled, 0)
Rudolf Marekc8eab2c2013-03-20 21:43:50 +010097 },
Rudolf Marekc8eab2c2013-03-20 21:43:50 +010098};
99
Rudolf Marek8f485de2013-05-04 00:08:34 +0200100/*
101 * It is not known, if the setup is complete.
102 *
103 * Tested and works: VGA/DVI
104 * Untested: HDMI
105 */
Kyösti Mälkkie52738b2017-09-21 12:32:43 +0300106static const PCIe_DDI_DESCRIPTOR DdiList[] = {
Rudolf Marekc8eab2c2013-03-20 21:43:50 +0100107 // DP0 to HDMI0/DP
108 {
109 0,
Kyösti Mälkkie52738b2017-09-21 12:32:43 +0300110 PCIE_ENGINE_DATA_INITIALIZER(PcieDdiEngine, 24, 27),
111 PCIE_DDI_DATA_INITIALIZER(ConnectorTypeHDMI, Aux1, Hdp1)
Rudolf Marekc8eab2c2013-03-20 21:43:50 +0100112 },
113 // DP1 to FCH
114 {
115 0,
Kyösti Mälkkie52738b2017-09-21 12:32:43 +0300116 PCIE_ENGINE_DATA_INITIALIZER(PcieDdiEngine, 28, 31),
117 PCIE_DDI_DATA_INITIALIZER(ConnectorTypeNutmegDpToVga, Aux2, Hdp2)
Rudolf Marekc8eab2c2013-03-20 21:43:50 +0100118 },
119 // DP2 to HDMI1/DP
120 {
121 0,
Kyösti Mälkkie52738b2017-09-21 12:32:43 +0300122 PCIE_ENGINE_DATA_INITIALIZER(PcieDdiEngine, 32, 35),
123 PCIE_DDI_DATA_INITIALIZER(ConnectorTypeHDMI, Aux3, Hdp3)
Rudolf Marekc8eab2c2013-03-20 21:43:50 +0100124 },
Rudolf Marekc8eab2c2013-03-20 21:43:50 +0100125};
126
Kyösti Mälkki87df2672017-09-23 14:36:16 +0300127static const PCIe_COMPLEX_DESCRIPTOR PcieComplex = {
128 .Flags = DESCRIPTOR_TERMINATE_LIST,
129 .SocketId = 0,
130 .PciePortList = PortList,
131 .DdiLinkList = DdiList,
Rudolf Marekc8eab2c2013-03-20 21:43:50 +0100132};
133
Kyösti Mälkkiffa52702017-03-04 07:33:35 +0200134void board_BeforeInitReset(struct sysinfo *cb, AMD_RESET_PARAMS *Reset)
135{
136 FCH_RESET_INTERFACE *FchReset = &Reset->FchInterface;
137 FchReset->Xhci0Enable = IS_ENABLED(CONFIG_HUDSON_XHCI_ENABLE);
138 FchReset->Xhci1Enable = IS_ENABLED(CONFIG_HUDSON_XHCI_ENABLE);
139}
140
Kyösti Mälkkiffa52702017-03-04 07:33:35 +0200141void board_BeforeInitEarly(struct sysinfo *cb, AMD_EARLY_PARAMS *InitEarly)
Rudolf Marekc8eab2c2013-03-20 21:43:50 +0100142{
Kyösti Mälkki87df2672017-09-23 14:36:16 +0300143 InitEarly->GnbConfig.PcieComplexList = &PcieComplex;
144 InitEarly->GnbConfig.PsppPolicy = 0;
Kyösti Mälkki296696d2014-12-16 09:29:56 +0200145}
146
Kyösti Mälkki53052fe2016-04-27 09:04:11 +0300147/*----------------------------------------------------------------------------------------
148 * CUSTOMER OVERIDES MEMORY TABLE
149 *----------------------------------------------------------------------------------------
150 */
151
Kyösti Mälkki53052fe2016-04-27 09:04:11 +0300152/*
153 * Platform Specific Overriding Table allows IBV/OEM to pass in platform information to AGESA
154 * (e.g. MemClk routing, the number of DIMM slots per channel,...). If PlatformSpecificTable
155 * is populated, AGESA will base its settings on the data from the table. Otherwise, it will
156 * use its default conservative settings.
157 */
Kyösti Mälkkiffa52702017-03-04 07:33:35 +0200158static CONST PSO_ENTRY ROMDATA MemoryTable_M[] = {
Kyösti Mälkki53052fe2016-04-27 09:04:11 +0300159
Kyösti Mälkkie52738b2017-09-21 12:32:43 +0300160 NUMBER_OF_DIMMS_SUPPORTED(ANY_SOCKET, ANY_CHANNEL, 2),
161 NUMBER_OF_CHANNELS_SUPPORTED(ANY_SOCKET, 2),
Kyösti Mälkki53052fe2016-04-27 09:04:11 +0300162/*
163 TODO: is this OK for DDR3 socket FM2?
Kyösti Mälkkie52738b2017-09-21 12:32:43 +0300164 MEMCLK_DIS_MAP(ANY_SOCKET, ANY_CHANNEL, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00),
165 CKE_TRI_MAP(ANY_SOCKET, ANY_CHANNEL, 0x05, 0x0A),
166 ODT_TRI_MAP(ANY_SOCKET, ANY_CHANNEL, 0x01, 0x02, 0x00, 0x00),
167 CS_TRI_MAP(ANY_SOCKET, ANY_CHANNEL, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00),
Kyösti Mälkki53052fe2016-04-27 09:04:11 +0300168 */
169 PSO_END
170};
Kyösti Mälkkiffa52702017-03-04 07:33:35 +0200171
172static CONST PSO_ENTRY ROMDATA MemoryTable_M_LE[] = {
Denis 'GNUtoo' Carikli420d3a92015-07-26 19:57:51 +0200173
Kyösti Mälkkie52738b2017-09-21 12:32:43 +0300174 NUMBER_OF_DIMMS_SUPPORTED(ANY_SOCKET, ANY_CHANNEL, 1),
175 NUMBER_OF_CHANNELS_SUPPORTED(ANY_SOCKET, 2),
Kyösti Mälkkiffa52702017-03-04 07:33:35 +0200176
Denis 'GNUtoo' Carikli420d3a92015-07-26 19:57:51 +0200177 PSO_END
178};
Kyösti Mälkki53052fe2016-04-27 09:04:11 +0300179
Kyösti Mälkkiffa52702017-03-04 07:33:35 +0200180void board_BeforeInitPost(struct sysinfo *cb, AMD_POST_PARAMS *InitPost)
181{
182 if (IS_ENABLED(CONFIG_BOARD_ASUS_F2A85_M) || IS_ENABLED(CONFIG_BOARD_ASUS_F2A85_M_PRO))
183 InitPost->MemConfig.PlatformMemoryConfiguration = (PSO_ENTRY *) MemoryTable_M;
184 else if (IS_ENABLED(CONFIG_BOARD_ASUS_F2A85_M_LE))
185 InitPost->MemConfig.PlatformMemoryConfiguration = (PSO_ENTRY *) MemoryTable_M_LE;
186}
187
188void board_BeforeInitMid(struct sysinfo *cb, AMD_MID_PARAMS *InitMid)
189{
190 /* 0 iGpuVgaAdapter, 1 iGpuVgaNonAdapter; */
191 InitMid->GnbMidConfiguration.iGpuVgaMode = 0;
192}