File Index
Files and directories
Sign in
FILE

vkms_colorop.c

File preview with syntax highlighting.

linux-6.19.14/drivers/gpu/drm/vkms/vkms_colorop.c C
  1// SPDX-License-Identifier: GPL-2.0+
  2
  3#include <linux/slab.h>
  4#include <drm/drm_colorop.h>
  5#include <drm/drm_print.h>
  6#include <drm/drm_property.h>
  7#include <drm/drm_plane.h>
  8
  9#include "vkms_drv.h"
 10
 11static const u64 supported_tfs =
 12	BIT(DRM_COLOROP_1D_CURVE_SRGB_EOTF) |
 13	BIT(DRM_COLOROP_1D_CURVE_SRGB_INV_EOTF);
 14
 15#define MAX_COLOR_PIPELINE_OPS 4
 16
 17static int vkms_initialize_color_pipeline(struct drm_plane *plane, struct drm_prop_enum_list *list)
 18{
 19	struct drm_colorop *ops[MAX_COLOR_PIPELINE_OPS];
 20	struct drm_device *dev = plane->dev;
 21	int ret;
 22	int i = 0, j = 0;
 23
 24	memset(ops, 0, sizeof(ops));
 25
 26	/* 1st op: 1d curve */
 27	ops[i] = kzalloc(sizeof(*ops[i]), GFP_KERNEL);
 28	if (!ops[i]) {
 29		drm_err(dev, "KMS: Failed to allocate colorop\n");
 30		ret = -ENOMEM;
 31		goto cleanup;
 32	}
 33
 34	ret = drm_plane_colorop_curve_1d_init(dev, ops[i], plane, supported_tfs,
 35					      DRM_COLOROP_FLAG_ALLOW_BYPASS);
 36	if (ret)
 37		goto cleanup;
 38
 39	list->type = ops[i]->base.id;
 40
 41	i++;
 42
 43	/* 2nd op: 3x4 matrix */
 44	ops[i] = kzalloc(sizeof(*ops[i]), GFP_KERNEL);
 45	if (!ops[i]) {
 46		drm_err(dev, "KMS: Failed to allocate colorop\n");
 47		ret = -ENOMEM;
 48		goto cleanup;
 49	}
 50
 51	ret = drm_plane_colorop_ctm_3x4_init(dev, ops[i], plane, DRM_COLOROP_FLAG_ALLOW_BYPASS);
 52	if (ret)
 53		goto cleanup;
 54
 55	drm_colorop_set_next_property(ops[i - 1], ops[i]);
 56
 57	i++;
 58
 59	/* 3rd op: 3x4 matrix */
 60	ops[i] = kzalloc(sizeof(*ops[i]), GFP_KERNEL);
 61	if (!ops[i]) {
 62		drm_err(dev, "KMS: Failed to allocate colorop\n");
 63		ret = -ENOMEM;
 64		goto cleanup;
 65	}
 66
 67	ret = drm_plane_colorop_ctm_3x4_init(dev, ops[i], plane, DRM_COLOROP_FLAG_ALLOW_BYPASS);
 68	if (ret)
 69		goto cleanup;
 70
 71	drm_colorop_set_next_property(ops[i - 1], ops[i]);
 72
 73	i++;
 74
 75	/* 4th op: 1d curve */
 76	ops[i] = kzalloc(sizeof(*ops[i]), GFP_KERNEL);
 77	if (!ops[i]) {
 78		drm_err(dev, "KMS: Failed to allocate colorop\n");
 79		ret = -ENOMEM;
 80		goto cleanup;
 81	}
 82
 83	ret = drm_plane_colorop_curve_1d_init(dev, ops[i], plane, supported_tfs,
 84					      DRM_COLOROP_FLAG_ALLOW_BYPASS);
 85	if (ret)
 86		goto cleanup;
 87
 88	drm_colorop_set_next_property(ops[i - 1], ops[i]);
 89
 90	list->name = kasprintf(GFP_KERNEL, "Color Pipeline %d", ops[0]->base.id);
 91
 92	return 0;
 93
 94cleanup:
 95	for (j = 0; j < i; j++) {
 96		if (ops[j]) {
 97			drm_colorop_cleanup(ops[j]);
 98			kfree(ops[j]);
 99		}
100	}
101
102	return ret;
103}
104
105int vkms_initialize_colorops(struct drm_plane *plane)
106{
107	struct drm_prop_enum_list pipeline = {};
108	int ret = 0;
109
110	/* Add color pipeline */
111	ret = vkms_initialize_color_pipeline(plane, &pipeline);
112	if (ret)
113		goto out;
114
115	/* Create COLOR_PIPELINE property and attach */
116	ret = drm_plane_create_color_pipeline_property(plane, &pipeline, 1);
117
118	kfree(pipeline.name);
119out:
120	return ret;
121}
~/ Read-only file preview.