LCOV - code coverage report
Current view: top level - dev/pci/drm/i915 - intel_atomic_plane.c (source / functions) Hit Total Coverage
Test: 6.4 Lines: 0 67 0.0 %
Date: 2018-10-19 03:25:38 Functions: 0 7 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * Copyright © 2014 Intel Corporation
       3             :  *
       4             :  * Permission is hereby granted, free of charge, to any person obtaining a
       5             :  * copy of this software and associated documentation files (the "Software"),
       6             :  * to deal in the Software without restriction, including without limitation
       7             :  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
       8             :  * and/or sell copies of the Software, and to permit persons to whom the
       9             :  * Software is furnished to do so, subject to the following conditions:
      10             :  *
      11             :  * The above copyright notice and this permission notice (including the next
      12             :  * paragraph) shall be included in all copies or substantial portions of the
      13             :  * Software.
      14             :  *
      15             :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      16             :  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      17             :  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
      18             :  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      19             :  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
      20             :  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
      21             :  * DEALINGS IN THE SOFTWARE.
      22             :  */
      23             : 
      24             : /**
      25             :  * DOC: atomic plane helpers
      26             :  *
      27             :  * The functions here are used by the atomic plane helper functions to
      28             :  * implement legacy plane updates (i.e., drm_plane->update_plane() and
      29             :  * drm_plane->disable_plane()).  This allows plane updates to use the
      30             :  * atomic state infrastructure and perform plane updates as separate
      31             :  * prepare/check/commit/cleanup steps.
      32             :  */
      33             : 
      34             : #include <dev/pci/drm/drmP.h>
      35             : #include <dev/pci/drm/drm_atomic_helper.h>
      36             : #include <dev/pci/drm/drm_plane_helper.h>
      37             : #include "intel_drv.h"
      38             : 
      39             : /**
      40             :  * intel_create_plane_state - create plane state object
      41             :  * @plane: drm plane
      42             :  *
      43             :  * Allocates a fresh plane state for the given plane and sets some of
      44             :  * the state values to sensible initial values.
      45             :  *
      46             :  * Returns: A newly allocated plane state, or NULL on failure
      47             :  */
      48             : struct intel_plane_state *
      49           0 : intel_create_plane_state(struct drm_plane *plane)
      50             : {
      51             :         struct intel_plane_state *state;
      52             : 
      53           0 :         state = kzalloc(sizeof(*state), GFP_KERNEL);
      54           0 :         if (!state)
      55           0 :                 return NULL;
      56             : 
      57           0 :         state->base.plane = plane;
      58           0 :         state->base.rotation = BIT(DRM_ROTATE_0);
      59           0 :         state->ckey.flags = I915_SET_COLORKEY_NONE;
      60             : 
      61           0 :         return state;
      62           0 : }
      63             : 
      64             : /**
      65             :  * intel_plane_duplicate_state - duplicate plane state
      66             :  * @plane: drm plane
      67             :  *
      68             :  * Allocates and returns a copy of the plane state (both common and
      69             :  * Intel-specific) for the specified plane.
      70             :  *
      71             :  * Returns: The newly allocated plane state, or NULL on failure.
      72             :  */
      73             : struct drm_plane_state *
      74           0 : intel_plane_duplicate_state(struct drm_plane *plane)
      75             : {
      76             :         struct drm_plane_state *state;
      77             :         struct intel_plane_state *intel_state;
      78             : 
      79           0 :         intel_state = kmemdup(plane->state, sizeof(*intel_state), GFP_KERNEL);
      80             : 
      81           0 :         if (!intel_state)
      82           0 :                 return NULL;
      83             : 
      84           0 :         state = &intel_state->base;
      85             : 
      86           0 :         __drm_atomic_helper_plane_duplicate_state(plane, state);
      87             : 
      88           0 :         return state;
      89           0 : }
      90             : 
      91             : /**
      92             :  * intel_plane_destroy_state - destroy plane state
      93             :  * @plane: drm plane
      94             :  * @state: state object to destroy
      95             :  *
      96             :  * Destroys the plane state (both common and Intel-specific) for the
      97             :  * specified plane.
      98             :  */
      99             : void
     100           0 : intel_plane_destroy_state(struct drm_plane *plane,
     101             :                           struct drm_plane_state *state)
     102             : {
     103           0 :         drm_atomic_helper_plane_destroy_state(plane, state);
     104           0 : }
     105             : 
     106           0 : static int intel_plane_atomic_check(struct drm_plane *plane,
     107             :                                     struct drm_plane_state *state)
     108             : {
     109           0 :         struct drm_crtc *crtc = state->crtc;
     110             :         struct intel_crtc *intel_crtc;
     111             :         struct intel_crtc_state *crtc_state;
     112           0 :         struct intel_plane *intel_plane = to_intel_plane(plane);
     113           0 :         struct intel_plane_state *intel_state = to_intel_plane_state(state);
     114             :         struct drm_crtc_state *drm_crtc_state;
     115             :         int ret;
     116             : 
     117           0 :         crtc = crtc ? crtc : plane->state->crtc;
     118           0 :         intel_crtc = to_intel_crtc(crtc);
     119             : 
     120             :         /*
     121             :          * Both crtc and plane->crtc could be NULL if we're updating a
     122             :          * property while the plane is disabled.  We don't actually have
     123             :          * anything driver-specific we need to test in that case, so
     124             :          * just return success.
     125             :          */
     126           0 :         if (!crtc)
     127           0 :                 return 0;
     128             : 
     129           0 :         drm_crtc_state = drm_atomic_get_existing_crtc_state(state->state, crtc);
     130           0 :         if (WARN_ON(!drm_crtc_state))
     131           0 :                 return -EINVAL;
     132             : 
     133           0 :         crtc_state = to_intel_crtc_state(drm_crtc_state);
     134             : 
     135             :         /*
     136             :          * The original src/dest coordinates are stored in state->base, but
     137             :          * we want to keep another copy internal to our driver that we can
     138             :          * clip/modify ourselves.
     139             :          */
     140           0 :         intel_state->src.x1 = state->src_x;
     141           0 :         intel_state->src.y1 = state->src_y;
     142           0 :         intel_state->src.x2 = state->src_x + state->src_w;
     143           0 :         intel_state->src.y2 = state->src_y + state->src_h;
     144           0 :         intel_state->dst.x1 = state->crtc_x;
     145           0 :         intel_state->dst.y1 = state->crtc_y;
     146           0 :         intel_state->dst.x2 = state->crtc_x + state->crtc_w;
     147           0 :         intel_state->dst.y2 = state->crtc_y + state->crtc_h;
     148             : 
     149             :         /* Clip all planes to CRTC size, or 0x0 if CRTC is disabled */
     150           0 :         intel_state->clip.x1 = 0;
     151           0 :         intel_state->clip.y1 = 0;
     152           0 :         intel_state->clip.x2 =
     153           0 :                 crtc_state->base.active ? crtc_state->pipe_src_w : 0;
     154           0 :         intel_state->clip.y2 =
     155           0 :                 crtc_state->base.active ? crtc_state->pipe_src_h : 0;
     156             : 
     157           0 :         if (state->fb && intel_rotation_90_or_270(state->rotation)) {
     158           0 :                 if (!(state->fb->modifier[0] == I915_FORMAT_MOD_Y_TILED ||
     159           0 :                         state->fb->modifier[0] == I915_FORMAT_MOD_Yf_TILED)) {
     160             :                         DRM_DEBUG_KMS("Y/Yf tiling required for 90/270!\n");
     161           0 :                         return -EINVAL;
     162             :                 }
     163             : 
     164             :                 /*
     165             :                  * 90/270 is not allowed with RGB64 16:16:16:16,
     166             :                  * RGB 16-bit 5:6:5, and Indexed 8-bit.
     167             :                  * TBD: Add RGB64 case once its added in supported format list.
     168             :                  */
     169           0 :                 switch (state->fb->pixel_format) {
     170             :                 case DRM_FORMAT_C8:
     171             :                 case DRM_FORMAT_RGB565:
     172             :                         DRM_DEBUG_KMS("Unsupported pixel format %s for 90/270!\n",
     173             :                                         drm_get_format_name(state->fb->pixel_format));
     174           0 :                         return -EINVAL;
     175             : 
     176             :                 default:
     177             :                         break;
     178             :                 }
     179             :         }
     180             : 
     181           0 :         intel_state->visible = false;
     182           0 :         ret = intel_plane->check_plane(plane, crtc_state, intel_state);
     183           0 :         if (ret)
     184           0 :                 return ret;
     185             : 
     186           0 :         return intel_plane_atomic_calc_changes(&crtc_state->base, state);
     187           0 : }
     188             : 
     189           0 : static void intel_plane_atomic_update(struct drm_plane *plane,
     190             :                                       struct drm_plane_state *old_state)
     191             : {
     192           0 :         struct intel_plane *intel_plane = to_intel_plane(plane);
     193             :         struct intel_plane_state *intel_state =
     194           0 :                 to_intel_plane_state(plane->state);
     195             : 
     196           0 :         intel_plane->commit_plane(plane, intel_state);
     197           0 : }
     198             : 
     199             : const struct drm_plane_helper_funcs intel_plane_helper_funcs = {
     200             :         .prepare_fb = intel_prepare_plane_fb,
     201             :         .cleanup_fb = intel_cleanup_plane_fb,
     202             :         .atomic_check = intel_plane_atomic_check,
     203             :         .atomic_update = intel_plane_atomic_update,
     204             : };
     205             : 
     206             : /**
     207             :  * intel_plane_atomic_get_property - fetch plane property value
     208             :  * @plane: plane to fetch property for
     209             :  * @state: state containing the property value
     210             :  * @property: property to look up
     211             :  * @val: pointer to write property value into
     212             :  *
     213             :  * The DRM core does not store shadow copies of properties for
     214             :  * atomic-capable drivers.  This entrypoint is used to fetch
     215             :  * the current value of a driver-specific plane property.
     216             :  */
     217             : int
     218           0 : intel_plane_atomic_get_property(struct drm_plane *plane,
     219             :                                 const struct drm_plane_state *state,
     220             :                                 struct drm_property *property,
     221             :                                 uint64_t *val)
     222             : {
     223             :         DRM_DEBUG_KMS("Unknown plane property '%s'\n", property->name);
     224           0 :         return -EINVAL;
     225             : }
     226             : 
     227             : /**
     228             :  * intel_plane_atomic_set_property - set plane property value
     229             :  * @plane: plane to set property for
     230             :  * @state: state to update property value in
     231             :  * @property: property to set
     232             :  * @val: value to set property to
     233             :  *
     234             :  * Writes the specified property value for a plane into the provided atomic
     235             :  * state object.
     236             :  *
     237             :  * Returns 0 on success, -EINVAL on unrecognized properties
     238             :  */
     239             : int
     240           0 : intel_plane_atomic_set_property(struct drm_plane *plane,
     241             :                                 struct drm_plane_state *state,
     242             :                                 struct drm_property *property,
     243             :                                 uint64_t val)
     244             : {
     245             :         DRM_DEBUG_KMS("Unknown plane property '%s'\n", property->name);
     246           0 :         return -EINVAL;
     247             : }

Generated by: LCOV version 1.13