197fb5e8dSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 291143873SJessica Zhang /* 3173b2472SJessica Zhang * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. 491143873SJessica Zhang * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. 525fdd593SJeykumar Sankaran */ 625fdd593SJeykumar Sankaran 725fdd593SJeykumar Sankaran #ifndef _DPU_HW_INTF_H 825fdd593SJeykumar Sankaran #define _DPU_HW_INTF_H 925fdd593SJeykumar Sankaran 1025fdd593SJeykumar Sankaran #include "dpu_hw_catalog.h" 1125fdd593SJeykumar Sankaran #include "dpu_hw_mdss.h" 1225fdd593SJeykumar Sankaran #include "dpu_hw_util.h" 1325fdd593SJeykumar Sankaran 1425fdd593SJeykumar Sankaran struct dpu_hw_intf; 1525fdd593SJeykumar Sankaran 1625fdd593SJeykumar Sankaran /* intf timing settings */ 174c6df9a4SAbhinav Kumar struct dpu_hw_intf_timing_params { 1825fdd593SJeykumar Sankaran u32 width; /* active width */ 1925fdd593SJeykumar Sankaran u32 height; /* active height */ 2025fdd593SJeykumar Sankaran u32 xres; /* Display panel width */ 2125fdd593SJeykumar Sankaran u32 yres; /* Display panel height */ 2225fdd593SJeykumar Sankaran 2325fdd593SJeykumar Sankaran u32 h_back_porch; 2425fdd593SJeykumar Sankaran u32 h_front_porch; 2525fdd593SJeykumar Sankaran u32 v_back_porch; 2625fdd593SJeykumar Sankaran u32 v_front_porch; 2725fdd593SJeykumar Sankaran u32 hsync_pulse_width; 2825fdd593SJeykumar Sankaran u32 vsync_pulse_width; 2925fdd593SJeykumar Sankaran u32 hsync_polarity; 3025fdd593SJeykumar Sankaran u32 vsync_polarity; 3125fdd593SJeykumar Sankaran u32 border_clr; 3225fdd593SJeykumar Sankaran u32 underflow_clr; 3325fdd593SJeykumar Sankaran u32 hsync_skew; 343309a756SKuogee Hsieh 353309a756SKuogee Hsieh bool wide_bus_en; 36*3bb4f4b1SAbhinav Kumar bool compression_en; 3725fdd593SJeykumar Sankaran }; 3825fdd593SJeykumar Sankaran 394c6df9a4SAbhinav Kumar struct dpu_hw_intf_prog_fetch { 4025fdd593SJeykumar Sankaran u8 enable; 4125fdd593SJeykumar Sankaran /* vsync counter for the front porch pixel line */ 4225fdd593SJeykumar Sankaran u32 fetch_start; 4325fdd593SJeykumar Sankaran }; 4425fdd593SJeykumar Sankaran 454c6df9a4SAbhinav Kumar struct dpu_hw_intf_status { 4625fdd593SJeykumar Sankaran u8 is_en; /* interface timing engine is enabled or not */ 4773743e72SKalyan Thota u8 is_prog_fetch_en; /* interface prog fetch counter is enabled or not */ 4825fdd593SJeykumar Sankaran u32 frame_count; /* frame count since timing engine enabled */ 4925fdd593SJeykumar Sankaran u32 line_count; /* current line count including blanking */ 5025fdd593SJeykumar Sankaran }; 5125fdd593SJeykumar Sankaran 52143dfccaSAbhinav Kumar struct dpu_hw_intf_cmd_mode_cfg { 53143dfccaSAbhinav Kumar u8 data_compress; /* enable data compress between dpu and dsi */ 54143dfccaSAbhinav Kumar }; 55143dfccaSAbhinav Kumar 5625fdd593SJeykumar Sankaran /** 5725fdd593SJeykumar Sankaran * struct dpu_hw_intf_ops : Interface to the interface Hw driver functions 5825fdd593SJeykumar Sankaran * Assumption is these functions will be called after clocks are enabled 5925fdd593SJeykumar Sankaran * @ setup_timing_gen : programs the timing engine 6025fdd593SJeykumar Sankaran * @ setup_prog_fetch : enables/disables the programmable fetch logic 6125fdd593SJeykumar Sankaran * @ enable_timing: enable/disable timing engine 6225fdd593SJeykumar Sankaran * @ get_status: returns if timing engine is enabled or not 6325fdd593SJeykumar Sankaran * @ get_line_count: reads current vertical line counter 6473bfb790SKalyan Thota * @bind_pingpong_blk: enable/disable the connection with pingpong which will 6573bfb790SKalyan Thota * feed pixels to this interface 6691143873SJessica Zhang * @setup_misr: enable/disable MISR 6791143873SJessica Zhang * @collect_misr: read MISR signature 68e955a3f0SMarijn Suijten * @enable_tearcheck: Enables vsync generation and sets up init value of read 69e955a3f0SMarijn Suijten * pointer and programs the tear check configuration 70e955a3f0SMarijn Suijten * @disable_tearcheck: Disables tearcheck block 71e955a3f0SMarijn Suijten * @connect_external_te: Read, modify, write to either set or clear listening to external TE 72e955a3f0SMarijn Suijten * Return: 1 if TE was originally connected, 0 if not, or -ERROR 73e955a3f0SMarijn Suijten * @get_vsync_info: Provides the programmed and current line_count 74e955a3f0SMarijn Suijten * @setup_autorefresh: Configure and enable the autorefresh config 75e955a3f0SMarijn Suijten * @get_autorefresh: Retrieve autorefresh config from hardware 76e955a3f0SMarijn Suijten * Return: 0 on success, -ETIMEDOUT on timeout 77e955a3f0SMarijn Suijten * @vsync_sel: Select vsync signal for tear-effect configuration 78143dfccaSAbhinav Kumar * @program_intf_cmd_cfg: Program the DPU to interface datapath for command mode 7925fdd593SJeykumar Sankaran */ 8025fdd593SJeykumar Sankaran struct dpu_hw_intf_ops { 8125fdd593SJeykumar Sankaran void (*setup_timing_gen)(struct dpu_hw_intf *intf, 824c6df9a4SAbhinav Kumar const struct dpu_hw_intf_timing_params *p, 8325fdd593SJeykumar Sankaran const struct dpu_format *fmt); 8425fdd593SJeykumar Sankaran 8525fdd593SJeykumar Sankaran void (*setup_prg_fetch)(struct dpu_hw_intf *intf, 864c6df9a4SAbhinav Kumar const struct dpu_hw_intf_prog_fetch *fetch); 8725fdd593SJeykumar Sankaran 8825fdd593SJeykumar Sankaran void (*enable_timing)(struct dpu_hw_intf *intf, 8925fdd593SJeykumar Sankaran u8 enable); 9025fdd593SJeykumar Sankaran 9125fdd593SJeykumar Sankaran void (*get_status)(struct dpu_hw_intf *intf, 924c6df9a4SAbhinav Kumar struct dpu_hw_intf_status *status); 9325fdd593SJeykumar Sankaran 9425fdd593SJeykumar Sankaran u32 (*get_line_count)(struct dpu_hw_intf *intf); 9573bfb790SKalyan Thota 9673bfb790SKalyan Thota void (*bind_pingpong_blk)(struct dpu_hw_intf *intf, 9773bfb790SKalyan Thota const enum dpu_pingpong pp); 98173b2472SJessica Zhang void (*setup_misr)(struct dpu_hw_intf *intf); 9991143873SJessica Zhang int (*collect_misr)(struct dpu_hw_intf *intf, u32 *misr_value); 100e955a3f0SMarijn Suijten 101e955a3f0SMarijn Suijten // Tearcheck on INTF since DPU 5.0.0 102e955a3f0SMarijn Suijten 103e955a3f0SMarijn Suijten int (*enable_tearcheck)(struct dpu_hw_intf *intf, struct dpu_hw_tear_check *cfg); 104e955a3f0SMarijn Suijten 105e955a3f0SMarijn Suijten int (*disable_tearcheck)(struct dpu_hw_intf *intf); 106e955a3f0SMarijn Suijten 107e955a3f0SMarijn Suijten int (*connect_external_te)(struct dpu_hw_intf *intf, bool enable_external_te); 108e955a3f0SMarijn Suijten 109e955a3f0SMarijn Suijten void (*vsync_sel)(struct dpu_hw_intf *intf, u32 vsync_source); 110e955a3f0SMarijn Suijten 111e955a3f0SMarijn Suijten /** 112e955a3f0SMarijn Suijten * Disable autorefresh if enabled 113e955a3f0SMarijn Suijten */ 114e955a3f0SMarijn Suijten void (*disable_autorefresh)(struct dpu_hw_intf *intf, uint32_t encoder_id, u16 vdisplay); 1151642b580SJessica Zhang 116143dfccaSAbhinav Kumar void (*program_intf_cmd_cfg)(struct dpu_hw_intf *intf, 117143dfccaSAbhinav Kumar struct dpu_hw_intf_cmd_mode_cfg *cmd_mode_cfg); 11825fdd593SJeykumar Sankaran }; 11925fdd593SJeykumar Sankaran 12025fdd593SJeykumar Sankaran struct dpu_hw_intf { 12125fdd593SJeykumar Sankaran struct dpu_hw_blk_reg_map hw; 12225fdd593SJeykumar Sankaran 12325fdd593SJeykumar Sankaran /* intf */ 12425fdd593SJeykumar Sankaran enum dpu_intf idx; 12525fdd593SJeykumar Sankaran const struct dpu_intf_cfg *cap; 12625fdd593SJeykumar Sankaran 12725fdd593SJeykumar Sankaran /* ops */ 12825fdd593SJeykumar Sankaran struct dpu_hw_intf_ops ops; 12925fdd593SJeykumar Sankaran }; 13025fdd593SJeykumar Sankaran 13125fdd593SJeykumar Sankaran /** 132babdb815SMarijn Suijten * dpu_hw_intf_init() - Initializes the INTF driver for the passed 133babdb815SMarijn Suijten * interface catalog entry. 134babdb815SMarijn Suijten * @cfg: interface catalog entry for which driver object is required 13525fdd593SJeykumar Sankaran * @addr: mapped register io address of MDP 13651e9b25cSAbhinav Kumar * @mdss_rev: dpu core's major and minor versions 13725fdd593SJeykumar Sankaran */ 138babdb815SMarijn Suijten struct dpu_hw_intf *dpu_hw_intf_init(const struct dpu_intf_cfg *cfg, 13951e9b25cSAbhinav Kumar void __iomem *addr, const struct dpu_mdss_version *mdss_rev); 14025fdd593SJeykumar Sankaran 14125fdd593SJeykumar Sankaran /** 14225fdd593SJeykumar Sankaran * dpu_hw_intf_destroy(): Destroys INTF driver context 14325fdd593SJeykumar Sankaran * @intf: Pointer to INTF driver context 14425fdd593SJeykumar Sankaran */ 14525fdd593SJeykumar Sankaran void dpu_hw_intf_destroy(struct dpu_hw_intf *intf); 14625fdd593SJeykumar Sankaran 14725fdd593SJeykumar Sankaran #endif /*_DPU_HW_INTF_H */ 148