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