switch-coreboot/util/dtc/dtc-parser.y
Ronald G. Minnich 643d952c5b In the current version of dtc, if one has the line:
/config/ = "northbridge/amd/geodelx";

Then the file northbridge/amd/geodelx/dts is read in and processed. 
Magic(TM) appends the name "/dts" to the path. 

This hack is fine with chips that only do one thing. 
But some (all) northbridge parts play several roles: APIC cluster, PCI domain
device, and PCI device. The result is a need for more than one dts, since
there are three possible devices, with three types of IDs, and so on. 

To keep things sane, I am proposing to enable multiple dts files in a
directory, names (e.g., nothing required here):
domaindts
pcidts
apicdts

(of course these names can be anything, this is just an example).
This change will require a change to the dtc, since we can no longer
assume just one dts file, and hence need a way to name these different 
files. 

The proposed change is very simple. We now require the full path name 
for the file, and eliminate the Magic(TM).

So, 
/config/ = "northbridge/amd/geodelx/pcidts";

will open the pcidts file. 
/config/ = "northbridge/amd/geodelx/domaindts";
will open the domain dts. 

Maybe we should just call it domain and pci and apic? works for me.
/config/ = "northbridge/amd/geodelx/domain";
/config/ = "northbridge/amd/geodelx/pcibridge";
/config/ = "northbridge/amd/geodelx/apic";

Changes: 
dtc.c: create a new function, fopenfile, that will only open a path if it 
really is a file. Modify dtc_open_file to use this function. fopenfile
assumes "-" means stdin; should it, or should I move that assumption back
to dtc_open_file?
dtc.h: add prototypes
dtc-parser.y: Given a config path, open the path.
southbridge/amd/cs5536/cs5536.c: example of how C code changes


Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>

Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>

Please see the comments below, but they do not have to be addressed for
this commit, just keep them in mind for future commits in that area.



git-svn-id: svn://coreboot.org/repository/coreboot-v3@566 f3766cd6-281f-0410-b1cd-43a5c92072e9
2008-01-29 17:48:10 +00:00

202 lines
4.2 KiB
Text

/*
* (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
*
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*/
%glr-parser
%locations
%{
#include "dtc.h"
int yylex (void);
void yyerror (char const *);
extern struct boot_info *the_boot_info;
%}
%union {
cell_t cval;
u8 byte;
char *str;
struct data data;
struct property *prop;
struct property *proplist;
struct node *node;
struct node *nodelist;
int datalen;
int hexlen;
u64 addr;
struct reserve_info *re;
}
%token <str> DT_MEMRESERVE
%token <addr> DT_ADDR
%token <str> DT_PROPNAME
%token <str> DT_NODENAME
%token <cval> DT_CELL
%token <byte> DT_BYTE
%token <data> DT_STRING
%token <str> DT_UNIT
%token <str> DT_LABEL
%token <str> DT_REF
%token <str> DT_FILENAME
%token <proplist> DT_CONFIG
%type <data> propdata
%type <re> memreserve
%type <re> memreserves
%type <data> celllist
%type <data> bytestring
%type <prop> propdef
%type <proplist> proplist
%type <node> devicetree
%type <node> nodedef
%type <node> subnode
%type <proplist> config
%type <nodelist> subnodes
%type <str> label
%type <str> nodename
%type <data> includepath
%type <data> structname
%%
/*sourcefile: memreserves devicetree {*/
sourcefile: devicetree {
/* the_boot_info = build_boot_info($1, $2);*/
the_boot_info = build_boot_info(0, $1);
}
;
memreserves: memreserve memreserves {
$$ = chain_reserve_entry($1, $2);
}
| /* empty */ {
$$ = NULL;
}
;
memreserve: DT_MEMRESERVE DT_ADDR DT_ADDR ';' {
$$ = build_reserve_entry($2, $3, NULL);
}
| DT_MEMRESERVE DT_ADDR '-' DT_ADDR ';' {
$$ = build_reserve_entry($2, $4 - $2 + 1, NULL);
}
;
devicetree: '/' nodedef {
$$ = name_node($2, "", NULL);
}
;
nodedef: '{' config proplist subnodes '}' ';' {
$$ = build_node($2, $3, $4);
}
;
proplist: propdef proplist {
$$ = chain_property($1, $2);
}
| /* empty */ {
$$ = NULL;
}
;
config: DT_CONFIG '('
includepath {
void switchin(FILE *f);
FILE *f;
/* The need for a cast here is silly */
char *name = (char *)$3.val;
/* TODO: keep track of which of these we have read in. If we have already done it, then
* don't do it twice.
*/
f = fopenfile(name);
if (! f){
perror(name);
exit(1);
}
switchin(f);
} '{' proplist '}' ';' {
void switchback(void);
switchback();
}
')' ';' {
/* convention: first property is labeled with path */
$6->label = strdup((char *)$3.val);
$$ = $6
}
|
;
includepath: DT_STRING { $$ = $1; }
;
structname: DT_FILENAME {$$ = $1; }
;
propdef: label DT_PROPNAME '=' propdata ';' {
$$ = build_property($2, $4, $1);
}
| label DT_PROPNAME ';' {
$$ = build_property($2, empty_data, $1);
}
;
propdata: DT_STRING { $$ = $1; }
| '<' celllist '>' { $$ = $2; }
| '[' bytestring ']' { $$ = $2; }
;
celllist: celllist DT_CELL { $$ = data_append_cell($1, $2); }
| celllist DT_REF {
$$ = data_append_cell(data_add_fixup($1, $2), -1);
}
| /* empty */ { $$ = empty_data; }
;
bytestring: bytestring DT_BYTE { $$ = data_append_byte($1, $2); }
| /* empty */ { $$ = empty_data; }
;
subnodes: subnode subnodes {
$$ = chain_node($1, $2);
}
| /* empty */ { $$ = NULL; }
;
subnode: label nodename nodedef { $$ = name_node($3, $2, $1); }
;
nodename: DT_NODENAME { $$ = $1; }
| DT_PROPNAME { $$ = $1; }
;
label: DT_LABEL { $$ = $1; }
| /* empty */ { $$ = NULL; }
;
%%
void yyerror (char const *s)
{
fprintf (stderr, "%s at line %d\n", s, yylloc.first_line);
}