[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
- [Qemu-devel] [PATCH for-1.4] libi2c-omap: Fix endianness dependency, Andreas Färber, 2013/02/02
- Re: [Qemu-devel] [PATCH for-1.4] libi2c-omap: Fix endianness dependency, Peter Maydell, 2013/02/02
- Re: [Qemu-devel] [PATCH for-1.4] libi2c-omap: Fix endianness dependency, Andreas Färber, 2013/02/02
- Re: [Qemu-devel] [PATCH for-1.4] libi2c-omap: Fix endianness dependency, Peter Maydell, 2013/02/02
- Re: [Qemu-devel] [PATCH for-1.4] libi2c-omap: Fix endianness dependency, Andreas Färber, 2013/02/02
- Re: [Qemu-devel] [PATCH for-1.4] libi2c-omap: Fix endianness dependency, Blue Swirl, 2013/02/02
- Re: [Qemu-devel] [PATCH for-1.4] libi2c-omap: Fix endianness dependency, Peter Maydell, 2013/02/02
- Re: [Qemu-devel] [PATCH for-1.4] libi2c-omap: Fix endianness dependency, Blue Swirl, 2013/02/02
- Re: [Qemu-devel] [PATCH for-1.4] libi2c-omap: Fix endianness dependency, Anthony Liguori, 2013/02/04
Re: [Qemu-devel] [PATCH for-1.4] libi2c-omap: Fix endianness dependency,
Anthony Liguori <=
Re: [Qemu-devel] [PATCH for-1.4] libi2c-omap: Fix endianness dependency, Anthony Liguori, 2013/02/12