2
0
mirror of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git synced 2025-09-04 20:19:47 +08:00

drm/msm: make it possible to disable KMS-related code.

If the Adreno device is used in a headless mode, there is no need to
build all KMS components. Build corresponding parts conditionally, only
selecting them if modeset support is actually required.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Patchwork: https://patchwork.freedesktop.org/patch/662581/
Signed-off-by: Rob Clark <robin.clark@oss.qualcomm.com>
This commit is contained in:
Dmitry Baryshkov 2025-07-05 13:02:31 +03:00 committed by Rob Clark
parent e10e1a4010
commit 98290b0a7d
8 changed files with 117 additions and 62 deletions

View File

@ -68,6 +68,14 @@ config DRM_MSM_VALIDATE_XML
Validate XML files with register definitions against rules-fd schema. Validate XML files with register definitions against rules-fd schema.
This option is mostly targeting DRM MSM developers. If unsure, say N. This option is mostly targeting DRM MSM developers. If unsure, say N.
config DRM_MSM_KMS
def_bool n
depends on DRM_MSM
config DRM_MSM_KMS_FBDEV
def_bool DRM_FBDEV_EMULATION
depends on DRM_MSM_KMS
config DRM_MSM_MDSS config DRM_MSM_MDSS
bool bool
depends on DRM_MSM depends on DRM_MSM
@ -76,6 +84,7 @@ config DRM_MSM_MDSS
config DRM_MSM_MDP4 config DRM_MSM_MDP4
bool "Enable MDP4 support in MSM DRM driver" bool "Enable MDP4 support in MSM DRM driver"
depends on DRM_MSM depends on DRM_MSM
select DRM_MSM_KMS
default y default y
help help
Compile in support for the Mobile Display Processor v4 (MDP4) in Compile in support for the Mobile Display Processor v4 (MDP4) in
@ -86,6 +95,7 @@ config DRM_MSM_MDP5
bool "Enable MDP5 support in MSM DRM driver" bool "Enable MDP5 support in MSM DRM driver"
depends on DRM_MSM depends on DRM_MSM
select DRM_MSM_MDSS select DRM_MSM_MDSS
select DRM_MSM_KMS
default y default y
help help
Compile in support for the Mobile Display Processor v5 (MDP5) in Compile in support for the Mobile Display Processor v5 (MDP5) in
@ -96,6 +106,7 @@ config DRM_MSM_DPU
bool "Enable DPU support in MSM DRM driver" bool "Enable DPU support in MSM DRM driver"
depends on DRM_MSM depends on DRM_MSM
select DRM_MSM_MDSS select DRM_MSM_MDSS
select DRM_MSM_KMS
select DRM_DISPLAY_DSC_HELPER select DRM_DISPLAY_DSC_HELPER
default y default y
help help
@ -106,6 +117,7 @@ config DRM_MSM_DPU
config DRM_MSM_DP config DRM_MSM_DP
bool "Enable DisplayPort support in MSM DRM driver" bool "Enable DisplayPort support in MSM DRM driver"
depends on DRM_MSM depends on DRM_MSM
depends on DRM_MSM_KMS
select DRM_DISPLAY_HDMI_AUDIO_HELPER select DRM_DISPLAY_HDMI_AUDIO_HELPER
select RATIONAL select RATIONAL
default y default y
@ -117,6 +129,7 @@ config DRM_MSM_DP
config DRM_MSM_DSI config DRM_MSM_DSI
bool "Enable DSI support in MSM DRM driver" bool "Enable DSI support in MSM DRM driver"
depends on DRM_MSM depends on DRM_MSM
depends on DRM_MSM_KMS
select DRM_PANEL select DRM_PANEL
select DRM_MIPI_DSI select DRM_MIPI_DSI
select DRM_DISPLAY_DSC_HELPER select DRM_DISPLAY_DSC_HELPER
@ -172,6 +185,7 @@ config DRM_MSM_DSI_7NM_PHY
config DRM_MSM_HDMI config DRM_MSM_HDMI
bool "Enable HDMI support in MSM DRM driver" bool "Enable HDMI support in MSM DRM driver"
depends on DRM_MSM depends on DRM_MSM
depends on DRM_MSM_KMS
default y default y
select DRM_DISPLAY_HDMI_HELPER select DRM_DISPLAY_HDMI_HELPER
select DRM_DISPLAY_HDMI_STATE_HELPER select DRM_DISPLAY_HDMI_STATE_HELPER

