mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 14:42:24 +00:00
media: vsp1: Adapt entities to configure into a body
Currently the entities store their configurations into a display list. Adapt this such that the code can be configured into a body directly, allowing greater flexibility and control of the content. All users of vsp1_dl_list_write() are removed in this process, thus it too is removed. A helper, vsp1_dl_list_get_body0() is provided to access the internal body0 from the display list. [laurent.pinchart+renesas@ideasonboard.com: Don't remove blank line unnecessarily] Signed-off-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
parent
46ce3639a5
commit
12832dd9dd
@ -26,10 +26,10 @@
|
||||
* Device Access
|
||||
*/
|
||||
|
||||
static inline void vsp1_brx_write(struct vsp1_brx *brx, struct vsp1_dl_list *dl,
|
||||
u32 reg, u32 data)
|
||||
static inline void vsp1_brx_write(struct vsp1_brx *brx,
|
||||
struct vsp1_dl_body *dlb, u32 reg, u32 data)
|
||||
{
|
||||
vsp1_dl_list_write(dl, brx->base + reg, data);
|
||||
vsp1_dl_body_write(dlb, brx->base + reg, data);
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
@ -283,7 +283,7 @@ static const struct v4l2_subdev_ops brx_ops = {
|
||||
|
||||
static void brx_configure_stream(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl)
|
||||
struct vsp1_dl_body *dlb)
|
||||
{
|
||||
struct vsp1_brx *brx = to_brx(&entity->subdev);
|
||||
struct v4l2_mbus_framefmt *format;
|
||||
@ -305,7 +305,7 @@ static void brx_configure_stream(struct vsp1_entity *entity,
|
||||
* format at the pipeline output is premultiplied.
|
||||
*/
|
||||
flags = pipe->output ? pipe->output->format.flags : 0;
|
||||
vsp1_brx_write(brx, dl, VI6_BRU_INCTRL,
|
||||
vsp1_brx_write(brx, dlb, VI6_BRU_INCTRL,
|
||||
flags & V4L2_PIX_FMT_FLAG_PREMUL_ALPHA ?
|
||||
0 : VI6_BRU_INCTRL_NRM);
|
||||
|
||||
@ -313,12 +313,12 @@ static void brx_configure_stream(struct vsp1_entity *entity,
|
||||
* Set the background position to cover the whole output image and
|
||||
* configure its color.
|
||||
*/
|
||||
vsp1_brx_write(brx, dl, VI6_BRU_VIRRPF_SIZE,
|
||||
vsp1_brx_write(brx, dlb, VI6_BRU_VIRRPF_SIZE,
|
||||
(format->width << VI6_BRU_VIRRPF_SIZE_HSIZE_SHIFT) |
|
||||
(format->height << VI6_BRU_VIRRPF_SIZE_VSIZE_SHIFT));
|
||||
vsp1_brx_write(brx, dl, VI6_BRU_VIRRPF_LOC, 0);
|
||||
vsp1_brx_write(brx, dlb, VI6_BRU_VIRRPF_LOC, 0);
|
||||
|
||||
vsp1_brx_write(brx, dl, VI6_BRU_VIRRPF_COL, brx->bgcolor |
|
||||
vsp1_brx_write(brx, dlb, VI6_BRU_VIRRPF_COL, brx->bgcolor |
|
||||
(0xff << VI6_BRU_VIRRPF_COL_A_SHIFT));
|
||||
|
||||
/*
|
||||
@ -328,7 +328,7 @@ static void brx_configure_stream(struct vsp1_entity *entity,
|
||||
* unit.
|
||||
*/
|
||||
if (entity->type == VSP1_ENTITY_BRU)
|
||||
vsp1_brx_write(brx, dl, VI6_BRU_ROP,
|
||||
vsp1_brx_write(brx, dlb, VI6_BRU_ROP,
|
||||
VI6_BRU_ROP_DSTSEL_BRUIN(1) |
|
||||
VI6_BRU_ROP_CROP(VI6_ROP_NOP) |
|
||||
VI6_BRU_ROP_AROP(VI6_ROP_NOP));
|
||||
@ -370,7 +370,7 @@ static void brx_configure_stream(struct vsp1_entity *entity,
|
||||
if (!(entity->type == VSP1_ENTITY_BRU && i == 1))
|
||||
ctrl |= VI6_BRU_CTRL_SRCSEL_BRUIN(i);
|
||||
|
||||
vsp1_brx_write(brx, dl, VI6_BRU_CTRL(i), ctrl);
|
||||
vsp1_brx_write(brx, dlb, VI6_BRU_CTRL(i), ctrl);
|
||||
|
||||
/*
|
||||
* Harcode the blending formula to
|
||||
@ -385,7 +385,7 @@ static void brx_configure_stream(struct vsp1_entity *entity,
|
||||
*
|
||||
* otherwise.
|
||||
*/
|
||||
vsp1_brx_write(brx, dl, VI6_BRU_BLD(i),
|
||||
vsp1_brx_write(brx, dlb, VI6_BRU_BLD(i),
|
||||
VI6_BRU_BLD_CCMDX_255_SRC_A |
|
||||
(premultiplied ? VI6_BRU_BLD_CCMDY_COEFY :
|
||||
VI6_BRU_BLD_CCMDY_SRC_A) |
|
||||
|
@ -25,10 +25,10 @@
|
||||
* Device Access
|
||||
*/
|
||||
|
||||
static inline void vsp1_clu_write(struct vsp1_clu *clu, struct vsp1_dl_list *dl,
|
||||
u32 reg, u32 data)
|
||||
static inline void vsp1_clu_write(struct vsp1_clu *clu,
|
||||
struct vsp1_dl_body *dlb, u32 reg, u32 data)
|
||||
{
|
||||
vsp1_dl_list_write(dl, reg, data);
|
||||
vsp1_dl_body_write(dlb, reg, data);
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
@ -171,7 +171,7 @@ static const struct v4l2_subdev_ops clu_ops = {
|
||||
|
||||
static void clu_configure_stream(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl)
|
||||
struct vsp1_dl_body *dlb)
|
||||
{
|
||||
struct vsp1_clu *clu = to_clu(&entity->subdev);
|
||||
struct v4l2_mbus_framefmt *format;
|
||||
@ -188,10 +188,11 @@ static void clu_configure_stream(struct vsp1_entity *entity,
|
||||
|
||||
static void clu_configure_frame(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl)
|
||||
struct vsp1_dl_list *dl,
|
||||
struct vsp1_dl_body *dlb)
|
||||
{
|
||||
struct vsp1_clu *clu = to_clu(&entity->subdev);
|
||||
struct vsp1_dl_body *dlb;
|
||||
struct vsp1_dl_body *clu_dlb;
|
||||
unsigned long flags;
|
||||
u32 ctrl = VI6_CLU_CTRL_AAI | VI6_CLU_CTRL_MVS | VI6_CLU_CTRL_EN;
|
||||
|
||||
@ -201,18 +202,18 @@ static void clu_configure_frame(struct vsp1_entity *entity,
|
||||
| VI6_CLU_CTRL_OS0_2D | VI6_CLU_CTRL_OS1_2D
|
||||
| VI6_CLU_CTRL_OS2_2D | VI6_CLU_CTRL_M2D;
|
||||
|
||||
vsp1_clu_write(clu, dl, VI6_CLU_CTRL, ctrl);
|
||||
vsp1_clu_write(clu, dlb, VI6_CLU_CTRL, ctrl);
|
||||
|
||||
spin_lock_irqsave(&clu->lock, flags);
|
||||
dlb = clu->clu;
|
||||
clu_dlb = clu->clu;
|
||||
clu->clu = NULL;
|
||||
spin_unlock_irqrestore(&clu->lock, flags);
|
||||
|
||||
if (dlb) {
|
||||
vsp1_dl_list_add_body(dl, dlb);
|
||||
if (clu_dlb) {
|
||||
vsp1_dl_list_add_body(dl, clu_dlb);
|
||||
|
||||
/* Release our local reference. */
|
||||
vsp1_dl_body_put(dlb);
|
||||
vsp1_dl_body_put(clu_dlb);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -447,17 +447,15 @@ void vsp1_dl_list_put(struct vsp1_dl_list *dl)
|
||||
}
|
||||
|
||||
/**
|
||||
* vsp1_dl_list_write - Write a register to the display list
|
||||
* vsp1_dl_list_get_body0 - Obtain the default body for the display list
|
||||
* @dl: The display list
|
||||
* @reg: The register address
|
||||
* @data: The register value
|
||||
*
|
||||
* Write the given register and value to the display list. Up to 256 registers
|
||||
* can be written per display list.
|
||||
* Obtain a pointer to the internal display list body allowing this to be passed
|
||||
* directly to configure operations.
|
||||
*/
|
||||
void vsp1_dl_list_write(struct vsp1_dl_list *dl, u32 reg, u32 data)
|
||||
struct vsp1_dl_body *vsp1_dl_list_get_body0(struct vsp1_dl_list *dl)
|
||||
{
|
||||
vsp1_dl_body_write(dl->body0, reg, data);
|
||||
return dl->body0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -31,7 +31,7 @@ unsigned int vsp1_dlm_irq_frame_end(struct vsp1_dl_manager *dlm);
|
||||
|
||||
struct vsp1_dl_list *vsp1_dl_list_get(struct vsp1_dl_manager *dlm);
|
||||
void vsp1_dl_list_put(struct vsp1_dl_list *dl);
|
||||
void vsp1_dl_list_write(struct vsp1_dl_list *dl, u32 reg, u32 data);
|
||||
struct vsp1_dl_body *vsp1_dl_list_get_body0(struct vsp1_dl_list *dl);
|
||||
void vsp1_dl_list_commit(struct vsp1_dl_list *dl, bool internal);
|
||||
|
||||
struct vsp1_dl_body_pool *
|
||||
|
@ -536,13 +536,15 @@ static void vsp1_du_pipeline_configure(struct vsp1_pipeline *pipe)
|
||||
struct vsp1_entity *entity;
|
||||
struct vsp1_entity *next;
|
||||
struct vsp1_dl_list *dl;
|
||||
struct vsp1_dl_body *dlb;
|
||||
|
||||
dl = vsp1_dl_list_get(pipe->output->dlm);
|
||||
dlb = vsp1_dl_list_get_body0(dl);
|
||||
|
||||
list_for_each_entry_safe(entity, next, &pipe->entities, list_pipe) {
|
||||
/* Disconnect unused entities from the pipeline. */
|
||||
if (!entity->pipe) {
|
||||
vsp1_dl_list_write(dl, entity->route->reg,
|
||||
vsp1_dl_body_write(dlb, entity->route->reg,
|
||||
VI6_DPR_NODE_UNUSED);
|
||||
|
||||
entity->sink = NULL;
|
||||
@ -551,10 +553,10 @@ static void vsp1_du_pipeline_configure(struct vsp1_pipeline *pipe)
|
||||
continue;
|
||||
}
|
||||
|
||||
vsp1_entity_route_setup(entity, pipe, dl);
|
||||
vsp1_entity_configure_stream(entity, pipe, dl);
|
||||
vsp1_entity_configure_frame(entity, pipe, dl);
|
||||
vsp1_entity_configure_partition(entity, pipe, dl);
|
||||
vsp1_entity_route_setup(entity, pipe, dlb);
|
||||
vsp1_entity_configure_stream(entity, pipe, dlb);
|
||||
vsp1_entity_configure_frame(entity, pipe, dl, dlb);
|
||||
vsp1_entity_configure_partition(entity, pipe, dl, dlb);
|
||||
}
|
||||
|
||||
vsp1_dl_list_commit(dl, drm_pipe->force_brx_release);
|
||||
|
@ -22,7 +22,7 @@
|
||||
|
||||
void vsp1_entity_route_setup(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl)
|
||||
struct vsp1_dl_body *dlb)
|
||||
{
|
||||
struct vsp1_entity *source;
|
||||
u32 route;
|
||||
@ -38,7 +38,7 @@ void vsp1_entity_route_setup(struct vsp1_entity *entity,
|
||||
smppt = (pipe->output->entity.index << VI6_DPR_SMPPT_TGW_SHIFT)
|
||||
| (source->route->output << VI6_DPR_SMPPT_PT_SHIFT);
|
||||
|
||||
vsp1_dl_list_write(dl, VI6_DPR_HGO_SMPPT, smppt);
|
||||
vsp1_dl_body_write(dlb, VI6_DPR_HGO_SMPPT, smppt);
|
||||
return;
|
||||
} else if (entity->type == VSP1_ENTITY_HGT) {
|
||||
u32 smppt;
|
||||
@ -51,7 +51,7 @@ void vsp1_entity_route_setup(struct vsp1_entity *entity,
|
||||
smppt = (pipe->output->entity.index << VI6_DPR_SMPPT_TGW_SHIFT)
|
||||
| (source->route->output << VI6_DPR_SMPPT_PT_SHIFT);
|
||||
|
||||
vsp1_dl_list_write(dl, VI6_DPR_HGT_SMPPT, smppt);
|
||||
vsp1_dl_body_write(dlb, VI6_DPR_HGT_SMPPT, smppt);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -66,31 +66,33 @@ void vsp1_entity_route_setup(struct vsp1_entity *entity,
|
||||
*/
|
||||
if (source->type == VSP1_ENTITY_BRS)
|
||||
route |= VI6_DPR_ROUTE_BRSSEL;
|
||||
vsp1_dl_list_write(dl, source->route->reg, route);
|
||||
vsp1_dl_body_write(dlb, source->route->reg, route);
|
||||
}
|
||||
|
||||
void vsp1_entity_configure_stream(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl)
|
||||
struct vsp1_dl_body *dlb)
|
||||
{
|
||||
if (entity->ops->configure_stream)
|
||||
entity->ops->configure_stream(entity, pipe, dl);
|
||||
entity->ops->configure_stream(entity, pipe, dlb);
|
||||
}
|
||||
|
||||
void vsp1_entity_configure_frame(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl)
|
||||
struct vsp1_dl_list *dl,
|
||||
struct vsp1_dl_body *dlb)
|
||||
{
|
||||
if (entity->ops->configure_frame)
|
||||
entity->ops->configure_frame(entity, pipe, dl);
|
||||
entity->ops->configure_frame(entity, pipe, dl, dlb);
|
||||
}
|
||||
|
||||
void vsp1_entity_configure_partition(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl)
|
||||
struct vsp1_dl_list *dl,
|
||||
struct vsp1_dl_body *dlb)
|
||||
{
|
||||
if (entity->ops->configure_partition)
|
||||
entity->ops->configure_partition(entity, pipe, dl);
|
||||
entity->ops->configure_partition(entity, pipe, dl, dlb);
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include <media/v4l2-subdev.h>
|
||||
|
||||
struct vsp1_device;
|
||||
struct vsp1_dl_body;
|
||||
struct vsp1_dl_list;
|
||||
struct vsp1_pipeline;
|
||||
struct vsp1_partition;
|
||||
@ -77,12 +78,13 @@ struct vsp1_route {
|
||||
struct vsp1_entity_operations {
|
||||
void (*destroy)(struct vsp1_entity *);
|
||||
void (*configure_stream)(struct vsp1_entity *, struct vsp1_pipeline *,
|
||||
struct vsp1_dl_list *);
|
||||
struct vsp1_dl_body *);
|
||||
void (*configure_frame)(struct vsp1_entity *, struct vsp1_pipeline *,
|
||||
struct vsp1_dl_list *);
|
||||
struct vsp1_dl_list *, struct vsp1_dl_body *);
|
||||
void (*configure_partition)(struct vsp1_entity *,
|
||||
struct vsp1_pipeline *,
|
||||
struct vsp1_dl_list *);
|
||||
struct vsp1_dl_list *,
|
||||
struct vsp1_dl_body *);
|
||||
unsigned int (*max_width)(struct vsp1_entity *, struct vsp1_pipeline *);
|
||||
void (*partition)(struct vsp1_entity *, struct vsp1_pipeline *,
|
||||
struct vsp1_partition *, unsigned int,
|
||||
@ -149,19 +151,21 @@ int vsp1_entity_init_cfg(struct v4l2_subdev *subdev,
|
||||
|
||||
void vsp1_entity_route_setup(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl);
|
||||
struct vsp1_dl_body *dlb);
|
||||
|
||||
void vsp1_entity_configure_stream(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl);
|
||||
struct vsp1_dl_body *dlb);
|
||||
|
||||
void vsp1_entity_configure_frame(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl);
|
||||
struct vsp1_dl_list *dl,
|
||||
struct vsp1_dl_body *dlb);
|
||||
|
||||
void vsp1_entity_configure_partition(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl);
|
||||
struct vsp1_dl_list *dl,
|
||||
struct vsp1_dl_body *dlb);
|
||||
|
||||
struct media_pad *vsp1_entity_remote_pad(struct media_pad *pad);
|
||||
|
||||
|
@ -28,10 +28,10 @@ static inline u32 vsp1_hgo_read(struct vsp1_hgo *hgo, u32 reg)
|
||||
return vsp1_read(hgo->histo.entity.vsp1, reg);
|
||||
}
|
||||
|
||||
static inline void vsp1_hgo_write(struct vsp1_hgo *hgo, struct vsp1_dl_list *dl,
|
||||
u32 reg, u32 data)
|
||||
static inline void vsp1_hgo_write(struct vsp1_hgo *hgo,
|
||||
struct vsp1_dl_body *dlb, u32 reg, u32 data)
|
||||
{
|
||||
vsp1_dl_list_write(dl, reg, data);
|
||||
vsp1_dl_body_write(dlb, reg, data);
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
@ -131,7 +131,7 @@ static const struct v4l2_ctrl_config hgo_num_bins_control = {
|
||||
|
||||
static void hgo_configure_stream(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl)
|
||||
struct vsp1_dl_body *dlb)
|
||||
{
|
||||
struct vsp1_hgo *hgo = to_hgo(&entity->subdev);
|
||||
struct v4l2_rect *compose;
|
||||
@ -145,12 +145,12 @@ static void hgo_configure_stream(struct vsp1_entity *entity,
|
||||
HISTO_PAD_SINK,
|
||||
V4L2_SEL_TGT_COMPOSE);
|
||||
|
||||
vsp1_hgo_write(hgo, dl, VI6_HGO_REGRST, VI6_HGO_REGRST_RCLEA);
|
||||
vsp1_hgo_write(hgo, dlb, VI6_HGO_REGRST, VI6_HGO_REGRST_RCLEA);
|
||||
|
||||
vsp1_hgo_write(hgo, dl, VI6_HGO_OFFSET,
|
||||
vsp1_hgo_write(hgo, dlb, VI6_HGO_OFFSET,
|
||||
(crop->left << VI6_HGO_OFFSET_HOFFSET_SHIFT) |
|
||||
(crop->top << VI6_HGO_OFFSET_VOFFSET_SHIFT));
|
||||
vsp1_hgo_write(hgo, dl, VI6_HGO_SIZE,
|
||||
vsp1_hgo_write(hgo, dlb, VI6_HGO_SIZE,
|
||||
(crop->width << VI6_HGO_SIZE_HSIZE_SHIFT) |
|
||||
(crop->height << VI6_HGO_SIZE_VSIZE_SHIFT));
|
||||
|
||||
@ -162,7 +162,7 @@ static void hgo_configure_stream(struct vsp1_entity *entity,
|
||||
|
||||
hratio = crop->width * 2 / compose->width / 3;
|
||||
vratio = crop->height * 2 / compose->height / 3;
|
||||
vsp1_hgo_write(hgo, dl, VI6_HGO_MODE,
|
||||
vsp1_hgo_write(hgo, dlb, VI6_HGO_MODE,
|
||||
(hgo->num_bins == 256 ? VI6_HGO_MODE_STEP : 0) |
|
||||
(hgo->max_rgb ? VI6_HGO_MODE_MAXRGB : 0) |
|
||||
(hratio << VI6_HGO_MODE_HRATIO_SHIFT) |
|
||||
|
@ -28,10 +28,10 @@ static inline u32 vsp1_hgt_read(struct vsp1_hgt *hgt, u32 reg)
|
||||
return vsp1_read(hgt->histo.entity.vsp1, reg);
|
||||
}
|
||||
|
||||
static inline void vsp1_hgt_write(struct vsp1_hgt *hgt, struct vsp1_dl_list *dl,
|
||||
u32 reg, u32 data)
|
||||
static inline void vsp1_hgt_write(struct vsp1_hgt *hgt,
|
||||
struct vsp1_dl_body *dlb, u32 reg, u32 data)
|
||||
{
|
||||
vsp1_dl_list_write(dl, reg, data);
|
||||
vsp1_dl_body_write(dlb, reg, data);
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
@ -127,7 +127,7 @@ static const struct v4l2_ctrl_config hgt_hue_areas = {
|
||||
|
||||
static void hgt_configure_stream(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl)
|
||||
struct vsp1_dl_body *dlb)
|
||||
{
|
||||
struct vsp1_hgt *hgt = to_hgt(&entity->subdev);
|
||||
struct v4l2_rect *compose;
|
||||
@ -144,12 +144,12 @@ static void hgt_configure_stream(struct vsp1_entity *entity,
|
||||
HISTO_PAD_SINK,
|
||||
V4L2_SEL_TGT_COMPOSE);
|
||||
|
||||
vsp1_hgt_write(hgt, dl, VI6_HGT_REGRST, VI6_HGT_REGRST_RCLEA);
|
||||
vsp1_hgt_write(hgt, dlb, VI6_HGT_REGRST, VI6_HGT_REGRST_RCLEA);
|
||||
|
||||
vsp1_hgt_write(hgt, dl, VI6_HGT_OFFSET,
|
||||
vsp1_hgt_write(hgt, dlb, VI6_HGT_OFFSET,
|
||||
(crop->left << VI6_HGT_OFFSET_HOFFSET_SHIFT) |
|
||||
(crop->top << VI6_HGT_OFFSET_VOFFSET_SHIFT));
|
||||
vsp1_hgt_write(hgt, dl, VI6_HGT_SIZE,
|
||||
vsp1_hgt_write(hgt, dlb, VI6_HGT_SIZE,
|
||||
(crop->width << VI6_HGT_SIZE_HSIZE_SHIFT) |
|
||||
(crop->height << VI6_HGT_SIZE_VSIZE_SHIFT));
|
||||
|
||||
@ -157,7 +157,7 @@ static void hgt_configure_stream(struct vsp1_entity *entity,
|
||||
for (i = 0; i < HGT_NUM_HUE_AREAS; ++i) {
|
||||
lower = hgt->hue_areas[i*2 + 0];
|
||||
upper = hgt->hue_areas[i*2 + 1];
|
||||
vsp1_hgt_write(hgt, dl, VI6_HGT_HUE_AREA(i),
|
||||
vsp1_hgt_write(hgt, dlb, VI6_HGT_HUE_AREA(i),
|
||||
(lower << VI6_HGT_HUE_AREA_LOWER_SHIFT) |
|
||||
(upper << VI6_HGT_HUE_AREA_UPPER_SHIFT));
|
||||
}
|
||||
@ -165,7 +165,7 @@ static void hgt_configure_stream(struct vsp1_entity *entity,
|
||||
|
||||
hratio = crop->width * 2 / compose->width / 3;
|
||||
vratio = crop->height * 2 / compose->height / 3;
|
||||
vsp1_hgt_write(hgt, dl, VI6_HGT_MODE,
|
||||
vsp1_hgt_write(hgt, dlb, VI6_HGT_MODE,
|
||||
(hratio << VI6_HGT_MODE_HRATIO_SHIFT) |
|
||||
(vratio << VI6_HGT_MODE_VRATIO_SHIFT));
|
||||
}
|
||||
|
@ -24,9 +24,9 @@
|
||||
*/
|
||||
|
||||
static inline void vsp1_hsit_write(struct vsp1_hsit *hsit,
|
||||
struct vsp1_dl_list *dl, u32 reg, u32 data)
|
||||
struct vsp1_dl_body *dlb, u32 reg, u32 data)
|
||||
{
|
||||
vsp1_dl_list_write(dl, reg, data);
|
||||
vsp1_dl_body_write(dlb, reg, data);
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
@ -129,14 +129,14 @@ static const struct v4l2_subdev_ops hsit_ops = {
|
||||
|
||||
static void hsit_configure_stream(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl)
|
||||
struct vsp1_dl_body *dlb)
|
||||
{
|
||||
struct vsp1_hsit *hsit = to_hsit(&entity->subdev);
|
||||
|
||||
if (hsit->inverse)
|
||||
vsp1_hsit_write(hsit, dl, VI6_HSI_CTRL, VI6_HSI_CTRL_EN);
|
||||
vsp1_hsit_write(hsit, dlb, VI6_HSI_CTRL, VI6_HSI_CTRL_EN);
|
||||
else
|
||||
vsp1_hsit_write(hsit, dl, VI6_HST_CTRL, VI6_HST_CTRL_EN);
|
||||
vsp1_hsit_write(hsit, dlb, VI6_HST_CTRL, VI6_HST_CTRL_EN);
|
||||
}
|
||||
|
||||
static const struct vsp1_entity_operations hsit_entity_ops = {
|
||||
|
@ -23,10 +23,11 @@
|
||||
* Device Access
|
||||
*/
|
||||
|
||||
static inline void vsp1_lif_write(struct vsp1_lif *lif, struct vsp1_dl_list *dl,
|
||||
u32 reg, u32 data)
|
||||
static inline void vsp1_lif_write(struct vsp1_lif *lif,
|
||||
struct vsp1_dl_body *dlb, u32 reg, u32 data)
|
||||
{
|
||||
vsp1_dl_list_write(dl, reg + lif->entity.index * VI6_LIF_OFFSET, data);
|
||||
vsp1_dl_body_write(dlb, reg + lif->entity.index * VI6_LIF_OFFSET,
|
||||
data);
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
@ -83,7 +84,7 @@ static const struct v4l2_subdev_ops lif_ops = {
|
||||
|
||||
static void lif_configure_stream(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl)
|
||||
struct vsp1_dl_body *dlb)
|
||||
{
|
||||
const struct v4l2_mbus_framefmt *format;
|
||||
struct vsp1_lif *lif = to_lif(&entity->subdev);
|
||||
@ -96,11 +97,11 @@ static void lif_configure_stream(struct vsp1_entity *entity,
|
||||
|
||||
obth = min(obth, (format->width + 1) / 2 * format->height - 4);
|
||||
|
||||
vsp1_lif_write(lif, dl, VI6_LIF_CSBTH,
|
||||
vsp1_lif_write(lif, dlb, VI6_LIF_CSBTH,
|
||||
(hbth << VI6_LIF_CSBTH_HBTH_SHIFT) |
|
||||
(lbth << VI6_LIF_CSBTH_LBTH_SHIFT));
|
||||
|
||||
vsp1_lif_write(lif, dl, VI6_LIF_CTRL,
|
||||
vsp1_lif_write(lif, dlb, VI6_LIF_CTRL,
|
||||
(obth << VI6_LIF_CTRL_OBTH_SHIFT) |
|
||||
(format->code == 0 ? VI6_LIF_CTRL_CFMT : 0) |
|
||||
VI6_LIF_CTRL_REQSEL | VI6_LIF_CTRL_LIF_EN);
|
||||
@ -113,7 +114,7 @@ static void lif_configure_stream(struct vsp1_entity *entity,
|
||||
*/
|
||||
if ((entity->vsp1->version & VI6_IP_VERSION_MASK) ==
|
||||
(VI6_IP_VERSION_MODEL_VSPD_V3 | VI6_IP_VERSION_SOC_V3M))
|
||||
vsp1_lif_write(lif, dl, VI6_LIF_LBA,
|
||||
vsp1_lif_write(lif, dlb, VI6_LIF_LBA,
|
||||
VI6_LIF_LBA_LBA0 |
|
||||
(1536 << VI6_LIF_LBA_LBA1_SHIFT));
|
||||
}
|
||||
|
@ -25,10 +25,10 @@
|
||||
* Device Access
|
||||
*/
|
||||
|
||||
static inline void vsp1_lut_write(struct vsp1_lut *lut, struct vsp1_dl_list *dl,
|
||||
u32 reg, u32 data)
|
||||
static inline void vsp1_lut_write(struct vsp1_lut *lut,
|
||||
struct vsp1_dl_body *dlb, u32 reg, u32 data)
|
||||
{
|
||||
vsp1_dl_list_write(dl, reg, data);
|
||||
vsp1_dl_body_write(dlb, reg, data);
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
@ -147,31 +147,32 @@ static const struct v4l2_subdev_ops lut_ops = {
|
||||
|
||||
static void lut_configure_stream(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl)
|
||||
struct vsp1_dl_body *dlb)
|
||||
{
|
||||
struct vsp1_lut *lut = to_lut(&entity->subdev);
|
||||
|
||||
vsp1_lut_write(lut, dl, VI6_LUT_CTRL, VI6_LUT_CTRL_EN);
|
||||
vsp1_lut_write(lut, dlb, VI6_LUT_CTRL, VI6_LUT_CTRL_EN);
|
||||
}
|
||||
|
||||
static void lut_configure_frame(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl)
|
||||
struct vsp1_dl_list *dl,
|
||||
struct vsp1_dl_body *dlb)
|
||||
{
|
||||
struct vsp1_lut *lut = to_lut(&entity->subdev);
|
||||
struct vsp1_dl_body *dlb;
|
||||
struct vsp1_dl_body *lut_dlb;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&lut->lock, flags);
|
||||
dlb = lut->lut;
|
||||
lut_dlb = lut->lut;
|
||||
lut->lut = NULL;
|
||||
spin_unlock_irqrestore(&lut->lock, flags);
|
||||
|
||||
if (dlb) {
|
||||
vsp1_dl_list_add_body(dl, dlb);
|
||||
if (lut_dlb) {
|
||||
vsp1_dl_list_add_body(dl, lut_dlb);
|
||||
|
||||
/* Release our local reference. */
|
||||
vsp1_dl_body_put(dlb);
|
||||
vsp1_dl_body_put(lut_dlb);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -348,7 +348,7 @@ void vsp1_pipeline_frame_end(struct vsp1_pipeline *pipe)
|
||||
* from the input RPF alpha.
|
||||
*/
|
||||
void vsp1_pipeline_propagate_alpha(struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl, unsigned int alpha)
|
||||
struct vsp1_dl_body *dlb, unsigned int alpha)
|
||||
{
|
||||
if (!pipe->uds)
|
||||
return;
|
||||
@ -361,7 +361,7 @@ void vsp1_pipeline_propagate_alpha(struct vsp1_pipeline *pipe,
|
||||
pipe->uds_input->type == VSP1_ENTITY_BRS)
|
||||
alpha = 255;
|
||||
|
||||
vsp1_uds_set_alpha(pipe->uds, dl, alpha);
|
||||
vsp1_uds_set_alpha(pipe->uds, dlb, alpha);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -157,7 +157,8 @@ bool vsp1_pipeline_ready(struct vsp1_pipeline *pipe);
|
||||
void vsp1_pipeline_frame_end(struct vsp1_pipeline *pipe);
|
||||
|
||||
void vsp1_pipeline_propagate_alpha(struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl, unsigned int alpha);
|
||||
struct vsp1_dl_body *dlb,
|
||||
unsigned int alpha);
|
||||
|
||||
void vsp1_pipeline_propagate_partition(struct vsp1_pipeline *pipe,
|
||||
struct vsp1_partition *partition,
|
||||
|
@ -25,9 +25,10 @@
|
||||
*/
|
||||
|
||||
static inline void vsp1_rpf_write(struct vsp1_rwpf *rpf,
|
||||
struct vsp1_dl_list *dl, u32 reg, u32 data)
|
||||
struct vsp1_dl_body *dlb, u32 reg, u32 data)
|
||||
{
|
||||
vsp1_dl_list_write(dl, reg + rpf->entity.index * VI6_RPF_OFFSET, data);
|
||||
vsp1_dl_body_write(dlb, reg + rpf->entity.index * VI6_RPF_OFFSET,
|
||||
data);
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
@ -44,7 +45,7 @@ static const struct v4l2_subdev_ops rpf_ops = {
|
||||
|
||||
static void rpf_configure_stream(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl)
|
||||
struct vsp1_dl_body *dlb)
|
||||
{
|
||||
struct vsp1_rwpf *rpf = to_rwpf(&entity->subdev);
|
||||
const struct vsp1_format_info *fmtinfo = rpf->fmtinfo;
|
||||
@ -63,7 +64,7 @@ static void rpf_configure_stream(struct vsp1_entity *entity,
|
||||
pstride |= format->plane_fmt[1].bytesperline
|
||||
<< VI6_RPF_SRCM_PSTRIDE_C_SHIFT;
|
||||
|
||||
vsp1_rpf_write(rpf, dl, VI6_RPF_SRCM_PSTRIDE, pstride);
|
||||
vsp1_rpf_write(rpf, dlb, VI6_RPF_SRCM_PSTRIDE, pstride);
|
||||
|
||||
/* Format */
|
||||
sink_format = vsp1_entity_get_pad_format(&rpf->entity,
|
||||
@ -84,8 +85,8 @@ static void rpf_configure_stream(struct vsp1_entity *entity,
|
||||
if (sink_format->code != source_format->code)
|
||||
infmt |= VI6_RPF_INFMT_CSC;
|
||||
|
||||
vsp1_rpf_write(rpf, dl, VI6_RPF_INFMT, infmt);
|
||||
vsp1_rpf_write(rpf, dl, VI6_RPF_DSWAP, fmtinfo->swap);
|
||||
vsp1_rpf_write(rpf, dlb, VI6_RPF_INFMT, infmt);
|
||||
vsp1_rpf_write(rpf, dlb, VI6_RPF_DSWAP, fmtinfo->swap);
|
||||
|
||||
/* Output location */
|
||||
if (pipe->brx) {
|
||||
@ -99,7 +100,7 @@ static void rpf_configure_stream(struct vsp1_entity *entity,
|
||||
top = compose->top;
|
||||
}
|
||||
|
||||
vsp1_rpf_write(rpf, dl, VI6_RPF_LOC,
|
||||
vsp1_rpf_write(rpf, dlb, VI6_RPF_LOC,
|
||||
(left << VI6_RPF_LOC_HCOORD_SHIFT) |
|
||||
(top << VI6_RPF_LOC_VCOORD_SHIFT));
|
||||
|
||||
@ -126,7 +127,7 @@ static void rpf_configure_stream(struct vsp1_entity *entity,
|
||||
*
|
||||
* In all cases, disable color keying.
|
||||
*/
|
||||
vsp1_rpf_write(rpf, dl, VI6_RPF_ALPH_SEL, VI6_RPF_ALPH_SEL_AEXT_EXT |
|
||||
vsp1_rpf_write(rpf, dlb, VI6_RPF_ALPH_SEL, VI6_RPF_ALPH_SEL_AEXT_EXT |
|
||||
(fmtinfo->alpha ? VI6_RPF_ALPH_SEL_ASEL_PACKED
|
||||
: VI6_RPF_ALPH_SEL_ASEL_FIXED));
|
||||
|
||||
@ -163,28 +164,30 @@ static void rpf_configure_stream(struct vsp1_entity *entity,
|
||||
rpf->mult_alpha = mult;
|
||||
}
|
||||
|
||||
vsp1_rpf_write(rpf, dl, VI6_RPF_MSK_CTRL, 0);
|
||||
vsp1_rpf_write(rpf, dl, VI6_RPF_CKEY_CTRL, 0);
|
||||
vsp1_rpf_write(rpf, dlb, VI6_RPF_MSK_CTRL, 0);
|
||||
vsp1_rpf_write(rpf, dlb, VI6_RPF_CKEY_CTRL, 0);
|
||||
|
||||
}
|
||||
|
||||
static void rpf_configure_frame(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl)
|
||||
struct vsp1_dl_list *dl,
|
||||
struct vsp1_dl_body *dlb)
|
||||
{
|
||||
struct vsp1_rwpf *rpf = to_rwpf(&entity->subdev);
|
||||
|
||||
vsp1_rpf_write(rpf, dl, VI6_RPF_VRTCOL_SET,
|
||||
vsp1_rpf_write(rpf, dlb, VI6_RPF_VRTCOL_SET,
|
||||
rpf->alpha << VI6_RPF_VRTCOL_SET_LAYA_SHIFT);
|
||||
vsp1_rpf_write(rpf, dl, VI6_RPF_MULT_ALPHA, rpf->mult_alpha |
|
||||
vsp1_rpf_write(rpf, dlb, VI6_RPF_MULT_ALPHA, rpf->mult_alpha |
|
||||
(rpf->alpha << VI6_RPF_MULT_ALPHA_RATIO_SHIFT));
|
||||
|
||||
vsp1_pipeline_propagate_alpha(pipe, dl, rpf->alpha);
|
||||
vsp1_pipeline_propagate_alpha(pipe, dlb, rpf->alpha);
|
||||
}
|
||||
|
||||
static void rpf_configure_partition(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl)
|
||||
struct vsp1_dl_list *dl,
|
||||
struct vsp1_dl_body *dlb)
|
||||
{
|
||||
struct vsp1_rwpf *rpf = to_rwpf(&entity->subdev);
|
||||
struct vsp1_rwpf_memory mem = rpf->mem;
|
||||
@ -218,10 +221,10 @@ static void rpf_configure_partition(struct vsp1_entity *entity,
|
||||
crop.left += pipe->partition->rpf.left;
|
||||
}
|
||||
|
||||
vsp1_rpf_write(rpf, dl, VI6_RPF_SRC_BSIZE,
|
||||
vsp1_rpf_write(rpf, dlb, VI6_RPF_SRC_BSIZE,
|
||||
(crop.width << VI6_RPF_SRC_BSIZE_BHSIZE_SHIFT) |
|
||||
(crop.height << VI6_RPF_SRC_BSIZE_BVSIZE_SHIFT));
|
||||
vsp1_rpf_write(rpf, dl, VI6_RPF_SRC_ESIZE,
|
||||
vsp1_rpf_write(rpf, dlb, VI6_RPF_SRC_ESIZE,
|
||||
(crop.width << VI6_RPF_SRC_ESIZE_EHSIZE_SHIFT) |
|
||||
(crop.height << VI6_RPF_SRC_ESIZE_EVSIZE_SHIFT));
|
||||
|
||||
@ -246,9 +249,9 @@ static void rpf_configure_partition(struct vsp1_entity *entity,
|
||||
fmtinfo->swap_uv)
|
||||
swap(mem.addr[1], mem.addr[2]);
|
||||
|
||||
vsp1_rpf_write(rpf, dl, VI6_RPF_SRCM_ADDR_Y, mem.addr[0]);
|
||||
vsp1_rpf_write(rpf, dl, VI6_RPF_SRCM_ADDR_C0, mem.addr[1]);
|
||||
vsp1_rpf_write(rpf, dl, VI6_RPF_SRCM_ADDR_C1, mem.addr[2]);
|
||||
vsp1_rpf_write(rpf, dlb, VI6_RPF_SRCM_ADDR_Y, mem.addr[0]);
|
||||
vsp1_rpf_write(rpf, dlb, VI6_RPF_SRCM_ADDR_C0, mem.addr[1]);
|
||||
vsp1_rpf_write(rpf, dlb, VI6_RPF_SRCM_ADDR_C1, mem.addr[2]);
|
||||
}
|
||||
|
||||
static void rpf_partition(struct vsp1_entity *entity,
|
||||
|
@ -24,10 +24,10 @@
|
||||
* Device Access
|
||||
*/
|
||||
|
||||
static inline void vsp1_sru_write(struct vsp1_sru *sru, struct vsp1_dl_list *dl,
|
||||
u32 reg, u32 data)
|
||||
static inline void vsp1_sru_write(struct vsp1_sru *sru,
|
||||
struct vsp1_dl_body *dlb, u32 reg, u32 data)
|
||||
{
|
||||
vsp1_dl_list_write(dl, reg, data);
|
||||
vsp1_dl_body_write(dlb, reg, data);
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
@ -269,7 +269,7 @@ static const struct v4l2_subdev_ops sru_ops = {
|
||||
|
||||
static void sru_configure_stream(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl)
|
||||
struct vsp1_dl_body *dlb)
|
||||
{
|
||||
const struct vsp1_sru_param *param;
|
||||
struct vsp1_sru *sru = to_sru(&entity->subdev);
|
||||
@ -295,9 +295,9 @@ static void sru_configure_stream(struct vsp1_entity *entity,
|
||||
|
||||
ctrl0 |= param->ctrl0;
|
||||
|
||||
vsp1_sru_write(sru, dl, VI6_SRU_CTRL0, ctrl0);
|
||||
vsp1_sru_write(sru, dl, VI6_SRU_CTRL1, VI6_SRU_CTRL1_PARAM5);
|
||||
vsp1_sru_write(sru, dl, VI6_SRU_CTRL2, param->ctrl2);
|
||||
vsp1_sru_write(sru, dlb, VI6_SRU_CTRL0, ctrl0);
|
||||
vsp1_sru_write(sru, dlb, VI6_SRU_CTRL1, VI6_SRU_CTRL1_PARAM5);
|
||||
vsp1_sru_write(sru, dlb, VI6_SRU_CTRL2, param->ctrl2);
|
||||
}
|
||||
|
||||
static unsigned int sru_max_width(struct vsp1_entity *entity,
|
||||
|
@ -27,22 +27,22 @@
|
||||
* Device Access
|
||||
*/
|
||||
|
||||
static inline void vsp1_uds_write(struct vsp1_uds *uds, struct vsp1_dl_list *dl,
|
||||
u32 reg, u32 data)
|
||||
static inline void vsp1_uds_write(struct vsp1_uds *uds,
|
||||
struct vsp1_dl_body *dlb, u32 reg, u32 data)
|
||||
{
|
||||
vsp1_dl_list_write(dl, reg + uds->entity.index * VI6_UDS_OFFSET, data);
|
||||
vsp1_dl_body_write(dlb, reg + uds->entity.index * VI6_UDS_OFFSET, data);
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
* Scaling Computation
|
||||
*/
|
||||
|
||||
void vsp1_uds_set_alpha(struct vsp1_entity *entity, struct vsp1_dl_list *dl,
|
||||
void vsp1_uds_set_alpha(struct vsp1_entity *entity, struct vsp1_dl_body *dlb,
|
||||
unsigned int alpha)
|
||||
{
|
||||
struct vsp1_uds *uds = to_uds(&entity->subdev);
|
||||
|
||||
vsp1_uds_write(uds, dl, VI6_UDS_ALPVAL,
|
||||
vsp1_uds_write(uds, dlb, VI6_UDS_ALPVAL,
|
||||
alpha << VI6_UDS_ALPVAL_VAL0_SHIFT);
|
||||
}
|
||||
|
||||
@ -257,7 +257,7 @@ static const struct v4l2_subdev_ops uds_ops = {
|
||||
|
||||
static void uds_configure_stream(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl)
|
||||
struct vsp1_dl_body *dlb)
|
||||
{
|
||||
struct vsp1_uds *uds = to_uds(&entity->subdev);
|
||||
const struct v4l2_mbus_framefmt *output;
|
||||
@ -286,25 +286,26 @@ static void uds_configure_stream(struct vsp1_entity *entity,
|
||||
else
|
||||
multitap = true;
|
||||
|
||||
vsp1_uds_write(uds, dl, VI6_UDS_CTRL,
|
||||
vsp1_uds_write(uds, dlb, VI6_UDS_CTRL,
|
||||
(uds->scale_alpha ? VI6_UDS_CTRL_AON : 0) |
|
||||
(multitap ? VI6_UDS_CTRL_BC : 0));
|
||||
|
||||
vsp1_uds_write(uds, dl, VI6_UDS_PASS_BWIDTH,
|
||||
vsp1_uds_write(uds, dlb, VI6_UDS_PASS_BWIDTH,
|
||||
(uds_passband_width(hscale)
|
||||
<< VI6_UDS_PASS_BWIDTH_H_SHIFT) |
|
||||
(uds_passband_width(vscale)
|
||||
<< VI6_UDS_PASS_BWIDTH_V_SHIFT));
|
||||
|
||||
/* Set the scaling ratios. */
|
||||
vsp1_uds_write(uds, dl, VI6_UDS_SCALE,
|
||||
vsp1_uds_write(uds, dlb, VI6_UDS_SCALE,
|
||||
(hscale << VI6_UDS_SCALE_HFRAC_SHIFT) |
|
||||
(vscale << VI6_UDS_SCALE_VFRAC_SHIFT));
|
||||
}
|
||||
|
||||
static void uds_configure_partition(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl)
|
||||
struct vsp1_dl_list *dl,
|
||||
struct vsp1_dl_body *dlb)
|
||||
{
|
||||
struct vsp1_uds *uds = to_uds(&entity->subdev);
|
||||
struct vsp1_partition *partition = pipe->partition;
|
||||
@ -314,13 +315,13 @@ static void uds_configure_partition(struct vsp1_entity *entity,
|
||||
UDS_PAD_SOURCE);
|
||||
|
||||
/* Input size clipping */
|
||||
vsp1_uds_write(uds, dl, VI6_UDS_HSZCLIP, VI6_UDS_HSZCLIP_HCEN |
|
||||
vsp1_uds_write(uds, dlb, VI6_UDS_HSZCLIP, VI6_UDS_HSZCLIP_HCEN |
|
||||
(0 << VI6_UDS_HSZCLIP_HCL_OFST_SHIFT) |
|
||||
(partition->uds_sink.width
|
||||
<< VI6_UDS_HSZCLIP_HCL_SIZE_SHIFT));
|
||||
|
||||
/* Output size clipping */
|
||||
vsp1_uds_write(uds, dl, VI6_UDS_CLIP_SIZE,
|
||||
vsp1_uds_write(uds, dlb, VI6_UDS_CLIP_SIZE,
|
||||
(partition->uds_source.width
|
||||
<< VI6_UDS_CLIP_SIZE_HSIZE_SHIFT) |
|
||||
(output->height
|
||||
|
@ -31,7 +31,7 @@ static inline struct vsp1_uds *to_uds(struct v4l2_subdev *subdev)
|
||||
|
||||
struct vsp1_uds *vsp1_uds_create(struct vsp1_device *vsp1, unsigned int index);
|
||||
|
||||
void vsp1_uds_set_alpha(struct vsp1_entity *uds, struct vsp1_dl_list *dl,
|
||||
void vsp1_uds_set_alpha(struct vsp1_entity *uds, struct vsp1_dl_body *dlb,
|
||||
unsigned int alpha);
|
||||
|
||||
#endif /* __VSP1_UDS_H__ */
|
||||
|
@ -31,10 +31,11 @@ static inline u32 vsp1_uif_read(struct vsp1_uif *uif, u32 reg)
|
||||
return vsp1_read(uif->entity.vsp1,
|
||||
uif->entity.index * VI6_UIF_OFFSET + reg);
|
||||
}
|
||||
static inline void vsp1_uif_write(struct vsp1_uif *uif, struct vsp1_dl_list *dl,
|
||||
u32 reg, u32 data)
|
||||
|
||||
static inline void vsp1_uif_write(struct vsp1_uif *uif,
|
||||
struct vsp1_dl_body *dlb, u32 reg, u32 data)
|
||||
{
|
||||
vsp1_dl_list_write(dl, reg + uif->entity.index * VI6_UIF_OFFSET, data);
|
||||
vsp1_dl_body_write(dlb, reg + uif->entity.index * VI6_UIF_OFFSET, data);
|
||||
}
|
||||
|
||||
u32 vsp1_uif_get_crc(struct vsp1_uif *uif)
|
||||
@ -191,14 +192,14 @@ static const struct v4l2_subdev_ops uif_ops = {
|
||||
|
||||
static void uif_configure_stream(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl)
|
||||
struct vsp1_dl_body *dlb)
|
||||
{
|
||||
struct vsp1_uif *uif = to_uif(&entity->subdev);
|
||||
const struct v4l2_rect *crop;
|
||||
unsigned int left;
|
||||
unsigned int width;
|
||||
|
||||
vsp1_uif_write(uif, dl, VI6_UIF_DISCOM_DOCMPMR,
|
||||
vsp1_uif_write(uif, dlb, VI6_UIF_DISCOM_DOCMPMR,
|
||||
VI6_UIF_DISCOM_DOCMPMR_SEL(9));
|
||||
|
||||
crop = vsp1_entity_get_pad_selection(entity, entity->config,
|
||||
@ -213,12 +214,12 @@ static void uif_configure_stream(struct vsp1_entity *entity,
|
||||
width /= 2;
|
||||
}
|
||||
|
||||
vsp1_uif_write(uif, dl, VI6_UIF_DISCOM_DOCMSPXR, left);
|
||||
vsp1_uif_write(uif, dl, VI6_UIF_DISCOM_DOCMSPYR, crop->top);
|
||||
vsp1_uif_write(uif, dl, VI6_UIF_DISCOM_DOCMSZXR, width);
|
||||
vsp1_uif_write(uif, dl, VI6_UIF_DISCOM_DOCMSZYR, crop->height);
|
||||
vsp1_uif_write(uif, dlb, VI6_UIF_DISCOM_DOCMSPXR, left);
|
||||
vsp1_uif_write(uif, dlb, VI6_UIF_DISCOM_DOCMSPYR, crop->top);
|
||||
vsp1_uif_write(uif, dlb, VI6_UIF_DISCOM_DOCMSZXR, width);
|
||||
vsp1_uif_write(uif, dlb, VI6_UIF_DISCOM_DOCMSZYR, crop->height);
|
||||
|
||||
vsp1_uif_write(uif, dl, VI6_UIF_DISCOM_DOCMCR,
|
||||
vsp1_uif_write(uif, dlb, VI6_UIF_DISCOM_DOCMCR,
|
||||
VI6_UIF_DISCOM_DOCMCR_CMPR);
|
||||
}
|
||||
|
||||
|
@ -378,25 +378,29 @@ static void vsp1_video_pipeline_run_partition(struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl,
|
||||
unsigned int partition)
|
||||
{
|
||||
struct vsp1_dl_body *dlb = vsp1_dl_list_get_body0(dl);
|
||||
struct vsp1_entity *entity;
|
||||
|
||||
pipe->partition = &pipe->part_table[partition];
|
||||
|
||||
list_for_each_entry(entity, &pipe->entities, list_pipe)
|
||||
vsp1_entity_configure_partition(entity, pipe, dl);
|
||||
vsp1_entity_configure_partition(entity, pipe, dl, dlb);
|
||||
}
|
||||
|
||||
static void vsp1_video_pipeline_run(struct vsp1_pipeline *pipe)
|
||||
{
|
||||
struct vsp1_device *vsp1 = pipe->output->entity.vsp1;
|
||||
struct vsp1_entity *entity;
|
||||
struct vsp1_dl_body *dlb;
|
||||
unsigned int partition;
|
||||
|
||||
if (!pipe->dl)
|
||||
pipe->dl = vsp1_dl_list_get(pipe->output->dlm);
|
||||
|
||||
dlb = vsp1_dl_list_get_body0(pipe->dl);
|
||||
|
||||
list_for_each_entry(entity, &pipe->entities, list_pipe)
|
||||
vsp1_entity_configure_frame(entity, pipe, pipe->dl);
|
||||
vsp1_entity_configure_frame(entity, pipe, pipe->dl, dlb);
|
||||
|
||||
/* Run the first partition. */
|
||||
vsp1_video_pipeline_run_partition(pipe, pipe->dl, 0);
|
||||
@ -787,6 +791,7 @@ static void vsp1_video_buffer_queue(struct vb2_buffer *vb)
|
||||
static int vsp1_video_setup_pipeline(struct vsp1_pipeline *pipe)
|
||||
{
|
||||
struct vsp1_entity *entity;
|
||||
struct vsp1_dl_body *dlb;
|
||||
int ret;
|
||||
|
||||
/* Determine this pipelines sizes for image partitioning support. */
|
||||
@ -799,6 +804,9 @@ static int vsp1_video_setup_pipeline(struct vsp1_pipeline *pipe)
|
||||
if (!pipe->dl)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Retrieve the default DLB from the list. */
|
||||
dlb = vsp1_dl_list_get_body0(pipe->dl);
|
||||
|
||||
if (pipe->uds) {
|
||||
struct vsp1_uds *uds = to_uds(&pipe->uds->subdev);
|
||||
|
||||
@ -821,8 +829,8 @@ static int vsp1_video_setup_pipeline(struct vsp1_pipeline *pipe)
|
||||
}
|
||||
|
||||
list_for_each_entry(entity, &pipe->entities, list_pipe) {
|
||||
vsp1_entity_route_setup(entity, pipe, pipe->dl);
|
||||
vsp1_entity_configure_stream(entity, pipe, pipe->dl);
|
||||
vsp1_entity_route_setup(entity, pipe, dlb);
|
||||
vsp1_entity_configure_stream(entity, pipe, dlb);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -27,9 +27,9 @@
|
||||
*/
|
||||
|
||||
static inline void vsp1_wpf_write(struct vsp1_rwpf *wpf,
|
||||
struct vsp1_dl_list *dl, u32 reg, u32 data)
|
||||
struct vsp1_dl_body *dlb, u32 reg, u32 data)
|
||||
{
|
||||
vsp1_dl_list_write(dl, reg + wpf->entity.index * VI6_WPF_OFFSET, data);
|
||||
vsp1_dl_body_write(dlb, reg + wpf->entity.index * VI6_WPF_OFFSET, data);
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
@ -234,7 +234,7 @@ static void vsp1_wpf_destroy(struct vsp1_entity *entity)
|
||||
|
||||
static void wpf_configure_stream(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl)
|
||||
struct vsp1_dl_body *dlb)
|
||||
{
|
||||
struct vsp1_rwpf *wpf = to_rwpf(&entity->subdev);
|
||||
struct vsp1_device *vsp1 = wpf->entity.vsp1;
|
||||
@ -268,17 +268,17 @@ static void wpf_configure_stream(struct vsp1_entity *entity,
|
||||
outfmt |= VI6_WPF_OUTFMT_SPUVS;
|
||||
|
||||
/* Destination stride and byte swapping. */
|
||||
vsp1_wpf_write(wpf, dl, VI6_WPF_DSTM_STRIDE_Y,
|
||||
vsp1_wpf_write(wpf, dlb, VI6_WPF_DSTM_STRIDE_Y,
|
||||
format->plane_fmt[0].bytesperline);
|
||||
if (format->num_planes > 1)
|
||||
vsp1_wpf_write(wpf, dl, VI6_WPF_DSTM_STRIDE_C,
|
||||
vsp1_wpf_write(wpf, dlb, VI6_WPF_DSTM_STRIDE_C,
|
||||
format->plane_fmt[1].bytesperline);
|
||||
|
||||
vsp1_wpf_write(wpf, dl, VI6_WPF_DSWAP, fmtinfo->swap);
|
||||
vsp1_wpf_write(wpf, dlb, VI6_WPF_DSWAP, fmtinfo->swap);
|
||||
|
||||
if (vsp1->info->features & VSP1_HAS_WPF_HFLIP &&
|
||||
wpf->entity.index == 0)
|
||||
vsp1_wpf_write(wpf, dl, VI6_WPF_ROT_CTRL,
|
||||
vsp1_wpf_write(wpf, dlb, VI6_WPF_ROT_CTRL,
|
||||
VI6_WPF_ROT_CTRL_LN16 |
|
||||
(256 << VI6_WPF_ROT_CTRL_LMEM_WD_SHIFT));
|
||||
}
|
||||
@ -288,10 +288,10 @@ static void wpf_configure_stream(struct vsp1_entity *entity,
|
||||
|
||||
wpf->outfmt = outfmt;
|
||||
|
||||
vsp1_dl_list_write(dl, VI6_DPR_WPF_FPORCH(wpf->entity.index),
|
||||
vsp1_dl_body_write(dlb, VI6_DPR_WPF_FPORCH(wpf->entity.index),
|
||||
VI6_DPR_WPF_FPORCH_FP_WPFN);
|
||||
|
||||
vsp1_dl_list_write(dl, VI6_WPF_WRBCK_CTRL, 0);
|
||||
vsp1_dl_body_write(dlb, VI6_WPF_WRBCK_CTRL, 0);
|
||||
|
||||
/*
|
||||
* Sources. If the pipeline has a single input and BRx is not used,
|
||||
@ -315,17 +315,18 @@ static void wpf_configure_stream(struct vsp1_entity *entity,
|
||||
? VI6_WPF_SRCRPF_VIRACT_MST
|
||||
: VI6_WPF_SRCRPF_VIRACT2_MST;
|
||||
|
||||
vsp1_wpf_write(wpf, dl, VI6_WPF_SRCRPF, srcrpf);
|
||||
vsp1_wpf_write(wpf, dlb, VI6_WPF_SRCRPF, srcrpf);
|
||||
|
||||
/* Enable interrupts */
|
||||
vsp1_dl_list_write(dl, VI6_WPF_IRQ_STA(wpf->entity.index), 0);
|
||||
vsp1_dl_list_write(dl, VI6_WPF_IRQ_ENB(wpf->entity.index),
|
||||
vsp1_dl_body_write(dlb, VI6_WPF_IRQ_STA(wpf->entity.index), 0);
|
||||
vsp1_dl_body_write(dlb, VI6_WPF_IRQ_ENB(wpf->entity.index),
|
||||
VI6_WFP_IRQ_ENB_DFEE);
|
||||
}
|
||||
|
||||
static void wpf_configure_frame(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl)
|
||||
struct vsp1_dl_list *dl,
|
||||
struct vsp1_dl_body *dlb)
|
||||
{
|
||||
const unsigned int mask = BIT(WPF_CTRL_VFLIP)
|
||||
| BIT(WPF_CTRL_HFLIP);
|
||||
@ -345,12 +346,13 @@ static void wpf_configure_frame(struct vsp1_entity *entity,
|
||||
if (wpf->flip.active & BIT(WPF_CTRL_HFLIP))
|
||||
outfmt |= VI6_WPF_OUTFMT_HFLP;
|
||||
|
||||
vsp1_wpf_write(wpf, dl, VI6_WPF_OUTFMT, outfmt);
|
||||
vsp1_wpf_write(wpf, dlb, VI6_WPF_OUTFMT, outfmt);
|
||||
}
|
||||
|
||||
static void wpf_configure_partition(struct vsp1_entity *entity,
|
||||
struct vsp1_pipeline *pipe,
|
||||
struct vsp1_dl_list *dl)
|
||||
struct vsp1_dl_list *dl,
|
||||
struct vsp1_dl_body *dlb)
|
||||
{
|
||||
struct vsp1_rwpf *wpf = to_rwpf(&entity->subdev);
|
||||
struct vsp1_device *vsp1 = wpf->entity.vsp1;
|
||||
@ -377,10 +379,10 @@ static void wpf_configure_partition(struct vsp1_entity *entity,
|
||||
if (pipe->partitions > 1)
|
||||
width = pipe->partition->wpf.width;
|
||||
|
||||
vsp1_wpf_write(wpf, dl, VI6_WPF_HSZCLIP, VI6_WPF_SZCLIP_EN |
|
||||
vsp1_wpf_write(wpf, dlb, VI6_WPF_HSZCLIP, VI6_WPF_SZCLIP_EN |
|
||||
(0 << VI6_WPF_SZCLIP_OFST_SHIFT) |
|
||||
(width << VI6_WPF_SZCLIP_SIZE_SHIFT));
|
||||
vsp1_wpf_write(wpf, dl, VI6_WPF_VSZCLIP, VI6_WPF_SZCLIP_EN |
|
||||
vsp1_wpf_write(wpf, dlb, VI6_WPF_VSZCLIP, VI6_WPF_SZCLIP_EN |
|
||||
(0 << VI6_WPF_SZCLIP_OFST_SHIFT) |
|
||||
(height << VI6_WPF_SZCLIP_SIZE_SHIFT));
|
||||
|
||||
@ -472,9 +474,9 @@ static void wpf_configure_partition(struct vsp1_entity *entity,
|
||||
fmtinfo->swap_uv)
|
||||
swap(mem.addr[1], mem.addr[2]);
|
||||
|
||||
vsp1_wpf_write(wpf, dl, VI6_WPF_DSTM_ADDR_Y, mem.addr[0]);
|
||||
vsp1_wpf_write(wpf, dl, VI6_WPF_DSTM_ADDR_C0, mem.addr[1]);
|
||||
vsp1_wpf_write(wpf, dl, VI6_WPF_DSTM_ADDR_C1, mem.addr[2]);
|
||||
vsp1_wpf_write(wpf, dlb, VI6_WPF_DSTM_ADDR_Y, mem.addr[0]);
|
||||
vsp1_wpf_write(wpf, dlb, VI6_WPF_DSTM_ADDR_C0, mem.addr[1]);
|
||||
vsp1_wpf_write(wpf, dlb, VI6_WPF_DSTM_ADDR_C1, mem.addr[2]);
|
||||
}
|
||||
|
||||
static unsigned int wpf_max_width(struct vsp1_entity *entity,
|
||||
|
Loading…
Reference in New Issue
Block a user