mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH 1/1] command: oftree: support load device tree from memory
@ 2018-06-06 15:16 Pascal Vizeli
  2018-06-06 19:57 ` Andrey Smirnov
  2018-06-07  7:20 ` Sascha Hauer
  0 siblings, 2 replies; 7+ messages in thread
From: Pascal Vizeli @ 2018-06-06 15:16 UTC (permalink / raw)
  To: barebox; +Cc: Pascal Vizeli

DON'T MERGE: this is only a concept patch.

On some device, barebox is the second bootloader. The first bootloader provide
some times allready a better device tree as the linux kernel own.
Mostly barebox can't boot from this device tree but the linux kernel can.

This patch allow to load a device tree from memory from first bootloader.

For implementation:

Not sure what is the best. Maybe we can create a of_unflatten_file_dtb() and
of_unflatten_memory_dtb() they return fdt. There are a lot place they load
a fdt from a file and repeat the same code.

Signed-off-by: Pascal Vizeli <pvizeli@syshack.ch>
---
 commands/oftree.c | 39 ++++++++++++++++++++++++++++++++++++++-
 1 file changed, 38 insertions(+), 1 deletion(-)

diff --git a/commands/oftree.c b/commands/oftree.c
index 8a47c0be5..831b6c280 100644
--- a/commands/oftree.c
+++ b/commands/oftree.c
@@ -40,9 +40,40 @@
 #include <fcntl.h>
 #include <complete.h>
 
+struct fdt_header* read_memory_dtb(loff_t mem_start)
+{
+	struct fdt_header *oftree = NULL;
+	struct fdt_header *memtree;
+	int mode = O_RWSIZE_4 | O_RDONLY;
+	int fd;
+	uint32_t size;
+	void *map;
+
+	fd = open_and_lseek("/dev/mem", mode,mem_start);
+	if (fd < 0)
+		return NULL;
+
+	map = memmap(fd, PROT_READ);
+	if (map == (void *)-1)
+		goto end;
+	memtree = map;
+
+	size = be32_to_cpu(memtree->totalsize);
+	if (!size)
+		goto end;
+
+	oftree = malloc(size);
+	memcpy((void *)oftree, map, size);
+
+end:
+	close(fd);
+	return oftree;
+}
+
 static int do_oftree(int argc, char *argv[])
 {
 	struct fdt_header *fdt = NULL;
+	loff_t mem_start;
 	size_t size;
 	int opt;
 	int probe = 0;
@@ -102,7 +133,13 @@ static int do_oftree(int argc, char *argv[])
 	}
 
 	if (load) {
-		fdt = read_file(load, &size);
+		if (file_name_detect_type(load) == filetype_oftree) {
+			fdt = read_file(load, &size);
+		} else {
+			mem_start = simple_strtoull(load, NULL, 0);
+			fdt = read_memory_dtb(mem_start);
+		}
+
 		if (!fdt) {
 			printf("unable to read %s\n", load);
 			return 1;
-- 
2.17.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/1] command: oftree: support load device tree from memory
  2018-06-06 15:16 [PATCH 1/1] command: oftree: support load device tree from memory Pascal Vizeli
@ 2018-06-06 19:57 ` Andrey Smirnov
  2018-06-07  7:20 ` Sascha Hauer
  1 sibling, 0 replies; 7+ messages in thread
From: Andrey Smirnov @ 2018-06-06 19:57 UTC (permalink / raw)
  To: Pascal Vizeli; +Cc: Barebox List

On Wed, Jun 6, 2018 at 8:16 AM, Pascal Vizeli <pvizeli@syshack.ch> wrote:
> DON'T MERGE: this is only a concept patch.
>
> On some device, barebox is the second bootloader. The first bootloader provide
> some times allready a better device tree as the linux kernel own.
> Mostly barebox can't boot from this device tree but the linux kernel can.
>
> This patch allow to load a device tree from memory from first bootloader.
>
> For implementation:
>
> Not sure what is the best. Maybe we can create a of_unflatten_file_dtb() and
> of_unflatten_memory_dtb() they return fdt. There are a lot place they load
> a fdt from a file and repeat the same code.
>

IMHO, an ideal solution to this problem would be to either extend
RAMFS or create a separate FS that would allow mounting an arbitrary
blob in RAM as a file with size determined using
file_name_detect_type() + custom code or specified explicitly.

That's quite a bit more work that this patch, though.

Thanks,
Andrey Smirnov

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/1] command: oftree: support load device tree from memory
  2018-06-06 15:16 [PATCH 1/1] command: oftree: support load device tree from memory Pascal Vizeli
  2018-06-06 19:57 ` Andrey Smirnov
@ 2018-06-07  7:20 ` Sascha Hauer
  2018-06-07  8:29   ` Pascal Vizeli
  1 sibling, 1 reply; 7+ messages in thread
From: Sascha Hauer @ 2018-06-07  7:20 UTC (permalink / raw)
  To: Pascal Vizeli; +Cc: barebox

On Wed, Jun 06, 2018 at 03:16:02PM +0000, Pascal Vizeli wrote:
> DON'T MERGE: this is only a concept patch.
> 
> On some device, barebox is the second bootloader. The first bootloader provide
> some times allready a better device tree as the linux kernel own.
> Mostly barebox can't boot from this device tree but the linux kernel can.
> 
> This patch allow to load a device tree from memory from first bootloader.

Note while it may be handy to have a command for that, you can already
do this without writing code:

memcpy -d /mydtb <dtbaddress> 0 0x10000
oftree -l /mydtb

The only drawback is that you have to guess the size of the dtb.

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/1] command: oftree: support load device tree from memory
  2018-06-07  7:20 ` Sascha Hauer
