Re: [PATCH] video: fbdev: sh_mobile_lcdcfb: Remove sh_mobile_lcdc_check_var() declaration

2022-04-11 Thread Helge Deller
On 4/11/22 14:58, Geert Uytterhoeven wrote:
> As of commit 0fe66f327c464943 ("fbdev/sh_mobile: remove
> sh_mobile_lcdc_display_notify"), there is no longer a need for a foward
> declaration of sh_mobile_lcdc_check_var().
>
> Signed-off-by: Geert Uytterhoeven 

applied.

Thanks!
Helge

> ---
>  drivers/video/fbdev/sh_mobile_lcdcfb.c | 3 ---
>  1 file changed, 3 deletions(-)
>
> diff --git a/drivers/video/fbdev/sh_mobile_lcdcfb.c 
> b/drivers/video/fbdev/sh_mobile_lcdcfb.c
> index aa4ebe3192ec9735..9a4417430b4e948f 100644
> --- a/drivers/video/fbdev/sh_mobile_lcdcfb.c
> +++ b/drivers/video/fbdev/sh_mobile_lcdcfb.c
> @@ -531,9 +531,6 @@ static void sh_mobile_lcdc_display_off(struct 
> sh_mobile_lcdc_chan *ch)
>   ch->tx_dev->ops->display_off(ch->tx_dev);
>  }
>
> -static int sh_mobile_lcdc_check_var(struct fb_var_screeninfo *var,
> - struct fb_info *info);
> -
>  /* 
> -
>   * Format helpers
>   */



Re: [PATCH v9 1/3] i915/gvt: Separate the MMIO tracking table from GVT-g

2022-04-11 Thread Wang, Zhi A
Ping. :)

On 4/8/22 2:07 PM, Zhi Wang wrote:
> Hi Jani:
> 
> Thanks so much for the help. Can you generate a new tag on drm-intel-next? I 
> noticed that there was one patch moving the DMC related registers into 
> display/intel_dmc_regs.h, which is not included in the latest tag on 
> drm-intel-next.
> 
> Guess it would be better that I can change this patch according to it when 
> checking in. This would prevent a conflict in future.
> 
> Thanks,
> Zhi.
> 
> On 4/7/22 3:03 PM, Jani Nikula wrote:
>> On Thu, 07 Apr 2022, Zhi Wang  wrote:
>>> diff --git a/drivers/gpu/drm/i915/intel_gvt.h 
>>> b/drivers/gpu/drm/i915/intel_gvt.h
>>> index d7d3fb6186fd..7665d7cf0bdd 100644
>>> --- a/drivers/gpu/drm/i915/intel_gvt.h
>>> +++ b/drivers/gpu/drm/i915/intel_gvt.h
>>> @@ -26,7 +26,17 @@
>>>  
>>>  struct drm_i915_private;
>>>  
>>> +#include 
>>
>> You only need . Please add it before the forward
>> declaration above.
>>
>>> +
>>>  #ifdef CONFIG_DRM_I915_GVT
>>> +
>>> +struct intel_gvt_mmio_table_iter {
>>> +   struct drm_i915_private *i915;
>>> +   void *data;
>>> +   int (*handle_mmio_cb)(struct intel_gvt_mmio_table_iter *iter,
>>> + u32 offset, u32 size);
>>> +};
>>> +
>>>  int intel_gvt_init(struct drm_i915_private *dev_priv);
>>>  void intel_gvt_driver_remove(struct drm_i915_private *dev_priv);
>>>  int intel_gvt_init_device(struct drm_i915_private *dev_priv);
>>> @@ -34,6 +44,7 @@ void intel_gvt_clean_device(struct drm_i915_private 
>>> *dev_priv);
>>>  int intel_gvt_init_host(void);
>>>  void intel_gvt_sanitize_options(struct drm_i915_private *dev_priv);
>>>  void intel_gvt_resume(struct drm_i915_private *dev_priv);
>>> +int intel_gvt_iterate_mmio_table(struct intel_gvt_mmio_table_iter *iter);
>>>  #else
>>>  static inline int intel_gvt_init(struct drm_i915_private *dev_priv)
>>>  {
>>> @@ -51,6 +62,16 @@ static inline void intel_gvt_sanitize_options(struct 
>>> drm_i915_private *dev_priv)
>>>  static inline void intel_gvt_resume(struct drm_i915_private *dev_priv)
>>>  {
>>>  }
>>> +
>>> +unsigned long intel_gvt_get_device_type(struct drm_i915_private *i915)
>>> +{
>>> +   return 0;
>>> +}
>>
>> The CONFIG_DRM_I915_GVT=y counterpart for this is in mmio.h. Should be
>> both in the same header.
>>
>>> +
>>> +int intel_gvt_iterate_mmio_table(struct intel_gvt_mmio_table_iter *iter)
>>> +{
>>> +   return 0;
>>> +}
>>>  #endif
>>>  
>>>  #endif /* _INTEL_GVT_H_ */
>>> diff --git a/drivers/gpu/drm/i915/intel_gvt_mmio_table.c 
>>> b/drivers/gpu/drm/i915/intel_gvt_mmio_table.c
>>> new file mode 100644
>>> index ..d29491a6d209
>>> --- /dev/null
>>> +++ b/drivers/gpu/drm/i915/intel_gvt_mmio_table.c
>>> @@ -0,0 +1,1290 @@
>>> +// SPDX-License-Identifier: MIT
>>> +/*
>>> + * Copyright © 2020 Intel Corporation
>>> + */
>>> +
>>> +#include "i915_drv.h"
>>> +#include "i915_reg.h"
>>> +#include "display/vlv_dsi_pll_regs.h"
>>> +#include "gt/intel_gt_regs.h"
>>> +#include "intel_mchbar_regs.h"
>>> +#include "i915_pvinfo.h"
>>> +#include "intel_gvt.h"
>>> +#include "gvt/gvt.h"
>>
>> Generally we have the include lists sorted.
>>
>> Other than the nitpicks above, the series is
>>
>> Acked-by: Jani Nikula 
>>
>>
>> BR,
>> Jani.
>>
>>
> 



RE: [PATCH v4] drm/hyperv: Add error message for fb size greater than allocated

2022-04-11 Thread Dexuan Cui
> From: Saurabh Sengar 
> Sent: Monday, April 11, 2022 9:29 PM
>  ...
> Add error message when the size of requested framebuffer is more than
> the allocated size by vmbus mmio region for framebuffer

The line lacks a period, but I guess the maintainer may help fix it for you :-)
 
> Signed-off-by: Saurabh Sengar 

Reviewed-by: Dexuan Cui 


[PATCH 6/6] drm/sun4i: sun8i-hdmi-phy: Group PHY ops functions by generation

2022-04-11 Thread Samuel Holland
Now that the PHY ops are separated, sort them topologically, with the
common sun8i_hdmi_phy_set_polarity helper at the top. No function
contents are changed in this commit.

Signed-off-by: Samuel Holland 
---

 drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c | 67 --
 1 file changed, 32 insertions(+), 35 deletions(-)

