blob: 3c28ba5dd32efe1f39da42745833535b45812bf9 [file] [log] [blame]
Aaron Durbin9a7d7bc2013-09-07 00:41:48 -05001/*
2 * This file is part of the coreboot project.
3 *
4 * Copyright (C) 2013 Google, 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,
Aaron Durbin2c4aab32015-03-06 23:26:06 -060011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Aaron Durbin9a7d7bc2013-09-07 00:41:48 -050012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
Aaron Durbin9a7d7bc2013-09-07 00:41:48 -050014 */
15
16#include <arch/io.h>
Julius Werner18ea2d32014-10-07 16:42:17 -070017#include <soc/iosf.h>
Aaron Durbin9a7d7bc2013-09-07 00:41:48 -050018
19#if !defined(__PRE_RAM__)
20#define IOSF_PCI_BASE (CONFIG_MMCONF_BASE_ADDRESS + (IOSF_PCI_DEV << 12))
21
22static inline void write_iosf_reg(int reg, uint32_t value)
23{
Kevin Paul Herbertbde6d302014-12-24 18:43:20 -080024 write32((u32 *)(IOSF_PCI_BASE + reg), value);
Aaron Durbin9a7d7bc2013-09-07 00:41:48 -050025}
26static inline uint32_t read_iosf_reg(int reg)
27{
Kevin Paul Herbertbde6d302014-12-24 18:43:20 -080028 return read32((u32 *)(IOSF_PCI_BASE + reg));
Aaron Durbin9a7d7bc2013-09-07 00:41:48 -050029}
30#else
31static inline void write_iosf_reg(int reg, uint32_t value)
32{
33 pci_write_config32(IOSF_PCI_DEV, reg, value);
34}
35static inline uint32_t read_iosf_reg(int reg)
36{
37 return pci_read_config32(IOSF_PCI_DEV, reg);
38}
39#endif
40
Aaron Durbin4a082c62013-10-31 11:58:32 -050041/* Common sequences for all the port accesses. */
42static uint32_t iosf_read_port(uint32_t cr, int reg)
Aaron Durbin9a7d7bc2013-09-07 00:41:48 -050043{
Aaron Durbin4a082c62013-10-31 11:58:32 -050044 cr |= IOSF_REG(reg) | IOSF_BYTE_EN;
Aaron Durbin67633a52013-10-29 10:57:31 -050045 write_iosf_reg(MCRX_REG, IOSF_REG_UPPER(reg));
Aaron Durbin9a7d7bc2013-09-07 00:41:48 -050046 write_iosf_reg(MCR_REG, cr);
47 return read_iosf_reg(MDR_REG);
48}
49
Aaron Durbin4a082c62013-10-31 11:58:32 -050050static void iosf_write_port(uint32_t cr, int reg, uint32_t val)
Aaron Durbin9a7d7bc2013-09-07 00:41:48 -050051{
Aaron Durbin4a082c62013-10-31 11:58:32 -050052 cr |= IOSF_REG(reg) | IOSF_BYTE_EN;
Aaron Durbin9a7d7bc2013-09-07 00:41:48 -050053 write_iosf_reg(MDR_REG, val);
Aaron Durbin67633a52013-10-29 10:57:31 -050054 write_iosf_reg(MCRX_REG, IOSF_REG_UPPER(reg));
Duncan Lauriee549e942013-10-28 14:18:38 -070055 write_iosf_reg(MCR_REG, cr);
Aaron Durbin9a7d7bc2013-09-07 00:41:48 -050056}
Aaron Durbin4c53df42013-09-23 14:17:35 -050057
Aaron Durbin5cc3b402013-12-11 17:10:58 -080058#define IOSF_READ(port) \
59 IOSF_OPCODE(IOSF_OP_READ_##port) | IOSF_PORT(IOSF_PORT_##port)
60#define IOSF_WRITE(port) \
61 IOSF_OPCODE(IOSF_OP_WRITE_##port) | IOSF_PORT(IOSF_PORT_##port)
62
Aaron Durbin4a082c62013-10-31 11:58:32 -050063uint32_t iosf_bunit_read(int reg)
64{
Aaron Durbin5cc3b402013-12-11 17:10:58 -080065 return iosf_read_port(IOSF_READ(BUNIT), reg);
Aaron Durbin4a082c62013-10-31 11:58:32 -050066}
67
68void iosf_bunit_write(int reg, uint32_t val)
69{
Aaron Durbin5cc3b402013-12-11 17:10:58 -080070 iosf_write_port(IOSF_WRITE(BUNIT), reg, val);
Aaron Durbin4a082c62013-10-31 11:58:32 -050071}
72
Aaron Durbin4c53df42013-09-23 14:17:35 -050073uint32_t iosf_dunit_read(int reg)
74{
Aaron Durbin5cc3b402013-12-11 17:10:58 -080075 return iosf_read_port(IOSF_READ(SYSMEMC), reg);
Aaron Durbin4c53df42013-09-23 14:17:35 -050076}
77
Aaron Durbin3ccb3ce2013-10-11 00:26:04 -050078uint32_t iosf_dunit_ch0_read(int reg)
79{
80 return iosf_dunit_read(reg);
81}
82
83uint32_t iosf_dunit_ch1_read(int reg)
84{
85 uint32_t cr = IOSF_OPCODE(IOSF_OP_READ_SYSMEMC) |
Aaron Durbin4a082c62013-10-31 11:58:32 -050086 IOSF_PORT(IOSF_PORT_DUNIT_CH1);
87 return iosf_read_port(cr, reg);
Aaron Durbin3ccb3ce2013-10-11 00:26:04 -050088}
89
Aaron Durbin4c53df42013-09-23 14:17:35 -050090void iosf_dunit_write(int reg, uint32_t val)
91{
Aaron Durbin5cc3b402013-12-11 17:10:58 -080092 iosf_write_port(IOSF_WRITE(SYSMEMC), reg, val);
Aaron Durbin3f5a1ff2013-10-04 15:23:31 -050093}
94
95uint32_t iosf_punit_read(int reg)
96{
Aaron Durbin5cc3b402013-12-11 17:10:58 -080097 return iosf_read_port(IOSF_READ(PMC), reg);
Aaron Durbin3f5a1ff2013-10-04 15:23:31 -050098}
99
100void iosf_punit_write(int reg, uint32_t val)
101{
Aaron Durbin5cc3b402013-12-11 17:10:58 -0800102 iosf_write_port(IOSF_WRITE(PMC), reg, val);
Aaron Durbin4c53df42013-09-23 14:17:35 -0500103}
Duncan Laurie0854c842013-10-31 08:20:48 -0700104
105uint32_t iosf_usbphy_read(int reg)
106{
Aaron Durbin5cc3b402013-12-11 17:10:58 -0800107 return iosf_read_port(IOSF_READ(USBPHY), reg);
Duncan Laurie0854c842013-10-31 08:20:48 -0700108}
109
110void iosf_usbphy_write(int reg, uint32_t val)
111{
Aaron Durbin5cc3b402013-12-11 17:10:58 -0800112 return iosf_write_port(IOSF_WRITE(USBPHY), reg, val);
Duncan Laurie0854c842013-10-31 08:20:48 -0700113}
114
115uint32_t iosf_ushphy_read(int reg)
116{
Aaron Durbin5cc3b402013-12-11 17:10:58 -0800117 return iosf_read_port(IOSF_READ(USHPHY), reg);
Duncan Laurie0854c842013-10-31 08:20:48 -0700118}
119
120void iosf_ushphy_write(int reg, uint32_t val)
121{
Aaron Durbin5cc3b402013-12-11 17:10:58 -0800122 return iosf_write_port(IOSF_WRITE(USHPHY), reg, val);
Duncan Laurie0854c842013-10-31 08:20:48 -0700123}
Aaron Durbinbc69ae92013-10-31 10:46:56 -0500124
125uint32_t iosf_lpss_read(int reg)
126{
Aaron Durbin5cc3b402013-12-11 17:10:58 -0800127 return iosf_read_port(IOSF_READ(LPSS), reg);
Aaron Durbinbc69ae92013-10-31 10:46:56 -0500128}
129
130void iosf_lpss_write(int reg, uint32_t val)
131{
Aaron Durbin5cc3b402013-12-11 17:10:58 -0800132 return iosf_write_port(IOSF_WRITE(LPSS), reg, val);
Aaron Durbinbc69ae92013-10-31 10:46:56 -0500133}
Aaron Durbin65ad5212013-11-01 14:19:24 -0500134
135uint32_t iosf_ccu_read(int reg)
136{
Aaron Durbin5cc3b402013-12-11 17:10:58 -0800137 return iosf_read_port(IOSF_READ(CCU), reg);
Aaron Durbin65ad5212013-11-01 14:19:24 -0500138}
139
140void iosf_ccu_write(int reg, uint32_t val)
141{
Aaron Durbin5cc3b402013-12-11 17:10:58 -0800142 return iosf_write_port(IOSF_WRITE(CCU), reg, val);
Aaron Durbin65ad5212013-11-01 14:19:24 -0500143}
Aaron Durbind7f0f3d2013-11-12 16:37:05 -0600144
145uint32_t iosf_score_read(int reg)
146{
Aaron Durbin5cc3b402013-12-11 17:10:58 -0800147 return iosf_read_port(IOSF_READ(SCORE), reg);
Aaron Durbind7f0f3d2013-11-12 16:37:05 -0600148}
149
150void iosf_score_write(int reg, uint32_t val)
151{
Aaron Durbin5cc3b402013-12-11 17:10:58 -0800152 return iosf_write_port(IOSF_WRITE(SCORE), reg, val);
Aaron Durbind7f0f3d2013-11-12 16:37:05 -0600153}
154
155uint32_t iosf_scc_read(int reg)
156{
Aaron Durbin5cc3b402013-12-11 17:10:58 -0800157 return iosf_read_port(IOSF_READ(SCC), reg);
Aaron Durbind7f0f3d2013-11-12 16:37:05 -0600158}
159
160void iosf_scc_write(int reg, uint32_t val)
161{
Aaron Durbin5cc3b402013-12-11 17:10:58 -0800162 return iosf_write_port(IOSF_WRITE(SCC), reg, val);
Aaron Durbind7f0f3d2013-11-12 16:37:05 -0600163}
Aaron Durbinbc5b5572013-12-11 17:13:10 -0800164
165uint32_t iosf_aunit_read(int reg)
166{
167 return iosf_read_port(IOSF_READ(AUNIT), reg);
168}
169
170void iosf_aunit_write(int reg, uint32_t val)
171{
172 return iosf_write_port(IOSF_WRITE(AUNIT), reg, val);
173}
174
175uint32_t iosf_cpu_bus_read(int reg)
176{
177 return iosf_read_port(IOSF_READ(CPU_BUS), reg);
178}
179
180void iosf_cpu_bus_write(int reg, uint32_t val)
181{
182 return iosf_write_port(IOSF_WRITE(CPU_BUS), reg, val);
183}
184
185uint32_t iosf_sec_read(int reg)
186{
187 return iosf_read_port(IOSF_READ(SEC), reg);
188}
189
190void iosf_sec_write(int reg, uint32_t val)
191{
192 return iosf_write_port(IOSF_WRITE(SEC), reg, val);
193}
194
195uint32_t iosf_port45_read(int reg)
196{
197 return iosf_read_port(IOSF_READ(0x45), reg);
198}
199
200void iosf_port45_write(int reg, uint32_t val)
201{
202 return iosf_write_port(IOSF_WRITE(0x45), reg, val);
203}
204
205uint32_t iosf_port46_read(int reg)
206{
207 return iosf_read_port(IOSF_READ(0x46), reg);
208}
209
210void iosf_port46_write(int reg, uint32_t val)
211{
212 return iosf_write_port(IOSF_WRITE(0x46), reg, val);
213}
214
215uint32_t iosf_port47_read(int reg)
216{
217 return iosf_read_port(IOSF_READ(0x47), reg);
218}
219
220void iosf_port47_write(int reg, uint32_t val)
221{
222 return iosf_write_port(IOSF_WRITE(0x47), reg, val);
223}
224
225uint32_t iosf_port55_read(int reg)
226{
227 return iosf_read_port(IOSF_READ(0x55), reg);
228}
229
230void iosf_port55_write(int reg, uint32_t val)
231{
232 return iosf_write_port(IOSF_WRITE(0x55), reg, val);
233}
234
235uint32_t iosf_port58_read(int reg)
236{
237 return iosf_read_port(IOSF_READ(0x58), reg);
238}
239
240void iosf_port58_write(int reg, uint32_t val)
241{
242 return iosf_write_port(IOSF_WRITE(0x58), reg, val);
243}
244
245uint32_t iosf_port59_read(int reg)
246{
247 return iosf_read_port(IOSF_READ(0x59), reg);
248}
249
250void iosf_port59_write(int reg, uint32_t val)
251{
252 return iosf_write_port(IOSF_WRITE(0x59), reg, val);
253}
254
255uint32_t iosf_port5a_read(int reg)
256{
257 return iosf_read_port(IOSF_READ(0x5a), reg);
258}
259
260void iosf_port5a_write(int reg, uint32_t val)
261{
262 return iosf_write_port(IOSF_WRITE(0x5a), reg, val);
263}
264
265uint32_t iosf_porta2_read(int reg)
266{
267 return iosf_read_port(IOSF_READ(0xa2), reg);
268}
269
270void iosf_porta2_write(int reg, uint32_t val)
271{
272 return iosf_write_port(IOSF_WRITE(0xa2), reg, val);
273}
274
275uint32_t iosf_ssus_read(int reg)
276{
277 return iosf_read_port(IOSF_READ(SSUS), reg);
278}
279
280void iosf_ssus_write(int reg, uint32_t val)
281{
282 return iosf_write_port(IOSF_WRITE(SSUS), reg, val);
283}