mirror of
https://review.coreboot.org/flashrom.git
synced 2025-04-27 23:22:37 +02:00
Change programmer selection in cli and generic code
Bugfix: Do not accept multiple conflicting --programmer selections. Restriction: Do not accept multiple --programmer selections even if there is no conflict. Unexport the programmer variable. programmer_init requires the programmer as first parameter. The default programmer selection is now part of cli_classic. Corresponding to flashrom svn r1433. Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> Acked-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at>
This commit is contained in:
parent
cb24ddbe12
commit
2e681601b1
104
cli_classic.c
104
cli_classic.c
@ -31,6 +31,74 @@
|
|||||||
#include "flashchips.h"
|
#include "flashchips.h"
|
||||||
#include "programmer.h"
|
#include "programmer.h"
|
||||||
|
|
||||||
|
#if CONFIG_INTERNAL == 1
|
||||||
|
static enum programmer default_programmer = PROGRAMMER_INTERNAL;
|
||||||
|
#elif CONFIG_DUMMY == 1
|
||||||
|
static enum programmer default_programmer = PROGRAMMER_DUMMY;
|
||||||
|
#else
|
||||||
|
/* If neither internal nor dummy are selected, we must pick a sensible default.
|
||||||
|
* Since there is no reason to prefer a particular external programmer, we fail
|
||||||
|
* if more than one of them is selected. If only one is selected, it is clear
|
||||||
|
* that the user wants that one to become the default.
|
||||||
|
*/
|
||||||
|
#if CONFIG_NIC3COM+CONFIG_NICREALTEK+CONFIG_NICNATSEMI+CONFIG_GFXNVIDIA+CONFIG_DRKAISER+CONFIG_SATASII+CONFIG_ATAHPT+CONFIG_FT2232_SPI+CONFIG_SERPROG+CONFIG_BUSPIRATE_SPI+CONFIG_DEDIPROG+CONFIG_RAYER_SPI+CONFIG_NICINTEL+CONFIG_NICINTEL_SPI+CONFIG_OGP_SPI+CONFIG_SATAMV > 1
|
||||||
|
#error Please enable either CONFIG_DUMMY or CONFIG_INTERNAL or disable support for all programmers except one.
|
||||||
|
#endif
|
||||||
|
static enum programmer default_programmer =
|
||||||
|
#if CONFIG_NIC3COM == 1
|
||||||
|
PROGRAMMER_NIC3COM
|
||||||
|
#endif
|
||||||
|
#if CONFIG_NICREALTEK == 1
|
||||||
|
PROGRAMMER_NICREALTEK
|
||||||
|
#endif
|
||||||
|
#if CONFIG_NICNATSEMI == 1
|
||||||
|
PROGRAMMER_NICNATSEMI
|
||||||
|
#endif
|
||||||
|
#if CONFIG_GFXNVIDIA == 1
|
||||||
|
PROGRAMMER_GFXNVIDIA
|
||||||
|
#endif
|
||||||
|
#if CONFIG_DRKAISER == 1
|
||||||
|
PROGRAMMER_DRKAISER
|
||||||
|
#endif
|
||||||
|
#if CONFIG_SATASII == 1
|
||||||
|
PROGRAMMER_SATASII
|
||||||
|
#endif
|
||||||
|
#if CONFIG_ATAHPT == 1
|
||||||
|
PROGRAMMER_ATAHPT
|
||||||
|
#endif
|
||||||
|
#if CONFIG_FT2232_SPI == 1
|
||||||
|
PROGRAMMER_FT2232_SPI
|
||||||
|
#endif
|
||||||
|
#if CONFIG_SERPROG == 1
|
||||||
|
PROGRAMMER_SERPROG
|
||||||
|
#endif
|
||||||
|
#if CONFIG_BUSPIRATE_SPI == 1
|
||||||
|
PROGRAMMER_BUSPIRATE_SPI
|
||||||
|
#endif
|
||||||
|
#if CONFIG_DEDIPROG == 1
|
||||||
|
PROGRAMMER_DEDIPROG
|
||||||
|
#endif
|
||||||
|
#if CONFIG_RAYER_SPI == 1
|
||||||
|
PROGRAMMER_RAYER_SPI
|
||||||
|
#endif
|
||||||
|
#if CONFIG_NICINTEL == 1
|
||||||
|
PROGRAMMER_NICINTEL
|
||||||
|
#endif
|
||||||
|
#if CONFIG_NICINTEL_SPI == 1
|
||||||
|
PROGRAMMER_NICINTEL_SPI
|
||||||
|
#endif
|
||||||
|
#if CONFIG_OGP_SPI == 1
|
||||||
|
PROGRAMMER_OGP_SPI
|
||||||
|
#endif
|
||||||
|
#if CONFIG_SATAMV == 1
|
||||||
|
PROGRAMMER_SATAMV
|
||||||
|
#endif
|
||||||
|
#if CONFIG_LINUX_SPI == 1
|
||||||
|
PROGRAMMER_LINUX_SPI
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
#endif
|
||||||
|
|
||||||
static void cli_classic_usage(const char *name)
|
static void cli_classic_usage(const char *name)
|
||||||
{
|
{
|
||||||
printf("Usage: flashrom [-n] [-V] [-f] [-h|-R|-L|"
|
printf("Usage: flashrom [-n] [-V] [-f] [-h|-R|-L|"
|
||||||
@ -111,6 +179,7 @@ int main(int argc, char *argv[])
|
|||||||
#endif
|
#endif
|
||||||
int read_it = 0, write_it = 0, erase_it = 0, verify_it = 0;
|
int read_it = 0, write_it = 0, erase_it = 0, verify_it = 0;
|
||||||
int dont_verify_it = 0, list_supported = 0, operation_specified = 0;
|
int dont_verify_it = 0, list_supported = 0, operation_specified = 0;
|
||||||
|
enum programmer prog = PROGRAMMER_INVALID;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
static const char optstring[] = "r:Rw:v:nVEfc:m:l:i:p:Lzh";
|
static const char optstring[] = "r:Rw:v:nVEfc:m:l:i:p:Lzh";
|
||||||
@ -258,8 +327,16 @@ int main(int argc, char *argv[])
|
|||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case 'p':
|
case 'p':
|
||||||
for (programmer = 0; programmer < PROGRAMMER_INVALID; programmer++) {
|
if (prog != PROGRAMMER_INVALID) {
|
||||||
name = programmer_table[programmer].name;
|
fprintf(stderr, "Error: --programmer specified "
|
||||||
|
"more than once. You can separate "
|
||||||
|
"multiple\nparameters for a programmer "
|
||||||
|
"with \",\". Please see the man page "
|
||||||
|
"for details.\n");
|
||||||
|
cli_classic_abort_usage();
|
||||||
|
}
|
||||||
|
for (prog = 0; prog < PROGRAMMER_INVALID; prog++) {
|
||||||
|
name = programmer_table[prog].name;
|
||||||
namelen = strlen(name);
|
namelen = strlen(name);
|
||||||
if (strncmp(optarg, name, namelen) == 0) {
|
if (strncmp(optarg, name, namelen) == 0) {
|
||||||
switch (optarg[namelen]) {
|
switch (optarg[namelen]) {
|
||||||
@ -283,7 +360,7 @@ int main(int argc, char *argv[])
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (programmer == PROGRAMMER_INVALID) {
|
if (prog == PROGRAMMER_INVALID) {
|
||||||
fprintf(stderr, "Error: Unknown programmer "
|
fprintf(stderr, "Error: Unknown programmer "
|
||||||
"%s.\n", optarg);
|
"%s.\n", optarg);
|
||||||
cli_classic_abort_usage();
|
cli_classic_abort_usage();
|
||||||
@ -332,14 +409,6 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CONFIG_INTERNAL == 1
|
|
||||||
if ((programmer != PROGRAMMER_INTERNAL) && (lb_part || lb_vendor)) {
|
|
||||||
fprintf(stderr, "Error: --mainboard requires the internal "
|
|
||||||
"programmer. Aborting.\n");
|
|
||||||
cli_classic_abort_usage();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (chip_to_probe) {
|
if (chip_to_probe) {
|
||||||
for (flash = flashchips; flash && flash->name; flash++)
|
for (flash = flashchips; flash && flash->name; flash++)
|
||||||
if (!strcmp(flash->name, chip_to_probe))
|
if (!strcmp(flash->name, chip_to_probe))
|
||||||
@ -355,10 +424,21 @@ int main(int argc, char *argv[])
|
|||||||
flash = NULL;
|
flash = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (prog == PROGRAMMER_INVALID)
|
||||||
|
prog = default_programmer;
|
||||||
|
|
||||||
|
#if CONFIG_INTERNAL == 1
|
||||||
|
if ((prog != PROGRAMMER_INTERNAL) && (lb_part || lb_vendor)) {
|
||||||
|
fprintf(stderr, "Error: --mainboard requires the internal "
|
||||||
|
"programmer. Aborting.\n");
|
||||||
|
cli_classic_abort_usage();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* FIXME: Delay calibration should happen in programmer code. */
|
/* FIXME: Delay calibration should happen in programmer code. */
|
||||||
myusec_calibrate_delay();
|
myusec_calibrate_delay();
|
||||||
|
|
||||||
if (programmer_init(pparam)) {
|
if (programmer_init(prog, pparam)) {
|
||||||
fprintf(stderr, "Error: Programmer initialization failed.\n");
|
fprintf(stderr, "Error: Programmer initialization failed.\n");
|
||||||
ret = 1;
|
ret = 1;
|
||||||
goto out_shutdown;
|
goto out_shutdown;
|
||||||
|
76
flashrom.c
76
flashrom.c
@ -42,73 +42,7 @@ const char flashrom_version[] = FLASHROM_VERSION;
|
|||||||
char *chip_to_probe = NULL;
|
char *chip_to_probe = NULL;
|
||||||
int verbose = 0;
|
int verbose = 0;
|
||||||
|
|
||||||
#if CONFIG_INTERNAL == 1
|
static enum programmer programmer = PROGRAMMER_INVALID;
|
||||||
enum programmer programmer = PROGRAMMER_INTERNAL;
|
|
||||||
#elif CONFIG_DUMMY == 1
|
|
||||||
enum programmer programmer = PROGRAMMER_DUMMY;
|
|
||||||
#else
|
|
||||||
/* If neither internal nor dummy are selected, we must pick a sensible default.
|
|
||||||
* Since there is no reason to prefer a particular external programmer, we fail
|
|
||||||
* if more than one of them is selected. If only one is selected, it is clear
|
|
||||||
* that the user wants that one to become the default.
|
|
||||||
*/
|
|
||||||
#if CONFIG_NIC3COM+CONFIG_NICREALTEK+CONFIG_NICNATSEMI+CONFIG_GFXNVIDIA+CONFIG_DRKAISER+CONFIG_SATASII+CONFIG_ATAHPT+CONFIG_FT2232_SPI+CONFIG_SERPROG+CONFIG_BUSPIRATE_SPI+CONFIG_DEDIPROG+CONFIG_RAYER_SPI+CONFIG_NICINTEL+CONFIG_NICINTEL_SPI+CONFIG_OGP_SPI+CONFIG_SATAMV > 1
|
|
||||||
#error Please enable either CONFIG_DUMMY or CONFIG_INTERNAL or disable support for all programmers except one.
|
|
||||||
#endif
|
|
||||||
enum programmer programmer =
|
|
||||||
#if CONFIG_NIC3COM == 1
|
|
||||||
PROGRAMMER_NIC3COM
|
|
||||||
#endif
|
|
||||||
#if CONFIG_NICREALTEK == 1
|
|
||||||
PROGRAMMER_NICREALTEK
|
|
||||||
#endif
|
|
||||||
#if CONFIG_NICNATSEMI == 1
|
|
||||||
PROGRAMMER_NICNATSEMI
|
|
||||||
#endif
|
|
||||||
#if CONFIG_GFXNVIDIA == 1
|
|
||||||
PROGRAMMER_GFXNVIDIA
|
|
||||||
#endif
|
|
||||||
#if CONFIG_DRKAISER == 1
|
|
||||||
PROGRAMMER_DRKAISER
|
|
||||||
#endif
|
|
||||||
#if CONFIG_SATASII == 1
|
|
||||||
PROGRAMMER_SATASII
|
|
||||||
#endif
|
|
||||||
#if CONFIG_ATAHPT == 1
|
|
||||||
PROGRAMMER_ATAHPT
|
|
||||||
#endif
|
|
||||||
#if CONFIG_FT2232_SPI == 1
|
|
||||||
PROGRAMMER_FT2232_SPI
|
|
||||||
#endif
|
|
||||||
#if CONFIG_SERPROG == 1
|
|
||||||
PROGRAMMER_SERPROG
|
|
||||||
#endif
|
|
||||||
#if CONFIG_BUSPIRATE_SPI == 1
|
|
||||||
PROGRAMMER_BUSPIRATE_SPI
|
|
||||||
#endif
|
|
||||||
#if CONFIG_DEDIPROG == 1
|
|
||||||
PROGRAMMER_DEDIPROG
|
|
||||||
#endif
|
|
||||||
#if CONFIG_RAYER_SPI == 1
|
|
||||||
PROGRAMMER_RAYER_SPI
|
|
||||||
#endif
|
|
||||||
#if CONFIG_NICINTEL == 1
|
|
||||||
PROGRAMMER_NICINTEL
|
|
||||||
#endif
|
|
||||||
#if CONFIG_NICINTEL_SPI == 1
|
|
||||||
PROGRAMMER_NICINTEL_SPI
|
|
||||||
#endif
|
|
||||||
#if CONFIG_OGP_SPI == 1
|
|
||||||
PROGRAMMER_OGP_SPI
|
|
||||||
#endif
|
|
||||||
#if CONFIG_SATAMV == 1
|
|
||||||
PROGRAMMER_SATAMV
|
|
||||||
#endif
|
|
||||||
#if CONFIG_LINUX_SPI == 1
|
|
||||||
PROGRAMMER_LINUX_SPI
|
|
||||||
#endif
|
|
||||||
;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static char *programmer_param = NULL;
|
static char *programmer_param = NULL;
|
||||||
|
|
||||||
@ -515,9 +449,15 @@ int register_shutdown(int (*function) (void *data), void *data)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int programmer_init(char *param)
|
int programmer_init(enum programmer prog, char *param)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (prog >= PROGRAMMER_INVALID) {
|
||||||
|
msg_perr("Invalid programmer specified!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
programmer = prog;
|
||||||
/* Initialize all programmer specific data. */
|
/* Initialize all programmer specific data. */
|
||||||
/* Default to unlimited decode sizes. */
|
/* Default to unlimited decode sizes. */
|
||||||
max_rom_decode = (const struct decode_sizes) {
|
max_rom_decode = (const struct decode_sizes) {
|
||||||
|
@ -129,10 +129,8 @@ static uint16_t it87spi_probe(uint16_t port)
|
|||||||
enter_conf_mode_ite(port);
|
enter_conf_mode_ite(port);
|
||||||
/* NOLDN, reg 0x24, mask out lowest bit (suspend) */
|
/* NOLDN, reg 0x24, mask out lowest bit (suspend) */
|
||||||
tmp = sio_read(port, 0x24) & 0xFE;
|
tmp = sio_read(port, 0x24) & 0xFE;
|
||||||
/* If IT87SPI was not explicitly selected, we want to check
|
/* Check if LPC->SPI translation is active. */
|
||||||
* quickly if LPC->SPI translation is active.
|
if (!(tmp & 0x0e)) {
|
||||||
*/
|
|
||||||
if ((programmer == PROGRAMMER_INTERNAL) && !(tmp & (0x0E))) {
|
|
||||||
msg_pdbg("No IT87* serial flash segment enabled.\n");
|
msg_pdbg("No IT87* serial flash segment enabled.\n");
|
||||||
exit_conf_mode_ite(port);
|
exit_conf_mode_ite(port);
|
||||||
/* Nothing to do. */
|
/* Nothing to do. */
|
||||||
|
@ -85,8 +85,6 @@ enum programmer {
|
|||||||
PROGRAMMER_INVALID /* This must always be the last entry. */
|
PROGRAMMER_INVALID /* This must always be the last entry. */
|
||||||
};
|
};
|
||||||
|
|
||||||
extern enum programmer programmer;
|
|
||||||
|
|
||||||
struct programmer_entry {
|
struct programmer_entry {
|
||||||
const char *vendor;
|
const char *vendor;
|
||||||
const char *name;
|
const char *name;
|
||||||
@ -110,7 +108,7 @@ struct programmer_entry {
|
|||||||
|
|
||||||
extern const struct programmer_entry programmer_table[];
|
extern const struct programmer_entry programmer_table[];
|
||||||
|
|
||||||
int programmer_init(char *param);
|
int programmer_init(enum programmer prog, char *param);
|
||||||
int programmer_shutdown(void);
|
int programmer_shutdown(void);
|
||||||
|
|
||||||
enum bitbang_spi_master_type {
|
enum bitbang_spi_master_type {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user