File:  [Apple Darwin 0.x] / drvEIDE / EIDE.drvproj / EIDE.lksproj / PIIX.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:40:59 2018 UTC (8 years, 1 month ago) by root
Branches: MAIN, Apple
CVS tags: HEAD, Darwin03
Darwin 0.3 EIDE device driver

/*
 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
 *
 * @APPLE_LICENSE_HEADER_START@
 * 
 * "Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
 * Reserved.  This file contains Original Code and/or Modifications of
 * Original Code as defined in and that are subject to the Apple Public
 * Source License Version 1.0 (the 'License').  You may not use this file
 * except in compliance with the License.  Please obtain a copy of the
 * License at http://www.apple.com/publicsource and read it before using
 * this file.
 * 
 * The Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
 * License for the specific language governing rights and limitations
 * under the License."
 * 
 * @APPLE_LICENSE_HEADER_END@
 */
/*
 * Copyright 1998 by Apple Computer, Inc., All rights reserved.
 *
 * Intel PIIX/PIIX3/PIIX4 PCI IDE controller.
 * PIIX = PCI-ISA-IDE-Xelerator. (USB also on newer controllers)
 *
 * Notes:
 * 
 * PIIX  introduced in the "Triton" chipset.
 * PIIX3 supports different timings for Master/Slave devices on both channels.
 * PIIX4 adds support for Ultra DMA/33.
 *
 * Be sure to download and read the PIIX errata from Intel's web site at
 * developer.intel.com. Even then, don't trust everything you read.
 *
 * HISTORY:
 * 1-Feb-1998	Joe Liu at Apple
 *	Created.
 */

/*
 * PCI ID's.
 */
#define PCI_ID_PIIX		0x12308086
#define PCI_ID_PIIX3	0x70108086
#define PCI_ID_PIIX4	0x71118086
#define PCI_ID_NONE		0xffffffff

/*
 * Decoded port addresses. Seems to be hardcoded and it does not
 * show up in the PCI configuration space memory ranges.
 */
#define PIIX_P_CMD_ADDR		0x1f0
#define PIIX_P_CTL_ADDR		0x3f4
#define PIIX_S_CMD_ADDR		0x170
#define PIIX_S_CTL_ADDR		0x374
#define PIIX_CMD_SIZE		8
#define PIIX_CTL_SIZE		4

/*
 * IRQ assignment.
 */
#define PIIX_P_IRQ			14
#define PIIX_S_IRQ			15

/*
 * PIIX PCI configuration space registers.
 * Register size (bits) in parenthesis.
 */
#define PIIX_PCICMD		0x04	// (16) PCI command register
#define PIIX_PCISTS		0x06	// (16) PCI device status register
#define PIIX_RID		0x08	// (8)  Revision identification register
#define PIIX_CLASSC		0x09	// (24) Class code register
#define PIIX_MLT		0x0d	// (8)  Master latency timer register
#define PIIX_HEDT		0x0e	// (8)  Header type register
#define PIIX_BMIBA		0x20	// (32) Bus-Master interface base address
#define PIIX_IDETIM		0x40	// (16) IDE timing registers (primary)
#define PIIX_IDETIM_S	0x42	// (16) IDE timing registers (secondary)
#define PIIX_SIDETIM	0x44	// (8)  Slave IDE timing register
#define PIIX_UDMACTL	0x48	// (8)  Ultra DMA/33 control register
#define PIIX_UDMATIM	0x4a	// (16) Ultra DMA/33 timing register

/*
 * PIIX PCI configuration space register definition.
 *
 * PIIX_IDETIM - IDE timing register.
 *
 * Address:
 * 0x40:0x41 - Primary channel
 * 0x42:0x43 - Secondary channel
 */
typedef union {
	struct {
		u_short
			time0	:1,		// fast timing bank drive select 0
			ie0		:1,		// IORDY sample point enable driver select 0
			ppe0	:1,		// prefetch and posting enable
			dte0	:1,		// DMA timing enable only
			time1	:1,		// fast timing bank driver select 1
			ie1		:1,		// IORDY sample point enable driver select 1
			ppe1	:1,		// prefetch and posting enable
			dte1	:1,		// DMA timing enable only
			rct		:2,		// recovery time
			rsvd	:2,		// RESERVED
			isp		:2,		// IORDY sample point
			sitre	:1,		// slave IDE timing register enable
			ide		:1;		// IDE decode enable
	} bits;
	u_short word;
} piix_idetim_u;

/*
 * Convert the "isp" and "rct" fields in PIIX_IDETIM register from
 * PCI clocks to their respective values, and vice-versa.
 */
#define PIIX_CLK_TO_ISP(x)		(5 - (x))
#define PIIX_ISP_TO_CLK(x)		PIIX_CLK_TO_ISP(x)
#define PIIX_CLK_TO_RCT(x)		(4 - (x))
#define PIIX_RCT_TO_CLK(x)		PIIX_CLK_TO_RCT(x)

