[Intel-gfx] [PATCH] drm/i915/dg2: Add support for new DG2-G12 revid 0x1

2023-08-29 Thread Swati Sharma
The bspec has been updated with a new revision 0x1 that
translates to A1 GT stepping and C0 display stepping.

Bspec: 44477

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/intel_step.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/i915/intel_step.c 
b/drivers/gpu/drm/i915/intel_step.c
index c02a6f156a00..ee4e5a2c0220 100644
--- a/drivers/gpu/drm/i915/intel_step.c
+++ b/drivers/gpu/drm/i915/intel_step.c
@@ -124,6 +124,7 @@ static const struct intel_step_info 
dg2_g11_revid_step_tbl[] = {
 
 static const struct intel_step_info dg2_g12_revid_step_tbl[] = {
[0x0] = { COMMON_GT_MEDIA_STEP(A0), .display_step = STEP_C0 },
+   [0x1] = { COMMON_GT_MEDIA_STEP(A1), .display_step = STEP_C0 },
 };
 
 static const struct intel_step_info adls_rpls_revids[] = {
-- 
2.25.1



[Intel-gfx] [PATCH] [topic/core-for-CI] PCI/ASPM: pci_enable_link_state: Add argument to acquire bus lock

2023-03-30 Thread Swati Sharma
From: "David E. Box" 

The VMD driver calls pci_enabled_link_state as a callback from
pci_bus_walk. Both will acquire the pci_bus_sem lock leading to a lockdep
warning. Add an argument to pci_enable_link_state to set whether the lock
should be acquired. In the VMD driver, set the argument to false since the
lock will already be obtained by pci_bus_walk.

Still, review comments needs to be addressed. However, this fix
is helping to unblock CI execution for now.

References: https://gitlab.freedesktop.org/drm/intel/-/issues/8316
Reported-by: Ville Syrjälä 
Fixes: de82f60f9c86 ("PCI/ASPM: Add pci_enable_link_state()")
Link: https://lore.kernel.org/linux-pci/zbjko%2fifuniws...@intel.com/
Signed-off-by: David E. Box 
Signed-off-by: Swati Sharma 
---
 drivers/pci/controller/vmd.c | 2 +-
 drivers/pci/pcie/aspm.c  | 9 ++---
 include/linux/pci.h  | 5 +++--
 3 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c
index 990630ec57c6..45aa35744eae 100644
--- a/drivers/pci/controller/vmd.c
+++ b/drivers/pci/controller/vmd.c
@@ -737,7 +737,7 @@ static int vmd_pm_enable_quirk(struct pci_dev *pdev, void 
*userdata)
if (!(features & VMD_FEAT_BIOS_PM_QUIRK))
return 0;
 
-   pci_enable_link_state(pdev, PCIE_LINK_STATE_ALL);
+   pci_enable_link_state(pdev, PCIE_LINK_STATE_ALL, false);
 
pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_LTR);
if (!pos)
diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c
index 66d7514ca111..5b5a600bb864 100644
--- a/drivers/pci/pcie/aspm.c
+++ b/drivers/pci/pcie/aspm.c
@@ -1147,8 +1147,9 @@ EXPORT_SYMBOL(pci_disable_link_state);
  *
  * @pdev: PCI device
  * @state: Mask of ASPM link states to enable
+ * @sem: Boolean to acquire/release pci_bus_sem
  */
-int pci_enable_link_state(struct pci_dev *pdev, int state)
+int pci_enable_link_state(struct pci_dev *pdev, int state, bool sem)
 {
struct pcie_link_state *link = pcie_aspm_get_link(pdev);
 
@@ -1165,7 +1166,8 @@ int pci_enable_link_state(struct pci_dev *pdev, int state)
return -EPERM;
}
 
-   down_read(&pci_bus_sem);
+   if (sem)
+   down_read(&pci_bus_sem);
mutex_lock(&aspm_lock);
link->aspm_default = 0;
if (state & PCIE_LINK_STATE_L0S)
@@ -1186,7 +1188,8 @@ int pci_enable_link_state(struct pci_dev *pdev, int state)
link->clkpm_default = (state & PCIE_LINK_STATE_CLKPM) ? 1 : 0;
pcie_set_clkpm(link, policy_to_clkpm_state(link));
mutex_unlock(&aspm_lock);
-   up_read(&pci_bus_sem);
+   if (sem)
+   up_read(&pci_bus_sem);
 
return 0;
 }
diff --git a/include/linux/pci.h b/include/linux/pci.h
index b50e5c79f7e3..1fe4557e87b9 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1708,7 +1708,7 @@ extern bool pcie_ports_native;
 #ifdef CONFIG_PCIEASPM
 int pci_disable_link_state(struct pci_dev *pdev, int state);
 int pci_disable_link_state_locked(struct pci_dev *pdev, int state);
-int pci_enable_link_state(struct pci_dev *pdev, int state);
+int pci_enable_link_state(struct pci_dev *pdev, int state, bool sem);
 void pcie_no_aspm(void);
 bool pcie_aspm_support_enabled(void);
 bool pcie_aspm_enabled(struct pci_dev *pdev);
@@ -1717,7 +1717,8 @@ static inline int pci_disable_link_state(struct pci_dev 
*pdev, int state)
 { return 0; }
 static inline int pci_disable_link_state_locked(struct pci_dev *pdev, int 
state)
 { return 0; }
-static inline int pci_enable_link_state(struct pci_dev *pdev, int state)
+static inline int
+pci_enable_link_state(struct pci_dev *pdev, int state, bool sem)
 { return 0; }
 static inline void pcie_no_aspm(void) { }
 static inline bool pcie_aspm_support_enabled(void) { return false; }
-- 
2.25.1



Re: [Intel-gfx] [PATCH] drm/i915/display: Add a debugfs entry for fifo underruns

2023-03-14 Thread Swati Sharma

Thanks Andi and Jani N for the review comments.
Sorry for the delay.
Will send the next rev soon.

On 14-Feb-23 5:55 PM, Jani Nikula wrote:

On Wed, 08 Feb 2023, Andi Shyti  wrote:

Hi Swati,

[...]


+static void intel_fifo_underrun_inc_count(struct intel_crtc *crtc,
+ bool is_cpu_fifo)


I'm not a big fan of the true/false parameters in functions. I
actually hate them because it's never clear from the caller what
the true/false means.

Isn't it clear to just have some wrappers

#define intel_fifo_underrun_inc_cpu_count(...)
#define intel_fifo_underrun_inc_cph_count(...)

or similar?


+{
+#ifdef CONFIG_DEBUG_FS
+   if (is_cpu_fifo)
+   crtc->cpu_fifo_underrun_count++;
+   else
+   crtc->pch_fifo_underrun_count++;
+#endif
+}
+
  static void i9xx_check_fifo_underruns(struct intel_crtc *crtc)
  {
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
@@ -103,6 +114,7 @@ static void i9xx_check_fifo_underruns(struct intel_crtc 
*crtc)
intel_de_write(dev_priv, reg, enable_mask | PIPE_FIFO_UNDERRUN_STATUS);
intel_de_posting_read(dev_priv, reg);
  
+	intel_fifo_underrun_inc_count(crtc, true);

trace_intel_cpu_fifo_underrun(dev_priv, crtc->pipe);
drm_err(&dev_priv->drm, "pipe %c underrun\n", pipe_name(crtc->pipe));
  }
@@ -156,6 +168,7 @@ static void ivb_check_fifo_underruns(struct intel_crtc 
*crtc)
intel_de_write(dev_priv, GEN7_ERR_INT, ERR_INT_FIFO_UNDERRUN(pipe));
intel_de_posting_read(dev_priv, GEN7_ERR_INT);
  
+	intel_fifo_underrun_inc_count(crtc, true);

trace_intel_cpu_fifo_underrun(dev_priv, pipe);
drm_err(&dev_priv->drm, "fifo underrun on pipe %c\n", pipe_name(pipe));
  }
@@ -244,6 +257,7 @@ static void cpt_check_pch_fifo_underruns(struct intel_crtc 
*crtc)
   SERR_INT_TRANS_FIFO_UNDERRUN(pch_transcoder));
intel_de_posting_read(dev_priv, SERR_INT);
  
+	intel_fifo_underrun_inc_count(crtc, false);

