mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-11 15:37:23 +00:00
Merge branch 'master' of git://git.denx.de/u-boot-cfi-flash
This commit is contained in:
commit
0ab5410a40
3 changed files with 31 additions and 40 deletions
|
@ -305,17 +305,12 @@ flash_map (flash_info_t * info, flash_sect_t sect, uint offset)
|
|||
{
|
||||
unsigned int byte_offset = offset * info->portwidth;
|
||||
|
||||
return map_physmem(info->start[sect] + byte_offset,
|
||||
flash_sector_size(info, sect) - byte_offset,
|
||||
MAP_NOCACHE);
|
||||
return (void *)(info->start[sect] + byte_offset);
|
||||
}
|
||||
|
||||
static inline void flash_unmap(flash_info_t *info, flash_sect_t sect,
|
||||
unsigned int offset, void *addr)
|
||||
{
|
||||
unsigned int byte_offset = offset * info->portwidth;
|
||||
|
||||
unmap_physmem(addr, flash_sector_size(info, sect) - byte_offset);
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
|
@ -802,13 +797,11 @@ static flash_sect_t find_sector (flash_info_t * info, ulong addr)
|
|||
static int flash_write_cfiword (flash_info_t * info, ulong dest,
|
||||
cfiword_t cword)
|
||||
{
|
||||
void *dstaddr;
|
||||
void *dstaddr = (void *)dest;
|
||||
int flag;
|
||||
flash_sect_t sect = 0;
|
||||
char sect_found = 0;
|
||||
|
||||
dstaddr = map_physmem(dest, info->portwidth, MAP_NOCACHE);
|
||||
|
||||
/* Check if Flash is (sufficiently) erased */
|
||||
switch (info->portwidth) {
|
||||
case FLASH_CFI_8BIT:
|
||||
|
@ -827,10 +820,8 @@ static int flash_write_cfiword (flash_info_t * info, ulong dest,
|
|||
flag = 0;
|
||||
break;
|
||||
}
|
||||
if (!flag) {
|
||||
unmap_physmem(dstaddr, info->portwidth);
|
||||
if (!flag)
|
||||
return ERR_NOT_ERASED;
|
||||
}
|
||||
|
||||
/* Disable interrupts which might cause a timeout here */
|
||||
flag = disable_interrupts ();
|
||||
|
@ -873,8 +864,6 @@ static int flash_write_cfiword (flash_info_t * info, ulong dest,
|
|||
if (flag)
|
||||
enable_interrupts ();
|
||||
|
||||
unmap_physmem(dstaddr, info->portwidth);
|
||||
|
||||
if (!sect_found)
|
||||
sect = find_sector (info, dest);
|
||||
|
||||
|
@ -890,7 +879,7 @@ static int flash_write_cfibuffer (flash_info_t * info, ulong dest, uchar * cp,
|
|||
int cnt;
|
||||
int retcode;
|
||||
void *src = cp;
|
||||
void *dst = map_physmem(dest, len, MAP_NOCACHE);
|
||||
void *dst = (void *)dest;
|
||||
void *dst2 = dst;
|
||||
int flag = 0;
|
||||
uint offset = 0;
|
||||
|
@ -1052,7 +1041,6 @@ static int flash_write_cfibuffer (flash_info_t * info, ulong dest, uchar * cp,
|
|||
}
|
||||
|
||||
out_unmap:
|
||||
unmap_physmem(dst, len);
|
||||
return retcode;
|
||||
}
|
||||
#endif /* CONFIG_SYS_FLASH_USE_BUFFER_WRITE */
|
||||
|
@ -1301,7 +1289,7 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
|
|||
/* handle unaligned start */
|
||||
if ((aln = addr - wp) != 0) {
|
||||
cword.l = 0;
|
||||
p = map_physmem(wp, info->portwidth, MAP_NOCACHE);
|
||||
p = (uchar *)wp;
|
||||
for (i = 0; i < aln; ++i)
|
||||
flash_add_byte (info, &cword, flash_read8(p + i));
|
||||
|
||||
|
@ -1313,7 +1301,6 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
|
|||
flash_add_byte (info, &cword, flash_read8(p + i));
|
||||
|
||||
rc = flash_write_cfiword (info, wp, cword);
|
||||
unmap_physmem(p, info->portwidth);
|
||||
if (rc != 0)
|
||||
return rc;
|
||||
|
||||
|
@ -1372,14 +1359,13 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
|
|||
* handle unaligned tail bytes
|
||||
*/
|
||||
cword.l = 0;
|
||||
p = map_physmem(wp, info->portwidth, MAP_NOCACHE);
|
||||
p = (uchar *)wp;
|
||||
for (i = 0; (i < info->portwidth) && (cnt > 0); ++i) {
|
||||
flash_add_byte (info, &cword, *src++);
|
||||
--cnt;
|
||||
}
|
||||
for (; i < info->portwidth; ++i)
|
||||
flash_add_byte (info, &cword, flash_read8(p + i));
|
||||
unmap_physmem(p, info->portwidth);
|
||||
|
||||
return flash_write_cfiword (info, wp, cword);
|
||||
}
|
||||
|
@ -1618,7 +1604,7 @@ static void flash_read_jedec_ids (flash_info_t * info)
|
|||
* board_flash_get_legacy needs to fill in at least:
|
||||
* info->portwidth, info->chipwidth and info->interface for Jedec probing.
|
||||
*/
|
||||
static int flash_detect_legacy(ulong base, int banknum)
|
||||
static int flash_detect_legacy(phys_addr_t base, int banknum)
|
||||
{
|
||||
flash_info_t *info = &flash_info[banknum];
|
||||
|
||||
|
@ -1634,7 +1620,10 @@ static int flash_detect_legacy(ulong base, int banknum)
|
|||
|
||||
for (i = 0; i < sizeof(modes) / sizeof(modes[0]); i++) {
|
||||
info->vendor = modes[i];
|
||||
info->start[0] = base;
|
||||
info->start[0] =
|
||||
(ulong)map_physmem(base,
|
||||
info->portwidth,
|
||||
MAP_NOCACHE);
|
||||
if (info->portwidth == FLASH_CFI_8BIT
|
||||
&& info->interface == FLASH_CFI_X8X16) {
|
||||
info->addr_unlock1 = 0x2AAA;
|
||||
|
@ -1648,8 +1637,11 @@ static int flash_detect_legacy(ulong base, int banknum)
|
|||
info->manufacturer_id,
|
||||
info->device_id,
|
||||
info->device_id2);
|
||||
if (jedec_flash_match(info, base))
|
||||
if (jedec_flash_match(info, info->start[0]))
|
||||
break;
|
||||
else
|
||||
unmap_physmem((void *)info->start[0],
|
||||
MAP_NOCACHE);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1671,7 +1663,7 @@ static int flash_detect_legacy(ulong base, int banknum)
|
|||
return 0; /* use CFI */
|
||||
}
|
||||
#else
|
||||
static inline int flash_detect_legacy(ulong base, int banknum)
|
||||
static inline int flash_detect_legacy(phys_addr_t base, int banknum)
|
||||
{
|
||||
return 0; /* use CFI */
|
||||
}
|
||||
|
@ -1826,12 +1818,12 @@ static void flash_fixup_stm(flash_info_t *info, struct cfi_qry *qry)
|
|||
* The following code cannot be run from FLASH!
|
||||
*
|
||||
*/
|
||||
ulong flash_get_size (ulong base, int banknum)
|
||||
ulong flash_get_size (phys_addr_t base, int banknum)
|
||||
{
|
||||
flash_info_t *info = &flash_info[banknum];
|
||||
int i, j;
|
||||
flash_sect_t sect_cnt;
|
||||
unsigned long sector;
|
||||
phys_addr_t sector;
|
||||
unsigned long tmp;
|
||||
int size_ratio;
|
||||
uchar num_erase_regions;
|
||||
|
@ -1847,7 +1839,7 @@ ulong flash_get_size (ulong base, int banknum)
|
|||
info->legacy_unlock = 0;
|
||||
#endif
|
||||
|
||||
info->start[0] = base;
|
||||
info->start[0] = (ulong)map_physmem(base, info->portwidth, MAP_NOCACHE);
|
||||
|
||||
if (flash_detect_cfi (info, &qry)) {
|
||||
info->vendor = le16_to_cpu(qry.p_id);
|
||||
|
@ -1939,7 +1931,10 @@ ulong flash_get_size (ulong base, int banknum)
|
|||
printf("ERROR: too many flash sectors\n");
|
||||
break;
|
||||
}
|
||||
info->start[sect_cnt] = sector;
|
||||
info->start[sect_cnt] =
|
||||
(ulong)map_physmem(sector,
|
||||
info->portwidth,
|
||||
MAP_NOCACHE);
|
||||
sector += (erase_region_size * size_ratio);
|
||||
|
||||
/*
|
||||
|
@ -2016,7 +2011,7 @@ unsigned long flash_init (void)
|
|||
char *s = getenv("unlock");
|
||||
#endif
|
||||
|
||||
#define BANK_BASE(i) (((unsigned long [CFI_MAX_FLASH_BANKS])CONFIG_SYS_FLASH_BANKS_LIST)[i])
|
||||
#define BANK_BASE(i) (((phys_addr_t [CFI_MAX_FLASH_BANKS])CONFIG_SYS_FLASH_BANKS_LIST)[i])
|
||||
|
||||
/* Init: no FLASHes known */
|
||||
for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; ++i) {
|
||||
|
|
|
@ -37,10 +37,6 @@
|
|||
|
||||
#define P_ID_AMD_STD CFI_CMDSET_AMD_LEGACY
|
||||
|
||||
/* Manufacturers */
|
||||
#define MANUFACTURER_AMD 0x0001
|
||||
#define MANUFACTURER_SST 0x00BF
|
||||
|
||||
/* AMD */
|
||||
#define AM29DL800BB 0x22CB
|
||||
#define AM29DL800BT 0x224A
|
||||
|
@ -172,7 +168,7 @@ struct amd_flash_info {
|
|||
static const struct amd_flash_info jedec_table[] = {
|
||||
#ifdef CONFIG_SYS_FLASH_LEGACY_256Kx8
|
||||
{
|
||||
.mfr_id = MANUFACTURER_SST,
|
||||
.mfr_id = (u16)SST_MANUFACT,
|
||||
.dev_id = SST39LF020,
|
||||
.name = "SST 39LF020",
|
||||
.uaddr = {
|
||||
|
@ -188,7 +184,7 @@ static const struct amd_flash_info jedec_table[] = {
|
|||
#endif
|
||||
#ifdef CONFIG_SYS_FLASH_LEGACY_512Kx8
|
||||
{
|
||||
.mfr_id = MANUFACTURER_AMD,
|
||||
.mfr_id = (u16)AMD_MANUFACT,
|
||||
.dev_id = AM29LV040B,
|
||||
.name = "AMD AM29LV040B",
|
||||
.uaddr = {
|
||||
|
@ -202,7 +198,7 @@ static const struct amd_flash_info jedec_table[] = {
|
|||
}
|
||||
},
|
||||
{
|
||||
.mfr_id = MANUFACTURER_SST,
|
||||
.mfr_id = (u16)SST_MANUFACT,
|
||||
.dev_id = SST39LF040,
|
||||
.name = "SST 39LF040",
|
||||
.uaddr = {
|
||||
|
@ -216,7 +212,7 @@ static const struct amd_flash_info jedec_table[] = {
|
|||
}
|
||||
},
|
||||
{
|
||||
.mfr_id = STM_MANUFACT,
|
||||
.mfr_id = (u16)STM_MANUFACT,
|
||||
.dev_id = STM_ID_M29W040B,
|
||||
.name = "ST Micro M29W040B",
|
||||
.uaddr = {
|
||||
|
@ -232,7 +228,7 @@ static const struct amd_flash_info jedec_table[] = {
|
|||
#endif
|
||||
#ifdef CONFIG_SYS_FLASH_LEGACY_512Kx16
|
||||
{
|
||||
.mfr_id = MANUFACTURER_AMD,
|
||||
.mfr_id = (u16)AMD_MANUFACT,
|
||||
.dev_id = AM29LV400BB,
|
||||
.name = "AMD AM29LV400BB",
|
||||
.uaddr = {
|
||||
|
@ -249,7 +245,7 @@ static const struct amd_flash_info jedec_table[] = {
|
|||
}
|
||||
},
|
||||
{
|
||||
.mfr_id = MANUFACTURER_AMD,
|
||||
.mfr_id = (u16)AMD_MANUFACT,
|
||||
.dev_id = AM29LV800BB,
|
||||
.name = "AMD AM29LV800BB",
|
||||
.uaddr = {
|
||||
|
|
|
@ -33,7 +33,7 @@ typedef struct {
|
|||
ulong size; /* total bank size in bytes */
|
||||
ushort sector_count; /* number of erase units */
|
||||
ulong flash_id; /* combined device & manufacturer code */
|
||||
ulong start[CONFIG_SYS_MAX_FLASH_SECT]; /* physical sector start addresses */
|
||||
ulong start[CONFIG_SYS_MAX_FLASH_SECT]; /* virtual sector start address */
|
||||
uchar protect[CONFIG_SYS_MAX_FLASH_SECT]; /* sector protection status */
|
||||
#ifdef CONFIG_SYS_FLASH_CFI
|
||||
uchar portwidth; /* the width of the port */
|
||||
|
|
Loading…
Reference in a new issue