mhi.lists.linux.dev archive mirror
 help / color / mirror / Atom feed
* [PATCH] bus: mhi: host: fix endianness of BHI vector table
@ 2025-05-15  9:25 Alexander Wilhelm
  2025-05-15  9:38 ` Loic Poulain
  0 siblings, 1 reply; 4+ messages in thread
From: Alexander Wilhelm @ 2025-05-15  9:25 UTC (permalink / raw)
  To: Manivannan Sadhasivam; +Cc: Alexander Wilhelm, mhi, linux-arm-msm, linux-kernel

On big endian platforms like PowerPC the DMA address and size are required
to be swapped. Otherwise the MHI bus does not start properly. The following
example shows the error messages by using qcn9274 wireless radio module
with ath12k driver:

    ath12k_pci 0001:01:00.0: BAR 0: assigned [mem 0xc00000000-0xc001fffff 64bit]
    ath12k_pci 0001:01:00.0: MSI vectors: 1
    ath12k_pci 0001:01:00.0: Hardware name: qcn9274 hw2.0
    ath12k_pci 0001:01:00.0: failed to set mhi state: POWER_ON(2)
    ath12k_pci 0001:01:00.0: failed to start mhi: -110
    ath12k_pci 0001:01:00.0: failed to power up :-110
    ath12k_pci 0001:01:00.0: failed to create soc core: -110
    ath12k_pci 0001:01:00.0: failed to init core: -110
    ath12k_pci: probe of 0001:01:00.0 failed with error -110

Signed-off-by: Alexander Wilhelm <alexander.wilhelm@westermo.com>
---
 drivers/bus/mhi/host/boot.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/bus/mhi/host/boot.c b/drivers/bus/mhi/host/boot.c
index efa3b6dddf4d..205d83ac069f 100644
--- a/drivers/bus/mhi/host/boot.c
+++ b/drivers/bus/mhi/host/boot.c
@@ -31,8 +31,8 @@ int mhi_rddm_prepare(struct mhi_controller *mhi_cntrl,
 	int ret;
 
 	for (i = 0; i < img_info->entries - 1; i++, mhi_buf++, bhi_vec++) {
-		bhi_vec->dma_addr = mhi_buf->dma_addr;
-		bhi_vec->size = mhi_buf->len;
+		bhi_vec->dma_addr = cpu_to_le64(mhi_buf->dma_addr);
+		bhi_vec->size = cpu_to_le64(mhi_buf->len);
 	}
 
 	dev_dbg(dev, "BHIe programming for RDDM\n");
@@ -431,8 +431,8 @@ static void mhi_firmware_copy_bhie(struct mhi_controller *mhi_cntrl,
 	while (remainder) {
 		to_cpy = min(remainder, mhi_buf->len);
 		memcpy(mhi_buf->buf, buf, to_cpy);
-		bhi_vec->dma_addr = mhi_buf->dma_addr;
-		bhi_vec->size = to_cpy;
+		bhi_vec->dma_addr = cpu_to_le64(mhi_buf->dma_addr);
+		bhi_vec->size = cpu_to_le64(to_cpy);
 
 		buf += to_cpy;
 		remainder -= to_cpy;
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH] bus: mhi: host: fix endianness of BHI vector table
@ 2025-05-15  9:31 Alexander Wilhelm
  0 siblings, 0 replies; 4+ messages in thread
From: Alexander Wilhelm @ 2025-05-15  9:31 UTC (permalink / raw)
  To: Manivannan Sadhasivam; +Cc: mhi, linux-arm-msm, linux-kernel

On big endian platforms like PowerPC the DMA address and size are required
to be swapped. Otherwise the MHI bus does not start properly. The following
example shows the error messages by using qcn9274 wireless radio module
with ath12k driver:

    ath12k_pci 0001:01:00.0: BAR 0: assigned [mem 0xc00000000-0xc001fffff 64bit]
    ath12k_pci 0001:01:00.0: MSI vectors: 1
    ath12k_pci 0001:01:00.0: Hardware name: qcn9274 hw2.0
    ath12k_pci 0001:01:00.0: failed to set mhi state: POWER_ON(2)
    ath12k_pci 0001:01:00.0: failed to start mhi: -110
    ath12k_pci 0001:01:00.0: failed to power up :-110
    ath12k_pci 0001:01:00.0: failed to create soc core: -110
    ath12k_pci 0001:01:00.0: failed to init core: -110
    ath12k_pci: probe of 0001:01:00.0 failed with error -110

Signed-off-by: Alexander Wilhelm <alexander.wilhelm@westermo.com>
---
 drivers/bus/mhi/host/boot.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/bus/mhi/host/boot.c b/drivers/bus/mhi/host/boot.c
index efa3b6dddf4d..205d83ac069f 100644
--- a/drivers/bus/mhi/host/boot.c
+++ b/drivers/bus/mhi/host/boot.c
@@ -31,8 +31,8 @@ int mhi_rddm_prepare(struct mhi_controller *mhi_cntrl,
 	int ret;
 
 	for (i = 0; i < img_info->entries - 1; i++, mhi_buf++, bhi_vec++) {
-		bhi_vec->dma_addr = mhi_buf->dma_addr;
-		bhi_vec->size = mhi_buf->len;
+		bhi_vec->dma_addr = cpu_to_le64(mhi_buf->dma_addr);
+		bhi_vec->size = cpu_to_le64(mhi_buf->len);
 	}
 
 	dev_dbg(dev, "BHIe programming for RDDM\n");
@@ -431,8 +431,8 @@ static void mhi_firmware_copy_bhie(struct mhi_controller *mhi_cntrl,
 	while (remainder) {
 		to_cpy = min(remainder, mhi_buf->len);
 		memcpy(mhi_buf->buf, buf, to_cpy);
-		bhi_vec->dma_addr = mhi_buf->dma_addr;
-		bhi_vec->size = to_cpy;
+		bhi_vec->dma_addr = cpu_to_le64(mhi_buf->dma_addr);
+		bhi_vec->size = cpu_to_le64(to_cpy);
 
 		buf += to_cpy;
 		remainder -= to_cpy;
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] bus: mhi: host: fix endianness of BHI vector table
  2025-05-15  9:25 [PATCH] bus: mhi: host: fix endianness of BHI vector table Alexander Wilhelm
@ 2025-05-15  9:38 ` Loic Poulain
  2025-05-15  9:46   ` Alexander Wilhelm
  0 siblings, 1 reply; 4+ messages in thread
From: Loic Poulain @ 2025-05-15  9:38 UTC (permalink / raw)
  To: Alexander Wilhelm; +Cc: Manivannan Sadhasivam, mhi, linux-arm-msm, linux-kernel

On Thu, May 15, 2025 at 11:26 AM Alexander Wilhelm
<alexander.wilhelm@westermo.com> wrote:
>
> On big endian platforms like PowerPC the DMA address and size are required
> to be swapped. Otherwise the MHI bus does not start properly. The following
> example shows the error messages by using qcn9274 wireless radio module
> with ath12k driver:
>
>     ath12k_pci 0001:01:00.0: BAR 0: assigned [mem 0xc00000000-0xc001fffff 64bit]
>     ath12k_pci 0001:01:00.0: MSI vectors: 1
>     ath12k_pci 0001:01:00.0: Hardware name: qcn9274 hw2.0
>     ath12k_pci 0001:01:00.0: failed to set mhi state: POWER_ON(2)
>     ath12k_pci 0001:01:00.0: failed to start mhi: -110
>     ath12k_pci 0001:01:00.0: failed to power up :-110
>     ath12k_pci 0001:01:00.0: failed to create soc core: -110
>     ath12k_pci 0001:01:00.0: failed to init core: -110
>     ath12k_pci: probe of 0001:01:00.0 failed with error -110
>
> Signed-off-by: Alexander Wilhelm <alexander.wilhelm@westermo.com>
> ---
>  drivers/bus/mhi/host/boot.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/bus/mhi/host/boot.c b/drivers/bus/mhi/host/boot.c
> index efa3b6dddf4d..205d83ac069f 100644
> --- a/drivers/bus/mhi/host/boot.c
> +++ b/drivers/bus/mhi/host/boot.c
> @@ -31,8 +31,8 @@ int mhi_rddm_prepare(struct mhi_controller *mhi_cntrl,
>         int ret;
>
>         for (i = 0; i < img_info->entries - 1; i++, mhi_buf++, bhi_vec++) {
> -               bhi_vec->dma_addr = mhi_buf->dma_addr;
> -               bhi_vec->size = mhi_buf->len;
> +               bhi_vec->dma_addr = cpu_to_le64(mhi_buf->dma_addr);
> +               bhi_vec->size = cpu_to_le64(mhi_buf->len);

Ok, but then I think the bhi_vec_entry struct should be fixed as well,
using __le64 fields.

Regards,
Loic

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] bus: mhi: host: fix endianness of BHI vector table
  2025-05-15  9:38 ` Loic Poulain
