162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Hantro VPU codec driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2018 Rockchip Electronics Co., Ltd.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include "hantro.h"
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cistatic const u8 zigzag[64] = {
1162306a36Sopenharmony_ci	0,   1,  8, 16,  9,  2,  3, 10,
1262306a36Sopenharmony_ci	17, 24, 32, 25, 18, 11,  4,  5,
1362306a36Sopenharmony_ci	12, 19, 26, 33, 40, 48, 41, 34,
1462306a36Sopenharmony_ci	27, 20, 13,  6,  7, 14, 21, 28,
1562306a36Sopenharmony_ci	35, 42, 49, 56, 57, 50, 43, 36,
1662306a36Sopenharmony_ci	29, 22, 15, 23, 30, 37, 44, 51,
1762306a36Sopenharmony_ci	58, 59, 52, 45, 38, 31, 39, 46,
1862306a36Sopenharmony_ci	53, 60, 61, 54, 47, 55, 62, 63
1962306a36Sopenharmony_ci};
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_civoid hantro_mpeg2_dec_copy_qtable(u8 *qtable,
2262306a36Sopenharmony_ci				  const struct v4l2_ctrl_mpeg2_quantisation *ctrl)
2362306a36Sopenharmony_ci{
2462306a36Sopenharmony_ci	int i, n;
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	if (!qtable || !ctrl)
2762306a36Sopenharmony_ci		return;
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(zigzag); i++) {
3062306a36Sopenharmony_ci		n = zigzag[i];
3162306a36Sopenharmony_ci		qtable[n + 0] = ctrl->intra_quantiser_matrix[i];
3262306a36Sopenharmony_ci		qtable[n + 64] = ctrl->non_intra_quantiser_matrix[i];
3362306a36Sopenharmony_ci		qtable[n + 128] = ctrl->chroma_intra_quantiser_matrix[i];
3462306a36Sopenharmony_ci		qtable[n + 192] = ctrl->chroma_non_intra_quantiser_matrix[i];
3562306a36Sopenharmony_ci	}
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ciint hantro_mpeg2_dec_init(struct hantro_ctx *ctx)
3962306a36Sopenharmony_ci{
4062306a36Sopenharmony_ci	struct hantro_dev *vpu = ctx->dev;
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	ctx->mpeg2_dec.qtable.size = ARRAY_SIZE(zigzag) * 4;
4362306a36Sopenharmony_ci	ctx->mpeg2_dec.qtable.cpu =
4462306a36Sopenharmony_ci		dma_alloc_coherent(vpu->dev,
4562306a36Sopenharmony_ci				   ctx->mpeg2_dec.qtable.size,
4662306a36Sopenharmony_ci				   &ctx->mpeg2_dec.qtable.dma,
4762306a36Sopenharmony_ci				   GFP_KERNEL);
4862306a36Sopenharmony_ci	if (!ctx->mpeg2_dec.qtable.cpu)
4962306a36Sopenharmony_ci		return -ENOMEM;
5062306a36Sopenharmony_ci	return 0;
5162306a36Sopenharmony_ci}
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_civoid hantro_mpeg2_dec_exit(struct hantro_ctx *ctx)
5462306a36Sopenharmony_ci{
5562306a36Sopenharmony_ci	struct hantro_dev *vpu = ctx->dev;
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci	dma_free_coherent(vpu->dev,
5862306a36Sopenharmony_ci			  ctx->mpeg2_dec.qtable.size,
5962306a36Sopenharmony_ci			  ctx->mpeg2_dec.qtable.cpu,
6062306a36Sopenharmony_ci			  ctx->mpeg2_dec.qtable.dma);
6162306a36Sopenharmony_ci}
62