Commit a5580466257337e74e48124c185e4db9d29325ec
1 parent
cf21e106
Stellaris ethernet qdev conversion
Signed-off-by: Paul Brook <paul@codesourcery.com>
Showing
3 changed files
with
32 additions
and
23 deletions
hw/arm-misc.h
| @@ -41,7 +41,4 @@ void arm_load_kernel(CPUState *env, struct arm_boot_info *info); | @@ -41,7 +41,4 @@ void arm_load_kernel(CPUState *env, struct arm_boot_info *info); | ||
| 41 | extern int system_clock_scale; | 41 | extern int system_clock_scale; |
| 42 | qemu_irq *armv7m_nvic_init(CPUState *env); | 42 | qemu_irq *armv7m_nvic_init(CPUState *env); |
| 43 | 43 | ||
| 44 | -/* stellaris_enent.c */ | ||
| 45 | -void stellaris_enet_init(NICInfo *nd, uint32_t base, qemu_irq irq); | ||
| 46 | - | ||
| 47 | #endif /* !ARM_MISC_H */ | 44 | #endif /* !ARM_MISC_H */ |
hw/stellaris.c
| @@ -1356,8 +1356,17 @@ static void stellaris_init(const char *kernel_filename, const char *cpu_model, | @@ -1356,8 +1356,17 @@ static void stellaris_init(const char *kernel_filename, const char *cpu_model, | ||
| 1356 | pl022_init(0x40008000, pic[7], NULL, NULL); | 1356 | pl022_init(0x40008000, pic[7], NULL, NULL); |
| 1357 | } | 1357 | } |
| 1358 | } | 1358 | } |
| 1359 | - if (board->dc4 & (1 << 28)) | ||
| 1360 | - stellaris_enet_init(&nd_table[0], 0x40048000, pic[42]); | 1359 | + if (board->dc4 & (1 << 28)) { |
| 1360 | + DeviceState *enet; | ||
| 1361 | + | ||
| 1362 | + qemu_check_nic_model(&nd_table[0], "stellaris"); | ||
| 1363 | + | ||
| 1364 | + enet = qdev_create(NULL, "stellaris_enet"); | ||
| 1365 | + qdev_set_netdev(enet, &nd_table[0]); | ||
| 1366 | + qdev_init(enet); | ||
| 1367 | + sysbus_mmio_map(sysbus_from_qdev(enet), 0, 0x40048000); | ||
| 1368 | + sysbus_connect_irq(sysbus_from_qdev(enet), 0, pic[42]); | ||
| 1369 | + } | ||
| 1361 | if (board->peripherals & BP_GAMEPAD) { | 1370 | if (board->peripherals & BP_GAMEPAD) { |
| 1362 | qemu_irq gpad_irq[5]; | 1371 | qemu_irq gpad_irq[5]; |
| 1363 | static const int gpad_keycode[5] = { 0xc8, 0xd0, 0xcb, 0xcd, 0x1d }; | 1372 | static const int gpad_keycode[5] = { 0xc8, 0xd0, 0xcb, 0xcd, 0x1d }; |
hw/stellaris_enet.c
| @@ -6,8 +6,7 @@ | @@ -6,8 +6,7 @@ | ||
| 6 | * | 6 | * |
| 7 | * This code is licenced under the GPL. | 7 | * This code is licenced under the GPL. |
| 8 | */ | 8 | */ |
| 9 | -#include "hw.h" | ||
| 10 | -#include "arm-misc.h" | 9 | +#include "sysbus.h" |
| 11 | #include "net.h" | 10 | #include "net.h" |
| 12 | #include <zlib.h> | 11 | #include <zlib.h> |
| 13 | 12 | ||
| @@ -44,6 +43,7 @@ do { fprintf(stderr, "stellaris_enet: error: " fmt , ## __VA_ARGS__);} while (0) | @@ -44,6 +43,7 @@ do { fprintf(stderr, "stellaris_enet: error: " fmt , ## __VA_ARGS__);} while (0) | ||
| 44 | #define SE_TCTL_DUPLEX 0x08 | 43 | #define SE_TCTL_DUPLEX 0x08 |
| 45 | 44 | ||
| 46 | typedef struct { | 45 | typedef struct { |
| 46 | + SysBusDevice busdev; | ||
| 47 | uint32_t ris; | 47 | uint32_t ris; |
| 48 | uint32_t im; | 48 | uint32_t im; |
| 49 | uint32_t rctl; | 49 | uint32_t rctl; |
| @@ -394,28 +394,31 @@ static void stellaris_enet_cleanup(VLANClientState *vc) | @@ -394,28 +394,31 @@ static void stellaris_enet_cleanup(VLANClientState *vc) | ||
| 394 | qemu_free(s); | 394 | qemu_free(s); |
| 395 | } | 395 | } |
| 396 | 396 | ||
| 397 | -void stellaris_enet_init(NICInfo *nd, uint32_t base, qemu_irq irq) | 397 | +static void stellaris_enet_init(SysBusDevice *dev) |
| 398 | { | 398 | { |
| 399 | - stellaris_enet_state *s; | 399 | + stellaris_enet_state *s = FROM_SYSBUS(stellaris_enet_state, dev); |
| 400 | 400 | ||
| 401 | - qemu_check_nic_model(nd, "stellaris"); | ||
| 402 | - | ||
| 403 | - s = (stellaris_enet_state *)qemu_mallocz(sizeof(stellaris_enet_state)); | ||
| 404 | s->mmio_index = cpu_register_io_memory(0, stellaris_enet_readfn, | 401 | s->mmio_index = cpu_register_io_memory(0, stellaris_enet_readfn, |
| 405 | stellaris_enet_writefn, s); | 402 | stellaris_enet_writefn, s); |
| 406 | - cpu_register_physical_memory(base, 0x00001000, s->mmio_index); | ||
| 407 | - s->irq = irq; | ||
| 408 | - memcpy(s->macaddr, nd->macaddr, 6); | ||
| 409 | - | ||
| 410 | - if (nd->vlan) { | ||
| 411 | - s->vc = qemu_new_vlan_client(nd->vlan, nd->model, nd->name, | ||
| 412 | - stellaris_enet_receive, | ||
| 413 | - stellaris_enet_can_receive, | ||
| 414 | - stellaris_enet_cleanup, s); | ||
| 415 | - qemu_format_nic_info_str(s->vc, s->macaddr); | ||
| 416 | - } | 403 | + sysbus_init_mmio(dev, 0x1000, s->mmio_index); |
| 404 | + sysbus_init_irq(dev, &s->irq); | ||
| 405 | + qdev_get_macaddr(&dev->qdev, s->macaddr); | ||
| 406 | + | ||
| 407 | + s->vc = qdev_get_vlan_client(&dev->qdev, | ||
| 408 | + stellaris_enet_receive, | ||
| 409 | + stellaris_enet_can_receive, | ||
| 410 | + stellaris_enet_cleanup, s); | ||
| 411 | + qemu_format_nic_info_str(s->vc, s->macaddr); | ||
| 417 | 412 | ||
| 418 | stellaris_enet_reset(s); | 413 | stellaris_enet_reset(s); |
| 419 | register_savevm("stellaris_enet", -1, 1, | 414 | register_savevm("stellaris_enet", -1, 1, |
| 420 | stellaris_enet_save, stellaris_enet_load, s); | 415 | stellaris_enet_save, stellaris_enet_load, s); |
| 421 | } | 416 | } |
| 417 | + | ||
| 418 | +static void stellaris_enet_register_devices(void) | ||
| 419 | +{ | ||
| 420 | + sysbus_register_dev("stellaris_enet", sizeof(stellaris_enet_state), | ||
| 421 | + stellaris_enet_init); | ||
| 422 | +} | ||
| 423 | + | ||
| 424 | +device_init(stellaris_enet_register_devices) |