<p>Furquan Shaikh has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/26739">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">util/sconfig: Get rid of struct header<br><br>Now that chips and devices are treated differently in sconfig, this<br>change gets rid of struct header and add_header function which were<br>responsible for maintaining list of headers that need to be added to<br>static.c.<br><br>Instead, struct chip is re-factored into struct chip and<br>struct chip_instance, where chip is a list of unique chips required by<br>the mainboard whereas chip_instance is an instance of the chip. One<br>chip can have multiple instances dependending upon the devices in the<br>system. Also, struct device is updated to hold a pointer to chip<br>instance instead of the chip structure. This unique list of chips is<br>then used to add appropriate headers to static.c<br><br>BUG=b:80081934<br>TEST=Verified using abuild that all boards compile successfully.<br><br>Change-Id: I6fccdf7c361b4f55a831195adcda9b21932755aa<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, 135 insertions(+), 111 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/39/26739/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 8287cce..32d7aac 100644</span><br><span>--- a/util/sconfig/main.c</span><br><span>+++ b/util/sconfig/main.c</span><br><span>@@ -22,7 +22,7 @@</span><br><span> </span><br><span> struct device *head, *lastdev;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static struct chip *chip_head;</span><br><span style="color: hsl(120, 100%, 40%);">+static struct chip chip_header;</span><br><span> </span><br><span> /*</span><br><span>  * This is intentionally shared between chip and device structure ids because it</span><br><span>@@ -38,15 +38,24 @@</span><br><span> } translate_t;</span><br><span> </span><br><span> static struct device root;</span><br><span style="color: hsl(0, 100%, 40%);">-static struct chip mainboard = {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct chip_instance mainboard_instance;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct chip mainboard_chip = {</span><br><span>     .name = "mainboard",</span><br><span>       .name_underscore = "mainboard",</span><br><span style="color: hsl(120, 100%, 40%);">+     .instance = &mainboard_instance,</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 struct chip_instance mainboard_instance = {</span><br><span style="color: hsl(120, 100%, 40%);">+        .id = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+      .chip = &mainboard_chip,</span><br><span> };</span><br><span> </span><br><span> static struct device root = {</span><br><span>      .name = "dev_root",</span><br><span>        .id = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-        .chip = &mainboard,</span><br><span style="color: hsl(120, 100%, 40%);">+       .chip_instance = &mainboard_instance,</span><br><span>    .path = " .type = DEVICE_PATH_ROOT ",</span><br><span>      .ops = "&default_dev_ops_root",</span><br><span>        .parent = &root,</span><br><span>@@ -205,14 +214,28 @@</span><br><span>         return b;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct chip *new_chip(char *path)</span><br><span style="color: hsl(120, 100%, 40%);">+static struct chip *get_chip(char *path)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      struct chip *new_chip = S_ALLOC(sizeof(*new_chip));</span><br><span style="color: hsl(120, 100%, 40%);">+   struct chip *h = &chip_header;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  new_chip->id = ++count;</span><br><span style="color: hsl(120, 100%, 40%);">+    while (h->next) {</span><br><span style="color: hsl(120, 100%, 40%);">+          int result = strcmp(path, h->next->name);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (result == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                      return h->next;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if (result < 0)</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%);">+              h = h->next;</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%);">+   struct chip *new_chip = S_ALLOC(sizeof(struct chip));</span><br><span style="color: hsl(120, 100%, 40%);">+ new_chip->next = h->next;</span><br><span style="color: hsl(120, 100%, 40%);">+       h->next = new_chip;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     new_chip->chiph_exists = 1;</span><br><span>       new_chip->name = path;</span><br><span style="color: hsl(0, 100%, 40%);">-       new_chip->name_underscore = translate_name(new_chip->name, UNSLASH);</span><br><span style="color: hsl(120, 100%, 40%);">+    new_chip->name_underscore = translate_name(path, UNSLASH);</span><br><span> </span><br><span>    struct stat st;</span><br><span>      char *chip_h = S_ALLOC(strlen(path) + 18);</span><br><span>@@ -235,13 +258,24 @@</span><br><span> </span><br><span>       free(chip_h);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       new_chip->next = chip_head;</span><br><span style="color: hsl(0, 100%, 40%);">-  chip_head = new_chip;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>        return new_chip;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct device *new_device(struct device *parent, struct chip *chip,</span><br><span style="color: hsl(120, 100%, 40%);">+struct chip_instance *new_chip_instance(char *path)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct chip *chip = get_chip(path);</span><br><span style="color: hsl(120, 100%, 40%);">+   struct chip_instance *instance = S_ALLOC(sizeof(*instance));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        instance->id = ++count;</span><br><span style="color: hsl(120, 100%, 40%);">+    instance->chip = chip;</span><br><span style="color: hsl(120, 100%, 40%);">+     instance->next = chip->instance;</span><br><span style="color: hsl(120, 100%, 40%);">+        chip->instance = instance;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       return instance;</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%);">+struct device *new_device(struct device *parent,</span><br><span style="color: hsl(120, 100%, 40%);">+                         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>@@ -260,7 +294,7 @@</span><br><span>    new_d->name = name;</span><br><span> </span><br><span>   new_d->enabled = enabled;</span><br><span style="color: hsl(0, 100%, 40%);">-    new_d->chip = chip;</span><br><span style="color: hsl(120, 100%, 40%);">+        new_d->chip_instance = chip_instance;</span><br><span> </span><br><span>         if (parent->latestchild) {</span><br><span>                parent->latestchild->next_sibling = new_d;</span><br><span>@@ -367,14 +401,14 @@</span><br><span>     dev->rescnt++;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void add_register(struct chip *chip, char *name, char *val)</span><br><span style="color: hsl(120, 100%, 40%);">+void add_register(struct chip_instance *chip_instance, char *name, char *val)</span><br><span> {</span><br><span>    struct reg *r = S_ALLOC(sizeof(struct reg));</span><br><span> </span><br><span>     r->key = name;</span><br><span>    r->value = val;</span><br><span style="color: hsl(0, 100%, 40%);">-      if (chip->reg) {</span><br><span style="color: hsl(0, 100%, 40%);">-             struct reg *head = chip->reg;</span><br><span style="color: hsl(120, 100%, 40%);">+      if (chip_instance->reg) {</span><br><span style="color: hsl(120, 100%, 40%);">+          struct reg *head = chip_instance->reg;</span><br><span>            // sorting to be equal to sconfig's behaviour</span><br><span>            int sort = strcmp(r->key, head->key);</span><br><span>          if (sort == 0) {</span><br><span>@@ -383,7 +417,7 @@</span><br><span>               }</span><br><span>            if (sort < 0) {</span><br><span>                   r->next = head;</span><br><span style="color: hsl(0, 100%, 40%);">-                      chip->reg = r;</span><br><span style="color: hsl(120, 100%, 40%);">+                     chip_instance->reg = r;</span><br><span>           } else {</span><br><span>                     while ((head->next)</span><br><span>                              && (strcmp(head->next->key, r->key) < 0))</span><br><span>@@ -392,7 +426,7 @@</span><br><span>                   head->next = r;</span><br><span>           }</span><br><span>    } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                chip->reg = r;</span><br><span style="color: hsl(120, 100%, 40%);">+             chip_instance->reg = r;</span><br><span>   }</span><br><span> }</span><br><span> </span><br><span>@@ -458,6 +492,7 @@</span><br><span> static void pass1(FILE * fil, struct device *ptr)</span><br><span> {</span><br><span>   int pin;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct chip_instance *chip_ins = ptr->chip_instance;</span><br><span> </span><br><span>  if (!ptr->used) {</span><br><span>                 if (ptr->id != 0)</span><br><span>@@ -504,13 +539,13 @@</span><br><span>                 if (ptr->sibling)</span><br><span>                         fprintf(fil, "\t.sibling = &%s,\n", ptr->sibling->name);</span><br><span>                 fprintf(fil, "#if !DEVTREE_EARLY\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         fprintf(fil, "\t.chip_ops = &%s_ops,\n", ptr->chip->name_underscore);</span><br><span style="color: hsl(0, 100%, 40%);">-               if (ptr->chip == &mainboard)</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>                     fprintf(fil, "\t.name = mainboard_name,\n");</span><br><span>               fprintf(fil, "#endif\n");</span><br><span style="color: hsl(0, 100%, 40%);">-             if (ptr->chip->chiph_exists)</span><br><span style="color: hsl(120, 100%, 40%);">+            if (chip_ins->chip->chiph_exists)</span><br><span>                      fprintf(fil, "\t.chip_info = &%s_info_%d,\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                             ptr->chip->name_underscore, ptr->chip->id);</span><br><span style="color: hsl(120, 100%, 40%);">+                               chip_ins->chip->name_underscore, chip_ins->id);</span><br><span>             if (ptr->nextdev)</span><br><span>                         fprintf(fil, "\t.next=&%s\n", ptr->nextdev->name);</span><br><span>               fprintf(fil, "};\n");</span><br><span>@@ -594,89 +629,70 @@</span><br><span>      } while (ptr);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void add_header(struct chip *chip, struct header *h)</span><br><span style="color: hsl(120, 100%, 40%);">+static void emit_chip_headers(FILE *fil)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       int include_exists = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- while (h->next) {</span><br><span style="color: hsl(0, 100%, 40%);">-            int result = strcmp(chip->name, h->next->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                if (result == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      include_exists = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                     break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-               if (result < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                      break;</span><br><span style="color: hsl(0, 100%, 40%);">-          h = h->next;</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 (!include_exists) {</span><br><span style="color: hsl(0, 100%, 40%);">-          struct header *tmp = h->next;</span><br><span style="color: hsl(0, 100%, 40%);">-                h->next = S_ALLOC(sizeof(struct header));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            h->next->chiph_exists = chip->chiph_exists;</span><br><span style="color: hsl(0, 100%, 40%);">-            h->next->name = chip->name;</span><br><span style="color: hsl(0, 100%, 40%);">-            h->next->next = tmp;</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 style="color: hsl(0, 100%, 40%);">-static void emit_headers(FILE *fil)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  struct header *h;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct chip *chip;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct header headers = {};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     for (chip = chip_head; chip; chip = chip->next)</span><br><span style="color: hsl(0, 100%, 40%);">-              add_header(chip, &headers);</span><br><span style="color: hsl(120, 100%, 40%);">+       struct chip *chip = chip_header.next;</span><br><span> </span><br><span>    fprintf(fil, "#include <device/device.h>\n");</span><br><span>        fprintf(fil, "#include <device/pci.h>\n");</span><br><span style="color: hsl(0, 100%, 40%);">-      h = &headers;</span><br><span style="color: hsl(0, 100%, 40%);">-       while (h->next) {</span><br><span style="color: hsl(0, 100%, 40%);">-            h = h->next;</span><br><span style="color: hsl(0, 100%, 40%);">-         if (h->chiph_exists)</span><br><span style="color: hsl(0, 100%, 40%);">-                 fprintf(fil, "#include \"%s/chip.h\"\n", h->name);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   while (chip) {</span><br><span style="color: hsl(120, 100%, 40%);">+                if (chip->chiph_exists)</span><br><span style="color: hsl(120, 100%, 40%);">+                    fprintf(fil, "#include \"%s/chip.h\"\n", chip->name);</span><br><span style="color: hsl(120, 100%, 40%);">+          chip = chip->next;</span><br><span>        }</span><br><span>    fprintf(fil, "\n#if !DEVTREE_EARLY\n");</span><br><span>    fprintf(fil,</span><br><span>                 "__attribute__((weak)) struct chip_operations mainboard_ops = {};\n");</span><br><span style="color: hsl(0, 100%, 40%);">-        h = &headers;</span><br><span style="color: hsl(0, 100%, 40%);">-       while (h->next) {</span><br><span style="color: hsl(0, 100%, 40%);">-            h = h->next;</span><br><span style="color: hsl(0, 100%, 40%);">-         char *name_underscore = translate_name(h->name, UNSLASH);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        chip = chip_header.next;</span><br><span style="color: hsl(120, 100%, 40%);">+      while (chip) {</span><br><span>               fprintf(fil,</span><br><span>                         "__attribute__((weak)) struct chip_operations %s_ops = {};\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                        name_underscore);</span><br><span style="color: hsl(0, 100%, 40%);">-               free(name_underscore);</span><br><span style="color: hsl(120, 100%, 40%);">+                        chip->name_underscore);</span><br><span style="color: hsl(120, 100%, 40%);">+            chip = chip->next;</span><br><span>        }</span><br><span>    fprintf(fil, "#endif\n");</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void emit_chip_instance(FILE *fil, struct chip_instance *instance)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    if (instance->reg) {</span><br><span style="color: hsl(120, 100%, 40%);">+               fprintf(fil,</span><br><span style="color: hsl(120, 100%, 40%);">+                  "DEVTREE_CONST struct %s_config %s_info_%d = {\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  instance->chip->name_underscore,</span><br><span style="color: hsl(120, 100%, 40%);">+                        instance->chip->name_underscore,</span><br><span style="color: hsl(120, 100%, 40%);">+                        instance->id);</span><br><span style="color: hsl(120, 100%, 40%);">+             struct reg *r = instance->reg;</span><br><span style="color: hsl(120, 100%, 40%);">+             while (r) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   fprintf(fil, "\t.%s = %s,\n", r->key, r->value);</span><br><span style="color: hsl(120, 100%, 40%);">+                      r = r->next;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+             fprintf(fil, "};\n\n");</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%);">+                  "DEVTREE_CONST struct %s_config %s_info_%d = { };\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                       instance->chip->name_underscore,</span><br><span style="color: hsl(120, 100%, 40%);">+                        instance->chip->name_underscore,</span><br><span style="color: hsl(120, 100%, 40%);">+                        instance->id);</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> static void emit_chips(FILE *fil)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        struct chip *chip;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct chip *chip = chip_header.next;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct chip_instance *instance;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     emit_headers(fil);</span><br><span style="color: hsl(120, 100%, 40%);">+    emit_chip_headers(fil);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     for (chip = chip_head; chip; chip = chip->next) {</span><br><span style="color: hsl(120, 100%, 40%);">+  for (; chip; chip = chip->next) {</span><br><span>                 if (!chip->chiph_exists)</span><br><span>                  continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           if (chip->reg) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     fprintf(fil,</span><br><span style="color: hsl(0, 100%, 40%);">-                            "DEVTREE_CONST struct %s_config %s_info_%d = {\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                            chip->name_underscore, chip->name_underscore,</span><br><span style="color: hsl(0, 100%, 40%);">-                             chip->id);</span><br><span style="color: hsl(0, 100%, 40%);">-                   struct reg *r = chip->reg;</span><br><span style="color: hsl(0, 100%, 40%);">-                   while (r) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             fprintf(fil, "\t.%s = %s,\n", r->key, r->value);</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, "};\n\n");</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%);">-                            "DEVTREE_CONST struct %s_config %s_info_%d = { };\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                         chip->name_underscore, chip->name_underscore,</span><br><span style="color: hsl(0, 100%, 40%);">-                             chip->id);</span><br><span style="color: hsl(120, 100%, 40%);">+         instance = chip->instance;</span><br><span style="color: hsl(120, 100%, 40%);">+         while (instance) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    emit_chip_instance(fil, instance);</span><br><span style="color: hsl(120, 100%, 40%);">+                    instance = instance->next;</span><br><span>                }</span><br><span>    }</span><br><span> }</span><br><span>diff --git a/util/sconfig/sconfig.h b/util/sconfig/sconfig.h</span><br><span>index b9df91e..33176ae 100644</span><br><span>--- a/util/sconfig/sconfig.h</span><br><span>+++ b/util/sconfig/sconfig.h</span><br><span>@@ -42,13 +42,25 @@</span><br><span>    int ioapic_dst_id;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct chip {</span><br><span style="color: hsl(120, 100%, 40%);">+struct chip;</span><br><span style="color: hsl(120, 100%, 40%);">+struct chip_instance {</span><br><span>      /*</span><br><span>    * Monotonically increasing ID for each newly allocated</span><br><span>       * node(chip/device).</span><br><span>         */</span><br><span>  int id;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   /* Pointer to registers for this chip. */</span><br><span style="color: hsl(120, 100%, 40%);">+     struct reg *reg;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Pointer to chip of which this is instance. */</span><br><span style="color: hsl(120, 100%, 40%);">+      struct chip *chip;</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 chip. */</span><br><span style="color: hsl(120, 100%, 40%);">+      struct chip_instance *next;</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%);">+struct chip {</span><br><span>     /* Indicates if chip header exists for this chip. */</span><br><span>         int chiph_exists;</span><br><span> </span><br><span>@@ -58,8 +70,8 @@</span><br><span>    /* Name of current chip normalized to _. */</span><br><span>  char *name_underscore;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      /* Pointer to registers for this chip. */</span><br><span style="color: hsl(0, 100%, 40%);">-       struct reg *reg;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Pointer to first instance of this chip. */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct chip_instance *instance;</span><br><span> </span><br><span>  /* Pointer to next chip. */</span><br><span>  struct chip *next;</span><br><span>@@ -93,28 +105,21 @@</span><br><span>    struct device *sibling;</span><br><span>      struct resource *res;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       struct chip *chip;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct chip_instance *chip_instance;</span><br><span> };</span><br><span> </span><br><span> extern struct device *head;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct header;</span><br><span style="color: hsl(0, 100%, 40%);">-struct header {</span><br><span style="color: hsl(0, 100%, 40%);">-  char *name;</span><br><span style="color: hsl(0, 100%, 40%);">-     int chiph_exists;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct header *next;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> void fold_in(struct device *parent);</span><br><span> </span><br><span> void postprocess_devtree(void);</span><br><span style="color: hsl(0, 100%, 40%);">-struct chip *new_chip(char *path);</span><br><span style="color: hsl(0, 100%, 40%);">-struct device *new_device(struct device *parent, struct chip *chip,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct device *new_device(struct device *parent,</span><br><span style="color: hsl(120, 100%, 40%);">+                          struct chip_instance *chip_instance,</span><br><span>                         const int bustype, const char *devnum,</span><br><span>                       int enabled);</span><br><span> void alias_siblings(struct device *d);</span><br><span> void add_resource(struct device *dev, int type, int index, int base);</span><br><span style="color: hsl(0, 100%, 40%);">-void add_register(struct chip *chip, char *name, char *val);</span><br><span> void add_pci_subsystem_ids(struct device *dev, int vendor, int device,</span><br><span>                        int inherit);</span><br><span> void add_ioapic_info(struct device *dev, int apicid, const char *_srcpin,</span><br><span>@@ -124,3 +129,6 @@</span><br><span> </span><br><span> void enqueue(void *data);</span><br><span> void *dequeue(void);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct chip_instance *new_chip_instance(char *path);</span><br><span style="color: hsl(120, 100%, 40%);">+void add_register(struct chip_instance *chip, char *name, char *val);</span><br><span>diff --git a/util/sconfig/sconfig.tab.c_shipped b/util/sconfig/sconfig.tab.c_shipped</span><br><span>index 17bb31f..e774c2d 100644</span><br><span>--- a/util/sconfig/sconfig.tab.c_shipped</span><br><span>+++ b/util/sconfig/sconfig.tab.c_shipped</span><br><span>@@ -86,7 +86,7 @@</span><br><span> void yyerror(const char *s);</span><br><span> </span><br><span> static struct device *cur_parent;</span><br><span style="color: hsl(0, 100%, 40%);">-static struct chip *cur_chip;</span><br><span style="color: hsl(120, 100%, 40%);">+static struct chip *cur_chip_instance;</span><br><span> </span><br><span> </span><br><span> </span><br><span>@@ -1300,9 +1300,9 @@</span><br><span>   case 14:</span><br><span> </span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-       (yyval.chip) = new_chip((yyvsp[0].string));</span><br><span style="color: hsl(0, 100%, 40%);">-     enqueue(cur_chip);</span><br><span style="color: hsl(0, 100%, 40%);">-      cur_chip = (yyval.chip);</span><br><span style="color: hsl(120, 100%, 40%);">+      (yyval.chip) = new_chip_instance((yyvsp[0].string));</span><br><span style="color: hsl(120, 100%, 40%);">+  enqueue(cur_chip_instance);</span><br><span style="color: hsl(120, 100%, 40%);">+   cur_chip_instance = (yyval.chip);</span><br><span> }</span><br><span> </span><br><span>     break;</span><br><span>@@ -1310,7 +1310,7 @@</span><br><span>   case 15:</span><br><span> </span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-     cur_chip = dequeue();</span><br><span style="color: hsl(120, 100%, 40%);">+ cur_chip_instance = dequeue();</span><br><span> }</span><br><span> </span><br><span>     break;</span><br><span>@@ -1318,7 +1318,7 @@</span><br><span>   case 16:</span><br><span> </span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-        (yyval.device) = new_device(cur_parent, cur_chip, (yyvsp[-2].number), (yyvsp[-1].string), (yyvsp[0].number));</span><br><span style="color: hsl(120, 100%, 40%);">+ (yyval.device) = new_device(cur_parent, cur_chip_instance, (yyvsp[-2].number), (yyvsp[-1].string), (yyvsp[0].number));</span><br><span>       cur_parent = (yyval.device);</span><br><span> }</span><br><span> </span><br><span>@@ -1342,7 +1342,7 @@</span><br><span> </span><br><span>   case 19:</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    { add_register(cur_chip, (yyvsp[-2].string), (yyvsp[0].string)); }</span><br><span style="color: hsl(120, 100%, 40%);">+    { add_register(cur_chip_instance, (yyvsp[-2].string), (yyvsp[0].string)); }</span><br><span> </span><br><span>     break;</span><br><span> </span><br><span>diff --git a/util/sconfig/sconfig.y b/util/sconfig/sconfig.y</span><br><span>index 01ce92d..a1bcdee 100755</span><br><span>--- a/util/sconfig/sconfig.y</span><br><span>+++ b/util/sconfig/sconfig.y</span><br><span>@@ -21,7 +21,7 @@</span><br><span> void yyerror(const char *s);</span><br><span> </span><br><span> static struct device *cur_parent;</span><br><span style="color: hsl(0, 100%, 40%);">-static struct chip *cur_chip;</span><br><span style="color: hsl(120, 100%, 40%);">+static struct chip *cur_chip_instance;</span><br><span> </span><br><span> %}</span><br><span> %union {</span><br><span>@@ -40,16 +40,16 @@</span><br><span> devicechildren: devicechildren device | devicechildren chip | devicechildren resource | devicechildren subsystemid | devicechildren ioapic_irq | /* empty */ ;</span><br><span> </span><br><span> chip: CHIP STRING /* == path */ {</span><br><span style="color: hsl(0, 100%, 40%);">-  $<chip>$ = new_chip($<string>2);</span><br><span style="color: hsl(0, 100%, 40%);">-    enqueue(cur_chip);</span><br><span style="color: hsl(0, 100%, 40%);">-      cur_chip = $<chip>$;</span><br><span style="color: hsl(120, 100%, 40%);">+    $<chip>$ = new_chip_instance($<string>2);</span><br><span style="color: hsl(120, 100%, 40%);">+ enqueue(cur_chip_instance);</span><br><span style="color: hsl(120, 100%, 40%);">+   cur_chip_instance = $<chip>$;</span><br><span> }</span><br><span>     chipchildren END {</span><br><span style="color: hsl(0, 100%, 40%);">-      cur_chip = dequeue();</span><br><span style="color: hsl(120, 100%, 40%);">+ cur_chip_instance = dequeue();</span><br><span> };</span><br><span> </span><br><span> device: DEVICE BUS NUMBER /* == devnum */ BOOL {</span><br><span style="color: hsl(0, 100%, 40%);">-    $<device>$ = new_device(cur_parent, cur_chip, $<number>2, $<string>3, $<number>4);</span><br><span style="color: hsl(120, 100%, 40%);">+    $<device>$ = new_device(cur_parent, cur_chip_instance, $<number>2, $<string>3, $<number>4);</span><br><span>  cur_parent = $<device>$;</span><br><span> }</span><br><span>  devicechildren END {</span><br><span>@@ -62,7 +62,7 @@</span><br><span>     { add_resource(cur_parent, $<number>1, strtol($<string>2, NULL, 0), strtol($<string>4, NULL, 0)); } ;</span><br><span> </span><br><span> registers: REGISTER STRING /* == regname */ EQUALS STRING /* == regval */</span><br><span style="color: hsl(0, 100%, 40%);">-        { add_register(cur_chip, $<string>2, $<string>4); } ;</span><br><span style="color: hsl(120, 100%, 40%);">+     { add_register(cur_chip_instance, $<string>2, $<string>4); } ;</span><br><span> </span><br><span> subsystemid: SUBSYSTEMID NUMBER NUMBER</span><br><span>     { add_pci_subsystem_ids(cur_parent, strtol($<string>2, NULL, 16), strtol($<string>3, NULL, 16), 0); };</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/26739">change 26739</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/26739"/><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: I6fccdf7c361b4f55a831195adcda9b21932755aa </div>
<div style="display:none"> Gerrit-Change-Number: 26739 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Furquan Shaikh <furquan@google.com> </div>