File indexing completed on 2025-05-11 08:23:51
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046 #include <bsp.h>
0047 #include <stdio.h>
0048 #include <inttypes.h>
0049
0050 #define STATIC static
0051
0052 #include <bsp/flashPgmPvt.h>
0053
0054
0055
0056 #define SYS_FLASHA_WP (1<<5)
0057 #define SYS_FBOOTB_WP (1<<3)
0058 #define SYS_FBA_WP_HDR (1<<2)
0059 #define SYS_FBOOTB_WP_HDR (1<<1)
0060
0061 #define SYS_STATUS_2_REG (1)
0062
0063
0064 STATIC struct bankdesc *
0065 bankcheck(int bank, int quiet);
0066
0067 static int
0068 flash_wp(int bank, int enbl);
0069
0070 STATIC uint32_t
0071 read_us_timer(void);
0072
0073
0074
0075
0076 static struct bankdesc mvme5500Flash[] = {
0077 { 0, 2 },
0078 { 0xf2000000, 0x08000000, 0x20000*2, 2, BSP_flash_vendor_intel, 0, 0, 0, },
0079 { 0xff800000, 0x00800000, 0x20000*2, 2, BSP_flash_vendor_intel, 0, 0, 0, },
0080 };
0081
0082
0083 static struct bankdesc mvme6100Flash[] = {
0084 { 0, 2 },
0085 { 0xf4000000, 0x04000000, 0x20000*2, 2, BSP_flash_vendor_intel, 0, 0, 0, },
0086 { 0xf8000000, 0x04000000, 0x20000*2, 2, BSP_flash_vendor_intel, 0, 0, 0, },
0087 };
0088
0089 struct flash_bsp_ops BSP_flashBspOps = {
0090 bankcheck : bankcheck,
0091 flash_wp : flash_wp,
0092 read_us_timer: read_us_timer,
0093 };
0094
0095
0096
0097
0098
0099 static int
0100 flash_wp(int bank, int enbl)
0101 {
0102 BSP_BoardType b;
0103 A8 p;
0104 unsigned char hwp = 0, swp;
0105
0106
0107 if ( !bankcheck( bank, 0 ) )
0108 return -1;
0109
0110 switch ( (b=BSP_getBoardType()) ) {
0111 default:
0112 fprintf(stderr,"Unknown board type %i\n",b);
0113 return -1;
0114
0115 case MVME5500:
0116
0117 p = (A8)(BSP_MV64x60_DEV1_BASE + SYS_STATUS_2_REG);
0118 swp = SYS_FLASHA_WP;
0119 break;
0120
0121 case MVME6100:
0122 {
0123
0124 p = (A8)(BSP_MV64x60_DEV1_BASE + SYS_STATUS_2_REG);
0125 if ( 0 == bank ) {
0126 hwp = SYS_FBA_WP_HDR;
0127 swp = SYS_FLASHA_WP;
0128 } else {
0129 hwp = SYS_FBOOTB_WP_HDR;
0130 swp = SYS_FBOOTB_WP;
0131 }
0132 if ( enbl && (*p & hwp) ) {
0133 fprintf(stderr,"HW write protection enabled (jumper)\n");
0134 return -1;
0135 }
0136 }
0137 break;
0138 }
0139 if ( -1 == enbl ) {
0140
0141 return *p & (swp | hwp);
0142 } else {
0143 if ( enbl ) {
0144 *p |= swp;
0145 } else {
0146 *p &= ~swp;
0147 }
0148 }
0149 return 0;
0150 }
0151
0152
0153 STATIC struct bankdesc *
0154 bankcheck(int bank, int quiet)
0155 {
0156 struct bankdesc *b;
0157 switch ( BSP_getBoardType() ) {
0158 case MVME5500: b = mvme5500Flash; break;
0159 case MVME6100: b = mvme6100Flash; break;
0160 default:
0161 fprintf(stderr,"Unknown/unsupported board type\n");
0162 return 0;
0163 }
0164 if ( bank >= b->size || bank < 0 ) {
0165 if ( !quiet )
0166 fprintf(stderr,"Invalid flash bank #: %i; (too big)\n", bank);
0167 return 0;
0168 }
0169 return b + bank + 1;
0170 }
0171
0172 STATIC uint32_t read_us_timer(void)
0173 {
0174 uint32_t now, mhz;
0175
0176
0177 mhz = BSP_bus_frequency/BSP_time_base_divisor/1000;
0178
0179 asm volatile("mftb %0":"=r"(now));
0180
0181 return now/mhz;
0182 }