blob: 17bad069c465b6ef88a0d28430f34412c89d5e23 [file] [log] [blame]
Sachin Bhayareeeb88892018-01-02 16:36:01 +05301/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13
14#ifndef MDSS_H
15#define MDSS_H
16
17#include <linux/msm_ion.h>
18#include <linux/msm_mdp.h>
19#include <linux/spinlock.h>
20#include <linux/types.h>
21#include <linux/workqueue.h>
22#include <linux/irqreturn.h>
23#include <linux/irqdomain.h>
24#include <linux/mdss_io_util.h>
25
26#include <linux/msm-bus.h>
27#include <linux/file.h>
28#include <linux/dma-direction.h>
29
30#include "mdss_panel.h"
31
32#define MAX_DRV_SUP_MMB_BLKS 44
33#define MAX_DRV_SUP_PIPES 10
34#define MAX_CLIENT_NAME_LEN 20
35
36#define MDSS_PINCTRL_STATE_DEFAULT "mdss_default"
37#define MDSS_PINCTRL_STATE_SLEEP "mdss_sleep"
38
39enum mdss_mdp_clk_type {
40 MDSS_CLK_AHB,
41 MDSS_CLK_AXI,
42 MDSS_CLK_MDP_CORE,
43 MDSS_CLK_MDP_LUT,
44 MDSS_CLK_MDP_VSYNC,
45 MDSS_MAX_CLK
46};
47
48enum mdss_iommu_domain_type {
49 MDSS_IOMMU_DOMAIN_UNSECURE,
50 MDSS_IOMMU_DOMAIN_ROT_UNSECURE,
51 MDSS_IOMMU_DOMAIN_SECURE,
52 MDSS_IOMMU_DOMAIN_ROT_SECURE,
53 MDSS_IOMMU_MAX_DOMAIN
54};
55
56enum mdss_bus_vote_type {
57 VOTE_INDEX_DISABLE,
58 VOTE_INDEX_LOW,
59 VOTE_INDEX_MID,
60 VOTE_INDEX_HIGH,
61 VOTE_INDEX_MAX,
62};
63
64struct mdss_hw_settings {
65 char __iomem *reg;
66 u32 val;
67};
68
69struct mdss_max_bw_settings {
70 u32 mdss_max_bw_mode;
71 u32 mdss_max_bw_val;
72};
73
74struct mdss_debug_inf {
75 void *debug_data;
76 void (*debug_enable_clock)(int on);
77};
78
79struct mdss_perf_tune {
80 unsigned long min_mdp_clk;
81 u64 min_bus_vote;
82};
83
84#define MDSS_IRQ_SUSPEND -1
85#define MDSS_IRQ_RESUME 1
86#define MDSS_IRQ_REQ 0
87
88struct mdss_intr {
89 /* requested intr */
90 u32 req;
91 /* currently enabled intr */
92 u32 curr;
93 int state;
94 spinlock_t lock;
95};
96
97struct simplified_prefill_factors {
98 u32 fmt_mt_nv12_factor;
99 u32 fmt_mt_factor;
100 u32 fmt_linear_factor;
101 u32 scale_factor;
102 u32 xtra_ff_factor;
103};
104
105struct mdss_prefill_data {
106 u32 ot_bytes;
107 u32 y_buf_bytes;
108 u32 y_scaler_lines_bilinear;
109 u32 y_scaler_lines_caf;
110 u32 post_scaler_pixels;
111 u32 pp_pixels;
112 u32 fbc_lines;
113 u32 ts_threshold;
114 u32 ts_end;
115 u32 ts_overhead;
116 struct mult_factor ts_rate;
117 struct simplified_prefill_factors prefill_factors;
118};
119
120struct mdss_mdp_dsc {
121 u32 num;
122 char __iomem *base;
123};
124
125enum mdss_hw_index {
126 MDSS_HW_MDP,
127 MDSS_HW_DSI0 = 1,
128 MDSS_HW_DSI1,
129 MDSS_HW_HDMI,
130 MDSS_HW_EDP,
131 MDSS_HW_MISC,
132 MDSS_MAX_HW_BLK
133};
134
135enum mdss_bus_clients {
136 MDSS_MDP_RT,
137 MDSS_DSI_RT,
138 MDSS_HW_RT,
139 MDSS_MDP_NRT,
140 MDSS_MAX_BUS_CLIENTS
141};
142
143struct mdss_pp_block_off {
144 u32 sspp_igc_lut_off;
145 u32 vig_pcc_off;
146 u32 rgb_pcc_off;
147 u32 dma_pcc_off;
148 u32 lm_pgc_off;
149 u32 dspp_gamut_off;
150 u32 dspp_pcc_off;
151 u32 dspp_pgc_off;
152};
153
154enum mdss_hw_quirk {
155 MDSS_QUIRK_BWCPANIC,
156 MDSS_QUIRK_ROTCDP,
157 MDSS_QUIRK_DOWNSCALE_HANG,
158 MDSS_QUIRK_DSC_RIGHT_ONLY_PU,
159 MDSS_QUIRK_DSC_2SLICE_PU_THRPUT,
160 MDSS_QUIRK_DMA_BI_DIR,
161 MDSS_QUIRK_FMT_PACK_PATTERN,
162 MDSS_QUIRK_NEED_SECURE_MAP,
163 MDSS_QUIRK_SRC_SPLIT_ALWAYS,
164 MDSS_QUIRK_HDR_SUPPORT_ENABLED,
165 MDSS_QUIRK_MAX,
166};
167
168enum mdss_hw_capabilities {
169 MDSS_CAPS_YUV_CONFIG,
170 MDSS_CAPS_SCM_RESTORE_NOT_REQUIRED,
171 MDSS_CAPS_3D_MUX_UNDERRUN_RECOVERY_SUPPORTED,
172 MDSS_CAPS_MIXER_1_FOR_WB,
173 MDSS_CAPS_QSEED3,
174 MDSS_CAPS_DEST_SCALER,
175 MDSS_CAPS_10_BIT_SUPPORTED,
176 MDSS_CAPS_MAX,
177};
178
179enum mdss_qos_settings {
180 MDSS_QOS_PER_PIPE_IB,
181 MDSS_QOS_OVERHEAD_FACTOR,
182 MDSS_QOS_CDP,
183 MDSS_QOS_OTLIM,
184 MDSS_QOS_PER_PIPE_LUT,
185 MDSS_QOS_SIMPLIFIED_PREFILL,
186 MDSS_QOS_VBLANK_PANIC_CTRL,
187 MDSS_QOS_TS_PREFILL,
188 MDSS_QOS_REMAPPER,
189 MDSS_QOS_IB_NOCR,
190 MDSS_QOS_MAX,
191};
192
193enum mdss_mdp_pipe_type {
194 MDSS_MDP_PIPE_TYPE_INVALID = -1,
195 MDSS_MDP_PIPE_TYPE_VIG = 0,
196 MDSS_MDP_PIPE_TYPE_RGB,
197 MDSS_MDP_PIPE_TYPE_DMA,
198 MDSS_MDP_PIPE_TYPE_CURSOR,
199 MDSS_MDP_PIPE_TYPE_MAX,
200};
201
202struct reg_bus_client {
203 char name[MAX_CLIENT_NAME_LEN];
204 short usecase_ndx;
205 u32 id;
206 struct list_head list;
207};
208
209struct mdss_smmu_client {
210 struct device *dev;
211 struct dma_iommu_mapping *mmu_mapping;
Sachin Bhayare5076e252018-01-18 14:56:45 +0530212 struct mdss_module_power mp;
Sachin Bhayareeeb88892018-01-02 16:36:01 +0530213 struct reg_bus_client *reg_bus_clt;
214 bool domain_attached;
215 bool handoff_pending;
216 char __iomem *mmu_base;
217};
218
219struct mdss_mdp_qseed3_lut_tbl {
220 bool valid;
221 u32 *dir_lut;
222 u32 *cir_lut;
223 u32 *sep_lut;
224};
225
226struct mdss_scaler_block {
227 u32 vig_scaler_off;
228 u32 vig_scaler_lut_off;
229 u32 has_dest_scaler;
230 char __iomem *dest_base;
231 u32 ndest_scalers;
232 u32 *dest_scaler_off;
233 u32 *dest_scaler_lut_off;
234 struct mdss_mdp_qseed3_lut_tbl lut_tbl;
235};
236
237struct mdss_data_type;
238
239struct mdss_smmu_ops {
240 int (*smmu_attach)(struct mdss_data_type *mdata);
241 int (*smmu_detach)(struct mdss_data_type *mdata);
242 int (*smmu_get_domain_id)(u32 type);
243 struct dma_buf_attachment * (*smmu_dma_buf_attach)(
244 struct dma_buf *dma_buf, struct device *devce,
245 int domain);
246 int (*smmu_map_dma_buf)(struct dma_buf *dma_buf,
247 struct sg_table *table, int domain,
248 dma_addr_t *iova, unsigned long *size, int dir);
249 void (*smmu_unmap_dma_buf)(struct sg_table *table, int domain,
250 int dir, struct dma_buf *dma_buf);
251 int (*smmu_dma_alloc_coherent)(struct device *dev, size_t size,
252 dma_addr_t *phys, dma_addr_t *iova, void **cpu_addr,
253 gfp_t gfp, int domain);
254 void (*smmu_dma_free_coherent)(struct device *dev, size_t size,
255 void *cpu_addr, dma_addr_t phys, dma_addr_t iova,
256 int domain);
257 int (*smmu_map)(int domain, phys_addr_t iova, phys_addr_t phys, int
258 gfp_order, int prot);
259 void (*smmu_unmap)(int domain, unsigned long iova, int gfp_order);
260 char * (*smmu_dsi_alloc_buf)(struct device *dev, int size,
261 dma_addr_t *dmap, gfp_t gfp);
262 int (*smmu_dsi_map_buffer)(phys_addr_t phys, unsigned int domain,
263 unsigned long size, dma_addr_t *dma_addr,
264 void *cpu_addr, int dir);
265 void (*smmu_dsi_unmap_buffer)(dma_addr_t dma_addr, int domain,
266 unsigned long size, int dir);
267 void (*smmu_deinit)(struct mdss_data_type *mdata);
268 struct sg_table * (*smmu_sg_table_clone)(struct sg_table *orig_table,
269 gfp_t gfp_mask, bool padding);
270};
271
272struct mdss_data_type {
273 u32 mdp_rev;
274 struct clk *mdp_clk[MDSS_MAX_CLK];
275 struct regulator *fs;
276 struct regulator *venus;
277 struct regulator *vdd_cx;
278 bool batfet_required;
279 struct regulator *batfet;
280 bool en_svs_high;
281 u32 max_mdp_clk_rate;
282 struct mdss_util_intf *mdss_util;
283 struct mdss_panel_data *pdata;
284
285 struct platform_device *pdev;
Sachin Bhayare5076e252018-01-18 14:56:45 +0530286 struct mdss_io_data mdss_io;
287 struct mdss_io_data vbif_io;
288 struct mdss_io_data vbif_nrt_io;
Sachin Bhayareeeb88892018-01-02 16:36:01 +0530289 char __iomem *mdp_base;
290
291 struct mdss_smmu_client mdss_smmu[MDSS_IOMMU_MAX_DOMAIN];
292 struct mdss_smmu_ops smmu_ops;
293 struct mutex reg_lock;
294
295 /* bitmap to track pipes that have BWC enabled */
296 DECLARE_BITMAP(bwc_enable_map, MAX_DRV_SUP_PIPES);
297 /* bitmap to track hw workarounds */
298 DECLARE_BITMAP(mdss_quirk_map, MDSS_QUIRK_MAX);
299 /* bitmap to track total mmbs in use */
300 DECLARE_BITMAP(mmb_alloc_map, MAX_DRV_SUP_MMB_BLKS);
301 /* bitmap to track qos applicable settings */
302 DECLARE_BITMAP(mdss_qos_map, MDSS_QOS_MAX);
303 /* bitmap to track hw capabilities/features */
304 DECLARE_BITMAP(mdss_caps_map, MDSS_CAPS_MAX);
305
306 u32 has_bwc;
307 /* values used when HW has a common panic/robust LUT */
308 u32 default_panic_lut0;
309 u32 default_panic_lut1;
310 u32 default_robust_lut;
311
312 /* values used when HW has panic/robust LUTs per pipe */
313 u32 default_panic_lut_per_pipe_linear;
314 u32 default_panic_lut_per_pipe_tile;
315 u32 default_robust_lut_per_pipe_linear;
316 u32 default_robust_lut_per_pipe_tile;
317
318 u32 has_decimation;
319 bool has_fixed_qos_arbiter_enabled;
320 bool has_panic_ctrl;
321 u32 wfd_mode;
322 u32 has_no_lut_read;
323 atomic_t sd_client_count;
324 u8 has_wb_ad;
325 u8 has_non_scalar_rgb;
326 bool has_src_split;
327 bool idle_pc_enabled;
328 bool has_pingpong_split;
329 bool has_pixel_ram;
330 bool needs_hist_vote;
331 bool has_ubwc;
332 bool has_wb_ubwc;
333 bool has_separate_rotator;
334
335 u32 default_ot_rd_limit;
336 u32 default_ot_wr_limit;
337
338 struct irq_domain *irq_domain;
339 u32 *mdp_irq_mask;
340 u32 mdp_hist_irq_mask;
341 u32 mdp_intf_irq_mask;
342
343 int suspend_fs_ena;
344 u8 clk_ena;
345 u8 fs_ena;
346 u8 vsync_ena;
347
348 struct notifier_block gdsc_cb;
349
350 u32 res_init;
351
352 u32 highest_bank_bit;
353 u32 smp_mb_cnt;
354 u32 smp_mb_size;
355 u32 smp_mb_per_pipe;
356 u32 pixel_ram_size;
357
358 u32 rot_block_size;
359
360 /* HW RT bus (AXI) */
361 u32 hw_rt_bus_hdl;
362 u32 hw_rt_bus_ref_cnt;
363
364 /* data bus (AXI) */
365 u32 bus_hdl;
366 u32 bus_ref_cnt;
367 struct mutex bus_lock;
368
369 /* register bus (AHB) */
370 u32 reg_bus_hdl;
371 u32 reg_bus_usecase_ndx;
372 struct list_head reg_bus_clist;
373 struct mutex reg_bus_lock;
374 struct reg_bus_client *reg_bus_clt;
375 struct reg_bus_client *pp_reg_bus_clt;
376
377 u32 axi_port_cnt;
378 u32 nrt_axi_port_cnt;
379 u32 bus_channels;
380 u32 curr_bw_uc_idx;
381 u32 ao_bw_uc_idx; /* active only idx */
382 struct msm_bus_scale_pdata *bus_scale_table;
383 struct msm_bus_scale_pdata *reg_bus_scale_table;
384 struct msm_bus_scale_pdata *hw_rt_bus_scale_table;
385 u32 max_bw_low;
386 u32 max_bw_high;
387 u32 max_bw_per_pipe;
388 u32 *vbif_rt_qos;
389 u32 *vbif_nrt_qos;
390 u32 npriority_lvl;
391 u32 rot_dwnscale_min;
392 u32 rot_dwnscale_max;
393
394 struct mult_factor ab_factor;
395 struct mult_factor ib_factor;
396 struct mult_factor ib_factor_overlap;
397 struct mult_factor clk_factor;
398 struct mult_factor per_pipe_ib_factor;
399 bool apply_post_scale_bytes;
400 bool hflip_buffer_reused;
401
402 u32 disable_prefill;
403 u32 *clock_levels;
404 u32 nclk_lvl;
405
406 u32 enable_gate;
407 u32 enable_bw_release;
408 u32 enable_rotator_bw_release;
409 u32 serialize_wait4pp;
410 u32 wait4autorefresh;
411 u32 lines_before_active;
412
413 struct mdss_hw_settings *hw_settings;
414
415 int rects_per_sspp[MDSS_MDP_PIPE_TYPE_MAX];
416 struct mdss_mdp_pipe *vig_pipes;
417 struct mdss_mdp_pipe *rgb_pipes;
418 struct mdss_mdp_pipe *dma_pipes;
419 struct mdss_mdp_pipe *cursor_pipes;
420 u32 nvig_pipes;
421 u32 nrgb_pipes;
422 u32 ndma_pipes;
423 u32 max_target_zorder;
424 u8 ncursor_pipes;
425 u32 max_cursor_size;
426
427 u32 nppb_ctl;
428 u32 *ppb_ctl;
429 u32 nppb_cfg;
430 u32 *ppb_cfg;
431 char __iomem *slave_pingpong_base;
432
433 struct mdss_mdp_mixer *mixer_intf;
434 struct mdss_mdp_mixer *mixer_wb;
435 u32 nmixers_intf;
436 u32 nmixers_wb;
437 u32 max_mixer_width;
438 u32 max_pipe_width;
439
440 struct mdss_mdp_writeback *wb;
441 u32 nwb;
442 u32 *wb_offsets;
443 u32 nwb_offsets;
444 struct mutex wb_lock;
445
446 struct mdss_mdp_ctl *ctl_off;
447 u32 nctl;
448 u32 ndspp;
449
450 struct mdss_mdp_dp_intf *dp_off;
451 u32 ndp;
452 void *video_intf;
453 u32 nintf;
454
455 struct mdss_mdp_ad *ad_off;
456 struct mdss_ad_info *ad_cfgs;
457 u32 nad_cfgs;
458 u32 nmax_concurrent_ad_hw;
459 struct workqueue_struct *ad_calc_wq;
460 u32 ad_debugen;
461
462 struct mdss_intr hist_intr;
463
464 struct ion_client *iclient;
465 int iommu_attached;
466
467 struct debug_bus *dbg_bus;
468 u32 dbg_bus_size;
469 struct vbif_debug_bus *vbif_dbg_bus;
470 u32 vbif_dbg_bus_size;
471 struct vbif_debug_bus *nrt_vbif_dbg_bus;
472 u32 nrt_vbif_dbg_bus_size;
473 struct mdss_debug_inf debug_inf;
474 bool mixer_switched;
475 struct mdss_panel_cfg pan_cfg;
476 struct mdss_prefill_data prefill_data;
477 u32 min_prefill_lines; /* this changes within different chipsets */
478 u32 props;
479
480 int handoff_pending;
481 bool idle_pc;
482 struct mdss_perf_tune perf_tune;
483 bool traffic_shaper_en;
484 int iommu_ref_cnt;
485 u32 latency_buff_per;
486 atomic_t active_intf_cnt;
487 bool has_rot_dwnscale;
488 bool regulator_notif_register;
489
490 u64 ab[MDSS_MAX_BUS_CLIENTS];
491 u64 ib[MDSS_MAX_BUS_CLIENTS];
492 struct mdss_pp_block_off pp_block_off;
493
494 struct mdss_mdp_cdm *cdm_off;
495 u32 ncdm;
496 struct mutex cdm_lock;
497
498 struct mdss_mdp_dsc *dsc_off;
499 u32 ndsc;
500
501 struct mdss_max_bw_settings *max_bw_settings;
502 u32 bw_mode_bitmap;
503 u32 max_bw_settings_cnt;
504 bool bw_limit_pending;
505
506 struct mdss_max_bw_settings *max_per_pipe_bw_settings;
507 u32 mdss_per_pipe_bw_cnt;
508 u32 min_bw_per_pipe;
509
510 u32 bcolor0;
511 u32 bcolor1;
512 u32 bcolor2;
513 struct mdss_scaler_block *scaler_off;
514
515 u32 splash_intf_sel;
516 u32 splash_split_disp;
517};
518
519extern struct mdss_data_type *mdss_res;
520
521struct irq_info {
522 u32 irq;
523 u32 irq_mask;
524 u32 irq_wake_mask;
525 u32 irq_ena;
526 u32 irq_wake_ena;
527 u32 irq_buzy;
528};
529
530struct mdss_hw {
531 u32 hw_ndx;
532 void *ptr;
533 struct irq_info *irq_info;
534 irqreturn_t (*irq_handler)(int irq, void *ptr);
535};
536
537struct irq_info *mdss_intr_line(void);
538void mdss_bus_bandwidth_ctrl(int enable);
539int mdss_iommu_ctrl(int enable);
540int mdss_bus_scale_set_quota(int client, u64 ab_quota, u64 ib_quota);
541int mdss_update_reg_bus_vote(struct reg_bus_client *bus_client,
542 u32 usecase_ndx);
543struct reg_bus_client *mdss_reg_bus_vote_client_create(char *client_name);
544void mdss_reg_bus_vote_client_destroy(struct reg_bus_client *bus_client);
545
546struct mdss_util_intf {
547 bool mdp_probe_done;
548 int (*register_irq)(struct mdss_hw *hw);
549 void (*enable_irq)(struct mdss_hw *hw);
550 void (*disable_irq)(struct mdss_hw *hw);
551 void (*enable_wake_irq)(struct mdss_hw *hw);
552 void (*disable_wake_irq)(struct mdss_hw *hw);
553 void (*disable_irq_nosync)(struct mdss_hw *hw);
554 int (*irq_dispatch)(u32 hw_ndx, int irq, void *ptr);
555 int (*get_iommu_domain)(u32 type);
556 int (*iommu_attached)(void);
557 int (*iommu_ctrl)(int enable);
558 void (*iommu_lock)(void);
559 void (*iommu_unlock)(void);
560 void (*bus_bandwidth_ctrl)(int enable);
561 int (*bus_scale_set_quota)(int client, u64 ab_quota, u64 ib_quota);
562 int (*panel_intf_status)(u32 disp_num, u32 intf_type);
563 struct mdss_panel_cfg* (*panel_intf_type)(int intf_val);
564 int (*dyn_clk_gating_ctrl)(int enable);
565 bool (*param_check)(char *param_string);
566 bool display_disabled;
567};
568
569struct mdss_util_intf *mdss_get_util_intf(void);
570bool mdss_get_irq_enable_state(struct mdss_hw *hw);
571
572static inline int mdss_get_sd_client_cnt(void)
573{
574 if (!mdss_res)
575 return 0;
576 else
577 return atomic_read(&mdss_res->sd_client_count);
578}
579
580static inline void mdss_set_quirk(struct mdss_data_type *mdata,
581 enum mdss_hw_quirk bit)
582{
583 set_bit(bit, mdata->mdss_quirk_map);
584}
585
586static inline bool mdss_has_quirk(struct mdss_data_type *mdata,
587 enum mdss_hw_quirk bit)
588{
589 return test_bit(bit, mdata->mdss_quirk_map);
590}
591
592#define MDSS_VBIF_WRITE(mdata, offset, value, nrt_vbif) \
Sachin Bhayare5076e252018-01-18 14:56:45 +0530593 (nrt_vbif ? mdss_reg_w(&mdata->vbif_nrt_io, offset, value, 0) :\
594 mdss_reg_w(&mdata->vbif_io, offset, value, 0))
Sachin Bhayareeeb88892018-01-02 16:36:01 +0530595#define MDSS_VBIF_READ(mdata, offset, nrt_vbif) \
Sachin Bhayare5076e252018-01-18 14:56:45 +0530596 (nrt_vbif ? mdss_reg_r(&mdata->vbif_nrt_io, offset, 0) :\
597 mdss_reg_r(&mdata->vbif_io, offset, 0))
Sachin Bhayareeeb88892018-01-02 16:36:01 +0530598#define MDSS_REG_WRITE(mdata, offset, value) \
Sachin Bhayare5076e252018-01-18 14:56:45 +0530599 mdss_reg_w(&mdata->mdss_io, offset, value, 0)
Sachin Bhayareeeb88892018-01-02 16:36:01 +0530600#define MDSS_REG_READ(mdata, offset) \
Sachin Bhayare5076e252018-01-18 14:56:45 +0530601 mdss_reg_r(&mdata->mdss_io, offset, 0)
Sachin Bhayareeeb88892018-01-02 16:36:01 +0530602
603#endif /* MDSS_H */