media: imagination: Add E5010 JPEG Encoder driver

This adds support for stateful V4L2 M2M based driver for Imagination E5010
JPEG Encoder [1] which supports baseline encoding with two different
quantization tables and compression ratio as demanded.

Support for both contiguous and non-contiguous YUV420 and YUV422 semiplanar
formats is added along with alignment restrictions as required by the
hardware.

System and runtime PM hooks are added in the driver along with v4l2 crop
and selection API support.
Minimum resolution supported is 64x64 and
Maximum resolution supported is 8192x8192.

All v4l2-compliance tests are passing [2] :
v4l2-compliance -s -f -a  -d /dev/video0 -e /dev/video1

Total for e5010 device /dev/video0: 79, Succeeded: 79, Failed: 0,
Warnings: 0

NOTE: video1 here is VIVID test pattern generator

Also tests [3] were run manually to verify below driver features:
 - Runtime Power Management
 - Multi-instance JPEG Encoding
 - DMABUF import, export support
 - NV12, NV21, NV16, NV61 video format support
 - Compression quality S_CTRL
 - Cropping support using S_SELECTION

Existing V4L2 M2M based JPEG drivers namely s5p-jpeg, imx-jpeg and rcar_jpu
were referred while making this.

TODO:
Add MMU and memory tiling support

[1]:  AM62A TRM (Section 7.6 is for JPEG Encoder) :
Link: https://www.ti.com/lit/pdf/spruj16

[2]: v4l2-compliance test :
Link: https://gist.github.com/devarsht/1f039c631ca953a57f405cfce1b69e49

[3]: E5010 JPEG Encoder Manual tests :

Performance:
Link: https://gist.github.com/devarsht/c40672944fd71c9a53ab55adbfd9e28b

Functionality:
Link: https://gist.github.com/devarsht/8e88fcaabff016bb2bac83d89c9d23ce

Compression Quality:
Link: https://gist.github.com/devarsht/cbcc7cd97e8c48ba1486caa2b7884655

Multi Instance:
Link: https://gist.github.com/devarsht/22c2fca08cd3441fb40f2c7a4cebc95a

Crop support:
Link: https://gist.github.com/devarsht/de6f5142f678bb1a5338abfd9f814abd

Runtime PM:
Link: https://gist.github.com/devarsht/70cd95d4440ddc678489d93885ddd4dd

Co-developed-by: David Huang <d-huang@ti.com>
Signed-off-by: David Huang <d-huang@ti.com>
Signed-off-by: Devarsh Thakkar <devarsht@ti.com>
Reviewed-by: Benjamin Gaignard <benjamin.gaignard@collabora.com>
Signed-off-by: Sebastian Fricke <sebastian.fricke@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
This commit is contained in:
Devarsh Thakkar 2024-06-19 01:06:47 +05:30 committed by Hans Verkuil
parent dacd54eb2d
commit a1e2940458
11 changed files with 3133 additions and 0 deletions

View file

@ -10767,8 +10767,10 @@ F: drivers/auxdisplay/img-ascii-lcd.c
IMGTEC JPEG ENCODER DRIVER
M: Devarsh Thakkar <devarsht@ti.com>
L: linux-media@vger.kernel.org
S: Supported
F: Documentation/devicetree/bindings/media/img,e5010-jpeg-enc.yaml
F: drivers/media/platform/imagination/e5010*
IMGTEC IR DECODER DRIVER
S: Orphan

View file

@ -70,6 +70,7 @@ source "drivers/media/platform/atmel/Kconfig"
source "drivers/media/platform/broadcom/Kconfig"
source "drivers/media/platform/cadence/Kconfig"
source "drivers/media/platform/chips-media/Kconfig"
source "drivers/media/platform/imagination/Kconfig"
source "drivers/media/platform/intel/Kconfig"
source "drivers/media/platform/marvell/Kconfig"
source "drivers/media/platform/mediatek/Kconfig"

View file

@ -13,6 +13,7 @@ obj-y += atmel/
obj-y += broadcom/
obj-y += cadence/
obj-y += chips-media/
obj-y += imagination/
obj-y += intel/
obj-y += marvell/
obj-y += mediatek/

View file

@ -0,0 +1,12 @@
# SPDX-License-Identifier: GPL-2.0
config VIDEO_E5010_JPEG_ENC
tristate "Imagination E5010 JPEG Encoder Driver"
depends on VIDEO_DEV
select VIDEOBUF2_DMA_CONTIG
select VIDEOBUF2_VMALLOC
select V4L2_MEM2MEM_DEV
help
This is a video4linux2 M2M driver for Imagination E5010 JPEG encoder,
which supports JPEG and MJPEG baseline encoding of YUV422 and YUV420
semiplanar video formats, with resolution ranging from 64x64 to 8K x 8K
pixels. The module will be named as e5010_jpeg_enc.

View file

@ -0,0 +1,3 @@
# SPDX-License-Identifier: GPL-2.0
e5010_jpeg_enc-objs := e5010-jpeg-enc-hw.o e5010-jpeg-enc.o
obj-$(CONFIG_VIDEO_E5010_JPEG_ENC) += e5010_jpeg_enc.o

View file

