mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.4 KiB
93 lines
2.4 KiB
/* SPDX-License-Identifier: GPL-2.0 */ |
|
/* iommu.h: Definitions for the sun5 IOMMU. |
|
* |
|
* Copyright (C) 1996, 1999, 2007 David S. Miller ([email protected]) |
|
*/ |
|
#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 |
|
#include <asm/iommu-common.h> |
|
|
|
struct iommu_arena { |
|
unsigned long *map; |
|
unsigned int hint; |
|
unsigned int limit; |
|
}; |
|
|
|
#define ATU_64_SPACE_SIZE 0x800000000 /* 32G */ |
|
|
|
/* Data structures for SPARC ATU architecture */ |
|
struct atu_iotsb { |
|
void *table; /* IOTSB table base virtual addr*/ |
|
u64 ra; /* IOTSB table real addr */ |
|
u64 dvma_size; /* ranges[3].size or OS slected 32G size */ |
|
u64 dvma_base; /* ranges[3].base */ |
|
u64 table_size; /* IOTSB table size */ |
|
u64 page_size; /* IO PAGE size for IOTSB */ |
|
u32 iotsb_num; /* tsbnum is same as iotsb_handle */ |
|
}; |
|
|
|
struct atu_ranges { |
|
u64 base; |
|
u64 size; |
|
}; |
|
|
|
struct atu { |
|
struct atu_ranges *ranges; |
|
struct atu_iotsb *iotsb; |
|
struct iommu_map_table tbl; |
|
u64 base; |
|
u64 size; |
|
u64 dma_addr_mask; |
|
}; |
|
|
|
struct iommu { |
|
struct iommu_map_table tbl; |
|
struct atu *atu; |
|
spinlock_t lock; |
|
u32 dma_addr_mask; |
|
iopte_t *page_table; |
|
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); |
|
}; |
|
|
|
struct strbuf { |
|
int strbuf_enabled; |
|
unsigned long strbuf_control; |
|
unsigned long strbuf_pflush; |
|
unsigned long strbuf_fsync; |
|
unsigned long strbuf_err_stat; |
|
unsigned long strbuf_tag_diag; |
|
unsigned long strbuf_line_diag; |
|
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)]; |
|
}; |
|
|
|
int iommu_table_init(struct iommu *iommu, int tsbsize, |
|
u32 dma_offset, u32 dma_addr_mask, |
|
int numa_node); |
|
|
|
#endif /* !(_SPARC64_IOMMU_H) */
|
|
|