G33DisplayPlane.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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/G33DisplayPlane.h>
  7. #include <Kernel/Memory/PhysicalAddress.h>
  8. namespace Kernel {
  9. ErrorOr<NonnullOwnPtr<IntelG33DisplayPlane>> IntelG33DisplayPlane::create_with_physical_address(PhysicalAddress plane_registers_start_address)
  10. {
  11. auto registers_mapping = TRY(Memory::map_typed<PlaneRegisters volatile>(plane_registers_start_address, sizeof(PlaneRegisters), Memory::Region::Access::ReadWrite));
  12. return adopt_nonnull_own_or_enomem(new (nothrow) IntelG33DisplayPlane(move(registers_mapping)));
  13. }
  14. IntelG33DisplayPlane::IntelG33DisplayPlane(Memory::TypedMapping<PlaneRegisters volatile> registers_mapping)
  15. : IntelDisplayPlane(move(registers_mapping))
  16. {
  17. }
  18. ErrorOr<void> IntelG33DisplayPlane::enable(Badge<IntelDisplayConnectorGroup>)
  19. {
  20. SpinlockLocker locker(m_access_lock);
  21. VERIFY(((m_horizontal_active_pixels_count * 4) % 64 == 0));
  22. VERIFY(((m_horizontal_stride) % 64 == 0));
  23. u32 control_value = 0;
  24. switch (m_pipe_select) {
  25. case PipeSelect::PipeA:
  26. control_value |= (0b00 << 24);
  27. break;
  28. case PipeSelect::PipeB:
  29. control_value |= (0b01 << 24);
  30. break;
  31. case PipeSelect::PipeC:
  32. control_value |= (0b10 << 24);
  33. break;
  34. case PipeSelect::PipeD:
  35. control_value |= (0b11 << 24);
  36. break;
  37. }
  38. // Note: Set the plane to work with 32 bit BGRX (Ignore Alpha channel).
  39. // Note: Bit 31 is set to turn on the plane.
  40. control_value |= (0b0110 << 26) | (1 << 31);
  41. m_plane_registers->stride = m_horizontal_stride;
  42. m_shadow_registers.stride = m_horizontal_stride;
  43. m_plane_registers->linear_offset = 0;
  44. m_shadow_registers.linear_offset = 0;
  45. m_plane_registers->surface_base = m_aperture_start.get();
  46. m_shadow_registers.surface_base = m_aperture_start.get();
  47. m_plane_registers->control = control_value;
  48. m_shadow_registers.control = control_value;
  49. return {};
  50. }
  51. }