Files
Arquivotheca.SunOS-4.1.4/sys/sundev/ipdev.h
seta75D ff309bfe1c Init
2021-10-11 18:37:13 -03:00

667 lines
18 KiB
C

/*
* @(#)ipdev.h 1.1 94/10/31 Copyright (c) 1988 by Sun Microsystems, Inc.
*
*/
#ifndef _IPIPKT
#define _IPIPKT_
#define IPI3PKTLEN 64
/*
* Define all the IPI-3 commands and parameters
* (EVERYTHING HARDWARE SPECIFIC COMES HERE)
*/
/*****************************************
* I P I - 3 P A C K E T I N F O
*****************************************/
/************************
* P A R A M E T E R S
************************/
/*
* NOTE:
* Substatus parameters can have one of two parameter IDs, depending
* on whether a controller or a facility is being referred to. The form
* for the ID is 'xN' where x is 1 if the status refers to a controller,
* 2 if it refers to a facility. For example, the intervention required
* parameter ID is 0x12 if a command couldn't be completed because
* the controller needs help, or 0x22 if the facility was at fault.
*/
/*
* Diagnostic Exception (0x12 or 0x22). An error has occured during
* on-board diagnostics. Bit defs below.
*/
struct diag_excep_parm {
u_char len;
u_char id;
u_char status[2];
u_char reservd[2];
};
/*
* Intervention Required (0x14 or 0x24). The controller is unable to
* respond and intervention is required before it will be able to.
*/
struct interv_rqd_parm {
u_char len;
u_char id;
u_char status;
u_char reservd[3];
};
/*
* Alternate Port Exception (0x15 or 0x25). The slave or facility
* has detected an event from an alternate port.
*/
struct altport_parm {
u_char len;
u_char id;
u_char status;
u_char reservd[2];
};
/*
* Machine Exception (0x16 or 0x26). An unusual hardware condition
* has been detected on a controller or facility.
*/
struct machexcp_parm {
u_char len;
u_char id;
u_char status[4];
u_char ext_status;
u_char reservd;
};
/*
* Command Exception (0x17 or 0x27). Exceptions relating to command
* processing.
*/
struct cmdexcep_parm {
u_char len;
u_char id;
u_char status[4];
u_char ext_status;
u_char reservd;
};
/*
* Conditional Success (0x17 or 0x27). The command succeeded, but
* additional information is available (e.g. retries were done).
*/
struct condsucc_parm {
short pad;
u_char len;
u_char id;
u_char status[4];
u_char ext_status;
u_char reservd;
};
/*
* Transfer Notification Parm (0x30). Holds the read/write
* buffer address in DVMA space.
*/
struct xnote_parm {
short pad;
u_char len;
u_char id;
caddr_t bufadr; /* DVMA buffer address */
};
/*
* Command Extent Parm (0x31). Defines the tranfer count and start address
* (expressed as a logical block offset from the start of the disk)
* for the transfer.
*/
struct cmdx_parm {
short pad;
u_char len;
u_char id;
u_long blk_cnt; /* # of Blocks (sectors) to read */
daddr_t lbn; /* start address for transfer */
};
/*
* Transfer Parm (0x3c). Options for data transfer commands.
* Currently used only by WRITE to do a "write with verify".
*/
struct xfer_parm {
u_char len;
u_char id;
u_char xferopt; /* see bits below */
};
/*
* Disk Modes parameter (0x51). Allows the host to change the operating
* characteristics of the slave or facility. Bit defs for mode field are
* described below.
*/
struct dkmode_parm {
u_char len;
u_char id;
u_short modes;
};
/*
* Vendor ID parameter (0x50). Supply vendor specific info.
* Extra fields are supplied for future expansion. This parameter
* is read-only.
*/
struct vendor_parm {
u_char len;
u_char id;
char manuf[0x10]; /* Manufacturer's ID (SUNMICRO) */
char model[8]; /* Model # (PANTHER) */
u_char hdwr_rev; /* Hardware Revision Level */
u_char artw_rev; /* Artwork Revision Level */
u_char firm_rev; /* Firmware Revision Level */
u_char resrvd; /* Reserved */
char uniq_id[8]; /* Unique ID */
u_char switset[4]; /* Switch Settings */
u_char extra[8]; /* extra space */
};
/*
* Size of DataBlocks parameter (0x51). Default is 512.
*/
struct datbsize_parm {
u_char len;
u_char id;
int dblksize;
};
/*
* Size of Physical Blocks parameter (0x52). Always the same as DataBlocks.
*/
struct physbsize_parm {
u_char len;
u_char id;
int pblksize;
};
/*
* Total Number of Disk Data Blocks parameter (0x53).
* The starting address field is always zero.
*/
struct numdatblks_parm {
u_char len;
u_char id;
int bperpart; /* Blocks per Partition */
int bpercyl; /* Blocks per Cylinder */
int bpertrk; /* Blocks per Track */
int strtadr; /* Starting Address */
};
/*
* Total Number of Disk Physical Blocks parameter (0x54).
* The starting address field is always zero.
*/
struct numphyblks_parm {
u_char len;
u_char id;
int bperpart; /* Blocks per Partition */
int bpercyl; /* Blocks per Cylinder */
int bpertrk; /* Blocks per Track */
int strtadr; /* Starting Address */
};
/*
* Data Block Sizes Supported parameter (0x55). Define the
* size (in bytes) of a data block. Default is 512.
*/
struct datbss_parm {
u_char len;
u_char id;
int mindatbs; /* Min data block size. Default = 512 */
int maxdatbs; /* Max data block size. Default = 2048 */
int incsize; /* Increment size. Default = 512 */
};
/*
* Physical Block Sizes Supported parameter (0x56). Define the
* size (in bytes) of a physical block. Default is 512.
*/
struct phybss_parm {
u_char len;
u_char id;
int mindatbs; /* Min data block size. Default = 512 */
int maxdatbs; /* Max data block size. Default = 2048 */
int incsize; /* Increment size. Default = 512 */
};
/*
* Pad with Fill Characters parameter (0x5a). The slave uses the value
* in this field when it needs to pad data. The default is 0xfb87.
*/
struct pad_parm {
u_char len;
u_char id;
char filler[4]; /* Fill characters */
};
/*
* Physical Disk Configuration parameter (0x5f).
*/
struct physdk_parm {
u_char len;
u_char id;
int ncyls; /* Number of Cylinders */
int nheads; /* Number of Heads */
int nsects; /* Sectors per Track */
int nbytes; /* Bytes per Track */
int sinseek; /* Single Cylinder Seek Time (usec) */
int avgseek; /* Average Cylinder Seek Time (usec) */
int maxseek; /* Maximum Cylinder Seek Time (usec) */
int hdswit; /* Head Switch Time (usec) */
int rotper; /* Rotational period (usec) */
char modno[4]; /* ASCII Model Number */
};
/*
* Addressee Configuration parameter (0x65). Define the operating
* characteristics of the addressee (controller).
*/
struct addrconf_parm {
u_char len;
u_char id;
int bufrsize; /* size of slave buffer (256K default) */
int cmdbufsize; /* Command buffer size (4352 default)!? */
short maxbcmdpkt; /* Max len of cmd packet (64 bytes default) */
short maxbrsppkt; /* Max len of response packet (64 bytes default) */
u_char resrvd; /* Reserved */
u_char minqued; /* Min # of cmds we can queue (8 default) */
u_char maxqued; /* Max # of cmds we can queue (64 default) */
u_char stksiz; /* Min # of cmds we can stack (68 default) */
};
/*
* Slave Configuration (bit significant) parameter (0x66). Define the
* operating characteristics of the slave (facility) using bit fields.
*/
struct slavconf_bs_parm {
u_char len;
u_char id;
u_char slavebits[4]; /* slave config bit fields (defines below) */
};
/*
* Slave Configuration (Fields) parameter (0x67). Define the
* operating characteristics of the slave (facility) using fields.
*/
struct slavconf_fld_parm {
u_char len;
u_char id;
u_char spare1[3];
u_char nparts; /* number of data partitions per facility (1) */
u_char spare2[4];
u_char maxextent; /* max number of extents */
u_char spare3[5];
char fattched[8]; /* number of facitilies attached */
};
/*
* Facilities Attached to Slave parameter (0x68). Identify the facilities
* (disks) attached to the slave. Leave room for the maximum possible.
*/
struct fatt_parm { /* no, not fat farm... */
u_char len;
u_char id;
struct facil {
u_char fadr; /* Facility Address */
u_char fclass; /* Facility Class */
u_char ftype; /* Facility Type */
} facil[8]; /* declare max possible */
};
/*
* Request Parm parameter (0x6c). This parameter is used two ways: first,
* the response parameter is passed back as data (i.e. DMA'ed like a
* normal data operation). We need to specify the length in such a case
* because the data comes back with no header. We always set the length
* (via the Parm Length parameter) to be 8k to be sure that we never
* have a buffer overrun. The ID of the requested parameter is also needed
* this case because a parameter sent back as data has no identifier fields.
* The other method for obtaining a response is to ask for the response to
* be sent back as an IPI-3 response packet. In this case, we actually get
* the packet from Panther's shared memory area. The parameter ID is used
* to tell Panther which parameter we want.
*/
struct reqparm_parm {
u_char len;
u_char id;
u_char howto; /* specify how to respond - see bitdefs below */
u_char whichparm; /* ID of requested parameter */
};
/*
* Parm Length parameter (0x6d). This is used with the Request Parm
* parameter to specify how long a response transferred as data will
* be. This is always set to 8k - probably overkill, but it doesn't hurt.
*/
struct parmlen_parm {
u_short pad;
u_char len;
u_char id;
u_long parmlen; /* Length of parameter in bytes */
};
/*
* Slave Reconfiguration parameter - Bit Significant (0x6e). Define the
* reconfigurable attributes of the slave. Bit fields are described below.
*/
struct reconf_bs_parm {
u_char len;
u_char id;
u_char conf1;
u_char conf2;
u_char conf3;
u_char resrvd;
};
/*
* Slave Reconfiguration parameter - Fields (0x6f). Define the
* reconfigurable attributes of the slave.
*/
struct reconf_fld_parm {
u_char len;
u_char id;
u_char resrv1[8]; /* Reserved */
short maxbincmd; /* Maximum bytes in command packet */
short maxbinrsp; /* Maximum bytes in response packet */
u_char resrv2[8];
int burstsize; /* DMA burst length in bytes (128) */
u_char resrv3[8];
};
/*
* Panther Reconfiguration parameter (0xD0). Put vendor unique stuff here.
*/
struct panreconf_parm {
u_char len;
u_char id;
u_char rahead; /* Read-Ahead enabled flag */
u_char burstlate; /* Inter-Burst latency */
short breqlevl; /* VME Bus Request level */
short vecnum; /* Interrupt Vector Number */
short shmemoff; /* Offset from base I/O addr for shared mem */
char resrv1[14]; /* Reserved */
};
/*
* Common header for all IPI-3 packets. The reference number
* is the unique ID for a command.
*/
typedef long Align;
union ipi3header {
struct {
short hdr_pktlen; /* cmd packet length */
u_short hdr_refno; /* cmd reference number */
u_char hdr_opcode; /* cmd Op Code */
u_char hdr_mods; /* Common and OpCode modifiers */
u_char hdr_ctlr; /* slave address (ctlr number) */
u_char hdr_unit; /* facility address (unit number) */
} hdr;
Align x;
};
/*
* Command Packet. The structure is a generic preamble followed by
* the parameters for this command. The parameters are broken out
* and reused by many different commands. The padding in many of the
* commands is to ensure correct longword alignment on SPARC machines.
*/
struct ipi3pkt {
union ipi3header pkt_hdr;
union ipi_parms {
/*
*******************
* CONTROL COMMANDS
*******************
*/
struct attributes {
/*
* This is a union because we only report or load
* parameters one at a time.
*/
union {
struct vendor_parm vendor;
struct datbsize_parm datbs;
struct physbsize_parm phybs;
struct numdatblks_parm ndblks;
struct numphyblks_parm npblks;
struct datbss_parm dbss;
struct phybss_parm pbss;
struct pad_parm pad;
struct addrconf_parm addrconf;
struct physdk_parm physdk;
struct slavconf_bs_parm slavconf_bit;
struct slavconf_fld_parm slavconf_fld;
struct fatt_parm fatt;
struct reqparm_parm reqparm;
struct parmlen_parm parmlen;
struct reconf_bs_parm reconbit;
struct reconf_fld_parm reconfld;
struct panreconf_parm panther;
} parm;
} attrib;
struct nop {
char foo[IPI3PKTLEN - (sizeof (union ipi3header))];
} nop;
struct operating_mode {
struct dkmode_parm dkmode;
} opermode;
struct report_addressee_status {
struct dkmode_parm dkstat;
} status;
/*
*******************
* POSITION COMMANDS
*******************
*/
struct position_control {
struct cmdx_parm cxp;
} posctl;
struct report_position {
struct cmdx_parm cxp;
} rptpos;
/*
*********************
* TRANSFER COMMANDS
*********************
*/
struct format {
struct cmdx_parm cxp;
} format;
struct read_write {
struct xnote_parm xnp;
struct cmdx_parm cxp;
} rdwr;
/*
***********************
* COMBINATION COMMANDS
***********************
*/
struct allocate_restore {
struct cmdx_parm cxp;
} allocrest;
struct reallocate {
struct cmdx_parm cxp;
} realloc;
/*
**********************
* DIAGNOSTIC COMMANDS
**********************
*/
/* XXX - these are still undefined */
/*
struct ctlr_diag {
} cdiag;
struct facil_diag {
} fdiag;
*/
/*
* The following is for the READ DEFECT LIST and
* READ ERROR LOG commands.
*/
struct spec_read {
struct xnote_parm xnp;
struct reqparm_parm reqparm;
struct parmlen_parm plenparm;
} rdspec;
} p_cmd;
};
/*
* IPI-3 response/error packet. Each controller is assigned one
* statically, since Panther posts only one response packet at a time.
*/
struct ipi3rsp {
union ipi3header res_hdr;
u_short r_stat;
union {
/*
* Substatus.
*/
struct diag_excep_parm diag_excep;
struct interv_rqd_parm interv_rqd;
struct altport_parm altport;
struct machexcp_parm mach_excep;
struct cmdexcep_parm cmd_excep;
struct condsucc_parm cond_succ;
/*
* Response parameters. The commands that currently send these
* are Report Addressee Status, Report Position, and Report
* Attributes.
*/
union ipi_parms r_resp;
} r_parm;
};
#define XFER_NOTIFY 0x30 /* transfer notification (VME addr) */
#define CMD_EXTENT 0x31 /* command extent (count + block addr ) */
/* Bitdefs for Opcode Modifier in ATTRIBUTES header */
#define REPT_ATTRIB 0 /* Report (read) an Attribute */
#define INIT_ATTRIB 1 /* Initialize Attributes */
#define LOAD_ATTRIB 9 /* Load (write) an Attribute */
#define SAVE_ATTRIB 0xa /* Save the attribute in EEPROM */
/* ATTRIBUTES Parameters */
#define ATTR_VENDOR 0x50 /* vendor specific information */
#define LOG_BLK_SIZ 0x51 /* logical data block size */
#define PHYS_BLK_SIZ 0x52 /* physical data block size */
#define LOG_BLK_LAYOUT 0x53 /* layout of blocks on disk */
#define PHYS_BLK_LAYOUT 0x54 /* layout of blocks on disk */
#define LOG_BLOCK_SUP 0x55 /* logical block sizes supported */
#define PHYS_BLOCK_SUP 0x56 /* physical block sizes supported */
#define ATTR_FILL_PAT 0x5a
#define ATTR_PHYSDK 0x5f
#define ATTR_CTLR_CONF 0x65
#define ATTR_FAC_ATTACH 0x68
#define ATTR_REQPARM 0x6c
#define ATTR_PARMLEN 0x6d
#define ATTR_SLVCNF_BIT 0x6e
#define ATTR_SLVCNF_FLD 0x6f
#define ATTR_PANTHER 0xd0
/* Bitdefs for REQUEST PARM parameter */
#define RESP_AS_PKT 0x10 /* Send back as a response packet */
#define RESP_AS_DATA 0x30 /* Send back as data */
/*
* defs for response type in major status.
*/
#define RTYP_NRML 0x01 /* normal cmd completion */
#define RTYP_COMBO 0x03 /* combination cmd completion */
#define RTYP_ASYNC 0x04 /* asychronous response */
/*
* Bitdefs for the rp_spec field in the Request Parm parameter
*/
#define RP_PASD 0x8 /* Naked Parm as Data (yow) */
#define RP_LEN 0x10 /* Len of data returned (used w RP_PASD) */
#define RP_PINR 0x20 /* Send back parameter in response pkt */
/*
* Bitdefs for the Disk Mode parameter
*/
#define IREZERO 0x0 /* Set Heads to initial position */
#define LOCKCRG 0x1 /* Lock Carriage */
#define UNLDHEADS 0x2 /* Unload read/write Heads */
#define LDHEADS 0x4 /* Load read/write Heads */
#define ULOCKCART 0x8 /* Unlock Cartridge */
#define LOCKCART 0x10 /* Lock Cartridge */
#define SPINDOWN 0x20 /* Spin Down the disk */
#define SPINUP 0x40 /* Spin Up the disk */
struct ipidevice {
u_long dev_bir; /* Board id. reg */
u_long dev_csr; /* rw - CSR */
u_long dev_cmdreg; /* w - command register */
u_long dev_resp; /* r - response register */
u_long dev_vector; /* VME interrupt vector */
u_long dev_aux[3]; /* Aux. registers */
struct ipi3pkt dev_cmd_pkt; /* IPI-3 command packet */
struct ipi3rsp dev_resp_pkt; /* IPI-3 response packet */
};
/* CSR Bit Definitions */
#define CSR_RESET (u_long)0x01 /* reset */
#define CSR_EICRNB (u_long)0x02 /* enable int on cmd register not busy */
#define CSR_EIRRV (u_long)0x04 /* enable int on response register valid */
#define CSR_CRBUSY (u_long)0x08 /* Command Register Busy */
#define CSR_RRVLID (u_long)0x10 /* Response Register Valid */
#define CSR_RESERVE1 (u_long)0x20 /* Spare bit 1 */
#define CSR_RESERVE2 (u_long)0x40 /* Spare bit 1 */
#define CSR_RESERVE3 (u_long)0x80 /* Spare bit 1 */
#define CSR_ERROR (u_long)0x100 /* Response Register Valid */
#define CSR_MRINFO (u_long)0x200 /* Response Register Valid */
#define CSR_LED0 (u_long)0x01000000 /* LED 0 */
#define CSR_LED1 (u_long)0x02000000
#define CSR_LED2 (u_long)0x04000000
#define CSR_LED3 (u_long)0x08000000
#define CSR_LED4 (u_long)0x10000000
#define CSR_LED5 (u_long)0x20000000
#define CSR_LED6 (u_long)0x40000000
#define CSR_LED7 (u_long)0x80000000 /* LED 7 */
#define BOARDD(x) x->c_io->dev_bir
#define STATUS(x) x->c_io->dev_csr
#define CMDREG(x) x->c_io->dev_cmdreg
#define RSPREG(x) x->c_io->dev_resp
#define INTVEC(x) x->c_io->dev_vector
#define IP_NOTOPER 0x40000000
#define IP_NOTREADY 0x10000000
#endif _IPIPKT_