2019-06-20 23:19:38 +02:00
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
2005-06-08 09:18:34 +02:00
|
|
|
/*
|
|
|
|
* (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
|
|
|
|
*/
|
2019-10-29 17:26:19 +01:00
|
|
|
%locations
|
|
|
|
|
2005-06-08 09:18:34 +02:00
|
|
|
%{
|
dtc: Add support for binary includes.
On Wed, Jun 04, 2008 at 09:26:23AM -0500, Jon Loeliger wrote:
> David Gibson wrote:
>
>> But as I said that can be dealt with in the future without breaking
>> compatibility. Objection withdrawn.
>>
>
> And on that note, I officially implore Scott to
> re-submit his binary include patch!
Scott's original patch does still have some implementation details I
didn't like. So in the interests of saving time, I've addressed some
of those, added a testcase, and and now resubmitting my revised
version of Scott's patch.
dtc: Add support for binary includes.
A property's data can be populated with a file's contents
as follows:
node {
prop = /incbin/("path/to/data");
};
A subset of a file can be included by passing start and size parameters.
For example, to include bytes 8 through 23:
node {
prop = /incbin/("path/to/data", 8, 16);
};
As with /include/, non-absolute paths are looked for in the directory
of the source file that includes them.
Implementation revised, and a testcase added by David Gibson
Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Acked-by: Scott Wood <scottwood@freescale.com>
2008-06-11 03:58:39 +02:00
|
|
|
#include <stdio.h>
|
2016-12-07 13:48:18 +01:00
|
|
|
#include <inttypes.h>
|
dtc: Add support for binary includes.
On Wed, Jun 04, 2008 at 09:26:23AM -0500, Jon Loeliger wrote:
> David Gibson wrote:
>
>> But as I said that can be dealt with in the future without breaking
>> compatibility. Objection withdrawn.
>>
>
> And on that note, I officially implore Scott to
> re-submit his binary include patch!
Scott's original patch does still have some implementation details I
didn't like. So in the interests of saving time, I've addressed some
of those, added a testcase, and and now resubmitting my revised
version of Scott's patch.
dtc: Add support for binary includes.
A property's data can be populated with a file's contents
as follows:
node {
prop = /incbin/("path/to/data");
};
A subset of a file can be included by passing start and size parameters.
For example, to include bytes 8 through 23:
node {
prop = /incbin/("path/to/data", 8, 16);
};
As with /include/, non-absolute paths are looked for in the directory
of the source file that includes them.
Implementation revised, and a testcase added by David Gibson
Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Acked-by: Scott Wood <scottwood@freescale.com>
2008-06-11 03:58:39 +02:00
|
|
|
|
2005-06-08 09:18:34 +02:00
|
|
|
#include "dtc.h"
|
2007-03-23 21:18:41 +01:00
|
|
|
#include "srcpos.h"
|
2005-06-08 09:18:34 +02:00
|
|
|
|
2008-03-05 01:47:54 +01:00
|
|
|
extern int yylex(void);
|
2008-09-12 20:39:49 +02:00
|
|
|
extern void yyerror(char const *s);
|
2014-01-03 13:57:39 +01:00
|
|
|
#define ERROR(loc, ...) \
|
|
|
|
do { \
|
|
|
|
srcpos_error((loc), "Error", __VA_ARGS__); \
|
|
|
|
treesource_error = true; \
|
|
|
|
} while (0)
|
2005-06-08 09:18:34 +02:00
|
|
|
|
2019-10-29 17:26:19 +01:00
|
|
|
#define YYERROR_CALL(msg) yyerror(msg)
|
|
|
|
|
2016-05-31 03:58:42 +02:00
|
|
|
extern struct dt_info *parser_output;
|
2013-10-28 11:06:53 +01:00
|
|
|
extern bool treesource_error;
|
2020-10-25 12:39:59 +01:00
|
|
|
|
|
|
|
static bool is_ref_relative(const char *ref)
|
|
|
|
{
|
|
|
|
return ref[0] != '/' && strchr(&ref[1], '/');
|
|
|
|
}
|
|
|
|
|
2005-06-08 09:18:34 +02:00
|
|
|
%}
|
|
|
|
|
|
|
|
%union {
|
2007-11-07 01:16:19 +01:00
|
|
|
char *propnodename;
|
|
|
|
char *labelref;
|
2008-06-25 05:53:07 +02:00
|
|
|
uint8_t byte;
|
2005-06-08 09:18:34 +02:00
|
|
|
struct data data;
|
2007-11-07 01:16:19 +01:00
|
|
|
|
2011-10-11 19:22:29 +02:00
|
|
|
struct {
|
|
|
|
struct data data;
|
|
|
|
int bits;
|
|
|
|
} array;
|
|
|
|
|
2005-06-08 09:18:34 +02:00
|
|
|
struct property *prop;
|
|
|
|
struct property *proplist;
|
|
|
|
struct node *node;
|
|
|
|
struct node *nodelist;
|
2005-10-24 10:18:38 +02:00
|
|
|
struct reserve_info *re;
|
2012-04-04 04:56:00 +02:00
|
|
|
uint64_t integer;
|
2016-12-07 13:48:18 +01:00
|
|
|
unsigned int flags;
|
2005-06-08 09:18:34 +02:00
|
|
|
}
|
|
|
|
|
2007-11-07 01:17:17 +01:00
|
|
|
%token DT_V1
|
2016-12-07 13:48:18 +01:00
|
|
|
%token DT_PLUGIN
|
2005-07-15 09:14:24 +02:00
|
|
|
%token DT_MEMRESERVE
|
2012-04-04 04:56:00 +02:00
|
|
|
%token DT_LSHIFT DT_RSHIFT DT_LE DT_GE DT_EQ DT_NE DT_AND DT_OR
|
2011-10-11 19:22:29 +02:00
|
|
|
%token DT_BITS
|
2012-08-08 06:50:15 +02:00
|
|
|
%token DT_DEL_PROP
|
|
|
|
%token DT_DEL_NODE
|
dtc: add ability to make nodes conditional on them being referenced
A number of platforms have a need to reduce the number of DT nodes,
mostly because of two similar constraints: the size of the DT blob, and
the time it takes to parse it.
As the DT is used in more and more SoCs, and by more projects, some
constraints start to appear in bootloaders running from SRAM with an
order of magnitude of 10kB. A typical DT is in the same order of
magnitude, so any effort to reduce the blob size is welcome in such an
environment.
Some platforms also want to reach very fast boot time, and the time it
takes to parse a typical DT starts to be noticeable.
Both of these issues can be mitigated by reducing the number of nodes in
the DT. The biggest provider of nodes is usually the pin controller and
its subnodes, usually one for each valid pin configuration in a given
SoC.
Obviously, a single, fixed, set of these nodes will be used by a given
board, so we can introduce a node property that will tell the DT
compiler to drop the nodes when they are not referenced in the tree, and
as such wouldn't be useful in the targetted system.
Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com>
Reviewed-by: Rob Herring <robh@kernel.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
2018-05-03 22:27:26 +02:00
|
|
|
%token DT_OMIT_NO_REF
|
2007-11-07 01:16:19 +01:00
|
|
|
%token <propnodename> DT_PROPNODENAME
|
2014-01-03 10:00:01 +01:00
|
|
|
%token <integer> DT_LITERAL
|
2014-01-04 00:03:55 +01:00
|
|
|
%token <integer> DT_CHAR_LITERAL
|
2005-06-08 09:18:34 +02:00
|
|
|
%token <byte> DT_BYTE
|
|
|
|
%token <data> DT_STRING
|
2007-11-07 01:16:19 +01:00
|
|
|
%token <labelref> DT_LABEL
|
2018-09-24 13:27:27 +02:00
|
|
|
%token <labelref> DT_LABEL_REF
|
|
|
|
%token <labelref> DT_PATH_REF
|
dtc: Add support for binary includes.
On Wed, Jun 04, 2008 at 09:26:23AM -0500, Jon Loeliger wrote:
> David Gibson wrote:
>
>> But as I said that can be dealt with in the future without breaking
>> compatibility. Objection withdrawn.
>>
>
> And on that note, I officially implore Scott to
> re-submit his binary include patch!
Scott's original patch does still have some implementation details I
didn't like. So in the interests of saving time, I've addressed some
of those, added a testcase, and and now resubmitting my revised
version of Scott's patch.
dtc: Add support for binary includes.
A property's data can be populated with a file's contents
as follows:
node {
prop = /incbin/("path/to/data");
};
A subset of a file can be included by passing start and size parameters.
For example, to include bytes 8 through 23:
node {
prop = /incbin/("path/to/data", 8, 16);
};
As with /include/, non-absolute paths are looked for in the directory
of the source file that includes them.
Implementation revised, and a testcase added by David Gibson
Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Acked-by: Scott Wood <scottwood@freescale.com>
2008-06-11 03:58:39 +02:00
|
|
|
%token DT_INCBIN
|
2005-06-08 09:18:34 +02:00
|
|
|
|
|
|
|
%type <data> propdata
|
2007-02-07 06:37:50 +01:00
|
|
|
%type <data> propdataprefix
|
2016-12-09 06:23:23 +01:00
|
|
|
%type <flags> header
|
|
|
|
%type <flags> headers
|
2005-07-15 09:14:24 +02:00
|
|
|
%type <re> memreserve
|
2005-10-24 10:18:38 +02:00
|
|
|
%type <re> memreserves
|
2011-10-11 19:22:29 +02:00
|
|
|
%type <array> arrayprefix
|
2005-06-08 09:18:34 +02:00
|
|
|
%type <data> bytestring
|
|
|
|
%type <prop> propdef
|
|
|
|
%type <proplist> proplist
|
2018-09-24 13:27:27 +02:00
|
|
|
%type <labelref> dt_ref
|
2005-06-08 09:18:34 +02:00
|
|
|
|
2005-07-15 09:14:24 +02:00
|
|
|
%type <node> devicetree
|
2005-06-08 09:18:34 +02:00
|
|
|
%type <node> nodedef
|
|
|
|
%type <node> subnode
|
|
|
|
%type <nodelist> subnodes
|
2005-06-16 06:36:37 +02:00
|
|
|
|
2012-04-04 04:56:00 +02:00
|
|
|
%type <integer> integer_prim
|
|
|
|
%type <integer> integer_unary
|
|
|
|
%type <integer> integer_mul
|
|
|
|
%type <integer> integer_add
|
|
|
|
%type <integer> integer_shift
|
|
|
|
%type <integer> integer_rela
|
|
|
|
%type <integer> integer_eq
|
|
|
|
%type <integer> integer_bitand
|
|
|
|
%type <integer> integer_bitxor
|
|
|
|
%type <integer> integer_bitor
|
|
|
|
%type <integer> integer_and
|
|
|
|
%type <integer> integer_or
|
|
|
|
%type <integer> integer_trinary
|
|
|
|
%type <integer> integer_expr
|
|
|
|
|
2005-06-08 09:18:34 +02:00
|
|
|
%%
|
|
|
|
|
2007-10-18 16:42:16 +02:00
|
|
|
sourcefile:
|
2016-12-09 06:23:23 +01:00
|
|
|
headers memreserves devicetree
|
2007-11-07 01:17:17 +01:00
|
|
|
{
|
2016-05-31 03:58:42 +02:00
|
|
|
parser_output = build_dt_info($1, $2, $3,
|
|
|
|
guess_boot_cpuid($3));
|
2016-12-07 13:48:18 +01:00
|
|
|
}
|
|
|
|
;
|
|
|
|
|
2016-12-09 06:23:23 +01:00
|
|
|
header:
|
|
|
|
DT_V1 ';'
|
2016-12-07 13:48:18 +01:00
|
|
|
{
|
|
|
|
$$ = DTSF_V1;
|
2007-11-07 01:17:17 +01:00
|
|
|
}
|
2016-12-09 06:23:23 +01:00
|
|
|
| DT_V1 ';' DT_PLUGIN ';'
|
2016-12-07 13:48:18 +01:00
|
|
|
{
|
2016-12-09 06:23:23 +01:00
|
|
|
$$ = DTSF_V1 | DTSF_PLUGIN;
|
2016-12-07 13:48:18 +01:00
|
|
|
}
|
2016-12-09 06:23:23 +01:00
|
|
|
;
|
|
|
|
|
|
|
|
headers:
|
|
|
|
header
|
|
|
|
| header headers
|
2016-12-07 13:48:18 +01:00
|
|
|
{
|
2016-12-09 06:23:23 +01:00
|
|
|
if ($2 != $1)
|
|
|
|
ERROR(&@2, "Header flags don't match earlier ones");
|
|
|
|
$$ = $1;
|
2016-12-07 13:48:18 +01:00
|
|
|
}
|
2014-06-02 07:23:40 +02:00
|
|
|
;
|
|
|
|
|
2007-10-18 16:42:16 +02:00
|
|
|
memreserves:
|
2007-10-23 16:28:54 +02:00
|
|
|
/* empty */
|
2007-10-18 16:42:16 +02:00
|
|
|
{
|
2007-10-23 16:28:54 +02:00
|
|
|
$$ = NULL;
|
2005-07-15 09:14:24 +02:00
|
|
|
}
|
2007-10-23 16:28:54 +02:00
|
|
|
| memreserve memreserves
|
2007-10-18 16:42:16 +02:00
|
|
|
{
|
2007-10-23 16:28:54 +02:00
|
|
|
$$ = chain_reserve_entry($1, $2);
|
2005-07-15 09:14:24 +02:00
|
|
|
}
|
|
|
|
;
|
|
|
|
|
2007-10-18 16:42:16 +02:00
|
|
|
memreserve:
|
2012-04-04 04:56:00 +02:00
|
|
|
DT_MEMRESERVE integer_prim integer_prim ';'
|
2007-10-18 16:42:16 +02:00
|
|
|
{
|
2010-02-24 08:22:17 +01:00
|
|
|
$$ = build_reserve_entry($2, $3);
|
|
|
|
}
|
|
|
|
| DT_LABEL memreserve
|
|
|
|
{
|
|
|
|
add_label(&$2->labels, $1);
|
|
|
|
$$ = $2;
|
2005-07-15 09:14:24 +02:00
|
|
|
}
|
2007-11-07 01:17:17 +01:00
|
|
|
;
|
|
|
|
|
2018-09-24 13:27:27 +02:00
|
|
|
dt_ref: DT_LABEL_REF | DT_PATH_REF;
|
|
|
|
|
2010-09-21 00:33:34 +02:00
|
|
|
devicetree:
|
|
|
|
'/' nodedef
|
2010-02-25 17:58:29 +01:00
|
|
|
{
|
2010-09-21 00:33:34 +02:00
|
|
|
$$ = name_node($2, "");
|
2010-02-25 17:58:29 +01:00
|
|
|
}
|
2010-09-21 00:33:34 +02:00
|
|
|
| devicetree '/' nodedef
|
2010-02-25 17:58:29 +01:00
|
|
|
{
|
2010-09-21 00:33:34 +02:00
|
|
|
$$ = merge_nodes($1, $3);
|
2010-02-25 17:58:29 +01:00
|
|
|
}
|
2018-09-24 13:27:27 +02:00
|
|
|
| dt_ref nodedef
|
2017-11-20 18:12:18 +01:00
|
|
|
{
|
|
|
|
/*
|
|
|
|
* We rely on the rule being always:
|
|
|
|
* versioninfo plugindecl memreserves devicetree
|
|
|
|
* so $-1 is what we want (plugindecl)
|
|
|
|
*/
|
|
|
|
if (!($<flags>-1 & DTSF_PLUGIN))
|
|
|
|
ERROR(&@2, "Label or path %s not found", $1);
|
2020-10-25 12:39:59 +01:00
|
|
|
else if (is_ref_relative($1))
|
|
|
|
ERROR(&@2, "Label-relative reference %s not supported in plugin", $1);
|
annotations: add positions
Extend the parser to record positions, in build_node,
build_node_delete, and build_property.
srcpos structures are added to the property and node types, and to the
parameter lists of the above functions that construct these types.
Nodes and properties that are created by the compiler rather than from
parsing source code have NULL as the srcpos value.
merge_nodes, defined in livetree.c, uses srcpos_extend to combine
multiple positions, resulting in a list of positions. srcpos_extend
is defined in srcpos.c. New elements are added at the end. This
requires the srcpos type, define in srcpos.h, to be a list structure
with a next field. This next field is initialized to NULL in
srcpos.h, in the macro YYLLOC_DEFAULT invoked implicitly by the
generated parser code.
Another change to srcpos.c is to make srcpos_copy always do a full
copy, including a copy of the file substructure. This is required
because when dtc is used on the output of cpp, the successive detected
file names overwrite the file name in the file structure. The next
field does not need to be deep copied, because it is always NULL when
srcpos_copy is called; an assert checks for this. File names are only
updated in uncopied position structures.
Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
2018-11-16 17:29:59 +01:00
|
|
|
$$ = add_orphan_node(
|
|
|
|
name_node(build_node(NULL, NULL, NULL),
|
|
|
|
""),
|
|
|
|
$2, $1);
|
2017-11-20 18:12:18 +01:00
|
|
|
}
|
2018-09-24 13:27:27 +02:00
|
|
|
| devicetree DT_LABEL dt_ref nodedef
|
2015-02-23 02:29:19 +01:00
|
|
|
{
|
|
|
|
struct node *target = get_node_by_ref($1, $3);
|
|
|
|
|
2020-10-25 12:39:59 +01:00
|
|
|
if (($<flags>-1 & DTSF_PLUGIN) && is_ref_relative($3))
|
|
|
|
ERROR(&@2, "Label-relative reference %s not supported in plugin", $3);
|
|
|
|
|
2017-01-30 23:06:17 +01:00
|
|
|
if (target) {
|
|
|
|
add_label(&target->labels, $2);
|
2015-02-23 02:29:19 +01:00
|
|
|
merge_nodes(target, $4);
|
2017-01-30 23:06:17 +01:00
|
|
|
} else
|
2015-02-23 02:29:19 +01:00
|
|
|
ERROR(&@3, "Label or path %s not found", $3);
|
|
|
|
$$ = $1;
|
|
|
|
}
|
2018-09-24 13:27:27 +02:00
|
|
|
| devicetree DT_PATH_REF nodedef
|
2007-10-18 16:42:16 +02:00
|
|
|
{
|
Correct overlay syntactic sugar for generating target-path fragments
We've recently added "syntactic sugar" support to generate runtime dtb
overlays using similar syntax to the compile time overlays we've had for
a while. This worked with the &label { ... } syntax, adjusting an existing
labelled node, but would fail with the &{/path} { ... } syntax attempting
to adjust an existing node referenced by its path.
The previous code would always try to use the "target" property in the
output overlay, which needs to be fixed up, and __fixups__ can only encode
symbols, not paths, so the result could never work properly.
This adds support for the &{/path} syntax for overlays, translating it into
the "target-path" encoding in the output. It also changes existing
behaviour a little because we now unconditionally one fragment for each
overlay section in the source. Previously we would only create a fragment
if we couldn't locally resolve the node referenced. We need this for
path references, because the path is supposed to be referencing something
in the (not yet known) base tree, rather than the overlay tree we are
working with now. In particular one useful case for path based overlays
is using &{/} - but the constructed overlay tree will always have a root
node, meaning that without the change that would attempt to resolve the
fragment locally, which is not what we want.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
2018-03-06 03:27:53 +01:00
|
|
|
/*
|
|
|
|
* We rely on the rule being always:
|
|
|
|
* versioninfo plugindecl memreserves devicetree
|
|
|
|
* so $-1 is what we want (plugindecl)
|
|
|
|
*/
|
|
|
|
if ($<flags>-1 & DTSF_PLUGIN) {
|
2020-10-25 12:39:59 +01:00
|
|
|
if (is_ref_relative($2))
|
|
|
|
ERROR(&@2, "Label-relative reference %s not supported in plugin", $2);
|
Correct overlay syntactic sugar for generating target-path fragments
We've recently added "syntactic sugar" support to generate runtime dtb
overlays using similar syntax to the compile time overlays we've had for
a while. This worked with the &label { ... } syntax, adjusting an existing
labelled node, but would fail with the &{/path} { ... } syntax attempting
to adjust an existing node referenced by its path.
The previous code would always try to use the "target" property in the
output overlay, which needs to be fixed up, and __fixups__ can only encode
symbols, not paths, so the result could never work properly.
This adds support for the &{/path} syntax for overlays, translating it into
the "target-path" encoding in the output. It also changes existing
behaviour a little because we now unconditionally one fragment for each
overlay section in the source. Previously we would only create a fragment
if we couldn't locally resolve the node referenced. We need this for
path references, because the path is supposed to be referencing something
in the (not yet known) base tree, rather than the overlay tree we are
working with now. In particular one useful case for path based overlays
is using &{/} - but the constructed overlay tree will always have a root
node, meaning that without the change that would attempt to resolve the
fragment locally, which is not what we want.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
2018-03-06 03:27:53 +01:00
|
|
|
add_orphan_node($1, $3, $2);
|
2017-06-14 16:53:05 +02:00
|
|
|
} else {
|
Correct overlay syntactic sugar for generating target-path fragments
We've recently added "syntactic sugar" support to generate runtime dtb
overlays using similar syntax to the compile time overlays we've had for
a while. This worked with the &label { ... } syntax, adjusting an existing
labelled node, but would fail with the &{/path} { ... } syntax attempting
to adjust an existing node referenced by its path.
The previous code would always try to use the "target" property in the
output overlay, which needs to be fixed up, and __fixups__ can only encode
symbols, not paths, so the result could never work properly.
This adds support for the &{/path} syntax for overlays, translating it into
the "target-path" encoding in the output. It also changes existing
behaviour a little because we now unconditionally one fragment for each
overlay section in the source. Previously we would only create a fragment
if we couldn't locally resolve the node referenced. We need this for
path references, because the path is supposed to be referencing something
in the (not yet known) base tree, rather than the overlay tree we are
working with now. In particular one useful case for path based overlays
is using &{/} - but the constructed overlay tree will always have a root
node, meaning that without the change that would attempt to resolve the
fragment locally, which is not what we want.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
2018-03-06 03:27:53 +01:00
|
|
|
struct node *target = get_node_by_ref($1, $2);
|
|
|
|
|
|
|
|
if (target)
|
|
|
|
merge_nodes(target, $3);
|
2017-06-14 16:53:05 +02:00
|
|
|
else
|
|
|
|
ERROR(&@2, "Label or path %s not found", $2);
|
|
|
|
}
|
2010-09-21 00:33:34 +02:00
|
|
|
$$ = $1;
|
2005-07-15 09:14:24 +02:00
|
|
|
}
|
2018-09-24 13:27:27 +02:00
|
|
|
| devicetree DT_LABEL_REF nodedef
|
2007-10-18 16:42:16 +02:00
|
|
|
{
|
2010-11-02 23:55:04 +01:00
|
|
|
struct node *target = get_node_by_ref($1, $2);
|
2010-09-21 00:33:34 +02:00
|
|
|
|
2016-12-07 05:48:22 +01:00
|
|
|
if (target) {
|
2010-09-21 00:33:34 +02:00
|
|
|
merge_nodes(target, $3);
|
2016-12-07 05:48:22 +01:00
|
|
|
} else {
|
|
|
|
/*
|
|
|
|
* We rely on the rule being always:
|
|
|
|
* versioninfo plugindecl memreserves devicetree
|
|
|
|
* so $-1 is what we want (plugindecl)
|
|
|
|
*/
|
|
|
|
if ($<flags>-1 & DTSF_PLUGIN)
|
|
|
|
add_orphan_node($1, $3, $2);
|
|
|
|
else
|
|
|
|
ERROR(&@2, "Label or path %s not found", $2);
|
|
|
|
}
|
2010-09-21 00:33:34 +02:00
|
|
|
$$ = $1;
|
2005-07-15 09:14:24 +02:00
|
|
|
}
|
2018-09-24 13:27:27 +02:00
|
|
|
| devicetree DT_DEL_NODE dt_ref ';'
|
2012-08-08 06:50:15 +02:00
|
|
|
{
|
|
|
|
struct node *target = get_node_by_ref($1, $3);
|
|
|
|
|
2014-01-03 13:57:39 +01:00
|
|
|
if (target)
|
2012-08-08 06:50:15 +02:00
|
|
|
delete_node(target);
|
2014-01-03 13:57:39 +01:00
|
|
|
else
|
|
|
|
ERROR(&@3, "Label or path %s not found", $3);
|
|
|
|
|
2012-08-08 06:50:15 +02:00
|
|
|
|
dtc: add ability to make nodes conditional on them being referenced
A number of platforms have a need to reduce the number of DT nodes,
mostly because of two similar constraints: the size of the DT blob, and
the time it takes to parse it.
As the DT is used in more and more SoCs, and by more projects, some
constraints start to appear in bootloaders running from SRAM with an
order of magnitude of 10kB. A typical DT is in the same order of
magnitude, so any effort to reduce the blob size is welcome in such an
environment.
Some platforms also want to reach very fast boot time, and the time it
takes to parse a typical DT starts to be noticeable.
Both of these issues can be mitigated by reducing the number of nodes in
the DT. The biggest provider of nodes is usually the pin controller and
its subnodes, usually one for each valid pin configuration in a given
SoC.
Obviously, a single, fixed, set of these nodes will be used by a given
board, so we can introduce a node property that will tell the DT
compiler to drop the nodes when they are not referenced in the tree, and
as such wouldn't be useful in the targetted system.
Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com>
Reviewed-by: Rob Herring <robh@kernel.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
2018-05-03 22:27:26 +02:00
|
|
|
$$ = $1;
|
|
|
|
}
|
2018-09-24 13:27:27 +02:00
|
|
|
| devicetree DT_OMIT_NO_REF dt_ref ';'
|
dtc: add ability to make nodes conditional on them being referenced
A number of platforms have a need to reduce the number of DT nodes,
mostly because of two similar constraints: the size of the DT blob, and
the time it takes to parse it.
As the DT is used in more and more SoCs, and by more projects, some
constraints start to appear in bootloaders running from SRAM with an
order of magnitude of 10kB. A typical DT is in the same order of
magnitude, so any effort to reduce the blob size is welcome in such an
environment.
Some platforms also want to reach very fast boot time, and the time it
takes to parse a typical DT starts to be noticeable.
Both of these issues can be mitigated by reducing the number of nodes in
the DT. The biggest provider of nodes is usually the pin controller and
its subnodes, usually one for each valid pin configuration in a given
SoC.
Obviously, a single, fixed, set of these nodes will be used by a given
board, so we can introduce a node property that will tell the DT
compiler to drop the nodes when they are not referenced in the tree, and
as such wouldn't be useful in the targetted system.
Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com>
Reviewed-by: Rob Herring <robh@kernel.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
2018-05-03 22:27:26 +02:00
|
|
|
{
|
|
|
|
struct node *target = get_node_by_ref($1, $3);
|
|
|
|
|
|
|
|
if (target)
|
|
|
|
omit_node_if_unused(target);
|
|
|
|
else
|
|
|
|
ERROR(&@3, "Label or path %s not found", $3);
|
|
|
|
|
|
|
|
|
2012-08-08 06:50:15 +02:00
|
|
|
$$ = $1;
|
|
|
|
}
|
2016-12-07 05:48:22 +01:00
|
|
|
| /* empty */
|
|
|
|
{
|
|
|
|
/* build empty node */
|
2020-07-09 02:22:37 +02:00
|
|
|
$$ = name_node(build_node(NULL, NULL, NULL), "");
|
2016-12-07 05:48:22 +01:00
|
|
|
}
|
2005-06-08 09:18:34 +02:00
|
|
|
;
|
|
|
|
|
2007-10-18 16:42:16 +02:00
|
|
|
nodedef:
|
|
|
|
'{' proplist subnodes '}' ';'
|
|
|
|
{
|
annotations: add positions
Extend the parser to record positions, in build_node,
build_node_delete, and build_property.
srcpos structures are added to the property and node types, and to the
parameter lists of the above functions that construct these types.
Nodes and properties that are created by the compiler rather than from
parsing source code have NULL as the srcpos value.
merge_nodes, defined in livetree.c, uses srcpos_extend to combine
multiple positions, resulting in a list of positions. srcpos_extend
is defined in srcpos.c. New elements are added at the end. This
requires the srcpos type, define in srcpos.h, to be a list structure
with a next field. This next field is initialized to NULL in
srcpos.h, in the macro YYLLOC_DEFAULT invoked implicitly by the
generated parser code.
Another change to srcpos.c is to make srcpos_copy always do a full
copy, including a copy of the file substructure. This is required
because when dtc is used on the output of cpp, the successive detected
file names overwrite the file name in the file structure. The next
field does not need to be deep copied, because it is always NULL when
srcpos_copy is called; an assert checks for this. File names are only
updated in uncopied position structures.
Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
2018-11-16 17:29:59 +01:00
|
|
|
$$ = build_node($2, $3, &@$);
|
2005-06-08 09:18:34 +02:00
|
|
|
}
|
|
|
|
;
|
|
|
|
|
2007-10-18 16:42:16 +02:00
|
|
|
proplist:
|
2007-10-23 16:28:54 +02:00
|
|
|
/* empty */
|
2007-10-18 16:42:16 +02:00
|
|
|
{
|
2007-10-23 16:28:54 +02:00
|
|
|
$$ = NULL;
|
2005-06-08 09:18:34 +02:00
|
|
|
}
|
2007-10-22 23:09:56 +02:00
|
|
|
| proplist propdef
|
2007-10-18 16:42:16 +02:00
|
|
|
{
|
2007-10-22 23:09:56 +02:00
|
|
|
$$ = chain_property($2, $1);
|
2005-06-08 09:18:34 +02:00
|
|
|
}
|
|
|
|
;
|
|
|
|
|
2007-10-18 16:42:16 +02:00
|
|
|
propdef:
|
2010-02-24 08:22:17 +01:00
|
|
|
DT_PROPNODENAME '=' propdata ';'
|
|
|
|
{
|
annotations: add positions
Extend the parser to record positions, in build_node,
build_node_delete, and build_property.
srcpos structures are added to the property and node types, and to the
parameter lists of the above functions that construct these types.
Nodes and properties that are created by the compiler rather than from
parsing source code have NULL as the srcpos value.
merge_nodes, defined in livetree.c, uses srcpos_extend to combine
multiple positions, resulting in a list of positions. srcpos_extend
is defined in srcpos.c. New elements are added at the end. This
requires the srcpos type, define in srcpos.h, to be a list structure
with a next field. This next field is initialized to NULL in
srcpos.h, in the macro YYLLOC_DEFAULT invoked implicitly by the
generated parser code.
Another change to srcpos.c is to make srcpos_copy always do a full
copy, including a copy of the file substructure. This is required
because when dtc is used on the output of cpp, the successive detected
file names overwrite the file name in the file structure. The next
field does not need to be deep copied, because it is always NULL when
srcpos_copy is called; an assert checks for this. File names are only
updated in uncopied position structures.
Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
2018-11-16 17:29:59 +01:00
|
|
|
$$ = build_property($1, $3, &@$);
|
2010-02-24 08:22:17 +01:00
|
|
|
}
|
|
|
|
| DT_PROPNODENAME ';'
|
2007-10-18 16:42:16 +02:00
|
|
|
{
|
annotations: add positions
Extend the parser to record positions, in build_node,
build_node_delete, and build_property.
srcpos structures are added to the property and node types, and to the
parameter lists of the above functions that construct these types.
Nodes and properties that are created by the compiler rather than from
parsing source code have NULL as the srcpos value.
merge_nodes, defined in livetree.c, uses srcpos_extend to combine
multiple positions, resulting in a list of positions. srcpos_extend
is defined in srcpos.c. New elements are added at the end. This
requires the srcpos type, define in srcpos.h, to be a list structure
with a next field. This next field is initialized to NULL in
srcpos.h, in the macro YYLLOC_DEFAULT invoked implicitly by the
generated parser code.
Another change to srcpos.c is to make srcpos_copy always do a full
copy, including a copy of the file substructure. This is required
because when dtc is used on the output of cpp, the successive detected
file names overwrite the file name in the file structure. The next
field does not need to be deep copied, because it is always NULL when
srcpos_copy is called; an assert checks for this. File names are only
updated in uncopied position structures.
Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
2018-11-16 17:29:59 +01:00
|
|
|
$$ = build_property($1, empty_data, &@$);
|
2005-06-08 09:18:34 +02:00
|
|
|
}
|
2012-08-08 06:50:15 +02:00
|
|
|
| DT_DEL_PROP DT_PROPNODENAME ';'
|
|
|
|
{
|
|
|
|
$$ = build_property_delete($2);
|
|
|
|
}
|
2010-02-24 08:22:17 +01:00
|
|
|
| DT_LABEL propdef
|
2007-10-18 16:42:16 +02:00
|
|
|
{
|
2010-02-24 08:22:17 +01:00
|
|
|
add_label(&$2->labels, $1);
|
|
|
|
$$ = $2;
|
2005-06-08 09:18:34 +02:00
|
|
|
}
|
|
|
|
;
|
|
|
|
|
2007-10-18 16:42:16 +02:00
|
|
|
propdata:
|
|
|
|
propdataprefix DT_STRING
|
|
|
|
{
|
|
|
|
$$ = data_merge($1, $2);
|
|
|
|
}
|
2011-10-11 19:22:29 +02:00
|
|
|
| propdataprefix arrayprefix '>'
|
2007-10-18 16:42:16 +02:00
|
|
|
{
|
2011-10-11 19:22:29 +02:00
|
|
|
$$ = data_merge($1, $2.data);
|
2007-10-18 16:42:16 +02:00
|
|
|
}
|
|
|
|
| propdataprefix '[' bytestring ']'
|
|
|
|
{
|
|
|
|
$$ = data_merge($1, $3);
|
|
|
|
}
|
2018-09-24 13:27:27 +02:00
|
|
|
| propdataprefix dt_ref
|
2007-12-05 00:43:50 +01:00
|
|
|
{
|
2018-07-31 05:57:35 +02:00
|
|
|
$1 = data_add_marker($1, TYPE_STRING, $2);
|
2007-12-05 00:43:50 +01:00
|
|
|
$$ = data_add_marker($1, REF_PATH, $2);
|
|
|
|
}
|
2012-04-04 04:56:00 +02:00
|
|
|
| propdataprefix DT_INCBIN '(' DT_STRING ',' integer_prim ',' integer_prim ')'
|
dtc: Add support for binary includes.
On Wed, Jun 04, 2008 at 09:26:23AM -0500, Jon Loeliger wrote:
> David Gibson wrote:
>
>> But as I said that can be dealt with in the future without breaking
>> compatibility. Objection withdrawn.
>>
>
> And on that note, I officially implore Scott to
> re-submit his binary include patch!
Scott's original patch does still have some implementation details I
didn't like. So in the interests of saving time, I've addressed some
of those, added a testcase, and and now resubmitting my revised
version of Scott's patch.
dtc: Add support for binary includes.
A property's data can be populated with a file's contents
as follows:
node {
prop = /incbin/("path/to/data");
};
A subset of a file can be included by passing start and size parameters.
For example, to include bytes 8 through 23:
node {
prop = /incbin/("path/to/data", 8, 16);
};
As with /include/, non-absolute paths are looked for in the directory
of the source file that includes them.
Implementation revised, and a testcase added by David Gibson
Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Acked-by: Scott Wood <scottwood@freescale.com>
2008-06-11 03:58:39 +02:00
|
|
|
{
|
2009-12-08 04:24:42 +01:00
|
|
|
FILE *f = srcfile_relative_open($4.val, NULL);
|
|
|
|
struct data d;
|
dtc: Add support for binary includes.
On Wed, Jun 04, 2008 at 09:26:23AM -0500, Jon Loeliger wrote:
> David Gibson wrote:
>
>> But as I said that can be dealt with in the future without breaking
>> compatibility. Objection withdrawn.
>>
>
> And on that note, I officially implore Scott to
> re-submit his binary include patch!
Scott's original patch does still have some implementation details I
didn't like. So in the interests of saving time, I've addressed some
of those, added a testcase, and and now resubmitting my revised
version of Scott's patch.
dtc: Add support for binary includes.
A property's data can be populated with a file's contents
as follows:
node {
prop = /incbin/("path/to/data");
};
A subset of a file can be included by passing start and size parameters.
For example, to include bytes 8 through 23:
node {
prop = /incbin/("path/to/data", 8, 16);
};
As with /include/, non-absolute paths are looked for in the directory
of the source file that includes them.
Implementation revised, and a testcase added by David Gibson
Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Acked-by: Scott Wood <scottwood@freescale.com>
2008-06-11 03:58:39 +02:00
|
|
|
|
|
|
|
if ($6 != 0)
|
2009-12-08 04:24:42 +01:00
|
|
|
if (fseek(f, $6, SEEK_SET) != 0)
|
2014-01-04 00:04:19 +01:00
|
|
|
die("Couldn't seek to offset %llu in \"%s\": %s",
|
|
|
|
(unsigned long long)$6, $4.val,
|
|
|
|
strerror(errno));
|
dtc: Add support for binary includes.
On Wed, Jun 04, 2008 at 09:26:23AM -0500, Jon Loeliger wrote:
> David Gibson wrote:
>
>> But as I said that can be dealt with in the future without breaking
>> compatibility. Objection withdrawn.
>>
>
> And on that note, I officially implore Scott to
> re-submit his binary include patch!
Scott's original patch does still have some implementation details I
didn't like. So in the interests of saving time, I've addressed some
of those, added a testcase, and and now resubmitting my revised
version of Scott's patch.
dtc: Add support for binary includes.
A property's data can be populated with a file's contents
as follows:
node {
prop = /incbin/("path/to/data");
};
A subset of a file can be included by passing start and size parameters.
For example, to include bytes 8 through 23:
node {
prop = /incbin/("path/to/data", 8, 16);
};
As with /include/, non-absolute paths are looked for in the directory
of the source file that includes them.
Implementation revised, and a testcase added by David Gibson
Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Acked-by: Scott Wood <scottwood@freescale.com>
2008-06-11 03:58:39 +02:00
|
|
|
|
2009-12-08 04:24:42 +01:00
|
|
|
d = data_copy_file(f, $8);
|
dtc: Add support for binary includes.
On Wed, Jun 04, 2008 at 09:26:23AM -0500, Jon Loeliger wrote:
> David Gibson wrote:
>
>> But as I said that can be dealt with in the future without breaking
>> compatibility. Objection withdrawn.
>>
>
> And on that note, I officially implore Scott to
> re-submit his binary include patch!
Scott's original patch does still have some implementation details I
didn't like. So in the interests of saving time, I've addressed some
of those, added a testcase, and and now resubmitting my revised
version of Scott's patch.
dtc: Add support for binary includes.
A property's data can be populated with a file's contents
as follows:
node {
prop = /incbin/("path/to/data");
};
A subset of a file can be included by passing start and size parameters.
For example, to include bytes 8 through 23:
node {
prop = /incbin/("path/to/data", 8, 16);
};
As with /include/, non-absolute paths are looked for in the directory
of the source file that includes them.
Implementation revised, and a testcase added by David Gibson
Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Acked-by: Scott Wood <scottwood@freescale.com>
2008-06-11 03:58:39 +02:00
|
|
|
|
|
|
|
$$ = data_merge($1, d);
|
2009-12-08 04:24:42 +01:00
|
|
|
fclose(f);
|
dtc: Add support for binary includes.
On Wed, Jun 04, 2008 at 09:26:23AM -0500, Jon Loeliger wrote:
> David Gibson wrote:
>
>> But as I said that can be dealt with in the future without breaking
>> compatibility. Objection withdrawn.
>>
>
> And on that note, I officially implore Scott to
> re-submit his binary include patch!
Scott's original patch does still have some implementation details I
didn't like. So in the interests of saving time, I've addressed some
of those, added a testcase, and and now resubmitting my revised
version of Scott's patch.
dtc: Add support for binary includes.
A property's data can be populated with a file's contents
as follows:
node {
prop = /incbin/("path/to/data");
};
A subset of a file can be included by passing start and size parameters.
For example, to include bytes 8 through 23:
node {
prop = /incbin/("path/to/data", 8, 16);
};
As with /include/, non-absolute paths are looked for in the directory
of the source file that includes them.
Implementation revised, and a testcase added by David Gibson
Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Acked-by: Scott Wood <scottwood@freescale.com>
2008-06-11 03:58:39 +02:00
|
|
|
}
|
|
|
|
| propdataprefix DT_INCBIN '(' DT_STRING ')'
|
|
|
|
{
|
2009-12-08 04:24:42 +01:00
|
|
|
FILE *f = srcfile_relative_open($4.val, NULL);
|
dtc: Add support for binary includes.
On Wed, Jun 04, 2008 at 09:26:23AM -0500, Jon Loeliger wrote:
> David Gibson wrote:
>
>> But as I said that can be dealt with in the future without breaking
>> compatibility. Objection withdrawn.
>>
>
> And on that note, I officially implore Scott to
> re-submit his binary include patch!
Scott's original patch does still have some implementation details I
didn't like. So in the interests of saving time, I've addressed some
of those, added a testcase, and and now resubmitting my revised
version of Scott's patch.
dtc: Add support for binary includes.
A property's data can be populated with a file's contents
as follows:
node {
prop = /incbin/("path/to/data");
};
A subset of a file can be included by passing start and size parameters.
For example, to include bytes 8 through 23:
node {
prop = /incbin/("path/to/data", 8, 16);
};
As with /include/, non-absolute paths are looked for in the directory
of the source file that includes them.
Implementation revised, and a testcase added by David Gibson
Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Acked-by: Scott Wood <scottwood@freescale.com>
2008-06-11 03:58:39 +02:00
|
|
|
struct data d = empty_data;
|
|
|
|
|
2009-12-08 04:24:42 +01:00
|
|
|
d = data_copy_file(f, -1);
|
dtc: Add support for binary includes.
On Wed, Jun 04, 2008 at 09:26:23AM -0500, Jon Loeliger wrote:
> David Gibson wrote:
>
>> But as I said that can be dealt with in the future without breaking
>> compatibility. Objection withdrawn.
>>
>
> And on that note, I officially implore Scott to
> re-submit his binary include patch!
Scott's original patch does still have some implementation details I
didn't like. So in the interests of saving time, I've addressed some
of those, added a testcase, and and now resubmitting my revised
version of Scott's patch.
dtc: Add support for binary includes.
A property's data can be populated with a file's contents
as follows:
node {
prop = /incbin/("path/to/data");
};
A subset of a file can be included by passing start and size parameters.
For example, to include bytes 8 through 23:
node {
prop = /incbin/("path/to/data", 8, 16);
};
As with /include/, non-absolute paths are looked for in the directory
of the source file that includes them.
Implementation revised, and a testcase added by David Gibson
Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Acked-by: Scott Wood <scottwood@freescale.com>
2008-06-11 03:58:39 +02:00
|
|
|
|
|
|
|
$$ = data_merge($1, d);
|
2009-12-08 04:24:42 +01:00
|
|
|
fclose(f);
|
dtc: Add support for binary includes.
On Wed, Jun 04, 2008 at 09:26:23AM -0500, Jon Loeliger wrote:
> David Gibson wrote:
>
>> But as I said that can be dealt with in the future without breaking
>> compatibility. Objection withdrawn.
>>
>
> And on that note, I officially implore Scott to
> re-submit his binary include patch!
Scott's original patch does still have some implementation details I
didn't like. So in the interests of saving time, I've addressed some
of those, added a testcase, and and now resubmitting my revised
version of Scott's patch.
dtc: Add support for binary includes.
A property's data can be populated with a file's contents
as follows:
node {
prop = /incbin/("path/to/data");
};
A subset of a file can be included by passing start and size parameters.
For example, to include bytes 8 through 23:
node {
prop = /incbin/("path/to/data", 8, 16);
};
As with /include/, non-absolute paths are looked for in the directory
of the source file that includes them.
Implementation revised, and a testcase added by David Gibson
Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Acked-by: Scott Wood <scottwood@freescale.com>
2008-06-11 03:58:39 +02:00
|
|
|
}
|
2007-10-18 16:42:16 +02:00
|
|
|
| propdata DT_LABEL
|
|
|
|
{
|
2007-11-22 04:39:23 +01:00
|
|
|
$$ = data_add_marker($1, LABEL, $2);
|
2007-02-07 06:37:50 +01:00
|
|
|
}
|
|
|
|
;
|
|
|
|
|
2007-10-18 16:42:16 +02:00
|
|
|
propdataprefix:
|
2007-10-23 16:28:54 +02:00
|
|
|
/* empty */
|
|
|
|
{
|
|
|
|
$$ = empty_data;
|
|
|
|
}
|
|
|
|
| propdata ','
|
2007-10-18 16:42:16 +02:00
|
|
|
{
|
|
|
|
$$ = $1;
|
|
|
|
}
|
|
|
|
| propdataprefix DT_LABEL
|
|
|
|
{
|
2007-11-22 04:39:23 +01:00
|
|
|
$$ = data_add_marker($1, LABEL, $2);
|
2007-10-18 16:42:16 +02:00
|
|
|
}
|
2005-06-08 09:18:34 +02:00
|
|
|
;
|
|
|
|
|
2011-10-11 19:22:29 +02:00
|
|
|
arrayprefix:
|
|
|
|
DT_BITS DT_LITERAL '<'
|
2007-10-23 16:28:54 +02:00
|
|
|
{
|
2014-01-03 10:00:01 +01:00
|
|
|
unsigned long long bits;
|
2018-05-16 00:42:54 +02:00
|
|
|
enum markertype type = TYPE_UINT32;
|
2014-01-03 10:00:01 +01:00
|
|
|
|
|
|
|
bits = $2;
|
2011-10-11 19:22:29 +02:00
|
|
|
|
2018-05-16 00:42:54 +02:00
|
|
|
switch (bits) {
|
|
|
|
case 8: type = TYPE_UINT8; break;
|
|
|
|
case 16: type = TYPE_UINT16; break;
|
|
|
|
case 32: type = TYPE_UINT32; break;
|
|
|
|
case 64: type = TYPE_UINT64; break;
|
|
|
|
default:
|
2014-01-03 13:57:39 +01:00
|
|
|
ERROR(&@2, "Array elements must be"
|
|
|
|
" 8, 16, 32 or 64-bits");
|
2014-01-03 10:00:01 +01:00
|
|
|
bits = 32;
|
2011-10-11 19:22:29 +02:00
|
|
|
}
|
2014-01-03 10:00:01 +01:00
|
|
|
|
2018-05-16 00:42:54 +02:00
|
|
|
$$.data = data_add_marker(empty_data, type, NULL);
|
2014-01-03 10:00:01 +01:00
|
|
|
$$.bits = bits;
|
2007-10-23 16:28:54 +02:00
|
|
|
}
|
2011-10-11 19:22:29 +02:00
|
|
|
| '<'
|
2007-10-18 16:42:16 +02:00
|
|
|
{
|
2018-05-16 00:42:54 +02:00
|
|
|
$$.data = data_add_marker(empty_data, TYPE_UINT32, NULL);
|
2011-10-11 19:22:29 +02:00
|
|
|
$$.bits = 32;
|
2007-02-15 17:59:27 +01:00
|
|
|
}
|
2012-04-04 04:56:00 +02:00
|
|
|
| arrayprefix integer_prim
|
|
|
|
{
|
|
|
|
if ($1.bits < 64) {
|
|
|
|
uint64_t mask = (1ULL << $1.bits) - 1;
|
|
|
|
/*
|
|
|
|
* Bits above mask must either be all zero
|
|
|
|
* (positive within range of mask) or all one
|
|
|
|
* (negative and sign-extended). The second
|
|
|
|
* condition is true if when we set all bits
|
|
|
|
* within the mask to one (i.e. | in the
|
|
|
|
* mask), all bits are one.
|
|
|
|
*/
|
|
|
|
if (($2 > mask) && (($2 | mask) != -1ULL))
|
2014-01-03 13:57:39 +01:00
|
|
|
ERROR(&@2, "Value out of range for"
|
|
|
|
" %d-bit array element", $1.bits);
|
2012-04-04 04:56:00 +02:00
|
|
|
}
|
2005-06-08 09:18:34 +02:00
|
|
|
|
2012-04-04 04:56:00 +02:00
|
|
|
$$.data = data_append_integer($1.data, $2, $1.bits);
|
2011-10-11 19:22:29 +02:00
|
|
|
}
|
2018-09-24 13:27:27 +02:00
|
|
|
| arrayprefix dt_ref
|
2007-11-07 01:17:17 +01:00
|
|
|
{
|
2011-10-11 19:22:29 +02:00
|
|
|
uint64_t val = ~0ULL >> (64 - $1.bits);
|
|
|
|
|
|
|
|
if ($1.bits == 32)
|
|
|
|
$1.data = data_add_marker($1.data,
|
|
|
|
REF_PHANDLE,
|
|
|
|
$2);
|
|
|
|
else
|
2014-01-03 13:57:39 +01:00
|
|
|
ERROR(&@2, "References are only allowed in "
|
2011-10-11 19:22:29 +02:00
|
|
|
"arrays with 32-bit elements.");
|
|
|
|
|
|
|
|
$$.data = data_append_integer($1.data, val, $1.bits);
|
2007-11-07 01:17:17 +01:00
|
|
|
}
|
2011-10-11 19:22:29 +02:00
|
|
|
| arrayprefix DT_LABEL
|
2011-09-09 21:16:30 +02:00
|
|
|
{
|
2011-10-11 19:22:29 +02:00
|
|
|
$$.data = data_add_marker($1.data, LABEL, $2);
|
2011-09-09 21:16:30 +02:00
|
|
|
}
|
2007-11-07 01:16:19 +01:00
|
|
|
;
|
|
|
|
|
2012-04-04 04:56:00 +02:00
|
|
|
integer_prim:
|
|
|
|
DT_LITERAL
|
|
|
|
| DT_CHAR_LITERAL
|
|
|
|
| '(' integer_expr ')'
|
|
|
|
{
|
|
|
|
$$ = $2;
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
|
|
|
integer_expr:
|
|
|
|
integer_trinary
|
|
|
|
;
|
|
|
|
|
|
|
|
integer_trinary:
|
|
|
|
integer_or
|
|
|
|
| integer_or '?' integer_expr ':' integer_trinary { $$ = $1 ? $3 : $5; }
|
|
|
|
;
|
|
|
|
|
|
|
|
integer_or:
|
|
|
|
integer_and
|
|
|
|
| integer_or DT_OR integer_and { $$ = $1 || $3; }
|
|
|
|
;
|
|
|
|
|
|
|
|
integer_and:
|
|
|
|
integer_bitor
|
|
|
|
| integer_and DT_AND integer_bitor { $$ = $1 && $3; }
|
|
|
|
;
|
|
|
|
|
|
|
|
integer_bitor:
|
|
|
|
integer_bitxor
|
|
|
|
| integer_bitor '|' integer_bitxor { $$ = $1 | $3; }
|
|
|
|
;
|
|
|
|
|
|
|
|
integer_bitxor:
|
|
|
|
integer_bitand
|
|
|
|
| integer_bitxor '^' integer_bitand { $$ = $1 ^ $3; }
|
|
|
|
;
|
|
|
|
|
|
|
|
integer_bitand:
|
|
|
|
integer_eq
|
|
|
|
| integer_bitand '&' integer_eq { $$ = $1 & $3; }
|
|
|
|
;
|
|
|
|
|
|
|
|
integer_eq:
|
|
|
|
integer_rela
|
|
|
|
| integer_eq DT_EQ integer_rela { $$ = $1 == $3; }
|
|
|
|
| integer_eq DT_NE integer_rela { $$ = $1 != $3; }
|
|
|
|
;
|
|
|
|
|
|
|
|
integer_rela:
|
|
|
|
integer_shift
|
|
|
|
| integer_rela '<' integer_shift { $$ = $1 < $3; }
|
|
|
|
| integer_rela '>' integer_shift { $$ = $1 > $3; }
|
|
|
|
| integer_rela DT_LE integer_shift { $$ = $1 <= $3; }
|
|
|
|
| integer_rela DT_GE integer_shift { $$ = $1 >= $3; }
|
|
|
|
;
|
|
|
|
|
|
|
|
integer_shift:
|
2020-07-14 17:45:37 +02:00
|
|
|
integer_shift DT_LSHIFT integer_add { $$ = ($3 < 64) ? ($1 << $3) : 0; }
|
|
|
|
| integer_shift DT_RSHIFT integer_add { $$ = ($3 < 64) ? ($1 >> $3) : 0; }
|
2012-04-04 04:56:00 +02:00
|
|
|
| integer_add
|
|
|
|
;
|
|
|
|
|
|
|
|
integer_add:
|
|
|
|
integer_add '+' integer_mul { $$ = $1 + $3; }
|
|
|
|
| integer_add '-' integer_mul { $$ = $1 - $3; }
|
|
|
|
| integer_mul
|
|
|
|
;
|
|
|
|
|
|
|
|
integer_mul:
|
|
|
|
integer_mul '*' integer_unary { $$ = $1 * $3; }
|
2016-01-03 12:27:32 +01:00
|
|
|
| integer_mul '/' integer_unary
|
|
|
|
{
|
|
|
|
if ($3 != 0) {
|
|
|
|
$$ = $1 / $3;
|
|
|
|
} else {
|
|
|
|
ERROR(&@$, "Division by zero");
|
|
|
|
$$ = 0;
|
|
|
|
}
|
|
|
|
}
|
2016-01-12 09:27:25 +01:00
|
|
|
| integer_mul '%' integer_unary
|
|
|
|
{
|
|
|
|
if ($3 != 0) {
|
|
|
|
$$ = $1 % $3;
|
|
|
|
} else {
|
|
|
|
ERROR(&@$, "Division by zero");
|
|
|
|
$$ = 0;
|
|
|
|
}
|
|
|
|
}
|
2012-04-04 04:56:00 +02:00
|
|
|
| integer_unary
|
|
|
|
;
|
|
|
|
|
|
|
|
integer_unary:
|
|
|
|
integer_prim
|
|
|
|
| '-' integer_unary { $$ = -$2; }
|
|
|
|
| '~' integer_unary { $$ = ~$2; }
|
|
|
|
| '!' integer_unary { $$ = !$2; }
|
|
|
|
;
|
|
|
|
|
2007-10-18 16:42:16 +02:00
|
|
|
bytestring:
|
2007-10-23 16:28:54 +02:00
|
|
|
/* empty */
|
|
|
|
{
|
2018-05-16 00:42:54 +02:00
|
|
|
$$ = data_add_marker(empty_data, TYPE_UINT8, NULL);
|
2007-10-23 16:28:54 +02:00
|
|
|
}
|
|
|
|
| bytestring DT_BYTE
|
2007-10-18 16:42:16 +02:00
|
|
|
{
|
|
|
|
$$ = data_append_byte($1, $2);
|
|
|
|
}
|
|
|
|
| bytestring DT_LABEL
|
|
|
|
{
|
2007-11-22 04:39:23 +01:00
|
|
|
$$ = data_add_marker($1, LABEL, $2);
|
2007-10-18 16:42:16 +02:00
|
|
|
}
|
2005-06-08 09:18:34 +02:00
|
|
|
;
|
|
|
|
|
2007-10-18 16:42:16 +02:00
|
|
|
subnodes:
|
2007-10-23 16:28:54 +02:00
|
|
|
/* empty */
|
2007-10-18 16:42:16 +02:00
|
|
|
{
|
2007-10-23 16:28:54 +02:00
|
|
|
$$ = NULL;
|
2005-06-08 09:18:34 +02:00
|
|
|
}
|
2010-02-24 08:22:17 +01:00
|
|
|
| subnode subnodes
|
2007-10-18 16:42:16 +02:00
|
|
|
{
|
2007-10-23 16:28:54 +02:00
|
|
|
$$ = chain_node($1, $2);
|
2007-10-18 16:42:16 +02:00
|
|
|
}
|
2007-12-05 00:27:04 +01:00
|
|
|
| subnode propdef
|
|
|
|
{
|
2014-01-03 13:57:39 +01:00
|
|
|
ERROR(&@2, "Properties must precede subnodes");
|
2007-12-05 00:27:04 +01:00
|
|
|
YYERROR;
|
|
|
|
}
|
2005-06-08 09:18:34 +02:00
|
|
|
;
|
|
|
|
|
2007-10-18 16:42:16 +02:00
|
|
|
subnode:
|
2010-02-24 08:22:17 +01:00
|
|
|
DT_PROPNODENAME nodedef
|
2007-10-18 16:42:16 +02:00
|
|
|
{
|
2010-02-24 08:22:17 +01:00
|
|
|
$$ = name_node($2, $1);
|
2007-10-18 16:42:16 +02:00
|
|
|
}
|
2012-08-08 06:50:15 +02:00
|
|
|
| DT_DEL_NODE DT_PROPNODENAME ';'
|
|
|
|
{
|
annotations: add positions
Extend the parser to record positions, in build_node,
build_node_delete, and build_property.
srcpos structures are added to the property and node types, and to the
parameter lists of the above functions that construct these types.
Nodes and properties that are created by the compiler rather than from
parsing source code have NULL as the srcpos value.
merge_nodes, defined in livetree.c, uses srcpos_extend to combine
multiple positions, resulting in a list of positions. srcpos_extend
is defined in srcpos.c. New elements are added at the end. This
requires the srcpos type, define in srcpos.h, to be a list structure
with a next field. This next field is initialized to NULL in
srcpos.h, in the macro YYLLOC_DEFAULT invoked implicitly by the
generated parser code.
Another change to srcpos.c is to make srcpos_copy always do a full
copy, including a copy of the file substructure. This is required
because when dtc is used on the output of cpp, the successive detected
file names overwrite the file name in the file structure. The next
field does not need to be deep copied, because it is always NULL when
srcpos_copy is called; an assert checks for this. File names are only
updated in uncopied position structures.
Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
2018-11-16 17:29:59 +01:00
|
|
|
$$ = name_node(build_node_delete(&@$), $2);
|
2012-08-08 06:50:15 +02:00
|
|
|
}
|
dtc: add ability to make nodes conditional on them being referenced
A number of platforms have a need to reduce the number of DT nodes,
mostly because of two similar constraints: the size of the DT blob, and
the time it takes to parse it.
As the DT is used in more and more SoCs, and by more projects, some
constraints start to appear in bootloaders running from SRAM with an
order of magnitude of 10kB. A typical DT is in the same order of
magnitude, so any effort to reduce the blob size is welcome in such an
environment.
Some platforms also want to reach very fast boot time, and the time it
takes to parse a typical DT starts to be noticeable.
Both of these issues can be mitigated by reducing the number of nodes in
the DT. The biggest provider of nodes is usually the pin controller and
its subnodes, usually one for each valid pin configuration in a given
SoC.
Obviously, a single, fixed, set of these nodes will be used by a given
board, so we can introduce a node property that will tell the DT
compiler to drop the nodes when they are not referenced in the tree, and
as such wouldn't be useful in the targetted system.
Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com>
Reviewed-by: Rob Herring <robh@kernel.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
2018-05-03 22:27:26 +02:00
|
|
|
| DT_OMIT_NO_REF subnode
|
|
|
|
{
|
|
|
|
$$ = omit_node_if_unused($2);
|
2012-08-08 06:50:15 +02:00
|
|
|
}
|
2010-02-24 08:22:17 +01:00
|
|
|
| DT_LABEL subnode
|
2007-10-18 16:42:16 +02:00
|
|
|
{
|
2010-02-24 08:22:17 +01:00
|
|
|
add_label(&$2->labels, $1);
|
|
|
|
$$ = $2;
|
2007-10-18 16:42:16 +02:00
|
|
|
}
|
2005-06-08 09:18:34 +02:00
|
|
|
;
|
|
|
|
|
|
|
|
%%
|
|
|
|
|
2014-01-03 13:23:23 +01:00
|
|
|
void yyerror(char const *s)
|
|
|
|
{
|
2014-01-03 13:57:39 +01:00
|
|
|
ERROR(&yylloc, "%s", s);
|
2010-10-20 23:44:58 +02:00
|
|
|
}
|