ATA.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #define ATA_SR_BSY 0x80
  8. #define ATA_SR_DRDY 0x40
  9. #define ATA_SR_DF 0x20
  10. #define ATA_SR_DSC 0x10
  11. #define ATA_SR_DRQ 0x08
  12. #define ATA_SR_CORR 0x04
  13. #define ATA_SR_IDX 0x02
  14. #define ATA_SR_ERR 0x01
  15. #define ATA_ER_BBK 0x80
  16. #define ATA_ER_UNC 0x40
  17. #define ATA_ER_MC 0x20
  18. #define ATA_ER_IDNF 0x10
  19. #define ATA_ER_MCR 0x08
  20. #define ATA_ER_ABRT 0x04
  21. #define ATA_ER_TK0NF 0x02
  22. #define ATA_ER_AMNF 0x01
  23. #define ATA_CMD_READ_PIO 0x20
  24. #define ATA_CMD_READ_PIO_EXT 0x24
  25. #define ATA_CMD_READ_DMA 0xC8
  26. #define ATA_CMD_READ_DMA_EXT 0x25
  27. #define ATA_CMD_WRITE_PIO 0x30
  28. #define ATA_CMD_WRITE_PIO_EXT 0x34
  29. #define ATA_CMD_WRITE_DMA 0xCA
  30. #define ATA_CMD_WRITE_DMA_EXT 0x35
  31. #define ATA_CMD_CACHE_FLUSH 0xE7
  32. #define ATA_CMD_CACHE_FLUSH_EXT 0xEA
  33. #define ATA_CMD_PACKET 0xA0
  34. #define ATA_CMD_IDENTIFY_PACKET 0xA1
  35. #define ATA_CMD_IDENTIFY 0xEC
  36. #define ATAPI_CMD_READ 0xA8
  37. #define ATAPI_CMD_EJECT 0x1B
  38. #define ATA_IDENT_DEVICETYPE 0
  39. #define ATA_IDENT_CYLINDERS 2
  40. #define ATA_IDENT_HEADS 6
  41. #define ATA_IDENT_SECTORS 12
  42. #define ATA_IDENT_SERIAL 20
  43. #define ATA_IDENT_MODEL 54
  44. #define ATA_IDENT_CAPABILITIES 98
  45. #define ATA_IDENT_FIELDVALID 106
  46. #define ATA_IDENT_MAX_LBA 120
  47. #define ATA_IDENT_COMMANDSETS 164
  48. #define ATA_IDENT_MAX_LBA_EXT 200
  49. #define ATA_USE_LBA_ADDRESSING (1 << 6)
  50. #define IDE_ATA 0x00
  51. #define IDE_ATAPI 0x01
  52. #define ATA_REG_DATA 0x00
  53. #define ATA_REG_ERROR 0x01
  54. #define ATA_REG_FEATURES 0x01
  55. #define ATA_REG_SECCOUNT0 0x02
  56. #define ATA_REG_LBA0 0x03
  57. #define ATA_REG_LBA1 0x04
  58. #define ATA_REG_LBA2 0x05
  59. #define ATA_REG_HDDEVSEL 0x06
  60. #define ATA_REG_COMMAND 0x07
  61. #define ATA_REG_STATUS 0x07
  62. #define ATA_REG_SECCOUNT1 0x08
  63. #define ATA_REG_LBA3 0x09
  64. #define ATA_REG_LBA4 0x0A
  65. #define ATA_REG_LBA5 0x0B
  66. #define ATA_CTL_CONTROL 0x00
  67. #define ATA_CTL_ALTSTATUS 0x00
  68. #define ATA_CTL_DEVADDRESS 0x01
  69. #define ATA_CAP_LBA 0x200
  70. #include <AK/Types.h>
  71. namespace Kernel {
  72. struct [[gnu::packed]] ATAIdentifyBlock {
  73. u16 general_configuration;
  74. u16 obsolete;
  75. u16 specific_configuration;
  76. u16 obsolete2;
  77. u16 retired[2];
  78. u16 obsolete3;
  79. u16 reserved_for_cfa[2];
  80. u16 retired2;
  81. u16 serial_number[10];
  82. u16 retired3[2];
  83. u16 obsolete4;
  84. u16 firmware_revision[4];
  85. u16 model_number[20];
  86. u16 maximum_logical_sectors_per_drq;
  87. u16 trusted_computing_features;
  88. u16 capabilities[2];
  89. u16 obsolete5[2];
  90. u16 validity_flags;
  91. u16 obsolete6[5];
  92. u16 security_features;
  93. u32 max_28_bit_addressable_logical_sector;
  94. u16 obsolete7;
  95. u16 dma_modes;
  96. u16 pio_modes;
  97. u16 minimum_multiword_dma_transfer_cycle;
  98. u16 recommended_multiword_dma_transfer_cycle;
  99. u16 minimum_multiword_pio_transfer_cycle_without_flow_control;
  100. u16 minimum_multiword_pio_transfer_cycle_with_flow_control;
  101. u16 additional_supported;
  102. u16 reserved3[5];
  103. u16 queue_depth;
  104. u16 serial_ata_capabilities;
  105. u16 serial_ata_additional_capabilities;
  106. u16 serial_ata_features_supported;
  107. u16 serial_ata_features_enabled;
  108. u16 major_version_number;
  109. u16 minor_version_number;
  110. u16 commands_and_feature_sets_supported[3];
  111. u16 commands_and_feature_sets_supported_or_enabled[3];
  112. u16 ultra_dma_modes;
  113. u16 timing_for_security_features[2];
  114. u16 apm_level;
  115. u16 master_password_id;
  116. u16 hardware_reset_results;
  117. u16 obsolete8;
  118. u16 stream_minimum_request_time;
  119. u16 streaming_transfer_time_for_dma;
  120. u16 streaming_access_latency;
  121. u16 streaming_performance_granularity[2];
  122. u64 user_addressable_logical_sectors_count;
  123. u16 streaming_transfer_time_for_pio;
  124. u16 max_512_byte_blocks_per_data_set_management_command;
  125. u16 physical_sector_size_to_logical_sector_size;
  126. u16 inter_seek_delay_for_acoustic_testing;
  127. u16 world_wide_name[4];
  128. u16 reserved4[4];
  129. u16 obsolete9;
  130. u32 logical_sector_size;
  131. u16 commands_and_feature_sets_supported2;
  132. u16 commands_and_feature_sets_supported_or_enabled2;
  133. u16 reserved_for_expanded_supported_and_enabled_settings[6];
  134. u16 obsolete10;
  135. u16 security_status;
  136. u16 vendor_specific[31];
  137. u16 reserved_for_cfa2[8];
  138. u16 device_nominal_form_factor;
  139. u16 data_set_management_command_support;
  140. u16 additional_product_id[4];
  141. u16 reserved5[2];
  142. u16 current_media_serial_number[30];
  143. u16 sct_command_transport;
  144. u16 reserved6[2];
  145. u16 logical_sectors_alignment_within_physical_sector;
  146. u32 write_read_verify_sector_mode_3_count;
  147. u32 write_read_verify_sector_mode_2_count;
  148. u16 obsolete11[3];
  149. u16 nominal_media_rotation_rate;
  150. u16 reserved7;
  151. u16 obsolete12;
  152. u16 write_read_verify_feature_set_current_mode;
  153. u16 reserved8;
  154. u16 transport_major_version_number;
  155. u16 transport_minor_version_number;
  156. u16 reserved9[6];
  157. u64 extended_user_addressable_logical_sectors_count;
  158. u16 minimum_512_byte_data_blocks_per_download_microcode_operation;
  159. u16 max_512_byte_data_blocks_per_download_microcode_operation;
  160. u16 reserved10[19];
  161. u16 integrity;
  162. };
  163. };