Skip to content
This repository has been archived by the owner on Dec 28, 2020. It is now read-only.

Commit

Permalink
Merge tag 'LA.UM.7.3.r1-07900-sdm845.0' into neutrino-msm-fajita-4.9
Browse files Browse the repository at this point in the history
"LA.UM.7.3.r1-07900-sdm845.0"

* tag 'LA.UM.7.3.r1-07900-sdm845.0':
  msm: adsprpc: Fix integer overflow in refcount of map
  msm: adsprpc: maintain local copy of rpra offloaded to DSP
  drm/msm/dsi-staging: Add range check in debugfs_dump_info_read
  drm/msm/sde: stage border fill after ctl start timeout
  arm64: Make sure permission updates happen for pmd/pud
  msm: vidc: Add state check to allow flush command

Signed-off-by: Adam W. Willis <return.of.octobot@gmail.com>

Conflicts:
	drivers/media/platform/msm/camera_v3/cam_cdm/cam_cdm.h
	drivers/media/platform/msm/camera_v3/cam_cdm/cam_cdm_hw_core.c
	drivers/media/platform/msm/camera_v3/cam_core/cam_context.c
	drivers/media/platform/msm/camera_v3/cam_core/cam_context_utils.c
	drivers/media/platform/msm/camera_v3/cam_core/cam_hw_mgr_intf.h
	drivers/media/platform/msm/camera_v3/cam_fd/fd_hw_mgr/cam_fd_hw_mgr.c
	drivers/media/platform/msm/camera_v3/cam_icp/cam_icp_context.c
	drivers/media/platform/msm/camera_v3/cam_icp/hfi.c
	drivers/media/platform/msm/camera_v3/cam_icp/icp_hw/bps_hw/bps_core.c
	drivers/media/platform/msm/camera_v3/cam_icp/icp_hw/icp_hw_mgr/cam_icp_hw_mgr.c
	drivers/media/platform/msm/camera_v3/cam_icp/icp_hw/ipe_hw/ipe_core.c
	drivers/media/platform/msm/camera_v3/cam_isp/cam_isp_context.c
	drivers/media/platform/msm/camera_v3/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c
	drivers/media/platform/msm/camera_v3/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_core.c
	drivers/media/platform/msm/camera_v3/cam_jpeg/jpeg_hw/cam_jpeg_hw_mgr.c
	drivers/media/platform/msm/camera_v3/cam_lrme/lrme_hw_mgr/cam_lrme_hw_mgr.c
	drivers/media/platform/msm/camera_v3/cam_req_mgr/cam_req_mgr_core.c
	drivers/media/platform/msm/camera_v3/cam_sensor_module/cam_csiphy/cam_csiphy_core.c
	drivers/media/platform/msm/camera_v3/cam_sensor_module/cam_csiphy/cam_csiphy_dev.h
	drivers/media/platform/msm/camera_v3/cam_sensor_module/cam_csiphy/cam_csiphy_soc.c
	drivers/media/platform/msm/camera_v3/cam_sensor_module/cam_csiphy/cam_csiphy_soc.h
	drivers/media/platform/msm/camera_v3/cam_sensor_module/cam_csiphy/include/cam_csiphy_1_2_hwreg.h
	drivers/media/platform/msm/camera_v3/cam_sensor_module/cam_sensor/cam_sensor_core.c
	drivers/media/platform/msm/camera_v3/cam_sensor_module/cam_sensor_utils/cam_sensor_util.c
	drivers/media/platform/msm/camera_v3/cam_smmu/cam_smmu_api.c
	drivers/media/platform/msm/camera_v3/cam_sync/cam_sync.c
	drivers/media/platform/msm/camera_v3/cam_utils/cam_debug_util.h
	drivers/media/platform/msm/camera_v3/cam_utils/cam_packet_util.c
	drivers/media/platform/msm/camera_v3/cam_utils/cam_packet_util.h
	drivers/media/platform/msm/camera_v3/cam_utils/cam_soc_util.c
	drivers/soc/qcom/msm_smem.c
  • Loading branch information
