hdr_prime: add interface of HDR Prime SL driver [1/1]
authorYi Zhou <yi.zhou@amlogic.com>
Thu, 7 Mar 2019 08:12:38 +0000 (16:12 +0800)
committerJianxin Pan <jianxin.pan@amlogic.com>
Sun, 21 Apr 2019 11:51:13 +0000 (04:51 -0700)
PD#SWPL-5475

Problem:
need to add interface of HDR Prime SL driver

Solution:
add interface of HDR Prime SL driver

Verify:
U212

Change-Id: If0e62b74ccbaa4ede490e7a9896d9f5915480d6f
Signed-off-by: Yi Zhou <yi.zhou@amlogic.com>
17 files changed:
MAINTAINERS
arch/arm/boot/dts/amlogic/mesong12a.dtsi
arch/arm/boot/dts/amlogic/mesong12b.dtsi
arch/arm/configs/meson64_a32_defconfig
arch/arm/configs/meson64_a32_smarthome_defconfig
arch/arm64/boot/dts/amlogic/mesong12a.dtsi
arch/arm64/boot/dts/amlogic/mesong12b.dtsi
arch/arm64/configs/meson64_defconfig
arch/arm64/configs/meson64_smarthome_defconfig
drivers/amlogic/media/enhancement/Kconfig
drivers/amlogic/media/enhancement/Makefile
drivers/amlogic/media/enhancement/amprime_sl/Kconfig [new file with mode: 0644]
drivers/amlogic/media/enhancement/amprime_sl/Makefile [new file with mode: 0644]
drivers/amlogic/media/enhancement/amprime_sl/amprime_sl.c [new file with mode: 0644]
drivers/amlogic/media/enhancement/amprime_sl/amprime_sl.h [new file with mode: 0644]
drivers/amlogic/media/enhancement/amprime_sl/amprime_sl_hw.c [new file with mode: 0644]
include/linux/amlogic/media/amprime_sl/prime_sl.h [new file with mode: 0644]

