Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
eb90b4f8
Commit
eb90b4f8
authored
Feb 04, 2021
by
Rob Herring
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'dt/dtc-sync' into dt/next
parents
9183908e
ce88c9c7
Changes
22
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
372 additions
and
237 deletions
+372
-237
.gitignore
.gitignore
+1
-0
Makefile
Makefile
+4
-1
scripts/Makefile.dtbinst
scripts/Makefile.dtbinst
+3
-0
scripts/Makefile.lib
scripts/Makefile.lib
+5
-0
scripts/dtc/Makefile
scripts/dtc/Makefile
+7
-1
scripts/dtc/data.c
scripts/dtc/data.c
+3
-3
scripts/dtc/dtc.c
scripts/dtc/dtc.c
+4
-0
scripts/dtc/dtc.h
scripts/dtc/dtc.h
+4
-4
scripts/dtc/fdtdump.c
scripts/dtc/fdtdump.c
+0
-163
scripts/dtc/fdtoverlay.c
scripts/dtc/fdtoverlay.c
+208
-0
scripts/dtc/flattree.c
scripts/dtc/flattree.c
+4
-4
scripts/dtc/libfdt/fdt.c
scripts/dtc/libfdt/fdt.c
+4
-0
scripts/dtc/libfdt/fdt_ro.c
scripts/dtc/libfdt/fdt_ro.c
+10
-10
scripts/dtc/libfdt/fdt_rw.c
scripts/dtc/libfdt/fdt_rw.c
+3
-1
scripts/dtc/libfdt/fdt_sw.c
scripts/dtc/libfdt/fdt_sw.c
+1
-1
scripts/dtc/libfdt/libfdt.h
scripts/dtc/libfdt/libfdt.h
+84
-42
scripts/dtc/libfdt/libfdt_internal.h
scripts/dtc/libfdt/libfdt_internal.h
+19
-0
scripts/dtc/livetree.c
scripts/dtc/livetree.c
+1
-1
scripts/dtc/srcpos.c
scripts/dtc/srcpos.c
+1
-1
scripts/dtc/update-dtc-source.sh
scripts/dtc/update-dtc-source.sh
+2
-1
scripts/dtc/version_gen.h
scripts/dtc/version_gen.h
+1
-1
scripts/dtc/yamltree.c
scripts/dtc/yamltree.c
+3
-3
No files found.
.gitignore
View file @
eb90b4f8
...
...
@@ -18,6 +18,7 @@
*.c.[012]*.*
*.dt.yaml
*.dtb
*.dtbo
*.dtb.S
*.dwo
*.elf
...
...
Makefile
View file @
eb90b4f8
...
...
@@ -1337,6 +1337,9 @@ ifneq ($(dtstree),)
%.dtb
:
include/config/kernel.release scripts_dtc
$(Q)$(MAKE)
$(build)
=
$(dtstree)
$(dtstree)
/
$@
%.dtbo
:
include/config/kernel.release scripts_dtc
$(Q)$(MAKE)
$(build)
=
$(dtstree)
$(dtstree)
/
$@
PHONY
+=
dtbs dtbs_install dtbs_check
dtbs
:
include/config/kernel.release scripts_dtc
$(Q)$(MAKE)
$(build)
=
$(dtstree)
...
...
@@ -1816,7 +1819,7 @@ clean: $(clean-dirs)
@
find
$(
if
$(KBUILD_EXTMOD)
,
$(KBUILD_EXTMOD)
, .
)
$(RCS_FIND_IGNORE)
\
\(
-name
'*.[aios]'
-o
-name
'*.ko'
-o
-name
'.*.cmd'
\
-o
-name
'*.ko.*'
\
-o
-name
'*.dtb'
-o
-name
'*.dtb.S'
-o
-name
'*.dt.yaml'
\
-o
-name
'*.dtb'
-o
-name
'*.dtb
o'
-o
-name
'*.dtb
.S'
-o
-name
'*.dt.yaml'
\
-o
-name
'*.dwo'
-o
-name
'*.lst'
\
-o
-name
'*.su'
-o
-name
'*.mod'
\
-o
-name
'.*.d'
-o
-name
'.*.tmp'
-o
-name
'*.mod.c'
\
...
...
scripts/Makefile.dtbinst
View file @
eb90b4f8
...
...
@@ -29,6 +29,9 @@ quiet_cmd_dtb_install = INSTALL $@
$(dst)/%.dtb
:
$(obj)/%.dtb
$(
call
cmd,dtb_install
)
$(dst)/%.dtbo
:
$(obj)/%.dtbo
$(
call
cmd,dtb_install
)
PHONY
+=
$(subdirs)
$(subdirs)
:
$(Q)$(MAKE)
$(dtbinst)
=
$@
dst
=
$(
patsubst
$(obj)
/%,
$(dst)
/%,
$@
)
...
...
scripts/Makefile.lib
View file @
eb90b4f8
...
...
@@ -86,7 +86,9 @@ extra-$(CONFIG_OF_ALL_DTBS) += $(dtb-)
ifneq
($(CHECK_DTBS),)
extra-y
+=
$(
patsubst
%.dtb,%.dt.yaml,
$
(
dtb-y
))
extra-y
+=
$(
patsubst
%.dtbo,%.dt.yaml,
$
(
dtb-y
))
extra-$(CONFIG_OF_ALL_DTBS)
+=
$(
patsubst
%.dtb,%.dt.yaml,
$
(
dtb-
))
extra-$(CONFIG_OF_ALL_DTBS)
+=
$(
patsubst
%.dtbo,%.dt.yaml,
$
(
dtb-
))
endif
# Add subdir path
...
...
@@ -327,6 +329,9 @@ cmd_dtc = $(HOSTCC) -E $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ;
$(obj)/%.dtb
:
$(src)/%.dts $(DTC) FORCE
$(
call
if_changed_dep,dtc
)
$(obj)/%.dtbo
:
$(src)/%.dts $(DTC) FORCE
$(
call
if_changed_dep,dtc
)
DT_CHECKER
?=
dt-validate
DT_BINDING_DIR
:=
Documentation/devicetree/bindings
# DT_TMP_SCHEMA may be overridden from Documentation/devicetree/bindings/Makefile
...
...
scripts/dtc/Makefile
View file @
eb90b4f8
# SPDX-License-Identifier: GPL-2.0
# scripts/dtc makefile
hostprogs-always-$(CONFIG_DTC)
+=
dtc
hostprogs-always-$(CONFIG_DTC)
+=
dtc
fdtoverlay
hostprogs-always-$(CHECK_DT_BINDING)
+=
dtc
dtc-objs
:=
dtc.o flattree.o fstree.o data.o livetree.o treesource.o
\
srcpos.o checks.o util.o
dtc-objs
+=
dtc-lexer.lex.o dtc-parser.tab.o
# The upstream project builds libfdt as a separate library. We are choosing to
# instead directly link the libfdt object files into fdtoverlay.
libfdt-objs
:=
fdt.o fdt_ro.o fdt_wip.o fdt_sw.o fdt_rw.o fdt_strerror.o fdt_empty_tree.o fdt_addresses.o fdt_overlay.o
libfdt
=
$(
addprefix
libfdt/,
$
(
libfdt-objs
))
fdtoverlay-objs
:=
$(libfdt)
fdtoverlay.o util.o
# Source files need to get at the userspace version of libfdt_env.h to compile
HOST_EXTRACFLAGS
+=
-I
$(srctree)
/
$(src)
/libfdt
...
...
scripts/dtc/data.c
View file @
eb90b4f8
...
...
@@ -21,10 +21,10 @@ void data_free(struct data d)
free
(
d
.
val
);
}
struct
data
data_grow_for
(
struct
data
d
,
int
xlen
)
struct
data
data_grow_for
(
struct
data
d
,
unsigned
int
xlen
)
{
struct
data
nd
;
int
newsize
;
unsigned
int
newsize
;
if
(
xlen
==
0
)
return
d
;
...
...
@@ -84,7 +84,7 @@ struct data data_copy_file(FILE *f, size_t maxlen)
while
(
!
feof
(
f
)
&&
(
d
.
len
<
maxlen
))
{
size_t
chunksize
,
ret
;
if
(
maxlen
==
-
1
)
if
(
maxlen
==
(
size_t
)
-
1
)
chunksize
=
4096
;
else
chunksize
=
maxlen
-
d
.
len
;
...
...
scripts/dtc/dtc.c
View file @
eb90b4f8
...
...
@@ -122,6 +122,8 @@ static const char *guess_type_by_name(const char *fname, const char *fallback)
return
"dts"
;
if
(
!
strcasecmp
(
s
,
".yaml"
))
return
"yaml"
;
if
(
!
strcasecmp
(
s
,
".dtbo"
))
return
"dtb"
;
if
(
!
strcasecmp
(
s
,
".dtb"
))
return
"dtb"
;
return
fallback
;
...
...
@@ -357,6 +359,8 @@ int main(int argc, char *argv[])
#endif
}
else
if
(
streq
(
outform
,
"dtb"
))
{
dt_to_blob
(
outf
,
dti
,
outversion
);
}
else
if
(
streq
(
outform
,
"dtbo"
))
{
dt_to_blob
(
outf
,
dti
,
outversion
);
}
else
if
(
streq
(
outform
,
"asm"
))
{
dt_to_asm
(
outf
,
dti
,
outversion
);
}
else
if
(
streq
(
outform
,
"null"
))
{
...
...
scripts/dtc/dtc.h
View file @
eb90b4f8
...
...
@@ -105,13 +105,13 @@ extern const char *markername(enum markertype markertype);
struct
marker
{
enum
markertype
type
;
int
offset
;
unsigned
int
offset
;
char
*
ref
;
struct
marker
*
next
;
};
struct
data
{
int
len
;
unsigned
int
len
;
char
*
val
;
struct
marker
*
markers
;
};
...
...
@@ -129,7 +129,7 @@ size_t type_marker_length(struct marker *m);
void
data_free
(
struct
data
d
);
struct
data
data_grow_for
(
struct
data
d
,
int
xlen
);
struct
data
data_grow_for
(
struct
data
d
,
unsigned
int
xlen
);
struct
data
data_copy_mem
(
const
char
*
mem
,
int
len
);
struct
data
data_copy_escape_string
(
const
char
*
s
,
int
len
);
...
...
@@ -253,7 +253,7 @@ void append_to_property(struct node *node,
const
char
*
get_unitname
(
struct
node
*
node
);
struct
property
*
get_property
(
struct
node
*
node
,
const
char
*
propname
);
cell_t
propval_cell
(
struct
property
*
prop
);
cell_t
propval_cell_n
(
struct
property
*
prop
,
int
n
);
cell_t
propval_cell_n
(
struct
property
*
prop
,
unsigned
int
n
);
struct
property
*
get_property_by_label
(
struct
node
*
tree
,
const
char
*
label
,
struct
node
**
node
);
struct
marker
*
get_marker_label
(
struct
node
*
tree
,
const
char
*
label
,
...
...
scripts/dtc/fdtdump.c
deleted
100644 → 0
View file @
9183908e
// SPDX-License-Identifier: GPL-2.0
/*
* fdtdump.c - Contributed by Pantelis Antoniou <pantelis.antoniou AT gmail.com>
*/
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <fdt.h>
#include <libfdt_env.h>
#include "util.h"
#define ALIGN(x, a) (((x) + ((a) - 1)) & ~((a) - 1))
#define PALIGN(p, a) ((void *)(ALIGN((unsigned long)(p), (a))))
#define GET_CELL(p) (p += 4, *((const uint32_t *)(p-4)))
static
void
print_data
(
const
char
*
data
,
int
len
)
{
int
i
;
const
char
*
p
=
data
;
/* no data, don't print */
if
(
len
==
0
)
return
;
if
(
util_is_printable_string
(
data
,
len
))
{
printf
(
" =
\"
%s
\"
"
,
(
const
char
*
)
data
);
}
else
if
((
len
%
4
)
==
0
)
{
printf
(
" = <"
);
for
(
i
=
0
;
i
<
len
;
i
+=
4
)
printf
(
"0x%08x%s"
,
fdt32_to_cpu
(
GET_CELL
(
p
)),
i
<
(
len
-
4
)
?
" "
:
""
);
printf
(
">"
);
}
else
{
printf
(
" = ["
);
for
(
i
=
0
;
i
<
len
;
i
++
)
printf
(
"%02x%s"
,
*
p
++
,
i
<
len
-
1
?
" "
:
""
);
printf
(
"]"
);
}
}
static
void
dump_blob
(
void
*
blob
)
{
struct
fdt_header
*
bph
=
blob
;
uint32_t
off_mem_rsvmap
=
fdt32_to_cpu
(
bph
->
off_mem_rsvmap
);
uint32_t
off_dt
=
fdt32_to_cpu
(
bph
->
off_dt_struct
);
uint32_t
off_str
=
fdt32_to_cpu
(
bph
->
off_dt_strings
);
struct
fdt_reserve_entry
*
p_rsvmap
=
(
struct
fdt_reserve_entry
*
)((
char
*
)
blob
+
off_mem_rsvmap
);
const
char
*
p_struct
=
(
const
char
*
)
blob
+
off_dt
;
const
char
*
p_strings
=
(
const
char
*
)
blob
+
off_str
;
uint32_t
version
=
fdt32_to_cpu
(
bph
->
version
);
uint32_t
totalsize
=
fdt32_to_cpu
(
bph
->
totalsize
);
uint32_t
tag
;
const
char
*
p
,
*
s
,
*
t
;
int
depth
,
sz
,
shift
;
int
i
;
uint64_t
addr
,
size
;
depth
=
0
;
shift
=
4
;
printf
(
"/dts-v1/;
\n
"
);
printf
(
"// magic:
\t\t
0x%x
\n
"
,
fdt32_to_cpu
(
bph
->
magic
));
printf
(
"// totalsize:
\t\t
0x%x (%d)
\n
"
,
totalsize
,
totalsize
);
printf
(
"// off_dt_struct:
\t
0x%x
\n
"
,
off_dt
);
printf
(
"// off_dt_strings:
\t
0x%x
\n
"
,
off_str
);
printf
(
"// off_mem_rsvmap:
\t
0x%x
\n
"
,
off_mem_rsvmap
);
printf
(
"// version:
\t\t
%d
\n
"
,
version
);
printf
(
"// last_comp_version:
\t
%d
\n
"
,
fdt32_to_cpu
(
bph
->
last_comp_version
));
if
(
version
>=
2
)
printf
(
"// boot_cpuid_phys:
\t
0x%x
\n
"
,
fdt32_to_cpu
(
bph
->
boot_cpuid_phys
));
if
(
version
>=
3
)
printf
(
"// size_dt_strings:
\t
0x%x
\n
"
,
fdt32_to_cpu
(
bph
->
size_dt_strings
));
if
(
version
>=
17
)
printf
(
"// size_dt_struct:
\t
0x%x
\n
"
,
fdt32_to_cpu
(
bph
->
size_dt_struct
));
printf
(
"
\n
"
);
for
(
i
=
0
;
;
i
++
)
{
addr
=
fdt64_to_cpu
(
p_rsvmap
[
i
].
address
);
size
=
fdt64_to_cpu
(
p_rsvmap
[
i
].
size
);
if
(
addr
==
0
&&
size
==
0
)
break
;
printf
(
"/memreserve/ %llx %llx;
\n
"
,
(
unsigned
long
long
)
addr
,
(
unsigned
long
long
)
size
);
}
p
=
p_struct
;
while
((
tag
=
fdt32_to_cpu
(
GET_CELL
(
p
)))
!=
FDT_END
)
{
/* printf("tag: 0x%08x (%d)\n", tag, p - p_struct); */
if
(
tag
==
FDT_BEGIN_NODE
)
{
s
=
p
;
p
=
PALIGN
(
p
+
strlen
(
s
)
+
1
,
4
);
if
(
*
s
==
'\0'
)
s
=
"/"
;
printf
(
"%*s%s {
\n
"
,
depth
*
shift
,
""
,
s
);
depth
++
;
continue
;
}
if
(
tag
==
FDT_END_NODE
)
{
depth
--
;
printf
(
"%*s};
\n
"
,
depth
*
shift
,
""
);
continue
;
}
if
(
tag
==
FDT_NOP
)
{
printf
(
"%*s// [NOP]
\n
"
,
depth
*
shift
,
""
);
continue
;
}
if
(
tag
!=
FDT_PROP
)
{
fprintf
(
stderr
,
"%*s ** Unknown tag 0x%08x
\n
"
,
depth
*
shift
,
""
,
tag
);
break
;
}
sz
=
fdt32_to_cpu
(
GET_CELL
(
p
));
s
=
p_strings
+
fdt32_to_cpu
(
GET_CELL
(
p
));
if
(
version
<
16
&&
sz
>=
8
)
p
=
PALIGN
(
p
,
8
);
t
=
p
;
p
=
PALIGN
(
p
+
sz
,
4
);
printf
(
"%*s%s"
,
depth
*
shift
,
""
,
s
);
print_data
(
t
,
sz
);
printf
(
";
\n
"
);
}
}
int
main
(
int
argc
,
char
*
argv
[])
{
char
*
buf
;
if
(
argc
<
2
)
{
fprintf
(
stderr
,
"supply input filename
\n
"
);
return
5
;
}
buf
=
utilfdt_read
(
argv
[
1
]);
if
(
buf
)
dump_blob
(
buf
);
else
return
10
;
return
0
;
}
scripts/dtc/fdtoverlay.c
0 → 100644
View file @
eb90b4f8
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (c) 2017 Konsulko Group Inc. All rights reserved.
*
* Author:
* Pantelis Antoniou <pantelis.antoniou@konsulko.com>
*/
#include <assert.h>
#include <ctype.h>
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include <libfdt.h>
#include "util.h"
#define BUF_INCREMENT 65536
/* Usage related data. */
static
const
char
usage_synopsis
[]
=
"apply a number of overlays to a base blob
\n
"
" fdtoverlay <options> [<overlay.dtbo> [<overlay.dtbo>]]
\n
"
"
\n
"
USAGE_TYPE_MSG
;
static
const
char
usage_short_opts
[]
=
"i:o:v"
USAGE_COMMON_SHORT_OPTS
;
static
struct
option
const
usage_long_opts
[]
=
{
{
"input"
,
required_argument
,
NULL
,
'i'
},
{
"output"
,
required_argument
,
NULL
,
'o'
},
{
"verbose"
,
no_argument
,
NULL
,
'v'
},
USAGE_COMMON_LONG_OPTS
,
};
static
const
char
*
const
usage_opts_help
[]
=
{
"Input base DT blob"
,
"Output DT blob"
,
"Verbose messages"
,
USAGE_COMMON_OPTS_HELP
};
int
verbose
=
0
;
static
void
*
apply_one
(
char
*
base
,
const
char
*
overlay
,
size_t
*
buf_len
,
const
char
*
name
)
{
char
*
tmp
=
NULL
;
char
*
tmpo
;
int
ret
;
/*
* We take a copies first, because a a failed apply can trash
* both the base blob and the overlay
*/
tmpo
=
xmalloc
(
fdt_totalsize
(
overlay
));
do
{
tmp
=
xrealloc
(
tmp
,
*
buf_len
);
ret
=
fdt_open_into
(
base
,
tmp
,
*
buf_len
);
if
(
ret
)
{
fprintf
(
stderr
,
"
\n
Failed to make temporary copy: %s
\n
"
,
fdt_strerror
(
ret
));
goto
fail
;
}
memcpy
(
tmpo
,
overlay
,
fdt_totalsize
(
overlay
));
ret
=
fdt_overlay_apply
(
tmp
,
tmpo
);
if
(
ret
==
-
FDT_ERR_NOSPACE
)
{
*
buf_len
+=
BUF_INCREMENT
;
}
}
while
(
ret
==
-
FDT_ERR_NOSPACE
);
if
(
ret
)
{
fprintf
(
stderr
,
"
\n
Failed to apply '%s': %s
\n
"
,
name
,
fdt_strerror
(
ret
));
goto
fail
;
}
free
(
base
);
free
(
tmpo
);
return
tmp
;
fail:
free
(
tmpo
);
if
(
tmp
)
free
(
tmp
);
return
NULL
;
}
static
int
do_fdtoverlay
(
const
char
*
input_filename
,
const
char
*
output_filename
,
int
argc
,
char
*
argv
[])
{
char
*
blob
=
NULL
;
char
**
ovblob
=
NULL
;
size_t
buf_len
;
int
i
,
ret
=
-
1
;
blob
=
utilfdt_read
(
input_filename
,
&
buf_len
);
if
(
!
blob
)
{
fprintf
(
stderr
,
"
\n
Failed to read '%s'
\n
"
,
input_filename
);
goto
out_err
;
}
if
(
fdt_totalsize
(
blob
)
>
buf_len
)
{
fprintf
(
stderr
,
"
\n
Base blob is incomplete (%lu / %"
PRIu32
" bytes read)
\n
"
,
(
unsigned
long
)
buf_len
,
fdt_totalsize
(
blob
));
goto
out_err
;
}
/* allocate blob pointer array */
ovblob
=
xmalloc
(
sizeof
(
*
ovblob
)
*
argc
);
memset
(
ovblob
,
0
,
sizeof
(
*
ovblob
)
*
argc
);
/* read and keep track of the overlay blobs */
for
(
i
=
0
;
i
<
argc
;
i
++
)
{
size_t
ov_len
;
ovblob
[
i
]
=
utilfdt_read
(
argv
[
i
],
&
ov_len
);
if
(
!
ovblob
[
i
])
{
fprintf
(
stderr
,
"
\n
Failed to read '%s'
\n
"
,
argv
[
i
]);
goto
out_err
;
}
if
(
fdt_totalsize
(
ovblob
[
i
])
>
ov_len
)
{
fprintf
(
stderr
,
"
\n
Overlay '%s' is incomplete (%lu / %"
PRIu32
" bytes read)
\n
"
,
argv
[
i
],
(
unsigned
long
)
ov_len
,
fdt_totalsize
(
ovblob
[
i
]));
goto
out_err
;
}
}
buf_len
=
fdt_totalsize
(
blob
);
/* apply the overlays in sequence */
for
(
i
=
0
;
i
<
argc
;
i
++
)
{
blob
=
apply_one
(
blob
,
ovblob
[
i
],
&
buf_len
,
argv
[
i
]);
if
(
!
blob
)
goto
out_err
;
}
fdt_pack
(
blob
);
ret
=
utilfdt_write
(
output_filename
,
blob
);
if
(
ret
)
fprintf
(
stderr
,
"
\n
Failed to write '%s'
\n
"
,
output_filename
);
out_err:
if
(
ovblob
)
{
for
(
i
=
0
;
i
<
argc
;
i
++
)
{
if
(
ovblob
[
i
])
free
(
ovblob
[
i
]);
}
free
(
ovblob
);
}
free
(
blob
);
return
ret
;
}
int
main
(
int
argc
,
char
*
argv
[])
{
int
opt
,
i
;
char
*
input_filename
=
NULL
;
char
*
output_filename
=
NULL
;
while
((
opt
=
util_getopt_long
())
!=
EOF
)
{
switch
(
opt
)
{
case_USAGE_COMMON_FLAGS
case
'i'
:
input_filename
=
optarg
;
break
;
case
'o'
:
output_filename
=
optarg
;
break
;
case
'v'
:
verbose
=
1
;
break
;
}
}
if
(
!
input_filename
)
usage
(
"missing input file"
);
if
(
!
output_filename
)
usage
(
"missing output file"
);
argv
+=
optind
;
argc
-=
optind
;
if
(
argc
<=
0
)
usage
(
"missing overlay file(s)"
);
if
(
verbose
)
{
printf
(
"input = %s
\n
"
,
input_filename
);
printf
(
"output = %s
\n
"
,
output_filename
);
for
(
i
=
0
;
i
<
argc
;
i
++
)
printf
(
"overlay[%d] = %s
\n
"
,
i
,
argv
[
i
]);
}
if
(
do_fdtoverlay
(
input_filename
,
output_filename
,
argc
,
argv
))
return
1
;
return
0
;
}
scripts/dtc/flattree.c
View file @
eb90b4f8
...
...
@@ -149,7 +149,7 @@ static void asm_emit_align(void *e, int a)
static
void
asm_emit_data
(
void
*
e
,
struct
data
d
)
{
FILE
*
f
=
e
;
int
off
=
0
;
unsigned
int
off
=
0
;
struct
marker
*
m
=
d
.
markers
;
for_each_marker_of_type
(
m
,
LABEL
)
...
...
@@ -219,7 +219,7 @@ static struct emitter asm_emitter = {
static
int
stringtable_insert
(
struct
data
*
d
,
const
char
*
str
)
{
int
i
;
unsigned
int
i
;
/* FIXME: do this more efficiently? */
...
...
@@ -345,7 +345,7 @@ static void make_fdt_header(struct fdt_header *fdt,
void
dt_to_blob
(
FILE
*
f
,
struct
dt_info
*
dti
,
int
version
)
{
struct
version_info
*
vi
=
NULL
;
int
i
;
unsigned
int
i
;
struct
data
blob
=
empty_data
;
struct
data
reservebuf
=
empty_data
;
struct
data
dtbuf
=
empty_data
;
...
...
@@ -446,7 +446,7 @@ static void dump_stringtable_asm(FILE *f, struct data strbuf)
void
dt_to_asm
(
FILE
*
f
,
struct
dt_info
*
dti
,
int
version
)
{
struct
version_info
*
vi
=
NULL
;
int
i
;
unsigned
int
i
;
struct
data
strbuf
=
empty_data
;
struct
reserve_info
*
re
;
const
char
*
symprefix
=
"dt"
;
...
...
scripts/dtc/libfdt/fdt.c
View file @
eb90b4f8
...
...
@@ -22,6 +22,10 @@ int32_t fdt_ro_probe_(const void *fdt)
if
(
can_assume
(
VALID_DTB
))
return
totalsize
;
/* The device tree must be at an 8-byte aligned address */
if
((
uintptr_t
)
fdt
&
7
)
return
-
FDT_ERR_ALIGNMENT
;
if
(
fdt_magic
(
fdt
)
==
FDT_MAGIC
)
{
/* Complete tree */
if
(
!
can_assume
(
LATEST
))
{
...
...
scripts/dtc/libfdt/fdt_ro.c
View file @
eb90b4f8
...
...
@@ -181,8 +181,8 @@ int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size)
if
(
!
can_assume
(
VALID_INPUT
)
&&
!
re
)
return
-
FDT_ERR_BADOFFSET
;
*
address
=
fdt64_ld
(
&
re
->
address
);
*
size
=
fdt64_ld
(
&
re
->
size
);
*
address
=
fdt64_ld
_
(
&
re
->
address
);
*
size
=
fdt64_ld
_
(
&
re
->
size
);
return
0
;
}
...
...
@@ -192,7 +192,7 @@ int fdt_num_mem_rsv(const void *fdt)
const
struct
fdt_reserve_entry
*
re
;
for
(
i
=
0
;
(
re
=
fdt_mem_rsv
(
fdt
,
i
))
!=
NULL
;
i
++
)
{
if
(
fdt64_ld
(
&
re
->
size
)
==
0
)
if
(
fdt64_ld
_
(
&
re
->
size
)
==
0
)
return
i
;
}
return
-
FDT_ERR_TRUNCATED
;
...
...
@@ -370,7 +370,7 @@ static const struct fdt_property *fdt_get_property_by_offset_(const void *fdt,
prop
=
fdt_offset_ptr_
(
fdt
,
offset
);
if
(
lenp
)
*
lenp
=
fdt32_ld
(
&
prop
->
len
);
*
lenp
=
fdt32_ld
_
(
&
prop
->
len
);
return
prop
;
}
...
...
@@ -408,7 +408,7 @@ static const struct fdt_property *fdt_get_property_namelen_(const void *fdt,
offset
=
-
FDT_ERR_INTERNAL
;
break
;
}
if
(
fdt_string_eq_
(
fdt
,
fdt32_ld
(
&
prop
->
nameoff
),
if
(
fdt_string_eq_
(
fdt
,
fdt32_ld
_
(
&
prop
->
nameoff
),
name
,
namelen
))
{
if
(
poffset
)
*
poffset
=
offset
;
...
...
@@ -461,7 +461,7 @@ const void *fdt_getprop_namelen(const void *fdt, int nodeoffset,
/* Handle realignment */
if
(
!
can_assume
(
LATEST
)
&&
fdt_version
(
fdt
)
<
0x10
&&
(
poffset
+
sizeof
(
*
prop
))
%
8
&&
fdt32_ld
(
&
prop
->
len
)
>=
8
)
(
poffset
+
sizeof
(
*
prop
))
%
8
&&
fdt32_ld
_
(
&
prop
->
len
)
>=
8
)
return
prop
->
data
+
4
;
return
prop
->
data
;
}
...
...
@@ -479,7 +479,7 @@ const void *fdt_getprop_by_offset(const void *fdt, int offset,
int
namelen
;
if
(
!
can_assume
(
VALID_INPUT
))
{
name
=
fdt_get_string
(
fdt
,
fdt32_ld
(
&
prop
->
nameoff
),
name
=
fdt_get_string
(
fdt
,
fdt32_ld
_
(
&
prop
->
nameoff
),
&
namelen
);
if
(
!
name
)
{
if
(
lenp
)
...
...
@@ -488,13 +488,13 @@ const void *fdt_getprop_by_offset(const void *fdt, int offset,
}
*
namep
=
name
;
}
else
{
*
namep
=
fdt_string
(
fdt
,
fdt32_ld
(
&
prop
->
nameoff
));
*
namep
=
fdt_string
(
fdt
,
fdt32_ld
_
(
&
prop
->
nameoff
));
}
}
/* Handle realignment */
if
(
!
can_assume
(
LATEST
)
&&
fdt_version
(
fdt
)
<
0x10
&&
(
offset
+
sizeof
(
*
prop
))
%
8
&&
fdt32_ld
(
&
prop
->
len
)
>=
8
)
(
offset
+
sizeof
(
*
prop
))
%
8
&&
fdt32_ld
_
(
&
prop
->
len
)
>=
8
)
return
prop
->
data
+
4
;
return
prop
->
data
;
}
...
...
@@ -519,7 +519,7 @@ uint32_t fdt_get_phandle(const void *fdt, int nodeoffset)
return
0
;
}
return
fdt32_ld
(
php
);
return
fdt32_ld
_
(
php
);
}
const
char
*
fdt_get_alias_namelen
(
const
void
*
fdt
,
...
...
scripts/dtc/libfdt/fdt_rw.c
View file @
eb90b4f8
...
...
@@ -428,12 +428,14 @@ int fdt_open_into(const void *fdt, void *buf, int bufsize)
if
(
can_assume
(
LATEST
)
||
fdt_version
(
fdt
)
>=
17
)
{
struct_size
=
fdt_size_dt_struct
(
fdt
);
}
else
{
}
else
if
(
fdt_version
(
fdt
)
==
16
)
{
struct_size
=
0
;
while
(
fdt_next_tag
(
fdt
,
struct_size
,
&
struct_size
)
!=
FDT_END
)
;
if
(
struct_size
<
0
)
return
struct_size
;
}
else
{
return
-
FDT_ERR_BADVERSION
;
}
if
(
can_assume
(
LIBFDT_ORDER
)
||
...
...
scripts/dtc/libfdt/fdt_sw.c
View file @
eb90b4f8
...
...
@@ -377,7 +377,7 @@ int fdt_finish(void *fdt)
fdt_set_totalsize
(
fdt
,
newstroffset
+
fdt_size_dt_strings
(
fdt
));
/* And fix up fields that were keeping intermediate state. */
fdt_set_last_comp_version
(
fdt
,
FDT_
FIRST_SUPPORTED
_VERSION
);
fdt_set_last_comp_version
(
fdt
,
FDT_
LAST_COMPATIBLE
_VERSION
);
fdt_set_magic
(
fdt
,
FDT_MAGIC
);
return
0
;
...
...
scripts/dtc/libfdt/libfdt.h
View file @
eb90b4f8
This diff is collapsed.
Click to expand it.
scripts/dtc/libfdt/libfdt_internal.h
View file @
eb90b4f8
...
...
@@ -46,6 +46,25 @@ static inline struct fdt_reserve_entry *fdt_mem_rsv_w_(void *fdt, int n)
return
(
void
*
)(
uintptr_t
)
fdt_mem_rsv_
(
fdt
,
n
);
}
/*
* Internal helpers to access tructural elements of the device tree
* blob (rather than for exaple reading integers from within property
* values). We assume that we are either given a naturally aligned
* address for the platform or if we are not, we are on a platform
* where unaligned memory reads will be handled in a graceful manner.
* If not the external helpers fdtXX_ld() from libfdt.h can be used
* instead.
*/
static
inline
uint32_t
fdt32_ld_
(
const
fdt32_t
*
p
)
{
return
fdt32_to_cpu
(
*
p
);
}
static
inline
uint64_t
fdt64_ld_
(
const
fdt64_t
*
p
)
{
return
fdt64_to_cpu
(
*
p
);
}
#define FDT_SW_MAGIC (~FDT_MAGIC)
/**********************************************************************/
...
...
scripts/dtc/livetree.c
View file @
eb90b4f8
...
...
@@ -438,7 +438,7 @@ cell_t propval_cell(struct property *prop)
return
fdt32_to_cpu
(
*
((
fdt32_t
*
)
prop
->
val
.
val
));
}
cell_t
propval_cell_n
(
struct
property
*
prop
,
int
n
)
cell_t
propval_cell_n
(
struct
property
*
prop
,
unsigned
int
n
)
{
assert
(
prop
->
val
.
len
/
sizeof
(
cell_t
)
>=
n
);
return
fdt32_to_cpu
(
*
((
fdt32_t
*
)
prop
->
val
.
val
+
n
));
...
...
scripts/dtc/srcpos.c
View file @
eb90b4f8
...
...
@@ -20,7 +20,7 @@ struct search_path {
static
struct
search_path
*
search_path_head
,
**
search_path_tail
;
/* Detect infinite include recursion. */
#define MAX_SRCFILE_DEPTH (
1
00)
#define MAX_SRCFILE_DEPTH (
2
00)
static
int
srcfile_depth
;
/* = 0 */
static
char
*
get_dirname
(
const
char
*
path
)
...
...
scripts/dtc/update-dtc-source.sh
View file @
eb90b4f8
...
...
@@ -37,6 +37,7 @@ DTC_SOURCE="checks.c data.c dtc.c dtc.h flattree.c fstree.c livetree.c srcpos.c
LIBFDT_SOURCE
=
"fdt.c fdt.h fdt_addresses.c fdt_empty_tree.c
\
fdt_overlay.c fdt_ro.c fdt_rw.c fdt_strerror.c fdt_sw.c
\
fdt_wip.c libfdt.h libfdt_env.h libfdt_internal.h"
FDTOVERLAY_SOURCE
=
fdtoverlay.c
get_last_dtc_version
()
{
git log
--oneline
scripts/dtc/ |
grep
'upstream'
|
head
-1
|
sed
-e
's/^.* \(.*\)/\1/'
...
...
@@ -54,7 +55,7 @@ dtc_log=$(git log --oneline ${last_dtc_ver}..)
# Copy the files into the Linux tree
cd
$DTC_LINUX_PATH
for
f
in
$DTC_SOURCE
;
do
for
f
in
$DTC_SOURCE
$FDTOVERLAY_SOURCE
;
do
cp
${
DTC_UPSTREAM_PATH
}
/
${
f
}
${
f
}
git add
${
f
}
done
...
...
scripts/dtc/version_gen.h
View file @
eb90b4f8
#define DTC_VERSION "DTC 1.6.0-g
cbca977e
"
#define DTC_VERSION "DTC 1.6.0-g
183df9e9
"
scripts/dtc/yamltree.c
View file @
eb90b4f8
...
...
@@ -29,11 +29,11 @@ char *yaml_error_name[] = {
(emitter)->problem, __func__, __LINE__); \
})
static
void
yaml_propval_int
(
yaml_emitter_t
*
emitter
,
struct
marker
*
markers
,
char
*
data
,
int
len
,
int
width
)
static
void
yaml_propval_int
(
yaml_emitter_t
*
emitter
,
struct
marker
*
markers
,
char
*
data
,
unsigned
int
len
,
int
width
)
{
yaml_event_t
event
;
void
*
tag
;
int
off
,
start_offset
=
markers
->
offset
;
unsigned
int
off
,
start_offset
=
markers
->
offset
;
switch
(
width
)
{
case
1
:
tag
=
"!u8"
;
break
;
...
...
@@ -112,7 +112,7 @@ static void yaml_propval_string(yaml_emitter_t *emitter, char *str, int len)
static
void
yaml_propval
(
yaml_emitter_t
*
emitter
,
struct
property
*
prop
)
{
yaml_event_t
event
;
int
len
=
prop
->
val
.
len
;
unsigned
int
len
=
prop
->
val
.
len
;
struct
marker
*
m
=
prop
->
val
.
markers
;
/* Emit the property name */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment