xref: /linux/drivers/gpu/drm/msm/msm_mdss.c (revision 40d269c000bda9fcd276a0412a9cebd3f6e344c5)
1 /*
2  * SPDX-License-Identifier: GPL-2.0
3  * Copyright (c) 2018, The Linux Foundation
4  */
5 
6 #include <linux/bitfield.h>
7 #include <linux/clk.h>
8 #include <linux/delay.h>
9 #include <linux/interconnect.h>
10 #include <linux/irq.h>
11 #include <linux/irqchip.h>
12 #include <linux/irqdesc.h>
13 #include <linux/irqchip/chained_irq.h>
14 #include <linux/of_platform.h>
15 #include <linux/platform_device.h>
16 #include <linux/pm_runtime.h>
17 #include <linux/reset.h>
18 
19 #include "msm_mdss.h"
20 #include "msm_kms.h"
21 
22 #define HW_REV				0x0
23 #define HW_INTR_STATUS			0x0010
24 
25 #define UBWC_DEC_HW_VERSION		0x58
26 #define UBWC_STATIC			0x144
27 #define UBWC_CTRL_2			0x150
28 #define UBWC_PREDICTION_MODE		0x154
29 
30 #define MIN_IB_BW	400000000UL /* Min ib vote 400MB */
31 
32 #define DEFAULT_REG_BW	153600 /* Used in mdss fbdev driver */
33 
34 struct msm_mdss {
35 	struct device *dev;
36 
37 	void __iomem *mmio;
38 	struct clk_bulk_data *clocks;
39 	size_t num_clocks;
40 	bool is_mdp5;
41 	struct {
42 		unsigned long enabled_mask;
43 		struct irq_domain *domain;
44 	} irq_controller;
45 	const struct msm_mdss_data *mdss_data;
46 	struct icc_path *mdp_path[2];
47 	u32 num_mdp_paths;
48 	struct icc_path *reg_bus_path;
49 };
50 
51 static int msm_mdss_parse_data_bus_icc_path(struct device *dev,
52 					    struct msm_mdss *msm_mdss)
53 {
54 	struct icc_path *path0;
55 	struct icc_path *path1;
56 	struct icc_path *reg_bus_path;
57 
58 	path0 = devm_of_icc_get(dev, "mdp0-mem");
59 	if (IS_ERR_OR_NULL(path0))
60 		return PTR_ERR_OR_ZERO(path0);
61 
62 	msm_mdss->mdp_path[0] = path0;
63 	msm_mdss->num_mdp_paths = 1;
64 
65 	path1 = devm_of_icc_get(dev, "mdp1-mem");
66 	if (!IS_ERR_OR_NULL(path1)) {
67 		msm_mdss->mdp_path[1] = path1;
68 		msm_mdss->num_mdp_paths++;
69 	}
70 
71 	reg_bus_path = of_icc_get(dev, "cpu-cfg");
72 	if (!IS_ERR_OR_NULL(reg_bus_path))
73 		msm_mdss->reg_bus_path = reg_bus_path;
74 
75 	return 0;
76 }
77 
78 static void msm_mdss_irq(struct irq_desc *desc)
79 {
80 	struct msm_mdss *msm_mdss = irq_desc_get_handler_data(desc);
81 	struct irq_chip *chip = irq_desc_get_chip(desc);
82 	u32 interrupts;
83 
84 	chained_irq_enter(chip, desc);
85 
86 	interrupts = readl_relaxed(msm_mdss->mmio + HW_INTR_STATUS);
87 
88 	while (interrupts) {
89 		irq_hw_number_t hwirq = fls(interrupts) - 1;
90 		int rc;
91 
92 		rc = generic_handle_domain_irq(msm_mdss->irq_controller.domain,
93 					       hwirq);
94 		if (rc < 0) {
95 			dev_err(msm_mdss->dev, "handle irq fail: irq=%lu rc=%d\n",
96 				  hwirq, rc);
97 			break;
98 		}
99 
100 		interrupts &= ~(1 << hwirq);
101 	}
102 
103 	chained_irq_exit(chip, desc);
104 }
105 
106 static void msm_mdss_irq_mask(struct irq_data *irqd)
107 {
108 	struct msm_mdss *msm_mdss = irq_data_get_irq_chip_data(irqd);
109 
110 	/* memory barrier */
111 	smp_mb__before_atomic();
112 	clear_bit(irqd->hwirq, &msm_mdss->irq_controller.enabled_mask);
113 	/* memory barrier */
114 	smp_mb__after_atomic();
115 }
116 
117 static void msm_mdss_irq_unmask(struct irq_data *irqd)
118 {
119 	struct msm_mdss *msm_mdss = irq_data_get_irq_chip_data(irqd);
120 
121 	/* memory barrier */
122 	smp_mb__before_atomic();
123 	set_bit(irqd->hwirq, &msm_mdss->irq_controller.enabled_mask);
124 	/* memory barrier */
125 	smp_mb__after_atomic();
126 }
127 
128 static struct irq_chip msm_mdss_irq_chip = {
129 	.name = "msm_mdss",
130 	.irq_mask = msm_mdss_irq_mask,
131 	.irq_unmask = msm_mdss_irq_unmask,
132 };
133 
134 static struct lock_class_key msm_mdss_lock_key, msm_mdss_request_key;
135 
136 static int msm_mdss_irqdomain_map(struct irq_domain *domain,
137 		unsigned int irq, irq_hw_number_t hwirq)
138 {
139 	struct msm_mdss *msm_mdss = domain->host_data;
140 
141 	irq_set_lockdep_class(irq, &msm_mdss_lock_key, &msm_mdss_request_key);
142 	irq_set_chip_and_handler(irq, &msm_mdss_irq_chip, handle_level_irq);
143 
144 	return irq_set_chip_data(irq, msm_mdss);
145 }
146 
147 static const struct irq_domain_ops msm_mdss_irqdomain_ops = {
148 	.map = msm_mdss_irqdomain_map,
149 	.xlate = irq_domain_xlate_onecell,
150 };
151 
152 static int _msm_mdss_irq_domain_add(struct msm_mdss *msm_mdss)
153 {
154 	struct device *dev;
155 	struct irq_domain *domain;
156 
157 	dev = msm_mdss->dev;
158 
159 	domain = irq_domain_add_linear(dev->of_node, 32,
160 			&msm_mdss_irqdomain_ops, msm_mdss);
161 	if (!domain) {
162 		dev_err(dev, "failed to add irq_domain\n");
163 		return -EINVAL;
164 	}
165 
166 	msm_mdss->irq_controller.enabled_mask = 0;
167 	msm_mdss->irq_controller.domain = domain;
168 
169 	return 0;
170 }
171 
172 static void msm_mdss_setup_ubwc_dec_20(struct msm_mdss *msm_mdss)
173 {
174 	const struct msm_mdss_data *data = msm_mdss->mdss_data;
175 
176 	writel_relaxed(data->ubwc_static, msm_mdss->mmio + UBWC_STATIC);
177 }
178 
179 static void msm_mdss_setup_ubwc_dec_30(struct msm_mdss *msm_mdss)
180 {
181 	const struct msm_mdss_data *data = msm_mdss->mdss_data;
182 	u32 value = (data->ubwc_swizzle & 0x1) |
183 		    (data->highest_bank_bit & 0x3) << 4 |
184 		    (data->macrotile_mode & 0x1) << 12;
185 
186 	if (data->ubwc_enc_version == UBWC_3_0)
187 		value |= BIT(10);
188 
189 	if (data->ubwc_enc_version == UBWC_1_0)
190 		value |= BIT(8);
191 
192 	writel_relaxed(value, msm_mdss->mmio + UBWC_STATIC);
193 }
194 
195 static void msm_mdss_setup_ubwc_dec_40(struct msm_mdss *msm_mdss)
196 {
197 	const struct msm_mdss_data *data = msm_mdss->mdss_data;
198 	u32 value = (data->ubwc_swizzle & 0x7) |
199 		    (data->ubwc_static & 0x1) << 3 |
200 		    (data->highest_bank_bit & 0x7) << 4 |
201 		    (data->macrotile_mode & 0x1) << 12;
202 
203 	writel_relaxed(value, msm_mdss->mmio + UBWC_STATIC);
204 
205 	if (data->ubwc_enc_version == UBWC_3_0) {
206 		writel_relaxed(1, msm_mdss->mmio + UBWC_CTRL_2);
207 		writel_relaxed(0, msm_mdss->mmio + UBWC_PREDICTION_MODE);
208 	} else {
209 		if (data->ubwc_dec_version == UBWC_4_3)
210 			writel_relaxed(3, msm_mdss->mmio + UBWC_CTRL_2);
211 		else
212 			writel_relaxed(2, msm_mdss->mmio + UBWC_CTRL_2);
213 		writel_relaxed(1, msm_mdss->mmio + UBWC_PREDICTION_MODE);
214 	}
215 }
216 
217 #define MDSS_HW_MAJ_MIN		GENMASK(31, 16)
218 
219 #define MDSS_HW_MSM8996		0x1007
220 #define MDSS_HW_MSM8937		0x100e
221 #define MDSS_HW_MSM8953		0x1010
222 #define MDSS_HW_MSM8998		0x3000
223 #define MDSS_HW_SDM660		0x3002
224 #define MDSS_HW_SDM630		0x3003
225 
226 /*
227  * MDP5 platforms use generic qcom,mdp5 compat string, so we have to generate this data
228  */
229 static const struct msm_mdss_data *msm_mdss_generate_mdp5_mdss_data(struct msm_mdss *mdss)
230 {
231 	struct msm_mdss_data *data;
232 	u32 hw_rev;
233 
234 	data = devm_kzalloc(mdss->dev, sizeof(*data), GFP_KERNEL);
235 	if (!data)
236 		return NULL;
237 
238 	hw_rev = readl_relaxed(mdss->mmio + HW_REV);
239 	hw_rev = FIELD_GET(MDSS_HW_MAJ_MIN, hw_rev);
240 
241 	if (hw_rev == MDSS_HW_MSM8996 ||
242 	    hw_rev == MDSS_HW_MSM8937 ||
243 	    hw_rev == MDSS_HW_MSM8953 ||
244 	    hw_rev == MDSS_HW_MSM8998 ||
245 	    hw_rev == MDSS_HW_SDM660 ||
246 	    hw_rev == MDSS_HW_SDM630) {
247 		data->ubwc_dec_version = UBWC_1_0;
248 		data->ubwc_enc_version = UBWC_1_0;
249 	}
250 
251 	if (hw_rev == MDSS_HW_MSM8996 ||
252 	    hw_rev == MDSS_HW_MSM8998)
253 		data->highest_bank_bit = 2;
254 	else
255 		data->highest_bank_bit = 1;
256 
257 	return data;
258 }
259 
260 const struct msm_mdss_data *msm_mdss_get_mdss_data(struct device *dev)
261 {
262 	struct msm_mdss *mdss;
263 
264 	if (!dev)
265 		return ERR_PTR(-EINVAL);
266 
267 	mdss = dev_get_drvdata(dev);
268 
269 	/*
270 	 * We could not do it at the probe time, since hw revision register was
271 	 * not readable. Fill data structure now for the MDP5 platforms.
272 	 */
273 	if (!mdss->mdss_data && mdss->is_mdp5)
274 		mdss->mdss_data = msm_mdss_generate_mdp5_mdss_data(mdss);
275 
276 	return mdss->mdss_data;
277 }
278 
279 static int msm_mdss_enable(struct msm_mdss *msm_mdss)
280 {
281 	int ret, i;
282 
283 	/*
284 	 * Several components have AXI clocks that can only be turned on if
285 	 * the interconnect is enabled (non-zero bandwidth). Let's make sure
286 	 * that the interconnects are at least at a minimum amount.
287 	 */
288 	for (i = 0; i < msm_mdss->num_mdp_paths; i++)
289 		icc_set_bw(msm_mdss->mdp_path[i], 0, Bps_to_icc(MIN_IB_BW));
290 
291 	if (msm_mdss->mdss_data && msm_mdss->mdss_data->reg_bus_bw)
292 		icc_set_bw(msm_mdss->reg_bus_path, 0,
293 			   msm_mdss->mdss_data->reg_bus_bw);
294 	else
295 		icc_set_bw(msm_mdss->reg_bus_path, 0,
296 			   DEFAULT_REG_BW);
297 
298 	ret = clk_bulk_prepare_enable(msm_mdss->num_clocks, msm_mdss->clocks);
299 	if (ret) {
300 		dev_err(msm_mdss->dev, "clock enable failed, ret:%d\n", ret);
301 		return ret;
302 	}
303 
304 	/*
305 	 * Register access requires MDSS_MDP_CLK, which is not enabled by the
306 	 * mdss on mdp5 hardware. Skip it for now.
307 	 */
308 	if (msm_mdss->is_mdp5 || !msm_mdss->mdss_data)
309 		return 0;
310 
311 	/*
312 	 * ubwc config is part of the "mdss" region which is not accessible
313 	 * from the rest of the driver. hardcode known configurations here
314 	 *
315 	 * Decoder version can be read from the UBWC_DEC_HW_VERSION reg,
316 	 * UBWC_n and the rest of params comes from hw data.
317 	 */
318 	switch (msm_mdss->mdss_data->ubwc_dec_version) {
319 	case 0: /* no UBWC */
320 	case UBWC_1_0:
321 		/* do nothing */
322 		break;
323 	case UBWC_2_0:
324 		msm_mdss_setup_ubwc_dec_20(msm_mdss);
325 		break;
326 	case UBWC_3_0:
327 		msm_mdss_setup_ubwc_dec_30(msm_mdss);
328 		break;
329 	case UBWC_4_0:
330 	case UBWC_4_3:
331 		msm_mdss_setup_ubwc_dec_40(msm_mdss);
332 		break;
333 	default:
334 		dev_err(msm_mdss->dev, "Unsupported UBWC decoder version %x\n",
335 			msm_mdss->mdss_data->ubwc_dec_version);
336 		dev_err(msm_mdss->dev, "HW_REV: 0x%x\n",
337 			readl_relaxed(msm_mdss->mmio + HW_REV));
338 		dev_err(msm_mdss->dev, "UBWC_DEC_HW_VERSION: 0x%x\n",
339 			readl_relaxed(msm_mdss->mmio + UBWC_DEC_HW_VERSION));
340 		break;
341 	}
342 
343 	return ret;
344 }
345 
346 static int msm_mdss_disable(struct msm_mdss *msm_mdss)
347 {
348 	int i;
349 
350 	clk_bulk_disable_unprepare(msm_mdss->num_clocks, msm_mdss->clocks);
351 
352 	for (i = 0; i < msm_mdss->num_mdp_paths; i++)
353 		icc_set_bw(msm_mdss->mdp_path[i], 0, 0);
354 
355 	if (msm_mdss->reg_bus_path)
356 		icc_set_bw(msm_mdss->reg_bus_path, 0, 0);
357 
358 	return 0;
359 }
360 
361 static void msm_mdss_destroy(struct msm_mdss *msm_mdss)
362 {
363 	struct platform_device *pdev = to_platform_device(msm_mdss->dev);
364 	int irq;
365 
366 	pm_runtime_suspend(msm_mdss->dev);
367 	pm_runtime_disable(msm_mdss->dev);
368 	irq_domain_remove(msm_mdss->irq_controller.domain);
369 	msm_mdss->irq_controller.domain = NULL;
370 	irq = platform_get_irq(pdev, 0);
371 	irq_set_chained_handler_and_data(irq, NULL, NULL);
372 }
373 
374 static int msm_mdss_reset(struct device *dev)
375 {
376 	struct reset_control *reset;
377 
378 	reset = reset_control_get_optional_exclusive(dev, NULL);
379 	if (!reset) {
380 		/* Optional reset not specified */
381 		return 0;
382 	} else if (IS_ERR(reset)) {
383 		return dev_err_probe(dev, PTR_ERR(reset),
384 				     "failed to acquire mdss reset\n");
385 	}
386 
387 	reset_control_assert(reset);
388 	/*
389 	 * Tests indicate that reset has to be held for some period of time,
390 	 * make it one frame in a typical system
391 	 */
392 	msleep(20);
393 	reset_control_deassert(reset);
394 
395 	reset_control_put(reset);
396 
397 	return 0;
398 }
399 
400 /*
401  * MDP5 MDSS uses at most three specified clocks.
402  */
403 #define MDP5_MDSS_NUM_CLOCKS 3
404 static int mdp5_mdss_parse_clock(struct platform_device *pdev, struct clk_bulk_data **clocks)
405 {
406 	struct clk_bulk_data *bulk;
407 	int num_clocks = 0;
408 	int ret;
409 
410 	if (!pdev)
411 		return -EINVAL;
412 
413 	bulk = devm_kcalloc(&pdev->dev, MDP5_MDSS_NUM_CLOCKS, sizeof(struct clk_bulk_data), GFP_KERNEL);
414 	if (!bulk)
415 		return -ENOMEM;
416 
417 	bulk[num_clocks++].id = "iface";
418 	bulk[num_clocks++].id = "bus";
419 	bulk[num_clocks++].id = "vsync";
420 
421 	ret = devm_clk_bulk_get_optional(&pdev->dev, num_clocks, bulk);
422 	if (ret)
423 		return ret;
424 
425 	*clocks = bulk;
426 
427 	return num_clocks;
428 }
429 
430 static struct msm_mdss *msm_mdss_init(struct platform_device *pdev, bool is_mdp5)
431 {
432 	struct msm_mdss *msm_mdss;
433 	int ret;
434 	int irq;
435 
436 	ret = msm_mdss_reset(&pdev->dev);
437 	if (ret)
438 		return ERR_PTR(ret);
439 
440 	msm_mdss = devm_kzalloc(&pdev->dev, sizeof(*msm_mdss), GFP_KERNEL);
441 	if (!msm_mdss)
442 		return ERR_PTR(-ENOMEM);
443 
444 	msm_mdss->mdss_data = of_device_get_match_data(&pdev->dev);
445 
446 	msm_mdss->mmio = devm_platform_ioremap_resource_byname(pdev, is_mdp5 ? "mdss_phys" : "mdss");
447 	if (IS_ERR(msm_mdss->mmio))
448 		return ERR_CAST(msm_mdss->mmio);
449 
450 	dev_dbg(&pdev->dev, "mapped mdss address space @%pK\n", msm_mdss->mmio);
451 
452 	ret = msm_mdss_parse_data_bus_icc_path(&pdev->dev, msm_mdss);
453 	if (ret)
454 		return ERR_PTR(ret);
455 
456 	if (is_mdp5)
457 		ret = mdp5_mdss_parse_clock(pdev, &msm_mdss->clocks);
458 	else
459 		ret = devm_clk_bulk_get_all(&pdev->dev, &msm_mdss->clocks);
460 	if (ret < 0) {
461 		dev_err(&pdev->dev, "failed to parse clocks, ret=%d\n", ret);
462 		return ERR_PTR(ret);
463 	}
464 	msm_mdss->num_clocks = ret;
465 	msm_mdss->is_mdp5 = is_mdp5;
466 
467 	msm_mdss->dev = &pdev->dev;
468 
469 	irq = platform_get_irq(pdev, 0);
470 	if (irq < 0)
471 		return ERR_PTR(irq);
472 
473 	ret = _msm_mdss_irq_domain_add(msm_mdss);
474 	if (ret)
475 		return ERR_PTR(ret);
476 
477 	irq_set_chained_handler_and_data(irq, msm_mdss_irq,
478 					 msm_mdss);
479 
480 	pm_runtime_enable(&pdev->dev);
481 
482 	return msm_mdss;
483 }
484 
485 static int __maybe_unused mdss_runtime_suspend(struct device *dev)
486 {
487 	struct msm_mdss *mdss = dev_get_drvdata(dev);
488 
489 	DBG("");
490 
491 	return msm_mdss_disable(mdss);
492 }
493 
494 static int __maybe_unused mdss_runtime_resume(struct device *dev)
495 {
496 	struct msm_mdss *mdss = dev_get_drvdata(dev);
497 
498 	DBG("");
499 
500 	return msm_mdss_enable(mdss);
501 }
502 
503 static int __maybe_unused mdss_pm_suspend(struct device *dev)
504 {
505 
506 	if (pm_runtime_suspended(dev))
507 		return 0;
508 
509 	return mdss_runtime_suspend(dev);
510 }
511 
512 static int __maybe_unused mdss_pm_resume(struct device *dev)
513 {
514 	if (pm_runtime_suspended(dev))
515 		return 0;
516 
517 	return mdss_runtime_resume(dev);
518 }
519 
520 static const struct dev_pm_ops mdss_pm_ops = {
521 	SET_SYSTEM_SLEEP_PM_OPS(mdss_pm_suspend, mdss_pm_resume)
522 	SET_RUNTIME_PM_OPS(mdss_runtime_suspend, mdss_runtime_resume, NULL)
523 };
524 
525 static int mdss_probe(struct platform_device *pdev)
526 {
527 	struct msm_mdss *mdss;
528 	bool is_mdp5 = of_device_is_compatible(pdev->dev.of_node, "qcom,mdss");
529 	struct device *dev = &pdev->dev;
530 	int ret;
531 
532 	mdss = msm_mdss_init(pdev, is_mdp5);
533 	if (IS_ERR(mdss))
534 		return PTR_ERR(mdss);
535 
536 	platform_set_drvdata(pdev, mdss);
537 
538 	/*
539 	 * MDP5/DPU based devices don't have a flat hierarchy. There is a top
540 	 * level parent: MDSS, and children: MDP5/DPU, DSI, HDMI, eDP etc.
541 	 * Populate the children devices, find the MDP5/DPU node, and then add
542 	 * the interfaces to our components list.
543 	 */
544 	ret = of_platform_populate(dev->of_node, NULL, NULL, dev);
545 	if (ret) {
546 		DRM_DEV_ERROR(dev, "failed to populate children devices\n");
547 		msm_mdss_destroy(mdss);
548 		return ret;
549 	}
550 
551 	return 0;
552 }
553 
554 static void mdss_remove(struct platform_device *pdev)
555 {
556 	struct msm_mdss *mdss = platform_get_drvdata(pdev);
557 
558 	of_platform_depopulate(&pdev->dev);
559 
560 	msm_mdss_destroy(mdss);
561 }
562 
563 static const struct msm_mdss_data msm8998_data = {
564 	.ubwc_enc_version = UBWC_1_0,
565 	.ubwc_dec_version = UBWC_1_0,
566 	.highest_bank_bit = 2,
567 	.reg_bus_bw = 76800,
568 };
569 
570 static const struct msm_mdss_data qcm2290_data = {
571 	/* no UBWC */
572 	.highest_bank_bit = 0x2,
573 	.reg_bus_bw = 76800,
574 };
575 
576 static const struct msm_mdss_data sc7180_data = {
577 	.ubwc_enc_version = UBWC_2_0,
578 	.ubwc_dec_version = UBWC_2_0,
579 	.ubwc_static = 0x1e,
580 	.highest_bank_bit = 0x3,
581 	.reg_bus_bw = 76800,
582 };
583 
584 static const struct msm_mdss_data sc7280_data = {
585 	.ubwc_enc_version = UBWC_3_0,
586 	.ubwc_dec_version = UBWC_4_0,
587 	.ubwc_swizzle = 6,
588 	.ubwc_static = 1,
589 	.highest_bank_bit = 1,
590 	.macrotile_mode = 1,
591 	.reg_bus_bw = 74000,
592 };
593 
594 static const struct msm_mdss_data sc8180x_data = {
595 	.ubwc_enc_version = UBWC_3_0,
596 	.ubwc_dec_version = UBWC_3_0,
597 	.highest_bank_bit = 3,
598 	.macrotile_mode = 1,
599 	.reg_bus_bw = 76800,
600 };
601 
602 static const struct msm_mdss_data sc8280xp_data = {
603 	.ubwc_enc_version = UBWC_4_0,
604 	.ubwc_dec_version = UBWC_4_0,
605 	.ubwc_swizzle = 6,
606 	.ubwc_static = 1,
607 	.highest_bank_bit = 3,
608 	.macrotile_mode = 1,
609 	.reg_bus_bw = 76800,
610 };
611 
612 static const struct msm_mdss_data sdm670_data = {
613 	.ubwc_enc_version = UBWC_2_0,
614 	.ubwc_dec_version = UBWC_2_0,
615 	.highest_bank_bit = 1,
616 	.reg_bus_bw = 76800,
617 };
618 
619 static const struct msm_mdss_data sdm845_data = {
620 	.ubwc_enc_version = UBWC_2_0,
621 	.ubwc_dec_version = UBWC_2_0,
622 	.highest_bank_bit = 2,
623 	.reg_bus_bw = 76800,
624 };
625 
626 static const struct msm_mdss_data sm6350_data = {
627 	.ubwc_enc_version = UBWC_2_0,
628 	.ubwc_dec_version = UBWC_2_0,
629 	.ubwc_swizzle = 6,
630 	.ubwc_static = 0x1e,
631 	.highest_bank_bit = 1,
632 	.reg_bus_bw = 76800,
633 };
634 
635 static const struct msm_mdss_data sm8150_data = {
636 	.ubwc_enc_version = UBWC_3_0,
637 	.ubwc_dec_version = UBWC_3_0,
638 	.highest_bank_bit = 2,
639 	.reg_bus_bw = 76800,
640 };
641 
642 static const struct msm_mdss_data sm6115_data = {
643 	.ubwc_enc_version = UBWC_1_0,
644 	.ubwc_dec_version = UBWC_2_0,
645 	.ubwc_swizzle = 7,
646 	.ubwc_static = 0x11f,
647 	.highest_bank_bit = 0x1,
648 	.reg_bus_bw = 76800,
649 };
650 
651 static const struct msm_mdss_data sm6125_data = {
652 	.ubwc_enc_version = UBWC_1_0,
653 	.ubwc_dec_version = UBWC_3_0,
654 	.ubwc_swizzle = 1,
655 	.highest_bank_bit = 1,
656 };
657 
658 static const struct msm_mdss_data sm8250_data = {
659 	.ubwc_enc_version = UBWC_4_0,
660 	.ubwc_dec_version = UBWC_4_0,
661 	.ubwc_swizzle = 6,
662 	.ubwc_static = 1,
663 	/* TODO: highest_bank_bit = 2 for LP_DDR4 */
664 	.highest_bank_bit = 3,
665 	.macrotile_mode = 1,
666 	.reg_bus_bw = 76800,
667 };
668 
669 static const struct msm_mdss_data sm8350_data = {
670 	.ubwc_enc_version = UBWC_4_0,
671 	.ubwc_dec_version = UBWC_4_0,
672 	.ubwc_swizzle = 6,
673 	.ubwc_static = 1,
674 	/* TODO: highest_bank_bit = 2 for LP_DDR4 */
675 	.highest_bank_bit = 3,
676 	.macrotile_mode = 1,
677 	.reg_bus_bw = 74000,
678 };
679 
680 static const struct msm_mdss_data sm8550_data = {
681 	.ubwc_enc_version = UBWC_4_0,
682 	.ubwc_dec_version = UBWC_4_3,
683 	.ubwc_swizzle = 6,
684 	.ubwc_static = 1,
685 	/* TODO: highest_bank_bit = 2 for LP_DDR4 */
686 	.highest_bank_bit = 3,
687 	.macrotile_mode = 1,
688 	.reg_bus_bw = 57000,
689 };
690 
691 static const struct msm_mdss_data x1e80100_data = {
692 	.ubwc_enc_version = UBWC_4_0,
693 	.ubwc_dec_version = UBWC_4_3,
694 	.ubwc_swizzle = 6,
695 	.ubwc_static = 1,
696 	/* TODO: highest_bank_bit = 2 for LP_DDR4 */
697 	.highest_bank_bit = 3,
698 	.macrotile_mode = 1,
699 	/* TODO: Add reg_bus_bw with real value */
700 };
701 
702 static const struct of_device_id mdss_dt_match[] = {
703 	{ .compatible = "qcom,mdss" },
704 	{ .compatible = "qcom,msm8998-mdss", .data = &msm8998_data },
705 	{ .compatible = "qcom,qcm2290-mdss", .data = &qcm2290_data },
706 	{ .compatible = "qcom,sdm670-mdss", .data = &sdm670_data },
707 	{ .compatible = "qcom,sdm845-mdss", .data = &sdm845_data },
708 	{ .compatible = "qcom,sc7180-mdss", .data = &sc7180_data },
709 	{ .compatible = "qcom,sc7280-mdss", .data = &sc7280_data },
710 	{ .compatible = "qcom,sc8180x-mdss", .data = &sc8180x_data },
711 	{ .compatible = "qcom,sc8280xp-mdss", .data = &sc8280xp_data },
712 	{ .compatible = "qcom,sm6115-mdss", .data = &sm6115_data },
713 	{ .compatible = "qcom,sm6125-mdss", .data = &sm6125_data },
714 	{ .compatible = "qcom,sm6350-mdss", .data = &sm6350_data },
715 	{ .compatible = "qcom,sm6375-mdss", .data = &sm6350_data },
716 	{ .compatible = "qcom,sm8150-mdss", .data = &sm8150_data },
717 	{ .compatible = "qcom,sm8250-mdss", .data = &sm8250_data },
718 	{ .compatible = "qcom,sm8350-mdss", .data = &sm8350_data },
719 	{ .compatible = "qcom,sm8450-mdss", .data = &sm8350_data },
720 	{ .compatible = "qcom,sm8550-mdss", .data = &sm8550_data },
721 	{ .compatible = "qcom,sm8650-mdss", .data = &sm8550_data},
722 	{ .compatible = "qcom,x1e80100-mdss", .data = &x1e80100_data},
723 	{}
724 };
725 MODULE_DEVICE_TABLE(of, mdss_dt_match);
726 
727 static struct platform_driver mdss_platform_driver = {
728 	.probe      = mdss_probe,
729 	.remove_new = mdss_remove,
730 	.driver     = {
731 		.name   = "msm-mdss",
732 		.of_match_table = mdss_dt_match,
733 		.pm     = &mdss_pm_ops,
734 	},
735 };
736 
737 void __init msm_mdss_register(void)
738 {
739 	platform_driver_register(&mdss_platform_driver);
740 }
741 
742 void __exit msm_mdss_unregister(void)
743 {
744 	platform_driver_unregister(&mdss_platform_driver);
745 }
746