Skip to content

Commit 016fedb

Browse files
supercomputer7ADKaster
authored andcommitted
Kernel/IntelGraphics: Move DisplayPlane enable code to derived classes
Instead of doing that on the IntelDisplayPlane class, let's have this in derived classes so these classes can decide how to use the settings that were provided before calling the enable method.
1 parent e393071 commit 016fedb

File tree

5 files changed

+60
-18
lines changed

5 files changed

+60
-18
lines changed

Kernel/Graphics/Intel/DisplayConnectorGroup.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,14 @@ bool IntelDisplayConnectorGroup::set_crt_resolution(DisplayConnector::ModeSettin
342342

343343
VERIFY(!m_transcoders[0]->pipe_enabled({}));
344344
MUST(m_transcoders[0]->enable_pipe({}));
345-
MUST(m_planes[0]->set_plane_settings({}, m_mmio_second_region.pci_bar_paddr, IntelDisplayPlane::PipeSelect::PipeA, mode_setting.horizontal_active));
345+
346+
MUST(m_planes[0]->set_aperture_base({}, m_mmio_second_region.pci_bar_paddr));
347+
MUST(m_planes[0]->set_pipe({}, IntelDisplayPlane::PipeSelect::PipeA));
348+
MUST(m_planes[0]->set_horizontal_stride({}, mode_setting.horizontal_active * 4));
349+
MUST(m_planes[0]->set_horizontal_active_pixels_count({}, mode_setting.horizontal_active));
350+
// Note: This doesn't affect anything on the plane settings for Gen4, but we still
351+
// do it for the sake of "completeness".
352+
MUST(m_planes[0]->set_vertical_active_pixels_count({}, mode_setting.vertical_active));
346353
MUST(m_planes[0]->enable({}));
347354
enable_dac_output();
348355

Kernel/Graphics/Intel/Plane/DisplayPlane.cpp

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,34 @@ IntelDisplayPlane::ShadowRegisters IntelDisplayPlane::shadow_registers() const
2020
return m_shadow_registers;
2121
}
2222

23-
ErrorOr<void> IntelDisplayPlane::enable(Badge<IntelDisplayConnectorGroup>)
23+
ErrorOr<void> IntelDisplayPlane::set_horizontal_active_pixels_count(Badge<IntelDisplayConnectorGroup>, size_t horizontal_active_pixels_count)
2424
{
2525
SpinlockLocker locker(m_access_lock);
26-
// Note: We use the shadow register so we don't have the already set
27-
// settings being lost.
28-
m_plane_registers->control = m_shadow_registers.control | (1 << 31);
29-
m_shadow_registers.control |= (1 << 31);
26+
m_horizontal_active_pixels_count = horizontal_active_pixels_count;
27+
return {};
28+
}
29+
ErrorOr<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+
}
35+
ErrorOr<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+
}
41+
ErrorOr<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+
}
47+
ErrorOr<void> IntelDisplayPlane::set_pipe(Badge<IntelDisplayConnectorGroup>, PipeSelect pipe_select)
48+
{
49+
SpinlockLocker locker(m_access_lock);
50+
m_pipe_select = pipe_select;
3051
return {};
3152
}
3253

Kernel/Graphics/Intel/Plane/DisplayPlane.h

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,13 @@ class IntelDisplayPlane {
3838
public:
3939
static ErrorOr<NonnullOwnPtr<IntelDisplayPlane>> create_with_physical_address(PhysicalAddress plane_registers_start_address);
4040

41-
virtual ErrorOr<void> set_plane_settings(Badge<IntelDisplayConnectorGroup>, PhysicalAddress aperture_start, PipeSelect, size_t horizontal_active_pixels_count) = 0;
42-
ErrorOr<void> enable(Badge<IntelDisplayConnectorGroup>);
41+
ErrorOr<void> set_horizontal_active_pixels_count(Badge<IntelDisplayConnectorGroup>, size_t horizontal_active_pixels_count);
42+
ErrorOr<void> set_vertical_active_pixels_count(Badge<IntelDisplayConnectorGroup>, size_t vertical_active_pixels_count);
43+
ErrorOr<void> set_horizontal_stride(Badge<IntelDisplayConnectorGroup>, size_t horizontal_stride);
44+
ErrorOr<void> set_aperture_base(Badge<IntelDisplayConnectorGroup>, PhysicalAddress aperture_start);
45+
ErrorOr<void> set_pipe(Badge<IntelDisplayConnectorGroup>, PipeSelect);
46+
47+
virtual ErrorOr<void> enable(Badge<IntelDisplayConnectorGroup>) = 0;
4348
bool is_enabled(Badge<IntelDisplayConnectorGroup>);
4449
ErrorOr<void> disable(Badge<IntelDisplayConnectorGroup>);
4550

@@ -60,5 +65,13 @@ class IntelDisplayPlane {
6065
mutable Spinlock<LockRank::None> m_access_lock;
6166
ShadowRegisters m_shadow_registers {};
6267
Memory::TypedMapping<PlaneRegisters volatile> m_plane_registers;
68+
69+
// Note: The PipeSelect value is used only in planes until Skylake graphics.
70+
PipeSelect m_pipe_select { PipeSelect::PipeA };
71+
72+
PhysicalAddress m_aperture_start;
73+
size_t m_horizontal_stride { 0 };
74+
size_t m_horizontal_active_pixels_count { 0 };
75+
size_t m_vertical_active_pixels_count { 0 };
6376
};
6477
}

