blob: 54b2aa3833a7462ad4ef7a3f71ccc24a64d05809 [file] [log] [blame]
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +00001/*
2 * This file is part of the flashrom project.
3 *
4 * Copyright (C) 2009 Carl-Daniel Hailfinger
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; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +000021#include <strings.h>
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000022#include <string.h>
23#include <stdlib.h>
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000024#include "flash.h"
Carl-Daniel Hailfinger5b997c32010-07-27 22:41:39 +000025#include "programmer.h"
Patrick Georgi32508eb2012-07-20 20:35:14 +000026#include "hwaccess.h"
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000027
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000028#if NEED_PCI == 1
Christian Ruppert0cdb0312009-05-14 18:57:26 +000029struct pci_dev *pci_dev_find_filter(struct pci_filter filter)
30{
31 struct pci_dev *temp;
32
33 for (temp = pacc->devices; temp; temp = temp->next)
34 if (pci_filter_match(&filter, temp))
35 return temp;
36
37 return NULL;
38}
39
Uwe Hermann24c35e42011-07-13 11:22:03 +000040struct pci_dev *pci_dev_find_vendorclass(uint16_t vendor, uint16_t devclass)
Carl-Daniel Hailfinger9f46cfc2009-11-15 17:13:29 +000041{
42 struct pci_dev *temp;
43 struct pci_filter filter;
44 uint16_t tmp2;
45
46 pci_filter_init(NULL, &filter);
47 filter.vendor = vendor;
48
49 for (temp = pacc->devices; temp; temp = temp->next)
50 if (pci_filter_match(&filter, temp)) {
51 /* Read PCI class */
52 tmp2 = pci_read_word(temp, 0x0a);
Uwe Hermann24c35e42011-07-13 11:22:03 +000053 if (tmp2 == devclass)
Carl-Daniel Hailfinger9f46cfc2009-11-15 17:13:29 +000054 return temp;
55 }
56
57 return NULL;
58}
59
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000060struct pci_dev *pci_dev_find(uint16_t vendor, uint16_t device)
61{
62 struct pci_dev *temp;
63 struct pci_filter filter;
64
65 pci_filter_init(NULL, &filter);
66 filter.vendor = vendor;
67 filter.device = device;
68
69 for (temp = pacc->devices; temp; temp = temp->next)
70 if (pci_filter_match(&filter, temp))
71 return temp;
72
73 return NULL;
74}
75
76struct pci_dev *pci_card_find(uint16_t vendor, uint16_t device,
77 uint16_t card_vendor, uint16_t card_device)
78{
79 struct pci_dev *temp;
80 struct pci_filter filter;
81
82 pci_filter_init(NULL, &filter);
83 filter.vendor = vendor;
84 filter.device = device;
85
86 for (temp = pacc->devices; temp; temp = temp->next)
87 if (pci_filter_match(&filter, temp)) {
88 if ((card_vendor ==
89 pci_read_word(temp, PCI_SUBSYSTEM_VENDOR_ID))
90 && (card_device ==
91 pci_read_word(temp, PCI_SUBSYSTEM_ID)))
92 return temp;
93 }
94
95 return NULL;
96}
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000097#endif
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000098
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000099#if CONFIG_INTERNAL == 1
Michael Karcher0bdc0922010-02-28 01:33:48 +0000100int force_boardenable = 0;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000101int force_boardmismatch = 0;
Carl-Daniel Hailfinger14e100c2009-12-22 23:42:04 +0000102
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +0000103#if defined(__i386__) || defined(__x86_64__)
Carl-Daniel Hailfinger14e100c2009-12-22 23:42:04 +0000104void probe_superio(void)
105{
Carl-Daniel Hailfingerf5e62cb2012-05-06 22:48:01 +0000106 probe_superio_winbond();
107 /* ITE probe causes SMSC LPC47N217 to power off the serial UART.
108 * Always probe for SMSC first, and if a SMSC Super I/O is detected
109 * at a given I/O port, do _not_ probe that port with the ITE probe.
110 * This means SMSC probing must be done before ITE probing.
111 */
112 //probe_superio_smsc();
Carl-Daniel Hailfingerbfecef62011-04-27 14:34:08 +0000113 probe_superio_ite();
Carl-Daniel Hailfinger14e100c2009-12-22 23:42:04 +0000114}
Carl-Daniel Hailfingerbfecef62011-04-27 14:34:08 +0000115
116int superio_count = 0;
117#define SUPERIO_MAX_COUNT 3
118
119struct superio superios[SUPERIO_MAX_COUNT];
120
121int register_superio(struct superio s)
122{
123 if (superio_count == SUPERIO_MAX_COUNT)
124 return 1;
125 superios[superio_count++] = s;
126 return 0;
127}
128
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +0000129#endif
Carl-Daniel Hailfinger14e100c2009-12-22 23:42:04 +0000130
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +0000131int is_laptop = 0;
Carl-Daniel Hailfinger580d29a2011-05-05 07:12:40 +0000132int laptop_ok = 0;
Michael Karcher8c1df282010-02-26 09:51:20 +0000133
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000134static void internal_chip_writeb(const struct flashctx *flash, uint8_t val,
135 chipaddr addr);
136static void internal_chip_writew(const struct flashctx *flash, uint16_t val,
137 chipaddr addr);
138static void internal_chip_writel(const struct flashctx *flash, uint32_t val,
139 chipaddr addr);
140static uint8_t internal_chip_readb(const struct flashctx *flash,
141 const chipaddr addr);
142static uint16_t internal_chip_readw(const struct flashctx *flash,
143 const chipaddr addr);
144static uint32_t internal_chip_readl(const struct flashctx *flash,
145 const chipaddr addr);
146static void internal_chip_readn(const struct flashctx *flash, uint8_t *buf,
147 const chipaddr addr, size_t len);
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000148static const struct par_master par_master_internal = {
Carl-Daniel Hailfingereaacd2d2011-11-09 23:40:00 +0000149 .chip_readb = internal_chip_readb,
150 .chip_readw = internal_chip_readw,
151 .chip_readl = internal_chip_readl,
152 .chip_readn = internal_chip_readn,
153 .chip_writeb = internal_chip_writeb,
154 .chip_writew = internal_chip_writew,
155 .chip_writel = internal_chip_writel,
156 .chip_writen = fallback_chip_writen,
157};
158
159enum chipbustype internal_buses_supported = BUS_NONE;
160
David Hendricks8bb20212011-06-14 01:35:36 +0000161static int internal_shutdown(void *data)
162{
David Hendricks8bb20212011-06-14 01:35:36 +0000163 return 0;
164}
165
Uwe Hermanna0869322009-05-14 20:41:57 +0000166int internal_init(void)
167{
Peter Lemenkov0a6f9ca2010-09-20 17:23:38 +0000168#if __FLASHROM_LITTLE_ENDIAN__
Uwe Hermanna0869322009-05-14 20:41:57 +0000169 int ret = 0;
Peter Lemenkov0a6f9ca2010-09-20 17:23:38 +0000170#endif
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000171 int force_laptop = 0;
Stefan Taunera28087f2011-09-13 23:14:25 +0000172 int not_a_laptop = 0;
Stefan Taunerb4e06bd2012-08-20 00:24:22 +0000173 const char *board_vendor = NULL;
174 const char *board_model = NULL;
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +0000175#if defined (__i386__) || defined (__x86_64__) || defined (__arm__)
Stefan Taunerb4e06bd2012-08-20 00:24:22 +0000176 const char *cb_vendor = NULL;
177 const char *cb_model = NULL;
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +0000178#endif
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000179 char *arg;
Uwe Hermanna0869322009-05-14 20:41:57 +0000180
Carl-Daniel Hailfinger2b6dcb32010-07-08 10:13:37 +0000181 arg = extract_programmer_param("boardenable");
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000182 if (arg && !strcmp(arg,"force")) {
183 force_boardenable = 1;
184 } else if (arg && !strlen(arg)) {
185 msg_perr("Missing argument for boardenable.\n");
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000186 free(arg);
187 return 1;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000188 } else if (arg) {
189 msg_perr("Unknown argument for boardenable: %s\n", arg);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000190 free(arg);
191 return 1;
Michael Karcher0bdc0922010-02-28 01:33:48 +0000192 }
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000193 free(arg);
Michael Karcher0bdc0922010-02-28 01:33:48 +0000194
Carl-Daniel Hailfinger2b6dcb32010-07-08 10:13:37 +0000195 arg = extract_programmer_param("boardmismatch");
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000196 if (arg && !strcmp(arg,"force")) {
197 force_boardmismatch = 1;
198 } else if (arg && !strlen(arg)) {
199 msg_perr("Missing argument for boardmismatch.\n");
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000200 free(arg);
201 return 1;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000202 } else if (arg) {
203 msg_perr("Unknown argument for boardmismatch: %s\n", arg);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000204 free(arg);
205 return 1;
Michael Karcher0bdc0922010-02-28 01:33:48 +0000206 }
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000207 free(arg);
208
Carl-Daniel Hailfinger2b6dcb32010-07-08 10:13:37 +0000209 arg = extract_programmer_param("laptop");
Stefan Taunera28087f2011-09-13 23:14:25 +0000210 if (arg && !strcmp(arg, "force_I_want_a_brick"))
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000211 force_laptop = 1;
Stefan Taunera28087f2011-09-13 23:14:25 +0000212 else if (arg && !strcmp(arg, "this_is_not_a_laptop"))
213 not_a_laptop = 1;
214 else if (arg && !strlen(arg)) {
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000215 msg_perr("Missing argument for laptop.\n");
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000216 free(arg);
217 return 1;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000218 } else if (arg) {
219 msg_perr("Unknown argument for laptop: %s\n", arg);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000220 free(arg);
221 return 1;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000222 }
223 free(arg);
224
Carl-Daniel Hailfinger2d927fb2012-01-04 00:48:27 +0000225 arg = extract_programmer_param("mainboard");
226 if (arg && strlen(arg)) {
Stefan Taunerb4e06bd2012-08-20 00:24:22 +0000227 if (board_parse_parameter(arg, &board_vendor, &board_model)) {
228 free(arg);
229 return 1;
230 }
Carl-Daniel Hailfinger2d927fb2012-01-04 00:48:27 +0000231 } else if (arg && !strlen(arg)) {
232 msg_perr("Missing argument for mainboard.\n");
233 free(arg);
234 return 1;
235 }
236 free(arg);
237
Carl-Daniel Hailfingerd6bb8282012-07-21 17:27:08 +0000238 if (rget_io_perms())
239 return 1;
David Hendricks8bb20212011-06-14 01:35:36 +0000240 if (register_shutdown(internal_shutdown, NULL))
241 return 1;
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000242
Michael Karcherb9dbe482011-05-11 17:07:07 +0000243 /* Default to Parallel/LPC/FWH flash devices. If a known host controller
Carl-Daniel Hailfingereaacd2d2011-11-09 23:40:00 +0000244 * is found, the host controller init routine sets the
245 * internal_buses_supported bitfield.
Michael Karcherb9dbe482011-05-11 17:07:07 +0000246 */
Carl-Daniel Hailfingereaacd2d2011-11-09 23:40:00 +0000247 internal_buses_supported = BUS_NONSPI;
Michael Karcherb9dbe482011-05-11 17:07:07 +0000248
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000249 /* Initialize PCI access for flash enables */
Stefan Tauner55619552013-01-04 22:24:58 +0000250 if (pci_init_common() != 0)
251 return 1;
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000252
Carl-Daniel Hailfingerb5b161b2010-06-04 19:05:39 +0000253 if (processor_flash_enable()) {
254 msg_perr("Processor detection/init failed.\n"
255 "Aborting.\n");
256 return 1;
257 }
258
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +0000259#if defined(__i386__) || defined(__x86_64__) || defined (__arm__)
Stefan Taunerfa9fa712012-09-24 21:29:29 +0000260 if ((cb_parse_table(&cb_vendor, &cb_model) == 0) && (board_vendor != NULL) && (board_model != NULL)) {
261 if (strcasecmp(board_vendor, cb_vendor) || strcasecmp(board_model, cb_model)) {
Stefan Taunerc6fa32d2013-01-04 22:54:07 +0000262 msg_pwarn("Warning: The mainboard IDs set by -p internal:mainboard (%s:%s) do not\n"
Stefan Taunerb4e06bd2012-08-20 00:24:22 +0000263 " match the current coreboot IDs of the mainboard (%s:%s).\n",
264 board_vendor, board_model, cb_vendor, cb_model);
265 if (!force_boardmismatch)
266 return 1;
267 msg_pinfo("Continuing anyway.\n");
268 }
269 }
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +0000270#endif
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +0000271
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +0000272#if defined(__i386__) || defined(__x86_64__)
Michael Karcher6701ee82010-01-20 14:14:11 +0000273 dmi_init();
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000274
Carl-Daniel Hailfinger580d29a2011-05-05 07:12:40 +0000275 /* In case Super I/O probing would cause pretty explosions. */
276 board_handle_before_superio();
277
Uwe Hermann43959702010-03-13 17:28:29 +0000278 /* Probe for the Super I/O chip and fill global struct superio. */
Carl-Daniel Hailfinger14e100c2009-12-22 23:42:04 +0000279 probe_superio();
Carl-Daniel Hailfingerb5b161b2010-06-04 19:05:39 +0000280#else
281 /* FIXME: Enable cbtable searching on all non-x86 platforms supported
282 * by coreboot.
283 * FIXME: Find a replacement for DMI on non-x86.
284 * FIXME: Enable Super I/O probing once port I/O is possible.
285 */
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +0000286#endif
Carl-Daniel Hailfinger14e100c2009-12-22 23:42:04 +0000287
Carl-Daniel Hailfinger580d29a2011-05-05 07:12:40 +0000288 /* Check laptop whitelist. */
289 board_handle_before_laptop();
290
291 /* Warn if a non-whitelisted laptop is detected. */
292 if (is_laptop && !laptop_ok) {
Stefan Taunera34d7192011-07-26 00:54:42 +0000293 msg_perr("========================================================================\n");
294 if (is_laptop == 1) {
295 msg_perr("WARNING! You seem to be running flashrom on an unsupported laptop.\n");
296 } else {
297 msg_perr("WARNING! You may be running flashrom on an unsupported laptop. We could\n"
298 "not detect this for sure because your vendor has not setup the SMBIOS\n"
299 "tables correctly. You can enforce execution by adding\n"
Stefan Taunera28087f2011-09-13 23:14:25 +0000300 "'-p internal:laptop=this_is_not_a_laptop' to the command line, but\n"
Stefan Taunera34d7192011-07-26 00:54:42 +0000301 "please read the following warning if you are not sure.\n\n");
302 }
303 msg_perr("Laptops, notebooks and netbooks are difficult to support and we\n"
304 "recommend to use the vendor flashing utility. The embedded controller\n"
305 "(EC) in these machines often interacts badly with flashing.\n"
Stefan Tauner352e50b2013-02-22 15:58:45 +0000306 "See the manpage and http://www.flashrom.org/Laptops for details.\n\n"
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000307 "If flash is shared with the EC, erase is guaranteed to brick your laptop\n"
308 "and write may brick your laptop.\n"
309 "Read and probe may irritate your EC and cause fan failure, backlight\n"
310 "failure and sudden poweroff.\n"
311 "You have been warned.\n"
312 "========================================================================\n");
Stefan Taunera34d7192011-07-26 00:54:42 +0000313
Stefan Taunera28087f2011-09-13 23:14:25 +0000314 if (force_laptop || (not_a_laptop && (is_laptop == 2))) {
315 msg_perr("Proceeding anyway because user forced us to.\n");
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000316 } else {
317 msg_perr("Aborting.\n");
Niklas Söderlund2a95e872012-07-30 19:42:33 +0000318 return 1;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000319 }
320 }
Michael Karcher8c1df282010-02-26 09:51:20 +0000321
Carl-Daniel Hailfingerb5b161b2010-06-04 19:05:39 +0000322#if __FLASHROM_LITTLE_ENDIAN__
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000323 /* try to enable it. Failure IS an option, since not all motherboards
324 * really need this to be done, etc., etc.
325 */
326 ret = chipset_flash_enable();
327 if (ret == -2) {
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000328 msg_perr("WARNING: No chipset found. Flash detection "
329 "will most likely fail.\n");
Tadas Slotkusad470342011-09-03 17:15:00 +0000330 } else if (ret == ERROR_FATAL)
331 return ret;
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000332
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +0000333#if defined(__i386__) || defined(__x86_64__)
Vadim Girlin4dd0f902013-08-24 12:18:17 +0000334 /* Probe unconditionally for ITE Super I/O chips. This enables LPC->SPI translation on IT87* and
335 * parallel writes on IT8705F. Also, this handles the manual chip select for Gigabyte's DualBIOS. */
Carl-Daniel Hailfinger76d4b372010-07-10 16:56:32 +0000336 init_superio_ite();
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +0000337#endif
Carl-Daniel Hailfinger01f3ef42010-03-25 02:50:40 +0000338
Stefan Taunerfa9fa712012-09-24 21:29:29 +0000339 if (board_flash_enable(board_vendor, board_model, cb_vendor, cb_model)) {
Stefan Taunerb4e06bd2012-08-20 00:24:22 +0000340 msg_perr("Aborting to be safe.\n");
341 return 1;
342 }
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000343
Vladimir 'phcoder' Serbinenko5cfc94a2010-09-29 23:37:24 +0000344#if defined(__i386__) || defined(__x86_64__) || defined (__mips)
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000345 register_par_master(&par_master_internal, internal_buses_supported);
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000346 return 0;
Carl-Daniel Hailfingerb5b161b2010-06-04 19:05:39 +0000347#else
348 msg_perr("Your platform is not supported yet for the internal "
349 "programmer due to missing\n"
350 "flash_base and top/bottom alignment information.\n"
351 "Aborting.\n");
352 return 1;
353#endif
354#else
355 /* FIXME: Remove this unconditional abort once all PCI drivers are
356 * converted to use little-endian accesses for memory BARs.
357 */
358 msg_perr("Your platform is not supported yet for the internal "
359 "programmer because it has\n"
360 "not been converted from native endian to little endian "
361 "access yet.\n"
362 "Aborting.\n");
363 return 1;
364#endif
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000365}
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +0000366#endif
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000367
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000368static void internal_chip_writeb(const struct flashctx *flash, uint8_t val,
369 chipaddr addr)
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000370{
Carl-Daniel Hailfinger78185dc2009-05-17 15:49:24 +0000371 mmio_writeb(val, (void *) addr);
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000372}
373
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000374static void internal_chip_writew(const struct flashctx *flash, uint16_t val,
375 chipaddr addr)
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000376{
Carl-Daniel Hailfinger78185dc2009-05-17 15:49:24 +0000377 mmio_writew(val, (void *) addr);
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000378}
379
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000380static void internal_chip_writel(const struct flashctx *flash, uint32_t val,
381 chipaddr addr)
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000382{
Carl-Daniel Hailfinger78185dc2009-05-17 15:49:24 +0000383 mmio_writel(val, (void *) addr);
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000384}
385
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000386static uint8_t internal_chip_readb(const struct flashctx *flash,
387 const chipaddr addr)
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000388{
Carl-Daniel Hailfinger78185dc2009-05-17 15:49:24 +0000389 return mmio_readb((void *) addr);
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000390}
391
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000392static uint16_t internal_chip_readw(const struct flashctx *flash,
393 const chipaddr addr)
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000394{
Carl-Daniel Hailfinger78185dc2009-05-17 15:49:24 +0000395 return mmio_readw((void *) addr);
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000396}
397
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000398static uint32_t internal_chip_readl(const struct flashctx *flash,
399 const chipaddr addr)
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000400{
Carl-Daniel Hailfinger78185dc2009-05-17 15:49:24 +0000401 return mmio_readl((void *) addr);
402}
403
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000404static void internal_chip_readn(const struct flashctx *flash, uint8_t *buf,
405 const chipaddr addr, size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000406{
Carl-Daniel Hailfingerccd71c22012-03-01 22:38:27 +0000407 mmio_readn((void *)addr, buf, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000408 return;
409}