OSDN Git Service

Merge "input: touchscreen: Fix uninitialized variable usage in Atmel driver"
[sagit-ice-cold/kernel_xiaomi_msm8998.git] / drivers / gpu / drm / msm / sde / sde_kms.c
1 /*
2  * Copyright (c) 2014-2018, The Linux Foundation. All rights reserved.
3  * Copyright (C) 2013 Red Hat
4  * Author: Rob Clark <robdclark@gmail.com>
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU General Public License version 2 as published by
8  * the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  *
15  * You should have received a copy of the GNU General Public License along with
16  * this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #define pr_fmt(fmt)     "[drm:%s:%d] " fmt, __func__, __LINE__
20
21 #include <drm/drm_crtc.h>
22 #include <linux/debugfs.h>
23
24 #include "msm_drv.h"
25 #include "msm_mmu.h"
26
27 #include "dsi_display.h"
28 #include "dsi_drm.h"
29 #include "sde_wb.h"
30 #include "sde_hdmi.h"
31
32 #include "sde_kms.h"
33 #include "sde_core_irq.h"
34 #include "sde_formats.h"
35 #include "sde_hw_vbif.h"
36 #include "sde_vbif.h"
37 #include "sde_encoder.h"
38 #include "sde_plane.h"
39 #include "sde_crtc.h"
40
41 #define CREATE_TRACE_POINTS
42 #include "sde_trace.h"
43
44 /**
45  * Controls size of event log buffer. Specified as a power of 2.
46  */
47 #define SDE_EVTLOG_SIZE 1024
48
49 /*
50  * To enable overall DRM driver logging
51  * # echo 0x2 > /sys/module/drm/parameters/debug
52  *
53  * To enable DRM driver h/w logging
54  * # echo <mask> > /sys/kernel/debug/dri/0/hw_log_mask
55  *
56  * See sde_hw_mdss.h for h/w logging mask definitions (search for SDE_DBG_MASK_)
57  */
58 #define SDE_DEBUGFS_DIR "msm_sde"
59 #define SDE_DEBUGFS_HWMASKNAME "hw_log_mask"
60
61 /**
62  * sdecustom - enable certain driver customizations for sde clients
63  *      Enabling this modifies the standard DRM behavior slightly and assumes
64  *      that the clients have specific knowledge about the modifications that
65  *      are involved, so don't enable this unless you know what you're doing.
66  *
67  *      Parts of the driver that are affected by this setting may be located by
68  *      searching for invocations of the 'sde_is_custom_client()' function.
69  *
70  *      This is disabled by default.
71  */
72 static bool sdecustom = true;
73 module_param(sdecustom, bool, 0400);
74 MODULE_PARM_DESC(sdecustom, "Enable customizations for sde clients");
75
76 static int sde_kms_hw_init(struct msm_kms *kms);
77 static int _sde_kms_mmu_destroy(struct sde_kms *sde_kms);
78
79 bool sde_is_custom_client(void)
80 {
81         return sdecustom;
82 }
83
84 #ifdef CONFIG_DEBUG_FS
85 static int _sde_danger_signal_status(struct seq_file *s,
86                 bool danger_status)
87 {
88         struct sde_kms *kms = (struct sde_kms *)s->private;
89         struct msm_drm_private *priv;
90         struct sde_danger_safe_status status;
91         int i;
92
93         if (!kms || !kms->dev || !kms->dev->dev_private || !kms->hw_mdp) {
94                 SDE_ERROR("invalid arg(s)\n");
95                 return 0;
96         }
97
98         priv = kms->dev->dev_private;
99         memset(&status, 0, sizeof(struct sde_danger_safe_status));
100
101         sde_power_resource_enable(&priv->phandle, kms->core_client, true);
102         if (danger_status) {
103                 seq_puts(s, "\nDanger signal status:\n");
104                 if (kms->hw_mdp->ops.get_danger_status)
105                         kms->hw_mdp->ops.get_danger_status(kms->hw_mdp,
106                                         &status);
107         } else {
108                 seq_puts(s, "\nSafe signal status:\n");
109                 if (kms->hw_mdp->ops.get_danger_status)
110                         kms->hw_mdp->ops.get_danger_status(kms->hw_mdp,
111                                         &status);
112         }
113         sde_power_resource_enable(&priv->phandle, kms->core_client, false);
114
115         seq_printf(s, "MDP     :  0x%x\n", status.mdp);
116
117         for (i = SSPP_VIG0; i < SSPP_MAX; i++)
118                 seq_printf(s, "SSPP%d   :  0x%x  \t", i - SSPP_VIG0,
119                                 status.sspp[i]);
120         seq_puts(s, "\n");
121
122         for (i = WB_0; i < WB_MAX; i++)
123                 seq_printf(s, "WB%d     :  0x%x  \t", i - WB_0,
124                                 status.wb[i]);
125         seq_puts(s, "\n");
126
127         return 0;
128 }
129
130 #define DEFINE_SDE_DEBUGFS_SEQ_FOPS(__prefix)                           \
131 static int __prefix ## _open(struct inode *inode, struct file *file)    \
132 {                                                                       \
133         return single_open(file, __prefix ## _show, inode->i_private);  \
134 }                                                                       \
135 static const struct file_operations __prefix ## _fops = {               \
136         .owner = THIS_MODULE,                                           \
137         .open = __prefix ## _open,                                      \
138         .release = single_release,                                      \
139         .read = seq_read,                                               \
140         .llseek = seq_lseek,                                            \
141 }
142
143 static int sde_debugfs_danger_stats_show(struct seq_file *s, void *v)
144 {
145         return _sde_danger_signal_status(s, true);
146 }
147 DEFINE_SDE_DEBUGFS_SEQ_FOPS(sde_debugfs_danger_stats);
148
149 static int sde_debugfs_safe_stats_show(struct seq_file *s, void *v)
150 {
151         return _sde_danger_signal_status(s, false);
152 }
153 DEFINE_SDE_DEBUGFS_SEQ_FOPS(sde_debugfs_safe_stats);
154
155 static void sde_debugfs_danger_destroy(struct sde_kms *sde_kms)
156 {
157         debugfs_remove_recursive(sde_kms->debugfs_danger);
158         sde_kms->debugfs_danger = NULL;
159 }
160
161 static int sde_debugfs_danger_init(struct sde_kms *sde_kms,
162                 struct dentry *parent)
163 {
164         sde_kms->debugfs_danger = debugfs_create_dir("danger",
165                         parent);
166         if (!sde_kms->debugfs_danger) {
167                 SDE_ERROR("failed to create danger debugfs\n");
168                 return -EINVAL;
169         }
170
171         debugfs_create_file("danger_status", 0644, sde_kms->debugfs_danger,
172                         sde_kms, &sde_debugfs_danger_stats_fops);
173         debugfs_create_file("safe_status", 0644, sde_kms->debugfs_danger,
174                         sde_kms, &sde_debugfs_safe_stats_fops);
175
176         return 0;
177 }
178
179 static int _sde_debugfs_show_regset32(struct seq_file *s, void *data)
180 {
181         struct sde_debugfs_regset32 *regset;
182         struct sde_kms *sde_kms;
183         struct drm_device *dev;
184         struct msm_drm_private *priv;
185         void __iomem *base;
186         uint32_t i, addr;
187
188         if (!s || !s->private)
189                 return 0;
190
191         regset = s->private;
192
193         sde_kms = regset->sde_kms;
194         if (!sde_kms || !sde_kms->mmio)
195                 return 0;
196
197         dev = sde_kms->dev;
198         if (!dev)
199                 return 0;
200
201         priv = dev->dev_private;
202         if (!priv)
203                 return 0;
204
205         base = sde_kms->mmio + regset->offset;
206
207         /* insert padding spaces, if needed */
208         if (regset->offset & 0xF) {
209                 seq_printf(s, "[%x]", regset->offset & ~0xF);
210                 for (i = 0; i < (regset->offset & 0xF); i += 4)
211                         seq_puts(s, "         ");
212         }
213
214         if (sde_power_resource_enable(&priv->phandle,
215                                 sde_kms->core_client, true)) {
216                 seq_puts(s, "failed to enable sde clocks\n");
217                 return 0;
218         }
219
220         /* main register output */
221         for (i = 0; i < regset->blk_len; i += 4) {
222                 addr = regset->offset + i;
223                 if ((addr & 0xF) == 0x0)
224                         seq_printf(s, i ? "\n[%x]" : "[%x]", addr);
225                 seq_printf(s, " %08x", readl_relaxed(base + i));
226         }
227         seq_puts(s, "\n");
228         sde_power_resource_enable(&priv->phandle, sde_kms->core_client, false);
229
230         return 0;
231 }
232
233 static int sde_debugfs_open_regset32(struct inode *inode,
234                 struct file *file)
235 {
236         return single_open(file, _sde_debugfs_show_regset32, inode->i_private);
237 }
238
239 static const struct file_operations sde_fops_regset32 = {
240         .open =         sde_debugfs_open_regset32,
241         .read =         seq_read,
242         .llseek =       seq_lseek,
243         .release =      single_release,
244 };
245
246 void sde_debugfs_setup_regset32(struct sde_debugfs_regset32 *regset,
247                 uint32_t offset, uint32_t length, struct sde_kms *sde_kms)
248 {
249         if (regset) {
250                 regset->offset = offset;
251                 regset->blk_len = length;
252                 regset->sde_kms = sde_kms;
253         }
254 }
255
256 void *sde_debugfs_create_regset32(const char *name, umode_t mode,
257                 void *parent, struct sde_debugfs_regset32 *regset)
258 {
259         if (!name || !regset || !regset->sde_kms || !regset->blk_len)
260                 return NULL;
261
262         /* make sure offset is a multiple of 4 */
263         regset->offset = round_down(regset->offset, 4);
264
265         return debugfs_create_file(name, mode, parent,
266                         regset, &sde_fops_regset32);
267 }
268
269 void *sde_debugfs_get_root(struct sde_kms *sde_kms)
270 {
271         return sde_kms ? sde_kms->debugfs_root : 0;
272 }
273
274 static int _sde_debugfs_init(struct sde_kms *sde_kms)
275 {
276         void *p;
277
278         p = sde_hw_util_get_log_mask_ptr();
279
280         if (!sde_kms || !p)
281                 return -EINVAL;
282
283         if (sde_kms->dev && sde_kms->dev->primary)
284                 sde_kms->debugfs_root = sde_kms->dev->primary->debugfs_root;
285         else
286                 sde_kms->debugfs_root = debugfs_create_dir(SDE_DEBUGFS_DIR, 0);
287
288         /* allow debugfs_root to be NULL */
289         debugfs_create_x32(SDE_DEBUGFS_HWMASKNAME,
290                         0644, sde_kms->debugfs_root, p);
291
292         /* create common folder for debug information */
293         sde_kms->debugfs_debug = debugfs_create_dir("debug",
294                         sde_kms->debugfs_root);
295         if (!sde_kms->debugfs_debug)
296                 SDE_ERROR("failed to create debugfs debug directory\n");
297
298         sde_debugfs_danger_init(sde_kms, sde_kms->debugfs_debug);
299         sde_debugfs_vbif_init(sde_kms, sde_kms->debugfs_debug);
300
301         return 0;
302 }
303
304 static void _sde_debugfs_destroy(struct sde_kms *sde_kms)
305 {
306         /* don't need to NULL check debugfs_root */
307         if (sde_kms) {
308                 sde_debugfs_vbif_destroy(sde_kms);
309                 sde_debugfs_danger_destroy(sde_kms);
310                 debugfs_remove_recursive(sde_kms->debugfs_debug);
311                 sde_kms->debugfs_debug = 0;
312                 debugfs_remove_recursive(sde_kms->debugfs_root);
313                 sde_kms->debugfs_root = 0;
314         }
315 }
316 #else
317 static void sde_debugfs_danger_destroy(struct sde_kms *sde_kms,
318                 struct dentry *parent)
319 {
320 }
321
322 static int sde_debugfs_danger_init(struct sde_kms *sde_kms,
323                 struct dentry *parent)
324 {
325         return 0;
326 }
327 #endif
328
329 static int sde_kms_enable_vblank(struct msm_kms *kms, struct drm_crtc *crtc)
330 {
331         return sde_crtc_vblank(crtc, true);
332 }
333
334 static void sde_kms_disable_vblank(struct msm_kms *kms, struct drm_crtc *crtc)
335 {
336         sde_crtc_vblank(crtc, false);
337 }
338
339 static void sde_kms_prepare_commit(struct msm_kms *kms,
340                 struct drm_atomic_state *state)
341 {
342         struct sde_kms *sde_kms = to_sde_kms(kms);
343         struct drm_device *dev = sde_kms->dev;
344         struct msm_drm_private *priv = dev->dev_private;
345
346         if (sde_kms->splash_info.handoff)
347                 sde_splash_clean_up_exit_lk(kms);
348
349         sde_power_resource_enable(&priv->phandle, sde_kms->core_client, true);
350 }
351
352 static void sde_kms_commit(struct msm_kms *kms,
353                 struct drm_atomic_state *old_state)
354 {
355         struct drm_crtc *crtc;
356         struct drm_crtc_state *old_crtc_state;
357         int i;
358
359         for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
360                 if (crtc->state->active) {
361                         SDE_EVT32(DRMID(crtc));
362                         sde_crtc_commit_kickoff(crtc);
363                 }
364         }
365 }
366
367 static void sde_kms_complete_commit(struct msm_kms *kms,
368                 struct drm_atomic_state *old_state)
369 {
370         struct sde_kms *sde_kms = to_sde_kms(kms);
371         struct drm_device *dev = sde_kms->dev;
372         struct msm_drm_private *priv = dev->dev_private;
373         struct drm_crtc *crtc;
374         struct drm_crtc_state *old_crtc_state;
375         int i;
376
377         for_each_crtc_in_state(old_state, crtc, old_crtc_state, i)
378                 sde_crtc_complete_commit(crtc, old_crtc_state);
379         sde_power_resource_enable(&priv->phandle, sde_kms->core_client, false);
380
381         SDE_EVT32(SDE_EVTLOG_FUNC_EXIT);
382 }
383
384 static void sde_kms_wait_for_commit_done(struct msm_kms *kms,
385                 struct drm_crtc *crtc)
386 {
387         struct drm_encoder *encoder;
388         struct drm_device *dev;
389         int ret;
390
391         if (!kms || !crtc || !crtc->state) {
392                 SDE_ERROR("invalid params\n");
393                 return;
394         }
395
396         dev = crtc->dev;
397
398         if (!crtc->state->enable) {
399                 SDE_DEBUG("[crtc:%d] not enable\n", crtc->base.id);
400                 return;
401         }
402
403         if (!crtc->state->active) {
404                 SDE_DEBUG("[crtc:%d] not active\n", crtc->base.id);
405                 return;
406         }
407
408         ret = drm_crtc_vblank_get(crtc);
409         if (ret)
410                 return;
411
412         list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
413                 if (encoder->crtc != crtc)
414                         continue;
415                 /*
416                  * Wait post-flush if necessary to delay before plane_cleanup
417                  * For example, wait for vsync in case of video mode panels
418                  * This should be a no-op for command mode panels
419                  */
420                 SDE_EVT32(DRMID(crtc));
421                 ret = sde_encoder_wait_for_commit_done(encoder);
422                 if (ret && ret != -EWOULDBLOCK) {
423                         SDE_ERROR("wait for commit done returned %d\n", ret);
424                         break;
425                 }
426         }
427
428         drm_crtc_vblank_put(crtc);
429 }
430
431 static void sde_kms_prepare_fence(struct msm_kms *kms,
432                 struct drm_atomic_state *old_state)
433 {
434         struct drm_crtc *crtc;
435         struct drm_crtc_state *old_crtc_state;
436         int i, rc;
437
438         if (!kms || !old_state || !old_state->dev || !old_state->acquire_ctx) {
439                 SDE_ERROR("invalid argument(s)\n");
440                 return;
441         }
442
443 retry:
444         /* attempt to acquire ww mutex for connection */
445         rc = drm_modeset_lock(&old_state->dev->mode_config.connection_mutex,
446                                old_state->acquire_ctx);
447
448         if (rc == -EDEADLK) {
449                 drm_modeset_backoff(old_state->acquire_ctx);
450                 goto retry;
451         }
452
453         /* old_state actually contains updated crtc pointers */
454         for_each_crtc_in_state(old_state, crtc, old_crtc_state, i)
455                 sde_crtc_prepare_commit(crtc, old_crtc_state);
456 }
457
458 /**
459  * _sde_kms_get_displays - query for underlying display handles and cache them
460  * @sde_kms:    Pointer to sde kms structure
461  * Returns:     Zero on success
462  */
463 static int _sde_kms_get_displays(struct sde_kms *sde_kms)
464 {
465         int rc = -ENOMEM;
466
467         if (!sde_kms) {
468                 SDE_ERROR("invalid sde kms\n");
469                 return -EINVAL;
470         }
471
472         /* dsi */
473         sde_kms->dsi_displays = NULL;
474         sde_kms->dsi_display_count = dsi_display_get_num_of_displays();
475         if (sde_kms->dsi_display_count) {
476                 sde_kms->dsi_displays = kcalloc(sde_kms->dsi_display_count,
477                                 sizeof(void *),
478                                 GFP_KERNEL);
479                 if (!sde_kms->dsi_displays) {
480                         SDE_ERROR("failed to allocate dsi displays\n");
481                         goto exit_deinit_dsi;
482                 }
483                 sde_kms->dsi_display_count =
484                         dsi_display_get_active_displays(sde_kms->dsi_displays,
485                                         sde_kms->dsi_display_count);
486         }
487
488         /* wb */
489         sde_kms->wb_displays = NULL;
490         sde_kms->wb_display_count = sde_wb_get_num_of_displays();
491         if (sde_kms->wb_display_count) {
492                 sde_kms->wb_displays = kcalloc(sde_kms->wb_display_count,
493                                 sizeof(void *),
494                                 GFP_KERNEL);
495                 if (!sde_kms->wb_displays) {
496                         SDE_ERROR("failed to allocate wb displays\n");
497                         goto exit_deinit_wb;
498                 }
499                 sde_kms->wb_display_count =
500                         wb_display_get_displays(sde_kms->wb_displays,
501                                         sde_kms->wb_display_count);
502         }
503
504         /* hdmi */
505         sde_kms->hdmi_displays = NULL;
506         sde_kms->hdmi_display_count = sde_hdmi_get_num_of_displays();
507         SDE_DEBUG("hdmi display count=%d", sde_kms->hdmi_display_count);
508         if (sde_kms->hdmi_display_count) {
509                 sde_kms->hdmi_displays = kcalloc(sde_kms->hdmi_display_count,
510                                   sizeof(void *),
511                                   GFP_KERNEL);
512                 if (!sde_kms->hdmi_displays) {
513                         SDE_ERROR("failed to allocate hdmi displays\n");
514                         goto exit_deinit_hdmi;
515                 }
516                 sde_kms->hdmi_display_count =
517                         sde_hdmi_get_displays(sde_kms->hdmi_displays,
518                                 sde_kms->hdmi_display_count);
519         }
520
521         return 0;
522
523 exit_deinit_hdmi:
524         sde_kms->hdmi_display_count = 0;
525         sde_kms->hdmi_displays = NULL;
526
527 exit_deinit_wb:
528         kfree(sde_kms->wb_displays);
529         sde_kms->wb_display_count = 0;
530         sde_kms->wb_displays = NULL;
531
532 exit_deinit_dsi:
533         kfree(sde_kms->dsi_displays);
534         sde_kms->dsi_display_count = 0;
535         sde_kms->dsi_displays = NULL;
536         return rc;
537 }
538
539 /**
540  * _sde_kms_release_displays - release cache of underlying display handles
541  * @sde_kms:    Pointer to sde kms structure
542  */
543 static void _sde_kms_release_displays(struct sde_kms *sde_kms)
544 {
545         if (!sde_kms) {
546                 SDE_ERROR("invalid sde kms\n");
547                 return;
548         }
549         kfree(sde_kms->hdmi_displays);
550         sde_kms->hdmi_display_count = 0;
551         sde_kms->hdmi_displays = NULL;
552
553         kfree(sde_kms->wb_displays);
554         sde_kms->wb_displays = NULL;
555         sde_kms->wb_display_count = 0;
556
557         kfree(sde_kms->dsi_displays);
558         sde_kms->dsi_displays = NULL;
559         sde_kms->dsi_display_count = 0;
560 }
561
562 /**
563  * _sde_kms_setup_displays - create encoders, bridges and connectors
564  *                           for underlying displays
565  * @dev:        Pointer to drm device structure
566  * @priv:       Pointer to private drm device data
567  * @sde_kms:    Pointer to sde kms structure
568  * Returns:     Zero on success
569  */
570 static int _sde_kms_setup_displays(struct drm_device *dev,
571                 struct msm_drm_private *priv,
572                 struct sde_kms *sde_kms)
573 {
574         static const struct sde_connector_ops dsi_ops = {
575                 .post_init =  dsi_conn_post_init,
576                 .detect =     dsi_conn_detect,
577                 .get_modes =  dsi_connector_get_modes,
578                 .mode_valid = dsi_conn_mode_valid,
579                 .get_info =   dsi_display_get_info,
580                 .set_backlight = dsi_display_set_backlight
581         };
582         static const struct sde_connector_ops wb_ops = {
583                 .post_init =    sde_wb_connector_post_init,
584                 .detect =       sde_wb_connector_detect,
585                 .get_modes =    sde_wb_connector_get_modes,
586                 .set_property = sde_wb_connector_set_property,
587                 .get_info =     sde_wb_get_info,
588         };
589         static const struct sde_connector_ops hdmi_ops = {
590                 .pre_deinit = sde_hdmi_connector_pre_deinit,
591                 .post_init =  sde_hdmi_connector_post_init,
592                 .detect =     sde_hdmi_connector_detect,
593                 .get_modes =  sde_hdmi_connector_get_modes,
594                 .mode_valid = sde_hdmi_mode_valid,
595                 .get_info =   sde_hdmi_get_info,
596                 .set_property = sde_hdmi_set_property,
597                 .get_property = sde_hdmi_get_property,
598                 .pre_kickoff = sde_hdmi_pre_kickoff,
599                 .mode_needs_full_range = sde_hdmi_mode_needs_full_range,
600                 .get_csc_type = sde_hdmi_get_csc_type
601         };
602         struct msm_display_info info = {0};
603         struct drm_encoder *encoder;
604         void *display, *connector;
605         int i, max_encoders;
606         int rc = 0;
607         int connector_poll;
608
609         if (!dev || !priv || !sde_kms) {
610                 SDE_ERROR("invalid argument(s)\n");
611                 return -EINVAL;
612         }
613
614         max_encoders = sde_kms->dsi_display_count +
615                 sde_kms->wb_display_count +
616                 sde_kms->hdmi_display_count;
617
618         if (max_encoders > ARRAY_SIZE(priv->encoders)) {
619                 max_encoders = ARRAY_SIZE(priv->encoders);
620                 SDE_ERROR("capping number of displays to %d", max_encoders);
621         }
622
623         /* dsi */
624         for (i = 0; i < sde_kms->dsi_display_count &&
625                 priv->num_encoders < max_encoders; ++i) {
626                 display = sde_kms->dsi_displays[i];
627                 encoder = NULL;
628
629                 memset(&info, 0x0, sizeof(info));
630                 rc = dsi_display_get_info(&info, display);
631                 if (rc) {
632                         SDE_ERROR("dsi get_info %d failed\n", i);
633                         continue;
634                 }
635
636                 encoder = sde_encoder_init(dev, &info);
637                 if (IS_ERR_OR_NULL(encoder)) {
638                         SDE_ERROR("encoder init failed for dsi %d\n", i);
639                         continue;
640                 }
641
642                 rc = dsi_display_drm_bridge_init(display, encoder);
643                 if (rc) {
644                         SDE_ERROR("dsi bridge %d init failed, %d\n", i, rc);
645                         sde_encoder_destroy(encoder);
646                         continue;
647                 }
648
649                 connector = sde_connector_init(dev,
650                                         encoder,
651                                         0,
652                                         display,
653                                         &dsi_ops,
654                                         DRM_CONNECTOR_POLL_HPD,
655                                         DRM_MODE_CONNECTOR_DSI);
656                 if (connector) {
657                         priv->encoders[priv->num_encoders++] = encoder;
658                 } else {
659                         SDE_ERROR("dsi %d connector init failed\n", i);
660                         dsi_display_drm_bridge_deinit(display);
661                         sde_encoder_destroy(encoder);
662                 }
663         }
664
665         /* wb */
666         for (i = 0; i < sde_kms->wb_display_count &&
667                 priv->num_encoders < max_encoders; ++i) {
668                 display = sde_kms->wb_displays[i];
669                 encoder = NULL;
670
671                 memset(&info, 0x0, sizeof(info));
672                 rc = sde_wb_get_info(&info, display);
673                 if (rc) {
674                         SDE_ERROR("wb get_info %d failed\n", i);
675                         continue;
676                 }
677
678                 encoder = sde_encoder_init(dev, &info);
679                 if (IS_ERR_OR_NULL(encoder)) {
680                         SDE_ERROR("encoder init failed for wb %d\n", i);
681                         continue;
682                 }
683
684                 rc = sde_wb_drm_init(display, encoder);
685                 if (rc) {
686                         SDE_ERROR("wb bridge %d init failed, %d\n", i, rc);
687                         sde_encoder_destroy(encoder);
688                         continue;
689                 }
690
691                 connector = sde_connector_init(dev,
692                                 encoder,
693                                 0,
694                                 display,
695                                 &wb_ops,
696                                 DRM_CONNECTOR_POLL_HPD,
697                                 DRM_MODE_CONNECTOR_VIRTUAL);
698                 if (connector) {
699                         priv->encoders[priv->num_encoders++] = encoder;
700                 } else {
701                         SDE_ERROR("wb %d connector init failed\n", i);
702                         sde_wb_drm_deinit(display);
703                         sde_encoder_destroy(encoder);
704                 }
705         }
706
707         /* hdmi */
708         for (i = 0; i < sde_kms->hdmi_display_count &&
709                 priv->num_encoders < max_encoders; ++i) {
710                 display = sde_kms->hdmi_displays[i];
711                 encoder = NULL;
712
713                 memset(&info, 0x0, sizeof(info));
714                 rc = sde_hdmi_dev_init(display);
715                 if (rc) {
716                         SDE_ERROR("hdmi dev_init %d failed\n", i);
717                         continue;
718                 }
719                 rc = sde_hdmi_get_info(&info, display);
720                 if (rc) {
721                         SDE_ERROR("hdmi get_info %d failed\n", i);
722                         continue;
723                 }
724                 if (info.capabilities & MSM_DISPLAY_CAP_HOT_PLUG)
725                         connector_poll = DRM_CONNECTOR_POLL_HPD;
726                 else
727                         connector_poll = 0;
728                 encoder = sde_encoder_init(dev, &info);
729                 if (IS_ERR_OR_NULL(encoder)) {
730                         SDE_ERROR("encoder init failed for hdmi %d\n", i);
731                         continue;
732                 }
733
734                 rc = sde_hdmi_drm_init(display, encoder);
735                 if (rc) {
736                         SDE_ERROR("hdmi drm %d init failed, %d\n", i, rc);
737                         sde_encoder_destroy(encoder);
738                         continue;
739                 }
740
741                 connector = sde_connector_init(dev,
742                                         encoder,
743                                         0,
744                                         display,
745                                         &hdmi_ops,
746                                         connector_poll,
747                                         DRM_MODE_CONNECTOR_HDMIA);
748                 if (connector) {
749                         priv->encoders[priv->num_encoders++] = encoder;
750                 } else {
751                         SDE_ERROR("hdmi %d connector init failed\n", i);
752                         sde_hdmi_dev_deinit(display);
753                         sde_hdmi_drm_deinit(display);
754                         sde_encoder_destroy(encoder);
755                 }
756         }
757
758         return 0;
759 }
760
761 static void _sde_kms_drm_obj_destroy(struct sde_kms *sde_kms)
762 {
763         struct msm_drm_private *priv;
764         int i;
765
766         if (!sde_kms) {
767                 SDE_ERROR("invalid sde_kms\n");
768                 return;
769         } else if (!sde_kms->dev) {
770                 SDE_ERROR("invalid dev\n");
771                 return;
772         } else if (!sde_kms->dev->dev_private) {
773                 SDE_ERROR("invalid dev_private\n");
774                 return;
775         }
776         priv = sde_kms->dev->dev_private;
777
778         for (i = 0; i < priv->num_crtcs; i++)
779                 priv->crtcs[i]->funcs->destroy(priv->crtcs[i]);
780         priv->num_crtcs = 0;
781
782         for (i = 0; i < priv->num_planes; i++)
783                 priv->planes[i]->funcs->destroy(priv->planes[i]);
784         priv->num_planes = 0;
785
786         for (i = 0; i < priv->num_connectors; i++)
787                 priv->connectors[i]->funcs->destroy(priv->connectors[i]);
788         priv->num_connectors = 0;
789
790         for (i = 0; i < priv->num_encoders; i++)
791                 priv->encoders[i]->funcs->destroy(priv->encoders[i]);
792         priv->num_encoders = 0;
793
794         _sde_kms_release_displays(sde_kms);
795 }
796
797 static inline int sde_get_crtc_id(const char *display_type)
798 {
799         if (!strcmp(display_type, "primary"))
800                 return 0;
801         else if (!strcmp(display_type, "secondary"))
802                 return 1;
803         else
804                 return 2;
805 }
806
807 static int _sde_kms_drm_obj_init(struct sde_kms *sde_kms)
808 {
809         struct drm_device *dev;
810         struct drm_plane *primary_planes[MAX_PLANES], *plane;
811         struct drm_crtc *crtc;
812
813         struct msm_drm_private *priv;
814         struct sde_mdss_cfg *catalog;
815
816         int primary_planes_idx, i, ret;
817         int max_crtc_count, max_plane_count;
818
819         if (!sde_kms || !sde_kms->dev || !sde_kms->dev->dev) {
820                 SDE_ERROR("invalid sde_kms\n");
821                 return -EINVAL;
822         }
823
824         dev = sde_kms->dev;
825         priv = dev->dev_private;
826         catalog = sde_kms->catalog;
827
828         ret = sde_core_irq_domain_add(sde_kms);
829         if (ret)
830                 goto fail_irq;
831         /*
832          * Query for underlying display drivers, and create connectors,
833          * bridges and encoders for them.
834          */
835         if (!_sde_kms_get_displays(sde_kms))
836                 (void)_sde_kms_setup_displays(dev, priv, sde_kms);
837
838         max_crtc_count = min(catalog->mixer_count, priv->num_encoders);
839
840         /* Create the planes */
841         primary_planes_idx = 0;
842         if (catalog->vp_count) {
843                 max_plane_count = min_t(u32, catalog->vp_count, MAX_PLANES);
844
845                 for (i = 0; i < max_plane_count; i++) {
846                         bool primary = true;
847                         int crtc_id =
848                                 sde_get_crtc_id(catalog->vp[i].display_type);
849
850                         if (strcmp(catalog->vp[i].plane_type, "primary"))
851                                 primary = false;
852
853                         plane = sde_plane_init(dev, catalog->vp[i].id,
854                                         primary, 1UL << crtc_id, true);
855                         if (IS_ERR(plane)) {
856                                 SDE_ERROR("sde_plane_init failed\n");
857                                 ret = PTR_ERR(plane);
858                                 goto fail;
859                         }
860                         priv->planes[priv->num_planes++] = plane;
861
862                         if (primary) {
863                                 primary_planes[crtc_id] = plane;
864                                 primary_planes_idx++;
865                         }
866                 }
867         } else {
868                 max_plane_count = min_t(u32, catalog->sspp_count, MAX_PLANES);
869
870                 for (i = 0; i < max_plane_count; i++) {
871                         bool primary = true;
872
873                         if (catalog->sspp[i].features & BIT(SDE_SSPP_CURSOR)
874                                 || primary_planes_idx >= max_crtc_count)
875                                 primary = false;
876
877                         plane = sde_plane_init(dev, catalog->sspp[i].id,
878                                         primary, (1UL << max_crtc_count) - 1,
879                                         false);
880                         if (IS_ERR(plane)) {
881                                 SDE_ERROR("sde_plane_init failed\n");
882                                 ret = PTR_ERR(plane);
883                                 goto fail;
884                         }
885                         priv->planes[priv->num_planes++] = plane;
886
887                         if (primary)
888                                 primary_planes[primary_planes_idx++] = plane;
889                 }
890         }
891
892         max_crtc_count = min(max_crtc_count, primary_planes_idx);
893
894         /* Create one CRTC per encoder */
895         for (i = 0; i < max_crtc_count; i++) {
896                 crtc = sde_crtc_init(dev, primary_planes[i]);
897                 if (IS_ERR(crtc)) {
898                         ret = PTR_ERR(crtc);
899                         goto fail;
900                 }
901                 priv->crtcs[priv->num_crtcs++] = crtc;
902         }
903
904         if (sde_is_custom_client()) {
905                 /* All CRTCs are compatible with all planes */
906                 for (i = 0; i < priv->num_planes; i++)
907                         priv->planes[i]->possible_crtcs =
908                                 (1 << priv->num_crtcs) - 1;
909         }
910
911         /* All CRTCs are compatible with all encoders */
912         for (i = 0; i < priv->num_encoders; i++)
913                 priv->encoders[i]->possible_crtcs = (1 << priv->num_crtcs) - 1;
914
915         return 0;
916 fail:
917         _sde_kms_drm_obj_destroy(sde_kms);
918 fail_irq:
919         sde_core_irq_domain_fini(sde_kms);
920         return ret;
921 }
922
923 static int sde_kms_postinit(struct msm_kms *kms)
924 {
925         struct sde_kms *sde_kms = to_sde_kms(kms);
926         struct drm_device *dev;
927
928         if (!sde_kms || !sde_kms->dev || !sde_kms->dev->dev) {
929                 SDE_ERROR("invalid sde_kms\n");
930                 return -EINVAL;
931         }
932
933         dev = sde_kms->dev;
934
935         /*
936          * Allow vblank interrupt to be disabled by drm vblank timer.
937          */
938         dev->vblank_disable_allowed = true;
939
940         return 0;
941 }
942
943 static long sde_kms_round_pixclk(struct msm_kms *kms, unsigned long rate,
944                 struct drm_encoder *encoder)
945 {
946         return rate;
947 }
948
949 static void _sde_kms_hw_destroy(struct sde_kms *sde_kms,
950                 struct platform_device *pdev)
951 {
952         struct drm_device *dev;
953         struct msm_drm_private *priv;
954         int i;
955
956         if (!sde_kms || !pdev)
957                 return;
958
959         dev = sde_kms->dev;
960         if (!dev)
961                 return;
962
963         priv = dev->dev_private;
964         if (!priv)
965                 return;
966
967         if (sde_kms->hw_intr)
968                 sde_hw_intr_destroy(sde_kms->hw_intr);
969         sde_kms->hw_intr = NULL;
970
971         _sde_kms_release_displays(sde_kms);
972
973         /* safe to call these more than once during shutdown */
974         _sde_debugfs_destroy(sde_kms);
975         _sde_kms_mmu_destroy(sde_kms);
976         sde_core_perf_destroy(&sde_kms->perf);
977
978         if (sde_kms->catalog) {
979                 for (i = 0; i < sde_kms->catalog->vbif_count; i++) {
980                         u32 vbif_idx = sde_kms->catalog->vbif[i].id;
981
982                         if ((vbif_idx < VBIF_MAX) && sde_kms->hw_vbif[vbif_idx])
983                                 sde_hw_vbif_destroy(sde_kms->hw_vbif[vbif_idx]);
984                 }
985         }
986
987         if (sde_kms->rm_init)
988                 sde_rm_destroy(&sde_kms->rm);
989         sde_kms->rm_init = false;
990
991         if (sde_kms->catalog)
992                 sde_hw_catalog_deinit(sde_kms->catalog);
993         sde_kms->catalog = NULL;
994
995         if (sde_kms->splash_info.handoff) {
996                 if (sde_kms->core_client)
997                         sde_splash_destroy(&sde_kms->splash_info,
998                                 &priv->phandle, sde_kms->core_client);
999         }
1000
1001         if (sde_kms->core_client)
1002                 sde_power_client_destroy(&priv->phandle,
1003                                 sde_kms->core_client);
1004         sde_kms->core_client = NULL;
1005
1006         if (sde_kms->vbif[VBIF_NRT])
1007                 msm_iounmap(pdev, sde_kms->vbif[VBIF_NRT]);
1008         sde_kms->vbif[VBIF_NRT] = NULL;
1009
1010         if (sde_kms->vbif[VBIF_RT])
1011                 msm_iounmap(pdev, sde_kms->vbif[VBIF_RT]);
1012         sde_kms->vbif[VBIF_RT] = NULL;
1013
1014         if (sde_kms->mmio)
1015                 msm_iounmap(pdev, sde_kms->mmio);
1016         sde_kms->mmio = NULL;
1017 }
1018
1019 static void sde_kms_destroy(struct msm_kms *kms)
1020 {
1021         struct sde_kms *sde_kms;
1022         struct drm_device *dev;
1023
1024         if (!kms) {
1025                 SDE_ERROR("invalid kms\n");
1026                 return;
1027         }
1028
1029         sde_kms = to_sde_kms(kms);
1030         dev = sde_kms->dev;
1031         if (!dev) {
1032                 SDE_ERROR("invalid device\n");
1033                 return;
1034         }
1035
1036         _sde_kms_hw_destroy(sde_kms, dev->platformdev);
1037         kfree(sde_kms);
1038 }
1039
1040 static void sde_kms_preclose(struct msm_kms *kms, struct drm_file *file)
1041 {
1042         struct sde_kms *sde_kms = to_sde_kms(kms);
1043         struct drm_device *dev = sde_kms->dev;
1044         struct msm_drm_private *priv = dev->dev_private;
1045         unsigned i;
1046
1047         for (i = 0; i < priv->num_crtcs; i++)
1048                 sde_crtc_cancel_pending_flip(priv->crtcs[i], file);
1049 }
1050
1051 static const struct msm_kms_funcs kms_funcs = {
1052         .hw_init         = sde_kms_hw_init,
1053         .postinit        = sde_kms_postinit,
1054         .irq_preinstall  = sde_irq_preinstall,
1055         .irq_postinstall = sde_irq_postinstall,
1056         .irq_uninstall   = sde_irq_uninstall,
1057         .irq             = sde_irq,
1058         .preclose        = sde_kms_preclose,
1059         .prepare_fence   = sde_kms_prepare_fence,
1060         .prepare_commit  = sde_kms_prepare_commit,
1061         .commit          = sde_kms_commit,
1062         .complete_commit = sde_kms_complete_commit,
1063         .wait_for_crtc_commit_done = sde_kms_wait_for_commit_done,
1064         .enable_vblank   = sde_kms_enable_vblank,
1065         .disable_vblank  = sde_kms_disable_vblank,
1066         .check_modified_format = sde_format_check_modified_format,
1067         .get_format      = sde_get_msm_format,
1068         .round_pixclk    = sde_kms_round_pixclk,
1069         .destroy         = sde_kms_destroy,
1070 };
1071
1072 /* the caller api needs to turn on clock before calling it */
1073 static inline void _sde_kms_core_hw_rev_init(struct sde_kms *sde_kms)
1074 {
1075         sde_kms->core_rev = readl_relaxed(sde_kms->mmio + 0x0);
1076 }
1077
1078 static int _sde_kms_mmu_destroy(struct sde_kms *sde_kms)
1079 {
1080         struct msm_mmu *mmu;
1081         int i;
1082
1083         for (i = ARRAY_SIZE(sde_kms->aspace) - 1; i >= 0; i--) {
1084                 if (!sde_kms->aspace[i])
1085                         continue;
1086
1087                 mmu = sde_kms->aspace[i]->mmu;
1088
1089                 mmu->funcs->detach(mmu);
1090                 msm_gem_address_space_put(sde_kms->aspace[i]);
1091
1092                 sde_kms->aspace[i] = NULL;
1093         }
1094
1095         return 0;
1096 }
1097
1098 static int _sde_kms_mmu_init(struct sde_kms *sde_kms)
1099 {
1100         struct msm_mmu *mmu;
1101         int i, ret;
1102
1103         for (i = 0; i < MSM_SMMU_DOMAIN_MAX; i++) {
1104                 struct msm_gem_address_space *aspace;
1105
1106                 mmu = msm_smmu_new(sde_kms->dev->dev, i);
1107                 if (IS_ERR(mmu)) {
1108                         /* MMU's can be optional depending on platform */
1109                         ret = PTR_ERR(mmu);
1110                         DRM_INFO("failed to init iommu id %d: rc: %d\n", i,
1111                                         ret);
1112                         continue;
1113                 }
1114
1115                 /* Attaching smmu means IOMMU HW starts to work immediately.
1116                  * However, display HW in LK is still accessing memory
1117                  * while the memory map is not done yet.
1118                  * So first set DOMAIN_ATTR_EARLY_MAP attribute 1 to bypass
1119                  * stage 1 translation in IOMMU HW.
1120                  */
1121                 if ((i == MSM_SMMU_DOMAIN_UNSECURE) &&
1122                                 sde_kms->splash_info.handoff) {
1123                         ret = mmu->funcs->set_property(mmu,
1124                                         DOMAIN_ATTR_EARLY_MAP,
1125                                         &sde_kms->splash_info.handoff);
1126                         if (ret) {
1127                                 SDE_ERROR("failed to set map att: %d\n", ret);
1128                                 mmu->funcs->destroy(mmu);
1129                                 goto fail;
1130                         }
1131                 }
1132
1133                 aspace = msm_gem_smmu_address_space_create(sde_kms->dev->dev,
1134                         mmu, "sde");
1135                 if (IS_ERR(aspace)) {
1136                         ret = PTR_ERR(aspace);
1137                         mmu->funcs->destroy(mmu);
1138                         goto fail;
1139                 }
1140
1141                 sde_kms->aspace[i] = aspace;
1142
1143                 ret = mmu->funcs->attach(mmu, NULL, 0);
1144                 if (ret) {
1145                         SDE_ERROR("failed to attach iommu %d: %d\n", i, ret);
1146                         msm_gem_address_space_put(aspace);
1147                         goto fail;
1148                 }
1149
1150                 /*
1151                  * It's safe now to map the physical memory blcok LK accesses.
1152                  */
1153                 if ((i == MSM_SMMU_DOMAIN_UNSECURE) &&
1154                                 sde_kms->splash_info.handoff) {
1155                         ret = sde_splash_smmu_map(sde_kms->dev, mmu,
1156                                         &sde_kms->splash_info);
1157                         if (ret) {
1158                                 SDE_ERROR("map rsv mem failed: %d\n", ret);
1159                                 msm_gem_address_space_put(aspace);
1160                                 goto fail;
1161                         }
1162                 }
1163         }
1164
1165         return 0;
1166 fail:
1167         _sde_kms_mmu_destroy(sde_kms);
1168
1169         return ret;
1170 }
1171
1172 static void __iomem *_sde_kms_ioremap(struct platform_device *pdev,
1173                 const char *name, unsigned long *out_size)
1174 {
1175         struct resource *res;
1176         unsigned long size;
1177         void __iomem *ptr;
1178
1179         if (out_size)
1180                 *out_size = 0;
1181
1182         if (name)
1183                 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, name);
1184         else
1185                 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1186
1187         if (!res) {
1188                 /* availability depends on platform */
1189                 SDE_DEBUG("failed to get memory resource: %s\n", name);
1190                 return NULL;
1191         }
1192
1193         size = resource_size(res);
1194
1195         ptr = devm_ioremap_nocache(&pdev->dev, res->start, size);
1196         if (!ptr) {
1197                 SDE_ERROR("failed to ioremap: %s\n", name);
1198                 return NULL;
1199         }
1200
1201         SDE_DEBUG("IO:region %s %pK %08lx\n", name, ptr, size);
1202
1203         if (out_size)
1204                 *out_size = size;
1205
1206         return ptr;
1207 }
1208
1209
1210 static int sde_kms_hw_init(struct msm_kms *kms)
1211 {
1212         struct sde_kms *sde_kms;
1213         struct drm_device *dev;
1214         struct msm_drm_private *priv;
1215         struct sde_splash_info *sinfo;
1216         int i, rc = -EINVAL;
1217
1218         if (!kms) {
1219                 SDE_ERROR("invalid kms\n");
1220                 goto end;
1221         }
1222
1223         sde_kms = to_sde_kms(kms);
1224         dev = sde_kms->dev;
1225         if (!dev || !dev->platformdev) {
1226                 SDE_ERROR("invalid device\n");
1227                 goto end;
1228         }
1229
1230         priv = dev->dev_private;
1231         if (!priv) {
1232                 SDE_ERROR("invalid private data\n");
1233                 goto end;
1234         }
1235
1236         sde_kms->mmio = _sde_kms_ioremap(dev->platformdev, "mdp_phys",
1237                         &sde_kms->mmio_len);
1238         if (!sde_kms->mmio) {
1239                 SDE_ERROR("mdp register memory map failed\n");
1240                 goto error;
1241         }
1242         DRM_INFO("mapped mdp address space @%p\n", sde_kms->mmio);
1243
1244         rc = sde_dbg_reg_register_base(SDE_DBG_NAME, sde_kms->mmio,
1245                         sde_kms->mmio_len);
1246         if (rc)
1247                 SDE_ERROR("dbg base register kms failed: %d\n", rc);
1248
1249         sde_kms->vbif[VBIF_RT] = _sde_kms_ioremap(dev->platformdev, "vbif_phys",
1250                         &sde_kms->vbif_len[VBIF_RT]);
1251         if (!sde_kms->vbif[VBIF_RT]) {
1252                 SDE_ERROR("vbif register memory map failed\n");
1253                 goto error;
1254         }
1255
1256         rc = sde_dbg_reg_register_base("vbif_rt", sde_kms->vbif[VBIF_RT],
1257                                 sde_kms->vbif_len[VBIF_RT]);
1258         if (rc)
1259                 SDE_ERROR("dbg base register vbif_rt failed: %d\n", rc);
1260
1261         sde_kms->vbif[VBIF_NRT] = _sde_kms_ioremap(dev->platformdev,
1262                         "vbif_nrt_phys", &sde_kms->vbif_len[VBIF_NRT]);
1263         if (!sde_kms->vbif[VBIF_NRT]) {
1264                 SDE_DEBUG("VBIF NRT is not defined");
1265         } else {
1266                 rc = sde_dbg_reg_register_base("vbif_nrt",
1267                                 sde_kms->vbif[VBIF_NRT],
1268                                 sde_kms->vbif_len[VBIF_NRT]);
1269                 if (rc)
1270                         SDE_ERROR("dbg base register vbif_nrt failed: %d\n",
1271                                         rc);
1272         }
1273
1274         sde_kms->core_client = sde_power_client_create(&priv->phandle, "core");
1275         if (IS_ERR_OR_NULL(sde_kms->core_client)) {
1276                 rc = PTR_ERR(sde_kms->core_client);
1277                 SDE_ERROR("sde power client create failed: %d\n", rc);
1278                 sde_kms->core_client = NULL;
1279                 goto error;
1280         }
1281
1282         rc = sde_power_resource_enable(&priv->phandle, sde_kms->core_client,
1283                 true);
1284         if (rc) {
1285                 SDE_ERROR("resource enable failed: %d\n", rc);
1286                 goto error;
1287         }
1288
1289         _sde_kms_core_hw_rev_init(sde_kms);
1290
1291         pr_info("sde hardware revision:0x%x\n", sde_kms->core_rev);
1292
1293         sde_kms->catalog = sde_hw_catalog_init(dev, sde_kms->core_rev);
1294         if (IS_ERR_OR_NULL(sde_kms->catalog)) {
1295                 rc = PTR_ERR(sde_kms->catalog);
1296                 SDE_ERROR("catalog init failed: %d\n", rc);
1297                 sde_kms->catalog = NULL;
1298                 goto power_error;
1299         }
1300
1301         sde_dbg_init_dbg_buses(sde_kms->core_rev);
1302
1303         rc = sde_rm_init(&sde_kms->rm, sde_kms->catalog, sde_kms->mmio,
1304                         sde_kms->dev);
1305         if (rc) {
1306                 SDE_ERROR("rm init failed: %d\n", rc);
1307                 goto power_error;
1308         }
1309
1310         sde_kms->rm_init = true;
1311
1312         sde_kms->hw_mdp = sde_rm_get_mdp(&sde_kms->rm);
1313         if (IS_ERR_OR_NULL(sde_kms->hw_mdp)) {
1314                 rc = PTR_ERR(sde_kms->hw_mdp);
1315                 SDE_ERROR("failed to get hw_mdp: %d\n", rc);
1316                 sde_kms->hw_mdp = NULL;
1317                 goto power_error;
1318         }
1319
1320         /*
1321          * Read the DISP_INTF_SEL register to check
1322          * whether early display is enabled in LK.
1323          */
1324         rc = sde_splash_get_handoff_status(kms);
1325         if (rc) {
1326                 SDE_ERROR("get early splash status failed: %d\n", rc);
1327                 goto power_error;
1328         }
1329
1330         /*
1331          * when LK has enabled early display, sde_splash_parse_dt and
1332          * sde_splash_init must be called. The first function is to parse the
1333          * mandatory memory node for splash function, and the second function
1334          * will first do bandwidth voting job, because display hardware is now
1335          * accessing AHB data bus, otherwise device reboot will happen, and then
1336          * to check if the memory is reserved.
1337          */
1338         sinfo = &sde_kms->splash_info;
1339         if (sinfo->handoff) {
1340                 rc = sde_splash_parse_dt(dev);
1341                 if (rc) {
1342                         SDE_ERROR("parse dt for splash info failed: %d\n", rc);
1343                         goto power_error;
1344                 }
1345
1346                 sde_splash_init(&priv->phandle, kms);
1347         }
1348
1349         for (i = 0; i < sde_kms->catalog->vbif_count; i++) {
1350                 u32 vbif_idx = sde_kms->catalog->vbif[i].id;
1351
1352                 sde_kms->hw_vbif[i] = sde_hw_vbif_init(vbif_idx,
1353                                 sde_kms->vbif[vbif_idx], sde_kms->catalog);
1354                 if (IS_ERR_OR_NULL(sde_kms->hw_vbif[vbif_idx])) {
1355                         rc = PTR_ERR(sde_kms->hw_vbif[vbif_idx]);
1356                         SDE_ERROR("failed to init vbif %d: %d\n", vbif_idx, rc);
1357                         sde_kms->hw_vbif[vbif_idx] = NULL;
1358                         goto power_error;
1359                 }
1360         }
1361
1362         /*
1363          * Now we need to read the HW catalog and initialize resources such as
1364          * clocks, regulators, GDSC/MMAGIC, ioremap the register ranges etc
1365          */
1366         rc = _sde_kms_mmu_init(sde_kms);
1367         if (rc) {
1368                 SDE_ERROR("sde_kms_mmu_init failed: %d\n", rc);
1369                 goto power_error;
1370         }
1371
1372         /*
1373          * NOTE: Calling sde_debugfs_init here so that the drm_minor device for
1374          *       'primary' is already created.
1375          */
1376         rc = _sde_debugfs_init(sde_kms);
1377         if (rc) {
1378                 SDE_ERROR("sde_debugfs init failed: %d\n", rc);
1379                 goto power_error;
1380         }
1381
1382         rc = sde_core_perf_init(&sde_kms->perf, dev, sde_kms->catalog,
1383                         &priv->phandle, priv->pclient, "core_clk_src",
1384                         sde_kms->debugfs_debug);
1385         if (rc) {
1386                 SDE_ERROR("failed to init perf %d\n", rc);
1387                 goto perf_err;
1388         }
1389
1390         sde_kms->hw_intr = sde_hw_intr_init(sde_kms->mmio, sde_kms->catalog);
1391         if (IS_ERR_OR_NULL(sde_kms->hw_intr)) {
1392                 rc = PTR_ERR(sde_kms->hw_intr);
1393                 SDE_ERROR("hw_intr init failed: %d\n", rc);
1394                 sde_kms->hw_intr = NULL;
1395                 goto hw_intr_init_err;
1396         }
1397
1398         /*
1399          * _sde_kms_drm_obj_init should create the DRM related objects
1400          * i.e. CRTCs, planes, encoders, connectors and so forth
1401          */
1402         rc = _sde_kms_drm_obj_init(sde_kms);
1403         if (rc) {
1404                 SDE_ERROR("modeset init failed: %d\n", rc);
1405                 goto drm_obj_init_err;
1406         }
1407
1408         dev->mode_config.min_width = 0;
1409         dev->mode_config.min_height = 0;
1410
1411         /*
1412          * max crtc width is equal to the max mixer width * 2 and max height is
1413          * is 4K
1414          */
1415         dev->mode_config.max_width = sde_kms->catalog->max_mixer_width * 2;
1416         dev->mode_config.max_height = 4096;
1417
1418         /*
1419          * Support format modifiers for compression etc.
1420          */
1421         dev->mode_config.allow_fb_modifiers = true;
1422
1423         if (!sde_kms->splash_info.handoff)
1424                 sde_power_resource_enable(&priv->phandle,
1425                                 sde_kms->core_client, false);
1426
1427         return 0;
1428
1429 drm_obj_init_err:
1430         sde_core_perf_destroy(&sde_kms->perf);
1431 hw_intr_init_err:
1432 perf_err:
1433 power_error:
1434         sde_power_resource_enable(&priv->phandle, sde_kms->core_client, false);
1435 error:
1436         _sde_kms_hw_destroy(sde_kms, dev->platformdev);
1437 end:
1438         return rc;
1439 }
1440
1441 struct msm_kms *sde_kms_init(struct drm_device *dev)
1442 {
1443         struct msm_drm_private *priv;
1444         struct sde_kms *sde_kms;
1445
1446         if (!dev || !dev->dev_private) {
1447                 SDE_ERROR("drm device node invalid\n");
1448                 return ERR_PTR(-EINVAL);
1449         }
1450
1451         priv = dev->dev_private;
1452
1453         sde_kms = kzalloc(sizeof(*sde_kms), GFP_KERNEL);
1454         if (!sde_kms) {
1455                 SDE_ERROR("failed to allocate sde kms\n");
1456                 return ERR_PTR(-ENOMEM);
1457         }
1458
1459         msm_kms_init(&sde_kms->base, &kms_funcs);
1460         sde_kms->dev = dev;
1461
1462         return &sde_kms->base;
1463 }