On 2018-03-12 13:30, Sean Paul wrote:
On Fri, Mar 02, 2018 at 04:44:55PM -0800, Jeykumar Sankaran wrote:
On 2018-02-28 11:19, Sean Paul wrote:
> Remove release/output/retire fences from the dpu driver. These are
> already available via drm core's OUT_FENCE property.
>
> Change-Id: Id4238d0b5457f2c8ee2e87bb7814e1850a573623
> Signed-off-by: Sean Paul <seanp...@chromium.org>


Reviewed-by: Jeykumar Sankaran <jsa...@codeaurora.org>

> ---
>  drivers/gpu/drm/msm/disp/dpu1/dpu_connector.c |  66 +------
>  drivers/gpu/drm/msm/disp/dpu1/dpu_connector.h |  23 ---
>  drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c      | 178
+++---------------
>  drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h      |  28 ---
>  drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c   |   3 -
>  drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h   |   4 +-
>  .../gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h  |   8 -
>  .../drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c  |  73 +------
>  .../drm/msm/disp/dpu1/dpu_encoder_phys_vid.c  |  19 --
>  .../drm/msm/disp/dpu1/dpu_encoder_phys_wb.c   |  12 +-
>  drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c       |  30 ---
>  drivers/gpu/drm/msm/msm_drv.h                 |   3 -
>  12 files changed, 36 insertions(+), 411 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_connector.c
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_connector.c
> index 57b8627ef418..cc5bfa862cb7 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_connector.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_connector.c
> @@ -521,7 +521,6 @@ static void dpu_connector_destroy(struct
> drm_connector
> *connector)
>            backlight_device_unregister(c_conn->bl_device);
>    drm_connector_unregister(connector);
>    mutex_destroy(&c_conn->lock);
> -  dpu_fence_deinit(&c_conn->retire_fence);
>    drm_connector_cleanup(connector);
>    kfree(c_conn);
>  }
> @@ -906,12 +905,9 @@ static int
dpu_connector_atomic_get_property(struct
> drm_connector *connector,
>    c_state = to_dpu_connector_state(state);
>
>    idx = msm_property_index(&c_conn->property_info, property);
> -  if (idx == CONNECTOR_PROP_RETIRE_FENCE)
> -          rc = dpu_fence_create(&c_conn->retire_fence, val, 0);
> -  else
> -          /* get cached property value */
> -          rc = msm_property_atomic_get(&c_conn->property_info,
> -                          &c_state->property_state, property, val);
> +  /* get cached property value */
> +  rc = msm_property_atomic_get(&c_conn->property_info,
> +                  &c_state->property_state, property, val);
>
>    /* allow for custom override */
>    if (c_conn->ops.get_property)
> @@ -923,39 +919,6 @@ static int
dpu_connector_atomic_get_property(struct
> drm_connector *connector,
>    return rc;
>  }
>
> -void dpu_connector_prepare_fence(struct drm_connector *connector)
> -{
> -  if (!connector) {
> -          DPU_ERROR("invalid connector\n");
> -          return;
> -  }
> -
> -  dpu_fence_prepare(&to_dpu_connector(connector)->retire_fence);
> -}
> -
> -void dpu_connector_complete_commit(struct drm_connector *connector,
> -          ktime_t ts)
> -{
> -  if (!connector) {
> -          DPU_ERROR("invalid connector\n");
> -          return;
> -  }
> -
> -  /* signal connector's retire fence */
> -  dpu_fence_signal(&to_dpu_connector(connector)->retire_fence, ts,
> false);
> -}
> -
> -void dpu_connector_commit_reset(struct drm_connector *connector,
> ktime_t
> ts)
> -{
> -  if (!connector) {
> -          DPU_ERROR("invalid connector\n");
> -          return;
> -  }
> -
> -  /* signal connector's retire fence */
> -  dpu_fence_signal(&to_dpu_connector(connector)->retire_fence, ts,
> true);
> -}
> -
>  static enum drm_connector_status
>  dpu_connector_detect(struct drm_connector *connector, bool force)
>  {
> @@ -1214,26 +1177,19 @@ struct drm_connector
*dpu_connector_init(struct
> drm_device *dev,
>                    "conn%u",
>                    c_conn->base.base.id);
>
> -  rc = dpu_fence_init(&c_conn->retire_fence, c_conn->name,
> -                  c_conn->base.base.id);
> -  if (rc) {
> -          DPU_ERROR("failed to init fence, %d\n", rc);
> -          goto error_cleanup_conn;
> -  }
> -
>    mutex_init(&c_conn->lock);
>
>    rc = drm_mode_connector_attach_encoder(&c_conn->base, encoder);
>    if (rc) {
>            DPU_ERROR("failed to attach encoder to connector, %d\n",
> rc);
> -          goto error_cleanup_fence;
> +          goto error_cleanup_conn;
>    }
>
>  #ifdef CONFIG_DRM_MSM_DSI_STAGING
>    rc = dpu_backlight_setup(c_conn, dev);
>    if (rc) {
>            DPU_ERROR("failed to setup backlight, rc=%d\n", rc);
> -          goto error_cleanup_fence;
> +          goto error_cleanup_conn;
>    }
>  #endif
>
> @@ -1248,7 +1204,7 @@ struct drm_connector *dpu_connector_init(struct
> drm_device *dev,
>            if (!info) {
>                    DPU_ERROR("failed to allocate info buffer\n");
>                    rc = -ENOMEM;
> -                  goto error_cleanup_fence;
> +                  goto error_cleanup_conn;
>            }
>
>            dpu_kms_info_reset(info);
> @@ -1256,7 +1212,7 @@ struct drm_connector *dpu_connector_init(struct
> drm_device *dev,
>            if (rc) {
>                    DPU_ERROR("post-init failed, %d\n", rc);
>                    kfree(info);
> -                  goto error_cleanup_fence;
> +                  goto error_cleanup_conn;
>            }
>
>            msm_property_install_blob(&c_conn->property_info,
> @@ -1310,10 +1266,6 @@ struct drm_connector *dpu_connector_init(struct
> drm_device *dev,
>                            &c_conn->property_info, "dpu_drm_roi_v1",
> 0x0,
>                            0, ~0, 0, CONNECTOR_PROP_ROI_V1);
>    }
> -
> -  msm_property_install_range(&c_conn->property_info, "RETIRE_FENCE",
> -                  0x0, 0, INR_OPEN_MAX, 0,
> CONNECTOR_PROP_RETIRE_FENCE);
> -
>    msm_property_install_range(&c_conn->property_info, "autorefresh",
>                    0x0, 0, AUTOREFRESH_MAX_FRAME_CNT, 0,
>                    CONNECTOR_PROP_AUTOREFRESH);
> @@ -1354,10 +1306,8 @@ struct drm_connector *dpu_connector_init(struct
> drm_device *dev,
>            drm_property_blob_put(c_conn->blob_dither);
>
>    msm_property_destroy(&c_conn->property_info);
> -error_cleanup_fence:
> -  mutex_destroy(&c_conn->lock);
> -  dpu_fence_deinit(&c_conn->retire_fence);
>  error_cleanup_conn:
> +  mutex_destroy(&c_conn->lock);
>    drm_connector_cleanup(&c_conn->base);
>  error_free_conn:
>    kfree(c_conn);
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_connector.h
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_connector.h
> index f6f4837d1359..fdb4d8766549 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_connector.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_connector.h
> @@ -21,7 +21,6 @@
>  #include "msm_drv.h"
>  #include "msm_prop.h"
>  #include "dpu_kms.h"
> -#include "dpu_fence.h"
>
>  #define DPU_CONNECTOR_NAME_SIZE   16
>
> @@ -247,7 +246,6 @@ struct dpu_connector_evt {
>   * @mmu_unsecure: MMU id for unsecure buffers
>   * @name: ASCII name of connector
>   * @lock: Mutex lock object for this structure
> - * @retire_fence: Retire fence context reference
>   * @ops: Local callback function pointer table
>   * @dpms_mode: DPMS property setting from user space
>   * @lp_mode: LP property setting from user space
> @@ -274,7 +272,6 @@ struct dpu_connector {
>    char name[DPU_CONNECTOR_NAME_SIZE];
>
>    struct mutex lock;
> -  struct dpu_fence_context retire_fence;
>    struct dpu_connector_ops ops;
>    int dpms_mode;
>    int lp_mode;
> @@ -447,26 +444,6 @@ struct drm_connector *dpu_connector_init(struct
> drm_device *dev,
>            int connector_poll,
>            int connector_type);
>
> -/**
> - * dpu_connector_prepare_fence - prepare fence support for current
> commit
> - * @connector: Pointer to drm connector object
> - */
> -void dpu_connector_prepare_fence(struct drm_connector *connector);
> -
> -/**
> - * dpu_connector_complete_commit - signal completion of current
commit
> - * @connector: Pointer to drm connector object
> - * @ts: timestamp to be updated in the fence signalling
> - */
> -void dpu_connector_complete_commit(struct drm_connector *connector,
> ktime_t ts);
> -
> -/**
> - * dpu_connector_commit_reset - reset the completion signal
> - * @connector: Pointer to drm connector object
> - * @ts: timestamp to be updated in the fence signalling
> - */
> -void dpu_connector_commit_reset(struct drm_connector *connector,
> ktime_t
> ts);
> -
>  /**
>   * dpu_connector_get_info - query display specific information
>   * @connector: Pointer to drm connector object
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> index a261021e5deb..2d44989ade7a 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> @@ -629,7 +629,6 @@ static void dpu_crtc_destroy(struct drm_crtc
*crtc)
>    dpu_cp_crtc_destroy_properties(crtc);
>    _dpu_crtc_destroy_dest_scaler(dpu_crtc);
>
> -  dpu_fence_deinit(&dpu_crtc->output_fence);
>    _dpu_crtc_deinit_events(dpu_crtc);
>
>    drm_crtc_cleanup(crtc);
> @@ -1671,65 +1670,6 @@ static void _dpu_crtc_dest_scaler_setup(struct
> drm_crtc *crtc)
>    }
>  }
>
> -void dpu_crtc_prepare_commit(struct drm_crtc *crtc,
> -          struct drm_crtc_state *old_state)
> -{
> -  struct drm_device *dev;
> -  struct dpu_crtc *dpu_crtc;
> -  struct dpu_crtc_state *cstate;
> -  struct drm_connector *conn;
> -  struct drm_connector_list_iter conn_iter;
> -  struct dpu_crtc_retire_event *retire_event = NULL;
> -  unsigned long flags;
> -  int i;
> -
> -  if (!crtc || !crtc->state) {
> -          DPU_ERROR("invalid crtc\n");
> -          return;
> -  }
> -
> -  dev = crtc->dev;
> -  dpu_crtc = to_dpu_crtc(crtc);
> -  cstate = to_dpu_crtc_state(crtc->state);
> -  DPU_EVT32_VERBOSE(DRMID(crtc));
> -
> -  /* identify connectors attached to this crtc */
> -  cstate->num_connectors = 0;
> -
> -  drm_connector_list_iter_begin(dev, &conn_iter);
> -  drm_for_each_connector_iter(conn, &conn_iter)
> -          if (conn->state && conn->state->crtc == crtc &&
> -                          cstate->num_connectors < MAX_CONNECTORS) {
> -                  cstate->connectors[cstate->num_connectors++] =
> conn;
> -                  dpu_connector_prepare_fence(conn);
> -          }
> -  drm_connector_list_iter_end(&conn_iter);
> -
> -  for (i = 0; i < DPU_CRTC_FRAME_EVENT_SIZE; i++) {
> -          retire_event = &dpu_crtc->retire_events[i];
> -          if (list_empty(&retire_event->list))
> -                  break;
> -          retire_event = NULL;
> -  }
> -
> -  if (retire_event) {
> -          retire_event->num_connectors = cstate->num_connectors;
> -          for (i = 0; i < cstate->num_connectors; i++)
> -                  retire_event->connectors[i] =
> cstate->connectors[i];
> -
> -          spin_lock_irqsave(&dpu_crtc->spin_lock, flags);
> -          list_add_tail(&retire_event->list,
> -
> &dpu_crtc->retire_event_list);
> -          spin_unlock_irqrestore(&dpu_crtc->spin_lock, flags);
> -  } else {
> -          DPU_ERROR("crtc%d retire event overflow\n",
> crtc->base.id);
> -          DPU_EVT32(DRMID(crtc), DPU_EVTLOG_ERROR);
> -  }
> -
> -  /* prepare main output fence */
> -  dpu_fence_prepare(&dpu_crtc->output_fence);
> -}
> -
>  /**
>   *  _dpu_crtc_complete_flip - signal pending page_flip events
>   * Any pending vblank events are added to the vblank_event_list
> @@ -1799,41 +1739,6 @@ static void dpu_crtc_vblank_cb(void *data)
>    DPU_EVT32_VERBOSE(DRMID(crtc));
>  }
>
> -static void _dpu_crtc_retire_event(struct drm_crtc *crtc, ktime_t ts)
> -{
> -  struct dpu_crtc_retire_event *retire_event;
> -  struct dpu_crtc *dpu_crtc;
> -  unsigned long flags;
> -  int i;
> -
> -  if (!crtc) {
> -          DPU_ERROR("invalid param\n");
> -          return;
> -  }
> -
> -  dpu_crtc = to_dpu_crtc(crtc);
> -  spin_lock_irqsave(&dpu_crtc->spin_lock, flags);
> -  retire_event =
> list_first_entry_or_null(&dpu_crtc->retire_event_list,
> -                          struct dpu_crtc_retire_event, list);
> -  if (retire_event)
> -          list_del_init(&retire_event->list);
> -  spin_unlock_irqrestore(&dpu_crtc->spin_lock, flags);
> -
> -  if (!retire_event) {
> -          DPU_ERROR("crtc%d retire event without kickoff\n",
> -
> crtc->base.id);
> -          DPU_EVT32(DRMID(crtc), DPU_EVTLOG_ERROR);
> -          return;
> -  }
> -
> -  DPU_ATRACE_BEGIN("signal_retire_fence");
> -  for (i = 0; (i < retire_event->num_connectors) &&
> -                                  retire_event->connectors[i]; ++i)
> -          dpu_connector_complete_commit(
> -                                  retire_event->connectors[i], ts);
> -  DPU_ATRACE_END("signal_retire_fence");
> -}
> -
>  /* _dpu_crtc_idle_notify - signal idle timeout to client */
>  static void _dpu_crtc_idle_notify(struct dpu_crtc *dpu_crtc)
>  {
> @@ -1945,16 +1850,6 @@ static void dpu_crtc_frame_event_work(struct
> kthread_work *work)
>                    frame_done = true;
>    }
>
> -  if (fevent->event & DPU_ENCODER_FRAME_EVENT_SIGNAL_RELEASE_FENCE)
> {
> -          DPU_ATRACE_BEGIN("signal_release_fence");
> -          dpu_fence_signal(&dpu_crtc->output_fence, fevent->ts,
> false);
> -          DPU_ATRACE_END("signal_release_fence");
> -  }
> -
> -  if (fevent->event & DPU_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE)
> -          /* this api should be called without spin_lock */
> -          _dpu_crtc_retire_event(crtc, fevent->ts);
> -
>    if (fevent->event & DPU_ENCODER_FRAME_EVENT_PANEL_DEAD)
>            DPU_ERROR("crtc%d ts:%lld received panel dead event\n",
>                            crtc->base.id, ktime_to_ns(fevent->ts));
> @@ -1971,11 +1866,11 @@ static void dpu_crtc_frame_event_work(struct
> kthread_work *work)
>  /*
>   * dpu_crtc_frame_event_cb - crtc frame event callback API. CRTC
module
>   * registers this API to encoder for all frame event callbacks like
> - * release_fence, retire_fence, frame_error, frame_done,
idle_timeout,
> - * etc. Encoder may call different events from different context -
IRQ,
> - * user thread, commit_thread, etc. Each event should be carefully
> - * reviewed and should be processed in proper task context to avoid
> scheduling
> - * delay or properly manage the irq context's bottom half processing.
> + * frame_error, frame_done, idle_timeout, etc. Encoder may call
> different
> events
> + * from different context - IRQ, user thread, commit_thread, etc.
Each
> event
> + * should be carefully reviewed and should be processed in proper
task
> context
> + * to avoid schedulin delay or properly manage the irq context's
bottom
> half
> + * processing.
>   */
>  static void dpu_crtc_frame_event_cb(void *data, u32 event)
>  {
> @@ -3484,14 +3379,6 @@ static void dpu_crtc_disable(struct drm_crtc
> *crtc)
>            dpu_power_handle_unregister_event(&priv->phandle,
>                            dpu_crtc->power_event);
>
> -  /**
> -   * All callbacks are unregistered and frame done waits are
> complete
> -   * at this point. No buffers are accessed by hardware.
> -   * reset the fence timeline if there is any issue.
> -   */
> -  dpu_fence_signal(&dpu_crtc->output_fence, ktime_get(), true);
> -  for (i = 0; i < cstate->num_connectors; ++i)
> -          dpu_connector_commit_reset(cstate->connectors[i],
> ktime_get());
>
>    memset(dpu_crtc->mixers, 0, sizeof(dpu_crtc->mixers));
>    dpu_crtc->num_mixers = 0;
> @@ -3703,6 +3590,8 @@ static int dpu_crtc_atomic_check(struct drm_crtc
> *crtc,
>    int multirect_count = 0;
>    const struct drm_plane_state *pipe_staged[SSPP_MAX];
>    int left_zpos_cnt = 0, right_zpos_cnt = 0;
> +  struct drm_connector_list_iter conn_iter;
> +  struct drm_connector *conn;
>
>    if (!crtc) {
>            DPU_ERROR("invalid crtc\n");
> @@ -3956,6 +3845,16 @@ static int dpu_crtc_atomic_check(struct
drm_crtc
> *crtc,
>            goto end;
>    }
>
> +  /* identify connectors attached to this crtc */
> +  cstate->num_connectors = 0;
> +  drm_connector_list_iter_begin(crtc->dev, &conn_iter);
> +  drm_for_each_connector_iter(conn, &conn_iter)
> +          if (conn->state && conn->state->crtc == crtc &&
> +                          cstate->num_connectors < MAX_CONNECTORS) {
> +                  cstate->connectors[cstate->num_connectors++] =
> conn;
> +          }
> +  drm_connector_list_iter_end(&conn_iter);
> +

Is this hunk related to this change?


This code came from dpu_crtc_prepare_commit. We use cstate->num_connectors
elsewhere, so it needed to be preserved.

Sean

>  end:
>    _dpu_crtc_rp_free_unused(&cstate->rp);
>    return rc;
> @@ -4034,13 +3933,6 @@ static void dpu_crtc_install_properties(struct
> drm_crtc *crtc,
>            "input_fence_timeout", 0x0, 0,
> DPU_CRTC_MAX_INPUT_FENCE_TIMEOUT,
>            DPU_CRTC_INPUT_FENCE_TIMEOUT,
> CRTC_PROP_INPUT_FENCE_TIMEOUT);
>
> -  msm_property_install_range(&dpu_crtc->property_info,
> "output_fence",
> -                  0x0, 0, INR_OPEN_MAX, 0x0,
> CRTC_PROP_OUTPUT_FENCE);
> -
> -  msm_property_install_range(&dpu_crtc->property_info,
> -                  "output_fence_offset", 0x0, 0, 1, 0,
> -                  CRTC_PROP_OUTPUT_FENCE_OFFSET);
> -
>    msm_property_install_range(&dpu_crtc->property_info,
>                    "core_clk", 0x0, 0, U64_MAX,
>                    dpu_kms->perf.max_core_clk_rate,
> @@ -4342,29 +4234,12 @@ static int dpu_crtc_atomic_get_property(struct
> drm_crtc *crtc,
>            }
>
>            i = msm_property_index(&dpu_crtc->property_info,
> property);
> -          if (i == CRTC_PROP_OUTPUT_FENCE) {
> -                  uint32_t offset = dpu_crtc_get_property(cstate,
> -                                  CRTC_PROP_OUTPUT_FENCE_OFFSET);
> -
> -                  /**
> -                   * set the offset to 0 only for cmd mode panels,
> so
> -                   * the release fence for the current frame can be
> -                   * triggered right after PP_DONE interrupt.
> -                   */
> -                  offset = is_cmd ? 0 : (offset + conn_offset);
> -
> -                  ret = dpu_fence_create(&dpu_crtc->output_fence,
> val,
> -                                                          offset);
> -                  if (ret)
> -                          DPU_ERROR("fence create failed\n");
> -          } else {
> -                  ret =
> msm_property_atomic_get(&dpu_crtc->property_info,
> -                                  &cstate->property_state,
> -                                  property, val);
> -                  if (ret)
> -                          ret = dpu_cp_crtc_get_property(crtc,
> -                                  property, val);
> -          }
> +          ret = msm_property_atomic_get(&dpu_crtc->property_info,
> +                          &cstate->property_state,
> +                          property, val);
> +          if (ret)
> +                  ret = dpu_cp_crtc_get_property(crtc,
> +                          property, val);
>            if (ret)
>                    DRM_ERROR("get property failed\n");
>    }
> @@ -4858,10 +4733,6 @@ static int _dpu_crtc_init_events(struct
dpu_crtc
> *dpu_crtc)
>            list_add_tail(&dpu_crtc->event_cache[i].list,
>                            &dpu_crtc->event_free_list);
>
> -  INIT_LIST_HEAD(&dpu_crtc->retire_event_list);
> -  for (i = 0; i < ARRAY_SIZE(dpu_crtc->retire_events); i++)
> -          INIT_LIST_HEAD(&dpu_crtc->retire_events[i].list);
> -
>    return rc;
>  }
>
> @@ -4920,9 +4791,6 @@ struct drm_crtc *dpu_crtc_init(struct drm_device
> *dev, struct drm_plane *plane)
>            return ERR_PTR(rc);
>    }
>
> -  /* initialize output fence support */
> -  dpu_fence_init(&dpu_crtc->output_fence, dpu_crtc->name,
> crtc->base.id);
> -
>    /* create CRTC properties */
>    msm_property_init(&dpu_crtc->property_info, &crtc->base, dev,
>                    priv->crtc_property, dpu_crtc->property_data,
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
> index b63df243be33..727a3434a4f6 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
> @@ -22,7 +22,6 @@
>  #include <linux/kthread.h>
>  #include <drm/drm_crtc.h>
>  #include "msm_prop.h"
> -#include "dpu_fence.h"
>  #include "dpu_kms.h"
>  #include "dpu_core_perf.h"
>  #include "dpu_hw_blk.h"
> @@ -85,17 +84,6 @@ struct dpu_crtc_smmu_state_data {
>    uint32_t transition_error;
>  };
>
> -/**
> - * @connectors    : Currently associated drm connectors for retire
> event
> - * @num_connectors: Number of associated drm connectors for retire
> event
> - * @list: event list
> - */
> -struct dpu_crtc_retire_event {
> -  struct drm_connector *connectors[MAX_CONNECTORS];
> -  int num_connectors;
> -  struct list_head list;
> -};
> -
>  /**
>   * struct dpu_crtc_mixer: stores the map for each virtual pipeline in
> the
> CRTC
>   * @hw_lm:        LM HW Driver context
> @@ -169,7 +157,6 @@ struct dpu_crtc_event {
>   * @drm_requested_vblank : Whether vblanks have been enabled in the
> encoder
>   * @property_info : Opaque structure for generic property support
>   * @property_defaults : Array of default values for generic property
> support
> - * @output_fence  : output release fence context
>   * @stage_cfg     : H/w mixer stage configuration
>   * @debugfs_root  : Parent of debugfs node
>   * @vblank_cb_count : count of vblank callback since last reset
> @@ -190,8 +177,6 @@ struct dpu_crtc_event {
>   * @frame_events  : static allocation of in-flight frame events
>   * @frame_event_list : available frame event list
>   * @spin_lock     : spin lock for frame event, transaction status,
> etc...
> - * @retire_events  : static allocation of retire fence connector
> - * @retire_event_list : available retire fence connector list
>   * @frame_done_comp    : for frame_event_done synchronization
>   * @event_thread  : Pointer to event handler thread
>   * @event_worker  : Event worker queue
> @@ -227,9 +212,6 @@ struct dpu_crtc {
>    struct msm_property_data property_data[CRTC_PROP_COUNT];
>    struct drm_property_blob *blob_info;
>
> -  /* output fence support */
> -  struct dpu_fence_context output_fence;
> -
>    struct dpu_hw_stage_cfg stage_cfg;
>    struct dentry *debugfs_root;
>
> @@ -253,8 +235,6 @@ struct dpu_crtc {
>    struct dpu_crtc_frame_event
> frame_events[DPU_CRTC_FRAME_EVENT_SIZE];
>    struct list_head frame_event_list;
>    spinlock_t spin_lock;
> -  struct dpu_crtc_retire_event
> retire_events[DPU_CRTC_FRAME_EVENT_SIZE];
> -  struct list_head retire_event_list;
>    struct completion frame_done_comp;
>
>    /* for handling internal event thread */
> @@ -475,14 +455,6 @@ int dpu_crtc_vblank(struct drm_crtc *crtc, bool
> en);
>   */
>  void dpu_crtc_commit_kickoff(struct drm_crtc *crtc);
>
> -/**
> - * dpu_crtc_prepare_commit - callback to prepare for output fences
> - * @crtc: Pointer to drm crtc object
> - * @old_state: Pointer to drm crtc old state object
> - */
> -void dpu_crtc_prepare_commit(struct drm_crtc *crtc,
> -          struct drm_crtc_state *old_state);
> -
>  /**
>   * dpu_crtc_complete_commit - callback signalling completion of
current
> commit
>   * @crtc: Pointer to drm crtc object
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> index 4d1e3652dbf4..a54ad2cd5856 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> @@ -2465,9 +2465,6 @@ static inline void
> _dpu_encoder_trigger_flush(struct
> drm_encoder *drm_enc,
>
>    pending_kickoff_cnt = dpu_encoder_phys_inc_pending(phys);
>
> -  if (phys->ops.is_master && phys->ops.is_master(phys))
> -          atomic_inc(&phys->pending_retire_fence_cnt);
> -
>    if (extra_flush_bits && ctl->ops.update_pending_flush)
>            ctl->ops.update_pending_flush(ctl, extra_flush_bits);
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
> index 69fb26cb43ab..86a3800af673 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
> @@ -27,9 +27,7 @@
>  #define DPU_ENCODER_FRAME_EVENT_DONE                      BIT(0)
>  #define DPU_ENCODER_FRAME_EVENT_ERROR                     BIT(1)
>  #define DPU_ENCODER_FRAME_EVENT_PANEL_DEAD                BIT(2)
> -#define DPU_ENCODER_FRAME_EVENT_SIGNAL_RELEASE_FENCE      BIT(3)
> -#define DPU_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE       BIT(4)
> -#define DPU_ENCODER_FRAME_EVENT_IDLE                      BIT(5)
> +#define DPU_ENCODER_FRAME_EVENT_IDLE                      BIT(3)
>
>  #define IDLE_TIMEOUT      (66 - 16/2)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
> index 3b05569007d2..71cd2f258994 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
> @@ -245,8 +245,6 @@ struct dpu_encoder_irq {
>   *                                scheduled. Decremented in irq handler
>   * @pending_ctlstart_cnt: Atomic counter tracking the number of ctl
> start
>   *                              pending.
> - * @pending_retire_fence_cnt:   Atomic counter tracking the pending
> retire
> - *                              fences that have to be signalled.
>   * @pending_kickoff_wq:           Wait queue for blocking until
> kickoff completes
>   * @irq:                  IRQ tracking structures
>   */
> @@ -273,7 +271,6 @@ struct dpu_encoder_phys {
>    atomic_t underrun_cnt;
>    atomic_t pending_ctlstart_cnt;
>    atomic_t pending_kickoff_cnt;
> -  atomic_t pending_retire_fence_cnt;
>    wait_queue_head_t pending_kickoff_wq;
>    struct dpu_encoder_irq irq[INTR_IDX_MAX];
>  };
> @@ -323,9 +320,6 @@ struct dpu_encoder_phys_cmd_autorefresh {
>   *                        after ctl_start instead of before next frame
> kickoff
>   * @pp_timeout_report_cnt: number of pingpong done irq timeout errors
>   * @autorefresh: autorefresh feature state
> - * @pending_rd_ptr_cnt: atomic counter to indicate if retire fence
can
> be
> - *                      signaled at the next rd_ptr_irq
> - * @rd_ptr_timestamp: last rd_ptr_irq timestamp
>   * @pending_vblank_cnt: Atomic counter tracking pending wait for
VBLANK
>   * @pending_vblank_wq: Wait queue for blocking until VBLANK received
>   */
> @@ -335,8 +329,6 @@ struct dpu_encoder_phys_cmd {
>    bool serialize_wait4pp;
>    int pp_timeout_report_cnt;
>    struct dpu_encoder_phys_cmd_autorefresh autorefresh;
> -  atomic_t pending_rd_ptr_cnt;
> -  ktime_t rd_ptr_timestamp;
>    atomic_t pending_vblank_cnt;
>    wait_queue_head_t pending_vblank_wq;
>  };
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
> index e92380a1d5a4..6ccf37820aa2 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
> @@ -44,12 +44,6 @@
>
>  #define DPU_ENC_WR_PTR_START_TIMEOUT_US 20000
>
> -/*
> - * Threshold for signalling retire fences in cases where
> - * CTL_START_IRQ is received just after RD_PTR_IRQ
> - */
> -#define DPU_ENC_CTL_START_THRESHOLD_US 500
> -
>  static inline int _dpu_encoder_phys_cmd_get_idle_timeout(
>            struct dpu_encoder_phys_cmd *cmd_enc)
>  {
> @@ -170,8 +164,7 @@ static void
dpu_encoder_phys_cmd_pp_tx_done_irq(void
> *arg, int irq_idx)
>    struct dpu_encoder_phys *phys_enc = arg;
>    unsigned long lock_flags;
>    int new_cnt;
> -  u32 event = DPU_ENCODER_FRAME_EVENT_DONE |
> -                  DPU_ENCODER_FRAME_EVENT_SIGNAL_RELEASE_FENCE;
> +  u32 event = DPU_ENCODER_FRAME_EVENT_DONE;
>
>    if (!phys_enc || !phys_enc->hw_pp)
>            return;
> @@ -221,7 +214,6 @@ static void
dpu_encoder_phys_cmd_pp_rd_ptr_irq(void
> *arg, int irq_idx)
>  {
>    struct dpu_encoder_phys *phys_enc = arg;
>    struct dpu_encoder_phys_cmd *cmd_enc;
> -  u32 event = 0;
>
>    if (!phys_enc || !phys_enc->hw_pp)
>            return;
> @@ -229,30 +221,10 @@ static void
> dpu_encoder_phys_cmd_pp_rd_ptr_irq(void
> *arg, int irq_idx)
>    DPU_ATRACE_BEGIN("rd_ptr_irq");
>    cmd_enc = to_dpu_encoder_phys_cmd(phys_enc);
>
> -  /**
> -   * signal only for master, when the ctl_start irq is
> -   * done and incremented the pending_rd_ptr_cnt.
> -   */
> -  if (dpu_encoder_phys_cmd_is_master(phys_enc)
> -              && atomic_add_unless(&cmd_enc->pending_rd_ptr_cnt, -1,
> 0)
> -              && atomic_add_unless(
> -                          &phys_enc->pending_retire_fence_cnt, -1,
> 0)) {
> -
> -          event = DPU_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE;
> -          if (phys_enc->parent_ops.handle_frame_done)
> -                  phys_enc->parent_ops.handle_frame_done(
> -                          phys_enc->parent, phys_enc, event);
> -  }
> -
> -  DPU_EVT32_IRQ(DRMID(phys_enc->parent),
> -                  phys_enc->hw_pp->idx - PINGPONG_0, event, 0xfff);
> -
>    if (phys_enc->parent_ops.handle_vblank_virt)
>            phys_enc->parent_ops.handle_vblank_virt(phys_enc->parent,
>                    phys_enc);
>
> -  cmd_enc->rd_ptr_timestamp = ktime_get();
> -
>    atomic_add_unless(&cmd_enc->pending_vblank_cnt, -1, 0);
>    wake_up_all(&cmd_enc->pending_vblank_wq);
>    DPU_ATRACE_END("rd_ptr_irq");
> @@ -262,9 +234,6 @@ static void
dpu_encoder_phys_cmd_ctl_start_irq(void
> *arg, int irq_idx)
>  {
>    struct dpu_encoder_phys *phys_enc = arg;
>    struct dpu_encoder_phys_cmd *cmd_enc;
> -  struct dpu_hw_ctl *ctl;
> -  u32 event = 0;
> -  s64 time_diff_us;
>
>    if (!phys_enc || !phys_enc->hw_ctl)
>            return;
> @@ -272,43 +241,8 @@ static void
dpu_encoder_phys_cmd_ctl_start_irq(void
> *arg, int irq_idx)
>    DPU_ATRACE_BEGIN("ctl_start_irq");
>    cmd_enc = to_dpu_encoder_phys_cmd(phys_enc);
>
> -  ctl = phys_enc->hw_ctl;
>    atomic_add_unless(&phys_enc->pending_ctlstart_cnt, -1, 0);
>
> -  time_diff_us = ktime_us_delta(ktime_get(),
> cmd_enc->rd_ptr_timestamp);
> -
> -  /* handle retire fence based on only master */
> -  if (dpu_encoder_phys_cmd_is_master(phys_enc)
> -                  &&
> atomic_read(&phys_enc->pending_retire_fence_cnt)) {
> -          /**
> -           * Handle rare cases where the ctl_start_irq is received
> -           * after rd_ptr_irq. If it falls within a threshold, it is
> -           * guaranteed the frame would be picked up in the current
> TE.
> -           * Signal retire fence immediately in such case.
> -           */
> -          if ((time_diff_us <= DPU_ENC_CTL_START_THRESHOLD_US)
> -                      && atomic_add_unless(
> -                          &phys_enc->pending_retire_fence_cnt, -1,
> 0)) {
> -
> -                  event =
> DPU_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE;
> -
> -                  if (phys_enc->parent_ops.handle_frame_done)
> -                          phys_enc->parent_ops.handle_frame_done(
> -                                  phys_enc->parent, phys_enc,
> event);
> -
> -          /**
> -           * In ideal cases, ctl_start_irq is received before the
> -           * rd_ptr_irq, so set the atomic flag to indicate the
> event
> -           * and rd_ptr_irq will handle signalling the retire fence
> -           */
> -          } else {
> -                  atomic_inc(&cmd_enc->pending_rd_ptr_cnt);
> -          }
> -  }
> -
> -  DPU_EVT32_IRQ(DRMID(phys_enc->parent), ctl->idx - CTL_0,
> -                          time_diff_us, event, 0xfff);
> -
>    /* Signal any waiting ctl start interrupt */
>    wake_up_all(&phys_enc->pending_kickoff_wq);
>    DPU_ATRACE_END("ctl_start_irq");
> @@ -409,8 +343,7 @@ static int
> _dpu_encoder_phys_cmd_handle_ppdone_timeout(
>  {
>    struct dpu_encoder_phys_cmd *cmd_enc =
>                    to_dpu_encoder_phys_cmd(phys_enc);
> -  u32 frame_event = DPU_ENCODER_FRAME_EVENT_ERROR
> -                          |
> DPU_ENCODER_FRAME_EVENT_SIGNAL_RELEASE_FENCE;
> +  u32 frame_event = DPU_ENCODER_FRAME_EVENT_ERROR;
>    bool do_log = false;
>
>    if (!phys_enc || !phys_enc->hw_pp || !phys_enc->hw_ctl)
> @@ -1346,8 +1279,6 @@ struct dpu_encoder_phys
> *dpu_encoder_phys_cmd_init(
>    atomic_set(&phys_enc->vblank_refcount, 0);
>    atomic_set(&phys_enc->pending_kickoff_cnt, 0);
>    atomic_set(&phys_enc->pending_ctlstart_cnt, 0);
> -  atomic_set(&phys_enc->pending_retire_fence_cnt, 0);
> -  atomic_set(&cmd_enc->pending_rd_ptr_cnt, 0);
>    atomic_set(&cmd_enc->pending_vblank_cnt, 0);
>    init_waitqueue_head(&phys_enc->pending_kickoff_wq);
>    init_waitqueue_head(&cmd_enc->pending_vblank_wq);
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c
> index 62c6f5c3547a..edaad0413987 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c
> @@ -373,13 +373,10 @@ static void
> dpu_encoder_phys_vid_setup_timing_engine(
>  static void dpu_encoder_phys_vid_vblank_irq(void *arg, int irq_idx)
>  {
>    struct dpu_encoder_phys *phys_enc = arg;
> -  struct dpu_encoder_phys_vid *vid_enc =
> -                  to_dpu_encoder_phys_vid(phys_enc);
>    struct dpu_hw_ctl *hw_ctl;
>    unsigned long lock_flags;
>    u32 flush_register = 0;
>    int new_cnt = -1, old_cnt = -1;
> -  u32 event = 0;
>
>    if (!phys_enc)
>            return;
> @@ -390,18 +387,6 @@ static void dpu_encoder_phys_vid_vblank_irq(void
> *arg, int irq_idx)
>
>    DPU_ATRACE_BEGIN("vblank_irq");
>
> -  /* signal only for master, where there is a pending kickoff */
> -  if (dpu_encoder_phys_vid_is_master(phys_enc)
> -                  && atomic_add_unless(
> -                          &phys_enc->pending_retire_fence_cnt, -1,
> 0)) {
> -          event = DPU_ENCODER_FRAME_EVENT_SIGNAL_RELEASE_FENCE
> -                          |
> DPU_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE;
> -
> -          if (phys_enc->parent_ops.handle_frame_done)
> -
> phys_enc->parent_ops.handle_frame_done(phys_enc->parent,
> -                          phys_enc, event);
> -  }
> -
>    if (phys_enc->parent_ops.handle_vblank_virt)
>            phys_enc->parent_ops.handle_vblank_virt(phys_enc->parent,
>                            phys_enc);
> @@ -422,9 +407,6 @@ static void dpu_encoder_phys_vid_vblank_irq(void
> *arg,
> int irq_idx)
>                            -1, 0);
>    spin_unlock_irqrestore(phys_enc->enc_spinlock, lock_flags);
>
> -  DPU_EVT32_IRQ(DRMID(phys_enc->parent), vid_enc->hw_intf->idx -
> INTF_0,
> -                  old_cnt, new_cnt, flush_register, event);
> -
>    /* Signal any waiting atomic commit thread */
>    wake_up_all(&phys_enc->pending_kickoff_wq);
>    DPU_ATRACE_END("vblank_irq");
> @@ -1028,7 +1010,6 @@ struct dpu_encoder_phys
> *dpu_encoder_phys_vid_init(
>
>    atomic_set(&phys_enc->vblank_refcount, 0);
>    atomic_set(&phys_enc->pending_kickoff_cnt, 0);
> -  atomic_set(&phys_enc->pending_retire_fence_cnt, 0);
>    init_waitqueue_head(&phys_enc->pending_kickoff_wq);
>    phys_enc->enable_state = DPU_ENC_DISABLED;
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
> index 9a6fa3e1e8b4..2bc5894839c4 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
> @@ -680,11 +680,8 @@ static void dpu_encoder_phys_wb_done_irq(void
*arg,
> int irq_idx)
>    if (phys_enc->enable_state == DPU_ENC_DISABLING)
>            goto complete;
>
> -  event = DPU_ENCODER_FRAME_EVENT_SIGNAL_RELEASE_FENCE
> -                  | DPU_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE
> -                  | DPU_ENCODER_FRAME_EVENT_DONE;
> +  event = DPU_ENCODER_FRAME_EVENT_DONE;
>
> -  atomic_add_unless(&phys_enc->pending_retire_fence_cnt, -1, 0);
>    if (phys_enc->parent_ops.handle_frame_done)
>            phys_enc->parent_ops.handle_frame_done(phys_enc->parent,
>                            phys_enc, event);
> @@ -847,12 +844,8 @@ static int
> dpu_encoder_phys_wb_wait_for_commit_done(
>            } else {
>                    DPU_ERROR("wb:%d kickoff timed out\n",
>                                    wb_enc->wb_dev->wb_idx - WB_0);
> -                  atomic_add_unless(
> -                          &phys_enc->pending_retire_fence_cnt, -1,
> 0);
>
> -                  event =
> DPU_ENCODER_FRAME_EVENT_SIGNAL_RELEASE_FENCE
> -                          |
> DPU_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE
> -                          | DPU_ENCODER_FRAME_EVENT_ERROR;
> +                  event = DPU_ENCODER_FRAME_EVENT_ERROR;
>                    if (phys_enc->parent_ops.handle_frame_done)
>                            phys_enc->parent_ops.handle_frame_done(
>                                    phys_enc->parent, phys_enc,
> event);
> @@ -1333,7 +1326,6 @@ struct dpu_encoder_phys
*dpu_encoder_phys_wb_init(
>    phys_enc->intf_mode = INTF_MODE_WB_LINE;
>    phys_enc->intf_idx = p->intf_idx;
>    phys_enc->enc_spinlock = p->enc_spinlock;
> -  atomic_set(&phys_enc->pending_retire_fence_cnt, 0);
>    INIT_LIST_HEAD(&wb_enc->irq_cb.list);
>
>    /* create internal buffer for disable logic */
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index 3d83037e8305..9d68030378a7 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -545,35 +545,6 @@ static void dpu_kms_wait_for_commit_done(struct
> msm_kms *kms,
>    }
>  }
>
> -static void dpu_kms_prepare_fence(struct msm_kms *kms,
> -          struct drm_atomic_state *old_state)
> -{
> -  struct drm_crtc *crtc;
> -  struct drm_crtc_state *old_crtc_state;
> -  int i, rc;
> -
> -  if (!kms || !old_state || !old_state->dev ||
> !old_state->acquire_ctx) {
> -          DPU_ERROR("invalid argument(s)\n");
> -          return;
> -  }
> -
> -retry:
> -  /* attempt to acquire ww mutex for connection */
> -  rc =
> drm_modeset_lock(&old_state->dev->mode_config.connection_mutex,
> -                         old_state->acquire_ctx);
> -
> -  if (rc == -EDEADLK) {
> -          drm_modeset_backoff(old_state->acquire_ctx);
> -          goto retry;
> -  }
> -
> -  /* old_state actually contains updated crtc pointers */
> -  for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {
> -          if (crtc->state->active)
> -                  dpu_crtc_prepare_commit(crtc, old_crtc_state);
> -  }
> -}
> -
>  /**
>   * _dpu_kms_get_displays - query for underlying display handles and
> cache
> them
>   * @dpu_kms:    Pointer to dpu kms structure
> @@ -1734,7 +1705,6 @@ static const struct msm_kms_funcs kms_funcs = {
>    .irq_uninstall   = dpu_irq_uninstall,
>    .irq             = dpu_irq,
>    .preclose        = dpu_kms_preclose,
> -  .prepare_fence   = dpu_kms_prepare_fence,
>    .prepare_commit  = dpu_kms_prepare_commit,
>    .commit          = dpu_kms_commit,
>    .complete_commit = dpu_kms_complete_commit,
> diff --git a/drivers/gpu/drm/msm/msm_drv.h
> b/drivers/gpu/drm/msm/msm_drv.h
> index 8cab333df717..e92376acbcfe 100644
> --- a/drivers/gpu/drm/msm/msm_drv.h
> +++ b/drivers/gpu/drm/msm/msm_drv.h
> @@ -132,8 +132,6 @@ enum msm_mdp_crtc_property {
>
>    /* range properties */
>    CRTC_PROP_INPUT_FENCE_TIMEOUT = CRTC_PROP_BLOBCOUNT,
> -  CRTC_PROP_OUTPUT_FENCE,
> -  CRTC_PROP_OUTPUT_FENCE_OFFSET,
>    CRTC_PROP_DIM_LAYER_V1,
>    CRTC_PROP_CORE_CLK,
>    CRTC_PROP_CORE_AB,
> @@ -163,7 +161,6 @@ enum msm_mdp_conn_property {
>
>    /* range properties */
>    CONNECTOR_PROP_OUT_FB = CONNECTOR_PROP_BLOBCOUNT,
> -  CONNECTOR_PROP_RETIRE_FENCE,
>    CONNECTOR_PROP_DST_X,
>    CONNECTOR_PROP_DST_Y,
>    CONNECTOR_PROP_DST_W,

--
Jeykumar S

--
Jeykumar S
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno

Reply via email to