Skip to content

Implement VirtIO GPU and input devices #34

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
2 changes: 1 addition & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
run: |
brew install make dtc expect e2fsprogs
- name: default build
run: make
run: make ENABLE_SDL=0
shell: bash
- name: automated test
run: .ci/autorun.sh
Expand Down
59 changes: 58 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ include mk/check-libs.mk
CC ?= gcc
CFLAGS := -O2 -g -Wall -Wextra
CFLAGS += -include common.h
LDFLAGS :=

# clock frequency
CLOCK_FREQ ?= 65000000
Expand All @@ -14,7 +15,7 @@ OBJS_EXTRA :=
# command line option
OPTS :=

LDFLAGS := -lm
LDFLAGS := -lm -lpthread

# virtio-blk
ENABLE_VIRTIOBLK ?= 1
Expand Down Expand Up @@ -91,6 +92,62 @@ endif
# after git submodule.
.DEFAULT_GOAL := all

# virtio-input
ENABLE_VIRTIOINPUT ?= 1
ifneq ($(UNAME_S),Linux)
ENABLE_VIRTIOINPUT := 0
endif
$(call set-feature, VIRTIOINPUT)
ifeq ($(call has, VIRTIOINPUT), 1)
OBJS_EXTRA += virtio-input.o
endif

# virtio-gpu and virgl
ENABLE_VIRTIOGPU ?= 1
ENABLE_VIRGL ?= 1

# SDL2
ENABLE_SDL ?= 1
ifeq (, $(shell which sdl2-config))
$(warning No sdl2-config in $$PATH. Check SDL2 installation in advance)
override ENABLE_SDL := 0
endif
ifeq ($(ENABLE_SDL),1)
CFLAGS += $(shell sdl2-config --cflags)
LDFLAGS += $(shell sdl2-config --libs)
else
# Disable virtio-gpu and virgl if SDL is not set
override ENABLE_VIRTIOGPU := 0
override ENABLE_VIRGL := 0
endif

# virtio-gpu
ifneq ($(UNAME_S),Linux)
ENABLE_VIRTIOGPU := 0
endif
ifeq ($(ENABLE_VIRTIOGPU),1)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why did you check ENABLE_SDL here?

OBJS_EXTRA += window-events.o
OBJS_EXTRA += virtio-gpu.o
else
override ENABLE_VIRGL := 0
endif

# VirGL
ifeq ($(ENABLE_VIRGL),1)
CFLAGS += $(shell pkg-config virglrenderer gl egl epoxy --cflags)
LDFLAGS += $(shell pkg-config virglrenderer gl egl epoxy --libs)
OBJS_EXTRA += virgl.o
OBJS_EXTRA += window-gl.o
else
ifeq ($(ENABLE_VIRTIOGPU),1)
OBJS_EXTRA += virtio-gpu-sw.o
OBJS_EXTRA += window-sw.o
endif
endif

$(call set-feature, VIRTIOGPU)
$(call set-feature, VIRGL)

BIN = semu
all: $(BIN) minimal.dtb

Expand Down
17 changes: 17 additions & 0 deletions common.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
#pragma once

#include <stddef.h>
#include <stdint.h>
#include <sys/uio.h>

#include "feature.h"

#define BITS_PER_CHAR 8
#define BITS_PER_LONG (BITS_PER_CHAR * sizeof(long))

#define unlikely(x) __builtin_expect((x), 0)
#define likely(x) __builtin_expect((x), 1)

Expand All @@ -17,6 +24,16 @@ static inline int ilog2(int x)
return 31 - __builtin_clz(x | 1);
}

static inline void set_bit(unsigned long bit, unsigned long *word)
{
*word |= (1 << bit);
}

static inline void bitmap_set_bit(unsigned long *map, unsigned long bit)
{
set_bit(bit % BITS_PER_LONG, &map[bit / BITS_PER_LONG]);
}

