123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424 |
- /* Copyright (c) 2015-2018, The Linux Foundation. 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 version 2 and
- * only 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.
- */
- #ifndef _DPU_HW_SSPP_H
- #define _DPU_HW_SSPP_H
- #include "dpu_hw_catalog.h"
- #include "dpu_hw_mdss.h"
- #include "dpu_hw_util.h"
- #include "dpu_hw_blk.h"
- #include "dpu_formats.h"
- struct dpu_hw_pipe;
- /**
- * Flags
- */
- #define DPU_SSPP_FLIP_LR BIT(0)
- #define DPU_SSPP_FLIP_UD BIT(1)
- #define DPU_SSPP_SOURCE_ROTATED_90 BIT(2)
- #define DPU_SSPP_ROT_90 BIT(3)
- #define DPU_SSPP_SOLID_FILL BIT(4)
- /**
- * Define all scaler feature bits in catalog
- */
- #define DPU_SSPP_SCALER ((1UL << DPU_SSPP_SCALER_RGB) | \
- (1UL << DPU_SSPP_SCALER_QSEED2) | \
- (1UL << DPU_SSPP_SCALER_QSEED3))
- /**
- * Component indices
- */
- enum {
- DPU_SSPP_COMP_0,
- DPU_SSPP_COMP_1_2,
- DPU_SSPP_COMP_2,
- DPU_SSPP_COMP_3,
- DPU_SSPP_COMP_MAX
- };
- /**
- * DPU_SSPP_RECT_SOLO - multirect disabled
- * DPU_SSPP_RECT_0 - rect0 of a multirect pipe
- * DPU_SSPP_RECT_1 - rect1 of a multirect pipe
- *
- * Note: HW supports multirect with either RECT0 or
- * RECT1. Considering no benefit of such configs over
- * SOLO mode and to keep the plane management simple,
- * we dont support single rect multirect configs.
- */
- enum dpu_sspp_multirect_index {
- DPU_SSPP_RECT_SOLO = 0,
- DPU_SSPP_RECT_0,
- DPU_SSPP_RECT_1,
- };
- enum dpu_sspp_multirect_mode {
- DPU_SSPP_MULTIRECT_NONE = 0,
- DPU_SSPP_MULTIRECT_PARALLEL,
- DPU_SSPP_MULTIRECT_TIME_MX,
- };
- enum {
- DPU_FRAME_LINEAR,
- DPU_FRAME_TILE_A4X,
- DPU_FRAME_TILE_A5X,
- };
- enum dpu_hw_filter {
- DPU_SCALE_FILTER_NEAREST = 0,
- DPU_SCALE_FILTER_BIL,
- DPU_SCALE_FILTER_PCMN,
- DPU_SCALE_FILTER_CA,
- DPU_SCALE_FILTER_MAX
- };
- enum dpu_hw_filter_alpa {
- DPU_SCALE_ALPHA_PIXEL_REP,
- DPU_SCALE_ALPHA_BIL
- };
- enum dpu_hw_filter_yuv {
- DPU_SCALE_2D_4X4,
- DPU_SCALE_2D_CIR,
- DPU_SCALE_1D_SEP,
- DPU_SCALE_BIL
- };
- struct dpu_hw_sharp_cfg {
- u32 strength;
- u32 edge_thr;
- u32 smooth_thr;
- u32 noise_thr;
- };
- struct dpu_hw_pixel_ext {
- /* scaling factors are enabled for this input layer */
- uint8_t enable_pxl_ext;
- int init_phase_x[DPU_MAX_PLANES];
- int phase_step_x[DPU_MAX_PLANES];
- int init_phase_y[DPU_MAX_PLANES];
- int phase_step_y[DPU_MAX_PLANES];
- /*
- * Number of pixels extension in left, right, top and bottom direction
- * for all color components. This pixel value for each color component
- * should be sum of fetch + repeat pixels.
- */
- int num_ext_pxls_left[DPU_MAX_PLANES];
- int num_ext_pxls_right[DPU_MAX_PLANES];
- int num_ext_pxls_top[DPU_MAX_PLANES];
- int num_ext_pxls_btm[DPU_MAX_PLANES];
- /*
- * Number of pixels needs to be overfetched in left, right, top and
- * bottom directions from source image for scaling.
- */
- int left_ftch[DPU_MAX_PLANES];
- int right_ftch[DPU_MAX_PLANES];
- int top_ftch[DPU_MAX_PLANES];
- int btm_ftch[DPU_MAX_PLANES];
- /*
- * Number of pixels needs to be repeated in left, right, top and
- * bottom directions for scaling.
- */
- int left_rpt[DPU_MAX_PLANES];
- int right_rpt[DPU_MAX_PLANES];
- int top_rpt[DPU_MAX_PLANES];
- int btm_rpt[DPU_MAX_PLANES];
- uint32_t roi_w[DPU_MAX_PLANES];
- uint32_t roi_h[DPU_MAX_PLANES];
- /*
- * Filter type to be used for scaling in horizontal and vertical
- * directions
- */
- enum dpu_hw_filter horz_filter[DPU_MAX_PLANES];
- enum dpu_hw_filter vert_filter[DPU_MAX_PLANES];
- };
- /**
- * struct dpu_hw_pipe_cfg : Pipe description
- * @layout: format layout information for programming buffer to hardware
- * @src_rect: src ROI, caller takes into account the different operations
- * such as decimation, flip etc to program this field
- * @dest_rect: destination ROI.
- * @index: index of the rectangle of SSPP
- * @mode: parallel or time multiplex multirect mode
- */
- struct dpu_hw_pipe_cfg {
- struct dpu_hw_fmt_layout layout;
- struct drm_rect src_rect;
- struct drm_rect dst_rect;
- enum dpu_sspp_multirect_index index;
- enum dpu_sspp_multirect_mode mode;
- };
- /**
- * struct dpu_hw_pipe_qos_cfg : Source pipe QoS configuration
- * @danger_lut: LUT for generate danger level based on fill level
- * @safe_lut: LUT for generate safe level based on fill level
- * @creq_lut: LUT for generate creq level based on fill level
- * @creq_vblank: creq value generated to vbif during vertical blanking
- * @danger_vblank: danger value generated during vertical blanking
- * @vblank_en: enable creq_vblank and danger_vblank during vblank
- * @danger_safe_en: enable danger safe generation
- */
- struct dpu_hw_pipe_qos_cfg {
- u32 danger_lut;
- u32 safe_lut;
- u64 creq_lut;
- u32 creq_vblank;
- u32 danger_vblank;
- bool vblank_en;
- bool danger_safe_en;
- };
- /**
- * enum CDP preload ahead address size
- */
- enum {
- DPU_SSPP_CDP_PRELOAD_AHEAD_32,
- DPU_SSPP_CDP_PRELOAD_AHEAD_64
- };
- /**
- * struct dpu_hw_pipe_cdp_cfg : CDP configuration
- * @enable: true to enable CDP
- * @ubwc_meta_enable: true to enable ubwc metadata preload
- * @tile_amortize_enable: true to enable amortization control for tile format
- * @preload_ahead: number of request to preload ahead
- * DPU_SSPP_CDP_PRELOAD_AHEAD_32,
- * DPU_SSPP_CDP_PRELOAD_AHEAD_64
- */
- struct dpu_hw_pipe_cdp_cfg {
- bool enable;
- bool ubwc_meta_enable;
- bool tile_amortize_enable;
- u32 preload_ahead;
- };
- /**
- * struct dpu_hw_pipe_ts_cfg - traffic shaper configuration
- * @size: size to prefill in bytes, or zero to disable
- * @time: time to prefill in usec, or zero to disable
- */
- struct dpu_hw_pipe_ts_cfg {
- u64 size;
- u64 time;
- };
- /**
- * struct dpu_hw_sspp_ops - interface to the SSPP Hw driver functions
- * Caller must call the init function to get the pipe context for each pipe
- * Assumption is these functions will be called after clocks are enabled
- */
- struct dpu_hw_sspp_ops {
- /**
- * setup_format - setup pixel format cropping rectangle, flip
- * @ctx: Pointer to pipe context
- * @cfg: Pointer to pipe config structure
- * @flags: Extra flags for format config
- * @index: rectangle index in multirect
- */
- void (*setup_format)(struct dpu_hw_pipe *ctx,
- const struct dpu_format *fmt, u32 flags,
- enum dpu_sspp_multirect_index index);
- /**
- * setup_rects - setup pipe ROI rectangles
- * @ctx: Pointer to pipe context
- * @cfg: Pointer to pipe config structure
- * @index: rectangle index in multirect
- */
- void (*setup_rects)(struct dpu_hw_pipe *ctx,
- struct dpu_hw_pipe_cfg *cfg,
- enum dpu_sspp_multirect_index index);
- /**
- * setup_pe - setup pipe pixel extension
- * @ctx: Pointer to pipe context
- * @pe_ext: Pointer to pixel ext settings
- */
- void (*setup_pe)(struct dpu_hw_pipe *ctx,
- struct dpu_hw_pixel_ext *pe_ext);
- /**
- * setup_sourceaddress - setup pipe source addresses
- * @ctx: Pointer to pipe context
- * @cfg: Pointer to pipe config structure
- * @index: rectangle index in multirect
- */
- void (*setup_sourceaddress)(struct dpu_hw_pipe *ctx,
- struct dpu_hw_pipe_cfg *cfg,
- enum dpu_sspp_multirect_index index);
- /**
- * setup_csc - setup color space coversion
- * @ctx: Pointer to pipe context
- * @data: Pointer to config structure
- */
- void (*setup_csc)(struct dpu_hw_pipe *ctx, struct dpu_csc_cfg *data);
- /**
- * setup_solidfill - enable/disable colorfill
- * @ctx: Pointer to pipe context
- * @const_color: Fill color value
- * @flags: Pipe flags
- * @index: rectangle index in multirect
- */
- void (*setup_solidfill)(struct dpu_hw_pipe *ctx, u32 color,
- enum dpu_sspp_multirect_index index);
- /**
- * setup_multirect - setup multirect configuration
- * @ctx: Pointer to pipe context
- * @index: rectangle index in multirect
- * @mode: parallel fetch / time multiplex multirect mode
- */
- void (*setup_multirect)(struct dpu_hw_pipe *ctx,
- enum dpu_sspp_multirect_index index,
- enum dpu_sspp_multirect_mode mode);
- /**
- * setup_sharpening - setup sharpening
- * @ctx: Pointer to pipe context
- * @cfg: Pointer to config structure
- */
- void (*setup_sharpening)(struct dpu_hw_pipe *ctx,
- struct dpu_hw_sharp_cfg *cfg);
- /**
- * setup_danger_safe_lut - setup danger safe LUTs
- * @ctx: Pointer to pipe context
- * @cfg: Pointer to pipe QoS configuration
- *
- */
- void (*setup_danger_safe_lut)(struct dpu_hw_pipe *ctx,
- struct dpu_hw_pipe_qos_cfg *cfg);
- /**
- * setup_creq_lut - setup CREQ LUT
- * @ctx: Pointer to pipe context
- * @cfg: Pointer to pipe QoS configuration
- *
- */
- void (*setup_creq_lut)(struct dpu_hw_pipe *ctx,
- struct dpu_hw_pipe_qos_cfg *cfg);
- /**
- * setup_qos_ctrl - setup QoS control
- * @ctx: Pointer to pipe context
- * @cfg: Pointer to pipe QoS configuration
- *
- */
- void (*setup_qos_ctrl)(struct dpu_hw_pipe *ctx,
- struct dpu_hw_pipe_qos_cfg *cfg);
- /**
- * setup_histogram - setup histograms
- * @ctx: Pointer to pipe context
- * @cfg: Pointer to histogram configuration
- */
- void (*setup_histogram)(struct dpu_hw_pipe *ctx,
- void *cfg);
- /**
- * setup_scaler - setup scaler
- * @ctx: Pointer to pipe context
- * @pipe_cfg: Pointer to pipe configuration
- * @pe_cfg: Pointer to pixel extension configuration
- * @scaler_cfg: Pointer to scaler configuration
- */
- void (*setup_scaler)(struct dpu_hw_pipe *ctx,
- struct dpu_hw_pipe_cfg *pipe_cfg,
- struct dpu_hw_pixel_ext *pe_cfg,
- void *scaler_cfg);
- /**
- * get_scaler_ver - get scaler h/w version
- * @ctx: Pointer to pipe context
- */
- u32 (*get_scaler_ver)(struct dpu_hw_pipe *ctx);
- /**
- * setup_cdp - setup client driven prefetch
- * @ctx: Pointer to pipe context
- * @cfg: Pointer to cdp configuration
- */
- void (*setup_cdp)(struct dpu_hw_pipe *ctx,
- struct dpu_hw_pipe_cdp_cfg *cfg);
- };
- /**
- * struct dpu_hw_pipe - pipe description
- * @base: hardware block base structure
- * @hw: block hardware details
- * @catalog: back pointer to catalog
- * @mdp: pointer to associated mdp portion of the catalog
- * @idx: pipe index
- * @cap: pointer to layer_cfg
- * @ops: pointer to operations possible for this pipe
- */
- struct dpu_hw_pipe {
- struct dpu_hw_blk base;
- struct dpu_hw_blk_reg_map hw;
- struct dpu_mdss_cfg *catalog;
- struct dpu_mdp_cfg *mdp;
- /* Pipe */
- enum dpu_sspp idx;
- const struct dpu_sspp_cfg *cap;
- /* Ops */
- struct dpu_hw_sspp_ops ops;
- };
- /**
- * dpu_hw_pipe - convert base object dpu_hw_base to container
- * @hw: Pointer to base hardware block
- * return: Pointer to hardware block container
- */
- static inline struct dpu_hw_pipe *to_dpu_hw_pipe(struct dpu_hw_blk *hw)
- {
- return container_of(hw, struct dpu_hw_pipe, base);
- }
- /**
- * dpu_hw_sspp_init - initializes the sspp hw driver object.
- * Should be called once before accessing every pipe.
- * @idx: Pipe index for which driver object is required
- * @addr: Mapped register io address of MDP
- * @catalog : Pointer to mdss catalog data
- * @is_virtual_pipe: is this pipe virtual pipe
- */
- struct dpu_hw_pipe *dpu_hw_sspp_init(enum dpu_sspp idx,
- void __iomem *addr, struct dpu_mdss_cfg *catalog,
- bool is_virtual_pipe);
- /**
- * dpu_hw_sspp_destroy(): Destroys SSPP driver context
- * should be called during Hw pipe cleanup.
- * @ctx: Pointer to SSPP driver context returned by dpu_hw_sspp_init
- */
- void dpu_hw_sspp_destroy(struct dpu_hw_pipe *ctx);
- #endif /*_DPU_HW_SSPP_H */
|