DeviceAttribute.cpp 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*
  2. * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/Bus/PCI/API.h>
  7. #include <Kernel/Bus/PCI/Access.h>
  8. #include <Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/DeviceAttribute.h>
  9. #include <Kernel/Sections.h>
  10. namespace Kernel {
  11. StringView DisplayConnectorAttributeSysFSComponent::name() const
  12. {
  13. switch (m_type) {
  14. case Type::MutableModeSettingCapable:
  15. return "mutable_mode_setting_capable"sv;
  16. case Type::DoubleFrameBufferingCapable:
  17. return "double_framebuffering_capable"sv;
  18. case Type::FlushSupport:
  19. return "flush_support"sv;
  20. case Type::PartialFlushSupport:
  21. return "partial_flush_support"sv;
  22. case Type::RefreshRateSupport:
  23. return "refresh_rate_support"sv;
  24. case Type::EDID:
  25. return "edid"sv;
  26. default:
  27. VERIFY_NOT_REACHED();
  28. }
  29. }
  30. NonnullRefPtr<DisplayConnectorAttributeSysFSComponent> DisplayConnectorAttributeSysFSComponent::must_create(DisplayConnectorSysFSDirectory const& device_directory, Type type)
  31. {
  32. return adopt_ref(*new (nothrow) DisplayConnectorAttributeSysFSComponent(device_directory, type));
  33. }
  34. DisplayConnectorAttributeSysFSComponent::DisplayConnectorAttributeSysFSComponent(DisplayConnectorSysFSDirectory const& device_directory, Type type)
  35. : SysFSComponent()
  36. , m_device(device_directory.device({}))
  37. , m_type(type)
  38. {
  39. }
  40. ErrorOr<size_t> DisplayConnectorAttributeSysFSComponent::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription*) const
  41. {
  42. auto blob = TRY(try_to_generate_buffer());
  43. if ((size_t)offset >= blob->size())
  44. return 0;
  45. ssize_t nread = min(static_cast<off_t>(blob->size() - offset), static_cast<off_t>(count));
  46. TRY(buffer.write(blob->data() + offset, nread));
  47. return nread;
  48. }
  49. ErrorOr<NonnullOwnPtr<KBuffer>> DisplayConnectorAttributeSysFSComponent::try_to_generate_buffer() const
  50. {
  51. OwnPtr<KString> value;
  52. switch (m_type) {
  53. case Type::MutableModeSettingCapable:
  54. value = TRY(KString::formatted("{:d}", m_device->mutable_mode_setting_capable()));
  55. break;
  56. case Type::DoubleFrameBufferingCapable:
  57. value = TRY(KString::formatted("{:d}", m_device->double_framebuffering_capable()));
  58. break;
  59. case Type::FlushSupport:
  60. value = TRY(KString::formatted("{:d}", m_device->flush_support()));
  61. break;
  62. case Type::PartialFlushSupport:
  63. value = TRY(KString::formatted("{:d}", m_device->partial_flush_support()));
  64. break;
  65. case Type::RefreshRateSupport:
  66. value = TRY(KString::formatted("{:d}", m_device->refresh_rate_support()));
  67. break;
  68. case Type::EDID: {
  69. auto edid_buffer = TRY(m_device->get_edid());
  70. return KBuffer::try_create_with_bytes("SysFS DisplayConnectorAttributeSysFSComponent EDID buffer"sv, edid_buffer.bytes());
  71. }
  72. default:
  73. VERIFY_NOT_REACHED();
  74. }
  75. return KBuffer::try_create_with_bytes("SysFS DisplayConnectorAttributeSysFSComponent buffer"sv, value->view().bytes());
  76. }
  77. }