5.19 fixes for msm-next
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJil/W4AAoJEJMTUIYYBUIppm4H/1lqhAzQhbMSM8TDA5LUI2+2 e09mvq7KsZo30uHazCRwnci8AahDWFenfQ78LVOosQHGSXtSYpsgVs0czMWXvRlE fPNlo75eAwPENNzux2Uo1K3uT32N0oeia0yYJqTzYuZg0Lmkx2cDPd4alUokXqaK 8J+6xJsY2d3YM0xl5gIFmM9gifd+jGFYrVsiEY8Dwr59zkdmoMD9/QIi5ZsWXH7G LCJA6NUqr31TLrGA7hV/GAME9IFjxNWNotYLjxsoAUn5FPhwHY7EeJsloLJEl4HP UCDJ47SfLfvYjUHeBXvUDbzTD2FPpWuDhharEqyLtStcVQjnpJCOZOO2e52qqMo= =PgRN -----END PGP SIGNATURE----- Merge tag 'msm-next-5.19-fixes-06-01' of https://gitlab.freedesktop.org/abhinavk/msm into drm-next 5.19 fixes for msm-next - Fix to add minimum ICC vote in the msm_mdss pm_resume path to address bootup splats - Fix to avoid dereferencing without checking in WB encoder - Fix to avoid crash during suspend in DP driver by ensuring interrupt mask bits are updated - Remove unused code from dpu_encoder_virt_atomic_check() - Fix to remove redundant init of dsc variable Signed-off-by: Dave Airlie <airlied@redhat.com> From: Abhinav Kumar <quic_abhinavk@quicinc.com> Link: https://patchwork.freedesktop.org/patch/msgid/927b201e-a734-a29d-b9fb-b9889e1f7795@quicinc.com
This commit is contained in:
Коммит
b8042ff4fa
|
@ -541,7 +541,6 @@ static int dpu_encoder_virt_atomic_check(
|
|||
struct dpu_encoder_virt *dpu_enc;
|
||||
struct msm_drm_private *priv;
|
||||
struct dpu_kms *dpu_kms;
|
||||
const struct drm_display_mode *mode;
|
||||
struct drm_display_mode *adj_mode;
|
||||
struct msm_display_topology topology;
|
||||
struct dpu_global_state *global_state;
|
||||
|
@ -559,7 +558,6 @@ static int dpu_encoder_virt_atomic_check(
|
|||
|
||||
priv = drm_enc->dev->dev_private;
|
||||
dpu_kms = to_dpu_kms(priv->kms);
|
||||
mode = &crtc_state->mode;
|
||||
adj_mode = &crtc_state->adjusted_mode;
|
||||
global_state = dpu_kms_get_global_state(crtc_state->state);
|
||||
if (IS_ERR(global_state))
|
||||
|
@ -1814,7 +1812,6 @@ static void dpu_encoder_prep_dsc(struct dpu_encoder_virt *dpu_enc,
|
|||
}
|
||||
}
|
||||
|
||||
dsc_common_mode = 0;
|
||||
pic_width = dsc->drm->pic_width;
|
||||
|
||||
dsc_common_mode = DSC_MODE_MULTIPLEX | DSC_MODE_SPLIT_PANEL;
|
||||
|
|
|
@ -574,11 +574,11 @@ static void dpu_encoder_phys_wb_disable(struct dpu_encoder_phys *phys_enc)
|
|||
*/
|
||||
static void dpu_encoder_phys_wb_destroy(struct dpu_encoder_phys *phys_enc)
|
||||
{
|
||||
DPU_DEBUG("[wb:%d]\n", phys_enc->wb_idx - WB_0);
|
||||
|
||||
if (!phys_enc)
|
||||
return;
|
||||
|
||||
DPU_DEBUG("[wb:%d]\n", phys_enc->wb_idx - WB_0);
|
||||
|
||||
kfree(phys_enc);
|
||||
}
|
||||
|
||||
|
|
|
@ -49,8 +49,6 @@
|
|||
#define DPU_DEBUGFS_DIR "msm_dpu"
|
||||
#define DPU_DEBUGFS_HWMASKNAME "hw_log_mask"
|
||||
|
||||
#define MIN_IB_BW 400000000ULL /* Min ib vote 400MB */
|
||||
|
||||
static int dpu_kms_hw_init(struct msm_kms *kms);
|
||||
static void _dpu_kms_mmu_destroy(struct dpu_kms *dpu_kms);
|
||||
|
||||
|
@ -1305,15 +1303,9 @@ static int __maybe_unused dpu_runtime_resume(struct device *dev)
|
|||
struct dpu_kms *dpu_kms = to_dpu_kms(priv->kms);
|
||||
struct drm_encoder *encoder;
|
||||
struct drm_device *ddev;
|
||||
int i;
|
||||
|
||||
ddev = dpu_kms->dev;
|
||||
|
||||
WARN_ON(!(dpu_kms->num_paths));
|
||||
/* Min vote of BW is required before turning on AXI clk */
|
||||
for (i = 0; i < dpu_kms->num_paths; i++)
|
||||
icc_set_bw(dpu_kms->path[i], 0, Bps_to_icc(MIN_IB_BW));
|
||||
|
||||
rc = clk_bulk_prepare_enable(dpu_kms->num_clocks, dpu_kms->clocks);
|
||||
if (rc) {
|
||||
DPU_ERROR("clock enable failed rc:%d\n", rc);
|
||||
|
|
|
@ -1390,8 +1390,13 @@ void dp_ctrl_reset_irq_ctrl(struct dp_ctrl *dp_ctrl, bool enable)
|
|||
|
||||
dp_catalog_ctrl_reset(ctrl->catalog);
|
||||
|
||||
if (enable)
|
||||
dp_catalog_ctrl_enable_irq(ctrl->catalog, enable);
|
||||
/*
|
||||
* all dp controller programmable registers will not
|
||||
* be reset to default value after DP_SW_RESET
|
||||
* therefore interrupt mask bits have to be updated
|
||||
* to enable/disable interrupts
|
||||
*/
|
||||
dp_catalog_ctrl_enable_irq(ctrl->catalog, enable);
|
||||
}
|
||||
|
||||
void dp_ctrl_phy_init(struct dp_ctrl *dp_ctrl)
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/interconnect.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/irqchip.h>
|
||||
#include <linux/irqdesc.h>
|
||||
|
@ -25,6 +26,8 @@
|
|||
#define UBWC_CTRL_2 0x150
|
||||
#define UBWC_PREDICTION_MODE 0x154
|
||||
|
||||
#define MIN_IB_BW 400000000UL /* Min ib vote 400MB */
|
||||
|
||||
struct msm_mdss {
|
||||
struct device *dev;
|
||||
|
||||
|
@ -36,8 +39,47 @@ struct msm_mdss {
|
|||
unsigned long enabled_mask;
|
||||
struct irq_domain *domain;
|
||||
} irq_controller;
|
||||
struct icc_path *path[2];
|
||||
u32 num_paths;
|
||||
};
|
||||
|
||||
static int msm_mdss_parse_data_bus_icc_path(struct device *dev,
|
||||
struct msm_mdss *msm_mdss)
|
||||
{
|
||||
struct icc_path *path0 = of_icc_get(dev, "mdp0-mem");
|
||||
struct icc_path *path1 = of_icc_get(dev, "mdp1-mem");
|
||||
|
||||
if (IS_ERR_OR_NULL(path0))
|
||||
return PTR_ERR_OR_ZERO(path0);
|
||||
|
||||
msm_mdss->path[0] = path0;
|
||||
msm_mdss->num_paths = 1;
|
||||
|
||||
if (!IS_ERR_OR_NULL(path1)) {
|
||||
msm_mdss->path[1] = path1;
|
||||
msm_mdss->num_paths++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void msm_mdss_put_icc_path(void *data)
|
||||
{
|
||||
struct msm_mdss *msm_mdss = data;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < msm_mdss->num_paths; i++)
|
||||
icc_put(msm_mdss->path[i]);
|
||||
}
|
||||
|
||||
static void msm_mdss_icc_request_bw(struct msm_mdss *msm_mdss, unsigned long bw)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < msm_mdss->num_paths; i++)
|
||||
icc_set_bw(msm_mdss->path[i], 0, Bps_to_icc(bw));
|
||||
}
|
||||
|
||||
static void msm_mdss_irq(struct irq_desc *desc)
|
||||
{
|
||||
struct msm_mdss *msm_mdss = irq_desc_get_handler_data(desc);
|
||||
|
@ -136,6 +178,13 @@ static int msm_mdss_enable(struct msm_mdss *msm_mdss)
|
|||
{
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* Several components have AXI clocks that can only be turned on if
|
||||
* the interconnect is enabled (non-zero bandwidth). Let's make sure
|
||||
* that the interconnects are at least at a minimum amount.
|
||||
*/
|
||||
msm_mdss_icc_request_bw(msm_mdss, MIN_IB_BW);
|
||||
|
||||
ret = clk_bulk_prepare_enable(msm_mdss->num_clocks, msm_mdss->clocks);
|
||||
if (ret) {
|
||||
dev_err(msm_mdss->dev, "clock enable failed, ret:%d\n", ret);
|
||||
|
@ -178,6 +227,7 @@ static int msm_mdss_enable(struct msm_mdss *msm_mdss)
|
|||
static int msm_mdss_disable(struct msm_mdss *msm_mdss)
|
||||
{
|
||||
clk_bulk_disable_unprepare(msm_mdss->num_clocks, msm_mdss->clocks);
|
||||
msm_mdss_icc_request_bw(msm_mdss, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -271,6 +321,13 @@ static struct msm_mdss *msm_mdss_init(struct platform_device *pdev, bool is_mdp5
|
|||
|
||||
dev_dbg(&pdev->dev, "mapped mdss address space @%pK\n", msm_mdss->mmio);
|
||||
|
||||
ret = msm_mdss_parse_data_bus_icc_path(&pdev->dev, msm_mdss);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
ret = devm_add_action_or_reset(&pdev->dev, msm_mdss_put_icc_path, msm_mdss);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
if (is_mdp5)
|
||||
ret = mdp5_mdss_parse_clock(pdev, &msm_mdss->clocks);
|
||||
else
|
||||
|
|
Загрузка…
Ссылка в новой задаче