sparc32_dma: switch over to using IOMMU memory region and DMA API
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
This commit is contained in:
		
							parent
							
								
									8413846631
								
							
						
					
					
						commit
						c413e9a426
					
				@ -30,6 +30,7 @@
 | 
				
			|||||||
#include "hw/sparc/sparc32_dma.h"
 | 
					#include "hw/sparc/sparc32_dma.h"
 | 
				
			||||||
#include "hw/sparc/sun4m.h"
 | 
					#include "hw/sparc/sun4m.h"
 | 
				
			||||||
#include "hw/sysbus.h"
 | 
					#include "hw/sysbus.h"
 | 
				
			||||||
 | 
					#include "sysemu/dma.h"
 | 
				
			||||||
#include "qapi/error.h"
 | 
					#include "qapi/error.h"
 | 
				
			||||||
#include "trace.h"
 | 
					#include "trace.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -71,16 +72,17 @@ void ledma_memory_read(void *opaque, hwaddr addr,
 | 
				
			|||||||
                       uint8_t *buf, int len, int do_bswap)
 | 
					                       uint8_t *buf, int len, int do_bswap)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    DMADeviceState *s = opaque;
 | 
					    DMADeviceState *s = opaque;
 | 
				
			||||||
 | 
					    IOMMUState *is = (IOMMUState *)s->iommu;
 | 
				
			||||||
    int i;
 | 
					    int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    addr |= s->dmaregs[3];
 | 
					    addr |= s->dmaregs[3];
 | 
				
			||||||
    trace_ledma_memory_read(addr, len);
 | 
					    trace_ledma_memory_read(addr, len);
 | 
				
			||||||
    if (do_bswap) {
 | 
					    if (do_bswap) {
 | 
				
			||||||
        sparc_iommu_memory_read(s->iommu, addr, buf, len);
 | 
					        dma_memory_read(&is->iommu_as, addr, buf, len);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        addr &= ~1;
 | 
					        addr &= ~1;
 | 
				
			||||||
        len &= ~1;
 | 
					        len &= ~1;
 | 
				
			||||||
        sparc_iommu_memory_read(s->iommu, addr, buf, len);
 | 
					        dma_memory_read(&is->iommu_as, addr, buf, len);
 | 
				
			||||||
        for(i = 0; i < len; i += 2) {
 | 
					        for(i = 0; i < len; i += 2) {
 | 
				
			||||||
            bswap16s((uint16_t *)(buf + i));
 | 
					            bswap16s((uint16_t *)(buf + i));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -91,13 +93,14 @@ void ledma_memory_write(void *opaque, hwaddr addr,
 | 
				
			|||||||
                        uint8_t *buf, int len, int do_bswap)
 | 
					                        uint8_t *buf, int len, int do_bswap)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    DMADeviceState *s = opaque;
 | 
					    DMADeviceState *s = opaque;
 | 
				
			||||||
 | 
					    IOMMUState *is = (IOMMUState *)s->iommu;
 | 
				
			||||||
    int l, i;
 | 
					    int l, i;
 | 
				
			||||||
    uint16_t tmp_buf[32];
 | 
					    uint16_t tmp_buf[32];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    addr |= s->dmaregs[3];
 | 
					    addr |= s->dmaregs[3];
 | 
				
			||||||
    trace_ledma_memory_write(addr, len);
 | 
					    trace_ledma_memory_write(addr, len);
 | 
				
			||||||
    if (do_bswap) {
 | 
					    if (do_bswap) {
 | 
				
			||||||
        sparc_iommu_memory_write(s->iommu, addr, buf, len);
 | 
					        dma_memory_write(&is->iommu_as, addr, buf, len);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        addr &= ~1;
 | 
					        addr &= ~1;
 | 
				
			||||||
        len &= ~1;
 | 
					        len &= ~1;
 | 
				
			||||||
@ -108,7 +111,7 @@ void ledma_memory_write(void *opaque, hwaddr addr,
 | 
				
			|||||||
            for(i = 0; i < l; i += 2) {
 | 
					            for(i = 0; i < l; i += 2) {
 | 
				
			||||||
                tmp_buf[i >> 1] = bswap16(*(uint16_t *)(buf + i));
 | 
					                tmp_buf[i >> 1] = bswap16(*(uint16_t *)(buf + i));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            sparc_iommu_memory_write(s->iommu, addr, (uint8_t *)tmp_buf, l);
 | 
					            dma_memory_write(&is->iommu_as, addr, tmp_buf, l);
 | 
				
			||||||
            len -= l;
 | 
					            len -= l;
 | 
				
			||||||
            buf += l;
 | 
					            buf += l;
 | 
				
			||||||
            addr += l;
 | 
					            addr += l;
 | 
				
			||||||
@ -139,18 +142,20 @@ static void dma_set_irq(void *opaque, int irq, int level)
 | 
				
			|||||||
void espdma_memory_read(void *opaque, uint8_t *buf, int len)
 | 
					void espdma_memory_read(void *opaque, uint8_t *buf, int len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    DMADeviceState *s = opaque;
 | 
					    DMADeviceState *s = opaque;
 | 
				
			||||||
 | 
					    IOMMUState *is = (IOMMUState *)s->iommu;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    trace_espdma_memory_read(s->dmaregs[1], len);
 | 
					    trace_espdma_memory_read(s->dmaregs[1], len);
 | 
				
			||||||
    sparc_iommu_memory_read(s->iommu, s->dmaregs[1], buf, len);
 | 
					    dma_memory_read(&is->iommu_as, s->dmaregs[1], buf, len);
 | 
				
			||||||
    s->dmaregs[1] += len;
 | 
					    s->dmaregs[1] += len;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void espdma_memory_write(void *opaque, uint8_t *buf, int len)
 | 
					void espdma_memory_write(void *opaque, uint8_t *buf, int len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    DMADeviceState *s = opaque;
 | 
					    DMADeviceState *s = opaque;
 | 
				
			||||||
 | 
					    IOMMUState *is = (IOMMUState *)s->iommu;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    trace_espdma_memory_write(s->dmaregs[1], len);
 | 
					    trace_espdma_memory_write(s->dmaregs[1], len);
 | 
				
			||||||
    sparc_iommu_memory_write(s->iommu, s->dmaregs[1], buf, len);
 | 
					    dma_memory_write(&is->iommu_as, s->dmaregs[1], buf, len);
 | 
				
			||||||
    s->dmaregs[1] += len;
 | 
					    s->dmaregs[1] += len;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user