diff options
author | Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> | 2019-08-18 21:16:50 +0100 |
---|---|---|
committer | Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> | 2019-08-18 21:16:50 +0100 |
commit | 412fc43324209cecddbf3e39c648a81fa0d57953 (patch) | |
tree | 37f15430d3b7b4da47827197fa7c868786884371 | |
parent | 5a2ec0dcd0b25ac66dc8c348c27436f669f1c58c (diff) | |
download | openbios-412fc43324209cecddbf3e39c648a81fa0d57953.zip openbios-412fc43324209cecddbf3e39c648a81fa0d57953.tar.gz openbios-412fc43324209cecddbf3e39c648a81fa0d57953.tar.bz2 |
virtio: use instance value to initialise C instance parameter
This simplifies the open word by avoiding having to locate and read the value
of the _vdev property.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
-rw-r--r-- | drivers/virtio.c | 46 |
1 files changed, 11 insertions, 35 deletions
diff --git a/drivers/virtio.c b/drivers/virtio.c index 4f9f5ee..ff7ed6f 100644 --- a/drivers/virtio.c +++ b/drivers/virtio.c @@ -337,9 +337,14 @@ ob_virtio_configure_device(VDev *vdev) static void ob_virtio_disk_open(VDev **_vdev) { - VDev *vdev = *_vdev; + VDev *vdev; phandle_t ph; + PUSH(find_ih_method("vdev", my_self())); + fword("execute"); + *_vdev = cell2pointer(POP()); + vdev = *_vdev; + vdev->pos = 0; if (!vdev->configured) { @@ -409,24 +414,9 @@ static void set_virtio_alias(const char *path, int idx) set_property(aliases, name, path, strlen(path) + 1); } -static void -ob_virtio_disk_initialize(VDev **_vdev) -{ - phandle_t ph = get_cur_dev(); - VDev *vdev; - int len; - - vdev = cell2pointer(get_int_property(ph, "_vdev", &len)); - push_str("_vdev"); - feval("delete-property"); - - *_vdev = vdev; -} - DECLARE_UNNAMED_NODE(ob_virtio_disk, 0, sizeof(VDev *)); NODE_METHODS(ob_virtio_disk) = { - { NULL, ob_virtio_disk_initialize }, { "open", ob_virtio_disk_open }, { "close", ob_virtio_disk_close }, { "seek", ob_virtio_disk_seek }, @@ -446,12 +436,6 @@ ob_virtio_close(VDev **_vdev) } static void -ob_virtio_vdev(VDev **_vdev) -{ - PUSH(pointer2cell(_vdev)); -} - -static void ob_virtio_dma_alloc(__attribute__((unused)) VDev **_vdev) { call_parent_method("dma-alloc"); @@ -486,7 +470,6 @@ DECLARE_UNNAMED_NODE(ob_virtio, 0, sizeof(VDev *)); NODE_METHODS(ob_virtio) = { { "open", ob_virtio_open }, { "close", ob_virtio_close }, - { "vdev", ob_virtio_vdev }, { "dma-alloc", ob_virtio_dma_alloc }, { "dma-free", ob_virtio_dma_free }, { "dma-map-in", ob_virtio_dma_map_in }, @@ -499,18 +482,12 @@ void ob_virtio_init(const char *path, const char *dev_name, uint64_t common_cfg, int idx) { char buf[256]; - phandle_t ph; ucell addr; - VDev *vdev, **_vdev; + VDev *vdev; /* Open ob_virtio */ BIND_NODE_METHODS(get_cur_dev(), ob_virtio); - ph = find_ih_method("vdev", my_self()); - PUSH(ph); - fword("execute"); - _vdev = cell2pointer(POP()); - vdev = malloc(sizeof(VDev)); vdev->common_cfg = common_cfg; vdev->device_cfg = device_cfg; @@ -518,6 +495,9 @@ void ob_virtio_init(const char *path, const char *dev_name, uint64_t common_cfg, vdev->notify_mult = notify_mult; vdev->configured = 0; + PUSH(pointer2cell(vdev)); + feval("value vdev"); + PUSH(sizeof(VRing) * VIRTIO_MAX_VQS); feval("dma-alloc"); addr = POP(); @@ -528,8 +508,6 @@ void ob_virtio_init(const char *path, const char *dev_name, uint64_t common_cfg, addr = POP(); vdev->ring_area = cell2pointer(addr); - *_vdev = vdev; - fword("new-device"); push_str("disk"); fword("device-name"); @@ -537,9 +515,7 @@ void ob_virtio_init(const char *path, const char *dev_name, uint64_t common_cfg, fword("device-type"); PUSH(pointer2cell(vdev)); - fword("encode-int"); - push_str("_vdev"); - fword("property"); + feval("value vdev"); BIND_NODE_METHODS(get_cur_dev(), ob_virtio_disk); fword("finish-device"); |