Merge "mhi: core: fix fast forward recycling of event rings"

This commit is contained in:
qctecmdr 2020-03-24 01:37:29 -07:00 • committed by Gerrit - the friendly Code Review server
commit 876ef7a93a
4 changed files with 46 additions and 12 deletions

View file

@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.*/
/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.*/
#include <asm/dma-iommu.h>
#include <linux/async.h>
@ -310,7 +310,6 @@ static void mhi_boot_monitor(void *data, async_cookie_t cookie)
struct mhi_controller *mhi_cntrl = data;
struct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);
struct arch_info *arch_info = mhi_dev->arch_info;
struct mhi_device *boot_dev;
/* 15 sec timeout for booting device */
const u32 timeout = msecs_to_jiffies(15000);
@ -323,15 +322,10 @@ static void mhi_boot_monitor(void *data, async_cookie_t cookie)
ipc_log_string(arch_info->boot_ipc_log, HLOG "Device current ee = %s\n",
TO_MHI_EXEC_STR(mhi_cntrl->ee));
/* if we successfully booted to amss disable boot log channel */
if (mhi_cntrl->ee == MHI_EE_AMSS) {
boot_dev = arch_info->boot_dev;
if (boot_dev)
mhi_unprepare_from_transfer(boot_dev);
/* if we successfully booted to amss, enable runtime pm */
if (mhi_cntrl->ee == MHI_EE_AMSS)
if (!mhi_dev->drv_supported || arch_info->drv_connected)
pm_runtime_allow(&mhi_dev->pci_dev->dev);
}
}
int mhi_arch_power_up(struct mhi_controller *mhi_cntrl)
@ -346,6 +340,17 @@ int mhi_arch_power_up(struct mhi_controller *mhi_cntrl)
return 0;
}
void mhi_arch_mission_mode_enter(struct mhi_controller *mhi_cntrl)
{
struct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);
struct arch_info *arch_info = mhi_dev->arch_info;
struct mhi_device *boot_dev = arch_info->boot_dev;
/* disable boot logger channel */
if (boot_dev)
mhi_unprepare_from_transfer(boot_dev);
}
static int mhi_arch_pcie_scale_bw(struct mhi_controller *mhi_cntrl,
struct pci_dev *pci_dev,
struct mhi_link_info *link_info)

View file

@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.*/
/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.*/
#include <asm/arch_timer.h>
#include <linux/debugfs.h>
@ -636,6 +636,7 @@ static void mhi_status_cb(struct mhi_controller *mhi_cntrl,
if (!ret)
mhi_runtime_resume(dev);
pm_runtime_put(dev);
mhi_arch_mission_mode_enter(mhi_cntrl);
break;
default:
MHI_ERR("Unhandled cb:0x%x\n", reason);

View file

@ -1,5 +1,5 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.*/
/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.*/
#ifndef _MHI_QCOM_
#define _MHI_QCOM_
@ -68,6 +68,7 @@ int mhi_pci_probe(struct pci_dev *pci_dev,
#ifdef CONFIG_ARCH_QCOM
void mhi_arch_mission_mode_enter(struct mhi_controller *mhi_cntrl);
int mhi_arch_power_up(struct mhi_controller *mhi_cntrl);
int mhi_arch_pcie_init(struct mhi_controller *mhi_cntrl);
void mhi_arch_pcie_deinit(struct mhi_controller *mhi_cntrl);
@ -100,6 +101,10 @@ static inline int mhi_arch_power_up(struct mhi_controller *mhi_cntrl)
return 0;
}
static inline void mhi_arch_mission_mode_enter(struct mhi_controller *mhi_cntrl)
{
}
#endif
#endif /* _MHI_QCOM_ */

View file

@ -292,6 +292,29 @@ static void mhi_recycle_ev_ring_element(struct mhi_controller *mhi_cntrl,
smp_wmb();
}
static void mhi_recycle_fwd_ev_ring_element(struct mhi_controller *mhi_cntrl,
struct mhi_ring *ring)
{
dma_addr_t ctxt_wp;
/* update the WP */
ring->wp += ring->el_size;
if (ring->wp >= (ring->base + ring->len))
ring->wp = ring->base;
/* update the context WP based on the RP to support fast forwarding */
ctxt_wp = ring->iommu_base + (ring->wp - ring->base);
*ring->ctxt_wp = ctxt_wp;
/* update the RP */
ring->rp += ring->el_size;
if (ring->rp >= (ring->base + ring->len))
ring->rp = ring->base;
/* visible to other cores */
smp_wmb();
}
static bool mhi_is_ring_full(struct mhi_controller *mhi_cntrl,
struct mhi_ring *ring)
{
@ -1451,7 +1474,7 @@ int mhi_process_bw_scale_ev_ring(struct mhi_controller *mhi_cntrl,
ev_ring->wp = dev_rp - 1;
if (ev_ring->wp < ev_ring->base)
ev_ring->wp = ev_ring->base + ev_ring->len - ev_ring->el_size;
mhi_recycle_ev_ring_element(mhi_cntrl, ev_ring);
mhi_recycle_fwd_ev_ring_element(mhi_cntrl, ev_ring);
read_lock_bh(&mhi_cntrl->pm_lock);
if (likely(MHI_DB_ACCESS_VALID(mhi_cntrl)))