blob: 26cc129746a16291a973b1c744aea5b21802f700 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_MEDIA_DRIVERS_AMLOGIC_ENCODER_REGISTERS_H_
#define SRC_MEDIA_DRIVERS_AMLOGIC_ENCODER_REGISTERS_H_
#include <lib/mmio/mmio.h>
#include <cstdint>
#include <ddk/mmio-buffer.h>
#include <hwreg/bitfields.h>
template <class RegType>
class TypedRegisterAddr;
// Typed registers can be used only with a specific type of RegisterIo.
template <class MmioType, class DerivedType, class IntType, class PrinterState = void>
class TypedRegisterBase : public hwreg::RegisterBase<DerivedType, IntType, PrinterState> {
public:
using SelfType = DerivedType;
using ValueType = IntType;
using Mmio = MmioType;
using AddrType = TypedRegisterAddr<SelfType>;
SelfType& ReadFrom(MmioType* reg_io) {
return hwreg::RegisterBase<DerivedType, IntType, PrinterState>::ReadFrom(
static_cast<ddk::MmioBuffer*>(reg_io));
}
SelfType& WriteTo(MmioType* reg_io) {
return hwreg::RegisterBase<DerivedType, IntType, PrinterState>::WriteTo(
static_cast<ddk::MmioBuffer*>(reg_io));
}
};
template <class RegType>
class TypedRegisterAddr : public hwreg::RegisterAddr<RegType> {
public:
TypedRegisterAddr(uint32_t reg_addr) : hwreg::RegisterAddr<RegType>(reg_addr) {}
RegType ReadFrom(typename RegType::Mmio* reg_io) {
RegType reg;
reg.set_reg_addr(hwreg::RegisterAddr<RegType>::addr());
reg.ReadFrom(reg_io);
return reg;
}
};
// Cbus does a lot of things, but mainly seems to handle audio and video
// processing.
class CbusRegisterIo : public ddk::MmioBuffer {
public:
CbusRegisterIo(MmioBuffer&& other) : ddk::MmioBuffer(std::move(other)) {}
};
// The DOS bus mainly seems to handle video decoding/encoding.
class DosRegisterIo : public ddk::MmioBuffer {
public:
DosRegisterIo(MmioBuffer&& other) : ddk::MmioBuffer(std::move(other)) {}
};
// Aobus communicates with the always-on power management processor.
class AoRegisterIo : public ddk::MmioBuffer {
public:
AoRegisterIo(MmioBuffer&& other) : ddk::MmioBuffer(std::move(other)) {}
};
// Hiubus mainly seems to handle clock control and gating.
class HiuRegisterIo : public ddk::MmioBuffer {
public:
HiuRegisterIo(MmioBuffer&& other) : ddk::MmioBuffer(std::move(other)) {}
};
#define DEFINE_REGISTER(name, type, address) \
class name : public TypedRegisterBase<type, name, uint32_t> { \
public: \
static auto Get() { return TypedRegisterAddr<name>((address)*4); } \
};
#define REGISTER_BEGIN(name, type, address) \
class name : public TypedRegisterBase<type, name, uint32_t> { \
public: \
static auto Get() { return AddrType((address)*4); }
#define REGISTER_END \
} \
;
REGISTER_BEGIN(AoRtiGenPwrSleep0, AoRegisterIo, 0x3a)
DEF_BIT(1, dos_hcodec_d1_pwr_off);
DEF_BIT(0, dos_hcodec_pwr_off);
REGISTER_END
REGISTER_BEGIN(AoRtiGenPwrIso0, AoRegisterIo, 0x3b)
DEF_BIT(5, dos_hcodec_iso_out_en);
DEF_BIT(4, dos_hcodec_iso_in_en);
REGISTER_END
REGISTER_BEGIN(DosSwReset1, DosRegisterIo, 0x3f07)
enum { kAll = 0xffffffff, kNone = 0 };
DEF_BIT(17, hcodec_qdct);
DEF_BIT(16, hcodec_vlc);
DEF_BIT(14, hcodec_afifo);
DEF_BIT(13, hcodec_ddr);
DEF_BIT(12, hcodec_ccpu);
DEF_BIT(11, hcodec_mcpu);
DEF_BIT(10, hcodec_psc);
DEF_BIT(9, hcodec_pic_dc);
DEF_BIT(8, hcodec_dblk);
DEF_BIT(7, hcodec_mc);
DEF_BIT(6, hcodec_iqidct);
DEF_BIT(5, hcodec_vififo);
DEF_BIT(4, hcodec_vld_part);
DEF_BIT(3, hcodec_vld);
DEF_BIT(2, hcodec_assist);
REGISTER_END
REGISTER_BEGIN(DosGclkEn0, DosRegisterIo, 0x3f01)
DEF_FIELD(27, 12, hcodec_en);
REGISTER_END
REGISTER_BEGIN(DosGenCtrl0, DosRegisterIo, 0x3f02)
DEF_BIT(0, hcodec_auto_clock_gate);
REGISTER_END
REGISTER_BEGIN(DosMemPdHcodec, DosRegisterIo, 0x3f32)
REGISTER_END
REGISTER_BEGIN(HcodecAssistMmcCtrl1, DosRegisterIo, 0x1002)
enum { kCtrl = 0x32 };
REGISTER_END
REGISTER_BEGIN(HcodecMfdInReg1Ctrl, DosRegisterIo, 0x1009)
DEF_BIT(19, nr_enable);
DEF_FIELD(18, 16, ifmt_extra);
DEF_FIELD(15, 13, r2y_mode);
DEF_BIT(12, r2y_en);
DEF_BIT(9, interp_en);
DEF_BIT(8, y_size);
DEF_BIT(6, dsample_en);
DEF_FIELD(5, 4, oformat);
DEF_FIELD(3, 0, iformat);
REGISTER_END
REGISTER_BEGIN(HcodecMfdInReg3Canv, DosRegisterIo, 0x100b)
DEF_FIELD(31, 30, canv_idx1_bppy);
DEF_FIELD(29, 28, canv_idx0_bppy);
DEF_FIELD(27, 26, canv_idx1_bppx);
DEF_FIELD(25, 24, canv_idx0_bppx);
DEF_FIELD(23, 0, input);
REGISTER_END
REGISTER_BEGIN(HcodecMfdInReg4Lnr0, DosRegisterIo, 0x100c)
DEF_FIELD(31, 16, linear_bytes4p);
DEF_FIELD(15, 0, linear_bytesperline);
REGISTER_END
DEFINE_REGISTER(HcodecMfdInReg5Lnr1, DosRegisterIo, 0x100d)
REGISTER_BEGIN(HcodecMfdInReg8Dmbl, DosRegisterIo, 0x1010)
DEF_FIELD(31, 14, picsize_x);
DEF_FIELD(13, 0, picsize_y);
REGISTER_END
REGISTER_BEGIN(HcodecMfdInReg9Endn, DosRegisterIo, 0x1011)
DEF_FIELD(23, 21, field21);
DEF_FIELD(20, 18, field18);
DEF_FIELD(17, 15, field15);
DEF_FIELD(14, 12, field12);
DEF_FIELD(11, 9, field9);
DEF_FIELD(8, 6, field6);
DEF_FIELD(5, 3, field3);
DEF_FIELD(2, 0, field0);
REGISTER_END
REGISTER_BEGIN(HcodecMfdInReg0D, DosRegisterIo, 0x1015)
DEF_FIELD(31, 26, y_snr_gau_alp0_max);
DEF_FIELD(25, 20, y_snr_gau_alp0_min);
DEF_FIELD(19, 14, y_snr_gau_bld_rate);
DEF_FIELD(13, 6, y_snr_gau_bld_ofst);
DEF_FIELD(5, 2, y_snr_gau_bld_core);
DEF_BIT(1, y_snr_err_norm);
DEF_BIT(0, cfg_y_snr_en);
REGISTER_END
REGISTER_BEGIN(HcodecMfdInReg0E, DosRegisterIo, 0x1016)
DEF_FIELD(31, 19, y_tnr_deghost_os);
DEF_FIELD(18, 13, y_tnr_alpha_max);
DEF_FIELD(12, 7, y_tnr_alpha_min);
DEF_FIELD(6, 3, y_tnr_mot_sad_margin);
DEF_BIT(2, y_tnr_txt_mode);
DEF_BIT(1, y_tnr_mc_en);
DEF_BIT(0, cfg_y_tnr_en);
REGISTER_END
REGISTER_BEGIN(HcodecMfdInReg0F, DosRegisterIo, 0x1017)
DEF_FIELD(31, 24, y_tnr_mot_frcsad_lock);
DEF_FIELD(23, 16, y_tnr_mot_dismot_ofst);
DEF_FIELD(15, 8, y_tnr_mot_distxt_ofst);
DEF_FIELD(7, 4, y_tnr_mot_distxt_rate);
DEF_FIELD(3, 0, y_tnr_mot_cortxt_rate);
REGISTER_END
REGISTER_BEGIN(HcodecMfdInReg10, DosRegisterIo, 0x1018)
DEF_FIELD(31, 24, y_tnr_mot2alp_dis_ofst);
DEF_FIELD(23, 16, y_tnr_mot2alp_dis_gain);
DEF_FIELD(15, 8, y_tnr_mot2alp_nrm_gain);
DEF_FIELD(7, 0, y_tnr_mot2alp_frc_gain);
REGISTER_END
REGISTER_BEGIN(HcodecMfdInReg11, DosRegisterIo, 0x1019)
DEF_FIELD(31, 14, y_bld_beta_max);
DEF_FIELD(13, 8, y_bld_beta_min);
DEF_FIELD(7, 0, y_bld_beta2alp_rate);
REGISTER_END
REGISTER_BEGIN(HcodecMfdInReg12, DosRegisterIo, 0x101a)
DEF_FIELD(31, 26, c_snr_gau_alp0_max);
DEF_FIELD(25, 20, c_snr_gau_alp0_min);
DEF_FIELD(19, 14, c_snr_gau_bld_rate);
DEF_FIELD(13, 6, c_snr_gau_bld_ofst);
DEF_FIELD(5, 2, c_snr_gau_bld_core);
DEF_BIT(1, c_snr_err_norm);
DEF_BIT(0, cfg_c_snr_en);
REGISTER_END
REGISTER_BEGIN(HcodecMfdInReg13, DosRegisterIo, 0x101b)
DEF_FIELD(31, 19, c_tnr_deghost_os);
DEF_FIELD(18, 13, c_tnr_alpha_max);
DEF_FIELD(12, 7, c_tnr_alpha_min);
DEF_FIELD(6, 3, c_tnr_mot_sad_margin);
DEF_BIT(2, c_tnr_txt_mode);
DEF_BIT(1, c_tnr_mc_en);
DEF_BIT(0, cfg_c_tnr_en);
REGISTER_END
REGISTER_BEGIN(HcodecMfdInReg14, DosRegisterIo, 0x101c)
DEF_FIELD(31, 24, c_tnr_mot_frcsad_lock);
DEF_FIELD(23, 16, c_tnr_mot_dismot_ofst);
DEF_FIELD(15, 8, c_tnr_mot_distxt_ofst);
DEF_FIELD(7, 4, c_tnr_mot_distxt_rate);
DEF_FIELD(3, 0, c_tnr_mot_cortxt_rate);
REGISTER_END
REGISTER_BEGIN(HcodecMfdInReg15, DosRegisterIo, 0x101d)
DEF_FIELD(31, 24, c_tnr_mot2alp_dis_ofst);
DEF_FIELD(23, 16, c_tnr_mot2alp_dis_gain);
DEF_FIELD(15, 8, c_tnr_mot2alp_nrm_gain);
DEF_FIELD(7, 0, c_tnr_mot2alp_frc_gain);
REGISTER_END
REGISTER_BEGIN(HcodecMfdInReg16, DosRegisterIo, 0x101e)
DEF_FIELD(31, 14, c_bld_beta_max);
DEF_FIELD(13, 8, c_bld_beta_min);
DEF_FIELD(7, 0, c_bld_beta2alp_rate);
REGISTER_END
DEFINE_REGISTER(HcodecAssistAmr1Int0, DosRegisterIo, 0x1025)
DEFINE_REGISTER(HcodecAssistAmr1Int1, DosRegisterIo, 0x1026)
DEFINE_REGISTER(HcodecAssistAmr1Int3, DosRegisterIo, 0x1028)
DEFINE_REGISTER(HcodecIrqMboxClear, DosRegisterIo, 0x1079)
DEFINE_REGISTER(HcodecIrqMboxMask, DosRegisterIo, 0x107a)
DEFINE_REGISTER(HcodecMpsr, DosRegisterIo, 0x1301)
DEFINE_REGISTER(HcodecCpsr, DosRegisterIo, 0x1321)
DEFINE_REGISTER(HcodecMpcE, DosRegisterIo, 0x1308)
REGISTER_BEGIN(HcodecImemDmaCtrl, DosRegisterIo, 0x1340)
enum { kCtrl = 0x7 };
DEF_FIELD(18, 16, ctrl);
DEF_BIT(15, ready);
REGISTER_END
DEFINE_REGISTER(HcodecImemDmaAdr, DosRegisterIo, 0x1341)
DEFINE_REGISTER(HcodecImemDmaCount, DosRegisterIo, 0x1342)
REGISTER_BEGIN(HcodecHdecMcOmemAuto, DosRegisterIo, 0x1930)
DEF_BIT(31, use_omem_mb_xy);
DEF_FIELD(30, 16, omem_max_mb_x);
REGISTER_END
DEFINE_REGISTER(HcodecAnc0CanvasAddr, DosRegisterIo, 0x1990)
DEFINE_REGISTER(HcodecDbkRCanvasAddr, DosRegisterIo, 0x19b0)
DEFINE_REGISTER(HcodecDbkWCanvasAddr, DosRegisterIo, 0x19b1)
DEFINE_REGISTER(HcodecRecCanvasAddr, DosRegisterIo, 0x19b2)
DEFINE_REGISTER(HcodecCurrCanvasCtrl, DosRegisterIo, 0x19b3)
enum EncoderStatus {
kIdle = 0,
kSequence,
kPicture,
kIdr,
kNonIdr,
kMbHeader,
kSequenceDone,
kPictureDone,
kIdrDone,
kNonIdrDone,
kMbHeaderDone,
kMbDataDone,
kNonIdrIntra,
kNonIdrInter,
kError = 0xff,
};
// in scratch registers
DEFINE_REGISTER(HcodecEncoderStatus, DosRegisterIo, 0x1ac0)
DEFINE_REGISTER(HcodecMemOffsetReg, DosRegisterIo, 0x1ac1)
DEFINE_REGISTER(HcodecDebugReg, DosRegisterIo, 0x1ac2)
DEFINE_REGISTER(HcodecIdrPicId, DosRegisterIo, 0x1ac5)
DEFINE_REGISTER(HcodecFrameNumber, DosRegisterIo, 0x1ac6)
DEFINE_REGISTER(HcodecPicOrderCntLsb, DosRegisterIo, 0x1ac7)
DEFINE_REGISTER(HcodecLog2MaxPicOrderCntLsb, DosRegisterIo, 0x1ac8)
DEFINE_REGISTER(HcodecLog2MaxFrameNum, DosRegisterIo, 0x1ac9)
DEFINE_REGISTER(HcodecAnc0BufferId, DosRegisterIo, 0x1aca)
DEFINE_REGISTER(HcodecQpPicture, DosRegisterIo, 0x1acb)
REGISTER_BEGIN(HcodecIeMeMbType, DosRegisterIo, 0x1acd)
enum MbType {
kDefault = 0,
kI4MB = 0x9,
kAuto = 0xffff00ff,
};
REGISTER_END
REGISTER_BEGIN(HcodecIeMeMode, DosRegisterIo, 0x1ace)
DEF_FIELD(4, 0, ie_pippeline_block);
DEF_BIT(5, me_half_pixel_in_m8);
DEF_BIT(6, me_step2_sub_pixel_in_m8);
REGISTER_END
DEFINE_REGISTER(HcodecIeRefSel, DosRegisterIo, 0x1acf)
// For CBR
DEFINE_REGISTER(HcodecEncCbrTableAddr, DosRegisterIo, 0x1ac3)
DEFINE_REGISTER(HcodecEncCbrMbSizeAddr, DosRegisterIo, 0x1ac4)
REGISTER_BEGIN(HcodecEncCbrCtl, DosRegisterIo, 0x1ad0)
static constexpr uint32_t kTableSize = 0x800;
static constexpr uint32_t kShortShift = 12;
static constexpr uint32_t kLongMbNum = 2;
static constexpr uint32_t kStartTableId = 8;
static constexpr uint32_t kLongThreshold = 4;
DEF_FIELD(31, 28, init_qp_table_idx);
DEF_FIELD(27, 24, short_term_adjust_shift);
DEF_FIELD(23, 16, long_term_mb_number);
DEF_FIELD(15, 0, long_term_adjust_threshold);
REGISTER_END
DEFINE_REGISTER(HcodecEncCbrTargetSize, DosRegisterIo, 0x1ad1)
REGISTER_BEGIN(HcodecEncCbrRegionSize, DosRegisterIo, 0x1ad3)
static constexpr uint32_t kBlockWidth = 16;
static constexpr uint32_t kBlockHeight = 9;
DEF_FIELD(31, 16, block_w);
DEF_FIELD(15, 0, block_h);
REGISTER_END
DEFINE_REGISTER(HcodecInfoDumpStartAddr, DosRegisterIo, 0x1ad2)
REGISTER_BEGIN(HcodecFixedSliceCfg, DosRegisterIo, 0x1ad5)
DEF_FIELD(31, 0, num_rows_per_slice);
REGISTER_END
DEFINE_REGISTER(HcodecIeDataFeedBuffInfo, DosRegisterIo, 0x1ad8)
DEFINE_REGISTER(HcodecVlcStatusCtrl, DosRegisterIo, 0x1d00)
REGISTER_BEGIN(HcodecVlcConfig, DosRegisterIo, 0x1d01)
DEF_BIT(0, pop_coeff_even_all_zero);
REGISTER_END
DEFINE_REGISTER(HcodecVlcVbStartPtr, DosRegisterIo, 0x1d10)
DEFINE_REGISTER(HcodecVlcVbEndPtr, DosRegisterIo, 0x1d11)
DEFINE_REGISTER(HcodecVlcVbWrPtr, DosRegisterIo, 0x1d12)
DEFINE_REGISTER(HcodecVlcVbSwRdPtr, DosRegisterIo, 0x1d14)
REGISTER_BEGIN(HcodecVlcVbControl, DosRegisterIo, 0x1d16)
DEF_BIT(14, bit_14);
DEF_FIELD(5, 3, bits_5_3);
DEF_BIT(1, bit_1);
DEF_BIT(0, bit_0);
REGISTER_END
REGISTER_BEGIN(HcodecVlcVbMemCtl, DosRegisterIo, 0x1d17)
DEF_BIT(31, bit_31);
DEF_FIELD(30, 24, bits_30_24);
DEF_FIELD(23, 16, bits_23_16);
DEF_FIELD(1, 0, bits_1_0);
REGISTER_END
DEFINE_REGISTER(HcodecVlcTotalBytes, DosRegisterIo, 0x1d1a)
DEFINE_REGISTER(HcodecVlcIntControl, DosRegisterIo, 0x1d30)
REGISTER_BEGIN(HcodecVlcPicSize, DosRegisterIo, 0x1d31)
DEF_FIELD(31, 16, pic_height);
DEF_FIELD(15, 0, pic_width);
REGISTER_END
REGISTER_BEGIN(HcodecVlcPicPosition, DosRegisterIo, 0x1d33)
DEF_FIELD(31, 16, pic_mb_nr);
DEF_FIELD(15, 8, pic_mby);
DEF_FIELD(7, 0, pic_mbx);
REGISTER_END
DEFINE_REGISTER(HcodecVlcMbInfo, DosRegisterIo, 0x1d35)
DEFINE_REGISTER(HcodecVlcHcmdConfig, DosRegisterIo, 0x1d54)
REGISTER_BEGIN(HcodecVlcAdvConfig, DosRegisterIo, 0x1d25)
DEF_BIT(10, early_mix_mc_hcmd);
DEF_BIT(9, update_top_left_mix);
DEF_BIT(8, p_top_left_mix);
DEF_BIT(7, mv_cal_mixed_type);
DEF_BIT(6, mc_hcmd_mixed_type);
DEF_BIT(5, use_separate_int_control);
DEF_BIT(4, hcmd_intra_use_q_info);
DEF_BIT(3, hcmd_left_use_prev_info);
DEF_BIT(2, hcmd_use_q_info);
DEF_BIT(1, use_q_delta_quant);
DEF_BIT(0, detect_I16_from_I4);
REGISTER_END
DEFINE_REGISTER(HcodecQdctStatusCtrl, DosRegisterIo, 0x1f00)
REGISTER_BEGIN(HcodecIgnoreConfig, DosRegisterIo, 0x1f02)
DEF_BIT(31, ignore_lac_coeff_en);
DEF_BIT(26, ignore_lac_coeff_else);
DEF_BIT(21, ignore_lac_coeff_2);
DEF_FIELD(17, 16, ignore_lac_coeff_1);
DEF_BIT(15, ignore_cac_coeff_en);
DEF_BIT(10, ignore_cac_coeff_else);
DEF_BIT(5, ignore_cac_coeff_2);
DEF_FIELD(1, 0, ignore_cac_coeff_1);
REGISTER_END
REGISTER_BEGIN(HcodecIgnoreConfig2, DosRegisterIo, 0x1f03)
DEF_BIT(31, ignore_t_lac_coeff_en);
DEF_BIT(26, ignore_t_lac_coeff_else);
DEF_FIELD(22, 21, ignore_t_lac_coeff_2);
DEF_FIELD(18, 16, ignore_t_lac_coeff_1);
DEF_BIT(15, ignore_cdc_coeff_en);
DEF_BIT(14, ignore_t_lac_coeff_else_le_3);
DEF_BIT(13, ignore_t_lac_coeff_else_le_4);
DEF_BIT(12, ignore_cdc_only_when_empty_cac_inter);
DEF_BIT(11, ignore_cdc_only_when_one_empty_inter);
DEF_FIELD(10, 9, ignore_cdc_range_max_inter);
DEF_FIELD(8, 7, ignore_cdc_abs_max_inter);
DEF_BIT(5, ignore_cdc_only_when_empty_cac_intra);
DEF_BIT(4, ignore_cdc_only_when_one_empty_intra);
DEF_BIT(2, ignore_cdc_range_max_intra);
DEF_BIT(0, ignore_cdc_abs_max_intra);
REGISTER_END
DEFINE_REGISTER(HcodecQdctMbStartPtr, DosRegisterIo, 0x1f10)
DEFINE_REGISTER(HcodecQdctMbEndPtr, DosRegisterIo, 0x1f11)
DEFINE_REGISTER(HcodecQdctMbWrPtr, DosRegisterIo, 0x1f12)
DEFINE_REGISTER(HcodecQdctMbRdPtr, DosRegisterIo, 0x1f13)
REGISTER_BEGIN(HcodecQdctMbControl, DosRegisterIo, 0x1f15)
DEF_BIT(29, ie_start_int_enable);
DEF_BIT(28, ignore_t_p8x8);
DEF_BIT(27, zero_mc_out_null_non_skipped_mb);
DEF_BIT(26, no_mc_out_null_non_skipped_mb);
DEF_BIT(25, mc_out_even_skipped_mb);
DEF_BIT(24, mc_out_wait_cbp_ready);
DEF_BIT(23, mc_out_wait_mb_type_ready);
DEF_BIT(20, ie_sub_enable);
DEF_BIT(19, i_pred_enable);
DEF_BIT(18, iq_enable);
DEF_BIT(17, idct_enable);
DEF_BIT(14, mb_pause_enable);
DEF_BIT(13, q_enable);
DEF_BIT(12, dct_enable);
DEF_BIT(10, mb_info_en);
DEF_BIT(9, mb_info_soft_reset);
DEF_BIT(3, endian);
DEF_BIT(1, mb_read_en);
DEF_BIT(0, soft_reset);
REGISTER_END
DEFINE_REGISTER(HcodecQdctMbBuff, DosRegisterIo, 0x1f17)
REGISTER_BEGIN(HcodecQdctQQuantI, DosRegisterIo, 0x1f1c)
DEF_FIELD(31, 22, i_pic_qp_c);
DEF_FIELD(21, 16, i_pic_qp);
DEF_FIELD(15, 12, i_pic_qp_c_mod6);
DEF_FIELD(11, 8, i_pic_qp_c_div6);
DEF_FIELD(7, 4, i_pic_qp_mod6);
DEF_FIELD(3, 0, i_pic_qp_div6);
REGISTER_END
REGISTER_BEGIN(HcodecQdctQQuantP, DosRegisterIo, 0x1f1d)
DEF_FIELD(31, 22, p_pic_qp_c);
DEF_FIELD(21, 16, p_pic_qp);
DEF_FIELD(15, 12, p_pic_qp_c_mod6);
DEF_FIELD(11, 8, p_pic_qp_c_div6);
DEF_FIELD(7, 4, p_pic_qp_mod6);
DEF_FIELD(3, 0, p_pic_qp_div6);
REGISTER_END
REGISTER_BEGIN(HcodecQdctAdvConfig, DosRegisterIo, 0x1f34)
DEF_BIT(29, mb_info_latch_no_I16_pred_mode);
DEF_BIT(28, ie_dma_mbxy_use_i_pred);
DEF_BIT(27, ie_dma_read_write_use_ip_idx);
DEF_BIT(26, ie_start_use_top_dma_count);
DEF_BIT(25, i_pred_top_dma_rd_mbbot);
DEF_BIT(24, i_pred_top_dma_wr_disable);
DEF_BIT(23, i_pred_mix);
DEF_BIT(22, me_ab_rd_when_intra_in_p);
DEF_BIT(21, force_mb_skip_run_when_intra);
DEF_BIT(20, mc_out_mixed_type);
DEF_BIT(19, ie_start_when_quant_not_full);
DEF_BIT(18, mb_info_state_mix);
DEF_BIT(17, mb_type_use_mix_result);
DEF_BIT(16, me_cb_ie_read_enable);
DEF_BIT(15, ie_cur_data_from_me);
DEF_BIT(14, rem_per_use_table);
DEF_BIT(13, q_latch_int_enable);
DEF_BIT(12, q_use_table);
DEF_BIT(11, q_start_wait);
DEF_BIT(10, LUMA_16_LEFT_use_cur);
DEF_BIT(9, DC_16_LEFT_SUM_use_cur);
DEF_BIT(8, c_ref_ie_sel_cur);
DEF_BIT(7, c_ipred_perfect_mode);
DEF_BIT(6, ref_ie_ul_sel);
DEF_BIT(5, mb_type_use_ie_result);
DEF_BIT(4, detect_I16_from_I4);
DEF_BIT(3, ie_not_wait_ref_busy);
DEF_BIT(2, ie_I16_enable);
DEF_FIELD(1, 0, ie_done_sel);
REGISTER_END
REGISTER_BEGIN(HcodecIeWeight, DosRegisterIo, 0x1f35)
static constexpr uint32_t kI4MbWeightOffset = 0x755;
static constexpr uint32_t kI16MbWeightOffset = 0x340;
DEF_FIELD(31, 16, i16_weight);
DEF_FIELD(15, 0, i4_weight);
REGISTER_END
REGISTER_BEGIN(HcodecQQuantControl, DosRegisterIo, 0x1f36)
DEF_FIELD(31, 23, quant_table_addr);
DEF_BIT(22, quant_table_addr_update);
REGISTER_END
DEFINE_REGISTER(HcodecQuantTableData, DosRegisterIo, 0x1f39)
REGISTER_BEGIN(HcodecSadControl0, DosRegisterIo, 0x1f3a)
DEF_FIELD(31, 16, ie_sad_offset_I16);
DEF_FIELD(15, 0, ie_sad_offset_I4);
REGISTER_END
REGISTER_BEGIN(HcodecSadControl1, DosRegisterIo, 0x1f3b)
DEF_FIELD(27, 24, ie_sad_shift_I16);
DEF_FIELD(23, 20, ie_sad_shift_I4);
DEF_FIELD(19, 16, me_sad_shift_INTER);
DEF_FIELD(15, 0, me_sad_offset_INTER);
REGISTER_END
REGISTER_BEGIN(HcodecQdctVlcQuantCtl0, DosRegisterIo, 0x1f3c)
DEF_BIT(19, vlc_delta_quant_1);
DEF_FIELD(18, 13, vlc_quant_1);
DEF_BIT(6, vlc_delta_quant_0);
DEF_FIELD(5, 0, vlc_quant_0);
REGISTER_END
REGISTER_BEGIN(HcodecQdctVlcQuantCtl1, DosRegisterIo, 0x1f3d)
DEF_FIELD(11, 6, vlc_max_delta_q_neg);
DEF_FIELD(5, 0, vlc_max_delta_q_pos);
REGISTER_END
REGISTER_BEGIN(HcodecIeControl, DosRegisterIo, 0x1f40)
DEF_BIT(30, active_ul_block);
DEF_BIT(1, ie_enable);
DEF_BIT(0, ie_soft_reset);
REGISTER_END
REGISTER_BEGIN(HcodecSadControl, DosRegisterIo, 0x1f43)
DEF_BIT(3, ie_result_buff_enable);
DEF_BIT(2, ie_result_buff_soft_reset);
DEF_BIT(1, sad_enable);
DEF_BIT(0, sad_soft_reset);
REGISTER_END
DEFINE_REGISTER(HcodecIeResultBuffer, DosRegisterIo, 0x1f44)
DEFINE_REGISTER(HcodecMeStatus, DosRegisterIo, 0x1f4b)
REGISTER_BEGIN(HcodecMeSkipLine, DosRegisterIo, 0x1f4d)
DEF_FIELD(27, 24, step_3_skip_line);
DEF_FIELD(23, 18, step_2_skip_line);
DEF_FIELD(17, 12, step_1_skip_line);
DEF_FIELD(11, 6, step_0_skip_line);
REGISTER_END
REGISTER_BEGIN(HcodecMeSadEnough01, DosRegisterIo, 0x1f50)
DEF_FIELD(19, 12, me_sad_enough_1);
DEF_FIELD(11, 0, me_sad_enough_0);
REGISTER_END
REGISTER_BEGIN(HcodecMeSadEnough23, DosRegisterIo, 0x1f51)
DEF_FIELD(19, 12, adv_mv_8x8_enough);
DEF_FIELD(11, 0, me_sad_enough_2);
REGISTER_END
REGISTER_BEGIN(HcodecMeStep0CloseMv, DosRegisterIo, 0x1f52)
DEF_FIELD(21, 10, me_step0_big_sad);
DEF_FIELD(9, 5, me_step0_close_mv_y);
DEF_FIELD(4, 0, me_step0_close_mv_x);
REGISTER_END
REGISTER_BEGIN(HcodecMeFSkipSad, DosRegisterIo, 0x1f53)
DEF_FIELD(31, 24, force_skip_sad_3);
DEF_FIELD(23, 16, force_skip_sad_2);
DEF_FIELD(15, 8, force_skip_sad_1);
DEF_FIELD(7, 0, force_skip_sad_0);
REGISTER_END
REGISTER_BEGIN(HcodecMeFSkipWeight, DosRegisterIo, 0x1f54)
DEF_FIELD(31, 24, force_skip_weight_3);
DEF_FIELD(23, 16, force_skip_weight_2);
DEF_FIELD(15, 8, force_skip_weight_1);
DEF_FIELD(7, 0, force_skip_weight_0);
REGISTER_END
REGISTER_BEGIN(HcodecMeMvWeight01, DosRegisterIo, 0x1f56)
DEF_FIELD(31, 24, me_mv_step_weight_1);
DEF_FIELD(23, 16, me_mv_pre_weight_1);
DEF_FIELD(15, 8, me_mv_step_weight_0);
DEF_FIELD(7, 0, me_mv_pre_weight_0);
REGISTER_END
REGISTER_BEGIN(HcodecMeMvWeight23, DosRegisterIo, 0x1f57)
DEF_FIELD(31, 24, me_mv_step_weight_3);
DEF_FIELD(23, 16, me_mv_pre_weight_3);
DEF_FIELD(15, 8, me_mv_step_weight_2);
DEF_FIELD(7, 0, me_mv_pre_weight_2);
REGISTER_END
REGISTER_BEGIN(HcodecMeSadRangeInc, DosRegisterIo, 0x1f58)
DEF_FIELD(31, 24, me_sad_range_3);
DEF_FIELD(23, 16, me_sad_range_2);
DEF_FIELD(15, 8, me_sad_range_1);
DEF_FIELD(7, 0, me_sad_range_0);
REGISTER_END
REGISTER_BEGIN(HcodecMeWeight, DosRegisterIo, 0x1f60)
static constexpr uint32_t kMeWeightOffset = 0x340;
REGISTER_END
REGISTER_BEGIN(HcodecAdvMvCtl0, DosRegisterIo, 0x1f69)
DEF_BIT(31, adv_mv_large_16x8);
DEF_BIT(30, adv_mv_large_8x16);
DEF_FIELD(27, 16, adv_mv_8x8_weight);
DEF_FIELD(15, 0, adv_mv_4x4x4_weight);
REGISTER_END
REGISTER_BEGIN(HcodecAdvMvCtl1, DosRegisterIo, 0x1f6a)
DEF_FIELD(27, 16, adv_mv_16x16_weight);
DEF_BIT(15, adv_mv_large_16x16);
DEF_FIELD(11, 0, adv_mv_16x8_weight);
REGISTER_END
REGISTER_BEGIN(HcodecV3SkipControl, DosRegisterIo, 0x1f6c)
DEF_BIT(31, v3_skip_enable);
DEF_BIT(30, v3_step_1_weight_enable);
DEF_BIT(28, v3_mv_sad_weight_enable);
DEF_BIT(27, v3_ipred_type_enable);
DEF_FIELD(19, 12, v3_force_skip_sad_1);
DEF_FIELD(11, 0, v3_force_skip_sad_0);
REGISTER_END
REGISTER_BEGIN(HcodecV3SkipWeight, DosRegisterIo, 0x1f70)
DEF_FIELD(31, 16, v3_skip_weight_1);
DEF_FIELD(15, 0, v3_skip_weight_0);
REGISTER_END
REGISTER_BEGIN(HcodecV3L1SkipMaxSad, DosRegisterIo, 0x1f71)
DEF_FIELD(31, 16, v3_level_1_f_skip_max_sad);
DEF_FIELD(15, 0, v3_level_1_skip_max_sad);
REGISTER_END
REGISTER_BEGIN(HcodecV3L2SkipWeight, DosRegisterIo, 0x1f72)
DEF_FIELD(31, 16, v3_force_skip_sad_2);
DEF_FIELD(15, 0, v3_skip_weight_2);
REGISTER_END
DEFINE_REGISTER(HcodecV3MvSadTable, DosRegisterIo, 0x1f73)
REGISTER_BEGIN(HcodecV3FZeroCtl0, DosRegisterIo, 0x1f74)
DEF_FIELD(31, 16, v3_ie_f_zero_sad_I16);
DEF_FIELD(15, 0, v3_ie_f_zero_sad_I4);
REGISTER_END
REGISTER_BEGIN(HcodecV3FZeroCtl1, DosRegisterIo, 0x1f75)
DEF_BIT(25, v3_no_ver_when_top_zero_en);
DEF_BIT(24, v3_no_hor_when_left_zero_en);
DEF_FIELD(17, 16, type_hor_break);
DEF_FIELD(15, 0, v3_me_f_zero_sad);
REGISTER_END
REGISTER_BEGIN(HcodecV3IpredTypeWeight0, DosRegisterIo, 0x1f78)
DEF_FIELD(31, 24, C_ipred_weight_H);
DEF_FIELD(23, 16, C_ipred_weight_V);
DEF_FIELD(15, 8, I4_ipred_weight_else);
DEF_FIELD(7, 0, I4_ipred_weight_most);
REGISTER_END
REGISTER_BEGIN(HcodecV3IpredTypeWeight1, DosRegisterIo, 0x1f79)
DEF_FIELD(31, 24, I16_ipred_weight_DC);
DEF_FIELD(23, 16, I16_ipred_weight_H);
DEF_FIELD(15, 8, I16_ipred_weight_V);
DEF_FIELD(7, 0, C_ipred_weight_DC);
REGISTER_END
REGISTER_BEGIN(HcodecV3LeftSmallMaxSad, DosRegisterIo, 0x1f7a)
DEF_FIELD(31, 16, v3_left_small_max_me_sad);
DEF_FIELD(15, 0, v3_left_small_max_ie_sad);
REGISTER_END
REGISTER_BEGIN(HcodecV4ForceSkipCfg, DosRegisterIo, 0x1f7b)
DEF_FIELD(31, 26, v4_force_q_r_intra);
DEF_FIELD(25, 20, v4_force_q_r_inter);
DEF_BIT(19, v4_force_q_y_enable);
DEF_FIELD(18, 16, v4_force_qr_y);
DEF_FIELD(15, 12, v4_force_qp_y);
DEF_BIT(0, v4_force_skip_sad);
REGISTER_END
REGISTER_BEGIN(HhiVdecClkCntl, HiuRegisterIo, 0x78)
DEF_FIELD(27, 25, hcodec_clk_sel);
DEF_BIT(24, hcodec_clk_en);
DEF_FIELD(22, 16, hcodec_clk_div);
REGISTER_END
REGISTER_BEGIN(HhiGclkMpeg0, HiuRegisterIo, 0x50)
DEF_BIT(1, dos);
REGISTER_END
#undef REGISTER_BEGIN
#undef REGISTER_END
#undef DEFINE_REGISTER
#endif // SRC_MEDIA_DRIVERS_AMLOGIC_ENCODER_REGISTERS_H_