NT4/private/ntos/nthals/haltimbr/alpha/eb164io.s
2020-09-30 17:12:29 +02:00

140 lines
3.8 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) 1994 Digital Equipment Corporation
Module Name:
eb164io.s
Abstract:
This module implements flashrom I/O access routines for EB164.
Author:
Chao Chen 14-Sep-1994
Joe Notarangelo 14-Sep-1994
Jeff Wiedermeier 14-Sep-1994
Environment:
Executes in kernel mode.
Revision History:
--*/
#include "halalpha.h"
#define EB164_FLASH_BASE -0x37a9 // negative of 0xc857
#define CIA_SPARSE_IO_SVA -0x37a8 // negative of 0xc858
#define IO_BIT_SHIFT 5
//++
//
// UCHAR
// EB164_READ_FLASH_BYTE(
// ULONG Offset
// )
//
// Routine Description:
//
// Read a byte of data from the flash rom at the specified offset.
//
// Arguments:
//
// Offset (a0) - Supplies a byte offset from the base of the flash rom.
//
// Return Value:
//
// (v0) Returns the byte of data read from the flash rom.
//
//--
LEAF_ENTRY(EB164_READ_FLASH_BYTE)
and a0, 3, t2 // save byte lane to read
srl a0, 19,t1 // get bank select to lsb
and t1, 1, t1 // mask it
lda t3, CIA_SPARSE_IO_SVA(zero) // 0xffff ffff ffff c858
sll t3, 28, t3 // 0xffff fc85 8000 0000
lda t4, 0x800(zero) // get port number for bank sel
sll t4, IO_BIT_SHIFT, t4 // put it in place
or t3, t4, t3 // and merge it
stl t1, 0(t3) // write the bank select
mb
lda t0, EB164_FLASH_BASE(zero) // 0xffff ffff ffff c857
sll t0, 4, t0 // 0xffff ffff fffc 8570
lda t0, 0xf(t0) // 0xffff ffff fffc 857f
sll t0, 24, t0 // 0xffff fc85 7f00 0000
sll a0, IO_BIT_SHIFT, a0 // shift offset to sparse space
bis t0, a0, t0 // merge offset and base
ldl v0, 0(t0) // read flash rom
extbl v0, t2, v0 // extract byte from appropriate lane
ret zero, (ra) // return
.end EB164_READ_FLASH_BYTE
//++
//
// VOID
// EB164_WRITE_FLASH_BYTE(
// ULONG Offset,
// UCHAR Data
// )
//
// Routine Description:
//
// Write a byte of data to the flash rom at the specified offset.
//
// Arguments:
//
// Offset (a0) - Supplies a byte offset from the base of the flash rom.
//
// Data (a1) - Supplies the data to write.
//
// Return Value:
//
// None.
//
//--
LEAF_ENTRY(EB164_WRITE_FLASH_BYTE)
and a0, 3, t2 // save byte lane to read
srl a0, 19,t1 // get bank select to lsb
and t1, 1, t1 // mask it
lda t3, CIA_SPARSE_IO_SVA(zero) // 0xffff ffff ffff c858
sll t3, 28, t3 // 0xffff fc85 8000 0000
lda t4, 0x800(zero) // get port number for bank sel
sll t4, IO_BIT_SHIFT, t4 // put it in place
or t3, t4, t3 // and merge it
stl t1, 0(t3) // write the bank select
mb
lda t0, EB164_FLASH_BASE(zero) // 0xffff ffff ffff c857
sll t0, 4, t0 // 0xffff ffff fffc 8570
lda t0, 0xf(t0) // 0xffff ffff fffc 857f
sll t0, 24, t0 // 0xffff fc85 7f00 0000
sll a0, IO_BIT_SHIFT, a0 // shift offset to sparse space
bis t0, a0, t0 // merge offset and base
insbl a1, t2, a1 // put data into correct lane
stl a1, 0(t0) // write the flash rom
mb // order the write
ret zero, (ra) // return
.end EB164_WRITE_FLASH_BYTE