summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorAndrei Danaila <adanaila@codeaurora.org>2014-10-14 20:33:43 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 21:10:53 -0700
commit9de41649cc23a3b77e4690dd56f0d4e970021282 (patch)
tree8cba1e5032a4f524c3be794b215c6a2f666d05af /drivers
parenta7cbc2b96f3557143f40eb9f71bce5b481c2a251 (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.c34
-rw-r--r--drivers/platform/msm/mhi/mhi_bhi.h7
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);