1*0d6140beSAndroid Build Coastguard Worker /*
2*0d6140beSAndroid Build Coastguard Worker * This file is part of the flashrom project.
3*0d6140beSAndroid Build Coastguard Worker *
4*0d6140beSAndroid Build Coastguard Worker * Copyright (C) 2000 Silicon Integrated System Corporation
5*0d6140beSAndroid Build Coastguard Worker * Copyright (C) 2000 Ronald G. Minnich <[email protected]>
6*0d6140beSAndroid Build Coastguard Worker * Copyright (C) 2005-2009 coresystems GmbH
7*0d6140beSAndroid Build Coastguard Worker * Copyright (C) 2006-2009 Carl-Daniel Hailfinger
8*0d6140beSAndroid Build Coastguard Worker *
9*0d6140beSAndroid Build Coastguard Worker * This program is free software; you can redistribute it and/or modify
10*0d6140beSAndroid Build Coastguard Worker * it under the terms of the GNU General Public License as published by
11*0d6140beSAndroid Build Coastguard Worker * the Free Software Foundation; either version 2 of the License, or
12*0d6140beSAndroid Build Coastguard Worker * (at your option) any later version.
13*0d6140beSAndroid Build Coastguard Worker *
14*0d6140beSAndroid Build Coastguard Worker * This program is distributed in the hope that it will be useful,
15*0d6140beSAndroid Build Coastguard Worker * but WITHOUT ANY WARRANTY; without even the implied warranty of
16*0d6140beSAndroid Build Coastguard Worker * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17*0d6140beSAndroid Build Coastguard Worker * GNU General Public License for more details.
18*0d6140beSAndroid Build Coastguard Worker */
19*0d6140beSAndroid Build Coastguard Worker
20*0d6140beSAndroid Build Coastguard Worker #ifndef __PROGRAMMER_H__
21*0d6140beSAndroid Build Coastguard Worker #define __PROGRAMMER_H__ 1
22*0d6140beSAndroid Build Coastguard Worker
23*0d6140beSAndroid Build Coastguard Worker #include <stdbool.h>
24*0d6140beSAndroid Build Coastguard Worker #include <stdint.h>
25*0d6140beSAndroid Build Coastguard Worker
26*0d6140beSAndroid Build Coastguard Worker #include "flash.h" /* for chipaddr and flashctx */
27*0d6140beSAndroid Build Coastguard Worker
28*0d6140beSAndroid Build Coastguard Worker
29*0d6140beSAndroid Build Coastguard Worker /*
30*0d6140beSAndroid Build Coastguard Worker * This function returns 'true' if current flashrom invocation is programming
31*0d6140beSAndroid Build Coastguard Worker * the EC.
32*0d6140beSAndroid Build Coastguard Worker */
33*0d6140beSAndroid Build Coastguard Worker bool programming_ec(void);
34*0d6140beSAndroid Build Coastguard Worker
35*0d6140beSAndroid Build Coastguard Worker enum programmer_type {
36*0d6140beSAndroid Build Coastguard Worker PCI = 1, /* to detect uninitialized values */
37*0d6140beSAndroid Build Coastguard Worker USB,
38*0d6140beSAndroid Build Coastguard Worker OTHER,
39*0d6140beSAndroid Build Coastguard Worker };
40*0d6140beSAndroid Build Coastguard Worker struct board_cfg;
41*0d6140beSAndroid Build Coastguard Worker struct programmer_cfg {
42*0d6140beSAndroid Build Coastguard Worker char *params;
43*0d6140beSAndroid Build Coastguard Worker struct board_cfg *bcfg;
44*0d6140beSAndroid Build Coastguard Worker };
45*0d6140beSAndroid Build Coastguard Worker
46*0d6140beSAndroid Build Coastguard Worker struct dev_entry {
47*0d6140beSAndroid Build Coastguard Worker uint16_t vendor_id;
48*0d6140beSAndroid Build Coastguard Worker uint16_t device_id;
49*0d6140beSAndroid Build Coastguard Worker const enum test_state status;
50*0d6140beSAndroid Build Coastguard Worker const char *vendor_name;
51*0d6140beSAndroid Build Coastguard Worker const char *device_name;
52*0d6140beSAndroid Build Coastguard Worker };
53*0d6140beSAndroid Build Coastguard Worker
54*0d6140beSAndroid Build Coastguard Worker struct programmer_entry {
55*0d6140beSAndroid Build Coastguard Worker const char *name;
56*0d6140beSAndroid Build Coastguard Worker const enum programmer_type type;
57*0d6140beSAndroid Build Coastguard Worker union {
58*0d6140beSAndroid Build Coastguard Worker const struct dev_entry *const dev;
59*0d6140beSAndroid Build Coastguard Worker const char *const note;
60*0d6140beSAndroid Build Coastguard Worker } devs;
61*0d6140beSAndroid Build Coastguard Worker
62*0d6140beSAndroid Build Coastguard Worker int (*init) (const struct programmer_cfg *cfg);
63*0d6140beSAndroid Build Coastguard Worker };
64*0d6140beSAndroid Build Coastguard Worker
65*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry *const programmer_table[];
66*0d6140beSAndroid Build Coastguard Worker extern const size_t programmer_table_size;
67*0d6140beSAndroid Build Coastguard Worker
68*0d6140beSAndroid Build Coastguard Worker /* programmer drivers */
69*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_asm106x;
70*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_atahpt;
71*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_atapromise;
72*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_atavia;
73*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_buspirate_spi;
74*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_ch341a_spi;
75*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_ch347_spi;
76*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_dediprog;
77*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_developerbox;
78*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_digilent_spi;
79*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_drkaiser;
80*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_dummy;
81*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_ft2232_spi;
82*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_gfxnvidia;
83*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_internal;
84*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_it8212;
85*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_jlink_spi;
86*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_linux_mtd;
87*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_linux_spi;
88*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_parade_lspcon;
89*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_mediatek_i2c_spi;
90*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_mstarddc_spi;
91*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_ni845x_spi;
92*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_nic3com;
93*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_nicintel;
94*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_nicintel_eeprom;
95*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_nicintel_spi;
96*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_nicnatsemi;
97*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_nicrealtek;
98*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_ogp_spi;
99*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_pickit2_spi;
100*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_pony_spi;
101*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_raiden_debug_spi;
102*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_rayer_spi;
103*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_realtek_mst_i2c_spi;
104*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_satamv;
105*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_satasii;
106*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_serprog;
107*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_stlinkv3_spi;
108*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_usbblaster_spi;
109*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_dirtyjtag_spi;
110*0d6140beSAndroid Build Coastguard Worker
111*0d6140beSAndroid Build Coastguard Worker extern const struct programmer_entry programmer_cros_ec;
112*0d6140beSAndroid Build Coastguard Worker
113*0d6140beSAndroid Build Coastguard Worker int programmer_init(const struct programmer_entry *prog, const char *param);
114*0d6140beSAndroid Build Coastguard Worker int programmer_shutdown(void);
115*0d6140beSAndroid Build Coastguard Worker
116*0d6140beSAndroid Build Coastguard Worker struct bitbang_spi_master {
117*0d6140beSAndroid Build Coastguard Worker /* Note that CS# is active low, so val=0 means the chip is active. */
118*0d6140beSAndroid Build Coastguard Worker void (*set_cs) (int val, void *spi_data);
119*0d6140beSAndroid Build Coastguard Worker void (*set_sck) (int val, void *spi_data);
120*0d6140beSAndroid Build Coastguard Worker void (*set_mosi) (int val, void *spi_data);
121*0d6140beSAndroid Build Coastguard Worker int (*get_miso) (void *spi_data);
122*0d6140beSAndroid Build Coastguard Worker void (*request_bus) (void *spi_data);
123*0d6140beSAndroid Build Coastguard Worker void (*release_bus) (void *spi_data);
124*0d6140beSAndroid Build Coastguard Worker /* optional functions to optimize xfers */
125*0d6140beSAndroid Build Coastguard Worker void (*set_sck_set_mosi) (int sck, int mosi, void *spi_data);
126*0d6140beSAndroid Build Coastguard Worker int (*set_sck_get_miso) (int sck, void *spi_data);
127*0d6140beSAndroid Build Coastguard Worker /* Length of half a clock period in usecs. */
128*0d6140beSAndroid Build Coastguard Worker unsigned int half_period;
129*0d6140beSAndroid Build Coastguard Worker };
130*0d6140beSAndroid Build Coastguard Worker
131*0d6140beSAndroid Build Coastguard Worker struct pci_dev;
132*0d6140beSAndroid Build Coastguard Worker struct pci_filter;
133*0d6140beSAndroid Build Coastguard Worker
134*0d6140beSAndroid Build Coastguard Worker /* pcidev.c */
135*0d6140beSAndroid Build Coastguard Worker // FIXME: This needs to be local, not global(?)
136*0d6140beSAndroid Build Coastguard Worker extern struct pci_access *pacc;
137*0d6140beSAndroid Build Coastguard Worker int pci_init_common(void);
138*0d6140beSAndroid Build Coastguard Worker uintptr_t pcidev_readbar(struct pci_dev *dev, int bar);
139*0d6140beSAndroid Build Coastguard Worker struct pci_dev *pcidev_init(const struct programmer_cfg *cfg, const struct dev_entry *devs, int bar);
140*0d6140beSAndroid Build Coastguard Worker struct pci_dev *pcidev_scandev(struct pci_filter *filter, struct pci_dev *start);
141*0d6140beSAndroid Build Coastguard Worker struct pci_dev *pcidev_getdevfn(struct pci_dev *dev, const int func);
142*0d6140beSAndroid Build Coastguard Worker struct pci_dev *pcidev_find_vendorclass(uint16_t vendor, uint16_t devclass);
143*0d6140beSAndroid Build Coastguard Worker struct pci_dev *pcidev_card_find(uint16_t vendor, uint16_t device, uint16_t card_vendor, uint16_t card_device);
144*0d6140beSAndroid Build Coastguard Worker struct pci_dev *pcidev_find(uint16_t vendor, uint16_t device);
145*0d6140beSAndroid Build Coastguard Worker /* rpci_write_* are reversible writes. The original PCI config space register
146*0d6140beSAndroid Build Coastguard Worker * contents will be restored on shutdown.
147*0d6140beSAndroid Build Coastguard Worker * To clone the pci_dev instances internally, the `pacc` global
148*0d6140beSAndroid Build Coastguard Worker * variable has to reference a pci_access method that is compatible
149*0d6140beSAndroid Build Coastguard Worker * with the given pci_dev handle. The referenced pci_access (not
150*0d6140beSAndroid Build Coastguard Worker * the variable) has to stay valid until the shutdown handlers are
151*0d6140beSAndroid Build Coastguard Worker * finished.
152*0d6140beSAndroid Build Coastguard Worker */
153*0d6140beSAndroid Build Coastguard Worker int rpci_write_byte(struct pci_dev *dev, int reg, uint8_t data);
154*0d6140beSAndroid Build Coastguard Worker int rpci_write_word(struct pci_dev *dev, int reg, uint16_t data);
155*0d6140beSAndroid Build Coastguard Worker int rpci_write_long(struct pci_dev *dev, int reg, uint32_t data);
156*0d6140beSAndroid Build Coastguard Worker
157*0d6140beSAndroid Build Coastguard Worker #if CONFIG_INTERNAL == 1
158*0d6140beSAndroid Build Coastguard Worker struct penable {
159*0d6140beSAndroid Build Coastguard Worker uint16_t vendor_id;
160*0d6140beSAndroid Build Coastguard Worker uint16_t device_id;
161*0d6140beSAndroid Build Coastguard Worker enum chipbustype buses;
162*0d6140beSAndroid Build Coastguard Worker const enum test_state status;
163*0d6140beSAndroid Build Coastguard Worker const char *vendor_name;
164*0d6140beSAndroid Build Coastguard Worker const char *device_name;
165*0d6140beSAndroid Build Coastguard Worker int (*doit) (const struct programmer_cfg *cfg, struct pci_dev *dev, const char *name);
166*0d6140beSAndroid Build Coastguard Worker };
167*0d6140beSAndroid Build Coastguard Worker
168*0d6140beSAndroid Build Coastguard Worker extern const struct penable chipset_enables[];
169*0d6140beSAndroid Build Coastguard Worker
170*0d6140beSAndroid Build Coastguard Worker enum board_match_phase {
171*0d6140beSAndroid Build Coastguard Worker P1,
172*0d6140beSAndroid Build Coastguard Worker P2,
173*0d6140beSAndroid Build Coastguard Worker P3
174*0d6140beSAndroid Build Coastguard Worker };
175*0d6140beSAndroid Build Coastguard Worker
176*0d6140beSAndroid Build Coastguard Worker struct board_cfg {
177*0d6140beSAndroid Build Coastguard Worker int is_laptop;
178*0d6140beSAndroid Build Coastguard Worker bool laptop_ok;
179*0d6140beSAndroid Build Coastguard Worker };
180*0d6140beSAndroid Build Coastguard Worker
181*0d6140beSAndroid Build Coastguard Worker struct board_match {
182*0d6140beSAndroid Build Coastguard Worker /* Any device, but make it sensible, like the ISA bridge. */
183*0d6140beSAndroid Build Coastguard Worker uint16_t first_vendor;
184*0d6140beSAndroid Build Coastguard Worker uint16_t first_device;
185*0d6140beSAndroid Build Coastguard Worker uint16_t first_card_vendor;
186*0d6140beSAndroid Build Coastguard Worker uint16_t first_card_device;
187*0d6140beSAndroid Build Coastguard Worker
188*0d6140beSAndroid Build Coastguard Worker /* Any device, but make it sensible, like
189*0d6140beSAndroid Build Coastguard Worker * the host bridge. May be NULL.
190*0d6140beSAndroid Build Coastguard Worker */
191*0d6140beSAndroid Build Coastguard Worker uint16_t second_vendor;
192*0d6140beSAndroid Build Coastguard Worker uint16_t second_device;
193*0d6140beSAndroid Build Coastguard Worker uint16_t second_card_vendor;
194*0d6140beSAndroid Build Coastguard Worker uint16_t second_card_device;
195*0d6140beSAndroid Build Coastguard Worker
196*0d6140beSAndroid Build Coastguard Worker /* Pattern to match DMI entries. May be NULL. */
197*0d6140beSAndroid Build Coastguard Worker const char *dmi_pattern;
198*0d6140beSAndroid Build Coastguard Worker
199*0d6140beSAndroid Build Coastguard Worker /* The vendor / part name from the coreboot table. May be NULL. */
200*0d6140beSAndroid Build Coastguard Worker const char *lb_vendor;
201*0d6140beSAndroid Build Coastguard Worker const char *lb_part;
202*0d6140beSAndroid Build Coastguard Worker
203*0d6140beSAndroid Build Coastguard Worker enum board_match_phase phase;
204*0d6140beSAndroid Build Coastguard Worker
205*0d6140beSAndroid Build Coastguard Worker const char *vendor_name;
206*0d6140beSAndroid Build Coastguard Worker const char *board_name;
207*0d6140beSAndroid Build Coastguard Worker
208*0d6140beSAndroid Build Coastguard Worker int max_rom_decode_parallel;
209*0d6140beSAndroid Build Coastguard Worker const enum test_state status;
210*0d6140beSAndroid Build Coastguard Worker int (*enable) (struct board_cfg *cfg); /* May be NULL. */
211*0d6140beSAndroid Build Coastguard Worker };
212*0d6140beSAndroid Build Coastguard Worker
213*0d6140beSAndroid Build Coastguard Worker extern const struct board_match board_matches[];
214*0d6140beSAndroid Build Coastguard Worker extern const size_t board_matches_size;
215*0d6140beSAndroid Build Coastguard Worker
216*0d6140beSAndroid Build Coastguard Worker struct board_info {
217*0d6140beSAndroid Build Coastguard Worker const char *vendor;
218*0d6140beSAndroid Build Coastguard Worker const char *name;
219*0d6140beSAndroid Build Coastguard Worker const enum test_state working;
220*0d6140beSAndroid Build Coastguard Worker #ifdef CONFIG_PRINT_WIKI
221*0d6140beSAndroid Build Coastguard Worker const char *url;
222*0d6140beSAndroid Build Coastguard Worker const char *note;
223*0d6140beSAndroid Build Coastguard Worker #endif
224*0d6140beSAndroid Build Coastguard Worker };
225*0d6140beSAndroid Build Coastguard Worker
226*0d6140beSAndroid Build Coastguard Worker extern const struct board_info boards_known[];
227*0d6140beSAndroid Build Coastguard Worker extern const struct board_info laptops_known[];
228*0d6140beSAndroid Build Coastguard Worker #endif
229*0d6140beSAndroid Build Coastguard Worker
230*0d6140beSAndroid Build Coastguard Worker /* udelay.c */
231*0d6140beSAndroid Build Coastguard Worker void internal_sleep(unsigned int usecs);
232*0d6140beSAndroid Build Coastguard Worker void default_delay(unsigned int usecs);
233*0d6140beSAndroid Build Coastguard Worker
234*0d6140beSAndroid Build Coastguard Worker #if CONFIG_INTERNAL == 1
235*0d6140beSAndroid Build Coastguard Worker /* board_enable.c */
236*0d6140beSAndroid Build Coastguard Worker int selfcheck_board_enables(void);
237*0d6140beSAndroid Build Coastguard Worker int board_parse_parameter(const char *boardstring, char **vendor, char **model);
238*0d6140beSAndroid Build Coastguard Worker void w836xx_ext_enter(uint16_t port);
239*0d6140beSAndroid Build Coastguard Worker void w836xx_ext_leave(uint16_t port);
240*0d6140beSAndroid Build Coastguard Worker void probe_superio_winbond(void);
241*0d6140beSAndroid Build Coastguard Worker int it8705f_write_enable(uint8_t port);
242*0d6140beSAndroid Build Coastguard Worker uint8_t sio_read(uint16_t port, uint8_t reg);
243*0d6140beSAndroid Build Coastguard Worker void sio_write(uint16_t port, uint8_t reg, uint8_t data);
244*0d6140beSAndroid Build Coastguard Worker void sio_mask(uint16_t port, uint8_t reg, uint8_t data, uint8_t mask);
245*0d6140beSAndroid Build Coastguard Worker void board_handle_before_superio(struct board_cfg *cfg, bool force_boardenable);
246*0d6140beSAndroid Build Coastguard Worker void board_handle_before_laptop(struct board_cfg *cfg, bool force_boardenable);
247*0d6140beSAndroid Build Coastguard Worker int board_flash_enable(struct board_cfg *cfg, const char *vendor, const char *model, const char *cb_vendor, const char *cb_model, bool force_boardenable);
248*0d6140beSAndroid Build Coastguard Worker
249*0d6140beSAndroid Build Coastguard Worker /* chipset_enable.c */
250*0d6140beSAndroid Build Coastguard Worker int chipset_flash_enable(const struct programmer_cfg *cfg);
251*0d6140beSAndroid Build Coastguard Worker
252*0d6140beSAndroid Build Coastguard Worker /* processor_enable.c */
253*0d6140beSAndroid Build Coastguard Worker int processor_flash_enable(void);
254*0d6140beSAndroid Build Coastguard Worker #endif
255*0d6140beSAndroid Build Coastguard Worker
256*0d6140beSAndroid Build Coastguard Worker #if CONFIG_INTERNAL == 1
257*0d6140beSAndroid Build Coastguard Worker /* cbtable.c */
258*0d6140beSAndroid Build Coastguard Worker int cb_parse_table(const char **vendor, const char **model);
259*0d6140beSAndroid Build Coastguard Worker int cb_check_image(const uint8_t *bios, unsigned int size);
260*0d6140beSAndroid Build Coastguard Worker
261*0d6140beSAndroid Build Coastguard Worker /* dmi.c */
262*0d6140beSAndroid Build Coastguard Worker #if defined(__i386__) || defined(__x86_64__)
263*0d6140beSAndroid Build Coastguard Worker void dmi_init(int *is_laptop);
264*0d6140beSAndroid Build Coastguard Worker bool dmi_is_supported(void);
265*0d6140beSAndroid Build Coastguard Worker int dmi_match(const char *pattern);
266*0d6140beSAndroid Build Coastguard Worker #endif // defined(__i386__) || defined(__x86_64__)
267*0d6140beSAndroid Build Coastguard Worker
268*0d6140beSAndroid Build Coastguard Worker /* internal.c */
269*0d6140beSAndroid Build Coastguard Worker struct superio {
270*0d6140beSAndroid Build Coastguard Worker uint16_t vendor;
271*0d6140beSAndroid Build Coastguard Worker uint16_t port;
272*0d6140beSAndroid Build Coastguard Worker uint16_t model;
273*0d6140beSAndroid Build Coastguard Worker };
274*0d6140beSAndroid Build Coastguard Worker extern struct superio superios[];
275*0d6140beSAndroid Build Coastguard Worker extern int superio_count;
276*0d6140beSAndroid Build Coastguard Worker #define SUPERIO_VENDOR_NONE 0x0
277*0d6140beSAndroid Build Coastguard Worker #define SUPERIO_VENDOR_ITE 0x1
278*0d6140beSAndroid Build Coastguard Worker #define SUPERIO_VENDOR_WINBOND 0x2
279*0d6140beSAndroid Build Coastguard Worker #endif
280*0d6140beSAndroid Build Coastguard Worker
281*0d6140beSAndroid Build Coastguard Worker #if CONFIG_INTERNAL == 1
282*0d6140beSAndroid Build Coastguard Worker extern bool force_boardmismatch;
283*0d6140beSAndroid Build Coastguard Worker void probe_superio(void);
284*0d6140beSAndroid Build Coastguard Worker int register_superio(struct superio s);
285*0d6140beSAndroid Build Coastguard Worker extern enum chipbustype internal_buses_supported;
286*0d6140beSAndroid Build Coastguard Worker int internal_init(const struct programmer_cfg *cfg);
287*0d6140beSAndroid Build Coastguard Worker #endif
288*0d6140beSAndroid Build Coastguard Worker
289*0d6140beSAndroid Build Coastguard Worker /* bitbang_spi.c */
290*0d6140beSAndroid Build Coastguard Worker int register_spi_bitbang_master(const struct bitbang_spi_master *master, void *spi_data);
291*0d6140beSAndroid Build Coastguard Worker
292*0d6140beSAndroid Build Coastguard Worker
293*0d6140beSAndroid Build Coastguard Worker /* flashrom.c */
294*0d6140beSAndroid Build Coastguard Worker struct decode_sizes {
295*0d6140beSAndroid Build Coastguard Worker uint32_t parallel;
296*0d6140beSAndroid Build Coastguard Worker uint32_t lpc;
297*0d6140beSAndroid Build Coastguard Worker uint32_t fwh;
298*0d6140beSAndroid Build Coastguard Worker uint32_t spi;
299*0d6140beSAndroid Build Coastguard Worker };
300*0d6140beSAndroid Build Coastguard Worker // FIXME: These need to be local, not global
301*0d6140beSAndroid Build Coastguard Worker extern struct decode_sizes max_rom_decode;
302*0d6140beSAndroid Build Coastguard Worker extern bool programmer_may_write;
303*0d6140beSAndroid Build Coastguard Worker extern uintptr_t flashbase; /* used in programmer_enable.c */
304*0d6140beSAndroid Build Coastguard Worker char *extract_programmer_param_str(const struct programmer_cfg *cfg, const char *param_name);
305*0d6140beSAndroid Build Coastguard Worker
306*0d6140beSAndroid Build Coastguard Worker /* spi.c */
307*0d6140beSAndroid Build Coastguard Worker #define MAX_DATA_UNSPECIFIED 0
308*0d6140beSAndroid Build Coastguard Worker #define MAX_DATA_READ_UNLIMITED 64 * 1024
309*0d6140beSAndroid Build Coastguard Worker #define MAX_DATA_WRITE_UNLIMITED 256
310*0d6140beSAndroid Build Coastguard Worker
311*0d6140beSAndroid Build Coastguard Worker #define SPI_MASTER_4BA (1U << 0) /**< Can handle 4-byte addresses */
312*0d6140beSAndroid Build Coastguard Worker #define SPI_MASTER_NO_4BA_MODES (1U << 1) /**< Compatibility modes (i.e. extended address
313*0d6140beSAndroid Build Coastguard Worker register, 4BA mode switch) don't work */
314*0d6140beSAndroid Build Coastguard Worker
315*0d6140beSAndroid Build Coastguard Worker struct spi_master {
316*0d6140beSAndroid Build Coastguard Worker uint32_t features;
317*0d6140beSAndroid Build Coastguard Worker unsigned int max_data_read; // (Ideally,) maximum data read size in one go (excluding opcode+address).
318*0d6140beSAndroid Build Coastguard Worker unsigned int max_data_write; // (Ideally,) maximum data write size in one go (excluding opcode+address).
319*0d6140beSAndroid Build Coastguard Worker int (*command)(const struct flashctx *flash, unsigned int writecnt, unsigned int readcnt,
320*0d6140beSAndroid Build Coastguard Worker const unsigned char *writearr, unsigned char *readarr);
321*0d6140beSAndroid Build Coastguard Worker int (*multicommand)(const struct flashctx *flash, struct spi_command *cmds);
322*0d6140beSAndroid Build Coastguard Worker
323*0d6140beSAndroid Build Coastguard Worker /* Optimized functions for this master */
324*0d6140beSAndroid Build Coastguard Worker void *(*map_flash_region) (const char *descr, uintptr_t phys_addr, size_t len);
325*0d6140beSAndroid Build Coastguard Worker void (*unmap_flash_region) (void *virt_addr, size_t len);
326*0d6140beSAndroid Build Coastguard Worker int (*read)(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len);
327*0d6140beSAndroid Build Coastguard Worker int (*write_256)(struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len);
328*0d6140beSAndroid Build Coastguard Worker int (*write_aai)(struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len);
329*0d6140beSAndroid Build Coastguard Worker int (*shutdown)(void *data);
330*0d6140beSAndroid Build Coastguard Worker bool (*probe_opcode)(const struct flashctx *flash, uint8_t opcode); /* NULL func implies true. */
331*0d6140beSAndroid Build Coastguard Worker void (*delay) (const struct flashctx *flash, unsigned int usecs);
332*0d6140beSAndroid Build Coastguard Worker void (*get_region)(const struct flashctx *flash, unsigned int addr, struct flash_region *region);
333*0d6140beSAndroid Build Coastguard Worker void *data;
334*0d6140beSAndroid Build Coastguard Worker };
335*0d6140beSAndroid Build Coastguard Worker
336*0d6140beSAndroid Build Coastguard Worker int default_spi_read(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len);
337*0d6140beSAndroid Build Coastguard Worker int default_spi_write_256(struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len);
338*0d6140beSAndroid Build Coastguard Worker int default_spi_write_aai(struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len);
339*0d6140beSAndroid Build Coastguard Worker int register_spi_master(const struct spi_master *mst, void *data);
340*0d6140beSAndroid Build Coastguard Worker
341*0d6140beSAndroid Build Coastguard Worker /* The following enum is needed by ich_descriptor_tool and ich* code as well as in chipset_enable.c. */
342*0d6140beSAndroid Build Coastguard Worker enum ich_chipset {
343*0d6140beSAndroid Build Coastguard Worker CHIPSET_ICH_UNKNOWN,
344*0d6140beSAndroid Build Coastguard Worker CHIPSET_ICH,
345*0d6140beSAndroid Build Coastguard Worker CHIPSET_ICH2345,
346*0d6140beSAndroid Build Coastguard Worker CHIPSET_ICH6,
347*0d6140beSAndroid Build Coastguard Worker CHIPSET_POULSBO, /* SCH U* */
348*0d6140beSAndroid Build Coastguard Worker CHIPSET_TUNNEL_CREEK, /* Atom E6xx */
349*0d6140beSAndroid Build Coastguard Worker CHIPSET_CENTERTON, /* Atom S1220 S1240 S1260 */
350*0d6140beSAndroid Build Coastguard Worker CHIPSET_ICH7,
351*0d6140beSAndroid Build Coastguard Worker CHIPSET_ICH8,
352*0d6140beSAndroid Build Coastguard Worker CHIPSET_ICH9,
353*0d6140beSAndroid Build Coastguard Worker CHIPSET_ICH10,
354*0d6140beSAndroid Build Coastguard Worker CHIPSET_5_SERIES_IBEX_PEAK,
355*0d6140beSAndroid Build Coastguard Worker CHIPSET_6_SERIES_COUGAR_POINT,
356*0d6140beSAndroid Build Coastguard Worker CHIPSET_7_SERIES_PANTHER_POINT,
357*0d6140beSAndroid Build Coastguard Worker CHIPSET_8_SERIES_LYNX_POINT,
358*0d6140beSAndroid Build Coastguard Worker CHIPSET_BAYTRAIL, /* Actually all with Silvermont architecture: Bay Trail, Avoton/Rangeley */
359*0d6140beSAndroid Build Coastguard Worker CHIPSET_8_SERIES_LYNX_POINT_LP,
360*0d6140beSAndroid Build Coastguard Worker CHIPSET_8_SERIES_WELLSBURG,
361*0d6140beSAndroid Build Coastguard Worker CHIPSET_9_SERIES_WILDCAT_POINT,
362*0d6140beSAndroid Build Coastguard Worker CHIPSET_9_SERIES_WILDCAT_POINT_LP,
363*0d6140beSAndroid Build Coastguard Worker CHIPSET_100_SERIES_SUNRISE_POINT, /* also 6th/7th gen Core i/o (LP) variants */
364*0d6140beSAndroid Build Coastguard Worker CHIPSET_C620_SERIES_LEWISBURG,
365*0d6140beSAndroid Build Coastguard Worker CHIPSET_C740_SERIES_EMMITSBURG,
366*0d6140beSAndroid Build Coastguard Worker CHIPSET_300_SERIES_CANNON_POINT,
367*0d6140beSAndroid Build Coastguard Worker CHIPSET_400_SERIES_COMET_POINT,
368*0d6140beSAndroid Build Coastguard Worker CHIPSET_500_SERIES_TIGER_POINT,
369*0d6140beSAndroid Build Coastguard Worker CHIPSET_600_SERIES_ALDER_POINT,
370*0d6140beSAndroid Build Coastguard Worker CHIPSET_700_SERIES_RAPTOR_POINT,
371*0d6140beSAndroid Build Coastguard Worker CHIPSET_APOLLO_LAKE,
372*0d6140beSAndroid Build Coastguard Worker CHIPSET_GEMINI_LAKE,
373*0d6140beSAndroid Build Coastguard Worker CHIPSET_JASPER_LAKE,
374*0d6140beSAndroid Build Coastguard Worker CHIPSET_ELKHART_LAKE,
375*0d6140beSAndroid Build Coastguard Worker /* All chipsets after METEOR_LAKE should support checking BIOS_BM to get read/write access to of FREG0~15 */
376*0d6140beSAndroid Build Coastguard Worker CHIPSET_METEOR_LAKE,
377*0d6140beSAndroid Build Coastguard Worker CHIPSET_PANTHER_LAKE,
378*0d6140beSAndroid Build Coastguard Worker };
379*0d6140beSAndroid Build Coastguard Worker
380*0d6140beSAndroid Build Coastguard Worker /* ichspi.c */
381*0d6140beSAndroid Build Coastguard Worker #if CONFIG_INTERNAL == 1
382*0d6140beSAndroid Build Coastguard Worker int ich_init_spi(const struct programmer_cfg *cfg, void *spibar, enum ich_chipset ich_generation);
383*0d6140beSAndroid Build Coastguard Worker int via_init_spi(uint32_t mmio_base);
384*0d6140beSAndroid Build Coastguard Worker
385*0d6140beSAndroid Build Coastguard Worker /* amd_imc.c */
386*0d6140beSAndroid Build Coastguard Worker int amd_imc_shutdown(struct pci_dev *dev);
387*0d6140beSAndroid Build Coastguard Worker
388*0d6140beSAndroid Build Coastguard Worker /* it87spi.c */
389*0d6140beSAndroid Build Coastguard Worker void enter_conf_mode_ite(uint16_t port);
390*0d6140beSAndroid Build Coastguard Worker void exit_conf_mode_ite(uint16_t port);
391*0d6140beSAndroid Build Coastguard Worker void probe_superio_ite(void);
392*0d6140beSAndroid Build Coastguard Worker int init_superio_ite(const struct programmer_cfg *cfg);
393*0d6140beSAndroid Build Coastguard Worker
394*0d6140beSAndroid Build Coastguard Worker /* trivial wrapper to avoid cluttering internal_init() with #if */
try_mtd(const struct programmer_cfg * cfg)395*0d6140beSAndroid Build Coastguard Worker static inline int try_mtd(const struct programmer_cfg *cfg)
396*0d6140beSAndroid Build Coastguard Worker {
397*0d6140beSAndroid Build Coastguard Worker #if CONFIG_LINUX_MTD == 1
398*0d6140beSAndroid Build Coastguard Worker return programmer_linux_mtd.init(cfg);
399*0d6140beSAndroid Build Coastguard Worker #else
400*0d6140beSAndroid Build Coastguard Worker return 1;
401*0d6140beSAndroid Build Coastguard Worker #endif
402*0d6140beSAndroid Build Coastguard Worker }
403*0d6140beSAndroid Build Coastguard Worker
404*0d6140beSAndroid Build Coastguard Worker /* mcp6x_spi.c */
405*0d6140beSAndroid Build Coastguard Worker int mcp6x_spi_init(int want_spi);
406*0d6140beSAndroid Build Coastguard Worker
407*0d6140beSAndroid Build Coastguard Worker /* internal_par.c */
408*0d6140beSAndroid Build Coastguard Worker void internal_par_init(enum chipbustype buses);
409*0d6140beSAndroid Build Coastguard Worker
410*0d6140beSAndroid Build Coastguard Worker /* sb600spi.c */
411*0d6140beSAndroid Build Coastguard Worker int sb600_probe_spi(const struct programmer_cfg *cfg, struct pci_dev *dev);
412*0d6140beSAndroid Build Coastguard Worker
413*0d6140beSAndroid Build Coastguard Worker /* wbsio_spi.c */
414*0d6140beSAndroid Build Coastguard Worker int wbsio_check_for_spi(struct board_cfg *);
415*0d6140beSAndroid Build Coastguard Worker #endif
416*0d6140beSAndroid Build Coastguard Worker
417*0d6140beSAndroid Build Coastguard Worker /* opaque.c */
418*0d6140beSAndroid Build Coastguard Worker struct opaque_master {
419*0d6140beSAndroid Build Coastguard Worker int max_data_read;
420*0d6140beSAndroid Build Coastguard Worker int max_data_write;
421*0d6140beSAndroid Build Coastguard Worker /* Specific functions for this master */
422*0d6140beSAndroid Build Coastguard Worker int (*probe) (struct flashctx *flash);
423*0d6140beSAndroid Build Coastguard Worker int (*read) (struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len);
424*0d6140beSAndroid Build Coastguard Worker int (*write) (struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len);
425*0d6140beSAndroid Build Coastguard Worker int (*erase) (struct flashctx *flash, unsigned int blockaddr, unsigned int blocklen);
426*0d6140beSAndroid Build Coastguard Worker /*
427*0d6140beSAndroid Build Coastguard Worker * Callbacks for accessing flash registers. An opaque programmer must
428*0d6140beSAndroid Build Coastguard Worker * provide these functions for writeprotect operations to be available,
429*0d6140beSAndroid Build Coastguard Worker * unless it provides custom wp operations instead.
430*0d6140beSAndroid Build Coastguard Worker */
431*0d6140beSAndroid Build Coastguard Worker int (*read_register)(const struct flashctx *flash, enum flash_reg reg, uint8_t *value);
432*0d6140beSAndroid Build Coastguard Worker int (*write_register)(const struct flashctx *flash, enum flash_reg reg, uint8_t value);
433*0d6140beSAndroid Build Coastguard Worker /* Callbacks for overiding default writeprotect operations with custom ones. */
434*0d6140beSAndroid Build Coastguard Worker enum flashrom_wp_result (*wp_write_cfg)(struct flashctx *, const struct flashrom_wp_cfg *);
435*0d6140beSAndroid Build Coastguard Worker enum flashrom_wp_result (*wp_read_cfg)(struct flashrom_wp_cfg *, struct flashctx *);
436*0d6140beSAndroid Build Coastguard Worker enum flashrom_wp_result (*wp_get_ranges)(struct flashrom_wp_ranges **, struct flashctx *);
437*0d6140beSAndroid Build Coastguard Worker void (*get_region)(const struct flashctx *flash, unsigned int addr, struct flash_region *region);
438*0d6140beSAndroid Build Coastguard Worker int (*shutdown)(void *data);
439*0d6140beSAndroid Build Coastguard Worker void (*delay) (const struct flashctx *flash, unsigned int usecs);
440*0d6140beSAndroid Build Coastguard Worker void *data;
441*0d6140beSAndroid Build Coastguard Worker };
442*0d6140beSAndroid Build Coastguard Worker int register_opaque_master(const struct opaque_master *mst, void *data);
443*0d6140beSAndroid Build Coastguard Worker
444*0d6140beSAndroid Build Coastguard Worker /* parallel.c */
445*0d6140beSAndroid Build Coastguard Worker struct par_master {
446*0d6140beSAndroid Build Coastguard Worker void *(*map_flash_region) (const char *descr, uintptr_t phys_addr, size_t len);
447*0d6140beSAndroid Build Coastguard Worker void (*unmap_flash_region) (void *virt_addr, size_t len);
448*0d6140beSAndroid Build Coastguard Worker void (*chip_writeb) (const struct flashctx *flash, uint8_t val, chipaddr addr);
449*0d6140beSAndroid Build Coastguard Worker void (*chip_writew) (const struct flashctx *flash, uint16_t val, chipaddr addr);
450*0d6140beSAndroid Build Coastguard Worker void (*chip_writel) (const struct flashctx *flash, uint32_t val, chipaddr addr);
451*0d6140beSAndroid Build Coastguard Worker void (*chip_writen) (const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len);
452*0d6140beSAndroid Build Coastguard Worker uint8_t (*chip_readb) (const struct flashctx *flash, const chipaddr addr);
453*0d6140beSAndroid Build Coastguard Worker uint16_t (*chip_readw) (const struct flashctx *flash, const chipaddr addr);
454*0d6140beSAndroid Build Coastguard Worker uint32_t (*chip_readl) (const struct flashctx *flash, const chipaddr addr);
455*0d6140beSAndroid Build Coastguard Worker void (*chip_readn) (const struct flashctx *flash, uint8_t *buf, const chipaddr addr, size_t len);
456*0d6140beSAndroid Build Coastguard Worker int (*shutdown)(void *data);
457*0d6140beSAndroid Build Coastguard Worker void (*delay) (const struct flashctx *flash, unsigned int usecs);
458*0d6140beSAndroid Build Coastguard Worker void *data;
459*0d6140beSAndroid Build Coastguard Worker };
460*0d6140beSAndroid Build Coastguard Worker int register_par_master(const struct par_master *mst, const enum chipbustype buses, void *data);
461*0d6140beSAndroid Build Coastguard Worker
462*0d6140beSAndroid Build Coastguard Worker /* programmer.c */
463*0d6140beSAndroid Build Coastguard Worker struct registered_master {
464*0d6140beSAndroid Build Coastguard Worker enum chipbustype buses_supported;
465*0d6140beSAndroid Build Coastguard Worker struct {
466*0d6140beSAndroid Build Coastguard Worker struct par_master par;
467*0d6140beSAndroid Build Coastguard Worker struct spi_master spi;
468*0d6140beSAndroid Build Coastguard Worker struct opaque_master opaque;
469*0d6140beSAndroid Build Coastguard Worker };
470*0d6140beSAndroid Build Coastguard Worker };
471*0d6140beSAndroid Build Coastguard Worker extern struct registered_master registered_masters[];
472*0d6140beSAndroid Build Coastguard Worker extern int registered_master_count;
473*0d6140beSAndroid Build Coastguard Worker int register_master(const struct registered_master *mst);
474*0d6140beSAndroid Build Coastguard Worker
475*0d6140beSAndroid Build Coastguard Worker
476*0d6140beSAndroid Build Coastguard Worker
477*0d6140beSAndroid Build Coastguard Worker /* serial.c */
478*0d6140beSAndroid Build Coastguard Worker #if IS_WINDOWS
479*0d6140beSAndroid Build Coastguard Worker typedef HANDLE fdtype;
480*0d6140beSAndroid Build Coastguard Worker #define SER_INV_FD INVALID_HANDLE_VALUE
481*0d6140beSAndroid Build Coastguard Worker #else
482*0d6140beSAndroid Build Coastguard Worker typedef int fdtype;
483*0d6140beSAndroid Build Coastguard Worker #define SER_INV_FD -1
484*0d6140beSAndroid Build Coastguard Worker #endif
485*0d6140beSAndroid Build Coastguard Worker
486*0d6140beSAndroid Build Coastguard Worker /* cros_ec.c */
487*0d6140beSAndroid Build Coastguard Worker /**
488*0d6140beSAndroid Build Coastguard Worker * Probe the Google Chrome OS EC device
489*0d6140beSAndroid Build Coastguard Worker *
490*0d6140beSAndroid Build Coastguard Worker * @return 0 if found correct, non-zero if not found or error
491*0d6140beSAndroid Build Coastguard Worker */
492*0d6140beSAndroid Build Coastguard Worker int cros_ec_need_2nd_pass(void);
493*0d6140beSAndroid Build Coastguard Worker bool cros_ec_erasure_failed(void);
494*0d6140beSAndroid Build Coastguard Worker int cros_ec_finish(void);
495*0d6140beSAndroid Build Coastguard Worker int cros_ec_prepare(struct flashctx *flash, const uint8_t *const image, uint32_t flash_size);
496*0d6140beSAndroid Build Coastguard Worker int cros_ec_block_erase(struct flashctx *flash, unsigned int blockaddr, unsigned int len);
497*0d6140beSAndroid Build Coastguard Worker
498*0d6140beSAndroid Build Coastguard Worker void sp_flush_incoming(void);
499*0d6140beSAndroid Build Coastguard Worker fdtype sp_openserport(char *dev, int baud);
500*0d6140beSAndroid Build Coastguard Worker extern fdtype sp_fd;
501*0d6140beSAndroid Build Coastguard Worker int serialport_config(fdtype fd, int baud);
502*0d6140beSAndroid Build Coastguard Worker int serialport_shutdown(void *data);
503*0d6140beSAndroid Build Coastguard Worker int serialport_write(const unsigned char *buf, unsigned int writecnt);
504*0d6140beSAndroid Build Coastguard Worker int serialport_write_nonblock(const unsigned char *buf, unsigned int writecnt, unsigned int timeout, unsigned int *really_wrote);
505*0d6140beSAndroid Build Coastguard Worker int serialport_read(unsigned char *buf, unsigned int readcnt);
506*0d6140beSAndroid Build Coastguard Worker int serialport_read_nonblock(unsigned char *c, unsigned int readcnt, unsigned int timeout, unsigned int *really_read);
507*0d6140beSAndroid Build Coastguard Worker
508*0d6140beSAndroid Build Coastguard Worker /* Serial port/pin mapping:
509*0d6140beSAndroid Build Coastguard Worker
510*0d6140beSAndroid Build Coastguard Worker 1 CD <-
511*0d6140beSAndroid Build Coastguard Worker 2 RXD <-
512*0d6140beSAndroid Build Coastguard Worker 3 TXD ->
513*0d6140beSAndroid Build Coastguard Worker 4 DTR ->
514*0d6140beSAndroid Build Coastguard Worker 5 GND --
515*0d6140beSAndroid Build Coastguard Worker 6 DSR <-
516*0d6140beSAndroid Build Coastguard Worker 7 RTS ->
517*0d6140beSAndroid Build Coastguard Worker 8 CTS <-
518*0d6140beSAndroid Build Coastguard Worker 9 RI <-
519*0d6140beSAndroid Build Coastguard Worker */
520*0d6140beSAndroid Build Coastguard Worker enum SP_PIN {
521*0d6140beSAndroid Build Coastguard Worker PIN_CD = 1,
522*0d6140beSAndroid Build Coastguard Worker PIN_RXD,
523*0d6140beSAndroid Build Coastguard Worker PIN_TXD,
524*0d6140beSAndroid Build Coastguard Worker PIN_DTR,
525*0d6140beSAndroid Build Coastguard Worker PIN_GND,
526*0d6140beSAndroid Build Coastguard Worker PIN_DSR,
527*0d6140beSAndroid Build Coastguard Worker PIN_RTS,
528*0d6140beSAndroid Build Coastguard Worker PIN_CTS,
529*0d6140beSAndroid Build Coastguard Worker PIN_RI,
530*0d6140beSAndroid Build Coastguard Worker };
531*0d6140beSAndroid Build Coastguard Worker
532*0d6140beSAndroid Build Coastguard Worker void sp_set_pin(enum SP_PIN pin, int val);
533*0d6140beSAndroid Build Coastguard Worker int sp_get_pin(enum SP_PIN pin);
534*0d6140beSAndroid Build Coastguard Worker
535*0d6140beSAndroid Build Coastguard Worker /* spi_master feature checks */
spi_master_4ba(const struct flashctx * const flash)536*0d6140beSAndroid Build Coastguard Worker static inline bool spi_master_4ba(const struct flashctx *const flash)
537*0d6140beSAndroid Build Coastguard Worker {
538*0d6140beSAndroid Build Coastguard Worker return flash->mst->buses_supported & BUS_SPI &&
539*0d6140beSAndroid Build Coastguard Worker flash->mst->spi.features & SPI_MASTER_4BA;
540*0d6140beSAndroid Build Coastguard Worker }
spi_master_no_4ba_modes(const struct flashctx * const flash)541*0d6140beSAndroid Build Coastguard Worker static inline bool spi_master_no_4ba_modes(const struct flashctx *const flash)
542*0d6140beSAndroid Build Coastguard Worker {
543*0d6140beSAndroid Build Coastguard Worker return flash->mst->buses_supported & BUS_SPI &&
544*0d6140beSAndroid Build Coastguard Worker flash->mst->spi.features & SPI_MASTER_NO_4BA_MODES;
545*0d6140beSAndroid Build Coastguard Worker }
546*0d6140beSAndroid Build Coastguard Worker /* spi_chip feature checks */
spi_chip_4ba(const struct flashctx * const flash)547*0d6140beSAndroid Build Coastguard Worker static inline bool spi_chip_4ba(const struct flashctx *const flash)
548*0d6140beSAndroid Build Coastguard Worker {
549*0d6140beSAndroid Build Coastguard Worker return flash->chip->bustype == BUS_SPI &&
550*0d6140beSAndroid Build Coastguard Worker (flash->chip->feature_bits & (FEATURE_4BA_ENTER | FEATURE_4BA_ENTER_WREN | FEATURE_4BA_ENTER_EAR7));
551*0d6140beSAndroid Build Coastguard Worker }
552*0d6140beSAndroid Build Coastguard Worker
553*0d6140beSAndroid Build Coastguard Worker /* usbdev.c */
554*0d6140beSAndroid Build Coastguard Worker struct libusb_device_handle;
555*0d6140beSAndroid Build Coastguard Worker struct libusb_context;
556*0d6140beSAndroid Build Coastguard Worker struct libusb_device_handle *usb_dev_get_by_vid_pid_serial(
557*0d6140beSAndroid Build Coastguard Worker struct libusb_context *usb_ctx, uint16_t vid, uint16_t pid, const char *serialno);
558*0d6140beSAndroid Build Coastguard Worker struct libusb_device_handle *usb_dev_get_by_vid_pid_number(
559*0d6140beSAndroid Build Coastguard Worker struct libusb_context *usb_ctx, uint16_t vid, uint16_t pid, unsigned int num);
560*0d6140beSAndroid Build Coastguard Worker
561*0d6140beSAndroid Build Coastguard Worker
562*0d6140beSAndroid Build Coastguard Worker #endif /* !__PROGRAMMER_H__ */
563