I encountered some problems getting the MHI driver to work on an Octeon
3 platform these seem to all be related to endianness issues. The modem
interface appears to require the DMA structures to be in little endian,
however the MHI core driver was assembling them in native endianness.
Using little endian explicitly allows the interface to function as
expected.
Changes in v4:
- add Fixes and Reviewed-By tags as requested/offered.
Changes in v3:
- removed change of doorbell helper functions db_val type from
dma_addr_t to __le64 favouring doing conversion only when writing to
context wp fields.
Changes in v2:
- use __fls instead of find_last_bit in pm_state conversion patch as
requested by Hemant Kumar <[email protected]>
Paul Davey (2):
bus: mhi: Fix pm_state conversion to string
bus: mhi: Fix MHI DMA structure endianness
drivers/bus/mhi/core/debugfs.c | 26 +++----
drivers/bus/mhi/core/init.c | 43 ++++++------
drivers/bus/mhi/core/internal.h | 119 ++++++++++++++++----------------
drivers/bus/mhi/core/main.c | 22 +++---
drivers/bus/mhi/core/pm.c | 4 +-
5 files changed, 109 insertions(+), 105 deletions(-)
--
2.32.0
On big endian architectures the mhi debugfs files which report pm state
give "Invalid State" for all states. This is caused by using
find_last_bit which takes an unsigned long* while the state is passed in
as an enum mhi_pm_state which will be of int size.
Fix by using __fls to pass the value of state instead of find_last_bit.
Fixes: a6e2e3522f29 ("bus: mhi: core: Add support for PM state transitions")
Cc: [email protected]
Reviewed-by: Manivannan Sadhasivam <[email protected]>
Reviewed-by: Hemant Kumar <[email protected]>
Signed-off-by: Paul Davey <[email protected]>
---
drivers/bus/mhi/core/init.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c
index 5aaca6d0f52b..0d588b60929e 100644
--- a/drivers/bus/mhi/core/init.c
+++ b/drivers/bus/mhi/core/init.c
@@ -79,9 +79,12 @@ static const char * const mhi_pm_state_str[] = {
const char *to_mhi_pm_state_str(enum mhi_pm_state state)
{
- int index = find_last_bit((unsigned long *)&state, 32);
+ int index;
- if (index >= ARRAY_SIZE(mhi_pm_state_str))
+ if (state)
+ index = __fls(state);
+
+ if (!state || index >= ARRAY_SIZE(mhi_pm_state_str))
return "Invalid State";
return mhi_pm_state_str[index];
--
2.32.0
On Thu, Aug 12, 2021 at 03:16:58PM +1200, Paul Davey wrote:
> I encountered some problems getting the MHI driver to work on an Octeon
> 3 platform these seem to all be related to endianness issues. The modem
> interface appears to require the DMA structures to be in little endian,
> however the MHI core driver was assembling them in native endianness.
>
> Using little endian explicitly allows the interface to function as
> expected.
>
> Changes in v4:
> - add Fixes and Reviewed-By tags as requested/offered.
> Changes in v3:
> - removed change of doorbell helper functions db_val type from
> dma_addr_t to __le64 favouring doing conversion only when writing to
> context wp fields.
> Changes in v2:
> - use __fls instead of find_last_bit in pm_state conversion patch as
> requested by Hemant Kumar <[email protected]>
>
> Paul Davey (2):
> bus: mhi: Fix pm_state conversion to string
> bus: mhi: Fix MHI DMA structure endianness
I've included these two patches two my MHI endpoint patch series. But I
hope to merge these along with MHI host cleanup patches separately for
v5.18.
Thanks,
Mani
>
> drivers/bus/mhi/core/debugfs.c | 26 +++----
> drivers/bus/mhi/core/init.c | 43 ++++++------
> drivers/bus/mhi/core/internal.h | 119 ++++++++++++++++----------------
> drivers/bus/mhi/core/main.c | 22 +++---
> drivers/bus/mhi/core/pm.c | 4 +-
> 5 files changed, 109 insertions(+), 105 deletions(-)
>
> --
> 2.32.0
>