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