drm/i915: skylake scaler structure definitions
authorChandra Konduru <chandra.konduru@intel.com>
Tue, 7 Apr 2015 22:28:36 +0000 (15:28 -0700)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 13 Apr 2015 09:30:05 +0000 (11:30 +0200)
skylake scaler structure definitions. scalers live in crtc_state as
they are pipe resources. They can be used either as plane scaler or
panel fitter.

scaler assigned to either plane (for plane scaling) or crtc (for panel
fitting) is saved in scaler_id in plane_state or crtc_state respectively.

scaler_id is used instead of scaler pointer in plane or crtc state
to avoid updating scaler pointer everytime a new crtc_state is created.

v2:
-made single copy of min/max values for scalers (Matt)

v3:
-updated commentary for scaler_id (me)

v4:
-converted src/dst ranges to #defines, dropped ratios (Matt)

Signed-off-by: Chandra Konduru <chandra.konduru@intel.com>
Reviewed-by: Matt Roper <matthew.d.roper@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/intel_drv.h

index 638024fcc8ffdfd5bc87bdca0e6ad0f49c904e93..40112751ca6eb812d4e6e155669dd04c2e7bc70d 100644 (file)
@@ -256,6 +256,26 @@ struct intel_plane_state {
         * enable/disable the primary plane
         */
        bool hides_primary;
+
+       /*
+        * scaler_id
+        *    = -1 : not using a scaler
+        *    >=  0 : using a scalers
+        *
+        * plane requiring a scaler:
+        *   - During check_plane, its bit is set in
+        *     crtc_state->scaler_state.scaler_users by calling helper function
+        *     update_scaler_users.
+        *   - scaler_id indicates the scaler it got assigned.
+        *
+        * plane doesn't require a scaler:
+        *   - this can happen when scaling is no more required or plane simply
+        *     got disabled.
+        *   - During check_plane, corresponding bit is reset in
+        *     crtc_state->scaler_state.scaler_users by calling helper function
+        *     update_scaler_users.
+        */
+       int scaler_id;
 };
 
 struct intel_initial_plane_config {
@@ -265,6 +285,49 @@ struct intel_initial_plane_config {
        u32 base;
 };
 
+#define SKL_MIN_SRC_W 8
+#define SKL_MAX_SRC_W 4096
+#define SKL_MIN_SRC_H 8
+#define SKL_MAX_SRC_H 2304
+#define SKL_MIN_DST_W 8
+#define SKL_MAX_DST_W 4096
+#define SKL_MIN_DST_H 8
+#define SKL_MAX_DST_H 2304
+
+struct intel_scaler {
+       int id;
+       int in_use;
+       uint32_t mode;
+};
+
+struct intel_crtc_scaler_state {
+#define SKL_NUM_SCALERS 2
+       struct intel_scaler scalers[SKL_NUM_SCALERS];
+
+       /*
+        * scaler_users: keeps track of users requesting scalers on this crtc.
+        *
+        *     If a bit is set, a user is using a scaler.
+        *     Here user can be a plane or crtc as defined below:
+        *       bits 0-30 - plane (bit position is index from drm_plane_index)
+        *       bit 31    - crtc
+        *
+        * Instead of creating a new index to cover planes and crtc, using
+        * existing drm_plane_index for planes which is well less than 31
+        * planes and bit 31 for crtc. This should be fine to cover all
+        * our platforms.
+        *
+        * intel_atomic_setup_scalers will setup available scalers to users
+        * requesting scalers. It will gracefully fail if request exceeds
+        * avilability.
+        */
+#define SKL_CRTC_INDEX 31
+       unsigned scaler_users;
+
+       /* scaler used by crtc for panel fitting purpose */
+       int scaler_id;
+};
+
 struct intel_crtc_state {
        struct drm_crtc_state base;
 
@@ -391,6 +454,8 @@ struct intel_crtc_state {
 
        bool dp_encoder_is_mst;
        int pbn;
+
+       struct intel_crtc_scaler_state scaler_state;
 };
 
 struct intel_pipe_wm {
@@ -492,6 +557,9 @@ struct intel_crtc {
        struct intel_mmio_flip mmio_flip;
 
        struct intel_crtc_atomic_commit atomic;
+
+       /* scalers available on this crtc */
+       int num_scalers;
 };
 
 struct intel_plane_wm_parameters {