| 845 | } |
| 846 | |
| 847 | rt_err_t rt_virtio_gpu_init(rt_ubase_t *mmio_base, rt_uint32_t irq) |
| 848 | { |
| 849 | static int dev_no = 0; |
| 850 | char dev_name[RT_NAME_MAX]; |
| 851 | struct virtio_device *virtio_dev; |
| 852 | struct virtio_gpu_device *virtio_gpu_dev; |
| 853 | |
| 854 | virtio_gpu_dev = rt_malloc(sizeof(struct virtio_gpu_device)); |
| 855 | |
| 856 | if (virtio_gpu_dev == RT_NULL) |
| 857 | { |
| 858 | goto _alloc_fail; |
| 859 | } |
| 860 | |
| 861 | virtio_dev = &virtio_gpu_dev->virtio_dev; |
| 862 | virtio_dev->irq = irq; |
| 863 | virtio_dev->mmio_base = mmio_base; |
| 864 | |
| 865 | virtio_gpu_dev->pmode_id = VIRTIO_GPU_INVALID_PMODE_ID; |
| 866 | virtio_gpu_dev->display_resource_id = 0; |
| 867 | virtio_gpu_dev->cursor_resource_id = 0; |
| 868 | virtio_gpu_dev->next_resource_id = 0; |
| 869 | virtio_gpu_dev->framebuffer = RT_NULL; |
| 870 | virtio_gpu_dev->smem_len = 0; |
| 871 | virtio_gpu_dev->cursor_enable = RT_FALSE; |
| 872 | |
| 873 | #ifdef RT_USING_SMP |
| 874 | rt_spin_lock_init(&virtio_dev->spinlock); |
| 875 | #endif |
| 876 | |
| 877 | virtio_reset_device(virtio_dev); |
| 878 | virtio_status_acknowledge_driver(virtio_dev); |
| 879 | |
| 880 | virtio_dev->mmio_config->driver_features = virtio_dev->mmio_config->device_features & ~( |
| 881 | (1 << VIRTIO_F_RING_EVENT_IDX) | |
| 882 | (1 << VIRTIO_F_RING_INDIRECT_DESC)); |
| 883 | |
| 884 | virtio_status_driver_ok(virtio_dev); |
| 885 | |
| 886 | if (virtio_queues_alloc(virtio_dev, 2) != RT_EOK) |
| 887 | { |
| 888 | goto _alloc_fail; |
| 889 | } |
| 890 | |
| 891 | if (virtio_queue_init(virtio_dev, VIRTIO_GPU_QUEUE_CTRL, VIRTIO_GPU_QUEUE_SIZE) != RT_EOK) |
| 892 | { |
| 893 | goto _alloc_fail; |
| 894 | } |
| 895 | |
| 896 | if (virtio_queue_init(virtio_dev, VIRTIO_GPU_QUEUE_CURSOR, VIRTIO_GPU_QUEUE_SIZE) != RT_EOK) |
| 897 | { |
| 898 | virtio_queue_destroy(virtio_dev, VIRTIO_GPU_QUEUE_CTRL); |
| 899 | |
| 900 | goto _alloc_fail; |
| 901 | } |
| 902 | |
| 903 | virtio_gpu_dev->parent.type = RT_Device_Class_Graphic; |
| 904 | #ifdef RT_USING_DEVICE_OPS |
nothing calls this directly
no test coverage detected