1
0
Fork 0

MLK-16075-11 gpu: imx: dpu: Add basic fetcheco units support

This patch adds basic fetcheco units support.

Signed-off-by: Liu Ying <victor.liu@nxp.com>
pull/10/head
Liu Ying 2017-06-23 15:59:39 +08:00 committed by Jason Liu
parent c8667523aa
commit 79d9ad555b
5 changed files with 577 additions and 5 deletions

View File

@ -1,6 +1,6 @@
obj-$(CONFIG_IMX_DPU_CORE) += imx-dpu-core.o
imx-dpu-core-objs := dpu-common.o dpu-constframe.o dpu-disengcfg.o \
dpu-extdst.o dpu-fetchdecode.o dpu-framegen.o \
dpu-fetchlayer.o dpu-hscaler.o dpu-layerblend.o \
dpu-tcon.o dpu-vscaler.o
dpu-extdst.o dpu-fetchdecode.o dpu-fetcheco.o \
dpu-framegen.o dpu-fetchlayer.o dpu-hscaler.o \
dpu-layerblend.o dpu-tcon.o dpu-vscaler.o

View File

@ -162,6 +162,12 @@ static const unsigned long fd_ofss_v2[] = {0x6c00, 0x7800};
static const unsigned long fd_pec_ofss_v1[] = {0xb60, 0xb80, 0xb00, 0xb20};
static const unsigned long fd_pec_ofss_v2[] = {0xa80, 0xaa0};
/* Fetch ECO Unit */
static const unsigned long fe_ofss_v1[] = {0x9400, 0xa000, 0x8800, 0x1c00};
static const unsigned long fe_ofss_v2[] = {0x7400, 0x8000, 0x6800, 0x1c00};
static const unsigned long fe_pec_ofss_v1[] = {0xb70, 0xb90, 0xb50, 0x870};
static const unsigned long fe_pec_ofss_v2[] = {0xa90, 0xab0, 0xa70, 0x850};
/* Frame Generator Unit */
static const unsigned long fg_ofss_v1[] = {0x10c00, 0x12800};
static const unsigned long fg_ofss_v2[] = {0xb800, 0xd400};
@ -260,6 +266,22 @@ static const struct dpu_unit fds_v2 = {
.ofss = fd_ofss_v2,
};
static const struct dpu_unit fes_v1 = {
.name = "FetchECO",
.num = ARRAY_SIZE(fe_ids),
.ids = fe_ids,
.pec_ofss = fe_pec_ofss_v1,
.ofss = fe_ofss_v1,
};
static const struct dpu_unit fes_v2 = {
.name = "FetchECO",
.num = ARRAY_SIZE(fe_ids),
.ids = fe_ids,
.pec_ofss = fe_pec_ofss_v2,
.ofss = fe_ofss_v2,
};
static const struct dpu_unit fgs_v1 = {
.name = "FrameGen",
.num = ARRAY_SIZE(fg_ids),
@ -453,13 +475,13 @@ static const unsigned int sw2hw_irq_map_v2[] = {
/* FIXME: overkill for some N/As, revive them when needed */
static const unsigned int sw2hw_block_id_map_v2[] = {
/* 0 1 2 3 4 5 6 7 */
0x00, NA, NA, NA, NA, NA, NA, 0x07,
0x00, NA, NA, 0x03, NA, NA, NA, 0x07,
/* 8 9 10 11 12 13 14 15 */
0x08, NA, 0x0a, NA, 0x0c, NA, 0x0e, NA,
/* 16 17 18 19 20 21 22 23 */
0x10, NA, 0x12, NA, NA, NA, NA, NA,
/* 24 25 26 27 28 29 30 31 */
NA, NA, 0x14, NA, 0x16, NA, 0x18, NA,
NA, NA, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
/* 32 33 34 35 36 37 38 39 */
0x1a, NA, NA, 0x1b, 0x1c, 0x1d, NA, NA,
/* 40 41 42 43 44 45 46 47 */
@ -478,6 +500,7 @@ static const struct dpu_devtype dpu_type_v1 = {
.decs = &decs_v1,
.eds = &eds_v1,
.fds = &fds_v1,
.fes = &fes_v1,
.fgs = &fgs_v1,
.fls = &fls_v1,
.hss = &hss_v1,
@ -500,6 +523,7 @@ static const struct dpu_devtype dpu_type_v2 = {
.decs = &decs_v2,
.eds = &eds_v2,
.fds = &fds_v2,
.fes = &fes_v2,
.fgs = &fgs_v2,
.fls = &fls_v2,
.hss = &hss_v2,
@ -650,6 +674,7 @@ static int dpu_submodules_init(struct dpu_soc *dpu,
DPU_UNITS_INIT(dec);
DPU_UNITS_INIT(ed);
DPU_UNITS_INIT(fd);
DPU_UNITS_INIT(fe);
DPU_UNITS_INIT(fg);
DPU_UNITS_INIT(fl);
DPU_UNITS_INIT(hs);
@ -1387,6 +1412,7 @@ static int dpu_probe(struct platform_device *pdev)
DPU_UNITS_ADDR_DBG(dec);
DPU_UNITS_ADDR_DBG(ed);
DPU_UNITS_ADDR_DBG(fd);
DPU_UNITS_ADDR_DBG(fe);
DPU_UNITS_ADDR_DBG(fg);
DPU_UNITS_ADDR_DBG(fl);
DPU_UNITS_ADDR_DBG(hs);

View File

@ -0,0 +1,512 @@
/*
* Copyright 2017 NXP
*
* 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/io.h>
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/platform_device.h>
#include <linux/types.h>
#include <video/dpu.h>
#include "dpu-prv.h"
#define BASEADDRESS0 0x10
#define SOURCEBUFFERATTRIBUTES0 0x14
#define SOURCEBUFFERDIMENSION0 0x18
#define COLORCOMPONENTBITS0 0x1C
#define COLORCOMPONENTSHIFT0 0x20
#define LAYEROFFSET0 0x24
#define CLIPWINDOWOFFSET0 0x28
#define CLIPWINDOWDIMENSIONS0 0x2C
#define CONSTANTCOLOR0 0x30
#define LAYERPROPERTY0 0x34
#define FRAMEDIMENSIONS 0x38
#define FRAMERESAMPLING 0x3C
#define CONTROL 0x40
#define CONTROLTRIGGER 0x44
#define START 0x48
#define FETCHTYPE 0x4C
#define BURSTBUFFERPROPERTIES 0x50
#define HIDDENSTATUS 0x54
struct dpu_fetcheco {
void __iomem *pec_base;
void __iomem *base;
struct mutex mutex;
int id;
bool inuse;
struct dpu_soc *dpu;
/* see DPU_PLANE_SRC_xxx */
unsigned int stream_id;
};
static inline u32 dpu_pec_fe_read(struct dpu_fetcheco *fe, unsigned int offset)
{
return readl(fe->pec_base + offset);
}
static inline void dpu_pec_fe_write(struct dpu_fetcheco *fe, u32 value,
unsigned int offset)
{
writel(value, fe->pec_base + offset);
}
static inline u32 dpu_fe_read(struct dpu_fetcheco *fe, unsigned int offset)
{
return readl(fe->base + offset);
}
static inline void dpu_fe_write(struct dpu_fetcheco *fe, u32 value,
unsigned int offset)
{
writel(value, fe->base + offset);
}
void fetcheco_shden(struct dpu_fetcheco *fe, bool enable)
{
u32 val;
mutex_lock(&fe->mutex);
val = dpu_fe_read(fe, STATICCONTROL);
if (enable)
val |= SHDEN;
else
val &= ~SHDEN;
dpu_fe_write(fe, val, STATICCONTROL);
mutex_unlock(&fe->mutex);
}
EXPORT_SYMBOL_GPL(fetcheco_shden);
void fetcheco_baseaddress(struct dpu_fetcheco *fe, dma_addr_t paddr)
{
mutex_lock(&fe->mutex);
dpu_fe_write(fe, paddr, BASEADDRESS0);
mutex_unlock(&fe->mutex);
}
EXPORT_SYMBOL_GPL(fetcheco_baseaddress);
void fetcheco_source_bpp(struct dpu_fetcheco *fe, int bpp)
{
u32 val;
mutex_lock(&fe->mutex);
val = dpu_fe_read(fe, SOURCEBUFFERATTRIBUTES0);
val &= ~0x3f0000;
val |= BITSPERPIXEL(bpp);
dpu_fe_write(fe, val, SOURCEBUFFERATTRIBUTES0);
mutex_unlock(&fe->mutex);
}
EXPORT_SYMBOL_GPL(fetcheco_source_bpp);
void fetcheco_source_stride(struct dpu_fetcheco *fe, int stride)
{
u32 val;
mutex_lock(&fe->mutex);
val = dpu_fe_read(fe, SOURCEBUFFERATTRIBUTES0);
val &= ~0xffff;
val |= STRIDE(stride);
dpu_fe_write(fe, val, SOURCEBUFFERATTRIBUTES0);
mutex_unlock(&fe->mutex);
}
EXPORT_SYMBOL_GPL(fetcheco_source_stride);
void fetcheco_src_buf_dimensions(struct dpu_fetcheco *fe, unsigned int w,
unsigned int h, u32 fmt)
{
int width = dpu_format_plane_width(w, fmt, 1);
int height = dpu_format_plane_height(h, fmt, 1);
u32 val;
switch (fmt) {
case DRM_FORMAT_NV12:
case DRM_FORMAT_NV21:
case DRM_FORMAT_NV16:
case DRM_FORMAT_NV61:
case DRM_FORMAT_NV24:
case DRM_FORMAT_NV42:
break;
default:
WARN(1, "Unsupported FetchEco pixel format 0x%08x\n", fmt);
return;
}
val = LINEWIDTH(width) | LINECOUNT(height);
mutex_lock(&fe->mutex);
dpu_fe_write(fe, val, SOURCEBUFFERDIMENSION0);
mutex_unlock(&fe->mutex);
}
EXPORT_SYMBOL_GPL(fetcheco_src_buf_dimensions);
void fetcheco_set_fmt(struct dpu_fetcheco *fe, u32 fmt)
{
u32 val, bits, shift;
int i, hsub, vsub;
unsigned int x, y;
switch (fmt) {
case DRM_FORMAT_NV12:
case DRM_FORMAT_NV21:
case DRM_FORMAT_NV16:
case DRM_FORMAT_NV61:
case DRM_FORMAT_NV24:
case DRM_FORMAT_NV42:
break;
default:
WARN(1, "Unsupported FetchEco pixel format 0x%08x\n", fmt);
return;
}
hsub = dpu_format_horz_chroma_subsampling(fmt);
switch (hsub) {
case 1:
x = 0x4;
break;
case 2:
x = 0x2;
break;
default:
WARN_ON(1);
return;
}
vsub = dpu_format_vert_chroma_subsampling(fmt);
switch (vsub) {
case 1:
y = 0x4;
break;
case 2:
y = 0x2;
break;
default:
WARN_ON(1);
return;
}
mutex_lock(&fe->mutex);
val = dpu_fe_read(fe, FRAMERESAMPLING);
val &= ~(DELTAX_MASK | DELTAY_MASK);
val |= DELTAX(x) | DELTAY(y);
dpu_fe_write(fe, val, FRAMERESAMPLING);
val = dpu_fe_read(fe, CONTROL);
val &= ~RASTERMODE_MASK;
val |= RASTERMODE(RASTERMODE__NORMAL);
dpu_fe_write(fe, val, CONTROL);
mutex_unlock(&fe->mutex);
for (i = 0; i < ARRAY_SIZE(dpu_pixel_format_matrix); i++) {
if (dpu_pixel_format_matrix[i].pixel_format == fmt) {
bits = dpu_pixel_format_matrix[i].bits;
shift = dpu_pixel_format_matrix[i].shift;
bits &= ~Y_BITS_MASK;
shift &= ~Y_SHIFT_MASK;
mutex_lock(&fe->mutex);
dpu_fe_write(fe, bits, COLORCOMPONENTBITS0);
dpu_fe_write(fe, shift, COLORCOMPONENTSHIFT0);
mutex_unlock(&fe->mutex);
return;
}
}
WARN_ON(1);
}
EXPORT_SYMBOL_GPL(fetcheco_set_fmt);
void fetcheco_layeroffset(struct dpu_fetcheco *fe, unsigned int x,
unsigned int y)
{
u32 val;
val = LAYERXOFFSET(x) | LAYERYOFFSET(y);
mutex_lock(&fe->mutex);
dpu_fe_write(fe, val, LAYEROFFSET0);
mutex_unlock(&fe->mutex);
}
EXPORT_SYMBOL_GPL(fetcheco_layeroffset);
void fetcheco_clipoffset(struct dpu_fetcheco *fe, unsigned int x,
unsigned int y)
{
u32 val;
val = CLIPWINDOWXOFFSET(x) | CLIPWINDOWYOFFSET(y);
mutex_lock(&fe->mutex);
dpu_fe_write(fe, val, CLIPWINDOWOFFSET0);
mutex_unlock(&fe->mutex);
}
EXPORT_SYMBOL_GPL(fetcheco_clipoffset);
void fetcheco_clipdimensions(struct dpu_fetcheco *fe, unsigned int w,
unsigned int h)
{
u32 val;
val = CLIPWINDOWWIDTH(w) | CLIPWINDOWHEIGHT(h);
mutex_lock(&fe->mutex);
dpu_fe_write(fe, val, CLIPWINDOWDIMENSIONS0);
mutex_unlock(&fe->mutex);
}
EXPORT_SYMBOL_GPL(fetcheco_clipdimensions);
void fetcheco_source_buffer_enable(struct dpu_fetcheco *fe)
{
u32 val;
mutex_lock(&fe->mutex);
val = dpu_fe_read(fe, LAYERPROPERTY0);
val |= SOURCEBUFFERENABLE;
dpu_fe_write(fe, val, LAYERPROPERTY0);
mutex_unlock(&fe->mutex);
}
EXPORT_SYMBOL_GPL(fetcheco_source_buffer_enable);
void fetcheco_source_buffer_disable(struct dpu_fetcheco *fe)
{
u32 val;
mutex_lock(&fe->mutex);
val = dpu_fe_read(fe, LAYERPROPERTY0);
val &= ~SOURCEBUFFERENABLE;
dpu_fe_write(fe, val, LAYERPROPERTY0);
mutex_unlock(&fe->mutex);
}
EXPORT_SYMBOL_GPL(fetcheco_source_buffer_disable);
bool fetcheco_is_enabled(struct dpu_fetcheco *fe)
{
u32 val;
mutex_lock(&fe->mutex);
val = dpu_fe_read(fe, LAYERPROPERTY0);
mutex_unlock(&fe->mutex);
return !!(val & SOURCEBUFFERENABLE);
}
EXPORT_SYMBOL_GPL(fetcheco_is_enabled);
void fetcheco_framedimensions(struct dpu_fetcheco *fe, unsigned int w,
unsigned int h)
{
u32 val;
val = FRAMEWIDTH(w) | FRAMEHEIGHT(h);
mutex_lock(&fe->mutex);
dpu_fe_write(fe, val, FRAMEDIMENSIONS);
mutex_unlock(&fe->mutex);
}
EXPORT_SYMBOL_GPL(fetcheco_framedimensions);
void fetcheco_frameresampling(struct dpu_fetcheco *fe, unsigned int x,
unsigned int y)
{
u32 val;
mutex_lock(&fe->mutex);
val = dpu_fe_read(fe, FRAMERESAMPLING);
val &= ~(DELTAX_MASK | DELTAY_MASK);
val |= DELTAX(x) | DELTAY(y);
dpu_fe_write(fe, val, FRAMERESAMPLING);
mutex_unlock(&fe->mutex);
}
EXPORT_SYMBOL_GPL(fetcheco_frameresampling);
void fetcheco_controltrigger(struct dpu_fetcheco *fe, bool trigger)
{
u32 val;
val = trigger ? SHDTOKGEN : 0;
mutex_lock(&fe->mutex);
dpu_fe_write(fe, val, CONTROLTRIGGER);
mutex_unlock(&fe->mutex);
}
EXPORT_SYMBOL_GPL(fetcheco_controltrigger);
int fetcheco_fetchtype(struct dpu_fetcheco *fe, fetchtype_t *type)
{
struct dpu_soc *dpu = fe->dpu;
u32 val;
mutex_lock(&fe->mutex);
val = dpu_fe_read(fe, FETCHTYPE);
val &= FETCHTYPE_MASK;
mutex_unlock(&fe->mutex);
switch (val) {
case FETCHTYPE__DECODE:
dev_dbg(dpu->dev, "FetchEco%d with RL and RLAD decoder\n",
fe->id);
break;
case FETCHTYPE__LAYER:
dev_dbg(dpu->dev, "FetchEco%d with fractional "
"plane(8 layers)\n", fe->id);
break;
case FETCHTYPE__WARP:
dev_dbg(dpu->dev, "FetchEco%d with arbitrary warping and "
"fractional plane(8 layers)\n", fe->id);
break;
case FETCHTYPE__ECO:
dev_dbg(dpu->dev, "FetchEco%d with minimum feature set for "
"alpha, chroma and coordinate planes\n",
fe->id);
break;
case FETCHTYPE__PERSP:
dev_dbg(dpu->dev, "FetchEco%d with affine, perspective and "
"arbitrary warping\n", fe->id);
break;
case FETCHTYPE__ROT:
dev_dbg(dpu->dev, "FetchEco%d with affine and arbitrary "
"warping\n", fe->id);
break;
case FETCHTYPE__DECODEL:
dev_dbg(dpu->dev, "FetchEco%d with RL and RLAD decoder, "
"reduced feature set\n", fe->id);
break;
case FETCHTYPE__LAYERL:
dev_dbg(dpu->dev, "FetchEco%d with fractional "
"plane(8 layers), reduced feature set\n",
fe->id);
break;
case FETCHTYPE__ROTL:
dev_dbg(dpu->dev, "FetchEco%d with affine and arbitrary "
"warping, reduced feature set\n", fe->id);
break;
default:
dev_warn(dpu->dev, "Invalid fetch type %u for FetchEco%d\n",
val, fe->id);
return -EINVAL;
}
*type = val;
return 0;
}
EXPORT_SYMBOL_GPL(fetcheco_fetchtype);
dpu_block_id_t fetcheco_get_block_id(struct dpu_fetcheco *fe)
{
switch (fe->id) {
case 0:
return ID_FETCHECO0;
case 1:
return ID_FETCHECO1;
case 2:
return ID_FETCHECO2;
case 9:
return ID_FETCHECO9;
default:
WARN_ON(1);
}
return ID_NONE;
}
EXPORT_SYMBOL_GPL(fetcheco_get_block_id);
unsigned int fetcheco_get_stream_id(struct dpu_fetcheco *fe)
{
return fe->stream_id;
}
EXPORT_SYMBOL_GPL(fetcheco_get_stream_id);
void fetcheco_set_stream_id(struct dpu_fetcheco *fe, unsigned int id)
{
switch (id) {
case DPU_PLANE_SRC_TO_DISP_STREAM0:
case DPU_PLANE_SRC_TO_DISP_STREAM1:
case DPU_PLANE_SRC_DISABLED:
fe->stream_id = id;
break;
default:
WARN_ON(1);
}
}
EXPORT_SYMBOL_GPL(fetcheco_set_stream_id);
struct dpu_fetcheco *dpu_fe_get(struct dpu_soc *dpu, int id)
{
struct dpu_fetcheco *fe;
int i;
for (i = 0; i < ARRAY_SIZE(fe_ids); i++)
if (fe_ids[i] == id)
break;
if (i == ARRAY_SIZE(fe_ids))
return ERR_PTR(-EINVAL);
fe = dpu->fe_priv[i];
mutex_lock(&fe->mutex);
if (fe->inuse) {
fe = ERR_PTR(-EBUSY);
goto out;
}
fe->inuse = true;
out:
mutex_unlock(&fe->mutex);
return fe;
}
EXPORT_SYMBOL_GPL(dpu_fe_get);
void dpu_fe_put(struct dpu_fetcheco *fe)
{
mutex_lock(&fe->mutex);
fe->inuse = false;
mutex_unlock(&fe->mutex);
}
EXPORT_SYMBOL_GPL(dpu_fe_put);
int dpu_fe_init(struct dpu_soc *dpu, unsigned int id,
unsigned long pec_base, unsigned long base)
{
struct dpu_fetcheco *fe;
fe = devm_kzalloc(dpu->dev, sizeof(*fe), GFP_KERNEL);
if (!fe)
return -ENOMEM;
dpu->fe_priv[id] = fe;
fe->pec_base = devm_ioremap(dpu->dev, pec_base, SZ_16);
if (!fe->pec_base)
return -ENOMEM;
fe->base = devm_ioremap(dpu->dev, base, SZ_128);
if (!fe->base)
return -ENOMEM;
fe->dpu = dpu;
fe->id = id;
mutex_init(&fe->mutex);
fetcheco_shden(fe, true);
mutex_lock(&fe->mutex);
dpu_fe_write(fe, SETNUMBUFFERS(16) | SETBURSTLENGTH(16),
BURSTBUFFERMANAGEMENT);
mutex_unlock(&fe->mutex);
return 0;
}

View File

@ -175,6 +175,7 @@ struct dpu_devtype {
const struct dpu_unit *decs;
const struct dpu_unit *eds;
const struct dpu_unit *fds;
const struct dpu_unit *fes;
const struct dpu_unit *fgs;
const struct dpu_unit *fls;
const struct dpu_unit *hss;
@ -218,6 +219,7 @@ struct dpu_soc {
struct dpu_disengcfg *dec_priv[2];
struct dpu_extdst *ed_priv[4];
struct dpu_fetchdecode *fd_priv[4];
struct dpu_fetcheco *fe_priv[4];
struct dpu_framegen *fg_priv[2];
struct dpu_fetchlayer *fl_priv[2];
struct dpu_hscaler *hs_priv[3];
@ -240,6 +242,7 @@ DECLARE_DPU_UNIT_INIT_FUNC(cf);
DECLARE_DPU_UNIT_INIT_FUNC(dec);
DECLARE_DPU_UNIT_INIT_FUNC(ed);
DECLARE_DPU_UNIT_INIT_FUNC(fd);
DECLARE_DPU_UNIT_INIT_FUNC(fe);
DECLARE_DPU_UNIT_INIT_FUNC(fg);
DECLARE_DPU_UNIT_INIT_FUNC(fl);
DECLARE_DPU_UNIT_INIT_FUNC(hs);
@ -251,6 +254,7 @@ static const unsigned int cf_ids[] = {0, 1, 4, 5};
static const unsigned int dec_ids[] = {0, 1};
static const unsigned int ed_ids[] = {0, 1, 4, 5};
static const unsigned int fd_ids[] = {0, 1, 2, 3};
static const unsigned int fe_ids[] = {0, 1, 2, 9};
static const unsigned int fg_ids[] = {0, 1};
static const unsigned int fl_ids[] = {0, 1};
static const unsigned int hs_ids[] = {4, 5, 9};

View File

@ -499,6 +499,36 @@ void fetchdecode_set_stream_id(struct dpu_fetchdecode *fd, unsigned int id);
struct dpu_fetchdecode *dpu_fd_get(struct dpu_soc *dpu, int id);
void dpu_fd_put(struct dpu_fetchdecode *fd);
/* Fetch ECO Unit */
struct dpu_fetcheco;
void fetcheco_shden(struct dpu_fetcheco *fe, bool enable);
void fetcheco_baseaddress(struct dpu_fetcheco *fe, dma_addr_t paddr);
void fetcheco_source_bpp(struct dpu_fetcheco *fe, int bpp);
void fetcheco_source_stride(struct dpu_fetcheco *fe, int stride);
void fetcheco_src_buf_dimensions(struct dpu_fetcheco *fe, unsigned int w,
unsigned int h, u32 fmt);
void fetcheco_set_fmt(struct dpu_fetcheco *fe, u32 fmt);
void fetcheco_layeroffset(struct dpu_fetcheco *fe, unsigned int x,
unsigned int y);
void fetcheco_clipoffset(struct dpu_fetcheco *fe, unsigned int x,
unsigned int y);
void fetcheco_clipdimensions(struct dpu_fetcheco *fe, unsigned int w,
unsigned int h);
void fetcheco_source_buffer_enable(struct dpu_fetcheco *fe);
void fetcheco_source_buffer_disable(struct dpu_fetcheco *fe);
bool fetcheco_is_enabled(struct dpu_fetcheco *fe);
void fetcheco_framedimensions(struct dpu_fetcheco *fe, unsigned int w,
unsigned int h);
void fetcheco_frameresampling(struct dpu_fetcheco *fe, unsigned int x,
unsigned int y);
void fetcheco_controltrigger(struct dpu_fetcheco *fe, bool trigger);
int fetcheco_fetchtype(struct dpu_fetcheco *fe, fetchtype_t *type);
dpu_block_id_t fetcheco_get_block_id(struct dpu_fetcheco *fe);
unsigned int fetcheco_get_stream_id(struct dpu_fetcheco *fe);
void fetcheco_set_stream_id(struct dpu_fetcheco *fe, unsigned int id);
struct dpu_fetcheco *dpu_fe_get(struct dpu_soc *dpu, int id);
void dpu_fe_put(struct dpu_fetcheco *fe);
/* Fetch Layer Unit */
struct dpu_fetchlayer;
void fetchlayer_shden(struct dpu_fetchlayer *fl, bool enable);