Blame view

scripts/dtc/dtc-parser.y 10.6 KB
12869ecd5   Rob Herring   scripts/dtc: Upda...
1
  // SPDX-License-Identifier: GPL-2.0-or-later
a4da2e3ec   David Gibson   [POWERPC] Merge d...
2
3
  /*
   * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
a4da2e3ec   David Gibson   [POWERPC] Merge d...
4
   */
0cec114e3   Rob Herring   scripts/dtc: Upda...
5
  %locations
a4da2e3ec   David Gibson   [POWERPC] Merge d...
6
  %{
ed95d7450   David Gibson   powerpc: Update i...
7
  #include <stdio.h>
6f05afcbb   Rob Herring   scripts/dtc: Upda...
8
  #include <inttypes.h>
ed95d7450   David Gibson   powerpc: Update i...
9

a4da2e3ec   David Gibson   [POWERPC] Merge d...
10
11
  #include "dtc.h"
  #include "srcpos.h"
ed95d7450   David Gibson   powerpc: Update i...
12
  extern int yylex(void);
658f29a51   John Bonesio   of/flattree: Upda...
13
  extern void yyerror(char const *s);
476059711   Rob Herring   scripts/dtc: Upda...
14
15
16
17
18
  #define ERROR(loc, ...) \
  	do { \
  		srcpos_error((loc), "Error", __VA_ARGS__); \
  		treesource_error = true; \
  	} while (0)
a4da2e3ec   David Gibson   [POWERPC] Merge d...
19

0cec114e3   Rob Herring   scripts/dtc: Upda...
20
  #define YYERROR_CALL(msg) yyerror(msg)
6f05afcbb   Rob Herring   scripts/dtc: Upda...
21
  extern struct dt_info *parser_output;
476059711   Rob Herring   scripts/dtc: Upda...
22
  extern bool treesource_error;
a4da2e3ec   David Gibson   [POWERPC] Merge d...
23
24
25
26
  %}
  
  %union {
  	char *propnodename;
a4da2e3ec   David Gibson   [POWERPC] Merge d...
27
  	char *labelref;
ed95d7450   David Gibson   powerpc: Update i...
28
  	uint8_t byte;
a4da2e3ec   David Gibson   [POWERPC] Merge d...
29
  	struct data data;
cd296721a   Stephen Warren   dtc: import lates...
30
31
32
33
  	struct {
  		struct data	data;
  		int		bits;
  	} array;
a4da2e3ec   David Gibson   [POWERPC] Merge d...
34
35
36
37
38
  	struct property *prop;
  	struct property *proplist;
  	struct node *node;
  	struct node *nodelist;
  	struct reserve_info *re;
cd296721a   Stephen Warren   dtc: import lates...
39
  	uint64_t integer;
6f05afcbb   Rob Herring   scripts/dtc: Upda...
40
  	unsigned int flags;
a4da2e3ec   David Gibson   [POWERPC] Merge d...
41
42
43
  }
  
  %token DT_V1
6f05afcbb   Rob Herring   scripts/dtc: Upda...
44
  %token DT_PLUGIN
a4da2e3ec   David Gibson   [POWERPC] Merge d...
45
  %token DT_MEMRESERVE
cd296721a   Stephen Warren   dtc: import lates...
46
47
48
49
  %token DT_LSHIFT DT_RSHIFT DT_LE DT_GE DT_EQ DT_NE DT_AND DT_OR
  %token DT_BITS
  %token DT_DEL_PROP
  %token DT_DEL_NODE
50aafd608   Rob Herring   scripts/dtc: Upda...
50
  %token DT_OMIT_NO_REF
a4da2e3ec   David Gibson   [POWERPC] Merge d...
51
  %token <propnodename> DT_PROPNODENAME
476059711   Rob Herring   scripts/dtc: Upda...
52
53
  %token <integer> DT_LITERAL
  %token <integer> DT_CHAR_LITERAL
a4da2e3ec   David Gibson   [POWERPC] Merge d...
54
55
56
  %token <byte> DT_BYTE
  %token <data> DT_STRING
  %token <labelref> DT_LABEL
c2e7075ca   Rob Herring   scripts/dtc: Upda...
57
58
  %token <labelref> DT_LABEL_REF
  %token <labelref> DT_PATH_REF