@ -0,0 +1,585 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Imagination E5010 JPEG Encoder driver.
*
* Copyright (C) 2023 Texas Instruments Incorporated - https://www.ti.com/
*
* Author: David Huang <d-huang@ti.com>
* Author: Devarsh Thakkar <devarsht@ti.com>
*/
#ifndef _E5010_CORE_REGS_H
#define _E5010_CORE_REGS_H
#define JASPER_CORE_ID_OFFSET (0x0000)
#define JASPER_CORE_ID_CR_GROUP_ID_MASK (0xFF000000)
#define JASPER_CORE_ID_CR_GROUP_ID_SHIFT (24)
#define JASPER_CORE_ID_CR_CORE_ID_MASK (0x00FF0000)
#define JASPER_CORE_ID_CR_CORE_ID_SHIFT (16)
#define JASPER_CORE_ID_CR_UNIQUE_NUM_MASK (0x0000FFF8)
#define JASPER_CORE_ID_CR_UNIQUE_NUM_SHIFT (3)
#define JASPER_CORE_ID_CR_PELS_PER_CYCLE_MASK (0x00000007)
#define JASPER_CORE_ID_CR_PELS_PER_CYCLE_SHIFT (0)
#define JASPER_CORE_REV_OFFSET (0x0004)
#define JASPER_CORE_REV_CR_JASPER_DESIGNER_MASK (0xFF000000)
#define JASPER_CORE_REV_CR_JASPER_DESIGNER_SHIFT (24)
#define JASPER_CORE_REV_CR_JASPER_MAJOR_REV_MASK (0x00FF0000)
#define JASPER_CORE_REV_CR_JASPER_MAJOR_REV_SHIFT (16)
#define JASPER_CORE_REV_CR_JASPER_MINOR_REV_MASK (0x0000FF00)
#define JASPER_CORE_REV_CR_JASPER_MINOR_REV_SHIFT (8)
#define JASPER_CORE_REV_CR_JASPER_MAINT_REV_MASK (0x000000FF)
#define JASPER_CORE_REV_CR_JASPER_MAINT_REV_SHIFT (0)
#define JASPER_INTERRUPT_MASK_OFFSET (0x0008)
#define JASPER_INTERRUPT_MASK_CR_OUTPUT_ADDRESS_ERROR_ENABLE_MASK (0x00000002)
#define JASPER_INTERRUPT_MASK_CR_OUTPUT_ADDRESS_ERROR_ENABLE_SHIFT (1)
#define JASPER_INTERRUPT_MASK_CR_PICTURE_DONE_ENABLE_MASK (0x00000001)
#define JASPER_INTERRUPT_MASK_CR_PICTURE_DONE_ENABLE_SHIFT (0)
#define JASPER_INTERRUPT_STATUS_OFFSET (0x000C)
#define JASPER_INTERRUPT_STATUS_CR_OUTPUT_ADDRESS_ERROR_IRQ_MASK (0x00000002)
#define JASPER_INTERRUPT_STATUS_CR_OUTPUT_ADDRESS_ERROR_IRQ_SHIFT (1)
#define JASPER_INTERRUPT_STATUS_CR_PICTURE_DONE_IRQ_MASK (0x00000001)
#define JASPER_INTERRUPT_STATUS_CR_PICTURE_DONE_IRQ_SHIFT (0)
#define JASPER_INTERRUPT_CLEAR_OFFSET (0x0010)
#define JASPER_INTERRUPT_CLEAR_CR_OUTPUT_ERROR_CLEAR_MASK (0x00000002)
#define JASPER_INTERRUPT_CLEAR_CR_OUTPUT_ERROR_CLEAR_SHIFT (1)
#define JASPER_INTERRUPT_CLEAR_CR_PICTURE_DONE_CLEAR_MASK (0x00000001)
#define JASPER_INTERRUPT_CLEAR_CR_PICTURE_DONE_CLEAR_SHIFT (0)
#define JASPER_CLK_CONTROL_OFFSET (0x0014)
#define JASPER_CLK_CONTROL_CR_JASPER_AUTO_CLKG_ENABLE_MASK (0x00000002)
#define JASPER_CLK_CONTROL_CR_JASPER_AUTO_CLKG_ENABLE_SHIFT (1)
#define JASPER_CLK_CONTROL_CR_JASPER_MAN_CLKG_ENABLE_MASK (0x00000001)
#define JASPER_CLK_CONTROL_CR_JASPER_MAN_CLKG_ENABLE_SHIFT (0)
#define JASPER_CLK_STATUS_OFFSET (0x0018)
#define JASPER_CLK_STATUS_CR_JASPER_CLKG_STATUS_MASK (0x00000001)
#define JASPER_CLK_STATUS_CR_JASPER_CLKG_STATUS_SHIFT (0)
#define JASPER_RESET_OFFSET (0x001C)
#define JASPER_RESET_CR_SYS_RESET_MASK (0x00000002)
#define JASPER_RESET_CR_SYS_RESET_SHIFT (1)
#define JASPER_RESET_CR_CORE_RESET_MASK (0x00000001)
#define JASPER_RESET_CR_CORE_RESET_SHIFT (0)
#define JASPER_CORE_CTRL_OFFSET (0x0020)
#define JASPER_CORE_CTRL_CR_JASPER_ENCODE_START_MASK (0x00000001)
#define JASPER_CORE_CTRL_CR_JASPER_ENCODE_START_SHIFT (0)
#define JASPER_STATUS_OFFSET (0x0024)
#define JASPER_STATUS_CR_FLUSH_MODE_MASK (0x00000002)
#define JASPER_STATUS_CR_FLUSH_MODE_SHIFT (1)
#define JASPER_STATUS_CR_JASPER_BUSY_MASK (0x00000001)
#define JASPER_STATUS_CR_JASPER_BUSY_SHIFT (0)
#define JASPER_CRC_CLEAR_OFFSET (0x0028)
#define JASPER_CRC_CLEAR_CR_FRONT_END_CRC_CLEAR_MASK (0x00000001)
#define JASPER_CRC_CLEAR_CR_FRONT_END_CRC_CLEAR_SHIFT (0)
#define JASPER_CRC_CLEAR_CR_DCT_CRC_CLEAR_MASK (0x00000002)
#define JASPER_CRC_CLEAR_CR_DCT_CRC_CLEAR_SHIFT (1)
#define JASPER_CRC_CLEAR_CR_ZZ_CRC_CLEAR_MASK (0x00000004)
#define JASPER_CRC_CLEAR_CR_ZZ_CRC_CLEAR_SHIFT (2)
#define JASPER_CRC_CLEAR_CR_QUANT_CRC_CLEAR_MASK (0x00000008)
#define JASPER_CRC_CLEAR_CR_QUANT_CRC_CLEAR_SHIFT (3)
#define JASPER_CRC_CLEAR_CR_ENTROPY_ENCODER_CRC_CLEAR_MASK (0x00000010)
#define JASPER_CRC_CLEAR_CR_ENTROPY_ENCODER_CRC_CLEAR_SHIFT (4)
#define JASPER_CRC_CLEAR_CR_PACKING_BUFFER_CRC_CLEAR_MASK (0x00000020)
#define JASPER_CRC_CLEAR_CR_PACKING_BUFFER_CRC_CLEAR_SHIFT (5)
#define JASPER_INPUT_CTRL0_OFFSET (0x002C)
#define JASPER_INPUT_CTRL0_CR_INPUT_CHROMA_ORDER_MASK (0x01000000)
#define JASPER_INPUT_CTRL0_CR_INPUT_CHROMA_ORDER_SHIFT (24)
#define JASPER_INPUT_CTRL0_CR_INPUT_SUBSAMPLING_MASK (0x00030000)
#define JASPER_INPUT_CTRL0_CR_INPUT_SUBSAMPLING_SHIFT (16)
#define JASPER_INPUT_CTRL0_CR_INPUT_SOURCE_MASK (0x00000004)
#define JASPER_INPUT_CTRL0_CR_INPUT_SOURCE_SHIFT (2)
#define JASPER_INPUT_CTRL1_OFFSET (0x0030)
#define JASPER_INPUT_CTRL1_CR_INPUT_LUMA_STRIDE_MASK (0x1FC00000)
#define JASPER_INPUT_CTRL1_CR_INPUT_LUMA_STRIDE_SHIFT (22)
#define JASPER_INPUT_CTRL1_CR_INPUT_CHROMA_STRIDE_MASK (0x00001FC0)
#define JASPER_INPUT_CTRL1_CR_INPUT_CHROMA_STRIDE_SHIFT (6)
#define JASPER_MMU_CTRL_OFFSET (0x0034)
#define JASPER_MMU_CTRL_CR_JASPER_TILING_SCHEME_MASK (0x00000002)
#define JASPER_MMU_CTRL_CR_JASPER_TILING_SCHEME_SHIFT (1)
#define JASPER_MMU_CTRL_CR_JASPER_TILING_ENABLE_MASK (0x00000001)
#define JASPER_MMU_CTRL_CR_JASPER_TILING_ENABLE_SHIFT (0)
#define JASPER_IMAGE_SIZE_OFFSET (0x0038)
#define JASPER_IMAGE_SIZE_CR_IMAGE_VERTICAL_SIZE_MASK (0x1FFF0000)
#define JASPER_IMAGE_SIZE_CR_IMAGE_VERTICAL_SIZE_SHIFT (16)
#define JASPER_IMAGE_SIZE_CR_IMAGE_HORIZONTAL_SIZE_MASK (0x00001FFF)
#define JASPER_IMAGE_SIZE_CR_IMAGE_HORIZONTAL_SIZE_SHIFT (0)
#define INPUT_LUMA_BASE_OFFSET (0x003C)
#define INPUT_LUMA_BASE_CR_INPUT_LUMA_BASE_MASK (0xFFFFFFC0)
#define INPUT_LUMA_BASE_CR_INPUT_LUMA_BASE_SHIFT (6)
#define INPUT_CHROMA_BASE_OFFSET (0x0040)
#define INPUT_CHROMA_BASE_CR_INPUT_CHROMA_BASE_MASK (0xFFFFFFC0)
#define INPUT_CHROMA_BASE_CR_INPUT_CHROMA_BASE_SHIFT (6)
#define JASPER_OUTPUT_BASE_OFFSET (0x0044)
#define JASPER_OUTPUT_BASE_CR_OUTPUT_BASE_MASK (0xFFFFFFFF)
#define JASPER_OUTPUT_BASE_CR_OUTPUT_BASE_SHIFT (0)
#define JASPER_OUTPUT_SIZE_OFFSET (0x0048)
#define JASPER_OUTPUT_SIZE_CR_OUTPUT_SIZE_MASK (0xFFFFFFFF)
#define JASPER_OUTPUT_SIZE_CR_OUTPUT_SIZE_SHIFT (0)
#define JASPER_OUTPUT_MAX_SIZE_OFFSET (0x004C)
#define JASPER_OUTPUT_MAX_SIZE_CR_OUTPUT_MAX_SIZE_MASK (0xFFFFFFFF)
#define JASPER_OUTPUT_MAX_SIZE_CR_OUTPUT_MAX_SIZE_SHIFT (0)
#define JASPER_LUMA_QUANTIZATION_TABLE0_OFFSET (0x0050)
#define JASPER_LUMA_QUANTIZATION_TABLE0_CR_LUMA_QUANTIZATION_TABLE_03_MASK (0xFF000000)
#define JASPER_LUMA_QUANTIZATION_TABLE0_CR_LUMA_QUANTIZATION_TABLE_03_SHIFT (24)
#define JASPER_LUMA_QUANTIZATION_TABLE0_CR_LUMA_QUANTIZATION_TABLE_02_MASK (0x00FF0000)
#define JASPER_LUMA_QUANTIZATION_TABLE0_CR_LUMA_QUANTIZATION_TABLE_02_SHIFT (16)
#define JASPER_LUMA_QUANTIZATION_TABLE0_CR_LUMA_QUANTIZATION_TABLE_01_MASK (0x0000FF00)
#define JASPER_LUMA_QUANTIZATION_TABLE0_CR_LUMA_QUANTIZATION_TABLE_01_SHIFT (8)
#define JASPER_LUMA_QUANTIZATION_TABLE0_CR_LUMA_QUANTIZATION_TABLE_00_MASK (0x000000FF)
#define JASPER_LUMA_QUANTIZATION_TABLE0_CR_LUMA_QUANTIZATION_TABLE_00_SHIFT (0)
#define JASPER_LUMA_QUANTIZATION_TABLE1_OFFSET (0x0054)
#define JASPER_LUMA_QUANTIZATION_TABLE1_CR_LUMA_QUANTIZATION_TABLE_07_MASK (0xFF000000)
#define JASPER_LUMA_QUANTIZATION_TABLE1_CR_LUMA_QUANTIZATION_TABLE_07_SHIFT (24)
#define JASPER_LUMA_QUANTIZATION_TABLE1_CR_LUMA_QUANTIZATION_TABLE_06_MASK (0x00FF0000)
#define JASPER_LUMA_QUANTIZATION_TABLE1_CR_LUMA_QUANTIZATION_TABLE_06_SHIFT (16)
#define JASPER_LUMA_QUANTIZATION_TABLE1_CR_LUMA_QUANTIZATION_TABLE_05_MASK (0x0000FF00)
#define JASPER_LUMA_QUANTIZATION_TABLE1_CR_LUMA_QUANTIZATION_TABLE_05_SHIFT (8)
#define JASPER_LUMA_QUANTIZATION_TABLE1_CR_LUMA_QUANTIZATION_TABLE_04_MASK (0x000000FF)
#define JASPER_LUMA_QUANTIZATION_TABLE1_CR_LUMA_QUANTIZATION_TABLE_04_SHIFT (0)
#define JASPER_LUMA_QUANTIZATION_TABLE2_OFFSET (0x0058)
#define JASPER_LUMA_QUANTIZATION_TABLE2_CR_LUMA_QUANTIZATION_TABLE_13_MASK (0xFF000000)
#define JASPER_LUMA_QUANTIZATION_TABLE2_CR_LUMA_QUANTIZATION_TABLE_13_SHIFT (24)
#define JASPER_LUMA_QUANTIZATION_TABLE2_CR_LUMA_QUANTIZATION_TABLE_12_MASK (0x00FF0000)
#define JASPER_LUMA_QUANTIZATION_TABLE2_CR_LUMA_QUANTIZATION_TABLE_12_SHIFT (16)
#define JASPER_LUMA_QUANTIZATION_TABLE2_CR_LUMA_QUANTIZATION_TABLE_11_MASK (0x0000FF00)
#define JASPER_LUMA_QUANTIZATION_TABLE2_CR_LUMA_QUANTIZATION_TABLE_11_SHIFT (8)
#define JASPER_LUMA_QUANTIZATION_TABLE2_CR_LUMA_QUANTIZATION_TABLE_10_MASK (0x000000FF)
#define JASPER_LUMA_QUANTIZATION_TABLE2_CR_LUMA_QUANTIZATION_TABLE_10_SHIFT (0)
#define JASPER_LUMA_QUANTIZATION_TABLE3_OFFSET (0x005C)
#define JASPER_LUMA_QUANTIZATION_TABLE3_CR_LUMA_QUANTIZATION_TABLE_17_MASK (0xFF000000)
#define JASPER_LUMA_QUANTIZATION_TABLE3_CR_LUMA_QUANTIZATION_TABLE_17_SHIFT (24)
#define JASPER_LUMA_QUANTIZATION_TABLE3_CR_LUMA_QUANTIZATION_TABLE_16_MASK (0x00FF0000)
#define JASPER_LUMA_QUANTIZATION_TABLE3_CR_LUMA_QUANTIZATION_TABLE_16_SHIFT (16)
#define JASPER_LUMA_QUANTIZATION_TABLE3_CR_LUMA_QUANTIZATION_TABLE_15_MASK (0x0000FF00)
#define JASPER_LUMA_QUANTIZATION_TABLE3_CR_LUMA_QUANTIZATION_TABLE_15_SHIFT (8)
#define JASPER_LUMA_QUANTIZATION_TABLE3_CR_LUMA_QUANTIZATION_TABLE_14_MASK (0x000000FF)
#define JASPER_LUMA_QUANTIZATION_TABLE3_CR_LUMA_QUANTIZATION_TABLE_14_SHIFT (0)
#define JASPER_LUMA_QUANTIZATION_TABLE4_OFFSET (0x0060)
#define JASPER_LUMA_QUANTIZATION_TABLE4_CR_LUMA_QUANTIZATION_TABLE_21_MASK (0x0000FF00)
#define JASPER_LUMA_QUANTIZATION_TABLE4_CR_LUMA_QUANTIZATION_TABLE_21_SHIFT (8)
#define JASPER_LUMA_QUANTIZATION_TABLE4_CR_LUMA_QUANTIZATION_TABLE_20_MASK (0x000000FF)
#define JASPER_LUMA_QUANTIZATION_TABLE4_CR_LUMA_QUANTIZATION_TABLE_20_SHIFT (0)
#define JASPER_LUMA_QUANTIZATION_TABLE5_OFFSET (0x0064)
#define JASPER_LUMA_QUANTIZATION_TABLE5_CR_LUMA_QUANTIZATION_TABLE_27_MASK (0xFF000000)
#define JASPER_LUMA_QUANTIZATION_TABLE5_CR_LUMA_QUANTIZATION_TABLE_27_SHIFT (24)
#define JASPER_LUMA_QUANTIZATION_TABLE5_CR_LUMA_QUANTIZATION_TABLE_26_MASK (0x00FF0000)
#define JASPER_LUMA_QUANTIZATION_TABLE5_CR_LUMA_QUANTIZATION_TABLE_26_SHIFT (16)
#define JASPER_LUMA_QUANTIZATION_TABLE5_CR_LUMA_QUANTIZATION_TABLE_25_MASK (0x0000FF00)
#define JASPER_LUMA_QUANTIZATION_TABLE5_CR_LUMA_QUANTIZATION_TABLE_25_SHIFT (8)
#define JASPER_LUMA_QUANTIZATION_TABLE5_CR_LUMA_QUANTIZATION_TABLE_24_MASK (0x000000FF)
#define JASPER_LUMA_QUANTIZATION_TABLE5_CR_LUMA_QUANTIZATION_TABLE_24_SHIFT (0)
#define JASPER_LUMA_QUANTIZATION_TABLE6_OFFSET (0x0068)
#define JASPER_LUMA_QUANTIZATION_TABLE6_CR_LUMA_QUANTIZATION_TABLE_33_MASK (0xFF000000)
#define JASPER_LUMA_QUANTIZATION_TABLE6_CR_LUMA_QUANTIZATION_TABLE_33_SHIFT (24)
#define JASPER_LUMA_QUANTIZATION_TABLE6_CR_LUMA_QUANTIZATION_TABLE_32_MASK (0x00FF0000)
#define JASPER_LUMA_QUANTIZATION_TABLE6_CR_LUMA_QUANTIZATION_TABLE_32_SHIFT (16)
#define JASPER_LUMA_QUANTIZATION_TABLE6_CR_LUMA_QUANTIZATION_TABLE_31_MASK (0x0000FF00)
#define JASPER_LUMA_QUANTIZATION_TABLE6_CR_LUMA_QUANTIZATION_TABLE_31_SHIFT (8)
#define JASPER_LUMA_QUANTIZATION_TABLE6_CR_LUMA_QUANTIZATION_TABLE_30_MASK (0x000000FF)
#define JASPER_LUMA_QUANTIZATION_TABLE6_CR_LUMA_QUANTIZATION_TABLE_30_SHIFT (0)
#define JASPER_LUMA_QUANTIZATION_TABLE7_OFFSET (0x006C)
#define JASPER_LUMA_QUANTIZATION_TABLE7_CR_LUMA_QUANTIZATION_TABLE_37_MASK (0xFF000000)
#define JASPER_LUMA_QUANTIZATION_TABLE7_CR_LUMA_QUANTIZATION_TABLE_37_SHIFT (24)
#define JASPER_LUMA_QUANTIZATION_TABLE7_CR_LUMA_QUANTIZATION_TABLE_36_MASK (0x00FF0000)
#define JASPER_LUMA_QUANTIZATION_TABLE7_CR_LUMA_QUANTIZATION_TABLE_36_SHIFT (16)
#define JASPER_LUMA_QUANTIZATION_TABLE7_CR_LUMA_QUANTIZATION_TABLE_35_MASK (0x0000FF00)
#define JASPER_LUMA_QUANTIZATION_TABLE7_CR_LUMA_QUANTIZATION_TABLE_35_SHIFT (8)
#define JASPER_LUMA_QUANTIZATION_TABLE7_CR_LUMA_QUANTIZATION_TABLE_34_MASK (0x000000FF)
#define JASPER_LUMA_QUANTIZATION_TABLE7_CR_LUMA_QUANTIZATION_TABLE_34_SHIFT (0)
#define JASPER_LUMA_QUANTIZATION_TABLE8_OFFSET (0x0070)
#define JASPER_LUMA_QUANTIZATION_TABLE8_CR_LUMA_QUANTIZATION_TABLE_43_MASK (0xFF000000)
#define JASPER_LUMA_QUANTIZATION_TABLE8_CR_LUMA_QUANTIZATION_TABLE_43_SHIFT (24)
#define JASPER_LUMA_QUANTIZATION_TABLE8_CR_LUMA_QUANTIZATION_TABLE_42_MASK (0x00FF0000)
#define JASPER_LUMA_QUANTIZATION_TABLE8_CR_LUMA_QUANTIZATION_TABLE_42_SHIFT (16)
#define JASPER_LUMA_QUANTIZATION_TABLE8_CR_LUMA_QUANTIZATION_TABLE_41_MASK (0x0000FF00)
#define JASPER_LUMA_QUANTIZATION_TABLE8_CR_LUMA_QUANTIZATION_TABLE_41_SHIFT (8)
#define JASPER_LUMA_QUANTIZATION_TABLE8_CR_LUMA_QUANTIZATION_TABLE_40_MASK (0x000000FF)
#define JASPER_LUMA_QUANTIZATION_TABLE8_CR_LUMA_QUANTIZATION_TABLE_40_SHIFT (0)
#define JASPER_LUMA_QUANTIZATION_TABLE9_OFFSET (0x0074)
#define JASPER_LUMA_QUANTIZATION_TABLE9_CR_LUMA_QUANTIZATION_TABLE_47_MASK (0xFF000000)
#define JASPER_LUMA_QUANTIZATION_TABLE9_CR_LUMA_QUANTIZATION_TABLE_47_SHIFT (24)
#define JASPER_LUMA_QUANTIZATION_TABLE9_CR_LUMA_QUANTIZATION_TABLE_46_MASK (0x00FF0000)
#define JASPER_LUMA_QUANTIZATION_TABLE9_CR_LUMA_QUANTIZATION_TABLE_46_SHIFT (16)
#define JASPER_LUMA_QUANTIZATION_TABLE9_CR_LUMA_QUANTIZATION_TABLE_45_MASK (0x0000FF00)
#define JASPER_LUMA_QUANTIZATION_TABLE9_CR_LUMA_QUANTIZATION_TABLE_45_SHIFT (8)
#define JASPER_LUMA_QUANTIZATION_TABLE9_CR_LUMA_QUANTIZATION_TABLE_44_MASK (0x000000FF)
#define JASPER_LUMA_QUANTIZATION_TABLE9_CR_LUMA_QUANTIZATION_TABLE_44_SHIFT (0)
#define JASPER_LUMA_QUANTIZATION_TABLE10_OFFSET (0x0078)
#define JASPER_LUMA_QUANTIZATION_TABLE10_CR_LUMA_QUANTIZATION_TABLE_53_MASK (0xFF000000)
#define JASPER_LUMA_QUANTIZATION_TABLE10_CR_LUMA_QUANTIZATION_TABLE_53_SHIFT (24)
#define JASPER_LUMA_QUANTIZATION_TABLE10_CR_LUMA_QUANTIZATION_TABLE_52_MASK (0x00FF0000)
#define JASPER_LUMA_QUANTIZATION_TABLE10_CR_LUMA_QUANTIZATION_TABLE_52_SHIFT (16)
#define JASPER_LUMA_QUANTIZATION_TABLE10_CR_LUMA_QUANTIZATION_TABLE_51_MASK (0x0000FF00)
#define JASPER_LUMA_QUANTIZATION_TABLE10_CR_LUMA_QUANTIZATION_TABLE_51_SHIFT (8)
#define JASPER_LUMA_QUANTIZATION_TABLE10_CR_LUMA_QUANTIZATION_TABLE_50_MASK (0x000000FF)
#define JASPER_LUMA_QUANTIZATION_TABLE10_CR_LUMA_QUANTIZATION_TABLE_50_SHIFT (0)
#define JASPER_LUMA_QUANTIZATION_TABLE11_OFFSET (0x007C)
#define JASPER_LUMA_QUANTIZATION_TABLE11_CR_LUMA_QUANTIZATION_TABLE_57_MASK (0xFF000000)
#define JASPER_LUMA_QUANTIZATION_TABLE11_CR_LUMA_QUANTIZATION_TABLE_57_SHIFT (24)
#define JASPER_LUMA_QUANTIZATION_TABLE11_CR_LUMA_QUANTIZATION_TABLE_56_MASK (0x00FF0000)
#define JASPER_LUMA_QUANTIZATION_TABLE11_CR_LUMA_QUANTIZATION_TABLE_56_SHIFT (16)
#define JASPER_LUMA_QUANTIZATION_TABLE11_CR_LUMA_QUANTIZATION_TABLE_55_MASK (0x0000FF00)
#define JASPER_LUMA_QUANTIZATION_TABLE11_CR_LUMA_QUANTIZATION_TABLE_55_SHIFT (8)
#define JASPER_LUMA_QUANTIZATION_TABLE11_CR_LUMA_QUANTIZATION_TABLE_54_MASK (0x000000FF)
#define JASPER_LUMA_QUANTIZATION_TABLE11_CR_LUMA_QUANTIZATION_TABLE_54_SHIFT (0)
#define JASPER_LUMA_QUANTIZATION_TABLE12_OFFSET (0x0080)
#define JASPER_LUMA_QUANTIZATION_TABLE12_CR_LUMA_QUANTIZATION_TABLE_63_MASK (0xFF000000)
#define JASPER_LUMA_QUANTIZATION_TABLE12_CR_LUMA_QUANTIZATION_TABLE_63_SHIFT (24)
#define JASPER_LUMA_QUANTIZATION_TABLE12_CR_LUMA_QUANTIZATION_TABLE_62_MASK (0x00FF0000)
#define JASPER_LUMA_QUANTIZATION_TABLE12_CR_LUMA_QUANTIZATION_TABLE_62_SHIFT (16)
#define JASPER_LUMA_QUANTIZATION_TABLE12_CR_LUMA_QUANTIZATION_TABLE_61_MASK (0x0000FF00)
#define JASPER_LUMA_QUANTIZATION_TABLE12_CR_LUMA_QUANTIZATION_TABLE_61_SHIFT (8)
#define JASPER_LUMA_QUANTIZATION_TABLE12_CR_LUMA_QUANTIZATION_TABLE_60_MASK (0x000000FF)
#define JASPER_LUMA_QUANTIZATION_TABLE12_CR_LUMA_QUANTIZATION_TABLE_60_SHIFT (0)
#define JASPER_LUMA_QUANTIZATION_TABLE13_OFFSET (0x0084)
#define JASPER_LUMA_QUANTIZATION_TABLE13_CR_LUMA_QUANTIZATION_TABLE_67_MASK (0xFF000000)
#define JASPER_LUMA_QUANTIZATION_TABLE13_CR_LUMA_QUANTIZATION_TABLE_67_SHIFT (24)
#define JASPER_LUMA_QUANTIZATION_TABLE13_CR_LUMA_QUANTIZATION_TABLE_66_MASK (0x00FF0000)
#define JASPER_LUMA_QUANTIZATION_TABLE13_CR_LUMA_QUANTIZATION_TABLE_66_SHIFT (16)
#define JASPER_LUMA_QUANTIZATION_TABLE13_CR_LUMA_QUANTIZATION_TABLE_65_MASK (0x0000FF00)
#define JASPER_LUMA_QUANTIZATION_TABLE13_CR_LUMA_QUANTIZATION_TABLE_65_SHIFT (8)
#define JASPER_LUMA_QUANTIZATION_TABLE13_CR_LUMA_QUANTIZATION_TABLE_64_MASK (0x000000FF)
#define JASPER_LUMA_QUANTIZATION_TABLE13_CR_LUMA_QUANTIZATION_TABLE_64_SHIFT (0)
#define JASPER_LUMA_QUANTIZATION_TABLE14_OFFSET (0x0088)
#define JASPER_LUMA_QUANTIZATION_TABLE14_CR_LUMA_QUANTIZATION_TABLE_73_MASK (0xFF000000)
#define JASPER_LUMA_QUANTIZATION_TABLE14_CR_LUMA_QUANTIZATION_TABLE_73_SHIFT (24)
#define JASPER_LUMA_QUANTIZATION_TABLE14_CR_LUMA_QUANTIZATION_TABLE_72_MASK (0x00FF0000)
#define JASPER_LUMA_QUANTIZATION_TABLE14_CR_LUMA_QUANTIZATION_TABLE_72_SHIFT (16)
#define JASPER_LUMA_QUANTIZATION_TABLE14_CR_LUMA_QUANTIZATION_TABLE_71_MASK (0x0000FF00)
#define JASPER_LUMA_QUANTIZATION_TABLE14_CR_LUMA_QUANTIZATION_TABLE_71_SHIFT (8)
#define JASPER_LUMA_QUANTIZATION_TABLE14_CR_LUMA_QUANTIZATION_TABLE_70_MASK (0x000000FF)
#define JASPER_LUMA_QUANTIZATION_TABLE14_CR_LUMA_QUANTIZATION_TABLE_70_SHIFT (0)
#define JASPER_LUMA_QUANTIZATION_TABLE15_OFFSET (0x008C)
#define JASPER_LUMA_QUANTIZATION_TABLE15_CR_LUMA_QUANTIZATION_TABLE_77_MASK (0xFF000000)
#define JASPER_LUMA_QUANTIZATION_TABLE15_CR_LUMA_QUANTIZATION_TABLE_77_SHIFT (24)
#define JASPER_LUMA_QUANTIZATION_TABLE15_CR_LUMA_QUANTIZATION_TABLE_76_MASK (0x00FF0000)
#define JASPER_LUMA_QUANTIZATION_TABLE15_CR_LUMA_QUANTIZATION_TABLE_76_SHIFT (16)
#define JASPER_LUMA_QUANTIZATION_TABLE15_CR_LUMA_QUANTIZATION_TABLE_75_MASK (0x0000FF00)
#define JASPER_LUMA_QUANTIZATION_TABLE15_CR_LUMA_QUANTIZATION_TABLE_75_SHIFT (8)
#define JASPER_LUMA_QUANTIZATION_TABLE15_CR_LUMA_QUANTIZATION_TABLE_74_MASK (0x000000FF)
#define JASPER_LUMA_QUANTIZATION_TABLE15_CR_LUMA_QUANTIZATION_TABLE_74_SHIFT (0)
#define JASPER_CHROMA_QUANTIZATION_TABLE0_OFFSET (0x0090)
#define JASPER_CHROMA_QUANTIZATION_TABLE0_CR_CHROMA_QUANTIZATION_TABLE_03_MASK (0xFF000000)
#define JASPER_CHROMA_QUANTIZATION_TABLE0_CR_CHROMA_QUANTIZATION_TABLE_03_SHIFT (24)
#define JASPER_CHROMA_QUANTIZATION_TABLE0_CR_CHROMA_QUANTIZATION_TABLE_02_MASK (0x00FF0000)
#define JASPER_CHROMA_QUANTIZATION_TABLE0_CR_CHROMA_QUANTIZATION_TABLE_02_SHIFT (16)
#define JASPER_CHROMA_QUANTIZATION_TABLE0_CR_CHROMA_QUANTIZATION_TABLE_01_MASK (0x0000FF00)
#define JASPER_CHROMA_QUANTIZATION_TABLE0_CR_CHROMA_QUANTIZATION_TABLE_01_SHIFT (8)
#define JASPER_CHROMA_QUANTIZATION_TABLE0_CR_CHROMA_QUANTIZATION_TABLE_00_MASK (0x000000FF)
#define JASPER_CHROMA_QUANTIZATION_TABLE0_CR_CHROMA_QUANTIZATION_TABLE_00_SHIFT (0)
#define JASPER_CHROMA_QUANTIZATION_TABLE1_OFFSET (0x0094)
#define JASPER_CHROMA_QUANTIZATION_TABLE1_CR_CHROMA_QUANTIZATION_TABLE_07_MASK (0xFF000000)
#define JASPER_CHROMA_QUANTIZATION_TABLE1_CR_CHROMA_QUANTIZATION_TABLE_07_SHIFT (24)
#define JASPER_CHROMA_QUANTIZATION_TABLE1_CR_CHROMA_QUANTIZATION_TABLE_06_MASK (0x00FF0000)
#define JASPER_CHROMA_QUANTIZATION_TABLE1_CR_CHROMA_QUANTIZATION_TABLE_06_SHIFT (16)
#define JASPER_CHROMA_QUANTIZATION_TABLE1_CR_CHROMA_QUANTIZATION_TABLE_05_MASK (0x0000FF00)
#define JASPER_CHROMA_QUANTIZATION_TABLE1_CR_CHROMA_QUANTIZATION_TABLE_05_SHIFT (8)
#define JASPER_CHROMA_QUANTIZATION_TABLE1_CR_CHROMA_QUANTIZATION_TABLE_04_MASK (0x000000FF)
#define JASPER_CHROMA_QUANTIZATION_TABLE1_CR_CHROMA_QUANTIZATION_TABLE_04_SHIFT (0)
#define JASPER_CHROMA_QUANTIZATION_TABLE2_OFFSET (0x0098)
#define JASPER_CHROMA_QUANTIZATION_TABLE2_CR_CHROMA_QUANTIZATION_TABLE_13_MASK (0xFF000000)
#define JASPER_CHROMA_QUANTIZATION_TABLE2_CR_CHROMA_QUANTIZATION_TABLE_13_SHIFT (24)
#define JASPER_CHROMA_QUANTIZATION_TABLE2_CR_CHROMA_QUANTIZATION_TABLE_12_MASK (0x00FF0000)
#define JASPER_CHROMA_QUANTIZATION_TABLE2_CR_CHROMA_QUANTIZATION_TABLE_12_SHIFT (16)
#define JASPER_CHROMA_QUANTIZATION_TABLE2_CR_CHROMA_QUANTIZATION_TABLE_11_MASK (0x0000FF00)
#define JASPER_CHROMA_QUANTIZATION_TABLE2_CR_CHROMA_QUANTIZATION_TABLE_11_SHIFT (8)
#define JASPER_CHROMA_QUANTIZATION_TABLE2_CR_CHROMA_QUANTIZATION_TABLE_10_MASK (0x000000FF)
#define JASPER_CHROMA_QUANTIZATION_TABLE2_CR_CHROMA_QUANTIZATION_TABLE_10_SHIFT (0)
#define JASPER_CHROMA_QUANTIZATION_TABLE3_OFFSET (0x009C)
#define JASPER_CHROMA_QUANTIZATION_TABLE3_CR_CHROMA_QUANTIZATION_TABLE_17_MASK (0xFF000000)
#define JASPER_CHROMA_QUANTIZATION_TABLE3_CR_CHROMA_QUANTIZATION_TABLE_17_SHIFT (24)
#define JASPER_CHROMA_QUANTIZATION_TABLE3_CR_CHROMA_QUANTIZATION_TABLE_16_MASK (0x00FF0000)
#define JASPER_CHROMA_QUANTIZATION_TABLE3_CR_CHROMA_QUANTIZATION_TABLE_16_SHIFT (16)
#define JASPER_CHROMA_QUANTIZATION_TABLE3_CR_CHROMA_QUANTIZATION_TABLE_15_MASK (0x0000FF00)
#define JASPER_CHROMA_QUANTIZATION_TABLE3_CR_CHROMA_QUANTIZATION_TABLE_15_SHIFT (8)
#define JASPER_CHROMA_QUANTIZATION_TABLE3_CR_CHROMA_QUANTIZATION_TABLE_14_MASK (0x000000FF)
#define JASPER_CHROMA_QUANTIZATION_TABLE3_CR_CHROMA_QUANTIZATION_TABLE_14_SHIFT (0)
#define JASPER_CHROMA_QUANTIZATION_TABLE4_OFFSET (0x00A0)
#define JASPER_CHROMA_QUANTIZATION_TABLE4_CR_CHROMA_QUANTIZATION_TABLE_23_MASK (0xFF000000)
#define JASPER_CHROMA_QUANTIZATION_TABLE4_CR_CHROMA_QUANTIZATION_TABLE_23_SHIFT (24)
#define JASPER_CHROMA_QUANTIZATION_TABLE4_CR_CHROMA_QUANTIZATION_TABLE_22_MASK (0x00FF0000)
#define JASPER_CHROMA_QUANTIZATION_TABLE4_CR_CHROMA_QUANTIZATION_TABLE_22_SHIFT (16)
#define JASPER_CHROMA_QUANTIZATION_TABLE4_CR_CHROMA_QUANTIZATION_TABLE_21_MASK (0x0000FF00)
#define JASPER_CHROMA_QUANTIZATION_TABLE4_CR_CHROMA_QUANTIZATION_TABLE_21_SHIFT (8)
#define JASPER_CHROMA_QUANTIZATION_TABLE4_CR_CHROMA_QUANTIZATION_TABLE_20_MASK (0x000000FF)
#define JASPER_CHROMA_QUANTIZATION_TABLE4_CR_CHROMA_QUANTIZATION_TABLE_20_SHIFT (0)
#define JASPER_CHROMA_QUANTIZATION_TABLE5_OFFSET (0x00A4)
#define JASPER_CHROMA_QUANTIZATION_TABLE5_CR_CHROMA_QUANTIZATION_TABLE_27_MASK (0xFF000000)
#define JASPER_CHROMA_QUANTIZATION_TABLE5_CR_CHROMA_QUANTIZATION_TABLE_27_SHIFT (24)
#define JASPER_CHROMA_QUANTIZATION_TABLE5_CR_CHROMA_QUANTIZATION_TABLE_26_MASK (0x00FF0000)
#define JASPER_CHROMA_QUANTIZATION_TABLE5_CR_CHROMA_QUANTIZATION_TABLE_26_SHIFT (16)
#define JASPER_CHROMA_QUANTIZATION_TABLE5_CR_CHROMA_QUANTIZATION_TABLE_25_MASK (0x0000FF00)
#define JASPER_CHROMA_QUANTIZATION_TABLE5_CR_CHROMA_QUANTIZATION_TABLE_25_SHIFT (8)
#define JASPER_CHROMA_QUANTIZATION_TABLE5_CR_CHROMA_QUANTIZATION_TABLE_24_MASK (0x000000FF)
#define JASPER_CHROMA_QUANTIZATION_TABLE5_CR_CHROMA_QUANTIZATION_TABLE_24_SHIFT (0)
#define JASPER_CHROMA_QUANTIZATION_TABLE6_OFFSET (0x00A8)
#define JASPER_CHROMA_QUANTIZATION_TABLE6_CR_CHROMA_QUANTIZATION_TABLE_33_MASK (0xFF000000)
#define JASPER_CHROMA_QUANTIZATION_TABLE6_CR_CHROMA_QUANTIZATION_TABLE_33_SHIFT (24)
#define JASPER_CHROMA_QUANTIZATION_TABLE6_CR_CHROMA_QUANTIZATION_TABLE_32_MASK (0x00FF0000)
#define JASPER_CHROMA_QUANTIZATION_TABLE6_CR_CHROMA_QUANTIZATION_TABLE_32_SHIFT (16)
#define JASPER_CHROMA_QUANTIZATION_TABLE6_CR_CHROMA_QUANTIZATION_TABLE_31_MASK (0x0000FF00)
#define JASPER_CHROMA_QUANTIZATION_TABLE6_CR_CHROMA_QUANTIZATION_TABLE_31_SHIFT (8)
#define JASPER_CHROMA_QUANTIZATION_TABLE6_CR_CHROMA_QUANTIZATION_TABLE_30_MASK (0x000000FF)
#define JASPER_CHROMA_QUANTIZATION_TABLE6_CR_CHROMA_QUANTIZATION_TABLE_30_SHIFT (0)
#define JASPER_CHROMA_QUANTIZATION_TABLE7_OFFSET (0x00AC)
#define JASPER_CHROMA_QUANTIZATION_TABLE7_CR_CHROMA_QUANTIZATION_TABLE_37_MASK (0xFF000000)
#define JASPER_CHROMA_QUANTIZATION_TABLE7_CR_CHROMA_QUANTIZATION_TABLE_37_SHIFT (24)
#define JASPER_CHROMA_QUANTIZATION_TABLE7_CR_CHROMA_QUANTIZATION_TABLE_36_MASK (0x00FF0000)
#define JASPER_CHROMA_QUANTIZATION_TABLE7_CR_CHROMA_QUANTIZATION_TABLE_36_SHIFT (16)
#define JASPER_CHROMA_QUANTIZATION_TABLE7_CR_CHROMA_QUANTIZATION_TABLE_35_MASK (0x0000FF00)
#define JASPER_CHROMA_QUANTIZATION_TABLE7_CR_CHROMA_QUANTIZATION_TABLE_35_SHIFT (8)
#define JASPER_CHROMA_QUANTIZATION_TABLE7_CR_CHROMA_QUANTIZATION_TABLE_34_MASK (0x000000FF)
#define JASPER_CHROMA_QUANTIZATION_TABLE7_CR_CHROMA_QUANTIZATION_TABLE_34_SHIFT (0)
#define JASPER_CHROMA_QUANTIZATION_TABLE8_OFFSET (0x00B0)
#define JASPER_CHROMA_QUANTIZATION_TABLE8_CR_CHROMA_QUANTIZATION_TABLE_43_MASK (0xFF000000)
#define JASPER_CHROMA_QUANTIZATION_TABLE8_CR_CHROMA_QUANTIZATION_TABLE_43_SHIFT (24)
#define JASPER_CHROMA_QUANTIZATION_TABLE8_CR_CHROMA_QUANTIZATION_TABLE_42_MASK (0x00FF0000)
#define JASPER_CHROMA_QUANTIZATION_TABLE8_CR_CHROMA_QUANTIZATION_TABLE_42_SHIFT (16)
#define JASPER_CHROMA_QUANTIZATION_TABLE8_CR_CHROMA_QUANTIZATION_TABLE_41_MASK (0x0000FF00)
#define JASPER_CHROMA_QUANTIZATION_TABLE8_CR_CHROMA_QUANTIZATION_TABLE_41_SHIFT (8)
#define JASPER_CHROMA_QUANTIZATION_TABLE8_CR_CHROMA_QUANTIZATION_TABLE_40_MASK (0x000000FF)
#define JASPER_CHROMA_QUANTIZATION_TABLE8_CR_CHROMA_QUANTIZATION_TABLE_40_SHIFT (0)
#define JASPER_CHROMA_QUANTIZATION_TABLE9_OFFSET (0x00B4)
#define JASPER_CHROMA_QUANTIZATION_TABLE9_CR_CHROMA_QUANTIZATION_TABLE_47_MASK (0xFF000000)
#define JASPER_CHROMA_QUANTIZATION_TABLE9_CR_CHROMA_QUANTIZATION_TABLE_47_SHIFT (24)
#define JASPER_CHROMA_QUANTIZATION_TABLE9_CR_CHROMA_QUANTIZATION_TABLE_46_MASK (0x00FF0000)
#define JASPER_CHROMA_QUANTIZATION_TABLE9_CR_CHROMA_QUANTIZATION_TABLE_46_SHIFT (16)
#define JASPER_CHROMA_QUANTIZATION_TABLE9_CR_CHROMA_QUANTIZATION_TABLE_45_MASK (0x0000FF00)
#define JASPER_CHROMA_QUANTIZATION_TABLE9_CR_CHROMA_QUANTIZATION_TABLE_45_SHIFT (8)
#define JASPER_CHROMA_QUANTIZATION_TABLE9_CR_CHROMA_QUANTIZATION_TABLE_44_MASK (0x000000FF)
#define JASPER_CHROMA_QUANTIZATION_TABLE9_CR_CHROMA_QUANTIZATION_TABLE_44_SHIFT (0)
#define JASPER_CHROMA_QUANTIZATION_TABLE10_OFFSET (0x00B8)
#define JASPER_CHROMA_QUANTIZATION_TABLE10_CR_CHROMA_QUANTIZATION_TABLE_53_MASK (0xFF000000)
#define JASPER_CHROMA_QUANTIZATION_TABLE10_CR_CHROMA_QUANTIZATION_TABLE_53_SHIFT (24)
#define JASPER_CHROMA_QUANTIZATION_TABLE10_CR_CHROMA_QUANTIZATION_TABLE_52_MASK (0x00FF0000)
#define JASPER_CHROMA_QUANTIZATION_TABLE10_CR_CHROMA_QUANTIZATION_TABLE_52_SHIFT (16)
#define JASPER_CHROMA_QUANTIZATION_TABLE10_CR_CHROMA_QUANTIZATION_TABLE_51_MASK (0x0000FF00)
#define JASPER_CHROMA_QUANTIZATION_TABLE10_CR_CHROMA_QUANTIZATION_TABLE_51_SHIFT (8)
#define JASPER_CHROMA_QUANTIZATION_TABLE10_CR_CHROMA_QUANTIZATION_TABLE_50_MASK (0x000000FF)
#define JASPER_CHROMA_QUANTIZATION_TABLE10_CR_CHROMA_QUANTIZATION_TABLE_50_SHIFT (0)
#define JASPER_CHROMA_QUANTIZATION_TABLE11_OFFSET (0x00BC)
#define JASPER_CHROMA_QUANTIZATION_TABLE11_CR_CHROMA_QUANTIZATION_TABLE_57_MASK (0xFF000000)
#define JASPER_CHROMA_QUANTIZATION_TABLE11_CR_CHROMA_QUANTIZATION_TABLE_57_SHIFT (24)
#define JASPER_CHROMA_QUANTIZATION_TABLE11_CR_CHROMA_QUANTIZATION_TABLE_56_MASK (0x00FF0000)
#define JASPER_CHROMA_QUANTIZATION_TABLE11_CR_CHROMA_QUANTIZATION_TABLE_56_SHIFT (16)
#define JASPER_CHROMA_QUANTIZATION_TABLE11_CR_CHROMA_QUANTIZATION_TABLE_55_MASK (0x0000FF00)
#define JASPER_CHROMA_QUANTIZATION_TABLE11_CR_CHROMA_QUANTIZATION_TABLE_55_SHIFT (8)
#define JASPER_CHROMA_QUANTIZATION_TABLE11_CR_CHROMA_QUANTIZATION_TABLE_54_MASK (0x000000FF)
#define JASPER_CHROMA_QUANTIZATION_TABLE11_CR_CHROMA_QUANTIZATION_TABLE_54_SHIFT (0)
#define JASPER_CHROMA_QUANTIZATION_TABLE12_OFFSET (0x00C0)
#define JASPER_CHROMA_QUANTIZATION_TABLE12_CR_CHROMA_QUANTIZATION_TABLE_63_MASK (0xFF000000)
#define JASPER_CHROMA_QUANTIZATION_TABLE12_CR_CHROMA_QUANTIZATION_TABLE_63_SHIFT (24)
#define JASPER_CHROMA_QUANTIZATION_TABLE12_CR_CHROMA_QUANTIZATION_TABLE_62_MASK (0x00FF0000)
#define JASPER_CHROMA_QUANTIZATION_TABLE12_CR_CHROMA_QUANTIZATION_TABLE_62_SHIFT (16)
#define JASPER_CHROMA_QUANTIZATION_TABLE12_CR_CHROMA_QUANTIZATION_TABLE_61_MASK (0x0000FF00)
#define JASPER_CHROMA_QUANTIZATION_TABLE12_CR_CHROMA_QUANTIZATION_TABLE_61_SHIFT (8)
#define JASPER_CHROMA_QUANTIZATION_TABLE12_CR_CHROMA_QUANTIZATION_TABLE_60_MASK (0x000000FF)
#define JASPER_CHROMA_QUANTIZATION_TABLE12_CR_CHROMA_QUANTIZATION_TABLE_60_SHIFT (0)
#define JASPER_CHROMA_QUANTIZATION_TABLE13_OFFSET (0x00C4)
#define JASPER_CHROMA_QUANTIZATION_TABLE13_CR_CHROMA_QUANTIZATION_TABLE_67_MASK (0xFF000000)
#define JASPER_CHROMA_QUANTIZATION_TABLE13_CR_CHROMA_QUANTIZATION_TABLE_67_SHIFT (24)
#define JASPER_CHROMA_QUANTIZATION_TABLE13_CR_CHROMA_QUANTIZATION_TABLE_66_MASK (0x00FF0000)
#define JASPER_CHROMA_QUANTIZATION_TABLE13_CR_CHROMA_QUANTIZATION_TABLE_66_SHIFT (16)
#define JASPER_CHROMA_QUANTIZATION_TABLE13_CR_CHROMA_QUANTIZATION_TABLE_65_MASK (0x0000FF00)
#define JASPER_CHROMA_QUANTIZATION_TABLE13_CR_CHROMA_QUANTIZATION_TABLE_65_SHIFT (8)
#define JASPER_CHROMA_QUANTIZATION_TABLE13_CR_CHROMA_QUANTIZATION_TABLE_64_MASK (0x000000FF)
#define JASPER_CHROMA_QUANTIZATION_TABLE13_CR_CHROMA_QUANTIZATION_TABLE_64_SHIFT (0)
#define JASPER_CHROMA_QUANTIZATION_TABLE14_OFFSET (0x00C8)
#define JASPER_CHROMA_QUANTIZATION_TABLE14_CR_CHROMA_QUANTIZATION_TABLE_73_MASK (0xFF000000)
#define JASPER_CHROMA_QUANTIZATION_TABLE14_CR_CHROMA_QUANTIZATION_TABLE_73_SHIFT (24)
#define JASPER_CHROMA_QUANTIZATION_TABLE14_CR_CHROMA_QUANTIZATION_TABLE_72_MASK (0x00FF0000)
#define JASPER_CHROMA_QUANTIZATION_TABLE14_CR_CHROMA_QUANTIZATION_TABLE_72_SHIFT (16)
#define JASPER_CHROMA_QUANTIZATION_TABLE14_CR_CHROMA_QUANTIZATION_TABLE_71_MASK (0x0000FF00)
#define JASPER_CHROMA_QUANTIZATION_TABLE14_CR_CHROMA_QUANTIZATION_TABLE_71_SHIFT (8)
#define JASPER_CHROMA_QUANTIZATION_TABLE14_CR_CHROMA_QUANTIZATION_TABLE_70_MASK (0x000000FF)
#define JASPER_CHROMA_QUANTIZATION_TABLE14_CR_CHROMA_QUANTIZATION_TABLE_70_SHIFT (0)
#define JASPER_CHROMA_QUANTIZATION_TABLE15_OFFSET (0x00CC)
#define JASPER_CHROMA_QUANTIZATION_TABLE15_CR_CHROMA_QUANTIZATION_TABLE_77_MASK (0xFF000000)
#define JASPER_CHROMA_QUANTIZATION_TABLE15_CR_CHROMA_QUANTIZATION_TABLE_77_SHIFT (24)
#define JASPER_CHROMA_QUANTIZATION_TABLE15_CR_CHROMA_QUANTIZATION_TABLE_76_MASK (0x00FF0000)
#define JASPER_CHROMA_QUANTIZATION_TABLE15_CR_CHROMA_QUANTIZATION_TABLE_76_SHIFT (16)
#define JASPER_CHROMA_QUANTIZATION_TABLE15_CR_CHROMA_QUANTIZATION_TABLE_75_MASK (0x0000FF00)
#define JASPER_CHROMA_QUANTIZATION_TABLE15_CR_CHROMA_QUANTIZATION_TABLE_75_SHIFT (8)
#define JASPER_CHROMA_QUANTIZATION_TABLE15_CR_CHROMA_QUANTIZATION_TABLE_74_MASK (0x000000FF)
#define JASPER_CHROMA_QUANTIZATION_TABLE15_CR_CHROMA_QUANTIZATION_TABLE_74_SHIFT (0)
#define JASPER_CRC_CTRL_OFFSET (0x00D0)
#define JASPER_CRC_CTRL_JASPER_CRC_ENABLE_MASK (0x00000001)
#define JASPER_CRC_CTRL_JASPER_CRC_ENABLE_SHIFT (0)
#define JASPER_FRONT_END_CRC_OFFSET (0x00D4)
#define JASPER_FRONT_END_CRC_CR_JASPER_FRONT_END_CRC_OUT_MASK (0xFFFFFFFF)
#define JASPER_FRONT_END_CRC_CR_JASPER_FRONT_END_CRC_OUT_SHIFT (0)
#define JASPER_DCT_CRC_OFFSET (0x00D8)
#define JASPER_DCT_CRC_CR_JASPER_DCT_CRC_OUT_MASK (0xFFFFFFFF)
#define JASPER_DCT_CRC_CR_JASPER_DCT_CRC_OUT_SHIFT (0)
#define JASPER_ZZ_CRC_OFFSET (0x00DC)
#define JASPER_ZZ_CRC_CR_JASPER_ZZ_CRC_OUT_MASK (0xFFFFFFFF)
#define JASPER_ZZ_CRC_CR_JASPER_ZZ_CRC_OUT_SHIFT (0)
#define JASPER_QUANT_CRC_OFFSET (0x00E0)
#define JASPER_QUANT_CRC_CR_JASPER_QUANT_CRC_OUT_MASK (0xFFFFFFFF)
#define JASPER_QUANT_CRC_CR_JASPER_QUANT_CRC_OUT_SHIFT (0)
#define JASPER_ENTROPY_ENCODER_CRC_OFFSET (0x00E4)
#define JASPER_ENTROPY_ENCODER_CRC_CR_JASPER_ENTROPY_CRC_OUT_MASK (0xFFFFFFFF)
#define JASPER_ENTROPY_ENCODER_CRC_CR_JASPER_ENTROPY_CRC_OUT_SHIFT (0)
#define JASPER_PACKING_BUFFER_DATA_CRC_OFFSET (0x00E8)
#define JASPER_PACKING_BUFFER_DATA_CRC_CR_JASPER_PACKING_DATA_CRC_OUT_MASK (0xFFFFFFFF)
#define JASPER_PACKING_BUFFER_DATA_CRC_CR_JASPER_PACKING_DATA_CRC_OUT_SHIFT (0)
#define JASPER_PACKING_BUFFER_ADDR_CRC_OFFSET (0x00EC)
#define JASPER_PACKING_BUFFER_ADDR_CRC_CR_JASPER_PACKING_ADDR_OUT_CRC_MASK (0xFFFFFFFF)
#define JASPER_PACKING_BUFFER_ADDR_CRC_CR_JASPER_PACKING_ADDR_OUT_CRC_SHIFT (0)
#define JASPER_CORE_BYTE_SIZE (0x00F0)
#endif

