drm/rockchip: add plane feature scale and alpha
authorMark Yao <mark.yao@rock-chips.com>
Tue, 2 Aug 2016 07:40:53 +0000 (15:40 +0800)
committerGerrit Code Review <gerrit@rock-chips.com>
Thu, 11 Aug 2016 08:02:06 +0000 (16:02 +0800)
Change-Id: I64b89e616ff9f2059df38a7f9995ff98e670104a
Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
drivers/gpu/drm/rockchip/rockchip_drm_vop.c
include/uapi/drm/rockchip_drm.h

index 4205c68a96239c519b9f2f9a043097c1abca7c54..86c964ece09ff121358a14fdeeb877f64eff4eaa 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/reset.h>
 #include <linux/delay.h>
 #include <linux/sort.h>
 #include <linux/reset.h>
 #include <linux/delay.h>
 #include <linux/sort.h>
+#include <uapi/drm/rockchip_drm.h>
 
 #include "rockchip_drm_drv.h"
 #include "rockchip_drm_gem.h"
 
 #include "rockchip_drm_drv.h"
 #include "rockchip_drm_gem.h"
@@ -153,6 +154,7 @@ struct vop {
        struct device *dev;
        struct drm_device *drm_dev;
        struct drm_property *plane_zpos_prop;
        struct device *dev;
        struct drm_device *drm_dev;
        struct drm_property *plane_zpos_prop;
+       struct drm_property *plane_feature_prop;
        bool is_iommu_enabled;
        bool is_iommu_needed;
 
        bool is_iommu_enabled;
        bool is_iommu_needed;
 
@@ -1398,6 +1400,7 @@ static int vop_plane_init(struct vop *vop, struct vop_win *win,
        struct drm_plane *share = NULL;
        unsigned int rotations = 0;
        struct drm_property *prop;
        struct drm_plane *share = NULL;
        unsigned int rotations = 0;
        struct drm_property *prop;
+       uint64_t feature = 0;
        int ret;
 
        if (win->parent)
        int ret;
 
        if (win->parent)
@@ -1432,6 +1435,14 @@ static int vop_plane_init(struct vop *vop, struct vop_win *win,
                                           BIT(DRM_ROTATE_0));
                win->rotation_prop = prop;
        }
                                           BIT(DRM_ROTATE_0));
                win->rotation_prop = prop;
        }
+       if (win->phy->scl)
+               feature |= BIT(ROCKCHIP_DRM_PLANE_FEATURE_SCALE);
+       if (VOP_WIN_SUPPORT(vop, win, src_alpha_ctl) ||
+           VOP_WIN_SUPPORT(vop, win, alpha_en))
+               feature |= BIT(ROCKCHIP_DRM_PLANE_FEATURE_ALPHA);
+
+       drm_object_attach_property(&win->base.base, vop->plane_feature_prop,
+                                  feature);
 
        return 0;
 }
 
        return 0;
 }
@@ -1554,6 +1565,10 @@ static int vop_win_init(struct vop *vop)
        unsigned int i, j;
        unsigned int num_wins = 0;
        struct drm_property *prop;
        unsigned int i, j;
        unsigned int num_wins = 0;
        struct drm_property *prop;
+       static const struct drm_prop_enum_list props[] = {
+               { ROCKCHIP_DRM_PLANE_FEATURE_SCALE, "scale" },
+               { ROCKCHIP_DRM_PLANE_FEATURE_ALPHA, "alpha" },
+       };
 
        for (i = 0; i < vop_data->win_size; i++) {
                struct vop_win *vop_win = &vop->win[num_wins];
 
        for (i = 0; i < vop_data->win_size; i++) {
                struct vop_win *vop_win = &vop->win[num_wins];
@@ -1599,6 +1614,16 @@ static int vop_win_init(struct vop *vop)
        }
        vop->plane_zpos_prop = prop;
 
        }
        vop->plane_zpos_prop = prop;
 
+       vop->plane_feature_prop = drm_property_create_bitmask(vop->drm_dev,
+                               DRM_MODE_PROP_IMMUTABLE, "FEATURE",
+                               props, ARRAY_SIZE(props),
+                               BIT(ROCKCHIP_DRM_PLANE_FEATURE_SCALE) |
+                               BIT(ROCKCHIP_DRM_PLANE_FEATURE_ALPHA));
+       if (!vop->plane_feature_prop) {
+               DRM_ERROR("failed to create feature property\n");
+               return -EINVAL;
+       }
+
        return 0;
 }
 
        return 0;
 }
 
index 1dae92e6d0d29e56eefcac59032be5499832319e..133d423866e21b4fc7f3e882ed5fb261a7b1a183 100644 (file)
@@ -98,6 +98,12 @@ struct drm_rockchip_rga_exec {
        __u64           async;
 };
 
        __u64           async;
 };
 
+enum rockchip_plane_feture {
+       ROCKCHIP_DRM_PLANE_FEATURE_SCALE,
+       ROCKCHIP_DRM_PLANE_FEATURE_ALPHA,
+       ROCKCHIP_DRM_PLANE_FEATURE_MAX,
+};
+
 #define DRM_ROCKCHIP_GEM_CREATE                0x00
 #define DRM_ROCKCHIP_GEM_MAP_OFFSET    0x01
 #define DRM_ROCKCHIP_GEM_CPU_ACQUIRE   0x02
 #define DRM_ROCKCHIP_GEM_CREATE                0x00
 #define DRM_ROCKCHIP_GEM_MAP_OFFSET    0x01
 #define DRM_ROCKCHIP_GEM_CPU_ACQUIRE   0x02