00001
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 #include "vxWorks.h"
00068 #include "vme.h"
00069 #include "memLib.h"
00070 #include "cacheLib.h"
00071 #include "sysLib.h"
00072 #include "config.h"
00073 #include "string.h"
00074 #include "intLib.h"
00075 #include "esf.h"
00076 #include "excLib.h"
00077 #include "logLib.h"
00078 #include "taskLib.h"
00079 #include "vxLib.h"
00080 #include "tyLib.h"
00081 #include "drv/end/dec21x40End.h"
00082 #include "arch/ppc/archPpc.h"
00083 #include "arch/ppc/mmu603Lib.h"
00084 #include "arch/ppc/vxPpcLib.h"
00085 #include "arch/ppc/excPpcLib.h"
00086 #include "private/vmLibP.h"
00087 #include "drv/pci/pciConfigLib.h"
00088 #include "kahluaMemParam.h"
00089 #include "sysMotVpd.h"
00090
00091
00092
00093 #define ZERO 0
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143 UINT32 sysBatDesc [2 * (_MMU_NUM_IBAT + _MMU_NUM_DBAT)] =
00144 {
00145 #ifndef APS_BSP
00146
00147
00148 ((ROM_BASE_ADRS & _MMU_UBAT_BEPI_MASK) | (_MMU_UBAT_BL_1M &
00149 ~(_MMU_UBAT_VS & _MMU_UBAT_VP))),
00150 ((ROM_BASE_ADRS & _MMU_LBAT_BRPN_MASK) | _MMU_LBAT_PP_RW |
00151 #else
00152 ((VME_A32_MSTR_BAT0 & _MMU_UBAT_BEPI_MASK) | _MMU_UBAT_BL_256M |
00153 _MMU_UBAT_VS | _MMU_UBAT_VP),
00154 ((VME_A32_MSTR_BAT0 & _MMU_LBAT_BRPN_MASK) | _MMU_LBAT_PP_RW |
00155 #endif
00156 _MMU_LBAT_CACHE_INHIBIT),
00157
00158
00159 #ifdef APS_BSP
00160 ((VME_A32_MSTR_BAT1 & _MMU_UBAT_BEPI_MASK) | _MMU_UBAT_BL_256M |
00161 _MMU_UBAT_VS | _MMU_UBAT_VP),
00162 ((VME_A32_MSTR_BAT1 & _MMU_LBAT_BRPN_MASK) | _MMU_LBAT_PP_RW |
00163 _MMU_LBAT_CACHE_INHIBIT),
00164 #endif
00165
00166 #ifndef APS_BSP
00167 0, 0,
00168
00169 #endif
00170
00171 #ifdef APS_BSP
00172 ((VME_A32_MSTR_BAT2 & _MMU_UBAT_BEPI_MASK) | _MMU_UBAT_BL_256M |
00173 _MMU_UBAT_VS | _MMU_UBAT_VP),
00174 ((VME_A32_MSTR_BAT2 & _MMU_LBAT_BRPN_MASK) | _MMU_LBAT_PP_RW |
00175 _MMU_LBAT_CACHE_INHIBIT),
00176 #endif
00177
00178 #ifndef APS_BSP
00179 0, 0,
00180
00181 #endif
00182
00183 #ifdef APS_BSP
00184 ((VME_A32_MSTR_BAT3 & _MMU_UBAT_BEPI_MASK) | _MMU_UBAT_BL_256M |
00185 _MMU_UBAT_VS | _MMU_UBAT_VP),
00186 ((VME_A32_MSTR_BAT3 & _MMU_LBAT_BRPN_MASK) | _MMU_LBAT_PP_RW |
00187 _MMU_LBAT_CACHE_INHIBIT),
00188 #endif
00189
00190 #ifndef APS_BSP
00191 0, 0,
00192
00193 #endif
00194
00195 #ifdef APS_BSP
00196 ((VME_A32_MSTR_BAT0 & _MMU_UBAT_BEPI_MASK) | _MMU_UBAT_BL_256M |
00197 _MMU_UBAT_VS | _MMU_UBAT_VP),
00198 ((VME_A32_MSTR_BAT0 & _MMU_LBAT_BRPN_MASK) | _MMU_LBAT_PP_RW |
00199 _MMU_LBAT_CACHE_INHIBIT | _MMU_LBAT_GUARDED),
00200 #endif
00201
00202 #ifndef APS_BSP
00203 0, 0,
00204
00205 #endif
00206
00207 #ifdef APS_BSP
00208 ((VME_A32_MSTR_BAT1 & _MMU_UBAT_BEPI_MASK) | _MMU_UBAT_BL_256M |
00209 _MMU_UBAT_VS | _MMU_UBAT_VP),
00210 ((VME_A32_MSTR_BAT1 & _MMU_LBAT_BRPN_MASK) | _MMU_LBAT_PP_RW |
00211 _MMU_LBAT_CACHE_INHIBIT | _MMU_LBAT_GUARDED),
00212 #endif
00213
00214 #ifndef APS_BSP
00215 0, 0,
00216
00217 #endif
00218
00219 #ifdef APS_BSP
00220 ((VME_A32_MSTR_BAT2 & _MMU_UBAT_BEPI_MASK) | _MMU_UBAT_BL_256M |
00221 _MMU_UBAT_VS | _MMU_UBAT_VP),
00222 ((VME_A32_MSTR_BAT2 & _MMU_LBAT_BRPN_MASK) | _MMU_LBAT_PP_RW |
00223 _MMU_LBAT_CACHE_INHIBIT | _MMU_LBAT_GUARDED),
00224 #endif
00225
00226 #ifndef APS_BSP
00227 0, 0,
00228
00229 #endif
00230
00231 #ifndef APS_BSP
00232
00233 0, 0
00234 #else
00235 ((VME_A32_MSTR_BAT3 & _MMU_UBAT_BEPI_MASK) | _MMU_UBAT_BL_256M |
00236 _MMU_UBAT_VS | _MMU_UBAT_VP),
00237 ((VME_A32_MSTR_BAT3 & _MMU_LBAT_BRPN_MASK) | _MMU_LBAT_PP_RW |
00238 _MMU_LBAT_CACHE_INHIBIT | _MMU_LBAT_GUARDED)
00239 #endif
00240 };
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271 PHYS_MEM_DESC sysPhysMemDesc [] =
00272 {
00273 {
00274
00275
00276 (void *) LOCAL_MEM_LOCAL_ADRS,
00277 (void *) LOCAL_MEM_LOCAL_ADRS,
00278 RAM_LOW_ADRS,
00279 VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE |
00280 VM_STATE_MASK_MEM_COHERENCY,
00281 VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE |
00282 VM_STATE_MEM_COHERENCY
00283 },
00284
00285
00286 {
00287
00288
00289 (void *) RAM_LOW_ADRS,
00290 (void *) RAM_LOW_ADRS,
00291 LOCAL_MEM_SIZE - RAM_LOW_ADRS,
00292 VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE |
00293 VM_STATE_MASK_MEM_COHERENCY,
00294 VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE |
00295 VM_STATE_MEM_COHERENCY
00296 },
00297
00298
00299
00300 {
00301 (void *) ISA_MSTR_IO_LOCAL,
00302 (void *) ISA_MSTR_IO_LOCAL,
00303 ISA_MSTR_IO_SIZE,
00304 VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE,
00305 VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT
00306 },
00307
00308
00309
00310 {
00311 (void *) PCI_MSTR_IO_LOCAL,
00312 (void *) PCI_MSTR_IO_LOCAL,
00313 PCI_MSTR_IO_SIZE,
00314 VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE,
00315 VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT
00316 },
00317
00318
00319
00320 {
00321 (void *) PCI_MSTR_MEMIO_LOCAL,
00322 (void *) PCI_MSTR_MEMIO_LOCAL,
00323 PCI_MSTR_MEMIO_SIZE,
00324 VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE,
00325 VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT
00326 },
00327
00328
00329
00330 {
00331 (void *) PCI_DYNAMIC_MEM_LOCAL,
00332 (void *) PCI_DYNAMIC_MEM_LOCAL,
00333 PCI_DYNAMIC_MEM_SIZE,
00334 VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE,
00335 VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT
00336 },
00337
00338
00339 #ifndef APS_BSP
00340 {
00341
00342 (void *) VME_A32_MSTR_LOCAL,
00343 (void *) VME_A32_MSTR_LOCAL,
00344 VME_A32_MSTR_SIZE,
00345 VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE,
00346 VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT
00347 },
00348 #else
00349
00350 #endif
00351
00352 {
00353 (void *) VME_A24_MSTR_LOCAL,
00354 (void *) VME_A24_MSTR_LOCAL,
00355 VME_A24_MSTR_SIZE,
00356 #ifndef APS_BSP
00357 VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE,
00358 VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT
00359 #else
00360 VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE |
00361 VM_STATE_MASK_GUARDED,
00362 VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT |
00363 VM_STATE_GUARDED
00364 #endif
00365 },
00366
00367 #ifndef APS_BSP
00368 {
00369
00370
00371 (void *) VME_LM_MSTR_LOCAL,
00372 (void *) VME_LM_MSTR_LOCAL,
00373 VME_LM_MSTR_SIZE,
00374 VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE,
00375 VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT
00376 },
00377 #else
00378
00379 #endif
00380
00381 {
00382
00383
00384 (void *) KAHLUA_EUMB_BASE,
00385 (void *) KAHLUA_EUMB_BASE,
00386 KAHLUA_EUMB_SIZE,
00387 VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE,
00388 VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT
00389 },
00390
00391 {
00392 #ifndef APS_BSP
00393 (void *) VME_A16_MSTR_LOCAL,
00394 (void *) VME_A16_MSTR_LOCAL,
00395 VME_A16_MSTR_SIZE,
00396 VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE,
00397 VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT
00398 #else
00399 (void *) VME_A16_MSTR_LOCAL,
00400 (void *) VME_A16_MSTR_LOCAL,
00401 VME_A16_MSTR_SIZE,
00402 VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE |
00403 VM_STATE_MASK_GUARDED,
00404 VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT |
00405 VM_STATE_GUARDED
00406 #endif
00407 },
00408
00409 {
00410
00411
00412 (void *) PCI_MSTR_IACK_WNDW_ADRS,
00413 (void *) PCI_MSTR_IACK_WNDW_ADRS,
00414 PCI_MSTR_IACK_SIZE,
00415 VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE,
00416 VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT
00417 },
00418
00419 #ifdef CHRP_ADRS_MAP
00420 {
00421
00422
00423 (void *) PCI_MSTR_PRIMARY_CAR,
00424 (void *) PCI_MSTR_PRIMARY_CAR,
00425 PCI_MSTR_PRIMARY_CAR_SIZE,
00426 VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE,
00427 VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT
00428 },
00429
00430 {
00431
00432
00433 (void *) PCI_MSTR_PRIMARY_CDR,
00434 (void *) PCI_MSTR_PRIMARY_CDR,
00435 PCI_MSTR_PRIMARY_CDR_SIZE,
00436 VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE,
00437 VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT
00438 },
00439 #endif
00440
00441 #ifndef CHRP_ADRS_MAP
00442 {
00443
00444
00445
00446 (void *) PCI_MSTR_DIRECT_MAP_ADRS,
00447 (void *) PCI_MSTR_DIRECT_MAP_ADRS,
00448 PCI_MSTR_DIRECT_SIZE,
00449 VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE,
00450 VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT
00451 },
00452 #endif
00453
00454 #ifndef APS_BSP
00455
00456 {
00457 (void *) FLASH_BASE_ADRS,
00458 (void *) FLASH_BASE_ADRS,
00459 FLASH_MEM_SIZE,
00460 VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE,
00461 VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT
00462 },
00463 #else
00464
00465
00466 {
00467 (void *) FLASH1_BASE_ADRS,
00468 (void *) FLASH1_BASE_ADRS,
00469 FLASH1_MEM_SIZE,
00470 VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE,
00471 VM_STATE_VALID | VM_STATE_WRITABLE_NOT | VM_STATE_CACHEABLE
00472 },
00473 #endif
00474
00475 #ifdef APS_BSP
00476
00477
00478 {
00479 (void *) FLASH0_BASE_ADRS,
00480 (void *) FLASH0_BASE_ADRS,
00481 FLASH0_MEM_SIZE,
00482 VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE,
00483 VM_STATE_VALID | VM_STATE_WRITABLE_NOT | VM_STATE_CACHEABLE_NOT
00484 },
00485
00486
00487
00488 {
00489 (void *) MV2100_SIO_BASE,
00490 (void *) MV2100_SIO_BASE,
00491 MV2100_SIO_SIZE,
00492 VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE,
00493 VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT
00494 }
00495 #endif
00496 };
00497
00498 int sysPhysMemDescNumEnt = NELEMENTS (sysPhysMemDesc);
00499
00500 int sysBus = VME_BUS;
00501 int sysCpu = CPU;
00502 char * sysBootLine = BOOT_LINE_ADRS;
00503 char * sysExcMsg = EXC_MSG_ADRS;
00504 int sysProcNum;
00505 int sysFlags;
00506 char sysBootHost [BOOT_FIELD_LEN];
00507 char sysBootFile [BOOT_FIELD_LEN];
00508 UINT sysVectorIRQ0 = INT_VEC_IRQ0;
00509 BOOL sysVmeEnable = FALSE;
00510 int pciToVmeDev;
00511 #ifdef APS_BSP
00512 LOCAL PART_ID a24memPartId = NULL;
00513 LOCAL ULONG a24memBase;
00514 LOCAL ULONG a24memBound;
00515 LOCAL ULONG a24adrOffset;
00516 LOCAL ULONG a24vmeBound;
00517 #endif
00518
00519
00520
00521 unsigned char lnEnetAddr [6] = { 0x08, 0x00, 0x3e, 0x00, 0x00, 0x00 };
00522 unsigned char clearWd [1] = { 0x00 };
00523
00524 #if defined(INCLUDE_PMC_SPAN) && !defined(INCLUDE_PCI_AUTOCONF)
00525
00526
00527
00528
00529
00530
00531
00532 PMC_SPAN sysPmcSpanParm [] =
00533 {
00534 {PCI_CFG_COMMAND, 2, P2P_PMC_DISABLE},
00535 {PCI_CFG_STATUS, 2, P2P_CLR_STATUS >> 16},
00536 {PCI_CFG_BRIDGE_CONTROL, 2, P2P_SEC_BUS_RESET},
00537 {PCI_CFG_CACHE_LINE_SIZE, 2, P2P_CACHE_LINE_SIZE | P2P_PRIM_LATENCY},
00538 {PCI_CFG_PRIMARY_BUS, 1, PCI_PRIMARY_BUS},
00539 {PCI_CFG_SECONDARY_BUS, 1, PCI_SECONDARY_BUS},
00540 {PCI_CFG_SUBORDINATE_BUS, 1, PCI_SUBORD_BUS},
00541 {PCI_CFG_SEC_STATUS, 2, P2P_CLR_STATUS >> 16},
00542 {PCI_CFG_IO_BASE, 2, ((P2P_IO_BASE & 0x0000F000) >> 8) |
00543 ((P2P_IO_BASE + P2P_IO_SIZE - 1) & 0x0000F000)},
00544 {PCI_CFG_MEM_BASE, 2, ((P2P_NONPREF_MEM_BASE & 0xFFF00000) >> 16)},
00545 {PCI_CFG_MEM_LIMIT, 2, ((P2P_NONPREF_MEM_BASE + P2P_NONPREF_MEM_SIZE - 1) & \
00546 0xFFF00000) >> 16},
00547 {PCI_CFG_PRE_MEM_BASE, 2, ((P2P_PREF_MEM_BASE & 0xFFF00000) >> 16)},
00548 {PCI_CFG_PRE_MEM_LIMIT, 2, ((P2P_PREF_MEM_BASE + P2P_PREF_MEM_SIZE - 1) & \
00549 0xFFF00000) >> 16},
00550 {PCI_CFG_PRE_MEM_BASE_U, 4, P2P_PREF_HI32_BASE},
00551 {PCI_CFG_PRE_MEM_LIMIT_U, 4, P2P_PREF_HI32_BASE},
00552 {PCI_CFG_IO_BASE_U, 2, ((P2P_IO_BASE & 0xFFFF0000) >> 16)},
00553 {PCI_CFG_IO_LIMIT_U, 2, ((P2P_IO_BASE + P2P_IO_SIZE - 1) & 0xFFFF0000) >> 16},
00554 {PCI_CFG_BRIDGE_CONTROL, 2, 0},
00555 {PCI_CFG_DEC21150_SEC_CLK, 2, P2P_CLK_ENABLE},
00556 {PCI_CFG_DEC21150_SERR_STAT, 1, (P2P_CLR_STATUS >> 16) & 0xFF},
00557 {PCI_CFG_STATUS, 2, P2P_CLR_STATUS >> 16},
00558 {PCI_CFG_COMMAND, 2, P2P_PMC_ENABLE}
00559 };
00560
00561 #define NUM_PMC_SPAN_PARMS (sizeof(sysPmcSpanParm) / sizeof(PMC_SPAN))
00562 #ifdef APS_BSP
00563 LOCAL STATUS sysPmcSpanConfig (int, int, int, PMC_SPAN *);
00564 #endif
00565 #endif
00566
00567
00568
00569 LOCAL char sysModelStr[80];
00570 LOCAL char wrongCpuMsg[] = WRONG_CPU_MSG;
00571
00572
00573
00574 void sysSpuriousIntHandler(void);
00575 #ifndef APS_BSP
00576 void sysCpuCheck (void);
00577 #else
00578 LOCAL void sysCpuCheck(void);
00579 #endif
00580 char * sysPhysMemTop (void);
00581 void sysDec21x40UpdateLoadStr (void);
00582 UCHAR sysNvRead(ULONG);
00583 void sysNvWrite(ULONG,UCHAR);
00584 void sysBusTasClear (volatile char *);
00585 #ifndef APS_BSP
00586 #if defined(INCLUDE_PMC_SPAN) && !defined(INCLUDE_PCI_AUTOCONF)
00587 STATUS sysPmcSpanConfig (int, int, int, PMC_SPAN *);
00588 #endif
00589 STATUS sysBusProbe (char *, int, int, char *);
00590 IMPORT UINT sysHid1Get(void);
00591 #else
00592 LOCAL STATUS sysBusProbe(char *, int, int, char *);
00593 #endif
00594 LOCAL BOOL sysVmeVownTas(char *);
00595 LOCAL BOOL sysVmeRmwTas(char *);
00596 #ifdef APS_BSP
00597 LOCAL void sysVmeVownClear (volatile char *);
00598 #endif
00599 void sysDebugMsg(char * str, UINT32 recovery);
00600 #ifndef APS_BSP
00601 STATUS sysAtuInit();
00602 UINT sysGetBusSpd(void);
00603 UINT sysGetBusSpdHertz(void);
00604 UINT sysGetMpuSpd(void);
00605 UINT sysGetMpuSpdHertz(void);
00606 UINT sysGetPciSpd(void);
00607 UINT sysGetPciSpdHertz(void);
00608 #else
00609 LOCAL STATUS sysAtuInit();
00610 UINT sysGetBusSpd(void);
00611 UINT sysGetMpuSpd(void);
00612 UINT sysGetPciSpd(void);
00613 #endif
00614
00615
00616
00617 IMPORT UCHAR sysInByte (ULONG);
00618 IMPORT void sysOutByte (ULONG, UCHAR);
00619 IMPORT USHORT sysInWord (ULONG);
00620 IMPORT void sysOutWord (ULONG, USHORT);
00621 IMPORT ULONG sysInLong (ULONG);
00622 IMPORT void sysOutLong (ULONG, ULONG);
00623 IMPORT UINT32 sysPciInLong (UINT32);
00624 IMPORT void sysPciOutLong (UINT32, UINT32);
00625 IMPORT UINT32 sysPciConfigInLong (UINT32 *);
00626 IMPORT void sysPciConfigOutLong (UINT32 *, UINT32);
00627 IMPORT UINT16 sysPciConfigInWord (UINT16 *);
00628 IMPORT void sysPciConfigOutWord (UINT16 *, UINT16);
00629 #ifdef APS_BSP
00630 IMPORT UINT8 sysPciConfigInByte (UINT8 *);
00631 IMPORT void sysPciConfigOutByte (UINT8 *, UINT8);
00632 #endif
00633 IMPORT void sysClkIntCIO (void);
00634 IMPORT STATUS sysMemProbeSup (int length, char * src, char * dest);
00635 IMPORT int sysProbeExc();
00636 IMPORT VOIDFUNCPTR smUtilTasClearRtn;
00637 IMPORT void sysBusRmwEnable(UINT, UINT, UINT, char *);
00638 IMPORT void sysBusRmwDisable(void);
00639 IMPORT UINT32 sysTimeBaseLGet (void);
00640 #ifdef APS_BSP
00641 IMPORT UINT sysHid1Get(void);
00642 #endif
00643 IMPORT UCHAR sysProductStr[];
00644 IMPORT UINT32 sysMemParamConfig();
00645 #ifdef APS_BSP
00646 IMPORT int excExcHandle(ESFPPC *pEsf);
00647 #endif
00648
00649
00650
00651 #include "pci/pciConfigLib.c"
00652 #include "./sysEnd.c"
00653 #include "sysSerial.c"
00654 #include "mem/byteNvRam.c"
00655 #include "sysMotVpd.c"
00656 #include "timer/ppcDecTimer.c"
00657
00658 #ifdef INCLUDE_SHOW_ROUTINES
00659 #include "pci/pciConfigShow.c"
00660 #include "sysMotVpdShow.c"
00661 #endif
00662
00663 #ifdef INCLUDE_SCSI
00664 # include "sysScsi.c"
00665 #endif
00666
00667 #include "universe.c"
00668 #include "kahluaEpic.c"
00669
00670 #ifdef INCLUDE_AUXCLK
00671 # include "kahluaAuxClk.c"
00672 #endif
00673
00674 #ifdef INCLUDE_PCI_AUTOCONF
00675 # include "pci/pciAutoConfigLib.c"
00676 # include "./sysBusPci.c"
00677 #endif
00678
00679
00680
00681 #define VMEBUS_OWNER (*UNIVERSE_MAST_CTL & LONGSWAP(MAST_CTL_VOWN_ACK))
00682 #define CPU_CLOCKS_PER_LOOP 10
00683 #define LOCK_TIMEOUT 10
00684 #define UNLOCK_TIMEOUT 10000
00685
00686 #ifdef APS_BSP
00687
00688 #endif
00689
00690 #ifdef APS_BSP
00691 #define MEM_PART_OVERHEAD 64
00692
00693
00694 #endif
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706 char * sysModel (void)
00707 {
00708 int cpu;
00709 char cpuStr[80];
00710
00711
00712
00713 cpu = CPU_TYPE;
00714 switch (cpu)
00715 {
00716 case CPU_TYPE_603EK:
00717 sprintf(cpuStr, "8240");
00718 break;
00719 default:
00720 sprintf (cpuStr, "60%d", cpu);
00721 break;
00722 }
00723
00724 sprintf (sysModelStr, "Motorola MVME2100 - MPC %s", cpuStr);
00725
00726 return (sysModelStr);
00727 }
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739 char * sysBspRev (void)
00740 {
00741 return (BSP_VERSION BSP_REV);
00742 }
00743
00753 void sysDecDelay
00754 (
00755 UINT usDelay
00756 )
00757 {
00758 UINT oneUsDelta;
00759 UINT valueCurrent, valuePrevious, valueDelta;
00760
00761
00762
00763
00764 if (!usDelay)
00765 return;
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775 oneUsDelta = ((DEC_CLOCK_FREQ / 4) / 1000000);
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789 for (valuePrevious = vxDecGet();;)
00790 {
00791 valueCurrent = vxDecGet();
00792 valueDelta = 0;
00793 if (valueCurrent > valuePrevious)
00794 {
00795 valueDelta = (0xFFFFFFFF - valueCurrent) + valuePrevious;
00796 }
00797 else
00798 {
00799 if (valueCurrent < valuePrevious)
00800 {
00801 valueDelta = valuePrevious - valueCurrent;
00802 }
00803 }
00804
00805 if ((valueDelta / oneUsDelta) >= usDelay)
00806 break;
00807 }
00808 }
00809
00810
00811
00812
00813
00814
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824 void sysHwInit (void)
00825 {
00826 int pciBusNo;
00827 int pciDevNo;
00828 int pciFuncNo;
00829
00830
00831
00832 (void) sysVpdInit ();
00833
00834
00835
00836
00837
00838 sysCpuCheck();
00839
00840
00841
00842
00843 if (pciConfigLibInit (PCI_MECHANISM_1, PCI_MSTR_PRIMARY_CAR,
00844 PCI_MSTR_PRIMARY_CDR, 0) != OK)
00845 {
00846 sysToMonitor (BOOT_NO_AUTOBOOT);
00847 }
00848
00849 #ifdef INCLUDE_PCI_AUTOCONF
00850
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861 if ( !PCI_AUTOCONFIG_DONE )
00862 {
00863
00864
00865
00866 sysPciAutoConfig ();
00867 PCI_AUTOCONFIG_FLAG++;
00868
00869 }
00870 #endif
00871
00872 sysDec21x40UpdateLoadStr ();
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883 if (pciFindDevice ((PCI_ID_UNIVERSE & 0xFFFF),
00884 (PCI_ID_UNIVERSE >> 16) & 0xFFFF, 0,
00885 &pciBusNo, &pciDevNo, &pciFuncNo) != ERROR)
00886 {
00887 pciToVmeDev = UNIVERSE_II;
00888
00889 #if !defined(INCLUDE_PCI_AUTOCONF)
00890 (void)pciDevConfig (pciBusNo, pciDevNo, pciFuncNo,
00891 NULL,
00892 PCI_MEM_UNIVERSE_ADRS,
00893 (PCI_CMD_MASTER_ENABLE | PCI_CMD_MEM_ENABLE));
00894 #endif
00895
00896
00897
00898 (void)pciConfigInLong(pciBusNo, pciDevNo, pciFuncNo,
00899 PCI_CFG_BASE_ADDRESS_0,
00900 &univBaseAdrs);
00901 if (univBaseAdrs & PCI_BAR_SPACE_IO)
00902 {
00903 univBaseAdrs = (ISA_MSTR_IO_LOCAL + (univBaseAdrs &
00904 PCI_IOBASE_MASK));
00905 }
00906 else
00907 {
00908 univBaseAdrs = (PCI_MSTR_MEMIO_LOCAL + (univBaseAdrs &
00909 PCI_MEMBASE_MASK));
00910 }
00911 }
00912
00913 #if defined(INCLUDE_NETWORK) && !defined(INCLUDE_PCI_AUTOCONF)
00914
00915
00916
00917 if ((pciFindDevice ((PCI_ID_PRI_LAN & 0xFFFF),
00918 (PCI_ID_PRI_LAN >> 16) & 0xFFFF, 0,
00919 &pciBusNo, &pciDevNo, &pciFuncNo) != ERROR))
00920 {
00921 (void)pciDevConfig (pciBusNo, pciDevNo, pciFuncNo,
00922 PCI_IO_LN_ADRS,
00923 NULL,
00924 (PCI_CMD_MASTER_ENABLE | PCI_CMD_IO_ENABLE));
00925 }
00926 else
00927 {
00928 sysToMonitor (BOOT_NO_AUTOBOOT);
00929 }
00930 #endif
00931
00932
00933
00934 sysAtuInit();
00935
00936
00937
00938 sysEpicInit();
00939
00940 #if defined(INCLUDE_PMC_SPAN) && !defined(INCLUDE_PCI_AUTOCONF)
00941
00942
00943
00944
00945
00946 if (pciFindDevice ((PCI_ID_BR_DEC21150 & 0xFFFF),
00947 (PCI_ID_BR_DEC21150 >> 16) & 0xFFFF, 0,
00948 &pciBusNo, &pciDevNo, &pciFuncNo) != ERROR)
00949 {
00950 (void)sysPmcSpanConfig (pciBusNo, pciDevNo, pciFuncNo, sysPmcSpanParm);
00951 }
00952 #endif
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965 sysUniverseInit();
00966
00967 #ifdef INCLUDE_VME_DMA
00968
00969
00970
00971 sysVmeDmaInit();
00972
00973 #endif
00974
00975
00976
00977 smUtilTasClearRtn = (VOIDFUNCPTR)sysBusTasClear;
00978
00979
00980
00981 _func_vxMemProbeHook = (FUNCPTR)sysBusProbe;
00982
00983
00984
00985 sysSerialHwInit();
00986
00987
00988
00989
00990
00991
00992
00993 sysNvRamGet ((char *)lnEnetAddr, 6, ((int) BB_ENET - NV_BOOT_OFFSET));
00994
00995
00996
00997 sysNvWrite ((ULONG)WD_TIMER, 0);
00998
00999
01000
01001
01002
01003
01004
01005
01006 sysPhysMemTop ();
01007
01008
01009 #ifdef INCLUDE_FEIEND
01010 sys557PciInit();
01011 #endif
01012
01013 #ifdef INCLUDE_GIGEND
01014 sysGigPciInit();
01015 #endif
01016
01017
01018
01019 *(UINT8 *)MV2100_SYS_STAT_REG2 &= ~MV2100_BD_FAIL;
01020
01021
01022 }
01023
01024
01025
01026
01027
01028
01029
01030
01031
01032
01033
01034
01035
01036
01037
01038
01039
01040
01041
01042
01043
01044
01045
01046 char * sysPhysMemTop (void)
01047 {
01048 #ifdef LOCAL_MEM_AUTOSIZE
01049 sramConfigReg MemControlReg;
01050 #endif
01051 static char * sysPhysMemSize = NULL;
01052
01053 if (sysPhysMemSize == NULL)
01054 {
01055 #ifdef LOCAL_MEM_AUTOSIZE
01056
01057
01058
01059
01060
01061
01062
01063
01064 sysPhysMemSize = (char *)sysMemParamConfig(&MemControlReg);
01065
01066
01067
01068 sysPhysMemDesc[1].len = (ULONG)sysPhysMemSize -
01069 (ULONG)sysPhysMemDesc[1].physicalAddr;
01070
01071 #else
01072
01073
01074 sysPhysMemSize = (char *)(LOCAL_MEM_LOCAL_ADRS + LOCAL_MEM_SIZE);
01075 #endif
01076 }
01077
01078
01079
01080 return sysPhysMemSize;
01081 }
01082
01083
01084
01085
01086
01087
01088
01089
01090
01091
01092
01093
01094
01095
01096
01097
01098 char * sysMemTop (void)
01099 {
01100 static char * memTop = NULL;
01101
01102 if (memTop == NULL)
01103 {
01104 memTop = sysPhysMemTop () - USER_RESERVED_MEM;
01105 #ifdef LARGE_MEMORY_HACK
01106
01107 if ( memTop>0x2000000)
01108 memTop=0x2000000;
01109 #endif
01110 }
01111
01112 return memTop;
01113 }
01114
01115
01116
01117
01118
01119
01120
01121
01122
01123
01124
01125
01126
01127
01128 STATUS sysToMonitor
01129 (
01130 int startType
01131 )
01132 {
01133 FUNCPTR pRom = (FUNCPTR) (ROM_TEXT_ADRS + 4);
01134
01135 cacheDisable (0);
01136 cacheDisable (1);
01137
01138 #if (CPU == PPC604)
01139 vxHid0Set (vxHid0Get () & ~_PPC_HID0_SIED);
01140 #endif
01141
01142 sysUniverseReset ();
01143 sysSerialReset ();
01144
01145
01146
01147 vxMsrSet (0);
01148
01149
01150
01151 sysPciOutLong((UINT32)EPIC_GLOBAL_CONFIG_REG, EPIC_GC_RESET);
01152
01153
01154
01155 *(UINT8 *)MV2100_SYS_STAT_REG2 |= MV2100_BD_FAIL;
01156
01157 (*pRom) (startType);
01158
01159 return (OK);
01160 }
01161
01162
01163 #ifdef APS_BSP
01164
01165
01166
01167
01168
01169
01170
01171
01172
01173
01174
01175
01176
01177 int sysBusErrHandler
01178 (
01179 ESFPPC * pEsf
01180 )
01181 {
01182 UINT16 pciCfg = sysPciConfigInWord((UINT16 *)(CNFG_PCI_HOST_BRDG + KAHLUA_CFG_STATUS));
01183 if (pciCfg & (KAHLUA_PCI_RCV_MSTR_ABORT | KAHLUA_PCI_RCV_TGT_ABORT))
01184 {
01185 sysPciConfigOutWord((UINT16 *)(CNFG_PCI_HOST_BRDG + KAHLUA_CFG_STATUS),
01186 KAHLUA_PCI_RCV_MSTR_ABORT | KAHLUA_PCI_RCV_TGT_ABORT);
01187 excJobAdd(sysBusErrShow, 0, 0, 0, 0, 0, 0);
01188 }
01189 return excExcHandle(pEsf);
01190 }
01191
01192 #endif
01193
01194
01195
01196
01197
01198
01199
01200
01201
01202
01203
01204 void sysHwInit2 (void)
01205 {
01206 static BOOL configured = FALSE;
01207
01208
01209
01210 if (!configured)
01211 {
01212
01213 #ifdef INCLUDE_AUXCLK
01214 sysAuxClkInit ();
01215 intConnect (INUM_TO_IVEC(TIMER0_INT_VEC), sysAuxClkInt, 0);
01216 intEnable (TIMER0_INT_LVL);
01217 #endif
01218
01219
01220
01221 intConnect (INUM_TO_IVEC(UNIV_INT_VEC), sysUnivVmeIntr, 0);
01222
01223
01224
01225 intEnable (UNIV_INT_LVL);
01226
01227
01228
01229 sysSerialHwInit2();
01230
01231 #ifdef APS_BSP
01232
01233
01234 excVecSet((FUNCPTR *) _EXC_OFF_MACH, sysBusErrHandler);
01235 excVecSet((FUNCPTR *) _EXC_OFF_DATA, sysBusErrHandler);
01236
01237 {
01238 UINT32 picr1;
01239 picr1 = sysPciConfigInLong((UINT32 *)(CNFG_PCI_HOST_BRDG + KAHLUA_CFG_PROC_IF_CFG1));
01240 picr1 |= KAHLUA_PIC1_MCP_EN;
01241 sysPciConfigOutLong((UINT32 *)(CNFG_PCI_HOST_BRDG + KAHLUA_CFG_PROC_IF_CFG1), picr1);
01242 }
01243
01244 {
01245 UINT8 ErrEnR2;
01246 ErrEnR2 = sysPciConfigInByte((UINT8 *)(CNFG_PCI_HOST_BRDG + KAHLUA_CFG_ERROR_ENABLE2));
01247 ErrEnR2 |= KAHLUA_EE2_PCI_TARG_ABORT;
01248 sysPciConfigOutByte((UINT8 *)(CNFG_PCI_HOST_BRDG + KAHLUA_CFG_ERROR_ENABLE2), ErrEnR2);
01249 }
01250
01251 sysPciConfigOutWord((UINT16 *)(CNFG_PCI_HOST_BRDG + KAHLUA_CFG_STATUS),
01252 KAHLUA_PCI_RCV_MSTR_ABORT | KAHLUA_PCI_RCV_TGT_ABORT);
01253
01254
01255
01256 vxMsrSet(vxMsrGet() | _PPC_MSR_ME);
01257 vxHid0Set(vxHid0Get() | _PPC_HID0_EMCP);
01258
01259 #endif
01260 configured = TRUE;
01261 }
01262
01263
01264 }
01265
01266
01267
01268
01269
01270
01271
01272
01273
01274
01275
01276
01277
01278
01279 int sysProcNumGet (void)
01280 {
01281 return (sysProcNum);
01282 }
01283
01284
01285
01286
01287
01288
01289
01290
01291
01292
01293
01294
01295
01296
01297
01298
01299 void sysProcNumSet
01300 (
01301 int procNum
01302 )
01303 {
01304
01305
01306
01307
01308
01309
01310 sysProcNum = procNum;
01311
01312
01313
01314
01315 sysUniverseInit2(procNum);
01316
01317 }
01318
01319
01320
01321
01322
01323
01324
01325
01326
01327
01328
01329
01330
01331
01332
01333
01334
01335
01336
01337
01338
01339
01340 STATUS sysLocalToBusAdrs
01341 (
01342 int adrsSpace,
01343 char * localAdrs,
01344 char ** pBusAdrs
01345 )
01346 {
01347
01348 #ifdef APS_BSP
01349
01350 if (sysProcNumGet () != 0)
01351 return ERROR;
01352
01353 #endif
01354 switch (adrsSpace)
01355 {
01356 case VME_AM_EXT_SUP_PGM:
01357 case VME_AM_EXT_SUP_DATA:
01358 case VME_AM_EXT_USR_PGM:
01359 case VME_AM_EXT_USR_DATA:
01360 #ifndef APS_BSP
01361 if ((VME_A32_SLV_SIZE != 0) &&
01362 ((ULONG)localAdrs >= VME_A32_SLV_LOCAL) &&
01363 #else
01364 if (((ULONG)localAdrs >= VME_A32_SLV_LOCAL) &&
01365 #endif
01366 ((ULONG)localAdrs < (VME_A32_SLV_LOCAL + VME_A32_SLV_SIZE)))
01367 {
01368 *pBusAdrs = localAdrs + (VME_A32_SLV_BUS - VME_A32_SLV_LOCAL);
01369 return (OK);
01370 }
01371 #ifndef APS_BSP
01372
01373 else
01374 #endif
01375 return (ERROR);
01376
01377 case VME_AM_STD_SUP_PGM:
01378 case VME_AM_STD_SUP_DATA:
01379 case VME_AM_STD_USR_PGM:
01380 case VME_AM_STD_USR_DATA:
01381 #ifndef APS_BSP
01382 if ((VME_A24_SLV_SIZE != 0) &&
01383 ((ULONG)localAdrs >= VME_A24_SLV_LOCAL) &&
01384 ((ULONG)localAdrs < (VME_A24_SLV_LOCAL + VME_A24_SLV_SIZE)))
01385 #else
01386 if ((a24memPartId != 0) &&
01387 ((ULONG)localAdrs >= a24memBase) &&
01388 ((ULONG)localAdrs < a24memBound))
01389 #endif
01390 {
01391 #ifndef APS_BSP
01392 *pBusAdrs = localAdrs + (VME_A24_SLV_BUS - VME_A24_SLV_LOCAL);
01393 #else
01394 *pBusAdrs = localAdrs - a24adrOffset;
01395 #endif
01396 return (OK);
01397 }
01398 #ifndef APS_BSP
01399 else
01400 #endif
01401 return (ERROR);
01402
01403 #ifndef APS_BSP
01404 case VME_AM_SUP_SHORT_IO:
01405 case VME_AM_USR_SHORT_IO:
01406 if ((VME_A16_SLV_SIZE != 0) &&
01407 ((ULONG)localAdrs >= VME_A16_SLV_LOCAL) &&
01408 ((ULONG)localAdrs < (VME_A16_SLV_LOCAL + VME_A16_SLV_SIZE)))
01409 {
01410 *pBusAdrs = localAdrs + (VME_A16_SLV_BUS - VME_A16_SLV_LOCAL);
01411 return (OK);
01412 }
01413 else
01414 return (ERROR);
01415
01416 #else
01417 #if (VME_A16_SLV_SIZE != 0)
01418 case VME_AM_SUP_SHORT_IO:
01419 case VME_AM_USR_SHORT_IO:
01420 if (((ULONG)localAdrs >= VME_A16_SLV_LOCAL) &&
01421 ((ULONG)localAdrs < (VME_A16_SLV_LOCAL + VME_A16_SLV_SIZE)))
01422 {
01423 *pBusAdrs = localAdrs + (VME_A16_SLV_BUS - VME_A16_SLV_LOCAL);
01424 return (OK);
01425 }
01426 return (ERROR);
01427 #endif
01428 #endif
01429 default:
01430 return (ERROR);
01431 }
01432 }
01433
01434
01435
01436
01456 STATUS sysBusToLocalAdrs
01457 (
01458 int adrsSpace,
01459 char * busAdrs,
01460 char ** pLocalAdrs
01461 )
01462 {
01463
01464 unsigned int * univ_ctl[8];
01465 char * base, * bound;
01466 unsigned long offset, ctl;
01467 int i;
01468 unsigned long VAS;
01469
01470 #define VAS_MASK LSI_CTL_USER2
01471
01472 univ_ctl[0]=UNIVERSE_LSI0_CTL;
01473 univ_ctl[1]=UNIVERSE_LSI1_CTL;
01474 univ_ctl[2]=UNIVERSE_LSI2_CTL;
01475 univ_ctl[3]=UNIVERSE_LSI3_CTL;
01476 univ_ctl[4]=UNIVERSE_LSI4_CTL;
01477 univ_ctl[5]=UNIVERSE_LSI5_CTL;
01478 univ_ctl[6]=UNIVERSE_LSI6_CTL;
01479 univ_ctl[7]=UNIVERSE_LSI7_CTL;
01480
01481
01482 switch (adrsSpace)
01483 {
01484 case VME_AM_EXT_SUP_PGM:
01485 case VME_AM_EXT_USR_PGM:
01486 case VME_AM_EXT_SUP_DATA:
01487 case VME_AM_EXT_USR_DATA:
01488 VAS=LSI_CTL_A32;
01489 break;
01490 case VME_AM_STD_SUP_PGM:
01491 case VME_AM_STD_USR_PGM:
01492 case VME_AM_STD_SUP_DATA:
01493 case VME_AM_STD_USR_DATA:
01494 VAS=LSI_CTL_A24;
01495 break;
01496 case VME_AM_SUP_SHORT_IO:
01497 case VME_AM_USR_SHORT_IO:
01498 VAS=LSI_CTL_A16;
01499 break;
01500 default:
01501 return (ERROR);
01502 }
01503 for (i=0;i<8;i++)
01504 {
01505 UNIV_IN_LONG(univ_ctl[i],&ctl);
01506 if ((ctl&VAS_MASK)==VAS)
01507 {
01508 UNIV_IN_LONG(univ_ctl[i]+1,&base);
01509 UNIV_IN_LONG(univ_ctl[i]+2,&bound);
01510 UNIV_IN_LONG(univ_ctl[i]+3,&offset);
01511 if (busAdrs >= (base+offset) && busAdrs < (bound+offset))
01512 {
01513 *pLocalAdrs= busAdrs-offset;
01514 return OK;
01515 }
01516 }
01517
01518
01519 }
01520 return ERROR;
01521 }
01522
01523
01524
01525
01526
01527
01528
01529
01530
01531
01532
01533
01534
01535
01536
01537
01538
01539
01540
01541
01542
01543
01544
01545
01546
01547
01548
01549
01550
01551
01552
01553
01554
01555
01556
01557
01558
01559
01560
01561
01562
01563
01564
01565
01566
01567
01568
01569
01570
01571
01572
01573
01574
01575
01576
01577
01578
01579
01580
01581
01582
01583
01584
01585
01586
01587
01588
01589
01590
01591
01592 #ifndef APS_BSP
01593 BOOL sysBusTas
01594 (
01595 char * adrs
01596 )
01597 {
01598
01599
01600 if (sysProcNumGet() == 0)
01601 {
01602 #ifdef ANY_BRDS_IN_CHASSIS_NOT_RMW
01603
01604
01605
01606
01607
01608
01609
01610
01611
01612 return (sysVmeVownTas(adrs));
01613
01614 #else
01615 #if (SM_OFF_BOARD == FALSE)
01616 BOOL state = FALSE;
01617 int lockKey;
01618
01619
01620
01621
01622
01623
01624
01625
01626
01627
01628
01629 lockKey = intLock ();
01630
01631
01632
01633 state = vxTas ((UINT *)adrs);
01634 SYNC;
01635
01636 intUnlock (lockKey);
01637
01638
01639
01640 return (state);
01641
01642 #else
01643
01644
01645 return (sysVmeRmwTas(adrs));
01646
01647 #endif
01648
01649 #endif
01650 }
01651 else
01652 {
01653 if (pciToVmeDev == UNIVERSE_II)
01654 {
01655
01656
01657 return (sysVmeRmwTas(adrs));
01658 }
01659 else
01660 {
01661
01662
01663
01664
01665
01666 return (sysVmeVownTas(adrs));
01667
01668 }
01669 }
01670
01671 }
01672
01673 #else
01674
01675 BOOL sysBusTas
01676 (
01677 char * adrs
01678 )
01679 {
01680 if (IS_VME_ADDRESS(adrs))
01681 {
01682 return (sysVmeRmwTas(adrs));
01683 }
01684
01685 #if (SM_OFF_BOARD == FALSE)
01686 else if ((adrs >= (char *) SM_MEM_ADRS) &&
01687 (adrs < (char *) SM_MEM_ADRS + SM_MEM_SIZE + SM_OBJ_MEM_SIZE))
01688 {
01689
01690
01691 BOOL state = FALSE;
01692 int lockKey;
01693
01694
01695
01696 lockKey = intLock ();
01697
01698
01699
01700 state = vxTas ((UINT *)adrs);
01701 SYNC;
01702
01703 intUnlock (lockKey);
01704
01705
01706
01707 return (state);
01708
01709 }
01710 #endif
01711
01712
01713 return (sysVmeVownTas(adrs));
01714 }
01715
01716
01717
01718 #endif
01719
01720
01721
01722
01723
01724
01725
01726
01727
01728
01729
01730
01731
01732
01733
01734
01735
01736
01737
01738
01739
01740
01741
01742
01743
01744
01745
01746
01747
01748
01749
01750
01751
01752
01753
01754
01755
01756
01757
01758
01759
01760
01761
01762
01763
01764
01765
01766
01767
01768
01769
01770
01771 #ifndef APS_BSP
01772
01773 void sysBusTasClear
01774 (
01775 volatile char * adrs
01776 )
01777 {
01778
01779 #ifdef ANY_BRDS_IN_CHASSIS_NOT_RMW
01780
01781
01782
01783
01784
01785
01786
01787
01788 BOOL state;
01789 int lockKey;
01790
01791
01792
01793 if ((sysProcNumGet() == 0) ||
01794 (pciToVmeDev == UNIVERSE_I))
01795 {
01796
01797
01798
01799
01800
01801
01802
01803 int NotTimeOut = ((MEMORY_BUS_SPEED/1000000) * UNLOCK_TIMEOUT)
01804 / CPU_CLOCKS_PER_LOOP;
01805
01806
01807
01808 lockKey = intLock ();
01809
01810
01811
01812 *UNIVERSE_MAST_CTL |= LONGSWAP(MAST_CTL_VOWN);
01813 SYNC;
01814
01815
01816
01817 while (!VMEBUS_OWNER && NotTimeOut)
01818 {
01819 --NotTimeOut;
01820 }
01821
01822
01823
01824 *(UINT *)adrs = 0;
01825 SYNC;
01826
01827
01828
01829 *UNIVERSE_MAST_CTL &= LONGSWAP(~MAST_CTL_VOWN);
01830
01831
01832
01833 intUnlock (lockKey);
01834 }
01835 else
01836 {
01837
01838
01839 lockKey = intLock ();
01840
01841
01842
01843 sysBusRmwEnable(VME_SCG_COMPARE_MASK,
01844 VME_SCG_COMPARE_TO_CLEAR,
01845 VME_SCG_SWAP_TO_CLEAR,
01846 (char *)adrs);
01847
01848
01849
01850 state = *((UINT *)adrs);
01851 SYNC;
01852
01853
01854
01855 sysBusRmwDisable();
01856
01857
01858
01859 intUnlock (lockKey);
01860 }
01861 #else
01862 #if (SM_OFF_BOARD == FALSE)
01863
01864
01865
01866
01867
01868
01869 *(UINT *)adrs = 0;
01870 SYNC;
01871
01872 #else
01873
01874
01875
01876 if ((sysProcNumGet() == 0) ||
01877 (pciToVmeDev == UNIVERSE_I))
01878 {
01879
01880
01881
01882
01883
01884
01885 int NotTimeOut = ((MEMORY_BUS_SPEED/1000000) * UNLOCK_TIMEOUT)
01886 / CPU_CLOCKS_PER_LOOP;
01887
01888
01889
01890 lockKey = intLock ();
01891
01892
01893
01894 *UNIVERSE_MAST_CTL |= LONGSWAP(MAST_CTL_VOWN);
01895 SYNC;
01896
01897
01898
01899 while (!VMEBUS_OWNER && NotTimeOut)
01900 {
01901 --NotTimeOut;
01902 }
01903
01904
01905
01906 *(UINT *)adrs = 0;
01907 SYNC;
01908
01909
01910
01911 *UNIVERSE_MAST_CTL &= LONGSWAP(~MAST_CTL_VOWN);
01912
01913
01914
01915 intUnlock (lockKey);
01916 }
01917 else
01918 {
01919
01920
01921 lockKey = intLock ();
01922
01923
01924
01925 sysBusRmwEnable(VME_SCG_COMPARE_MASK,
01926 VME_SCG_COMPARE_TO_CLEAR,
01927 VME_SCG_SWAP_TO_CLEAR,
01928 (char *)adrs);
01929
01930
01931
01932 state = *((UINT *)adrs);
01933 SYNC;
01934
01935
01936
01937 sysBusRmwDisable();
01938
01939
01940
01941 intUnlock (lockKey);
01942 }
01943
01944 #endif
01945 #endif
01946 }
01947
01948
01949
01950 #else
01951 void sysBusTasClear
01952 (
01953 volatile char * adrs
01954 )
01955 {
01956
01957
01958 if (IS_VME_ADDRESS(adrs))
01959 {
01960
01961 SYNC;
01962 *adrs = 0;
01963 }
01964 #if (SM_OFF_BOARD == FALSE)
01965 else if ((adrs >= (char *) SM_MEM_ADRS) &&
01966 (adrs < (char *) SM_MEM_ADRS + SM_MEM_SIZE + SM_OBJ_MEM_SIZE))
01967 {
01968
01969 SYNC;
01970 *(UINT *)adrs = 0;
01971 }
01972 #endif
01973 else
01974 {
01975
01976 sysVmeVownClear(adrs);
01977 }
01978 }
01979
01980
01981
01982
01983 #endif
01984
01985
01986
01987
01988
01989
01990
01991
01992
01993
01994
01995
01996
01997
01998
01999
02000
02001
02002
02003
02004
02005
02006
02007
02008
02009
02010
02011
02012 #ifndef APS_BSP
02013 LOCAL BOOL sysVmeVownTas
02014 (
02015 char * adrs
02016 )
02017 {
02018 BOOL state = FALSE;
02019 int lockKey;
02020
02021
02022
02023
02024
02025
02026
02027 int NotTimeOut = ((MEMORY_BUS_SPEED/1000000) * LOCK_TIMEOUT)
02028 / CPU_CLOCKS_PER_LOOP;
02029
02030
02031
02032 lockKey = intLock ();
02033
02034
02035
02036 *UNIVERSE_MAST_CTL |= LONGSWAP(MAST_CTL_VOWN);
02037 SYNC;
02038
02039
02040
02041 while (!VMEBUS_OWNER && NotTimeOut)
02042 {
02043 --NotTimeOut;
02044 }
02045
02046
02047
02048 if (VMEBUS_OWNER)
02049 {
02050 state = vxTas ((UINT *)adrs);
02051 SYNC;
02052 }
02053
02054
02055
02056 *UNIVERSE_MAST_CTL &= LONGSWAP(~MAST_CTL_VOWN);
02057
02058
02059
02060 intUnlock (lockKey);
02061
02062
02063
02064 return (state);
02065
02066 }
02067 #else
02068 LOCAL BOOL sysVmeVownTas
02069 (
02070 char * adrs
02071 )
02072 {
02073 BOOL state = FALSE;
02074 int lockKey;
02075
02076
02077
02078
02079
02080
02081
02082 int NotTimeOut = ((MEMORY_BUS_SPEED/1000000) * LOCK_TIMEOUT)
02083 / CPU_CLOCKS_PER_LOOP;
02084
02085
02086
02087 lockKey = intLock ();
02088
02089
02090
02091 *UNIVERSE_MAST_CTL |= LONGSWAP(MAST_CTL_VOWN);
02092 SYNC;
02093
02094
02095
02096 while (!VMEBUS_OWNER && NotTimeOut)
02097 {
02098 --NotTimeOut;
02099 }
02100
02101
02102
02103 if (VMEBUS_OWNER)
02104 {
02105 state = vxTas ((UINT *)adrs);
02106 SYNC;
02107 }
02108
02109
02110
02111 *UNIVERSE_MAST_CTL &= LONGSWAP(~MAST_CTL_VOWN);
02112
02113
02114
02115 intUnlock (lockKey);
02116
02117
02118
02119 return (state);
02120
02121 }
02122
02123
02124 #endif
02125
02126 #ifdef APS_BSP
02127
02128
02129
02130
02131
02132
02133
02134
02135
02136
02137
02138
02139
02140
02141
02142
02143
02144
02145
02146
02147
02148
02149
02150
02151
02152 LOCAL void sysVmeVownClear
02153 (
02154 volatile char * adrs
02155 )
02156 {
02157 int lockKey;
02158
02159
02160
02161
02162
02163
02164
02165 int NotTimeOut = ((MEMORY_BUS_SPEED/1000000) * LOCK_TIMEOUT)
02166 / CPU_CLOCKS_PER_LOOP;
02167
02168
02169
02170 lockKey = intLock ();
02171
02172
02173
02174 *UNIVERSE_MAST_CTL |= LONGSWAP(MAST_CTL_VOWN);
02175 SYNC;
02176
02177
02178
02179 while (!VMEBUS_OWNER && NotTimeOut)
02180 {
02181 --NotTimeOut;
02182 }
02183
02184
02185
02186 SYNC;
02187 *(UINT *)adrs = 0;
02188
02189
02190
02191 *UNIVERSE_MAST_CTL &= LONGSWAP(~MAST_CTL_VOWN);
02192
02193
02194
02195 intUnlock (lockKey);
02196
02197 }
02198 #endif
02199
02200
02201
02202
02203
02204
02205
02206
02207
02208
02209
02210
02211
02212
02213
02214
02215
02216
02217
02218
02219
02220
02221
02222
02223
02224
02225
02226
02227
02228
02229
02230
02231
02232
02233
02234
02235
02236
02237
02238
02239
02240
02241
02242
02243
02244
02245 #ifndef APS_BSP
02246 LOCAL BOOL sysVmeRmwTas
02247 (
02248 char * adrs
02249 )
02250 {
02251 BOOL state = FALSE;
02252 int lockKey;
02253
02254
02255
02256
02257
02258
02259
02260
02261 lockKey = intLock ();
02262
02263
02264
02265 sysBusRmwEnable(VME_SCG_COMPARE_MASK,
02266 VME_SCG_COMPARE_TO_SET,
02267 VME_SCG_SWAP_TO_SET,
02268 (char *)adrs);
02269
02270
02271
02272 state = *((UINT *)adrs);
02273 SYNC;
02274
02275
02276
02277 sysBusRmwDisable();
02278
02279
02280
02281 intUnlock (lockKey);
02282
02283
02284
02285 if (state)
02286 {
02287 return (FALSE);
02288 }
02289 else
02290 {
02291 return (TRUE);
02292 }
02293 }
02294
02295 #else
02296 LOCAL BOOL sysVmeRmwTas
02297 (
02298 char * adrs
02299 )
02300 {
02301 BOOL state = FALSE;
02302 int lockKey;
02303 ULONG mask = 0x80000000 >> ((ULONG) adrs & 0x3) * 8;
02304
02305
02306
02307
02308
02309
02310
02311
02312 lockKey = intLock ();
02313
02314
02315
02316 sysBusRmwEnable (mask, 0x00000000, 0x80808080, adrs);
02317
02318
02319
02320 state = *adrs;
02321 SYNC;
02322
02323
02324
02325 sysBusRmwDisable();
02326
02327
02328
02329 intUnlock (lockKey);
02330
02331
02332
02333 return (state & 0x80) ? (FALSE) : (TRUE);
02334 }
02335 #endif
02336
02337
02338
02339
02340
02341
02342
02343
02344
02345
02346
02347
02348
02349
02350
02351
02352 STATUS sysLanIntEnable
02353 (
02354 int intLevel
02355 )
02356 {
02357 #ifdef INCLUDE_NETWORK
02358 intEnable (intLevel);
02359 return (OK);
02360 #else
02361 return (ERROR);
02362 #endif
02363 }
02364
02365
02366
02367
02368
02369
02370
02371
02372
02373
02374
02375
02376
02377 STATUS sysLanIntDisable
02378 (
02379 int intLevel
02380 )
02381 {
02382 #ifdef INCLUDE_NETWORK
02383
02384
02385
02386
02387 intDisable (intLevel);
02388
02389 return (OK);
02390 #else
02391 return (ERROR);
02392 #endif
02393 }
02394
02395
02396
02397
02398
02399
02400
02401
02402
02403
02404
02405
02406
02407
02408
02409
02410
02411
02412
02413 void sysSpuriousIntHandler (void)
02414 {
02415 }
02416
02417
02418
02419
02420
02421
02422
02423
02424
02425
02426
02427 UCHAR sysNvRead
02428 (
02429 ULONG offset
02430 )
02431 {
02432 return (sysInByte (NVRAM_BASE + offset));
02433 }
02434
02435
02436
02437
02438
02439
02440
02441
02442
02443
02444
02445 void sysNvWrite
02446 (
02447 ULONG offset,
02448 UCHAR data
02449 )
02450 {
02451 sysOutByte (NVRAM_BASE + offset, data);
02452 }
02453
02454
02455
02456
02457
02458
02459
02460
02461
02462
02463
02464
02465 #ifdef APS_BSP
02466 LOCAL
02467 #endif
02468 void sysCpuCheck (void)
02469 {
02470 int msgSize;
02471 int msgIx;
02472 SIO_CHAN * pSioChan;
02473
02474
02475
02476 if ((CPU_TYPE == CPU_TYPE_603) || (CPU_TYPE == CPU_TYPE_603E) ||
02477 (CPU_TYPE == CPU_TYPE_603P) || (CPU_TYPE == CPU_TYPE_603EK))
02478 {
02479 return;
02480 }
02481
02482
02483
02484 msgSize = strlen (wrongCpuMsg);
02485
02486 sysSerialHwInit ();
02487
02488 pSioChan = sysSerialChanGet (0);
02489
02490 sioIoctl (pSioChan, SIO_MODE_SET, (void *) SIO_MODE_POLL);
02491
02492 for (msgIx = 0; msgIx < msgSize; msgIx++)
02493 {
02494 while (sioPollOutput (pSioChan, wrongCpuMsg[msgIx]) == EAGAIN);
02495 }
02496
02497 sysToMonitor (BOOT_NO_AUTOBOOT);
02498 }
02499
02500
02501 #if defined(INCLUDE_PMC_SPAN) && !defined(INCLUDE_PCI_AUTOCONF)
02502
02503
02504
02505
02506
02507
02508
02509
02510
02511 #ifdef APS_BSP
02512 LOCAL
02513 #endif
02514 STATUS sysPmcSpanConfig
02515 (
02516 int pciBusNo,
02517 int pciDevNo,
02518 int pciFuncNo,
02519 PMC_SPAN * pmcSpan
02520 )
02521 {
02522 STATUS result = OK;
02523 FAST i;
02524
02525
02526
02527 for (i = 0; i < NUM_PMC_SPAN_PARMS && result == OK; ++i)
02528 {
02529 switch (pmcSpan[i].parmSize)
02530 {
02531 case 1:
02532 result = pciConfigOutByte (pciBusNo, pciDevNo, pciFuncNo,
02533 pmcSpan[i].parmOffset,
02534 pmcSpan[i].parmValue);
02535 break;
02536
02537 case 2:
02538 result = pciConfigOutWord (pciBusNo, pciDevNo, pciFuncNo,
02539 pmcSpan[i].parmOffset,
02540 pmcSpan[i].parmValue);
02541 break;
02542
02543 case 4:
02544 result = pciConfigOutLong (pciBusNo, pciDevNo, pciFuncNo,
02545 pmcSpan[i].parmOffset,
02546 pmcSpan[i].parmValue);
02547 break;
02548 }
02549 }
02550
02551 return (result);
02552 }
02553 #endif
02554
02555
02556
02557
02558
02559
02560
02561
02562
02563
02564
02565
02566
02567
02568 static int sysMemProbeTrap
02569 (
02570 ESFPPC * pEsf
02571 )
02572 {
02573 REG_SET *pRegSet = &pEsf->regSet;
02574
02575 pRegSet->pc = (_RType)sysProbeExc;
02576 return (0);
02577 }
02578
02579
02580
02581
02582
02583
02584
02585
02586
02587
02588
02589
02590
02591
02592
02593
02594
02595
02596
02597
02598
02599 static STATUS sysMemProbeBus
02600 (
02601 char * adrs,
02602 int mode,
02603 int length,
02604 char * pVal
02605
02606 )
02607 {
02608 int oldLevel;
02609 FUNCPTR oldVec1;
02610 FUNCPTR oldVec2;
02611 STATUS status;
02612 UINT32 ppcHid0;
02613 UINT32 ppcMsr;
02614 UINT16 temp;
02615
02616
02617
02618 oldLevel = intLock ();
02619
02620
02621
02622 oldVec1 = excVecGet ((FUNCPTR *) _EXC_OFF_MACH);
02623 excVecSet ((FUNCPTR *) _EXC_OFF_MACH, FUNCREF(sysMemProbeTrap));
02624
02625
02626
02627
02628
02629
02630
02631
02632 oldVec2 = excVecGet ((FUNCPTR *) _EXC_OFF_DATA);
02633 excVecSet ((FUNCPTR *) _EXC_OFF_DATA, FUNCREF(sysMemProbeTrap));
02634
02635
02636
02637 ppcHid0 = vxHid0Get();
02638 vxHid0Set(ppcHid0 | _PPC_HID0_EMCP);
02639
02640
02641
02642 ppcMsr = vxMsrGet();
02643 vxMsrSet(ppcMsr | _PPC_MSR_ME);
02644
02645
02646
02647 sysPciConfigOutWord((UINT16 *)(CNFG_PCI_HOST_BRDG + KAHLUA_CFG_STATUS),
02648 (KAHLUA_PCI_RCV_MSTR_ABORT | KAHLUA_PCI_RCV_TGT_ABORT));
02649
02650
02651
02652 if (mode == VX_READ)
02653 {
02654 status = sysMemProbeSup (length, adrs, pVal);
02655 SYNC;
02656 }
02657 else
02658 {
02659 status = sysMemProbeSup (length, pVal, adrs);
02660 SYNC;
02661 }
02662
02663
02664
02665 temp = sysPciConfigInWord((UINT16 *)(CNFG_PCI_HOST_BRDG +
02666 KAHLUA_CFG_STATUS));
02667 if (temp & (KAHLUA_PCI_RCV_MSTR_ABORT | KAHLUA_PCI_RCV_TGT_ABORT))
02668 status = ERROR;
02669
02670
02671
02672 sysPciConfigOutWord((UINT16 *)(CNFG_PCI_HOST_BRDG + KAHLUA_CFG_STATUS),
02673 (KAHLUA_PCI_RCV_MSTR_ABORT | KAHLUA_PCI_RCV_TGT_ABORT));
02674
02675
02676
02677 vxMsrSet(ppcMsr);
02678
02679
02680
02681 vxHid0Set(ppcHid0);
02682
02683
02684
02685 excVecSet ((FUNCPTR *) _EXC_OFF_DATA, oldVec2);
02686
02687 excVecSet ((FUNCPTR *) _EXC_OFF_MACH, oldVec1);
02688
02689 intUnlock (oldLevel);
02690
02691 return (status);
02692 }
02693
02694
02695
02696
02697
02698
02699
02700
02701
02702
02703
02704
02705
02706 void sysProbeErrClr (void)
02707 {
02708 UINT32 pciCsr;
02709
02710
02711
02712 pciCsr = sysPciInLong ((UINT32)(UNIVERSE_PCI_CSR));
02713
02714
02715
02716 sysPciOutLong ((UINT32)(UNIVERSE_PCI_CSR), pciCsr);
02717
02718
02719
02720 sysPciOutLong ((UINT32)UNIVERSE_V_AMERR, V_AMERR_V_STAT);
02721
02722
02723
02724 pciCsr = sysPciInLong ((UINT32)(UNIVERSE_PCI_CSR));
02725
02726
02727
02728 vxDarSet (0);
02729 vxDsisrSet (0);
02730 vxSrr0Set (0);
02731 vxSrr1Set (0);
02732 }
02733
02734
02735
02736
02737
02738
02739
02740
02741
02742
02743
02744
02745
02746
02747
02748
02749
02750
02751
02752
02753
02754
02755
02756
02757
02758
02759
02760 #ifndef APS_BSP
02761 STATUS sysVmeProbe
02762 #else
02763 LOCAL STATUS sysVmeProbe
02764 #endif
02765 (
02766 char * adrs,
02767 int mode,
02768 int length,
02769 char * pVal
02770
02771 )
02772 {
02773 STATUS status = ERROR;
02774 UINT32 lsiCtlReg;
02775 UINT32 pciSlv1Ctl;
02776
02777
02778
02779 #ifndef APS_BSP
02780 if ((VME_LM_MSTR_SIZE != 0) && ((UINT32)adrs >= VME_LM_MSTR_BUS) &&
02781 ((UINT32)adrs <= (VME_LM_MSTR_BUS + VME_LM_MSTR_SIZE)))
02782 lsiCtlReg = (UINT32)(UNIVERSE_LSI0_CTL);
02783 else
02784 #endif
02785 if ((VME_A32_MSTR_SIZE != 0) && ((UINT32)adrs >= VME_A32_MSTR_LOCAL) &&
02786 ((UINT32)adrs <= (VME_A32_MSTR_LOCAL + VME_A32_MSTR_SIZE)))
02787 lsiCtlReg = (UINT32)(UNIVERSE_LSI1_CTL);
02788 else if ((VME_A24_MSTR_SIZE != 0) && ((UINT32)adrs >= VME_A24_MSTR_LOCAL) &&
02789 ((UINT32)adrs <= (VME_A24_MSTR_LOCAL + VME_A24_MSTR_SIZE)))
02790 lsiCtlReg = (UINT32)(UNIVERSE_LSI2_CTL);
02791 else if ((VME_A16_MSTR_SIZE != 0) && ((UINT32)adrs >= VME_A16_MSTR_LOCAL) &&
02792 ((UINT32)adrs <= (VME_A16_MSTR_LOCAL + VME_A16_MSTR_SIZE)))
02793 lsiCtlReg = (UINT32)(UNIVERSE_LSI3_CTL);
02794 else
02795 return (ERROR);
02796
02797
02798
02799 pciSlv1Ctl = sysPciInLong (lsiCtlReg);
02800 if (mode == VX_WRITE)
02801 {
02802 sysPciOutLong (lsiCtlReg, (pciSlv1Ctl & ~LSI_CTL_WP));
02803 }
02804
02805
02806
02807 status = sysMemProbeBus (adrs, mode, length, pVal);
02808
02809
02810
02811 if ((mode == VX_WRITE) && (pciSlv1Ctl & LSI_CTL_WP))
02812 {
02813 sysPciOutLong (lsiCtlReg, pciSlv1Ctl);
02814 }
02815
02816 return (status);
02817 }
02818
02819
02820
02821
02822
02823
02824
02825
02826
02827
02828
02829
02830
02831
02832
02833
02834 #ifndef APS_BSP
02835 STATUS sysPciProbe
02836 #else
02837 LOCAL STATUS sysPciProbe
02838 #endif
02839 (
02840 char * adrs,
02841 int mode,
02842 int length,
02843 char * pVal
02844
02845 )
02846 {
02847 STATUS status = ERROR;
02848
02849
02850
02851 status = sysMemProbeBus (adrs, mode, length, pVal);
02852
02853 return (status);
02854 }
02855
02856
02857
02858
02859
02860
02861
02862
02863
02864
02865
02866
02867
02868
02869
02870
02871
02872 #ifndef APS_BSP
02873 STATUS sysBusProbe
02874 #else
02875 LOCAL STATUS sysBusProbe
02876 #endif
02877 (
02878 char * adrs,
02879 int mode,
02880 int length,
02881 char * pVal
02882
02883 )
02884 {
02885 STATUS status;
02886
02887
02888
02889 sysProbeErrClr ();
02890
02891
02892
02893 if (IS_VME_ADDRESS(adrs))
02894 status = sysVmeProbe (adrs, mode, length, pVal);
02895
02896
02897
02898 else if (IS_PCI_ADDRESS(adrs))
02899 status = sysPciProbe (adrs, mode, length, pVal);
02900
02901
02902
02903 else
02904 status = vxMemArchProbe (adrs, mode, length, pVal);
02905
02906
02907
02908 sysProbeErrClr ();
02909
02910 return (status);
02911 }
02912
02913 #ifndef APS_BSP
02914
02915
02916
02917
02918
02919
02920
02921
02922
02923
02924
02925
02926
02927
02928
02929
02930
02931
02932
02933
02934
02935
02936 void sysUsDelay
02937 (
02938 UINT32 delay
02939 )
02940 {
02941 register UINT baselineTickCount;
02942 register UINT curTickCount;
02943 register UINT terminalTickCount;
02944 register int actualRollover = 0;
02945 register int calcRollover = 0;
02946 UINT ticksToWait;
02947 UINT requestedDelay;
02948 UINT oneUsDelay;
02949
02950
02951
02952 if ((requestedDelay = delay) == 0)
02953 return;
02954
02955
02956
02957
02958
02959
02960 baselineTickCount = sysTimeBaseLGet();
02961
02962
02963
02964
02965
02966
02967
02968
02969
02970
02971
02972
02973 oneUsDelay = ((DEC_CLOCK_FREQ / 4) / 1000000);
02974
02975
02976
02977 ticksToWait = requestedDelay * oneUsDelay;
02978
02979
02980
02981 terminalTickCount = baselineTickCount + ticksToWait;
02982
02983
02984
02985 if (terminalTickCount < baselineTickCount)
02986 {
02987 calcRollover = 1;
02988 }
02989
02990 do
02991 {
02992
02993
02994
02995
02996
02997
02998 curTickCount = sysTimeBaseLGet();
02999
03000
03001
03002 if (curTickCount < baselineTickCount)
03003 {
03004 actualRollover = 1;
03005 }
03006
03007 if (((curTickCount >= terminalTickCount)
03008 && (actualRollover == calcRollover)) ||
03009 ((curTickCount < terminalTickCount)
03010 && (actualRollover > calcRollover)))
03011 {
03012
03013
03014 break;
03015 }
03016
03017 }
03018 while (TRUE);
03019 }
03020
03021 #endif
03022
03023
03024
03025
03026
03027
03028
03029
03030
03031
03032
03033 void sysDebugMsg
03034 (
03035 char * str,
03036 UINT32 recovery
03037 )
03038 {
03039 int msgSize;
03040 int msgIx;
03041 SIO_CHAN * pSioChan;
03042
03043 msgSize = strlen (str);
03044
03045 sysSerialHwInit ();
03046
03047 pSioChan = sysSerialChanGet (0);
03048
03049 sioIoctl (pSioChan, SIO_MODE_SET, (void *) SIO_MODE_POLL);
03050
03051 for (msgIx = 0; msgIx < msgSize; msgIx++)
03052 {
03053 while (sioPollOutput (pSioChan, str[msgIx]) == EAGAIN);
03054 }
03055
03056
03057
03058 #ifdef DEBUGMSG_RECOVERY
03059 if (recovery == EXIT_TO_SYSTEM_MONITOR)
03060 sysToMonitor (BOOT_NO_AUTOBOOT);
03061 #endif
03062 }
03063
03064 #if defined(INCLUDE_NETWORK)
03065
03066
03067
03068
03069
03070
03071
03072
03073
03074
03075
03076
03077
03078 STATUS sysDynEnetFind
03079 (
03080 int unit,
03081 UINT bus,
03082 PCI_LOC * pciLoc
03083 )
03084 {
03085
03086 UINT findClass;
03087 UINT pciBus;
03088 UINT pciDevice;
03089 UINT pciFunc;
03090 UINT devVend;
03091 UINT index = 0;
03092 STATUS status = ERROR;
03093
03094 findClass = (UINT)((PCI_CLASS_NETWORK_CTLR << 16) |
03095 (PCI_SUBCLASS_NET_ETHERNET << 8) |
03096 (0 << 0)
03097 );
03098
03099 while (pciFindClass(findClass, index,
03100 &pciBus, &pciDevice, &pciFunc) == OK)
03101 {
03102 if (pciBus == bus)
03103 {
03104 pciConfigInLong (pciBus, pciDevice, pciFunc,
03105 PCI_CFG_VENDOR_ID, &devVend);
03106
03107 if ( ((unit == 0) && (devVend == PCI_ID_PRI_LAN)) )
03108 {
03109 pciLoc->bus = pciBus;
03110 pciLoc->device = pciDevice;
03111 pciLoc->function = pciFunc;
03112 status = OK;
03113 break;
03114 }
03115 }
03116 index++;
03117 }
03118 return (status);
03119 }
03120 #endif
03121
03122 #if defined(INCLUDE_PCI_AUTOCONF) && !defined(INCLUDE_END)
03123
03124
03125
03126
03127
03128
03129
03130
03131
03132
03133
03134
03135
03136
03137
03138
03139
03140
03141
03142
03143
03144
03145
03146
03147
03148 STATUS sysDynDcAttach
03149 (
03150 int unit,
03151 ULONG dummmyDevAdrs,
03152 int dummyIvec,
03153 int dummyIlevel,
03154 char * memAdrs,
03155 ULONG memSize,
03156 int memWidth,
03157 ULONG pciMemBase,
03158 int dcOpMode
03159 )
03160 {
03161 IMPORT int dcattach ();
03162
03163 int index = 0;
03164 UINT bar0;
03165 char *cpuPciAddr;
03166 STATUS status = ERROR;
03167 UINT devVend;
03168 int ivec;
03169 int ilevel;
03170 UCHAR intLine;
03171 UINT pciBus, pciDevice, pciFunc;
03172 PCI_LOC pciList;
03173
03174 while (sysDynEnetFind ( unit, index, 0, &pciList ) == OK)
03175 {
03176 pciBus = pciList.bus;
03177 pciDevice = pciList.device;
03178 pciFunc = pciList.function;
03179
03180 pciConfigInLong (pciBus, pciDevice, pciFunc,
03181 PCI_CFG_VENDOR_ID, &devVend);
03182
03183 PCI_AUTO_DEBUG_MSG("sysDynDcAttach: found NIC [%d %d %d] dev_vend[0x%08x]\n",
03184 pciBus, pciDevice, pciFunc, devVend,0,0 );
03185
03186 if ( (unit == 0) && (devVend == PCI_ID_PRI_LAN) )
03187 {
03188
03189
03190
03191
03192
03193
03194
03195 pciConfigInLong(pciBus, pciDevice, pciFunc,
03196 PCI_CFG_BASE_ADDRESS_0, &bar0);
03197
03198 cpuPciAddr = (char *)((bar0 & 0xfffffffe) |
03199 ISA_MSTR_IO_LOCAL);
03200
03201
03202
03203
03204
03205
03206
03207 pciConfigInByte (pciBus, pciDevice, pciFunc,
03208 PCI_CFG_DEV_INT_LINE, &intLine);
03209
03210 ivec = (int)intLine;
03211 ilevel = (int)intLine;
03212
03213
03214
03215 PCI_AUTO_DEBUG_MSG("sysDynDcAttach: dc%d addr[0x%08x]\n",
03216 index,cpuPciAddr,0,0,0,0);
03217 PCI_AUTO_DEBUG_MSG(" irq[0x%08x], opmode[0x%08x]\n",
03218 ilevel,dcOpMode,0,0,0,0);
03219
03220 status = dcattach(index,cpuPciAddr,ivec,ilevel,memAdrs,
03221 memSize,memWidth,pciMemBase,dcOpMode);
03222
03223 if (status != OK)
03224 {
03225 break;
03226 PCI_AUTO_DEBUG_MSG("sysDynDcAttach: attach dc%d failed\n",index,0,0,0,0,0 );
03227 }
03228 }
03229 index++;
03230 }
03231 return(status);
03232 }
03233 #endif
03234
03235
03236
03237
03238
03239
03240
03241
03242
03243
03244
03245 #ifndef APS_BSP
03246 STATUS sysAtuInit (void)
03247 #else
03248 LOCAL STATUS sysAtuInit (void)
03249 #endif
03250 {
03251 UINT32 value;
03252
03253
03254
03255
03256
03257
03258
03259 sysPciOutLong( (UINT32)KAHLUA_ATU_ITWR, 0 );
03260
03261 value = sysPciConfigInLong((UINT32 *)(CNFG_PCI_HOST_BRDG + 0x10));
03262 value = (value & 0x00000FFF) | LOCAL_MEM_LOCAL_ADRS;
03263 sysPciConfigOutLong((UINT32 *)(CNFG_PCI_HOST_BRDG + 0x10), value);
03264
03265 value = sysPciConfigInWord((UINT16 *)(CNFG_PCI_HOST_BRDG + 0x04));
03266 value |= 0x0002;
03267 sysPciConfigOutWord((UINT16 *)(CNFG_PCI_HOST_BRDG + 0x04), value);
03268
03269 return (OK);
03270 }
03271
03272 #ifdef APS_BSP
03273
03297 STATUS sysA24MapRam(unsigned long size) {
03298 void *a24memAlloc;
03299
03300 if ((sysProcNumGet() != 0) ||
03301 (a24memPartId != NULL))
03302 return ERROR;
03303
03304 if (size > 0x800000)
03305 size = 0x800000;
03306 else if (size < 0x010000)
03307 size = 0x010000;
03308
03309 a24memAlloc = cacheDmaMalloc(size);
03310 if (a24memAlloc == NULL)
03311 return ERROR;
03312
03313 a24memPartId = memPartCreate(a24memAlloc, size);
03314 if (a24memPartId == NULL)
03315 {
03316 cacheDmaFree(a24memAlloc);
03317 a24memAlloc = 0;
03318 return ERROR;
03319 }
03320
03321
03322 a24memBase = 0xffff0000 & (unsigned long) a24memAlloc;
03323 a24memBound = 0xffff0000 & ((unsigned long) a24memAlloc + size + 0x10000);
03324
03325 a24adrOffset = a24memBase - VME_A24_SLV_BUS;
03326 a24vmeBound = a24memBound - a24adrOffset;
03327
03328 UNIV_OUT_LONG(UNIVERSE_VSI2_BS, VME_A24_SLV_BUS);
03329 UNIV_OUT_LONG(UNIVERSE_VSI2_BD, a24vmeBound);
03330 UNIV_OUT_LONG(UNIVERSE_VSI2_TO, a24adrOffset);
03331 UNIV_OUT_LONG(UNIVERSE_VSI2_CTL, VAL_VSI2_CTL);
03332
03333 return OK;
03334 }
03335
03336
03353 void *sysA24Malloc
03354 (
03355 unsigned long size
03356 )
03357 {
03358 if (a24memPartId == NULL)
03359 {
03360
03361 if (sysA24MapRam(size + MEM_PART_OVERHEAD) != OK)
03362 return NULL;
03363 }
03364
03365 return(memPartAlloc(a24memPartId, size));
03366 }
03367
03368
03369
03370
03371
03372
03373
03374
03375
03376
03377
03378
03379
03380
03381 STATUS sysA24Free
03382 (
03383 char *pBlock
03384 )
03385 {
03386 if (a24memPartId == NULL)
03387 return ERROR;
03388
03389 return(memPartFree(a24memPartId, pBlock));
03390 }
03391
03392
03403 void sysA24MemShow(void)
03404 {
03405 if (a24memPartId)
03406 {
03407 memPartShow(a24memPartId, 0);
03408 }
03409 else
03410 puts("\nNo A24 memory currently reserved");
03411 }
03412
03413
03427 STATUS sysVmeMapShow(void)
03428 {
03429 unsigned long base, bound, offset, ctl;
03430
03431 printf("\nVMEbus access from CPU:\n");
03432 UNIV_IN_LONG(UNIVERSE_LSI1_BS, &base);
03433 UNIV_IN_LONG(UNIVERSE_LSI1_BD, &bound);
03434 UNIV_IN_LONG(UNIVERSE_LSI1_TO, &offset);
03435 printf(" CPU:\t0x%8.8lX - 0x%8.8lX => A32: 0x%8.8lX - 0x%8.8lX\n",
03436 base, bound - 1, base + offset, bound + offset - 1);
03437
03438 UNIV_IN_LONG(UNIVERSE_LSI2_BS, &base);
03439 UNIV_IN_LONG(UNIVERSE_LSI2_BD, &bound);
03440 UNIV_IN_LONG(UNIVERSE_LSI2_TO, &offset);
03441 printf("\t0x%8.8lX - 0x%8.8lX => A24: 0x%6.6lX - 0x%6.6lX\n",
03442 base, bound - 1, (base + offset) & 0xffffff,
03443 (bound + offset - 1) & 0xffffff);
03444
03445 UNIV_IN_LONG(UNIVERSE_LSI3_BS, &base);
03446 UNIV_IN_LONG(UNIVERSE_LSI3_BD, &bound);
03447 UNIV_IN_LONG(UNIVERSE_LSI3_TO, &offset);
03448 printf("\t0x%8.8lX - 0x%8.8lX => A16: 0x%4.4lX - 0x%4.4lX\n",
03449 base, bound - 1, (base + offset) & 0xffff,
03450 (bound + offset - 1) & 0xffff);
03451
03452 printf("\nCPU access from VMEbus:\n");
03453 UNIV_IN_LONG(UNIVERSE_VSI1_CTL, &ctl);
03454 if (ctl & VSI_CTL_EN)
03455 {
03456 UNIV_IN_LONG(UNIVERSE_VSI1_BS, &base);
03457 #if ((SM_OFF_BOARD == FALSE) && !defined(ANY_BRDS_IN_CHASSIS_NOT_RMW))
03458 UNIV_IN_LONG(UNIVERSE_VSI5_BD, &bound);
03459 #else
03460 UNIV_IN_LONG(UNIVERSE_VSI1_BD, &bound);
03461 #endif
03462 UNIV_IN_LONG(UNIVERSE_VSI1_TO, &offset);
03463 printf(" A32:\t0x%8.8lX - 0x%8.8lX => CPU: 0x%8.8lX - 0x%8.8lX\n",
03464 base, bound - 1, base + offset, bound + offset - 1);
03465 }
03466 else
03467 printf(" A32:\t - => -\n");
03468
03469 UNIV_IN_LONG(UNIVERSE_VSI2_CTL, &ctl);
03470 if (ctl & VSI_CTL_EN)
03471 {
03472 UNIV_IN_LONG(UNIVERSE_VSI2_BS, &base);
03473 UNIV_IN_LONG(UNIVERSE_VSI2_BD, &bound);
03474 UNIV_IN_LONG(UNIVERSE_VSI2_TO, &offset);
03475 printf(" A24:\t 0x%6.6lX - 0x%6.6lX => 0x%8.8lX - 0x%8.8lX\n",
03476 base, bound - 1, base + offset, bound + offset - 1);
03477 }
03478
03479 UNIV_IN_LONG(UNIVERSE_VRAI_CTL, &ctl);
03480 if (ctl & VRAI_CTL_EN)
03481 {
03482 UNIV_IN_LONG(UNIVERSE_VRAI_BS, &base);
03483 bound = base + VME_VRAI_SLV_SIZE;
03484 printf(" A24:\t 0x%6.6lX - 0x%6.6lX => Universe-2 Registers\n",
03485 base, bound - 1);
03486 }
03487
03488 return OK;
03489 }
03490 #endif
03491 static char identsysLib_c[]="@(#) $Name: $ $Id: sysLib.c,v 1.4.2.1 2002/09/12 21:45:36 thompson Exp $";