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