Re: [Intel-gfx] [PATCH 1/6] drm/i915: Use atomic state to obtain load detection crtc.

2016-02-11 Thread Daniel Vetter
On Mon, Feb 01, 2016 at 02:43:57PM +0100, Maarten Lankhorst wrote:
> Instead of restoring dpms and a flag for whether a temp fb is allocated 
> duplicate
> the old plane_state and crtc_state, and restore the members we potentially 
> touched.
> 
> Signed-off-by: Maarten Lankhorst 

Do we have the load-detect igt testcase now in the BAT set? We've broken
this way too many times to not do that. Imo that should be done before
merging this fix.
-Daniel

> ---
>  drivers/gpu/drm/i915/intel_display.c | 128 
> ---
>  drivers/gpu/drm/i915/intel_drv.h |   4 +-
>  2 files changed, 76 insertions(+), 56 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_display.c 
> b/drivers/gpu/drm/i915/intel_display.c
> index 4d8c9f7857db..0702ce8ec36a 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -10361,6 +10361,7 @@ mode_fits_in_fbdev(struct drm_device *dev,
>   if (obj->base.size < mode->vdisplay * fb->pitches[0])
>   return NULL;
>  
> + drm_framebuffer_reference(fb);
>   return fb;
>  #else
>   return NULL;
> @@ -10426,6 +10427,9 @@ bool intel_get_load_detect_pipe(struct drm_connector 
> *connector,
> encoder->base.id, encoder->name);
>  
>  retry:
> + old->old_pipe_config = NULL;
> + old->old_plane_state = NULL;
> +
>   ret = drm_modeset_lock(&config->connection_mutex, ctx);
>   if (ret)
>   goto fail;
> @@ -10441,24 +10445,15 @@ retry:
>*/
>  
>   /* See if we already have a CRTC for this connector */
> - if (encoder->crtc) {
> - crtc = encoder->crtc;
> + if (connector->state->crtc) {
> + crtc = connector->state->crtc;
>  
>   ret = drm_modeset_lock(&crtc->mutex, ctx);
>   if (ret)
>   goto fail;
> - ret = drm_modeset_lock(&crtc->primary->mutex, ctx);
> - if (ret)
> - goto fail;
> -
> - old->dpms_mode = connector->dpms;
> - old->load_detect_temp = false;
>  
>   /* Make sure the crtc and connector are running */
> - if (connector->dpms != DRM_MODE_DPMS_ON)
> - connector->funcs->dpms(connector, DRM_MODE_DPMS_ON);
> -
> - return true;
> + goto found;
>   }
>  
>   /* Find an unused one (if possible) */
> @@ -10466,8 +10461,15 @@ retry:
>   i++;
>   if (!(encoder->possible_crtcs & (1 << i)))
>   continue;
> - if (possible_crtc->state->enable)
> +
> + ret = drm_modeset_lock(&possible_crtc->mutex, ctx);
> + if (ret)
> + goto fail;
> +
> + if (possible_crtc->state->enable) {
> + drm_modeset_unlock(&possible_crtc->mutex);
>   continue;
> + }
>  
>   crtc = possible_crtc;
>   break;
> @@ -10481,17 +10483,19 @@ retry:
>   goto fail;
>   }
>  
> - ret = drm_modeset_lock(&crtc->mutex, ctx);
> - if (ret)
> - goto fail;
> +found:
> + intel_crtc = to_intel_crtc(crtc);
> +
>   ret = drm_modeset_lock(&crtc->primary->mutex, ctx);
>   if (ret)
>   goto fail;
>  
> - intel_crtc = to_intel_crtc(crtc);
> - old->dpms_mode = connector->dpms;
> - old->load_detect_temp = true;
> - old->release_fb = NULL;
> + old->old_pipe_config = intel_crtc_duplicate_state(crtc);
> + old->old_plane_state = intel_plane_duplicate_state(crtc->primary);
> + if (!old->old_pipe_config || !old->old_plane_state) {
> + ret = -ENOMEM;
> + goto fail;
> + }
>  
>   state = drm_atomic_state_alloc(dev);
>   if (!state)
> @@ -10505,7 +10509,9 @@ retry:
>   goto fail;
>   }
>  
> - connector_state->crtc = crtc;
> + ret = drm_atomic_set_crtc_for_connector(connector_state, crtc);
> + if (ret)
> + goto fail;
>  
>   crtc_state = intel_atomic_get_crtc_state(state, intel_crtc);
>   if (IS_ERR(crtc_state)) {
> @@ -10529,7 +10535,6 @@ retry:
>   if (fb == NULL) {
>   DRM_DEBUG_KMS("creating tmp fb for load-detection\n");
>   fb = intel_framebuffer_create_for_mode(dev, mode, 24, 32);
> - old->release_fb = fb;
>   } else
>   DRM_DEBUG_KMS("reusing fbdev for load-detection framebuffer\n");
>   if (IS_ERR(fb)) {
> @@ -10541,15 +10546,16 @@ retry:
>   if (ret)
>   goto fail;
>  
> - drm_mode_copy(&crtc_state->base.mode, mode);
> + drm_framebuffer_unreference(fb);
> +
> + ret = drm_atomic_set_mode_for_crtc(&crtc_state->base, mode);
> + if (ret)
> + goto fail;
>  
>   if (drm_atomic_commit(state)) {
>   DRM_DEBUG_KMS("failed to set mode on load-detect pipe\n");
> - if (old->release_fb)
> - old

Re: [Intel-gfx] [PATCH 1/6] drm/i915: Use atomic state to obtain load detection crtc.

2016-02-02 Thread Maarten Lankhorst
Op 01-02-16 om 18:09 schreef Ville Syrjälä:
> On Mon, Feb 01, 2016 at 02:43:57PM +0100, Maarten Lankhorst wrote:
>> Instead of restoring dpms and a flag for whether a temp fb is allocated 
>> duplicate
>> the old plane_state and crtc_state, and restore the members we potentially 
>> touched.
>>
>> Signed-off-by: Maarten Lankhorst 
>> ---
>>  drivers/gpu/drm/i915/intel_display.c | 128 
>> ---
>>  drivers/gpu/drm/i915/intel_drv.h |   4 +-
>>  2 files changed, 76 insertions(+), 56 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/intel_display.c 
>> b/drivers/gpu/drm/i915/intel_display.c
>> index 4d8c9f7857db..0702ce8ec36a 100644
>> --- a/drivers/gpu/drm/i915/intel_display.c
>> +++ b/drivers/gpu/drm/i915/intel_display.c
>> @@ -10361,6 +10361,7 @@ mode_fits_in_fbdev(struct drm_device *dev,
>>  if (obj->base.size < mode->vdisplay * fb->pitches[0])
>>  return NULL;
>>  
>> +drm_framebuffer_reference(fb);
>>  return fb;
>>  #else
>>  return NULL;
>> @@ -10426,6 +10427,9 @@ bool intel_get_load_detect_pipe(struct drm_connector 
>> *connector,
>>encoder->base.id, encoder->name);
>>  
>>  retry:
>> +old->old_pipe_config = NULL;
>> +old->old_plane_state = NULL;
>> +
>>  ret = drm_modeset_lock(&config->connection_mutex, ctx);
>>  if (ret)
>>  goto fail;
>> @@ -10441,24 +10445,15 @@ retry:
>>   */
>>  
>>  /* See if we already have a CRTC for this connector */
>> -if (encoder->crtc) {
>> -crtc = encoder->crtc;
>> +if (connector->state->crtc) {
> All these connector->state accesses made me a bit uneasy, but we did
> indeed grab connection_mutex already so it should be fine. It's even
> more troubling seeing connector->state accessed outside
> intel_get_load_detect_pipe() in the later patches, but it seems it's
> only done if intel_get_load_detect_pipe() succeeded which means we
> should be holding the right lock.
>
> Dunno, maybe there should be some comments explaining this stuff.
> Or maybe maybe we should have a helper to return the current
> connector state that also asserts that the right lock is held?
I'm not sure how to proceed on that, I do think all accesses should be cleaned 
up,
but I'm not sure yet what the path forward is, and so I want to leave it for a 
different series.

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 1/6] drm/i915: Use atomic state to obtain load detection crtc.

2016-02-02 Thread Maarten Lankhorst
Op 01-02-16 om 17:08 schreef Ville Syrjälä:
> On Mon, Feb 01, 2016 at 02:43:57PM +0100, Maarten Lankhorst wrote:
>> Instead of restoring dpms and a flag for whether a temp fb is allocated 
>> duplicate
>> the old plane_state and crtc_state, and restore the members we potentially 
>> touched.
>>
>> Signed-off-by: Maarten Lankhorst 
>> ---
>>  drivers/gpu/drm/i915/intel_display.c | 128 
>> ---
>>  drivers/gpu/drm/i915/intel_drv.h |   4 +-
>>  2 files changed, 76 insertions(+), 56 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/intel_display.c 
>> b/drivers/gpu/drm/i915/intel_display.c
>> index 4d8c9f7857db..0702ce8ec36a 100644
>> --- a/drivers/gpu/drm/i915/intel_display.c
>> +++ b/drivers/gpu/drm/i915/intel_display.c
>> @@ -10361,6 +10361,7 @@ mode_fits_in_fbdev(struct drm_device *dev,
>>  if (obj->base.size < mode->vdisplay * fb->pitches[0])
>>  return NULL;
>>  
>> +drm_framebuffer_reference(fb);
>>  return fb;
>>  #else
>>  return NULL;
>> @@ -10426,6 +10427,9 @@ bool intel_get_load_detect_pipe(struct drm_connector 
>> *connector,
>>encoder->base.id, encoder->name);
>>  
>>  retry:
>> +old->old_pipe_config = NULL;
>> +old->old_plane_state = NULL;
>> +
>>  ret = drm_modeset_lock(&config->connection_mutex, ctx);
>>  if (ret)
>>  goto fail;
>> @@ -10441,24 +10445,15 @@ retry:
>>   */
>>  
>>  /* See if we already have a CRTC for this connector */
>> -if (encoder->crtc) {
>> -crtc = encoder->crtc;
>> +if (connector->state->crtc) {
>> +crtc = connector->state->crtc;
>>  
>>  ret = drm_modeset_lock(&crtc->mutex, ctx);
>>  if (ret)
>>  goto fail;
>> -ret = drm_modeset_lock(&crtc->primary->mutex, ctx);
>> -if (ret)
>> -goto fail;
>> -
>> -old->dpms_mode = connector->dpms;
>> -old->load_detect_temp = false;
>>  
>>  /* Make sure the crtc and connector are running */
>> -if (connector->dpms != DRM_MODE_DPMS_ON)
>> -connector->funcs->dpms(connector, DRM_MODE_DPMS_ON);
>> -
>> -return true;
>> +goto found;
>>  }
>>  
>>  /* Find an unused one (if possible) */
>> @@ -10466,8 +10461,15 @@ retry:
>>  i++;
>>  if (!(encoder->possible_crtcs & (1 << i)))
>>  continue;
>> -if (possible_crtc->state->enable)
>> +
>> +ret = drm_modeset_lock(&possible_crtc->mutex, ctx);
>> +if (ret)
>> +goto fail;
>> +
>> +if (possible_crtc->state->enable) {
>> +drm_modeset_unlock(&possible_crtc->mutex);
>>  continue;
>> +}
>>  
>>  crtc = possible_crtc;
>>  break;
>> @@ -10481,17 +10483,19 @@ retry:
>>  goto fail;
>>  }
>>  
>> -ret = drm_modeset_lock(&crtc->mutex, ctx);
>> -if (ret)
>> -goto fail;
>> +found:
>> +intel_crtc = to_intel_crtc(crtc);
>> +
>>  ret = drm_modeset_lock(&crtc->primary->mutex, ctx);
>>  if (ret)
>>  goto fail;
>>  
>> -intel_crtc = to_intel_crtc(crtc);
>> -old->dpms_mode = connector->dpms;
>> -old->load_detect_temp = true;
>> -old->release_fb = NULL;
>> +old->old_pipe_config = intel_crtc_duplicate_state(crtc);
>> +old->old_plane_state = intel_plane_duplicate_state(crtc->primary);
>> +if (!old->old_pipe_config || !old->old_plane_state) {
>> +ret = -ENOMEM;
>> +goto fail;
>> +}
>>  
>>  state = drm_atomic_state_alloc(dev);
>>  if (!state)
>> @@ -10505,7 +10509,9 @@ retry:
>>  goto fail;
>>  }
>>  
>> -connector_state->crtc = crtc;
>> +ret = drm_atomic_set_crtc_for_connector(connector_state, crtc);
>> +if (ret)
>> +goto fail;
>>  
>>  crtc_state = intel_atomic_get_crtc_state(state, intel_crtc);
>>  if (IS_ERR(crtc_state)) {
>> @@ -10529,7 +10535,6 @@ retry:
>>  if (fb == NULL) {
>>  DRM_DEBUG_KMS("creating tmp fb for load-detection\n");
>>  fb = intel_framebuffer_create_for_mode(dev, mode, 24, 32);
>> -old->release_fb = fb;
>>  } else
>>  DRM_DEBUG_KMS("reusing fbdev for load-detection framebuffer\n");
>>  if (IS_ERR(fb)) {
>> @@ -10541,15 +10546,16 @@ retry:
>>  if (ret)
>>  goto fail;
>>  
>> -drm_mode_copy(&crtc_state->base.mode, mode);
>> +drm_framebuffer_unreference(fb);
>> +
>> +ret = drm_atomic_set_mode_for_crtc(&crtc_state->base, mode);
>> +if (ret)
>> +goto fail;
>>  
>>  if (drm_atomic_commit(state)) {
>>  DRM_DEBUG_KMS("failed to set mode on load-detect pipe\n");
>> -if (old->release_fb)
>> -old->release_fb->funcs->destroy(old->release_fb);
>>  goto fail;
>>  

Re: [Intel-gfx] [PATCH 1/6] drm/i915: Use atomic state to obtain load detection crtc.

2016-02-01 Thread Ville Syrjälä
On Mon, Feb 01, 2016 at 02:43:57PM +0100, Maarten Lankhorst wrote:
> Instead of restoring dpms and a flag for whether a temp fb is allocated 
> duplicate
> the old plane_state and crtc_state, and restore the members we potentially 
> touched.
> 
> Signed-off-by: Maarten Lankhorst 
> ---
>  drivers/gpu/drm/i915/intel_display.c | 128 
> ---
>  drivers/gpu/drm/i915/intel_drv.h |   4 +-
>  2 files changed, 76 insertions(+), 56 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_display.c 
> b/drivers/gpu/drm/i915/intel_display.c
> index 4d8c9f7857db..0702ce8ec36a 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -10361,6 +10361,7 @@ mode_fits_in_fbdev(struct drm_device *dev,
>   if (obj->base.size < mode->vdisplay * fb->pitches[0])
>   return NULL;
>  
> + drm_framebuffer_reference(fb);
>   return fb;
>  #else
>   return NULL;
> @@ -10426,6 +10427,9 @@ bool intel_get_load_detect_pipe(struct drm_connector 
> *connector,
> encoder->base.id, encoder->name);
>  
>  retry:
> + old->old_pipe_config = NULL;
> + old->old_plane_state = NULL;
> +
>   ret = drm_modeset_lock(&config->connection_mutex, ctx);
>   if (ret)
>   goto fail;
> @@ -10441,24 +10445,15 @@ retry:
>*/
>  
>   /* See if we already have a CRTC for this connector */
> - if (encoder->crtc) {
> - crtc = encoder->crtc;
> + if (connector->state->crtc) {

All these connector->state accesses made me a bit uneasy, but we did
indeed grab connection_mutex already so it should be fine. It's even
more troubling seeing connector->state accessed outside
intel_get_load_detect_pipe() in the later patches, but it seems it's
only done if intel_get_load_detect_pipe() succeeded which means we
should be holding the right lock.

Dunno, maybe there should be some comments explaining this stuff.
Or maybe maybe we should have a helper to return the current
connector state that also asserts that the right lock is held?

-- 
Ville Syrjälä
Intel OTC
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 1/6] drm/i915: Use atomic state to obtain load detection crtc.

2016-02-01 Thread Ville Syrjälä
On Mon, Feb 01, 2016 at 02:43:57PM +0100, Maarten Lankhorst wrote:
> Instead of restoring dpms and a flag for whether a temp fb is allocated 
> duplicate
> the old plane_state and crtc_state, and restore the members we potentially 
> touched.
> 
> Signed-off-by: Maarten Lankhorst 
> ---
>  drivers/gpu/drm/i915/intel_display.c | 128 
> ---
>  drivers/gpu/drm/i915/intel_drv.h |   4 +-
>  2 files changed, 76 insertions(+), 56 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_display.c 
> b/drivers/gpu/drm/i915/intel_display.c
> index 4d8c9f7857db..0702ce8ec36a 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -10361,6 +10361,7 @@ mode_fits_in_fbdev(struct drm_device *dev,
>   if (obj->base.size < mode->vdisplay * fb->pitches[0])
>   return NULL;
>  
> + drm_framebuffer_reference(fb);
>   return fb;
>  #else
>   return NULL;
> @@ -10426,6 +10427,9 @@ bool intel_get_load_detect_pipe(struct drm_connector 
> *connector,
> encoder->base.id, encoder->name);
>  
>  retry:
> + old->old_pipe_config = NULL;
> + old->old_plane_state = NULL;
> +
>   ret = drm_modeset_lock(&config->connection_mutex, ctx);
>   if (ret)
>   goto fail;
> @@ -10441,24 +10445,15 @@ retry:
>*/
>  
>   /* See if we already have a CRTC for this connector */
> - if (encoder->crtc) {
> - crtc = encoder->crtc;
> + if (connector->state->crtc) {
> + crtc = connector->state->crtc;
>  
>   ret = drm_modeset_lock(&crtc->mutex, ctx);
>   if (ret)
>   goto fail;
> - ret = drm_modeset_lock(&crtc->primary->mutex, ctx);
> - if (ret)
> - goto fail;
> -
> - old->dpms_mode = connector->dpms;
> - old->load_detect_temp = false;
>  
>   /* Make sure the crtc and connector are running */
> - if (connector->dpms != DRM_MODE_DPMS_ON)
> - connector->funcs->dpms(connector, DRM_MODE_DPMS_ON);
> -
> - return true;
> + goto found;
>   }
>  
>   /* Find an unused one (if possible) */
> @@ -10466,8 +10461,15 @@ retry:
>   i++;
>   if (!(encoder->possible_crtcs & (1 << i)))
>   continue;
> - if (possible_crtc->state->enable)
> +
> + ret = drm_modeset_lock(&possible_crtc->mutex, ctx);
> + if (ret)
> + goto fail;
> +
> + if (possible_crtc->state->enable) {
> + drm_modeset_unlock(&possible_crtc->mutex);
>   continue;
> + }
>  
>   crtc = possible_crtc;
>   break;
> @@ -10481,17 +10483,19 @@ retry:
>   goto fail;
>   }
>  
> - ret = drm_modeset_lock(&crtc->mutex, ctx);
> - if (ret)
> - goto fail;
> +found:
> + intel_crtc = to_intel_crtc(crtc);
> +
>   ret = drm_modeset_lock(&crtc->primary->mutex, ctx);
>   if (ret)
>   goto fail;
>  
> - intel_crtc = to_intel_crtc(crtc);
> - old->dpms_mode = connector->dpms;
> - old->load_detect_temp = true;
> - old->release_fb = NULL;
> + old->old_pipe_config = intel_crtc_duplicate_state(crtc);
> + old->old_plane_state = intel_plane_duplicate_state(crtc->primary);
> + if (!old->old_pipe_config || !old->old_plane_state) {
> + ret = -ENOMEM;
> + goto fail;
> + }
>  
>   state = drm_atomic_state_alloc(dev);
>   if (!state)
> @@ -10505,7 +10509,9 @@ retry:
>   goto fail;
>   }
>  
> - connector_state->crtc = crtc;
> + ret = drm_atomic_set_crtc_for_connector(connector_state, crtc);
> + if (ret)
> + goto fail;
>  
>   crtc_state = intel_atomic_get_crtc_state(state, intel_crtc);
>   if (IS_ERR(crtc_state)) {
> @@ -10529,7 +10535,6 @@ retry:
>   if (fb == NULL) {
>   DRM_DEBUG_KMS("creating tmp fb for load-detection\n");
>   fb = intel_framebuffer_create_for_mode(dev, mode, 24, 32);
> - old->release_fb = fb;
>   } else
>   DRM_DEBUG_KMS("reusing fbdev for load-detection framebuffer\n");
>   if (IS_ERR(fb)) {
> @@ -10541,15 +10546,16 @@ retry:
>   if (ret)
>   goto fail;
>  
> - drm_mode_copy(&crtc_state->base.mode, mode);
> + drm_framebuffer_unreference(fb);
> +
> + ret = drm_atomic_set_mode_for_crtc(&crtc_state->base, mode);
> + if (ret)
> + goto fail;
>  
>   if (drm_atomic_commit(state)) {
>   DRM_DEBUG_KMS("failed to set mode on load-detect pipe\n");
> - if (old->release_fb)
> - old->release_fb->funcs->destroy(old->release_fb);
>   goto fail;
>   }
> - crtc->primary->crtc = crtc;
>  
>   /* let the connector get through one ful