summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/amd/dal/display_service/color_temperature.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/dal/display_service/color_temperature.c')
-rw-r--r--drivers/gpu/drm/amd/dal/display_service/color_temperature.c212
1 files changed, 212 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/dal/display_service/color_temperature.c b/drivers/gpu/drm/amd/dal/display_service/color_temperature.c
new file mode 100644
index 000000000000..39b92193635e
--- /dev/null
+++ b/drivers/gpu/drm/amd/dal/display_service/color_temperature.c
@@ -0,0 +1,212 @@
+/*
+ * Copyright 2015 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+#include "dal_services.h"
+
+#include "color_temperature.h"
+
+
+static const struct white_point_entry white_point_table[] = {
+/*001*/ { 1000, 6499, 3474 },
+/*002*/ { 1100, 6361, 3594 },
+/*003*/ { 1200, 6226, 3703 },
+/*004*/ { 1300, 6095, 3801 },
+/*005*/ { 1400, 5966, 3887 },
+/*006*/ { 1500, 5841, 3962 },
+/*007*/ { 1600, 5720, 4025 },
+/*008*/ { 1700, 5601, 4076 },
+/*009*/ { 1800, 5486, 4118 },
+/*010*/ { 1900, 5375, 4150 },
+/*011*/ { 2000, 5267, 4173 },
+/*012*/ { 2100, 5162, 4188 },
+/*013*/ { 2200, 5062, 4196 },
+/*014*/ { 2300, 4965, 4198 },
+/*015*/ { 2400, 4872, 4194 },
+/*016*/ { 2500, 4782, 4186 },
+/*017*/ { 2600, 4696, 4173 },
+/*018*/ { 2700, 4614, 4158 },
+/*019*/ { 2800, 4535, 4139 },
+/*020*/ { 2900, 4460, 4118 },
+/*021*/ { 3000, 4388, 4095 },
+/*022*/ { 3100, 4320, 4070 },
+/*023*/ { 3200, 4254, 4044 },
+/*024*/ { 3300, 4192, 4018 },
+/*025*/ { 3400, 4132, 3990 },
+/*026*/ { 3500, 4075, 3962 },
+/*027*/ { 3600, 4021, 3934 },
+/*028*/ { 3700, 3969, 3905 },
+/*029*/ { 3800, 3919, 3877 },
+/*030*/ { 3900, 3872, 3849 },
+/*031*/ { 4000, 3827, 3820 },
+/*032*/ { 4100, 3784, 3793 },
+/*033*/ { 4200, 3743, 3765 },
+/*034*/ { 4300, 3704, 3738 },
+/*035*/ { 4400, 3666, 3711 },
+/*036*/ { 4500, 3631, 3685 },
+/*037*/ { 4600, 3596, 3659 },
+/*038*/ { 4700, 3563, 3634 },
+/*039*/ { 4800, 3532, 3609 },
+/*040*/ { 4900, 3502, 3585 },
+/*041*/ { 5000, 3473, 3561 },
+/*042*/ { 5100, 3446, 3538 },
+/*043*/ { 5200, 3419, 3516 },
+/*044*/ { 5300, 3394, 3494 },
+/*045*/ { 5400, 3369, 3472 },
+/*046*/ { 5500, 3346, 3451 },
+/*047*/ { 5600, 3323, 3431 },
+/*048*/ { 5700, 3302, 3411 },
+/*049*/ { 5800, 3281, 3392 },
+/*050*/ { 5900, 3261, 3373 },
+/*051*/ { 6000, 3242, 3355 },
+/*052*/ { 6100, 3223, 3337 },
+/*053*/ { 6200, 3205, 3319 },
+/*054*/ { 6300, 3188, 3302 },
+
+/*055*/ { 6400, 3161, 3296 },
+/*056*/ { 6500, 3127, 3290 },
+/*057*/ { 6600, 3126, 3264 },
+/*058*/ { 6700, 3125, 3238 },
+/*059*/ { 6800, 3110, 3224 },
+/*060*/ { 6900, 3097, 3209 },
+/*061*/ { 7000, 3083, 3195 },
+/*062*/ { 7100, 3070, 3181 },
+/*063*/ { 7200, 3058, 3168 },
+/*064*/ { 7300, 3045, 3154 },
+/*065*/ { 7400, 3034, 3142 },
+/*066*/ { 7500, 3022, 3129 },
+/*067*/ { 7600, 3011, 3117 },
+/*068*/ { 7700, 3000, 3105 },
+/*069*/ { 7800, 2990, 3094 },
+/*070*/ { 7900, 2980, 3082 },
+/*071*/ { 8000, 2970, 3071 },
+/*072*/ { 8100, 2961, 3061 },
+/*073*/ { 8200, 2952, 3050 },
+/*074*/ { 8300, 2943, 3040 },
+/*075*/ { 8400, 2934, 3030 },
+/*076*/ { 8500, 2926, 3020 },
+/*077*/ { 8600, 2917, 3011 },
+/*078*/ { 8700, 2910, 3001 },
+/*079*/ { 8800, 2902, 2992 },
+/*080*/ { 8900, 2894, 2983 },
+/*081*/ { 9000, 2887, 2975 },
+/*082*/ { 9100, 2880, 2966 },
+/*083*/ { 9200, 2873, 2958 },
+/*084*/ { 9300, 2866, 2950 },
+/*085*/ { 9400, 2860, 2942 },
+/*086*/ { 9500, 2853, 2934 },
+/*087*/ { 9600, 2847, 2927 },
+/*088*/ { 9700, 2841, 2919 },
+/*089*/ { 9800, 2835, 2912 },
+/*090*/ { 9900, 2829, 2905 },
+/*091*/ { 10000, 2824, 2898 },
+};
+
+bool dal_color_temperature_find_white_point(
+ int32_t request_temperature,
+ struct white_point_data *data)
+{
+ bool ret = false;
+ struct white_point_entry entry;
+
+ if (request_temperature > 0) {
+ ret =
+ dal_color_temperature_search_white_point_table(
+ request_temperature,
+ &entry);
+ if (ret == true) {
+ data->white_x = entry.dx;
+ data->white_y = entry.dy;
+ }
+ }
+ return ret;
+}
+
+bool dal_color_temperature_search_white_point_table(
+ uint32_t temp_to_find,
+ struct white_point_entry *entry)
+{
+ bool ret = false;
+ const struct white_point_entry *p;
+ uint32_t const_size;
+
+ const_size = ARRAY_SIZE(white_point_table);
+
+ for (p = white_point_table; p < &white_point_table[const_size]; p++) {
+ if (p->temperature == temp_to_find) {
+ *entry = *p;
+ ret = true;
+ break;
+ }
+ }
+ return ret;
+}
+
+bool dal_color_temperature_find_color_temperature(
+ struct white_point_data *data,
+ int32_t *temperature,
+ bool *exact_match)
+{
+ bool ret = false;
+ const struct white_point_entry *p;
+ const struct white_point_entry *next;
+ const struct white_point_entry *foundx = NULL;
+ uint32_t const_size;
+
+ const_size = ARRAY_SIZE(white_point_table);
+
+ for (p = white_point_table; p < &white_point_table[const_size]; p++) {
+ if (p->dx == data->white_x && p->dy == data->white_y) {
+ *temperature = p->temperature;
+ *exact_match = true;
+ ret = true;
+ break;
+ }
+ }
+
+ if (ret == false) {
+ for (p = white_point_table;
+ p < &white_point_table[const_size]; p++) {
+ next = p + 1;
+ if (p->dx >= data->white_x &&
+ next->dx <= data->white_x) {
+ foundx = p;
+ *exact_match = false;
+ ret = true;
+ break;
+ }
+ if (foundx != NULL)
+ *temperature = foundx->temperature;
+ }
+
+ }
+ if (ret == false) {
+ /* no such color temperature */
+ /* give default and investigate because
+ * it would be annoying for CCC */
+ *temperature = 6500;
+ ret = true;
+ }
+ return ret;
+}