mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 15:07:45 +00:00
Userland: Remove stale remainders of old framebuffer devices
This commit is contained in:
parent
b7d0b5d745
commit
b5e5b299c4
7 changed files with 29 additions and 36 deletions
|
@ -153,7 +153,7 @@ void MonitorSettingsWidget::load_current_settings()
|
||||||
for (size_t i = 0; i < m_screen_layout.screens.size(); i++) {
|
for (size_t i = 0; i < m_screen_layout.screens.size(); i++) {
|
||||||
String screen_display_name;
|
String screen_display_name;
|
||||||
if (m_screen_layout.screens[i].mode == WindowServer::ScreenLayout::Screen::Mode::Device) {
|
if (m_screen_layout.screens[i].mode == WindowServer::ScreenLayout::Screen::Mode::Device) {
|
||||||
if (auto edid = EDID::Parser::from_framebuffer_device(m_screen_layout.screens[i].device.value(), 0); !edid.is_error()) { // TODO: multihead
|
if (auto edid = EDID::Parser::from_display_connector_device(m_screen_layout.screens[i].device.value(), 0); !edid.is_error()) { // TODO: multihead
|
||||||
screen_display_name = display_name_from_edid(edid.value());
|
screen_display_name = display_name_from_edid(edid.value());
|
||||||
m_screen_edids.append(edid.release_value());
|
m_screen_edids.append(edid.release_value());
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -201,20 +201,20 @@ ErrorOr<Parser> Parser::from_bytes(ByteBuffer&& bytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef KERNEL
|
#ifndef KERNEL
|
||||||
ErrorOr<Parser> Parser::from_framebuffer_device(int framebuffer_fd, size_t head)
|
ErrorOr<Parser> Parser::from_display_connector_device(int display_connector_fd, size_t head)
|
||||||
{
|
{
|
||||||
RawBytes edid_bytes;
|
RawBytes edid_bytes;
|
||||||
GraphicsHeadEDID edid_info {};
|
GraphicsHeadEDID edid_info {};
|
||||||
edid_info.head_index = head;
|
edid_info.head_index = head;
|
||||||
edid_info.bytes = &edid_bytes[0];
|
edid_info.bytes = &edid_bytes[0];
|
||||||
edid_info.bytes_size = sizeof(edid_bytes);
|
edid_info.bytes_size = sizeof(edid_bytes);
|
||||||
if (graphics_connector_get_head_edid(framebuffer_fd, &edid_info) < 0) {
|
if (graphics_connector_get_head_edid(display_connector_fd, &edid_info) < 0) {
|
||||||
int err = errno;
|
int err = errno;
|
||||||
if (err == EOVERFLOW) {
|
if (err == EOVERFLOW) {
|
||||||
// We need a bigger buffer with at least bytes_size bytes
|
// We need a bigger buffer with at least bytes_size bytes
|
||||||
auto edid_byte_buffer = TRY(ByteBuffer::create_zeroed(edid_info.bytes_size));
|
auto edid_byte_buffer = TRY(ByteBuffer::create_zeroed(edid_info.bytes_size));
|
||||||
edid_info.bytes = edid_byte_buffer.data();
|
edid_info.bytes = edid_byte_buffer.data();
|
||||||
if (graphics_connector_get_head_edid(framebuffer_fd, &edid_info) < 0) {
|
if (graphics_connector_get_head_edid(display_connector_fd, &edid_info) < 0) {
|
||||||
err = errno;
|
err = errno;
|
||||||
return Error::from_errno(err);
|
return Error::from_errno(err);
|
||||||
}
|
}
|
||||||
|
@ -229,17 +229,17 @@ ErrorOr<Parser> Parser::from_framebuffer_device(int framebuffer_fd, size_t head)
|
||||||
return from_bytes(move(edid_byte_buffer));
|
return from_bytes(move(edid_byte_buffer));
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<Parser> Parser::from_framebuffer_device(String const& framebuffer_device, size_t head)
|
ErrorOr<Parser> Parser::from_display_connector_device(String const& display_connector_device, size_t head)
|
||||||
{
|
{
|
||||||
int framebuffer_fd = open(framebuffer_device.characters(), O_RDWR | O_CLOEXEC);
|
int display_connector_fd = open(display_connector_device.characters(), O_RDWR | O_CLOEXEC);
|
||||||
if (framebuffer_fd < 0) {
|
if (display_connector_fd < 0) {
|
||||||
int err = errno;
|
int err = errno;
|
||||||
return Error::from_errno(err);
|
return Error::from_errno(err);
|
||||||
}
|
}
|
||||||
ScopeGuard fd_guard([&] {
|
ScopeGuard fd_guard([&] {
|
||||||
close(framebuffer_fd);
|
close(display_connector_fd);
|
||||||
});
|
});
|
||||||
return from_framebuffer_device(framebuffer_fd, head);
|
return from_display_connector_device(display_connector_fd, head);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -85,8 +85,8 @@ public:
|
||||||
static ErrorOr<Parser> from_bytes(ByteBuffer&&);
|
static ErrorOr<Parser> from_bytes(ByteBuffer&&);
|
||||||
|
|
||||||
#ifndef KERNEL
|
#ifndef KERNEL
|
||||||
static ErrorOr<Parser> from_framebuffer_device(int, size_t);
|
static ErrorOr<Parser> from_display_connector_device(int, size_t);
|
||||||
static ErrorOr<Parser> from_framebuffer_device(String const&, size_t);
|
static ErrorOr<Parser> from_display_connector_device(String const&, size_t);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
StringView legacy_manufacturer_id() const;
|
StringView legacy_manufacturer_id() const;
|
||||||
|
|
|
@ -208,13 +208,6 @@ static void populate_devtmpfs_devices_based_on_devctl()
|
||||||
create_devtmpfs_char_device(String::formatted("/dev/gpu/connector{}", minor_number), 0666, 226, minor_number);
|
create_devtmpfs_char_device(String::formatted("/dev/gpu/connector{}", minor_number), 0666, 226, minor_number);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 29: {
|
|
||||||
if (is_block_device) {
|
|
||||||
create_devtmpfs_block_device(String::formatted("/dev/fb{}", minor_number), 0666, 29, minor_number);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 229: {
|
case 229: {
|
||||||
if (!is_block_device) {
|
if (!is_block_device) {
|
||||||
create_devtmpfs_char_device(String::formatted("/dev/hvc0p{}", minor_number), 0666, major_number, minor_number);
|
create_devtmpfs_char_device(String::formatted("/dev/hvc0p{}", minor_number), 0666, major_number, minor_number);
|
||||||
|
@ -401,7 +394,7 @@ static ErrorOr<void> prepare_synthetic_filesystems()
|
||||||
|
|
||||||
auto phys_group = TRY(Core::System::getgrnam("phys"sv));
|
auto phys_group = TRY(Core::System::getgrnam("phys"sv));
|
||||||
VERIFY(phys_group.has_value());
|
VERIFY(phys_group.has_value());
|
||||||
// FIXME: Try to find a way to not hardcode the major number of framebuffer device nodes.
|
// FIXME: Try to find a way to not hardcode the major number of display connector device nodes.
|
||||||
TRY(chown_all_matching_device_nodes(phys_group.value(), 29));
|
TRY(chown_all_matching_device_nodes(phys_group.value(), 29));
|
||||||
|
|
||||||
auto const filter_chown_ENOENT = [](ErrorOr<void> result) -> ErrorOr<void> {
|
auto const filter_chown_ENOENT = [](ErrorOr<void> result) -> ErrorOr<void> {
|
||||||
|
|
|
@ -24,10 +24,10 @@ HardwareScreenBackend::HardwareScreenBackend(String device)
|
||||||
|
|
||||||
ErrorOr<void> HardwareScreenBackend::open()
|
ErrorOr<void> HardwareScreenBackend::open()
|
||||||
{
|
{
|
||||||
m_framebuffer_fd = TRY(Core::System::open(m_device, O_RDWR | O_CLOEXEC));
|
m_display_connector_fd = TRY(Core::System::open(m_device, O_RDWR | O_CLOEXEC));
|
||||||
|
|
||||||
GraphicsConnectorProperties properties;
|
GraphicsConnectorProperties properties;
|
||||||
if (graphics_connector_get_properties(m_framebuffer_fd, &properties) < 0)
|
if (graphics_connector_get_properties(m_display_connector_fd, &properties) < 0)
|
||||||
return Error::from_syscall(String::formatted("failed to ioctl {}", m_device), errno);
|
return Error::from_syscall(String::formatted("failed to ioctl {}", m_device), errno);
|
||||||
|
|
||||||
m_can_device_flush_buffers = (properties.partial_flushing_support != 0);
|
m_can_device_flush_buffers = (properties.partial_flushing_support != 0);
|
||||||
|
@ -38,9 +38,9 @@ ErrorOr<void> HardwareScreenBackend::open()
|
||||||
|
|
||||||
HardwareScreenBackend::~HardwareScreenBackend()
|
HardwareScreenBackend::~HardwareScreenBackend()
|
||||||
{
|
{
|
||||||
if (m_framebuffer_fd >= 0) {
|
if (m_display_connector_fd >= 0) {
|
||||||
close(m_framebuffer_fd);
|
close(m_display_connector_fd);
|
||||||
m_framebuffer_fd = -1;
|
m_display_connector_fd = -1;
|
||||||
}
|
}
|
||||||
if (m_framebuffer) {
|
if (m_framebuffer) {
|
||||||
MUST(Core::System::munmap(m_framebuffer, m_size_in_bytes));
|
MUST(Core::System::munmap(m_framebuffer, m_size_in_bytes));
|
||||||
|
@ -54,10 +54,10 @@ ErrorOr<void> HardwareScreenBackend::set_head_mode_setting(GraphicsHeadModeSetti
|
||||||
{
|
{
|
||||||
|
|
||||||
GraphicsHeadModeSetting requested_mode_setting = mode_setting;
|
GraphicsHeadModeSetting requested_mode_setting = mode_setting;
|
||||||
auto rc = graphics_connector_set_head_mode_setting(m_framebuffer_fd, &requested_mode_setting);
|
auto rc = graphics_connector_set_head_mode_setting(m_display_connector_fd, &requested_mode_setting);
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
dbgln("Failed to set backend mode setting: falling back to safe resolution");
|
dbgln("Failed to set backend mode setting: falling back to safe resolution");
|
||||||
rc = graphics_connector_set_safe_head_mode_setting(m_framebuffer_fd);
|
rc = graphics_connector_set_safe_head_mode_setting(m_display_connector_fd);
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
dbgln("Failed to set backend safe mode setting: aborting");
|
dbgln("Failed to set backend safe mode setting: aborting");
|
||||||
return Error::from_syscall("graphics_connector_set_safe_head_mode_setting"sv, rc);
|
return Error::from_syscall("graphics_connector_set_safe_head_mode_setting"sv, rc);
|
||||||
|
@ -81,12 +81,12 @@ ErrorOr<void> HardwareScreenBackend::map_framebuffer()
|
||||||
{
|
{
|
||||||
GraphicsHeadModeSetting mode_setting {};
|
GraphicsHeadModeSetting mode_setting {};
|
||||||
memset(&mode_setting, 0, sizeof(GraphicsHeadModeSetting));
|
memset(&mode_setting, 0, sizeof(GraphicsHeadModeSetting));
|
||||||
int rc = graphics_connector_get_head_mode_setting(m_framebuffer_fd, &mode_setting);
|
int rc = graphics_connector_get_head_mode_setting(m_display_connector_fd, &mode_setting);
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
return Error::from_syscall("graphics_connector_get_head_mode_setting"sv, rc);
|
return Error::from_syscall("graphics_connector_get_head_mode_setting"sv, rc);
|
||||||
}
|
}
|
||||||
m_size_in_bytes = mode_setting.horizontal_stride * mode_setting.vertical_active * 2;
|
m_size_in_bytes = mode_setting.horizontal_stride * mode_setting.vertical_active * 2;
|
||||||
m_framebuffer = (Gfx::ARGB32*)TRY(Core::System::mmap(nullptr, m_size_in_bytes, PROT_READ | PROT_WRITE, MAP_SHARED, m_framebuffer_fd, 0));
|
m_framebuffer = (Gfx::ARGB32*)TRY(Core::System::mmap(nullptr, m_size_in_bytes, PROT_READ | PROT_WRITE, MAP_SHARED, m_display_connector_fd, 0));
|
||||||
|
|
||||||
if (m_can_set_head_buffer) {
|
if (m_can_set_head_buffer) {
|
||||||
// Note: fall back to assuming the second buffer starts right after the last line of the first
|
// Note: fall back to assuming the second buffer starts right after the last line of the first
|
||||||
|
@ -106,7 +106,7 @@ ErrorOr<GraphicsHeadModeSetting> HardwareScreenBackend::get_head_mode_setting()
|
||||||
{
|
{
|
||||||
GraphicsHeadModeSetting mode_setting {};
|
GraphicsHeadModeSetting mode_setting {};
|
||||||
memset(&mode_setting, 0, sizeof(GraphicsHeadModeSetting));
|
memset(&mode_setting, 0, sizeof(GraphicsHeadModeSetting));
|
||||||
int rc = graphics_connector_get_head_mode_setting(m_framebuffer_fd, &mode_setting);
|
int rc = graphics_connector_get_head_mode_setting(m_display_connector_fd, &mode_setting);
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
return Error::from_syscall("graphics_connector_get_head_mode_setting"sv, rc);
|
return Error::from_syscall("graphics_connector_get_head_mode_setting"sv, rc);
|
||||||
}
|
}
|
||||||
|
@ -121,13 +121,13 @@ void HardwareScreenBackend::set_head_buffer(int head_index)
|
||||||
GraphicsHeadVerticalOffset offset { 0, 0 };
|
GraphicsHeadVerticalOffset offset { 0, 0 };
|
||||||
if (head_index == 1)
|
if (head_index == 1)
|
||||||
offset.offsetted = 1;
|
offset.offsetted = 1;
|
||||||
int rc = fb_set_head_vertical_offset_buffer(m_framebuffer_fd, &offset);
|
int rc = fb_set_head_vertical_offset_buffer(m_display_connector_fd, &offset);
|
||||||
VERIFY(rc == 0);
|
VERIFY(rc == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<void> HardwareScreenBackend::flush_framebuffer_rects(int buffer_index, Span<FBRect const> flush_rects)
|
ErrorOr<void> HardwareScreenBackend::flush_framebuffer_rects(int buffer_index, Span<FBRect const> flush_rects)
|
||||||
{
|
{
|
||||||
int rc = fb_flush_buffers(m_framebuffer_fd, buffer_index, flush_rects.data(), (unsigned)flush_rects.size());
|
int rc = fb_flush_buffers(m_display_connector_fd, buffer_index, flush_rects.data(), (unsigned)flush_rects.size());
|
||||||
if (rc == -ENOTSUP)
|
if (rc == -ENOTSUP)
|
||||||
m_can_device_flush_buffers = false;
|
m_can_device_flush_buffers = false;
|
||||||
else if (rc != 0)
|
else if (rc != 0)
|
||||||
|
@ -137,7 +137,7 @@ ErrorOr<void> HardwareScreenBackend::flush_framebuffer_rects(int buffer_index, S
|
||||||
|
|
||||||
ErrorOr<void> HardwareScreenBackend::flush_framebuffer()
|
ErrorOr<void> HardwareScreenBackend::flush_framebuffer()
|
||||||
{
|
{
|
||||||
int rc = fb_flush_head(m_framebuffer_fd);
|
int rc = fb_flush_head(m_display_connector_fd);
|
||||||
if (rc == -ENOTSUP)
|
if (rc == -ENOTSUP)
|
||||||
m_can_device_flush_entire_framebuffer = false;
|
m_can_device_flush_entire_framebuffer = false;
|
||||||
else if (rc != 0)
|
else if (rc != 0)
|
||||||
|
|
|
@ -35,7 +35,7 @@ public:
|
||||||
virtual ErrorOr<GraphicsHeadModeSetting> get_head_mode_setting() override;
|
virtual ErrorOr<GraphicsHeadModeSetting> get_head_mode_setting() override;
|
||||||
|
|
||||||
String m_device {};
|
String m_device {};
|
||||||
int m_framebuffer_fd { -1 };
|
int m_display_connector_fd { -1 };
|
||||||
|
|
||||||
Gfx::ARGB32* scanline(int buffer_index, int y) const
|
Gfx::ARGB32* scanline(int buffer_index, int y) const
|
||||||
{
|
{
|
||||||
|
|
|
@ -69,7 +69,7 @@ ErrorOr<int> serenity_main(Main::Arguments)
|
||||||
String error_msg;
|
String error_msg;
|
||||||
|
|
||||||
auto add_unconfigured_display_connector_devices = [&]() {
|
auto add_unconfigured_display_connector_devices = [&]() {
|
||||||
// Enumerate the /dev/fbX devices and try to set up any ones we find that we haven't already used
|
// Enumerate the /dev/gpu/connectorX devices and try to set up any ones we find that we haven't already used
|
||||||
Core::DirIterator di("/dev/gpu", Core::DirIterator::SkipParentAndBaseDir);
|
Core::DirIterator di("/dev/gpu", Core::DirIterator::SkipParentAndBaseDir);
|
||||||
while (di.has_next()) {
|
while (di.has_next()) {
|
||||||
auto path = di.next_path();
|
auto path = di.next_path();
|
||||||
|
@ -81,7 +81,7 @@ ErrorOr<int> serenity_main(Main::Arguments)
|
||||||
if (fb_devices_configured.find(full_path) != fb_devices_configured.end())
|
if (fb_devices_configured.find(full_path) != fb_devices_configured.end())
|
||||||
continue;
|
continue;
|
||||||
if (!screen_layout.try_auto_add_display_connector(full_path))
|
if (!screen_layout.try_auto_add_display_connector(full_path))
|
||||||
dbgln("Could not auto-add framebuffer device {} to screen layout", full_path);
|
dbgln("Could not auto-add display connector device {} to screen layout", full_path);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -130,7 +130,7 @@ ErrorOr<int> serenity_main(Main::Arguments)
|
||||||
|
|
||||||
TRY(Core::System::unveil("/tmp", ""));
|
TRY(Core::System::unveil("/tmp", ""));
|
||||||
|
|
||||||
// NOTE: Because we dynamically need to be able to open new /dev/fb*
|
// NOTE: Because we dynamically need to be able to open new /dev/gpu/connector*
|
||||||
// devices we can't really unveil all of /dev unless we have some
|
// devices we can't really unveil all of /dev unless we have some
|
||||||
// other mechanism that can hand us file descriptors for these.
|
// other mechanism that can hand us file descriptors for these.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue