2016-12-12 13:29:48 +01:00
/*
* Copyright © 2013 Intel Corporation
*
* Permission is hereby granted , free of charge , to any person obtaining a
* copy of this software and associated documentation files ( the " Software " ) ,
* to deal in the Software without restriction , including without limitation
* the rights to use , copy , modify , merge , publish , distribute , sublicense ,
* and / or sell copies of the Software , and to permit persons to whom the
* Software is furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice ( including the next
* paragraph ) shall be included in all copies or substantial portions of the
* Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
* LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING
* FROM , OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE .
*
* Author : Damien Lespiau < damien . lespiau @ intel . com >
*
*/
# include <linux/circ_buf.h>
# include <linux/ctype.h>
# include <linux/debugfs.h>
2019-04-05 14:00:20 +03:00
# include <linux/seq_file.h>
2019-04-29 15:53:31 +03:00
# include "intel_atomic.h"
2019-08-06 14:39:33 +03:00
# include "intel_display_types.h"
2019-04-05 14:00:20 +03:00
# include "intel_pipe_crc.h"
2016-12-12 13:29:48 +01:00
static const char * const pipe_crc_sources [ ] = {
2019-02-14 21:22:17 +02:00
[ INTEL_PIPE_CRC_SOURCE_NONE ] = " none " ,
[ INTEL_PIPE_CRC_SOURCE_PLANE1 ] = " plane1 " ,
[ INTEL_PIPE_CRC_SOURCE_PLANE2 ] = " plane2 " ,
2019-02-14 21:22:19 +02:00
[ INTEL_PIPE_CRC_SOURCE_PLANE3 ] = " plane3 " ,
[ INTEL_PIPE_CRC_SOURCE_PLANE4 ] = " plane4 " ,
[ INTEL_PIPE_CRC_SOURCE_PLANE5 ] = " plane5 " ,
[ INTEL_PIPE_CRC_SOURCE_PLANE6 ] = " plane6 " ,
[ INTEL_PIPE_CRC_SOURCE_PLANE7 ] = " plane7 " ,
2019-02-14 21:22:17 +02:00
[ INTEL_PIPE_CRC_SOURCE_PIPE ] = " pipe " ,
[ INTEL_PIPE_CRC_SOURCE_TV ] = " TV " ,
[ INTEL_PIPE_CRC_SOURCE_DP_B ] = " DP-B " ,
[ INTEL_PIPE_CRC_SOURCE_DP_C ] = " DP-C " ,
[ INTEL_PIPE_CRC_SOURCE_DP_D ] = " DP-D " ,
[ INTEL_PIPE_CRC_SOURCE_AUTO ] = " auto " ,
2016-12-12 13:29:48 +01:00
} ;
static int i8xx_pipe_crc_ctl_reg ( enum intel_pipe_crc_source * source ,
2019-01-16 11:15:19 +02:00
u32 * val )
2016-12-12 13:29:48 +01:00
{
if ( * source = = INTEL_PIPE_CRC_SOURCE_AUTO )
* source = INTEL_PIPE_CRC_SOURCE_PIPE ;
switch ( * source ) {
case INTEL_PIPE_CRC_SOURCE_PIPE :
* val = PIPE_CRC_ENABLE | PIPE_CRC_INCLUDE_BORDER_I8XX ;
break ;
case INTEL_PIPE_CRC_SOURCE_NONE :
* val = 0 ;
break ;
default :
return - EINVAL ;
}
return 0 ;
}
static int i9xx_pipe_crc_auto_source ( struct drm_i915_private * dev_priv ,
enum pipe pipe ,
enum intel_pipe_crc_source * source )
{
struct drm_device * dev = & dev_priv - > drm ;
struct intel_encoder * encoder ;
struct intel_crtc * crtc ;
struct intel_digital_port * dig_port ;
int ret = 0 ;
* source = INTEL_PIPE_CRC_SOURCE_PIPE ;
drm_modeset_lock_all ( dev ) ;
for_each_intel_encoder ( dev , encoder ) {
if ( ! encoder - > base . crtc )
continue ;
crtc = to_intel_crtc ( encoder - > base . crtc ) ;
if ( crtc - > pipe ! = pipe )
continue ;
switch ( encoder - > type ) {
case INTEL_OUTPUT_TVOUT :
* source = INTEL_PIPE_CRC_SOURCE_TV ;
break ;
case INTEL_OUTPUT_DP :
case INTEL_OUTPUT_EDP :
2019-12-04 20:05:43 +02:00
dig_port = enc_to_dig_port ( encoder ) ;
2017-11-09 17:24:34 +02:00
switch ( dig_port - > base . port ) {
2016-12-12 13:29:48 +01:00
case PORT_B :
* source = INTEL_PIPE_CRC_SOURCE_DP_B ;
break ;
case PORT_C :
* source = INTEL_PIPE_CRC_SOURCE_DP_C ;
break ;
case PORT_D :
* source = INTEL_PIPE_CRC_SOURCE_DP_D ;
break ;
default :
drm/i915/display: Make WARN* drm specific where drm_device ptr is available
drm specific WARN* calls include device information in the
backtrace, so we know what device the warnings originate from.
Covert all the calls of WARN* with device specific drm_WARN*
variants in functions where drm_device or drm_i915_private struct
pointer is readily available.
The conversion was done automatically with below coccinelle semantic
patch. checkpatch errors/warnings are fixed manually.
@rule1@
identifier func, T;
@@
func(...) {
...
struct drm_device *T = ...;
<...
(
-WARN(
+drm_WARN(T,
...)
|
-WARN_ON(
+drm_WARN_ON(T,
...)
|
-WARN_ONCE(
+drm_WARN_ONCE(T,
...)
|
-WARN_ON_ONCE(
+drm_WARN_ON_ONCE(T,
...)
)
...>
}
@rule2@
identifier func, T;
@@
func(struct drm_device *T,...) {
<...
(
-WARN(
+drm_WARN(T,
...)
|
-WARN_ON(
+drm_WARN_ON(T,
...)
|
-WARN_ONCE(
+drm_WARN_ONCE(T,
...)
|
-WARN_ON_ONCE(
+drm_WARN_ON_ONCE(T,
...)
)
...>
}
@rule3@
identifier func, T;
@@
func(...) {
...
struct drm_i915_private *T = ...;
<+...
(
-WARN(
+drm_WARN(&T->drm,
...)
|
-WARN_ON(
+drm_WARN_ON(&T->drm,
...)
|
-WARN_ONCE(
+drm_WARN_ONCE(&T->drm,
...)
|
-WARN_ON_ONCE(
+drm_WARN_ON_ONCE(&T->drm,
...)
)
...+>
}
@rule4@
identifier func, T;
@@
func(struct drm_i915_private *T,...) {
<+...
(
-WARN(
+drm_WARN(&T->drm,
...)
|
-WARN_ON(
+drm_WARN_ON(&T->drm,
...)
|
-WARN_ONCE(
+drm_WARN_ONCE(&T->drm,
...)
|
-WARN_ON_ONCE(
+drm_WARN_ON_ONCE(&T->drm,
...)
)
...+>
}
Signed-off-by: Pankaj Bharadiya <pankaj.laxminarayan.bharadiya@intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200128181603.27767-20-pankaj.laxminarayan.bharadiya@intel.com
2020-01-28 23:46:01 +05:30
drm_WARN ( dev , 1 , " nonexisting DP port %c \n " ,
port_name ( dig_port - > base . port ) ) ;
2016-12-12 13:29:48 +01:00
break ;
}
break ;
default :
break ;
}
}
drm_modeset_unlock_all ( dev ) ;
return ret ;
}
static int vlv_pipe_crc_ctl_reg ( struct drm_i915_private * dev_priv ,
enum pipe pipe ,
enum intel_pipe_crc_source * source ,
2019-01-16 11:15:19 +02:00
u32 * val )
2016-12-12 13:29:48 +01:00
{
bool need_stable_symbols = false ;
if ( * source = = INTEL_PIPE_CRC_SOURCE_AUTO ) {
int ret = i9xx_pipe_crc_auto_source ( dev_priv , pipe , source ) ;
if ( ret )
return ret ;
}
switch ( * source ) {
case INTEL_PIPE_CRC_SOURCE_PIPE :
* val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_PIPE_VLV ;
break ;
case INTEL_PIPE_CRC_SOURCE_DP_B :
* val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_DP_B_VLV ;
need_stable_symbols = true ;
break ;
case INTEL_PIPE_CRC_SOURCE_DP_C :
* val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_DP_C_VLV ;
need_stable_symbols = true ;
break ;
case INTEL_PIPE_CRC_SOURCE_DP_D :
if ( ! IS_CHERRYVIEW ( dev_priv ) )
return - EINVAL ;
* val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_DP_D_VLV ;
need_stable_symbols = true ;
break ;
case INTEL_PIPE_CRC_SOURCE_NONE :
* val = 0 ;
break ;
default :
return - EINVAL ;
}
/*
* When the pipe CRC tap point is after the transcoders we need
* to tweak symbol - level features to produce a deterministic series of
* symbols for a given frame . We need to reset those features only once
* a frame ( instead of every nth symbol ) :
* - DC - balance : used to ensure a better clock recovery from the data
* link ( SDVO )
* - DisplayPort scrambling : used for EMI reduction
*/
if ( need_stable_symbols ) {
drm/i915/pipe_crc: use intel_de_*() functions for register access
The implicit "dev_priv" local variable use has been a long-standing pain
point in the register access macros I915_READ(), I915_WRITE(),
POSTING_READ(), I915_READ_FW(), and I915_WRITE_FW().
Replace them with the corresponding new display engine register
accessors intel_de_read(), intel_de_write(), intel_de_posting_read(),
intel_de_read_fw(), and intel_de_write_fw().
No functional changes.
Generated using the following semantic patch:
@@
expression REG, OFFSET;
@@
- I915_READ(REG)
+ intel_de_read(dev_priv, REG)
@@
expression REG, OFFSET;
@@
- POSTING_READ(REG)
+ intel_de_posting_read(dev_priv, REG)
@@
expression REG, OFFSET;
@@
- I915_WRITE(REG, OFFSET)
+ intel_de_write(dev_priv, REG, OFFSET)
@@
expression REG;
@@
- I915_READ_FW(REG)
+ intel_de_read_fw(dev_priv, REG)
@@
expression REG, OFFSET;
@@
- I915_WRITE_FW(REG, OFFSET)
+ intel_de_write_fw(dev_priv, REG, OFFSET)
Acked-by: Chris Wilson <chris@chris-wilson.co.uk>
Acked-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Acked-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/0af05f6035046a515097da398de8722c0ca23e56.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:46 +02:00
u32 tmp = intel_de_read ( dev_priv , PORT_DFT2_G4X ) ;
2016-12-12 13:29:48 +01:00
tmp | = DC_BALANCE_RESET_VLV ;
switch ( pipe ) {
case PIPE_A :
tmp | = PIPE_A_SCRAMBLE_RESET ;
break ;
case PIPE_B :
tmp | = PIPE_B_SCRAMBLE_RESET ;
break ;
case PIPE_C :
tmp | = PIPE_C_SCRAMBLE_RESET ;
break ;
default :
return - EINVAL ;
}
drm/i915/pipe_crc: use intel_de_*() functions for register access
The implicit "dev_priv" local variable use has been a long-standing pain
point in the register access macros I915_READ(), I915_WRITE(),
POSTING_READ(), I915_READ_FW(), and I915_WRITE_FW().
Replace them with the corresponding new display engine register
accessors intel_de_read(), intel_de_write(), intel_de_posting_read(),
intel_de_read_fw(), and intel_de_write_fw().
No functional changes.
Generated using the following semantic patch:
@@
expression REG, OFFSET;
@@
- I915_READ(REG)
+ intel_de_read(dev_priv, REG)
@@
expression REG, OFFSET;
@@
- POSTING_READ(REG)
+ intel_de_posting_read(dev_priv, REG)
@@
expression REG, OFFSET;
@@
- I915_WRITE(REG, OFFSET)
+ intel_de_write(dev_priv, REG, OFFSET)
@@
expression REG;
@@
- I915_READ_FW(REG)
+ intel_de_read_fw(dev_priv, REG)
@@
expression REG, OFFSET;
@@
- I915_WRITE_FW(REG, OFFSET)
+ intel_de_write_fw(dev_priv, REG, OFFSET)
Acked-by: Chris Wilson <chris@chris-wilson.co.uk>
Acked-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Acked-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/0af05f6035046a515097da398de8722c0ca23e56.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:46 +02:00
intel_de_write ( dev_priv , PORT_DFT2_G4X , tmp ) ;
2016-12-12 13:29:48 +01:00
}
return 0 ;
}
static int i9xx_pipe_crc_ctl_reg ( struct drm_i915_private * dev_priv ,
enum pipe pipe ,
enum intel_pipe_crc_source * source ,
2019-01-16 11:15:19 +02:00
u32 * val )
2016-12-12 13:29:48 +01:00
{
if ( * source = = INTEL_PIPE_CRC_SOURCE_AUTO ) {
int ret = i9xx_pipe_crc_auto_source ( dev_priv , pipe , source ) ;
if ( ret )
return ret ;
}
switch ( * source ) {
case INTEL_PIPE_CRC_SOURCE_PIPE :
* val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_PIPE_I9XX ;
break ;
case INTEL_PIPE_CRC_SOURCE_TV :
if ( ! SUPPORTS_TV ( dev_priv ) )
return - EINVAL ;
* val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_TV_PRE ;
break ;
case INTEL_PIPE_CRC_SOURCE_NONE :
* val = 0 ;
break ;
default :
2019-02-14 21:22:18 +02:00
/*
* The DP CRC source doesn ' t work on g4x .
* It can be made to work to some degree by selecting
* the correct CRC source before the port is enabled ,
* and not touching the CRC source bits again until
* the port is disabled . But even then the bits
* eventually get stuck and a reboot is needed to get
* working CRCs on the pipe again . Let ' s simply
* refuse to use DP CRCs on g4x .
*/
2016-12-12 13:29:48 +01:00
return - EINVAL ;
}
return 0 ;
}
static void vlv_undo_pipe_scramble_reset ( struct drm_i915_private * dev_priv ,
enum pipe pipe )
{
drm/i915/pipe_crc: use intel_de_*() functions for register access
The implicit "dev_priv" local variable use has been a long-standing pain
point in the register access macros I915_READ(), I915_WRITE(),
POSTING_READ(), I915_READ_FW(), and I915_WRITE_FW().
Replace them with the corresponding new display engine register
accessors intel_de_read(), intel_de_write(), intel_de_posting_read(),
intel_de_read_fw(), and intel_de_write_fw().
No functional changes.
Generated using the following semantic patch:
@@
expression REG, OFFSET;
@@
- I915_READ(REG)
+ intel_de_read(dev_priv, REG)
@@
expression REG, OFFSET;
@@
- POSTING_READ(REG)
+ intel_de_posting_read(dev_priv, REG)
@@
expression REG, OFFSET;
@@
- I915_WRITE(REG, OFFSET)
+ intel_de_write(dev_priv, REG, OFFSET)
@@
expression REG;
@@
- I915_READ_FW(REG)
+ intel_de_read_fw(dev_priv, REG)
@@
expression REG, OFFSET;
@@
- I915_WRITE_FW(REG, OFFSET)
+ intel_de_write_fw(dev_priv, REG, OFFSET)
Acked-by: Chris Wilson <chris@chris-wilson.co.uk>
Acked-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Acked-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/0af05f6035046a515097da398de8722c0ca23e56.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:46 +02:00
u32 tmp = intel_de_read ( dev_priv , PORT_DFT2_G4X ) ;
2016-12-12 13:29:48 +01:00
switch ( pipe ) {
case PIPE_A :
tmp & = ~ PIPE_A_SCRAMBLE_RESET ;
break ;
case PIPE_B :
tmp & = ~ PIPE_B_SCRAMBLE_RESET ;
break ;
case PIPE_C :
tmp & = ~ PIPE_C_SCRAMBLE_RESET ;
break ;
default :
return ;
}
if ( ! ( tmp & PIPE_SCRAMBLE_RESET_MASK ) )
tmp & = ~ DC_BALANCE_RESET_VLV ;
drm/i915/pipe_crc: use intel_de_*() functions for register access
The implicit "dev_priv" local variable use has been a long-standing pain
point in the register access macros I915_READ(), I915_WRITE(),
POSTING_READ(), I915_READ_FW(), and I915_WRITE_FW().
Replace them with the corresponding new display engine register
accessors intel_de_read(), intel_de_write(), intel_de_posting_read(),
intel_de_read_fw(), and intel_de_write_fw().
No functional changes.
Generated using the following semantic patch:
@@
expression REG, OFFSET;
@@
- I915_READ(REG)
+ intel_de_read(dev_priv, REG)
@@
expression REG, OFFSET;
@@
- POSTING_READ(REG)
+ intel_de_posting_read(dev_priv, REG)
@@
expression REG, OFFSET;
@@
- I915_WRITE(REG, OFFSET)
+ intel_de_write(dev_priv, REG, OFFSET)
@@
expression REG;
@@
- I915_READ_FW(REG)
+ intel_de_read_fw(dev_priv, REG)
@@
expression REG, OFFSET;
@@
- I915_WRITE_FW(REG, OFFSET)
+ intel_de_write_fw(dev_priv, REG, OFFSET)
Acked-by: Chris Wilson <chris@chris-wilson.co.uk>
Acked-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Acked-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/0af05f6035046a515097da398de8722c0ca23e56.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:46 +02:00
intel_de_write ( dev_priv , PORT_DFT2_G4X , tmp ) ;
2016-12-12 13:29:48 +01:00
}
static int ilk_pipe_crc_ctl_reg ( enum intel_pipe_crc_source * source ,
2019-01-16 11:15:19 +02:00
u32 * val )
2016-12-12 13:29:48 +01:00
{
if ( * source = = INTEL_PIPE_CRC_SOURCE_AUTO )
* source = INTEL_PIPE_CRC_SOURCE_PIPE ;
switch ( * source ) {
case INTEL_PIPE_CRC_SOURCE_PLANE1 :
* val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_PRIMARY_ILK ;
break ;
case INTEL_PIPE_CRC_SOURCE_PLANE2 :
* val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_SPRITE_ILK ;
break ;
case INTEL_PIPE_CRC_SOURCE_PIPE :
* val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_PIPE_ILK ;
break ;
case INTEL_PIPE_CRC_SOURCE_NONE :
* val = 0 ;
break ;
default :
return - EINVAL ;
}
return 0 ;
}
2019-03-07 16:00:46 -08:00
static void
intel_crtc_crc_setup_workarounds ( struct intel_crtc * crtc , bool enable )
2016-12-12 13:29:48 +01:00
{
2019-03-07 16:00:46 -08:00
struct drm_i915_private * dev_priv = to_i915 ( crtc - > base . dev ) ;
2016-12-12 13:29:48 +01:00
struct intel_crtc_state * pipe_config ;
struct drm_atomic_state * state ;
2017-04-04 15:24:57 +02:00
struct drm_modeset_acquire_ctx ctx ;
2019-03-07 16:00:46 -08:00
int ret ;
2016-12-12 13:29:48 +01:00
2017-04-04 15:24:57 +02:00
drm_modeset_acquire_init ( & ctx , 0 ) ;
2019-03-07 16:00:46 -08:00
state = drm_atomic_state_alloc ( & dev_priv - > drm ) ;
2016-12-12 13:29:48 +01:00
if ( ! state ) {
ret = - ENOMEM ;
2017-01-18 14:34:28 +02:00
goto unlock ;
2016-12-12 13:29:48 +01:00
}
2017-04-04 15:24:57 +02:00
state - > acquire_ctx = & ctx ;
retry :
2016-12-12 13:29:48 +01:00
pipe_config = intel_atomic_get_crtc_state ( state , crtc ) ;
if ( IS_ERR ( pipe_config ) ) {
ret = PTR_ERR ( pipe_config ) ;
2017-01-18 14:34:28 +02:00
goto put_state ;
2016-12-12 13:29:48 +01:00
}
2019-10-31 12:26:03 +01:00
pipe_config - > uapi . mode_changed = pipe_config - > has_psr ;
2019-03-07 16:00:46 -08:00
pipe_config - > crc_enabled = enable ;
2017-08-17 17:55:09 +03:00
2019-04-25 19:29:05 +03:00
if ( IS_HASWELL ( dev_priv ) & &
2019-10-31 12:26:02 +01:00
pipe_config - > hw . active & & crtc - > pipe = = PIPE_A & &
2019-04-25 19:29:06 +03:00
pipe_config - > cpu_transcoder = = TRANSCODER_EDP )
2019-10-31 12:26:03 +01:00
pipe_config - > uapi . mode_changed = true ;
2016-12-12 13:29:48 +01:00
ret = drm_atomic_commit ( state ) ;
2017-01-18 14:34:28 +02:00
put_state :
2017-04-04 15:24:57 +02:00
if ( ret = = - EDEADLK ) {
drm_atomic_state_clear ( state ) ;
drm_modeset_backoff ( & ctx ) ;
goto retry ;
}
2017-01-18 14:34:28 +02:00
drm_atomic_state_put ( state ) ;
unlock :
drm/i915/display: Make WARN* drm specific where drm_device ptr is available
drm specific WARN* calls include device information in the
backtrace, so we know what device the warnings originate from.
Covert all the calls of WARN* with device specific drm_WARN*
variants in functions where drm_device or drm_i915_private struct
pointer is readily available.
The conversion was done automatically with below coccinelle semantic
patch. checkpatch errors/warnings are fixed manually.
@rule1@
identifier func, T;
@@
func(...) {
...
struct drm_device *T = ...;
<...
(
-WARN(
+drm_WARN(T,
...)
|
-WARN_ON(
+drm_WARN_ON(T,
...)
|
-WARN_ONCE(
+drm_WARN_ONCE(T,
...)
|
-WARN_ON_ONCE(
+drm_WARN_ON_ONCE(T,
...)
)
...>
}
@rule2@
identifier func, T;
@@
func(struct drm_device *T,...) {
<...
(
-WARN(
+drm_WARN(T,
...)
|
-WARN_ON(
+drm_WARN_ON(T,
...)
|
-WARN_ONCE(
+drm_WARN_ONCE(T,
...)
|
-WARN_ON_ONCE(
+drm_WARN_ON_ONCE(T,
...)
)
...>
}
@rule3@
identifier func, T;
@@
func(...) {
...
struct drm_i915_private *T = ...;
<+...
(
-WARN(
+drm_WARN(&T->drm,
...)
|
-WARN_ON(
+drm_WARN_ON(&T->drm,
...)
|
-WARN_ONCE(
+drm_WARN_ONCE(&T->drm,
...)
|
-WARN_ON_ONCE(
+drm_WARN_ON_ONCE(&T->drm,
...)
)
...+>
}
@rule4@
identifier func, T;
@@
func(struct drm_i915_private *T,...) {
<+...
(
-WARN(
+drm_WARN(&T->drm,
...)
|
-WARN_ON(
+drm_WARN_ON(&T->drm,
...)
|
-WARN_ONCE(
+drm_WARN_ONCE(&T->drm,
...)
|
-WARN_ON_ONCE(
+drm_WARN_ON_ONCE(&T->drm,
...)
)
...+>
}
Signed-off-by: Pankaj Bharadiya <pankaj.laxminarayan.bharadiya@intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200128181603.27767-20-pankaj.laxminarayan.bharadiya@intel.com
2020-01-28 23:46:01 +05:30
drm_WARN ( & dev_priv - > drm , ret ,
" Toggling workaround to %i returns %i \n " , enable , ret ) ;
2017-04-04 15:24:57 +02:00
drm_modeset_drop_locks ( & ctx ) ;
drm_modeset_acquire_fini ( & ctx ) ;
2016-12-12 13:29:48 +01:00
}
static int ivb_pipe_crc_ctl_reg ( struct drm_i915_private * dev_priv ,
enum pipe pipe ,
enum intel_pipe_crc_source * source ,
2019-03-07 16:00:46 -08:00
u32 * val )
2016-12-12 13:29:48 +01:00
{
if ( * source = = INTEL_PIPE_CRC_SOURCE_AUTO )
2019-02-14 21:22:16 +02:00
* source = INTEL_PIPE_CRC_SOURCE_PIPE ;
2016-12-12 13:29:48 +01:00
switch ( * source ) {
case INTEL_PIPE_CRC_SOURCE_PLANE1 :
* val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_PRIMARY_IVB ;
break ;
case INTEL_PIPE_CRC_SOURCE_PLANE2 :
* val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_SPRITE_IVB ;
break ;
2019-02-14 21:22:16 +02:00
case INTEL_PIPE_CRC_SOURCE_PIPE :
2016-12-12 13:29:48 +01:00
* val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_PF_IVB ;
break ;
case INTEL_PIPE_CRC_SOURCE_NONE :
* val = 0 ;
break ;
default :
return - EINVAL ;
}
return 0 ;
}
2019-02-14 21:22:19 +02:00
static int skl_pipe_crc_ctl_reg ( struct drm_i915_private * dev_priv ,
enum pipe pipe ,
enum intel_pipe_crc_source * source ,
2019-03-18 18:00:19 +02:00
u32 * val )
2019-02-14 21:22:19 +02:00
{
if ( * source = = INTEL_PIPE_CRC_SOURCE_AUTO )
* source = INTEL_PIPE_CRC_SOURCE_PIPE ;
switch ( * source ) {
case INTEL_PIPE_CRC_SOURCE_PLANE1 :
* val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_PLANE_1_SKL ;
break ;
case INTEL_PIPE_CRC_SOURCE_PLANE2 :
* val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_PLANE_2_SKL ;
break ;
case INTEL_PIPE_CRC_SOURCE_PLANE3 :
* val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_PLANE_3_SKL ;
break ;
case INTEL_PIPE_CRC_SOURCE_PLANE4 :
* val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_PLANE_4_SKL ;
break ;
case INTEL_PIPE_CRC_SOURCE_PLANE5 :
* val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_PLANE_5_SKL ;
break ;
case INTEL_PIPE_CRC_SOURCE_PLANE6 :
* val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_PLANE_6_SKL ;
break ;
case INTEL_PIPE_CRC_SOURCE_PLANE7 :
* val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_PLANE_7_SKL ;
break ;
case INTEL_PIPE_CRC_SOURCE_PIPE :
* val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_DMUX_SKL ;
break ;
case INTEL_PIPE_CRC_SOURCE_NONE :
* val = 0 ;
break ;
default :
return - EINVAL ;
}
return 0 ;
}
2017-01-10 14:43:04 +01:00
static int get_new_crc_ctl_reg ( struct drm_i915_private * dev_priv ,
enum pipe pipe ,
2019-03-07 16:00:46 -08:00
enum intel_pipe_crc_source * source , u32 * val )
2017-01-10 14:43:04 +01:00
{
drm/i915: replace IS_GEN<N> with IS_GEN(..., N)
Define IS_GEN() similarly to our IS_GEN_RANGE(). but use gen instead of
gen_mask to do the comparison. Now callers can pass then gen as a parameter,
so we don't require one macro for each gen.
The following spatch was used to convert the users of these macros:
@@
expression e;
@@
(
- IS_GEN2(e)
+ IS_GEN(e, 2)
|
- IS_GEN3(e)
+ IS_GEN(e, 3)
|
- IS_GEN4(e)
+ IS_GEN(e, 4)
|
- IS_GEN5(e)
+ IS_GEN(e, 5)
|
- IS_GEN6(e)
+ IS_GEN(e, 6)
|
- IS_GEN7(e)
+ IS_GEN(e, 7)
|
- IS_GEN8(e)
+ IS_GEN(e, 8)
|
- IS_GEN9(e)
+ IS_GEN(e, 9)
|
- IS_GEN10(e)
+ IS_GEN(e, 10)
|
- IS_GEN11(e)
+ IS_GEN(e, 11)
)
v2: use IS_GEN rather than GT_GEN and compare to info.gen rather than
using the bitmask
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181212181044.15886-2-lucas.demarchi@intel.com
2018-12-12 10:10:43 -08:00
if ( IS_GEN ( dev_priv , 2 ) )
2017-01-10 14:43:04 +01:00
return i8xx_pipe_crc_ctl_reg ( source , val ) ;
else if ( INTEL_GEN ( dev_priv ) < 5 )
return i9xx_pipe_crc_ctl_reg ( dev_priv , pipe , source , val ) ;
else if ( IS_VALLEYVIEW ( dev_priv ) | | IS_CHERRYVIEW ( dev_priv ) )
return vlv_pipe_crc_ctl_reg ( dev_priv , pipe , source , val ) ;
drm/i915: merge gen checks to use range
Instead of using IS_GEN() for consecutive gen checks, let's pass the
range to IS_GEN_RANGE(). By code inspection these were the ranges deemed
necessary for spatch:
@@
expression e;
@@
(
- IS_GEN(e, 3) || IS_GEN(e, 2)
+ IS_GEN_RANGE(e, 2, 3)
|
- IS_GEN(e, 3) || IS_GEN(e, 4)
+ IS_GEN_RANGE(e, 3, 4)
|
- IS_GEN(e, 5) || IS_GEN(e, 6)
+ IS_GEN_RANGE(e, 5, 6)
|
- IS_GEN(e, 6) || IS_GEN(e, 7)
+ IS_GEN_RANGE(e, 6, 7)
|
- IS_GEN(e, 7) || IS_GEN(e, 8)
+ IS_GEN_RANGE(e, 7, 8)
|
- IS_GEN(e, 8) || IS_GEN(e, 9)
+ IS_GEN_RANGE(e, 8, 9)
|
- IS_GEN(e, 10) || IS_GEN(e, 9)
+ IS_GEN_RANGE(e, 9, 10)
|
- IS_GEN(e, 9) || IS_GEN(e, 10)
+ IS_GEN_RANGE(e, 9, 10)
)
After conversion, checking we don't have any missing IS_GEN_RANGE() ||
IS_GEN() was also done.
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181212181044.15886-3-lucas.demarchi@intel.com
2018-12-12 10:10:44 -08:00
else if ( IS_GEN_RANGE ( dev_priv , 5 , 6 ) )
2017-01-10 14:43:04 +01:00
return ilk_pipe_crc_ctl_reg ( source , val ) ;
2019-02-14 21:22:19 +02:00
else if ( INTEL_GEN ( dev_priv ) < 9 )
2019-03-07 16:00:46 -08:00
return ivb_pipe_crc_ctl_reg ( dev_priv , pipe , source , val ) ;
2019-02-14 21:22:19 +02:00
else
return skl_pipe_crc_ctl_reg ( dev_priv , pipe , source , val ) ;
2017-01-10 14:43:04 +01:00
}
2016-12-12 13:29:48 +01:00
static int
display_crc_ctl_parse_source ( const char * buf , enum intel_pipe_crc_source * s )
{
int i ;
2017-01-10 14:43:04 +01:00
if ( ! buf ) {
* s = INTEL_PIPE_CRC_SOURCE_NONE ;
return 0 ;
}
2018-05-03 21:17:06 +03:00
i = match_string ( pipe_crc_sources , ARRAY_SIZE ( pipe_crc_sources ) , buf ) ;
if ( i < 0 )
return i ;
2016-12-12 13:29:48 +01:00
2018-05-03 21:17:06 +03:00
* s = i ;
return 0 ;
2016-12-12 13:29:48 +01:00
}
2020-02-27 18:12:53 +02:00
void intel_crtc_crc_init ( struct intel_crtc * crtc )
2016-12-12 13:29:48 +01:00
{
2020-02-27 18:12:53 +02:00
struct intel_pipe_crc * pipe_crc = & crtc - > pipe_crc ;
2016-12-12 13:29:48 +01:00
2020-02-27 18:12:53 +02:00
spin_lock_init ( & pipe_crc - > lock ) ;
2016-12-12 13:29:48 +01:00
}
2017-01-10 14:43:04 +01:00
2018-07-13 19:29:38 +05:30
static int i8xx_crc_source_valid ( struct drm_i915_private * dev_priv ,
const enum intel_pipe_crc_source source )
{
switch ( source ) {
case INTEL_PIPE_CRC_SOURCE_PIPE :
case INTEL_PIPE_CRC_SOURCE_NONE :
return 0 ;
default :
return - EINVAL ;
}
}
static int i9xx_crc_source_valid ( struct drm_i915_private * dev_priv ,
const enum intel_pipe_crc_source source )
{
switch ( source ) {
case INTEL_PIPE_CRC_SOURCE_PIPE :
case INTEL_PIPE_CRC_SOURCE_TV :
case INTEL_PIPE_CRC_SOURCE_NONE :
return 0 ;
default :
return - EINVAL ;
}
}
static int vlv_crc_source_valid ( struct drm_i915_private * dev_priv ,
const enum intel_pipe_crc_source source )
{
switch ( source ) {
case INTEL_PIPE_CRC_SOURCE_PIPE :
case INTEL_PIPE_CRC_SOURCE_DP_B :
case INTEL_PIPE_CRC_SOURCE_DP_C :
case INTEL_PIPE_CRC_SOURCE_DP_D :
case INTEL_PIPE_CRC_SOURCE_NONE :
return 0 ;
default :
return - EINVAL ;
}
}
static int ilk_crc_source_valid ( struct drm_i915_private * dev_priv ,
const enum intel_pipe_crc_source source )
{
switch ( source ) {
case INTEL_PIPE_CRC_SOURCE_PIPE :
case INTEL_PIPE_CRC_SOURCE_PLANE1 :
case INTEL_PIPE_CRC_SOURCE_PLANE2 :
case INTEL_PIPE_CRC_SOURCE_NONE :
return 0 ;
default :
return - EINVAL ;
}
}
static int ivb_crc_source_valid ( struct drm_i915_private * dev_priv ,
const enum intel_pipe_crc_source source )
{
switch ( source ) {
case INTEL_PIPE_CRC_SOURCE_PIPE :
case INTEL_PIPE_CRC_SOURCE_PLANE1 :
case INTEL_PIPE_CRC_SOURCE_PLANE2 :
case INTEL_PIPE_CRC_SOURCE_NONE :
return 0 ;
default :
return - EINVAL ;
}
}
2019-02-14 21:22:19 +02:00
static int skl_crc_source_valid ( struct drm_i915_private * dev_priv ,
const enum intel_pipe_crc_source source )
{
switch ( source ) {
case INTEL_PIPE_CRC_SOURCE_PIPE :
case INTEL_PIPE_CRC_SOURCE_PLANE1 :
case INTEL_PIPE_CRC_SOURCE_PLANE2 :
case INTEL_PIPE_CRC_SOURCE_PLANE3 :
case INTEL_PIPE_CRC_SOURCE_PLANE4 :
case INTEL_PIPE_CRC_SOURCE_PLANE5 :
case INTEL_PIPE_CRC_SOURCE_PLANE6 :
case INTEL_PIPE_CRC_SOURCE_PLANE7 :
case INTEL_PIPE_CRC_SOURCE_NONE :
return 0 ;
default :
return - EINVAL ;
}
}
2018-07-13 19:29:38 +05:30
static int
intel_is_valid_crc_source ( struct drm_i915_private * dev_priv ,
const enum intel_pipe_crc_source source )
{
drm/i915: replace IS_GEN<N> with IS_GEN(..., N)
Define IS_GEN() similarly to our IS_GEN_RANGE(). but use gen instead of
gen_mask to do the comparison. Now callers can pass then gen as a parameter,
so we don't require one macro for each gen.
The following spatch was used to convert the users of these macros:
@@
expression e;
@@
(
- IS_GEN2(e)
+ IS_GEN(e, 2)
|
- IS_GEN3(e)
+ IS_GEN(e, 3)
|
- IS_GEN4(e)
+ IS_GEN(e, 4)
|
- IS_GEN5(e)
+ IS_GEN(e, 5)
|
- IS_GEN6(e)
+ IS_GEN(e, 6)
|
- IS_GEN7(e)
+ IS_GEN(e, 7)
|
- IS_GEN8(e)
+ IS_GEN(e, 8)
|
- IS_GEN9(e)
+ IS_GEN(e, 9)
|
- IS_GEN10(e)
+ IS_GEN(e, 10)
|
- IS_GEN11(e)
+ IS_GEN(e, 11)
)
v2: use IS_GEN rather than GT_GEN and compare to info.gen rather than
using the bitmask
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181212181044.15886-2-lucas.demarchi@intel.com
2018-12-12 10:10:43 -08:00
if ( IS_GEN ( dev_priv , 2 ) )
2018-07-13 19:29:38 +05:30
return i8xx_crc_source_valid ( dev_priv , source ) ;
else if ( INTEL_GEN ( dev_priv ) < 5 )
return i9xx_crc_source_valid ( dev_priv , source ) ;
else if ( IS_VALLEYVIEW ( dev_priv ) | | IS_CHERRYVIEW ( dev_priv ) )
return vlv_crc_source_valid ( dev_priv , source ) ;
drm/i915: merge gen checks to use range
Instead of using IS_GEN() for consecutive gen checks, let's pass the
range to IS_GEN_RANGE(). By code inspection these were the ranges deemed
necessary for spatch:
@@
expression e;
@@
(
- IS_GEN(e, 3) || IS_GEN(e, 2)
+ IS_GEN_RANGE(e, 2, 3)
|
- IS_GEN(e, 3) || IS_GEN(e, 4)
+ IS_GEN_RANGE(e, 3, 4)
|
- IS_GEN(e, 5) || IS_GEN(e, 6)
+ IS_GEN_RANGE(e, 5, 6)
|
- IS_GEN(e, 6) || IS_GEN(e, 7)
+ IS_GEN_RANGE(e, 6, 7)
|
- IS_GEN(e, 7) || IS_GEN(e, 8)
+ IS_GEN_RANGE(e, 7, 8)
|
- IS_GEN(e, 8) || IS_GEN(e, 9)
+ IS_GEN_RANGE(e, 8, 9)
|
- IS_GEN(e, 10) || IS_GEN(e, 9)
+ IS_GEN_RANGE(e, 9, 10)
|
- IS_GEN(e, 9) || IS_GEN(e, 10)
+ IS_GEN_RANGE(e, 9, 10)
)
After conversion, checking we don't have any missing IS_GEN_RANGE() ||
IS_GEN() was also done.
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181212181044.15886-3-lucas.demarchi@intel.com
2018-12-12 10:10:44 -08:00
else if ( IS_GEN_RANGE ( dev_priv , 5 , 6 ) )
2018-07-13 19:29:38 +05:30
return ilk_crc_source_valid ( dev_priv , source ) ;
2019-02-14 21:22:19 +02:00
else if ( INTEL_GEN ( dev_priv ) < 9 )
2018-07-13 19:29:38 +05:30
return ivb_crc_source_valid ( dev_priv , source ) ;
2019-02-14 21:22:19 +02:00
else
return skl_crc_source_valid ( dev_priv , source ) ;
2018-07-13 19:29:38 +05:30
}
2018-07-13 19:29:39 +05:30
const char * const * intel_crtc_get_crc_sources ( struct drm_crtc * crtc ,
size_t * count )
{
* count = ARRAY_SIZE ( pipe_crc_sources ) ;
return pipe_crc_sources ;
}
2018-07-13 19:29:38 +05:30
int intel_crtc_verify_crc_source ( struct drm_crtc * crtc , const char * source_name ,
size_t * values_cnt )
{
struct drm_i915_private * dev_priv = to_i915 ( crtc - > dev ) ;
enum intel_pipe_crc_source source ;
if ( display_crc_ctl_parse_source ( source_name , & source ) < 0 ) {
drm/i915/pipe_crc: automatic conversion to drm_device based logging macros.
Conversion of various instances of the printk based logging macros to
the new struct drm_device based logging macros in
i915/display/intel_pipe_crc.c using the following coccinelle script that
transforms based on the existence of a drm_i915_private device pointer:
@@
identifier fn, T;
@@
fn(...) {
...
struct drm_i915_private *T = ...;
<+...
(
-DRM_INFO(
+drm_info(&T->drm,
...)
|
-DRM_ERROR(
+drm_err(&T->drm,
...)
|
-DRM_WARN(
+drm_warn(&T->drm,
...)
|
-DRM_DEBUG(
+drm_dbg(&T->drm,
...)
|
-DRM_DEBUG_KMS(
+drm_dbg_kms(&T->drm,
...)
|
-DRM_DEBUG_DRIVER(
+drm_dbg(&T->drm,
...)
|
-DRM_DEBUG_ATOMIC(
+drm_dbg_atomic(&T->drm,
...)
)
...+>
}
@@
identifier fn, T;
@@
fn(...,struct drm_i915_private *T,...) {
<+...
(
-DRM_INFO(
+drm_info(&T->drm,
...)
|
-DRM_ERROR(
+drm_err(&T->drm,
...)
|
-DRM_WARN(
+drm_warn(&T->drm,
...)
|
-DRM_DEBUG(
+drm_dbg(&T->drm,
...)
|
-DRM_DEBUG_DRIVER(
+drm_dbg(&T->drm,
...)
|
-DRM_DEBUG_KMS(
+drm_dbg_kms(&T->drm,
...)
|
-DRM_DEBUG_ATOMIC(
+drm_dbg_atomic(&T->drm,
...)
)
...+>
}
Checkpatch warnings were addressed manually.
Signed-off-by: Wambui Karuga <wambui.karugax@gmail.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200130083229.12889-12-wambui.karugax@gmail.com
2020-01-30 11:32:28 +03:00
drm_dbg ( & dev_priv - > drm , " unknown source %s \n " , source_name ) ;
2018-07-13 19:29:38 +05:30
return - EINVAL ;
}
if ( source = = INTEL_PIPE_CRC_SOURCE_AUTO | |
intel_is_valid_crc_source ( dev_priv , source ) = = 0 ) {
* values_cnt = 5 ;
return 0 ;
}
return - EINVAL ;
}
2018-08-21 14:08:56 +05:30
int intel_crtc_set_crc_source ( struct drm_crtc * crtc , const char * source_name )
2017-01-10 14:43:04 +01:00
{
2018-03-08 13:02:02 +01:00
struct drm_i915_private * dev_priv = to_i915 ( crtc - > dev ) ;
2020-02-27 18:12:53 +02:00
struct intel_crtc * intel_crtc = to_intel_crtc ( crtc ) ;
struct intel_pipe_crc * pipe_crc = & intel_crtc - > pipe_crc ;
2017-01-10 14:43:04 +01:00
enum intel_display_power_domain power_domain ;
enum intel_pipe_crc_source source ;
2019-01-14 14:21:24 +00:00
intel_wakeref_t wakeref ;
2017-01-10 14:43:04 +01:00
u32 val = 0 ; /* shut up gcc */
int ret = 0 ;
2019-03-07 16:00:46 -08:00
bool enable ;
2017-01-10 14:43:04 +01:00
if ( display_crc_ctl_parse_source ( source_name , & source ) < 0 ) {
drm/i915/pipe_crc: automatic conversion to drm_device based logging macros.
Conversion of various instances of the printk based logging macros to
the new struct drm_device based logging macros in
i915/display/intel_pipe_crc.c using the following coccinelle script that
transforms based on the existence of a drm_i915_private device pointer:
@@
identifier fn, T;
@@
fn(...) {
...
struct drm_i915_private *T = ...;
<+...
(
-DRM_INFO(
+drm_info(&T->drm,
...)
|
-DRM_ERROR(
+drm_err(&T->drm,
...)
|
-DRM_WARN(
+drm_warn(&T->drm,
...)
|
-DRM_DEBUG(
+drm_dbg(&T->drm,
...)
|
-DRM_DEBUG_KMS(
+drm_dbg_kms(&T->drm,
...)
|
-DRM_DEBUG_DRIVER(
+drm_dbg(&T->drm,
...)
|
-DRM_DEBUG_ATOMIC(
+drm_dbg_atomic(&T->drm,
...)
)
...+>
}
@@
identifier fn, T;
@@
fn(...,struct drm_i915_private *T,...) {
<+...
(
-DRM_INFO(
+drm_info(&T->drm,
...)
|
-DRM_ERROR(
+drm_err(&T->drm,
...)
|
-DRM_WARN(
+drm_warn(&T->drm,
...)
|
-DRM_DEBUG(
+drm_dbg(&T->drm,
...)
|
-DRM_DEBUG_DRIVER(
+drm_dbg(&T->drm,
...)
|
-DRM_DEBUG_KMS(
+drm_dbg_kms(&T->drm,
...)
|
-DRM_DEBUG_ATOMIC(
+drm_dbg_atomic(&T->drm,
...)
)
...+>
}
Checkpatch warnings were addressed manually.
Signed-off-by: Wambui Karuga <wambui.karugax@gmail.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200130083229.12889-12-wambui.karugax@gmail.com
2020-01-30 11:32:28 +03:00
drm_dbg ( & dev_priv - > drm , " unknown source %s \n " , source_name ) ;
2017-01-10 14:43:04 +01:00
return - EINVAL ;
}
power_domain = POWER_DOMAIN_PIPE ( crtc - > index ) ;
2019-01-14 14:21:24 +00:00
wakeref = intel_display_power_get_if_enabled ( dev_priv , power_domain ) ;
if ( ! wakeref ) {
drm/i915/pipe_crc: automatic conversion to drm_device based logging macros.
Conversion of various instances of the printk based logging macros to
the new struct drm_device based logging macros in
i915/display/intel_pipe_crc.c using the following coccinelle script that
transforms based on the existence of a drm_i915_private device pointer:
@@
identifier fn, T;
@@
fn(...) {
...
struct drm_i915_private *T = ...;
<+...
(
-DRM_INFO(
+drm_info(&T->drm,
...)
|
-DRM_ERROR(
+drm_err(&T->drm,
...)
|
-DRM_WARN(
+drm_warn(&T->drm,
...)
|
-DRM_DEBUG(
+drm_dbg(&T->drm,
...)
|
-DRM_DEBUG_KMS(
+drm_dbg_kms(&T->drm,
...)
|
-DRM_DEBUG_DRIVER(
+drm_dbg(&T->drm,
...)
|
-DRM_DEBUG_ATOMIC(
+drm_dbg_atomic(&T->drm,
...)
)
...+>
}
@@
identifier fn, T;
@@
fn(...,struct drm_i915_private *T,...) {
<+...
(
-DRM_INFO(
+drm_info(&T->drm,
...)
|
-DRM_ERROR(
+drm_err(&T->drm,
...)
|
-DRM_WARN(
+drm_warn(&T->drm,
...)
|
-DRM_DEBUG(
+drm_dbg(&T->drm,
...)
|
-DRM_DEBUG_DRIVER(
+drm_dbg(&T->drm,
...)
|
-DRM_DEBUG_KMS(
+drm_dbg_kms(&T->drm,
...)
|
-DRM_DEBUG_ATOMIC(
+drm_dbg_atomic(&T->drm,
...)
)
...+>
}
Checkpatch warnings were addressed manually.
Signed-off-by: Wambui Karuga <wambui.karugax@gmail.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200130083229.12889-12-wambui.karugax@gmail.com
2020-01-30 11:32:28 +03:00
drm_dbg_kms ( & dev_priv - > drm ,
" Trying to capture CRC while pipe is off \n " ) ;
2017-01-10 14:43:04 +01:00
return - EIO ;
}
2019-03-07 16:00:46 -08:00
enable = source ! = INTEL_PIPE_CRC_SOURCE_NONE ;
if ( enable )
intel_crtc_crc_setup_workarounds ( to_intel_crtc ( crtc ) , true ) ;
ret = get_new_crc_ctl_reg ( dev_priv , crtc - > index , & source , & val ) ;
2017-01-10 14:43:04 +01:00
if ( ret ! = 0 )
goto out ;
2018-03-08 13:02:02 +01:00
pipe_crc - > source = source ;
drm/i915/pipe_crc: use intel_de_*() functions for register access
The implicit "dev_priv" local variable use has been a long-standing pain
point in the register access macros I915_READ(), I915_WRITE(),
POSTING_READ(), I915_READ_FW(), and I915_WRITE_FW().
Replace them with the corresponding new display engine register
accessors intel_de_read(), intel_de_write(), intel_de_posting_read(),
intel_de_read_fw(), and intel_de_write_fw().
No functional changes.
Generated using the following semantic patch:
@@
expression REG, OFFSET;
@@
- I915_READ(REG)
+ intel_de_read(dev_priv, REG)
@@
expression REG, OFFSET;
@@
- POSTING_READ(REG)
+ intel_de_posting_read(dev_priv, REG)
@@
expression REG, OFFSET;
@@
- I915_WRITE(REG, OFFSET)
+ intel_de_write(dev_priv, REG, OFFSET)
@@
expression REG;
@@
- I915_READ_FW(REG)
+ intel_de_read_fw(dev_priv, REG)
@@
expression REG, OFFSET;
@@
- I915_WRITE_FW(REG, OFFSET)
+ intel_de_write_fw(dev_priv, REG, OFFSET)
Acked-by: Chris Wilson <chris@chris-wilson.co.uk>
Acked-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Acked-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/0af05f6035046a515097da398de8722c0ca23e56.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:46 +02:00
intel_de_write ( dev_priv , PIPE_CRC_CTL ( crtc - > index ) , val ) ;
intel_de_posting_read ( dev_priv , PIPE_CRC_CTL ( crtc - > index ) ) ;
2017-01-10 14:43:04 +01:00
if ( ! source ) {
2019-02-14 21:22:18 +02:00
if ( IS_VALLEYVIEW ( dev_priv ) | | IS_CHERRYVIEW ( dev_priv ) )
2017-01-10 14:43:04 +01:00
vlv_undo_pipe_scramble_reset ( dev_priv , crtc - > index ) ;
}
pipe_crc - > skipped = 0 ;
out :
2019-03-07 16:00:46 -08:00
if ( ! enable )
intel_crtc_crc_setup_workarounds ( to_intel_crtc ( crtc ) , false ) ;
2019-01-14 14:21:24 +00:00
intel_display_power_put ( dev_priv , power_domain , wakeref ) ;
2017-01-10 14:43:04 +01:00
return ret ;
}
2018-03-08 13:02:02 +01:00
void intel_crtc_enable_pipe_crc ( struct intel_crtc * intel_crtc )
{
struct drm_crtc * crtc = & intel_crtc - > base ;
struct drm_i915_private * dev_priv = to_i915 ( crtc - > dev ) ;
2020-02-27 18:12:53 +02:00
struct intel_pipe_crc * pipe_crc = & intel_crtc - > pipe_crc ;
2018-03-08 13:02:02 +01:00
u32 val = 0 ;
if ( ! crtc - > crc . opened )
return ;
2019-03-07 16:00:46 -08:00
if ( get_new_crc_ctl_reg ( dev_priv , crtc - > index , & pipe_crc - > source , & val ) < 0 )
2018-03-08 13:02:02 +01:00
return ;
/* Don't need pipe_crc->lock here, IRQs are not generated. */
pipe_crc - > skipped = 0 ;
drm/i915/pipe_crc: use intel_de_*() functions for register access
The implicit "dev_priv" local variable use has been a long-standing pain
point in the register access macros I915_READ(), I915_WRITE(),
POSTING_READ(), I915_READ_FW(), and I915_WRITE_FW().
Replace them with the corresponding new display engine register
accessors intel_de_read(), intel_de_write(), intel_de_posting_read(),
intel_de_read_fw(), and intel_de_write_fw().
No functional changes.
Generated using the following semantic patch:
@@
expression REG, OFFSET;
@@
- I915_READ(REG)
+ intel_de_read(dev_priv, REG)
@@
expression REG, OFFSET;
@@
- POSTING_READ(REG)
+ intel_de_posting_read(dev_priv, REG)
@@
expression REG, OFFSET;
@@
- I915_WRITE(REG, OFFSET)
+ intel_de_write(dev_priv, REG, OFFSET)
@@
expression REG;
@@
- I915_READ_FW(REG)
+ intel_de_read_fw(dev_priv, REG)
@@
expression REG, OFFSET;
@@
- I915_WRITE_FW(REG, OFFSET)
+ intel_de_write_fw(dev_priv, REG, OFFSET)
Acked-by: Chris Wilson <chris@chris-wilson.co.uk>
Acked-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Acked-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/0af05f6035046a515097da398de8722c0ca23e56.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:46 +02:00
intel_de_write ( dev_priv , PIPE_CRC_CTL ( crtc - > index ) , val ) ;
intel_de_posting_read ( dev_priv , PIPE_CRC_CTL ( crtc - > index ) ) ;
2018-03-08 13:02:02 +01:00
}
void intel_crtc_disable_pipe_crc ( struct intel_crtc * intel_crtc )
{
struct drm_crtc * crtc = & intel_crtc - > base ;
struct drm_i915_private * dev_priv = to_i915 ( crtc - > dev ) ;
2020-02-27 18:12:53 +02:00
struct intel_pipe_crc * pipe_crc = & intel_crtc - > pipe_crc ;
2018-03-08 13:02:02 +01:00
/* Swallow crc's until we stop generating them. */
spin_lock_irq ( & pipe_crc - > lock ) ;
pipe_crc - > skipped = INT_MIN ;
spin_unlock_irq ( & pipe_crc - > lock ) ;
drm/i915/pipe_crc: use intel_de_*() functions for register access
The implicit "dev_priv" local variable use has been a long-standing pain
point in the register access macros I915_READ(), I915_WRITE(),
POSTING_READ(), I915_READ_FW(), and I915_WRITE_FW().
Replace them with the corresponding new display engine register
accessors intel_de_read(), intel_de_write(), intel_de_posting_read(),
intel_de_read_fw(), and intel_de_write_fw().
No functional changes.
Generated using the following semantic patch:
@@
expression REG, OFFSET;
@@
- I915_READ(REG)
+ intel_de_read(dev_priv, REG)
@@
expression REG, OFFSET;
@@
- POSTING_READ(REG)
+ intel_de_posting_read(dev_priv, REG)
@@
expression REG, OFFSET;
@@
- I915_WRITE(REG, OFFSET)
+ intel_de_write(dev_priv, REG, OFFSET)
@@
expression REG;
@@
- I915_READ_FW(REG)
+ intel_de_read_fw(dev_priv, REG)
@@
expression REG, OFFSET;
@@
- I915_WRITE_FW(REG, OFFSET)
+ intel_de_write_fw(dev_priv, REG, OFFSET)
Acked-by: Chris Wilson <chris@chris-wilson.co.uk>
Acked-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Acked-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/0af05f6035046a515097da398de8722c0ca23e56.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:46 +02:00
intel_de_write ( dev_priv , PIPE_CRC_CTL ( crtc - > index ) , 0 ) ;
intel_de_posting_read ( dev_priv , PIPE_CRC_CTL ( crtc - > index ) ) ;
2019-07-02 18:17:23 +03:00
intel_synchronize_irq ( dev_priv ) ;
2018-03-08 13:02:02 +01:00
}