<p>Furquan Shaikh has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/26800">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">util/sconfig: Add support for multiple device instances<br><br>This change adds support for a device to have multiple instances. This<br>is required to support multidev devices i.e. device with same id<br>existing under the same parent. Currently, multidev devices were<br>handled by adding all the devices to devicetree and then skipping over<br>the nodes by adjusting next and sibling pointers in fold_in. This<br>change fixes this by letting a device hold of list of instances if it<br>is a multidev. Each instance can have its own list of children<br>indicating the child nodes for that instance. Device node in such<br>cases has children pointer set to the first child among all<br>instances.<br><br>BUG=b:80081934<br>TEST=Verified using abuild that all boards compile successfully and<br>static.c generated with and without this change is the same. (In order<br>to compare static.c, count was incremented even when adding device<br>instance).<br><br>Change-Id: Ic8c8a73a247e8e992ab6b1b2cc3131e06fa2e5a1<br>Signed-off-by: Furquan Shaikh <furquan@google.com><br>---<br>M util/sconfig/main.c<br>M util/sconfig/sconfig.h<br>M util/sconfig/sconfig.tab.c_shipped<br>M util/sconfig/sconfig.y<br>4 files changed, 282 insertions(+), 180 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/00/26800/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/util/sconfig/main.c b/util/sconfig/main.c</span><br><span>index b6f2754..04ffb98 100644</span><br><span>--- a/util/sconfig/main.c</span><br><span>+++ b/util/sconfig/main.c</span><br><span>@@ -135,18 +135,23 @@</span><br><span>     return dev;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int device_match(struct device *a, struct device *b)</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * This function returns 1 if device has instances i.e. linkcnt is not</span><br><span style="color: hsl(120, 100%, 40%);">+ * zero. Else, it returns 0.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static int device_has_instance(struct device *d)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   if ((a->bustype == b->bustype) && (a->parent == b->parent)</span><br><span style="color: hsl(0, 100%, 40%);">-      && (a->path_a == b->path_a) && (a->path_b == b->path_b))</span><br><span style="color: hsl(0, 100%, 40%);">-                return 1;</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     return !!d->linkcnt;</span><br><span> }</span><br><span> </span><br><span> void fold_in(struct device *parent)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    struct device *child = parent->children;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct device *child;</span><br><span>        struct device *latest = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  child = device_has_instance(parent) ? parent->last_instance->children</span><br><span style="color: hsl(120, 100%, 40%);">+           : parent->children;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     while (child != latest) {</span><br><span>            if (child->children) {</span><br><span>                    if (!latest)</span><br><span>@@ -179,17 +184,6 @@</span><br><span>   * here to have the next_sibling and latestchild setup correctly.</span><br><span>     */</span><br><span>  fold_in(&root);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     struct device *dev = &root;</span><br><span style="color: hsl(0, 100%, 40%);">- while (dev) {</span><br><span style="color: hsl(0, 100%, 40%);">-           /* skip functions of the same device in sibling chain */</span><br><span style="color: hsl(0, 100%, 40%);">-                while (dev->sibling && dev->sibling->used)</span><br><span style="color: hsl(0, 100%, 40%);">-                     dev->sibling = dev->sibling->sibling;</span><br><span style="color: hsl(0, 100%, 40%);">-          /* skip duplicate function elements in next chain */</span><br><span style="color: hsl(0, 100%, 40%);">-            while (dev->next && dev->next->used)</span><br><span style="color: hsl(0, 100%, 40%);">-                   dev->next = dev->next->next;</span><br><span style="color: hsl(0, 100%, 40%);">-           dev = dev->next_sibling;</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span> }</span><br><span> </span><br><span> char *translate_name(const char *str, translate_t mode)</span><br><span>@@ -274,21 +268,103 @@</span><br><span>       return instance;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * This function creates a new instance of the device. If instances of the</span><br><span style="color: hsl(120, 100%, 40%);">+ * device already exist, then current instance is appended at the end of the</span><br><span style="color: hsl(120, 100%, 40%);">+ * instance list. If this is the first instance, then dev_instance and</span><br><span style="color: hsl(120, 100%, 40%);">+ * last_instance for the device are updated to point to the current instance.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Additionally, linkcnt is incremented to indicate the number of instances that</span><br><span style="color: hsl(120, 100%, 40%);">+ * the device has.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static struct dev_instance *alloc_dev_instance(struct device *d)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct dev_instance *ins = S_ALLOC(sizeof(*ins));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!device_has_instance(d))</span><br><span style="color: hsl(120, 100%, 40%);">+          d->dev_instance = ins;</span><br><span style="color: hsl(120, 100%, 40%);">+     else</span><br><span style="color: hsl(120, 100%, 40%);">+          d->last_instance->next = ins;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ d->last_instance = ins;</span><br><span style="color: hsl(120, 100%, 40%);">+    d->linkcnt++;</span><br><span style="color: hsl(120, 100%, 40%);">+      return ins;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void make_dev_multidev(struct device *d)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct dev_instance *ins = alloc_dev_instance(d);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Make children of device the children of first instance. */</span><br><span style="color: hsl(120, 100%, 40%);">+ ins->children = d->children;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Check if device exists under the provided parent that matches the new device</span><br><span style="color: hsl(120, 100%, 40%);">+ * properties i.e. path, bustype and chip instance. If yes, then make it a</span><br><span style="color: hsl(120, 100%, 40%);">+ * multidev (if not already) and allocate a new instance for it.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static struct device *get_dev(struct device *parent, int path_a, int path_b,</span><br><span style="color: hsl(120, 100%, 40%);">+                       int bustype, struct chip_instance *chip_ins)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * Get children of parent if parent doesn't have instances. Else get the</span><br><span style="color: hsl(120, 100%, 40%);">+   * children of last instance.</span><br><span style="color: hsl(120, 100%, 40%);">+  */</span><br><span style="color: hsl(120, 100%, 40%);">+   struct device *child = device_has_instance(parent) ?</span><br><span style="color: hsl(120, 100%, 40%);">+          parent->last_instance->children : parent->children;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        while (child) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if ((child->path_a == path_a) && (child->path_b == path_b) &&</span><br><span style="color: hsl(120, 100%, 40%);">+               (child->bustype == bustype) &&</span><br><span style="color: hsl(120, 100%, 40%);">+             (child->chip_instance == chip_ins))</span><br><span style="color: hsl(120, 100%, 40%);">+                    break;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              child = child->sibling;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!child)</span><br><span style="color: hsl(120, 100%, 40%);">+           return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * If the matched device does not have any instances yet, then it first</span><br><span style="color: hsl(120, 100%, 40%);">+        * needs to be converted to a multidev device.</span><br><span style="color: hsl(120, 100%, 40%);">+         */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (child->dev_instance == NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+           make_dev_multidev(child);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Now a new instance can be allocated. */</span><br><span style="color: hsl(120, 100%, 40%);">+    alloc_dev_instance(child);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  return child;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct device *new_device(struct device *parent,</span><br><span>                         struct chip_instance *chip_instance,</span><br><span>                         const int bustype, const char *devnum,</span><br><span>                       int enabled)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct device *new_d = new_dev(parent);</span><br><span style="color: hsl(0, 100%, 40%);">- new_d->bustype = bustype;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>         char *tmp;</span><br><span style="color: hsl(0, 100%, 40%);">-      new_d->path_a = strtol(devnum, &tmp, 16);</span><br><span style="color: hsl(120, 100%, 40%);">+      int path_a;</span><br><span style="color: hsl(120, 100%, 40%);">+   int path_b = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct device *new_d;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       path_a = strtol(devnum, &tmp, 16);</span><br><span>       if (*tmp == '.') {</span><br><span>           tmp++;</span><br><span style="color: hsl(0, 100%, 40%);">-          new_d->path_b = strtol(tmp, NULL, 16);</span><br><span style="color: hsl(120, 100%, 40%);">+             path_b = strtol(tmp, NULL, 16);</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* If device is found under parent, no need to allocate new device. */</span><br><span style="color: hsl(120, 100%, 40%);">+        new_d = get_dev(parent, path_a, path_b, bustype, chip_instance);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (new_d)</span><br><span style="color: hsl(120, 100%, 40%);">+            return new_d;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       new_d = new_dev(parent);</span><br><span style="color: hsl(120, 100%, 40%);">+      new_d->bustype = bustype;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        new_d->path_a = path_a;</span><br><span style="color: hsl(120, 100%, 40%);">+    new_d->path_b = path_b;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         char *name = S_ALLOC(10);</span><br><span>    sprintf(name, "_dev%d", new_d->id);</span><br><span>     new_d->name = name;</span><br><span>@@ -296,14 +372,40 @@</span><br><span>       new_d->enabled = enabled;</span><br><span>         new_d->chip_instance = chip_instance;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    if (parent->latestchild) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * If parent is multidev, then update current node's linknum to indicate</span><br><span style="color: hsl(120, 100%, 40%);">+   * which instance of the parent node is the actual parent of current</span><br><span style="color: hsl(120, 100%, 40%);">+   * node.</span><br><span style="color: hsl(120, 100%, 40%);">+       */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (parent->linkcnt)</span><br><span style="color: hsl(120, 100%, 40%);">+               new_d->linknum = parent->linkcnt - 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (parent->latestchild)</span><br><span>          parent->latestchild->next_sibling = new_d;</span><br><span style="color: hsl(0, 100%, 40%);">-                parent->latestchild->sibling = new_d;</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  parent->latestchild = new_d;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     struct device *c;</span><br><span style="color: hsl(120, 100%, 40%);">+     c = device_has_instance(parent) ? parent->last_instance->children :</span><br><span style="color: hsl(120, 100%, 40%);">+                     parent->children;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (c) {</span><br><span style="color: hsl(120, 100%, 40%);">+              while (c->sibling)</span><br><span style="color: hsl(120, 100%, 40%);">+                 c = c->sibling;</span><br><span style="color: hsl(120, 100%, 40%);">+            c->sibling = new_d;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Set children of parent if this is its first child. */</span><br><span>     if (!parent->children)</span><br><span>            parent->children = new_d;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * If parent has instances and the last instance does not have a child,</span><br><span style="color: hsl(120, 100%, 40%);">+        * then set children for last instance.</span><br><span style="color: hsl(120, 100%, 40%);">+        */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (device_has_instance(parent) && !parent->last_instance->children)</span><br><span style="color: hsl(120, 100%, 40%);">+            parent->last_instance->children = new_d;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     lastnode->next = new_d;</span><br><span>   lastnode = new_d;</span><br><span> </span><br><span>@@ -360,29 +462,6 @@</span><br><span>         return new_d;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void alias_siblings(struct device *d)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    while (d) {</span><br><span style="color: hsl(0, 100%, 40%);">-             int link = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-           struct device *cmp = d->next_sibling;</span><br><span style="color: hsl(0, 100%, 40%);">-                while (cmp && (cmp->parent == d->parent) && (cmp->path_a == d->path_a)</span><br><span style="color: hsl(0, 100%, 40%);">-                     && (cmp->path_b == d->path_b)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   if (!cmp->used) {</span><br><span style="color: hsl(0, 100%, 40%);">-                            if (device_match(d, cmp)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                     d->multidev = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                                     cmp->id = d->id;</span><br><span style="color: hsl(0, 100%, 40%);">-                                  cmp->name = d->name;</span><br><span style="color: hsl(0, 100%, 40%);">-                                      cmp->used = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                                       cmp->link = ++link;</span><br><span style="color: hsl(0, 100%, 40%);">-                          }</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                       cmp = cmp->next_sibling;</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-               d = d->next_sibling;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> void add_resource(struct device *dev, int type, int index, int base)</span><br><span> {</span><br><span>      struct resource *r = S_ALLOC(sizeof(struct resource));</span><br><span>@@ -472,21 +551,94 @@</span><br><span> </span><br><span> static void pass0(FILE * fil, struct device *ptr)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    if (ptr->id == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+  if (ptr->id == 0) {</span><br><span>               fprintf(fil, "DEVTREE_CONST struct bus %s_links[];\n",</span><br><span>                     ptr->name);</span><br><span style="color: hsl(120, 100%, 40%);">+                return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if ((ptr->id != 0) && (!ptr->used)) {</span><br><span style="color: hsl(0, 100%, 40%);">-             fprintf(fil, "DEVTREE_CONST static struct device %s;\n",</span><br><span style="color: hsl(120, 100%, 40%);">+    fprintf(fil, "DEVTREE_CONST static struct device %s;\n", ptr->name);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (ptr->rescnt > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            fprintf(fil, "DEVTREE_CONST struct resource %s_res[];\n",</span><br><span>                  ptr->name);</span><br><span style="color: hsl(0, 100%, 40%);">-          if (ptr->rescnt > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                      fprintf(fil,</span><br><span style="color: hsl(0, 100%, 40%);">-                            "DEVTREE_CONST struct resource %s_res[];\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                          ptr->name);</span><br><span style="color: hsl(0, 100%, 40%);">-          if (ptr->children || ptr->multidev)</span><br><span style="color: hsl(120, 100%, 40%);">+     if (ptr->children || device_has_instance(ptr))</span><br><span>                    fprintf(fil, "DEVTREE_CONST struct bus %s_links[];\n",</span><br><span>                             ptr->name);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void emit_resources(FILE *fil, struct device *ptr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     if (ptr->rescnt == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+              return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     int i = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+    fprintf(fil, "DEVTREE_CONST struct resource %s_res[] = {\n", ptr->name);</span><br><span style="color: hsl(120, 100%, 40%);">+ struct resource *r = ptr->res;</span><br><span style="color: hsl(120, 100%, 40%);">+     while (r) {</span><br><span style="color: hsl(120, 100%, 40%);">+           fprintf(fil,</span><br><span style="color: hsl(120, 100%, 40%);">+                  "\t\t{ .flags=IORESOURCE_FIXED | IORESOURCE_ASSIGNED | IORESOURCE_");</span><br><span style="color: hsl(120, 100%, 40%);">+               if (r->type == IRQ)</span><br><span style="color: hsl(120, 100%, 40%);">+                        fprintf(fil, "IRQ");</span><br><span style="color: hsl(120, 100%, 40%);">+                if (r->type == DRQ)</span><br><span style="color: hsl(120, 100%, 40%);">+                        fprintf(fil, "DRQ");</span><br><span style="color: hsl(120, 100%, 40%);">+                if (r->type == IO)</span><br><span style="color: hsl(120, 100%, 40%);">+                 fprintf(fil, "IO");</span><br><span style="color: hsl(120, 100%, 40%);">+         fprintf(fil, ", .index=0x%x, .base=0x%x,", r->index,</span><br><span style="color: hsl(120, 100%, 40%);">+                     r->base);</span><br><span style="color: hsl(120, 100%, 40%);">+          if (r->next)</span><br><span style="color: hsl(120, 100%, 40%);">+                       fprintf(fil, ".next=&%s_res[%d]},\n", ptr->name,</span><br><span style="color: hsl(120, 100%, 40%);">+                             i++);</span><br><span style="color: hsl(120, 100%, 40%);">+         else</span><br><span style="color: hsl(120, 100%, 40%);">+                  fprintf(fil, ".next=NULL },\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            r = r->next;</span><br><span>      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   fprintf(fil, "\t };\n");</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void emit_dev_children(FILE *fil, struct device *ptr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      fprintf(fil, "DEVTREE_CONST struct bus %s_links[] = {\n",</span><br><span style="color: hsl(120, 100%, 40%);">+           ptr->name);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      fprintf(fil, "\t\t[0] = {\n");</span><br><span style="color: hsl(120, 100%, 40%);">+      fprintf(fil, "\t\t\t.link_num = 0,\n");</span><br><span style="color: hsl(120, 100%, 40%);">+     fprintf(fil, "\t\t\t.dev = &%s,\n", ptr->name);</span><br><span style="color: hsl(120, 100%, 40%);">+      fprintf(fil, "\t\t\t.children = &%s,\n", ptr->children->name);</span><br><span style="color: hsl(120, 100%, 40%);">+    fprintf(fil, "\t\t\t.next = NULL,\n");</span><br><span style="color: hsl(120, 100%, 40%);">+      fprintf(fil, "\t\t},\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(fil, "\t};\n");</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void emit_dev_instances(FILE *fil, struct device *ptr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      fprintf(fil, "DEVTREE_CONST struct bus %s_links[] = {\n",</span><br><span style="color: hsl(120, 100%, 40%);">+           ptr->name);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      struct dev_instance *ins = ptr->dev_instance;</span><br><span style="color: hsl(120, 100%, 40%);">+      int count = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      while (ins) {</span><br><span style="color: hsl(120, 100%, 40%);">+         fprintf(fil, "\t\t[%d] = {\n", count);</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(fil, "\t\t\t.link_num = %d,\n", count);</span><br><span style="color: hsl(120, 100%, 40%);">+             fprintf(fil, "\t\t\t.dev = &%s,\n", ptr->name);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (ins->children)</span><br><span style="color: hsl(120, 100%, 40%);">+                 fprintf(fil, "\t\t\t.children = &%s,\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                ins->children->name);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (ins->next)</span><br><span style="color: hsl(120, 100%, 40%);">+                     fprintf(fil, "\t\t\t.next=&%s_links[%d],\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                            ptr->name, count + 1);</span><br><span style="color: hsl(120, 100%, 40%);">+             else</span><br><span style="color: hsl(120, 100%, 40%);">+                  fprintf(fil,</span><br><span style="color: hsl(120, 100%, 40%);">+                          "\t\t\t.next = NULL,\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           fprintf(fil, "\t\t},\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         ins = ins->next;</span><br><span style="color: hsl(120, 100%, 40%);">+           count++;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   fprintf(fil, "\t};\n");</span><br><span> }</span><br><span> </span><br><span> static void pass1(FILE * fil, struct device *ptr)</span><br><span>@@ -494,129 +646,66 @@</span><br><span>     int pin;</span><br><span>     struct chip_instance *chip_ins = ptr->chip_instance;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     if (!ptr->used) {</span><br><span style="color: hsl(0, 100%, 40%);">-            if (ptr->id != 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                    fprintf(fil, "static ");</span><br><span style="color: hsl(0, 100%, 40%);">-              fprintf(fil, "DEVTREE_CONST struct device %s = {\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                  ptr->name);</span><br><span style="color: hsl(0, 100%, 40%);">-          fprintf(fil, "#if !DEVTREE_EARLY\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         fprintf(fil, "\t.ops = %s,\n", (ptr->ops) ? (ptr->ops) : "0");</span><br><span style="color: hsl(0, 100%, 40%);">-                fprintf(fil, "#endif\n");</span><br><span style="color: hsl(0, 100%, 40%);">-             fprintf(fil, "\t.bus = &%s_links[%d],\n", ptr->parent->name,</span><br><span style="color: hsl(0, 100%, 40%);">-                        ptr->parent->link);</span><br><span style="color: hsl(0, 100%, 40%);">-               fprintf(fil, "\t.path = {");</span><br><span style="color: hsl(0, 100%, 40%);">-          fprintf(fil, ptr->path, ptr->path_a, ptr->path_b);</span><br><span style="color: hsl(0, 100%, 40%);">-             fprintf(fil, "},\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         fprintf(fil, "\t.enabled = %d,\n", ptr->enabled);</span><br><span style="color: hsl(0, 100%, 40%);">-          fprintf(fil, "\t.on_mainboard = 1,\n");</span><br><span style="color: hsl(0, 100%, 40%);">-               if (ptr->subsystem_vendor > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                    fprintf(fil, "\t.subsystem_vendor = 0x%04x,\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                               ptr->subsystem_vendor);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (ptr->id != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          fprintf(fil, "static ");</span><br><span style="color: hsl(120, 100%, 40%);">+    fprintf(fil, "DEVTREE_CONST struct device %s = {\n", ptr->name);</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(fil, "#if !DEVTREE_EARLY\n");</span><br><span style="color: hsl(120, 100%, 40%);">+       fprintf(fil, "\t.ops = %s,\n", (ptr->ops) ? (ptr->ops) : "0");</span><br><span style="color: hsl(120, 100%, 40%);">+      fprintf(fil, "#endif\n");</span><br><span style="color: hsl(120, 100%, 40%);">+   fprintf(fil, "\t.bus = &%s_links[%d],\n", ptr->parent->name,</span><br><span style="color: hsl(120, 100%, 40%);">+              ptr->linknum);</span><br><span style="color: hsl(120, 100%, 40%);">+     fprintf(fil, "\t.path = {");</span><br><span style="color: hsl(120, 100%, 40%);">+        fprintf(fil, ptr->path, ptr->path_a, ptr->path_b);</span><br><span style="color: hsl(120, 100%, 40%);">+   fprintf(fil, "},\n");</span><br><span style="color: hsl(120, 100%, 40%);">+       fprintf(fil, "\t.enabled = %d,\n", ptr->enabled);</span><br><span style="color: hsl(120, 100%, 40%);">+        fprintf(fil, "\t.on_mainboard = 1,\n");</span><br><span style="color: hsl(120, 100%, 40%);">+     if (ptr->subsystem_vendor > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          fprintf(fil, "\t.subsystem_vendor = 0x%04x,\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                     ptr->subsystem_vendor);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-          for (pin = 0; pin < 4; pin++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      if (ptr->pci_irq_info[pin].ioapic_irq_pin > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                            fprintf(fil, "\t.pci_irq_info[%d].ioapic_irq_pin = %d,\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                    pin, ptr->pci_irq_info[pin].ioapic_irq_pin);</span><br><span style="color: hsl(120, 100%, 40%);">+       for (pin = 0; pin < 4; pin++) {</span><br><span style="color: hsl(120, 100%, 40%);">+            if (ptr->pci_irq_info[pin].ioapic_irq_pin > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                  fprintf(fil, "\t.pci_irq_info[%d].ioapic_irq_pin = %d,\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                          pin, ptr->pci_irq_info[pin].ioapic_irq_pin);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                     if (ptr->pci_irq_info[pin].ioapic_dst_id > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                             fprintf(fil, "\t.pci_irq_info[%d].ioapic_dst_id = %d,\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                     pin, ptr->pci_irq_info[pin].ioapic_dst_id);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               if (ptr->subsystem_device > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                    fprintf(fil, "\t.subsystem_device = 0x%04x,\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                               ptr->subsystem_device);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              if (ptr->rescnt > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    fprintf(fil, "\t.resource_list = &%s_res[0],\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                          ptr->name);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-               if (ptr->children || ptr->multidev)</span><br><span style="color: hsl(0, 100%, 40%);">-                       fprintf(fil, "\t.link_list = &%s_links[0],\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                            ptr->name);</span><br><span style="color: hsl(0, 100%, 40%);">-          else</span><br><span style="color: hsl(0, 100%, 40%);">-                    fprintf(fil, "\t.link_list = NULL,\n");</span><br><span style="color: hsl(0, 100%, 40%);">-               if (ptr->sibling)</span><br><span style="color: hsl(0, 100%, 40%);">-                    fprintf(fil, "\t.sibling = &%s,\n", ptr->sibling->name);</span><br><span style="color: hsl(0, 100%, 40%);">-            fprintf(fil, "#if !DEVTREE_EARLY\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         fprintf(fil, "\t.chip_ops = &%s_ops,\n", chip_ins->chip->name_underscore);</span><br><span style="color: hsl(0, 100%, 40%);">-          if (chip_ins == &mainboard_instance)</span><br><span style="color: hsl(0, 100%, 40%);">-                        fprintf(fil, "\t.name = mainboard_name,\n");</span><br><span style="color: hsl(0, 100%, 40%);">-          fprintf(fil, "#endif\n");</span><br><span style="color: hsl(0, 100%, 40%);">-             if (chip_ins->chip->chiph_exists)</span><br><span style="color: hsl(0, 100%, 40%);">-                 fprintf(fil, "\t.chip_info = &%s_info_%d,\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                             chip_ins->chip->name_underscore, chip_ins->id);</span><br><span style="color: hsl(0, 100%, 40%);">-                if (ptr->next)</span><br><span style="color: hsl(0, 100%, 40%);">-                       fprintf(fil, "\t.next=&%s\n", ptr->next->name);</span><br><span style="color: hsl(0, 100%, 40%);">-             fprintf(fil, "};\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               if (ptr->pci_irq_info[pin].ioapic_dst_id > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                   fprintf(fil, "\t.pci_irq_info[%d].ioapic_dst_id = %d,\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                           pin, ptr->pci_irq_info[pin].ioapic_dst_id);</span><br><span>       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (ptr->subsystem_device > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          fprintf(fil, "\t.subsystem_device = 0x%04x,\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                     ptr->subsystem_device);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         if (ptr->rescnt > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-            int i = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-              fprintf(fil, "DEVTREE_CONST struct resource %s_res[] = {\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                fprintf(fil, "\t.resource_list = &%s_res[0],\n",</span><br><span>                       ptr->name);</span><br><span style="color: hsl(0, 100%, 40%);">-          struct resource *r = ptr->res;</span><br><span style="color: hsl(0, 100%, 40%);">-               while (r) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     fprintf(fil,</span><br><span style="color: hsl(0, 100%, 40%);">-                            "\t\t{ .flags=IORESOURCE_FIXED | IORESOURCE_ASSIGNED | IORESOURCE_");</span><br><span style="color: hsl(0, 100%, 40%);">-                 if (r->type == IRQ)</span><br><span style="color: hsl(0, 100%, 40%);">-                          fprintf(fil, "IRQ");</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (r->type == DRQ)</span><br><span style="color: hsl(0, 100%, 40%);">-                          fprintf(fil, "DRQ");</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (r->type == IO)</span><br><span style="color: hsl(0, 100%, 40%);">-                           fprintf(fil, "IO");</span><br><span style="color: hsl(0, 100%, 40%);">-                   fprintf(fil, ", .index=0x%x, .base=0x%x,", r->index,</span><br><span style="color: hsl(0, 100%, 40%);">-                               r->base);</span><br><span style="color: hsl(0, 100%, 40%);">-                    if (r->next)</span><br><span style="color: hsl(0, 100%, 40%);">-                         fprintf(fil, ".next=&%s_res[%d]},\n", ptr->name,</span><br><span style="color: hsl(0, 100%, 40%);">-                                       i++);</span><br><span style="color: hsl(0, 100%, 40%);">-                   else</span><br><span style="color: hsl(0, 100%, 40%);">-                            fprintf(fil, ".next=NULL },\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                      r = r->next;</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-               fprintf(fil, "\t };\n");</span><br><span>   }</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!ptr->used && (ptr->children || ptr->multidev)) {</span><br><span style="color: hsl(0, 100%, 40%);">-          fprintf(fil, "DEVTREE_CONST struct bus %s_links[] = {\n",</span><br><span style="color: hsl(120, 100%, 40%);">+   if (ptr->children || device_has_instance(ptr))</span><br><span style="color: hsl(120, 100%, 40%);">+             fprintf(fil, "\t.link_list = &%s_links[0],\n",</span><br><span>                         ptr->name);</span><br><span style="color: hsl(0, 100%, 40%);">-          if (ptr->multidev) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 struct device *d = ptr;</span><br><span style="color: hsl(0, 100%, 40%);">-                 while (d) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             if (device_match(d, ptr)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                     fprintf(fil, "\t\t[%d] = {\n", d->link);</span><br><span style="color: hsl(0, 100%, 40%);">-                                   fprintf(fil, "\t\t\t.link_num = %d,\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                               d->link);</span><br><span style="color: hsl(0, 100%, 40%);">-                                    fprintf(fil, "\t\t\t.dev = &%s,\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                               d->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                                    if (d->children)</span><br><span style="color: hsl(0, 100%, 40%);">-                                             fprintf(fil,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                    "\t\t\t.children = &%s,\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                       d->children->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                                       if (d->next_sibling</span><br><span style="color: hsl(0, 100%, 40%);">-                                      && device_match(d->next_sibling,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                     ptr))</span><br><span style="color: hsl(0, 100%, 40%);">-                                               fprintf(fil,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                    "\t\t\t.next=&%s_links[%d],\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                   d->name, d->link + 1);</span><br><span style="color: hsl(0, 100%, 40%);">-                                    else</span><br><span style="color: hsl(0, 100%, 40%);">-                                            fprintf(fil,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                    "\t\t\t.next = NULL,\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                                     fprintf(fil, "\t\t},\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                             }</span><br><span style="color: hsl(0, 100%, 40%);">-                               d = d->next_sibling;</span><br><span style="color: hsl(0, 100%, 40%);">-                 }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (ptr->children) {</span><br><span style="color: hsl(0, 100%, 40%);">-                         fprintf(fil, "\t\t[0] = {\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                                fprintf(fil, "\t\t\t.link_num = 0,\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                               fprintf(fil, "\t\t\t.dev = &%s,\n", ptr->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                                fprintf(fil, "\t\t\t.children = &%s,\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                  ptr->children->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                             fprintf(fil, "\t\t\t.next = NULL,\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                                fprintf(fil, "\t\t},\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                     }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-               fprintf(fil, "\t};\n");</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(120, 100%, 40%);">+     else</span><br><span style="color: hsl(120, 100%, 40%);">+          fprintf(fil, "\t.link_list = NULL,\n");</span><br><span style="color: hsl(120, 100%, 40%);">+     if (ptr->sibling)</span><br><span style="color: hsl(120, 100%, 40%);">+          fprintf(fil, "\t.sibling = &%s,\n", ptr->sibling->name);</span><br><span style="color: hsl(120, 100%, 40%);">+  fprintf(fil, "#if !DEVTREE_EARLY\n");</span><br><span style="color: hsl(120, 100%, 40%);">+       fprintf(fil, "\t.chip_ops = &%s_ops,\n", chip_ins->chip->name_underscore);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (chip_ins == &mainboard_instance)</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(fil, "\t.name = mainboard_name,\n");</span><br><span style="color: hsl(120, 100%, 40%);">+        fprintf(fil, "#endif\n");</span><br><span style="color: hsl(120, 100%, 40%);">+   if (chip_ins->chip->chiph_exists)</span><br><span style="color: hsl(120, 100%, 40%);">+               fprintf(fil, "\t.chip_info = &%s_info_%d,\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                   chip_ins->chip->name_underscore, chip_ins->id);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (ptr->next)</span><br><span style="color: hsl(120, 100%, 40%);">+             fprintf(fil, "\t.next=&%s\n", ptr->next->name);</span><br><span style="color: hsl(120, 100%, 40%);">+   fprintf(fil, "};\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     emit_resources(fil, ptr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (device_has_instance(ptr))</span><br><span style="color: hsl(120, 100%, 40%);">+         emit_dev_instances(fil, ptr);</span><br><span style="color: hsl(120, 100%, 40%);">+ else if(ptr->children)</span><br><span style="color: hsl(120, 100%, 40%);">+             emit_dev_children(fil, ptr);</span><br><span> }</span><br><span> </span><br><span> static void walk_device_tree(FILE * fil, struct device *ptr,</span><br><span>diff --git a/util/sconfig/sconfig.h b/util/sconfig/sconfig.h</span><br><span>index 2bb816d..76913c5 100644</span><br><span>--- a/util/sconfig/sconfig.h</span><br><span>+++ b/util/sconfig/sconfig.h</span><br><span>@@ -77,13 +77,18 @@</span><br><span>     struct chip *next;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct dev_instance {</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Pointer to first child of this instance. */</span><br><span style="color: hsl(120, 100%, 40%);">+        struct device *children;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Pointer to next instance of the same device. */</span><br><span style="color: hsl(120, 100%, 40%);">+    struct dev_instance *next;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct device;</span><br><span> struct device {</span><br><span>        int id;</span><br><span>      int enabled;</span><br><span style="color: hsl(0, 100%, 40%);">-    int used;</span><br><span style="color: hsl(0, 100%, 40%);">-       int multidev;</span><br><span style="color: hsl(0, 100%, 40%);">-   int link;</span><br><span>    int rescnt;</span><br><span>  int subsystem_vendor;</span><br><span>        int subsystem_device;</span><br><span>@@ -97,6 +102,12 @@</span><br><span>  struct pci_irq_info pci_irq_info[4];</span><br><span> </span><br><span>     struct device *parent;</span><br><span style="color: hsl(120, 100%, 40%);">+        /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * Indicates which instance of parent is the true parent of this node,</span><br><span style="color: hsl(120, 100%, 40%);">+         * if parent is multidev. Else, set to 0.</span><br><span style="color: hsl(120, 100%, 40%);">+      */</span><br><span style="color: hsl(120, 100%, 40%);">+   int linknum;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       struct device *next;</span><br><span>         struct device *children;</span><br><span>     struct device *latestchild;</span><br><span>@@ -105,6 +116,11 @@</span><br><span>   struct resource *res;</span><br><span> </span><br><span>    struct chip_instance *chip_instance;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Handle multiple devices with same id under the same parent. */</span><br><span style="color: hsl(120, 100%, 40%);">+     int linkcnt;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct dev_instance *dev_instance;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct dev_instance *last_instance;</span><br><span> };</span><br><span> </span><br><span> extern struct device *head;</span><br><span>@@ -117,7 +133,6 @@</span><br><span>                     struct chip_instance *chip_instance,</span><br><span>                         const int bustype, const char *devnum,</span><br><span>                       int enabled);</span><br><span style="color: hsl(0, 100%, 40%);">-void alias_siblings(struct device *d);</span><br><span> void add_resource(struct device *dev, int type, int index, int base);</span><br><span> void add_pci_subsystem_ids(struct device *dev, int vendor, int device,</span><br><span>                        int inherit);</span><br><span>diff --git a/util/sconfig/sconfig.tab.c_shipped b/util/sconfig/sconfig.tab.c_shipped</span><br><span>index 3f0e0af..61f3b50 100644</span><br><span>--- a/util/sconfig/sconfig.tab.c_shipped</span><br><span>+++ b/util/sconfig/sconfig.tab.c_shipped</span><br><span>@@ -487,8 +487,8 @@</span><br><span> static const yytype_uint8 yyrline[] =</span><br><span> {</span><br><span>        0,    36,    36,    36,    38,    38,    38,    38,    40,    40,</span><br><span style="color: hsl(0, 100%, 40%);">-      40,    40,    40,    40,    42,    42,    51,    51,    61,    64,</span><br><span style="color: hsl(0, 100%, 40%);">-      67,    70,    73</span><br><span style="color: hsl(120, 100%, 40%);">+      40,    40,    40,    40,    42,    42,    51,    51,    60,    63,</span><br><span style="color: hsl(120, 100%, 40%);">+      66,    69,    72</span><br><span> };</span><br><span> #endif</span><br><span> </span><br><span>@@ -1329,7 +1329,6 @@</span><br><span>     {</span><br><span>   cur_parent = (yyvsp[-2].device)->parent;</span><br><span>  fold_in((yyvsp[-2].device));</span><br><span style="color: hsl(0, 100%, 40%);">-    alias_siblings((yyvsp[-2].device)->children);</span><br><span> }</span><br><span> </span><br><span>     break;</span><br><span>diff --git a/util/sconfig/sconfig.y b/util/sconfig/sconfig.y</span><br><span>index a355c77..37ac95f 100755</span><br><span>--- a/util/sconfig/sconfig.y</span><br><span>+++ b/util/sconfig/sconfig.y</span><br><span>@@ -55,7 +55,6 @@</span><br><span>     devicechildren END {</span><br><span>         cur_parent = $<device>5->parent;</span><br><span>    fold_in($<device>5);</span><br><span style="color: hsl(0, 100%, 40%);">-      alias_siblings($<device>5->children);</span><br><span> };</span><br><span> </span><br><span> resource: RESOURCE NUMBER /* == resnum */ EQUALS NUMBER /* == resval */</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/26800">change 26800</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/26800"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ic8c8a73a247e8e992ab6b1b2cc3131e06fa2e5a1 </div>
<div style="display:none"> Gerrit-Change-Number: 26800 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Furquan Shaikh <furquan@google.com> </div>