Skip to contentSkip to conversation

FDT include file problems

U-Boot Wolfgang Denk 2 participants 8 messages Oct 19, 2008 – Oct 21, 2008

lore
Share & tools
lore
#0 lore raw

Hello,

on some systems (for example Fedora Core 4) U-Boot builds with the following wanrings only:

...
In file included from /home/wd/git/u-boot/include/libfdt_env.h:33,

                 from fdt.c:51:
/usr/include/asm/byteorder.h:6:2: warning: #warning using private kernel header; include <endian.h> instead!
In file included from /home/wd/git/u-boot/include/libfdt_env.h:33,
                 from fdt_ro.c:51:
/usr/include/asm/byteorder.h:6:2: warning: #warning using private kernel header; include <endian.h> instead!
In file included from /home/wd/git/u-boot/include/libfdt_env.h:33,
                 from fdt_rw.c:51:
/usr/include/asm/byteorder.h:6:2: warning: #warning using private kernel header; include <endian.h> instead!
In file included from /home/wd/git/u-boot/include/libfdt_env.h:33,
                 from fdt_strerror.c:51:
/usr/include/asm/byteorder.h:6:2: warning: #warning using private kernel header; include <endian.h> instead!
In file included from /home/wd/git/u-boot/include/libfdt_env.h:33,
                 from fdt_wip.c:51:

/usr/include/asm/byteorder.h:6:2: warning: #warning using private kernel header; include <endian.h> instead!
...

The suggested change works in image.h, for example like this:

=======================================================================

include/image.h +11 -9
index 82e6345..1598b61 100644
@@ -33,27 +33,29 @@
 #ifndef __IMAGE_H__
 #define __IMAGE_H__
 
-#include <asm/byteorder.h>
-#include <command.h>
-
-#ifndef USE_HOSTCC
-#include <lmb.h>
-#include <linux/string.h>
-#include <asm/u-boot.h>
-
-#else
+#if USE_HOSTCC
+#include <endian.h>
 
 /* new uImage format support enabled on host */
 #define CONFIG_FIT		1
 #define CONFIG_OF_LIBFDT	1
 #define CONFIG_FIT_VERBOSE	1 /* enable fit_format_{error,warning}() */
 
+#else
+
+#include <lmb.h>
+#include <linux/string.h>
+#include <asm/u-boot.h>
+#include <asm/byteorder.h>
+
 #endif /* USE_HOSTCC */
 
 #if defined(CONFIG_FIT) && !defined(CONFIG_OF_LIBFDT)
 #error "CONFIG_OF_LIBFDT not enabled, required by CONFIG_FIT!"
 #endif
 
+#include <command.h>
+
 #if defined(CONFIG_FIT)
 #include <fdt.h>
 #include <libfdt.h>

=======================================================================

However, for the FDT code this doesn't help, as we then will get
unresolved references for fdt32_to_cpu(), cpu_to_fdt32(),
fdt64_to_cpu() and cpu_to_fdt64().

The 32 bit accesses couldbe worked around by using htonl() resp. ntohl(), but I don't know a good way for the 64 bit cases.

Is there a clean and portable way to do this?

Best regards,

Wolfgang Denk

Signature · 5 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
There you go man, Keep as cool as you can. It riles them  to  believe
that you perceive the web they weave. Keep on being free!
#1 lore raw
Quoted 9 lines · Wolfgang Denk

Hello,

on some systems (for example Fedora Core 4) U-Boot builds with the following wanrings only:

...
In file included from /home/wd/git/u-boot/include/libfdt_env.h:33,

                 from fdt.c:51:

/usr/include/asm/byteorder.h:6:2: warning: #warning using private kernel header; include <endian.h> instead!

[snip]

Quoted 4 lines

However, for the FDT code this doesn't help, as we then will get
unresolved references for fdt32_to_cpu(), cpu_to_fdt32(),
fdt64_to_cpu() and cpu_to_fdt64().

Quoted 8 lines

The 32 bit accesses couldbe worked around by using htonl() resp. ntohl(), but I don't know a good way for the 64 bit cases.

Is there a clean and portable way to do this?

Best regards,

Wolfgang Denk

Hi Wolfgang,

Does this work better?

Best regards,
gvb

#2 lore raw

Dear Jerry Van Baren,

Quoted 5 lines · In message <[email protected]> you wrote:
Quoted 5 lines

...
In file included from /home/wd/git/u-boot/include/libfdt_env.h:33,

                 from fdt.c:51:

/usr/include/asm/byteorder.h:6:2: warning: #warning using private kernel header; include <endian.h> instead!

...

Quoted 1 line

Does this work better?

Not really:

Quoted 7 lines

