ea080a51e0f735ff8e6cd0a137978079a6ce9fad
[coreboot.git] / src / mainboard / amd / inagua / 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         // Initialize Port descriptor (PCIe port, Lanes 5, PCI Device Number 5, ...)
65         {
66           0, //Descriptor flags  !!!IMPORTANT!!! Terminate last element of array
67           PCIE_ENGINE_DATA_INITIALIZER (PciePortEngine, 5, 5),
68           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)
69         },
70         // Initialize Port descriptor (PCIe port, Lanes 6, PCI Device Number 6, ...)
71         {
72           0, //Descriptor flags  !!!IMPORTANT!!! Terminate last element of array
73           PCIE_ENGINE_DATA_INITIALIZER (PciePortEngine, 6, 6),
74           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)
75         },
76         // Initialize Port descriptor (PCIe port, Lanes 7, PCI Device Number 7, ...)
77         {
78           0,
79           PCIE_ENGINE_DATA_INITIALIZER (PciePortEngine, 7, 7),
80           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)
81         },
82         // Initialize Port descriptor (PCIe port, Lanes 8, PCI Device Number 8, ...)
83         {
84           DESCRIPTOR_TERMINATE_LIST, //Descriptor flags  !!!IMPORTANT!!! Terminate last element of array
85           PCIE_ENGINE_DATA_INITIALIZER (PciePortEngine, 0, 3),
86           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)
87         }
88 };
89
90 PCIe_DDI_DESCRIPTOR DdiList [] = {
91         // Initialize Ddi descriptor (DDI interface Lanes 8:11, DdA, ...)
92         {
93           0,   //Descriptor flags
94           PCIE_ENGINE_DATA_INITIALIZER (PcieDdiEngine, 8, 11),
95           //PCIE_DDI_DATA_INITIALIZER (ConnectorTypeDP, Aux1, Hdp1)
96           {ConnectorTypeDP, Aux1, Hdp1}
97         },
98         // Initialize Ddi descriptor (DDI interface Lanes 12:15, DdB, ...)
99         {
100           DESCRIPTOR_TERMINATE_LIST, //Descriptor flags  !!!IMPORTANT!!! Terminate last element of array
101           PCIE_ENGINE_DATA_INITIALIZER (PcieDdiEngine, 12, 15),
102           //PCIE_DDI_DATA_INITIALIZER (ConnectorTypeDP, Aux2, Hdp2)
103           {ConnectorTypeDP, Aux2, Hdp2}
104         }
105 };
106
107 PCIe_COMPLEX_DESCRIPTOR Brazos = {
108         DESCRIPTOR_TERMINATE_LIST,
109         0,
110         &PortList[0],
111         &DdiList[0]
112 };
113
114   // GNB PCIe topology Porting
115
116   //
117   // Allocate buffer for PCIe_COMPLEX_DESCRIPTOR , PCIe_PORT_DESCRIPTOR and PCIe_DDI_DESCRIPTOR
118   //
119   AllocHeapParams.RequestedBufferSize = (sizeof (PCIe_COMPLEX_DESCRIPTOR)  +
120                                          sizeof (PCIe_PORT_DESCRIPTOR) * 5 +
121                                          sizeof (PCIe_DDI_DESCRIPTOR)) * 2;
122
123   AllocHeapParams.BufferHandle = AMD_MEM_MISC_HANDLES_START;
124   AllocHeapParams.Persist = HEAP_LOCAL_CACHE;
125   Status = HeapAllocateBuffer (&AllocHeapParams, &InitEarly->StdHeader);
126   if ( Status!= AGESA_SUCCESS) {
127     // Could not allocate buffer for PCIe_COMPLEX_DESCRIPTOR , PCIe_PORT_DESCRIPTOR and PCIe_DDI_DESCRIPTOR
128     ASSERT(FALSE);
129         return;
130   }
131
132   BrazosPcieComplexListPtr  =  (PCIe_COMPLEX_DESCRIPTOR *) AllocHeapParams.BufferPtr;
133
134   AllocHeapParams.BufferPtr += sizeof (PCIe_COMPLEX_DESCRIPTOR);
135   BrazosPciePortPtr         =  (PCIe_PORT_DESCRIPTOR *)AllocHeapParams.BufferPtr;
136
137   AllocHeapParams.BufferPtr += sizeof (PCIe_PORT_DESCRIPTOR) * 5;
138   BrazosPcieDdiPtr          =  (PCIe_DDI_DESCRIPTOR *) AllocHeapParams.BufferPtr;
139
140   LibAmdMemFill (BrazosPcieComplexListPtr,
141                    0,
142                    sizeof (PCIe_COMPLEX_DESCRIPTOR),
143                    &InitEarly->StdHeader);
144
145   LibAmdMemFill (BrazosPciePortPtr,
146                    0,
147                    sizeof (PCIe_PORT_DESCRIPTOR) * 5,
148                    &InitEarly->StdHeader);
149
150   LibAmdMemFill (BrazosPcieDdiPtr,
151                    0,
152                    sizeof (PCIe_DDI_DESCRIPTOR) * 2,
153                    &InitEarly->StdHeader);
154
155   LibAmdMemCopy  (BrazosPcieComplexListPtr, &Brazos, sizeof (PCIe_COMPLEX_DESCRIPTOR), &InitEarly->StdHeader);
156   LibAmdMemCopy  (BrazosPciePortPtr, &PortList[0], sizeof (PCIe_PORT_DESCRIPTOR) * 5, &InitEarly->StdHeader);
157   LibAmdMemCopy  (BrazosPcieDdiPtr, &DdiList[0], sizeof (PCIe_DDI_DESCRIPTOR) *2, &InitEarly->StdHeader);
158
159
160   ((PCIe_COMPLEX_DESCRIPTOR*)BrazosPcieComplexListPtr)->PciePortList =  (PCIe_PORT_DESCRIPTOR*)BrazosPciePortPtr;
161   ((PCIe_COMPLEX_DESCRIPTOR*)BrazosPcieComplexListPtr)->DdiLinkList  =  (PCIe_DDI_DESCRIPTOR*)BrazosPcieDdiPtr;
162
163   InitEarly->GnbConfig.PcieComplexList = BrazosPcieComplexListPtr;
164   InitEarly->GnbConfig.PsppPolicy      = 0;
165 }
166