[coreboot] proposed change to dtc to allow multiple dts files per single chip
Carl-Daniel Hailfinger
c-d.hailfinger.devel.2006 at gmx.net
Tue Jan 29 18:24:13 CET 2008
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 at gmail.com>
>
Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at 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
More information about the coreboot
mailing list