ed95d7450   David Gibson   powerpc: Update i...
59
  %token DT_INCBIN
a4da2e3ec   David Gibson   [POWERPC] Merge d...
60
61
62
  
  %type <data> propdata
  %type <data> propdataprefix
6f05afcbb   Rob Herring   scripts/dtc: Upda...
63
64
  %type <flags> header
  %type <flags> headers
a4da2e3ec   David Gibson   [POWERPC] Merge d...
65
66
  %type <re> memreserve
  %type <re> memreserves
cd296721a   Stephen Warren   dtc: import lates...
67
  %type <array> arrayprefix
a4da2e3ec   David Gibson   [POWERPC] Merge d...
68
69
70
  %type <data> bytestring
  %type <prop> propdef
  %type <proplist> proplist
c2e7075ca   Rob Herring   scripts/dtc: Upda...
71
  %type <labelref> dt_ref
a4da2e3ec   David Gibson   [POWERPC] Merge d...
72
73
74
75
76
  
  %type <node> devicetree
  %type <node> nodedef
  %type <node> subnode
  %type <nodelist> subnodes
a4da2e3ec   David Gibson   [POWERPC] Merge d...
77

cd296721a   Stephen Warren   dtc: import lates...
78
79
80
81
82
83
84
85
86
87
88
89
90
91
  %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
a4da2e3ec   David Gibson   [POWERPC] Merge d...
92
93
94
  %%
  
  sourcefile:
6f05afcbb   Rob Herring   scripts/dtc: Upda...
95
  	  headers memreserves devicetree
a4da2e3ec   David Gibson   [POWERPC] Merge d...
96
  		{
6f05afcbb   Rob Herring   scripts/dtc: Upda...
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
  			parser_output = build_dt_info($1, $2, $3,
  			                              guess_boot_cpuid($3));
  		}
  	;
  
  header:
  	  DT_V1 ';'
  		{
  			$$ = DTSF_V1;
  		}
  	| DT_V1 ';' DT_PLUGIN ';'
  		{
  			$$ = DTSF_V1 | DTSF_PLUGIN;
  		}
  	;
  
  headers:
  	  header
  	| header headers
  		{
  			if ($2 != $1)
  				ERROR(&@2, "Header flags don't match earlier ones");
  			$$ = $1;
a4da2e3ec   David Gibson   [POWERPC] Merge d...
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
  		}
  	;
  
  memreserves:
  	  /* empty */
  		{
  			$$ = NULL;
  		}
  	| memreserve memreserves
  		{
  			$$ = chain_reserve_entry($1, $2);
  		}
  	;
  
  memreserve:
cd296721a   Stephen Warren   dtc: import lates...
135
  	  DT_MEMRESERVE integer_prim integer_prim ';'
a4da2e3ec   David Gibson   [POWERPC] Merge d...
136
  		{
658f29a51   John Bonesio   of/flattree: Upda...
137
  			$$ = build_reserve_entry($2, $3);
a4da2e3ec   David Gibson   [POWERPC] Merge d...
138
  		}
658f29a51   John Bonesio   of/flattree: Upda...
139
  	| DT_LABEL memreserve
a4da2e3ec   David Gibson   [POWERPC] Merge d...
140
  		{
658f29a51   John Bonesio   of/flattree: Upda...
141
142
  			add_label(&$2->labels, $1);
  			$$ = $2;
a4da2e3ec   David Gibson   [POWERPC] Merge d...
143
144
  		}
  	;
c2e7075ca   Rob Herring   scripts/dtc: Upda...
145
  dt_ref: DT_LABEL_REF | DT_PATH_REF;
a4da2e3ec   David Gibson   [POWERPC] Merge d...
146
147
148
  devicetree:
  	  '/' nodedef
  		{
658f29a51   John Bonesio   of/flattree: Upda...
149
150
151
152
153
154
  			$$ = name_node($2, "");
  		}
  	| devicetree '/' nodedef
  		{
  			$$ = merge_nodes($1, $3);
  		}
c2e7075ca   Rob Herring   scripts/dtc: Upda...
155
  	| dt_ref nodedef
