Commit e695bc7e authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-msm-fixes-2023-01-12' of https://gitlab.freedesktop.org/drm/msm into drm-fixes

msm-fixes for v6.3-rc4

Display Fixes:

- Fix the documentation for dpu_encoder_phys_wb_init() and
  dpu_encoder_phys_wb_setup_fb() APIs to address doc warnings
- Remove vcca-supply and vdds-supply as mandatory for 14nm PHY and
  10nm PHY DT schemas respectively as they are not present on some
  SOCs using these PHYs
- Add the dsi-phy-regulator-ldo-mode to dsi-phy-28nm.yaml as it was
  missed out during txt to yaml migration
- Remove operating-points-v2 and power-domain as a required property
  for the DSI controller as thats not the case for every SOC
- Fix the description from display escape clock to display core
  clock in the dsi controller yaml
- Fix the memory leak for mdp1-mem path for the cases when we return
  early after failing to get mdp0-mem ICC paths for msm
- Fix error handling path in msm_hdmi_dev_probe() to release the phy
  ref count when devm_pm_runtime_enable() fails
- Fix the dp_aux_isr() routine to make sure it doesnt incorrectly
  signal the aux transaction as complete if the ISR was not an AUX
  isr. This fixes a big hitter stability bug on chromebooks.
- Add protection against null pointer dereference when there is no
  kms object as in the case of headless adreno GPU in the shutdown
  path.

GPU Fixes:

- a5xx: fix quirks to actually be a bitmask and not overwrite each
  other