index b13ad54..d12b29e 100644 (file)
@@ -13922,6 +13922,7 @@ F:      drivers/amlogic/media/enhancement/amvecm/arch/*
 F:     drivers/amlogic/media/enhancement/amvecm/dnlp_algorithm/*
 F:     include/linux/amlogic/media/amvecm/*
 F:     drivers/amlogic/media/enhancement/amvecm/hdr/*
+F:      drivers/amlogic/media/enhancement/amvecm/amprime_sl/*
 
 AMLOGIC GXL ADD SKT DTS
 M: Yun Cai <yun.cai@amlogic.com>
@@ -14438,6 +14439,11 @@ M:     Zhilei Wu <zhilei.wu@amlogic.com>
 F:     drivers/amlogic/media/enhancement/amdolby_vision*
 F:     include/linux/amlogic/media/amdolbyvision/*
 
+AMLOGIC HDR PRIMSE SL DRIVER
+M:      Yi Zhou <yi.zhou@amlogic.com>
+F:      drivers/amlogic/media/enhancement/amprime_sl/*
+F:      include/linux/amlogic/media/amprime_sl/*
+
 AMLOGIC G12A Media codec io bus
 M:     Nanxin Qin <nanxin.qin@amlogic.com>
 F:     include/linux/amlogic/media/registers/regs/efuse_regs.h
index 60e6843..d926815 100644 (file)
                };
        };
 
+       amprime_sl:amprime_sl {
+               compatible = "amlogic, prime_sl_g12";
+               dev_name = "amprime_sl";
+               status = "disabled";
+       };
+
        aocec: aocec {
                compatible = "amlogic, aocec-g12a";
                device_name = "aocec";
index 09a8c85..0864c6f 100644 (file)
                };
        };
 
+       amprime_sl:amprime_sl {
+               compatible = "amlogic, prime_sl_g12";
+               dev_name = "amprime_sl";
+               status = "disabled";
+       };
+
        galcore {
                compatible = "amlogic, galcore";
                dev_name = "galcore";
index d61b4fb..9e89e68 100644 (file)
@@ -330,6 +330,7 @@ CONFIG_AMLOGIC_VIDEOSYNC=y
 CONFIG_AMLOGIC_MEDIA_ENHANCEMENT=y
 CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_VECM=y
 CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_DOLBYVISION=y
+CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_PRIME_SL=y
 CONFIG_AMLOGIC_MEDIA_GDC=y
 CONFIG_AMLOGIC_VIDEO_CAPTURE=y
 CONFIG_AMLOGIC_VM_DISABLE_VIDEOLAYER=y
index 151ec43..8705513 100644 (file)
@@ -294,6 +294,7 @@ CONFIG_AMLOGIC_IONVIDEO=y
 CONFIG_AMLOGIC_MEDIA_ENHANCEMENT=y
 CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_VECM=y
 CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_DOLBYVISION=y
+CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_PRIME_SL=y
 CONFIG_AMLOGIC_MMC=y
 CONFIG_AMLOGIC_NAND=y
 CONFIG_AMLOGIC_VRTC=y
index 6c4153a..6ce90d7 100644 (file)
                };
        };
 
+       amprime_sl: amprime_sl {
+               compatible = "amlogic, prime_sl_g12";
+               dev_name = "amprime_sl";
+               status = "disabled";
+       };
+
        aocec: aocec {
                compatible = "amlogic, aocec-g12a";
                device_name = "aocec";
index 498efe7..a0f4a08 100644 (file)
                };
        };
 
+       amprime_sl: amprime_sl {
+               compatible = "amlogic, prime_sl_g12";
+               dev_name = "amprime_sl";
+               status = "disabled";
+       };
+
        galcore {
                compatible = "amlogic, galcore";
                dev_name = "galcore";
index 18a902f..9f91641 100644 (file)
@@ -325,6 +325,7 @@ CONFIG_AMLOGIC_VIDEOSYNC=y
 CONFIG_AMLOGIC_MEDIA_ENHANCEMENT=y
 CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_VECM=y
 CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_DOLBYVISION=y
+CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_PRIME_SL=y
 CONFIG_AMLOGIC_MEDIA_GDC=y
 CONFIG_AMLOGIC_VIDEO_CAPTURE=y
 CONFIG_AMLOGIC_VM_DISABLE_VIDEOLAYER=y
index fa8fc81..b88827d 100644 (file)
@@ -284,6 +284,7 @@ CONFIG_AMLOGIC_VIDEOSYNC=y
 CONFIG_AMLOGIC_MEDIA_ENHANCEMENT=y
 CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_VECM=y
 CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_DOLBYVISION=y
+CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_PRIME_SL=y
 CONFIG_AMLOGIC_MMC=y
 CONFIG_AMLOGIC_NAND=y
 CONFIG_AMLOGIC_VRTC=y
index d4c4237..9d1075b 100644 (file)
@@ -12,6 +12,7 @@ config AMLOGIC_MEDIA_ENHANCEMENT
 if AMLOGIC_MEDIA_ENHANCEMENT
 source "drivers/amlogic/media/enhancement/amvecm/Kconfig"
 source "drivers/amlogic/media/enhancement/amdolby_vision/Kconfig"
+source "drivers/amlogic/media/enhancement/amprime_sl/Kconfig"
 endif
 
 endmenu
index b5e365f..5a53ee3 100644 (file)
@@ -1,2 +1,3 @@
-obj-$(CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_VECM)   +=      amvecm/
-obj-$(CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_DOLBYVISION)            += amdolby_vision/
\ No newline at end of file
+obj-$(CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_VECM)           += amvecm/
+obj-$(CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_DOLBYVISION)    += amdolby_vision/
+obj-$(CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_PRIME_SL)       += amprime_sl/
diff --git a/drivers/amlogic/media/enhancement/amprime_sl/Kconfig b/drivers/amlogic/media/enhancement/amprime_sl/Kconfig
new file mode 100644 (file)
index 0000000..10dc179
--- /dev/null
@@ -0,0 +1,15 @@
+#
+# AMLOGIC amprime_sl devices configuration
+#
+
+comment "Amlogic amprime_sl Drivers"
+
+menu "Amlogic amprime_sl Driver"
+
+config AMLOGIC_MEDIA_ENHANCEMENT_PRIME_SL
+        bool "Amlogic amprime_sl driver"
+        default n
+        help
+                "Amlogic amprime_sl module init"
+
+endmenu
diff --git a/drivers/amlogic/media/enhancement/amprime_sl/Makefile b/drivers/amlogic/media/enhancement/amprime_sl/Makefile
new file mode 100644 (file)
index 0000000..97fbaf3
--- /dev/null
@@ -0,0 +1,7 @@
+#
+# Makefile for amprime_sl
+#
+
+obj-$(CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_PRIME_SL) += amprime_sl.o amprime_sl_hw.o
+
+
diff --git a/drivers/amlogic/media/enhancement/amprime_sl/amprime_sl.c b/drivers/amlogic/media/enhancement/amprime_sl/amprime_sl.c
new file mode 100644 (file)
index 0000000..79ebfc7
--- /dev/null
@@ -0,0 +1,511 @@
+/*
+ * drivers/amlogic/media/enhancement/amprime_sl/amprime_sl.c
+ *
+ * Copyright (C) 2017 Amlogic, Inc. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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/types.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/fs.h>
+#include <linux/uaccess.h>
+#include <linux/io.h>
+#include <linux/errno.h>
+#include <linux/dma-mapping.h>
+#include <linux/platform_device.h>
+#include <linux/amlogic/media/vfm/vframe.h>
+#include <linux/amlogic/media/video_sink/video.h>
+#include <linux/amlogic/media/amvecm/amvecm.h>
+#include <linux/amlogic/media/vout/vout_notify.h>
+#include <linux/amlogic/media/vfm/vframe_provider.h>
+#include <linux/amlogic/media/vfm/vframe_receiver.h>
+#include <linux/amlogic/media/utils/amstream.h>
+#include <linux/amlogic/media/registers/regs/viu_regs.h>
+#include <linux/cma.h>
+#include <linux/amlogic/media/codec_mm/codec_mm.h>
+#include <linux/dma-contiguous.h>
+#include <linux/amlogic/iomap.h>
+#include <linux/device.h>
+#include <linux/cdev.h>
+#include <linux/of.h>
+#include <linux/string.h>
+#include <linux/mm.h>
+#include <linux/slab.h>
+#include <linux/stat.h>
+#include <linux/ctype.h>
+#include <linux/string.h>
+#include <linux/vmalloc.h>
+
+#include "amprime_sl.h"
+#include <linux/amlogic/cpu_version.h>
+#include <linux/amlogic/media/amprime_sl/prime_sl.h>
+
+/*======================================*/
+
+static const struct hdr_prime_sl_func_s *p_funcs;
+struct prime_sl_device_data_s prime_sl_meson_dev;
+#define AMPRIME_SL_NAME               "amprime_sl"
+#define AMPRIME_SL_CLASS_NAME         "amprime_sl"
+
+struct amprime_sl_dev_s {
+       dev_t                       devt;
+       struct cdev                 cdev;
+       dev_t                       devno;
+       struct device               *dev;
+       struct class                *clsp;
+};
+static struct amprime_sl_dev_s amprime_sl_dev;
+static struct prime_t prime_sl_setting;
+
+static uint prime_sl_enable = DISABLE;
+module_param(prime_sl_enable, uint, 0664);
+MODULE_PARM_DESC(prime_sl_enable, "\n prime_sl_enable\n");
+
+static uint prime_sl_display_Brightness = 150;
+module_param(prime_sl_display_Brightness, uint, 0664);
+MODULE_PARM_DESC(prime_sl_display_Brightness, "\n prime_sl_display_Brightness\n");
+
+bool is_prime_sl_enable(void)
+{
+       return prime_sl_enable;
+}
+EXPORT_SYMBOL(is_prime_sl_enable);
+
+static int parse_para(char *p)
+{
+       int data;
+
+       data = cpu_to_le32((unsigned int)(*p));
+       *p += 4;
+       return data;
+}
+
+static int prime_sl_parse_sei_and_meta(char *p, unsigned int size)
+{
+       unsigned int i;
+       struct sl_hdr_metadata *sl_hdr_metadata
+               = &prime_sl_setting.prime_metadata;
+
+       if (size != sizeof(struct sl_hdr_metadata)) {
+               pr_info("error metadata size\n");
+               return 0;
+       }
+
+       sl_hdr_metadata->partID = parse_para(p);
+       sl_hdr_metadata->majorSpecVersionID = parse_para(p);
+       sl_hdr_metadata->minorSpecVersionID = parse_para(p);
+       sl_hdr_metadata->payloadMode = parse_para(p);
+       sl_hdr_metadata->hdrPicColourSpace = parse_para(p);
+       sl_hdr_metadata->hdrDisplayColourSpace = parse_para(p);
+       sl_hdr_metadata->hdrDisplayMaxLuminance = parse_para(p);
+       sl_hdr_metadata->hdrDisplayMinLuminance = parse_para(p);
+       sl_hdr_metadata->sdrPicColourSpace = parse_para(p);
+       sl_hdr_metadata->sdrDisplayColourSpace = parse_para(p);
+       sl_hdr_metadata->sdrDisplayMaxLuminance = parse_para(p);
+       sl_hdr_metadata->sdrDisplayMinLuminance = parse_para(p);
+       for (i = 0; i < 4; i++)
+               sl_hdr_metadata->matrixCoefficient[i] = parse_para(p);
+       for (i = 0; i < 2; i++)
+               sl_hdr_metadata->chromaToLumaInjection[i] = parse_para(p);
+       for (i = 0; i < 3; i++)
+               sl_hdr_metadata->kCoefficient[i] = parse_para(p);
+       if (!sl_hdr_metadata->payloadMode) {
+               sl_hdr_metadata->u.variables.tmInputSignalBlackLevelOffset
+                       = parse_para(p);
+               sl_hdr_metadata->u.variables.tmInputSignalWhiteLevelOffset
+                       = parse_para(p);
+               sl_hdr_metadata->u.variables.shadowGain = parse_para(p);
+               sl_hdr_metadata->u.variables.highlightGain = parse_para(p);
+               sl_hdr_metadata->u.variables.midToneWidthAdjFactor
+                       = parse_para(p);
+               sl_hdr_metadata->u.variables.tmOutputFineTuningNumVal
+                       = parse_para(p);
+               for (i = 0; i < sl_hdr_metadata->
+                       u.variables.tmOutputFineTuningNumVal; i++) {
+                       sl_hdr_metadata->u.variables.tmOutputFineTuningX[i]
+                               = parse_para(p);
+                       sl_hdr_metadata->u.variables.tmOutputFineTuningX[i]
+                               = parse_para(p);
+               }
+               sl_hdr_metadata->u.variables.saturationGainNumVal
+                       = parse_para(p);
+               for (i = 0; i < sl_hdr_metadata->
+                       u.variables.saturationGainNumVal; i++) {
+                       sl_hdr_metadata->u.variables.saturationGainX[i]
+                               = parse_para(p);
+                       sl_hdr_metadata->u.variables.saturationGainY[i]
+                               = parse_para(p);
+               }
+       } else {
+               sl_hdr_metadata->u.tables.luminanceMappingNumVal
+                       = parse_para(p);
+               for (i = 0; i < sl_hdr_metadata->
+                       u.tables.luminanceMappingNumVal; i++) {
+                       sl_hdr_metadata->u.tables.luminanceMappingX[i]
+                               = parse_para(p);
+                       sl_hdr_metadata->u.tables.luminanceMappingY[i]
+                               = parse_para(p);
+               }
+               sl_hdr_metadata->u.tables.colourCorrectionNumVal
+                       = parse_para(p);
+               for (i = 0; i < sl_hdr_metadata->
+                       u.tables.colourCorrectionNumVal; i++) {
+                       sl_hdr_metadata->u.tables.colourCorrectionX[i]
+                               = parse_para(p);
+                       sl_hdr_metadata->u.tables.colourCorrectionY[i]
+                               = parse_para(p);
+               }
+       }
+       return 0;
+}
+
+static void prime_sl_parser_metadata(struct vframe_s *vf)
+{
+       struct provider_aux_req_s req;
+       struct prime_cfg_t *Cfg = &prime_sl_setting.Cfg;
+       char *p;
+       unsigned int size = 0;
+       unsigned int type = 0;
+
+       if (vf && (vf->source_type == VFRAME_SOURCE_TYPE_OTHERS)) {
+               req.vf = vf;
+               req.bot_flag = 0;
+               req.aux_buf = NULL;
+               req.aux_size = 0;
+               req.dv_enhance_exist = 0;
+               req.low_latency = 0;
+
+               Cfg->width = (vf->type & VIDTYPE_COMPRESS) ?
+                       vf->compWidth : vf->width;
+               Cfg->height = (vf->type & VIDTYPE_COMPRESS) ?
+                       vf->compHeight : vf->height;
+               Cfg->bit_depth = vf->bitdepth;
+               Cfg->yuv_range = (vf->signal_type >> 25) & 0x1;
+               Cfg->display_Brightness = prime_sl_display_Brightness;
+
+               vf_notify_provider_by_name("prime_sl_dec",
+                       VFRAME_EVENT_RECEIVER_GET_AUX_DATA,
+                       (void *)&req);
+
+               if (req.aux_buf && req.aux_size) {
+                       p = req.aux_buf;
+                       while (p < req.aux_buf
+                               + req.aux_size - 8) {
+                               size = cpu_to_le32((unsigned int)(*p));
+                               p += 4;
+                               type = cpu_to_le32((unsigned int)(*p));
+                               p += 4;
+                               if (type == 0x04000000)/*need to double check*/
+                                       prime_sl_parse_sei_and_meta(p, size);
+                               p += size;
+                       }
+               }
+       }
+}
+
+void prime_sl_process(struct vframe_s *vf)
+{
+       prime_sl_parser_metadata(vf);
+       if (!p_funcs)
+               p_funcs->prime_metadata_parser_process(&prime_sl_setting);
+       prime_sl_set_reg(&prime_sl_setting.prime_sl);
+       prime_sl_close();
+}
+EXPORT_SYMBOL(prime_sl_process);
+
+static void dbg_setting(struct prime_sl_t *prime_sl)
+{
+       unsigned int i;
+
+       pr_info("%s\n", __func__);
+       pr_info("\t legacy_mode_en\t%d\n", prime_sl->legacy_mode_en);
+       pr_info("\t clip_en\t%d\n", prime_sl->clip_en);
+       pr_info("\t reg_gclk_ctrl\t%d\n", prime_sl->reg_gclk_ctrl);
+       pr_info("\t gclk_ctrl\t%d\n", prime_sl->gclk_ctrl);
+       pr_info("\t primesl_en\t%d\n",
+               prime_sl->primesl_en);
+       pr_info("\t inv_chroma_ratio\t%d\n",
+               prime_sl->inv_chroma_ratio);
+       pr_info("\t inv_y_ratio\t%d\n", prime_sl->inv_y_ratio);
+       pr_info("\t l_headroom\t%d\n", prime_sl->l_headroom);
+       pr_info("\t footroom\t%d\n", prime_sl->footroom);
+       pr_info("\t c_headroom\t%d\n", prime_sl->c_headroom);
+       pr_info("\t mub\t%d\n",
+               prime_sl->mub);
+       pr_info("\t mua\t%d\n", prime_sl->mua);
+
+       for (i = 0; i < 7; i++)
+               pr_info("\t oct[%d]\t%d\n", i, prime_sl->oct[i]);
+       for (i = 0; i < 3; i++)
+               pr_info("\t d_lut_threshold[%d]\t%d\n", i,
+               prime_sl->d_lut_threshold[i]);
+       for (i = 0; i < 4; i++)
+               pr_info("\t d_lut_step[%d]\t%d\n", i, prime_sl->d_lut_step[i]);
+       for (i = 0; i < 9; i++)
+               pr_info("\t rgb2yuv[%d]\t%d\n", i, prime_sl->rgb2yuv[i]);
+       for (i = 0; i < 65; i++)
+               pr_info("\t lut_c[%d]\t%d\n", i, prime_sl->lut_c[i]);
+       for (i = 0; i < 65; i++)
+               pr_info("\t lut_p[%d]\t%d\n", i, prime_sl->lut_p[i]);
+       for (i = 0; i < 65; i++)
+               pr_info("\t lut_d[%d]\t%d\n", i, prime_sl->lut_d[i]);
+}
+
+static void dbg_config(struct prime_cfg_t *Cfg)
+{
+       pr_info("%s\n", __func__);
+
+       pr_info("\t width\t%d\n", Cfg->width);
+       pr_info("\t height\t%d\n", Cfg->height);
+       pr_info("\t bit_depth\t%d\n", Cfg->bit_depth);
+       pr_info("\t display_OETF\t%d\n", Cfg->display_OETF);
+       pr_info("\t display_Brightness\t%d\n",
+               Cfg->display_Brightness);
+       pr_info("\t yuv_range\t%d\n", Cfg->yuv_range);
+}
+
+static void dbg_metadata(struct sl_hdr_metadata *pmetadata)
+{
+       pr_info("%s\n", __func__);
+
+       pr_info("\t partID\t%d\n", pmetadata->partID);
+       pr_info("\t majorSpecVersionID\t%d\n",
+               pmetadata->majorSpecVersionID);
+       pr_info("\t minorSpecVersionID\t%d\n",
+               pmetadata->minorSpecVersionID);
+       pr_info("\t payloadMode\t%d\n",
+               pmetadata->payloadMode);
+       pr_info("\t hdrPicColourSpace\t%d\n",
+               pmetadata->hdrPicColourSpace);
+       pr_info("\t hdrDisplayColourSpace\t%d\n",
+               pmetadata->hdrDisplayColourSpace);
+       pr_info("\t hdrDisplayMaxLuminance\t%d\n",
+               pmetadata->hdrDisplayMaxLuminance);
+
+       pr_info("\t hdrDisplayMinLuminance\t%d\n",
+               pmetadata->hdrDisplayMinLuminance);
+       pr_info("\t sdrPicColourSpace\t%d\n",
+               pmetadata->sdrPicColourSpace);
+       pr_info("\t sdrDisplayColourSpace\t%d\n",
+               pmetadata->sdrDisplayColourSpace);
+       pr_info("\t sdrDisplayMaxLuminance\t%d\n",
+               pmetadata->sdrDisplayMaxLuminance);
+       pr_info("\t sdrDisplayMinLuminance\t%d\n",
+               pmetadata->sdrDisplayMinLuminance);
+
+}
+
+static ssize_t amprime_sl_debug_store(struct class *cla,
+                       struct class_attribute *attr,
+                       const char *buf, size_t count)
+{
+
+       if (!buf)
+               return count;
+
+       if (!strcmp(buf, "metadata")) {
+               dbg_metadata(&prime_sl_setting.prime_metadata);
+               dbg_config(&prime_sl_setting.Cfg);
+       } else if (!strcmp(buf, "setting"))
+               dbg_setting(&prime_sl_setting.prime_sl);
+       else
+               pr_info("unsupport commands\n");
+       return count;
+
+}
+
+static struct class_attribute amprime_sl_class_attrs[] = {
+       __ATTR(debug, 0644, NULL, amprime_sl_debug_store),
+       __ATTR_NULL
+};
+
+
+int register_prime_functions(const struct hdr_prime_sl_func_s *func)
+{
+       int ret = -1;
+
+       if (!p_funcs && func) {
+               pr_info("*** register_prime_functions. version %s ***\n",
+                       func->version_info);
+               ret = 0;
+               p_funcs = func;
+               p_funcs->prime_api_init();
+       }
+       return ret;
+}
+EXPORT_SYMBOL(register_prime_functions);
+
+int unregister_prime_functions(void)
+{
+       int ret = -1;
+
+       if (p_funcs) {
+               pr_info("*** unregister_prime_functions ***\n");
+               p_funcs->prime_api_exit();
+               p_funcs = NULL;
+               ret = 0;
+       }
+       return ret;
+}
+EXPORT_SYMBOL(unregister_prime_functions);
+
+static struct prime_sl_device_data_s prime_sl_g12 = {
+       .cpu_id = _CPU_MAJOR_ID_G12,
+};
+
+static struct prime_sl_device_data_s prime_sl_tl1 = {
+       .cpu_id = _CPU_MAJOR_ID_TL1,
+};
+
+static const struct of_device_id amprime_sl_match[] = {
+       {
+               .compatible = "amlogic, prime_sl_g12",
+               .data = &prime_sl_g12,
+       },
+       {
+               .compatible = "amlogic, prime_sl_tl1",
+               .data = &prime_sl_tl1,
+       },
+       {},
+};
+
+static int amprime_sl_probe(struct platform_device *pdev)
+{
+       int ret = 0;
+       unsigned int i = 0;
+       struct amprime_sl_dev_s *devp = &amprime_sl_dev;
+
+       pr_info("amprime_sl probe start & ver: %s\n", DRIVER_VER);
+       if (pdev->dev.of_node) {
+               const struct of_device_id *match;
+               struct prime_sl_device_data_s *prime_sl_meson;
+               struct device_node *of_node = pdev->dev.of_node;
+
+               match = of_match_node(amprime_sl_match, of_node);
+               if (match) {
+                       prime_sl_meson =
+                               (struct prime_sl_device_data_s *)match->data;
+                       if (prime_sl_meson)
+                               memcpy(&amprime_sl_dev, prime_sl_meson,
+                                       sizeof(struct prime_sl_device_data_s));
+                       else {
+                               pr_err("%s data NOT match\n", __func__);
+                               return -ENODEV;
+                       }
+               } else {
+                               pr_err("%s NOT match\n", __func__);
+                               return -ENODEV;
+               }
+
+       }
+       pr_info("\n cpu_id=%d\n", prime_sl_meson_dev.cpu_id);
+       memset(devp, 0, (sizeof(struct amprime_sl_dev_s)));
+       ret = alloc_chrdev_region(&devp->devno, 0, 1, AMPRIME_SL_NAME);
+       if (ret < 0)
+               goto fail_alloc_region;
+       devp->clsp = class_create(THIS_MODULE,
+               AMPRIME_SL_CLASS_NAME);
+       if (IS_ERR(devp->clsp)) {
+               ret = PTR_ERR(devp->clsp);
+               goto fail_create_class;
+       }
+
+       for (i = 0;  amprime_sl_class_attrs[i].attr.name; i++) {
+               if (class_create_file(devp->clsp,
+                       &amprime_sl_class_attrs[i]) < 0)
+                       goto fail_class_create_file;
+       }
+/*     cdev_init(&devp->cdev, &amprime_sl_fops);
+ *     devp->cdev.owner = THIS_MODULE;
+ *     ret = cdev_add(&devp->cdev, devp->devno, 1);
+ *     if (ret)
+ *             goto fail_add_cdev;
+ *
+ *     devp->dev = device_create(devp->clsp, NULL, devp->devno,
+ *                     NULL, AMPRIME_SL_NAME);
+ *     if (IS_ERR(devp->dev)) {
+ *             ret = PTR_ERR(devp->dev);
+ *             goto fail_create_device;
+ *     }
+ */
+       pr_info("%s: probe ok\n", __func__);
+       return 0;
+/*
+ *
+ *fail_create_device:
+ *     pr_info("[amprime_sl.] : amprime_sl device create error.\n");
+ *     cdev_del(&devp->cdev);
+ *
+ *fail_add_cdev:
+ *     pr_info("[amprime_sl.] : amprime_sl add device error.\n");
+ */
+fail_class_create_file:
+       pr_info("[amprime_sl.] : amprime_sl class create file error.\n");
+       for (i = 0; amprime_sl_class_attrs[i].attr.name; i++)
+               class_remove_file(devp->clsp,
+                       &amprime_sl_class_attrs[i]);
+       class_destroy(devp->clsp);
+fail_create_class:
+       pr_info("[amdolby_vision.] : amdolby_vision class create error.\n");
+       unregister_chrdev_region(devp->devno, 1);
+fail_alloc_region:
+       pr_info("[amprime_sl.] : amprime_sl alloc error.\n");
+       pr_info("[amprime_sl.] : amprime_sl.\n");
+       return ret;
+}
+
+static int __exit amprime_sl_remove(struct platform_device *pdev)
+{
+       struct amprime_sl_dev_s *devp = &amprime_sl_dev;
+
+       device_destroy(devp->clsp, devp->devno);
+       cdev_del(&devp->cdev);
+       class_destroy(devp->clsp);
+       unregister_chrdev_region(devp->devno, 1);
+       pr_info("[ amprime_sl.] :  amprime_sl.\n");
+       return 0;
+}
+
+static struct platform_driver amprime_sl_driver = {
+       .driver = {
+               .owner = THIS_MODULE,
+               .name = "amprime_sl",
+               .of_match_table = amprime_sl_match,
+       },
+       .probe = amprime_sl_probe,
+       .remove = __exit_p(amprime_sl_remove),
+};
+
+static int __init amprime_sl_init(void)
+{
+       pr_info("prime_sl module init\n");
+       if (platform_driver_register(&amprime_sl_driver)) {
+               pr_info("failed to register amprime_sl module\n");
+               return -ENODEV;
+       }
+       return 0;
+}
+
+static void __exit amprime_sl_exit(void)
+{
+       pr_info("prime_sl module exit\n");
+}
+
+module_init(amprime_sl_init);
+module_exit(amprime_sl_exit);
+
+MODULE_DESCRIPTION("Amlogic HDR Prime SL driver");
+MODULE_LICENSE("GPL");
+
diff --git a/drivers/amlogic/media/enhancement/amprime_sl/amprime_sl.h b/drivers/amlogic/media/enhancement/amprime_sl/amprime_sl.h
new file mode 100644 (file)
index 0000000..8466482
--- /dev/null
@@ -0,0 +1,391 @@
+/*
+ * drivers/amlogic/media/enhancement/amprime_sl/amprime_sl.h
+ *
+ * Copyright (C) 2017 Amlogic, Inc. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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.
+ *
+ */
+
+#ifndef __AMPRIME_SL_H__
+#define __AMPRIME_SL_H__
+
+#define DRIVER_VER "20190307"
+
+#define ENABLE 1
+#define DISABLE 0
+
+enum cpuID_e {
+       _CPU_MAJOR_ID_G12,
+       _CPU_MAJOR_ID_TL1,
+       _CPU_MAJOR_ID_UNKNOWN,
+};
+
+struct prime_sl_device_data_s {
+       enum cpuID_e cpu_id;
+};
+
+
+#define PRIMESL_LUTC_ADDR_PORT         (0x3980)
+#define PRIMESL_LUTC_DATA_PORT         (0x3981)
+#define PRIMESL_LUTP_ADDR_PORT         (0x3982)
+#define PRIMESL_LUTP_DATA_PORT         (0x3983)
+#define PRIMESL_LUTD_ADDR_PORT         (0x3984)
+#define PRIMESL_LUTD_DATA_PORT         (0x3985)
+#define PRIMESL_CTRL0                  (0x3990)
+union PRIMESL_CTRL0_BITS {
+       unsigned int d32;
+       struct {
+               unsigned int primesl_en:1,
+               gclk_ctrl:2,
+               reg_gclk_ctrl:1,
+               inv_y_ratio:11,
+               reserved3:1,
+               inv_chroma_ratio:11,
+               reserved2:1,
+               clip_en:1,
+               legacy_mode_en:1,
+               reserved1:2;
+       } b;
+};
+#define PRIMESL_CTRL1          (0x3991)
+union PRIMESL_CTRL1_BITS {
+       unsigned int d32;
+       struct {
+               unsigned int footroom:10,
+               reserved2:6,
+               l_headroom:10,
+               reserved1:6;
+       } b;
+};
+#define PRIMESL_CTRL2          (0x3992)
+union PRIMESL_CTRL2_BITS {
+       unsigned int d32;
+       struct {
+               unsigned int c_headroom:10,
+               reserved1:22;
+       } b;
+};
+#define PRIMESL_CTRL3          (0x3993)
+union PRIMESL_CTRL3_BITS {
+       unsigned int d32;
+       struct {
+               unsigned int mua:14,
+               reserved2:2,
+               mub:14,
+               reserved1:2;
+       } b;
+};
+#define PRIMESL_CTRL4          (0x3994)
+union PRIMESL_CTRL4_BITS {
+       unsigned int d32;
+       struct {
+               unsigned int oct_7_0:10,
+               reserved2:6,
+               oct_7_1:10,
+               reserved1:6;
+       } b;
+};
+#define PRIMESL_CTRL5          (0x3995)
+union PRIMESL_CTRL5_BITS {
+       unsigned int d32;
+       struct {
+               unsigned int oct_7_2:10,
+               reserved2:6,
+               oct_7_3:10,
+               reserved1:6;
+       } b;
+};
+#define PRIMESL_CTRL6          (0x3996)
+union PRIMESL_CTRL6_BITS {
+       unsigned int d32;
+       struct {
+               unsigned int oct_7_4:10,
+               reserved2:6,
+               oct_7_5:10,
+               reserved1:6;
+       } b;
+};
+#define PRIMESL_CTRL7          (0x3997)
+union PRIMESL_CTRL7_BITS {
+       unsigned int d32;
+       struct {
+               unsigned int oct_7_6:10,
+               reserved1:22;
+       } b;
+};
+#define PRIMESL_CTRL8          (0x3998)
+union PRIMESL_CTRL8_BITS {
+       unsigned int d32;
+       struct {
+               unsigned int d_lut_threshold_3_0:13,
+               reserved2:3,
+               d_lut_threshold_3_1:13,
+               reserved1:3;
+       } b;
+};
+#define PRIMESL_CTRL9          (0x3999)
+union PRIMESL_CTRL9_BITS {
+       unsigned int d32;
+       struct {
+               unsigned int d_lut_threshold_3_2:13,
+               reserved1:19;
+       } b;
+};
+#define PRIMESL_CTRL10         (0x399a)
+union PRIMESL_CTRL10_BITS {
+       unsigned int d32;
+       struct {
+               unsigned int d_lut_step_4_0:4,
+               d_lut_step_4_1:4,
+               d_lut_step_4_2:4,
+               d_lut_step_4_3:4,
+               reserved1:16;
+       } b;
+};
+#define PRIMESL_CTRL11         (0x399b)
+union PRIMESL_CTRL11_BITS {
+       unsigned int d32;
+       struct {
+               unsigned int rgb2yuv_9_1:13,
+               reserved2:3,
+               rgb2yuv_9_0:13,
+               reserved1:3;
+       } b;
+};
+#define PRIMESL_CTRL12         (0x399c)
+union PRIMESL_CTRL12_BITS {
+       unsigned int d32;
+       struct {
+               unsigned int rgb2yuv_9_3:13,
+               reserved2:3,
+               rgb2yuv_9_2:13,
+               reserved1:3;
+       } b;
+};
+#define PRIMESL_CTRL13         (0x399d)
+union PRIMESL_CTRL13_BITS {
+       unsigned int d32;
+       struct {
+               unsigned int rgb2yuv_9_5:13,
+               reserved2:3,
+               rgb2yuv_9_4:13,
+               reserved1:3;
+       } b;
+};
+#define PRIMESL_CTRL14         (0x399e)
+union PRIMESL_CTRL14_BITS {
+       unsigned int d32;
+       struct {
+               unsigned int rgb2yuv_9_7:13,
+               reserved2:3,
+               rgb2yuv_9_6:13,
+               reserved1:3;
+       } b;
+};
+#define PRIMESL_CTRL15         (0x399f)
+union PRIMESL_CTRL15_BITS {
+       unsigned int d32;
+       struct {
+               unsigned int rgb2yuv_9_8:13,
+               reserved1:19;
+       } b;
+};
+#define PRIME_PRIMESL_EN          (0)
+#define PRIME_GCLK_CTRL                   (1)
+#define PRIME_REG_GCLK_CTRL       (2)
+#define PRIME_INV_Y_RATIO         (3)
+#define PRIME_INV_CHROMA_RATIO    (4)
+#define PRIME_CLIP_EN             (5)
+#define PRIME_LEGACY_MODE_EN      (6)
+#define PRIME_FOOTROOM            (7)
+#define PRIME_L_HEADROOM          (8)
+#define PRIME_C_HEADROOM          (9)
+#define PRIME_MUA                 (10)
+#define PRIME_MUB                 (11)
+#define PRIME_OCT_7_0             (12)
+#define PRIME_OCT_7_1             (13)
+#define PRIME_OCT_7_2             (14)
+#define PRIME_OCT_7_3             (15)
+#define PRIME_OCT_7_4              (16)
+#define PRIME_OCT_7_5             (17)
+#define PRIME_OCT_7_6             (18)
+#define PRIME_D_LUT_THRESHOLD_3_0  (19)
+#define PRIME_D_LUT_THRESHOLD_3_1  (20)
+#define PRIME_D_LUT_THRESHOLD_3_2  (21)
+#define PRIME_D_LUT_STEP_4_0      (22)
+#define PRIME_D_LUT_STEP_4_1      (23)
+#define PRIME_D_LUT_STEP_4_2      (24)
+#define PRIME_D_LUT_STEP_4_3      (25)
+#define PRIME_RGB2YUV_9_0         (26)
+#define PRIME_RGB2YUV_9_1         (27)
+#define PRIME_RGB2YUV_9_2         (28)
+#define PRIME_RGB2YUV_9_3         (29)
+#define PRIME_RGB2YUV_9_4         (30)
+#define PRIME_RGB2YUV_9_5         (31)
+#define PRIME_RGB2YUV_9_6         (32)
+#define PRIME_RGB2YUV_9_7         (33)
+#define PRIME_RGB2YUV_9_8         (34)
+
+
+struct prime_sl_t {
+       unsigned int legacy_mode_en;
+       unsigned int clip_en;
+       unsigned int reg_gclk_ctrl;
+       unsigned int gclk_ctrl;
+       unsigned int primesl_en;
+
+       unsigned int inv_chroma_ratio;
+       unsigned int inv_y_ratio;
+       unsigned int l_headroom;
+       unsigned int footroom;
+       unsigned int c_headroom;
+       unsigned int mub;
+       unsigned int mua;
+       int oct[7];
+       unsigned int d_lut_threshold[3];
+       unsigned int d_lut_step[4];
+       int rgb2yuv[9];
+
+       uint16_t olut_c[65];    /*from */
+       uint16_t olut_p[65];
+       uint16_t olut_d[65];
+
+       unsigned int lut_c[65];
+       unsigned int lut_p[65];
+       unsigned int lut_d[65];
+};
+
+struct sl_hdr_metadata_variables {
+       int tmInputSignalBlackLevelOffset;
+       int tmInputSignalWhiteLevelOffset;
+       int shadowGain;
+       int highlightGain;
+       int midToneWidthAdjFactor;
+       int tmOutputFineTuningNumVal;
+       int tmOutputFineTuningX[10];
+       int tmOutputFineTuningY[10];
+       int saturationGainNumVal;
+       int saturationGainX[6];
+       int saturationGainY[6];
+};
+
+struct sl_hdr_metadata_tables {
+       int luminanceMappingNumVal;
+       int luminanceMappingX[65];
+       int luminanceMappingY[65];
+       int colourCorrectionNumVal;
+       int colourCorrectionX[65];
+       int colourCorrectionY[65];
+};
+
+struct sl_hdr_metadata {
+       int partID;
+       int majorSpecVersionID;
+       int minorSpecVersionID;
+       int payloadMode;
+       int hdrPicColourSpace;
+       int hdrDisplayColourSpace;
+       int hdrDisplayMaxLuminance;
+       int hdrDisplayMinLuminance;
+       int sdrPicColourSpace;
+       int sdrDisplayColourSpace;
+       int sdrDisplayMaxLuminance;
+       int sdrDisplayMinLuminance;
+       int matrixCoefficient[4];
+       int chromaToLumaInjection[2];
+       int kCoefficient[3];
+       union {
+               struct sl_hdr_metadata_variables variables;
+               struct sl_hdr_metadata_tables tables;
+       } u;
+};
+
+struct prime_cfg_t {
+       unsigned int width;     /*use?*/
+       unsigned int height;    /*use?*/
+       unsigned int bit_depth; /*use?*/
+       int display_OETF;       /**/
+       int yuv_range;
+       int display_Brightness;
+};
+
+struct prime_t {
+
+       int en_ic;      /*0: ic not support prime sl; 1: ic support prime sl*/
+       int en_top;     /*top prime sl switch*/
+       int en_pause;
+       int en_checkdata;
+       int en_count;
+       int en_count_tsk;
+       int en_set;
+       int en_close;
+
+       int ok_count;
+       int ok_set;
+
+       int isr_mode;
+       unsigned int vs_cnt;
+       unsigned int ver_hw;
+       unsigned int ver_fw;
+
+       struct prime_cfg_t      *pCfg;
+       struct sl_hdr_metadata  *pmta;
+       struct prime_sl_t       *pps;
+
+       struct prime_cfg_t      Cfg;
+       struct sl_hdr_metadata  prime_metadata;
+       struct prime_sl_t       prime_sl;
+
+       /*test*/
+       unsigned int dbg_nub;
+       unsigned int dbg_metachange;
+       struct timeval    tv[4][2];
+
+};
+
+extern void prime_api_init(void);
+extern void prime_api_exit(void);
+extern void prime_api_isr_process(void);
+extern void prime_api_cmd_process(unsigned char cmd, int para);
+extern unsigned int prime_api_info_show(char *buf, unsigned int size);
+extern int prime_api_store(const char *buf, unsigned int para);
+extern int prime_metadata_parser_process(struct prime_t *prime_sl_setting);
+
+struct hdr_prime_sl_func_s {
+       const char *version_info;
+       void (*prime_api_init)(void);
+       void (*prime_api_exit)(void);
+       void (*prime_api_isr_process)(void);
+       void (*prime_api_cmd_process)(unsigned char cmd, int para);
+       unsigned int (*prime_api_info_show)(char *buf, unsigned int size);
+       int (*prime_api_store)(const char *buf, unsigned int para);
+       int (*prime_metadata_parser_process)(struct prime_t *prime_sl_setting);
+};
+
+extern int register_prime_functions(const struct hdr_prime_sl_func_s *func);
+extern int unregister_prime_functions(void);
+
+#ifndef CONFIG_AMLOGIC_MEDIA_VSYNC_RDMA
+#define _VSYNC_WR_MPEG_REG(adr, val) WRITE_VPP_REG(adr, val)
+#define _VSYNC_RD_MPEG_REG(adr) READ_VPP_REG(adr)
+#define _VSYNC_WR_MPEG_REG_BITS(adr, val, start, len) \
+       WRITE_VPP_REG_BITS(adr, val, start, len)
+#else
+extern int _VSYNC_WR_MPEG_REG_BITS(u32 adr, u32 val, u32 start, u32 len);
+extern u32 _VSYNC_RD_MPEG_REG(u32 adr);
+extern int _VSYNC_WR_MPEG_REG(u32 adr, u32 val);
+#endif
+extern void prime_sl_set_reg(const struct prime_sl_t *pS);
+extern void prime_sl_close(void);
+
+
+#endif /*__REG_G12A_PRIME_H__*/
diff --git a/drivers/amlogic/media/enhancement/amprime_sl/amprime_sl_hw.c b/drivers/amlogic/media/enhancement/amprime_sl/amprime_sl_hw.c
new file mode 100644 (file)
index 0000000..1eace54
--- /dev/null
@@ -0,0 +1,289 @@
+/*
+ * drivers/amlogic/media/enhancement/amprime_sl/amprime_sl_hw.c
+ *
+ * Copyright (C) 2017 Amlogic, Inc. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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/types.h>
+
+
+#include <linux/jiffies.h>
+#include<linux/ktime.h>        /*gettimeofday*/
+#include<linux/timekeeping.h>  /*gettimeofday*/
+
+#include <linux/amlogic/media/amvecm/amvecm.h> /*WRITE_VPP_REG*/
+#include "amprime_sl.h"
+
+/*======================================*/
+/*#define USE_TASKLET  1*/
+
+static inline void wbits_PRIMESL_CTRL0(
+       unsigned int primesl_en, unsigned int gclk_ctrl,
+       unsigned int reg_gclk_ctrl, unsigned int inv_y_ratio,
+       unsigned int inv_chroma_ratio, unsigned int clip_en,
+       unsigned int legacy_mode_en)
+{
+       union PRIMESL_CTRL0_BITS v;
+
+       v.b.primesl_en = primesl_en;
+       v.b.gclk_ctrl = gclk_ctrl;
+       v.b.reg_gclk_ctrl = reg_gclk_ctrl;
+       v.b.inv_y_ratio = inv_y_ratio;
+       v.b.inv_chroma_ratio = inv_chroma_ratio;
+       v.b.clip_en = clip_en;
+       v.b.legacy_mode_en = legacy_mode_en;
+       _VSYNC_WR_MPEG_REG(PRIMESL_CTRL0, v.d32);
+}
+static inline void wbits_PRIMESL_CTRL1(unsigned int footroom,
+                               unsigned int l_headroom)
+{
+       union PRIMESL_CTRL1_BITS v;
+
+       v.b.footroom = footroom;
+       v.b.l_headroom = l_headroom;
+       _VSYNC_WR_MPEG_REG(PRIMESL_CTRL1, v.d32);
+}
+static inline void wbits_PRIMESL_CTRL2(unsigned int c_headroom)
+{
+       union PRIMESL_CTRL2_BITS v;
+
+       v.b.c_headroom = c_headroom;
+       _VSYNC_WR_MPEG_REG(PRIMESL_CTRL2, v.d32);
+}
+static inline void wbits_PRIMESL_CTRL3(unsigned int mua,
+                               unsigned int mub)
+{
+       union PRIMESL_CTRL3_BITS v;
+
+       v.b.mua = mua;
+       v.b.mub = mub;
+       _VSYNC_WR_MPEG_REG(PRIMESL_CTRL3, v.d32);
+}
+static inline void wbits_PRIMESL_CTRL4(unsigned int oct_7_0,
+                               unsigned int oct_7_1)
+{
+       union PRIMESL_CTRL4_BITS v;
+
+       v.b.oct_7_0 = oct_7_0;
+       v.b.oct_7_1 = oct_7_1;
+       _VSYNC_WR_MPEG_REG(PRIMESL_CTRL4, v.d32);
+}
+static inline void wbits_PRIMESL_CTRL5(unsigned int oct_7_2,
+                               unsigned int oct_7_3)
+{
+       union PRIMESL_CTRL5_BITS v;
+
+       v.b.oct_7_2 = oct_7_2;
+       v.b.oct_7_3 = oct_7_3;
+       _VSYNC_WR_MPEG_REG(PRIMESL_CTRL5, v.d32);
+}
+static inline void wbits_PRIMESL_CTRL6(unsigned int oct_7_4,
+                               unsigned int oct_7_5)
+{
+       union PRIMESL_CTRL6_BITS v;
+
+       v.b.oct_7_4 = oct_7_4;
+       v.b.oct_7_5 = oct_7_5;
+       _VSYNC_WR_MPEG_REG(PRIMESL_CTRL6, v.d32);
+}
+static inline void wbits_PRIMESL_CTRL7(unsigned int oct_7_6)
+{
+       union PRIMESL_CTRL7_BITS v;
+
+       v.b.oct_7_6 = oct_7_6;
+       _VSYNC_WR_MPEG_REG(PRIMESL_CTRL7, v.d32);
+}
+static inline void wbits_PRIMESL_CTRL8(unsigned int d_lut_threshold_3_0,
+                               unsigned int d_lut_threshold_3_1)
+{
+       union PRIMESL_CTRL8_BITS v;
+
+       v.b.d_lut_threshold_3_0 = d_lut_threshold_3_0;
+       v.b.d_lut_threshold_3_1 = d_lut_threshold_3_1;
+       _VSYNC_WR_MPEG_REG(PRIMESL_CTRL8, v.d32);
+}
+static inline void wbits_PRIMESL_CTRL9(unsigned int d_lut_threshold_3_2)
+{
+       union PRIMESL_CTRL9_BITS v;
+
+       v.b.d_lut_threshold_3_2 = d_lut_threshold_3_2;
+       _VSYNC_WR_MPEG_REG(PRIMESL_CTRL9, v.d32);
+}
+static inline void wbits_PRIMESL_CTRL10(unsigned int d_lut_step_4_0,
+                               unsigned int d_lut_step_4_1,
+                               unsigned int d_lut_step_4_2,
+                               unsigned int d_lut_step_4_3)
+{
+       union PRIMESL_CTRL10_BITS v;
+
+       v.b.d_lut_step_4_0 = d_lut_step_4_0;
+       v.b.d_lut_step_4_1 = d_lut_step_4_1;
+       v.b.d_lut_step_4_2 = d_lut_step_4_2;
+       v.b.d_lut_step_4_3 = d_lut_step_4_3;
+       _VSYNC_WR_MPEG_REG(PRIMESL_CTRL10, v.d32);
+}
+static inline void wbits_PRIMESL_CTRL11(unsigned int rgb2yuv_9_1,
+                               unsigned int rgb2yuv_9_0)
+{
+       union PRIMESL_CTRL11_BITS v;
+
+       v.b.rgb2yuv_9_1 = rgb2yuv_9_1;
+       v.b.rgb2yuv_9_0 = rgb2yuv_9_0;
+       _VSYNC_WR_MPEG_REG(PRIMESL_CTRL11, v.d32);
+}
+static inline void wbits_PRIMESL_CTRL12(unsigned int rgb2yuv_9_3,
+                               unsigned int rgb2yuv_9_2)
+{
+       union PRIMESL_CTRL12_BITS v;
+
+       v.b.rgb2yuv_9_3 = rgb2yuv_9_3;
+       v.b.rgb2yuv_9_2 = rgb2yuv_9_2;
+       _VSYNC_WR_MPEG_REG(PRIMESL_CTRL12, v.d32);
+}
+static inline void wbits_PRIMESL_CTRL13(unsigned int rgb2yuv_9_5,
+                               unsigned int rgb2yuv_9_4)
+{
+       union PRIMESL_CTRL13_BITS v;
+
+       v.b.rgb2yuv_9_5 = rgb2yuv_9_5;
+       v.b.rgb2yuv_9_4 = rgb2yuv_9_4;
+       _VSYNC_WR_MPEG_REG(PRIMESL_CTRL13, v.d32);
+}
+static inline void wbits_PRIMESL_CTRL14(unsigned int rgb2yuv_9_7,
+                               unsigned int rgb2yuv_9_6)
+{
+       union PRIMESL_CTRL14_BITS v;
+
+       v.b.rgb2yuv_9_7 = rgb2yuv_9_7;
+       v.b.rgb2yuv_9_6 = rgb2yuv_9_6;
+       _VSYNC_WR_MPEG_REG(PRIMESL_CTRL14, v.d32);
+}
+static inline void wbits_PRIMESL_CTRL15(unsigned int rgb2yuv_9_8)
+{
+       union PRIMESL_CTRL15_BITS v;
+
+       v.b.rgb2yuv_9_8 = rgb2yuv_9_8;
+       _VSYNC_WR_MPEG_REG(PRIMESL_CTRL15, v.d32);
+}
+
+#define NOT_USR_WR_T   1
+
+void slctr_set_rgb2yuv(const int *pTab)/*9byte*/
+{
+#ifdef NOT_USR_WR_T
+       wbits_PRIMESL_CTRL11(pTab[1], pTab[0]);
+       wbits_PRIMESL_CTRL12(pTab[3], pTab[2]);
+       wbits_PRIMESL_CTRL13(pTab[5], pTab[4]);
+       wbits_PRIMESL_CTRL14(pTab[7], pTab[6]);
+       wbits_PRIMESL_CTRL15(pTab[8]);
+
+#else
+       int i;
+
+       for (i = 0; i < 9; i++)
+               WR_T(PRIME_RGB2YUV_9_0+i, (unsigned int)pTab[i]);
+#endif
+}
+
+void slctr_set_lutstep(const unsigned int *pTab)/*4byte*/
+{
+
+#ifdef NOT_USR_WR_T
+       wbits_PRIMESL_CTRL10(pTab[0], pTab[1], pTab[2], pTab[3]);
+
+#else
+       int i;
+
+       for (i = 0; i < 4; i++)
+               WR_T(PRIME_D_LUT_STEP_4_0+i, pTab[i]);
+
+#endif
+}
+void slctr_set_lutthrd(const unsigned int *pTab)/*3byte*/
+{
+
+#ifdef NOT_USR_WR_T
+       wbits_PRIMESL_CTRL8(pTab[0], pTab[1]);
+       wbits_PRIMESL_CTRL9(pTab[2]);
+#else
+       int i;
+
+       for (i = 0; i < 3; i++)
+               WR_T(PRIME_D_LUT_THRESHOLD_3_0+i, pTab[i]);
+
+#endif
+}
+void slctr_set_oct(const int *pTab)/*7byte*/
+{
+
+#ifdef NOT_USR_WR_T
+       wbits_PRIMESL_CTRL4(pTab[0], pTab[1]);
+       wbits_PRIMESL_CTRL5(pTab[2], pTab[3]);
+       wbits_PRIMESL_CTRL6(pTab[4], pTab[5]);
+       wbits_PRIMESL_CTRL7(pTab[6]);
+#else
+       int i;
+
+       for (i = 0; i < 7; i++)
+               WR_T(PRIME_OCT_7_0+i, (unsigned int)pTab[i]);
+#endif
+}
+void slctr_set_lut_c(const int *pTab)/*7byte*/
+{
+       int i;
+
+       _VSYNC_WR_MPEG_REG(PRIMESL_LUTC_ADDR_PORT, 0);
+       for (i = 0; i < 65; i++)
+               _VSYNC_WR_MPEG_REG(PRIMESL_LUTC_DATA_PORT, pTab[i]);
+}
+
+void slctr_set_lut_p(const int *pTab)/*7byte*/
+{
+       int i;
+
+       _VSYNC_WR_MPEG_REG(PRIMESL_LUTP_ADDR_PORT, 0);
+       for (i = 0; i < 65; i++)
+               _VSYNC_WR_MPEG_REG(PRIMESL_LUTP_DATA_PORT, pTab[i]);
+}
+
+void slctr_set_lut_d(const int *pTab)/*7byte*/
+{
+       int i;
+
+       _VSYNC_WR_MPEG_REG(PRIMESL_LUTD_ADDR_PORT, 0);
+       for (i = 0; i < 65; i++)
+               _VSYNC_WR_MPEG_REG(PRIMESL_LUTD_DATA_PORT, pTab[i]);
+}
+
+void prime_sl_set_reg(const struct prime_sl_t *pS)
+{
+       wbits_PRIMESL_CTRL1(pS->footroom, pS->l_headroom);
+       wbits_PRIMESL_CTRL2(pS->c_headroom);
+       wbits_PRIMESL_CTRL3(pS->mua, pS->mub);
+       slctr_set_oct(&pS->oct[0]);
+       slctr_set_lutthrd(&pS->d_lut_threshold[0]);
+       slctr_set_lutstep(&pS->d_lut_step[0]);
+       slctr_set_rgb2yuv(&pS->rgb2yuv[0]);
+       slctr_set_lut_c(&pS->lut_c[0]);
+       slctr_set_lut_p(&pS->lut_p[0]);
+       slctr_set_lut_d(&pS->lut_d[0]);
+
+       wbits_PRIMESL_CTRL0(1, 0, 0, pS->inv_y_ratio,
+               pS->inv_chroma_ratio, 0, 0);
+}
+void prime_sl_close(void)
+{
+       wbits_PRIMESL_CTRL0(0, 0, 0, 0, 0, 0, 0);
+}
+
diff --git a/include/linux/amlogic/media/amprime_sl/prime_sl.h b/include/linux/amlogic/media/amprime_sl/prime_sl.h
new file mode 100644 (file)
index 0000000..76bf489
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * include/linux/amlogic/media/amprime_sl/prime_sl.h
+ *
+ * Copyright (C) 2017 Amlogic, Inc. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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.
+ *
+ */
+
+#ifndef _PRIMSE_SL_H_
+#define _PRIMSE_SL_H_
+
+#include <linux/types.h>
+
+extern void prime_sl_process(struct vframe_s *vf);
+extern bool is_dolby_vision_enable(void);
+
+#endif