Commit e1bb04f74027d4b6f029f851aa59abf049891a22
1 parent
1ade1de2
memory mapped NVRAM (Jocelyn Mayer)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@953 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
97 additions
and
2 deletions
hw/m48t59.c
| ... | ... | @@ -35,6 +35,8 @@ |
| 35 | 35 | struct m48t59_t { |
| 36 | 36 | /* Hardware parameters */ |
| 37 | 37 | int IRQ; |
| 38 | + int mem_index; | |
| 39 | + uint32_t mem_base; | |
| 38 | 40 | uint32_t io_base; |
| 39 | 41 | uint16_t size; |
| 40 | 42 | /* RTC management */ |
| ... | ... | @@ -481,8 +483,95 @@ static uint32_t NVRAM_readb (void *opaque, uint32_t addr) |
| 481 | 483 | return retval; |
| 482 | 484 | } |
| 483 | 485 | |
| 486 | +static void nvram_writeb (void *opaque, target_phys_addr_t addr, uint32_t value) | |
| 487 | +{ | |
| 488 | + m48t59_t *NVRAM = opaque; | |
| 489 | + | |
| 490 | + addr -= NVRAM->mem_base; | |
| 491 | + if (addr < 0x1FF0) | |
| 492 | + NVRAM->buffer[addr] = value; | |
| 493 | +} | |
| 494 | + | |
| 495 | +static void nvram_writew (void *opaque, target_phys_addr_t addr, uint32_t value) | |
| 496 | +{ | |
| 497 | + m48t59_t *NVRAM = opaque; | |
| 498 | + | |
| 499 | + addr -= NVRAM->mem_base; | |
| 500 | + if (addr < 0x1FF0) { | |
| 501 | + NVRAM->buffer[addr] = value >> 8; | |
| 502 | + NVRAM->buffer[addr + 1] = value; | |
| 503 | + } | |
| 504 | +} | |
| 505 | + | |
| 506 | +static void nvram_writel (void *opaque, target_phys_addr_t addr, uint32_t value) | |
| 507 | +{ | |
| 508 | + m48t59_t *NVRAM = opaque; | |
| 509 | + | |
| 510 | + addr -= NVRAM->mem_base; | |
| 511 | + if (addr < 0x1FF0) { | |
| 512 | + NVRAM->buffer[addr] = value >> 24; | |
| 513 | + NVRAM->buffer[addr + 1] = value >> 16; | |
| 514 | + NVRAM->buffer[addr + 2] = value >> 8; | |
| 515 | + NVRAM->buffer[addr + 3] = value; | |
| 516 | + } | |
| 517 | +} | |
| 518 | + | |
| 519 | +static uint32_t nvram_readb (void *opaque, target_phys_addr_t addr) | |
| 520 | +{ | |
| 521 | + m48t59_t *NVRAM = opaque; | |
| 522 | + uint32_t retval = 0; | |
| 523 | + | |
| 524 | + addr -= NVRAM->mem_base; | |
| 525 | + if (addr < 0x1FF0) | |
| 526 | + retval = NVRAM->buffer[addr]; | |
| 527 | + | |
| 528 | + return retval; | |
| 529 | +} | |
| 530 | + | |
| 531 | +static uint32_t nvram_readw (void *opaque, target_phys_addr_t addr) | |
| 532 | +{ | |
| 533 | + m48t59_t *NVRAM = opaque; | |
| 534 | + uint32_t retval = 0; | |
| 535 | + | |
| 536 | + addr -= NVRAM->mem_base; | |
| 537 | + if (addr < 0x1FF0) { | |
| 538 | + retval = NVRAM->buffer[addr] << 8; | |
| 539 | + retval |= NVRAM->buffer[addr + 1]; | |
| 540 | + } | |
| 541 | + | |
| 542 | + return retval; | |
| 543 | +} | |
| 544 | + | |
| 545 | +static uint32_t nvram_readl (void *opaque, target_phys_addr_t addr) | |
| 546 | +{ | |
| 547 | + m48t59_t *NVRAM = opaque; | |
| 548 | + uint32_t retval = 0; | |
| 549 | + | |
| 550 | + addr -= NVRAM->mem_base; | |
| 551 | + if (addr < 0x1FF0) { | |
| 552 | + retval = NVRAM->buffer[addr] << 24; | |
| 553 | + retval |= NVRAM->buffer[addr + 1] << 16; | |
| 554 | + retval |= NVRAM->buffer[addr + 2] << 8; | |
| 555 | + retval |= NVRAM->buffer[addr + 3]; | |
| 556 | + } | |
| 557 | + | |
| 558 | + return retval; | |
| 559 | +} | |
| 560 | + | |
| 561 | +static CPUWriteMemoryFunc *nvram_write[] = { | |
| 562 | + &nvram_writeb, | |
| 563 | + &nvram_writew, | |
| 564 | + &nvram_writel, | |
| 565 | +}; | |
| 566 | + | |
| 567 | +static CPUReadMemoryFunc *nvram_read[] = { | |
| 568 | + &nvram_readb, | |
| 569 | + &nvram_readw, | |
| 570 | + &nvram_readl, | |
| 571 | +}; | |
| 484 | 572 | /* Initialisation routine */ |
| 485 | -m48t59_t *m48t59_init (int IRQ, uint32_t io_base, uint16_t size) | |
| 573 | +m48t59_t *m48t59_init (int IRQ, uint32_t mem_base, | |
| 574 | + uint32_t io_base, uint16_t size) | |
| 486 | 575 | { |
| 487 | 576 | m48t59_t *s; |
| 488 | 577 | |
| ... | ... | @@ -496,10 +585,15 @@ m48t59_t *m48t59_init (int IRQ, uint32_t io_base, uint16_t size) |
| 496 | 585 | } |
| 497 | 586 | s->IRQ = IRQ; |
| 498 | 587 | s->size = size; |
| 588 | + s->mem_base = mem_base; | |
| 499 | 589 | s->io_base = io_base; |
| 500 | 590 | s->addr = 0; |
| 501 | 591 | register_ioport_read(io_base, 0x04, 1, NVRAM_readb, s); |
| 502 | 592 | register_ioport_write(io_base, 0x04, 1, NVRAM_writeb, s); |
| 593 | + if (mem_base != 0) { | |
| 594 | + s->mem_index = cpu_register_io_memory(0, nvram_read, nvram_write, s); | |
| 595 | + cpu_register_physical_memory(mem_base, 0x4000, s->mem_index); | |
| 596 | + } | |
| 503 | 597 | s->alrm_timer = qemu_new_timer(vm_clock, &alarm_cb, s); |
| 504 | 598 | s->wd_timer = qemu_new_timer(vm_clock, &watchdog_cb, s); |
| 505 | 599 | s->lock = 0; | ... | ... |
hw/m48t59.h
| ... | ... | @@ -7,6 +7,7 @@ void m48t59_write (m48t59_t *NVRAM, uint32_t val); |
| 7 | 7 | uint32_t m48t59_read (m48t59_t *NVRAM); |
| 8 | 8 | void m48t59_set_addr (m48t59_t *NVRAM, uint32_t addr); |
| 9 | 9 | void m48t59_toggle_lock (m48t59_t *NVRAM, int lock); |
| 10 | -m48t59_t *m48t59_init (int IRQ, uint32_t io_base, uint16_t size); | |
| 10 | +m48t59_t *m48t59_init (int IRQ, uint32_t io_base, | |
| 11 | + uint32_t mem_base, uint16_t size); | |
| 11 | 12 | |
| 12 | 13 | #endif /* !defined (__M48T59_H__) */ | ... | ... |