Controller.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /*
  2. * Copyright (c) 2020-2022, Liav A. <liavalb@hotmail.co.il>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/OwnPtr.h>
  7. #include <AK/Types.h>
  8. #include <Kernel/Bus/PCI/API.h>
  9. #include <Kernel/Library/LockRefPtr.h>
  10. #include <Kernel/Sections.h>
  11. #include <Kernel/Storage/ATA/ATADiskDevice.h>
  12. #include <Kernel/Storage/ATA/GenericIDE/Channel.h>
  13. #include <Kernel/Storage/ATA/GenericIDE/Controller.h>
  14. namespace Kernel {
  15. UNMAP_AFTER_INIT NonnullLockRefPtr<IDEController> IDEController::initialize()
  16. {
  17. return adopt_lock_ref(*new IDEController());
  18. }
  19. ErrorOr<void> IDEController::reset()
  20. {
  21. return Error::from_errno(ENOTIMPL);
  22. }
  23. ErrorOr<void> IDEController::shutdown()
  24. {
  25. return Error::from_errno(ENOTIMPL);
  26. }
  27. size_t IDEController::devices_count() const
  28. {
  29. size_t count = 0;
  30. for (u32 index = 0; index < 4; index++) {
  31. if (!device(index).is_null())
  32. count++;
  33. }
  34. return count;
  35. }
  36. void IDEController::start_request(ATADevice const& device, AsyncBlockDeviceRequest& request)
  37. {
  38. auto& address = device.ata_address();
  39. VERIFY(address.subport < 2);
  40. switch (address.port) {
  41. case 0: {
  42. auto result = m_channels[0]->start_request(device, request);
  43. // FIXME: Propagate errors properly
  44. VERIFY(!result.is_error());
  45. return;
  46. }
  47. case 1: {
  48. auto result = m_channels[1]->start_request(device, request);
  49. // FIXME: Propagate errors properly
  50. VERIFY(!result.is_error());
  51. return;
  52. }
  53. }
  54. VERIFY_NOT_REACHED();
  55. }
  56. void IDEController::complete_current_request(AsyncDeviceRequest::RequestResult)
  57. {
  58. VERIFY_NOT_REACHED();
  59. }
  60. UNMAP_AFTER_INIT IDEController::IDEController() = default;
  61. UNMAP_AFTER_INIT IDEController::~IDEController() = default;
  62. LockRefPtr<StorageDevice> IDEController::device_by_channel_and_position(u32 index) const
  63. {
  64. switch (index) {
  65. case 0:
  66. return m_channels[0]->connected_device(0);
  67. case 1:
  68. return m_channels[0]->connected_device(1);
  69. case 2:
  70. return m_channels[1]->connected_device(0);
  71. case 3:
  72. return m_channels[1]->connected_device(1);
  73. }
  74. VERIFY_NOT_REACHED();
  75. }
  76. LockRefPtr<StorageDevice> IDEController::device(u32 index) const
  77. {
  78. Vector<NonnullLockRefPtr<StorageDevice>> connected_devices;
  79. for (size_t index = 0; index < 4; index++) {
  80. auto checked_device = device_by_channel_and_position(index);
  81. if (checked_device.is_null())
  82. continue;
  83. connected_devices.append(checked_device.release_nonnull());
  84. }
  85. if (index >= connected_devices.size())
  86. return nullptr;
  87. return connected_devices[index];
  88. }
  89. }