Commit 7fbfb139ec0b3d3572369db977ea354c274dabdf
1 parent
2761992d
Machine specific IOMMU version (Robert Reif)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3664 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
13 additions
and
6 deletions
hw/iommu.c
| ... | ... | @@ -37,7 +37,6 @@ do { printf("IOMMU: " fmt , ##args); } while (0) |
| 37 | 37 | #define IOMMU_CTRL (0x0000 >> 2) |
| 38 | 38 | #define IOMMU_CTRL_IMPL 0xf0000000 /* Implementation */ |
| 39 | 39 | #define IOMMU_CTRL_VERS 0x0f000000 /* Version */ |
| 40 | -#define IOMMU_VERSION 0x04000000 | |
| 41 | 40 | #define IOMMU_CTRL_RNGE 0x0000001c /* Mapping RANGE */ |
| 42 | 41 | #define IOMMU_RNGE_16MB 0x00000000 /* 0xff000000 -> 0xffffffff */ |
| 43 | 42 | #define IOMMU_RNGE_32MB 0x00000004 /* 0xfe000000 -> 0xffffffff */ |
| ... | ... | @@ -104,6 +103,7 @@ typedef struct IOMMUState { |
| 104 | 103 | target_phys_addr_t addr; |
| 105 | 104 | uint32_t regs[IOMMU_NREGS]; |
| 106 | 105 | target_phys_addr_t iostart; |
| 106 | + uint32_t version; | |
| 107 | 107 | } IOMMUState; |
| 108 | 108 | |
| 109 | 109 | static uint32_t iommu_mem_readw(void *opaque, target_phys_addr_t addr) |
| ... | ... | @@ -158,7 +158,7 @@ static void iommu_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val |
| 158 | 158 | break; |
| 159 | 159 | } |
| 160 | 160 | DPRINTF("iostart = " TARGET_FMT_plx "\n", s->iostart); |
| 161 | - s->regs[saddr] = ((val & IOMMU_CTRL_MASK) | IOMMU_VERSION); | |
| 161 | + s->regs[saddr] = ((val & IOMMU_CTRL_MASK) | s->version); | |
| 162 | 162 | break; |
| 163 | 163 | case IOMMU_BASE: |
| 164 | 164 | s->regs[saddr] = val & IOMMU_BASE_MASK; |
| ... | ... | @@ -308,10 +308,11 @@ static void iommu_reset(void *opaque) |
| 308 | 308 | |
| 309 | 309 | memset(s->regs, 0, IOMMU_NREGS * 4); |
| 310 | 310 | s->iostart = 0; |
| 311 | - s->regs[IOMMU_CTRL] = IOMMU_VERSION; | |
| 311 | + s->regs[IOMMU_CTRL] = s->version; | |
| 312 | + s->regs[IOMMU_ARBEN] = IOMMU_MID; | |
| 312 | 313 | } |
| 313 | 314 | |
| 314 | -void *iommu_init(target_phys_addr_t addr) | |
| 315 | +void *iommu_init(target_phys_addr_t addr, uint32_t version) | |
| 315 | 316 | { |
| 316 | 317 | IOMMUState *s; |
| 317 | 318 | int iommu_io_memory; |
| ... | ... | @@ -321,12 +322,14 @@ void *iommu_init(target_phys_addr_t addr) |
| 321 | 322 | return NULL; |
| 322 | 323 | |
| 323 | 324 | s->addr = addr; |
| 325 | + s->version = version; | |
| 324 | 326 | |
| 325 | 327 | iommu_io_memory = cpu_register_io_memory(0, iommu_mem_read, iommu_mem_write, s); |
| 326 | 328 | cpu_register_physical_memory(addr, IOMMU_NREGS * 4, iommu_io_memory); |
| 327 | 329 | |
| 328 | 330 | register_savevm("iommu", addr, 2, iommu_save, iommu_load, s); |
| 329 | 331 | qemu_register_reset(iommu_reset, s); |
| 332 | + iommu_reset(s); | |
| 330 | 333 | return s; |
| 331 | 334 | } |
| 332 | 335 | ... | ... |
hw/sun4m.c
| ... | ... | @@ -72,6 +72,7 @@ struct hwdef { |
| 72 | 72 | int intctl_g_intr, esp_irq, le_irq, clock_irq, clock1_irq; |
| 73 | 73 | int ser_irq, ms_kb_irq, fd_irq, me_irq, cs_irq; |
| 74 | 74 | int machine_id; // For NVRAM |
| 75 | + uint32_t iommu_version; | |
| 75 | 76 | uint32_t intbit_to_level[32]; |
| 76 | 77 | }; |
| 77 | 78 | |
| ... | ... | @@ -302,7 +303,7 @@ static void *sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, |
| 302 | 303 | /* allocate RAM */ |
| 303 | 304 | cpu_register_physical_memory(0, RAM_size, 0); |
| 304 | 305 | |
| 305 | - iommu = iommu_init(hwdef->iommu_base); | |
| 306 | + iommu = iommu_init(hwdef->iommu_base, hwdef->iommu_version); | |
| 306 | 307 | slavio_intctl = slavio_intctl_init(hwdef->intctl_base, |
| 307 | 308 | hwdef->intctl_base + 0x10000ULL, |
| 308 | 309 | &hwdef->intbit_to_level[0], |
| ... | ... | @@ -468,6 +469,7 @@ static const struct hwdef hwdefs[] = { |
| 468 | 469 | .me_irq = 30, |
| 469 | 470 | .cs_irq = 5, |
| 470 | 471 | .machine_id = 0x80, |
| 472 | + .iommu_version = 0x04000000, | |
| 471 | 473 | .intbit_to_level = { |
| 472 | 474 | 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12, |
| 473 | 475 | 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0, |
| ... | ... | @@ -501,6 +503,7 @@ static const struct hwdef hwdefs[] = { |
| 501 | 503 | .me_irq = 30, |
| 502 | 504 | .cs_irq = -1, |
| 503 | 505 | .machine_id = 0x72, |
| 506 | + .iommu_version = 0x03000000, | |
| 504 | 507 | .intbit_to_level = { |
| 505 | 508 | 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12, |
| 506 | 509 | 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0, |
| ... | ... | @@ -534,6 +537,7 @@ static const struct hwdef hwdefs[] = { |
| 534 | 537 | .me_irq = 30, |
| 535 | 538 | .cs_irq = -1, |
| 536 | 539 | .machine_id = 0x71, |
| 540 | + .iommu_version = 0x01000000, | |
| 537 | 541 | .intbit_to_level = { |
| 538 | 542 | 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12, |
| 539 | 543 | 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0, | ... | ... |
vl.h
| ... | ... | @@ -1051,7 +1051,7 @@ void PPC_debug_write (void *opaque, uint32_t addr, uint32_t val); |
| 1051 | 1051 | extern QEMUMachine ss5_machine, ss10_machine, ss600mp_machine; |
| 1052 | 1052 | |
| 1053 | 1053 | /* iommu.c */ |
| 1054 | -void *iommu_init(target_phys_addr_t addr); | |
| 1054 | +void *iommu_init(target_phys_addr_t addr, uint32_t version); | |
| 1055 | 1055 | void sparc_iommu_memory_rw(void *opaque, target_phys_addr_t addr, |
| 1056 | 1056 | uint8_t *buf, int len, int is_write); |
| 1057 | 1057 | static inline void sparc_iommu_memory_read(void *opaque, | ... | ... |