diff options
Diffstat (limited to 'board/bmw/flash.c')
| -rw-r--r-- | board/bmw/flash.c | 418 | 
1 files changed, 208 insertions, 210 deletions
| diff --git a/board/bmw/flash.c b/board/bmw/flash.c index be622743f..e04af976f 100644 --- a/board/bmw/flash.c +++ b/board/bmw/flash.c @@ -91,7 +91,6 @@ byte_parity_odd(unsigned char x)  #endif /* 0 */ -  static unsigned long  flash_id(unsigned char mfct, unsigned char chip)  { @@ -135,7 +134,6 @@ flash_id(unsigned char mfct, unsigned char chip)  } -  unsigned long  flash_init(void)  { @@ -181,9 +179,9 @@ flash_init(void)      switch(pflinfo->flash_id & FLASH_TYPEMASK)      {        case FLASH_AM040: -        pflinfo->size = 0x00080000; +	pflinfo->size = 0x00080000;  	pflinfo->sector_count = 8; -        for(j = 0; j < 8; j++) +	for(j = 0; j < 8; j++)  	{  	  pflinfo->start[j] = base_address + 0x00010000 * j;  	  pflinfo->protect[j] = flash[(j << 16) | 0x2]; @@ -201,16 +199,16 @@ flash_init(void)  	  pflinfo->start[j+3] = base_address + 0x00010000 * j;  	}  #if 0 -        /* check for protected sectors */ -        for (j = 0; j < pflinfo->sector_count; j++) { -          /* read sector protection at sector address, (A7 .. A0) = 0x02 */ -          /* D0 = 1 if protected */ -          addr2 = (volatile FLASH_WORD_SIZE *)(pflinfo->start[j]); -            if (pflinfo->flash_id & FLASH_MAN_SST) -              pflinfo->protect[j] = 0; -            else -              pflinfo->protect[j] = addr2[2] & 1; -        } +	/* check for protected sectors */ +	for (j = 0; j < pflinfo->sector_count; j++) { +	  /* read sector protection at sector address, (A7 .. A0) = 0x02 */ +	  /* D0 = 1 if protected */ +	  addr2 = (volatile FLASH_WORD_SIZE *)(pflinfo->start[j]); +	    if (pflinfo->flash_id & FLASH_MAN_SST) +	      pflinfo->protect[j] = 0; +	    else +	      pflinfo->protect[j] = addr2[2] & 1; +	}  #endif  	break;      } @@ -245,30 +243,30 @@ flash_get_offsets (ulong base, flash_info_t *info)      int i;      /* set up sector start address table */ -        if (info->flash_id & FLASH_MAN_SST) -          { -            for (i = 0; i < info->sector_count; i++) -              info->start[i] = base + (i * 0x00010000); -          } -        else +	if (info->flash_id & FLASH_MAN_SST) +	  { +	    for (i = 0; i < info->sector_count; i++) +	      info->start[i] = base + (i * 0x00010000); +	  } +	else      if (info->flash_id & FLASH_BTYPE) { -        /* set sector offsets for bottom boot block type    */ -        info->start[0] = base + 0x00000000; -        info->start[1] = base + 0x00004000; -        info->start[2] = base + 0x00006000; -        info->start[3] = base + 0x00008000; -        for (i = 4; i < info->sector_count; i++) { -            info->start[i] = base + (i * 0x00010000) - 0x00030000; -        } +	/* set sector offsets for bottom boot block type    */ +	info->start[0] = base + 0x00000000; +	info->start[1] = base + 0x00004000; +	info->start[2] = base + 0x00006000; +	info->start[3] = base + 0x00008000; +	for (i = 4; i < info->sector_count; i++) { +	    info->start[i] = base + (i * 0x00010000) - 0x00030000; +	}      } else { -        /* set sector offsets for top boot block type       */ -        i = info->sector_count - 1; -        info->start[i--] = base + info->size - 0x00004000; -        info->start[i--] = base + info->size - 0x00006000; -        info->start[i--] = base + info->size - 0x00008000; -        for (; i >= 0; i--) { -            info->start[i] = base + i * 0x00010000; -        } +	/* set sector offsets for top boot block type       */ +	i = info->sector_count - 1; +	info->start[i--] = base + info->size - 0x00004000; +	info->start[i--] = base + info->size - 0x00006000; +	info->start[i--] = base + info->size - 0x00008000; +	for (; i >= 0; i--) { +	    info->start[i] = base + i * 0x00010000; +	}      }  } @@ -367,7 +365,7 @@ flash_get_size (vu_long *addr, flash_info_t *info)     short i;      FLASH_WORD_SIZE value;      ulong base = (ulong)addr; -        volatile FLASH_WORD_SIZE *addr2 = (FLASH_WORD_SIZE *)addr; +	volatile FLASH_WORD_SIZE *addr2 = (FLASH_WORD_SIZE *)addr;      printf("flash_get_size: \n");      /* Write auto select command: read Manufacturer ID */ @@ -379,123 +377,123 @@ flash_get_size (vu_long *addr, flash_info_t *info)      switch (value) {      case (FLASH_WORD_SIZE)AMD_MANUFACT: -        info->flash_id = FLASH_MAN_AMD; -        break; +	info->flash_id = FLASH_MAN_AMD; +	break;      case (FLASH_WORD_SIZE)FUJ_MANUFACT: -        info->flash_id = FLASH_MAN_FUJ; -        break; +	info->flash_id = FLASH_MAN_FUJ; +	break;      case (FLASH_WORD_SIZE)SST_MANUFACT: -        info->flash_id = FLASH_MAN_SST; -        break; +	info->flash_id = FLASH_MAN_SST; +	break;      default: -        info->flash_id = FLASH_UNKNOWN; -        info->sector_count = 0; -        info->size = 0; -        return (0);         /* no or unknown flash  */ +	info->flash_id = FLASH_UNKNOWN; +	info->sector_count = 0; +	info->size = 0; +	return (0);         /* no or unknown flash  */      }      printf("recognised manufacturer");      value = addr2[ADDR3];          /* device ID        */ -        debug ("\ndev_code=%x\n", value); +	debug ("\ndev_code=%x\n", value);      switch (value) {      case (FLASH_WORD_SIZE)AMD_ID_LV400T: -        info->flash_id += FLASH_AM400T; -        info->sector_count = 11; -        info->size = 0x00080000; -        break;              /* => 0.5 MB        */ +	info->flash_id += FLASH_AM400T; +	info->sector_count = 11; +	info->size = 0x00080000; +	break;              /* => 0.5 MB        */      case (FLASH_WORD_SIZE)AMD_ID_LV400B: -        info->flash_id += FLASH_AM400B; -        info->sector_count = 11; -        info->size = 0x00080000; -        break;              /* => 0.5 MB        */ +	info->flash_id += FLASH_AM400B; +	info->sector_count = 11; +	info->size = 0x00080000; +	break;              /* => 0.5 MB        */      case (FLASH_WORD_SIZE)AMD_ID_LV800T: -        info->flash_id += FLASH_AM800T; -        info->sector_count = 19; -        info->size = 0x00100000; -        break;              /* => 1 MB      */ +	info->flash_id += FLASH_AM800T; +	info->sector_count = 19; +	info->size = 0x00100000; +	break;              /* => 1 MB      */      case (FLASH_WORD_SIZE)AMD_ID_LV800B: -        info->flash_id += FLASH_AM800B; -        info->sector_count = 19; -        info->size = 0x00100000; -        break;              /* => 1 MB      */ +	info->flash_id += FLASH_AM800B; +	info->sector_count = 19; +	info->size = 0x00100000; +	break;              /* => 1 MB      */      case (FLASH_WORD_SIZE)AMD_ID_LV160T: -        info->flash_id += FLASH_AM160T; -        info->sector_count = 35; -        info->size = 0x00200000; -        break;              /* => 2 MB      */ +	info->flash_id += FLASH_AM160T; +	info->sector_count = 35; +	info->size = 0x00200000; +	break;              /* => 2 MB      */      case (FLASH_WORD_SIZE)AMD_ID_LV160B: -        info->flash_id += FLASH_AM160B; -        info->sector_count = 35; -        info->size = 0x00200000; -        break;              /* => 2 MB      */ +	info->flash_id += FLASH_AM160B; +	info->sector_count = 35; +	info->size = 0x00200000; +	break;              /* => 2 MB      */      case (FLASH_WORD_SIZE)SST_ID_xF800A: -        info->flash_id += FLASH_SST800A; -        info->sector_count = 16; -        info->size = 0x00100000; -        break;              /* => 1 MB      */ +	info->flash_id += FLASH_SST800A; +	info->sector_count = 16; +	info->size = 0x00100000; +	break;              /* => 1 MB      */      case (FLASH_WORD_SIZE)SST_ID_xF160A: -        info->flash_id += FLASH_SST160A; -        info->sector_count = 32; -        info->size = 0x00200000; -        break;              /* => 2 MB      */ +	info->flash_id += FLASH_SST160A; +	info->sector_count = 32; +	info->size = 0x00200000; +	break;              /* => 2 MB      */      case (FLASH_WORD_SIZE)AMD_ID_F040B: -        info->flash_id += FLASH_AM040; -        info->sector_count = 8; -        info->size = 0x00080000; -        break;              /* => 0.5 MB      */ +	info->flash_id += FLASH_AM040; +	info->sector_count = 8; +	info->size = 0x00080000; +	break;              /* => 0.5 MB      */      default: -        info->flash_id = FLASH_UNKNOWN; -        return (0);         /* => no or unknown flash */ +	info->flash_id = FLASH_UNKNOWN; +	return (0);         /* => no or unknown flash */      }      printf("flash id %lx; sector count %x, size %lx\n", info->flash_id,info->sector_count,info->size);      /* set up sector start address table */ -        if (info->flash_id & FLASH_MAN_SST) -          { -            for (i = 0; i < info->sector_count; i++) -              info->start[i] = base + (i * 0x00010000); -          } -        else +	if (info->flash_id & FLASH_MAN_SST) +	  { +	    for (i = 0; i < info->sector_count; i++) +	      info->start[i] = base + (i * 0x00010000); +	  } +	else      if (info->flash_id & FLASH_BTYPE) { -        /* set sector offsets for bottom boot block type    */ -        info->start[0] = base + 0x00000000; -        info->start[1] = base + 0x00004000; -        info->start[2] = base + 0x00006000; -        info->start[3] = base + 0x00008000; -        for (i = 4; i < info->sector_count; i++) { -            info->start[i] = base + (i * 0x00010000) - 0x00030000; -        } +	/* set sector offsets for bottom boot block type    */ +	info->start[0] = base + 0x00000000; +	info->start[1] = base + 0x00004000; +	info->start[2] = base + 0x00006000; +	info->start[3] = base + 0x00008000; +	for (i = 4; i < info->sector_count; i++) { +	    info->start[i] = base + (i * 0x00010000) - 0x00030000; +	}      } else { -        /* set sector offsets for top boot block type       */ -        i = info->sector_count - 1; -        info->start[i--] = base + info->size - 0x00004000; -        info->start[i--] = base + info->size - 0x00006000; -        info->start[i--] = base + info->size - 0x00008000; -        for (; i >= 0; i--) { -            info->start[i] = base + i * 0x00010000; -        } +	/* set sector offsets for top boot block type       */ +	i = info->sector_count - 1; +	info->start[i--] = base + info->size - 0x00004000; +	info->start[i--] = base + info->size - 0x00006000; +	info->start[i--] = base + info->size - 0x00008000; +	for (; i >= 0; i--) { +	    info->start[i] = base + i * 0x00010000; +	}      }      /* check for protected sectors */      for (i = 0; i < info->sector_count; i++) { -        /* read sector protection at sector address, (A7 .. A0) = 0x02 */ -        /* D0 = 1 if protected */ -        addr2 = (volatile FLASH_WORD_SIZE *)(info->start[i]); -                if (info->flash_id & FLASH_MAN_SST) -                  info->protect[i] = 0; -                else -                  info->protect[i] = addr2[2] & 1; +	/* read sector protection at sector address, (A7 .. A0) = 0x02 */ +	/* D0 = 1 if protected */ +	addr2 = (volatile FLASH_WORD_SIZE *)(info->start[i]); +		if (info->flash_id & FLASH_MAN_SST) +		  info->protect[i] = 0; +		else +		  info->protect[i] = addr2[2] & 1;      }      /* @@ -503,7 +501,7 @@ flash_get_size (vu_long *addr, flash_info_t *info)       */      if (info->flash_id != FLASH_UNKNOWN) {         addr2 = (FLASH_WORD_SIZE *)info->start[0]; -        *addr2 = (FLASH_WORD_SIZE)0x00F000F0;   /* reset bank */ +	*addr2 = (FLASH_WORD_SIZE)0x00F000F0;   /* reset bank */      }      return (info->size); @@ -521,32 +519,32 @@ flash_erase(flash_info_t *info, int s_first, int s_last)      unsigned char sh8b;      if ((s_first < 0) || (s_first > s_last)) { -        if (info->flash_id == FLASH_UNKNOWN) { -            printf ("- missing\n"); -        } else { -            printf ("- no sectors to erase\n"); -        } -        return 1; +	if (info->flash_id == FLASH_UNKNOWN) { +	    printf ("- missing\n"); +	} else { +	    printf ("- no sectors to erase\n"); +	} +	return 1;      }      if ((info->flash_id == FLASH_UNKNOWN) || -        (info->flash_id > (FLASH_MAN_STM | FLASH_AMD_COMP))) { -        printf ("Can't erase unknown flash type - aborted\n"); -        return 1; +	(info->flash_id > (FLASH_MAN_STM | FLASH_AMD_COMP))) { +	printf ("Can't erase unknown flash type - aborted\n"); +	return 1;      }      prot = 0;      for (sect=s_first; sect<=s_last; ++sect) { -        if (info->protect[sect]) { -            prot++; -        } +	if (info->protect[sect]) { +	    prot++; +	}      }      if (prot) { -        printf ("- Warning: %d protected sectors will not be erased!\n", -            prot); +	printf ("- Warning: %d protected sectors will not be erased!\n", +	    prot);      } else { -        printf ("\n"); +	printf ("\n");      }      l_sect = -1; @@ -568,28 +566,28 @@ flash_erase(flash_info_t *info, int s_first, int s_last)      /* Start erase on unprotected sectors */      for (sect = s_first; sect<=s_last; sect++) { -        if (info->protect[sect] == 0) { /* not protected */ -            addr = (FLASH_WORD_SIZE *)(info->start[0] + ( +	if (info->protect[sect] == 0) { /* not protected */ +	    addr = (FLASH_WORD_SIZE *)(info->start[0] + (  				(info->start[sect] - info->start[0]) << sh8b)); -                        if (info->flash_id & FLASH_MAN_SST) -                          { -                            addr[ADDR0 << sh8b] = (FLASH_WORD_SIZE)0x00AA00AA; -                            addr[ADDR1 << sh8b] = (FLASH_WORD_SIZE)0x00550055; -                            addr[ADDR0 << sh8b] = (FLASH_WORD_SIZE)0x00800080; -                            addr[ADDR0 << sh8b] = (FLASH_WORD_SIZE)0x00AA00AA; -                            addr[ADDR1 << sh8b] = (FLASH_WORD_SIZE)0x00550055; -                            addr[0] = (FLASH_WORD_SIZE)0x00500050;  /* block erase */ -                            udelay(30000);  /* wait 30 ms */ -                          } -                        else -                          addr[0] = (FLASH_WORD_SIZE)0x00300030;  /* sector erase */ -            l_sect = sect; -        } +			if (info->flash_id & FLASH_MAN_SST) +			  { +			    addr[ADDR0 << sh8b] = (FLASH_WORD_SIZE)0x00AA00AA; +			    addr[ADDR1 << sh8b] = (FLASH_WORD_SIZE)0x00550055; +			    addr[ADDR0 << sh8b] = (FLASH_WORD_SIZE)0x00800080; +			    addr[ADDR0 << sh8b] = (FLASH_WORD_SIZE)0x00AA00AA; +			    addr[ADDR1 << sh8b] = (FLASH_WORD_SIZE)0x00550055; +			    addr[0] = (FLASH_WORD_SIZE)0x00500050;  /* block erase */ +			    udelay(30000);  /* wait 30 ms */ +			  } +			else +			  addr[0] = (FLASH_WORD_SIZE)0x00300030;  /* sector erase */ +	    l_sect = sect; +	}      }      /* re-enable interrupts if necessary */      if (flag) -        enable_interrupts(); +	enable_interrupts();      /* wait at least 80us - let's wait 1 ms */      udelay (1000); @@ -598,22 +596,22 @@ flash_erase(flash_info_t *info, int s_first, int s_last)       * We wait for the last triggered sector       */      if (l_sect < 0) -        goto DONE; +	goto DONE;      start = get_timer (0);      last  = start;      addr = (FLASH_WORD_SIZE *)(info->start[0] + (  			(info->start[l_sect] - info->start[0]) << sh8b));      while ((addr[0] & (FLASH_WORD_SIZE)0x00800080) != (FLASH_WORD_SIZE)0x00800080) { -        if ((now = get_timer(start)) > CFG_FLASH_ERASE_TOUT) { -            printf ("Timeout\n"); -            return 1; -        } -        /* show that we're waiting */ -        if ((now - last) > 1000) {  /* every second */ -            serial_putc ('.'); -            last = now; -        } +	if ((now = get_timer(start)) > CFG_FLASH_ERASE_TOUT) { +	    printf ("Timeout\n"); +	    return 1; +	} +	/* show that we're waiting */ +	if ((now - last) > 1000) {  /* every second */ +	    serial_putc ('.'); +	    last = now; +	}      }  DONE: @@ -643,42 +641,42 @@ int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)       * handle unaligned start bytes       */      if ((l = addr - wp) != 0) { -        data = 0; -        for (i=0, cp=wp; i<l; ++i, ++cp) { -            data = (data << 8) | (*(uchar *)cp); -        } -        for (; i<4 && cnt>0; ++i) { -            data = (data << 8) | *src++; -            --cnt; -            ++cp; -        } -        for (; cnt==0 && i<4; ++i, ++cp) { -            data = (data << 8) | (*(uchar *)cp); -        } +	data = 0; +	for (i=0, cp=wp; i<l; ++i, ++cp) { +	    data = (data << 8) | (*(uchar *)cp); +	} +	for (; i<4 && cnt>0; ++i) { +	    data = (data << 8) | *src++; +	    --cnt; +	    ++cp; +	} +	for (; cnt==0 && i<4; ++i, ++cp) { +	    data = (data << 8) | (*(uchar *)cp); +	} -        if ((rc = write_word(info, wp, data)) != 0) { -            return (rc); -        } -        wp += 4; +	if ((rc = write_word(info, wp, data)) != 0) { +	    return (rc); +	} +	wp += 4;      }      /*       * handle word aligned part       */      while (cnt >= 4) { -        data = 0; -        for (i=0; i<4; ++i) { -            data = (data << 8) | *src++; -        } -        if ((rc = write_word(info, wp, data)) != 0) { -            return (rc); -        } -        wp  += 4; -        cnt -= 4; +	data = 0; +	for (i=0; i<4; ++i) { +	    data = (data << 8) | *src++; +	} +	if ((rc = write_word(info, wp, data)) != 0) { +	    return (rc); +	} +	wp  += 4; +	cnt -= 4;      }      if (cnt == 0) { -        return (0); +	return (0);      }      /* @@ -686,11 +684,11 @@ int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)       */      data = 0;      for (i=0, cp=wp; i<4 && cnt>0; ++i, ++cp) { -        data = (data << 8) | *src++; -        --cnt; +	data = (data << 8) | *src++; +	--cnt;      }      for (; i<4; ++i, ++cp) { -        data = (data << 8) | (*(uchar *)cp); +	data = (data << 8) | (*(uchar *)cp);      }      return (write_word(info, wp, data)); @@ -704,12 +702,12 @@ int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)   */  static int write_word (flash_info_t *info, ulong dest, ulong data)  { -        volatile FLASH_WORD_SIZE *addr2 = (FLASH_WORD_SIZE *)info->start[0]; -        volatile FLASH_WORD_SIZE *dest2; -        volatile FLASH_WORD_SIZE *data2 = (FLASH_WORD_SIZE *)&data; +	volatile FLASH_WORD_SIZE *addr2 = (FLASH_WORD_SIZE *)info->start[0]; +	volatile FLASH_WORD_SIZE *dest2; +	volatile FLASH_WORD_SIZE *data2 = (FLASH_WORD_SIZE *)&data;      ulong start;      int flag; -        int i; +	int i;      unsigned char sh8b;      /* Check the ROM CS */ @@ -723,32 +721,32 @@ static int write_word (flash_info_t *info, ulong dest, ulong data)      /* Check if Flash is (sufficiently) erased */      if ((*dest2 & (FLASH_WORD_SIZE)data) != (FLASH_WORD_SIZE)data) { -        return (2); +	return (2);      }      /* Disable interrupts which might cause a timeout here */      flag = disable_interrupts(); -        for (i=0; i<4/sizeof(FLASH_WORD_SIZE); i++) -          { -            addr2[ADDR0 << sh8b] = (FLASH_WORD_SIZE)0x00AA00AA; -            addr2[ADDR1 << sh8b] = (FLASH_WORD_SIZE)0x00550055; -            addr2[ADDR0 << sh8b] = (FLASH_WORD_SIZE)0x00A000A0; +	for (i=0; i<4/sizeof(FLASH_WORD_SIZE); i++) +	  { +	    addr2[ADDR0 << sh8b] = (FLASH_WORD_SIZE)0x00AA00AA; +	    addr2[ADDR1 << sh8b] = (FLASH_WORD_SIZE)0x00550055; +	    addr2[ADDR0 << sh8b] = (FLASH_WORD_SIZE)0x00A000A0; -            dest2[i << sh8b] = data2[i]; +	    dest2[i << sh8b] = data2[i]; -            /* re-enable interrupts if necessary */ -            if (flag) -              enable_interrupts(); +	    /* re-enable interrupts if necessary */ +	    if (flag) +	      enable_interrupts(); -            /* data polling for D7 */ -            start = get_timer (0); -            while ((dest2[i << sh8b] & (FLASH_WORD_SIZE)0x00800080) != -                   (data2[i] & (FLASH_WORD_SIZE)0x00800080)) { -              if (get_timer(start) > CFG_FLASH_WRITE_TOUT) { -                return (1); -              } -            } -          } +	    /* data polling for D7 */ +	    start = get_timer (0); +	    while ((dest2[i << sh8b] & (FLASH_WORD_SIZE)0x00800080) != +		   (data2[i] & (FLASH_WORD_SIZE)0x00800080)) { +	      if (get_timer(start) > CFG_FLASH_WRITE_TOUT) { +		return (1); +	      } +	    } +	  }      return (0);  } |