Commit 49e6637386acb8824114ed10308ed7869472ec0f

Authored by Blue Swirl
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
... ...