Loading drivers/bus/mhi/controllers/mhi_arch_qcom.c +14 −9 Original line number Diff line number Diff line // 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> Loading Loading @@ -338,7 +338,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); Loading @@ -351,16 +350,11 @@ 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) { Loading @@ -374,6 +368,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) Loading drivers/bus/mhi/controllers/mhi_qcom.c +2 −1 Original line number Diff line number Diff line // 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> Loading Loading @@ -637,6 +637,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); Loading drivers/bus/mhi/controllers/mhi_qcom.h +6 −1 Original line number Diff line number Diff line /* 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_ Loading Loading @@ -71,6 +71,7 @@ void mhi_reg_write_work(struct work_struct *w); #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); Loading Loading @@ -103,6 +104,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_ */ drivers/bus/mhi/core/mhi_main.c +24 −1 Original line number Diff line number Diff line Loading @@ -333,6 +333,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) { Loading Loading @@ -1542,7 +1565,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))) Loading Loading
drivers/bus/mhi/controllers/mhi_arch_qcom.c +14 −9 Original line number Diff line number Diff line // 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> Loading Loading @@ -338,7 +338,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); Loading @@ -351,16 +350,11 @@ 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) { Loading @@ -374,6 +368,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) Loading
drivers/bus/mhi/controllers/mhi_qcom.c +2 −1 Original line number Diff line number Diff line // 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> Loading Loading @@ -637,6 +637,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); Loading
drivers/bus/mhi/controllers/mhi_qcom.h +6 −1 Original line number Diff line number Diff line /* 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_ Loading Loading @@ -71,6 +71,7 @@ void mhi_reg_write_work(struct work_struct *w); #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); Loading Loading @@ -103,6 +104,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_ */
drivers/bus/mhi/core/mhi_main.c +24 −1 Original line number Diff line number Diff line Loading @@ -333,6 +333,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) { Loading Loading @@ -1542,7 +1565,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))) Loading