DisplayPlane.cpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/Graphics/Intel/Plane/DisplayPlane.h>
  7. #include <Kernel/Memory/PhysicalAddress.h>
  8. namespace Kernel {
  9. IntelDisplayPlane::IntelDisplayPlane(Memory::TypedMapping<PlaneRegisters volatile> plane_registers_mapping)
  10. : m_plane_registers(move(plane_registers_mapping))
  11. {
  12. }
  13. IntelDisplayPlane::ShadowRegisters IntelDisplayPlane::shadow_registers() const
  14. {
  15. SpinlockLocker locker(m_access_lock);
  16. return m_shadow_registers;
  17. }
  18. ErrorOr<void> IntelDisplayPlane::set_horizontal_active_pixels_count(Badge<IntelDisplayConnectorGroup>, size_t horizontal_active_pixels_count)
  19. {
  20. SpinlockLocker locker(m_access_lock);
  21. m_horizontal_active_pixels_count = horizontal_active_pixels_count;
  22. return {};
  23. }
  24. ErrorOr<void> IntelDisplayPlane::set_vertical_active_pixels_count(Badge<IntelDisplayConnectorGroup>, size_t vertical_active_pixels_count)
  25. {
  26. SpinlockLocker locker(m_access_lock);
  27. m_vertical_active_pixels_count = vertical_active_pixels_count;
  28. return {};
  29. }
  30. ErrorOr<void> IntelDisplayPlane::set_horizontal_stride(Badge<IntelDisplayConnectorGroup>, size_t horizontal_stride)
  31. {
  32. SpinlockLocker locker(m_access_lock);
  33. m_horizontal_stride = horizontal_stride;
  34. return {};
  35. }
  36. ErrorOr<void> IntelDisplayPlane::set_aperture_base(Badge<IntelDisplayConnectorGroup>, PhysicalAddress aperture_start)
  37. {
  38. SpinlockLocker locker(m_access_lock);
  39. m_aperture_start.set(aperture_start.get());
  40. return {};
  41. }
  42. ErrorOr<void> IntelDisplayPlane::set_pipe(Badge<IntelDisplayConnectorGroup>, PipeSelect pipe_select)
  43. {
  44. SpinlockLocker locker(m_access_lock);
  45. m_pipe_select = pipe_select;
  46. return {};
  47. }
  48. bool IntelDisplayPlane::is_enabled(Badge<IntelDisplayConnectorGroup>)
  49. {
  50. SpinlockLocker locker(m_access_lock);
  51. return m_shadow_registers.control & (1 << 31);
  52. }
  53. ErrorOr<void> IntelDisplayPlane::disable(Badge<IntelDisplayConnectorGroup>)
  54. {
  55. SpinlockLocker locker(m_access_lock);
  56. // Note: We use the shadow register so we don't have the already set
  57. // settings being lost.
  58. m_shadow_registers.control &= ~(1 << 31);
  59. m_plane_registers->control = m_shadow_registers.control;
  60. return {};
  61. }
  62. }