@ 2018-06-07  8:29   ` Pascal Vizeli
  2018-06-07  8:53     ` Sascha Hauer
  0 siblings, 1 reply; 7+ messages in thread
From: Pascal Vizeli @ 2018-06-07  8:29 UTC (permalink / raw)
  To: Sascha Hauer; +Cc: barebox, Pascal Vizeli

Thanks for this workaround. I will use this.

I will later send a patch they store the device tree address on
raspberry into a variable.
So that user can load this, if he need it.

The question is now, would you allow to load a device tree with a
memory address on oftree utility?
And if yes, where is the best place to add this function.

greets
Pascal

2018-06-07 9:20 GMT+02:00 Sascha Hauer <s.hauer@pengutronix.de>:
> On Wed, Jun 06, 2018 at 03:16:02PM +0000, Pascal Vizeli wrote:
>> DON'T MERGE: this is only a concept patch.
>>
>> On some device, barebox is the second bootloader. The first bootloader provide
>> some times allready a better device tree as the linux kernel own.
>> Mostly barebox can't boot from this device tree but the linux kernel can.
>>
>> This patch allow to load a device tree from memory from first bootloader.
>
> Note while it may be handy to have a command for that, you can already
> do this without writing code:
>
> memcpy -d /mydtb <dtbaddress> 0 0x10000
> oftree -l /mydtb
>
> The only drawback is that you have to guess the size of the dtb.
>
> Sascha
>
> --
> Pengutronix e.K.                           |                             |
> Industrial Linux Solutions                 | http://www.pengutronix.de/  |
> Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
> Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/1] command: oftree: support load device tree from memory
  2018-06-07  8:29   ` Pascal Vizeli
@ 2018-06-07  8:53     ` Sascha Hauer
  2018-06-07 10:42       ` Pascal Vizeli
  0 siblings, 1 reply; 7+ messages in thread
From: Sascha Hauer @ 2018-06-07  8:53 UTC (permalink / raw)
  To: Pascal Vizeli; +Cc: barebox, Pascal Vizeli

On Thu, Jun 07, 2018 at 10:29:53AM +0200, Pascal Vizeli wrote:
> Thanks for this workaround. I will use this.
> 
> I will later send a patch they store the device tree address on
> raspberry into a variable.
> So that user can load this, if he need it.
> 
> The question is now, would you allow to load a device tree with a
> memory address on oftree utility?
> And if yes, where is the best place to add this function.

Instead of a command I would prefer if you could just store r2 from
the original bootloader you have been started with, and in a board
specific initcall you copy the devicetree you found in memory to a
file. Then the user has access to the devicetree with regular file
commands and there is no need to guess the memory address where the
original bootloader stored the device tree.

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/1] command: oftree: support load device tree from memory
  2018-06-07  8:53     ` Sascha Hauer
@ 2018-06-07 10:42       ` Pascal Vizeli
  2018-06-07 12:45         ` Pascal Vizeli
  0 siblings, 1 reply; 7+ messages in thread
From: Pascal Vizeli @ 2018-06-07 10:42 UTC (permalink / raw)
  To: Sascha Hauer; +Cc: barebox, Pascal Vizeli

