Changeset 1475


Ignore:
Timestamp:
12/20/11 01:19:29 (5 months ago)
Author:
hailfinger
Message:

Have all programmer init functions register bus masters/programmers

All programmer types (Parallel, SPI, Opaque) now register themselves
into a generic programmer list and probing is now programmer-centric
instead of chip-centric.
Registering multiple SPI/... masters at the same time is now possible
without any problems. Handling multiple flash chips is still unchanged,
but now we have the infrastructure to deal with "dual BIOS" and "one
flash behind southbridge and one flash behind EC" sanely.

A nice side effect is that this patch kills quite a few global variables
and improves the situation for libflashrom.

Hint for developers:
struct {spi,par,opaque}_programmer now have a void *data pointer to
store any additional programmer-specific data, e.g. hardware
configuration info.

Note:
flashrom -f -c FOO -r forced_read.bin
does not work anymore. We have to find an architecturally clean way to
solve this.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@…>
Acked-by: Michael Karcher <flashrom@…>

Location:
trunk
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/bitbang_spi.c

    r1474 r1475  
    2626#include "spi.h" 
    2727 
    28 /* Length of half a clock period in usecs. */ 
    29 static int bitbang_spi_half_period; 
    30  
    31 static const struct bitbang_spi_master *bitbang_spi_master = NULL; 
    32  
    3328/* Note that CS# is active low, so val=0 means the chip is active. */ 
    34 static void bitbang_spi_set_cs(int val) 
     29static void bitbang_spi_set_cs(const const struct bitbang_spi_master *master, int val) 
    3530{ 
    36         bitbang_spi_master->set_cs(val); 
     31        master->set_cs(val); 
    3732} 
    3833 
    39 static void bitbang_spi_set_sck(int val) 
     34static void bitbang_spi_set_sck(const const struct bitbang_spi_master *master, int val) 
    4035{ 
    41         bitbang_spi_master->set_sck(val); 
     36        master->set_sck(val); 
    4237} 
    4338 
    44 static void bitbang_spi_set_mosi(int val) 
     39static void bitbang_spi_set_mosi(const const struct bitbang_spi_master *master, int val) 
    4540{ 
    46         bitbang_spi_master->set_mosi(val); 
     41        master->set_mosi(val); 
    4742} 
    4843 
    49 static int bitbang_spi_get_miso(void) 
     44static int bitbang_spi_get_miso(const const struct bitbang_spi_master *master) 
    5045{ 
    51         return bitbang_spi_master->get_miso(); 
     46        return master->get_miso(); 
    5247} 
    5348 
    54 static void bitbang_spi_request_bus(void) 
     49static void bitbang_spi_request_bus(const const struct bitbang_spi_master *master) 
    5550{ 
    56         if (bitbang_spi_master->request_bus) 
    57                 bitbang_spi_master->request_bus(); 
     51        if (master->request_bus) 
     52                master->request_bus(); 
    5853} 
    5954 
    60 static void bitbang_spi_release_bus(void) 
     55static void bitbang_spi_release_bus(const const struct bitbang_spi_master *master) 
    6156{ 
    62         if (bitbang_spi_master->release_bus) 
    63                 bitbang_spi_master->release_bus(); 
     57        if (master->release_bus) 
     58                master->release_bus(); 
    6459} 
    6560 
     
    7974}; 
    8075 
    81 int bitbang_spi_init(const struct bitbang_spi_master *master, int halfperiod) 
     76#if 0 // until it is needed 
     77static int bitbang_spi_shutdown(const struct bitbang_spi_master *master) 
    8278{ 
     79        /* FIXME: Run bitbang_spi_release_bus here or per command? */ 
     80        return 0; 
     81} 
     82#endif 
     83 
     84int bitbang_spi_init(const struct bitbang_spi_master *master) 
     85{ 
     86        struct spi_programmer pgm = spi_programmer_bitbang; 
    8387        /* BITBANG_SPI_INVALID is 0, so if someone forgot to initialize ->type, 
    8488         * we catch it here. Same goes for missing initialization of bitbanging 
     
    8690         */ 
    8791        if (!master || master->type == BITBANG_SPI_INVALID || !master->set_cs || 
    88             !master->set_sck || !master->set_mosi || !master->get_miso) { 
     92            !master->set_sck || !master->set_mosi || !master->get_miso || 
     93            (master->request_bus && !master->release_bus) || 
     94            (!master->request_bus && master->release_bus)) { 
    8995                msg_perr("Incomplete SPI bitbang master setting!\n" 
    9096                         "Please report a bug at flashrom@flashrom.org\n"); 
    91                 return 1; 
    92         } 
    93         if (bitbang_spi_master) { 
    94                 msg_perr("SPI bitbang master already initialized!\n" 
    95                          "Please report a bug at flashrom@flashrom.org\n"); 
    96                 return 1; 
     97                return ERROR_FLASHROM_BUG; 
    9798        } 
    9899 
    99         bitbang_spi_master = master; 
    100         bitbang_spi_half_period = halfperiod; 
     100        pgm.data = master; 
     101        register_spi_programmer(&pgm); 
    101102 
    102         register_spi_programmer(&spi_programmer_bitbang); 
    103  
    104         /* FIXME: Run bitbang_spi_request_bus here or in programmer init? */ 
    105         bitbang_spi_set_cs(1); 
    106         bitbang_spi_set_sck(0); 
    107         bitbang_spi_set_mosi(0); 
     103        /* Only mess with the bus if we're sure nobody else uses it. */ 
     104        bitbang_spi_request_bus(master); 
     105        bitbang_spi_set_cs(master, 1); 
     106        bitbang_spi_set_sck(master, 0); 
     107        bitbang_spi_set_mosi(master, 0); 
     108        /* FIXME: Release SPI bus here and request it again for each command or 
     109         * don't release it now and only release it on programmer shutdown? 
     110         */ 
     111        bitbang_spi_release_bus(master); 
    108112        return 0; 
    109113} 
    110114 
    111 int bitbang_spi_shutdown(const struct bitbang_spi_master *master) 
    112 { 
    113         if (!bitbang_spi_master) { 
    114                 msg_perr("Shutting down an uninitialized SPI bitbang master!\n" 
    115                          "Please report a bug at flashrom@flashrom.org\n"); 
    116                 return 1; 
    117         } 
    118         if (master != bitbang_spi_master) { 
    119                 msg_perr("Shutting down a mismatched SPI bitbang master!\n" 
    120                          "Please report a bug at flashrom@flashrom.org\n"); 
    121                 return 1; 
    122         } 
    123  
    124         /* FIXME: Run bitbang_spi_release_bus here or per command? */ 
    125         bitbang_spi_master = NULL; 
    126         return 0; 
    127 } 
    128  
    129 static uint8_t bitbang_spi_readwrite_byte(uint8_t val) 
     115static uint8_t bitbang_spi_rw_byte(const struct bitbang_spi_master *master, 
     116                                   uint8_t val) 
    130117{ 
    131118        uint8_t ret = 0; 
     
    133120 
    134121        for (i = 7; i >= 0; i--) { 
    135                 bitbang_spi_set_mosi((val >> i) & 1); 
    136                 programmer_delay(bitbang_spi_half_period); 
    137                 bitbang_spi_set_sck(1); 
     122                bitbang_spi_set_mosi(master, (val >> i) & 1); 
     123                programmer_delay(master->half_period); 
     124                bitbang_spi_set_sck(master, 1); 
    138125                ret <<= 1; 
    139                 ret |= bitbang_spi_get_miso(); 
    140                 programmer_delay(bitbang_spi_half_period); 
    141                 bitbang_spi_set_sck(0); 
     126                ret |= bitbang_spi_get_miso(master); 
     127                programmer_delay(master->half_period); 
     128                bitbang_spi_set_sck(master, 0); 
    142129        } 
    143130        return ret; 
     
    150137{ 
    151138        int i; 
     139        const struct bitbang_spi_master *master = flash->pgm->spi.data; 
    152140 
    153141        /* FIXME: Run bitbang_spi_request_bus here or in programmer init? 
     
    155143         * programmer to use its own SPI engine for native accesses. 
    156144         */ 
    157         bitbang_spi_request_bus(); 
    158         bitbang_spi_set_cs(0); 
     145        bitbang_spi_request_bus(master); 
     146        bitbang_spi_set_cs(master, 0); 
    159147        for (i = 0; i < writecnt; i++) 
    160                 bitbang_spi_readwrite_byte(writearr[i]); 
     148                bitbang_spi_rw_byte(master, writearr[i]); 
    161149        for (i = 0; i < readcnt; i++) 
    162                 readarr[i] = bitbang_spi_readwrite_byte(0); 
     150                readarr[i] = bitbang_spi_rw_byte(master, 0); 
    163151 
    164         programmer_delay(bitbang_spi_half_period); 
    165         bitbang_spi_set_cs(1); 
    166         programmer_delay(bitbang_spi_half_period); 
     152        programmer_delay(master->half_period); 
     153        bitbang_spi_set_cs(master, 1); 
     154        programmer_delay(master->half_period); 
    167155        /* FIXME: Run bitbang_spi_release_bus here or in programmer init? */ 
    168         bitbang_spi_release_bus(); 
     156        bitbang_spi_release_bus(master); 
    169157 
    170158        return 0; 
  • trunk/cli_classic.c

    r1473 r1475  
    173173        struct flashctx *fill_flash; 
    174174        const char *name; 
    175         int namelen, opt, i; 
     175        int namelen, opt, i, j; 
    176176        int startchip = 0, chipcount = 0, option_index = 0, force = 0; 
    177177#if CONFIG_PRINT_WIKI == 1 
     
    445445                goto out_shutdown; 
    446446        } 
    447         tempstr = flashbuses_to_text(buses_supported); 
    448         msg_pdbg("This programmer supports the following protocols: %s.\n", 
     447        tempstr = flashbuses_to_text(get_buses_supported()); 
     448        msg_pdbg("The following protocols are supported: %s.\n", 
    449449                 tempstr); 
    450450        free(tempstr); 
    451451 
    452         for (i = 0; i < ARRAY_SIZE(flashes); i++) { 
    453                 startchip = probe_flash(startchip, &flashes[i], 0); 
    454                 if (startchip == -1) 
    455                         break; 
    456                 chipcount++; 
    457                 startchip++; 
     452        for (j = 0; j < registered_programmer_count; j++) { 
     453                startchip = 0; 
     454                for (i = 0; i < ARRAY_SIZE(flashes); i++) { 
     455                        startchip = probe_flash(&registered_programmers[j], 
     456                                                startchip, &flashes[i], 0); 
     457                        if (startchip == -1) 
     458                                break; 
     459                        chipcount++; 
     460                        startchip++; 
     461                } 
    458462        } 
    459463 
     
    473477                               "chip isn't found automatically.\n"); 
    474478                } 
     479#if 0 // FIXME: What happens for a forced chip read if multiple compatible programmers are registered? 
    475480                if (force && read_it && chip_to_probe) { 
    476481                        printf("Force read (-f -r -c) requested, pretending " 
     
    487492                        return read_flash_to_file(&flashes[0], filename); 
    488493                } 
     494#endif 
    489495                ret = 1; 
    490496                goto out_shutdown; 
     
    503509 
    504510        size = fill_flash->total_size * 1024; 
    505         if (check_max_decode((buses_supported & fill_flash->bustype), size) && 
     511        if (check_max_decode(fill_flash->pgm->buses_supported & fill_flash->bustype, size) && 
    506512            (!force)) { 
    507513                fprintf(stderr, "Chip is too big for this programmer " 
  • trunk/flash.h

    r1474 r1475  
    172172        /* Some flash devices have an additional register space. */ 
    173173        chipaddr virtual_registers; 
     174        struct registered_programmer *pgm; 
    174175}; 
    175176 
     
    225226        write_gran_256bytes, 
    226227}; 
    227 extern enum chipbustype buses_supported; 
    228228extern int verbose; 
    229229extern const char flashrom_version[]; 
     
    232232int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len); 
    233233int erase_flash(struct flashctx *flash); 
    234 int probe_flash(int startchip, struct flashctx *fill_flash, int force); 
     234int probe_flash(struct registered_programmer *pgm, int startchip, struct flashctx *fill_flash, int force); 
    235235int read_flash_to_file(struct flashctx *flash, const char *filename); 
    236236int min(int a, int b); 
     
    257257/* Something happened that shouldn't happen, we'll abort. */ 
    258258#define ERROR_FATAL -0xee 
     259#define ERROR_FLASHROM_BUG -200 
     260/* We reached one of the hardcoded limits of flashrom. This can be fixed by 
     261 * increasing the limit of a compile-time allocation or by switching to dynamic 
     262 * allocation. 
     263 * Note: If this warning is triggered, check first for runaway registrations. 
     264 */ 
     265#define ERROR_FLASHROM_LIMIT -201 
    259266 
    260267/* cli_output.c */ 
     
    298305uint32_t spi_get_valid_read_addr(struct flashctx *flash); 
    299306 
     307enum chipbustype get_buses_supported(void); 
    300308#endif                          /* !__FLASH_H__ */ 
  • trunk/flashrom.c

    r1474 r1475  
    4747static char *programmer_param = NULL; 
    4848 
    49 /* Supported buses for the current programmer. */ 
    50 enum chipbustype buses_supported; 
    51  
    5249/* 
    5350 * Programmers supporting multiple buses can have differing size limits on 
     
    315312                .spi            = 0xffffffff, 
    316313        }; 
    317         buses_supported = BUS_NONE; 
    318314        /* Default to top aligned flash at 4 GB. */ 
    319315        flashbase = 0; 
     
    362358void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr) 
    363359{ 
    364         par_programmer->chip_writeb(flash, val, addr); 
     360        flash->pgm->par.chip_writeb(flash, val, addr); 
    365361} 
    366362 
    367363void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr) 
    368364{ 
    369         par_programmer->chip_writew(flash, val, addr); 
     365        flash->pgm->par.chip_writew(flash, val, addr); 
    370366} 
    371367 
    372368void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr) 
    373369{ 
    374         par_programmer->chip_writel(flash, val, addr); 
     370        flash->pgm->par.chip_writel(flash, val, addr); 
    375371} 
    376372 
     
    378374                 size_t len) 
    379375{ 
    380         par_programmer->chip_writen(flash, buf, addr, len); 
     376        flash->pgm->par.chip_writen(flash, buf, addr, len); 
    381377} 
    382378 
    383379uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr) 
    384380{ 
    385         return par_programmer->chip_readb(flash, addr); 
     381        return flash->pgm->par.chip_readb(flash, addr); 
    386382} 
    387383 
    388384uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr) 
    389385{ 
    390         return par_programmer->chip_readw(flash, addr); 
     386        return flash->pgm->par.chip_readw(flash, addr); 
    391387} 
    392388 
    393389uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr) 
    394390{ 
    395         return par_programmer->chip_readl(flash, addr); 
     391        return flash->pgm->par.chip_readl(flash, addr); 
    396392} 
    397393 
     
    399395                size_t len) 
    400396{ 
    401         par_programmer->chip_readn(flash, buf, addr, len); 
     397        flash->pgm->par.chip_readn(flash, buf, addr, len); 
    402398} 
    403399 
     
    943939} 
    944940 
    945 int probe_flash(int startchip, struct flashctx *fill_flash, int force) 
     941int probe_flash(struct registered_programmer *pgm, int startchip, 
     942                struct flashctx *fill_flash, int force) 
    946943{ 
    947944        const struct flashchip *flash; 
     
    955952                if (chip_to_probe && strcmp(flash->name, chip_to_probe) != 0) 
    956953                        continue; 
    957                 buses_common = buses_supported & flash->bustype; 
    958                 if (!buses_common) { 
    959                         msg_gspew("Probing for %s %s, %d kB: skipped. ", 
    960                                  flash->vendor, flash->name, flash->total_size); 
    961                         tmp = flashbuses_to_text(buses_supported); 
    962                         msg_gspew("Host bus type %s ", tmp); 
    963                         free(tmp); 
    964                         tmp = flashbuses_to_text(flash->bustype); 
    965                         msg_gspew("and chip bus type %s are incompatible.", 
    966                                   tmp); 
    967                         free(tmp); 
    968                         msg_gspew("\n"); 
     954                buses_common = pgm->buses_supported & flash->bustype; 
     955                if (!buses_common) 
    969956                        continue; 
    970                 } 
    971957                msg_gdbg("Probing for %s %s, %d kB: ", 
    972958                             flash->vendor, flash->name, flash->total_size); 
     
    982968                /* Start filling in the dynamic data. */ 
    983969                memcpy(fill_flash, flash, sizeof(struct flashchip)); 
     970                fill_flash->pgm = pgm; 
    984971 
    985972                base = flashbase ? flashbase : (0xffffffff - size + 1); 
  • trunk/ichspi.c

    r1474 r1475  
    636636/* Read len bytes from the fdata/spid register into the data array. 
    637637 * 
    638  * Note that using len > spi_programmer->max_data_read will return garbage or 
     638 * Note that using len > flash->pgm->spi.max_data_read will return garbage or 
    639639 * may even crash. 
    640640 */ 
     
    654654/* Fill len bytes from the data array into the fdata/spid registers. 
    655655 * 
    656  * Note that using len > spi_programmer->max_data_write will trash the registers 
     656 * Note that using len > flash->pgm->spi.max_data_write will trash the registers 
    657657 * following the data registers. 
    658658 */ 
     
    961961{ 
    962962        /* max_data_read == max_data_write for all Intel/VIA SPI masters */ 
    963         uint8_t maxlength = spi_programmer->max_data_read; 
    964  
    965         if (spi_programmer->type == SPI_CONTROLLER_NONE) { 
     963        uint8_t maxlength = flash->pgm->spi.max_data_read; 
     964 
     965        if (ich_generation == CHIPSET_ICH_UNKNOWN) { 
    966966                msg_perr("%s: unsupported chipset\n", __func__); 
    967967                return -1; 
     
    12981298 
    12991299        while (len > 0) { 
    1300                 block_len = min(len, opaque_programmer->max_data_read); 
     1300                block_len = min(len, flash->pgm->opaque.max_data_read); 
    13011301                ich_hwseq_set_addr(addr); 
    13021302                hsfc = REGREAD16(ICH9_REG_HSFC); 
     
    13371337        while (len > 0) { 
    13381338                ich_hwseq_set_addr(addr); 
    1339                 block_len = min(len, opaque_programmer->max_data_write); 
     1339                block_len = min(len, flash->pgm->opaque.max_data_write); 
    13401340                ich_fill_data(buf, block_len, ICH9_REG_FDATA0); 
    13411341                hsfc = REGREAD16(ICH9_REG_HSFC); 
  • trunk/mcp6x_spi.c

    r1299 r1475  
    9999        .request_bus = mcp6x_request_spibus, 
    100100        .release_bus = mcp6x_release_spibus, 
     101        .half_period = 0, 
    101102}; 
    102103 
     
    160161        mcp_gpiostate = status & 0xff; 
    161162 
    162         /* Zero halfperiod delay. */ 
    163         if (bitbang_spi_init(&bitbang_spi_master_mcp6x, 0)) { 
     163        if (bitbang_spi_init(&bitbang_spi_master_mcp6x)) { 
    164164                /* This should never happen. */ 
    165165                msg_perr("MCP6X bitbang SPI master init failed!\n"); 
  • trunk/nicintel_spi.c

    r1338 r1475  
    138138        .request_bus = nicintel_request_spibus, 
    139139        .release_bus = nicintel_release_spibus, 
     140        .half_period = 1, 
    140141}; 
    141142 
     
    182183                return 1; 
    183184 
    184         /* 1 usec halfperiod delay for now. */ 
    185         if (bitbang_spi_init(&bitbang_spi_master_nicintel, 1)) 
     185        if (bitbang_spi_init(&bitbang_spi_master_nicintel)) 
    186186                return 1; 
    187187 
  • trunk/ogp_spi.c

    r1338 r1475  
    9292        .request_bus = ogp_request_spibus, 
    9393        .release_bus = ogp_release_spibus, 
     94        .half_period = 0, 
    9495}; 
    9596 
     
    137138                return 1; 
    138139 
    139         /* no delay for now. */ 
    140         if (bitbang_spi_init(&bitbang_spi_master_ogp, 0)) 
     140        if (bitbang_spi_init(&bitbang_spi_master_ogp)) 
    141141                return 1; 
    142142 
  • trunk/opaque.c

    r1473 r1475  
    3131#include "programmer.h" 
    3232 
    33 const struct opaque_programmer opaque_programmer_none = { 
    34         .max_data_read = MAX_DATA_UNSPECIFIED, 
    35         .max_data_write = MAX_DATA_UNSPECIFIED, 
    36         .probe = NULL, 
    37         .read = NULL, 
    38         .write = NULL, 
    39         .erase = NULL, 
    40 }; 
    41  
    42 const struct opaque_programmer *opaque_programmer = &opaque_programmer_none; 
    43  
    4433int probe_opaque(struct flashctx *flash) 
    4534{ 
    46         if (!opaque_programmer->probe) { 
    47                 msg_perr("%s called before register_opaque_programmer. " 
    48                          "Please report a bug at flashrom@flashrom.org\n", 
    49                          __func__); 
    50                 return 0; 
    51         } 
    52  
    53         return opaque_programmer->probe(flash); 
     35        return flash->pgm->opaque.probe(flash); 
    5436} 
    5537 
    5638int read_opaque(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len) 
    5739{ 
    58         if (!opaque_programmer->read) { 
    59                 msg_perr("%s called before register_opaque_programmer. " 
    60                          "Please report a bug at flashrom@flashrom.org\n", 
    61                          __func__); 
    62                 return 1; 
    63         } 
    64         return opaque_programmer->read(flash, buf, start, len); 
     40        return flash->pgm->opaque.read(flash, buf, start, len); 
    6541} 
    6642 
    6743int write_opaque(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len) 
    6844{ 
    69         if (!opaque_programmer->write) { 
    70                 msg_perr("%s called before register_opaque_programmer. " 
    71                          "Please report a bug at flashrom@flashrom.org\n", 
    72                          __func__); 
    73                 return 1; 
    74         } 
    75         return opaque_programmer->write(flash, buf, start, len); 
     45        return flash->pgm->opaque.write(flash, buf, start, len); 
    7646} 
    7747 
    7848int erase_opaque(struct flashctx *flash, unsigned int blockaddr, unsigned int blocklen) 
    7949{ 
    80         if (!opaque_programmer->erase) { 
    81                 msg_perr("%s called before register_opaque_programmer. " 
     50        return flash->pgm->opaque.erase(flash, blockaddr, blocklen); 
     51} 
     52 
     53int register_opaque_programmer(const struct opaque_programmer *pgm) 
     54{ 
     55        struct registered_programmer rpgm; 
     56 
     57        if (!pgm->probe || !pgm->read || !pgm->write || !pgm->erase) { 
     58                msg_perr("%s called with incomplete programmer definition. " 
    8259                         "Please report a bug at flashrom@flashrom.org\n", 
    8360                         __func__); 
    84                 return 1; 
     61                return ERROR_FLASHROM_BUG; 
    8562        } 
    86         return opaque_programmer->erase(flash, blockaddr, blocklen); 
     63        rpgm.buses_supported = BUS_PROG; 
     64        rpgm.opaque = *pgm; 
     65        return register_programmer(&rpgm); 
    8766} 
    88  
    89 void register_opaque_programmer(const struct opaque_programmer *pgm) 
    90 { 
    91         if (!pgm->probe || !pgm->read || !pgm->write || !pgm->erase) { 
    92                 msg_perr("%s called with one of probe/read/write/erase being " 
    93                          "NULL. Please report a bug at flashrom@flashrom.org\n", 
    94                          __func__); 
    95                 return; 
    96         } 
    97         opaque_programmer = pgm; 
    98         buses_supported |= BUS_PROG; 
    99 } 
  • trunk/programmer.c

    r1474 r1475  
    2222#include "programmer.h" 
    2323 
    24 static const struct par_programmer par_programmer_none = { 
    25                 .chip_readb             = noop_chip_readb, 
    26                 .chip_readw             = fallback_chip_readw, 
    27                 .chip_readl             = fallback_chip_readl, 
    28                 .chip_readn             = fallback_chip_readn, 
    29                 .chip_writeb            = noop_chip_writeb, 
    30                 .chip_writew            = fallback_chip_writew, 
    31                 .chip_writel            = fallback_chip_writel, 
    32                 .chip_writen            = fallback_chip_writen, 
    33 }; 
    34  
    35 const struct par_programmer *par_programmer = &par_programmer_none; 
    36  
    3724/* No-op shutdown() for programmers which don't need special handling */ 
    3825int noop_shutdown(void) 
     
    5340} 
    5441 
    55 /* No-op chip_writeb() for drivers not supporting addr/data pair accesses */ 
    56 uint8_t noop_chip_readb(const struct flashctx *flash, const chipaddr addr) 
    57 { 
    58         return 0xff; 
    59 } 
    60  
    61 /* No-op chip_writeb() for drivers not supporting addr/data pair accesses */ 
     42/* No-op chip_writeb() for parallel style drivers not supporting writes */ 
    6243void noop_chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr) 
    6344{ 
     
    11697} 
    11798 
    118 void register_par_programmer(const struct par_programmer *pgm, const enum chipbustype buses) 
     99int register_par_programmer(const struct par_programmer *pgm, 
     100                            const enum chipbustype buses) 
    119101{ 
    120         par_programmer = pgm; 
    121         buses_supported |= buses; 
     102        struct registered_programmer rpgm; 
     103        if (!pgm->chip_writeb || !pgm->chip_writew || !pgm->chip_writel || 
     104            !pgm->chip_writen || !pgm->chip_readb || !pgm->chip_readw || 
     105            !pgm->chip_readl || !pgm->chip_readn) { 
     106                msg_perr("%s called with incomplete programmer definition. " 
     107                         "Please report a bug at flashrom@flashrom.org\n", 
     108                         __func__); 
     109                return ERROR_FLASHROM_BUG; 
     110        } 
     111 
     112        rpgm.buses_supported = buses; 
     113        rpgm.par = *pgm; 
     114        return register_programmer(&rpgm); 
    122115} 
     116 
     117/* The limit of 4 is totally arbitrary. */ 
     118#define PROGRAMMERS_MAX 4 
     119struct registered_programmer registered_programmers[PROGRAMMERS_MAX]; 
     120int registered_programmer_count = 0; 
     121 
     122/* This function copies the struct registered_programmer parameter. */ 
     123int register_programmer(struct registered_programmer *pgm) 
     124{ 
     125        if (registered_programmer_count >= PROGRAMMERS_MAX) { 
     126                msg_perr("Tried to register more than %i programmer " 
     127                         "interfaces.\n", PROGRAMMERS_MAX); 
     128                return ERROR_FLASHROM_LIMIT; 
     129        } 
     130        registered_programmers[registered_programmer_count] = *pgm; 
     131        registered_programmer_count++; 
     132 
     133        return 0; 
     134} 
     135 
     136enum chipbustype get_buses_supported(void) 
     137{ 
     138        int i; 
     139        enum chipbustype ret = BUS_NONE; 
     140 
     141        for (i = 0; i < registered_programmer_count; i++) 
     142                ret |= registered_programmers[i].buses_supported; 
     143 
     144        return ret; 
     145} 
  • trunk/programmer.h

    r1474 r1475  
    134134        void (*request_bus) (void); 
    135135        void (*release_bus) (void); 
     136        /* Length of half a clock period in usecs. */ 
     137        unsigned int half_period; 
    136138}; 
    137139 
     
    209211#if NEED_PCI == 1 
    210212/* pcidev.c */ 
     213// FIXME: These need to be local, not global 
    211214extern uint32_t io_base_addr; 
    212215extern struct pci_access *pacc; 
     
    428431 
    429432/* bitbang_spi.c */ 
    430 int bitbang_spi_init(const struct bitbang_spi_master *master, int halfperiod); 
    431 int bitbang_spi_shutdown(const struct bitbang_spi_master *master); 
     433int bitbang_spi_init(const struct bitbang_spi_master *master); 
    432434 
    433435/* buspirate_spi.c */ 
     
    453455        uint32_t spi; 
    454456}; 
     457// FIXME: These need to be local, not global 
    455458extern struct decode_sizes max_rom_decode; 
    456459extern int programmer_may_write; 
     
    499502#endif 
    500503}; 
    501 extern const int spi_programmer_count; 
    502504 
    503505#define MAX_DATA_UNSPECIFIED 0 
     
    515517        int (*read)(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len); 
    516518        int (*write_256)(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len); 
    517 }; 
    518  
    519 extern const struct spi_programmer *spi_programmer; 
     519        const void *data; 
     520}; 
     521 
    520522int default_spi_send_command(struct flashctx *flash, unsigned int writecnt, unsigned int readcnt, 
    521523                             const unsigned char *writearr, unsigned char *readarr); 
     
    523525int default_spi_read(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len); 
    524526int default_spi_write_256(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len); 
    525 void register_spi_programmer(const struct spi_programmer *programmer); 
     527int register_spi_programmer(const struct spi_programmer *programmer); 
    526528 
    527529/* ichspi.c */ 
     
    571573        int (*write) (struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len); 
    572574        int (*erase) (struct flashctx *flash, unsigned int blockaddr, unsigned int blocklen); 
    573 }; 
    574 extern const struct opaque_programmer *opaque_programmer; 
    575 void register_opaque_programmer(const struct opaque_programmer *pgm); 
     575        const void *data; 
     576}; 
     577int register_opaque_programmer(const struct opaque_programmer *pgm); 
    576578 
    577579/* programmer.c */ 
     
    579581void *fallback_map(const char *descr, unsigned long phys_addr, size_t len); 
    580582void fallback_unmap(void *virt_addr, size_t len); 
    581 uint8_t noop_chip_readb(const struct flashctx *flash, const chipaddr addr); 
    582583void noop_chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr); 
    583584void fallback_chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr); 
     
    596597        uint32_t (*chip_readl) (const struct flashctx *flash, const chipaddr addr); 
    597598        void (*chip_readn) (const struct flashctx *flash, uint8_t *buf, const chipaddr addr, size_t len); 
    598 }; 
    599 extern const struct par_programmer *par_programmer; 
    600 void register_par_programmer(const struct par_programmer *pgm, const enum chipbustype buses); 
     599        const void *data; 
     600}; 
     601int register_par_programmer(const struct par_programmer *pgm, const enum chipbustype buses); 
     602struct registered_programmer { 
     603        enum chipbustype buses_supported; 
     604        union { 
     605                struct par_programmer par; 
     606                struct spi_programmer spi; 
     607                struct opaque_programmer opaque; 
     608        }; 
     609}; 
     610extern struct registered_programmer registered_programmers[]; 
     611extern int registered_programmer_count; 
     612int register_programmer(struct registered_programmer *pgm); 
    601613 
    602614/* serprog.c */ 
  • trunk/rayer_spi.c

    r1454 r1475  
    9393        .set_mosi = rayer_bitbang_set_mosi, 
    9494        .get_miso = rayer_bitbang_get_miso, 
     95        .half_period = 0, 
    9596}; 
    9697 
     
    172173        lpt_outbyte = INB(lpt_iobase); 
    173174 
    174         /* Zero halfperiod delay. */ 
    175         if (bitbang_spi_init(&bitbang_spi_master_rayer, 0)) 
     175        if (bitbang_spi_init(&bitbang_spi_master_rayer)) 
    176176                return 1; 
    177177 
  • trunk/spi.c

    r1474 r1475  
    22 * This file is part of the flashrom project. 
    33 * 
    4  * Copyright (C) 2007, 2008, 2009 Carl-Daniel Hailfinger 
     4 * Copyright (C) 2007, 2008, 2009, 2010, 2011 Carl-Daniel Hailfinger 
    55 * Copyright (C) 2008 coresystems GmbH 
    66 * 
     
    3131#include "spi.h" 
    3232 
    33 const struct spi_programmer spi_programmer_none = { 
    34         .type = SPI_CONTROLLER_NONE, 
    35         .max_data_read = MAX_DATA_UNSPECIFIED, 
    36         .max_data_write = MAX_DATA_UNSPECIFIED, 
    37         .command = NULL, 
    38         .multicommand = NULL, 
    39         .read = NULL, 
    40         .write_256 = NULL, 
    41 }; 
    42  
    43 const struct spi_programmer *spi_programmer = &spi_programmer_none; 
    44  
    4533int spi_send_command(struct flashctx *flash, unsigned int writecnt, 
    4634                     unsigned int readcnt, const unsigned char *writearr, 
    4735                     unsigned char *readarr) 
    4836{ 
    49         if (!spi_programmer->command) { 
    50                 msg_perr("%s called, but SPI is unsupported on this " 
    51                          "hardware. Please report a bug at " 
    52                          "flashrom@flashrom.org\n", __func__); 
    53                 return 1; 
    54         } 
    55  
    56         return spi_programmer->command(flash, writecnt, readcnt, writearr, 
     37        return flash->pgm->spi.command(flash, writecnt, readcnt, writearr, 
    5738                                       readarr); 
    5839} 
     
    6041int spi_send_multicommand(struct flashctx *flash, struct spi_command *cmds) 
    6142{ 
    62         if (!spi_programmer->multicommand) { 
    63                 msg_perr("%s called, but SPI is unsupported on this " 
    64                          "hardware. Please report a bug at " 
    65                          "flashrom@flashrom.org\n", __func__); 
    66                 return 1; 
    67         } 
    68  
    69         return spi_programmer->multicommand(flash, cmds); 
     43        return flash->pgm->spi.multicommand(flash, cmds); 
    7044} 
    7145 
     
    10579                     unsigned int len) 
    10680{ 
    107         unsigned int max_data = spi_programmer->max_data_read; 
     81        unsigned int max_data = flash->pgm->spi.max_data_read; 
    10882        if (max_data == MAX_DATA_UNSPECIFIED) { 
    10983                msg_perr("%s called, but SPI read chunk size not defined " 
     
    11892                          unsigned int start, unsigned int len) 
    11993{ 
    120         unsigned int max_data = spi_programmer->max_data_write; 
     94        unsigned int max_data = flash->pgm->spi.max_data_write; 
    12195        if (max_data == MAX_DATA_UNSPECIFIED) { 
    12296                msg_perr("%s called, but SPI write chunk size not defined " 
     
    132106{ 
    133107        unsigned int addrbase = 0; 
    134         if (!spi_programmer->read) { 
    135                 msg_perr("%s called, but SPI read is unsupported on this " 
    136                          "hardware. Please report a bug at " 
    137                          "flashrom@flashrom.org\n", __func__); 
    138                 return 1; 
    139         } 
    140108 
    141109        /* Check if the chip fits between lowest valid and highest possible 
     
    158126                msg_perr("Read will probably return garbage.\n"); 
    159127        } 
    160         return spi_programmer->read(flash, buf, addrbase + start, len); 
     128        return flash->pgm->spi.read(flash, buf, addrbase + start, len); 
    161129} 
    162130 
     
    171139                       unsigned int len) 
    172140{ 
    173         if (!spi_programmer->write_256) { 
    174                 msg_perr("%s called, but SPI page write is unsupported on this " 
    175                          "hardware. Please report a bug at " 
    176                          "flashrom@flashrom.org\n", __func__); 
    177                 return 1; 
    178         } 
    179  
    180         return spi_programmer->write_256(flash, buf, start, len); 
     141        return flash->pgm->spi.write_256(flash, buf, start, len); 
    181142} 
    182143 
     
    188149uint32_t spi_get_valid_read_addr(struct flashctx *flash) 
    189150{ 
    190         switch (spi_programmer->type) { 
     151        switch (flash->pgm->spi.type) { 
    191152#if CONFIG_INTERNAL == 1 
    192153#if defined(__i386__) || defined(__x86_64__) 
     
    201162} 
    202163 
    203 void register_spi_programmer(const struct spi_programmer *pgm) 
     164int register_spi_programmer(const struct spi_programmer *pgm) 
    204165{ 
    205         spi_programmer = pgm; 
    206         buses_supported |= BUS_SPI; 
     166        struct registered_programmer rpgm; 
     167 
     168        if (!pgm->write_256 || !pgm->read || !pgm->command || 
     169            !pgm->multicommand || 
     170            ((pgm->command == default_spi_send_command) && 
     171             (pgm->multicommand == default_spi_send_multicommand))) { 
     172                msg_perr("%s called with incomplete programmer definition. " 
     173                         "Please report a bug at flashrom@flashrom.org\n", 
     174                         __func__); 
     175                return ERROR_FLASHROM_BUG; 
     176        } 
     177 
     178 
     179        rpgm.buses_supported = BUS_SPI; 
     180        rpgm.spi = *pgm; 
     181        return register_programmer(&rpgm); 
    207182} 
  • trunk/spi25.c

    r1474 r1475  
    180180         * readcnt=4. 
    181181         */ 
    182         switch (spi_programmer->type) { 
     182        switch (flash->pgm->spi.type) { 
    183183#if CONFIG_INTERNAL == 1 
    184184#if defined(__i386__) || defined(__x86_64__) 
     
    11211121        }}; 
    11221122 
    1123         switch (spi_programmer->type) { 
     1123        switch (flash->pgm->spi.type) { 
    11241124#if CONFIG_INTERNAL == 1 
    11251125#if defined(__i386__) || defined(__x86_64__) 
Note: See TracChangeset for help on using the changeset viewer.