Commit graph

2123 commits

Author SHA1 Message Date
Hans de Goede
ed3aae9d8f drm: Implement ply_renderer_get_panel_properties
Implement the get_panel_properties plugin interface.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2018-11-27 08:48:56 +01:00
Hans de Goede
1723419e6c ply-renderer: Add ply_renderer_get_panel_properties function
For some themes we want to read the firmware-logo to use as background,
when the LCD panel of a laptop is mounted non-upright and/or if it is
using scaling because of HiDPI then the image which we get from the
firmware will be pre-rotated and scaled to match the LCD panel.

This new function will allow renderers to let themes know about this so
that they can adjust for the logo being pre-rotated and scaled.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2018-11-27 08:48:56 +01:00
Hans de Goede
f5915187b4 ply-image: Add support for loading BMPs
Add support for loading BMP files. This is needed to be able to read the
the ACPI BGRT graphics (the firmware splash shown at boot by the firmware).

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2018-11-27 08:48:56 +01:00
Hans de Goede
addff821e0 ply-image: Do not assume all files are PNGs
So far the image loading code has been assuming that all files are PNGs,
this commit makes the code check the file-header before assuming the file
is a PNG.

This is a preparation patch for adding support for also being able to load
BMP files.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2018-11-27 08:48:56 +01:00
Hans de Goede
70f0c7a029 Merge branch 'two-step-multi-head-pw-crash-fix' into 'master'
two-step: Fix crash asking for password with multiple heads

