blob: c99ca1fb365af23f29504f41c276578cc6fd9007 [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 Hailfinger702218d2009-05-08 17:43:22 +000021#include <string.h>
22#include <stdlib.h>
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000023#include "flash.h"
Carl-Daniel Hailfinger5b997c32010-07-27 22:41:39 +000024#include "programmer.h"
Patrick Georgi32508eb2012-07-20 20:35:14 +000025#include "hwaccess.h"
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000026
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000027#if NEED_PCI == 1
Christian Ruppert0cdb0312009-05-14 18:57:26 +000028struct pci_dev *pci_dev_find_filter(struct pci_filter filter)
29{
30 struct pci_dev *temp;
31
32 for (temp = pacc->devices; temp; temp = temp->next)
33 if (pci_filter_match(&filter, temp))
34 return temp;
35
36 return NULL;
37}
38
Uwe Hermann24c35e42011-07-13 11:22:03 +000039struct pci_dev *pci_dev_find_vendorclass(uint16_t vendor, uint16_t devclass)
Carl-Daniel Hailfinger9f46cfc2009-11-15 17:13:29 +000040{
41 struct pci_dev *temp;
42 struct pci_filter filter;
43 uint16_t tmp2;
44
45 pci_filter_init(NULL, &filter);
46 filter.vendor = vendor;
47
48 for (temp = pacc->devices; temp; temp = temp->next)
49 if (pci_filter_match(&filter, temp)) {
50 /* Read PCI class */
51 tmp2 = pci_read_word(temp, 0x0a);
Uwe Hermann24c35e42011-07-13 11:22:03 +000052 if (tmp2 == devclass)
Carl-Daniel Hailfinger9f46cfc2009-11-15 17:13:29 +000053 return temp;
54 }
55
56 return NULL;
57}
58
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000059struct pci_dev *pci_dev_find(uint16_t vendor, uint16_t device)
60{
61 struct pci_dev *temp;
62 struct pci_filter filter;
63
64 pci_filter_init(NULL, &filter);
65 filter.vendor = vendor;
66 filter.device = device;
67
68 for (temp = pacc->devices; temp; temp = temp->next)
69 if (pci_filter_match(&filter, temp))
70 return temp;
71
72 return NULL;
73}
74
75struct pci_dev *pci_card_find(uint16_t vendor, uint16_t device,
76 uint16_t card_vendor, uint16_t card_device)
77{
78 struct pci_dev *temp;
79 struct pci_filter filter;
80
81 pci_filter_init(NULL, &filter);
82 filter.vendor = vendor;
83 filter.device = device;
84
85 for (temp = pacc->devices; temp; temp = temp->next)
86 if (pci_filter_match(&filter, temp)) {
87 if ((card_vendor ==
88 pci_read_word(temp, PCI_SUBSYSTEM_VENDOR_ID))
89 && (card_device ==
90 pci_read_word(temp, PCI_SUBSYSTEM_ID)))
91 return temp;
92 }
93
94 return NULL;
95}
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000096#endif
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000097
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000098#if CONFIG_INTERNAL == 1
Michael Karcher0bdc0922010-02-28 01:33:48 +000099int force_boardenable = 0;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000100int force_boardmismatch = 0;
Carl-Daniel Hailfinger14e100c2009-12-22 23:42:04 +0000101
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +0000102#if defined(__i386__) || defined(__x86_64__)
Carl-Daniel Hailfinger14e100c2009-12-22 23:42:04 +0000103void probe_superio(void)
104{
Carl-Daniel Hailfingerf5e62cb2012-05-06 22:48:01 +0000105 probe_superio_winbond();
106 /* ITE probe causes SMSC LPC47N217 to power off the serial UART.
107 * Always probe for SMSC first, and if a SMSC Super I/O is detected
108 * at a given I/O port, do _not_ probe that port with the ITE probe.
109 * This means SMSC probing must be done before ITE probing.
110 */
111 //probe_superio_smsc();
Carl-Daniel Hailfingerbfecef62011-04-27 14:34:08 +0000112 probe_superio_ite();
Carl-Daniel Hailfinger14e100c2009-12-22 23:42:04 +0000113}
Carl-Daniel Hailfingerbfecef62011-04-27 14:34:08 +0000114
115int superio_count = 0;
116#define SUPERIO_MAX_COUNT 3
117
118struct superio superios[SUPERIO_MAX_COUNT];
119
120int register_superio(struct superio s)
121{
122 if (superio_count == SUPERIO_MAX_COUNT)
123 return 1;
124 superios[superio_count++] = s;
125 return 0;
126}
127
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +0000128#endif
Carl-Daniel Hailfinger14e100c2009-12-22 23:42:04 +0000129
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +0000130int is_laptop = 0;
Carl-Daniel Hailfinger580d29a2011-05-05 07:12:40 +0000131int laptop_ok = 0;
Michael Karcher8c1df282010-02-26 09:51:20 +0000132
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000133static void internal_chip_writeb(const struct flashctx *flash, uint8_t val,
134 chipaddr addr);
135static void internal_chip_writew(const struct flashctx *flash, uint16_t val,
136 chipaddr addr);
137static void internal_chip_writel(const struct flashctx *flash, uint32_t val,
138 chipaddr addr);
139static uint8_t internal_chip_readb(const struct flashctx *flash,
140 const chipaddr addr);
141static uint16_t internal_chip_readw(const struct flashctx *flash,
142 const chipaddr addr);
143static uint32_t internal_chip_readl(const struct flashctx *flash,
144 const chipaddr addr);
145static void internal_chip_readn(const struct flashctx *flash, uint8_t *buf,
146 const chipaddr addr, size_t len);
Carl-Daniel Hailfingereaacd2d2011-11-09 23:40:00 +0000147static const struct par_programmer par_programmer_internal = {
148 .chip_readb = internal_chip_readb,
149 .chip_readw = internal_chip_readw,
150 .chip_readl = internal_chip_readl,
151 .chip_readn = internal_chip_readn,
152 .chip_writeb = internal_chip_writeb,
153 .chip_writew = internal_chip_writew,
154 .chip_writel = internal_chip_writel,
155 .chip_writen = fallback_chip_writen,
156};
157
158enum chipbustype internal_buses_supported = BUS_NONE;
159
David Hendricks8bb20212011-06-14 01:35:36 +0000160static int internal_shutdown(void *data)
161{
162 release_io_perms();
163 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;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000173 char *arg;
Uwe Hermanna0869322009-05-14 20:41:57 +0000174
Carl-Daniel Hailfinger2b6dcb32010-07-08 10:13:37 +0000175 arg = extract_programmer_param("boardenable");
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000176 if (arg && !strcmp(arg,"force")) {
177 force_boardenable = 1;
178 } else if (arg && !strlen(arg)) {
179 msg_perr("Missing argument for boardenable.\n");
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000180 free(arg);
181 return 1;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000182 } else if (arg) {
183 msg_perr("Unknown argument for boardenable: %s\n", arg);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000184 free(arg);
185 return 1;
Michael Karcher0bdc0922010-02-28 01:33:48 +0000186 }
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000187 free(arg);
Michael Karcher0bdc0922010-02-28 01:33:48 +0000188
Carl-Daniel Hailfinger2b6dcb32010-07-08 10:13:37 +0000189 arg = extract_programmer_param("boardmismatch");
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000190 if (arg && !strcmp(arg,"force")) {
191 force_boardmismatch = 1;
192 } else if (arg && !strlen(arg)) {
193 msg_perr("Missing argument for boardmismatch.\n");
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000194 free(arg);
195 return 1;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000196 } else if (arg) {
197 msg_perr("Unknown argument for boardmismatch: %s\n", arg);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000198 free(arg);
199 return 1;
Michael Karcher0bdc0922010-02-28 01:33:48 +0000200 }
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000201 free(arg);
202
Carl-Daniel Hailfinger2b6dcb32010-07-08 10:13:37 +0000203 arg = extract_programmer_param("laptop");
Stefan Taunera28087f2011-09-13 23:14:25 +0000204 if (arg && !strcmp(arg, "force_I_want_a_brick"))
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000205 force_laptop = 1;
Stefan Taunera28087f2011-09-13 23:14:25 +0000206 else if (arg && !strcmp(arg, "this_is_not_a_laptop"))
207 not_a_laptop = 1;
208 else if (arg && !strlen(arg)) {
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000209 msg_perr("Missing argument for laptop.\n");
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000210 free(arg);
211 return 1;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000212 } else if (arg) {
213 msg_perr("Unknown argument for laptop: %s\n", arg);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000214 free(arg);
215 return 1;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000216 }
217 free(arg);
218
Carl-Daniel Hailfinger2d927fb2012-01-04 00:48:27 +0000219 arg = extract_programmer_param("mainboard");
220 if (arg && strlen(arg)) {
221 lb_vendor_dev_from_string(arg);
222 } else if (arg && !strlen(arg)) {
223 msg_perr("Missing argument for mainboard.\n");
224 free(arg);
225 return 1;
226 }
227 free(arg);
228
Carl-Daniel Hailfinger3b7e75a2009-05-14 21:41:10 +0000229 get_io_perms();
David Hendricks8bb20212011-06-14 01:35:36 +0000230 if (register_shutdown(internal_shutdown, NULL))
231 return 1;
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000232
Michael Karcherb9dbe482011-05-11 17:07:07 +0000233 /* Default to Parallel/LPC/FWH flash devices. If a known host controller
Carl-Daniel Hailfingereaacd2d2011-11-09 23:40:00 +0000234 * is found, the host controller init routine sets the
235 * internal_buses_supported bitfield.
Michael Karcherb9dbe482011-05-11 17:07:07 +0000236 */
Carl-Daniel Hailfingereaacd2d2011-11-09 23:40:00 +0000237 internal_buses_supported = BUS_NONSPI;
Michael Karcherb9dbe482011-05-11 17:07:07 +0000238
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000239 /* Initialize PCI access for flash enables */
240 pacc = pci_alloc(); /* Get the pci_access structure */
241 /* Set all options you want -- here we stick with the defaults */
242 pci_init(pacc); /* Initialize the PCI library */
243 pci_scan_bus(pacc); /* We want to get the list of devices */
244
Carl-Daniel Hailfingerb5b161b2010-06-04 19:05:39 +0000245 if (processor_flash_enable()) {
246 msg_perr("Processor detection/init failed.\n"
247 "Aborting.\n");
248 return 1;
249 }
250
251#if defined(__i386__) || defined(__x86_64__)
252 /* We look at the cbtable first to see if we need a
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000253 * mainboard specific flash enable sequence.
254 */
255 coreboot_init();
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +0000256
Michael Karcher6701ee82010-01-20 14:14:11 +0000257 dmi_init();
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000258
Carl-Daniel Hailfinger580d29a2011-05-05 07:12:40 +0000259 /* In case Super I/O probing would cause pretty explosions. */
260 board_handle_before_superio();
261
Uwe Hermann43959702010-03-13 17:28:29 +0000262 /* Probe for the Super I/O chip and fill global struct superio. */
Carl-Daniel Hailfinger14e100c2009-12-22 23:42:04 +0000263 probe_superio();
Carl-Daniel Hailfingerb5b161b2010-06-04 19:05:39 +0000264#else
265 /* FIXME: Enable cbtable searching on all non-x86 platforms supported
266 * by coreboot.
267 * FIXME: Find a replacement for DMI on non-x86.
268 * FIXME: Enable Super I/O probing once port I/O is possible.
269 */
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +0000270#endif
Carl-Daniel Hailfinger14e100c2009-12-22 23:42:04 +0000271
Carl-Daniel Hailfinger580d29a2011-05-05 07:12:40 +0000272 /* Check laptop whitelist. */
273 board_handle_before_laptop();
274
275 /* Warn if a non-whitelisted laptop is detected. */
276 if (is_laptop && !laptop_ok) {
Stefan Taunera34d7192011-07-26 00:54:42 +0000277 msg_perr("========================================================================\n");
278 if (is_laptop == 1) {
279 msg_perr("WARNING! You seem to be running flashrom on an unsupported laptop.\n");
280 } else {
281 msg_perr("WARNING! You may be running flashrom on an unsupported laptop. We could\n"
282 "not detect this for sure because your vendor has not setup the SMBIOS\n"
283 "tables correctly. You can enforce execution by adding\n"
Stefan Taunera28087f2011-09-13 23:14:25 +0000284 "'-p internal:laptop=this_is_not_a_laptop' to the command line, but\n"
Stefan Taunera34d7192011-07-26 00:54:42 +0000285 "please read the following warning if you are not sure.\n\n");
286 }
287 msg_perr("Laptops, notebooks and netbooks are difficult to support and we\n"
288 "recommend to use the vendor flashing utility. The embedded controller\n"
289 "(EC) in these machines often interacts badly with flashing.\n"
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000290 "See http://www.flashrom.org/Laptops for details.\n\n"
291 "If flash is shared with the EC, erase is guaranteed to brick your laptop\n"
292 "and write may brick your laptop.\n"
293 "Read and probe may irritate your EC and cause fan failure, backlight\n"
294 "failure and sudden poweroff.\n"
295 "You have been warned.\n"
296 "========================================================================\n");
Stefan Taunera34d7192011-07-26 00:54:42 +0000297
Stefan Taunera28087f2011-09-13 23:14:25 +0000298 if (force_laptop || (not_a_laptop && (is_laptop == 2))) {
299 msg_perr("Proceeding anyway because user forced us to.\n");
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000300 } else {
301 msg_perr("Aborting.\n");
302 exit(1);
303 }
304 }
Michael Karcher8c1df282010-02-26 09:51:20 +0000305
Carl-Daniel Hailfingerb5b161b2010-06-04 19:05:39 +0000306#if __FLASHROM_LITTLE_ENDIAN__
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000307 /* try to enable it. Failure IS an option, since not all motherboards
308 * really need this to be done, etc., etc.
309 */
310 ret = chipset_flash_enable();
311 if (ret == -2) {
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000312 msg_perr("WARNING: No chipset found. Flash detection "
313 "will most likely fail.\n");
Tadas Slotkusad470342011-09-03 17:15:00 +0000314 } else if (ret == ERROR_FATAL)
315 return ret;
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000316
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +0000317#if defined(__i386__) || defined(__x86_64__)
Carl-Daniel Hailfinger76d4b372010-07-10 16:56:32 +0000318 /* Probe unconditionally for IT87* LPC->SPI translation and for
319 * IT87* Parallel write enable.
320 */
321 init_superio_ite();
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +0000322#endif
Carl-Daniel Hailfinger01f3ef42010-03-25 02:50:40 +0000323
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000324 board_flash_enable(lb_vendor, lb_part);
325
Carl-Daniel Hailfinger9246ff42009-09-02 13:43:56 +0000326 /* Even if chipset init returns an error code, we don't want to abort.
327 * The error code might have been a warning only.
328 * Besides that, we don't check the board enable return code either.
329 */
Vladimir 'phcoder' Serbinenko5cfc94a2010-09-29 23:37:24 +0000330#if defined(__i386__) || defined(__x86_64__) || defined (__mips)
Carl-Daniel Hailfingereaacd2d2011-11-09 23:40:00 +0000331 register_par_programmer(&par_programmer_internal, internal_buses_supported);
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000332 return 0;
Carl-Daniel Hailfingerb5b161b2010-06-04 19:05:39 +0000333#else
334 msg_perr("Your platform is not supported yet for the internal "
335 "programmer due to missing\n"
336 "flash_base and top/bottom alignment information.\n"
337 "Aborting.\n");
338 return 1;
339#endif
340#else
341 /* FIXME: Remove this unconditional abort once all PCI drivers are
342 * converted to use little-endian accesses for memory BARs.
343 */
344 msg_perr("Your platform is not supported yet for the internal "
345 "programmer because it has\n"
346 "not been converted from native endian to little endian "
347 "access yet.\n"
348 "Aborting.\n");
349 return 1;
350#endif
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000351}
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +0000352#endif
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000353
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000354static void internal_chip_writeb(const struct flashctx *flash, uint8_t val,
355 chipaddr addr)
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000356{
Carl-Daniel Hailfinger78185dc2009-05-17 15:49:24 +0000357 mmio_writeb(val, (void *) addr);
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000358}
359
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000360static void internal_chip_writew(const struct flashctx *flash, uint16_t val,
361 chipaddr addr)
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000362{
Carl-Daniel Hailfinger78185dc2009-05-17 15:49:24 +0000363 mmio_writew(val, (void *) addr);
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000364}
365
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000366static void internal_chip_writel(const struct flashctx *flash, uint32_t val,
367 chipaddr addr)
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000368{
Carl-Daniel Hailfinger78185dc2009-05-17 15:49:24 +0000369 mmio_writel(val, (void *) addr);
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000370}
371
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000372static uint8_t internal_chip_readb(const struct flashctx *flash,
373 const chipaddr addr)
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000374{
Carl-Daniel Hailfinger78185dc2009-05-17 15:49:24 +0000375 return mmio_readb((void *) addr);
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000376}
377
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000378static uint16_t internal_chip_readw(const struct flashctx *flash,
379 const chipaddr addr)
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000380{
Carl-Daniel Hailfinger78185dc2009-05-17 15:49:24 +0000381 return mmio_readw((void *) addr);
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000382}
383
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000384static uint32_t internal_chip_readl(const struct flashctx *flash,
385 const chipaddr addr)
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000386{
Carl-Daniel Hailfinger78185dc2009-05-17 15:49:24 +0000387 return mmio_readl((void *) addr);
388}
389
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000390static void internal_chip_readn(const struct flashctx *flash, uint8_t *buf,
391 const chipaddr addr, size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000392{
Carl-Daniel Hailfingerccd71c22012-03-01 22:38:27 +0000393 mmio_readn((void *)addr, buf, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000394 return;
395}