#include <board.h>
#include <bcmTag.h>
+#include <bcm_map_part.h>
#define VERSION "1.0"
extern PFILE_TAG kerSysImageTagGet(void);
{
map_word val;
- val.x[0] = __raw_readw(map->map_priv_1 + ofs);
+ /* If the requested flash address is in a memory mapped range, use
+ * __raw_readw. Otherwise, use kerSysReadFromFlash.
+ */
+ if(((map->map_priv_1 & ~0xfff00000) + ofs + sizeof(short)) < map->map_priv_2)
+ val.x[0] = __raw_readw(map->map_priv_1 + ofs);
+ else
+ kerSysReadFromFlash( &val.x[0], map->map_priv_1 + ofs, sizeof(short) );
return val;
}
static void brcm_physmap_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)
{
- memcpy_fromio(to, map->map_priv_1 + from, len);
+ /* If the requested flash address is in a memory mapped range, use
+ * memcpy_fromio. Otherwise, use kerSysReadFromFlash.
+ */
+ if( ((map->map_priv_1 & ~0xfff00000) + from + len) < map->map_priv_2 )
+ memcpy_fromio(to, map->map_priv_1 + from, len);
+ else
+ kerSysReadFromFlash( to, map->map_priv_1 + from, len );
}
static struct map_info brcm_physmap_map = {
{
PFILE_TAG pTag = NULL;
u_int32_t rootfs_addr, kernel_addr;
- FLASH_ADDR_INFO info;
printk("bcm963xx_mtd driver v%s\n", VERSION);
- kerSysFlashAddrInfoGet( &info );
/* Read the flash memory map from flash memory. */
if (!(pTag = kerSysImageTagGet())) {
return -EIO;
}
- rootfs_addr = (u_int32_t) simple_strtoul(pTag->rootfsAddress, NULL, 10);
- kernel_addr = (u_int32_t) simple_strtoul(pTag->kernelAddress, NULL, 10);
+ rootfs_addr = (u_int32_t) simple_strtoul(pTag->rootfsAddress, NULL, 10) + BOOT_OFFSET;
+ kernel_addr = (u_int32_t) simple_strtoul(pTag->kernelAddress, NULL, 10) + BOOT_OFFSET;
brcm_physmap_map.size = kernel_addr - rootfs_addr;
brcm_physmap_map.map_priv_1 = (unsigned long)rootfs_addr;
+ /* Set map_priv_2 to the amount of flash memory that is memory mapped to
+ * the flash base address. On the BCM6338, serial flash parts are only
+ * memory mapped up to 1MB even though the flash part may be bigger.
+ */
+ brcm_physmap_map.map_priv_2 =(unsigned long)kerSysMemoryMappedFlashSizeGet();
+
if (!brcm_physmap_map.map_priv_1) {
printk("Wrong rootfs starting address\n");
return -EIO;