summaryrefslogtreecommitdiffstats
path: root/tools/cpu/nios2/devices.c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2011-05-17 20:39:40 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2011-05-17 20:39:40 +0000
commitd751cecbb1ca1b7ac0a7bc8492e0e61e6c5fc0c7 (patch)
tree84a74c59b9f7f096e0fae3dd351e5274bf836bb5 /tools/cpu/nios2/devices.c
parent2011-05-17 Joel Sherrill <joel.sherrill@oarcorp.com> (diff)
downloadrtems-d751cecbb1ca1b7ac0a7bc8492e0e61e6c5fc0c7.tar.bz2
* tools/build/.cvsignore, tools/build/ChangeLog,
tools/build/Makefile.am, tools/build/README, tools/build/binpatch.c, tools/build/cklength.c, tools/build/config.h.in, tools/build/configure.ac, tools/build/cvsignore-add.sh, tools/build/doxy-filter, tools/build/eolstrip.c, tools/build/install-if-change.in, tools/build/multigen, tools/build/packhex.c, tools/build/rtems-bin2c.c, tools/build/search-id.sh, tools/build/unhex.c, tools/cpu/.cvsignore, tools/cpu/ChangeLog, tools/cpu/Makefile.am, tools/cpu/configure.ac, tools/cpu/generic/.cvsignore, tools/cpu/generic/ChangeLog, tools/cpu/generic/Makefile.am, tools/cpu/generic/configure.ac, tools/cpu/generic/size_rtems.in, tools/cpu/nios2/.cvsignore, tools/cpu/nios2/ChangeLog, tools/cpu/nios2/Makefile.am, tools/cpu/nios2/README, tools/cpu/nios2/bridges.c, tools/cpu/nios2/bridges.h, tools/cpu/nios2/clocks.c, tools/cpu/nios2/clocks.h, tools/cpu/nios2/configure.ac, tools/cpu/nios2/devices.c, tools/cpu/nios2/devices.h, tools/cpu/nios2/linkcmds.c, tools/cpu/nios2/linkcmds.h, tools/cpu/nios2/memory.c, tools/cpu/nios2/memory.h, tools/cpu/nios2/nios2gen.c, tools/cpu/nios2/output.c, tools/cpu/nios2/output.h, tools/cpu/nios2/ptf.c, tools/cpu/nios2/ptf.h, tools/cpu/nios2/sample.ptf, tools/cpu/sh/.cvsignore, tools/cpu/sh/AUTHORS, tools/cpu/sh/COPYING, tools/cpu/sh/ChangeLog, tools/cpu/sh/Makefile.am, tools/cpu/sh/TODO, tools/cpu/sh/configure.ac, tools/cpu/sh/sci.c, tools/cpu/sh/sci.h, tools/cpu/sh/shgen.c: New files.
Diffstat (limited to 'tools/cpu/nios2/devices.c')
-rw-r--r--tools/cpu/nios2/devices.c132
1 files changed, 132 insertions, 0 deletions
diff --git a/tools/cpu/nios2/devices.c b/tools/cpu/nios2/devices.c
new file mode 100644
index 0000000000..054d1cc29f
--- /dev/null
+++ b/tools/cpu/nios2/devices.c
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2006 Kolja Waschk rtemsdev/ixo.de
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "ptf.h"
+#include "bridges.h"
+#include "devices.h"
+
+void add_device(device_desc **dl, struct ptf *dev)
+{
+ device_desc *eds;
+
+ for(eds = *dl; eds; eds = eds->next)
+ {
+ if(eds->ptf == dev)
+ {
+ eds->slaves++;
+ return;
+ };
+ };
+
+ eds = (device_desc *)malloc(sizeof(device_desc));
+ eds->slaves = 1;
+ eds->ptf = dev;
+ eds->next = *dl;
+ *dl = eds;
+}
+
+void check_and_add_device(struct ptf_item *pi, void *arg)
+{
+ struct ptf *module = pi->item[pi->level-3];
+ struct ptf *sysinfo = pi->item[pi->level-2];
+ char *master_name = pi->item[pi->level]->value;
+
+ struct { char *dm; char *im; device_desc **dl; bus_bridge_pair *bridges; } *dinfo = arg;
+
+ if(is_bridged(dinfo->dm, master_name, dinfo->bridges) ||
+ is_bridged(dinfo->im, master_name, dinfo->bridges))
+ {
+ struct ptf *ni = ptf_alloc_item(item, "N2G_Selected", "1");
+ if(ni != NULL)
+ {
+ ni->next = sysinfo->sub;
+ sysinfo->sub = ni;
+ };
+ add_device(dinfo->dl, module);
+ };
+}
+
+void set_dev_cfgname(struct ptf_item *pi, void *arg)
+{
+ device_desc *dev = arg;
+ dev->cfgname = pi->item[pi->level]->name;
+}
+
+
+device_desc *find_devices(
+ struct ptf *ptf,
+ struct ptf *cfg,
+ struct ptf *cpu,
+ bus_bridge_pair *bridges)
+{
+ struct ptf system = { section, "SYSTEM", 0, 0, 0 };
+ struct ptf module = { section, "MODULE", 0, 0, 0 };
+ struct ptf slave = { section, "SLAVE", 0, 0, 0 };
+ struct ptf syb = { section, "SYSTEM_BUILDER_INFO", 0, 0, 0 };
+ struct ptf maby = { section, "MASTERED_BY", 0, 0, 0 };
+ struct ptf_item brdg = { 5, &system, &module, &slave, &syb, &maby };
+
+ struct ptf modules = { section, "MODULES", 0, 0, 0 };
+ struct ptf named = { item, 0, 0, 0, 0};
+ struct ptf_item devcf = { 2, &modules, &named };
+
+ struct { char *dm; char *im; device_desc **dl; bus_bridge_pair *bridges; } dinfo;
+
+ device_desc *found, *reverse;
+
+ found = NULL;
+
+ add_device(&found, cpu); /* The CPU is "self-connected", add it */
+
+ dinfo.dl = &found;
+ dinfo.bridges = bridges;
+ dinfo.dm = (char *)malloc(strlen(cpu->value)+13);
+ dinfo.im = (char *)malloc(strlen(cpu->value)+20);
+
+ strcpy(dinfo.im, cpu->value);
+ strcat(dinfo.im, "/");
+ strcpy(dinfo.dm, dinfo.im);
+ strcat(dinfo.dm, "data_master");
+ strcat(dinfo.im, "instruction_master");
+
+ /* "Available" is any MODULE with a SLAVE section that is MASTERED_BY
+ either instr_master or data_master of selected CPU, either directly
+ or through a bridge. See code above for more info about bridges.
+ */
+
+ ptf_match(ptf, &brdg, check_and_add_device, &dinfo);
+
+ free(dinfo.dm);
+ free(dinfo.im);
+
+ /* Reverse the linked list */
+
+ reverse = NULL;
+ while(found)
+ {
+ device_desc *tmp = found;
+ found = found->next;
+
+ tmp->next = reverse;
+ reverse = tmp;
+
+ named.value = tmp->ptf->value;
+ tmp->cfgname = NULL;
+ ptf_match(cfg, &devcf, set_dev_cfgname, tmp);
+ if(tmp->cfgname == NULL) tmp->cfgname = ptf_defused_name(tmp->ptf->value);
+ };
+
+ return reverse;
+}
+