14bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart/*
24bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart * rcar_du_plane.h  --  R-Car Display Unit Planes
34bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart *
436d50464e05f498fa4024270e091b306af5de898Laurent Pinchart * Copyright (C) 2013-2014 Renesas Electronics Corporation
54bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart *
64bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart * Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com)
74bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart *
84bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart * This program is free software; you can redistribute it and/or modify
94bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart * it under the terms of the GNU General Public License as published by
104bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart * the Free Software Foundation; either version 2 of the License, or
114bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart * (at your option) any later version.
124bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart */
134bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart
144bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart#ifndef __RCAR_DU_PLANE_H__
154bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart#define __RCAR_DU_PLANE_H__
164bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart
17ae425b6a77a1118b1b4f594efe4aaa4243bf222bLaurent Pinchart#include <linux/mutex.h>
18ae425b6a77a1118b1b4f594efe4aaa4243bf222bLaurent Pinchart
19ae425b6a77a1118b1b4f594efe4aaa4243bf222bLaurent Pinchart#include <drm/drmP.h>
20ae425b6a77a1118b1b4f594efe4aaa4243bf222bLaurent Pinchart#include <drm/drm_crtc.h>
21ae425b6a77a1118b1b4f594efe4aaa4243bf222bLaurent Pinchart
224bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchartstruct rcar_du_format_info;
23cb2025d2509ffab1c426509fd9de3d83e40398b9Laurent Pinchartstruct rcar_du_group;
244bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart
254bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart/* The RCAR DU has 8 hardware planes, shared between KMS planes and CRTCs. As
264bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart * using KMS planes requires at least one of the CRTCs being enabled, no more
274bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart * than 7 KMS planes can be available. We thus create 7 KMS planes and
284bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart * 9 software planes (one for each KMS planes and one for each CRTC).
294bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart */
304bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart
314bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart#define RCAR_DU_NUM_KMS_PLANES		7
324bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart#define RCAR_DU_NUM_HW_PLANES		8
334bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart#define RCAR_DU_NUM_SW_PLANES		9
344bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart
354bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchartstruct rcar_du_plane {
36cb2025d2509ffab1c426509fd9de3d83e40398b9Laurent Pinchart	struct rcar_du_group *group;
374bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart	struct drm_crtc *crtc;
384bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart
394bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart	bool enabled;
404bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart
414bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart	int hwindex;		/* 0-based, -1 means unused */
424bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart	unsigned int alpha;
434bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart	unsigned int colorkey;
444bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart	unsigned int zpos;
454bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart
464bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart	const struct rcar_du_format_info *format;
474bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart
484bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart	unsigned long dma[2];
494bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart	unsigned int pitch;
504bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart
514bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart	unsigned int width;
524bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart	unsigned int height;
534bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart
544bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart	unsigned int src_x;
554bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart	unsigned int src_y;
564bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart	unsigned int dst_x;
574bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart	unsigned int dst_y;
584bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart};
594bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart
60ae425b6a77a1118b1b4f594efe4aaa4243bf222bLaurent Pinchartstruct rcar_du_planes {
61ae425b6a77a1118b1b4f594efe4aaa4243bf222bLaurent Pinchart	struct rcar_du_plane planes[RCAR_DU_NUM_SW_PLANES];
62ae425b6a77a1118b1b4f594efe4aaa4243bf222bLaurent Pinchart	unsigned int free;
63ae425b6a77a1118b1b4f594efe4aaa4243bf222bLaurent Pinchart	struct mutex lock;
64ae425b6a77a1118b1b4f594efe4aaa4243bf222bLaurent Pinchart
65ae425b6a77a1118b1b4f594efe4aaa4243bf222bLaurent Pinchart	struct drm_property *alpha;
66ae425b6a77a1118b1b4f594efe4aaa4243bf222bLaurent Pinchart	struct drm_property *colorkey;
67ae425b6a77a1118b1b4f594efe4aaa4243bf222bLaurent Pinchart	struct drm_property *zpos;
68ae425b6a77a1118b1b4f594efe4aaa4243bf222bLaurent Pinchart};
69ae425b6a77a1118b1b4f594efe4aaa4243bf222bLaurent Pinchart
70cb2025d2509ffab1c426509fd9de3d83e40398b9Laurent Pinchartint rcar_du_planes_init(struct rcar_du_group *rgrp);
71cb2025d2509ffab1c426509fd9de3d83e40398b9Laurent Pinchartint rcar_du_planes_register(struct rcar_du_group *rgrp);
727fe99fda5f5c52a01b2c966aa68341a0b3d8ab33Laurent Pinchart
734bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchartvoid rcar_du_plane_setup(struct rcar_du_plane *plane);
744bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchartvoid rcar_du_plane_update_base(struct rcar_du_plane *plane);
754bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchartvoid rcar_du_plane_compute_base(struct rcar_du_plane *plane,
764bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart				struct drm_framebuffer *fb);
774bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchartint rcar_du_plane_reserve(struct rcar_du_plane *plane,
784bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart			  const struct rcar_du_format_info *format);
794bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchartvoid rcar_du_plane_release(struct rcar_du_plane *plane);
804bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart
814bf8e1962f91eed5dbee168d2348983dda0a518fLaurent Pinchart#endif /* __RCAR_DU_PLANE_H__ */
82