[zircon][display] Set missing display ops in virtio-gpu.
Currently the virtio-gpu driver fails to start, as it fails to implement
three display operations:
get_sysmem_connection
set_buffer_collection_constraints
get_single_buffer_framebuffer
This patch provides dummy implementations of the three operations,
allowing the virtio-gpu driver to successfully start.
Discovered during development of virtio-gpu intergration tests.
Bugs: MAC-213 #comment Avoid crash on virtio-gpu driver startup.
Change-Id: I7ea590dd4a266849409f3ff03c4ae1776778a834
diff --git a/zircon/system/dev/bus/virtio/gpu.cpp b/zircon/system/dev/bus/virtio/gpu.cpp
index 59985375..9a15b27 100644
--- a/zircon/system/dev/bus/virtio/gpu.cpp
+++ b/zircon/system/dev/bus/virtio/gpu.cpp
@@ -174,6 +174,20 @@
return zx_vmo_create_contiguous(gd->bti().get(), size, 0, vmo_out);
}
+zx_status_t GpuDevice::virtio_get_sysmem_connection(void* ctx, zx_handle_t handle) {
+ return ZX_ERR_NOT_SUPPORTED;
+}
+
+zx_status_t GpuDevice::virtio_set_buffer_collection_constraints(void* ctx, const image_t* config,
+ zx_unowned_handle_t collection) {
+ return ZX_ERR_NOT_SUPPORTED;
+}
+
+zx_status_t GpuDevice::virtio_get_single_buffer_framebuffer(void* ctx, zx_handle_t* out_vmo,
+ uint32_t* out_stride) {
+ return ZX_ERR_NOT_SUPPORTED;
+}
+
GpuDevice::GpuDevice(zx_device_t* bus_device, zx::bti bti, fbl::unique_ptr<Backend> backend)
: Device(bus_device, std::move(bti), std::move(backend)) {
sem_init(&request_sem_, 0, 1);
@@ -469,6 +483,9 @@
display_proto_ops_.apply_configuration = virtio_gpu_apply_configuration;
display_proto_ops_.compute_linear_stride = virtio_gpu_compute_linear_stride;
display_proto_ops_.allocate_vmo = virtio_gpu_allocate_vmo;
+ display_proto_ops_.get_sysmem_connection = virtio_get_sysmem_connection;
+ display_proto_ops_.set_buffer_collection_constraints = virtio_set_buffer_collection_constraints;
+ display_proto_ops_.get_single_buffer_framebuffer = virtio_get_single_buffer_framebuffer;
// Initialize the zx_device and publish us
// Point the ctx of our DDK device at ourself
diff --git a/zircon/system/dev/bus/virtio/gpu.h b/zircon/system/dev/bus/virtio/gpu.h
index 5d1821f..82ca583 100644
--- a/zircon/system/dev/bus/virtio/gpu.h
+++ b/zircon/system/dev/bus/virtio/gpu.h
@@ -51,7 +51,11 @@
static uint32_t virtio_gpu_compute_linear_stride(
void* ctx, uint32_t width, zx_pixel_format_t format);
static zx_status_t virtio_gpu_allocate_vmo(void* ctx, uint64_t size, zx_handle_t* vmo_out);
-
+ static zx_status_t virtio_get_sysmem_connection(void* ctx, zx_handle_t handle);
+ static zx_status_t virtio_set_buffer_collection_constraints(void* ctx, const image_t* config,
+ zx_unowned_handle_t collection);
+ static zx_status_t virtio_get_single_buffer_framebuffer(void* ctx, zx_handle_t* out_vmo,
+ uint32_t* out_stride);
// Internal routines
template <typename RequestType, typename ResponseType>