From f2d169e9e6a9f8b3bd04d04fdfd2fa21cdb21f41 Mon Sep 17 00:00:00 2001 From: Jian Jun Chen Date: Wed, 27 Jan 2021 14:31:40 +0800 Subject: [PATCH] doc: add script to build acrn ovmf with GOP driver Add a script to build acrn ovmf with GOP driver. The build is using a ubuntu 16.04 based docker image. Signed-off-by: Jian Jun Chen --- doc/static/downloads/build_acrn_ovmf.sh | 220 ++++++++++++++++++++++++ doc/tutorials/gpu-passthru.rst | 8 + 2 files changed, 228 insertions(+) create mode 100644 doc/static/downloads/build_acrn_ovmf.sh diff --git a/doc/static/downloads/build_acrn_ovmf.sh b/doc/static/downloads/build_acrn_ovmf.sh new file mode 100644 index 000000000..7377ee6ca --- /dev/null +++ b/doc/static/downloads/build_acrn_ovmf.sh @@ -0,0 +1,220 @@ +#!/bin/bash +# Copyright (C) 2021 Intel Corporation. +# SPDX-License-Identifier: BSD-3-Clause +# +# PREREQUISITES: +# 1) Get your specific "IntelGopDriver.efi" and "Vbt.bin" +# from your BIOS vender +# 2) Install Docker on your host machine and allow non-root users +# For Ubuntu: https://docs.docker.com/engine/install/ubuntu/ +# To enable non-root users: https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user +# 3) If you are working behind proxy, create a file named +# "proxy.conf" in ${your_working_directory} with +# configurations like below: +# Acquire::http::Proxy "http://x.y.z:port1"; +# Acquire::https::Proxy "https://x.y.z:port2"; +# Acquire::ftp::Proxy "ftp://x.y.z:port3"; +# +# HOWTO: +# 1) mkdir ${your_working_directory} +# 2) cd ${your_working_directory} +# 2) mkdir gop +# 3) cp /path/to/IntelGopDriver.efi /path/to/Vbt.bin gop +# 4) cp /path/to/build_acrn_ovmf.sh ${your_working_directory} +# 5) ./build_acrn_ovmf.sh +# +# OUTPUT: ${your_working_directory}/acrn-edk2/Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd +# +# For more information, ./build_acrn_ovmf.sh -h +# + +gop_bin_dir="./gop" +docker_image_name="ubuntu:ovmf.16.04" +proxy_conf="proxy.conf" +acrn_ver="latest" + +if [ ! -x "$(command -v docker)" ]; then + echo "Install Docker first:" + echo "If you are using Ubuntu, you can refer to: https://docs.docker.com/engine/install/ubuntu/" + exit +fi + +if [ ! -d "${gop_bin_dir}" ]; then + mkdir ${gop_bin_dir} + echo "Copy IntelGopDriver.efi and Vbt.bin to ${gop_bin_dir}" + exit +fi + +if [ ! -f "${gop_bin_dir}/IntelGopDriver.efi" ]; then + echo "Copy IntelGopDriver.efi to ${gop_bin_dir}" + exit +fi + +if [ ! -f "${gop_bin_dir}/Vbt.bin" ]; then + echo "Copy Vbt.bin to ${gop_bin_dir}" + exit +fi + +if [ ! -f "${proxy_conf}" ]; then + touch "${proxy_conf}" +fi + +usage() +{ + echo "$0 [-v ver] [-i] [-s] [-h]" + echo " -v ver: The release version of ACRN, e.g. 2.3" + echo " -i: Delete the existing docker image ${docker_image_name} and re-create it" + echo " -s: Delete the existing acrn-edk2 source code and re-download/re-patch it" + echo " -h: Show this help" + exit +} + +re_download=0 +re_create_image=0 + +while getopts "hisv:" opt +do + case "${opt}" in + h) + usage + ;; + i) + re_create_image=1 + ;; + s) + re_download=1 + ;; + v) + acrn_ver=${OPTARG} + ;; + ?) + echo "${OPTARG}" + ;; + esac +done +shift $((OPTIND-1)) + +if [[ "${re_create_image}" -eq 1 ]]; then + if [[ "$(docker images -q ${docker_image_name} 2> /dev/null)" != "" ]]; then + echo "====================================================================" + echo "Deleting the old Docker image ${docker_image_name} ..." + echo "====================================================================" + docker image rm -f "${docker_image_name}" + fi +fi + +if [[ "${re_download}" -eq 1 ]]; then + echo "====================================================================" + echo "Deleting the old acrn-edk2 source code ..." + echo "====================================================================" + sudo rm -rf acrn-edk2 +fi + +create_acrn_edk2_workspace() +{ + echo "====================================================================" + echo "Downloading & patching acrn_edk2 source code ..." + echo "====================================================================" + + [ -d acrn-edk2 ] && sudo rm -rf acrn-edk2 + + git clone https://github.com/projectacrn/acrn-edk2.git + if [ $? -ne 0 ]; then + echo "git clone acrn-edk2 failed" + return 1 + fi + + cd acrn-edk2 + git submodule update --init CryptoPkg/Library/OpensslLib/openssl + if [ $? -ne 0 ]; then + echo "git submodule acrn-edk2 failed" + return 1 + fi + + if [ "${acrn_ver}" != "latest" ]; then + git checkout --recurse-submodules -b "v${acrn_ver}" "ovmf-acrn-v${acrn_ver}" + if [ $? -ne 0 ]; then + echo "git checkout --recurse-submodules -b v${acrn_ver} ovmf-acrn-v${acrn_ver} failed" + return 1 + fi + fi + + wget -q https://projectacrn.github.io/${acrn_ver}/_static/downloads/Use-the-default-vbt-released-with-GOP-driver.patch + if [ $? -ne 0 ]; then + echo "Downloading Use-the-default-vbt-released-with-GOP-driver.patch failed" + return 1 + fi + + wget -q https://projectacrn.github.io/${acrn_ver}/_static/downloads/Integrate-IntelGopDriver-into-OVMF.patch + if [ $? -ne 0 ]; then + echo "Downloading Integrate-IntelGopDriver-into-OVMF.patch failed" + return 1 + fi + + git am --keep-cr Use-the-default-vbt-released-with-GOP-driver.patch + if [ $? -ne 0 ]; then + echo "Apply Use-the-default-vbt-released-with-GOP-driver.patch failed" + return 1 + fi + + git am --keep-cr Integrate-IntelGopDriver-into-OVMF.patch + if [ $? -ne 0 ]; then + echo "Apply Integrate-IntelGopDriver-into-OVMF.patch failed" + return 1 + fi + + return 0 +} + +create_docker_image() +{ + echo "====================================================================" + echo "Creating Docker image ..." + echo "====================================================================" + + cat > Dockerfile.ovmf < /dev/null)" == "" ]]; then + create_docker_image +fi + +if [ ! -d acrn-edk2 ]; then + create_acrn_edk2_workspace + if [ $? -ne 0 ]; then + echo "Download/patch acrn-edk2 failed" + exit + fi +else + cd acrn-edk2 +fi + +cp -f ../${gop_bin_dir}/IntelGopDriver.efi OvmfPkg/IntelGop/IntelGopDriver.efi +cp -f ../${gop_bin_dir}/Vbt.bin OvmfPkg/Vbt/Vbt.bin + +source edksetup.sh + +sed -i 's:^ACTIVE_PLATFORM\s*=\s*\w*/\w*\.dsc*:ACTIVE_PLATFORM = OvmfPkg/OvmfPkgX64.dsc:g' Conf/target.txt +sed -i 's:^TARGET_ARCH\s*=\s*\w*:TARGET_ARCH = X64:g' Conf/target.txt +sed -i 's:^TOOL_CHAIN_TAG\s*=\s*\w*:TOOL_CHAIN_TAG = GCC5:g' Conf/target.txt + +cd .. + +docker run \ + -ti \ + --rm \ + -w $PWD/acrn-edk2 \ + --privileged=true \ + -v $PWD:$PWD \ + ${docker_image_name} \ + /bin/bash -c "source edksetup.sh && make -C BaseTools && build -DFD_SIZE_2MB -DDEBUG_ON_SERIAL_PORT=TRUE" diff --git a/doc/tutorials/gpu-passthru.rst b/doc/tutorials/gpu-passthru.rst index 5824092fd..aba6ea838 100644 --- a/doc/tutorials/gpu-passthru.rst +++ b/doc/tutorials/gpu-passthru.rst @@ -165,3 +165,11 @@ Keep in mind the following: ``Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd``. Transfer the binary to your target machine. - Modify the launch script to specify the OVMF you built just now. + +Script +====== + +Once you've installed the Docker environment, you can use this +`script <../_static/downloads/build_acrn_ovmf.sh>`_ to build ACRN OVMF +with the GOP driver enabled. For more details about the script usage, +run ``build_acrn_ovmf.sh -h``.