Post on 28-May-2022
Display Virtualization withKVM for Automotive Systems
Automotive Linux Summit 2018Tokyo, Japan
Laurent Pinchartlaurent.pinchart@ideasonboard.com
Virtualization
“In computing, virtualization refers to the act of creating a virtual [...] version of something.”
https://en.wikipedia.org/wiki/Virtualization
Virtualization
Virtualization
Virtualization
Emulation
Simulation
Virtualization
Virtualization – Memory
Virtualization – CPU
Virtualization – I/O – Passthrough
Virtualization – I/O – Emulation
Virtualization – Disk - Emulation
Virtualization – I/O – Para-virtualization
Virtualization – Disk - Para-virtualization
Virtio
Virtio
+ Entropy, balloon, sockets, SCSI, ...
Display Virtualization
Display Virtualization – QEMU
HW Display Controller
Host Kernel Display Driver
Host Display Server
QEMU Display DeviceSDL{1,2}
SDL Display Backend
Guest Kernel Display Driver
Guest Userspace[DRM/KMS]
[QEMU Protocol]
[Display Server Protocol]
[DRM/KMS]
[MMIO]
Guest
Host
Display Virtualization – QEMU
Guest
Host
HW Display Controller
Host Kernel Display Driver
Host Display Server
Guest Kernel Display Driver
Guest Userspace[DRM/KMS]
[QEMU Protocol]
[Display Server Protocol]
[DRM/KMS]
[MMIO]
QEMU Display DeviceSDL{1,2}
SDL Display Backend
● cirrus● pl110● qxl● xlnx.v-dp● ...
● vga● virtio-gpu● xenfb● vmware-vga
● omap-dss● omap-lcdc● ...
Display Virtualization – QEMU
Guest
Host
HW Display Controller
Host Kernel Display Driver
Host Display Server
Guest Kernel Display Driver
Guest Userspace[DRM/KMS]
[QEMU Protocol]
[Display Server Protocol]
[DRM/KMS]
[MMIO]
QEMU Display DeviceSDL{1,2}
SDL Display Backend● X11● Wayland● DirectFB● KMS/DRM● (fbcon)● ...
Display Virtualization – QEMU
Guest
Host
R-Car DU
Host Kernel rcar-du Driver
X.orgX.org fbdev Driver
Guest Kernel virtio-gpu Driver
Guest Userspace[DRM/KMS]
[virtio-gpu protocol]
[X11 Protocol]
[DRM/KMS]
[MMIO & DMA]
QEMU virtio-gpu DeviceSDL2
SDL2 X11 Backend
H3 DU Virtualization – virtio-gpu
Guest
Host
R-Car DU
Host Kernel rcar-du Driver
X.orgX.org fbdev Driver
Guest Kernel virtio-gpu Driver
Guest Userspace[DRM/KMS]
[virtio-gpu protocol]
[X11 Protocol]
[DRM/KMS]
[MMIO & DMA]
QEMU virtio-gpu DeviceSDL2
SDL2 X11 Backend
H3 DU Virtualization – virtio-gpu
~5 fps
static void virtio_gpu_simple_process_cmd(VirtIOGPU *g, struct virtio_gpu_ctrl_command *cmd){
... switch (cmd->cmd_hdr.type) { case VIRTIO_GPU_CMD_RESOURCE_CREATE_2D: virtio_gpu_resource_create_2d(g, cmd); break; case VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING: virtio_gpu_resource_attach_backing(g, cmd); break; case VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D: virtio_gpu_transfer_to_host_2d(g, cmd); break; ...
}...
}
H3 DU Virtualization – virtio-gpu
> hw > display > virtio-gpu.c
static void virtio_gpu_resource_attach_backing(VirtIOGPU *g, struct virtio_gpu_ctrl_command *cmd){ struct virtio_gpu_simple_resource *res;
... res = virtio_gpu_find_resource(g, ab.resource_id); ... ret = virtio_gpu_create_mapping_iov(&ab, cmd, &res->addrs, &res->iov); ...}
H3 DU Virtualization – virtio-gpu
> hw > display > virtio-gpu.c
static void virtio_gpu_transfer_to_host_2d(VirtIOGPU *g, struct virtio_gpu_ctrl_command *cmd){ ... void *img_data = pixman_image_get_data(res->image);
for (h = 0; h < t2d.r.height; h++) { src_offset = t2d.offset + stride * h; dst_offset = (t2d.r.y + h) * stride + (t2d.r.x * bpp); iov_to_buf(res->iov, res->iov_cnt, src_offset, (uint8_t *)img_data + dst_offset, t2d.r.width * bpp); } ...}
H3 DU Virtualization – virtio-gpu
> hw > display > virtio-gpu.c
static inline size_tiov_to_buf(const struct iovec *iov, const unsigned int iov_cnt, size_t offset, void *buf, size_t bytes){ if (__builtin_constant_p(bytes) && iov_cnt && offset <= iov[0].iov_len && bytes <= iov[0].iov_len - offset) { memcpy(buf, iov[0].iov_base + offset, bytes); return bytes; } else { return iov_to_buf_full(iov, iov_cnt, offset, buf, bytes); }}
H3 DU Virtualization – virtio-gpu
> include > qemu > iov.h
H3 DU Virtualization – virtio-gpu
memcpy()
H3 DU Virtualization – virtio-gpu
4.35 KVM_SET_USER_MEMORY_REGION
Capability: KVM_CAP_USER_MEMArchitectures: allType: vm ioctlParameters: struct kvm_userspace_memory_region (in)Returns: 0 on success, -1 on error...This ioctl allows the user to create or modify a guest physical memory slot. When changing an existing slot, it may be moved in the guest physical memory space, or its flags may be modified. It may not be resized. Slots may not overlap in guest physical address space.
H3 DU Virtualization – Pass-through
Guest
Host
R-Car DU
Guest Kernel R-Car DU Driver
Guest Userspace[DRM/KMS]
[MMIO]
QEMU
[DMA]
IOMMU
R-Car H3 DU
VSPD0 DU0 VGA
VSPD1
VSPD2
DU1
DU2
DU3VSPD3
PlanesPlanesPlanes
PlanesPlanesPlanes
PlanesPlanesPlanes
PlanesPlanesPlanes
HDMI0
HDMI1
LVDS
R-Car H3 DU
VSPD0 DU0 VGA
VSPD1
VSPD2
DU1
DU2
DU3VSPD3
PlanesPlanesPlanes
PlanesPlanesPlanes
PlanesPlanesPlanes
PlanesPlanesPlanes
HDMI0
HDMI1
LVDS
R-Car H3 DU
VSPD0 DU0 VGA
VSPD1
VSPD2
DU1
DU2
DU3
PlanesPlanesPlanes
PlanesPlanesPlanes
PlanesPlanesPlanes
HDMI0
HDMI1
LVDS
Display Virtualization – virtio-kms
Guest
Host
R-Car DU
Host Kernel rcar-du Driver
Guest Kernel virtio-gpu Driver
Guest Userspace[DRM/KMS]
[virtio-kms protocol]
[DRM/KMS]
[MMIO & DMA]
QEMU virtio-kms Device
Display Virtualization – virtio-wl
Guest
Host
R-Car DU
Host Kernel rcar-du Driver
Wayland Compositor
Guest Kernel virtio-wl Driver
Guest Application[Wayland Protocol]
[virtio-wl protocol]
[Wayland Protocol]
[DRM/KMS]
[MMIO & DMA]
crosvm virtio-wl Devicecrosvm
Wayland Proxy[/dev/wl]
● https://wiki.automotivelinux.org/eg-virt● https://github.com/oasis-tcs/virtio-spec● https://events.static.linuxfound.org/sites/events/files/slides/An
%20Introduction%20to%20PCI%20Device%20Assignment%20with%20VFIO%20-%20Williamson%20-%202016-08-30_0.pdf
● http://www.linux-kvm.org/images/5/59/02x03-Neo_Jia_and_Kirti_Wankhede-vGPU_on_KVM-A_VFIO_based_Framework.pdf
● https://www.spinics.net/lists/dri-devel/msg164583.html● https://www.elinux.org/R-Car/Virtualization
Resources
laurent.pinchart@ideasonboard.com
Contact
? !
ご清聴ありがとうございました !