qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH for-1.4] libi2c-omap: Fix endianness dependency


From: Anthony Liguori
Subject: Re: [Qemu-devel] [PATCH for-1.4] libi2c-omap: Fix endianness dependency
Date: Tue, 05 Feb 2013 10:58:06 -0600
User-agent: Notmuch/0.13.2+93~ged93d79 (http://notmuchmail.org) Emacs/23.3.1 (x86_64-pc-linux-gnu)

Andreas Färber <address@hidden> writes:

> From: Andreas Färber <address@hidden>
>
> The libqos driver for omap_i2c currently does not work on Big Endian.
> Introduce helpers for reading from and writing to 16-bit armel registers.
>
> This fixes tmp105-test failures on ppc.
>
> Signed-off-by: Andreas Färber <address@hidden>
> ---
>  tests/libi2c-omap.c |   51 
> ++++++++++++++++++++++++++++++++-------------------
>  1 Datei geändert, 32 Zeilen hinzugefügt(+), 19 Zeilen entfernt(-)
>
> diff --git a/tests/libi2c-omap.c b/tests/libi2c-omap.c
> index 9be57e9..7d50ef2 100644
> --- a/tests/libi2c-omap.c
> +++ b/tests/libi2c-omap.c
> @@ -12,6 +12,7 @@
>  #include <string.h>
>  
>  #include "qemu/osdep.h"
> +#include "qemu/bswap.h"
>  #include "libqtest.h"
>  
>  enum OMAPI2CRegisters {
> @@ -48,12 +49,24 @@ typedef struct OMAPI2C {
>  } OMAPI2C;
>  
>  
> +static inline void omap_i2c_read16(uint64_t addr, uint16_t *data)
> +{
> +    memread(addr, data, 2);
> +    *data = le16_to_cpu(*data);
> +}
> +
> +static inline void omap_i2c_write16(uint64_t addr, uint16_t data)
> +{
> +    data = cpu_to_le16(data);
> +    memwrite(addr, &data, 2);
> +}
> +
>  static void omap_i2c_set_slave_addr(OMAPI2C *s, uint8_t addr)
>  {
>      uint16_t data = addr;
>  
> -    memwrite(s->addr + OMAP_I2C_SA, &data, 2);
> -    memread(s->addr + OMAP_I2C_SA, &data, 2);
> +    omap_i2c_write16(s->addr + OMAP_I2C_SA, data);
> +    omap_i2c_read16(s->addr + OMAP_I2C_SA, &data);
>      g_assert_cmphex(data, ==, addr);
>  }
>  
> @@ -66,22 +79,22 @@ static void omap_i2c_send(I2CAdapter *i2c, uint8_t addr,
>      omap_i2c_set_slave_addr(s, addr);
>  
>      data = len;
> -    memwrite(s->addr + OMAP_I2C_CNT, &data, 2);
> +    omap_i2c_write16(s->addr + OMAP_I2C_CNT, data);
>  
>      data = OMAP_I2C_CON_I2C_EN |
>             OMAP_I2C_CON_TRX |
>             OMAP_I2C_CON_MST |
>             OMAP_I2C_CON_STT |
>             OMAP_I2C_CON_STP;
> -    memwrite(s->addr + OMAP_I2C_CON, &data, 2);
> -    memread(s->addr + OMAP_I2C_CON, &data, 2);
> +    omap_i2c_write16(s->addr + OMAP_I2C_CON, data);
> +    omap_i2c_read16(s->addr + OMAP_I2C_CON, &data);
>      g_assert((data & OMAP_I2C_CON_STP) != 0);
>  
> -    memread(s->addr + OMAP_I2C_STAT, &data, 2);
> +    omap_i2c_read16(s->addr + OMAP_I2C_STAT, &data);
>      g_assert((data & OMAP_I2C_STAT_NACK) == 0);
>  
>      while (len > 1) {
> -        memread(s->addr + OMAP_I2C_STAT, &data, 2);
> +        omap_i2c_read16(s->addr + OMAP_I2C_STAT, &data);
>          g_assert((data & OMAP_I2C_STAT_XRDY) != 0);
>  
>          memwrite(s->addr + OMAP_I2C_DATA, buf, 2);
> @@ -89,13 +102,13 @@ static void omap_i2c_send(I2CAdapter *i2c, uint8_t addr,
>          len -= 2;
>      }
>      if (len == 1) {
> -        memread(s->addr + OMAP_I2C_STAT, &data, 2);
> +        omap_i2c_read16(s->addr + OMAP_I2C_STAT, &data);
>          g_assert((data & OMAP_I2C_STAT_XRDY) != 0);
>  
>          memwrite(s->addr + OMAP_I2C_DATA, buf, 1);
>      }
>  
> -    memread(s->addr + OMAP_I2C_CON, &data, 2);
> +    omap_i2c_read16(s->addr + OMAP_I2C_CON, &data);
>      g_assert((data & OMAP_I2C_CON_STP) == 0);
>  }
>  
> @@ -108,32 +121,32 @@ static void omap_i2c_recv(I2CAdapter *i2c, uint8_t addr,
>      omap_i2c_set_slave_addr(s, addr);
>  
>      data = len;
> -    memwrite(s->addr + OMAP_I2C_CNT, &data, 2);
> +    omap_i2c_write16(s->addr + OMAP_I2C_CNT, data);
>  
>      data = OMAP_I2C_CON_I2C_EN |
>             OMAP_I2C_CON_MST |
>             OMAP_I2C_CON_STT |
>             OMAP_I2C_CON_STP;
> -    memwrite(s->addr + OMAP_I2C_CON, &data, 2);
> -    memread(s->addr + OMAP_I2C_CON, &data, 2);
> +    omap_i2c_write16(s->addr + OMAP_I2C_CON, data);
> +    omap_i2c_read16(s->addr + OMAP_I2C_CON, &data);
>      g_assert((data & OMAP_I2C_CON_STP) == 0);
>  
> -    memread(s->addr + OMAP_I2C_STAT, &data, 2);
> +    omap_i2c_read16(s->addr + OMAP_I2C_STAT, &data);
>      g_assert((data & OMAP_I2C_STAT_NACK) == 0);
>  
> -    memread(s->addr + OMAP_I2C_CNT, &data, 2);
> +    omap_i2c_read16(s->addr + OMAP_I2C_CNT, &data);
>      g_assert_cmpuint(data, ==, len);
>  
>      while (len > 0) {
> -        memread(s->addr + OMAP_I2C_STAT, &data, 2);
> +        omap_i2c_read16(s->addr + OMAP_I2C_STAT, &data);
>          g_assert((data & OMAP_I2C_STAT_RRDY) != 0);
>          g_assert((data & OMAP_I2C_STAT_ROVR) == 0);
>  
>          memread(s->addr + OMAP_I2C_DATA, &data, 2);
>  
> -        memread(s->addr + OMAP_I2C_STAT, &stat, 2);
> +        omap_i2c_read16(s->addr + OMAP_I2C_STAT, &stat);
>          if (unlikely(len == 1)) {
> -            *buf = data & 0xf;
> +            *buf = le16_to_cpu(data) & 0xf;

I don't really get this part.  You're effectively unswapping the bytes,
right?

Regards,

Anthony Liguori

>              buf++;
>              len--;
>          } else {
> @@ -143,7 +156,7 @@ static void omap_i2c_recv(I2CAdapter *i2c, uint8_t addr,
>          }
>      }
>  
> -    memread(s->addr + OMAP_I2C_CON, &data, 2);
> +    omap_i2c_read16(s->addr + OMAP_I2C_CON, &data);
>      g_assert((data & OMAP_I2C_CON_STP) == 0);
>  }
>  
> @@ -159,7 +172,7 @@ I2CAdapter *omap_i2c_create(uint64_t addr)
>      i2c->recv = omap_i2c_recv;
>  
>      /* verify the mmio address by looking for a known signature */
> -    memread(addr + OMAP_I2C_REV, &data, 2);
> +    omap_i2c_read16(addr + OMAP_I2C_REV, &data);
>      g_assert_cmphex(data, ==, 0x34);
>  
>      return i2c;
> -- 
> 1.7.10.4



reply via email to

[Prev in Thread] Current Thread [Next in Thread]