mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-02-21 13:46:46 +07:00
drm/msm/dpu: remove cdm block support from resource manager
Support for CDM block is not present in DPU. Remove CDM handlers from resource manager. changes in v4: - Introduced in the series changes in v5: - Remove catalog references to CDM (Sean) Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org> Signed-off-by: Sean Paul <seanpaul@chromium.org> Signed-off-by: Rob Clark <robdclark@gmail.com>
This commit is contained in:
parent
b033def874
commit
9816b22665
@ -58,7 +58,6 @@ msm-y := \
|
||||
disp/dpu1/dpu_formats.o \
|
||||
disp/dpu1/dpu_hw_blk.o \
|
||||
disp/dpu1/dpu_hw_catalog.o \
|
||||
disp/dpu1/dpu_hw_cdm.o \
|
||||
disp/dpu1/dpu_hw_ctl.o \
|
||||
disp/dpu1/dpu_hw_interrupts.o \
|
||||
disp/dpu1/dpu_hw_intf.o \
|
||||
|
@ -32,14 +32,12 @@
|
||||
/**
|
||||
* Encoder functions and data types
|
||||
* @intfs: Interfaces this encoder is using, INTF_MODE_NONE if unused
|
||||
* @needs_cdm: Encoder requests a CDM based on pixel format conversion needs
|
||||
* @display_num_of_h_tiles: Number of horizontal tiles in case of split
|
||||
* interface
|
||||
* @topology: Topology of the display
|
||||
*/
|
||||
struct dpu_encoder_hw_resources {
|
||||
enum dpu_intf_mode intfs[INTF_MAX];
|
||||
bool needs_cdm;
|
||||
u32 display_num_of_h_tiles;
|
||||
};
|
||||
|
||||
|
@ -22,7 +22,6 @@
|
||||
#include "dpu_hw_pingpong.h"
|
||||
#include "dpu_hw_ctl.h"
|
||||
#include "dpu_hw_top.h"
|
||||
#include "dpu_hw_cdm.h"
|
||||
#include "dpu_encoder.h"
|
||||
|
||||
#define DPU_ENCODER_NAME_MAX 16
|
||||
@ -204,8 +203,6 @@ struct dpu_encoder_irq {
|
||||
* @parent_ops: Callbacks exposed by the parent to the phys_enc
|
||||
* @hw_mdptop: Hardware interface to the top registers
|
||||
* @hw_ctl: Hardware interface to the ctl registers
|
||||
* @hw_cdm: Hardware interface to the cdm registers
|
||||
* @cdm_cfg: Chroma-down hardware configuration
|
||||
* @hw_pp: Hardware interface to the ping pong registers
|
||||
* @dpu_kms: Pointer to the dpu_kms top level
|
||||
* @cached_mode: DRM mode cached at mode_set time, acted on in enable
|
||||
@ -235,8 +232,6 @@ struct dpu_encoder_phys {
|
||||
const struct dpu_encoder_virt_ops *parent_ops;
|
||||
struct dpu_hw_mdp *hw_mdptop;
|
||||
struct dpu_hw_ctl *hw_ctl;
|
||||
struct dpu_hw_cdm *hw_cdm;
|
||||
struct dpu_hw_cdm_cfg cdm_cfg;
|
||||
struct dpu_hw_pingpong *hw_pp;
|
||||
struct dpu_kms *dpu_kms;
|
||||
struct drm_display_mode cached_mode;
|
||||
|
@ -294,18 +294,6 @@ static struct dpu_intf_cfg sdm845_intf[] = {
|
||||
INTF_BLK("intf_3", INTF_3, 0x6B800, INTF_DP, 1),
|
||||
};
|
||||
|
||||
/*************************************************************
|
||||
* CDM sub blocks config
|
||||
*************************************************************/
|
||||
static struct dpu_cdm_cfg sdm845_cdm[] = {
|
||||
{
|
||||
.name = "cdm_0", .id = CDM_0,
|
||||
.base = 0x79200, .len = 0x224,
|
||||
.features = 0,
|
||||
.intf_connect = BIT(INTF_3),
|
||||
},
|
||||
};
|
||||
|
||||
/*************************************************************
|
||||
* VBIF sub blocks config
|
||||
*************************************************************/
|
||||
@ -430,8 +418,6 @@ static void sdm845_cfg_init(struct dpu_mdss_cfg *dpu_cfg)
|
||||
.mixer = sdm845_lm,
|
||||
.pingpong_count = ARRAY_SIZE(sdm845_pp),
|
||||
.pingpong = sdm845_pp,
|
||||
.cdm_count = ARRAY_SIZE(sdm845_cdm),
|
||||
.cdm = sdm845_cdm,
|
||||
.intf_count = ARRAY_SIZE(sdm845_intf),
|
||||
.intf = sdm845_intf,
|
||||
.vbif_count = ARRAY_SIZE(sdm845_vbif),
|
||||
|
@ -493,18 +493,6 @@ struct dpu_pingpong_cfg {
|
||||
const struct dpu_pingpong_sub_blks *sblk;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct dpu_cdm_cfg - information of chroma down blocks
|
||||
* @id enum identifying this block
|
||||
* @base register offset of this block
|
||||
* @features bit mask identifying sub-blocks/features
|
||||
* @intf_connect Bitmask of INTF IDs this CDM can connect to
|
||||
*/
|
||||
struct dpu_cdm_cfg {
|
||||
DPU_HW_BLK_INFO;
|
||||
unsigned long intf_connect;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct dpu_intf_cfg - information of timing engine blocks
|
||||
* @id enum identifying this block
|
||||
@ -695,9 +683,6 @@ struct dpu_mdss_cfg {
|
||||
u32 pingpong_count;
|
||||
struct dpu_pingpong_cfg *pingpong;
|
||||
|
||||
u32 cdm_count;
|
||||
struct dpu_cdm_cfg *cdm;
|
||||
|
||||
u32 intf_count;
|
||||
struct dpu_intf_cfg *intf;
|
||||
|
||||
@ -733,7 +718,6 @@ struct dpu_mdss_hw_cfg_handler {
|
||||
#define BLK_CURSOR(s) ((s)->cursor)
|
||||
#define BLK_MIXER(s) ((s)->mixer)
|
||||
#define BLK_PINGPONG(s) ((s)->pingpong)
|
||||
#define BLK_CDM(s) ((s)->cdm)
|
||||
#define BLK_INTF(s) ((s)->intf)
|
||||
#define BLK_AD(s) ((s)->ad)
|
||||
|
||||
|
@ -1,323 +0,0 @@
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
#include "dpu_hw_mdss.h"
|
||||
#include "dpu_hwio.h"
|
||||
#include "dpu_hw_catalog.h"
|
||||
#include "dpu_hw_cdm.h"
|
||||
#include "dpu_dbg.h"
|
||||
#include "dpu_kms.h"
|
||||
|
||||
#define CDM_CSC_10_OPMODE 0x000
|
||||
#define CDM_CSC_10_BASE 0x004
|
||||
|
||||
#define CDM_CDWN2_OP_MODE 0x100
|
||||
#define CDM_CDWN2_CLAMP_OUT 0x104
|
||||
#define CDM_CDWN2_PARAMS_3D_0 0x108
|
||||
#define CDM_CDWN2_PARAMS_3D_1 0x10C
|
||||
#define CDM_CDWN2_COEFF_COSITE_H_0 0x110
|
||||
#define CDM_CDWN2_COEFF_COSITE_H_1 0x114
|
||||
#define CDM_CDWN2_COEFF_COSITE_H_2 0x118
|
||||
#define CDM_CDWN2_COEFF_OFFSITE_H_0 0x11C
|
||||
#define CDM_CDWN2_COEFF_OFFSITE_H_1 0x120
|
||||
#define CDM_CDWN2_COEFF_OFFSITE_H_2 0x124
|
||||
#define CDM_CDWN2_COEFF_COSITE_V 0x128
|
||||
#define CDM_CDWN2_COEFF_OFFSITE_V 0x12C
|
||||
#define CDM_CDWN2_OUT_SIZE 0x130
|
||||
|
||||
#define CDM_HDMI_PACK_OP_MODE 0x200
|
||||
#define CDM_CSC_10_MATRIX_COEFF_0 0x004
|
||||
|
||||
/**
|
||||
* Horizontal coefficients for cosite chroma downscale
|
||||
* s13 representation of coefficients
|
||||
*/
|
||||
static u32 cosite_h_coeff[] = {0x00000016, 0x000001cc, 0x0100009e};
|
||||
|
||||
/**
|
||||
* Horizontal coefficients for offsite chroma downscale
|
||||
*/
|
||||
static u32 offsite_h_coeff[] = {0x000b0005, 0x01db01eb, 0x00e40046};
|
||||
|
||||
/**
|
||||
* Vertical coefficients for cosite chroma downscale
|
||||
*/
|
||||
static u32 cosite_v_coeff[] = {0x00080004};
|
||||
/**
|
||||
* Vertical coefficients for offsite chroma downscale
|
||||
*/
|
||||
static u32 offsite_v_coeff[] = {0x00060002};
|
||||
|
||||
/* Limited Range rgb2yuv coeff with clamp and bias values for CSC 10 module */
|
||||
static struct dpu_csc_cfg rgb2yuv_cfg = {
|
||||
{
|
||||
0x0083, 0x0102, 0x0032,
|
||||
0x1fb5, 0x1f6c, 0x00e1,
|
||||
0x00e1, 0x1f45, 0x1fdc
|
||||
},
|
||||
{ 0x00, 0x00, 0x00 },
|
||||
{ 0x0040, 0x0200, 0x0200 },
|
||||
{ 0x000, 0x3ff, 0x000, 0x3ff, 0x000, 0x3ff },
|
||||
{ 0x040, 0x3ac, 0x040, 0x3c0, 0x040, 0x3c0 },
|
||||
};
|
||||
|
||||
static struct dpu_cdm_cfg *_cdm_offset(enum dpu_cdm cdm,
|
||||
struct dpu_mdss_cfg *m,
|
||||
void __iomem *addr,
|
||||
struct dpu_hw_blk_reg_map *b)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < m->cdm_count; i++) {
|
||||
if (cdm == m->cdm[i].id) {
|
||||
b->base_off = addr;
|
||||
b->blk_off = m->cdm[i].base;
|
||||
b->length = m->cdm[i].len;
|
||||
b->hwversion = m->hwversion;
|
||||
b->log_mask = DPU_DBG_MASK_CDM;
|
||||
return &m->cdm[i];
|
||||
}
|
||||
}
|
||||
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
static int dpu_hw_cdm_setup_csc_10bit(struct dpu_hw_cdm *ctx,
|
||||
struct dpu_csc_cfg *data)
|
||||
{
|
||||
dpu_hw_csc_setup(&ctx->hw, CDM_CSC_10_MATRIX_COEFF_0, data, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dpu_hw_cdm_setup_cdwn(struct dpu_hw_cdm *ctx,
|
||||
struct dpu_hw_cdm_cfg *cfg)
|
||||
{
|
||||
struct dpu_hw_blk_reg_map *c = &ctx->hw;
|
||||
u32 opmode = 0;
|
||||
u32 out_size = 0;
|
||||
|
||||
if (cfg->output_bit_depth == CDM_CDWN_OUTPUT_10BIT)
|
||||
opmode &= ~BIT(7);
|
||||
else
|
||||
opmode |= BIT(7);
|
||||
|
||||
/* ENABLE DWNS_H bit */
|
||||
opmode |= BIT(1);
|
||||
|
||||
switch (cfg->h_cdwn_type) {
|
||||
case CDM_CDWN_DISABLE:
|
||||
/* CLEAR METHOD_H field */
|
||||
opmode &= ~(0x18);
|
||||
/* CLEAR DWNS_H bit */
|
||||
opmode &= ~BIT(1);
|
||||
break;
|
||||
case CDM_CDWN_PIXEL_DROP:
|
||||
/* Clear METHOD_H field (pixel drop is 0) */
|
||||
opmode &= ~(0x18);
|
||||
break;
|
||||
case CDM_CDWN_AVG:
|
||||
/* Clear METHOD_H field (Average is 0x1) */
|
||||
opmode &= ~(0x18);
|
||||
opmode |= (0x1 << 0x3);
|
||||
break;
|
||||
case CDM_CDWN_COSITE:
|
||||
/* Clear METHOD_H field (Average is 0x2) */
|
||||
opmode &= ~(0x18);
|
||||
opmode |= (0x2 << 0x3);
|
||||
/* Co-site horizontal coefficients */
|
||||
DPU_REG_WRITE(c, CDM_CDWN2_COEFF_COSITE_H_0,
|
||||
cosite_h_coeff[0]);
|
||||
DPU_REG_WRITE(c, CDM_CDWN2_COEFF_COSITE_H_1,
|
||||
cosite_h_coeff[1]);
|
||||
DPU_REG_WRITE(c, CDM_CDWN2_COEFF_COSITE_H_2,
|
||||
cosite_h_coeff[2]);
|
||||
break;
|
||||
case CDM_CDWN_OFFSITE:
|
||||
/* Clear METHOD_H field (Average is 0x3) */
|
||||
opmode &= ~(0x18);
|
||||
opmode |= (0x3 << 0x3);
|
||||
|
||||
/* Off-site horizontal coefficients */
|
||||
DPU_REG_WRITE(c, CDM_CDWN2_COEFF_OFFSITE_H_0,
|
||||
offsite_h_coeff[0]);
|
||||
DPU_REG_WRITE(c, CDM_CDWN2_COEFF_OFFSITE_H_1,
|
||||
offsite_h_coeff[1]);
|
||||
DPU_REG_WRITE(c, CDM_CDWN2_COEFF_OFFSITE_H_2,
|
||||
offsite_h_coeff[2]);
|
||||
break;
|
||||
default:
|
||||
pr_err("%s invalid horz down sampling type\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* ENABLE DWNS_V bit */
|
||||
opmode |= BIT(2);
|
||||
|
||||
switch (cfg->v_cdwn_type) {
|
||||
case CDM_CDWN_DISABLE:
|
||||
/* CLEAR METHOD_V field */
|
||||
opmode &= ~(0x60);
|
||||
/* CLEAR DWNS_V bit */
|
||||
opmode &= ~BIT(2);
|
||||
break;
|
||||
case CDM_CDWN_PIXEL_DROP:
|
||||
/* Clear METHOD_V field (pixel drop is 0) */
|
||||
opmode &= ~(0x60);
|
||||
break;
|
||||
case CDM_CDWN_AVG:
|
||||
/* Clear METHOD_V field (Average is 0x1) */
|
||||
opmode &= ~(0x60);
|
||||
opmode |= (0x1 << 0x5);
|
||||
break;
|
||||
case CDM_CDWN_COSITE:
|
||||
/* Clear METHOD_V field (Average is 0x2) */
|
||||
opmode &= ~(0x60);
|
||||
opmode |= (0x2 << 0x5);
|
||||
/* Co-site vertical coefficients */
|
||||
DPU_REG_WRITE(c,
|
||||
CDM_CDWN2_COEFF_COSITE_V,
|
||||
cosite_v_coeff[0]);
|
||||
break;
|
||||
case CDM_CDWN_OFFSITE:
|
||||
/* Clear METHOD_V field (Average is 0x3) */
|
||||
opmode &= ~(0x60);
|
||||
opmode |= (0x3 << 0x5);
|
||||
|
||||
/* Off-site vertical coefficients */
|
||||
DPU_REG_WRITE(c,
|
||||
CDM_CDWN2_COEFF_OFFSITE_V,
|
||||
offsite_v_coeff[0]);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (cfg->v_cdwn_type || cfg->h_cdwn_type)
|
||||
opmode |= BIT(0); /* EN CDWN module */
|
||||
else
|
||||
opmode &= ~BIT(0);
|
||||
|
||||
out_size = (cfg->output_width & 0xFFFF) |
|
||||
((cfg->output_height & 0xFFFF) << 16);
|
||||
DPU_REG_WRITE(c, CDM_CDWN2_OUT_SIZE, out_size);
|
||||
DPU_REG_WRITE(c, CDM_CDWN2_OP_MODE, opmode);
|
||||
DPU_REG_WRITE(c, CDM_CDWN2_CLAMP_OUT,
|
||||
((0x3FF << 16) | 0x0));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dpu_hw_cdm_enable(struct dpu_hw_cdm *ctx,
|
||||
struct dpu_hw_cdm_cfg *cdm)
|
||||
{
|
||||
struct dpu_hw_blk_reg_map *c = &ctx->hw;
|
||||
const struct dpu_format *fmt = cdm->output_fmt;
|
||||
struct cdm_output_cfg cdm_cfg = { 0 };
|
||||
u32 opmode = 0;
|
||||
u32 csc = 0;
|
||||
|
||||
if (!DPU_FORMAT_IS_YUV(fmt))
|
||||
return -EINVAL;
|
||||
|
||||
if (cdm->output_type == CDM_CDWN_OUTPUT_HDMI) {
|
||||
if (fmt->chroma_sample != DPU_CHROMA_H1V2)
|
||||
return -EINVAL; /*unsupported format */
|
||||
opmode = BIT(0);
|
||||
opmode |= (fmt->chroma_sample << 1);
|
||||
cdm_cfg.intf_en = true;
|
||||
}
|
||||
|
||||
csc |= BIT(2);
|
||||
csc &= ~BIT(1);
|
||||
csc |= BIT(0);
|
||||
|
||||
if (ctx->hw_mdp && ctx->hw_mdp->ops.setup_cdm_output)
|
||||
ctx->hw_mdp->ops.setup_cdm_output(ctx->hw_mdp, &cdm_cfg);
|
||||
|
||||
DPU_REG_WRITE(c, CDM_CSC_10_OPMODE, csc);
|
||||
DPU_REG_WRITE(c, CDM_HDMI_PACK_OP_MODE, opmode);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void dpu_hw_cdm_disable(struct dpu_hw_cdm *ctx)
|
||||
{
|
||||
struct cdm_output_cfg cdm_cfg = { 0 };
|
||||
|
||||
if (ctx->hw_mdp && ctx->hw_mdp->ops.setup_cdm_output)
|
||||
ctx->hw_mdp->ops.setup_cdm_output(ctx->hw_mdp, &cdm_cfg);
|
||||
}
|
||||
|
||||
static void _setup_cdm_ops(struct dpu_hw_cdm_ops *ops,
|
||||
unsigned long features)
|
||||
{
|
||||
ops->setup_csc_data = dpu_hw_cdm_setup_csc_10bit;
|
||||
ops->setup_cdwn = dpu_hw_cdm_setup_cdwn;
|
||||
ops->enable = dpu_hw_cdm_enable;
|
||||
ops->disable = dpu_hw_cdm_disable;
|
||||
}
|
||||
|
||||
static struct dpu_hw_blk_ops dpu_hw_ops = {
|
||||
.start = NULL,
|
||||
.stop = NULL,
|
||||
};
|
||||
|
||||
struct dpu_hw_cdm *dpu_hw_cdm_init(enum dpu_cdm idx,
|
||||
void __iomem *addr,
|
||||
struct dpu_mdss_cfg *m,
|
||||
struct dpu_hw_mdp *hw_mdp)
|
||||
{
|
||||
struct dpu_hw_cdm *c;
|
||||
struct dpu_cdm_cfg *cfg;
|
||||
int rc;
|
||||
|
||||
c = kzalloc(sizeof(*c), GFP_KERNEL);
|
||||
if (!c)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
cfg = _cdm_offset(idx, m, addr, &c->hw);
|
||||
if (IS_ERR_OR_NULL(cfg)) {
|
||||
kfree(c);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
c->idx = idx;
|
||||
c->caps = cfg;
|
||||
_setup_cdm_ops(&c->ops, c->caps->features);
|
||||
c->hw_mdp = hw_mdp;
|
||||
|
||||
rc = dpu_hw_blk_init(&c->base, DPU_HW_BLK_CDM, idx, &dpu_hw_ops);
|
||||
if (rc) {
|
||||
DPU_ERROR("failed to init hw blk %d\n", rc);
|
||||
goto blk_init_error;
|
||||
}
|
||||
|
||||
/*
|
||||
* Perform any default initialization for the chroma down module
|
||||
* @setup default csc coefficients
|
||||
*/
|
||||
dpu_hw_cdm_setup_csc_10bit(c, &rgb2yuv_cfg);
|
||||
|
||||
return c;
|
||||
|
||||
blk_init_error:
|
||||
kzfree(c);
|
||||
|
||||
return ERR_PTR(rc);
|
||||
}
|
||||
|
||||
void dpu_hw_cdm_destroy(struct dpu_hw_cdm *cdm)
|
||||
{
|
||||
if (cdm)
|
||||
dpu_hw_blk_destroy(&cdm->base);
|
||||
kfree(cdm);
|
||||
}
|
@ -1,139 +0,0 @@
|
||||
/* 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_CDM_H
|
||||
#define _DPU_HW_CDM_H
|
||||
|
||||
#include "dpu_hw_mdss.h"
|
||||
#include "dpu_hw_top.h"
|
||||
#include "dpu_hw_blk.h"
|
||||
|
||||
struct dpu_hw_cdm;
|
||||
|
||||
struct dpu_hw_cdm_cfg {
|
||||
u32 output_width;
|
||||
u32 output_height;
|
||||
u32 output_bit_depth;
|
||||
u32 h_cdwn_type;
|
||||
u32 v_cdwn_type;
|
||||
const struct dpu_format *output_fmt;
|
||||
u32 output_type;
|
||||
int flags;
|
||||
};
|
||||
|
||||
enum dpu_hw_cdwn_type {
|
||||
CDM_CDWN_DISABLE,
|
||||
CDM_CDWN_PIXEL_DROP,
|
||||
CDM_CDWN_AVG,
|
||||
CDM_CDWN_COSITE,
|
||||
CDM_CDWN_OFFSITE,
|
||||
};
|
||||
|
||||
enum dpu_hw_cdwn_output_type {
|
||||
CDM_CDWN_OUTPUT_HDMI,
|
||||
CDM_CDWN_OUTPUT_WB,
|
||||
};
|
||||
|
||||
enum dpu_hw_cdwn_output_bit_depth {
|
||||
CDM_CDWN_OUTPUT_8BIT,
|
||||
CDM_CDWN_OUTPUT_10BIT,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct dpu_hw_cdm_ops : Interface to the chroma down Hw driver functions
|
||||
* Assumption is these functions will be called after
|
||||
* clocks are enabled
|
||||
* @setup_csc: Programs the csc matrix
|
||||
* @setup_cdwn: Sets up the chroma down sub module
|
||||
* @enable: Enables the output to interface and programs the
|
||||
* output packer
|
||||
* @disable: Puts the cdm in bypass mode
|
||||
*/
|
||||
struct dpu_hw_cdm_ops {
|
||||
/**
|
||||
* Programs the CSC matrix for conversion from RGB space to YUV space,
|
||||
* it is optional to call this function as this matrix is automatically
|
||||
* set during initialization, user should call this if it wants
|
||||
* to program a different matrix than default matrix.
|
||||
* @cdm: Pointer to the chroma down context structure
|
||||
* @data Pointer to CSC configuration data
|
||||
* return: 0 if success; error code otherwise
|
||||
*/
|
||||
int (*setup_csc_data)(struct dpu_hw_cdm *cdm,
|
||||
struct dpu_csc_cfg *data);
|
||||
|
||||
/**
|
||||
* Programs the Chroma downsample part.
|
||||
* @cdm Pointer to chroma down context
|
||||
*/
|
||||
int (*setup_cdwn)(struct dpu_hw_cdm *cdm,
|
||||
struct dpu_hw_cdm_cfg *cfg);
|
||||
|
||||
/**
|
||||
* Enable the CDM module
|
||||
* @cdm Pointer to chroma down context
|
||||
*/
|
||||
int (*enable)(struct dpu_hw_cdm *cdm,
|
||||
struct dpu_hw_cdm_cfg *cfg);
|
||||
|
||||
/**
|
||||
* Disable the CDM module
|
||||
* @cdm Pointer to chroma down context
|
||||
*/
|
||||
void (*disable)(struct dpu_hw_cdm *cdm);
|
||||
};
|
||||
|
||||
struct dpu_hw_cdm {
|
||||
struct dpu_hw_blk base;
|
||||
struct dpu_hw_blk_reg_map hw;
|
||||
|
||||
/* chroma down */
|
||||
const struct dpu_cdm_cfg *caps;
|
||||
enum dpu_cdm idx;
|
||||
|
||||
/* mdp top hw driver */
|
||||
struct dpu_hw_mdp *hw_mdp;
|
||||
|
||||
/* ops */
|
||||
struct dpu_hw_cdm_ops ops;
|
||||
};
|
||||
|
||||
/**
|
||||
* dpu_hw_cdm - 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_cdm *to_dpu_hw_cdm(struct dpu_hw_blk *hw)
|
||||
{
|
||||
return container_of(hw, struct dpu_hw_cdm, base);
|
||||
}
|
||||
|
||||
/**
|
||||
* dpu_hw_cdm_init - initializes the cdm hw driver object.
|
||||
* should be called once before accessing every cdm.
|
||||
* @idx: cdm index for which driver object is required
|
||||
* @addr: mapped register io address of MDP
|
||||
* @m : pointer to mdss catalog data
|
||||
* @hw_mdp: pointer to mdp top hw driver object
|
||||
*/
|
||||
struct dpu_hw_cdm *dpu_hw_cdm_init(enum dpu_cdm idx,
|
||||
void __iomem *addr,
|
||||
struct dpu_mdss_cfg *m,
|
||||
struct dpu_hw_mdp *hw_mdp);
|
||||
|
||||
/**
|
||||
* dpu_hw_cdm_destroy - destroys CDM driver context
|
||||
* @cdm: pointer to CDM driver context
|
||||
*/
|
||||
void dpu_hw_cdm_destroy(struct dpu_hw_cdm *cdm);
|
||||
|
||||
#endif /*_DPU_HW_CDM_H */
|
@ -224,19 +224,6 @@ static inline int dpu_hw_ctl_get_bitmask_intf(struct dpu_hw_ctl *ctx,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int dpu_hw_ctl_get_bitmask_cdm(struct dpu_hw_ctl *ctx,
|
||||
u32 *flushbits, enum dpu_cdm cdm)
|
||||
{
|
||||
switch (cdm) {
|
||||
case CDM_0:
|
||||
*flushbits |= BIT(26);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u32 dpu_hw_ctl_poll_reset_status(struct dpu_hw_ctl *ctx, u32 timeout_us)
|
||||
{
|
||||
struct dpu_hw_blk_reg_map *c = &ctx->hw;
|
||||
@ -485,7 +472,6 @@ static void _setup_ctl_ops(struct dpu_hw_ctl_ops *ops,
|
||||
ops->get_bitmask_sspp = dpu_hw_ctl_get_bitmask_sspp;
|
||||
ops->get_bitmask_mixer = dpu_hw_ctl_get_bitmask_mixer;
|
||||
ops->get_bitmask_intf = dpu_hw_ctl_get_bitmask_intf;
|
||||
ops->get_bitmask_cdm = dpu_hw_ctl_get_bitmask_cdm;
|
||||
};
|
||||
|
||||
static struct dpu_hw_blk_ops dpu_hw_ops = {
|
||||
|
@ -142,10 +142,6 @@ struct dpu_hw_ctl_ops {
|
||||
u32 *flushbits,
|
||||
enum dpu_intf blk);
|
||||
|
||||
int (*get_bitmask_cdm)(struct dpu_hw_ctl *ctx,
|
||||
u32 *flushbits,
|
||||
enum dpu_cdm blk);
|
||||
|
||||
/**
|
||||
* Set all blend stages to disabled
|
||||
* @ctx : ctl path ctx pointer
|
||||
|
@ -100,7 +100,6 @@ enum dpu_hw_blk_type {
|
||||
DPU_HW_BLK_SSPP,
|
||||
DPU_HW_BLK_LM,
|
||||
DPU_HW_BLK_CTL,
|
||||
DPU_HW_BLK_CDM,
|
||||
DPU_HW_BLK_PINGPONG,
|
||||
DPU_HW_BLK_INTF,
|
||||
DPU_HW_BLK_WB,
|
||||
@ -182,12 +181,6 @@ enum dpu_ctl {
|
||||
CTL_MAX
|
||||
};
|
||||
|
||||
enum dpu_cdm {
|
||||
CDM_0 = 1,
|
||||
CDM_1,
|
||||
CDM_MAX
|
||||
};
|
||||
|
||||
enum dpu_pingpong {
|
||||
PINGPONG_0 = 1,
|
||||
PINGPONG_1,
|
||||
@ -444,15 +437,14 @@ struct dpu_mdss_color {
|
||||
* Define bit masks for h/w logging.
|
||||
*/
|
||||
#define DPU_DBG_MASK_NONE (1 << 0)
|
||||
#define DPU_DBG_MASK_CDM (1 << 1)
|
||||
#define DPU_DBG_MASK_INTF (1 << 2)
|
||||
#define DPU_DBG_MASK_LM (1 << 3)
|
||||
#define DPU_DBG_MASK_CTL (1 << 4)
|
||||
#define DPU_DBG_MASK_PINGPONG (1 << 5)
|
||||
#define DPU_DBG_MASK_SSPP (1 << 6)
|
||||
#define DPU_DBG_MASK_WB (1 << 7)
|
||||
#define DPU_DBG_MASK_TOP (1 << 8)
|
||||
#define DPU_DBG_MASK_VBIF (1 << 9)
|
||||
#define DPU_DBG_MASK_ROT (1 << 10)
|
||||
#define DPU_DBG_MASK_INTF (1 << 1)
|
||||
#define DPU_DBG_MASK_LM (1 << 2)
|
||||
#define DPU_DBG_MASK_CTL (1 << 3)
|
||||
#define DPU_DBG_MASK_PINGPONG (1 << 4)
|
||||
#define DPU_DBG_MASK_SSPP (1 << 5)
|
||||
#define DPU_DBG_MASK_WB (1 << 6)
|
||||
#define DPU_DBG_MASK_TOP (1 << 7)
|
||||
#define DPU_DBG_MASK_VBIF (1 << 8)
|
||||
#define DPU_DBG_MASK_ROT (1 << 9)
|
||||
|
||||
#endif /* _DPU_HW_MDSS_H */
|
||||
|
@ -98,23 +98,6 @@ static void dpu_hw_setup_split_pipe(struct dpu_hw_mdp *mdp,
|
||||
DPU_REG_WRITE(c, SPLIT_DISPLAY_EN, cfg->en & 0x1);
|
||||
}
|
||||
|
||||
static void dpu_hw_setup_cdm_output(struct dpu_hw_mdp *mdp,
|
||||
struct cdm_output_cfg *cfg)
|
||||
{
|
||||
struct dpu_hw_blk_reg_map *c;
|
||||
u32 out_ctl = 0;
|
||||
|
||||
if (!mdp || !cfg)
|
||||
return;
|
||||
|
||||
c = &mdp->hw;
|
||||
|
||||
if (cfg->intf_en)
|
||||
out_ctl |= BIT(19);
|
||||
|
||||
DPU_REG_WRITE(c, MDP_OUT_CTL_0, out_ctl);
|
||||
}
|
||||
|
||||
static bool dpu_hw_setup_clk_force_ctrl(struct dpu_hw_mdp *mdp,
|
||||
enum dpu_clk_ctrl_type clk_ctrl, bool enable)
|
||||
{
|
||||
@ -307,7 +290,6 @@ static void _setup_mdp_ops(struct dpu_hw_mdp_ops *ops,
|
||||
unsigned long cap)
|
||||
{
|
||||
ops->setup_split_pipe = dpu_hw_setup_split_pipe;
|
||||
ops->setup_cdm_output = dpu_hw_setup_cdm_output;
|
||||
ops->setup_clk_force_ctrl = dpu_hw_setup_clk_force_ctrl;
|
||||
ops->get_danger_status = dpu_hw_get_danger_status;
|
||||
ops->setup_vsync_source = dpu_hw_setup_vsync_source;
|
||||
|
@ -51,14 +51,6 @@ struct split_pipe_cfg {
|
||||
bool split_flush_en;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct cdm_output_cfg: output configuration for cdm
|
||||
* @intf_en : enable/disable interface output
|
||||
*/
|
||||
struct cdm_output_cfg {
|
||||
bool intf_en;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct dpu_danger_safe_status: danger and safe status signals
|
||||
* @mdp: top level status
|
||||
@ -89,7 +81,6 @@ struct dpu_vsync_source_cfg {
|
||||
* Assumption is these functions will be called after clocks are enabled.
|
||||
* @setup_split_pipe : Programs the pipe control registers
|
||||
* @setup_pp_split : Programs the pp split control registers
|
||||
* @setup_cdm_output : programs cdm control
|
||||
* @setup_traffic_shaper : programs traffic shaper control
|
||||
*/
|
||||
struct dpu_hw_mdp_ops {
|
||||
@ -101,14 +92,6 @@ struct dpu_hw_mdp_ops {
|
||||
void (*setup_split_pipe)(struct dpu_hw_mdp *mdp,
|
||||
struct split_pipe_cfg *p);
|
||||
|
||||
/**
|
||||
* setup_cdm_output() : Setup selection control of the cdm data path
|
||||
* @mdp : mdp top context driver
|
||||
* @cfg : cdm output configuration
|
||||
*/
|
||||
void (*setup_cdm_output)(struct dpu_hw_mdp *mdp,
|
||||
struct cdm_output_cfg *cfg);
|
||||
|
||||
/**
|
||||
* setup_traffic_shaper() : Setup traffic shaper control
|
||||
* @mdp : mdp top context driver
|
||||
|
@ -16,7 +16,6 @@
|
||||
#include "dpu_kms.h"
|
||||
#include "dpu_hw_lm.h"
|
||||
#include "dpu_hw_ctl.h"
|
||||
#include "dpu_hw_cdm.h"
|
||||
#include "dpu_hw_pingpong.h"
|
||||
#include "dpu_hw_intf.h"
|
||||
#include "dpu_encoder.h"
|
||||
@ -228,9 +227,6 @@ static void _dpu_rm_hw_destroy(enum dpu_hw_blk_type type, void *hw)
|
||||
case DPU_HW_BLK_CTL:
|
||||
dpu_hw_ctl_destroy(hw);
|
||||
break;
|
||||
case DPU_HW_BLK_CDM:
|
||||
dpu_hw_cdm_destroy(hw);
|
||||
break;
|
||||
case DPU_HW_BLK_PINGPONG:
|
||||
dpu_hw_pingpong_destroy(hw);
|
||||
break;
|
||||
@ -304,9 +300,6 @@ static int _dpu_rm_hw_blk_create(
|
||||
case DPU_HW_BLK_CTL:
|
||||
hw = dpu_hw_ctl_init(id, mmio, cat);
|
||||
break;
|
||||
case DPU_HW_BLK_CDM:
|
||||
hw = dpu_hw_cdm_init(id, mmio, cat, hw_mdp);
|
||||
break;
|
||||
case DPU_HW_BLK_PINGPONG:
|
||||
hw = dpu_hw_pingpong_init(id, mmio, cat);
|
||||
break;
|
||||
@ -437,15 +430,6 @@ int dpu_rm_init(struct dpu_rm *rm,
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < cat->cdm_count; i++) {
|
||||
rc = _dpu_rm_hw_blk_create(rm, cat, mmio, DPU_HW_BLK_CDM,
|
||||
cat->cdm[i].id, &cat->cdm[i]);
|
||||
if (rc) {
|
||||
DPU_ERROR("failed: cdm hw not available\n");
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
@ -642,55 +626,11 @@ static int _dpu_rm_reserve_ctls(
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int _dpu_rm_reserve_cdm(
|
||||
struct dpu_rm *rm,
|
||||
struct dpu_rm_rsvp *rsvp,
|
||||
uint32_t id,
|
||||
enum dpu_hw_blk_type type)
|
||||
{
|
||||
struct dpu_rm_hw_iter iter;
|
||||
|
||||
DRM_DEBUG_KMS("type %d id %d\n", type, id);
|
||||
|
||||
dpu_rm_init_hw_iter(&iter, 0, DPU_HW_BLK_CDM);
|
||||
while (_dpu_rm_get_hw_locked(rm, &iter)) {
|
||||
const struct dpu_hw_cdm *cdm = to_dpu_hw_cdm(iter.blk->hw);
|
||||
const struct dpu_cdm_cfg *caps = cdm->caps;
|
||||
bool match = false;
|
||||
|
||||
if (RESERVED_BY_OTHER(iter.blk, rsvp))
|
||||
continue;
|
||||
|
||||
if (type == DPU_HW_BLK_INTF && id != INTF_MAX)
|
||||
match = test_bit(id, &caps->intf_connect);
|
||||
|
||||
DRM_DEBUG_KMS("iter: type:%d id:%d enc:%d cdm:%lu match:%d\n",
|
||||
iter.blk->type, iter.blk->id, rsvp->enc_id,
|
||||
caps->intf_connect, match);
|
||||
|
||||
if (!match)
|
||||
continue;
|
||||
|
||||
trace_dpu_rm_reserve_cdm(iter.blk->id, iter.blk->type,
|
||||
rsvp->enc_id);
|
||||
iter.blk->rsvp_nxt = rsvp;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!iter.hw) {
|
||||
DPU_ERROR("couldn't reserve cdm for type %d id %d\n", type, id);
|
||||
return -ENAVAIL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int _dpu_rm_reserve_intf(
|
||||
struct dpu_rm *rm,
|
||||
struct dpu_rm_rsvp *rsvp,
|
||||
uint32_t id,
|
||||
enum dpu_hw_blk_type type,
|
||||
bool needs_cdm)
|
||||
enum dpu_hw_blk_type type)
|
||||
{
|
||||
struct dpu_rm_hw_iter iter;
|
||||
int ret = 0;
|
||||
@ -718,9 +658,6 @@ static int _dpu_rm_reserve_intf(
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (needs_cdm)
|
||||
ret = _dpu_rm_reserve_cdm(rm, rsvp, id, type);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -737,7 +674,7 @@ static int _dpu_rm_reserve_intf_related_hw(
|
||||
continue;
|
||||
id = i + INTF_0;
|
||||
ret = _dpu_rm_reserve_intf(rm, rsvp, id,
|
||||
DPU_HW_BLK_INTF, hw_res->needs_cdm);
|
||||
DPU_HW_BLK_INTF);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
@ -784,7 +721,6 @@ static int _dpu_rm_make_next_rsvp(
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Assign INTFs and blks whose usage is tied to them: CTL & CDM */
|
||||
ret = _dpu_rm_reserve_intf_related_hw(rm, rsvp, &reqs->hw_res);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -868,10 +868,6 @@ DECLARE_EVENT_CLASS(dpu_rm_iter_template,
|
||||
TP_printk("id:%d type:%d enc_id:%u", __entry->id, __entry->type,
|
||||
__entry->enc_id)
|
||||
);
|
||||
DEFINE_EVENT(dpu_rm_iter_template, dpu_rm_reserve_cdm,
|
||||
TP_PROTO(uint32_t id, enum dpu_hw_blk_type type, uint32_t enc_id),
|
||||
TP_ARGS(id, type, enc_id)
|
||||
);
|
||||
DEFINE_EVENT(dpu_rm_iter_template, dpu_rm_reserve_intf,
|
||||
TP_PROTO(uint32_t id, enum dpu_hw_blk_type type, uint32_t enc_id),
|
||||
TP_ARGS(id, type, enc_id)
|
||||
|
Loading…
Reference in New Issue
Block a user