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