]> git.proxmox.com Git - mirror_edk2.git/blame - QuarkSocPkg/QuarkNorthCluster/MemoryInit/Pei/platform.c
QuarkSocPkg/QncSmmDispatcher: Fix context passed to SMI handlers
[mirror_edk2.git] / QuarkSocPkg / QuarkNorthCluster / MemoryInit / Pei / platform.c
CommitLineData
9b6bbcdb
MK
1/** @file\r
2The interface layer for memory controller access.\r
3It is supporting both real hardware platform and simulation environment.\r
4\r
5Copyright (c) 2013-2015 Intel Corporation.\r
6\r
7This program and the accompanying materials\r
8are licensed and made available under the terms and conditions of the BSD License\r
9which accompanies this distribution. The full text of the license may be found at\r
10http://opensource.org/licenses/bsd-license.php\r
11\r
12THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14\r
15**/\r
16#include "mrc.h"\r
17#include "memory_options.h"\r
18#include "meminit_utils.h"\r
19#include "io.h"\r
20\r
21#ifdef SIM\r
22\r
23void SimMmio32Write (\r
24 uint32_t be,\r
25 uint32_t address,\r
26 uint32_t data );\r
27\r
28void SimMmio32Read (\r
29 uint32_t be,\r
30 uint32_t address,\r
31 uint32_t *data );\r
32\r
33void SimDelayClk (\r
34 uint32_t x2clk );\r
35\r
36// This is a simple delay function.\r
37// It takes "nanoseconds" as a parameter.\r
38void delay_n(uint32_t nanoseconds)\r
39{\r
40 SimDelayClk( 800*nanoseconds/1000);\r
41}\r
42#endif\r
43\r
44/****\r
45 *\r
46 ***/\r
47uint32_t Rd32(\r
48 uint32_t unit,\r
49 uint32_t addr)\r
50{\r
51 uint32_t data;\r
52\r
53 switch (unit)\r
54 {\r
55 case MEM:\r
56 case MMIO:\r
57#ifdef SIM\r
58 SimMmio32Read( 1, addr, &data);\r
59#else\r
60 data = *PTR32(addr);\r
61#endif\r
62 break;\r
63\r
64 case MCU:\r
65 case HOST_BRIDGE:\r
66 case MEMORY_MANAGER:\r
67 case HTE:\r
68 // Handle case addr bigger than 8bit\r
69 pciwrite32(0, 0, 0, SB_HADR_REG, addr & 0xFFF00);\r
70 addr &= 0x00FF;\r
71\r
72 pciwrite32(0, 0, 0, SB_PACKET_REG,\r
73 SB_COMMAND(SB_REG_READ_OPCODE, unit, addr));\r
74 data = pciread32(0, 0, 0, SB_DATA_REG);\r
75 break;\r
76\r
77 case DDRPHY:\r
78 // Handle case addr bigger than 8bit\r
79 pciwrite32(0, 0, 0, SB_HADR_REG, addr & 0xFFF00);\r
80 addr &= 0x00FF;\r
81\r
82 pciwrite32(0, 0, 0, SB_PACKET_REG,\r
83 SB_COMMAND(SB_DDRIO_REG_READ_OPCODE, unit, addr));\r
84 data = pciread32(0, 0, 0, SB_DATA_REG);\r
85 break;\r
86\r
87 default:\r
88 DEAD_LOOP()\r
89 ;\r
90 }\r
91\r
92 if (unit < MEM)\r
93 DPF(D_REGRD, "RD32 %03X %08X %08X\n", unit, addr, data);\r
94\r
95 return data;\r
96}\r
97\r
98/****\r
99 *\r
100 ***/\r
101void Wr32(\r
102 uint32_t unit,\r
103 uint32_t addr,\r
104 uint32_t data)\r
105{\r
106 if (unit < MEM)\r
107 DPF(D_REGWR, "WR32 %03X %08X %08X\n", unit, addr, data);\r
108\r
109 switch (unit)\r
110 {\r
111 case MEM:\r
112 case MMIO:\r
113#ifdef SIM\r
114 SimMmio32Write( 1, addr, data);\r
115#else\r
116 *PTR32(addr) = data;\r
117#endif\r
118 break;\r
119\r
120 case MCU:\r
121 case HOST_BRIDGE:\r
122 case MEMORY_MANAGER:\r
123 case HTE:\r
124 // Handle case addr bigger than 8bit\r
125 pciwrite32(0, 0, 0, SB_HADR_REG, addr & 0xFFF00);\r
126 addr &= 0x00FF;\r
127\r
128 pciwrite32(0, 0, 0, SB_DATA_REG, data);\r
129 pciwrite32(0, 0, 0, SB_PACKET_REG,\r
130 SB_COMMAND(SB_REG_WRITE_OPCODE, unit, addr));\r
131 break;\r
132\r
133 case DDRPHY:\r
134 // Handle case addr bigger than 8bit\r
135 pciwrite32(0, 0, 0, SB_HADR_REG, addr & 0xFFF00);\r
136 addr &= 0x00FF;\r
137\r
138 pciwrite32(0, 0, 0, SB_DATA_REG, data);\r
139 pciwrite32(0, 0, 0, SB_PACKET_REG,\r
140 SB_COMMAND(SB_DDRIO_REG_WRITE_OPCODE, unit, addr));\r
141 break;\r
142\r
143 case DCMD:\r
144 pciwrite32(0, 0, 0, SB_HADR_REG, 0);\r
145 pciwrite32(0, 0, 0, SB_DATA_REG, data);\r
146 pciwrite32(0, 0, 0, SB_PACKET_REG,\r
147 SB_COMMAND(SB_DRAM_CMND_OPCODE, MCU, 0));\r
148 break;\r
149\r
150 default:\r
151 DEAD_LOOP()\r
152 ;\r
153 }\r
154}\r
155\r
156/****\r
157 *\r
158 ***/\r
159void WrMask32(\r
160 uint32_t unit,\r
161 uint32_t addr,\r
162 uint32_t data,\r
163 uint32_t mask)\r
164{\r
165 Wr32(unit, addr, ((Rd32(unit, addr) & ~mask) | (data & mask)));\r
166}\r
167\r
168/****\r
169 *\r
170 ***/\r
171void pciwrite32(\r
172 uint32_t bus,\r
173 uint32_t dev,\r
174 uint32_t fn,\r
175 uint32_t reg,\r
176 uint32_t data)\r
177{\r
178 Wr32(MMIO, PCIADDR(bus,dev,fn,reg), data);\r
179}\r
180\r
181/****\r
182 *\r
183 ***/\r
184uint32_t pciread32(\r
185 uint32_t bus,\r
186 uint32_t dev,\r
187 uint32_t fn,\r
188 uint32_t reg)\r
189{\r
190 return Rd32(MMIO, PCIADDR(bus,dev,fn,reg));\r
191}\r
192\r