18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * (C) COPYRIGHT 2016 ARM Limited. All rights reserved. 48c2ecf20Sopenharmony_ci * Author: Liviu Dudau <Liviu.Dudau@arm.com> 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * ARM Mali DP500/DP550/DP650 KMS/DRM driver structures 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#ifndef __MALIDP_DRV_H__ 108c2ecf20Sopenharmony_ci#define __MALIDP_DRV_H__ 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include <linux/mutex.h> 138c2ecf20Sopenharmony_ci#include <linux/wait.h> 148c2ecf20Sopenharmony_ci#include <linux/spinlock.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#include <drm/drm_writeback.h> 178c2ecf20Sopenharmony_ci#include <drm/drm_encoder.h> 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#include "malidp_hw.h" 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci#define MALIDP_CONFIG_VALID_INIT 0 228c2ecf20Sopenharmony_ci#define MALIDP_CONFIG_VALID_DONE 1 238c2ecf20Sopenharmony_ci#define MALIDP_CONFIG_START 0xd0 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_cistruct malidp_error_stats { 268c2ecf20Sopenharmony_ci s32 num_errors; 278c2ecf20Sopenharmony_ci u32 last_error_status; 288c2ecf20Sopenharmony_ci s64 last_error_vblank; 298c2ecf20Sopenharmony_ci}; 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_cistruct malidp_drm { 328c2ecf20Sopenharmony_ci struct malidp_hw_device *dev; 338c2ecf20Sopenharmony_ci struct drm_crtc crtc; 348c2ecf20Sopenharmony_ci struct drm_writeback_connector mw_connector; 358c2ecf20Sopenharmony_ci wait_queue_head_t wq; 368c2ecf20Sopenharmony_ci struct drm_pending_vblank_event *event; 378c2ecf20Sopenharmony_ci atomic_t config_valid; 388c2ecf20Sopenharmony_ci u32 core_id; 398c2ecf20Sopenharmony_ci#ifdef CONFIG_DEBUG_FS 408c2ecf20Sopenharmony_ci struct malidp_error_stats de_errors; 418c2ecf20Sopenharmony_ci struct malidp_error_stats se_errors; 428c2ecf20Sopenharmony_ci /* Protects errors stats */ 438c2ecf20Sopenharmony_ci spinlock_t errors_lock; 448c2ecf20Sopenharmony_ci#endif 458c2ecf20Sopenharmony_ci}; 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci#define crtc_to_malidp_device(x) container_of(x, struct malidp_drm, crtc) 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_cistruct malidp_plane { 508c2ecf20Sopenharmony_ci struct drm_plane base; 518c2ecf20Sopenharmony_ci struct malidp_hw_device *hwdev; 528c2ecf20Sopenharmony_ci const struct malidp_layer *layer; 538c2ecf20Sopenharmony_ci}; 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_cienum mmu_prefetch_mode { 568c2ecf20Sopenharmony_ci MALIDP_PREFETCH_MODE_NONE, 578c2ecf20Sopenharmony_ci MALIDP_PREFETCH_MODE_PARTIAL, 588c2ecf20Sopenharmony_ci MALIDP_PREFETCH_MODE_FULL, 598c2ecf20Sopenharmony_ci}; 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_cistruct malidp_plane_state { 628c2ecf20Sopenharmony_ci struct drm_plane_state base; 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci /* size of the required rotation memory if plane is rotated */ 658c2ecf20Sopenharmony_ci u32 rotmem_size; 668c2ecf20Sopenharmony_ci /* internal format ID */ 678c2ecf20Sopenharmony_ci u8 format; 688c2ecf20Sopenharmony_ci u8 n_planes; 698c2ecf20Sopenharmony_ci enum mmu_prefetch_mode mmu_prefetch_mode; 708c2ecf20Sopenharmony_ci u32 mmu_prefetch_pgsize; 718c2ecf20Sopenharmony_ci}; 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci#define to_malidp_plane(x) container_of(x, struct malidp_plane, base) 748c2ecf20Sopenharmony_ci#define to_malidp_plane_state(x) container_of(x, struct malidp_plane_state, base) 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_cistruct malidp_crtc_state { 778c2ecf20Sopenharmony_ci struct drm_crtc_state base; 788c2ecf20Sopenharmony_ci u32 gamma_coeffs[MALIDP_COEFFTAB_NUM_COEFFS]; 798c2ecf20Sopenharmony_ci u32 coloradj_coeffs[MALIDP_COLORADJ_NUM_COEFFS]; 808c2ecf20Sopenharmony_ci struct malidp_se_config scaler_config; 818c2ecf20Sopenharmony_ci /* Bitfield of all the planes that have requested a scaled output. */ 828c2ecf20Sopenharmony_ci u8 scaled_planes_mask; 838c2ecf20Sopenharmony_ci}; 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci#define to_malidp_crtc_state(x) container_of(x, struct malidp_crtc_state, base) 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ciint malidp_de_planes_init(struct drm_device *drm); 888c2ecf20Sopenharmony_ciint malidp_crtc_init(struct drm_device *drm); 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_cibool malidp_hw_format_is_linear_only(u32 format); 918c2ecf20Sopenharmony_cibool malidp_hw_format_is_afbc_only(u32 format); 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_cibool malidp_format_mod_supported(struct drm_device *drm, 948c2ecf20Sopenharmony_ci u32 format, u64 modifier); 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci#ifdef CONFIG_DEBUG_FS 978c2ecf20Sopenharmony_civoid malidp_error(struct malidp_drm *malidp, 988c2ecf20Sopenharmony_ci struct malidp_error_stats *error_stats, u32 status, 998c2ecf20Sopenharmony_ci u64 vblank); 1008c2ecf20Sopenharmony_ci#endif 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci/* often used combination of rotational bits */ 1038c2ecf20Sopenharmony_ci#define MALIDP_ROTATED_MASK (DRM_MODE_ROTATE_90 | DRM_MODE_ROTATE_270) 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci#endif /* __MALIDP_DRV_H__ */ 106