That sounds good. Thanks for the direction.

My workaround look like:
memcpy -d /tmp/rpi.dtb 0xf42400 0 0x10000
of_dump -f /tmp/rpi.dtb > /dev/null
oftree -f -l /tmp/rpi.dtb

Without 'of_dump', the 'oftree' give a bad magic 0x5.... error.

I need add support for HassOS to raspberry and in a second round I
will try to implement your suggestion.

best regards
Pascal

2018-06-07 10:53 GMT+02:00 Sascha Hauer <s.hauer@pengutronix.de>:
> On Thu, Jun 07, 2018 at 10:29:53AM +0200, Pascal Vizeli wrote:
>> Thanks for this workaround. I will use this.
>>
>> I will later send a patch they store the device tree address on
>> raspberry into a variable.
>> So that user can load this, if he need it.
>>
>> The question is now, would you allow to load a device tree with a
>> memory address on oftree utility?
>> And if yes, where is the best place to add this function.
>
> Instead of a command I would prefer if you could just store r2 from
> the original bootloader you have been started with, and in a board
> specific initcall you copy the devicetree you found in memory to a
> file. Then the user has access to the devicetree with regular file
> commands and there is no need to guess the memory address where the
> original bootloader stored the device tree.
>
> Sascha
>
> --
> Pengutronix e.K.                           |                             |
> Industrial Linux Solutions                 | http://www.pengutronix.de/  |
> Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
> Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/1] command: oftree: support load device tree from memory
  2018-06-07 10:42       ` Pascal Vizeli
@ 2018-06-07 12:45         ` Pascal Vizeli
  0 siblings, 0 replies; 7+ messages in thread
From: Pascal Vizeli @ 2018-06-07 12:45 UTC (permalink / raw)
  To: Sascha Hauer; +Cc: barebox, Pascal Vizeli

Okay. I found out the problem with bad magic and they is fix now. I
was needed a higher position into memory.

Anyway I found also a bug, that the fixup for partition hungs in a loop:
Dump on internal
flatten
unflatten
Run fix
Run fixup
Fixup memory
End fixup
Run fixup
fixup boot
End fixup
Run fixup
Fixup partition

I will find the bug and provide a bugfix. After that all should work :)

Greets
Pascal

2018-06-07 12:42 GMT+02:00 Pascal Vizeli <pascal.vizeli@syshack.ch>:
> That sounds good. Thanks for the direction.
>
> My workaround look like:
> memcpy -d /tmp/rpi.dtb 0xf42400 0 0x10000
> of_dump -f /tmp/rpi.dtb > /dev/null
> oftree -f -l /tmp/rpi.dtb
>
> Without 'of_dump', the 'oftree' give a bad magic 0x5.... error.
>
> I need add support for HassOS to raspberry and in a second round I
> will try to implement your suggestion.
>
> best regards
> Pascal
>
> 2018-06-07 10:53 GMT+02:00 Sascha Hauer <s.hauer@pengutronix.de>:
>> On Thu, Jun 07, 2018 at 10:29:53AM +0200, Pascal Vizeli wrote:
>>> Thanks for this workaround. I will use this.
>>>
>>> I will later send a patch they store the device tree address on
>>> raspberry into a variable.
>>> So that user can load this, if he need it.
>>>
>>> The question is now, would you allow to load a device tree with a
>>> memory address on oftree utility?
>>> And if yes, where is the best place to add this function.
>>
>> Instead of a command I would prefer if you could just store r2 from
>> the original bootloader you have been started with, and in a board
>> specific initcall you copy the devicetree you found in memory to a
>> file. Then the user has access to the devicetree with regular file
>> commands and there is no need to guess the memory address where the
>> original bootloader stored the device tree.
>>
>> Sascha
>>
>> --
>> Pengutronix e.K.                           |                             |
>> Industrial Linux Solutions                 | http://www.pengutronix.de/  |
>> Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
>> Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2018-06-07 12:46 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-06-06 15:16 [PATCH 1/1] command: oftree: support load device tree from memory Pascal Vizeli
2018-06-06 19:57 ` Andrey Smirnov
2018-06-07  7:20 ` Sascha Hauer
2018-06-07  8:29   ` Pascal Vizeli
2018-06-07  8:53     ` Sascha Hauer
2018-06-07 10:42       ` Pascal Vizeli
2018-06-07 12:45         ` Pascal Vizeli

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox