| .. | .. |
|---|
| 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); |
|---|