PATADiskDevice.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. #include "PATADiskDevice.h"
  2. #include <Kernel/Arch/i386/PIC.h>
  3. #include <Kernel/FileSystem/ProcFS.h>
  4. #include <Kernel/IO.h>
  5. #include <Kernel/Process.h>
  6. #include <Kernel/StdLib.h>
  7. #include <Kernel/VM/MemoryManager.h>
  8. //#define DISK_DEBUG
  9. #define IRQ_FIXED_DISK 14
  10. #define ATA_SR_BSY 0x80
  11. #define ATA_SR_DRDY 0x40
  12. #define ATA_SR_DF 0x20
  13. #define ATA_SR_DSC 0x10
  14. #define ATA_SR_DRQ 0x08
  15. #define ATA_SR_CORR 0x04
  16. #define ATA_SR_IDX 0x02
  17. #define ATA_SR_ERR 0x01
  18. #define ATA_ER_BBK 0x80
  19. #define ATA_ER_UNC 0x40
  20. #define ATA_ER_MC 0x20
  21. #define ATA_ER_IDNF 0x10
  22. #define ATA_ER_MCR 0x08
  23. #define ATA_ER_ABRT 0x04
  24. #define ATA_ER_TK0NF 0x02
  25. #define ATA_ER_AMNF 0x01
  26. #define ATA_CMD_READ_PIO 0x20
  27. #define ATA_CMD_READ_PIO_EXT 0x24
  28. #define ATA_CMD_READ_DMA 0xC8
  29. #define ATA_CMD_READ_DMA_EXT 0x25
  30. #define ATA_CMD_WRITE_PIO 0x30
  31. #define ATA_CMD_WRITE_PIO_EXT 0x34
  32. #define ATA_CMD_WRITE_DMA 0xCA
  33. #define ATA_CMD_WRITE_DMA_EXT 0x35
  34. #define ATA_CMD_CACHE_FLUSH 0xE7
  35. #define ATA_CMD_CACHE_FLUSH_EXT 0xEA
  36. #define ATA_CMD_PACKET 0xA0
  37. #define ATA_CMD_IDENTIFY_PACKET 0xA1
  38. #define ATA_CMD_IDENTIFY 0xEC
  39. #define ATAPI_CMD_READ 0xA8
  40. #define ATAPI_CMD_EJECT 0x1B
  41. #define ATA_IDENT_DEVICETYPE 0
  42. #define ATA_IDENT_CYLINDERS 2
  43. #define ATA_IDENT_HEADS 6
  44. #define ATA_IDENT_SECTORS 12
  45. #define ATA_IDENT_SERIAL 20
  46. #define ATA_IDENT_MODEL 54
  47. #define ATA_IDENT_CAPABILITIES 98
  48. #define ATA_IDENT_FIELDVALID 106
  49. #define ATA_IDENT_MAX_LBA 120
  50. #define ATA_IDENT_COMMANDSETS 164
  51. #define ATA_IDENT_MAX_LBA_EXT 200
  52. #define IDE_ATA 0x00
  53. #define IDE_ATAPI 0x01
  54. #define ATA_REG_DATA 0x00
  55. #define ATA_REG_ERROR 0x01
  56. #define ATA_REG_FEATURES 0x01
  57. #define ATA_REG_SECCOUNT0 0x02
  58. #define ATA_REG_LBA0 0x03
  59. #define ATA_REG_LBA1 0x04
  60. #define ATA_REG_LBA2 0x05
  61. #define ATA_REG_HDDEVSEL 0x06
  62. #define ATA_REG_COMMAND 0x07
  63. #define ATA_REG_STATUS 0x07
  64. #define ATA_REG_SECCOUNT1 0x08
  65. #define ATA_REG_LBA3 0x09
  66. #define ATA_REG_LBA4 0x0A
  67. #define ATA_REG_LBA5 0x0B
  68. #define ATA_REG_CONTROL 0x0C
  69. #define ATA_REG_ALTSTATUS 0x0C
  70. #define ATA_REG_DEVADDRESS 0x0D
  71. NonnullRefPtr<PATADiskDevice> PATADiskDevice::create(PATAChannel& channel, DriveType type, int major, int minor)
  72. {
  73. return adopt(*new PATADiskDevice(channel, type, major, minor));
  74. }
  75. PATADiskDevice::PATADiskDevice(PATAChannel& channel, DriveType type, int major, int minor)
  76. : DiskDevice(major, minor)
  77. , m_drive_type(type)
  78. , m_channel(channel)
  79. {
  80. }
  81. PATADiskDevice::~PATADiskDevice()
  82. {
  83. }
  84. const char* PATADiskDevice::class_name() const
  85. {
  86. return "PATADiskDevice";
  87. }
  88. bool PATADiskDevice::read_blocks(unsigned index, u16 count, u8* out)
  89. {
  90. if (m_channel.m_bus_master_base && m_channel.m_dma_enabled.resource())
  91. return read_sectors_with_dma(index, count, out);
  92. return read_sectors(index, count, out);
  93. }
  94. bool PATADiskDevice::read_block(unsigned index, u8* out) const
  95. {
  96. return const_cast<PATADiskDevice*>(this)->read_blocks(index, 1, out);
  97. }
  98. bool PATADiskDevice::write_blocks(unsigned index, u16 count, const u8* data)
  99. {
  100. if (m_channel.m_bus_master_base && m_channel.m_dma_enabled.resource())
  101. return write_sectors_with_dma(index, count, data);
  102. for (unsigned i = 0; i < count; ++i) {
  103. if (!write_sectors(index + i, 1, data + i * 512))
  104. return false;
  105. }
  106. return true;
  107. }
  108. bool PATADiskDevice::write_block(unsigned index, const u8* data)
  109. {
  110. return write_blocks(index, 1, data);
  111. }
  112. void PATADiskDevice::set_drive_geometry(u16 cyls, u16 heads, u16 spt)
  113. {
  114. m_cylinders = cyls;
  115. m_heads = heads;
  116. m_sectors_per_track = spt;
  117. }
  118. bool PATADiskDevice::read_sectors_with_dma(u32 lba, u16 count, u8* outbuf)
  119. {
  120. return m_channel.ata_read_sectors_with_dma(lba, count, outbuf, is_slave());
  121. }
  122. bool PATADiskDevice::read_sectors(u32 start_sector, u16 count, u8* outbuf)
  123. {
  124. return m_channel.ata_read_sectors(start_sector, count, outbuf, is_slave());
  125. }
  126. bool PATADiskDevice::write_sectors_with_dma(u32 lba, u16 count, const u8* inbuf)
  127. {
  128. return m_channel.ata_write_sectors_with_dma(lba, count, inbuf, is_slave());
  129. }
  130. bool PATADiskDevice::write_sectors(u32 start_sector, u16 count, const u8* inbuf)
  131. {
  132. return m_channel.ata_write_sectors(start_sector, count, inbuf, is_slave());
  133. }
  134. bool PATADiskDevice::is_slave() const
  135. {
  136. return m_drive_type == DriveType::Slave;
  137. }