From 95e332b26500e9c51655fcbe16b657d36af7d4a0 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Wed, 12 Jun 2019 14:22:22 +0200 Subject: [PATCH] Add patches from upstream for: Fix failing to pick the native monitor mode starting with kernel 5.2 Fix firmware bootsplash support for devices which use the new (in ACPI 6.2) rotation bits in the BGRT header Add support for firmware-upgrade mode --- plymouth-more-updates.patch | 615 ++++++++++++++++++++++++++++++++++++ plymouth.spec | 10 +- 2 files changed, 624 insertions(+), 1 deletion(-) create mode 100644 plymouth-more-updates.patch diff --git a/plymouth-more-updates.patch b/plymouth-more-updates.patch new file mode 100644 index 0000000..39498c5 --- /dev/null +++ b/plymouth-more-updates.patch @@ -0,0 +1,615 @@ +From 475ff0fcba57f19b5713500ced58bbeef11bb4c2 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Sun, 26 May 2019 17:54:05 +0200 +Subject: [PATCH 1/5] drm: Fix tiled mode detection + +The TILE property is present on all connectors which are DisplayPort +MST (Multi-Stream) outputs, independent if they are connected to a tiled +display are not. + +Starting with the 5.2 kernel, it is actually present on almost all outputs. + +Rather then just checking if the property is present, check that if it +is present it has a valid (non zero) blob-id assigned to it, this fixes +us mis-identifying DP MST outputs as always being tiled. + +Which in turn fixes us failing to pick the preferred mode on these outputs. + +Signed-off-by: Hans de Goede +--- + src/plugins/renderers/drm/plugin.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/plugins/renderers/drm/plugin.c b/src/plugins/renderers/drm/plugin.c +index 88c9d97..7ddd9c5 100644 +--- a/src/plugins/renderers/drm/plugin.c ++++ b/src/plugins/renderers/drm/plugin.c +@@ -459,7 +459,8 @@ ply_renderer_connector_get_rotation_and_tiled (ply_renderer_backend_t *back + output->rotation = connector_orientation_prop_to_rotation (prop, connector->prop_values[i]); + + if ((prop->flags & DRM_MODE_PROP_BLOB) && +- strcmp (prop->name, "TILE") == 0) ++ strcmp (prop->name, "TILE") == 0 && ++ connector->prop_values[i] != 0) + output->tiled = true; + + if ((prop->flags & DRM_MODE_PROP_ENUM) && +-- +2.21.0 + +From cd4a6010942c6765f5659a2eb88686121db4ccd8 Mon Sep 17 00:00:00 2001 +From: Richard Hughes +Date: Mon, 25 Mar 2019 09:39:24 +0000 +Subject: [PATCH 2/5] Add a new firmware-upgrade mode for use by fwupd + +This allows us to have accurate localised text, and also to use the vendor BIOS +logo when applying firmware updates. +--- + src/client/plymouth.c | 6 ++++++ + src/libply-splash-core/ply-boot-splash-plugin.h | 3 ++- + src/main.c | 7 +++++++ + src/plugins/splash/script/script-lib-plymouth.c | 3 +++ + src/plugins/splash/throbgress/plugin.c | 6 ++++-- + src/plugins/splash/two-step/plugin.c | 8 ++++++-- + themes/bgrt/bgrt.plymouth.in | 8 ++++++++ + themes/spinner/spinner.plymouth.in | 8 ++++++++ + 8 files changed, 44 insertions(+), 5 deletions(-) + +diff --git a/src/client/plymouth.c b/src/client/plymouth.c +index a11753a..be74ae7 100644 +--- a/src/client/plymouth.c ++++ b/src/client/plymouth.c +@@ -787,6 +787,7 @@ on_change_mode_request (state_t *state, + bool reboot = false; + bool updates = false; + bool system_upgrade = false; ++ bool firmware_upgrade = false; + const char *mode = NULL; + + ply_command_parser_get_command_options (state->command_parser, +@@ -796,6 +797,7 @@ on_change_mode_request (state_t *state, + "reboot", &reboot, + "updates", &updates, + "system-upgrade", &system_upgrade, ++ "firmware-upgrade", &firmware_upgrade, + NULL); + + if (boot_up) +@@ -808,6 +810,8 @@ on_change_mode_request (state_t *state, + mode = "updates"; + else if (system_upgrade) + mode = "system-upgrade"; ++ else if (firmware_upgrade) ++ mode = "firmware-upgrade"; + + if (mode) { + ply_boot_client_change_mode (state->client, mode, +@@ -901,6 +905,8 @@ main (int argc, + PLY_COMMAND_OPTION_TYPE_FLAG, + "system-upgrade", "Upgrading the OS to a new version", + PLY_COMMAND_OPTION_TYPE_FLAG, ++ "firmware-upgrade", "Upgrading firmware to a new version", ++ PLY_COMMAND_OPTION_TYPE_FLAG, + NULL); + + ply_command_parser_add_command (state.command_parser, +diff --git a/src/libply-splash-core/ply-boot-splash-plugin.h b/src/libply-splash-core/ply-boot-splash-plugin.h +index 3fa56ce..227147f 100644 +--- a/src/libply-splash-core/ply-boot-splash-plugin.h ++++ b/src/libply-splash-core/ply-boot-splash-plugin.h +@@ -41,8 +41,9 @@ typedef enum + PLY_BOOT_SPLASH_MODE_REBOOT, + PLY_BOOT_SPLASH_MODE_UPDATES, + PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE, ++ PLY_BOOT_SPLASH_MODE_FIRMWARE_UPGRADE, + PLY_BOOT_SPLASH_MODE_INVALID, +- PLY_BOOT_SPLASH_MODE_COUNT = PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE + 1, ++ PLY_BOOT_SPLASH_MODE_COUNT = PLY_BOOT_SPLASH_MODE_FIRMWARE_UPGRADE + 1, + } ply_boot_splash_mode_t; + + typedef struct _ply_boot_splash_plugin ply_boot_splash_plugin_t; +diff --git a/src/main.c b/src/main.c +index a6f0b01..2f04e11 100644 +--- a/src/main.c ++++ b/src/main.c +@@ -206,6 +206,8 @@ on_change_mode (state_t *state, + state->mode = PLY_BOOT_SPLASH_MODE_UPDATES; + else if (strcmp (mode, "system-upgrade") == 0) + state->mode = PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE; ++ else if (strcmp (mode, "firmware-upgrade") == 0) ++ state->mode = PLY_BOOT_SPLASH_MODE_FIRMWARE_UPGRADE; + else + return; + +@@ -675,6 +677,7 @@ get_cache_file_for_mode (ply_boot_splash_mode_t mode) + break; + case PLY_BOOT_SPLASH_MODE_UPDATES: + case PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE: ++ case PLY_BOOT_SPLASH_MODE_FIRMWARE_UPGRADE: + filename = NULL; + break; + case PLY_BOOT_SPLASH_MODE_INVALID: +@@ -704,6 +707,7 @@ get_log_file_for_state (state_t *state) + case PLY_BOOT_SPLASH_MODE_REBOOT: + case PLY_BOOT_SPLASH_MODE_UPDATES: + case PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE: ++ case PLY_BOOT_SPLASH_MODE_FIRMWARE_UPGRADE: + filename = _PATH_DEVNULL; + break; + case PLY_BOOT_SPLASH_MODE_INVALID: +@@ -730,6 +734,7 @@ get_log_spool_file_for_mode (ply_boot_splash_mode_t mode) + case PLY_BOOT_SPLASH_MODE_REBOOT: + case PLY_BOOT_SPLASH_MODE_UPDATES: + case PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE: ++ case PLY_BOOT_SPLASH_MODE_FIRMWARE_UPGRADE: + filename = NULL; + break; + case PLY_BOOT_SPLASH_MODE_INVALID: +@@ -2149,6 +2154,8 @@ main (int argc, + state.mode = PLY_BOOT_SPLASH_MODE_UPDATES; + else if (strcmp (mode_string, "system-upgrade") == 0) + state.mode = PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE; ++ else if (strcmp (mode_string, "firmware-upgrade") == 0) ++ state.mode = PLY_BOOT_SPLASH_MODE_FIRMWARE_UPGRADE; + else + state.mode = PLY_BOOT_SPLASH_MODE_BOOT_UP; + +diff --git a/src/plugins/splash/script/script-lib-plymouth.c b/src/plugins/splash/script/script-lib-plymouth.c +index ca7ad77..d578223 100644 +--- a/src/plugins/splash/script/script-lib-plymouth.c ++++ b/src/plugins/splash/script/script-lib-plymouth.c +@@ -79,6 +79,9 @@ static script_return_t plymouth_get_mode (script_state_t *state, + case PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE: + obj = script_obj_new_string ("system-upgrade"); + break; ++ case PLY_BOOT_SPLASH_MODE_FIRMWARE_UPGRADE: ++ obj = script_obj_new_string ("firmware-upgrade"); ++ break; + case PLY_BOOT_SPLASH_MODE_INVALID: + default: + obj = script_obj_new_string ("unknown"); +diff --git a/src/plugins/splash/throbgress/plugin.c b/src/plugins/splash/throbgress/plugin.c +index 3982821..86be064 100644 +--- a/src/plugins/splash/throbgress/plugin.c ++++ b/src/plugins/splash/throbgress/plugin.c +@@ -723,7 +723,8 @@ on_boot_progress (ply_boot_splash_plugin_t *plugin, + double total_duration; + + if (plugin->mode == PLY_BOOT_SPLASH_MODE_UPDATES || +- plugin->mode == PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE) ++ plugin->mode == PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE || ++ plugin->mode == PLY_BOOT_SPLASH_MODE_FIRMWARE_UPGRADE) + return; + + total_duration = duration / percent_done; +@@ -935,7 +936,8 @@ system_update (ply_boot_splash_plugin_t *plugin, + ply_list_node_t *node; + + if (plugin->mode != PLY_BOOT_SPLASH_MODE_UPDATES && +- plugin->mode != PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE) ++ plugin->mode != PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE && ++ plugin->mode != PLY_BOOT_SPLASH_MODE_FIRMWARE_UPGRADE) + return; + + node = ply_list_get_first_node (plugin->views); +diff --git a/src/plugins/splash/two-step/plugin.c b/src/plugins/splash/two-step/plugin.c +index e8b91ec..caf03fc 100644 +--- a/src/plugins/splash/two-step/plugin.c ++++ b/src/plugins/splash/two-step/plugin.c +@@ -253,6 +253,7 @@ view_load_end_animation (view_t *view) + case PLY_BOOT_SPLASH_MODE_BOOT_UP: + case PLY_BOOT_SPLASH_MODE_UPDATES: + case PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE: ++ case PLY_BOOT_SPLASH_MODE_FIRMWARE_UPGRADE: + animation_prefix = "startup-animation-"; + break; + case PLY_BOOT_SPLASH_MODE_SHUTDOWN: +@@ -1006,6 +1007,7 @@ create_plugin (ply_key_file_t *key_file) + load_mode_settings (plugin, key_file, "reboot", PLY_BOOT_SPLASH_MODE_REBOOT); + load_mode_settings (plugin, key_file, "updates", PLY_BOOT_SPLASH_MODE_UPDATES); + load_mode_settings (plugin, key_file, "system-upgrade", PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE); ++ load_mode_settings (plugin, key_file, "firmware-upgrade", PLY_BOOT_SPLASH_MODE_FIRMWARE_UPGRADE); + + if (plugin->use_firmware_background) + plugin->background_bgrt_image = ply_image_new ("/sys/firmware/acpi/bgrt/image"); +@@ -1583,7 +1585,8 @@ on_boot_progress (ply_boot_splash_plugin_t *plugin, + double percent_done) + { + if (plugin->mode == PLY_BOOT_SPLASH_MODE_UPDATES || +- plugin->mode == PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE) ++ plugin->mode == PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE || ++ plugin->mode == PLY_BOOT_SPLASH_MODE_FIRMWARE_UPGRADE) + return; + + if (plugin->state != PLY_BOOT_SPLASH_DISPLAY_NORMAL) +@@ -1791,7 +1794,8 @@ system_update (ply_boot_splash_plugin_t *plugin, + char buf[64]; + + if (plugin->mode != PLY_BOOT_SPLASH_MODE_UPDATES && +- plugin->mode != PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE) ++ plugin->mode != PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE && ++ plugin->mode != PLY_BOOT_SPLASH_MODE_FIRMWARE_UPGRADE) + return; + + node = ply_list_get_first_node (plugin->views); +diff --git a/themes/bgrt/bgrt.plymouth.in b/themes/bgrt/bgrt.plymouth.in +index 39bfdc5..ac07bc9 100644 +--- a/themes/bgrt/bgrt.plymouth.in ++++ b/themes/bgrt/bgrt.plymouth.in +@@ -46,3 +46,11 @@ ProgressBarShowPercentComplete=true + UseProgressBar=true + _Title=Upgrading System... + _SubTitle=Do not turn off your computer ++ ++[firmware-upgrade] ++SuppressMessages=true ++ProgressBarShowPercentComplete=true ++UseProgressBar=true ++UseFirmwareBackground=true ++_Title=Upgrading Firmware... ++_SubTitle=Do not turn off your computer +diff --git a/themes/spinner/spinner.plymouth.in b/themes/spinner/spinner.plymouth.in +index 5c0b297..5e5078e 100644 +--- a/themes/spinner/spinner.plymouth.in ++++ b/themes/spinner/spinner.plymouth.in +@@ -36,3 +36,11 @@ ProgressBarShowPercentComplete=true + UseProgressBar=true + _Title=Upgrading System... + _SubTitle=Do not turn off your computer ++ ++[firmware-upgrade] ++SuppressMessages=true ++ProgressBarShowPercentComplete=true ++UseProgressBar=true ++UseFirmwareBackground=true ++_Title=Upgrading Firmware... ++_SubTitle=Do not turn off your computer +-- +2.21.0 + +From 97a3d7b422c88fb0e874331b7948daa332d7e78d Mon Sep 17 00:00:00 2001 +From: ZhaoQiang +Date: Sun, 2 Jun 2019 19:52:58 +0000 +Subject: [PATCH 3/5] ply-text-display.c: Correct vi format line make vi can + directly edit this file without errors and make it use 8 space tabs etc. + +--- + src/libply-splash-core/ply-text-display.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/libply-splash-core/ply-text-display.c b/src/libply-splash-core/ply-text-display.c +index 83bf602..7bf6e06 100644 +--- a/src/libply-splash-core/ply-text-display.c ++++ b/src/libply-splash-core/ply-text-display.c +@@ -333,4 +333,4 @@ ply_text_display_get_terminal (ply_text_display_t *display) + return display->terminal; + } + +-/* vim: set ts= 4 sw= 4 et ai ci cino= {.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */ ++/* vim: set ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */ +-- +2.21.0 + +From 88f6bac356fdc6df130516fe30537a8fecba0c90 Mon Sep 17 00:00:00 2001 +From: ZhaoQiang +Date: Wed, 5 Jun 2019 10:42:24 +0000 +Subject: [PATCH 4/5] Unify all code's vi format control. Update several file's + vi format control line to make it easy to maintain. + +--- + src/libply-splash-core/ply-keyboard.c | 2 +- + src/libply-splash-core/ply-keyboard.h | 3 ++- + src/libply-splash-core/ply-pixel-buffer.c | 2 +- + src/libply-splash-core/ply-pixel-display.c | 2 +- + src/libply-splash-core/ply-pixel-display.h | 3 ++- + src/libply-splash-core/ply-terminal.c | 2 +- + src/libply-splash-core/ply-terminal.h | 3 ++- + src/libply-splash-core/ply-text-display.h | 3 ++- + src/main.c | 2 +- + src/plugins/renderers/drm/plugin.c | 3 ++- + src/plugins/renderers/frame-buffer/plugin.c | 3 ++- + src/plugins/renderers/x11/plugin.c | 2 +- + src/plugins/splash/two-step/plugin.c | 2 +- + 13 files changed, 19 insertions(+), 13 deletions(-) + +diff --git a/src/libply-splash-core/ply-keyboard.c b/src/libply-splash-core/ply-keyboard.c +index 27395e0..b174261 100644 +--- a/src/libply-splash-core/ply-keyboard.c ++++ b/src/libply-splash-core/ply-keyboard.c +@@ -603,4 +603,4 @@ ply_keyboard_get_renderer (ply_keyboard_t *keyboard) + return NULL; + } + +-/* vim: set ts=4 sw=4 et ai ci cino={.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */ ++/* vim: set ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */ +diff --git a/src/libply-splash-core/ply-keyboard.h b/src/libply-splash-core/ply-keyboard.h +index dd428c0..008a804 100644 +--- a/src/libply-splash-core/ply-keyboard.h ++++ b/src/libply-splash-core/ply-keyboard.h +@@ -77,4 +77,5 @@ ply_renderer_t *ply_keyboard_get_renderer (ply_keyboard_t *keyboard); + #endif + + #endif /* PLY_KEYBOARD_H */ +-/* vim: set ts=4 sw=4 et ai ci cino={.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */ ++ ++/* vim: set ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */ +diff --git a/src/libply-splash-core/ply-pixel-buffer.c b/src/libply-splash-core/ply-pixel-buffer.c +index 51f9c4d..aa4b344 100644 +--- a/src/libply-splash-core/ply-pixel-buffer.c ++++ b/src/libply-splash-core/ply-pixel-buffer.c +@@ -1140,4 +1140,4 @@ ply_pixel_buffer_rotate_upright (ply_pixel_buffer_t *old_buffer) + return buffer; + } + +-/* vim: set ts=4 sw=4 et ai ci cino={.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */ ++/* vim: set ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */ +diff --git a/src/libply-splash-core/ply-pixel-display.c b/src/libply-splash-core/ply-pixel-display.c +index dc088bb..8ef93b1 100644 +--- a/src/libply-splash-core/ply-pixel-display.c ++++ b/src/libply-splash-core/ply-pixel-display.c +@@ -189,4 +189,4 @@ ply_pixel_display_set_draw_handler (ply_pixel_display_t *display, + display->draw_handler_user_data = user_data; + } + +-/* vim: set ts=4 sw=4 et ai ci cino={.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */ ++/* vim: set ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */ +diff --git a/src/libply-splash-core/ply-pixel-display.h b/src/libply-splash-core/ply-pixel-display.h +index a57b9a9..a5cfd88 100644 +--- a/src/libply-splash-core/ply-pixel-display.h ++++ b/src/libply-splash-core/ply-pixel-display.h +@@ -69,4 +69,5 @@ void ply_pixel_display_unpause_updates (ply_pixel_display_t *display); + #endif + + #endif /* PLY_PIXEL_DISPLAY_H */ +-/* vim: set ts=4 sw=4 et ai ci cino={.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */ ++ ++/* vim: set ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */ +diff --git a/src/libply-splash-core/ply-terminal.c b/src/libply-splash-core/ply-terminal.c +index f3b32fe..0190f9e 100644 +--- a/src/libply-splash-core/ply-terminal.c ++++ b/src/libply-splash-core/ply-terminal.c +@@ -1049,4 +1049,4 @@ ply_terminal_stop_watching_for_input (ply_terminal_t *terminal, + } + } + +-/* vim: set ts=4 sw=4 et ai ci cino={.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */ ++/* vim: set ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */ +diff --git a/src/libply-splash-core/ply-terminal.h b/src/libply-splash-core/ply-terminal.h +index 7cfcc59..620ee9e 100644 +--- a/src/libply-splash-core/ply-terminal.h ++++ b/src/libply-splash-core/ply-terminal.h +@@ -117,4 +117,5 @@ void ply_terminal_stop_watching_for_input (ply_terminal_t *terminal + #endif + + #endif /* PLY_TERMINAL_H */ +-/* vim: set ts=4 sw=4 et ai ci cino={.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */ ++ ++/* vim: set ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */ +diff --git a/src/libply-splash-core/ply-text-display.h b/src/libply-splash-core/ply-text-display.h +index 4a56aba..774dd4d 100644 +--- a/src/libply-splash-core/ply-text-display.h ++++ b/src/libply-splash-core/ply-text-display.h +@@ -86,4 +86,5 @@ void ply_text_display_unpause_updates (ply_text_display_t *display); + #endif + + #endif /* PLY_TEXT_DISPLAY_H */ +-/* vim: set ts=4 sw=4 et ai ci cino={.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */ ++ ++/* vim: set ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */ +diff --git a/src/main.c b/src/main.c +index 2f04e11..6fceb20 100644 +--- a/src/main.c ++++ b/src/main.c +@@ -2308,4 +2308,4 @@ main (int argc, + + return exit_code; + } +-/* vim: set sts=4 ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */ ++/* vim: set ts=4 ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */ +diff --git a/src/plugins/renderers/drm/plugin.c b/src/plugins/renderers/drm/plugin.c +index 7ddd9c5..d9d5c37 100644 +--- a/src/plugins/renderers/drm/plugin.c ++++ b/src/plugins/renderers/drm/plugin.c +@@ -1824,4 +1824,5 @@ ply_renderer_backend_get_interface (void) + + return &plugin_interface; + } +-/* vim: set ts=4 sw=4 et ai ci cino={.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */ ++ ++/* vim: set ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */ +diff --git a/src/plugins/renderers/frame-buffer/plugin.c b/src/plugins/renderers/frame-buffer/plugin.c +index b4050c5..065e484 100644 +--- a/src/plugins/renderers/frame-buffer/plugin.c ++++ b/src/plugins/renderers/frame-buffer/plugin.c +@@ -744,4 +744,5 @@ ply_renderer_backend_get_interface (void) + + return &plugin_interface; + } +-/* vim: set ts=4 sw=4 et ai ci cino={.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */ ++ ++/* vim: set ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */ +diff --git a/src/plugins/renderers/x11/plugin.c b/src/plugins/renderers/x11/plugin.c +index 76addda..7d2a730 100644 +--- a/src/plugins/renderers/x11/plugin.c ++++ b/src/plugins/renderers/x11/plugin.c +@@ -552,4 +552,4 @@ ply_renderer_backend_get_interface (void) + return &plugin_interface; + } + +-/* vim: set ts=4 sw=4 et ai ci cino={.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */ ++/* vim: set ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */ +diff --git a/src/plugins/splash/two-step/plugin.c b/src/plugins/splash/two-step/plugin.c +index caf03fc..434bcf2 100644 +--- a/src/plugins/splash/two-step/plugin.c ++++ b/src/plugins/splash/two-step/plugin.c +@@ -1892,4 +1892,4 @@ ply_boot_splash_plugin_get_interface (void) + return &plugin_interface; + } + +-/* vim: set ts=4 sw=4 et ai ci cino={.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */ ++/* vim: set ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */ +-- +2.21.0 + +From 2449ea52006238f6d0e61bae2f0630e02bedc5e6 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Fri, 24 May 2019 22:49:15 +0200 +Subject: [PATCH 5/5] two-step: Add support for firmware-splashes with rotation + status bits set + +Before the ACPI 6.2 specification, the BGRT table did not contain any rotation +information, so to make sure that the firmware-splash showed the right way up +the firmware would contain a pre-rotated image and our BGRT / firmware-splash +loading code assumed this is alwast true. + +Starting with ACPI 6.2 tge bgrt status fields has 2 bits to tell the firmware +the image needs to be rotated before being displayed. If these bits are set +then the firmwares-splash is not pre-rotated and we must handle it differently. + +This commit adds support for reading the new rotation bits from the sysfs +bgrt/status file and adds handling for the case where the bits indicate +that the image is not pre-rotated. + +Signed-off-by: Hans de Goede +--- + src/plugins/splash/two-step/plugin.c | 84 ++++++++++++++++++++++++++-- + 1 file changed, 78 insertions(+), 6 deletions(-) + +diff --git a/src/plugins/splash/two-step/plugin.c b/src/plugins/splash/two-step/plugin.c +index 434bcf2..795bded 100644 +--- a/src/plugins/splash/two-step/plugin.c ++++ b/src/plugins/splash/two-step/plugin.c +@@ -73,6 +73,12 @@ + #define PROGRESS_BAR_WIDTH 400 + #define PROGRESS_BAR_HEIGHT 5 + ++#define BGRT_STATUS_ORIENTATION_OFFSET_0 (0 << 1) ++#define BGRT_STATUS_ORIENTATION_OFFSET_90 (1 << 1) ++#define BGRT_STATUS_ORIENTATION_OFFSET_180 (2 << 1) ++#define BGRT_STATUS_ORIENTATION_OFFSET_270 (3 << 1) ++#define BGRT_STATUS_ORIENTATION_OFFSET_MASK (3 << 1) ++ + typedef enum + { + PLY_BOOT_SPLASH_DISPLAY_NORMAL, +@@ -298,12 +304,41 @@ view_load_end_animation (view_t *view) + } + + static bool +-get_bgrt_sysfs_offsets(int *x_offset, int *y_offset) ++get_bgrt_sysfs_info(int *x_offset, int *y_offset, ++ ply_pixel_buffer_rotation_t *rotation) + { + bool ret = false; + char buf[64]; ++ int status; + FILE *f; + ++ f = fopen("/sys/firmware/acpi/bgrt/status", "r"); ++ if (!f) ++ return false; ++ ++ if (!fgets(buf, sizeof(buf), f)) ++ goto out; ++ ++ if (sscanf(buf, "%d", &status) != 1) ++ goto out; ++ ++ fclose(f); ++ ++ switch (status & BGRT_STATUS_ORIENTATION_OFFSET_MASK) { ++ case BGRT_STATUS_ORIENTATION_OFFSET_0: ++ *rotation = PLY_PIXEL_BUFFER_ROTATE_UPRIGHT; ++ break; ++ case BGRT_STATUS_ORIENTATION_OFFSET_90: ++ *rotation = PLY_PIXEL_BUFFER_ROTATE_COUNTER_CLOCKWISE; ++ break; ++ case BGRT_STATUS_ORIENTATION_OFFSET_180: ++ *rotation = PLY_PIXEL_BUFFER_ROTATE_UPSIDE_DOWN; ++ break; ++ case BGRT_STATUS_ORIENTATION_OFFSET_270: ++ *rotation = PLY_PIXEL_BUFFER_ROTATE_CLOCKWISE; ++ break; ++ } ++ + f = fopen("/sys/firmware/acpi/bgrt/xoffset", "r"); + if (!f) + return false; +@@ -347,23 +382,61 @@ static void + view_set_bgrt_background (view_t *view) + { + ply_pixel_buffer_rotation_t panel_rotation = PLY_PIXEL_BUFFER_ROTATE_UPRIGHT; ++ ply_pixel_buffer_rotation_t bgrt_rotation = PLY_PIXEL_BUFFER_ROTATE_UPRIGHT; + int x_offset, y_offset, sysfs_x_offset, sysfs_y_offset, width, height; + int panel_width = 0, panel_height = 0, panel_scale = 1; + int screen_width, screen_height, screen_scale; + ply_pixel_buffer_t *bgrt_buffer; ++ bool have_panel_props; + + if (!view->plugin->background_bgrt_image) + return; + ++ if (!get_bgrt_sysfs_info(&sysfs_x_offset, &sysfs_y_offset, ++ &bgrt_rotation)) { ++ ply_trace ("get bgrt sysfs info failed"); ++ return; ++ } ++ + screen_width = ply_pixel_display_get_width (view->display); + screen_height = ply_pixel_display_get_height (view->display); + screen_scale = ply_pixel_display_get_device_scale (view->display); + + bgrt_buffer = ply_image_get_buffer (view->plugin->background_bgrt_image); + +- if (ply_renderer_get_panel_properties (ply_pixel_display_get_renderer (view->display), +- &panel_width, &panel_height, +- &panel_rotation, &panel_scale)) { ++ have_panel_props = ply_renderer_get_panel_properties (ply_pixel_display_get_renderer (view->display), ++ &panel_width, &panel_height, ++ &panel_rotation, &panel_scale); ++ ++ /* ++ * Before the ACPI 6.2 specification, the BGRT table did not contain ++ * any rotation information, so to make sure that the firmware-splash ++ * showed the right way up the firmware would contain a pre-rotated ++ * image. Starting with ACPI 6.2 the bgrt status fields has 2 bits ++ * to tell the firmware the image needs to be rotated before being ++ * displayed. ++ * If these bits are set then the firmwares-splash is not pre-rotated, ++ * in this case we must not rotate it when rendering and when doing ++ * comparisons with the panel-size we must use the post rotation ++ * panel-size. ++ */ ++ if (bgrt_rotation != PLY_PIXEL_BUFFER_ROTATE_UPRIGHT) { ++ if (bgrt_rotation != panel_rotation) { ++ ply_trace ("bgrt orientation mismatch, bgrt_rot %d panel_rot %d", (int)bgrt_rotation, (int)panel_rotation); ++ return; ++ } ++ ++ /* Set panel properties to their post-rotations values */ ++ if (panel_rotation == PLY_PIXEL_BUFFER_ROTATE_CLOCKWISE || ++ panel_rotation == PLY_PIXEL_BUFFER_ROTATE_COUNTER_CLOCKWISE) { ++ int temp = panel_width; ++ panel_width = panel_height; ++ panel_height = temp; ++ } ++ panel_rotation = PLY_PIXEL_BUFFER_ROTATE_UPRIGHT; ++ } ++ ++ if (have_panel_props) { + /* Upside-down panels are fixed up in HW by the GOP, so the + * bgrt image is not rotated in this case. + */ +@@ -396,8 +469,7 @@ view_set_bgrt_background (view_t *view) + * panel's native resolution and then we correct for any difference + * between the (external) screen's and the panel's resolution. + */ +- if (panel_width != 0 && panel_height != 0 && +- get_bgrt_sysfs_offsets(&sysfs_x_offset, &sysfs_y_offset) && ++ if (have_panel_props && + (panel_width - view->plugin->background_bgrt_raw_width) / 2 == sysfs_x_offset) { + if (panel_rotation == PLY_PIXEL_BUFFER_ROTATE_CLOCKWISE || + panel_rotation == PLY_PIXEL_BUFFER_ROTATE_COUNTER_CLOCKWISE) { +-- +2.21.0 + diff --git a/plymouth.spec b/plymouth.spec index 4d898a9..c7627fe 100644 --- a/plymouth.spec +++ b/plymouth.spec @@ -1,7 +1,7 @@ Summary: Graphical Boot Animation and Logger Name: plymouth Version: 0.9.4 -Release: 5%{?dist} +Release: 6%{?dist} License: GPLv2+ URL: http://www.freedesktop.org/wiki/Software/Plymouth @@ -10,6 +10,7 @@ Source2: charge.plymouth Source3: plymouth-update-initrd Patch1: plymouth-updates.patch +Patch2: plymouth-more-updates.patch BuildRequires: gcc libtool git BuildRequires: pkgconfig(libdrm) @@ -414,6 +415,13 @@ fi %changelog +* Wed Jun 12 2019 Hans de Goede - 0.9.4-6 +- Add patches from upstream for: + - Fix failing to pick the native monitor mode starting with kernel 5.2 + - Fix firmware bootsplash support for devices which use the new + (in ACPI 6.2) rotation bits in the BGRT header + - Add support for firmware-upgrade mode + * Mon Mar 25 2019 Hans de Goede - 0.9.4-5 - Update bgrt/spinner background to solid black to make the experience on systems where we do not show the firmware boot-splash consistent with