See merge request plymouth/plymouth!15
2018-11-27 07:48:14 +00:00
Hans de Goede
50adbfd300 two-step: Fix crash asking for password with multiple heads
Commit 9639ed8953 ("two-step: Fix animation not starting on later
added heads") unconditionally calls view_start_progress_animation() when
adding secondary heads, to fix the animation not running on secondary
heads when not asking for a password.

But we should not start the animation when adding a head after we've
already entered PLY_BOOT_SPLASH_DISPLAY_PASSWORD_ENTRY state, otherwise
we end up starting it a second time when the user is done entering his
password, causing plymouth to crash and the boot to hang.

We already have the is_animating bool to indicate whether animations have
been started or not, use this to decide if we should start the animation
when adding a new head, fixing the crash.

Fixes: 9639ed8953 ("two-step: Fix animation not starting on ... added heads")
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2018-11-27 08:30:00 +01:00
Hans de Goede
59e3095253 Merge branch 'jimmac1/plymouth-master' 2018-11-23 17:19:18 +01:00
Jakub Steiner
75d93c0f30 spinner theme: update
- update spinner & lock to current visuals

Hans de Goede: Add extra throbber-00##.png files to Makefile.am, small tweak
to the new lock image.
2018-11-23 17:18:50 +01:00
Ray Strode
aaa140b838 Merge branch 'misc-fixes' into 'master'
Misc fixes

Closes #29

See merge request plymouth/plymouth!9
2018-11-22 19:49:55 +00:00
Hans de Goede
9639ed8953 two-step: Fix animation not starting on later added heads
Fix the animation not starting on heads added after show_splash_screen
has been called. Since the core calls show_splash_screen after adding
the first head / pixel_display in practice this fixes the animation not
starting on all monitors other then the first.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2018-11-12 14:57:18 +01:00
Hans de Goede
059390ac56 ply-device-manager: Fix race causing undesired creation of non-gfx devs
On systems with working drm/kms devices we still sometimes see:
"Creating non-graphical devices, since there's no suitable graphics hardware"
in the logs (and actually create non-gfx devices).

This is caused by a race where the create_devices_from_udev timeout handler
runs just after the pivot-root, just at the time when the "udev trigger"
from the real root is done.

This causes create_devices_for_subsystem() to hit the "it's not initialized"
code-path for all drm and fb devices, even though before (from the initrd)
drm-devices where already setup successfully.

One way of solving this would be to stop the timer as soon as we successfully
enumerate the first drm device. But we need the timer to enumerate fb devices
so on machines where some outputs only have a fbdev driver (corner case) this
would break support for those outputs.

Instead this commit moves the found_drm_device and found_fb_device to the
global manager state and sets them from create_devices_for_udev_device().
This way they will be set when we check them from the create_devices_from_udev
timeout handler even if create_devices_for_subsystem skips over the devices
because of the udev trigger race.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2018-11-12 14:57:18 +01:00
Hans de Goede
4de54f598b logger: Add a separator between different boot logs
Since we concatenate boot logs one after the other in /var/log/boot.log
it is hard to tell where the logs from one boot end the next boot starts.

This commit makes plymouth write out a separator including a time + date
of the date, when the log file gets opened to add new boot messages to it.

Note ply_logger_open_file() is only called from ply_terminal_session_open_log()
which in turn is only used for /var/log/boot.log, so this only effects
/var/log/boot.log.

Closes #29

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2018-11-12 14:57:18 +01:00
Ray Strode
118c5ca1bc Merge branch 'master' into 'master'
systemd-units: Also add "ConditionVirtualization=!container" in…

See merge request plymouth/plymouth!8
2018-11-11 02:15:33 +00:00
Laurent Bigonville
763c023caa systemd-units: Also add "ConditionVirtualization=!container" in systemd-ask-password-plymouth.path.in
This completes the fix for #27
2018-11-08 11:05:05 +00:00
Ray Strode
f898586543 configure: bump to 0.9.5 2018-11-05 15:45:53 -05:00
Hans de Goede
025ce59825 Merge branch 'drm-preferred-mode' into 'master'
drm: use preferred mode for outputs

Closes #68 and #59

See merge request plymouth/plymouth!4
2018-10-31 15:04:55 +00:00
Hans de Goede
da2c997072 drm: Use preferred mode for outputs instead of current mode
When enumerating outputs pick the preferred mode instead of the current
active mode, which may be e.g. a very low res mode.

Sofar we've been relying on fbcon setting up the modes for us, but as
mentioned in https://bugs.freedesktop.org/show_bug.cgi?id=101520#c22
we really should not rely on this.

With the recent flickerfree boot changes we can no longer rely on fbcon
to do the setup for us, hence this commit. For now this commit only
changes the mode-picking logic on UEFI setups as we only have
flickerfree boot there. Once the setup code is more mature we should
probably always use it.

Closes #68

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2018-10-31 15:28:03 +01:00
Hans de Goede
9dfb4c575c drm: Refactor ply_renderer_connector_get_rotation
ply_renderer_connector_get_rotation walks over all properties to add
support for selecting the preferred mode we also want to know if a connector
is part of a tiled output or not, which also requires walking over the props.

This commit refactors ply_renderer_connector_get_rotation into
ply_renderer_connector_get_rotation_and_tiled to prepare for this.

While at also properly use ply_pixel_buffer_rotation_t for the orientation
instead of an int.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2018-10-31 15:28:01 +01:00
Hans de Goede
659dbb300e drm: Reset LUT/gamma table before the first drmModeSetCrtc call
When we takeover the kms master from whatever process came before us the
LUT table may be a mess making the graphics funky. So lets reset it once
before our first drmModeSetCrtc call.

Closes #59

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2018-10-31 15:26:58 +01:00
Hans de Goede
d253ad6238 libply: Move kernel commandline parsing functions to libply/ply-utils
Move kernel commandline parsing functions to libply/ply-utils to avoid
code duplication between the daemon, the client and the plugins.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2018-10-31 15:25:15 +01:00
Michal Srb
b4f751b5f1 Merge branch 'fix-infinite-throbber' into 'master'
throbber: Don't skip last frame when waiting for end.

See merge request plymouth/plymouth!7
2018-10-26 14:30:45 +00:00
Michal Srb
121783eff1 throbber: Don't skip last frame when waiting for end.
If the stop_trigger is set and we are waiting for the last frame to stop the
animation, make sure we don't accidentally skip the last frame. It could
happen if the machine is busy and can't keep up with the frames or when the
animation has more than 60 frames (30FPS * 2 seconds).
2018-10-26 09:02:04 +02:00
Ray Strode
a588b3f7d1 Merge branch 'coverity-fixes' into 'master'
Coverity fixes

See merge request plymouth/plymouth!6
2018-10-16 03:10:53 +00:00
Ray Strode
3945071e39 boot-server: free the argument and triggers
coverity found some pervasive leaking of the argument
and triggers.

This commit mops them up.
2018-10-15 21:56:03 -04:00
Ray Strode
5badb95b8e script: fix various memory leaks
coverity found a few leaks.

this commit mops them up.
2018-10-15 21:44:10 -04:00
Ray Strode
322a3635fa key-file: ply_key_file_get_value returns duplicated memory, don't leak
For some reason I made the same api misdesign with ply_key_file_t
that I made when writing GKeyFile...it returns duplicated memory for
no good reason.

This commit sprinkles frees around.
2018-10-15 21:13:58 -04:00
Ray Strode
656444ed26 event-loop: fix leak in error path
ply_event_loop_new fails to clean itself up if it's unable to
create a pipe for dispatching signals.

This commit fixes that.
2018-10-15 21:07:01 -04:00
Ray Strode
310b63cd15 boot-splash: fix memory leak in error path
If the splash key file fails to load, we don't free
the associated key file object.

This commit fixes that.
2018-10-15 21:04:47 -04:00
Ray Strode
4ff6d59d10 populate-initrd: drop unused local variable
the inst_library function declares a variable `_lib`
that's completely unused.

This commit removes the declaration.
2018-10-15 21:02:50 -04:00
Iain Lane
89283f38b0 Merge branch 'fix-deactivate-udev-race' into 'master'
device-manager: don't watch for udev events when deactivated

See merge request plymouth/plymouth!5
2018-10-10 20:42:27 +00:00
Ray Strode
85d843af84
device-manager: don't watch for udev events when deactivated
If a device gets added when we're already deactivated, plymouth shouldn't
process the device, since processing it effectively activates plymouth.

This commit pulls the udev monitor fd out of the event loop while
plymouth is deactivated so new events are deferred until reactivation.

Modified by Iain Lane <iain.lane@canonical.com>: Also deactivate the
timer that finds all devices known to udev after an interval, when
paused.
2018-10-10 20:09:52 +01:00
Ray Strode
0a66272326 Merge branch 'wip/dont-muck-with-login-screen-tty' into 'master'
main: ensure tty is closed on deactivate

See merge request plymouth/plymouth!2
2018-08-27 19:19:41 +00:00
Ray Strode
28ee4012c9 main: ensure tty is closed on deactivate
If plymouth doesn't get explicitly "activated" then when
GDM tries to deactivate it, the deactivation request is
a noop.

One aspect of being active, though is having ownership and
control of the terminal.  This happens immediately, even
before a splash is shown.

The `deactivate` request needs to relinguish such control,
unconditionally, since some display server is about to use
the tty.

This commit fixes that.
2018-08-27 15:16:18 -04:00
Ray Strode
7663b0c587 Merge branch 'wip/container-condition-check' into 'master'
systemd-units: Add "ConditionVirtualization=!container"

Closes #27

See merge request plymouth/plymouth!1
2018-08-07 15:41:15 +00:00
Hans de Goede
9ed2a0c55b systemd-units: Add "ConditionVirtualization=!container"
When running in a container with plymouth installed, plymouth is started
unnecessarily and systemd prints warnings:

[  OK  ] Reached target Shutdown.
Sending SIGTERM to remaining processes...
Sending SIGKILL to remaining processes...
Process 253 (plymouthd) has been been marked to be excluded from killing. It is running from the root file system, and thus likely to block re-mounting of the root file system to read-only. Please consider moving it into an initrd file system instead.

It makes little sense to start plymouth in contains, so add
'ConditionVirtualization=!container' everywhere where
ConditionKernelCommandLine=!plymouth.enable=0 appears to disable plymouth
in containers.

BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1337611
Signed-off-by: Hans de Goede <hdegoede@redhat.com>

Closes: https://gitlab.freedesktop.org/plymouth/plymouth/issues/27
2018-08-07 09:58:58 -04:00
Ray Strode
81055ace5b README: add link to Code of Conduct 2018-08-06 14:58:18 -04:00
Ray Strode
f151b22e62 two-step: add unhandled splash mode case to switch
This fixes a compiler warning.
2018-07-10 16:00:18 -04:00
Ray Strode
75ef8ee24b main: fix build
I slightly modified Hans patch in commit 129b4a50 before pushing it
and broke the build.

This fixes the build by adding a forward declaration.
2018-07-10 15:58:04 -04:00
Hans de Goede
b145b25dbe Fix miscellaneous compiler warnings
Fix all compiler warnings (and one type) except for the deprectation warnings
for the gdk_screen_get_monitor_* functions used in the x11 renderer.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2018-07-10 15:53:57 -04:00
Hans de Goede
7fdfeecd32 configure: Pass -Wno-cast-function-type if available
plymouth uses function type casts for callbacks in quite a few places, fixing
these needlessly complicates the code, so lets pass -Wno-cast-function-type.

This fixes 218 warnings like this one:

ply-command-parser.c: In function ‘ply_command_parser_stop_parsing_arguments’:
ply-command-parser.c:680:48: warning: cast between incompatible function types from ‘void (*)(ply_command_parser_t *)’ {aka ‘void (*)(struct _ply_command_parser *)’} to ‘void (*)(void *, int,  ply_event_loop_t *)’ {aka ‘void (*)(void *, int,  struct _ply_event_loop *)’} [-Wcast-function-type]
                                                (ply_event_loop_exit_handler_t)

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2018-07-10 15:47:14 -04:00
Hans de Goede
6a1fdabf34 main: Fix getting detailed logs from systemd
This are 3 issues with the detailed logs handling:

1) plymouth attaches to the session directly on a show-splash command
(in on_show_splash()), but it does not tell systemd to start printing
details until the splash is actually shown after the splash_delay.

