On Thu, 02 Mar 2023, Ville Syrjälä <ville.syrj...@linux.intel.com> wrote:
> On Thu, Mar 02, 2023 at 06:49:36PM +0200, Jani Nikula wrote:
>> Split out the RPS parts so they can be conditionally compiled out later.
>> 
>> Signed-off-by: Jani Nikula <jani.nik...@intel.com>
>
> Reviewed-by: Ville Syrjälä <ville.syrj...@linux.intel.com>

Thanks, pushed to din.

BR,
Jani.

>
>> ---
>>  drivers/gpu/drm/i915/Makefile                 |  1 +
>>  .../gpu/drm/i915/display/intel_atomic_plane.c | 79 ++----------------
>>  .../gpu/drm/i915/display/intel_display_rps.c  | 81 +++++++++++++++++++
>>  .../gpu/drm/i915/display/intel_display_rps.h  | 22 +++++
>>  4 files changed, 111 insertions(+), 72 deletions(-)
>>  create mode 100644 drivers/gpu/drm/i915/display/intel_display_rps.c
>>  create mode 100644 drivers/gpu/drm/i915/display/intel_display_rps.h
>> 
>> diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
>> index b2f91a1f8268..8e46f57e4569 100644
>> --- a/drivers/gpu/drm/i915/Makefile
>> +++ b/drivers/gpu/drm/i915/Makefile
>> @@ -239,6 +239,7 @@ i915-y += \
>>      display/intel_display_power.o \
>>      display/intel_display_power_map.o \
>>      display/intel_display_power_well.o \
>> +    display/intel_display_rps.o \
>>      display/intel_dmc.o \
>>      display/intel_dpio_phy.o \
>>      display/intel_dpll.o \
>> diff --git a/drivers/gpu/drm/i915/display/intel_atomic_plane.c 
>> b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
>> index 3bd8f7eb75a6..719a60e278f3 100644
>> --- a/drivers/gpu/drm/i915/display/intel_atomic_plane.c
>> +++ b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
>> @@ -34,11 +34,10 @@
>>  #include <drm/drm_atomic_helper.h>
>>  #include <drm/drm_fourcc.h>
>>  
>> -#include "gt/intel_rps.h"
>> -
>>  #include "i915_config.h"
>>  #include "intel_atomic_plane.h"
>>  #include "intel_cdclk.h"
>> +#include "intel_display_rps.h"
>>  #include "intel_display_trace.h"
>>  #include "intel_display_types.h"
>>  #include "intel_fb.h"
>> @@ -941,64 +940,6 @@ int intel_atomic_plane_check_clipping(struct 
>> intel_plane_state *plane_state,
>>      return 0;
>>  }
>>  
>> -struct wait_rps_boost {
>> -    struct wait_queue_entry wait;
>> -
>> -    struct drm_crtc *crtc;
>> -    struct i915_request *request;
>> -};
>> -
>> -static int do_rps_boost(struct wait_queue_entry *_wait,
>> -                    unsigned mode, int sync, void *key)
>> -{
>> -    struct wait_rps_boost *wait = container_of(_wait, typeof(*wait), wait);
>> -    struct i915_request *rq = wait->request;
>> -
>> -    /*
>> -     * If we missed the vblank, but the request is already running it
>> -     * is reasonable to assume that it will complete before the next
>> -     * vblank without our intervention, so leave RPS alone.
>> -     */
>> -    if (!i915_request_started(rq))
>> -            intel_rps_boost(rq);
>> -    i915_request_put(rq);
>> -
>> -    drm_crtc_vblank_put(wait->crtc);
>> -
>> -    list_del(&wait->wait.entry);
>> -    kfree(wait);
>> -    return 1;
>> -}
>> -
>> -static void add_rps_boost_after_vblank(struct drm_crtc *crtc,
>> -                                   struct dma_fence *fence)
>> -{
>> -    struct wait_rps_boost *wait;
>> -
>> -    if (!dma_fence_is_i915(fence))
>> -            return;
>> -
>> -    if (DISPLAY_VER(to_i915(crtc->dev)) < 6)
>> -            return;
>> -
>> -    if (drm_crtc_vblank_get(crtc))
>> -            return;
>> -
>> -    wait = kmalloc(sizeof(*wait), GFP_KERNEL);
>> -    if (!wait) {
>> -            drm_crtc_vblank_put(crtc);
>> -            return;
>> -    }
>> -
>> -    wait->request = to_request(dma_fence_get(fence));
>> -    wait->crtc = crtc;
>> -
>> -    wait->wait.func = do_rps_boost;
>> -    wait->wait.flags = 0;
>> -
>> -    add_wait_queue(drm_crtc_vblank_waitqueue(crtc), &wait->wait);
>> -}
>> -
>>  /**
>>   * intel_prepare_plane_fb - Prepare fb for usage on plane
>>   * @_plane: drm plane to prepare for
>> @@ -1089,13 +1030,13 @@ intel_prepare_plane_fb(struct drm_plane *_plane,
>>              dma_resv_iter_begin(&cursor, obj->base.resv,
>>                                  DMA_RESV_USAGE_WRITE);
>>              dma_resv_for_each_fence_unlocked(&cursor, fence) {
>> -                    add_rps_boost_after_vblank(new_plane_state->hw.crtc,
>> -                                               fence);
>> +                    
>> intel_display_rps_boost_after_vblank(new_plane_state->hw.crtc,
>> +                                                         fence);
>>              }
>>              dma_resv_iter_end(&cursor);
>>      } else {
>> -            add_rps_boost_after_vblank(new_plane_state->hw.crtc,
>> -                                       new_plane_state->uapi.fence);
>> +            intel_display_rps_boost_after_vblank(new_plane_state->hw.crtc,
>> +                                                 
>> new_plane_state->uapi.fence);
>>      }
>>  
>>      /*
>> @@ -1106,10 +1047,7 @@ intel_prepare_plane_fb(struct drm_plane *_plane,
>>       * that are not quite steady state without resorting to forcing
>>       * maximum clocks following a vblank miss (see do_rps_boost()).
>>       */
>> -    if (!state->rps_interactive) {
>> -            intel_rps_mark_interactive(&to_gt(dev_priv)->rps, true);
>> -            state->rps_interactive = true;
>> -    }
>> +    intel_display_rps_mark_interactive(dev_priv, state, true);
>>  
>>      return 0;
>>  
>> @@ -1140,10 +1078,7 @@ intel_cleanup_plane_fb(struct drm_plane *plane,
>>      if (!obj)
>>              return;
>>  
>> -    if (state->rps_interactive) {
>> -            intel_rps_mark_interactive(&to_gt(dev_priv)->rps, false);
>> -            state->rps_interactive = false;
>> -    }
>> +    intel_display_rps_mark_interactive(dev_priv, state, false);
>>  
>>      /* Should only be called after a successful intel_prepare_plane_fb()! */
>>      intel_plane_unpin_fb(old_plane_state);
>> diff --git a/drivers/gpu/drm/i915/display/intel_display_rps.c 
>> b/drivers/gpu/drm/i915/display/intel_display_rps.c
>> new file mode 100644
>> index 000000000000..918d0327169a
>> --- /dev/null
>> +++ b/drivers/gpu/drm/i915/display/intel_display_rps.c
>> @@ -0,0 +1,81 @@
>> +// SPDX-License-Identifier: MIT
>> +/*
>> + * Copyright © 2023 Intel Corporation
>> + */
>> +
>> +#include <drm/drm_crtc.h>
>> +#include <drm/drm_vblank.h>
>> +
>> +#include "gt/intel_rps.h"
>> +#include "i915_drv.h"
>> +#include "intel_display_rps.h"
>> +#include "intel_display_types.h"
>> +
>> +struct wait_rps_boost {
>> +    struct wait_queue_entry wait;
>> +
>> +    struct drm_crtc *crtc;
>> +    struct i915_request *request;
>> +};
>> +
>> +static int do_rps_boost(struct wait_queue_entry *_wait,
>> +                    unsigned mode, int sync, void *key)
>> +{
>> +    struct wait_rps_boost *wait = container_of(_wait, typeof(*wait), wait);
>> +    struct i915_request *rq = wait->request;
>> +
>> +    /*
>> +     * If we missed the vblank, but the request is already running it
>> +     * is reasonable to assume that it will complete before the next
>> +     * vblank without our intervention, so leave RPS alone.
>> +     */
>> +    if (!i915_request_started(rq))
>> +            intel_rps_boost(rq);
>> +    i915_request_put(rq);
>> +
>> +    drm_crtc_vblank_put(wait->crtc);
>> +
>> +    list_del(&wait->wait.entry);
>> +    kfree(wait);
>> +    return 1;
>> +}
>> +
>> +void intel_display_rps_boost_after_vblank(struct drm_crtc *crtc,
>> +                                      struct dma_fence *fence)
>> +{
>> +    struct wait_rps_boost *wait;
>> +
>> +    if (!dma_fence_is_i915(fence))
>> +            return;
>> +
>> +    if (DISPLAY_VER(to_i915(crtc->dev)) < 6)
>> +            return;
>> +
>> +    if (drm_crtc_vblank_get(crtc))
>> +            return;
>> +
>> +    wait = kmalloc(sizeof(*wait), GFP_KERNEL);
>> +    if (!wait) {
>> +            drm_crtc_vblank_put(crtc);
>> +            return;
>> +    }
>> +
>> +    wait->request = to_request(dma_fence_get(fence));
>> +    wait->crtc = crtc;
>> +
>> +    wait->wait.func = do_rps_boost;
>> +    wait->wait.flags = 0;
>> +
>> +    add_wait_queue(drm_crtc_vblank_waitqueue(crtc), &wait->wait);
>> +}
>> +
>> +void intel_display_rps_mark_interactive(struct drm_i915_private *i915,
>> +                                    struct intel_atomic_state *state,
>> +                                    bool interactive)
>> +{
>> +    if (state->rps_interactive == interactive)
>> +            return;
>> +
>> +    intel_rps_mark_interactive(&to_gt(i915)->rps, interactive);
>> +    state->rps_interactive = interactive;
>> +}
>> diff --git a/drivers/gpu/drm/i915/display/intel_display_rps.h 
>> b/drivers/gpu/drm/i915/display/intel_display_rps.h
>> new file mode 100644
>> index 000000000000..e19009c2371a
>> --- /dev/null
>> +++ b/drivers/gpu/drm/i915/display/intel_display_rps.h
>> @@ -0,0 +1,22 @@
>> +/* SPDX-License-Identifier: MIT */
>> +/*
>> + * Copyright © 2023 Intel Corporation
>> + */
>> +
>> +#ifndef __INTEL_DISPLAY_RPS_H__
>> +#define __INTEL_DISPLAY_RPS_H__
>> +
>> +#include <linux/types.h>
>> +
>> +struct dma_fence;
>> +struct drm_crtc;
>> +struct drm_i915_private;
>> +struct intel_atomic_state;
>> +
>> +void intel_display_rps_boost_after_vblank(struct drm_crtc *crtc,
>> +                                      struct dma_fence *fence);
>> +void intel_display_rps_mark_interactive(struct drm_i915_private *i915,
>> +                                    struct intel_atomic_state *state,
>> +                                    bool interactive);
>> +
>> +#endif /* __INTEL_DISPLAY_RPS_H__ */
>> -- 
>> 2.39.1

-- 
Jani Nikula, Intel Open Source Graphics Center

Reply via email to