182 lines
3.3 KiB
ArmAsm
182 lines
3.3 KiB
ArmAsm
/*++
|
||
|
||
Copyright (c) 1993 Digital Equipment Corporation
|
||
|
||
|
||
Module Name:
|
||
|
||
jnupass.s
|
||
|
||
|
||
Abstract:
|
||
|
||
This contains assembler code routines for the Alpha
|
||
firmware update programs (e.g., JNUPDATE.EXE).
|
||
|
||
|
||
Author:
|
||
|
||
John DeRosa [DEC] 21-May-1992
|
||
|
||
|
||
Environment:
|
||
|
||
Executes in kernel mode.
|
||
|
||
Revision History:
|
||
|
||
Bruce Butts [DEC] 04-June-1993
|
||
|
||
Added functions to read and write Morgan control space registers.
|
||
|
||
|
||
--*/
|
||
|
||
#include "ksalpha.h"
|
||
#include "machdef.h"
|
||
|
||
/*****************************************************************
|
||
|
||
Simple functions to perform memory barriers. These are needed because
|
||
our current compiler does not do asm's.
|
||
|
||
******************************************************************/
|
||
|
||
|
||
LEAF_ENTRY(AlphaInstIMB)
|
||
|
||
callpal imb
|
||
ret zero, (ra)
|
||
|
||
.end AlphaInstIMB
|
||
|
||
|
||
|
||
LEAF_ENTRY(AlphaInstMB)
|
||
|
||
mb
|
||
ret zero, (ra)
|
||
|
||
.end AlphaInstMB
|
||
|
||
|
||
|
||
LEAF_ENTRY(AlphaInstHalt)
|
||
|
||
callpal halt
|
||
ret zero, (ra) # should never return, but...
|
||
|
||
.end AlphaInstHalt
|
||
|
||
|
||
#ifdef MORGAN
|
||
|
||
/*****************************************************************
|
||
|
||
Functions to read and write Morgan Harley chip set control
|
||
registers. This routines are very similar to the HAL functions
|
||
READ_REGISTER_ULONG and WRITE_REGISTER_ULONG; the difference is
|
||
that bits <4:0> of the physical address of the control register
|
||
*must be zero*, instead of a 0x18 as in the HAL functions.
|
||
Addresses supplied are normal QVA of the desired control register.
|
||
|
||
******************************************************************/
|
||
|
||
|
||
LEAF_ENTRY(READ_CONTROL_REGISTER_ULONG)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Reads a longword location from Morgan control register space.
|
||
|
||
|
||
Arguments:
|
||
|
||
a0 QVA of longword to be read.
|
||
|
||
|
||
Return Value:
|
||
|
||
v0 Register data.
|
||
|
||
--*/
|
||
|
||
and a0, QVA_SELECTORS, t1 # get qva selector bits
|
||
xor t1, QVA_ENABLE, t1 # ok iff QVA_ENABLE set in selectors
|
||
bne t1, 2f # if ne, iff failed
|
||
|
||
zap a0, 0xf0, a0 # clear <63:32>
|
||
bic a0, QVA_ENABLE,a0 # clear QVA fields so shift is correct
|
||
sll a0, IO_BIT_SHIFT, t0
|
||
ldiq t4, -0x4000
|
||
sll t4, 28, t4
|
||
or t0, t4, t0 # superpage mode
|
||
|
||
// or t0, IO_LONG_LEN, t0 # or in the byte enables
|
||
|
||
ldl v0, (t0) # read the longword
|
||
ret zero, (ra)
|
||
|
||
2:
|
||
//
|
||
// On non-I/O space access, do a normal memory operation
|
||
//
|
||
ldl v0, (a0) # read the longword
|
||
ret zero, (ra)
|
||
|
||
|
||
.end READ_CONTROL_REGISTER_ULONG
|
||
|
||
|
||
|
||
LEAF_ENTRY(WRITE_CONTROL_REGISTER_ULONG)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Writes a longword location to I/O space.
|
||
|
||
|
||
Arguments:
|
||
|
||
a0 QVA of longword to be read.
|
||
a1 Longword to be written.
|
||
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
|
||
--*/
|
||
|
||
and a0, QVA_SELECTORS, t1 # get qva selector bits
|
||
xor t1, QVA_ENABLE, t1 # ok iff QVA_ENABLE set in selectors
|
||
bne t1, 2f # if ne, iff failed
|
||
|
||
zap a0, 0xf0, a0 # clear <63:32>
|
||
bic a0, QVA_ENABLE,a0 # clear QVA fields so shift is correct
|
||
sll a0, IO_BIT_SHIFT, t0
|
||
ldiq t4, -0x4000
|
||
sll t4, 28, t4
|
||
or t0, t4, t0 # superpage mode
|
||
|
||
// or t0, IO_LONG_LEN, t0 # or in the byte enables
|
||
|
||
stl a1, (t0) # write the longword
|
||
mb # order the write
|
||
ret zero, (ra)
|
||
|
||
2:
|
||
// BREAK_DEBUG_STOP # _KDA_ don't want this access
|
||
stl a1, (a0) # store the longword
|
||
ret zero, (ra)
|
||
|
||
.end WRITE_CONTROL_REGISTER_ULONG
|
||
|
||
|
||
#endif // ifdef MORGAN
|