2) If the splash is actually shown during the initrd (e.g. a diskcript
password is necessary) then we tell the initrd systemd instance to
print details, but we don't tell the regular initrd instance which takes
over as pid 1 after the switch-root to print details.

This leads to rather inconsistent logging/printing behavior, e.g.:

* If a diskcrypt password is asked for, we only log details from
the initrd phase.

* If the boot is shorter then splash_delay no details are logged

* If the user presses ESC during boot during the initrd, only initrd
  messages are printed

* If the user presses ESC during boot after the initrd, only normal
  messages are printed

This commit fixes both these issues by:

1) Telling systemd to print details as soon as we have attached to the session;
   and to stop printing details when we detach from the session (*)
2) Telling systemd to print details after the rootfs has been remounted rw

*) This is necessary to have a smooth transition to e.g. gdm if the splash
has not shown because the boot is shorter then splash_delay

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2018-07-10 15:40:29 -04:00
Hans de Goede
129b4a5004 main: Show details when ESC is pressed during splash_delay
Start listening for keypresses on the first show_splash() call, so that
pressing ESC while we're delaying show the non-details splash will show
the details splash.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2018-07-10 15:34:28 -04:00
Hans de Goede
b527834c88 drm: Remove unnecessary reset_scan_out_buffer_if_needed() call from ply_renderer_head_map()
ply_renderer_head_map() gets only called from map_to_device() which
calls activate() directly afterwards which calls
ply_renderer_head_set_scan_out_buffer(), so there is no need for the
reset_scan_out_buffer_if_needed() call.