9130ba884   Rob Herring   scripts/dtc: Upda...
156
157
158
159
160
161
162
163
  		{
  			/*
  			 * 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);
c2e7075ca   Rob Herring   scripts/dtc: Upda...
164
165
166
167
  			$$ = add_orphan_node(
  					name_node(build_node(NULL, NULL, NULL),
  						  ""),
  					$2, $1);
9130ba884   Rob Herring   scripts/dtc: Upda...
168
  		}
c2e7075ca   Rob Herring   scripts/dtc: Upda...
169
  	| devicetree DT_LABEL dt_ref nodedef
476059711   Rob Herring   scripts/dtc: Upda...
170
171
  		{
  			struct node *target = get_node_by_ref($1, $3);
89d123106   Rob Herring   scripts/dtc: Upda...
172
173
  			if (target) {
  				add_label(&target->labels, $2);
476059711   Rob Herring   scripts/dtc: Upda...
174
  				merge_nodes(target, $4);
89d123106   Rob Herring   scripts/dtc: Upda...
175
  			} else
476059711   Rob Herring   scripts/dtc: Upda...
176
177
178
  				ERROR(&@3, "Label or path %s not found", $3);
  			$$ = $1;
  		}
c2e7075ca   Rob Herring   scripts/dtc: Upda...
179
  	| devicetree DT_PATH_REF nodedef
658f29a51   John Bonesio   of/flattree: Upda...
180
  		{
50aafd608   Rob Herring   scripts/dtc: Upda...
181
182
183
184
185
186
187
  			/*
  			 * 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);
4201d057e   Rob Herring   scripts/dtc: Upda...
188
  			} else {
50aafd608   Rob Herring   scripts/dtc: Upda...
189
190
191
192
  				struct node *target = get_node_by_ref($1, $2);
  
  				if (target)
  					merge_nodes(target, $3);
4201d057e   Rob Herring   scripts/dtc: Upda...
193
194
195
  				else
  					ERROR(&@2, "Label or path %s not found", $2);
  			}
658f29a51   John Bonesio   of/flattree: Upda...
196
  			$$ = $1;
a4da2e3ec   David Gibson   [POWERPC] Merge d...
197
  		}
c2e7075ca   Rob Herring   scripts/dtc: Upda...
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
  	| devicetree DT_LABEL_REF nodedef
  		{
  			struct node *target = get_node_by_ref($1, $2);
  
  			if (target) {
  				merge_nodes(target, $3);
  			} 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);
  			}
  			$$ = $1;
  		}
  	| devicetree DT_DEL_NODE dt_ref ';'
cd296721a   Stephen Warren   dtc: import lates...
218
219
  		{
  			struct node *target = get_node_by_ref($1, $3);
476059711   Rob Herring   scripts/dtc: Upda...
220
  			if (target)
cd296721a   Stephen Warren   dtc: import lates...
221
  				delete_node(target);
476059711   Rob Herring   scripts/dtc: Upda...
222
223
  			else
  				ERROR(&@3, "Label or path %s not found", $3);
cd296721a   Stephen Warren   dtc: import lates...
224
225
226
  
  			$$ = $1;
  		}
c2e7075ca   Rob Herring   scripts/dtc: Upda...
227
  	| devicetree DT_OMIT_NO_REF dt_ref ';'
50aafd608   Rob Herring   scripts/dtc: Upda...
228
229
230
231
232
233
234
235
236
237
238
  		{
  			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);
  
  
  			$$ = $1;
  		}
a4da2e3ec   David Gibson   [POWERPC] Merge d...
239
240
241
242
243
  	;
  
  nodedef:
  	  '{' proplist subnodes '}' ';'
  		{
c2e7075ca   Rob Herring   scripts/dtc: Upda...
244
  			$$ = build_node($2, $3, &@$);
a4da2e3ec   David Gibson   [POWERPC] Merge d...
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
  		}
  	;
  
  proplist:
  	  /* empty */
  		{
  			$$ = NULL;
  		}
  	| proplist propdef
  		{
  			$$ = chain_property($2, $1);
  		}
  	;
  
  propdef:
658f29a51   John Bonesio   of/flattree: Upda...
260
261
  	  DT_PROPNODENAME '=' propdata ';'
  		{
c2e7075ca   Rob Herring   scripts/dtc: Upda...
262
  			$$ = build_property($1, $3, &@$);
658f29a51   John Bonesio   of/flattree: Upda...
263
264
  		}
  	| DT_PROPNODENAME ';'
a4da2e3ec   David Gibson   [POWERPC] Merge d...
265
  		{
c2e7075ca   Rob Herring   scripts/dtc: Upda...
266
  			$$ = build_property($1, empty_data, &@$);
a4da2e3ec   David Gibson   [POWERPC] Merge d...
267
  		}
cd296721a   Stephen Warren   dtc: import lates...
268
269
270
271
  	| DT_DEL_PROP DT_PROPNODENAME ';'
  		{
  			$$ = build_property_delete($2);
  		}
658f29a51   John Bonesio   of/flattree: Upda...
272
  	| DT_LABEL propdef
a4da2e3ec   David Gibson   [POWERPC] Merge d...
273
  		{
658f29a51   John Bonesio   of/flattree: Upda...
274
275
  			add_label(&$2->labels, $1);
  			$$ = $2;
a4da2e3ec   David Gibson   [POWERPC] Merge d...
276
277
278
279
280
281
282
283
  		}
  	;
  
  propdata:
  	  propdataprefix DT_STRING
  		{
  			$$ = data_merge($1, $2);
  		}
cd296721a   Stephen Warren   dtc: import lates...
284
  	| propdataprefix arrayprefix '>'
a4da2e3ec   David Gibson   [POWERPC] Merge d...
285
  		{
cd296721a   Stephen Warren   dtc: import lates...
286
  			$$ = data_merge($1, $2.data);
a4da2e3ec   David Gibson   [POWERPC] Merge d...
287
288
289
290
291
  		}
  	| propdataprefix '[' bytestring ']'
  		{
  			$$ = data_merge($1, $3);
  		}
c2e7075ca   Rob Herring   scripts/dtc: Upda...
292
  	| propdataprefix dt_ref
a4da2e3ec   David Gibson   [POWERPC] Merge d...
293
  		{
f858927fd   Rob Herring   scripts/dtc: Upda...
294
  			$1 = data_add_marker($1, TYPE_STRING, $2);
a4da2e3ec   David Gibson   [POWERPC] Merge d...
295
296
  			$$ = data_add_marker($1, REF_PATH, $2);
  		}
cd296721a   Stephen Warren   dtc: import lates...
297
  	| propdataprefix DT_INCBIN '(' DT_STRING ',' integer_prim ',' integer_prim ')'
ed95d7450   David Gibson   powerpc: Update i...
298
  		{
658f29a51   John Bonesio   of/flattree: Upda...
299
300
  			FILE *f = srcfile_relative_open($4.val, NULL);
  			struct data d;
ed95d7450   David Gibson   powerpc: Update i...
301
302
  
  			if ($6 != 0)
658f29a51   John Bonesio   of/flattree: Upda...
303
  				if (fseek(f, $6, SEEK_SET) != 0)
476059711   Rob Herring   scripts/dtc: Upda...
304
305
306
  					die("Couldn't seek to offset %llu in \"%s\": %s",
  					    (unsigned long long)$6, $4.val,
  					    strerror(errno));
ed95d7450   David Gibson   powerpc: Update i...
307

658f29a51   John Bonesio   of/flattree: Upda...
308
  			d = data_copy_file(f, $8);
ed95d7450   David Gibson   powerpc: Update i...
309
310
  
  			$$ = data_merge($1, d);
658f29a51   John Bonesio   of/flattree: Upda...
311
  			fclose(f);
ed95d7450   David Gibson   powerpc: Update i...
312
313
314
  		}
  	| propdataprefix DT_INCBIN '(' DT_STRING ')'
  		{
658f29a51   John Bonesio   of/flattree: Upda...
315
  			FILE *f = srcfile_relative_open($4.val, NULL);
ed95d7450   David Gibson   powerpc: Update i...
316
  			struct data d = empty_data;
658f29a51   John Bonesio   of/flattree: Upda...
317
  			d = data_copy_file(f, -1);
ed95d7450   David Gibson   powerpc: Update i...
318
319
  
  			$$ = data_merge($1, d);
658f29a51   John Bonesio   of/flattree: Upda...
320
  			fclose(f);
ed95d7450   David Gibson   powerpc: Update i...
321
  		}
a4da2e3ec   David Gibson   [POWERPC] Merge d...
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
  	| propdata DT_LABEL
  		{
  			$$ = data_add_marker($1, LABEL, $2);
  		}
  	;
  
  propdataprefix:
  	  /* empty */
  		{
  			$$ = empty_data;
  		}
  	| propdata ','
  		{
  			$$ = $1;
  		}
  	| propdataprefix DT_LABEL
  		{
  			$$ = data_add_marker($1, LABEL, $2);
  		}
  	;
cd296721a   Stephen Warren   dtc: import lates...
342
343
344
  arrayprefix:
  	DT_BITS DT_LITERAL '<'
  		{
476059711   Rob Herring   scripts/dtc: Upda...
345
  			unsigned long long bits;
f858927fd   Rob Herring   scripts/dtc: Upda...
346
  			enum markertype type = TYPE_UINT32;
476059711   Rob Herring   scripts/dtc: Upda...
347
348
  
  			bits = $2;
f858927fd   Rob Herring   scripts/dtc: Upda...
349
350
351
352
353
354
  			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:
476059711   Rob Herring   scripts/dtc: Upda...
355
356
357
  				ERROR(&@2, "Array elements must be"
  				      " 8, 16, 32 or 64-bits");
  				bits = 32;
cd296721a   Stephen Warren   dtc: import lates...
358
  			}
476059711   Rob Herring   scripts/dtc: Upda...
359

f858927fd   Rob Herring   scripts/dtc: Upda...
360
  			$$.data = data_add_marker(empty_data, type, NULL);
476059711   Rob Herring   scripts/dtc: Upda...
361
  			$$.bits = bits;
cd296721a   Stephen Warren   dtc: import lates...
362
363
364
  		}
  	| '<'
  		{
f858927fd   Rob Herring   scripts/dtc: Upda...
365
  			$$.data = data_add_marker(empty_data, TYPE_UINT32, NULL);
cd296721a   Stephen Warren   dtc: import lates...
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
  			$$.bits = 32;
  		}
  	| 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))