View file

@ -0,0 +1,267 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Imagination E5010 JPEG Encoder driver.
*
* Copyright (C) 2023 Texas Instruments Incorporated - https://www.ti.com/
*
* Author: David Huang <d-huang@ti.com>
* Author: Devarsh Thakkar <devarsht@ti.com>
*/
#include <linux/io.h>
#include <linux/iopoll.h>
#include <linux/dev_printk.h>
#include "e5010-jpeg-enc-hw.h"
static void write_reg_field(void __iomem *base, unsigned int offset, u32 mask,
unsigned int shift, u32 value)
{
u32 reg;
value <<= shift;
if (mask != 0xffffffff) {
reg = readl(base + offset);
value = (value & mask) | (reg & ~mask);
}
writel(value, (base + offset));
}
static int write_reg_field_not_busy(void __iomem *jasper_base, void __iomem *wr_base,
unsigned int offset, u32 mask, unsigned int shift,
u32 value)
{
int ret;
u32 val;
ret = readl_poll_timeout_atomic(jasper_base + JASPER_STATUS_OFFSET, val,
(val & JASPER_STATUS_CR_JASPER_BUSY_MASK) == 0,
2000, 50000);
if (ret)
return ret;
write_reg_field(wr_base, offset, mask, shift, value);
return 0;
}
void e5010_reset(struct device *dev, void __iomem *core_base, void __iomem *mmu_base)
{
int ret = 0;
u32 val;
write_reg_field(core_base, JASPER_RESET_OFFSET,
JASPER_RESET_CR_CORE_RESET_MASK,
JASPER_RESET_CR_CORE_RESET_SHIFT, 1);
write_reg_field(mmu_base, MMU_MMU_CONTROL1_OFFSET,
MMU_MMU_CONTROL1_MMU_SOFT_RESET_MASK,
MMU_MMU_CONTROL1_MMU_SOFT_RESET_SHIFT, 1);
ret = readl_poll_timeout_atomic(mmu_base + MMU_MMU_CONTROL1_OFFSET, val,
(val & MMU_MMU_CONTROL1_MMU_SOFT_RESET_MASK) == 0,
2000, 50000);
if (ret)
dev_warn(dev, "MMU soft reset timed out, forcing system soft reset\n");
write_reg_field(core_base, JASPER_RESET_OFFSET,
JASPER_RESET_CR_SYS_RESET_MASK,
JASPER_RESET_CR_SYS_RESET_SHIFT, 1);
}
void e5010_hw_bypass_mmu(void __iomem *mmu_base, u32 enable)
{
/* Bypass MMU */
write_reg_field(mmu_base,
MMU_MMU_ADDRESS_CONTROL_OFFSET,
MMU_MMU_ADDRESS_CONTROL_MMU_BYPASS_MASK,
MMU_MMU_ADDRESS_CONTROL_MMU_BYPASS_SHIFT,
enable);
}
int e5010_hw_enable_output_address_error_irq(void __iomem *core_base, u32 enable)
{
return write_reg_field_not_busy(core_base, core_base,
JASPER_INTERRUPT_MASK_OFFSET,
JASPER_INTERRUPT_MASK_CR_OUTPUT_ADDRESS_ERROR_ENABLE_MASK,
JASPER_INTERRUPT_MASK_CR_OUTPUT_ADDRESS_ERROR_ENABLE_SHIFT,
enable);
}
bool e5010_hw_pic_done_irq(void __iomem *core_base)
{
u32 reg;
reg = readl(core_base + JASPER_INTERRUPT_STATUS_OFFSET);
return reg & JASPER_INTERRUPT_STATUS_CR_PICTURE_DONE_IRQ_MASK;
}
bool e5010_hw_output_address_irq(void __iomem *core_base)
{
u32 reg;
reg = readl(core_base + JASPER_INTERRUPT_STATUS_OFFSET);
return reg & JASPER_INTERRUPT_STATUS_CR_OUTPUT_ADDRESS_ERROR_IRQ_MASK;
}
int e5010_hw_enable_picture_done_irq(void __iomem *core_base, u32 enable)
{
return write_reg_field_not_busy(core_base, core_base,
JASPER_INTERRUPT_MASK_OFFSET,
JASPER_INTERRUPT_MASK_CR_PICTURE_DONE_ENABLE_MASK,
JASPER_INTERRUPT_MASK_CR_PICTURE_DONE_ENABLE_SHIFT,
enable);
}
int e5010_hw_enable_auto_clock_gating(void __iomem *core_base, u32 enable)
{
return write_reg_field_not_busy(core_base, core_base,
JASPER_CLK_CONTROL_OFFSET,
JASPER_CLK_CONTROL_CR_JASPER_AUTO_CLKG_ENABLE_MASK,
JASPER_CLK_CONTROL_CR_JASPER_AUTO_CLKG_ENABLE_SHIFT,
enable);
}
int e5010_hw_enable_manual_clock_gating(void __iomem *core_base, u32 enable)
{
return write_reg_field_not_busy(core_base, core_base,
JASPER_CLK_CONTROL_OFFSET,
JASPER_CLK_CONTROL_CR_JASPER_MAN_CLKG_ENABLE_MASK,
JASPER_CLK_CONTROL_CR_JASPER_MAN_CLKG_ENABLE_SHIFT, 0);
}
int e5010_hw_enable_crc_check(void __iomem *core_base, u32 enable)
{
return write_reg_field_not_busy(core_base, core_base,
JASPER_CRC_CTRL_OFFSET,
JASPER_CRC_CTRL_JASPER_CRC_ENABLE_MASK,
JASPER_CRC_CTRL_JASPER_CRC_ENABLE_SHIFT, enable);
}
int e5010_hw_set_input_source_to_memory(void __iomem *core_base, u32 set)
{
return write_reg_field_not_busy(core_base, core_base,
JASPER_INPUT_CTRL0_OFFSET,
JASPER_INPUT_CTRL0_CR_INPUT_SOURCE_MASK,
JASPER_INPUT_CTRL0_CR_INPUT_SOURCE_SHIFT, set);
}
int e5010_hw_set_input_luma_addr(void __iomem *core_base, u32 val)
{
return write_reg_field_not_busy(core_base, core_base,
INPUT_LUMA_BASE_OFFSET,
INPUT_LUMA_BASE_CR_INPUT_LUMA_BASE_MASK, 0, val);
}
int e5010_hw_set_input_chroma_addr(void __iomem *core_base, u32 val)
{
return write_reg_field_not_busy(core_base, core_base,
INPUT_CHROMA_BASE_OFFSET,
INPUT_CHROMA_BASE_CR_INPUT_CHROMA_BASE_MASK, 0, val);
}
int e5010_hw_set_output_base_addr(void __iomem *core_base, u32 val)
{
return write_reg_field_not_busy(core_base, core_base,
JASPER_OUTPUT_BASE_OFFSET,
JASPER_OUTPUT_BASE_CR_OUTPUT_BASE_MASK,
JASPER_OUTPUT_BASE_CR_OUTPUT_BASE_SHIFT, val);
}
int e5010_hw_set_horizontal_size(void __iomem *core_base, u32 val)
{
return write_reg_field_not_busy(core_base, core_base,
JASPER_IMAGE_SIZE_OFFSET,
JASPER_IMAGE_SIZE_CR_IMAGE_HORIZONTAL_SIZE_MASK,
JASPER_IMAGE_SIZE_CR_IMAGE_HORIZONTAL_SIZE_SHIFT,
val);
}
int e5010_hw_set_vertical_size(void __iomem *core_base, u32 val)
{
return write_reg_field_not_busy(core_base, core_base,
JASPER_IMAGE_SIZE_OFFSET,
JASPER_IMAGE_SIZE_CR_IMAGE_VERTICAL_SIZE_MASK,
JASPER_IMAGE_SIZE_CR_IMAGE_VERTICAL_SIZE_SHIFT,
val);
}
int e5010_hw_set_luma_stride(void __iomem *core_base, u32 bytesperline)
{
u32 val = bytesperline / 64;
return write_reg_field_not_busy(core_base, core_base,
JASPER_INPUT_CTRL1_OFFSET,
JASPER_INPUT_CTRL1_CR_INPUT_LUMA_STRIDE_MASK,
JASPER_INPUT_CTRL1_CR_INPUT_LUMA_STRIDE_SHIFT,
val);
}
int e5010_hw_set_chroma_stride(void __iomem *core_base, u32 bytesperline)
{
u32 val = bytesperline / 64;
return write_reg_field_not_busy(core_base, core_base,
JASPER_INPUT_CTRL1_OFFSET,
JASPER_INPUT_CTRL1_CR_INPUT_CHROMA_STRIDE_MASK,
JASPER_INPUT_CTRL1_CR_INPUT_CHROMA_STRIDE_SHIFT,
val);
}
int e5010_hw_set_input_subsampling(void __iomem *core_base, u32 val)
{
return write_reg_field_not_busy(core_base, core_base,
JASPER_INPUT_CTRL0_OFFSET,
JASPER_INPUT_CTRL0_CR_INPUT_SUBSAMPLING_MASK,
JASPER_INPUT_CTRL0_CR_INPUT_SUBSAMPLING_SHIFT,
val);
}
int e5010_hw_set_chroma_order(void __iomem *core_base, u32 val)
{
return write_reg_field_not_busy(core_base, core_base,
JASPER_INPUT_CTRL0_OFFSET,
JASPER_INPUT_CTRL0_CR_INPUT_CHROMA_ORDER_MASK,
JASPER_INPUT_CTRL0_CR_INPUT_CHROMA_ORDER_SHIFT,
val);
}
void e5010_hw_set_output_max_size(void __iomem *core_base, u32 val)
{
write_reg_field(core_base, JASPER_OUTPUT_MAX_SIZE_OFFSET,
JASPER_OUTPUT_MAX_SIZE_CR_OUTPUT_MAX_SIZE_MASK,
JASPER_OUTPUT_MAX_SIZE_CR_OUTPUT_MAX_SIZE_SHIFT,
val);
}
int e5010_hw_set_qpvalue(void __iomem *core_base, u32 offset, u32 val)
{
return write_reg_field_not_busy(core_base, core_base, offset, 0xffffffff, 0, val);
}
void e5010_hw_clear_output_error(void __iomem *core_base, u32 clear)
{
/* Make sure interrupts are clear */
write_reg_field(core_base, JASPER_INTERRUPT_CLEAR_OFFSET,
JASPER_INTERRUPT_CLEAR_CR_OUTPUT_ERROR_CLEAR_MASK,
JASPER_INTERRUPT_CLEAR_CR_OUTPUT_ERROR_CLEAR_SHIFT, clear);
}
void e5010_hw_clear_picture_done(void __iomem *core_base, u32 clear)
{
write_reg_field(core_base,
JASPER_INTERRUPT_CLEAR_OFFSET,
JASPER_INTERRUPT_CLEAR_CR_PICTURE_DONE_CLEAR_MASK,
JASPER_INTERRUPT_CLEAR_CR_PICTURE_DONE_CLEAR_SHIFT, clear);
}
int e5010_hw_get_output_size(void __iomem *core_base)
{
return readl(core_base + JASPER_OUTPUT_SIZE_OFFSET);
}
void e5010_hw_encode_start(void __iomem *core_base, u32 start)
{
write_reg_field(core_base, JASPER_CORE_CTRL_OFFSET,
JASPER_CORE_CTRL_CR_JASPER_ENCODE_START_MASK,
JASPER_CORE_CTRL_CR_JASPER_ENCODE_START_SHIFT, start);
}

