Revision f930d07e hw/iommu.c
b/hw/iommu.c | ||
---|---|---|
81 | 81 |
#define IOMMU_SBCFG_BA16 0x00000004 /* Slave supports 16 byte bursts */ |
82 | 82 |
#define IOMMU_SBCFG_BA8 0x00000002 /* Slave supports 8 byte bursts */ |
83 | 83 |
#define IOMMU_SBCFG_BYPASS 0x00000001 /* Bypass IOMMU, treat all addresses |
84 |
produced by this device as pure
|
|
84 |
produced by this device as pure
|
|
85 | 85 |
physical. */ |
86 | 86 |
#define IOMMU_SBCFG_MASK 0x00010003 |
87 | 87 |
|
... | ... | |
98 | 98 |
|
99 | 99 |
#define PAGE_SHIFT 12 |
100 | 100 |
#define PAGE_SIZE (1 << PAGE_SHIFT) |
101 |
#define PAGE_MASK (PAGE_SIZE - 1)
|
|
101 |
#define PAGE_MASK (PAGE_SIZE - 1)
|
|
102 | 102 |
|
103 | 103 |
typedef struct IOMMUState { |
104 | 104 |
target_phys_addr_t addr; |
... | ... | |
114 | 114 |
saddr = (addr - s->addr) >> 2; |
115 | 115 |
switch (saddr) { |
116 | 116 |
default: |
117 |
DPRINTF("read reg[%d] = %x\n", (int)saddr, s->regs[saddr]);
|
|
118 |
return s->regs[saddr];
|
|
119 |
break;
|
|
117 |
DPRINTF("read reg[%d] = %x\n", (int)saddr, s->regs[saddr]);
|
|
118 |
return s->regs[saddr];
|
|
119 |
break;
|
|
120 | 120 |
} |
121 | 121 |
return 0; |
122 | 122 |
} |
... | ... | |
130 | 130 |
DPRINTF("write reg[%d] = %x\n", (int)saddr, val); |
131 | 131 |
switch (saddr) { |
132 | 132 |
case IOMMU_CTRL: |
133 |
switch (val & IOMMU_CTRL_RNGE) {
|
|
134 |
case IOMMU_RNGE_16MB:
|
|
135 |
s->iostart = 0xffffffffff000000ULL;
|
|
136 |
break;
|
|
137 |
case IOMMU_RNGE_32MB:
|
|
138 |
s->iostart = 0xfffffffffe000000ULL;
|
|
139 |
break;
|
|
140 |
case IOMMU_RNGE_64MB:
|
|
141 |
s->iostart = 0xfffffffffc000000ULL;
|
|
142 |
break;
|
|
143 |
case IOMMU_RNGE_128MB:
|
|
144 |
s->iostart = 0xfffffffff8000000ULL;
|
|
145 |
break;
|
|
146 |
case IOMMU_RNGE_256MB:
|
|
147 |
s->iostart = 0xfffffffff0000000ULL;
|
|
148 |
break;
|
|
149 |
case IOMMU_RNGE_512MB:
|
|
150 |
s->iostart = 0xffffffffe0000000ULL;
|
|
151 |
break;
|
|
152 |
case IOMMU_RNGE_1GB:
|
|
153 |
s->iostart = 0xffffffffc0000000ULL;
|
|
154 |
break;
|
|
155 |
default:
|
|
156 |
case IOMMU_RNGE_2GB:
|
|
157 |
s->iostart = 0xffffffff80000000ULL;
|
|
158 |
break;
|
|
159 |
}
|
|
160 |
DPRINTF("iostart = " TARGET_FMT_plx "\n", s->iostart);
|
|
161 |
s->regs[saddr] = ((val & IOMMU_CTRL_MASK) | IOMMU_VERSION);
|
|
162 |
break;
|
|
133 |
switch (val & IOMMU_CTRL_RNGE) {
|
|
134 |
case IOMMU_RNGE_16MB:
|
|
135 |
s->iostart = 0xffffffffff000000ULL;
|
|
136 |
break;
|
|
137 |
case IOMMU_RNGE_32MB:
|
|
138 |
s->iostart = 0xfffffffffe000000ULL;
|
|
139 |
break;
|
|
140 |
case IOMMU_RNGE_64MB:
|
|
141 |
s->iostart = 0xfffffffffc000000ULL;
|
|
142 |
break;
|
|
143 |
case IOMMU_RNGE_128MB:
|
|
144 |
s->iostart = 0xfffffffff8000000ULL;
|
|
145 |
break;
|
|
146 |
case IOMMU_RNGE_256MB:
|
|
147 |
s->iostart = 0xfffffffff0000000ULL;
|
|
148 |
break;
|
|
149 |
case IOMMU_RNGE_512MB:
|
|
150 |
s->iostart = 0xffffffffe0000000ULL;
|
|
151 |
break;
|
|
152 |
case IOMMU_RNGE_1GB:
|
|
153 |
s->iostart = 0xffffffffc0000000ULL;
|
|
154 |
break;
|
|
155 |
default:
|
|
156 |
case IOMMU_RNGE_2GB:
|
|
157 |
s->iostart = 0xffffffff80000000ULL;
|
|
158 |
break;
|
|
159 |
}
|
|
160 |
DPRINTF("iostart = " TARGET_FMT_plx "\n", s->iostart);
|
|
161 |
s->regs[saddr] = ((val & IOMMU_CTRL_MASK) | IOMMU_VERSION);
|
|
162 |
break;
|
|
163 | 163 |
case IOMMU_BASE: |
164 |
s->regs[saddr] = val & IOMMU_BASE_MASK;
|
|
165 |
break;
|
|
164 |
s->regs[saddr] = val & IOMMU_BASE_MASK;
|
|
165 |
break;
|
|
166 | 166 |
case IOMMU_TLBFLUSH: |
167 |
DPRINTF("tlb flush %x\n", val);
|
|
168 |
s->regs[saddr] = val & IOMMU_TLBFLUSH_MASK;
|
|
169 |
break;
|
|
167 |
DPRINTF("tlb flush %x\n", val);
|
|
168 |
s->regs[saddr] = val & IOMMU_TLBFLUSH_MASK;
|
|
169 |
break;
|
|
170 | 170 |
case IOMMU_PGFLUSH: |
171 |
DPRINTF("page flush %x\n", val);
|
|
172 |
s->regs[saddr] = val & IOMMU_PGFLUSH_MASK;
|
|
173 |
break;
|
|
171 |
DPRINTF("page flush %x\n", val);
|
|
172 |
s->regs[saddr] = val & IOMMU_PGFLUSH_MASK;
|
|
173 |
break;
|
|
174 | 174 |
case IOMMU_SBCFG0: |
175 | 175 |
case IOMMU_SBCFG1: |
176 | 176 |
case IOMMU_SBCFG2: |
177 | 177 |
case IOMMU_SBCFG3: |
178 |
s->regs[saddr] = val & IOMMU_SBCFG_MASK;
|
|
179 |
break;
|
|
178 |
s->regs[saddr] = val & IOMMU_SBCFG_MASK;
|
|
179 |
break;
|
|
180 | 180 |
case IOMMU_ARBEN: |
181 | 181 |
// XXX implement SBus probing: fault when reading unmapped |
182 | 182 |
// addresses, fault cause and address stored to MMU/IOMMU |
183 |
s->regs[saddr] = (val & IOMMU_ARBEN_MASK) | IOMMU_MID;
|
|
184 |
break;
|
|
183 |
s->regs[saddr] = (val & IOMMU_ARBEN_MASK) | IOMMU_MID;
|
|
184 |
break;
|
|
185 | 185 |
default: |
186 |
s->regs[saddr] = val;
|
|
187 |
break;
|
|
186 |
s->regs[saddr] = val;
|
|
187 |
break;
|
|
188 | 188 |
} |
189 | 189 |
} |
190 | 190 |
|
... | ... | |
283 | 283 |
int i; |
284 | 284 |
|
285 | 285 |
for (i = 0; i < IOMMU_NREGS; i++) |
286 |
qemu_put_be32s(f, &s->regs[i]);
|
|
286 |
qemu_put_be32s(f, &s->regs[i]);
|
|
287 | 287 |
qemu_put_be64s(f, &s->iostart); |
288 | 288 |
} |
289 | 289 |
|
Also available in: Unified diff