0ctobot committed Jul 8, 2019
2 parents d30b6a7 + d96dd27 commit c48ac06
Show file tree
Hide file tree
Showing 10 changed files with 140 additions and 28 deletions.
1 change: 1 addition & 0 deletions arch/arm64/include/asm/pgtable.h
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,7 @@ static inline int pmd_protnone(pmd_t pmd)

#define pud_write(pud) pte_write(pud_pte(pud))
#define pud_pfn(pud) (((pud_val(pud) & PUD_MASK) & PHYS_MASK) >> PAGE_SHIFT)
#define pfn_pud(pfn,prot) (__pud(((phys_addr_t)(pfn) << PAGE_SHIFT) | pgprot_val(prot)))

#define set_pmd_at(mm, addr, pmdp, pmd) set_pte_at(mm, addr, (pte_t *)pmdp, pmd_pte(pmd))

Expand Down
33 changes: 27 additions & 6 deletions arch/arm64/mm/mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,17 @@ static phys_addr_t __init early_pgtable_alloc(void)
return phys;
}

static bool pgattr_change_is_safe(u64 old, u64 new)
{
/*
* The following mapping attributes may be updated in live
* kernel mappings without the need for break-before-make.
*/
static const pteval_t mask = PTE_PXN | PTE_RDONLY | PTE_WRITE;

return old == 0 || new == 0 || ((old ^ new) & ~mask) == 0;
}

