Sachin Bhayare | eeb8889 | 2018-01-02 16:36:01 +0530 | [diff] [blame] | 1 | /* 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 | |
| 39 | enum 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 | |
| 48 | enum 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 | |
| 56 | enum 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 | |
| 64 | struct mdss_hw_settings { |
| 65 | char __iomem *reg; |
| 66 | u32 val; |
| 67 | }; |
| 68 | |
| 69 | struct mdss_max_bw_settings { |
| 70 | u32 mdss_max_bw_mode; |
| 71 | u32 mdss_max_bw_val; |
| 72 | }; |
| 73 | |
| 74 | struct mdss_debug_inf { |
| 75 | void *debug_data; |
| 76 | void (*debug_enable_clock)(int on); |
| 77 | }; |
| 78 | |
| 79 | struct 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 | |
| 88 | struct mdss_intr { |
| 89 | /* requested intr */ |
| 90 | u32 req; |
| 91 | /* currently enabled intr */ |
| 92 | u32 curr; |
| 93 | int state; |
| 94 | spinlock_t lock; |
| 95 | }; |
| 96 | |
| 97 | struct 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 | |
| 105 | struct 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 | |
| 120 | struct mdss_mdp_dsc { |
| 121 | u32 num; |
| 122 | char __iomem *base; |
| 123 | }; |
| 124 | |
| 125 | enum 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 | |
| 135 | enum 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 | |
| 143 | struct 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 | |
| 154 | enum 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 | |
| 168 | enum 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 | |
| 179 | enum 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 | |
| 193 | enum 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 | |
| 202 | struct reg_bus_client { |
| 203 | char name[MAX_CLIENT_NAME_LEN]; |
| 204 | short usecase_ndx; |
| 205 | u32 id; |
| 206 | struct list_head list; |
| 207 | }; |
| 208 | |
| 209 | struct mdss_smmu_client { |
| 210 | struct device *dev; |
| 211 | struct dma_iommu_mapping *mmu_mapping; |
Sachin Bhayare | 5076e25 | 2018-01-18 14:56:45 +0530 | [diff] [blame] | 212 | struct mdss_module_power mp; |
Sachin Bhayare | eeb8889 | 2018-01-02 16:36:01 +0530 | [diff] [blame] | 213 | struct reg_bus_client *reg_bus_clt; |
| 214 | bool domain_attached; |
| 215 | bool handoff_pending; |
| 216 | char __iomem *mmu_base; |
| 217 | }; |
| 218 | |
| 219 | struct mdss_mdp_qseed3_lut_tbl { |
| 220 | bool valid; |
| 221 | u32 *dir_lut; |
| 222 | u32 *cir_lut; |
| 223 | u32 *sep_lut; |
| 224 | }; |
| 225 | |
| 226 | struct 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 | |
| 237 | struct mdss_data_type; |
| 238 | |
| 239 | struct 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 | |
| 272 | struct 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 Bhayare | 5076e25 | 2018-01-18 14:56:45 +0530 | [diff] [blame] | 286 | struct mdss_io_data mdss_io; |
| 287 | struct mdss_io_data vbif_io; |
| 288 | struct mdss_io_data vbif_nrt_io; |
Sachin Bhayare | eeb8889 | 2018-01-02 16:36:01 +0530 | [diff] [blame] | 289 | 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 | |
| 519 | extern struct mdss_data_type *mdss_res; |
| 520 | |
| 521 | struct 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 | |
| 530 | struct 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 | |
| 537 | struct irq_info *mdss_intr_line(void); |
| 538 | void mdss_bus_bandwidth_ctrl(int enable); |
| 539 | int mdss_iommu_ctrl(int enable); |
| 540 | int mdss_bus_scale_set_quota(int client, u64 ab_quota, u64 ib_quota); |
| 541 | int mdss_update_reg_bus_vote(struct reg_bus_client *bus_client, |
| 542 | u32 usecase_ndx); |
| 543 | struct reg_bus_client *mdss_reg_bus_vote_client_create(char *client_name); |
| 544 | void mdss_reg_bus_vote_client_destroy(struct reg_bus_client *bus_client); |
| 545 | |
| 546 | struct 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 | |
| 569 | struct mdss_util_intf *mdss_get_util_intf(void); |
| 570 | bool mdss_get_irq_enable_state(struct mdss_hw *hw); |
| 571 | |
| 572 | static 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 | |
| 580 | static 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 | |
| 586 | static 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 Bhayare | 5076e25 | 2018-01-18 14:56:45 +0530 | [diff] [blame] | 593 | (nrt_vbif ? mdss_reg_w(&mdata->vbif_nrt_io, offset, value, 0) :\ |
| 594 | mdss_reg_w(&mdata->vbif_io, offset, value, 0)) |
Sachin Bhayare | eeb8889 | 2018-01-02 16:36:01 +0530 | [diff] [blame] | 595 | #define MDSS_VBIF_READ(mdata, offset, nrt_vbif) \ |
Sachin Bhayare | 5076e25 | 2018-01-18 14:56:45 +0530 | [diff] [blame] | 596 | (nrt_vbif ? mdss_reg_r(&mdata->vbif_nrt_io, offset, 0) :\ |
| 597 | mdss_reg_r(&mdata->vbif_io, offset, 0)) |
Sachin Bhayare | eeb8889 | 2018-01-02 16:36:01 +0530 | [diff] [blame] | 598 | #define MDSS_REG_WRITE(mdata, offset, value) \ |
Sachin Bhayare | 5076e25 | 2018-01-18 14:56:45 +0530 | [diff] [blame] | 599 | mdss_reg_w(&mdata->mdss_io, offset, value, 0) |
Sachin Bhayare | eeb8889 | 2018-01-02 16:36:01 +0530 | [diff] [blame] | 600 | #define MDSS_REG_READ(mdata, offset) \ |
Sachin Bhayare | 5076e25 | 2018-01-18 14:56:45 +0530 | [diff] [blame] | 601 | mdss_reg_r(&mdata->mdss_io, offset, 0) |
Sachin Bhayare | eeb8889 | 2018-01-02 16:36:01 +0530 | [diff] [blame] | 602 | |
| 603 | #endif /* MDSS_H */ |