View file

@ -0,0 +1,42 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Imagination E5010 JPEG Encoder driver.
*
* Copyright (C) 2023 Texas Instruments Incorporated - https://www.ti.com/
*
* Author: David Huang <d-huang@ti.com>
* Author: Devarsh Thakkar <devarsht@ti.com>
*/
#ifndef _E5010_JPEG_ENC_HW_H
#define _E5010_JPEG_ENC_HW_H
#include "e5010-core-regs.h"
#include "e5010-mmu-regs.h"
int e5010_hw_enable_output_address_error_irq(void __iomem *core_offset, u32 enable);
int e5010_hw_enable_picture_done_irq(void __iomem *core_offset, u32 enable);
int e5010_hw_enable_auto_clock_gating(void __iomem *core_offset, u32 enable);
int e5010_hw_enable_manual_clock_gating(void __iomem *core_offset, u32 enable);
int e5010_hw_enable_crc_check(void __iomem *core_offset, u32 enable);
int e5010_hw_set_input_source_to_memory(void __iomem *core_offset, u32 set);
int e5010_hw_set_input_luma_addr(void __iomem *core_offset, u32 val);
int e5010_hw_set_input_chroma_addr(void __iomem *core_offset, u32 val);
int e5010_hw_set_output_base_addr(void __iomem *core_offset, u32 val);
int e5010_hw_get_output_size(void __iomem *core_offset);
int e5010_hw_set_horizontal_size(void __iomem *core_offset, u32 val);
int e5010_hw_set_vertical_size(void __iomem *core_offset, u32 val);
int e5010_hw_set_luma_stride(void __iomem *core_offset, u32 bytesperline);
int e5010_hw_set_chroma_stride(void __iomem *core_offset, u32 bytesperline);
int e5010_hw_set_input_subsampling(void __iomem *core_offset, u32 val);
int e5010_hw_set_chroma_order(void __iomem *core_offset, u32 val);
int e5010_hw_set_qpvalue(void __iomem *core_offset, u32 offset, u32 value);
void e5010_reset(struct device *dev, void __iomem *core_offset, void __iomem *mmu_offset);
void e5010_hw_set_output_max_size(void __iomem *core_offset, u32 val);
void e5010_hw_clear_picture_done(void __iomem *core_offset, u32 clear);
void e5010_hw_encode_start(void __iomem *core_offset, u32 start);
void e5010_hw_clear_output_error(void __iomem *core_offset, u32 clear);
void e5010_hw_bypass_mmu(void __iomem *mmu_base, u32 enable);
bool e5010_hw_pic_done_irq(void __iomem *core_base);
bool e5010_hw_output_address_irq(void __iomem *core_base);
#endif

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,168 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Imagination E5010 JPEG Encoder driver.
*
* Copyright (C) 2023 Texas Instruments Incorporated - https://www.ti.com/
*
* Author: David Huang <d-huang@ti.com>
* Author: Devarsh Thakkar <devarsht@ti.com>
*/
#include <media/v4l2-ctrls.h>
#include <media/v4l2-device.h>
#include <media/v4l2-fh.h>
#ifndef _E5010_JPEG_ENC_H
#define _E5010_JPEG_ENC_H
#define MAX_PLANES 2
#define HEADER_SIZE 0x025D
#define MIN_DIMENSION 64
#define MAX_DIMENSION 8192
#define DEFAULT_WIDTH 640
#define DEFAULT_HEIGHT 480
#define E5010_MODULE_NAME "e5010"
#define JPEG_MAX_BYTES_PER_PIXEL 2
/* JPEG marker definitions */
#define START_OF_IMAGE 0xFFD8
#define SOF_BASELINE_DCT 0xFFC0
#define END_OF_IMAGE 0xFFD9
#define START_OF_SCAN 0xFFDA
/* Definitions for the huffman table specification in the Marker segment */
#define DHT_MARKER 0xFFC4
#define LH_DC 0x001F
#define LH_AC 0x00B5
/* Definitions for the quantization table specification in the Marker segment */
#define DQT_MARKER 0xFFDB
#define ACMAX 0x03FF
#define DCMAX 0x07FF
/* Length and precision of the quantization table parameters */
#define LQPQ 0x00430
#define QMAX 255
/* Misc JPEG header definitions */
#define UC_NUM_COMP 3
#define PRECISION 8
#define HORZ_SAMPLING_FACTOR (2 << 4)
#define VERT_SAMPLING_FACTOR_422 1
#define VERT_SAMPLING_FACTOR_420 2
#define COMPONENTS_IN_SCAN 3
#define PELS_IN_BLOCK 64
/* Used for Qp table generation */
#define LUMINOSITY 10
#define CONTRAST 1
#define INCREASE 2
#define QP_TABLE_SIZE (8 * 8)
#define QP_TABLE_FIELD_OFFSET 0x04
/*
* vb2 queue structure
* contains queue data information
*
* @fmt: format info
* @width: frame width
* @height: frame height
* @bytesperline: bytes per line in memory
* @size_image: image size in memory
*/
struct e5010_q_data {
struct e5010_fmt *fmt;
u32 width;
u32 height;
u32 width_adjusted;
u32 height_adjusted;
u32 sizeimage[MAX_PLANES];
u32 bytesperline[MAX_PLANES];
u32 sequence;
struct v4l2_rect crop;
bool crop_set;
};
/*
* Driver device structure
* Holds all memory handles and global parameters
* Shared by all instances
*/
struct e5010_dev {
struct device *dev;
struct v4l2_device v4l2_dev;
struct v4l2_m2m_dev *m2m_dev;
struct video_device *vdev;
void __iomem *core_base;
void __iomem *mmu_base;
struct clk *clk;
struct e5010_context *last_context_run;
/* Protect access to device data */
struct mutex mutex;
/* Protect access to hardware*/
spinlock_t hw_lock;
};
/*
* Driver context structure
* One of these exists for every m2m context
* Holds context specific data
*/
struct e5010_context {
struct v4l2_fh fh;
struct e5010_dev *e5010;
struct e5010_q_data out_queue;
struct e5010_q_data cap_queue;
int quality;
bool update_qp;
struct v4l2_ctrl_handler ctrl_handler;
u8 luma_qp[QP_TABLE_SIZE];
u8 chroma_qp[QP_TABLE_SIZE];
};
/*
* Buffer structure
* Contains info for all buffers
*/
struct e5010_buffer {
struct v4l2_m2m_buffer buffer;
};
enum {
CHROMA_ORDER_CB_CR = 0, //UV ordering
CHROMA_ORDER_CR_CB = 1, //VU ordering
};
enum {
SUBSAMPLING_420 = 1,
SUBSAMPLING_422 = 2,
};
/*
* e5010 format structure
* contains format information
*/
struct e5010_fmt {
u32 fourcc;
unsigned int num_planes;
unsigned int type;
u32 subsampling;
u32 chroma_order;
const struct v4l2_frmsize_stepwise frmsize;
};
/*
* struct e5010_ctrl - contains info for each supported v4l2 control
*/
struct e5010_ctrl {
unsigned int cid;
enum v4l2_ctrl_type type;
unsigned char name[32];
int minimum;
int maximum;
int step;
int default_value;
unsigned char compound;
};
#endif

