remove trailing whitespace
[coreboot.git] / src / mainboard / asrock / e350m1 / PlatformGnbPcie.c
1 /*
2  * This file is part of the coreboot project.
3  *
4  * Copyright (C) 2011 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.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
18  */
19
20 #include "AGESA.h"
21 #include "amdlib.h"
22 #include "Ids.h"
23 #include "heapManager.h"
24 #include "PlatformGnbPcieComplex.h"
25 #include "Filecode.h"
26
27 #define FILECODE PROC_RECOVERY_MEM_NB_ON_MRNON_FILECODE
28
29 /*---------------------------------------------------------------------------------------*/
30 /**
31  *  OemCustomizeInitEarly
32  *
33  *  Description:
34  *    This is the stub function will call the host environment through the binary block
35  *    interface (call-out port) to provide a user hook opportunity
36  *
37  *  Parameters:
38  *    @param[in]      **PeiServices
39  *    @param[in]      *InitEarly
40  *
41  *    @retval         VOID
42  *
43  **/
44 /*---------------------------------------------------------------------------------------*/
45 VOID
46 OemCustomizeInitEarly (
47   IN  OUT AMD_EARLY_PARAMS    *InitEarly
48   )
49 {
50   AGESA_STATUS         Status;
51   VOID                 *BrazosPcieComplexListPtr;
52   VOID                 *BrazosPciePortPtr;
53   VOID                 *BrazosPcieDdiPtr;
54
55   ALLOCATE_HEAP_PARAMS AllocHeapParams;
56
57 PCIe_PORT_DESCRIPTOR PortList [] = {
58         // Initialize Port descriptor (PCIe port, Lanes 4, PCI Device Number 4, ...)
59         {
60           0, //Descriptor flags  !!!IMPORTANT!!! Terminate last element of array
61           PCIE_ENGINE_DATA_INITIALIZER (PciePortEngine, 4, 4),
62           PCIE_PORT_DATA_INITIALIZER (GNB_GPP_PORT4_PORT_PRESENT, GNB_GPP_PORT4_CHANNEL_TYPE, 4, GNB_GPP_PORT4_HOTPLUG_SUPPORT, GNB_GPP_PORT4_SPEED_MODE, GNB_GPP_PORT4_SPEED_MODE, GNB_GPP_PORT4_LINK_ASPM, 4)
63         },
64         #if 1
65         // Initialize Port descriptor (PCIe port, Lanes 5, PCI Device Number 5, ...)
66         {
67           0, //Descriptor flags  !!!IMPORTANT!!! Terminate last element of array
68           PCIE_ENGINE_DATA_INITIALIZER (PciePortEngine, 5, 5),
69           PCIE_PORT_DATA_INITIALIZER (GNB_GPP_PORT5_PORT_PRESENT, GNB_GPP_PORT5_CHANNEL_TYPE, 5, GNB_GPP_PORT5_HOTPLUG_SUPPORT, GNB_GPP_PORT5_SPEED_MODE, GNB_GPP_PORT5_SPEED_MODE, GNB_GPP_PORT5_LINK_ASPM, 5)
70         },
71         // Initialize Port descriptor (PCIe port, Lanes 6, PCI Device Number 6, ...)
72         {
73           0, //Descriptor flags  !!!IMPORTANT!!! Terminate last element of array
74           PCIE_ENGINE_DATA_INITIALIZER (PciePortEngine, 6, 6),
75           PCIE_PORT_DATA_INITIALIZER (GNB_GPP_PORT6_PORT_PRESENT, GNB_GPP_PORT6_CHANNEL_TYPE, 6, GNB_GPP_PORT6_HOTPLUG_SUPPORT, GNB_GPP_PORT6_SPEED_MODE, GNB_GPP_PORT6_SPEED_MODE, GNB_GPP_PORT6_LINK_ASPM, 6)
76         },
77         // Initialize Port descriptor (PCIe port, Lanes 7, PCI Device Number 7, ...)
78         {
79           0,
80           PCIE_ENGINE_DATA_INITIALIZER (PciePortEngine, 7, 7),
81           PCIE_PORT_DATA_INITIALIZER (GNB_GPP_PORT7_PORT_PRESENT, GNB_GPP_PORT7_CHANNEL_TYPE, 7, GNB_GPP_PORT7_HOTPLUG_SUPPORT, GNB_GPP_PORT7_SPEED_MODE, GNB_GPP_PORT7_SPEED_MODE, GNB_GPP_PORT7_LINK_ASPM, 7)
82         },
83         #endif
84         // Initialize Port descriptor (PCIe port, Lanes 8, PCI Device Number 8, ...)
85         {
86           DESCRIPTOR_TERMINATE_LIST, //Descriptor flags  !!!IMPORTANT!!! Terminate last element of array
87           PCIE_ENGINE_DATA_INITIALIZER (PciePortEngine, 0, 3),
88           PCIE_PORT_DATA_INITIALIZER (GNB_GPP_PORT8_PORT_PRESENT, GNB_GPP_PORT8_CHANNEL_TYPE, 8, GNB_GPP_PORT8_HOTPLUG_SUPPORT, GNB_GPP_PORT8_SPEED_MODE, GNB_GPP_PORT8_SPEED_MODE, GNB_GPP_PORT8_LINK_ASPM, 0)
89         }
90 };
91
92 PCIe_DDI_DESCRIPTOR DdiList [] = {
93         // Initialize Ddi descriptor (DDI interface Lanes 8:11, DdA, ...)
94         {
95           0,   //Descriptor flags
96           PCIE_ENGINE_DATA_INITIALIZER (PcieDdiEngine, 8, 11),
97           //PCIE_DDI_DATA_INITIALIZER (ConnectorTypeDP, Aux1, Hdp1)
98           {ConnectorTypeDP, Aux1, Hdp1}
99         },
100         // Initialize Ddi descriptor (DDI interface Lanes 12:15, DdB, ...)
101         {
102           DESCRIPTOR_TERMINATE_LIST, //Descriptor flags  !!!IMPORTANT!!! Terminate last element of array
103           PCIE_ENGINE_DATA_INITIALIZER (PcieDdiEngine, 12, 15),
104           //PCIE_DDI_DATA_INITIALIZER (ConnectorTypeDP, Aux2, Hdp2)
105           {ConnectorTypeDP, Aux2, Hdp2}
106         }
107 };
108
109 PCIe_COMPLEX_DESCRIPTOR Brazos = {
110         DESCRIPTOR_TERMINATE_LIST,
111         0,
112         &PortList[0],
113         &DdiList[0]
114 };
115
116   // GNB PCIe topology Porting
117
118   //
119   // Allocate buffer for PCIe_COMPLEX_DESCRIPTOR , PCIe_PORT_DESCRIPTOR and PCIe_DDI_DESCRIPTOR
120   //
121   AllocHeapParams.RequestedBufferSize = (sizeof (PCIe_COMPLEX_DESCRIPTOR)  +
122                                          sizeof (PCIe_PORT_DESCRIPTOR) * 5 +
123                                          sizeof (PCIe_DDI_DESCRIPTOR)) * 2;
124
125   AllocHeapParams.BufferHandle = AMD_MEM_MISC_HANDLES_START;
126   AllocHeapParams.Persist = HEAP_LOCAL_CACHE;
127   Status = HeapAllocateBuffer (&AllocHeapParams, &InitEarly->StdHeader);
128   if ( Status!= AGESA_SUCCESS) {
129     // Could not allocate buffer for PCIe_COMPLEX_DESCRIPTOR , PCIe_PORT_DESCRIPTOR and PCIe_DDI_DESCRIPTOR
130     ASSERT(FALSE);
131     return Status;
132   }
133
134   BrazosPcieComplexListPtr  =  (PCIe_COMPLEX_DESCRIPTOR *) AllocHeapParams.BufferPtr;
135
136   AllocHeapParams.BufferPtr += sizeof (PCIe_COMPLEX_DESCRIPTOR);
137   BrazosPciePortPtr         =  (PCIe_PORT_DESCRIPTOR *)AllocHeapParams.BufferPtr;
138
139   AllocHeapParams.BufferPtr += sizeof (PCIe_PORT_DESCRIPTOR) * 5;
140   BrazosPcieDdiPtr          =  (PCIe_DDI_DESCRIPTOR *) AllocHeapParams.BufferPtr;
141
142   LibAmdMemFill (BrazosPcieComplexListPtr,
143                    0,
144                    sizeof (PCIe_COMPLEX_DESCRIPTOR),
145                    &InitEarly->StdHeader);
146
147   LibAmdMemFill (BrazosPciePortPtr,
148                    0,
149                    sizeof (PCIe_PORT_DESCRIPTOR) * 5,
150                    &InitEarly->StdHeader);
151
152   LibAmdMemFill (BrazosPcieDdiPtr,
153                    0,
154                    sizeof (PCIe_DDI_DESCRIPTOR) * 2,
155                    &InitEarly->StdHeader);
156
157   LibAmdMemCopy  (BrazosPcieComplexListPtr, &Brazos, sizeof (PCIe_COMPLEX_DESCRIPTOR), &InitEarly->StdHeader);
158   LibAmdMemCopy  (BrazosPciePortPtr, &PortList[0], sizeof (PCIe_PORT_DESCRIPTOR) * 5, &InitEarly->StdHeader);
159   LibAmdMemCopy  (BrazosPcieDdiPtr, &DdiList[0], sizeof (PCIe_DDI_DESCRIPTOR) *2, &InitEarly->StdHeader);
160
161
162   ((PCIe_COMPLEX_DESCRIPTOR*)BrazosPcieComplexListPtr)->PciePortList =  (PCIe_PORT_DESCRIPTOR*)BrazosPciePortPtr;
163   ((PCIe_COMPLEX_DESCRIPTOR*)BrazosPcieComplexListPtr)->DdiLinkList  =  (PCIe_DDI_DESCRIPTOR*)BrazosPcieDdiPtr;
164
165   InitEarly->GnbConfig.PcieComplexList = BrazosPcieComplexListPtr;
166   InitEarly->GnbConfig.PsppPolicy      = 0;
167 }
168