Fredrik Salomonsson <platt...@posteo.net> writes: > Christine Lemmer-Webber <cweb...@dustycloud.org> writes: > >>> Cool! Hope it gets up and running soon. > > Thanks, I got it running somewhat. My batteries are still a bit messed > up after I accidentally let it drain them too low. I ordered a battery > charger so hopefully I can get them in great shape again.
Ooh! This is a great email. Thank you for your help. >>> In the meanwhile, some local notes... >>> >>> It looks like the relevant info to get going is here: >>> >>> https://mntre.com/reform2/handbook/advanced.html#system-boot >>> >>> There's a script to compile a custom u-boot: >>> >>> >>> https://source.mnt.re/reform/reform-system-image/-/blob/main/reform2-imx8mq/mkuboot.sh >>> >>> #+BEGIN_SRC bash >>> if [ ! -d u-boot ] >>> then >>> echo "Cloning U-Boot..." >>> git clone --depth 1 >>> https://source.mnt.re/reform/reform-boundary-uboot.git u-boot >>> fi >>> >>> cd u-boot >>> cp mntreform-config .config >>> >>> export CROSS_COMPILE=aarch64-linux-gnu- >>> export ARCH=arm >>> >>> # build rescue u-boot first (loads kernel from eMMC) >>> make -j$(nproc) flash.bin KCPPFLAGS='-DMNTREFORM_BOOT_EMMC' >>> cp flash.bin flash-rescue.bin >>> >>> # build normal u-boot second (loads kernel from SD card) >>> make -j$(nproc) flash.bin >>> >>> cd .. >>> #+END_SRC >>> >>> So that doesn't look to complicated. >>> >>> Here's the custom u-boot: >>> >>> https://source.mnt.re/reform/reform-boundary-uboot >>> >>> It says: >>> >>> "Fork of the vendor (Boundary Devices) u-boot for Reform 2, with >>> minor tweaks. The goal is to migrate to mainstream u-boot or barebox >>> ASAP. The main impediment so far is the 4GB RAM config." >>> >>> So we probably want to make a u-boot-mnt-reform in >>> gnu/packages/bootloaders.scm >>> >>> So we probably want to use "guix system image" and then add: >>> >>> gnu/system/images/mnt-reform.scm >>> >>> Ideally in the end we should be able to do: >>> >>> guix system image --image-type=mnt-reform my-os.scm >>> >>> So yeah, the rest of the pieces to figuring it out seem to be all here: >>> >>> https://mntre.com/reform2/handbook/advanced.html#system-boot >>> >>> It *seems* like this should all be possible... >>> >>> - Christine > > Thanks for the notes! I've just been poking around in the guix source > code to get a grasp how it works plus reading the Guix on an ARM Board > by Julien Lepiller [0] > > [0] https://guix.gnu.org/blog/2019/guix-on-an-arm-board/ > >> >> Here's the progress I've made so far: >> >> #+BEGIN_SRC diff >> diff --git a/gnu/packages/bootloaders.scm b/gnu/packages/bootloaders.scm >> index 2889a90d54..17a7abc657 100644 >> --- a/gnu/packages/bootloaders.scm >> +++ b/gnu/packages/bootloaders.scm >> @@ -953,6 +953,38 @@ to Novena upstream, does not load u-boot.img from the >> first partition.") >> `(("firmware" ,arm-trusted-firmware-rk3399) >> ,@(package-native-inputs base)))))) >> >> +(define-public u-boot-mnt-reform2 >> + (let ((base (make-u-boot-package "mnt-reform2" "aarch64-linux-gnu")) >> + (commit "bdcdce7434b9db19aabd59181014f24d66af0db8")) >> + (package >> + (inherit base) >> + (version "2021.06") >> + (name "u-boot-mnt-reform2") >> + (source (origin >> + (method git-fetch) >> + (uri (git-reference >> + (url >> "https://source.mnt.re/reform/reform-boundary-uboot.git") >> + (commit commit))) >> + (file-name (git-file-name name version)) >> + (sha256 >> + (base32 >> + "1pwmcaaxx5zvn26gznwz4rjki4w3wwfzdnipxfr7d8067fmwgjp3")))) >> + (arguments >> + (substitute-keyword-arguments (package-arguments base) >> + ((#:phases phases) >> + `(modify-phases ,phases >> + (replace 'configure >> + (lambda _ >> + (copy-file "mntreform-config" ".config"))) >> + >> + ;; Phases do not succeed on the bl31 ELF. >> + #;(delete 'strip) >> + #;(delete 'validate-runpath))))) >> + #;(native-inputs >> + `(("firmware" ,arm-trusted-firmware-rk3399) >> + ,@(package-native-inputs base)))) >> + )) >> + >> (define-public vboot-utils >> (package >> (name "vboot-utils") >> #+END_SRC >> >> However, I hit this error when trying to compile: >> >> #+BEGIN_VERBATIM >> starting phase `build' >> HOSTCC scripts/basic/fixdep >> In file included from >> /gnu/store/dj05znzsk7fq43zj5r719ll8ldgh9xxi-u-boot-mnt-reform2-2021.06-checkout/include/stdlib.h:9:0, >> from scripts/basic/fixdep.c:112: >> /gnu/store/dj05znzsk7fq43zj5r719ll8ldgh9xxi-u-boot-mnt-reform2-2021.06-checkout/include/malloc.h:875:22: >> error: missing binary operator before token "(" >> #if CONFIG_IS_ENABLED(SYS_MALLOC_SIMPLE) >> ^ >> In file included from scripts/basic/fixdep.c:113:0: >> /gnu/store/dj05znzsk7fq43zj5r719ll8ldgh9xxi-u-boot-mnt-reform2-2021.06-checkout/include/stdio.h:18:14: >> error: expected declaration specifiers or '...' before numeric constant >> int __printf(1, 2) printf(const char *fmt, ...); >> ^ >> /gnu/store/dj05znzsk7fq43zj5r719ll8ldgh9xxi-u-boot-mnt-reform2-2021.06-checkout/include/stdio.h:18:17: >> error: expected declaration specifiers or '...' before numeric constant >> int __printf(1, 2) printf(const char *fmt, ...); >> ^ >> /gnu/store/dj05znzsk7fq43zj5r719ll8ldgh9xxi-u-boot-mnt-reform2-2021.06-checkout/include/stdio.h:53:14: >> error: expected declaration specifiers or '...' before numeric constant >> int __printf(2, 3) fprintf(int file, const char *fmt, ...); >> ^ >> /gnu/store/dj05znzsk7fq43zj5r719ll8ldgh9xxi-u-boot-mnt-reform2-2021.06-checkout/include/stdio.h:53:17: >> error: expected declaration specifiers or '...' before numeric constant >> int __printf(2, 3) fprintf(int file, const char *fmt, ...); >> ^ >> scripts/basic/fixdep.c: In function 'usage': >> scripts/basic/fixdep.c:130:2: warning: implicit declaration of function >> 'fprintf' [-Wimplicit-function-declaration] >> fprintf(stderr, "Usage: fixdep <depfile> <target> <cmdline>\n"); >> ^~~~~~~ >> scripts/basic/fixdep.c:130:2: warning: incompatible implicit declaration of >> built-in function 'fprintf' >> scripts/basic/fixdep.c:130:2: note: include '<stdio.h>' or provide a >> declaration of 'fprintf' >> scripts/basic/fixdep.c:130:10: warning: passing argument 1 of 'fprintf' >> makes pointer from integer without a cast [-Wint-conversion] >> fprintf(stderr, "Usage: fixdep <depfile> <target> <cmdline>\n"); >> ^~~~~~ >> scripts/basic/fixdep.c:130:10: note: expected 'void *' but argument is of >> type 'int' >> scripts/basic/fixdep.c:131:2: warning: implicit declaration of function >> 'exit' [-Wimplicit-function-declaration] >> exit(1); >> ^~~~ >> scripts/basic/fixdep.c:131:2: warning: incompatible implicit declaration of >> built-in function 'exit' >> scripts/basic/fixdep.c:131:2: note: include '<stdlib.h>' or provide a >> declaration of 'exit' >> scripts/basic/fixdep.c: In function 'print_cmdline': >> scripts/basic/fixdep.c:139:2: warning: implicit declaration of function >> 'printf' [-Wimplicit-function-declaration] >> printf("cmd_%s := %s\n\n", target, cmdline); >> ^~~~~~ >> scripts/basic/fixdep.c:139:2: warning: incompatible implicit declaration of >> built-in function 'printf' >> scripts/basic/fixdep.c:139:2: note: include '<stdio.h>' or provide a >> declaration of 'printf' >> scripts/basic/fixdep.c: In function 'define_config': >> scripts/basic/fixdep.c:185:3: warning: implicit declaration of function >> 'perror'; did you mean 'strerror'? [-Wimplicit-function-declaration] >> perror("fixdep:malloc"); >> ^~~~~~ >> strerror >> scripts/basic/fixdep.c:186:3: warning: incompatible implicit declaration of >> built-in function 'exit' >> exit(1); >> ^~~~ >> scripts/basic/fixdep.c:186:3: note: include '<stdlib.h>' or provide a >> declaration of 'exit' >> scripts/basic/fixdep.c: In function 'use_config': >> scripts/basic/fixdep.c:208:2: warning: incompatible implicit declaration of >> built-in function 'printf' >> printf(" $(wildcard include/config/"); >> ^~~~~~ >> scripts/basic/fixdep.c:208:2: note: include '<stdio.h>' or provide a >> declaration of 'printf' >> scripts/basic/fixdep.c:215:3: warning: implicit declaration of function >> 'putchar' [-Wimplicit-function-declaration] >> putchar(c); >> ^~~~~~~ >> scripts/basic/fixdep.c: In function 'do_config_file': >> scripts/basic/fixdep.c:302:3: warning: incompatible implicit declaration of >> built-in function 'fprintf' >> fprintf(stderr, "fixdep: error opening config file: "); >> ^~~~~~~ >> scripts/basic/fixdep.c:302:3: note: include '<stdio.h>' or provide a >> declaration of 'fprintf' >> scripts/basic/fixdep.c:302:11: warning: passing argument 1 of 'fprintf' >> makes pointer from integer without a cast [-Wint-conversion] >> fprintf(stderr, "fixdep: error opening config file: "); >> ^~~~~~ >> scripts/basic/fixdep.c:302:11: note: expected 'void *' but argument is of >> type 'int' >> scripts/basic/fixdep.c:304:3: warning: incompatible implicit declaration of >> built-in function 'exit' >> exit(2); >> ^~~~ >> scripts/basic/fixdep.c:304:3: note: include '<stdlib.h>' or provide a >> declaration of 'exit' >> scripts/basic/fixdep.c:307:3: warning: incompatible implicit declaration of >> built-in function 'fprintf' >> fprintf(stderr, "fixdep: error fstat'ing config file: "); >> ^~~~~~~ >> scripts/basic/fixdep.c:307:3: note: include '<stdio.h>' or provide a >> declaration of 'fprintf' >> scripts/basic/fixdep.c:307:11: warning: passing argument 1 of 'fprintf' >> makes pointer from integer without a cast [-Wint-conversion] >> fprintf(stderr, "fixdep: error fstat'ing config file: "); >> ^~~~~~ >> scripts/basic/fixdep.c:307:11: note: expected 'void *' but argument is of >> type 'int' >> scripts/basic/fixdep.c:309:3: warning: incompatible implicit declaration of >> built-in function 'exit' >> exit(2); >> ^~~~ >> scripts/basic/fixdep.c:309:3: note: include '<stdlib.h>' or provide a >> declaration of 'exit' >> scripts/basic/fixdep.c: In function 'parse_dep_file': >> scripts/basic/fixdep.c:387:7: warning: incompatible implicit declaration of >> built-in function 'printf' >> printf("source_%s := %s\n\n", >> ^~~~~~ >> scripts/basic/fixdep.c:387:7: note: include '<stdio.h>' or provide a >> declaration of 'printf' >> scripts/basic/fixdep.c:394:6: warning: incompatible implicit declaration of >> built-in function 'printf' >> printf(" %s \\\n", s); >> ^~~~~~ >> scripts/basic/fixdep.c:394:6: note: include '<stdio.h>' or provide a >> declaration of 'printf' >> scripts/basic/fixdep.c:406:3: warning: incompatible implicit declaration of >> built-in function 'fprintf' >> fprintf(stderr, "fixdep: parse error; no targets found\n"); >> ^~~~~~~ >> scripts/basic/fixdep.c:406:3: note: include '<stdio.h>' or provide a >> declaration of 'fprintf' >> scripts/basic/fixdep.c:406:11: warning: passing argument 1 of 'fprintf' >> makes pointer from integer without a cast [-Wint-conversion] >> fprintf(stderr, "fixdep: parse error; no targets found\n"); >> ^~~~~~ >> scripts/basic/fixdep.c:406:11: note: expected 'void *' but argument is of >> type 'int' >> scripts/basic/fixdep.c:407:3: warning: incompatible implicit declaration of >> built-in function 'exit' >> exit(1); >> ^~~~ >> scripts/basic/fixdep.c:407:3: note: include '<stdlib.h>' or provide a >> declaration of 'exit' >> scripts/basic/fixdep.c:410:2: warning: incompatible implicit declaration of >> built-in function 'printf' >> printf("\n%s: $(deps_%s)\n\n", target, target); >> ^~~~~~ >> scripts/basic/fixdep.c:410:2: note: include '<stdio.h>' or provide a >> declaration of 'printf' >> scripts/basic/fixdep.c: In function 'print_deps': >> scripts/basic/fixdep.c:422:3: warning: incompatible implicit declaration of >> built-in function 'fprintf' >> fprintf(stderr, "fixdep: error opening depfile: "); >> ^~~~~~~ >> scripts/basic/fixdep.c:422:3: note: include '<stdio.h>' or provide a >> declaration of 'fprintf' >> scripts/basic/fixdep.c:422:11: warning: passing argument 1 of 'fprintf' >> makes pointer from integer without a cast [-Wint-conversion] >> fprintf(stderr, "fixdep: error opening depfile: "); >> ^~~~~~ >> scripts/basic/fixdep.c:422:11: note: expected 'void *' but argument is of >> type 'int' >> scripts/basic/fixdep.c:424:3: warning: incompatible implicit declaration of >> built-in function 'exit' >> exit(2); >> ^~~~ >> scripts/basic/fixdep.c:424:3: note: include '<stdlib.h>' or provide a >> declaration of 'exit' >> scripts/basic/fixdep.c:427:3: warning: incompatible implicit declaration of >> built-in function 'fprintf' >> fprintf(stderr, "fixdep: error fstat'ing depfile: "); >> ^~~~~~~ >> scripts/basic/fixdep.c:427:3: note: include '<stdio.h>' or provide a >> declaration of 'fprintf' >> scripts/basic/fixdep.c:427:11: warning: passing argument 1 of 'fprintf' >> makes pointer from integer without a cast [-Wint-conversion] >> fprintf(stderr, "fixdep: error fstat'ing depfile: "); >> ^~~~~~ >> scripts/basic/fixdep.c:427:11: note: expected 'void *' but argument is of >> type 'int' >> scripts/basic/fixdep.c:429:3: warning: incompatible implicit declaration of >> built-in function 'exit' >> exit(2); >> ^~~~ >> scripts/basic/fixdep.c:429:3: note: include '<stdlib.h>' or provide a >> declaration of 'exit' >> scripts/basic/fixdep.c:432:3: warning: incompatible implicit declaration of >> built-in function 'fprintf' >> fprintf(stderr,"fixdep: %s is empty\n",depfile); >> ^~~~~~~ >> scripts/basic/fixdep.c:432:3: note: include '<stdio.h>' or provide a >> declaration of 'fprintf' >> scripts/basic/fixdep.c:432:11: warning: passing argument 1 of 'fprintf' >> makes pointer from integer without a cast [-Wint-conversion] >> fprintf(stderr,"fixdep: %s is empty\n",depfile); >> ^~~~~~ >> scripts/basic/fixdep.c:432:11: note: expected 'void *' but argument is of >> type 'int' >> scripts/basic/fixdep.c: In function 'traps': >> scripts/basic/fixdep.c:456:3: warning: incompatible implicit declaration of >> built-in function 'fprintf' >> fprintf(stderr, "fixdep: sizeof(int) != 4 or wrong endianness? %#x\n", >> ^~~~~~~ >> scripts/basic/fixdep.c:456:3: note: include '<stdio.h>' or provide a >> declaration of 'fprintf' >> scripts/basic/fixdep.c:456:11: warning: passing argument 1 of 'fprintf' >> makes pointer from integer without a cast [-Wint-conversion] >> fprintf(stderr, "fixdep: sizeof(int) != 4 or wrong endianness? %#x\n", >> ^~~~~~ >> scripts/basic/fixdep.c:456:11: note: expected 'void *' but argument is of >> type 'int' >> scripts/basic/fixdep.c:458:3: warning: incompatible implicit declaration of >> built-in function 'exit' >> exit(2); >> ^~~~ >> scripts/basic/fixdep.c:458:3: note: include '<stdlib.h>' or provide a >> declaration of 'exit' >> make[2]: *** [scripts/Makefile.host:97: scripts/basic/fixdep] Error 1 >> make[1]: *** [Makefile:411: scripts_basic] Error 2 >> make: *** No rule to make target 'include/config/auto.conf', needed by >> 'include/config/uboot.release'. Stop. >> command "make" "-j" "8" "HOSTCC=gcc" "CROSS_COMPILE=aarch64-linux-gnu-" >> failed with status 2 >> note: keeping build directory >> `/tmp/guix-build-u-boot-mnt-reform2-2021.06.drv-1' >> builder for >> `/gnu/store/ahqnc7qa9mam5k6ycc61jw8df10af19m-u-boot-mnt-reform2-2021.06.drv' >> failed with exit code 1 >> build of >> /gnu/store/ahqnc7qa9mam5k6ycc61jw8df10af19m-u-boot-mnt-reform2-2021.06.drv >> failed >> View build log at >> '/var/log/guix/drvs/ah/qnc7qa9mam5k6ycc61jw8df10af19m-u-boot-mnt-reform2-2021.06.drv.bz2'. >> guix build: error: build of >> `/gnu/store/ahqnc7qa9mam5k6ycc61jw8df10af19m-u-boot-mnt-reform2-2021.06.drv' >> failed >> #+END_VERBATIM >> >> I guess here's where my lack of knowledge of C-land is failing me. >> >> Any thoughts or ideas? >> >> - Christine > > Sounds like the error: > >> /gnu/store/dj05znzsk7fq43zj5r719ll8ldgh9xxi-u-boot-mnt-reform2-2021.06-checkout/include/malloc.h:875:22: >> error: missing binary operator before token "(" >> #if CONFIG_IS_ENABLED(SYS_MALLOC_SIMPLE) >> ^ > > is due to the =CONFIG_IS_ENABLED= not being defined and causing the > preprocessor to error out. That seems right. I don't understand the config system that's here to know what to do. I noticed that the source/README directory says the following: #+BEGIN_QUOTE - CONFIG_SYS_MALLOC_SIMPLE Provides a simple and small malloc() and calloc() for those boards which do not use the full malloc in SPL (which is enabled with CONFIG_SYS_SPL_MALLOC_START). #+END_QUOTE Now note that by following their custom instructions, I had set a rule in the package definition above to copy =mntreform-config= to =.config= But I also just noticed something strange. The build directory is: /tmp/guix-build-u-boot-mnt-reform2-2021.06.drv-0/source yet the error appears as: /gnu/store/dj05znzsk7fq43zj5r719ll8ldgh9xxi-u-boot-mnt-reform2-2021.06-checkout/include/malloc.h I don't know how common this is, but this surprised me to see that it was pointing at something from the checkout rather than in the build directory. So, I changed where the copy config step was and put it in the source section. Then, since the config step incorrectly identified this as not being a valid board (we're really doing the config step manually) I deleted it: #+BEGIN_SRC scheme (define-public u-boot-mnt-reform2 (let ((base (make-u-boot-package "mnt-reform2" "aarch64-linux-gnu")) (commit "bdcdce7434b9db19aabd59181014f24d66af0db8")) (package (inherit base) (version "2021.06") (name "u-boot-mnt-reform2") (source (origin (method git-fetch) (uri (git-reference (url "https://source.mnt.re/reform/reform-boundary-uboot.git") (commit commit))) (file-name (git-file-name name version)) (sha256 (base32 "1pwmcaaxx5zvn26gznwz4rjki4w3wwfzdnipxfr7d8067fmwgjp3")) (snippet '(copy-file "mntreform-config" ".config")))) (arguments (substitute-keyword-arguments (package-arguments base) ((#:phases phases) `(modify-phases ,phases (delete 'configure)))))))) #+END_SRC Now things compile! Now note that it looks like we need to do two steps, so this probably is not complete. From the mkuboot.sh mentioned previously: #+BEGIN_SRC sh # build rescue u-boot first (loads kernel from eMMC) make -j$(nproc) flash.bin KCPPFLAGS='-DMNTREFORM_BOOT_EMMC' cp flash.bin flash-rescue.bin # build normal u-boot second (loads kernel from SD card) make -j$(nproc) flash.bin #+END_SRC So maybe we need to incorporate that before using this. However, I'm actually disturbed by looking at a few things in the "environment-variables" file spit out in the build file. It says the following: #+BEGIN_SRC sh export TEMP=\ "/tmp/guix-build-u-boot-mnt-reform2-2021.06.drv-0" export TEMPDIR=\ "/tmp/guix-build-u-boot-mnt-reform2-2021.06.drv-0" export TMP=\ "/tmp/guix-build-u-boot-mnt-reform2-2021.06.drv-0" export TMPDIR=\ "/tmp/guix-build-u-boot-mnt-reform2-2021.06.drv-0" #+END_SRC But here's the weird thing. This is in: /tmp/guix-build-u-boot-mnt-reform2-2021.06.drv-4 Now wait a minute. Look at that last number. What the hell is going on here? Is this a bug in Guix? Why is it pointing at -0 in the -4 build directory?