AHCIController.cpp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. /*
  2. * Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/Atomic.h>
  7. #include <AK/BuiltinWrappers.h>
  8. #include <AK/OwnPtr.h>
  9. #include <AK/RefPtr.h>
  10. #include <AK/Types.h>
  11. #include <Kernel/Bus/PCI/API.h>
  12. #include <Kernel/Memory/MemoryManager.h>
  13. #include <Kernel/Storage/ATA/AHCIController.h>
  14. #include <Kernel/Storage/ATA/AHCIPortHandler.h>
  15. namespace Kernel {
  16. NonnullRefPtr<AHCIController> AHCIController::initialize(PCI::DeviceIdentifier const& pci_device_identifier)
  17. {
  18. return adopt_ref(*new AHCIController(pci_device_identifier));
  19. }
  20. bool AHCIController::reset()
  21. {
  22. hba().control_regs.ghc = 1;
  23. dbgln_if(AHCI_DEBUG, "{}: AHCI Controller reset", pci_address());
  24. full_memory_barrier();
  25. size_t retry = 0;
  26. while (true) {
  27. if (retry > 1000)
  28. return false;
  29. if (!(hba().control_regs.ghc & 1))
  30. break;
  31. IO::delay(1000);
  32. retry++;
  33. }
  34. // The HBA is locked or hung if we waited more than 1 second!
  35. return true;
  36. }
  37. bool AHCIController::shutdown()
  38. {
  39. TODO();
  40. }
  41. size_t AHCIController::devices_count() const
  42. {
  43. size_t count = 0;
  44. for (auto& port_handler : m_handlers) {
  45. port_handler.enumerate_ports([&](const AHCIPort& port) {
  46. if (port.connected_device())
  47. count++;
  48. });
  49. }
  50. return count;
  51. }
  52. void AHCIController::start_request(const ATADevice& device, AsyncBlockDeviceRequest& request)
  53. {
  54. // FIXME: For now we have one port handler, check all of them...
  55. VERIFY(m_handlers.size() > 0);
  56. auto port = m_handlers[0].port_at_index(device.ata_address().port);
  57. VERIFY(port);
  58. port->start_request(request);
  59. }
  60. void AHCIController::complete_current_request(AsyncDeviceRequest::RequestResult)
  61. {
  62. VERIFY_NOT_REACHED();
  63. }
  64. volatile AHCI::PortRegisters& AHCIController::port(size_t port_number) const
  65. {
  66. VERIFY(port_number < (size_t)AHCI::Limits::MaxPorts);
  67. return static_cast<volatile AHCI::PortRegisters&>(hba().port_regs[port_number]);
  68. }
  69. volatile AHCI::HBA& AHCIController::hba() const
  70. {
  71. return static_cast<volatile AHCI::HBA&>(*(volatile AHCI::HBA*)(m_hba_region->vaddr().as_ptr()));
  72. }
  73. AHCIController::AHCIController(PCI::DeviceIdentifier const& pci_device_identifier)
  74. : ATAController()
  75. , PCI::Device(pci_device_identifier.address())
  76. , m_hba_region(default_hba_region())
  77. , m_capabilities(capabilities())
  78. {
  79. initialize_hba(pci_device_identifier);
  80. }
  81. AHCI::HBADefinedCapabilities AHCIController::capabilities() const
  82. {
  83. u32 capabilities = hba().control_regs.cap;
  84. u32 extended_capabilities = hba().control_regs.cap2;
  85. dbgln_if(AHCI_DEBUG, "{}: AHCI Controller Capabilities = {:#08x}, Extended Capabilities = {:#08x}", pci_address(), capabilities, extended_capabilities);
  86. return (AHCI::HBADefinedCapabilities) {
  87. (capabilities & 0b11111) + 1,
  88. ((capabilities >> 8) & 0b11111) + 1,
  89. (u8)((capabilities >> 20) & 0b1111),
  90. (capabilities & (u32)(AHCI::HBACapabilities::SXS)) != 0,
  91. (capabilities & (u32)(AHCI::HBACapabilities::EMS)) != 0,
  92. (capabilities & (u32)(AHCI::HBACapabilities::CCCS)) != 0,
  93. (capabilities & (u32)(AHCI::HBACapabilities::PSC)) != 0,
  94. (capabilities & (u32)(AHCI::HBACapabilities::SSC)) != 0,
  95. (capabilities & (u32)(AHCI::HBACapabilities::PMD)) != 0,
  96. (capabilities & (u32)(AHCI::HBACapabilities::FBSS)) != 0,
  97. (capabilities & (u32)(AHCI::HBACapabilities::SPM)) != 0,
  98. (capabilities & (u32)(AHCI::HBACapabilities::SAM)) != 0,
  99. (capabilities & (u32)(AHCI::HBACapabilities::SCLO)) != 0,
  100. (capabilities & (u32)(AHCI::HBACapabilities::SAL)) != 0,
  101. (capabilities & (u32)(AHCI::HBACapabilities::SALP)) != 0,
  102. (capabilities & (u32)(AHCI::HBACapabilities::SSS)) != 0,
  103. (capabilities & (u32)(AHCI::HBACapabilities::SMPS)) != 0,
  104. (capabilities & (u32)(AHCI::HBACapabilities::SSNTF)) != 0,
  105. (capabilities & (u32)(AHCI::HBACapabilities::SNCQ)) != 0,
  106. (capabilities & (u32)(AHCI::HBACapabilities::S64A)) != 0,
  107. (extended_capabilities & (u32)(AHCI::HBACapabilitiesExtended::BOH)) != 0,
  108. (extended_capabilities & (u32)(AHCI::HBACapabilitiesExtended::NVMP)) != 0,
  109. (extended_capabilities & (u32)(AHCI::HBACapabilitiesExtended::APST)) != 0,
  110. (extended_capabilities & (u32)(AHCI::HBACapabilitiesExtended::SDS)) != 0,
  111. (extended_capabilities & (u32)(AHCI::HBACapabilitiesExtended::SADM)) != 0,
  112. (extended_capabilities & (u32)(AHCI::HBACapabilitiesExtended::DESO)) != 0
  113. };
  114. }
  115. NonnullOwnPtr<Memory::Region> AHCIController::default_hba_region() const
  116. {
  117. return MM.allocate_kernel_region(PhysicalAddress(PCI::get_BAR5(pci_address())).page_base(), Memory::page_round_up(sizeof(AHCI::HBA)).release_value_but_fixme_should_propagate_errors(), "AHCI HBA", Memory::Region::Access::ReadWrite).release_value();
  118. }
  119. AHCIController::~AHCIController() = default;
  120. void AHCIController::initialize_hba(PCI::DeviceIdentifier const& pci_device_identifier)
  121. {
  122. if (!reset()) {
  123. dmesgln("{}: AHCI controller reset failed", pci_address());
  124. return;
  125. }
  126. dmesgln("{}: AHCI controller reset", pci_address());
  127. dbgln("{}: AHCI command list entries count - {}", pci_address(), hba_capabilities().max_command_list_entries_count);
  128. u32 version = hba().control_regs.version;
  129. dbgln_if(AHCI_DEBUG, "{}: AHCI Controller Version = {:#08x}", pci_address(), version);
  130. hba().control_regs.ghc = 0x80000000; // Ensure that HBA knows we are AHCI aware.
  131. PCI::enable_interrupt_line(pci_address());
  132. PCI::enable_bus_mastering(pci_address());
  133. enable_global_interrupts();
  134. m_handlers.append(AHCIPortHandler::create(*this, pci_device_identifier.interrupt_line().value(),
  135. AHCI::MaskedBitField((volatile u32&)(hba().control_regs.pi))));
  136. }
  137. void AHCIController::disable_global_interrupts() const
  138. {
  139. hba().control_regs.ghc = hba().control_regs.ghc & 0xfffffffd;
  140. }
  141. void AHCIController::enable_global_interrupts() const
  142. {
  143. hba().control_regs.ghc = hba().control_regs.ghc | (1 << 1);
  144. }
  145. RefPtr<StorageDevice> AHCIController::device_by_port(u32 port_index) const
  146. {
  147. for (auto& port_handler : m_handlers) {
  148. if (!port_handler.is_responsible_for_port_index(port_index))
  149. continue;
  150. auto port = port_handler.port_at_index(port_index);
  151. if (!port)
  152. return nullptr;
  153. return port->connected_device();
  154. }
  155. return nullptr;
  156. }
  157. RefPtr<StorageDevice> AHCIController::device(u32 index) const
  158. {
  159. NonnullRefPtrVector<StorageDevice> connected_devices;
  160. u32 pi = hba().control_regs.pi;
  161. u32 bit = bit_scan_forward(pi);
  162. while (bit) {
  163. dbgln_if(AHCI_DEBUG, "Checking implemented port {}, pi {:b}", bit - 1, pi);
  164. pi &= ~(1u << (bit - 1));
  165. auto checked_device = device_by_port(bit - 1);
  166. bit = bit_scan_forward(pi);
  167. if (checked_device.is_null())
  168. continue;
  169. connected_devices.append(checked_device.release_nonnull());
  170. }
  171. dbgln_if(AHCI_DEBUG, "Connected device count: {}, Index: {}", connected_devices.size(), index);
  172. if (index >= connected_devices.size())
  173. return nullptr;
  174. return connected_devices[index];
  175. }
  176. }