2017-02-07 20:33:05 +02:00
/*
* Copyright © 2006 - 2017 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 .
*/
2020-05-20 18:00:58 +03:00
# include <linux/time.h>
2020-05-22 16:18:43 +03:00
2019-09-13 22:31:56 +03:00
# include "intel_atomic.h"
2020-05-22 16:18:43 +03:00
# include "intel_bw.h"
2019-04-05 14:00:25 +03:00
# include "intel_cdclk.h"
2021-04-30 17:39:44 +03:00
# include "intel_de.h"
2019-08-06 14:39:33 +03:00
# include "intel_display_types.h"
2019-04-26 09:17:22 +01:00
# include "intel_sideband.h"
2017-02-07 20:33:05 +02:00
/**
* DOC : CDCLK / RAWCLK
*
* The display engine uses several different clocks to do its work . There
* are two main clocks involved that aren ' t directly related to the actual
* pixel clock or any symbol / bit clock of the actual output port . These
* are the core display clock ( CDCLK ) and RAWCLK .
*
* CDCLK clocks most of the display pipe logic , and thus its frequency
* must be high enough to support the rate at which pixels are flowing
* through the pipes . Downscaling must also be accounted as that increases
* the effective pixel rate .
*
* On several platforms the CDCLK frequency can be changed dynamically
* to minimize power consumption for a given display configuration .
* Typically changes to the CDCLK frequency require all the display pipes
* to be shut down while the frequency is being changed .
*
* On SKL + the DMC will toggle the CDCLK off / on during DC5 / 6 entry / exit .
* DMC will not change the active CDCLK frequency however , so that part
* will still be performed by the driver directly .
*
* RAWCLK is a fixed frequency clock , often used by various auxiliary
* blocks such as AUX CH or backlight PWM . Hence the only thing we
* really need to know about RAWCLK is its frequency so that various
* dividers can be programmed correctly .
*/
2017-02-07 20:33:45 +02:00
static void fixed_133mhz_get_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config * cdclk_config )
2017-02-07 20:33:05 +02:00
{
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 133333 ;
2017-02-07 20:33:05 +02:00
}
2017-02-07 20:33:45 +02:00
static void fixed_200mhz_get_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config * cdclk_config )
2017-02-07 20:33:05 +02:00
{
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 200000 ;
2017-02-07 20:33:05 +02:00
}
2017-02-07 20:33:45 +02:00
static void fixed_266mhz_get_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config * cdclk_config )
2017-02-07 20:33:05 +02:00
{
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 266667 ;
2017-02-07 20:33:05 +02:00
}
2017-02-07 20:33:45 +02:00
static void fixed_333mhz_get_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config * cdclk_config )
2017-02-07 20:33:05 +02:00
{
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 333333 ;
2017-02-07 20:33:05 +02:00
}
2017-02-07 20:33:45 +02:00
static void fixed_400mhz_get_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config * cdclk_config )
2017-02-07 20:33:05 +02:00
{
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 400000 ;
2017-02-07 20:33:05 +02:00
}
2017-02-07 20:33:45 +02:00
static void fixed_450mhz_get_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config * cdclk_config )
2017-02-07 20:33:05 +02:00
{
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 450000 ;
2017-02-07 20:33:05 +02:00
}
2017-02-07 20:33:45 +02:00
static void i85x_get_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config * cdclk_config )
2017-02-07 20:33:05 +02:00
{
2021-01-28 14:31:23 +01:00
struct pci_dev * pdev = to_pci_dev ( dev_priv - > drm . dev ) ;
2017-02-07 20:33:05 +02:00
u16 hpllcc = 0 ;
/*
* 852 GM / 852 GMV only supports 133 MHz and the HPLLCC
* encoding is different : (
* FIXME is this the right way to detect 852 GM / 852 GMV ?
*/
2017-02-07 20:33:45 +02:00
if ( pdev - > revision = = 0x1 ) {
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 133333 ;
2017-02-07 20:33:45 +02:00
return ;
}
2017-02-07 20:33:05 +02:00
pci_bus_read_config_word ( pdev - > bus ,
PCI_DEVFN ( 0 , 3 ) , HPLLCC , & hpllcc ) ;
/* Assume that the hardware is in the high speed state. This
* should be the default .
*/
switch ( hpllcc & GC_CLOCK_CONTROL_MASK ) {
case GC_CLOCK_133_200 :
case GC_CLOCK_133_200_2 :
case GC_CLOCK_100_200 :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 200000 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
case GC_CLOCK_166_250 :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 250000 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
case GC_CLOCK_100_133 :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 133333 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
case GC_CLOCK_133_266 :
case GC_CLOCK_133_266_2 :
case GC_CLOCK_166_266 :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 266667 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
}
}
2017-02-07 20:33:45 +02:00
static void i915gm_get_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config * cdclk_config )
2017-02-07 20:33:05 +02:00
{
2021-01-28 14:31:23 +01:00
struct pci_dev * pdev = to_pci_dev ( dev_priv - > drm . dev ) ;
2017-02-07 20:33:05 +02:00
u16 gcfgc = 0 ;
pci_read_config_word ( pdev , GCFGC , & gcfgc ) ;
2017-02-07 20:33:45 +02:00
if ( gcfgc & GC_LOW_FREQUENCY_ENABLE ) {
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 133333 ;
2017-02-07 20:33:45 +02:00
return ;
}
2017-02-07 20:33:05 +02:00
switch ( gcfgc & GC_DISPLAY_CLOCK_MASK ) {
case GC_DISPLAY_CLOCK_333_320_MHZ :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 333333 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
default :
case GC_DISPLAY_CLOCK_190_200_MHZ :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 190000 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
}
}
2017-02-07 20:33:45 +02:00
static void i945gm_get_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config * cdclk_config )
2017-02-07 20:33:05 +02:00
{
2021-01-28 14:31:23 +01:00
struct pci_dev * pdev = to_pci_dev ( dev_priv - > drm . dev ) ;
2017-02-07 20:33:05 +02:00
u16 gcfgc = 0 ;
pci_read_config_word ( pdev , GCFGC , & gcfgc ) ;
2017-02-07 20:33:45 +02:00
if ( gcfgc & GC_LOW_FREQUENCY_ENABLE ) {
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 133333 ;
2017-02-07 20:33:45 +02:00
return ;
}
2017-02-07 20:33:05 +02:00
switch ( gcfgc & GC_DISPLAY_CLOCK_MASK ) {
case GC_DISPLAY_CLOCK_333_320_MHZ :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 320000 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
default :
case GC_DISPLAY_CLOCK_190_200_MHZ :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 200000 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
}
}
static unsigned int intel_hpll_vco ( struct drm_i915_private * dev_priv )
{
static const unsigned int blb_vco [ 8 ] = {
[ 0 ] = 3200000 ,
[ 1 ] = 4000000 ,
[ 2 ] = 5333333 ,
[ 3 ] = 4800000 ,
[ 4 ] = 6400000 ,
} ;
static const unsigned int pnv_vco [ 8 ] = {
[ 0 ] = 3200000 ,
[ 1 ] = 4000000 ,
[ 2 ] = 5333333 ,
[ 3 ] = 4800000 ,
[ 4 ] = 2666667 ,
} ;
static const unsigned int cl_vco [ 8 ] = {
[ 0 ] = 3200000 ,
[ 1 ] = 4000000 ,
[ 2 ] = 5333333 ,
[ 3 ] = 6400000 ,
[ 4 ] = 3333333 ,
[ 5 ] = 3566667 ,
[ 6 ] = 4266667 ,
} ;
static const unsigned int elk_vco [ 8 ] = {
[ 0 ] = 3200000 ,
[ 1 ] = 4000000 ,
[ 2 ] = 5333333 ,
[ 3 ] = 4800000 ,
} ;
static const unsigned int ctg_vco [ 8 ] = {
[ 0 ] = 3200000 ,
[ 1 ] = 4000000 ,
[ 2 ] = 5333333 ,
[ 3 ] = 6400000 ,
[ 4 ] = 2666667 ,
[ 5 ] = 4266667 ,
} ;
const unsigned int * vco_table ;
unsigned int vco ;
2019-01-16 11:15:25 +02:00
u8 tmp = 0 ;
2017-02-07 20:33:05 +02:00
/* FIXME other chipsets? */
if ( IS_GM45 ( dev_priv ) )
vco_table = ctg_vco ;
2017-02-20 17:00:41 -03:00
else if ( IS_G45 ( dev_priv ) )
2017-02-07 20:33:05 +02:00
vco_table = elk_vco ;
else if ( IS_I965GM ( dev_priv ) )
vco_table = cl_vco ;
else if ( IS_PINEVIEW ( dev_priv ) )
vco_table = pnv_vco ;
else if ( IS_G33 ( dev_priv ) )
vco_table = blb_vco ;
else
return 0 ;
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
tmp = intel_de_read ( dev_priv ,
IS_PINEVIEW ( dev_priv ) | | IS_MOBILE ( dev_priv ) ? HPLLVCO_MOBILE : HPLLVCO ) ;
2017-02-07 20:33:05 +02:00
vco = vco_table [ tmp & 0x7 ] ;
if ( vco = = 0 )
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_err ( & dev_priv - > drm , " Bad HPLL VCO (HPLLVCO=0x%02x) \n " ,
tmp ) ;
2017-02-07 20:33:05 +02:00
else
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_dbg_kms ( & dev_priv - > drm , " HPLL VCO %u kHz \n " , vco ) ;
2017-02-07 20:33:05 +02:00
return vco ;
}
2017-02-07 20:33:45 +02:00
static void g33_get_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config * cdclk_config )
2017-02-07 20:33:05 +02:00
{
2021-01-28 14:31:23 +01:00
struct pci_dev * pdev = to_pci_dev ( dev_priv - > drm . dev ) ;
2019-01-16 11:15:25 +02:00
static const u8 div_3200 [ ] = { 12 , 10 , 8 , 7 , 5 , 16 } ;
static const u8 div_4000 [ ] = { 14 , 12 , 10 , 8 , 6 , 20 } ;
static const u8 div_4800 [ ] = { 20 , 14 , 12 , 10 , 8 , 24 } ;
static const u8 div_5333 [ ] = { 20 , 16 , 12 , 12 , 8 , 28 } ;
const u8 * div_table ;
2017-02-07 20:33:45 +02:00
unsigned int cdclk_sel ;
2019-01-16 11:15:25 +02:00
u16 tmp = 0 ;
2017-02-07 20:33:05 +02:00
2020-01-20 19:47:17 +02:00
cdclk_config - > vco = intel_hpll_vco ( dev_priv ) ;
2017-02-07 20:33:45 +02:00
2017-02-07 20:33:05 +02:00
pci_read_config_word ( pdev , GCFGC , & tmp ) ;
cdclk_sel = ( tmp > > 4 ) & 0x7 ;
if ( cdclk_sel > = ARRAY_SIZE ( div_3200 ) )
goto fail ;
2020-01-20 19:47:17 +02:00
switch ( cdclk_config - > vco ) {
2017-02-07 20:33:05 +02:00
case 3200000 :
div_table = div_3200 ;
break ;
case 4000000 :
div_table = div_4000 ;
break ;
case 4800000 :
div_table = div_4800 ;
break ;
case 5333333 :
div_table = div_5333 ;
break ;
default :
goto fail ;
}
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = DIV_ROUND_CLOSEST ( cdclk_config - > vco ,
div_table [ cdclk_sel ] ) ;
2017-02-07 20:33:45 +02:00
return ;
2017-02-07 20:33:05 +02:00
fail :
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_err ( & dev_priv - > drm ,
" Unable to determine CDCLK. HPLL VCO=%u kHz, CFGC=0x%08x \n " ,
2020-01-20 19:47:17 +02:00
cdclk_config - > vco , tmp ) ;
cdclk_config - > cdclk = 190476 ;
2017-02-07 20:33:05 +02:00
}
2017-02-07 20:33:45 +02:00
static void pnv_get_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config * cdclk_config )
2017-02-07 20:33:05 +02:00
{
2021-01-28 14:31:23 +01:00
struct pci_dev * pdev = to_pci_dev ( dev_priv - > drm . dev ) ;
2017-02-07 20:33:05 +02:00
u16 gcfgc = 0 ;
pci_read_config_word ( pdev , GCFGC , & gcfgc ) ;
switch ( gcfgc & GC_DISPLAY_CLOCK_MASK ) {
case GC_DISPLAY_CLOCK_267_MHZ_PNV :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 266667 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
case GC_DISPLAY_CLOCK_333_MHZ_PNV :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 333333 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
case GC_DISPLAY_CLOCK_444_MHZ_PNV :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 444444 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
case GC_DISPLAY_CLOCK_200_MHZ_PNV :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 200000 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
default :
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_err ( & dev_priv - > drm ,
" Unknown pnv display core clock 0x%04x \n " , gcfgc ) ;
2020-08-23 17:36:59 -05:00
fallthrough ;
2017-02-07 20:33:05 +02:00
case GC_DISPLAY_CLOCK_133_MHZ_PNV :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 133333 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
case GC_DISPLAY_CLOCK_167_MHZ_PNV :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 166667 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
}
}
2017-02-07 20:33:45 +02:00
static void i965gm_get_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config * cdclk_config )
2017-02-07 20:33:05 +02:00
{
2021-01-28 14:31:23 +01:00
struct pci_dev * pdev = to_pci_dev ( dev_priv - > drm . dev ) ;
2019-01-16 11:15:25 +02:00
static const u8 div_3200 [ ] = { 16 , 10 , 8 } ;
static const u8 div_4000 [ ] = { 20 , 12 , 10 } ;
static const u8 div_5333 [ ] = { 24 , 16 , 14 } ;
const u8 * div_table ;
2017-02-07 20:33:45 +02:00
unsigned int cdclk_sel ;
2019-01-16 11:15:25 +02:00
u16 tmp = 0 ;
2017-02-07 20:33:05 +02:00
2020-01-20 19:47:17 +02:00
cdclk_config - > vco = intel_hpll_vco ( dev_priv ) ;
2017-02-07 20:33:45 +02:00
2017-02-07 20:33:05 +02:00
pci_read_config_word ( pdev , GCFGC , & tmp ) ;
cdclk_sel = ( ( tmp > > 8 ) & 0x1f ) - 1 ;
if ( cdclk_sel > = ARRAY_SIZE ( div_3200 ) )
goto fail ;
2020-01-20 19:47:17 +02:00
switch ( cdclk_config - > vco ) {
2017-02-07 20:33:05 +02:00
case 3200000 :
div_table = div_3200 ;
break ;
case 4000000 :
div_table = div_4000 ;
break ;
case 5333333 :
div_table = div_5333 ;
break ;
default :
goto fail ;
}
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = DIV_ROUND_CLOSEST ( cdclk_config - > vco ,
div_table [ cdclk_sel ] ) ;
2017-02-07 20:33:45 +02:00
return ;
2017-02-07 20:33:05 +02:00
fail :
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_err ( & dev_priv - > drm ,
" Unable to determine CDCLK. HPLL VCO=%u kHz, CFGC=0x%04x \n " ,
2020-01-20 19:47:17 +02:00
cdclk_config - > vco , tmp ) ;
cdclk_config - > cdclk = 200000 ;
2017-02-07 20:33:05 +02:00
}
2017-02-07 20:33:45 +02:00
static void gm45_get_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config * cdclk_config )
2017-02-07 20:33:05 +02:00
{
2021-01-28 14:31:23 +01:00
struct pci_dev * pdev = to_pci_dev ( dev_priv - > drm . dev ) ;
2017-02-07 20:33:45 +02:00
unsigned int cdclk_sel ;
2019-01-16 11:15:25 +02:00
u16 tmp = 0 ;
2017-02-07 20:33:05 +02:00
2020-01-20 19:47:17 +02:00
cdclk_config - > vco = intel_hpll_vco ( dev_priv ) ;
2017-02-07 20:33:45 +02:00
2017-02-07 20:33:05 +02:00
pci_read_config_word ( pdev , GCFGC , & tmp ) ;
cdclk_sel = ( tmp > > 12 ) & 0x1 ;
2020-01-20 19:47:17 +02:00
switch ( cdclk_config - > vco ) {
2017-02-07 20:33:05 +02:00
case 2666667 :
case 4000000 :
case 5333333 :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = cdclk_sel ? 333333 : 222222 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
case 3200000 :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = cdclk_sel ? 320000 : 228571 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
default :
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_err ( & dev_priv - > drm ,
" Unable to determine CDCLK. HPLL VCO=%u, CFGC=0x%04x \n " ,
2020-01-20 19:47:17 +02:00
cdclk_config - > vco , tmp ) ;
cdclk_config - > cdclk = 222222 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
}
}
2017-02-07 20:33:45 +02:00
static void hsw_get_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config * cdclk_config )
2017-02-07 20:33:05 +02:00
{
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
u32 lcpll = intel_de_read ( dev_priv , LCPLL_CTL ) ;
2019-01-16 11:15:25 +02:00
u32 freq = lcpll & LCPLL_CLK_FREQ_MASK ;
2017-02-07 20:33:05 +02:00
if ( lcpll & LCPLL_CD_SOURCE_FCLK )
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 800000 ;
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
else if ( intel_de_read ( dev_priv , FUSE_STRAP ) & HSW_CDCLK_LIMIT )
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 450000 ;
2017-02-07 20:33:05 +02:00
else if ( freq = = LCPLL_CLK_FREQ_450 )
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 450000 ;
2017-02-07 20:33:05 +02:00
else if ( IS_HSW_ULT ( dev_priv ) )
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 337500 ;
2017-02-07 20:33:05 +02:00
else
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 540000 ;
2017-02-07 20:33:05 +02:00
}
2017-08-30 21:57:03 +03:00
static int vlv_calc_cdclk ( struct drm_i915_private * dev_priv , int min_cdclk )
2017-02-07 20:33:05 +02:00
{
int freq_320 = ( dev_priv - > hpll_freq < < 1 ) % 320000 ! = 0 ?
333333 : 320000 ;
/*
* We seem to get an unstable or solid color picture at 200 MHz .
* Not sure what ' s wrong . For now use 200 MHz only when all pipes
* are off .
*/
2017-08-30 21:57:03 +03:00
if ( IS_VALLEYVIEW ( dev_priv ) & & min_cdclk > freq_320 )
2017-02-07 20:33:05 +02:00
return 400000 ;
2017-08-30 21:57:03 +03:00
else if ( min_cdclk > 266667 )
2017-02-07 20:33:05 +02:00
return freq_320 ;
2017-08-30 21:57:03 +03:00
else if ( min_cdclk > 0 )
2017-02-07 20:33:05 +02:00
return 266667 ;
else
return 200000 ;
}
2017-10-24 12:52:09 +03:00
static u8 vlv_calc_voltage_level ( struct drm_i915_private * dev_priv , int cdclk )
{
if ( IS_VALLEYVIEW ( dev_priv ) ) {
if ( cdclk > = 320000 ) /* jump to highest voltage for 400MHz too */
return 2 ;
else if ( cdclk > = 266667 )
return 1 ;
else
return 0 ;
} else {
/*
* Specs are full of misinformation , but testing on actual
* hardware has shown that we just need to write the desired
* CCK divider into the Punit register .
*/
return DIV_ROUND_CLOSEST ( dev_priv - > hpll_freq < < 1 , cdclk ) - 1 ;
}
}
2017-02-07 20:33:45 +02:00
static void vlv_get_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config * cdclk_config )
2017-02-07 20:33:05 +02:00
{
2017-10-24 12:52:09 +03:00
u32 val ;
2019-04-26 09:17:20 +01:00
vlv_iosf_sb_get ( dev_priv ,
BIT ( VLV_IOSF_SB_CCK ) | BIT ( VLV_IOSF_SB_PUNIT ) ) ;
2020-01-20 19:47:17 +02:00
cdclk_config - > vco = vlv_get_hpll_vco ( dev_priv ) ;
cdclk_config - > cdclk = vlv_get_cck_clock ( dev_priv , " cdclk " ,
CCK_DISPLAY_CLOCK_CONTROL ,
cdclk_config - > vco ) ;
2017-10-24 12:52:09 +03:00
2018-11-29 19:55:03 +02:00
val = vlv_punit_read ( dev_priv , PUNIT_REG_DSPSSPM ) ;
2019-04-26 09:17:20 +01:00
vlv_iosf_sb_put ( dev_priv ,
BIT ( VLV_IOSF_SB_CCK ) | BIT ( VLV_IOSF_SB_PUNIT ) ) ;
2017-10-24 12:52:09 +03:00
if ( IS_VALLEYVIEW ( dev_priv ) )
2020-01-20 19:47:17 +02:00
cdclk_config - > voltage_level = ( val & DSPFREQGUAR_MASK ) > >
2017-10-24 12:52:09 +03:00
DSPFREQGUAR_SHIFT ;
else
2020-01-20 19:47:17 +02:00
cdclk_config - > voltage_level = ( val & DSPFREQGUAR_MASK_CHV ) > >
2017-10-24 12:52:09 +03:00
DSPFREQGUAR_SHIFT_CHV ;
2017-02-07 20:33:05 +02:00
}
static void vlv_program_pfi_credits ( struct drm_i915_private * dev_priv )
{
unsigned int credits , default_credits ;
if ( IS_CHERRYVIEW ( dev_priv ) )
default_credits = PFI_CREDIT ( 12 ) ;
else
default_credits = PFI_CREDIT ( 8 ) ;
2017-02-07 20:33:45 +02:00
if ( dev_priv - > cdclk . hw . cdclk > = dev_priv - > czclk_freq ) {
2017-02-07 20:33:05 +02:00
/* CHV suggested value is 31 or 63 */
if ( IS_CHERRYVIEW ( dev_priv ) )
credits = PFI_CREDIT_63 ;
else
credits = PFI_CREDIT ( 15 ) ;
} else {
credits = default_credits ;
}
/*
* WA - write default credits before re - programming
* FIXME : should we also set the resend bit here ?
*/
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
intel_de_write ( dev_priv , GCI_CONTROL ,
VGA_FAST_MODE_DISABLE | default_credits ) ;
2017-02-07 20:33:05 +02:00
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
intel_de_write ( dev_priv , GCI_CONTROL ,
VGA_FAST_MODE_DISABLE | credits | PFI_CREDIT_RESEND ) ;
2017-02-07 20:33:05 +02:00
/*
* FIXME is this guaranteed to clear
* immediately or should we poll for it ?
*/
drm/i915/display/cdclk: Make WARN* drm specific where drm_priv 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_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_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,
...)
)
...+>
}
@rule2@
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/20200220165507.16823-2-pankaj.laxminarayan.bharadiya@intel.com
2020-02-20 22:25:00 +05:30
drm_WARN_ON ( & dev_priv - > drm ,
intel_de_read ( dev_priv , GCI_CONTROL ) & PFI_CREDIT_RESEND ) ;
2017-02-07 20:33:05 +02:00
}
2017-01-20 20:22:01 +02:00
static void vlv_set_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
const struct intel_cdclk_config * cdclk_config ,
2019-03-27 12:13:21 +02:00
enum pipe pipe )
2017-02-07 20:33:05 +02:00
{
2020-01-20 19:47:17 +02:00
int cdclk = cdclk_config - > cdclk ;
u32 val , cmd = cdclk_config - > voltage_level ;
2019-01-14 14:21:24 +00:00
intel_wakeref_t wakeref ;
2017-02-07 20:33:05 +02:00
2017-10-24 12:52:15 +03:00
switch ( cdclk ) {
case 400000 :
case 333333 :
case 320000 :
case 266667 :
case 200000 :
break ;
default :
MISSING_CASE ( cdclk ) ;
return ;
}
2017-06-28 18:06:05 -03:00
/* There are cases where we can end up here with power domains
* off and a CDCLK frequency other than the minimum , like when
* issuing a modeset without actually changing any display after
2019-07-01 19:15:34 +03:00
* a system suspend . So grab the display core domain , which covers
2017-06-28 18:06:05 -03:00
* the HW blocks needed for the following programming .
*/
2019-07-01 19:15:34 +03:00
wakeref = intel_display_power_get ( dev_priv , POWER_DOMAIN_DISPLAY_CORE ) ;
2017-06-28 18:06:05 -03:00
2019-04-26 09:17:20 +01:00
vlv_iosf_sb_get ( dev_priv ,
BIT ( VLV_IOSF_SB_CCK ) |
BIT ( VLV_IOSF_SB_BUNIT ) |
BIT ( VLV_IOSF_SB_PUNIT ) ) ;
2018-11-29 19:55:03 +02:00
val = vlv_punit_read ( dev_priv , PUNIT_REG_DSPSSPM ) ;
2017-02-07 20:33:05 +02:00
val & = ~ DSPFREQGUAR_MASK ;
val | = ( cmd < < DSPFREQGUAR_SHIFT ) ;
2018-11-29 19:55:03 +02:00
vlv_punit_write ( dev_priv , PUNIT_REG_DSPSSPM , val ) ;
if ( wait_for ( ( vlv_punit_read ( dev_priv , PUNIT_REG_DSPSSPM ) &
2017-02-07 20:33:05 +02:00
DSPFREQSTAT_MASK ) = = ( cmd < < DSPFREQSTAT_SHIFT ) ,
50 ) ) {
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_err ( & dev_priv - > drm ,
" timed out waiting for CDclk change \n " ) ;
2017-02-07 20:33:05 +02:00
}
if ( cdclk = = 400000 ) {
u32 divider ;
divider = DIV_ROUND_CLOSEST ( dev_priv - > hpll_freq < < 1 ,
cdclk ) - 1 ;
/* adjust cdclk divider */
val = vlv_cck_read ( dev_priv , CCK_DISPLAY_CLOCK_CONTROL ) ;
val & = ~ CCK_FREQUENCY_VALUES ;
val | = divider ;
vlv_cck_write ( dev_priv , CCK_DISPLAY_CLOCK_CONTROL , val ) ;
if ( wait_for ( ( vlv_cck_read ( dev_priv , CCK_DISPLAY_CLOCK_CONTROL ) &
CCK_FREQUENCY_STATUS ) = = ( divider < < CCK_FREQUENCY_STATUS_SHIFT ) ,
50 ) )
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_err ( & dev_priv - > drm ,
" timed out waiting for CDclk change \n " ) ;
2017-02-07 20:33:05 +02:00
}
/* adjust self-refresh exit latency value */
val = vlv_bunit_read ( dev_priv , BUNIT_REG_BISOC ) ;
val & = ~ 0x7f ;
/*
* For high bandwidth configs , we set a higher latency in the bunit
* so that the core display fetch happens in time to avoid underruns .
*/
if ( cdclk = = 400000 )
val | = 4500 / 250 ; /* 4.5 usec */
else
val | = 3000 / 250 ; /* 3.0 usec */
vlv_bunit_write ( dev_priv , BUNIT_REG_BISOC , val ) ;
2019-04-26 09:17:19 +01:00
vlv_iosf_sb_put ( dev_priv ,
2019-04-26 09:17:20 +01:00
BIT ( VLV_IOSF_SB_CCK ) |
BIT ( VLV_IOSF_SB_BUNIT ) |
BIT ( VLV_IOSF_SB_PUNIT ) ) ;
2017-02-07 20:33:05 +02:00
intel_update_cdclk ( dev_priv ) ;
2017-01-26 21:57:19 +02:00
vlv_program_pfi_credits ( dev_priv ) ;
2017-06-28 18:06:05 -03:00
2019-07-01 19:15:34 +03:00
intel_display_power_put ( dev_priv , POWER_DOMAIN_DISPLAY_CORE , wakeref ) ;
2017-02-07 20:33:05 +02:00
}
2017-01-20 20:22:01 +02:00
static void chv_set_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
const struct intel_cdclk_config * cdclk_config ,
2019-03-27 12:13:21 +02:00
enum pipe pipe )
2017-02-07 20:33:05 +02:00
{
2020-01-20 19:47:17 +02:00
int cdclk = cdclk_config - > cdclk ;
u32 val , cmd = cdclk_config - > voltage_level ;
2019-01-14 14:21:24 +00:00
intel_wakeref_t wakeref ;
2017-02-07 20:33:05 +02:00
switch ( cdclk ) {
case 333333 :
case 320000 :
case 266667 :
case 200000 :
break ;
default :
MISSING_CASE ( cdclk ) ;
return ;
}
2017-06-28 18:06:05 -03:00
/* There are cases where we can end up here with power domains
* off and a CDCLK frequency other than the minimum , like when
* issuing a modeset without actually changing any display after
2019-07-01 19:15:34 +03:00
* a system suspend . So grab the display core domain , which covers
2017-06-28 18:06:05 -03:00
* the HW blocks needed for the following programming .
*/
2019-07-01 19:15:34 +03:00
wakeref = intel_display_power_get ( dev_priv , POWER_DOMAIN_DISPLAY_CORE ) ;
2017-06-28 18:06:05 -03:00
2019-04-26 09:17:20 +01:00
vlv_punit_get ( dev_priv ) ;
2018-11-29 19:55:03 +02:00
val = vlv_punit_read ( dev_priv , PUNIT_REG_DSPSSPM ) ;
2017-02-07 20:33:05 +02:00
val & = ~ DSPFREQGUAR_MASK_CHV ;
val | = ( cmd < < DSPFREQGUAR_SHIFT_CHV ) ;
2018-11-29 19:55:03 +02:00
vlv_punit_write ( dev_priv , PUNIT_REG_DSPSSPM , val ) ;
if ( wait_for ( ( vlv_punit_read ( dev_priv , PUNIT_REG_DSPSSPM ) &
2017-02-07 20:33:05 +02:00
DSPFREQSTAT_MASK_CHV ) = = ( cmd < < DSPFREQSTAT_SHIFT_CHV ) ,
50 ) ) {
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_err ( & dev_priv - > drm ,
" timed out waiting for CDclk change \n " ) ;
2017-02-07 20:33:05 +02:00
}
2019-04-26 09:17:20 +01:00
vlv_punit_put ( dev_priv ) ;
2017-02-07 20:33:05 +02:00
intel_update_cdclk ( dev_priv ) ;
2017-01-26 21:57:19 +02:00
vlv_program_pfi_credits ( dev_priv ) ;
2017-06-28 18:06:05 -03:00
2019-07-01 19:15:34 +03:00
intel_display_power_put ( dev_priv , POWER_DOMAIN_DISPLAY_CORE , wakeref ) ;
2017-02-07 20:33:05 +02:00
}
2017-08-30 21:57:03 +03:00
static int bdw_calc_cdclk ( int min_cdclk )
2017-02-07 20:33:05 +02:00
{
2017-08-30 21:57:03 +03:00
if ( min_cdclk > 540000 )
2017-02-07 20:33:05 +02:00
return 675000 ;
2017-08-30 21:57:03 +03:00
else if ( min_cdclk > 450000 )
2017-02-07 20:33:05 +02:00
return 540000 ;
2017-08-30 21:57:03 +03:00
else if ( min_cdclk > 337500 )
2017-02-07 20:33:05 +02:00
return 450000 ;
else
return 337500 ;
}
2017-10-24 12:52:10 +03:00
static u8 bdw_calc_voltage_level ( int cdclk )
{
switch ( cdclk ) {
default :
case 337500 :
return 2 ;
case 450000 :
return 0 ;
case 540000 :
return 1 ;
case 675000 :
return 3 ;
}
}
2017-02-07 20:33:45 +02:00
static void bdw_get_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config * cdclk_config )
2017-02-07 20:33:05 +02:00
{
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
u32 lcpll = intel_de_read ( dev_priv , LCPLL_CTL ) ;
2019-01-16 11:15:25 +02:00
u32 freq = lcpll & LCPLL_CLK_FREQ_MASK ;
2017-02-07 20:33:05 +02:00
if ( lcpll & LCPLL_CD_SOURCE_FCLK )
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 800000 ;
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
else if ( intel_de_read ( dev_priv , FUSE_STRAP ) & HSW_CDCLK_LIMIT )
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 450000 ;
2017-02-07 20:33:05 +02:00
else if ( freq = = LCPLL_CLK_FREQ_450 )
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 450000 ;
2017-02-07 20:33:05 +02:00
else if ( freq = = LCPLL_CLK_FREQ_54O_BDW )
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 540000 ;
2017-02-07 20:33:05 +02:00
else if ( freq = = LCPLL_CLK_FREQ_337_5_BDW )
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 337500 ;
2017-02-07 20:33:05 +02:00
else
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 675000 ;
2017-10-24 12:52:10 +03:00
/*
* Can ' t read this out : ( Let ' s assume it ' s
* at least what the CDCLK frequency requires .
*/
2020-01-20 19:47:17 +02:00
cdclk_config - > voltage_level =
bdw_calc_voltage_level ( cdclk_config - > cdclk ) ;
2017-02-07 20:33:05 +02:00
}
2021-04-30 18:34:40 +03:00
static u32 bdw_cdclk_freq_sel ( int cdclk )
{
switch ( cdclk ) {
default :
MISSING_CASE ( cdclk ) ;
fallthrough ;
case 337500 :
return LCPLL_CLK_FREQ_337_5_BDW ;
case 450000 :
return LCPLL_CLK_FREQ_450 ;
case 540000 :
return LCPLL_CLK_FREQ_54O_BDW ;
case 675000 :
return LCPLL_CLK_FREQ_675_BDW ;
}
}
2017-01-20 20:22:01 +02:00
static void bdw_set_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
const struct intel_cdclk_config * cdclk_config ,
2019-03-27 12:13:21 +02:00
enum pipe pipe )
2017-02-07 20:33:05 +02:00
{
2020-01-20 19:47:17 +02:00
int cdclk = cdclk_config - > cdclk ;
2017-02-07 20:33:05 +02:00
int ret ;
drm/i915/display/cdclk: Make WARN* drm specific where drm_priv 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_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_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,
...)
)
...+>
}
@rule2@
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/20200220165507.16823-2-pankaj.laxminarayan.bharadiya@intel.com
2020-02-20 22:25:00 +05:30
if ( drm_WARN ( & dev_priv - > drm ,
( intel_de_read ( dev_priv , LCPLL_CTL ) &
( LCPLL_PLL_DISABLE | LCPLL_PLL_LOCK |
LCPLL_CD_CLOCK_DISABLE | LCPLL_ROOT_CD_CLOCK_DISABLE |
LCPLL_CD2X_CLOCK_DISABLE | LCPLL_POWER_DOWN_ALLOW |
LCPLL_CD_SOURCE_FCLK ) ) ! = LCPLL_PLL_LOCK ,
" trying to change cdclk frequency with cdclk not enabled \n " ) )
2017-02-07 20:33:05 +02:00
return ;
ret = sandybridge_pcode_write ( dev_priv ,
BDW_PCODE_DISPLAY_FREQ_CHANGE_REQ , 0x0 ) ;
if ( ret ) {
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_err ( & dev_priv - > drm ,
" failed to inform pcode about cdclk change \n " ) ;
2017-02-07 20:33:05 +02:00
return ;
}
2021-04-30 18:34:41 +03:00
intel_de_rmw ( dev_priv , LCPLL_CTL ,
0 , LCPLL_CD_SOURCE_FCLK ) ;
2017-02-07 20:33:05 +02:00
2017-09-08 16:28:29 +03:00
/*
* According to the spec , it should be enough to poll for this 1 us .
* However , extensive testing shows that this can take longer .
*/
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
if ( wait_for_us ( intel_de_read ( dev_priv , LCPLL_CTL ) &
2017-09-08 16:28:29 +03:00
LCPLL_CD_SOURCE_FCLK_DONE , 100 ) )
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_err ( & dev_priv - > drm , " Switching to FCLK failed \n " ) ;
2017-02-07 20:33:05 +02:00
2021-04-30 18:34:41 +03:00
intel_de_rmw ( dev_priv , LCPLL_CTL ,
LCPLL_CLK_FREQ_MASK , bdw_cdclk_freq_sel ( cdclk ) ) ;
2017-02-07 20:33:05 +02:00
2021-04-30 18:34:41 +03:00
intel_de_rmw ( dev_priv , LCPLL_CTL ,
LCPLL_CD_SOURCE_FCLK , 0 ) ;
2017-02-07 20:33:05 +02:00
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
if ( wait_for_us ( ( intel_de_read ( dev_priv , LCPLL_CTL ) &
LCPLL_CD_SOURCE_FCLK_DONE ) = = 0 , 1 ) )
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_err ( & dev_priv - > drm , " Switching back to LCPLL failed \n " ) ;
2017-02-07 20:33:05 +02:00
2017-10-24 12:52:10 +03:00
sandybridge_pcode_write ( dev_priv , HSW_PCODE_DE_WRITE_FREQ_REQ ,
2020-01-20 19:47:17 +02:00
cdclk_config - > voltage_level ) ;
2017-02-07 20:33:05 +02:00
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
intel_de_write ( dev_priv , CDCLK_FREQ ,
DIV_ROUND_CLOSEST ( cdclk , 1000 ) - 1 ) ;
2017-02-07 20:33:05 +02:00
intel_update_cdclk ( dev_priv ) ;
}
2017-08-30 21:57:03 +03:00
static int skl_calc_cdclk ( int min_cdclk , int vco )
2017-02-07 20:33:05 +02:00
{
if ( vco = = 8640000 ) {
2017-08-30 21:57:03 +03:00
if ( min_cdclk > 540000 )
2017-02-07 20:33:05 +02:00
return 617143 ;
2017-08-30 21:57:03 +03:00
else if ( min_cdclk > 432000 )
2017-02-07 20:33:05 +02:00
return 540000 ;
2017-08-30 21:57:03 +03:00
else if ( min_cdclk > 308571 )
2017-02-07 20:33:05 +02:00
return 432000 ;
else
return 308571 ;
} else {
2017-08-30 21:57:03 +03:00
if ( min_cdclk > 540000 )
2017-02-07 20:33:05 +02:00
return 675000 ;
2017-08-30 21:57:03 +03:00
else if ( min_cdclk > 450000 )
2017-02-07 20:33:05 +02:00
return 540000 ;
2017-08-30 21:57:03 +03:00
else if ( min_cdclk > 337500 )
2017-02-07 20:33:05 +02:00
return 450000 ;
else
return 337500 ;
}
}
2017-10-24 12:52:11 +03:00
static u8 skl_calc_voltage_level ( int cdclk )
{
2019-06-10 14:48:47 -07:00
if ( cdclk > 540000 )
2017-10-24 12:52:11 +03:00
return 3 ;
2019-06-10 14:48:47 -07:00
else if ( cdclk > 450000 )
return 2 ;
else if ( cdclk > 337500 )
return 1 ;
else
return 0 ;
2017-10-24 12:52:11 +03:00
}
2017-02-07 20:33:45 +02:00
static void skl_dpll0_update ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config * cdclk_config )
2017-02-07 20:33:05 +02:00
{
u32 val ;
2020-01-20 19:47:17 +02:00
cdclk_config - > ref = 24000 ;
cdclk_config - > vco = 0 ;
2017-02-07 20:33:05 +02:00
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
val = intel_de_read ( dev_priv , LCPLL1_CTL ) ;
2017-02-07 20:33:05 +02:00
if ( ( val & LCPLL_PLL_ENABLE ) = = 0 )
return ;
drm/i915/display/cdclk: Make WARN* drm specific where drm_priv 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_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_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,
...)
)
...+>
}
@rule2@
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/20200220165507.16823-2-pankaj.laxminarayan.bharadiya@intel.com
2020-02-20 22:25:00 +05:30
if ( drm_WARN_ON ( & dev_priv - > drm , ( val & LCPLL_PLL_LOCK ) = = 0 ) )
2017-02-07 20:33:05 +02:00
return ;
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
val = intel_de_read ( dev_priv , DPLL_CTRL1 ) ;
2017-02-07 20:33:05 +02:00
drm/i915/display/cdclk: Make WARN* drm specific where drm_priv 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_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_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,
...)
)
...+>
}
@rule2@
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/20200220165507.16823-2-pankaj.laxminarayan.bharadiya@intel.com
2020-02-20 22:25:00 +05:30
if ( drm_WARN_ON ( & dev_priv - > drm ,
( val & ( DPLL_CTRL1_HDMI_MODE ( SKL_DPLL0 ) |
DPLL_CTRL1_SSC ( SKL_DPLL0 ) |
DPLL_CTRL1_OVERRIDE ( SKL_DPLL0 ) ) ) ! =
DPLL_CTRL1_OVERRIDE ( SKL_DPLL0 ) ) )
2017-02-07 20:33:05 +02:00
return ;
switch ( val & DPLL_CTRL1_LINK_RATE_MASK ( SKL_DPLL0 ) ) {
case DPLL_CTRL1_LINK_RATE ( DPLL_CTRL1_LINK_RATE_810 , SKL_DPLL0 ) :
case DPLL_CTRL1_LINK_RATE ( DPLL_CTRL1_LINK_RATE_1350 , SKL_DPLL0 ) :
case DPLL_CTRL1_LINK_RATE ( DPLL_CTRL1_LINK_RATE_1620 , SKL_DPLL0 ) :
case DPLL_CTRL1_LINK_RATE ( DPLL_CTRL1_LINK_RATE_2700 , SKL_DPLL0 ) :
2020-01-20 19:47:17 +02:00
cdclk_config - > vco = 8100000 ;
2017-02-07 20:33:05 +02:00
break ;
case DPLL_CTRL1_LINK_RATE ( DPLL_CTRL1_LINK_RATE_1080 , SKL_DPLL0 ) :
case DPLL_CTRL1_LINK_RATE ( DPLL_CTRL1_LINK_RATE_2160 , SKL_DPLL0 ) :
2020-01-20 19:47:17 +02:00
cdclk_config - > vco = 8640000 ;
2017-02-07 20:33:05 +02:00
break ;
default :
MISSING_CASE ( val & DPLL_CTRL1_LINK_RATE_MASK ( SKL_DPLL0 ) ) ;
break ;
}
}
2017-02-07 20:33:45 +02:00
static void skl_get_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config * cdclk_config )
2017-02-07 20:33:05 +02:00
{
u32 cdctl ;
2020-01-20 19:47:17 +02:00
skl_dpll0_update ( dev_priv , cdclk_config ) ;
2017-02-07 20:33:05 +02:00
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = cdclk_config - > bypass = cdclk_config - > ref ;
2017-02-07 20:33:45 +02:00
2020-01-20 19:47:17 +02:00
if ( cdclk_config - > vco = = 0 )
2017-10-24 12:52:11 +03:00
goto out ;
2017-02-07 20:33:05 +02:00
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
cdctl = intel_de_read ( dev_priv , CDCLK_CTL ) ;
2017-02-07 20:33:05 +02:00
2020-01-20 19:47:17 +02:00
if ( cdclk_config - > vco = = 8640000 ) {
2017-02-07 20:33:05 +02:00
switch ( cdctl & CDCLK_FREQ_SEL_MASK ) {
case CDCLK_FREQ_450_432 :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 432000 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
case CDCLK_FREQ_337_308 :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 308571 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
case CDCLK_FREQ_540 :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 540000 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
case CDCLK_FREQ_675_617 :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 617143 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
default :
MISSING_CASE ( cdctl & CDCLK_FREQ_SEL_MASK ) ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
}
} else {
switch ( cdctl & CDCLK_FREQ_SEL_MASK ) {
case CDCLK_FREQ_450_432 :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 450000 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
case CDCLK_FREQ_337_308 :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 337500 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
case CDCLK_FREQ_540 :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 540000 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
case CDCLK_FREQ_675_617 :
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = 675000 ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
default :
MISSING_CASE ( cdctl & CDCLK_FREQ_SEL_MASK ) ;
2017-02-07 20:33:45 +02:00
break ;
2017-02-07 20:33:05 +02:00
}
}
2017-10-24 12:52:11 +03:00
out :
/*
* Can ' t read this out : ( Let ' s assume it ' s
* at least what the CDCLK frequency requires .
*/
2020-01-20 19:47:17 +02:00
cdclk_config - > voltage_level =
skl_calc_voltage_level ( cdclk_config - > cdclk ) ;
2017-02-07 20:33:05 +02:00
}
/* convert from kHz to .1 fixpoint MHz with -1MHz offset */
static int skl_cdclk_decimal ( int cdclk )
{
return DIV_ROUND_CLOSEST ( cdclk - 1000 , 500 ) ;
}
static void skl_set_preferred_cdclk_vco ( struct drm_i915_private * dev_priv ,
int vco )
{
bool changed = dev_priv - > skl_preferred_vco_freq ! = vco ;
dev_priv - > skl_preferred_vco_freq = vco ;
if ( changed )
intel_update_max_cdclk ( dev_priv ) ;
}
2021-04-30 18:34:40 +03:00
static u32 skl_dpll0_link_rate ( struct drm_i915_private * dev_priv , int vco )
2017-02-07 20:33:05 +02:00
{
drm/i915/display/cdclk: Make WARN* drm specific where drm_priv 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_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_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,
...)
)
...+>
}
@rule2@
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/20200220165507.16823-2-pankaj.laxminarayan.bharadiya@intel.com
2020-02-20 22:25:00 +05:30
drm_WARN_ON ( & dev_priv - > drm , vco ! = 8100000 & & vco ! = 8640000 ) ;
2017-02-07 20:33:05 +02:00
/*
* We always enable DPLL0 with the lowest link rate possible , but still
* taking into account the VCO required to operate the eDP panel at the
* desired frequency . The usual DP link rates operate with a VCO of
* 8100 while the eDP 1.4 alternate link rates need a VCO of 8640.
* The modeset code is responsible for the selection of the exact link
* rate later on , with the constraint of choosing a frequency that
* works with vco .
*/
2021-04-30 18:34:40 +03:00
if ( vco = = 8640000 )
return DPLL_CTRL1_LINK_RATE ( DPLL_CTRL1_LINK_RATE_1080 , SKL_DPLL0 ) ;
else
return DPLL_CTRL1_LINK_RATE ( DPLL_CTRL1_LINK_RATE_810 , SKL_DPLL0 ) ;
}
static void skl_dpll0_enable ( struct drm_i915_private * dev_priv , int vco )
{
2021-04-30 18:34:42 +03:00
intel_de_rmw ( dev_priv , DPLL_CTRL1 ,
DPLL_CTRL1_HDMI_MODE ( SKL_DPLL0 ) |
DPLL_CTRL1_SSC ( SKL_DPLL0 ) |
DPLL_CTRL1_LINK_RATE_MASK ( SKL_DPLL0 ) ,
DPLL_CTRL1_OVERRIDE ( SKL_DPLL0 ) |
skl_dpll0_link_rate ( dev_priv , vco ) ) ;
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
intel_de_posting_read ( dev_priv , DPLL_CTRL1 ) ;
2017-02-07 20:33:05 +02:00
2021-04-30 18:34:42 +03:00
intel_de_rmw ( dev_priv , LCPLL1_CTL ,
0 , LCPLL_PLL_ENABLE ) ;
2017-02-07 20:33:05 +02:00
2019-08-15 18:23:43 -07:00
if ( intel_de_wait_for_set ( dev_priv , LCPLL1_CTL , LCPLL_PLL_LOCK , 5 ) )
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_err ( & dev_priv - > drm , " DPLL0 not locked \n " ) ;
2017-02-07 20:33:05 +02:00
2017-02-07 20:33:45 +02:00
dev_priv - > cdclk . hw . vco = vco ;
2017-02-07 20:33:05 +02:00
/* We'll want to keep using the current vco from now on. */
skl_set_preferred_cdclk_vco ( dev_priv , vco ) ;
}
static void skl_dpll0_disable ( struct drm_i915_private * dev_priv )
{
2021-04-30 18:34:42 +03:00
intel_de_rmw ( dev_priv , LCPLL1_CTL ,
LCPLL_PLL_ENABLE , 0 ) ;
2019-08-15 18:23:43 -07:00
if ( intel_de_wait_for_clear ( dev_priv , LCPLL1_CTL , LCPLL_PLL_LOCK , 1 ) )
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_err ( & dev_priv - > drm , " Couldn't disable DPLL0 \n " ) ;
2017-02-07 20:33:05 +02:00
2017-02-07 20:33:45 +02:00
dev_priv - > cdclk . hw . vco = 0 ;
2017-02-07 20:33:05 +02:00
}
2021-04-30 18:34:40 +03:00
static u32 skl_cdclk_freq_sel ( struct drm_i915_private * dev_priv ,
int cdclk , int vco )
{
switch ( cdclk ) {
default :
drm_WARN_ON ( & dev_priv - > drm ,
cdclk ! = dev_priv - > cdclk . hw . bypass ) ;
drm_WARN_ON ( & dev_priv - > drm , vco ! = 0 ) ;
fallthrough ;
case 308571 :
case 337500 :
return CDCLK_FREQ_337_308 ;
case 450000 :
case 432000 :
return CDCLK_FREQ_450_432 ;
case 540000 :
return CDCLK_FREQ_540 ;
case 617143 :
case 675000 :
return CDCLK_FREQ_675_617 ;
}
}
2017-02-07 20:33:05 +02:00
static void skl_set_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
const struct intel_cdclk_config * cdclk_config ,
2019-03-27 12:13:21 +02:00
enum pipe pipe )
2017-02-07 20:33:05 +02:00
{
2020-01-20 19:47:17 +02:00
int cdclk = cdclk_config - > cdclk ;
int vco = cdclk_config - > vco ;
2017-12-04 15:22:10 -08:00
u32 freq_select , cdclk_ctl ;
2017-02-07 20:33:05 +02:00
int ret ;
2018-06-08 17:41:37 +03:00
/*
* Based on WA # 1183 CDCLK rates 308 and 617 MHz CDCLK rates are
* unsupported on SKL . In theory this should never happen since only
* the eDP1 .4 2.16 and 4.32 Gbps rates require it , but eDP1 .4 is not
* supported on SKL either , see the above WA . WARN whenever trying to
* use the corresponding VCO freq as that always leads to using the
* minimum 308 MHz CDCLK .
*/
drm/i915/display/cdclk: Make WARN* drm specific where drm_priv 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_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_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,
...)
)
...+>
}
@rule2@
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/20200220165507.16823-2-pankaj.laxminarayan.bharadiya@intel.com
2020-02-20 22:25:00 +05:30
drm_WARN_ON_ONCE ( & dev_priv - > drm ,
IS_SKYLAKE ( dev_priv ) & & vco = = 8640000 ) ;
2018-06-08 17:41:37 +03:00
2017-02-07 20:33:05 +02:00
ret = skl_pcode_request ( dev_priv , SKL_PCODE_CDCLK_CONTROL ,
SKL_CDCLK_PREPARE_FOR_CHANGE ,
SKL_CDCLK_READY_FOR_CHANGE ,
SKL_CDCLK_READY_FOR_CHANGE , 3 ) ;
if ( ret ) {
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_err ( & dev_priv - > drm ,
" Failed to inform PCU about cdclk change (%d) \n " , ret ) ;
2017-02-07 20:33:05 +02:00
return ;
}
2021-04-30 18:34:40 +03:00
freq_select = skl_cdclk_freq_sel ( dev_priv , cdclk , vco ) ;
2017-02-07 20:33:05 +02:00
2017-02-07 20:33:45 +02:00
if ( dev_priv - > cdclk . hw . vco ! = 0 & &
dev_priv - > cdclk . hw . vco ! = vco )
2017-02-07 20:33:05 +02:00
skl_dpll0_disable ( dev_priv ) ;
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
cdclk_ctl = intel_de_read ( dev_priv , CDCLK_CTL ) ;
2017-12-04 15:22:10 -08:00
if ( dev_priv - > cdclk . hw . vco ! = vco ) {
/* Wa Display #1183: skl,kbl,cfl */
cdclk_ctl & = ~ ( CDCLK_FREQ_SEL_MASK | CDCLK_FREQ_DECIMAL_MASK ) ;
cdclk_ctl | = freq_select | skl_cdclk_decimal ( cdclk ) ;
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
intel_de_write ( dev_priv , CDCLK_CTL , cdclk_ctl ) ;
2017-12-04 15:22:10 -08:00
}
/* Wa Display #1183: skl,kbl,cfl */
cdclk_ctl | = CDCLK_DIVMUX_CD_OVERRIDE ;
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
intel_de_write ( dev_priv , CDCLK_CTL , cdclk_ctl ) ;
intel_de_posting_read ( dev_priv , CDCLK_CTL ) ;
2017-12-04 15:22:10 -08:00
2017-02-07 20:33:45 +02:00
if ( dev_priv - > cdclk . hw . vco ! = vco )
2017-02-07 20:33:05 +02:00
skl_dpll0_enable ( dev_priv , vco ) ;
2017-12-04 15:22:10 -08:00
/* Wa Display #1183: skl,kbl,cfl */
cdclk_ctl & = ~ ( CDCLK_FREQ_SEL_MASK | CDCLK_FREQ_DECIMAL_MASK ) ;
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
intel_de_write ( dev_priv , CDCLK_CTL , cdclk_ctl ) ;
2017-12-04 15:22:10 -08:00
cdclk_ctl | = freq_select | skl_cdclk_decimal ( cdclk ) ;
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
intel_de_write ( dev_priv , CDCLK_CTL , cdclk_ctl ) ;
2017-12-04 15:22:10 -08:00
/* Wa Display #1183: skl,kbl,cfl */
cdclk_ctl & = ~ CDCLK_DIVMUX_CD_OVERRIDE ;
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
intel_de_write ( dev_priv , CDCLK_CTL , cdclk_ctl ) ;
intel_de_posting_read ( dev_priv , CDCLK_CTL ) ;
2017-02-07 20:33:05 +02:00
/* inform PCU of the change */
2017-10-24 12:52:11 +03:00
sandybridge_pcode_write ( dev_priv , SKL_PCODE_CDCLK_CONTROL ,
2020-01-20 19:47:17 +02:00
cdclk_config - > voltage_level ) ;
2017-02-07 20:33:05 +02:00
intel_update_cdclk ( dev_priv ) ;
}
static void skl_sanitize_cdclk ( struct drm_i915_private * dev_priv )
{
2019-01-16 11:15:25 +02:00
u32 cdctl , expected ;
2017-02-07 20:33:05 +02:00
/*
* check if the pre - os initialized the display
* There is SWF18 scratchpad register defined which is set by the
* pre - os which can be used by the OS drivers to check the status
*/
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
if ( ( intel_de_read ( dev_priv , SWF_ILK ( 0x18 ) ) & 0x00FFFFFF ) = = 0 )
2017-02-07 20:33:05 +02:00
goto sanitize ;
intel_update_cdclk ( dev_priv ) ;
2020-01-20 19:47:17 +02:00
intel_dump_cdclk_config ( & dev_priv - > cdclk . hw , " Current CDCLK " ) ;
2017-10-24 12:52:16 +03:00
2017-02-07 20:33:05 +02:00
/* Is PLL enabled and locked ? */
2017-02-07 20:33:45 +02:00
if ( dev_priv - > cdclk . hw . vco = = 0 | |
2018-01-17 19:25:08 +02:00
dev_priv - > cdclk . hw . cdclk = = dev_priv - > cdclk . hw . bypass )
2017-02-07 20:33:05 +02:00
goto sanitize ;
/* DPLL okay; verify the cdclock
*
* Noticed in some instances that the freq selection is correct but
* decimal part is programmed wrong from BIOS where pre - os does not
* enable display . Verify the same as well .
*/
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
cdctl = intel_de_read ( dev_priv , CDCLK_CTL ) ;
2017-02-07 20:33:05 +02:00
expected = ( cdctl & CDCLK_FREQ_SEL_MASK ) |
2017-02-07 20:33:45 +02:00
skl_cdclk_decimal ( dev_priv - > cdclk . hw . cdclk ) ;
2017-02-07 20:33:05 +02:00
if ( cdctl = = expected )
/* All well; nothing to sanitize */
return ;
sanitize :
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_dbg_kms ( & dev_priv - > drm , " Sanitizing cdclk programmed by pre-os \n " ) ;
2017-02-07 20:33:05 +02:00
/* force cdclk programming */
2017-02-07 20:33:45 +02:00
dev_priv - > cdclk . hw . cdclk = 0 ;
2017-02-07 20:33:05 +02:00
/* force full PLL disable + enable */
2017-02-07 20:33:45 +02:00
dev_priv - > cdclk . hw . vco = - 1 ;
2017-02-07 20:33:05 +02:00
}
2020-01-20 19:47:21 +02:00
static void skl_cdclk_init_hw ( struct drm_i915_private * dev_priv )
2017-02-07 20:33:05 +02:00
{
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config cdclk_config ;
2017-02-07 20:33:05 +02:00
skl_sanitize_cdclk ( dev_priv ) ;
2017-02-07 20:33:45 +02:00
if ( dev_priv - > cdclk . hw . cdclk ! = 0 & &
dev_priv - > cdclk . hw . vco ! = 0 ) {
2017-02-07 20:33:05 +02:00
/*
* Use the current vco as our initial
* guess as to what the preferred vco is .
*/
if ( dev_priv - > skl_preferred_vco_freq = = 0 )
skl_set_preferred_cdclk_vco ( dev_priv ,
2017-02-07 20:33:45 +02:00
dev_priv - > cdclk . hw . vco ) ;
2017-02-07 20:33:05 +02:00
return ;
}
2020-01-20 19:47:17 +02:00
cdclk_config = dev_priv - > cdclk . hw ;
2017-01-20 20:22:01 +02:00
2020-01-20 19:47:17 +02:00
cdclk_config . vco = dev_priv - > skl_preferred_vco_freq ;
if ( cdclk_config . vco = = 0 )
cdclk_config . vco = 8100000 ;
cdclk_config . cdclk = skl_calc_cdclk ( 0 , cdclk_config . vco ) ;
cdclk_config . voltage_level = skl_calc_voltage_level ( cdclk_config . cdclk ) ;
2017-02-07 20:33:05 +02:00
2020-01-20 19:47:17 +02:00
skl_set_cdclk ( dev_priv , & cdclk_config , INVALID_PIPE ) ;
2017-02-07 20:33:05 +02:00
}
2020-01-20 19:47:21 +02:00
static void skl_cdclk_uninit_hw ( struct drm_i915_private * dev_priv )
2017-02-07 20:33:05 +02:00
{
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config cdclk_config = dev_priv - > cdclk . hw ;
2017-01-20 20:22:01 +02:00
2020-01-20 19:47:17 +02:00
cdclk_config . cdclk = cdclk_config . bypass ;
cdclk_config . vco = 0 ;
cdclk_config . voltage_level = skl_calc_voltage_level ( cdclk_config . cdclk ) ;
2017-01-20 20:22:01 +02:00
2020-01-20 19:47:17 +02:00
skl_set_cdclk ( dev_priv , & cdclk_config , INVALID_PIPE ) ;
2017-02-07 20:33:05 +02:00
}
2019-09-10 09:15:06 -07:00
static const struct intel_cdclk_vals bxt_cdclk_table [ ] = {
{ . refclk = 19200 , . cdclk = 144000 , . divider = 8 , . ratio = 60 } ,
{ . refclk = 19200 , . cdclk = 288000 , . divider = 4 , . ratio = 60 } ,
{ . refclk = 19200 , . cdclk = 384000 , . divider = 3 , . ratio = 60 } ,
{ . refclk = 19200 , . cdclk = 576000 , . divider = 2 , . ratio = 60 } ,
{ . refclk = 19200 , . cdclk = 624000 , . divider = 2 , . ratio = 65 } ,
{ }
} ;
static const struct intel_cdclk_vals glk_cdclk_table [ ] = {
{ . refclk = 19200 , . cdclk = 79200 , . divider = 8 , . ratio = 33 } ,
{ . refclk = 19200 , . cdclk = 158400 , . divider = 4 , . ratio = 33 } ,
{ . refclk = 19200 , . cdclk = 316800 , . divider = 2 , . ratio = 33 } ,
{ }
} ;
static const struct intel_cdclk_vals cnl_cdclk_table [ ] = {
{ . refclk = 19200 , . cdclk = 168000 , . divider = 4 , . ratio = 35 } ,
{ . refclk = 19200 , . cdclk = 336000 , . divider = 2 , . ratio = 35 } ,
{ . refclk = 19200 , . cdclk = 528000 , . divider = 2 , . ratio = 55 } ,
{ . refclk = 24000 , . cdclk = 168000 , . divider = 4 , . ratio = 28 } ,
{ . refclk = 24000 , . cdclk = 336000 , . divider = 2 , . ratio = 28 } ,
{ . refclk = 24000 , . cdclk = 528000 , . divider = 2 , . ratio = 44 } ,
{ }
} ;
static const struct intel_cdclk_vals icl_cdclk_table [ ] = {
{ . refclk = 19200 , . cdclk = 172800 , . divider = 2 , . ratio = 18 } ,
{ . refclk = 19200 , . cdclk = 192000 , . divider = 2 , . ratio = 20 } ,
{ . refclk = 19200 , . cdclk = 307200 , . divider = 2 , . ratio = 32 } ,
{ . refclk = 19200 , . cdclk = 326400 , . divider = 4 , . ratio = 68 } ,
{ . refclk = 19200 , . cdclk = 556800 , . divider = 2 , . ratio = 58 } ,
{ . refclk = 19200 , . cdclk = 652800 , . divider = 2 , . ratio = 68 } ,
{ . refclk = 24000 , . cdclk = 180000 , . divider = 2 , . ratio = 15 } ,
{ . refclk = 24000 , . cdclk = 192000 , . divider = 2 , . ratio = 16 } ,
{ . refclk = 24000 , . cdclk = 312000 , . divider = 2 , . ratio = 26 } ,
{ . refclk = 24000 , . cdclk = 324000 , . divider = 4 , . ratio = 54 } ,
{ . refclk = 24000 , . cdclk = 552000 , . divider = 2 , . ratio = 46 } ,
{ . refclk = 24000 , . cdclk = 648000 , . divider = 2 , . ratio = 54 } ,
{ . refclk = 38400 , . cdclk = 172800 , . divider = 2 , . ratio = 9 } ,
{ . refclk = 38400 , . cdclk = 192000 , . divider = 2 , . ratio = 10 } ,
{ . refclk = 38400 , . cdclk = 307200 , . divider = 2 , . ratio = 16 } ,
{ . refclk = 38400 , . cdclk = 326400 , . divider = 4 , . ratio = 34 } ,
{ . refclk = 38400 , . cdclk = 556800 , . divider = 2 , . ratio = 29 } ,
{ . refclk = 38400 , . cdclk = 652800 , . divider = 2 , . ratio = 34 } ,
{ }
} ;
2020-10-15 15:00:38 -07:00
static const struct intel_cdclk_vals rkl_cdclk_table [ ] = {
{ . refclk = 19200 , . cdclk = 172800 , . divider = 4 , . ratio = 36 } ,
{ . refclk = 19200 , . cdclk = 192000 , . divider = 4 , . ratio = 40 } ,
{ . refclk = 19200 , . cdclk = 307200 , . divider = 4 , . ratio = 64 } ,
{ . refclk = 19200 , . cdclk = 326400 , . divider = 8 , . ratio = 136 } ,
{ . refclk = 19200 , . cdclk = 556800 , . divider = 4 , . ratio = 116 } ,
{ . refclk = 19200 , . cdclk = 652800 , . divider = 4 , . ratio = 136 } ,
{ . refclk = 24000 , . cdclk = 180000 , . divider = 4 , . ratio = 30 } ,
{ . refclk = 24000 , . cdclk = 192000 , . divider = 4 , . ratio = 32 } ,
{ . refclk = 24000 , . cdclk = 312000 , . divider = 4 , . ratio = 52 } ,
{ . refclk = 24000 , . cdclk = 324000 , . divider = 8 , . ratio = 108 } ,
{ . refclk = 24000 , . cdclk = 552000 , . divider = 4 , . ratio = 92 } ,
{ . refclk = 24000 , . cdclk = 648000 , . divider = 4 , . ratio = 108 } ,
{ . refclk = 38400 , . cdclk = 172800 , . divider = 4 , . ratio = 18 } ,
{ . refclk = 38400 , . cdclk = 192000 , . divider = 4 , . ratio = 20 } ,
{ . refclk = 38400 , . cdclk = 307200 , . divider = 4 , . ratio = 32 } ,
{ . refclk = 38400 , . cdclk = 326400 , . divider = 8 , . ratio = 68 } ,
{ . refclk = 38400 , . cdclk = 556800 , . divider = 4 , . ratio = 58 } ,
{ . refclk = 38400 , . cdclk = 652800 , . divider = 4 , . ratio = 68 } ,
{ }
} ;
2021-05-14 08:37:00 -07:00
static const struct intel_cdclk_vals adlp_cdclk_table [ ] = {
{ . refclk = 19200 , . cdclk = 172800 , . divider = 3 , . ratio = 27 } ,
{ . refclk = 19200 , . cdclk = 192000 , . divider = 2 , . ratio = 20 } ,
{ . refclk = 19200 , . cdclk = 307200 , . divider = 2 , . ratio = 32 } ,
{ . refclk = 19200 , . cdclk = 556800 , . divider = 2 , . ratio = 58 } ,
{ . refclk = 19200 , . cdclk = 652800 , . divider = 2 , . ratio = 68 } ,
{ . refclk = 24000 , . cdclk = 176000 , . divider = 3 , . ratio = 22 } ,
{ . refclk = 24000 , . cdclk = 192000 , . divider = 2 , . ratio = 16 } ,
{ . refclk = 24000 , . cdclk = 312000 , . divider = 2 , . ratio = 26 } ,
{ . refclk = 24000 , . cdclk = 552000 , . divider = 2 , . ratio = 46 } ,
{ . refclk = 24400 , . cdclk = 648000 , . divider = 2 , . ratio = 54 } ,
{ . refclk = 38400 , . cdclk = 179200 , . divider = 3 , . ratio = 14 } ,
{ . refclk = 38400 , . cdclk = 192000 , . divider = 2 , . ratio = 10 } ,
{ . refclk = 38400 , . cdclk = 307200 , . divider = 2 , . ratio = 16 } ,
{ . refclk = 38400 , . cdclk = 556800 , . divider = 2 , . ratio = 29 } ,
{ . refclk = 38400 , . cdclk = 652800 , . divider = 2 , . ratio = 34 } ,
{ }
} ;
2019-09-10 09:15:06 -07:00
static int bxt_calc_cdclk ( struct drm_i915_private * dev_priv , int min_cdclk )
{
const struct intel_cdclk_vals * table = dev_priv - > cdclk . table ;
int i ;
for ( i = 0 ; table [ i ] . refclk ; i + + )
if ( table [ i ] . refclk = = dev_priv - > cdclk . hw . ref & &
table [ i ] . cdclk > = min_cdclk )
return table [ i ] . cdclk ;
drm/i915/display/cdclk: Make WARN* drm specific where drm_priv 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_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_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,
...)
)
...+>
}
@rule2@
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/20200220165507.16823-2-pankaj.laxminarayan.bharadiya@intel.com
2020-02-20 22:25:00 +05:30
drm_WARN ( & dev_priv - > drm , 1 ,
" Cannot satisfy minimum cdclk %d with refclk %u \n " ,
min_cdclk , dev_priv - > cdclk . hw . ref ) ;
2019-09-10 09:15:06 -07:00
return 0 ;
2017-02-07 20:33:05 +02:00
}
2019-09-10 09:15:06 -07:00
static int bxt_calc_cdclk_pll_vco ( struct drm_i915_private * dev_priv , int cdclk )
2017-02-07 20:33:05 +02:00
{
2019-09-10 09:15:06 -07:00
const struct intel_cdclk_vals * table = dev_priv - > cdclk . table ;
int i ;
if ( cdclk = = dev_priv - > cdclk . hw . bypass )
return 0 ;
for ( i = 0 ; table [ i ] . refclk ; i + + )
if ( table [ i ] . refclk = = dev_priv - > cdclk . hw . ref & &
table [ i ] . cdclk = = cdclk )
return dev_priv - > cdclk . hw . ref * table [ i ] . ratio ;
drm/i915/display/cdclk: Make WARN* drm specific where drm_priv 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_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_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,
...)
)
...+>
}
@rule2@
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/20200220165507.16823-2-pankaj.laxminarayan.bharadiya@intel.com
2020-02-20 22:25:00 +05:30
drm_WARN ( & dev_priv - > drm , 1 , " cdclk %d not valid for refclk %u \n " ,
cdclk , dev_priv - > cdclk . hw . ref ) ;
2019-09-10 09:15:06 -07:00
return 0 ;
2017-02-07 20:33:05 +02:00
}
2017-10-24 12:52:12 +03:00
static u8 bxt_calc_voltage_level ( int cdclk )
{
return DIV_ROUND_UP ( cdclk , 25000 ) ;
}
2019-09-10 09:05:20 -07:00
static u8 cnl_calc_voltage_level ( int cdclk )
{
if ( cdclk > 336000 )
return 2 ;
else if ( cdclk > 168000 )
return 1 ;
else
return 0 ;
}
static u8 icl_calc_voltage_level ( int cdclk )
{
if ( cdclk > 556800 )
return 2 ;
else if ( cdclk > 312000 )
return 1 ;
else
return 0 ;
}
static u8 ehl_calc_voltage_level ( int cdclk )
{
2019-11-18 08:44:12 -08:00
if ( cdclk > 326400 )
return 3 ;
else if ( cdclk > 312000 )
2019-09-10 09:05:20 -07:00
return 2 ;
else if ( cdclk > 180000 )
return 1 ;
else
return 0 ;
}
2020-02-06 16:14:17 -08:00
static u8 tgl_calc_voltage_level ( int cdclk )
{
if ( cdclk > 556800 )
return 3 ;
else if ( cdclk > 326400 )
return 2 ;
else if ( cdclk > 312000 )
return 1 ;
else
return 0 ;
}
2019-09-10 09:05:20 -07:00
static void cnl_readout_refclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config * cdclk_config )
2017-02-07 20:33:05 +02:00
{
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
if ( intel_de_read ( dev_priv , SKL_DSSM ) & CNL_DSSM_CDCLK_PLL_REFCLK_24MHz )
2020-01-20 19:47:17 +02:00
cdclk_config - > ref = 24000 ;
2019-09-10 09:05:20 -07:00
else
2020-01-20 19:47:17 +02:00
cdclk_config - > ref = 19200 ;
2019-09-10 09:05:20 -07:00
}
2017-02-07 20:33:05 +02:00
2019-09-10 09:05:20 -07:00
static void icl_readout_refclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config * cdclk_config )
2019-09-10 09:05:20 -07:00
{
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
u32 dssm = intel_de_read ( dev_priv , SKL_DSSM ) & ICL_DSSM_CDCLK_PLL_REFCLK_MASK ;
2019-09-10 09:05:20 -07:00
switch ( dssm ) {
default :
MISSING_CASE ( dssm ) ;
2020-08-23 17:36:59 -05:00
fallthrough ;
2019-09-10 09:05:20 -07:00
case ICL_DSSM_CDCLK_PLL_REFCLK_24MHz :
2020-01-20 19:47:17 +02:00
cdclk_config - > ref = 24000 ;
2019-09-10 09:05:20 -07:00
break ;
case ICL_DSSM_CDCLK_PLL_REFCLK_19_2MHz :
2020-01-20 19:47:17 +02:00
cdclk_config - > ref = 19200 ;
2019-09-10 09:05:20 -07:00
break ;
case ICL_DSSM_CDCLK_PLL_REFCLK_38_4MHz :
2020-01-20 19:47:17 +02:00
cdclk_config - > ref = 38400 ;
2019-09-10 09:05:20 -07:00
break ;
}
}
static void bxt_de_pll_readout ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config * cdclk_config )
2019-09-10 09:05:20 -07:00
{
u32 val , ratio ;
2021-03-19 21:42:42 -07:00
if ( DISPLAY_VER ( dev_priv ) > = 11 )
2020-01-20 19:47:17 +02:00
icl_readout_refclk ( dev_priv , cdclk_config ) ;
2019-09-10 09:05:20 -07:00
else if ( IS_CANNONLAKE ( dev_priv ) )
2020-01-20 19:47:17 +02:00
cnl_readout_refclk ( dev_priv , cdclk_config ) ;
2019-09-10 09:05:20 -07:00
else
2020-01-20 19:47:17 +02:00
cdclk_config - > ref = 19200 ;
2017-02-07 20:33:05 +02:00
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
val = intel_de_read ( dev_priv , BXT_DE_PLL_ENABLE ) ;
2019-09-10 09:05:20 -07:00
if ( ( val & BXT_DE_PLL_PLL_ENABLE ) = = 0 | |
( val & BXT_DE_PLL_LOCK ) = = 0 ) {
/*
* CDCLK PLL is disabled , the VCO / ratio doesn ' t matter , but
* setting it to zero is a way to signal that .
*/
2020-01-20 19:47:17 +02:00
cdclk_config - > vco = 0 ;
2017-02-07 20:33:05 +02:00
return ;
2019-09-10 09:05:20 -07:00
}
2017-02-07 20:33:05 +02:00
2019-09-10 09:05:20 -07:00
/*
* CNL + have the ratio directly in the PLL enable register , gen9lp had
* it in a separate PLL control register .
*/
drm/i915/display: Simplify GLK display version tests
GLK has always been a bit of a special case since it reports INTEL_GEN()
as 9, but has version 10 display IP. Now we can properly represent the
display version as 10 and simplify the display generation tests
throughout the display code.
Aside from manually adding the version to the glk_info structure, the
rest of this patch is generated with a Coccinelle semantic patch. Note
that we also need to switch any code that matches gen10 today but *not*
GLK to be CNL-specific:
@@ expression dev_priv; @@
- DISPLAY_VER(dev_priv) > 9
+ DISPLAY_VER(dev_priv) >= 10
@@ expression dev_priv, E; @@
(
- DISPLAY_VER(dev_priv) >= 10 && E
+ (DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)) && E
|
- DISPLAY_VER(dev_priv) >= 10
+ DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)
|
- IS_DISPLAY_RANGE(dev_priv, 10, E)
+ IS_DISPLAY_RANGE(dev_priv, 11, E) || IS_CANNONLAKE(dev_priv)
)
@@ expression dev_priv, E, E2; @@
(
- (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 10)
|
- E || IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv)
+ E || IS_DISPLAY_VER(dev_priv, 10)
|
- (IS_GEMINILAKE(dev_priv) || IS_CANNONLAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 10)
|
- IS_GEMINILAKE(dev_priv) || E || IS_CANNONLAKE(dev_priv)
+ E || IS_DISPLAY_VER(dev_priv, 10)
|
- E || IS_GEMINILAKE(dev_priv) || E2 || IS_CANNONLAKE(dev_priv)
+ E || E2 || IS_DISPLAY_VER(dev_priv, 10)
|
- (IS_DISPLAY_VER(dev_priv, 10) || IS_GEMINILAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 10)
|
- (IS_GEMINILAKE(dev_priv) || IS_DISPLAY_VER(dev_priv, 10))
+ IS_DISPLAY_VER(dev_priv, 10)
)
@@ expression dev_priv; @@
- (IS_DISPLAY_VER(dev_priv, 9) && !IS_GEMINILAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 9)
@@ expression dev_priv; @@
(
- !(DISPLAY_VER(dev_priv) >= 11 || IS_DISPLAY_VER(dev_priv, 10))
+ DISPLAY_VER(dev_priv) < 10
|
- (DISPLAY_VER(dev_priv) >= 11 || IS_DISPLAY_VER(dev_priv, 10))
+ DISPLAY_VER(dev_priv) >= 10
)
@@ expression dev_priv, E; @@
- E || DISPLAY_VER(dev_priv) >= 11 || IS_DISPLAY_VER(dev_priv, 10)
+ E || DISPLAY_VER(dev_priv) >= 10
@@ expression dev_priv, E; @@
- (IS_DISPLAY_RANGE(dev_priv, 11, E) || IS_DISPLAY_VER(dev_priv, 10))
+ IS_DISPLAY_RANGE(dev_priv, 10, E)
@@ expression dev_priv; @@
(
- DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv) || IS_GEN9_LP(dev_priv)
+ DISPLAY_VER(dev_priv) >= 10 || IS_GEN9_LP(dev_priv)
|
- IS_GEN9_LP(dev_priv) || DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)
+ IS_GEN9_LP(dev_priv) || DISPLAY_VER(dev_priv) >= 10
)
@@ expression dev_priv, E; @@
- !(DISPLAY_VER(dev_priv) >= E)
+ DISPLAY_VER(dev_priv) < E
v2:
- Convert gen10 conditions that don't include GLK into CNL conditions.
(Ville)
v3:
- Rework coccinelle rules so that "ver>=10" turns into "ver>=11||is_cnl." (Ville)
v3.1:
- Manually re-add the ".display.version = 10" to glk_info after
regenerating patch via Coccinelle.
v4:
- Also apply cocci rules to intel_pm.c and i915_irq.c! (CI)
Cc: Ville Syrjälä <ville.syrjala@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210322233840.4056851-1-matthew.d.roper@intel.com
2021-03-22 16:38:40 -07:00
if ( DISPLAY_VER ( dev_priv ) > = 11 | | IS_CANNONLAKE ( dev_priv ) )
2019-09-10 09:05:20 -07:00
ratio = val & CNL_CDCLK_PLL_RATIO_MASK ;
else
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
ratio = intel_de_read ( dev_priv , BXT_DE_PLL_CTL ) & BXT_DE_PLL_RATIO_MASK ;
2017-02-07 20:33:05 +02:00
2020-01-20 19:47:17 +02:00
cdclk_config - > vco = ratio * cdclk_config - > ref ;
2017-02-07 20:33:05 +02:00
}
2017-02-07 20:33:45 +02:00
static void bxt_get_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config * cdclk_config )
2017-02-07 20:33:05 +02:00
{
u32 divider ;
2017-02-07 20:33:45 +02:00
int div ;
2017-02-07 20:33:05 +02:00
2020-01-20 19:47:17 +02:00
bxt_de_pll_readout ( dev_priv , cdclk_config ) ;
2019-09-11 16:31:26 +03:00
2021-03-19 21:42:42 -07:00
if ( DISPLAY_VER ( dev_priv ) > = 12 )
2020-01-20 19:47:17 +02:00
cdclk_config - > bypass = cdclk_config - > ref / 2 ;
2021-03-19 21:42:42 -07:00
else if ( DISPLAY_VER ( dev_priv ) > = 11 )
2020-01-20 19:47:17 +02:00
cdclk_config - > bypass = 50000 ;
2019-09-10 09:05:20 -07:00
else
2020-01-20 19:47:17 +02:00
cdclk_config - > bypass = cdclk_config - > ref ;
2017-02-07 20:33:45 +02:00
2020-01-20 19:47:17 +02:00
if ( cdclk_config - > vco = = 0 ) {
cdclk_config - > cdclk = cdclk_config - > bypass ;
2017-10-24 12:52:12 +03:00
goto out ;
2019-09-10 09:05:20 -07:00
}
2017-02-07 20:33:05 +02:00
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
divider = intel_de_read ( dev_priv , CDCLK_CTL ) & BXT_CDCLK_CD2X_DIV_SEL_MASK ;
2017-02-07 20:33:05 +02:00
switch ( divider ) {
case BXT_CDCLK_CD2X_DIV_SEL_1 :
div = 2 ;
break ;
case BXT_CDCLK_CD2X_DIV_SEL_1_5 :
div = 3 ;
break ;
case BXT_CDCLK_CD2X_DIV_SEL_2 :
div = 4 ;
break ;
case BXT_CDCLK_CD2X_DIV_SEL_4 :
div = 8 ;
break ;
default :
MISSING_CASE ( divider ) ;
2017-02-07 20:33:45 +02:00
return ;
2017-02-07 20:33:05 +02:00
}
2020-01-20 19:47:17 +02:00
cdclk_config - > cdclk = DIV_ROUND_CLOSEST ( cdclk_config - > vco , div ) ;
2017-10-24 12:52:12 +03:00
out :
/*
* Can ' t read this out : ( Let ' s assume it ' s
* at least what the CDCLK frequency requires .
*/
2020-01-20 19:47:17 +02:00
cdclk_config - > voltage_level =
dev_priv - > display . calc_voltage_level ( cdclk_config - > cdclk ) ;
2017-02-07 20:33:05 +02:00
}
static void bxt_de_pll_disable ( struct drm_i915_private * dev_priv )
{
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
intel_de_write ( dev_priv , BXT_DE_PLL_ENABLE , 0 ) ;
2017-02-07 20:33:05 +02:00
/* Timeout 200us */
2019-08-15 18:23:43 -07:00
if ( intel_de_wait_for_clear ( dev_priv ,
BXT_DE_PLL_ENABLE , BXT_DE_PLL_LOCK , 1 ) )
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_err ( & dev_priv - > drm , " timeout waiting for DE PLL unlock \n " ) ;
2017-02-07 20:33:05 +02:00
2017-02-07 20:33:45 +02:00
dev_priv - > cdclk . hw . vco = 0 ;
2017-02-07 20:33:05 +02:00
}
static void bxt_de_pll_enable ( struct drm_i915_private * dev_priv , int vco )
{
2017-02-07 20:33:45 +02:00
int ratio = DIV_ROUND_CLOSEST ( vco , dev_priv - > cdclk . hw . ref ) ;
2017-02-07 20:33:05 +02:00
2021-04-30 18:34:43 +03:00
intel_de_rmw ( dev_priv , BXT_DE_PLL_CTL ,
BXT_DE_PLL_RATIO_MASK , BXT_DE_PLL_RATIO ( ratio ) ) ;
2017-02-07 20:33:05 +02:00
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
intel_de_write ( dev_priv , BXT_DE_PLL_ENABLE , BXT_DE_PLL_PLL_ENABLE ) ;
2017-02-07 20:33:05 +02:00
/* Timeout 200us */
2019-08-15 18:23:43 -07:00
if ( intel_de_wait_for_set ( dev_priv ,
BXT_DE_PLL_ENABLE , BXT_DE_PLL_LOCK , 1 ) )
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_err ( & dev_priv - > drm , " timeout waiting for DE PLL lock \n " ) ;
2017-02-07 20:33:05 +02:00
2017-02-07 20:33:45 +02:00
dev_priv - > cdclk . hw . vco = vco ;
2017-02-07 20:33:05 +02:00
}
2019-09-10 08:42:47 -07:00
static void cnl_cdclk_pll_disable ( struct drm_i915_private * dev_priv )
{
2021-04-30 18:34:43 +03:00
intel_de_rmw ( dev_priv , BXT_DE_PLL_ENABLE ,
BXT_DE_PLL_PLL_ENABLE , 0 ) ;
2019-09-10 08:42:47 -07:00
/* Timeout 200us */
2021-04-30 18:34:44 +03:00
if ( intel_de_wait_for_clear ( dev_priv , BXT_DE_PLL_ENABLE , BXT_DE_PLL_LOCK , 1 ) )
drm_err ( & dev_priv - > drm , " timeout waiting for CDCLK PLL unlock \n " ) ;
2019-09-10 08:42:47 -07:00
dev_priv - > cdclk . hw . vco = 0 ;
}
static void cnl_cdclk_pll_enable ( struct drm_i915_private * dev_priv , int vco )
{
int ratio = DIV_ROUND_CLOSEST ( vco , dev_priv - > cdclk . hw . ref ) ;
u32 val ;
val = CNL_CDCLK_PLL_RATIO ( ratio ) ;
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
intel_de_write ( dev_priv , BXT_DE_PLL_ENABLE , val ) ;
2019-09-10 08:42:47 -07:00
val | = BXT_DE_PLL_PLL_ENABLE ;
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
intel_de_write ( dev_priv , BXT_DE_PLL_ENABLE , val ) ;
2019-09-10 08:42:47 -07:00
/* Timeout 200us */
2021-04-30 18:34:44 +03:00
if ( intel_de_wait_for_set ( dev_priv , BXT_DE_PLL_ENABLE , BXT_DE_PLL_LOCK , 1 ) )
drm_err ( & dev_priv - > drm , " timeout waiting for CDCLK PLL lock \n " ) ;
2019-09-10 08:42:47 -07:00
dev_priv - > cdclk . hw . vco = vco ;
}
2019-09-11 16:31:27 +03:00
static u32 bxt_cdclk_cd2x_pipe ( struct drm_i915_private * dev_priv , enum pipe pipe )
{
2021-03-19 21:42:42 -07:00
if ( DISPLAY_VER ( dev_priv ) > = 12 ) {
2019-09-11 16:31:27 +03:00
if ( pipe = = INVALID_PIPE )
return TGL_CDCLK_CD2X_PIPE_NONE ;
else
return TGL_CDCLK_CD2X_PIPE ( pipe ) ;
2021-03-19 21:42:42 -07:00
} else if ( DISPLAY_VER ( dev_priv ) > = 11 ) {
2019-09-11 16:31:27 +03:00
if ( pipe = = INVALID_PIPE )
return ICL_CDCLK_CD2X_PIPE_NONE ;
else
return ICL_CDCLK_CD2X_PIPE ( pipe ) ;
} else {
if ( pipe = = INVALID_PIPE )
return BXT_CDCLK_CD2X_PIPE_NONE ;
else
return BXT_CDCLK_CD2X_PIPE ( pipe ) ;
}
}
2021-04-30 18:34:40 +03:00
static u32 bxt_cdclk_cd2x_div_sel ( struct drm_i915_private * dev_priv ,
int cdclk , int vco )
{
/* cdclk = vco / 2 / div{1,1.5,2,4} */
switch ( DIV_ROUND_CLOSEST ( vco , cdclk ) ) {
default :
drm_WARN_ON ( & dev_priv - > drm ,
cdclk ! = dev_priv - > cdclk . hw . bypass ) ;
drm_WARN_ON ( & dev_priv - > drm , vco ! = 0 ) ;
fallthrough ;
case 2 :
return BXT_CDCLK_CD2X_DIV_SEL_1 ;
case 3 :
return BXT_CDCLK_CD2X_DIV_SEL_1_5 ;
case 4 :
return BXT_CDCLK_CD2X_DIV_SEL_2 ;
case 8 :
return BXT_CDCLK_CD2X_DIV_SEL_4 ;
}
}
2017-01-20 20:21:57 +02:00
static void bxt_set_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
const struct intel_cdclk_config * cdclk_config ,
2019-03-27 12:13:21 +02:00
enum pipe pipe )
2017-02-07 20:33:05 +02:00
{
2020-01-20 19:47:17 +02:00
int cdclk = cdclk_config - > cdclk ;
int vco = cdclk_config - > vco ;
2021-04-30 18:34:40 +03:00
u32 val ;
2017-01-20 20:21:57 +02:00
int ret ;
2017-02-07 20:33:05 +02:00
2019-09-10 08:42:47 -07:00
/* Inform power controller of upcoming frequency change. */
drm/i915/display: Simplify GLK display version tests
GLK has always been a bit of a special case since it reports INTEL_GEN()
as 9, but has version 10 display IP. Now we can properly represent the
display version as 10 and simplify the display generation tests
throughout the display code.
Aside from manually adding the version to the glk_info structure, the
rest of this patch is generated with a Coccinelle semantic patch. Note
that we also need to switch any code that matches gen10 today but *not*
GLK to be CNL-specific:
@@ expression dev_priv; @@
- DISPLAY_VER(dev_priv) > 9
+ DISPLAY_VER(dev_priv) >= 10
@@ expression dev_priv, E; @@
(
- DISPLAY_VER(dev_priv) >= 10 && E
+ (DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)) && E
|
- DISPLAY_VER(dev_priv) >= 10
+ DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)
|
- IS_DISPLAY_RANGE(dev_priv, 10, E)
+ IS_DISPLAY_RANGE(dev_priv, 11, E) || IS_CANNONLAKE(dev_priv)
)
@@ expression dev_priv, E, E2; @@
(
- (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 10)
|
- E || IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv)
+ E || IS_DISPLAY_VER(dev_priv, 10)
|
- (IS_GEMINILAKE(dev_priv) || IS_CANNONLAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 10)
|
- IS_GEMINILAKE(dev_priv) || E || IS_CANNONLAKE(dev_priv)
+ E || IS_DISPLAY_VER(dev_priv, 10)
|
- E || IS_GEMINILAKE(dev_priv) || E2 || IS_CANNONLAKE(dev_priv)
+ E || E2 || IS_DISPLAY_VER(dev_priv, 10)
|
- (IS_DISPLAY_VER(dev_priv, 10) || IS_GEMINILAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 10)
|
- (IS_GEMINILAKE(dev_priv) || IS_DISPLAY_VER(dev_priv, 10))
+ IS_DISPLAY_VER(dev_priv, 10)
)
@@ expression dev_priv; @@
- (IS_DISPLAY_VER(dev_priv, 9) && !IS_GEMINILAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 9)
@@ expression dev_priv; @@
(
- !(DISPLAY_VER(dev_priv) >= 11 || IS_DISPLAY_VER(dev_priv, 10))
+ DISPLAY_VER(dev_priv) < 10
|
- (DISPLAY_VER(dev_priv) >= 11 || IS_DISPLAY_VER(dev_priv, 10))
+ DISPLAY_VER(dev_priv) >= 10
)
@@ expression dev_priv, E; @@
- E || DISPLAY_VER(dev_priv) >= 11 || IS_DISPLAY_VER(dev_priv, 10)
+ E || DISPLAY_VER(dev_priv) >= 10
@@ expression dev_priv, E; @@
- (IS_DISPLAY_RANGE(dev_priv, 11, E) || IS_DISPLAY_VER(dev_priv, 10))
+ IS_DISPLAY_RANGE(dev_priv, 10, E)
@@ expression dev_priv; @@
(
- DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv) || IS_GEN9_LP(dev_priv)
+ DISPLAY_VER(dev_priv) >= 10 || IS_GEN9_LP(dev_priv)
|
- IS_GEN9_LP(dev_priv) || DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)
+ IS_GEN9_LP(dev_priv) || DISPLAY_VER(dev_priv) >= 10
)
@@ expression dev_priv, E; @@
- !(DISPLAY_VER(dev_priv) >= E)
+ DISPLAY_VER(dev_priv) < E
v2:
- Convert gen10 conditions that don't include GLK into CNL conditions.
(Ville)
v3:
- Rework coccinelle rules so that "ver>=10" turns into "ver>=11||is_cnl." (Ville)
v3.1:
- Manually re-add the ".display.version = 10" to glk_info after
regenerating patch via Coccinelle.
v4:
- Also apply cocci rules to intel_pm.c and i915_irq.c! (CI)
Cc: Ville Syrjälä <ville.syrjala@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210322233840.4056851-1-matthew.d.roper@intel.com
2021-03-22 16:38:40 -07:00
if ( DISPLAY_VER ( dev_priv ) > = 11 | | IS_CANNONLAKE ( dev_priv ) )
2019-09-10 08:42:47 -07:00
ret = skl_pcode_request ( dev_priv , SKL_PCODE_CDCLK_CONTROL ,
SKL_CDCLK_PREPARE_FOR_CHANGE ,
SKL_CDCLK_READY_FOR_CHANGE ,
SKL_CDCLK_READY_FOR_CHANGE , 3 ) ;
else
/*
* BSpec requires us to wait up to 150u sec , but that leads to
* timeouts ; the 2 ms used here is based on experiment .
*/
ret = sandybridge_pcode_write_timeout ( dev_priv ,
HSW_PCODE_DE_WRITE_FREQ_REQ ,
0x80000000 , 150 , 2 ) ;
if ( ret ) {
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_err ( & dev_priv - > drm ,
" Failed to inform PCU about cdclk change (err %d, freq %d) \n " ,
ret , cdclk ) ;
2019-09-10 08:42:47 -07:00
return ;
}
drm/i915/display: Simplify GLK display version tests
GLK has always been a bit of a special case since it reports INTEL_GEN()
as 9, but has version 10 display IP. Now we can properly represent the
display version as 10 and simplify the display generation tests
throughout the display code.
Aside from manually adding the version to the glk_info structure, the
rest of this patch is generated with a Coccinelle semantic patch. Note
that we also need to switch any code that matches gen10 today but *not*
GLK to be CNL-specific:
@@ expression dev_priv; @@
- DISPLAY_VER(dev_priv) > 9
+ DISPLAY_VER(dev_priv) >= 10
@@ expression dev_priv, E; @@
(
- DISPLAY_VER(dev_priv) >= 10 && E
+ (DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)) && E
|
- DISPLAY_VER(dev_priv) >= 10
+ DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)
|
- IS_DISPLAY_RANGE(dev_priv, 10, E)
+ IS_DISPLAY_RANGE(dev_priv, 11, E) || IS_CANNONLAKE(dev_priv)
)
@@ expression dev_priv, E, E2; @@
(
- (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 10)
|
- E || IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv)
+ E || IS_DISPLAY_VER(dev_priv, 10)
|
- (IS_GEMINILAKE(dev_priv) || IS_CANNONLAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 10)
|
- IS_GEMINILAKE(dev_priv) || E || IS_CANNONLAKE(dev_priv)
+ E || IS_DISPLAY_VER(dev_priv, 10)
|
- E || IS_GEMINILAKE(dev_priv) || E2 || IS_CANNONLAKE(dev_priv)
+ E || E2 || IS_DISPLAY_VER(dev_priv, 10)
|
- (IS_DISPLAY_VER(dev_priv, 10) || IS_GEMINILAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 10)
|
- (IS_GEMINILAKE(dev_priv) || IS_DISPLAY_VER(dev_priv, 10))
+ IS_DISPLAY_VER(dev_priv, 10)
)
@@ expression dev_priv; @@
- (IS_DISPLAY_VER(dev_priv, 9) && !IS_GEMINILAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 9)
@@ expression dev_priv; @@
(
- !(DISPLAY_VER(dev_priv) >= 11 || IS_DISPLAY_VER(dev_priv, 10))
+ DISPLAY_VER(dev_priv) < 10
|
- (DISPLAY_VER(dev_priv) >= 11 || IS_DISPLAY_VER(dev_priv, 10))
+ DISPLAY_VER(dev_priv) >= 10
)
@@ expression dev_priv, E; @@
- E || DISPLAY_VER(dev_priv) >= 11 || IS_DISPLAY_VER(dev_priv, 10)
+ E || DISPLAY_VER(dev_priv) >= 10
@@ expression dev_priv, E; @@
- (IS_DISPLAY_RANGE(dev_priv, 11, E) || IS_DISPLAY_VER(dev_priv, 10))
+ IS_DISPLAY_RANGE(dev_priv, 10, E)
@@ expression dev_priv; @@
(
- DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv) || IS_GEN9_LP(dev_priv)
+ DISPLAY_VER(dev_priv) >= 10 || IS_GEN9_LP(dev_priv)
|
- IS_GEN9_LP(dev_priv) || DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)
+ IS_GEN9_LP(dev_priv) || DISPLAY_VER(dev_priv) >= 10
)
@@ expression dev_priv, E; @@
- !(DISPLAY_VER(dev_priv) >= E)
+ DISPLAY_VER(dev_priv) < E
v2:
- Convert gen10 conditions that don't include GLK into CNL conditions.
(Ville)
v3:
- Rework coccinelle rules so that "ver>=10" turns into "ver>=11||is_cnl." (Ville)
v3.1:
- Manually re-add the ".display.version = 10" to glk_info after
regenerating patch via Coccinelle.
v4:
- Also apply cocci rules to intel_pm.c and i915_irq.c! (CI)
Cc: Ville Syrjälä <ville.syrjala@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210322233840.4056851-1-matthew.d.roper@intel.com
2021-03-22 16:38:40 -07:00
if ( DISPLAY_VER ( dev_priv ) > = 11 | | IS_CANNONLAKE ( dev_priv ) ) {
2019-09-10 08:42:47 -07:00
if ( dev_priv - > cdclk . hw . vco ! = 0 & &
dev_priv - > cdclk . hw . vco ! = vco )
cnl_cdclk_pll_disable ( dev_priv ) ;
2017-02-07 20:33:05 +02:00
2019-09-10 08:42:47 -07:00
if ( dev_priv - > cdclk . hw . vco ! = vco )
cnl_cdclk_pll_enable ( dev_priv , vco ) ;
2017-02-07 20:33:05 +02:00
2019-09-10 08:42:47 -07:00
} else {
if ( dev_priv - > cdclk . hw . vco ! = 0 & &
dev_priv - > cdclk . hw . vco ! = vco )
bxt_de_pll_disable ( dev_priv ) ;
if ( dev_priv - > cdclk . hw . vco ! = vco )
bxt_de_pll_enable ( dev_priv , vco ) ;
}
2017-02-07 20:33:05 +02:00
2021-04-30 18:34:40 +03:00
val = bxt_cdclk_cd2x_div_sel ( dev_priv , cdclk , vco ) |
bxt_cdclk_cd2x_pipe ( dev_priv , pipe ) |
skl_cdclk_decimal ( cdclk ) ;
2019-09-10 08:42:47 -07:00
2017-02-07 20:33:05 +02:00
/*
* Disable SSA Precharge when CD clock frequency < 500 MHz ,
* enable otherwise .
*/
2021-04-07 13:39:45 -07:00
if ( ( IS_GEMINILAKE ( dev_priv ) | | IS_BROXTON ( dev_priv ) ) & &
cdclk > = 500000 )
2017-02-07 20:33:05 +02:00
val | = BXT_CDCLK_SSA_PRECHARGE_ENABLE ;
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
intel_de_write ( dev_priv , CDCLK_CTL , val ) ;
2017-02-07 20:33:05 +02:00
2019-03-27 12:13:21 +02:00
if ( pipe ! = INVALID_PIPE )
intel_wait_for_vblank ( dev_priv , pipe ) ;
drm/i915/display: Simplify GLK display version tests
GLK has always been a bit of a special case since it reports INTEL_GEN()
as 9, but has version 10 display IP. Now we can properly represent the
display version as 10 and simplify the display generation tests
throughout the display code.
Aside from manually adding the version to the glk_info structure, the
rest of this patch is generated with a Coccinelle semantic patch. Note
that we also need to switch any code that matches gen10 today but *not*
GLK to be CNL-specific:
@@ expression dev_priv; @@
- DISPLAY_VER(dev_priv) > 9
+ DISPLAY_VER(dev_priv) >= 10
@@ expression dev_priv, E; @@
(
- DISPLAY_VER(dev_priv) >= 10 && E
+ (DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)) && E
|
- DISPLAY_VER(dev_priv) >= 10
+ DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)
|
- IS_DISPLAY_RANGE(dev_priv, 10, E)
+ IS_DISPLAY_RANGE(dev_priv, 11, E) || IS_CANNONLAKE(dev_priv)
)
@@ expression dev_priv, E, E2; @@
(
- (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 10)
|
- E || IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv)
+ E || IS_DISPLAY_VER(dev_priv, 10)
|
- (IS_GEMINILAKE(dev_priv) || IS_CANNONLAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 10)
|
- IS_GEMINILAKE(dev_priv) || E || IS_CANNONLAKE(dev_priv)
+ E || IS_DISPLAY_VER(dev_priv, 10)
|
- E || IS_GEMINILAKE(dev_priv) || E2 || IS_CANNONLAKE(dev_priv)
+ E || E2 || IS_DISPLAY_VER(dev_priv, 10)
|
- (IS_DISPLAY_VER(dev_priv, 10) || IS_GEMINILAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 10)
|
- (IS_GEMINILAKE(dev_priv) || IS_DISPLAY_VER(dev_priv, 10))
+ IS_DISPLAY_VER(dev_priv, 10)
)
@@ expression dev_priv; @@
- (IS_DISPLAY_VER(dev_priv, 9) && !IS_GEMINILAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 9)
@@ expression dev_priv; @@
(
- !(DISPLAY_VER(dev_priv) >= 11 || IS_DISPLAY_VER(dev_priv, 10))
+ DISPLAY_VER(dev_priv) < 10
|
- (DISPLAY_VER(dev_priv) >= 11 || IS_DISPLAY_VER(dev_priv, 10))
+ DISPLAY_VER(dev_priv) >= 10
)
@@ expression dev_priv, E; @@
- E || DISPLAY_VER(dev_priv) >= 11 || IS_DISPLAY_VER(dev_priv, 10)
+ E || DISPLAY_VER(dev_priv) >= 10
@@ expression dev_priv, E; @@
- (IS_DISPLAY_RANGE(dev_priv, 11, E) || IS_DISPLAY_VER(dev_priv, 10))
+ IS_DISPLAY_RANGE(dev_priv, 10, E)
@@ expression dev_priv; @@
(
- DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv) || IS_GEN9_LP(dev_priv)
+ DISPLAY_VER(dev_priv) >= 10 || IS_GEN9_LP(dev_priv)
|
- IS_GEN9_LP(dev_priv) || DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)
+ IS_GEN9_LP(dev_priv) || DISPLAY_VER(dev_priv) >= 10
)
@@ expression dev_priv, E; @@
- !(DISPLAY_VER(dev_priv) >= E)
+ DISPLAY_VER(dev_priv) < E
v2:
- Convert gen10 conditions that don't include GLK into CNL conditions.
(Ville)
v3:
- Rework coccinelle rules so that "ver>=10" turns into "ver>=11||is_cnl." (Ville)
v3.1:
- Manually re-add the ".display.version = 10" to glk_info after
regenerating patch via Coccinelle.
v4:
- Also apply cocci rules to intel_pm.c and i915_irq.c! (CI)
Cc: Ville Syrjälä <ville.syrjala@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210322233840.4056851-1-matthew.d.roper@intel.com
2021-03-22 16:38:40 -07:00
if ( DISPLAY_VER ( dev_priv ) > = 11 | | IS_CANNONLAKE ( dev_priv ) ) {
2019-09-10 08:42:47 -07:00
ret = sandybridge_pcode_write ( dev_priv , SKL_PCODE_CDCLK_CONTROL ,
2020-01-20 19:47:17 +02:00
cdclk_config - > voltage_level ) ;
2019-09-10 08:42:47 -07:00
} else {
/*
* The timeout isn ' t specified , the 2 ms used here is based on
* experiment .
* FIXME : Waiting for the request completion could be delayed
* until the next PCODE request based on BSpec .
*/
ret = sandybridge_pcode_write_timeout ( dev_priv ,
HSW_PCODE_DE_WRITE_FREQ_REQ ,
2020-01-20 19:47:17 +02:00
cdclk_config - > voltage_level ,
2019-09-10 08:42:47 -07:00
150 , 2 ) ;
}
2017-02-07 20:33:05 +02:00
if ( ret ) {
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_err ( & dev_priv - > drm ,
" PCode CDCLK freq set failed, (err %d, freq %d) \n " ,
ret , cdclk ) ;
2017-02-07 20:33:05 +02:00
return ;
}
intel_update_cdclk ( dev_priv ) ;
2019-09-10 08:42:47 -07:00
drm/i915/display: Simplify GLK display version tests
GLK has always been a bit of a special case since it reports INTEL_GEN()
as 9, but has version 10 display IP. Now we can properly represent the
display version as 10 and simplify the display generation tests
throughout the display code.
Aside from manually adding the version to the glk_info structure, the
rest of this patch is generated with a Coccinelle semantic patch. Note
that we also need to switch any code that matches gen10 today but *not*
GLK to be CNL-specific:
@@ expression dev_priv; @@
- DISPLAY_VER(dev_priv) > 9
+ DISPLAY_VER(dev_priv) >= 10
@@ expression dev_priv, E; @@
(
- DISPLAY_VER(dev_priv) >= 10 && E
+ (DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)) && E
|
- DISPLAY_VER(dev_priv) >= 10
+ DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)
|
- IS_DISPLAY_RANGE(dev_priv, 10, E)
+ IS_DISPLAY_RANGE(dev_priv, 11, E) || IS_CANNONLAKE(dev_priv)
)
@@ expression dev_priv, E, E2; @@
(
- (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 10)
|
- E || IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv)
+ E || IS_DISPLAY_VER(dev_priv, 10)
|
- (IS_GEMINILAKE(dev_priv) || IS_CANNONLAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 10)
|
- IS_GEMINILAKE(dev_priv) || E || IS_CANNONLAKE(dev_priv)
+ E || IS_DISPLAY_VER(dev_priv, 10)
|
- E || IS_GEMINILAKE(dev_priv) || E2 || IS_CANNONLAKE(dev_priv)
+ E || E2 || IS_DISPLAY_VER(dev_priv, 10)
|
- (IS_DISPLAY_VER(dev_priv, 10) || IS_GEMINILAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 10)
|
- (IS_GEMINILAKE(dev_priv) || IS_DISPLAY_VER(dev_priv, 10))
+ IS_DISPLAY_VER(dev_priv, 10)
)
@@ expression dev_priv; @@
- (IS_DISPLAY_VER(dev_priv, 9) && !IS_GEMINILAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 9)
@@ expression dev_priv; @@
(
- !(DISPLAY_VER(dev_priv) >= 11 || IS_DISPLAY_VER(dev_priv, 10))
+ DISPLAY_VER(dev_priv) < 10
|
- (DISPLAY_VER(dev_priv) >= 11 || IS_DISPLAY_VER(dev_priv, 10))
+ DISPLAY_VER(dev_priv) >= 10
)
@@ expression dev_priv, E; @@
- E || DISPLAY_VER(dev_priv) >= 11 || IS_DISPLAY_VER(dev_priv, 10)
+ E || DISPLAY_VER(dev_priv) >= 10
@@ expression dev_priv, E; @@
- (IS_DISPLAY_RANGE(dev_priv, 11, E) || IS_DISPLAY_VER(dev_priv, 10))
+ IS_DISPLAY_RANGE(dev_priv, 10, E)
@@ expression dev_priv; @@
(
- DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv) || IS_GEN9_LP(dev_priv)
+ DISPLAY_VER(dev_priv) >= 10 || IS_GEN9_LP(dev_priv)
|
- IS_GEN9_LP(dev_priv) || DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)
+ IS_GEN9_LP(dev_priv) || DISPLAY_VER(dev_priv) >= 10
)
@@ expression dev_priv, E; @@
- !(DISPLAY_VER(dev_priv) >= E)
+ DISPLAY_VER(dev_priv) < E
v2:
- Convert gen10 conditions that don't include GLK into CNL conditions.
(Ville)
v3:
- Rework coccinelle rules so that "ver>=10" turns into "ver>=11||is_cnl." (Ville)
v3.1:
- Manually re-add the ".display.version = 10" to glk_info after
regenerating patch via Coccinelle.
v4:
- Also apply cocci rules to intel_pm.c and i915_irq.c! (CI)
Cc: Ville Syrjälä <ville.syrjala@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210322233840.4056851-1-matthew.d.roper@intel.com
2021-03-22 16:38:40 -07:00
if ( DISPLAY_VER ( dev_priv ) > = 11 | | IS_CANNONLAKE ( dev_priv ) )
2019-09-10 08:42:47 -07:00
/*
* Can ' t read out the voltage level : (
* Let ' s just assume everything is as expected .
*/
2020-01-20 19:47:17 +02:00
dev_priv - > cdclk . hw . voltage_level = cdclk_config - > voltage_level ;
2017-02-07 20:33:05 +02:00
}
static void bxt_sanitize_cdclk ( struct drm_i915_private * dev_priv )
{
u32 cdctl , expected ;
2019-09-10 08:42:51 -07:00
int cdclk , vco ;
2017-02-07 20:33:05 +02:00
intel_update_cdclk ( dev_priv ) ;
2020-01-20 19:47:17 +02:00
intel_dump_cdclk_config ( & dev_priv - > cdclk . hw , " Current CDCLK " ) ;
2017-02-07 20:33:05 +02:00
2017-02-07 20:33:45 +02:00
if ( dev_priv - > cdclk . hw . vco = = 0 | |
2018-01-17 19:25:08 +02:00
dev_priv - > cdclk . hw . cdclk = = dev_priv - > cdclk . hw . bypass )
2017-02-07 20:33:05 +02:00
goto sanitize ;
/* DPLL okay; verify the cdclock
*
* Some BIOS versions leave an incorrect decimal frequency value and
* set reserved MBZ bits in CDCLK_CTL at least during exiting from S4 ,
* so sanitize this register .
*/
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
cdctl = intel_de_read ( dev_priv , CDCLK_CTL ) ;
2017-02-07 20:33:05 +02:00
/*
* Let ' s ignore the pipe field , since BIOS could have configured the
* dividers both synching to an active pipe , or asynchronously
* ( PIPE_NONE ) .
*/
2019-09-11 16:31:27 +03:00
cdctl & = ~ bxt_cdclk_cd2x_pipe ( dev_priv , INVALID_PIPE ) ;
2017-02-07 20:33:05 +02:00
2019-09-10 08:42:51 -07:00
/* Make sure this is a legal cdclk value for the platform */
cdclk = bxt_calc_cdclk ( dev_priv , dev_priv - > cdclk . hw . cdclk ) ;
if ( cdclk ! = dev_priv - > cdclk . hw . cdclk )
goto sanitize ;
/* Make sure the VCO is correct for the cdclk */
vco = bxt_calc_cdclk_pll_vco ( dev_priv , cdclk ) ;
if ( vco ! = dev_priv - > cdclk . hw . vco )
goto sanitize ;
expected = skl_cdclk_decimal ( cdclk ) ;
/* Figure out what CD2X divider we should be using for this cdclk */
2021-04-30 18:34:40 +03:00
expected | = bxt_cdclk_cd2x_div_sel ( dev_priv ,
dev_priv - > cdclk . hw . cdclk ,
dev_priv - > cdclk . hw . vco ) ;
2019-09-10 08:42:51 -07:00
2017-02-07 20:33:05 +02:00
/*
* Disable SSA Precharge when CD clock frequency < 500 MHz ,
* enable otherwise .
*/
2021-04-07 13:39:45 -07:00
if ( ( IS_GEMINILAKE ( dev_priv ) | | IS_BROXTON ( dev_priv ) ) & &
dev_priv - > cdclk . hw . cdclk > = 500000 )
2017-02-07 20:33:05 +02:00
expected | = BXT_CDCLK_SSA_PRECHARGE_ENABLE ;
if ( cdctl = = expected )
/* All well; nothing to sanitize */
return ;
sanitize :
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_dbg_kms ( & dev_priv - > drm , " Sanitizing cdclk programmed by pre-os \n " ) ;
2017-02-07 20:33:05 +02:00
/* force cdclk programming */
2017-02-07 20:33:45 +02:00
dev_priv - > cdclk . hw . cdclk = 0 ;
2017-02-07 20:33:05 +02:00
/* force full PLL disable + enable */
2017-02-07 20:33:45 +02:00
dev_priv - > cdclk . hw . vco = - 1 ;
2017-02-07 20:33:05 +02:00
}
2020-01-20 19:47:21 +02:00
static void bxt_cdclk_init_hw ( struct drm_i915_private * dev_priv )
2017-02-07 20:33:05 +02:00
{
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config cdclk_config ;
2017-02-07 20:33:05 +02:00
bxt_sanitize_cdclk ( dev_priv ) ;
2017-02-07 20:33:45 +02:00
if ( dev_priv - > cdclk . hw . cdclk ! = 0 & &
dev_priv - > cdclk . hw . vco ! = 0 )
2017-02-07 20:33:05 +02:00
return ;
2020-01-20 19:47:17 +02:00
cdclk_config = dev_priv - > cdclk . hw ;
2017-01-20 20:22:01 +02:00
2017-02-07 20:33:05 +02:00
/*
* FIXME :
* - The initial CDCLK needs to be read from VBT .
* Need to make this change after VBT has changes for BXT .
*/
2020-01-20 19:47:17 +02:00
cdclk_config . cdclk = bxt_calc_cdclk ( dev_priv , 0 ) ;
cdclk_config . vco = bxt_calc_cdclk_pll_vco ( dev_priv , cdclk_config . cdclk ) ;
cdclk_config . voltage_level =
dev_priv - > display . calc_voltage_level ( cdclk_config . cdclk ) ;
2017-02-07 20:33:05 +02:00
2020-01-20 19:47:17 +02:00
bxt_set_cdclk ( dev_priv , & cdclk_config , INVALID_PIPE ) ;
2017-02-07 20:33:05 +02:00
}
2020-01-20 19:47:21 +02:00
static void bxt_cdclk_uninit_hw ( struct drm_i915_private * dev_priv )
2017-02-07 20:33:05 +02:00
{
2020-01-20 19:47:17 +02:00
struct intel_cdclk_config cdclk_config = dev_priv - > cdclk . hw ;
2017-01-20 20:22:01 +02:00
2020-01-20 19:47:17 +02:00
cdclk_config . cdclk = cdclk_config . bypass ;
cdclk_config . vco = 0 ;
cdclk_config . voltage_level =
dev_priv - > display . calc_voltage_level ( cdclk_config . cdclk ) ;
2017-01-20 20:22:01 +02:00
2020-01-20 19:47:17 +02:00
bxt_set_cdclk ( dev_priv , & cdclk_config , INVALID_PIPE ) ;
2017-02-07 20:33:45 +02:00
}
2019-04-05 14:00:26 +03:00
/**
2020-01-20 19:47:21 +02:00
* intel_cdclk_init_hw - Initialize CDCLK hardware
2019-04-05 14:00:26 +03:00
* @ i915 : i915 device
*
* Initialize CDCLK . This consists mainly of initializing dev_priv - > cdclk . hw and
* sanitizing the state of the hardware if needed . This is generally done only
* during the display core initialization sequence , after which the DMC will
* take care of turning CDCLK off / on as needed .
*/
2020-01-20 19:47:21 +02:00
void intel_cdclk_init_hw ( struct drm_i915_private * i915 )
2019-04-05 14:00:26 +03:00
{
2021-04-07 13:39:45 -07:00
if ( DISPLAY_VER ( i915 ) > = 10 | | IS_BROXTON ( i915 ) )
2020-01-20 19:47:21 +02:00
bxt_cdclk_init_hw ( i915 ) ;
drm/i915/display: rename display version macros
While converting the rest of the driver to use GRAPHICS_VER() and
MEDIA_VER(), following what was done for display, some discussions went
back on what we did for display:
1) Why is the == comparison special that deserves a separate
macro instead of just getting the version and comparing directly
like is done for >, >=, <=?
2) IS_DISPLAY_RANGE() is weird in that it omits the "_VER" for
brevity. If we remove the current users of IS_DISPLAY_VER(), we
could actually repurpose it for a range check
With (1) there could be an advantage if we used gen_mask since multiple
conditionals be combined by the compiler in a single and instruction and
check the result. However a) INTEL_GEN() doesn't use the mask since it
would make the code bigger everywhere else and b) in the cases it made
sense, it also made sense to convert to the _RANGE() variant.
So here we repurpose IS_DISPLAY_VER() to work with a [ from, to ] range
like was the IS_DISPLAY_RANGE() and convert the current IS_DISPLAY_VER()
users to use == and != operators. Aside from the definition changes,
this was done by the following semantic patch:
@@ expression dev_priv, E1; @@
- !IS_DISPLAY_VER(dev_priv, E1)
+ DISPLAY_VER(dev_priv) != E1
@@ expression dev_priv, E1; @@
- IS_DISPLAY_VER(dev_priv, E1)
+ DISPLAY_VER(dev_priv) == E1
@@ expression dev_priv, from, until; @@
- IS_DISPLAY_RANGE(dev_priv, from, until)
+ IS_DISPLAY_VER(dev_priv, from, until)
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
[Jani: Minor conflict resolve while applying.]
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20210413051002.92589-4-lucas.demarchi@intel.com
2021-04-12 22:09:53 -07:00
else if ( DISPLAY_VER ( i915 ) = = 9 )
2020-01-20 19:47:21 +02:00
skl_cdclk_init_hw ( i915 ) ;
2019-04-05 14:00:26 +03:00
}
/**
2020-01-20 19:47:21 +02:00
* intel_cdclk_uninit_hw - Uninitialize CDCLK hardware
2019-04-05 14:00:26 +03:00
* @ i915 : i915 device
*
* Uninitialize CDCLK . This is done only during the display core
* uninitialization sequence .
*/
2020-01-20 19:47:21 +02:00
void intel_cdclk_uninit_hw ( struct drm_i915_private * i915 )
2019-04-05 14:00:26 +03:00
{
2021-04-07 13:39:45 -07:00
if ( DISPLAY_VER ( i915 ) > = 10 | | IS_BROXTON ( i915 ) )
2020-01-20 19:47:21 +02:00
bxt_cdclk_uninit_hw ( i915 ) ;
drm/i915/display: rename display version macros
While converting the rest of the driver to use GRAPHICS_VER() and
MEDIA_VER(), following what was done for display, some discussions went
back on what we did for display:
1) Why is the == comparison special that deserves a separate
macro instead of just getting the version and comparing directly
like is done for >, >=, <=?
2) IS_DISPLAY_RANGE() is weird in that it omits the "_VER" for
brevity. If we remove the current users of IS_DISPLAY_VER(), we
could actually repurpose it for a range check
With (1) there could be an advantage if we used gen_mask since multiple
conditionals be combined by the compiler in a single and instruction and
check the result. However a) INTEL_GEN() doesn't use the mask since it
would make the code bigger everywhere else and b) in the cases it made
sense, it also made sense to convert to the _RANGE() variant.
So here we repurpose IS_DISPLAY_VER() to work with a [ from, to ] range
like was the IS_DISPLAY_RANGE() and convert the current IS_DISPLAY_VER()
users to use == and != operators. Aside from the definition changes,
this was done by the following semantic patch:
@@ expression dev_priv, E1; @@
- !IS_DISPLAY_VER(dev_priv, E1)
+ DISPLAY_VER(dev_priv) != E1
@@ expression dev_priv, E1; @@
- IS_DISPLAY_VER(dev_priv, E1)
+ DISPLAY_VER(dev_priv) == E1
@@ expression dev_priv, from, until; @@
- IS_DISPLAY_RANGE(dev_priv, from, until)
+ IS_DISPLAY_VER(dev_priv, from, until)
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
[Jani: Minor conflict resolve while applying.]
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20210413051002.92589-4-lucas.demarchi@intel.com
2021-04-12 22:09:53 -07:00
else if ( DISPLAY_VER ( i915 ) = = 9 )
2020-01-20 19:47:21 +02:00
skl_cdclk_uninit_hw ( i915 ) ;
2019-04-05 14:00:26 +03:00
}
2017-02-07 20:33:45 +02:00
/**
2020-01-20 19:47:17 +02:00
* intel_cdclk_needs_modeset - Determine if changong between the CDCLK
* configurations requires a modeset on all pipes
* @ a : first CDCLK configuration
* @ b : second CDCLK configuration
2017-02-07 20:33:45 +02:00
*
* Returns :
2020-01-20 19:47:17 +02:00
* True if changing between the two CDCLK configurations
* requires all pipes to be off , false if not .
2017-02-07 20:33:45 +02:00
*/
2020-01-20 19:47:17 +02:00
bool intel_cdclk_needs_modeset ( const struct intel_cdclk_config * a ,
const struct intel_cdclk_config * b )
2017-02-07 20:33:45 +02:00
{
2017-10-24 12:52:08 +03:00
return a - > cdclk ! = b - > cdclk | |
a - > vco ! = b - > vco | |
a - > ref ! = b - > ref ;
}
2019-03-27 12:13:21 +02:00
/**
2020-01-20 19:47:17 +02:00
* intel_cdclk_can_cd2x_update - Determine if changing between the two CDCLK
* configurations requires only a cd2x divider update
* @ dev_priv : i915 device
* @ a : first CDCLK configuration
* @ b : second CDCLK configuration
2019-03-27 12:13:21 +02:00
*
* Returns :
2020-01-20 19:47:17 +02:00
* True if changing between the two CDCLK configurations
* can be done with just a cd2x divider update , false if not .
2019-03-27 12:13:21 +02:00
*/
2020-01-20 19:47:16 +02:00
static bool intel_cdclk_can_cd2x_update ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
const struct intel_cdclk_config * a ,
const struct intel_cdclk_config * b )
2019-03-27 12:13:21 +02:00
{
/* Older hw doesn't have the capability */
2021-04-07 13:39:45 -07:00
if ( DISPLAY_VER ( dev_priv ) < 10 & & ! IS_BROXTON ( dev_priv ) )
2019-03-27 12:13:21 +02:00
return false ;
return a - > cdclk ! = b - > cdclk & &
a - > vco = = b - > vco & &
a - > ref = = b - > ref ;
}
2017-10-24 12:52:08 +03:00
/**
2020-01-20 19:47:17 +02:00
* intel_cdclk_changed - Determine if two CDCLK configurations are different
* @ a : first CDCLK configuration
* @ b : second CDCLK configuration
2017-10-24 12:52:08 +03:00
*
* Returns :
2020-01-20 19:47:17 +02:00
* True if the CDCLK configurations don ' t match , false if they do .
2017-10-24 12:52:08 +03:00
*/
2020-01-20 19:47:17 +02:00
static bool intel_cdclk_changed ( const struct intel_cdclk_config * a ,
const struct intel_cdclk_config * b )
2017-10-24 12:52:08 +03:00
{
return intel_cdclk_needs_modeset ( a , b ) | |
a - > voltage_level ! = b - > voltage_level ;
2017-02-07 20:33:05 +02:00
}
2020-01-20 19:47:17 +02:00
void intel_dump_cdclk_config ( const struct intel_cdclk_config * cdclk_config ,
const char * context )
2017-10-24 12:52:16 +03:00
{
2018-01-17 19:25:08 +02:00
DRM_DEBUG_DRIVER ( " %s %d kHz, VCO %d kHz, ref %d kHz, bypass %d kHz, voltage level %d \n " ,
2020-01-20 19:47:17 +02:00
context , cdclk_config - > cdclk , cdclk_config - > vco ,
cdclk_config - > ref , cdclk_config - > bypass ,
cdclk_config - > voltage_level ) ;
2017-10-24 12:52:16 +03:00
}
2017-01-26 21:52:01 +02:00
/**
2020-01-20 19:47:17 +02:00
* intel_set_cdclk - Push the CDCLK configuration to the hardware
2017-01-26 21:52:01 +02:00
* @ dev_priv : i915 device
2020-01-20 19:47:17 +02:00
* @ cdclk_config : new CDCLK configuration
2019-03-27 12:13:21 +02:00
* @ pipe : pipe with which to synchronize the update
2017-01-26 21:52:01 +02:00
*
* Program the hardware based on the passed in CDCLK state ,
* if necessary .
*/
2019-03-27 12:13:21 +02:00
static void intel_set_cdclk ( struct drm_i915_private * dev_priv ,
2020-01-20 19:47:17 +02:00
const struct intel_cdclk_config * cdclk_config ,
2019-03-27 12:13:21 +02:00
enum pipe pipe )
2017-01-26 21:52:01 +02:00
{
2020-03-02 19:44:42 +02:00
struct intel_encoder * encoder ;
2020-01-20 19:47:17 +02:00
if ( ! intel_cdclk_changed ( & dev_priv - > cdclk . hw , cdclk_config ) )
2017-01-26 21:52:01 +02:00
return ;
drm/i915/display/cdclk: Make WARN* drm specific where drm_priv 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_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_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,
...)
)
...+>
}
@rule2@
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/20200220165507.16823-2-pankaj.laxminarayan.bharadiya@intel.com
2020-02-20 22:25:00 +05:30
if ( drm_WARN_ON_ONCE ( & dev_priv - > drm , ! dev_priv - > display . set_cdclk ) )
2017-01-26 21:52:01 +02:00
return ;
2020-01-20 19:47:17 +02:00
intel_dump_cdclk_config ( cdclk_config , " Changing CDCLK to " ) ;
2017-01-26 21:52:01 +02:00
2020-03-02 19:44:42 +02:00
/*
* Lock aux / gmbus while we change cdclk in case those
* functions use cdclk . Not all platforms / ports do ,
* but we ' ll lock them all for simplicity .
*/
mutex_lock ( & dev_priv - > gmbus_mutex ) ;
for_each_intel_dp ( & dev_priv - > drm , encoder ) {
struct intel_dp * intel_dp = enc_to_intel_dp ( encoder ) ;
mutex_lock_nest_lock ( & intel_dp - > aux . hw_mutex ,
& dev_priv - > gmbus_mutex ) ;
}
2020-01-20 19:47:17 +02:00
dev_priv - > display . set_cdclk ( dev_priv , cdclk_config , pipe ) ;
2017-10-24 12:52:16 +03:00
2020-03-02 19:44:42 +02:00
for_each_intel_dp ( & dev_priv - > drm , encoder ) {
struct intel_dp * intel_dp = enc_to_intel_dp ( encoder ) ;
mutex_unlock ( & intel_dp - > aux . hw_mutex ) ;
}
mutex_unlock ( & dev_priv - > gmbus_mutex ) ;
drm/i915/display/cdclk: Make WARN* drm specific where drm_priv 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_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_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,
...)
)
...+>
}
@rule2@
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/20200220165507.16823-2-pankaj.laxminarayan.bharadiya@intel.com
2020-02-20 22:25:00 +05:30
if ( drm_WARN ( & dev_priv - > drm ,
intel_cdclk_changed ( & dev_priv - > cdclk . hw , cdclk_config ) ,
" cdclk state doesn't match! \n " ) ) {
2020-01-20 19:47:17 +02:00
intel_dump_cdclk_config ( & dev_priv - > cdclk . hw , " [hw state] " ) ;
intel_dump_cdclk_config ( cdclk_config , " [sw state] " ) ;
2017-10-24 12:52:16 +03:00
}
2017-01-26 21:52:01 +02:00
}
2019-03-27 12:13:21 +02:00
/**
2020-01-20 19:47:18 +02:00
* intel_set_cdclk_pre_plane_update - Push the CDCLK state to the hardware
* @ state : intel atomic state
2019-03-27 12:13:21 +02:00
*
2020-01-20 19:47:18 +02:00
* Program the hardware before updating the HW plane state based on the
* new CDCLK state , if necessary .
2019-03-27 12:13:21 +02:00
*/
void
2020-01-20 19:47:18 +02:00
intel_set_cdclk_pre_plane_update ( struct intel_atomic_state * state )
2019-03-27 12:13:21 +02:00
{
2020-01-20 19:47:18 +02:00
struct drm_i915_private * dev_priv = to_i915 ( state - > base . dev ) ;
2020-01-21 16:03:53 +02:00
const struct intel_cdclk_state * old_cdclk_state =
intel_atomic_get_old_cdclk_state ( state ) ;
const struct intel_cdclk_state * new_cdclk_state =
intel_atomic_get_new_cdclk_state ( state ) ;
2020-01-20 19:47:20 +02:00
enum pipe pipe = new_cdclk_state - > pipe ;
2020-01-20 19:47:18 +02:00
2020-01-21 16:03:53 +02:00
if ( ! intel_cdclk_changed ( & old_cdclk_state - > actual ,
& new_cdclk_state - > actual ) )
return ;
2020-01-20 19:47:19 +02:00
if ( pipe = = INVALID_PIPE | |
2020-01-21 16:03:53 +02:00
old_cdclk_state - > actual . cdclk < = new_cdclk_state - > actual . cdclk ) {
drm/i915/display/cdclk: Make WARN* drm specific where drm_priv 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_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_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,
...)
)
...+>
}
@rule2@
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/20200220165507.16823-2-pankaj.laxminarayan.bharadiya@intel.com
2020-02-20 22:25:00 +05:30
drm_WARN_ON ( & dev_priv - > drm , ! new_cdclk_state - > base . changed ) ;
2020-01-21 16:03:53 +02:00
2020-01-20 19:47:19 +02:00
intel_set_cdclk ( dev_priv , & new_cdclk_state - > actual , pipe ) ;
2020-01-21 16:03:53 +02:00
}
2019-03-27 12:13:21 +02:00
}
/**
2020-01-20 19:47:18 +02:00
* intel_set_cdclk_post_plane_update - Push the CDCLK state to the hardware
* @ state : intel atomic state
2019-03-27 12:13:21 +02:00
*
2020-02-04 17:48:03 +02:00
* Program the hardware after updating the HW plane state based on the
2020-01-20 19:47:18 +02:00
* new CDCLK state , if necessary .
2019-03-27 12:13:21 +02:00
*/
void
2020-01-20 19:47:18 +02:00
intel_set_cdclk_post_plane_update ( struct intel_atomic_state * state )
2019-03-27 12:13:21 +02:00
{
2020-01-20 19:47:18 +02:00
struct drm_i915_private * dev_priv = to_i915 ( state - > base . dev ) ;
2020-01-21 16:03:53 +02:00
const struct intel_cdclk_state * old_cdclk_state =
intel_atomic_get_old_cdclk_state ( state ) ;
const struct intel_cdclk_state * new_cdclk_state =
intel_atomic_get_new_cdclk_state ( state ) ;
2020-01-20 19:47:20 +02:00
enum pipe pipe = new_cdclk_state - > pipe ;
2020-01-20 19:47:18 +02:00
2020-01-21 16:03:53 +02:00
if ( ! intel_cdclk_changed ( & old_cdclk_state - > actual ,
& new_cdclk_state - > actual ) )
return ;
2020-01-20 19:47:19 +02:00
if ( pipe ! = INVALID_PIPE & &
2020-01-21 16:03:53 +02:00
old_cdclk_state - > actual . cdclk > new_cdclk_state - > actual . cdclk ) {
drm/i915/display/cdclk: Make WARN* drm specific where drm_priv 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_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_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,
...)
)
...+>
}
@rule2@
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/20200220165507.16823-2-pankaj.laxminarayan.bharadiya@intel.com
2020-02-20 22:25:00 +05:30
drm_WARN_ON ( & dev_priv - > drm , ! new_cdclk_state - > base . changed ) ;
2020-01-21 16:03:53 +02:00
2020-01-20 19:47:19 +02:00
intel_set_cdclk ( dev_priv , & new_cdclk_state - > actual , pipe ) ;
2020-01-21 16:03:53 +02:00
}
2019-03-27 12:13:21 +02:00
}
2019-07-08 15:53:16 +03:00
static int intel_pixel_rate_to_cdclk ( const struct intel_crtc_state * crtc_state )
2017-08-30 21:57:03 +03:00
{
2019-10-31 12:26:03 +01:00
struct drm_i915_private * dev_priv = to_i915 ( crtc_state - > uapi . crtc - > dev ) ;
2019-07-08 15:53:16 +03:00
int pixel_rate = crtc_state - > pixel_rate ;
drm/i915/display: Simplify GLK display version tests
GLK has always been a bit of a special case since it reports INTEL_GEN()
as 9, but has version 10 display IP. Now we can properly represent the
display version as 10 and simplify the display generation tests
throughout the display code.
Aside from manually adding the version to the glk_info structure, the
rest of this patch is generated with a Coccinelle semantic patch. Note
that we also need to switch any code that matches gen10 today but *not*
GLK to be CNL-specific:
@@ expression dev_priv; @@
- DISPLAY_VER(dev_priv) > 9
+ DISPLAY_VER(dev_priv) >= 10
@@ expression dev_priv, E; @@
(
- DISPLAY_VER(dev_priv) >= 10 && E
+ (DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)) && E
|
- DISPLAY_VER(dev_priv) >= 10
+ DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)
|
- IS_DISPLAY_RANGE(dev_priv, 10, E)
+ IS_DISPLAY_RANGE(dev_priv, 11, E) || IS_CANNONLAKE(dev_priv)
)
@@ expression dev_priv, E, E2; @@
(
- (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 10)
|
- E || IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv)
+ E || IS_DISPLAY_VER(dev_priv, 10)
|
- (IS_GEMINILAKE(dev_priv) || IS_CANNONLAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 10)
|
- IS_GEMINILAKE(dev_priv) || E || IS_CANNONLAKE(dev_priv)
+ E || IS_DISPLAY_VER(dev_priv, 10)
|
- E || IS_GEMINILAKE(dev_priv) || E2 || IS_CANNONLAKE(dev_priv)
+ E || E2 || IS_DISPLAY_VER(dev_priv, 10)
|
- (IS_DISPLAY_VER(dev_priv, 10) || IS_GEMINILAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 10)
|
- (IS_GEMINILAKE(dev_priv) || IS_DISPLAY_VER(dev_priv, 10))
+ IS_DISPLAY_VER(dev_priv, 10)
)
@@ expression dev_priv; @@
- (IS_DISPLAY_VER(dev_priv, 9) && !IS_GEMINILAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 9)
@@ expression dev_priv; @@
(
- !(DISPLAY_VER(dev_priv) >= 11 || IS_DISPLAY_VER(dev_priv, 10))
+ DISPLAY_VER(dev_priv) < 10
|
- (DISPLAY_VER(dev_priv) >= 11 || IS_DISPLAY_VER(dev_priv, 10))
+ DISPLAY_VER(dev_priv) >= 10
)
@@ expression dev_priv, E; @@
- E || DISPLAY_VER(dev_priv) >= 11 || IS_DISPLAY_VER(dev_priv, 10)
+ E || DISPLAY_VER(dev_priv) >= 10
@@ expression dev_priv, E; @@
- (IS_DISPLAY_RANGE(dev_priv, 11, E) || IS_DISPLAY_VER(dev_priv, 10))
+ IS_DISPLAY_RANGE(dev_priv, 10, E)
@@ expression dev_priv; @@
(
- DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv) || IS_GEN9_LP(dev_priv)
+ DISPLAY_VER(dev_priv) >= 10 || IS_GEN9_LP(dev_priv)
|
- IS_GEN9_LP(dev_priv) || DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)
+ IS_GEN9_LP(dev_priv) || DISPLAY_VER(dev_priv) >= 10
)
@@ expression dev_priv, E; @@
- !(DISPLAY_VER(dev_priv) >= E)
+ DISPLAY_VER(dev_priv) < E
v2:
- Convert gen10 conditions that don't include GLK into CNL conditions.
(Ville)
v3:
- Rework coccinelle rules so that "ver>=10" turns into "ver>=11||is_cnl." (Ville)
v3.1:
- Manually re-add the ".display.version = 10" to glk_info after
regenerating patch via Coccinelle.
v4:
- Also apply cocci rules to intel_pm.c and i915_irq.c! (CI)
Cc: Ville Syrjälä <ville.syrjala@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210322233840.4056851-1-matthew.d.roper@intel.com
2021-03-22 16:38:40 -07:00
if ( DISPLAY_VER ( dev_priv ) > = 10 )
2017-10-03 15:31:42 -07:00
return DIV_ROUND_UP ( pixel_rate , 2 ) ;
drm/i915/display: rename display version macros
While converting the rest of the driver to use GRAPHICS_VER() and
MEDIA_VER(), following what was done for display, some discussions went
back on what we did for display:
1) Why is the == comparison special that deserves a separate
macro instead of just getting the version and comparing directly
like is done for >, >=, <=?
2) IS_DISPLAY_RANGE() is weird in that it omits the "_VER" for
brevity. If we remove the current users of IS_DISPLAY_VER(), we
could actually repurpose it for a range check
With (1) there could be an advantage if we used gen_mask since multiple
conditionals be combined by the compiler in a single and instruction and
check the result. However a) INTEL_GEN() doesn't use the mask since it
would make the code bigger everywhere else and b) in the cases it made
sense, it also made sense to convert to the _RANGE() variant.
So here we repurpose IS_DISPLAY_VER() to work with a [ from, to ] range
like was the IS_DISPLAY_RANGE() and convert the current IS_DISPLAY_VER()
users to use == and != operators. Aside from the definition changes,
this was done by the following semantic patch:
@@ expression dev_priv, E1; @@
- !IS_DISPLAY_VER(dev_priv, E1)
+ DISPLAY_VER(dev_priv) != E1
@@ expression dev_priv, E1; @@
- IS_DISPLAY_VER(dev_priv, E1)
+ DISPLAY_VER(dev_priv) == E1
@@ expression dev_priv, from, until; @@
- IS_DISPLAY_RANGE(dev_priv, from, until)
+ IS_DISPLAY_VER(dev_priv, from, until)
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
[Jani: Minor conflict resolve while applying.]
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20210413051002.92589-4-lucas.demarchi@intel.com
2021-04-12 22:09:53 -07:00
else if ( DISPLAY_VER ( dev_priv ) = = 9 | |
2017-08-30 21:57:03 +03:00
IS_BROADWELL ( dev_priv ) | | IS_HASWELL ( dev_priv ) )
return pixel_rate ;
else if ( IS_CHERRYVIEW ( dev_priv ) )
return DIV_ROUND_UP ( pixel_rate * 100 , 95 ) ;
2019-07-08 15:53:16 +03:00
else if ( crtc_state - > double_wide )
return DIV_ROUND_UP ( pixel_rate * 100 , 90 * 2 ) ;
2017-08-30 21:57:03 +03:00
else
return DIV_ROUND_UP ( pixel_rate * 100 , 90 ) ;
}
2019-10-15 22:30:26 +03:00
static int intel_planes_min_cdclk ( const struct intel_crtc_state * crtc_state )
{
2019-10-31 12:26:03 +01:00
struct intel_crtc * crtc = to_intel_crtc ( crtc_state - > uapi . crtc ) ;
2019-10-15 22:30:26 +03:00
struct drm_i915_private * dev_priv = to_i915 ( crtc - > base . dev ) ;
struct intel_plane * plane ;
int min_cdclk = 0 ;
for_each_intel_plane_on_crtc ( & dev_priv - > drm , crtc , plane )
min_cdclk = max ( crtc_state - > min_cdclk [ plane - > id ] , min_cdclk ) ;
return min_cdclk ;
}
2017-08-30 21:57:03 +03:00
int intel_crtc_compute_min_cdclk ( const struct intel_crtc_state * crtc_state )
2017-02-07 20:33:05 +02:00
{
struct drm_i915_private * dev_priv =
2019-10-31 12:26:03 +01:00
to_i915 ( crtc_state - > uapi . crtc - > dev ) ;
2017-08-30 21:57:03 +03:00
int min_cdclk ;
2019-10-31 12:26:02 +01:00
if ( ! crtc_state - > hw . enable )
2017-08-30 21:57:03 +03:00
return 0 ;
2019-07-08 15:53:16 +03:00
min_cdclk = intel_pixel_rate_to_cdclk ( crtc_state ) ;
2017-02-07 20:33:05 +02:00
/* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */
2017-11-22 19:39:01 +01:00
if ( IS_BROADWELL ( dev_priv ) & & hsw_crtc_state_ips_capable ( crtc_state ) )
2017-08-30 21:57:03 +03:00
min_cdclk = DIV_ROUND_UP ( min_cdclk * 100 , 95 ) ;
2017-02-07 20:33:05 +02:00
2017-03-07 16:12:51 -08:00
/* BSpec says "Do not use DisplayPort with CDCLK less than 432 MHz,
* audio enabled , port width x4 , and link rate HBR2 ( 5.4 GHz ) , or else
* there may be audio corruption or screen corruption . " This cdclk
2017-08-30 21:57:03 +03:00
* restriction for GLK is 316.8 MHz .
2017-02-07 20:33:05 +02:00
*/
if ( intel_crtc_has_dp_encoder ( crtc_state ) & &
crtc_state - > has_audio & &
crtc_state - > port_clock > = 540000 & &
2017-03-07 16:12:51 -08:00
crtc_state - > lane_count = = 4 ) {
drm/i915/display: rename display version macros
While converting the rest of the driver to use GRAPHICS_VER() and
MEDIA_VER(), following what was done for display, some discussions went
back on what we did for display:
1) Why is the == comparison special that deserves a separate
macro instead of just getting the version and comparing directly
like is done for >, >=, <=?
2) IS_DISPLAY_RANGE() is weird in that it omits the "_VER" for
brevity. If we remove the current users of IS_DISPLAY_VER(), we
could actually repurpose it for a range check
With (1) there could be an advantage if we used gen_mask since multiple
conditionals be combined by the compiler in a single and instruction and
check the result. However a) INTEL_GEN() doesn't use the mask since it
would make the code bigger everywhere else and b) in the cases it made
sense, it also made sense to convert to the _RANGE() variant.
So here we repurpose IS_DISPLAY_VER() to work with a [ from, to ] range
like was the IS_DISPLAY_RANGE() and convert the current IS_DISPLAY_VER()
users to use == and != operators. Aside from the definition changes,
this was done by the following semantic patch:
@@ expression dev_priv, E1; @@
- !IS_DISPLAY_VER(dev_priv, E1)
+ DISPLAY_VER(dev_priv) != E1
@@ expression dev_priv, E1; @@
- IS_DISPLAY_VER(dev_priv, E1)
+ DISPLAY_VER(dev_priv) == E1
@@ expression dev_priv, from, until; @@
- IS_DISPLAY_RANGE(dev_priv, from, until)
+ IS_DISPLAY_VER(dev_priv, from, until)
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
[Jani: Minor conflict resolve while applying.]
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20210413051002.92589-4-lucas.demarchi@intel.com
2021-04-12 22:09:53 -07:00
if ( DISPLAY_VER ( dev_priv ) = = 10 ) {
2017-08-30 21:57:03 +03:00
/* Display WA #1145: glk,cnl */
min_cdclk = max ( 316800 , min_cdclk ) ;
drm/i915/display: rename display version macros
While converting the rest of the driver to use GRAPHICS_VER() and
MEDIA_VER(), following what was done for display, some discussions went
back on what we did for display:
1) Why is the == comparison special that deserves a separate
macro instead of just getting the version and comparing directly
like is done for >, >=, <=?
2) IS_DISPLAY_RANGE() is weird in that it omits the "_VER" for
brevity. If we remove the current users of IS_DISPLAY_VER(), we
could actually repurpose it for a range check
With (1) there could be an advantage if we used gen_mask since multiple
conditionals be combined by the compiler in a single and instruction and
check the result. However a) INTEL_GEN() doesn't use the mask since it
would make the code bigger everywhere else and b) in the cases it made
sense, it also made sense to convert to the _RANGE() variant.
So here we repurpose IS_DISPLAY_VER() to work with a [ from, to ] range
like was the IS_DISPLAY_RANGE() and convert the current IS_DISPLAY_VER()
users to use == and != operators. Aside from the definition changes,
this was done by the following semantic patch:
@@ expression dev_priv, E1; @@
- !IS_DISPLAY_VER(dev_priv, E1)
+ DISPLAY_VER(dev_priv) != E1
@@ expression dev_priv, E1; @@
- IS_DISPLAY_VER(dev_priv, E1)
+ DISPLAY_VER(dev_priv) == E1
@@ expression dev_priv, from, until; @@
- IS_DISPLAY_RANGE(dev_priv, from, until)
+ IS_DISPLAY_VER(dev_priv, from, until)
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
[Jani: Minor conflict resolve while applying.]
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20210413051002.92589-4-lucas.demarchi@intel.com
2021-04-12 22:09:53 -07:00
} else if ( DISPLAY_VER ( dev_priv ) = = 9 | | IS_BROADWELL ( dev_priv ) ) {
2017-08-30 21:57:03 +03:00
/* Display WA #1144: skl,bxt */
min_cdclk = max ( 432000 , min_cdclk ) ;
}
2017-03-07 16:12:51 -08:00
}
2017-02-07 20:33:05 +02:00
2018-04-18 13:37:07 +03:00
/*
* According to BSpec , " The CD clock frequency must be at least twice
2017-03-14 15:45:56 -07:00
* the frequency of the Azalia BCLK . " and BCLK is 96 MHz by default.
*/
2021-03-19 21:42:42 -07:00
if ( crtc_state - > has_audio & & DISPLAY_VER ( dev_priv ) > = 9 )
2017-08-30 21:57:03 +03:00
min_cdclk = max ( 2 * 96000 , min_cdclk ) ;
2017-03-14 15:45:56 -07:00
2019-07-17 14:45:36 +03:00
/*
* " For DP audio configuration, cdclk frequency shall be set to
* meet the following requirements :
* DP Link Frequency ( MHz ) | Cdclk frequency ( MHz )
* 270 | 320 or higher
* 162 | 200 or higher "
*/
if ( ( IS_VALLEYVIEW ( dev_priv ) | | IS_CHERRYVIEW ( dev_priv ) ) & &
intel_crtc_has_dp_encoder ( crtc_state ) & & crtc_state - > has_audio )
min_cdclk = max ( crtc_state - > port_clock , min_cdclk ) ;
2017-12-20 11:50:17 +01:00
/*
* On Valleyview some DSI panels lose ( v | h ) sync when the clock is lower
* than 320000 KHz .
*/
if ( intel_crtc_has_type ( crtc_state , INTEL_OUTPUT_DSI ) & &
IS_VALLEYVIEW ( dev_priv ) )
min_cdclk = max ( 320000 , min_cdclk ) ;
2019-04-30 15:51:19 +03:00
/*
* On Geminilake once the CDCLK gets as low as 79200
* picture gets unstable , despite that values are
* correct for DSI PLL and DE PLL .
*/
if ( intel_crtc_has_type ( crtc_state , INTEL_OUTPUT_DSI ) & &
IS_GEMINILAKE ( dev_priv ) )
min_cdclk = max ( 158400 , min_cdclk ) ;
2019-10-15 22:30:26 +03:00
/* Account for additional needs from the planes */
min_cdclk = max ( intel_planes_min_cdclk ( crtc_state ) , min_cdclk ) ;
2020-06-08 09:55:52 +03:00
/*
* HACK . Currently for TGL platforms we calculate
* min_cdclk initially based on pixel_rate divided
* by 2 , accounting for also plane requirements ,
* however in some cases the lowest possible CDCLK
* doesn ' t work and causing the underruns .
* Explicitly stating here that this seems to be currently
* rather a Hack , than final solution .
*/
2020-07-02 12:15:26 +03:00
if ( IS_TIGERLAKE ( dev_priv ) ) {
/*
* Clamp to max_cdclk_freq in case pixel rate is higher ,
* in order not to break an 8 K , but still leave W / A at place .
*/
min_cdclk = max_t ( int , min_cdclk ,
min_t ( int , crtc_state - > pixel_rate ,
dev_priv - > max_cdclk_freq ) ) ;
}
2020-06-08 09:55:52 +03:00
2017-07-10 22:33:47 +03:00
if ( min_cdclk > dev_priv - > max_cdclk_freq ) {
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_dbg_kms ( & dev_priv - > drm ,
" required cdclk (%d kHz) exceeds max (%d kHz) \n " ,
min_cdclk , dev_priv - > max_cdclk_freq ) ;
2017-07-10 22:33:47 +03:00
return - EINVAL ;
}
2017-08-30 21:57:03 +03:00
return min_cdclk ;
2017-02-07 20:33:05 +02:00
}
2020-01-21 16:03:53 +02:00
static int intel_compute_min_cdclk ( struct intel_cdclk_state * cdclk_state )
2017-02-07 20:33:05 +02:00
{
2020-01-21 16:03:53 +02:00
struct intel_atomic_state * state = cdclk_state - > base . state ;
2020-06-01 20:30:58 +03:00
struct drm_i915_private * dev_priv = to_i915 ( state - > base . dev ) ;
struct intel_bw_state * bw_state = NULL ;
2017-08-30 21:57:03 +03:00
struct intel_crtc * crtc ;
2017-02-07 20:33:05 +02:00
struct intel_crtc_state * crtc_state ;
2017-07-10 22:33:47 +03:00
int min_cdclk , i ;
2020-06-01 20:30:58 +03:00
enum pipe pipe ;
2017-02-07 20:33:05 +02:00
2019-05-17 22:31:19 +03:00
for_each_new_intel_crtc_in_state ( state , crtc , crtc_state , i ) {
2019-10-15 22:30:24 +03:00
int ret ;
2017-07-10 22:33:47 +03:00
min_cdclk = intel_crtc_compute_min_cdclk ( crtc_state ) ;
if ( min_cdclk < 0 )
return min_cdclk ;
2020-06-01 20:30:58 +03:00
bw_state = intel_atomic_get_bw_state ( state ) ;
if ( IS_ERR ( bw_state ) )
return PTR_ERR ( bw_state ) ;
2021-02-04 04:08:45 +02:00
if ( cdclk_state - > min_cdclk [ crtc - > pipe ] = = min_cdclk )
2019-10-15 22:30:24 +03:00
continue ;
2021-02-04 04:08:45 +02:00
cdclk_state - > min_cdclk [ crtc - > pipe ] = min_cdclk ;
2019-10-15 22:30:24 +03:00
2020-01-21 16:03:53 +02:00
ret = intel_atomic_lock_global_state ( & cdclk_state - > base ) ;
2019-10-15 22:30:24 +03:00
if ( ret )
return ret ;
2017-07-10 22:33:47 +03:00
}
2017-02-07 20:33:05 +02:00
2020-01-20 19:47:19 +02:00
min_cdclk = cdclk_state - > force_min_cdclk ;
2020-06-01 20:30:58 +03:00
for_each_pipe ( dev_priv , pipe ) {
min_cdclk = max ( cdclk_state - > min_cdclk [ pipe ] , min_cdclk ) ;
2020-05-20 18:00:58 +03:00
2020-06-01 20:30:58 +03:00
if ( ! bw_state )
continue ;
2020-05-20 18:00:58 +03:00
min_cdclk = max ( bw_state - > min_cdclk , min_cdclk ) ;
}
2017-02-07 20:33:05 +02:00
2017-08-30 21:57:03 +03:00
return min_cdclk ;
2017-02-07 20:33:05 +02:00
}
2017-10-24 12:52:14 +03:00
/*
2019-09-11 16:31:29 +03:00
* Account for port clock min voltage level requirements .
* This only really does something on CNL + but can be
* called on earlier platforms as well .
*
2017-10-24 12:52:14 +03:00
* Note that this functions assumes that 0 is
* the lowest voltage value , and higher values
* correspond to increasingly higher voltages .
*
* Should that relationship no longer hold on
* future platforms this code will need to be
* adjusted .
*/
2020-01-21 16:03:53 +02:00
static int bxt_compute_min_voltage_level ( struct intel_cdclk_state * cdclk_state )
2017-10-24 12:52:14 +03:00
{
2020-01-21 16:03:53 +02:00
struct intel_atomic_state * state = cdclk_state - > base . state ;
2017-10-24 12:52:14 +03:00
struct drm_i915_private * dev_priv = to_i915 ( state - > base . dev ) ;
struct intel_crtc * crtc ;
struct intel_crtc_state * crtc_state ;
u8 min_voltage_level ;
int i ;
enum pipe pipe ;
for_each_new_intel_crtc_in_state ( state , crtc , crtc_state , i ) {
2019-10-15 22:30:24 +03:00
int ret ;
2019-10-31 12:26:02 +01:00
if ( crtc_state - > hw . enable )
2019-10-15 22:30:24 +03:00
min_voltage_level = crtc_state - > min_voltage_level ;
2017-10-24 12:52:14 +03:00
else
2019-10-15 22:30:24 +03:00
min_voltage_level = 0 ;
2021-02-04 04:08:45 +02:00
if ( cdclk_state - > min_voltage_level [ crtc - > pipe ] = = min_voltage_level )
2019-10-15 22:30:24 +03:00
continue ;
2021-02-04 04:08:45 +02:00
cdclk_state - > min_voltage_level [ crtc - > pipe ] = min_voltage_level ;
2019-10-15 22:30:24 +03:00
2020-01-21 16:03:53 +02:00
ret = intel_atomic_lock_global_state ( & cdclk_state - > base ) ;
2019-10-15 22:30:24 +03:00
if ( ret )
return ret ;
2017-10-24 12:52:14 +03:00
}
min_voltage_level = 0 ;
for_each_pipe ( dev_priv , pipe )
2020-01-20 19:47:19 +02:00
min_voltage_level = max ( cdclk_state - > min_voltage_level [ pipe ] ,
2017-10-24 12:52:14 +03:00
min_voltage_level ) ;
return min_voltage_level ;
}
2020-01-21 16:03:53 +02:00
static int vlv_modeset_calc_cdclk ( struct intel_cdclk_state * cdclk_state )
2017-02-07 20:33:05 +02:00
{
2020-01-21 16:03:53 +02:00
struct intel_atomic_state * state = cdclk_state - > base . state ;
2019-05-17 22:31:19 +03:00
struct drm_i915_private * dev_priv = to_i915 ( state - > base . dev ) ;
2017-07-10 22:33:47 +03:00
int min_cdclk , cdclk ;
2017-01-20 20:21:59 +02:00
2020-01-21 16:03:53 +02:00
min_cdclk = intel_compute_min_cdclk ( cdclk_state ) ;
2017-07-10 22:33:47 +03:00
if ( min_cdclk < 0 )
return min_cdclk ;
2017-02-07 20:33:05 +02:00
2017-07-10 22:33:47 +03:00
cdclk = vlv_calc_cdclk ( dev_priv , min_cdclk ) ;
2017-02-07 20:33:05 +02:00
2020-01-20 19:47:19 +02:00
cdclk_state - > logical . cdclk = cdclk ;
cdclk_state - > logical . voltage_level =
2017-10-24 12:52:09 +03:00
vlv_calc_voltage_level ( dev_priv , cdclk ) ;
2017-01-20 20:21:59 +02:00
2020-01-20 19:47:28 +02:00
if ( ! cdclk_state - > active_pipes ) {
2020-01-20 19:47:19 +02:00
cdclk = vlv_calc_cdclk ( dev_priv , cdclk_state - > force_min_cdclk ) ;
2017-01-20 20:21:59 +02:00
2020-01-20 19:47:19 +02:00
cdclk_state - > actual . cdclk = cdclk ;
cdclk_state - > actual . voltage_level =
2017-10-24 12:52:09 +03:00
vlv_calc_voltage_level ( dev_priv , cdclk ) ;
2017-01-20 20:21:59 +02:00
} else {
2020-01-20 19:47:19 +02:00
cdclk_state - > actual = cdclk_state - > logical ;
2017-01-20 20:21:59 +02:00
}
2017-02-07 20:33:05 +02:00
return 0 ;
}
2020-01-21 16:03:53 +02:00
static int bdw_modeset_calc_cdclk ( struct intel_cdclk_state * cdclk_state )
2017-02-07 20:33:05 +02:00
{
2017-07-10 22:33:47 +03:00
int min_cdclk , cdclk ;
2020-01-21 16:03:53 +02:00
min_cdclk = intel_compute_min_cdclk ( cdclk_state ) ;
2017-07-10 22:33:47 +03:00
if ( min_cdclk < 0 )
return min_cdclk ;
2017-02-07 20:33:05 +02:00
/*
* FIXME should also account for plane ratio
* once 64 bpp pixel formats are supported .
*/
2017-08-30 21:57:03 +03:00
cdclk = bdw_calc_cdclk ( min_cdclk ) ;
2017-02-07 20:33:05 +02:00
2020-01-20 19:47:19 +02:00
cdclk_state - > logical . cdclk = cdclk ;
cdclk_state - > logical . voltage_level =
2017-10-24 12:52:10 +03:00
bdw_calc_voltage_level ( cdclk ) ;
2017-01-20 20:21:59 +02:00
2020-01-20 19:47:28 +02:00
if ( ! cdclk_state - > active_pipes ) {
2020-01-20 19:47:19 +02:00
cdclk = bdw_calc_cdclk ( cdclk_state - > force_min_cdclk ) ;
2017-01-20 20:21:59 +02:00
2020-01-20 19:47:19 +02:00
cdclk_state - > actual . cdclk = cdclk ;
cdclk_state - > actual . voltage_level =
2017-10-24 12:52:10 +03:00
bdw_calc_voltage_level ( cdclk ) ;
2017-01-20 20:21:59 +02:00
} else {
2020-01-20 19:47:19 +02:00
cdclk_state - > actual = cdclk_state - > logical ;
2017-01-20 20:21:59 +02:00
}
2017-02-07 20:33:05 +02:00
return 0 ;
}
2020-01-21 16:03:53 +02:00
static int skl_dpll0_vco ( struct intel_cdclk_state * cdclk_state )
drm/i915: Adjust eDP's logical vco in a reliable place.
On intel_dp_compute_config() we were calculating the needed vco
for eDP on gen9 and we stashing it in
intel_atomic_state.cdclk.logical.vco
However few moments later on intel_modeset_checks() we fully
replace entire intel_atomic_state.cdclk.logical with
dev_priv->cdclk.logical fully overwriting the logical desired
vco for eDP on gen9.
So, with wrong VCO value we end up with wrong desired cdclk, but
also it will raise a lot of WARNs: On gen9, when we read
CDCLK_CTL to verify if we configured properly the desired
frequency the CD Frequency Select bits [27:26] == 10b can mean
337.5 or 308.57 MHz depending on the VCO. So if we have wrong
VCO value stashed we will believe the frequency selection didn't
stick and start to raise WARNs of cdclk mismatch.
[ 42.857519] [drm:intel_dump_cdclk_state [i915]] Changing CDCLK to 308571 kHz, VCO 8640000 kHz, ref 24000 kHz, bypass 24000 kHz, voltage level 0
[ 42.897269] cdclk state doesn't match!
[ 42.901052] WARNING: CPU: 5 PID: 1116 at drivers/gpu/drm/i915/intel_cdclk.c:2084 intel_set_cdclk+0x5d/0x110 [i915]
[ 42.938004] RIP: 0010:intel_set_cdclk+0x5d/0x110 [i915]
[ 43.155253] WARNING: CPU: 5 PID: 1116 at drivers/gpu/drm/i915/intel_cdclk.c:2084 intel_set_cdclk+0x5d/0x110 [i915]
[ 43.170277] [drm:intel_dump_cdclk_state [i915]] [hw state] 337500 kHz, VCO 8100000 kHz, ref 24000 kHz, bypass 24000 kHz, voltage level 0
[ 43.182566] [drm:intel_dump_cdclk_state [i915]] [sw state] 308571 kHz, VCO 8640000 kHz, ref 24000 kHz, bypass 24000 kHz, voltage level 0
v2: Move the entire eDP's vco logical adjustment to inside
the skl_modeset_calc_cdclk as suggested by Ville.
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Fixes: bb0f4aab0e76 ("drm/i915: Track full cdclk state for the logical and actual cdclk frequencies")
Cc: <stable@vger.kernel.org> # v4.12+
Link: https://patchwork.freedesktop.org/patch/msgid/20180502175255.5344-1-rodrigo.vivi@intel.com
2018-05-02 10:52:55 -07:00
{
2020-01-21 16:03:53 +02:00
struct intel_atomic_state * state = cdclk_state - > base . state ;
2019-05-17 22:31:19 +03:00
struct drm_i915_private * dev_priv = to_i915 ( state - > base . dev ) ;
drm/i915: Adjust eDP's logical vco in a reliable place.
On intel_dp_compute_config() we were calculating the needed vco
for eDP on gen9 and we stashing it in
intel_atomic_state.cdclk.logical.vco
However few moments later on intel_modeset_checks() we fully
replace entire intel_atomic_state.cdclk.logical with
dev_priv->cdclk.logical fully overwriting the logical desired
vco for eDP on gen9.
So, with wrong VCO value we end up with wrong desired cdclk, but
also it will raise a lot of WARNs: On gen9, when we read
CDCLK_CTL to verify if we configured properly the desired
frequency the CD Frequency Select bits [27:26] == 10b can mean
337.5 or 308.57 MHz depending on the VCO. So if we have wrong
VCO value stashed we will believe the frequency selection didn't
stick and start to raise WARNs of cdclk mismatch.
[ 42.857519] [drm:intel_dump_cdclk_state [i915]] Changing CDCLK to 308571 kHz, VCO 8640000 kHz, ref 24000 kHz, bypass 24000 kHz, voltage level 0
[ 42.897269] cdclk state doesn't match!
[ 42.901052] WARNING: CPU: 5 PID: 1116 at drivers/gpu/drm/i915/intel_cdclk.c:2084 intel_set_cdclk+0x5d/0x110 [i915]
[ 42.938004] RIP: 0010:intel_set_cdclk+0x5d/0x110 [i915]
[ 43.155253] WARNING: CPU: 5 PID: 1116 at drivers/gpu/drm/i915/intel_cdclk.c:2084 intel_set_cdclk+0x5d/0x110 [i915]
[ 43.170277] [drm:intel_dump_cdclk_state [i915]] [hw state] 337500 kHz, VCO 8100000 kHz, ref 24000 kHz, bypass 24000 kHz, voltage level 0
[ 43.182566] [drm:intel_dump_cdclk_state [i915]] [sw state] 308571 kHz, VCO 8640000 kHz, ref 24000 kHz, bypass 24000 kHz, voltage level 0
v2: Move the entire eDP's vco logical adjustment to inside
the skl_modeset_calc_cdclk as suggested by Ville.
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Fixes: bb0f4aab0e76 ("drm/i915: Track full cdclk state for the logical and actual cdclk frequencies")
Cc: <stable@vger.kernel.org> # v4.12+
Link: https://patchwork.freedesktop.org/patch/msgid/20180502175255.5344-1-rodrigo.vivi@intel.com
2018-05-02 10:52:55 -07:00
struct intel_crtc * crtc ;
struct intel_crtc_state * crtc_state ;
int vco , i ;
2020-01-20 19:47:19 +02:00
vco = cdclk_state - > logical . vco ;
drm/i915: Adjust eDP's logical vco in a reliable place.
On intel_dp_compute_config() we were calculating the needed vco
for eDP on gen9 and we stashing it in
intel_atomic_state.cdclk.logical.vco
However few moments later on intel_modeset_checks() we fully
replace entire intel_atomic_state.cdclk.logical with
dev_priv->cdclk.logical fully overwriting the logical desired
vco for eDP on gen9.
So, with wrong VCO value we end up with wrong desired cdclk, but
also it will raise a lot of WARNs: On gen9, when we read
CDCLK_CTL to verify if we configured properly the desired
frequency the CD Frequency Select bits [27:26] == 10b can mean
337.5 or 308.57 MHz depending on the VCO. So if we have wrong
VCO value stashed we will believe the frequency selection didn't
stick and start to raise WARNs of cdclk mismatch.
[ 42.857519] [drm:intel_dump_cdclk_state [i915]] Changing CDCLK to 308571 kHz, VCO 8640000 kHz, ref 24000 kHz, bypass 24000 kHz, voltage level 0
[ 42.897269] cdclk state doesn't match!
[ 42.901052] WARNING: CPU: 5 PID: 1116 at drivers/gpu/drm/i915/intel_cdclk.c:2084 intel_set_cdclk+0x5d/0x110 [i915]
[ 42.938004] RIP: 0010:intel_set_cdclk+0x5d/0x110 [i915]
[ 43.155253] WARNING: CPU: 5 PID: 1116 at drivers/gpu/drm/i915/intel_cdclk.c:2084 intel_set_cdclk+0x5d/0x110 [i915]
[ 43.170277] [drm:intel_dump_cdclk_state [i915]] [hw state] 337500 kHz, VCO 8100000 kHz, ref 24000 kHz, bypass 24000 kHz, voltage level 0
[ 43.182566] [drm:intel_dump_cdclk_state [i915]] [sw state] 308571 kHz, VCO 8640000 kHz, ref 24000 kHz, bypass 24000 kHz, voltage level 0
v2: Move the entire eDP's vco logical adjustment to inside
the skl_modeset_calc_cdclk as suggested by Ville.
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Fixes: bb0f4aab0e76 ("drm/i915: Track full cdclk state for the logical and actual cdclk frequencies")
Cc: <stable@vger.kernel.org> # v4.12+
Link: https://patchwork.freedesktop.org/patch/msgid/20180502175255.5344-1-rodrigo.vivi@intel.com
2018-05-02 10:52:55 -07:00
if ( ! vco )
vco = dev_priv - > skl_preferred_vco_freq ;
2019-05-17 22:31:19 +03:00
for_each_new_intel_crtc_in_state ( state , crtc , crtc_state , i ) {
2019-10-31 12:26:02 +01:00
if ( ! crtc_state - > hw . enable )
drm/i915: Adjust eDP's logical vco in a reliable place.
On intel_dp_compute_config() we were calculating the needed vco
for eDP on gen9 and we stashing it in
intel_atomic_state.cdclk.logical.vco
However few moments later on intel_modeset_checks() we fully
replace entire intel_atomic_state.cdclk.logical with
dev_priv->cdclk.logical fully overwriting the logical desired
vco for eDP on gen9.
So, with wrong VCO value we end up with wrong desired cdclk, but
also it will raise a lot of WARNs: On gen9, when we read
CDCLK_CTL to verify if we configured properly the desired
frequency the CD Frequency Select bits [27:26] == 10b can mean
337.5 or 308.57 MHz depending on the VCO. So if we have wrong
VCO value stashed we will believe the frequency selection didn't
stick and start to raise WARNs of cdclk mismatch.
[ 42.857519] [drm:intel_dump_cdclk_state [i915]] Changing CDCLK to 308571 kHz, VCO 8640000 kHz, ref 24000 kHz, bypass 24000 kHz, voltage level 0
[ 42.897269] cdclk state doesn't match!
[ 42.901052] WARNING: CPU: 5 PID: 1116 at drivers/gpu/drm/i915/intel_cdclk.c:2084 intel_set_cdclk+0x5d/0x110 [i915]
[ 42.938004] RIP: 0010:intel_set_cdclk+0x5d/0x110 [i915]
[ 43.155253] WARNING: CPU: 5 PID: 1116 at drivers/gpu/drm/i915/intel_cdclk.c:2084 intel_set_cdclk+0x5d/0x110 [i915]
[ 43.170277] [drm:intel_dump_cdclk_state [i915]] [hw state] 337500 kHz, VCO 8100000 kHz, ref 24000 kHz, bypass 24000 kHz, voltage level 0
[ 43.182566] [drm:intel_dump_cdclk_state [i915]] [sw state] 308571 kHz, VCO 8640000 kHz, ref 24000 kHz, bypass 24000 kHz, voltage level 0
v2: Move the entire eDP's vco logical adjustment to inside
the skl_modeset_calc_cdclk as suggested by Ville.
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Fixes: bb0f4aab0e76 ("drm/i915: Track full cdclk state for the logical and actual cdclk frequencies")
Cc: <stable@vger.kernel.org> # v4.12+
Link: https://patchwork.freedesktop.org/patch/msgid/20180502175255.5344-1-rodrigo.vivi@intel.com
2018-05-02 10:52:55 -07:00
continue ;
if ( ! intel_crtc_has_type ( crtc_state , INTEL_OUTPUT_EDP ) )
continue ;
/*
* DPLL0 VCO may need to be adjusted to get the correct
* clock for eDP . This will affect cdclk as well .
*/
switch ( crtc_state - > port_clock / 2 ) {
case 108000 :
case 216000 :
vco = 8640000 ;
break ;
default :
vco = 8100000 ;
break ;
}
}
return vco ;
}
2020-01-21 16:03:53 +02:00
static int skl_modeset_calc_cdclk ( struct intel_cdclk_state * cdclk_state )
2017-02-07 20:33:05 +02:00
{
2017-07-10 22:33:47 +03:00
int min_cdclk , cdclk , vco ;
2020-01-21 16:03:53 +02:00
min_cdclk = intel_compute_min_cdclk ( cdclk_state ) ;
2017-07-10 22:33:47 +03:00
if ( min_cdclk < 0 )
return min_cdclk ;
2017-01-20 20:21:59 +02:00
2020-01-21 16:03:53 +02:00
vco = skl_dpll0_vco ( cdclk_state ) ;
2017-02-07 20:33:05 +02:00
/*
* FIXME should also account for plane ratio
* once 64 bpp pixel formats are supported .
*/
2017-08-30 21:57:03 +03:00
cdclk = skl_calc_cdclk ( min_cdclk , vco ) ;
2017-02-07 20:33:05 +02:00
2020-01-20 19:47:19 +02:00
cdclk_state - > logical . vco = vco ;
cdclk_state - > logical . cdclk = cdclk ;
cdclk_state - > logical . voltage_level =
2017-10-24 12:52:11 +03:00
skl_calc_voltage_level ( cdclk ) ;
2017-01-20 20:21:59 +02:00
2020-01-20 19:47:28 +02:00
if ( ! cdclk_state - > active_pipes ) {
2020-01-20 19:47:19 +02:00
cdclk = skl_calc_cdclk ( cdclk_state - > force_min_cdclk , vco ) ;
2017-01-20 20:21:59 +02:00
2020-01-20 19:47:19 +02:00
cdclk_state - > actual . vco = vco ;
cdclk_state - > actual . cdclk = cdclk ;
cdclk_state - > actual . voltage_level =
2017-10-24 12:52:11 +03:00
skl_calc_voltage_level ( cdclk ) ;
2017-01-20 20:21:59 +02:00
} else {
2020-01-20 19:47:19 +02:00
cdclk_state - > actual = cdclk_state - > logical ;
2017-01-20 20:21:59 +02:00
}
2017-02-07 20:33:05 +02:00
return 0 ;
}
2020-01-21 16:03:53 +02:00
static int bxt_modeset_calc_cdclk ( struct intel_cdclk_state * cdclk_state )
2017-02-07 20:33:05 +02:00
{
2020-01-21 16:03:53 +02:00
struct intel_atomic_state * state = cdclk_state - > base . state ;
2019-05-17 22:31:19 +03:00
struct drm_i915_private * dev_priv = to_i915 ( state - > base . dev ) ;
2019-10-15 22:30:24 +03:00
int min_cdclk , min_voltage_level , cdclk , vco ;
2017-07-10 22:33:47 +03:00
2020-01-21 16:03:53 +02:00
min_cdclk = intel_compute_min_cdclk ( cdclk_state ) ;
2017-07-10 22:33:47 +03:00
if ( min_cdclk < 0 )
return min_cdclk ;
2017-02-07 20:33:05 +02:00
2020-01-21 16:03:53 +02:00
min_voltage_level = bxt_compute_min_voltage_level ( cdclk_state ) ;
2019-10-15 22:30:24 +03:00
if ( min_voltage_level < 0 )
return min_voltage_level ;
2019-09-10 09:15:06 -07:00
cdclk = bxt_calc_cdclk ( dev_priv , min_cdclk ) ;
vco = bxt_calc_cdclk_pll_vco ( dev_priv , cdclk ) ;
2017-01-20 20:21:59 +02:00
2020-01-20 19:47:19 +02:00
cdclk_state - > logical . vco = vco ;
cdclk_state - > logical . cdclk = cdclk ;
cdclk_state - > logical . voltage_level =
2019-10-15 22:30:24 +03:00
max_t ( int , min_voltage_level ,
dev_priv - > display . calc_voltage_level ( cdclk ) ) ;
2018-02-06 17:33:46 -02:00
2020-01-20 19:47:28 +02:00
if ( ! cdclk_state - > active_pipes ) {
2020-01-20 19:47:19 +02:00
cdclk = bxt_calc_cdclk ( dev_priv , cdclk_state - > force_min_cdclk ) ;
2019-09-10 09:15:06 -07:00
vco = bxt_calc_cdclk_pll_vco ( dev_priv , cdclk ) ;
2018-02-06 17:33:46 -02:00
2020-01-20 19:47:19 +02:00
cdclk_state - > actual . vco = vco ;
cdclk_state - > actual . cdclk = cdclk ;
cdclk_state - > actual . voltage_level =
2019-09-10 08:42:50 -07:00
dev_priv - > display . calc_voltage_level ( cdclk ) ;
2018-02-06 17:33:46 -02:00
} else {
2020-01-20 19:47:19 +02:00
cdclk_state - > actual = cdclk_state - > logical ;
2018-02-06 17:33:46 -02:00
}
return 0 ;
}
2020-01-21 16:03:53 +02:00
static int fixed_modeset_calc_cdclk ( struct intel_cdclk_state * cdclk_state )
2019-07-08 15:53:16 +03:00
{
int min_cdclk ;
/*
* We can ' t change the cdclk frequency , but we still want to
* check that the required minimum frequency doesn ' t exceed
* the actual cdclk frequency .
*/
2020-01-21 16:03:53 +02:00
min_cdclk = intel_compute_min_cdclk ( cdclk_state ) ;
2019-07-08 15:53:16 +03:00
if ( min_cdclk < 0 )
return min_cdclk ;
return 0 ;
}
2020-01-21 16:03:53 +02:00
static struct intel_global_state * intel_cdclk_duplicate_state ( struct intel_global_obj * obj )
{
struct intel_cdclk_state * cdclk_state ;
cdclk_state = kmemdup ( obj - > state , sizeof ( * cdclk_state ) , GFP_KERNEL ) ;
if ( ! cdclk_state )
return NULL ;
cdclk_state - > pipe = INVALID_PIPE ;
return & cdclk_state - > base ;
}
static void intel_cdclk_destroy_state ( struct intel_global_obj * obj ,
struct intel_global_state * state )
{
kfree ( state ) ;
}
static const struct intel_global_state_funcs intel_cdclk_funcs = {
. atomic_duplicate_state = intel_cdclk_duplicate_state ,
. atomic_destroy_state = intel_cdclk_destroy_state ,
} ;
struct intel_cdclk_state *
intel_atomic_get_cdclk_state ( struct intel_atomic_state * state )
{
struct drm_i915_private * dev_priv = to_i915 ( state - > base . dev ) ;
struct intel_global_state * cdclk_state ;
cdclk_state = intel_atomic_get_global_obj_state ( state , & dev_priv - > cdclk . obj ) ;
if ( IS_ERR ( cdclk_state ) )
return ERR_CAST ( cdclk_state ) ;
return to_intel_cdclk_state ( cdclk_state ) ;
}
int intel_cdclk_init ( struct drm_i915_private * dev_priv )
{
struct intel_cdclk_state * cdclk_state ;
cdclk_state = kzalloc ( sizeof ( * cdclk_state ) , GFP_KERNEL ) ;
if ( ! cdclk_state )
return - ENOMEM ;
intel_atomic_global_obj_init ( dev_priv , & dev_priv - > cdclk . obj ,
& cdclk_state - > base , & intel_cdclk_funcs ) ;
return 0 ;
}
2019-09-13 22:31:56 +03:00
int intel_modeset_calc_cdclk ( struct intel_atomic_state * state )
{
struct drm_i915_private * dev_priv = to_i915 ( state - > base . dev ) ;
2020-01-21 16:03:53 +02:00
const struct intel_cdclk_state * old_cdclk_state ;
struct intel_cdclk_state * new_cdclk_state ;
2019-09-13 22:31:56 +03:00
enum pipe pipe ;
int ret ;
2020-01-21 16:03:53 +02:00
new_cdclk_state = intel_atomic_get_cdclk_state ( state ) ;
if ( IS_ERR ( new_cdclk_state ) )
return PTR_ERR ( new_cdclk_state ) ;
2020-01-20 19:47:14 +02:00
2020-01-21 16:03:53 +02:00
old_cdclk_state = intel_atomic_get_old_cdclk_state ( state ) ;
2020-01-20 19:47:14 +02:00
2020-01-20 19:47:28 +02:00
new_cdclk_state - > active_pipes =
intel_calc_active_pipes ( state , old_cdclk_state - > active_pipes ) ;
2020-01-21 16:03:53 +02:00
ret = dev_priv - > display . modeset_calc_cdclk ( new_cdclk_state ) ;
2019-09-13 22:31:56 +03:00
if ( ret )
return ret ;
2020-01-20 19:47:19 +02:00
if ( intel_cdclk_changed ( & old_cdclk_state - > actual ,
& new_cdclk_state - > actual ) ) {
2019-10-15 22:30:24 +03:00
/*
* Also serialize commits across all crtcs
* if the actual hw needs to be poked .
*/
2020-01-21 16:03:53 +02:00
ret = intel_atomic_serialize_global_state ( & new_cdclk_state - > base ) ;
2019-10-15 22:30:24 +03:00
if ( ret )
return ret ;
2020-01-20 19:47:28 +02:00
} else if ( old_cdclk_state - > active_pipes ! = new_cdclk_state - > active_pipes | |
2020-07-14 18:26:26 +03:00
old_cdclk_state - > force_min_cdclk ! = new_cdclk_state - > force_min_cdclk | |
2020-01-20 19:47:28 +02:00
intel_cdclk_changed ( & old_cdclk_state - > logical ,
2020-01-20 19:47:19 +02:00
& new_cdclk_state - > logical ) ) {
2020-01-21 16:03:53 +02:00
ret = intel_atomic_lock_global_state ( & new_cdclk_state - > base ) ;
2019-10-15 22:30:24 +03:00
if ( ret )
2019-09-13 22:31:56 +03:00
return ret ;
2019-10-15 22:30:24 +03:00
} else {
return 0 ;
2019-09-13 22:31:56 +03:00
}
2020-01-20 19:47:28 +02:00
if ( is_power_of_2 ( new_cdclk_state - > active_pipes ) & &
2020-01-20 19:47:16 +02:00
intel_cdclk_can_cd2x_update ( dev_priv ,
2020-01-20 19:47:19 +02:00
& old_cdclk_state - > actual ,
& new_cdclk_state - > actual ) ) {
2019-09-13 22:31:56 +03:00
struct intel_crtc * crtc ;
struct intel_crtc_state * crtc_state ;
2020-01-20 19:47:28 +02:00
pipe = ilog2 ( new_cdclk_state - > active_pipes ) ;
2019-09-13 22:31:56 +03:00
crtc = intel_get_crtc_for_pipe ( dev_priv , pipe ) ;
2019-10-15 22:30:24 +03:00
crtc_state = intel_atomic_get_crtc_state ( & state - > base , crtc ) ;
if ( IS_ERR ( crtc_state ) )
return PTR_ERR ( crtc_state ) ;
2019-10-31 12:26:03 +01:00
if ( drm_atomic_crtc_needs_modeset ( & crtc_state - > uapi ) )
2019-09-13 22:31:56 +03:00
pipe = INVALID_PIPE ;
} else {
pipe = INVALID_PIPE ;
}
2019-10-15 22:30:24 +03:00
if ( pipe ! = INVALID_PIPE ) {
2020-01-20 19:47:19 +02:00
new_cdclk_state - > pipe = pipe ;
2019-10-15 22:30:23 +03:00
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_dbg_kms ( & dev_priv - > drm ,
" Can change cdclk with pipe %c active \n " ,
pipe_name ( pipe ) ) ;
2020-01-20 19:47:19 +02:00
} else if ( intel_cdclk_needs_modeset ( & old_cdclk_state - > actual ,
& new_cdclk_state - > actual ) ) {
2019-10-15 22:30:24 +03:00
/* All pipes must be switched off while we change the cdclk. */
2019-09-13 22:31:56 +03:00
ret = intel_modeset_all_pipes ( state ) ;
if ( ret )
return ret ;
2020-01-20 19:47:19 +02:00
new_cdclk_state - > pipe = INVALID_PIPE ;
2019-10-15 22:30:23 +03:00
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_dbg_kms ( & dev_priv - > drm ,
" Modeset required for cdclk change \n " ) ;
2019-09-13 22:31:56 +03:00
}
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_dbg_kms ( & dev_priv - > drm ,
" New cdclk calculated to be logical %u kHz, actual %u kHz \n " ,
2020-01-20 19:47:19 +02:00
new_cdclk_state - > logical . cdclk ,
new_cdclk_state - > actual . cdclk ) ;
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_dbg_kms ( & dev_priv - > drm ,
" New voltage level calculated to be logical %u, actual %u \n " ,
2020-01-20 19:47:19 +02:00
new_cdclk_state - > logical . voltage_level ,
new_cdclk_state - > actual . voltage_level ) ;
2019-09-13 22:31:56 +03:00
return 0 ;
}
2017-02-07 20:33:05 +02:00
static int intel_compute_max_dotclk ( struct drm_i915_private * dev_priv )
{
int max_cdclk_freq = dev_priv - > max_cdclk_freq ;
drm/i915/display: Simplify GLK display version tests
GLK has always been a bit of a special case since it reports INTEL_GEN()
as 9, but has version 10 display IP. Now we can properly represent the
display version as 10 and simplify the display generation tests
throughout the display code.
Aside from manually adding the version to the glk_info structure, the
rest of this patch is generated with a Coccinelle semantic patch. Note
that we also need to switch any code that matches gen10 today but *not*
GLK to be CNL-specific:
@@ expression dev_priv; @@
- DISPLAY_VER(dev_priv) > 9
+ DISPLAY_VER(dev_priv) >= 10
@@ expression dev_priv, E; @@
(
- DISPLAY_VER(dev_priv) >= 10 && E
+ (DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)) && E
|
- DISPLAY_VER(dev_priv) >= 10
+ DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)
|
- IS_DISPLAY_RANGE(dev_priv, 10, E)
+ IS_DISPLAY_RANGE(dev_priv, 11, E) || IS_CANNONLAKE(dev_priv)
)
@@ expression dev_priv, E, E2; @@
(
- (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 10)
|
- E || IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv)
+ E || IS_DISPLAY_VER(dev_priv, 10)
|
- (IS_GEMINILAKE(dev_priv) || IS_CANNONLAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 10)
|
- IS_GEMINILAKE(dev_priv) || E || IS_CANNONLAKE(dev_priv)
+ E || IS_DISPLAY_VER(dev_priv, 10)
|
- E || IS_GEMINILAKE(dev_priv) || E2 || IS_CANNONLAKE(dev_priv)
+ E || E2 || IS_DISPLAY_VER(dev_priv, 10)
|
- (IS_DISPLAY_VER(dev_priv, 10) || IS_GEMINILAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 10)
|
- (IS_GEMINILAKE(dev_priv) || IS_DISPLAY_VER(dev_priv, 10))
+ IS_DISPLAY_VER(dev_priv, 10)
)
@@ expression dev_priv; @@
- (IS_DISPLAY_VER(dev_priv, 9) && !IS_GEMINILAKE(dev_priv))
+ IS_DISPLAY_VER(dev_priv, 9)
@@ expression dev_priv; @@
(
- !(DISPLAY_VER(dev_priv) >= 11 || IS_DISPLAY_VER(dev_priv, 10))
+ DISPLAY_VER(dev_priv) < 10
|
- (DISPLAY_VER(dev_priv) >= 11 || IS_DISPLAY_VER(dev_priv, 10))
+ DISPLAY_VER(dev_priv) >= 10
)
@@ expression dev_priv, E; @@
- E || DISPLAY_VER(dev_priv) >= 11 || IS_DISPLAY_VER(dev_priv, 10)
+ E || DISPLAY_VER(dev_priv) >= 10
@@ expression dev_priv, E; @@
- (IS_DISPLAY_RANGE(dev_priv, 11, E) || IS_DISPLAY_VER(dev_priv, 10))
+ IS_DISPLAY_RANGE(dev_priv, 10, E)
@@ expression dev_priv; @@
(
- DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv) || IS_GEN9_LP(dev_priv)
+ DISPLAY_VER(dev_priv) >= 10 || IS_GEN9_LP(dev_priv)
|
- IS_GEN9_LP(dev_priv) || DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)
+ IS_GEN9_LP(dev_priv) || DISPLAY_VER(dev_priv) >= 10
)
@@ expression dev_priv, E; @@
- !(DISPLAY_VER(dev_priv) >= E)
+ DISPLAY_VER(dev_priv) < E
v2:
- Convert gen10 conditions that don't include GLK into CNL conditions.
(Ville)
v3:
- Rework coccinelle rules so that "ver>=10" turns into "ver>=11||is_cnl." (Ville)
v3.1:
- Manually re-add the ".display.version = 10" to glk_info after
regenerating patch via Coccinelle.
v4:
- Also apply cocci rules to intel_pm.c and i915_irq.c! (CI)
Cc: Ville Syrjälä <ville.syrjala@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210322233840.4056851-1-matthew.d.roper@intel.com
2021-03-22 16:38:40 -07:00
if ( DISPLAY_VER ( dev_priv ) > = 10 )
2017-10-03 15:31:42 -07:00
return 2 * max_cdclk_freq ;
drm/i915/display: rename display version macros
While converting the rest of the driver to use GRAPHICS_VER() and
MEDIA_VER(), following what was done for display, some discussions went
back on what we did for display:
1) Why is the == comparison special that deserves a separate
macro instead of just getting the version and comparing directly
like is done for >, >=, <=?
2) IS_DISPLAY_RANGE() is weird in that it omits the "_VER" for
brevity. If we remove the current users of IS_DISPLAY_VER(), we
could actually repurpose it for a range check
With (1) there could be an advantage if we used gen_mask since multiple
conditionals be combined by the compiler in a single and instruction and
check the result. However a) INTEL_GEN() doesn't use the mask since it
would make the code bigger everywhere else and b) in the cases it made
sense, it also made sense to convert to the _RANGE() variant.
So here we repurpose IS_DISPLAY_VER() to work with a [ from, to ] range
like was the IS_DISPLAY_RANGE() and convert the current IS_DISPLAY_VER()
users to use == and != operators. Aside from the definition changes,
this was done by the following semantic patch:
@@ expression dev_priv, E1; @@
- !IS_DISPLAY_VER(dev_priv, E1)
+ DISPLAY_VER(dev_priv) != E1
@@ expression dev_priv, E1; @@
- IS_DISPLAY_VER(dev_priv, E1)
+ DISPLAY_VER(dev_priv) == E1
@@ expression dev_priv, from, until; @@
- IS_DISPLAY_RANGE(dev_priv, from, until)
+ IS_DISPLAY_VER(dev_priv, from, until)
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
[Jani: Minor conflict resolve while applying.]
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20210413051002.92589-4-lucas.demarchi@intel.com
2021-04-12 22:09:53 -07:00
else if ( DISPLAY_VER ( dev_priv ) = = 9 | |
2017-08-30 21:57:03 +03:00
IS_BROADWELL ( dev_priv ) | | IS_HASWELL ( dev_priv ) )
2017-02-07 20:33:05 +02:00
return max_cdclk_freq ;
else if ( IS_CHERRYVIEW ( dev_priv ) )
return max_cdclk_freq * 95 / 100 ;
2021-03-19 21:42:42 -07:00
else if ( DISPLAY_VER ( dev_priv ) < 4 )
2017-02-07 20:33:05 +02:00
return 2 * max_cdclk_freq * 90 / 100 ;
else
return max_cdclk_freq * 90 / 100 ;
}
/**
* intel_update_max_cdclk - Determine the maximum support CDCLK frequency
* @ dev_priv : i915 device
*
* Determine the maximum CDCLK frequency the platform supports , and also
* derive the maximum dot clock frequency the maximum CDCLK frequency
* allows .
*/
void intel_update_max_cdclk ( struct drm_i915_private * dev_priv )
{
2020-10-14 00:59:48 +05:30
if ( IS_JSL_EHL ( dev_priv ) ) {
2019-06-25 18:40:52 -07:00
if ( dev_priv - > cdclk . hw . ref = = 24000 )
dev_priv - > max_cdclk_freq = 552000 ;
else
dev_priv - > max_cdclk_freq = 556800 ;
2021-03-19 21:42:42 -07:00
} else if ( DISPLAY_VER ( dev_priv ) > = 11 ) {
2018-02-06 17:33:46 -02:00
if ( dev_priv - > cdclk . hw . ref = = 24000 )
dev_priv - > max_cdclk_freq = 648000 ;
else
dev_priv - > max_cdclk_freq = 652800 ;
} else if ( IS_CANNONLAKE ( dev_priv ) ) {
2017-06-09 15:26:01 -07:00
dev_priv - > max_cdclk_freq = 528000 ;
2021-04-07 13:39:45 -07:00
} else if ( IS_GEMINILAKE ( dev_priv ) ) {
dev_priv - > max_cdclk_freq = 316800 ;
} else if ( IS_BROXTON ( dev_priv ) ) {
dev_priv - > max_cdclk_freq = 624000 ;
drm/i915/display: rename display version macros
While converting the rest of the driver to use GRAPHICS_VER() and
MEDIA_VER(), following what was done for display, some discussions went
back on what we did for display:
1) Why is the == comparison special that deserves a separate
macro instead of just getting the version and comparing directly
like is done for >, >=, <=?
2) IS_DISPLAY_RANGE() is weird in that it omits the "_VER" for
brevity. If we remove the current users of IS_DISPLAY_VER(), we
could actually repurpose it for a range check
With (1) there could be an advantage if we used gen_mask since multiple
conditionals be combined by the compiler in a single and instruction and
check the result. However a) INTEL_GEN() doesn't use the mask since it
would make the code bigger everywhere else and b) in the cases it made
sense, it also made sense to convert to the _RANGE() variant.
So here we repurpose IS_DISPLAY_VER() to work with a [ from, to ] range
like was the IS_DISPLAY_RANGE() and convert the current IS_DISPLAY_VER()
users to use == and != operators. Aside from the definition changes,
this was done by the following semantic patch:
@@ expression dev_priv, E1; @@
- !IS_DISPLAY_VER(dev_priv, E1)
+ DISPLAY_VER(dev_priv) != E1
@@ expression dev_priv, E1; @@
- IS_DISPLAY_VER(dev_priv, E1)
+ DISPLAY_VER(dev_priv) == E1
@@ expression dev_priv, from, until; @@
- IS_DISPLAY_RANGE(dev_priv, from, until)
+ IS_DISPLAY_VER(dev_priv, from, until)
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
[Jani: Minor conflict resolve while applying.]
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20210413051002.92589-4-lucas.demarchi@intel.com
2021-04-12 22:09:53 -07:00
} else if ( DISPLAY_VER ( dev_priv ) = = 9 ) {
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
u32 limit = intel_de_read ( dev_priv , SKL_DFSM ) & SKL_DFSM_CDCLK_LIMIT_MASK ;
2017-02-07 20:33:05 +02:00
int max_cdclk , vco ;
vco = dev_priv - > skl_preferred_vco_freq ;
drm/i915/display/cdclk: Make WARN* drm specific where drm_priv 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_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_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,
...)
)
...+>
}
@rule2@
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/20200220165507.16823-2-pankaj.laxminarayan.bharadiya@intel.com
2020-02-20 22:25:00 +05:30
drm_WARN_ON ( & dev_priv - > drm , vco ! = 8100000 & & vco ! = 8640000 ) ;
2017-02-07 20:33:05 +02:00
/*
* Use the lower ( vco 8640 ) cdclk values as a
* first guess . skl_calc_cdclk ( ) will correct it
* if the preferred vco is 8100 instead .
*/
if ( limit = = SKL_DFSM_CDCLK_LIMIT_675 )
max_cdclk = 617143 ;
else if ( limit = = SKL_DFSM_CDCLK_LIMIT_540 )
max_cdclk = 540000 ;
else if ( limit = = SKL_DFSM_CDCLK_LIMIT_450 )
max_cdclk = 432000 ;
else
max_cdclk = 308571 ;
dev_priv - > max_cdclk_freq = skl_calc_cdclk ( max_cdclk , vco ) ;
} else if ( IS_BROADWELL ( dev_priv ) ) {
/*
* FIXME with extra cooling we can allow
* 540 MHz for ULX and 675 Mhz for ULT .
* How can we know if extra cooling is
* available ? PCI ID , VTB , something else ?
*/
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
if ( intel_de_read ( dev_priv , FUSE_STRAP ) & HSW_CDCLK_LIMIT )
2017-02-07 20:33:05 +02:00
dev_priv - > max_cdclk_freq = 450000 ;
else if ( IS_BDW_ULX ( dev_priv ) )
dev_priv - > max_cdclk_freq = 450000 ;
else if ( IS_BDW_ULT ( dev_priv ) )
dev_priv - > max_cdclk_freq = 540000 ;
else
dev_priv - > max_cdclk_freq = 675000 ;
} else if ( IS_CHERRYVIEW ( dev_priv ) ) {
dev_priv - > max_cdclk_freq = 320000 ;
} else if ( IS_VALLEYVIEW ( dev_priv ) ) {
dev_priv - > max_cdclk_freq = 400000 ;
} else {
/* otherwise assume cdclk is fixed */
2017-02-07 20:33:45 +02:00
dev_priv - > max_cdclk_freq = dev_priv - > cdclk . hw . cdclk ;
2017-02-07 20:33:05 +02:00
}
dev_priv - > max_dotclk_freq = intel_compute_max_dotclk ( dev_priv ) ;
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_dbg ( & dev_priv - > drm , " Max CD clock rate: %d kHz \n " ,
dev_priv - > max_cdclk_freq ) ;
2017-02-07 20:33:05 +02:00
drm/i915/cdclk: use new struct drm_device logging macros
Converts instances of the printk based debugging macros with the new
struct drm_device based logging macros in i915/display/intel_cdclk.c.
The conversion is achieved using the following coccinelle script that
transforms based on the existence of a struct drm_i915_private device in
the function:
@rule1@
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,
...)
)
...+>
}
@rule2@
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,
...)
)
...+>
}
Resulting checkpatch warnings were fixed 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/20200121134559.17355-6-wambui.karugax@gmail.com
2020-01-21 16:45:59 +03:00
drm_dbg ( & dev_priv - > drm , " Max dotclock rate: %d kHz \n " ,
dev_priv - > max_dotclk_freq ) ;
2017-02-07 20:33:05 +02:00
}
/**
* intel_update_cdclk - Determine the current CDCLK frequency
* @ dev_priv : i915 device
*
* Determine the current CDCLK frequency .
*/
void intel_update_cdclk ( struct drm_i915_private * dev_priv )
{
2017-02-07 20:33:45 +02:00
dev_priv - > display . get_cdclk ( dev_priv , & dev_priv - > cdclk . hw ) ;
2017-02-07 20:33:05 +02:00
/*
* 9 : 0 CMBUS [ sic ] CDCLK frequency ( cdfreq ) :
* Programmng [ sic ] note : bit [ 9 : 2 ] should be programmed to the number
* of cdclk that generates 4 MHz reference clock freq which is used to
* generate GMBus clock . This will vary with the cdclk freq .
*/
if ( IS_VALLEYVIEW ( dev_priv ) | | IS_CHERRYVIEW ( dev_priv ) )
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
intel_de_write ( dev_priv , GMBUSFREQ_VLV ,
2020-07-14 18:26:24 +03:00
DIV_ROUND_UP ( dev_priv - > cdclk . hw . cdclk , 1000 ) ) ;
2017-02-07 20:33:05 +02:00
}
2020-10-06 17:22:04 -07:00
static int dg1_rawclk ( struct drm_i915_private * dev_priv )
{
/*
* DG1 always uses a 38.4 MHz rawclk . The bspec tells us
* " Program Numerator=2, Denominator=4, Divider=37 decimal. "
*/
2020-11-30 13:15:54 +02:00
intel_de_write ( dev_priv , PCH_RAWCLK_FREQ ,
CNP_RAWCLK_DEN ( 4 ) | CNP_RAWCLK_DIV ( 37 ) | ICP_RAWCLK_NUM ( 2 ) ) ;
2020-10-06 17:22:04 -07:00
return 38400 ;
}
2017-06-02 13:06:41 -07:00
static int cnp_rawclk ( struct drm_i915_private * dev_priv )
{
u32 rawclk ;
int divider , fraction ;
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
if ( intel_de_read ( dev_priv , SFUSE_STRAP ) & SFUSE_STRAP_RAW_FREQUENCY ) {
2017-06-02 13:06:41 -07:00
/* 24 MHz */
divider = 24000 ;
fraction = 0 ;
} else {
/* 19.2 MHz */
divider = 19000 ;
fraction = 200 ;
}
2018-11-12 15:23:11 -08:00
rawclk = CNP_RAWCLK_DIV ( divider / 1000 ) ;
2018-11-12 15:23:13 -08:00
if ( fraction ) {
int numerator = 1 ;
2017-06-02 13:06:41 -07:00
2018-11-12 15:23:13 -08:00
rawclk | = CNP_RAWCLK_DEN ( DIV_ROUND_CLOSEST ( numerator * 1000 ,
fraction ) - 1 ) ;
2019-03-13 14:43:07 -07:00
if ( INTEL_PCH_TYPE ( dev_priv ) > = PCH_ICP )
2018-11-12 15:23:13 -08:00
rawclk | = ICP_RAWCLK_NUM ( numerator ) ;
2018-01-11 16:00:06 -02:00
}
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
intel_de_write ( dev_priv , PCH_RAWCLK_FREQ , rawclk ) ;
2018-11-12 15:23:13 -08:00
return divider + fraction ;
2018-01-11 16:00:06 -02:00
}
2017-02-07 20:33:05 +02:00
static int pch_rawclk ( struct drm_i915_private * dev_priv )
{
drm/i915/cdclk: 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/762b11289d22e1db46697c5b4596e49defc8190f.1579871655.git.jani.nikula@intel.com
2020-01-24 15:25:24 +02:00
return ( intel_de_read ( dev_priv , PCH_RAWCLK_FREQ ) & RAWCLK_FREQ_MASK ) * 1000 ;
2017-02-07 20:33:05 +02:00
}
static int vlv_hrawclk ( struct drm_i915_private * dev_priv )
{
/* RAWCLK_FREQ_VLV register updated from power well code */
return vlv_get_cck_clock_hpll ( dev_priv , " hrawclk " ,
CCK_DISPLAY_REF_CLOCK_CONTROL ) ;
}
2020-05-14 15:38:38 +03:00
static int i9xx_hrawclk ( struct drm_i915_private * dev_priv )
2017-02-07 20:33:05 +02:00
{
2019-01-16 11:15:25 +02:00
u32 clkcfg ;
2017-02-07 20:33:05 +02:00
2020-05-14 15:38:37 +03:00
/*
* hrawclock is 1 / 4 the FSB frequency
*
* Note that this only reads the state of the FSB
* straps , not the actual FSB frequency . Some BIOSen
* let you configure each independently . Ideally we ' d
* read out the actual FSB frequency but sadly we
* don ' t know which registers have that information ,
* and all the relevant docs have gone to bit heaven : (
*/
2020-05-14 15:38:36 +03:00
clkcfg = intel_de_read ( dev_priv , CLKCFG ) & CLKCFG_FSB_MASK ;
2020-05-14 15:38:38 +03:00
if ( IS_MOBILE ( dev_priv ) ) {
switch ( clkcfg ) {
case CLKCFG_FSB_400 :
return 100000 ;
case CLKCFG_FSB_533 :
return 133333 ;
case CLKCFG_FSB_667 :
return 166667 ;
case CLKCFG_FSB_800 :
return 200000 ;
case CLKCFG_FSB_1067 :
return 266667 ;
case CLKCFG_FSB_1333 :
return 333333 ;
default :
MISSING_CASE ( clkcfg ) ;
return 133333 ;
}
} else {
switch ( clkcfg ) {
case CLKCFG_FSB_400_ALT :
return 100000 ;
case CLKCFG_FSB_533 :
return 133333 ;
case CLKCFG_FSB_667 :
return 166667 ;
case CLKCFG_FSB_800 :
return 200000 ;
case CLKCFG_FSB_1067_ALT :
return 266667 ;
case CLKCFG_FSB_1333_ALT :
return 333333 ;
case CLKCFG_FSB_1600_ALT :
return 400000 ;
default :
return 133333 ;
}
2017-02-07 20:33:05 +02:00
}
}
/**
2020-02-16 16:34:45 +00:00
* intel_read_rawclk - Determine the current RAWCLK frequency
2017-02-07 20:33:05 +02:00
* @ dev_priv : i915 device
*
* Determine the current RAWCLK frequency . RAWCLK is a fixed
* frequency clock so this needs to done only once .
*/
2020-02-16 16:34:45 +00:00
u32 intel_read_rawclk ( struct drm_i915_private * dev_priv )
2017-02-07 20:33:05 +02:00
{
2020-02-16 16:34:45 +00:00
u32 freq ;
2020-10-06 17:22:04 -07:00
if ( INTEL_PCH_TYPE ( dev_priv ) > = PCH_DG1 )
freq = dg1_rawclk ( dev_priv ) ;
else if ( INTEL_PCH_TYPE ( dev_priv ) > = PCH_CNP )
2020-02-16 16:34:45 +00:00
freq = cnp_rawclk ( dev_priv ) ;
2017-06-02 13:06:41 -07:00
else if ( HAS_PCH_SPLIT ( dev_priv ) )
2020-02-16 16:34:45 +00:00
freq = pch_rawclk ( dev_priv ) ;
2017-02-07 20:33:05 +02:00
else if ( IS_VALLEYVIEW ( dev_priv ) | | IS_CHERRYVIEW ( dev_priv ) )
2020-02-16 16:34:45 +00:00
freq = vlv_hrawclk ( dev_priv ) ;
2021-03-19 21:42:42 -07:00
else if ( DISPLAY_VER ( dev_priv ) > = 3 )
2020-05-14 15:38:38 +03:00
freq = i9xx_hrawclk ( dev_priv ) ;
2017-02-07 20:33:05 +02:00
else
/* no rawclk on other platforms, or no need to know it */
2020-02-16 16:34:45 +00:00
return 0 ;
2017-02-07 20:33:05 +02:00
2020-02-16 16:34:45 +00:00
return freq ;
2017-02-07 20:33:05 +02:00
}
/**
* intel_init_cdclk_hooks - Initialize CDCLK related modesetting hooks
* @ dev_priv : i915 device
*/
void intel_init_cdclk_hooks ( struct drm_i915_private * dev_priv )
{
2021-05-14 08:37:00 -07:00
if ( IS_ALDERLAKE_P ( dev_priv ) ) {
dev_priv - > display . set_cdclk = bxt_set_cdclk ;
dev_priv - > display . bw_calc_min_cdclk = skl_bw_calc_min_cdclk ;
dev_priv - > display . modeset_calc_cdclk = bxt_modeset_calc_cdclk ;
dev_priv - > display . calc_voltage_level = tgl_calc_voltage_level ;
dev_priv - > cdclk . table = adlp_cdclk_table ;
} else if ( IS_ROCKETLAKE ( dev_priv ) ) {
2020-10-15 15:00:38 -07:00
dev_priv - > display . set_cdclk = bxt_set_cdclk ;
dev_priv - > display . bw_calc_min_cdclk = skl_bw_calc_min_cdclk ;
dev_priv - > display . modeset_calc_cdclk = bxt_modeset_calc_cdclk ;
dev_priv - > display . calc_voltage_level = tgl_calc_voltage_level ;
dev_priv - > cdclk . table = rkl_cdclk_table ;
2021-03-19 21:42:42 -07:00
} else if ( DISPLAY_VER ( dev_priv ) > = 12 ) {
2020-02-06 16:14:17 -08:00
dev_priv - > display . set_cdclk = bxt_set_cdclk ;
2020-05-20 18:00:58 +03:00
dev_priv - > display . bw_calc_min_cdclk = skl_bw_calc_min_cdclk ;
2020-02-06 16:14:17 -08:00
dev_priv - > display . modeset_calc_cdclk = bxt_modeset_calc_cdclk ;
dev_priv - > display . calc_voltage_level = tgl_calc_voltage_level ;
dev_priv - > cdclk . table = icl_cdclk_table ;
2020-10-14 00:59:48 +05:30
} else if ( IS_JSL_EHL ( dev_priv ) ) {
2019-09-10 08:42:50 -07:00
dev_priv - > display . set_cdclk = bxt_set_cdclk ;
2020-05-20 18:00:58 +03:00
dev_priv - > display . bw_calc_min_cdclk = skl_bw_calc_min_cdclk ;
2019-09-11 16:31:29 +03:00
dev_priv - > display . modeset_calc_cdclk = bxt_modeset_calc_cdclk ;
2019-09-10 08:42:50 -07:00
dev_priv - > display . calc_voltage_level = ehl_calc_voltage_level ;
dev_priv - > cdclk . table = icl_cdclk_table ;
2021-03-19 21:42:42 -07:00
} else if ( DISPLAY_VER ( dev_priv ) > = 11 ) {
2019-09-10 08:42:47 -07:00
dev_priv - > display . set_cdclk = bxt_set_cdclk ;
2020-05-20 18:00:58 +03:00
dev_priv - > display . bw_calc_min_cdclk = skl_bw_calc_min_cdclk ;
2019-09-11 16:31:29 +03:00
dev_priv - > display . modeset_calc_cdclk = bxt_modeset_calc_cdclk ;
2019-09-10 08:42:50 -07:00
dev_priv - > display . calc_voltage_level = icl_calc_voltage_level ;
2019-09-10 09:15:06 -07:00
dev_priv - > cdclk . table = icl_cdclk_table ;
2019-03-01 09:27:03 -08:00
} else if ( IS_CANNONLAKE ( dev_priv ) ) {
2020-05-20 18:00:58 +03:00
dev_priv - > display . bw_calc_min_cdclk = skl_bw_calc_min_cdclk ;
2019-09-10 08:42:47 -07:00
dev_priv - > display . set_cdclk = bxt_set_cdclk ;
2019-09-11 16:31:29 +03:00
dev_priv - > display . modeset_calc_cdclk = bxt_modeset_calc_cdclk ;
2019-09-10 08:42:50 -07:00
dev_priv - > display . calc_voltage_level = cnl_calc_voltage_level ;
2019-09-10 09:15:06 -07:00
dev_priv - > cdclk . table = cnl_cdclk_table ;
2021-04-07 13:39:45 -07:00
} else if ( IS_GEMINILAKE ( dev_priv ) | | IS_BROXTON ( dev_priv ) ) {
2020-05-20 18:00:58 +03:00
dev_priv - > display . bw_calc_min_cdclk = skl_bw_calc_min_cdclk ;
2017-01-26 21:52:01 +02:00
dev_priv - > display . set_cdclk = bxt_set_cdclk ;
2019-05-17 22:31:20 +03:00
dev_priv - > display . modeset_calc_cdclk = bxt_modeset_calc_cdclk ;
2019-09-10 08:42:50 -07:00
dev_priv - > display . calc_voltage_level = bxt_calc_voltage_level ;
2019-09-11 08:47:27 +01:00
if ( IS_GEMINILAKE ( dev_priv ) )
dev_priv - > cdclk . table = glk_cdclk_table ;
else
dev_priv - > cdclk . table = bxt_cdclk_table ;
drm/i915/display: rename display version macros
While converting the rest of the driver to use GRAPHICS_VER() and
MEDIA_VER(), following what was done for display, some discussions went
back on what we did for display:
1) Why is the == comparison special that deserves a separate
macro instead of just getting the version and comparing directly
like is done for >, >=, <=?
2) IS_DISPLAY_RANGE() is weird in that it omits the "_VER" for
brevity. If we remove the current users of IS_DISPLAY_VER(), we
could actually repurpose it for a range check
With (1) there could be an advantage if we used gen_mask since multiple
conditionals be combined by the compiler in a single and instruction and
check the result. However a) INTEL_GEN() doesn't use the mask since it
would make the code bigger everywhere else and b) in the cases it made
sense, it also made sense to convert to the _RANGE() variant.
So here we repurpose IS_DISPLAY_VER() to work with a [ from, to ] range
like was the IS_DISPLAY_RANGE() and convert the current IS_DISPLAY_VER()
users to use == and != operators. Aside from the definition changes,
this was done by the following semantic patch:
@@ expression dev_priv, E1; @@
- !IS_DISPLAY_VER(dev_priv, E1)
+ DISPLAY_VER(dev_priv) != E1
@@ expression dev_priv, E1; @@
- IS_DISPLAY_VER(dev_priv, E1)
+ DISPLAY_VER(dev_priv) == E1
@@ expression dev_priv, from, until; @@
- IS_DISPLAY_RANGE(dev_priv, from, until)
+ IS_DISPLAY_VER(dev_priv, from, until)
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
[Jani: Minor conflict resolve while applying.]
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20210413051002.92589-4-lucas.demarchi@intel.com
2021-04-12 22:09:53 -07:00
} else if ( DISPLAY_VER ( dev_priv ) = = 9 ) {
2020-05-20 18:00:58 +03:00
dev_priv - > display . bw_calc_min_cdclk = skl_bw_calc_min_cdclk ;
2017-01-26 21:52:01 +02:00
dev_priv - > display . set_cdclk = skl_set_cdclk ;
2019-05-17 22:31:20 +03:00
dev_priv - > display . modeset_calc_cdclk = skl_modeset_calc_cdclk ;
2019-03-01 09:27:03 -08:00
} else if ( IS_BROADWELL ( dev_priv ) ) {
2020-05-20 18:00:58 +03:00
dev_priv - > display . bw_calc_min_cdclk = intel_bw_calc_min_cdclk ;
2019-03-01 09:27:03 -08:00
dev_priv - > display . set_cdclk = bdw_set_cdclk ;
2019-05-17 22:31:20 +03:00
dev_priv - > display . modeset_calc_cdclk = bdw_modeset_calc_cdclk ;
2019-03-01 09:27:03 -08:00
} else if ( IS_CHERRYVIEW ( dev_priv ) ) {
2020-05-20 18:00:58 +03:00
dev_priv - > display . bw_calc_min_cdclk = intel_bw_calc_min_cdclk ;
2019-03-01 09:27:03 -08:00
dev_priv - > display . set_cdclk = chv_set_cdclk ;
2019-05-17 22:31:20 +03:00
dev_priv - > display . modeset_calc_cdclk = vlv_modeset_calc_cdclk ;
2019-03-01 09:27:03 -08:00
} else if ( IS_VALLEYVIEW ( dev_priv ) ) {
2020-05-20 18:00:58 +03:00
dev_priv - > display . bw_calc_min_cdclk = intel_bw_calc_min_cdclk ;
2019-03-01 09:27:03 -08:00
dev_priv - > display . set_cdclk = vlv_set_cdclk ;
2019-05-17 22:31:20 +03:00
dev_priv - > display . modeset_calc_cdclk = vlv_modeset_calc_cdclk ;
2019-07-08 15:53:16 +03:00
} else {
2020-05-20 18:00:58 +03:00
dev_priv - > display . bw_calc_min_cdclk = intel_bw_calc_min_cdclk ;
2019-07-08 15:53:16 +03:00
dev_priv - > display . modeset_calc_cdclk = fixed_modeset_calc_cdclk ;
2017-02-07 20:33:05 +02:00
}
2021-04-07 13:39:45 -07:00
if ( DISPLAY_VER ( dev_priv ) > = 10 | | IS_BROXTON ( dev_priv ) )
2017-02-07 20:33:05 +02:00
dev_priv - > display . get_cdclk = bxt_get_cdclk ;
drm/i915/display: rename display version macros
While converting the rest of the driver to use GRAPHICS_VER() and
MEDIA_VER(), following what was done for display, some discussions went
back on what we did for display:
1) Why is the == comparison special that deserves a separate
macro instead of just getting the version and comparing directly
like is done for >, >=, <=?
2) IS_DISPLAY_RANGE() is weird in that it omits the "_VER" for
brevity. If we remove the current users of IS_DISPLAY_VER(), we
could actually repurpose it for a range check
With (1) there could be an advantage if we used gen_mask since multiple
conditionals be combined by the compiler in a single and instruction and
check the result. However a) INTEL_GEN() doesn't use the mask since it
would make the code bigger everywhere else and b) in the cases it made
sense, it also made sense to convert to the _RANGE() variant.
So here we repurpose IS_DISPLAY_VER() to work with a [ from, to ] range
like was the IS_DISPLAY_RANGE() and convert the current IS_DISPLAY_VER()
users to use == and != operators. Aside from the definition changes,
this was done by the following semantic patch:
@@ expression dev_priv, E1; @@
- !IS_DISPLAY_VER(dev_priv, E1)
+ DISPLAY_VER(dev_priv) != E1
@@ expression dev_priv, E1; @@
- IS_DISPLAY_VER(dev_priv, E1)
+ DISPLAY_VER(dev_priv) == E1
@@ expression dev_priv, from, until; @@
- IS_DISPLAY_RANGE(dev_priv, from, until)
+ IS_DISPLAY_VER(dev_priv, from, until)
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
[Jani: Minor conflict resolve while applying.]
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20210413051002.92589-4-lucas.demarchi@intel.com
2021-04-12 22:09:53 -07:00
else if ( DISPLAY_VER ( dev_priv ) = = 9 )
2019-03-01 09:27:03 -08:00
dev_priv - > display . get_cdclk = skl_get_cdclk ;
2017-02-07 20:33:05 +02:00
else if ( IS_BROADWELL ( dev_priv ) )
dev_priv - > display . get_cdclk = bdw_get_cdclk ;
else if ( IS_HASWELL ( dev_priv ) )
dev_priv - > display . get_cdclk = hsw_get_cdclk ;
else if ( IS_VALLEYVIEW ( dev_priv ) | | IS_CHERRYVIEW ( dev_priv ) )
dev_priv - > display . get_cdclk = vlv_get_cdclk ;
2021-03-19 21:42:40 -07:00
else if ( IS_SANDYBRIDGE ( dev_priv ) | | IS_IVYBRIDGE ( dev_priv ) )
2017-02-07 20:33:05 +02:00
dev_priv - > display . get_cdclk = fixed_400mhz_get_cdclk ;
2021-03-19 21:42:40 -07:00
else if ( IS_IRONLAKE ( dev_priv ) )
2017-02-07 20:33:05 +02:00
dev_priv - > display . get_cdclk = fixed_450mhz_get_cdclk ;
else if ( IS_GM45 ( dev_priv ) )
dev_priv - > display . get_cdclk = gm45_get_cdclk ;
2017-02-20 17:00:41 -03:00
else if ( IS_G45 ( dev_priv ) )
2017-02-07 20:33:05 +02:00
dev_priv - > display . get_cdclk = g33_get_cdclk ;
else if ( IS_I965GM ( dev_priv ) )
dev_priv - > display . get_cdclk = i965gm_get_cdclk ;
else if ( IS_I965G ( dev_priv ) )
dev_priv - > display . get_cdclk = fixed_400mhz_get_cdclk ;
else if ( IS_PINEVIEW ( dev_priv ) )
dev_priv - > display . get_cdclk = pnv_get_cdclk ;
else if ( IS_G33 ( dev_priv ) )
dev_priv - > display . get_cdclk = g33_get_cdclk ;
else if ( IS_I945GM ( dev_priv ) )
dev_priv - > display . get_cdclk = i945gm_get_cdclk ;
else if ( IS_I945G ( dev_priv ) )
dev_priv - > display . get_cdclk = fixed_400mhz_get_cdclk ;
else if ( IS_I915GM ( dev_priv ) )
dev_priv - > display . get_cdclk = i915gm_get_cdclk ;
else if ( IS_I915G ( dev_priv ) )
dev_priv - > display . get_cdclk = fixed_333mhz_get_cdclk ;
else if ( IS_I865G ( dev_priv ) )
dev_priv - > display . get_cdclk = fixed_266mhz_get_cdclk ;
else if ( IS_I85X ( dev_priv ) )
dev_priv - > display . get_cdclk = i85x_get_cdclk ;
else if ( IS_I845G ( dev_priv ) )
dev_priv - > display . get_cdclk = fixed_200mhz_get_cdclk ;
2020-07-14 18:26:25 +03:00
else if ( IS_I830 ( dev_priv ) )
dev_priv - > display . get_cdclk = fixed_133mhz_get_cdclk ;
if ( drm_WARN ( & dev_priv - > drm , ! dev_priv - > display . get_cdclk ,
" Unknown platform. Assuming 133 MHz CDCLK \n " ) )
2017-02-07 20:33:05 +02:00
dev_priv - > display . get_cdclk = fixed_133mhz_get_cdclk ;
}