On 29.01.2008 17:44, ron minnich wrote:
Second try.
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.
Index: util/dtc/dtc.c
--- util/dtc/dtc.c (revision 565) +++ util/dtc/dtc.c (working copy) @@ -61,21 +61,47 @@ fill_fullpaths(child, tree->fullpath); }
-static FILE *dtc_open_file(char *fname) +/* How stupid is POSIX? This stupid: you can fopen a directory if mode
- is "r", but then there is very little you can do with it except get errors.
- This function now makes sure that the thing you open is a file.
- */
+FILE *fopenfile(char *fname) {
- FILE *f;
- FILE *f = NULL;
- if (streq(fname, "-"))
- if (streq(fname, "-")){ f = stdin;
- else
- } else {
struct stat buf;
if (stat(fname, &buf) < 0) {
errno = EISDIR;
goto no;
}
if (! S_ISREG(buf.st_mode)){
errno = EISDIR;
goto no;
}
- f = fopen(fname, "r");
- }
+no:
- return f;
+}
+FILE *dtc_open_file(char *fname) +{
FILE *f = fopenfile(fname);
if (! f) die("Couldn't open "%s": %s\n", fname, strerror(errno));
return f;
}
static void usage(void) { fprintf(stderr, "Usage:\n"); Index: util/dtc/dtc.h =================================================================== --- util/dtc/dtc.h (revision 565) +++ util/dtc/dtc.h (working copy) @@ -31,6 +31,8 @@ #include <errno.h> #include <unistd.h> #include <netinet/in.h> +#include <sys/types.h> +#include <sys/stat.h>
/* also covers (part of?) linux's byteswap.h functionality */ #include "endian.h" @@ -236,5 +238,6 @@
char *join_path(char *path, char *name); void fill_fullpaths(struct node *tree, char *prefix);
+FILE *fopenfile(char *fname); +FILE *dtc_open_file(char *fname); #endif /* _DTC_H */ Index: util/dtc/dtc-parser.y =================================================================== --- util/dtc/dtc-parser.y (revision 565) +++ util/dtc/dtc-parser.y (working copy) @@ -121,17 +121,16 @@ config: DT_CONFIG '(' includepath { void switchin(FILE *f);
/* switch ... */
char path[1024]; 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. */
sprintf(path, "%s/dts", $3.val);
f = fopen(path, "r");
f = fopenfile(name); if (! f){
perror(path);
perror(name); exit(1); } switchin(f);
Index: southbridge/amd/cs5536/cs5536.c
--- southbridge/amd/cs5536/cs5536.c (revision 565) +++ southbridge/amd/cs5536/cs5536.c (working copy) @@ -172,7 +172,7 @@
- @param sb Southbridge config structure.
*/ -static void lpc_init(struct southbridge_amd_cs5536_config *sb) +static void lpc_init(struct southbridge_amd_cs5536_dts_config *sb) { struct msr msr;
@@ -220,7 +220,7 @@
- @param sb Southbridge config structure.
*/ -static void uarts_init(struct southbridge_amd_cs5536_config *sb) +static void uarts_init(struct southbridge_amd_cs5536_dts_config *sb) { struct msr msr; u16 addr = 0; @@ -383,7 +383,7 @@
- @param sb Southbridge config structure.
*/ -static void enable_USB_port4(struct southbridge_amd_cs5536_config *sb) +static void enable_USB_port4(struct southbridge_amd_cs5536_dts_config *sb) { u32 *bar; struct msr msr; @@ -475,7 +475,7 @@ { struct device *dev; struct msr msr;
- struct southbridge_amd_cs5536_config *sb;
struct southbridge_amd_cs5536_dts_config *sb; const struct msrinit *csi;
post_code(P80_CHIPSET_INIT);
@@ -486,7 +486,7 @@ __FUNCTION__); return; }
- sb = (struct southbridge_amd_cs5536_config *)dev->device_configuration;
- sb = (struct southbridge_amd_cs5536_dts_config *)dev->device_configuration;
#if 0 if (!IsS3Resume()) @@ -548,8 +548,8 @@ */ static void southbridge_init(struct device *dev) {
- struct southbridge_amd_cs5536_config *sb =
(struct southbridge_amd_cs5536_config *)dev->device_configuration;
struct southbridge_amd_cs5536_dts_config *sb =
(struct southbridge_amd_cs5536_dts_config *)dev->device_configuration;
/*
- struct device *gpiodev;
struct southbridge_amd_cs5536_dts_config is a rather ling name. While I agree that we want to reflect the name of the dts in the name of the struct, we probably want to keep the name as short as possible. Since _dts is already part of the struct name, maybe we can remove the _config from the end.
Regards, Carl-Daniel