File indexing completed on 2025-05-11 08:23:43
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #ifndef __ATA_INTERNAL_H__
0016 #define __ATA_INTERNAL_H__
0017
0018 #include <sys/param.h>
0019 #include <sys/endian.h>
0020 #include <rtems.h>
0021 #include <sys/types.h>
0022 #include <rtems/libio.h>
0023 #include <stdlib.h>
0024
0025 #include <rtems/blkdev.h>
0026 #include <rtems/diskdevs.h>
0027
0028 #ifdef __cplusplus
0029 extern "C" {
0030 #endif
0031
0032
0033
0034
0035
0036
0037
0038 #define CF_LE_W(v) le16toh(v)
0039 #define CF_LE_L(v) le32toh(v)
0040 #define CT_LE_W(v) htole16(v)
0041 #define CT_LE_L(v) htole32(v)
0042
0043 #define ATA_UNDEFINED_VALUE (-1)
0044
0045
0046 #define ATA_SECTOR_SIZE 512
0047
0048
0049 #define ATA_MAX_CMD_REG_OFFSET 8
0050
0051
0052
0053
0054
0055 #define ATA_COMMAND_TYPE_NON_DATA 0
0056 #define ATA_COMMAND_TYPE_PIO_IN 1
0057 #define ATA_COMMAND_TYPE_PIO_OUT 2
0058 #define ATA_COMMAND_TYPE_DMA 3
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068 #define ATA_COMMAND_NOP 0x00
0069 #define ATA_COMMAND_READ_SECTORS 0x20
0070 #define ATA_COMMAND_WRITE_SECTORS 0x30
0071 #define ATA_COMMAND_READ_VERIFY_SECTORS 0x40
0072 #define ATA_COMMAND_SEEK 0x70
0073 #define ATA_COMMAND_EXECUTE_DEVICE_DIAGNOSTIC 0x90
0074 #define ATA_COMMAND_INITIALIZE_DEVICE_PARAMETERS 0x91
0075 #define ATA_COMMAND_DOWNLOAD_MICROCODE 0x92
0076 #define ATA_COMMAND_READ_MULTIPLE 0xc4
0077 #define ATA_COMMAND_WRITE_MULTIPLE 0xc5
0078 #define ATA_COMMAND_SET_MULTIPLE_MODE 0xc6
0079 #define ATA_COMMAND_READ_DMA 0xc8
0080 #define ATA_COMMAND_WRITE_DMA 0xca
0081 #define ATA_COMMAND_STANDBY_IMMEDIATE 0xe0
0082 #define ATA_COMMAND_IDLE_IMMEDIATE 0xe1
0083 #define ATA_COMMAND_STANDBY 0xe2
0084 #define ATA_COMMAND_IDLE 0xe3
0085 #define ATA_COMMAND_READ_BUFFER 0xe4
0086 #define ATA_COMMAND_CHECK_POWER_MODE 0xe5
0087 #define ATA_COMMAND_SLEEP 0xe6
0088 #define ATA_COMMAND_WRITE_BUFFER 0xe8
0089 #define ATA_COMMAND_IDENTIFY_DEVICE 0xec
0090 #define ATA_COMMAND_SET_FEATURES 0xef
0091
0092
0093 #define ATA_COMMAND_MEDIA_LOCK 0xde
0094 #define ATA_COMMAND_MEDIA_UNLOCK 0xdf
0095 #define ATA_COMMAND_MEDIA_EJECT 0xed
0096
0097
0098
0099 #define ATA_COMMAND_RECALIBRATE 0x10
0100 #define ATA_COMMAND_READ_SECTOR_NON_RETRY 0x21
0101 #define ATA_COMMAND_READ_LONG_RETRY 0x22
0102 #define ATA_COMMAND_READ_LONG_NON_RETRY 0x23
0103 #define ATA_COMMAND_WRITE_SECTOR_NON_RETRY 0x31
0104 #define ATA_COMMAND_WRITE_LONG_RETRY 0x32
0105 #define ATA_COMMAND_WRITE_LONG_NON_RETRY 0x33
0106 #define ATA_COMMAND_WRITE_VERIFY 0x3c
0107 #define ATA_COMMAND_READ_VERIFY_SECTOR_NON_RETRY 0x41
0108 #define ATA_COMMAND_FORMAT_TRACK 0x50
0109 #define ATA_COMMAND_READ_DMA_NON_RETRY 0xc9
0110 #define ATA_COMMAND_WRITE_DMA_NON_RETRY 0xcb
0111 #define ATA_COMMAND_ACKNOWLEGE_MEDIA_CHANGE 0xdb
0112 #define ATA_COMMAND_BOOT_POST_BOOT 0xdc
0113 #define ATA_COMMAND_BOOT_PRE_BOOT 0xdd
0114 #define ATA_COMMAND_WRITE_SAME 0xe9
0115
0116
0117 #define ATA_COMMAND_CFA_REQUEST_EXTENDED_ERROR_CODE 0x03
0118 #define ATA_COMMAND_CFA_WRITE_SECTORS_WITHOUT_ERASE 0x38
0119 #define ATA_COMMAND_CFA_TRANSLATE_SECTOR 0x87
0120 #define ATA_COMMAND_CFA_ERASE_SECTORS 0xc0
0121 #define ATA_COMMAND_CFA_WRITE_MULTIPLE_WITHOUT_ERASE 0xcd
0122
0123
0124 #define ATA_COMMAND_DEVICE_RESET 0x08
0125 #define ATA_COMMAND_PACKET 0xa0
0126 #define ATA_COMMAND_IDENTIFY_PACKET_DEVICE 0xa1
0127 #define ATA_COMMAND_SERVICE 0xa2
0128
0129
0130 #define ATA_COMMAND_SECURITY_SET_PASSWORD 0xf1
0131 #define ATA_COMMAND_SECURITY_UNLOCK 0xf2
0132 #define ATA_COMMAND_SECURITY_ERASE_PREPARE 0xf3
0133 #define ATA_COMMAND_SECURITY_ERASE_UNIT 0xf4
0134 #define ATA_COMMAND_SECURITY_FREEZE_LOCK 0xf5
0135 #define ATA_COMMAND_SECURITY_DISABLE_PASSWORD 0xf6
0136
0137
0138 #define ATA_COMMAND_SMART 0xb0
0139 #define ATA_COMMAND_READ_DMA_QUEUED 0xc7
0140 #define ATA_COMMAND_WRITE_DMA_QUEUED 0xcc
0141 #define ATA_COMMAND_GET_MEDIA_STATUS 0xda
0142 #define ATA_COMMAND_FLUSH_CACHE 0xe7
0143 #define ATA_COMMAND_READ_NATIVE_MAX_ADDRESS 0xf8
0144 #define ATA_COMMAND_SET_MAX_ADDRESS 0xf9
0145
0146 #define ATA_REGISTERS_VALUE(reg) (1 << (reg))
0147
0148
0149 #define ATA_IDENT_WORD_RW_MULT 47
0150 #define ATA_IDENT_WORD_CAPABILITIES 49
0151 #define ATA_IDENT_WORD_FIELD_VALIDITY 53
0152 #define ATA_IDENT_WORD_NUM_OF_CURR_LOG_CLNDS 54
0153 #define ATA_IDENT_WORD_NUM_OF_CURR_LOG_HEADS 55
0154 #define ATA_IDENT_WORD_NUM_OF_CURR_LOG_SECS 56
0155 #define ATA_IDENT_WORD_MULT_SECS 59
0156 #define ATA_IDENT_WORD_NUM_OF_USR_SECS0 60
0157 #define ATA_IDENT_WORD_NUM_OF_USR_SECS1 61
0158 #define ATA_IDENT_WORD_PIO_SPPRTD 64
0159
0160 #define ATA_IDENT_BIT_VALID 0x02
0161
0162
0163
0164
0165
0166 #define ATA_REGISTERS_POSITION 0xfc
0167
0168 #define ATA_MAX_RTEMS_INT_VEC_NUMBER 255
0169
0170 #define ATA_MAX_NAME_LENGTH 10
0171
0172
0173 #define ATA_DEV0_PASSED_DEV1_PASSED_OR_NOT_PRSNT 0x01
0174 #define ATA_DEV0_PASSED_DEV1_FAILED 0x81
0175 #define ATA_DEV1_PASSED_DEV0_FAILED 0x80
0176
0177
0178
0179
0180 #define ATA_DEV_INFO(controller_minor, dev) \
0181 ata_ide_ctrls[controller_minor].device[dev]
0182
0183
0184
0185
0186 typedef struct ata_registers_s {
0187 uint16_t regs[8];
0188 uint16_t to_read;
0189 uint16_t to_write;
0190 } ata_registers_t;
0191
0192
0193 typedef struct ata_req_s {
0194 rtems_chain_node link;
0195 char type;
0196 ata_registers_t regs;
0197 uint32_t cnt;
0198 uint32_t cbuf;
0199 uint32_t pos;
0200 rtems_blkdev_request *breq;
0201
0202
0203 rtems_id sema;
0204
0205
0206 rtems_status_code status;
0207 int info;
0208 } ata_req_t;
0209
0210
0211 #define ATA_EXEC_CALLBACK(areq, status) \
0212 do {\
0213 if ((areq)->breq != NULL) \
0214 rtems_blkdev_request_done((areq)->breq, status); \
0215 } while (0)
0216
0217
0218 typedef enum ata_msg_type_s {
0219 ATA_MSG_GEN_EVT = 1,
0220 ATA_MSG_SUCCESS_EVT,
0221 ATA_MSG_ERROR_EVT,
0222 ATA_MSG_PROCESS_NEXT_EVT
0223 } ata_msg_type_t;
0224
0225
0226 typedef struct ata_queue_msg_s {
0227 ata_msg_type_t type;
0228 rtems_device_minor_number ctrl_minor;
0229 int error;
0230 } ata_queue_msg_t;
0231
0232
0233 #define ATA_FILL_MSG(msg, evt_type, ctrl, err)\
0234 do {\
0235 msg.type = evt_type;\
0236 msg.ctrl_minor = ctrl;\
0237 msg.error = err;\
0238 } while (0)
0239
0240 #define ATA_SEND_EVT(msg, type, ctrl, err)\
0241 do {\
0242 rtems_status_code rc;\
0243 ATA_FILL_MSG(msg, type, ctrl, err);\
0244 rc = rtems_message_queue_send(ata_queue_id, &msg,\
0245 sizeof(ata_queue_msg_t));\
0246 if (rc != RTEMS_SUCCESSFUL)\
0247 rtems_fatal_error_occurred(RTEMS_INTERNAL_ERROR);\
0248 } while (0)
0249
0250
0251
0252
0253
0254 typedef struct ata_int_st_s {
0255 rtems_chain_node link;
0256 rtems_device_minor_number ctrl_minor;
0257 } ata_int_st_t;
0258
0259
0260
0261
0262
0263 typedef struct ata_ide_dev_s {
0264 int ctrl_minor;
0265 int device;
0266 } ata_ide_dev_t;
0267
0268
0269
0270
0271 typedef struct ata_dev_s {
0272 int8_t present;
0273
0274 uint16_t cylinders;
0275 uint16_t heads;
0276 uint16_t sectors;
0277 uint32_t lba_sectors;
0278
0279
0280 uint8_t lba_avaible;
0281
0282 uint16_t modes_available;
0283 uint16_t mode_active;
0284 } ata_dev_t;
0285
0286
0287
0288
0289
0290
0291 typedef struct ata_ide_ctrl_s {
0292 bool present;
0293 ata_dev_t device[2];
0294 rtems_chain_control reqs;
0295 } ata_ide_ctrl_t;
0296
0297
0298 typedef struct blkdev_request1 {
0299 rtems_blkdev_request req;
0300 rtems_blkdev_sg_buffer sg[1];
0301 } blkdev_request1;
0302
0303 void ata_breq_init(blkdev_request1 *breq, uint16_t *sector_buffer);
0304
0305 rtems_status_code ata_identify_device(
0306 rtems_device_minor_number ctrl_minor,
0307 int dev,
0308 uint16_t *sector_buffer,
0309 ata_dev_t *device_entry
0310 );
0311
0312 void ata_process_request_on_init_phase(
0313 rtems_device_minor_number ctrl_minor,
0314 ata_req_t *areq
0315 );
0316
0317 #ifdef __cplusplus
0318 }
0319 #endif
0320
0321 #endif