476059711   Rob Herring   scripts/dtc: Upda...
381
382
  					ERROR(&@2, "Value out of range for"
  					      " %d-bit array element", $1.bits);
cd296721a   Stephen Warren   dtc: import lates...
383
384
385
386
  			}
  
  			$$.data = data_append_integer($1.data, $2, $1.bits);
  		}
c2e7075ca   Rob Herring   scripts/dtc: Upda...
387
  	| arrayprefix dt_ref
cd296721a   Stephen Warren   dtc: import lates...
388
389
390
391
392
393
394
395
  		{
  			uint64_t val = ~0ULL >> (64 - $1.bits);
  
  			if ($1.bits == 32)
  				$1.data = data_add_marker($1.data,
  							  REF_PHANDLE,
  							  $2);
  			else
476059711   Rob Herring   scripts/dtc: Upda...
396
  				ERROR(&@2, "References are only allowed in "
cd296721a   Stephen Warren   dtc: import lates...
397
398
399
400
401
  					    "arrays with 32-bit elements.");
  
  			$$.data = data_append_integer($1.data, val, $1.bits);
  		}
  	| arrayprefix DT_LABEL
a4da2e3ec   David Gibson   [POWERPC] Merge d...
402
  		{
cd296721a   Stephen Warren   dtc: import lates...
403
  			$$.data = data_add_marker($1.data, LABEL, $2);
a4da2e3ec   David Gibson   [POWERPC] Merge d...
404
  		}
