DeviceAttribute.cpp 3.0 KB

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