blob: 245952b12f3d38b85caae8b39c30b01859ecf4cc [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_VIRTUALIZATION_BIN_VMM_DEVICE_VIRTIO_MAGMA_H_
#define SRC_VIRTUALIZATION_BIN_VMM_DEVICE_VIRTIO_MAGMA_H_
#include <lib/async/cpp/wait.h>
#include <lib/async/dispatcher.h>
#include <lib/zx/vmar.h>
#include <zircon/types.h>
#include <memory>
#include <string>
#include <unordered_map>
#include "src/graphics/lib/magma/include/magma_abi/magma.h"
#include "src/graphics/lib/magma/include/virtio/virtio_magma.h"
#include "src/lib/fxl/macros.h"
#include "src/virtualization/bin/vmm/device/device_base.h"
#include "src/virtualization/bin/vmm/device/virtio_magma_generic.h"
#include "src/virtualization/bin/vmm/device/virtio_queue.h"
class VirtioMagma : public VirtioMagmaGeneric,
public DeviceBase<VirtioMagma>,
public fuchsia::virtualization::hardware::VirtioMagma {
public:
explicit VirtioMagma(sys::ComponentContext* context);
~VirtioMagma() override = default;
// |fuchsia::virtualization::hardware::VirtioDevice|
void Ready(uint32_t negotiated_features, ReadyCallback callback) override;
void ConfigureQueue(uint16_t queue, uint16_t size, zx_gpaddr_t desc, zx_gpaddr_t avail,
zx_gpaddr_t used, ConfigureQueueCallback callback) override;
void NotifyQueue(uint16_t queue) override;
// |fuchsia::virtualization::hardware::VirtioMagma|
void Start(fuchsia::virtualization::hardware::StartInfo start_info, zx::vmar vmar,
fidl::InterfaceHandle<fuchsia::virtualization::hardware::VirtioWaylandImporter>
wayland_importer,
StartCallback callback) override;
private:
zx_status_t Handle_device_import(const virtio_magma_device_import_ctrl_t* request,
virtio_magma_device_import_resp_t* response) override;
zx_status_t Handle_release_connection(const virtio_magma_release_connection_ctrl_t* request,
virtio_magma_release_connection_resp_t* response) override;
zx_status_t Handle_release_buffer(const virtio_magma_release_buffer_ctrl_t* request,
virtio_magma_release_buffer_resp_t* response) override;
zx_status_t Handle_internal_map(const virtio_magma_internal_map_ctrl_t* request,
virtio_magma_internal_map_resp_t* response) override;
zx_status_t Handle_internal_unmap(const virtio_magma_internal_unmap_ctrl_t* request,
virtio_magma_internal_unmap_resp_t* response) override;
zx_status_t Handle_poll(const virtio_magma_poll_ctrl_t* request,
virtio_magma_poll_resp_t* response) override;
zx_status_t Handle_read_notification_channel2(
const virtio_magma_read_notification_channel2_ctrl_t* request,
virtio_magma_read_notification_channel2_resp_t* response) override;
zx_status_t Handle_export(const virtio_magma_export_ctrl_t* request,
virtio_magma_export_resp_t* response) override;
zx_status_t Handle_import(const virtio_magma_import_ctrl_t* request,
virtio_magma_import_resp_t* response) override;
zx_status_t Handle_execute_command_buffer_with_resources(
const virtio_magma_execute_command_buffer_with_resources_ctrl_t* request,
virtio_magma_execute_command_buffer_with_resources_resp_t* response) override;
zx_status_t Handle_virt_create_image(const virtio_magma_virt_create_image_ctrl_t* request,
virtio_magma_virt_create_image_resp_t* response) override;
zx_status_t Handle_virt_get_image_info(
const virtio_magma_virt_get_image_info_ctrl_t* request,
virtio_magma_virt_get_image_info_resp_t* response) override;
zx::vmar vmar_;
VirtioQueue out_queue_;
fuchsia::virtualization::hardware::VirtioWaylandImporterSyncPtr wayland_importer_;
std::unordered_multimap<zx_koid_t, std::pair<zx_vaddr_t, size_t>> buffer_maps_;
// Each connection maps images to info, populated either when image is created or imported
using ImageMap = std::unordered_map<magma_buffer_t, magma_image_info_t>;
std::unordered_map<magma_connection_t, ImageMap> connection_image_map_;
FXL_DISALLOW_COPY_AND_ASSIGN(VirtioMagma);
};
#endif // SRC_VIRTUALIZATION_BIN_VMM_DEVICE_VIRTIO_MAGMA_H_