xref: /openbmc/linux/drivers/scsi/mesh.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * mesh.h: definitions for the driver for the MESH SCSI bus adaptor
41da177e4SLinus Torvalds  * (Macintosh Enhanced SCSI Hardware) found on Power Macintosh computers.
51da177e4SLinus Torvalds  *
61da177e4SLinus Torvalds  * Copyright (C) 1996 Paul Mackerras.
71da177e4SLinus Torvalds  */
81da177e4SLinus Torvalds #ifndef _MESH_H
91da177e4SLinus Torvalds #define _MESH_H
101da177e4SLinus Torvalds 
1157cbd78eSBart Van Assche struct mesh_cmd_priv {
12*2e1b3175SFinn Thain 	int this_residual;
13*2e1b3175SFinn Thain 	int message;
14*2e1b3175SFinn Thain 	int status;
1557cbd78eSBart Van Assche };
1657cbd78eSBart Van Assche 
mesh_priv(struct scsi_cmnd * cmd)17*2e1b3175SFinn Thain static inline struct mesh_cmd_priv *mesh_priv(struct scsi_cmnd *cmd)
1857cbd78eSBart Van Assche {
19*2e1b3175SFinn Thain 	return scsi_cmd_priv(cmd);
2057cbd78eSBart Van Assche }
2157cbd78eSBart Van Assche 
221da177e4SLinus Torvalds /*
231da177e4SLinus Torvalds  * Registers in the MESH controller.
241da177e4SLinus Torvalds  */
251da177e4SLinus Torvalds 
261da177e4SLinus Torvalds struct mesh_regs {
271da177e4SLinus Torvalds 	unsigned char	count_lo;
281da177e4SLinus Torvalds 	char pad0[15];
291da177e4SLinus Torvalds 	unsigned char	count_hi;
301da177e4SLinus Torvalds 	char pad1[15];
311da177e4SLinus Torvalds 	unsigned char	fifo;
321da177e4SLinus Torvalds 	char pad2[15];
331da177e4SLinus Torvalds 	unsigned char	sequence;
341da177e4SLinus Torvalds 	char pad3[15];
351da177e4SLinus Torvalds 	unsigned char	bus_status0;
361da177e4SLinus Torvalds 	char pad4[15];
371da177e4SLinus Torvalds 	unsigned char	bus_status1;
381da177e4SLinus Torvalds 	char pad5[15];
391da177e4SLinus Torvalds 	unsigned char	fifo_count;
401da177e4SLinus Torvalds 	char pad6[15];
411da177e4SLinus Torvalds 	unsigned char	exception;
421da177e4SLinus Torvalds 	char pad7[15];
431da177e4SLinus Torvalds 	unsigned char	error;
441da177e4SLinus Torvalds 	char pad8[15];
451da177e4SLinus Torvalds 	unsigned char	intr_mask;
461da177e4SLinus Torvalds 	char pad9[15];
471da177e4SLinus Torvalds 	unsigned char	interrupt;
481da177e4SLinus Torvalds 	char pad10[15];
491da177e4SLinus Torvalds 	unsigned char	source_id;
501da177e4SLinus Torvalds 	char pad11[15];
511da177e4SLinus Torvalds 	unsigned char	dest_id;
521da177e4SLinus Torvalds 	char pad12[15];
531da177e4SLinus Torvalds 	unsigned char	sync_params;
541da177e4SLinus Torvalds 	char pad13[15];
551da177e4SLinus Torvalds 	unsigned char	mesh_id;
561da177e4SLinus Torvalds 	char pad14[15];
571da177e4SLinus Torvalds 	unsigned char	sel_timeout;
581da177e4SLinus Torvalds 	char pad15[15];
591da177e4SLinus Torvalds };
601da177e4SLinus Torvalds 
611da177e4SLinus Torvalds /* Bits in the sequence register. */
621da177e4SLinus Torvalds #define SEQ_DMA_MODE	0x80	/* use DMA for data transfer */
631da177e4SLinus Torvalds #define SEQ_TARGET	0x40	/* put the controller into target mode */
641da177e4SLinus Torvalds #define SEQ_ATN		0x20	/* assert ATN signal */
651da177e4SLinus Torvalds #define SEQ_ACTIVE_NEG	0x10	/* use active negation on REQ/ACK */
661da177e4SLinus Torvalds #define SEQ_CMD		0x0f	/* command bits: */
671da177e4SLinus Torvalds #define SEQ_ARBITRATE	1	/*  get the bus */
681da177e4SLinus Torvalds #define SEQ_SELECT	2	/*  select a target */
691da177e4SLinus Torvalds #define SEQ_COMMAND	3	/*  send a command */
701da177e4SLinus Torvalds #define SEQ_STATUS	4	/*  receive status */
711da177e4SLinus Torvalds #define SEQ_DATAOUT	5	/*  send data */
721da177e4SLinus Torvalds #define SEQ_DATAIN	6	/*  receive data */
731da177e4SLinus Torvalds #define SEQ_MSGOUT	7	/*  send a message */
741da177e4SLinus Torvalds #define SEQ_MSGIN	8	/*  receive a message */
751da177e4SLinus Torvalds #define SEQ_BUSFREE	9	/*  look for bus free */
761da177e4SLinus Torvalds #define SEQ_ENBPARITY	0x0a	/*  enable parity checking */
771da177e4SLinus Torvalds #define SEQ_DISPARITY	0x0b	/*  disable parity checking */
781da177e4SLinus Torvalds #define SEQ_ENBRESEL	0x0c	/*  enable reselection */
791da177e4SLinus Torvalds #define SEQ_DISRESEL	0x0d	/*  disable reselection */
801da177e4SLinus Torvalds #define SEQ_RESETMESH	0x0e	/*  reset the controller */
811da177e4SLinus Torvalds #define SEQ_FLUSHFIFO	0x0f	/*  clear out the FIFO */
821da177e4SLinus Torvalds 
831da177e4SLinus Torvalds /* Bits in the bus_status0 and bus_status1 registers:
841da177e4SLinus Torvalds    these correspond directly to the SCSI bus control signals. */
851da177e4SLinus Torvalds #define BS0_REQ		0x20
861da177e4SLinus Torvalds #define BS0_ACK		0x10
871da177e4SLinus Torvalds #define BS0_ATN		0x08
881da177e4SLinus Torvalds #define BS0_MSG		0x04
891da177e4SLinus Torvalds #define BS0_CD		0x02
901da177e4SLinus Torvalds #define BS0_IO		0x01
911da177e4SLinus Torvalds #define BS1_RST		0x80
921da177e4SLinus Torvalds #define BS1_BSY		0x40
931da177e4SLinus Torvalds #define BS1_SEL		0x20
941da177e4SLinus Torvalds 
951da177e4SLinus Torvalds /* Bus phases defined by the bits in bus_status0 */
961da177e4SLinus Torvalds #define BS0_PHASE	(BS0_MSG+BS0_CD+BS0_IO)
971da177e4SLinus Torvalds #define BP_DATAOUT	0
981da177e4SLinus Torvalds #define BP_DATAIN	BS0_IO
991da177e4SLinus Torvalds #define BP_COMMAND	BS0_CD
1001da177e4SLinus Torvalds #define BP_STATUS	(BS0_CD+BS0_IO)
1011da177e4SLinus Torvalds #define BP_MSGOUT	(BS0_MSG+BS0_CD)
1021da177e4SLinus Torvalds #define BP_MSGIN	(BS0_MSG+BS0_CD+BS0_IO)
1031da177e4SLinus Torvalds 
1041da177e4SLinus Torvalds /* Bits in the exception register. */
1051da177e4SLinus Torvalds #define EXC_SELWATN	0x20	/* (as target) we were selected with ATN */
1061da177e4SLinus Torvalds #define EXC_SELECTED	0x10	/* (as target) we were selected w/o ATN */
1071da177e4SLinus Torvalds #define EXC_RESELECTED	0x08	/* (as initiator) we were reselected */
1081da177e4SLinus Torvalds #define EXC_ARBLOST	0x04	/* we lost arbitration */
1091da177e4SLinus Torvalds #define EXC_PHASEMM	0x02	/* SCSI phase mismatch */
1101da177e4SLinus Torvalds #define EXC_SELTO	0x01	/* selection timeout */
1111da177e4SLinus Torvalds 
1121da177e4SLinus Torvalds /* Bits in the error register */
1131da177e4SLinus Torvalds #define ERR_UNEXPDISC	0x40	/* target unexpectedly disconnected */
1141da177e4SLinus Torvalds #define ERR_SCSIRESET	0x20	/* SCSI bus got reset on us */
1151da177e4SLinus Torvalds #define ERR_SEQERR	0x10	/* we did something the chip didn't like */
1161da177e4SLinus Torvalds #define ERR_PARITY	0x01	/* parity error was detected */
1171da177e4SLinus Torvalds 
1181da177e4SLinus Torvalds /* Bits in the interrupt and intr_mask registers */
1191da177e4SLinus Torvalds #define INT_ERROR	0x04	/* error interrupt */
1201da177e4SLinus Torvalds #define INT_EXCEPTION	0x02	/* exception interrupt */
1211da177e4SLinus Torvalds #define INT_CMDDONE	0x01	/* command done interrupt */
1221da177e4SLinus Torvalds 
1231da177e4SLinus Torvalds /* Fields in the sync_params register */
1241da177e4SLinus Torvalds #define SYNC_OFF(x)	((x) >> 4)	/* offset field */
1251da177e4SLinus Torvalds #define SYNC_PER(x)	((x) & 0xf)	/* period field */
1261da177e4SLinus Torvalds #define SYNC_PARAMS(o, p)	(((o) << 4) | (p))
1271da177e4SLinus Torvalds #define ASYNC_PARAMS	2	/* sync_params value for async xfers */
1281da177e4SLinus Torvalds 
1291da177e4SLinus Torvalds /*
1301da177e4SLinus Torvalds  * Assuming a clock frequency of 50MHz:
1311da177e4SLinus Torvalds  *
1321da177e4SLinus Torvalds  * The transfer period with SYNC_PER(sync_params) == x
1331da177e4SLinus Torvalds  * is (x + 2) * 40ns, except that x == 0 gives 100ns.
1341da177e4SLinus Torvalds  *
1351da177e4SLinus Torvalds  * The units of the sel_timeout register are 10ms.
1361da177e4SLinus Torvalds  */
1371da177e4SLinus Torvalds 
1381da177e4SLinus Torvalds 
1391da177e4SLinus Torvalds #endif /* _MESH_H */
140