From 523b3658aa8efa746417e916c987de23740ce313 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Tue, 23 Feb 2021 18:19:33 +0100 Subject: [PATCH] xf86drmMode: add drmIsKMS If a device has a primary node, it doesn't necessarily mean it's suitable for KMS usage. For instance, render-only drivers also expose primary nodes. The check is extracted from Weston [1]. The motivation for this new function is two-fold: - Avoid an unnecessary GETRESOURCES call. To check whether a primary node is suitable for KMS, we don't actually need to retrieve the object IDs we just need to check the counts. - Avoid confusion in user-space and make sure user-space implements the check properly. For instance, wlroots doesn't [2]: it uses drmGetVersion which succeeds with render-only drivers. [1]: https://gitlab.freedesktop.org/wayland/weston/-/blob/master/libweston/backend-drm/drm.c#L2689 [2]: https://github.com/swaywm/wlroots/blob/a290d7a78dc36275e24e54f84570f37a66dc67a4/backend/session/session.c#L268 Signed-off-by: Simon Ser Reviewed-by: Pekka Paalanen Reviewed-by: Emil Velikov --- core-symbols.txt | 1 + xf86drmMode.c | 10 ++++++++++ xf86drmMode.h | 7 +++++++ 3 files changed, 18 insertions(+) diff --git a/core-symbols.txt b/core-symbols.txt index 1ff4ecaa..410054b3 100644 --- a/core-symbols.txt +++ b/core-symbols.txt @@ -83,6 +83,7 @@ drmHashInsert drmHashLookup drmHashNext drmIoctl +drmIsKMS drmIsMaster drmMalloc drmMap diff --git a/xf86drmMode.c b/xf86drmMode.c index 3d6bdfd6..c3920b91 100644 --- a/xf86drmMode.c +++ b/xf86drmMode.c @@ -146,6 +146,16 @@ drm_public void drmModeFreeEncoder(drmModeEncoderPtr ptr) * ModeSetting functions. */ +drm_public int drmIsKMS(int fd) +{ + struct drm_mode_card_res res = {0}; + + if (drmIoctl(fd, DRM_IOCTL_MODE_GETRESOURCES, &res) != 0) + return 0; + + return res.count_crtcs > 0 && res.count_connectors > 0 && res.count_encoders > 0; +} + drm_public drmModeResPtr drmModeGetResources(int fd) { struct drm_mode_card_res res, counts; diff --git a/xf86drmMode.h b/xf86drmMode.h index baf3d5dc..72696782 100644 --- a/xf86drmMode.h +++ b/xf86drmMode.h @@ -259,6 +259,13 @@ extern void drmModeFreeEncoder( drmModeEncoderPtr ptr ); extern void drmModeFreePlane( drmModePlanePtr ptr ); extern void drmModeFreePlaneResources(drmModePlaneResPtr ptr); +/** + * Check whether the DRM node supports Kernel Mode-Setting. + * + * Returns 1 if suitable for KMS, 0 otherwise. + */ +extern int drmIsKMS(int fd); + /** * Retrieves all of the resources associated with a card. */