Author: hailfinger
Date: Thu Sep  8 02:00:29 2011
New Revision: 1433
URL: http://flashrom.org/trac/flashrom/changeset/1433

Log:
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.

Signed-off-by: Carl-Daniel Hailfinger <[email protected]>
Acked-by: Stefan Tauner <[email protected]>

Modified:
   trunk/cli_classic.c
   trunk/flashrom.c
   trunk/it87spi.c
   trunk/programmer.h

Modified: trunk/cli_classic.c
==============================================================================
--- trunk/cli_classic.c Wed Sep  7 22:48:34 2011        (r1432)
+++ trunk/cli_classic.c Thu Sep  8 02:00:29 2011        (r1433)
@@ -31,6 +31,74 @@
 #include "flashchips.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)
 {
        printf("Usage: flashrom [-n] [-V] [-f] [-h|-R|-L|"
@@ -111,6 +179,7 @@
 #endif
        int read_it = 0, write_it = 0, erase_it = 0, verify_it = 0;
        int dont_verify_it = 0, list_supported = 0, operation_specified = 0;
+       enum programmer prog = PROGRAMMER_INVALID;
        int ret = 0;
 
        static const char optstring[] = "r:Rw:v:nVEfc:m:l:i:p:Lzh";
@@ -258,8 +327,16 @@
 #endif
                        break;
                case 'p':
-                       for (programmer = 0; programmer < PROGRAMMER_INVALID; 
programmer++) {
-                               name = programmer_table[programmer].name;
+                       if (prog != PROGRAMMER_INVALID) {
+                               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);
                                if (strncmp(optarg, name, namelen) == 0) {
                                        switch (optarg[namelen]) {
@@ -283,7 +360,7 @@
                                        break;
                                }
                        }
-                       if (programmer == PROGRAMMER_INVALID) {
+                       if (prog == PROGRAMMER_INVALID) {
                                fprintf(stderr, "Error: Unknown programmer "
                                        "%s.\n", optarg);
                                cli_classic_abort_usage();
@@ -332,14 +409,6 @@
        }
 #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) {
                for (flash = flashchips; flash && flash->name; flash++)
                        if (!strcmp(flash->name, chip_to_probe))
@@ -355,10 +424,21 @@
                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. */
        myusec_calibrate_delay();
 
-       if (programmer_init(pparam)) {
+       if (programmer_init(prog, pparam)) {
                fprintf(stderr, "Error: Programmer initialization failed.\n");
                ret = 1;
                goto out_shutdown;

Modified: trunk/flashrom.c
==============================================================================
--- trunk/flashrom.c    Wed Sep  7 22:48:34 2011        (r1432)
+++ trunk/flashrom.c    Thu Sep  8 02:00:29 2011        (r1433)
@@ -42,73 +42,7 @@
 char *chip_to_probe = NULL;
 int verbose = 0;
 
-#if CONFIG_INTERNAL == 1
-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 enum programmer programmer = PROGRAMMER_INVALID;
 
 static char *programmer_param = NULL;
 
@@ -515,9 +449,15 @@
        return 0;
 }
 
-int programmer_init(char *param)
+int programmer_init(enum programmer prog, char *param)
 {
        int ret;
+
+       if (prog >= PROGRAMMER_INVALID) {
+               msg_perr("Invalid programmer specified!\n");
+               return -1;
+       }
+       programmer = prog;
        /* Initialize all programmer specific data. */
        /* Default to unlimited decode sizes. */
        max_rom_decode = (const struct decode_sizes) {

Modified: trunk/it87spi.c
==============================================================================
--- trunk/it87spi.c     Wed Sep  7 22:48:34 2011        (r1432)
+++ trunk/it87spi.c     Thu Sep  8 02:00:29 2011        (r1433)
@@ -129,10 +129,8 @@
        enter_conf_mode_ite(port);
        /* NOLDN, reg 0x24, mask out lowest bit (suspend) */
        tmp = sio_read(port, 0x24) & 0xFE;
-       /* If IT87SPI was not explicitly selected, we want to check
-        * quickly if LPC->SPI translation is active.
-        */
-       if ((programmer == PROGRAMMER_INTERNAL) && !(tmp & (0x0E))) {
+       /* Check if LPC->SPI translation is active. */
+       if (!(tmp & 0x0e)) {
                msg_pdbg("No IT87* serial flash segment enabled.\n");
                exit_conf_mode_ite(port);
                /* Nothing to do. */

Modified: trunk/programmer.h
==============================================================================
--- trunk/programmer.h  Wed Sep  7 22:48:34 2011        (r1432)
+++ trunk/programmer.h  Thu Sep  8 02:00:29 2011        (r1433)
@@ -85,8 +85,6 @@
        PROGRAMMER_INVALID /* This must always be the last entry. */
 };
 
-extern enum programmer programmer;
-
 struct programmer_entry {
        const char *vendor;
        const char *name;
@@ -110,7 +108,7 @@
 
 extern const struct programmer_entry programmer_table[];
 
-int programmer_init(char *param);
+int programmer_init(enum programmer prog, char *param);
 int programmer_shutdown(void);
 
 enum bitbang_spi_master_type {

_______________________________________________
flashrom mailing list
[email protected]
http://www.flashrom.org/mailman/listinfo/flashrom

Reply via email to