View File

@ -100,18 +100,15 @@ msm-display-$(CONFIG_DRM_MSM_DPU) += \
msm-display-$(CONFIG_DRM_MSM_MDSS) += \ msm-display-$(CONFIG_DRM_MSM_MDSS) += \
msm_mdss.o \ msm_mdss.o \
msm-display-y += \ msm-display-$(CONFIG_DRM_MSM_KMS) += \
disp/mdp_format.o \ disp/mdp_format.o \
disp/mdp_kms.o \ disp/mdp_kms.o \
disp/msm_disp_snapshot.o \ disp/msm_disp_snapshot.o \
disp/msm_disp_snapshot_util.o \ disp/msm_disp_snapshot_util.o \
msm-y += \ msm-y += \
msm_atomic.o \
msm_atomic_tracepoints.o \
msm_debugfs.o \ msm_debugfs.o \
msm_drv.o \ msm_drv.o \
msm_fb.o \
msm_fence.o \ msm_fence.o \
msm_gem.o \ msm_gem.o \
msm_gem_prime.o \ msm_gem_prime.o \
@ -122,7 +119,6 @@ msm-y += \
msm_gpu_devfreq.o \ msm_gpu_devfreq.o \
msm_io_utils.o \ msm_io_utils.o \
msm_iommu.o \ msm_iommu.o \
msm_kms.o \
msm_perf.o \ msm_perf.o \
msm_rd.o \ msm_rd.o \
msm_ringbuffer.o \ msm_ringbuffer.o \
@ -130,13 +126,17 @@ msm-y += \
msm_syncobj.o \ msm_syncobj.o \
msm_gpu_tracepoints.o \ msm_gpu_tracepoints.o \
msm-$(CONFIG_DRM_FBDEV_EMULATION) += msm_fbdev.o msm-$(CONFIG_DRM_MSM_KMS) += \
msm_atomic.o \
msm_atomic_tracepoints.o \
msm_fb.o \
msm_kms.o \
msm-display-$(CONFIG_DEBUG_FS) += \ msm-$(CONFIG_DRM_MSM_KMS_FBDEV) += msm_fbdev.o
dp/dp_debug.o
msm-display-$(CONFIG_DRM_MSM_DP)+= dp/dp_aux.o \ msm-display-$(CONFIG_DRM_MSM_DP)+= dp/dp_aux.o \
dp/dp_ctrl.o \ dp/dp_ctrl.o \
dp/dp_debug.o \
dp/dp_display.o \ dp/dp_display.o \
dp/dp_drm.o \ dp/dp_drm.o \
dp/dp_link.o \ dp/dp_link.o \
@ -159,7 +159,8 @@ msm-display-$(CONFIG_DRM_MSM_DSI_14NM_PHY) += dsi/phy/dsi_phy_14nm.o
msm-display-$(CONFIG_DRM_MSM_DSI_10NM_PHY) += dsi/phy/dsi_phy_10nm.o msm-display-$(CONFIG_DRM_MSM_DSI_10NM_PHY) += dsi/phy/dsi_phy_10nm.o
msm-display-$(CONFIG_DRM_MSM_DSI_7NM_PHY) += dsi/phy/dsi_phy_7nm.o msm-display-$(CONFIG_DRM_MSM_DSI_7NM_PHY) += dsi/phy/dsi_phy_7nm.o
msm-y += $(adreno-y) $(msm-display-y) msm-y += $(adreno-y)
msm-$(CONFIG_DRM_MSM_KMS) += $(msm-display-y)
obj-$(CONFIG_DRM_MSM) += msm.o obj-$(CONFIG_DRM_MSM) += msm.o

