diff options
| -rw-r--r-- | arch/arm/boot/dts/qcom/sdm660-common.dtsi | 2 | ||||
| -rw-r--r-- | arch/arm64/configs/msmcortex-perf_defconfig | 2 | ||||
| -rw-r--r-- | arch/arm64/configs/msmcortex_defconfig | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/wcnss/wcnss_wlan.c | 87 | ||||
| -rw-r--r-- | drivers/platform/msm/msm_11ad/msm_11ad.c | 19 | ||||
| -rw-r--r-- | drivers/soc/qcom/glink_smem_native_xprt.c | 3 | ||||
| -rw-r--r-- | drivers/soc/qcom/spcom.c | 12 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_compat_utils.c | 1 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.h | 28 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_ctl.c | 20 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_pp.c | 164 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/msm_mdss_io_8974.c | 9 | ||||
| -rw-r--r-- | fs/gfs2/acl.c | 5 | ||||
| -rw-r--r-- | fs/xfs/xfs_acl.c | 4 |
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); |
