drm/vc4: hvs: Add support for BCM2712 HVS

The HVS found in the BCM2712, while having a similar role, is very
different from the one found in the previous SoCs. Indeed, the register
layout is fairly different, and the DLIST format is new as well.

Let's introduce the needed functions to support the new HVS.

This commit adds the C-step register layout. The D-step will be
added later.

Signed-off-by: Maxime Ripard <mripard@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20241025-drm-vc4-2712-support-v2-10-35efa83c8fc0@raspberrypi.com
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
This commit is contained in:
Maxime Ripard
2024-11-27 14:37:19 +00:00
committed by Dave Stevenson
parent 626ffc5f87
commit 7687a12153
7 changed files with 1617 additions and 78 deletions
+37 -10
View File
@@ -83,13 +83,22 @@ static unsigned int
vc4_crtc_get_cob_allocation(struct vc4_dev *vc4, unsigned int channel)
{
struct vc4_hvs *hvs = vc4->hvs;
u32 dispbase = HVS_READ(SCALER_DISPBASEX(channel));
u32 dispbase, top, base;
/* Top/base are supposed to be 4-pixel aligned, but the
* Raspberry Pi firmware fills the low bits (which are
* presumably ignored).
*/
u32 top = VC4_GET_FIELD(dispbase, SCALER_DISPBASEX_TOP) & ~3;
u32 base = VC4_GET_FIELD(dispbase, SCALER_DISPBASEX_BASE) & ~3;
if (vc4->gen >= VC4_GEN_6_C) {
dispbase = HVS_READ(SCALER6_DISPX_COB(channel));
top = VC4_GET_FIELD(dispbase, SCALER6_DISPX_COB_TOP) & ~3;
base = VC4_GET_FIELD(dispbase, SCALER6_DISPX_COB_BASE) & ~3;
} else {
dispbase = HVS_READ(SCALER_DISPBASEX(channel));
top = VC4_GET_FIELD(dispbase, SCALER_DISPBASEX_TOP) & ~3;
base = VC4_GET_FIELD(dispbase, SCALER_DISPBASEX_BASE) & ~3;
}
return top - base + 4;
}
@@ -122,7 +131,10 @@ static bool vc4_crtc_get_scanout_position(struct drm_crtc *crtc,
* Read vertical scanline which is currently composed for our
* pixelvalve by the HVS, and also the scaler status.
*/
val = HVS_READ(SCALER_DISPSTATX(channel));
if (vc4->gen >= VC4_GEN_6_C)
val = HVS_READ(SCALER6_DISPX_STATUS(channel));
else
val = HVS_READ(SCALER_DISPSTATX(channel));
/* Get optional system timestamp after query. */
if (etime)
@@ -131,7 +143,12 @@ static bool vc4_crtc_get_scanout_position(struct drm_crtc *crtc,
/* preempt_enable_rt() should go right here in PREEMPT_RT patchset. */
/* Vertical position of hvs composed scanline. */
*vpos = VC4_GET_FIELD(val, SCALER_DISPSTATX_LINE);
if (vc4->gen >= VC4_GEN_6_C)
*vpos = VC4_GET_FIELD(val, SCALER6_DISPX_STATUS_YLINE);
else
*vpos = VC4_GET_FIELD(val, SCALER_DISPSTATX_LINE);
*hpos = 0;
if (mode->flags & DRM_MODE_FLAG_INTERLACE) {
@@ -459,8 +476,10 @@ static void require_hvs_enabled(struct drm_device *dev)
struct vc4_dev *vc4 = to_vc4_dev(dev);
struct vc4_hvs *hvs = vc4->hvs;
WARN_ON_ONCE((HVS_READ(SCALER_DISPCTRL) & SCALER_DISPCTRL_ENABLE) !=
SCALER_DISPCTRL_ENABLE);
if (vc4->gen >= VC4_GEN_6_C)
WARN_ON_ONCE(!(HVS_READ(SCALER6_CONTROL) & SCALER6_CONTROL_HVS_EN));
else
WARN_ON_ONCE(!(HVS_READ(SCALER_DISPCTRL) & SCALER_DISPCTRL_ENABLE));
}
static int vc4_crtc_disable(struct drm_crtc *crtc,
@@ -789,14 +808,21 @@ static void vc4_crtc_handle_page_flip(struct vc4_crtc *vc4_crtc)
struct drm_device *dev = crtc->dev;
struct vc4_dev *vc4 = to_vc4_dev(dev);
struct vc4_hvs *hvs = vc4->hvs;
unsigned int current_dlist;
u32 chan = vc4_crtc->current_hvs_channel;
unsigned long flags;
spin_lock_irqsave(&dev->event_lock, flags);
spin_lock(&vc4_crtc->irq_lock);
if (vc4->gen >= VC4_GEN_6_C)
current_dlist = VC4_GET_FIELD(HVS_READ(SCALER6_DISPX_DL(chan)),
SCALER6_DISPX_DL_LACT);
else
current_dlist = HVS_READ(SCALER_DISPLACTX(chan));
if (vc4_crtc->event &&
(vc4_crtc->current_dlist == HVS_READ(SCALER_DISPLACTX(chan)) ||
vc4_crtc->feeds_txp)) {
(vc4_crtc->current_dlist == current_dlist || vc4_crtc->feeds_txp)) {
drm_crtc_send_vblank_event(crtc, vc4_crtc->event);
vc4_crtc->event = NULL;
drm_crtc_vblank_put(crtc);
@@ -807,7 +833,8 @@ static void vc4_crtc_handle_page_flip(struct vc4_crtc *vc4_crtc)
* the CRTC and encoder already reconfigured, leading to
* underruns. This can be seen when reconfiguring the CRTC.
*/
vc4_hvs_unmask_underrun(hvs, chan);
if (vc4->gen < VC4_GEN_6_C)
vc4_hvs_unmask_underrun(hvs, chan);
}
spin_unlock(&vc4_crtc->irq_lock);
spin_unlock_irqrestore(&dev->event_lock, flags);
+6
View File
@@ -279,6 +279,7 @@ static void vc4_component_unbind_all(void *ptr)
static const struct of_device_id vc4_dma_range_matches[] = {
{ .compatible = "brcm,bcm2711-hvs" },
{ .compatible = "brcm,bcm2712-hvs" },
{ .compatible = "brcm,bcm2835-hvs" },
{ .compatible = "brcm,bcm2835-v3d" },
{ .compatible = "brcm,cygnus-v3d" },
@@ -307,6 +308,11 @@ static int vc4_drm_bind(struct device *dev)
else
driver = &vc4_drm_driver;
if (gen >= VC4_GEN_6_C)
dma_set_mask_and_coherent(dev, DMA_BIT_MASK(36));
else
dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
node = of_find_matching_node_and_match(NULL, vc4_dma_range_matches,
NULL);
if (node) {
+30
View File
@@ -317,6 +317,21 @@ struct vc4_v3d {
struct debugfs_regset32 regset;
};
#define VC4_NUM_UPM_HANDLES 32
struct vc4_upm_refcounts {
refcount_t refcount;
/* Allocation size */
size_t size;
/* Our allocation in UPM for prefetching. */
struct drm_mm_node upm;
/* Pointer back to the HVS structure */
struct vc4_hvs *hvs;
};
#define HVS_NUM_CHANNELS 3
struct vc4_hvs {
struct vc4_dev *vc4;
struct platform_device *pdev;
@@ -325,6 +340,7 @@ struct vc4_hvs {
unsigned int dlist_mem_size;
struct clk *core_clk;
struct clk *disp_clk;
unsigned long max_core_rate;
@@ -332,8 +348,15 @@ struct vc4_hvs {
* list. Units are dwords.
*/
struct drm_mm dlist_mm;
/* Memory manager for the LBM memory used by HVS scaling. */
struct drm_mm lbm_mm;
/* Memory manager for the UPM memory used for prefetching. */
struct drm_mm upm_mm;
struct ida upm_handles;
struct vc4_upm_refcounts upm_refcounts[VC4_NUM_UPM_HANDLES + 1];
spinlock_t mm_lock;
struct drm_mm_node mitchell_netravali_filter;
@@ -356,6 +379,7 @@ struct vc4_hvs {
};
#define HVS_NUM_CHANNELS 3
#define HVS_UBM_WORD_SIZE 256
struct vc4_hvs_state {
struct drm_private_state base;
@@ -425,6 +449,12 @@ struct vc4_plane_state {
/* Our allocation in LBM for temporary storage during scaling. */
struct drm_mm_node lbm;
/* The Unified Pre-Fetcher Handle */
unsigned int upm_handle[DRM_FORMAT_MAX_PLANES];
/* Number of lines to pre-fetch */
unsigned int upm_buffer_lines;
/* Set when the plane has per-pixel alpha content or does not cover
* the entire screen. This is a hint to the CRTC that it might need
* to enable background color fill.
File diff suppressed because it is too large Load Diff
+84 -14
View File
@@ -320,17 +320,62 @@ static void vc5_hvs_pv_muxing_commit(struct vc4_dev *vc4,
}
}
static void vc6_hvs_pv_muxing_commit(struct vc4_dev *vc4,
struct drm_atomic_state *state)
{
struct vc4_hvs *hvs = vc4->hvs;
struct drm_crtc_state *crtc_state;
struct drm_crtc *crtc;
unsigned int i;
WARN_ON_ONCE(vc4->gen != VC4_GEN_6_C);
for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
struct vc4_crtc_state *vc4_state = to_vc4_crtc_state(crtc_state);
struct vc4_encoder *vc4_encoder;
struct drm_encoder *encoder;
unsigned char mux;
u32 reg;
if (!vc4_state->update_muxing)
continue;
if (vc4_state->assigned_channel != 1)
continue;
encoder = vc4_get_crtc_encoder(crtc, crtc_state);
vc4_encoder = to_vc4_encoder(encoder);
switch (vc4_encoder->type) {
case VC4_ENCODER_TYPE_HDMI1:
mux = 0;
break;
case VC4_ENCODER_TYPE_TXP:
mux = 2;
break;
default:
drm_err(&vc4->base, "Unhandled encoder type for PV muxing %d",
vc4_encoder->type);
mux = 0;
break;
}
reg = HVS_READ(SCALER6_CONTROL);
HVS_WRITE(SCALER6_CONTROL,
(reg & ~SCALER6_CONTROL_DSP1_TARGET_MASK) |
VC4_SET_FIELD(mux, SCALER6_CONTROL_DSP1_TARGET));
}
}
static void vc4_atomic_commit_tail(struct drm_atomic_state *state)
{
struct drm_device *dev = state->dev;
struct vc4_dev *vc4 = to_vc4_dev(dev);
struct vc4_hvs *hvs = vc4->hvs;
struct drm_crtc_state *new_crtc_state;
struct vc4_hvs_state *new_hvs_state;
struct drm_crtc *crtc;
struct vc4_hvs_state *old_hvs_state;
unsigned int channel;
int i;
old_hvs_state = vc4_hvs_get_old_global_state(state);
if (WARN_ON(IS_ERR(old_hvs_state)))
@@ -340,14 +385,20 @@ static void vc4_atomic_commit_tail(struct drm_atomic_state *state)
if (WARN_ON(IS_ERR(new_hvs_state)))
return;
for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
struct vc4_crtc_state *vc4_crtc_state;
if (vc4->gen < VC4_GEN_6_C) {
struct drm_crtc_state *new_crtc_state;
struct drm_crtc *crtc;
int i;
if (!new_crtc_state->commit)
continue;
for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
struct vc4_crtc_state *vc4_crtc_state;
vc4_crtc_state = to_vc4_crtc_state(new_crtc_state);
vc4_hvs_mask_underrun(hvs, vc4_crtc_state->assigned_channel);
if (!new_crtc_state->commit)
continue;
vc4_crtc_state = to_vc4_crtc_state(new_crtc_state);
vc4_hvs_mask_underrun(hvs, vc4_crtc_state->assigned_channel);
}
}
for (channel = 0; channel < HVS_NUM_CHANNELS; channel++) {
@@ -382,16 +433,31 @@ static void vc4_atomic_commit_tail(struct drm_atomic_state *state)
* modeset.
*/
WARN_ON(clk_set_min_rate(hvs->core_clk, core_rate));
WARN_ON(clk_set_min_rate(hvs->disp_clk, core_rate));
}
drm_atomic_helper_commit_modeset_disables(dev, state);
vc4_ctm_commit(vc4, state);
if (vc4->gen <= VC4_GEN_5)
vc4_ctm_commit(vc4, state);
if (vc4->gen == VC4_GEN_5)
vc5_hvs_pv_muxing_commit(vc4, state);
else
switch (vc4->gen) {
case VC4_GEN_4:
vc4_hvs_pv_muxing_commit(vc4, state);
break;
case VC4_GEN_5:
vc5_hvs_pv_muxing_commit(vc4, state);
break;
case VC4_GEN_6_C:
vc6_hvs_pv_muxing_commit(vc4, state);
break;
default:
drm_err(dev, "Unknown VC4 generation: %d", vc4->gen);
break;
}
drm_atomic_helper_commit_planes(dev, state,
DRM_PLANE_COMMIT_ACTIVE_ONLY);
@@ -418,6 +484,7 @@ static void vc4_atomic_commit_tail(struct drm_atomic_state *state)
* requirements.
*/
WARN_ON(clk_set_min_rate(hvs->core_clk, core_rate));
WARN_ON(clk_set_min_rate(hvs->disp_clk, core_rate));
drm_dbg(dev, "Core clock actual rate: %lu Hz\n",
clk_get_rate(hvs->core_clk));
@@ -1056,7 +1123,10 @@ int vc4_kms_load(struct drm_device *dev)
return ret;
}
if (vc4->gen == VC4_GEN_5) {
if (vc4->gen >= VC4_GEN_6_C) {
dev->mode_config.max_width = 8192;
dev->mode_config.max_height = 8192;
} else if (vc4->gen >= VC4_GEN_5) {
dev->mode_config.max_width = 7680;
dev->mode_config.max_height = 7680;
} else {
File diff suppressed because it is too large Load Diff
+181
View File
@@ -520,6 +520,130 @@
#define SCALER5_DLIST_START 0x00004000
#define SCALER6_VERSION 0x00000000
#define SCALER6_CXM_SIZE 0x00000004
#define SCALER6_LBM_SIZE 0x00000008
#define SCALER6_UBM_SIZE 0x0000000c
#define SCALER6_COBA_SIZE 0x00000010
#define SCALER6_COB_SIZE 0x00000014
#define SCALER6_CONTROL 0x00000020
# define SCALER6_CONTROL_HVS_EN BIT(31)
# define SCALER6_CONTROL_PF_LINES_MASK VC4_MASK(22, 18)
# define SCALER6_CONTROL_ABORT_ON_EMPTY BIT(16)
# define SCALER6_CONTROL_DSP1_TARGET_MASK VC4_MASK(13, 12)
# define SCALER6_CONTROL_MAX_REQS_MASK VC4_MASK(7, 4)
#define SCALER6_FETCHER_STATUS 0x00000024
#define SCALER6_FETCH_STATUS 0x00000028
#define SCALER6_HANDLE_ERROR 0x0000002c
#define SCALER6_DISP0_CTRL0 0x00000030
#define SCALER6_DISPX_CTRL0(x) \
(SCALER6_DISP0_CTRL0 + ((x) * (SCALER6_DISP1_CTRL0 - SCALER6_DISP0_CTRL0)))
# define SCALER6_DISPX_CTRL0_ENB BIT(31)
# define SCALER6_DISPX_CTRL0_RESET BIT(30)
# define SCALER6_DISPX_CTRL0_FWIDTH_MASK VC4_MASK(28, 16)
# define SCALER6_DISPX_CTRL0_ONESHOT BIT(15)
# define SCALER6_DISPX_CTRL0_ONECTX_MASK VC4_MASK(14, 13)
# define SCALER6_DISPX_CTRL0_LINES_MASK VC4_MASK(12, 0)
#define SCALER6_DISP0_CTRL1 0x00000034
#define SCALER6_DISPX_CTRL1(x) \
(SCALER6_DISP0_CTRL1 + ((x) * (SCALER6_DISP1_CTRL1 - SCALER6_DISP0_CTRL1)))
# define SCALER6_DISPX_CTRL1_BGENB BIT(8)
# define SCALER6_DISPX_CTRL1_INTLACE BIT(0)
#define SCALER6_DISP0_BGND 0x00000038
#define SCALER6_DISPX_BGND(x) \
(SCALER6_DISP0_BGND + ((x) * (SCALER6_DISP1_BGND - SCALER6_DISP0_BGND)))
#define SCALER6_DISP0_LPTRS 0x0000003c
#define SCALER6_DISPX_LPTRS(x) \
(SCALER6_DISP0_LPTRS + ((x) * (SCALER6_DISP1_LPTRS - SCALER6_DISP0_LPTRS)))
# define SCALER6_DISPX_LPTRS_HEADE_MASK VC4_MASK(11, 0)
#define SCALER6_DISP0_COB 0x00000040
#define SCALER6_DISPX_COB(x) \
(SCALER6_DISP0_COB + ((x) * (SCALER6_DISP1_COB - SCALER6_DISP0_COB)))
# define SCALER6_DISPX_COB_TOP_MASK VC4_MASK(31, 16)
# define SCALER6_DISPX_COB_BASE_MASK VC4_MASK(15, 0)
#define SCALER6_DISP0_STATUS 0x00000044
#define SCALER6_DISPX_STATUS(x) \
(SCALER6_DISP0_STATUS + ((x) * (SCALER6_DISP1_STATUS - SCALER6_DISP0_STATUS)))
# define SCALER6_DISPX_STATUS_EMPTY BIT(22)
# define SCALER6_DISPX_STATUS_FRCNT_MASK VC4_MASK(21, 16)
# define SCALER6_DISPX_STATUS_OFIELD BIT(15)
# define SCALER6_DISPX_STATUS_MODE_MASK VC4_MASK(14, 13)
# define SCALER6_DISPX_STATUS_MODE_DISABLED 0
# define SCALER6_DISPX_STATUS_MODE_INIT 1
# define SCALER6_DISPX_STATUS_MODE_RUN 2
# define SCALER6_DISPX_STATUS_MODE_EOF 3
# define SCALER6_DISPX_STATUS_YLINE_MASK VC4_MASK(12, 0)
#define SCALER6_DISP0_DL 0x00000048
#define SCALER6_DISPX_DL(x) \
(SCALER6_DISP0_DL + ((x) * (SCALER6_DISP1_DL - SCALER6_DISP0_DL)))
# define SCALER6_DISPX_DL_LACT_MASK VC4_MASK(11, 0)
#define SCALER6_DISP0_RUN 0x0000004c
#define SCALER6_DISP1_CTRL0 0x00000050
#define SCALER6_DISP1_CTRL1 0x00000054
#define SCALER6_DISP1_BGND 0x00000058
#define SCALER6_DISP1_LPTRS 0x0000005c
#define SCALER6_DISP1_COB 0x00000060
#define SCALER6_DISP1_STATUS 0x00000064
#define SCALER6_DISP1_DL 0x00000068
#define SCALER6_DISP1_RUN 0x0000006c
#define SCALER6_DISP2_CTRL0 0x00000070
#define SCALER6_DISP2_CTRL1 0x00000074
#define SCALER6_DISP2_BGND 0x00000078
#define SCALER6_DISP2_LPTRS 0x0000007c
#define SCALER6_DISP2_COB 0x00000080
#define SCALER6_DISP2_STATUS 0x00000084
#define SCALER6_DISP2_DL 0x00000088
#define SCALER6_DISP2_RUN 0x0000008c
#define SCALER6_EOLN 0x00000090
#define SCALER6_DL_STATUS 0x00000094
#define SCALER6_BFG_MISC 0x0000009c
#define SCALER6_QOS0 0x000000a0
#define SCALER6_PROF0 0x000000a4
#define SCALER6_QOS1 0x000000a8
#define SCALER6_PROF1 0x000000ac
#define SCALER6_QOS2 0x000000b0
#define SCALER6_PROF2 0x000000b4
#define SCALER6_PRI_MAP0 0x000000b8
#define SCALER6_PRI_MAP1 0x000000bc
#define SCALER6_HISTCTRL 0x000000c0
#define SCALER6_HISTBIN0 0x000000c4
#define SCALER6_HISTBIN1 0x000000c8
#define SCALER6_HISTBIN2 0x000000cc
#define SCALER6_HISTBIN3 0x000000d0
#define SCALER6_HISTBIN4 0x000000d4
#define SCALER6_HISTBIN5 0x000000d8
#define SCALER6_HISTBIN6 0x000000dc
#define SCALER6_HISTBIN7 0x000000e0
#define SCALER6_HDR_CFG_REMAP 0x000000f4
#define SCALER6_COL_SPACE 0x000000f8
#define SCALER6_HVS_ID 0x000000fc
#define SCALER6_CFC1 0x00000100
#define SCALER6_DISP_UPM_ISO0 0x00000200
#define SCALER6_DISP_UPM_ISO1 0x00000204
#define SCALER6_DISP_UPM_ISO2 0x00000208
#define SCALER6_DISP_LBM_ISO0 0x0000020c
#define SCALER6_DISP_LBM_ISO1 0x00000210
#define SCALER6_DISP_LBM_ISO2 0x00000214
#define SCALER6_DISP_COB_ISO0 0x00000218
#define SCALER6_DISP_COB_ISO1 0x0000021c
#define SCALER6_DISP_COB_ISO2 0x00000220
#define SCALER6_BAD_COB 0x00000224
#define SCALER6_BAD_LBM 0x00000228
#define SCALER6_BAD_UPM 0x0000022c
#define SCALER6_BAD_AXI 0x00000230
# define VC4_HDMI_SW_RESET_FORMAT_DETECT BIT(1)
# define VC4_HDMI_SW_RESET_HDMI BIT(0)
@@ -1115,4 +1239,61 @@ enum hvs_pixel_format {
#define SCALER_PITCH0_TILE_WIDTH_R_MASK VC4_MASK(6, 0)
#define SCALER_PITCH0_TILE_WIDTH_R_SHIFT 0
#define SCALER6_CTL0_END BIT(31)
#define SCALER6_CTL0_VALID BIT(30)
#define SCALER6_CTL0_NEXT_MASK VC4_MASK(29, 24)
#define SCALER6_CTL0_RGB_TRANS BIT(23)
#define SCALER6_CTL0_ADDR_MODE_MASK VC4_MASK(22, 20)
#define SCALER6_CTL0_ADDR_MODE_LINEAR 0
#define SCALER6_CTL0_ADDR_MODE_128B 1
#define SCALER6_CTL0_ADDR_MODE_256B 2
#define SCALER6_CTL0_ADDR_MODE_MAP8 3
#define SCALER6_CTL0_ADDR_MODE_UIF 4
#define SCALER6_CTL0_ALPHA_MASK_MASK VC4_MASK(19, 18)
#define SCALER6_CTL0_UNITY BIT(15)
#define SCALER6_CTL0_ORDERRGBA_MASK VC4_MASK(14, 13)
#define SCALER6_CTL0_SCL1_MODE_MASK VC4_MASK(10, 8)
#define SCALER6_CTL0_SCL0_MODE_MASK VC4_MASK(7, 5)
#define SCALER6_CTL0_PIXEL_FORMAT_MASK VC4_MASK(4, 0)
#define SCALER6_POS0_START_Y_MASK VC4_MASK(28, 16)
#define SCALER6_POS0_HFLIP BIT(15)
#define SCALER6_POS0_START_X_MASK VC4_MASK(12, 0)
#define SCALER6_CTL2_ALPHA_MODE_MASK VC4_MASK(31, 30)
#define SCALER6_CTL2_ALPHA_PREMULT BIT(29)
#define SCALER6_CTL2_ALPHA_MIX BIT(28)
#define SCALER6_CTL2_BFG BIT(26)
#define SCALER6_CTL2_CSC_ENABLE BIT(25)
#define SCALER6_CTL2_BRCM_CFC_CONTROL_MASK VC4_MASK(18, 16)
#define SCALER6_CTL2_ALPHA_MASK VC4_MASK(15, 4)
#define SCALER6_POS1_SCL_LINES_MASK VC4_MASK(28, 16)
#define SCALER6_POS1_SCL_WIDTH_MASK VC4_MASK(12, 0)
#define SCALER6_POS2_SRC_LINES_MASK VC4_MASK(28, 16)
#define SCALER6_POS2_SRC_WIDTH_MASK VC4_MASK(12, 0)
#define SCALER6_PTR0_VFLIP BIT(31)
#define SCALER6_PTR0_UPM_BASE_MASK VC4_MASK(28, 16)
#define SCALER6_PTR0_UPM_HANDLE_MASK VC4_MASK(14, 10)
#define SCALER6_PTR0_UPM_BUFF_SIZE_MASK VC4_MASK(9, 8)
#define SCALER6_PTR0_UPM_BUFF_SIZE_16_LINES 3
#define SCALER6_PTR0_UPM_BUFF_SIZE_8_LINES 2
#define SCALER6_PTR0_UPM_BUFF_SIZE_4_LINES 1
#define SCALER6_PTR0_UPM_BUFF_SIZE_2_LINES 0
#define SCALER6_PTR0_UPPER_ADDR_MASK VC4_MASK(7, 0)
#define SCALER6_PTR2_ALPHA_BPP_MASK VC4_MASK(31, 31)
#define SCALER6_PTR2_ALPHA_BPP_1BPP 1
#define SCALER6_PTR2_ALPHA_BPP_8BPP 0
#define SCALER6_PTR2_ALPHA_ORDER_MASK VC4_MASK(30, 30)
#define SCALER6_PTR2_ALPHA_ORDER_MSB_TO_LSB 1
#define SCALER6_PTR2_ALPHA_ORDER_LSB_TO_MSB 0
#define SCALER6_PTR2_ALPHA_OFFS_MASK VC4_MASK(29, 27)
#define SCALER6_PTR2_LSKIP_MASK VC4_MASK(26, 24)
#define SCALER6_PTR2_PITCH_MASK VC4_MASK(16, 0)
#define SCALER6_PTR2_FETCH_COUNT_MASK VC4_MASK(26, 16)
#endif /* VC4_REGS_H */