cd296721a   Stephen Warren   dtc: import lates...
405
406
407
408
  	;
  
  integer_prim:
  	  DT_LITERAL
cd296721a   Stephen Warren   dtc: import lates...
409
  	| DT_CHAR_LITERAL
cd296721a   Stephen Warren   dtc: import lates...
410
  	| '(' integer_expr ')'
a4da2e3ec   David Gibson   [POWERPC] Merge d...
411
  		{
cd296721a   Stephen Warren   dtc: import lates...
412
  			$$ = $2;
a4da2e3ec   David Gibson   [POWERPC] Merge d...
413
414
  		}
  	;
cd296721a   Stephen Warren   dtc: import lates...
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
  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:
6e9c9686d   Rob Herring   scripts/dtc: Upda...
464
465
  	  integer_shift DT_LSHIFT integer_add { $$ = ($3 < 64) ? ($1 << $3) : 0; }
  	| integer_shift DT_RSHIFT integer_add { $$ = ($3 < 64) ? ($1 >> $3) : 0; }
cd296721a   Stephen Warren   dtc: import lates...
466
467
468
469
470
471
472
473
474
475
476
  	| 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; }
91feabc2e   Rob Herring   scripts/dtc: Upda...
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
  	| integer_mul '/' integer_unary
  		{
  			if ($3 != 0) {
  				$$ = $1 / $3;
  			} else {
  				ERROR(&@$, "Division by zero");
  				$$ = 0;
  			}
  		}
  	| integer_mul '%' integer_unary
  		{
  			if ($3 != 0) {
  				$$ = $1 % $3;
  			} else {
  				ERROR(&@$, "Division by zero");
  				$$ = 0;
  			}
  		}
