mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-10 07:10:27 +00:00
3eeaee737d
HEVC and VP9 are running on the same hardware and share the same chroma and motion vectors offset constraint. Create common helpers functions for these computation. Source and destination buffer height may not be the same because alignment constraint are different so use destination height to compute chroma offset because we target this buffer as hardware output. To be able to use the helpers in both VP9 HEVC code remove dec_params and use context->bit_depth instead. Signed-off-by: Benjamin Gaignard <benjamin.gaignard@collabora.com> Reviewed-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com> CC: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar> CC: Philipp Zabel <p.zabel@pengutronix.de> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
59 lines
1.3 KiB
C
59 lines
1.3 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Hantro VPU codec driver
|
|
*
|
|
* Copyright (C) 2021 Collabora Ltd, Andrzej Pietrasiewicz <andrzej.p@collabora.com>
|
|
*/
|
|
|
|
#include "hantro_hw.h"
|
|
#include "hantro_g2_regs.h"
|
|
|
|
#define G2_ALIGN 16
|
|
|
|
void hantro_g2_check_idle(struct hantro_dev *vpu)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < 3; i++) {
|
|
u32 status;
|
|
|
|
/* Make sure the VPU is idle */
|
|
status = vdpu_read(vpu, G2_REG_INTERRUPT);
|
|
if (status & G2_REG_INTERRUPT_DEC_E) {
|
|
dev_warn(vpu->dev, "device still running, aborting");
|
|
status |= G2_REG_INTERRUPT_DEC_ABORT_E | G2_REG_INTERRUPT_DEC_IRQ_DIS;
|
|
vdpu_write(vpu, status, G2_REG_INTERRUPT);
|
|
}
|
|
}
|
|
}
|
|
|
|
irqreturn_t hantro_g2_irq(int irq, void *dev_id)
|
|
{
|
|
struct hantro_dev *vpu = dev_id;
|
|
enum vb2_buffer_state state;
|
|
u32 status;
|
|
|
|
status = vdpu_read(vpu, G2_REG_INTERRUPT);
|
|
state = (status & G2_REG_INTERRUPT_DEC_RDY_INT) ?
|
|
VB2_BUF_STATE_DONE : VB2_BUF_STATE_ERROR;
|
|
|
|
vdpu_write(vpu, 0, G2_REG_INTERRUPT);
|
|
vdpu_write(vpu, G2_REG_CONFIG_DEC_CLK_GATE_E, G2_REG_CONFIG);
|
|
|
|
hantro_irq_done(vpu, state);
|
|
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
size_t hantro_g2_chroma_offset(struct hantro_ctx *ctx)
|
|
{
|
|
return ctx->dst_fmt.width * ctx->dst_fmt.height * ctx->bit_depth / 8;
|
|
}
|
|
|
|
size_t hantro_g2_motion_vectors_offset(struct hantro_ctx *ctx)
|
|
{
|
|
size_t cr_offset = hantro_g2_chroma_offset(ctx);
|
|
|
|
return ALIGN((cr_offset * 3) / 2, G2_ALIGN);
|
|
}
|