[Freedreno] [DPU PATCH] drm/msm/dpu: Fix vblank refcount mismatch

2018-12-05 Thread Jayant Shekhar
_dpu_crtc_vblank_enable_no_lock releases crtc_lock as
its needed for power handle operations. This opens up a
window where in a thread running dpu_crtc_disable and a thread
running dpu_crtc_vblank can race in using dpu_crtc->enabled.

dpu_crtc_disable will change the state, where as dpu_crtc_vblank
use the variable. The fix is to cache the crtc enabled state
while holding the lock and use it as a gate in calling
_dpu_crtc_vblank_enable_no_lock.

This issue was introduced with the commit cf871c48
(drm/msm/dpu: Remove suspend state tracking from crtc).

Below are stack traces of thread 1 and thread 2 in good case
and bad case:

Bad case:
-
Thread 1
dpu_encoder_phys_vid_control_vblank_irq+0xd0/0x170
dpu_encoder_register_vblank_callback+0xb8/0x100
_dpu_crtc_vblank_enable_no_lock+0x240/0x288
dpu_crtc_disable+0xc4/0x288
drm_atomic_helper_commit_modeset_disables+0x19c/0x350
msm_atomic_commit_tail+0x48/0x144
commit_tail+0x44/0x70
drm_atomic_helper_commit+0xf0/0xf8
drm_atomic_commit+0x40/0x4c
drm_mode_atomic_ioctl+0x374/0x90c
drm_ioctl_kernel+0xac/0xec
drm_ioctl+0x218/0x384
drm_compat_ioctl+0xd8/0xe8

Thread 2:
dpu_encoder_phys_vid_control_vblank_irq+0x74/0x170
dpu_encoder_register_vblank_callback+0xb8/0x100
_dpu_crtc_vblank_enable_no_lock+0x240/0x288
dpu_crtc_vblank+0xa8/0x118
dpu_kms_disable_vblank+0x20/0x2c
vblank_ctrl_worker+0xa0/0xe0
kthread_worker_fn+0xe4/0x1a4
kthread+0x11c/0x12c
ret_from_fork+0x10/0x18

Good case:
--
Thread 1:
dpu_encoder_phys_vid_control_vblank_irq+0xd0/0x170
dpu_encoder_phys_vid_irq_control+0xc8/0x110
_dpu_encoder_irq_control+0x48/0xa0
_dpu_encoder_resource_control_helper+0xb4/0x10c
dpu_encoder_resource_control+0x4e0/0x664
dpu_encoder_virt_enable+0xb8/0x120
dpu_kms_encoder_enable+0x34/0xcc
drm_atomic_helper_commit_modeset_enables+0x120/0x1b8
msm_atomic_commit_tail+0x5c/0x144
commit_tail+0x44/0x70
drm_atomic_helper_commit+0xf0/0xf8
drm_atomic_commit+0x40/0x4c
drm_mode_atomic_ioctl+0x374/0x90c

Thread 2:
dpu_crtc_vblank+0xc8/0x118
dpu_kms_disable_vblank+0x20/0x2c
vblank_ctrl_worker+0xa0/0xe0
kthread_worker_fn+0xe4/0x1a4
kthread+0x11c/0x12c

Signed-off-by: Jayant Shekhar 
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 17 ++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
index 630cbaa..e81ad8c 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
@@ -877,6 +877,7 @@ static void dpu_crtc_disable(struct drm_crtc *crtc)
struct drm_encoder *encoder;
struct msm_drm_private *priv;
unsigned long flags;
+   bool crtc_en;
 
if (!crtc || !crtc->dev || !crtc->dev->dev_private || !crtc->state) {
DPU_ERROR("invalid crtc\n");
@@ -901,11 +902,21 @@ static void dpu_crtc_disable(struct drm_crtc *crtc)
atomic_read(_crtc->frame_pending));
 
trace_dpu_crtc_disable(DRMID(crtc), false, dpu_crtc);
-   if (dpu_crtc->enabled && dpu_crtc->vblank_requested) {
-   _dpu_crtc_vblank_enable_no_lock(dpu_crtc, false);
-   }
+
+   /*
+* Cache vblank enabled before calling _dpu_crtc_vblank_enable_no_lock,
+* because we release crtc_lock inside and acquire it back. While lock
+* is released, there are cases where dpu_crtc_vblank comes in between
+* while disable is going on. dpu_crtc_vblank further calls
+* _dpu_crtc_vblank_enable_no_lock which tries vblank disable again
+* resulting in refcount mismatch.
+*/
+   crtc_en = dpu_crtc->enabled;
dpu_crtc->enabled = false;
 
+   if (crtc_en && dpu_crtc->vblank_requested)
+   _dpu_crtc_vblank_enable_no_lock(dpu_crtc, false);
+
if (atomic_read(_crtc->frame_pending)) {
trace_dpu_crtc_disable_frame_pending(DRMID(crtc),
 atomic_read(_crtc->frame_pending));
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project

___
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno


[Freedreno] [PULL] msm-fixes for 4.20

2018-12-05 Thread Sean Paul
Hi Dave,
I'm guest-robclarking for msm for this PR. I've been tracking a bunch of display
stuff for dpu and it am able to take a bit off Rob's plate by collecting the
fixes that have trickled in over the past while.

We've got a bunch of dpu-specific fixes since rc1, but I've deferred most of
them for 4.21 since no one is using dpu atm. Everything dpu below is either
compile fix or trivial.

msm-fixes-2018-12-04:
- Several related to incorrect error checking/handling (Various)
- Prevent IRQ storm on MDP5 HDMI hotplug (Todor)
- Don't capture crash state if unsupported (Sharat)
- Properly grab vblank reference in atomic wait for commit done (Sean)

Cc: Sharat Masetty 
Cc: Todor Tomov 
Cc: Sean Paul 

Cheers,

Sean


The following changes since commit ebcdcef30333660d3314158bac362425ade3d28c:

  Merge tag 'drm-misc-fixes-2018-11-28-1' of 
git://anongit.freedesktop.org/drm/drm-misc into drm-fixes (2018-11-29 10:11:15 
+1000)

are available in the Git repository at:

  https://gitlab.freedesktop.org/seanpaul/dpu-staging.git 
tags/msm-fixes-2018-12-04

for you to fetch changes up to 098336deb946f37a70afc0979af388b615c378bf:

  drm/msm: Fix error return checking (2018-12-03 08:46:14 -0500)


- Several related to incorrect error checking/handling (Various)
- Prevent IRQ storm on MDP5 HDMI hotplug (Todor)
- Don't capture crash state if unsupported (Sharat)
- Properly grab vblank reference in atomic wait for commit done (Sean)

Cc: Sharat Masetty 
Cc: Todor Tomov 
Cc: Sean Paul 


Abhinav Kumar (1):
  drm/msm/dsi: configure VCO rate for 10nm PLL driver

Dan Carpenter (1):
  drm/msm/gpu: Fix a couple memory leaks in debugfs

Jayant Shekhar (1):
  drm/msm/dpu: Ignore alpha for XBGR format

Jeykumar Sankaran (1):
  drm/msm: validate display and event threads

Jordan Crouse (1):
  drm/msm/gpu: Don't map command buffers with nr_relocs equal to 0

Rob Clark (1):
  drm/msm: fix handling of cmdstream offset

Robert Foss (1):
  drm/msm: Move fence put to where failure occurs

Sean Paul (2):
  drm/msm: Grab a vblank reference when waiting for commit_done
  drm/msm: dpu: Don't set legacy plane->crtc pointer

Sharat Masetty (2):
  drm/msm: Check if target supports crash dump capture
  drm/msm: Fix task dump in gpu recovery

Todor Tomov (1):
  drm/msm/hdmi: Enable HPD after HDMI IRQ is set up

Wen Yang (1):
  drm/msm: Fix error return checking

YueHaibing (2):
  drm/msm/hdmi: Drop pointless static qualifier in msm_hdmi_bind()
  drm/msm: dpu: Fix "WARNING: invalid free of devm_ allocated data"

 drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c|  1 -
 drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c |  2 --
 drivers/gpu/drm/msm/disp/dpu1/dpu_formats.c |  2 +-
 drivers/gpu/drm/msm/dsi/pll/dsi_pll_10nm.c  |  4 ++-
 drivers/gpu/drm/msm/hdmi/hdmi.c |  8 -
 drivers/gpu/drm/msm/hdmi/hdmi.h |  1 +
 drivers/gpu/drm/msm/hdmi/hdmi_connector.c   | 10 ++
 drivers/gpu/drm/msm/msm_atomic.c|  5 +++
 drivers/gpu/drm/msm/msm_debugfs.c   | 15 ++---
 drivers/gpu/drm/msm/msm_drv.c   | 49 ++---
 drivers/gpu/drm/msm/msm_gem_submit.c| 18 ++-
 drivers/gpu/drm/msm/msm_gpu.c   | 13 +---
 drivers/gpu/drm/msm/msm_iommu.c |  2 +-
 drivers/gpu/drm/msm/msm_rd.c|  5 ++-
 14 files changed, 70 insertions(+), 65 deletions(-)

