18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 2017 NVIDIA CORPORATION.  All rights reserved.
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#ifndef TEGRA_PLANE_H
78c2ecf20Sopenharmony_ci#define TEGRA_PLANE_H 1
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include <drm/drm_plane.h>
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_cistruct tegra_bo;
128c2ecf20Sopenharmony_cistruct tegra_dc;
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_cistruct tegra_plane {
158c2ecf20Sopenharmony_ci	struct drm_plane base;
168c2ecf20Sopenharmony_ci	struct tegra_dc *dc;
178c2ecf20Sopenharmony_ci	unsigned int offset;
188c2ecf20Sopenharmony_ci	unsigned int index;
198c2ecf20Sopenharmony_ci};
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_cistruct tegra_cursor {
228c2ecf20Sopenharmony_ci	struct tegra_plane base;
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci	struct tegra_bo *bo;
258c2ecf20Sopenharmony_ci	unsigned int width;
268c2ecf20Sopenharmony_ci	unsigned int height;
278c2ecf20Sopenharmony_ci};
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_cistatic inline struct tegra_plane *to_tegra_plane(struct drm_plane *plane)
308c2ecf20Sopenharmony_ci{
318c2ecf20Sopenharmony_ci	return container_of(plane, struct tegra_plane, base);
328c2ecf20Sopenharmony_ci}
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_cistruct tegra_plane_legacy_blending_state {
358c2ecf20Sopenharmony_ci	bool alpha;
368c2ecf20Sopenharmony_ci	bool top;
378c2ecf20Sopenharmony_ci};
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_cistruct tegra_plane_state {
408c2ecf20Sopenharmony_ci	struct drm_plane_state base;
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci	struct sg_table *sgt[3];
438c2ecf20Sopenharmony_ci	dma_addr_t iova[3];
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci	struct tegra_bo_tiling tiling;
468c2ecf20Sopenharmony_ci	u32 format;
478c2ecf20Sopenharmony_ci	u32 swap;
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci	bool reflect_x;
508c2ecf20Sopenharmony_ci	bool reflect_y;
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci	/* used for legacy blending support only */
538c2ecf20Sopenharmony_ci	struct tegra_plane_legacy_blending_state blending[2];
548c2ecf20Sopenharmony_ci	bool opaque;
558c2ecf20Sopenharmony_ci};
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_cistatic inline struct tegra_plane_state *
588c2ecf20Sopenharmony_cito_tegra_plane_state(struct drm_plane_state *state)
598c2ecf20Sopenharmony_ci{
608c2ecf20Sopenharmony_ci	if (state)
618c2ecf20Sopenharmony_ci		return container_of(state, struct tegra_plane_state, base);
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci	return NULL;
648c2ecf20Sopenharmony_ci}
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ciextern const struct drm_plane_funcs tegra_plane_funcs;
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ciint tegra_plane_prepare_fb(struct drm_plane *plane,
698c2ecf20Sopenharmony_ci			   struct drm_plane_state *state);
708c2ecf20Sopenharmony_civoid tegra_plane_cleanup_fb(struct drm_plane *plane,
718c2ecf20Sopenharmony_ci			    struct drm_plane_state *state);
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ciint tegra_plane_state_add(struct tegra_plane *plane,
748c2ecf20Sopenharmony_ci			  struct drm_plane_state *state);
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ciint tegra_plane_format(u32 fourcc, u32 *format, u32 *swap);
778c2ecf20Sopenharmony_cibool tegra_plane_format_is_yuv(unsigned int format, bool *planar);
788c2ecf20Sopenharmony_ciint tegra_plane_setup_legacy_state(struct tegra_plane *tegra,
798c2ecf20Sopenharmony_ci				   struct tegra_plane_state *state);
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ci#endif /* TEGRA_PLANE_H */
82