- a6xx: fix gx halt sequence to avoid 1000ms hang on some devices
- kexec shutdown fix
- fix potential double free
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
From: Rob Clark <robdclark@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/CAF6AEGv7=in_MHW3kdkhqh7ZFoVCmnikmr29YYHCXR=7aOEneg@mail.gmail.com
parents 51883883 f4a75b59
...@@ -32,7 +32,7 @@ properties: ...@@ -32,7 +32,7 @@ properties:
- description: Display byte clock - description: Display byte clock
- description: Display byte interface clock - description: Display byte interface clock
- description: Display pixel clock - description: Display pixel clock
- description: Display escape clock - description: Display core clock
- description: Display AHB clock - description: Display AHB clock
- description: Display AXI clock - description: Display AXI clock
...@@ -137,8 +137,6 @@ required: ...@@ -137,8 +137,6 @@ required:
- phys - phys
- assigned-clocks - assigned-clocks
- assigned-clock-parents - assigned-clock-parents
- power-domains
- operating-points-v2
- ports - ports
additionalProperties: false additionalProperties: false
......
...@@ -69,7 +69,6 @@ required: ...@@ -69,7 +69,6 @@ required:
- compatible - compatible
- reg - reg
- reg-names - reg-names
- vdds-supply
unevaluatedProperties: false unevaluatedProperties: false
......
...@@ -39,7 +39,6 @@ required: ...@@ -39,7 +39,6 @@ required:
- compatible - compatible
- reg - reg
- reg-names - reg-names
- vcca-supply
unevaluatedProperties: false unevaluatedProperties: false
......
...@@ -34,6 +34,10 @@ properties: ...@@ -34,6 +34,10 @@ properties:
vddio-supply: vddio-supply:
description: Phandle to vdd-io regulator device node. description: Phandle to vdd-io regulator device node.
qcom,dsi-phy-regulator-ldo-mode:
type: boolean
description: Indicates if the LDO mode PHY regulator is wanted.
required: required:
- compatible - compatible
- reg - reg
......
...@@ -72,7 +72,7 @@ examples: ...@@ -72,7 +72,7 @@ examples:
#include <dt-bindings/interconnect/qcom,qcm2290.h> #include <dt-bindings/interconnect/qcom,qcm2290.h>
#include <dt-bindings/power/qcom-rpmpd.h> #include <dt-bindings/power/qcom-rpmpd.h>
mdss@5e00000 { display-subsystem@5e00000 {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <1>; #size-cells = <1>;
compatible = "qcom,qcm2290-mdss"; compatible = "qcom,qcm2290-mdss";
......
...@@ -62,7 +62,7 @@ examples: ...@@ -62,7 +62,7 @@ examples:
#include <dt-bindings/interrupt-controller/arm-gic.h> #include <dt-bindings/interrupt-controller/arm-gic.h>
#include <dt-bindings/power/qcom-rpmpd.h> #include <dt-bindings/power/qcom-rpmpd.h>
mdss@5e00000 { display-subsystem@5e00000 {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <1>; #size-cells = <1>;
compatible = "qcom,sm6115-mdss"; compatible = "qcom,sm6115-mdss";
......
...@@ -876,7 +876,8 @@ static void a6xx_gmu_rpmh_off(struct a6xx_gmu *gmu) ...@@ -876,7 +876,8 @@ static void a6xx_gmu_rpmh_off(struct a6xx_gmu *gmu)
#define GBIF_CLIENT_HALT_MASK BIT(0) #define GBIF_CLIENT_HALT_MASK BIT(0)
#define GBIF_ARB_HALT_MASK BIT(1) #define GBIF_ARB_HALT_MASK BIT(1)
static void a6xx_bus_clear_pending_transactions(struct adreno_gpu *adreno_gpu) static void a6xx_bus_clear_pending_transactions(struct adreno_gpu *adreno_gpu,
bool gx_off)
{ {
struct msm_gpu *gpu = &adreno_gpu->base; struct msm_gpu *gpu = &adreno_gpu->base;
...@@ -889,9 +890,11 @@ static void a6xx_bus_clear_pending_transactions(struct adreno_gpu *adreno_gpu) ...@@ -889,9 +890,11 @@ static void a6xx_bus_clear_pending_transactions(struct adreno_gpu *adreno_gpu)
return; return;
} }
/* Halt the gx side of GBIF */ if (gx_off) {
gpu_write(gpu, REG_A6XX_RBBM_GBIF_HALT, 1); /* Halt the gx side of GBIF */
spin_until(gpu_read(gpu, REG_A6XX_RBBM_GBIF_HALT_ACK) & 1); gpu_write(gpu, REG_A6XX_RBBM_GBIF_HALT, 1);
spin_until(gpu_read(gpu, REG_A6XX_RBBM_GBIF_HALT_ACK) & 1);
}
/* Halt new client requests on GBIF */ /* Halt new client requests on GBIF */
gpu_write(gpu, REG_A6XX_GBIF_HALT, GBIF_CLIENT_HALT_MASK); gpu_write(gpu, REG_A6XX_GBIF_HALT, GBIF_CLIENT_HALT_MASK);
...@@ -929,7 +932,7 @@ static void a6xx_gmu_force_off(struct a6xx_gmu *gmu) ...@@ -929,7 +932,7 @@ static void a6xx_gmu_force_off(struct a6xx_gmu *gmu)
/* Halt the gmu cm3 core */ /* Halt the gmu cm3 core */
gmu_write(gmu, REG_A6XX_GMU_CM3_SYSRESET, 1); gmu_write(gmu, REG_A6XX_GMU_CM3_SYSRESET, 1);
a6xx_bus_clear_pending_transactions(adreno_gpu); a6xx_bus_clear_pending_transactions(adreno_gpu, true);
/* Reset GPU core blocks */ /* Reset GPU core blocks */
gpu_write(gpu, REG_A6XX_RBBM_SW_RESET_CMD, 1); gpu_write(gpu, REG_A6XX_RBBM_SW_RESET_CMD, 1);
...@@ -1083,7 +1086,7 @@ static void a6xx_gmu_shutdown(struct a6xx_gmu *gmu) ...@@ -1083,7 +1086,7 @@ static void a6xx_gmu_shutdown(struct a6xx_gmu *gmu)
return; return;
} }
a6xx_bus_clear_pending_transactions(adreno_gpu); a6xx_bus_clear_pending_transactions(adreno_gpu, a6xx_gpu->hung);
/* tell the GMU we want to slumber */ /* tell the GMU we want to slumber */
ret = a6xx_gmu_notify_slumber(gmu); ret = a6xx_gmu_notify_slumber(gmu);
......
...@@ -1270,6 +1270,12 @@ static void a6xx_recover(struct msm_gpu *gpu) ...@@ -1270,6 +1270,12 @@ static void a6xx_recover(struct msm_gpu *gpu)
if (hang_debug) if (hang_debug)
a6xx_dump(gpu); a6xx_dump(gpu);
/*
* To handle recovery specific sequences during the rpm suspend we are
* about to trigger
*/
a6xx_gpu->hung = true;
/* Halt SQE first */ /* Halt SQE first */
gpu_write(gpu, REG_A6XX_CP_SQE_CNTL, 3); gpu_write(gpu, REG_A6XX_CP_SQE_CNTL, 3);
...@@ -1312,6 +1318,7 @@ static void a6xx_recover(struct msm_gpu *gpu) ...@@ -1312,6 +1318,7 @@ static void a6xx_recover(struct msm_gpu *gpu)
mutex_unlock(&gpu->active_lock); mutex_unlock(&gpu->active_lock);
msm_gpu_hw_init(gpu); msm_gpu_hw_init(gpu);
a6xx_gpu->hung = false;
} }
static const char *a6xx_uche_fault_block(struct msm_gpu *gpu, u32 mid) static const char *a6xx_uche_fault_block(struct msm_gpu *gpu, u32 mid)
......
...@@ -32,6 +32,7 @@ struct a6xx_gpu { ...@@ -32,6 +32,7 @@ struct a6xx_gpu {
void *llc_slice; void *llc_slice;
void *htw_llc_slice; void *htw_llc_slice;
bool have_mmu500; bool have_mmu500;
bool hung;
}; };
#define to_a6xx_gpu(x) container_of(x, struct a6xx_gpu, base) #define to_a6xx_gpu(x) container_of(x, struct a6xx_gpu, base)
......
...@@ -29,11 +29,9 @@ enum { ...@@ -29,11 +29,9 @@ enum {
ADRENO_FW_MAX, ADRENO_FW_MAX,
}; };
enum adreno_quirks { #define ADRENO_QUIRK_TWO_PASS_USE_WFI BIT(0)
ADRENO_QUIRK_TWO_PASS_USE_WFI = 1, #define ADRENO_QUIRK_FAULT_DETECT_MASK BIT(1)
ADRENO_QUIRK_FAULT_DETECT_MASK = 2, #define ADRENO_QUIRK_LMLOADKILL_DISABLE BIT(2)
ADRENO_QUIRK_LMLOADKILL_DISABLE = 3,
};
struct adreno_rev { struct adreno_rev {
uint8_t core; uint8_t core;
...@@ -65,7 +63,7 @@ struct adreno_info { ...@@ -65,7 +63,7 @@ struct adreno_info {
const char *name; const char *name;
const char *fw[ADRENO_FW_MAX]; const char *fw[ADRENO_FW_MAX];
uint32_t gmem; uint32_t gmem;
enum adreno_quirks quirks; u64 quirks;
struct msm_gpu *(*init)(struct drm_device *dev); struct msm_gpu *(*init)(struct drm_device *dev);
const char *zapfw; const char *zapfw;
u32 inactive_period; u32 inactive_period;
......
...@@ -132,7 +132,6 @@ static void dpu_encoder_phys_wb_set_qos(struct dpu_encoder_phys *phys_enc) ...@@ -132,7 +132,6 @@ static void dpu_encoder_phys_wb_set_qos(struct dpu_encoder_phys *phys_enc)
* dpu_encoder_phys_wb_setup_fb - setup output framebuffer * dpu_encoder_phys_wb_setup_fb - setup output framebuffer
* @phys_enc: Pointer to physical encoder * @phys_enc: Pointer to physical encoder
* @fb: Pointer to output framebuffer * @fb: Pointer to output framebuffer
* @wb_roi: Pointer to output region of interest
*/ */
static void dpu_encoder_phys_wb_setup_fb(struct dpu_encoder_phys *phys_enc, static void dpu_encoder_phys_wb_setup_fb(struct dpu_encoder_phys *phys_enc,
struct drm_framebuffer *fb) struct drm_framebuffer *fb)
...@@ -692,7 +691,7 @@ static void dpu_encoder_phys_wb_init_ops(struct dpu_encoder_phys_ops *ops) ...@@ -692,7 +691,7 @@ static void dpu_encoder_phys_wb_init_ops(struct dpu_encoder_phys_ops *ops)
/** /**
* dpu_encoder_phys_wb_init - initialize writeback encoder * dpu_encoder_phys_wb_init - initialize writeback encoder
* @init: Pointer to init info structure with initialization params * @p: Pointer to init info structure with initialization params
*/ */
struct dpu_encoder_phys *dpu_encoder_phys_wb_init( struct dpu_encoder_phys *dpu_encoder_phys_wb_init(
struct dpu_enc_phys_init_params *p) struct dpu_enc_phys_init_params *p)
......
...@@ -423,6 +423,10 @@ void dp_aux_isr(struct drm_dp_aux *dp_aux) ...@@ -423,6 +423,10 @@ void dp_aux_isr(struct drm_dp_aux *dp_aux)
isr = dp_catalog_aux_get_irq(aux->catalog); isr = dp_catalog_aux_get_irq(aux->catalog);
/* no interrupts pending, return immediately */
if (!isr)
return;
if (!aux->cmd_busy) if (!aux->cmd_busy)
return; return;
......
...@@ -532,11 +532,19 @@ static int msm_hdmi_dev_probe(struct platform_device *pdev) ...@@ -532,11 +532,19 @@ static int msm_hdmi_dev_probe(struct platform_device *pdev)
ret = devm_pm_runtime_enable(&pdev->dev); ret = devm_pm_runtime_enable(&pdev->dev);
if (ret) if (ret)
return ret; goto err_put_phy;
platform_set_drvdata(pdev, hdmi); platform_set_drvdata(pdev, hdmi);
return component_add(&pdev->dev, &msm_hdmi_ops); ret = component_add(&pdev->dev, &msm_hdmi_ops);
if (ret)
goto err_put_phy;
return 0;
err_put_phy:
msm_hdmi_put_phy(hdmi);
return ret;
} }
static int msm_hdmi_dev_remove(struct platform_device *pdev) static int msm_hdmi_dev_remove(struct platform_device *pdev)
......
...@@ -1278,7 +1278,7 @@ void msm_drv_shutdown(struct platform_device *pdev) ...@@ -1278,7 +1278,7 @@ void msm_drv_shutdown(struct platform_device *pdev)
* msm_drm_init, drm_dev->registered is used as an indicator that the * msm_drm_init, drm_dev->registered is used as an indicator that the
* shutdown will be successful. * shutdown will be successful.
*/ */
if (drm && drm->registered) if (drm && drm->registered && priv->kms)
drm_atomic_helper_shutdown(drm); drm_atomic_helper_shutdown(drm);
} }
......
...@@ -47,15 +47,17 @@ struct msm_mdss { ...@@ -47,15 +47,17 @@ struct msm_mdss {
static int msm_mdss_parse_data_bus_icc_path(struct device *dev, static int msm_mdss_parse_data_bus_icc_path(struct device *dev,
struct msm_mdss *msm_mdss) struct msm_mdss *msm_mdss)
{ {
struct icc_path *path0 = of_icc_get(dev, "mdp0-mem"); struct icc_path *path0;
struct icc_path *path1 = of_icc_get(dev, "mdp1-mem"); struct icc_path *path1;
path0 = of_icc_get(dev, "mdp0-mem");
if (IS_ERR_OR_NULL(path0)) if (IS_ERR_OR_NULL(path0))
return PTR_ERR_OR_ZERO(path0); return PTR_ERR_OR_ZERO(path0);
msm_mdss->path[0] = path0; msm_mdss->path[0] = path0;
msm_mdss->num_paths = 1; msm_mdss->num_paths = 1;
path1 = of_icc_get(dev, "mdp1-mem");
if (!IS_ERR_OR_NULL(path1)) { if (!IS_ERR_OR_NULL(path1)) {
msm_mdss->path[1] = path1; msm_mdss->path[1] = path1;
msm_mdss->num_paths++; msm_mdss->num_paths++;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment