NT4/private/ntos/fw/alpha/jnupass.s
2020-09-30 17:12:29 +02:00

182 lines
3.3 KiB
ArmAsm
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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