/* Range check
* For any variable range checking:
* if (x >= minx && x <= maxx) ...
Expand Down
36 changes: 36 additions & 0 deletions configs/buildroot.config
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ BR2_BINUTILS_VERSION_2_42_X=y
# BR2_BINUTILS_GPROFNG is not set
BR2_GCC_VERSION_14_X=y
BR2_EXTRA_GCC_CONFIG_OPTIONS="--enable-softfloat"
BR2_TOOLCHAIN_BUILDROOT_CXX=y
BR2_INSTALL_LIBSTDCPP=y
BR2_TOOLCHAIN_HEADERS_AT_LEAST="6.1"
BR2_TOOLCHAIN_GCC_AT_LEAST_14=y
BR2_TOOLCHAIN_GCC_AT_LEAST="14"
Expand All @@ -39,6 +41,40 @@ BR2_FORTIFY_SOURCE_1=y
BR2_PACKAGE_ALSA_UTILS=y
BR2_PACKAGE_ALSA_UTILS_APLAY=y
BR2_PACKAGE_ALSA_UTILS_SPEAKER_TEST=y
BR2_PACKAGE_GLMARK2=y
BR2_PACKAGE_KMSCUBE=y
BR2_PACKAGE_MESA3D_DEMOS=y
BR2_PACKAGE_MESA3D=y
BR2_PACKAGE_MESA3D_GALLIUM_DRIVER=y
BR2_PACKAGE_MESA3D_DRIVER=y
BR2_PACKAGE_MESA3D_NEEDS_X11=y
BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_SWRAST=y
BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_VIRGL=y
BR2_PACKAGE_MESA3D_GBM=y
BR2_PACKAGE_MESA3D_OPENGL_GLX=y
BR2_PACKAGE_MESA3D_OPENGL_EGL=y
BR2_PACKAGE_MESA3D_OPENGL_ES=y
BR2_PACKAGE_PROVIDES_LIBGBM="mesa3d"
BR2_PACKAGE_XORG7=y
BR2_PACKAGE_XSERVER_XORG_SERVER=y
BR2_PACKAGE_XSERVER_XORG_SERVER_MODULAR=y
BR2_PACKAGE_XLIB_LIBX11=y
BR2_PACKAGE_XAPP_TWM=y
BR2_PACKAGE_XAPP_XAUTH=y
BR2_PACKAGE_XAPP_XCLOCK=y
BR2_PACKAGE_XAPP_XINIT=y
BR2_PACKAGE_XDRIVER_XF86_INPUT_LIBINPUT=y
BR2_PACKAGE_XDRIVER_XF86_VIDEO_FBDEV=y
BR2_PACKAGE_XTERM=y
BR2_PACKAGE_EUDEV=y
BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y
BR2_PACKAGE_PROVIDES_UDEV="eudev"
BR2_PACKAGE_HAS_UDEV=y
BR2_PACKAGE_LIBDRM=y
BR2_PACKAGE_LIBGLEW=y
BR2_PACKAGE_HAS_LIBGBM=y
BR2_PACKAGE_HAS_LIBGLES=y
BR2_PACKAGE_LIBINPUT=y
# BR2_PACKAGE_URANDOM_SCRIPTS is not set
BR2_TARGET_ROOTFS_CPIO=y
BR2_TARGET_ROOTFS_CPIO_FULL=y
Expand Down
49 changes: 40 additions & 9 deletions configs/linux.config
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
CONFIG_CC_VERSION_TEXT="riscv32-buildroot-linux-gnu-gcc.br_real (Buildroot 2023.05.1) 12.3.0"
CONFIG_CC_VERSION_TEXT="riscv32-buildroot-linux-gnu-gcc.br_real (Buildroot 2024.05.2) 14.1.0"
CONFIG_CC_IS_GCC=y
CONFIG_GCC_VERSION=120300
CONFIG_GCC_VERSION=140100
CONFIG_CLANG_VERSION=0
CONFIG_AS_IS_GNU=y
CONFIG_AS_VERSION=23900
CONFIG_AS_VERSION=24200
CONFIG_LD_IS_BFD=y
CONFIG_LD_VERSION=23900
CONFIG_LD_VERSION=24200
CONFIG_LLD_VERSION=0
CONFIG_CC_CAN_LINK=y
CONFIG_CC_CAN_LINK_STATIC=y
Expand Down Expand Up @@ -590,6 +590,7 @@ CONFIG_ALLOW_DEV_COREDUMP=y
# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set
CONFIG_REGMAP=y
CONFIG_REGMAP_MMIO=y
CONFIG_DMA_SHARED_BUFFER=y
CONFIG_GENERIC_ARCH_TOPOLOGY=y
# end of Generic Driver Options

Expand Down Expand Up @@ -755,7 +756,7 @@ CONFIG_INPUT=y
#
# CONFIG_INPUT_MOUSEDEV is not set
# CONFIG_INPUT_JOYDEV is not set
# CONFIG_INPUT_EVDEV is not set
CONFIG_INPUT_EVDEV=y
# CONFIG_INPUT_EVBUG is not set

#
Expand Down Expand Up @@ -844,7 +845,11 @@ CONFIG_DEVMEM=y
#
# I2C support
#
# CONFIG_I2C is not set
CONFIG_I2C=y
CONFIG_I2C_BOARDINFO=y
CONFIG_I2C_COMPAT=y
CONFIG_I2C_HELPER_AUTO=y
CONFIG_I2C_ALGOBIT=y
# end of I2C support

# CONFIG_I3C is not set
Expand Down Expand Up @@ -907,18 +912,41 @@ CONFIG_MFD_SYSCON=y
#
# Graphics support
#
# CONFIG_DRM is not set
CONFIG_DRM=y
CONFIG_DRM_KMS_HELPER=y
# CONFIG_DRM_DEBUG_MODESET_LOCK is not set
CONFIG_DRM_FBDEV_EMULATION=y
CONFIG_DRM_FBDEV_OVERALLOC=100
CONFIG_DRM_GEM_SHMEM_HELPER=y

#
# ARM devices
#
# end of ARM devices

CONFIG_DRM_VIRTIO_GPU=y
CONFIG_DRM_PANEL=y

CONFIG_DRM_BRIDGE=y
CONFIG_DRM_PANEL_BRIDGE=y

CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y
CONFIG_DRM_NOMODESET=y

#
# Frame buffer Devices
#
# CONFIG_FB is not set
CONFIG_FB_CMDLINE=y
CONFIG_FB_NOTIFY=y
CONFIG_FB=y
CONFIG_FB_CFB_FILLRECT=y
CONFIG_FB_CFB_COPYAREA=y
CONFIG_FB_CFB_IMAGEBLIT=y
CONFIG_FB_SYS_FILLRECT=y
CONFIG_FB_SYS_COPYAREA=y
CONFIG_FB_SYS_IMAGEBLIT=y
CONFIG_FB_SYS_FOPS=y
CONFIG_FB_DEFERRED_IO=y
# end of Frame buffer Devices

#
Expand All @@ -928,6 +956,8 @@ CONFIG_MFD_SYSCON=y
# CONFIG_BACKLIGHT_CLASS_DEVICE is not set
# end of Backlight & LCD device support

CONFIG_HDMI=y

#
# Console display driver support
#
Expand Down Expand Up @@ -1048,9 +1078,10 @@ CONFIG_VIRTIO_ANCHOR=y
CONFIG_VIRTIO=y
CONFIG_VIRTIO_MENU=y
# CONFIG_VIRTIO_BALLOON is not set
# CONFIG_VIRTIO_INPUT is not set
CONFIG_VIRTIO_INPUT=y
CONFIG_VIRTIO_MMIO=y
# CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set
CONFIG_VIRTIO_DMA_SHARED_BUFFER=y
# CONFIG_VDPA is not set
# CONFIG_VHOST_MENU is not set

Expand Down
18 changes: 18 additions & 0 deletions configs/riscv-cross-file
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
[binaries]
c = 'riscv32-buildroot-linux-gnu-gcc'
strip = 'riscv32-buildroot-linux-gnu-strip'
pkgconfig = 'pkg-config'
python = '/usr/bin/python3'

[properties]
pkg_config_libdir = ['@GLOBAL_SOURCE_ROOT@' / '../buildroot/output/host/riscv32-buildroot-linux-gnu/sysroot/usr/local/lib/pkgconfig',
'@GLOBAL_SOURCE_ROOT@' / '../buildroot/output/host/riscv32-buildroot-linux-gnu/sysroot/usr/share/pkgconfig/',
'@GLOBAL_SOURCE_ROOT@' / '../buildroot/output/host/riscv32-buildroot-linux-gnu/sysroot/usr/lib/pkgconfig/'
]
sys_root = '@GLOBAL_SOURCE_ROOT@' / '../buildroot/output/host/riscv32-buildroot-linux-gnu/sysroot'

[host_machine]
system = 'linux'
cpu_family = 'riscv'
cpu = 'riscv32-ima'
endian = 'little'
Loading
Loading