162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. 462306a36Sopenharmony_ci * Copyright (C) 2013 Red Hat 562306a36Sopenharmony_ci * Author: Rob Clark <robdclark@gmail.com> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef __MSM_DRV_H__ 962306a36Sopenharmony_ci#define __MSM_DRV_H__ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/kernel.h> 1262306a36Sopenharmony_ci#include <linux/clk.h> 1362306a36Sopenharmony_ci#include <linux/cpufreq.h> 1462306a36Sopenharmony_ci#include <linux/devfreq.h> 1562306a36Sopenharmony_ci#include <linux/module.h> 1662306a36Sopenharmony_ci#include <linux/component.h> 1762306a36Sopenharmony_ci#include <linux/platform_device.h> 1862306a36Sopenharmony_ci#include <linux/pm.h> 1962306a36Sopenharmony_ci#include <linux/pm_runtime.h> 2062306a36Sopenharmony_ci#include <linux/slab.h> 2162306a36Sopenharmony_ci#include <linux/list.h> 2262306a36Sopenharmony_ci#include <linux/iommu.h> 2362306a36Sopenharmony_ci#include <linux/types.h> 2462306a36Sopenharmony_ci#include <linux/of_graph.h> 2562306a36Sopenharmony_ci#include <linux/of_device.h> 2662306a36Sopenharmony_ci#include <linux/sizes.h> 2762306a36Sopenharmony_ci#include <linux/kthread.h> 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#include <drm/drm_atomic.h> 3062306a36Sopenharmony_ci#include <drm/drm_atomic_helper.h> 3162306a36Sopenharmony_ci#include <drm/drm_probe_helper.h> 3262306a36Sopenharmony_ci#include <drm/display/drm_dsc.h> 3362306a36Sopenharmony_ci#include <drm/msm_drm.h> 3462306a36Sopenharmony_ci#include <drm/drm_gem.h> 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#ifdef CONFIG_FAULT_INJECTION 3762306a36Sopenharmony_ciextern struct fault_attr fail_gem_alloc; 3862306a36Sopenharmony_ciextern struct fault_attr fail_gem_iova; 3962306a36Sopenharmony_ci#else 4062306a36Sopenharmony_ci# define should_fail(attr, size) 0 4162306a36Sopenharmony_ci#endif 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistruct msm_kms; 4462306a36Sopenharmony_cistruct msm_gpu; 4562306a36Sopenharmony_cistruct msm_mmu; 4662306a36Sopenharmony_cistruct msm_mdss; 4762306a36Sopenharmony_cistruct msm_rd_state; 4862306a36Sopenharmony_cistruct msm_perf_state; 4962306a36Sopenharmony_cistruct msm_gem_submit; 5062306a36Sopenharmony_cistruct msm_fence_context; 5162306a36Sopenharmony_cistruct msm_gem_address_space; 5262306a36Sopenharmony_cistruct msm_gem_vma; 5362306a36Sopenharmony_cistruct msm_disp_state; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci#define MAX_CRTCS 8 5662306a36Sopenharmony_ci#define MAX_BRIDGES 8 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci#define FRAC_16_16(mult, div) (((mult) << 16) / (div)) 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cienum msm_dp_controller { 6162306a36Sopenharmony_ci MSM_DP_CONTROLLER_0, 6262306a36Sopenharmony_ci MSM_DP_CONTROLLER_1, 6362306a36Sopenharmony_ci MSM_DP_CONTROLLER_2, 6462306a36Sopenharmony_ci MSM_DP_CONTROLLER_3, 6562306a36Sopenharmony_ci MSM_DP_CONTROLLER_COUNT, 6662306a36Sopenharmony_ci}; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_cienum msm_dsi_controller { 6962306a36Sopenharmony_ci MSM_DSI_CONTROLLER_0, 7062306a36Sopenharmony_ci MSM_DSI_CONTROLLER_1, 7162306a36Sopenharmony_ci MSM_DSI_CONTROLLER_COUNT, 7262306a36Sopenharmony_ci}; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci#define MSM_GPU_MAX_RINGS 4 7562306a36Sopenharmony_ci#define MAX_H_TILES_PER_DISPLAY 2 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci/** 7862306a36Sopenharmony_ci * enum msm_event_wait - type of HW events to wait for 7962306a36Sopenharmony_ci * @MSM_ENC_COMMIT_DONE - wait for the driver to flush the registers to HW 8062306a36Sopenharmony_ci * @MSM_ENC_TX_COMPLETE - wait for the HW to transfer the frame to panel 8162306a36Sopenharmony_ci * @MSM_ENC_VBLANK - wait for the HW VBLANK event (for driver-internal waiters) 8262306a36Sopenharmony_ci */ 8362306a36Sopenharmony_cienum msm_event_wait { 8462306a36Sopenharmony_ci MSM_ENC_COMMIT_DONE = 0, 8562306a36Sopenharmony_ci MSM_ENC_TX_COMPLETE, 8662306a36Sopenharmony_ci MSM_ENC_VBLANK, 8762306a36Sopenharmony_ci}; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci/** 9062306a36Sopenharmony_ci * struct msm_display_topology - defines a display topology pipeline 9162306a36Sopenharmony_ci * @num_lm: number of layer mixers used 9262306a36Sopenharmony_ci * @num_intf: number of interfaces the panel is mounted on 9362306a36Sopenharmony_ci * @num_dspp: number of dspp blocks used 9462306a36Sopenharmony_ci * @num_dsc: number of Display Stream Compression (DSC) blocks used 9562306a36Sopenharmony_ci */ 9662306a36Sopenharmony_cistruct msm_display_topology { 9762306a36Sopenharmony_ci u32 num_lm; 9862306a36Sopenharmony_ci u32 num_intf; 9962306a36Sopenharmony_ci u32 num_dspp; 10062306a36Sopenharmony_ci u32 num_dsc; 10162306a36Sopenharmony_ci}; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci/* Commit/Event thread specific structure */ 10462306a36Sopenharmony_cistruct msm_drm_thread { 10562306a36Sopenharmony_ci struct drm_device *dev; 10662306a36Sopenharmony_ci struct kthread_worker *worker; 10762306a36Sopenharmony_ci}; 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_cistruct msm_drm_private { 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci struct drm_device *dev; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci struct msm_kms *kms; 11462306a36Sopenharmony_ci int (*kms_init)(struct drm_device *dev); 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci /* subordinate devices, if present: */ 11762306a36Sopenharmony_ci struct platform_device *gpu_pdev; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci /* possibly this should be in the kms component, but it is 12062306a36Sopenharmony_ci * shared by both mdp4 and mdp5.. 12162306a36Sopenharmony_ci */ 12262306a36Sopenharmony_ci struct hdmi *hdmi; 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci /* DSI is shared by mdp4 and mdp5 */ 12562306a36Sopenharmony_ci struct msm_dsi *dsi[MSM_DSI_CONTROLLER_COUNT]; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci struct msm_dp *dp[MSM_DP_CONTROLLER_COUNT]; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci /* when we have more than one 'msm_gpu' these need to be an array: */ 13062306a36Sopenharmony_ci struct msm_gpu *gpu; 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci /* gpu is only set on open(), but we need this info earlier */ 13362306a36Sopenharmony_ci bool is_a2xx; 13462306a36Sopenharmony_ci bool has_cached_coherent; 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci struct msm_rd_state *rd; /* debugfs to dump all submits */ 13762306a36Sopenharmony_ci struct msm_rd_state *hangrd; /* debugfs to dump hanging submits */ 13862306a36Sopenharmony_ci struct msm_perf_state *perf; 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci /** 14162306a36Sopenharmony_ci * List of all GEM objects (mainly for debugfs, protected by obj_lock 14262306a36Sopenharmony_ci * (acquire before per GEM object lock) 14362306a36Sopenharmony_ci */ 14462306a36Sopenharmony_ci struct list_head objects; 14562306a36Sopenharmony_ci struct mutex obj_lock; 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci /** 14862306a36Sopenharmony_ci * lru: 14962306a36Sopenharmony_ci * 15062306a36Sopenharmony_ci * The various LRU's that a GEM object is in at various stages of 15162306a36Sopenharmony_ci * it's lifetime. Objects start out in the unbacked LRU. When 15262306a36Sopenharmony_ci * pinned (for scannout or permanently mapped GPU buffers, like 15362306a36Sopenharmony_ci * ringbuffer, memptr, fw, etc) it moves to the pinned LRU. When 15462306a36Sopenharmony_ci * unpinned, it moves into willneed or dontneed LRU depending on 15562306a36Sopenharmony_ci * madvise state. When backing pages are evicted (willneed) or 15662306a36Sopenharmony_ci * purged (dontneed) it moves back into the unbacked LRU. 15762306a36Sopenharmony_ci * 15862306a36Sopenharmony_ci * The dontneed LRU is considered by the shrinker for objects 15962306a36Sopenharmony_ci * that are candidate for purging, and the willneed LRU is 16062306a36Sopenharmony_ci * considered for objects that could be evicted. 16162306a36Sopenharmony_ci */ 16262306a36Sopenharmony_ci struct { 16362306a36Sopenharmony_ci /** 16462306a36Sopenharmony_ci * unbacked: 16562306a36Sopenharmony_ci * 16662306a36Sopenharmony_ci * The LRU for GEM objects without backing pages allocated. 16762306a36Sopenharmony_ci * This mostly exists so that objects are always is one 16862306a36Sopenharmony_ci * LRU. 16962306a36Sopenharmony_ci */ 17062306a36Sopenharmony_ci struct drm_gem_lru unbacked; 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci /** 17362306a36Sopenharmony_ci * pinned: 17462306a36Sopenharmony_ci * 17562306a36Sopenharmony_ci * The LRU for pinned GEM objects 17662306a36Sopenharmony_ci */ 17762306a36Sopenharmony_ci struct drm_gem_lru pinned; 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci /** 18062306a36Sopenharmony_ci * willneed: 18162306a36Sopenharmony_ci * 18262306a36Sopenharmony_ci * The LRU for unpinned GEM objects which are in madvise 18362306a36Sopenharmony_ci * WILLNEED state (ie. can be evicted) 18462306a36Sopenharmony_ci */ 18562306a36Sopenharmony_ci struct drm_gem_lru willneed; 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci /** 18862306a36Sopenharmony_ci * dontneed: 18962306a36Sopenharmony_ci * 19062306a36Sopenharmony_ci * The LRU for unpinned GEM objects which are in madvise 19162306a36Sopenharmony_ci * DONTNEED state (ie. can be purged) 19262306a36Sopenharmony_ci */ 19362306a36Sopenharmony_ci struct drm_gem_lru dontneed; 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci /** 19662306a36Sopenharmony_ci * lock: 19762306a36Sopenharmony_ci * 19862306a36Sopenharmony_ci * Protects manipulation of all of the LRUs. 19962306a36Sopenharmony_ci */ 20062306a36Sopenharmony_ci struct mutex lock; 20162306a36Sopenharmony_ci } lru; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci struct workqueue_struct *wq; 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_ci unsigned int num_crtcs; 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci struct msm_drm_thread event_thread[MAX_CRTCS]; 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci unsigned int num_bridges; 21062306a36Sopenharmony_ci struct drm_bridge *bridges[MAX_BRIDGES]; 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci /* VRAM carveout, used when no IOMMU: */ 21362306a36Sopenharmony_ci struct { 21462306a36Sopenharmony_ci unsigned long size; 21562306a36Sopenharmony_ci dma_addr_t paddr; 21662306a36Sopenharmony_ci /* NOTE: mm managed at the page level, size is in # of pages 21762306a36Sopenharmony_ci * and position mm_node->start is in # of pages: 21862306a36Sopenharmony_ci */ 21962306a36Sopenharmony_ci struct drm_mm mm; 22062306a36Sopenharmony_ci spinlock_t lock; /* Protects drm_mm node allocation/removal */ 22162306a36Sopenharmony_ci } vram; 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci struct notifier_block vmap_notifier; 22462306a36Sopenharmony_ci struct shrinker shrinker; 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ci struct drm_atomic_state *pm_state; 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ci /** 22962306a36Sopenharmony_ci * hangcheck_period: For hang detection, in ms 23062306a36Sopenharmony_ci * 23162306a36Sopenharmony_ci * Note that in practice, a submit/job will get at least two hangcheck 23262306a36Sopenharmony_ci * periods, due to checking for progress being implemented as simply 23362306a36Sopenharmony_ci * "have the CP position registers changed since last time?" 23462306a36Sopenharmony_ci */ 23562306a36Sopenharmony_ci unsigned int hangcheck_period; 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci /** gpu_devfreq_config: Devfreq tuning config for the GPU. */ 23862306a36Sopenharmony_ci struct devfreq_simple_ondemand_data gpu_devfreq_config; 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ci /** 24162306a36Sopenharmony_ci * gpu_clamp_to_idle: Enable clamping to idle freq when inactive 24262306a36Sopenharmony_ci */ 24362306a36Sopenharmony_ci bool gpu_clamp_to_idle; 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci /** 24662306a36Sopenharmony_ci * disable_err_irq: 24762306a36Sopenharmony_ci * 24862306a36Sopenharmony_ci * Disable handling of GPU hw error interrupts, to force fallback to 24962306a36Sopenharmony_ci * sw hangcheck timer. Written (via debugfs) by igt tests to test 25062306a36Sopenharmony_ci * the sw hangcheck mechanism. 25162306a36Sopenharmony_ci */ 25262306a36Sopenharmony_ci bool disable_err_irq; 25362306a36Sopenharmony_ci}; 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_cistruct msm_format { 25662306a36Sopenharmony_ci uint32_t pixel_format; 25762306a36Sopenharmony_ci}; 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_cistruct msm_pending_timer; 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ciint msm_atomic_init_pending_timer(struct msm_pending_timer *timer, 26262306a36Sopenharmony_ci struct msm_kms *kms, int crtc_idx); 26362306a36Sopenharmony_civoid msm_atomic_destroy_pending_timer(struct msm_pending_timer *timer); 26462306a36Sopenharmony_civoid msm_atomic_commit_tail(struct drm_atomic_state *state); 26562306a36Sopenharmony_ciint msm_atomic_check(struct drm_device *dev, struct drm_atomic_state *state); 26662306a36Sopenharmony_cistruct drm_atomic_state *msm_atomic_state_alloc(struct drm_device *dev); 26762306a36Sopenharmony_civoid msm_atomic_state_clear(struct drm_atomic_state *state); 26862306a36Sopenharmony_civoid msm_atomic_state_free(struct drm_atomic_state *state); 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ciint msm_crtc_enable_vblank(struct drm_crtc *crtc); 27162306a36Sopenharmony_civoid msm_crtc_disable_vblank(struct drm_crtc *crtc); 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ciint msm_register_mmu(struct drm_device *dev, struct msm_mmu *mmu); 27462306a36Sopenharmony_civoid msm_unregister_mmu(struct drm_device *dev, struct msm_mmu *mmu); 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_cistruct msm_gem_address_space *msm_kms_init_aspace(struct drm_device *dev); 27762306a36Sopenharmony_cibool msm_use_mmu(struct drm_device *dev); 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ciint msm_ioctl_gem_submit(struct drm_device *dev, void *data, 28062306a36Sopenharmony_ci struct drm_file *file); 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_ci#ifdef CONFIG_DEBUG_FS 28362306a36Sopenharmony_ciunsigned long msm_gem_shrinker_shrink(struct drm_device *dev, unsigned long nr_to_scan); 28462306a36Sopenharmony_ci#endif 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_civoid msm_gem_shrinker_init(struct drm_device *dev); 28762306a36Sopenharmony_civoid msm_gem_shrinker_cleanup(struct drm_device *dev); 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_cistruct sg_table *msm_gem_prime_get_sg_table(struct drm_gem_object *obj); 29062306a36Sopenharmony_ciint msm_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map); 29162306a36Sopenharmony_civoid msm_gem_prime_vunmap(struct drm_gem_object *obj, struct iosys_map *map); 29262306a36Sopenharmony_cistruct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev, 29362306a36Sopenharmony_ci struct dma_buf_attachment *attach, struct sg_table *sg); 29462306a36Sopenharmony_ciint msm_gem_prime_pin(struct drm_gem_object *obj); 29562306a36Sopenharmony_civoid msm_gem_prime_unpin(struct drm_gem_object *obj); 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ciint msm_framebuffer_prepare(struct drm_framebuffer *fb, 29862306a36Sopenharmony_ci struct msm_gem_address_space *aspace, bool needs_dirtyfb); 29962306a36Sopenharmony_civoid msm_framebuffer_cleanup(struct drm_framebuffer *fb, 30062306a36Sopenharmony_ci struct msm_gem_address_space *aspace, bool needed_dirtyfb); 30162306a36Sopenharmony_ciuint32_t msm_framebuffer_iova(struct drm_framebuffer *fb, 30262306a36Sopenharmony_ci struct msm_gem_address_space *aspace, int plane); 30362306a36Sopenharmony_cistruct drm_gem_object *msm_framebuffer_bo(struct drm_framebuffer *fb, int plane); 30462306a36Sopenharmony_ciconst struct msm_format *msm_framebuffer_format(struct drm_framebuffer *fb); 30562306a36Sopenharmony_cistruct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev, 30662306a36Sopenharmony_ci struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd); 30762306a36Sopenharmony_cistruct drm_framebuffer * msm_alloc_stolen_fb(struct drm_device *dev, 30862306a36Sopenharmony_ci int w, int h, int p, uint32_t format); 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ci#ifdef CONFIG_DRM_FBDEV_EMULATION 31162306a36Sopenharmony_civoid msm_fbdev_setup(struct drm_device *dev); 31262306a36Sopenharmony_ci#else 31362306a36Sopenharmony_cistatic inline void msm_fbdev_setup(struct drm_device *dev) 31462306a36Sopenharmony_ci{ 31562306a36Sopenharmony_ci} 31662306a36Sopenharmony_ci#endif 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_cistruct hdmi; 31962306a36Sopenharmony_ci#ifdef CONFIG_DRM_MSM_HDMI 32062306a36Sopenharmony_ciint msm_hdmi_modeset_init(struct hdmi *hdmi, struct drm_device *dev, 32162306a36Sopenharmony_ci struct drm_encoder *encoder); 32262306a36Sopenharmony_civoid __init msm_hdmi_register(void); 32362306a36Sopenharmony_civoid __exit msm_hdmi_unregister(void); 32462306a36Sopenharmony_ci#else 32562306a36Sopenharmony_cistatic inline int msm_hdmi_modeset_init(struct hdmi *hdmi, struct drm_device *dev, 32662306a36Sopenharmony_ci struct drm_encoder *encoder) 32762306a36Sopenharmony_ci{ 32862306a36Sopenharmony_ci return -EINVAL; 32962306a36Sopenharmony_ci} 33062306a36Sopenharmony_cistatic inline void __init msm_hdmi_register(void) {} 33162306a36Sopenharmony_cistatic inline void __exit msm_hdmi_unregister(void) {} 33262306a36Sopenharmony_ci#endif 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_cistruct msm_dsi; 33562306a36Sopenharmony_ci#ifdef CONFIG_DRM_MSM_DSI 33662306a36Sopenharmony_ciint dsi_dev_attach(struct platform_device *pdev); 33762306a36Sopenharmony_civoid dsi_dev_detach(struct platform_device *pdev); 33862306a36Sopenharmony_civoid __init msm_dsi_register(void); 33962306a36Sopenharmony_civoid __exit msm_dsi_unregister(void); 34062306a36Sopenharmony_ciint msm_dsi_modeset_init(struct msm_dsi *msm_dsi, struct drm_device *dev, 34162306a36Sopenharmony_ci struct drm_encoder *encoder); 34262306a36Sopenharmony_civoid msm_dsi_snapshot(struct msm_disp_state *disp_state, struct msm_dsi *msm_dsi); 34362306a36Sopenharmony_cibool msm_dsi_is_cmd_mode(struct msm_dsi *msm_dsi); 34462306a36Sopenharmony_cibool msm_dsi_is_bonded_dsi(struct msm_dsi *msm_dsi); 34562306a36Sopenharmony_cibool msm_dsi_is_master_dsi(struct msm_dsi *msm_dsi); 34662306a36Sopenharmony_cistruct drm_dsc_config *msm_dsi_get_dsc_config(struct msm_dsi *msm_dsi); 34762306a36Sopenharmony_ci#else 34862306a36Sopenharmony_cistatic inline void __init msm_dsi_register(void) 34962306a36Sopenharmony_ci{ 35062306a36Sopenharmony_ci} 35162306a36Sopenharmony_cistatic inline void __exit msm_dsi_unregister(void) 35262306a36Sopenharmony_ci{ 35362306a36Sopenharmony_ci} 35462306a36Sopenharmony_cistatic inline int msm_dsi_modeset_init(struct msm_dsi *msm_dsi, 35562306a36Sopenharmony_ci struct drm_device *dev, 35662306a36Sopenharmony_ci struct drm_encoder *encoder) 35762306a36Sopenharmony_ci{ 35862306a36Sopenharmony_ci return -EINVAL; 35962306a36Sopenharmony_ci} 36062306a36Sopenharmony_cistatic inline void msm_dsi_snapshot(struct msm_disp_state *disp_state, struct msm_dsi *msm_dsi) 36162306a36Sopenharmony_ci{ 36262306a36Sopenharmony_ci} 36362306a36Sopenharmony_cistatic inline bool msm_dsi_is_cmd_mode(struct msm_dsi *msm_dsi) 36462306a36Sopenharmony_ci{ 36562306a36Sopenharmony_ci return false; 36662306a36Sopenharmony_ci} 36762306a36Sopenharmony_cistatic inline bool msm_dsi_is_bonded_dsi(struct msm_dsi *msm_dsi) 36862306a36Sopenharmony_ci{ 36962306a36Sopenharmony_ci return false; 37062306a36Sopenharmony_ci} 37162306a36Sopenharmony_cistatic inline bool msm_dsi_is_master_dsi(struct msm_dsi *msm_dsi) 37262306a36Sopenharmony_ci{ 37362306a36Sopenharmony_ci return false; 37462306a36Sopenharmony_ci} 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_cistatic inline struct drm_dsc_config *msm_dsi_get_dsc_config(struct msm_dsi *msm_dsi) 37762306a36Sopenharmony_ci{ 37862306a36Sopenharmony_ci return NULL; 37962306a36Sopenharmony_ci} 38062306a36Sopenharmony_ci#endif 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ci#ifdef CONFIG_DRM_MSM_DP 38362306a36Sopenharmony_ciint __init msm_dp_register(void); 38462306a36Sopenharmony_civoid __exit msm_dp_unregister(void); 38562306a36Sopenharmony_ciint msm_dp_modeset_init(struct msm_dp *dp_display, struct drm_device *dev, 38662306a36Sopenharmony_ci struct drm_encoder *encoder); 38762306a36Sopenharmony_civoid msm_dp_irq_postinstall(struct msm_dp *dp_display); 38862306a36Sopenharmony_civoid msm_dp_snapshot(struct msm_disp_state *disp_state, struct msm_dp *dp_display); 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_civoid msm_dp_debugfs_init(struct msm_dp *dp_display, struct drm_minor *minor); 39162306a36Sopenharmony_cibool msm_dp_wide_bus_available(const struct msm_dp *dp_display); 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_ci#else 39462306a36Sopenharmony_cistatic inline int __init msm_dp_register(void) 39562306a36Sopenharmony_ci{ 39662306a36Sopenharmony_ci return -EINVAL; 39762306a36Sopenharmony_ci} 39862306a36Sopenharmony_cistatic inline void __exit msm_dp_unregister(void) 39962306a36Sopenharmony_ci{ 40062306a36Sopenharmony_ci} 40162306a36Sopenharmony_cistatic inline int msm_dp_modeset_init(struct msm_dp *dp_display, 40262306a36Sopenharmony_ci struct drm_device *dev, 40362306a36Sopenharmony_ci struct drm_encoder *encoder) 40462306a36Sopenharmony_ci{ 40562306a36Sopenharmony_ci return -EINVAL; 40662306a36Sopenharmony_ci} 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_cistatic inline void msm_dp_irq_postinstall(struct msm_dp *dp_display) 40962306a36Sopenharmony_ci{ 41062306a36Sopenharmony_ci} 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_cistatic inline void msm_dp_snapshot(struct msm_disp_state *disp_state, struct msm_dp *dp_display) 41362306a36Sopenharmony_ci{ 41462306a36Sopenharmony_ci} 41562306a36Sopenharmony_ci 41662306a36Sopenharmony_cistatic inline void msm_dp_debugfs_init(struct msm_dp *dp_display, 41762306a36Sopenharmony_ci struct drm_minor *minor) 41862306a36Sopenharmony_ci{ 41962306a36Sopenharmony_ci} 42062306a36Sopenharmony_ci 42162306a36Sopenharmony_cistatic inline bool msm_dp_wide_bus_available(const struct msm_dp *dp_display) 42262306a36Sopenharmony_ci{ 42362306a36Sopenharmony_ci return false; 42462306a36Sopenharmony_ci} 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_ci#endif 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci#ifdef CONFIG_DRM_MSM_MDP4 42962306a36Sopenharmony_civoid msm_mdp4_register(void); 43062306a36Sopenharmony_civoid msm_mdp4_unregister(void); 43162306a36Sopenharmony_ci#else 43262306a36Sopenharmony_cistatic inline void msm_mdp4_register(void) {} 43362306a36Sopenharmony_cistatic inline void msm_mdp4_unregister(void) {} 43462306a36Sopenharmony_ci#endif 43562306a36Sopenharmony_ci 43662306a36Sopenharmony_ci#ifdef CONFIG_DRM_MSM_MDP5 43762306a36Sopenharmony_civoid msm_mdp_register(void); 43862306a36Sopenharmony_civoid msm_mdp_unregister(void); 43962306a36Sopenharmony_ci#else 44062306a36Sopenharmony_cistatic inline void msm_mdp_register(void) {} 44162306a36Sopenharmony_cistatic inline void msm_mdp_unregister(void) {} 44262306a36Sopenharmony_ci#endif 44362306a36Sopenharmony_ci 44462306a36Sopenharmony_ci#ifdef CONFIG_DRM_MSM_DPU 44562306a36Sopenharmony_civoid msm_dpu_register(void); 44662306a36Sopenharmony_civoid msm_dpu_unregister(void); 44762306a36Sopenharmony_ci#else 44862306a36Sopenharmony_cistatic inline void msm_dpu_register(void) {} 44962306a36Sopenharmony_cistatic inline void msm_dpu_unregister(void) {} 45062306a36Sopenharmony_ci#endif 45162306a36Sopenharmony_ci 45262306a36Sopenharmony_ci#ifdef CONFIG_DRM_MSM_MDSS 45362306a36Sopenharmony_civoid msm_mdss_register(void); 45462306a36Sopenharmony_civoid msm_mdss_unregister(void); 45562306a36Sopenharmony_ci#else 45662306a36Sopenharmony_cistatic inline void msm_mdss_register(void) {} 45762306a36Sopenharmony_cistatic inline void msm_mdss_unregister(void) {} 45862306a36Sopenharmony_ci#endif 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_ci#ifdef CONFIG_DEBUG_FS 46162306a36Sopenharmony_civoid msm_framebuffer_describe(struct drm_framebuffer *fb, struct seq_file *m); 46262306a36Sopenharmony_ciint msm_debugfs_late_init(struct drm_device *dev); 46362306a36Sopenharmony_ciint msm_rd_debugfs_init(struct drm_minor *minor); 46462306a36Sopenharmony_civoid msm_rd_debugfs_cleanup(struct msm_drm_private *priv); 46562306a36Sopenharmony_ci__printf(3, 4) 46662306a36Sopenharmony_civoid msm_rd_dump_submit(struct msm_rd_state *rd, struct msm_gem_submit *submit, 46762306a36Sopenharmony_ci const char *fmt, ...); 46862306a36Sopenharmony_ciint msm_perf_debugfs_init(struct drm_minor *minor); 46962306a36Sopenharmony_civoid msm_perf_debugfs_cleanup(struct msm_drm_private *priv); 47062306a36Sopenharmony_ci#else 47162306a36Sopenharmony_cistatic inline int msm_debugfs_late_init(struct drm_device *dev) { return 0; } 47262306a36Sopenharmony_ci__printf(3, 4) 47362306a36Sopenharmony_cistatic inline void msm_rd_dump_submit(struct msm_rd_state *rd, 47462306a36Sopenharmony_ci struct msm_gem_submit *submit, 47562306a36Sopenharmony_ci const char *fmt, ...) {} 47662306a36Sopenharmony_cistatic inline void msm_rd_debugfs_cleanup(struct msm_drm_private *priv) {} 47762306a36Sopenharmony_cistatic inline void msm_perf_debugfs_cleanup(struct msm_drm_private *priv) {} 47862306a36Sopenharmony_ci#endif 47962306a36Sopenharmony_ci 48062306a36Sopenharmony_cistruct clk *msm_clk_get(struct platform_device *pdev, const char *name); 48162306a36Sopenharmony_ci 48262306a36Sopenharmony_cistruct clk *msm_clk_bulk_get_clock(struct clk_bulk_data *bulk, int count, 48362306a36Sopenharmony_ci const char *name); 48462306a36Sopenharmony_civoid __iomem *msm_ioremap(struct platform_device *pdev, const char *name); 48562306a36Sopenharmony_civoid __iomem *msm_ioremap_size(struct platform_device *pdev, const char *name, 48662306a36Sopenharmony_ci phys_addr_t *size); 48762306a36Sopenharmony_civoid __iomem *msm_ioremap_quiet(struct platform_device *pdev, const char *name); 48862306a36Sopenharmony_ci 48962306a36Sopenharmony_cistruct icc_path *msm_icc_get(struct device *dev, const char *name); 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_ci#define msm_writel(data, addr) writel((data), (addr)) 49262306a36Sopenharmony_ci#define msm_readl(addr) readl((addr)) 49362306a36Sopenharmony_ci 49462306a36Sopenharmony_cistatic inline void msm_rmw(void __iomem *addr, u32 mask, u32 or) 49562306a36Sopenharmony_ci{ 49662306a36Sopenharmony_ci u32 val = msm_readl(addr); 49762306a36Sopenharmony_ci 49862306a36Sopenharmony_ci val &= ~mask; 49962306a36Sopenharmony_ci msm_writel(val | or, addr); 50062306a36Sopenharmony_ci} 50162306a36Sopenharmony_ci 50262306a36Sopenharmony_ci/** 50362306a36Sopenharmony_ci * struct msm_hrtimer_work - a helper to combine an hrtimer with kthread_work 50462306a36Sopenharmony_ci * 50562306a36Sopenharmony_ci * @timer: hrtimer to control when the kthread work is triggered 50662306a36Sopenharmony_ci * @work: the kthread work 50762306a36Sopenharmony_ci * @worker: the kthread worker the work will be scheduled on 50862306a36Sopenharmony_ci */ 50962306a36Sopenharmony_cistruct msm_hrtimer_work { 51062306a36Sopenharmony_ci struct hrtimer timer; 51162306a36Sopenharmony_ci struct kthread_work work; 51262306a36Sopenharmony_ci struct kthread_worker *worker; 51362306a36Sopenharmony_ci}; 51462306a36Sopenharmony_ci 51562306a36Sopenharmony_civoid msm_hrtimer_queue_work(struct msm_hrtimer_work *work, 51662306a36Sopenharmony_ci ktime_t wakeup_time, 51762306a36Sopenharmony_ci enum hrtimer_mode mode); 51862306a36Sopenharmony_civoid msm_hrtimer_work_init(struct msm_hrtimer_work *work, 51962306a36Sopenharmony_ci struct kthread_worker *worker, 52062306a36Sopenharmony_ci kthread_work_func_t fn, 52162306a36Sopenharmony_ci clockid_t clock_id, 52262306a36Sopenharmony_ci enum hrtimer_mode mode); 52362306a36Sopenharmony_ci 52462306a36Sopenharmony_ci#define DBG(fmt, ...) DRM_DEBUG_DRIVER(fmt"\n", ##__VA_ARGS__) 52562306a36Sopenharmony_ci#define VERB(fmt, ...) if (0) DRM_DEBUG_DRIVER(fmt"\n", ##__VA_ARGS__) 52662306a36Sopenharmony_ci 52762306a36Sopenharmony_cistatic inline int align_pitch(int width, int bpp) 52862306a36Sopenharmony_ci{ 52962306a36Sopenharmony_ci int bytespp = (bpp + 7) / 8; 53062306a36Sopenharmony_ci /* adreno needs pitch aligned to 32 pixels: */ 53162306a36Sopenharmony_ci return bytespp * ALIGN(width, 32); 53262306a36Sopenharmony_ci} 53362306a36Sopenharmony_ci 53462306a36Sopenharmony_ci/* for the generated headers: */ 53562306a36Sopenharmony_ci#define INVALID_IDX(idx) ({BUG(); 0;}) 53662306a36Sopenharmony_ci#define fui(x) ({BUG(); 0;}) 53762306a36Sopenharmony_ci#define _mesa_float_to_half(x) ({BUG(); 0;}) 53862306a36Sopenharmony_ci 53962306a36Sopenharmony_ci 54062306a36Sopenharmony_ci#define FIELD(val, name) (((val) & name ## __MASK) >> name ## __SHIFT) 54162306a36Sopenharmony_ci 54262306a36Sopenharmony_ci/* for conditionally setting boolean flag(s): */ 54362306a36Sopenharmony_ci#define COND(bool, val) ((bool) ? (val) : 0) 54462306a36Sopenharmony_ci 54562306a36Sopenharmony_cistatic inline unsigned long timeout_to_jiffies(const ktime_t *timeout) 54662306a36Sopenharmony_ci{ 54762306a36Sopenharmony_ci ktime_t now = ktime_get(); 54862306a36Sopenharmony_ci s64 remaining_jiffies; 54962306a36Sopenharmony_ci 55062306a36Sopenharmony_ci if (ktime_compare(*timeout, now) < 0) { 55162306a36Sopenharmony_ci remaining_jiffies = 0; 55262306a36Sopenharmony_ci } else { 55362306a36Sopenharmony_ci ktime_t rem = ktime_sub(*timeout, now); 55462306a36Sopenharmony_ci remaining_jiffies = ktime_divns(rem, NSEC_PER_SEC / HZ); 55562306a36Sopenharmony_ci } 55662306a36Sopenharmony_ci 55762306a36Sopenharmony_ci return clamp(remaining_jiffies, 1LL, (s64)INT_MAX); 55862306a36Sopenharmony_ci} 55962306a36Sopenharmony_ci 56062306a36Sopenharmony_ci/* Driver helpers */ 56162306a36Sopenharmony_ci 56262306a36Sopenharmony_ciextern const struct component_master_ops msm_drm_ops; 56362306a36Sopenharmony_ci 56462306a36Sopenharmony_ciint msm_pm_prepare(struct device *dev); 56562306a36Sopenharmony_civoid msm_pm_complete(struct device *dev); 56662306a36Sopenharmony_ci 56762306a36Sopenharmony_ciint msm_drv_probe(struct device *dev, 56862306a36Sopenharmony_ci int (*kms_init)(struct drm_device *dev)); 56962306a36Sopenharmony_civoid msm_drv_shutdown(struct platform_device *pdev); 57062306a36Sopenharmony_ci 57162306a36Sopenharmony_ci 57262306a36Sopenharmony_ci#endif /* __MSM_DRV_H__ */ 573