Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 24 Dec 2022 20:14:57 -0800
From:      Mark Millard <marklmi@yahoo.com>
To:        freebsd-arm <freebsd-arm@freebsd.org>
Subject:   Re: How to make FreeBSD's kernel boot a RPi4B with modern RPi* firmware
Message-ID:  <374EC3E5-4CB4-4336-A8B9-7A9CF6151691@yahoo.com>
In-Reply-To: <9C037D3F-A440-4708-993D-117F313691BB@yahoo.com>
References:  <9C037D3F-A440-4708-993D-117F313691BB@yahoo.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Dec 24, 2022, at 19:15, Mark Millard <marklmi@yahoo.com> wrote:

> I finally ran into EARLY_DRIVER_MODULE, BUS_PASS_RESOURCE,
> BUS_PASS_ORDER_MIDDLE and the like and they allow being
> sure that the brcm,bcm2835-dma related setup has been done
> before any use of it is made, despite the order in the
> Device Tree: use an earlier pass for brcm,bcm2835-dma
> related attach. This avoids the kernel crashing during
> boot.
>=20
> The example context used below has: serial console with
> USB3 SSD boot media (not requiring a usb_pgood_delay
> setting), booting a stable/13. The RPI4B is a C0T one (no
> 3 GiByte limitation, for example: the PCIe wrapper logic
> has been corrected).
>=20
> stable/13's source code changes ( similarly for
> releng/13.1 ):
>=20
> diff --git a/sys/arm/broadcom/bcm2835/bcm2835_dma.c =
b/sys/arm/broadcom/bcm2835/bcm2835_dma.c
> index cab8639bb607..d8b49acfe332 100644
> --- a/sys/arm/broadcom/bcm2835/bcm2835_dma.c
> +++ b/sys/arm/broadcom/bcm2835/bcm2835_dma.c
> @@ -766,5 +766,6 @@ static driver_t bcm_dma_driver =3D {
>=20
> static devclass_t bcm_dma_devclass;
>=20
> -DRIVER_MODULE(bcm_dma, simplebus, bcm_dma_driver, bcm_dma_devclass, =
0, 0);
> +EARLY_DRIVER_MODULE(bcm_dma, simplebus, bcm_dma_driver, =
bcm_dma_devclass,
> +    0, 0, BUS_PASS_RESOURCE + BUS_PASS_ORDER_MIDDLE);
> MODULE_VERSION(bcm_dma, 1);
>=20
>=20
> For reference, a 13S snapshot with my kernel build replacing
> the snapshot's kernel, was booted with:
>=20
> # strings /boot/msdos/start4.elf | grep VC_BUILD_ID_
> VC_BUILD_ID_USER: dom
> VC_BUILD_ID_TIME: 11:09:05
> VC_BUILD_ID_VARIANT: start
> VC_BUILD_ID_TIME: Oct 26 2022
> VC_BUILD_ID_BRANCH: bcm2711_2
> VC_BUILD_ID_HOSTNAME: buildbot
> VC_BUILD_ID_PLATFORM: raspberrypi_linux
> VC_BUILD_ID_VERSION: c72ad6b26ff40c91ef776b847436094ee63fabee (clean)
>=20
> There are new things present that FreeBSD reports
> but ignores, producing messages like:
>=20
> clk_fixed4: <Fixed clock> disabled on ofwbus0
> clk_fixed4: Cannot FDT parameters.
> device_attach: clk_fixed4 attach returned 6
>=20
> over and over during part of the boot. It seems to
> retry as it goes and thus produce so many messages.
>=20
> There was also:
>=20
> fb0: <BCM2835 VT framebuffer driver> on simplebus0
> fb0: changing fb bpp from 0 to 24
> mbox0: mbox response error
> fb0: bcm2835_mbox_fb_init failed, err=3D5
> device_attach: fb0 attach returned 6
>=20
> genet0 is working.
>=20
> I've not checked if the microsd card slot can be used.
>=20
> I used the normal FreeBSD U-Boot since I was not booting
> the NVM3 media that requires extra time (usb_pgood_delay
> would be assigned in my own U-Boot builds).
>=20
> For reference, I used my typical sort of config.txt :
>=20
> # more /boot/msdos/config.txt
> [all]
> arm_64bit=3D1
> dtparam=3Daudio=3Don,i2c_arm=3Don,spi=3Don
> dtoverlay=3Dmmc
> dtoverlay=3Ddisable-bt
> device_tree_address=3D0x4000
> kernel=3Du-boot.bin
>=20
> [pi4]
> hdmi_safe=3D1
> armstub=3Darmstub8-gic.bin
>=20
> #
> [all]
> #
> # Local addition that avoids USB3 SSD boot failures that look like:
> #   uhub_reattach_port: port ? reset failed, error=3DUSB_ERR_TIMEOUT
> #   uhub_reattach_port: device problem (USB_ERR_TIMEOUT), disabling =
port ?
> initial_turbo=3D60
> # U-Boot that has, for example, a built-in usb_pgood_delay assignment
> # for a media specific issue added:
> #kernel=3Du-boot.bin.2022.10.arm64
> #
> # Local additions:
> enable_uart=3D1
> uart_2ndstage=3D1
> dtdebug=3D1
> disable_commandline_tags=3D1
> disable_overscan=3D1
> #gpu_mem_1024=3D32
> #
> #program_usb_boot_mode=3D1
> #program_usb_boot_timeout=3D1
>=20
> # Old RPi3's/RPi2Bv1.2's may ignore [pi4] and the like.
> # That would make the below inappropriate for such contexts.
> [pi4]
> # Locally avoid hdmi_safe's dislay scaling:
> hdmi_safe=3D0
> #
> armstub=3Darmstub8-gic.bin
> #
> # Local additions:
> over_voltage=3D6
> arm_freq=3D2000
> sdram_freq_min=3D3200
> force_turbo=3D1
> #
> #total_mem=3D1024
> #total_mem=3D991
> [all]
>=20
> [pi3]=20
> armstub=3Darmstub8.bin
> dtoverlay=3Dpwm
> audio_pwm_mode=3D0
> [all]
>=20
>=20
> As for main [so: 14], the devclass_t use is gone, thus
> the source code changes are:
>=20
> diff --git a/sys/arm/broadcom/bcm2835/bcm2835_dma.c =
b/sys/arm/broadcom/bcm2835/bcm2835_dma.c
> index 5f9ecb0b7981..83c4c493a66b 100644
> --- a/sys/arm/broadcom/bcm2835/bcm2835_dma.c
> +++ b/sys/arm/broadcom/bcm2835/bcm2835_dma.c
> @@ -764,5 +764,6 @@ static driver_t bcm_dma_driver =3D {
>        sizeof(struct bcm_dma_softc),
> };
>=20
> -DRIVER_MODULE(bcm_dma, simplebus, bcm_dma_driver, 0, 0);
> +EARLY_DRIVER_MODULE(bcm_dma, simplebus, bcm_dma_driver, 0, 0,
> +    BUS_PASS_RESOURCE + BUS_PASS_ORDER_MIDDLE);
> MODULE_VERSION(bcm_dma, 1);
>=20
>=20

I should note that the above is not likely to be
the most appropriate in detail. The boot reports:

# dmesg -a | grep bcm_dma0
bcm_dma0: <BCM2835 DMA Controller> mem 0x7e007000-0x7e007aff irq =
31,32,33,34,35,36,37,38,39,40,41 on simplebus0
bcm_dma0: cannot allocate interrupt
device_attach: bcm_dma0 attach returned 6
bcm_dma0: <BCM2835 DMA Controller> mem 0x7e007000-0x7e007aff irq =
31,32,33,34,35,36,37,38,39,40,41 on simplebus0
bcm_dma0: cannot allocate interrupt
device_attach: bcm_dma0 attach returned 6
bcm_dma0: <BCM2835 DMA Controller> mem 0x7e007000-0x7e007aff irq =
31,32,33,34,35,36,37,38,39,40,41 on simplebus0
bcm_dma0: cannot allocate interrupt
device_attach: bcm_dma0 attach returned 6
bcm_dma0: <BCM2835 DMA Controller> mem 0x7e007000-0x7e007aff irq =
31,32,33,34,35,36,37,38,39,40,41 on simplebus0
bcm_dma0: cannot allocate interrupt
device_attach: bcm_dma0 attach returned 6
bcm_dma0: <BCM2835 DMA Controller> mem 0x7e007000-0x7e007aff irq =
31,32,33,34,35,36,37,38,39,40,41 on simplebus0

where that last (working) one has the message
context:

gic0: <ARM Generic Interrupt Controller> mem =
0x40041000-0x40041fff,0x40042000-0x40043fff,0x40044000-0x40045fff,0x400460=
00-0x40047fff irq 30 on simplebus0
gic0: pn 0x2, arch 0x2, rev 0x1, implementer 0x43b irqs 256
bcm_dma0: <BCM2835 DMA Controller> mem 0x7e007000-0x7e007aff irq =
31,32,33,34,35,36,37,38,39,40,41 on simplebus0

So something involving BUS_PASS_INTERRUPT or later
(but before, say, BUS_PASS_SUPPORTDEV) may be more
appropriate. Possibly:

BUS_PASS_INTERRUPT + BUS_PASS_ORDER_LATE

(so after gic0).


=3D=3D=3D
Mark Millard
marklmi at yahoo.com




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?374EC3E5-4CB4-4336-A8B9-7A9CF6151691>