===== Compiling own kernels from L4T sources ===== I can compile and run the kernel with the patches from June 2018 on the Fedora30 userland, but it has many issues: compiling with '-j5' leads to resets, just '-j1' works. Also no sound output. So here I try to recompile L4T kernels. **Note:** With the steps below I get a compiled kernel and dts, but I can not boot these, and did not succeed to debug further what fails, as I do not get any output on the internal or HDMI connected screen when booting the self compiled kernel. This is based on [[https://gbatemp.net/threads/l4t-ubuntu-a-fully-featured-linux-on-your-switch.537301/page-68#post-8652447|this post]]. Recompiling the L4T kernel from a running L4T 1.3.1. Also install updates, the gcc updates are required - attempts to recompile with the plain gcc from the L4T image fails. mkdir -p ~/buildkernel cd ~/buildkernel #Download Nvidia Bits echo "Downloading All Required Files, This may take a while..... Please Wait" wget -O "linux-nvgpu-r32.1.tar.gz" \ "https://nv-tegra.nvidia.com/gitweb/?p=linux-nvgpu.git;a=snapshot;h=tegra-l4t-r32.1;sf=tgz" > /dev/null wget -O "soc-tegra-rel-30-r2.tar.gz" \ "https://nv-tegra.nvidia.com/gitweb/?p=device/hardware/nvidia/soc/tegra.git;a=snapshot;h=rel-30-r2;sf=tgz" > /dev/null wget -O "soc-tegra-t210-rel-30-r2.tar.gz" \ "https://nv-tegra.nvidia.com/gitweb/?p=device/hardware/nvidia/soc/t210.git;a=snapshot;h=rel-30-r2;sf=tgz" > /dev/null wget -O "platform-tegra-common-rel-30-r2.tar.gz" \ "https://nv-tegra.nvidia.com/gitweb/?p=device/hardware/nvidia/platform/tegra/common.git;a=snapshot;h=rel-30-r2;sf=tgz" > /dev/null wget -O "platform-tegra-t210-common-rel-30-r2.tar.gz" \ "https://nv-tegra.nvidia.com/gitweb/?p=device/hardware/nvidia/platform/t210/common.git;a=snapshot;h=rel-30-r2;sf=tgz" > /dev/null #Clone Switchroot Bits git clone "https://gitlab.com/switchroot/l4t-kernel-4.9.git" > /dev/null git clone "https://gitlab.com/switchroot/l4t-kernel-nvidia.git" > /dev/null git clone "https://gitlab.com/switchroot/l4t-platform-t210-switch.git" > /dev/null #Move Switchroot bits KERNEL_DIR="./kernel/kernel-4.9" # Handle Standard Kernel Bits mkdir -p $KERNEL_DIR mv ./l4t-kernel-4.9/* $KERNEL_DIR rm -rf ./l4t-kernel-4.9 # Handle Nvidia Kernel bits mkdir -p ./kernel/nvidia mv ./l4t-kernel-nvidia*/* ./kernel/nvidia rm -rf ./l4t-kernel-nvidia* # Handle Switchroot DTS files mkdir -p ./kernel/hardware/nvidia/platform/t210/switch mv ./l4t-platform-t210-switch*/* ./kernel/hardware/nvidia/platform/t210/switch/ rm -rf ./l4t-platform-t210-switch* # Extract and place nvidia bits mkdir -p ./kernel/nvgpu mkdir linux-nvgpu tar -xf "./linux-nvgpu-r32.1.tar.gz" -C linux-nvgpu --strip 1 mv ./linux-nvgpu/* ./kernel/nvgpu rm -r linux-nvgpu ./linux-nvgpu-r32.1.tar.gz # Extracting Tegra SOC Data mkdir -p ./kernel/hardware/nvidia/soc/tegra/ soc-tegra tar -xf "./soc-tegra-rel-30-r2.tar.gz" -C soc-tegra --strip 1 mv ./soc-tegra/* ./kernel/hardware/nvidia/soc/tegra/ rm -r soc-tegra soc-tegra-rel-30-r2.tar.gz # Extracting T210 SOC Data mkdir -p ./kernel/hardware/nvidia/soc/t210/ soc-tegra-t210 tar -xf "soc-tegra-t210-rel-30-r2.tar.gz" -C soc-tegra-t210 --strip 1 mv ./soc-tegra-t210/* ./kernel/hardware/nvidia/soc/t210/ rm -r soc-tegra-t210 soc-tegra-t210-rel-30-r2.tar.gz # Extracting Tegra Common Platform Data mkdir -p ./kernel/hardware/nvidia/platform/tegra/common/ platform-tegra-common tar -xf "platform-tegra-common-rel-30-r2.tar.gz" -C platform-tegra-common --strip 1 mv ./platform-tegra-common/* ./kernel/hardware/nvidia/platform/tegra/common/ rm -r platform-tegra-common platform-tegra-common-rel-30-r2.tar.gz # Extracting T210 Common Platform Data mkdir -p ./kernel/hardware/nvidia/platform/t210/common/ common-t210 tar -xf "platform-tegra-t210-common-rel-30-r2.tar.gz" -C common-t210 --strip 1 mv ./common-t210/* ./kernel/hardware/nvidia/platform/t210/common/ rm -r common-t210 platform-tegra-t210-common-rel-30-r2.tar.gz # Preparing Source and Creating Defconfig cd ./kernel/kernel-4.9 # This command fails, because it is missing .config, but is # needed to create the defconfig which becomes .config.... Not sure why. make prepare make t210_switch_defconfig make prepare make modules_prepare # To change settings: make menuconfig # compile kernel make -j5 tegra-dtstree="../hardware/nvidia/" # install modules type make modules_install # also, additional files required. # To install, these files are needed, i.e. in /boot cp arch/arm64/boot/Image.gz /boot/l4t-ubuntu/Image cp arch/arm64/boot/dts/tegra210-icosa.dtb /boot/l4t-ubuntu/tegra210-icosa.dtb * The build fails here: make[1]: *** No rule to make target '/lib/firmware/brcm/BCM4356A3.hcd', needed by 'firmware/brcm/BCM4356A3.hcd.gen.o'. Stop. Makefile:1025: recipe for target 'firmware' failed make: *** [firmware] Error 2 * Need to deploy files /lib/firmware/brcm/BCM4356A3.hcd /lib/firmware/brcm/BCM.hcd /lib/firmware/brcm/brcmfmac4356-pcie.txt . * Could be used from [[https://github.com/lakka-switch/Lakka-LibreELEC/tree/master/projects/Switch/devices/L4T/filesystem/usr/lib/firmware|here]]. Yet, these files do not exactly have the filenames which are requested when building the kernel. * You could also extract them from the switch using https://github.com/perillamint/nx-fwextract * Or rely on these: https://gist.github.com/kiding/34916dd163d700098980ec0b8901a033 ===== booting kernels via usb ===== The normal L4T kernel can via usb be booted as follows. The partition which the initrd should jump into is set in file switch.scr . After changing the file, 'mkimage' from coreboot has to be used to compile a new switch.scr.img which is then used for booting. This output is from the x86_64 system which is supplying the kernel to the switch. [root@電脳 usb_loader_l4tkernel]# cat imx_usb.conf #vid:pid, config_file 0x0955:0x701a, switch.conf [root@電脳 usb_loader_l4tkernel]# [root@電脳 usb_loader_l4tkernel]# cat switch.conf switch hid,1024,0x80000000,0x80000000,2G Image:load 0x83000000 tegra210-icosa.dtb:load 0x8d000000 initramfs:load 0x92000000 switch.scr.img:load 0x8e000000,jump_direct 0x8e000000 [root@電脳 usb_loader_l4tkernel]# [root@電脳 usb_loader_l4tkernel]# cat switch.scr # mkimage -A arm64 -T script -C none -n "boot.scr" -d switch.scr switch.scr.img load mmc 1:1 0x83000000 Image load mmc 1:1 0x8d000000 tegra210-icosa.dtb load mmc 1:1 0x92000000 initramfs setenv bootargs 'root=/dev/mmcblk0p2 rw rootwait relative_sleep_states=1 access=m2 console=tty0 firmware_class.path=/lib/firmware/ fbcon=primary:1' usb reset booti 0x83000000 0x92000000 0x8d000000 [root@電脳 usb_loader_l4tkernel]# # this is my shellscript which will # - supply coreboot to the switch # - copy a raw switch.scr.3 file (same as above, but instructing # to boot /dev/mmcblk0p3 # - run 'mkimage' from coreboot to compile switch.scr.img # - and then supply kernel, initrd, dtb-file and switch.scr.img # as specified in switch.conf [root@電脳 usb_loader_l4tkernel]#