From 0d33fb368acac6f88c0940ff2d1c77856900abcd Mon Sep 17 00:00:00 2001
From: Gerald Van Baren <[email protected]>
Date: Sun, 19 Oct 2008 22:50:07 -0400
Subject: [PATCH] libfdt: Use endian.h instead of asm/byteorder.h

Using asm/byteorder.h directly is strongly discouraged since it is a private kernel header.

Hm... but you still use it?

include/libfdt_env.h line 33

Quoted 11 lines
---
 include/libfdt_env.h |   15 +++++++++++----
 1 files changed, 11 insertions(+), 4 deletions(-)
include/libfdt_env.h +0 -0
index 671c3a8..728a248 100644
@@ -33,10 +33,17 @@
 #include <asm/byteorder.h>

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

This has not changed?

Quoted 7 lines
include/libfdt_env.h +1 -4
 extern struct fdt_header *working_fdt;  /* Pointer to the working fdt */
 
-#define fdt32_to_cpu(x)		__be32_to_cpu(x)
-#define cpu_to_fdt32(x)		__cpu_to_be32(x)
-#define fdt64_to_cpu(x)		__be64_to_cpu(x)
-#define cpu_to_fdt64(x)		__cpu_to_be64(x)
+#if __BYTE_ORDER == __LITTLE_ENDIAN

include/libfdt_env.h line 46

Quoted 10 lines
include/libfdt_env.h +10 -0
+#define fdt32_to_cpu(x)		__swab32(x)
+#define cpu_to_fdt32(x)		__swab32(x)
+#define fdt64_to_cpu(x)		__swab64(x)
+#define cpu_to_fdt64(x)		__swab64(x)
+#else
+#define fdt32_to_cpu(x)		(x)
+#define cpu_to_fdt32(x)		(x)
+#define fdt64_to_cpu(x)		(x)
+#define cpu_to_fdt64(x)		(x)
+#endif

If I change the code to include <asm/byteorder.h> only for the U-Boot code but use <endian.h>, I get warnings:

../include/libfdt.h:162: warning: implicit declaration of function '__swab32'

and finally a "undefined reference to `__swab32'" error. Seems __swab32 and __swab64 are defined only in linux/byteorder/swab.h

Best regards,

Wolfgang Denk

Signature · 7 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
"One day," said a dull voice from down below, "I'm going to  be  back
in  form again and you're going to be very sorry you said that. For a
very long time. I might even go so far as to make even more Time just
for you to be sorry in."              - Terry Pratchett, _Small Gods_
#3 lore raw
Quoted 12 lines · Wolfgang Denk

Dear Jerry Van Baren,

Quoted 4 lines · In message <[email protected]> you wrote:
Quoted 4 lines

...
In file included from /home/wd/git/u-boot/include/libfdt_env.h:33,

                 from fdt.c:51:

/usr/include/asm/byteorder.h:6:2: warning: #warning using private kernel header; include <endian.h> instead!

...

Quoted 1 line

Does this work better?

Not really:

[snip]

Quoted 9 lines

include/libfdt_env.h line 33

Quoted 6 lines
include/libfdt_env.h +0 -0
index 671c3a8..728a248 100644
@@ -33,10 +33,17 @@
 #include <asm/byteorder.h>

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

This has not changed?

Oops, I was rushing too much. I missed changing this to endian.h.

[snip]

Quoted 11 lines

If I change the code to include <asm/byteorder.h> only for the U-Boot code but use <endian.h>, I get warnings:

../include/libfdt.h:162: warning: implicit declaration of function '__swab32'

and finally a "undefined reference to `__swab32'" error. Seems __swab32 and __swab64 are defined only in linux/byteorder/swab.h

Best regards,

Wolfgang Denk

