Changeset 44725


Ignore:
Timestamp:
2015-03-13T04:01:17+01:00 (3 years ago)
Author:
nbd
Message:

atheros: v3.18: remap flash for boardconfig parsing

Rework boardconfig handling code to honestly remap flash memory region.

Signed-off-by: Sergey Ryazanov <ryazanov.s.a@…>

Location:
trunk/target/linux/atheros/patches-3.18
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/atheros/patches-3.18/100-board.patch

    r44724 r44725  
    7878--- /dev/null 
    7979+++ b/arch/mips/ath25/board.c 
    80 @@ -0,0 +1,234 @@ 
     80@@ -0,0 +1,244 @@ 
    8181+/* 
    8282+ * This file is subject to the terms and conditions of the GNU General Public 
     
    113113+void (*ath25_irq_dispatch)(void); 
    114114+ 
    115 +static inline bool check_radio_magic(u8 *addr) 
     115+static inline bool check_radio_magic(const void __iomem *addr) 
    116116+{ 
    117117+       addr += 0x7a; /* offset for flash magic */ 
    118 +       return (addr[0] == 0x5a) && (addr[1] == 0xa5); 
    119 +} 
    120 + 
    121 +static inline bool check_notempty(u8 *addr) 
    122 +{ 
    123 +       return *(u32 *)addr != 0xffffffff; 
    124 +} 
    125 + 
    126 +static inline bool check_board_data(u8 *flash_limit, u8 *addr, bool broken) 
     118+       return (__raw_readb(addr) == 0x5a) && (__raw_readb(addr + 1) == 0xa5); 
     119+} 
     120+ 
     121+static inline bool check_notempty(const void __iomem *addr) 
     122+{ 
     123+       return __raw_readl(addr) != 0xffffffff; 
     124+} 
     125+ 
     126+static inline bool check_board_data(const void __iomem *addr, bool broken) 
    127127+{ 
    128128+       /* config magic found */ 
    129 +       if (*((u32 *)addr) == ATH25_BD_MAGIC) 
     129+       if (__raw_readl(addr) == ATH25_BD_MAGIC) 
    130130+               return true; 
    131131+ 
     
    133133+               return false; 
    134134+ 
     135+       /* broken board data detected, use radio data to find the 
     136+        * offset, user will fix this */ 
     137+ 
     138+       if (check_radio_magic(addr + 0x1000)) 
     139+               return true; 
    135140+       if (check_radio_magic(addr + 0xf8)) 
    136 +               ath25_board.radio = addr + 0xf8; 
    137 +       if ((addr < flash_limit + 0x10000) && 
    138 +           check_radio_magic(addr + 0x10000)) 
    139 +               ath25_board.radio = addr + 0x10000; 
    140 + 
    141 +       if (ath25_board.radio) { 
    142 +               /* broken board data detected, use radio data to find the 
    143 +                * offset, user will fix this */ 
    144141+               return true; 
    145 +       } 
    146142+ 
    147143+       return false; 
    148144+} 
    149145+ 
    150 +static u8 * __init find_board_config(u8 *flash_limit, bool broken) 
    151 +{ 
    152 +       u8 *addr; 
    153 +       u8 *begin = flash_limit - 0x1000; 
    154 +       u8 *end = flash_limit - 0x30000; 
     146+static const void __iomem * __init find_board_config(const void __iomem *limit, 
     147+                                                    const bool broken) 
     148+{ 
     149+       const void __iomem *addr; 
     150+       const void __iomem *begin = limit - 0x1000; 
     151+       const void __iomem *end = limit - 0x30000; 
    155152+ 
    156153+       for (addr = begin; addr >= end; addr -= 0x1000) 
    157 +               if (check_board_data(flash_limit, addr, broken)) 
     154+               if (check_board_data(addr, broken)) 
    158155+                       return addr; 
    159156+ 
     
    161158+} 
    162159+ 
    163 +static u8 * __init find_radio_config(u8 *flash_limit, u8 *bcfg) 
    164 +{ 
    165 +       u8 *rcfg, *begin, *end; 
     160+static const void __iomem * __init find_radio_config(const void __iomem *limit, 
     161+                                                    const void __iomem *bcfg) 
     162+{ 
     163+       const void __iomem *rcfg, *begin, *end; 
    166164+ 
    167165+       /* 
     
    171169+        */ 
    172170+       begin = bcfg + 0x1000; 
    173 +       end = flash_limit; 
     171+       end = limit; 
    174172+       for (rcfg = begin; rcfg < end; rcfg += 0x1000) 
    175173+               if (check_notempty(rcfg) && check_radio_magic(rcfg)) 
     
    178176+       /* AR2316 relocates radio config to new location */ 
    179177+       begin = bcfg + 0xf8; 
    180 +       end = flash_limit - 0x1000 + 0xf8; 
     178+       end = limit - 0x1000 + 0xf8; 
    181179+       for (rcfg = begin; rcfg < end; rcfg += 0x1000) 
    182180+               if (check_notempty(rcfg) && check_radio_magic(rcfg)) 
    183181+                       return rcfg; 
    184182+ 
    185 +       pr_warn("WARNING: Could not find Radio Configuration data\n"); 
    186 + 
    187183+       return NULL; 
    188184+} 
    189185+ 
    190 +int __init ath25_find_config(u8 *flash_limit) 
    191 +{ 
     186+/* 
     187+ * NB: Search region size could be larger than the actual flash size, 
     188+ * but this shouldn't be a problem here, because the flash 
     189+ * will simply be mapped multiple times. 
     190+ */ 
     191+int __init ath25_find_config(phys_addr_t base, unsigned long size) 
     192+{ 
     193+       const void __iomem *flash_base, *flash_limit; 
    192194+       struct ath25_boarddata *config; 
    193195+       unsigned int rcfg_size; 
    194196+       int broken_boarddata = 0; 
    195 +       u8 *bcfg, *rcfg; 
     197+       const void __iomem *bcfg, *rcfg; 
    196198+       u8 *board_data; 
    197199+       u8 *radio_data; 
     
    199201+       u32 offset; 
    200202+ 
     203+       flash_base = ioremap_nocache(base, size); 
     204+       flash_limit = flash_base + size; 
     205+ 
    201206+       ath25_board.config = NULL; 
    202207+       ath25_board.radio = NULL; 
     208+ 
    203209+       /* Copy the board and radio data to RAM, because accessing the mapped 
    204210+        * memory of the flash directly after booting is not safe */ 
     
    215221+       if (!bcfg) { 
    216222+               pr_warn("WARNING: No board configuration data found!\n"); 
    217 +               return -ENODEV; 
     223+               goto error; 
    218224+       } 
    219225+ 
    220226+       board_data = kzalloc(BOARD_CONFIG_BUFSZ, GFP_KERNEL); 
    221227+       ath25_board.config = (struct ath25_boarddata *)board_data; 
    222 +       memcpy(board_data, bcfg, 0x100); 
     228+       memcpy_fromio(board_data, bcfg, 0x100); 
    223229+       if (broken_boarddata) { 
    224230+               pr_warn("WARNING: broken board data detected\n"); 
     
    238244+        * of what the physical layout on the flash chip looks like */ 
    239245+ 
    240 +       if (ath25_board.radio) 
    241 +               rcfg = (u8 *)ath25_board.radio; 
    242 +       else 
    243 +               rcfg = find_radio_config(flash_limit, bcfg); 
    244 + 
    245 +       if (!rcfg) 
    246 +               return -ENODEV; 
     246+       rcfg = find_radio_config(flash_limit, bcfg); 
     247+       if (!rcfg) { 
     248+               pr_warn("WARNING: Could not find Radio Configuration data\n"); 
     249+               goto error; 
     250+       } 
    247251+ 
    248252+       radio_data = board_data + 0x100 + ((rcfg - bcfg) & 0xfff); 
     
    252256+               offset); 
    253257+       rcfg_size = BOARD_CONFIG_BUFSZ - offset; 
    254 +       memcpy(radio_data, rcfg, rcfg_size); 
     258+       memcpy_fromio(radio_data, rcfg, rcfg_size); 
    255259+ 
    256260+       mac_addr = &radio_data[0x1d * 2]; 
     
    260264+       } 
    261265+ 
     266+       iounmap(flash_base); 
     267+ 
    262268+       return 0; 
     269+ 
     270+error: 
     271+       iounmap(flash_base); 
     272+       return -ENODEV; 
    263273+} 
    264274+ 
     
    630640--- /dev/null 
    631641+++ b/arch/mips/ath25/ar2315_regs.h 
    632 @@ -0,0 +1,480 @@ 
     642@@ -0,0 +1,481 @@ 
    633643+/* 
    634644+ * Register definitions for AR2315+ 
     
    673683+ * Address map 
    674684+ */ 
    675 +#define AR2315_SPI_READ         0x08000000      /* SPI FLASH */ 
     685+#define AR2315_SPI_READ_BASE   0x08000000      /* SPI flash */ 
     686+#define AR2315_SPI_READ_SIZE   0x01000000 
    676687+#define AR2315_WLAN0            0x10000000      /* Wireless MMR */ 
    677688+#define AR2315_PCI              0x10100000      /* PCI MMR */ 
     
    11131124--- /dev/null 
    11141125+++ b/arch/mips/ath25/ar5312_regs.h 
    1115 @@ -0,0 +1,227 @@ 
     1126@@ -0,0 +1,228 @@ 
    11161127+/* 
    11171128+ * This file is subject to the terms and conditions of the GNU General Public 
     
    11711182+#define AR5312_RST_BASE                        0x1c003000 
    11721183+#define AR5312_RST_SIZE                        0x00000100 
    1173 +#define AR5312_FLASH            0x1e000000 
     1184+#define AR5312_FLASH_BASE              0x1e000000 
     1185+#define AR5312_FLASH_SIZE              0x00800000 
    11741186+ 
    11751187+/* 
     
    13431355--- /dev/null 
    13441356+++ b/arch/mips/ath25/ar5312.c 
    1345 @@ -0,0 +1,483 @@ 
     1357@@ -0,0 +1,478 @@ 
    13461358+/* 
    13471359+ * This file is subject to the terms and conditions of the GNU General Public 
     
    15241536+ 
    15251537+static struct resource ar5312_flash_resource = { 
    1526 +       .start = AR5312_FLASH, 
    1527 +       .end = AR5312_FLASH + 0x800000 - 1, 
     1538+       .start = AR5312_FLASH_BASE, 
     1539+       .end = AR5312_FLASH_BASE + AR5312_FLASH_SIZE - 1, 
    15281540+       .flags = IORESOURCE_MEM, 
    15291541+}; 
     
    15681580+#endif 
    15691581+ 
    1570 +/* 
    1571 + * NB: This mapping size is larger than the actual flash size, 
    1572 + * but this shouldn't be a problem here, because the flash 
    1573 + * will simply be mapped multiple times. 
    1574 + */ 
    1575 +static char __init *ar5312_flash_limit(void) 
     1582+static void __init ar5312_flash_init(void) 
    15761583+{ 
    15771584+       void __iomem *flashctl_base; 
     
    16181625+ 
    16191626+       iounmap(flashctl_base); 
    1620 + 
    1621 +       return (char *)KSEG1ADDR(AR5312_FLASH + 0x800000); 
    16221627+} 
    16231628+ 
     
    16271632+       u8 *c; 
    16281633+ 
     1634+       ar5312_flash_init(); 
     1635+ 
    16291636+       /* Locate board/radio config data */ 
    1630 +       ath25_find_config(ar5312_flash_limit()); 
     1637+       ath25_find_config(AR5312_FLASH_BASE, AR5312_FLASH_SIZE); 
    16311638+       config = ath25_board.config; 
    16321639+ 
     
    18291836--- /dev/null 
    18301837+++ b/arch/mips/ath25/ar2315.c 
    1831 @@ -0,0 +1,428 @@ 
     1838@@ -0,0 +1,418 @@ 
    18321839+/* 
    18331840+ * This file is subject to the terms and conditions of the GNU General Public 
     
    20192026+               .name = "spiflash_read", 
    20202027+               .flags = IORESOURCE_MEM, 
    2021 +               .start = AR2315_SPI_READ, 
    2022 +               .end = AR2315_SPI_READ + 0x1000000 - 1, 
     2028+               .start = AR2315_SPI_READ_BASE, 
     2029+               .end = AR2315_SPI_READ_BASE + AR2315_SPI_READ_SIZE - 1, 
    20232030+       }, 
    20242031+       { 
     
    20572064+}; 
    20582065+ 
    2059 +/* 
    2060 + * NB: We use mapping size that is larger than the actual flash size, 
    2061 + * but this shouldn't be a problem here, because the flash will simply 
    2062 + * be mapped multiple times. 
    2063 + */ 
    2064 +static u8 __init *ar2315_flash_limit(void) 
    2065 +{ 
    2066 +       return (u8 *)KSEG1ADDR(ar2315_spiflash_res[0].end + 1); 
    2067 +} 
    2068 + 
    20692066+#ifdef CONFIG_LEDS_GPIO 
    20702067+static struct gpio_led ar2315_leds[6]; 
     
    21142111+{ 
    21152112+       /* Find board configuration */ 
    2116 +       ath25_find_config(ar2315_flash_limit()); 
     2113+       ath25_find_config(AR2315_SPI_READ_BASE, AR2315_SPI_READ_SIZE); 
    21172114+       ar2315_eth_data.macaddr = ath25_board.config->enet0_mac; 
    21182115+ 
     
    23662363+extern void (*ath25_irq_dispatch)(void); 
    23672364+ 
    2368 +int ath25_find_config(u8 *flash_limit); 
     2365+int ath25_find_config(phys_addr_t offset, unsigned long size); 
    23692366+int ath25_add_ethernet(int nr, u32 base, const char *mii_name, u32 mii_base, 
    23702367+                      int irq, void *pdata); 
  • trunk/target/linux/atheros/patches-3.18/102-ar5312_gpio.patch

    r44723 r44725  
    3434 static struct gpio_led ar5312_leds[] = { 
    3535        { .name = "wlan", .gpio = 0, .active_low = 1, }, 
    36 @@ -299,6 +315,8 @@ void __init ar5312_init_devices(void) 
     36@@ -294,6 +310,8 @@ void __init ar5312_init_devices(void) 
    3737  
    3838        platform_device_register(&ar5312_physmap_flash); 
  • trunk/target/linux/atheros/patches-3.18/103-ar2315_gpio.patch

    r44723 r44725  
    4141+}; 
    4242+ 
    43  /* 
    44   * NB: We use mapping size that is larger than the actual flash size, 
    45   * but this shouldn't be a problem here, because the flash will simply 
    46 @@ -285,6 +313,7 @@ void __init ar2315_init_devices(void) 
    47         ath25_find_config(ar2315_flash_limit()); 
     43 #ifdef CONFIG_LEDS_GPIO 
     44 static struct gpio_led ar2315_leds[6]; 
     45 static struct gpio_led_platform_data ar2315_led_data = { 
     46@@ -275,6 +303,7 @@ void __init ar2315_init_devices(void) 
     47        ath25_find_config(AR2315_SPI_READ_BASE, AR2315_SPI_READ_SIZE); 
    4848        ar2315_eth_data.macaddr = ath25_board.config->enet0_mac; 
    4949  
  • trunk/target/linux/atheros/patches-3.18/105-ar2315_pci.patch

    r44723 r44725  
    532532                do_IRQ(AR2315_IRQ_MISC_INTRS); 
    533533        else if (pending & CAUSEF_IP7) 
    534 @@ -450,8 +454,60 @@ void __init ar2315_plat_mem_setup(void) 
     534@@ -440,8 +444,60 @@ void __init ar2315_plat_mem_setup(void) 
    535535        _machine_restart = ar2315_restart; 
    536536 } 
Note: See TracChangeset for help on using the changeset viewer.