static void alloc_init_pte(pmd_t *pmd, unsigned long addr,
unsigned long end, unsigned long pfn,
pgprot_t prot,
Expand Down Expand Up @@ -831,23 +842,33 @@ int __init arch_ioremap_pmd_supported(void)

int pud_set_huge(pud_t *pud, phys_addr_t phys, pgprot_t prot)
{
/* ioremap_page_range doesn't honour BBM */
if (pud_present(READ_ONCE(*pud)))
pgprot_t sect_prot = __pgprot(PUD_TYPE_SECT |
pgprot_val(mk_sect_prot(prot)));
pud_t new_pud = pfn_pud(__phys_to_pfn(phys), sect_prot);

/* Only allow permission changes for now */
if (!pgattr_change_is_safe(READ_ONCE(pud_val(*pud)),
pud_val(new_pud)))
return 0;

BUG_ON(phys & ~PUD_MASK);
set_pud(pud, __pud(phys | PUD_TYPE_SECT | pgprot_val(mk_sect_prot(prot))));
set_pud(pud, new_pud);
return 1;
}

int pmd_set_huge(pmd_t *pmd, phys_addr_t phys, pgprot_t prot)
{
/* ioremap_page_range doesn't honour BBM */
if (pmd_present(READ_ONCE(*pmd)))
pgprot_t sect_prot = __pgprot(PMD_TYPE_SECT |
pgprot_val(mk_sect_prot(prot)));
pmd_t new_pmd = pfn_pmd(__phys_to_pfn(phys), sect_prot);

/* Only allow permission changes for now */
if (!pgattr_change_is_safe(READ_ONCE(pmd_val(*pmd)),
pmd_val(new_pmd)))
return 0;

BUG_ON(phys & ~PMD_MASK);
set_pmd(pmd, __pmd(phys | PMD_TYPE_SECT | pgprot_val(mk_sect_prot(prot))));
set_pmd(pmd, new_pmd);
return 1;
}

Expand Down
63 changes: 45 additions & 18 deletions drivers/char/adsprpc.c
Original file line number Diff line number Diff line change
Expand Up @@ -225,9 +225,11 @@ struct smq_invoke_ctx {
int tgid;
remote_arg_t *lpra;
remote_arg64_t *rpra;
remote_arg64_t *lrpra; /* Local copy of rpra for put_args */
int *fds;
struct fastrpc_mmap **maps;
struct fastrpc_buf *buf;
struct fastrpc_buf *lbuf;
size_t used;
struct fastrpc_file *fl;
uint32_t sc;
Expand Down Expand Up @@ -621,8 +623,13 @@ static int fastrpc_mmap_find(struct fastrpc_file *fl, int fd,
if (va >= map->va &&
va + len <= map->va + map->len &&
map->fd == fd) {
if (refs)
if (refs) {
if (map->refs + 1 == INT_MAX) {
spin_unlock(&me->hlock);
return -ETOOMANYREFS;
}
map->refs++;
}
match = map;
break;
}
Expand All @@ -633,8 +640,11 @@ static int fastrpc_mmap_find(struct fastrpc_file *fl, int fd,
if (va >= map->va &&
va + len <= map->va + map->len &&
map->fd == fd) {
if (refs)
if (refs) {
if (map->refs + 1 == INT_MAX)
return -ETOOMANYREFS;
map->refs++;
}
match = map;
break;
}
Expand Down Expand Up @@ -1273,6 +1283,7 @@ static void context_free(struct smq_invoke_ctx *ctx)

mutex_unlock(&ctx->fl->fl_map_mutex);
fastrpc_buf_free(ctx->buf, 1);
fastrpc_buf_free(ctx->lbuf, 1);
ctx->magic = 0;
ctx->ctxid = 0;

Expand Down Expand Up @@ -1419,7 +1430,7 @@ static void fastrpc_file_list_dtor(struct fastrpc_apps *me)
static int get_args(uint32_t kernel, struct smq_invoke_ctx *ctx)
{
struct fastrpc_apps *me = &gfa;
remote_arg64_t *rpra;
remote_arg64_t *rpra, *lrpra;
remote_arg_t *lpra = ctx->lpra;
struct smq_invoke_buf *list;
struct smq_phy_page *pages, *ipage;
Expand All @@ -1428,7 +1439,7 @@ static int get_args(uint32_t kernel, struct smq_invoke_ctx *ctx)
int outbufs = REMOTE_SCALARS_OUTBUFS(sc);
int handles, bufs = inbufs + outbufs;
uintptr_t args;
size_t rlen = 0, copylen = 0, metalen = 0;
size_t rlen = 0, copylen = 0, metalen = 0, lrpralen = 0;
int i, oix;
int err = 0;
int mflags = 0;
Expand Down Expand Up @@ -1486,7 +1497,20 @@ static int get_args(uint32_t kernel, struct smq_invoke_ctx *ctx)
metalen = copylen = (size_t)&ipage[0];
}

/* calculate len requreed for copying */
/* allocate new local rpra buffer */
lrpralen = (size_t)&list[0];
if (lrpralen) {
err = fastrpc_buf_alloc(ctx->fl, lrpralen, 0, 0, 0, &ctx->lbuf);
if (err)
goto bail;
}
if (ctx->lbuf->virt)
memset(ctx->lbuf->virt, 0, lrpralen);

lrpra = ctx->lbuf->virt;
ctx->lrpra = lrpra;

/* calculate len required for copying */
for (oix = 0; oix < inbufs + outbufs; ++oix) {
int i = ctx->overps[oix]->raix;
uintptr_t mstart, mend;
Expand Down Expand Up @@ -1537,13 +1561,13 @@ static int get_args(uint32_t kernel, struct smq_invoke_ctx *ctx)

/* map ion buffers */
PERF(ctx->fl->profile, GET_COUNTER(perf_counter, PERF_MAP),
for (i = 0; rpra && i < inbufs + outbufs; ++i) {
for (i = 0; rpra && lrpra && i < inbufs + outbufs; ++i) {
struct fastrpc_mmap *map = ctx->maps[i];
uint64_t buf = ptr_to_uint64(lpra[i].buf.pv);
size_t len = lpra[i].buf.len;

rpra[i].buf.pv = 0;
rpra[i].buf.len = len;
rpra[i].buf.pv = lrpra[i].buf.pv = 0;
rpra[i].buf.len = lrpra[i].buf.len = len;
if (!len)
continue;
if (map) {
Expand Down Expand Up @@ -1571,7 +1595,7 @@ static int get_args(uint32_t kernel, struct smq_invoke_ctx *ctx)
pages[idx].addr = map->phys + offset;
pages[idx].size = num << PAGE_SHIFT;
}
rpra[i].buf.pv = buf;
rpra[i].buf.pv = lrpra[i].buf.pv = buf;
}
PERF_END);
for (i = bufs; i < bufs + handles; ++i) {
Expand All @@ -1591,7 +1615,7 @@ static int get_args(uint32_t kernel, struct smq_invoke_ctx *ctx)
/* copy non ion buffers */
PERF(ctx->fl->profile, GET_COUNTER(perf_counter, PERF_COPY),
rlen = copylen - metalen;
for (oix = 0; rpra && oix < inbufs + outbufs; ++oix) {
for (oix = 0; rpra && lrpra && oix < inbufs + outbufs; ++oix) {
int i = ctx->overps[oix]->raix;
struct fastrpc_mmap *map = ctx->maps[i];
size_t mlen;
Expand All @@ -1610,7 +1634,8 @@ static int get_args(uint32_t kernel, struct smq_invoke_ctx *ctx)
VERIFY(err, rlen >= mlen);
if (err)
goto bail;
rpra[i].buf.pv = (args - ctx->overps[oix]->offset);
rpra[i].buf.pv = lrpra[i].buf.pv =
(args - ctx->overps[oix]->offset);
pages[list[i].pgidx].addr = ctx->buf->phys -
ctx->overps[oix]->offset +
(copylen - rlen);
Expand Down Expand Up @@ -1642,7 +1667,8 @@ static int get_args(uint32_t kernel, struct smq_invoke_ctx *ctx)
if (map && (map->attr & FASTRPC_ATTR_COHERENT))
continue;

if (rpra && rpra[i].buf.len && ctx->overps[oix]->mstart) {
if (rpra && lrpra && rpra[i].buf.len &&
ctx->overps[oix]->mstart) {
if (map && map->handle)
msm_ion_do_cache_op(ctx->fl->apps->client,
map->handle,
Expand All @@ -1656,10 +1682,11 @@ static int get_args(uint32_t kernel, struct smq_invoke_ctx *ctx)
}
}
PERF_END);
for (i = bufs; rpra && i < bufs + handles; i++) {
rpra[i].dma.fd = ctx->fds[i];
rpra[i].dma.len = (uint32_t)lpra[i].buf.len;
rpra[i].dma.offset = (uint32_t)(uintptr_t)lpra[i].buf.pv;
for (i = bufs; rpra && lrpra && i < bufs + handles; i++) {
rpra[i].dma.fd = lrpra[i].dma.fd = ctx->fds[i];
rpra[i].dma.len = lrpra[i].dma.len = (uint32_t)lpra[i].buf.len;
rpra[i].dma.offset = lrpra[i].dma.offset =
(uint32_t)(uintptr_t)lpra[i].buf.pv;
}

bail:
Expand All @@ -1677,7 +1704,7 @@ static int put_args(uint32_t kernel, struct smq_invoke_ctx *ctx,
uint64_t *fdlist = NULL;
uint32_t *crclist = NULL;

remote_arg64_t *rpra = ctx->rpra;
remote_arg64_t *rpra = ctx->lrpra;
int i, inbufs, outbufs, handles;
int err = 0;

Expand Down Expand Up @@ -1784,7 +1811,7 @@ static void inv_args(struct smq_invoke_ctx *ctx)
{
int i, inbufs, outbufs;
uint32_t sc = ctx->sc;
remote_arg64_t *rpra = ctx->rpra;
remote_arg64_t *rpra = ctx->lrpra;

inbufs = REMOTE_SCALARS_INBUFS(sc);
outbufs = REMOTE_SCALARS_OUTBUFS(sc);
Expand Down
3 changes: 3 additions & 0 deletions drivers/gpu/drm/msm/dsi-staging/dsi_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -1193,6 +1193,9 @@ static ssize_t debugfs_dump_info_read(struct file *file,
"\tClock master = %s\n",
display->ctrl[display->clk_master_idx].ctrl->name);

if (len > user_len)
len = user_len;

if (copy_to_user(user_buf, buf, len)) {
kfree(buf);
return -EFAULT;
Expand Down
27 changes: 26 additions & 1 deletion drivers/gpu/drm/msm/sde/sde_crtc.c
Original file line number Diff line number Diff line change
Expand Up @@ -785,6 +785,25 @@ static bool sde_crtc_mode_fixup(struct drm_crtc *crtc,

return true;
}
static int _sde_crtc_get_ctlstart_timeout(struct drm_crtc *crtc)
{
struct drm_encoder *encoder;
int rc = 0;

if (!crtc || !crtc->dev)
return 0;

list_for_each_entry(encoder,
&crtc->dev->mode_config.encoder_list, head) {
if (encoder->crtc != crtc)
continue;

if (sde_encoder_get_intf_mode(encoder) == INTF_MODE_CMD)
rc += sde_encoder_get_ctlstart_timeout_state(encoder);
}

return rc;
}

static void _sde_crtc_setup_blend_cfg(struct sde_crtc_mixer *mixer,
struct sde_plane_state *pstate, struct sde_format *format)
Expand Down Expand Up @@ -3513,7 +3532,13 @@ static void sde_crtc_atomic_begin(struct drm_crtc *crtc,
if (unlikely(!sde_crtc->num_mixers))
return;

_sde_crtc_blend_setup(crtc, old_state, true);
if (_sde_crtc_get_ctlstart_timeout(crtc)) {
_sde_crtc_blend_setup(crtc, old_state, false);
SDE_ERROR("border fill only commit after ctlstart timeout\n");
} else {
_sde_crtc_blend_setup(crtc, old_state, true);
}

_sde_crtc_dest_scaler_setup(crtc);

/* cancel the idle notify delayed work */
Expand Down
18 changes: 18 additions & 0 deletions drivers/gpu/drm/msm/sde/sde_encoder.c
Original file line number Diff line number Diff line change
Expand Up @@ -3234,6 +3234,24 @@ int sde_encoder_idle_request(struct drm_encoder *drm_enc)
return 0;
}

int sde_encoder_get_ctlstart_timeout_state(struct drm_encoder *drm_enc)
{
struct sde_encoder_virt *sde_enc = NULL;
int i, count = 0;

if (!drm_enc)
return 0;

sde_enc = to_sde_encoder_virt(drm_enc);

for (i = 0; i < sde_enc->num_phys_encs; i++) {
count += atomic_read(&sde_enc->phys_encs[i]->ctlstart_timeout);
atomic_set(&sde_enc->phys_encs[i]->ctlstart_timeout, 0);
}

return count;
}

/**
* _sde_encoder_trigger_flush - trigger flush for a physical encoder
* drm_enc: Pointer to drm encoder structure
Expand Down
7 changes: 7 additions & 0 deletions drivers/gpu/drm/msm/sde/sde_encoder.h
Original file line number Diff line number Diff line change
Expand Up @@ -266,4 +266,11 @@ int sde_encoder_in_clone_mode(struct drm_encoder *enc);
*/
void sde_encoder_control_idle_pc(struct drm_encoder *enc, bool enable);

/**
* sde_encoder_get_ctlstart_timeout_state - checks if ctl start timeout happened
* @drm_enc: Pointer to drm encoder structure
* @Return: non zero value if ctl start timeout occurred
*/
int sde_encoder_get_ctlstart_timeout_state(struct drm_encoder *enc);

#endif /* __SDE_ENCODER_H__ */
2 changes: 2 additions & 0 deletions drivers/gpu/drm/msm/sde/sde_encoder_phys.h
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,7 @@ struct sde_encoder_irq {
* @pending_retire_fence_cnt: Atomic counter tracking the pending retire
* fences that have to be signalled.
* @pending_kickoff_wq: Wait queue for blocking until kickoff completes
* @ctlstart_timeout: Indicates if ctl start timeout occurred
* @irq: IRQ tracking structures
* @cont_splash_single_flush Variable to check if single flush is enabled.
* @cont_splash_settings Variable to store continuous splash settings.
Expand Down Expand Up @@ -301,6 +302,7 @@ struct sde_encoder_phys {
atomic_t pending_kickoff_cnt;
atomic_t pending_retire_fence_cnt;
wait_queue_head_t pending_kickoff_wq;
atomic_t ctlstart_timeout;
struct sde_encoder_irq irq[INTR_IDX_MAX];
u32 cont_splash_single_flush;
bool cont_splash_settings;
Expand Down
9 changes: 8 additions & 1 deletion drivers/gpu/drm/msm/sde/sde_encoder_phys_cmd.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2015-2018 The Linux Foundation. All rights reserved.
* Copyright (c) 2015-2019 The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
Expand Down Expand Up @@ -193,6 +193,7 @@ static void sde_encoder_phys_cmd_pp_tx_done_irq(void *arg, int irq_idx)
phys_enc,
SDE_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE);
atomic_add_unless(&phys_enc->pending_ctlstart_cnt, -1, 0);
atomic_set(&phys_enc->ctlstart_timeout, 0);
}

/* notify all synchronous clients first, then asynchronous clients */
Expand Down Expand Up @@ -292,6 +293,7 @@ static void sde_encoder_phys_cmd_ctl_start_irq(void *arg, int irq_idx)

ctl = phys_enc->hw_ctl;
atomic_add_unless(&phys_enc->pending_ctlstart_cnt, -1, 0);
atomic_set(&phys_enc->ctlstart_timeout, 0);

time_diff_us = ktime_us_delta(ktime_get(), cmd_enc->rd_ptr_timestamp);

Expand Down Expand Up @@ -1057,6 +1059,7 @@ static void sde_encoder_phys_cmd_disable(struct sde_encoder_phys *phys_enc)
SDE_ERROR("invalid encoder\n");
return;
}
atomic_set(&phys_enc->ctlstart_timeout, 0);
SDE_DEBUG_CMDENC(cmd_enc, "pp %d state %d\n",
phys_enc->hw_pp->idx - PINGPONG_0,
phys_enc->enable_state);
Expand Down Expand Up @@ -1179,6 +1182,9 @@ static int _sde_encoder_phys_cmd_wait_for_ctl_start(
"ctl start interrupt wait failed\n");
else
ret = 0;

if (sde_encoder_phys_cmd_is_master(phys_enc))
atomic_inc_return(&phys_enc->ctlstart_timeout);
}

return ret;
Expand Down Expand Up @@ -1491,6 +1497,7 @@ struct sde_encoder_phys *sde_encoder_phys_cmd_init(
atomic_set(&phys_enc->pending_retire_fence_cnt, 0);
atomic_set(&cmd_enc->pending_rd_ptr_cnt, 0);
atomic_set(&cmd_enc->pending_vblank_cnt, 0);
atomic_set(&phys_enc->ctlstart_timeout, 0);
init_waitqueue_head(&phys_enc->pending_kickoff_wq);
init_waitqueue_head(&cmd_enc->pending_vblank_wq);
atomic_set(&cmd_enc->autorefresh.kickoff_cnt, 0);
Expand Down
Loading

0 comments on commit c48ac06

Please sign in to comment.