00001
00002
00003 #include "bus_lock.h"
00004
00005 #include <vxWorks.h>
00006 #include <taskLib.h>
00007 #include <logLib.h>
00008
00009 struct BL_ADDR_INFO
00010 {
00011 unsigned long addr;
00012 int board_type;
00013 };
00014
00015 int bus_lock_use_intlock = 1;
00016 void *test_bus_lock_addr = (void *) 0x4e00000;
00017 int test_buf_size = 0x4000;
00018 int test_bus_lock_board_type = VX_MVME162_BOARD_TYPE;
00019 static char c = 'a';
00020 int testBusLockQuit;
00021 int test_bus_lock_count = 0x4000;
00022 int intLockKey = 0;
00023
00024
00025
00026 void
00027 regWriteChar (char *addr, char c)
00028 {
00029 *addr = c;
00030 }
00031
00032 char
00033 regReadChar (char *addr)
00034 {
00035 return *addr;
00036 }
00037
00038 void
00039 regWriteShort (short *addr, short c)
00040 {
00041 *addr = c;
00042 }
00043
00044 short
00045 regReadShort (short *addr)
00046 {
00047 return *addr;
00048 }
00049
00050 void
00051 regWriteLong (long *addr, long c)
00052 {
00053 *addr = c;
00054 }
00055
00056 long
00057 regReadLong (long *addr)
00058 {
00059 return *addr;
00060 }
00061
00062 void
00063 regWriteULong (unsigned long *addr, unsigned long c)
00064 {
00065 *addr = c;
00066 }
00067
00068 unsigned long
00069 regReadULong (long *addr)
00070 {
00071 return *addr;
00072 }
00073
00074
00075
00076
00077 int
00078 testBusLockRead ()
00079 {
00080 struct BL_ADDR_INFO *info;
00081 char c1, c2;
00082 int i;
00083
00084 info =
00085 getBusLockInfo (test_bus_lock_board_type,
00086 (unsigned long) test_bus_lock_addr);
00087 if (0 == info)
00088 {
00089 return -1;
00090 }
00091 for (i = 0; i < test_bus_lock_count && !testBusLockQuit; i++)
00092 {
00093 enableBusLock (info);
00094 c1 = *((char *) test_bus_lock_addr);
00095 c2 = *((char *) test_bus_lock_addr + test_buf_size - 1);
00096 disableBusLock (info);
00097 if (c1 != c2)
00098 {
00099 logMsg (" %c != %c", c1, c2, 0, 0, 0, 0);
00100 return -1;
00101 }
00102 }
00103 }
00104
00105
00106
00107 int
00108 testBusLockWrite ()
00109 {
00110 struct BL_ADDR_INFO *info;
00111 int i;
00112
00113 info =
00114 getBusLockInfo (test_bus_lock_board_type,
00115 (unsigned long) test_bus_lock_addr);
00116 if (0 == info)
00117 {
00118 return -1;
00119 }
00120 for (i = 0; i < test_bus_lock_count && !testBusLockQuit; i++)
00121 {
00122 c++;
00123 if (c > 'z')
00124 {
00125 c = 'a';
00126 }
00127 enableBusLock (info);
00128 memset (test_bus_lock_addr, c, test_buf_size);
00129 disableBusLock (info);
00130 }
00131 freeBusLockInfo (info);
00132 return 0;
00133 }
00134
00135 struct BL_ADDR_INFO *
00136 getBusLockInfo (int board_type, unsigned long addr)
00137 {
00138 struct BL_ADDR_INFO *info;
00139 char vme_bus_enable_control_reg;
00140 unsigned long a1;
00141 unsigned long enda1;
00142 unsigned long starta1;
00143
00144 switch (board_type)
00145 {
00146 case VX_MVME162_BOARD_TYPE:
00147 info = (struct BL_ADDR_INFO *) malloc (sizeof (struct BL_ADDR_INFO));
00148 if (0 == info)
00149 {
00150 return 0;
00151 }
00152 info->addr = addr;
00153 info->board_type = board_type;
00154 return info;
00155
00156 default:
00157 break;
00158 }
00159 return (0);
00160 }
00161
00162 void
00163 freeBusLockInfo (struct BL_ADDR_INFO *info)
00164 {
00165 if (0 == info)
00166 {
00167 return;
00168 }
00169 free (info);
00170 }
00171
00172 int
00173 enableBusLock (struct BL_ADDR_INFO *info)
00174 {
00175 long requestor_control_register_val;
00176 long DHB = 0;
00177 int board_type;
00178 if (0 == info)
00179 {
00180 return -1;
00181 }
00182 #ifdef VXWORKS
00183 if (bus_lock_use_intlock)
00184 {
00185 intLockKey = intLock ();
00186 }
00187 else
00188 {
00189 taskLock ();
00190 }
00191 #endif
00192 board_type = info->board_type;
00193 switch (board_type)
00194 {
00195 case VX_MVME162_BOARD_TYPE:
00196 while (!DHB)
00197 {
00198 requestor_control_register_val = regReadLong ((long *) 0xFFF40030);
00199 DHB = requestor_control_register_val & (1 << 14);
00200 requestor_control_register_val |= (1 << 13);
00201 regWriteLong (((long *) 0xFFF40030),
00202 requestor_control_register_val);
00203 }
00204 return 0;
00205
00206 defualt:
00207 return -1;
00208 }
00209 return -1;
00210 }
00211
00212
00213
00214
00215
00216 int
00217 disableBusLock (struct BL_ADDR_INFO *info)
00218 {
00219 long requestor_control_register_val;
00220 long DHB = 0;
00221 long attribute_register;
00222 int board_type;
00223 if (0 == info)
00224 {
00225 return -1;
00226 }
00227 board_type = info->board_type;
00228 switch (board_type)
00229 {
00230 case VX_MVME162_BOARD_TYPE:
00231 requestor_control_register_val = regReadLong ((long *) 0xFFF40030);
00232 requestor_control_register_val &= ~(1 << 13);
00233 regWriteLong (((long *) 0xfff40030), requestor_control_register_val);
00234 #ifdef VXWORKS
00235 if (bus_lock_use_intlock)
00236 {
00237 intUnlock (intLockKey);
00238 }
00239 else
00240 {
00241 taskUnlock ();
00242 }
00243 #endif
00244 return 0;
00245 defualt:
00246 break;
00247 }
00248 #ifdef VXWORKS
00249 if (bus_lock_use_intlock)
00250 {
00251 intUnlock (intLockKey);
00252 }
00253 else
00254 {
00255 taskUnlock ();
00256 }
00257 #endif
00258 return -1;
00259 }