1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 * 21 * 22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25/* 26 * ATAPI-7 Definitions (subset) that include Serial ATA 27 * ATA/ATAPI-7 V3 (d1532v3r4b-ATA-ATAPI-7) 28 */ 29#ifndef _ATAPI7V3_H 30#define _ATAPI7V3_H 31#ifdef __cplusplus 32extern "C" { 33#endif 34 35/* 36 * Register - Host to Device FIS 37 */ 38typedef struct { 39 uint8_t fis_type; 40 uint8_t idcbits; 41 uint8_t cmd; 42 uint8_t features; 43#define FEATURE_LBA 0x40 44 uint8_t lba_low; 45 uint8_t lba_mid; 46 uint8_t lba_hi; 47 uint8_t device; 48 uint8_t lba_low_exp; 49 uint8_t lba_mid_exp; 50 uint8_t lba_hi_exp; 51 uint8_t features_exp; 52 uint8_t sector_count; 53 uint8_t sector_count_exp; 54 uint8_t reserved0; 55 uint8_t control; 56 uint8_t reserved1[4]; 57} register_h2d_fis_t; 58 59/* 60 * Register - Device to Host FIS 61 */ 62typedef struct { 63 uint8_t fis_type; 64 uint8_t idcbits; 65 uint8_t status; 66 uint8_t error; 67 uint8_t lba_low; 68 uint8_t lba_mid; 69 uint8_t lba_hi; 70 uint8_t device; 71 uint8_t lba_low_exp; 72 uint8_t lba_mid_exp; 73 uint8_t lba_hi_exp; 74 uint8_t reserved0; 75 uint8_t sector_count; 76 uint8_t sector_count_exp; 77 uint8_t reserved1[6]; 78} register_d2h_fis_t; 79 80typedef struct { 81 uint8_t fis_type; 82 uint8_t idcbits; 83 uint8_t status_bits; 84#define STATUS_HI_MASK 0xE 85#define STATUS_HI_SHIFT 4 86#define STATUS_LO_MASK 0x7 87 uint8_t error; 88 uint8_t reserved; 89} set_device_bits_fis_t; 90 91typedef struct { 92 uint8_t fis_type; 93 uint8_t reserved[3]; 94} dma_activate_fis_type; 95 96typedef struct { 97 uint8_t fis_type; 98 uint8_t idcbits; 99 uint8_t reserved0[2]; 100 uint32_t dma_buffer_id_lo; 101 uint32_t dma_buffer_id_hi; 102 uint32_t reserved1; 103 uint32_t dma_buffer_offset; 104 uint32_t dma_buffer_count; 105 uint32_t reserved2; 106} dma_fpactivate_fis_t; 107 108typedef struct { 109 uint8_t fis_type; 110 uint8_t reserved0; 111 uint8_t bist_bits; 112 uint8_t reserved1; 113 uint8_t data[8]; 114} bist_activate_fis_t; 115#define BIST_T 0x80 116#define BIST_A 0x40 117#define BIST_S 0x20 118#define BIST_L 0x10 119#define BIST_F 0x08 120#define BIST_P 0x04 121#define BIST_V 0x01 122 123typedef struct { 124 uint8_t fis_type; 125 uint8_t idcbits; 126 uint8_t status; 127 uint8_t error; 128 uint8_t lba_low; 129 uint8_t lba_mid; 130 uint8_t lba_high; 131 uint8_t device; 132 uint8_t lba_low_exp; 133 uint8_t lba_mid_exp; 134 uint8_t lba_high_exp; 135 uint8_t reserved0; 136 uint8_t sector_count; 137 uint8_t sector_count_exp; 138 uint8_t reserved1; 139 uint8_t E_status; 140 uint16_t transfer_count; 141 uint16_t reserved2; 142} pio_setup_fis_t; 143 144typedef struct { 145 uint8_t fis_type; 146 uint32_t dwords[1]; 147} bidirectional_fis_t; 148 149/* 150 * FIS Types 151 */ 152 153#define FIS_REG_H2DEV 0x27 /* 5 DWORDS */ 154#define FIS_REG_D2H 0x34 /* 5 DWORDS */ 155#define FIS_SET_DEVICE_BITS 0xA1 /* 2 DWORDS */ 156#define FIS_DMA_ACTIVATE 0x39 /* 1 DWORD */ 157#define FIS_DMA_FPSETUP 0x41 /* 7 DWORDS */ 158#define FIS_BIST_ACTIVATE 0x58 /* 3 DWORDS */ 159#define FIS_PIO_SETUP 0x5F /* 5 DWORDS */ 160#define FIS_BI 0x46 /* 1 DWORD min, 2048 DWORD max */ 161 162/* 163 * IDC bits 164 */ 165#define C_BIT 0x80 166#define I_BIT 0x40 167#define D_BIT 0x20 168 169/* 170 * 28-Bit Command Mapping from ACS to FIS 171 * 172 * ACS Field FIS Field 173 * -------------------------------------- 174 * Feature (7:0) -> Feature 175 * Count (7:0) -> Sector Count 176 * LBA (7:0) -> LBA Low 177 * LBA (15:8) -> LBA Mid 178 * LBA (23:16) -> LBA High 179 * LBA (27:24) -> Device (3:0) 180 * Device (15:12) -> Device (7:4) 181 * Command -> Command 182 * 183 * 48- Bit Command Mapping from ACS to FIS 184 * 185 * ACS Field FIS Field 186 * -------------------------------------- 187 * Feature (7:0) -> Feature 188 * Feature (15:8) -> Feature (exp) 189 * Count (7:0) -> Sector Count 190 * Count (15:8) -> Sector Count (exp) 191 * LBA (7:0) -> LBA Low 192 * LBA (15:8) -> LBA Mid 193 * LBA (23:16) -> LBA High 194 * LBA (31:24) -> LBA Low (exp) 195 * LBA (39:32) -> LBA Mid (exp) 196 * LBA (47:40) -> LBA High (exp) 197 * Device (15:12) -> Device (7:4) 198 * Command -> Command 199 * 200 * FIS (FIS_REG_H2DEV) layout: 201 * 202 * 31.........24 23...........16 15....................8.7.............0 203 * FEATURE | COMMAND | C R R RESERVED | FIS TYPE 0x27 204 * DEVICE | LBA HIGH | LBA MID | LBA LOW 205 * FEATURE(exp) | LBA HIGH(exp) | LBA MID(exp) | LBA LOW(exp) 206 * CONTROL | RESERVED | Sector Count(exp) | Sector Count 207 * RESERVED | RESERVED | RESERVED | RESERVED 208 * 209 * FIS (FIS_REG_D2H) layout: 210 * 211 * 31.........24 23...........16 15....................8.7.............0 212 * ERROR | STATUS | R I R RESERVED | FIS TYPE 0x34 213 * DEVICE | LBA HIGH | LBA MID | LBA LOW 214 * RESERVED | LBA HIGH(exp) | LBA MID(exp) | LBA LOW(exp) 215 * RESERVED | RESERVED | Sector Count(exp) | Sector Count 216 * RESERVED | RESERVED | RESERVED | RESERVED 217 */ 218 219 220/* 221 * Reasonable size to reserve for holding the most common FIS types. 222 */ 223typedef uint32_t fis_t[5]; 224 225#ifdef __cplusplus 226} 227#endif 228#endif /* _ATAPI7V3_H */ 229