summaryrefslogtreecommitdiffstats
path: root/cfe/cfe/include/dev_ide_common.h
diff options
context:
space:
mode:
Diffstat (limited to 'cfe/cfe/include/dev_ide_common.h')
-rw-r--r--cfe/cfe/include/dev_ide_common.h204
1 files changed, 204 insertions, 0 deletions
diff --git a/cfe/cfe/include/dev_ide_common.h b/cfe/cfe/include/dev_ide_common.h
new file mode 100644
index 0000000..736fd99
--- /dev/null
+++ b/cfe/cfe/include/dev_ide_common.h
@@ -0,0 +1,204 @@
+/* *********************************************************************
+ * Broadcom Common Firmware Environment (CFE)
+ *
+ * Generic IDE disk driver File: dev_ide_common.c
+ *
+ * This file contains common constants and structures for IDE
+ * disks and CFE drivers for them.
+ *
+ * Author: Mitch Lichtenberg (mpl@broadcom.com)
+ *
+ *********************************************************************
+ *
+ * Copyright 2000,2001,2002,2003
+ * Broadcom Corporation. All rights reserved.
+ *
+ * This software is furnished under license and may be used and
+ * copied only in accordance with the following terms and
+ * conditions. Subject to these conditions, you may download,
+ * copy, install, use, modify and distribute modified or unmodified
+ * copies of this software in source and/or binary form. No title
+ * or ownership is transferred hereby.
+ *
+ * 1) Any source code used, modified or distributed must reproduce
+ * and retain this copyright notice and list of conditions
+ * as they appear in the source file.
+ *
+ * 2) No right is granted to use any trade name, trademark, or
+ * logo of Broadcom Corporation. The "Broadcom Corporation"
+ * name may not be used to endorse or promote products derived
+ * from this software without the prior written permission of
+ * Broadcom Corporation.
+ *
+ * 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ * PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT
+ * SHALL BROADCOM BE LIABLE FOR ANY DAMAGES WHATSOEVER, AND IN
+ * PARTICULAR, BROADCOM SHALL NOT BE LIABLE FOR DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE), EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ ********************************************************************* */
+
+
+/* *********************************************************************
+ * Constants
+ ********************************************************************* */
+
+#define IDE_REG_DATA 0x0
+#define IDE_REG_ERROR 0x1
+#define IDE_REG_PRECOMP 0x1
+#define IDE_REG_SECCNT 0x2
+#define IDE_REG_IR 0x2 /* ATAPI */
+#define IDE_REG_SECNUM 0x3
+#define IDE_REG_BCLSB 0x4 /* ATAPI */
+#define IDE_REG_BCMSB 0x5 /* ATAPI */
+#define IDE_REG_CYLLSB 0x4
+#define IDE_REG_CYLMSB 0x5
+#define IDE_REG_DRVHD 0x6
+#define IDE_REG_STATUS 0x7
+#define IDE_REG_COMMAND 0x7
+#define IDE_REG_ALTSTAT 0x6 /* Note: ALTSTAT is really 0x3F6, what do we do? */
+#define IDE_REG_DIGOUT 0x6
+
+#define IDE_IR_CD 0x01 /* 1 = command, 0 = data */
+#define IDE_IR_IO 0x02 /* 1 = from device, 0 = to device */
+#define IDE_IR_REL 0x04
+
+#define IDE_ERR_BBK 0x80 /* sector marked bad by host */
+#define IDE_ERR_UNC 0x40 /* uncorrectable error */
+#define IDE_ERR_MC 0x20 /* medium changed */
+#define IDE_ERR_NID 0x10 /* no ID mark found */
+#define IDE_ERR_MCR 0x08 /* medium change required */
+#define IDE_ERR_ABT 0x04 /* command aborted */
+#define IDE_ERR_NT0 0x02 /* track 0 not found */
+#define IDE_ERR_NDM 0x01 /* address mark not found */
+
+#define IDE_DRV_SLAVE 0x10
+#define IDE_DRV_LBA 0x40
+#define IDE_DRV_MBO 0xA0
+#define IDE_DRV_HDMASK 0x0F
+
+#define IDE_STS_BSY 0x80 /* drive is busy */
+#define IDE_STS_RDY 0x40 /* drive is ready */
+#define IDE_STS_WFT 0x20 /* write fault */
+#define IDE_STS_SKC 0x10 /* seek complete */
+#define IDE_STS_DRQ 0x08 /* data can be transferred */
+#define IDE_STS_CORR 0x04 /* correctable data error */
+#define IDE_STS_IDX 0x02 /* index mark just passed */
+#define IDE_STS_ERR 0x01 /* Error register contains info */
+
+#define IDE_CMD_RECAL 0x10
+#define IDE_CMD_READ 0x20
+#define IDE_CMD_READRETRY 0x21
+#define IDE_CMD_WRITE 0x30
+#define IDE_CMD_READVERIFY 0x40
+#define IDE_CMD_DIAGNOSTIC 0x90
+#define IDE_CMD_INITPARAMS 0x91
+#define IDE_CMD_SETMULTIPLE 0xC6
+#define IDE_CMD_POWER_MODE 0xE5
+#define IDE_CMD_DRIVE_INFO 0xEC
+
+#define IDE_CMD_ATAPI_SOFTRESET 0x08
+#define IDE_CMD_ATAPI_PACKET 0xA0
+#define IDE_CMD_ATAPI_IDENTIFY 0xA1
+#define IDE_CMD_ATAPI_SERVICE 0xA2
+
+#define IDE_DOR_SRST 0x04
+#define IDE_DOR_IEN 0x02
+
+#define DISK_SECTORSIZE 512
+#define CDROM_SECTORSIZE 2048
+#define MAX_SECTORSIZE 2048
+
+#define ATAPI_SENSE_MASK 0xF0
+#define ATAPI_SENSE_NONE 0x00
+#define ATAPI_SENSE_RECOVERED 0x10
+#define ATAPI_SENSE_NOTREADY 0x20
+#define ATAPI_SENSE_MEDIUMERROR 0x30
+#define ATAPI_SENSE_HWERROR 0x40
+#define ATAPI_SENSE_ILLREQUEST 0x50
+#define ATAPI_SENSE_ATTENTION 0x60
+#define ATAPI_SENSE_PROTECT 0x70
+#define ATAPI_SENSE_BLANKCHECK 0x80
+#define ATAPI_SENSE_VSPECIFIC 0x90
+#define ATAPI_SENSE_COPYABORT 0xA0
+#define ATAPI_SENSE_CMDABORT 0xB0
+#define ATAPI_SENSE_EQUAL 0xC0
+#define ATAPI_SENSE_VOLOVERFLOW 0xD0
+#define ATAPI_SENSE_MISCOMPARE 0xE0
+#define ATAPI_SENSE_RESERVED 0xF0
+
+#define ATAPI_SIG_LSB 0x14
+#define ATAPI_SIG_MSB 0xEB
+
+#define CDB_CMD_READ 0x28
+#define CDB_CMD_WRITE 0x2A
+#define CDB_CMD_REQSENSE 0x03
+
+
+/* *********************************************************************
+ * Structures
+ ********************************************************************* */
+
+typedef struct idecommon_dispatch_s idecommon_dispatch_t;
+
+struct idecommon_dispatch_s {
+ void *ref;
+ uint32_t baseaddr;
+ uint8_t (*inb)(idecommon_dispatch_t *disp,uint32_t reg);
+ uint16_t (*inw)(idecommon_dispatch_t *disp,uint32_t reg);
+ void (*ins)(idecommon_dispatch_t *disp,uint32_t reg,uint8_t *buf,int len);
+
+ void (*outb)(idecommon_dispatch_t *disp,uint32_t reg,uint8_t val);
+ void (*outw)(idecommon_dispatch_t *disp,uint32_t reg,uint16_t val);
+ void (*outs)(idecommon_dispatch_t *disp,uint32_t reg,uint8_t *buf,int len);
+};
+
+#define IDEDISP_WRITEREG8(ide,reg,val) (*((ide)->outb))(ide,reg,val)
+#define IDEDISP_WRITEREG16(ide,reg,val) (*((ide)->outw))(ide,reg,val)
+#define IDEDISP_WRITEBUF(ide,reg,buf,len) (*((ide)->outs))(ide,reg,buf,len)
+#define IDEDISP_READREG8(ide,reg) (*((ide)->inb))(ide,reg)
+#define IDEDISP_READREG16(ide,reg) (*((ide)->inw))(ide,reg)
+#define IDEDISP_READBUF(ide,reg,buf,len) (*((ide)->ins))(ide,reg,buf,len)
+
+typedef struct idecommon_s idecommon_t;
+
+struct idecommon_s {
+ idecommon_dispatch_t *idecommon_dispatch;
+ unsigned long idecommon_addr; /* physical address */
+ int idecommon_unit; /* 0 or 1 master/slave */
+ int idecommon_sectorsize; /* size of each sector */
+ long long idecommon_ttlsect; /* total sectors */
+ int idecommon_atapi; /* 1 if ATAPI device */
+ int idecommon_devtype; /* device type */
+ uint64_t idecommon_deferprobe; /* Defer probe to open */
+ uint32_t idecommon_flags; /* flags for underlying driver */
+ int (*idecommon_readfunc)(idecommon_t *ide,uint64_t lba,int numsec,uint8_t *buffer);
+ int (*idecommon_writefunc)(idecommon_t *ide,uint64_t lba,int numsec,uint8_t *buffer);
+
+ uint32_t timer;
+};
+
+
+
+/* *********************************************************************
+ * Prototypes
+ ********************************************************************* */
+
+extern void idecommon_init(idecommon_t *ide,int devtype);
+extern int idecommon_open(cfe_devctx_t *ctx);
+extern int idecommon_read(cfe_devctx_t *ctx,iocb_buffer_t *buffer);
+extern int idecommon_inpstat(cfe_devctx_t *ctx,iocb_inpstat_t *inpstat);
+extern int idecommon_write(cfe_devctx_t *ctx,iocb_buffer_t *buffer);
+extern int idecommon_ioctl(cfe_devctx_t *ctx,iocb_buffer_t *buffer);
+extern int idecommon_identify(idecommon_t *ide,unsigned char *buffer);
+extern int idecommon_close(cfe_devctx_t *ctx);
+extern int idecommon_devprobe(idecommon_t *ide,int noisy);
+void idecommon_attach(cfe_devdisp_t *disp);
+