// 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_