cd296721a   Stephen Warren   dtc: import lates...
495
496
497
498
499
500
501
502
  	| integer_unary
  	;
  
  integer_unary:
  	  integer_prim
  	| '-' integer_unary { $$ = -$2; }
  	| '~' integer_unary { $$ = ~$2; }
  	| '!' integer_unary { $$ = !$2; }
a4da2e3ec   David Gibson   [POWERPC] Merge d...
503
504
505
506
507
  	;
  
  bytestring:
  	  /* empty */
  		{
f858927fd   Rob Herring   scripts/dtc: Upda...
508
  			$$ = data_add_marker(empty_data, TYPE_UINT8, NULL);
a4da2e3ec   David Gibson   [POWERPC] Merge d...
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
  		}
  	| bytestring DT_BYTE
  		{
  			$$ = data_append_byte($1, $2);
  		}
  	| bytestring DT_LABEL
  		{
  			$$ = data_add_marker($1, LABEL, $2);
  		}
  	;
  
  subnodes:
  	  /* empty */
  		{
  			$$ = NULL;
  		}
658f29a51   John Bonesio   of/flattree: Upda...
525
  	| subnode subnodes
a4da2e3ec   David Gibson   [POWERPC] Merge d...
526
527
528
529
530
  		{
  			$$ = chain_node($1, $2);
  		}
  	| subnode propdef
  		{
476059711   Rob Herring   scripts/dtc: Upda...
531
  			ERROR(&@2, "Properties must precede subnodes");
a4da2e3ec   David Gibson   [POWERPC] Merge d...
532
533
534
535
536
  			YYERROR;
  		}
  	;
  
  subnode:
658f29a51   John Bonesio   of/flattree: Upda...
537
  	  DT_PROPNODENAME nodedef
a4da2e3ec   David Gibson   [POWERPC] Merge d...
538
  		{
658f29a51   John Bonesio   of/flattree: Upda...
539
  			$$ = name_node($2, $1);
a4da2e3ec   David Gibson   [POWERPC] Merge d...
540
  		}
cd296721a   Stephen Warren   dtc: import lates...
541
542
  	| DT_DEL_NODE DT_PROPNODENAME ';'
  		{
c2e7075ca   Rob Herring   scripts/dtc: Upda...
543
  			$$ = name_node(build_node_delete(&@$), $2);
cd296721a   Stephen Warren   dtc: import lates...
544
  		}
50aafd608   Rob Herring   scripts/dtc: Upda...
545
546
547
548
  	| DT_OMIT_NO_REF subnode
  		{
  			$$ = omit_node_if_unused($2);
  		}
658f29a51   John Bonesio   of/flattree: Upda...
549
  	| DT_LABEL subnode
a4da2e3ec   David Gibson   [POWERPC] Merge d...
550
  		{
658f29a51   John Bonesio   of/flattree: Upda...
551
552
  			add_label(&$2->labels, $1);
  			$$ = $2;
a4da2e3ec   David Gibson   [POWERPC] Merge d...
553
554
555
556
  		}
  	;
  
  %%
476059711   Rob Herring   scripts/dtc: Upda...
557
  void yyerror(char const *s)
cd296721a   Stephen Warren   dtc: import lates...
558
  {
476059711   Rob Herring   scripts/dtc: Upda...
559
  	ERROR(&yylloc, "%s", s);
cd296721a   Stephen Warren   dtc: import lates...
560
  }