...and if I were not rushing so much, I would have found that myself instead of looking stupid. :-(

Google hasn't been very helpful for answering the question of how to handle endian issues in userland (non-kernel) code. Hmmm. Grrr. Maybe I'm not asking it the right question.

Maybe we need to make our own copy of linux/byteorder/swab.h in u-boot?
That doesn't seem right.

Best regards,
gvb

#4 lore raw

Dear Jerry Van Baren,

Quoted 7 lines · In message <[email protected]> you wrote:

...and if I were not rushing so much, I would have found that myself instead of looking stupid. :-(

Google hasn't been very helpful for answering the question of how to handle endian issues in userland (non-kernel) code. Hmmm. Grrr. Maybe I'm not asking it the right question.

Well, I have to admit that you did not perform better, because I've been searching before, and I didn't find a good solution myself either. Normally, I use the network macros for such stuff, but these don't have any 64 bit conversions...

Quoted 2 lines

Maybe we need to make our own copy of linux/byteorder/swab.h in u-boot?
That doesn't seem right.

No, that would not be right.

Best regards,

Wolfgang Denk

Signature · 5 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Real programmers can write assembly code in any language.   :-)
                      - Larry Wall in  <[email protected]>
#5 lore raw
In reply to Jerry Van Baren

Dear Jerry Van Baren,

Quoted 4 lines · In message <[email protected]> you wrote:

Google hasn't been very helpful for answering the question of how to handle endian issues in userland (non-kernel) code. Hmmm. Grrr. Maybe I'm not asking it the right question.

This patch seems to work for me:

include/libfdt_env.h +14 -5
index 671c3a8..355ebf2 100644
@@ -24,19 +24,28 @@
 #ifdef USE_HOSTCC
 #include <stdint.h>
 #include <string.h>
+#include <endian.h>
+#include <byteswap.h>
 #else
 #include <linux/string.h>
 #include <linux/types.h>
+#include <asm/byteorder.h>
 #endif /* USE_HOSTCC */
 
 #include <stddef.h>
-#include <asm/byteorder.h>
 extern struct fdt_header *working_fdt;  /* Pointer to the working fdt */
 
-#define fdt32_to_cpu(x)		__be32_to_cpu(x)
-#define cpu_to_fdt32(x)		__cpu_to_be32(x)
-#define fdt64_to_cpu(x)		__be64_to_cpu(x)
-#define cpu_to_fdt64(x)		__cpu_to_be64(x)
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define fdt32_to_cpu(x)		bswap_32(x)
+#define cpu_to_fdt32(x)		bswap_32(x)
+#define fdt64_to_cpu(x)		bswap_64(x)
+#define cpu_to_fdt64(x)		bswap_64(x)
+#else
+#define fdt32_to_cpu(x)		(x)
+#define cpu_to_fdt32(x)		(x)
+#define fdt64_to_cpu(x)		(x)
+#define cpu_to_fdt64(x)		(x)
+#endif
 
 /*
  * Types for `void *' pointers.

Best regards,

Wolfgang Denk

Signature · 4 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
The speed of time is one second per second.
Acked-by Gerald Van Baren
#6 lore raw
Quoted 48 lines · Wolfgang Denk

Dear Jerry Van Baren,

Quoted 3 lines · In message <[email protected]> you wrote:

Google hasn't been very helpful for answering the question of how to handle endian issues in userland (non-kernel) code. Hmmm. Grrr. Maybe I'm not asking it the right question.

This patch seems to work for me:

include/libfdt_env.h +14 -5
index 671c3a8..355ebf2 100644
@@ -24,19 +24,28 @@
 #ifdef USE_HOSTCC
 #include <stdint.h>
 #include <string.h>
+#include <endian.h>
+#include <byteswap.h>
 #else
 #include <linux/string.h>
 #include <linux/types.h>
+#include <asm/byteorder.h>
 #endif /* USE_HOSTCC */
 
 #include <stddef.h>
-#include <asm/byteorder.h>
 extern struct fdt_header *working_fdt;  /* Pointer to the working fdt */
 
-#define fdt32_to_cpu(x)		__be32_to_cpu(x)
-#define cpu_to_fdt32(x)		__cpu_to_be32(x)
-#define fdt64_to_cpu(x)		__be64_to_cpu(x)
-#define cpu_to_fdt64(x)		__cpu_to_be64(x)
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define fdt32_to_cpu(x)		bswap_32(x)
+#define cpu_to_fdt32(x)		bswap_32(x)
+#define fdt64_to_cpu(x)		bswap_64(x)
+#define cpu_to_fdt64(x)		bswap_64(x)
+#else
+#define fdt32_to_cpu(x)		(x)
+#define cpu_to_fdt32(x)		(x)
+#define fdt64_to_cpu(x)		(x)
+#define cpu_to_fdt64(x)		(x)
+#endif
 
 /*
  * Types for `void *' pointers.
Quoted 3 lines

Best regards,

Wolfgang Denk

Dear Wolfgang,

This works for me too. Do you want to apply it directly? That would be fastest and easiest.

Thanks,
gvb

#7 lore raw

Dear Jerry Van Baren,

Quoted 2 lines · In message <[email protected]> you wrote:
Quoted 2 lines

This patch seems to work for me:

...

Quoted 4 lines

This works for me too. Do you want to apply it directly? That would be fastest and easiest.

Thanks - I'll post a proper patch first, including theother change (in include/image.h).

Best regards,

Wolfgang Denk

Signature · 7 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Boss, n.: According to the Oxford English Dictionary, in  the  Middle
Ages  the  words  "boss"  and "botch" were largely synonymous, except
that boss, in addition to meaning  "a  supervisor  of  workers"  also
meant "an ornamental stud."