Hi Lior, On 31.05.23 10:05, Lior Weintraub wrote: > Hi Ahmad, > > Thanks again for your prompt reply and accurate tips! > Took the following changes: > 1. Increasing the DRAM size to 128MB (let barebox start from 0). > 2. Set PBL stack to offset 2MB from DRAM
Just use end of SRAM, so you are completely independent of DRAM until you call barebox_arm_entry. > 3. Fix the device tree "memory" entry to have 128MB. (y) > 4. Load barebox-spider-mk1-evk.img to SRAM and run from there. > > Now I can see the following logs: > uncompress.c: memory at 0x00000000, size 0x08000000 > uncompress.c: uncompressing barebox binary at 0x000000c0000021c0 (size > 0x0001e3a4) to 0x07e00000 (uncompressed size: 0x000390d0) > uncompress.c: jumping to uncompressed image at 0x0000000007e00000 > start.c: memory at 0x00000000, size 0x08000000 > start.c: found DTB in boarddata, copying to 0x07dffcc0 > start.c: initializing malloc pool at 0x079ffcc0 (size 0x00400000) > start.c: starting barebox... > initcall-> command_slice_init+0x0/0x3c > initcall-> globalvar_init+0x0/0x80 > register_device: global > register_device: nv > initcall-> platform_init+0x0/0x1c > register_device: platform > initcall-> amba_bus_init+0x0/0x1c > register_device: amba > initcall-> spi_bus_init+0x0/0x1c > register_device: spi > initcall-> gpio_desc_alloc+0x0/0x24 > initcall-> fs_bus_init+0x0/0x1c > register_device: fs > initcall-> aarch64_init_vectors+0x0/0x50 > initcall-> gpio_gate_clock_driver_register+0x0/0x1c > register_driver: gpio-gate-clock > initcall-> of_arm_init+0x0/0x5c > start.c: barebox_arm_boot_dtb: using barebox_boarddata > using boarddata provided DTB > adding DT alias:serial0: stem=serial id=0 node=/soc/serial@d000307000 > register_device: machine > of_platform_bus_create() - skipping /chosen, no compatible prop > of_platform_bus_create() - skipping /aliases, no compatible prop > of_platform_bus_create() - skipping /cpus, no compatible prop > of_platform_bus_create() - skipping /memory@0, no compatible prop > of_platform_bus_create() - skipping /soc, no compatible prop > initcall-> register_autoboot_vars+0x0/0x70 > initcall-> arm_arch_timer_driver_register+0x0/0x1c > register_driver: arm-architected-timer > initcall-> of_timer_init+0x0/0x20 > initcall-> init_fs+0x0/0x3c > initcall-> pl011_driver_register+0x0/0x1c > register_driver: uart-pl011 > initcall-> of_stdoutpath_init+0x0/0x28 > initcall-> of_probe_memory+0x0/0x60 > __request_region ok: 0x00000000:0x07ffffff flags=0x0 > initcall-> __bare_init_end+0x0/0x6c > register_device: mem0 > initcall-> of_reserved_mem_walk+0x0/0x1ac > initcall-> mem_malloc_resource+0x0/0xa8 > __request_region ok: 0x079ffcc0:0x07dffcbf flags=0x200 > __request_region ok: 0x07e00000:0x07e2aeff flags=0x200 > __request_region ok: 0x07e2af00:0x07e390cf flags=0x200 > __request_region ok: 0x07e390d0:0x07e3adaf flags=0x200 > initcall-> bootsource_init+0x0/0x40 > initcall-> ramfs_init+0x0/0x1c > register_driver: ramfs > initcall-> devfs_init+0x0/0x1c > register_driver: devfs > initcall-> arm_request_stack+0x0/0x398 > __request_region ok: 0x07ff0000:0x07ff7fff flags=0x200 > initcall-> mount_root+0x0/0x7c > mount: none on / type ramfs, options= > register_device: ramfs0 > probe-> ramfs0 > mount: none on /dev type devfs, options= > register_device: devfs0 > probe-> devfs0 > initcall-> binfmt_sh_init+0x0/0x1c > initcall-> binfmt_uimage_init+0x0/0x1c > initcall-> console_common_init+0x0/0x48 > initcall-> of_kernel_init+0x0/0x28 > initcall-> console_ctrlc_init+0x0/0x30 > initcall-> mem_init+0x0/0x90 > register_device: mem1 > register_driver: mem > probe-> mem0 > probe-> mem1 > initcall-> of_partition_init+0x0/0x48 > initcall-> prng_init+0x0/0x40 > initcall-> null_init+0x0/0x40 > initcall-> full_init+0x0/0x40 > initcall-> zero_init+0x0/0x40 > initcall-> spider_board_driver_register+0x0/0x1c > register_driver: board-spider > probe-> machine > initcall-> barebox_memory_areas_init+0x0/0x40 > __request_region ok: 0x07dffcc0:0x07dfffce flags=0x200 > initcall-> barebox_of_populate+0x0/0x28 > initcall-> of_register_memory_fixup+0x0/0x20 > initcall-> dummy_csrc_warn+0x0/0x44 > WARNING: Warning: Using dummy clocksource Add a arm,armv8-timer node into your SoC device tree. This lets barebox and Linux know that you have the ARM architected timer available. Without that, you'll notice that timeouts are wrong. > initcall-> bootm_init+0x0/0xf4 > initcall-> init_command_list+0x0/0x40 > register command bootm > register command cat > register command cd > register command clear > register command cp > register command cpuinfo > register command devinfo > register command drvinfo > register command echo > register command exit > register command false > register command help > register command ? > register command ll > register command ls > register command md > register command memcmp > register command memcpy > register command memset > register command mkdir > register command mount > register command mw > register command pwd > register command rm > register command rmdir > register command setenv > register command sh > register command source > register command . > register command test > register command [ > register command true > register command : > register command umount > register command version > initcall-> display_meminfo+0x0/0xa8 > barebox code: 0x7e00000 -> 0x7e2aeff > bss segment: 0x7e390d0 -> 0x7e3adaf > malloc space: 0x079ffcc0 -> 0x07dffcbf (size 4 MiB) > initcall-> of_register_bootargs_fixup+0x0/0x3c > initcall-> device_probe_deferred+0x0/0x14c > initcall-> of_init_hostname+0x0/0x28 > initcall-> aarch64_register_image_handler+0x0/0x2c > initcall-> load_environment+0x0/0x4c > loading defaultenv > environment load /dev/env0: No such file or directory > Maybe you have to create the partition. > initcalls done > > Hit any to stop autoboot: 0 > boot: No such file or directory > barebox:/ > > > Few questions: > 1. The serial input doesn't work. i.e. I cannot type anything hence cannot > interact with barebox terminal. DEBUG_LL only does otuput. For input, you will want to load the driver. Do you have CONFIG_SERIAL_AMBA_PL011 enabled? > Does it require GIC and setting interrupts for it to work? No interrupts needed. barebox runs with interrupts disabled and everything is done cooperatively. > 2. What does "of_platform_bus_create() - skipping" means? Do I need to fix > that? That's normal debugging output. Some device tree nodes are busses, which have children. These entries are skipped because they have no compatible. This is expected. I'd suggest you remove your VERBOSED_DEBUG define, so you are not spammed by too much debugging output. > 3. Looks like I am still missing some stuff (rootfs? Environment? Mounting? > Partitions?) Take multi_v8_defconfig, open menuconfig and enable your SoC and use that. That will be quicker than enabling everything yourself. If it doesn't work out of the box, try imx_v8_defconfig. Once you get around to upstreaming your SoC, I'd suggest you just add it to multi_v8_defconfig. Not all ARMv8 SoCs are supported there, but those that are make development easier, because we don't need to build as many different configs.. Cheers, Ahmad > > Thanks, > Have a great day, > Lior. > > >> -----Original Message----- >> From: Ahmad Fatoum <a.fat...@pengutronix.de> >> Sent: Wednesday, May 31, 2023 9:11 AM >> To: Lior Weintraub <li...@pliops.com>; Ahmad Fatoum <ah...@a3f.at>; >> barebox@lists.infradead.org >> Subject: Re: [PATCH v2] Porting barebox to a new SoC >> >> CAUTION: External Sender >> >> Hi Lior, >> >> On 30.05.23 22:10, Lior Weintraub wrote: >>> Hello Ahmad, >>> >>> Thanks again for your kind support! >>> Your comments helped me progress and the current situation is as follows: >>> Our QEMU Spider machine is running a BL1.elf file using the following >> command: >>> QEMU_AUDIO_DRV=none qemu-system-aarch64 -M spider-soc -smp 1 -m >> 128M -nographic \ >>> -device loader,file=BL1.elf -cpu cortex-a53,rvbar=0xC004000000 \ >>> -d unimp -semihosting-config enable=on,target=native \ >>> -monitor telnet:localhost:1235,server,nowait \ >>> -gdb tcp::1236 >>> >>> The BL1.elf is our BootROM application that runs from ROM address >> 0xC004000000. >>> Just for debugging purpose we've increased the ROM size so it can include >> the images/barebox-spider-mk1-evk.img (as a const array). >>> BL1 then copy it (using memcpy) to address 0 and jumps there for >> execution. >> >> Sounds ok. >> >>> On the real ASIC this address will be the DRAM and indeed will need to be >> initialized before the copy but here on QEMU it is not required. >> >> I see. You could still have your bootrom move barebox into SRAM and then >> >> barebox_arm_entry(DRAM_ADDR, SZ_128M, __dtb_spider_mk1_evk_start); >> >> To have PBL extract barebox to DRAM. Even if you don't need need DRAM >> setup in QEMU, the flow would be similar to what you will have on actual >> silicon. >> >>> The lowlevel.c of spider-evk was modified to use DRAM_ADDR 0x400000 >> (4MB from start) and MY_STACK_TOP was set to 0x8000000 (128M). >> >> That's not needed. While you don't have control where barebox PBL will be >> located >> (depends on BootROM), barebox will extract itself to the end of DRAM >> without >> overwriting itself, so you can just use DRAM_ADDR 0 normally. Eventually, >> stack >> top should go into SRAM, but anywhere that works is ok. >> >>> In addition, I implemented putc_ll (currently hard-coded in >> include/debug_ll.h) and opened log level to VERBOSE_DEBUG (currently just >> hard-coded in printk.h). >> >> There's CONFIG_DEBUG_PBL you can enable to get all these messages by >> default. >> >>> I see the following (which makes sense) logs on QEMU terminal: >>> uncompress.c: memory at 0x00400000, size 0x00200000 >>> uncompress.c: uncompressing barebox binary at 0x0000000000002200 >> (size 0x0001d3b2) to 0x00400000 (uncompressed size: 0x000373d0) >> >> Why pass only 2M to barebox_arm_entry? While this need not be the whole >> of RAM, this >> initial memory is what barebox will use for itself including its final stack >> and >> malloc area. barebox will also not place itself into the last 1M AFAIK, so 2M >> may not work ok. You should use the minimum possible RAM here or if you >> can detect >> in PBL how much RAM you have or just the whole RAM bank. I am not sure >> anything lower >> than SZ_4M would work ok. (Note this is DRAM size, not SRAM. barebox PBL >> is fine being >> called from 64K SRAMs, it just needs DRAM to extract to). >> >>> I then connect with aarch64-none-elf-gdb, load the barebox symbols (to >> 0x400000) and check the current execution state (program counter and >> stack). >>> Looks like the code is stuck on function register_autoboot_vars: >>> sp 0x5f7e60 0x5f7e60 >>> pc 0x401264 0x401264 <register_autoboot_vars+24> >>> >>> Few observations: >>> 1. The PBL was using stack top located on 0x8000000 (which is >> MY_STACK_TOP). Found it be causing a breakpoint on the PBL. >>> 2. Barebox uses a stack top on 0x600000 which is probably calculated from >> my new DRAM_ADDR and SZ_2M given to the function call: >>> barebox_arm_entry(DRAM_ADDR, SZ_2M, __dtb_spider_mk1_evk_start); >>> >>> This is great! I am starting to find my way. >> >> :) Ye, the ENTRY_FUNCTION_WITHSTACK is only when the BootROM doesn't >> enter >> with a valid stack pointer. It's overwritten as soon as barebox is told >> about the initial memory layout (with barebox_arm_entry). >> >>> When the barebox execution didn't print anything to the terminal I >> remembered that we used a place holder on the dtsi for the uart. >>> So now I changed it to: >>> uart0: serial@d000307000 { >>> compatible = "arm,pl011", "arm,primecell"; >>> reg = <0xd0 0x307000 0 0x1000>; >>> } >>> (Our QEMU UART is currently using pl011 device.) >> >> Looks ok. Don't forget to enable the driver (via make menuconfig). >> >>> After some time (trying to debug by enabling MMU but then reverted the >> code back), I got to a point that when I try to run again I am getting an >> exception. >>> I can swear all code changes were reverted back to the point where I saw the >> barebox stuck on register_autoboot_vars but now it just cases an exception. >>> The exception vector code is located on our ROM (part of BL1 code) and the >> logs shows that the link register has the value 0x401218 which suggest the >> following code: >>> 0000000000001200 <load_environment>: >>> 1200: a9be7bfd stp x29, x30, [sp, #-32]! >>> 1204: 910003fd mov x29, sp >>> 1208: a90153f3 stp x19, x20, [sp, #16] >>> 120c: 94000a07 bl 3a28 <default_environment_path_get> >>> 1210: d00000f3 adrp x19, 1f000 <do_cpuinfo+0x1f0> >>> 1214: 912a7273 add x19, x19, #0xa9c >>> 1218: aa0003f4 mov x20, x0 >>> >>> Any ideas or suggestions how to proceed with the debugging? >> >> You shouldn't need to touch the MMU code. If your initial memory setup >> is wonky, you may end up overwriting stuff. Try again with bigger memory. >> >>> BTW, to answer your questions: >>> The SRAM of 4MB is the only one we have because we assumed it is only for >> BootROM to load a PBL >> >> Ok. Sometimes there are SRAMs for use with DMA. I asked, because a SRAM >> in the first 4M >> would lend itself nicely as stack, but if there is none, we can adjust >> ENTRY_FUNCTION_WITHSTACK to accept a 64-bit parameter. >> >> Cheers, >> Ahmad >> >>> Thank you very much, >>> Cheers, >>> Lior. >>> >>> >>>> -----Original Message----- >>>> From: Ahmad Fatoum <a.fat...@pengutronix.de> >>>> Sent: Monday, May 29, 2023 10:03 PM >>>> To: Lior Weintraub <li...@pliops.com>; Ahmad Fatoum <ah...@a3f.at>; >>>> barebox@lists.infradead.org >>>> Subject: Re: [PATCH v2] Porting barebox to a new SoC >>>> >>>> CAUTION: External Sender >>>> >>>> Hello Lior, >>>> >>>> On 29.05.23 15:34, Lior Weintraub wrote: >>>>> Hi Ahmad, >>>>> >>>>> I have revised the addresses and used DRAM address @ 0 instead: >>>>> #define UARTBASE (0xD000307000) >>>>> #define DRAM_ADDR (0x00000000) >>>>> #define MY_STACK_TOP (0x00000000 + SZ_2M) // Set the stack 2MB >> from >>>> DRAM start >>>> >>>> Is DRAM configured by the time barebox runs? If not, you should keep >> stack >>>> top >>>> in SRAM, until you have setup memory in prebootloader (PBL). Is the 4M >>>> SRAM >>>> the only on-chip SRAM you have? >>>> >>>>> static inline void spider_serial_putc(void *base, int c) >>>>> { >>>>> *((volatile unsigned *)base) = c; >>>> >>>> There's a helper for that: writel(c, base); In barebox, it's equivalent >>>> to the volatile access, but in Linux it involves a write memory barrier. >>>> We try to write code in barebox, so it's easily reusable in Linux (and >>>> the other way round). >>>> >>>>> } >>>>> >>>>> I will try to test it on QEMU using an initial QEMU machine we made for >>>> Spider. >>>>> In this machine we only have 3 memory regions and a PL011 UART: >>>>> spider_soc_memories soc_memories[] = { >>>>> {.name = "SPIDER_GPRAM", .add = 0xC000000000ULL, .size = 4 * MiB}, >>>>> {.name = "SPIDER_ROM", .add = 0xC004000000ULL, .size = 128 * >> KiB}, >>>>> {.name = "SPIDER_DRAM", .add = 0x0000000000ULL, .size = 1 * GiB}, >>>>> }; >>>>> >>>>> This special QEMU machine can run our BL1 code from "ROM" address >> (we >>>> set the RVBAR to point there). >>>>> So my idea is to test the barebox image by the following steps: >>>>> 1. Modify the QEMU code to have a "ROM" with the size of 128M. >>>>> 2. Compile our BL1 code to include the barebox.bin as a const array, copy >> it >>>> to "DRAM" @ address 0 and jump there. >>>> >>>> Why not map QEMU -bios option to SRAM? (Or DRAM directly, if it needs >> no >>>> special setup from >>>> barebox side). >>>> >>>>> For this to work I wanted to understand how to call (i.e. what arguments >> to >>>> pass) to barebox. >>>> >>>> barebox doesn't expect any arguments, because most BootROMs don't >> pass >>>> anything useful. >>>> Some pass information about bootsource though, so that's why the >>>> ENTRY_FUNCTION has >>>> r0, r1 and r2 as parameters, but you need not use them. >>>> >>>>> So I checked the barebox.map and found the function "start" on address >> 0. >>>> >>>> You may know that Linux on some platforms comes with a decompressor >> that >>>> is glued to the >>>> front of the kernel image and extracts the compressed kernel image. >> barebox >>>> has the same >>>> concept. The prebootloader is uncompressed and runs (starting from >>>> ENTRY_FUNCTION) and >>>> then does some early setup (e.g. enable clocks, configure PMIC, setup >> DRAM, >>>> load secure >>>> monitor (BL31), ...etc.) and then it decompresses barebox proper into >> DRAM. >>>> >>>> barebox.bin <- barebox proper. You don't usually need that. >>>> barebox.elf <- ELF binary for the above (for gdb) >>>> barebox.map <- map file of the above >>>> >>>> images/barebox-spider-mk1-evk.img <- complete barebox image (PBL + >>>> barebox proper) >>>> images/start_spider_mk1_evk.pbl <- ELF image for the above >>>> images/start_spider_mk1_evk.pbl.map <- map file of the above >>>> >>>> If you want to follow barbeox from the start, begin at >> start_spider_mk1_evk. >>>> >>>>> Then I went to arch/arm/cpu/start.c and realized that the code is compiled >>>> with CONFIG_PBL_IMAGE. >>>>> In that case I assume I need to pass 3 arguments and use this function >>>> prototype: >>>>> void start(unsigned long membase, unsigned long memsize, void >>>> *boarddata); >>>> >>>> barebox prebootloader takes care of this, so you don't need to do anything. >>>> >>>>> Few questions: >>>>> 1. Will that call work: >>>>> typedef void (*barebox_start)(unsigned long , unsigned long , void *); >>>>> #define DRAM_START (0) >>>>> barebox_start p_barebox = (barebox_start)DRAM_START; >>>>> p_barebox(DRAM_START, DRAM_START+SZ_2M, (void >>>> *)(DRAM_START+SZ_4M)); >>>>> This assumes that my BL1 code also copied the device tree (barebox-dt- >>>> 2nd.img? start_dt_2nd.pblb? start_spider_mk1_evk.pblb?) >>>> >>>> The device tree is built into the PBL and passed to barebox proper. This >>>> allows us to use the same barebox proper binary and link it with a >>>> different >>>> prebootloader for each SoC/board, all in the same build. >>>> >>>> barebox-dt-2nd.img is a special image that looks exactly like a Linux >>>> kernel: >>>> >>>> images/barebox-dt-2nd.img: Linux kernel ARM64 boot executable Image, >>>> little-endian, 4K pages >>>> >>>> and can thus be used for booting for easy chainloading from other >>>> bootloaders or for running >>>> with QEMU -kernel. You shouldn't need it right now. >>>> >>>>> 2. Do I want to have my code compiled with CONFIG_PBL_IMAGE? >>>>> If I understand correctly, it means that my code will provide a PBL >>>>> (a.k.a >>>> BL2) which will set the DRAM and STACK among other things (MMU?). >>>> >>>> The patch I sent already builds a PBL. You will need to fill out >>>> start_spider_mk1_evk >>>> to do all the other early initialization you need. Then you call >>>> barebox_arm_entry >>>> with device tree and memory size and it will take care to do stack setup in >> new >>>> memory region, MMU setup (if enabled) and chainloading barebox proper. >>>> >>>> Note that PBL isn't necessary BL2. You can chainload barebox from within >>>> barebox (i.e. >>>> in EL2 or EL1), which is useful for debugging. You will thus often find PBL >> code >>>> that >>>> does >>>> >>>> if (current_el() == 3) { >>>> /* Do BL2 setup */ >>>> chainload(); >>>> __builtin_unreachable(); >>>> } >>>> >>>> barebox_arm_entry(...) >>>> >>>> See for example arch/arm/boards/innocomm-imx8mm-wb15/lowlevel.c >>>> >>>> to see a real-world example of another Cortex-A53. >>>> >>>>> In that case I assume it is OK. >>>>> 3. If I try to remove it by having CONFIG_PBL_IMAGE=n on >> spider_defconfig >>>> this doesn't do anything >>>>> The build (make spider_defconfig) ignores it and say that " No change >>>>> to >>>> .config ". >>>> >>>> Another symbol forces it to be enabled. If you are curious, run make >>>> menuconfig >>>> and then search (/) for the symbol and it will list, whether it's enabled >>>> and >>>> why: >>>> >>>> Selected by [y]: >>>> - PBL_MULTI_IMAGES [=y] && HAVE_PBL_MULTI_IMAGES [=y] >>>> >>>> I'd suggest you avoid modifying the .config file manually. always use >>>> menuconfig. >>>> >>>>> 4. I also tried to understand how to implement PUTC_LL but not sure I >>>> understand. >>>>> 4.1 When I set "CONFIG_DEBUG_LL=y" on spider_defconfig it is again >> not >>>> written to .config and I get " No change to .config " message. >>>> >>>> You must: >>>> >>>> - select HAS_DEBUG_LL from MACH_SPIDER >>>> - Add your arch to arch/arm/include/asm/debug_ll.h >>>> - Then implement PUTC_LL in e.g. mach/spider/debug_ll.h >>>> >>>>> 4.2 Do I need to have my own debug_ll.h file? >>>> >>>> Yes. See above. >>>> >>>>> 5. When I make changes to spider_defconfig and try to regenerate the >>>> .config and I get " No change to .config " message, does it mean that those >>>> macros are "hidden" symbols like you said about the CONFIG_CPU_V8? >>>> >>>> Yes. Just check menuconfig to see how symbols relate to each other. >>>> This is 1:1 like it's in Linux, so it'll come in handy when you do >>>> the kernel port too ;) >>>> >>>>> Apologize for so many questions :-) >>>> >>>> No problem. Looking forward to your patches ;) >>>> >>>> >>>> Cheers, >>>> Ahmad >>>> >>>>> Cheers, >>>>> Lior. >>>>> >>>>> -----Original Message----- >>>>> From: Lior Weintraub >>>>> Sent: Sunday, May 28, 2023 11:16 PM >>>>> To: Ahmad Fatoum <ah...@a3f.at>; barebox@lists.infradead.org >>>>> Subject: RE: [PATCH v2] Porting barebox to a new SoC >>>>> >>>>> Hi Ahmad, >>>>> >>>>> Thank you so much for your kind support! >>>>> >>>>> Indeed we also have a 16GB DRAM that starts from address 0 (though >>>> currently we don't have the controller settings (under development)). >>>>> >>>>> I also wrote the BootROM (BL1) for this SoC (128KB ROM @ address >>>> 0xC004000000). >>>>> I understand now that it would be best for me to develop BL2 that will run >>>> from our SRAM. >>>>> >>>>> As this BL2 code is bare-metal I have no problem or limitations with the >>>>> 40 >>>> bit addresses. >>>>> The BL2 code will initialize the DRAM controller and then copy Barebox >> image >>>> from NOR Flash to address 0 of the DRAM. >>>>> Our NOR Flash is 128MB in size and it is accessed via QSPI controller. >>>>> >>>>> I tried applying your suggested patch but got an error while doing so: >>>>> $git apply 0002-Ahmad.patch >>>>> 0002-Ahmad.patch:115: trailing whitespace. >>>>> .of_compatible = spider_board_of_match, }; >>>>> error: corrupt patch at line 117 >>>>> >>>>> After some digging I found that my Outlook probably messed with the >> patch >>>> format (even though I am using text only and no HTML format). >>>>> When I went to the web and copied the patch from there (mailing list >>>> archive) it was working well (i.e. no compilation error). >>>>> >>>>> Cheers, >>>>> Lior. >>>>> >>>>> -----Original Message----- >>>>> From: Ahmad Fatoum <ah...@a3f.at> >>>>> Sent: Sunday, May 28, 2023 6:38 PM >>>>> To: barebox@lists.infradead.org >>>>> Cc: Lior Weintraub <li...@pliops.com> >>>>> Subject: [PATCH v2] Porting barebox to a new SoC >>>>> >>>>> CAUTION: External Sender >>>>> >>>>> From: Lior Weintraub <li...@pliops.com> >>>>> >>>>> Hi, >>>>> >>>>> I tried to follow the porting guide on https://ddec1-0-en- >>>> >> ctp.trendmicro.com:443/wis/clicktime/v1/query?url=https%3a%2f%2fwww. >>>> >> barebox.org%2fdoc%2flatest%2fdevel%2fporting.html%23&umid=60097eda >>>> -f136-45a1-9c8e- >>>> cf6a76e45cf8&auth=860a7ebb9feba264acc79b6e38eb59582349362c- >>>> 480ae23736add41c88ab8d30c090a75517ca7f9e but couldn't follow the >>>> instructions. >>>>> I would like to port barebox to a new SoC (which is not a derivative of >>>>> any >>>> known SoC). >>>>> It has the following: >>>>> * Single Cortex A53 >>>>> * SRAM (4MB) located on address 0xC000000000 >>>>> >>>>> The below patch shows my initial test to try and have a starting point. >>>>> I am setting env variables: >>>>> export ARCH=arm64 >>>>> export CROSS_COMPILE=/home/pliops/workspace/ARM/arm-gnu- >>>> toolchain/bin/aarch64-none-elf- >>>>> >>>>> Then I build with: >>>>> make spider_defconfig && make >>>>> >>>>> This gives an error: >>>>> aarch64-none-elf-gcc: error: unrecognized argument in option '- >> mabi=apcs- >>>> gnu' >>>>> aarch64-none-elf-gcc: note: valid arguments to '-mabi=' are: ilp32 lp64 >>>>> aarch64-none-elf-gcc: error: unrecognized command-line option '-msoft- >>>> float' >>>>> aarch64-none-elf-gcc: error: unrecognized command-line option '-mno- >>>> unaligned-access' >>>>> /home/pliops/workspace/simplest-linux- >>>> demo/barebox/scripts/Makefile.build:140: recipe for target >>>> 'scripts/mod/empty.o' failed >>>>> make[2]: *** [scripts/mod/empty.o] Error 1 >>>>> >>>>> Not sure why the compiler flags get -mabi=apcs-gnu when I explicitly set >>>> CONFIG_CPU_V8 and the arch/arm/Makefile has: >>>>> ifeq ($(CONFIG_CPU_V8), y) >>>>> CFLAGS_ABI :=-mabi=lp64 >>>>> >>>>> The changes I did: >>>>> >From 848b5f9b18bb1bb96d197cbc1b368ee0a729d581 Mon Sep 17 >>>> 00:00:00 2001 >>>>> --- >>>>> arch/arm/Kconfig | 13 ++++++++ >>>>> arch/arm/Makefile | 1 + >>>>> arch/arm/boards/Makefile | 1 + >>>>> arch/arm/boards/spider-evk/Makefile | 4 +++ >>>>> arch/arm/boards/spider-evk/board.c | 26 +++++++++++++++ >>>>> arch/arm/boards/spider-evk/lowlevel.c | 30 +++++++++++++++++ >>>>> arch/arm/configs/spider_defconfig | 8 +++++ >>>>> arch/arm/dts/Makefile | 1 + >>>>> arch/arm/dts/spider-mk1-evk.dts | 10 ++++++ >>>>> arch/arm/dts/spider-mk1.dtsi | 46 +++++++++++++++++++++++++++ >>>>> arch/arm/mach-spider/Kconfig | 16 ++++++++++ >>>>> arch/arm/mach-spider/Makefile | 1 + >>>>> arch/arm/mach-spider/lowlevel.c | 14 ++++++++ >>>>> images/Makefile | 1 + >>>>> images/Makefile.spider | 5 +++ >>>>> include/mach/spider/lowlevel.h | 7 ++++ >>>>> 16 files changed, 184 insertions(+) >>>>> create mode 100644 arch/arm/boards/spider-evk/Makefile >>>>> create mode 100644 arch/arm/boards/spider-evk/board.c >>>>> create mode 100644 arch/arm/boards/spider-evk/lowlevel.c >>>>> create mode 100644 arch/arm/configs/spider_defconfig create mode >>>> 100644 arch/arm/dts/spider-mk1-evk.dts create mode 100644 >>>> arch/arm/dts/spider-mk1.dtsi create mode 100644 arch/arm/mach- >>>> spider/Kconfig create mode 100644 arch/arm/mach-spider/Makefile >> create >>>> mode 100644 arch/arm/mach-spider/lowlevel.c create mode 100644 >>>> images/Makefile.spider create mode 100644 >> include/mach/spider/lowlevel.h >>>>> >>>>> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index >>>> e76ee0f6dfe1..e5dcf128447e 100644 >>>>> --- a/arch/arm/Kconfig >>>>> +++ b/arch/arm/Kconfig >>>>> @@ -255,6 +255,18 @@ config ARCH_ROCKCHIP >>>>> select HAS_DEBUG_LL >>>>> imply GPIO_ROCKCHIP >>>>> >>>>> +config ARCH_SPIDER >>>>> + bool "Pliops Spider based" >>>>> + depends on 64BIT >>>>> + depends on ARCH_MULTIARCH >>>>> + select GPIOLIB >>>>> + select HAVE_PBL_MULTI_IMAGES >>>>> + select COMMON_CLK >>>>> + select CLKDEV_LOOKUP >>>>> + select COMMON_CLK_OF_PROVIDER >>>>> + select OFTREE >>>>> + select OFDEVICE >>>>> + >>>>> config ARCH_STM32MP >>>>> bool "STMicroelectronics STM32MP" >>>>> depends on 32BIT >>>>> @@ -331,6 +343,7 @@ source "arch/arm/mach-omap/Kconfig" >>>>> source "arch/arm/mach-pxa/Kconfig" >>>>> source "arch/arm/mach-rockchip/Kconfig" >>>>> source "arch/arm/mach-socfpga/Kconfig" >>>>> +source "arch/arm/mach-spider/Kconfig" >>>>> source "arch/arm/mach-stm32mp/Kconfig" >>>>> source "arch/arm/mach-versatile/Kconfig" >>>>> source "arch/arm/mach-vexpress/Kconfig" >>>>> diff --git a/arch/arm/Makefile b/arch/arm/Makefile index >>>> 35ebc70f44e2..4c63dfee48f4 100644 >>>>> --- a/arch/arm/Makefile >>>>> +++ b/arch/arm/Makefile >>>>> @@ -101,6 +101,7 @@ machine-$(CONFIG_ARCH_MXS) += mxs >>>>> machine-$(CONFIG_ARCH_MVEBU) += mvebu >>>>> machine-$(CONFIG_ARCH_NOMADIK) += nomadik >>>>> machine-$(CONFIG_ARCH_OMAP) += omap >>>>> +machine-$(CONFIG_ARCH_SPIDER) += spider >>>>> machine-$(CONFIG_ARCH_PXA) += pxa >>>>> machine-$(CONFIG_ARCH_ROCKCHIP) += rockchip >>>>> machine-$(CONFIG_ARCH_SAMSUNG) += samsung >>>>> diff --git a/arch/arm/boards/Makefile b/arch/arm/boards/Makefile index >>>> 2877debad535..6fe0a90c81ea 100644 >>>>> --- a/arch/arm/boards/Makefile >>>>> +++ b/arch/arm/boards/Makefile >>>>> @@ -135,6 +135,7 @@ obj- >>>> $(CONFIG_MACH_SOCFPGA_TERASIC_DE10_NANO) += terasic-de10- >>>> nano/ >>>>> obj-$(CONFIG_MACH_SOCFPGA_TERASIC_SOCKIT) += terasic-sockit/ >>>>> obj-$(CONFIG_MACH_SOLIDRUN_CUBOX) += solidrun-cubox/ >>>>> obj-$(CONFIG_MACH_SOLIDRUN_MICROSOM) += solidrun- >>>> microsom/ >>>>> +obj-$(CONFIG_MACH_SPIDER_MK1_EVK) += spider-evk/ >>>>> obj-$(CONFIG_MACH_STM32MP15XX_DKX) += stm32mp15xx- >> dkx/ >>>>> obj-$(CONFIG_MACH_STM32MP13XX_DK) += stm32mp13xx-dk/ >>>>> obj-$(CONFIG_MACH_LXA_MC1) += lxa-mc1/ >>>>> diff --git a/arch/arm/boards/spider-evk/Makefile >>>> b/arch/arm/boards/spider-evk/Makefile >>>>> new file mode 100644 >>>>> index 000000000000..da63d2625f7a >>>>> --- /dev/null >>>>> +++ b/arch/arm/boards/spider-evk/Makefile >>>>> @@ -0,0 +1,4 @@ >>>>> +# SPDX-License-Identifier: GPL-2.0-only >>>>> + >>>>> +obj-y += board.o >>>>> +lwl-y += lowlevel.o >>>>> diff --git a/arch/arm/boards/spider-evk/board.c >> b/arch/arm/boards/spider- >>>> evk/board.c >>>>> new file mode 100644 >>>>> index 000000000000..3920e83b457d >>>>> --- /dev/null >>>>> +++ b/arch/arm/boards/spider-evk/board.c >>>>> @@ -0,0 +1,26 @@ >>>>> +#include <bbu.h> >>>>> +#include <boot.h> >>>>> +#include <bootm.h> >>>>> +#include <common.h> >>>>> +#include <deep-probe.h> >>>>> +#include <environment.h> >>>>> +#include <fcntl.h> >>>>> +#include <globalvar.h> >>>>> + >>>>> +static int spider_board_probe(struct device *dev) { >>>>> + /* Do some board-specific setup */ >>>>> + return 0; >>>>> +} >>>>> + >>>>> +static const struct of_device_id spider_board_of_match[] = { >>>>> + { .compatible = "pliops,spider-mk1-evk" }, >>>>> + { /* sentinel */ }, >>>>> +}; >>>>> + >>>>> +static struct driver spider_board_driver = { >>>>> + .name = "board-spider", >>>>> + .probe = spider_board_probe, >>>>> + .of_compatible = spider_board_of_match, }; >>>>> +device_platform_driver(spider_board_driver); >>>>> diff --git a/arch/arm/boards/spider-evk/lowlevel.c >>>> b/arch/arm/boards/spider-evk/lowlevel.c >>>>> new file mode 100644 >>>>> index 000000000000..e36fcde4208e >>>>> --- /dev/null >>>>> +++ b/arch/arm/boards/spider-evk/lowlevel.c >>>>> @@ -0,0 +1,30 @@ >>>>> +#include <common.h> >>>>> +#include <asm/barebox-arm.h> >>>>> +#include <mach/spider/lowlevel.h> >>>>> + >>>>> +#define BASE_ADDR (0xD000307000) >>>>> +#define GPRAM_ADDR (0xC000000000) >>>>> +#define MY_STACK_TOP (0xC000000000 + SZ_2M) // Set the stack >> 2MB >>>> from GPRAM start (excatly in the middle) >>>>> +static inline void spider_serial_putc(void *base, int c) { >>>>> +// if (!(readl(base + UCR1) & UCR1_UARTEN)) >>>>> +// return; >>>>> +// >>>>> +// while (!(readl(base + USR2) & USR2_TXDC)); >>>>> +// >>>>> +// writel(c, base + URTX0); >>>>> +} >>>>> + >>>>> +ENTRY_FUNCTION_WITHSTACK(start_spider_mk1_evk, MY_STACK_TOP, >>>> r0, r1, >>>>> +r2) { >>>>> + extern char __dtb_spider_mk1_evk_start[]; >>>>> + >>>>> + spider_lowlevel_init(); >>>>> + >>>>> + relocate_to_current_adr(); >>>>> + setup_c(); >>>>> + >>>>> + pbl_set_putc(spider_serial_putc, (void *)BASE_ADDR); >>>>> + >>>>> + barebox_arm_entry(GPRAM_ADDR, SZ_2M, >>>>> +__dtb_spider_mk1_evk_start); } >>>>> diff --git a/arch/arm/configs/spider_defconfig >>>> b/arch/arm/configs/spider_defconfig >>>>> new file mode 100644 >>>>> index 000000000000..c91bb889d97f >>>>> --- /dev/null >>>>> +++ b/arch/arm/configs/spider_defconfig >>>>> @@ -0,0 +1,8 @@ >>>>> +CONFIG_ARCH_SPIDER=y >>>>> +CONFIG_MACH_SPIDER_MK1_EVK=y >>>>> +CONFIG_BOARD_ARM_GENERIC_DT=y >>>>> +CONFIG_MALLOC_TLSF=y >>>>> +CONFIG_KALLSYMS=y >>>>> +CONFIG_RELOCATABLE=y >>>>> +CONFIG_CONSOLE_ALLOW_COLOR=y >>>>> +CONFIG_PBL_CONSOLE=y >>>>> diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile index >>>> 98f4c4e0194b..94b304d4878f 100644 >>>>> --- a/arch/arm/dts/Makefile >>>>> +++ b/arch/arm/dts/Makefile >>>>> @@ -134,6 +134,7 @@ lwl-$(CONFIG_MACH_SOLIDRUN_CUBOX) += >> dove- >>>> cubox-bb.dtb.o >>>>> lwl-$(CONFIG_MACH_SOLIDRUN_MICROSOM) += imx6dl- >>>> hummingboard.dtb.o imx6q-hummingboard.dtb.o \ >>>>> imx6dl-hummingboard2.dtb.o imx6q- >>>> hummingboard2.dtb.o \ >>>>> imx6q-h100.dtb.o >>>>> +lwl-$(CONFIG_MACH_SPIDER_MK1_EVK) += spider-mk1-evk.dtb.o >>>>> lwl-$(CONFIG_MACH_SKOV_IMX6) += imx6s-skov-imx6.dtb.o imx6dl- >> skov- >>>> imx6.dtb.o imx6q-skov-imx6.dtb.o >>>>> lwl-$(CONFIG_MACH_SKOV_ARM9CPU) += at91-skov-arm9cpu.dtb.o >>>>> lwl-$(CONFIG_MACH_SEEED_ODYSSEY) += stm32mp157c-odyssey.dtb.o >>>> diff --git a/arch/arm/dts/spider-mk1-evk.dts b/arch/arm/dts/spider-mk1- >>>> evk.dts new file mode 100644 index 000000000000..b8081cb85bf8 >>>>> --- /dev/null >>>>> +++ b/arch/arm/dts/spider-mk1-evk.dts >>>>> @@ -0,0 +1,10 @@ >>>>> +// SPDX-License-Identifier: GPL-2.0 OR X11 >>>>> + >>>>> +/dts-v1/; >>>>> + >>>>> +#include "spider-mk1.dtsi" >>>>> + >>>>> +/ { >>>>> + model = "Pliops Spider MK-I EVK"; >>>>> + compatible = "pliops,spider-mk1-evk"; }; >>>>> diff --git a/arch/arm/dts/spider-mk1.dtsi b/arch/arm/dts/spider-mk1.dtsi >>>> new file mode 100644 index 000000000000..d4613848169d >>>>> --- /dev/null >>>>> +++ b/arch/arm/dts/spider-mk1.dtsi >>>>> @@ -0,0 +1,46 @@ >>>>> +// SPDX-License-Identifier: GPL-2.0 OR X11 >>>>> + >>>>> +/ { >>>>> + #address-cells = <2>; >>>>> + #size-cells = <2>; >>>>> + >>>>> + chosen { >>>>> + stdout-path = &uart0; >>>>> + }; >>>>> + >>>>> + aliases { >>>>> + serial0 = &uart0; >>>>> + }; >>>>> + >>>>> + cpus { >>>>> + #address-cells = <1>; >>>>> + #size-cells = <0>; >>>>> + >>>>> + cpu0: cpu@0 { >>>>> + device_type = "cpu"; >>>>> + compatible = "arm,cortex-a53"; >>>>> + reg = <0x0>; >>>>> + }; >>>>> + }; >>>>> + >>>>> + memory@1000000 { >>>>> + reg = <0x0 0x1000000 0x0 0x400000>; /* 128M */ >>>>> + device_type = "memory"; >>>>> + }; >>>>> + >>>>> + soc { >>>>> + #address-cells = <2>; >>>>> + #size-cells = <2>; >>>>> + ranges; >>>>> + >>>>> + sram@c000000000 { >>>>> + compatible = "mmio-sram"; >>>>> + reg = <0xc0 0x0 0x0 0x400000>; >>>>> + }; >>>>> + >>>>> + uart0: serial@d000307000 { >>>>> + compatible = "pliops,spider-uart"; >>>>> + reg = <0xd0 0x307000 0 0x1000>; >>>>> + }; >>>>> + }; >>>>> +}; >>>>> diff --git a/arch/arm/mach-spider/Kconfig b/arch/arm/mach- >> spider/Kconfig >>>> new file mode 100644 index 000000000000..6d2f888a5fd8 >>>>> --- /dev/null >>>>> +++ b/arch/arm/mach-spider/Kconfig >>>>> @@ -0,0 +1,16 @@ >>>>> +# SPDX-License-Identifier: GPL-2.0-only >>>>> + >>>>> +if ARCH_SPIDER >>>>> + >>>>> +config ARCH_SPIDER_MK1 >>>>> + bool >>>>> + select CPU_V8 >>>>> + help >>>>> + The first Cortex-A53-based SoC of the spider family. >>>>> + This symbol is invisble and select by boards >>>>> + >>>>> +config MACH_SPIDER_MK1_EVK >>>>> + bool "Pliops Spider Reference Design Board" >>>>> + select ARCH_SPIDER_MK1 >>>>> + >>>>> +endif >>>>> diff --git a/arch/arm/mach-spider/Makefile b/arch/arm/mach- >>>> spider/Makefile new file mode 100644 index >> 000000000000..b08c4a93ca27 >>>>> --- /dev/null >>>>> +++ b/arch/arm/mach-spider/Makefile >>>>> @@ -0,0 +1 @@ >>>>> +lwl-y += lowlevel.o >>>>> diff --git a/arch/arm/mach-spider/lowlevel.c b/arch/arm/mach- >>>> spider/lowlevel.c new file mode 100644 index >>>> 000000000000..5d62ef0f39e5 >>>>> --- /dev/null >>>>> +++ b/arch/arm/mach-spider/lowlevel.c >>>>> @@ -0,0 +1,14 @@ >>>>> +// SPDX-License-Identifier: GPL-2.0+ >>>>> + >>>>> +#include <linux/types.h> >>>>> +#include <mach/spider/lowlevel.h> >>>>> +#include <asm/barebox-arm-head.h> >>>>> + >>>>> +void spider_lowlevel_init(void) >>>>> +{ >>>>> + arm_cpu_lowlevel_init(); >>>>> + /* >>>>> + * not yet relocated, only do writel/readl for stuff that's >>>>> + * critical to run early. No global variables allowed. >>>>> + */ >>>>> +} >>>>> diff --git a/images/Makefile b/images/Makefile index >>>> c93f9e268978..97521e713228 100644 >>>>> --- a/images/Makefile >>>>> +++ b/images/Makefile >>>>> @@ -150,6 +150,7 @@ include $(srctree)/images/Makefile.mxs include >>>> $(srctree)/images/Makefile.omap3 include >>>> $(srctree)/images/Makefile.rockchip >>>>> include $(srctree)/images/Makefile.socfpga >>>>> +include $(srctree)/images/Makefile.spider >>>>> include $(srctree)/images/Makefile.stm32mp >>>>> include $(srctree)/images/Makefile.tegra include >>>> $(srctree)/images/Makefile.versatile >>>>> diff --git a/images/Makefile.spider b/images/Makefile.spider new file >> mode >>>> 100644 index 000000000000..c32f2762df04 >>>>> --- /dev/null >>>>> +++ b/images/Makefile.spider >>>>> @@ -0,0 +1,5 @@ >>>>> +# SPDX-License-Identifier: GPL-2.0-only >>>>> + >>>>> +pblb-$(CONFIG_MACH_SPIDER_MK1_EVK) += start_spider_mk1_evk >>>>> +FILE_barebox-spider-mk1-evk.img = start_spider_mk1_evk.pblb >>>>> +image-$(CONFIG_MACH_SPIDER_MK1_EVK) += barebox-spider-mk1- >>>> evk.img >>>>> diff --git a/include/mach/spider/lowlevel.h >>>> b/include/mach/spider/lowlevel.h new file mode 100644 index >>>> 000000000000..6e0ce1c77f7e >>>>> --- /dev/null >>>>> +++ b/include/mach/spider/lowlevel.h >>>>> @@ -0,0 +1,7 @@ >>>>> +/* SPDX-License-Identifier: GPL-2.0+ */ #ifndef __MACH_SPIDER_H_ >>>>> +#define __MACH_SPIDER_H_ >>>>> + >>>>> +void spider_lowlevel_init(void); >>>>> + >>>>> +#endif >>>>> -- >>>>> 2.38.4 >>>>> >>>>> >>>> >>>> -- >>>> Pengutronix e.K. | | >>>> Steuerwalder Str. 21 | http://www.pengutronix.de/ | >>>> 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | >>>> Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | >>> >> >> -- >> Pengutronix e.K. | | >> Steuerwalder Str. 21 | http://www.pengutronix.de/ | >> 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | >> Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | > -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |