Skip to content

Commit 98290b0

Browse files
lumagRob Clark
authored andcommitted
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 <[email protected]> Patchwork: https://patchwork.freedesktop.org/patch/662581/ Signed-off-by: Rob Clark <[email protected]>
1 parent e10e1a4 commit 98290b0

File tree

8 files changed

+117
-62
lines changed

8 files changed

+117
-62
lines changed

drivers/gpu/drm/msm/Kconfig

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,14 @@ config DRM_MSM_VALIDATE_XML
6868
Validate XML files with register definitions against rules-fd schema.
6969
This option is mostly targeting DRM MSM developers. If unsure, say N.
7070

71+
config DRM_MSM_KMS
72+
def_bool n
73+
depends on DRM_MSM
74+
75+
config DRM_MSM_KMS_FBDEV
76+
def_bool DRM_FBDEV_EMULATION
77+
depends on DRM_MSM_KMS
78+
7179
config DRM_MSM_MDSS
7280
bool
7381
depends on DRM_MSM
@@ -76,6 +84,7 @@ config DRM_MSM_MDSS
7684
config DRM_MSM_MDP4
7785
bool "Enable MDP4 support in MSM DRM driver"
7886
depends on DRM_MSM
87+
select DRM_MSM_KMS
7988
default y
8089
help
8190
Compile in support for the Mobile Display Processor v4 (MDP4) in
@@ -86,6 +95,7 @@ config DRM_MSM_MDP5
8695
bool "Enable MDP5 support in MSM DRM driver"
8796
depends on DRM_MSM
8897
select DRM_MSM_MDSS
98+
select DRM_MSM_KMS
8999
default y
90100
help
91101
Compile in support for the Mobile Display Processor v5 (MDP5) in
@@ -96,6 +106,7 @@ config DRM_MSM_DPU
96106
bool "Enable DPU support in MSM DRM driver"
97107
depends on DRM_MSM
98108
select DRM_MSM_MDSS
109+
select DRM_MSM_KMS
99110
select DRM_DISPLAY_DSC_HELPER
100111
default y
101112
help
@@ -106,6 +117,7 @@ config DRM_MSM_DPU
106117
config DRM_MSM_DP
107118
bool "Enable DisplayPort support in MSM DRM driver"
108119
depends on DRM_MSM
120+
depends on DRM_MSM_KMS
109121
select DRM_DISPLAY_HDMI_AUDIO_HELPER
110122
select RATIONAL
111123
default y
@@ -117,6 +129,7 @@ config DRM_MSM_DP
117129
config DRM_MSM_DSI
118130
bool "Enable DSI support in MSM DRM driver"
119131
depends on DRM_MSM
132+
depends on DRM_MSM_KMS
120133
select DRM_PANEL
121134
select DRM_MIPI_DSI
122135
select DRM_DISPLAY_DSC_HELPER
@@ -172,6 +185,7 @@ config DRM_MSM_DSI_7NM_PHY
172185
config DRM_MSM_HDMI
173186
bool "Enable HDMI support in MSM DRM driver"
174187
depends on DRM_MSM
188+
depends on DRM_MSM_KMS
175189
default y
176190
select DRM_DISPLAY_HDMI_HELPER
177191
select DRM_DISPLAY_HDMI_STATE_HELPER

drivers/gpu/drm/msm/Makefile

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -100,18 +100,15 @@ msm-display-$(CONFIG_DRM_MSM_DPU) += \
100100
msm-display-$(CONFIG_DRM_MSM_MDSS) += \
101101
msm_mdss.o \
102102

103-
msm-display-y += \
103+
msm-display-$(CONFIG_DRM_MSM_KMS) += \
104104
disp/mdp_format.o \
105105
disp/mdp_kms.o \
106106
disp/msm_disp_snapshot.o \
107107
disp/msm_disp_snapshot_util.o \
108108

109109
msm-y += \
110-
msm_atomic.o \
111-
msm_atomic_tracepoints.o \
112110
msm_debugfs.o \
113111
msm_drv.o \
114-
msm_fb.o \
115112
msm_fence.o \
116113
msm_gem.o \
117114
msm_gem_prime.o \
@@ -122,21 +119,24 @@ msm-y += \
122119
msm_gpu_devfreq.o \
123120
msm_io_utils.o \
124121
msm_iommu.o \
125-
msm_kms.o \
126122
msm_perf.o \
127123
msm_rd.o \
128124
msm_ringbuffer.o \
129125
msm_submitqueue.o \
130126
msm_syncobj.o \
131127
msm_gpu_tracepoints.o \
132128