-- 
Sean Paul, Software Engineer, Google / Chromium OS
___
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno


Re: [Freedreno] [PATCH 1/1] drm/msm/a6xx: Add support for an interconnect path

2018-12-05 Thread Georgi Djakov
Hi Jordan,

Thanks for the patch!

On 11/29/18 19:26, Jordan Crouse wrote:
> Try to get the interconnect path for the GPU and vote for the maximum
> bandwidth to support all frequencies. This is needed for performance.
> Later we will want to scale the bandwidth based on the frequency to
> also optimize for power but that will require some device tree
> infrastructure that does not yet exist.
> 
> v3: Absolute bandwidth values should be specified in KBps

btw. now i have also included macros in the header, that can be used to
specify the bandwidth units. So now you can now use kBps_to_icc or
MBps_to_icc etc. If we decide at some point that we change the units we
use internally, we will not have update all the users.

> 
> Signed-off-by: Jordan Crouse 
> ---
>  drivers/gpu/drm/msm/adreno/a6xx_gmu.c   | 20 
>  drivers/gpu/drm/msm/adreno/adreno_gpu.c |  9 +
>  drivers/gpu/drm/msm/msm_gpu.h   |  3 +++
>  3 files changed, 32 insertions(+)
> 
> diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c 
> b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
> index 546599a7ab05..fe0f5b10fd9c 100644
> --- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
> +++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
> @@ -3,6 +3,7 @@
>  
>  #include 
>  #include 
> +#include 
>  #include 

Alphabetic order maybe?

