Files
android_kernel_samsung_sm86…/msm/sde/sde_hw_dspp.h
Saurabh Yadav c27d7c56ce disp: msm: sde: program both rc config and ram through lut dma
Currently, only rc ram is programmed through lut dma and
rc config is programmed through ahb.
This change programs both rc config and rc ram through lut dma.

Change-Id: I50a6e87dfbadb9c4a93cebdaa1e813f5be9ba5f5
Signed-off-by: Saurabh Yadav <quic_sauyad@quicinc.com>
2023-04-14 09:48:43 -07:00

402 rindas
11 KiB
C

/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
*/
#ifndef _SDE_HW_DSPP_H
#define _SDE_HW_DSPP_H
#include <drm/msm_drm_pp.h>
#include "msm_drv.h"
struct sde_hw_dspp;
/**
* struct sde_hw_dspp_ops - interface to the dspp hardware driver functions
* Caller must call the init function to get the dspp context for each dspp
* Assumption is these functions will be called after clocks are enabled
*/
struct sde_hw_dspp_ops {
/**
* setup_histogram - setup dspp histogram
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_histogram)(struct sde_hw_dspp *ctx, void *cfg);
/**
* read_histogram - read dspp histogram
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*read_histogram)(struct sde_hw_dspp *ctx, void *cfg);
/**
* lock_histogram - lock dspp histogram buffer
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*lock_histogram)(struct sde_hw_dspp *ctx, void *cfg);
/**
* setup_igc - update dspp igc
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_igc)(struct sde_hw_dspp *ctx, void *cfg);
/**
* setup_pa_hsic - setup dspp pa hsic
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_pa_hsic)(struct sde_hw_dspp *dspp, void *cfg);
/**
* setup_pcc - setup dspp pcc
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_pcc)(struct sde_hw_dspp *ctx, void *cfg);
/**
* setup_sharpening - setup dspp sharpening
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_sharpening)(struct sde_hw_dspp *ctx, void *cfg);
/**
* setup_pa_memcol_skin - setup dspp memcolor skin
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_pa_memcol_skin)(struct sde_hw_dspp *ctx, void *cfg);
/**
* setup_pa_memcol_sky - setup dspp memcolor sky
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_pa_memcol_sky)(struct sde_hw_dspp *ctx, void *cfg);
/**
* setup_pa_memcol_foliage - setup dspp memcolor foliage
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_pa_memcol_foliage)(struct sde_hw_dspp *ctx, void *cfg);
/**
* setup_pa_memcol_prot - setup dspp memcolor protection
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_pa_memcol_prot)(struct sde_hw_dspp *ctx, void *cfg);
/**
* setup_sixzone - setup dspp six zone
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_sixzone)(struct sde_hw_dspp *dspp, void *cfg);
/**
* setup_danger_safe - setup danger safe LUTS
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_danger_safe)(struct sde_hw_dspp *ctx, void *cfg);
/**
* setup_pa_dither - setup dspp PA dither
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_pa_dither)(struct sde_hw_dspp *ctx, void *cfg);
/**
* setup_vlut - setup dspp PA VLUT
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_vlut)(struct sde_hw_dspp *ctx, void *cfg);
/**
* setup_gc - update dspp gc
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_gc)(struct sde_hw_dspp *ctx, void *cfg);
/**
* setup_gamut - update dspp gamut
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_gamut)(struct sde_hw_dspp *ctx, void *cfg);
/**
* validate_ad - check if ad property can be set
* @ctx: Pointer to dspp context
* @prop: Pointer to ad property being validated
*/
int (*validate_ad)(struct sde_hw_dspp *ctx, u32 *prop);
/**
* setup_ad - update the ad property
* @ctx: Pointer to dspp context
* @cfg: Pointer to ad configuration
*/
void (*setup_ad)(struct sde_hw_dspp *ctx, void *cfg);
/**
* ad_read_intr_resp - function to get interrupt response for ad
* @event: Event for which response needs to be read
* @resp_in: Pointer to u32 where resp ad4 input value is dumped.
* @resp_out: Pointer to u32 where resp ad4 output value is dumped.
*/
void (*ad_read_intr_resp)(struct sde_hw_dspp *ctx, u32 event,
u32 *resp_in, u32 *resp_out);
/**
* setup_ltm_init - setup LTM INIT
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_ltm_init)(struct sde_hw_dspp *ctx, void *cfg);
/**
* setup_ltm_roi - setup LTM ROI
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_ltm_roi)(struct sde_hw_dspp *ctx, void *cfg);
/**
* setup_ltm_vlut - setup LTM VLUT
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_ltm_vlut)(struct sde_hw_dspp *ctx, void *cfg);
/**
* setup_ltm_hist_ctrl - setup LTM histogram control
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
* @enable: feature enable/disable value
* @iova: aligned hist buffer address
*/
void (*setup_ltm_hist_ctrl)(struct sde_hw_dspp *ctx, void *cfg,
bool enable, u64 iova);
/**
* setup_ltm_hist_buffer - setup LTM histogram buffer
* @ctx: Pointer to dspp context
* @iova: aligned hist buffer address
*/
void (*setup_ltm_hist_buffer)(struct sde_hw_dspp *ctx, u64 iova);
/**
* setup_ltm_thresh - setup LTM histogram thresh
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_ltm_thresh)(struct sde_hw_dspp *ctx, void *cfg);
/**
* ltm_read_intr_status - function to read ltm interrupt status
* @ctx: Pointer to dspp context
* @status: Pointer to u32 where ltm status value is dumped.
*/
void (*ltm_read_intr_status)(struct sde_hw_dspp *ctx, u32 *status);
/**
* clear_ltm_merge_mode - clear LTM merge_mode bit
* @ctx: Pointer to dspp context
*/
void (*clear_ltm_merge_mode)(struct sde_hw_dspp *ctx);
/**
* validate_rc_mask - Validate RC mask configuration
* @ctx: Pointer to dspp context.
* @cfg: Pointer to configuration.
* Return: 0 on success, non-zero otherwise.
*/
int (*validate_rc_mask)(struct sde_hw_dspp *ctx, void *cfg);
/**
* setup_rc_mask - Setup RC mask configuration
* @ctx: Pointer to dspp context.
* @cfg: Pointer to configuration.
* Return: 0 on success, non-zero otherwise.
*/
int (*setup_rc_mask)(struct sde_hw_dspp *ctx, void *cfg);
/**
* validate_rc_pu_roi - Validate RC regions in during partial update.
* @ctx: Pointer to dspp context.
* @cfg: Pointer to configuration.
* Return: 0 on success, non-zero otherwise.
*/
int (*validate_rc_pu_roi)(struct sde_hw_dspp *ctx, void *cfg);
/**
* setup_rc_pu_roi - Setup RC regions in during partial update.
* @ctx: Pointer to dspp context.
* @cfg: Pointer to configuration.
* Return: 0 on success, non-zero otherwise.
*/
int (*setup_rc_pu_roi)(struct sde_hw_dspp *ctx, void *cfg);
/**
* validate_spr_init_config - Validate SPR configuration
* @ctx: Pointer to dspp context.
* @cfg: Pointer to configuration.
* Return: 0 on success, non-zero otherwise.
*/
int (*validate_spr_init_config)(struct sde_hw_dspp *ctx, void *cfg);
/**
* validate_spr_udc_config - Validate SPR configuration
* @ctx: Pointer to dspp context.
* @cfg: Pointer to configuration.
* Return: 0 on success, non-zero otherwise.
*/
int (*validate_spr_udc_config)(struct sde_hw_dspp *ctx, void *cfg);
/**
* setup_spr_init_config - function to configure spr hw block
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_spr_init_config)(struct sde_hw_dspp *ctx, void *cfg);
/**
* setup_spr_udc_config - function to configure spr hw block
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_spr_udc_config)(struct sde_hw_dspp *ctx, void *cfg);
/**
* setup_spr_pu_config - function to configure spr hw block pu offsets
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_spr_pu_config)(struct sde_hw_dspp *ctx, void *cfg);
/**
* read_spr_opr_value - function to read spr opr value
* @ctx: Pointer to dspp context
* @opr_value: Pointer to opr value
*/
int (*read_spr_opr_value)(struct sde_hw_dspp *ctx, u32 *opr_value);
/**
* setup_demura_cfg - function to program demura cfg
* @ctx: Pointer to dspp context
* @status: Pointer to configuration.
*/
void (*setup_demura_cfg)(struct sde_hw_dspp *ctx, void *cfg);
/**
* setup_demura_backlight_cfg - function to program demura backlight
* @ctx: Pointer to dspp context
* @status: Pointer to configuration.
*/
void (*setup_demura_backlight_cfg)(struct sde_hw_dspp *ctx, u64 val);
/**
* demura_read_plane_status - Query demura plane status
* @ctx: Pointer to dspp context
* @status: Demura plane used by DSPP. demura_fetch_planes enum value.
*/
void (*demura_read_plane_status)(struct sde_hw_dspp *ctx, u32 *status);
/**
* setup_demura_pu_config - function to configure demura hw block pu offsets
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_demura_pu_config)(struct sde_hw_dspp *ctx, void *cfg);
/**
* setup_demura_cfg0_param2 - function to configure demura cfg0_param2 params
* @ctx: Pointer to dspp context
* @cfg: Pointer to configuration
*/
void (*setup_demura_cfg0_param2)(struct sde_hw_dspp *ctx, void *cfg);
};
/**
* struct sde_hw_rc_state - rounded corner cached state per RC instance
* @last_rc_mask_cfg: cached value of most recent programmed mask.
* @last_roi_list: cached value of most recent processed list of ROIs.
*/
struct sde_hw_rc_state {
struct drm_msm_rc_mask_cfg *last_rc_mask_cfg;
struct msm_roi_list *last_roi_list;
};
/**
* struct sde_hw_dspp - dspp description
* @base: Hardware block base structure
* @hw: Block hardware details
* @hw_top: Block hardware top details
* @idx: DSPP index
* @cap: Pointer to layer_cfg
* @sb_dma_in_use: hint indicating if sb dma is being used for this dspp
* @ops: Pointer to operations possible for this DSPP
* @ltm_checksum_support: flag to check if checksum present
* @spr_cfg_18_default: Default SPR cfg 18 HW details. Needed for PU handling
* @rc_state: Structure for RC state
*/
struct sde_hw_dspp {
struct sde_hw_blk_reg_map hw;
/* dspp top */
struct sde_hw_blk_reg_map hw_top;
/* dspp */
enum sde_dspp idx;
const struct sde_dspp_cfg *cap;
bool sb_dma_in_use;
bool ltm_checksum_support;
u32 spr_cfg_18_default;
/* Ops */
struct sde_hw_dspp_ops ops;
/* rc state */
struct sde_hw_rc_state rc_state;
};
/**
* to_sde_hw_dspp - convert base hw object to sde_hw_dspp container
* @hw: Pointer to hardware block register map object
* return: Pointer to hardware block container
*/
static inline struct sde_hw_dspp *to_sde_hw_dspp(struct sde_hw_blk_reg_map *hw)
{
return container_of(hw, struct sde_hw_dspp, hw);
}
/**
* sde_hw_dspp_init - initializes the dspp hw driver object.
* should be called once before accessing every dspp.
* @idx: DSPP index for which driver object is required
* @addr: Mapped register io address of MDP
* @Return: pointer to structure or ERR_PTR
*/
struct sde_hw_blk_reg_map *sde_hw_dspp_init(enum sde_dspp idx,
void __iomem *addr,
struct sde_mdss_cfg *m);
/**
* sde_hw_dspp_destroy(): Destroys DSPP driver context
* @hw: Pointer to hardware block register map object
*/
void sde_hw_dspp_destroy(struct sde_hw_blk_reg_map *hw);
#endif /*_SDE_HW_DSPP_H */