Hello Pirmin,
On Tue, Oct 06, 2020 at 09:24:40AM +0200, Duss Pirmin wrote:
Hi Genodians
As mentioned in an earlier mail I'm currently enabling base-hw on the IoT gateway of CompuLab [1].
The used SoC is a iMX8mm, which is a bit different from the iMX8mq used on the EVK [2].
On a running Linux I used `memtool` to read register values.
In `src/bootstrap/spec/iot_gateway/platform.cc` I have changed the following things:
- the values for the `regulator` registers
- the register offsets and values for the ARM_PLL registers
- the values of the IOMUX configuration
Being in your position, I would not do PLL or IOMUX settings or whatever in the first place, but leave them out completely. Typically, the ARM Trusted Firmware and U-boot, which already run have configured the SoC in a way that you can use at least serial line, cpus and their timers. The addition of PLL settings for i.MX 8MQ were added when we wanted to raise the CPU frequency from the very beginning. The IOMUX settings are done here, because some more high-level peripherals like USB, Ethernet or display engine needed it. However they will be moved to the platform driver anyway. Anyway, to exclude that your settings influence the e.g., CPU frequency/voltage badly you should leave them out now.
The enabling of the secondary CPUs is done by the ARM Trusted Firmware in case of the i.MX8 MQ. As far as I can see by looking at the device tree of your SoC, it is the same for i.MX8 MM. Please, assure that Board::Cpu::wake_up_all_cpus() is doing the same, namely doing three SMC calls. You might check the result of the call!
Then please add raw() calls at the earliest place possible in bootstrap to see whether the secondary cpus may have come up, but stuck somewhere else. (when successful you will see character salad due to unsynchronized raw() calls).
I hope this helps somehow further.
Regards Stefan
Now the code bootstrap finishes and the kernel begins to run. By adding some `Genode::raw()`s to `void kernel_init()` I'm able to see, that the initialization for kernel waits for all CPUs to start at `while (!pool_ready) { ; }`.
If change `NR_OF_CPUS` to 1, I'm able to run the log run script.
log output of IoT gateway [1]:
Kernel: Board() :: 324 Kernel: Board() :: 342 Kernel: wake_up_all_cpus() :: 352 --- 1 Kernel: wake_up_all_cpus() :: 352 --- 2 Kernel: wake_up_all_cpus() :: 352 --- 3 Kernel: kernel_init() :: 56 Kernel: initialize() :: 184 Kernel: initialize() :: 186 --- 0 Kernel: initialize() :: 188 --- 0 initialized=4
log output from EVK [2]:
Kernel: kernel_init() :: 56 Kernel: initialize() :: 186 --- 0 Kernel: initialize() :: 188 --- 0 initialized=4 Kernel: initialize() :: 184 Kernel: initialize() :: 186 --- 3 Kernel: initialize() :: 188 --- 3 initialized=3 Kernel: initialize() :: 184 Kernel: initialize() :: 186 --- 2 Kernel: initialize() :: 188 --- 2 initialized=2 Kernel: initialize() :: 184 Kernel: initialize() :: 186 --- 1 Kernel: initialize() :: 188 --- 1 initialized=1 kernel initialized
Has anybody an idea what registers could have an influence on the start up of the CPUs?
[1] https://www.compulab.com/products/iot-gateways/iot-gate-imx8-industrial-arm-...
[2] https://www.nxp.com/design/development-boards/i-mx-evaluation-and-developmen...
Best regards, Pirmin
Genode users mailing list users@lists.genode.org https://lists.genode.org/listinfo/users