mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
3.8 KiB
139 lines
3.8 KiB
|
|
/*++
|
|
|
|
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
|
|
|