1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2013 Red Hat
4 * Author: Rob Clark <robdclark@gmail.com>
7 #include <linux/delay.h>
9 #include <drm/drm_vblank.h>
16 static struct mdp4_platform_config
*mdp4_get_config(struct platform_device
*dev
);
18 static int mdp4_hw_init(struct msm_kms
*kms
)
20 struct mdp4_kms
*mdp4_kms
= to_mdp4_kms(to_mdp_kms(kms
));
21 struct drm_device
*dev
= mdp4_kms
->dev
;
22 uint32_t version
, major
, minor
, dmap_cfg
, vg_cfg
;
26 pm_runtime_get_sync(dev
->dev
);
28 mdp4_enable(mdp4_kms
);
29 version
= mdp4_read(mdp4_kms
, REG_MDP4_VERSION
);
30 mdp4_disable(mdp4_kms
);
32 major
= FIELD(version
, MDP4_VERSION_MAJOR
);
33 minor
= FIELD(version
, MDP4_VERSION_MINOR
);
35 DBG("found MDP4 version v%d.%d", major
, minor
);
38 DRM_DEV_ERROR(dev
->dev
, "unexpected MDP version: v%d.%d\n",
44 mdp4_kms
->rev
= minor
;
46 if (mdp4_kms
->rev
> 1) {
47 mdp4_write(mdp4_kms
, REG_MDP4_CS_CONTROLLER0
, 0x0707ffff);
48 mdp4_write(mdp4_kms
, REG_MDP4_CS_CONTROLLER1
, 0x03073f3f);
51 mdp4_write(mdp4_kms
, REG_MDP4_PORTMAP_MODE
, 0x3);
53 /* max read pending cmd config, 3 pending requests: */
54 mdp4_write(mdp4_kms
, REG_MDP4_READ_CNFG
, 0x02222);
56 clk
= clk_get_rate(mdp4_kms
->clk
);
58 if ((mdp4_kms
->rev
>= 1) || (clk
>= 90000000)) {
59 dmap_cfg
= 0x47; /* 16 bytes-burst x 8 req */
60 vg_cfg
= 0x47; /* 16 bytes-burs x 8 req */
62 dmap_cfg
= 0x27; /* 8 bytes-burst x 8 req */
63 vg_cfg
= 0x43; /* 16 bytes-burst x 4 req */
66 DBG("fetch config: dmap=%02x, vg=%02x", dmap_cfg
, vg_cfg
);
68 mdp4_write(mdp4_kms
, REG_MDP4_DMA_FETCH_CONFIG(DMA_P
), dmap_cfg
);
69 mdp4_write(mdp4_kms
, REG_MDP4_DMA_FETCH_CONFIG(DMA_E
), dmap_cfg
);
71 mdp4_write(mdp4_kms
, REG_MDP4_PIPE_FETCH_CONFIG(VG1
), vg_cfg
);
72 mdp4_write(mdp4_kms
, REG_MDP4_PIPE_FETCH_CONFIG(VG2
), vg_cfg
);
73 mdp4_write(mdp4_kms
, REG_MDP4_PIPE_FETCH_CONFIG(RGB1
), vg_cfg
);
74 mdp4_write(mdp4_kms
, REG_MDP4_PIPE_FETCH_CONFIG(RGB2
), vg_cfg
);
76 if (mdp4_kms
->rev
>= 2)
77 mdp4_write(mdp4_kms
, REG_MDP4_LAYERMIXER_IN_CFG_UPDATE_METHOD
, 1);
78 mdp4_write(mdp4_kms
, REG_MDP4_LAYERMIXER_IN_CFG
, 0);
80 /* disable CSC matrix / YUV by default: */
81 mdp4_write(mdp4_kms
, REG_MDP4_PIPE_OP_MODE(VG1
), 0);
82 mdp4_write(mdp4_kms
, REG_MDP4_PIPE_OP_MODE(VG2
), 0);
83 mdp4_write(mdp4_kms
, REG_MDP4_DMA_P_OP_MODE
, 0);
84 mdp4_write(mdp4_kms
, REG_MDP4_DMA_S_OP_MODE
, 0);
85 mdp4_write(mdp4_kms
, REG_MDP4_OVLP_CSC_CONFIG(1), 0);
86 mdp4_write(mdp4_kms
, REG_MDP4_OVLP_CSC_CONFIG(2), 0);
88 if (mdp4_kms
->rev
> 1)
89 mdp4_write(mdp4_kms
, REG_MDP4_RESET_STATUS
, 1);
91 dev
->mode_config
.allow_fb_modifiers
= true;
94 pm_runtime_put_sync(dev
->dev
);
99 static void mdp4_enable_commit(struct msm_kms
*kms
)
101 struct mdp4_kms
*mdp4_kms
= to_mdp4_kms(to_mdp_kms(kms
));
102 mdp4_enable(mdp4_kms
);
105 static void mdp4_disable_commit(struct msm_kms
*kms
)
107 struct mdp4_kms
*mdp4_kms
= to_mdp4_kms(to_mdp_kms(kms
));
108 mdp4_disable(mdp4_kms
);
111 static void mdp4_prepare_commit(struct msm_kms
*kms
, struct drm_atomic_state
*state
)
114 struct drm_crtc
*crtc
;
115 struct drm_crtc_state
*crtc_state
;
118 for_each_new_crtc_in_state(state
, crtc
, crtc_state
, i
)
119 drm_crtc_vblank_get(crtc
);
122 static void mdp4_flush_commit(struct msm_kms
*kms
, unsigned crtc_mask
)
127 static void mdp4_wait_flush(struct msm_kms
*kms
, unsigned crtc_mask
)
129 struct mdp4_kms
*mdp4_kms
= to_mdp4_kms(to_mdp_kms(kms
));
130 struct drm_crtc
*crtc
;
132 for_each_crtc_mask(mdp4_kms
->dev
, crtc
, crtc_mask
)
133 mdp4_crtc_wait_for_commit_done(crtc
);
136 static void mdp4_complete_commit(struct msm_kms
*kms
, unsigned crtc_mask
)
138 struct mdp4_kms
*mdp4_kms
= to_mdp4_kms(to_mdp_kms(kms
));
139 struct drm_crtc
*crtc
;
142 for_each_crtc_mask(mdp4_kms
->dev
, crtc
, crtc_mask
)
143 drm_crtc_vblank_put(crtc
);
146 static long mdp4_round_pixclk(struct msm_kms
*kms
, unsigned long rate
,
147 struct drm_encoder
*encoder
)
149 /* if we had >1 encoder, we'd need something more clever: */
150 switch (encoder
->encoder_type
) {
151 case DRM_MODE_ENCODER_TMDS
:
152 return mdp4_dtv_round_pixclk(encoder
, rate
);
153 case DRM_MODE_ENCODER_LVDS
:
154 case DRM_MODE_ENCODER_DSI
:
160 static void mdp4_destroy(struct msm_kms
*kms
)
162 struct mdp4_kms
*mdp4_kms
= to_mdp4_kms(to_mdp_kms(kms
));
163 struct device
*dev
= mdp4_kms
->dev
->dev
;
164 struct msm_gem_address_space
*aspace
= kms
->aspace
;
166 if (mdp4_kms
->blank_cursor_iova
)
167 msm_gem_unpin_iova(mdp4_kms
->blank_cursor_bo
, kms
->aspace
);
168 drm_gem_object_put(mdp4_kms
->blank_cursor_bo
);
171 aspace
->mmu
->funcs
->detach(aspace
->mmu
);
172 msm_gem_address_space_put(aspace
);
175 if (mdp4_kms
->rpm_enabled
)
176 pm_runtime_disable(dev
);
178 mdp_kms_destroy(&mdp4_kms
->base
);
183 static const struct mdp_kms_funcs kms_funcs
= {
185 .hw_init
= mdp4_hw_init
,
186 .irq_preinstall
= mdp4_irq_preinstall
,
187 .irq_postinstall
= mdp4_irq_postinstall
,
188 .irq_uninstall
= mdp4_irq_uninstall
,
190 .enable_vblank
= mdp4_enable_vblank
,
191 .disable_vblank
= mdp4_disable_vblank
,
192 .enable_commit
= mdp4_enable_commit
,
193 .disable_commit
= mdp4_disable_commit
,
194 .prepare_commit
= mdp4_prepare_commit
,
195 .flush_commit
= mdp4_flush_commit
,
196 .wait_flush
= mdp4_wait_flush
,
197 .complete_commit
= mdp4_complete_commit
,
198 .get_format
= mdp_get_format
,
199 .round_pixclk
= mdp4_round_pixclk
,
200 .destroy
= mdp4_destroy
,
202 .set_irqmask
= mdp4_set_irqmask
,
205 int mdp4_disable(struct mdp4_kms
*mdp4_kms
)
209 clk_disable_unprepare(mdp4_kms
->clk
);
211 clk_disable_unprepare(mdp4_kms
->pclk
);
212 if (mdp4_kms
->lut_clk
)
213 clk_disable_unprepare(mdp4_kms
->lut_clk
);
214 if (mdp4_kms
->axi_clk
)
215 clk_disable_unprepare(mdp4_kms
->axi_clk
);
220 int mdp4_enable(struct mdp4_kms
*mdp4_kms
)
224 clk_prepare_enable(mdp4_kms
->clk
);
226 clk_prepare_enable(mdp4_kms
->pclk
);
227 if (mdp4_kms
->lut_clk
)
228 clk_prepare_enable(mdp4_kms
->lut_clk
);
229 if (mdp4_kms
->axi_clk
)
230 clk_prepare_enable(mdp4_kms
->axi_clk
);
236 static int mdp4_modeset_init_intf(struct mdp4_kms
*mdp4_kms
,
239 struct drm_device
*dev
= mdp4_kms
->dev
;
240 struct msm_drm_private
*priv
= dev
->dev_private
;
241 struct drm_encoder
*encoder
;
242 struct drm_connector
*connector
;
243 struct device_node
*panel_node
;
248 case DRM_MODE_ENCODER_LVDS
:
250 * bail out early if there is no panel node (no need to
251 * initialize LCDC encoder and LVDS connector)
253 panel_node
= of_graph_get_remote_node(dev
->dev
->of_node
, 0, 0);
257 encoder
= mdp4_lcdc_encoder_init(dev
, panel_node
);
258 if (IS_ERR(encoder
)) {
259 DRM_DEV_ERROR(dev
->dev
, "failed to construct LCDC encoder\n");
260 return PTR_ERR(encoder
);
263 /* LCDC can be hooked to DMA_P (TODO: Add DMA_S later?) */
264 encoder
->possible_crtcs
= 1 << DMA_P
;
266 connector
= mdp4_lvds_connector_init(dev
, panel_node
, encoder
);
267 if (IS_ERR(connector
)) {
268 DRM_DEV_ERROR(dev
->dev
, "failed to initialize LVDS connector\n");
269 return PTR_ERR(connector
);
272 priv
->encoders
[priv
->num_encoders
++] = encoder
;
273 priv
->connectors
[priv
->num_connectors
++] = connector
;
276 case DRM_MODE_ENCODER_TMDS
:
277 encoder
= mdp4_dtv_encoder_init(dev
);
278 if (IS_ERR(encoder
)) {
279 DRM_DEV_ERROR(dev
->dev
, "failed to construct DTV encoder\n");
280 return PTR_ERR(encoder
);
283 /* DTV can be hooked to DMA_E: */
284 encoder
->possible_crtcs
= 1 << 1;
287 /* Construct bridge/connector for HDMI: */
288 ret
= msm_hdmi_modeset_init(priv
->hdmi
, dev
, encoder
);
290 DRM_DEV_ERROR(dev
->dev
, "failed to initialize HDMI: %d\n", ret
);
295 priv
->encoders
[priv
->num_encoders
++] = encoder
;
298 case DRM_MODE_ENCODER_DSI
:
299 /* only DSI1 supported for now */
302 if (!priv
->dsi
[dsi_id
])
305 encoder
= mdp4_dsi_encoder_init(dev
);
306 if (IS_ERR(encoder
)) {
307 ret
= PTR_ERR(encoder
);
308 DRM_DEV_ERROR(dev
->dev
,
309 "failed to construct DSI encoder: %d\n", ret
);
313 /* TODO: Add DMA_S later? */
314 encoder
->possible_crtcs
= 1 << DMA_P
;
315 priv
->encoders
[priv
->num_encoders
++] = encoder
;
317 ret
= msm_dsi_modeset_init(priv
->dsi
[dsi_id
], dev
, encoder
);
319 DRM_DEV_ERROR(dev
->dev
, "failed to initialize DSI: %d\n",
326 DRM_DEV_ERROR(dev
->dev
, "Invalid or unsupported interface\n");
333 static int modeset_init(struct mdp4_kms
*mdp4_kms
)
335 struct drm_device
*dev
= mdp4_kms
->dev
;
336 struct msm_drm_private
*priv
= dev
->dev_private
;
337 struct drm_plane
*plane
;
338 struct drm_crtc
*crtc
;
340 static const enum mdp4_pipe rgb_planes
[] = {
343 static const enum mdp4_pipe vg_planes
[] = {
346 static const enum mdp4_dma mdp4_crtcs
[] = {
349 static const char * const mdp4_crtc_names
[] = {
352 static const int mdp4_intfs
[] = {
353 DRM_MODE_ENCODER_LVDS
,
354 DRM_MODE_ENCODER_DSI
,
355 DRM_MODE_ENCODER_TMDS
,
358 /* construct non-private planes: */
359 for (i
= 0; i
< ARRAY_SIZE(vg_planes
); i
++) {
360 plane
= mdp4_plane_init(dev
, vg_planes
[i
], false);
362 DRM_DEV_ERROR(dev
->dev
,
363 "failed to construct plane for VG%d\n", i
+ 1);
364 ret
= PTR_ERR(plane
);
367 priv
->planes
[priv
->num_planes
++] = plane
;
370 for (i
= 0; i
< ARRAY_SIZE(mdp4_crtcs
); i
++) {
371 plane
= mdp4_plane_init(dev
, rgb_planes
[i
], true);
373 DRM_DEV_ERROR(dev
->dev
,
374 "failed to construct plane for RGB%d\n", i
+ 1);
375 ret
= PTR_ERR(plane
);
379 crtc
= mdp4_crtc_init(dev
, plane
, priv
->num_crtcs
, i
,
382 DRM_DEV_ERROR(dev
->dev
, "failed to construct crtc for %s\n",
388 priv
->crtcs
[priv
->num_crtcs
++] = crtc
;
392 * we currently set up two relatively fixed paths:
394 * LCDC/LVDS path: RGB1 -> DMA_P -> LCDC -> LVDS
396 * DSI path: RGB1 -> DMA_P -> DSI1 -> DSI Panel
398 * DTV/HDMI path: RGB2 -> DMA_E -> DTV -> HDMI
401 for (i
= 0; i
< ARRAY_SIZE(mdp4_intfs
); i
++) {
402 ret
= mdp4_modeset_init_intf(mdp4_kms
, mdp4_intfs
[i
]);
404 DRM_DEV_ERROR(dev
->dev
, "failed to initialize intf: %d, %d\n",
416 struct msm_kms
*mdp4_kms_init(struct drm_device
*dev
)
418 struct platform_device
*pdev
= to_platform_device(dev
->dev
);
419 struct mdp4_platform_config
*config
= mdp4_get_config(pdev
);
420 struct mdp4_kms
*mdp4_kms
;
421 struct msm_kms
*kms
= NULL
;
422 struct msm_gem_address_space
*aspace
;
425 mdp4_kms
= kzalloc(sizeof(*mdp4_kms
), GFP_KERNEL
);
427 DRM_DEV_ERROR(dev
->dev
, "failed to allocate kms\n");
432 ret
= mdp_kms_init(&mdp4_kms
->base
, &kms_funcs
);
434 DRM_DEV_ERROR(dev
->dev
, "failed to init kms\n");
438 kms
= &mdp4_kms
->base
.base
;
442 mdp4_kms
->mmio
= msm_ioremap(pdev
, NULL
, "MDP4");
443 if (IS_ERR(mdp4_kms
->mmio
)) {
444 ret
= PTR_ERR(mdp4_kms
->mmio
);
448 irq
= platform_get_irq(pdev
, 0);
451 DRM_DEV_ERROR(dev
->dev
, "failed to get irq: %d\n", ret
);
457 /* NOTE: driver for this regulator still missing upstream.. use
458 * _get_exclusive() and ignore the error if it does not exist
459 * (and hope that the bootloader left it on for us)
461 mdp4_kms
->vdd
= devm_regulator_get_exclusive(&pdev
->dev
, "vdd");
462 if (IS_ERR(mdp4_kms
->vdd
))
463 mdp4_kms
->vdd
= NULL
;
466 ret
= regulator_enable(mdp4_kms
->vdd
);
468 DRM_DEV_ERROR(dev
->dev
, "failed to enable regulator vdd: %d\n", ret
);
473 mdp4_kms
->clk
= devm_clk_get(&pdev
->dev
, "core_clk");
474 if (IS_ERR(mdp4_kms
->clk
)) {
475 DRM_DEV_ERROR(dev
->dev
, "failed to get core_clk\n");
476 ret
= PTR_ERR(mdp4_kms
->clk
);
480 mdp4_kms
->pclk
= devm_clk_get(&pdev
->dev
, "iface_clk");
481 if (IS_ERR(mdp4_kms
->pclk
))
482 mdp4_kms
->pclk
= NULL
;
484 if (mdp4_kms
->rev
>= 2) {
485 mdp4_kms
->lut_clk
= devm_clk_get(&pdev
->dev
, "lut_clk");
486 if (IS_ERR(mdp4_kms
->lut_clk
)) {
487 DRM_DEV_ERROR(dev
->dev
, "failed to get lut_clk\n");
488 ret
= PTR_ERR(mdp4_kms
->lut_clk
);
493 mdp4_kms
->axi_clk
= devm_clk_get(&pdev
->dev
, "bus_clk");
494 if (IS_ERR(mdp4_kms
->axi_clk
)) {
495 DRM_DEV_ERROR(dev
->dev
, "failed to get axi_clk\n");
496 ret
= PTR_ERR(mdp4_kms
->axi_clk
);
500 clk_set_rate(mdp4_kms
->clk
, config
->max_clk
);
501 if (mdp4_kms
->lut_clk
)
502 clk_set_rate(mdp4_kms
->lut_clk
, config
->max_clk
);
504 pm_runtime_enable(dev
->dev
);
505 mdp4_kms
->rpm_enabled
= true;
507 /* make sure things are off before attaching iommu (bootloader could
508 * have left things on, in which case we'll start getting faults if
511 mdp4_enable(mdp4_kms
);
512 mdp4_write(mdp4_kms
, REG_MDP4_DTV_ENABLE
, 0);
513 mdp4_write(mdp4_kms
, REG_MDP4_LCDC_ENABLE
, 0);
514 mdp4_write(mdp4_kms
, REG_MDP4_DSI_ENABLE
, 0);
515 mdp4_disable(mdp4_kms
);
519 struct msm_mmu
*mmu
= msm_iommu_new(&pdev
->dev
,
522 aspace
= msm_gem_address_space_create(mmu
,
523 "mdp4", 0x1000, 0x100000000 - 0x1000);
525 if (IS_ERR(aspace
)) {
527 mmu
->funcs
->destroy(mmu
);
528 ret
= PTR_ERR(aspace
);
532 kms
->aspace
= aspace
;
534 DRM_DEV_INFO(dev
->dev
, "no iommu, fallback to phys "
535 "contig buffers for scanout\n");
539 ret
= modeset_init(mdp4_kms
);
541 DRM_DEV_ERROR(dev
->dev
, "modeset_init failed: %d\n", ret
);
545 mdp4_kms
->blank_cursor_bo
= msm_gem_new(dev
, SZ_16K
, MSM_BO_WC
| MSM_BO_SCANOUT
);
546 if (IS_ERR(mdp4_kms
->blank_cursor_bo
)) {
547 ret
= PTR_ERR(mdp4_kms
->blank_cursor_bo
);
548 DRM_DEV_ERROR(dev
->dev
, "could not allocate blank-cursor bo: %d\n", ret
);
549 mdp4_kms
->blank_cursor_bo
= NULL
;
553 ret
= msm_gem_get_and_pin_iova(mdp4_kms
->blank_cursor_bo
, kms
->aspace
,
554 &mdp4_kms
->blank_cursor_iova
);
556 DRM_DEV_ERROR(dev
->dev
, "could not pin blank-cursor bo: %d\n", ret
);
560 dev
->mode_config
.min_width
= 0;
561 dev
->mode_config
.min_height
= 0;
562 dev
->mode_config
.max_width
= 2048;
563 dev
->mode_config
.max_height
= 2048;
573 static struct mdp4_platform_config
*mdp4_get_config(struct platform_device
*dev
)
575 static struct mdp4_platform_config config
= {};
577 /* TODO: Chips that aren't apq8064 have a 200 Mhz max_clk */
578 config
.max_clk
= 266667000;
579 config
.iommu
= iommu_domain_alloc(&platform_bus_type
);