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 32 extern "C" { 33 #endif 34 35 /* 36 * Register - Host to Device FIS 37 */ 38 typedef 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 */ 62 typedef 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 80 typedef 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 91 typedef struct { 92 uint8_t fis_type; 93 uint8_t reserved[3]; 94 } dma_activate_fis_type; 95 96 typedef 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 108 typedef 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 123 typedef 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 144 typedef 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 */ 223 typedef uint32_t fis_t[5]; 224 225 #ifdef __cplusplus 226 } 227 #endif 228 #endif /* _ATAPI7V3_H */ 229