Skip to content
Snippets Groups Projects
Commit 7888fc0b authored by Dmitry Osipenko's avatar Dmitry Osipenko
Browse files

virtio: Add virtio-camera

parent 621da778
No related branches found
No related tags found
No related merge requests found
...@@ -30,6 +30,11 @@ config VIRTIO_BALLOON ...@@ -30,6 +30,11 @@ config VIRTIO_BALLOON
default y default y
depends on VIRTIO depends on VIRTIO
config VIRTIO_CAMERA
bool
default y
depends on VIRTIO
config VIRTIO_CRYPTO config VIRTIO_CRYPTO
bool bool
default y default y
......
...@@ -30,6 +30,11 @@ virtio_ss.add(when: 'CONFIG_VIRTIO_MEM', if_true: files('virtio-mem.c')) ...@@ -30,6 +30,11 @@ virtio_ss.add(when: 'CONFIG_VIRTIO_MEM', if_true: files('virtio-mem.c'))
virtio_ss.add(when: 'CONFIG_VHOST_USER_I2C', if_true: files('vhost-user-i2c.c')) virtio_ss.add(when: 'CONFIG_VHOST_USER_I2C', if_true: files('vhost-user-i2c.c'))
virtio_ss.add(when: 'CONFIG_VHOST_USER_RNG', if_true: files('vhost-user-rng.c')) virtio_ss.add(when: 'CONFIG_VHOST_USER_RNG', if_true: files('vhost-user-rng.c'))
if libv4l2.found()
virtio_ss.add(declare_dependency(dependencies: [libv4l2]))
virtio_ss.add(when: 'CONFIG_VIRTIO_CAMERA', if_true: files('virtio-camera.c'))
endif
virtio_pci_ss = ss.source_set() virtio_pci_ss = ss.source_set()
virtio_pci_ss.add(when: 'CONFIG_VHOST_VSOCK', if_true: files('vhost-vsock-pci.c')) virtio_pci_ss.add(when: 'CONFIG_VHOST_VSOCK', if_true: files('vhost-vsock-pci.c'))
virtio_pci_ss.add(when: 'CONFIG_VHOST_USER_VSOCK', if_true: files('vhost-user-vsock-pci.c')) virtio_pci_ss.add(when: 'CONFIG_VHOST_USER_VSOCK', if_true: files('vhost-user-vsock-pci.c'))
......
This diff is collapsed.
...@@ -171,7 +171,8 @@ const char *virtio_device_names[] = { ...@@ -171,7 +171,8 @@ const char *virtio_device_names[] = {
[VIRTIO_ID_PARAM_SERV] = "virtio-param-serv", [VIRTIO_ID_PARAM_SERV] = "virtio-param-serv",
[VIRTIO_ID_AUDIO_POLICY] = "virtio-audio-pol", [VIRTIO_ID_AUDIO_POLICY] = "virtio-audio-pol",
[VIRTIO_ID_BT] = "virtio-bluetooth", [VIRTIO_ID_BT] = "virtio-bluetooth",
[VIRTIO_ID_GPIO] = "virtio-gpio" [VIRTIO_ID_GPIO] = "virtio-gpio",
[VIRTIO_ID_CAMERA] = "virtio-camera",
}; };
static const char *virtio_id_to_name(uint16_t device_id) static const char *virtio_id_to_name(uint16_t device_id)
......
/*
* Virtio Camera Device
*
* Copyright © 2022 Collabora, Ltd.
*
* This work is licensed under the terms of the GNU GPL, version 2.
* See the COPYING file in the top-level directory.
*/
#ifndef QEMU_VIRTIO_CAMERA_H
#define QEMU_VIRTIO_CAMERA_H
#include "qemu/queue.h"
#include "qemu/uuid.h"
#include "hw/virtio/virtio.h"
#include "qom/object.h"
#include "standard-headers/linux/virtio_camera.h"
#define TYPE_VIRTIO_CAMERA "virtio-camera-device"
OBJECT_DECLARE_SIMPLE_TYPE(VirtIOCamera, VIRTIO_CAMERA)
#define VIRTIO_CAMERA_GET_PARENT_CLASS(obj) \
OBJECT_GET_PARENT_CLASS(obj, TYPE_VIRTIO_CAMERA)
#define VIRTIO_CAMERA_NUM_V4L2_BUFFERS 3
struct virtio_camera_v4l2 {
void *buffer_data[VIRTIO_CAMERA_NUM_V4L2_BUFFERS];
size_t buffer_size[VIRTIO_CAMERA_NUM_V4L2_BUFFERS];
unsigned int queue_buffer_index;
char *dev_path;
int fd;
};
struct virtio_camera_mem_buffer {
QTAILQ_ENTRY(virtio_camera_mem_buffer) node;
QTAILQ_ENTRY(virtio_camera_mem_buffer) capture_node;
QemuUUID uuid;
VirtQueueElement *capture_elem;
unsigned int num_entries;
struct iovec iov[];
};
struct VirtIOCamera {
VirtIODevice parent_obj;
VirtQueue *ctrl_vq;
struct virtio_camera_v4l2 v4l2;
struct virtio_camera_config config;
QTAILQ_HEAD(, virtio_camera_mem_buffer) buflist;
QTAILQ_HEAD(, virtio_camera_mem_buffer) capturelist;
uint64_t mem_buf_uuid;
bool streaming;
};
#endif
/* SPDX-License-Identifier: GPL-2.0-or-later WITH Linux-syscall-note */
/*
* Virtio Camera Device
*
* Copyright © 2022 Collabora, Ltd.
*/
#ifndef _LINUX_VIRTIO_CAMERA_H
#define _LINUX_VIRTIO_CAMERA_H
#include "standard-headers/linux/types.h"
enum virtio_camera_ctrl_type {
VIRTIO_CAMERA_CMD_GET_FORMAT = 0x1,
VIRTIO_CAMERA_CMD_SET_FORMAT,
VIRTIO_CAMERA_CMD_TRY_FORMAT,
VIRTIO_CAMERA_CMD_ENUM_FORMAT,
VIRTIO_CAMERA_CMD_ENUM_SIZE,
VIRTIO_CAMERA_CMD_CREATE_BUFFER,
VIRTIO_CAMERA_CMD_DESTROY_BUFFER,
VIRTIO_CAMERA_CMD_ENQUEUE_BUFFER,
VIRTIO_CAMERA_CMD_STREAM_ON,
VIRTIO_CAMERA_CMD_STREAM_OFF,
VIRTIO_CAMERA_CMD_RESP_OK_NODATA = 0x100,
VIRTIO_CAMERA_CMD_RESP_ERR_UNSPEC = 0x200,
VIRTIO_CAMERA_CMD_RESP_ERR_BUSY = 0x201,
VIRTIO_CAMERA_CMD_RESP_ERR_OUT_OF_MEMORY = 0x202,
};
struct virtio_camera_config {
uint8_t name[256];
};
struct virtio_camera_mem_entry {
uint64_t addr;
uint32_t length;
};
struct virtio_camera_ctrl_hdr {
uint32_t cmd;
uint32_t index;
};
struct virtio_camera_format_size {
union {
uint32_t min_width;
uint32_t width;
};
uint32_t max_width;
uint32_t step_width;
union {
uint32_t min_height;
uint32_t height;
};
uint32_t max_height;
uint32_t step_height;
uint32_t stride;
uint32_t sizeimage;
};
struct virtio_camera_req_format {
uint32_t pixelformat;
struct virtio_camera_format_size size;
};
struct virtio_camera_req_buffer {
uint32_t num_entries;
uint8_t uuid[16];
};
struct virtio_camera_op_ctrl_req {
struct virtio_camera_ctrl_hdr header;
union {
struct virtio_camera_req_format format;
struct virtio_camera_req_buffer buffer;
uint64_t padding[3];
} u;
};
#endif
...@@ -68,6 +68,7 @@ ...@@ -68,6 +68,7 @@
#define VIRTIO_ID_AUDIO_POLICY 39 /* virtio audio policy */ #define VIRTIO_ID_AUDIO_POLICY 39 /* virtio audio policy */
#define VIRTIO_ID_BT 40 /* virtio bluetooth */ #define VIRTIO_ID_BT 40 /* virtio bluetooth */
#define VIRTIO_ID_GPIO 41 /* virtio gpio */ #define VIRTIO_ID_GPIO 41 /* virtio gpio */
#define VIRTIO_ID_CAMERA 42 /* virtio camera */
/* /*
* Virtio Transitional IDs * Virtio Transitional IDs
......
...@@ -2782,6 +2782,9 @@ config_host_data.set('CONFIG_CAPSTONE', capstone.found()) ...@@ -2782,6 +2782,9 @@ config_host_data.set('CONFIG_CAPSTONE', capstone.found())
config_host_data.set('CONFIG_FDT', fdt.found()) config_host_data.set('CONFIG_FDT', fdt.found())
config_host_data.set('CONFIG_SLIRP', slirp.found()) config_host_data.set('CONFIG_SLIRP', slirp.found())
libv4l2 = dependency('libv4l2', required: true, method: 'pkg-config',
kwargs: static_kwargs)
##################### #####################
# Generated sources # # Generated sources #
##################### #####################
...@@ -3981,6 +3984,7 @@ summary_info += {'capstone': capstone} ...@@ -3981,6 +3984,7 @@ summary_info += {'capstone': capstone}
summary_info += {'libpmem support': libpmem} summary_info += {'libpmem support': libpmem}
summary_info += {'libdaxctl support': libdaxctl} summary_info += {'libdaxctl support': libdaxctl}
summary_info += {'libudev': libudev} summary_info += {'libudev': libudev}
summary_info += {'libv4l2 support': libv4l2}
# Dummy dependency, keep .found() # Dummy dependency, keep .found()
summary_info += {'FUSE lseek': fuse_lseek.found()} summary_info += {'FUSE lseek': fuse_lseek.found()}
summary_info += {'selinux': selinux} summary_info += {'selinux': selinux}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment