Commit 49e6637386acb8824114ed10308ed7869472ec0f
1 parent
5b0f0bec
Sparc32: convert eccmemctl to qdev
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Showing
2 changed files
with
37 additions
and
17 deletions
hw/eccmemctl.c
| ... | ... | @@ -21,9 +21,9 @@ |
| 21 | 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
| 22 | 22 | * THE SOFTWARE. |
| 23 | 23 | */ |
| 24 | -#include "hw.h" | |
| 24 | + | |
| 25 | 25 | #include "sun4m.h" |
| 26 | -#include "sysemu.h" | |
| 26 | +#include "sysbus.h" | |
| 27 | 27 | |
| 28 | 28 | //#define DEBUG_ECC |
| 29 | 29 | |
| ... | ... | @@ -126,6 +126,7 @@ |
| 126 | 126 | #define ECC_DIAG_MASK (ECC_DIAG_SIZE - 1) |
| 127 | 127 | |
| 128 | 128 | typedef struct ECCState { |
| 129 | + SysBusDevice busdev; | |
| 129 | 130 | qemu_irq irq; |
| 130 | 131 | uint32_t regs[ECC_NREGS]; |
| 131 | 132 | uint8_t diag[ECC_DIAG_SIZE]; |
| ... | ... | @@ -314,27 +315,46 @@ static void ecc_reset(void *opaque) |
| 314 | 315 | s->regs[ECC_ECR1] = 0; |
| 315 | 316 | } |
| 316 | 317 | |
| 317 | -void * ecc_init(target_phys_addr_t base, qemu_irq irq, uint32_t version) | |
| 318 | +static void ecc_init1(SysBusDevice *dev) | |
| 318 | 319 | { |
| 319 | 320 | int ecc_io_memory; |
| 320 | - ECCState *s; | |
| 321 | - | |
| 322 | - s = qemu_mallocz(sizeof(ECCState)); | |
| 323 | - | |
| 324 | - s->version = version; | |
| 325 | - s->regs[0] = version; | |
| 326 | - s->irq = irq; | |
| 321 | + ECCState *s = FROM_SYSBUS(ECCState, dev); | |
| 327 | 322 | |
| 323 | + sysbus_init_irq(dev, &s->irq); | |
| 324 | + s->version = qdev_get_prop_int(&dev->qdev, "version", -1); | |
| 325 | + s->regs[0] = s->version; | |
| 328 | 326 | ecc_io_memory = cpu_register_io_memory(ecc_mem_read, ecc_mem_write, s); |
| 329 | - cpu_register_physical_memory(base, ECC_SIZE, ecc_io_memory); | |
| 330 | - if (version == ECC_MCC) { // SS-600MP only | |
| 327 | + sysbus_init_mmio(dev, ECC_SIZE, ecc_io_memory); | |
| 328 | + | |
| 329 | + if (s->version == ECC_MCC) { // SS-600MP only | |
| 331 | 330 | ecc_io_memory = cpu_register_io_memory(ecc_diag_mem_read, |
| 332 | 331 | ecc_diag_mem_write, s); |
| 333 | - cpu_register_physical_memory(base + 0x1000, ECC_DIAG_SIZE, | |
| 334 | - ecc_io_memory); | |
| 332 | + sysbus_init_mmio(dev, ECC_DIAG_SIZE, ecc_io_memory); | |
| 335 | 333 | } |
| 336 | - register_savevm("ECC", base, 3, ecc_save, ecc_load, s); | |
| 334 | + register_savevm("ECC", -1, 3, ecc_save, ecc_load, s); | |
| 337 | 335 | qemu_register_reset(ecc_reset, s); |
| 338 | 336 | ecc_reset(s); |
| 339 | - return s; | |
| 340 | 337 | } |
| 338 | + | |
| 339 | +void ecc_init(target_phys_addr_t base, qemu_irq irq, uint32_t version) | |
| 340 | +{ | |
| 341 | + DeviceState *dev; | |
| 342 | + SysBusDevice *s; | |
| 343 | + | |
| 344 | + dev = qdev_create(NULL, "ecc"); | |
| 345 | + qdev_set_prop_int(dev, "version", version); | |
| 346 | + qdev_init(dev); | |
| 347 | + s = sysbus_from_qdev(dev); | |
| 348 | + sysbus_connect_irq(s, 0, irq); | |
| 349 | + sysbus_mmio_map(s, 0, base); | |
| 350 | + if (version == ECC_MCC) { // SS-600MP only | |
| 351 | + sysbus_mmio_map(s, 1, base + 0x1000); | |
| 352 | + } | |
| 353 | +} | |
| 354 | + | |
| 355 | +static void ecc_register_devices(void) | |
| 356 | +{ | |
| 357 | + sysbus_register_dev("ecc", sizeof(ECCState), ecc_init1); | |
| 358 | +} | |
| 359 | + | |
| 360 | +device_init(ecc_register_devices) | ... | ... |
hw/sun4m.h
| ... | ... | @@ -63,6 +63,6 @@ void cs_init(target_phys_addr_t base, int irq, void *intctl); |
| 63 | 63 | #include "sparc32_dma.h" |
| 64 | 64 | |
| 65 | 65 | /* eccmemctl.c */ |
| 66 | -void *ecc_init(target_phys_addr_t base, qemu_irq irq, uint32_t version); | |
| 66 | +void ecc_init(target_phys_addr_t base, qemu_irq irq, uint32_t version); | |
| 67 | 67 | |
| 68 | 68 | #endif | ... | ... |