>  #include "a6xx_gpu.h"
> @@ -63,6 +64,9 @@ static bool a6xx_gmu_gx_is_on(struct a6xx_gmu *gmu)
>  
>  static void __a6xx_gmu_set_freq(struct a6xx_gmu *gmu, int index)
>  {
> + struct a6xx_gpu *a6xx_gpu = container_of(gmu, struct a6xx_gpu, gmu);
> + struct adreno_gpu *adreno_gpu = _gpu->base;
> + struct msm_gpu *gpu = _gpu->base;
>   int ret;
>  
>   gmu_write(gmu, REG_A6XX_GMU_DCVS_ACK_OPTION, 0);
> @@ -85,6 +89,12 @@ static void __a6xx_gmu_set_freq(struct a6xx_gmu *gmu, int 
> index)
>   dev_err(gmu->dev, "GMU set GPU frequency error: %d\n", ret);
>  
>   gmu->freq = gmu->gpu_freqs[index];
> +
> + /*
> +  * Eventually we will want to scale the path vote with the frequency but
> +  * for now leave it t at max so that the performance is nominal.

An extra t above.

> +  */
> + icc_set(gpu->icc_path, 0, 7216000);
>  }
>  
>  void a6xx_gmu_set_freq(struct msm_gpu *gpu, unsigned long freq)
> @@ -680,6 +690,8 @@ int a6xx_gmu_reset(struct a6xx_gpu *a6xx_gpu)
>  
>  int a6xx_gmu_resume(struct a6xx_gpu *a6xx_gpu)
>  {
> + struct adreno_gpu *adreno_gpu = _gpu->base;
> + struct msm_gpu *gpu = _gpu->base;
>   struct a6xx_gmu *gmu = _gpu->gmu;
>   int status, ret;
>  
> @@ -695,6 +707,9 @@ int a6xx_gmu_resume(struct a6xx_gpu *a6xx_gpu)
>   if (ret)
>   goto out;
>  
> + /* Set the bus quota to a reasonable value for boot */
> + icc_set(gpu->icc_path, 0, 3072000);

Here you can do:
icc_set(gpu->icc_path, 0, MBps_to_icc(3072));

> +
>   a6xx_gmu_irq_enable(gmu);
>  
>   /* Check to see if we are doing a cold or warm boot */
> @@ -735,6 +750,8 @@ bool a6xx_gmu_isidle(struct a6xx_gmu *gmu)
>  
>  int a6xx_gmu_stop(struct a6xx_gpu *a6xx_gpu)
>  {
> + struct adreno_gpu *adreno_gpu = _gpu->base;
> + struct msm_gpu *gpu = _gpu->base;
>   struct a6xx_gmu *gmu = _gpu->gmu;
>   u32 val;
>  
> @@ -781,6 +798,9 @@ int a6xx_gmu_stop(struct a6xx_gpu *a6xx_gpu)
>   /* Tell RPMh to power off the GPU */
>   a6xx_rpmh_stop(gmu);
>  
> + /* Remove the bus vote */
> + icc_set(gpu->icc_path, 0, 0);
> +
>   clk_bulk_disable_unprepare(gmu->nr_clocks, gmu->clocks);
>  
>   pm_runtime_put_sync(gmu->dev);
> diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c 
> b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
> index 93d70f4a2154..9bab491912cf 100644
> --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
> +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
> @@ -21,6 +21,7 @@
>  #include 
>  #include 
>  #include 
> +#include 

Alphabetic order?

>  #include "adreno_gpu.h"
>  #include "msm_gem.h"
>  #include "msm_mmu.h"
> @@ -695,6 +696,11 @@ static int adreno_get_pwrlevels(struct device *dev,
>  
>   DBG("fast_rate=%u, slow_rate=2700", gpu->fast_rate);
>  
> + /* Check for an interconnect path for the bus */
> + gpu->icc_path = of_icc_get(dev, "port0");

I was wondering if port0 is appropriate name here. I assume this is the
port to DDR. Maybe we could name it gfx-mem or gpu-mem. Are there any
other interconnects that need to be scaled on the a6xx?

> + if (IS_ERR(gpu->icc_path))
> + gpu->icc_path = NULL;
> +
>   return 0;
>  }
>  
> @@ -733,10 +739,13 @@ int adreno_gpu_init(struct drm_device *drm, struct 
> platform_device *pdev,
>  
>  void adreno_gpu_cleanup(struct adreno_gpu *adreno_gpu)
>  {
> + struct msm_gpu *gpu = _gpu->base;
>   unsigned int i;
>  
>   for (i = 0; i < ARRAY_SIZE(adreno_gpu->info->fw); i++)
>   release_firmware(adreno_gpu->fw[i]);
>  
> + icc_put(gpu->icc_path);
> +
>   msm_gpu_cleanup(_gpu->base);
>  }
> diff --git 

[Freedreno] [PATCH 5/9] drm/msm: Don't track connectors in msm private struct

2018-12-05 Thread Sean Paul
From: Sean Paul 

drm core already tracks this, so we can just lean on that instead of
tracking ourselves.

Signed-off-by: Sean Paul 
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c  | 10 ++
 drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c |  3 ---
 drivers/gpu/drm/msm/dsi/dsi.c|  2 --
 drivers/gpu/drm/msm/edp/edp.c|  3 ---
 drivers/gpu/drm/msm/hdmi/hdmi.c  |  3 ---
 drivers/gpu/drm/msm/msm_drv.h|  3 ---
 drivers/gpu/drm/msm/msm_fbdev.c  |  2 +-
 7 files changed, 7 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index 8dede6cb9b7d7..4f2fcdfe2644e 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -498,7 +498,8 @@ static void _dpu_kms_drm_obj_destroy(struct dpu_kms 
*dpu_kms)
struct drm_crtc *crtc;
struct drm_plane *plane;
struct drm_encoder *encoder;
-   int i;
+   struct drm_connector_list_iter conn_iter;
+   struct drm_connector *connector;
 
if (!dpu_kms) {
DPU_ERROR("invalid dpu_kms\n");
@@ -518,9 +519,10 @@ static void _dpu_kms_drm_obj_destroy(struct dpu_kms 
*dpu_kms)
drm_for_each_plane(plane, dpu_kms->dev)
plane->funcs->destroy(plane);
 
-   for (i = 0; i < priv->num_connectors; i++)
-   priv->connectors[i]->funcs->destroy(priv->connectors[i]);
-   priv->num_connectors = 0;
+   drm_connector_list_iter_begin(dpu_kms->dev, _iter);
+   drm_for_each_connector_iter(connector, _iter)
+   connector->funcs->destroy(connector);
+   drm_connector_list_iter_end(_iter);
 
drm_for_each_encoder(encoder, dpu_kms->dev)
encoder->funcs->destroy(encoder);
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c 
b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
index 40e2b462a03e1..e86134fed2244 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
@@ -265,9 +265,6 @@ static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms,
DRM_DEV_ERROR(dev->dev, "failed to initialize LVDS 
connector\n");
return PTR_ERR(connector);
}
-
-   priv->connectors[priv->num_connectors++] = connector;
-
break;
case DRM_MODE_ENCODER_TMDS:
encoder = mdp4_dtv_encoder_init(dev);
diff --git a/drivers/gpu/drm/msm/dsi/dsi.c b/drivers/gpu/drm/msm/dsi/dsi.c
index 97b906a9b3945..e1d990f316732 100644
--- a/drivers/gpu/drm/msm/dsi/dsi.c
+++ b/drivers/gpu/drm/msm/dsi/dsi.c
@@ -250,8 +250,6 @@ int msm_dsi_modeset_init(struct msm_dsi *msm_dsi, struct 
drm_device *dev,
goto fail;
}
 
-   priv->connectors[priv->num_connectors++] = msm_dsi->connector;
-
return 0;
 fail:
/* bridge/connector are normally destroyed by drm: */
diff --git a/drivers/gpu/drm/msm/edp/edp.c b/drivers/gpu/drm/msm/edp/edp.c
index 694c2d43011f6..10adf89d5d469 100644
--- a/drivers/gpu/drm/msm/edp/edp.c
+++ b/drivers/gpu/drm/msm/edp/edp.c
@@ -148,7 +148,6 @@ int msm_edp_modeset_init(struct msm_edp *edp, struct 
drm_device *dev,
struct drm_encoder *encoder)
 {
struct platform_device *pdev = edp->pdev;
-   struct msm_drm_private *priv = dev->dev_private;
int ret;
 
edp->encoder = encoder;
@@ -188,8 +187,6 @@ int msm_edp_modeset_init(struct msm_edp *edp, struct 
drm_device *dev,
 
encoder->bridge = edp->bridge;
 
-   priv->connectors[priv->num_connectors++] = edp->connector;
-
return 0;
 
 fail:
diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.c b/drivers/gpu/drm/msm/hdmi/hdmi.c
index 1901ae820ef0b..ce564331e6080 100644
--- a/drivers/gpu/drm/msm/hdmi/hdmi.c
+++ b/drivers/gpu/drm/msm/hdmi/hdmi.c
@@ -291,7 +291,6 @@ static struct hdmi *msm_hdmi_init(struct platform_device 
*pdev)
 int msm_hdmi_modeset_init(struct hdmi *hdmi,
struct drm_device *dev, struct drm_encoder *encoder)
 {
-   struct msm_drm_private *priv = dev->dev_private;
struct platform_device *pdev = hdmi->pdev;
int ret;
 
@@ -340,8 +339,6 @@ int msm_hdmi_modeset_init(struct hdmi *hdmi,
 
encoder->bridge = hdmi->bridge;
 
-   priv->connectors[priv->num_connectors++] = hdmi->connector;
-
platform_set_drvdata(pdev, hdmi);
 
return 0;
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index 6cd61199d20a0..6c013addce68c 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -194,9 +194,6 @@ struct msm_drm_private {
struct msm_drm_thread disp_thread[MAX_CRTCS];
struct msm_drm_thread event_thread[MAX_CRTCS];
 
-   unsigned int num_connectors;
-   struct drm_connector *connectors[MAX_CONNECTORS];
-
/* Properties */
struct drm_property *plane_property[PLANE_PROP_MAX_NUM];
 
diff --git 

[Freedreno] [PATCH 8/9] drm/msm: mdp5: Remove mdp5_plane_install_rotation_property()

2018-12-05 Thread Sean Paul
From: Sean Paul 

Just call drm_plane_create_rotation_property() directly

Signed-off-by: Sean Paul 
---
 drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c | 18 ++
 1 file changed, 6 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c 
b/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
index 5ea06804cef2b..41590588a6f39 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
@@ -52,17 +52,6 @@ static void mdp5_plane_destroy(struct drm_plane *plane)
kfree(mdp5_plane);
 }
 
-static void mdp5_plane_install_rotation_property(struct drm_device *dev,
-   struct drm_plane *plane)
-{
-   drm_plane_create_rotation_property(plane,
-  DRM_MODE_ROTATE_0,
-  DRM_MODE_ROTATE_0 |
-  DRM_MODE_ROTATE_180 |
-  DRM_MODE_REFLECT_X |
-  DRM_MODE_REFLECT_Y);
-}
-
 /* helper to install properties which are common to planes and crtcs */
 static void mdp5_plane_install_properties(struct drm_plane *plane,
struct drm_mode_object *obj)
@@ -98,7 +87,12 @@ static void mdp5_plane_install_properties(struct drm_plane 
*plane,
 
INSTALL_RANGE_PROPERTY(zpos, ZPOS, 1, 255, 1);
 
-   mdp5_plane_install_rotation_property(dev, plane);
+   drm_plane_create_rotation_property(plane,
+  DRM_MODE_ROTATE_0,
+  DRM_MODE_ROTATE_0 |
+  DRM_MODE_ROTATE_180 |
+  DRM_MODE_REFLECT_X |
+  DRM_MODE_REFLECT_Y);
 
 #undef INSTALL_RANGE_PROPERTY
 #undef INSTALL_ENUM_PROPERTY
-- 
Sean Paul, Software Engineer, Google / Chromium OS

___
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno


[Freedreno] [PATCH 1/9] drm/msm: Don't track crtcs in msm private struct

2018-12-05 Thread Sean Paul
From: Sean Paul 

drm core already tracks this, so we can just lean on that instead of
tracking ourselves.

Signed-off-by: Sean Paul 
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c  |  9 ++-
 drivers/gpu/drm/msm/disp/mdp4/mdp4_irq.c | 10 +--
 drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c |  4 +-
 drivers/gpu/drm/msm/disp/mdp5/mdp5_irq.c | 10 +--
 drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 12 +---
 drivers/gpu/drm/msm/msm_drv.c| 79 +---
 drivers/gpu/drm/msm/msm_drv.h|  3 -
 7 files changed, 62 insertions(+), 65 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index 1969f0d07d865..3796a2978a40b 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -497,6 +497,7 @@ static void _dpu_kms_setup_displays(struct drm_device *dev,
 static void _dpu_kms_drm_obj_destroy(struct dpu_kms *dpu_kms)
 {
struct msm_drm_private *priv;
+   struct drm_crtc *crtc;
int i;
 
if (!dpu_kms) {
@@ -511,9 +512,8 @@ static void _dpu_kms_drm_obj_destroy(struct dpu_kms 
*dpu_kms)
}
priv = dpu_kms->dev->dev_private;
 
-   for (i = 0; i < priv->num_crtcs; i++)
-   priv->crtcs[i]->funcs->destroy(priv->crtcs[i]);
-   priv->num_crtcs = 0;
+   drm_for_each_crtc(crtc, dpu_kms->dev)
+   crtc->funcs->destroy(crtc);
 
for (i = 0; i < priv->num_planes; i++)
priv->planes[i]->funcs->destroy(priv->planes[i]);
@@ -598,12 +598,11 @@ static int _dpu_kms_drm_obj_init(struct dpu_kms *dpu_kms)
ret = PTR_ERR(crtc);
goto fail;
}
-   priv->crtcs[priv->num_crtcs++] = crtc;
}
 
/* All CRTCs are compatible with all encoders */
for (i = 0; i < priv->num_encoders; i++)
-   priv->encoders[i]->possible_crtcs = (1 << priv->num_crtcs) - 1;
+   priv->encoders[i]->possible_crtcs = (1 << max_crtc_count) - 1;
 
return 0;
 fail:
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_irq.c 
b/drivers/gpu/drm/msm/disp/mdp4/mdp4_irq.c
index b764d7f103127..7c597d21c97ba 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_irq.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_irq.c
@@ -15,6 +15,7 @@
  * this program.  If not, see .
  */
 
+#include 
 #include 
 
 #include "msm_drv.h"
@@ -79,8 +80,7 @@ irqreturn_t mdp4_irq(struct msm_kms *kms)
struct mdp_kms *mdp_kms = to_mdp_kms(kms);
struct mdp4_kms *mdp4_kms = to_mdp4_kms(mdp_kms);
struct drm_device *dev = mdp4_kms->dev;
-   struct msm_drm_private *priv = dev->dev_private;
-   unsigned int id;
+   struct drm_crtc *crtc;
uint32_t status, enable;
 
enable = mdp4_read(mdp4_kms, REG_MDP4_INTR_ENABLE);
@@ -91,9 +91,9 @@ irqreturn_t mdp4_irq(struct msm_kms *kms)
 
mdp_dispatch_irqs(mdp_kms, status);
 
-   for (id = 0; id < priv->num_crtcs; id++)
-   if (status & mdp4_crtc_vblank(priv->crtcs[id]))
-   drm_handle_vblank(dev, id);
+   drm_for_each_crtc(crtc, dev)
+   if (status & mdp4_crtc_vblank(crtc))
+   drm_handle_vblank(dev, drm_crtc_index(crtc));
 
return IRQ_HANDLED;
 }
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c 
b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
index e437aa806f7be..f7f678c55e3ac 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
@@ -373,7 +373,7 @@ static int modeset_init(struct mdp4_kms *mdp4_kms)
goto fail;
}
 
-   crtc  = mdp4_crtc_init(dev, plane, priv->num_crtcs, i,
+   crtc  = mdp4_crtc_init(dev, plane, ARRAY_SIZE(mdp4_crtcs), i,
mdp4_crtcs[i]);
if (IS_ERR(crtc)) {
DRM_DEV_ERROR(dev->dev, "failed to construct crtc for 
%s\n",
@@ -381,8 +381,6 @@ static int modeset_init(struct mdp4_kms *mdp4_kms)
ret = PTR_ERR(crtc);
goto fail;
}
-
-   priv->crtcs[priv->num_crtcs++] = crtc;
}
 
/*
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_irq.c 
b/drivers/gpu/drm/msm/disp/mdp5/mdp5_irq.c
index 280e368bc9bb8..c66a7fbd9b9c3 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_irq.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_irq.c
@@ -17,6 +17,7 @@
 
 #include 
 
+#include 
 #include 
 
 #include "msm_drv.h"
@@ -92,8 +93,7 @@ irqreturn_t mdp5_irq(struct msm_kms *kms)
struct mdp_kms *mdp_kms = to_mdp_kms(kms);
struct mdp5_kms *mdp5_kms = to_mdp5_kms(mdp_kms);
struct drm_device *dev = mdp5_kms->dev;
-   struct msm_drm_private *priv = dev->dev_private;
-   unsigned int id;
+   struct drm_crtc *crtc;
uint32_t status, enable;
 
enable = mdp5_read(mdp5_kms, REG_MDP5_INTR_EN);
@@ 

[Freedreno] [PATCH 4/9] drm/msm: Don't track planes in msm private struct

2018-12-05 Thread Sean Paul
From: Sean Paul 

drm core already tracks this, so we can just lean on that instead of
tracking ourselves.

Signed-off-by: Sean Paul 
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c  | 7 +++
 drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c | 2 --
 drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 2 --
 drivers/gpu/drm/msm/msm_drv.h| 3 ---
 4 files changed, 3 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index cbebc04e2d6ef..8dede6cb9b7d7 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -496,6 +496,7 @@ static void _dpu_kms_drm_obj_destroy(struct dpu_kms 
*dpu_kms)
 {
struct msm_drm_private *priv;
struct drm_crtc *crtc;
+   struct drm_plane *plane;
struct drm_encoder *encoder;
int i;
 
@@ -514,9 +515,8 @@ static void _dpu_kms_drm_obj_destroy(struct dpu_kms 
*dpu_kms)
drm_for_each_crtc(crtc, dpu_kms->dev)
crtc->funcs->destroy(crtc);
 
-   for (i = 0; i < priv->num_planes; i++)
-   priv->planes[i]->funcs->destroy(priv->planes[i]);
-   priv->num_planes = 0;
+   drm_for_each_plane(plane, dpu_kms->dev)
+   plane->funcs->destroy(plane);
 
for (i = 0; i < priv->num_connectors; i++)
priv->connectors[i]->funcs->destroy(priv->connectors[i]);
@@ -581,7 +581,6 @@ static int _dpu_kms_drm_obj_init(struct dpu_kms *dpu_kms)
ret = PTR_ERR(plane);
goto fail;
}
-   priv->planes[priv->num_planes++] = plane;
 
if (type == DRM_PLANE_TYPE_CURSOR)
cursor_planes[cursor_planes_idx++] = plane;
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c 
b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
index 527a4ee06819f..40e2b462a03e1 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
@@ -325,7 +325,6 @@ static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms,
 static int modeset_init(struct mdp4_kms *mdp4_kms)
 {
struct drm_device *dev = mdp4_kms->dev;
-   struct msm_drm_private *priv = dev->dev_private;
struct drm_plane *plane;
struct drm_crtc *crtc;
int i, ret;
@@ -356,7 +355,6 @@ static int modeset_init(struct mdp4_kms *mdp4_kms)
ret = PTR_ERR(plane);
goto fail;
}
-   priv->planes[priv->num_planes++] = plane;
}
 
for (i = 0; i < ARRAY_SIZE(mdp4_crtcs); i++) {
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c 
b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
index 7cf54737944e4..0a1fa40d375ce 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
@@ -451,7 +451,6 @@ static int modeset_init_intf(struct mdp5_kms *mdp5_kms,
 static int modeset_init(struct mdp5_kms *mdp5_kms)
 {
struct drm_device *dev = mdp5_kms->dev;
-   struct msm_drm_private *priv = dev->dev_private;
struct drm_encoder *encoder;
const struct mdp5_cfg_hw *hw_cfg;
unsigned int num_crtcs;
@@ -502,7 +501,6 @@ static int modeset_init(struct mdp5_kms *mdp5_kms)
DRM_DEV_ERROR(dev->dev, "failed to construct plane %d 
(%d)\n", i, ret);
goto fail;
}
-   priv->planes[priv->num_planes++] = plane;
 
if (type == DRM_PLANE_TYPE_PRIMARY)
primary[pi++] = plane;
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index 1902713ed84b0..6cd61199d20a0 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -191,9 +191,6 @@ struct msm_drm_private {
 
struct workqueue_struct *wq;
 
-   unsigned int num_planes;
-   struct drm_plane *planes[MAX_PLANES];
-
struct msm_drm_thread disp_thread[MAX_CRTCS];
struct msm_drm_thread event_thread[MAX_CRTCS];
 
-- 
Sean Paul, Software Engineer, Google / Chromium OS

___
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno


[Freedreno] [PATCH 2/9] drm/msm: Don't track encoders in msm private struct

2018-12-05 Thread Sean Paul
From: Sean Paul 

drm core already tracks this, so we can just lean on that instead of
tracking ourselves.

Signed-off-by: Sean Paul 
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c  | 16 
 drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c |  5 -
 drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 12 
 drivers/gpu/drm/msm/msm_drv.h|  3 ---
 4 files changed, 12 insertions(+), 24 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index 3796a2978a40b..cbebc04e2d6ef 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -457,8 +457,6 @@ static void _dpu_kms_initialize_dsi(struct drm_device *dev,
return;
}
 
-   priv->encoders[priv->num_encoders++] = encoder;
-
for (i = 0; i < ARRAY_SIZE(priv->dsi); i++) {
if (!priv->dsi[i]) {
DPU_DEBUG("invalid msm_dsi for ctrl %d\n", i);
@@ -498,6 +496,7 @@ static void _dpu_kms_drm_obj_destroy(struct dpu_kms 
*dpu_kms)
 {
struct msm_drm_private *priv;
struct drm_crtc *crtc;
+   struct drm_encoder *encoder;
int i;
 
if (!dpu_kms) {
@@ -523,9 +522,8 @@ static void _dpu_kms_drm_obj_destroy(struct dpu_kms 
*dpu_kms)
priv->connectors[i]->funcs->destroy(priv->connectors[i]);
priv->num_connectors = 0;
 
-   for (i = 0; i < priv->num_encoders; i++)
-   priv->encoders[i]->funcs->destroy(priv->encoders[i]);
-   priv->num_encoders = 0;
+   drm_for_each_encoder(encoder, dpu_kms->dev)
+   encoder->funcs->destroy(encoder);
 }
 
 static int _dpu_kms_drm_obj_init(struct dpu_kms *dpu_kms)
@@ -534,6 +532,7 @@ static int _dpu_kms_drm_obj_init(struct dpu_kms *dpu_kms)
struct drm_plane *primary_planes[MAX_PLANES], *plane;
struct drm_plane *cursor_planes[MAX_PLANES] = { NULL };
struct drm_crtc *crtc;
+   struct drm_encoder *encoder;
 
struct msm_drm_private *priv;
struct dpu_mdss_cfg *catalog;
@@ -556,7 +555,8 @@ static int _dpu_kms_drm_obj_init(struct dpu_kms *dpu_kms)
 */
_dpu_kms_setup_displays(dev, priv, dpu_kms);
 
-   max_crtc_count = min(catalog->mixer_count, priv->num_encoders);
+   max_crtc_count = min(catalog->mixer_count,
+(u32)dev->mode_config.num_encoder);
 
/* Create the planes, keeping track of one primary/cursor per crtc */
for (i = 0; i < catalog->sspp_count; i++) {
@@ -601,8 +601,8 @@ static int _dpu_kms_drm_obj_init(struct dpu_kms *dpu_kms)
}
 
/* All CRTCs are compatible with all encoders */
-   for (i = 0; i < priv->num_encoders; i++)
-   priv->encoders[i]->possible_crtcs = (1 << max_crtc_count) - 1;
+   drm_for_each_encoder(encoder, dpu_kms->dev)
+   encoder->possible_crtcs = (1 << max_crtc_count) - 1;
 
return 0;
 fail:
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c 
b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
index f7f678c55e3ac..527a4ee06819f 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
@@ -266,7 +266,6 @@ static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms,
return PTR_ERR(connector);
}
 
-   priv->encoders[priv->num_encoders++] = encoder;
priv->connectors[priv->num_connectors++] = connector;
 
break;
@@ -288,9 +287,6 @@ static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms,
return ret;
}
}
-
-   priv->encoders[priv->num_encoders++] = encoder;
-
break;
case DRM_MODE_ENCODER_DSI:
/* only DSI1 supported for now */
@@ -309,7 +305,6 @@ static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms,
 
/* TODO: Add DMA_S later? */
encoder->possible_crtcs = 1 << DMA_P;
-   priv->encoders[priv->num_encoders++] = encoder;
 
ret = msm_dsi_modeset_init(priv->dsi[dsi_id], dev, encoder);
if (ret) {
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c 
b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
index 4fb70532b0484..7cf54737944e4 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
@@ -332,7 +332,6 @@ static struct drm_encoder *construct_encoder(struct 
mdp5_kms *mdp5_kms,
 struct mdp5_ctl *ctl)
 {
struct drm_device *dev = mdp5_kms->dev;
-   struct msm_drm_private *priv = dev->dev_private;
struct drm_encoder *encoder;
 
encoder = mdp5_encoder_init(dev, intf, ctl);
@@ -341,8 +340,6 @@ static struct drm_encoder *construct_encoder(struct 
mdp5_kms *mdp5_kms,
return encoder;
}
 
-   priv->encoders[priv->num_encoders++] = encoder;
-
  

[Freedreno] [PATCH 9/9] drm/msm: mdp5: Remove custom property code in plane

2018-12-05 Thread Sean Paul
From: Sean Paul 

mdp5 only exposes one custom property, and it's zpos.
Fortunately, we have a standard zpos property now, we can remove
the hand-rolled property code entirely from mdp5 and rely on core.

Signed-off-by: Sean Paul 
---
 drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c  |   2 +-
 drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.h   |   3 -
 drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c | 101 +
 drivers/gpu/drm/msm/msm_drv.h  |   8 --
 4 files changed, 3 insertions(+), 111 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c 
b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
index bfa97ec063965..4ccef117ced90 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
@@ -551,7 +551,7 @@ static int pstate_cmp(const void *a, const void *b)
 {
struct plane_state *pa = (struct plane_state *)a;
struct plane_state *pb = (struct plane_state *)b;
-   return pa->state->zpos - pb->state->zpos;
+   return pa->state->base.normalized_zpos - 
pb->state->base.normalized_zpos;
 }
 
 /* is there a helper for this? */
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.h 
b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.h
index 8605a7dee44c1..44d03fc31e323 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.h
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.h
@@ -107,9 +107,6 @@ struct mdp5_plane_state {
struct mdp5_hw_pipe *hwpipe;
struct mdp5_hw_pipe *r_hwpipe;  /* right hwpipe */
 
-   /* aligned with property */
-   uint8_t zpos;
-
/* assigned by crtc blender */
enum mdp_mixer_stage_id stage;
 };
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c 
b/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
index 41590588a6f39..da999d236dff2 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
@@ -56,103 +56,13 @@ static void mdp5_plane_destroy(struct drm_plane *plane)
 static void mdp5_plane_install_properties(struct drm_plane *plane,
struct drm_mode_object *obj)
 {
-   struct drm_device *dev = plane->dev;
-   struct msm_drm_private *dev_priv = dev->dev_private;
-   struct drm_property *prop;
-
-#define INSTALL_PROPERTY(name, NAME, init_val, fnc, ...) do { \
-   prop = dev_priv->plane_property[PLANE_PROP_##NAME]; \
-   if (!prop) { \
-   prop = drm_property_##fnc(dev, 0, #name, \
-   ##__VA_ARGS__); \
-   if (!prop) { \
-   dev_warn(dev->dev, \
-   "Create property %s failed\n", \
-   #name); \
-   return; \
-   } \
-   dev_priv->plane_property[PLANE_PROP_##NAME] = prop; \
-   } \
-   drm_object_attach_property(>base, prop, init_val); \
-   } while (0)
-
-#define INSTALL_RANGE_PROPERTY(name, NAME, min, max, init_val) \
-   INSTALL_PROPERTY(name, NAME, init_val, \
-   create_range, min, max)
-
-#define INSTALL_ENUM_PROPERTY(name, NAME, init_val) \
-   INSTALL_PROPERTY(name, NAME, init_val, \
-   create_enum, name##_prop_enum_list, \
-   ARRAY_SIZE(name##_prop_enum_list))
-
-   INSTALL_RANGE_PROPERTY(zpos, ZPOS, 1, 255, 1);
-
+   drm_plane_create_zpos_property(plane, 1, 1, 255);
drm_plane_create_rotation_property(plane,
   DRM_MODE_ROTATE_0,
   DRM_MODE_ROTATE_0 |
   DRM_MODE_ROTATE_180 |
   DRM_MODE_REFLECT_X |
   DRM_MODE_REFLECT_Y);
-
-#undef INSTALL_RANGE_PROPERTY
-#undef INSTALL_ENUM_PROPERTY
-#undef INSTALL_PROPERTY
-}
-
-static int mdp5_plane_atomic_set_property(struct drm_plane *plane,
-   struct drm_plane_state *state, struct drm_property *property,
-   uint64_t val)
-{
-   struct drm_device *dev = plane->dev;
-   struct mdp5_plane_state *pstate;
-   struct msm_drm_private *dev_priv = dev->dev_private;
-   int ret = 0;
-
-   pstate = to_mdp5_plane_state(state);
-
-#define SET_PROPERTY(name, NAME, type) do { \
-   if (dev_priv->plane_property[PLANE_PROP_##NAME] == property) { \
-   pstate->name = (type)val; \
-   DBG("Set property %s %d", #name, (type)val); \
-   goto done; \
-   } \
-   } while (0)
-
-   SET_PROPERTY(zpos, ZPOS, uint8_t);
-
-   DRM_DEV_ERROR(dev->dev, "Invalid property\n");
-   ret = -EINVAL;
-done:
-   return ret;
-#undef SET_PROPERTY
-}
-
-static int mdp5_plane_atomic_get_property(struct drm_plane *plane,
-   const struct drm_plane_state 

[Freedreno] [PATCH 7/9] drm/msm: mdp5: Remove alpha from plane state

2018-12-05 Thread Sean Paul
From: Sean Paul 

It's always 0xFF, so remove it and any code that relies on it being
!= 0xFF.

Signed-off-by: Sean Paul 
---
 drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c  | 27 ++
 drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.h   |  1 -
 drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c |  4 
 drivers/gpu/drm/msm/msm_drv.h  |  1 -
 4 files changed, 7 insertions(+), 26 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c 
b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
index 035be33405f08..bfa97ec063965 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
@@ -230,7 +230,7 @@ static void blend_setup(struct drm_crtc *crtc)
struct mdp5_hw_mixer *r_mixer = pipeline->r_mixer;
uint32_t r_lm = r_mixer ? r_mixer->lm : 0;
struct mdp5_ctl *ctl = mdp5_cstate->ctl;
-   uint32_t blend_op, fg_alpha, bg_alpha, ctl_blend_flags = 0;
+   uint32_t blend_op, ctl_blend_flags = 0;
unsigned long flags;
enum mdp5_pipe stage[STAGE_MAX + 1][MAX_PIPE_STAGE] = { { SSPP_NONE } };
enum mdp5_pipe r_stage[STAGE_MAX + 1][MAX_PIPE_STAGE] = { { SSPP_NONE } 
};
@@ -300,44 +300,31 @@ static void blend_setup(struct drm_crtc *crtc)
plane = pstates[i]->base.plane;
blend_op = MDP5_LM_BLEND_OP_MODE_FG_ALPHA(FG_CONST) |
MDP5_LM_BLEND_OP_MODE_BG_ALPHA(BG_CONST);
-   fg_alpha = pstates[i]->alpha;
-   bg_alpha = 0xFF - pstates[i]->alpha;
 
if (!format->alpha_enable && bg_alpha_enabled)
mixer_op_mode = 0;
else
mixer_op_mode |= mdp5_lm_use_fg_alpha_mask(i);
 
-   DBG("Stage %d fg_alpha %x bg_alpha %x", i, fg_alpha, bg_alpha);
-
if (format->alpha_enable) {
blend_op = MDP5_LM_BLEND_OP_MODE_FG_ALPHA(FG_PIXEL) |
-   MDP5_LM_BLEND_OP_MODE_BG_ALPHA(FG_PIXEL);
-   if (fg_alpha != 0xff) {
-   bg_alpha = fg_alpha;
-   blend_op |=
-  MDP5_LM_BLEND_OP_MODE_FG_MOD_ALPHA |
-  MDP5_LM_BLEND_OP_MODE_FG_INV_MOD_ALPHA |
-  MDP5_LM_BLEND_OP_MODE_BG_MOD_ALPHA |
-  MDP5_LM_BLEND_OP_MODE_BG_INV_MOD_ALPHA;
-   } else {
-   blend_op |= MDP5_LM_BLEND_OP_MODE_BG_INV_ALPHA;
-   }
+   MDP5_LM_BLEND_OP_MODE_BG_ALPHA(FG_PIXEL) |
+   MDP5_LM_BLEND_OP_MODE_BG_INV_ALPHA;
}
 
mdp5_write(mdp5_kms, REG_MDP5_LM_BLEND_OP_MODE(lm,
blender(i)), blend_op);
mdp5_write(mdp5_kms, REG_MDP5_LM_BLEND_FG_ALPHA(lm,
-   blender(i)), fg_alpha);
+   blender(i)), 0xFF);
mdp5_write(mdp5_kms, REG_MDP5_LM_BLEND_BG_ALPHA(lm,
-   blender(i)), bg_alpha);
+   blender(i)), 0);
if (r_mixer) {
mdp5_write(mdp5_kms, REG_MDP5_LM_BLEND_OP_MODE(r_lm,
blender(i)), blend_op);
mdp5_write(mdp5_kms, REG_MDP5_LM_BLEND_FG_ALPHA(r_lm,
-   blender(i)), fg_alpha);
+   blender(i)), 0xFF);
mdp5_write(mdp5_kms, REG_MDP5_LM_BLEND_BG_ALPHA(r_lm,
-   blender(i)), bg_alpha);
+   blender(i)), 0);
}
}
 
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.h 
b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.h
index 61b3331dcab9c..8605a7dee44c1 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.h
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.h
@@ -109,7 +109,6 @@ struct mdp5_plane_state {
 
/* aligned with property */
uint8_t zpos;
-   uint8_t alpha;
 
/* assigned by crtc blender */
enum mdp_mixer_stage_id stage;
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c 
b/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
index e96aff8e55757..5ea06804cef2b 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
@@ -175,7 +175,6 @@ mdp5_plane_atomic_print_state(struct drm_printer *p,
   pstate->r_hwpipe ? pstate->r_hwpipe->name :
  "(null)");
drm_printf(p, "\tzpos=%u\n", pstate->zpos);
-   drm_printf(p, "\talpha=%u\n", pstate->alpha);
drm_printf(p, "\tstage=%s\n", stage2name(pstate->stage));
 }
 
@@ -189,9 +188,6 @@ static void mdp5_plane_reset(struct drm_plane *plane)

[Freedreno] [PATCH 6/9] drm/msm: mdp5: Remove premultiplied from plane state

2018-12-05 Thread Sean Paul
From: Sean Paul 

It's always 0, and not exposed via property, so remove it and all
affected code.

Signed-off-by: Sean Paul 
---
 drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c  | 13 +
 drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.h   |  1 -
 drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c |  2 --
 drivers/gpu/drm/msm/msm_drv.h  |  1 -
 4 files changed, 1 insertion(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c 
b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
index c5fde1a4191aa..035be33405f08 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
@@ -310,18 +310,7 @@ static void blend_setup(struct drm_crtc *crtc)
 
DBG("Stage %d fg_alpha %x bg_alpha %x", i, fg_alpha, bg_alpha);
 
-   if (format->alpha_enable && pstates[i]->premultiplied) {
-   blend_op = MDP5_LM_BLEND_OP_MODE_FG_ALPHA(FG_CONST) |
-   MDP5_LM_BLEND_OP_MODE_BG_ALPHA(FG_PIXEL);
-   if (fg_alpha != 0xff) {
-   bg_alpha = fg_alpha;
-   blend_op |=
-   MDP5_LM_BLEND_OP_MODE_BG_MOD_ALPHA |
-   MDP5_LM_BLEND_OP_MODE_BG_INV_MOD_ALPHA;
-   } else {
-   blend_op |= MDP5_LM_BLEND_OP_MODE_BG_INV_ALPHA;
-   }
-   } else if (format->alpha_enable) {
+   if (format->alpha_enable) {
blend_op = MDP5_LM_BLEND_OP_MODE_FG_ALPHA(FG_PIXEL) |
MDP5_LM_BLEND_OP_MODE_BG_ALPHA(FG_PIXEL);
if (fg_alpha != 0xff) {
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.h 
b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.h
index 854dfd30e8292..61b3331dcab9c 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.h
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.h
@@ -108,7 +108,6 @@ struct mdp5_plane_state {
struct mdp5_hw_pipe *r_hwpipe;  /* right hwpipe */
 
/* aligned with property */
-   uint8_t premultiplied;
uint8_t zpos;
uint8_t alpha;
 
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c 
b/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
index 1a36d6f612826..e96aff8e55757 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
@@ -174,7 +174,6 @@ mdp5_plane_atomic_print_state(struct drm_printer *p,
drm_printf(p, "\tright-hwpipe=%s\n",
   pstate->r_hwpipe ? pstate->r_hwpipe->name :
  "(null)");
-   drm_printf(p, "\tpremultiplied=%u\n", pstate->premultiplied);
drm_printf(p, "\tzpos=%u\n", pstate->zpos);
drm_printf(p, "\talpha=%u\n", pstate->alpha);
drm_printf(p, "\tstage=%s\n", stage2name(pstate->stage));
@@ -192,7 +191,6 @@ static void mdp5_plane_reset(struct drm_plane *plane)
 
/* assign default blend parameters */
mdp5_state->alpha = 255;
-   mdp5_state->premultiplied = 0;
 
if (plane->type == DRM_PLANE_TYPE_PRIMARY)
mdp5_state->zpos = STAGE_BASE;
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index 6c013addce68c..b6aa04511ded9 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -73,7 +73,6 @@ struct msm_file_private {
 enum msm_mdp_plane_property {
PLANE_PROP_ZPOS,
PLANE_PROP_ALPHA,
-   PLANE_PROP_PREMULTIPLIED,
PLANE_PROP_MAX_NUM
 };
 
-- 
Sean Paul, Software Engineer, Google / Chromium OS

___
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno


[Freedreno] [PATCH 3/9] drm/msm: Don't track bridges in msm private struct

2018-12-05 Thread Sean Paul
From: Sean Paul 

drm core already tracks this, so we can just lean on that instead of
tracking ourselves.

Signed-off-by: Sean Paul 
---
 drivers/gpu/drm/msm/dsi/dsi.c   | 1 -
 drivers/gpu/drm/msm/edp/edp.c   | 1 -
 drivers/gpu/drm/msm/hdmi/hdmi.c | 1 -
 drivers/gpu/drm/msm/msm_drv.h   | 3 ---
 4 files changed, 6 deletions(-)

diff --git a/drivers/gpu/drm/msm/dsi/dsi.c b/drivers/gpu/drm/msm/dsi/dsi.c
index 7b2a1e6a88107..97b906a9b3945 100644
--- a/drivers/gpu/drm/msm/dsi/dsi.c
+++ b/drivers/gpu/drm/msm/dsi/dsi.c
@@ -250,7 +250,6 @@ int msm_dsi_modeset_init(struct msm_dsi *msm_dsi, struct 
drm_device *dev,
goto fail;
}
 
-   priv->bridges[priv->num_bridges++]   = msm_dsi->bridge;
priv->connectors[priv->num_connectors++] = msm_dsi->connector;
 
return 0;
diff --git a/drivers/gpu/drm/msm/edp/edp.c b/drivers/gpu/drm/msm/edp/edp.c
index 6a63aba98a307..694c2d43011f6 100644
--- a/drivers/gpu/drm/msm/edp/edp.c
+++ b/drivers/gpu/drm/msm/edp/edp.c
@@ -188,7 +188,6 @@ int msm_edp_modeset_init(struct msm_edp *edp, struct 
drm_device *dev,
 
encoder->bridge = edp->bridge;
 
-   priv->bridges[priv->num_bridges++]   = edp->bridge;
priv->connectors[priv->num_connectors++] = edp->connector;
 
return 0;
diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.c b/drivers/gpu/drm/msm/hdmi/hdmi.c
index ace8aab072761..1901ae820ef0b 100644
--- a/drivers/gpu/drm/msm/hdmi/hdmi.c
+++ b/drivers/gpu/drm/msm/hdmi/hdmi.c
@@ -340,7 +340,6 @@ int msm_hdmi_modeset_init(struct hdmi *hdmi,
 
encoder->bridge = hdmi->bridge;
 
-   priv->bridges[priv->num_bridges++]   = hdmi->bridge;
priv->connectors[priv->num_connectors++] = hdmi->connector;
 
platform_set_drvdata(pdev, hdmi);
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index c6eff08e80170..1902713ed84b0 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -197,9 +197,6 @@ struct msm_drm_private {
struct msm_drm_thread disp_thread[MAX_CRTCS];
struct msm_drm_thread event_thread[MAX_CRTCS];
 
-   unsigned int num_bridges;
-   struct drm_bridge *bridges[MAX_BRIDGES];
-
unsigned int num_connectors;
struct drm_connector *connectors[MAX_CONNECTORS];
 
-- 
Sean Paul, Software Engineer, Google / Chromium OS

___
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno


[Freedreno] [DPU PATCH ] drm/msm/dpu: Fix clock issue after bind failure

2018-12-05 Thread Jayant Shekhar
In case of msm drm bind failure, pm runtime put sync
is called from dsi driver which issues an asynchronous
put on mdss device. Subsequently when dpu_mdss_destroy
is triggered the change will make sure to put the mdss
device in suspend and clearing pending work if not
scheduled.

Signed-off-by: Jayant Shekhar 
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_mdss.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_mdss.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_mdss.c
index 2d66025..030229a 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_mdss.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_mdss.c
@@ -191,6 +191,7 @@ static void dpu_mdss_destroy(struct drm_device *dev)
struct dss_module_power *mp = _mdss->mp;
int i;
 
+   pm_runtime_suspend(dev->dev);
pm_runtime_disable(dev->dev);
_dpu_mdss_irq_domain_fini(dpu_mdss);
free_irq(platform_get_irq(pdev, 0), dpu_mdss);
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project

___
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno


Re: [Freedreno] [PATCH 1/4] drm/edid: Pass connector to AVI inforframe functions

2018-12-05 Thread Ville Syrjälä
On Wed, Dec 05, 2018 at 08:40:34AM +0100, Andrzej Hajda wrote:
> On 04.12.2018 20:02, Ville Syrjälä wrote:
> > On Tue, Dec 04, 2018 at 08:03:53AM +0100, Andrzej Hajda wrote:
> >> On 03.12.2018 22:48, Ville Syrjälä wrote:
> >>> On Thu, Nov 29, 2018 at 09:46:16AM +0100, Andrzej Hajda wrote:
>  Quite late, hopefully not too late.
> 
> 
>  On 21.11.2018 12:51, Ville Syrjälä wrote:
> > On Wed, Nov 21, 2018 at 01:40:43PM +0200, Jani Nikula wrote:
> >>>   return;
> >>> diff --git a/drivers/gpu/drm/bridge/sil-sii8620.c 
> >>> b/drivers/gpu/drm/bridge/sil-sii8620.c
> >>> index a6e8f4591e63..0cc293a6ac24 100644
> >>> --- a/drivers/gpu/drm/bridge/sil-sii8620.c
> >>> +++ b/drivers/gpu/drm/bridge/sil-sii8620.c
> >>> @@ -1104,8 +1104,7 @@ static void sii8620_set_infoframes(struct 
> >>> sii8620 *ctx,
> >>>   int ret;
> >>>  
> >>>   ret = drm_hdmi_avi_infoframe_from_display_mode(,
> >>> -mode,
> >>> -true);
> >>> +NULL, mode);
> >>>   if (ctx->use_packed_pixel)
> >>>   frm.avi.colorspace = HDMI_COLORSPACE_YUV422;
> >>>  
> >>> diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c 
> >>> b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
> >>> index 64c3cf027518..88b720b63126 100644
> >>> --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
> >>> +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
> >>> @@ -1344,7 +1344,8 @@ static void hdmi_config_AVI(struct dw_hdmi 
> >>> *hdmi, struct drm_display_mode *mode)
> >>>   u8 val;
> >>>  
> >>>   /* Initialise info frame from DRM mode */
> >>> - drm_hdmi_avi_infoframe_from_display_mode(, mode, false);
> >>> + drm_hdmi_avi_infoframe_from_display_mode(,
> >>> +  >connector, 
> >>> mode);
> >>>  
> >>>   if (hdmi_bus_fmt_is_yuv444(hdmi->hdmi_data.enc_out_bus_format))
> >>>   frame.colorspace = HDMI_COLORSPACE_YUV444;
> >>> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> >>> index b506e3622b08..501ac05ba7da 100644
> >>> --- a/drivers/gpu/drm/drm_edid.c
> >>> +++ b/drivers/gpu/drm/drm_edid.c
> >>> @@ -4830,19 +4830,32 @@ void drm_set_preferred_mode(struct 
> >>> drm_connector *connector,
> >>>  }
> >>>  EXPORT_SYMBOL(drm_set_preferred_mode);
> >>>  
> >>> +static bool is_hdmi2_sink(struct drm_connector *connector)
> >> You're usually known for adding const all around, why not const pointer
> >> here and in all the other drm_* functions that call this?
> > My current approach is to constify states/fbs/etc. but not so much
> > crtcs/connectors/etc. Too much const can sometimes get in the way
> > of things requiring that you remove the const later. But I guess
> > in this case the const shouldn't really get in the way of anything
> > because these are pretty much supposed to be pure functions.
> >
> >>> +{
> >>> + /*
> >>> +  * FIXME: sil-sii8620 doesn't have a connector around when
> >>> +  * we need one, so we have to be prepared for a NULL connector.
> >>> +  */
> >>> + if (!connector)
> >>> + return false;
> >> This actually changes the is_hdmi2_sink value for sil-sii8620.
> > Hmm. No idea why they would have set that to true when everyone else is
> > passing false. 
>  Because false does not work :) More precisely MHLv3 (used in Sii8620)
>  uses CTA-861-F standard for infoframes, which is specific to HDMI2.0.
> 
>  Unfortunately I have no access to MHL specs, but my experiments and
>  vendor drivers strongly suggests it is done this way.
> 
>  This is important in case of 4K modes which are handled differently by
>  HDMI 1.4 and HDMI2.0.
> >>> HDMI 2.0 handles 4k just like 1.4 handled it when you use one of
> >>> the 4k modes defined in 1.4. Only if you use features beyond 1.4 do we
> >>> switch over to the HDMI 2.0 specific signalling.
> >>
> >> The difference is in infoframes:
> >>
> >> HDMI 1.4 sets AVI infoframe VIC to 0, and sends HDMI_VIC in VSI.
> >>
> >> HDMI 2.0 sets AVI infoframe to non zero VICs introduced by
> >> HDMI2.0/CEA-861-F, VSI can be omitted if I remember correctly, unless 3d
> >> is in use.
> > Like I said, The HDMI 1.4 method is used even with HDMI 2.0 sinks unless
> > some feature gets used which can't be signalled via the HDMI 1.4 vendor
> > specific infoframe.
> 
> 
> Do you mean that 4K VICs 95, 94, 93, 98 defined in CEA-861-F are not
> used at all for non-3d video in HDMI 2.0?
> 
> Chapter 10.1 of HDMI2.0 spec says clearly:
> 
> > When transmitting any additional Video Format for which a VIC value
> > has been defined in
> > CEA-861-F tables 1, 2, and 

Re: [Freedreno] [RESEND PATCH v3] drm/msm: Move fence put to where failure occurs

2018-12-05 Thread Robert Foss



On 2018-12-04 21:21, Rob Clark wrote:

On Tue, Dec 4, 2018 at 11:56 AM Robert Foss  wrote:


If dma_fence_wait fails to wait for a supplied in-fence in
msm_ioctl_gem_submit, make sure we release that in-fence.

Also remove this dma_fence_put() from the 'out' label.

Signed-off-by: Robert Foss 
Reviewed-by: Chris Wilson 
Cc: sta...@vger.kernel.org


Fyi, this is queued up in msm-next/fixes


Ah!

I had a look for it in drm=misc-next, but didn't find it.
Thanks for the heads up!



BR,
-R



---
  drivers/gpu/drm/msm/msm_gem_submit.c | 15 ---
  1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c 
b/drivers/gpu/drm/msm/msm_gem_submit.c
index a90aedd6883a..d5e6665a4c8f 100644
--- a/drivers/gpu/drm/msm/msm_gem_submit.c
+++ b/drivers/gpu/drm/msm/msm_gem_submit.c
@@ -411,7 +411,6 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
 struct msm_file_private *ctx = file->driver_priv;
 struct msm_gem_submit *submit;
 struct msm_gpu *gpu = priv->gpu;
-   struct dma_fence *in_fence = NULL;
 struct sync_file *sync_file = NULL;
 struct msm_gpu_submitqueue *queue;
 struct msm_ringbuffer *ring;
@@ -444,6 +443,8 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
 ring = gpu->rb[queue->prio];

 if (args->flags & MSM_SUBMIT_FENCE_FD_IN) {
+   struct dma_fence *in_fence;
+
 in_fence = sync_file_get_fence(args->fence_fd);

 if (!in_fence)
@@ -453,11 +454,13 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void 
*data,
  * Wait if the fence is from a foreign context, or if the fence
  * array contains any fence from a foreign context.
  */
-   if (!dma_fence_match_context(in_fence, ring->fctx->context)) {
+   ret = 0;
+   if (!dma_fence_match_context(in_fence, ring->fctx->context))
 ret = dma_fence_wait(in_fence, true);
-   if (ret)
-   return ret;
-   }
+
+   dma_fence_put(in_fence);
+   if (ret)
+   return ret;
 }

 ret = mutex_lock_interruptible(>struct_mutex);
@@ -583,8 +586,6 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
 }

  out:
-   if (in_fence)
-   dma_fence_put(in_fence);
 submit_cleanup(submit);
 if (ret)
 msm_gem_submit_free(submit);
--
2.17.1


___
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno


Re: [Freedreno] [PATCH 1/4] drm/edid: Pass connector to AVI inforframe functions

2018-12-05 Thread Russell King - ARM Linux
On Tue, Nov 20, 2018 at 06:13:42PM +0200, Ville Syrjala wrote:
> diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c 
> b/drivers/gpu/drm/i2c/tda998x_drv.c
> index a7c39f39793f..38c66fbc8276 100644
> --- a/drivers/gpu/drm/i2c/tda998x_drv.c
> +++ b/drivers/gpu/drm/i2c/tda998x_drv.c
> @@ -849,7 +849,8 @@ tda998x_write_avi(struct tda998x_priv *priv, struct 
> drm_display_mode *mode)
>  {
>   union hdmi_infoframe frame;
>  
> - drm_hdmi_avi_infoframe_from_display_mode(, mode, false);
> + drm_hdmi_avi_infoframe_from_display_mode(,
> +  >connector, mode);
>   frame.avi.quantization_range = HDMI_QUANTIZATION_RANGE_FULL;
>  
>   tda998x_write_if(priv, DIP_IF_FLAGS_IF2, REG_IF2_HB0, );

For this,

Acked-by: Russell King 

Thanks.

-- 
RMK's Patch system: http://www.armlinux.org.uk/developer/patches/
FTTC broadband for 0.8mile line in suburbia: sync at 12.1Mbps down 622kbps up
According to speedtest.net: 11.9Mbps down 500kbps up
___
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno


Re: [Freedreno] [PATCH 1/4] drm/edid: Pass connector to AVI inforframe functions

2018-12-05 Thread Laurent Pinchart
Hi Andrzej,

On Wednesday, 5 December 2018 10:46:40 EET Andrzej Hajda wrote:
> On 05.12.2018 07:32, Laurent Pinchart wrote:
> > On Tuesday, 4 December 2018 21:13:20 EET Ville Syrjälä wrote:
> >> On Tue, Dec 04, 2018 at 08:46:53AM +0100, Andrzej Hajda wrote:
> >>> On 03.12.2018 22:38, Ville Syrjälä wrote:
>  On Thu, Nov 29, 2018 at 10:08:07AM +0100, Andrzej Hajda wrote:
> > On 21.11.2018 19:19, Laurent Pinchart wrote:
> >> On Tuesday, 20 November 2018 18:13:42 EET Ville Syrjala wrote:
> >>> From: Ville Syrjälä 
> >>> 
> >>> Make life easier for drivers by simply passing the connector
> >>> to drm_hdmi_avi_infoframe_from_display_mode() and
> >>> drm_hdmi_avi_infoframe_quant_range(). That way drivers don't
> >>> need to worry about is_hdmi2_sink mess.
> >> 
> >> While this is good for display controller drivers, the change isn't
> >> great for bridge drivers. Down the road we're looking at moving
> >> connector support out of the bridge drivers. Adding an additional
> >> dependency to connectors in the bridges will make that more
> >> difficult. Ideally bridges should retrieve the information from their
> >> sink, regardless of whether it is a connector or another bridge.
> > 
> > I agree with it, and case of sii8620 shows that there are cases where
> > bridge has no direct access to the connector.
>  
>  It's just a matter of plumbing it through.
> >>> 
> >>> What do you mean exactly?
> >> 
> >> void bridge_foo(...
> >> +   ,struct drm_connector *connector);
> >> 
> > On the other side,  since you are passing connector to
> > drm_hdmi_avi_infoframe_from_display_mode(), you could drop mode
> > parameter and rename the function to
> > drm_hdmi_avi_infoframe_from_connector() then, unless mode passed and
> > mode set on the connector differs?
>  
>  Connectors don't have a mode.
> >>> 
> >>> As they are passing video stream they should have it, even if not
> >>> directly, for example:
> >>> 
> >>> connector->state->crtc->mode
> >> 
> >> That's not really how atomic works. One shouldn't go digging
> >> through the obj->state pointers when we're not holding the
> >> relevant locks anymore. The atomic way would be to pass either
> >> both crtc state and connector state, or drm_atomic_state +
> >> crtc/connector.
> 
> Usually infoframe contents is generated in modesetting/enable callbacks
> so the locks should be in place.
> 
> And the locks should be hold for
> drm_hdmi_avi_infoframe_from_display_mode as well - it wouldn't be correct if
> 
> generated infoframe is not relevant to actual video mode. I guess that
> if connector->state->crtc->mode
> 
> differs from mode passed to drm_hdmi_avi_infoframe_from_display_mode it
> is a sign of possible problem.
> 
> And if they do not differ passing mode as an extra argument is redundant.
> 
> > Or a bridge state ? With chained bridges the mode can vary along the
> > pipeline, the CRTC adjusted mode will only cover the link between the
> > CRTC and the first bridge. It's only a matter of time until we need to
> > store other intermediate modes in states. I'd rather prepare for that
> > instead of passing the CRTC state to bridges.
> 
> Yes, optional bridge states seems reasonable, volunteers needed :)

I'll give it a go eventually, if nobody beats me to it. The exact timing will 
depend on many variables so I can't estimate it I'm afraid. All I'm asking is 
to avoid extending the drm_bridge API in a way that would make introduction of 
bridge states more complex. If someone needs bridge states, for instance to 
solve the above issue, then they should be added.

[snip]

-- 
Regards,

Laurent Pinchart



___
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno