ad7ad57c61
Fully unify all of the DMA ops so that subordinate bus types to the DMA operation providers (such as ebus, isa, of_device) can work transparently. Basically, we just make sure that for every system device we create, the dev->archdata 'iommu' and 'stc' fields are filled in. Then we have two platform variants of the DMA ops, one for SUN4U which actually programs the real hardware, and one for SUN4V which makes hypervisor calls. This also fixes the crashes in parport_pc on sparc64, reported by Meelis Roos. Signed-off-by: David S. Miller <davem@davemloft.net>
60 lines
1.6 KiB
C
60 lines
1.6 KiB
C
/* iommu.h: Definitions for the sun5 IOMMU.
|
|
*
|
|
* Copyright (C) 1996, 1999, 2007 David S. Miller (davem@davemloft.net)
|
|
*/
|
|
#ifndef _SPARC64_IOMMU_H
|
|
#define _SPARC64_IOMMU_H
|
|
|
|
/* The format of an iopte in the page tables. */
|
|
#define IOPTE_VALID 0x8000000000000000UL
|
|
#define IOPTE_64K 0x2000000000000000UL
|
|
#define IOPTE_STBUF 0x1000000000000000UL
|
|
#define IOPTE_INTRA 0x0800000000000000UL
|
|
#define IOPTE_CONTEXT 0x07ff800000000000UL
|
|
#define IOPTE_PAGE 0x00007fffffffe000UL
|
|
#define IOPTE_CACHE 0x0000000000000010UL
|
|
#define IOPTE_WRITE 0x0000000000000002UL
|
|
|
|
#define IOMMU_NUM_CTXS 4096
|
|
|
|
struct iommu_arena {
|
|
unsigned long *map;
|
|
unsigned int hint;
|
|
unsigned int limit;
|
|
};
|
|
|
|
struct iommu {
|
|
spinlock_t lock;
|
|
struct iommu_arena arena;
|
|
iopte_t *page_table;
|
|
u32 page_table_map_base;
|
|
unsigned long iommu_control;
|
|
unsigned long iommu_tsbbase;
|
|
unsigned long iommu_flush;
|
|
unsigned long iommu_flushinv;
|
|
unsigned long iommu_tags;
|
|
unsigned long iommu_ctxflush;
|
|
unsigned long write_complete_reg;
|
|
unsigned long dummy_page;
|
|
unsigned long dummy_page_pa;
|
|
unsigned long ctx_lowest_free;
|
|
DECLARE_BITMAP(ctx_bitmap, IOMMU_NUM_CTXS);
|
|
u32 dma_addr_mask;
|
|
};
|
|
|
|
struct strbuf {
|
|
int strbuf_enabled;
|
|
unsigned long strbuf_control;
|
|
unsigned long strbuf_pflush;
|
|
unsigned long strbuf_fsync;
|
|
unsigned long strbuf_ctxflush;
|
|
unsigned long strbuf_ctxmatch_base;
|
|
unsigned long strbuf_flushflag_pa;
|
|
volatile unsigned long *strbuf_flushflag;
|
|
volatile unsigned long __flushflag_buf[(64+(64-1)) / sizeof(long)];
|
|
};
|
|
|
|
extern int iommu_table_init(struct iommu *iommu, int tsbsize,
|
|
u32 dma_offset, u32 dma_addr_mask);
|
|
|
|
#endif /* !(_SPARC64_IOMMU_H) */
|