From 02508fdf4986c88a9d6a5159d6371035552924b4 Mon Sep 17 00:00:00 2001 From: Penguin Date: Tue, 28 Nov 2023 18:45:16 -0600 Subject: [PATCH] add qemu and chroot stuff NOT FINISHED --- README.md | 314 +++++++++++++++++++++++++++++---- README.org | 263 ++++++++++++++++++++++++++- doc/img/toolchain-settings.png | Bin 0 -> 52541 bytes 3 files changed, 535 insertions(+), 42 deletions(-) create mode 100644 doc/img/toolchain-settings.png diff --git a/README.md b/README.md index eb906b9..2e6527e 100644 --- a/README.md +++ b/README.md @@ -1,51 +1,55 @@ # Table of Contents -1. [Preface](#org1e835ab) -2. [Prerequisites](#org906530a) - 1. [Using the riscv toolchain provided via crossdev](#org81f210c) - 2. [Using a precompiled toolchain](#orgcee506a) -3. [Clone & Build Heart Software Services (HSS)](#orgcf597f6) - 1. [Clone HSS](#org457b83e) - 2. [Build HSS](#org3e3a28d) -4. [Clone & Build u-boot](#orgf0e36bd) - 1. [Clone u-boot](#org8956801) - 2. [Download the patches](#org93d8740) - 3. [Build u-boot](#org6208aac) -5. [Build the Linux kernel](#org9277169) -6. [Generate the HSS payload](#org48e5afc) -7. [Gentoo](#orgdc16ac3) +1. [Preface](#org50a5e4e) +2. [Prerequisites](#orgf2a2f54) + 1. [Using the riscv toolchain provided via crossdev](#orgb4ce84a) + 2. [Using a precompiled toolchain](#org9b64e30) +3. [Clone & Build Heart Software Services (HSS)](#org32e7194) + 1. [Clone HSS](#orgb4d121b) + 2. [Build HSS](#org726b843) +4. [Clone & Build u-boot](#org82839bd) + 1. [Clone u-boot](#orgfa0f9c6) + 2. [Download the patches](#orge8d926b) + 3. [Build u-boot](#org705d7b6) +5. [Build the Linux kernel](#org83a0ff0) +6. [Generate the HSS payload](#orgc2f2fd3) +7. [Gentoo](#orgde9efba) - + # Preface This guide is written in a way that forces the reader to manually perform every step, excluding environment variables via the setup script because I want to be able to change those. If you would like to follow the official guide provided by beagleboard, which is far more streamlined and automated, please see the references at the bottom of this document. +**WARNING** This guide is very much still a work in progress. Do not expect anything to work yet. - + + # Prerequisites emerge -a sys-block/bmap-tools sys-fs/genimage dev-libs/libyaml sys-fs/mtools mkdir beaglev-fire-gentoo && cd beaglev-fire-gentoo + export PROJECT_ROOT="$PWD" # deploy will contain any output files, images, etc mkdir deploy - + ## Using the riscv toolchain provided via crossdev -Crossdev is required for this step. If you don’t have crossdev set up, use [this](https://wiki.gentoo.org/wiki/Crossdev) guide to install it. At the time of writing this installs riscv64-unknown-linux-gnu-gcc 13.2.1. This is note worthy because the official guide uses 11.4. If there are issues with this toolchain, use the precompiled toolchain via [these steps](#orgcee506a). +Crossdev is required for this step. If you don’t have crossdev set up, use [this](https://wiki.gentoo.org/wiki/Crossdev) guide to install it. At the time of writing this installs riscv64-unknown-linux-gnu-gcc 13.2.1. This is note worthy because the official guide uses 11.4. If there are issues with this toolchain, use the precompiled toolchain via [these steps](#org9b64e30). + crossdev -t riscv64-unknown-linux-gnu export RISCV64_CC="riscv64-unknown-linux-gnu-" - + ## Using a precompiled toolchain @@ -69,12 +73,12 @@ Export some other misc. environment variables: export CORES=$(getconf _NPROCESSORS_ONLN) - + # Clone & Build Heart Software Services (HSS) - + ## Clone HSS @@ -85,7 +89,7 @@ Export some other misc. environment variables: git clone -b ${HSS_BRANCH} ${HSS_REPO} ./hart-software-services/ --depth=${GIT_DEPTH} - + ## Build HSS @@ -94,12 +98,12 @@ Export some other misc. environment variables: cp -v ./hart-software-services/tools/hss-payload-generator/hss-payload-generator ./deploy/ - + # Clone & Build u-boot - + ## Clone u-boot @@ -110,7 +114,7 @@ Export some other misc. environment variables: git clone -b ${UBOOT_BRANCH} ${UBOOT_REPO} ./u-boot/ --depth=${GIT_DEPTH} - + ## Download the patches @@ -119,21 +123,21 @@ The patches currently exist as part of BeagleV’s `BeagleV-Fire-ubuntu` rep git clone https://git.beagleboard.org/beaglev-fire/BeagleV-Fire-ubuntu.git ./beaglev --depth=${GIT_DEPTH} - + ## WIP Build u-boot # Apply patches to uboot - cp -v ./patches/u-boot/beaglev-fire/microchip_mpfs_icicle.h ./u-boot/include/configs/microchip_mpfs_icicle.h - cp -v ./patches/u-boot/beaglev-fire/microchip-mpfs-icicle-kit.dts ./u-boot/arch/riscv/dts/ - cp -v ./patches/u-boot/beaglev-fire/microchip_mpfs_icicle_defconfig ./u-boot/configs/microchip_mpfs_icicle_defconfig + cp -v ./beaglev/patches/u-boot/beaglev-fire/microchip_mpfs_icicle.h ./u-boot/include/configs/microchip_mpfs_icicle.h + cp -v ./beaglev/patches/u-boot/beaglev-fire/microchip-mpfs-icicle-kit.dts ./u-boot/arch/riscv/dts/ + cp -v ./beaglev/patches/u-boot/beaglev-fire/microchip_mpfs_icicle_defconfig ./u-boot/configs/microchip_mpfs_icicle_defconfig make -C u-boot ARCH=riscv CROSS_COMPILE=${RISCV64_CC} microchip_mpfs_icicle_defconfig # if you want to make configurations.... # make -C u-boot ARCH=riscv CROSS_COMPILE=${RISCV64_CC} menuconfig make -C u-boot ARCH=riscv CROSS_COMPILE=${RISCV64_CC} olddefconfig make -C u-boot ARCH=riscv CROSS_COMPILE=${RISCV64_CC} savedefconfig cp -v ./u-boot/defconfig ./u-boot/configs/microchip_mpfs_icicle_defconfig - cp -v ./u-boot/defconfig ./patches/u-boot/beaglev-fire/microchip_mpfs_icicle_defconfig + cp -v ./u-boot/defconfig ./beaglev/patches/u-boot/beaglev-fire/microchip_mpfs_icicle_defconfig make -C u-boot -j${CORES} ARCH=riscv CROSS_COMPILE=${RISCV_CC} all # copy the generated uboot into our deploy folder cp -v ./u-boot/u-boot.bin ./deploy/ @@ -141,17 +145,257 @@ The patches currently exist as part of BeagleV’s `BeagleV-Fire-ubuntu` rep cp -v ./u-boot/u-boot.bin ./deploy/src.bin - + # TODO Build the Linux kernel + cd ./beaglev/linux/ + if [ ! -f ./.patched ] ; then + if [ -f arch/riscv/configs/mpfs_defconfig ] ; then + git am ../patches/linux/0002-PCIe-Change-controller-and-bridge-base-address.patch + git am ../patches/linux/0003-GPIO-Add-Microchip-CoreGPIO-driver.patch + git am ../patches/linux/0004-ADC-Add-Microchip-MCP356X-driver.patch + git am ../patches/linux/0005-Microchip-QSPI-Add-regular-transfers.patch + git am ../patches/linux/0006-BeagleV-Fire-Add-printk-to-IM219-driver-for-board-te.patch + git am ../patches/linux/0007-MMC-SPI-Hack-to-support-non-DMA-capable-SPI-ctrl.patch + git am ../patches/linux/0008-Add-wireless-regdb-regulatory-database-file.patch + git am ../patches/linux/0009-Makefile-build-mpfs-beaglev-fire.dtb.patch + fi + touch .patched + fi + + if [ -f arch/riscv/configs/mpfs_defconfig ] ; then + cp -v ../device-tree/src/microchip/mpfs-beaglev-fire.dts arch/riscv/boot/dts/microchip/ + cp -v ../device-tree/src/microchip/mpfs-beaglev-fire-fabric.dtsi arch/riscv/boot/dts/microchip/ + fi + + echo "make ARCH=riscv CROSS_COMPILE=${RISCV64_CC} clean" + make ARCH=riscv CROSS_COMPILE=${RISCV64_CC} clean + + if [ -f arch/riscv/configs/mpfs_defconfig ] ; then + cp -v ../patches/linux/mpfs_defconfig ./arch/riscv/configs/mpfs_defconfig + + echo "make ARCH=riscv CROSS_COMPILE=${RISCV64_CC} mpfs_defconfig" + make ARCH=riscv CROSS_COMPILE=${RISCV64_CC} mpfs_defconfig + + ./scripts/config --set-str CONFIG_LOCALVERSION "-$(date +%Y%m%d)" + + ./scripts/config --enable CONFIG_CRYPTO_USER_API_HASH + ./scripts/config --enable CONFIG_CRYPTO_USER_API_SKCIPHER + ./scripts/config --enable CONFIG_KEY_DH_OPERATIONS + ./scripts/config --enable CONFIG_CRYPTO_ECB + ./scripts/config --enable CONFIG_CRYPTO_MD4 + ./scripts/config --enable CONFIG_CRYPTO_MD5 + ./scripts/config --enable CONFIG_CRYPTO_CBC + ./scripts/config --enable CONFIG_CRYPTO_SHA256 + ./scripts/config --enable CONFIG_CRYPTO_AES + ./scripts/config --enable CONFIG_CRYPTO_DES + ./scripts/config --enable CONFIG_CRYPTO_CMAC + ./scripts/config --enable CONFIG_CRYPTO_HMAC + ./scripts/config --enable CONFIG_CRYPTO_SHA512 + ./scripts/config --enable CONFIG_CRYPTO_SHA1 + + echo "make -j${CORES} ARCH=riscv CROSS_COMPILE=${RISCV64_CC} olddefconfig" + make -j${CORES} ARCH=riscv CROSS_COMPILE=${RISCV64_CC} olddefconfig + else + echo "make ARCH=riscv CROSS_COMPILE=${RISCV64_CC} defconfig" + make ARCH=riscv CROSS_COMPILE=${RISCV64_CC} defconfig + + ./scripts/config --enable CONFIG_PCIE_MICROCHIP_HOST + + ./scripts/config --enable CONFIG_OF_OVERLAY + + ./scripts/config --enable CONFIG_I2C + ./scripts/config --enable CONFIG_EEPROM_AT24 + ./scripts/config --enable CONFIG_I2C_MICROCHIP_CORE + + ./scripts/config --enable CONFIG_SPI_MICROCHIP_CORE + ./scripts/config --enable CONFIG_SPI_MICROCHIP_CORE_QSPI + ./scripts/config --module CONFIG_SPI_SPIDEV + + ./scripts/config --enable CONFIG_GPIO_SYSFS + + ./scripts/config --enable CONFIG_HW_RANDOM_POLARFIRE_SOC + + ./scripts/config --enable CONFIG_USB_MUSB_HDRC + ./scripts/config --enable CONFIG_NOP_USB_XCEIV + ./scripts/config --enable CONFIG_USB_MUSB_POLARFIRE_SOC + ./scripts/config --enable CONFIG_USB_MUSB_DUAL_ROLE + + ./scripts/config --enable CONFIG_MAILBOX + ./scripts/config --enable CONFIG_POLARFIRE_SOC_MAILBOX + ./scripts/config --disable CONFIG_SUN6I_MSGBOX + + ./scripts/config --enable CONFIG_REMOTEPROC + ./scripts/config --enable CONFIG_REMOTEPROC_CDEV + + ./scripts/config --enable CONFIG_POLARFIRE_SOC_SYS_CTRL + + ./scripts/config --enable CONFIG_USB_GADGET + ./scripts/config --enable CONFIG_USB_CONFIGFS + ./scripts/config --enable CONFIG_CONFIGFS_FS + ./scripts/config --enable CONFIG_USB_CONFIGFS_SERIAL + ./scripts/config --enable CONFIG_USB_CONFIGFS_ACM + ./scripts/config --enable CONFIG_USB_CONFIGFS_OBEX + ./scripts/config --enable CONFIG_USB_CONFIGFS_NCM + ./scripts/config --enable CONFIG_USB_CONFIGFS_ECM + ./scripts/config --enable CONFIG_USB_CONFIGFS_ECM_SUBSET + ./scripts/config --enable CONFIG_USB_CONFIGFS_RNDIS + ./scripts/config --enable CONFIG_USB_CONFIGFS_EEM + ./scripts/config --enable CONFIG_USB_CONFIGFS_PHONET + ./scripts/config --enable CONFIG_USB_CONFIGFS_MASS_STORAGE + ./scripts/config --enable CONFIG_USB_CONFIGFS_F_LB_SS + ./scripts/config --enable CONFIG_USB_CONFIGFS_F_FS + ./scripts/config --enable CONFIG_USB_CONFIGFS_F_UAC1 + ./scripts/config --enable CONFIG_USB_CONFIGFS_F_UAC2 + ./scripts/config --enable CONFIG_USB_CONFIGFS_F_MIDI + ./scripts/config --enable CONFIG_USB_CONFIGFS_F_HID + ./scripts/config --enable CONFIG_USB_CONFIGFS_F_UVC + ./scripts/config --enable CONFIG_USB_CONFIGFS_F_PRINTER + + ./scripts/config --module CONFIG_MEDIA_SUPPORT + ./scripts/config --enable CONFIG_MEDIA_SUPPORT_FILTER + ./scripts/config --enable CONFIG_MEDIA_SUBDRV_AUTOSELECT + ./scripts/config --enable CONFIG_MEDIA_CAMERA_SUPPORT + ./scripts/config --module CONFIG_VIDEO_IMX219 + + ./scripts/config --module CONFIG_IIO + + #Cleanup large DRM... + ./scripts/config --disable CONFIG_DRM + ./scripts/config --disable CONFIG_DRM_RADEON + ./scripts/config --disable CONFIG_DRM_NOUVEAU + ./scripts/config --disable CONFIG_DRM_SUN4I + + #Optimize: + ./scripts/config --enable CONFIG_IP_NF_IPTABLES + ./scripts/config --enable CONFIG_NETFILTER_XTABLES + ./scripts/config --enable CONFIG_NLS_ISO8859_1 + ./scripts/config --enable CONFIG_BLK_DEV_DM + + ./scripts/config --set-str CONFIG_LOCALVERSION "-$(date +%Y%m%d)" + + echo "make -j${CORES} ARCH=riscv CROSS_COMPILE=${RISCV64_CC} olddefconfig" + make -j${CORES} ARCH=riscv CROSS_COMPILE=${RISCV64_CC} olddefconfig + fi + + echo "make -j${CORES} ARCH=riscv CROSS_COMPILE=${RISCV64_CC} Image modules dtbs" + make -j${CORES} ARCH=riscv CROSS_COMPILE="ccache ${RISCV64_CC}" Image modules dtbs + + if [ ! -f ./arch/riscv/boot/Image ] ; then + echo "Build Failed" + exit 2 + fi + + KERNEL_UTS=$(cat "${PROJECT_ROOT}/linux/include/generated/utsrelease.h" | awk '{print $3}' | sed 's/\"//g' ) + + if [ -d "${PROJECT_ROOT}/deploy/tmp/" ] ; then + rm -rf "${PROJECT_ROOT}/deploy/tmp/" + fi + mkdir -p "${PROJECT_ROOT}/deploy/tmp/" + + make -s ARCH=riscv CROSS_COMPILE=${RISCV64_CC} modules_install INSTALL_MOD_PATH="${PROJECT_ROOT}/deploy/tmp" + + if [ -f "${PROJECT_ROOT}/deploy/${KERNEL_UTS}-modules.tar.gz" ] ; then + rm -rf "${PROJECT_ROOT}/deploy/${KERNEL_UTS}-modules.tar.gz" || true + fi + echo "Compressing ${KERNEL_UTS}-modules.tar.gz..." + echo "${KERNEL_UTS}" > "${PROJECT_ROOT}/deploy/.modules" + cd "${PROJECT_ROOT}/deploy/tmp" || true + tar --create --gzip --file "../${KERNEL_UTS}-modules.tar.gz" ./* + cd "${PROJECT_ROOT}/linux/" || exit + rm -rf "${PROJECT_ROOT}/deploy/tmp" || true + + if [ -f arch/riscv/configs/mpfs_defconfig ] ; then + cp -v ./.config ../patches/linux/mpfs_defconfig + cp -v ./arch/riscv/boot/dts/microchip/mpfs-beaglev-fire.dts ../patches/linux/dts/mpfs-beaglev-fire.dts + cp -v ./arch/riscv/boot/dts/microchip/mpfs-beaglev-fire-fabric.dtsi ../patches/linux/dts/mpfs-beaglev-fire-fabric.dtsi + else + cp -v ./.config ../patches/linux/mainline/defconfig + cp -v ./arch/riscv/boot/dts/microchip/mpfs-beaglev-fire.dts ../patches/linux/mainline/dts/mpfs-beaglev-fire.dts + cp -v ./arch/riscv/boot/dts/microchip/mpfs-beaglev-fire-fabric.dtsi ../patches/linux/mainline/dts/mpfs-beaglev-fire-fabric.dtsi + fi + if [ ! -d ../deploy/input/ ] ; then + mkdir -p ../deploy/input/ || true + fi + cp -v ./arch/riscv/boot/Image ../deploy/input/ + cp -v ./arch/riscv/boot/dts/microchip/mpfs-beaglev-fire.dtb ../deploy/input/ + + cd ../ + + cp -v ./patches/linux/beaglev_fire.its ./deploy/input/ + cd ./deploy/input/ + gzip -9 Image -c > Image.gz + if [ -f ../../u-boot/tools/mkimage ] ; then + ../../u-boot/tools/mkimage -f beaglev_fire.its beaglev_fire.itb + fi + + + - +# WIP Generate the HSS payload -# TODO Generate the HSS payload + cd ./deploy/ + + if [ -f ./src.bin ] ; then + if [ ! -d ./input/ ] ; then + mkdir ./input/ + fi + + if [ -f ./input/payload.bin ] ; then + rm -rf ./input/payload.bin || true + fi + + ./hss-payload-generator -vv -c config.yaml ./input/payload.bin + + date + unset test_var + test_var=$(strings ./u-boot.bin | grep 'U-Boot 20' | head -n1 || true) + if [ ! "x${test_var}" = "x" ] ; then + echo "[u-boot.bin: ${test_var}]" + fi + + unset test_var + test_var=$(strings ./src.bin | grep 'U-Boot 20' | head -n1 || true) + if [ ! "x${test_var}" = "x" ] ; then + echo "[src.bin: ${test_var}]" + fi + + unset test_var + test_var=$(strings ./input/payload.bin | grep 'U-Boot 20' | head -n1 || true) + if [ ! "x${test_var}" = "x" ] ; then + echo "[payload.bin:${test_var}]" + fi + fi + + # - + -# TODO Gentoo +# WIP Gentoo + +rootfs setup +install stage3 + +qemu + + echo -E ':riscv64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xf3\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-riscv64:' > /proc/sys/fs/binfmt_misc/register + + echo -E ':riscv64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xf3\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-riscv64:' > /etc/binfmt.d/qemu-riscv64-static.conf + +chroot + + mount --types proc /proc ./ignore/.root/proc + mount --rbind /sys ./ignore/.root/sys + mount --make-rslave ./ignore/.root/sys + mount --rbind /dev ./ignore/.root/dev + mount --make-rslave ./ignore/.root/dev + mount --bind /run ./ignore/.root/run + mount --make-slave ./ignore/.root/run + + cd ./ignore/.root + chroot $PWD /bin/bash + source /etc/profile + export PS1="(chroot) ${PS1}" diff --git a/README.org b/README.org index 835ec99..762d3df 100644 --- a/README.org +++ b/README.org @@ -3,11 +3,14 @@ * Preface This guide is written in a way that forces the reader to manually perform every step, excluding environment variables via the setup script because I want to be able to change those. If you would like to follow the official guide provided by beagleboard, which is far more streamlined and automated, please see the references at the bottom of this document. +*WARNING* This guide is very much still a work in progress. Do not expect anything to work yet. + * Prerequisites #+begin_src bash :noeval emerge -a sys-block/bmap-tools sys-fs/genimage dev-libs/libyaml sys-fs/mtools mkdir beaglev-fire-gentoo && cd beaglev-fire-gentoo +export PROJECT_ROOT="$PWD" # deploy will contain any output files, images, etc mkdir deploy #+end_src @@ -15,7 +18,7 @@ mkdir deploy ** Using the riscv toolchain provided via crossdev Crossdev is required for this step. If you don't have crossdev set up, use [[https://wiki.gentoo.org/wiki/Crossdev][this]] guide to install it. At the time of writing this installs riscv64-unknown-linux-gnu-gcc 13.2.1. This is note worthy because the official guide uses 11.4. If there are issues with this toolchain, use the precompiled toolchain via [[*Using a precompiled toolchain][these steps]]. - +[[wikipedia:google.com]] #+begin_src bash crossdev -t riscv64-unknown-linux-gnu export RISCV64_CC="riscv64-unknown-linux-gnu-" @@ -84,16 +87,16 @@ git clone https://git.beagleboard.org/beaglev-fire/BeagleV-Fire-ubuntu.git ./bea ** WIP Build u-boot #+begin_src bash # Apply patches to uboot -cp -v ./patches/u-boot/beaglev-fire/microchip_mpfs_icicle.h ./u-boot/include/configs/microchip_mpfs_icicle.h -cp -v ./patches/u-boot/beaglev-fire/microchip-mpfs-icicle-kit.dts ./u-boot/arch/riscv/dts/ -cp -v ./patches/u-boot/beaglev-fire/microchip_mpfs_icicle_defconfig ./u-boot/configs/microchip_mpfs_icicle_defconfig +cp -v ./beaglev/patches/u-boot/beaglev-fire/microchip_mpfs_icicle.h ./u-boot/include/configs/microchip_mpfs_icicle.h +cp -v ./beaglev/patches/u-boot/beaglev-fire/microchip-mpfs-icicle-kit.dts ./u-boot/arch/riscv/dts/ +cp -v ./beaglev/patches/u-boot/beaglev-fire/microchip_mpfs_icicle_defconfig ./u-boot/configs/microchip_mpfs_icicle_defconfig make -C u-boot ARCH=riscv CROSS_COMPILE=${RISCV64_CC} microchip_mpfs_icicle_defconfig # if you want to make configurations.... # make -C u-boot ARCH=riscv CROSS_COMPILE=${RISCV64_CC} menuconfig make -C u-boot ARCH=riscv CROSS_COMPILE=${RISCV64_CC} olddefconfig make -C u-boot ARCH=riscv CROSS_COMPILE=${RISCV64_CC} savedefconfig cp -v ./u-boot/defconfig ./u-boot/configs/microchip_mpfs_icicle_defconfig -cp -v ./u-boot/defconfig ./patches/u-boot/beaglev-fire/microchip_mpfs_icicle_defconfig +cp -v ./u-boot/defconfig ./beaglev/patches/u-boot/beaglev-fire/microchip_mpfs_icicle_defconfig make -C u-boot -j${CORES} ARCH=riscv CROSS_COMPILE=${RISCV_CC} all # copy the generated uboot into our deploy folder cp -v ./u-boot/u-boot.bin ./deploy/ @@ -102,5 +105,251 @@ cp -v ./u-boot/u-boot.bin ./deploy/src.bin #+end_src * TODO Build the Linux kernel -* TODO Generate the HSS payload -* TODO Gentoo + +#+begin_src bash +cd ./beaglev/linux/ +if [ ! -f ./.patched ] ; then + if [ -f arch/riscv/configs/mpfs_defconfig ] ; then + git am ../patches/linux/0002-PCIe-Change-controller-and-bridge-base-address.patch + git am ../patches/linux/0003-GPIO-Add-Microchip-CoreGPIO-driver.patch + git am ../patches/linux/0004-ADC-Add-Microchip-MCP356X-driver.patch + git am ../patches/linux/0005-Microchip-QSPI-Add-regular-transfers.patch + git am ../patches/linux/0006-BeagleV-Fire-Add-printk-to-IM219-driver-for-board-te.patch + git am ../patches/linux/0007-MMC-SPI-Hack-to-support-non-DMA-capable-SPI-ctrl.patch + git am ../patches/linux/0008-Add-wireless-regdb-regulatory-database-file.patch + git am ../patches/linux/0009-Makefile-build-mpfs-beaglev-fire.dtb.patch + fi + touch .patched +fi + +if [ -f arch/riscv/configs/mpfs_defconfig ] ; then + cp -v ../device-tree/src/microchip/mpfs-beaglev-fire.dts arch/riscv/boot/dts/microchip/ + cp -v ../device-tree/src/microchip/mpfs-beaglev-fire-fabric.dtsi arch/riscv/boot/dts/microchip/ +fi + +echo "make ARCH=riscv CROSS_COMPILE=${RISCV64_CC} clean" +make ARCH=riscv CROSS_COMPILE=${RISCV64_CC} clean + +if [ -f arch/riscv/configs/mpfs_defconfig ] ; then + cp -v ../patches/linux/mpfs_defconfig ./arch/riscv/configs/mpfs_defconfig + + echo "make ARCH=riscv CROSS_COMPILE=${RISCV64_CC} mpfs_defconfig" + make ARCH=riscv CROSS_COMPILE=${RISCV64_CC} mpfs_defconfig + + ./scripts/config --set-str CONFIG_LOCALVERSION "-$(date +%Y%m%d)" + + ./scripts/config --enable CONFIG_CRYPTO_USER_API_HASH + ./scripts/config --enable CONFIG_CRYPTO_USER_API_SKCIPHER + ./scripts/config --enable CONFIG_KEY_DH_OPERATIONS + ./scripts/config --enable CONFIG_CRYPTO_ECB + ./scripts/config --enable CONFIG_CRYPTO_MD4 + ./scripts/config --enable CONFIG_CRYPTO_MD5 + ./scripts/config --enable CONFIG_CRYPTO_CBC + ./scripts/config --enable CONFIG_CRYPTO_SHA256 + ./scripts/config --enable CONFIG_CRYPTO_AES + ./scripts/config --enable CONFIG_CRYPTO_DES + ./scripts/config --enable CONFIG_CRYPTO_CMAC + ./scripts/config --enable CONFIG_CRYPTO_HMAC + ./scripts/config --enable CONFIG_CRYPTO_SHA512 + ./scripts/config --enable CONFIG_CRYPTO_SHA1 + + echo "make -j${CORES} ARCH=riscv CROSS_COMPILE=${RISCV64_CC} olddefconfig" + make -j${CORES} ARCH=riscv CROSS_COMPILE=${RISCV64_CC} olddefconfig +else + echo "make ARCH=riscv CROSS_COMPILE=${RISCV64_CC} defconfig" + make ARCH=riscv CROSS_COMPILE=${RISCV64_CC} defconfig + + ./scripts/config --enable CONFIG_PCIE_MICROCHIP_HOST + + ./scripts/config --enable CONFIG_OF_OVERLAY + + ./scripts/config --enable CONFIG_I2C + ./scripts/config --enable CONFIG_EEPROM_AT24 + ./scripts/config --enable CONFIG_I2C_MICROCHIP_CORE + + ./scripts/config --enable CONFIG_SPI_MICROCHIP_CORE + ./scripts/config --enable CONFIG_SPI_MICROCHIP_CORE_QSPI + ./scripts/config --module CONFIG_SPI_SPIDEV + + ./scripts/config --enable CONFIG_GPIO_SYSFS + + ./scripts/config --enable CONFIG_HW_RANDOM_POLARFIRE_SOC + + ./scripts/config --enable CONFIG_USB_MUSB_HDRC + ./scripts/config --enable CONFIG_NOP_USB_XCEIV + ./scripts/config --enable CONFIG_USB_MUSB_POLARFIRE_SOC + ./scripts/config --enable CONFIG_USB_MUSB_DUAL_ROLE + + ./scripts/config --enable CONFIG_MAILBOX + ./scripts/config --enable CONFIG_POLARFIRE_SOC_MAILBOX + ./scripts/config --disable CONFIG_SUN6I_MSGBOX + + ./scripts/config --enable CONFIG_REMOTEPROC + ./scripts/config --enable CONFIG_REMOTEPROC_CDEV + + ./scripts/config --enable CONFIG_POLARFIRE_SOC_SYS_CTRL + + ./scripts/config --enable CONFIG_USB_GADGET + ./scripts/config --enable CONFIG_USB_CONFIGFS + ./scripts/config --enable CONFIG_CONFIGFS_FS + ./scripts/config --enable CONFIG_USB_CONFIGFS_SERIAL + ./scripts/config --enable CONFIG_USB_CONFIGFS_ACM + ./scripts/config --enable CONFIG_USB_CONFIGFS_OBEX + ./scripts/config --enable CONFIG_USB_CONFIGFS_NCM + ./scripts/config --enable CONFIG_USB_CONFIGFS_ECM + ./scripts/config --enable CONFIG_USB_CONFIGFS_ECM_SUBSET + ./scripts/config --enable CONFIG_USB_CONFIGFS_RNDIS + ./scripts/config --enable CONFIG_USB_CONFIGFS_EEM + ./scripts/config --enable CONFIG_USB_CONFIGFS_PHONET + ./scripts/config --enable CONFIG_USB_CONFIGFS_MASS_STORAGE + ./scripts/config --enable CONFIG_USB_CONFIGFS_F_LB_SS + ./scripts/config --enable CONFIG_USB_CONFIGFS_F_FS + ./scripts/config --enable CONFIG_USB_CONFIGFS_F_UAC1 + ./scripts/config --enable CONFIG_USB_CONFIGFS_F_UAC2 + ./scripts/config --enable CONFIG_USB_CONFIGFS_F_MIDI + ./scripts/config --enable CONFIG_USB_CONFIGFS_F_HID + ./scripts/config --enable CONFIG_USB_CONFIGFS_F_UVC + ./scripts/config --enable CONFIG_USB_CONFIGFS_F_PRINTER + + ./scripts/config --module CONFIG_MEDIA_SUPPORT + ./scripts/config --enable CONFIG_MEDIA_SUPPORT_FILTER + ./scripts/config --enable CONFIG_MEDIA_SUBDRV_AUTOSELECT + ./scripts/config --enable CONFIG_MEDIA_CAMERA_SUPPORT + ./scripts/config --module CONFIG_VIDEO_IMX219 + + ./scripts/config --module CONFIG_IIO + + #Cleanup large DRM... + ./scripts/config --disable CONFIG_DRM + ./scripts/config --disable CONFIG_DRM_RADEON + ./scripts/config --disable CONFIG_DRM_NOUVEAU + ./scripts/config --disable CONFIG_DRM_SUN4I + + #Optimize: + ./scripts/config --enable CONFIG_IP_NF_IPTABLES + ./scripts/config --enable CONFIG_NETFILTER_XTABLES + ./scripts/config --enable CONFIG_NLS_ISO8859_1 + ./scripts/config --enable CONFIG_BLK_DEV_DM + + ./scripts/config --set-str CONFIG_LOCALVERSION "-$(date +%Y%m%d)" + + echo "make -j${CORES} ARCH=riscv CROSS_COMPILE=${RISCV64_CC} olddefconfig" + make -j${CORES} ARCH=riscv CROSS_COMPILE=${RISCV64_CC} olddefconfig +fi + +echo "make -j${CORES} ARCH=riscv CROSS_COMPILE=${RISCV64_CC} Image modules dtbs" +make -j${CORES} ARCH=riscv CROSS_COMPILE="ccache ${RISCV64_CC}" Image modules dtbs + +if [ ! -f ./arch/riscv/boot/Image ] ; then + echo "Build Failed" + exit 2 +fi + +KERNEL_UTS=$(cat "${PROJECT_ROOT}/linux/include/generated/utsrelease.h" | awk '{print $3}' | sed 's/\"//g' ) + +if [ -d "${PROJECT_ROOT}/deploy/tmp/" ] ; then + rm -rf "${PROJECT_ROOT}/deploy/tmp/" +fi +mkdir -p "${PROJECT_ROOT}/deploy/tmp/" + +make -s ARCH=riscv CROSS_COMPILE=${RISCV64_CC} modules_install INSTALL_MOD_PATH="${PROJECT_ROOT}/deploy/tmp" + +if [ -f "${PROJECT_ROOT}/deploy/${KERNEL_UTS}-modules.tar.gz" ] ; then + rm -rf "${PROJECT_ROOT}/deploy/${KERNEL_UTS}-modules.tar.gz" || true +fi +echo "Compressing ${KERNEL_UTS}-modules.tar.gz..." +echo "${KERNEL_UTS}" > "${PROJECT_ROOT}/deploy/.modules" +cd "${PROJECT_ROOT}/deploy/tmp" || true +tar --create --gzip --file "../${KERNEL_UTS}-modules.tar.gz" ./* +cd "${PROJECT_ROOT}/linux/" || exit +rm -rf "${PROJECT_ROOT}/deploy/tmp" || true + +if [ -f arch/riscv/configs/mpfs_defconfig ] ; then + cp -v ./.config ../patches/linux/mpfs_defconfig + cp -v ./arch/riscv/boot/dts/microchip/mpfs-beaglev-fire.dts ../patches/linux/dts/mpfs-beaglev-fire.dts + cp -v ./arch/riscv/boot/dts/microchip/mpfs-beaglev-fire-fabric.dtsi ../patches/linux/dts/mpfs-beaglev-fire-fabric.dtsi +else + cp -v ./.config ../patches/linux/mainline/defconfig + cp -v ./arch/riscv/boot/dts/microchip/mpfs-beaglev-fire.dts ../patches/linux/mainline/dts/mpfs-beaglev-fire.dts + cp -v ./arch/riscv/boot/dts/microchip/mpfs-beaglev-fire-fabric.dtsi ../patches/linux/mainline/dts/mpfs-beaglev-fire-fabric.dtsi +fi +if [ ! -d ../deploy/input/ ] ; then + mkdir -p ../deploy/input/ || true +fi +cp -v ./arch/riscv/boot/Image ../deploy/input/ +cp -v ./arch/riscv/boot/dts/microchip/mpfs-beaglev-fire.dtb ../deploy/input/ + +cd ../ + +cp -v ./patches/linux/beaglev_fire.its ./deploy/input/ +cd ./deploy/input/ +gzip -9 Image -c > Image.gz +if [ -f ../../u-boot/tools/mkimage ] ; then + ../../u-boot/tools/mkimage -f beaglev_fire.its beaglev_fire.itb +fi +#+end_src + +* WIP Generate the HSS payload + +#+begin_src bash +cd ./deploy/ + +if [ -f ./src.bin ] ; then + if [ ! -d ./input/ ] ; then + mkdir ./input/ + fi + + if [ -f ./input/payload.bin ] ; then + rm -rf ./input/payload.bin || true + fi + + ./hss-payload-generator -vv -c config.yaml ./input/payload.bin + + date + unset test_var + test_var=$(strings ./u-boot.bin | grep 'U-Boot 20' | head -n1 || true) + if [ ! "x${test_var}" = "x" ] ; then + echo "[u-boot.bin: ${test_var}]" + fi + + unset test_var + test_var=$(strings ./src.bin | grep 'U-Boot 20' | head -n1 || true) + if [ ! "x${test_var}" = "x" ] ; then + echo "[src.bin: ${test_var}]" + fi + + unset test_var + test_var=$(strings ./input/payload.bin | grep 'U-Boot 20' | head -n1 || true) + if [ ! "x${test_var}" = "x" ] ; then + echo "[payload.bin:${test_var}]" + fi +fi + +# +#+end_src +* WIP Gentoo +rootfs setup +install stage3 + +qemu +#+begin_src bash +echo -E ':riscv64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xf3\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-riscv64:' > /proc/sys/fs/binfmt_misc/register + +echo -E ':riscv64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xf3\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-riscv64:' > /etc/binfmt.d/qemu-riscv64-static.conf +#+end_src + +chroot +#+begin_src bash +mount --types proc /proc ./ignore/.root/proc +mount --rbind /sys ./ignore/.root/sys +mount --make-rslave ./ignore/.root/sys +mount --rbind /dev ./ignore/.root/dev +mount --make-rslave ./ignore/.root/dev +mount --bind /run ./ignore/.root/run +mount --make-slave ./ignore/.root/run + +cd ./ignore/.root +chroot $PWD /bin/bash +source /etc/profile +export PS1="(chroot) ${PS1}" +#+end_src diff --git a/doc/img/toolchain-settings.png b/doc/img/toolchain-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..e8d434ab2feeb1becab06172b6d9f6e31f9fcdd7 GIT binary patch literal 52541 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 Ghkply$WHJ8 literal 0 HcmV?d00001