Controller.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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/BusMasterChannel.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. m_channels[0].start_request(request, address.subport == 0 ? false : true, device.ata_capabilites());
  44. return;
  45. case 1:
  46. m_channels[1].start_request(request, address.subport == 0 ? false : true, device.ata_capabilites());
  47. return;
  48. }
  49. VERIFY_NOT_REACHED();
  50. }
  51. void IDEController::complete_current_request(AsyncDeviceRequest::RequestResult)
  52. {
  53. VERIFY_NOT_REACHED();
  54. }
  55. UNMAP_AFTER_INIT IDEController::IDEController()
  56. {
  57. }
  58. UNMAP_AFTER_INIT IDEController::~IDEController() = default;
  59. RefPtr<StorageDevice> IDEController::device_by_channel_and_position(u32 index) const
  60. {
  61. switch (index) {
  62. case 0:
  63. return m_channels[0].master_device();
  64. case 1:
  65. return m_channels[0].slave_device();
  66. case 2:
  67. return m_channels[1].master_device();
  68. case 3:
  69. return m_channels[1].slave_device();
  70. }
  71. VERIFY_NOT_REACHED();
  72. }
  73. RefPtr<StorageDevice> IDEController::device(u32 index) const
  74. {
  75. NonnullRefPtrVector<StorageDevice> connected_devices;
  76. for (size_t index = 0; index < 4; index++) {
  77. auto checked_device = device_by_channel_and_position(index);
  78. if (checked_device.is_null())
  79. continue;
  80. connected_devices.append(checked_device.release_nonnull());
  81. }
  82. if (index >= connected_devices.size())
  83. return nullptr;
  84. return connected_devices[index];
  85. }
  86. }