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