blob: 1bfbfa30a9b33e26d00798f63cc7b4b6f36522ac [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;
46 struct reserve_entry 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 Gibsonf0517db2005-07-15 17:14:24 +100061%type <re> memreserve
62%type <data> memreserves
David Gibsonfc14dad2005-06-08 17:18:34 +100063%type <data> celllist
64%type <data> bytestring
65%type <prop> propdef
66%type <proplist> proplist
67
David Gibsonf0517db2005-07-15 17:14:24 +100068%type <node> devicetree
David Gibsonfc14dad2005-06-08 17:18:34 +100069%type <node> nodedef
70%type <node> subnode
71%type <nodelist> subnodes
David Gibson4102d842005-06-16 14:36:37 +100072%type <str> label
73%type <str> nodename
74
David Gibsonfc14dad2005-06-08 17:18:34 +100075%%
76
David Gibsonf0517db2005-07-15 17:14:24 +100077sourcefile: memreserves devicetree {
78 the_boot_info = build_boot_info($1, $2);
79 }
80 ;
81
82memreserves: memreserves memreserve {
83 $$ = data_append_addr(data_append_addr($1, $2.address),
84 $2.size);
85 }
86 | /* empty */ {
87 $$ = empty_data;
88 }
89 ;
90
91memreserve: DT_MEMRESERVE DT_ADDR DT_ADDR ';' {
92 $$.address = $2;
93 $$.size = $3;
94 }
95 | DT_MEMRESERVE DT_ADDR '-' DT_ADDR ';' {
96 $$.address = $2;
97 $$.size = $4 - $2 + 1;
98 }
99 ;
100
101devicetree: '/' nodedef {
102 $$ = name_node($2, "", NULL);
103 }
David Gibsonfc14dad2005-06-08 17:18:34 +1000104 ;
105
106nodedef: '{' proplist subnodes '}' ';' {
107 $$ = build_node($2, $3);
108 }
109 ;
110
111proplist: propdef proplist {
112 $$ = chain_property($1, $2);
113 }
114 | /* empty */ {
115 $$ = NULL;
116 }
117 ;
118
David Gibson4102d842005-06-16 14:36:37 +1000119propdef: label DT_PROPNAME '=' propdata ';' {
120 $$ = build_property($2, $4, $1);
David Gibsonfc14dad2005-06-08 17:18:34 +1000121 }
David Gibson4102d842005-06-16 14:36:37 +1000122 | label DT_PROPNAME ';' {
David Gibson9ad45872005-06-17 14:32:32 +1000123 $$ = build_property($2, empty_data, $1);
David Gibsonfc14dad2005-06-08 17:18:34 +1000124 }
125 ;
126
127propdata: DT_STRING { $$ = $1; }
128 | '<' celllist '>' { $$ = $2; }
129 | '[' bytestring ']' { $$ = $2; }
130 ;
131
132celllist: celllist DT_CELL { $$ = data_append_cell($1, $2); }
David Gibson81f2e892005-06-16 17:04:00 +1000133 | celllist DT_REF {
134 $$ = data_append_cell(data_add_fixup($1, $2), -1);
135 }
David Gibsonfc14dad2005-06-08 17:18:34 +1000136 | /* empty */ { $$ = empty_data; }
137 ;
138
139bytestring: bytestring DT_BYTE { $$ = data_append_byte($1, $2); }
140 | /* empty */ { $$ = empty_data; }
141 ;
142
143subnodes: subnode subnodes {
144 $$ = chain_node($1, $2);
145 }
146 | /* empty */ { $$ = NULL; }
147 ;
148
David Gibson4102d842005-06-16 14:36:37 +1000149subnode: label nodename nodedef { $$ = name_node($3, $2, $1); }
150 ;
151
152nodename: DT_NODENAME { $$ = $1; }
153 | DT_PROPNAME { $$ = $1; }
154 ;
155
156label: DT_LABEL { $$ = $1; }
157 | /* empty */ { $$ = NULL; }
David Gibsonfc14dad2005-06-08 17:18:34 +1000158 ;
159
160%%
161
162void yyerror (char const *s)
163{
David Gibson86dbcbd2005-10-19 16:00:31 +1000164 fprintf (stderr, "%s at line %d\n", s, yylloc.first_line);
David Gibsonfc14dad2005-06-08 17:18:34 +1000165}