Message ID | 1449232131-17317-2-git-send-email-pbonzini@redhat.com |
---|---|
State | New |
Headers | show |
On 4 December 2015 at 12:28, Paolo Bonzini <pbonzini@redhat.com> wrote: > ARM softmmu is always compiled as little endian; BE8/BE32 can be > done as part of CPU emulation. Thus, devices need not use the > endian-dependent loads and swaps. The patch code is right, but I think the more significant point here is that the behaviour of the PXA2xx and OMAP devices being emulated here doesn't (shouldn't) depend on the CPU endianness anyway, and these devices are little endian when they do DMA accesses. > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> > --- > hw/display/omap_lcd_template.h | 4 ++-- > hw/display/pxa2xx_lcd.c | 8 ++++---- > 2 files changed, 6 insertions(+), 6 deletions(-) > > diff --git a/hw/display/omap_lcd_template.h b/hw/display/omap_lcd_template.h > index e5dd447..f0ce71f 100644 > --- a/hw/display/omap_lcd_template.h > +++ b/hw/display/omap_lcd_template.h > @@ -136,7 +136,7 @@ static void glue(draw_line12_, DEPTH)(void *opaque, > uint8_t r, g, b; > > do { > - v = lduw_p((void *) s); > + v = lduw_le_p((void *) s); > r = (v >> 4) & 0xf0; > g = v & 0xf0; > b = (v << 4) & 0xf0; > @@ -159,7 +159,7 @@ static void glue(draw_line16_, DEPTH)(void *opaque, > uint8_t r, g, b; > > do { > - v = lduw_p((void *) s); > + v = lduw_le_p((void *) s); > r = (v >> 8) & 0xf8; > g = (v >> 3) & 0xfc; > b = (v << 3) & 0xf8; > diff --git a/hw/display/pxa2xx_lcd.c b/hw/display/pxa2xx_lcd.c > index 494700d..4d36c94 100644 > --- a/hw/display/pxa2xx_lcd.c > +++ b/hw/display/pxa2xx_lcd.c > @@ -309,10 +309,10 @@ static void pxa2xx_descriptor_load(PXA2xxLCDState *s) > } > > cpu_physical_memory_read(descptr, &desc, sizeof(desc)); > - s->dma_ch[i].descriptor = tswap32(desc.fdaddr); > - s->dma_ch[i].source = tswap32(desc.fsaddr); > - s->dma_ch[i].id = tswap32(desc.fidr); > - s->dma_ch[i].command = tswap32(desc.ldcmd); > + s->dma_ch[i].descriptor = le32_to_cpu(desc.fdaddr); > + s->dma_ch[i].source = le32_to_cpu(desc.fsaddr); > + s->dma_ch[i].id = le32_to_cpu(desc.fidr); > + s->dma_ch[i].command = le32_to_cpu(desc.ldcmd); > } > } > > -- > 1.8.3.1 Reviewed-by: Peter Maydell <peter.maydell@linaro.org> thanks -- PMM
On 4 December 2015 at 12:28, Paolo Bonzini <pbonzini@redhat.com> wrote: > ARM softmmu is always compiled as little endian; BE8/BE32 can be > done as part of CPU emulation. Thus, devices need not use the > endian-dependent loads and swaps. > > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> I have applied this to target-arm.next with a tweaked commit message: arm: explicitly mark device loads as little-endian Behaviour of emulated devices should not depend on the endianness of the CPU, so avoid using the endian-dependent load and store functions in the PXA2xx and OMAP display devices. These devices are little endian when they do DMA access. (Since ARM softmmu is always compiled as little endian, this means that the endian-dependent load and store functions are always little endian, so this commit makes no functionally visible change.) thanks -- PMM
diff --git a/hw/display/omap_lcd_template.h b/hw/display/omap_lcd_template.h index e5dd447..f0ce71f 100644 --- a/hw/display/omap_lcd_template.h +++ b/hw/display/omap_lcd_template.h @@ -136,7 +136,7 @@ static void glue(draw_line12_, DEPTH)(void *opaque, uint8_t r, g, b; do { - v = lduw_p((void *) s); + v = lduw_le_p((void *) s); r = (v >> 4) & 0xf0; g = v & 0xf0; b = (v << 4) & 0xf0; @@ -159,7 +159,7 @@ static void glue(draw_line16_, DEPTH)(void *opaque, uint8_t r, g, b; do { - v = lduw_p((void *) s); + v = lduw_le_p((void *) s); r = (v >> 8) & 0xf8; g = (v >> 3) & 0xfc; b = (v << 3) & 0xf8; diff --git a/hw/display/pxa2xx_lcd.c b/hw/display/pxa2xx_lcd.c index 494700d..4d36c94 100644 --- a/hw/display/pxa2xx_lcd.c +++ b/hw/display/pxa2xx_lcd.c @@ -309,10 +309,10 @@ static void pxa2xx_descriptor_load(PXA2xxLCDState *s) } cpu_physical_memory_read(descptr, &desc, sizeof(desc)); - s->dma_ch[i].descriptor = tswap32(desc.fdaddr); - s->dma_ch[i].source = tswap32(desc.fsaddr); - s->dma_ch[i].id = tswap32(desc.fidr); - s->dma_ch[i].command = tswap32(desc.ldcmd); + s->dma_ch[i].descriptor = le32_to_cpu(desc.fdaddr); + s->dma_ch[i].source = le32_to_cpu(desc.fsaddr); + s->dma_ch[i].id = le32_to_cpu(desc.fidr); + s->dma_ch[i].command = le32_to_cpu(desc.ldcmd); } }
ARM softmmu is always compiled as little endian; BE8/BE32 can be done as part of CPU emulation. Thus, devices need not use the endian-dependent loads and swaps. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- hw/display/omap_lcd_template.h | 4 ++-- hw/display/pxa2xx_lcd.c | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-)