/*+M*************************************************************************
 * Perceptive Solutions, Inc. PSI-240I device driver proc support for Linux.
 *
 * Copyright (c) 1997 Perceptive Solutions, Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; see the file COPYING.  If not, write to
 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 *
 *	File Name:	psi_chip.h
 *
 *	Description:	This file contains the interface defines and
 *					error codes.
 *
 *-M*************************************************************************/
#ifndef PSI_CHIP
#define PSI_CHIP

/************************************************/
/*		Misc konstants							*/
/************************************************/
#define	CHIP_MAXDRIVES			8

/************************************************/
/*		Chip I/O addresses						*/
/************************************************/
#define	CHIP_ADRS_0				0x0130
#define	CHIP_ADRS_1				0x0150
#define	CHIP_ADRS_2				0x0190
#define	CHIP_ADRS_3				0x0210
#define	CHIP_ADRS_4				0x0230
#define	CHIP_ADRS_5				0x0250

/************************************************/
/*		EEPROM locations		*/
/************************************************/
#define	CHIP_EEPROM_BIOS		0x0000		// BIOS base address
#define	CHIP_EEPROM_DATA		0x2000	   	// SETUP data base address
#define	CHIP_EEPROM_FACTORY		0x2400	   	// FACTORY data base address
#define	CHIP_EEPROM_SETUP		0x3000	   	// SETUP PROGRAM base address

#define	CHIP_EEPROM_SIZE		32768U	   	// size of the entire EEPROM
#define	CHIP_EEPROM_BIOS_SIZE	8192	   	// size of the BIOS in bytes
#define	CHIP_EEPROM_DATA_SIZE	4096	   	// size of factory, setup, log data block in bytes
#define	CHIP_EEPROM_SETUP_SIZE	20480U	   	// size of the setup program in bytes

/************************************************/
/*		Chip Interrupts							*/
/************************************************/
#define	CHIP_IRQ_10				0x72
#define	CHIP_IRQ_11				0x73
#define	CHIP_IRQ_12				0x74

/************************************************/
/*		Chip Setup addresses		*/
/************************************************/
#define	CHIP_SETUP_BASE			0x0000C000L

/************************************************/
/*		Chip Register address offsets	*/
/************************************************/
#define	REG_DATA				0x00
#define	REG_ERROR				0x01
#define	REG_SECTOR_COUNT		0x02
#define	REG_LBA_0				0x03
#define	REG_LBA_8				0x04
#define	REG_LBA_16				0x05
#define	REG_LBA_24				0x06
#define	REG_STAT_CMD			0x07
#define	REG_SEL_FAIL			0x08
#define	REG_IRQ_STATUS			0x09
#define	REG_ADDRESS				0x0A
#define	REG_FAIL				0x0C
#define	REG_ALT_STAT		   	0x0E
#define	REG_DRIVE_ADRS			0x0F

/************************************************/
/*		Chip RAM locations		*/
/************************************************/
#define	CHIP_DEVICE				0x8000
#define	CHIP_DEVICE_0			0x8000
#define CHIP_DEVICE_1			0x8008
#define	CHIP_DEVICE_2			0x8010
#define	CHIP_DEVICE_3			0x8018
#define	CHIP_DEVICE_4			0x8020
#define	CHIP_DEVICE_5			0x8028
#define	CHIP_DEVICE_6			0x8030
#define	CHIP_DEVICE_7			0x8038
typedef struct
	{
	UCHAR	channel;		// channel of this device (0-8).
	UCHAR	spt;			// Sectors Per Track.
	ULONG	spc;			// Sectors Per Cylinder.
	}	CHIP_DEVICE_N;

#define	CHIP_CONFIG				0x8100		// address of boards configuration.
typedef struct
	{
	UCHAR		irq;			// interrupt request channel number
	UCHAR		numDrives;		// Number of accessible drives
	UCHAR		fastFormat;	 	// Boolean for fast format enable
	}	CHIP_CONFIG_N;

#define	CHIP_MAP				0x8108 		// eight byte device type map.


#define	CHIP_RAID				0x8120 		// array of RAID signature structures and LBA
#define	CHIP_RAID_1				0x8120
#define CHIP_RAID_2				0x8130
#define	CHIP_RAID_3				0x8140
#define	CHIP_RAID_4				0x8150

/************************************************/
/*		Chip Register Masks		*/
/************************************************/
#define	CHIP_ID					0x7B
#define	SEL_RAM					0x8000
#define	MASK_FAIL				0x80

/************************************************/
/*		Chip cable select bits		*/
/************************************************/
#define	SECTORSXFER				8

/************************************************/
/*		Chip cable select bits		*/
/************************************************/
#define	SEL_NONE				0x00
#define	SEL_1					0x01
#define	SEL_2					0x02
#define	SEL_3					0x04
#define	SEL_4					0x08

/************************************************/
/*		Programmable Interrupt Controller*/
/************************************************/
#define	PIC1					0x20		// first 8259 base port address
#define	PIC2					0xA0		// second 8259 base port address
#define	INT_OCW1				1			// Operation Control Word 1: IRQ mask
#define	EOI						0x20		// non-specific end-of-interrupt

/************************************************/
/*		Device/Geometry controls				*/
/************************************************/
#define GEOMETRY_NONE		 	0x0			// No device
#define GEOMETRY_AUTO			0x1			// Geometry set automatically
#define GEOMETRY_USER		 	0x2			// User supplied geometry

#define	DEVICE_NONE				0x0			// No device present
#define	DEVICE_INACTIVE			0x1			// device present but not registered active
#define	DEVICE_ATAPI			0x2			// ATAPI device (CD_ROM, Tape, Etc...)
#define	DEVICE_DASD_NONLBA		0x3			// Non LBA incompatible device
#define	DEVICE_DASD_LBA			0x4			// LBA compatible device

/************************************************/
/*		Setup Structure Definitions	*/
/************************************************/
typedef struct							// device setup parameters
	{
	UCHAR			geometryControl;	// geometry control flags
	UCHAR		   	device;				// device code
	USHORT			sectors;			// number of sectors per track
	USHORT			heads;				// number of heads
	USHORT			cylinders;			// number of cylinders for this device
	ULONG			blocks;				// number of blocks on device
	USHORT			spare1;
	USHORT			spare2;
	} SETUP_DEVICE, *PSETUP_DEVICE;

typedef struct		// master setup structure
	{
	USHORT 			startupDelay;
	USHORT 			promptBIOS;
	USHORT 			fastFormat;
	USHORT			spare2;
	USHORT			spare3;
	USHORT			spare4;
	USHORT			spare5;
	USHORT			spare6;
	SETUP_DEVICE	setupDevice[8];
	}	SETUP, *PSETUP;

#endif