 cd52471999
			
		
	
	
	cd52471999
	
	
	
		
			
			Description of the 'state' parameter for intel_plane_destroy_state() was missing and the intel_atomic_plane.c file section heading did not match drm.tmpl. Signed-off-by: Matt Roper <matthew.d.roper@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
		
			
				
	
	
		
			152 lines
		
	
	
	
		
			4.8 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
	
		
			4.8 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright © 2014 Intel Corporation
 | |
|  *
 | |
|  * Permission is hereby granted, free of charge, to any person obtaining a
 | |
|  * copy of this software and associated documentation files (the "Software"),
 | |
|  * to deal in the Software without restriction, including without limitation
 | |
|  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | |
|  * and/or sell copies of the Software, and to permit persons to whom the
 | |
|  * Software is furnished to do so, subject to the following conditions:
 | |
|  *
 | |
|  * The above copyright notice and this permission notice (including the next
 | |
|  * paragraph) shall be included in all copies or substantial portions of the
 | |
|  * Software.
 | |
|  *
 | |
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | |
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | |
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | |
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | |
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | |
|  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 | |
|  * DEALINGS IN THE SOFTWARE.
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * DOC: atomic plane helpers
 | |
|  *
 | |
|  * The functions here are used by the atomic plane helper functions to
 | |
|  * implement legacy plane updates (i.e., drm_plane->update_plane() and
 | |
|  * drm_plane->disable_plane()).  This allows plane updates to use the
 | |
|  * atomic state infrastructure and perform plane updates as separate
 | |
|  * prepare/check/commit/cleanup steps.
 | |
|  */
 | |
| 
 | |
| #include <drm/drmP.h>
 | |
| #include <drm/drm_atomic_helper.h>
 | |
| #include <drm/drm_plane_helper.h>
 | |
| #include "intel_drv.h"
 | |
| 
 | |
| /**
 | |
|  * intel_plane_duplicate_state - duplicate plane state
 | |
|  * @plane: drm plane
 | |
|  *
 | |
|  * Allocates and returns a copy of the plane state (both common and
 | |
|  * Intel-specific) for the specified plane.
 | |
|  *
 | |
|  * Returns: The newly allocated plane state, or NULL or failure.
 | |
|  */
 | |
| struct drm_plane_state *
 | |
| intel_plane_duplicate_state(struct drm_plane *plane)
 | |
| {
 | |
| 	struct intel_plane_state *state;
 | |
| 
 | |
| 	if (plane->state)
 | |
| 		state = kmemdup(plane->state, sizeof(*state), GFP_KERNEL);
 | |
| 	else
 | |
| 		state = kzalloc(sizeof(*state), GFP_KERNEL);
 | |
| 
 | |
| 	if (!state)
 | |
| 		return NULL;
 | |
| 
 | |
| 	if (state->base.fb)
 | |
| 		drm_framebuffer_reference(state->base.fb);
 | |
| 
 | |
| 	return &state->base;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * intel_plane_destroy_state - destroy plane state
 | |
|  * @plane: drm plane
 | |
|  * @state: state object to destroy
 | |
|  *
 | |
|  * Destroys the plane state (both common and Intel-specific) for the
 | |
|  * specified plane.
 | |
|  */
 | |
| void
 | |
| intel_plane_destroy_state(struct drm_plane *plane,
 | |
| 			  struct drm_plane_state *state)
 | |
| {
 | |
| 	drm_atomic_helper_plane_destroy_state(plane, state);
 | |
| }
 | |
| 
 | |
| static int intel_plane_atomic_check(struct drm_plane *plane,
 | |
| 				    struct drm_plane_state *state)
 | |
| {
 | |
| 	struct drm_crtc *crtc = state->crtc;
 | |
| 	struct intel_crtc *intel_crtc;
 | |
| 	struct intel_plane *intel_plane = to_intel_plane(plane);
 | |
| 	struct intel_plane_state *intel_state = to_intel_plane_state(state);
 | |
| 
 | |
| 	crtc = crtc ? crtc : plane->crtc;
 | |
| 	intel_crtc = to_intel_crtc(crtc);
 | |
| 
 | |
| 	/*
 | |
| 	 * The original src/dest coordinates are stored in state->base, but
 | |
| 	 * we want to keep another copy internal to our driver that we can
 | |
| 	 * clip/modify ourselves.
 | |
| 	 */
 | |
| 	intel_state->src.x1 = state->src_x;
 | |
| 	intel_state->src.y1 = state->src_y;
 | |
| 	intel_state->src.x2 = state->src_x + state->src_w;
 | |
| 	intel_state->src.y2 = state->src_y + state->src_h;
 | |
| 	intel_state->dst.x1 = state->crtc_x;
 | |
| 	intel_state->dst.y1 = state->crtc_y;
 | |
| 	intel_state->dst.x2 = state->crtc_x + state->crtc_w;
 | |
| 	intel_state->dst.y2 = state->crtc_y + state->crtc_h;
 | |
| 
 | |
| 	/* Clip all planes to CRTC size, or 0x0 if CRTC is disabled */
 | |
| 	intel_state->clip.x1 = 0;
 | |
| 	intel_state->clip.y1 = 0;
 | |
| 	intel_state->clip.x2 =
 | |
| 		intel_crtc->active ? intel_crtc->config.pipe_src_w : 0;
 | |
| 	intel_state->clip.y2 =
 | |
| 		intel_crtc->active ? intel_crtc->config.pipe_src_h : 0;
 | |
| 
 | |
| 	/*
 | |
| 	 * Disabling a plane is always okay; we just need to update
 | |
| 	 * fb tracking in a special way since cleanup_fb() won't
 | |
| 	 * get called by the plane helpers.
 | |
| 	 */
 | |
| 	if (state->fb == NULL && plane->state->fb != NULL) {
 | |
| 		/*
 | |
| 		 * 'prepare' is never called when plane is being disabled, so
 | |
| 		 * we need to handle frontbuffer tracking as a special case
 | |
| 		 */
 | |
| 		intel_crtc->atomic.disabled_planes |=
 | |
| 			(1 << drm_plane_index(plane));
 | |
| 	}
 | |
| 
 | |
| 	return intel_plane->check_plane(plane, intel_state);
 | |
| }
 | |
| 
 | |
| static void intel_plane_atomic_update(struct drm_plane *plane,
 | |
| 				      struct drm_plane_state *old_state)
 | |
| {
 | |
| 	struct intel_plane *intel_plane = to_intel_plane(plane);
 | |
| 	struct intel_plane_state *intel_state =
 | |
| 		to_intel_plane_state(plane->state);
 | |
| 
 | |
| 	/* Don't disable an already disabled plane */
 | |
| 	if (!plane->state->fb && !old_state->fb)
 | |
| 		return;
 | |
| 
 | |
| 	intel_plane->commit_plane(plane, intel_state);
 | |
| }
 | |
| 
 | |
| const struct drm_plane_helper_funcs intel_plane_helper_funcs = {
 | |
| 	.prepare_fb = intel_prepare_plane_fb,
 | |
| 	.cleanup_fb = intel_cleanup_plane_fb,
 | |
| 	.atomic_check = intel_plane_atomic_check,
 | |
| 	.atomic_update = intel_plane_atomic_update,
 | |
| };
 | |
| 
 |