View file

@ -0,0 +1,311 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Imagination E5010 JPEG Encoder driver.
*
* Copyright (C) 2023 Texas Instruments Incorporated - https://www.ti.com/
*
* Author: David Huang <d-huang@ti.com>
* Author: Devarsh Thakkar <devarsht@ti.com>
*/
#ifndef _E5010_MMU_REGS_H
#define _E5010_MMU_REGS_H
#define MMU_MMU_DIR_BASE_ADDR_OFFSET (0x0020)
#define MMU_MMU_DIR_BASE_ADDR_STRIDE (4)
#define MMU_MMU_DIR_BASE_ADDR_NO_ENTRIES (4)
#define MMU_MMU_DIR_BASE_ADDR_MMU_DIR_BASE_ADDR_MASK (0xFFFFFFFF)
#define MMU_MMU_DIR_BASE_ADDR_MMU_DIR_BASE_ADDR_SHIFT (0)
#define MMU_MMU_TILE_CFG_OFFSET (0x0040)
#define MMU_MMU_TILE_CFG_STRIDE (4)
#define MMU_MMU_TILE_CFG_NO_ENTRIES (4)
#define MMU_MMU_TILE_CFG_TILE_128INTERLEAVE_MASK (0x00000010)
#define MMU_MMU_TILE_CFG_TILE_128INTERLEAVE_SHIFT (4)
#define MMU_MMU_TILE_CFG_TILE_ENABLE_MASK (0x00000008)
#define MMU_MMU_TILE_CFG_TILE_ENABLE_SHIFT (3)
#define MMU_MMU_TILE_CFG_TILE_STRIDE_MASK (0x00000007)
#define MMU_MMU_TILE_CFG_TILE_STRIDE_SHIFT (0)
#define MMU_MMU_TILE_MIN_ADDR_OFFSET (0x0050)
#define MMU_MMU_TILE_MIN_ADDR_STRIDE (4)
#define MMU_MMU_TILE_MIN_ADDR_NO_ENTRIES (4)
#define MMU_MMU_TILE_MIN_ADDR_TILE_MIN_ADDR_MASK (0xFFFFFFFF)
#define MMU_MMU_TILE_MIN_ADDR_TILE_MIN_ADDR_SHIFT (0)
#define MMU_MMU_TILE_MAX_ADDR_OFFSET (0x0060)
#define MMU_MMU_TILE_MAX_ADDR_STRIDE (4)
#define MMU_MMU_TILE_MAX_ADDR_NO_ENTRIES (4)
#define MMU_MMU_TILE_MAX_ADDR_TILE_MAX_ADDR_MASK (0xFFFFFFFF)
#define MMU_MMU_TILE_MAX_ADDR_TILE_MAX_ADDR_SHIFT (0)
#define MMU_MMU_CONTROL0_OFFSET (0x0000)
#define MMU_MMU_CONTROL0_MMU_TILING_SCHEME_MASK (0x00000001)
#define MMU_MMU_CONTROL0_MMU_TILING_SCHEME_SHIFT (0)
#define MMU_MMU_CONTROL0_MMU_CACHE_POLICY_MASK (0x00000100)
#define MMU_MMU_CONTROL0_MMU_CACHE_POLICY_SHIFT (8)
#define MMU_MMU_CONTROL0_FORCE_CACHE_POLICY_BYPASS_MASK (0x00000200)
#define MMU_MMU_CONTROL0_FORCE_CACHE_POLICY_BYPASS_SHIFT (9)
#define MMU_MMU_CONTROL0_STALL_ON_PROTOCOL_FAULT_MASK (0x00001000)
#define MMU_MMU_CONTROL0_STALL_ON_PROTOCOL_FAULT_SHIFT (12)
#define MMU_MMU_CONTROL1_OFFSET (0x0008)
#define MMU_MMU_CONTROL1_MMU_FLUSH_MASK (0x00000008)
#define MMU_MMU_CONTROL1_MMU_FLUSH_SHIFT (3)
#define MMU_MMU_CONTROL1_MMU_FLUSH_NO_REPS (4)
#define MMU_MMU_CONTROL1_MMU_FLUSH_SIZE (1)
#define MMU_MMU_CONTROL1_MMU_INVALDC_MASK (0x00000800)
#define MMU_MMU_CONTROL1_MMU_INVALDC_SHIFT (11)
#define MMU_MMU_CONTROL1_MMU_INVALDC_NO_REPS (4)
#define MMU_MMU_CONTROL1_MMU_INVALDC_SIZE (1)
#define MMU_MMU_CONTROL1_MMU_FAULT_CLEAR_MASK (0x00010000)
#define MMU_MMU_CONTROL1_MMU_FAULT_CLEAR_SHIFT (16)
#define MMU_MMU_CONTROL1_PROTOCOL_FAULT_CLEAR_MASK (0x00100000)
#define MMU_MMU_CONTROL1_PROTOCOL_FAULT_CLEAR_SHIFT (20)
#define MMU_MMU_CONTROL1_MMU_PAUSE_SET_MASK (0x01000000)
#define MMU_MMU_CONTROL1_MMU_PAUSE_SET_SHIFT (24)
#define MMU_MMU_CONTROL1_MMU_PAUSE_CLEAR_MASK (0x02000000)
#define MMU_MMU_CONTROL1_MMU_PAUSE_CLEAR_SHIFT (25)
#define MMU_MMU_CONTROL1_MMU_SOFT_RESET_MASK (0x10000000)
#define MMU_MMU_CONTROL1_MMU_SOFT_RESET_SHIFT (28)
#define MMU_MMU_BANK_INDEX_OFFSET (0x0010)
#define MMU_MMU_BANK_INDEX_MMU_BANK_INDEX_MASK (0xC0000000)
#define MMU_MMU_BANK_INDEX_MMU_BANK_INDEX_SHIFT (30)
#define MMU_MMU_BANK_INDEX_MMU_BANK_INDEX_NO_REPS (16)
#define MMU_MMU_BANK_INDEX_MMU_BANK_INDEX_SIZE (2)
#define MMU_REQUEST_PRIORITY_ENABLE_OFFSET (0x0018)
#define MMU_REQUEST_PRIORITY_ENABLE_CMD_PRIORITY_ENABLE_MASK (0x00008000)
#define MMU_REQUEST_PRIORITY_ENABLE_CMD_PRIORITY_ENABLE_SHIFT (15)
#define MMU_REQUEST_PRIORITY_ENABLE_CMD_PRIORITY_ENABLE_NO_REPS (16)
#define MMU_REQUEST_PRIORITY_ENABLE_CMD_PRIORITY_ENABLE_SIZE (1)
#define MMU_REQUEST_PRIORITY_ENABLE_CMD_MMU_PRIORITY_ENABLE_MASK (0x00010000)
#define MMU_REQUEST_PRIORITY_ENABLE_CMD_MMU_PRIORITY_ENABLE_SHIFT (16)
#define MMU_REQUEST_LIMITED_THROUGHPUT_OFFSET (0x001C)
#define MMU_REQUEST_LIMITED_THROUGHPUT_LIMITED_WORDS_MASK (0x000003FF)
#define MMU_REQUEST_LIMITED_THROUGHPUT_LIMITED_WORDS_SHIFT (0)
#define MMU_REQUEST_LIMITED_THROUGHPUT_REQUEST_GAP_MASK (0x0FFF0000)
#define MMU_REQUEST_LIMITED_THROUGHPUT_REQUEST_GAP_SHIFT (16)
#define MMU_MMU_ADDRESS_CONTROL_OFFSET (0x0070)
#define MMU_MMU_ADDRESS_CONTROL_TRUSTED (IMG_TRUE)
#define MMU_MMU_ADDRESS_CONTROL_MMU_BYPASS_MASK (0x00000001)
#define MMU_MMU_ADDRESS_CONTROL_MMU_BYPASS_SHIFT (0)
#define MMU_MMU_ADDRESS_CONTROL_MMU_ENABLE_EXT_ADDRESSING_MASK (0x00000010)
#define MMU_MMU_ADDRESS_CONTROL_MMU_ENABLE_EXT_ADDRESSING_SHIFT (4)
#define MMU_MMU_ADDRESS_CONTROL_UPPER_ADDRESS_FIXED_MASK (0x00FF0000)
#define MMU_MMU_ADDRESS_CONTROL_UPPER_ADDRESS_FIXED_SHIFT (16)
#define MMU_MMU_CONFIG0_OFFSET (0x0080)
#define MMU_MMU_CONFIG0_NUM_REQUESTORS_MASK (0x0000000F)
#define MMU_MMU_CONFIG0_NUM_REQUESTORS_SHIFT (0)
#define MMU_MMU_CONFIG0_EXTENDED_ADDR_RANGE_MASK (0x000000F0)
#define MMU_MMU_CONFIG0_EXTENDED_ADDR_RANGE_SHIFT (4)
#define MMU_MMU_CONFIG0_GROUP_OVERRIDE_SIZE_MASK (0x00000700)
#define MMU_MMU_CONFIG0_GROUP_OVERRIDE_SIZE_SHIFT (8)
#define MMU_MMU_CONFIG0_ADDR_COHERENCY_SUPPORTED_MASK (0x00001000)
#define MMU_MMU_CONFIG0_ADDR_COHERENCY_SUPPORTED_SHIFT (12)
#define MMU_MMU_CONFIG0_MMU_SUPPORTED_MASK (0x00002000)
#define MMU_MMU_CONFIG0_MMU_SUPPORTED_SHIFT (13)
#define MMU_MMU_CONFIG0_TILE_ADDR_GRANULARITY_MASK (0x001F0000)
#define MMU_MMU_CONFIG0_TILE_ADDR_GRANULARITY_SHIFT (16)
#define MMU_MMU_CONFIG0_NO_READ_REORDER_MASK (0x00200000)
#define MMU_MMU_CONFIG0_NO_READ_REORDER_SHIFT (21)
#define MMU_MMU_CONFIG0_TAGS_SUPPORTED_MASK (0xFFC00000)
#define MMU_MMU_CONFIG0_TAGS_SUPPORTED_SHIFT (22)
#define MMU_MMU_CONFIG1_OFFSET (0x0084)
#define MMU_MMU_CONFIG1_PAGE_SIZE_MASK (0x0000000F)
#define MMU_MMU_CONFIG1_PAGE_SIZE_SHIFT (0)
#define MMU_MMU_CONFIG1_PAGE_CACHE_ENTRIES_MASK (0x0000FF00)
#define MMU_MMU_CONFIG1_PAGE_CACHE_ENTRIES_SHIFT (8)
#define MMU_MMU_CONFIG1_DIR_CACHE_ENTRIES_MASK (0x001F0000)
#define MMU_MMU_CONFIG1_DIR_CACHE_ENTRIES_SHIFT (16)
#define MMU_MMU_CONFIG1_BANDWIDTH_COUNT_SUPPORTED_MASK (0x01000000)
#define MMU_MMU_CONFIG1_BANDWIDTH_COUNT_SUPPORTED_SHIFT (24)
#define MMU_MMU_CONFIG1_STALL_COUNT_SUPPORTED_MASK (0x02000000)
#define MMU_MMU_CONFIG1_STALL_COUNT_SUPPORTED_SHIFT (25)
#define MMU_MMU_CONFIG1_LATENCY_COUNT_SUPPORTED_MASK (0x04000000)
#define MMU_MMU_CONFIG1_LATENCY_COUNT_SUPPORTED_SHIFT (26)
#define MMU_MMU_STATUS0_OFFSET (0x0088)
#define MMU_MMU_STATUS0_MMU_PF_N_RW_MASK (0x00000001)
#define MMU_MMU_STATUS0_MMU_PF_N_RW_SHIFT (0)
#define MMU_MMU_STATUS0_MMU_FAULT_ADDR_MASK (0xFFFFF000)
#define MMU_MMU_STATUS0_MMU_FAULT_ADDR_SHIFT (12)
#define MMU_MMU_STATUS1_OFFSET (0x008C)
#define MMU_MMU_STATUS1_MMU_FAULT_REQ_STAT_MASK (0x0000FFFF)
#define MMU_MMU_STATUS1_MMU_FAULT_REQ_STAT_SHIFT (0)
#define MMU_MMU_STATUS1_MMU_FAULT_REQ_ID_MASK (0x000F0000)
#define MMU_MMU_STATUS1_MMU_FAULT_REQ_ID_SHIFT (16)
#define MMU_MMU_STATUS1_MMU_FAULT_INDEX_MASK (0x03000000)
#define MMU_MMU_STATUS1_MMU_FAULT_INDEX_SHIFT (24)
#define MMU_MMU_STATUS1_MMU_FAULT_RNW_MASK (0x10000000)
#define MMU_MMU_STATUS1_MMU_FAULT_RNW_SHIFT (28)
#define MMU_MMU_MEM_REQ_OFFSET (0x0090)
#define MMU_MMU_MEM_REQ_TAG_OUTSTANDING_MASK (0x000003FF)
#define MMU_MMU_MEM_REQ_TAG_OUTSTANDING_SHIFT (0)
#define MMU_MMU_MEM_REQ_EXT_WRRESP_FAULT_MASK (0x00001000)
#define MMU_MMU_MEM_REQ_EXT_WRRESP_FAULT_SHIFT (12)
#define MMU_MMU_MEM_REQ_EXT_RDRESP_FAULT_MASK (0x00002000)
#define MMU_MMU_MEM_REQ_EXT_RDRESP_FAULT_SHIFT (13)
#define MMU_MMU_MEM_REQ_EXT_READ_BURST_FAULT_MASK (0x00004000)
#define MMU_MMU_MEM_REQ_EXT_READ_BURST_FAULT_SHIFT (14)
#define MMU_MMU_MEM_REQ_INT_PROTOCOL_FAULT_MASK (0x80000000)
#define MMU_MMU_MEM_REQ_INT_PROTOCOL_FAULT_SHIFT (31)
#define MMU_MMU_MEM_REQ_INT_PROTOCOL_FAULT_NO_REPS (16)
#define MMU_MMU_MEM_REQ_INT_PROTOCOL_FAULT_SIZE (1)
#define MMU_MMU_FAULT_SELECT_OFFSET (0x00A0)
#define MMU_MMU_FAULT_SELECT_MMU_FAULT_SELECT_MASK (0x0000000F)
#define MMU_MMU_FAULT_SELECT_MMU_FAULT_SELECT_SHIFT (0)
#define MMU_PROTOCOL_FAULT_OFFSET (0x00A8)
#define MMU_PROTOCOL_FAULT_FAULT_PAGE_BREAK_MASK (0x00000001)
#define MMU_PROTOCOL_FAULT_FAULT_PAGE_BREAK_SHIFT (0)
#define MMU_PROTOCOL_FAULT_FAULT_WRITE_MASK (0x00000010)
#define MMU_PROTOCOL_FAULT_FAULT_WRITE_SHIFT (4)
#define MMU_PROTOCOL_FAULT_FAULT_READ_MASK (0x00000020)
#define MMU_PROTOCOL_FAULT_FAULT_READ_SHIFT (5)
#define MMU_TOTAL_READ_REQ_OFFSET (0x0100)
#define MMU_TOTAL_READ_REQ_TOTAL_READ_REQ_MASK (0xFFFFFFFF)
#define MMU_TOTAL_READ_REQ_TOTAL_READ_REQ_SHIFT (0)
#define MMU_TOTAL_WRITE_REQ_OFFSET (0x0104)
#define MMU_TOTAL_WRITE_REQ_TOTAL_WRITE_REQ_MASK (0xFFFFFFFF)
#define MMU_TOTAL_WRITE_REQ_TOTAL_WRITE_REQ_SHIFT (0)
#define MMU_READS_LESS_64_REQ_OFFSET (0x0108)
#define MMU_READS_LESS_64_REQ_READS_LESS_64_REQ_MASK (0xFFFFFFFF)
#define MMU_READS_LESS_64_REQ_READS_LESS_64_REQ_SHIFT (0)
#define MMU_WRITES_LESS_64_REQ_OFFSET (0x010C)
#define MMU_WRITES_LESS_64_REQ_WRITES_LESS_64_REQ_MASK (0xFFFFFFFF)
#define MMU_WRITES_LESS_64_REQ_WRITES_LESS_64_REQ_SHIFT (0)
#define MMU_EXT_CMD_STALL_OFFSET (0x0120)
#define MMU_EXT_CMD_STALL_EXT_CMD_STALL_MASK (0xFFFFFFFF)
#define MMU_EXT_CMD_STALL_EXT_CMD_STALL_SHIFT (0)
#define MMU_WRITE_REQ_STALL_OFFSET (0x0124)
#define MMU_WRITE_REQ_STALL_WRITE_REQ_STALL_MASK (0xFFFFFFFF)
#define MMU_WRITE_REQ_STALL_WRITE_REQ_STALL_SHIFT (0)
#define MMU_MMU_MISS_STALL_OFFSET (0x0128)
#define MMU_MMU_MISS_STALL_MMU_MISS_STALL_MASK (0xFFFFFFFF)
#define MMU_MMU_MISS_STALL_MMU_MISS_STALL_SHIFT (0)
#define MMU_ADDRESS_STALL_OFFSET (0x012C)
#define MMU_ADDRESS_STALL_ADDRESS_STALL_MASK (0xFFFFFFFF)
#define MMU_ADDRESS_STALL_ADDRESS_STALL_SHIFT (0)
#define MMU_TAG_STALL_OFFSET (0x0130)
#define MMU_TAG_STALL_TAG_STALL_MASK (0xFFFFFFFF)
#define MMU_TAG_STALL_TAG_STALL_SHIFT (0)
#define MMU_PEAK_READ_OUTSTANDING_OFFSET (0x0140)
#define MMU_PEAK_READ_OUTSTANDING_PEAK_TAG_OUTSTANDING_MASK (0x000003FF)
#define MMU_PEAK_READ_OUTSTANDING_PEAK_TAG_OUTSTANDING_SHIFT (0)
#define MMU_PEAK_READ_OUTSTANDING_PEAK_READ_LATENCY_MASK (0xFFFF0000)
#define MMU_PEAK_READ_OUTSTANDING_PEAK_READ_LATENCY_SHIFT (16)
#define MMU_AVERAGE_READ_LATENCY_OFFSET (0x0144)
#define MMU_AVERAGE_READ_LATENCY_AVERAGE_READ_LATENCY_MASK (0xFFFFFFFF)
#define MMU_AVERAGE_READ_LATENCY_AVERAGE_READ_LATENCY_SHIFT (0)
#define MMU_STATISTICS_CONTROL_OFFSET (0x0160)
#define MMU_STATISTICS_CONTROL_BANDWIDTH_STATS_INIT_MASK (0x00000001)
#define MMU_STATISTICS_CONTROL_BANDWIDTH_STATS_INIT_SHIFT (0)
#define MMU_STATISTICS_CONTROL_STALL_STATS_INIT_MASK (0x00000002)
#define MMU_STATISTICS_CONTROL_STALL_STATS_INIT_SHIFT (1)
#define MMU_STATISTICS_CONTROL_LATENCY_STATS_INIT_MASK (0x00000004)
#define MMU_STATISTICS_CONTROL_LATENCY_STATS_INIT_SHIFT (2)
#define MMU_MMU_VERSION_OFFSET (0x01D0)
#define MMU_MMU_VERSION_MMU_MAJOR_REV_MASK (0x00FF0000)
#define MMU_MMU_VERSION_MMU_MAJOR_REV_SHIFT (16)
#define MMU_MMU_VERSION_MMU_MINOR_REV_MASK (0x0000FF00)
#define MMU_MMU_VERSION_MMU_MINOR_REV_SHIFT (8)
#define MMU_MMU_VERSION_MMU_MAINT_REV_MASK (0x000000FF)
#define MMU_MMU_VERSION_MMU_MAINT_REV_SHIFT (0)
#define MMU_BYTE_SIZE (0x01D4)
#endif