162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * mesh.h: definitions for the driver for the MESH SCSI bus adaptor
462306a36Sopenharmony_ci * (Macintosh Enhanced SCSI Hardware) found on Power Macintosh computers.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright (C) 1996 Paul Mackerras.
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci#ifndef _MESH_H
962306a36Sopenharmony_ci#define _MESH_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistruct mesh_cmd_priv {
1262306a36Sopenharmony_ci	int this_residual;
1362306a36Sopenharmony_ci	int message;
1462306a36Sopenharmony_ci	int status;
1562306a36Sopenharmony_ci};
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistatic inline struct mesh_cmd_priv *mesh_priv(struct scsi_cmnd *cmd)
1862306a36Sopenharmony_ci{
1962306a36Sopenharmony_ci	return scsi_cmd_priv(cmd);
2062306a36Sopenharmony_ci}
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci/*
2362306a36Sopenharmony_ci * Registers in the MESH controller.
2462306a36Sopenharmony_ci */
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cistruct mesh_regs {
2762306a36Sopenharmony_ci	unsigned char	count_lo;
2862306a36Sopenharmony_ci	char pad0[15];
2962306a36Sopenharmony_ci	unsigned char	count_hi;
3062306a36Sopenharmony_ci	char pad1[15];
3162306a36Sopenharmony_ci	unsigned char	fifo;
3262306a36Sopenharmony_ci	char pad2[15];
3362306a36Sopenharmony_ci	unsigned char	sequence;
3462306a36Sopenharmony_ci	char pad3[15];
3562306a36Sopenharmony_ci	unsigned char	bus_status0;
3662306a36Sopenharmony_ci	char pad4[15];
3762306a36Sopenharmony_ci	unsigned char	bus_status1;
3862306a36Sopenharmony_ci	char pad5[15];
3962306a36Sopenharmony_ci	unsigned char	fifo_count;
4062306a36Sopenharmony_ci	char pad6[15];
4162306a36Sopenharmony_ci	unsigned char	exception;
4262306a36Sopenharmony_ci	char pad7[15];
4362306a36Sopenharmony_ci	unsigned char	error;
4462306a36Sopenharmony_ci	char pad8[15];
4562306a36Sopenharmony_ci	unsigned char	intr_mask;
4662306a36Sopenharmony_ci	char pad9[15];
4762306a36Sopenharmony_ci	unsigned char	interrupt;
4862306a36Sopenharmony_ci	char pad10[15];
4962306a36Sopenharmony_ci	unsigned char	source_id;
5062306a36Sopenharmony_ci	char pad11[15];
5162306a36Sopenharmony_ci	unsigned char	dest_id;
5262306a36Sopenharmony_ci	char pad12[15];
5362306a36Sopenharmony_ci	unsigned char	sync_params;
5462306a36Sopenharmony_ci	char pad13[15];
5562306a36Sopenharmony_ci	unsigned char	mesh_id;
5662306a36Sopenharmony_ci	char pad14[15];
5762306a36Sopenharmony_ci	unsigned char	sel_timeout;
5862306a36Sopenharmony_ci	char pad15[15];
5962306a36Sopenharmony_ci};
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci/* Bits in the sequence register. */
6262306a36Sopenharmony_ci#define SEQ_DMA_MODE	0x80	/* use DMA for data transfer */
6362306a36Sopenharmony_ci#define SEQ_TARGET	0x40	/* put the controller into target mode */
6462306a36Sopenharmony_ci#define SEQ_ATN		0x20	/* assert ATN signal */
6562306a36Sopenharmony_ci#define SEQ_ACTIVE_NEG	0x10	/* use active negation on REQ/ACK */
6662306a36Sopenharmony_ci#define SEQ_CMD		0x0f	/* command bits: */
6762306a36Sopenharmony_ci#define SEQ_ARBITRATE	1	/*  get the bus */
6862306a36Sopenharmony_ci#define SEQ_SELECT	2	/*  select a target */
6962306a36Sopenharmony_ci#define SEQ_COMMAND	3	/*  send a command */
7062306a36Sopenharmony_ci#define SEQ_STATUS	4	/*  receive status */
7162306a36Sopenharmony_ci#define SEQ_DATAOUT	5	/*  send data */
7262306a36Sopenharmony_ci#define SEQ_DATAIN	6	/*  receive data */
7362306a36Sopenharmony_ci#define SEQ_MSGOUT	7	/*  send a message */
7462306a36Sopenharmony_ci#define SEQ_MSGIN	8	/*  receive a message */
7562306a36Sopenharmony_ci#define SEQ_BUSFREE	9	/*  look for bus free */
7662306a36Sopenharmony_ci#define SEQ_ENBPARITY	0x0a	/*  enable parity checking */
7762306a36Sopenharmony_ci#define SEQ_DISPARITY	0x0b	/*  disable parity checking */
7862306a36Sopenharmony_ci#define SEQ_ENBRESEL	0x0c	/*  enable reselection */
7962306a36Sopenharmony_ci#define SEQ_DISRESEL	0x0d	/*  disable reselection */
8062306a36Sopenharmony_ci#define SEQ_RESETMESH	0x0e	/*  reset the controller */
8162306a36Sopenharmony_ci#define SEQ_FLUSHFIFO	0x0f	/*  clear out the FIFO */
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci/* Bits in the bus_status0 and bus_status1 registers:
8462306a36Sopenharmony_ci   these correspond directly to the SCSI bus control signals. */
8562306a36Sopenharmony_ci#define BS0_REQ		0x20
8662306a36Sopenharmony_ci#define BS0_ACK		0x10
8762306a36Sopenharmony_ci#define BS0_ATN		0x08
8862306a36Sopenharmony_ci#define BS0_MSG		0x04
8962306a36Sopenharmony_ci#define BS0_CD		0x02
9062306a36Sopenharmony_ci#define BS0_IO		0x01
9162306a36Sopenharmony_ci#define BS1_RST		0x80
9262306a36Sopenharmony_ci#define BS1_BSY		0x40
9362306a36Sopenharmony_ci#define BS1_SEL		0x20
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci/* Bus phases defined by the bits in bus_status0 */
9662306a36Sopenharmony_ci#define BS0_PHASE	(BS0_MSG+BS0_CD+BS0_IO)
9762306a36Sopenharmony_ci#define BP_DATAOUT	0
9862306a36Sopenharmony_ci#define BP_DATAIN	BS0_IO
9962306a36Sopenharmony_ci#define BP_COMMAND	BS0_CD
10062306a36Sopenharmony_ci#define BP_STATUS	(BS0_CD+BS0_IO)
10162306a36Sopenharmony_ci#define BP_MSGOUT	(BS0_MSG+BS0_CD)
10262306a36Sopenharmony_ci#define BP_MSGIN	(BS0_MSG+BS0_CD+BS0_IO)
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci/* Bits in the exception register. */
10562306a36Sopenharmony_ci#define EXC_SELWATN	0x20	/* (as target) we were selected with ATN */
10662306a36Sopenharmony_ci#define EXC_SELECTED	0x10	/* (as target) we were selected w/o ATN */
10762306a36Sopenharmony_ci#define EXC_RESELECTED	0x08	/* (as initiator) we were reselected */
10862306a36Sopenharmony_ci#define EXC_ARBLOST	0x04	/* we lost arbitration */
10962306a36Sopenharmony_ci#define EXC_PHASEMM	0x02	/* SCSI phase mismatch */
11062306a36Sopenharmony_ci#define EXC_SELTO	0x01	/* selection timeout */
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci/* Bits in the error register */
11362306a36Sopenharmony_ci#define ERR_UNEXPDISC	0x40	/* target unexpectedly disconnected */
11462306a36Sopenharmony_ci#define ERR_SCSIRESET	0x20	/* SCSI bus got reset on us */
11562306a36Sopenharmony_ci#define ERR_SEQERR	0x10	/* we did something the chip didn't like */
11662306a36Sopenharmony_ci#define ERR_PARITY	0x01	/* parity error was detected */
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci/* Bits in the interrupt and intr_mask registers */
11962306a36Sopenharmony_ci#define INT_ERROR	0x04	/* error interrupt */
12062306a36Sopenharmony_ci#define INT_EXCEPTION	0x02	/* exception interrupt */
12162306a36Sopenharmony_ci#define INT_CMDDONE	0x01	/* command done interrupt */
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci/* Fields in the sync_params register */
12462306a36Sopenharmony_ci#define SYNC_OFF(x)	((x) >> 4)	/* offset field */
12562306a36Sopenharmony_ci#define SYNC_PER(x)	((x) & 0xf)	/* period field */
12662306a36Sopenharmony_ci#define SYNC_PARAMS(o, p)	(((o) << 4) | (p))
12762306a36Sopenharmony_ci#define ASYNC_PARAMS	2	/* sync_params value for async xfers */
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci/*
13062306a36Sopenharmony_ci * Assuming a clock frequency of 50MHz:
13162306a36Sopenharmony_ci *
13262306a36Sopenharmony_ci * The transfer period with SYNC_PER(sync_params) == x
13362306a36Sopenharmony_ci * is (x + 2) * 40ns, except that x == 0 gives 100ns.
13462306a36Sopenharmony_ci *
13562306a36Sopenharmony_ci * The units of the sel_timeout register are 10ms.
13662306a36Sopenharmony_ci */
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci#endif /* _MESH_H */
140