    #ifndef __SYS_U64GIO_H__
    #define __SYS_U64GIO_H__

    /*
     * Copyright 1995, Silicon Graphics, Inc.
     * All Rights Reserved.
     *
     * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
     * the contents of this file may not be disclosed to third parties, copied or
     * duplicated in any form, in whole or in part, without the prior written
     * permission of Silicon Graphics, Inc.
     *
     * RESTRICTED RIGHTS LEGEND:
     * Use, duplication or disclosure by the Government is subject to restrictions
     * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
     * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
     * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
     * rights reserved under the Copyright Laws of the United States.
     *
     */

    #define DEV_U64	"/dev/u64"
    #define DEV_U64_PRINT "/dev/u64_print"
    #define DEV_U64_DEBUG "/dev/u64_debug"
    #define DEV_U64_LOG "/dev/u64_logging"
    #define DEV_U64_DATA "/dev/u64_data"
    #define DEV_U64_FAULT "/dev/u64_fault"
    #define DEV_U64_KDEBUG "/dev/u64_kdebug"
    #define DEV_U64_PROFILE "/dev/u64_profile"
    /*
     * ioctls
     */
    #define U64IOC		('u'<<24|'6'<<16)
    #define U64IOCTL(x)	(U64IOC|x)

    #define U64_RESET	U64IOCTL(1)	/* arg: 0 - deassert, 1 - assert */
    #define U64_WRITE	U64IOCTL(2)
    #define U64_READ	U64IOCTL(3)
    #define U64_SAFE_WRITE	U64IOCTL(4)
    #define U64_SAFE_READ	U64IOCTL(5)
    #define U64_LISTEN	U64IOCTL(6)	/* arg is register value for listen */
    #define	U64_SIGNAL	U64IOCTL(7)	/* arg is register value for signal */

    #if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)

    /* structure for WRITE  & SAFE_WRITE*/
    typedef struct u64_write_arg {
        void *buffer;
        long ramrom_addr;
        int nbytes;
    } u64_write_arg_t;

    /* structure for READ & SAFE_READ */
    typedef struct u64_read_arg {
        void *buffer;
        long ramrom_addr;
        int nbytes;
    } u64_read_arg_t;

    /* NOTE: if game is in reset, don't interrupt the game */

    struct u64_board {
        volatile unsigned int	product_id_reg;	/* bf400000, read only */
        unsigned char 			fill_0[0x3fc];
        volatile unsigned int	reset_control;	/* bf400400, write only */
        unsigned char 			fill_1[0x3fc];
        volatile unsigned int	cart_interrupt;	/* bf400800, read/write */
        unsigned char 			fill_3[0x1fc];
        volatile unsigned int	dram_page_cntrl;/* bf400a00, read/write */
        unsigned char 			fill_2[0x1fc];
        volatile unsigned int	gio_interrupt;	/* bf400c00, read only */
        unsigned char 			fill_4[0x1fc];
        volatile unsigned int	gio_sync;	/* bf400e00, read only */
    };

    #endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */

    /*
     * _U64_PRODUCT_ID_REG - GIO bus Product ID register
     */
    #define	_U64_PRODUCT_ID_MASK		0x0000007f
    #define	_U64_PRODUCT_ID_VALUE		0x00000015

    /*
     * reset control register has two bits defined
     */
    #define _U64_RESET_CONTROL_NMI		0x4
    #define _U64_RESET_CONTROL_RESET	0x2

    /*
     * Only look at the least significant 5 bits of the sync and interrupt
     * registers.  Future revs of the firmware may provide more.
     */

    #define _U64_REGMASK			0x1f

    /*
     * 16MB available, one meg at a time, selected by the 4 bit
     * dram_page_cntrl register setting.
     */
    #define U64_MEM_SIZE			0x100000

    /*
     * Declare size of gio-addressable memory to mmap, and provide the base
     * physical address so that clients who want to mmap() may do so.
     */
    #define U64_GIOBUS_SIZE	0x200000	/* 2 MB */
    #define U64_GIOBUS_BASE 0x1f400000

    #endif /* __SYS_U64GIO_H__ */