Kernel/Graphics/Intel/Plane/G33DisplayPlane.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,15 @@ IntelG33DisplayPlane::IntelG33DisplayPlane(Memory::TypedMapping<PlaneRegisters v
2020
{
2121
}
2222

23-
ErrorOr<void> IntelG33DisplayPlane::set_plane_settings(Badge<IntelDisplayConnectorGroup>, PhysicalAddress aperture_start, PipeSelect pipe_select, size_t horizontal_active_pixels_count)
23+
ErrorOr<void> IntelG33DisplayPlane::enable(Badge<IntelDisplayConnectorGroup>)
2424
{
2525
SpinlockLocker locker(m_access_lock);
26-
VERIFY(((horizontal_active_pixels_count * 4) % 64 == 0));
27-
VERIFY(aperture_start < PhysicalAddress(0x1'0000'0000));
26+
VERIFY(((m_horizontal_active_pixels_count * 4) % 64 == 0));
27+
VERIFY(((m_horizontal_stride) % 64 == 0));
2828

2929
u32 control_value = 0;
3030

31-
switch (pipe_select) {
31+
switch (m_pipe_select) {
3232
case PipeSelect::PipeA:
3333
control_value |= (0b00 << 24);
3434
break;
@@ -44,14 +44,15 @@ ErrorOr<void> IntelG33DisplayPlane::set_plane_settings(Badge<IntelDisplayConnect
4444
}
4545

4646
// Note: Set the plane to work with 32 bit BGRX (Ignore Alpha channel).
47-
control_value |= (0b0110 << 26);
47+
// Note: Bit 31 is set to turn on the plane.
48+
control_value |= (0b0110 << 26) | (1 << 31);
4849

49-
m_plane_registers->stride = horizontal_active_pixels_count * 4;
50-
m_shadow_registers.stride = horizontal_active_pixels_count * 4;
50+
m_plane_registers->stride = m_horizontal_stride;
51+
m_shadow_registers.stride = m_horizontal_stride;
5152
m_plane_registers->linear_offset = 0;
5253
m_shadow_registers.linear_offset = 0;
53-
m_plane_registers->surface_base = aperture_start.get();
54-
m_shadow_registers.surface_base = aperture_start.get();
54+
m_plane_registers->surface_base = m_aperture_start.get();
55+
m_shadow_registers.surface_base = m_aperture_start.get();
5556
m_plane_registers->control = control_value;
5657
m_shadow_registers.control = control_value;
5758
return {};

Kernel/Graphics/Intel/Plane/G33DisplayPlane.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class IntelG33DisplayPlane final : public IntelDisplayPlane {
1818
public:
1919
static ErrorOr<NonnullOwnPtr<IntelG33DisplayPlane>> create_with_physical_address(PhysicalAddress plane_registers_start_address);
2020

21-
virtual ErrorOr<void> set_plane_settings(Badge<IntelDisplayConnectorGroup>, PhysicalAddress aperture_start, PipeSelect, size_t horizontal_active_pixels_count) override;
21+
virtual ErrorOr<void> enable(Badge<IntelDisplayConnectorGroup>) override;
2222

2323
private:
2424
explicit IntelG33DisplayPlane(Memory::TypedMapping<volatile IntelDisplayPlane::PlaneRegisters> plane_registers_mapping);

0 commit comments

Comments
 (0)