Not only is it not needed, but it is actually harmful, there are 2 problems
woth it:

1) Normally the drm plugin gets instantiated by ply-renderer.c with
   rendered->is_active=true, backend->is_active=false. The
   rendered->is_active=true causes the first ply_renderer_activate call
   to be a no-op without calling backend->activate(). So when the first
   map_to_device() calls happen activate() has not been called yet and we've
   not yet claimed master rights, so ply_renderer_head_set_scan_out_buffer()
   calls will always fail, resulting in this in a ply-trace:

   Mapping buffer for 1920x1080 renderer head
   Redrawing 1920x1080 renderer head
   Setting scan out buffer of 1920x1080 head to our buffer
   Couldn't set scan out buffer for head with controller id 41

   This is harmless, but also shows that the reset_scan_out_buffer_if_needed()
   is really not needed.

2. If deactivate_renderer() gets called before the first show-splash then
   rendered->is_active will become false, so renderer_activate() done before
   map_to_device() will now actually call backend->activate() claiming
   drm master rights and setting backend->is_active=true.

   The map_to_device() -> ply_renderer_head_map() call done after this, calls
   ply_renderer_head_redraw() -> flush_head() which under 1. was a no-op
   as it exits directly when backend->is_active=false. But now it actually
   flushes the buffers by calling reset_scan_out_buffer_if_needed(). This
   itself is fine.

   But since reset_scan_out_buffer_if_needed() has already happened in
   ply_renderer_head_redraw() the reset_scan_out_buffer_if_needed() call this
   commit removes would always return false (no reset necessary) causing
   ply_renderer_head_map() to destroy the buffer and return an error.

   This results in the splash briefly showing, followed by the core soon after
   trying another map_to_device(), which again briefly shows the splash, etc.
   With the end result being a badly flickering display.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2018-07-10 15:32:04 -04:00
