[COMMON] video: hdr: add tunable parameters for HDR
authorCho KyongHo <pullip.cho@samsung.com>
Thu, 12 Oct 2017 08:03:25 +0000 (17:03 +0900)
committerSeungchul Kim <sc377.kim@samsung.com>
Mon, 28 May 2018 05:27:51 +0000 (14:27 +0900)
It is required to tune HDR LUT values during runtime because the
quality of HDR processing is measured on the display of DUT. It means
that some LUT values including LUTs of tone mapping might need to be
tunned if the display controller or LCD is changed.

Change-Id: Ic927345a25f6b2d45d7be9de47f2a0574514ff64
Signed-off-by: Cho KyongHo <pullip.cho@samsung.com>
drivers/gpu/exynos/Kconfig
drivers/gpu/exynos/Makefile
drivers/gpu/exynos/hdr_tunables.c [new file with mode: 0644]
include/video/exynos_hdr_tunables.h [new file with mode: 0644]

index e9bf19f4f52eaea7de13ce1056bab0a2dbb6be2b..8dd2387b8cdb1f47f3a92ec87598f3a726de0155 100644 (file)
@@ -1,3 +1,15 @@
+
+config EXYNOS_HDR_TUNABLE_TONEMAPPING
+       bool "HDR Tuneable debugfs nodes for Tone mapping"
+       ---help---
+         Creates hdr/tm_x and hdr/tm_y nodes under debugfs for overriding the
+         tone mapping LUT coefficients configured in G2D and DPU with the
+         values stored in the nodes. Configuring 33 integer values to both
+         nodes immediately replaces the tone mapping LUT coefficients used by
+         G2D and DPU. Writing 0 to one of both nodes stops overriding.
+
+         This is just for display tunning purpose only for HDR videos.
+
 menu "Exynos Graphic Devices"
 source "drivers/gpu/exynos/g2d/Kconfig"
 endmenu
index a00af4e1b64c0de66f51eaf302712184ff93f8d0..d5e3b24f167956af10d27fd1f1fd99f9006818fb 100644 (file)
@@ -1 +1,2 @@
+obj-$(CONFIG_EXYNOS_HDR_TUNABLE_TONEMAPPING) += hdr_tunables.o
 obj-$(CONFIG_EXYNOS_GRAPHICS_G2D) += g2d/
diff --git a/drivers/gpu/exynos/hdr_tunables.c b/drivers/gpu/exynos/hdr_tunables.c
new file mode 100644 (file)
index 0000000..891f732
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * linux/drivers/gpu/exynos/hdr_tunables.c
+ *
+ * Copyright (C) 2017 Samsung Electronics Co., Ltd.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ */
+
+#include <linux/module.h>
+#include <linux/stat.h>
+
+#include <video/exynos_hdr_tunables.h>
+
+static unsigned int nr_tm_lut_x_values = NR_TM_LUT_VALUES;
+static unsigned int nr_tm_lut_y_values = NR_TM_LUT_VALUES;
+
+static uint tm_lut_x[NR_TM_LUT_VALUES];
+static uint tm_lut_y[NR_TM_LUT_VALUES];
+static uint tm_override_enable;
+
+int exynos_hdr_get_tm_lut_xy(u32 lut_x[], u32 lut_y[])
+{
+       int i;
+
+       if (!tm_override_enable)
+               return 0;
+
+       for (i = 0; i < nr_tm_lut_x_values; i++)
+               lut_x[i] = tm_lut_x[i] & 0x3FFF;
+       for (; i < NR_TM_LUT_VALUES; i++)
+               lut_x[i] = 0;
+
+       for (i = 0; i < nr_tm_lut_y_values; i++)
+               lut_y[i] = tm_lut_y[i] & 0xFFF;
+       for (; i < NR_TM_LUT_VALUES; i++)
+               lut_y[i] = 0;
+
+       return NR_TM_LUT_VALUES;
+}
+
+int exynos_hdr_get_tm_lut(u32 lut[])
+{
+       int i = 0;
+
+       if (!tm_override_enable)
+               return 0;
+
+       for (i = 0; i < nr_tm_lut_x_values; i++)
+               lut[i] = tm_lut_x[i] & 0x3FFF;
+       for (; i < NR_TM_LUT_VALUES; i++)
+               lut[i] = 0;
+
+       for (i = 0; i < nr_tm_lut_y_values; i++)
+               lut[i] |= (tm_lut_y[i] & 0xFFF) << 16;
+
+       return NR_TM_LUT_VALUES;
+}
+
+module_param_array(tm_lut_x, uint, &nr_tm_lut_x_values, 0644);
+module_param_array(tm_lut_y, uint, &nr_tm_lut_y_values, 0644);
+module_param(tm_override_enable, uint, 0644);
diff --git a/include/video/exynos_hdr_tunables.h b/include/video/exynos_hdr_tunables.h
new file mode 100644 (file)
index 0000000..35687aa
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef _LINUX_EXYNOS_HDR_TUNABLES_H
+#define _LINUX_EXYNOS_HDR_TUNABLES_H
+
+#include <linux/types.h>
+
+#define NR_TM_LUT_VALUES 33
+
+#ifdef CONFIG_EXYNOS_HDR_TUNABLE_TONEMAPPING
+int exynos_hdr_get_tm_lut_xy(u32 lut_x[], u32 lut_y[]);
+int exynos_hdr_get_tm_lut(u32 lut[]);
+#else
+static inline int exynos_hdr_get_tm_lut_xy(u32 lut_x[], u32 lut_y[])
+{
+       return 0;
+}
+static inline int exynos_hdr_get_tm_lut(u32 lut[])
+{
+       return 0;
+}
+#endif
+
+#endif /* _LINUX_EXYNOS_HDR_TUNABLES_H */