]> Git Repo - linux.git/commitdiff
Merge tag 'drm-vc4-fixes-2016-03-03' of github.com:anholt/linux into drm-next
authorDave Airlie <[email protected]>
Sun, 13 Mar 2016 23:48:04 +0000 (09:48 +1000)
committerDave Airlie <[email protected]>
Sun, 13 Mar 2016 23:48:04 +0000 (09:48 +1000)
This pull request fixes the major VC4 HDMI modesetting bugs found when
the first wave of users showed up in Raspbian.

* tag 'drm-vc4-fixes-2016-03-03' of github.com:anholt/linux:
  drm/vc4: Initialize scaler DISPBKGND on modeset.
  drm/vc4: Fix setting of vertical timings in the CRTC.
  drm/vc4: Fix the name of the VSYNCD_EVEN register.
  drm/vc4: Add another reg to HDMI debug dumping.
  drm/vc4: Bring HDMI up from power off if necessary.
  drm/vc4: Fix a framebuffer reference leak on async flip interrupt.

1  2 
drivers/gpu/drm/vc4/vc4_crtc.c
drivers/gpu/drm/vc4/vc4_regs.h

index 619dc781c5170af45cc4d1bab3b0f44b7ccfae39,6ae5abcabe62ae48d583cfbf3380b78460d7393e..355ee4b091b3542d6b51c33702c043179571dbba
@@@ -49,27 -49,22 +49,27 @@@ struct vc4_crtc 
        /* Which HVS channel we're using for our CRTC. */
        int channel;
  
 -      /* Pointer to the actual hardware display list memory for the
 -       * crtc.
 -       */
 -      u32 __iomem *dlist;
 -
 -      u32 dlist_size; /* in dwords */
 -
        struct drm_pending_vblank_event *event;
  };
  
 +struct vc4_crtc_state {
 +      struct drm_crtc_state base;
 +      /* Dlist area for this CRTC configuration. */
 +      struct drm_mm_node mm;
 +};
 +
  static inline struct vc4_crtc *
  to_vc4_crtc(struct drm_crtc *crtc)
  {
        return (struct vc4_crtc *)crtc;
  }
  
 +static inline struct vc4_crtc_state *
 +to_vc4_crtc_state(struct drm_crtc_state *crtc_state)
 +{
 +      return (struct vc4_crtc_state *)crtc_state;
 +}
 +
  struct vc4_crtc_data {
        /* Which channel of the HVS this pixelvalve sources from. */
        int hvs_channel;
@@@ -88,7 -83,7 +88,7 @@@ static const struct 
  } crtc_regs[] = {
        CRTC_REG(PV_CONTROL),
        CRTC_REG(PV_V_CONTROL),
-       CRTC_REG(PV_VSYNCD),
+       CRTC_REG(PV_VSYNCD_EVEN),
        CRTC_REG(PV_HORZA),
        CRTC_REG(PV_HORZB),
        CRTC_REG(PV_VERTA),
@@@ -188,6 -183,8 +188,8 @@@ static int vc4_get_clock_select(struct 
  
  static void vc4_crtc_mode_set_nofb(struct drm_crtc *crtc)
  {
+       struct drm_device *dev = crtc->dev;
+       struct vc4_dev *vc4 = to_vc4_dev(dev);
        struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
        struct drm_crtc_state *state = crtc->state;
        struct drm_display_mode *mode = &state->adjusted_mode;
                                 PV_HORZB_HFP) |
                   VC4_SET_FIELD(mode->hdisplay, PV_HORZB_HACTIVE));
  
+       CRTC_WRITE(PV_VERTA,
+                  VC4_SET_FIELD(mode->vtotal - mode->vsync_end,
+                                PV_VERTA_VBP) |
+                  VC4_SET_FIELD(mode->vsync_end - mode->vsync_start,
+                                PV_VERTA_VSYNC));
+       CRTC_WRITE(PV_VERTB,
+                  VC4_SET_FIELD(mode->vsync_start - mode->vdisplay,
+                                PV_VERTB_VFP) |
+                  VC4_SET_FIELD(vactive, PV_VERTB_VACTIVE));
        if (interlace) {
                CRTC_WRITE(PV_VERTA_EVEN,
                           VC4_SET_FIELD(mode->vtotal - mode->vsync_end - 1,
                   PV_CONTROL_FIFO_CLR |
                   PV_CONTROL_EN);
  
+       HVS_WRITE(SCALER_DISPBKGNDX(vc4_crtc->channel),
+                 SCALER_DISPBKGND_AUTOHS |
+                 (interlace ? SCALER_DISPBKGND_INTERLACE : 0));
        if (debug_dump_regs) {
                DRM_INFO("CRTC %d regs after:\n", drm_crtc_index(crtc));
                vc4_crtc_dump_regs(vc4_crtc);
@@@ -324,13 -335,11 +340,13 @@@ static void vc4_crtc_enable(struct drm_
  static int vc4_crtc_atomic_check(struct drm_crtc *crtc,
                                 struct drm_crtc_state *state)
  {
 +      struct vc4_crtc_state *vc4_state = to_vc4_crtc_state(state);
        struct drm_device *dev = crtc->dev;
        struct vc4_dev *vc4 = to_vc4_dev(dev);
        struct drm_plane *plane;
 -      struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
 +      unsigned long flags;
        u32 dlist_count = 0;
 +      int ret;
  
        /* The pixelvalve can only feed one encoder (and encoders are
         * 1:1 with connectors.)
  
        dlist_count++; /* Account for SCALER_CTL0_END. */
  
 -      if (!vc4_crtc->dlist || dlist_count > vc4_crtc->dlist_size) {
 -              vc4_crtc->dlist = ((u32 __iomem *)vc4->hvs->dlist +
 -                                 HVS_BOOTLOADER_DLIST_END);
 -              vc4_crtc->dlist_size = ((SCALER_DLIST_SIZE >> 2) -
 -                                      HVS_BOOTLOADER_DLIST_END);
 -
 -              if (dlist_count > vc4_crtc->dlist_size) {
 -                      DRM_DEBUG_KMS("dlist too large for CRTC (%d > %d).\n",
 -                                    dlist_count, vc4_crtc->dlist_size);
 -                      return -EINVAL;
 -              }
 -      }
 +      spin_lock_irqsave(&vc4->hvs->mm_lock, flags);
 +      ret = drm_mm_insert_node(&vc4->hvs->dlist_mm, &vc4_state->mm,
 +                               dlist_count, 1, 0);
 +      spin_unlock_irqrestore(&vc4->hvs->mm_lock, flags);
 +      if (ret)
 +              return ret;
  
        return 0;
  }
@@@ -369,29 -384,47 +385,29 @@@ static void vc4_crtc_atomic_flush(struc
        struct drm_device *dev = crtc->dev;
        struct vc4_dev *vc4 = to_vc4_dev(dev);
        struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
 +      struct vc4_crtc_state *vc4_state = to_vc4_crtc_state(crtc->state);
        struct drm_plane *plane;
        bool debug_dump_regs = false;
 -      u32 __iomem *dlist_next = vc4_crtc->dlist;
 +      u32 __iomem *dlist_start = vc4->hvs->dlist + vc4_state->mm.start;
 +      u32 __iomem *dlist_next = dlist_start;
  
        if (debug_dump_regs) {
                DRM_INFO("CRTC %d HVS before:\n", drm_crtc_index(crtc));
                vc4_hvs_dump_state(dev);
        }
  
 -      /* Copy all the active planes' dlist contents to the hardware dlist.
 -       *
 -       * XXX: If the new display list was large enough that it
 -       * overlapped a currently-read display list, we need to do
 -       * something like disable scanout before putting in the new
 -       * list.  For now, we're safe because we only have the two
 -       * planes.
 -       */
 +      /* Copy all the active planes' dlist contents to the hardware dlist. */
        drm_atomic_crtc_for_each_plane(plane, crtc) {
                dlist_next += vc4_plane_write_dlist(plane, dlist_next);
        }
  
 -      if (dlist_next == vc4_crtc->dlist) {
 -              /* If no planes were enabled, use the SCALER_CTL0_END
 -               * at the start of the display list memory (in the
 -               * bootloader section).  We'll rewrite that
 -               * SCALER_CTL0_END, just in case, though.
 -               */
 -              writel(SCALER_CTL0_END, vc4->hvs->dlist);
 -              HVS_WRITE(SCALER_DISPLISTX(vc4_crtc->channel), 0);
 -      } else {
 -              writel(SCALER_CTL0_END, dlist_next);
 -              dlist_next++;
 -
 -              HVS_WRITE(SCALER_DISPLISTX(vc4_crtc->channel),
 -                        (u32 __iomem *)vc4_crtc->dlist -
 -                        (u32 __iomem *)vc4->hvs->dlist);
 -
 -              /* Make the next display list start after ours. */
 -              vc4_crtc->dlist_size -= (dlist_next - vc4_crtc->dlist);
 -              vc4_crtc->dlist = dlist_next;
 -      }
 +      writel(SCALER_CTL0_END, dlist_next);
 +      dlist_next++;
 +
 +      WARN_ON_ONCE(dlist_next - dlist_start != vc4_state->mm.size);
 +
 +      HVS_WRITE(SCALER_DISPLISTX(vc4_crtc->channel),
 +                vc4_state->mm.start);
  
        if (debug_dump_regs) {
                DRM_INFO("CRTC %d HVS after:\n", drm_crtc_index(crtc));
@@@ -527,6 -560,7 +543,7 @@@ static int vc4_async_page_flip(struct d
        /* Make sure all other async modesetes have landed. */
        ret = down_interruptible(&vc4->async_modeset);
        if (ret) {
+               drm_framebuffer_unreference(fb);
                kfree(flip_state);
                return ret;
        }
@@@ -556,36 -590,6 +573,36 @@@ static int vc4_page_flip(struct drm_crt
                return drm_atomic_helper_page_flip(crtc, fb, event, flags);
  }
  
 +static struct drm_crtc_state *vc4_crtc_duplicate_state(struct drm_crtc *crtc)
 +{
 +      struct vc4_crtc_state *vc4_state;
 +
 +      vc4_state = kzalloc(sizeof(*vc4_state), GFP_KERNEL);
 +      if (!vc4_state)
 +              return NULL;
 +
 +      __drm_atomic_helper_crtc_duplicate_state(crtc, &vc4_state->base);
 +      return &vc4_state->base;
 +}
 +
 +static void vc4_crtc_destroy_state(struct drm_crtc *crtc,
 +                                 struct drm_crtc_state *state)
 +{
 +      struct vc4_dev *vc4 = to_vc4_dev(crtc->dev);
 +      struct vc4_crtc_state *vc4_state = to_vc4_crtc_state(state);
 +
 +      if (vc4_state->mm.allocated) {
 +              unsigned long flags;
 +
 +              spin_lock_irqsave(&vc4->hvs->mm_lock, flags);
 +              drm_mm_remove_node(&vc4_state->mm);
 +              spin_unlock_irqrestore(&vc4->hvs->mm_lock, flags);
 +
 +      }
 +
 +      __drm_atomic_helper_crtc_destroy_state(crtc, state);
 +}
 +
  static const struct drm_crtc_funcs vc4_crtc_funcs = {
        .set_config = drm_atomic_helper_set_config,
        .destroy = vc4_crtc_destroy,
        .cursor_set = NULL, /* handled by drm_mode_cursor_universal */
        .cursor_move = NULL, /* handled by drm_mode_cursor_universal */
        .reset = drm_atomic_helper_crtc_reset,
 -      .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
 -      .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
 +      .atomic_duplicate_state = vc4_crtc_duplicate_state,
 +      .atomic_destroy_state = vc4_crtc_destroy_state,
  };
  
  static const struct drm_crtc_helper_funcs vc4_crtc_helper_funcs = {
        .atomic_flush = vc4_crtc_atomic_flush,
  };
  
 -/* Frees the page flip event when the DRM device is closed with the
 - * event still outstanding.
 - */
 -void vc4_cancel_page_flip(struct drm_crtc *crtc, struct drm_file *file)
 -{
 -      struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
 -      struct drm_device *dev = crtc->dev;
 -      unsigned long flags;
 -
 -      spin_lock_irqsave(&dev->event_lock, flags);
 -
 -      if (vc4_crtc->event && vc4_crtc->event->base.file_priv == file) {
 -              vc4_crtc->event->base.destroy(&vc4_crtc->event->base);
 -              drm_crtc_vblank_put(crtc);
 -              vc4_crtc->event = NULL;
 -      }
 -
 -      spin_unlock_irqrestore(&dev->event_lock, flags);
 -}
 -
  static const struct vc4_crtc_data pv0_data = {
        .hvs_channel = 0,
        .encoder0_type = VC4_ENCODER_TYPE_DSI0,
@@@ -657,9 -681,9 +674,9 @@@ static int vc4_crtc_bind(struct device 
        struct vc4_dev *vc4 = to_vc4_dev(drm);
        struct vc4_crtc *vc4_crtc;
        struct drm_crtc *crtc;
 -      struct drm_plane *primary_plane, *cursor_plane;
 +      struct drm_plane *primary_plane, *cursor_plane, *destroy_plane, *temp;
        const struct of_device_id *match;
 -      int ret;
 +      int ret, i;
  
        vc4_crtc = devm_kzalloc(dev, sizeof(*vc4_crtc), GFP_KERNEL);
        if (!vc4_crtc)
                goto err;
        }
  
 -      cursor_plane = vc4_plane_init(drm, DRM_PLANE_TYPE_CURSOR);
 -      if (IS_ERR(cursor_plane)) {
 -              dev_err(dev, "failed to construct cursor plane\n");
 -              ret = PTR_ERR(cursor_plane);
 -              goto err_primary;
 -      }
 -
 -      drm_crtc_init_with_planes(drm, crtc, primary_plane, cursor_plane,
 +      drm_crtc_init_with_planes(drm, crtc, primary_plane, NULL,
                                  &vc4_crtc_funcs, NULL);
        drm_crtc_helper_add(crtc, &vc4_crtc_helper_funcs);
        primary_plane->crtc = crtc;
 -      cursor_plane->crtc = crtc;
        vc4->crtc[drm_crtc_index(crtc)] = vc4_crtc;
        vc4_crtc->channel = vc4_crtc->data->hvs_channel;
  
 +      /* Set up some arbitrary number of planes.  We're not limited
 +       * by a set number of physical registers, just the space in
 +       * the HVS (16k) and how small an plane can be (28 bytes).
 +       * However, each plane we set up takes up some memory, and
 +       * increases the cost of looping over planes, which atomic
 +       * modesetting does quite a bit.  As a result, we pick a
 +       * modest number of planes to expose, that should hopefully
 +       * still cover any sane usecase.
 +       */
 +      for (i = 0; i < 8; i++) {
 +              struct drm_plane *plane =
 +                      vc4_plane_init(drm, DRM_PLANE_TYPE_OVERLAY);
 +
 +              if (IS_ERR(plane))
 +                      continue;
 +
 +              plane->possible_crtcs = 1 << drm_crtc_index(crtc);
 +      }
 +
 +      /* Set up the legacy cursor after overlay initialization,
 +       * since we overlay planes on the CRTC in the order they were
 +       * initialized.
 +       */
 +      cursor_plane = vc4_plane_init(drm, DRM_PLANE_TYPE_CURSOR);
 +      if (!IS_ERR(cursor_plane)) {
 +              cursor_plane->possible_crtcs = 1 << drm_crtc_index(crtc);
 +              cursor_plane->crtc = crtc;
 +              crtc->cursor = cursor_plane;
 +      }
 +
        CRTC_WRITE(PV_INTEN, 0);
        CRTC_WRITE(PV_INTSTAT, PV_INT_VFP_START);
        ret = devm_request_irq(dev, platform_get_irq(pdev, 0),
                               vc4_crtc_irq_handler, 0, "vc4 crtc", vc4_crtc);
        if (ret)
 -              goto err_cursor;
 +              goto err_destroy_planes;
  
        vc4_set_crtc_possible_masks(drm, crtc);
  
  
        return 0;
  
 -err_cursor:
 -      cursor_plane->funcs->destroy(cursor_plane);
 -err_primary:
 -      primary_plane->funcs->destroy(primary_plane);
 +err_destroy_planes:
 +      list_for_each_entry_safe(destroy_plane, temp,
 +                               &drm->mode_config.plane_list, head) {
 +              if (destroy_plane->possible_crtcs == 1 << drm_crtc_index(crtc))
 +                  destroy_plane->funcs->destroy(destroy_plane);
 +      }
  err:
        return ret;
  }
index 25df20ef939c55c273c31fa73bb3f146f4f51c55,7c29993a3316f1c8d53a16709d242ba04efb356a..bf42a8e87111f2e5fd3108209d0a3dc9ad3e871f
  # define PV_VCONTROL_CONTINUOUS                       BIT(1)
  # define PV_VCONTROL_VIDEN                    BIT(0)
  
- #define PV_VSYNCD                             0x08
+ #define PV_VSYNCD_EVEN                                0x08
  
  #define PV_HORZA                              0x0c
  # define PV_HORZA_HBP_MASK                    VC4_MASK(31, 16)
  # define SCALER_DISPCTRLX_HEIGHT_SHIFT                0
  
  #define SCALER_DISPBKGND0                       0x00000044
+ # define SCALER_DISPBKGND_AUTOHS              BIT(31)
+ # define SCALER_DISPBKGND_INTERLACE           BIT(30)
+ # define SCALER_DISPBKGND_GAMMA                       BIT(29)
+ # define SCALER_DISPBKGND_TESTMODE_MASK               VC4_MASK(28, 25)
+ # define SCALER_DISPBKGND_TESTMODE_SHIFT      25
+ /* Enables filling the scaler line with the RGB value in the low 24
+  * bits before compositing.  Costs cycles, so should be skipped if
+  * opaque display planes will cover everything.
+  */
+ # define SCALER_DISPBKGND_FILL                        BIT(24)
  #define SCALER_DISPSTAT0                        0x00000048
  #define SCALER_DISPBASE0                        0x0000004c
  # define SCALER_DISPSTATX_MODE_MASK           VC4_MASK(31, 30)
  # define SCALER_DISPSTATX_EMPTY                       BIT(28)
  #define SCALER_DISPCTRL1                        0x00000050
  #define SCALER_DISPBKGND1                       0x00000054
+ #define SCALER_DISPBKGNDX(x)                  (SCALER_DISPBKGND0 +        \
+                                                (x) * (SCALER_DISPBKGND1 - \
+                                                       SCALER_DISPBKGND0))
  #define SCALER_DISPSTAT1                        0x00000058
  #define SCALER_DISPSTATX(x)                   (SCALER_DISPSTAT0 +        \
                                                 (x) * (SCALER_DISPSTAT1 - \
  #define VC4_HDMI_TX_PHY_RESET_CTL             0x2c0
  
  #define VC4_HD_M_CTL                          0x00c
+ # define VC4_HD_M_REGISTER_FILE_STANDBY               (3 << 6)
+ # define VC4_HD_M_RAM_STANDBY                 (3 << 4)
  # define VC4_HD_M_SW_RST                      BIT(2)
  # define VC4_HD_M_ENABLE                      BIT(0)
  
@@@ -503,12 -519,7 +519,12 @@@ enum hvs_pixel_format 
        HVS_PIXEL_FORMAT_RGB888 = 5,
        HVS_PIXEL_FORMAT_RGBA6666 = 6,
        /* 32bpp */
 -      HVS_PIXEL_FORMAT_RGBA8888 = 7
 +      HVS_PIXEL_FORMAT_RGBA8888 = 7,
 +
 +      HVS_PIXEL_FORMAT_YCBCR_YUV420_3PLANE = 8,
 +      HVS_PIXEL_FORMAT_YCBCR_YUV420_2PLANE = 9,
 +      HVS_PIXEL_FORMAT_YCBCR_YUV422_3PLANE = 10,
 +      HVS_PIXEL_FORMAT_YCBCR_YUV422_2PLANE = 11,
  };
  
  /* Note: the LSB is the rightmost character shown.  Only valid for
  #define SCALER_CTL0_ORDER_MASK                        VC4_MASK(14, 13)
  #define SCALER_CTL0_ORDER_SHIFT                       13
  
 +#define SCALER_CTL0_SCL1_MASK                 VC4_MASK(10, 8)
 +#define SCALER_CTL0_SCL1_SHIFT                        8
 +
 +#define SCALER_CTL0_SCL0_MASK                 VC4_MASK(7, 5)
 +#define SCALER_CTL0_SCL0_SHIFT                        5
 +
 +#define SCALER_CTL0_SCL_H_PPF_V_PPF           0
 +#define SCALER_CTL0_SCL_H_TPZ_V_PPF           1
 +#define SCALER_CTL0_SCL_H_PPF_V_TPZ           2
 +#define SCALER_CTL0_SCL_H_TPZ_V_TPZ           3
 +#define SCALER_CTL0_SCL_H_PPF_V_NONE          4
 +#define SCALER_CTL0_SCL_H_NONE_V_PPF          5
 +#define SCALER_CTL0_SCL_H_NONE_V_TPZ          6
 +#define SCALER_CTL0_SCL_H_TPZ_V_NONE          7
 +
  /* Set to indicate no scaling. */
  #define SCALER_CTL0_UNITY                     BIT(4)
  
  #define SCALER_POS0_START_X_MASK              VC4_MASK(11, 0)
  #define SCALER_POS0_START_X_SHIFT             0
  
 +#define SCALER_POS1_SCL_HEIGHT_MASK           VC4_MASK(27, 16)
 +#define SCALER_POS1_SCL_HEIGHT_SHIFT          16
 +
 +#define SCALER_POS1_SCL_WIDTH_MASK            VC4_MASK(11, 0)
 +#define SCALER_POS1_SCL_WIDTH_SHIFT           0
 +
  #define SCALER_POS2_ALPHA_MODE_MASK           VC4_MASK(31, 30)
  #define SCALER_POS2_ALPHA_MODE_SHIFT          30
  #define SCALER_POS2_ALPHA_MODE_PIPELINE               0
  #define SCALER_POS2_WIDTH_MASK                        VC4_MASK(11, 0)
  #define SCALER_POS2_WIDTH_SHIFT                       0
  
 +/* Color Space Conversion words.  Some values are S2.8 signed
 + * integers, except that the 2 integer bits map as {0x0: 0, 0x1: 1,
 + * 0x2: 2, 0x3: -1}
 + */
 +/* bottom 8 bits of S2.8 contribution of Cr to Blue */
 +#define SCALER_CSC0_COEF_CR_BLU_MASK          VC4_MASK(31, 24)
 +#define SCALER_CSC0_COEF_CR_BLU_SHIFT         24
 +/* Signed offset to apply to Y before CSC. (Y' = Y + YY_OFS) */
 +#define SCALER_CSC0_COEF_YY_OFS_MASK          VC4_MASK(23, 16)
 +#define SCALER_CSC0_COEF_YY_OFS_SHIFT         16
 +/* Signed offset to apply to CB before CSC (Cb' = Cb - 128 + CB_OFS). */
 +#define SCALER_CSC0_COEF_CB_OFS_MASK          VC4_MASK(15, 8)
 +#define SCALER_CSC0_COEF_CB_OFS_SHIFT         8
 +/* Signed offset to apply to CB before CSC (Cr' = Cr - 128 + CR_OFS). */
 +#define SCALER_CSC0_COEF_CR_OFS_MASK          VC4_MASK(7, 0)
 +#define SCALER_CSC0_COEF_CR_OFS_SHIFT         0
 +#define SCALER_CSC0_ITR_R_601_5                       0x00f00000
 +#define SCALER_CSC0_ITR_R_709_3                       0x00f00000
 +#define SCALER_CSC0_JPEG_JFIF                 0x00000000
 +
 +/* S2.8 contribution of Cb to Green */
 +#define SCALER_CSC1_COEF_CB_GRN_MASK          VC4_MASK(31, 22)
 +#define SCALER_CSC1_COEF_CB_GRN_SHIFT         22
 +/* S2.8 contribution of Cr to Green */
 +#define SCALER_CSC1_COEF_CR_GRN_MASK          VC4_MASK(21, 12)
 +#define SCALER_CSC1_COEF_CR_GRN_SHIFT         12
 +/* S2.8 contribution of Y to all of RGB */
 +#define SCALER_CSC1_COEF_YY_ALL_MASK          VC4_MASK(11, 2)
 +#define SCALER_CSC1_COEF_YY_ALL_SHIFT         2
 +/* top 2 bits of S2.8 contribution of Cr to Blue */
 +#define SCALER_CSC1_COEF_CR_BLU_MASK          VC4_MASK(1, 0)
 +#define SCALER_CSC1_COEF_CR_BLU_SHIFT         0
 +#define SCALER_CSC1_ITR_R_601_5                       0xe73304a8
 +#define SCALER_CSC1_ITR_R_709_3                       0xf2b784a8
 +#define SCALER_CSC1_JPEG_JFIF                 0xea34a400
 +
 +/* S2.8 contribution of Cb to Red */
 +#define SCALER_CSC2_COEF_CB_RED_MASK          VC4_MASK(29, 20)
 +#define SCALER_CSC2_COEF_CB_RED_SHIFT         20
 +/* S2.8 contribution of Cr to Red */
 +#define SCALER_CSC2_COEF_CR_RED_MASK          VC4_MASK(19, 10)
 +#define SCALER_CSC2_COEF_CR_RED_SHIFT         10
 +/* S2.8 contribution of Cb to Blue */
 +#define SCALER_CSC2_COEF_CB_BLU_MASK          VC4_MASK(19, 10)
 +#define SCALER_CSC2_COEF_CB_BLU_SHIFT         10
 +#define SCALER_CSC2_ITR_R_601_5                       0x00066204
 +#define SCALER_CSC2_ITR_R_709_3                       0x00072a1c
 +#define SCALER_CSC2_JPEG_JFIF                 0x000599c5
 +
 +#define SCALER_TPZ0_VERT_RECALC                       BIT(31)
 +#define SCALER_TPZ0_SCALE_MASK                        VC4_MASK(28, 8)
 +#define SCALER_TPZ0_SCALE_SHIFT                       8
 +#define SCALER_TPZ0_IPHASE_MASK                       VC4_MASK(7, 0)
 +#define SCALER_TPZ0_IPHASE_SHIFT              0
 +#define SCALER_TPZ1_RECIP_MASK                        VC4_MASK(15, 0)
 +#define SCALER_TPZ1_RECIP_SHIFT                       0
 +
 +/* Skips interpolating coefficients to 64 phases, so just 8 are used.
 + * Required for nearest neighbor.
 + */
 +#define SCALER_PPF_NOINTERP                   BIT(31)
 +/* Replaes the highest valued coefficient with one that makes all 4
 + * sum to unity.
 + */
 +#define SCALER_PPF_AGC                                BIT(30)
 +#define SCALER_PPF_SCALE_MASK                 VC4_MASK(24, 8)
 +#define SCALER_PPF_SCALE_SHIFT                        8
 +#define SCALER_PPF_IPHASE_MASK                        VC4_MASK(6, 0)
 +#define SCALER_PPF_IPHASE_SHIFT                       0
 +
 +#define SCALER_PPF_KERNEL_OFFSET_MASK         VC4_MASK(13, 0)
 +#define SCALER_PPF_KERNEL_OFFSET_SHIFT                0
 +#define SCALER_PPF_KERNEL_UNCACHED            BIT(31)
 +
  #define SCALER_SRC_PITCH_MASK                 VC4_MASK(15, 0)
  #define SCALER_SRC_PITCH_SHIFT                        0
  
This page took 0.079681 seconds and 4 git commands to generate.