diff options
| author | Andrei Danaila <adanaila@codeaurora.org> | 2014-10-14 20:33:43 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 21:10:53 -0700 |
| commit | 9de41649cc23a3b77e4690dd56f0d4e970021282 (patch) | |
| tree | 8cba1e5032a4f524c3be794b215c6a2f666d05af /drivers | |
| parent | a7cbc2b96f3557143f40eb9f71bce5b481c2a251 (diff) | |
msm: mhi: Fix issues regarding BHI img load
Resolve issue regarding BHI image load process.
Interface will no longer be published to userspace
before local initialization is complete.
Register masks and retry mechanism are also cleaned up.
Change-Id: I05d87d4be5e9c05c6beb2b7b0c0234757b93097d
Signed-off-by: Andrei Danaila <adanaila@codeaurora.org>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/platform/msm/mhi/mhi_bhi.c | 34 | ||||
| -rw-r--r-- | drivers/platform/msm/mhi/mhi_bhi.h | 7 |
2 files changed, 27 insertions, 14 deletions
diff --git a/drivers/platform/msm/mhi/mhi_bhi.c b/drivers/platform/msm/mhi/mhi_bhi.c index 7ab1c3dc276d..4bd856eab917 100644 --- a/drivers/platform/msm/mhi/mhi_bhi.c +++ b/drivers/platform/msm/mhi/mhi_bhi.c @@ -73,6 +73,7 @@ static ssize_t bhi_write(struct file *file, goto bhi_copy_error; } amount_copied = count; + wmb(); mhi_log(MHI_MSG_INFO, "Copied image from user at addr: %p\n", bhi_ctxt->image_loc); bhi_ctxt->phy_image_loc = dma_map_single(NULL, @@ -114,13 +115,20 @@ static ssize_t bhi_write(struct file *file, mhi_reg_write_field(mhi_dev_ctxt, bhi_ctxt->bhi_base, BHI_IMGTXDB, 0xFFFFFFFF, 0, ++pcie_word_val); + mhi_reg_write(mhi_dev_ctxt, bhi_ctxt->bhi_base, BHI_INTVEC, 0); + for (i = 0; i < BHI_POLL_NR_RETRIES; ++i) { - tx_db_val = mhi_reg_read(bhi_ctxt->bhi_base, BHI_STATUS); - if ((0x80000000 | tx_db_val) == pcie_word_val) - break; - else + tx_db_val = mhi_reg_read_field(bhi_ctxt->bhi_base, + BHI_STATUS, + BHI_STATUS_MASK, + BHI_STATUS_SHIFT); + mhi_log(MHI_MSG_CRITICAL, "BHI STATUS 0x%x\n", tx_db_val); + if (BHI_STATUS_SUCCESS != tx_db_val) mhi_log(MHI_MSG_CRITICAL, - "BHI STATUS 0x%x\n", pcie_word_val); + "Incorrect BHI status: %d retry: %d\n", + tx_db_val, i); + else + break; usleep_range(20000, 25000); } dma_unmap_single(NULL, bhi_ctxt->phy_image_loc, @@ -157,6 +165,14 @@ int bhi_probe(struct mhi_pcie_dev_info *mhi_pcie_device) || 0 == mhi_pcie_device->core.bar0_end) return -EIO; + bhi_ctxt->bhi_base = mhi_pcie_device->core.bar0_base; + pcie_word_val = mhi_reg_read(bhi_ctxt->bhi_base, BHIOFF); + bhi_ctxt->bhi_base += pcie_word_val; + wmb(); + + mhi_log(MHI_MSG_INFO, + "Successfully registered char dev. bhi base is: 0x%p.\n", + bhi_ctxt->bhi_base); ret_val = alloc_chrdev_region(&bhi_ctxt->bhi_dev, 0, 1, "bhi"); if (IS_ERR_VALUE(ret_val)) { mhi_log(MHI_MSG_CRITICAL, @@ -184,14 +200,6 @@ int bhi_probe(struct mhi_pcie_dev_info *mhi_pcie_device) r = (int)bhi_ctxt->dev; goto err_dev_create; } - - bhi_ctxt->bhi_base = mhi_pcie_device->core.bar0_base; - pcie_word_val = mhi_reg_read(bhi_ctxt->bhi_base, BHIOFF); - bhi_ctxt->bhi_base += pcie_word_val; - - mhi_log(MHI_MSG_INFO, - "Successfully registered char dev. bhi base is: 0x%p.\n", - bhi_ctxt->bhi_base); return 0; err_dev_create: cdev_del(&bhi_ctxt->cdev); diff --git a/drivers/platform/msm/mhi/mhi_bhi.h b/drivers/platform/msm/mhi/mhi_bhi.h index cb5510f73e14..ca44f69cea42 100644 --- a/drivers/platform/msm/mhi/mhi_bhi.h +++ b/drivers/platform/msm/mhi/mhi_bhi.h @@ -36,6 +36,11 @@ #define BHI_MSMHWID(n) (0x4C + 0x4 * (n)) #define BHI_OEMPKHASH(n) (0x64 + 0x4 * (n)) #define BHI_RSVD5 (0xC4) +#define BHI_STATUS_MASK (0xC0000000) +#define BHI_STATUS_SHIFT (30) +#define BHI_STATUS_ERROR (3) +#define BHI_STATUS_SUCCESS (2) +#define BHI_STATUS_RESET (0) #define BHI_MAJOR_VERSION 0x0 #define BHI_MINOR_VERSION 0x1 @@ -48,7 +53,7 @@ #define BHI_MAX_IMAGE_SIZE (256 * 1024) #define BHI_POLL_SLEEP_TIME 1000 -#define BHI_POLL_NR_RETRIES 1 +#define BHI_POLL_NR_RETRIES 10 int bhi_probe(struct mhi_pcie_dev_info *mhi_pcie_device); |
