Loading arch/arm64/boot/dts/qcom/sm8150-mhi.dtsi +1 −1 Original line number Original line Diff line number Diff line Loading @@ -479,7 +479,7 @@ }; }; mhi_event@6 { mhi_event@6 { mhi,num-elements = <1024>; mhi,num-elements = <2048>; mhi,intmod = <5>; mhi,intmod = <5>; mhi,msi = <6>; mhi,msi = <6>; mhi,chan = <101>; mhi,chan = <101>; Loading drivers/bus/mhi/core/mhi_internal.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -366,6 +366,8 @@ enum mhi_cmd_type { #define MHI_RSCTRE_DATA_DWORD0(cookie) (cookie) #define MHI_RSCTRE_DATA_DWORD0(cookie) (cookie) #define MHI_RSCTRE_DATA_DWORD1 (MHI_PKT_TYPE_COALESCING << 16) #define MHI_RSCTRE_DATA_DWORD1 (MHI_PKT_TYPE_COALESCING << 16) #define MHI_RSC_MIN_CREDITS (8) enum MHI_CMD { enum MHI_CMD { MHI_CMD_RESET_CHAN, MHI_CMD_RESET_CHAN, MHI_CMD_START_CHAN, MHI_CMD_START_CHAN, Loading drivers/bus/mhi/core/mhi_main.c +27 −2 Original line number Original line Diff line number Diff line Loading @@ -448,6 +448,8 @@ int mhi_queue_dma(struct mhi_device *mhi_dev, struct mhi_ring *buf_ring = &mhi_chan->buf_ring; struct mhi_ring *buf_ring = &mhi_chan->buf_ring; struct mhi_buf_info *buf_info; struct mhi_buf_info *buf_info; struct mhi_tre *mhi_tre; struct mhi_tre *mhi_tre; bool ring_db = true; int nr_tre; if (mhi_is_ring_full(mhi_cntrl, tre_ring)) if (mhi_is_ring_full(mhi_cntrl, tre_ring)) return -ENOMEM; return -ENOMEM; Loading Loading @@ -489,6 +491,15 @@ int mhi_queue_dma(struct mhi_device *mhi_dev, mhi_tre->dword[0] = mhi_tre->dword[0] = MHI_RSCTRE_DATA_DWORD0(buf_ring->wp - buf_ring->base); MHI_RSCTRE_DATA_DWORD0(buf_ring->wp - buf_ring->base); mhi_tre->dword[1] = MHI_RSCTRE_DATA_DWORD1; mhi_tre->dword[1] = MHI_RSCTRE_DATA_DWORD1; /* * on RSC channel IPA HW has a minimum credit requirement before * switching to DB mode */ nr_tre = mhi_get_no_free_descriptors(mhi_dev, DMA_FROM_DEVICE); read_lock_bh(&mhi_chan->lock); if (mhi_chan->db_cfg.db_mode && nr_tre < MHI_RSC_MIN_CREDITS) ring_db = false; read_unlock_bh(&mhi_chan->lock); } else { } else { mhi_tre->ptr = MHI_TRE_DATA_PTR(buf_info->p_addr); mhi_tre->ptr = MHI_TRE_DATA_PTR(buf_info->p_addr); mhi_tre->dword[0] = MHI_TRE_DATA_DWORD0(buf_info->len); mhi_tre->dword[0] = MHI_TRE_DATA_DWORD0(buf_info->len); Loading @@ -506,7 +517,7 @@ int mhi_queue_dma(struct mhi_device *mhi_dev, if (mhi_chan->dir == DMA_TO_DEVICE) if (mhi_chan->dir == DMA_TO_DEVICE) atomic_inc(&mhi_cntrl->pending_pkts); atomic_inc(&mhi_cntrl->pending_pkts); if (likely(MHI_DB_ACCESS_VALID(mhi_cntrl))) { if (likely(MHI_DB_ACCESS_VALID(mhi_cntrl)) && ring_db) { read_lock_bh(&mhi_chan->lock); read_lock_bh(&mhi_chan->lock); mhi_ring_chan_db(mhi_cntrl, mhi_chan); mhi_ring_chan_db(mhi_cntrl, mhi_chan); read_unlock_bh(&mhi_chan->lock); read_unlock_bh(&mhi_chan->lock); Loading Loading @@ -902,6 +913,8 @@ static int parse_xfer_event(struct mhi_controller *mhi_cntrl, u32 ev_code; u32 ev_code; struct mhi_result result; struct mhi_result result; unsigned long flags = 0; unsigned long flags = 0; bool ring_db = true; int nr_tre; ev_code = MHI_TRE_GET_EV_CODE(event); ev_code = MHI_TRE_GET_EV_CODE(event); buf_ring = &mhi_chan->buf_ring; buf_ring = &mhi_chan->buf_ring; Loading Loading @@ -996,9 +1009,21 @@ static int parse_xfer_event(struct mhi_controller *mhi_cntrl, MHI_VERB("DB_MODE/OOB Detected chan %d.\n", mhi_chan->chan); MHI_VERB("DB_MODE/OOB Detected chan %d.\n", mhi_chan->chan); mhi_chan->db_cfg.db_mode = 1; mhi_chan->db_cfg.db_mode = 1; /* * on RSC channel IPA HW has a minimum credit requirement before * switching to DB mode */ if (mhi_chan->xfer_type == MHI_XFER_RSC_DMA) { nr_tre = mhi_get_no_free_descriptors(mhi_chan->mhi_dev, DMA_FROM_DEVICE); if (nr_tre < MHI_RSC_MIN_CREDITS) ring_db = false; } read_lock_irqsave(&mhi_cntrl->pm_lock, flags); read_lock_irqsave(&mhi_cntrl->pm_lock, flags); if (tre_ring->wp != tre_ring->rp && if (tre_ring->wp != tre_ring->rp && MHI_DB_ACCESS_VALID(mhi_cntrl)) { MHI_DB_ACCESS_VALID(mhi_cntrl) && ring_db) { mhi_ring_chan_db(mhi_cntrl, mhi_chan); mhi_ring_chan_db(mhi_cntrl, mhi_chan); } } read_unlock_irqrestore(&mhi_cntrl->pm_lock, flags); read_unlock_irqrestore(&mhi_cntrl->pm_lock, flags); Loading Loading
arch/arm64/boot/dts/qcom/sm8150-mhi.dtsi +1 −1 Original line number Original line Diff line number Diff line Loading @@ -479,7 +479,7 @@ }; }; mhi_event@6 { mhi_event@6 { mhi,num-elements = <1024>; mhi,num-elements = <2048>; mhi,intmod = <5>; mhi,intmod = <5>; mhi,msi = <6>; mhi,msi = <6>; mhi,chan = <101>; mhi,chan = <101>; Loading
drivers/bus/mhi/core/mhi_internal.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -366,6 +366,8 @@ enum mhi_cmd_type { #define MHI_RSCTRE_DATA_DWORD0(cookie) (cookie) #define MHI_RSCTRE_DATA_DWORD0(cookie) (cookie) #define MHI_RSCTRE_DATA_DWORD1 (MHI_PKT_TYPE_COALESCING << 16) #define MHI_RSCTRE_DATA_DWORD1 (MHI_PKT_TYPE_COALESCING << 16) #define MHI_RSC_MIN_CREDITS (8) enum MHI_CMD { enum MHI_CMD { MHI_CMD_RESET_CHAN, MHI_CMD_RESET_CHAN, MHI_CMD_START_CHAN, MHI_CMD_START_CHAN, Loading
drivers/bus/mhi/core/mhi_main.c +27 −2 Original line number Original line Diff line number Diff line Loading @@ -448,6 +448,8 @@ int mhi_queue_dma(struct mhi_device *mhi_dev, struct mhi_ring *buf_ring = &mhi_chan->buf_ring; struct mhi_ring *buf_ring = &mhi_chan->buf_ring; struct mhi_buf_info *buf_info; struct mhi_buf_info *buf_info; struct mhi_tre *mhi_tre; struct mhi_tre *mhi_tre; bool ring_db = true; int nr_tre; if (mhi_is_ring_full(mhi_cntrl, tre_ring)) if (mhi_is_ring_full(mhi_cntrl, tre_ring)) return -ENOMEM; return -ENOMEM; Loading Loading @@ -489,6 +491,15 @@ int mhi_queue_dma(struct mhi_device *mhi_dev, mhi_tre->dword[0] = mhi_tre->dword[0] = MHI_RSCTRE_DATA_DWORD0(buf_ring->wp - buf_ring->base); MHI_RSCTRE_DATA_DWORD0(buf_ring->wp - buf_ring->base); mhi_tre->dword[1] = MHI_RSCTRE_DATA_DWORD1; mhi_tre->dword[1] = MHI_RSCTRE_DATA_DWORD1; /* * on RSC channel IPA HW has a minimum credit requirement before * switching to DB mode */ nr_tre = mhi_get_no_free_descriptors(mhi_dev, DMA_FROM_DEVICE); read_lock_bh(&mhi_chan->lock); if (mhi_chan->db_cfg.db_mode && nr_tre < MHI_RSC_MIN_CREDITS) ring_db = false; read_unlock_bh(&mhi_chan->lock); } else { } else { mhi_tre->ptr = MHI_TRE_DATA_PTR(buf_info->p_addr); mhi_tre->ptr = MHI_TRE_DATA_PTR(buf_info->p_addr); mhi_tre->dword[0] = MHI_TRE_DATA_DWORD0(buf_info->len); mhi_tre->dword[0] = MHI_TRE_DATA_DWORD0(buf_info->len); Loading @@ -506,7 +517,7 @@ int mhi_queue_dma(struct mhi_device *mhi_dev, if (mhi_chan->dir == DMA_TO_DEVICE) if (mhi_chan->dir == DMA_TO_DEVICE) atomic_inc(&mhi_cntrl->pending_pkts); atomic_inc(&mhi_cntrl->pending_pkts); if (likely(MHI_DB_ACCESS_VALID(mhi_cntrl))) { if (likely(MHI_DB_ACCESS_VALID(mhi_cntrl)) && ring_db) { read_lock_bh(&mhi_chan->lock); read_lock_bh(&mhi_chan->lock); mhi_ring_chan_db(mhi_cntrl, mhi_chan); mhi_ring_chan_db(mhi_cntrl, mhi_chan); read_unlock_bh(&mhi_chan->lock); read_unlock_bh(&mhi_chan->lock); Loading Loading @@ -902,6 +913,8 @@ static int parse_xfer_event(struct mhi_controller *mhi_cntrl, u32 ev_code; u32 ev_code; struct mhi_result result; struct mhi_result result; unsigned long flags = 0; unsigned long flags = 0; bool ring_db = true; int nr_tre; ev_code = MHI_TRE_GET_EV_CODE(event); ev_code = MHI_TRE_GET_EV_CODE(event); buf_ring = &mhi_chan->buf_ring; buf_ring = &mhi_chan->buf_ring; Loading Loading @@ -996,9 +1009,21 @@ static int parse_xfer_event(struct mhi_controller *mhi_cntrl, MHI_VERB("DB_MODE/OOB Detected chan %d.\n", mhi_chan->chan); MHI_VERB("DB_MODE/OOB Detected chan %d.\n", mhi_chan->chan); mhi_chan->db_cfg.db_mode = 1; mhi_chan->db_cfg.db_mode = 1; /* * on RSC channel IPA HW has a minimum credit requirement before * switching to DB mode */ if (mhi_chan->xfer_type == MHI_XFER_RSC_DMA) { nr_tre = mhi_get_no_free_descriptors(mhi_chan->mhi_dev, DMA_FROM_DEVICE); if (nr_tre < MHI_RSC_MIN_CREDITS) ring_db = false; } read_lock_irqsave(&mhi_cntrl->pm_lock, flags); read_lock_irqsave(&mhi_cntrl->pm_lock, flags); if (tre_ring->wp != tre_ring->rp && if (tre_ring->wp != tre_ring->rp && MHI_DB_ACCESS_VALID(mhi_cntrl)) { MHI_DB_ACCESS_VALID(mhi_cntrl) && ring_db) { mhi_ring_chan_db(mhi_cntrl, mhi_chan); mhi_ring_chan_db(mhi_cntrl, mhi_chan); } } read_unlock_irqrestore(&mhi_cntrl->pm_lock, flags); read_unlock_irqrestore(&mhi_cntrl->pm_lock, flags); Loading