Rather than have dvma_alloc() store the result of the physical translation in the specified location, use the fact that we now have contiguous physical DMA memory to implement dvma_map_in() to perform the translation separately.
This allows us to remove the pointer to the physical address parameter to dvma_alloc() and instead perform the translation in esp.c by calling dvma_map_in() separately.
Signed-off-by: Mark Cave-Ayland mark.cave-ayland@ilande.co.uk --- drivers/esp.c | 3 ++- drivers/iommu.c | 17 ++++++++++++++--- include/drivers/drivers.h | 3 ++- 3 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/drivers/esp.c b/drivers/esp.c index a4d6ef4..44b2096 100644 --- a/drivers/esp.c +++ b/drivers/esp.c @@ -490,7 +490,8 @@ ob_esp_init(unsigned int slot, uint64_t base, unsigned long espoffset, return -1; }
- esp->buffer = (void *)dvma_alloc(BUFSIZE, &esp->buffer_dvma); + esp->buffer = (void *)dvma_alloc(BUFSIZE); + esp->buffer_dvma = dvma_map_in(esp->buffer); if (!esp->buffer || !esp->buffer_dvma) { DPRINTF("Can't get a DVMA buffer\n"); return -1; diff --git a/drivers/iommu.c b/drivers/iommu.c index 0bf742f..b8ec09e 100644 --- a/drivers/iommu.c +++ b/drivers/iommu.c @@ -43,7 +43,7 @@ iommu_invalidate(struct iommu_regs *iregs) * BTW, we were not going to give away anonymous storage, were we not? */ void * -dvma_alloc(int size, unsigned int *pphys) +dvma_alloc(int size) { void *va; unsigned int pa, iova; @@ -78,11 +78,22 @@ dvma_alloc(int size, unsigned int *pphys) mpa += PAGE_SIZE; }
- *pphys = iova; - return va; }
+unsigned int +dvma_map_in(unsigned char *va) +{ + /* Convert from VA to IOVA */ + unsigned int pa, iova; + struct iommu *t = &ciommu; + + pa = va2pa((unsigned int)va); + iova = t->plow + (pa - t->pphys); + + return iova; +} + #define DVMA_SIZE 0x4000
/* diff --git a/include/drivers/drivers.h b/include/drivers/drivers.h index 59ee436..85a8db0 100644 --- a/include/drivers/drivers.h +++ b/include/drivers/drivers.h @@ -73,7 +73,8 @@ void ss5_init(uint64_t base);
/* drivers/iommu.c */ void ob_init_iommu(uint64_t base); -void *dvma_alloc(int size, unsigned int *pphys); +void *dvma_alloc(int size); +unsigned int dvma_map_in(unsigned char *va);
/* drivers/sbus.c */ extern uint16_t graphic_depth;