38
Display Virtualization with KVM for Automotive Systems Automotive Linux Summit 2018 Tokyo, Japan Laurent Pinchart [email protected]

Display Virtualization with KVM for Automotive Systems

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Display Virtualization with KVM for Automotive Systems

Display Virtualization withKVM for Automotive Systems

Automotive Linux Summit 2018Tokyo, Japan

Laurent [email protected]

Page 2: Display Virtualization with KVM for Automotive Systems
Page 3: Display Virtualization with KVM for Automotive Systems

Virtualization

“In computing, virtualization refers to the act of creating a virtual [...] version of something.”

https://en.wikipedia.org/wiki/Virtualization

Page 4: Display Virtualization with KVM for Automotive Systems

Virtualization

Page 5: Display Virtualization with KVM for Automotive Systems

Virtualization

Virtualization

Emulation

Simulation

Page 6: Display Virtualization with KVM for Automotive Systems

Virtualization

Page 7: Display Virtualization with KVM for Automotive Systems

Virtualization – Memory

Page 8: Display Virtualization with KVM for Automotive Systems

Virtualization – CPU

Page 9: Display Virtualization with KVM for Automotive Systems

Virtualization – I/O – Passthrough

Page 10: Display Virtualization with KVM for Automotive Systems

Virtualization – I/O – Emulation

Page 11: Display Virtualization with KVM for Automotive Systems

Virtualization – Disk - Emulation

Page 12: Display Virtualization with KVM for Automotive Systems

Virtualization – I/O – Para-virtualization

Page 13: Display Virtualization with KVM for Automotive Systems

Virtualization – Disk - Para-virtualization

Page 14: Display Virtualization with KVM for Automotive Systems

Virtio

Page 15: Display Virtualization with KVM for Automotive Systems

Virtio

+ Entropy, balloon, sockets, SCSI, ...

Page 16: Display Virtualization with KVM for Automotive Systems

Display Virtualization

Page 17: Display Virtualization with KVM for Automotive Systems

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

Page 18: Display Virtualization with KVM for Automotive Systems

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● ...

Page 19: Display Virtualization with KVM for Automotive Systems

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)● ...

Page 20: Display Virtualization with KVM for Automotive Systems

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

Page 21: Display Virtualization with KVM for Automotive Systems

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

Page 22: Display Virtualization with KVM for Automotive Systems

H3 DU Virtualization – virtio-gpu

~5 fps

Page 23: Display Virtualization with KVM for Automotive Systems

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

Page 24: Display Virtualization with KVM for Automotive Systems

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

Page 25: Display Virtualization with KVM for Automotive Systems

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

Page 26: Display Virtualization with KVM for Automotive Systems

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

Page 27: Display Virtualization with KVM for Automotive Systems

H3 DU Virtualization – virtio-gpu

memcpy()

Page 28: Display Virtualization with KVM for Automotive Systems

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.

Page 29: Display Virtualization with KVM for Automotive Systems

H3 DU Virtualization – Pass-through

Guest

Host

R-Car DU

Guest Kernel R-Car DU Driver

Guest Userspace[DRM/KMS]

[MMIO]

QEMU

[DMA]

IOMMU

Page 30: Display Virtualization with KVM for Automotive Systems

R-Car H3 DU

VSPD0 DU0 VGA

VSPD1

VSPD2

DU1

DU2

DU3VSPD3

PlanesPlanesPlanes

PlanesPlanesPlanes

PlanesPlanesPlanes

PlanesPlanesPlanes

HDMI0

HDMI1

LVDS

Page 31: Display Virtualization with KVM for Automotive Systems

R-Car H3 DU

VSPD0 DU0 VGA

VSPD1

VSPD2

DU1

DU2

DU3VSPD3

PlanesPlanesPlanes

PlanesPlanesPlanes

PlanesPlanesPlanes

PlanesPlanesPlanes

HDMI0

HDMI1

LVDS

Page 32: Display Virtualization with KVM for Automotive Systems

R-Car H3 DU

VSPD0 DU0 VGA

VSPD1

VSPD2

DU1

DU2

DU3

PlanesPlanesPlanes

PlanesPlanesPlanes

PlanesPlanesPlanes

HDMI0

HDMI1

LVDS

Page 33: Display Virtualization with KVM for Automotive Systems

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

Page 34: Display Virtualization with KVM for Automotive Systems

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]

Page 35: Display Virtualization with KVM for Automotive Systems

● 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

Page 36: Display Virtualization with KVM for Automotive Systems

[email protected]

Contact

Page 37: Display Virtualization with KVM for Automotive Systems

? !

Page 38: Display Virtualization with KVM for Automotive Systems

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