summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/arm/boot/dts/qcom/sdm660-common.dtsi2
-rw-r--r--arch/arm64/configs/msmcortex-perf_defconfig2
-rw-r--r--arch/arm64/configs/msmcortex_defconfig2
-rw-r--r--drivers/net/wireless/wcnss/wcnss_wlan.c87
-rw-r--r--drivers/platform/msm/msm_11ad/msm_11ad.c19
-rw-r--r--drivers/soc/qcom/glink_smem_native_xprt.c3
-rw-r--r--drivers/soc/qcom/spcom.c12
-rw-r--r--drivers/video/fbdev/msm/mdss_compat_utils.c1
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp.h28
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_ctl.c20
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_pp.c164
-rw-r--r--drivers/video/fbdev/msm/msm_mdss_io_8974.c9
-rw-r--r--fs/gfs2/acl.c5
-rw-r--r--fs/xfs/xfs_acl.c4
14 files changed, 249 insertions, 109 deletions
diff --git a/arch/arm/boot/dts/qcom/sdm660-common.dtsi b/arch/arm/boot/dts/qcom/sdm660-common.dtsi
index 76130f177fad..f933586183ec 100644
--- a/arch/arm/boot/dts/qcom/sdm660-common.dtsi
+++ b/arch/arm/boot/dts/qcom/sdm660-common.dtsi
@@ -377,6 +377,8 @@
0x8f8 0x77 0x00
0x4fc 0x80 0x00
0x8fc 0x80 0x00
+ 0x564 0x00 0x00
+ 0x964 0x00 0x00
0x4c0 0x0a 0x00
0x8c0 0x0a 0x00
0x504 0x03 0x00
diff --git a/arch/arm64/configs/msmcortex-perf_defconfig b/arch/arm64/configs/msmcortex-perf_defconfig
index 2f468dfe1c5a..105c4017314e 100644
--- a/arch/arm64/configs/msmcortex-perf_defconfig
+++ b/arch/arm64/configs/msmcortex-perf_defconfig
@@ -7,6 +7,8 @@ CONFIG_HIGH_RES_TIMERS=y
CONFIG_IRQ_TIME_ACCOUNTING=y
CONFIG_RCU_EXPERT=y
CONFIG_RCU_FAST_NO_HZ=y
+CONFIG_RCU_NOCB_CPU=y
+CONFIG_RCU_NOCB_CPU_ALL=y
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_LOG_CPU_MAX_BUF_SHIFT=17
diff --git a/arch/arm64/configs/msmcortex_defconfig b/arch/arm64/configs/msmcortex_defconfig
index fdf8deacee17..af78c47df33d 100644
--- a/arch/arm64/configs/msmcortex_defconfig
+++ b/arch/arm64/configs/msmcortex_defconfig
@@ -6,6 +6,8 @@ CONFIG_HIGH_RES_TIMERS=y
CONFIG_IRQ_TIME_ACCOUNTING=y
CONFIG_RCU_EXPERT=y
CONFIG_RCU_FAST_NO_HZ=y
+CONFIG_RCU_NOCB_CPU=y
+CONFIG_RCU_NOCB_CPU_ALL=y
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_LOG_CPU_MAX_BUF_SHIFT=17
diff --git a/drivers/net/wireless/wcnss/wcnss_wlan.c b/drivers/net/wireless/wcnss/wcnss_wlan.c
index 9db2871e8150..450b7ad8bf7f 100644
--- a/drivers/net/wireless/wcnss/wcnss_wlan.c
+++ b/drivers/net/wireless/wcnss/wcnss_wlan.c
@@ -398,7 +398,6 @@ static struct {
int user_cal_available;
u32 user_cal_rcvd;
int user_cal_exp_size;
- int device_opened;
int iris_xo_mode_set;
int fw_vbatt_state;
char wlan_nv_macAddr[WLAN_MAC_ADDR_SIZE];
@@ -3265,14 +3264,6 @@ static int wcnss_node_open(struct inode *inode, struct file *file)
return -EFAULT;
}
- mutex_lock(&penv->dev_lock);
- penv->user_cal_rcvd = 0;
- penv->user_cal_read = 0;
- penv->user_cal_available = false;
- penv->user_cal_data = NULL;
- penv->device_opened = 1;
- mutex_unlock(&penv->dev_lock);
-
return rc;
}
@@ -3281,7 +3272,7 @@ static ssize_t wcnss_wlan_read(struct file *fp, char __user
{
int rc = 0;
- if (!penv || !penv->device_opened)
+ if (!penv)
return -EFAULT;
rc = wait_event_interruptible(penv->read_wait, penv->fw_cal_rcvd
@@ -3318,55 +3309,66 @@ static ssize_t wcnss_wlan_write(struct file *fp, const char __user
*user_buffer, size_t count, loff_t *position)
{
int rc = 0;
- u32 size = 0;
+ char *cal_data = NULL;
- if (!penv || !penv->device_opened || penv->user_cal_available)
+ if (!penv || penv->user_cal_available)
return -EFAULT;
- if (penv->user_cal_rcvd == 0 && count >= 4
- && !penv->user_cal_data) {
- rc = copy_from_user((void *)&size, user_buffer, 4);
- if (!size || size > MAX_CALIBRATED_DATA_SIZE) {
- pr_err(DEVICE " invalid size to write %d\n", size);
+ if (!penv->user_cal_rcvd && count >= 4 && !penv->user_cal_exp_size) {
+ mutex_lock(&penv->dev_lock);
+ rc = copy_from_user((void *)&penv->user_cal_exp_size,
+ user_buffer, 4);
+ if (!penv->user_cal_exp_size ||
+ penv->user_cal_exp_size > MAX_CALIBRATED_DATA_SIZE) {
+ pr_err(DEVICE " invalid size to write %d\n",
+ penv->user_cal_exp_size);
+ penv->user_cal_exp_size = 0;
+ mutex_unlock(&penv->dev_lock);
return -EFAULT;
}
-
- rc += count;
- count -= 4;
- penv->user_cal_exp_size = size;
- penv->user_cal_data = kmalloc(size, GFP_KERNEL);
- if (penv->user_cal_data == NULL) {
- pr_err(DEVICE " no memory to write\n");
- return -ENOMEM;
- }
- if (0 == count)
- goto exit;
-
- } else if (penv->user_cal_rcvd == 0 && count < 4)
+ mutex_unlock(&penv->dev_lock);
+ return count;
+ } else if (!penv->user_cal_rcvd && count < 4) {
return -EFAULT;
+ }
+ mutex_lock(&penv->dev_lock);
if ((UINT32_MAX - count < penv->user_cal_rcvd) ||
(penv->user_cal_exp_size < count + penv->user_cal_rcvd)) {
pr_err(DEVICE " invalid size to write %zu\n", count +
penv->user_cal_rcvd);
- rc = -ENOMEM;
- goto exit;
+ mutex_unlock(&penv->dev_lock);
+ return -ENOMEM;
}
- rc = copy_from_user((void *)penv->user_cal_data +
- penv->user_cal_rcvd, user_buffer, count);
- if (0 == rc) {
+
+ cal_data = kmalloc(count, GFP_KERNEL);
+ if (!cal_data) {
+ mutex_unlock(&penv->dev_lock);
+ return -ENOMEM;
+ }
+
+ rc = copy_from_user(cal_data, user_buffer, count);
+ if (!rc) {
+ memcpy(penv->user_cal_data + penv->user_cal_rcvd,
+ cal_data, count);
penv->user_cal_rcvd += count;
rc += count;
}
+
+ kfree(cal_data);
if (penv->user_cal_rcvd == penv->user_cal_exp_size) {
penv->user_cal_available = true;
pr_info_ratelimited("wcnss: user cal written");
}
+ mutex_unlock(&penv->dev_lock);
-exit:
return rc;
}
+static int wcnss_node_release(struct inode *inode, struct file *file)
+{
+ return 0;
+}
static int wcnss_notif_cb(struct notifier_block *this, unsigned long code,
void *ss_handle)
@@ -3425,6 +3427,7 @@ static const struct file_operations wcnss_node_fops = {
.open = wcnss_node_open,
.read = wcnss_wlan_read,
.write = wcnss_wlan_write,
+ .release = wcnss_node_release,
};
static struct miscdevice wcnss_misc = {
@@ -3452,6 +3455,13 @@ wcnss_wlan_probe(struct platform_device *pdev)
}
penv->pdev = pdev;
+ penv->user_cal_data =
+ devm_kzalloc(&pdev->dev, MAX_CALIBRATED_DATA_SIZE, GFP_KERNEL);
+ if (!penv->user_cal_data) {
+ dev_err(&pdev->dev, "Failed to alloc memory for cal data.\n");
+ return -ENOMEM;
+ }
+
/* register sysfs entries */
ret = wcnss_create_sysfs(&pdev->dev);
if (ret) {
@@ -3472,6 +3482,11 @@ wcnss_wlan_probe(struct platform_device *pdev)
mutex_init(&penv->pm_qos_mutex);
init_waitqueue_head(&penv->read_wait);
+ penv->user_cal_rcvd = 0;
+ penv->user_cal_read = 0;
+ penv->user_cal_exp_size = 0;
+ penv->user_cal_available = false;
+
/* Since we were built into the kernel we'll be called as part
* of kernel initialization. We don't know if userspace
* applications are available to service PIL at this time
diff --git a/drivers/platform/msm/msm_11ad/msm_11ad.c b/drivers/platform/msm/msm_11ad/msm_11ad.c
index e88f3d8c14d2..f1e348969c7b 100644
--- a/drivers/platform/msm/msm_11ad/msm_11ad.c
+++ b/drivers/platform/msm/msm_11ad/msm_11ad.c
@@ -836,7 +836,6 @@ static void msm_11ad_ssr_deinit(struct msm11ad_ctx *ctx)
ctx->ramdump_dev = NULL;
}
- kfree(ctx->ramdump_addr);
ctx->ramdump_addr = NULL;
if (ctx->subsys_handle) {
@@ -869,6 +868,14 @@ static int msm_11ad_ssr_init(struct msm11ad_ctx *ctx)
goto out_rc;
}
+ ctx->ramdump_dev = create_ramdump_device(ctx->subsysdesc.name,
+ ctx->subsysdesc.dev);
+ if (!ctx->ramdump_dev) {
+ dev_err(ctx->dev, "Create ramdump device failed\n");
+ rc = -ENOMEM;
+ goto out_rc;
+ }
+
/* register ramdump area */
ctx->ramdump_addr = kmalloc(WIGIG_RAMDUMP_SIZE, GFP_KERNEL);
if (!ctx->ramdump_addr) {
@@ -886,19 +893,11 @@ static int msm_11ad_ssr_init(struct msm11ad_ctx *ctx)
rc = msm_dump_data_register(MSM_DUMP_TABLE_APPS, &dump_entry);
if (rc) {
dev_err(ctx->dev, "Dump table setup failed: %d\n", rc);
- goto out_rc;
- }
-
- ctx->ramdump_dev = create_ramdump_device(ctx->subsysdesc.name,
- ctx->subsysdesc.dev);
- if (!ctx->ramdump_dev) {
- dev_err(ctx->dev, "Create ramdump device failed: %d\n", rc);
- rc = -ENOMEM;
+ kfree(ctx->ramdump_addr);
goto out_rc;
}
return 0;
-
out_rc:
msm_11ad_ssr_deinit(ctx);
return rc;
diff --git a/drivers/soc/qcom/glink_smem_native_xprt.c b/drivers/soc/qcom/glink_smem_native_xprt.c
index 85d51807077c..3f969234b705 100644
--- a/drivers/soc/qcom/glink_smem_native_xprt.c
+++ b/drivers/soc/qcom/glink_smem_native_xprt.c
@@ -678,7 +678,8 @@ static void process_rx_data(struct edge_info *einfo, uint16_t cmd_id,
err = true;
} else if (intent->data == NULL) {
if (einfo->intentless) {
- intent->data = kmalloc(cmd.frag_size, GFP_ATOMIC);
+ intent->data = kmalloc(cmd.frag_size,
+ __GFP_ATOMIC | __GFP_HIGH);
if (!intent->data) {
err = true;
GLINK_ERR(
diff --git a/drivers/soc/qcom/spcom.c b/drivers/soc/qcom/spcom.c
index f7b9c3f85a30..cab758f695dc 100644
--- a/drivers/soc/qcom/spcom.c
+++ b/drivers/soc/qcom/spcom.c
@@ -1723,12 +1723,16 @@ static int spcom_handle_lock_ion_buf_command(struct spcom_channel *ch,
pr_debug("ion handle ok.\n");
+ /* ION buf lock doesn't involve any rx/tx data to SP. */
+ mutex_lock(&ch->lock);
+
/* Check if this ION buffer is already locked */
for (i = 0 ; i < ARRAY_SIZE(ch->ion_handle_table) ; i++) {
if (ch->ion_handle_table[i] == ion_handle) {
pr_err("fd [%d] ion buf is already locked.\n", fd);
/* decrement back the ref count */
ion_free(spcom_dev->ion_client, ion_handle);
+ mutex_unlock(&ch->lock);
return -EINVAL;
}
}
@@ -1740,6 +1744,7 @@ static int spcom_handle_lock_ion_buf_command(struct spcom_channel *ch,
ch->ion_fd_table[i] = fd;
pr_debug("ch [%s] locked ion buf #%d, fd [%d].\n",
ch->name, i, fd);
+ mutex_unlock(&ch->lock);
return 0;
}
}
@@ -1748,6 +1753,8 @@ static int spcom_handle_lock_ion_buf_command(struct spcom_channel *ch,
/* decrement back the ref count */
ion_free(spcom_dev->ion_client, ion_handle);
+ mutex_unlock(&ch->lock);
+
return -EFAULT;
}
@@ -1826,8 +1833,13 @@ static int spcom_handle_unlock_ion_buf_command(struct spcom_channel *ch,
return -EINVAL;
}
+ /* ION buf unlock doesn't involve any rx/tx data to SP. */
+ mutex_lock(&ch->lock);
+
ret = spcom_unlock_ion_buf(ch, fd);
+ mutex_unlock(&ch->lock);
+
return ret;
}
diff --git a/drivers/video/fbdev/msm/mdss_compat_utils.c b/drivers/video/fbdev/msm/mdss_compat_utils.c
index 17644e3556b6..e9ba77501b38 100644
--- a/drivers/video/fbdev/msm/mdss_compat_utils.c
+++ b/drivers/video/fbdev/msm/mdss_compat_utils.c
@@ -226,6 +226,7 @@ static struct mdp_input_layer *__create_layer_list(
layer->transp_mask = layer32->transp_mask;
layer->bg_color = layer32->bg_color;
layer->blend_op = layer32->blend_op;
+ layer->alpha = layer32->alpha;
layer->color_space = layer32->color_space;
layer->src_rect = layer32->src_rect;
layer->dst_rect = layer32->dst_rect;
diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h
index db037ed263b4..a2139f495f52 100644
--- a/drivers/video/fbdev/msm/mdss_mdp.h
+++ b/drivers/video/fbdev/msm/mdss_mdp.h
@@ -142,6 +142,25 @@
#define BITS_TO_BYTES(x) DIV_ROUND_UP(x, BITS_PER_BYTE)
+#define PP_PROGRAM_PA 0x1
+#define PP_PROGRAM_PCC 0x2
+#define PP_PROGRAM_IGC 0x4
+#define PP_PROGRAM_ARGC 0x8
+#define PP_PROGRAM_HIST 0x10
+#define PP_PROGRAM_DITHER 0x20
+#define PP_PROGRAM_GAMUT 0x40
+#define PP_PROGRAM_PGC 0x100
+#define PP_PROGRAM_PA_DITHER 0x400
+#define PP_PROGRAM_AD 0x800
+
+#define PP_NORMAL_PROGRAM_MASK (PP_PROGRAM_AD | PP_PROGRAM_PCC | \
+ PP_PROGRAM_HIST)
+#define PP_DEFER_PROGRAM_MASK (PP_PROGRAM_IGC | PP_PROGRAM_PGC | \
+ PP_PROGRAM_ARGC | PP_PROGRAM_GAMUT | \
+ PP_PROGRAM_PA | PP_PROGRAM_DITHER | \
+ PP_PROGRAM_PA_DITHER)
+#define PP_PROGRAM_ALL (PP_NORMAL_PROGRAM_MASK | PP_DEFER_PROGRAM_MASK)
+
enum mdss_mdp_perf_state_type {
PERF_SW_COMMIT_STATE = 0,
PERF_HW_MDP_STATE,
@@ -773,6 +792,12 @@ struct mdss_pipe_pp_res {
void *hist_lut_cfg_payload;
};
+struct mdss_mdp_pp_program_info {
+ u32 pp_program_mask;
+ u32 pp_opmode_left;
+ u32 pp_opmode_right;
+};
+
struct mdss_mdp_pipe_smp_map {
DECLARE_BITMAP(reserved, MAX_DRV_SUP_MMB_BLKS);
DECLARE_BITMAP(allocated, MAX_DRV_SUP_MMB_BLKS);
@@ -1803,7 +1828,8 @@ int mdss_mdp_pp_resume(struct msm_fb_data_type *mfd);
void mdss_mdp_pp_dest_scaler_resume(struct mdss_mdp_ctl *ctl);
int mdss_mdp_pp_setup(struct mdss_mdp_ctl *ctl);
-int mdss_mdp_pp_setup_locked(struct mdss_mdp_ctl *ctl);
+int mdss_mdp_pp_setup_locked(struct mdss_mdp_ctl *ctl,
+ struct mdss_mdp_pp_program_info *info);
int mdss_mdp_pipe_pp_setup(struct mdss_mdp_pipe *pipe, u32 *op);
void mdss_mdp_pipe_pp_clear(struct mdss_mdp_pipe *pipe);
int mdss_mdp_pipe_sspp_setup(struct mdss_mdp_pipe *pipe, u32 *op);
diff --git a/drivers/video/fbdev/msm/mdss_mdp_ctl.c b/drivers/video/fbdev/msm/mdss_mdp_ctl.c
index 71338e78a67a..2968d883c8cb 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_ctl.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_ctl.c
@@ -5752,6 +5752,9 @@ int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg,
bool is_bw_released, split_lm_valid;
struct mdss_data_type *mdata = mdss_mdp_get_mdata();
u32 ctl_flush_bits = 0, sctl_flush_bits = 0;
+ /* Must initialize pp_program_info */
+ struct mdss_mdp_pp_program_info pp_program_info = {
+ PP_PROGRAM_ALL, 0, 0};
if (!ctl) {
pr_err("display function not set\n");
@@ -5864,9 +5867,13 @@ int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg,
mdss_mdp_ctl_split_display_enable(split_lm_valid, ctl, sctl);
ATRACE_BEGIN("postproc_programming");
- if (ctl->is_video_mode && ctl->mfd && ctl->mfd->dcm_state != DTM_ENTER)
+ if (ctl->mfd && ctl->mfd->dcm_state != DTM_ENTER) {
/* postprocessing setup, including dspp */
- mdss_mdp_pp_setup_locked(ctl);
+ if (!ctl->is_video_mode)
+ pp_program_info.pp_program_mask =
+ PP_NORMAL_PROGRAM_MASK;
+ mdss_mdp_pp_setup_locked(ctl, &pp_program_info);
+ }
if (sctl) {
if (ctl->split_flush_en) {
@@ -5922,11 +5929,17 @@ int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg,
}
/* Moved pp programming to post ping pong */
+ ATRACE_BEGIN("postproc_programming_deferred");
if (!ctl->is_video_mode && ctl->mfd &&
ctl->mfd->dcm_state != DTM_ENTER) {
/* postprocessing setup, including dspp */
mutex_lock(&ctl->flush_lock);
- mdss_mdp_pp_setup_locked(ctl);
+ pp_program_info.pp_program_mask = PP_DEFER_PROGRAM_MASK;
+ /*
+ * pp_program_info should not be modified beween normal and
+ * deferred stage calls.
+ */
+ mdss_mdp_pp_setup_locked(ctl, &pp_program_info);
if (sctl) {
if (ctl->split_flush_en) {
ctl->flush_bits |= sctl->flush_bits;
@@ -5939,6 +5952,7 @@ int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg,
ctl_flush_bits |= ctl->flush_bits;
mutex_unlock(&ctl->flush_lock);
}
+ ATRACE_END("postproc_programming_deferred");
/*
* if serialize_wait4pp is false then roi_bkup used in wait4pingpong
* will be of previous frame as expected.
diff --git a/drivers/video/fbdev/msm/mdss_mdp_pp.c b/drivers/video/fbdev/msm/mdss_mdp_pp.c
index f10d4fb60f52..f128f82fab04 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_pp.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_pp.c
@@ -2322,7 +2322,9 @@ static void pp_dspp_opmode_config(struct mdss_mdp_ctl *ctl, u32 num,
*opmode |= MDSS_MDP_DSPP_OP_ARGC_LUT_EN;
}
-static int pp_dspp_setup(u32 disp_num, struct mdss_mdp_mixer *mixer)
+static int pp_dspp_setup(u32 disp_num, struct mdss_mdp_mixer *mixer,
+ u32 pp_program_mask, int *op_mode)
+
{
u32 ad_flags, flags, dspp_num, opmode = 0, ad_bypass;
struct mdp_pgc_lut_data *pgc_config;
@@ -2338,6 +2340,8 @@ static int pp_dspp_setup(u32 disp_num, struct mdss_mdp_mixer *mixer)
u32 mixer_id[MDSS_MDP_INTF_MAX_LAYERMIXER];
int side;
+ opmode = *op_mode;
+
if (!mixer || !mixer->ctl || !mixer->ctl->mdata)
return -EINVAL;
ctl = mixer->ctl;
@@ -2358,19 +2362,23 @@ static int pp_dspp_setup(u32 disp_num, struct mdss_mdp_mixer *mixer)
}
mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON);
- if ((mdata->pp_block_off.dspp_gamut_off != U32_MAX) &&
- (pp_driver_ops.gamut_clk_gate_en))
- pp_driver_ops.gamut_clk_gate_en(base +
+ if (pp_program_mask & PP_PROGRAM_GAMUT) {
+ if ((mdata->pp_block_off.dspp_gamut_off != U32_MAX) &&
+ (pp_driver_ops.gamut_clk_gate_en))
+ pp_driver_ops.gamut_clk_gate_en(base +
mdata->pp_block_off.dspp_gamut_off);
-
+ }
if (disp_num < MDSS_BLOCK_DISP_NUM) {
pp_sts = &mdss_pp_res->pp_disp_sts[disp_num];
pp_sts->side_sts = side;
- ret = pp_hist_setup(&opmode, MDSS_PP_DSPP_CFG | dspp_num, mixer,
- pp_sts);
- if (ret)
- goto dspp_exit;
+ if (pp_program_mask & PP_PROGRAM_HIST) {
+ ret = pp_hist_setup(&opmode,
+ MDSS_PP_DSPP_CFG | dspp_num, mixer,
+ pp_sts);
+ if (ret)
+ goto dspp_exit;
+ }
flags = mdss_pp_res->pp_disp_flags[disp_num];
} else {
@@ -2391,7 +2399,8 @@ static int pp_dspp_setup(u32 disp_num, struct mdss_mdp_mixer *mixer)
if ((!flags) && (!(opmode)) && (!ad_flags))
goto dspp_exit;
- if (flags & PP_FLAGS_DIRTY_PA) {
+ if ((flags & PP_FLAGS_DIRTY_PA) &&
+ (pp_program_mask & PP_PROGRAM_PA)) {
if (!pp_ops[PA].pp_set_config) {
if (mdata->mdp_rev >= MDSS_MDP_HW_REV_103) {
pa_v2_cfg_data =
@@ -2412,7 +2421,8 @@ static int pp_dspp_setup(u32 disp_num, struct mdss_mdp_mixer *mixer)
DSPP);
}
}
- if (flags & PP_FLAGS_DIRTY_PCC) {
+ if ((flags & PP_FLAGS_DIRTY_PCC) &&
+ (pp_program_mask & PP_PROGRAM_PCC)) {
if (!pp_ops[PCC].pp_set_config)
pp_pcc_config(flags, base + MDSS_MDP_REG_DSPP_PCC_BASE,
pp_sts,
@@ -2429,7 +2439,8 @@ static int pp_dspp_setup(u32 disp_num, struct mdss_mdp_mixer *mixer)
}
}
- if (flags & PP_FLAGS_DIRTY_IGC) {
+ if ((flags & PP_FLAGS_DIRTY_IGC) &&
+ (pp_program_mask & PP_PROGRAM_IGC)) {
if (!pp_ops[IGC].pp_set_config) {
pp_igc_config(flags,
mdata->mdp_base + MDSS_MDP_REG_IGC_DSPP_BASE,
@@ -2449,7 +2460,8 @@ static int pp_dspp_setup(u32 disp_num, struct mdss_mdp_mixer *mixer)
DSPP);
}
- if (flags & PP_FLAGS_DIRTY_ENHIST) {
+ if ((flags & PP_FLAGS_DIRTY_ENHIST) &&
+ (pp_program_mask & PP_PROGRAM_HIST)) {
if (!pp_ops[HIST_LUT].pp_set_config) {
pp_enhist_config(flags,
base + MDSS_MDP_REG_DSPP_HIST_LUT_BASE,
@@ -2473,7 +2485,8 @@ static int pp_dspp_setup(u32 disp_num, struct mdss_mdp_mixer *mixer)
}
}
- if (flags & PP_FLAGS_DIRTY_DITHER) {
+ if ((flags & PP_FLAGS_DIRTY_DITHER) &&
+ (pp_program_mask & PP_PROGRAM_DITHER)) {
if (!pp_ops[DITHER].pp_set_config && addr) {
pp_dither_config(addr, pp_sts,
&mdss_pp_res->dither_disp_cfg[disp_num]);
@@ -2483,7 +2496,8 @@ static int pp_dspp_setup(u32 disp_num, struct mdss_mdp_mixer *mixer)
&mdss_pp_res->dither_disp_cfg[disp_num], DSPP);
}
}
- if (flags & PP_FLAGS_DIRTY_GAMUT) {
+ if ((flags & PP_FLAGS_DIRTY_GAMUT) &&
+ (pp_program_mask & PP_PROGRAM_GAMUT)) {
if (!pp_ops[GAMUT].pp_set_config) {
pp_gamut_config(&mdss_pp_res->gamut_disp_cfg[disp_num],
base, pp_sts);
@@ -2500,7 +2514,8 @@ static int pp_dspp_setup(u32 disp_num, struct mdss_mdp_mixer *mixer)
}
}
- if (flags & PP_FLAGS_DIRTY_PGC) {
+ if ((flags & PP_FLAGS_DIRTY_PGC) &&
+ (pp_program_mask & PP_PROGRAM_PGC)) {
pgc_config = &mdss_pp_res->pgc_disp_cfg[disp_num];
if (pp_ops[GC].pp_set_config) {
if (mdata->pp_block_off.dspp_pgc_off == U32_MAX) {
@@ -2526,6 +2541,7 @@ static int pp_dspp_setup(u32 disp_num, struct mdss_mdp_mixer *mixer)
}
}
if (flags & PP_FLAGS_DIRTY_PA_DITHER &&
+ (pp_program_mask & PP_PROGRAM_PA_DITHER) &&
pp_ops[PA_DITHER].pp_set_config) {
pp_ops[PA_DITHER].pp_set_config(base, pp_sts,
&mdss_pp_res->pa_dither_cfg[disp_num],
@@ -2536,7 +2552,7 @@ static int pp_dspp_setup(u32 disp_num, struct mdss_mdp_mixer *mixer)
pp_dspp_opmode_config(ctl, dspp_num, pp_sts, mdata->mdp_rev,
&opmode);
- if (ad_hw) {
+ if (ad_hw && (pp_program_mask & PP_PROGRAM_AD)) {
mutex_lock(&ad->lock);
ad_flags = ad->reg_sts;
if (ad_flags & PP_AD_STS_DIRTY_DATA)
@@ -2566,6 +2582,9 @@ static int pp_dspp_setup(u32 disp_num, struct mdss_mdp_mixer *mixer)
ctl->flush_bits |= BIT(13 + dspp_num);
wmb();
+
+ *op_mode = opmode;
+
dspp_exit:
mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_OFF);
return ret;
@@ -2684,6 +2703,8 @@ void mdss_mdp_pp_dest_scaler_resume(struct mdss_mdp_ctl *ctl)
int mdss_mdp_pp_setup(struct mdss_mdp_ctl *ctl)
{
int ret = 0;
+ struct mdss_mdp_pp_program_info pp_program_info = {
+ PP_PROGRAM_ALL, 0, 0};
if ((!ctl->mfd) || (!mdss_pp_res))
return -EINVAL;
@@ -2695,14 +2716,15 @@ int mdss_mdp_pp_setup(struct mdss_mdp_ctl *ctl)
ret = -EPERM;
goto error;
}
- ret = mdss_mdp_pp_setup_locked(ctl);
+ ret = mdss_mdp_pp_setup_locked(ctl, &pp_program_info);
error:
mutex_unlock(&ctl->lock);
return ret;
}
-int mdss_mdp_pp_setup_locked(struct mdss_mdp_ctl *ctl)
+int mdss_mdp_pp_setup_locked(struct mdss_mdp_ctl *ctl,
+ struct mdss_mdp_pp_program_info *info)
{
struct mdss_data_type *mdata;
int ret = 0, i;
@@ -2715,6 +2737,16 @@ int mdss_mdp_pp_setup_locked(struct mdss_mdp_ctl *ctl)
bool valid_ad_panel = true;
if ((!ctl) || (!ctl->mfd) || (!mdss_pp_res) || (!ctl->mdata))
return -EINVAL;
+ if (!info) {
+ pr_err("pp_program_info is NULL");
+ return -EINVAL;
+ }
+ if (!(info->pp_program_mask == PP_NORMAL_PROGRAM_MASK ||
+ info->pp_program_mask == PP_DEFER_PROGRAM_MASK ||
+ info->pp_program_mask == PP_PROGRAM_ALL)) {
+ pr_err("Invalid pp program mask : %x ", info->pp_program_mask);
+ return -EINVAL;
+ }
mdata = ctl->mdata;
/* treat fb_num the same as block logical id*/
@@ -2748,7 +2780,11 @@ int mdss_mdp_pp_setup_locked(struct mdss_mdp_ctl *ctl)
mutex_lock(&mdss_pp_mutex);
- flags = mdss_pp_res->pp_disp_flags[disp_num];
+ if (disp_num < MDSS_BLOCK_DISP_NUM)
+ flags = mdss_pp_res->pp_disp_flags[disp_num];
+ else
+ flags = 0;
+
if (pp_ops[PA].pp_set_config)
pa_v2_flags = mdss_pp_res->pa_v2_disp_cfg[disp_num].flags;
else
@@ -2759,50 +2795,72 @@ int mdss_mdp_pp_setup_locked(struct mdss_mdp_ctl *ctl)
* increase the register bus bandwidth to maximum frequency
* in order to speed up the register reprogramming.
*/
- max_bw_needed = (IS_PP_RESUME_COMMIT(flags) &&
- (IS_PP_LUT_DIRTY(flags) ||
- IS_SIX_ZONE_DIRTY(flags, pa_v2_flags)));
- if (mdata->pp_reg_bus_clt && max_bw_needed) {
- ret = mdss_update_reg_bus_vote(mdata->pp_reg_bus_clt,
- VOTE_INDEX_HIGH);
- if (ret)
- pr_err("Updated reg_bus_scale failed, ret = %d", ret);
+ if (info->pp_program_mask & PP_DEFER_PROGRAM_MASK) {
+ max_bw_needed = (IS_PP_RESUME_COMMIT(flags) &&
+ (IS_PP_LUT_DIRTY(flags) ||
+ IS_SIX_ZONE_DIRTY(flags, pa_v2_flags)));
+ if (mdata->pp_reg_bus_clt && max_bw_needed) {
+ ret = mdss_update_reg_bus_vote(mdata->pp_reg_bus_clt,
+ VOTE_INDEX_HIGH);
+ if (ret)
+ pr_err("Updated reg_bus_scale failed, ret = %d",
+ ret);
+ }
}
if (ctl->mixer_left) {
- pp_mixer_setup(ctl->mixer_left);
- pp_dspp_setup(disp_num, ctl->mixer_left);
- pp_ppb_setup(ctl->mixer_left);
+ if (info->pp_program_mask & PP_DEFER_PROGRAM_MASK) {
+ pp_mixer_setup(ctl->mixer_left);
+ pp_dspp_setup(disp_num, ctl->mixer_left,
+ info->pp_program_mask, &info->pp_opmode_left);
+ pp_ppb_setup(ctl->mixer_left);
+ } else {
+ pp_dspp_setup(disp_num, ctl->mixer_left,
+ info->pp_program_mask, &info->pp_opmode_left);
+ }
}
if (ctl->mixer_right) {
- pp_mixer_setup(ctl->mixer_right);
- pp_dspp_setup(disp_num, ctl->mixer_right);
- pp_ppb_setup(ctl->mixer_right);
+ if (info->pp_program_mask & PP_DEFER_PROGRAM_MASK) {
+ pp_mixer_setup(ctl->mixer_right);
+ pp_dspp_setup(disp_num, ctl->mixer_right,
+ info->pp_program_mask, &info->pp_opmode_right);
+ pp_ppb_setup(ctl->mixer_right);
+ } else {
+ pp_dspp_setup(disp_num, ctl->mixer_right,
+ info->pp_program_mask, &info->pp_opmode_right);
+ }
}
- if (valid_mixers && (mixer_cnt <= mdata->nmax_concurrent_ad_hw) &&
- valid_ad_panel) {
- ret = mdss_mdp_ad_ipc_reset(ctl->mfd);
- if (ret < 0)
- pr_warn("ad_setup(disp%d) returns %d\n", disp_num, ret);
+ if (info->pp_program_mask & PP_PROGRAM_AD) {
+ if (valid_mixers &&
+ (mixer_cnt <= mdata->nmax_concurrent_ad_hw) &&
+ valid_ad_panel) {
+ ret = mdss_mdp_ad_ipc_reset(ctl->mfd);
+ if (ret < 0)
+ pr_warn("ad_setup(disp%d) returns %d\n",
+ disp_num, ret);
+ }
}
- /* clear dirty flag */
- if (disp_num < MDSS_BLOCK_DISP_NUM) {
- mdss_pp_res->pp_disp_flags[disp_num] = 0;
- if (disp_num < mdata->nad_cfgs)
- mdata->ad_cfgs[disp_num].reg_sts = 0;
- }
+ if (info->pp_program_mask & PP_DEFER_PROGRAM_MASK) {
+ /* clear dirty flag */
+ if (disp_num < MDSS_BLOCK_DISP_NUM) {
+ mdss_pp_res->pp_disp_flags[disp_num] = 0;
+ if (disp_num < mdata->nad_cfgs)
+ mdata->ad_cfgs[disp_num].reg_sts = 0;
+ }
- if (mdata->pp_reg_bus_clt && max_bw_needed) {
- ret = mdss_update_reg_bus_vote(mdata->pp_reg_bus_clt,
- VOTE_INDEX_DISABLE);
- if (ret)
- pr_err("Updated reg_bus_scale failed, ret = %d", ret);
+ if (mdata->pp_reg_bus_clt && max_bw_needed) {
+ ret = mdss_update_reg_bus_vote(mdata->pp_reg_bus_clt,
+ VOTE_INDEX_DISABLE);
+ if (ret)
+ pr_err("Updated reg_bus_scale failed, ret = %d",
+ ret);
+ }
+ if (IS_PP_RESUME_COMMIT(flags))
+ mdss_pp_res->pp_disp_flags[disp_num] &=
+ ~PP_FLAGS_RESUME_COMMIT;
}
- if (IS_PP_RESUME_COMMIT(flags))
- mdss_pp_res->pp_disp_flags[disp_num] &=
- ~PP_FLAGS_RESUME_COMMIT;
mutex_unlock(&mdss_pp_mutex);
exit:
return ret;
diff --git a/drivers/video/fbdev/msm/msm_mdss_io_8974.c b/drivers/video/fbdev/msm/msm_mdss_io_8974.c
index 9c156af6b63c..87fe6d739acf 100644
--- a/drivers/video/fbdev/msm/msm_mdss_io_8974.c
+++ b/drivers/video/fbdev/msm/msm_mdss_io_8974.c
@@ -1229,10 +1229,11 @@ static void mdss_dsi_8996_phy_config(struct mdss_dsi_ctrl_pdata *ctrl)
off = DSIPHY_LANE_CFG_BASE;
ln_off = cnt * MDSS_DSI_NUM_DATA_LANES;
ip = &pd->lanecfg[ln_off];
- for (j = 0; j < cnt; j++, *ip++) {
+ for (j = 0; j < cnt; j++) {
MIPI_OUTP(base + off, *ip);
if (panel_info->split_link_enabled)
MIPI_OUTP(base + CLKLANE_SIZE_8996 + off, *ip);
+ ip++;
off += DSIPHY_LANE_CFG_OFFSET;
}
@@ -1245,10 +1246,11 @@ static void mdss_dsi_8996_phy_config(struct mdss_dsi_ctrl_pdata *ctrl)
off = DSIPHY_LANE_TIMING_CTRL_BASE;
ln_off = cnt * MDSS_DSI_NUM_DATA_LANES;
ip = &pd->timing_8996[ln_off];
- for (j = 0; j < cnt; j++, *ip++) {
+ for (j = 0; j < cnt; j++) {
MIPI_OUTP(base + off, *ip);
if (panel_info->split_link_enabled)
MIPI_OUTP(base + CLKLANE_SIZE_8996 + off, *ip);
+ ip++;
off += DSIPHY_LANE_TIMING_CTRL_OFFSET;
}
@@ -1261,10 +1263,11 @@ static void mdss_dsi_8996_phy_config(struct mdss_dsi_ctrl_pdata *ctrl)
off = DSIPHY_LANE_STRENGTH_CTRL_BASE;
ln_off = cnt * MDSS_DSI_NUM_DATA_LANES;
ip = &pd->strength[ln_off];
- for (j = 0; j < cnt; j++, *ip++) {
+ for (j = 0; j < cnt; j++) {
MIPI_OUTP(base + off, *ip);
if (panel_info->split_link_enabled)
MIPI_OUTP(base + CLKLANE_SIZE_8996 + off, *ip);
+ ip++;
off += DSIPHY_LANE_STRENGTH_CTRL_OFFSET;
}
diff --git a/fs/gfs2/acl.c b/fs/gfs2/acl.c
index ff0ac96a8e7b..db4c867369b5 100644
--- a/fs/gfs2/acl.c
+++ b/fs/gfs2/acl.c
@@ -78,8 +78,11 @@ int gfs2_set_acl(struct inode *inode, struct posix_acl *acl, int type)
if (type == ACL_TYPE_ACCESS) {
umode_t mode = inode->i_mode;
-
+ struct posix_acl *old_acl = acl;
error = posix_acl_update_mode(inode, &inode->i_mode, &acl);
+
+ if (!acl)
+ posix_acl_release(old_acl);
if (error)
return error;
if (mode != inode->i_mode)
diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c
index c5101a3295d8..62ba66e1c598 100644
--- a/fs/xfs/xfs_acl.c
+++ b/fs/xfs/xfs_acl.c
@@ -289,8 +289,10 @@ xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
if (type == ACL_TYPE_ACCESS) {
umode_t mode;
-
+ struct posix_acl *old_acl = acl;
error = posix_acl_update_mode(inode, &mode, &acl);
+ if (!acl)
+ posix_acl_release(old_acl);
if (error)
return error;
error = xfs_set_mode(inode, mode);