brcm2708: update linux 4.4 patches to latest version
[oweals/openwrt.git] / target / linux / brcm2708 / patches-4.4 / 0475-drm-vc4-Add-a-getparam-ioctl-for-getting-the-V3D-ide.patch
1 From 03f4e4a6e625306671266db609b4f4d488b6cf6d Mon Sep 17 00:00:00 2001
2 From: Eric Anholt <eric@anholt.net>
3 Date: Fri, 1 Jul 2016 13:10:38 -0700
4 Subject: [PATCH] drm/vc4: Add a getparam ioctl for getting the V3D identity
5  regs.
6
7 As I extend the driver to support different V3D revisions, userspace
8 needs to know what version it's targeting.  This is most easily
9 detected using the V3D identity registers.
10
11 v2: Make sure V3D is runtime PM on when reading the registers.
12 v3: Switch to a 64-bit param value (suggested by Rob Clark in review)
13
14 Signed-off-by: Eric Anholt <eric@anholt.net>
15 Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch> (v2)
16 Reviewed-by: Rob Clark <robdclark@gmail.com> (v3, over irc)
17 (cherry picked from commit af713795c59fea36161a7debf97dbc10bf652cf7)
18
19 v4: Squashed in "drm/vc4: Fix handling of a pm_runtime_get_sync() success case."
20 ---
21  drivers/gpu/drm/vc4/vc4_drv.c | 42 ++++++++++++++++++++++++++++++++++++++++++
22  include/uapi/drm/vc4_drm.h    | 12 ++++++++++++
23  2 files changed, 54 insertions(+)
24
25 --- a/drivers/gpu/drm/vc4/vc4_drv.c
26 +++ b/drivers/gpu/drm/vc4/vc4_drv.c
27 @@ -15,6 +15,7 @@
28  #include <linux/module.h>
29  #include <linux/of_platform.h>
30  #include <linux/platform_device.h>
31 +#include <linux/pm_runtime.h>
32  #include "drm_fb_cma_helper.h"
33  
34  #include "uapi/drm/vc4_drm.h"
35 @@ -64,6 +65,46 @@ void vc4_dump_regs32(const struct debugf
36         }
37  }
38  
39 +static int vc4_get_param_ioctl(struct drm_device *dev, void *data,
40 +                              struct drm_file *file_priv)
41 +{
42 +       struct vc4_dev *vc4 = to_vc4_dev(dev);
43 +       struct drm_vc4_get_param *args = data;
44 +       int ret;
45 +
46 +       if (args->pad != 0)
47 +               return -EINVAL;
48 +
49 +       switch (args->param) {
50 +       case DRM_VC4_PARAM_V3D_IDENT0:
51 +               ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev);
52 +               if (ret < 0)
53 +                       return ret;
54 +               args->value = V3D_READ(V3D_IDENT0);
55 +               pm_runtime_put(&vc4->v3d->pdev->dev);
56 +               break;
57 +       case DRM_VC4_PARAM_V3D_IDENT1:
58 +               ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev);
59 +               if (ret < 0)
60 +                       return ret;
61 +               args->value = V3D_READ(V3D_IDENT1);
62 +               pm_runtime_put(&vc4->v3d->pdev->dev);
63 +               break;
64 +       case DRM_VC4_PARAM_V3D_IDENT2:
65 +               ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev);
66 +               if (ret < 0)
67 +                       return ret;
68 +               args->value = V3D_READ(V3D_IDENT2);
69 +               pm_runtime_put(&vc4->v3d->pdev->dev);
70 +               break;
71 +       default:
72 +               DRM_DEBUG("Unknown parameter %d\n", args->param);
73 +               return -EINVAL;
74 +       }
75 +
76 +       return 0;
77 +}
78 +
79  static void vc4_lastclose(struct drm_device *dev)
80  {
81         struct vc4_dev *vc4 = to_vc4_dev(dev);
82 @@ -95,6 +136,7 @@ static const struct drm_ioctl_desc vc4_d
83         DRM_IOCTL_DEF_DRV(VC4_CREATE_SHADER_BO, vc4_create_shader_bo_ioctl, DRM_RENDER_ALLOW),
84         DRM_IOCTL_DEF_DRV(VC4_GET_HANG_STATE, vc4_get_hang_state_ioctl,
85                           DRM_ROOT_ONLY),
86 +       DRM_IOCTL_DEF_DRV(VC4_GET_PARAM, vc4_get_param_ioctl, DRM_RENDER_ALLOW),
87  };
88  
89  static struct drm_driver vc4_drm_driver = {
90 --- a/include/uapi/drm/vc4_drm.h
91 +++ b/include/uapi/drm/vc4_drm.h
92 @@ -37,6 +37,7 @@ extern "C" {
93  #define DRM_VC4_MMAP_BO                           0x04
94  #define DRM_VC4_CREATE_SHADER_BO                  0x05
95  #define DRM_VC4_GET_HANG_STATE                    0x06
96 +#define DRM_VC4_GET_PARAM                         0x07
97  
98  #define DRM_IOCTL_VC4_SUBMIT_CL           DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_SUBMIT_CL, struct drm_vc4_submit_cl)
99  #define DRM_IOCTL_VC4_WAIT_SEQNO          DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_WAIT_SEQNO, struct drm_vc4_wait_seqno)
100 @@ -45,6 +46,7 @@ extern "C" {
101  #define DRM_IOCTL_VC4_MMAP_BO             DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_MMAP_BO, struct drm_vc4_mmap_bo)
102  #define DRM_IOCTL_VC4_CREATE_SHADER_BO    DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_CREATE_SHADER_BO, struct drm_vc4_create_shader_bo)
103  #define DRM_IOCTL_VC4_GET_HANG_STATE      DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_GET_HANG_STATE, struct drm_vc4_get_hang_state)
104 +#define DRM_IOCTL_VC4_GET_PARAM           DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_GET_PARAM, struct drm_vc4_get_param)
105  
106  struct drm_vc4_submit_rcl_surface {
107         __u32 hindex; /* Handle index, or ~0 if not present. */
108 @@ -280,6 +282,16 @@ struct drm_vc4_get_hang_state {
109         __u32 pad[16];
110  };
111  
112 +#define DRM_VC4_PARAM_V3D_IDENT0               0
113 +#define DRM_VC4_PARAM_V3D_IDENT1               1
114 +#define DRM_VC4_PARAM_V3D_IDENT2               2
115 +
116 +struct drm_vc4_get_param {
117 +       __u32 param;
118 +       __u32 pad;
119 +       __u64 value;
120 +};
121 +
122  #if defined(__cplusplus)
123  }
124  #endif