133-
msm-$(CONFIG_DRM_FBDEV_EMULATION) += msm_fbdev.o
129+
msm-$(CONFIG_DRM_MSM_KMS) += \
130+
msm_atomic.o \
131+
msm_atomic_tracepoints.o \
132+
msm_fb.o \
133+
msm_kms.o \
134134

135-
msm-display-$(CONFIG_DEBUG_FS) += \
136-
dp/dp_debug.o
135+
msm-$(CONFIG_DRM_MSM_KMS_FBDEV) += msm_fbdev.o
137136

138137
msm-display-$(CONFIG_DRM_MSM_DP)+= dp/dp_aux.o \
139138
dp/dp_ctrl.o \
139+
dp/dp_debug.o \
140140
dp/dp_display.o \
141141
dp/dp_drm.o \
142142
dp/dp_link.o \
@@ -159,7 +159,8 @@ msm-display-$(CONFIG_DRM_MSM_DSI_14NM_PHY) += dsi/phy/dsi_phy_14nm.o
159159
msm-display-$(CONFIG_DRM_MSM_DSI_10NM_PHY) += dsi/phy/dsi_phy_10nm.o
160160
msm-display-$(CONFIG_DRM_MSM_DSI_7NM_PHY) += dsi/phy/dsi_phy_7nm.o
161161

162-
msm-y += $(adreno-y) $(msm-display-y)
162+
msm-y += $(adreno-y)
163+
msm-$(CONFIG_DRM_MSM_KMS) += $(msm-display-y)
163164

164165
obj-$(CONFIG_DRM_MSM) += msm.o
165166

drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -742,7 +742,7 @@ void dpu_crtc_frame_event_cb(struct drm_crtc *crtc, u32 event)
742742
fevent->event = event;
743743
fevent->crtc = crtc;
744744
fevent->ts = ktime_get();
745-
kthread_queue_work(priv->event_thread[crtc_id].worker, &fevent->work);
745+
kthread_queue_work(priv->kms->event_thread[crtc_id].worker, &fevent->work);
746746
}
747747

748748
/**
@@ -911,7 +911,7 @@ static void dpu_crtc_atomic_flush(struct drm_crtc *crtc,
911911
dev = crtc->dev;
912912
priv = dev->dev_private;
913913

914-
if (crtc->index >= ARRAY_SIZE(priv->event_thread)) {
914+
if (crtc->index >= ARRAY_SIZE(priv->kms->event_thread)) {
915915
DPU_ERROR("invalid crtc index[%d]\n", crtc->index);
916916
return;
917917
}

drivers/gpu/drm/msm/dp/dp_debug.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
#define pr_fmt(fmt)"[drm-dp] %s: " fmt, __func__
77

8+
#ifdef CONFIG_DEBUG_FS
9+
810
#include <linux/debugfs.h>
911
#include <drm/drm_connector.h>
1012
#include <drm/drm_file.h>
@@ -234,3 +236,5 @@ int msm_dp_debug_init(struct device *dev, struct msm_dp_panel *panel,
234236

235237
return 0;
236238
}
239+
240+
#endif

drivers/gpu/drm/msm/msm_debugfs.c

Lines changed: 53 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,36 @@ static const struct file_operations msm_gpu_fops = {
117117
.release = msm_gpu_release,
118118
};
119119

120+
#ifdef CONFIG_DRM_MSM_KMS
121+
static int msm_fb_show(struct seq_file *m, void *arg)
122+
{
123+
struct drm_info_node *node = m->private;
124+
struct drm_device *dev = node->minor->dev;
125+
struct drm_framebuffer *fb, *fbdev_fb = NULL;
126+
127+
if (dev->fb_helper && dev->fb_helper->fb) {
128+
seq_puts(m, "fbcon ");
129+
fbdev_fb = dev->fb_helper->fb;
130+
msm_framebuffer_describe(fbdev_fb, m);
131+
}
132+
133+
mutex_lock(&dev->mode_config.fb_lock);
134+
list_for_each_entry(fb, &dev->mode_config.fb_list, head) {
135+
if (fb == fbdev_fb)
136+
continue;
137+
138+
seq_puts(m, "user ");
139+
msm_framebuffer_describe(fb, m);
140+
}
141+
mutex_unlock(&dev->mode_config.fb_lock);
142+
143+
return 0;
144+
}
145+
146+
static struct drm_info_list msm_kms_debugfs_list[] = {
147+
{ "fb", msm_fb_show },
148+
};
149+
120150
/*
121151
* Display Snapshot:
122152
*/
@@ -180,6 +210,27 @@ static const struct file_operations msm_kms_fops = {
180210
.release = msm_kms_release,
181211
};
182212