@ 2025-05-15  9:46   ` Alexander Wilhelm
  0 siblings, 0 replies; 4+ messages in thread
From: Alexander Wilhelm @ 2025-05-15  9:46 UTC (permalink / raw)
  To: Loic Poulain; +Cc: Manivannan Sadhasivam, mhi, linux-arm-msm, linux-kernel

Am Thu, May 15, 2025 at 11:38:43AM +0200 schrieb Loic Poulain:
> On Thu, May 15, 2025 at 11:26 AM Alexander Wilhelm
> <alexander.wilhelm@westermo.com> wrote:
> >
> > On big endian platforms like PowerPC the DMA address and size are required
> > to be swapped. Otherwise the MHI bus does not start properly. The following
> > example shows the error messages by using qcn9274 wireless radio module
> > with ath12k driver:
> >
> >     ath12k_pci 0001:01:00.0: BAR 0: assigned [mem 0xc00000000-0xc001fffff 64bit]
> >     ath12k_pci 0001:01:00.0: MSI vectors: 1
> >     ath12k_pci 0001:01:00.0: Hardware name: qcn9274 hw2.0
> >     ath12k_pci 0001:01:00.0: failed to set mhi state: POWER_ON(2)
> >     ath12k_pci 0001:01:00.0: failed to start mhi: -110
> >     ath12k_pci 0001:01:00.0: failed to power up :-110
> >     ath12k_pci 0001:01:00.0: failed to create soc core: -110
> >     ath12k_pci 0001:01:00.0: failed to init core: -110
> >     ath12k_pci: probe of 0001:01:00.0 failed with error -110
> >
> > Signed-off-by: Alexander Wilhelm <alexander.wilhelm@westermo.com>
> > ---
> >  drivers/bus/mhi/host/boot.c | 8 ++++----
> >  1 file changed, 4 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/bus/mhi/host/boot.c b/drivers/bus/mhi/host/boot.c
> > index efa3b6dddf4d..205d83ac069f 100644
> > --- a/drivers/bus/mhi/host/boot.c
> > +++ b/drivers/bus/mhi/host/boot.c
> > @@ -31,8 +31,8 @@ int mhi_rddm_prepare(struct mhi_controller *mhi_cntrl,
> >         int ret;
> >
> >         for (i = 0; i < img_info->entries - 1; i++, mhi_buf++, bhi_vec++) {
> > -               bhi_vec->dma_addr = mhi_buf->dma_addr;
> > -               bhi_vec->size = mhi_buf->len;
> > +               bhi_vec->dma_addr = cpu_to_le64(mhi_buf->dma_addr);
> > +               bhi_vec->size = cpu_to_le64(mhi_buf->len);
> 
> Ok, but then I think the bhi_vec_entry struct should be fixed as well,
> using __le64 fields.
> 
> Regards,
> Loic

Sure, I'll fix that. Thank you.

Best regards
Alexander Wilhelm

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2025-05-15  9:47 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-05-15  9:25 [PATCH] bus: mhi: host: fix endianness of BHI vector table Alexander Wilhelm
2025-05-15  9:38 ` Loic Poulain
2025-05-15  9:46   ` Alexander Wilhelm
  -- strict thread matches above, loose matches on Subject: below --
2025-05-15  9:31 Alexander Wilhelm

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).