Display Virtualization with KVM for Automotive Systems

Preview:

Citation preview

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

? !

ご清聴ありがとうございました !

Recommended