[PATCH v3 3/7] rpi5: Use devicetree to retrieve board revision

Matthias Brugger mbrugger at suse.com
Fri Dec 22 12:28:20 CET 2023



On 18/12/2023 22:03, Ivan T. Ivanov wrote:
> Firmware on RPi5 return error on board revision query
> through firmware interface, but on the other hand it fills
> "linux,revision" in "system" node, so use it to detect board
> revision.
> 
> 	system {
> 		linux,revision = <0xc04170>;
> 		linux,serial = <0x6cf44e80 0x3c533ede>;
> 	};
> 
> Signed-off-by: Ivan T. Ivanov <iivanov at suse.de>

Reviewed-by: Matthias Brugger <mbrugger at suse.com>

> ---
>   board/raspberrypi/rpi/rpi.c | 22 +++++++++++++++++++---
>   1 file changed, 19 insertions(+), 3 deletions(-)
> 
> diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c
> index cd823ad746..2851ebc985 100644
> --- a/board/raspberrypi/rpi/rpi.c
> +++ b/board/raspberrypi/rpi/rpi.c
> @@ -171,6 +171,11 @@ static const struct rpi_model rpi_models_new_scheme[] = {
>   		DTB_DIR "bcm2711-rpi-cm4.dtb",
>   		true,
>   	},
> +	[0x17] = {
> +		"5 Model B",
> +		DTB_DIR "bcm2712-rpi-5-b.dtb",
> +		true,
> +	},
>   };
>   
>   static const struct rpi_model rpi_models_old_scheme[] = {
> @@ -429,15 +434,27 @@ static void get_board_revision(void)
>   	int ret;
>   	const struct rpi_model *models;
>   	uint32_t models_count;
> +	ofnode node;
>   
>   	BCM2835_MBOX_INIT_HDR(msg);
>   	BCM2835_MBOX_INIT_TAG(&msg->get_board_rev, GET_BOARD_REV);
>   
>   	ret = bcm2835_mbox_call_prop(BCM2835_MBOX_PROP_CHAN, &msg->hdr);
>   	if (ret) {
> -		printf("bcm2835: Could not query board revision\n");
>   		/* Ignore error; not critical */
> -		return;
> +		node = ofnode_path("/system");
> +		if (!ofnode_valid(node)) {
> +			printf("bcm2835: Could not find /system node\n");
> +			return;
> +		}
> +
> +		ret = ofnode_read_u32(node, "linux,revision", &revision);
> +		if (ret) {
> +			printf("bcm2835: Could not find linux,revision\n");
> +			return;
> +		}
> +	} else {
> +		revision = msg->get_board_rev.body.resp.rev;
>   	}
>   
>   	/*
> @@ -451,7 +468,6 @@ static void get_board_revision(void)
>   	 * http://www.raspberrypi.org/forums/viewtopic.php?f=63&t=98367&start=250
>   	 * http://www.raspberrypi.org/forums/viewtopic.php?f=31&t=20594
>   	 */
> -	revision = msg->get_board_rev.body.resp.rev;
>   	if (revision & 0x800000) {
>   		rev_scheme = 1;
>   		rev_type = (revision >> 4) & 0xff;


More information about the U-Boot mailing list