NativeDisplayConnector.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /*
  2. * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/Arch/Delay.h>
  7. #include <Kernel/Bus/PCI/API.h>
  8. #include <Kernel/Debug.h>
  9. #include <Kernel/Devices/DeviceManagement.h>
  10. #include <Kernel/Graphics/Console/ContiguousFramebufferConsole.h>
  11. #include <Kernel/Graphics/GraphicsManagement.h>
  12. #include <Kernel/Graphics/Intel/DisplayConnectorGroup.h>
  13. #include <Kernel/Graphics/Intel/NativeDisplayConnector.h>
  14. #include <Kernel/Memory/Region.h>
  15. namespace Kernel {
  16. ErrorOr<NonnullLockRefPtr<IntelNativeDisplayConnector>> IntelNativeDisplayConnector::try_create_with_display_connector_group(IntelDisplayConnectorGroup const& parent_connector_group, ConnectorIndex connector_index, Type type, PhysicalAddress framebuffer_address, size_t framebuffer_resource_size)
  17. {
  18. return TRY(DeviceManagement::try_create_device<IntelNativeDisplayConnector>(parent_connector_group, connector_index, type, framebuffer_address, framebuffer_resource_size));
  19. }
  20. ErrorOr<void> IntelNativeDisplayConnector::create_attached_framebuffer_console(Badge<IntelDisplayConnectorGroup>)
  21. {
  22. size_t width = 0;
  23. size_t height = 0;
  24. size_t pitch = 0;
  25. {
  26. SpinlockLocker control_locker(m_control_lock);
  27. SpinlockLocker mode_set_locker(m_modeset_lock);
  28. width = m_current_mode_setting.horizontal_active;
  29. height = m_current_mode_setting.vertical_active;
  30. pitch = m_current_mode_setting.horizontal_stride;
  31. }
  32. m_framebuffer_console = Graphics::ContiguousFramebufferConsole::initialize(m_framebuffer_address.value(), width, height, pitch);
  33. GraphicsManagement::the().set_console(*m_framebuffer_console);
  34. return {};
  35. }
  36. IntelNativeDisplayConnector::IntelNativeDisplayConnector(IntelDisplayConnectorGroup const& parent_connector_group, ConnectorIndex connector_index, Type type, PhysicalAddress framebuffer_address, size_t framebuffer_resource_size)
  37. : DisplayConnector(framebuffer_address, framebuffer_resource_size, true)
  38. , m_type(type)
  39. , m_connector_index(connector_index)
  40. , m_parent_connector_group(parent_connector_group)
  41. {
  42. }
  43. void IntelNativeDisplayConnector::set_edid_bytes(Badge<IntelDisplayConnectorGroup>, Array<u8, 128> const& raw_bytes)
  44. {
  45. // Note: The provided EDID might be invalid (because there's no attached monitor)
  46. // Therefore, set might_be_invalid to true to indicate that.
  47. DisplayConnector::set_edid_bytes(raw_bytes, true);
  48. }
  49. ErrorOr<void> IntelNativeDisplayConnector::set_y_offset(size_t)
  50. {
  51. return Error::from_errno(ENOTIMPL);
  52. }
  53. ErrorOr<void> IntelNativeDisplayConnector::unblank()
  54. {
  55. return Error::from_errno(ENOTIMPL);
  56. }
  57. ErrorOr<void> IntelNativeDisplayConnector::set_safe_mode_setting()
  58. {
  59. SpinlockLocker locker(m_modeset_lock);
  60. return m_parent_connector_group->set_safe_mode_setting({}, *this);
  61. }
  62. void IntelNativeDisplayConnector::enable_console()
  63. {
  64. VERIFY(m_control_lock.is_locked());
  65. VERIFY(m_framebuffer_console);
  66. m_framebuffer_console->enable();
  67. }
  68. void IntelNativeDisplayConnector::disable_console()
  69. {
  70. VERIFY(m_control_lock.is_locked());
  71. VERIFY(m_framebuffer_console);
  72. m_framebuffer_console->disable();
  73. }
  74. ErrorOr<void> IntelNativeDisplayConnector::flush_first_surface()
  75. {
  76. return Error::from_errno(ENOTSUP);
  77. }
  78. ErrorOr<void> IntelNativeDisplayConnector::set_mode_setting(DisplayConnector::ModeSetting const&)
  79. {
  80. return Error::from_errno(ENOTIMPL);
  81. }
  82. }