trace_intel_pch_fifo_underrun(dev_priv, pch_transcoder);
drm_err(&dev_priv->drm, "pch fifo underrun on pch transcoder %c\n",
pipe_name(pch_transcoder));
@@ -286,6 +300,11 @@ static bool __intel_set_cpu_fifo_underrun_reporting(struct 
drm_device *dev,
  
  	old = !crtc->cpu_fifo_underrun_disabled;

crtc->cpu_fifo_underrun_disabled = !enable;
+#ifdef CONFIG_DEBUG_FS
+   /* don't reset count in fifo underrun irq path */
+   if (!in_irq() && !enable)
+   crtc->cpu_fifo_underrun_count = 0;
+#endif
  
  	if (HAS_GMCH(dev_priv))

i9xx_set_fifo_underrun_reporting(dev, pipe, enable, old);
@@ -365,6 +384,11 @@ bool intel_set_pch_fifo_underrun_reporting(struct 
drm_i915_private *dev_priv,
  
  	old = !crtc->pch_fifo_underrun_disabled;

crtc->pch_fifo_underrun_disabled = !enable;
+#ifdef CONFIG_DEBUG_FS
+   /* don't reset count in fifo underrun irq path */
+   if (!in_irq() && !enable)
+   crtc->pch_fifo_underrun_count = 0;
+#endif


All these ifdefs are a bit ugly. Can we put all these stuff
inside the debugfs.c file that is compiled only if DEBUG_FS is
configured?


The opposite, the debugfs should be added in this file instead. :)

See my reply.

BR,
Jani.






Andi

  
  	if (HAS_PCH_IBX(dev_priv))

ibx_set_fifo_underrun_reporting(&dev_priv->drm,
@@ -434,6 +458,7 @@ void intel_cpu_fifo_underrun_irq_handler(struct 
drm_i915_private *dev_priv,
drm_err(&dev_priv->drm, "CPU pipe %c FIFO underrun\n", 
pipe_name(pipe));
}
  
+	intel_fifo_underrun_inc_count(crtc, true);

intel_fbc_handle_fifo_underrun_irq(dev_priv);
  }




--
~Swati Sharma


Re: [Intel-gfx] [PATCH] drm/i915: Ensure DSC has enough BW and stays within HW limits

2023-03-06 Thread Swati Sharma




On 06-Mar-23 1:34 PM, Stanislav Lisovskiy wrote:

We have currently the issue with some BPPs when using DSC

>> Nitpick: We currently have an issue with some BPPs when using DSC.


According the HW team the reason is that single VDSC engine instance,

>> Nitpick: According "to" the ..


has some BW limitations which have to be accounted, so whenever
we approach around 90% of the CDCLK, second VDSC engine have to be
used. Also that always means using 2 slices, however in our current code
amount of slices is calculated for some reason independently of
whether we need to enable 2nd VDSC engine or not, thus leading to
some logical issues, when according to pixel clock needs we need to enable
2nd VDSC engine, however as we calculated previously that we can use
only single slice, we can't do that and fail.
So we need to fix that, so that amount of VDSC engines enabled should depend
on amount of slices and amount of slices should also depend on BW requirements.
Lastly we didn't have BPP limitation for ADLP/MTL/DG2 implemented which says
that DSC output BPP's can only be chosen within range of 8 to 27(BSpec 49259).
This all applied together allows to fix existing FIFO underruns, which we
have in many DSC tests.

BSpec: 49259
HSDES: 18027167222


Also, please add closes 
https://gitlab.freedesktop.org/drm/intel/-/issues/8231


Signed-off-by: Stanislav Lisovskiy 
---
  drivers/gpu/drm/i915/display/intel_dp.c | 21 +++--
  1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index aee93b0d810e..e3680ae95b83 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -687,6 +687,12 @@ u32 intel_dp_dsc_nearest_valid_bpp(struct drm_i915_private 
*i915, u32 bpp, u32 p
/* From XE_LPD onwards we support from bpc upto uncompressed bpp-1 BPPs 
*/
if (DISPLAY_VER(i915) >= 13) {
bits_per_pixel = min(bits_per_pixel, pipe_bpp - 1);
+
+   /* According to BSpec, 27 is the max DSC output bpp */
+   bits_per_pixel = min(bits_per_pixel, (u32)27);
+
+   /* According to BSpec, 8 is the min DSC output bpp */
+   bits_per_pixel = max(bits_per_pixel, (u32)8);
} else {
/* Find the nearest match in the array of known BPPs from VESA 
*/
for (i = 0; i < ARRAY_SIZE(valid_dsc_bpp) - 1; i++) {
@@ -771,6 +777,9 @@ u8 intel_dp_dsc_get_slice_count(struct intel_dp *intel_dp,
min_slice_count = DIV_ROUND_UP(mode_clock,
   DP_DSC_MAX_ENC_THROUGHPUT_1);
  
+	if (mode_clock >= ((i915->display.cdclk.max_cdclk_freq * 85) / 100))

+   min_slice_count = max(min_slice_count, (u8)2);
+
max_slice_width = drm_dp_dsc_sink_max_slice_width(intel_dp->dsc_dpcd);
if (max_slice_width < DP_DSC_MIN_SLICE_WIDTH_VALUE) {
drm_dbg_kms(&i915->drm,
@@ -1597,16 +1606,8 @@ int intel_dp_dsc_compute_config(struct intel_dp 
*intel_dp,
 * is greater than the maximum Cdclock and if slice count is even
 * then we need to use 2 VDSC instances.
 */
-   if (adjusted_mode->crtc_clock > dev_priv->display.cdclk.max_cdclk_freq 
||
-   pipe_config->bigjoiner_pipes) {
-   if (pipe_config->dsc.slice_count > 1) {
-   pipe_config->dsc.dsc_split = true;
-   } else {
-   drm_dbg_kms(&dev_priv->drm,
-   "Cannot split stream to use 2 VDSC 
instances\n");
-   return -EINVAL;
-   }
-   }
+   if (pipe_config->bigjoiner_pipes || pipe_config->dsc.slice_count > 1)
+   pipe_config->dsc.dsc_split = true;
  
  	ret = intel_dp_dsc_compute_params(&dig_port->base, pipe_config);

if (ret < 0) {


--
~Swati Sharma


Re: [Intel-gfx] [PATCH] drm/i915/audio: Track audio state per-transcoder

2023-02-23 Thread Swati Sharma
ate[I915_MAX_TRANSCODERS];

/* necessary resource sharing with HDMI LPE audio driver. */
struct {
diff --git a/drivers/gpu/drm/i915/display/intel_lpe_audio.c
b/drivers/gpu/drm/i915/display/intel_lpe_audio.c
index 8aaaef4d7856..20c8581f4868 100644
--- a/drivers/gpu/drm/i915/display/intel_lpe_audio.c
+++ b/drivers/gpu/drm/i915/display/intel_lpe_audio.c
@@ -315,7 +315,7 @@ void intel_lpe_audio_teardown(struct drm_i915_private
*dev_priv)
   * intel_lpe_audio_notify() - notify lpe audio event
   * audio driver and i915
   * @dev_priv: the i915 drm device private data
- * @pipe: pipe
+ * @cpt_transocer: CPU transcoder
   * @port: port
   * @eld : ELD data
   * @ls_clock: Link symbol clock in kHz
@@ -324,7 +324,7 @@ void intel_lpe_audio_teardown(struct drm_i915_private
*dev_priv)
   * Notify lpe audio driver of eld change.
   */
  void intel_lpe_audio_notify(struct drm_i915_private *dev_priv,
-   enum pipe pipe, enum port port,
+   enum transcoder cpu_transcoder, enum port port,
const void *eld, int ls_clock, bool dp_output)  {
unsigned long irqflags;
@@ -344,7 +344,7 @@ void intel_lpe_audio_notify(struct drm_i915_private
*dev_priv,

if (eld != NULL) {
memcpy(ppdata->eld, eld, HDMI_MAX_ELD_BYTES);
-   ppdata->pipe = pipe;
+   ppdata->pipe = cpu_transcoder;
ppdata->ls_clock = ls_clock;
ppdata->dp_output = dp_output;

diff --git a/drivers/gpu/drm/i915/display/intel_lpe_audio.h
b/drivers/gpu/drm/i915/display/intel_lpe_audio.h
index f848c5038714..0beecac267ae 100644
--- a/drivers/gpu/drm/i915/display/intel_lpe_audio.h
+++ b/drivers/gpu/drm/i915/display/intel_lpe_audio.h
@@ -8,15 +8,15 @@

  #include 

-enum pipe;
  enum port;
+enum transcoder;
  struct drm_i915_private;

  int  intel_lpe_audio_init(struct drm_i915_private *dev_priv);  void
intel_lpe_audio_teardown(struct drm_i915_private *dev_priv);  void
intel_lpe_audio_irq_handler(struct drm_i915_private *dev_priv);  void
intel_lpe_audio_notify(struct drm_i915_private *dev_priv,
-   enum pipe pipe, enum port port,
+   enum transcoder cpu_transcoder, enum port port,
const void *eld, int ls_clock, bool dp_output);

  #endif /* __INTEL_LPE_AUDIO_H__ */
--
2.39.2




--
~Swati Sharma


Re: [Intel-gfx] [v10] drm/i915/dsc: Add debugfs entry to validate DSC output formats

2023-02-14 Thread Swati Sharma

Done. Thanks for the feedback. Next rev floated
https://patchwork.freedesktop.org/patch/522697/?series=113729&rev=3

On 14-Feb-23 4:21 PM, Jani Nikula wrote:

On Tue, 14 Feb 2023, Swati Sharma  wrote:

DSC_Output_Format_Sink_Support entry is added to i915_dsc_fec_support_show
to depict if sink supports DSC output formats (RGB/YCbCr420/YCbCr444).
Also, new debugfs entry is created to enforce output format. This is
required because of our driver policy. For ex. if a mode is supported
in both RGB and YCbCr420 output formats by the sink, our policy is to
try RGB first and fall back to YCbCr420, if mode cannot be shown
using RGB. So, to test other output formats like YCbCr420 or YCbCr444,
we need a debugfs entry (force_dsc_output_format) to force this
output format.

v2: -Func name changed to intel_output_format_name() (Jani N)
 -Return forced o/p format from intel_dp_output_format() (Jani N)

Signed-off-by: Swati Sharma 
---
  .../drm/i915/display/intel_crtc_state_dump.c  |  6 +-
  .../drm/i915/display/intel_crtc_state_dump.h  |  2 +
  .../drm/i915/display/intel_display_debugfs.c  | 77 +++
  .../drm/i915/display/intel_display_types.h|  1 +
  drivers/gpu/drm/i915/display/intel_dp.c   |  4 +
  5 files changed, 87 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c 
b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
index 2422d6ef5777..2408ba88b0b6 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
+++ b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
@@ -115,13 +115,13 @@ static void snprintf_output_types(char *buf, size_t len,
WARN_ON_ONCE(output_types != 0);
  }
  
-static const char * const output_format_str[] = {

+const char * const output_format_str[] = {


This still must remain static.


[INTEL_OUTPUT_FORMAT_RGB] = "RGB",
[INTEL_OUTPUT_FORMAT_YCBCR420] = "YCBCR4:2:0",
[INTEL_OUTPUT_FORMAT_YCBCR444] = "YCBCR4:4:4",
  };
  
-static const char *output_formats(enum intel_output_format format)

+const char *intel_output_format_name(enum intel_output_format format)
  {
if (format >= ARRAY_SIZE(output_format_str))
return "invalid";
@@ -179,7 +179,7 @@ void intel_crtc_state_dump(const struct intel_crtc_state 
*pipe_config,
"active: %s, output_types: %s (0x%x), output format: %s\n",
str_yes_no(pipe_config->hw.active),
buf, pipe_config->output_types,
-   output_formats(pipe_config->output_format));
+   intel_output_format_name(pipe_config->output_format));
  
  	drm_dbg_kms(&i915->drm,

"cpu_transcoder: %s, pipe bpp: %i, dithering: %i\n",
diff --git a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.h 
b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.h
index 9399c35b7e5e..780f3f1190d7 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.h
+++ b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.h
@@ -8,9 +8,11 @@
  
  struct intel_crtc_state;

  struct intel_atomic_state;
+enum intel_output_format;
  
  void intel_crtc_state_dump(const struct intel_crtc_state *crtc_state,

   struct intel_atomic_state *state,
   const char *context);
+const char *intel_output_format_name(enum intel_output_format format);
  
  #endif /* __INTEL_CRTC_STATE_H__ */

diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c 
b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
index 9e2fb8626c96..e4b04c690e4f 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -12,6 +12,7 @@
  #include "i915_irq.h"
  #include "i915_reg.h"
  #include "intel_de.h"
+#include "intel_crtc_state_dump.h"
  #include "intel_display_debugfs.h"
  #include "intel_display_power.h"
  #include "intel_display_power_well.h"
@@ -1770,6 +1771,13 @@ static int i915_dsc_fec_support_show(struct seq_file *m, 
void *data)
   str_yes_no(crtc_state->dsc.compression_enable));
seq_printf(m, "DSC_Sink_Support: %s\n",
   
str_yes_no(drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd)));
+   seq_printf(m, "DSC_Output_Format_Sink_Support: RGB: %s YCBCR420: %s 
YCBCR444: %s\n",
+  
str_yes_no(drm_dp_dsc_sink_supports_format(intel_dp->dsc_dpcd,
+ 
DP_DSC_RGB)),
+  
str_yes_no(drm_dp_dsc_sink_supports_format(intel_dp->dsc_dpcd,
+ 
DP_DSC_YCbCr420_Native)),
+  
str_yes_no(drm_dp_dsc_sink_supports_format(intel_dp->dsc

[Intel-gfx] [v11] drm/i915/dsc: Add debugfs entry to validate DSC output formats

2023-02-14 Thread Swati Sharma
DSC_Output_Format_Sink_Support entry is added to i915_dsc_fec_support_show
to depict if sink supports DSC output formats (RGB/YCbCr420/YCbCr444).
Also, new debugfs entry is created to enforce output format. This is
required because of our driver policy. For ex. if a mode is supported
in both RGB and YCbCr420 output formats by the sink, our policy is to
try RGB first and fall back to YCbCr420, if mode cannot be shown
using RGB. So, to test other output formats like YCbCr420 or YCbCr444,
we need a debugfs entry (force_dsc_output_format) to force this
output format.

v2: -Func name changed to intel_output_format_name() (Jani N)
-Return forced o/p format from intel_dp_output_format() (Jani N)
v3: -output_format_str[] to remain static (Jani N)

Signed-off-by: Swati Sharma 
---
 .../drm/i915/display/intel_crtc_state_dump.c  |  4 +-
 .../drm/i915/display/intel_crtc_state_dump.h  |  2 +
 .../drm/i915/display/intel_display_debugfs.c  | 77 +++
 .../drm/i915/display/intel_display_types.h|  1 +
 drivers/gpu/drm/i915/display/intel_dp.c   |  4 +
 5 files changed, 86 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c 
b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
index 2422d6ef5777..45655efc9468 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
+++ b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
@@ -121,7 +121,7 @@ static const char * const output_format_str[] = {
[INTEL_OUTPUT_FORMAT_YCBCR444] = "YCBCR4:4:4",
 };
 
-static const char *output_formats(enum intel_output_format format)
+const char *intel_output_format_name(enum intel_output_format format)
 {
if (format >= ARRAY_SIZE(output_format_str))
return "invalid";
@@ -179,7 +179,7 @@ void intel_crtc_state_dump(const struct intel_crtc_state 
*pipe_config,
"active: %s, output_types: %s (0x%x), output format: %s\n",
str_yes_no(pipe_config->hw.active),
buf, pipe_config->output_types,
-   output_formats(pipe_config->output_format));
+   intel_output_format_name(pipe_config->output_format));
 
drm_dbg_kms(&i915->drm,
"cpu_transcoder: %s, pipe bpp: %i, dithering: %i\n",
diff --git a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.h 
b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.h
index 9399c35b7e5e..780f3f1190d7 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.h
+++ b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.h
@@ -8,9 +8,11 @@
 
 struct intel_crtc_state;
 struct intel_atomic_state;
+enum intel_output_format;
 
 void intel_crtc_state_dump(const struct intel_crtc_state *crtc_state,
   struct intel_atomic_state *state,
   const char *context);
+const char *intel_output_format_name(enum intel_output_format format);
 
 #endif /* __INTEL_CRTC_STATE_H__ */
diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c 
b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
index 9e2fb8626c96..e4b04c690e4f 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -12,6 +12,7 @@
 #include "i915_irq.h"
 #include "i915_reg.h"
 #include "intel_de.h"
+#include "intel_crtc_state_dump.h"
 #include "intel_display_debugfs.h"
 #include "intel_display_power.h"
 #include "intel_display_power_well.h"
@@ -1770,6 +1771,13 @@ static int i915_dsc_fec_support_show(struct seq_file *m, 
void *data)
   str_yes_no(crtc_state->dsc.compression_enable));
seq_printf(m, "DSC_Sink_Support: %s\n",
   
str_yes_no(drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd)));
+   seq_printf(m, "DSC_Output_Format_Sink_Support: RGB: %s 
YCBCR420: %s YCBCR444: %s\n",
+  
str_yes_no(drm_dp_dsc_sink_supports_format(intel_dp->dsc_dpcd,
+ 
DP_DSC_RGB)),
+  
str_yes_no(drm_dp_dsc_sink_supports_format(intel_dp->dsc_dpcd,
+ 
DP_DSC_YCbCr420_Native)),
+  
str_yes_no(drm_dp_dsc_sink_supports_format(intel_dp->dsc_dpcd,
+ 
DP_DSC_YCbCr444)));
seq_printf(m, "Force_DSC_Enable: %s\n",
   str_yes_no(intel_dp->force_dsc_en));
if (!intel_dp_is_edp(intel_dp))
@@ -1895,6 +1903,72 @@ static const struct file_operations i915_dsc_bpc_fops = {
.write = i915_dsc_bpc_write
 };
 
+static int i915_dsc_output_format_show(struct seq_file *m, void *data)

[Intel-gfx] [v10] drm/i915/dsc: Add debugfs entry to validate DSC output formats

2023-02-14 Thread Swati Sharma
DSC_Output_Format_Sink_Support entry is added to i915_dsc_fec_support_show
to depict if sink supports DSC output formats (RGB/YCbCr420/YCbCr444).
Also, new debugfs entry is created to enforce output format. This is
required because of our driver policy. For ex. if a mode is supported
in both RGB and YCbCr420 output formats by the sink, our policy is to
try RGB first and fall back to YCbCr420, if mode cannot be shown
using RGB. So, to test other output formats like YCbCr420 or YCbCr444,
we need a debugfs entry (force_dsc_output_format) to force this
output format.

v2: -Func name changed to intel_output_format_name() (Jani N)
-Return forced o/p format from intel_dp_output_format() (Jani N)

Signed-off-by: Swati Sharma 
---
 .../drm/i915/display/intel_crtc_state_dump.c  |  6 +-
 .../drm/i915/display/intel_crtc_state_dump.h  |  2 +
 .../drm/i915/display/intel_display_debugfs.c  | 77 +++
 .../drm/i915/display/intel_display_types.h|  1 +
 drivers/gpu/drm/i915/display/intel_dp.c   |  4 +
 5 files changed, 87 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c 
b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
index 2422d6ef5777..2408ba88b0b6 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
+++ b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
@@ -115,13 +115,13 @@ static void snprintf_output_types(char *buf, size_t len,
WARN_ON_ONCE(output_types != 0);
 }
 
-static const char * const output_format_str[] = {
+const char * const output_format_str[] = {
[INTEL_OUTPUT_FORMAT_RGB] = "RGB",
[INTEL_OUTPUT_FORMAT_YCBCR420] = "YCBCR4:2:0",
[INTEL_OUTPUT_FORMAT_YCBCR444] = "YCBCR4:4:4",
 };
 
-static const char *output_formats(enum intel_output_format format)
+const char *intel_output_format_name(enum intel_output_format format)
 {
if (format >= ARRAY_SIZE(output_format_str))
return "invalid";
@@ -179,7 +179,7 @@ void intel_crtc_state_dump(const struct intel_crtc_state 
*pipe_config,
"active: %s, output_types: %s (0x%x), output format: %s\n",
str_yes_no(pipe_config->hw.active),
buf, pipe_config->output_types,
-   output_formats(pipe_config->output_format));
+   intel_output_format_name(pipe_config->output_format));
 
drm_dbg_kms(&i915->drm,
"cpu_transcoder: %s, pipe bpp: %i, dithering: %i\n",
diff --git a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.h 
b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.h
index 9399c35b7e5e..780f3f1190d7 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.h
+++ b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.h
@@ -8,9 +8,11 @@
 
 struct intel_crtc_state;
 struct intel_atomic_state;
+enum intel_output_format;
 
 void intel_crtc_state_dump(const struct intel_crtc_state *crtc_state,
   struct intel_atomic_state *state,
   const char *context);
+const char *intel_output_format_name(enum intel_output_format format);
 
 #endif /* __INTEL_CRTC_STATE_H__ */
diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c 
b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
index 9e2fb8626c96..e4b04c690e4f 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -12,6 +12,7 @@
 #include "i915_irq.h"
 #include "i915_reg.h"
 #include "intel_de.h"
+#include "intel_crtc_state_dump.h"
 #include "intel_display_debugfs.h"
 #include "intel_display_power.h"
 #include "intel_display_power_well.h"
@@ -1770,6 +1771,13 @@ static int i915_dsc_fec_support_show(struct seq_file *m, 
void *data)
   str_yes_no(crtc_state->dsc.compression_enable));
seq_printf(m, "DSC_Sink_Support: %s\n",
   
str_yes_no(drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd)));
+   seq_printf(m, "DSC_Output_Format_Sink_Support: RGB: %s 
YCBCR420: %s YCBCR444: %s\n",
+  
str_yes_no(drm_dp_dsc_sink_supports_format(intel_dp->dsc_dpcd,
+ 
DP_DSC_RGB)),
+  
str_yes_no(drm_dp_dsc_sink_supports_format(intel_dp->dsc_dpcd,
+ 
DP_DSC_YCbCr420_Native)),
+  
str_yes_no(drm_dp_dsc_sink_supports_format(intel_dp->dsc_dpcd,
+ 
DP_DSC_YCbCr444)));
seq_printf(m, "Force_DSC_Enable: %s\n",
   str_yes_no(intel_dp->force_dsc_en));
if (!intel_dp_is_ed

Re: [Intel-gfx] [PATCH v9 7/7] drm/i915/dsc: Add debugfs entry to validate DSC output formats

2023-02-08 Thread Swati Sharma

Hi Jani,

Thanks for the reviews. Please find my replies inline.

On 07-Feb-23 2:05 PM, Jani Nikula wrote:

On Tue, 07 Feb 2023, Suraj Kandpal  wrote:

From: Swati Sharma 

DSC_Output_Format_Sink_Support entry is added to i915_dsc_fec_support_show
to depict if sink supports DSC output formats (RGB/YCbCr420/YCbCr444).
Also, new debugfs entry is created to enforce output format. This is
required because of our driver policy. For ex. if a mode is supported
in both RGB and YCbCr420 output formats by the sink, our policy is to
try RGB first and fall back to YCbCr420, if mode cannot be shown
using RGB. So, to test other output formats like YCbCr420 or YCbCr444,
we need a debugfs entry (force_dsc_output_format) to force this
output format.

Signed-off-by: Swati Sharma 
---
  .../drm/i915/display/intel_crtc_state_dump.c  |  4 +-
  .../drm/i915/display/intel_crtc_state_dump.h  |  2 +
  .../drm/i915/display/intel_display_debugfs.c  | 77 +++
  .../drm/i915/display/intel_display_types.h|  1 +
  drivers/gpu/drm/i915/display/intel_dp.c   | 11 +++
  5 files changed, 93 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c 
b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
index 2422d6ef5777..9913f22e0f79 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
+++ b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
@@ -115,13 +115,13 @@ static void snprintf_output_types(char *buf, size_t len,
WARN_ON_ONCE(output_types != 0);
  }
  
-static const char * const output_format_str[] = {

+const char * const output_format_str[] = {


Why?


[INTEL_OUTPUT_FORMAT_RGB] = "RGB",
[INTEL_OUTPUT_FORMAT_YCBCR420] = "YCBCR4:2:0",
[INTEL_OUTPUT_FORMAT_YCBCR444] = "YCBCR4:4:4",
  };
  
-static const char *output_formats(enum intel_output_format format)

+const char *output_formats(enum intel_output_format format)


output_formats is too generic a name to be non-static.


Is intel_output_formats name okay?




  {
if (format >= ARRAY_SIZE(output_format_str))
return "invalid";
diff --git a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.h 
b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.h
index 9399c35b7e5e..daf0a7cc0702 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.h
+++ b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.h
@@ -8,9 +8,11 @@
  
  struct intel_crtc_state;

  struct intel_atomic_state;
+enum intel_output_format;
  
  void intel_crtc_state_dump(const struct intel_crtc_state *crtc_state,

   struct intel_atomic_state *state,
   const char *context);
+const char *output_formats(enum intel_output_format format);


And maybe the place for the function is not here at all if it's needed
in multiple places.


Can I create an inline static function in intel_display_types.h instead?


  
  #endif /* __INTEL_CRTC_STATE_H__ */

diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c 
b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
index 9e2fb8626c96..27b7d8dafe66 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -12,6 +12,7 @@
  #include "i915_irq.h"
  #include "i915_reg.h"
  #include "intel_de.h"
+#include "intel_crtc_state_dump.h"
  #include "intel_display_debugfs.h"
  #include "intel_display_power.h"
  #include "intel_display_power_well.h"
@@ -1770,6 +1771,13 @@ static int i915_dsc_fec_support_show(struct seq_file *m, 
void *data)
   str_yes_no(crtc_state->dsc.compression_enable));
seq_printf(m, "DSC_Sink_Support: %s\n",
   
str_yes_no(drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd)));
+   seq_printf(m, "DSC_Output_Format_Sink_Support: RGB: %s YCBCR420: %s 
YCBCR444: %s\n",
+  
str_yes_no(drm_dp_dsc_sink_supports_format(intel_dp->dsc_dpcd,
+ 
DP_DSC_RGB)),
+  
str_yes_no(drm_dp_dsc_sink_supports_format(intel_dp->dsc_dpcd,
+ 
DP_DSC_YCbCr420_Native)),
+  
str_yes_no(drm_dp_dsc_sink_supports_format(intel_dp->dsc_dpcd,
+ 
DP_DSC_YCbCr444)));
seq_printf(m, "Force_DSC_Enable: %s\n",
   str_yes_no(intel_dp->force_dsc_en));
if (!intel_dp_is_edp(intel_dp))
@@ -1895,6 +1903,72 @@ static const struct file_operations i915_dsc_bpc_fops = {
.write = i915_dsc_bpc_write
  };
  
+static int i915_dsc_output_format_show(struct seq_file *m, void *data)

+{
+   str

[Intel-gfx] [PATCH] drm/i915/display: Add a debugfs entry for fifo underruns

2023-02-08 Thread Swati Sharma
From: Mohammed Khajapasha 

Add a debugfs entry i915_fifo_underruns to indicate the count of
fifo underruns for each pipe.

Cc: Stanislav Lisovskiy 
Signed-off-by: Mohammed Khajapasha 
Signed-off-by: Swati Sharma 
---
 .../drm/i915/display/intel_display_debugfs.c  | 28 ++
 .../drm/i915/display/intel_display_types.h|  2 ++
 .../drm/i915/display/intel_fifo_underrun.c| 29 +++
 3 files changed, 59 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c 
b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
index 9e2fb8626c96..d64b4675766c 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -9,6 +9,7 @@
 #include 
 
 #include "i915_debugfs.h"
+#include "intel_crtc.h"
 #include "i915_irq.h"
 #include "i915_reg.h"
 #include "intel_de.h"
@@ -1057,6 +1058,32 @@ static int i915_lpsp_status(struct seq_file *m, void 
*unused)
return 0;
 }
 
+static int i915_fifo_underruns(struct seq_file *m, void *unused)
+{
+   struct drm_i915_private *dev_priv = node_to_i915(m->private);
+   struct intel_crtc *crtc;
+   enum pipe pipe;
+   unsigned long flags;
+   u32 cpu_fifo_underrun_count[I915_MAX_PIPES];
+   u32 pch_fifo_underrun_count[I915_MAX_PIPES];
+
+   spin_lock_irqsave(&dev_priv->irq_lock, flags);
+   for_each_pipe(dev_priv, pipe) {
+   crtc = intel_crtc_for_pipe(dev_priv, pipe);
+   cpu_fifo_underrun_count[pipe] = crtc->cpu_fifo_underrun_count;
+   pch_fifo_underrun_count[pipe] = crtc->pch_fifo_underrun_count;
+   }
+   spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
+
+   seq_printf(m, "\t%-10s \t%10s\n", "cpu fifounderruns", "pch 
fifounderruns");
+   for_each_pipe(dev_priv, pipe)
+   seq_printf(m, "pipe:%c %10u %20u\n", pipe_name(pipe),
+  cpu_fifo_underrun_count[pipe],
+  pch_fifo_underrun_count[pipe]);
+
+   return 0;
+}
+
 static int i915_dp_mst_info(struct seq_file *m, void *unused)
 {
struct drm_i915_private *dev_priv = node_to_i915(m->private);
@@ -1586,6 +1613,7 @@ static const struct drm_info_list 
intel_display_debugfs_list[] = {
{"i915_dp_mst_info", i915_dp_mst_info, 0},
{"i915_ddb_info", i915_ddb_info, 0},
{"i915_lpsp_status", i915_lpsp_status, 0},
+   {"i915_fifo_underruns", i915_fifo_underruns, 0},
 };
 
 static const struct {
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h 
b/drivers/gpu/drm/i915/display/intel_display_types.h
index 9ccae7a46020..b0468ac70059 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1438,6 +1438,8 @@ struct intel_crtc {
 
 #ifdef CONFIG_DEBUG_FS
struct intel_pipe_crc pipe_crc;
+   u32 cpu_fifo_underrun_count;
+   u32 pch_fifo_underrun_count;
 #endif
 };
 
diff --git a/drivers/gpu/drm/i915/display/intel_fifo_underrun.c 
b/drivers/gpu/drm/i915/display/intel_fifo_underrun.c
index d636d21fa9ce..7131dd400ac3 100644
--- a/drivers/gpu/drm/i915/display/intel_fifo_underrun.c
+++ b/drivers/gpu/drm/i915/display/intel_fifo_underrun.c
@@ -88,6 +88,17 @@ static bool cpt_can_enable_serr_int(struct drm_device *dev)
return true;
 }
 
+static void intel_fifo_underrun_inc_count(struct intel_crtc *crtc,
+ bool is_cpu_fifo)
+{
+#ifdef CONFIG_DEBUG_FS
+   if (is_cpu_fifo)
+   crtc->cpu_fifo_underrun_count++;
+   else
+   crtc->pch_fifo_underrun_count++;
+#endif
+}
+
 static void i9xx_check_fifo_underruns(struct intel_crtc *crtc)
 {
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
@@ -103,6 +114,7 @@ static void i9xx_check_fifo_underruns(struct intel_crtc 
*crtc)
intel_de_write(dev_priv, reg, enable_mask | PIPE_FIFO_UNDERRUN_STATUS);
intel_de_posting_read(dev_priv, reg);
 
+   intel_fifo_underrun_inc_count(crtc, true);
trace_intel_cpu_fifo_underrun(dev_priv, crtc->pipe);
drm_err(&dev_priv->drm, "pipe %c underrun\n", pipe_name(crtc->pipe));
 }
@@ -156,6 +168,7 @@ static void ivb_check_fifo_underruns(struct intel_crtc 
*crtc)
intel_de_write(dev_priv, GEN7_ERR_INT, ERR_INT_FIFO_UNDERRUN(pipe));
intel_de_posting_read(dev_priv, GEN7_ERR_INT);
 
+   intel_fifo_underrun_inc_count(crtc, true);
trace_intel_cpu_fifo_underrun(dev_priv, pipe);
drm_err(&dev_priv->drm, "fifo underrun on pipe %c\n", pipe_name(pipe));
 }
@@ -244,6 +257,7 @@ static void cpt_check_pch_fifo_underruns(struct intel_crtc 
*crtc)
   SERR_INT_TRANS_FIFO_UNDERRUN(pch_transcoder));
intel_de_posting_read(dev_pr

[Intel-gfx] [PATCH] drm/i915/display/selftest: Add pcode selftest

2023-02-07 Thread Swati Sharma
From: Mohammed Khajapasha 

Include pcode selftest for display to validate QGV points read.
Failure of this selftest indicates a bad firmware rather than regular
display issue.

Cc: Stanislav Lisovskiy 
Cc: Matt Roper 
Signed-off-by: Mohammed Khajapasha 
Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/Makefile |  3 +-
 drivers/gpu/drm/i915/display/intel_bw.c   |  4 ++
 .../drm/i915/display/selftests/selftest_bw.c  | 54 +++
 .../i915/display/selftests/selftest_display.c | 18 +++
 .../i915/display/selftests/selftest_display.h |  6 +++
 .../drm/i915/selftests/i915_live_selftests.h  |  1 +
 6 files changed, 85 insertions(+), 1 deletion(-)
 create mode 100644 drivers/gpu/drm/i915/display/selftests/selftest_bw.c
 create mode 100644 drivers/gpu/drm/i915/display/selftests/selftest_display.c
 create mode 100644 drivers/gpu/drm/i915/display/selftests/selftest_display.h

diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 918470a04591..aa7d34b3f71c 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -350,7 +350,8 @@ i915-$(CONFIG_DRM_I915_SELFTEST) += \
selftests/igt_mmap.o \
selftests/igt_reset.o \
selftests/igt_spinner.o \
-   selftests/librapl.o
+   selftests/librapl.o \
+   display/selftests/selftest_display.o
 
 # virtual gpu code
 i915-y += i915_vgpu.o
diff --git a/drivers/gpu/drm/i915/display/intel_bw.c 
b/drivers/gpu/drm/i915/display/intel_bw.c
index 202321ffbe2a..b0bfe04f2835 100644
--- a/drivers/gpu/drm/i915/display/intel_bw.c
+++ b/drivers/gpu/drm/i915/display/intel_bw.c
@@ -1211,3 +1211,7 @@ int intel_bw_init(struct drm_i915_private *dev_priv)
 
return 0;
 }
+
+#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
+#include "selftests/selftest_bw.c"
+#endif
diff --git a/drivers/gpu/drm/i915/display/selftests/selftest_bw.c 
b/drivers/gpu/drm/i915/display/selftests/selftest_bw.c
new file mode 100644
index ..69d52201bd9b
--- /dev/null
+++ b/drivers/gpu/drm/i915/display/selftests/selftest_bw.c
@@ -0,0 +1,54 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2020 Intel Corporation
+ */
+
+#include "display/intel_bw.h"
+#include "i915_drv.h"
+#include "i915_selftest.h"
+#include "soc/intel_dram.h"
+#include "selftest_display.h"
+
+/**
+ * intel_pcode_read_qgv_points_read_test - Test QGV point reads from pcode
+ * @arg: i915 device instance
+ *
+ * Return 0 on success and error on fail and when dclk is zero
+ */
+int intel_pcode_read_qgv_points_test(void *arg)
+{
+   struct drm_i915_private *i915 = arg;
+   struct intel_qgv_info qi;
+   struct intel_qgv_point qp;
+   int i, ret;
+   bool fail = false;
+   intel_wakeref_t wakeref;
+
+   if (DISPLAY_VER(i915) < 11) {
+   drm_info(&i915->drm, "QGV doesn't support, skipping\n");
+   return 0;
+   }
+
+   with_intel_runtime_pm(i915->uncore.rpm, wakeref)
+   intel_dram_detect(i915);
+
+   qi.num_points = i915->dram_info.num_qgv_points;
+
+   for (i = 0; i < qi.num_points; i++) {
+   ret = intel_read_qgv_point_info(i915, &qp, i);
+   if (ret) {
+   drm_err(&i915->drm, "Pcode failed to read qgv point 
%d\n", i);
+   fail = true;
+   }
+
+   if (qp.dclk == 0) {
+   drm_err(&i915->drm, "DCLK set to 0 for qgv point %d\n", 
i);
+   fail = true;
+   }
+   }
+
+   if (fail)
+   return -EINVAL;
+
+   return 0;
+}
diff --git a/drivers/gpu/drm/i915/display/selftests/selftest_display.c 
b/drivers/gpu/drm/i915/display/selftests/selftest_display.c
new file mode 100644
index ..1663c69f9ddc
--- /dev/null
+++ b/drivers/gpu/drm/i915/display/selftests/selftest_display.c
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2020 Intel Corporation
+ */
+
+#include "i915_drv.h"
+#include "i915_selftest.h"
+
+#include "selftest_display.h"
+
+int intel_display_live_selftests(struct drm_i915_private *i915)
+{
+   static const struct i915_subtest tests[] = {
+   SUBTEST(intel_pcode_read_qgv_points_test),
+   };
+
+   return i915_subtests(tests, i915);
+}
diff --git a/drivers/gpu/drm/i915/display/selftests/selftest_display.h 
b/drivers/gpu/drm/i915/display/selftests/selftest_display.h
new file mode 100644
index ..c8d80d5945bb
--- /dev/null
+++ b/drivers/gpu/drm/i915/display/selftests/selftest_display.h
@@ -0,0 +1,6 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2020 Intel Corporation
+ */
+
+int intel_pcode_read_qgv_points_test(void *arg);
diff --git a/drivers/gpu/drm/i915/selftests/i915_live_selftests.h 
b/drivers/gpu/drm/i915/selftests/i915_live_selftests.h
index 5aee

Re: [Intel-gfx] [PATCH v6 8/9] drm/i915/dsc: Allow DSC only with YCbCr420 format when forced from debugfs

2023-02-06 Thread Swati Sharma

Hi Jani,

Thanks for the review.
Have floated https://patchwork.freedesktop.org/patch/521301/
addressing your review comments.
Corresponding IGT https://patchwork.freedesktop.org/series/113253/

On 11-Jan-23 7:24 PM, Jani Nikula wrote:

On Wed, 11 Jan 2023, Suraj Kandpal  wrote:

From: Swati Sharma 

If force_dsc_ycbcr420_en is set through debugfs allow DSC iff
output_format is INTEL_OUTPUT_FORMAT_YCBCR420.


Squash this with the previous patch.



Signed-off-by: Swati Sharma 
---
  drivers/gpu/drm/i915/display/intel_dp.c | 4 
  1 file changed, 4 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 2adac42e585d..666ee85dd23a 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1528,6 +1528,10 @@ int intel_dp_dsc_compute_config(struct intel_dp 
*intel_dp,
if (!intel_dp_dsc_supports_format(intel_dp, pipe_config->output_format))
return -EINVAL;
  
+	if (intel_dp->force_dsc_ycbcr420_en &&

+   pipe_config->output_format != INTEL_OUTPUT_FORMAT_YCBCR420)
+   return -EINVAL;


It would be more generally useful, and perhaps even cleaner to
implement, to force the output format, as in *any* output format,
instead of having a specific force_dsc_ycbcr420_en.

BR,
Jani.



+
if (compute_pipe_bpp)
pipe_bpp = intel_dp_dsc_compute_bpp(intel_dp, 
conn_state->max_requested_bpc);
    else




--
~Swati Sharma


[Intel-gfx] [PATCH] drm/i915/dsc: Add debugfs entry to validate DSC output formats

2023-02-03 Thread Swati Sharma
DSC_Output_Format_Sink_Support entry is added to i915_dsc_fec_support_show
to depict if sink supports DSC output formats (RGB/YCbCr420/YCbCr444).
Also, new debugfs entry is created to enforce output format. This is
required because of our driver policy. For ex. if a mode is supported
in both RGB and YCbCr420 output formats by the sink, our policy is to
try RGB first and fall back to YCbCr420, if mode cannot be shown
using RGB. So, to test other output formats like YCbCr420 or YCbCr444,
we need a debugfs entry (force_dsc_output_format) to force this
output format.

Signed-off-by: Swati Sharma 
---
 .../drm/i915/display/intel_crtc_state_dump.c  |  4 +-
 .../drm/i915/display/intel_crtc_state_dump.h  |  2 +
 .../drm/i915/display/intel_display_debugfs.c  | 77 +++
 .../drm/i915/display/intel_display_types.h|  1 +
 drivers/gpu/drm/i915/display/intel_dp.c   | 11 +++
 5 files changed, 93 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c 
b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
index e3273fe8ddac..0fe225c733cf 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
+++ b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
@@ -102,13 +102,13 @@ static void snprintf_output_types(char *buf, size_t len,
WARN_ON_ONCE(output_types != 0);
 }
 
-static const char * const output_format_str[] = {
+const char * const output_format_str[] = {
[INTEL_OUTPUT_FORMAT_RGB] = "RGB",
[INTEL_OUTPUT_FORMAT_YCBCR420] = "YCBCR4:2:0",
[INTEL_OUTPUT_FORMAT_YCBCR444] = "YCBCR4:4:4",
 };
 
-static const char *output_formats(enum intel_output_format format)
+const char *output_formats(enum intel_output_format format)
 {
if (format >= ARRAY_SIZE(output_format_str))
return "invalid";
diff --git a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.h 
b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.h
index 9399c35b7e5e..daf0a7cc0702 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.h
+++ b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.h
@@ -8,9 +8,11 @@
 
 struct intel_crtc_state;
 struct intel_atomic_state;
+enum intel_output_format;
 
 void intel_crtc_state_dump(const struct intel_crtc_state *crtc_state,
   struct intel_atomic_state *state,
   const char *context);
+const char *output_formats(enum intel_output_format format);
 
 #endif /* __INTEL_CRTC_STATE_H__ */
diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c 
b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
index 7bcd90384a46..80d45fbb4c1a 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -12,6 +12,7 @@
 #include "i915_irq.h"
 #include "i915_reg.h"
 #include "intel_de.h"
+#include "intel_crtc_state_dump.h"
 #include "intel_display_debugfs.h"
 #include "intel_display_power.h"
 #include "intel_display_power_well.h"
@@ -1770,6 +1771,13 @@ static int i915_dsc_fec_support_show(struct seq_file *m, 
void *data)
   str_yes_no(crtc_state->dsc.compression_enable));
seq_printf(m, "DSC_Sink_Support: %s\n",
   
str_yes_no(drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd)));
+   seq_printf(m, "DSC_Output_Format_Sink_Support: RGB: %s 
YCBCR420: %s YCBCR444: %s\n",
+  
str_yes_no(drm_dp_dsc_sink_supports_format(intel_dp->dsc_dpcd,
+ 
DP_DSC_RGB)),
+  
str_yes_no(drm_dp_dsc_sink_supports_format(intel_dp->dsc_dpcd,
+ 
DP_DSC_YCbCr420_Native)),
+  
str_yes_no(drm_dp_dsc_sink_supports_format(intel_dp->dsc_dpcd,
+ 
DP_DSC_YCbCr444)));
seq_printf(m, "Force_DSC_Enable: %s\n",
   str_yes_no(intel_dp->force_dsc_en));
if (!intel_dp_is_edp(intel_dp))
@@ -1895,6 +1903,72 @@ static const struct file_operations i915_dsc_bpc_fops = {
.write = i915_dsc_bpc_write
 };
 
+static int i915_dsc_output_format_show(struct seq_file *m, void *data)
+{
+   struct drm_connector *connector = m->private;
+   struct drm_device *dev = connector->dev;
+   struct drm_crtc *crtc;
+   struct intel_crtc_state *crtc_state;
+   struct intel_encoder *encoder = 
intel_attached_encoder(to_intel_connector(connector));
+   int ret;
+
+   if (!encoder)
+   return -ENODEV;
+
+   ret = 
drm_modeset_lock_single_interruptible(&dev->mode_config.connection_mutex);
+   if (ret)
+   return

Re: [Intel-gfx] [PATCH] drm/i915/dsc: Add is_dsc_supported()

2022-11-10 Thread Swati Sharma

Thanks Jani/Manasi for the review comments.
Have addressed those in https://patchwork.freedesktop.org/patch/511033/

On 04-Nov-22 3:58 PM, Jani Nikula wrote:

On Thu, 03 Nov 2022, "Navare, Manasi"  wrote:

On Thu, Nov 03, 2022 at 11:32:22AM +0530, Swati Sharma wrote:

Lets use RUNTIME_INFO->has_dsc since platforms supporting dsc has this
flag enabled.

This is done based on the review comments received on
https://patchwork.freedesktop.org/patch/509393/


I don't think that's necessary. If it were an idea worth crediting, the
usual way is using Suggested-by: tag.



Signed-off-by: Swati Sharma 
---
  drivers/gpu/drm/i915/display/intel_dp.c   | 6 +++---
  drivers/gpu/drm/i915/display/intel_vdsc.c | 7 ++-
  drivers/gpu/drm/i915/display/intel_vdsc.h | 2 ++
  3 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 7400d6b4c587..eb908da80f2b 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1012,7 +1012,7 @@ intel_dp_mode_valid(struct drm_connector *_connector,
 * Output bpp is stored in 6.4 format so right shift by 4 to get the
 * integer value since we support only integer values of bpp.
 */
-   if (DISPLAY_VER(dev_priv) >= 10 &&
+   if (is_dsc_supported(dev_priv) &&
drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd)) {
/*
 * TBD pass the connector BPC,
@@ -2906,7 +2906,7 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp)
intel_dp_set_max_sink_lane_count(intel_dp);
  
  	/* Read the eDP DSC DPCD registers */

-   if (DISPLAY_VER(dev_priv) >= 10)
+   if (is_dsc_supported(dev_priv))
intel_dp_get_dsc_sink_cap(intel_dp);
  
  	/*

@@ -4691,7 +4691,7 @@ intel_dp_detect(struct drm_connector *connector,
}
  
  	/* Read DP Sink DSC Cap DPCD regs for DP v1.4 */

-   if (DISPLAY_VER(dev_priv) >= 11)
+   if (is_dsc_supported(dev_priv))
intel_dp_get_dsc_sink_cap(intel_dp);
  
  	intel_dp_configure_mst(intel_dp);

diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.c 
b/drivers/gpu/drm/i915/display/intel_vdsc.c
index 269f9792390d..e7c1169538da 100644
--- a/drivers/gpu/drm/i915/display/intel_vdsc.c
+++ b/drivers/gpu/drm/i915/display/intel_vdsc.c
@@ -338,13 +338,18 @@ static const struct rc_parameters *get_rc_params(u16 
compressed_bpp,
return &rc_parameters[row_index][column_index];
  }
  
+bool is_dsc_supported(struct drm_i915_private *dev_priv)

+{
+   return RUNTIME_INFO(dev_priv)->has_dsc;
+}
+


All of the wrappers to runtime/device info members are of the form:

#define HAS_DSC(__i915) (RUNTIME_INFO(__i915)->has_dsc)

in i915_drv.h.


  bool intel_dsc_source_support(const struct intel_crtc_state *crtc_state)
  {
const struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
struct drm_i915_private *i915 = to_i915(crtc->base.dev);
enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
  
-	if (!RUNTIME_INFO(i915)->has_dsc)

+   if (!is_dsc_supported(i915))
return false;
  
  	if (DISPLAY_VER(i915) >= 12)


In Runtime info, Gen 12 should have Gen 11 runtime has dsc set, so makes
this check here redundant.


As it is, it's not redundant. It's tied to the transcoder check.

But this could be simplified as:

if (!HAS_DSC(i915))
return false;

if (DISPLAY_VER(i915) == 11 && cpu_transcoder == TRANSCODER_A)
return false;

return true;

It could be condenced even further, but at the const of losing clarity.

BR,
Jani.




Manasi


diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.h 
b/drivers/gpu/drm/i915/display/intel_vdsc.h
index 8763f00fa7e2..049e8b95fdde 100644
--- a/drivers/gpu/drm/i915/display/intel_vdsc.h
+++ b/drivers/gpu/drm/i915/display/intel_vdsc.h
@@ -12,7 +12,9 @@ enum transcoder;
  struct intel_crtc;
  struct intel_crtc_state;
  struct intel_encoder;
+struct drm_i915_private;
  
+bool is_dsc_supported(struct drm_i915_private *dev_priv);

  bool intel_dsc_source_support(const struct intel_crtc_state *crtc_state);
  void intel_uncompressed_joiner_enable(const struct intel_crtc_state 
*crtc_state);
  void intel_dsc_enable(const struct intel_crtc_state *crtc_state);
--
2.25.1





--
~Swati Sharma


[Intel-gfx] [PATCH] drm/i915/dsc: Refactor dsc gen checks

2022-11-10 Thread Swati Sharma
Use HAS_DSC(__i915) wrapper containing runtime info of has_dsc
member. Platforms supporting dsc has this flag enabled; no need of
DISPLAY_VER() check.

Also, simplified intel_dsc_source_support() based on above changes.

Suggested-by: Jani Nikula 
Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_dp.c   |  6 +++---
 drivers/gpu/drm/i915/display/intel_vdsc.c | 11 ---
 drivers/gpu/drm/i915/i915_drv.h   |  1 +
 3 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 7400d6b4c587..f6f9257bd202 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1012,7 +1012,7 @@ intel_dp_mode_valid(struct drm_connector *_connector,
 * Output bpp is stored in 6.4 format so right shift by 4 to get the
 * integer value since we support only integer values of bpp.
 */
-   if (DISPLAY_VER(dev_priv) >= 10 &&
+   if (HAS_DSC(dev_priv) &&
drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd)) {
/*
 * TBD pass the connector BPC,
@@ -2906,7 +2906,7 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp)
intel_dp_set_max_sink_lane_count(intel_dp);
 
/* Read the eDP DSC DPCD registers */
-   if (DISPLAY_VER(dev_priv) >= 10)
+   if (HAS_DSC(dev_priv))
intel_dp_get_dsc_sink_cap(intel_dp);
 
/*
@@ -4691,7 +4691,7 @@ intel_dp_detect(struct drm_connector *connector,
}
 
/* Read DP Sink DSC Cap DPCD regs for DP v1.4 */
-   if (DISPLAY_VER(dev_priv) >= 11)
+   if (HAS_DSC(dev_priv))
intel_dp_get_dsc_sink_cap(intel_dp);
 
intel_dp_configure_mst(intel_dp);
diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.c 
b/drivers/gpu/drm/i915/display/intel_vdsc.c
index 269f9792390d..7b4d300a4dd8 100644
--- a/drivers/gpu/drm/i915/display/intel_vdsc.c
+++ b/drivers/gpu/drm/i915/display/intel_vdsc.c
@@ -344,16 +344,13 @@ bool intel_dsc_source_support(const struct 
intel_crtc_state *crtc_state)
struct drm_i915_private *i915 = to_i915(crtc->base.dev);
enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
 
-   if (!RUNTIME_INFO(i915)->has_dsc)
+   if (!HAS_DSC(i915))
return false;
 
-   if (DISPLAY_VER(i915) >= 12)
-   return true;
-
-   if (DISPLAY_VER(i915) >= 11 && cpu_transcoder != TRANSCODER_A)
-   return true;
+   if (DISPLAY_VER(i915) == 11 && cpu_transcoder == TRANSCODER_A)
+   return false;
 
-   return false;
+   return true;
 }
 
 static bool is_pipe_dsc(struct intel_crtc *crtc, enum transcoder 
cpu_transcoder)
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 05b3300cc4ed..9d1fe5d6a104 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -484,6 +484,7 @@ static inline struct intel_gt *to_gt(struct 
drm_i915_private *i915)
 #define INTEL_REVID(dev_priv)  (to_pci_dev((dev_priv)->drm.dev)->revision)
 
 #define HAS_DSB(dev_priv)  (INTEL_INFO(dev_priv)->display.has_dsb)
+#define HAS_DSC(__i915)(RUNTIME_INFO(__i915)->has_dsc)
 
 #define INTEL_DISPLAY_STEP(__i915) (RUNTIME_INFO(__i915)->step.display_step)
 #define INTEL_GRAPHICS_STEP(__i915) (RUNTIME_INFO(__i915)->step.graphics_step)
-- 
2.25.1



Re: [Intel-gfx] [PATCH] drm/i915/dsc: Source supports DSC from DISPLAY_VER >= 11

2022-11-02 Thread Swati Sharma




On 02-Nov-22 3:02 PM, Jani Nikula wrote:

On Wed, 02 Nov 2022, Swati Sharma  wrote:

Hi Matt,

Yes. Though h/w supports DSC from gen10, DSC is enabled from gen11+ from
driver.
We can see "has_dsc" flag enabled in gen11+.
#define GEN11_FEATURES \
  >---.__runtime.has_dsc = 1, \

Also, in the driver intel_dsc_source_support(), it is
if (DISPLAY_VER(i915) >= 11 && cpu_transcoder != TRANSCODER_A)
  return true;
So, we should align DISPLAY_VER check according to DSC enablement
from driver.


The real fix would be to use intel_dsc_source_support() as the single
point of truth instead of sprinkled all over the place. Especially since
that also takes fusing into account.

BR,
Jani.
intel_dsc_source_support() can't be used directly since it requires 
crtc_state which is not available in intel_dp_mode_valid().

Introduced is_dsc_supported() to get this info from RUNTIME_INFO()
https://patchwork.freedesktop.org/patch/509761/

Please review if this approach is okay.






On 02-Nov-22 2:50 AM, Matt Roper wrote:

On Tue, Nov 01, 2022 at 01:29:27PM +0530, Swati Sharma wrote:

i915 driver supports DSC from DISPLAY_VER >= 11. Fix it.


Bspec 19713 indicates that GLK (i.e., our only display version 10
platform) does support DSC.  Are you saying that there's other GLK
enablement missing in the driver right now that prevents DSC from
working?


Matt



Signed-off-by: Swati Sharma 
---
   drivers/gpu/drm/i915/display/intel_dp.c | 4 ++--
   1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 7400d6b4c587..02e64f0284d8 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1012,7 +1012,7 @@ intel_dp_mode_valid(struct drm_connector *_connector,
 * Output bpp is stored in 6.4 format so right shift by 4 to get the
 * integer value since we support only integer values of bpp.
 */
-   if (DISPLAY_VER(dev_priv) >= 10 &&
+   if (DISPLAY_VER(dev_priv) >= 11 &&
drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd)) {
/*
 * TBD pass the connector BPC,
@@ -2906,7 +2906,7 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp)
intel_dp_set_max_sink_lane_count(intel_dp);
   
   	/* Read the eDP DSC DPCD registers */

-   if (DISPLAY_VER(dev_priv) >= 10)
+   if (DISPLAY_VER(dev_priv) >= 11)
intel_dp_get_dsc_sink_cap(intel_dp);
   
   	/*

--
2.25.1







--
~Swati Sharma


[Intel-gfx] [PATCH] drm/i915/dsc: Add is_dsc_supported()

2022-11-02 Thread Swati Sharma
Lets use RUNTIME_INFO->has_dsc since platforms supporting dsc has this
flag enabled.

This is done based on the review comments received on
https://patchwork.freedesktop.org/patch/509393/

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_dp.c   | 6 +++---
 drivers/gpu/drm/i915/display/intel_vdsc.c | 7 ++-
 drivers/gpu/drm/i915/display/intel_vdsc.h | 2 ++
 3 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 7400d6b4c587..eb908da80f2b 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1012,7 +1012,7 @@ intel_dp_mode_valid(struct drm_connector *_connector,
 * Output bpp is stored in 6.4 format so right shift by 4 to get the
 * integer value since we support only integer values of bpp.
 */
-   if (DISPLAY_VER(dev_priv) >= 10 &&
+   if (is_dsc_supported(dev_priv) &&
drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd)) {
/*
 * TBD pass the connector BPC,
@@ -2906,7 +2906,7 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp)
intel_dp_set_max_sink_lane_count(intel_dp);
 
/* Read the eDP DSC DPCD registers */
-   if (DISPLAY_VER(dev_priv) >= 10)
+   if (is_dsc_supported(dev_priv))
intel_dp_get_dsc_sink_cap(intel_dp);
 
/*
@@ -4691,7 +4691,7 @@ intel_dp_detect(struct drm_connector *connector,
}
 
/* Read DP Sink DSC Cap DPCD regs for DP v1.4 */
-   if (DISPLAY_VER(dev_priv) >= 11)
+   if (is_dsc_supported(dev_priv))
intel_dp_get_dsc_sink_cap(intel_dp);
 
intel_dp_configure_mst(intel_dp);
diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.c 
b/drivers/gpu/drm/i915/display/intel_vdsc.c
index 269f9792390d..e7c1169538da 100644
--- a/drivers/gpu/drm/i915/display/intel_vdsc.c
+++ b/drivers/gpu/drm/i915/display/intel_vdsc.c
@@ -338,13 +338,18 @@ static const struct rc_parameters *get_rc_params(u16 
compressed_bpp,
return &rc_parameters[row_index][column_index];
 }
 
+bool is_dsc_supported(struct drm_i915_private *dev_priv)
+{
+   return RUNTIME_INFO(dev_priv)->has_dsc;
+}
+
 bool intel_dsc_source_support(const struct intel_crtc_state *crtc_state)
 {
const struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
struct drm_i915_private *i915 = to_i915(crtc->base.dev);
enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
 
-   if (!RUNTIME_INFO(i915)->has_dsc)
+   if (!is_dsc_supported(i915))
return false;
 
if (DISPLAY_VER(i915) >= 12)
diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.h 
b/drivers/gpu/drm/i915/display/intel_vdsc.h
index 8763f00fa7e2..049e8b95fdde 100644
--- a/drivers/gpu/drm/i915/display/intel_vdsc.h
+++ b/drivers/gpu/drm/i915/display/intel_vdsc.h
@@ -12,7 +12,9 @@ enum transcoder;
 struct intel_crtc;
 struct intel_crtc_state;
 struct intel_encoder;
+struct drm_i915_private;
 
+bool is_dsc_supported(struct drm_i915_private *dev_priv);
 bool intel_dsc_source_support(const struct intel_crtc_state *crtc_state);
 void intel_uncompressed_joiner_enable(const struct intel_crtc_state 
*crtc_state);
 void intel_dsc_enable(const struct intel_crtc_state *crtc_state);
-- 
2.25.1



Re: [Intel-gfx] [PATCH] drm/i915/dsc: Source supports DSC from DISPLAY_VER >= 11

2022-11-02 Thread Swati Sharma

Hi Matt,

Yes. Though h/w supports DSC from gen10, DSC is enabled from gen11+ from 
driver.

We can see "has_dsc" flag enabled in gen11+.
#define GEN11_FEATURES \
>---.__runtime.has_dsc = 1, \

Also, in the driver intel_dsc_source_support(), it is
if (DISPLAY_VER(i915) >= 11 && cpu_transcoder != TRANSCODER_A)
return true;
So, we should align DISPLAY_VER check according to DSC enablement
from driver.

On 02-Nov-22 2:50 AM, Matt Roper wrote:

On Tue, Nov 01, 2022 at 01:29:27PM +0530, Swati Sharma wrote:

i915 driver supports DSC from DISPLAY_VER >= 11. Fix it.


Bspec 19713 indicates that GLK (i.e., our only display version 10
platform) does support DSC.  Are you saying that there's other GLK
enablement missing in the driver right now that prevents DSC from
working?


Matt



Signed-off-by: Swati Sharma 
---
  drivers/gpu/drm/i915/display/intel_dp.c | 4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 7400d6b4c587..02e64f0284d8 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1012,7 +1012,7 @@ intel_dp_mode_valid(struct drm_connector *_connector,
 * Output bpp is stored in 6.4 format so right shift by 4 to get the
 * integer value since we support only integer values of bpp.
 */
-   if (DISPLAY_VER(dev_priv) >= 10 &&
+   if (DISPLAY_VER(dev_priv) >= 11 &&
drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd)) {
/*
 * TBD pass the connector BPC,
@@ -2906,7 +2906,7 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp)
intel_dp_set_max_sink_lane_count(intel_dp);
  
  	/* Read the eDP DSC DPCD registers */

-   if (DISPLAY_VER(dev_priv) >= 10)
+   if (DISPLAY_VER(dev_priv) >= 11)
intel_dp_get_dsc_sink_cap(intel_dp);
  
  	/*

--
2.25.1





--
~Swati Sharma


[Intel-gfx] [PATCH] drm/i915/dsc: Source supports DSC from DISPLAY_VER >= 11

2022-11-01 Thread Swati Sharma
i915 driver supports DSC from DISPLAY_VER >= 11. Fix it.

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_dp.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 7400d6b4c587..02e64f0284d8 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1012,7 +1012,7 @@ intel_dp_mode_valid(struct drm_connector *_connector,
 * Output bpp is stored in 6.4 format so right shift by 4 to get the
 * integer value since we support only integer values of bpp.
 */
-   if (DISPLAY_VER(dev_priv) >= 10 &&
+   if (DISPLAY_VER(dev_priv) >= 11 &&
drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd)) {
/*
 * TBD pass the connector BPC,
@@ -2906,7 +2906,7 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp)
intel_dp_set_max_sink_lane_count(intel_dp);
 
/* Read the eDP DSC DPCD registers */
-   if (DISPLAY_VER(dev_priv) >= 10)
+   if (DISPLAY_VER(dev_priv) >= 11)
intel_dp_get_dsc_sink_cap(intel_dp);
 
/*
-- 
2.25.1



[Intel-gfx] [PATCH v4 4/8] drm/i915: Enable YCbCr420 for VDSC

2022-10-28 Thread Swati Sharma
From: Suraj Kandpal 

Implementation of VDSC for YCbCr420.

Signed-off-by: Suraj Kandpal 
---
 .../gpu/drm/i915/display/intel_qp_tables.c| 187 --
 .../gpu/drm/i915/display/intel_qp_tables.h|   4 +-
 drivers/gpu/drm/i915/display/intel_vdsc.c |   4 +-
 3 files changed, 180 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_qp_tables.c 
b/drivers/gpu/drm/i915/display/intel_qp_tables.c
index 6f8e4ec5c0fb..6e86c0971d24 100644
--- a/drivers/gpu/drm/i915/display/intel_qp_tables.c
+++ b/drivers/gpu/drm/i915/display/intel_qp_tables.c
@@ -17,6 +17,15 @@
 /* from BPP 6 to 36 in steps of 0.5 */
 #define RC_RANGE_QP444_12BPC_MAX_NUM_BPP   61
 
+/* from BPP 6 to 24 in steps of 0.5 */
+#define RC_RANGE_QP420_8BPC_MAX_NUM_BPP17
+
+/* from BPP 6 to 30 in steps of 0.5 */
+#define RC_RANGE_QP420_10BPC_MAX_NUM_BPP   23
+
+/* from BPP 6 to 36 in steps of 0.5 */
+#define RC_RANGE_QP420_12BPC_MAX_NUM_BPP   29
+
 /*
  * These qp tables are as per the C model
  * and it has the rows pointing to bpps which increment
@@ -283,26 +292,182 @@ static const u8 
rc_range_maxqp444_12bpc[DSC_NUM_BUF_RANGES][RC_RANGE_QP444_12BPC
  11, 11, 10, 10, 10, 10, 10, 9, 9, 8, 8, 8, 8, 8, 7, 7, 6, 6, 6, 6, 5, 
5, 4 }
 };
 
-#define PARAM_TABLE(_minmax, _bpc, _row, _col)  do { \
-   if (bpc == (_bpc)) \
-   return rc_range_##_minmax##qp444_##_bpc##bpc[_row][_col]; \
+static const u8 
rc_range_minqp420_8bpc[DSC_NUM_BUF_RANGES][RC_RANGE_QP420_8BPC_MAX_NUM_BPP] = {
+   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+   { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+   { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+   { 3, 3, 3, 3, 3, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 },
+   { 3, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
+   { 3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
+   { 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 0 },
+   { 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 0 },
+   { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1 },
+   { 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 1, 1 },
+   { 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 3, 2, 2, 1 },
+   { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 3, 3, 2, 1 },
+   { 9, 8, 8, 7, 7, 7, 7, 7, 7, 6, 5, 5, 4, 3, 3, 3, 2 },
+   { 13, 12, 12, 11, 10, 10, 9, 8, 8, 7, 6, 6, 5, 5, 4, 4, 3 }
+};
+
+static const u8 
rc_range_maxqp420_8bpc[DSC_NUM_BUF_RANGES][RC_RANGE_QP420_8BPC_MAX_NUM_BPP] = {
+   { 4, 4, 3, 3, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+   { 4, 4, 4, 4, 4, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0 },
+   { 5, 5, 5, 5, 5, 4, 3, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
+   { 6, 6, 6, 6, 6, 5, 4, 3, 2, 2, 2, 1, 1, 1, 1, 0, 0 },
+   { 7, 7, 7, 7, 7, 5, 4, 3, 2, 2, 2, 2, 2, 1, 1, 1, 0 },
+   { 7, 7, 7, 7, 7, 6, 5, 4, 3, 3, 3, 2, 2, 2, 1, 1, 0 },
+   { 7, 7, 7, 7, 7, 6, 5, 4, 3, 3, 3, 3, 2, 2, 2, 1, 1 },
+   { 8, 8, 8, 8, 8, 7, 6, 5, 4, 4, 4, 3, 3, 2, 2, 2, 1 },
+   { 9, 9, 9, 8, 8, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1 },
+   { 10, 10, 9, 9, 9, 8, 7, 6, 5, 5, 5, 4, 4, 3, 3, 2, 2 },
+   { 10, 10, 10, 9, 9, 8, 8, 7, 6, 6, 5, 5, 4, 4, 3, 2, 2 },
+   { 11, 11, 10, 10, 9, 9, 8, 7, 7, 6, 6, 5, 5, 4, 3, 3, 2 },
+   { 11, 11, 11, 10, 9, 9, 9, 8, 7, 7, 6, 5, 5, 4, 4, 3, 2 },
+   { 13, 12, 12, 11, 10, 10, 9, 8, 8, 7, 6, 6, 5, 4, 4, 4, 3 },
+   { 14, 13, 13, 12, 11, 11, 10, 9, 9, 8, 7, 7, 6, 6, 5, 5, 4 }
+};
+
+static const u8 
rc_range_minqp420_10bpc[DSC_NUM_BUF_RANGES][RC_RANGE_QP420_10BPC_MAX_NUM_BPP] = 
{
+   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+   { 4, 4, 4, 3, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+   { 4, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
+   { 5, 5, 5, 4, 4, 4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0 },
+   { 7, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, 0, 0 },
+   { 7, 7, 7, 7, 7, 6, 5, 5, 5, 5, 5, 4, 3, 3, 2, 2, 1, 1, 1, 1, 1, 0, 0 },
+   { 7, 7, 7, 7, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 3, 2, 2, 2, 2, 1, 1, 1, 0 },
+   { 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 5, 4, 4, 4, 3, 2, 2, 2, 1, 1, 1, 0 },
+   { 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 2, 1, 1 },
+   { 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1 },
+   { 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1 },
+   { 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 7, 6, 6, 5, 4, 4, 3, 3, 2, 1 },
+   { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 7, 7, 6, 5, 4, 4, 3, 3, 2, 1 },
+   { 13, 12, 12, 11, 11, 11, 11, 11, 11, 10, 9, 9, 8, 7, 7, 6, 5, 5, 4, 3, 
3,
+ 2, 2 },
+   { 17, 16, 16, 15, 14, 14, 13, 12, 12, 11, 10, 10, 10, 9, 8, 8, 7, 6, 6, 
5,
+ 5, 4, 4 }
+};
+
+static const u8 
rc_range_maxqp420_10bpc[DSC_NUM_BUF_

[Intel-gfx] [PATCH 8/8] drm/i915: Code styling fixes

2022-10-28 Thread Swati Sharma
Removed extra newlines and did few styling fixes.

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_display_debugfs.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c 
b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
index 1f051f74a00a..2f19a84eebfe 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -1438,7 +1438,6 @@ static ssize_t wm_latency_write(struct file *file, const 
char __user *ubuf,
return len;
 }
 
-
 static ssize_t pri_wm_latency_write(struct file *file, const char __user *ubuf,
size_t len, loff_t *offp)
 {
@@ -1787,13 +1786,13 @@ static ssize_t i915_dsc_fec_support_write(struct file 
*file,
  const char __user *ubuf,
  size_t len, loff_t *offp)
 {
-   bool dsc_enable = false;
-   int ret;
struct drm_connector *connector =
((struct seq_file *)file->private_data)->private;
struct intel_encoder *encoder = 
intel_attached_encoder(to_intel_connector(connector));
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
+   bool dsc_enable = false;
+   int ret;
 
if (len == 0)
return 0;
@@ -1810,6 +1809,7 @@ static ssize_t i915_dsc_fec_support_write(struct file 
*file,
intel_dp->force_dsc_en = dsc_enable;
 
*offp += len;
+
return len;
 }
 
-- 
2.25.1



[Intel-gfx] [PATCH v4 5/8] drm/i915: Fill in native_420 field

2022-10-28 Thread Swati Sharma
From: Suraj Kandpal 

Now that we have laid the groundwork for YUV420 Enablement
we fill up native_420 field in vdsc_cfg and add appropriate
checks wherever required.

---v2
-adding native_422 field as 0 [Vandita]
-filling in second_line_bpg_offset, second_line_offset_adj
and nsl_bpg_offset in vds_cfg when native_420 is true

---v3
-adding display version check to solve igt issue

Signed-off-by: Suraj Kandpal 
---
 drivers/gpu/drm/i915/display/icl_dsi.c|  2 -
 drivers/gpu/drm/i915/display/intel_dp.c   |  3 -
 drivers/gpu/drm/i915/display/intel_vdsc.c | 74 ++-
 3 files changed, 71 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c 
b/drivers/gpu/drm/i915/display/icl_dsi.c
index e05e7cd6c412..f0c79247cc83 100644
--- a/drivers/gpu/drm/i915/display/icl_dsi.c
+++ b/drivers/gpu/drm/i915/display/icl_dsi.c
@@ -1625,8 +1625,6 @@ static int gen11_dsi_dsc_compute_config(struct 
intel_encoder *encoder,
if (crtc_state->dsc.slice_count > 1)
crtc_state->dsc.dsc_split = true;
 
-   vdsc_cfg->convert_rgb = true;
-
/* FIXME: initialize from VBT */
vdsc_cfg->rc_model_size = DSC_RC_MODEL_SIZE_CONST;
 
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index a5c31ac1ec73..b7b7b40ce7ff 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1440,9 +1440,6 @@ static int intel_dp_dsc_compute_params(struct 
intel_encoder *encoder,
min(intel_dp_source_dsc_version_minor(intel_dp),
intel_dp_sink_dsc_version_minor(intel_dp));
 
-   vdsc_cfg->convert_rgb = intel_dp->dsc_dpcd[DP_DSC_DEC_COLOR_FORMAT_CAP 
- DP_DSC_SUPPORT] &
-   DP_DSC_RGB;
-
line_buf_depth = drm_dp_dsc_sink_line_buf_depth(intel_dp->dsc_dpcd);
if (!line_buf_depth) {
drm_dbg_kms(&i915->drm,
diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.c 
b/drivers/gpu/drm/i915/display/intel_vdsc.c
index a642975a1b61..66a4f55c8955 100644
--- a/drivers/gpu/drm/i915/display/intel_vdsc.c
+++ b/drivers/gpu/drm/i915/display/intel_vdsc.c
@@ -462,14 +462,47 @@ int intel_dsc_compute_params(struct intel_crtc_state 
*pipe_config)
vdsc_cfg->pic_width = pipe_config->hw.adjusted_mode.crtc_hdisplay;
vdsc_cfg->slice_width = DIV_ROUND_UP(vdsc_cfg->pic_width,
 pipe_config->dsc.slice_count);
-
-   /* Gen 11 does not support YCbCr */
+   /*
+* According to DSC 1.2 specs if colorspace is YCbCr then convert_rgb 
is 0
+* else 1
+*/
+   vdsc_cfg->convert_rgb = !(pipe_config->output_format == 
INTEL_OUTPUT_FORMAT_YCBCR420 ||
+ pipe_config->output_format == 
INTEL_OUTPUT_FORMAT_YCBCR444);
+
+   if (pipe_config->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
+   vdsc_cfg->native_420 = true;
+   /* We do not support YcBCr422 as of now */
+   vdsc_cfg->native_422 = false;
+   /* Gen 11 does not support YCbCr422 */
vdsc_cfg->simple_422 = false;
/* Gen 11 does not support VBR */
vdsc_cfg->vbr_enable = false;
 
/* Gen 11 only supports integral values of bpp */
vdsc_cfg->bits_per_pixel = compressed_bpp << 4;
+   /*
+* According to DSC 1.2 specs if native_420 is set:
+* -We need to double the current bpp.
+* -second_line_bpg_offset is 12 in general and equal to 
2*(slice_height-1) if slice
+* height < 8.
+* -second_line_offset_adj is 512 as shown by emperical values to yeild 
best chroma
+* preservation in second line.
+* -nsl_bpg_offset is calculated as second_line_offset/slice_height -1 
then rounded
+* up to 16 fractional bits, we left shift second line offset by 11 to 
preserve 11
+* fractional bits.
+*/
+   if (vdsc_cfg->native_420) {
+   vdsc_cfg->bits_per_pixel <<= 1;
+   if (vdsc_cfg->slice_height >= 8)
+   vdsc_cfg->second_line_bpg_offset = 12;
+   else
+   vdsc_cfg->second_line_bpg_offset =
+   2 * (vdsc_cfg->slice_height - 1);
+   vdsc_cfg->second_line_offset_adj = 512;
+   vdsc_cfg->nsl_bpg_offset = 
DIV_ROUND_UP(vdsc_cfg->second_line_bpg_offset << 11,
+   vdsc_cfg->slice_height 
- 1);
+   }
+
vdsc_cfg->bits_per_component = pipe_config->pipe_bpp / 3;
 
for (i = 0; i < DSC_NUM_BUF_RANGES - 1; i++) {
@@ -596,8 +629,13 @@ static void intel_dsc_pps_configure(const struct 
intel_crtc_state *crtc_state)
DSC_VER_MIN_SHIFT |
vdsc_cfg->bits_per_component << DSC_BPC_SHIFT |
vdsc_cfg->line_buf_depth << DSC_LINE_BUF_DEPTH_SHIFT;
-   if (vdsc_cfg->dsc_version_minor == 2)
+   if (vdsc_cfg->dsc_version_minor == 2) {

[Intel-gfx] [PATCH v2 2/8] drm/i915/dp: Check if DSC supports the given output_format

2022-10-28 Thread Swati Sharma
From: Ankit Nautiyal 

Go with DSC only if the given output_format is supported.

v2: Use drm helper to get DSC format support for sink.

Signed-off-by: Ankit Nautiyal 
---
 drivers/gpu/drm/i915/display/intel_dp.c | 28 +
 1 file changed, 28 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 7400d6b4c587..a5c31ac1ec73 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1464,6 +1464,31 @@ static int intel_dp_dsc_compute_params(struct 
intel_encoder *encoder,
return drm_dsc_compute_rc_parameters(vdsc_cfg);
 }
 
+static bool intel_dp_dsc_supports_format(struct intel_dp *intel_dp,
+enum intel_output_format output_format)
+{
+   u8 sink_dsc_format;
+
+   switch (output_format) {
+   case INTEL_OUTPUT_FORMAT_RGB:
+   sink_dsc_format = DP_DSC_RGB;
+   break;
+   case INTEL_OUTPUT_FORMAT_YCBCR444:
+   sink_dsc_format = DP_DSC_YCbCr444;
+   break;
+   case INTEL_OUTPUT_FORMAT_YCBCR420:
+   if (min(intel_dp_source_dsc_version_minor(intel_dp),
+   intel_dp_sink_dsc_version_minor(intel_dp)) < 2)
+   return false;
+   sink_dsc_format = DP_DSC_YCbCr420_Native;
+   break;
+   default:
+   return false;
+   }
+
+   return drm_dp_dsc_sink_supports_format(intel_dp->dsc_dpcd, 
sink_dsc_format);
+}
+
 static int intel_dp_dsc_compute_config(struct intel_dp *intel_dp,
   struct intel_crtc_state *pipe_config,
   struct drm_connector_state *conn_state,
@@ -1482,6 +1507,9 @@ static int intel_dp_dsc_compute_config(struct intel_dp 
*intel_dp,
if (!intel_dp_supports_dsc(intel_dp, pipe_config))
return -EINVAL;
 
+   if (!intel_dp_dsc_supports_format(intel_dp, pipe_config->output_format))
+   return -EINVAL;
+
pipe_bpp = intel_dp_dsc_compute_bpp(intel_dp, 
conn_state->max_requested_bpc);
 
if (intel_dp->force_dsc_bpc) {
-- 
2.25.1



[Intel-gfx] [PATCH 7/8] drm/i915/dsc: Allow DSC only with YCbCr420 format when forced from debugfs

2022-10-28 Thread Swati Sharma
If force_dsc_ycbcr420_en is set through debugfs allow DSC iff
output_format is INTEL_OUTPUT_FORMAT_YCBCR420.

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_dp.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index b7b7b40ce7ff..4e7f0fc4a3cf 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1507,6 +1507,9 @@ static int intel_dp_dsc_compute_config(struct intel_dp 
*intel_dp,
if (!intel_dp_dsc_supports_format(intel_dp, pipe_config->output_format))
return -EINVAL;
 
+   if (intel_dp->force_dsc_ycbcr420_en && pipe_config->output_format != 
INTEL_OUTPUT_FORMAT_YCBCR420)
+   return -EINVAL;
+
pipe_bpp = intel_dp_dsc_compute_bpp(intel_dp, 
conn_state->max_requested_bpc);
 
if (intel_dp->force_dsc_bpc) {
-- 
2.25.1



[Intel-gfx] [PATCH 6/8] drm/i915/dsc: Add debugfs entry to validate DSC YCbCr420

2022-10-28 Thread Swati Sharma
DSC_YCBCR420_Sink_Support entry is added to i915_dsc_fec_support_show
to depict if sink supports DSC YCbCr420.
Also, new debugfs entry is created to enforce YCbCr420 output format.
This is required because of our driver policy. If a mode is supported in
both RGB and YCbCr420 output formats by the sink, our policy is to try RGB first
and fall back to YCbCr420, if mode cannot be shown using RGB.
So, to test YCbCr420, we need a debugfs entry (force_dsc_ycbcr420) to force this
output format; so that YCbCr420 code gets executed.

Signed-off-by: Swati Sharma 
---
 .../drm/i915/display/intel_display_debugfs.c  | 84 +++
 .../drm/i915/display/intel_display_types.h|  1 +
 2 files changed, 85 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c 
b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
index cfc056a05bbf..1f051f74a00a 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -1770,6 +1770,8 @@ static int i915_dsc_fec_support_show(struct seq_file *m, 
void *data)
   
str_yes_no(drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd)));
seq_printf(m, "Force_DSC_Enable: %s\n",
   str_yes_no(intel_dp->force_dsc_en));
+   seq_printf(m, "DSC_YCBCR420_Sink_Support: %s\n",
+  
str_yes_no(drm_dp_dsc_sink_supports_format(intel_dp->dsc_dpcd, 
DP_DSC_YCbCr420_Native)));
if (!intel_dp_is_edp(intel_dp))
seq_printf(m, "FEC_Sink_Support: %s\n",
   
str_yes_no(drm_dp_sink_supports_fec(intel_dp->fec_capable)));
@@ -1893,6 +1895,85 @@ static const struct file_operations i915_dsc_bpc_fops = {
.write = i915_dsc_bpc_write
 };
 
+static int i915_dsc_ycbcr420_show(struct seq_file *m, void *data)
+{
+   struct drm_connector *connector = m->private;
+   struct drm_device *dev = connector->dev;
+   struct drm_crtc *crtc;
+   struct intel_dp *intel_dp;
+   struct intel_crtc_state *crtc_state;
+   struct intel_encoder *encoder = 
intel_attached_encoder(to_intel_connector(connector));
+   int ret;
+
+   if (!encoder)
+   return -ENODEV;
+
+   ret = 
drm_modeset_lock_single_interruptible(&dev->mode_config.connection_mutex);
+   if (ret)
+   return ret;
+
+   crtc = connector->state->crtc;
+   if (connector->status != connector_status_connected || !crtc) {
+   ret = -ENODEV;
+   goto out;
+   }
+
+   intel_dp = intel_attached_dp(to_intel_connector(connector));
+   crtc_state = to_intel_crtc_state(crtc->state);
+   seq_printf(m, "Force_DSC_YCBCR420_Enable: %s\n",
+  str_yes_no(intel_dp->force_dsc_ycbcr420_en));
+
+out:   drm_modeset_unlock(&dev->mode_config.connection_mutex);
+
+   return ret;
+}
+
+static ssize_t i915_dsc_ycbcr420_write(struct file *file,
+  const char __user *ubuf,
+  size_t len, loff_t *offp)
+{
+   struct drm_connector *connector =
+   ((struct seq_file *)file->private_data)->private;
+   struct intel_encoder *encoder = 
intel_attached_encoder(to_intel_connector(connector));
+   struct drm_i915_private *i915 = to_i915(encoder->base.dev);
+   struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
+   bool dsc_ycbcr420_enable = false;
+   int ret;
+
+   if (len == 0)
+   return 0;
+
+   drm_dbg(&i915->drm,
+   "Copied %zu bytes from user to force YCBCR420 for DSC\n", len);
+
+   ret = kstrtobool_from_user(ubuf, len, &dsc_ycbcr420_enable);
+   if (ret < 0)
+   return ret;
+
+   drm_dbg(&i915->drm, "Got %s for DSC YCBCR420 Enable\n",
+   (dsc_ycbcr420_enable) ? "true" : "false");
+   intel_dp->force_dsc_ycbcr420_en = dsc_ycbcr420_enable;
+
+   *offp += len;
+
+   return len;
+}
+
+static int i915_dsc_ycbcr420_open(struct inode *inode,
+ struct file *file)
+{
+   return single_open(file, i915_dsc_ycbcr420_show, inode->i_private);
+}
+
+static const struct file_operations i915_dsc_ycbcr420_fops = {
+   .owner = THIS_MODULE,
+   .open = i915_dsc_ycbcr420_open,
+   .read = seq_read,
+   .llseek = seq_lseek,
+   .release = single_release,
+   .write = i915_dsc_ycbcr420_write
+};
+
 /*
  * Returns the Current CRTC's bpc.
  * Example usage: cat /sys/kernel/debug/dri/0/crtc-0/i915_current_bpc
@@ -1964,6 +2045,9 @@ void intel_connector_debugfs_add(struct intel_connector 
*intel_connector)
 
debugfs_create_file("i915_dsc_bpc", 0644, root,
   

[Intel-gfx] [PATCH v4 3/8] drm/i915: Adding the new registers for DSC

2022-10-28 Thread Swati Sharma
From: Suraj Kandpal 

Adding new DSC register which are introducted MTL onwards

Signed-off-by: Suraj Kandpal 
---
 drivers/gpu/drm/i915/i915_reg.h | 28 
 1 file changed, 28 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 1c0da50c0dc7..fc6d6651b775 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -7841,6 +7841,8 @@ enum skl_power_gate {
 #define ICL_DSC1_PICTURE_PARAMETER_SET_0(pipe) _MMIO_PIPE((pipe) - PIPE_B, \
   
_ICL_DSC1_PICTURE_PARAMETER_SET_0_PB, \
   
_ICL_DSC1_PICTURE_PARAMETER_SET_0_PC)
+#define  DSC_NATIVE_422_ENABLE (1 << 23)
+#define  DSC_NATIVE_420_ENABLE (1 << 22)
 #define  DSC_ALT_ICH_SEL   (1 << 20)
 #define  DSC_VBR_ENABLE(1 << 19)
 #define  DSC_422_ENABLE(1 << 18)
@@ -8085,6 +8087,32 @@ enum skl_power_gate {
 #define  DSC_SLICE_PER_LINE(slice_per_line)((slice_per_line) << 16)
 #define  DSC_SLICE_CHUNK_SIZE(slice_chunk_size)
((slice_chunk_size) << 0)
 
+/* MTL Display Stream Compression registers */
+#define _MTL_DSC0_PICTURE_PARAMETER_SET_17_PB  0x782B4
+#define _MTL_DSC1_PICTURE_PARAMETER_SET_17_PB  0x783B4
+#define _MTL_DSC0_PICTURE_PARAMETER_SET_17_PC  0x784B4
+#define _MTL_DSC1_PICTURE_PARAMETER_SET_17_PC  0x785B4
+#define MTL_DSC0_PICTURE_PARAMETER_SET_17(pipe)_MMIO_PIPE((pipe) - 
PIPE_B, \
+  
_MTL_DSC0_PICTURE_PARAMETER_SET_17_PB, \
+  
_MTL_DSC0_PICTURE_PARAMETER_SET_17_PC)
+#define MTL_DSC1_PICTURE_PARAMETER_SET_17(pipe)_MMIO_PIPE((pipe) - 
PIPE_B, \
+  
_MTL_DSC1_PICTURE_PARAMETER_SET_17_PB, \
+  
_MTL_DSC1_PICTURE_PARAMETER_SET_17_PC)
+#define DSC_SL_BPG_OFFSET(offset)  ((offset) << 27)
+
+#define _MTL_DSC0_PICTURE_PARAMETER_SET_18_PB  0x782B8
+#define _MTL_DSC1_PICTURE_PARAMETER_SET_18_PB  0x783B8
+#define _MTL_DSC0_PICTURE_PARAMETER_SET_18_PC  0x784B8
+#define _MTL_DSC1_PICTURE_PARAMETER_SET_18_PC  0x785B8
+#define MTL_DSC0_PICTURE_PARAMETER_SET_18(pipe)_MMIO_PIPE((pipe) - 
PIPE_B, \
+  
_MTL_DSC0_PICTURE_PARAMETER_SET_18_PB, \
+  
_MTL_DSC0_PICTURE_PARAMETER_SET_18_PC)
+#define MTL_DSC1_PICTURE_PARAMETER_SET_18(pipe)_MMIO_PIPE((pipe) - 
PIPE_B, \
+  
_MTL_DSC1_PICTURE_PARAMETER_SET_18_PB, \
+  
_MTL_DSC1_PICTURE_PARAMETER_SET_18_PC)
+#define DSC_NSL_BPG_OFFSET(offset) ((offset) << 16)
+#define DSC_SL_OFFSET_ADJ(offset)  ((offset) << 0)
+
 /* Icelake Rate Control Buffer Threshold Registers */
 #define DSCA_RC_BUF_THRESH_0   _MMIO(0x6B230)
 #define DSCA_RC_BUF_THRESH_0_UDW   _MMIO(0x6B230 + 4)
-- 
2.25.1



[Intel-gfx] [PATCH v5 0/8] Enable YCbCr420 for VDSC

2022-10-28 Thread Swati Sharma
This patch series aims to enable the YCbCr420 format
for DSC. Changes are mostly compute params related for
hdmi,dp and dsi along with the addition of new rc_tables
for native_420 and corresponding changes to macros used to
fetch them.

---v2
-adding fields missed for vdsc_cfg [Vandita]
-adding corresponding registers and writing to the [Vandita]

---v3
-adding 11 bit left shift missed in nsl_bpg_offset calculation

---v4
-adding display version check before writing in new pps register

---v5
-added helper to check if sink supports given format with DSC
-added debugfs entry to enforce DSC with YCbCr420 format only

Ankit Nautiyal (2):
  drm/dp_helper: Add helper to check if the sink supports given format
with DSC
  drm/i915/dp: Check if DSC supports the given output_format

Suraj Kandpal (3):
  drm/i915: Adding the new registers for DSC
  drm/i915: Enable YCbCr420 for VDSC
  drm/i915: Fill in native_420 field

Swati Sharma (3):
  drm/i915/dsc: Add debugfs entry to validate DSC YCbCr420
  drm/i915/dsc: Allow DSC only with YCbCr420 format when forced from
debugfs
  drm/i915: Code styling fixes

 drivers/gpu/drm/i915/display/icl_dsi.c|   2 -
 .../drm/i915/display/intel_display_debugfs.c  |  90 -
 .../drm/i915/display/intel_display_types.h|   1 +
 drivers/gpu/drm/i915/display/intel_dp.c   |  34 +++-
 .../gpu/drm/i915/display/intel_qp_tables.c| 187 --
 .../gpu/drm/i915/display/intel_qp_tables.h|   4 +-
 drivers/gpu/drm/i915/display/intel_vdsc.c |  78 +++-
 drivers/gpu/drm/i915/i915_reg.h   |  28 +++
 include/drm/display/drm_dp_helper.h   |   6 +
 9 files changed, 404 insertions(+), 26 deletions(-)

-- 
2.25.1



[Intel-gfx] [PATCH 1/8] drm/dp_helper: Add helper to check if the sink supports given format with DSC

2022-10-28 Thread Swati Sharma
From: Ankit Nautiyal 

Add helper function to check if the DP sink supports DSC with the given
output format.

Signed-off-by: Ankit Nautiyal 
---
 include/drm/display/drm_dp_helper.h | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/include/drm/display/drm_dp_helper.h 
b/include/drm/display/drm_dp_helper.h
index ab55453f2d2c..6c1706280746 100644
--- a/include/drm/display/drm_dp_helper.h
+++ b/include/drm/display/drm_dp_helper.h
@@ -193,6 +193,12 @@ drm_dp_dsc_sink_max_slice_width(const u8 
dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE])
return dsc_dpcd[DP_DSC_MAX_SLICE_WIDTH - DP_DSC_SUPPORT] *
DP_DSC_SLICE_WIDTH_MULTIPLIER;
 }
+/* Check if sink supports DSC with given output format */
+static inline bool
+drm_dp_dsc_sink_supports_format(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE], 
u8 output_format)
+{
+   return dsc_dpcd[DP_DSC_DEC_COLOR_FORMAT_CAP - DP_DSC_SUPPORT] & 
output_format;
+}
 
 /* Forward Error Correction Support on DP 1.4 */
 static inline bool
-- 
2.25.1



Re: [Intel-gfx] [PATCH v6 3/3] drm/i915: Enabling WD Transcoder

2022-09-28 Thread Swati Sharma

This patch ideally should have been split into smaller functional
patches. Thoughts @jani nikula?

On 19-Sep-22 6:35 PM, Kandpal, Suraj wrote:

From: Suraj Kandpal 

Adding support for writeback transcoder to start capturing frames using
interrupt mechanism

Signed-off-by: Suraj Kandpal 
Reviewed-by: Arun R Murthy 
---
  drivers/gpu/drm/i915/Makefile |   1 +
  drivers/gpu/drm/i915/display/intel_acpi.c |   1 +
  drivers/gpu/drm/i915/display/intel_crtc.c |   6 +
  .../drm/i915/display/intel_crtc_state_dump.c  |   1 +
  drivers/gpu/drm/i915/display/intel_ddi.c  |   6 +
  drivers/gpu/drm/i915/display/intel_display.c  |  68 +-
  drivers/gpu/drm/i915/display/intel_display.h  |   5 +
  .../drm/i915/display/intel_display_debugfs.c  |  13 +-
  .../drm/i915/display/intel_display_types.h|  11 +-
  drivers/gpu/drm/i915/display/intel_dpll.c |   6 +
  .../drm/i915/display/intel_modeset_setup.c| 103 ++-
  .../drm/i915/display/intel_modeset_verify.c   |  17 +-
  drivers/gpu/drm/i915/display/intel_opregion.c |   3 +
  drivers/gpu/drm/i915/display/intel_wd.c   | 694 ++
  drivers/gpu/drm/i915/display/intel_wd.h   |  48 ++
  drivers/gpu/drm/i915/i915_drv.h   |   1 +
  drivers/gpu/drm/i915/i915_irq.c   |   8 +-
  drivers/gpu/drm/i915/i915_pci.c   |   7 +-
  18 files changed, 950 insertions(+), 49 deletions(-)
  create mode 100644 drivers/gpu/drm/i915/display/intel_wd.c
  create mode 100644 drivers/gpu/drm/i915/display/intel_wd.h

diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index a26edcdadc21..f34db43cf58d 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -304,6 +304,7 @@ i915-y += \
display/intel_tv.o \
display/intel_vdsc.o \
display/intel_vrr.o \
+   display/intel_wd.o \
display/vlv_dsi.o \
display/vlv_dsi_pll.o
  
diff --git a/drivers/gpu/drm/i915/display/intel_acpi.c b/drivers/gpu/drm/i915/display/intel_acpi.c

index 912fe5c2ffe5..3321ef62fdbd 100644
--- a/drivers/gpu/drm/i915/display/intel_acpi.c
+++ b/drivers/gpu/drm/i915/display/intel_acpi.c
@@ -248,6 +248,7 @@ static u32 acpi_display_type(struct intel_connector 
*connector)
case DRM_MODE_CONNECTOR_LVDS:
case DRM_MODE_CONNECTOR_eDP:
case DRM_MODE_CONNECTOR_DSI:
+   case DRM_MODE_CONNECTOR_WRITEBACK:
display_type = ACPI_DISPLAY_TYPE_INTERNAL_DIGITAL;
break;
case DRM_MODE_CONNECTOR_Unknown:
diff --git a/drivers/gpu/drm/i915/display/intel_crtc.c 
b/drivers/gpu/drm/i915/display/intel_crtc.c
index 6792a9056f46..66d552758720 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc.c
+++ b/drivers/gpu/drm/i915/display/intel_crtc.c
@@ -491,6 +491,9 @@ void intel_pipe_update_start(struct intel_crtc_state 
*new_crtc_state)
if (new_crtc_state->do_async_flip)
return;
  
+	if (new_crtc_state->output_types & BIT(INTEL_OUTPUT_WD))

+   return;
+
if (intel_crtc_needs_vblank_work(new_crtc_state))
intel_crtc_vblank_work_init(new_crtc_state);
  
@@ -638,6 +641,9 @@ void intel_pipe_update_end(struct intel_crtc_state *new_crtc_state)

if (new_crtc_state->do_async_flip)
return;
  
+	if (new_crtc_state->output_types & BIT(INTEL_OUTPUT_WD))

+   return;
+
trace_intel_pipe_update_end(crtc, end_vbl_count, scanline_end);
  
  	/*

diff --git a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c 
b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
index e9212f69c360..8435065f3b7d 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
+++ b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
@@ -71,6 +71,7 @@ static const char * const output_type_str[] = {
OUTPUT_TYPE(DSI),
OUTPUT_TYPE(DDI),
OUTPUT_TYPE(DP_MST),
+   OUTPUT_TYPE(WD),
  };
  
  #undef OUTPUT_TYPE

diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c 
b/drivers/gpu/drm/i915/display/intel_ddi.c
index 643832d55c28..ea8e07a957ab 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -1953,6 +1953,12 @@ void intel_ddi_sanitize_encoder_pll_mapping(struct 
intel_encoder *encoder)
 */
if (encoder->type == INTEL_OUTPUT_DP_MST)
return;
+   /*
+* WD transcoder is a virtual encoder hence sanization
+* is not required for it
+*/
+   if (encoder->type == INTEL_OUTPUT_WD)
+   return;
  
  	if (!encoder->base.crtc && intel_encoder_is_dp(encoder)) {

u8 pipe_mask;
diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index dd008ba8afe3..f34880799ce7 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -115,6 +115,7 @@
  #include "intel_sprite.h"
  #include "intel_tc.h"
  #include "intel_vga.

Re: [Intel-gfx] [PATCH v6 0/3] Enable Pipewriteback

2022-09-28 Thread Swati Sharma

Also, please specify in cover-letter, current
series WB support is for TGL+
since WB is supported from SKL+ as per bspec
https://gfxspecs.intel.com/Predator/Home/Index/4290

On 19-Sep-22 6:35 PM, Kandpal, Suraj wrote:

A patch series was floated in the drm mailing list which aimed to change
the drm_connector and drm_encoder fields to pointer in the
drm_connector_writeback structure, this received a huge pushback from
the community but since i915 expects each connector present in the
drm_device list to be a intel_connector but drm_writeback framework
makes us have a connector which cannot be embedded in an intel_connector
structure.
[1]
https://patchwork.kernel.org/project/dri-devel/patch/20220202081702.22119-1-suraj.kand...@intel.com/
[2]
https://patchwork.kernel.org/project/dri-devel/patch/20220202085429.22261-6-suraj.kand...@intel.com/
Since no one had an issue with encoder field being changed into a
pointer it was decided to break the connector and encoder pointer
changes into two different series.The encoder field changes is
currently being worked upon by Abhinav Kumar and the changes have been
merged.
[3]https://patchwork.kernel.org/project/dri-devel/list/?series=633565
Going forward we use a drm_connector which is not embedded in
intel_connector.
We also create a intel_encoder to avoid changes to many
iterators but no intel_connector. We also changed all iterators that

---v2
solving BAT issues

---v3
-removing unecessary comments from i915_reg.h [Arun]
-moving wd_init into its own if condition [Arun]
-fixing comment styling and alignment in intel_wd.c [Arun]
-removing continue from loop and calling function if condition is met
[Arun]
-removing useless arguments from intel_queue_writeback_job and
intel_enabling_capture [Arun]

--v4
Adding Reviewed-by to patches which were previously reviewd

--v5
Adding Reviewed-by for patch 3

--v6
Solving BAT issue
changes for checkpatch to pass

Suraj Kandpal (3):
   drm/i915: Define WD trancoder for i915
   drm/i915 : Changing intel_connector iterators
   drm/i915: Enabling WD Transcoder

  drivers/gpu/drm/i915/Makefile |   1 +
  drivers/gpu/drm/i915/display/intel_acpi.c |   8 +-
  drivers/gpu/drm/i915/display/intel_crtc.c |   6 +
  .../drm/i915/display/intel_crtc_state_dump.c  |   1 +
  drivers/gpu/drm/i915/display/intel_ddi.c  |   6 +
  drivers/gpu/drm/i915/display/intel_display.c  |  68 +-
  drivers/gpu/drm/i915/display/intel_display.h  |  18 +-
  .../drm/i915/display/intel_display_debugfs.c  |  13 +-
  .../drm/i915/display/intel_display_types.h|  32 +-
  drivers/gpu/drm/i915/display/intel_dpll.c |   6 +
  .../drm/i915/display/intel_modeset_setup.c| 119 ++-
  .../drm/i915/display/intel_modeset_verify.c   |  17 +-
  drivers/gpu/drm/i915/display/intel_opregion.c |   3 +
  drivers/gpu/drm/i915/display/intel_wd.c   | 694 ++
  drivers/gpu/drm/i915/display/intel_wd.h   |  48 ++
  drivers/gpu/drm/i915/i915_drv.h   |   1 +
  drivers/gpu/drm/i915/i915_irq.c   |   8 +-
  drivers/gpu/drm/i915/i915_pci.c   |   7 +-
  drivers/gpu/drm/i915/i915_reg.h   | 137 
  19 files changed, 1137 insertions(+), 56 deletions(-)
  create mode 100644 drivers/gpu/drm/i915/display/intel_wd.c
  create mode 100644 drivers/gpu/drm/i915/display/intel_wd.h



--
~Swati Sharma


Re: [Intel-gfx] [PATCH v6 0/3] Enable Pipewriteback

2022-09-28 Thread Swati Sharma

Hi Suraj,

CI is not green
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_107440v9/shards-all.html?testfilter=kms_writeback

2/4 subtests are passing
writeback-fb-id subtest can be fixed by asserting EINVAL for i915
we need to fix writeback-check-output first
On local validation, we were getting CRC mismatch however CI results
show different issue 
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_107440v9/shard-tglu-4/igt@kms_writeb...@writeback-check-output.html#dmesg-warnings575

Please check the same if its relevant.

On 19-Sep-22 6:35 PM, Kandpal, Suraj wrote:

A patch series was floated in the drm mailing list which aimed to change
the drm_connector and drm_encoder fields to pointer in the
drm_connector_writeback structure, this received a huge pushback from
the community but since i915 expects each connector present in the
drm_device list to be a intel_connector but drm_writeback framework
makes us have a connector which cannot be embedded in an intel_connector
structure.
[1]
https://patchwork.kernel.org/project/dri-devel/patch/20220202081702.22119-1-suraj.kand...@intel.com/
[2]
https://patchwork.kernel.org/project/dri-devel/patch/20220202085429.22261-6-suraj.kand...@intel.com/
Since no one had an issue with encoder field being changed into a
pointer it was decided to break the connector and encoder pointer
changes into two different series.The encoder field changes is
currently being worked upon by Abhinav Kumar and the changes have been
merged.
[3]https://patchwork.kernel.org/project/dri-devel/list/?series=633565
Going forward we use a drm_connector which is not embedded in
intel_connector.
We also create a intel_encoder to avoid changes to many
iterators but no intel_connector. We also changed all iterators that

---v2
solving BAT issues

---v3
-removing unecessary comments from i915_reg.h [Arun]
-moving wd_init into its own if condition [Arun]
-fixing comment styling and alignment in intel_wd.c [Arun]
-removing continue from loop and calling function if condition is met
[Arun]
-removing useless arguments from intel_queue_writeback_job and
intel_enabling_capture [Arun]

--v4
Adding Reviewed-by to patches which were previously reviewd

--v5
Adding Reviewed-by for patch 3

--v6
Solving BAT issue
changes for checkpatch to pass

Suraj Kandpal (3):
   drm/i915: Define WD trancoder for i915
   drm/i915 : Changing intel_connector iterators
   drm/i915: Enabling WD Transcoder

  drivers/gpu/drm/i915/Makefile |   1 +
  drivers/gpu/drm/i915/display/intel_acpi.c |   8 +-
  drivers/gpu/drm/i915/display/intel_crtc.c |   6 +
  .../drm/i915/display/intel_crtc_state_dump.c  |   1 +
  drivers/gpu/drm/i915/display/intel_ddi.c  |   6 +
  drivers/gpu/drm/i915/display/intel_display.c  |  68 +-
  drivers/gpu/drm/i915/display/intel_display.h  |  18 +-
  .../drm/i915/display/intel_display_debugfs.c  |  13 +-
  .../drm/i915/display/intel_display_types.h|  32 +-
  drivers/gpu/drm/i915/display/intel_dpll.c |   6 +
  .../drm/i915/display/intel_modeset_setup.c| 119 ++-
  .../drm/i915/display/intel_modeset_verify.c   |  17 +-
  drivers/gpu/drm/i915/display/intel_opregion.c |   3 +
  drivers/gpu/drm/i915/display/intel_wd.c   | 694 ++
  drivers/gpu/drm/i915/display/intel_wd.h   |  48 ++
  drivers/gpu/drm/i915/i915_drv.h   |   1 +
  drivers/gpu/drm/i915/i915_irq.c   |   8 +-
  drivers/gpu/drm/i915/i915_pci.c   |   7 +-
  drivers/gpu/drm/i915/i915_reg.h   | 137 
  19 files changed, 1137 insertions(+), 56 deletions(-)
  create mode 100644 drivers/gpu/drm/i915/display/intel_wd.c
  create mode 100644 drivers/gpu/drm/i915/display/intel_wd.h



--
~Swati Sharma


[Intel-gfx] [v2][PATCH 0/1] Modify debugfs entry from dsc compressed bpp to input bpc

2022-09-02 Thread Swati Sharma
Output dsc compressed bpp debufs entry is changed to
input bpc dsc to validate input bpc across various platforms.

Test-with: 20220831120849.28883-1-swati2.sha...@intel.com

Swati Sharma (1):
  drm/i915/dsc: convert dsc debugfs entry from output_bpp to input_bpc

 .../drm/i915/display/intel_display_debugfs.c  | 27 +--
 .../drm/i915/display/intel_display_types.h|  2 +-
 drivers/gpu/drm/i915/display/intel_dp.c   | 21 ---
 3 files changed, 19 insertions(+), 31 deletions(-)

-- 
2.25.1



[Intel-gfx] [v2][PATCH 1/1] drm/i915/dsc: convert dsc debugfs entry from output_bpp to input_bpc

2022-09-02 Thread Swati Sharma
Convert dsc debugfs entry from output_bpp to input_bpc. The rationale
is to validate different input bpc across various platforms.

v2: -improved commit message (Jani N)
-styling fixes (Jani N)

Signed-off-by: Swati Sharma 
---
 .../drm/i915/display/intel_display_debugfs.c  | 27 +--
 .../drm/i915/display/intel_display_types.h|  2 +-
 drivers/gpu/drm/i915/display/intel_dp.c   | 21 ---
 3 files changed, 19 insertions(+), 31 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c 
b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
index 5dc364e9db49..0bd916fd9fec 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -2140,7 +2140,7 @@ static const struct file_operations 
i915_dsc_fec_support_fops = {
.write = i915_dsc_fec_support_write
 };
 
-static int i915_dsc_bpp_show(struct seq_file *m, void *data)
+static int i915_dsc_bpc_show(struct seq_file *m, void *data)
 {
struct drm_connector *connector = m->private;
struct drm_device *dev = connector->dev;
@@ -2163,14 +2163,14 @@ static int i915_dsc_bpp_show(struct seq_file *m, void 
*data)
}
 
crtc_state = to_intel_crtc_state(crtc->state);
-   seq_printf(m, "Compressed_BPP: %d\n", crtc_state->dsc.compressed_bpp);
+   seq_printf(m, "Input_BPC: %d\n", 
crtc_state->dsc.config.bits_per_component);
 
 out:   drm_modeset_unlock(&dev->mode_config.connection_mutex);
 
return ret;
 }
 
-static ssize_t i915_dsc_bpp_write(struct file *file,
+static ssize_t i915_dsc_bpc_write(struct file *file,
  const char __user *ubuf,
  size_t len, loff_t *offp)
 {
@@ -2178,33 +2178,32 @@ static ssize_t i915_dsc_bpp_write(struct file *file,
((struct seq_file *)file->private_data)->private;
struct intel_encoder *encoder = 
intel_attached_encoder(to_intel_connector(connector));
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
-   int dsc_bpp = 0;
+   int dsc_bpc = 0;
int ret;
 
-   ret = kstrtoint_from_user(ubuf, len, 0, &dsc_bpp);
+   ret = kstrtoint_from_user(ubuf, len, 0, &dsc_bpc);
if (ret < 0)
return ret;
 
-   intel_dp->force_dsc_bpp = dsc_bpp;
+   intel_dp->force_dsc_bpc = dsc_bpc;
*offp += len;
 
return len;
 }
 
-static int i915_dsc_bpp_open(struct inode *inode,
+static int i915_dsc_bpc_open(struct inode *inode,
 struct file *file)
 {
-   return single_open(file, i915_dsc_bpp_show,
-  inode->i_private);
+   return single_open(file, i915_dsc_bpc_show, inode->i_private);
 }
 
-static const struct file_operations i915_dsc_bpp_fops = {
+static const struct file_operations i915_dsc_bpc_fops = {
.owner = THIS_MODULE,
-   .open = i915_dsc_bpp_open,
+   .open = i915_dsc_bpc_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
-   .write = i915_dsc_bpp_write
+   .write = i915_dsc_bpc_write
 };
 
 /*
@@ -2274,8 +2273,8 @@ void intel_connector_debugfs_add(struct intel_connector 
*intel_connector)
debugfs_create_file("i915_dsc_fec_support", 0644, root,
connector, &i915_dsc_fec_support_fops);
 
-   debugfs_create_file("i915_dsc_bpp", 0644, root,
-   connector, &i915_dsc_bpp_fops);
+   debugfs_create_file("i915_dsc_bpc", 0644, root,
+   connector, &i915_dsc_bpc_fops);
}
 
if (connector->connector_type == DRM_MODE_CONNECTOR_DSI ||
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h 
b/drivers/gpu/drm/i915/display/intel_display_types.h
index 0da9b208d56e..dbda845030bf 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1712,7 +1712,7 @@ struct intel_dp {
 
/* Display stream compression testing */
bool force_dsc_en;
-   int force_dsc_bpp;
+   int force_dsc_bpc;
 
bool hobl_failed;
bool hobl_active;
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index d4e037450ac5..c4e1ceb5743f 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1474,6 +1474,11 @@ static int intel_dp_dsc_compute_config(struct intel_dp 
*intel_dp,
 
pipe_bpp = intel_dp_dsc_compute_bpp(intel_dp, 
conn_state->max_requested_bpc);
 
+   if (intel_dp->force_dsc_bpc) {
+   pipe_bpp = intel_dp->force_dsc_bpc * 3;
+   drm_dbg_kms(&dev_priv->drm, "Input DSC BPP forced to %d", 
pipe_bpp);
+   }
+
 

[Intel-gfx] [PATCH 1/1] drm/i915/display: convert dsc debugfs entry from output_bpp to input_bpc

2022-08-31 Thread Swati Sharma
With this patch, converting DSC debugfs entry from output_bpp to input_bpc.
Corresponding changes are done in i-g-t to validate DSC with different
input bpc supported per platform.

Signed-off-by: Swati Sharma 
---
 .../drm/i915/display/intel_display_debugfs.c  | 26 +--
 .../drm/i915/display/intel_display_types.h|  2 +-
 drivers/gpu/drm/i915/display/intel_dp.c   | 23 +---
 3 files changed, 21 insertions(+), 30 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c 
b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
index 225b6bfc783c..23627ed3beb1 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -2138,7 +2138,7 @@ static const struct file_operations 
i915_dsc_fec_support_fops = {
.write = i915_dsc_fec_support_write
 };
 
-static int i915_dsc_bpp_show(struct seq_file *m, void *data)
+static int i915_dsc_bpc_show(struct seq_file *m, void *data)
 {
struct drm_connector *connector = m->private;
struct drm_device *dev = connector->dev;
@@ -2161,14 +2161,14 @@ static int i915_dsc_bpp_show(struct seq_file *m, void 
*data)
}
 
crtc_state = to_intel_crtc_state(crtc->state);
-   seq_printf(m, "Compressed_BPP: %d\n", crtc_state->dsc.compressed_bpp);
+   seq_printf(m, "Input_BPC: %d\n", 
crtc_state->dsc.config.bits_per_component);
 
 out:   drm_modeset_unlock(&dev->mode_config.connection_mutex);
 
return ret;
 }
 
-static ssize_t i915_dsc_bpp_write(struct file *file,
+static ssize_t i915_dsc_bpc_write(struct file *file,
  const char __user *ubuf,
  size_t len, loff_t *offp)
 {
@@ -2176,33 +2176,33 @@ static ssize_t i915_dsc_bpp_write(struct file *file,
((struct seq_file *)file->private_data)->private;
struct intel_encoder *encoder = 
intel_attached_encoder(to_intel_connector(connector));
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
-   int dsc_bpp = 0;
+   int dsc_bpc = 0;
int ret;
 
-   ret = kstrtoint_from_user(ubuf, len, 0, &dsc_bpp);
+   ret = kstrtoint_from_user(ubuf, len, 0, &dsc_bpc);
if (ret < 0)
return ret;
 
-   intel_dp->force_dsc_bpp = dsc_bpp;
+   intel_dp->force_dsc_bpc = dsc_bpc;
*offp += len;
 
return len;
 }
 
-static int i915_dsc_bpp_open(struct inode *inode,
+static int i915_dsc_bpc_open(struct inode *inode,
 struct file *file)
 {
-   return single_open(file, i915_dsc_bpp_show,
+   return single_open(file, i915_dsc_bpc_show,
   inode->i_private);
 }
 
-static const struct file_operations i915_dsc_bpp_fops = {
+static const struct file_operations i915_dsc_bpc_fops = {
.owner = THIS_MODULE,
-   .open = i915_dsc_bpp_open,
+   .open = i915_dsc_bpc_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
-   .write = i915_dsc_bpp_write
+   .write = i915_dsc_bpc_write
 };
 
 /*
@@ -2272,8 +2272,8 @@ void intel_connector_debugfs_add(struct intel_connector 
*intel_connector)
debugfs_create_file("i915_dsc_fec_support", 0644, root,
connector, &i915_dsc_fec_support_fops);
 
-   debugfs_create_file("i915_dsc_bpp", 0644, root,
-   connector, &i915_dsc_bpp_fops);
+   debugfs_create_file("i915_dsc_bpc", 0644, root,
+   connector, &i915_dsc_bpc_fops);
}
 
if (connector->connector_type == DRM_MODE_CONNECTOR_DSI ||
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h 
b/drivers/gpu/drm/i915/display/intel_display_types.h
index 0da9b208d56e..dbda845030bf 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1712,7 +1712,7 @@ struct intel_dp {
 
/* Display stream compression testing */
bool force_dsc_en;
-   int force_dsc_bpp;
+   int force_dsc_bpc;
 
bool hobl_failed;
bool hobl_active;
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 8d1559323412..0d75b00d3e5d 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1474,6 +1474,13 @@ static int intel_dp_dsc_compute_config(struct intel_dp 
*intel_dp,
 
pipe_bpp = intel_dp_dsc_compute_bpp(intel_dp, 
conn_state->max_requested_bpc);
 
+   if (intel_dp->force_dsc_bpc) {
+   pipe_bpp = intel_dp->force_dsc_bpc * 3;
+   drm_dbg_kms(&dev_priv->drm,
+   "Input DSC BPP forced to %d",
+   

[Intel-gfx] [PATCH 0/1] Modify debugfs entry from dsc compressed bpp to input bpc

2022-08-31 Thread Swati Sharma
In this patch, output dsc compressed bpp debufs entry is changed to
input bpc dsc.
Also, corresponding changes done in kms_dsc i-g-t.

Test-with: 20220831120849.28883-1-swati2.sha...@intel.com

Swati Sharma (1):
  drm/i915/display: convert dsc debugfs entry from output_bpp to
input_bpc

 .../drm/i915/display/intel_display_debugfs.c  | 26 +--
 .../drm/i915/display/intel_display_types.h|  2 +-
 drivers/gpu/drm/i915/display/intel_dp.c   | 23 +---
 3 files changed, 21 insertions(+), 30 deletions(-)

-- 
2.25.1



[Intel-gfx] [PATCH] drm/i915/display: Add debug print for scaler filter

2022-07-06 Thread Swati Sharma
Add debug print statement to print scaler filter property
value. Since property can be set as either default or integer
scaler; its good if we can get debug print for the same in dmesg
log.

Cc: Juha-Pekka Heikkila 
Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_crtc_state_dump.c | 9 +
 drivers/gpu/drm/i915/display/intel_display_debugfs.c | 5 +++--
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c 
b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
index 4ca6e9493ff2..e9212f69c360 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
+++ b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
@@ -134,8 +134,8 @@ static void intel_dump_plane_state(const struct 
intel_plane_state *plane_state)
plane->base.base.id, plane->base.name,
fb->base.id, fb->width, fb->height, &fb->format->format,
fb->modifier, str_yes_no(plane_state->uapi.visible));
-   drm_dbg_kms(&i915->drm, "\trotation: 0x%x, scaler: %d\n",
-   plane_state->hw.rotation, plane_state->scaler_id);
+   drm_dbg_kms(&i915->drm, "\trotation: 0x%x, scaler: %d, scaling_filter: 
%d\n",
+   plane_state->hw.rotation, plane_state->scaler_id, 
plane_state->hw.scaling_filter);
if (plane_state->uapi.visible)
drm_dbg_kms(&i915->drm,
"\tsrc: " DRM_RECT_FP_FMT " dst: " DRM_RECT_FMT 
"\n",
@@ -262,10 +262,11 @@ void intel_crtc_state_dump(const struct intel_crtc_state 
*pipe_config,
 
if (DISPLAY_VER(i915) >= 9)
drm_dbg_kms(&i915->drm,
-   "num_scalers: %d, scaler_users: 0x%x, scaler_id: 
%d\n",
+   "num_scalers: %d, scaler_users: 0x%x, scaler_id: 
%d, scaling_filter: %d\n",
crtc->num_scalers,
pipe_config->scaler_state.scaler_users,
-   pipe_config->scaler_state.scaler_id);
+   pipe_config->scaler_state.scaler_id,
+   pipe_config->hw.scaling_filter);
 
if (HAS_GMCH(i915))
drm_dbg_kms(&i915->drm,
diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c 
b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
index 6c3954479047..225b6bfc783c 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -722,10 +722,11 @@ static void intel_scaler_info(struct seq_file *m, struct 
intel_crtc *crtc)
 
/* Not all platformas have a scaler */
if (num_scalers) {
-   seq_printf(m, "\tnum_scalers=%d, scaler_users=%x scaler_id=%d",
+   seq_printf(m, "\tnum_scalers=%d, scaler_users=%x scaler_id=%d 
scaling_filter=%d",
   num_scalers,
   crtc_state->scaler_state.scaler_users,
-  crtc_state->scaler_state.scaler_id);
+  crtc_state->scaler_state.scaler_id,
+  crtc_state->hw.scaling_filter);
 
for (i = 0; i < num_scalers; i++) {
const struct intel_scaler *sc =
-- 
2.25.1



[Intel-gfx] [v3][PATCH] drm/i915/display: Drop redundant debug print

2021-08-12 Thread Swati Sharma
drm_dp_dpcd_read/write already has debug error message.
Drop redundant error messages which gives false
status even if correct value is read in drm_dp_dpcd_read().

v2: -Added fixes tag (Ankit)
v3: -Fixed build error (CI)

Fixes: 9488a030ac91 ("drm/i915: Add support for enabling link status and 
recovery")
Cc: Swati Sharma 
Cc: Ankit Nautiyal 
Cc: Uma Shankar  (v2)
Cc: Jani Nikula 
Cc: "Ville Syrj_l_" 
Cc: Imre Deak 
Cc: Manasi Navare 
Cc: Uma Shankar 
Cc: "Jos_ Roberto de Souza" 
Cc: Sean Paul 
Cc:  # v5.12+

Link: 
https://patchwork.freedesktop.org/patch/msgid/20201218103723.30844-12-ankit.k.nauti...@intel.com

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_dp.c | 9 ++---
 1 file changed, 2 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index c386ef8eb200..2526c9c8c690 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -3864,23 +3864,18 @@ static void intel_dp_check_device_service_irq(struct 
intel_dp *intel_dp)
 
 static void intel_dp_check_link_service_irq(struct intel_dp *intel_dp)
 {
-   struct drm_i915_private *i915 = dp_to_i915(intel_dp);
u8 val;
 
if (intel_dp->dpcd[DP_DPCD_REV] < 0x11)
return;
 
if (drm_dp_dpcd_readb(&intel_dp->aux,
- DP_LINK_SERVICE_IRQ_VECTOR_ESI0, &val) != 1 || 
!val) {
-   drm_dbg_kms(&i915->drm, "Error in reading link service irq 
vector\n");
+ DP_LINK_SERVICE_IRQ_VECTOR_ESI0, &val) != 1 || 
!val)
return;
-   }
 
if (drm_dp_dpcd_writeb(&intel_dp->aux,
-  DP_LINK_SERVICE_IRQ_VECTOR_ESI0, val) != 1) {
-   drm_dbg_kms(&i915->drm, "Error in writing link service irq 
vector\n");
+  DP_LINK_SERVICE_IRQ_VECTOR_ESI0, val) != 1)
return;
-   }
 
if (val & HDMI_LINK_STATUS_CHANGED)
intel_dp_handle_hdmi_link_status_change(intel_dp);
-- 
2.25.1



[Intel-gfx] [PATCH] drm/i915/display: Drop redundant debug print

2021-08-12 Thread Swati Sharma
drm_dp_dpcd_read/write already has debug error message.
Drop redundant error messages which gives false
status even if correct value is read in drm_dp_dpcd_read().

Fixes: 9488a030ac91 ("drm/i915: Add support for enabling link status and 
recovery")
Cc: Swati Sharma 
Cc: Ankit Nautiyal 
Cc: Uma Shankar  (v2)
Cc: Jani Nikula 
Cc: "Ville Syrj_l_" 
Cc: Imre Deak 
Cc: Manasi Navare 
Cc: Uma Shankar 
Cc: "Jos_ Roberto de Souza" 
Cc: Sean Paul 
Cc:  # v5.12+

Link: 
https://patchwork.freedesktop.org/patch/msgid/20201218103723.30844-12-ankit.k.nauti...@intel.com
Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_dp.c | 8 ++--
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index c386ef8eb200..5c84f51ad41d 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -3871,16 +3871,12 @@ static void intel_dp_check_link_service_irq(struct 
intel_dp *intel_dp)
return;
 
if (drm_dp_dpcd_readb(&intel_dp->aux,
- DP_LINK_SERVICE_IRQ_VECTOR_ESI0, &val) != 1 || 
!val) {
-   drm_dbg_kms(&i915->drm, "Error in reading link service irq 
vector\n");
+ DP_LINK_SERVICE_IRQ_VECTOR_ESI0, &val) != 1 || 
!val)
return;
-   }
 
if (drm_dp_dpcd_writeb(&intel_dp->aux,
-  DP_LINK_SERVICE_IRQ_VECTOR_ESI0, val) != 1) {
-   drm_dbg_kms(&i915->drm, "Error in writing link service irq 
vector\n");
+  DP_LINK_SERVICE_IRQ_VECTOR_ESI0, val) != 1)
return;
-   }
 
if (val & HDMI_LINK_STATUS_CHANGED)
intel_dp_handle_hdmi_link_status_change(intel_dp);
-- 
2.25.1



[Intel-gfx] [PATCH] drm/i915/display: Drop redundant debug print

2021-07-26 Thread Swati Sharma
drm_dp_dpcd_read/write already has debug error message.
Drop redundant error messages which gives false
status even if correct value is read in drm_dp_dpcd_read().

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_dp.c | 8 ++--
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index c386ef8eb200..5c84f51ad41d 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -3871,16 +3871,12 @@ static void intel_dp_check_link_service_irq(struct 
intel_dp *intel_dp)
return;
 
if (drm_dp_dpcd_readb(&intel_dp->aux,
- DP_LINK_SERVICE_IRQ_VECTOR_ESI0, &val) != 1 || 
!val) {
-   drm_dbg_kms(&i915->drm, "Error in reading link service irq 
vector\n");
+ DP_LINK_SERVICE_IRQ_VECTOR_ESI0, &val) != 1 || 
!val)
return;
-   }
 
if (drm_dp_dpcd_writeb(&intel_dp->aux,
-  DP_LINK_SERVICE_IRQ_VECTOR_ESI0, val) != 1) {
-   drm_dbg_kms(&i915->drm, "Error in writing link service irq 
vector\n");
+  DP_LINK_SERVICE_IRQ_VECTOR_ESI0, val) != 1)
return;
-   }
 
if (val & HDMI_LINK_STATUS_CHANGED)
intel_dp_handle_hdmi_link_status_change(intel_dp);
-- 
2.25.1

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


[Intel-gfx] [RFC][PATCH 3/3] drm/i915: Implement readout for AVI infoframe SDP

2020-12-18 Thread Swati Sharma
In this patch readout for AVI infoframes enclosed in GMP
DIP is implemented.

Signed-off-by: Swati Sharma 
Signed-off-by: Ankit Nautiyal 
---
 drivers/gpu/drm/i915/display/intel_dp.c | 74 -
 1 file changed, 72 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index d96e69dd2197..4821c96991f2 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -5738,6 +5738,44 @@ intel_dp_hdr_metadata_infoframe_sdp_unpack(struct 
hdmi_drm_infoframe *drm_infofr
return ret;
 }
 
+static int
+intel_dp_avi_infoframe_sdp_unpack(union hdmi_infoframe *frame,
+ const void *buffer, size_t size)
+{
+   int ret;
+
+   const struct dp_sdp *sdp = buffer;
+
+   if (size < sizeof(struct dp_sdp))
+   return -EINVAL;
+
+   if (sdp->sdp_header.HB0 != 0)
+   return -EINVAL;
+
+   if (sdp->sdp_header.HB1 != HDMI_INFOFRAME_TYPE_AVI)
+   return -EINVAL;
+
+   if (sdp->sdp_header.HB2 != 0x1D)
+   return -EINVAL;
+
+   if ((sdp->sdp_header.HB3 & 0x3) != 0)
+   return -EINVAL;
+
+   if (((sdp->sdp_header.HB3 >> 2) & 0x3f) != 0x13)
+   return -EINVAL;
+
+   if (sdp->db[0] != 2)
+   return -EINVAL;
+
+   if (sdp->db[1] != HDMI_AVI_INFOFRAME_SIZE)
+   return -EINVAL;
+
+   ret = hdmi_infoframe_unpack(frame, &sdp->db[2],
+   HDMI_DRM_INFOFRAME_SIZE);
+
+   return ret;
+}
+
 static void intel_read_dp_vsc_sdp(struct intel_encoder *encoder,
  struct intel_crtc_state *crtc_state,
  struct drm_dp_vsc_sdp *vsc)
@@ -5790,10 +5828,37 @@ static void 
intel_read_dp_hdr_metadata_infoframe_sdp(struct intel_encoder *encod
"Failed to unpack DP HDR Metadata Infoframe SDP\n");
 }
 
+static void intel_read_dp_avi_infoframe_sdp(struct intel_encoder *encoder,
+   struct intel_crtc_state *crtc_state,
+   union hdmi_infoframe *frame)
+{
+   struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
+   struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+   unsigned int type = HDMI_PACKET_TYPE_GAMUT_METADATA;
+   struct dp_sdp sdp = {};
+   int ret;
+
+   if ((crtc_state->infoframes.enable &
+   intel_hdmi_infoframe_enable(type)) == 0)
+   return;
+
+   dig_port->read_infoframe(encoder, crtc_state, type, &sdp,
+sizeof(sdp));
+
+   ret = intel_dp_avi_infoframe_sdp_unpack(frame, &sdp,
+   sizeof(sdp));
+
+   if (ret)
+   drm_dbg_kms(&dev_priv->drm,
+   "Failed to unpack DP AVI Infoframe SDP\n");
+}
+
 void intel_read_dp_sdp(struct intel_encoder *encoder,
   struct intel_crtc_state *crtc_state,
   unsigned int type)
 {
+   struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
+
if (encoder->type != INTEL_OUTPUT_DDI)
return;
 
@@ -5803,8 +5868,13 @@ void intel_read_dp_sdp(struct intel_encoder *encoder,
  &crtc_state->infoframes.vsc);
break;
case HDMI_PACKET_TYPE_GAMUT_METADATA:
-   intel_read_dp_hdr_metadata_infoframe_sdp(encoder, crtc_state,
-
&crtc_state->infoframes.drm.drm);
+   if (intel_dp_is_hdmi_2_1_sink(intel_dp)) {
+   intel_read_dp_avi_infoframe_sdp(encoder, crtc_state,
+   
&crtc_state->infoframes.avi);
+   } else {
+   intel_read_dp_hdr_metadata_infoframe_sdp(encoder, 
crtc_state,
+
&crtc_state->infoframes.drm.drm);
+   }
break;
default:
MISSING_CASE(type);
-- 
2.25.1

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


[Intel-gfx] [RFC][PATCH 2/3] drm/i915: Sending AVI infoframe through GMP DIP

2020-12-18 Thread Swati Sharma
DP does not support sending AVI info frame to panel. So we need to
send AVI info frame to HDMI through some other DIP.

When DP-to-HDMI protocol converter is present GMP DIP will be used
to send AVI infoframe instead of static HDR infoframes.

While VESA spec indicates support within PCON to built AVI IF, it
gives better control with source sending the infoframe by itself as
per HDMI/CTA spec. Minimum of version 3 need to be used for VIC >= 128
(i.e. for 8k mode as an example).

Signed-off-by: Swati Sharma 
Signed-off-by: Ankit Nautiyal 
---
 drivers/gpu/drm/i915/display/intel_dp.c | 135 ++--
 1 file changed, 100 insertions(+), 35 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index a776e7f809b4..d96e69dd2197 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -2779,6 +2779,22 @@ intel_dp_compute_hdr_metadata_infoframe_sdp(struct 
intel_dp *intel_dp,
intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GAMUT_METADATA);
 }
 
+static void
+intel_dp_compute_avi_infoframe_sdp(struct intel_encoder *encoder,
+  struct intel_crtc_state *crtc_state,
+  struct drm_connector_state *conn_state)
+{
+   struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+
+   if (!intel_hdmi_compute_avi_infoframe(encoder, crtc_state, conn_state)) 
{
+   drm_dbg_kms(&dev_priv->drm, "bad AVI infoframe\n");
+   return;
+   }
+
+   crtc_state->infoframes.enable |=
+   intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GAMUT_METADATA);
+}
+
 static void
 intel_dp_drrs_compute_config(struct intel_dp *intel_dp,
 struct intel_crtc_state *pipe_config,
@@ -2807,6 +2823,38 @@ intel_dp_drrs_compute_config(struct intel_dp *intel_dp,
   constant_n, pipe_config->fec_enable);
 }
 
+static int intel_dp_hdmi_sink_max_frl(struct intel_dp *intel_dp)
+{
+   struct intel_connector *intel_connector = intel_dp->attached_connector;
+   struct drm_connector *connector = &intel_connector->base;
+   int max_frl_rate;
+   int max_lanes, rate_per_lane;
+   int max_dsc_lanes, dsc_rate_per_lane;
+
+   max_lanes = connector->display_info.hdmi.max_lanes;
+   rate_per_lane = connector->display_info.hdmi.max_frl_rate_per_lane;
+   max_frl_rate = max_lanes * rate_per_lane;
+
+   if (connector->display_info.hdmi.dsc_cap.v_1p2) {
+   max_dsc_lanes = connector->display_info.hdmi.dsc_cap.max_lanes;
+   dsc_rate_per_lane = 
connector->display_info.hdmi.dsc_cap.max_frl_rate_per_lane;
+   if (max_dsc_lanes && dsc_rate_per_lane)
+   max_frl_rate = min(max_frl_rate, max_dsc_lanes * 
dsc_rate_per_lane);
+   }
+
+   return max_frl_rate;
+}
+
+static bool intel_dp_is_hdmi_2_1_sink(struct intel_dp *intel_dp)
+{
+   if (drm_dp_is_branch(intel_dp->dpcd) &&
+   intel_dp->has_hdmi_sink &&
+   intel_dp_hdmi_sink_max_frl(intel_dp) > 0)
+   return true;
+
+   return false;
+}
+
 int
 intel_dp_compute_config(struct intel_encoder *encoder,
struct intel_crtc_state *pipe_config,
@@ -2894,7 +2942,13 @@ intel_dp_compute_config(struct intel_encoder *encoder,
intel_dp_drrs_compute_config(intel_dp, pipe_config, output_bpp,
 constant_n);
intel_dp_compute_vsc_sdp(intel_dp, pipe_config, conn_state);
-   intel_dp_compute_hdr_metadata_infoframe_sdp(intel_dp, pipe_config, 
conn_state);
+
+   if (intel_dp_is_hdmi_2_1_sink(intel_dp)) {
+   pipe_config->has_infoframe = true;
+   intel_dp_compute_avi_infoframe_sdp(encoder, pipe_config, 
conn_state);
+   } else {
+   intel_dp_compute_hdr_metadata_infoframe_sdp(intel_dp, 
pipe_config, conn_state);
+   }
 
return 0;
 }
@@ -4043,28 +4097,6 @@ static int intel_dp_pcon_set_frl_mask(int max_frl)
return 0;
 }
 
-static int intel_dp_hdmi_sink_max_frl(struct intel_dp *intel_dp)
-{
-   struct intel_connector *intel_connector = intel_dp->attached_connector;
-   struct drm_connector *connector = &intel_connector->base;
-   int max_frl_rate;
-   int max_lanes, rate_per_lane;
-   int max_dsc_lanes, dsc_rate_per_lane;
-
-   max_lanes = connector->display_info.hdmi.max_lanes;
-   rate_per_lane = connector->display_info.hdmi.max_frl_rate_per_lane;
-   max_frl_rate = max_lanes * rate_per_lane;
-
-   if (connector->display_info.hdmi.dsc_cap.v_1p2) {
-   max_dsc_lanes = connector->display_info.hdmi.dsc_cap.max_lanes;
-   dsc_rate_per_lane = 
connector->display_info.hdmi.dsc_cap.max_frl_rate_per_lane;
-  

[Intel-gfx] [RFC][PATCH 1/3] drm/i915: Export intel_hdmi_compute_avi_infoframe()

2020-12-18 Thread Swati Sharma
Instead of re-writing the avi_infoframe_compute func in intel_dp;
exporting hdmi_compute_avi_infoframe func so that it can be called
directly while encapsulating AVI infoframes in GMP dip.

This is required when HDMI 2.1 PCON (dp to hdmi) is used and we need
to send AVI infoframes to PCON in source control mode.

Signed-off-by: Swati Sharma 
Signed-off-by: Ankit Nautiyal 
---
 drivers/gpu/drm/i915/display/intel_hdmi.c | 8 
 drivers/gpu/drm/i915/display/intel_hdmi.h | 3 +++
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c 
b/drivers/gpu/drm/i915/display/intel_hdmi.c
index 41eb1c175a0e..537739f9f984 100644
--- a/drivers/gpu/drm/i915/display/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
@@ -716,10 +716,9 @@ void intel_read_infoframe(struct intel_encoder *encoder,
frame->any.type, type);
 }
 
-static bool
-intel_hdmi_compute_avi_infoframe(struct intel_encoder *encoder,
-struct intel_crtc_state *crtc_state,
-struct drm_connector_state *conn_state)
+bool intel_hdmi_compute_avi_infoframe(struct intel_encoder *encoder,
+ struct intel_crtc_state *crtc_state,
+ struct drm_connector_state *conn_state)
 {
struct hdmi_avi_infoframe *frame = &crtc_state->infoframes.avi.avi;
const struct drm_display_mode *adjusted_mode =
@@ -772,6 +771,7 @@ intel_hdmi_compute_avi_infoframe(struct intel_encoder 
*encoder,
 
return true;
 }
+EXPORT_SYMBOL(intel_hdmi_compute_avi_infoframe);
 
 static bool
 intel_hdmi_compute_spd_infoframe(struct intel_encoder *encoder,
diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.h 
b/drivers/gpu/drm/i915/display/intel_hdmi.h
index fa1a9b030850..b8e6630d01e3 100644
--- a/drivers/gpu/drm/i915/display/intel_hdmi.h
+++ b/drivers/gpu/drm/i915/display/intel_hdmi.h
@@ -57,5 +57,8 @@ int intel_hdmi_dsc_get_num_slices(const struct 
intel_crtc_state *crtc_state,
  int src_max_slices, int src_max_slice_width,
  int hdmi_max_slices, int hdmi_throughput);
 int intel_hdmi_dsc_get_slice_height(int vactive);
+bool intel_hdmi_compute_avi_infoframe(struct intel_encoder *encoder,
+  struct intel_crtc_state *crtc_state,
+  struct drm_connector_state *conn_state);
 
 #endif /* __INTEL_HDMI_H__ */
-- 
2.25.1

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


[Intel-gfx] [RFC][PATCH 0/3] Infoframe changes for DP-HDMI2.1 PCON

2020-12-18 Thread Swati Sharma
These patches should be applied on top of series
https://patchwork.freedesktop.org/series/82098/
(Add support for DP-HDMI2.1 PCON)

This is good to have feature, even if we don't send any AVI info frame,
PCON is able to create and send it based on DP VSC packets. However,
it gives better control with source sending the infoframe by itself.

TODO:
Need to fix:
[8.906566] i915 :00:02.0: [drm] *ERROR* [CRTC:98:pipe A] mismatch in 
has_infoframe (expected yes, found no)
[8.916828] i915 :00:02.0: [drm] *ERROR* [CRTC:98:pipe A] mismatch in 
infoframes.enable (expected 0x000a, found 0x0002)

Swati Sharma (3):
  drm/i915: Export intel_hdmi_compute_avi_infoframe()
  drm/i915: Sending AVI infoframe through GMP DIP
  drm/i915: Implement readout for AVI infoframe SDP

 drivers/gpu/drm/i915/display/intel_dp.c   | 209 ++
 drivers/gpu/drm/i915/display/intel_hdmi.c |   8 +-
 drivers/gpu/drm/i915/display/intel_hdmi.h |   3 +
 3 files changed, 179 insertions(+), 41 deletions(-)

-- 
2.25.1

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


[Intel-gfx] [PATCH v9] drm/i915/color: Extract icl_read_luts()

2020-03-17 Thread Swati Sharma
For icl+, have hw read out to create hw blob of gamma
lut values. icl+ platforms supports multi segmented gamma
mode by default, add hw lut creation for this mode.

This will be used to validate gamma programming using dsb
(display state buffer) which is a tgl specific feature.

v2: -readout code for multisegmented gamma has to come
 up with some intermediate entries that aren't preserved
 in hardware (Jani N)
-linear interpolation (Ville)
-moved common code to check gamma_enable to specific funcs,
 since icl doesn't support that
v3: -use u16 instead of __u16 [Jani N]
-used single lut [Jani N]
-improved and more readable for loops [Jani N]
-read values directly to actual locations and then fill gaps [Jani N]
-moved cleaning to patch 1 [Jani N]
-renamed icl_read_lut_multi_seg() to icl_read_lut_multi_segment to
 make it similar to icl_load_luts()
-renamed icl_compute_interpolated_gamma_blob() to
 icl_compute_interpolated_gamma_lut_values() more sensible, I guess
v4: -removed interpolated func for creating gamma lut values
-removed readouts of fine and coarse segments, failure to read PAL_PREC_DATA
 correctly
v5: -added gamma_enable check inside read_luts()
v6: -renamed intel_color_lut_entry_equal() to intel_color_lut_entries_equal() 
[Ville]
-changed if-else to switch [Ville]
-removed intel_color_lut_entry_multi_equal() [Ville]
v7: -checkpatch warnings
v8: -rebased
v9: -rebased, aligned with Ville's style of gamma cleanup

Signed-off-by: Swati Sharma 
Reviewed-by: Mika Kahola 
---
 drivers/gpu/drm/i915/display/intel_color.c | 121 ++---
 drivers/gpu/drm/i915/i915_reg.h|   6 +
 2 files changed, 109 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index c1cce93a1c25..98ece9cd7cdd 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -460,6 +460,16 @@ static void ilk_lut_10_pack(struct drm_color_lut *entry, 
u32 val)
entry->blue = 
intel_color_lut_pack(REG_FIELD_GET(PREC_PALETTE_BLUE_MASK, val), 10);
 }
 
+static void icl_lut_multi_seg_pack(struct drm_color_lut *entry, u32 ldw, u32 
udw)
+{
+   entry->red = REG_FIELD_GET(PAL_PREC_MULTI_SEG_RED_UDW_MASK, udw) << 6 |
+  
REG_FIELD_GET(PAL_PREC_MULTI_SEG_RED_LDW_MASK, ldw);
+   entry->green = REG_FIELD_GET(PAL_PREC_MULTI_SEG_GREEN_UDW_MASK, udw) << 
6 |
+
REG_FIELD_GET(PAL_PREC_MULTI_SEG_GREEN_LDW_MASK, ldw);
+   entry->blue = REG_FIELD_GET(PAL_PREC_MULTI_SEG_BLUE_UDW_MASK, udw) << 6 
|
+   
REG_FIELD_GET(PAL_PREC_MULTI_SEG_BLUE_LDW_MASK, ldw);
+}
+
 static void i9xx_color_commit(const struct intel_crtc_state *crtc_state)
 {
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
@@ -893,7 +903,7 @@ icl_load_gcmax(const struct intel_crtc_state *crtc_state,
struct intel_dsb *dsb = intel_dsb_get(crtc);
enum pipe pipe = crtc->pipe;
 
-   /* Fixme: LUT entries are 16 bit only, so we can prog 0x max */
+   /* FIXME LUT entries are 16 bit only, so we can prog 0x max */
intel_dsb_reg_write(dsb, PREC_PAL_GC_MAX(pipe, 0), color->red);
intel_dsb_reg_write(dsb, PREC_PAL_GC_MAX(pipe, 1), color->green);
intel_dsb_reg_write(dsb, PREC_PAL_GC_MAX(pipe, 2), color->blue);
@@ -1630,6 +1640,24 @@ static int glk_gamma_precision(const struct 
intel_crtc_state *crtc_state)
}
 }
 
+static int icl_gamma_precision(const struct intel_crtc_state *crtc_state)
+{
+   if ((crtc_state->gamma_mode & POST_CSC_GAMMA_ENABLE) == 0)
+   return 0;
+
+   switch (crtc_state->gamma_mode & GAMMA_MODE_MODE_MASK) {
+   case GAMMA_MODE_MODE_8BIT:
+   return 8;
+   case GAMMA_MODE_MODE_10BIT:
+   return 10;
+   case GAMMA_MODE_MODE_12BIT_MULTI_SEGMENTED:
+   return 16;
+   default:
+   MISSING_CASE(crtc_state->gamma_mode);
+   return 0;
+   }
+}
+
 int intel_color_get_gamma_bit_precision(const struct intel_crtc_state 
*crtc_state)
 {
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
@@ -1641,7 +1669,9 @@ int intel_color_get_gamma_bit_precision(const struct 
intel_crtc_state *crtc_stat
else
return i9xx_gamma_precision(crtc_state);
} else {
-   if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
+   if (INTEL_GEN(dev_priv) >= 11)
+   return icl_gamma_precision(crtc_state);
+   else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
return glk_gamma_precision(crtc_state);
else if (IS_IRONLAKE(dev_priv))
return 

[Intel-gfx] [PATCH] drm/i915/display: Decrease log level

2020-03-02 Thread Swati Sharma
Converting error to debug print if sink fails to configure scrambling or
TMDS bit clock ratio. In this case, we are timing out while disabling
the scrambling and setting the SCDC ratio, as there is no response
to the I2C SCDC write from the sink device. Error isn't due to something
wrong done from driver side.

Signed-off-by: Swati Sharma 
Suggested-by: Ville Syrjälä 
---
 drivers/gpu/drm/i915/display/intel_ddi.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c 
b/drivers/gpu/drm/i915/display/intel_ddi.c
index 284219da7df8..457ca88cd277 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -3564,8 +3564,9 @@ static void intel_enable_ddi_hdmi(struct intel_encoder 
*encoder,
if (!intel_hdmi_handle_sink_scrambling(encoder, connector,
   
crtc_state->hdmi_high_tmds_clock_ratio,
   crtc_state->hdmi_scrambling))
-   DRM_ERROR("[CONNECTOR:%d:%s] Failed to configure sink 
scrambling/TMDS bit clock ratio\n",
- connector->base.id, connector->name);
+   DRM_DEBUG_KMS("[CONNECTOR:%d:%s] Failed to configure sink "
+ "scrambling/TMDS bit clock ratio\n",
+  connector->base.id, connector->name);
 
/* Display WA #1143: skl,kbl,cfl */
if (IS_GEN9_BC(dev_priv)) {
-- 
2.24.1

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


[Intel-gfx] [PATCH] drm/i915/dsb: Increase log level if DSB engine gets busy

2019-12-25 Thread Swati Sharma
Increase the log level if DSB engine gets busy. If dsb engine
is busy, it should be an error condition to indicate there might be
some difficulty with the hardware.

If DSB engine gets busy, load luts will fail and as per current
driver design if one instance of DSB engine gets busy, we are not
allocating the other instance. So, increase the log level to indicate there
could be an issue with driver/hardware.

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_dsb.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dsb.c 
b/drivers/gpu/drm/i915/display/intel_dsb.c
index ada006a690df..6f67b5dfa128 100644
--- a/drivers/gpu/drm/i915/display/intel_dsb.c
+++ b/drivers/gpu/drm/i915/display/intel_dsb.c
@@ -52,7 +52,7 @@ static inline bool intel_dsb_enable_engine(struct intel_dsb 
*dsb)
 
dsb_ctrl = I915_READ(DSB_CTRL(pipe, dsb->id));
if (DSB_STATUS & dsb_ctrl) {
-   DRM_DEBUG_KMS("DSB engine is busy.\n");
+   DRM_ERROR("DSB engine is busy.\n");
return false;
}
 
@@ -72,7 +72,7 @@ static inline bool intel_dsb_disable_engine(struct intel_dsb 
*dsb)
 
dsb_ctrl = I915_READ(DSB_CTRL(pipe, dsb->id));
if (DSB_STATUS & dsb_ctrl) {
-   DRM_DEBUG_KMS("DSB engine is busy.\n");
+   DRM_ERROR("DSB engine is busy.\n");
return false;
}
 
-- 
2.24.1

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


[Intel-gfx] [PATCH 2/2] FOR_TESTING_ONLY: Print rgb values of hw and sw blobs

2019-11-27 Thread Swati Sharma
Only to print hw and sw lut values/channel.

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index c7d0f37d8899..8f46c785f55a 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1581,6 +1581,8 @@ int intel_color_get_gamma_bit_precision(const struct 
intel_crtc_state *crtc_stat
 static bool err_check(struct drm_color_lut *lut1,
  struct drm_color_lut *lut2, u32 err)
 {
+   DRM_DEBUG_KMS("hw_lut->red=0x%x sw_lut->red=0x%x hw_lut->blue=0x%x 
sw_lut->blue=0x%x hw_lut->green=0x%x sw_lut->green=0x%x", lut2->red, lut1->red, 
lut2->blue, lut1->blue, lut2->green, lut1->green);
+
return ((abs((long)lut2->red - lut1->red)) <= err) &&
((abs((long)lut2->blue - lut1->blue)) <= err) &&
((abs((long)lut2->green - lut1->green)) <= err);
-- 
2.23.0

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

[Intel-gfx] [PATCH 1/2] [v8] drm/i915/color: Extract icl_read_luts()

2019-11-27 Thread Swati Sharma
For icl+, have hw read out to create hw blob of gamma
lut values. icl+ platforms supports multi segmented gamma
mode by default, add hw lut creation for this mode.

This will be used to validate gamma programming using dsb
(display state buffer) which is a tgl specific feature.

Major change done-removal of readouts of coarse and fine segments
because PAL_PREC_DATA register isn't giving propoer values.
State checker limited only to "fine segment"

v2: -readout code for multisegmented gamma has to come
 up with some intermediate entries that aren't preserved
 in hardware (Jani N)
-linear interpolation (Ville)
-moved common code to check gamma_enable to specific funcs,
 since icl doesn't support that
v3: -use u16 instead of __u16 [Jani N]
-used single lut [Jani N]
-improved and more readable for loops [Jani N]
-read values directly to actual locations and then fill gaps [Jani N]
-moved cleaning to patch 1 [Jani N]
-renamed icl_read_lut_multi_seg() to icl_read_lut_multi_segment to
 make it similar to icl_load_luts()
-renamed icl_compute_interpolated_gamma_blob() to
 icl_compute_interpolated_gamma_lut_values() more sensible, I guess
v4: -removed interpolated func for creating gamma lut values
-removed readouts of fine and coarse segments, failure to read PAL_PREC_DATA
 correctly
v5: -added gamma_enable check inside read_luts()
v6: -renamed intel_color_lut_entry_equal() to intel_color_lut_entries_equal() 
[Ville]
-changed if-else to switch [Ville]
-removed intel_color_lut_entry_multi_equal() [Ville]
v7: -checkpatch warnings
v8: -rebased

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 113 +
 drivers/gpu/drm/i915/i915_reg.h|   6 ++
 2 files changed, 101 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 3980e8b50c28..c7d0f37d8899 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -812,7 +812,7 @@ icl_load_gcmax(const struct intel_crtc_state *crtc_state,
struct intel_dsb *dsb = intel_dsb_get(crtc);
enum pipe pipe = crtc->pipe;
 
-   /* Fixme: LUT entries are 16 bit only, so we can prog 0x max */
+   /* FIXME LUT entries are 16 bit only, so we can prog 0x max */
intel_dsb_reg_write(dsb, PREC_PAL_GC_MAX(pipe, 0), color->red);
intel_dsb_reg_write(dsb, PREC_PAL_GC_MAX(pipe, 1), color->green);
intel_dsb_reg_write(dsb, PREC_PAL_GC_MAX(pipe, 2), color->blue);
@@ -1538,6 +1538,24 @@ static int glk_gamma_precision(const struct 
intel_crtc_state *crtc_state)
}
 }
 
+static int icl_gamma_precision(const struct intel_crtc_state *crtc_state)
+{
+   if ((crtc_state->gamma_mode & POST_CSC_GAMMA_ENABLE) == 0)
+   return 0;
+
+   switch (crtc_state->gamma_mode & GAMMA_MODE_MODE_MASK) {
+   case GAMMA_MODE_MODE_8BIT:
+   return 8;
+   case GAMMA_MODE_MODE_10BIT:
+   return 10;
+   case GAMMA_MODE_MODE_12BIT_MULTI_SEGMENTED:
+   return 16;
+   default:
+   MISSING_CASE(crtc_state->gamma_mode);
+   return 0;
+   }
+}
+
 int intel_color_get_gamma_bit_precision(const struct intel_crtc_state 
*crtc_state)
 {
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
@@ -1549,7 +1567,9 @@ int intel_color_get_gamma_bit_precision(const struct 
intel_crtc_state *crtc_stat
else
return i9xx_gamma_precision(crtc_state);
} else {
-   if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
+   if (INTEL_GEN(dev_priv) >= 11)
+   return icl_gamma_precision(crtc_state);
+   else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
return glk_gamma_precision(crtc_state);
else if (IS_IRONLAKE(dev_priv))
return ilk_gamma_precision(crtc_state);
@@ -1566,9 +1586,9 @@ static bool err_check(struct drm_color_lut *lut1,
((abs((long)lut2->green - lut1->green)) <= err);
 }
 
-static bool intel_color_lut_entry_equal(struct drm_color_lut *lut1,
-   struct drm_color_lut *lut2,
-   int lut_size, u32 err)
+static bool intel_color_lut_entries_equal(struct drm_color_lut *lut1,
+ struct drm_color_lut *lut2,
+ int lut_size, u32 err)
 {
int i;
 
@@ -1598,16 +1618,8 @@ bool intel_color_lut_equal(struct drm_property_blob 
*blob1,
lut_size2 = drm_color_lut_size(blob2);
 
/* check sw and hw lut size */
-   switch (gamma_mode) {
-   case GAMMA_MODE_MODE_8BIT:
-   c

[Intel-gfx] [PATCH 0/2] adding gamma state checker for icl+ platforms

2019-11-27 Thread Swati Sharma
In this patch, enabled gamma state checker for ICL and TGL.
Limiting state checker only for super fine segment, since getting
incorrect readbacks for fine and coarse segments. Patch includes fix for
multiple colored screen during boot.

Swati Sharma (2):
  [v8] drm/i915/color: Extract icl_read_luts()
  FOR_TESTING_ONLY: Print rgb values of hw and sw blobs

 drivers/gpu/drm/i915/display/intel_color.c | 115 +
 drivers/gpu/drm/i915/i915_reg.h|   6 ++
 2 files changed, 103 insertions(+), 18 deletions(-)

-- 
2.23.0

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

[Intel-gfx] [PATCH 2/2] FOR_TESTING_ONLY: Print rgb values of hw and sw blobs

2019-10-18 Thread Swati Sharma
Only to print hw and sw lut values/channel.

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 926af86a75d5..5d84036d23ab 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1520,6 +1520,8 @@ int intel_color_get_gamma_bit_precision(const struct 
intel_crtc_state *crtc_stat
 static bool err_check(struct drm_color_lut *lut1,
  struct drm_color_lut *lut2, u32 err)
 {
+   DRM_DEBUG_KMS("hw_lut->red=0x%x sw_lut->red=0x%x hw_lut->blue=0x%x 
sw_lut->blue=0x%x hw_lut->green=0x%x sw_lut->green=0x%x", lut2->red, lut1->red, 
lut2->blue, lut1->blue, lut2->green, lut1->green);
+
return ((abs((long)lut2->red - lut1->red)) <= err) &&
((abs((long)lut2->blue - lut1->blue)) <= err) &&
((abs((long)lut2->green - lut1->green)) <= err);
-- 
2.23.0

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

[Intel-gfx] [PATCH 0/2] adding gamma state checker for icl+ platforms

2019-10-18 Thread Swati Sharma
In this patch, enabled gamma state checker for ICL and TGL.
Limiting state checker only for super fine segment, since getting incorrect
readbacks for fine and coarse segments. Patch includes fix for multiple
colored screen during boot.

Swati Sharma (2):
  [v7] drm/i915/color: Extract icl_read_luts()
  FOR_TESTING_ONLY: Print rgb values of hw and sw blobs

 drivers/gpu/drm/i915/display/intel_color.c | 115 +
 drivers/gpu/drm/i915/i915_reg.h|   6 ++
 2 files changed, 103 insertions(+), 18 deletions(-)

-- 
2.23.0

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

[Intel-gfx] [PATCH 1/2] [v7] drm/i915/color: Extract icl_read_luts()

2019-10-18 Thread Swati Sharma
For icl+, have hw read out to create hw blob of gamma
lut values. icl+ platforms supports multi segmented gamma
mode by default, add hw lut creation for this mode.

This will be used to validate gamma programming using dsb
(display state buffer) which is a tgl specific feature.

Major change done-removal of readouts of coarse and fine segments
because PAL_PREC_DATA register isn't giving propoer values.
State checker limited only to "fine segment"

v2: -readout code for multisegmented gamma has to come
 up with some intermediate entries that aren't preserved
 in hardware (Jani N)
-linear interpolation (Ville)
-moved common code to check gamma_enable to specific funcs,
 since icl doesn't support that
v3: -use u16 instead of __u16 [Jani N]
-used single lut [Jani N]
-improved and more readable for loops [Jani N]
-read values directly to actual locations and then fill gaps [Jani N]
-moved cleaning to patch 1 [Jani N]
-renamed icl_read_lut_multi_seg() to icl_read_lut_multi_segment to
 make it similar to icl_load_luts()
-renamed icl_compute_interpolated_gamma_blob() to
 icl_compute_interpolated_gamma_lut_values() more sensible, I guess
v4: -removed interpolated func for creating gamma lut values
-removed readouts of fine and coarse segments, failure to read PAL_PREC_DATA
 correctly
v5: -added gamma_enable check inside read_luts()
v6: -renamed intel_color_lut_entry_equal() to intel_color_lut_entries_equal() 
[Ville]
-changed if-else to switch [Ville]
-removed intel_color_lut_entry_multi_equal() [Ville]
v7: -checkpatch warnings

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 113 +
 drivers/gpu/drm/i915/i915_reg.h|   6 ++
 2 files changed, 101 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index fa44eb73d088..926af86a75d5 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -812,7 +812,7 @@ icl_load_gcmax(const struct intel_crtc_state *crtc_state,
struct intel_dsb *dsb = intel_dsb_get(crtc);
enum pipe pipe = crtc->pipe;
 
-   /* Fixme: LUT entries are 16 bit only, so we can prog 0x max */
+   /* FIXME LUT entries are 16 bit only, so we can prog 0x max */
intel_dsb_reg_write(dsb, PREC_PAL_GC_MAX(pipe, 0), color->red);
intel_dsb_reg_write(dsb, PREC_PAL_GC_MAX(pipe, 1), color->green);
intel_dsb_reg_write(dsb, PREC_PAL_GC_MAX(pipe, 2), color->blue);
@@ -1477,6 +1477,24 @@ static int glk_gamma_precision(const struct 
intel_crtc_state *crtc_state)
}
 }
 
+static int icl_gamma_precision(const struct intel_crtc_state *crtc_state)
+{
+   if ((crtc_state->gamma_mode & POST_CSC_GAMMA_ENABLE) == 0)
+   return 0;
+
+   switch (crtc_state->gamma_mode & GAMMA_MODE_MODE_MASK) {
+   case GAMMA_MODE_MODE_8BIT:
+   return 8;
+   case GAMMA_MODE_MODE_10BIT:
+   return 10;
+   case GAMMA_MODE_MODE_12BIT_MULTI_SEGMENTED:
+   return 16;
+   default:
+   MISSING_CASE(crtc_state->gamma_mode);
+   return 0;
+   }
+}
+
 int intel_color_get_gamma_bit_precision(const struct intel_crtc_state 
*crtc_state)
 {
struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
@@ -1488,7 +1506,9 @@ int intel_color_get_gamma_bit_precision(const struct 
intel_crtc_state *crtc_stat
else
return i9xx_gamma_precision(crtc_state);
} else {
-   if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
+   if (INTEL_GEN(dev_priv) >= 11)
+   return icl_gamma_precision(crtc_state);
+   else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
return glk_gamma_precision(crtc_state);
else if (IS_IRONLAKE(dev_priv))
return ilk_gamma_precision(crtc_state);
@@ -1505,9 +1525,9 @@ static bool err_check(struct drm_color_lut *lut1,
((abs((long)lut2->green - lut1->green)) <= err);
 }
 
-static bool intel_color_lut_entry_equal(struct drm_color_lut *lut1,
-   struct drm_color_lut *lut2,
-   int lut_size, u32 err)
+static bool intel_color_lut_entries_equal(struct drm_color_lut *lut1,
+ struct drm_color_lut *lut2,
+ int lut_size, u32 err)
 {
int i;
 
@@ -1537,16 +1557,8 @@ bool intel_color_lut_equal(struct drm_property_blob 
*blob1,
lut_size2 = drm_color_lut_size(blob2);
 
/* check sw and hw lut size */
-   switch (gamma_mode) {
-   case GAMMA_MODE_MODE_8BIT:
-   case GAMMA_MODE_MODE_10BIT:
-  

[Intel-gfx] [PATCH 1/2] [v6] drm/i915/color: Extract icl_read_luts()

2019-10-16 Thread Swati Sharma
For icl+, have hw read out to create hw blob of gamma
lut values. icl+ platforms supports multi segmented gamma
mode by default, add hw lut creation for this mode.

This will be used to validate gamma programming using dsb
(display state buffer) which is a tgl specific feature.

Major change done-removal of readouts of coarse and fine segments
because PAL_PREC_DATA register isn't giving propoer values.
State checker limited only to "fine segment"

v2: -readout code for multisegmented gamma has to come
 up with some intermediate entries that aren't preserved
 in hardware (Jani N)
-linear interpolation (Ville)
-moved common code to check gamma_enable to specific funcs,
 since icl doesn't support that
v3: -use u16 instead of __u16 [Jani N]
-used single lut [Jani N]
-improved and more readable for loops [Jani N]
-read values directly to actual locations and then fill gaps [Jani N]
-moved cleaning to patch 1 [Jani N]
-renamed icl_read_lut_multi_seg() to icl_read_lut_multi_segment to
 make it similar to icl_load_luts()
-renamed icl_compute_interpolated_gamma_blob() to
 icl_compute_interpolated_gamma_lut_values() more sensible, I guess
v4: -removed interpolated func for creating gamma lut values
-removed readouts of fine and coarse segments, failure to read PAL_PREC_DATA
 correctly
v5: -added gamma_enable check inside read_luts()
v6: -renamed intel_color_lut_entry_equal() to intel_color_lut_entries_equal() 
[Ville]
-changed if-else to switch [Ville]
-removed intel_color_lut_entry_multi_equal() [Ville]

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 114 +
 drivers/gpu/drm/i915/i915_reg.h|   6 ++
 2 files changed, 102 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index fa44eb73d088..9f46d510aceb 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -812,7 +812,7 @@ icl_load_gcmax(const struct intel_crtc_state *crtc_state,
struct intel_dsb *dsb = intel_dsb_get(crtc);
enum pipe pipe = crtc->pipe;
 
-   /* Fixme: LUT entries are 16 bit only, so we can prog 0x max */
+   /* FIXME LUT entries are 16 bit only, so we can prog 0x max */
intel_dsb_reg_write(dsb, PREC_PAL_GC_MAX(pipe, 0), color->red);
intel_dsb_reg_write(dsb, PREC_PAL_GC_MAX(pipe, 1), color->green);
intel_dsb_reg_write(dsb, PREC_PAL_GC_MAX(pipe, 2), color->blue);
@@ -1477,6 +1477,25 @@ static int glk_gamma_precision(const struct 
intel_crtc_state *crtc_state)
}
 }
 
+static int icl_gamma_precision(const struct intel_crtc_state *crtc_state)
+{
+   if ((crtc_state->gamma_mode & POST_CSC_GAMMA_ENABLE) == 0)
+   return 0;
+
+   switch (crtc_state->gamma_mode & GAMMA_MODE_MODE_MASK) {
+   case GAMMA_MODE_MODE_8BIT:
+   return 8;
+   case GAMMA_MODE_MODE_10BIT:
+   return 10;
+   case GAMMA_MODE_MODE_12BIT_MULTI_SEGMENTED:
+   return 16;
+   default:
+   MISSING_CASE(crtc_state->gamma_mode);
+   return 0;
+   }
+
+}
+
 int intel_color_get_gamma_bit_precision(const struct intel_crtc_state 
*crtc_state)
 {
struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
@@ -1488,7 +1507,9 @@ int intel_color_get_gamma_bit_precision(const struct 
intel_crtc_state *crtc_stat
else
return i9xx_gamma_precision(crtc_state);
} else {
-   if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
+   if (INTEL_GEN(dev_priv) >= 11)
+   return icl_gamma_precision(crtc_state);
+   else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
return glk_gamma_precision(crtc_state);
else if (IS_IRONLAKE(dev_priv))
return ilk_gamma_precision(crtc_state);
@@ -1505,9 +1526,9 @@ static bool err_check(struct drm_color_lut *lut1,
((abs((long)lut2->green - lut1->green)) <= err);
 }
 
-static bool intel_color_lut_entry_equal(struct drm_color_lut *lut1,
-   struct drm_color_lut *lut2,
-   int lut_size, u32 err)
+static bool intel_color_lut_entries_equal(struct drm_color_lut *lut1,
+ struct drm_color_lut *lut2,
+ int lut_size, u32 err)
 {
int i;
 
@@ -1537,16 +1558,8 @@ bool intel_color_lut_equal(struct drm_property_blob 
*blob1,
lut_size2 = drm_color_lut_size(blob2);
 
/* check sw and hw lut size */
-   switch (gamma_mode) {
-   case GAMMA_MODE_MODE_8BIT:
-   case GAMMA_MODE_MODE_10BIT:
-   if (lut_size1 != l

[Intel-gfx] [PATCH 0/2] adding gamma state checker for icl+ platforms

2019-10-16 Thread Swati Sharma
In this patch, enabled gamma state checker for ICL and TGL.
Limiting state checker only for super fine segment, since getting incorrect
readbacks for fine and coarse segments. Patch includes fix for multiple
colored screen during boot.

Swati Sharma (2):
  [v6] drm/i915/color: Extract icl_read_luts()
  FOR_TESTING_ONLY: Print rgb values of hw and sw blobs

 drivers/gpu/drm/i915/display/intel_color.c | 116 +
 drivers/gpu/drm/i915/i915_reg.h|   6 ++
 2 files changed, 104 insertions(+), 18 deletions(-)

-- 
2.23.0

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

[Intel-gfx] [PATCH 2/2] FOR_TESTING_ONLY: Print rgb values of hw and sw blobs

2019-10-16 Thread Swati Sharma
Only to print hw and sw lut values/channel.

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 9f46d510aceb..3854f3fe965b 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1521,6 +1521,8 @@ int intel_color_get_gamma_bit_precision(const struct 
intel_crtc_state *crtc_stat
 static bool err_check(struct drm_color_lut *lut1,
  struct drm_color_lut *lut2, u32 err)
 {
+   DRM_DEBUG_KMS("hw_lut->red=0x%x sw_lut->red=0x%x hw_lut->blue=0x%x 
sw_lut->blue=0x%x hw_lut->green=0x%x sw_lut->green=0x%x", lut2->red, lut1->red, 
lut2->blue, lut1->blue, lut2->green, lut1->green);
+
return ((abs((long)lut2->red - lut1->red)) <= err) &&
((abs((long)lut2->blue - lut1->blue)) <= err) &&
((abs((long)lut2->green - lut1->green)) <= err);
-- 
2.23.0

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

[Intel-gfx] [PATCH 3/4] [v5] drm/i915/color: Extract icl_read_luts()

2019-10-09 Thread Swati Sharma
For icl+, have hw read out to create hw blob of gamma
lut values. icl+ platforms supports multi segmented gamma
mode by default, add hw lut creation for this mode.

This will be used to validate gamma programming using dsb
(display state buffer) which is a tgl specific feature.

Major change done-removal of readouts of coarse and fine segments
because PAL_PREC_DATA register isn't giving propoer values.
State checker limited only to "fine segment"

v2: -readout code for multisegmented gamma has to come
 up with some intermediate entries that aren't preserved
 in hardware (Jani N)
-linear interpolation (Ville)
-moved common code to check gamma_enable to specific funcs,
 since icl doesn't support that
v3: -use u16 instead of __u16 [Jani N]
-used single lut [Jani N]
-improved and more readable for loops [Jani N]
-read values directly to actual locations and then fill gaps [Jani N]
-moved cleaning to patch 1 [Jani N]
-renamed icl_read_lut_multi_seg() to icl_read_lut_multi_segment to
 make it similar to icl_load_luts()
-renamed icl_compute_interpolated_gamma_blob() to
 icl_compute_interpolated_gamma_lut_values() more sensible, I guess
v4: -removed interpolated func for creating gamma lut values
-removed readouts of fine and coarse segments, failure to read PAL_PREC_DATA
 correctly
v5: -added gamma_enable check inside read_luts()

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 114 ++---
 drivers/gpu/drm/i915/i915_reg.h|   6 ++
 2 files changed, 108 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index fa44eb73d088..614e0ad386ca 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1477,6 +1477,25 @@ static int glk_gamma_precision(const struct 
intel_crtc_state *crtc_state)
}
 }
 
+static int icl_gamma_precision(const struct intel_crtc_state *crtc_state)
+{
+   if ((crtc_state->gamma_mode & POST_CSC_GAMMA_ENABLE) == 0)
+   return 0;
+
+   switch (crtc_state->gamma_mode & GAMMA_MODE_MODE_MASK) {
+   case GAMMA_MODE_MODE_8BIT:
+   return 8;
+   case GAMMA_MODE_MODE_10BIT:
+   return 10;
+   case GAMMA_MODE_MODE_12BIT_MULTI_SEGMENTED:
+   return 16;
+   default:
+   MISSING_CASE(crtc_state->gamma_mode);
+   return 0;
+   }
+
+}
+
 int intel_color_get_gamma_bit_precision(const struct intel_crtc_state 
*crtc_state)
 {
struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
@@ -1488,7 +1507,9 @@ int intel_color_get_gamma_bit_precision(const struct 
intel_crtc_state *crtc_stat
else
return i9xx_gamma_precision(crtc_state);
} else {
-   if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
+   if (INTEL_GEN(dev_priv) >= 11)
+   return icl_gamma_precision(crtc_state);
+   else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
return glk_gamma_precision(crtc_state);
else if (IS_IRONLAKE(dev_priv))
return ilk_gamma_precision(crtc_state);
@@ -1519,6 +1540,20 @@ static bool intel_color_lut_entry_equal(struct 
drm_color_lut *lut1,
return true;
 }
 
+static bool intel_color_lut_entry_multi_equal(struct drm_color_lut *lut1,
+ struct drm_color_lut *lut2,
+ int lut_size, u32 err)
+{
+   int i;
+
+   for (i = 0; i < 9; i++) {
+   if (!err_check(&lut1[i], &lut2[i], err))
+   return false;
+   }
+
+   return true;
+}
+
 bool intel_color_lut_equal(struct drm_property_blob *blob1,
   struct drm_property_blob *blob2,
   u32 gamma_mode, u32 bit_precision)
@@ -1537,16 +1572,8 @@ bool intel_color_lut_equal(struct drm_property_blob 
*blob1,
lut_size2 = drm_color_lut_size(blob2);
 
/* check sw and hw lut size */
-   switch (gamma_mode) {
-   case GAMMA_MODE_MODE_8BIT:
-   case GAMMA_MODE_MODE_10BIT:
-   if (lut_size1 != lut_size2)
-   return false;
-   break;
-   default:
-   MISSING_CASE(gamma_mode);
-   return false;
-   }
+   if (lut_size1 != lut_size2)
+   return false;
 
lut1 = blob1->data;
lut2 = blob2->data;
@@ -1554,13 +1581,18 @@ bool intel_color_lut_equal(struct drm_property_blob 
*blob1,
err = 0x >> bit_precision;
 
/* check sw and hw lut entry to be equal */
-   switch (gamma_mode) {
+   switch (gamma_mode & GAMMA_MODE_MODE_MASK) {
case G

[Intel-gfx] [PATCH 1/4] [v3] drm/i915/color: fix broken gamma state-checker during boot

2019-10-09 Thread Swati Sharma
Premature gamma lut prepration and loading which was getting
reflected in first modeset causing different colors on
screen during boot.

Issue: In BIOS, gamma is disabled by default. However, legacy read_luts()
was setting crtc_state->base.gamma_lut and gamma_lut was programmed
with junk values which led to visual artifacts (different
colored screens instead of usual black during boot).

Fix: Calling read_luts() only when gamma is enabled which will happen
after first modeset.

This fix is independent from the revert 1b8588741fdc ("Revert
"drm/i915/color: Extract icl_read_luts()"") and should fix different colors
on screen in legacy platforms too.

v2:
-Added gamma_enable checks inside read_luts() [Ville/Jani N]
-Corrected gamma enable check for CHV [Ville]

v3:
-Added check in ilk_read_luts() [Ville]
-Simplified gamma enable check for CHV [Ville]

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111809
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111885
Tested-by: Jani Saarinen 
Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 21 ++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 9ab34902663e..08d020d4da35 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1613,6 +1613,9 @@ i9xx_read_lut_8(const struct intel_crtc_state *crtc_state)
 
 static void i9xx_read_luts(struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return;
+
crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
 }
 
@@ -1659,6 +1662,9 @@ i965_read_lut_10p6(const struct intel_crtc_state 
*crtc_state)
 
 static void i965_read_luts(struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return;
+
if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT)
crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
else
@@ -1701,10 +1707,10 @@ chv_read_cgm_lut(const struct intel_crtc_state 
*crtc_state)
 
 static void chv_read_luts(struct intel_crtc_state *crtc_state)
 {
-   if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT)
-   crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
-   else
+   if (crtc_state->cgm_mode & CGM_PIPE_MODE_GAMMA)
crtc_state->base.gamma_lut = chv_read_cgm_lut(crtc_state);
+   else
+   i965_read_luts(crtc_state);
 }
 
 static struct drm_property_blob *
@@ -1742,6 +1748,12 @@ ilk_read_lut_10(const struct intel_crtc_state 
*crtc_state)
 
 static void ilk_read_luts(struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return;
+
+   if ((crtc_state->csc_mode & CSC_POSITION_BEFORE_GAMMA) == 0)
+   return;
+
if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT)
crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
else
@@ -1788,6 +1800,9 @@ glk_read_lut_10(const struct intel_crtc_state 
*crtc_state, u32 prec_index)
 
 static void glk_read_luts(struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return;
+
if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT)
crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
else
-- 
2.23.0

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

[Intel-gfx] [PATCH 4/4] FOR_TESTING_ONLY: Print rgb values of hw and sw blobs

2019-10-09 Thread Swati Sharma
Only to print hw and sw lut values/channel.

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 614e0ad386ca..6dd0bd3aca37 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1521,6 +1521,8 @@ int intel_color_get_gamma_bit_precision(const struct 
intel_crtc_state *crtc_stat
 static bool err_check(struct drm_color_lut *lut1,
  struct drm_color_lut *lut2, u32 err)
 {
+   DRM_DEBUG_KMS("hw_lut->red=0x%x sw_lut->red=0x%x hw_lut->blue=0x%x 
sw_lut->blue=0x%x hw_lut->green=0x%x sw_lut->green=0x%x", lut2->red, lut1->red, 
lut2->blue, lut1->blue, lut2->green, lut1->green);
+
return ((abs((long)lut2->red - lut1->red)) <= err) &&
((abs((long)lut2->blue - lut1->blue)) <= err) &&
((abs((long)lut2->green - lut1->green)) <= err);
-- 
2.23.0

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

[Intel-gfx] [PATCH 0/4] fix broken state checker and enable state checker for icl+

2019-10-09 Thread Swati Sharma
In this patch series, basically added 3 patches
 1. Fixing broken state-checker during boot since legacy platforms
i.e. platforms for which state checker was already enabled
 2. Moving gamma_enable checks in bit_precision func() to platform
specific func()
 3. Enabling state checker for ICL and TGL

Swati Sharma (4):
  [v3] drm/i915/color: fix broken gamma state-checker during boot
  [v2] drm/i915/color: move check of gamma_enable to specific
func/platform
  [v5] drm/i915/color: Extract icl_read_luts()
  FOR_TESTING_ONLY: Print rgb values of hw and sw blobs

 drivers/gpu/drm/i915/display/intel_color.c | 149 ++---
 drivers/gpu/drm/i915/i915_reg.h|   6 +
 2 files changed, 137 insertions(+), 18 deletions(-)

-- 
2.23.0

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

[Intel-gfx] [PATCH 2/4] [v2] drm/i915/color: move check of gamma_enable to specific func/platform

2019-10-09 Thread Swati Sharma
Moved common code to check gamma_enable to specific funcs per platform
in bit_precision func. icl doesn't support that and chv has separate
enable knob for CGM LUT.

v2:
-Simplified chv_gamma_precision() [Ville]

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 12 +---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 08d020d4da35..fa44eb73d088 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1420,6 +1420,9 @@ static int icl_color_check(struct intel_crtc_state 
*crtc_state)
 
 static int i9xx_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return 0;
+
switch (crtc_state->gamma_mode) {
case GAMMA_MODE_MODE_8BIT:
return 8;
@@ -1433,6 +1436,9 @@ static int i9xx_gamma_precision(const struct 
intel_crtc_state *crtc_state)
 
 static int ilk_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return 0;
+
if ((crtc_state->csc_mode & CSC_POSITION_BEFORE_GAMMA) == 0)
return 0;
 
@@ -1457,6 +1463,9 @@ static int chv_gamma_precision(const struct 
intel_crtc_state *crtc_state)
 
 static int glk_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return 0;
+
switch (crtc_state->gamma_mode) {
case GAMMA_MODE_MODE_8BIT:
return 8;
@@ -1473,9 +1482,6 @@ int intel_color_get_gamma_bit_precision(const struct 
intel_crtc_state *crtc_stat
struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 
-   if (!crtc_state->gamma_enable)
-   return 0;
-
if (HAS_GMCH(dev_priv)) {
if (IS_CHERRYVIEW(dev_priv))
return chv_gamma_precision(crtc_state);
-- 
2.23.0

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

[Intel-gfx] [PATCH 0/4] fix broken state checker and enable state checker for icl+

2019-10-04 Thread Swati Sharma
In this patch series, basically added 3 patches
 1. Fixing broken state-checker during boot since legacy platforms
i.e. platforms for which state checker was already enabled
 2. Moving gamma_enable checks in bit_precision func() to platform
specific func()
 3. Enabling state checker for ICL and TGL

Swati Sharma (4):
  [v2] drm/i915/color: fix broken gamma state-checker during boot
  drm/i915/color: move check of gamma_enable to specific func/platform
  [v5] drm/i915/color: Extract icl_read_luts()
  FOR_TESTING_ONLY: Print rgb values of hw and sw blobs

 drivers/gpu/drm/i915/display/intel_color.c | 166 ++---
 drivers/gpu/drm/i915/i915_reg.h|   6 +
 2 files changed, 152 insertions(+), 20 deletions(-)

-- 
2.23.0

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

[Intel-gfx] [PATCH 3/4] [v5] drm/i915/color: Extract icl_read_luts()

2019-10-04 Thread Swati Sharma
For icl+, have hw read out to create hw blob of gamma
lut values. icl+ platforms supports multi segmented gamma
mode by default, add hw lut creation for this mode.

This will be used to validate gamma programming using dsb
(display state buffer) which is a tgl specific feature.

Major change done-removal of readouts of coarse and fine segments
because PAL_PREC_DATA register isn't giving propoer values.
State checker limited only to "fine segment"

v2: -readout code for multisegmented gamma has to come
 up with some intermediate entries that aren't preserved
 in hardware (Jani N)
-linear interpolation (Ville)
-moved common code to check gamma_enable to specific funcs,
 since icl doesn't support that
v3: -use u16 instead of __u16 [Jani N]
-used single lut [Jani N]
-improved and more readable for loops [Jani N]
-read values directly to actual locations and then fill gaps [Jani N]
-moved cleaning to patch 1 [Jani N]
-renamed icl_read_lut_multi_seg() to icl_read_lut_multi_segment to
 make it similar to icl_load_luts()
-renamed icl_compute_interpolated_gamma_blob() to
 icl_compute_interpolated_gamma_lut_values() more sensible, I guess
v4: -removed interpolated func for creating gamma lut values
-removed readouts of fine and coarse segments, failure to read PAL_PREC_DATA
 correctly
v5: -added gamma_enable check inside read_luts()

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 114 ++---
 drivers/gpu/drm/i915/i915_reg.h|   6 ++
 2 files changed, 108 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 44ce75f051ad..168e9daae3de 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1484,6 +1484,25 @@ static int glk_gamma_precision(const struct 
intel_crtc_state *crtc_state)
}
 }
 
+static int icl_gamma_precision(const struct intel_crtc_state *crtc_state)
+{
+   if ((crtc_state->gamma_mode & POST_CSC_GAMMA_ENABLE) == 0)
+   return 0;
+
+   switch (crtc_state->gamma_mode & GAMMA_MODE_MODE_MASK) {
+   case GAMMA_MODE_MODE_8BIT:
+   return 8;
+   case GAMMA_MODE_MODE_10BIT:
+   return 10;
+   case GAMMA_MODE_MODE_12BIT_MULTI_SEGMENTED:
+   return 16;
+   default:
+   MISSING_CASE(crtc_state->gamma_mode);
+   return 0;
+   }
+
+}
+
 int intel_color_get_gamma_bit_precision(const struct intel_crtc_state 
*crtc_state)
 {
struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
@@ -1495,7 +1514,9 @@ int intel_color_get_gamma_bit_precision(const struct 
intel_crtc_state *crtc_stat
else
return i9xx_gamma_precision(crtc_state);
} else {
-   if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
+   if (INTEL_GEN(dev_priv) >= 11)
+   return icl_gamma_precision(crtc_state);
+   else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
return glk_gamma_precision(crtc_state);
else if (IS_IRONLAKE(dev_priv))
return ilk_gamma_precision(crtc_state);
@@ -1526,6 +1547,20 @@ static bool intel_color_lut_entry_equal(struct 
drm_color_lut *lut1,
return true;
 }
 
+static bool intel_color_lut_entry_multi_equal(struct drm_color_lut *lut1,
+ struct drm_color_lut *lut2,
+ int lut_size, u32 err)
+{
+   int i;
+
+   for (i = 0; i < 9; i++) {
+   if (!err_check(&lut1[i], &lut2[i], err))
+   return false;
+   }
+
+   return true;
+}
+
 bool intel_color_lut_equal(struct drm_property_blob *blob1,
   struct drm_property_blob *blob2,
   u32 gamma_mode, u32 bit_precision)
@@ -1544,16 +1579,8 @@ bool intel_color_lut_equal(struct drm_property_blob 
*blob1,
lut_size2 = drm_color_lut_size(blob2);
 
/* check sw and hw lut size */
-   switch (gamma_mode) {
-   case GAMMA_MODE_MODE_8BIT:
-   case GAMMA_MODE_MODE_10BIT:
-   if (lut_size1 != lut_size2)
-   return false;
-   break;
-   default:
-   MISSING_CASE(gamma_mode);
-   return false;
-   }
+   if (lut_size1 != lut_size2)
+   return false;
 
lut1 = blob1->data;
lut2 = blob2->data;
@@ -1561,13 +1588,18 @@ bool intel_color_lut_equal(struct drm_property_blob 
*blob1,
err = 0x >> bit_precision;
 
/* check sw and hw lut entry to be equal */
-   switch (gamma_mode) {
+   switch (gamma_mode & GAMMA_MODE_MODE_MASK) {
case G

[Intel-gfx] [PATCH 4/4] FOR_TESTING_ONLY: Print rgb values of hw and sw blobs

2019-10-04 Thread Swati Sharma
Only to print hw and sw lut values/channel.

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 168e9daae3de..2b8706dba746 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1528,6 +1528,8 @@ int intel_color_get_gamma_bit_precision(const struct 
intel_crtc_state *crtc_stat
 static bool err_check(struct drm_color_lut *lut1,
  struct drm_color_lut *lut2, u32 err)
 {
+   DRM_DEBUG_KMS("hw_lut->red=0x%x sw_lut->red=0x%x hw_lut->blue=0x%x 
sw_lut->blue=0x%x hw_lut->green=0x%x sw_lut->green=0x%x", lut2->red, lut1->red, 
lut2->blue, lut1->blue, lut2->green, lut1->green);
+
return ((abs((long)lut2->red - lut1->red)) <= err) &&
((abs((long)lut2->blue - lut1->blue)) <= err) &&
((abs((long)lut2->green - lut1->green)) <= err);
-- 
2.23.0

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

[Intel-gfx] [PATCH 2/4] drm/i915/color: move check of gamma_enable to specific func/platform

2019-10-04 Thread Swati Sharma
Moved common code to check gamma_enable to specific funcs per platform
in bit_precision func. icl doesn't support that and chv has separate
enable knob for CGM LUT.

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 23 +-
 1 file changed, 18 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 8f02313a7fef..44ce75f051ad 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1420,6 +1420,9 @@ static int icl_color_check(struct intel_crtc_state 
*crtc_state)
 
 static int i9xx_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return 0;
+
switch (crtc_state->gamma_mode) {
case GAMMA_MODE_MODE_8BIT:
return 8;
@@ -1433,6 +1436,9 @@ static int i9xx_gamma_precision(const struct 
intel_crtc_state *crtc_state)
 
 static int ilk_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return 0;
+
if ((crtc_state->csc_mode & CSC_POSITION_BEFORE_GAMMA) == 0)
return 0;
 
@@ -1449,14 +1455,24 @@ static int ilk_gamma_precision(const struct 
intel_crtc_state *crtc_state)
 
 static int chv_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
-   if (crtc_state->cgm_mode & CGM_PIPE_MODE_GAMMA)
-   return 10;
+   if (crtc_state->cgm_mode) {
+   if ((crtc_state->cgm_mode & CGM_PIPE_MODE_GAMMA) == 0)
+   return 0;
+   else
+   return 10;
+   }
+
+   if (!crtc_state->gamma_enable)
+   return 0;
else
return i9xx_gamma_precision(crtc_state);
 }
 
 static int glk_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return 0;
+
switch (crtc_state->gamma_mode) {
case GAMMA_MODE_MODE_8BIT:
return 8;
@@ -1473,9 +1489,6 @@ int intel_color_get_gamma_bit_precision(const struct 
intel_crtc_state *crtc_stat
struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 
-   if (!crtc_state->gamma_enable)
-   return 0;
-
if (HAS_GMCH(dev_priv)) {
if (IS_CHERRYVIEW(dev_priv))
return chv_gamma_precision(crtc_state);
-- 
2.23.0

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

[Intel-gfx] [PATCH 1/4] [v2] drm/i915/color: fix broken gamma state-checker during boot

2019-10-04 Thread Swati Sharma
Premature gamma lut prepration and loading which was getting
reflected in first modeset causing different colors on
screen during boot.

Issue: In BIOS, gamma is disabled by default. However, legacy read_luts()
was setting crtc_state->base.gamma_lut and gamma_lut was programmed
with junk values which led to visual artifacts (different
colored screens instead of usual black during boot).

Fix: Calling read_luts() only when gamma is enabled which will happen
after first modeset.

This fix is independent from the revert 1b8588741fdc ("Revert
"drm/i915/color: Extract icl_read_luts()"") and should fix different colors
on screen in legacy platforms too.

-Added gamma_enable checks inside read_luts() [Ville/Jani N]
-Corrected gamma enable check for CHV [Ville]

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111809
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111885
Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 27 +++---
 1 file changed, 24 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 9ab34902663e..8f02313a7fef 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1613,6 +1613,9 @@ i9xx_read_lut_8(const struct intel_crtc_state *crtc_state)
 
 static void i9xx_read_luts(struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return;
+
crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
 }
 
@@ -1659,6 +1662,9 @@ i965_read_lut_10p6(const struct intel_crtc_state 
*crtc_state)
 
 static void i965_read_luts(struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return;
+
if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT)
crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
else
@@ -1701,10 +1707,19 @@ chv_read_cgm_lut(const struct intel_crtc_state 
*crtc_state)
 
 static void chv_read_luts(struct intel_crtc_state *crtc_state)
 {
-   if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT)
-   crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
-   else
+   if (crtc_state->cgm_mode) {
+   if ((crtc_state->cgm_mode & CGM_PIPE_MODE_GAMMA) == 0)
+   return;
+
crtc_state->base.gamma_lut = chv_read_cgm_lut(crtc_state);
+   }
+
+   if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT) {
+   if (!crtc_state->gamma_enable)
+   return;
+
+   crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
+   }
 }
 
 static struct drm_property_blob *
@@ -1742,6 +1757,9 @@ ilk_read_lut_10(const struct intel_crtc_state *crtc_state)
 
 static void ilk_read_luts(struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return;
+
if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT)
crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
else
@@ -1788,6 +1806,9 @@ glk_read_lut_10(const struct intel_crtc_state 
*crtc_state, u32 prec_index)
 
 static void glk_read_luts(struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return;
+
if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT)
crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
else
-- 
2.23.0

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

[Intel-gfx] [PATCH] drm/i915/color: fix broken display in icl+

2019-09-30 Thread Swati Sharma
Premature gamma lut prepration and loading which was getting
reflected in first modeset causing different colors on
screen during boot.

Issue: In BIOS, gamma is disabled by default. However,
legacy_read_luts() was getting called even before the legacy_load_luts()
which was setting crtc_state->base.gamma_lut and gamma_lut was
programmed with junk values which led to visual artifacts (different
colored screens instead of usual black during boot).

Fix: Calling read_luts() only when gamma is enabled which will happen
after first modeset.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111809
Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_display.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index f1328c08f4ad..f89aa4bb9f42 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -10528,7 +10528,9 @@ static bool haswell_get_pipe_config(struct intel_crtc 
*crtc,
i9xx_get_pipe_color_config(pipe_config);
}
 
-   intel_color_get_config(pipe_config);
+   if ((INTEL_GEN(dev_priv) >= 11 && (pipe_config->gamma_mode & 
POST_CSC_GAMMA_ENABLE)) ||
+  (INTEL_GEN(dev_priv) >= 9 && (pipe_config->gamma_enable)))
+   intel_color_get_config(pipe_config);
 
power_domain = POWER_DOMAIN_PIPE_PANEL_FITTER(crtc->pipe);
WARN_ON(power_domain_mask & BIT_ULL(power_domain));
-- 
2.23.0

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

[Intel-gfx] [PATCH] Revert "drm/i915/color: Extract icl_read_luts()"

2019-09-24 Thread Swati Sharma
This reverts commit 84af7649188194a74cdd6437235a5e3c86108f0f.

This is causing problems with the display, displays are all
bright colors.

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 126 +++--
 drivers/gpu/drm/i915/i915_reg.h|   6 -
 2 files changed, 15 insertions(+), 117 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 402151128e1f..9ab34902663e 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1420,9 +1420,6 @@ static int icl_color_check(struct intel_crtc_state 
*crtc_state)
 
 static int i9xx_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
-   if (!crtc_state->gamma_enable)
-   return 0;
-
switch (crtc_state->gamma_mode) {
case GAMMA_MODE_MODE_8BIT:
return 8;
@@ -1436,9 +1433,6 @@ static int i9xx_gamma_precision(const struct 
intel_crtc_state *crtc_state)
 
 static int ilk_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
-   if (!crtc_state->gamma_enable)
-   return 0;
-
if ((crtc_state->csc_mode & CSC_POSITION_BEFORE_GAMMA) == 0)
return 0;
 
@@ -1455,9 +1449,6 @@ static int ilk_gamma_precision(const struct 
intel_crtc_state *crtc_state)
 
 static int chv_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
-   if (!crtc_state->gamma_enable)
-   return 0;
-
if (crtc_state->cgm_mode & CGM_PIPE_MODE_GAMMA)
return 10;
else
@@ -1466,9 +1457,6 @@ static int chv_gamma_precision(const struct 
intel_crtc_state *crtc_state)
 
 static int glk_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
-   if (!crtc_state->gamma_enable)
-   return 0;
-
switch (crtc_state->gamma_mode) {
case GAMMA_MODE_MODE_8BIT:
return 8;
@@ -1480,39 +1468,21 @@ static int glk_gamma_precision(const struct 
intel_crtc_state *crtc_state)
}
 }
 
-static int icl_gamma_precision(const struct intel_crtc_state *crtc_state)
-{
-   if ((crtc_state->gamma_mode & POST_CSC_GAMMA_ENABLE) == 0)
-   return 0;
-
-   switch (crtc_state->gamma_mode & GAMMA_MODE_MODE_MASK) {
-   case GAMMA_MODE_MODE_8BIT:
-   return 8;
-   case GAMMA_MODE_MODE_10BIT:
-   return 10;
-   case GAMMA_MODE_MODE_12BIT_MULTI_SEGMENTED:
-   return 16;
-   default:
-   MISSING_CASE(crtc_state->gamma_mode);
-   return 0;
-   }
-
-}
-
 int intel_color_get_gamma_bit_precision(const struct intel_crtc_state 
*crtc_state)
 {
struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 
+   if (!crtc_state->gamma_enable)
+   return 0;
+
if (HAS_GMCH(dev_priv)) {
if (IS_CHERRYVIEW(dev_priv))
return chv_gamma_precision(crtc_state);
else
return i9xx_gamma_precision(crtc_state);
} else {
-   if (INTEL_GEN(dev_priv) >= 11)
-   return icl_gamma_precision(crtc_state);
-   else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
+   if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
return glk_gamma_precision(crtc_state);
else if (IS_IRONLAKE(dev_priv))
return ilk_gamma_precision(crtc_state);
@@ -1543,20 +1513,6 @@ static bool intel_color_lut_entry_equal(struct 
drm_color_lut *lut1,
return true;
 }
 
-static bool intel_color_lut_entry_multi_equal(struct drm_color_lut *lut1,
- struct drm_color_lut *lut2,
- int lut_size, u32 err)
-{
-   int i;
-
-   for (i = 0; i < 9; i++) {
-   if (!err_check(&lut1[i], &lut2[i], err))
-   return false;
-   }
-
-   return true;
-}
-
 bool intel_color_lut_equal(struct drm_property_blob *blob1,
   struct drm_property_blob *blob2,
   u32 gamma_mode, u32 bit_precision)
@@ -1575,8 +1531,16 @@ bool intel_color_lut_equal(struct drm_property_blob 
*blob1,
lut_size2 = drm_color_lut_size(blob2);
 
/* check sw and hw lut size */
-   if (lut_size1 != lut_size2)
-   return false;
+   switch (gamma_mode) {
+   case GAMMA_MODE_MODE_8BIT:
+   case GAMMA_MODE_MODE_10BIT:
+   if (lut_size1 != lut_size2)
+   return false;
+   break;
+   default:
+   MISSING_CASE(gamma_mode);
+   return false;
+   }
 
lut1 = blob1->data;
lut2 = blob2->dat

[Intel-gfx] [v4][PATCH 1/3] drm/i915/color: Fix formatting issues

2019-09-22 Thread Swati Sharma
Fixed few formatting issues in multi-segmented load_lut().

v3: -style nitting [Jani]
-balanced parentheses moved from patch 2 to 1 [Jani]
-subject prefix change [Jani]
-added commit message [Jani]
v4: -rearranged INDEX register write in ilk_read_luts()

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 40 ++
 1 file changed, 19 insertions(+), 21 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 318308d..f774938 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -807,11 +807,11 @@ static u32 ilk_lut_12p4_ldw(const struct drm_color_lut 
*color)
u32 i;
 
/*
-* Every entry in the multi-segment LUT is corresponding to a superfine
-* segment step which is 1/(8 * 128 * 256).
+* Program Super Fine segment (let's call it seg1)...
 *
-* Superfine segment has 9 entries, corresponding to values
-* 0, 1/(8 * 128 * 256), 2/(8 * 128 * 256)  8/(8 * 128 * 256).
+* Super Fine segment's step is 1/(8 * 128 * 256) and it has
+* 9 entries, corresponding to values 0, 1/(8 * 128 * 256),
+* 2/(8 * 128 * 256) ... 8/(8 * 128 * 256).
 */
I915_WRITE(PREC_PAL_MULTI_SEG_INDEX(pipe), PAL_PREC_AUTO_INCREMENT);
 
@@ -837,17 +837,17 @@ static u32 ilk_lut_12p4_ldw(const struct drm_color_lut 
*color)
u32 i;
 
/*
-*
 * Program Fine segment (let's call it seg2)...
 *
-* Fine segment's step is 1/(128 * 256) ie 1/(128 * 256),  2/(128*256)
-* ... 256/(128*256). So in order to program fine segment of LUT we
-* need to pick every 8'th entry in LUT, and program 256 indexes.
+* Fine segment's step is 1/(128 * 256) i.e. 1/(128 * 256), 2/(128 * 
256)
+* ... 256/(128 * 256). So in order to program fine segment of LUT we
+* need to pick every 8th entry in the LUT, and program 256 indexes.
 *
 * PAL_PREC_INDEX[0] and PAL_PREC_INDEX[1] map to seg2[1],
-* with seg2[0] being unused by the hardware.
+* seg2[0] being unused by the hardware.
 */
I915_WRITE(PREC_PAL_INDEX(pipe), PAL_PREC_AUTO_INCREMENT);
+
for (i = 1; i < 257; i++) {
entry = &lut[i * 8];
I915_WRITE(PREC_PAL_DATA(pipe), ilk_lut_12p4_ldw(entry));
@@ -857,8 +857,8 @@ static u32 ilk_lut_12p4_ldw(const struct drm_color_lut 
*color)
/*
 * Program Coarse segment (let's call it seg3)...
 *
-* Coarse segment's starts from index 0 and it's step is 1/256 ie 0,
-* 1/256, 2/256 ...256/256. As per the description of each entry in LUT
+* Coarse segment starts from index 0 and it's step is 1/256 ie 0,
+* 1/256, 2/256 ... 256/256. As per the description of each entry in LUT
 * above, we need to pick every (8 * 128)th entry in LUT, and
 * program 256 of those.
 *
@@ -890,12 +890,10 @@ static void icl_load_luts(const struct intel_crtc_state 
*crtc_state)
case GAMMA_MODE_MODE_8BIT:
i9xx_load_luts(crtc_state);
break;
-
case GAMMA_MODE_MODE_12BIT_MULTI_SEGMENTED:
icl_program_gamma_superfine_segment(crtc_state);
icl_program_gamma_multi_segment(crtc_state);
break;
-
default:
bdw_load_lut_10(crtc, gamma_lut, PAL_PREC_INDEX_VALUE(0));
ivb_load_lut_ext_max(crtc);
@@ -1712,9 +1710,6 @@ static void ilk_read_luts(struct intel_crtc_state 
*crtc_state)
struct drm_color_lut *blob_data;
u32 i, val;
 
-   I915_WRITE(PREC_PAL_INDEX(pipe), prec_index |
-  PAL_PREC_AUTO_INCREMENT);
-
blob = drm_property_create_blob(&dev_priv->drm,
sizeof(struct drm_color_lut) * 
hw_lut_size,
NULL);
@@ -1723,6 +1718,9 @@ static void ilk_read_luts(struct intel_crtc_state 
*crtc_state)
 
blob_data = blob->data;
 
+   I915_WRITE(PREC_PAL_INDEX(pipe), prec_index |
+  PAL_PREC_AUTO_INCREMENT);
+
for (i = 0; i < hw_lut_size; i++) {
val = I915_READ(PREC_PAL_DATA(pipe));
 
@@ -1788,16 +1786,16 @@ void intel_color_init(struct intel_crtc *crtc)
else
dev_priv->display.color_commit = ilk_color_commit;
 
-   if (INTEL_GEN(dev_priv) >= 11)
+   if (INTEL_GEN(dev_priv) >= 11) {
dev_priv->display.load_luts = icl_load_luts;
-   else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv)) {
+   } else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv)) {
dev_priv->display.load_luts

[Intel-gfx] [v4][PATCH 0/3] adding gamma state checker for icl+ platforms

2019-09-22 Thread Swati Sharma
In this patch series, added state checker to validate gamma lut values
for icelake+ platforms. It's extension of the
patch series https://patchwork.freedesktop.org/patch/328246/?series=58039
which enabled the basic infrastructure and state checker for
legacy platforms.
Major changes done in patch 2, details in commit message.

Swati Sharma (3):
  drm/i915/color: Fix formatting issues
  drm/i915/color: Extract icl_read_luts()
  FOR_TESTING_ONLY: Print rgb values of hw and sw blobs

 drivers/gpu/drm/i915/display/intel_color.c | 168 ++---
 drivers/gpu/drm/i915/i915_reg.h|   6 ++
 2 files changed, 138 insertions(+), 36 deletions(-)

-- 
1.9.1

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

[Intel-gfx] [v4][PATCH 2/3] drm/i915/color: Extract icl_read_luts()

2019-09-22 Thread Swati Sharma
For icl+, have hw read out to create hw blob of gamma
lut values. icl+ platforms supports multi segmented gamma
mode by default, add hw lut creation for this mode.

This will be used to validate gamma programming using dsb
(display state buffer) which is a tgl specific feature.

Major change done-removal of readouts of coarse and fine segments
because PAL_PREC_DATA register isn't giving propoer values.
State checker limited only to "fine segment"

v2: -readout code for multisegmented gamma has to come
 up with some intermediate entries that aren't preserved
 in hardware (Jani N)
-linear interpolation (Ville)
-moved common code to check gamma_enable to specific funcs,
 since icl doesn't support that
v3: -use u16 instead of __u16 [Jani N]
-used single lut [Jani N]
-improved and more readable for loops [Jani N]
-read values directly to actual locations and then fill gaps [Jani N]
-moved cleaning to patch 1 [Jani N]
-renamed icl_read_lut_multi_seg() to icl_read_lut_multi_segment to
 make it similar to icl_load_luts()
-renamed icl_compute_interpolated_gamma_blob() to
 icl_compute_interpolated_gamma_lut_values() more sensible, I guess
v4: -removed interpolated func for creating gamma lut values
-removed readouts of fine and coarse segments, failure to read PAL_PREC_DATA
 correctly

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 126 +
 drivers/gpu/drm/i915/i915_reg.h|   6 ++
 2 files changed, 117 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index f774938..299ada5b 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1371,6 +1371,9 @@ static int icl_color_check(struct intel_crtc_state 
*crtc_state)
 
 static int i9xx_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return 0;
+
switch (crtc_state->gamma_mode) {
case GAMMA_MODE_MODE_8BIT:
return 8;
@@ -1384,6 +1387,9 @@ static int i9xx_gamma_precision(const struct 
intel_crtc_state *crtc_state)
 
 static int ilk_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return 0;
+
if ((crtc_state->csc_mode & CSC_POSITION_BEFORE_GAMMA) == 0)
return 0;
 
@@ -1400,6 +1406,9 @@ static int ilk_gamma_precision(const struct 
intel_crtc_state *crtc_state)
 
 static int chv_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return 0;
+
if (crtc_state->cgm_mode & CGM_PIPE_MODE_GAMMA)
return 10;
else
@@ -1408,6 +1417,9 @@ static int chv_gamma_precision(const struct 
intel_crtc_state *crtc_state)
 
 static int glk_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return 0;
+
switch (crtc_state->gamma_mode) {
case GAMMA_MODE_MODE_8BIT:
return 8;
@@ -1419,21 +1431,39 @@ static int glk_gamma_precision(const struct 
intel_crtc_state *crtc_state)
}
 }
 
+static int icl_gamma_precision(const struct intel_crtc_state *crtc_state)
+{
+   if ((crtc_state->gamma_mode & POST_CSC_GAMMA_ENABLE) == 0)
+   return 0;
+
+   switch (crtc_state->gamma_mode & GAMMA_MODE_MODE_MASK) {
+   case GAMMA_MODE_MODE_8BIT:
+   return 8;
+   case GAMMA_MODE_MODE_10BIT:
+   return 10;
+   case GAMMA_MODE_MODE_12BIT_MULTI_SEGMENTED:
+   return 16;
+   default:
+   MISSING_CASE(crtc_state->gamma_mode);
+   return 0;
+   }
+
+}
+
 int intel_color_get_gamma_bit_precision(const struct intel_crtc_state 
*crtc_state)
 {
struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 
-   if (!crtc_state->gamma_enable)
-   return 0;
-
if (HAS_GMCH(dev_priv)) {
if (IS_CHERRYVIEW(dev_priv))
return chv_gamma_precision(crtc_state);
else
return i9xx_gamma_precision(crtc_state);
} else {
-   if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
+   if (INTEL_GEN(dev_priv) >= 11)
+   return icl_gamma_precision(crtc_state);
+   else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
return glk_gamma_precision(crtc_state);
else if (IS_IRONLAKE(dev_priv))
return ilk_gamma_precision(crtc_state);
@@ -1464,6 +1494,20 @@ static bool intel_color_lut_entry_equal(struct 
drm_color_lut 

[Intel-gfx] [v4][PATCH 3/3] FOR_TESTING_ONLY: Print rgb values of hw and sw blobs

2019-09-22 Thread Swati Sharma
Only to print hw and sw lut values/channel.

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 299ada5b..3508d6a 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1475,6 +1475,8 @@ int intel_color_get_gamma_bit_precision(const struct 
intel_crtc_state *crtc_stat
 static bool err_check(struct drm_color_lut *lut1,
  struct drm_color_lut *lut2, u32 err)
 {
+   DRM_DEBUG_KMS("hw_lut->red=0x%x sw_lut->red=0x%x hw_lut->blue=0x%x 
sw_lut->blue=0x%x hw_lut->green=0x%x sw_lut->green=0x%x", lut2->red, lut1->red, 
lut2->blue, lut1->blue, lut2->green, lut1->green);
+
return ((abs((long)lut2->red - lut1->red)) <= err) &&
((abs((long)lut2->blue - lut1->blue)) <= err) &&
((abs((long)lut2->green - lut1->green)) <= err);
-- 
1.9.1

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

[Intel-gfx] [v3][PATCH 3/3] FOR_TESTING_ONLY: Print rgb values of hw and sw blobs

2019-09-19 Thread Swati Sharma
Only to print hw and sw lut values/channel.

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index ad548ce..a7a2fa0 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1475,6 +1475,8 @@ int intel_color_get_gamma_bit_precision(const struct 
intel_crtc_state *crtc_stat
 static bool err_check(struct drm_color_lut *lut1,
  struct drm_color_lut *lut2, u32 err)
 {
+   DRM_DEBUG_KMS("hw_lut->red=0x%x sw_lut->red=0x%x hw_lut->blue=0x%x 
sw_lut->blue=0x%x hw_lut->green=0x%x sw_lut->green=0x%x", lut2->red, lut1->red, 
lut2->blue, lut1->blue, lut2->green, lut1->green);
+
return ((abs((long)lut2->red - lut1->red)) <= err) &&
((abs((long)lut2->blue - lut1->blue)) <= err) &&
((abs((long)lut2->green - lut1->green)) <= err);
-- 
1.9.1

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

[Intel-gfx] [v3][PATCH 2/3] drm/i915/color: Extract icl_read_luts()

2019-09-19 Thread Swati Sharma
For icl+, have hw read out to create hw blob of gamma
lut values. icl+ platforms supports multi segmented gamma
mode by default, add hw lut creation for this mode.

This will be used to validate gamma programming using dsb
(display state buffer) which is a tgl specific feature.

Following are the main changes done in this patch:
1. gamma_enable checks made specific to platform func()
   since icl doeesn't support that and enable gamma through mode
2. lut[0] and lut[8] enteries should be same superfine and coarse;
   superfine and fine segments respectively, checked twice-no harm
3. Removed temporary lut
4. Coarse segment interpolated gamma values loop start from 2
   instead of 0, since actual h/w values started getting overrided.

v2: -readout code for multisegmented gamma has to come
 up with some intermediate entries that aren't preserved
 in hardware (Jani N)
-linear interpolation (Ville)
-moved common code to check gamma_enable to specific funcs,
 since icl doesn't support that
v3: -use u16 instead of __u16 [Jani N]
-used single lut [Jani N]
-improved and more readable for loops [Jani N]
-read values directly to actual locations and then fill gaps [Jani N]
-moved cleaning to patch 1 [Jani N]
-renamed icl_read_lut_multi_seg() to icl_read_lut_multi_segment to
 make it similar to icl_load_luts()
-renamed icl_compute_interpolated_gamma_blob() to
 icl_compute_interpolated_gamma_lut_values() more sensible, I guess

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 216 +++--
 drivers/gpu/drm/i915/i915_reg.h|   7 +
 2 files changed, 208 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 765482d..ad548ce 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1371,6 +1371,9 @@ static int icl_color_check(struct intel_crtc_state 
*crtc_state)
 
 static int i9xx_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return 0;
+
switch (crtc_state->gamma_mode) {
case GAMMA_MODE_MODE_8BIT:
return 8;
@@ -1384,6 +1387,9 @@ static int i9xx_gamma_precision(const struct 
intel_crtc_state *crtc_state)
 
 static int ilk_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return 0;
+
if ((crtc_state->csc_mode & CSC_POSITION_BEFORE_GAMMA) == 0)
return 0;
 
@@ -1400,6 +1406,9 @@ static int ilk_gamma_precision(const struct 
intel_crtc_state *crtc_state)
 
 static int chv_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return 0;
+
if (crtc_state->cgm_mode & CGM_PIPE_MODE_GAMMA)
return 10;
else
@@ -1408,6 +1417,9 @@ static int chv_gamma_precision(const struct 
intel_crtc_state *crtc_state)
 
 static int glk_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return 0;
+
switch (crtc_state->gamma_mode) {
case GAMMA_MODE_MODE_8BIT:
return 8;
@@ -1419,21 +1431,39 @@ static int glk_gamma_precision(const struct 
intel_crtc_state *crtc_state)
}
 }
 
+static int icl_gamma_precision(const struct intel_crtc_state *crtc_state)
+{
+   if ((crtc_state->gamma_mode & POST_CSC_GAMMA_ENABLE) == 0)
+   return 0;
+
+   switch (crtc_state->gamma_mode & GAMMA_MODE_MODE_MASK) {
+   case GAMMA_MODE_MODE_8BIT:
+   return 8;
+   case GAMMA_MODE_MODE_10BIT:
+   return 10;
+   case GAMMA_MODE_MODE_12BIT_MULTI_SEGMENTED:
+   return 16;
+   default:
+   MISSING_CASE(crtc_state->gamma_mode);
+   return 0;
+   }
+
+}
+
 int intel_color_get_gamma_bit_precision(const struct intel_crtc_state 
*crtc_state)
 {
struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 
-   if (!crtc_state->gamma_enable)
-   return 0;
-
if (HAS_GMCH(dev_priv)) {
if (IS_CHERRYVIEW(dev_priv))
return chv_gamma_precision(crtc_state);
else
return i9xx_gamma_precision(crtc_state);
} else {
-   if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
+   if (INTEL_GEN(dev_priv) >= 11)
+   return icl_gamma_precision(crtc_state);
+   else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
return glk_gamma_precision(crtc_state);
else if (IS_IRONLAKE(dev_priv))
  

[Intel-gfx] [v3][PATCH 1/3] drm/i915/color: Fix formatting issues

2019-09-19 Thread Swati Sharma
Fixed few formatting issues in multi-segmented load_lut().

v3: -style nitting [Jani]
-balanced parentheses moved from patch 2 to 1 [Jani]
-subject prefix change [Jani]
-added commit message [Jani]

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 34 ++
 1 file changed, 16 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 318308d..765482d 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -807,11 +807,11 @@ static u32 ilk_lut_12p4_ldw(const struct drm_color_lut 
*color)
u32 i;
 
/*
-* Every entry in the multi-segment LUT is corresponding to a superfine
-* segment step which is 1/(8 * 128 * 256).
+* Program Super Fine segment (let's call it seg1)...
 *
-* Superfine segment has 9 entries, corresponding to values
-* 0, 1/(8 * 128 * 256), 2/(8 * 128 * 256)  8/(8 * 128 * 256).
+* Super Fine segment's step is 1/(8 * 128 * 256) and it has
+* 9 entries, corresponding to values 0, 1/(8 * 128 * 256),
+* 2/(8 * 128 * 256) ... 8/(8 * 128 * 256).
 */
I915_WRITE(PREC_PAL_MULTI_SEG_INDEX(pipe), PAL_PREC_AUTO_INCREMENT);
 
@@ -837,17 +837,17 @@ static u32 ilk_lut_12p4_ldw(const struct drm_color_lut 
*color)
u32 i;
 
/*
-*
 * Program Fine segment (let's call it seg2)...
 *
-* Fine segment's step is 1/(128 * 256) ie 1/(128 * 256),  2/(128*256)
-* ... 256/(128*256). So in order to program fine segment of LUT we
-* need to pick every 8'th entry in LUT, and program 256 indexes.
+* Fine segment's step is 1/(128 * 256) i.e. 1/(128 * 256), 2/(128 * 
256)
+* ... 256/(128 * 256). So in order to program fine segment of LUT we
+* need to pick every 8th entry in the LUT, and program 256 indexes.
 *
 * PAL_PREC_INDEX[0] and PAL_PREC_INDEX[1] map to seg2[1],
-* with seg2[0] being unused by the hardware.
+* seg2[0] being unused by the hardware.
 */
I915_WRITE(PREC_PAL_INDEX(pipe), PAL_PREC_AUTO_INCREMENT);
+
for (i = 1; i < 257; i++) {
entry = &lut[i * 8];
I915_WRITE(PREC_PAL_DATA(pipe), ilk_lut_12p4_ldw(entry));
@@ -857,8 +857,8 @@ static u32 ilk_lut_12p4_ldw(const struct drm_color_lut 
*color)
/*
 * Program Coarse segment (let's call it seg3)...
 *
-* Coarse segment's starts from index 0 and it's step is 1/256 ie 0,
-* 1/256, 2/256 ...256/256. As per the description of each entry in LUT
+* Coarse segment starts from index 0 and it's step is 1/256 ie 0,
+* 1/256, 2/256 ... 256/256. As per the description of each entry in LUT
 * above, we need to pick every (8 * 128)th entry in LUT, and
 * program 256 of those.
 *
@@ -890,12 +890,10 @@ static void icl_load_luts(const struct intel_crtc_state 
*crtc_state)
case GAMMA_MODE_MODE_8BIT:
i9xx_load_luts(crtc_state);
break;
-
case GAMMA_MODE_MODE_12BIT_MULTI_SEGMENTED:
icl_program_gamma_superfine_segment(crtc_state);
icl_program_gamma_multi_segment(crtc_state);
break;
-
default:
bdw_load_lut_10(crtc, gamma_lut, PAL_PREC_INDEX_VALUE(0));
ivb_load_lut_ext_max(crtc);
@@ -1788,16 +1786,16 @@ void intel_color_init(struct intel_crtc *crtc)
else
dev_priv->display.color_commit = ilk_color_commit;
 
-   if (INTEL_GEN(dev_priv) >= 11)
+   if (INTEL_GEN(dev_priv) >= 11) {
dev_priv->display.load_luts = icl_load_luts;
-   else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv)) {
+   } else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv)) {
dev_priv->display.load_luts = glk_load_luts;
dev_priv->display.read_luts = glk_read_luts;
-   } else if (INTEL_GEN(dev_priv) >= 8)
+   } else if (INTEL_GEN(dev_priv) >= 8) {
dev_priv->display.load_luts = bdw_load_luts;
-   else if (INTEL_GEN(dev_priv) >= 7)
+   } else if (INTEL_GEN(dev_priv) >= 7) {
dev_priv->display.load_luts = ivb_load_luts;
-   else {
+   } else {
dev_priv->display.load_luts = ilk_load_luts;
dev_priv->display.read_luts = ilk_read_luts;
}
-- 
1.9.1

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

[Intel-gfx] [v3][PATCH 0/3] adding gamma state checker for icl+ platforms

2019-09-19 Thread Swati Sharma
In this patch series, added state checker to validate gamma lut values
for icelake+ platforms. It's extension of the
patch series https://patchwork.freedesktop.org/patch/328246/?series=58039
which enabled the basic infrastructure and state checker for
legacy platforms.
Major changes done in patch 2, details in commit message.

Swati Sharma (3):
  drm/i915/color: Fix formatting issues
  drm/i915/color: Extract icl_read_luts()
  FOR_TESTING_ONLY: Print rgb values of hw and sw blobs

 drivers/gpu/drm/i915/display/intel_color.c | 252 +
 drivers/gpu/drm/i915/i915_reg.h|   7 +
 2 files changed, 226 insertions(+), 33 deletions(-)

-- 
1.9.1

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

[Intel-gfx] [v2][PATCH 1/3] drm/i915/display: Fix formatting issues

2019-09-17 Thread Swati Sharma
Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 15 ++-
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 318308d..b1f0f7e 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -807,11 +807,11 @@ static u32 ilk_lut_12p4_ldw(const struct drm_color_lut 
*color)
u32 i;
 
/*
-* Every entry in the multi-segment LUT is corresponding to a superfine
-* segment step which is 1/(8 * 128 * 256).
+* Program Super Fine segment (let's call it seg1)...
 *
-* Superfine segment has 9 entries, corresponding to values
-* 0, 1/(8 * 128 * 256), 2/(8 * 128 * 256)  8/(8 * 128 * 256).
+* Super Fine segment's step is 1/(8 * 128 * 256) and it has
+* 9 entries, corresponding to values 0, 1/(8 * 128 * 256),
+* 2/(8 * 128 * 256) ... 8/(8 * 128 * 256).
 */
I915_WRITE(PREC_PAL_MULTI_SEG_INDEX(pipe), PAL_PREC_AUTO_INCREMENT);
 
@@ -837,10 +837,9 @@ static u32 ilk_lut_12p4_ldw(const struct drm_color_lut 
*color)
u32 i;
 
/*
-*
 * Program Fine segment (let's call it seg2)...
 *
-* Fine segment's step is 1/(128 * 256) ie 1/(128 * 256),  2/(128*256)
+* Fine segment's step is 1/(128 * 256) i.e. 1/(128 * 256),  2/(128*256)
 * ... 256/(128*256). So in order to program fine segment of LUT we
 * need to pick every 8'th entry in LUT, and program 256 indexes.
 *
@@ -858,7 +857,7 @@ static u32 ilk_lut_12p4_ldw(const struct drm_color_lut 
*color)
 * Program Coarse segment (let's call it seg3)...
 *
 * Coarse segment's starts from index 0 and it's step is 1/256 ie 0,
-* 1/256, 2/256 ...256/256. As per the description of each entry in LUT
+* 1/256, 2/256 ... 256/256. As per the description of each entry in LUT
 * above, we need to pick every (8 * 128)th entry in LUT, and
 * program 256 of those.
 *
@@ -890,12 +889,10 @@ static void icl_load_luts(const struct intel_crtc_state 
*crtc_state)
case GAMMA_MODE_MODE_8BIT:
i9xx_load_luts(crtc_state);
break;
-
case GAMMA_MODE_MODE_12BIT_MULTI_SEGMENTED:
icl_program_gamma_superfine_segment(crtc_state);
icl_program_gamma_multi_segment(crtc_state);
break;
-
default:
bdw_load_lut_10(crtc, gamma_lut, PAL_PREC_INDEX_VALUE(0));
ivb_load_lut_ext_max(crtc);
-- 
1.9.1

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

[Intel-gfx] [v2][PATCH 3/3] FOR_TESTING_ONLY: Print rgb values of hw and sw blobs

2019-09-17 Thread Swati Sharma
Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 0008011..4bf098f 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1474,6 +1474,8 @@ int intel_color_get_gamma_bit_precision(const struct 
intel_crtc_state *crtc_stat
 static bool err_check(struct drm_color_lut *lut1,
  struct drm_color_lut *lut2, u32 err)
 {
+   DRM_DEBUG_KMS("hw_lut->red=0x%x sw_lut->red=0x%x hw_lut->blue=0x%x 
sw_lut->blue=0x%x hw_lut->green=0x%x sw_lut->green=0x%x", lut2->red, lut1->red, 
lut2->blue, lut1->blue, lut2->green, lut1->green);
+
return ((abs((long)lut2->red - lut1->red)) <= err) &&
((abs((long)lut2->blue - lut1->blue)) <= err) &&
((abs((long)lut2->green - lut1->green)) <= err);
-- 
1.9.1

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

[Intel-gfx] [v2][PATCH 0/3] adding gamma state checker for icl+ platforms

2019-09-17 Thread Swati Sharma
In this patch series, added state checker to validate gamma lut values
for icelake+ platforms. It's extension of the
patch series https://patchwork.freedesktop.org/patch/328246/?series=58039
which enabled the basic infrastructure and state checker for
legacy platforms.

Swati Sharma (3):
  drm/i915/display: Fix formatting issues
  drm/i915/display: Extract icl_read_luts()
  FOR_TESTING_ONLY: Print rgb values of hw and sw blobs

 drivers/gpu/drm/i915/display/intel_color.c | 260 +
 drivers/gpu/drm/i915/i915_reg.h|   7 +
 2 files changed, 238 insertions(+), 29 deletions(-)

-- 
1.9.1

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

[Intel-gfx] [v2][PATCH 2/3] drm/i915/display: Extract icl_read_luts()

2019-09-17 Thread Swati Sharma
For icl+, have hw read out to create hw blob of gamma
lut values. icl+ platforms supports multi segmented gamma
mode, add hw lut creation for this mode.

This will be used to validate gamma programming using dsb
(display state buffer) which is a tgl feature.

v2: -readout code for multisegmented gamma has to come
 up with some intermediate entries that aren't preserved
 in hardware (Jani N)
-linear interpolation (Ville)
-moved common code to check gamma_enable to specific funcs,
 since icl doesn't support that

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 243 ++---
 drivers/gpu/drm/i915/i915_reg.h|   7 +
 2 files changed, 230 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index b1f0f7e..0008011 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1370,6 +1370,9 @@ static int icl_color_check(struct intel_crtc_state 
*crtc_state)
 
 static int i9xx_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return 0;
+
switch (crtc_state->gamma_mode) {
case GAMMA_MODE_MODE_8BIT:
return 8;
@@ -1383,6 +1386,9 @@ static int i9xx_gamma_precision(const struct 
intel_crtc_state *crtc_state)
 
 static int ilk_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return 0;
+
if ((crtc_state->csc_mode & CSC_POSITION_BEFORE_GAMMA) == 0)
return 0;
 
@@ -1399,6 +1405,9 @@ static int ilk_gamma_precision(const struct 
intel_crtc_state *crtc_state)
 
 static int chv_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return 0;
+
if (crtc_state->cgm_mode & CGM_PIPE_MODE_GAMMA)
return 10;
else
@@ -1407,6 +1416,9 @@ static int chv_gamma_precision(const struct 
intel_crtc_state *crtc_state)
 
 static int glk_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return 0;
+
switch (crtc_state->gamma_mode) {
case GAMMA_MODE_MODE_8BIT:
return 8;
@@ -1418,21 +1430,39 @@ static int glk_gamma_precision(const struct 
intel_crtc_state *crtc_state)
}
 }
 
+static int icl_gamma_precision(const struct intel_crtc_state *crtc_state)
+{
+   if ((crtc_state->gamma_mode & POST_CSC_GAMMA_ENABLE) == 0)
+   return 0;
+
+   switch (crtc_state->gamma_mode & GAMMA_MODE_MODE_MASK) {
+   case GAMMA_MODE_MODE_8BIT:
+   return 8;
+   case GAMMA_MODE_MODE_10BIT:
+   return 10;
+   case GAMMA_MODE_MODE_12BIT_MULTI_SEGMENTED:
+   return 16;  
+   default:
+   MISSING_CASE(crtc_state->gamma_mode);
+   return 0;
+   }
+
+}
+
 int intel_color_get_gamma_bit_precision(const struct intel_crtc_state 
*crtc_state)
 {
struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 
-   if (!crtc_state->gamma_enable)
-   return 0;
-
if (HAS_GMCH(dev_priv)) {
if (IS_CHERRYVIEW(dev_priv))
return chv_gamma_precision(crtc_state);
else
return i9xx_gamma_precision(crtc_state);
} else {
-   if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
+   if (INTEL_GEN(dev_priv) >= 11)
+   return icl_gamma_precision(crtc_state);
+   else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
return glk_gamma_precision(crtc_state);
else if (IS_IRONLAKE(dev_priv))
return ilk_gamma_precision(crtc_state);
@@ -1463,6 +1493,30 @@ static bool intel_color_lut_entry_equal(struct 
drm_color_lut *lut1,
return true;
 }
 
+static bool intel_color_lut_entry_multi_equal(struct drm_color_lut *lut1,
+ struct drm_color_lut *lut2,
+ int lut_size, u32 err)
+{
+   int i;
+
+   for (i = 0; i < 9; i++) {
+   if (!err_check(&lut1[i], &lut2[i], err))
+   return false;
+   }
+
+   for (i = 1; i <  257; i++) {
+   if (!err_check(&lut1[i * 8], &lut2[i * 8], err))
+   return false;
+   }
+
+   for (i = 0; i < 256; i++) {
+   if (!err_check(&lut1[i * 8 * 128], &lut2[i * 8 * 128], err))
+   return false;
+   }
+
+   return true;
+}
+
 bool intel_color_lut_equal(struct drm_property

[Intel-gfx] [v2][PATCH 1/2] drm/i915/display: Fix formatting issues

2019-09-17 Thread Swati Sharma
Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 15 ++-
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 318308d..b1f0f7e 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -807,11 +807,11 @@ static u32 ilk_lut_12p4_ldw(const struct drm_color_lut 
*color)
u32 i;
 
/*
-* Every entry in the multi-segment LUT is corresponding to a superfine
-* segment step which is 1/(8 * 128 * 256).
+* Program Super Fine segment (let's call it seg1)...
 *
-* Superfine segment has 9 entries, corresponding to values
-* 0, 1/(8 * 128 * 256), 2/(8 * 128 * 256)  8/(8 * 128 * 256).
+* Super Fine segment's step is 1/(8 * 128 * 256) and it has
+* 9 entries, corresponding to values 0, 1/(8 * 128 * 256),
+* 2/(8 * 128 * 256) ... 8/(8 * 128 * 256).
 */
I915_WRITE(PREC_PAL_MULTI_SEG_INDEX(pipe), PAL_PREC_AUTO_INCREMENT);
 
@@ -837,10 +837,9 @@ static u32 ilk_lut_12p4_ldw(const struct drm_color_lut 
*color)
u32 i;
 
/*
-*
 * Program Fine segment (let's call it seg2)...
 *
-* Fine segment's step is 1/(128 * 256) ie 1/(128 * 256),  2/(128*256)
+* Fine segment's step is 1/(128 * 256) i.e. 1/(128 * 256),  2/(128*256)
 * ... 256/(128*256). So in order to program fine segment of LUT we
 * need to pick every 8'th entry in LUT, and program 256 indexes.
 *
@@ -858,7 +857,7 @@ static u32 ilk_lut_12p4_ldw(const struct drm_color_lut 
*color)
 * Program Coarse segment (let's call it seg3)...
 *
 * Coarse segment's starts from index 0 and it's step is 1/256 ie 0,
-* 1/256, 2/256 ...256/256. As per the description of each entry in LUT
+* 1/256, 2/256 ... 256/256. As per the description of each entry in LUT
 * above, we need to pick every (8 * 128)th entry in LUT, and
 * program 256 of those.
 *
@@ -890,12 +889,10 @@ static void icl_load_luts(const struct intel_crtc_state 
*crtc_state)
case GAMMA_MODE_MODE_8BIT:
i9xx_load_luts(crtc_state);
break;
-
case GAMMA_MODE_MODE_12BIT_MULTI_SEGMENTED:
icl_program_gamma_superfine_segment(crtc_state);
icl_program_gamma_multi_segment(crtc_state);
break;
-
default:
bdw_load_lut_10(crtc, gamma_lut, PAL_PREC_INDEX_VALUE(0));
ivb_load_lut_ext_max(crtc);
-- 
1.9.1

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

[Intel-gfx] [v2][PATCH 2/2] drm/i915/display: Extract icl_read_luts()

2019-09-17 Thread Swati Sharma
For icl+, have hw read out to create hw blob of gamma
lut values. icl+ platforms supports multi segmented gamma
mode, add hw lut creation for this mode.

This will be used to validate gamma programming using dsb
(display state buffer) which is a tgl feature.

v2: -readout code for multisegmented gamma has to come
 up with some intermediate entries that aren't preserved
 in hardware (Jani N)
-linear interpolation (Ville)
-moved common code to check gamma_enable to specific funcs,
 since icl doesn't support that

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 243 ++---
 drivers/gpu/drm/i915/i915_reg.h|   7 +
 2 files changed, 230 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index b1f0f7e..0008011 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1370,6 +1370,9 @@ static int icl_color_check(struct intel_crtc_state 
*crtc_state)
 
 static int i9xx_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return 0;
+
switch (crtc_state->gamma_mode) {
case GAMMA_MODE_MODE_8BIT:
return 8;
@@ -1383,6 +1386,9 @@ static int i9xx_gamma_precision(const struct 
intel_crtc_state *crtc_state)
 
 static int ilk_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return 0;
+
if ((crtc_state->csc_mode & CSC_POSITION_BEFORE_GAMMA) == 0)
return 0;
 
@@ -1399,6 +1405,9 @@ static int ilk_gamma_precision(const struct 
intel_crtc_state *crtc_state)
 
 static int chv_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return 0;
+
if (crtc_state->cgm_mode & CGM_PIPE_MODE_GAMMA)
return 10;
else
@@ -1407,6 +1416,9 @@ static int chv_gamma_precision(const struct 
intel_crtc_state *crtc_state)
 
 static int glk_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
+   if (!crtc_state->gamma_enable)
+   return 0;
+
switch (crtc_state->gamma_mode) {
case GAMMA_MODE_MODE_8BIT:
return 8;
@@ -1418,21 +1430,39 @@ static int glk_gamma_precision(const struct 
intel_crtc_state *crtc_state)
}
 }
 
+static int icl_gamma_precision(const struct intel_crtc_state *crtc_state)
+{
+   if ((crtc_state->gamma_mode & POST_CSC_GAMMA_ENABLE) == 0)
+   return 0;
+
+   switch (crtc_state->gamma_mode & GAMMA_MODE_MODE_MASK) {
+   case GAMMA_MODE_MODE_8BIT:
+   return 8;
+   case GAMMA_MODE_MODE_10BIT:
+   return 10;
+   case GAMMA_MODE_MODE_12BIT_MULTI_SEGMENTED:
+   return 16;  
+   default:
+   MISSING_CASE(crtc_state->gamma_mode);
+   return 0;
+   }
+
+}
+
 int intel_color_get_gamma_bit_precision(const struct intel_crtc_state 
*crtc_state)
 {
struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 
-   if (!crtc_state->gamma_enable)
-   return 0;
-
if (HAS_GMCH(dev_priv)) {
if (IS_CHERRYVIEW(dev_priv))
return chv_gamma_precision(crtc_state);
else
return i9xx_gamma_precision(crtc_state);
} else {
-   if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
+   if (INTEL_GEN(dev_priv) >= 11)
+   return icl_gamma_precision(crtc_state);
+   else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
return glk_gamma_precision(crtc_state);
else if (IS_IRONLAKE(dev_priv))
return ilk_gamma_precision(crtc_state);
@@ -1463,6 +1493,30 @@ static bool intel_color_lut_entry_equal(struct 
drm_color_lut *lut1,
return true;
 }
 
+static bool intel_color_lut_entry_multi_equal(struct drm_color_lut *lut1,
+ struct drm_color_lut *lut2,
+ int lut_size, u32 err)
+{
+   int i;
+
+   for (i = 0; i < 9; i++) {
+   if (!err_check(&lut1[i], &lut2[i], err))
+   return false;
+   }
+
+   for (i = 1; i <  257; i++) {
+   if (!err_check(&lut1[i * 8], &lut2[i * 8], err))
+   return false;
+   }
+
+   for (i = 0; i < 256; i++) {
+   if (!err_check(&lut1[i * 8 * 128], &lut2[i * 8 * 128], err))
+   return false;
+   }
+
+   return true;
+}
+
 bool intel_color_lut_equal(struct drm_property

[Intel-gfx] [v2][PATCH 0/2] adding gamma state checker for icl+ platforms

2019-09-17 Thread Swati Sharma
In this patch series, added state checker to validate gamma lut values
for icelake+ platforms. It's extension of the
patch series https://patchwork.freedesktop.org/patch/328246/?series=58039
which enabled the basic infrastructure and state checker for
legacy platforms.

Swati Sharma (2):
  drm/i915/display: Fix formatting issues
  drm/i915/display: Extract icl_read_luts()

 drivers/gpu/drm/i915/display/intel_color.c | 258 +
 drivers/gpu/drm/i915/i915_reg.h|   7 +
 2 files changed, 236 insertions(+), 29 deletions(-)

-- 
1.9.1

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

[Intel-gfx] [v2][PATCH 0/3] adding gamma state checker for CHV and i965

2019-09-09 Thread Swati Sharma
In this patch series, added state checker to validate gamma lut values
for cherryview and i965 platforms. It's extension of the
patch series https://patchwork.freedesktop.org/patch/328246/?series=58039
which enabled the basic infrastructure and state checker for 
few legacy platforms.

v2: Added last index rgb lut value from PIPEGCMAX to h/w blob [Jani]

Swati Sharma (3):
  drm/i915/display: Add gamma precision function for CHV
  drm/i915/display: Extract i965_read_luts()
  drm/i915/display: Extract chv_read_luts()

 drivers/gpu/drm/i915/display/intel_color.c | 118 +++--
 drivers/gpu/drm/i915/i915_reg.h|   7 ++
 2 files changed, 119 insertions(+), 6 deletions(-)

-- 
1.9.1

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

[Intel-gfx] [v2][PATCH 3/3] drm/i915/display: Extract chv_read_luts()

2019-09-09 Thread Swati Sharma
For cherryview, add hw read out to create hw blob of gamma
lut values.

Review comments from previous series:
https://patchwork.freedesktop.org/patch/328252

v4: -No need to initialize *blob [Jani]
-Removed right shifts [Jani]
-Dropped dev local var [Jani]
v5: -Returned blob instead of assigning it internally within the
 function [Ville]
-Renamed function cherryview_get_color_config() to chv_read_luts()
-Renamed cherryview_get_gamma_config() to chv_read_cgm_gamma_lut()
 [Ville]
v9: -80 character limit [Uma]
-Made read func para as const [Ville, Uma]
-Renamed chv_read_cgm_gamma_lut() to chv_read_cgm_gamma_lut()
 [Ville, Uma]

Signed-off-by: Swati Sharma 
Reviewed-by: Jani Nikula 
---
 drivers/gpu/drm/i915/display/intel_color.c | 43 ++
 drivers/gpu/drm/i915/i915_reg.h|  3 +++
 2 files changed, 46 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 765f858..318308d 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1619,6 +1619,48 @@ static void i965_read_luts(struct intel_crtc_state 
*crtc_state)
 }
 
 static struct drm_property_blob *
+chv_read_cgm_lut(const struct intel_crtc_state *crtc_state)
+{
+   struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
+   struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+   u32 lut_size = INTEL_INFO(dev_priv)->color.gamma_lut_size;
+   enum pipe pipe = crtc->pipe;
+   struct drm_property_blob *blob;
+   struct drm_color_lut *blob_data;
+   u32 i, val;
+
+   blob = drm_property_create_blob(&dev_priv->drm,
+   sizeof(struct drm_color_lut) * lut_size,
+   NULL);
+   if (IS_ERR(blob))
+   return NULL;
+
+   blob_data = blob->data;
+
+   for (i = 0; i < lut_size; i++) {
+   val = I915_READ(CGM_PIPE_GAMMA(pipe, i, 0));
+   blob_data[i].green = intel_color_lut_pack(REG_FIELD_GET(
+ 
CGM_PIPE_GAMMA_GREEN_MASK, val), 10);
+   blob_data[i].blue = intel_color_lut_pack(REG_FIELD_GET(
+
CGM_PIPE_GAMMA_BLUE_MASK, val), 10);
+
+   val = I915_READ(CGM_PIPE_GAMMA(pipe, i, 1));
+   blob_data[i].red = intel_color_lut_pack(REG_FIELD_GET(
+   
CGM_PIPE_GAMMA_RED_MASK, val), 10);
+   }
+
+   return blob;
+}
+
+static void chv_read_luts(struct intel_crtc_state *crtc_state)
+{
+   if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT)
+   crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
+   else
+   crtc_state->base.gamma_lut = chv_read_cgm_lut(crtc_state);
+}
+
+static struct drm_property_blob *
 ilk_read_lut_10(const struct intel_crtc_state *crtc_state)
 {
struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
@@ -1717,6 +1759,7 @@ void intel_color_init(struct intel_crtc *crtc)
dev_priv->display.color_check = chv_color_check;
dev_priv->display.color_commit = i9xx_color_commit;
dev_priv->display.load_luts = chv_load_luts;
+   dev_priv->display.read_luts = chv_read_luts;
} else if (INTEL_GEN(dev_priv) >= 4) {
dev_priv->display.color_check = i9xx_color_check;
dev_priv->display.color_commit = i9xx_color_commit;
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 5ac8a4d..0241c9d 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -10410,6 +10410,9 @@ enum skl_power_gate {
 #define   CGM_PIPE_MODE_GAMMA  (1 << 2)
 #define   CGM_PIPE_MODE_CSC(1 << 1)
 #define   CGM_PIPE_MODE_DEGAMMA(1 << 0)
+#define   CGM_PIPE_GAMMA_RED_MASK   REG_GENMASK(9, 0)
+#define   CGM_PIPE_GAMMA_GREEN_MASK REG_GENMASK(25, 16)
+#define   CGM_PIPE_GAMMA_BLUE_MASK  REG_GENMASK(9, 0)
 
 #define _CGM_PIPE_B_CSC_COEFF01(VLV_DISPLAY_BASE + 0x69900)
 #define _CGM_PIPE_B_CSC_COEFF23(VLV_DISPLAY_BASE + 0x69904)
-- 
1.9.1

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

[Intel-gfx] [v2][PATCH 2/3] drm/i915/display: Extract i965_read_luts()

2019-09-09 Thread Swati Sharma
For i965, add hw read out to create hw blob of gamma
lut values.

Review comments from old series:
https://patchwork.freedesktop.org/series/58039/

v4:  -No need to initialize *blob [Jani]
 -Removed right shifts [Jani]
 -Dropped dev local var [Jani]
v5:  -Returned blob instead of assigning it internally
  within the function [Ville]
 -Renamed i965_get_color_config() to i965_read_lut() [Ville]
 -Renamed i965_get_gamma_config_10p6() to i965_read_gamma_lut_10p6()
  [Ville]
v9:  -Typo and 80 character limit [Uma]
 -Made read func para as const [Ville, Uma]
 -Renamed i965_read_gamma_lut_10p6() to i965_read_lut_10p6() [Ville, Uma]
v10: -Swapped ldw and udw while creating hw blob [Jani]
 -Added last index rgb lut value from PIPEGCMAX to h/w blob [Jani]

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 50 ++
 drivers/gpu/drm/i915/i915_reg.h|  4 +++
 2 files changed, 54 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 4d9a568..765f858 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1570,6 +1570,55 @@ static void i9xx_read_luts(struct intel_crtc_state 
*crtc_state)
 }
 
 static struct drm_property_blob *
+i965_read_lut_10p6(const struct intel_crtc_state *crtc_state)
+{
+   struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
+   struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+   u32 lut_size = INTEL_INFO(dev_priv)->color.gamma_lut_size;
+   enum pipe pipe = crtc->pipe;
+   struct drm_property_blob *blob;
+   struct drm_color_lut *blob_data;
+   u32 i, val1, val2;
+
+   blob = drm_property_create_blob(&dev_priv->drm,
+   sizeof(struct drm_color_lut) * lut_size,
+   NULL);
+   if (IS_ERR(blob))
+   return NULL;
+
+   blob_data = blob->data;
+
+   for (i = 0; i < lut_size - 1; i++) {
+   val1 = I915_READ(PALETTE(pipe, 2 * i + 0));
+   val2 = I915_READ(PALETTE(pipe, 2 * i + 1));
+
+   blob_data[i].red = REG_FIELD_GET(PALETTE_RED_MASK, val2) << 8 |
+
REG_FIELD_GET(PALETTE_RED_MASK, val1);
+   blob_data[i].green = REG_FIELD_GET(PALETTE_GREEN_MASK, val2) << 
8 |
+  
REG_FIELD_GET(PALETTE_GREEN_MASK, val1);
+   blob_data[i].blue = REG_FIELD_GET(PALETTE_BLUE_MASK, val2) << 8 
|
+ 
REG_FIELD_GET(PALETTE_BLUE_MASK, val1);
+   }
+
+   blob_data[i].red = REG_FIELD_GET(PIPEGCMAX_RGB_MASK,
+I915_READ(PIPEGCMAX(pipe, 0)));
+   blob_data[i].green = REG_FIELD_GET(PIPEGCMAX_RGB_MASK,
+  I915_READ(PIPEGCMAX(pipe, 1)));
+   blob_data[i].blue = REG_FIELD_GET(PIPEGCMAX_RGB_MASK,
+ I915_READ(PIPEGCMAX(pipe, 2)));
+
+   return blob;
+}
+
+static void i965_read_luts(struct intel_crtc_state *crtc_state)
+{
+   if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT)
+   crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
+   else
+   crtc_state->base.gamma_lut = i965_read_lut_10p6(crtc_state);
+}
+
+static struct drm_property_blob *
 ilk_read_lut_10(const struct intel_crtc_state *crtc_state)
 {
struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
@@ -1672,6 +1721,7 @@ void intel_color_init(struct intel_crtc *crtc)
dev_priv->display.color_check = i9xx_color_check;
dev_priv->display.color_commit = i9xx_color_commit;
dev_priv->display.load_luts = i965_load_luts;
+   dev_priv->display.read_luts = i965_read_luts;
} else {
dev_priv->display.color_check = i9xx_color_check;
dev_priv->display.color_commit = i9xx_color_commit;
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 45ed96d..5ac8a4d 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -3558,6 +3558,9 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
 #define _PALETTE_A 0xa000
 #define _PALETTE_B 0xa800
 #define _CHV_PALETTE_C 0xc000
+#define PALETTE_RED_MASKREG_GENMASK(23, 16)
+#define PALETTE_GREEN_MASK  REG_GENMASK(15, 8)
+#define PALETTE_BLUE_MASK   REG_GENMASK(7, 0)
 #define PALETTE(pipe, i)   _MMIO(DISPLAY_MMIO_BASE(dev_priv) + \
  _PICK((pipe), _PALETTE_A, \
_PALETTE_B,

[Intel-gfx] [v2][PATCH 1/3] drm/i915/display: Add gamma precision function for CHV

2019-09-09 Thread Swati Sharma
intel_color_get_gamma_bit_precision() is extended for
cherryview by adding chv_gamma_precision(), i965 will use existing
i9xx_gamma_precision() func only.

Signed-off-by: Swati Sharma 
Reviewed-by: Jani Nikula 
---
 drivers/gpu/drm/i915/display/intel_color.c | 25 +++--
 1 file changed, 19 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 6d641e1..4d9a568 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1400,6 +1400,14 @@ static int ilk_gamma_precision(const struct 
intel_crtc_state *crtc_state)
}
 }
 
+static int chv_gamma_precision(const struct intel_crtc_state *crtc_state)
+{
+   if (crtc_state->cgm_mode & CGM_PIPE_MODE_GAMMA)
+   return 10;
+   else
+   return i9xx_gamma_precision(crtc_state);
+}
+
 static int glk_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
switch (crtc_state->gamma_mode) {
@@ -1421,12 +1429,17 @@ int intel_color_get_gamma_bit_precision(const struct 
intel_crtc_state *crtc_stat
if (!crtc_state->gamma_enable)
return 0;
 
-   if (HAS_GMCH(dev_priv) && !IS_CHERRYVIEW(dev_priv))
-   return i9xx_gamma_precision(crtc_state);
-   else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
-   return glk_gamma_precision(crtc_state);
-   else if (IS_IRONLAKE(dev_priv))
-   return ilk_gamma_precision(crtc_state);
+   if (HAS_GMCH(dev_priv)) {
+   if (IS_CHERRYVIEW(dev_priv))
+   return chv_gamma_precision(crtc_state);
+   else
+   return i9xx_gamma_precision(crtc_state);
+   } else {
+   if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
+   return glk_gamma_precision(crtc_state);
+   else if (IS_IRONLAKE(dev_priv))
+   return ilk_gamma_precision(crtc_state);
+   }
 
return 0;
 }
-- 
1.9.1

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

[Intel-gfx] [PATCH 3/3] drm/i915/display: Extract chv_read_luts()

2019-09-05 Thread Swati Sharma
For cherryview, add hw read out to create hw blob of gamma
lut values.

Review comments from previous series:
https://patchwork.freedesktop.org/patch/328252

v4: -No need to initialize *blob [Jani]
-Removed right shifts [Jani]
-Dropped dev local var [Jani]
v5: -Returned blob instead of assigning it internally within the
 function [Ville]
-Renamed function cherryview_get_color_config() to chv_read_luts()
-Renamed cherryview_get_gamma_config() to chv_read_cgm_gamma_lut()
 [Ville]
v9: -80 character limit [Uma]
-Made read func para as const [Ville, Uma]
-Renamed chv_read_cgm_gamma_lut() to chv_read_cgm_gamma_lut()
 [Ville, Uma]

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 43 ++
 drivers/gpu/drm/i915/i915_reg.h|  3 +++
 2 files changed, 46 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 17199a1..4473b54 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1612,6 +1612,48 @@ static void i965_read_luts(struct intel_crtc_state 
*crtc_state)
 }
 
 static struct drm_property_blob *
+chv_read_cgm_lut(const struct intel_crtc_state *crtc_state)
+{
+   struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
+   struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+   u32 lut_size = INTEL_INFO(dev_priv)->color.gamma_lut_size;
+   enum pipe pipe = crtc->pipe;
+   struct drm_property_blob *blob;
+   struct drm_color_lut *blob_data;
+   u32 i, val;
+
+   blob = drm_property_create_blob(&dev_priv->drm,
+   sizeof(struct drm_color_lut) * lut_size,
+   NULL);
+   if (IS_ERR(blob))
+   return NULL;
+
+   blob_data = blob->data;
+
+   for (i = 0; i < lut_size; i++) {
+   val = I915_READ(CGM_PIPE_GAMMA(pipe, i, 0));
+   blob_data[i].green = intel_color_lut_pack(REG_FIELD_GET(
+ 
CGM_PIPE_GAMMA_GREEN_MASK, val), 10);
+   blob_data[i].blue = intel_color_lut_pack(REG_FIELD_GET(
+
CGM_PIPE_GAMMA_BLUE_MASK, val), 10);
+
+   val = I915_READ(CGM_PIPE_GAMMA(pipe, i, 1));
+   blob_data[i].red = intel_color_lut_pack(REG_FIELD_GET(
+   
CGM_PIPE_GAMMA_RED_MASK, val), 10);
+   }
+
+   return blob;
+}
+
+static void chv_read_luts(struct intel_crtc_state *crtc_state)
+{
+   if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT)
+   crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
+   else
+   crtc_state->base.gamma_lut = chv_read_cgm_lut(crtc_state);
+}
+
+static struct drm_property_blob *
 ilk_read_lut_10(const struct intel_crtc_state *crtc_state)
 {
struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
@@ -1710,6 +1752,7 @@ void intel_color_init(struct intel_crtc *crtc)
dev_priv->display.color_check = chv_color_check;
dev_priv->display.color_commit = i9xx_color_commit;
dev_priv->display.load_luts = chv_load_luts;
+   dev_priv->display.read_luts = chv_read_luts;
} else if (INTEL_GEN(dev_priv) >= 4) {
dev_priv->display.color_check = i9xx_color_check;
dev_priv->display.color_commit = i9xx_color_commit;
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 1e58c6d..6ec56b1 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -10409,6 +10409,9 @@ enum skl_power_gate {
 #define   CGM_PIPE_MODE_GAMMA  (1 << 2)
 #define   CGM_PIPE_MODE_CSC(1 << 1)
 #define   CGM_PIPE_MODE_DEGAMMA(1 << 0)
+#define   CGM_PIPE_GAMMA_RED_MASK   REG_GENMASK(9, 0)
+#define   CGM_PIPE_GAMMA_GREEN_MASK REG_GENMASK(25, 16)
+#define   CGM_PIPE_GAMMA_BLUE_MASK  REG_GENMASK(9, 0)
 
 #define _CGM_PIPE_B_CSC_COEFF01(VLV_DISPLAY_BASE + 0x69900)
 #define _CGM_PIPE_B_CSC_COEFF23(VLV_DISPLAY_BASE + 0x69904)
-- 
1.9.1

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

[Intel-gfx] [PATCH 1/3] drm/i915/display: Add gamma precision function for CHV

2019-09-05 Thread Swati Sharma
intel_color_get_gamma_bit_precision() is extended for
cherryview by adding chv_gamma_precision(), i965 will use existing
i9xx_gamma_precision() func only.

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 25 +++--
 1 file changed, 19 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 6d641e1..4d9a568 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1400,6 +1400,14 @@ static int ilk_gamma_precision(const struct 
intel_crtc_state *crtc_state)
}
 }
 
+static int chv_gamma_precision(const struct intel_crtc_state *crtc_state)
+{
+   if (crtc_state->cgm_mode & CGM_PIPE_MODE_GAMMA)
+   return 10;
+   else
+   return i9xx_gamma_precision(crtc_state);
+}
+
 static int glk_gamma_precision(const struct intel_crtc_state *crtc_state)
 {
switch (crtc_state->gamma_mode) {
@@ -1421,12 +1429,17 @@ int intel_color_get_gamma_bit_precision(const struct 
intel_crtc_state *crtc_stat
if (!crtc_state->gamma_enable)
return 0;
 
-   if (HAS_GMCH(dev_priv) && !IS_CHERRYVIEW(dev_priv))
-   return i9xx_gamma_precision(crtc_state);
-   else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
-   return glk_gamma_precision(crtc_state);
-   else if (IS_IRONLAKE(dev_priv))
-   return ilk_gamma_precision(crtc_state);
+   if (HAS_GMCH(dev_priv)) {
+   if (IS_CHERRYVIEW(dev_priv))
+   return chv_gamma_precision(crtc_state);
+   else
+   return i9xx_gamma_precision(crtc_state);
+   } else {
+   if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
+   return glk_gamma_precision(crtc_state);
+   else if (IS_IRONLAKE(dev_priv))
+   return ilk_gamma_precision(crtc_state);
+   }
 
return 0;
 }
-- 
1.9.1

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

[Intel-gfx] [PATCH 0/3] adding gamma state checker for CHV and i965

2019-09-05 Thread Swati Sharma
In this patch series, added state checker to validate gamma lut values
for cherryview and i965 platforms. It's extension of the
patch series https://patchwork.freedesktop.org/patch/328246/?series=58039
which enabled the basic infrastructure and state checker for 
few legacy platforms.

Swati Sharma (3):
  drm/i915/display: Add gamma precision function for CHV
  drm/i915/display: Extract i965_read_luts()
  drm/i915/display: Extract chv_read_luts()

 drivers/gpu/drm/i915/display/intel_color.c | 111 +++--
 drivers/gpu/drm/i915/i915_reg.h|   6 ++
 2 files changed, 111 insertions(+), 6 deletions(-)

-- 
1.9.1

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

[Intel-gfx] [PATCH 2/3] drm/i915/display: Extract i965_read_luts()

2019-09-05 Thread Swati Sharma
For i965, add hw read out to create hw blob of gamma
lut values.

Review comments from old series:
https://patchwork.freedesktop.org/series/58039/

v4:  -No need to initialize *blob [Jani]
 -Removed right shifts [Jani]
 -Dropped dev local var [Jani]
v5:  -Returned blob instead of assigning it internally
  within the function [Ville]
 -Renamed i965_get_color_config() to i965_read_lut() [Ville]
 -Renamed i965_get_gamma_config_10p6() to i965_read_gamma_lut_10p6()
  [Ville]
v9:  -Typo and 80 character limit [Uma]
 -Made read func para as const [Ville, Uma]
 -Renamed i965_read_gamma_lut_10p6() to i965_read_lut_10p6() [Ville, Uma]
v10: -Swapped ldw and udw while creating hw blob [Jani]

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 43 ++
 drivers/gpu/drm/i915/i915_reg.h|  3 +++
 2 files changed, 46 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 4d9a568..17199a1 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1570,6 +1570,48 @@ static void i9xx_read_luts(struct intel_crtc_state 
*crtc_state)
 }
 
 static struct drm_property_blob *
+i965_read_lut_10p6(const struct intel_crtc_state *crtc_state)
+{
+   struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
+   struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+   u32 lut_size = INTEL_INFO(dev_priv)->color.gamma_lut_size;
+   enum pipe pipe = crtc->pipe;
+   struct drm_property_blob *blob;
+   struct drm_color_lut *blob_data;
+   u32 i, val1, val2;
+
+   blob = drm_property_create_blob(&dev_priv->drm,
+   sizeof(struct drm_color_lut) * lut_size,
+   NULL);
+   if (IS_ERR(blob))
+   return NULL;
+
+   blob_data = blob->data;
+
+   for (i = 0; i < lut_size - 1; i++) {
+   val1 = I915_READ(PALETTE(pipe, 2 * i + 0));
+   val2 = I915_READ(PALETTE(pipe, 2 * i + 1));
+
+   blob_data[i].red = REG_FIELD_GET(PALETTE_RED_MASK, val2) << 8 |
+
REG_FIELD_GET(PALETTE_RED_MASK, val1);
+   blob_data[i].green = REG_FIELD_GET(PALETTE_GREEN_MASK, val2) << 
8 |
+  
REG_FIELD_GET(PALETTE_GREEN_MASK, val1);
+   blob_data[i].blue = REG_FIELD_GET(PALETTE_BLUE_MASK, val2) << 8 
|
+ 
REG_FIELD_GET(PALETTE_BLUE_MASK, val1);
+   }
+
+   return blob;
+}
+
+static void i965_read_luts(struct intel_crtc_state *crtc_state)
+{
+   if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT)
+   crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
+   else
+   crtc_state->base.gamma_lut = i965_read_lut_10p6(crtc_state);
+}
+
+static struct drm_property_blob *
 ilk_read_lut_10(const struct intel_crtc_state *crtc_state)
 {
struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
@@ -1672,6 +1714,7 @@ void intel_color_init(struct intel_crtc *crtc)
dev_priv->display.color_check = i9xx_color_check;
dev_priv->display.color_commit = i9xx_color_commit;
dev_priv->display.load_luts = i965_load_luts;
+   dev_priv->display.read_luts = i965_read_luts;
} else {
dev_priv->display.color_check = i9xx_color_check;
dev_priv->display.color_commit = i9xx_color_commit;
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 45ed96d..1e58c6d 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -3558,6 +3558,9 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
 #define _PALETTE_A 0xa000
 #define _PALETTE_B 0xa800
 #define _CHV_PALETTE_C 0xc000
+#define PALETTE_RED_MASKREG_GENMASK(23, 16)
+#define PALETTE_GREEN_MASK  REG_GENMASK(15, 8)
+#define PALETTE_BLUE_MASK   REG_GENMASK(7, 0)
 #define PALETTE(pipe, i)   _MMIO(DISPLAY_MMIO_BASE(dev_priv) + \
  _PICK((pipe), _PALETTE_A, \
_PALETTE_B, _CHV_PALETTE_C) + \
-- 
1.9.1

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

[Intel-gfx] [v10][PATCH 8/8] FOR_TESTING_ONLY: Print rgb values of hw and sw blobs

2019-09-03 Thread Swati Sharma
Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 6d641e1..78608a5 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1434,6 +1434,8 @@ int intel_color_get_gamma_bit_precision(const struct 
intel_crtc_state *crtc_stat
 static bool err_check(struct drm_color_lut *lut1,
  struct drm_color_lut *lut2, u32 err)
 {
+   DRM_DEBUG_KMS("hw_lut->red=0x%x sw_lut->red=0x%x hw_lut->blue=0x%x 
sw_lut->blue=0x%x hw_lut->green=0x%x sw_lut->green=0x%x", lut2->red, lut1->red, 
lut2->blue, lut1->blue, lut2->green, lut1->green);
+
return ((abs((long)lut2->red - lut1->red)) <= err) &&
((abs((long)lut2->blue - lut1->blue)) <= err) &&
((abs((long)lut2->green - lut1->green)) <= err);
-- 
1.9.1

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

[Intel-gfx] [v10][PATCH 7/8] drm/i915/display: Extract glk_read_luts()

2019-09-03 Thread Swati Sharma
For glk, add hw read out to create hw blob of gamma
lut values.

v4: -No need to initialize *blob [Jani]
-Removed right shifts [Jani]
-Dropped dev local var [Jani]
v5: -Returned blob instead of assigning it internally within the
 function [Ville]
-Renamed glk_get_color_config() to glk_read_luts() [Ville]
-Added degamma validation [Ville]
v9: -80 character limit [Uma]
-Made read func para as const [Ville, Uma]

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 51 --
 drivers/gpu/drm/i915/i915_reg.h|  3 ++
 2 files changed, 52 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 80f82b2..6d641e1 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1597,6 +1597,52 @@ static void ilk_read_luts(struct intel_crtc_state 
*crtc_state)
crtc_state->base.gamma_lut = ilk_read_lut_10(crtc_state);
 }
 
+static struct drm_property_blob *
+glk_read_lut_10(const struct intel_crtc_state *crtc_state, u32 prec_index)
+{
+   struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
+   struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+   int hw_lut_size = ivb_lut_10_size(prec_index);
+   enum pipe pipe = crtc->pipe;
+   struct drm_property_blob *blob;
+   struct drm_color_lut *blob_data;
+   u32 i, val;
+
+   I915_WRITE(PREC_PAL_INDEX(pipe), prec_index |
+  PAL_PREC_AUTO_INCREMENT);
+
+   blob = drm_property_create_blob(&dev_priv->drm,
+   sizeof(struct drm_color_lut) * 
hw_lut_size,
+   NULL);
+   if (IS_ERR(blob))
+   return NULL;
+
+   blob_data = blob->data;
+
+   for (i = 0; i < hw_lut_size; i++) {
+   val = I915_READ(PREC_PAL_DATA(pipe));
+
+   blob_data[i].red = intel_color_lut_pack(REG_FIELD_GET(
+   PREC_PAL_DATA_RED_MASK, 
val), 10);
+   blob_data[i].green = intel_color_lut_pack(REG_FIELD_GET(
+   
PREC_PAL_DATA_GREEN_MASK, val), 10);
+   blob_data[i].blue = intel_color_lut_pack(REG_FIELD_GET(
+   
PREC_PAL_DATA_BLUE_MASK, val), 10);
+   }
+
+   I915_WRITE(PREC_PAL_INDEX(pipe), 0);
+
+   return blob;
+}
+
+static void glk_read_luts(struct intel_crtc_state *crtc_state)
+{
+   if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT)
+   crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
+   else
+   crtc_state->base.gamma_lut = glk_read_lut_10(crtc_state, 
PAL_PREC_INDEX_VALUE(0));
+}
+
 void intel_color_init(struct intel_crtc *crtc)
 {
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
@@ -1638,9 +1684,10 @@ void intel_color_init(struct intel_crtc *crtc)
 
if (INTEL_GEN(dev_priv) >= 11)
dev_priv->display.load_luts = icl_load_luts;
-   else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
+   else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv)) {
dev_priv->display.load_luts = glk_load_luts;
-   else if (INTEL_GEN(dev_priv) >= 8)
+   dev_priv->display.read_luts = glk_read_luts;
+   } else if (INTEL_GEN(dev_priv) >= 8)
dev_priv->display.load_luts = bdw_load_luts;
else if (INTEL_GEN(dev_priv) >= 7)
dev_priv->display.load_luts = ivb_load_luts;
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 67d8cad..c584d0e 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -10259,6 +10259,9 @@ enum skl_power_gate {
 #define _PAL_PREC_GC_MAX_A 0x4A410
 #define _PAL_PREC_GC_MAX_B 0x4AC10
 #define _PAL_PREC_GC_MAX_C 0x4B410
+#define   PREC_PAL_DATA_RED_MASK   REG_GENMASK(29, 20)
+#define   PREC_PAL_DATA_GREEN_MASK REG_GENMASK(19, 10)
+#define   PREC_PAL_DATA_BLUE_MASK  REG_GENMASK(9, 0)
 #define _PAL_PREC_EXT_GC_MAX_A 0x4A420
 #define _PAL_PREC_EXT_GC_MAX_B 0x4AC20
 #define _PAL_PREC_EXT_GC_MAX_C 0x4B420
-- 
1.9.1

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

[Intel-gfx] [v10][PATCH 1/8] drm/i915/display: Add func to get gamma bit precision

2019-09-03 Thread Swati Sharma
Each platform supports different gamma modes and each gamma mode
has different bit precision. Here bit precision corresponds
to number of bits the hw LUT supports.

Add func per platform to return bit precision corresponding to gamma mode
which will be later used as a parameter in lut comparison function
intel_color_lut_equal().

This is done for legacy, ilk, glk and their variant platforms.

v6:  -Added func intel_color_get_bit_precision() to get bit precision for
  gamma and degamma lut readout depending upon platform and
  corresponding to load_luts() [Ankit]
 -Made patch11 as patch3 [Jani]
v7:  -Renamed func intel_color_get_bit_precision() to
  intel_color_get_gamma_bit_precision()
 -Added separate function/platform for gamma bit precision [Ville]
 -Corrected checkpatch warnings
v8:  -Split patch 3 into 4 separate patches
v9:  -Changed commit message, gave more info [Uma]
 -Added precision func for icl+ platform
v10: -Removed precision func for chv and icl+ platforms [Jani]
 -Added gamma_enable check once [Jani]

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 60 ++
 drivers/gpu/drm/i915/display/intel_color.h |  1 +
 2 files changed, 61 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 71a0201..b5c0c65 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1371,6 +1371,66 @@ static int icl_color_check(struct intel_crtc_state 
*crtc_state)
return 0;
 }
 
+static int i9xx_gamma_precision(const struct intel_crtc_state *crtc_state)
+{
+   switch (crtc_state->gamma_mode) {
+   case GAMMA_MODE_MODE_8BIT:
+   return 8;
+   case GAMMA_MODE_MODE_10BIT:
+   return 16;
+   default:
+   MISSING_CASE(crtc_state->gamma_mode);
+   return 0;
+   }
+}
+
+static int ilk_gamma_precision(const struct intel_crtc_state *crtc_state)
+{
+   if ((crtc_state->csc_mode & CSC_POSITION_BEFORE_GAMMA) == 0)
+   return 0;
+
+   switch (crtc_state->gamma_mode) {
+   case GAMMA_MODE_MODE_8BIT:
+   return 8;
+   case GAMMA_MODE_MODE_10BIT:
+   return 10;
+   default:
+   MISSING_CASE(crtc_state->gamma_mode);
+   return 0;
+   }
+}
+
+static int glk_gamma_precision(const struct intel_crtc_state *crtc_state)
+{
+   switch (crtc_state->gamma_mode) {
+   case GAMMA_MODE_MODE_8BIT:
+   return 8;
+   case GAMMA_MODE_MODE_10BIT:
+   return 10;
+   default:
+   MISSING_CASE(crtc_state->gamma_mode);
+   return 0;
+   }
+}
+
+int intel_color_get_gamma_bit_precision(const struct intel_crtc_state 
*crtc_state)
+{
+   struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
+   struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+
+   if (!crtc_state->gamma_enable)
+   return 0;
+
+   if (HAS_GMCH(dev_priv) && !IS_CHERRYVIEW(dev_priv))
+   return i9xx_gamma_precision(crtc_state);
+   else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
+   return glk_gamma_precision(crtc_state);
+   else if (IS_IRONLAKE(dev_priv))
+   return ilk_gamma_precision(crtc_state);
+
+   return 0;
+}
+
 void intel_color_init(struct intel_crtc *crtc)
 {
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
diff --git a/drivers/gpu/drm/i915/display/intel_color.h 
b/drivers/gpu/drm/i915/display/intel_color.h
index 057e8ac..0226d3a 100644
--- a/drivers/gpu/drm/i915/display/intel_color.h
+++ b/drivers/gpu/drm/i915/display/intel_color.h
@@ -14,5 +14,6 @@
 void intel_color_commit(const struct intel_crtc_state *crtc_state);
 void intel_color_load_luts(const struct intel_crtc_state *crtc_state);
 void intel_color_get_config(struct intel_crtc_state *crtc_state);
+int intel_color_get_gamma_bit_precision(const struct intel_crtc_state 
*crtc_state);
 
 #endif /* __INTEL_COLOR_H__ */
-- 
1.9.1

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

[Intel-gfx] [v10][PATCH 3/8] drm/i915/display: Add func to compare hw/sw gamma lut

2019-09-03 Thread Swati Sharma
Add func intel_color_lut_equal() to compare hw/sw gamma
lut values. Since hw/sw gamma lut sizes and lut entries comparison
will be different for different gamma modes, add gamma mode dependent
checks.

v3:  -Rebase
v4:  -Renamed intel_compare_color_lut() to intel_color_lut_equal() [Jani]
 -Added the default label above the correct label [Jani]
 -Corrected smatch warn "variable dereferenced before check"
  [Dan Carpenter]
v5:  -Added condition (!blob1 && !blob2) return true [Jani]
v6:  -Made patch11 as patch3 [Jani]
v8:  -Split patch 3 into 4 patches
 -Optimized blob check condition [Ville]
v9:  -Exclude spilt gamma mode (bdw and ivb platforms)
  as there is exception in way gamma values are written in
  hardware [Ville]
 -Added exception made in commit [Uma]
 -Dropped else, character limit and indentation [Uma]
 -Added multi segmented gama mode for icl+ platforms [Uma]
v10: -Dropped multi segmented mode for icl+ platforms [Jani]
 -Removed references of sw and hw state in compare code [Jani]
 -Dropped inline from func [Jani]

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 72 ++
 drivers/gpu/drm/i915/display/intel_color.h |  6 +++
 2 files changed, 78 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index b5c0c65..1ab561d 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1431,6 +1431,78 @@ int intel_color_get_gamma_bit_precision(const struct 
intel_crtc_state *crtc_stat
return 0;
 }
 
+static bool err_check(struct drm_color_lut *lut1,
+ struct drm_color_lut *lut2, u32 err)
+{
+   return ((abs((long)lut2->red - lut1->red)) <= err) &&
+   ((abs((long)lut2->blue - lut1->blue)) <= err) &&
+   ((abs((long)lut2->green - lut1->green)) <= err);
+}
+
+static bool intel_color_lut_entry_equal(struct drm_color_lut *lut1,
+   struct drm_color_lut *lut2,
+   int lut_size, u32 err)
+{
+   int i;
+
+   for (i = 0; i < lut_size; i++) {
+   if (!err_check(&lut1[i], &lut2[i], err))
+   return false;
+   }
+
+   return true;
+}
+
+bool intel_color_lut_equal(struct drm_property_blob *blob1,
+  struct drm_property_blob *blob2,
+  u32 gamma_mode, u32 bit_precision)
+{
+   struct drm_color_lut *lut1, *lut2;
+   int lut_size1, lut_size2;
+   u32 err;
+
+   if (!blob1 != !blob2)
+   return false;
+
+   if (!blob1)
+   return true;
+
+   lut_size1 = drm_color_lut_size(blob1);
+   lut_size2 = drm_color_lut_size(blob2);
+
+   /* check sw and hw lut size */
+   switch (gamma_mode) {
+   case GAMMA_MODE_MODE_8BIT:
+   case GAMMA_MODE_MODE_10BIT:
+   if (lut_size1 != lut_size2)
+   return false;
+   break;
+   default:
+   MISSING_CASE(gamma_mode);
+   return false;
+   }
+
+   lut1 = blob1->data;
+   lut2 = blob2->data;
+
+   err = 0x >> bit_precision;
+
+   /* check sw and hw lut entry to be equal */
+   switch (gamma_mode) {
+   case GAMMA_MODE_MODE_8BIT:
+   case GAMMA_MODE_MODE_10BIT:
+   if (!intel_color_lut_entry_equal(lut1, lut2,
+lut_size2, err))
+   return false;
+   break;
+   default:
+   MISSING_CASE(gamma_mode);
+   return false;
+   }
+
+   return true;
+}
+
 void intel_color_init(struct intel_crtc *crtc)
 {
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
diff --git a/drivers/gpu/drm/i915/display/intel_color.h 
b/drivers/gpu/drm/i915/display/intel_color.h
index 0226d3a..173727a 100644
--- a/drivers/gpu/drm/i915/display/intel_color.h
+++ b/drivers/gpu/drm/i915/display/intel_color.h
@@ -6,8 +6,11 @@
 #ifndef __INTEL_COLOR_H__
 #define __INTEL_COLOR_H__
 
+#include 
+
 struct intel_crtc_state;
 struct intel_crtc;
+struct drm_property_blob;
 
 void intel_color_init(struct intel_crtc *crtc);
 int intel_color_check(struct intel_crtc_state *crtc_state);
@@ -15,5 +18,8 @@
 void intel_color_load_luts(const struct intel_crtc_state *crtc_state);
 void intel_color_get_config(struct intel_crtc_state *crtc_state);
 int intel_color_get_gamma_bit_precision(const struct intel_crtc_state 
*crtc_state);
+bool intel_color_lut_equal(struct drm_property_blob *blob1,
+  struct drm_property_blob *blob2,
+  u32 gamma_mode, u32 bit_precision);
 
 #endif /* __INTEL_COLOR_H__ */
-- 
1.9.1

_

[Intel-gfx] [v10][PATCH 0/8] drm/i915: adding state checker for gamma lut values

2019-09-03 Thread Swati Sharma
In this patch series, added state checker to validate gamma
(8BIT and 10BIT).This reads hardware state, and compares the originally
requested state(s/w) to the state read from the hardware.
This is done for legacy, ilk, glk and their variant platforms. Rest of
the platforms will be enabled on top of this later.

Intentionally, excluded bdw and ivb since they have spilt gamma mode;
for which degamma read outs are required (which I think shouldn't be
included in this patch series). Will include after degamma state checker
is completed.

v1:  -Implementation done for legacy platforms
  (removed all the placeholders) (Jani)
v2:  -Restructured code and created platform specific patch series for 
  gamma validation
v3:  -Rebase
v4:  -Minor changes-function name changes mainly
v5:  -Added degamma validation (Ville)
v6:  -Removed degamma changes, debugging was becoming difficult
 -Added function to assign bit_precision for gamma/degamma
  lut values /platform
 -Added debug info into intel_dump_pipe_config() (Jani)
v7:  -Added platform specific functions to compute gamma bit precision
  on the basis of GAMMA_MODE (Ville)
 -Corrected checkpatch warnings
v8:  -Restructured code
 -Removed bdw and ivb platform state checker
v9:  -Obliged 80 character word limit [Uma]
 -Added state checker for icl
 -Added bit precision func for icl
v10: -Dropped multi-seg gamma mode [Jani]
 -Enabled basic infrastructure only [Jani]
 -Minor fixes [Jani]

Swati Sharma (8):
  drm/i915/display: Add func to get gamma bit precision
  drm/i915/display: Add debug log for color parameters
  drm/i915/display: Add func to compare hw/sw gamma lut
  drm/i915/display: Add macro to compare gamma hw/sw lut
  drm/i915/display: Extract i9xx_read_luts()
  drm/i915/display: Extract ilk_read_luts()
  drm/i915/display: Extract glk_read_luts()
  FOR_TESTING_ONLY: Print rgb values of hw and sw blobs

 drivers/gpu/drm/i915/display/intel_color.c   | 284 ++-
 drivers/gpu/drm/i915/display/intel_color.h   |   7 +
 drivers/gpu/drm/i915/display/intel_display.c |  34 
 drivers/gpu/drm/i915/i915_reg.h  |   9 +
 4 files changed, 331 insertions(+), 3 deletions(-)

-- 
1.9.1

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

[Intel-gfx] [v10][PATCH 6/8] drm/i915/display: Extract ilk_read_luts()

2019-09-03 Thread Swati Sharma
For ilk, add hw read out to create hw blob of gamma
lut values.

v4:  -No need to initialize *blob [Jani]
 -Removed right shifts [Jani]
 -Dropped dev local var [Jani]
v5:  -Returned blob instead of assigning it internally within the
  function [Ville]
 -Renamed ilk_get_color_config() to ilk_read_luts() [Ville]
v9:  -80 character limit [Uma]
 -Made read func para as const [Ville, Uma]
 -Renamed ilk_read_gamma_lut() to ilk_read_lut_10() [Uma, Ville]
v10: -Made ilk_read_luts() static [Jani]
 -ilk_load_lut_10 has lut_size, not (lut_size - 1) [Jani]

Signed-off-by: Swati Sharma 
Reviewed-by: Jani Nikula 
---
 drivers/gpu/drm/i915/display/intel_color.c | 45 +-
 drivers/gpu/drm/i915/i915_reg.h|  3 ++
 2 files changed, 47 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 55076de..80f82b2 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1556,6 +1556,47 @@ static void i9xx_read_luts(struct intel_crtc_state 
*crtc_state)
crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
 }
 
+static struct drm_property_blob *
+ilk_read_lut_10(const struct intel_crtc_state *crtc_state)
+{
+   struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
+   struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+   u32 lut_size = INTEL_INFO(dev_priv)->color.gamma_lut_size;
+   enum pipe pipe = crtc->pipe;
+   struct drm_property_blob *blob;
+   struct drm_color_lut *blob_data;
+   u32 i, val;
+
+   blob = drm_property_create_blob(&dev_priv->drm,
+   sizeof(struct drm_color_lut) * lut_size,
+   NULL);
+   if (IS_ERR(blob))
+   return NULL;
+
+   blob_data = blob->data;
+
+   for (i = 0; i < lut_size; i++) {
+   val = I915_READ(PREC_PALETTE(pipe, i));
+
+   blob_data[i].red = intel_color_lut_pack(REG_FIELD_GET(
+   PREC_PALETTE_RED_MASK, 
val), 10);
+   blob_data[i].green = intel_color_lut_pack(REG_FIELD_GET(
+ 
PREC_PALETTE_GREEN_MASK, val), 10);
+   blob_data[i].blue = intel_color_lut_pack(REG_FIELD_GET(
+
PREC_PALETTE_BLUE_MASK, val), 10);
+   }
+
+   return blob;
+}
+
+static void ilk_read_luts(struct intel_crtc_state *crtc_state)
+{
+   if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT)
+   crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
+   else
+   crtc_state->base.gamma_lut = ilk_read_lut_10(crtc_state);
+}
+
 void intel_color_init(struct intel_crtc *crtc)
 {
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
@@ -1603,8 +1644,10 @@ void intel_color_init(struct intel_crtc *crtc)
dev_priv->display.load_luts = bdw_load_luts;
else if (INTEL_GEN(dev_priv) >= 7)
dev_priv->display.load_luts = ivb_load_luts;
-   else
+   else {
dev_priv->display.load_luts = ilk_load_luts;
+   dev_priv->display.read_luts = ilk_read_luts;
+   }
}
 
drm_crtc_enable_color_mgmt(&crtc->base,
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 09ea5b1..67d8cad 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -7200,6 +7200,9 @@ enum {
 /* ilk/snb precision palette */
 #define _PREC_PALETTE_A   0x4b000
 #define _PREC_PALETTE_B   0x4c000
+#define   PREC_PALETTE_RED_MASK   REG_GENMASK(29, 20)
+#define   PREC_PALETTE_GREEN_MASK REG_GENMASK(19, 10)
+#define   PREC_PALETTE_BLUE_MASK  REG_GENMASK(9, 0)
 #define PREC_PALETTE(pipe, i) _MMIO(_PIPE(pipe, _PREC_PALETTE_A, 
_PREC_PALETTE_B) + (i) * 4)
 
 #define  _PREC_PIPEAGCMAX  0x4d000
-- 
1.9.1

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

[Intel-gfx] [v10][PATCH 5/8] drm/i915/display: Extract i9xx_read_luts()

2019-09-03 Thread Swati Sharma
For the legacy(gen < 4) gamma, add hw read out to create hw blob of gamma
lut values. Also, add function intel_color_lut_pack to convert hw value
with given bit precision to lut property val.

v4:  -No need to initialize *blob [Jani]
 -Removed right shifts [Jani]
 -Dropped dev local var [Jani]
v5:  -Returned blob instead of assigning it internally within the
  function [Ville]
 -Renamed function i9xx_get_color_config() to i9xx_read_luts()
 -Renamed i9xx_get_config_internal() to i9xx_read_lut_8() [Ville]
v9:  -Change in commit message [Jani, Uma]
 -Wrap commit within 75 characters [Uma]
 -Use macro for 256 [Uma]
 -Made read func para as const [Ville, Uma]
v10: -Made i9xx_read_luts() static [Jani]

Signed-off-by: Swati Sharma 
Reviewed-by: Jani Nikula 
---
 drivers/gpu/drm/i915/display/intel_color.c | 54 ++
 drivers/gpu/drm/i915/i915_reg.h|  3 ++
 2 files changed, 57 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 1ab561d..55076de 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1503,6 +1503,59 @@ bool intel_color_lut_equal(struct drm_property_blob 
*blob1,
return true;
 }
 
+/* convert hw value with given bit_precision to lut property val */
+static u32 intel_color_lut_pack(u32 val, u32 bit_precision)
+{
+   u32 max = 0x >> (16 - bit_precision);
+
+   val = clamp_val(val, 0, max);
+
+   if (bit_precision < 16)
+   val <<= 16 - bit_precision;
+
+   return val;
+}
+
+static struct drm_property_blob *
+i9xx_read_lut_8(const struct intel_crtc_state *crtc_state)
+{
+   struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
+   struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+   enum pipe pipe = crtc->pipe;
+   struct drm_property_blob *blob;
+   struct drm_color_lut *blob_data;
+   u32 i, val;
+
+   blob = drm_property_create_blob(&dev_priv->drm,
+   sizeof(struct drm_color_lut) * 
LEGACY_LUT_LENGTH,
+   NULL);
+   if (IS_ERR(blob))
+   return NULL;
+
+   blob_data = blob->data;
+
+   for (i = 0; i < LEGACY_LUT_LENGTH; i++) {
+   if (HAS_GMCH(dev_priv))
+   val = I915_READ(PALETTE(pipe, i));
+   else
+   val = I915_READ(LGC_PALETTE(pipe, i));
+
+   blob_data[i].red = intel_color_lut_pack(REG_FIELD_GET(
+   LGC_PALETTE_RED_MASK, 
val), 8);
+   blob_data[i].green = intel_color_lut_pack(REG_FIELD_GET(
+ 
LGC_PALETTE_GREEN_MASK, val), 8);
+   blob_data[i].blue = intel_color_lut_pack(REG_FIELD_GET(
+LGC_PALETTE_BLUE_MASK, 
val), 8);
+   }
+
+   return blob;
+}
+
+static void i9xx_read_luts(struct intel_crtc_state *crtc_state)
+{
+   crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
+}
+
 void intel_color_init(struct intel_crtc *crtc)
 {
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
@@ -1523,6 +1576,7 @@ void intel_color_init(struct intel_crtc *crtc)
dev_priv->display.color_check = i9xx_color_check;
dev_priv->display.color_commit = i9xx_color_commit;
dev_priv->display.load_luts = i9xx_load_luts;
+   dev_priv->display.read_luts = i9xx_read_luts;
}
} else {
if (INTEL_GEN(dev_priv) >= 11)
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 02e1ef1..09ea5b1 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -7192,6 +7192,9 @@ enum {
 /* legacy palette */
 #define _LGC_PALETTE_A   0x4a000
 #define _LGC_PALETTE_B   0x4a800
+#define LGC_PALETTE_RED_MASK REG_GENMASK(23, 16)
+#define LGC_PALETTE_GREEN_MASK   REG_GENMASK(15, 8)
+#define LGC_PALETTE_BLUE_MASKREG_GENMASK(7, 0)
 #define LGC_PALETTE(pipe, i) _MMIO(_PIPE(pipe, _LGC_PALETTE_A, _LGC_PALETTE_B) 
+ (i) * 4)
 
 /* ilk/snb precision palette */
-- 
1.9.1

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

[Intel-gfx] [v10][PATCH 4/8] drm/i915/display: Add macro to compare gamma hw/sw lut

2019-09-03 Thread Swati Sharma
Add macro to compare hw/sw gamma lut values. First need to
check whether hw/sw gamma mode matches or not. If not
no need to compare lut values, if matches then only compare
lut entries.

v5: -Called PIPE_CONF_CHECK_COLOR_LUT inside if (!adjust) [Jani]
-Added #undef PIPE_CONF_CHECK_COLOR_LUT [Jani]
v8: -Added check for gamma mode before gamma lut entry comparison
 [Jani]
-Split patch 3 into 4 patches

Signed-off-by: Swati Sharma 
Reviewed-by: Uma Shankar 
---
 drivers/gpu/drm/i915/display/intel_display.c | 25 +
 1 file changed, 25 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index f9c0842..776b365 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -12529,6 +12529,7 @@ static bool fastboot_enabled(struct drm_i915_private 
*dev_priv)
 {
struct drm_i915_private *dev_priv = 
to_i915(current_config->base.crtc->dev);
bool ret = true;
+   u32 bp_gamma = 0;
bool fixup_inherited = fastset &&
(current_config->base.mode.private_flags & 
I915_MODE_FLAG_INHERITED) &&
!(pipe_config->base.mode.private_flags & 
I915_MODE_FLAG_INHERITED);
@@ -12680,6 +12681,24 @@ static bool fastboot_enabled(struct drm_i915_private 
*dev_priv)
} \
 } while (0)
 
+#define PIPE_CONF_CHECK_COLOR_LUT(name1, name2, bit_precision) do { \
+   if (current_config->name1 != pipe_config->name1) { \
+   pipe_config_mismatch(fastset, __stringify(name1), \
+   "(expected %i, found %i, won't compare lut 
values)\n", \
+   current_config->name1, \
+   pipe_config->name1); \
+   ret = false;\
+   } else { \
+   if (!intel_color_lut_equal(current_config->name2, \
+   pipe_config->name2, pipe_config->name1, 
\
+   bit_precision)) { \
+   pipe_config_mismatch(fastset, __stringify(name2), \
+   "hw_state doesn't match sw_state\n"); \
+   ret = false; \
+   } \
+   } \
+} while (0)
+
 #define PIPE_CONF_QUIRK(quirk) \
((current_config->quirks | pipe_config->quirks) & (quirk))
 
@@ -12775,6 +12794,11 @@ static bool fastboot_enabled(struct drm_i915_private 
*dev_priv)
PIPE_CONF_CHECK_X(csc_mode);
PIPE_CONF_CHECK_BOOL(gamma_enable);
PIPE_CONF_CHECK_BOOL(csc_enable);
+
+   bp_gamma = intel_color_get_gamma_bit_precision(pipe_config);
+   if (bp_gamma)
+   PIPE_CONF_CHECK_COLOR_LUT(gamma_mode, base.gamma_lut, 
bp_gamma);
+
}
 
PIPE_CONF_CHECK_BOOL(double_wide);
@@ -12837,6 +12861,7 @@ static bool fastboot_enabled(struct drm_i915_private 
*dev_priv)
 #undef PIPE_CONF_CHECK_P
 #undef PIPE_CONF_CHECK_FLAGS
 #undef PIPE_CONF_CHECK_CLOCK_FUZZY
+#undef PIPE_CONF_CHECK_COLOR_LUT
 #undef PIPE_CONF_QUIRK
 
return ret;
-- 
1.9.1

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

[Intel-gfx] [v10][PATCH 2/8] drm/i915/display: Add debug log for color parameters

2019-09-03 Thread Swati Sharma
Add debug log for color related parameters like gamma_mode, gamma_enable,
csc_enable, etc inside intel_dump_pipe_config().

v6: -Added debug log for color para in intel_dump_pipe_config [Jani]
v7: -Split patch 3 into 4 patches
v8: -Corrected alignment [Uma]

Signed-off-by: Swati Sharma 
Reviewed-by: Jani Nikula 
---
 drivers/gpu/drm/i915/display/intel_display.c | 9 +
 1 file changed, 9 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index ea2915d..f9c0842 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -12138,6 +12138,15 @@ static void intel_dump_pipe_config(const struct 
intel_crtc_state *pipe_config,
 
intel_dpll_dump_hw_state(dev_priv, &pipe_config->dpll_hw_state);
 
+   if (IS_CHERRYVIEW(dev_priv))
+   DRM_DEBUG_KMS("cgm_mode: 0x%x gamma_mode: 0x%x gamma_enable: %d 
csc_enable: %d\n",
+ pipe_config->cgm_mode, pipe_config->gamma_mode,
+ pipe_config->gamma_enable, 
pipe_config->csc_enable);
+   else
+   DRM_DEBUG_KMS("csc_mode: 0x%x gamma_mode: 0x%x gamma_enable: %d 
csc_enable: %d\n",
+ pipe_config->csc_mode, pipe_config->gamma_mode,
+ pipe_config->gamma_enable, 
pipe_config->csc_enable);
+
 dump_planes:
if (!state)
return;
-- 
1.9.1

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

[Intel-gfx] [v9][PATCH 08/11] drm/i915/display: Extract ilk_read_luts()

2019-08-30 Thread Swati Sharma
For ilk, add hw read out to create hw blob of gamma
lut values.

v4: -No need to initialize *blob [Jani]
-Removed right shifts [Jani]
-Dropped dev local var [Jani]
v5: -Returned blob instead of assigning it internally within the
 function [Ville]
-Renamed ilk_get_color_config() to ilk_read_luts() [Ville]
v9: -80 character limit [Uma]
-Made read func para as const [Ville, Uma]
-Renamed ilk_read_gamma_lut() to ilk_read_lut_10() [Uma, Ville]

Signed-off-by: Swati Sharma 
---
 drivers/gpu/drm/i915/display/intel_color.c | 45 +-
 drivers/gpu/drm/i915/i915_reg.h|  3 ++
 2 files changed, 47 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index b28b3b9..33bcbda 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1711,6 +1711,47 @@ static void chv_read_luts(struct intel_crtc_state 
*crtc_state)
crtc_state->base.gamma_lut = chv_read_cgm_lut(crtc_state);
 }
 
+static struct drm_property_blob *
+ilk_read_lut_10(const struct intel_crtc_state *crtc_state)
+{
+   struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
+   struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+   u32 lut_size = INTEL_INFO(dev_priv)->color.gamma_lut_size;
+   enum pipe pipe = crtc->pipe;
+   struct drm_property_blob *blob;
+   struct drm_color_lut *blob_data;
+   u32 i, val;
+
+   blob = drm_property_create_blob(&dev_priv->drm,
+   sizeof(struct drm_color_lut) * lut_size,
+   NULL);
+   if (IS_ERR(blob))
+   return NULL;
+
+   blob_data = blob->data;
+
+   for (i = 0; i < lut_size - 1; i++) {
+   val = I915_READ(PREC_PALETTE(pipe, i));
+
+   blob_data[i].red = intel_color_lut_pack(REG_FIELD_GET(
+   PREC_PALETTE_RED_MASK, 
val), 10);
+   blob_data[i].green = intel_color_lut_pack(REG_FIELD_GET(
+ 
PREC_PALETTE_GREEN_MASK, val), 10);
+   blob_data[i].blue = intel_color_lut_pack(REG_FIELD_GET(
+
PREC_PALETTE_BLUE_MASK, val), 10);
+   }
+
+   return blob;
+}
+
+static void ilk_read_luts(struct intel_crtc_state *crtc_state)
+{
+   if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT)
+   crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
+   else
+   crtc_state->base.gamma_lut = ilk_read_lut_10(crtc_state);
+}
+
 void intel_color_init(struct intel_crtc *crtc)
 {
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
@@ -1760,8 +1801,10 @@ void intel_color_init(struct intel_crtc *crtc)
dev_priv->display.load_luts = bdw_load_luts;
else if (INTEL_GEN(dev_priv) >= 7)
dev_priv->display.load_luts = ivb_load_luts;
-   else
+   else {
dev_priv->display.load_luts = ilk_load_luts;
+   dev_priv->display.read_luts = ilk_read_luts;
+   }
}
 
drm_crtc_enable_color_mgmt(&crtc->base,
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index f5a2e73..e457739 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -7203,6 +7203,9 @@ enum {
 /* ilk/snb precision palette */
 #define _PREC_PALETTE_A   0x4b000
 #define _PREC_PALETTE_B   0x4c000
+#define   PREC_PALETTE_RED_MASK   REG_GENMASK(29, 20)
+#define   PREC_PALETTE_GREEN_MASK REG_GENMASK(19, 10)
+#define   PREC_PALETTE_BLUE_MASK  REG_GENMASK(9, 0)
 #define PREC_PALETTE(pipe, i) _MMIO(_PIPE(pipe, _PREC_PALETTE_A, 
_PREC_PALETTE_B) + (i) * 4)
 
 #define  _PREC_PIPEAGCMAX  0x4d000
-- 
1.9.1

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

  1   2   3   >