Controller.cpp 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. /*
  2. * Copyright (c) 2021-2022, 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/Types.h>
  10. #include <Kernel/Arch/Delay.h>
  11. #include <Kernel/Bus/PCI/API.h>
  12. #include <Kernel/CommandLine.h>
  13. #include <Kernel/Library/LockRefPtr.h>
  14. #include <Kernel/Memory/MemoryManager.h>
  15. #include <Kernel/Storage/ATA/AHCI/Controller.h>
  16. #include <Kernel/Storage/ATA/AHCI/InterruptHandler.h>
  17. namespace Kernel {
  18. UNMAP_AFTER_INIT NonnullLockRefPtr<AHCIController> AHCIController::initialize(PCI::DeviceIdentifier const& pci_device_identifier)
  19. {
  20. auto controller = adopt_lock_ref_if_nonnull(new (nothrow) AHCIController(pci_device_identifier)).release_nonnull();
  21. controller->initialize_hba(pci_device_identifier);
  22. return controller;
  23. }
  24. bool AHCIController::reset()
  25. {
  26. dmesgln_pci(*this, "{}: AHCI controller reset", device_identifier().address());
  27. {
  28. SpinlockLocker locker(m_hba_control_lock);
  29. hba().control_regs.ghc = 1;
  30. dbgln_if(AHCI_DEBUG, "{}: AHCI Controller reset", device_identifier().address());
  31. full_memory_barrier();
  32. size_t retry = 0;
  33. // Note: The HBA is locked or hung if we waited more than 1 second!
  34. while (true) {
  35. if (retry > 1000)
  36. return false;
  37. if (!(hba().control_regs.ghc & 1))
  38. break;
  39. microseconds_delay(1000);
  40. retry++;
  41. }
  42. // Note: Turn on AHCI HBA and Global HBA Interrupts.
  43. full_memory_barrier();
  44. hba().control_regs.ghc = (1 << 31) | (1 << 1);
  45. full_memory_barrier();
  46. }
  47. // Note: According to the AHCI spec the PI register indicates which ports are exposed by the HBA.
  48. // It is loaded by the BIOS. It indicates which ports that the HBA supports are available for software to use.
  49. // For example, on an HBA that supports 6 ports as indicated in CAP.NP, only ports 1 and 3 could be available,
  50. // with ports 0, 2, 4, and 5 being unavailable.
  51. // Which means that even without clearing the AHCI ports array, we are never able to encounter
  52. // a case that we would have stale left-over ports in there. We still clear the array
  53. // for the sake of clarity and completeness, as it doesn't harm anything anyway.
  54. m_ports.fill({});
  55. auto implemented_ports = AHCI::MaskedBitField((u32 volatile&)(hba().control_regs.pi));
  56. for (auto index : implemented_ports.to_vector()) {
  57. auto port = AHCIPort::create(*this, m_hba_capabilities, static_cast<volatile AHCI::PortRegisters&>(hba().port_regs[index]), index).release_value_but_fixme_should_propagate_errors();
  58. m_ports[index] = port;
  59. port->reset();
  60. }
  61. return true;
  62. }
  63. bool AHCIController::shutdown()
  64. {
  65. TODO();
  66. }
  67. size_t AHCIController::devices_count() const
  68. {
  69. SpinlockLocker locker(m_hba_control_lock);
  70. size_t count = 0;
  71. for (auto port : m_ports) {
  72. if (port && port->connected_device())
  73. count++;
  74. }
  75. return count;
  76. }
  77. void AHCIController::start_request(ATADevice const& device, AsyncBlockDeviceRequest& request)
  78. {
  79. auto port = m_ports[device.ata_address().port];
  80. VERIFY(port);
  81. port->start_request(request);
  82. }
  83. void AHCIController::complete_current_request(AsyncDeviceRequest::RequestResult)
  84. {
  85. VERIFY_NOT_REACHED();
  86. }
  87. volatile AHCI::PortRegisters& AHCIController::port(size_t port_number) const
  88. {
  89. VERIFY(port_number < (size_t)AHCI::Limits::MaxPorts);
  90. return static_cast<volatile AHCI::PortRegisters&>(hba().port_regs[port_number]);
  91. }
  92. volatile AHCI::HBA& AHCIController::hba() const
  93. {
  94. return static_cast<volatile AHCI::HBA&>(*(volatile AHCI::HBA*)(m_hba_region->vaddr().as_ptr()));
  95. }
  96. UNMAP_AFTER_INIT AHCIController::AHCIController(PCI::DeviceIdentifier const& pci_device_identifier)
  97. : ATAController()
  98. , PCI::Device(const_cast<PCI::DeviceIdentifier&>(pci_device_identifier))
  99. , m_hba_region(default_hba_region())
  100. , m_hba_capabilities(capabilities())
  101. {
  102. }
  103. AHCI::HBADefinedCapabilities AHCIController::capabilities() const
  104. {
  105. u32 capabilities = hba().control_regs.cap;
  106. u32 extended_capabilities = hba().control_regs.cap2;
  107. dbgln_if(AHCI_DEBUG, "{}: AHCI Controller Capabilities = {:#08x}, Extended Capabilities = {:#08x}", device_identifier().address(), capabilities, extended_capabilities);
  108. return (AHCI::HBADefinedCapabilities) {
  109. (capabilities & 0b11111) + 1,
  110. ((capabilities >> 8) & 0b11111) + 1,
  111. (u8)((capabilities >> 20) & 0b1111),
  112. (capabilities & (u32)(AHCI::HBACapabilities::SXS)) != 0,
  113. (capabilities & (u32)(AHCI::HBACapabilities::EMS)) != 0,
  114. (capabilities & (u32)(AHCI::HBACapabilities::CCCS)) != 0,
  115. (capabilities & (u32)(AHCI::HBACapabilities::PSC)) != 0,
  116. (capabilities & (u32)(AHCI::HBACapabilities::SSC)) != 0,
  117. (capabilities & (u32)(AHCI::HBACapabilities::PMD)) != 0,
  118. (capabilities & (u32)(AHCI::HBACapabilities::FBSS)) != 0,
  119. (capabilities & (u32)(AHCI::HBACapabilities::SPM)) != 0,
  120. (capabilities & (u32)(AHCI::HBACapabilities::SAM)) != 0,
  121. (capabilities & (u32)(AHCI::HBACapabilities::SCLO)) != 0,
  122. (capabilities & (u32)(AHCI::HBACapabilities::SAL)) != 0,
  123. (capabilities & (u32)(AHCI::HBACapabilities::SALP)) != 0,
  124. (capabilities & (u32)(AHCI::HBACapabilities::SSS)) != 0,
  125. (capabilities & (u32)(AHCI::HBACapabilities::SMPS)) != 0,
  126. (capabilities & (u32)(AHCI::HBACapabilities::SSNTF)) != 0,
  127. (capabilities & (u32)(AHCI::HBACapabilities::SNCQ)) != 0,
  128. (capabilities & (u32)(AHCI::HBACapabilities::S64A)) != 0,
  129. (extended_capabilities & (u32)(AHCI::HBACapabilitiesExtended::BOH)) != 0,
  130. (extended_capabilities & (u32)(AHCI::HBACapabilitiesExtended::NVMP)) != 0,
  131. (extended_capabilities & (u32)(AHCI::HBACapabilitiesExtended::APST)) != 0,
  132. (extended_capabilities & (u32)(AHCI::HBACapabilitiesExtended::SDS)) != 0,
  133. (extended_capabilities & (u32)(AHCI::HBACapabilitiesExtended::SADM)) != 0,
  134. (extended_capabilities & (u32)(AHCI::HBACapabilitiesExtended::DESO)) != 0
  135. };
  136. }
  137. UNMAP_AFTER_INIT NonnullOwnPtr<Memory::Region> AHCIController::default_hba_region() const
  138. {
  139. return MM.allocate_kernel_region(PhysicalAddress(PCI::get_BAR5(device_identifier())).page_base(), Memory::page_round_up(sizeof(AHCI::HBA)).release_value_but_fixme_should_propagate_errors(), "AHCI HBA"sv, Memory::Region::Access::ReadWrite).release_value();
  140. }
  141. AHCIController::~AHCIController() = default;
  142. UNMAP_AFTER_INIT void AHCIController::initialize_hba(PCI::DeviceIdentifier const& pci_device_identifier)
  143. {
  144. u32 version = hba().control_regs.version;
  145. hba().control_regs.ghc = 0x80000000; // Ensure that HBA knows we are AHCI aware.
  146. PCI::enable_interrupt_line(device_identifier());
  147. PCI::enable_bus_mastering(device_identifier());
  148. enable_global_interrupts();
  149. auto implemented_ports = AHCI::MaskedBitField((u32 volatile&)(hba().control_regs.pi));
  150. m_irq_handler = AHCIInterruptHandler::create(*this, pci_device_identifier.interrupt_line().value(), implemented_ports).release_value_but_fixme_should_propagate_errors();
  151. reset();
  152. dbgln_if(AHCI_DEBUG, "{}: AHCI Controller Version = {:#08x}", device_identifier().address(), version);
  153. dbgln("{}: AHCI command list entries count - {}", device_identifier().address(), m_hba_capabilities.max_command_list_entries_count);
  154. }
  155. void AHCIController::handle_interrupt_for_port(Badge<AHCIInterruptHandler>, u32 port_index) const
  156. {
  157. auto port = m_ports[port_index];
  158. VERIFY(port);
  159. port->handle_interrupt();
  160. }
  161. void AHCIController::disable_global_interrupts() const
  162. {
  163. hba().control_regs.ghc = hba().control_regs.ghc & 0xfffffffd;
  164. }
  165. void AHCIController::enable_global_interrupts() const
  166. {
  167. hba().control_regs.ghc = hba().control_regs.ghc | (1 << 1);
  168. }
  169. LockRefPtr<StorageDevice> AHCIController::device_by_port(u32 port_index) const
  170. {
  171. SpinlockLocker locker(m_hba_control_lock);
  172. auto port = m_ports[port_index];
  173. if (!port)
  174. return {};
  175. SpinlockLocker port_hard_locker(port->m_hard_lock);
  176. return port->connected_device();
  177. }
  178. LockRefPtr<StorageDevice> AHCIController::device(u32 index) const
  179. {
  180. NonnullLockRefPtrVector<StorageDevice> connected_devices;
  181. u32 pi = hba().control_regs.pi;
  182. u32 bit = bit_scan_forward(pi);
  183. while (bit) {
  184. dbgln_if(AHCI_DEBUG, "Checking implemented port {}, pi {:b}", bit - 1, pi);
  185. pi &= ~(1u << (bit - 1));
  186. auto checked_device = device_by_port(bit - 1);
  187. bit = bit_scan_forward(pi);
  188. if (checked_device.is_null())
  189. continue;
  190. connected_devices.append(checked_device.release_nonnull());
  191. }
  192. dbgln_if(AHCI_DEBUG, "Connected device count: {}, Index: {}", connected_devices.size(), index);
  193. if (index >= connected_devices.size())
  194. return nullptr;
  195. return connected_devices[index];
  196. }
  197. }