213+
static void msm_debugfs_kms_init(struct drm_minor *minor)
214+
{
215+
struct drm_device *dev = minor->dev;
216+
struct msm_drm_private *priv = dev->dev_private;
217+
218+
drm_debugfs_create_files(msm_kms_debugfs_list,
219+
ARRAY_SIZE(msm_kms_debugfs_list),
220+
minor->debugfs_root, minor);
221+
debugfs_create_file("kms", 0400, minor->debugfs_root,
222+
dev, &msm_kms_fops);
223+
224+
if (priv->kms->funcs->debugfs_init)
225+
priv->kms->funcs->debugfs_init(priv->kms, minor);
226+
227+
}
228+
#else /* ! CONFIG_DRM_MSM_KMS */
229+
static void msm_debugfs_kms_init(struct drm_minor *minor)
230+
{
231+
}
232+
#endif
233+
183234
/*
184235
* Other debugfs:
185236
*/
@@ -267,40 +318,11 @@ static int msm_mm_show(struct seq_file *m, void *arg)
267318
return 0;
268319
}
269320

270-
static int msm_fb_show(struct seq_file *m, void *arg)
271-
{
272-
struct drm_info_node *node = m->private;
273-
struct drm_device *dev = node->minor->dev;
274-
struct drm_framebuffer *fb, *fbdev_fb = NULL;
275-
276-
if (dev->fb_helper && dev->fb_helper->fb) {
277-
seq_printf(m, "fbcon ");
278-
fbdev_fb = dev->fb_helper->fb;
279-
msm_framebuffer_describe(fbdev_fb, m);
280-
}
281-
282-
mutex_lock(&dev->mode_config.fb_lock);
283-
list_for_each_entry(fb, &dev->mode_config.fb_list, head) {
284-
if (fb == fbdev_fb)
285-
continue;
286-
287-
seq_printf(m, "user ");
288-
msm_framebuffer_describe(fb, m);
289-
}
290-
mutex_unlock(&dev->mode_config.fb_lock);
291-
292-
return 0;
293-
}
294-
295321
static struct drm_info_list msm_debugfs_list[] = {
296322
{"gem", msm_gem_show},
297323
{ "mm", msm_mm_show },
298324
};
299325

