Controller.cpp 2.5 KB

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