// Copyright 2018 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. #pragma once #include #include #include namespace registers { class VdIfGenReg : public hwreg::RegisterBase { public: static constexpr uint32_t kBaseAddr = 0x1a50; DEF_BIT(31, enable_free_clock); DEF_BIT(30, sw_reset); DEF_BIT(29, reset_on_go_field); DEF_BIT(28, urgent_chroma); DEF_BIT(27, urgent_luma); DEF_BIT(26, chroma_end_at_last_line); DEF_BIT(25, luma_end_at_last_line); DEF_FIELD(24, 19, hold_lines); DEF_BIT(18, last_line); DEF_BIT(17, busy); DEF_BIT(16, demux_mode); DEF_FIELD(15, 14, bytes_per_pixel); DEF_FIELD(13, 12, ddr_burst_size_cr); DEF_FIELD(11, 10, ddr_burst_size_cb); DEF_FIELD(9, 8, ddr_burst_size_y); DEF_BIT(7, manual_start_frame); DEF_BIT(6, chro_rpt_lastl_ctrl); // This seems to do a 128-bit endianness conversion, which isn't very useful. The canvas should // be used to do the conversion instead. DEF_BIT(4, little_endian); DEF_BIT(3, chroma_hz_avg); DEF_BIT(2, luma_hz_avg); DEF_BIT(1, separate_en); DEF_BIT(0, enable); }; class VdIfCanvas0 : public hwreg::RegisterBase { public: static constexpr uint32_t kBaseAddr = 0x1a51; }; class VdIfLumaX0 : public hwreg::RegisterBase { public: static constexpr uint32_t kBaseAddr = 0x1a53; DEF_FIELD(30, 16, end); DEF_FIELD(14, 0, start); }; class VdIfLumaY0 : public hwreg::RegisterBase { public: static constexpr uint32_t kBaseAddr = 0x1a54; DEF_FIELD(28, 16, end); DEF_FIELD(12, 0, start); }; class VdIfChromaX0 : public hwreg::RegisterBase { public: static constexpr uint32_t kBaseAddr = 0x1a55; DEF_FIELD(30, 16, end); DEF_FIELD(14, 0, start); }; class VdIfChromaY0 : public hwreg::RegisterBase { public: static constexpr uint32_t kBaseAddr = 0x1a56; DEF_FIELD(28, 16, end); DEF_FIELD(12, 0, start); }; class VdIfGenReg2 : public hwreg::RegisterBase { public: static constexpr uint32_t kBaseAddr = 0x1a6d; DEF_FIELD(1, 0, color_map); }; class VdFmtCtrl : public hwreg::RegisterBase { public: static constexpr uint32_t kBaseAddr = 0x1a68; DEF_BIT(31, gate_clk_en); DEF_BIT(30, soft_rst); DEF_BIT(28, horizontal_repeat); DEF_FIELD(27, 24, horizontal_initial_phase); DEF_BIT(23, horizontal_repeat_pixel0); DEF_FIELD(22, 21, horizontal_yc_ratio); DEF_BIT(20, horizontal_enable); DEF_BIT(19, virtual_phase0_only); DEF_BIT(18, disable_vertical_chroma_repeat); DEF_BIT(17, disable_vertical_repeat_line); DEF_BIT(16, vertical_repeat_line0); DEF_FIELD(15, 12, vertical_skip_line_num); DEF_FIELD(11, 8, vertical_initial_phase); DEF_FIELD(7, 1, vertical_phase_step); DEF_BIT(0, vertical_enable); }; class VdFmtW : public hwreg::RegisterBase { public: static constexpr uint32_t kBaseAddr = 0x1a69; DEF_FIELD(27, 16, horizontal_width); DEF_FIELD(11, 0, vertical_width); }; class VdIfRptLoop : public hwreg::RegisterBase { public: static constexpr uint32_t kBaseAddr = 0x1a5b; }; class VdIfLuma0RptPat : public hwreg::RegisterBase { public: static constexpr uint32_t kBaseAddr = 0x1a5c; }; class VdIfChroma0RptPat : public hwreg::RegisterBase { public: static constexpr uint32_t kBaseAddr = 0x1a5d; }; class VdIfLumaPsel : public hwreg::RegisterBase { public: static constexpr uint32_t kBaseAddr = 0x1a60; }; class VdIfChromaPsel : public hwreg::RegisterBase { public: static constexpr uint32_t kBaseAddr = 0x1a61; }; class Vd { public: // 0-based index Vd(uint32_t index) : index_(index) { assert(index < 2); } auto IfGenReg() { return GetReg(); } auto IfCanvas0() { return GetReg(); } auto IfLumaX0() { return GetReg(); } auto IfLumaY0() { return GetReg(); } auto IfChromaX0() { return GetReg(); } auto IfChromaY0() { return GetReg(); } auto IfGenReg2() { return GetReg(); } auto FmtCtrl() { return GetReg(); } auto FmtW() { return GetReg(); } auto IfRptLoop() { return GetReg(); } auto IfLuma0RptPat() { return GetReg(); } auto IfChroma0RptPat() { return GetReg(); } auto IfLumaPsel() { return GetReg(); } auto IfChromaPsel() { return GetReg(); } private: template hwreg::RegisterAddr GetReg() { return hwreg::RegisterAddr((RegType::kBaseAddr + 0x20 * index_) * 4); } uint32_t index_; }; class VpuVppMisc : public hwreg::RegisterBase { public: static auto Get() { return hwreg::RegisterAddr(0x1d26 * 4); } DEF_BIT(13, osd2_enable_postblend); DEF_BIT(12, osd1_enable_postblend); DEF_BIT(11, vd2_enable_postblend); DEF_BIT(10, vd1_enable_postblend); }; class VpuVppOsdScCtrl0 : public hwreg::RegisterBase { public: static auto Get() { return hwreg::RegisterAddr(0x1dc8 * 4); } enum { kSelectOsd1 = 0, kSelectOsd2 = 1, kSelectVd1 = 2, kSelectVd2 = 3, }; DEF_BIT(3, enable); DEF_FIELD(1, 0, osd_sc_sel); }; class VpuVppOsdScoHStartEnd : public hwreg::RegisterBase { public: static auto Get() { return hwreg::RegisterAddr(0x1dca * 4); } DEF_FIELD(27, 16, output_horizontal_start); DEF_FIELD(11, 0, output_horizontal_end); }; class VpuVppOsdScoVStartEnd : public hwreg::RegisterBase { public: static auto Get() { return hwreg::RegisterAddr(0x1dcb * 4); } DEF_FIELD(27, 16, output_vertial_start); DEF_FIELD(11, 0, output_vertical_end); }; class VpuVppOsdSciWhM1 : public hwreg::RegisterBase { public: static auto Get() { return hwreg::RegisterAddr(0x1dc9 * 4); } DEF_FIELD(28, 16, input_width_minus1); DEF_FIELD(12, 0, input_height_minus1); }; class VpuVppPostblendHSize : public hwreg::RegisterBase { public: static auto Get() { return hwreg::RegisterAddr(0x1d21 * 4); } DEF_FIELD(11, 0, horizontal_size); }; class VpuViuOsdBlk0CfgW0 : public hwreg::RegisterBase { public: static constexpr uint32_t kBaseAddr = 0x1a1b; enum { kColorMatrix655 = 0, kColorMatrix844 = 1, kColorMatrix565 = 2, kColorMatrixRGBA8888 = 0, kColorMatrixARGB8888 = 1, kColorMatrixABGR8888 = 2, kColorMatrixBGRA8888 = 3, kColorMatrixRGB888 = 0, kColorMatrixBGR888 = 5, }; enum { kBlockMode422 = 3, kBlockMode16Bit = 4, kBlockMode32Bit = 5, kBlockMode24Bit = 7, }; DEF_BIT(29, y_rev); DEF_BIT(28, x_rev); DEF_FIELD(23, 16, tbl_addr); DEF_BIT(15, little_endian); DEF_BIT(14, rpt_y); DEF_FIELD(13, 12, interp_ctrl); DEF_FIELD(11, 8, block_mode); DEF_BIT(7, rgb_en); DEF_BIT(6, tx_alpha_en); DEF_FIELD(5, 2, color_matrix); DEF_BIT(1, interlace_en); DEF_BIT(0, interlace_sel_odd); }; class VpuViuOsdBlk0CfgW1 : public hwreg::RegisterBase { public: static constexpr uint32_t kBaseAddr = 0x1a1c; DEF_FIELD(28, 16, virtual_canvas_x_end); DEF_FIELD(12, 0, virtual_canvas_x_start); }; class VpuViuOsdBlk0CfgW2 : public hwreg::RegisterBase { public: static constexpr uint32_t kBaseAddr = 0x1a1d; DEF_FIELD(28, 16, virtual_canvas_y_end); DEF_FIELD(12, 0, virtual_canvas_y_start); }; class VpuViuOsdBlk0CfgW3 : public hwreg::RegisterBase { public: static constexpr uint32_t kBaseAddr = 0x1a1e; DEF_FIELD(28, 16, display_h_end); DEF_FIELD(12, 0, display_h_start); }; class VpuViuOsdBlk0CfgW4 : public hwreg::RegisterBase { public: static constexpr uint32_t kBaseAddresses[2] = {0x1a13, 0x1a64}; DEF_FIELD(28, 16, display_v_end); DEF_FIELD(12, 0, display_v_start); }; class VpuViuOsdCtrlStat2 : public hwreg::RegisterBase { public: static constexpr uint32_t kBaseAddr = 0x1a2d; DEF_BIT(15, osd_dpath_sel); DEF_BIT(14, replaced_alpha_en); DEF_FIELD(13, 6, replaced_alpha); DEF_FIELD(5, 4, hold_fifo_lines); DEF_BIT(3, rgbyuv_full_range); DEF_BIT(2, alpha_9b_mode); DEF_BIT(0, color_expand_mode); }; class VpuViuOsdCtrlStat : public hwreg::RegisterBase { public: static constexpr uint32_t kBaseAddr = 0x1a10; DEF_BIT(30, enable_free_clock); DEF_BIT(28, osd_done); DEF_FIELD(27, 24, osd_blk_mode); DEF_FIELD(23, 22, osd_blk_ptr); DEF_BIT(21, osd_enable); DEF_FIELD(20, 12, global_alpha); DEF_FIELD(8, 5, ctrl_mtch_y); DEF_BIT(4, ctrl_422to444); DEF_BIT(0, osd_blk_enable); }; class Osd { public: // 0-based OSD index Osd(uint32_t index) : index_(index) { assert(index_ < 2); } auto CtrlStat() { return GetReg(); } auto CtrlStat2() { return GetReg(); } auto Blk0CfgW0() { return GetReg(); } auto Blk0CfgW1() { return GetReg(); } auto Blk0CfgW2() { return GetReg(); } auto Blk0CfgW3() { return GetReg(); } auto Blk0CfgW4() { return GetRegNonstandard(); } private: template hwreg::RegisterAddr GetReg() { return hwreg::RegisterAddr((RegType::kBaseAddr + 0x20 * index_) * 4); } template hwreg::RegisterAddr GetRegNonstandard() { ZX_DEBUG_ASSERT(index_ < countof(RegType::kBaseAddresses)); return hwreg::RegisterAddr(RegType::kBaseAddresses[index_] * 4); } const uint32_t index_; }; } // namespace registers