|
64 | 64 |
|
65 | 65 | static const struct drm_prop_enum_list drm_colorop_type_enum_list[] = { |
66 | 66 | { DRM_COLOROP_1D_CURVE, "1D Curve" }, |
| 67 | + { DRM_COLOROP_CTM_3X4, "3x4 Matrix"}, |
67 | 68 | }; |
68 | 69 |
|
69 | 70 | static const char * const colorop_curve_1d_type_names[] = { |
@@ -147,6 +148,11 @@ void drm_colorop_cleanup(struct drm_colorop *colorop) |
147 | 148 | list_del(&colorop->head); |
148 | 149 | config->num_colorop--; |
149 | 150 |
|
| 151 | + if (colorop->state && colorop->state->data) { |
| 152 | + drm_property_blob_put(colorop->state->data); |
| 153 | + colorop->state->data = NULL; |
| 154 | + } |
| 155 | + |
150 | 156 | kfree(colorop->state); |
151 | 157 | } |
152 | 158 | EXPORT_SYMBOL(drm_colorop_cleanup); |
@@ -236,11 +242,51 @@ int drm_plane_colorop_curve_1d_init(struct drm_device *dev, struct drm_colorop * |
236 | 242 | } |
237 | 243 | EXPORT_SYMBOL(drm_plane_colorop_curve_1d_init); |
238 | 244 |
|
| 245 | +static int drm_colorop_create_data_prop(struct drm_device *dev, struct drm_colorop *colorop) |
| 246 | +{ |
| 247 | + struct drm_property *prop; |
| 248 | + |
| 249 | + /* data */ |
| 250 | + prop = drm_property_create(dev, DRM_MODE_PROP_ATOMIC | DRM_MODE_PROP_BLOB, |
| 251 | + "DATA", 0); |
| 252 | + if (!prop) |
| 253 | + return -ENOMEM; |
| 254 | + |
| 255 | + colorop->data_property = prop; |
| 256 | + drm_object_attach_property(&colorop->base, |
| 257 | + colorop->data_property, |
| 258 | + 0); |
| 259 | + |
| 260 | + return 0; |
| 261 | +} |
| 262 | + |
| 263 | +int drm_plane_colorop_ctm_3x4_init(struct drm_device *dev, struct drm_colorop *colorop, |
| 264 | + struct drm_plane *plane) |
| 265 | +{ |
| 266 | + int ret; |
| 267 | + |
| 268 | + ret = drm_plane_colorop_init(dev, colorop, plane, DRM_COLOROP_CTM_3X4); |
| 269 | + if (ret) |
| 270 | + return ret; |
| 271 | + |
| 272 | + ret = drm_colorop_create_data_prop(dev, colorop); |
| 273 | + if (ret) |
| 274 | + return ret; |
| 275 | + |
| 276 | + drm_colorop_reset(colorop); |
| 277 | + |
| 278 | + return 0; |
| 279 | +} |
| 280 | +EXPORT_SYMBOL(drm_plane_colorop_ctm_3x4_init); |
| 281 | + |
239 | 282 | static void __drm_atomic_helper_colorop_duplicate_state(struct drm_colorop *colorop, |
240 | 283 | struct drm_colorop_state *state) |
241 | 284 | { |
242 | 285 | memcpy(state, colorop->state, sizeof(*state)); |
243 | 286 |
|
| 287 | + if (state->data) |
| 288 | + drm_property_blob_get(state->data); |
| 289 | + |
244 | 290 | state->bypass = true; |
245 | 291 | } |
246 | 292 |
|
@@ -321,6 +367,7 @@ void drm_colorop_reset(struct drm_colorop *colorop) |
321 | 367 |
|
322 | 368 | static const char * const colorop_type_name[] = { |
323 | 369 | [DRM_COLOROP_1D_CURVE] = "1D Curve", |
| 370 | + [DRM_COLOROP_CTM_3X4] = "3x4 Matrix", |
324 | 371 | }; |
325 | 372 |
|
326 | 373 | const char *drm_get_colorop_type_name(enum drm_colorop_type type) |
|
0 commit comments