/*
 * PIIX PCI configuration space register definition.
 *
 * PIIX_SIDETIM - Slave IDE timing register.
 *
 * Address: 0x44
 */
typedef union {
	struct {
		u_char
			prct1	:2,		// primary drive 1 recovery time
			pisp1	:2,		// primary drive 1 IORDY sample point
			srct1	:2,		// secondary drive 1 recovery time
			sisp1	:2;		// secondary drive 1 IORDY sample point
	} bits;
	u_char byte;
} piix_sidetim_u;

/*
 * PIIX PCI configuration space register definition.
 *
 * PIIX_UDMACTL - Ultra DMA/33 control register
 *
 * Address: 0x48
 */
typedef union {
	struct {
		u_char
			psde0	:1,		// enable Ultra DMA/33 for primary drive 0
			psde1	:1,		// enable Ultra DMA/33 for primary drive 1
			ssde0	:1,		// enable Ultra DMA/33 for secondary drive 0
			ssde1	:1,		// enable Ultra DMA/33 for secondary drive 1
			rsvd	:4;		// RESERVED
	} bits;
	u_char byte;
} piix_udmactl_u;

/*
 * PIIX PCI configuration space register definition.
 *
 * PIIX_UDMATIM - Ultra DMA/33 timing register
 *
 * Address: 0x4a-0x4b
 */
typedef union {
	struct {
		u_short
			pct0	:2,		// primary drive 0 cycle time
			rsvd1	:2,		// RESERVED
			pct1	:2,		// primary drive 1 cycle time
			rsvd2	:2,		// RESERVED
			sct0	:2,		// secondary drive 0 cycle time
			rsvd3	:2,		// RESERVED
			sct1	:2,		// secondary drive 1 cycle time
			rsvd4	:2;		// RESERVED
	} bits;
	u_short word;
} piix_udmatim_u;

/*
 * PIIX IO space register offsets. Base address is set in PIIX_BMIBA.
 * Register size (bits) in parenthesis.
 *
 * Note:
 * For the primary channel, the base address is stored in PIIX_BMIBA.
 * For the secondary channel, the base address is equal to
 * (PIIX_BMIBA + PIIX_BM_OFFSET).
 */
#define PIIX_BMICX		0x00	// (8) Bus master IDE command register
#define PIIX_BMISX		0x02	// (8) Bus master IDE status register
#define PIIX_BMIDTPX	0x04	// (32) Descriptor table pointer register
#define PIIX_BM_OFFSET	0x08	// offset to secondary channel registers
#define PIIX_BM_SIZE	0x08	// size of the BM registers for each channel
#define PIIX_BM_MASK	0xfff0	// mask BMIBA to get register base address

/*
 * PIIX IO space register definition.
 *
 * BMICX - Bus master IDE command register
 */
typedef union {
	struct {
		u_char
			ssbm	:1,		// start/stop bus master
			rsvd1	:2,		// RESERVED
			rwcon	:1,		// Bus master read/write control
			rsvd2	:4;		// RESERVED
	} bits;
	u_char byte;
} piix_bmicx_u;

/*
 * PIIX IO space register definition.
 *
 * PIIX_BMISX - Bus master IDE status register
 */
typedef union {
	struct {
		u_char
			bmidea	:1,		// Bus master IDE active
			err		:1,		// IDE DMA error
			ideints	:1,		// IDE interrupt status
			rsvd1	:2,		// RESERVED
			dma0cap	:1,		// drive 0 DMA capable
			dma1cap	:1,		// drive 1 DMA capable
			rsvd2	:1;		// RESERVED (hardwired to 0)
	} bits;
	u_char byte;
} piix_bmisx_u;

#define PIIX_STATUS_MASK	0x07
#define PIIX_STATUS_OK		0x04
#define PIIX_STATUS_ERROR	0x02
#define PIIX_STATUS_ACTIVE	0x01

/*
 * PIIX Bus Master alignment/boundary requirements.
 *
 * Intel nomemclature:
 * WORD  - 16-bit
 * DWord - 32-bit
 *
 * NOTE:
 * Boundary limit implies that the entire region is physically
 * contiguous.
 *
 * There is an error in the manual regarding DT alignment and boundary
 * restrictions. The "Intel 82371AB (PIIX4) Specification Update" has a
 * clarification to this issue.
 */
#define PIIX_DT_ALIGN	4			// descriptor table must be DWord aligned.
#define PIIX_DT_BOUND	(4 * 1024)	// cannot cross 4K boundary. (or 64K ?)

#define PIIX_BUF_ALIGN	4			// memory buffer must be DWord aligned.
#define PIIX_BUF_BOUND	(64 * 1024)	// cannot cross 64K boundary.
#define PIIX_BUF_LIMIT	(64 * 1024) // limited to 64K in size

/*
 * PIIX Bus Master Physical Region Descriptor (PRD) format.
 *
 */
typedef struct {
	u_int	base;				// base address
	u_int	count	:16,		// byte count
			rsvd	:15,
			eot		:1;			// final PRD indication bit
} piix_prd_t;

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.