Controller.cpp 2.5 KB

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