1 /* SPDX-License-Identifier: GPL-2.0-only */
3 * Copyright (C) 2013 Red Hat
4 * Author: Rob Clark <robdclark@gmail.com>
10 #include <drm/drm_panel.h>
14 #include "disp/mdp_kms.h"
22 struct drm_device
*dev
;
28 struct regulator
*vdd
;
35 struct mdp_irq error_handler
;
39 /* empty/blank cursor bo to use when cursor is "disabled" */
40 struct drm_gem_object
*blank_cursor_bo
;
41 uint64_t blank_cursor_iova
;
43 #define to_mdp4_kms(x) container_of(x, struct mdp4_kms, base)
45 /* platform config data (ie. from DT, or pdata) */
46 struct mdp4_platform_config
{
47 struct iommu_domain
*iommu
;
51 static inline void mdp4_write(struct mdp4_kms
*mdp4_kms
, u32 reg
, u32 data
)
53 msm_writel(data
, mdp4_kms
->mmio
+ reg
);
56 static inline u32
mdp4_read(struct mdp4_kms
*mdp4_kms
, u32 reg
)
58 return msm_readl(mdp4_kms
->mmio
+ reg
);
61 static inline uint32_t pipe2flush(enum mdp4_pipe pipe
)
64 case VG1
: return MDP4_OVERLAY_FLUSH_VG1
;
65 case VG2
: return MDP4_OVERLAY_FLUSH_VG2
;
66 case RGB1
: return MDP4_OVERLAY_FLUSH_RGB1
;
67 case RGB2
: return MDP4_OVERLAY_FLUSH_RGB2
;
72 static inline uint32_t ovlp2flush(int ovlp
)
75 case 0: return MDP4_OVERLAY_FLUSH_OVLP0
;
76 case 1: return MDP4_OVERLAY_FLUSH_OVLP1
;
81 static inline uint32_t dma2irq(enum mdp4_dma dma
)
84 case DMA_P
: return MDP4_IRQ_DMA_P_DONE
;
85 case DMA_S
: return MDP4_IRQ_DMA_S_DONE
;
86 case DMA_E
: return MDP4_IRQ_DMA_E_DONE
;
91 static inline uint32_t dma2err(enum mdp4_dma dma
)
94 case DMA_P
: return MDP4_IRQ_PRIMARY_INTF_UDERRUN
;
95 case DMA_S
: return 0; // ???
96 case DMA_E
: return MDP4_IRQ_EXTERNAL_INTF_UDERRUN
;
101 static inline uint32_t mixercfg(uint32_t mixer_cfg
, int mixer
,
102 enum mdp4_pipe pipe
, enum mdp_mixer_stage_id stage
)
106 mixer_cfg
&= ~(MDP4_LAYERMIXER_IN_CFG_PIPE0__MASK
|
107 MDP4_LAYERMIXER_IN_CFG_PIPE0_MIXER1
);
108 mixer_cfg
|= MDP4_LAYERMIXER_IN_CFG_PIPE0(stage
) |
109 COND(mixer
== 1, MDP4_LAYERMIXER_IN_CFG_PIPE0_MIXER1
);
112 mixer_cfg
&= ~(MDP4_LAYERMIXER_IN_CFG_PIPE1__MASK
|
113 MDP4_LAYERMIXER_IN_CFG_PIPE1_MIXER1
);
114 mixer_cfg
|= MDP4_LAYERMIXER_IN_CFG_PIPE1(stage
) |
115 COND(mixer
== 1, MDP4_LAYERMIXER_IN_CFG_PIPE1_MIXER1
);
118 mixer_cfg
&= ~(MDP4_LAYERMIXER_IN_CFG_PIPE2__MASK
|
119 MDP4_LAYERMIXER_IN_CFG_PIPE2_MIXER1
);
120 mixer_cfg
|= MDP4_LAYERMIXER_IN_CFG_PIPE2(stage
) |
121 COND(mixer
== 1, MDP4_LAYERMIXER_IN_CFG_PIPE2_MIXER1
);
124 mixer_cfg
&= ~(MDP4_LAYERMIXER_IN_CFG_PIPE3__MASK
|
125 MDP4_LAYERMIXER_IN_CFG_PIPE3_MIXER1
);
126 mixer_cfg
|= MDP4_LAYERMIXER_IN_CFG_PIPE3(stage
) |
127 COND(mixer
== 1, MDP4_LAYERMIXER_IN_CFG_PIPE3_MIXER1
);
130 mixer_cfg
&= ~(MDP4_LAYERMIXER_IN_CFG_PIPE4__MASK
|
131 MDP4_LAYERMIXER_IN_CFG_PIPE4_MIXER1
);
132 mixer_cfg
|= MDP4_LAYERMIXER_IN_CFG_PIPE4(stage
) |
133 COND(mixer
== 1, MDP4_LAYERMIXER_IN_CFG_PIPE4_MIXER1
);
136 mixer_cfg
&= ~(MDP4_LAYERMIXER_IN_CFG_PIPE5__MASK
|
137 MDP4_LAYERMIXER_IN_CFG_PIPE5_MIXER1
);
138 mixer_cfg
|= MDP4_LAYERMIXER_IN_CFG_PIPE5(stage
) |
139 COND(mixer
== 1, MDP4_LAYERMIXER_IN_CFG_PIPE5_MIXER1
);
142 mixer_cfg
&= ~(MDP4_LAYERMIXER_IN_CFG_PIPE6__MASK
|
143 MDP4_LAYERMIXER_IN_CFG_PIPE6_MIXER1
);
144 mixer_cfg
|= MDP4_LAYERMIXER_IN_CFG_PIPE6(stage
) |
145 COND(mixer
== 1, MDP4_LAYERMIXER_IN_CFG_PIPE6_MIXER1
);
148 WARN(1, "invalid pipe");
155 int mdp4_disable(struct mdp4_kms
*mdp4_kms
);
156 int mdp4_enable(struct mdp4_kms
*mdp4_kms
);
158 void mdp4_set_irqmask(struct mdp_kms
*mdp_kms
, uint32_t irqmask
,
159 uint32_t old_irqmask
);
160 void mdp4_irq_preinstall(struct msm_kms
*kms
);
161 int mdp4_irq_postinstall(struct msm_kms
*kms
);
162 void mdp4_irq_uninstall(struct msm_kms
*kms
);
163 irqreturn_t
mdp4_irq(struct msm_kms
*kms
);
164 int mdp4_enable_vblank(struct msm_kms
*kms
, struct drm_crtc
*crtc
);
165 void mdp4_disable_vblank(struct msm_kms
*kms
, struct drm_crtc
*crtc
);
167 static inline uint32_t mdp4_pipe_caps(enum mdp4_pipe pipe
)
174 return MDP_PIPE_CAP_HFLIP
| MDP_PIPE_CAP_VFLIP
|
175 MDP_PIPE_CAP_SCALE
| MDP_PIPE_CAP_CSC
;
179 return MDP_PIPE_CAP_SCALE
;
185 enum mdp4_pipe
mdp4_plane_pipe(struct drm_plane
*plane
);
186 struct drm_plane
*mdp4_plane_init(struct drm_device
*dev
,
187 enum mdp4_pipe pipe_id
, bool private_plane
);
189 uint32_t mdp4_crtc_vblank(struct drm_crtc
*crtc
);
190 void mdp4_crtc_set_config(struct drm_crtc
*crtc
, uint32_t config
);
191 void mdp4_crtc_set_intf(struct drm_crtc
*crtc
, enum mdp4_intf intf
, int mixer
);
192 void mdp4_crtc_wait_for_commit_done(struct drm_crtc
*crtc
);
193 struct drm_crtc
*mdp4_crtc_init(struct drm_device
*dev
,
194 struct drm_plane
*plane
, int id
, int ovlp_id
,
195 enum mdp4_dma dma_id
);
197 long mdp4_dtv_round_pixclk(struct drm_encoder
*encoder
, unsigned long rate
);
198 struct drm_encoder
*mdp4_dtv_encoder_init(struct drm_device
*dev
);
200 long mdp4_lcdc_round_pixclk(struct drm_encoder
*encoder
, unsigned long rate
);
201 struct drm_encoder
*mdp4_lcdc_encoder_init(struct drm_device
*dev
,
202 struct device_node
*panel_node
);
204 struct drm_connector
*mdp4_lvds_connector_init(struct drm_device
*dev
,
205 struct device_node
*panel_node
, struct drm_encoder
*encoder
);
207 #ifdef CONFIG_DRM_MSM_DSI
208 struct drm_encoder
*mdp4_dsi_encoder_init(struct drm_device
*dev
);
210 static inline struct drm_encoder
*mdp4_dsi_encoder_init(struct drm_device
*dev
)
212 return ERR_PTR(-ENODEV
);
216 #ifdef CONFIG_COMMON_CLK
217 struct clk
*mpd4_lvds_pll_init(struct drm_device
*dev
);
219 static inline struct clk
*mpd4_lvds_pll_init(struct drm_device
*dev
)
221 return ERR_PTR(-ENODEV
);
225 #ifdef DOWNSTREAM_CONFIG_MSM_BUS_SCALING
226 /* bus scaling data is associated with extra pointless platform devices,
227 * "dtv", etc.. this is a bit of a hack, but we need a way for encoders
228 * to find their pdata to make the bus-scaling stuff work.
230 static inline void *mdp4_find_pdata(const char *devname
)
233 dev
= bus_find_device_by_name(&platform_bus_type
, NULL
, devname
);
234 return dev
? dev
->platform_data
: NULL
;
238 #endif /* __MDP4_KMS_H__ */