xref: /openbmc/linux/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h (revision 82828282)
1caab277bSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
225fdd593SJeykumar Sankaran /*
325fdd593SJeykumar Sankaran  * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
425fdd593SJeykumar Sankaran  * Copyright (C) 2013 Red Hat
525fdd593SJeykumar Sankaran  * Author: Rob Clark <robdclark@gmail.com>
625fdd593SJeykumar Sankaran  */
725fdd593SJeykumar Sankaran 
825fdd593SJeykumar Sankaran #ifndef __DPU_KMS_H__
925fdd593SJeykumar Sankaran #define __DPU_KMS_H__
1025fdd593SJeykumar Sankaran 
11c33b7c03SKalyan Thota #include <linux/interconnect.h>
12c33b7c03SKalyan Thota 
13feea39a8SSam Ravnborg #include <drm/drm_drv.h>
14feea39a8SSam Ravnborg 
1525fdd593SJeykumar Sankaran #include "msm_drv.h"
1625fdd593SJeykumar Sankaran #include "msm_kms.h"
1725fdd593SJeykumar Sankaran #include "msm_mmu.h"
1825fdd593SJeykumar Sankaran #include "msm_gem.h"
1925fdd593SJeykumar Sankaran #include "dpu_hw_catalog.h"
2025fdd593SJeykumar Sankaran #include "dpu_hw_ctl.h"
2125fdd593SJeykumar Sankaran #include "dpu_hw_lm.h"
2225fdd593SJeykumar Sankaran #include "dpu_hw_interrupts.h"
2325fdd593SJeykumar Sankaran #include "dpu_hw_top.h"
2425fdd593SJeykumar Sankaran #include "dpu_rm.h"
2525fdd593SJeykumar Sankaran #include "dpu_core_perf.h"
2625fdd593SJeykumar Sankaran 
2725fdd593SJeykumar Sankaran #define DRMID(x) ((x) ? (x)->base.id : -1)
2825fdd593SJeykumar Sankaran 
2925fdd593SJeykumar Sankaran /**
3025fdd593SJeykumar Sankaran  * DPU_DEBUG - macro for kms/plane/crtc/encoder/connector logs
3125fdd593SJeykumar Sankaran  * @fmt: Pointer to format string
3225fdd593SJeykumar Sankaran  */
3325fdd593SJeykumar Sankaran #define DPU_DEBUG(fmt, ...)                                                \
3425fdd593SJeykumar Sankaran 	do {                                                               \
35d8db0b36SJani Nikula 		if (drm_debug_enabled(DRM_UT_KMS))                         \
3625fdd593SJeykumar Sankaran 			DRM_DEBUG(fmt, ##__VA_ARGS__); \
3725fdd593SJeykumar Sankaran 		else                                                       \
3825fdd593SJeykumar Sankaran 			pr_debug(fmt, ##__VA_ARGS__);                      \
3925fdd593SJeykumar Sankaran 	} while (0)
4025fdd593SJeykumar Sankaran 
4125fdd593SJeykumar Sankaran /**
4225fdd593SJeykumar Sankaran  * DPU_DEBUG_DRIVER - macro for hardware driver logging
4325fdd593SJeykumar Sankaran  * @fmt: Pointer to format string
4425fdd593SJeykumar Sankaran  */
4525fdd593SJeykumar Sankaran #define DPU_DEBUG_DRIVER(fmt, ...)                                         \
4625fdd593SJeykumar Sankaran 	do {                                                               \
47d8db0b36SJani Nikula 		if (drm_debug_enabled(DRM_UT_DRIVER))                      \
4825fdd593SJeykumar Sankaran 			DRM_ERROR(fmt, ##__VA_ARGS__); \
4925fdd593SJeykumar Sankaran 		else                                                       \
5025fdd593SJeykumar Sankaran 			pr_debug(fmt, ##__VA_ARGS__);                      \
5125fdd593SJeykumar Sankaran 	} while (0)
5225fdd593SJeykumar Sankaran 
5325fdd593SJeykumar Sankaran #define DPU_ERROR(fmt, ...) pr_err("[dpu error]" fmt, ##__VA_ARGS__)
54*82828282SRob Clark #define DPU_ERROR_RATELIMITED(fmt, ...) pr_err_ratelimited("[dpu error]" fmt, ##__VA_ARGS__)
5525fdd593SJeykumar Sankaran 
5625fdd593SJeykumar Sankaran /**
5725fdd593SJeykumar Sankaran  * ktime_compare_safe - compare two ktime structures
5825fdd593SJeykumar Sankaran  *	This macro is similar to the standard ktime_compare() function, but
5925fdd593SJeykumar Sankaran  *	attempts to also handle ktime overflows.
6025fdd593SJeykumar Sankaran  * @A: First ktime value
6125fdd593SJeykumar Sankaran  * @B: Second ktime value
6225fdd593SJeykumar Sankaran  * Returns: -1 if A < B, 0 if A == B, 1 if A > B
6325fdd593SJeykumar Sankaran  */
6425fdd593SJeykumar Sankaran #define ktime_compare_safe(A, B) \
6525fdd593SJeykumar Sankaran 	ktime_compare(ktime_sub((A), (B)), ktime_set(0, 0))
6625fdd593SJeykumar Sankaran 
6725fdd593SJeykumar Sankaran struct dpu_kms {
6825fdd593SJeykumar Sankaran 	struct msm_kms base;
6925fdd593SJeykumar Sankaran 	struct drm_device *dev;
7032084967SDmitry Baryshkov 	const struct dpu_mdss_cfg *catalog;
71a2e87e9eSDmitry Baryshkov 	const struct msm_mdss_data *mdss;
7225fdd593SJeykumar Sankaran 
7325fdd593SJeykumar Sankaran 	/* io/register spaces: */
7410036161SDmitry Baryshkov 	void __iomem *mmio, *vbif[VBIF_MAX];
7525fdd593SJeykumar Sankaran 
7625fdd593SJeykumar Sankaran 	struct regulator *vdd;
7725fdd593SJeykumar Sankaran 	struct regulator *mmagic;
7825fdd593SJeykumar Sankaran 	struct regulator *venus;
7925fdd593SJeykumar Sankaran 
8025fdd593SJeykumar Sankaran 	struct dpu_hw_intr *hw_intr;
8125fdd593SJeykumar Sankaran 
8225fdd593SJeykumar Sankaran 	struct dpu_core_perf perf;
8325fdd593SJeykumar Sankaran 
84de3916c7SDrew Davenport 	/*
85de3916c7SDrew Davenport 	 * Global private object state, Do not access directly, use
86de3916c7SDrew Davenport 	 * dpu_kms_global_get_state()
87de3916c7SDrew Davenport 	 */
88de3916c7SDrew Davenport 	struct drm_modeset_lock global_state_lock;
89de3916c7SDrew Davenport 	struct drm_private_obj global_state;
90de3916c7SDrew Davenport 
9125fdd593SJeykumar Sankaran 	struct dpu_rm rm;
9225fdd593SJeykumar Sankaran 	bool rm_init;
9325fdd593SJeykumar Sankaran 
9425fdd593SJeykumar Sankaran 	struct dpu_hw_vbif *hw_vbif[VBIF_MAX];
9525fdd593SJeykumar Sankaran 	struct dpu_hw_mdp *hw_mdp;
9625fdd593SJeykumar Sankaran 
9725fdd593SJeykumar Sankaran 	bool has_danger_ctrl;
9825fdd593SJeykumar Sankaran 
9925fdd593SJeykumar Sankaran 	struct platform_device *pdev;
10025fdd593SJeykumar Sankaran 	bool rpm_enabled;
101b0530eb1SRajendra Nayak 
1025752c921SDmitry Baryshkov 	struct clk_bulk_data *clocks;
1035752c921SDmitry Baryshkov 	size_t num_clocks;
104241b507cSRob Clark 
105241b507cSRob Clark 	/* reference count bandwidth requests, so we know when we can
106241b507cSRob Clark 	 * release bandwidth.  Each atomic update increments, and frame-
107241b507cSRob Clark 	 * done event decrements.  Additionally, for video mode, the
108241b507cSRob Clark 	 * reference is incremented when crtc is enabled, and decremented
109241b507cSRob Clark 	 * when disabled.
110241b507cSRob Clark 	 */
111241b507cSRob Clark 	atomic_t bandwidth_ref;
112c33b7c03SKalyan Thota 	struct icc_path *path[2];
113c33b7c03SKalyan Thota 	u32 num_paths;
11425fdd593SJeykumar Sankaran };
11525fdd593SJeykumar Sankaran 
11625fdd593SJeykumar Sankaran struct vsync_info {
11725fdd593SJeykumar Sankaran 	u32 frame_count;
11825fdd593SJeykumar Sankaran 	u32 line_count;
11925fdd593SJeykumar Sankaran };
12025fdd593SJeykumar Sankaran 
1214a7c38ecSMarijn Suijten #define DPU_ENC_WR_PTR_START_TIMEOUT_US 20000
1224a7c38ecSMarijn Suijten 
1234a7c38ecSMarijn Suijten #define DPU_ENC_MAX_POLL_TIMEOUT_US	2000
1244a7c38ecSMarijn Suijten 
12525fdd593SJeykumar Sankaran #define to_dpu_kms(x) container_of(x, struct dpu_kms, base)
12625fdd593SJeykumar Sankaran 
127de3916c7SDrew Davenport #define to_dpu_global_state(x) container_of(x, struct dpu_global_state, base)
128de3916c7SDrew Davenport 
129de3916c7SDrew Davenport /* Global private object state for tracking resources that are shared across
130de3916c7SDrew Davenport  * multiple kms objects (planes/crtcs/etc).
131de3916c7SDrew Davenport  */
132de3916c7SDrew Davenport struct dpu_global_state {
133de3916c7SDrew Davenport 	struct drm_private_state base;
134de3916c7SDrew Davenport 
135de3916c7SDrew Davenport 	uint32_t pingpong_to_enc_id[PINGPONG_MAX - PINGPONG_0];
136de3916c7SDrew Davenport 	uint32_t mixer_to_enc_id[LM_MAX - LM_0];
137de3916c7SDrew Davenport 	uint32_t ctl_to_enc_id[CTL_MAX - CTL_0];
138e47616dfSKalyan Thota 	uint32_t dspp_to_enc_id[DSPP_MAX - DSPP_0];
139f2803ee9SVinod Koul 	uint32_t dsc_to_enc_id[DSC_MAX - DSC_0];
140de3916c7SDrew Davenport };
141de3916c7SDrew Davenport 
142de3916c7SDrew Davenport struct dpu_global_state
143de3916c7SDrew Davenport 	*dpu_kms_get_existing_global_state(struct dpu_kms *dpu_kms);
144de3916c7SDrew Davenport struct dpu_global_state
145de3916c7SDrew Davenport 	*__must_check dpu_kms_get_global_state(struct drm_atomic_state *s);
146de3916c7SDrew Davenport 
14725fdd593SJeykumar Sankaran /**
14825fdd593SJeykumar Sankaran  * Debugfs functions - extra helper functions for debugfs support
14925fdd593SJeykumar Sankaran  *
15025fdd593SJeykumar Sankaran  * Main debugfs documentation is located at,
15125fdd593SJeykumar Sankaran  *
1520c1bc6b8SMauro Carvalho Chehab  * Documentation/filesystems/debugfs.rst
15325fdd593SJeykumar Sankaran  *
15425fdd593SJeykumar Sankaran  * @dpu_debugfs_create_regset32: Create 32-bit register dump file
15525fdd593SJeykumar Sankaran  */
15625fdd593SJeykumar Sankaran 
15725fdd593SJeykumar Sankaran /**
15825fdd593SJeykumar Sankaran  * dpu_debugfs_create_regset32 - Create register read back file for debugfs
15925fdd593SJeykumar Sankaran  *
16025fdd593SJeykumar Sankaran  * This function is almost identical to the standard debugfs_create_regset32()
16125fdd593SJeykumar Sankaran  * function, with the main difference being that a list of register
16225fdd593SJeykumar Sankaran  * names/offsets do not need to be provided. The 'read' function simply outputs
16325fdd593SJeykumar Sankaran  * sequential register values over a specified range.
16425fdd593SJeykumar Sankaran  *
16525fdd593SJeykumar Sankaran  * @name:   File name within debugfs
16625fdd593SJeykumar Sankaran  * @mode:   File mode within debugfs
16725fdd593SJeykumar Sankaran  * @parent: Parent directory entry within debugfs, can be NULL
16837897856SDmitry Baryshkov  * @offset: sub-block offset
16937897856SDmitry Baryshkov  * @length: sub-block length, in bytes
17037897856SDmitry Baryshkov  * @dpu_kms: pointer to dpu kms structure
17125fdd593SJeykumar Sankaran  */
1727aca4d65SGreg Kroah-Hartman void dpu_debugfs_create_regset32(const char *name, umode_t mode,
17337897856SDmitry Baryshkov 		void *parent,
17437897856SDmitry Baryshkov 		uint32_t offset, uint32_t length, struct dpu_kms *dpu_kms);
17525fdd593SJeykumar Sankaran 
17625fdd593SJeykumar Sankaran /**
17725fdd593SJeykumar Sankaran  * dpu_debugfs_get_root - Return root directory entry for KMS's debugfs
17825fdd593SJeykumar Sankaran  *
17925fdd593SJeykumar Sankaran  * The return value should be passed as the 'parent' argument to subsequent
18025fdd593SJeykumar Sankaran  * debugfs create calls.
18125fdd593SJeykumar Sankaran  *
18225fdd593SJeykumar Sankaran  * @dpu_kms: Pointer to DPU's KMS structure
18325fdd593SJeykumar Sankaran  *
18425fdd593SJeykumar Sankaran  * Return: dentry pointer for DPU's debugfs location
18525fdd593SJeykumar Sankaran  */
18625fdd593SJeykumar Sankaran void *dpu_debugfs_get_root(struct dpu_kms *dpu_kms);
18725fdd593SJeykumar Sankaran 
18825fdd593SJeykumar Sankaran /**
18925fdd593SJeykumar Sankaran  * DPU info management functions
19025fdd593SJeykumar Sankaran  * These functions/definitions allow for building up a 'dpu_info' structure
19125fdd593SJeykumar Sankaran  * containing one or more "key=value\n" entries.
19225fdd593SJeykumar Sankaran  */
19325fdd593SJeykumar Sankaran #define DPU_KMS_INFO_MAX_SIZE	4096
19425fdd593SJeykumar Sankaran 
19525fdd593SJeykumar Sankaran /**
19625fdd593SJeykumar Sankaran  * Vblank enable/disable functions
19725fdd593SJeykumar Sankaran  */
19825fdd593SJeykumar Sankaran int dpu_enable_vblank(struct msm_kms *kms, struct drm_crtc *crtc);
19925fdd593SJeykumar Sankaran void dpu_disable_vblank(struct msm_kms *kms, struct drm_crtc *crtc);
20025fdd593SJeykumar Sankaran 
20125fdd593SJeykumar Sankaran /**
20225fdd593SJeykumar Sankaran  * dpu_kms_get_clk_rate() - get the clock rate
203d2dfd21fSBhaskar Chowdhury  * @dpu_kms:  pointer to dpu_kms structure
20425fdd593SJeykumar Sankaran  * @clock_name: clock name to get the rate
20525fdd593SJeykumar Sankaran  *
20625fdd593SJeykumar Sankaran  * Return: current clock rate
20725fdd593SJeykumar Sankaran  */
208025e3d97SDan Carpenter unsigned long dpu_kms_get_clk_rate(struct dpu_kms *dpu_kms, char *clock_name);
20925fdd593SJeykumar Sankaran 
21025fdd593SJeykumar Sankaran #endif /* __dpu_kms_H__ */
211