Path: blob/master/drivers/gpu/drm/arm/display/komeda/komeda_kms.h
26519 views
/* SPDX-License-Identifier: GPL-2.0 */1/*2* (C) COPYRIGHT 2018 ARM Limited. All rights reserved.3* Author: James.Qian.Wang <[email protected]>4*5*/6#ifndef _KOMEDA_KMS_H_7#define _KOMEDA_KMS_H_89#include <linux/list.h>10#include <drm/drm_atomic.h>11#include <drm/drm_atomic_helper.h>12#include <drm/drm_blend.h>13#include <drm/drm_device.h>14#include <drm/drm_writeback.h>15#include <drm/drm_print.h>1617/**18* struct komeda_plane - komeda instance of drm_plane19*/20struct komeda_plane {21/** @base: &drm_plane */22struct drm_plane base;23/**24* @layer:25*26* represents available layer input pipelines for this plane.27*28* NOTE:29* the layer is not for a specific Layer, but indicate a group of30* Layers with same capabilities.31*/32struct komeda_layer *layer;33};3435/**36* struct komeda_plane_state37*38* The plane_state can be split into two data flow (left/right) and handled39* by two layers &komeda_plane.layer and &komeda_plane.layer.right40*/41struct komeda_plane_state {42/** @base: &drm_plane_state */43struct drm_plane_state base;44/** @zlist_node: zorder list node */45struct list_head zlist_node;4647/** @layer_split: on/off layer_split */48u8 layer_split : 1;49};5051/**52* struct komeda_wb_connector53*/54struct komeda_wb_connector {55/** @base: &drm_writeback_connector */56struct drm_writeback_connector base;5758/** @wb_layer: represents associated writeback pipeline of komeda */59struct komeda_layer *wb_layer;60};6162/**63* struct komeda_crtc64*/65struct komeda_crtc {66/** @base: &drm_crtc */67struct drm_crtc base;68/** @master: only master has display output */69struct komeda_pipeline *master;70/**71* @slave: optional72*73* Doesn't have its own display output, the handled data flow will74* merge into the master.75*/76struct komeda_pipeline *slave;7778/** @slave_planes: komeda slave planes mask */79u32 slave_planes;8081/** @wb_conn: komeda write back connector */82struct komeda_wb_connector *wb_conn;8384/** @disable_done: this flip_done is for tracing the disable */85struct completion *disable_done;8687/** @encoder: encoder at the end of the pipeline */88struct drm_encoder encoder;89};9091/**92* struct komeda_crtc_state93*/94struct komeda_crtc_state {95/** @base: &drm_crtc_state */96struct drm_crtc_state base;9798/* private properties */99100/* computed state which are used by validate/check */101/**102* @affected_pipes:103* the affected pipelines in once display instance104*/105u32 affected_pipes;106/**107* @active_pipes:108* the active pipelines in once display instance109*/110u32 active_pipes;111112/** @clock_ratio: ratio of (aclk << 32)/pxlclk */113u64 clock_ratio;114115/** @max_slave_zorder: the maximum of slave zorder */116u32 max_slave_zorder;117};118119/** struct komeda_kms_dev - for gather KMS related things */120struct komeda_kms_dev {121/** @base: &drm_device */122struct drm_device base;123124/** @n_crtcs: valid numbers of crtcs in &komeda_kms_dev.crtcs */125int n_crtcs;126/** @crtcs: crtcs list */127struct komeda_crtc crtcs[KOMEDA_MAX_PIPELINES];128};129130#define to_kplane(p) container_of(p, struct komeda_plane, base)131#define to_kplane_st(p) container_of(p, struct komeda_plane_state, base)132#define to_kconn(p) container_of(p, struct komeda_wb_connector, base)133#define to_kcrtc(p) container_of(p, struct komeda_crtc, base)134#define to_kcrtc_st(p) container_of(p, struct komeda_crtc_state, base)135#define to_kdev(p) container_of(p, struct komeda_kms_dev, base)136#define to_wb_conn(x) container_of(x, struct drm_writeback_connector, base)137138static inline bool is_writeback_only(struct drm_crtc_state *st)139{140struct komeda_wb_connector *wb_conn = to_kcrtc(st->crtc)->wb_conn;141struct drm_connector *conn = wb_conn ? &wb_conn->base.base : NULL;142143return conn && (st->connector_mask == BIT(drm_connector_index(conn)));144}145146static inline bool147is_only_changed_connector(struct drm_crtc_state *st, struct drm_connector *conn)148{149struct drm_crtc_state *old_st;150u32 changed_connectors;151152old_st = drm_atomic_get_old_crtc_state(st->state, st->crtc);153changed_connectors = st->connector_mask ^ old_st->connector_mask;154155return BIT(drm_connector_index(conn)) == changed_connectors;156}157158static inline bool has_flip_h(u32 rot)159{160u32 rotation = drm_rotation_simplify(rot,161DRM_MODE_ROTATE_0 |162DRM_MODE_ROTATE_90 |163DRM_MODE_REFLECT_MASK);164165if (rotation & DRM_MODE_ROTATE_90)166return !!(rotation & DRM_MODE_REFLECT_Y);167else168return !!(rotation & DRM_MODE_REFLECT_X);169}170171void komeda_crtc_get_color_config(struct drm_crtc_state *crtc_st,172u32 *color_depths, u32 *color_formats);173unsigned long komeda_crtc_get_aclk(struct komeda_crtc_state *kcrtc_st);174175int komeda_kms_setup_crtcs(struct komeda_kms_dev *kms, struct komeda_dev *mdev);176177int komeda_kms_add_crtcs(struct komeda_kms_dev *kms, struct komeda_dev *mdev);178int komeda_kms_add_planes(struct komeda_kms_dev *kms, struct komeda_dev *mdev);179int komeda_kms_add_private_objs(struct komeda_kms_dev *kms,180struct komeda_dev *mdev);181int komeda_kms_add_wb_connectors(struct komeda_kms_dev *kms,182struct komeda_dev *mdev);183void komeda_kms_cleanup_private_objs(struct komeda_kms_dev *kms);184185void komeda_crtc_handle_event(struct komeda_crtc *kcrtc,186struct komeda_events *evts);187void komeda_crtc_flush_and_wait_for_flip_done(struct komeda_crtc *kcrtc,188struct completion *input_flip_done);189190struct komeda_kms_dev *komeda_kms_attach(struct komeda_dev *mdev);191void komeda_kms_detach(struct komeda_kms_dev *kms);192void komeda_kms_shutdown(struct komeda_kms_dev *kms);193void komeda_pipeline_dump(struct komeda_pipeline *pipe);194195#endif /*_KOMEDA_KMS_H_*/196197198