Author: hailfinger
Date: 2008-09-06 22:39:25 +0200 (Sat, 06 Sep 2008)
New Revision: 860

Modified:
   coreboot-v3/util/dtc/flattree.c
Log:
I managed to break dtc while working on PCI bridges:
dtc only uses dev_fn as identifier for a PCI device. That gets us a name
collision if we have the same dev_fn combination on multiple buses.
Either we add a random unique ID to the struct name or we integrate the
path to the parent device as well.
I decided to go for integration of parent device path.

With the following device tree

/{
        cpus {};
        [EMAIL PROTECTED] {
                [EMAIL PROTECTED] {
                        [EMAIL PROTECTED],0 {
                        };
                        [EMAIL PROTECTED],1 {
                        };
                        [EMAIL PROTECTED],0 {
                                [EMAIL PROTECTED] {
                                        [EMAIL PROTECTED],0 {
                                        };
                                };
                        };
                };
        };
};


we get the old names:
dev_root
dev_cpus
dev_domain_0
dev_bus_0
dev_pci_0_0
dev_pci_1_1
dev_pci_f_0
dev_bus_1
dev_pci_0_0 COLLISION!!!

and the new names:
dev_root
dev_cpus
dev_domain_0
dev_domain_0_bus_0
dev_domain_0_bus_0_pci_0_0
dev_domain_0_bus_0_pci_1_1
dev_domain_0_bus_0_pci_f_0
dev_domain_0_bus_0_pci_f_0_bus_1
dev_domain_0_bus_0_pci_f_0_bus_1_pci_0_0

Ron would like shorter names because they only have to be
machine-readable. That's left for another patch.

Signed-off-by: Carl-Daniel Hailfinger <[EMAIL PROTECTED]>
Acked-by: Ronald G. Minnich <[EMAIL PROTECTED]>


Modified: coreboot-v3/util/dtc/flattree.c
===================================================================
--- coreboot-v3/util/dtc/flattree.c     2008-09-06 20:30:26 UTC (rev 859)
+++ coreboot-v3/util/dtc/flattree.c     2008-09-06 20:39:25 UTC (rev 860)
@@ -1311,8 +1311,22 @@
 labeltree(struct node *tree)
 {
        struct node *child;
+       char *tmp1;
+       char *tmp2;
 
        tree->label = clean(tree->name, 1);
+       if (tree->parent && tree->label) {
+               tmp1 = strdup(tree->parent->label);
+               if (strlen(tmp1)) {
+                       tmp2 = tree->label;
+                       tree->label = malloc(strlen(tmp1) + strlen(tmp2) + 2);
+                       strcpy(tree->label, tmp1);
+                       strcat(tree->label, "_");
+                       strcat(tree->label, tmp2);
+                       free(tmp2);
+               }
+               free(tmp1);
+       }
        
        if (tree->next_sibling)
                labeltree(tree->next_sibling);


--
coreboot mailing list
[email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to