/* SPDX-License-Identifier: LGPL-2.1-only OR BSD-3-Clause */
/******************************************************************************
 *
 * This file is provided under a dual license.  When you use or
 * distribute this software, you may choose to be licensed under
 * version 2.1 of the GNU Lesser General Public License
 * ("LGPLv2.1 License") or BSD License.
 *
 * LGPLv2.1 License
 *
 * Copyright(C) 2019 MediaTek Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of version 2.1 of the GNU Lesser General Public
 * License 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 https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html for more
 * details.
 *
 * BSD LICENSE
 *
 * Copyright(C) 2019 MediaTek Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *  * Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *****************************************************************************/

/*-----------------------------------------------------------------------------
 *
 * $Author: jinfeng.long $
 * $Date: 2015/08/13 $
 * $RCSfile: api_ycproc.h,v $
 * $Revision: #2 $
 *
 *---------------------------------------------------------------------------*/

/** @file Drv_pq_cust.h
 *  Function to Access Quality Value Stored in Drv_cust Section due to these 
 *  value may not be access directly in 8032
 */

#ifndef _DRV_PQ_CUST_H
#define _DRV_PQ_CUST_H

#include "drv_default.h"
#define SCE_LUMA_HUE_SLICE 16
#define GAMMA_INDEX 257
#define SCE_HUE_SLICE 28
#define SCE_INDEX 1216   // 22*28+8=624, plus 8 for FlashPQ size alignment (16x)

#include "pe_if.h"	// TODO: remove!

//DFT QTY Table
extern tagDFT_QTY aDefaultQtyTbl[QUALITY_MAX];  

#define READ_DEFUALT_QTY_TBL_MIN(index) (aDefaultQtyTbl[(index)].bDftQtyMin)
#define READ_DEFUALT_QTY_TBL_MAX(index) (aDefaultQtyTbl[(index)].bDftQtyMax)
#define READ_DEFUALT_QTY_TBL_DFT(index) (aDefaultQtyTbl[(index)].bDftQtyDft)
#define READ_DEFUALT_QTY_TBL_REF(index) (aDefaultQtyTbl[(index)].wDftQtyRefenence)

#define WRITE_DEFUALT_QTY_TBL_MIN(index,value) {aDefaultQtyTbl[(index)].bDftQtyMin=(UINT8)(value);}
#define WRITE_DEFUALT_QTY_TBL_MAX(index,value) {aDefaultQtyTbl[(index)].bDftQtyMax=(UINT8)(value);}
#define WRITE_DEFUALT_QTY_TBL_DFT(index,value) {aDefaultQtyTbl[(index)].bDftQtyDft=(UINT8)(value);}
#define WRITE_DEFUALT_QTY_TBL_REF(index,value) {aDefaultQtyTbl[(index)].wDftQtyRefenence=(UINT16)(value);}

//QTY_ITEM
extern UINT16 const wCustomQtyItem[FLASHPQ_NUM][CUSTOM_QTY_TBL_DIM + TBL_HEAD_HASH];

#define READ_CUST_QTY_ITEM(j,index)  (wCustomQtyItem[j][index])

//CUST_SRC_TIMING_MAPPING TABLE
extern UINT8 bCustomSrcTimingTbl[];

//CUST_SOURCE_GROUP
extern UINT8 bCustomSourceGroup[][QTY_IDX_RANGE_DIM];

#define READ_CUSTOM_SRC_GROUP(index,item) (bCustomSourceGroup[(index)][(item)])
#define WRITE_CUSTOM_SRC_GROUP(index,item,value) {bCustomSourceGroup[(index)][(item)]=(value);}

//SCE_BY_SOURCE
extern UINT8 SceBySource[][QTY_IDX_RANGE_DIM];
#define READ_Sce_SRC_GROUP(index,item) (SceBySource[(index)][(item)])
#define WRITE_Sce_SRC_GROUP(index,item,value) {SceBySource[(index)][(item)]=(value);}

//CUST_QTY_TBL    
#ifdef CC_MAPLE_CUST_DRV
extern UINT8 bCustomQtyTbl[FLASHPQ_NUM][30][CUSTOM_QTY_TBL_DIM];
#else
extern UINT8 bCustomQtyTbl[FLASHPQ_NUM][CUSTOMIZE_FLASHPQ_TOTAL_TIMING][CUSTOM_QTY_TBL_DIM];
#endif
#define READ_CUSTOM_QTY_TBL(timing,item) (bCustomQtyTbl[((item>>QTY_TBL_REF_INDEX_SHIFT)<FLASHPQ_NUM)?(item>>QTY_TBL_REF_INDEX_SHIFT):0][MIN(timing, CUSTOMIZE_FLASHPQ_TOTAL_TIMING-1)][item &0x3FFF])
#define WRITE_CUSTOM_QTY_TBL(timing,item,value) {bCustomQtyTbl[item>>QTY_TBL_REF_INDEX_SHIFT][MIN(timing, CUSTOMIZE_FLASHPQ_TOTAL_TIMING-1)][item &0x3FFF]=(value);}
    
//SCE    
extern UINT8 DEFAULT_SCE_TBL[SCE_INDEX];
extern UINT8 BASE_SCE_TBL[SCE_INDEX];
extern UINT8 MIN_SCE_TBL[SCE_INDEX];

#define READ_SCE_TBL(index1,index2) (DEFAULT_SCE_TBL[(index1)*SCE_HUE_SLICE + (index2)])
#define WRITE_SCE_TBL(index1,index2,value) {DEFAULT_SCE_TBL[(index1)*SCE_HUE_SLICE + (index2)]=(UINT8)(value);}

//DEMO Position    
extern UINT16 const DEMO_MODE_BEFORE_SCALER_ARG[][DEMO_MODE_BEFORE_SCALER_END];
extern UINT16 const DEMO_MODE_AFTER_SCALER_ARG[][DEMO_MODE_AFTER_SCALER_END];

#define READ_DEMO_BFR_SCALER_ARG(timing,EngineType) (DEMO_MODE_BEFORE_SCALER_ARG[(timing)][(EngineType)])
#define READ_DEMO_AFT_SCALER_ARG(timing,EngineType) (DEMO_MODE_AFTER_SCALER_ARG[(timing)][(EngineType)])

//GAMMA TBL
extern UINT8 GAMMA_256[3][GAMMA_INDEX];
      
#endif
