All of lore.kernel.org
 help / color / mirror / Atom feed
From: Heinrich Schuchardt <xypron.glpk@gmx.de>
To: Jiaxun Yang <jiaxun.yang@flygoat.com>
Cc: u-boot@lists.denx.de, Simon Glass <sjg@chromium.org>,
	Tom Rini <trini@konsulko.com>,
	Ilias Apalodimas <ilias.apalodimas@linaro.org>
Subject: Re: [PATCH 01/16] lib: fdtdec: Handle multiple memory nodes
Date: Tue, 11 Jun 2024 14:26:02 +0200	[thread overview]
Message-ID: <b723aa8e-1d29-4904-953d-160caf097136@gmx.de> (raw)
In-Reply-To: <20240522-loongarch-v1-1-1407e0b69678@flygoat.com>

On 22.05.24 17:34, Jiaxun Yang wrote:
> Current code only tries to fetch the first memory node found in
> fdt tree and determine memory banks from multiple reg properties.
>
> Linux do allow multiple memory nodes in devicetree, rework

%/do allow/allows/

It is not Linux that allows it but

Devicetree Specification, Release v0.4
https://github.com/devicetree-org/devicetree-specification/releases/download/v0.4/devicetree-specification-v0.4.pdf

> fdtdec_setup_mem_size_base_lowest and fdtdec_setup_memory_banksize
> to iterate over all memory nodes.
>
> Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
> ---
>   lib/fdtdec.c | 137 ++++++++++++++++++++++++++++++++++++-----------------------
>   1 file changed, 83 insertions(+), 54 deletions(-)
>
> diff --git a/lib/fdtdec.c b/lib/fdtdec.c
> index b2c59ab3818b..403b363043d6 100644
> --- a/lib/fdtdec.c
> +++ b/lib/fdtdec.c
> @@ -1075,90 +1075,119 @@ ofnode get_next_memory_node(ofnode mem)
>   	return mem;
>   }
>
> +static void sort_memory_banks(int num)
> +{
> +	int i, j;
> +	phys_addr_t tmp_start;
> +	phys_size_t tmp_size;
> +	struct bd_info *bd = gd->bd;
> +
> +	for (i = 0; i < num - 1; i++) {
> +		for (j = i + 1; j < num; j++) {
> +			if (bd->bi_dram[i].start > bd->bi_dram[j].start) {
> +				tmp_start = bd->bi_dram[i].start;
> +				tmp_size = bd->bi_dram[i].size;
> +				bd->bi_dram[i].start = bd->bi_dram[j].start;
> +				bd->bi_dram[i].size = bd->bi_dram[j].size;
> +				bd->bi_dram[j].start = tmp_start;
> +				bd->bi_dram[j].size = tmp_size;
> +			}
> +		}
> +	}

Please, use qsort() instead.

> +}
> +
>   int fdtdec_setup_memory_banksize(void)
>   {
> -	int bank, ret, reg = 0;
> -	struct resource res;
> +	int bank = 0;
>   	ofnode mem = ofnode_null();
>
> -	mem = get_next_memory_node(mem);
> -	if (!ofnode_valid(mem)) {
> -		debug("%s: Missing /memory node\n", __func__);
> -		return -EINVAL;
> -	}
> +	while (true) {
> +		struct resource res;
> +		int reg = 0;
>
> -	for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) {
> -		ret = ofnode_read_resource(mem, reg++, &res);
> -		if (ret < 0) {
> -			reg = 0;
> -			mem = get_next_memory_node(mem);
> -			if (!ofnode_valid(mem))
> -				break;
> +		mem = get_next_memory_node(mem);
> +		if (!ofnode_valid(mem))
> +			break;
>
> -			ret = ofnode_read_resource(mem, reg++, &res);
> +		while (true) {
> +			int ret = ofnode_read_resource(mem, reg, &res);

Please, leave a blank line after declarations.

>   			if (ret < 0)
>   				break;
> -		}
>
> -		if (ret != 0)
> -			return -EINVAL;
> +			if (bank >= CONFIG_VAL(NR_DRAM_BANKS))
> +				goto too_may_memory_banks;
>
> -		gd->bd->bi_dram[bank].start = (phys_addr_t)res.start;

The conversion is superfluous.

> -		gd->bd->bi_dram[bank].size =
> -			(phys_size_t)(res.end - res.start + 1);
> +			gd->bd->bi_dram[bank].start = (phys_addr_t)res.start;
> +			gd->bd->bi_dram[bank].size =
> +				(phys_size_t)(res.end - res.start + 1);
>
> -		debug("%s: DRAM Bank #%d: start = 0x%llx, size = 0x%llx\n",
> -		      __func__, bank,
> -		      (unsigned long long)gd->bd->bi_dram[bank].start,
> -		      (unsigned long long)gd->bd->bi_dram[bank].size);
> +			log_debug("%s: DRAM Bank #%d %s.%d: start = 0x%llx, size = 0x%llx\n",
> +				  __func__, bank, ofnode_get_name(mem), reg,
> +				 (unsigned long long)gd->bd->bi_dram[bank].start,
> +				 (unsigned long long)gd->bd->bi_dram[bank].size);
> +			reg++;
> +			bank++;
> +		}
>   	}
>
> +	if (!bank) {
> +		log_warning("%s: Missing /memory node\n", __func__);
> +		return -EINVAL;
> +	}
> +
> +	sort_memory_banks(bank);
> +
>   	return 0;
> +
> +too_may_memory_banks:
> +	log_warning("%s: Too many memory banks\n", __func__);
> +	return -EINVAL;
>   }
>
>   int fdtdec_setup_mem_size_base_lowest(void)
>   {
> -	int bank, ret, reg = 0;
> -	struct resource res;
> -	unsigned long base;
> -	phys_size_t size;
> +	int bank = 0;
>   	ofnode mem = ofnode_null();
> +	__maybe_unused const char *final_name;
> +	__maybe_unused int final_reg;

'__maybe_unused' is superfluous.

>
>   	gd->ram_base = (unsigned long)~0;

gd->ram_base = ULONG_MAX;

>
> -	mem = get_next_memory_node(mem);
> -	if (!ofnode_valid(mem)) {
> -		debug("%s: Missing /memory node\n", __func__);
> -		return -EINVAL;
> -	}
> +	while (true) {
> +		struct resource res;
> +		phys_size_t base, size;
> +		int reg = 0;
>
> -	for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) {
> -		ret = ofnode_read_resource(mem, reg++, &res);
> -		if (ret < 0) {
> -			reg = 0;
> -			mem = get_next_memory_node(mem);
> -			if (!ofnode_valid(mem))
> -				break;
> +		mem = get_next_memory_node(mem);
> +		if (!ofnode_valid(mem))
> +			break;
>
> -			ret = ofnode_read_resource(mem, reg++, &res);
> +		while (true) {
> +			int ret = ofnode_read_resource(mem, reg, &res);
>   			if (ret < 0)
>   				break;
> +			base = res.start;
> +			size = res.end - res.start + 1;
> +			if (gd->ram_base > base && size) {
> +				gd->ram_base = base;
> +				gd->ram_size = size;
> +				final_name = ofnode_get_name(mem);
> +				final_reg = reg;
> +			}
> +			reg++;
> +			bank++;
>   		}
> +	}
>
> -		if (ret != 0)
> -			return -EINVAL;
> -
> -		base = (unsigned long)res.start;
> -		size = (phys_size_t)(res.end - res.start + 1);
> -
> -		if (gd->ram_base > base && size) {
> -			gd->ram_base = base;
> -			gd->ram_size = size;
> -			debug("%s: Initial DRAM base %lx size %lx\n",
> -			      __func__, base, (unsigned long)size);
> -		}
> +	if (!bank) {
> +		log_warning("%s: Missing /memory node\n", __func__);
> +		return -EINVAL;
>   	}
>
> +	log_debug("%s: Initial DRAM %s.%d: base %lx size %lx\n",
> +		  __func__, final_name, final_reg,
> +		  (ulong)gd->ram_base, (ulong)gd->ram_size);

ram_base is already defined as unsigned long.

include/asm-generic/global_data.h:154:
   unsigned long ram_base;

Best regards

Heinrich

> +
>   	return 0;
>   }
>
>


  reply	other threads:[~2024-06-11 12:26 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-22 15:34 [PATCH 00/16] LoongArch initial support Jiaxun Yang
2024-05-22 15:34 ` [PATCH 01/16] lib: fdtdec: Handle multiple memory nodes Jiaxun Yang
2024-06-11 12:26   ` Heinrich Schuchardt [this message]
2024-06-11 13:47     ` Jiaxun Yang
2024-06-11 18:51       ` Simon Glass
2024-06-12  5:55         ` Heinrich Schuchardt
2024-05-22 15:34 ` [PATCH 02/16] linux/io.h: Use map_physmem to implement ioremap Jiaxun Yang
2024-05-22 15:34 ` [PATCH 03/16] image: Take entry point as an output of setup_booti Jiaxun Yang
2024-06-11 13:02   ` Heinrich Schuchardt
2024-06-11 13:29     ` Jiaxun Yang
2024-06-11 13:52       ` Tom Rini
2024-06-11 14:01         ` Jiaxun Yang
2024-06-11 14:09           ` Tom Rini
2024-05-22 15:34 ` [PATCH 04/16] elf.h Define LoongArch bits Jiaxun Yang
2024-06-16 10:34   ` Heinrich Schuchardt
2024-05-22 15:34 ` [PATCH 05/16] image: Define IH_ARCH_LOONGARCH Jiaxun Yang
2024-06-16 10:37   ` Heinrich Schuchardt
2024-05-22 15:34 ` [PATCH 06/16] LoongArch: skeleton and headers Jiaxun Yang
2024-05-23 15:15   ` Heinrich Schuchardt
2024-05-22 15:34 ` [PATCH 07/16] LoongArch: lib: General routines Jiaxun Yang
2024-06-16 11:01   ` Heinrich Schuchardt
2024-06-16 13:06     ` Jiaxun Yang
2024-06-16 16:00       ` Heinrich Schuchardt
2024-06-18 14:19         ` Jiaxun Yang
2024-05-22 15:34 ` [PATCH 08/16] LoongArch: CPU assembly routines Jiaxun Yang
2024-05-22 15:34 ` [PATCH 09/16] LoongArch: Exception handling Jiaxun Yang
2024-05-22 15:34 ` [PATCH 10/16] LoongArch: Boot Image bits Jiaxun Yang
2024-05-22 15:34 ` [PATCH 11/16] LoongArch: Generic CPU type Jiaxun Yang
2024-05-22 15:34 ` [PATCH 12/16] cpu: Add loongarch_cpu driver Jiaxun Yang
2024-05-22 15:34 ` [PATCH 13/16] timer: Add loongarch_timer driver Jiaxun Yang
2024-05-22 15:34 ` [PATCH 14/16] board: emulation: Add qemu-loongarch Jiaxun Yang
2024-05-22 15:34 ` [PATCH 15/16] efi: LoongArch: Define LoongArch bits everywhere Jiaxun Yang
2024-05-23 16:14   ` Heinrich Schuchardt
2024-05-23 16:25     ` Jiaxun Yang
2024-05-22 15:34 ` [PATCH 16/16] efi: LoongArch: Implement everything Jiaxun Yang
2024-05-23 16:26   ` Heinrich Schuchardt
2024-05-23 16:46     ` Jiaxun Yang
2024-05-23 15:25 ` [PATCH 00/16] LoongArch initial support Tom Rini
2024-05-23 15:38   ` Jiaxun Yang
2024-05-23 15:43     ` Tom Rini
2024-06-04 10:50       ` Jiaxun Yang
2024-06-04 17:09         ` Tom Rini
2024-05-23 15:47     ` Peter Robinson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b723aa8e-1d29-4904-953d-160caf097136@gmx.de \
    --to=xypron.glpk@gmx.de \
    --cc=ilias.apalodimas@linaro.org \
    --cc=jiaxun.yang@flygoat.com \
    --cc=sjg@chromium.org \
    --cc=trini@konsulko.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.