From b3e49987c5706612ee342c685dea799be596df6a Mon Sep 17 00:00:00 2001 From: Naoto Yamaguchi Date: Sun, 23 Apr 2023 20:25:45 +0900 Subject: Enable drm-lease support at psplash The upstream version of psplash is supporting fb based splash screen. On the other hand, drm lease infrastructure is not support fb. This patch enable drm-lease support at psplash. This work contributed by Hiroyuki Ishii at CES2023 demo development. Bug-AGL: SPEC-4766 Change-Id: I50b382c7f8ca4b46a8fb06fd649d0cfa49800c6d Signed-off-by: Naoto Yamaguchi --- .../files/0016-Imprement-drm-lease-support.patch | 189 +++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 meta-agl-drm-lease/recipes-core/psplash/files/0016-Imprement-drm-lease-support.patch (limited to 'meta-agl-drm-lease/recipes-core/psplash/files/0016-Imprement-drm-lease-support.patch') diff --git a/meta-agl-drm-lease/recipes-core/psplash/files/0016-Imprement-drm-lease-support.patch b/meta-agl-drm-lease/recipes-core/psplash/files/0016-Imprement-drm-lease-support.patch new file mode 100644 index 00000000..6a4bf387 --- /dev/null +++ b/meta-agl-drm-lease/recipes-core/psplash/files/0016-Imprement-drm-lease-support.patch @@ -0,0 +1,189 @@ +From 0fcca6600c7d74ec13986d3e9e795f4a7c8afe59 Mon Sep 17 00:00:00 2001 +From: Hiroyuki Ishii +Date: Tue, 27 Dec 2022 16:43:46 +0900 +Subject: [PATCH 16/17] Imprement drm-lease support + +Basic support to utilize drm-lease device via drm-lease-manager. + +Known issue: +- --angle option does not work correctly with drm-lease enabled + +Signed-off-by: Hiroyuki Ishii +--- + Makefile.am | 5 +++++ + configure.ac | 9 +++++++++ + psplash-drm-lease.h | 10 ++++++++++ + psplash-drm.c | 44 +++++++++++++++++++++++++++++++++++++++----- + psplash.c | 12 ++++++++++++ + 5 files changed, 75 insertions(+), 5 deletions(-) + create mode 100644 psplash-drm-lease.h + +diff --git a/Makefile.am b/Makefile.am +index c3d4f03..3657889 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -19,6 +19,11 @@ psplash_CPPFLAGS += $(LIBDRM_CFLAGS) -DENABLE_DRM + psplash_LDFLAGS += $(LIBDRM_LIBS) + endif + ++if ENABLE_DRM_LEASE ++psplash_CPPFLAGS += $(LIBDRM_LEASE_CFLAGS) -DENABLE_DRM_LEASE ++psplash_LDFLAGS += $(LIBDRM_LEASE_LIBS) ++endif ++ + if HAVE_SYSTEMD + psplash_CPPFLAGS += $(SYSTEMD_CFLAGS) -DHAVE_SYSTEMD + psplash_LDFLAGS += $(SYSTEMD_LIBS) +diff --git a/configure.ac b/configure.ac +index 2e5c4f5..1a752e3 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -21,6 +21,15 @@ AS_IF([test "x$enable_drm" = "xyes"], [ + + AM_CONDITIONAL([ENABLE_DRM], [test "x$enable_drm" = "xyes"]) + ++AC_ARG_ENABLE(drm-lease, ++ AS_HELP_STRING([--enable-drm-lease], [enable drm-lease (default is 'no')])) ++ ++AS_IF([test "x$enable_drm_lease" = "xyes"], [ ++ PKG_CHECK_MODULES(LIBDRM_LEASE, libdlmclient) ++]) ++ ++AM_CONDITIONAL([ENABLE_DRM_LEASE], [test "x$enable_drm_lease" = "xyes"]) ++ + AC_ARG_WITH([systemd], AS_HELP_STRING([--with-systemd], [Build with systemd + support])) + +diff --git a/psplash-drm-lease.h b/psplash-drm-lease.h +new file mode 100644 +index 0000000..46289c3 +--- /dev/null ++++ b/psplash-drm-lease.h +@@ -0,0 +1,10 @@ ++#ifndef _HAVE_PSPLASH_DRM_LEASE_H ++#define _HAVE_PSPLASH_DRM_LEASE_H ++#ifdef ENABLE_DRM_LEASE ++ ++#include ++ ++void drm_set_lease_name(char *); ++ ++#endif // ENABLE_DRM_LEASE ++#endif // _HAVE_PSPLASH_DRM_LEASE_H +diff --git a/psplash-drm.c b/psplash-drm.c +index fcb7507..a5aff90 100644 +--- a/psplash-drm.c ++++ b/psplash-drm.c +@@ -39,6 +39,9 @@ + #include + #include + #include "psplash-drm.h" ++#ifdef ENABLE_DRM_LEASE ++#include "psplash-drm-lease.h" ++#endif + + #define MIN(a,b) ((a) < (b) ? (a) : (b)) + +@@ -53,6 +56,10 @@ static int modeset_setup_dev(int fd, drmModeRes *res, drmModeConnector *conn, + static int modeset_open(int *out, const char *node); + static int modeset_prepare(int fd); + ++#ifdef ENABLE_DRM_LEASE ++char *drm_lease_name; ++#endif ++ + /* + * When the linux kernel detects a graphics-card on your machine, it loads the + * correct device driver (located in kernel-tree at ./drivers/gpu/drm/) and +@@ -662,6 +669,7 @@ PSplashDRM* psplash_drm_new(int angle, int dev_id) + perror("malloc"); + goto error; + } ++ drm->fd = 0; + drm->canvas.priv = drm; + drm->canvas.flip = psplash_drm_flip; + +@@ -670,12 +678,30 @@ PSplashDRM* psplash_drm_new(int angle, int dev_id) + card[13] = dev_id + 48; + } + +- fprintf(stderr, "using card '%s'\n", card); ++#ifdef ENABLE_DRM_LEASE ++ if (drm_lease_name) { ++ fprintf(stderr, "using drm lease '%s'\n", drm_lease_name); ++ struct dlm_lease *lease = dlm_get_lease(drm_lease_name); ++ if (lease) { ++ drm->fd = dlm_lease_fd(lease); ++ if (!drm->fd) ++ dlm_release_lease(lease); ++ } ++ if (!drm->fd) { ++ fprintf(stderr, "Could not get DRM lease %s\n", drm_lease_name); ++ goto error; ++ } ++ } ++#endif + +- /* open the DRM device */ +- ret = modeset_open(&drm->fd, card); +- if (ret) +- goto error; ++ if (!drm->fd) { ++ fprintf(stderr, "using card '%s'\n", card); ++ ++ /* open the DRM device */ ++ ret = modeset_open(&drm->fd, card); ++ if (ret) ++ goto error; ++ } + + /* prepare all connectors and CRTCs */ + ret = modeset_prepare(drm->fd); +@@ -758,6 +784,14 @@ void psplash_drm_destroy(PSplashDRM *drm) + free(drm); + } + ++#ifdef ENABLE_DRM_LEASE ++void drm_set_lease_name (char *name) { ++ if (!name) ++ return; ++ drm_lease_name = strdup(name); ++} ++#endif ++ + /* + * I hope this was a short but easy overview of the DRM modesetting API. The DRM + * API offers much more capabilities including: +diff --git a/psplash.c b/psplash.c +index ebf8d7a..4aa650d 100644 +--- a/psplash.c ++++ b/psplash.c +@@ -15,6 +15,9 @@ + #ifdef ENABLE_DRM + #include "psplash-drm.h" + #endif ++#ifdef ENABLE_DRM_LEASE ++#include "psplash-drm-lease.h" ++#endif + #include "psplash-config.h" + #include "psplash-colors.h" + #include "psplash-poky-img.h" +@@ -267,6 +270,15 @@ main (int argc, char** argv) + continue; + } + #endif ++#ifdef ENABLE_DRM_LEASE ++ if (!strcmp(argv[i],"--drm-lease")) ++ { ++ if (++i >= argc) goto fail; ++ drm_set_lease_name(argv[i]); ++ use_drm = 1; ++ continue; ++ } ++#endif + + fail: + fprintf(stderr, +-- +2.25.1 + -- cgit 1.2.3-korg