| Index: embios/trunk/target/ipodnano2g/nand.c | 
| — | — | @@ -232,7 +232,7 @@ | 
| 233 | 233 |  static uint32_t nand_transfer_data_collect(uint32_t direction)
 | 
| 234 | 234 |  {
 | 
| 235 | 235 |      uint32_t timeout = USEC_TIMER + 20000;
 | 
| 236 |   | -    while ((DMAALLST & DMAALLST_DMABUSY3))
 | 
|   | 236 | +    while (DMAALLST & DMAALLST_DMABUSY3)
 | 
| 237 | 237 |          if (nand_timeout(timeout)) return 1;
 | 
| 238 | 238 |      if (!direction) invalidate_dcache();
 | 
| 239 | 239 |      if (nand_wait_addrdone()) return 1;
 | 
| — | — | @@ -409,8 +409,6 @@ | 
| 410 | 410 |          {
 | 
| 411 | 411 |              if (nand_transfer_data(bank, 0, spare, 0x40))
 | 
| 412 | 412 |                  return nand_unlock(1);
 | 
| 413 |   | -            if (sparebuffer) 
 | 
| 414 |   | -                memcpy(sparebuffer, spare, 0x800);
 | 
| 415 | 413 |              if (checkempty)
 | 
| 416 | 414 |                  rc = nand_check_empty((uint8_t*)sparebuffer) << 1;
 | 
| 417 | 415 |          }
 | 
| Index: embios/trunk/target/ipodnano2g/ftl.c | 
| — | — | @@ -364,6 +364,9 @@ | 
| 365 | 365 |  /* Number of banks we detected a chip on */
 | 
| 366 | 366 |  uint32_t ftl_banks;
 | 
| 367 | 367 |  
 | 
|   | 368 | +/* Number of banks we detected a chip on (power of two) */
 | 
|   | 369 | +uint32_t ftl_banks_exponent;
 | 
|   | 370 | +
 | 
| 368 | 371 |  /* Block map, used vor pBlock to vBlock mapping */
 | 
| 369 | 372 |  static uint16_t ftl_map[0x2000] CACHEALIGN_ATTR;
 | 
| 370 | 373 |  
 | 
| — | — | @@ -433,8 +436,17 @@ | 
| 434 | 437 |  static struct mutex ftl_mtx;
 | 
| 435 | 438 |  bool ftl_initialized = false;
 | 
| 436 | 439 |  
 | 
|   | 440 | +/* Pages per hyperblock (ftl_nand_type->pagesperblock * ftl_banks) */
 | 
|   | 441 | +static uint32_t ppb;
 | 
| 437 | 442 |  
 | 
|   | 443 | +/* Pages per hyperblock (power of two) */
 | 
|   | 444 | +static uint32_t ppb_exponent;
 | 
| 438 | 445 |  
 | 
|   | 446 | +/* Reserved hyperblocks (ftl_nand_type->blocks
 | 
|   | 447 | +                       - ftl_nand_type->userblocks - 0x17) */
 | 
|   | 448 | +static uint32_t syshyperblocks;
 | 
|   | 449 | +
 | 
|   | 450 | +
 | 
| 439 | 451 |  /* Finds a device info page for the specified bank and returns its number.
 | 
| 440 | 452 |     Used to check if one is present, and to read the lowlevel BBT. */
 | 
| 441 | 453 |  static uint32_t ftl_find_devinfo(uint32_t bank) INITCODE_ATTR;
 | 
| — | — | @@ -853,9 +865,6 @@ | 
| 854 | 866 |      DEBUGF("FTL: VFL: Reading page %d", vpage);
 | 
| 855 | 867 |  #endif
 | 
| 856 | 868 |  
 | 
| 857 |   | -    uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
 | 
| 858 |   | -    uint32_t syshyperblocks = ftl_nand_type->blocks
 | 
| 859 |   | -                            - ftl_nand_type->userblocks - 0x17;
 | 
| 860 | 869 |      uint32_t abspage = vpage + ppb * syshyperblocks;
 | 
| 861 | 870 |      if (abspage >= ftl_nand_type->blocks * ppb || abspage < ppb)
 | 
| 862 | 871 |      {
 | 
| — | — | @@ -863,9 +872,9 @@ | 
| 864 | 873 |          return 4;
 | 
| 865 | 874 |      }
 | 
| 866 | 875 |  
 | 
| 867 |   | -    uint32_t bank = abspage % ftl_banks;
 | 
| 868 |   | -    uint32_t block = abspage / (ftl_nand_type->pagesperblock * ftl_banks);
 | 
| 869 |   | -    uint32_t page = (abspage / ftl_banks) % ftl_nand_type->pagesperblock;
 | 
|   | 876 | +    uint32_t bank = abspage & (ftl_banks - 1);
 | 
|   | 877 | +    uint32_t block = abspage >> ppb_exponent;
 | 
|   | 878 | +    uint32_t page = (abspage >> ftl_banks_exponent) & ((1 << ftl_nand_type->blocksizeexponent) - 1);
 | 
| 870 | 879 |      uint32_t physblock = ftl_vfl_get_physical_block(bank, block);
 | 
| 871 | 880 |      uint32_t physpage = physblock * ftl_nand_type->pagesperblock + page;
 | 
| 872 | 881 |  
 | 
| — | — | @@ -902,9 +911,6 @@ | 
| 903 | 912 |  #endif
 | 
| 904 | 913 |  
 | 
| 905 | 914 |      uint32_t i, rc = 0;
 | 
| 906 |   | -    uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
 | 
| 907 |   | -    uint32_t syshyperblocks = ftl_nand_type->blocks
 | 
| 908 |   | -                            - ftl_nand_type->userblocks - 0x17;
 | 
| 909 | 915 |      uint32_t abspage = vpage + ppb * syshyperblocks;
 | 
| 910 | 916 |      if (abspage + ftl_banks - 1 >= ftl_nand_type->blocks * ppb || abspage < ppb)
 | 
| 911 | 917 |      {
 | 
| — | — | @@ -912,9 +918,9 @@ | 
| 913 | 919 |          return 4;
 | 
| 914 | 920 |      }
 | 
| 915 | 921 |  
 | 
| 916 |   | -    uint32_t bank = abspage % ftl_banks;
 | 
| 917 |   | -    uint32_t block = abspage / (ftl_nand_type->pagesperblock * ftl_banks);
 | 
| 918 |   | -    uint32_t page = (abspage / ftl_banks) % ftl_nand_type->pagesperblock;
 | 
|   | 922 | +    uint32_t bank = abspage & (ftl_banks - 1);
 | 
|   | 923 | +    uint32_t block = abspage >> ppb_exponent;
 | 
|   | 924 | +    uint32_t page = (abspage >> ftl_banks_exponent) & ((1 << ftl_nand_type->blocksizeexponent) - 1);
 | 
| 919 | 925 |      uint32_t remapped = 0;
 | 
| 920 | 926 |      for (i = 0; i < ftl_banks; i++)
 | 
| 921 | 927 |          if (ftl_vfl_get_physical_block(i, block) != block)
 | 
| — | — | @@ -978,9 +984,6 @@ | 
| 979 | 985 |      DEBUGF("FTL: VFL: Writing page %d", vpage);
 | 
| 980 | 986 |  #endif
 | 
| 981 | 987 |  
 | 
| 982 |   | -    uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
 | 
| 983 |   | -    uint32_t syshyperblocks = ftl_nand_type->blocks
 | 
| 984 |   | -                            - ftl_nand_type->userblocks - 0x17;
 | 
| 985 | 988 |      uint32_t abspage = vpage + ppb * syshyperblocks;
 | 
| 986 | 989 |      if (abspage + count > ftl_nand_type->blocks * ppb || abspage < ppb)
 | 
| 987 | 990 |      {
 | 
| — | — | @@ -1065,9 +1068,6 @@ | 
| 1066 | 1069 |      uint8_t bbt[0x410];
 | 
| 1067 | 1070 |  #endif
 | 
| 1068 | 1071 |  
 | 
| 1069 |   | -    uint32_t syshyperblocks = ftl_nand_type->blocks
 | 
| 1070 |   | -                            - ftl_nand_type->userblocks - 0x18;
 | 
| 1071 |   | -
 | 
| 1072 | 1072 |      for (i = 0; i < ftl_banks; i++)
 | 
| 1073 | 1073 |  #ifndef FTL_READONLY
 | 
| 1074 | 1074 |          if (ftl_load_bbt(i, ftl_bbt[i]) == 0)
 | 
| — | — | @@ -1152,7 +1152,6 @@ | 
| 1153 | 1153 |  {
 | 
| 1154 | 1154 |      uint32_t i;
 | 
| 1155 | 1155 |      uint32_t ret;
 | 
| 1156 |   | -    uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
 | 
| 1157 | 1156 |      struct ftl_vfl_cxt_type* cxt = ftl_vfl_get_newest_cxt();
 | 
| 1158 | 1157 |  
 | 
| 1159 | 1158 |      uint32_t ftlcxtblock = 0xffffffff;
 | 
| — | — | @@ -1316,7 +1315,6 @@ | 
| 1317 | 1316 |  uint32_t ftl_read(uint32_t sector, uint32_t count, void* buffer)
 | 
| 1318 | 1317 |  {
 | 
| 1319 | 1318 |      uint32_t i, j;
 | 
| 1320 |   | -    uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
 | 
| 1321 | 1319 |      uint32_t error = 0;
 | 
| 1322 | 1320 |  
 | 
| 1323 | 1321 |      if (!ftl_initialized) return -1;
 | 
| — | — | @@ -1571,7 +1569,6 @@ | 
| 1572 | 1570 |  static uint32_t ftl_next_ctrl_pool_page(void)
 | 
| 1573 | 1571 |  {
 | 
| 1574 | 1572 |      uint32_t i;
 | 
| 1575 |   | -    uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
 | 
| 1576 | 1573 |      if (++ftl_cxt.ftlctrlpage % ppb != 0) return 0;
 | 
| 1577 | 1574 |      for (i = 0; i < 3; i++)
 | 
| 1578 | 1575 |          if ((ftl_cxt.ftlctrlblocks[i] + 1) * ppb == ftl_cxt.ftlctrlpage)
 | 
| — | — | @@ -1610,7 +1607,6 @@ | 
| 1611 | 1608 |  static uint32_t ftl_copy_page(uint32_t source, uint32_t destination,
 | 
| 1612 | 1609 |                                uint32_t lpn, uint32_t type)
 | 
| 1613 | 1610 |  {
 | 
| 1614 |   | -    uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
 | 
| 1615 | 1611 |      uint32_t rc = ftl_vfl_read(source, ftl_copybuffer[0],
 | 
| 1616 | 1612 |                                 &ftl_copyspare[0], 1, 1) & 0x11F;
 | 
| 1617 | 1613 |      memset(&ftl_copyspare[0], 0xFF, 0x40);
 | 
| — | — | @@ -1631,7 +1627,6 @@ | 
| 1632 | 1628 |  static uint32_t ftl_copy_block(uint32_t source, uint32_t destination)
 | 
| 1633 | 1629 |  {
 | 
| 1634 | 1630 |      uint32_t i, j;
 | 
| 1635 |   | -    uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
 | 
| 1636 | 1631 |      uint32_t error = 0;
 | 
| 1637 | 1632 |      ftl_cxt.nextblockusn++;
 | 
| 1638 | 1633 |      for (i = 0; i < ppb; i += FTL_COPYBUF_SIZE)
 | 
| — | — | @@ -1690,7 +1685,6 @@ | 
| 1691 | 1686 |  static uint32_t ftl_compact_scattered(struct ftl_log_type* entry)
 | 
| 1692 | 1687 |  {
 | 
| 1693 | 1688 |      uint32_t i, j;
 | 
| 1694 |   | -    uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
 | 
| 1695 | 1689 |      uint32_t error;
 | 
| 1696 | 1690 |      struct ftl_log_type backup;
 | 
| 1697 | 1691 |      if (entry->pagescurrent == 0)
 | 
| — | — | @@ -1774,7 +1768,6 @@ | 
| 1775 | 1769 |  static uint32_t ftl_commit_sequential(struct ftl_log_type* entry)
 | 
| 1776 | 1770 |  {
 | 
| 1777 | 1771 |      uint32_t i;
 | 
| 1778 |   | -    uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
 | 
| 1779 | 1772 |  
 | 
| 1780 | 1773 |      if (entry->issequential != 1
 | 
| 1781 | 1774 |       || entry->pagescurrent != entry->pagesused)
 | 
| — | — | @@ -1820,7 +1813,6 @@ | 
| 1821 | 1814 |  static uint32_t ftl_remove_scattered_block(struct ftl_log_type* entry)
 | 
| 1822 | 1815 |  {
 | 
| 1823 | 1816 |      uint32_t i;
 | 
| 1824 |   | -    uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
 | 
| 1825 | 1817 |      uint32_t age = 0xFFFFFFFF, used = 0;
 | 
| 1826 | 1818 |      if (entry == NULL)
 | 
| 1827 | 1819 |      {
 | 
| — | — | @@ -1917,7 +1909,6 @@ | 
| 1918 | 1910 |  static uint32_t ftl_commit_cxt(void)
 | 
| 1919 | 1911 |  {
 | 
| 1920 | 1912 |      uint32_t i;
 | 
| 1921 |   | -    uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
 | 
| 1922 | 1913 |      uint32_t mappages = (ftl_nand_type->userblocks + 0x3ff) >> 10;
 | 
| 1923 | 1914 |      uint32_t ctrpages = (ftl_nand_type->userblocks + 23 + 0x3ff) >> 10;
 | 
| 1924 | 1915 |      uint32_t endpage = ftl_cxt.ftlctrlpage + mappages + ctrpages + 1;
 | 
| — | — | @@ -2002,7 +1993,6 @@ | 
| 2003 | 1994 |  uint32_t ftl_write(uint32_t sector, uint32_t count, const void* buffer)
 | 
| 2004 | 1995 |  {
 | 
| 2005 | 1996 |      uint32_t i, j, k;
 | 
| 2006 |   | -    uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
 | 
| 2007 | 1997 |  
 | 
| 2008 | 1998 |      if (!ftl_initialized) return -1;
 | 
| 2009 | 1999 |  
 | 
| — | — | @@ -2197,8 +2187,6 @@ | 
| 2198 | 2188 |  {
 | 
| 2199 | 2189 |      uint32_t i;
 | 
| 2200 | 2190 |      uint32_t rc = 0;
 | 
| 2201 |   | -    uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
 | 
| 2202 |   | -
 | 
| 2203 | 2191 |      if (!ftl_initialized) return 0;
 | 
| 2204 | 2192 |  
 | 
| 2205 | 2193 |      if (ftl_cxt.clean_flag == 1) return 0;
 | 
| — | — | @@ -2591,6 +2579,10 @@ | 
| 2592 | 2580 |      for (i = 0; i < 4; i++)
 | 
| 2593 | 2581 |          if (nand_get_device_type(i) != 0) ftl_banks = i + 1;
 | 
| 2594 | 2582 |      ftl_nand_type = nand_get_device_type(0);
 | 
|   | 2583 | +	ftl_banks_exponent = ftl_banks == 4 ? 2 : ftl_banks == 2 ? 1 : 0;
 | 
|   | 2584 | +	ppb_exponent = ftl_nand_type->blocksizeexponent + ftl_banks_exponent;
 | 
|   | 2585 | +    ppb = (1 << ppb_exponent);
 | 
|   | 2586 | +    syshyperblocks = ftl_nand_type->blocks - ftl_nand_type->userblocks - 0x17;
 | 
| 2595 | 2587 |  
 | 
| 2596 | 2588 |      if (!ftl_has_devinfo())
 | 
| 2597 | 2589 |      {
 |