Hans de Goede
447c783046 main: Only activate renderers if the splash uses pixel-displays
Since commit eb147e52b1 ("renderer: support reactivating renderer without
closing it first"), the show_theme() call done by
toggle_between_splash_and_details() will reactivate the renderers after
switching to details mode, causing the drm renderer to switch the screen
from text to graphics mode hiding the details being logged on the console.

This commit fixes this by only calling ply_device_manager_activate_renderers()
and ply_device_manager_deactivate_renderers if the splash uses pixel-displays.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>

https://bugs.freedesktop.org/show_bug.cgi?id=107047
2018-07-10 09:28:55 -04:00
Hans de Goede
778e0fb77a main: move ply_device_manager_deactivate_renderers() into hide_splash()
hide_splash() should be the counter-part of show_splash(). show_splash()
calls ply_device_manager_activate_renderers() (through show_theme()).

2 of the 3 callers of hide_splash() are already calling
ply_device_manager_deactivate_renderers() directly before calling
hide_splash(). This commit moves the deactivate call into hide_splash()
so that it also gets called from the 3th code-path, which is when
the user hits the escape to key to toggle from the splash to details.

It's important that plymouth deactivates its renderers before going
to details, because those renderers can block the kernel from
initializing fbcon, which the kernel will start doing lazily in the
future:

https://lkml.org/lkml/2018/6/26/489.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>

https://bugs.freedesktop.org/show_bug.cgi?id=107047
2018-06-29 16:25:42 -04:00
Hans de Goede
eb147e52b1 renderer: support reactivating renderer without closing it first
At the moment, ply_renderer_activate() doesn't work immediately following
ply_renderer_deactivate().  This is because the renderer isn't marked
inactive until it's closed.

This commit marks the renderer inactive when it's deactivated.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>

https://bugs.freedesktop.org/show_bug.cgi?id=107047
2018-06-29 16:18:42 -04:00
Adam Williamson
014c215889 device-manager: skip graphical renderer setup when details forced
If neither "rhgb" nor "splash" is on the kernel cmdline, then
plymouth forces the "details" splash. This splash is merely
a passthrough plugin, where it makes boot looks like plymouth
isn't even running.

In this case, the code sets PLY_DEVICE_MANAGER_FLAGS_IGNORE_UDEV.
The idea is to not bother waiting for udev events notifying
plymouth when graphics devices show up, since it doesn't need
to use the grpahics devices directly anyway.

Unfortunately, it does still erroneously try to setup graphical
renderers in this case, including the /dev/fb renderer.

Before commit e4f86e3c, these graphical renderers failed because
they were given the wrong device name, but since that fix, they're
suceeding.  We definitely don't want the /dev/fb renderer to
load if we're ignoring udev on efi systems, since during very
early boot /dev/fb is backed by efifb, something we never want to
use.  efifb is supposed to get replaced during the boot process
by other fb implementations like say radeondrmfb, virtiodrmfb or
bochsdrmfb, and some of those implementations can't handle the
transition if /dev/fb is open at switchover time.

This commit adds a new flag to tell the device manager to
not bother trying to setup graphical renderers when details are
forced.

http://bugzilla.redhat.com/1518464
2018-06-07 10:12:25 -04:00
qiangzhao
179ba1e0d8 docs: fix some typos
There are few word spelling errors in the documentation.

This commit addresses those problems.
2018-06-06 13:29:09 -04:00
Ray Strode
43cfbb2a8b Revert "wip! plymouth: stub out drm escrow program"
This reverts commit 12b03bf60e.
2018-05-31 10:52:34 -04:00
Ray Strode
8edd4c36f8 Revert "wip! systemd-units: add unit to switch back to initrd at shutdown"
This reverts commit 82b2b09639.
2018-05-31 10:52:34 -04:00