<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>