1*11696c5eSBiju Das /* SPDX-License-Identifier: GPL-2.0+ */
2*11696c5eSBiju Das /*
3*11696c5eSBiju Das  * R-Car Display Unit Planes
4*11696c5eSBiju Das  *
5*11696c5eSBiju Das  * Copyright (C) 2013-2014 Renesas Electronics Corporation
6*11696c5eSBiju Das  *
7*11696c5eSBiju Das  * Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com)
8*11696c5eSBiju Das  */
9*11696c5eSBiju Das 
10*11696c5eSBiju Das #ifndef __RCAR_DU_PLANE_H__
11*11696c5eSBiju Das #define __RCAR_DU_PLANE_H__
12*11696c5eSBiju Das 
13*11696c5eSBiju Das #include <drm/drm_plane.h>
14*11696c5eSBiju Das 
15*11696c5eSBiju Das struct rcar_du_format_info;
16*11696c5eSBiju Das struct rcar_du_group;
17*11696c5eSBiju Das 
18*11696c5eSBiju Das /*
19*11696c5eSBiju Das  * The RCAR DU has 8 hardware planes, shared between primary and overlay planes.
20*11696c5eSBiju Das  * As using overlay planes requires at least one of the CRTCs being enabled, no
21*11696c5eSBiju Das  * more than 7 overlay planes can be available. We thus create 1 primary plane
22*11696c5eSBiju Das  * per CRTC and 7 overlay planes, for a total of up to 9 KMS planes.
23*11696c5eSBiju Das  */
24*11696c5eSBiju Das #define RCAR_DU_NUM_KMS_PLANES		9
25*11696c5eSBiju Das #define RCAR_DU_NUM_HW_PLANES		8
26*11696c5eSBiju Das 
27*11696c5eSBiju Das enum rcar_du_plane_source {
28*11696c5eSBiju Das 	RCAR_DU_PLANE_MEMORY,
29*11696c5eSBiju Das 	RCAR_DU_PLANE_VSPD0,
30*11696c5eSBiju Das 	RCAR_DU_PLANE_VSPD1,
31*11696c5eSBiju Das };
32*11696c5eSBiju Das 
33*11696c5eSBiju Das struct rcar_du_plane {
34*11696c5eSBiju Das 	struct drm_plane plane;
35*11696c5eSBiju Das 	struct rcar_du_group *group;
36*11696c5eSBiju Das };
37*11696c5eSBiju Das 
to_rcar_plane(struct drm_plane * plane)38*11696c5eSBiju Das static inline struct rcar_du_plane *to_rcar_plane(struct drm_plane *plane)
39*11696c5eSBiju Das {
40*11696c5eSBiju Das 	return container_of(plane, struct rcar_du_plane, plane);
41*11696c5eSBiju Das }
42*11696c5eSBiju Das 
43*11696c5eSBiju Das /**
44*11696c5eSBiju Das  * struct rcar_du_plane_state - Driver-specific plane state
45*11696c5eSBiju Das  * @state: base DRM plane state
46*11696c5eSBiju Das  * @format: information about the pixel format used by the plane
47*11696c5eSBiju Das  * @hwindex: 0-based hardware plane index, -1 means unused
48*11696c5eSBiju Das  * @colorkey: value of the plane colorkey property
49*11696c5eSBiju Das  */
50*11696c5eSBiju Das struct rcar_du_plane_state {
51*11696c5eSBiju Das 	struct drm_plane_state state;
52*11696c5eSBiju Das 
53*11696c5eSBiju Das 	const struct rcar_du_format_info *format;
54*11696c5eSBiju Das 	int hwindex;
55*11696c5eSBiju Das 	enum rcar_du_plane_source source;
56*11696c5eSBiju Das 
57*11696c5eSBiju Das 	unsigned int colorkey;
58*11696c5eSBiju Das };
59*11696c5eSBiju Das 
60*11696c5eSBiju Das static inline struct rcar_du_plane_state *
to_rcar_plane_state(struct drm_plane_state * state)61*11696c5eSBiju Das to_rcar_plane_state(struct drm_plane_state *state)
62*11696c5eSBiju Das {
63*11696c5eSBiju Das 	return container_of(state, struct rcar_du_plane_state, state);
64*11696c5eSBiju Das }
65*11696c5eSBiju Das 
66*11696c5eSBiju Das int rcar_du_atomic_check_planes(struct drm_device *dev,
67*11696c5eSBiju Das 				struct drm_atomic_state *state);
68*11696c5eSBiju Das 
69*11696c5eSBiju Das int __rcar_du_plane_atomic_check(struct drm_plane *plane,
70*11696c5eSBiju Das 				 struct drm_plane_state *state,
71*11696c5eSBiju Das 				 const struct rcar_du_format_info **format);
72*11696c5eSBiju Das 
73*11696c5eSBiju Das int rcar_du_planes_init(struct rcar_du_group *rgrp);
74*11696c5eSBiju Das 
75*11696c5eSBiju Das void __rcar_du_plane_setup(struct rcar_du_group *rgrp,
76*11696c5eSBiju Das 			   const struct rcar_du_plane_state *state);
77*11696c5eSBiju Das 
rcar_du_plane_setup(struct rcar_du_plane * plane)78*11696c5eSBiju Das static inline void rcar_du_plane_setup(struct rcar_du_plane *plane)
79*11696c5eSBiju Das {
80*11696c5eSBiju Das 	struct rcar_du_plane_state *state =
81*11696c5eSBiju Das 		to_rcar_plane_state(plane->plane.state);
82*11696c5eSBiju Das 
83*11696c5eSBiju Das 	return __rcar_du_plane_setup(plane->group, state);
84*11696c5eSBiju Das }
85*11696c5eSBiju Das 
86*11696c5eSBiju Das #endif /* __RCAR_DU_PLANE_H__ */
87