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