diff --git a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c 
b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
index 5be5c360ca7d..cc239106ba49 100644
--- a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
+++ b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
@@ -124,7 +124,19 @@ static const struct dw_hdmi_phy_config 
sun50i_h6_phy_config[] = {
 };
 
 static void sun8i_hdmi_phy_set_polarity(struct sun8i_hdmi_phy *phy,
-   const struct drm_display_mode *mode);
+   const struct drm_display_mode *mode)
+{
+   u32 val = 0;
+
+   if (mode->flags & DRM_MODE_FLAG_NHSYNC)
+   val |= SUN8I_HDMI_PHY_DBG_CTRL_POL_NHSYNC;
+
+   if (mode->flags & DRM_MODE_FLAG_NVSYNC)
+   val |= SUN8I_HDMI_PHY_DBG_CTRL_POL_NVSYNC;
+
+   regmap_update_bits(phy->regs, SUN8I_HDMI_PHY_DBG_CTRL_REG,
+  SUN8I_HDMI_PHY_DBG_CTRL_POL_MASK, val);
+};
 
 static int sun8i_a83t_hdmi_phy_config(struct dw_hdmi *hdmi, void *data,
  const struct drm_display_info *display,
@@ -193,6 +205,25 @@ static int sun8i_a83t_hdmi_phy_config(struct dw_hdmi 
*hdmi, void *data,
return 0;
 }
 
+static void sun8i_a83t_hdmi_phy_disable(struct dw_hdmi *hdmi, void *data)
+{
+   struct sun8i_hdmi_phy *phy = data;
+
+   dw_hdmi_phy_gen2_txpwron(hdmi, 0);
+   dw_hdmi_phy_gen2_pddq(hdmi, 1);
+
+   regmap_update_bits(phy->regs, SUN8I_HDMI_PHY_REXT_CTRL_REG,
+  SUN8I_HDMI_PHY_REXT_CTRL_REXT_EN, 0);
+}
+
+static const struct dw_hdmi_phy_ops sun8i_a83t_hdmi_phy_ops = {
+   .init   = sun8i_a83t_hdmi_phy_config,
+   .disable= sun8i_a83t_hdmi_phy_disable,
+   .read_hpd   = dw_hdmi_phy_read_hpd,
+   .update_hpd = dw_hdmi_phy_update_hpd,
+   .setup_hpd  = dw_hdmi_phy_setup_hpd,
+};
+
 static int sun8i_h3_hdmi_phy_config(struct dw_hdmi *hdmi, void *data,
const struct drm_display_info *display,
const struct drm_display_mode *mode)
@@ -348,32 +379,6 @@ static int sun8i_h3_hdmi_phy_config(struct dw_hdmi *hdmi, 
void *data,
return 0;
 }
 
-static void sun8i_hdmi_phy_set_polarity(struct sun8i_hdmi_phy *phy,
-   const struct drm_display_mode *mode)
-{
-   u32 val = 0;
-
-   if (mode->flags & DRM_MODE_FLAG_NHSYNC)
-   val |= SUN8I_HDMI_PHY_DBG_CTRL_POL_NHSYNC;
-
-   if (mode->flags & DRM_MODE_FLAG_NVSYNC)
-   val |= SUN8I_HDMI_PHY_DBG_CTRL_POL_NVSYNC;
-
-   regmap_update_bits(phy->regs, SUN8I_HDMI_PHY_DBG_CTRL_REG,
-  SUN8I_HDMI_PHY_DBG_CTRL_POL_MASK, val);
-};
-
-static void sun8i_a83t_hdmi_phy_disable(struct dw_hdmi *hdmi, void *data)
-{
-   struct sun8i_hdmi_phy *phy = data;
-
-   dw_hdmi_phy_gen2_txpwron(hdmi, 0);
-   dw_hdmi_phy_gen2_pddq(hdmi, 1);
-
-   regmap_update_bits(phy->regs, SUN8I_HDMI_PHY_REXT_CTRL_REG,
-  SUN8I_HDMI_PHY_REXT_CTRL_REXT_EN, 0);
-}
-
 static void sun8i_h3_hdmi_phy_disable(struct dw_hdmi *hdmi, void *data)
 {
struct sun8i_hdmi_phy *phy = data;
@@ -385,14 +390,6 @@ static void sun8i_h3_hdmi_phy_disable(struct dw_hdmi 
*hdmi, void *data)
regmap_write(phy->regs, SUN8I_HDMI_PHY_PLL_CFG1_REG, 0);
 }
 
-static const struct dw_hdmi_phy_ops sun8i_a83t_hdmi_phy_ops = {
-   .init   = sun8i_a83t_hdmi_phy_config,
-   .disable= sun8i_a83t_hdmi_phy_disable,
-   .read_hpd   = dw_hdmi_phy_read_hpd,
-   .update_hpd = dw_hdmi_phy_update_hpd,
-   .setup_hpd  = dw_hdmi_phy_setup_hpd,
-};
-
 static const struct dw_hdmi_phy_ops sun8i_h3_hdmi_phy_ops = {
.init   = sun8i_h3_hdmi_phy_config,
.disable= sun8i_h3_hdmi_phy_disable,
-- 
2.35.1



[PATCH 5/6] drm/sun4i: sun8i-hdmi-phy: Separate A83T and H3 PHY ops

2022-04-11 Thread Samuel Holland
Since the driver already needs to support multiple sets of ops, we can
drop the mid-layer used by the A83T and H3 PHYs. They share only a small
amount of code; factor this out as sun8i_hdmi_phy_set_polarity.

For clarity, this commit keeps the existing function order.

Signed-off-by: Samuel Holland 
---

 drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h  |  5 --
 drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c | 89 +-
 2 files changed, 46 insertions(+), 48 deletions(-)

diff --git a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h 
b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h
index f0b1aaad27d9..f082b8ecfe2c 100644
--- a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h
+++ b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h
@@ -156,11 +156,6 @@ struct sun8i_hdmi_phy_variant {
const struct dw_hdmi_phy_config *phy_cfg;
const struct dw_hdmi_phy_ops *phy_ops;
void (*phy_init)(struct sun8i_hdmi_phy *phy);
-   void (*phy_disable)(struct dw_hdmi *hdmi,
-   struct sun8i_hdmi_phy *phy);
-   int  (*phy_config)(struct dw_hdmi *hdmi,
-  struct sun8i_hdmi_phy *phy,
-  unsigned int clk_rate);
 };
 
 struct sun8i_hdmi_phy {
diff --git a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c 
b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
index 71062e4e8666..5be5c360ca7d 100644
--- a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
+++ b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
@@ -123,10 +123,18 @@ static const struct dw_hdmi_phy_config 
sun50i_h6_phy_config[] = {
{ ~0UL,  0x, 0x, 0x}
 };
 
-static int sun8i_hdmi_phy_config_a83t(struct dw_hdmi *hdmi,
- struct sun8i_hdmi_phy *phy,
- unsigned int clk_rate)
+static void sun8i_hdmi_phy_set_polarity(struct sun8i_hdmi_phy *phy,
+   const struct drm_display_mode *mode);
+
+static int sun8i_a83t_hdmi_phy_config(struct dw_hdmi *hdmi, void *data,
+ const struct drm_display_info *display,
+ const struct drm_display_mode *mode)
 {
+   unsigned int clk_rate = mode->crtc_clock * 1000;
+   struct sun8i_hdmi_phy *phy = data;
+
+   sun8i_hdmi_phy_set_polarity(phy, mode);
+
regmap_update_bits(phy->regs, SUN8I_HDMI_PHY_REXT_CTRL_REG,
   SUN8I_HDMI_PHY_REXT_CTRL_REXT_EN,
   SUN8I_HDMI_PHY_REXT_CTRL_REXT_EN);
@@ -185,10 +193,12 @@ static int sun8i_hdmi_phy_config_a83t(struct dw_hdmi 
*hdmi,
return 0;
 }
 
-static int sun8i_hdmi_phy_config_h3(struct dw_hdmi *hdmi,
-   struct sun8i_hdmi_phy *phy,
-   unsigned int clk_rate)
+static int sun8i_h3_hdmi_phy_config(struct dw_hdmi *hdmi, void *data,
+   const struct drm_display_info *display,
+   const struct drm_display_mode *mode)
 {
+   unsigned int clk_rate = mode->crtc_clock * 1000;
+   struct sun8i_hdmi_phy *phy = data;
u32 pll_cfg1_init;
u32 pll_cfg2_init;
u32 ana_cfg1_end;
@@ -197,6 +207,11 @@ static int sun8i_hdmi_phy_config_h3(struct dw_hdmi *hdmi,
u32 b_offset = 0;
u32 val;
 
+   if (phy->variant->has_phy_clk)
+   clk_set_rate(phy->clk_phy, clk_rate);
+
+   sun8i_hdmi_phy_set_polarity(phy, mode);
+
/* bandwidth / frequency independent settings */
 
pll_cfg1_init = SUN8I_HDMI_PHY_PLL_CFG1_LDO2_EN |
@@ -333,11 +348,9 @@ static int sun8i_hdmi_phy_config_h3(struct dw_hdmi *hdmi,
return 0;
 }
 
-static int sun8i_hdmi_phy_config(struct dw_hdmi *hdmi, void *data,
-const struct drm_display_info *display,
-const struct drm_display_mode *mode)
+static void sun8i_hdmi_phy_set_polarity(struct sun8i_hdmi_phy *phy,
+   const struct drm_display_mode *mode)
 {
-   struct sun8i_hdmi_phy *phy = (struct sun8i_hdmi_phy *)data;
u32 val = 0;
 
if (mode->flags & DRM_MODE_FLAG_NHSYNC)
@@ -348,16 +361,12 @@ static int sun8i_hdmi_phy_config(struct dw_hdmi *hdmi, 
void *data,
 
regmap_update_bits(phy->regs, SUN8I_HDMI_PHY_DBG_CTRL_REG,
   SUN8I_HDMI_PHY_DBG_CTRL_POL_MASK, val);
-
-   if (phy->variant->has_phy_clk)
-   clk_set_rate(phy->clk_phy, mode->crtc_clock * 1000);
-
-   return phy->variant->phy_config(hdmi, phy, mode->crtc_clock * 1000);
 };
 
-static void sun8i_hdmi_phy_disable_a83t(struct dw_hdmi *hdmi,
-   struct sun8i_hdmi_phy *phy)
+static void sun8i_a83t_hdmi_phy_disable(struct dw_hdmi *hdmi, void *data)
 {
+   struct sun8i_hdmi_phy *phy = data;
+
dw_hdmi_phy_gen2_txpwron(hdmi, 0);
dw_hdmi_phy_gen2_pddq(hdmi, 1);
 
@@ -365,9 +374,10 @@ static void sun8i_hdmi_phy_disable_a83t(struct dw_hdmi 
*hdmi,

[PATCH 4/6] drm/sun4i: sun8i-hdmi-phy: Support multiple custom PHY ops

2022-04-11 Thread Samuel Holland
The D1 SoC comes with a new custom HDMI PHY, which does not share any
registers with the existing custom PHY. So it needs a new set of ops.
Instead of providing a flag in the variant structure, provide the ops
themselves.

Signed-off-by: Samuel Holland 
---

 drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h  |  2 +-
 drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c | 12 ++--
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h 
b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h
index 0adbfac6eb31..f0b1aaad27d9 100644
--- a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h
+++ b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h
@@ -151,10 +151,10 @@ struct sun8i_hdmi_phy;
 struct sun8i_hdmi_phy_variant {
bool has_phy_clk;
bool has_second_pll;
-   unsigned int is_custom_phy : 1;
const struct dw_hdmi_curr_ctrl *cur_ctr;
const struct dw_hdmi_mpll_config *mpll_cfg;
const struct dw_hdmi_phy_config *phy_cfg;
+   const struct dw_hdmi_phy_ops *phy_ops;
void (*phy_init)(struct sun8i_hdmi_phy *phy);
void (*phy_disable)(struct dw_hdmi *hdmi,
struct sun8i_hdmi_phy *phy);
diff --git a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c 
b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
index 1351e633d485..71062e4e8666 100644
--- a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
+++ b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
@@ -567,8 +567,8 @@ void sun8i_hdmi_phy_set_ops(struct sun8i_hdmi_phy *phy,
 {
const struct sun8i_hdmi_phy_variant *variant = phy->variant;
 
-   if (variant->is_custom_phy) {
-   plat_data->phy_ops = _hdmi_phy_ops;
+   if (variant->phy_ops) {
+   plat_data->phy_ops = variant->phy_ops;
plat_data->phy_name = "sun8i_dw_hdmi_phy";
plat_data->phy_data = phy;
} else {
@@ -587,7 +587,7 @@ static const struct regmap_config 
sun8i_hdmi_phy_regmap_config = {
 };
 
 static const struct sun8i_hdmi_phy_variant sun8i_a83t_hdmi_phy = {
-   .is_custom_phy = true,
+   .phy_ops = _hdmi_phy_ops,
.phy_init = _hdmi_phy_init_a83t,
.phy_disable = _hdmi_phy_disable_a83t,
.phy_config = _hdmi_phy_config_a83t,
@@ -595,7 +595,7 @@ static const struct sun8i_hdmi_phy_variant 
sun8i_a83t_hdmi_phy = {
 
 static const struct sun8i_hdmi_phy_variant sun8i_h3_hdmi_phy = {
.has_phy_clk = true,
-   .is_custom_phy = true,
+   .phy_ops = _hdmi_phy_ops,
.phy_init = _hdmi_phy_init_h3,
.phy_disable = _hdmi_phy_disable_h3,
.phy_config = _hdmi_phy_config_h3,
@@ -604,7 +604,7 @@ static const struct sun8i_hdmi_phy_variant 
sun8i_h3_hdmi_phy = {
 static const struct sun8i_hdmi_phy_variant sun8i_r40_hdmi_phy = {
.has_phy_clk = true,
.has_second_pll = true,
-   .is_custom_phy = true,
+   .phy_ops = _hdmi_phy_ops,
.phy_init = _hdmi_phy_init_h3,
.phy_disable = _hdmi_phy_disable_h3,
.phy_config = _hdmi_phy_config_h3,
@@ -612,7 +612,7 @@ static const struct sun8i_hdmi_phy_variant 
sun8i_r40_hdmi_phy = {
 
 static const struct sun8i_hdmi_phy_variant sun50i_a64_hdmi_phy = {
.has_phy_clk = true,
-   .is_custom_phy = true,
+   .phy_ops = _hdmi_phy_ops,
.phy_init = _hdmi_phy_init_h3,
.phy_disable = _hdmi_phy_disable_h3,
.phy_config = _hdmi_phy_config_h3,
-- 
2.35.1



[PATCH 3/6] drm/sun4i: sun8i-hdmi-phy: Used device-managed clocks/resets

2022-04-11 Thread Samuel Holland
Now that the HDMI PHY is using a platform driver, it can use device-
managed resources. Use these, as well as the dev_err_probe helper, to
simplify the probe function and get rid of the remove function.

Signed-off-by: Samuel Holland 
---

 drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c | 100 -
 1 file changed, 30 insertions(+), 70 deletions(-)

diff --git a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c 
b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
index 1effa30bfe62..1351e633d485 100644
--- a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
+++ b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
@@ -673,10 +673,8 @@ int sun8i_hdmi_phy_get(struct sun8i_dw_hdmi *hdmi, struct 
device_node *node)
 static int sun8i_hdmi_phy_probe(struct platform_device *pdev)
 {
struct device *dev = >dev;
-   struct device_node *node = dev->of_node;
struct sun8i_hdmi_phy *phy;
void __iomem *regs;
-   int ret;
 
phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL);
if (!phy)
@@ -686,88 +684,50 @@ static int sun8i_hdmi_phy_probe(struct platform_device 
*pdev)
phy->dev = dev;
 
regs = devm_platform_ioremap_resource(pdev, 0);
-   if (IS_ERR(regs)) {
-   dev_err(dev, "Couldn't map the HDMI PHY registers\n");
-   return PTR_ERR(regs);
-   }
+   if (IS_ERR(regs))
+   return dev_err_probe(dev, PTR_ERR(regs),
+"Couldn't map the HDMI PHY registers\n");
 
phy->regs = devm_regmap_init_mmio(dev, regs,
  _hdmi_phy_regmap_config);
-   if (IS_ERR(phy->regs)) {
-   dev_err(dev, "Couldn't create the HDMI PHY regmap\n");
-   return PTR_ERR(phy->regs);
-   }
+   if (IS_ERR(phy->regs))
+   return dev_err_probe(dev, PTR_ERR(phy->regs),
+"Couldn't create the HDMI PHY regmap\n");
 
-   phy->clk_bus = of_clk_get_by_name(node, "bus");
-   if (IS_ERR(phy->clk_bus)) {
-   dev_err(dev, "Could not get bus clock\n");
-   return PTR_ERR(phy->clk_bus);
-   }
-
-   phy->clk_mod = of_clk_get_by_name(node, "mod");
-   if (IS_ERR(phy->clk_mod)) {
-   dev_err(dev, "Could not get mod clock\n");
-   ret = PTR_ERR(phy->clk_mod);
-   goto err_put_clk_bus;
-   }
+   phy->clk_bus = devm_clk_get(dev, "bus");
+   if (IS_ERR(phy->clk_bus))
+   return dev_err_probe(dev, PTR_ERR(phy->clk_bus),
+"Could not get bus clock\n");
 
-   if (phy->variant->has_phy_clk) {
-   phy->clk_pll0 = of_clk_get_by_name(node, "pll-0");
-   if (IS_ERR(phy->clk_pll0)) {
-   dev_err(dev, "Could not get pll-0 clock\n");
-   ret = PTR_ERR(phy->clk_pll0);
-   goto err_put_clk_mod;
-   }
-
-   if (phy->variant->has_second_pll) {
-   phy->clk_pll1 = of_clk_get_by_name(node, "pll-1");
-   if (IS_ERR(phy->clk_pll1)) {
-   dev_err(dev, "Could not get pll-1 clock\n");
-   ret = PTR_ERR(phy->clk_pll1);
-   goto err_put_clk_pll0;
-   }
-   }
-   }
+   phy->clk_mod = devm_clk_get(dev, "mod");
+   if (IS_ERR(phy->clk_mod))
+   return dev_err_probe(dev, PTR_ERR(phy->clk_mod),
+"Could not get mod clock\n");
 
-   phy->rst_phy = of_reset_control_get_shared(node, "phy");
-   if (IS_ERR(phy->rst_phy)) {
-   dev_err(dev, "Could not get phy reset control\n");
-   ret = PTR_ERR(phy->rst_phy);
-   goto err_put_clk_pll1;
-   }
+   if (phy->variant->has_phy_clk)
+   phy->clk_pll0 = devm_clk_get(dev, "pll-0");
+   if (IS_ERR(phy->clk_pll0))
+   return dev_err_probe(dev, PTR_ERR(phy->clk_pll0),
+"Could not get pll-0 clock\n");
+
+   if (phy->variant->has_second_pll)
+   phy->clk_pll1 = devm_clk_get(dev, "pll-1");
+   if (IS_ERR(phy->clk_pll1))
+   return dev_err_probe(dev, PTR_ERR(phy->clk_pll1),
+"Could not get pll-1 clock\n");
+
+   phy->rst_phy = devm_reset_control_get_shared(dev, "phy");
+   if (IS_ERR(phy->rst_phy))
+   return dev_err_probe(dev, PTR_ERR(phy->rst_phy),
+"Could not get phy reset control\n");
 
platform_set_drvdata(pdev, phy);
 
return 0;
-
-err_put_clk_pll1:
-   clk_put(phy->clk_pll1);
-err_put_clk_pll0:
-   clk_put(phy->clk_pll0);
-err_put_clk_mod:
-   clk_put(phy->clk_mod);
-err_put_clk_bus:
-   clk_put(phy->clk_bus);
-
-   return ret;
-}
-
-static int sun8i_hdmi_phy_remove(struct platform_device *pdev)
-{
-   

[PATCH 2/6] drm/sun4i: sun8i-hdmi-phy: Use devm_platform_ioremap_resource

2022-04-11 Thread Samuel Holland
The struct resource is not used for anything else, so we can simplify
the code a bit by using the helper function.

Signed-off-by: Samuel Holland 
---

 drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c | 9 +
 1 file changed, 1 insertion(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c 
b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
index 7b901aef789a..1effa30bfe62 100644
--- a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
+++ b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
@@ -675,7 +675,6 @@ static int sun8i_hdmi_phy_probe(struct platform_device 
*pdev)
struct device *dev = >dev;
struct device_node *node = dev->of_node;
struct sun8i_hdmi_phy *phy;
-   struct resource res;
void __iomem *regs;
int ret;
 
@@ -686,13 +685,7 @@ static int sun8i_hdmi_phy_probe(struct platform_device 
*pdev)
phy->variant = of_device_get_match_data(dev);
phy->dev = dev;
 
-   ret = of_address_to_resource(node, 0, );
-   if (ret) {
-   dev_err(dev, "phy: Couldn't get our resources\n");
-   return ret;
-   }
-
-   regs = devm_ioremap_resource(dev, );
+   regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(regs)) {
dev_err(dev, "Couldn't map the HDMI PHY registers\n");
return PTR_ERR(regs);
-- 
2.35.1



[PATCH 1/6] drm/sun4i: sun8i-hdmi-phy: Use of_device_get_match_data

2022-04-11 Thread Samuel Holland
Now that the HDMI PHY is using a platform driver, we can use the usual
helper function for getting the variant structure.

Signed-off-by: Samuel Holland 
---

 drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h  |  2 +-
 drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c | 11 ++-
 2 files changed, 3 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h 
b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h
index bffe1b9cd3dc..0adbfac6eb31 100644
--- a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h
+++ b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h
@@ -173,7 +173,7 @@ struct sun8i_hdmi_phy {
unsigned intrcal;
struct regmap   *regs;
struct reset_control*rst_phy;
-   struct sun8i_hdmi_phy_variant   *variant;
+   const struct sun8i_hdmi_phy_variant *variant;
 };
 
 struct sun8i_dw_hdmi_quirks {
diff --git a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c 
b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
index 5e2b0175df36..7b901aef789a 100644
--- a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
+++ b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
@@ -565,7 +565,7 @@ void sun8i_hdmi_phy_deinit(struct sun8i_hdmi_phy *phy)
 void sun8i_hdmi_phy_set_ops(struct sun8i_hdmi_phy *phy,
struct dw_hdmi_plat_data *plat_data)
 {
-   struct sun8i_hdmi_phy_variant *variant = phy->variant;
+   const struct sun8i_hdmi_phy_variant *variant = phy->variant;
 
if (variant->is_custom_phy) {
plat_data->phy_ops = _hdmi_phy_ops;
@@ -672,7 +672,6 @@ int sun8i_hdmi_phy_get(struct sun8i_dw_hdmi *hdmi, struct 
device_node *node)
 
 static int sun8i_hdmi_phy_probe(struct platform_device *pdev)
 {
-   const struct of_device_id *match;
struct device *dev = >dev;
struct device_node *node = dev->of_node;
struct sun8i_hdmi_phy *phy;
@@ -680,17 +679,11 @@ static int sun8i_hdmi_phy_probe(struct platform_device 
*pdev)
void __iomem *regs;
int ret;
 
-   match = of_match_node(sun8i_hdmi_phy_of_table, node);
-   if (!match) {
-   dev_err(dev, "Incompatible HDMI PHY\n");
-   return -EINVAL;
-   }
-
phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL);
if (!phy)
return -ENOMEM;
 
-   phy->variant = (struct sun8i_hdmi_phy_variant *)match->data;
+   phy->variant = of_device_get_match_data(dev);
phy->dev = dev;
 
ret = of_address_to_resource(node, 0, );
-- 
2.35.1



[PATCH 0/6] drm/sun4i: HDMI PHY cleanup/refactoring

2022-04-11 Thread Samuel Holland
This series prepares the sun8i HDMI PHY driver for supporting the new
custom PHY in the Allwinner D1 SoC. No functional change intended here.

This series was tested on D1 and H3.


Samuel Holland (6):
  drm/sun4i: sun8i-hdmi-phy: Use of_device_get_match_data
  drm/sun4i: sun8i-hdmi-phy: Use devm_platform_ioremap_resource
  drm/sun4i: sun8i-hdmi-phy: Used device-managed clocks/resets
  drm/sun4i: sun8i-hdmi-phy: Support multiple custom PHY ops
  drm/sun4i: sun8i-hdmi-phy: Separate A83T and H3 PHY ops
  drm/sun4i: sun8i-hdmi-phy: Group PHY ops functions by generation

 drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h  |   9 +-
 drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c | 252 ++---
 2 files changed, 101 insertions(+), 160 deletions(-)

-- 
2.35.1



[PATCH v4] drm/hyperv: Add error message for fb size greater than allocated

2022-04-11 Thread Saurabh Sengar
Add error message when the size of requested framebuffer is more than
the allocated size by vmbus mmio region for framebuffer

Signed-off-by: Saurabh Sengar 
---
v3 -> v4 :
* Shorter error message
* Alignment match for open parenthesis
* Added -> Add (typo fix in commit message)

 drivers/gpu/drm/hyperv/hyperv_drm_modeset.c | 5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/hyperv/hyperv_drm_modeset.c 
b/drivers/gpu/drm/hyperv/hyperv_drm_modeset.c
index e82b815..27f4fcb 100644
--- a/drivers/gpu/drm/hyperv/hyperv_drm_modeset.c
+++ b/drivers/gpu/drm/hyperv/hyperv_drm_modeset.c
@@ -123,8 +123,11 @@ static int hyperv_pipe_check(struct 
drm_simple_display_pipe *pipe,
if (fb->format->format != DRM_FORMAT_XRGB)
return -EINVAL;
 
-   if (fb->pitches[0] * fb->height > hv->fb_size)
+   if (fb->pitches[0] * fb->height > hv->fb_size) {
+   drm_err(>dev, "fb size requested by %s for %dX%d (pitch %d) 
greater than %ld\n",
+   current->comm, fb->width, fb->height, fb->pitches[0], 
hv->fb_size);
return -EINVAL;
+   }
 
return 0;
 }
-- 
1.8.3.1



[PATCH v2 14/14] drm/sun4i: Add compatible for D1 display engine

2022-04-11 Thread Samuel Holland
Now that the various blocks in the D1 display engine pipeline are
supported, we can enable the overall engine.

Acked-by: Jernej Skrabec 
Signed-off-by: Samuel Holland 
---

(no changes since v1)

 drivers/gpu/drm/sun4i/sun4i_drv.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/sun4i/sun4i_drv.c 
b/drivers/gpu/drm/sun4i/sun4i_drv.c
index 6a9ba8a77c77..275f7e4a03ae 100644
--- a/drivers/gpu/drm/sun4i/sun4i_drv.c
+++ b/drivers/gpu/drm/sun4i/sun4i_drv.c
@@ -418,6 +418,7 @@ static const struct of_device_id sun4i_drv_of_table[] = {
{ .compatible = "allwinner,sun8i-r40-display-engine" },
{ .compatible = "allwinner,sun8i-v3s-display-engine" },
{ .compatible = "allwinner,sun9i-a80-display-engine" },
+   { .compatible = "allwinner,sun20i-d1-display-engine" },
{ .compatible = "allwinner,sun50i-a64-display-engine" },
{ .compatible = "allwinner,sun50i-h6-display-engine" },
{ }
-- 
2.35.1



[PATCH v2 13/14] drm/sun4i: Add support for D1 TCONs

2022-04-11 Thread Samuel Holland
D1 has a TCON TOP, so its quirks are similar to those for the R40 TCONs.
While there are some register changes, the part of the TCON TV supported
by the driver matches the R40 quirks, so that quirks structure can be
reused. D1 has the first supported TCON LCD with a TCON TOP, so the TCON
LCD needs a new quirks structure.

D1's TCON LCD hardware supports LVDS; in fact it provides dual-link LVDS
from a single TCON. However, it comes with a brand new LVDS PHY. Since
this PHY has not been tested, leave out LVDS driver support for now.

Signed-off-by: Samuel Holland 
---

(no changes since v1)

 drivers/gpu/drm/sun4i/sun4i_tcon.c | 8 
 1 file changed, 8 insertions(+)

diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.c 
b/drivers/gpu/drm/sun4i/sun4i_tcon.c
index 88db2d2a9336..2ee158aaeb9e 100644
--- a/drivers/gpu/drm/sun4i/sun4i_tcon.c
+++ b/drivers/gpu/drm/sun4i/sun4i_tcon.c
@@ -1542,6 +1542,12 @@ static const struct sun4i_tcon_quirks 
sun9i_a80_tcon_tv_quirks = {
.needs_edp_reset = true,
 };
 
+static const struct sun4i_tcon_quirks sun20i_d1_lcd_quirks = {
+   .has_channel_0  = true,
+   .dclk_min_div   = 1,
+   .set_mux= sun8i_r40_tcon_tv_set_mux,
+};
+
 /* sun4i_drv uses this list to check if a device node is a TCON */
 const struct of_device_id sun4i_tcon_of_table[] = {
{ .compatible = "allwinner,sun4i-a10-tcon", .data = _a10_quirks },
@@ -1559,6 +1565,8 @@ const struct of_device_id sun4i_tcon_of_table[] = {
{ .compatible = "allwinner,sun8i-v3s-tcon", .data = _v3s_quirks },
{ .compatible = "allwinner,sun9i-a80-tcon-lcd", .data = 
_a80_tcon_lcd_quirks },
{ .compatible = "allwinner,sun9i-a80-tcon-tv", .data = 
_a80_tcon_tv_quirks },
+   { .compatible = "allwinner,sun20i-d1-tcon-lcd", .data = 
_d1_lcd_quirks },
+   { .compatible = "allwinner,sun20i-d1-tcon-tv", .data = 
_r40_tv_quirks },
{ }
 };
 MODULE_DEVICE_TABLE(of, sun4i_tcon_of_table);
-- 
2.35.1



[PATCH v2 12/14] drm/sun4i: Add support for D1 TCON TOP

2022-04-11 Thread Samuel Holland
D1 has a TCON TOP with TCON TV0 and DSI, but no TCON TV1. This puts the
DSI clock name at index 1 in clock-output-names. Support this by only
incrementing the index for clocks that are actually supported.

Signed-off-by: Samuel Holland 
---

(no changes since v1)

 drivers/gpu/drm/sun4i/sun8i_tcon_top.c | 15 ---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c 
b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
index 1b9b8b48f4a7..da97682b6835 100644
--- a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
+++ b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
@@ -189,22 +189,23 @@ static int sun8i_tcon_top_bind(struct device *dev, struct 
device *master,
 * if TVE is active on each TCON TV. If it is, mux should be switched
 * to TVE clock parent.
 */
+   i = 0;
clk_data->hws[CLK_TCON_TOP_TV0] =
sun8i_tcon_top_register_gate(dev, "tcon-tv0", regs,
 _top->reg_lock,
-TCON_TOP_TCON_TV0_GATE, 0);
+TCON_TOP_TCON_TV0_GATE, i++);
 
if (quirks->has_tcon_tv1)
clk_data->hws[CLK_TCON_TOP_TV1] =
sun8i_tcon_top_register_gate(dev, "tcon-tv1", regs,
 _top->reg_lock,
-TCON_TOP_TCON_TV1_GATE, 1);
+TCON_TOP_TCON_TV1_GATE, 
i++);
 
if (quirks->has_dsi)
clk_data->hws[CLK_TCON_TOP_DSI] =
sun8i_tcon_top_register_gate(dev, "dsi", regs,
 _top->reg_lock,
-TCON_TOP_TCON_DSI_GATE, 2);
+TCON_TOP_TCON_DSI_GATE, 
i++);
 
for (i = 0; i < CLK_NUM; i++)
if (IS_ERR(clk_data->hws[i])) {
@@ -272,6 +273,10 @@ static const struct sun8i_tcon_top_quirks 
sun8i_r40_tcon_top_quirks = {
.has_dsi= true,
 };
 
+static const struct sun8i_tcon_top_quirks sun20i_d1_tcon_top_quirks = {
+   .has_dsi= true,
+};
+
 static const struct sun8i_tcon_top_quirks sun50i_h6_tcon_top_quirks = {
/* Nothing special */
 };
@@ -282,6 +287,10 @@ const struct of_device_id sun8i_tcon_top_of_table[] = {
.compatible = "allwinner,sun8i-r40-tcon-top",
.data = _r40_tcon_top_quirks
},
+   {
+   .compatible = "allwinner,sun20i-d1-tcon-top",
+   .data = _d1_tcon_top_quirks
+   },
{
.compatible = "allwinner,sun50i-h6-tcon-top",
.data = _h6_tcon_top_quirks
-- 
2.35.1



[PATCH v2 11/14] drm/sun4i: Add support for D1 mixers

2022-04-11 Thread Samuel Holland
D1 has a display engine with the usual pair of mixers, albeit with
relatively few layers. In fact, D1 appears to be the first SoC to have
a mixer without any UI layers. Add support for these new variants.

Acked-by: Jernej Skrabec 
Signed-off-by: Samuel Holland 
---

(no changes since v1)

 drivers/gpu/drm/sun4i/sun8i_mixer.c | 26 ++
 1 file changed, 26 insertions(+)

diff --git a/drivers/gpu/drm/sun4i/sun8i_mixer.c 
b/drivers/gpu/drm/sun4i/sun8i_mixer.c
index 4ce593c99807..875a1156c04e 100644
--- a/drivers/gpu/drm/sun4i/sun8i_mixer.c
+++ b/drivers/gpu/drm/sun4i/sun8i_mixer.c
@@ -615,6 +615,24 @@ static const struct sun8i_mixer_cfg sun8i_v3s_mixer_cfg = {
.mod_rate = 15000,
 };
 
+static const struct sun8i_mixer_cfg sun20i_d1_mixer0_cfg = {
+   .ccsc   = CCSC_D1_MIXER0_LAYOUT,
+   .mod_rate   = 29700,
+   .scaler_mask= 0x3,
+   .scanline_yuv   = 2048,
+   .ui_num = 1,
+   .vi_num = 1,
+};
+
+static const struct sun8i_mixer_cfg sun20i_d1_mixer1_cfg = {
+   .ccsc   = CCSC_MIXER1_LAYOUT,
+   .mod_rate   = 29700,
+   .scaler_mask= 0x1,
+   .scanline_yuv   = 1024,
+   .ui_num = 0,
+   .vi_num = 1,
+};
+
 static const struct sun8i_mixer_cfg sun50i_a64_mixer0_cfg = {
.ccsc   = CCSC_MIXER0_LAYOUT,
.mod_rate   = 29700,
@@ -668,6 +686,14 @@ static const struct of_device_id sun8i_mixer_of_table[] = {
.compatible = "allwinner,sun8i-v3s-de2-mixer",
.data = _v3s_mixer_cfg,
},
+   {
+   .compatible = "allwinner,sun20i-d1-de2-mixer-0",
+   .data = _d1_mixer0_cfg,
+   },
+   {
+   .compatible = "allwinner,sun20i-d1-de2-mixer-1",
+   .data = _d1_mixer1_cfg,
+   },
{
.compatible = "allwinner,sun50i-a64-de2-mixer-0",
.data = _a64_mixer0_cfg,
-- 
2.35.1



[PATCH v2 10/14] drm/sun4i: csc: Add support for the new MMIO layout

2022-04-11 Thread Samuel Holland
D1 changes the MMIO offsets for the CSC blocks in the first mixer. The
mixers' ccsc property is used as an index into the ccsc_base array. Use
an enumeration to describe this index, and add the new set of offsets.

Signed-off-by: Samuel Holland 
---

Changes in v2:
 - Use an enumeration for the ccsc value.

 drivers/gpu/drm/sun4i/sun8i_csc.c   |  7 ---
 drivers/gpu/drm/sun4i/sun8i_csc.h   |  1 +
 drivers/gpu/drm/sun4i/sun8i_mixer.c | 18 +-
 drivers/gpu/drm/sun4i/sun8i_mixer.h | 14 ++
 4 files changed, 24 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/sun4i/sun8i_csc.c 
b/drivers/gpu/drm/sun4i/sun8i_csc.c
index 9bd62de0c288..58480d8e4f70 100644
--- a/drivers/gpu/drm/sun4i/sun8i_csc.c
+++ b/drivers/gpu/drm/sun4i/sun8i_csc.c
@@ -8,9 +8,10 @@
 #include "sun8i_csc.h"
 #include "sun8i_mixer.h"
 
-static const u32 ccsc_base[2][2] = {
-   {CCSC00_OFFSET, CCSC01_OFFSET},
-   {CCSC10_OFFSET, CCSC11_OFFSET},
+static const u32 ccsc_base[][2] = {
+   [CCSC_MIXER0_LAYOUT]= {CCSC00_OFFSET, CCSC01_OFFSET},
+   [CCSC_MIXER1_LAYOUT]= {CCSC10_OFFSET, CCSC11_OFFSET},
+   [CCSC_D1_MIXER0_LAYOUT] = {CCSC00_OFFSET, CCSC01_D1_OFFSET},
 };
 
 /*
diff --git a/drivers/gpu/drm/sun4i/sun8i_csc.h 
b/drivers/gpu/drm/sun4i/sun8i_csc.h
index 022cafa6c06c..828b86fd0cab 100644
--- a/drivers/gpu/drm/sun4i/sun8i_csc.h
+++ b/drivers/gpu/drm/sun4i/sun8i_csc.h
@@ -13,6 +13,7 @@ struct sun8i_mixer;
 /* VI channel CSC units offsets */
 #define CCSC00_OFFSET 0xAA050
 #define CCSC01_OFFSET 0xFA050
+#define CCSC01_D1_OFFSET 0xFA000
 #define CCSC10_OFFSET 0xA
 #define CCSC11_OFFSET 0xF
 
diff --git a/drivers/gpu/drm/sun4i/sun8i_mixer.c 
b/drivers/gpu/drm/sun4i/sun8i_mixer.c
index 6b1711a9a71f..4ce593c99807 100644
--- a/drivers/gpu/drm/sun4i/sun8i_mixer.c
+++ b/drivers/gpu/drm/sun4i/sun8i_mixer.c
@@ -564,7 +564,7 @@ static int sun8i_mixer_remove(struct platform_device *pdev)
 }
 
 static const struct sun8i_mixer_cfg sun8i_a83t_mixer0_cfg = {
-   .ccsc   = 0,
+   .ccsc   = CCSC_MIXER0_LAYOUT,
.scaler_mask= 0xf,
.scanline_yuv   = 2048,
.ui_num = 3,
@@ -572,7 +572,7 @@ static const struct sun8i_mixer_cfg sun8i_a83t_mixer0_cfg = 
{
 };
 
 static const struct sun8i_mixer_cfg sun8i_a83t_mixer1_cfg = {
-   .ccsc   = 1,
+   .ccsc   = CCSC_MIXER1_LAYOUT,
.scaler_mask= 0x3,
.scanline_yuv   = 2048,
.ui_num = 1,
@@ -580,7 +580,7 @@ static const struct sun8i_mixer_cfg sun8i_a83t_mixer1_cfg = 
{
 };
 
 static const struct sun8i_mixer_cfg sun8i_h3_mixer0_cfg = {
-   .ccsc   = 0,
+   .ccsc   = CCSC_MIXER0_LAYOUT,
.mod_rate   = 43200,
.scaler_mask= 0xf,
.scanline_yuv   = 2048,
@@ -589,7 +589,7 @@ static const struct sun8i_mixer_cfg sun8i_h3_mixer0_cfg = {
 };
 
 static const struct sun8i_mixer_cfg sun8i_r40_mixer0_cfg = {
-   .ccsc   = 0,
+   .ccsc   = CCSC_MIXER0_LAYOUT,
.mod_rate   = 29700,
.scaler_mask= 0xf,
.scanline_yuv   = 2048,
@@ -598,7 +598,7 @@ static const struct sun8i_mixer_cfg sun8i_r40_mixer0_cfg = {
 };
 
 static const struct sun8i_mixer_cfg sun8i_r40_mixer1_cfg = {
-   .ccsc   = 1,
+   .ccsc   = CCSC_MIXER1_LAYOUT,
.mod_rate   = 29700,
.scaler_mask= 0x3,
.scanline_yuv   = 2048,
@@ -611,12 +611,12 @@ static const struct sun8i_mixer_cfg sun8i_v3s_mixer_cfg = 
{
.ui_num = 1,
.scaler_mask = 0x3,
.scanline_yuv = 2048,
-   .ccsc = 0,
+   .ccsc = CCSC_MIXER0_LAYOUT,
.mod_rate = 15000,
 };
 
 static const struct sun8i_mixer_cfg sun50i_a64_mixer0_cfg = {
-   .ccsc   = 0,
+   .ccsc   = CCSC_MIXER0_LAYOUT,
.mod_rate   = 29700,
.scaler_mask= 0xf,
.scanline_yuv   = 4096,
@@ -625,7 +625,7 @@ static const struct sun8i_mixer_cfg sun50i_a64_mixer0_cfg = 
{
 };
 
 static const struct sun8i_mixer_cfg sun50i_a64_mixer1_cfg = {
-   .ccsc   = 1,
+   .ccsc   = CCSC_MIXER1_LAYOUT,
.mod_rate   = 29700,
.scaler_mask= 0x3,
.scanline_yuv   = 2048,
@@ -634,7 +634,7 @@ static const struct sun8i_mixer_cfg sun50i_a64_mixer1_cfg = 
{
 };
 
 static const struct sun8i_mixer_cfg sun50i_h6_mixer0_cfg = {
-   .ccsc   = 0,
+   .ccsc   = CCSC_MIXER0_LAYOUT,
.is_de3 = true,
.mod_rate   = 6,
.scaler_mask= 0xf,
diff --git a/drivers/gpu/drm/sun4i/sun8i_mixer.h 
b/drivers/gpu/drm/sun4i/sun8i_mixer.h
index 5b3fbee18671..85c94884fb9a 100644
--- a/drivers/gpu/drm/sun4i/sun8i_mixer.h
+++ b/drivers/gpu/drm/sun4i/sun8i_mixer.h
@@ -141,6 +141,15 @@
 #define SUN50I_MIXER_CDC0_EN   0xd
 #define SUN50I_MIXER_CDC1_EN   0xd8000
 
+enum {
+   /* First mixer or 

[PATCH v2 09/14] drm/sun4i: Allow VI layers to be primary planes

2022-04-11 Thread Samuel Holland
D1's mixer 1 has no UI layers, only a single VI layer. That means the
mixer can only be used if the primary plane comes from this VI layer.
Add the code to handle this case.

Signed-off-by: Samuel Holland 
---

Changes in v2:
 - Use Jernej's patches for mixer mode setting.

 drivers/gpu/drm/sun4i/sun8i_vi_layer.c | 6 +-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/sun4i/sun8i_vi_layer.c 
b/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
index bb7c43036dfa..f7d0b082d634 100644
--- a/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
+++ b/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
@@ -542,6 +542,7 @@ struct sun8i_vi_layer *sun8i_vi_layer_init_one(struct 
drm_device *drm,
   struct sun8i_mixer *mixer,
   int index)
 {
+   enum drm_plane_type type = DRM_PLANE_TYPE_OVERLAY;
u32 supported_encodings, supported_ranges;
unsigned int plane_cnt, format_count;
struct sun8i_vi_layer *layer;
@@ -560,12 +561,15 @@ struct sun8i_vi_layer *sun8i_vi_layer_init_one(struct 
drm_device *drm,
format_count = ARRAY_SIZE(sun8i_vi_layer_formats);
}
 
+   if (!mixer->cfg->ui_num && index == 0)
+   type = DRM_PLANE_TYPE_PRIMARY;
+
/* possible crtcs are set later */
ret = drm_universal_plane_init(drm, >plane, 0,
   _vi_layer_funcs,
   formats, format_count,
   sun8i_layer_modifiers,
-  DRM_PLANE_TYPE_OVERLAY, NULL);
+  type, NULL);
if (ret) {
dev_err(drm->dev, "Couldn't initialize layer\n");
return ERR_PTR(ret);
-- 
2.35.1



[PATCH v2 08/14] sun4i/drm: sun8i: use mode_set engine callback

2022-04-11 Thread Samuel Holland
From: Jernej Skrabec 

Newly introduced mode_set callback in engine structure is a much better
place for setting mixer output size and interlace mode for the following
reasons:
1. Aforementioned properties change only when mode changes, so it's
   enough to be set only once per mode set. Currently it's done whenever
   properties of primary plane are changed.
2. It's assumed that primary plane will always cover whole screen. While
   this is true most of the time, it's not always. DE2/3 planes are
   universal and mostly equal in functionality. There is no reason to
   add artificial limitation to primary planes.
3. The current code only works for UI layers, but some mixers do not
   have any UI layers.

Signed-off-by: Jernej Skrabec 
[Samuel: update commit message]
Signed-off-by: Samuel Holland 
---

Changes in v2:
 - Use Jernej's patches for mixer mode setting.

 drivers/gpu/drm/sun4i/sun8i_mixer.c| 30 ++
 drivers/gpu/drm/sun4i/sun8i_ui_layer.c | 30 --
 2 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/drivers/gpu/drm/sun4i/sun8i_mixer.c 
b/drivers/gpu/drm/sun4i/sun8i_mixer.c
index f5e8aeaa3cdf..6b1711a9a71f 100644
--- a/drivers/gpu/drm/sun4i/sun8i_mixer.c
+++ b/drivers/gpu/drm/sun4i/sun8i_mixer.c
@@ -298,9 +298,39 @@ static struct drm_plane **sun8i_layers_init(struct 
drm_device *drm,
return planes;
 }
 
+static void sun8i_mixer_mode_set(struct sunxi_engine *engine,
+const struct drm_display_mode *mode)
+{
+   struct sun8i_mixer *mixer = engine_to_sun8i_mixer(engine);
+   u32 bld_base, size, val;
+   bool interlaced;
+
+   bld_base = sun8i_blender_base(mixer);
+   interlaced = !!(mode->flags & DRM_MODE_FLAG_INTERLACE);
+   size = SUN8I_MIXER_SIZE(mode->hdisplay, mode->vdisplay);
+
+   DRM_DEBUG_DRIVER("Updating global size W: %u H: %u\n",
+mode->hdisplay, mode->vdisplay);
+
+   regmap_write(engine->regs, SUN8I_MIXER_GLOBAL_SIZE, size);
+   regmap_write(engine->regs, SUN8I_MIXER_BLEND_OUTSIZE(bld_base), size);
+
+   if (interlaced)
+   val = SUN8I_MIXER_BLEND_OUTCTL_INTERLACED;
+   else
+   val = 0;
+
+   regmap_update_bits(engine->regs, SUN8I_MIXER_BLEND_OUTCTL(bld_base),
+  SUN8I_MIXER_BLEND_OUTCTL_INTERLACED, val);
+
+   DRM_DEBUG_DRIVER("Switching display mixer interlaced mode %s\n",
+interlaced ? "on" : "off");
+}
+
 static const struct sunxi_engine_ops sun8i_engine_ops = {
.commit = sun8i_mixer_commit,
.layers_init= sun8i_layers_init,
+   .mode_set   = sun8i_mixer_mode_set,
 };
 
 static const struct regmap_config sun8i_mixer_regmap_config = {
diff --git a/drivers/gpu/drm/sun4i/sun8i_ui_layer.c 
b/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
index 7845c2a53a7f..4632dea2dc1e 100644
--- a/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
+++ b/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
@@ -120,36 +120,6 @@ static int sun8i_ui_layer_update_coord(struct sun8i_mixer 
*mixer, int channel,
insize = SUN8I_MIXER_SIZE(src_w, src_h);
outsize = SUN8I_MIXER_SIZE(dst_w, dst_h);
 
-   if (plane->type == DRM_PLANE_TYPE_PRIMARY) {
-   bool interlaced = false;
-   u32 val;
-
-   DRM_DEBUG_DRIVER("Primary layer, updating global size W: %u H: 
%u\n",
-dst_w, dst_h);
-   regmap_write(mixer->engine.regs,
-SUN8I_MIXER_GLOBAL_SIZE,
-outsize);
-   regmap_write(mixer->engine.regs,
-SUN8I_MIXER_BLEND_OUTSIZE(bld_base), outsize);
-
-   if (state->crtc)
-   interlaced = state->crtc->state->adjusted_mode.flags
-   & DRM_MODE_FLAG_INTERLACE;
-
-   if (interlaced)
-   val = SUN8I_MIXER_BLEND_OUTCTL_INTERLACED;
-   else
-   val = 0;
-
-   regmap_update_bits(mixer->engine.regs,
-  SUN8I_MIXER_BLEND_OUTCTL(bld_base),
-  SUN8I_MIXER_BLEND_OUTCTL_INTERLACED,
-  val);
-
-   DRM_DEBUG_DRIVER("Switching display mixer interlaced mode %s\n",
-interlaced ? "on" : "off");
-   }
-
/* Set height and width */
DRM_DEBUG_DRIVER("Layer source offset X: %d Y: %d\n",
 state->src.x1 >> 16, state->src.y1 >> 16);
-- 
2.35.1



[PATCH v2 07/14] sun4i/drm: backend: use mode_set engine callback

2022-04-11 Thread Samuel Holland
From: Jernej Skrabec 

Newly introduced mode_set callback in engine structure is a much better
place for setting backend output size and interlace mode for following
reasons:
1. Aforementioned properties change only when mode changes, so it's
   enough to be set only once per mode set. Currently it's done whenever
   properties of primary plane are changed.
2. It's assumed that primary plane will always cover whole screen. While
   this is true most of the time, it's not always. Planes are universal.
   There is no reason to add artificial limitation to primary plane.

Signed-off-by: Jernej Skrabec 
[Samuel: drop unused 'interlaced' variable]
Signed-off-by: Samuel Holland 
---

Changes in v2:
 - Use Jernej's patches for mixer mode setting.

 drivers/gpu/drm/sun4i/sun4i_backend.c | 40 +--
 1 file changed, 20 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/sun4i/sun4i_backend.c 
b/drivers/gpu/drm/sun4i/sun4i_backend.c
index f52ff4e6c662..decd95ad519d 100644
--- a/drivers/gpu/drm/sun4i/sun4i_backend.c
+++ b/drivers/gpu/drm/sun4i/sun4i_backend.c
@@ -172,14 +172,6 @@ int sun4i_backend_update_layer_coord(struct sun4i_backend 
*backend,
 
DRM_DEBUG_DRIVER("Updating layer %d\n", layer);
 
-   if (plane->type == DRM_PLANE_TYPE_PRIMARY) {
-   DRM_DEBUG_DRIVER("Primary layer, updating global size W: %u H: 
%u\n",
-state->crtc_w, state->crtc_h);
-   regmap_write(backend->engine.regs, SUN4I_BACKEND_DISSIZE_REG,
-SUN4I_BACKEND_DISSIZE(state->crtc_w,
-  state->crtc_h));
-   }
-
/* Set height and width */
DRM_DEBUG_DRIVER("Layer size W: %u H: %u\n",
 state->crtc_w, state->crtc_h);
@@ -259,7 +251,6 @@ int sun4i_backend_update_layer_formats(struct sun4i_backend 
*backend,
 {
struct drm_plane_state *state = plane->state;
struct drm_framebuffer *fb = state->fb;
-   bool interlaced = false;
u32 val;
int ret;
 
@@ -267,17 +258,6 @@ int sun4i_backend_update_layer_formats(struct 
sun4i_backend *backend,
regmap_update_bits(backend->engine.regs, 
SUN4I_BACKEND_ATTCTL_REG0(layer),
   SUN4I_BACKEND_ATTCTL_REG0_LAY_YUVEN, 0);
 
-   if (plane->state->crtc)
-   interlaced = plane->state->crtc->state->adjusted_mode.flags
-   & DRM_MODE_FLAG_INTERLACE;
-
-   regmap_update_bits(backend->engine.regs, SUN4I_BACKEND_MODCTL_REG,
-  SUN4I_BACKEND_MODCTL_ITLMOD_EN,
-  interlaced ? SUN4I_BACKEND_MODCTL_ITLMOD_EN : 0);
-
-   DRM_DEBUG_DRIVER("Switching display backend interlaced mode %s\n",
-interlaced ? "on" : "off");
-
val = SUN4I_BACKEND_ATTCTL_REG0_LAY_GLBALPHA(state->alpha >> 8);
if (state->alpha != DRM_BLEND_ALPHA_OPAQUE)
val |= SUN4I_BACKEND_ATTCTL_REG0_LAY_GLBALPHA_EN;
@@ -654,6 +634,25 @@ static void sun4i_backend_vblank_quirk(struct sunxi_engine 
*engine)
spin_unlock(>frontend_lock);
 };
 
+static void sun4i_backend_mode_set(struct sunxi_engine *engine,
+  const struct drm_display_mode *mode)
+{
+   bool interlaced = !!(mode->flags & DRM_MODE_FLAG_INTERLACE);
+
+   DRM_DEBUG_DRIVER("Updating global size W: %u H: %u\n",
+mode->hdisplay, mode->vdisplay);
+
+   regmap_write(engine->regs, SUN4I_BACKEND_DISSIZE_REG,
+SUN4I_BACKEND_DISSIZE(mode->hdisplay, mode->vdisplay));
+
+   regmap_update_bits(engine->regs, SUN4I_BACKEND_MODCTL_REG,
+  SUN4I_BACKEND_MODCTL_ITLMOD_EN,
+  interlaced ? SUN4I_BACKEND_MODCTL_ITLMOD_EN : 0);
+
+   DRM_DEBUG_DRIVER("Switching display backend interlaced mode %s\n",
+interlaced ? "on" : "off");
+}
+
 static int sun4i_backend_init_sat(struct device *dev) {
struct sun4i_backend *backend = dev_get_drvdata(dev);
int ret;
@@ -765,6 +764,7 @@ static const struct sunxi_engine_ops 
sun4i_backend_engine_ops = {
.apply_color_correction = sun4i_backend_apply_color_correction,
.disable_color_correction   = 
sun4i_backend_disable_color_correction,
.vblank_quirk   = sun4i_backend_vblank_quirk,
+   .mode_set   = sun4i_backend_mode_set,
 };
 
 static const struct regmap_config sun4i_backend_regmap_config = {
-- 
2.35.1



[PATCH v2 06/14] sun4i/drm: engine: Add mode_set callback

2022-04-11 Thread Samuel Holland
From: Jernej Skrabec 

This optional callback is useful for setting properties which depends
only on current mode. Such properties are width, height and interlaced
output.

These properties are currently set in update layer callback for primary
plane which is less than ideal. More about that in follow up patches,
which will migrate that code to this newly defined callback.

Signed-off-by: Jernej Skrabec 
Signed-off-by: Samuel Holland 
---

Changes in v2:
 - Use Jernej's patches for mixer mode setting.

 drivers/gpu/drm/sun4i/sun4i_crtc.c   |  1 +
 drivers/gpu/drm/sun4i/sunxi_engine.h | 27 +++
 2 files changed, 28 insertions(+)

diff --git a/drivers/gpu/drm/sun4i/sun4i_crtc.c 
b/drivers/gpu/drm/sun4i/sun4i_crtc.c
index 45d9eb552d86..c06d7cd45388 100644
--- a/drivers/gpu/drm/sun4i/sun4i_crtc.c
+++ b/drivers/gpu/drm/sun4i/sun4i_crtc.c
@@ -146,6 +146,7 @@ static void sun4i_crtc_mode_set_nofb(struct drm_crtc *crtc)
struct sun4i_crtc *scrtc = drm_crtc_to_sun4i_crtc(crtc);
 
sun4i_tcon_mode_set(scrtc->tcon, encoder, mode);
+   sunxi_engine_mode_set(scrtc->engine, mode);
 }
 
 static const struct drm_crtc_helper_funcs sun4i_crtc_helper_funcs = {
diff --git a/drivers/gpu/drm/sun4i/sunxi_engine.h 
b/drivers/gpu/drm/sun4i/sunxi_engine.h
index 548710a936d5..ec8cf9b2bda4 100644
--- a/drivers/gpu/drm/sun4i/sunxi_engine.h
+++ b/drivers/gpu/drm/sun4i/sunxi_engine.h
@@ -9,6 +9,7 @@
 struct drm_plane;
 struct drm_device;
 struct drm_crtc_state;
+struct drm_display_mode;
 
 struct sunxi_engine;
 
@@ -108,6 +109,17 @@ struct sunxi_engine_ops {
 * This function is optional.
 */
void (*vblank_quirk)(struct sunxi_engine *engine);
+
+   /**
+* @mode_set
+*
+* This callback is used to set mode related parameters
+* like interlacing, screen size, etc. once per mode set.
+*
+* This function is optional.
+*/
+   void (*mode_set)(struct sunxi_engine *engine,
+const struct drm_display_mode *mode);
 };
 
 /**
@@ -181,4 +193,19 @@ sunxi_engine_disable_color_correction(struct sunxi_engine 
*engine)
if (engine->ops && engine->ops->disable_color_correction)
engine->ops->disable_color_correction(engine);
 }
+
+/**
+ * sunxi_engine_mode_set - Inform engine of a new mode
+ * @engine:pointer to the engine
+ * @mode:  new mode
+ *
+ * Engine can use this functionality to set specifics once per mode change.
+ */
+static inline void
+sunxi_engine_mode_set(struct sunxi_engine *engine,
+ const struct drm_display_mode *mode)
+{
+   if (engine->ops && engine->ops->mode_set)
+   engine->ops->mode_set(engine, mode);
+}
 #endif /* _SUNXI_ENGINE_H_ */
-- 
2.35.1



[PATCH v2 04/14] drm/sun4i: hdmi: Use more portable I/O helpers

2022-04-11 Thread Samuel Holland
readsb/writesb are unavailable on some architectures. In preparation for
removing the Kconfig architecture dependency, switch to the equivalent
but more portable ioread/write8_rep helpers.

Reported-by: kernel test robot 
Signed-off-by: Samuel Holland 
---

Changes in v2:
 - New patch: I/O helper portability

 drivers/gpu/drm/sun4i/sun4i_hdmi_i2c.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/sun4i/sun4i_hdmi_i2c.c 
b/drivers/gpu/drm/sun4i/sun4i_hdmi_i2c.c
index b66fa27fe6ea..c7d7e9fff91c 100644
--- a/drivers/gpu/drm/sun4i/sun4i_hdmi_i2c.c
+++ b/drivers/gpu/drm/sun4i/sun4i_hdmi_i2c.c
@@ -56,9 +56,9 @@ static int fifo_transfer(struct sun4i_hdmi *hdmi, u8 *buf, 
int len, bool read)
return -EIO;
 
if (read)
-   readsb(hdmi->base + hdmi->variant->ddc_fifo_reg, buf, len);
+   ioread8_rep(hdmi->base + hdmi->variant->ddc_fifo_reg, buf, len);
else
-   writesb(hdmi->base + hdmi->variant->ddc_fifo_reg, buf, len);
+   iowrite8_rep(hdmi->base + hdmi->variant->ddc_fifo_reg, buf, 
len);
 
/* Clear FIFO request bit by forcing a write to that bit */
regmap_field_force_write(hdmi->field_ddc_int_status,
-- 
2.35.1



[PATCH v2 05/14] drm/sun4i: Allow building the driver on RISC-V

2022-04-11 Thread Samuel Holland
Allwinner D1 is a RISC-V SoC which contains a DE 2.0 engine. Let's
remove the dependency on a specific CPU architecture, so the driver can
be built wherever ARCH_SUNXI is selected.

Acked-by: Jernej Skrabec 
Signed-off-by: Samuel Holland 
---

(no changes since v1)

 drivers/gpu/drm/sun4i/Kconfig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/sun4i/Kconfig b/drivers/gpu/drm/sun4i/Kconfig
index befc5a80222d..3a43c436c74a 100644
--- a/drivers/gpu/drm/sun4i/Kconfig
+++ b/drivers/gpu/drm/sun4i/Kconfig
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 config DRM_SUN4I
tristate "DRM Support for Allwinner A10 Display Engine"
-   depends on DRM && (ARM || ARM64) && COMMON_CLK
+   depends on DRM && COMMON_CLK
depends on ARCH_SUNXI || COMPILE_TEST
select DRM_GEM_CMA_HELPER
select DRM_KMS_HELPER
-- 
2.35.1



[PATCH v2 03/14] drm/sun4i: Remove obsolete references to PHYS_OFFSET

2022-04-11 Thread Samuel Holland
commit b4bdc4fbf8d0 ("soc: sunxi: Deal with the MBUS DMA offsets in a
central place") added a platform device notifier that sets the DMA
offset for all of the display engine frontend and backend devices.

The code applying the offset to DMA buffer physical addresses was then
removed from the backend driver in commit 756668ba682e ("drm/sun4i:
backend: Remove the MBUS quirks"), but the code subtracting PHYS_OFFSET
was left in the frontend driver.

As a result, the offset was applied twice in the frontend driver. This
likely went unnoticed because it only affects specific configurations
(scaling or certain pixel formats) where the frontend is used, on boards
with both one of these older SoCs and more than 1 GB of DRAM.

In addition, the references to PHYS_OFFSET prevent compiling the driver
on architectures where PHYS_OFFSET is not defined.

Fixes: b4bdc4fbf8d0 ("soc: sunxi: Deal with the MBUS DMA offsets in a central 
place")
Reviewed-by: Jernej Skrabec 
Signed-off-by: Samuel Holland 
---

(no changes since v1)

 drivers/gpu/drm/sun4i/sun4i_frontend.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/drivers/gpu/drm/sun4i/sun4i_frontend.c 
b/drivers/gpu/drm/sun4i/sun4i_frontend.c
index 56ae38389db0..462fae73eae9 100644
--- a/drivers/gpu/drm/sun4i/sun4i_frontend.c
+++ b/drivers/gpu/drm/sun4i/sun4i_frontend.c
@@ -222,13 +222,11 @@ void sun4i_frontend_update_buffer(struct sun4i_frontend 
*frontend,
 
/* Set the physical address of the buffer in memory */
paddr = drm_fb_cma_get_gem_addr(fb, state, 0);
-   paddr -= PHYS_OFFSET;
DRM_DEBUG_DRIVER("Setting buffer #0 address to %pad\n", );
regmap_write(frontend->regs, SUN4I_FRONTEND_BUF_ADDR0_REG, paddr);
 
if (fb->format->num_planes > 1) {
paddr = drm_fb_cma_get_gem_addr(fb, state, swap ? 2 : 1);
-   paddr -= PHYS_OFFSET;
DRM_DEBUG_DRIVER("Setting buffer #1 address to %pad\n", );
regmap_write(frontend->regs, SUN4I_FRONTEND_BUF_ADDR1_REG,
 paddr);
@@ -236,7 +234,6 @@ void sun4i_frontend_update_buffer(struct sun4i_frontend 
*frontend,
 
if (fb->format->num_planes > 2) {
paddr = drm_fb_cma_get_gem_addr(fb, state, swap ? 1 : 2);
-   paddr -= PHYS_OFFSET;
DRM_DEBUG_DRIVER("Setting buffer #2 address to %pad\n", );
regmap_write(frontend->regs, SUN4I_FRONTEND_BUF_ADDR2_REG,
 paddr);
-- 
2.35.1



[PATCH v2 02/14] dt-bindings: display: Add D1 display engine compatibles

2022-04-11 Thread Samuel Holland
Allwinner D1 contains a display engine 2.0. It features two mixers, a
TCON TOP (with DSI and HDMI), one TCON LCD, and one TCON TV.

Reviewed-by: Krzysztof Kozlowski 
Signed-off-by: Samuel Holland 
---

(no changes since v1)

 .../allwinner,sun4i-a10-display-engine.yaml   |  1 +
 .../display/allwinner,sun4i-a10-tcon.yaml |  2 ++
 .../allwinner,sun8i-a83t-de2-mixer.yaml   |  2 ++
 .../display/allwinner,sun8i-r40-tcon-top.yaml | 34 +++
 4 files changed, 39 insertions(+)

diff --git 
a/Documentation/devicetree/bindings/display/allwinner,sun4i-a10-display-engine.yaml
 
b/Documentation/devicetree/bindings/display/allwinner,sun4i-a10-display-engine.yaml
index d4412aea7b73..c388ae5da1e4 100644
--- 
a/Documentation/devicetree/bindings/display/allwinner,sun4i-a10-display-engine.yaml
+++ 
b/Documentation/devicetree/bindings/display/allwinner,sun4i-a10-display-engine.yaml
@@ -62,6 +62,7 @@ properties:
   - allwinner,sun8i-r40-display-engine
   - allwinner,sun8i-v3s-display-engine
   - allwinner,sun9i-a80-display-engine
+  - allwinner,sun20i-d1-display-engine
   - allwinner,sun50i-a64-display-engine
   - allwinner,sun50i-h6-display-engine
 
diff --git 
a/Documentation/devicetree/bindings/display/allwinner,sun4i-a10-tcon.yaml 
b/Documentation/devicetree/bindings/display/allwinner,sun4i-a10-tcon.yaml
index 3a7d5d731712..4a92a4c7dcd7 100644
--- a/Documentation/devicetree/bindings/display/allwinner,sun4i-a10-tcon.yaml
+++ b/Documentation/devicetree/bindings/display/allwinner,sun4i-a10-tcon.yaml
@@ -33,6 +33,8 @@ properties:
   - const: allwinner,sun8i-v3s-tcon
   - const: allwinner,sun9i-a80-tcon-lcd
   - const: allwinner,sun9i-a80-tcon-tv
+  - const: allwinner,sun20i-d1-tcon-lcd
+  - const: allwinner,sun20i-d1-tcon-tv
 
   - items:
   - enum:
diff --git 
a/Documentation/devicetree/bindings/display/allwinner,sun8i-a83t-de2-mixer.yaml 
b/Documentation/devicetree/bindings/display/allwinner,sun8i-a83t-de2-mixer.yaml
index 4f91eec26de9..cb243bc58ef7 100644
--- 
a/Documentation/devicetree/bindings/display/allwinner,sun8i-a83t-de2-mixer.yaml
+++ 
b/Documentation/devicetree/bindings/display/allwinner,sun8i-a83t-de2-mixer.yaml
@@ -19,6 +19,8 @@ properties:
   - allwinner,sun8i-r40-de2-mixer-0
   - allwinner,sun8i-r40-de2-mixer-1
   - allwinner,sun8i-v3s-de2-mixer
+  - allwinner,sun20i-d1-de2-mixer-0
+  - allwinner,sun20i-d1-de2-mixer-1
   - allwinner,sun50i-a64-de2-mixer-0
   - allwinner,sun50i-a64-de2-mixer-1
   - allwinner,sun50i-h6-de3-mixer-0
diff --git 
a/Documentation/devicetree/bindings/display/allwinner,sun8i-r40-tcon-top.yaml 
b/Documentation/devicetree/bindings/display/allwinner,sun8i-r40-tcon-top.yaml
index 784b267635fb..cc32e2faed91 100644
--- 
a/Documentation/devicetree/bindings/display/allwinner,sun8i-r40-tcon-top.yaml
+++ 
b/Documentation/devicetree/bindings/display/allwinner,sun8i-r40-tcon-top.yaml
@@ -41,6 +41,7 @@ properties:
   compatible:
 enum:
   - allwinner,sun8i-r40-tcon-top
+  - allwinner,sun20i-d1-tcon-top
   - allwinner,sun50i-h6-tcon-top
 
   reg:
@@ -154,6 +155,39 @@ allOf:
 - port@2
 - port@3
 
+  - if:
+  properties:
+compatible:
+  contains:
+const: allwinner,sun20i-d1-tcon-top
+
+then:
+  properties:
+clocks:
+  minItems: 4
+  maxItems: 4
+  items:
+- description: The TCON TOP interface clock
+- description: The TCON TOP TV0 clock
+- description: The TCON TOP TVE0 clock
+- description: The TCON TOP MIPI DSI clock
+
+clock-names:
+  minItems: 4
+  maxItems: 4
+  items:
+- const: bus
+- const: tcon-tv0
+- const: tve0
+- const: dsi
+
+clock-output-names:
+  minItems: 2
+  maxItems: 2
+  items:
+- description: TCON TV0 output clock name
+- description: DSI output clock name
+
   - if:
   properties:
 compatible:
-- 
2.35.1



[PATCH v2 01/14] dt-bindings: display: Separate clock item lists by compatible

2022-04-11 Thread Samuel Holland
So far, the binding and driver have relied on the fact that the H6
clocks are both a prefix and a subset of the R40 clocks. This allows
them to share the clocks/clock-names items and the clock-output-names
order between the hardware variants.

However, the D1 hardware has TCON TV0 and DSI, but no TCON TV1. This
cannot be supported by the existing scheme because it puts a gap in the
middle of the item lists. To prepare for adding D1 support, use separate
lists for variants with different combinations of clocks.

Reviewed-by: Krzysztof Kozlowski 
Signed-off-by: Samuel Holland 
---

(no changes since v1)

 .../display/allwinner,sun8i-r40-tcon-top.yaml | 111 +++---
 1 file changed, 67 insertions(+), 44 deletions(-)

diff --git 
a/Documentation/devicetree/bindings/display/allwinner,sun8i-r40-tcon-top.yaml 
b/Documentation/devicetree/bindings/display/allwinner,sun8i-r40-tcon-top.yaml
index 61ef7b337218..784b267635fb 100644
--- 
a/Documentation/devicetree/bindings/display/allwinner,sun8i-r40-tcon-top.yaml
+++ 
b/Documentation/devicetree/bindings/display/allwinner,sun8i-r40-tcon-top.yaml
@@ -48,31 +48,15 @@ properties:
 
   clocks:
 minItems: 2
-items:
-  - description: The TCON TOP interface clock
-  - description: The TCON TOP TV0 clock
-  - description: The TCON TOP TVE0 clock
-  - description: The TCON TOP TV1 clock
-  - description: The TCON TOP TVE1 clock
-  - description: The TCON TOP MIPI DSI clock
+maxItems: 6
 
   clock-names:
 minItems: 2
-items:
-  - const: bus
-  - const: tcon-tv0
-  - const: tve0
-  - const: tcon-tv1
-  - const: tve1
-  - const: dsi
+maxItems: 6
 
   clock-output-names:
 minItems: 1
 maxItems: 3
-description: >
-  The first item is the name of the clock created for the TV0
-  channel, the second item is the name of the TCON TV1 channel
-  clock and the third one is the name of the DSI channel clock.
 
   resets:
 maxItems: 1
@@ -129,32 +113,71 @@ required:
 
 additionalProperties: false
 
-if:
-  properties:
-compatible:
-  contains:
-const: allwinner,sun50i-h6-tcon-top
-
-then:
-  properties:
-clocks:
-  maxItems: 2
-
-clock-output-names:
-  maxItems: 1
-
-else:
-  properties:
-clocks:
-  minItems: 6
-
-clock-output-names:
-  minItems: 3
-
-ports:
-  required:
-- port@2
-- port@3
+allOf:
+  - if:
+  properties:
+compatible:
+  contains:
+const: allwinner,sun8i-r40-tcon-top
+
+then:
+  properties:
+clocks:
+  minItems: 6
+  items:
+- description: The TCON TOP interface clock
+- description: The TCON TOP TV0 clock
+- description: The TCON TOP TVE0 clock
+- description: The TCON TOP TV1 clock
+- description: The TCON TOP TVE1 clock
+- description: The TCON TOP MIPI DSI clock
+
+clock-names:
+  minItems: 6
+  items:
+- const: bus
+- const: tcon-tv0
+- const: tve0
+- const: tcon-tv1
+- const: tve1
+- const: dsi
+
+clock-output-names:
+  minItems: 3
+  items:
+- description: TCON TV0 output clock name
+- description: TCON TV1 output clock name
+- description: DSI output clock name
+
+ports:
+  required:
+- port@2
+- port@3
+
+  - if:
+  properties:
+compatible:
+  contains:
+const: allwinner,sun50i-h6-tcon-top
+
+then:
+  properties:
+clocks:
+  maxItems: 2
+  items:
+- description: The TCON TOP interface clock
+- description: The TCON TOP TV0 clock
+
+clock-names:
+  maxItems: 2
+  items:
+- const: bus
+- const: tcon-tv0
+
+clock-output-names:
+  maxItems: 1
+  items:
+- description: TCON TV0 output clock name
 
 examples:
   - |
-- 
2.35.1



[PATCH v2 00/14] drm/sun4i: Allwinner D1 Display Engine 2.0 Support

2022-04-11 Thread Samuel Holland
This series adds binding and driver support for Display Engine 2.0
variant found in the Allwinner D1.

So far it has only been tested with HDMI. I will be sending the HDMI
support series separately, because the hardware comes with a brand new
custom HDMI PHY, which requires some refactoring to support cleanly.

This series was tested on A33, D1 and H3.

Changes in v2:
 - New patch: I/O helper portability
 - Use Jernej's patches for mixer mode setting.
 - Use an enumeration for the ccsc value.

Jernej Skrabec (3):
  sun4i/drm: engine: Add mode_set callback
  sun4i/drm: backend: use mode_set engine callback
  sun4i/drm: sun8i: use mode_set engine callback

Samuel Holland (11):
  dt-bindings: display: Separate clock item lists by compatible
  dt-bindings: display: Add D1 display engine compatibles
  drm/sun4i: Remove obsolete references to PHYS_OFFSET
  drm/sun4i: hdmi: Use more portable I/O helpers
  drm/sun4i: Allow building the driver on RISC-V
  drm/sun4i: Allow VI layers to be primary planes
  drm/sun4i: csc: Add support for the new MMIO layout
  drm/sun4i: Add support for D1 mixers
  drm/sun4i: Add support for D1 TCON TOP
  drm/sun4i: Add support for D1 TCONs
  drm/sun4i: Add compatible for D1 display engine

 .../allwinner,sun4i-a10-display-engine.yaml   |   1 +
 .../display/allwinner,sun4i-a10-tcon.yaml |   2 +
 .../allwinner,sun8i-a83t-de2-mixer.yaml   |   2 +
 .../display/allwinner,sun8i-r40-tcon-top.yaml | 145 --
 drivers/gpu/drm/sun4i/Kconfig |   2 +-
 drivers/gpu/drm/sun4i/sun4i_backend.c |  40 ++---
 drivers/gpu/drm/sun4i/sun4i_crtc.c|   1 +
 drivers/gpu/drm/sun4i/sun4i_drv.c |   1 +
 drivers/gpu/drm/sun4i/sun4i_frontend.c|   3 -
 drivers/gpu/drm/sun4i/sun4i_hdmi_i2c.c|   4 +-
 drivers/gpu/drm/sun4i/sun4i_tcon.c|   8 +
 drivers/gpu/drm/sun4i/sun8i_csc.c |   7 +-
 drivers/gpu/drm/sun4i/sun8i_csc.h |   1 +
 drivers/gpu/drm/sun4i/sun8i_mixer.c   |  74 +++--
 drivers/gpu/drm/sun4i/sun8i_mixer.h   |  14 +-
 drivers/gpu/drm/sun4i/sun8i_tcon_top.c|  15 +-
 drivers/gpu/drm/sun4i/sun8i_ui_layer.c|  30 
 drivers/gpu/drm/sun4i/sun8i_vi_layer.c|   6 +-
 drivers/gpu/drm/sun4i/sunxi_engine.h  |  27 
 19 files changed, 263 insertions(+), 120 deletions(-)

-- 
2.35.1



Re: [PATCH v2] drm/msm/dp: add fail safe mode outside of event_mutex context

2022-04-11 Thread Stephen Boyd
Quoting Kuogee Hsieh (2022-04-08 14:04:54)
> There is possible circular locking dependency detected on event_mutex
> (see below logs). This is due to set fail safe mode is done at
> dp_panel_read_sink_caps() within event_mutex scope. To break this
> possible circular locking, this patch move setting fail safe mode
> out of event_mutex scope.
>

Reviewed-by: Stephen Boyd 


Re: [PATCH] drm/msm/dp: stop event kernel thread when DP unbind

2022-04-11 Thread Stephen Boyd
Quoting Abhinav Kumar (2022-04-11 17:29:17)
>
>
> On 4/11/2022 5:22 PM, Dmitry Baryshkov wrote:
> > On 12/04/2022 03:21, Stephen Boyd wrote:
> >> Quoting Kuogee Hsieh (2022-04-11 17:08:49)
> >>> -   kthread_run(hpd_event_thread, dp_priv, "dp_hpd_handler");
> >>> +   dp_priv->ev_tsk = kthread_run(hpd_event_thread, dp_priv,
> >>> "dp_hpd_handler");
> >>> +
> >>> +   if (IS_ERR(dp_priv->ev_tsk))
> >>> +   DRM_ERROR("failed to create DP event thread\n");
> >>
> >> Why can't we error out? Why can't this kthread be started in probe?
> >
> > Just my 2c. I don't think starting it in probe is a good idea. The
> > driver uses components, so, in my opinion, the thread should be started
> > from bind and stopped in unbind.
>
> Yes, I also agree it should be started in bind and stopped in unbind.
>

Sounds good to me! I forgot that this is a component.


Re: [PATCH] drm/exynos: fix IS_ERR() vs NULL check in probe

2022-04-11 Thread Dan Carpenter
On Tue, Apr 12, 2022 at 10:01:20AM +0900, Inki Dae wrote:
> Hi Dan Carpenter.
> 
> Same patch[1] was posted so I will pick it up. 
> 
> [1] https://www.spinics.net/lists/arm-kernel/msg967488.html 
> 

It's not the same.  That one returns -EINVAL and mine returns
-EPROBE_DEFER.  I obvoiously thought that -EPROBE_DEFER was the correct
return but I wasn't positive.  -EPROBE_DEFER is kind of a special
return so I think it matters to get this correct.

regards,
dan carpenter



Re: [PATCH v3] drm/hyperv: Added error message for fb size greater than allocated

2022-04-11 Thread Saurabh Singh Sengar
On Mon, Apr 11, 2022 at 07:02:19PM +, Dexuan Cui wrote:
> > From: Saurabh Singh Sengar 
> > Sent: Monday, April 11, 2022 12:56 AM
> > > >...
> > > > -   if (fb->pitches[0] * fb->height > hv->fb_size)
> > > > +   if (fb->pitches[0] * fb->height > hv->fb_size) {
> > > > +   drm_err(>dev, "hv->hdev, fb size requested by 
> > > > process %s
> > > > for %d X %d (pitch %d) is greater than allocated size %ld\n",
> > > Should we use drm_err_ratelimited() instead of drm_err()?
> > 
> > The error is not produced in good cases, for every resolution change which 
> > is
> > violating this error should print once.
> 
> Thanks for the clarification! Then drm_err() looks good to me.
> 
> > I suggest having it print every time some application tries to violate the 
> > policy
> > set at boot time.
> > If we use ratelimit many resolutions error change will be suppressed. 
> > Please let
> > me know your thoughts.
>  
> > >
> > > The line exceeds 80 chars.
> > 
> > At first I tried braking the line to respect 80 character boundary, but
> > checkpatch.pl reported it as a problem.
> > And these new lines are suggested by checkpatch.pl itself.
> > Looks the recent rule realted to 80 charachters are changed. Ref :
> > ...
> 
> Good to know! Thanks for sharing the link!
> 
> FYI, the default max_line_length in scripts/checkpatch.pl is 100 now:
>  
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=bdc48fa11e46f
> 
> "80-chars" is still preferred, but isn't a hard limit. I also noticed
> "never break user-visible strings such as printk messages ", so yes you're 
> correct. It's perfectly fine to have a not-too-long string that exceeds 80 
> chars.
> 

Good information ! thank you for digging this.

> > > > +   current->comm, fb->width, fb->height, fb->pitches[0], 
> > > > hv->fb_size);
> > > > return -EINVAL;
> > > > +   }
> > >
> > > Maybe we can use the below:
> > >   drm_err_ratelimited(>dev, "%s: requested %dX%d (pitch %d) "
> > >  "exceeds fb_size %ld\n",
> > >  current->comm, fb->width, fb->height,
> > >  fb->pitches[0], hv->fb_size);
> > >
> > > Note: the first chars of last 3 lines should align with the "&" in the
> > > same column. Please run "scripts/checkpatch.pl" against the patch.
> > 
> > I have tested checkpatch.pl before sending, for the current patch there is 
> > no
> > problem from checkpatch.pl
> 
> The line is 138-char long, which seems a little longer to me :-)
> IMO we can make it shorter, e.g. be removing the part "hv->hdev as the
> "drm_err(>dev," already tells us which device it's.

Ok, will make it shorter.

> 
> BTW, if we run the script with --strict, it reports the below:
> 
> # scripts/checkpatch.pl --strict 
> 0001-drm-hyperv-Added-error-message-for-fb-size-greater-t.patch
> CHECK: Alignment should match open parenthesis
> #28: FILE: drivers/gpu/drm/hyperv/hyperv_drm_modeset.c:127:
> +   drm_err(>dev, "hv->hdev, fb size requested by process %s 
> for %d X %d (pitch %d) is greater than allocated size %ld\n",
> +   current->comm, fb->width, fb->height, fb->pitches[0], 
> hv->fb_size);
Sure, will fix this.


Re: [Intel-gfx] [V2 1/3] drm/debug: Expose connector's max supported bpc via debugfs

2022-04-11 Thread Modem, Bhanuprakash

On Tue-12-04-2022 08:37 am, Murthy, Arun R wrote:

+static int output_bpc_show(struct seq_file *m, void *data) {


Would it be better to have this function name as drm_output_bpc_show()


As we are using DEFINE_SHOW_ATTRIBUTE() to define file_operations, this 
function name must be _show(). Otherwise, either we need 
to define new file_operations to use the suggested name or rename the 
debugfs name to "drm_output_bpc"


Also, to align/maintain uniform with other debugfs, I think it's ok to 
use output_bpc_show().


- Bhanu



Thanks and Regards,
Arun R Murthy





Re: [PATCH v3 11/15] drm/shmem-helper: Add generic memory shrinker

2022-04-11 Thread kernel test robot
Hi Dmitry,

I love your patch! Perhaps something to improve:

[auto build test WARNING on next-20220411]
[cannot apply to drm/drm-next v5.18-rc2 v5.18-rc1 v5.17 v5.18-rc2]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:
https://github.com/intel-lab-lkp/linux/commits/Dmitry-Osipenko/Add-generic-memory-shrinker-to-VirtIO-GPU-and-Panfrost-DRM-drivers/20220412-060325
base:d12d7e1cfe38e0c36d28c7a9fbbc436ad0d17c14
config: arc-buildonly-randconfig-r002-20220411 
(https://download.01.org/0day-ci/archive/20220412/202204121135.zxhzc28u-...@intel.com/config)
compiler: arc-elf-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
~/bin/make.cross
chmod +x ~/bin/make.cross
# 
https://github.com/intel-lab-lkp/linux/commit/683ba8a9d72ba7770a61a9266a2b33949f3874f2
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review 
Dmitry-Osipenko/Add-generic-memory-shrinker-to-VirtIO-GPU-and-Panfrost-DRM-drivers/20220412-060325
git checkout 683ba8a9d72ba7770a61a9266a2b33949f3874f2
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross 
O=build_dir ARCH=arc SHELL=/bin/bash drivers/gpu/drm/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot 

All warnings (new ones prefixed by >>):

   drivers/gpu/drm/drm_gem_shmem_helper.c: In function 
'drm_gem_shmem_shrinker_run_objects_scan':
>> drivers/gpu/drm/drm_gem_shmem_helper.c:1358:56: warning: implicit conversion 
>> from 'enum ' to 'enum dma_resv_usage' [-Wenum-conversion]
1358 | if (!dma_resv_test_signaled(obj->resv, true))
 |^~~~


vim +1358 drivers/gpu/drm/drm_gem_shmem_helper.c

  1299  
  1300  static unsigned long
  1301  drm_gem_shmem_shrinker_run_objects_scan(struct shrinker *shrinker,
  1302  unsigned long nr_to_scan,
  1303  bool *lock_contention,
  1304  bool evict)
  1305  {
  1306  struct drm_gem_shmem_shrinker *gem_shrinker = 
to_drm_shrinker(shrinker);
  1307  struct drm_gem_shmem_object *shmem;
  1308  struct list_head still_in_list;
  1309  struct drm_gem_object *obj;
  1310  unsigned long freed = 0;
  1311  struct list_head *lru;
  1312  size_t page_count;
  1313  
  1314  INIT_LIST_HEAD(_in_list);
  1315  
  1316  mutex_lock(_shrinker->lock);
  1317  
  1318  if (evict)
  1319  lru = _shrinker->lru_evictable;
  1320  else
  1321  lru = _shrinker->lru_purgeable;
  1322  
  1323  while (freed < nr_to_scan) {
  1324  shmem = list_first_entry_or_null(lru, typeof(*shmem), 
madv_list);
  1325  if (!shmem)
  1326  break;
  1327  
  1328  obj = >base;
  1329  page_count = obj->size >> PAGE_SHIFT;
  1330  list_move_tail(>madv_list, _in_list);
  1331  
  1332  if (evict && get_nr_swap_pages() < page_count)
  1333  continue;
  1334  
  1335  /*
  1336   * If it's in the process of being freed, 
gem_object->free()
  1337   * may be blocked on lock waiting to remove it.  So just
  1338   * skip it.
  1339   */
  1340  if (!kref_get_unless_zero(>refcount))
  1341  continue;
  1342  
  1343  mutex_unlock(_shrinker->lock);
  1344  
  1345  /* prevent racing with job-submission code paths */
  1346  if (!dma_resv_trylock(obj->resv)) {
  1347  *lock_contention |= true;
  1348  goto shrinker_lock;
  1349  }
  1350  
  1351  /* prevent racing with the dma-buf exporting */
  1352  if 
(!mutex_trylock(_shrinker->dev->object_name_lock)) {
  1353  *lock_contention |= true;
  1354  goto resv_unlock;
  1355  }
  1356  
  1357  /* check whether h/w uses this object */
> 1358  if (!dma_resv_test_signaled(obj->resv, true))
  1359  goto object_name_unlock;
  1360  
  1361  /* GEM may've become unpurgeable while shrinker was 
unlocked */
  1362  if (evict) {
  1363  i

[PATCH v2 3/5] drm/amdgpu: Use TTM builtin resource manager debugfs code

2022-04-11 Thread Zack Rusin
From: Zack Rusin 

Switch to using the TTM resource manager debugfs helpers. It's
exactly the same functionality but the debugfs code is shared with
other drivers.

The TTM resource managers need to stay valid for as long as the
drm debugfs_root is valid.

Signed-off-by: Zack Rusin 
Cc: Alex Deucher 
Cc: "Christian König" 
Cc: "Pan, Xinhui" 
Cc: David Airlie 
Cc: Daniel Vetter 
Cc: Felix Kuehling 
Cc: Nirmoy Das 
Cc: Thomas Zimmermann 
Cc: amd-...@lists.freedesktop.org
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 86 +
 1 file changed, 16 insertions(+), 70 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 57ac118fc266..37fe9fb3f8e5 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -2079,17 +2079,6 @@ int amdgpu_ttm_evict_resources(struct amdgpu_device 
*adev, int mem_type)
 
 #if defined(CONFIG_DEBUG_FS)
 
-static int amdgpu_mm_vram_table_show(struct seq_file *m, void *unused)
-{
-   struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
-   struct ttm_resource_manager *man = ttm_manager_type(>mman.bdev,
-   TTM_PL_VRAM);
-   struct drm_printer p = drm_seq_file_printer(m);
-
-   ttm_resource_manager_debug(man, );
-   return 0;
-}
-
 static int amdgpu_ttm_page_pool_show(struct seq_file *m, void *unused)
 {
struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
@@ -2097,55 +2086,6 @@ static int amdgpu_ttm_page_pool_show(struct seq_file *m, 
void *unused)
return ttm_pool_debugfs(>mman.bdev.pool, m);
 }
 
-static int amdgpu_mm_tt_table_show(struct seq_file *m, void *unused)
-{
-   struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
-   struct ttm_resource_manager *man = ttm_manager_type(>mman.bdev,
-   TTM_PL_TT);
-   struct drm_printer p = drm_seq_file_printer(m);
-
-   ttm_resource_manager_debug(man, );
-   return 0;
-}
-
-static int amdgpu_mm_gds_table_show(struct seq_file *m, void *unused)
-{
-   struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
-   struct ttm_resource_manager *man = ttm_manager_type(>mman.bdev,
-   AMDGPU_PL_GDS);
-   struct drm_printer p = drm_seq_file_printer(m);
-
-   ttm_resource_manager_debug(man, );
-   return 0;
-}
-
-static int amdgpu_mm_gws_table_show(struct seq_file *m, void *unused)
-{
-   struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
-   struct ttm_resource_manager *man = ttm_manager_type(>mman.bdev,
-   AMDGPU_PL_GWS);
-   struct drm_printer p = drm_seq_file_printer(m);
-
-   ttm_resource_manager_debug(man, );
-   return 0;
-}
-
-static int amdgpu_mm_oa_table_show(struct seq_file *m, void *unused)
-{
-   struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
-   struct ttm_resource_manager *man = ttm_manager_type(>mman.bdev,
-   AMDGPU_PL_OA);
-   struct drm_printer p = drm_seq_file_printer(m);
-
-   ttm_resource_manager_debug(man, );
-   return 0;
-}
-
-DEFINE_SHOW_ATTRIBUTE(amdgpu_mm_vram_table);
-DEFINE_SHOW_ATTRIBUTE(amdgpu_mm_tt_table);
-DEFINE_SHOW_ATTRIBUTE(amdgpu_mm_gds_table);
-DEFINE_SHOW_ATTRIBUTE(amdgpu_mm_gws_table);
-DEFINE_SHOW_ATTRIBUTE(amdgpu_mm_oa_table);
 DEFINE_SHOW_ATTRIBUTE(amdgpu_ttm_page_pool);
 
 /*
@@ -2355,17 +2295,23 @@ void amdgpu_ttm_debugfs_init(struct amdgpu_device *adev)
 _ttm_vram_fops, adev->gmc.mc_vram_size);
debugfs_create_file("amdgpu_iomem", 0444, root, adev,
_ttm_iomem_fops);
-   debugfs_create_file("amdgpu_vram_mm", 0444, root, adev,
-   _mm_vram_table_fops);
-   debugfs_create_file("amdgpu_gtt_mm", 0444, root, adev,
-   _mm_tt_table_fops);
-   debugfs_create_file("amdgpu_gds_mm", 0444, root, adev,
-   _mm_gds_table_fops);
-   debugfs_create_file("amdgpu_gws_mm", 0444, root, adev,
-   _mm_gws_table_fops);
-   debugfs_create_file("amdgpu_oa_mm", 0444, root, adev,
-   _mm_oa_table_fops);
debugfs_create_file("ttm_page_pool", 0444, root, adev,
_ttm_page_pool_fops);
+   ttm_resource_manager_create_debugfs(ttm_manager_type(>mman.bdev,
+TTM_PL_VRAM),
+   root, "amdgpu_vram_mm");
+   ttm_resource_manager_create_debugfs(ttm_manager_type(>mman.bdev,
+TTM_PL_TT),
+   root, "amdgpu_gtt_mm");
+   

[PATCH v2 5/5] drm/radeon: Use TTM builtin resource manager debugfs code

2022-04-11 Thread Zack Rusin
From: Zack Rusin 

Switch to using the TTM resource manager debugfs helpers. The
functionality is largely the same.
The TTM resource managers need to stay valid for as long as the
drm debugfs_root is valid.

Signed-off-by: Zack Rusin 
Cc: Alex Deucher 
Cc: "Christian König" 
Cc: "Pan, Xinhui" 
Cc: David Airlie 
Cc: Daniel Vetter 
Cc: amd-...@lists.freedesktop.org
---
 drivers/gpu/drm/radeon/radeon_ttm.c | 36 +
 1 file changed, 6 insertions(+), 30 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c 
b/drivers/gpu/drm/radeon/radeon_ttm.c
index 44594d16611f..d33fec488713 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -781,17 +781,6 @@ void radeon_ttm_set_active_vram_size(struct radeon_device 
*rdev, u64 size)
 
 #if defined(CONFIG_DEBUG_FS)
 
-static int radeon_mm_vram_dump_table_show(struct seq_file *m, void *unused)
-{
-   struct radeon_device *rdev = (struct radeon_device *)m->private;
-   struct ttm_resource_manager *man = ttm_manager_type(>mman.bdev,
-   TTM_PL_VRAM);
-   struct drm_printer p = drm_seq_file_printer(m);
-
-   ttm_resource_manager_debug(man, );
-   return 0;
-}
-
 static int radeon_ttm_page_pool_show(struct seq_file *m, void *data)
 {
struct radeon_device *rdev = (struct radeon_device *)m->private;
@@ -799,19 +788,6 @@ static int radeon_ttm_page_pool_show(struct seq_file *m, 
void *data)
return ttm_pool_debugfs(>mman.bdev.pool, m);
 }
 
-static int radeon_mm_gtt_dump_table_show(struct seq_file *m, void *unused)
-{
-   struct radeon_device *rdev = (struct radeon_device *)m->private;
-   struct ttm_resource_manager *man = ttm_manager_type(>mman.bdev,
-   TTM_PL_TT);
-   struct drm_printer p = drm_seq_file_printer(m);
-
-   ttm_resource_manager_debug(man, );
-   return 0;
-}
-
-DEFINE_SHOW_ATTRIBUTE(radeon_mm_vram_dump_table);
-DEFINE_SHOW_ATTRIBUTE(radeon_mm_gtt_dump_table);
 DEFINE_SHOW_ATTRIBUTE(radeon_ttm_page_pool);
 
 static int radeon_ttm_vram_open(struct inode *inode, struct file *filep)
@@ -930,15 +906,15 @@ static void radeon_ttm_debugfs_init(struct radeon_device 
*rdev)
 
debugfs_create_file("radeon_vram", 0444, root, rdev,
_ttm_vram_fops);
-
debugfs_create_file("radeon_gtt", 0444, root, rdev,
_ttm_gtt_fops);
-
-   debugfs_create_file("radeon_vram_mm", 0444, root, rdev,
-   _mm_vram_dump_table_fops);
-   debugfs_create_file("radeon_gtt_mm", 0444, root, rdev,
-   _mm_gtt_dump_table_fops);
debugfs_create_file("ttm_page_pool", 0444, root, rdev,
_ttm_page_pool_fops);
+   ttm_resource_manager_create_debugfs(ttm_manager_type(>mman.bdev,
+TTM_PL_VRAM),
+   root, "radeon_vram_mm");
+   ttm_resource_manager_create_debugfs(ttm_manager_type(>mman.bdev,
+TTM_PL_TT),
+   root, "radeon_gtt_mm");
 #endif
 }
-- 
2.32.0



[PATCH v2 2/5] drm/vmwgfx: Add debugfs entries for various ttm resource managers

2022-04-11 Thread Zack Rusin
From: Zack Rusin 

Use the newly added TTM's ability to automatically create debugfs entries
for specified placements. This creates debugfs files that can be read to
get information about various TTM resource managers which are used by
vmwgfx.

Signed-off-by: Zack Rusin 
---
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 18 ++
 1 file changed, 18 insertions(+)

diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index decd54b8333d..5c4d999f8cd3 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -1410,6 +1410,23 @@ static void vmw_remove(struct pci_dev *pdev)
vmw_driver_unload(dev);
 }
 
+static void vmw_debugfs_resource_managers_init(struct vmw_private *vmw)
+{
+   struct drm_minor *minor = vmw->drm.primary;
+   struct dentry *root = minor->debugfs_root;
+
+   ttm_resource_manager_create_debugfs(ttm_manager_type(>bdev, 
TTM_PL_SYSTEM),
+   root, "system_ttm");
+   ttm_resource_manager_create_debugfs(ttm_manager_type(>bdev, 
TTM_PL_VRAM),
+   root, "vram_ttm");
+   ttm_resource_manager_create_debugfs(ttm_manager_type(>bdev, 
VMW_PL_GMR),
+   root, "gmr_ttm");
+   ttm_resource_manager_create_debugfs(ttm_manager_type(>bdev, 
VMW_PL_MOB),
+   root, "mob_ttm");
+   ttm_resource_manager_create_debugfs(ttm_manager_type(>bdev, 
VMW_PL_SYSTEM),
+   root, "system_mob_ttm");
+}
+
 static unsigned long
 vmw_get_unmapped_area(struct file *file, unsigned long uaddr,
  unsigned long len, unsigned long pgoff,
@@ -1657,6 +1674,7 @@ static int vmw_probe(struct pci_dev *pdev, const struct 
pci_device_id *ent)
goto out_unload;
 
vmw_debugfs_gem_init(vmw);
+   vmw_debugfs_resource_managers_init(vmw);
 
return 0;
 out_unload:
-- 
2.32.0



[PATCH v2 4/5] drm/qxl: Use TTM builtin resource manager debugfs code

2022-04-11 Thread Zack Rusin
From: Zack Rusin 

Switch to using the TTM resource manager debugfs helpers. The
functionality is largely the same.
The TTM resource managers need to stay valid for as long as the
drm debugfs_root is valid.

Signed-off-by: Zack Rusin 
Cc: Dave Airlie 
Cc: Gerd Hoffmann 
Cc: Daniel Vetter 
Cc: virtualizat...@lists.linux-foundation.org
Cc: spice-de...@lists.freedesktop.org
---
 drivers/gpu/drm/qxl/qxl_ttm.c | 39 ++-
 1 file changed, 6 insertions(+), 33 deletions(-)

diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c
index 95df5750f47f..0dfdbfc8f6af 100644
--- a/drivers/gpu/drm/qxl/qxl_ttm.c
+++ b/drivers/gpu/drm/qxl/qxl_ttm.c
@@ -222,41 +222,14 @@ void qxl_ttm_fini(struct qxl_device *qdev)
DRM_INFO("qxl: ttm finalized\n");
 }
 
-#define QXL_DEBUGFS_MEM_TYPES 2
-
-#if defined(CONFIG_DEBUG_FS)
-static int qxl_mm_dump_table(struct seq_file *m, void *data)
-{
-   struct drm_info_node *node = (struct drm_info_node *)m->private;
-   struct ttm_resource_manager *man = (struct ttm_resource_manager 
*)node->info_ent->data;
-   struct drm_printer p = drm_seq_file_printer(m);
-
-   ttm_resource_manager_debug(man, );
-   return 0;
-}
-#endif
-
 void qxl_ttm_debugfs_init(struct qxl_device *qdev)
 {
 #if defined(CONFIG_DEBUG_FS)
-   static struct drm_info_list qxl_mem_types_list[QXL_DEBUGFS_MEM_TYPES];
-   static char qxl_mem_types_names[QXL_DEBUGFS_MEM_TYPES][32];
-   unsigned int i;
-
-   for (i = 0; i < QXL_DEBUGFS_MEM_TYPES; i++) {
-   if (i == 0)
-   sprintf(qxl_mem_types_names[i], "qxl_mem_mm");
-   else
-   sprintf(qxl_mem_types_names[i], "qxl_surf_mm");
-   qxl_mem_types_list[i].name = qxl_mem_types_names[i];
-   qxl_mem_types_list[i].show = _mm_dump_table;
-   qxl_mem_types_list[i].driver_features = 0;
-   if (i == 0)
-   qxl_mem_types_list[i].data = 
ttm_manager_type(>mman.bdev, TTM_PL_VRAM);
-   else
-   qxl_mem_types_list[i].data = 
ttm_manager_type(>mman.bdev, TTM_PL_PRIV);
-
-   }
-   qxl_debugfs_add_files(qdev, qxl_mem_types_list, i);
+   ttm_resource_manager_create_debugfs(ttm_manager_type(>mman.bdev,
+TTM_PL_VRAM),
+   qdev->ddev.primary->debugfs_root, 
"qxl_mem_mm");
+   ttm_resource_manager_create_debugfs(ttm_manager_type(>mman.bdev,
+TTM_PL_PRIV),
+   qdev->ddev.primary->debugfs_root, 
"qxl_surf_mm");
 #endif
 }
-- 
2.32.0



[PATCH v2 1/5] drm/ttm: Add common debugfs code for resource managers

2022-04-11 Thread Zack Rusin
From: Zack Rusin 

Drivers duplicate the code required to add debugfs entries for various
ttm resource managers. To fix it add common TTM resource manager debugfs
code that each driver can reuse.

Specific resource managers can overwrite
ttm_resource_manager_func::debug to get more information from those
debugfs entries.

Signed-off-by: Zack Rusin 
Cc: Christian Koenig 
Cc: Huang Rui 
Cc: David Airlie 
Cc: Daniel Vetter 
---
 drivers/gpu/drm/ttm/ttm_resource.c | 34 ++
 include/drm/ttm/ttm_resource.h |  4 
 2 files changed, 38 insertions(+)

diff --git a/drivers/gpu/drm/ttm/ttm_resource.c 
b/drivers/gpu/drm/ttm/ttm_resource.c
index 492ba3157e75..543db15bce5e 100644
--- a/drivers/gpu/drm/ttm/ttm_resource.c
+++ b/drivers/gpu/drm/ttm/ttm_resource.c
@@ -644,3 +644,37 @@ ttm_kmap_iter_linear_io_fini(struct 
ttm_kmap_iter_linear_io *iter_io,
 
ttm_mem_io_free(bdev, mem);
 }
+
+#if defined(CONFIG_DEBUG_FS)
+
+static int ttm_resource_manager_show(struct seq_file *m, void *unused)
+{
+   struct ttm_resource_manager *man =
+   (struct ttm_resource_manager *)m->private;
+   struct drm_printer p = drm_seq_file_printer(m);
+   ttm_resource_manager_debug(man, );
+   return 0;
+}
+DEFINE_SHOW_ATTRIBUTE(ttm_resource_manager);
+
+#endif
+
+/**
+ * ttm_resource_manager_create_debugfs - Create debugfs entry for specified
+ * resource manager.
+ * @man: The TTM resource manager for which the debugfs stats file be creates
+ * @parent: debugfs directory in which the file will reside
+ * @name: The filename to create.
+ *
+ * This function setups up a debugfs file that can be used to look
+ * at debug statistics of the specified ttm_resource_manager.
+ */
+void ttm_resource_manager_create_debugfs(struct ttm_resource_manager *man,
+struct dentry * parent,
+const char *name)
+{
+#if defined(CONFIG_DEBUG_FS)
+   debugfs_create_file(name, 0444, parent, man, 
_resource_manager_fops);
+#endif
+}
+EXPORT_SYMBOL(ttm_resource_manager_create_debugfs);
diff --git a/include/drm/ttm/ttm_resource.h b/include/drm/ttm/ttm_resource.h
index 4428a62e5f0e..c702e00fb16e 100644
--- a/include/drm/ttm/ttm_resource.h
+++ b/include/drm/ttm/ttm_resource.h
@@ -383,4 +383,8 @@ ttm_kmap_iter_linear_io_init(struct ttm_kmap_iter_linear_io 
*iter_io,
 void ttm_kmap_iter_linear_io_fini(struct ttm_kmap_iter_linear_io *iter_io,
  struct ttm_device *bdev,
  struct ttm_resource *mem);
+
+void ttm_resource_manager_create_debugfs(struct ttm_resource_manager *man,
+struct dentry * parent,
+const char *name);
 #endif
-- 
2.32.0



[PATCH v2 0/5] drm/ttm: Introduce TTM res manager debugfs helpers

2022-04-11 Thread Zack Rusin
From: Zack Rusin 

v2: Switch to using ttm_resource_manager's directly in the debugfs
callbacks

This series introduces generic TTM resource manager debugfs helpers and
refactors TTM drivers which have been using hand rolled out versions
of those to use the new code.

Zack Rusin (5):
  drm/ttm: Add common debugfs code for resource managers
  drm/vmwgfx: Add debugfs entries for various ttm resource managers
  drm/amdgpu: Use TTM builtin resource manager debugfs code
  drm/qxl: Use TTM builtin resource manager debugfs code
  drm/radeon: Use TTM builtin resource manager debugfs code

 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 86 +
 drivers/gpu/drm/qxl/qxl_ttm.c   | 39 ++-
 drivers/gpu/drm/radeon/radeon_ttm.c | 36 ++-
 drivers/gpu/drm/ttm/ttm_resource.c  | 34 ++
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 18 ++
 include/drm/ttm/ttm_resource.h  |  4 ++
 6 files changed, 84 insertions(+), 133 deletions(-)

-- 
2.32.0



RE: [Intel-gfx] [V2 2/3] drm/i915/display/debug: Expose crtc current bpc via debugfs

2022-04-11 Thread Murthy, Arun R
> -Original Message-
> From: Intel-gfx  On Behalf Of
> Bhanuprakash Modem
> Sent: Monday, April 11, 2022 3:21 PM
> To: intel-...@lists.freedesktop.org; dri-devel@lists.freedesktop.org; amd-
> g...@lists.freedesktop.org; jani.nik...@linux.intel.com;
> ville.syrj...@linux.intel.com; harry.wentl...@amd.com; Sharma, Swati2
> 
> Subject: [Intel-gfx] [V2 2/3] drm/i915/display/debug: Expose crtc current bpc
> via debugfs
> 
> This new debugfs will expose the currently using bpc by crtc.
> It is very useful for verifying whether we enter the correct output color 
> depth
> from IGT.
> 
> This patch will also add the connector's max supported bpc to
> "i915_display_info" debugfs.
> 
> Example:
> cat /sys/kernel/debug/dri/0/crtc-0/i915_current_bpc
> Current: 8
> 
> Cc: Jani Nikula 
> Cc: Ville Syrjälä 
> Cc: Uma Shankar 
> Signed-off-by: Bhanuprakash Modem 

Reviewed-by: Arun R Murthy 

Thanks and Regards,
Arun R Murthy
---


RE: [Intel-gfx] [V2 1/3] drm/debug: Expose connector's max supported bpc via debugfs

2022-04-11 Thread Murthy, Arun R
> +static int output_bpc_show(struct seq_file *m, void *data) {

Would it be better to have this function name as drm_output_bpc_show()

Thanks and Regards,
Arun R Murthy



Re: [PATCH 03/10] drm/sun4i: Remove obsolete references to PHYS_OFFSET

2022-04-11 Thread Samuel Holland
On 4/11/22 10:37 AM, Jernej Škrabec wrote:
> Dne ponedeljek, 11. april 2022 ob 06:34:15 CEST je Samuel Holland napisal(a):
>> commit b4bdc4fbf8d0 ("soc: sunxi: Deal with the MBUS DMA offsets in a
>> central place") added a platform device notifier that sets the DMA
>> offset for all of the display engine frontend and backend devices.
>>
>> The code applying the offset to DMA buffer physical addresses was then
>> removed from the backend driver in commit 756668ba682e ("drm/sun4i:
>> backend: Remove the MBUS quirks"), but the code subtracting PHYS_OFFSET
>> was left in the frontend driver.
>>
>> As a result, the offset was applied twice in the frontend driver. This
>> likely went unnoticed because it only affects specific configurations
>> (scaling or certain pixel formats) where the frontend is used, on boards
>> with both one of these older SoCs and more than 1 GB of DRAM.
>>
>> In addition, the references to PHYS_OFFSET prevent compiling the driver
>> on architectures where PHYS_OFFSET is not defined.
>>
>> Fixes: b4bdc4fbf8d0 ("soc: sunxi: Deal with the MBUS DMA offsets in a 
>> central 
> place")
>> Signed-off-by: Samuel Holland 
> 
> Good catch! Actually, people complained about non-working display on 
> Cubietruck IIRC, which has 2 GB of RAM.
> 
> Did you test this on HW?

The only DE1 board I have is an A33 tablet with 512 MB of DRAM. So while I
boot-tested the patch, I am not able to verify if it has any real effect.

The reason for sending this is that folks ran in to compilation errors on
RISC-V. And I was surprised to still see references to PHYS_OFFSET, since
sunxi_mbus.c includes the frontend compatibles.

Regards,
Samuel

> Reviewed-by: Jernej Skrabec 
> 
> Best regards,
> Jernej


[PATCH 1/1] drm/vkms: check plane_composer->map[0] before using it

2022-04-11 Thread Tales Lelo da Aparecida
Fix a copypasta error, which resulted in checking repeatedly if the
primary_composer->map[0] was null, instead of checking each
plane_composer while composing planes.

Signed-off-by: Tales Lelo da Aparecida 
---
 drivers/gpu/drm/vkms/vkms_composer.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/vkms/vkms_composer.c 
b/drivers/gpu/drm/vkms/vkms_composer.c
index c6a1036bf2ea..b47ac170108c 100644
--- a/drivers/gpu/drm/vkms/vkms_composer.c
+++ b/drivers/gpu/drm/vkms/vkms_composer.c
@@ -157,7 +157,7 @@ static void compose_plane(struct vkms_composer 
*primary_composer,
void *vaddr;
void (*pixel_blend)(const u8 *p_src, u8 *p_dst);
 
-   if (WARN_ON(iosys_map_is_null(_composer->map[0])))
+   if (WARN_ON(iosys_map_is_null(_composer->map[0])))
return;
 
vaddr = plane_composer->map[0].vaddr;
-- 
2.35.1



[PATCH 0/1] drm/vkms: check plane_composer->map[0] before using it

2022-04-11 Thread Tales Lelo da Aparecida
Hello, I'm interested in collaborating with VKMS, please let me know if there's
anything that I could better.

Tales Lelo da Aparecida (1):
  drm/vkms: check plane_composer->map[0] before using it

 drivers/gpu/drm/vkms/vkms_composer.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

-- 
2.35.1



Re: [Intel-gfx] [PATCH v5 04/10] drm/hdcp: Expand HDCP helper library for enable/disable/check

2022-04-11 Thread kernel test robot
Hi Sean,

I love your patch! Yet something to improve:

[auto build test ERROR on drm-tip/drm-tip]
[also build test ERROR on v5.18-rc2 next-20220411]
[cannot apply to drm/drm-next drm-intel/for-linux-next robh/for-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:
https://github.com/intel-lab-lkp/linux/commits/Sean-Paul/drm-hdcp-Pull-HDCP-auth-exchange-check-into-helpers/20220412-045000
base:   git://anongit.freedesktop.org/drm/drm-tip drm-tip
config: mips-buildonly-randconfig-r001-20220411 
(https://download.01.org/0day-ci/archive/20220412/202204120922.hnbhbmc7-...@intel.com/config)
compiler: mips-linux-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
~/bin/make.cross
chmod +x ~/bin/make.cross
# 
https://github.com/intel-lab-lkp/linux/commit/7486d07edbd9a137420102bc24535c5d29c53c12
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review 
Sean-Paul/drm-hdcp-Pull-HDCP-auth-exchange-check-into-helpers/20220412-045000
git checkout 7486d07edbd9a137420102bc24535c5d29c53c12
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross 
O=build_dir ARCH=mips SHELL=/bin/bash

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot 

All errors (new ones prefixed by >>):

   mips-linux-ld: drivers/gpu/drm/drm_hdcp.o: in function 
`drm_hdcp_remote_dpcd_read':
>> drm_hdcp.c:(.text+0x5e4): undefined reference to `drm_dp_dpcd_read'
   mips-linux-ld: drivers/gpu/drm/drm_hdcp.o: in function 
`drm_hdcp_remote_write':
>> drm_hdcp.c:(.text+0xf48): undefined reference to `drm_dp_dpcd_write'

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp


Re: [PATCH v3] drm/gma500: depend on framebuffer

2022-04-11 Thread James Hilliard
On Mon, Apr 11, 2022 at 3:27 AM Patrik Jakobsson
 wrote:
>
> On Sun, Apr 10, 2022 at 10:05 PM James Hilliard
>  wrote:
> >
> > On Sun, Apr 10, 2022 at 1:52 PM Patrik Jakobsson
> >  wrote:
> > >
> > > On Sun, Apr 10, 2022 at 9:40 PM James Hilliard
> > >  wrote:
> > > >
> > > > On Sun, Apr 10, 2022 at 1:36 PM Patrik Jakobsson
> > > >  wrote:
> > > > >
> > > > > On Sat, Apr 9, 2022 at 6:23 AM James Hilliard 
> > > > >  wrote:
> > > > > >
> > > > > > Select the efi framebuffer if efi is enabled.
> > > > > >
> > > > > > This appears to be needed for video output to function correctly.
> > > > > >
> > > > > > Signed-off-by: James Hilliard 
> > > > >
> > > > > Hi James,
> > > > > EFI_FB is its own driver and not needed by gma500 to drive its
> > > > > hardware. What makes you think it's required?
> > > >
> > > > I wasn't getting any HDMI video output without it enabled for some 
> > > > reason,
> > > > I assume it is doing some sort of initialization needed by gma500
> > > > during startup.
> > >
> > > Then it sounds like you might just be using EFI_FB and not gma500. Can
> > > you provide the kernel log with drm.debug=0x1f set on kernel
> > > command-line.
> >
> > Seems efifb loads first and then hands off to gma500
>
> That is how it normally works but efifb shouldn't change the state of
> the currently set mode so shouldn't affect gma500.
> From the logs I can see that you have LVDS (internal panel), HDMI and
> DP (3 displays in total) connected. This sounds wrong. Your version of
> gma500 (Cedarview) doesn't support more than 2 crtcs/pipes. This might
> be a problem.

Yeah, there's a bug there with the connector status, only DVI-D-1 is actually
connected, I have DP-2 and LVDS-1 turned off in weston.


[PATCH] drm/gma500: add comments to register definitions

2022-04-11 Thread James Hilliard
Extracted from various sources such EMGD releases.

Signed-off-by: James Hilliard 
---
 drivers/gpu/drm/gma500/psb_intel_reg.h | 212 +
 1 file changed, 107 insertions(+), 105 deletions(-)

diff --git a/drivers/gpu/drm/gma500/psb_intel_reg.h 
b/drivers/gpu/drm/gma500/psb_intel_reg.h
index ced7b433befb..a754bece30f5 100644
--- a/drivers/gpu/drm/gma500/psb_intel_reg.h
+++ b/drivers/gpu/drm/gma500/psb_intel_reg.h
@@ -31,7 +31,7 @@
 # define GPIO_DATA_VAL_IN  (1 << 12)
 # define GPIO_DATA_PULLUP_DISABLE  (1 << 13)
 
-#define GMBUS0 0x5100 /* clock/port select */
+#define GMBUS0 0x5100 /* clock/device select register */
 #define   GMBUS_RATE_100KHZ(0<<8)
 #define   GMBUS_RATE_50KHZ (1<<8)
 #define   GMBUS_RATE_400KHZ(2<<8) /* reserved on Pineview */
@@ -46,7 +46,7 @@
  /* 6 reserved */
 #define   GMBUS_PORT_DPD   7 /* HDMID */
 #define   GMBUS_NUM_PORTS   8
-#define GMBUS1 0x5104 /* command/status */
+#define GMBUS1 0x5104 /* command/status register */
 #define   GMBUS_SW_CLR_INT (1<<31)
 #define   GMBUS_SW_RDY (1<<30)
 #define   GMBUS_ENT(1<<29) /* enable timeout */
@@ -59,7 +59,7 @@
 #define   GMBUS_SLAVE_ADDR_SHIFT 1
 #define   GMBUS_SLAVE_READ (1<<0)
 #define   GMBUS_SLAVE_WRITE(0<<0)
-#define GMBUS2 0x5108 /* status */
+#define GMBUS2 0x5108 /* status register */
 #define   GMBUS_INUSE  (1<<15)
 #define   GMBUS_HW_WAIT_PHASE  (1<<14)
 #define   GMBUS_STALL_TIMEOUT  (1<<13)
@@ -67,18 +67,18 @@
 #define   GMBUS_HW_RDY (1<<11)
 #define   GMBUS_SATOER (1<<10)
 #define   GMBUS_ACTIVE (1<<9)
-#define GMBUS3 0x510c /* data buffer bytes 3-0 */
-#define GMBUS4 0x5110 /* interrupt mask (Pineview+) */
+#define GMBUS3 0x510c /* data buffer 3-0 register */
+#define GMBUS4 0x5110 /* REQUEST_INUSE register (Pineview+) */
 #define   GMBUS_SLAVE_TIMEOUT_EN (1<<4)
 #define   GMBUS_NAK_EN (1<<3)
 #define   GMBUS_IDLE_EN(1<<2)
 #define   GMBUS_HW_WAIT_EN (1<<1)
 #define   GMBUS_HW_RDY_EN  (1<<0)
-#define GMBUS5 0x5120 /* byte index */
+#define GMBUS5 0x5120 /* 2-byte index register */
 #define   GMBUS_2BYTE_INDEX_EN (1<<31)
 
-#define BLC_PWM_CTL0x61254
-#define BLC_PWM_CTL2   0x61250
+#define BLC_PWM_CTL0x61254 /* Backlight PWM Control */
+#define BLC_PWM_CTL2   0x61250 /* Image BLM Histogram Control */
 #define  PWM_ENABLE(1 << 31)
 #define  PWM_LEGACY_MODE   (1 << 30)
 #define  PWM_PIPE_B(1 << 29)
@@ -117,37 +117,38 @@
 #define I855_CLOCK_166_250 (3 << 0)
 
 /* I830 CRTC registers */
-#define HTOTAL_A   0x6
-#define HBLANK_A   0x60004
-#define HSYNC_A0x60008
-#define VTOTAL_A   0x6000c
-#define VBLANK_A   0x60010
-#define VSYNC_A0x60014
-#define PIPEASRC   0x6001c
-#define BCLRPAT_A  0x60020
+#define HTOTAL_A   0x6 /* Pipe A Horizontal Total Register */
+#define HBLANK_A   0x60004 /* Pipe A Horizontal Blank Register */
+#define HSYNC_A0x60008 /* Pipe A Horizontal Sync 
Register */
+#define VTOTAL_A   0x6000c /* Pipe A Vertical Total Register */
+#define VBLANK_A   0x60010 /* Pipe A Vertical Blank Register */
+#define VSYNC_A0x60014 /* Pipe A Vertical Sync 
Register */
+#define PIPEASRC   0x6001c /* Pipe A Source Image Size Register */
+#define BCLRPAT_A  0x60020 /* Pipe A Border Color Pattern Register 
*/
 #define VSYNCSHIFT_A   0x60028
 
-#define HTOTAL_B   0x61000
-#define HBLANK_B   0x61004
-#define HSYNC_B0x61008
-#define VTOTAL_B   0x6100c
-#define VBLANK_B   0x61010
-#define VSYNC_B0x61014
-#define PIPEBSRC   0x6101c
-#define BCLRPAT_B  0x61020
+#define HTOTAL_B   0x61000 /* Pipe B Horizontal Total Register */
+#define HBLANK_B   0x61004 /* Pipe B Horizontal Blank Register */
+#define HSYNC_B0x61008 /* Pipe B Horizontal Sync 
Register */
+#define VTOTAL_B   0x6100c /* Pipe B Vertical Total Register */
+#define VBLANK_B   0x61010 /* Pipe B Vertical Blank Register */
+#define VSYNC_B0x61014 /* Pipe B Vertical Sync 
Register */
+#define PIPEBSRC   0x6101c /* Pipe B Source Image Size Register */
+#define BCLRPAT_B  0x61020 /* Pipe B Border Color Pattern Register 
*/
 #define VSYNCSHIFT_B   0x61028
 
-#define HTOTAL_C   0x62000
-#define HBLANK_C   

Re: [Intel-gfx] [PATCH v2 4/7] drm/i915/guc: use the memcpy_from_wc call from the drm

2022-04-11 Thread Ceraolo Spurio, Daniele




On 3/21/2022 2:14 PM, Lucas De Marchi wrote:
On Thu, Mar 03, 2022 at 11:30:10PM +0530, Balasubramani Vivekanandan 
wrote:

memcpy_from_wc functions in i915_memcpy.c will be removed and replaced
by the implementation in drm_cache.c.
Updated to use the functions provided by drm_cache.c.

v2: Check if the log object allocated from local memory or system memory
   and according setup the iosys_map (Lucas)

Cc: Lucas De Marchi 

Signed-off-by: Balasubramani Vivekanandan 


---
drivers/gpu/drm/i915/gt/uc/intel_guc_log.c | 15 ---
1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_log.c 
b/drivers/gpu/drm/i915/gt/uc/intel_guc_log.c

index a24dc6441872..b9db765627ea 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_guc_log.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_log.c
@@ -3,6 +3,7 @@
 * Copyright © 2014-2019 Intel Corporation
 */

+#include 
#include 
#include 

@@ -206,6 +207,7 @@ static void guc_read_update_log_buffer(struct 
intel_guc_log *log)

enum guc_log_buffer_type type;
void *src_data, *dst_data;
bool new_overflow;
+    struct iosys_map src_map;

mutex_lock(>relay.lock);

@@ -282,14 +284,21 @@ static void guc_read_update_log_buffer(struct 
intel_guc_log *log)

    }

    /* Just copy the newly written data */
+    if (i915_gem_object_is_lmem(log->vma->obj))
+    iosys_map_set_vaddr_iomem(_map, (void __iomem 
*)src_data);

+    else
+    iosys_map_set_vaddr(_map, src_data);


It would be better to keep this outside of the loop. So inside the loop
we can use only iosys_map_incr(_map, buffer_size). However you'd
also have to handle the read_offset. The iosys_map_ API has both a
src_offset and dst_offset due to situations like that. Maybe this is
missing in the new drm_memcpy_* function you're adding?

This function was not correct wrt to IO memory access with the other
2 places in this function doing plain memcpy(). Since we are starting to
use iosys_map here, we probably should handle this commit as "migrate to
iosys_map", and convert those. In your current final state
we have 3 variables aliasing the same memory location. IMO it will be
error prone to keep it like that

+Michal, some questions:

- I'm not very familiar with the relayfs API. Is the `dst_data += 
PAGE_SIZE;`

really correct?


This is a bit weird due to how i915 uses the relay for the GuC logs, but 
it should be functionally correct. Each relay buffer is the same size of 
the GuC log buffer in i915 (which is guaranteed to be greater than 
PAGE_SIZE) and we always switch to a new relay buffer each time we dump 
new data, so we're guaranteed to have the space we need. We do some 
pointer magic because instead of just blindly copying the whole local 
log buffer to the relay buffer, we copy the header (which is in the 
first page) first, then we copy the rest of the logs (2nd page and 
onwards) based on what the header tells us has been filled out.




- Could you double check this patch and ack if ok?


The approach looks good to me, but I agree that at this point we might 
as well do a full conversion to iosys map. As you already mentioned, the 
memcpy that copies the header would also need to be updated for that, 
because it accesses the same memory as src_data, while the other memcpy 
is from the local copy of the header to the relay, so it should be safe 
to not convert.


Daniele



Heads up that since the log buffer is potentially in lmem, we will need
to convert this function to take that into account. All those accesses
to log_buf_state need to use the proper kernel abstraction for system vs
I/O memory.

thanks
Lucas De Marchi


+
    if (read_offset > write_offset) {
-    i915_memcpy_from_wc(dst_data, src_data, write_offset);
+    drm_memcpy_from_wc_vaddr(dst_data, _map,
+ write_offset);
    bytes_to_copy = buffer_size - read_offset;
    } else {
    bytes_to_copy = write_offset - read_offset;
    }
-    i915_memcpy_from_wc(dst_data + read_offset,
-    src_data + read_offset, bytes_to_copy);
+    iosys_map_incr(_map, read_offset);
+    drm_memcpy_from_wc_vaddr(dst_data + read_offset, _map,
+ bytes_to_copy);

    src_data += buffer_size;
    dst_data += buffer_size;
--
2.25.1





Re: [PATCH] drm/exynos: fix IS_ERR() vs NULL check in probe

2022-04-11 Thread Inki Dae
Hi Dan Carpenter.

Same patch[1] was posted so I will pick it up. 

[1] https://www.spinics.net/lists/arm-kernel/msg967488.html

Thanks,
Inki Dae

22. 4. 8. 19:21에 Dan Carpenter 이(가) 쓴 글:
> The of_drm_find_bridge() does not return error pointers, it returns
> NULL on error.
> 
> Fixes: dd8b6803bc49 ("exynos: drm: dsi: Attach in_bridge in MIC driver")
> Signed-off-by: Dan Carpenter 
> ---
> -EPROBE_DEFER is the correct return, right?
> 
>  drivers/gpu/drm/exynos/exynos_drm_mic.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_mic.c 
> b/drivers/gpu/drm/exynos/exynos_drm_mic.c
> index 9e06f8e2a863..07e04ceb2476 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_mic.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_mic.c
> @@ -434,9 +434,9 @@ static int exynos_mic_probe(struct platform_device *pdev)
>  
>   remote = of_graph_get_remote_node(dev->of_node, 1, 0);
>   mic->next_bridge = of_drm_find_bridge(remote);
> - if (IS_ERR(mic->next_bridge)) {
> + if (!mic->next_bridge) {
>   DRM_DEV_ERROR(dev, "mic: Failed to find next bridge\n");
> - ret = PTR_ERR(mic->next_bridge);
> + ret = -EPROBE_DEFER;
>   goto err;
>   }
>  


[PATCH AUTOSEL 4.9 5/7] gpu: ipu-v3: Fix dev_dbg frequency output

2022-04-11 Thread Sasha Levin
From: Leo Ruan 

[ Upstream commit 070a88fd4a03f921b73a2059e97d55faaa447dab ]

This commit corrects the printing of the IPU clock error percentage if
it is between -0.1% to -0.9%. For example, if the pixel clock requested
is 27.2 MHz but only 27.0 MHz can be achieved the deviation is -0.8%.
But the fixed point math had a flaw and calculated error of 0.2%.

Before:
  Clocks: IPU 27000Hz DI 24716667Hz Needed 2720Hz
  IPU clock can give 2700 with divider 10, error 0.2%
  Want 2720Hz IPU 27000Hz DI 24716667Hz using IPU, 2700Hz

After:
  Clocks: IPU 27000Hz DI 24716667Hz Needed 2720Hz
  IPU clock can give 2700 with divider 10, error -0.8%
  Want 2720Hz IPU 27000Hz DI 24716667Hz using IPU, 2700Hz

Signed-off-by: Leo Ruan 
Signed-off-by: Mark Jonas 
Reviewed-by: Philipp Zabel 
Signed-off-by: Philipp Zabel 
Link: https://lore.kernel.org/r/20220207151411.5009-1-mark.jo...@de.bosch.com
Signed-off-by: Sasha Levin 
---
 drivers/gpu/ipu-v3/ipu-di.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-di.c b/drivers/gpu/ipu-v3/ipu-di.c
index a8d87ddd8a17..dc0511b22600 100644
--- a/drivers/gpu/ipu-v3/ipu-di.c
+++ b/drivers/gpu/ipu-v3/ipu-di.c
@@ -460,8 +460,9 @@ static void ipu_di_config_clock(struct ipu_di *di,
 
error = rate / (sig->mode.pixelclock / 1000);
 
-   dev_dbg(di->ipu->dev, "  IPU clock can give %lu with divider 
%u, error %d.%u%%\n",
-   rate, div, (signed)(error - 1000) / 10, error % 10);
+   dev_dbg(di->ipu->dev, "  IPU clock can give %lu with divider 
%u, error %c%d.%d%%\n",
+   rate, div, error < 1000 ? '-' : '+',
+   abs(error - 1000) / 10, abs(error - 1000) % 10);
 
/* Allow a 1% error */
if (error < 1010 && error >= 990) {
-- 
2.35.1



[PATCH AUTOSEL 4.9 1/7] drm/amdkfd: Check for potential null return of kmalloc_array()

2022-04-11 Thread Sasha Levin
From: QintaoShen 

[ Upstream commit ebbb7bb9e80305820dc2328a371c1b35679f2667 ]

As the kmalloc_array() may return null, the 'event_waiters[i].wait' would lead 
to null-pointer dereference.
Therefore, it is better to check the return value of kmalloc_array() to avoid 
this confusion.

Signed-off-by: QintaoShen 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdkfd/kfd_events.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_events.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
index 6a3470f84998..732713ff3190 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_events.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
@@ -607,6 +607,8 @@ static struct kfd_event_waiter 
*alloc_event_waiters(uint32_t num_events)
event_waiters = kmalloc_array(num_events,
sizeof(struct kfd_event_waiter),
GFP_KERNEL);
+   if (!event_waiters)
+   return NULL;
 
for (i = 0; (event_waiters) && (i < num_events) ; i++) {
INIT_LIST_HEAD(_waiters[i].waiters);
-- 
2.35.1



[PATCH AUTOSEL 4.14 08/11] gpu: ipu-v3: Fix dev_dbg frequency output

2022-04-11 Thread Sasha Levin
From: Leo Ruan 

[ Upstream commit 070a88fd4a03f921b73a2059e97d55faaa447dab ]

This commit corrects the printing of the IPU clock error percentage if
it is between -0.1% to -0.9%. For example, if the pixel clock requested
is 27.2 MHz but only 27.0 MHz can be achieved the deviation is -0.8%.
But the fixed point math had a flaw and calculated error of 0.2%.

Before:
  Clocks: IPU 27000Hz DI 24716667Hz Needed 2720Hz
  IPU clock can give 2700 with divider 10, error 0.2%
  Want 2720Hz IPU 27000Hz DI 24716667Hz using IPU, 2700Hz

After:
  Clocks: IPU 27000Hz DI 24716667Hz Needed 2720Hz
  IPU clock can give 2700 with divider 10, error -0.8%
  Want 2720Hz IPU 27000Hz DI 24716667Hz using IPU, 2700Hz

Signed-off-by: Leo Ruan 
Signed-off-by: Mark Jonas 
Reviewed-by: Philipp Zabel 
Signed-off-by: Philipp Zabel 
Link: https://lore.kernel.org/r/20220207151411.5009-1-mark.jo...@de.bosch.com
Signed-off-by: Sasha Levin 
---
 drivers/gpu/ipu-v3/ipu-di.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-di.c b/drivers/gpu/ipu-v3/ipu-di.c
index d2f1bd9d3deb..c498dc7d8838 100644
--- a/drivers/gpu/ipu-v3/ipu-di.c
+++ b/drivers/gpu/ipu-v3/ipu-di.c
@@ -460,8 +460,9 @@ static void ipu_di_config_clock(struct ipu_di *di,
 
error = rate / (sig->mode.pixelclock / 1000);
 
-   dev_dbg(di->ipu->dev, "  IPU clock can give %lu with divider 
%u, error %d.%u%%\n",
-   rate, div, (signed)(error - 1000) / 10, error % 10);
+   dev_dbg(di->ipu->dev, "  IPU clock can give %lu with divider 
%u, error %c%d.%d%%\n",
+   rate, div, error < 1000 ? '-' : '+',
+   abs(error - 1000) / 10, abs(error - 1000) % 10);
 
/* Allow a 1% error */
if (error < 1010 && error >= 990) {
-- 
2.35.1



[PATCH AUTOSEL 4.14 02/11] drm/amdkfd: Check for potential null return of kmalloc_array()

2022-04-11 Thread Sasha Levin
From: QintaoShen 

[ Upstream commit ebbb7bb9e80305820dc2328a371c1b35679f2667 ]

As the kmalloc_array() may return null, the 'event_waiters[i].wait' would lead 
to null-pointer dereference.
Therefore, it is better to check the return value of kmalloc_array() to avoid 
this confusion.

Signed-off-by: QintaoShen 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdkfd/kfd_events.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_events.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
index 944abfad39c1..1d8dd81dfc70 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_events.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
@@ -607,6 +607,8 @@ static struct kfd_event_waiter 
*alloc_event_waiters(uint32_t num_events)
event_waiters = kmalloc_array(num_events,
sizeof(struct kfd_event_waiter),
GFP_KERNEL);
+   if (!event_waiters)
+   return NULL;
 
for (i = 0; (event_waiters) && (i < num_events) ; i++) {
INIT_LIST_HEAD(_waiters[i].waiters);
-- 
2.35.1



[PATCH AUTOSEL 4.14 01/11] drm/amd: Add USBC connector ID

2022-04-11 Thread Sasha Levin
From: Aurabindo Pillai 

[ Upstream commit c5c948aa894a831f96fccd025e47186b1ee41615 ]

[Why] Add a dedicated AMDGPU specific ID for use with
newer ASICs that support USB-C output

Signed-off-by: Aurabindo Pillai 
Reviewed-by: Alex Deucher 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/ObjectID.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/ObjectID.h 
b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
index 06192698bd96..c90567de8bf7 100644
--- a/drivers/gpu/drm/amd/amdgpu/ObjectID.h
+++ b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
@@ -119,6 +119,7 @@
 #define CONNECTOR_OBJECT_ID_eDP   0x14
 #define CONNECTOR_OBJECT_ID_MXM   0x15
 #define CONNECTOR_OBJECT_ID_LVDS_eDP  0x16
+#define CONNECTOR_OBJECT_ID_USBC  0x17
 
 /* deleted */
 
-- 
2.35.1



[PATCH AUTOSEL 4.19 10/12] drm/amd/display: Fix allocate_mst_payload assert on resume

2022-04-11 Thread Sasha Levin
From: Roman Li 

[ Upstream commit f4346fb3edf7720db3f7f5e1cab1f667cd024280 ]

[Why]
On resume we do link detection for all non-MST connectors.
MST is handled separately. However the condition for telling
if connector is on mst branch is not enough for mst hub case.
Link detection for mst branch link leads to mst topology reset.
That causes assert in dc_link_allocate_mst_payload()

[How]
Use link type as indicator for mst link.

Reviewed-by: Wayne Lin 
Acked-by: Alex Hung 
Signed-off-by: Roman Li 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index ed02bb6b2cd0..1d1183c47beb 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -777,7 +777,8 @@ static int dm_resume(void *handle)
 * this is the case when traversing through already created
 * MST connectors, should be skipped
 */
-   if (aconnector->mst_port)
+   if (aconnector->dc_link &&
+   aconnector->dc_link->type == dc_connection_mst_branch)
continue;
 
mutex_lock(>hpd_lock);
-- 
2.35.1



[PATCH AUTOSEL 4.19 08/12] gpu: ipu-v3: Fix dev_dbg frequency output

2022-04-11 Thread Sasha Levin
From: Leo Ruan 

[ Upstream commit 070a88fd4a03f921b73a2059e97d55faaa447dab ]

This commit corrects the printing of the IPU clock error percentage if
it is between -0.1% to -0.9%. For example, if the pixel clock requested
is 27.2 MHz but only 27.0 MHz can be achieved the deviation is -0.8%.
But the fixed point math had a flaw and calculated error of 0.2%.

Before:
  Clocks: IPU 27000Hz DI 24716667Hz Needed 2720Hz
  IPU clock can give 2700 with divider 10, error 0.2%
  Want 2720Hz IPU 27000Hz DI 24716667Hz using IPU, 2700Hz

After:
  Clocks: IPU 27000Hz DI 24716667Hz Needed 2720Hz
  IPU clock can give 2700 with divider 10, error -0.8%
  Want 2720Hz IPU 27000Hz DI 24716667Hz using IPU, 2700Hz

Signed-off-by: Leo Ruan 
Signed-off-by: Mark Jonas 
Reviewed-by: Philipp Zabel 
Signed-off-by: Philipp Zabel 
Link: https://lore.kernel.org/r/20220207151411.5009-1-mark.jo...@de.bosch.com
Signed-off-by: Sasha Levin 
---
 drivers/gpu/ipu-v3/ipu-di.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-di.c b/drivers/gpu/ipu-v3/ipu-di.c
index d2f1bd9d3deb..c498dc7d8838 100644
--- a/drivers/gpu/ipu-v3/ipu-di.c
+++ b/drivers/gpu/ipu-v3/ipu-di.c
@@ -460,8 +460,9 @@ static void ipu_di_config_clock(struct ipu_di *di,
 
error = rate / (sig->mode.pixelclock / 1000);
 
-   dev_dbg(di->ipu->dev, "  IPU clock can give %lu with divider 
%u, error %d.%u%%\n",
-   rate, div, (signed)(error - 1000) / 10, error % 10);
+   dev_dbg(di->ipu->dev, "  IPU clock can give %lu with divider 
%u, error %c%d.%d%%\n",
+   rate, div, error < 1000 ? '-' : '+',
+   abs(error - 1000) / 10, abs(error - 1000) % 10);
 
/* Allow a 1% error */
if (error < 1010 && error >= 990) {
-- 
2.35.1



[PATCH AUTOSEL 4.19 02/12] drm/amdkfd: Check for potential null return of kmalloc_array()

2022-04-11 Thread Sasha Levin
From: QintaoShen 

[ Upstream commit ebbb7bb9e80305820dc2328a371c1b35679f2667 ]

As the kmalloc_array() may return null, the 'event_waiters[i].wait' would lead 
to null-pointer dereference.
Therefore, it is better to check the return value of kmalloc_array() to avoid 
this confusion.

Signed-off-by: QintaoShen 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdkfd/kfd_events.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_events.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
index e9f0e0a1b41c..892077377339 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_events.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
@@ -532,6 +532,8 @@ static struct kfd_event_waiter 
*alloc_event_waiters(uint32_t num_events)
event_waiters = kmalloc_array(num_events,
sizeof(struct kfd_event_waiter),
GFP_KERNEL);
+   if (!event_waiters)
+   return NULL;
 
for (i = 0; (event_waiters) && (i < num_events) ; i++) {
init_wait(_waiters[i].wait);
-- 
2.35.1



[PATCH AUTOSEL 4.19 01/12] drm/amd: Add USBC connector ID

2022-04-11 Thread Sasha Levin
From: Aurabindo Pillai 

[ Upstream commit c5c948aa894a831f96fccd025e47186b1ee41615 ]

[Why] Add a dedicated AMDGPU specific ID for use with
newer ASICs that support USB-C output

Signed-off-by: Aurabindo Pillai 
Reviewed-by: Alex Deucher 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/ObjectID.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/ObjectID.h 
b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
index 5b393622f592..a0f0a17e224f 100644
--- a/drivers/gpu/drm/amd/amdgpu/ObjectID.h
+++ b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
@@ -119,6 +119,7 @@
 #define CONNECTOR_OBJECT_ID_eDP   0x14
 #define CONNECTOR_OBJECT_ID_MXM   0x15
 #define CONNECTOR_OBJECT_ID_LVDS_eDP  0x16
+#define CONNECTOR_OBJECT_ID_USBC  0x17
 
 /* deleted */
 
-- 
2.35.1



[PATCH AUTOSEL 5.4 16/21] drm/amd/display: Fix allocate_mst_payload assert on resume

2022-04-11 Thread Sasha Levin
From: Roman Li 

[ Upstream commit f4346fb3edf7720db3f7f5e1cab1f667cd024280 ]

[Why]
On resume we do link detection for all non-MST connectors.
MST is handled separately. However the condition for telling
if connector is on mst branch is not enough for mst hub case.
Link detection for mst branch link leads to mst topology reset.
That causes assert in dc_link_allocate_mst_payload()

[How]
Use link type as indicator for mst link.

Reviewed-by: Wayne Lin 
Acked-by: Alex Hung 
Signed-off-by: Roman Li 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 8e4d863c7570..a83d33a92650 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -1210,7 +1210,8 @@ static int dm_resume(void *handle)
 * this is the case when traversing through already created
 * MST connectors, should be skipped
 */
-   if (aconnector->mst_port)
+   if (aconnector->dc_link &&
+   aconnector->dc_link->type == dc_connection_mst_branch)
continue;
 
mutex_lock(>hpd_lock);
-- 
2.35.1



[PATCH AUTOSEL 5.4 11/21] gpu: ipu-v3: Fix dev_dbg frequency output

2022-04-11 Thread Sasha Levin
From: Leo Ruan 

[ Upstream commit 070a88fd4a03f921b73a2059e97d55faaa447dab ]

This commit corrects the printing of the IPU clock error percentage if
it is between -0.1% to -0.9%. For example, if the pixel clock requested
is 27.2 MHz but only 27.0 MHz can be achieved the deviation is -0.8%.
But the fixed point math had a flaw and calculated error of 0.2%.

Before:
  Clocks: IPU 27000Hz DI 24716667Hz Needed 2720Hz
  IPU clock can give 2700 with divider 10, error 0.2%
  Want 2720Hz IPU 27000Hz DI 24716667Hz using IPU, 2700Hz

After:
  Clocks: IPU 27000Hz DI 24716667Hz Needed 2720Hz
  IPU clock can give 2700 with divider 10, error -0.8%
  Want 2720Hz IPU 27000Hz DI 24716667Hz using IPU, 2700Hz

Signed-off-by: Leo Ruan 
Signed-off-by: Mark Jonas 
Reviewed-by: Philipp Zabel 
Signed-off-by: Philipp Zabel 
Link: https://lore.kernel.org/r/20220207151411.5009-1-mark.jo...@de.bosch.com
Signed-off-by: Sasha Levin 
---
 drivers/gpu/ipu-v3/ipu-di.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-di.c b/drivers/gpu/ipu-v3/ipu-di.c
index b4a31d506fcc..74eca68891ad 100644
--- a/drivers/gpu/ipu-v3/ipu-di.c
+++ b/drivers/gpu/ipu-v3/ipu-di.c
@@ -451,8 +451,9 @@ static void ipu_di_config_clock(struct ipu_di *di,
 
error = rate / (sig->mode.pixelclock / 1000);
 
-   dev_dbg(di->ipu->dev, "  IPU clock can give %lu with divider 
%u, error %d.%u%%\n",
-   rate, div, (signed)(error - 1000) / 10, error % 10);
+   dev_dbg(di->ipu->dev, "  IPU clock can give %lu with divider 
%u, error %c%d.%d%%\n",
+   rate, div, error < 1000 ? '-' : '+',
+   abs(error - 1000) / 10, abs(error - 1000) % 10);
 
/* Allow a 1% error */
if (error < 1010 && error >= 990) {
-- 
2.35.1



[PATCH AUTOSEL 5.4 05/21] drm/amdkfd: Check for potential null return of kmalloc_array()

2022-04-11 Thread Sasha Levin
From: QintaoShen 

[ Upstream commit ebbb7bb9e80305820dc2328a371c1b35679f2667 ]

As the kmalloc_array() may return null, the 'event_waiters[i].wait' would lead 
to null-pointer dereference.
Therefore, it is better to check the return value of kmalloc_array() to avoid 
this confusion.

Signed-off-by: QintaoShen 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdkfd/kfd_events.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_events.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
index d674d4b3340f..adbb2fec2e0f 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_events.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
@@ -532,6 +532,8 @@ static struct kfd_event_waiter 
*alloc_event_waiters(uint32_t num_events)
event_waiters = kmalloc_array(num_events,
sizeof(struct kfd_event_waiter),
GFP_KERNEL);
+   if (!event_waiters)
+   return NULL;
 
for (i = 0; (event_waiters) && (i < num_events) ; i++) {
init_wait(_waiters[i].wait);
-- 
2.35.1



[PATCH AUTOSEL 5.4 04/21] drm/amdkfd: Fix Incorrect VMIDs passed to HWS

2022-04-11 Thread Sasha Levin
From: Tushar Patel 

[ Upstream commit b7dfbd2e601f3fee545bc158feceba4f340fe7cf ]

Compute-only GPUs have more than 8 VMIDs allocated to KFD. Fix
this by passing correct number of VMIDs to HWS

v2: squash in warning fix (Alex)

Signed-off-by: Tushar Patel 
Reviewed-by: Felix Kuehling 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c |  2 +-
 drivers/gpu/drm/amd/amdkfd/kfd_device.c | 11 +++
 2 files changed, 4 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index e8e172010416..ffd754713522 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -633,7 +633,7 @@ MODULE_PARM_DESC(sched_policy,
  * Maximum number of processes that HWS can schedule concurrently. The maximum 
is the
  * number of VMIDs assigned to the HWS, which is also the default.
  */
-int hws_max_conc_proc = 8;
+int hws_max_conc_proc = -1;
 module_param(hws_max_conc_proc, int, 0444);
 MODULE_PARM_DESC(hws_max_conc_proc,
"Max # processes HWS can execute concurrently when sched_policy=0 (0 = 
no concurrency, #VMIDs for KFD = Maximum(default))");
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
index ad9483b9eea3..60ee1a832112 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
@@ -609,15 +609,10 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
- kfd->vm_info.first_vmid_kfd + 1;
 
/* Verify module parameters regarding mapped process number*/
-   if ((hws_max_conc_proc < 0)
-   || (hws_max_conc_proc > kfd->vm_info.vmid_num_kfd)) {
-   dev_err(kfd_device,
-   "hws_max_conc_proc %d must be between 0 and %d, use %d 
instead\n",
-   hws_max_conc_proc, kfd->vm_info.vmid_num_kfd,
-   kfd->vm_info.vmid_num_kfd);
+   if (hws_max_conc_proc >= 0)
+   kfd->max_proc_per_quantum = min((u32)hws_max_conc_proc, 
kfd->vm_info.vmid_num_kfd);
+   else
kfd->max_proc_per_quantum = kfd->vm_info.vmid_num_kfd;
-   } else
-   kfd->max_proc_per_quantum = hws_max_conc_proc;
 
/* Allocate global GWS that is shared by all KFD processes */
if (hws_gws_support && amdgpu_amdkfd_alloc_gws(kfd->kgd,
-- 
2.35.1



[PATCH AUTOSEL 5.4 03/21] drm/amd/display: Update VTEM Infopacket definition

2022-04-11 Thread Sasha Levin
From: "Leo (Hanghong) Ma" 

[ Upstream commit c9fbf6435162ed5fb7201d1d4adf6585c6a8c327 ]

[Why & How]
The latest HDMI SPEC has updated the VTEM packet structure,
so change the VTEM Infopacket defined in the driver side to align
with the SPEC.

Reviewed-by: Chris Park 
Acked-by: Alex Hung 
Signed-off-by: Leo (Hanghong) Ma 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 .../gpu/drm/amd/display/modules/info_packet/info_packet.c| 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c 
b/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
index d885d642ed7f..537736713598 100644
--- a/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
+++ b/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
@@ -85,7 +85,8 @@
 //PB7 = MD0
 #define MASK_VTEM_MD0__VRR_EN 0x01
 #define MASK_VTEM_MD0__M_CONST0x02
-#define MASK_VTEM_MD0__RESERVED2  0x0C
+#define MASK_VTEM_MD0__QMS_EN 0x04
+#define MASK_VTEM_MD0__RESERVED2  0x08
 #define MASK_VTEM_MD0__FVA_FACTOR_M1  0xF0
 
 //MD1
@@ -94,7 +95,7 @@
 //MD2
 #define MASK_VTEM_MD2__BASE_REFRESH_RATE_98  0x03
 #define MASK_VTEM_MD2__RB0x04
-#define MASK_VTEM_MD2__RESERVED3 0xF8
+#define MASK_VTEM_MD2__NEXT_TFR  0xF8
 
 //MD3
 #define MASK_VTEM_MD3__BASE_REFRESH_RATE_07  0xFF
-- 
2.35.1



[PATCH AUTOSEL 5.4 02/21] drm/amd/display: fix audio format not updated after edid updated

2022-04-11 Thread Sasha Levin
From: Charlene Liu 

[ Upstream commit 5e8a71cf13bc9184fee915b2220be71b4c6cac74 ]

[why]
for the case edid change only changed audio format.
driver still need to update stream.

Reviewed-by: Alvin Lee 
Reviewed-by: Aric Cyr 
Acked-by: Alex Hung 
Signed-off-by: Charlene Liu 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
index 95a5310e9e66..de246e183d6b 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
@@ -1546,8 +1546,8 @@ bool dc_is_stream_unchanged(
if (old_stream->ignore_msa_timing_param != 
stream->ignore_msa_timing_param)
return false;
 
-   // Only Have Audio left to check whether it is same or not. This is a 
corner case for Tiled sinks
-   if (old_stream->audio_info.mode_count != stream->audio_info.mode_count)
+   /*compare audio info*/
+   if (memcmp(_stream->audio_info, >audio_info, 
sizeof(stream->audio_info)) != 0)
return false;
 
return true;
-- 
2.35.1



[PATCH AUTOSEL 5.4 01/21] drm/amd: Add USBC connector ID

2022-04-11 Thread Sasha Levin
From: Aurabindo Pillai 

[ Upstream commit c5c948aa894a831f96fccd025e47186b1ee41615 ]

[Why] Add a dedicated AMDGPU specific ID for use with
newer ASICs that support USB-C output

Signed-off-by: Aurabindo Pillai 
Reviewed-by: Alex Deucher 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/ObjectID.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/ObjectID.h 
b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
index 5b393622f592..a0f0a17e224f 100644
--- a/drivers/gpu/drm/amd/amdgpu/ObjectID.h
+++ b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
@@ -119,6 +119,7 @@
 #define CONNECTOR_OBJECT_ID_eDP   0x14
 #define CONNECTOR_OBJECT_ID_MXM   0x15
 #define CONNECTOR_OBJECT_ID_LVDS_eDP  0x16
+#define CONNECTOR_OBJECT_ID_USBC  0x17
 
 /* deleted */
 
-- 
2.35.1



[PATCH AUTOSEL 5.10 24/30] drm/amd/display: Fix allocate_mst_payload assert on resume

2022-04-11 Thread Sasha Levin
From: Roman Li 

[ Upstream commit f4346fb3edf7720db3f7f5e1cab1f667cd024280 ]

[Why]
On resume we do link detection for all non-MST connectors.
MST is handled separately. However the condition for telling
if connector is on mst branch is not enough for mst hub case.
Link detection for mst branch link leads to mst topology reset.
That causes assert in dc_link_allocate_mst_payload()

[How]
Use link type as indicator for mst link.

Reviewed-by: Wayne Lin 
Acked-by: Alex Hung 
Signed-off-by: Roman Li 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index e828f9414ba2..7bb151283f44 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -2022,7 +2022,8 @@ static int dm_resume(void *handle)
 * this is the case when traversing through already created
 * MST connectors, should be skipped
 */
-   if (aconnector->mst_port)
+   if (aconnector->dc_link &&
+   aconnector->dc_link->type == dc_connection_mst_branch)
continue;
 
mutex_lock(>hpd_lock);
-- 
2.35.1



[PATCH AUTOSEL 5.10 23/30] drm/amd/display: Revert FEC check in validation

2022-04-11 Thread Sasha Levin
From: Martin Leung 

[ Upstream commit b2075fce104b88b789c15ef1ed2b91dc94198e26 ]

why and how:
causes failure on install on certain machines

Reviewed-by: George Shen 
Acked-by: Alex Hung 
Signed-off-by: Martin Leung 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/core/dc.c | 4 
 1 file changed, 4 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index ac5323596c65..93f5229c303e 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -1173,10 +1173,6 @@ bool dc_validate_seamless_boot_timing(const struct dc 
*dc,
if (!link->link_enc->funcs->is_dig_enabled(link->link_enc))
return false;
 
-   /* Check for FEC status*/
-   if (link->link_enc->funcs->fec_is_active(link->link_enc))
-   return false;
-
enc_inst = link->link_enc->funcs->get_dig_frontend(link->link_enc);
 
if (enc_inst == ENGINE_ID_UNKNOWN)
-- 
2.35.1



[PATCH AUTOSEL 5.10 16/30] gpu: ipu-v3: Fix dev_dbg frequency output

2022-04-11 Thread Sasha Levin
From: Leo Ruan 

[ Upstream commit 070a88fd4a03f921b73a2059e97d55faaa447dab ]

This commit corrects the printing of the IPU clock error percentage if
it is between -0.1% to -0.9%. For example, if the pixel clock requested
is 27.2 MHz but only 27.0 MHz can be achieved the deviation is -0.8%.
But the fixed point math had a flaw and calculated error of 0.2%.

Before:
  Clocks: IPU 27000Hz DI 24716667Hz Needed 2720Hz
  IPU clock can give 2700 with divider 10, error 0.2%
  Want 2720Hz IPU 27000Hz DI 24716667Hz using IPU, 2700Hz

After:
  Clocks: IPU 27000Hz DI 24716667Hz Needed 2720Hz
  IPU clock can give 2700 with divider 10, error -0.8%
  Want 2720Hz IPU 27000Hz DI 24716667Hz using IPU, 2700Hz

Signed-off-by: Leo Ruan 
Signed-off-by: Mark Jonas 
Reviewed-by: Philipp Zabel 
Signed-off-by: Philipp Zabel 
Link: https://lore.kernel.org/r/20220207151411.5009-1-mark.jo...@de.bosch.com
Signed-off-by: Sasha Levin 
---
 drivers/gpu/ipu-v3/ipu-di.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-di.c b/drivers/gpu/ipu-v3/ipu-di.c
index b4a31d506fcc..74eca68891ad 100644
--- a/drivers/gpu/ipu-v3/ipu-di.c
+++ b/drivers/gpu/ipu-v3/ipu-di.c
@@ -451,8 +451,9 @@ static void ipu_di_config_clock(struct ipu_di *di,
 
error = rate / (sig->mode.pixelclock / 1000);
 
-   dev_dbg(di->ipu->dev, "  IPU clock can give %lu with divider 
%u, error %d.%u%%\n",
-   rate, div, (signed)(error - 1000) / 10, error % 10);
+   dev_dbg(di->ipu->dev, "  IPU clock can give %lu with divider 
%u, error %c%d.%d%%\n",
+   rate, div, error < 1000 ? '-' : '+',
+   abs(error - 1000) / 10, abs(error - 1000) % 10);
 
/* Allow a 1% error */
if (error < 1010 && error >= 990) {
-- 
2.35.1



[PATCH AUTOSEL 5.10 09/30] drm/amdkfd: Check for potential null return of kmalloc_array()

2022-04-11 Thread Sasha Levin
From: QintaoShen 

[ Upstream commit ebbb7bb9e80305820dc2328a371c1b35679f2667 ]

As the kmalloc_array() may return null, the 'event_waiters[i].wait' would lead 
to null-pointer dereference.
Therefore, it is better to check the return value of kmalloc_array() to avoid 
this confusion.

Signed-off-by: QintaoShen 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdkfd/kfd_events.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_events.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
index ba2c2ce0c55a..159be13ef20b 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_events.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
@@ -531,6 +531,8 @@ static struct kfd_event_waiter 
*alloc_event_waiters(uint32_t num_events)
event_waiters = kmalloc_array(num_events,
sizeof(struct kfd_event_waiter),
GFP_KERNEL);
+   if (!event_waiters)
+   return NULL;
 
for (i = 0; (event_waiters) && (i < num_events) ; i++) {
init_wait(_waiters[i].wait);
-- 
2.35.1



[PATCH AUTOSEL 5.10 08/30] drm/amdgpu/vcn: improve vcn dpg stop procedure

2022-04-11 Thread Sasha Levin
From: Tianci Yin 

[ Upstream commit 6ea239adc2a712eb318f04f5c29b018ba65ea38a ]

Prior to disabling dpg, VCN need unpausing dpg mode, or VCN will hang in
S3 resuming.

Reviewed-by: James Zhu 
Signed-off-by: Tianci Yin 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
index 2099f6ebd833..bdb8e596bda6 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
@@ -1429,8 +1429,11 @@ static int vcn_v3_0_start_sriov(struct amdgpu_device 
*adev)
 
 static int vcn_v3_0_stop_dpg_mode(struct amdgpu_device *adev, int inst_idx)
 {
+   struct dpg_pause_state state = {.fw_based = VCN_DPG_STATE__UNPAUSE};
uint32_t tmp;
 
+   vcn_v3_0_pause_dpg_mode(adev, 0, );
+
/* Wait for power status to be 1 */
SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_POWER_STATUS, 1,
UVD_POWER_STATUS__UVD_POWER_STATUS_MASK);
-- 
2.35.1



[PATCH AUTOSEL 5.10 07/30] drm/amdkfd: Fix Incorrect VMIDs passed to HWS

2022-04-11 Thread Sasha Levin
From: Tushar Patel 

[ Upstream commit b7dfbd2e601f3fee545bc158feceba4f340fe7cf ]

Compute-only GPUs have more than 8 VMIDs allocated to KFD. Fix
this by passing correct number of VMIDs to HWS

v2: squash in warning fix (Alex)

Signed-off-by: Tushar Patel 
Reviewed-by: Felix Kuehling 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c |  2 +-
 drivers/gpu/drm/amd/amdkfd/kfd_device.c | 11 +++
 2 files changed, 4 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index ed13a2f76884..30659c1776e8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -632,7 +632,7 @@ MODULE_PARM_DESC(sched_policy,
  * Maximum number of processes that HWS can schedule concurrently. The maximum 
is the
  * number of VMIDs assigned to the HWS, which is also the default.
  */
-int hws_max_conc_proc = 8;
+int hws_max_conc_proc = -1;
 module_param(hws_max_conc_proc, int, 0444);
 MODULE_PARM_DESC(hws_max_conc_proc,
"Max # processes HWS can execute concurrently when sched_policy=0 (0 = 
no concurrency, #VMIDs for KFD = Maximum(default))");
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
index 84313135c2ea..148e43dee657 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
@@ -664,15 +664,10 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
- kfd->vm_info.first_vmid_kfd + 1;
 
/* Verify module parameters regarding mapped process number*/
-   if ((hws_max_conc_proc < 0)
-   || (hws_max_conc_proc > kfd->vm_info.vmid_num_kfd)) {
-   dev_err(kfd_device,
-   "hws_max_conc_proc %d must be between 0 and %d, use %d 
instead\n",
-   hws_max_conc_proc, kfd->vm_info.vmid_num_kfd,
-   kfd->vm_info.vmid_num_kfd);
+   if (hws_max_conc_proc >= 0)
+   kfd->max_proc_per_quantum = min((u32)hws_max_conc_proc, 
kfd->vm_info.vmid_num_kfd);
+   else
kfd->max_proc_per_quantum = kfd->vm_info.vmid_num_kfd;
-   } else
-   kfd->max_proc_per_quantum = hws_max_conc_proc;
 
/* calculate max size of mqds needed for queues */
size = max_num_of_queues_per_device *
-- 
2.35.1



[PATCH AUTOSEL 5.10 06/30] drm/amd/display: Update VTEM Infopacket definition

2022-04-11 Thread Sasha Levin
From: "Leo (Hanghong) Ma" 

[ Upstream commit c9fbf6435162ed5fb7201d1d4adf6585c6a8c327 ]

[Why & How]
The latest HDMI SPEC has updated the VTEM packet structure,
so change the VTEM Infopacket defined in the driver side to align
with the SPEC.

Reviewed-by: Chris Park 
Acked-by: Alex Hung 
Signed-off-by: Leo (Hanghong) Ma 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 .../gpu/drm/amd/display/modules/info_packet/info_packet.c| 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c 
b/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
index 0fdf7a3e96de..96e18050a617 100644
--- a/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
+++ b/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
@@ -100,7 +100,8 @@ enum vsc_packet_revision {
 //PB7 = MD0
 #define MASK_VTEM_MD0__VRR_EN 0x01
 #define MASK_VTEM_MD0__M_CONST0x02
-#define MASK_VTEM_MD0__RESERVED2  0x0C
+#define MASK_VTEM_MD0__QMS_EN 0x04
+#define MASK_VTEM_MD0__RESERVED2  0x08
 #define MASK_VTEM_MD0__FVA_FACTOR_M1  0xF0
 
 //MD1
@@ -109,7 +110,7 @@ enum vsc_packet_revision {
 //MD2
 #define MASK_VTEM_MD2__BASE_REFRESH_RATE_98  0x03
 #define MASK_VTEM_MD2__RB0x04
-#define MASK_VTEM_MD2__RESERVED3 0xF8
+#define MASK_VTEM_MD2__NEXT_TFR  0xF8
 
 //MD3
 #define MASK_VTEM_MD3__BASE_REFRESH_RATE_07  0xFF
-- 
2.35.1



[PATCH AUTOSEL 5.10 05/30] drm/amd/display: FEC check in timing validation

2022-04-11 Thread Sasha Levin
From: Chiawen Huang 

[ Upstream commit 7d56a154e22ffb3613fdebf83ec34d5225a22993 ]

[Why]
disable/enable leads FEC mismatch between hw/sw FEC state.

[How]
check FEC status to fastboot on/off.

Reviewed-by: Anthony Koo 
Acked-by: Alex Hung 
Signed-off-by: Chiawen Huang 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/core/dc.c | 4 
 1 file changed, 4 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 93f5229c303e..ac5323596c65 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -1173,6 +1173,10 @@ bool dc_validate_seamless_boot_timing(const struct dc 
*dc,
if (!link->link_enc->funcs->is_dig_enabled(link->link_enc))
return false;
 
+   /* Check for FEC status*/
+   if (link->link_enc->funcs->fec_is_active(link->link_enc))
+   return false;
+
enc_inst = link->link_enc->funcs->get_dig_frontend(link->link_enc);
 
if (enc_inst == ENGINE_ID_UNKNOWN)
-- 
2.35.1



[PATCH AUTOSEL 5.10 04/30] drm/amd/display: fix audio format not updated after edid updated

2022-04-11 Thread Sasha Levin
From: Charlene Liu 

[ Upstream commit 5e8a71cf13bc9184fee915b2220be71b4c6cac74 ]

[why]
for the case edid change only changed audio format.
driver still need to update stream.

Reviewed-by: Alvin Lee 
Reviewed-by: Aric Cyr 
Acked-by: Alex Hung 
Signed-off-by: Charlene Liu 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
index 5f4cdb05c4db..a21f1141fbb0 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
@@ -1698,8 +1698,8 @@ bool dc_is_stream_unchanged(
if (old_stream->ignore_msa_timing_param != 
stream->ignore_msa_timing_param)
return false;
 
-   // Only Have Audio left to check whether it is same or not. This is a 
corner case for Tiled sinks
-   if (old_stream->audio_info.mode_count != stream->audio_info.mode_count)
+   /*compare audio info*/
+   if (memcmp(_stream->audio_info, >audio_info, 
sizeof(stream->audio_info)) != 0)
return false;
 
return true;
-- 
2.35.1



[PATCH AUTOSEL 5.10 01/30] drm/amd: Add USBC connector ID

2022-04-11 Thread Sasha Levin
From: Aurabindo Pillai 

[ Upstream commit c5c948aa894a831f96fccd025e47186b1ee41615 ]

[Why] Add a dedicated AMDGPU specific ID for use with
newer ASICs that support USB-C output

Signed-off-by: Aurabindo Pillai 
Reviewed-by: Alex Deucher 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/ObjectID.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/ObjectID.h 
b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
index 5b393622f592..a0f0a17e224f 100644
--- a/drivers/gpu/drm/amd/amdgpu/ObjectID.h
+++ b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
@@ -119,6 +119,7 @@
 #define CONNECTOR_OBJECT_ID_eDP   0x14
 #define CONNECTOR_OBJECT_ID_MXM   0x15
 #define CONNECTOR_OBJECT_ID_LVDS_eDP  0x16
+#define CONNECTOR_OBJECT_ID_USBC  0x17
 
 /* deleted */
 
-- 
2.35.1



[PATCH AUTOSEL 5.15 31/41] drm/amd/display: Fix allocate_mst_payload assert on resume

2022-04-11 Thread Sasha Levin
From: Roman Li 

[ Upstream commit f4346fb3edf7720db3f7f5e1cab1f667cd024280 ]

[Why]
On resume we do link detection for all non-MST connectors.
MST is handled separately. However the condition for telling
if connector is on mst branch is not enough for mst hub case.
Link detection for mst branch link leads to mst topology reset.
That causes assert in dc_link_allocate_mst_payload()

[How]
Use link type as indicator for mst link.

Reviewed-by: Wayne Lin 
Acked-by: Alex Hung 
Signed-off-by: Roman Li 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index b9859e52ad92..091524bdc673 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -2296,7 +2296,8 @@ static int dm_resume(void *handle)
 * this is the case when traversing through already created
 * MST connectors, should be skipped
 */
-   if (aconnector->mst_port)
+   if (aconnector->dc_link &&
+   aconnector->dc_link->type == dc_connection_mst_branch)
continue;
 
mutex_lock(>hpd_lock);
-- 
2.35.1



[PATCH AUTOSEL 5.15 30/41] drm/amd/display: Revert FEC check in validation

2022-04-11 Thread Sasha Levin
From: Martin Leung 

[ Upstream commit b2075fce104b88b789c15ef1ed2b91dc94198e26 ]

why and how:
causes failure on install on certain machines

Reviewed-by: George Shen 
Acked-by: Alex Hung 
Signed-off-by: Martin Leung 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/core/dc.c | 4 
 1 file changed, 4 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 35a27fe48f66..b37c4d2e7a1e 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -1377,10 +1377,6 @@ bool dc_validate_seamless_boot_timing(const struct dc 
*dc,
if (!link->link_enc->funcs->is_dig_enabled(link->link_enc))
return false;
 
-   /* Check for FEC status*/
-   if (link->link_enc->funcs->fec_is_active(link->link_enc))
-   return false;
-
enc_inst = link->link_enc->funcs->get_dig_frontend(link->link_enc);
 
if (enc_inst == ENGINE_ID_UNKNOWN)
-- 
2.35.1



[PATCH AUTOSEL 5.15 29/41] drm/amd/display: Enable power gating before init_pipes

2022-04-11 Thread Sasha Levin
From: Roman Li 

[ Upstream commit 58e16c752e9540b28a873c44c3bee83e022007c1 ]

[Why]
In init_hw() we call init_pipes() before enabling power gating.
init_pipes() tries to power gate dsc but it may fail because
required force-ons are not released yet.
As a result with dsc config the following errors observed on resume:
"REG_WAIT timeout 1us * 1000 tries - dcn20_dsc_pg_control"
"REG_WAIT timeout 1us * 1000 tries - dcn20_dpp_pg_control"
"REG_WAIT timeout 1us * 1000 tries - dcn20_hubp_pg_control"

[How]
Move enable_power_gating_plane() before init_pipes() in init_hw()

Reviewed-by: Anthony Koo 
Reviewed-by: Eric Yang 
Acked-by: Alex Hung 
Signed-off-by: Roman Li 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 5 +++--
 drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c| 5 +++--
 drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c| 5 +++--
 3 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c 
b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
index 3af49cdf89eb..174dd149fee7 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
@@ -1435,6 +1435,9 @@ void dcn10_init_hw(struct dc *dc)
}
}
 
+   if (hws->funcs.enable_power_gating_plane)
+   hws->funcs.enable_power_gating_plane(dc->hwseq, true);
+
/* If taking control over from VBIOS, we may want to optimize our first
 * mode set, so we need to skip powering down pipes until we know which
 * pipes we want to use.
@@ -1487,8 +1490,6 @@ void dcn10_init_hw(struct dc *dc)
 
REG_UPDATE(DCFCLK_CNTL, DCFCLK_GATE_DIS, 0);
}
-   if (hws->funcs.enable_power_gating_plane)
-   hws->funcs.enable_power_gating_plane(dc->hwseq, true);
 
if (dc->clk_mgr->funcs->notify_wm_ranges)
dc->clk_mgr->funcs->notify_wm_ranges(dc->clk_mgr);
diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c 
b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
index 0950784bafa4..f83457375811 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
@@ -570,6 +570,9 @@ void dcn30_init_hw(struct dc *dc)
}
}
 
+   if (hws->funcs.enable_power_gating_plane)
+   hws->funcs.enable_power_gating_plane(dc->hwseq, true);
+
/* If taking control over from VBIOS, we may want to optimize our first
 * mode set, so we need to skip powering down pipes until we know which
 * pipes we want to use.
@@ -647,8 +650,6 @@ void dcn30_init_hw(struct dc *dc)
 
REG_UPDATE(DCFCLK_CNTL, DCFCLK_GATE_DIS, 0);
}
-   if (hws->funcs.enable_power_gating_plane)
-   hws->funcs.enable_power_gating_plane(dc->hwseq, true);
 
if (!dcb->funcs->is_accelerated_mode(dcb) && 
dc->res_pool->hubbub->funcs->init_watermarks)

dc->res_pool->hubbub->funcs->init_watermarks(dc->res_pool->hubbub);
diff --git a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c 
b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c
index 3afa1159a5f7..b72d080b302a 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c
@@ -204,6 +204,9 @@ void dcn31_init_hw(struct dc *dc)
}
}
 
+   if (hws->funcs.enable_power_gating_plane)
+   hws->funcs.enable_power_gating_plane(dc->hwseq, true);
+
/* If taking control over from VBIOS, we may want to optimize our first
 * mode set, so we need to skip powering down pipes until we know which
 * pipes we want to use.
@@ -287,8 +290,6 @@ void dcn31_init_hw(struct dc *dc)
 
REG_UPDATE(DCFCLK_CNTL, DCFCLK_GATE_DIS, 0);
}
-   if (hws->funcs.enable_power_gating_plane)
-   hws->funcs.enable_power_gating_plane(dc->hwseq, true);
 
if (!dcb->funcs->is_accelerated_mode(dcb) && 
dc->res_pool->hubbub->funcs->init_watermarks)

dc->res_pool->hubbub->funcs->init_watermarks(dc->res_pool->hubbub);
-- 
2.35.1



[PATCH AUTOSEL 5.15 20/41] gpu: ipu-v3: Fix dev_dbg frequency output

2022-04-11 Thread Sasha Levin
From: Leo Ruan 

[ Upstream commit 070a88fd4a03f921b73a2059e97d55faaa447dab ]

This commit corrects the printing of the IPU clock error percentage if
it is between -0.1% to -0.9%. For example, if the pixel clock requested
is 27.2 MHz but only 27.0 MHz can be achieved the deviation is -0.8%.
But the fixed point math had a flaw and calculated error of 0.2%.

Before:
  Clocks: IPU 27000Hz DI 24716667Hz Needed 2720Hz
  IPU clock can give 2700 with divider 10, error 0.2%
  Want 2720Hz IPU 27000Hz DI 24716667Hz using IPU, 2700Hz

After:
  Clocks: IPU 27000Hz DI 24716667Hz Needed 2720Hz
  IPU clock can give 2700 with divider 10, error -0.8%
  Want 2720Hz IPU 27000Hz DI 24716667Hz using IPU, 2700Hz

Signed-off-by: Leo Ruan 
Signed-off-by: Mark Jonas 
Reviewed-by: Philipp Zabel 
Signed-off-by: Philipp Zabel 
Link: https://lore.kernel.org/r/20220207151411.5009-1-mark.jo...@de.bosch.com
Signed-off-by: Sasha Levin 
---
 drivers/gpu/ipu-v3/ipu-di.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-di.c b/drivers/gpu/ipu-v3/ipu-di.c
index 666223c6bec4..0a34e0ab4fe6 100644
--- a/drivers/gpu/ipu-v3/ipu-di.c
+++ b/drivers/gpu/ipu-v3/ipu-di.c
@@ -447,8 +447,9 @@ static void ipu_di_config_clock(struct ipu_di *di,
 
error = rate / (sig->mode.pixelclock / 1000);
 
-   dev_dbg(di->ipu->dev, "  IPU clock can give %lu with divider 
%u, error %d.%u%%\n",
-   rate, div, (signed)(error - 1000) / 10, error % 10);
+   dev_dbg(di->ipu->dev, "  IPU clock can give %lu with divider 
%u, error %c%d.%d%%\n",
+   rate, div, error < 1000 ? '-' : '+',
+   abs(error - 1000) / 10, abs(error - 1000) % 10);
 
/* Allow a 1% error */
if (error < 1010 && error >= 990) {
-- 
2.35.1



[PATCH AUTOSEL 5.15 11/41] drm/amdkfd: Check for potential null return of kmalloc_array()

2022-04-11 Thread Sasha Levin
From: QintaoShen 

[ Upstream commit ebbb7bb9e80305820dc2328a371c1b35679f2667 ]

As the kmalloc_array() may return null, the 'event_waiters[i].wait' would lead 
to null-pointer dereference.
Therefore, it is better to check the return value of kmalloc_array() to avoid 
this confusion.

Signed-off-by: QintaoShen 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdkfd/kfd_events.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_events.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
index 3eea4edee355..b8bdd796cd91 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_events.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
@@ -531,6 +531,8 @@ static struct kfd_event_waiter 
*alloc_event_waiters(uint32_t num_events)
event_waiters = kmalloc_array(num_events,
sizeof(struct kfd_event_waiter),
GFP_KERNEL);
+   if (!event_waiters)
+   return NULL;
 
for (i = 0; (event_waiters) && (i < num_events) ; i++) {
init_wait(_waiters[i].wait);
-- 
2.35.1



[PATCH AUTOSEL 5.15 10/41] drm/amdgpu/vcn: improve vcn dpg stop procedure

2022-04-11 Thread Sasha Levin
From: Tianci Yin 

[ Upstream commit 6ea239adc2a712eb318f04f5c29b018ba65ea38a ]

Prior to disabling dpg, VCN need unpausing dpg mode, or VCN will hang in
S3 resuming.

Reviewed-by: James Zhu 
Signed-off-by: Tianci Yin 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
index 3d18aab88b4e..a026b2eaec21 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
@@ -1508,8 +1508,11 @@ static int vcn_v3_0_start_sriov(struct amdgpu_device 
*adev)
 
 static int vcn_v3_0_stop_dpg_mode(struct amdgpu_device *adev, int inst_idx)
 {
+   struct dpg_pause_state state = {.fw_based = VCN_DPG_STATE__UNPAUSE};
uint32_t tmp;
 
+   vcn_v3_0_pause_dpg_mode(adev, 0, );
+
/* Wait for power status to be 1 */
SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_POWER_STATUS, 1,
UVD_POWER_STATUS__UVD_POWER_STATUS_MASK);
-- 
2.35.1



[PATCH AUTOSEL 5.15 09/41] drm/amdkfd: Fix Incorrect VMIDs passed to HWS

2022-04-11 Thread Sasha Levin
From: Tushar Patel 

[ Upstream commit b7dfbd2e601f3fee545bc158feceba4f340fe7cf ]

Compute-only GPUs have more than 8 VMIDs allocated to KFD. Fix
this by passing correct number of VMIDs to HWS

v2: squash in warning fix (Alex)

Signed-off-by: Tushar Patel 
Reviewed-by: Felix Kuehling 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c |  2 +-
 drivers/gpu/drm/amd/amdkfd/kfd_device.c | 11 +++
 2 files changed, 4 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 5a7fef324c82..b517b76e96a1 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -680,7 +680,7 @@ MODULE_PARM_DESC(sched_policy,
  * Maximum number of processes that HWS can schedule concurrently. The maximum 
is the
  * number of VMIDs assigned to the HWS, which is also the default.
  */
-int hws_max_conc_proc = 8;
+int hws_max_conc_proc = -1;
 module_param(hws_max_conc_proc, int, 0444);
 MODULE_PARM_DESC(hws_max_conc_proc,
"Max # processes HWS can execute concurrently when sched_policy=0 (0 = 
no concurrency, #VMIDs for KFD = Maximum(default))");
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
index 88c483f69989..660eb7097cfc 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
@@ -834,15 +834,10 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
}
 
/* Verify module parameters regarding mapped process number*/
-   if ((hws_max_conc_proc < 0)
-   || (hws_max_conc_proc > kfd->vm_info.vmid_num_kfd)) {
-   dev_err(kfd_device,
-   "hws_max_conc_proc %d must be between 0 and %d, use %d 
instead\n",
-   hws_max_conc_proc, kfd->vm_info.vmid_num_kfd,
-   kfd->vm_info.vmid_num_kfd);
+   if (hws_max_conc_proc >= 0)
+   kfd->max_proc_per_quantum = min((u32)hws_max_conc_proc, 
kfd->vm_info.vmid_num_kfd);
+   else
kfd->max_proc_per_quantum = kfd->vm_info.vmid_num_kfd;
-   } else
-   kfd->max_proc_per_quantum = hws_max_conc_proc;
 
/* calculate max size of mqds needed for queues */
size = max_num_of_queues_per_device *
-- 
2.35.1



[PATCH AUTOSEL 5.15 08/41] drm/amd/display: Update VTEM Infopacket definition

2022-04-11 Thread Sasha Levin
From: "Leo (Hanghong) Ma" 

[ Upstream commit c9fbf6435162ed5fb7201d1d4adf6585c6a8c327 ]

[Why & How]
The latest HDMI SPEC has updated the VTEM packet structure,
so change the VTEM Infopacket defined in the driver side to align
with the SPEC.

Reviewed-by: Chris Park 
Acked-by: Alex Hung 
Signed-off-by: Leo (Hanghong) Ma 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 .../gpu/drm/amd/display/modules/info_packet/info_packet.c| 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c 
b/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
index 57f198de5e2c..4e075b01d48b 100644
--- a/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
+++ b/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
@@ -100,7 +100,8 @@ enum vsc_packet_revision {
 //PB7 = MD0
 #define MASK_VTEM_MD0__VRR_EN 0x01
 #define MASK_VTEM_MD0__M_CONST0x02
-#define MASK_VTEM_MD0__RESERVED2  0x0C
+#define MASK_VTEM_MD0__QMS_EN 0x04
+#define MASK_VTEM_MD0__RESERVED2  0x08
 #define MASK_VTEM_MD0__FVA_FACTOR_M1  0xF0
 
 //MD1
@@ -109,7 +110,7 @@ enum vsc_packet_revision {
 //MD2
 #define MASK_VTEM_MD2__BASE_REFRESH_RATE_98  0x03
 #define MASK_VTEM_MD2__RB0x04
-#define MASK_VTEM_MD2__RESERVED3 0xF8
+#define MASK_VTEM_MD2__NEXT_TFR  0xF8
 
 //MD3
 #define MASK_VTEM_MD3__BASE_REFRESH_RATE_07  0xFF
-- 
2.35.1



[PATCH AUTOSEL 5.15 07/41] drm/amd/display: FEC check in timing validation

2022-04-11 Thread Sasha Levin
From: Chiawen Huang 

[ Upstream commit 7d56a154e22ffb3613fdebf83ec34d5225a22993 ]

[Why]
disable/enable leads FEC mismatch between hw/sw FEC state.

[How]
check FEC status to fastboot on/off.

Reviewed-by: Anthony Koo 
Acked-by: Alex Hung 
Signed-off-by: Chiawen Huang 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/core/dc.c | 4 
 1 file changed, 4 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index b37c4d2e7a1e..35a27fe48f66 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -1377,6 +1377,10 @@ bool dc_validate_seamless_boot_timing(const struct dc 
*dc,
if (!link->link_enc->funcs->is_dig_enabled(link->link_enc))
return false;
 
+   /* Check for FEC status*/
+   if (link->link_enc->funcs->fec_is_active(link->link_enc))
+   return false;
+
enc_inst = link->link_enc->funcs->get_dig_frontend(link->link_enc);
 
if (enc_inst == ENGINE_ID_UNKNOWN)
-- 
2.35.1



[PATCH AUTOSEL 5.15 06/41] drm/amd/display: fix audio format not updated after edid updated

2022-04-11 Thread Sasha Levin
From: Charlene Liu 

[ Upstream commit 5e8a71cf13bc9184fee915b2220be71b4c6cac74 ]

[why]
for the case edid change only changed audio format.
driver still need to update stream.

Reviewed-by: Alvin Lee 
Reviewed-by: Aric Cyr 
Acked-by: Alex Hung 
Signed-off-by: Charlene Liu 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
index 7ae409f7dcf8..8c285d585249 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
@@ -1623,8 +1623,8 @@ bool dc_is_stream_unchanged(
if (old_stream->ignore_msa_timing_param != 
stream->ignore_msa_timing_param)
return false;
 
-   // Only Have Audio left to check whether it is same or not. This is a 
corner case for Tiled sinks
-   if (old_stream->audio_info.mode_count != stream->audio_info.mode_count)
+   /*compare audio info*/
+   if (memcmp(_stream->audio_info, >audio_info, 
sizeof(stream->audio_info)) != 0)
return false;
 
return true;
-- 
2.35.1



[PATCH AUTOSEL 5.15 05/41] drm/amdgpu/gmc: use PCI BARs for APUs in passthrough

2022-04-11 Thread Sasha Levin
From: Alex Deucher 

[ Upstream commit b818a5d374542ccec73dcfe578a081574029820e ]

If the GPU is passed through to a guest VM, use the PCI
BAR for CPU FB access rather than the physical address of
carve out.  The physical address is not valid in a guest.

v2: Fix HDP handing as suggested by Michel

Reviewed-by: Christian König 
Reviewed-by: Michel Dänzer 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 4 ++--
 drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c | 2 +-
 drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c  | 5 +++--
 drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c  | 2 +-
 drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c  | 2 +-
 5 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 33026b3eafd2..2f2ae26a8068 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -5625,7 +5625,7 @@ void amdgpu_device_flush_hdp(struct amdgpu_device *adev,
struct amdgpu_ring *ring)
 {
 #ifdef CONFIG_X86_64
-   if (adev->flags & AMD_IS_APU)
+   if ((adev->flags & AMD_IS_APU) && !amdgpu_passthrough(adev))
return;
 #endif
if (adev->gmc.xgmi.connected_to_cpu)
@@ -5641,7 +5641,7 @@ void amdgpu_device_invalidate_hdp(struct amdgpu_device 
*adev,
struct amdgpu_ring *ring)
 {
 #ifdef CONFIG_X86_64
-   if (adev->flags & AMD_IS_APU)
+   if ((adev->flags & AMD_IS_APU) && !amdgpu_passthrough(adev))
return;
 #endif
if (adev->gmc.xgmi.connected_to_cpu)
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c 
b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
index 3c01be661014..93a4da4284ed 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
@@ -788,7 +788,7 @@ static int gmc_v10_0_mc_init(struct amdgpu_device *adev)
adev->gmc.aper_size = pci_resource_len(adev->pdev, 0);
 
 #ifdef CONFIG_X86_64
-   if (adev->flags & AMD_IS_APU) {
+   if ((adev->flags & AMD_IS_APU) && !amdgpu_passthrough(adev)) {
adev->gmc.aper_base = 
adev->gfxhub.funcs->get_mc_fb_offset(adev);
adev->gmc.aper_size = adev->gmc.real_vram_size;
}
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c 
b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
index 0a50fdaced7e..63c47f61d0df 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
@@ -381,8 +381,9 @@ static int gmc_v7_0_mc_init(struct amdgpu_device *adev)
adev->gmc.aper_size = pci_resource_len(adev->pdev, 0);
 
 #ifdef CONFIG_X86_64
-   if (adev->flags & AMD_IS_APU &&
-   adev->gmc.real_vram_size > adev->gmc.aper_size) {
+   if ((adev->flags & AMD_IS_APU) &&
+   adev->gmc.real_vram_size > adev->gmc.aper_size &&
+   !amdgpu_passthrough(adev)) {
adev->gmc.aper_base = ((u64)RREG32(mmMC_VM_FB_OFFSET)) << 22;
adev->gmc.aper_size = adev->gmc.real_vram_size;
}
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c 
b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
index 63b890f1e8af..bef9610084f1 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
@@ -581,7 +581,7 @@ static int gmc_v8_0_mc_init(struct amdgpu_device *adev)
adev->gmc.aper_size = pci_resource_len(adev->pdev, 0);
 
 #ifdef CONFIG_X86_64
-   if (adev->flags & AMD_IS_APU) {
+   if ((adev->flags & AMD_IS_APU) && !amdgpu_passthrough(adev)) {
adev->gmc.aper_base = ((u64)RREG32(mmMC_VM_FB_OFFSET)) << 22;
adev->gmc.aper_size = adev->gmc.real_vram_size;
}
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c 
b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
index 6dc16ccf6c81..0e731016921b 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
@@ -1387,7 +1387,7 @@ static int gmc_v9_0_mc_init(struct amdgpu_device *adev)
 */
 
/* check whether both host-gpu and gpu-gpu xgmi links exist */
-   if ((adev->flags & AMD_IS_APU) ||
+   if (((adev->flags & AMD_IS_APU) && !amdgpu_passthrough(adev)) ||
(adev->gmc.xgmi.supported &&
 adev->gmc.xgmi.connected_to_cpu)) {
adev->gmc.aper_base =
-- 
2.35.1



[PATCH AUTOSEL 5.15 04/41] drm/amdgpu: conduct a proper cleanup of PDB bo

2022-04-11 Thread Sasha Levin
From: Guchun Chen 

[ Upstream commit 2d505453f38e18d42ba7d5428aaa17aaa7752c65 ]

Use amdgpu_bo_free_kernel instead of amdgpu_bo_unref to
perform a proper cleanup of PDB bo.

v2: update subject to be more accurate

Signed-off-by: Guchun Chen 
Reviewed-by: Christian König 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c 
b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
index c67e21244342..6dc16ccf6c81 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
@@ -1652,7 +1652,7 @@ static int gmc_v9_0_sw_fini(void *handle)
amdgpu_gem_force_release(adev);
amdgpu_vm_manager_fini(adev);
amdgpu_gart_table_vram_free(adev);
-   amdgpu_bo_unref(>gmc.pdb0_bo);
+   amdgpu_bo_free_kernel(>gmc.pdb0_bo, NULL, >gmc.ptr_pdb0);
amdgpu_bo_fini(adev);
 
return 0;
-- 
2.35.1



[PATCH AUTOSEL 5.15 01/41] drm/amd: Add USBC connector ID

2022-04-11 Thread Sasha Levin
From: Aurabindo Pillai 

[ Upstream commit c5c948aa894a831f96fccd025e47186b1ee41615 ]

[Why] Add a dedicated AMDGPU specific ID for use with
newer ASICs that support USB-C output

Signed-off-by: Aurabindo Pillai 
Reviewed-by: Alex Deucher 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/ObjectID.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/ObjectID.h 
b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
index 5b393622f592..a0f0a17e224f 100644
--- a/drivers/gpu/drm/amd/amdgpu/ObjectID.h
+++ b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
@@ -119,6 +119,7 @@
 #define CONNECTOR_OBJECT_ID_eDP   0x14
 #define CONNECTOR_OBJECT_ID_MXM   0x15
 #define CONNECTOR_OBJECT_ID_LVDS_eDP  0x16
+#define CONNECTOR_OBJECT_ID_USBC  0x17
 
 /* deleted */
 
-- 
2.35.1



[PATCH AUTOSEL 5.17 38/49] drm/amd/display: Fix allocate_mst_payload assert on resume

2022-04-11 Thread Sasha Levin
From: Roman Li 

[ Upstream commit f4346fb3edf7720db3f7f5e1cab1f667cd024280 ]

[Why]
On resume we do link detection for all non-MST connectors.
MST is handled separately. However the condition for telling
if connector is on mst branch is not enough for mst hub case.
Link detection for mst branch link leads to mst topology reset.
That causes assert in dc_link_allocate_mst_payload()

[How]
Use link type as indicator for mst link.

Reviewed-by: Wayne Lin 
Acked-by: Alex Hung 
Signed-off-by: Roman Li 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index b28b5c490860..4ba173b47617 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -2693,7 +2693,8 @@ static int dm_resume(void *handle)
 * this is the case when traversing through already created
 * MST connectors, should be skipped
 */
-   if (aconnector->mst_port)
+   if (aconnector->dc_link &&
+   aconnector->dc_link->type == dc_connection_mst_branch)
continue;
 
mutex_lock(>hpd_lock);
-- 
2.35.1



[PATCH AUTOSEL 5.17 37/49] drm/amd/display: Revert FEC check in validation

2022-04-11 Thread Sasha Levin
From: Martin Leung 

[ Upstream commit b2075fce104b88b789c15ef1ed2b91dc94198e26 ]

why and how:
causes failure on install on certain machines

Reviewed-by: George Shen 
Acked-by: Alex Hung 
Signed-off-by: Martin Leung 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/core/dc.c | 4 
 1 file changed, 4 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index a62711d71d0e..ba1aa994db4b 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -1493,10 +1493,6 @@ bool dc_validate_seamless_boot_timing(const struct dc 
*dc,
if (!link->link_enc->funcs->is_dig_enabled(link->link_enc))
return false;
 
-   /* Check for FEC status*/
-   if (link->link_enc->funcs->fec_is_active(link->link_enc))
-   return false;
-
enc_inst = link->link_enc->funcs->get_dig_frontend(link->link_enc);
 
if (enc_inst == ENGINE_ID_UNKNOWN)
-- 
2.35.1



[PATCH AUTOSEL 5.17 36/49] drm/amd/display: Enable power gating before init_pipes

2022-04-11 Thread Sasha Levin
From: Roman Li 

[ Upstream commit 58e16c752e9540b28a873c44c3bee83e022007c1 ]

[Why]
In init_hw() we call init_pipes() before enabling power gating.
init_pipes() tries to power gate dsc but it may fail because
required force-ons are not released yet.
As a result with dsc config the following errors observed on resume:
"REG_WAIT timeout 1us * 1000 tries - dcn20_dsc_pg_control"
"REG_WAIT timeout 1us * 1000 tries - dcn20_dpp_pg_control"
"REG_WAIT timeout 1us * 1000 tries - dcn20_hubp_pg_control"

[How]
Move enable_power_gating_plane() before init_pipes() in init_hw()

Reviewed-by: Anthony Koo 
Reviewed-by: Eric Yang 
Acked-by: Alex Hung 
Signed-off-by: Roman Li 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 5 +++--
 drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c| 5 +++--
 drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c| 5 +++--
 3 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c 
b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
index 530a72e3eefe..39d5ceb9a373 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
@@ -1508,6 +1508,9 @@ void dcn10_init_hw(struct dc *dc)
if (dc->config.power_down_display_on_boot)
dc_link_blank_all_dp_displays(dc);
 
+   if (hws->funcs.enable_power_gating_plane)
+   hws->funcs.enable_power_gating_plane(dc->hwseq, true);
+
/* If taking control over from VBIOS, we may want to optimize our first
 * mode set, so we need to skip powering down pipes until we know which
 * pipes we want to use.
@@ -1560,8 +1563,6 @@ void dcn10_init_hw(struct dc *dc)
 
REG_UPDATE(DCFCLK_CNTL, DCFCLK_GATE_DIS, 0);
}
-   if (hws->funcs.enable_power_gating_plane)
-   hws->funcs.enable_power_gating_plane(dc->hwseq, true);
 
if (dc->clk_mgr->funcs->notify_wm_ranges)
dc->clk_mgr->funcs->notify_wm_ranges(dc->clk_mgr);
diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c 
b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
index 1db1ca19411d..05dc0a3ae2a3 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
@@ -548,6 +548,9 @@ void dcn30_init_hw(struct dc *dc)
if (dc->config.power_down_display_on_boot)
dc_link_blank_all_dp_displays(dc);
 
+   if (hws->funcs.enable_power_gating_plane)
+   hws->funcs.enable_power_gating_plane(dc->hwseq, true);
+
/* If taking control over from VBIOS, we may want to optimize our first
 * mode set, so we need to skip powering down pipes until we know which
 * pipes we want to use.
@@ -625,8 +628,6 @@ void dcn30_init_hw(struct dc *dc)
 
REG_UPDATE(DCFCLK_CNTL, DCFCLK_GATE_DIS, 0);
}
-   if (hws->funcs.enable_power_gating_plane)
-   hws->funcs.enable_power_gating_plane(dc->hwseq, true);
 
if (!dcb->funcs->is_accelerated_mode(dcb) && 
dc->res_pool->hubbub->funcs->init_watermarks)

dc->res_pool->hubbub->funcs->init_watermarks(dc->res_pool->hubbub);
diff --git a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c 
b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c
index 4206ce5bf9a9..1d2682104670 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c
@@ -200,6 +200,9 @@ void dcn31_init_hw(struct dc *dc)
if (dc->config.power_down_display_on_boot)
dc_link_blank_all_dp_displays(dc);
 
+   if (hws->funcs.enable_power_gating_plane)
+   hws->funcs.enable_power_gating_plane(dc->hwseq, true);
+
/* If taking control over from VBIOS, we may want to optimize our first
 * mode set, so we need to skip powering down pipes until we know which
 * pipes we want to use.
@@ -249,8 +252,6 @@ void dcn31_init_hw(struct dc *dc)
 
REG_UPDATE(DCFCLK_CNTL, DCFCLK_GATE_DIS, 0);
}
-   if (hws->funcs.enable_power_gating_plane)
-   hws->funcs.enable_power_gating_plane(dc->hwseq, true);
 
if (!dcb->funcs->is_accelerated_mode(dcb) && 
dc->res_pool->hubbub->funcs->init_watermarks)

dc->res_pool->hubbub->funcs->init_watermarks(dc->res_pool->hubbub);
-- 
2.35.1



[PATCH AUTOSEL 5.17 35/49] drm/amd/display: Correct Slice reset calculation

2022-04-11 Thread Sasha Levin
From: Chris Park 

[ Upstream commit 862a876c3a6372f2fa9d0c6510f1976ac94fc857 ]

[Why]
Once DSC slice cannot fit pixel clock, we incorrectly
reset min slices to 0 and allow max slice to operate,
even when max slice itself cannot fit the pixel clock
properly.

[How]
Change the sequence such that we correctly determine
DSC is not possible when both min slices and max
slices cannot fit pixel clock per slice.

Reviewed-by: Wenjing Liu 
Acked-by: Alex Hung 
Signed-off-by: Chris Park 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c 
b/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c
index 9c74564cbd8d..8973d3a38f9c 100644
--- a/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c
+++ b/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c
@@ -864,11 +864,11 @@ static bool setup_dsc_config(
min_slices_h = inc_num_slices(dsc_common_caps.slice_caps, 
min_slices_h);
}
 
+   is_dsc_possible = (min_slices_h <= max_slices_h);
+
if (pic_width % min_slices_h != 0)
min_slices_h = 0; // DSC TODO: Maybe try increasing the number 
of slices first?
 
-   is_dsc_possible = (min_slices_h <= max_slices_h);
-
if (min_slices_h == 0 && max_slices_h == 0)
is_dsc_possible = false;
 
-- 
2.35.1



[PATCH AUTOSEL 5.17 24/49] gpu: ipu-v3: Fix dev_dbg frequency output

2022-04-11 Thread Sasha Levin
From: Leo Ruan 

[ Upstream commit 070a88fd4a03f921b73a2059e97d55faaa447dab ]

This commit corrects the printing of the IPU clock error percentage if
it is between -0.1% to -0.9%. For example, if the pixel clock requested
is 27.2 MHz but only 27.0 MHz can be achieved the deviation is -0.8%.
But the fixed point math had a flaw and calculated error of 0.2%.

Before:
  Clocks: IPU 27000Hz DI 24716667Hz Needed 2720Hz
  IPU clock can give 2700 with divider 10, error 0.2%
  Want 2720Hz IPU 27000Hz DI 24716667Hz using IPU, 2700Hz

After:
  Clocks: IPU 27000Hz DI 24716667Hz Needed 2720Hz
  IPU clock can give 2700 with divider 10, error -0.8%
  Want 2720Hz IPU 27000Hz DI 24716667Hz using IPU, 2700Hz

Signed-off-by: Leo Ruan 
Signed-off-by: Mark Jonas 
Reviewed-by: Philipp Zabel 
Signed-off-by: Philipp Zabel 
Link: https://lore.kernel.org/r/20220207151411.5009-1-mark.jo...@de.bosch.com
Signed-off-by: Sasha Levin 
---
 drivers/gpu/ipu-v3/ipu-di.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-di.c b/drivers/gpu/ipu-v3/ipu-di.c
index 666223c6bec4..0a34e0ab4fe6 100644
--- a/drivers/gpu/ipu-v3/ipu-di.c
+++ b/drivers/gpu/ipu-v3/ipu-di.c
@@ -447,8 +447,9 @@ static void ipu_di_config_clock(struct ipu_di *di,
 
error = rate / (sig->mode.pixelclock / 1000);
 
-   dev_dbg(di->ipu->dev, "  IPU clock can give %lu with divider 
%u, error %d.%u%%\n",
-   rate, div, (signed)(error - 1000) / 10, error % 10);
+   dev_dbg(di->ipu->dev, "  IPU clock can give %lu with divider 
%u, error %c%d.%d%%\n",
+   rate, div, error < 1000 ? '-' : '+',
+   abs(error - 1000) / 10, abs(error - 1000) % 10);
 
/* Allow a 1% error */
if (error < 1010 && error >= 990) {
-- 
2.35.1



[PATCH AUTOSEL 5.17 12/49] drm/amdkfd: Check for potential null return of kmalloc_array()

2022-04-11 Thread Sasha Levin
From: QintaoShen 

[ Upstream commit ebbb7bb9e80305820dc2328a371c1b35679f2667 ]

As the kmalloc_array() may return null, the 'event_waiters[i].wait' would lead 
to null-pointer dereference.
Therefore, it is better to check the return value of kmalloc_array() to avoid 
this confusion.

Signed-off-by: QintaoShen 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdkfd/kfd_events.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_events.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
index afe72dd11325..6ca7e12bdab8 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_events.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
@@ -531,6 +531,8 @@ static struct kfd_event_waiter 
*alloc_event_waiters(uint32_t num_events)
event_waiters = kmalloc_array(num_events,
sizeof(struct kfd_event_waiter),
GFP_KERNEL);
+   if (!event_waiters)
+   return NULL;
 
for (i = 0; (event_waiters) && (i < num_events) ; i++) {
init_wait(_waiters[i].wait);
-- 
2.35.1



[PATCH AUTOSEL 5.17 11/49] drm/amdgpu/vcn: improve vcn dpg stop procedure

2022-04-11 Thread Sasha Levin
From: Tianci Yin 

[ Upstream commit 6ea239adc2a712eb318f04f5c29b018ba65ea38a ]

Prior to disabling dpg, VCN need unpausing dpg mode, or VCN will hang in
S3 resuming.

Reviewed-by: James Zhu 
Signed-off-by: Tianci Yin 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
index da11ceba0698..2ae56b2ed318 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
@@ -1474,8 +1474,11 @@ static int vcn_v3_0_start_sriov(struct amdgpu_device 
*adev)
 
 static int vcn_v3_0_stop_dpg_mode(struct amdgpu_device *adev, int inst_idx)
 {
+   struct dpg_pause_state state = {.fw_based = VCN_DPG_STATE__UNPAUSE};
uint32_t tmp;
 
+   vcn_v3_0_pause_dpg_mode(adev, 0, );
+
/* Wait for power status to be 1 */
SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_POWER_STATUS, 1,
UVD_POWER_STATUS__UVD_POWER_STATUS_MASK);
-- 
2.35.1



[PATCH AUTOSEL 5.17 10/49] drm/amdkfd: Fix Incorrect VMIDs passed to HWS

2022-04-11 Thread Sasha Levin
From: Tushar Patel 

[ Upstream commit b7dfbd2e601f3fee545bc158feceba4f340fe7cf ]

Compute-only GPUs have more than 8 VMIDs allocated to KFD. Fix
this by passing correct number of VMIDs to HWS

v2: squash in warning fix (Alex)

Signed-off-by: Tushar Patel 
Reviewed-by: Felix Kuehling 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c |  2 +-
 drivers/gpu/drm/amd/amdkfd/kfd_device.c | 11 +++
 2 files changed, 4 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 0ead08ba58c2..7672790d8b6b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -686,7 +686,7 @@ MODULE_PARM_DESC(sched_policy,
  * Maximum number of processes that HWS can schedule concurrently. The maximum 
is the
  * number of VMIDs assigned to the HWS, which is also the default.
  */
-int hws_max_conc_proc = 8;
+int hws_max_conc_proc = -1;
 module_param(hws_max_conc_proc, int, 0444);
 MODULE_PARM_DESC(hws_max_conc_proc,
"Max # processes HWS can execute concurrently when sched_policy=0 (0 = 
no concurrency, #VMIDs for KFD = Maximum(default))");
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
index 2b65d0acae2c..2fdbe2f475e4 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
@@ -480,15 +480,10 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
}
 
/* Verify module parameters regarding mapped process number*/
-   if ((hws_max_conc_proc < 0)
-   || (hws_max_conc_proc > kfd->vm_info.vmid_num_kfd)) {
-   dev_err(kfd_device,
-   "hws_max_conc_proc %d must be between 0 and %d, use %d 
instead\n",
-   hws_max_conc_proc, kfd->vm_info.vmid_num_kfd,
-   kfd->vm_info.vmid_num_kfd);
+   if (hws_max_conc_proc >= 0)
+   kfd->max_proc_per_quantum = min((u32)hws_max_conc_proc, 
kfd->vm_info.vmid_num_kfd);
+   else
kfd->max_proc_per_quantum = kfd->vm_info.vmid_num_kfd;
-   } else
-   kfd->max_proc_per_quantum = hws_max_conc_proc;
 
/* calculate max size of mqds needed for queues */
size = max_num_of_queues_per_device *
-- 
2.35.1



[PATCH AUTOSEL 5.17 09/49] drm/amd/display: Update VTEM Infopacket definition

2022-04-11 Thread Sasha Levin
From: "Leo (Hanghong) Ma" 

[ Upstream commit c9fbf6435162ed5fb7201d1d4adf6585c6a8c327 ]

[Why & How]
The latest HDMI SPEC has updated the VTEM packet structure,
so change the VTEM Infopacket defined in the driver side to align
with the SPEC.

Reviewed-by: Chris Park 
Acked-by: Alex Hung 
Signed-off-by: Leo (Hanghong) Ma 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 .../gpu/drm/amd/display/modules/info_packet/info_packet.c| 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c 
b/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
index 57f198de5e2c..4e075b01d48b 100644
--- a/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
+++ b/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
@@ -100,7 +100,8 @@ enum vsc_packet_revision {
 //PB7 = MD0
 #define MASK_VTEM_MD0__VRR_EN 0x01
 #define MASK_VTEM_MD0__M_CONST0x02
-#define MASK_VTEM_MD0__RESERVED2  0x0C
+#define MASK_VTEM_MD0__QMS_EN 0x04
+#define MASK_VTEM_MD0__RESERVED2  0x08
 #define MASK_VTEM_MD0__FVA_FACTOR_M1  0xF0
 
 //MD1
@@ -109,7 +110,7 @@ enum vsc_packet_revision {
 //MD2
 #define MASK_VTEM_MD2__BASE_REFRESH_RATE_98  0x03
 #define MASK_VTEM_MD2__RB0x04
-#define MASK_VTEM_MD2__RESERVED3 0xF8
+#define MASK_VTEM_MD2__NEXT_TFR  0xF8
 
 //MD3
 #define MASK_VTEM_MD3__BASE_REFRESH_RATE_07  0xFF
-- 
2.35.1



[PATCH AUTOSEL 5.17 08/49] drm/amd/display: FEC check in timing validation

2022-04-11 Thread Sasha Levin
From: Chiawen Huang 

[ Upstream commit 7d56a154e22ffb3613fdebf83ec34d5225a22993 ]

[Why]
disable/enable leads FEC mismatch between hw/sw FEC state.

[How]
check FEC status to fastboot on/off.

Reviewed-by: Anthony Koo 
Acked-by: Alex Hung 
Signed-off-by: Chiawen Huang 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/core/dc.c | 4 
 1 file changed, 4 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index ba1aa994db4b..a62711d71d0e 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -1493,6 +1493,10 @@ bool dc_validate_seamless_boot_timing(const struct dc 
*dc,
if (!link->link_enc->funcs->is_dig_enabled(link->link_enc))
return false;
 
+   /* Check for FEC status*/
+   if (link->link_enc->funcs->fec_is_active(link->link_enc))
+   return false;
+
enc_inst = link->link_enc->funcs->get_dig_frontend(link->link_enc);
 
if (enc_inst == ENGINE_ID_UNKNOWN)
-- 
2.35.1



[PATCH AUTOSEL 5.17 07/49] drm/amd/display: fix audio format not updated after edid updated

2022-04-11 Thread Sasha Levin
From: Charlene Liu 

[ Upstream commit 5e8a71cf13bc9184fee915b2220be71b4c6cac74 ]

[why]
for the case edid change only changed audio format.
driver still need to update stream.

Reviewed-by: Alvin Lee 
Reviewed-by: Aric Cyr 
Acked-by: Alex Hung 
Signed-off-by: Charlene Liu 
Tested-by: Daniel Wheeler 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
index 18757c158523..bb8a762cf8da 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
@@ -1664,8 +1664,8 @@ bool dc_is_stream_unchanged(
if (old_stream->ignore_msa_timing_param != 
stream->ignore_msa_timing_param)
return false;
 
-   // Only Have Audio left to check whether it is same or not. This is a 
corner case for Tiled sinks
-   if (old_stream->audio_info.mode_count != stream->audio_info.mode_count)
+   /*compare audio info*/
+   if (memcmp(_stream->audio_info, >audio_info, 
sizeof(stream->audio_info)) != 0)
return false;
 
return true;
-- 
2.35.1



[PATCH AUTOSEL 5.17 06/49] drm/amdgpu/gmc: use PCI BARs for APUs in passthrough

2022-04-11 Thread Sasha Levin
From: Alex Deucher 

[ Upstream commit b818a5d374542ccec73dcfe578a081574029820e ]

If the GPU is passed through to a guest VM, use the PCI
BAR for CPU FB access rather than the physical address of
carve out.  The physical address is not valid in a guest.

v2: Fix HDP handing as suggested by Michel

Reviewed-by: Christian König 
Reviewed-by: Michel Dänzer 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 4 ++--
 drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c | 2 +-
 drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c  | 5 +++--
 drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c  | 2 +-
 drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c  | 2 +-
 5 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index f18c698137a6..b590795c1bc4 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -5678,7 +5678,7 @@ void amdgpu_device_flush_hdp(struct amdgpu_device *adev,
struct amdgpu_ring *ring)
 {
 #ifdef CONFIG_X86_64
-   if (adev->flags & AMD_IS_APU)
+   if ((adev->flags & AMD_IS_APU) && !amdgpu_passthrough(adev))
return;
 #endif
if (adev->gmc.xgmi.connected_to_cpu)
@@ -5694,7 +5694,7 @@ void amdgpu_device_invalidate_hdp(struct amdgpu_device 
*adev,
struct amdgpu_ring *ring)
 {
 #ifdef CONFIG_X86_64
-   if (adev->flags & AMD_IS_APU)
+   if ((adev->flags & AMD_IS_APU) && !amdgpu_passthrough(adev))
return;
 #endif
if (adev->gmc.xgmi.connected_to_cpu)
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c 
b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
index a2f8ed0e6a64..f1b794d5d87d 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
@@ -788,7 +788,7 @@ static int gmc_v10_0_mc_init(struct amdgpu_device *adev)
adev->gmc.aper_size = pci_resource_len(adev->pdev, 0);
 
 #ifdef CONFIG_X86_64
-   if (adev->flags & AMD_IS_APU) {
+   if ((adev->flags & AMD_IS_APU) && !amdgpu_passthrough(adev)) {
adev->gmc.aper_base = 
adev->gfxhub.funcs->get_mc_fb_offset(adev);
adev->gmc.aper_size = adev->gmc.real_vram_size;
}
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c 
b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
index ab8adbff9e2d..5206e2da334a 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
@@ -381,8 +381,9 @@ static int gmc_v7_0_mc_init(struct amdgpu_device *adev)
adev->gmc.aper_size = pci_resource_len(adev->pdev, 0);
 
 #ifdef CONFIG_X86_64
-   if (adev->flags & AMD_IS_APU &&
-   adev->gmc.real_vram_size > adev->gmc.aper_size) {
+   if ((adev->flags & AMD_IS_APU) &&
+   adev->gmc.real_vram_size > adev->gmc.aper_size &&
+   !amdgpu_passthrough(adev)) {
adev->gmc.aper_base = ((u64)RREG32(mmMC_VM_FB_OFFSET)) << 22;
adev->gmc.aper_size = adev->gmc.real_vram_size;
}
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c 
b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
index 054733838292..d07d36786836 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
@@ -581,7 +581,7 @@ static int gmc_v8_0_mc_init(struct amdgpu_device *adev)
adev->gmc.aper_size = pci_resource_len(adev->pdev, 0);
 
 #ifdef CONFIG_X86_64
-   if (adev->flags & AMD_IS_APU) {
+   if ((adev->flags & AMD_IS_APU) && !amdgpu_passthrough(adev)) {
adev->gmc.aper_base = ((u64)RREG32(mmMC_VM_FB_OFFSET)) << 22;
adev->gmc.aper_size = adev->gmc.real_vram_size;
}
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c 
b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
index 34ee75cf7954..2fb24178eaef 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
@@ -1420,7 +1420,7 @@ static int gmc_v9_0_mc_init(struct amdgpu_device *adev)
 */
 
/* check whether both host-gpu and gpu-gpu xgmi links exist */
-   if ((adev->flags & AMD_IS_APU) ||
+   if (((adev->flags & AMD_IS_APU) && !amdgpu_passthrough(adev)) ||
(adev->gmc.xgmi.supported &&
 adev->gmc.xgmi.connected_to_cpu)) {
adev->gmc.aper_base =
-- 
2.35.1



[PATCH AUTOSEL 5.17 05/49] drm/amdgpu: conduct a proper cleanup of PDB bo

2022-04-11 Thread Sasha Levin
From: Guchun Chen 

[ Upstream commit 2d505453f38e18d42ba7d5428aaa17aaa7752c65 ]

Use amdgpu_bo_free_kernel instead of amdgpu_bo_unref to
perform a proper cleanup of PDB bo.

v2: update subject to be more accurate

Signed-off-by: Guchun Chen 
Reviewed-by: Christian König 
Signed-off-by: Alex Deucher 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c 
b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
index 88c1eb9ad068..34ee75cf7954 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
@@ -1684,7 +1684,7 @@ static int gmc_v9_0_sw_fini(void *handle)
amdgpu_gem_force_release(adev);
amdgpu_vm_manager_fini(adev);
amdgpu_gart_table_vram_free(adev);
-   amdgpu_bo_unref(>gmc.pdb0_bo);
+   amdgpu_bo_free_kernel(>gmc.pdb0_bo, NULL, >gmc.ptr_pdb0);
amdgpu_bo_fini(adev);
 
return 0;
-- 
2.35.1



  1   2   3   4   >