blob: bd725fee0d6ac0bfeaa2319d56bdc8775c0d6a57 [file] [log] [blame]
David Gibsonfc14dad2005-06-08 17:18:34 +10001/*
2 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
3 *
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
18 * USA
19 */
20
David Gibson86dbcbd2005-10-19 16:00:31 +100021%glr-parser
22%locations
23
David Gibsonfc14dad2005-06-08 17:18:34 +100024%{
25#include "dtc.h"
26
27int yylex (void);
28void yyerror (char const *);
29
David Gibsonf0517db2005-07-15 17:14:24 +100030extern struct boot_info *the_boot_info;
David Gibsonfc14dad2005-06-08 17:18:34 +100031
32%}
33
34%union {
35 cell_t cval;
David Gibson03a9b9d2005-07-11 16:49:52 +100036 u8 byte;
David Gibsonfc14dad2005-06-08 17:18:34 +100037 char *str;
38 struct data data;
39 struct property *prop;
40 struct property *proplist;
41 struct node *node;
42 struct node *nodelist;
43 int datalen;
44 int hexlen;
David Gibsonf0517db2005-07-15 17:14:24 +100045 u64 addr;
David Gibsonf040d952005-10-24 18:18:38 +100046 struct reserve_info *re;
David Gibsonfc14dad2005-06-08 17:18:34 +100047}
48
David Gibsonf0517db2005-07-15 17:14:24 +100049%token DT_MEMRESERVE
50%token <addr> DT_ADDR
David Gibsonfc14dad2005-06-08 17:18:34 +100051%token <str> DT_PROPNAME
52%token <str> DT_NODENAME
53%token <cval> DT_CELL
54%token <byte> DT_BYTE
55%token <data> DT_STRING
56%token <str> DT_UNIT
David Gibson4102d842005-06-16 14:36:37 +100057%token <str> DT_LABEL
David Gibson81f2e892005-06-16 17:04:00 +100058%token <str> DT_REF
David Gibsonfc14dad2005-06-08 17:18:34 +100059
60%type <data> propdata
David Gibson32da4752007-02-07 16:37:50 +110061%type <data> propdataprefix
David Gibsonf0517db2005-07-15 17:14:24 +100062%type <re> memreserve
David Gibsonf040d952005-10-24 18:18:38 +100063%type <re> memreserves
David Gibsonfc14dad2005-06-08 17:18:34 +100064%type <data> celllist
65%type <data> bytestring
66%type <prop> propdef
67%type <proplist> proplist
68
David Gibsonf0517db2005-07-15 17:14:24 +100069%type <node> devicetree
David Gibsonfc14dad2005-06-08 17:18:34 +100070%type <node> nodedef
71%type <node> subnode
72%type <nodelist> subnodes
David Gibson4102d842005-06-16 14:36:37 +100073%type <str> label
74%type <str> nodename
75
David Gibsonfc14dad2005-06-08 17:18:34 +100076%%
77
David Gibsonf0517db2005-07-15 17:14:24 +100078sourcefile: memreserves devicetree {
79 the_boot_info = build_boot_info($1, $2);
80 }
81 ;
82
David Gibsonf040d952005-10-24 18:18:38 +100083memreserves: memreserve memreserves {
84 $$ = chain_reserve_entry($1, $2);
David Gibsonf0517db2005-07-15 17:14:24 +100085 }
86 | /* empty */ {
David Gibsonf040d952005-10-24 18:18:38 +100087 $$ = NULL;
David Gibsonf0517db2005-07-15 17:14:24 +100088 }
89 ;
90
91memreserve: DT_MEMRESERVE DT_ADDR DT_ADDR ';' {
David Gibsonf040d952005-10-24 18:18:38 +100092 $$ = build_reserve_entry($2, $3, NULL);
David Gibsonf0517db2005-07-15 17:14:24 +100093 }
94 | DT_MEMRESERVE DT_ADDR '-' DT_ADDR ';' {
David Gibsonf040d952005-10-24 18:18:38 +100095 $$ = build_reserve_entry($2, $4 - $2 + 1, NULL);
David Gibsonf0517db2005-07-15 17:14:24 +100096 }
97 ;
98
99devicetree: '/' nodedef {
100 $$ = name_node($2, "", NULL);
101 }
David Gibsonfc14dad2005-06-08 17:18:34 +1000102 ;
103
104nodedef: '{' proplist subnodes '}' ';' {
105 $$ = build_node($2, $3);
106 }
107 ;
108
109proplist: propdef proplist {
110 $$ = chain_property($1, $2);
111 }
112 | /* empty */ {
113 $$ = NULL;
114 }
115 ;
116
David Gibson4102d842005-06-16 14:36:37 +1000117propdef: label DT_PROPNAME '=' propdata ';' {
118 $$ = build_property($2, $4, $1);
David Gibsonfc14dad2005-06-08 17:18:34 +1000119 }
David Gibson4102d842005-06-16 14:36:37 +1000120 | label DT_PROPNAME ';' {
David Gibson9ad45872005-06-17 14:32:32 +1000121 $$ = build_property($2, empty_data, $1);
David Gibsonfc14dad2005-06-08 17:18:34 +1000122 }
123 ;
124
David Gibson32da4752007-02-07 16:37:50 +1100125propdata: propdataprefix DT_STRING { $$ = data_merge($1, $2); }
126 | propdataprefix '<' celllist '>' {
127 $$ = data_merge(data_append_align($1, sizeof(cell_t)), $3);
128 }
129 | propdataprefix '[' bytestring ']' { $$ = data_merge($1, $3); }
130 ;
131
132propdataprefix: propdata ',' { $$ = $1; }
133 | /* empty */ { $$ = empty_data; }
David Gibsonfc14dad2005-06-08 17:18:34 +1000134 ;
135
136celllist: celllist DT_CELL { $$ = data_append_cell($1, $2); }
David Gibson81f2e892005-06-16 17:04:00 +1000137 | celllist DT_REF {
138 $$ = data_append_cell(data_add_fixup($1, $2), -1);
139 }
David Gibsonfc14dad2005-06-08 17:18:34 +1000140 | /* empty */ { $$ = empty_data; }
141 ;
142
143bytestring: bytestring DT_BYTE { $$ = data_append_byte($1, $2); }
144 | /* empty */ { $$ = empty_data; }
145 ;
146
147subnodes: subnode subnodes {
148 $$ = chain_node($1, $2);
149 }
150 | /* empty */ { $$ = NULL; }
151 ;
152
David Gibson4102d842005-06-16 14:36:37 +1000153subnode: label nodename nodedef { $$ = name_node($3, $2, $1); }
154 ;
155
156nodename: DT_NODENAME { $$ = $1; }
157 | DT_PROPNAME { $$ = $1; }
158 ;
159
160label: DT_LABEL { $$ = $1; }
161 | /* empty */ { $$ = NULL; }
David Gibsonfc14dad2005-06-08 17:18:34 +1000162 ;
163
164%%
165
166void yyerror (char const *s)
167{
David Gibson86dbcbd2005-10-19 16:00:31 +1000168 fprintf (stderr, "%s at line %d\n", s, yylloc.first_line);
David Gibsonfc14dad2005-06-08 17:18:34 +1000169}