1 /* SPDX-License-Identifier: GPL-2.0-only */
3 * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
4 * Copyright (C) 2013 Red Hat
5 * Author: Rob Clark <robdclark@gmail.com>
11 #include <linux/clk.h>
12 #include <linux/regulator/consumer.h>
18 /* As there are different display controller blocks depending on the
19 * snapdragon version, the kms support is split out and the appropriate
20 * implementation is loaded at runtime. The kms module is responsible
21 * for constructing the appropriate planes/crtcs/encoders/connectors.
23 struct msm_kms_funcs {
24 /* hw initialization: */
25 int (*hw_init)(struct msm_kms *kms);
27 void (*irq_preinstall)(struct msm_kms *kms);
28 int (*irq_postinstall)(struct msm_kms *kms);
29 void (*irq_uninstall)(struct msm_kms *kms);
30 irqreturn_t (*irq)(struct msm_kms *kms);
31 int (*enable_vblank)(struct msm_kms *kms, struct drm_crtc *crtc);
32 void (*disable_vblank)(struct msm_kms *kms, struct drm_crtc *crtc);
33 /* modeset, bracketing atomic_commit(): */
34 void (*prepare_commit)(struct msm_kms *kms, struct drm_atomic_state *state);
35 void (*commit)(struct msm_kms *kms, struct drm_atomic_state *state);
36 void (*complete_commit)(struct msm_kms *kms, struct drm_atomic_state *state);
37 /* functions to wait for atomic commit completed on each CRTC */
38 void (*wait_for_crtc_commit_done)(struct msm_kms *kms,
39 struct drm_crtc *crtc);
40 /* get msm_format w/ optional format modifiers from drm_mode_fb_cmd2 */
41 const struct msm_format *(*get_format)(struct msm_kms *kms,
42 const uint32_t format,
43 const uint64_t modifiers);
44 /* do format checking on format modified through fb_cmd2 modifiers */
45 int (*check_modified_format)(const struct msm_kms *kms,
46 const struct msm_format *msm_fmt,
47 const struct drm_mode_fb_cmd2 *cmd,
48 struct drm_gem_object **bos);
50 long (*round_pixclk)(struct msm_kms *kms, unsigned long rate,
51 struct drm_encoder *encoder);
52 int (*set_split_display)(struct msm_kms *kms,
53 struct drm_encoder *encoder,
54 struct drm_encoder *slave_encoder,
56 void (*set_encoder_mode)(struct msm_kms *kms,
57 struct drm_encoder *encoder,
60 void (*destroy)(struct msm_kms *kms);
61 #ifdef CONFIG_DEBUG_FS
63 int (*debugfs_init)(struct msm_kms *kms, struct drm_minor *minor);
68 const struct msm_kms_funcs *funcs;
70 /* irq number to be passed on to drm_irq_install */
73 /* mapper-id used to request GEM buffer mapped for scanout: */
74 struct msm_gem_address_space *aspace;
77 static inline void msm_kms_init(struct msm_kms *kms,
78 const struct msm_kms_funcs *funcs)
83 struct msm_kms *mdp4_kms_init(struct drm_device *dev);
84 struct msm_kms *mdp5_kms_init(struct drm_device *dev);
85 struct msm_kms *dpu_kms_init(struct drm_device *dev);
87 struct msm_mdss_funcs {
88 int (*enable)(struct msm_mdss *mdss);
89 int (*disable)(struct msm_mdss *mdss);
90 void (*destroy)(struct drm_device *dev);
94 struct drm_device *dev;
95 const struct msm_mdss_funcs *funcs;
98 int mdp5_mdss_init(struct drm_device *dev);
99 int dpu_mdss_init(struct drm_device *dev);
101 #endif /* __MSM_KMS_H__ */