View File

@ -742,7 +742,7 @@ void dpu_crtc_frame_event_cb(struct drm_crtc *crtc, u32 event)
fevent->event = event; fevent->event = event;
fevent->crtc = crtc; fevent->crtc = crtc;
fevent->ts = ktime_get(); fevent->ts = ktime_get();
kthread_queue_work(priv->event_thread[crtc_id].worker, &fevent->work); kthread_queue_work(priv->kms->event_thread[crtc_id].worker, &fevent->work);
} }
/** /**
@ -911,7 +911,7 @@ static void dpu_crtc_atomic_flush(struct drm_crtc *crtc,
dev = crtc->dev; dev = crtc->dev;
priv = dev->dev_private; priv = dev->dev_private;
if (crtc->index >= ARRAY_SIZE(priv->event_thread)) { if (crtc->index >= ARRAY_SIZE(priv->kms->event_thread)) {
DPU_ERROR("invalid crtc index[%d]\n", crtc->index); DPU_ERROR("invalid crtc index[%d]\n", crtc->index);
return; return;
} }

View File

@ -5,6 +5,8 @@
#define pr_fmt(fmt)"[drm-dp] %s: " fmt, __func__ #define pr_fmt(fmt)"[drm-dp] %s: " fmt, __func__
#ifdef CONFIG_DEBUG_FS
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <drm/drm_connector.h> #include <drm/drm_connector.h>
#include <drm/drm_file.h> #include <drm/drm_file.h>
@ -234,3 +236,5 @@ int msm_dp_debug_init(struct device *dev, struct msm_dp_panel *panel,
return 0; return 0;
} }
#endif

View File

@ -117,6 +117,36 @@ static const struct file_operations msm_gpu_fops = {
.release = msm_gpu_release, .release = msm_gpu_release,
}; };
#ifdef CONFIG_DRM_MSM_KMS
static int msm_fb_show(struct seq_file *m, void *arg)
{
struct drm_info_node *node = m->private;
struct drm_device *dev = node->minor->dev;
struct drm_framebuffer *fb, *fbdev_fb = NULL;
if (dev->fb_helper && dev->fb_helper->fb) {
seq_puts(m, "fbcon ");
fbdev_fb = dev->fb_helper->fb;
msm_framebuffer_describe(fbdev_fb, m);
}
mutex_lock(&dev->mode_config.fb_lock);
list_for_each_entry(fb, &dev->mode_config.fb_list, head) {
if (fb == fbdev_fb)
continue;
seq_puts(m, "user ");
msm_framebuffer_describe(fb, m);
}
mutex_unlock(&dev->mode_config.fb_lock);
return 0;
}
static struct drm_info_list msm_kms_debugfs_list[] = {
{ "fb", msm_fb_show },
};
/* /*
* Display Snapshot: * Display Snapshot:
*/ */
@ -180,6 +210,27 @@ static const struct file_operations msm_kms_fops = {
.release = msm_kms_release, .release = msm_kms_release,
}; };
static void msm_debugfs_kms_init(struct drm_minor *minor)
{
struct drm_device *dev = minor->dev;
struct msm_drm_private *priv = dev->dev_private;
drm_debugfs_create_files(msm_kms_debugfs_list,
ARRAY_SIZE(msm_kms_debugfs_list),
minor->debugfs_root, minor);
debugfs_create_file("kms", 0400, minor->debugfs_root,
dev, &msm_kms_fops);
if (priv->kms->funcs->debugfs_init)
priv->kms->funcs->debugfs_init(priv->kms, minor);
}
#else /* ! CONFIG_DRM_MSM_KMS */
static void msm_debugfs_kms_init(struct drm_minor *minor)
{
}
#endif
/* /*
* Other debugfs: * Other debugfs:
*/ */
@ -267,40 +318,11 @@ static int msm_mm_show(struct seq_file *m, void *arg)
return 0; return 0;
} }
static int msm_fb_show(struct seq_file *m, void *arg)
{
struct drm_info_node *node = m->private;
struct drm_device *dev = node->minor->dev;
struct drm_framebuffer *fb, *fbdev_fb = NULL;
if (dev->fb_helper && dev->fb_helper->fb) {
seq_printf(m, "fbcon ");
fbdev_fb = dev->fb_helper->fb;
msm_framebuffer_describe(fbdev_fb, m);
}
mutex_lock(&dev->mode_config.fb_lock);
list_for_each_entry(fb, &dev->mode_config.fb_list, head) {
if (fb == fbdev_fb)
continue;
seq_printf(m, "user ");
msm_framebuffer_describe(fb, m);
}
mutex_unlock(&dev->mode_config.fb_lock);
return 0;
}
static struct drm_info_list msm_debugfs_list[] = { static struct drm_info_list msm_debugfs_list[] = {
{"gem", msm_gem_show}, {"gem", msm_gem_show},
{ "mm", msm_mm_show }, { "mm", msm_mm_show },
}; };
static struct drm_info_list msm_kms_debugfs_list[] = {
{ "fb", msm_fb_show },
};
static int late_init_minor(struct drm_minor *minor) static int late_init_minor(struct drm_minor *minor)
{ {
int ret; int ret;
@ -375,20 +397,12 @@ void msm_debugfs_init(struct drm_minor *minor)
if (priv->gpu_pdev) if (priv->gpu_pdev)
msm_debugfs_gpu_init(minor); msm_debugfs_gpu_init(minor);
if (priv->kms) { if (priv->kms)
drm_debugfs_create_files(msm_kms_debugfs_list, msm_debugfs_kms_init(minor);
ARRAY_SIZE(msm_kms_debugfs_list),
minor->debugfs_root, minor);
debugfs_create_file("kms", S_IRUSR, minor->debugfs_root,
dev, &msm_kms_fops);
}
debugfs_create_file("shrink", S_IRWXU, minor->debugfs_root, debugfs_create_file("shrink", S_IRWXU, minor->debugfs_root,
dev, &shrink_fops); dev, &shrink_fops);
if (priv->kms && priv->kms->funcs->debugfs_init)
priv->kms->funcs->debugfs_init(priv->kms, minor);
fault_create_debugfs_attr("fail_gem_alloc", minor->debugfs_root, fault_create_debugfs_attr("fail_gem_alloc", minor->debugfs_root,
&fail_gem_alloc); &fail_gem_alloc);
fault_create_debugfs_attr("fail_gem_iova", minor->debugfs_root, fault_create_debugfs_attr("fail_gem_iova", minor->debugfs_root,

View File

@ -70,12 +70,6 @@ enum msm_dsi_controller {
#define MSM_GPU_MAX_RINGS 4 #define MSM_GPU_MAX_RINGS 4
/* Commit/Event thread specific structure */
struct msm_drm_thread {
struct drm_device *dev;
struct kthread_worker *worker;
};
struct msm_drm_private { struct msm_drm_private {
struct drm_device *dev; struct drm_device *dev;
@ -165,8 +159,6 @@ struct msm_drm_private {
struct mutex lock; struct mutex lock;
} lru; } lru;
struct msm_drm_thread event_thread[MAX_CRTCS];
struct notifier_block vmap_notifier; struct notifier_block vmap_notifier;
struct shrinker *shrinker; struct shrinker *shrinker;
@ -272,7 +264,7 @@ struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,
struct drm_framebuffer * msm_alloc_stolen_fb(struct drm_device *dev, struct drm_framebuffer * msm_alloc_stolen_fb(struct drm_device *dev,
int w, int h, int p, uint32_t format); int w, int h, int p, uint32_t format);
#ifdef CONFIG_DRM_FBDEV_EMULATION #ifdef CONFIG_DRM_MSM_KMS_FBDEV
int msm_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper, int msm_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
struct drm_fb_helper_surface_size *sizes); struct drm_fb_helper_surface_size *sizes);
#define MSM_FBDEV_DRIVER_OPS \ #define MSM_FBDEV_DRIVER_OPS \

View File

@ -246,8 +246,8 @@ void msm_drm_kms_uninit(struct device *dev)
/* clean up event worker threads */ /* clean up event worker threads */
for (i = 0; i < MAX_CRTCS; i++) { for (i = 0; i < MAX_CRTCS; i++) {
if (priv->event_thread[i].worker) if (kms->event_thread[i].worker)
kthread_destroy_worker(priv->event_thread[i].worker); kthread_destroy_worker(kms->event_thread[i].worker);
} }
drm_kms_helper_poll_fini(ddev); drm_kms_helper_poll_fini(ddev);
@ -300,7 +300,7 @@ int msm_drm_kms_init(struct device *dev, const struct drm_driver *drv)
struct msm_drm_thread *ev_thread; struct msm_drm_thread *ev_thread;
/* initialize event thread */ /* initialize event thread */
ev_thread = &priv->event_thread[drm_crtc_index(crtc)]; ev_thread = &kms->event_thread[drm_crtc_index(crtc)];
ev_thread->dev = ddev; ev_thread->dev = ddev;
ev_thread->worker = kthread_run_worker(0, "crtc_event:%d", crtc->base.id); ev_thread->worker = kthread_run_worker(0, "crtc_event:%d", crtc->base.id);
if (IS_ERR(ev_thread->worker)) { if (IS_ERR(ev_thread->worker)) {

View File

@ -13,6 +13,8 @@
#include "msm_drv.h" #include "msm_drv.h"
#ifdef CONFIG_DRM_MSM_KMS
#define MAX_PLANE 4 #define MAX_PLANE 4
/* As there are different display controller blocks depending on the /* As there are different display controller blocks depending on the
@ -127,6 +129,12 @@ struct msm_pending_timer {
unsigned crtc_idx; unsigned crtc_idx;
}; };
/* Commit/Event thread specific structure */
struct msm_drm_thread {
struct drm_device *dev;
struct kthread_worker *worker;
};
struct msm_kms { struct msm_kms {
const struct msm_kms_funcs *funcs; const struct msm_kms_funcs *funcs;
struct drm_device *dev; struct drm_device *dev;
@ -161,6 +169,7 @@ struct msm_kms {
struct msm_pending_timer pending_timers[MAX_CRTCS]; struct msm_pending_timer pending_timers[MAX_CRTCS];
struct workqueue_struct *wq; struct workqueue_struct *wq;
struct msm_drm_thread event_thread[MAX_CRTCS];
}; };
static inline int msm_kms_init(struct msm_kms *kms, static inline int msm_kms_init(struct msm_kms *kms,
@ -210,4 +219,25 @@ void msm_drm_kms_post_init(struct device *dev);
void msm_drm_kms_unregister(struct device *dev); void msm_drm_kms_unregister(struct device *dev);
void msm_drm_kms_uninit(struct device *dev); void msm_drm_kms_uninit(struct device *dev);
#else /* ! CONFIG_DRM_MSM_KMS */
static inline int msm_drm_kms_init(struct device *dev, const struct drm_driver *drv)
{
return -ENODEV;
}
static inline void msm_drm_kms_post_init(struct device *dev)
{
}
static inline void msm_drm_kms_unregister(struct device *dev)
{
}
static inline void msm_drm_kms_uninit(struct device *dev)
{
}
#endif
#endif /* __MSM_KMS_H__ */ #endif /* __MSM_KMS_H__ */