.. | .. |
---|
100 | 100 | int vc4_perfmon_create_ioctl(struct drm_device *dev, void *data, |
---|
101 | 101 | struct drm_file *file_priv) |
---|
102 | 102 | { |
---|
| 103 | + struct vc4_dev *vc4 = to_vc4_dev(dev); |
---|
103 | 104 | struct vc4_file *vc4file = file_priv->driver_priv; |
---|
104 | 105 | struct drm_vc4_perfmon_create *req = data; |
---|
105 | 106 | struct vc4_perfmon *perfmon; |
---|
106 | 107 | unsigned int i; |
---|
107 | 108 | int ret; |
---|
| 109 | + |
---|
| 110 | + if (!vc4->v3d) { |
---|
| 111 | + DRM_DEBUG("Creating perfmon no VC4 V3D probed\n"); |
---|
| 112 | + return -ENODEV; |
---|
| 113 | + } |
---|
108 | 114 | |
---|
109 | 115 | /* Number of monitored counters cannot exceed HW limits. */ |
---|
110 | 116 | if (req->ncounters > DRM_VC4_MAX_PERF_COUNTERS || |
---|
.. | .. |
---|
117 | 123 | return -EINVAL; |
---|
118 | 124 | } |
---|
119 | 125 | |
---|
120 | | - perfmon = kzalloc(sizeof(*perfmon) + (req->ncounters * sizeof(u64)), |
---|
| 126 | + perfmon = kzalloc(struct_size(perfmon, counters, req->ncounters), |
---|
121 | 127 | GFP_KERNEL); |
---|
122 | 128 | if (!perfmon) |
---|
123 | 129 | return -ENOMEM; |
---|
.. | .. |
---|
146 | 152 | int vc4_perfmon_destroy_ioctl(struct drm_device *dev, void *data, |
---|
147 | 153 | struct drm_file *file_priv) |
---|
148 | 154 | { |
---|
| 155 | + struct vc4_dev *vc4 = to_vc4_dev(dev); |
---|
149 | 156 | struct vc4_file *vc4file = file_priv->driver_priv; |
---|
150 | 157 | struct drm_vc4_perfmon_destroy *req = data; |
---|
151 | 158 | struct vc4_perfmon *perfmon; |
---|
| 159 | + |
---|
| 160 | + if (!vc4->v3d) { |
---|
| 161 | + DRM_DEBUG("Destroying perfmon no VC4 V3D probed\n"); |
---|
| 162 | + return -ENODEV; |
---|
| 163 | + } |
---|
152 | 164 | |
---|
153 | 165 | mutex_lock(&vc4file->perfmon.lock); |
---|
154 | 166 | perfmon = idr_remove(&vc4file->perfmon.idr, req->id); |
---|
.. | .. |
---|
164 | 176 | int vc4_perfmon_get_values_ioctl(struct drm_device *dev, void *data, |
---|
165 | 177 | struct drm_file *file_priv) |
---|
166 | 178 | { |
---|
| 179 | + struct vc4_dev *vc4 = to_vc4_dev(dev); |
---|
167 | 180 | struct vc4_file *vc4file = file_priv->driver_priv; |
---|
168 | 181 | struct drm_vc4_perfmon_get_values *req = data; |
---|
169 | 182 | struct vc4_perfmon *perfmon; |
---|
170 | 183 | int ret; |
---|
171 | 184 | |
---|
| 185 | + if (!vc4->v3d) { |
---|
| 186 | + DRM_DEBUG("Getting perfmon no VC4 V3D probed\n"); |
---|
| 187 | + return -ENODEV; |
---|
| 188 | + } |
---|
| 189 | + |
---|
172 | 190 | mutex_lock(&vc4file->perfmon.lock); |
---|
173 | 191 | perfmon = idr_find(&vc4file->perfmon.idr, req->id); |
---|
174 | 192 | vc4_perfmon_get(perfmon); |
---|