300-
static struct drm_info_list msm_kms_debugfs_list[] = {
301-
{ "fb", msm_fb_show },
302-
};
303-
304326
static int late_init_minor(struct drm_minor *minor)
305327
{
306328
int ret;
@@ -375,20 +397,12 @@ void msm_debugfs_init(struct drm_minor *minor)
375397
if (priv->gpu_pdev)
376398
msm_debugfs_gpu_init(minor);
377399

378-
if (priv->kms) {
379-
drm_debugfs_create_files(msm_kms_debugfs_list,
380-
ARRAY_SIZE(msm_kms_debugfs_list),
381-
minor->debugfs_root, minor);
382-
debugfs_create_file("kms", S_IRUSR, minor->debugfs_root,
383-
dev, &msm_kms_fops);
384-
}
400+
if (priv->kms)
401+
msm_debugfs_kms_init(minor);
385402

386403
debugfs_create_file("shrink", S_IRWXU, minor->debugfs_root,
387404
dev, &shrink_fops);
388405

389-
if (priv->kms && priv->kms->funcs->debugfs_init)
390-
priv->kms->funcs->debugfs_init(priv->kms, minor);
391-
392406
fault_create_debugfs_attr("fail_gem_alloc", minor->debugfs_root,
393407
&fail_gem_alloc);
394408
fault_create_debugfs_attr("fail_gem_iova", minor->debugfs_root,

drivers/gpu/drm/msm/msm_drv.h

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,6 @@ enum msm_dsi_controller {
7070

7171
#define MSM_GPU_MAX_RINGS 4
7272

73-
/* Commit/Event thread specific structure */
74-
struct msm_drm_thread {
75-
struct drm_device *dev;
76-
struct kthread_worker *worker;
77-
};
78-
7973
struct msm_drm_private {
8074

8175
struct drm_device *dev;
@@ -165,8 +159,6 @@ struct msm_drm_private {
165159
struct mutex lock;
166160
} lru;
167161

168-
struct msm_drm_thread event_thread[MAX_CRTCS];
169-
170162
struct notifier_block vmap_notifier;
171163
struct shrinker *shrinker;
172164

@@ -272,7 +264,7 @@ struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,
272264
struct drm_framebuffer * msm_alloc_stolen_fb(struct drm_device *dev,
273265
int w, int h, int p, uint32_t format);
274266

275-
#ifdef CONFIG_DRM_FBDEV_EMULATION
267+
#ifdef CONFIG_DRM_MSM_KMS_FBDEV
276268
int msm_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
277269
struct drm_fb_helper_surface_size *sizes);
278270
#define MSM_FBDEV_DRIVER_OPS \

drivers/gpu/drm/msm/msm_kms.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -246,8 +246,8 @@ void msm_drm_kms_uninit(struct device *dev)
246246

247247
/* clean up event worker threads */
248248
for (i = 0; i < MAX_CRTCS; i++) {
249-
if (priv->event_thread[i].worker)
250-
kthread_destroy_worker(priv->event_thread[i].worker);
249+
if (kms->event_thread[i].worker)
250+
kthread_destroy_worker(kms->event_thread[i].worker);
251251
}
252252

253253
drm_kms_helper_poll_fini(ddev);
@@ -300,7 +300,7 @@ int msm_drm_kms_init(struct device *dev, const struct drm_driver *drv)
300300
struct msm_drm_thread *ev_thread;
301301

302302
/* initialize event thread */
303-
ev_thread = &priv->event_thread[drm_crtc_index(crtc)];
303+
ev_thread = &kms->event_thread[drm_crtc_index(crtc)];
304304
ev_thread->dev = ddev;
305305
ev_thread->worker = kthread_run_worker(0, "crtc_event:%d", crtc->base.id);
306306
if (IS_ERR(ev_thread->worker)) {

drivers/gpu/drm/msm/msm_kms.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
#include "msm_drv.h"
1515

16+
#ifdef CONFIG_DRM_MSM_KMS
17+
1618
#define MAX_PLANE 4
1719

1820
/* As there are different display controller blocks depending on the
@@ -127,6 +129,12 @@ struct msm_pending_timer {
127129
unsigned crtc_idx;
128130
};
129131

132+
/* Commit/Event thread specific structure */
133+
struct msm_drm_thread {
134+
struct drm_device *dev;
135+
struct kthread_worker *worker;
136+
};
137+
130138
struct msm_kms {
131139
const struct msm_kms_funcs *funcs;
132140
struct drm_device *dev;
@@ -161,6 +169,7 @@ struct msm_kms {
161169
struct msm_pending_timer pending_timers[MAX_CRTCS];
162170

163171
struct workqueue_struct *wq;
172+
struct msm_drm_thread event_thread[MAX_CRTCS];
164173
};
165174

166175
static inline int msm_kms_init(struct msm_kms *kms,
@@ -210,4 +219,25 @@ void msm_drm_kms_post_init(struct device *dev);
210219
void msm_drm_kms_unregister(struct device *dev);
211220
void msm_drm_kms_uninit(struct device *dev);
212221

222+
#else /* ! CONFIG_DRM_MSM_KMS */
223+
224+
static inline int msm_drm_kms_init(struct device *dev, const struct drm_driver *drv)
225+
{
226+
return -ENODEV;
227+
}
228+
229+
static inline void msm_drm_kms_post_init(struct device *dev)
230+
{
231+
}
232+
233+
static inline void msm_drm_kms_unregister(struct device *dev)
234+
{
235+
}
236+
237+
static inline void msm_drm_kms_uninit(struct device *dev)
238+
{
239+
}
240+
241+
#endif
242+
213243
#endif /* __MSM_KMS_H__ */

0 commit comments

Comments
 (0)