# HG changeset patch # User Michael Spacefalcon # Date 1389608159 0 # Node ID 4d706a4134b03e7b48c67ee8daba2fdb95dd0f4c # Parent c04aa85559ed521fa74ef015ef5d08e49eb6c8b7 FFS in gsm-fw: generate the legacy block info table at run time diff -r c04aa85559ed -r 4d706a4134b0 gsm-fw/cfgmagic/feature.pirhack-ffs --- a/gsm-fw/cfgmagic/feature.pirhack-ffs Mon Jan 13 09:05:01 2014 +0000 +++ b/gsm-fw/cfgmagic/feature.pirhack-ffs Mon Jan 13 10:15:59 2014 +0000 @@ -12,6 +12,10 @@ # select: these sectors form an independent read/write bank, and are not used # for FFS by Pirelli's fw, eliminating the possibility of accidental FFS # cross-contamination between the two very different firmwares on the same hw. +# +# If you want to use some other sectors for FC FFS on the Pirelli, invoke +# feature pirhack-ffs first, then change CONFIG_PIRHACK_FFS_START and +# CONFIG_PIRHACK_FFS_NBLOCKS to taste. if [ $TARGET != pirelli ] then @@ -22,6 +26,10 @@ FFS_IN_RAM=0 CONFIG_PIRHACK_FFS=1 +CONFIG_PIRHACK_FFS_START=24 +CONFIG_PIRHACK_FFS_NBLOCKS=7 CONFIG_FLASH_WRITE=1 export_to_c CONFIG_PIRHACK_FFS +export_to_c CONFIG_PIRHACK_FFS_START +export_to_c CONFIG_PIRHACK_FFS_NBLOCKS export_to_c CONFIG_FLASH_WRITE diff -r c04aa85559ed -r 4d706a4134b0 gsm-fw/services/ffs/cfgffs.c --- a/gsm-fw/services/ffs/cfgffs.c Mon Jan 13 09:05:01 2014 +0000 +++ b/gsm-fw/services/ffs/cfgffs.c Mon Jan 13 10:15:59 2014 +0000 @@ -16,11 +16,8 @@ #if FFS_IN_RAM -extern struct block_info_s ramffs_block_info[RAMFFS_NBLOCKS]; - struct dev_s dev = { .base = _RAMFFS_area, - .binfo = ramffs_block_info, .manufact = MANUFACT_RAM, .blocksize = RAMFFS_BLKSIZE_BYTES, .blocksize_ld = RAMFFS_BLKSIZE_LOG2, @@ -30,19 +27,8 @@ #elif CONFIG_MOKOFFS -static struct block_info_s mokoffs_blocks[7] = { - { 0x00000, 16 }, - { 0x10000, 16 }, - { 0x20000, 16 }, - { 0x30000, 16 }, - { 0x40000, 16 }, - { 0x50000, 16 }, - { 0x60000, 16 } -}; - struct dev_s dev = { .base = (char *) 0x380000, - .binfo = mokoffs_blocks, .manufact = MANUFACT_SAMSUNG, .device = 0x22A0, .blocksize = 0x10000, @@ -55,24 +41,14 @@ /* see ../../cfgmagic/feature.pirhack-ffs */ -static struct block_info_s pirhack_ffs_blocks[7] = { - { 0x600000, 18 }, - { 0x640000, 18 }, - { 0x680000, 18 }, - { 0x6C0000, 18 }, - { 0x700000, 18 }, - { 0x740000, 18 }, - { 0x780000, 18 } -}; - struct dev_s dev = { - .base = (char *) FLASH2_BASE_ADDR, - .binfo = pirhack_ffs_blocks, + .base = (char *) FLASH2_BASE_ADDR + + CONFIG_PIRHACK_FFS_START * 0x40000, .manufact = MANUFACT_AMD, .blocksize = 0x40000, .blocksize_ld = 18, .driver = FFS_DRIVER_AMD, - .numblocks = 7, + .numblocks = CONFIG_PIRHACK_FFS_NBLOCKS, }; #else diff -r c04aa85559ed -r 4d706a4134b0 gsm-fw/services/ffs/drv.c --- a/gsm-fw/services/ffs/drv.c Mon Jan 13 09:05:01 2014 +0000 +++ b/gsm-fw/services/ffs/drv.c Mon Jan 13 10:15:59 2014 +0000 @@ -11,6 +11,7 @@ #include "../../include/config.h" #include "ffs.h" #include "drv.h" +#include "core.h" /* for FFS_BLOCKS_MAX */ #include "ffstrace.h" #include "intctl.h" #include "ramffs.h" @@ -18,6 +19,13 @@ /****************************************************************************** + * "Block info" stupidity + ******************************************************************************/ + +static struct block_info_s block_info[FFS_BLOCKS_MAX]; + + +/****************************************************************************** * Macros ******************************************************************************/ @@ -125,24 +133,6 @@ * RAM Family Functions ******************************************************************************/ -struct block_info_s ramffs_block_info[RAMFFS_NBLOCKS]; - -int ffsdrv_ram_init(void) -{ - unsigned i; - uint32 offset; - - ttw(ttr(TTrDrvOther, "ffsdrv_ram_init()" NL)); - memset(_RAMFFS_area, 0xFF, RAMFFS_TOTAL_SIZE); - offset = 0; - for (i = 0; i < RAMFFS_NBLOCKS; i++) { - ramffs_block_info[i].offset = offset; - ramffs_block_info[i].size_ld = RAMFFS_BLKSIZE_LOG2; - offset += RAMFFS_BLKSIZE_BYTES; - } - return 0; -} - void ffsdrv_ram_write_halfword(volatile uint16 *dst, uint16 value) { *dst = value; @@ -399,6 +389,8 @@ effs_t ffsdrv_init(void) { int error; + unsigned i; + uint32 offset; tw(tr(TR_BEGIN, TrDrvInit, "drv_init() {\n")); ttw(str(TTrDrvOther, "ffsdrv_init() {" NL)); @@ -408,6 +400,14 @@ dev.atomsize = 1 << dev.atomlog2; dev.atomnotmask = dev.atomsize - 1; + offset = 0; + for (i = 0; i < dev.numblocks; i++) { + block_info[i].offset = offset; + block_info[i].size_ld = dev.blocksize_ld; + offset += dev.blocksize; + } + dev.binfo = block_info; + error = ffsdrv.init(); tw(tr(TR_FUNC, TrDrvInit, "dev.binfo = 0x%x\n", (unsigned int) dev.binfo)); diff -r c04aa85559ed -r 4d706a4134b0 gsm-fw/services/ffs/task.c --- a/gsm-fw/services/ffs/task.c Mon Jan 13 09:05:01 2014 +0000 +++ b/gsm-fw/services/ffs/task.c Mon Jan 13 10:15:59 2014 +0000 @@ -14,7 +14,9 @@ #include "task.h" #include "ffstrace.h" #include "intctl.h" +#include "ramffs.h" #include "../../riviera/rvm/rvm_use_id_list.h" +#include /****************************************************************************** * Globals and function prototypes @@ -206,9 +208,9 @@ //ttr_init(TTrTask|TTrTest|TTrTestInfo|TTrDrvErase|TTrDrvWrite|TTrTaskLow|TTrApi); tmp_int_level = TCD_Interrupt_Level; // Backup Int level - TCD_Interrupt_Level = 0xC0; // The Interrups are not yet enabled... + TCD_Interrupt_Level = 0xC0; // The Interrups are not yet enabled.. #if FFS_IN_RAM - ffsdrv_ram_init(); + memset(_RAMFFS_area, 0xFF, RAMFFS_TOTAL_SIZE); #endif ffs_init_status = ffs_initialize(); TCD_Interrupt_Level = tmp_int_level; // Restore Int level