1 /* sconfig, coreboot device tree compiler */
2 /* SPDX-License-Identifier: GPL-2.0-only */
9 /* stat.h needs to be included before commonlib/helpers.h to avoid errors.*/
11 #include <commonlib/helpers.h>
14 #include "sconfig.tab.h"
19 * Maintains list of all the unique chip structures for the board.
20 * This is shared across base and override device trees since we need to
21 * generate headers for all chips added by both the trees.
23 static struct chip chip_header
;
33 * Mainboard is assumed to have a root device whose bus is the parent of all the
34 * devices that are added by parsing the devicetree file. This device has a
35 * mainboard chip instance associated with it.
39 * +------------------------+ +----------------------+
40 * | Root device | | Mainboard |
41 * +---------+ (base_root_dev) +--------------->+ instance +
42 * | | | chip_instance | (mainboard_instance)|
43 * | +------------------------+ | |
44 * | | +----------------------+
47 * | +-------------------+ |
49 * +----------->+ (base_root_bus) | |
51 * +-------------------+ |
62 * +-------+----------+
64 * | Mainboard chip +----------->X (new chips will be
65 * | (mainboard_chip) | added here)
67 * +------------------+
72 /* Root device of primary tree. */
73 static struct device base_root_dev
;
75 /* Root device of chipset tree. */
76 static struct device chipset_root_dev
;
78 /* Root device of override tree (if applicable). */
79 static struct device override_root_dev
;
81 static struct chip_instance mainboard_instance
;
83 static struct bus base_root_bus
= {
84 .dev
= &base_root_dev
,
87 static struct device base_root_dev
= {
89 .chip_instance
= &mainboard_instance
,
90 .path
= " .type = DEVICE_PATH_ROOT ",
91 .parent
= &base_root_bus
,
93 .bus
= &base_root_bus
,
96 static struct bus chipset_root_bus
= {
97 .dev
= &chipset_root_dev
,
100 static struct device chipset_root_dev
= {
101 .name
= "chipset_root",
102 .chip_instance
= &mainboard_instance
,
103 .path
= " .type = DEVICE_PATH_ROOT ",
104 .parent
= &chipset_root_bus
,
106 .bus
= &chipset_root_bus
,
109 static struct bus override_root_bus
= {
110 .dev
= &override_root_dev
,
113 static struct device override_root_dev
= {
114 .name
= "override_root",
116 * Override tree root device points to the same mainboard chip instance
117 * as the base tree root device. It should not cause any side-effects
118 * since the mainboard chip instance pointer in override tree will just
121 .chip_instance
= &mainboard_instance
,
122 .path
= " .type = DEVICE_PATH_ROOT ",
123 .parent
= &override_root_bus
,
125 .bus
= &override_root_bus
,
128 static struct chip mainboard_chip
= {
130 .name_underscore
= "mainboard",
131 .instance
= &mainboard_instance
,
134 static struct chip_instance mainboard_instance
= {
136 .chip
= &mainboard_chip
,
139 /* This is the parent of all devices added by parsing the devicetree file. */
140 struct bus
*root_parent
;
144 struct queue_entry
*next
;
145 struct queue_entry
*prev
;
148 /* Global list of all `struct device_operations` identifiers to declare. */
149 static struct identifier
*device_operations
;
151 #define S_ALLOC(_s) s_alloc(__func__, _s)
153 static void *s_alloc(const char *f
, size_t s
)
155 void *data
= calloc(1, s
);
157 fprintf(stderr
, "%s: Failed to alloc mem!\n", f
);
163 static struct queue_entry
*new_queue_entry(void *data
)
165 struct queue_entry
*e
= S_ALLOC(sizeof(*e
));
168 e
->next
= e
->prev
= e
;
172 static void enqueue_tail(struct queue_entry
**q_head
, void *data
)
174 struct queue_entry
*tmp
= new_queue_entry(data
);
175 struct queue_entry
*q
= *q_head
;
188 static void *dequeue_tail(struct queue_entry
**q_head
)
190 struct queue_entry
*q
= *q_head
;
191 struct queue_entry
*tmp
;
212 static void *dequeue_head(struct queue_entry
**q_head
)
214 struct queue_entry
*q
= *q_head
;
215 struct queue_entry
*tmp
= q
;
224 q
->next
->prev
= q
->prev
;
225 q
->prev
->next
= q
->next
;
235 static void *peek_queue_head(struct queue_entry
*q_head
)
243 static struct queue_entry
*chip_q_head
;
245 void chip_enqueue_tail(void *data
)
247 enqueue_tail(&chip_q_head
, data
);
250 void *chip_dequeue_tail(void)
252 return dequeue_tail(&chip_q_head
);
260 void yyerror(char const *str
)
263 fprintf(stderr
, "line %d: %s: %s\n", linenum
+ 1, yytext
, str
);
267 char *translate_name(const char *str
, translate_t mode
)
272 if ((mode
== SPLIT_1ST
) && (*c
== '/')) {
280 if (mode
== TO_UPPER
)
282 if (mode
== TO_LOWER
)
289 static struct chip
*get_chip(char *path
)
291 struct chip
*h
= &chip_header
;
294 int result
= strcmp(path
, h
->next
->name
);
304 struct chip
*new_chip
= S_ALLOC(sizeof(struct chip
));
305 new_chip
->next
= h
->next
;
308 new_chip
->chiph_exists
= 1;
309 new_chip
->name
= path
;
310 new_chip
->name_underscore
= translate_name(path
, UNSLASH
);
313 char *chip_h
= S_ALLOC(strlen(path
) + 18);
314 sprintf(chip_h
, "src/%s", path
);
315 if ((stat(chip_h
, &st
) == -1) && (errno
== ENOENT
)) {
316 /* root_complex gets away without a separate directory, but
317 * exists on pretty much all AMD chipsets.
319 if (!strstr(path
, "/root_complex")) {
320 fprintf(stderr
, "ERROR: Chip component %s does not exist.\n",
326 sprintf(chip_h
, "src/%s/chip.h", path
);
328 if ((stat(chip_h
, &st
) == -1) && (errno
== ENOENT
))
329 new_chip
->chiph_exists
= 0;
336 struct chip_instance
*new_chip_instance(char *path
)
338 struct chip
*chip
= get_chip(path
);
339 struct chip_instance
*instance
= S_ALLOC(sizeof(*instance
));
341 instance
->chip
= chip
;
342 instance
->next
= chip
->instance
;
343 chip
->instance
= instance
;
348 /* List of fw_config fields added during parsing. */
349 static struct fw_config_field
*fw_config_fields
;
351 static struct fw_config_option
*find_fw_config_option(struct fw_config_field
*field
,
354 struct fw_config_option
*option
= field
->options
;
356 while (option
&& option
->name
) {
357 if (!strcmp(option
->name
, name
))
359 option
= option
->next
;
364 static struct fw_config_field
*find_fw_config_field(const char *name
)
366 struct fw_config_field
*field
= fw_config_fields
;
368 while (field
&& field
->name
) {
369 if (!strcmp(field
->name
, name
))
376 struct fw_config_field
*get_fw_config_field(const char *name
)
378 struct fw_config_field
*field
= find_fw_config_field(name
);
380 /* Fail if the field does not exist, new fields must be added with a mask. */
382 printf("ERROR: fw_config field not found: %s\n", name
);
388 static void append_fw_config_field(struct fw_config_field
*add
)
390 struct fw_config_field
*field
= fw_config_fields
;
392 if (!fw_config_fields
) {
393 fw_config_fields
= add
;
395 while (field
&& field
->next
)
401 void append_fw_config_bits(struct fw_config_field_bits
**bits
,
402 unsigned int start_bit
, unsigned int end_bit
)
404 struct fw_config_field_bits
*new_bits
= S_ALLOC(sizeof(*new_bits
));
405 new_bits
->start_bit
= start_bit
;
406 new_bits
->end_bit
= end_bit
;
407 new_bits
->next
= NULL
;
414 struct fw_config_field_bits
*tmp
= *bits
;
418 tmp
->next
= new_bits
;
421 int fw_config_masks_overlap(struct fw_config_field
*existing
,
422 unsigned int start_bit
, unsigned int end_bit
)
424 struct fw_config_field_bits
*bits
= existing
->bits
;
426 if (start_bit
<= bits
->end_bit
&& end_bit
>= bits
->start_bit
) {
427 printf("ERROR: fw_config field [%u-%u] overlaps %s[%u-%u]\n",
429 existing
->name
, bits
->start_bit
, bits
->end_bit
);
438 struct fw_config_field
*new_fw_config_field(const char *name
, struct fw_config_field_bits
*bits
)
440 struct fw_config_field
*field
= find_fw_config_field(name
);
441 struct fw_config_field_bits
*tmp
;
443 /* Don't allow re-defining a field, only adding new fields. */
445 printf("ERROR: fw_config field %s already exists\n", name
);
449 /* Check that each field is within 64 bits. */
452 if (tmp
->start_bit
> tmp
->end_bit
|| tmp
->end_bit
> 63) {
453 printf("ERROR: fw_config field %s has invalid range %u-%u\n", name
,
454 tmp
->start_bit
, tmp
->end_bit
);
458 /* Check for overlap with an existing field. */
459 struct fw_config_field
*existing
= fw_config_fields
;
461 if (fw_config_masks_overlap(existing
, tmp
->start_bit
, tmp
->end_bit
))
463 existing
= existing
->next
;
469 field
= S_ALLOC(sizeof(*field
));
472 append_fw_config_field(field
);
477 static void append_fw_config_option_to_field(struct fw_config_field
*field
,
478 struct fw_config_option
*add
)
480 struct fw_config_option
*option
= field
->options
;
483 field
->options
= add
;
485 while (option
&& option
->next
)
486 option
= option
->next
;
491 static uint64_t calc_max_field_value(const struct fw_config_field
*field
)
493 unsigned int bit_count
= 0;
495 const struct fw_config_field_bits
*bits
= field
->bits
;
497 bit_count
+= 1 + bits
->end_bit
- bits
->start_bit
;
501 return (1ull << bit_count
) - 1ull;
504 void add_fw_config_option(struct fw_config_field
*field
, const char *name
, uint64_t value
)
506 struct fw_config_option
*option
;
508 /* Check that option value fits within field mask. */
509 uint64_t field_max_value
= calc_max_field_value(field
);
510 if (value
> field_max_value
) {
511 printf("ERROR: fw_config option %s:%s value %" PRIx64
" larger than field max %"
513 field
->name
, name
, value
, field_max_value
);
517 /* Check for existing option with this name or value. */
518 option
= field
->options
;
520 if (!strcmp(option
->name
, name
)) {
521 printf("ERROR: fw_config option name %s:%s already exists\n",
525 /* Compare values. */
526 if (value
== option
->value
) {
527 printf("ERROR: fw_config option %s:%s[%" PRIx64
"] redefined as %s\n",
528 field
->name
, option
->name
, value
, name
);
531 option
= option
->next
;
534 option
= S_ALLOC(sizeof(*option
));
536 option
->value
= value
;
538 /* Add option to the current field. */
539 append_fw_config_option_to_field(field
, option
);
542 static void append_fw_config_probe_to_dev(struct device
*dev
, struct fw_config_probe
*add
)
544 struct fw_config_probe
*probe
= dev
->probe
;
549 while (probe
&& probe
->next
)
555 static int check_probe_exists(struct fw_config_probe
*probe
, const char *field
,
559 if (!strcmp(probe
->field
, field
) && !strcmp(probe
->option
, option
)) {
568 void add_fw_config_probe(struct bus
*bus
, const char *field
, const char *option
)
570 struct fw_config_probe
*probe
;
572 if (check_probe_exists(bus
->dev
->probe
, field
, option
)) {
573 printf("ERROR: fw_config probe %s:%s already exists\n", field
, option
);
577 probe
= S_ALLOC(sizeof(*probe
));
578 probe
->field
= field
;
579 probe
->option
= option
;
581 append_fw_config_probe_to_dev(bus
->dev
, probe
);
584 static uint64_t compute_fw_config_mask(const struct fw_config_field_bits
*bits
)
589 /* Compute mask from start and end bit. */
590 uint64_t tmp
= ((1ull << (1ull + bits
->end_bit
- bits
->start_bit
)) - 1ull);
591 tmp
<<= bits
->start_bit
;
599 static unsigned int bits_width(const struct fw_config_field_bits
*bits
)
601 return 1 + bits
->end_bit
- bits
->start_bit
;
604 static uint64_t calc_option_value(const struct fw_config_field
*field
,
605 const struct fw_config_option
*option
)
608 uint64_t original
= option
->value
;
610 struct fw_config_field_bits
*bits
= field
->bits
;
612 const unsigned int width
= bits_width(bits
);
613 const uint64_t orig_mask
= (1ull << width
) - 1ull;
614 const uint64_t orig
= (original
& orig_mask
);
615 value
|= (orig
<< bits
->start_bit
);
624 static void emit_fw_config(FILE *fil
)
626 struct fw_config_field
*field
= fw_config_fields
;
632 struct fw_config_option
*option
= field
->options
;
635 fprintf(fil
, "#define FW_CONFIG_FIELD_%s_NAME \"%s\"\n",
636 field
->name
, field
->name
);
638 mask
= compute_fw_config_mask(field
->bits
);
639 fprintf(fil
, "#define FW_CONFIG_FIELD_%s_MASK 0x%" PRIx64
"\n",
643 const uint64_t value
= calc_option_value(field
, option
);
644 fprintf(fil
, "#define FW_CONFIG_FIELD_%s_OPTION_%s_NAME \"%s\"\n",
645 field
->name
, option
->name
, option
->name
);
646 fprintf(fil
, "#define FW_CONFIG_FIELD_%s_OPTION_%s_VALUE 0x%"
647 PRIx64
"\n", field
->name
, option
->name
, value
);
648 option
= option
->next
;
657 static int emit_fw_config_probe(FILE *fil
, struct device
*dev
)
659 struct fw_config_probe
*probe
= dev
->probe
;
661 fprintf(fil
, "STORAGE struct fw_config %s_probe_list[] = {\n", dev
->name
);
664 /* Find matching field. */
665 struct fw_config_field
*field
;
666 struct fw_config_option
*option
;
667 uint64_t mask
, value
;
669 field
= find_fw_config_field(probe
->field
);
671 printf("ERROR: fw_config_probe field %s not found\n", probe
->field
);
674 option
= find_fw_config_option(field
, probe
->option
);
676 printf("ERROR: fw_config_probe field %s option %s not found\n",
677 probe
->field
, probe
->option
);
681 /* Fill out the probe structure with values from emit_fw_config(). */
682 fprintf(fil
, "\t{\n");
683 fprintf(fil
, "\t\t.field_name = FW_CONFIG_FIELD_%s_NAME,\n", probe
->field
);
684 fprintf(fil
, "\t\t.option_name = FW_CONFIG_FIELD_%s_OPTION_%s_NAME,\n",
685 probe
->field
, probe
->option
);
686 fprintf(fil
, "\t\t.mask = FW_CONFIG_FIELD_%s_MASK,\n", probe
->field
);
687 fprintf(fil
, "\t\t.value = FW_CONFIG_FIELD_%s_OPTION_%s_VALUE,\n",
688 probe
->field
, probe
->option
);
689 fprintf(fil
, "\t},\n");
694 /* Add empty entry to mark end of list. */
695 fprintf(fil
, "\t{ }\n};\n");
699 /* Enqueue identifier to list with head `*it`, if not already present. */
700 void add_identifier(struct identifier
**it
, const char *id
)
702 for (; *it
!= NULL
; it
= &(*it
)->next
) {
703 if (!strcmp((*it
)->id
, id
))
707 *it
= S_ALLOC(sizeof(**it
));
711 void add_device_ops(struct bus
*bus
, char *ops_id
)
713 if (bus
->dev
->ops_id
) {
714 printf("ERROR: Device operations may only be specified once,\n"
715 " found '%s', '%s'.\n", bus
->dev
->ops_id
, ops_id
);
719 add_identifier(&device_operations
, ops_id
);
720 bus
->dev
->ops_id
= ops_id
;
723 /* Allocate a new bus for the provided device. */
724 static void alloc_bus(struct device
*dev
)
726 struct bus
*bus
= S_ALLOC(sizeof(*bus
));
733 * Allocate a new device under the given parent. This function allocates a new
734 * device structure under the provided parent bus and allocates a bus structure
735 * under the newly allocated device.
737 static struct device
*alloc_dev(struct bus
*parent
)
739 struct device
*dev
= S_ALLOC(sizeof(*dev
));
741 dev
->parent
= parent
;
742 dev
->subsystem_vendor
= -1;
743 dev
->subsystem_device
= -1;
751 * This function scans the children of given bus to see if any device matches
752 * the new device that is requested.
754 * Returns pointer to the node if found, else NULL.
756 static struct device
*get_dev(struct bus
*parent
, int path_a
, int path_b
,
757 int bustype
, struct chip_instance
*chip_instance
)
759 struct device
*child
= parent
->children
;
762 if ((child
->path_a
== path_a
) && (child
->path_b
== path_b
) &&
763 (child
->bustype
== bustype
) &&
764 (child
->chip_instance
== chip_instance
))
767 child
= child
->sibling
;
774 * Add given node as child of the provided parent. If this is the first child of
775 * the parent, update parent->children pointer as well.
777 static void set_new_child(struct bus
*parent
, struct device
*child
)
779 struct device
*c
= parent
->children
;
785 parent
->children
= child
;
787 child
->sibling
= NULL
;
788 child
->parent
= parent
;
791 static const struct device
*find_alias(const struct device
*const parent
,
792 const char *const alias
)
794 if (parent
->alias
&& !strcmp(parent
->alias
, alias
))
797 const struct bus
*bus
= parent
->bus
;
801 const struct device
*child
;
802 for (child
= bus
->children
; child
; child
= child
->sibling
) {
803 const struct device
*const ret
= find_alias(child
, alias
);
811 static struct device
*new_device_with_path(struct bus
*parent
,
812 struct chip_instance
*chip_instance
,
813 const int bustype
, int path_a
, int path_b
,
814 char *alias
, int status
)
816 struct device
*new_d
;
818 /* We don't allow duplicate devices in devicetree. */
819 new_d
= get_dev(parent
, path_a
, path_b
, bustype
, chip_instance
);
821 printf("ERROR: Duplicate device! %s\n", new_d
->name
);
825 new_d
= alloc_dev(parent
);
827 new_d
->bustype
= bustype
;
829 new_d
->path_a
= path_a
;
830 new_d
->path_b
= path_b
;
831 new_d
->alias
= alias
;
833 new_d
->enabled
= status
& 0x01;
834 new_d
->hidden
= (status
>> 1) & 0x01;
835 new_d
->mandatory
= (status
>> 2) & 0x01;
836 new_d
->chip_instance
= chip_instance
;
838 set_new_child(parent
, new_d
);
842 new_d
->path
= ".type=DEVICE_PATH_PCI,{.pci={ .devfn = PCI_DEVFN(0x%x,%d)}}";
846 new_d
->path
= ".type=DEVICE_PATH_PNP,{.pnp={ .port = 0x%x, .device = 0x%x }}";
850 new_d
->path
= ".type=DEVICE_PATH_I2C,{.i2c={ .device = 0x%x, .mode_10bit = %d }}";
854 new_d
->path
= ".type=DEVICE_PATH_CPU_CLUSTER,{.cpu_cluster={ .cluster = 0x%x }}";
858 new_d
->path
= ".type=DEVICE_PATH_CPU,{.cpu={ .id = 0x%x }}";
862 new_d
->path
= ".type=DEVICE_PATH_DOMAIN,{.domain={ .domain = 0x%x }}";
866 new_d
->path
= ".type=DEVICE_PATH_GENERIC,{.generic={ .id = 0x%x, .subid = 0x%x }}";
870 new_d
->path
= ".type=DEVICE_PATH_SPI,{.spi={ .cs = 0x%x }}";
874 new_d
->path
= ".type=DEVICE_PATH_USB,{.usb={ .port_type = %d, .port_id = %d }}";
878 new_d
->path
= ".type=DEVICE_PATH_MMIO,{.mmio={ .addr = 0x%x }}";
882 new_d
->path
= ".type=DEVICE_PATH_GPIO,{.gpio={ .id = 0x%x }}";
886 new_d
->path
= ".type=DEVICE_PATH_MDIO,{.mdio={ .addr = 0x%x }}";
893 struct device
*new_device_reference(struct bus
*parent
,
894 struct chip_instance
*chip_instance
,
895 const char *reference
, int status
)
897 const struct device
*dev
= find_alias(&base_root_dev
, reference
);
900 printf("ERROR: Unable to find device reference %s\n", reference
);
904 return new_device_with_path(parent
, chip_instance
, dev
->bustype
, dev
->path_a
,
905 dev
->path_b
, NULL
, status
);
908 struct device
*new_device_raw(struct bus
*parent
,
909 struct chip_instance
*chip_instance
,
910 const int bustype
, const char *devnum
,
911 char *alias
, int status
)
917 /* Check for alias name conflicts. */
918 if (alias
&& find_alias(root_parent
->dev
, alias
)) {
919 printf("ERROR: Alias already exists: %s\n", alias
);
923 path_a
= strtol(devnum
, &tmp
, 16);
926 path_b
= strtol(tmp
, NULL
, 16);
929 return new_device_with_path(parent
, chip_instance
, bustype
, path_a
, path_b
, alias
,
933 static void new_resource(struct device
*dev
, int type
, int index
, int base
)
935 struct resource
*r
= S_ALLOC(sizeof(struct resource
));
941 struct resource
*head
= dev
->res
;
950 void add_resource(struct bus
*bus
, int type
, int index
, int base
)
952 new_resource(bus
->dev
, type
, index
, base
);
955 static void add_reg(struct reg
**const head
, char *const name
, char *const val
)
957 struct reg
*const r
= S_ALLOC(sizeof(struct reg
));
958 struct reg
*prev
= NULL
;
964 for (cur
= *head
; cur
!= NULL
; prev
= cur
, cur
= cur
->next
) {
965 const int sort
= strcmp(r
->key
, cur
->key
);
967 printf("ERROR: duplicate 'register' key '%s'.\n", r
->key
);
980 void add_register(struct chip_instance
*chip_instance
, char *name
, char *val
)
982 add_reg(&chip_instance
->reg
, name
, val
);
985 void add_reference(struct chip_instance
*const chip_instance
,
986 char *const name
, char *const alias
)
988 add_reg(&chip_instance
->ref
, name
, alias
);
991 static void set_reference(struct chip_instance
*const chip_instance
,
992 char *const name
, char *const alias
)
994 const struct device
*const dev
= find_alias(&base_root_dev
, alias
);
996 printf("ERROR: Cannot find device alias '%s'.\n", alias
);
1000 char *const ref_name
= S_ALLOC(strlen(dev
->name
) + 2);
1001 sprintf(ref_name
, "&%s", dev
->name
);
1002 add_register(chip_instance
, name
, ref_name
);
1005 static void update_references(FILE *file
, FILE *head
, struct device
*dev
,
1006 struct device
*next
)
1010 for (ref
= dev
->chip_instance
->ref
; ref
; ref
= ref
->next
)
1011 set_reference(dev
->chip_instance
, ref
->key
, ref
->value
);
1014 void add_slot_desc(struct bus
*bus
, char *type
, char *length
, char *designation
,
1017 struct device
*dev
= bus
->dev
;
1019 if (dev
->bustype
!= PCI
&& dev
->bustype
!= DOMAIN
) {
1020 printf("ERROR: 'slot_type' only allowed for PCI devices\n");
1024 dev
->smbios_slot_type
= type
;
1025 dev
->smbios_slot_length
= length
;
1026 dev
->smbios_slot_data_width
= data_width
;
1027 dev
->smbios_slot_designation
= designation
;
1030 void add_smbios_dev_info(struct bus
*bus
, long instance_id
, const char *refdes
)
1032 struct device
*dev
= bus
->dev
;
1034 if (dev
->bustype
!= PCI
&& dev
->bustype
!= DOMAIN
) {
1035 printf("ERROR: 'dev_info' only allowed for PCI devices\n");
1039 if (instance_id
< 0 || instance_id
> UINT8_MAX
) {
1040 printf("ERROR: SMBIOS dev info instance ID '%ld' out of range\n", instance_id
);
1044 dev
->smbios_instance_id_valid
= 1;
1045 dev
->smbios_instance_id
= (unsigned int)instance_id
;
1046 dev
->smbios_refdes
= refdes
;
1049 void add_pci_subsystem_ids(struct bus
*bus
, int vendor
, int device
,
1052 struct device
*dev
= bus
->dev
;
1054 if (dev
->bustype
!= PCI
&& dev
->bustype
!= DOMAIN
) {
1055 printf("ERROR: 'subsystem' only allowed for PCI devices\n");
1059 dev
->subsystem_vendor
= vendor
;
1060 dev
->subsystem_device
= device
;
1061 dev
->inherit_subsystem
= inherit
;
1064 static int dev_has_children(struct device
*dev
)
1066 struct bus
*bus
= dev
->bus
;
1068 if (bus
&& bus
->children
)
1074 static void pass0(FILE *fil
, FILE *head
, struct device
*ptr
, struct device
*next
)
1078 if (ptr
== &base_root_dev
) {
1079 fprintf(fil
, "STORAGE struct bus %s_bus;\n",
1087 name
= S_ALLOC(6 + strlen(ptr
->alias
));
1088 sprintf(name
, "_dev_%s", ptr
->alias
);
1091 sprintf(name
, "_dev_%d", dev_id
++);
1096 fprintf(fil
, "STORAGE struct device %s;\n", ptr
->name
);
1098 fprintf(fil
, "STORAGE struct resource %s_res[];\n",
1100 if (dev_has_children(ptr
))
1101 fprintf(fil
, "STORAGE struct bus %s_bus;\n",
1108 "DEVTREE_CONST struct device * DEVTREE_CONST last_dev = &%s;\n",
1112 static void emit_smbios_data(FILE *fil
, struct device
*ptr
)
1114 fprintf(fil
, "#if !DEVTREE_EARLY\n");
1115 fprintf(fil
, "#if CONFIG(GENERATE_SMBIOS_TABLES)\n");
1117 /* SMBIOS types start at 1, if zero it hasn't been set */
1118 if (ptr
->smbios_slot_type
)
1119 fprintf(fil
, "\t.smbios_slot_type = %s,\n",
1120 ptr
->smbios_slot_type
);
1121 if (ptr
->smbios_slot_data_width
)
1122 fprintf(fil
, "\t.smbios_slot_data_width = %s,\n",
1123 ptr
->smbios_slot_data_width
);
1124 if (ptr
->smbios_slot_designation
)
1125 fprintf(fil
, "\t.smbios_slot_designation = \"%s\",\n",
1126 ptr
->smbios_slot_designation
);
1127 if (ptr
->smbios_slot_length
)
1128 fprintf(fil
, "\t.smbios_slot_length = %s,\n",
1129 ptr
->smbios_slot_length
);
1131 /* Fill in SMBIOS type41 fields */
1132 if (ptr
->smbios_instance_id_valid
) {
1133 fprintf(fil
, "\t.smbios_instance_id_valid = true,\n");
1134 fprintf(fil
, "\t.smbios_instance_id = %u,\n", ptr
->smbios_instance_id
);
1135 if (ptr
->smbios_refdes
)
1136 fprintf(fil
, "\t.smbios_refdes = \"%s\",\n", ptr
->smbios_refdes
);
1139 fprintf(fil
, "#endif\n");
1140 fprintf(fil
, "#endif\n");
1143 static void emit_resources(FILE *fil
, struct device
*ptr
)
1145 if (ptr
->res
== NULL
)
1149 fprintf(fil
, "STORAGE struct resource %s_res[] = {\n", ptr
->name
);
1150 struct resource
*r
= ptr
->res
;
1153 "\t\t{ .flags=IORESOURCE_FIXED | IORESOURCE_ASSIGNED | IORESOURCE_");
1155 fprintf(fil
, "IRQ");
1157 fprintf(fil
, "DRQ");
1160 fprintf(fil
, ", .index=0x%x, .base=0x%x,", r
->index
,
1163 fprintf(fil
, ".next=&%s_res[%d]},\n", ptr
->name
,
1166 fprintf(fil
, ".next=NULL },\n");
1170 fprintf(fil
, "\t };\n");
1173 static void emit_dev_bus(FILE *fil
, struct device
*ptr
)
1175 fprintf(fil
, "STORAGE struct bus %s_bus = {\n",
1178 assert(ptr
->bus
&& ptr
->bus
->children
);
1179 struct bus
*bus
= ptr
->bus
;
1181 fprintf(fil
, "\t.dev = &%s,\n", bus
->dev
->name
);
1182 fprintf(fil
, "\t.children = &%s,\n", bus
->children
->name
);
1184 fprintf(fil
, "};\n");
1187 static struct chip_instance
*get_chip_instance(const struct device
*dev
)
1189 struct chip_instance
*chip_ins
= dev
->chip_instance
;
1191 * If the chip instance of device has base_chip_instance pointer set, then follow that
1192 * to update the chip instance for current device.
1194 if (chip_ins
->base_chip_instance
)
1195 chip_ins
= chip_ins
->base_chip_instance
;
1200 static void pass1(FILE *fil
, FILE *head
, struct device
*ptr
, struct device
*next
)
1202 struct chip_instance
*chip_ins
= get_chip_instance(ptr
);
1203 int has_children
= dev_has_children(ptr
);
1205 /* Emit probe structures. */
1206 if (ptr
->probe
&& (emit_fw_config_probe(fil
, ptr
) < 0)) {
1213 if (ptr
== &base_root_dev
)
1214 fprintf(fil
, "DEVTREE_CONST struct device %s = {\n", ptr
->name
);
1216 fprintf(fil
, "STORAGE struct device %s = {\n", ptr
->name
);
1218 fprintf(fil
, "#if !DEVTREE_EARLY\n");
1221 * ops field can be set in the devicetree. If unspecified, it is set
1222 * to default_dev_ops_root only for the root device, other devices
1223 * get it set by the driver at runtime.
1226 fprintf(fil
, "\t.ops = &%s,\n", ptr
->ops_id
);
1227 else if (ptr
== &base_root_dev
)
1228 fprintf(fil
, "\t.ops = &default_dev_ops_root,\n");
1230 fprintf(fil
, "\t.ops = NULL,\n");
1231 fprintf(fil
, "#endif\n");
1232 fprintf(fil
, "\t.upstream = &%s_bus,\n", ptr
->parent
->dev
->name
);
1233 fprintf(fil
, "\t.path = {");
1234 fprintf(fil
, ptr
->path
, ptr
->path_a
, ptr
->path_b
);
1235 fprintf(fil
, "},\n");
1236 fprintf(fil
, "\t.enabled = %d,\n", ptr
->enabled
);
1237 fprintf(fil
, "\t.hidden = %d,\n", ptr
->hidden
);
1238 fprintf(fil
, "\t.mandatory = %d,\n", ptr
->mandatory
);
1239 fprintf(fil
, "\t.on_mainboard = 1,\n");
1240 if (ptr
->subsystem_vendor
> 0)
1241 fprintf(fil
, "\t.subsystem_vendor = 0x%04x,\n",
1242 ptr
->subsystem_vendor
);
1244 if (ptr
->subsystem_device
> 0)
1245 fprintf(fil
, "\t.subsystem_device = 0x%04x,\n",
1246 ptr
->subsystem_device
);
1249 fprintf(fil
, "\t.resource_list = &%s_res[0],\n",
1253 fprintf(fil
, "\t.downstream = &%s_bus,\n",
1256 fprintf(fil
, "\t.downstream = NULL,\n");
1258 fprintf(fil
, "\t.sibling = &%s,\n", ptr
->sibling
->name
);
1260 fprintf(fil
, "\t.sibling = NULL,\n");
1262 fprintf(fil
, "\t.probe_list = %s_probe_list,\n", ptr
->name
);
1263 fprintf(fil
, "#if !DEVTREE_EARLY\n");
1264 fprintf(fil
, "\t.chip_ops = &%s_ops,\n",
1265 chip_ins
->chip
->name_underscore
);
1266 if (chip_ins
== &mainboard_instance
)
1267 fprintf(fil
, "\t.name = mainboard_name,\n");
1268 fprintf(fil
, "#endif\n");
1269 if (chip_ins
->chip
->chiph_exists
)
1270 fprintf(fil
, "\t.chip_info = &%s_info_%d,\n",
1271 chip_ins
->chip
->name_underscore
, chip_ins
->id
);
1273 fprintf(fil
, "\t.next=&%s,\n", next
->name
);
1275 emit_smbios_data(fil
, ptr
);
1277 fprintf(fil
, "};\n");
1279 emit_resources(fil
, ptr
);
1282 emit_dev_bus(fil
, ptr
);
1285 static void expose_device_names(FILE *fil
, FILE *head
, struct device
*ptr
, struct device
*next
)
1287 struct chip_instance
*chip_ins
= get_chip_instance(ptr
);
1289 /* Only devices on root bus here. */
1290 if (ptr
->bustype
== PCI
&& ptr
->parent
->dev
->bustype
== DOMAIN
) {
1291 fprintf(head
, "extern DEVTREE_CONST struct device *const __pci_%d_%02x_%d;\n",
1292 ptr
->parent
->dev
->path_a
, ptr
->path_a
, ptr
->path_b
);
1293 fprintf(fil
, "DEVTREE_CONST struct device *const __pci_%d_%02x_%d = &%s;\n",
1294 ptr
->parent
->dev
->path_a
, ptr
->path_a
, ptr
->path_b
, ptr
->name
);
1296 if (chip_ins
->chip
->chiph_exists
) {
1297 fprintf(head
, "extern DEVTREE_CONST void *const __pci_%d_%02x_%d_config;\n",
1298 ptr
->parent
->dev
->path_a
, ptr
->path_a
, ptr
->path_b
);
1299 fprintf(fil
, "DEVTREE_CONST void *const __pci_%d_%02x_%d_config = &%s_info_%d;\n",
1300 ptr
->parent
->dev
->path_a
, ptr
->path_a
, ptr
->path_b
,
1301 chip_ins
->chip
->name_underscore
, chip_ins
->id
);
1305 if (ptr
->bustype
== PNP
) {
1306 fprintf(head
, "extern DEVTREE_CONST struct device *const __pnp_%04x_%02x;\n",
1307 ptr
->path_a
, ptr
->path_b
);
1308 fprintf(fil
, "DEVTREE_CONST struct device *const __pnp_%04x_%02x = &%s;\n",
1309 ptr
->path_a
, ptr
->path_b
, ptr
->name
);
1313 fprintf(head
, "extern DEVTREE_CONST struct device *const %s_ptr;\n", ptr
->name
);
1314 fprintf(fil
, "DEVTREE_CONST struct device *const %s_ptr = &%s;\n",
1315 ptr
->name
, ptr
->name
);
1319 static void add_siblings_to_queue(struct queue_entry
**bfs_q_head
,
1323 enqueue_tail(bfs_q_head
, d
);
1328 static void add_children_to_queue(struct queue_entry
**bfs_q_head
,
1331 struct bus
*bus
= d
->bus
;
1333 if (dev_has_children(d
))
1334 add_siblings_to_queue(bfs_q_head
, bus
->children
);
1337 static void walk_device_tree(FILE *fil
, FILE *head
, struct device
*ptr
,
1338 void (*func
)(FILE *, FILE *, struct device
*,
1341 struct queue_entry
*bfs_q_head
= NULL
;
1343 enqueue_tail(&bfs_q_head
, ptr
);
1345 while ((ptr
= dequeue_head(&bfs_q_head
))) {
1346 add_children_to_queue(&bfs_q_head
, ptr
);
1347 func(fil
, head
, ptr
, peek_queue_head(bfs_q_head
));
1351 static void emit_chip_headers(FILE *fil
, struct chip
*chip
)
1353 struct chip
*tmp
= chip
;
1356 if (chip
->chiph_exists
)
1357 fprintf(fil
, "#include \"%s/chip.h\"\n", chip
->name
);
1360 fprintf(fil
, "\n#if !DEVTREE_EARLY\n");
1362 "__attribute__((weak)) struct chip_operations mainboard_ops = {};\n");
1366 /* A lot of cpus do not define chip_operations at all, and the ones
1367 that do only initialise .name. */
1368 if (strstr(chip
->name_underscore
, "cpu_") == chip
->name_underscore
) {
1370 "__attribute__((weak)) struct chip_operations %s_ops = {};\n",
1371 chip
->name_underscore
);
1373 fprintf(fil
, "extern struct chip_operations %s_ops;\n",
1374 chip
->name_underscore
);
1378 fprintf(fil
, "#endif\n");
1381 static void emit_chip_instance(FILE *fil
, struct chip_instance
*instance
)
1383 fprintf(fil
, "STORAGE struct %s_config %s_info_%d = {",
1384 instance
->chip
->name_underscore
,
1385 instance
->chip
->name_underscore
,
1388 if (instance
->reg
) {
1390 struct reg
*r
= instance
->reg
;
1392 fprintf(fil
, "\t.%s = %s,\n", r
->key
, r
->value
);
1396 fprintf(fil
, "};\n\n");
1399 static void emit_chip_configs(FILE *fil
)
1401 struct chip
*chip
= chip_header
.next
;
1402 struct chip_instance
*instance
;
1405 for (; chip
; chip
= chip
->next
) {
1406 if (!chip
->chiph_exists
)
1410 instance
= chip
->instance
;
1413 * Emit this chip instance only if there is no forwarding pointer to the
1414 * base tree chip instance.
1416 if (instance
->base_chip_instance
== NULL
) {
1417 instance
->id
= chip_id
++;
1418 emit_chip_instance(fil
, instance
);
1420 instance
= instance
->next
;
1425 static void emit_identifiers(FILE *fil
, const char *decl
, const struct identifier
*it
)
1427 for (; it
!= NULL
; it
= it
->next
)
1428 fprintf(fil
, "extern %s %s;\n", decl
, it
->id
);
1431 static void inherit_subsystem_ids(FILE *file
, FILE *head
, struct device
*dev
,
1432 struct device
*next
)
1436 if (dev
->subsystem_vendor
!= -1 && dev
->subsystem_device
!= -1) {
1437 /* user already gave us a subsystem vendor/device */
1441 for (p
= dev
; p
&& p
->parent
->dev
!= p
; p
= p
->parent
->dev
) {
1443 if (p
->bustype
!= PCI
&& p
->bustype
!= DOMAIN
)
1446 if (p
->inherit_subsystem
) {
1447 dev
->subsystem_vendor
= p
->subsystem_vendor
;
1448 dev
->subsystem_device
= p
->subsystem_device
;
1454 static void parse_devicetree(const char *file
, struct bus
*parent
)
1456 FILE *filec
= fopen(file
, "r");
1464 root_parent
= parent
;
1472 static int device_probe_count(struct fw_config_probe
*probe
)
1476 probe
= probe
->next
;
1484 * When overriding devices, use the following rules:
1485 * 1. If probe count matches and:
1486 * a. Entire probe list matches for both devices -> Same device, override.
1487 * b. No probe entries match -> Different devices, do not override.
1488 * c. Partial list matches -> Bad device tree entries, fail build.
1490 * 2. If probe counts do not match and:
1491 * a. No probe entries match -> Different devices, do not override.
1492 * b. Partial list matches -> Bad device tree entries, fail build.
1494 static int device_probes_match(struct device
*a
, struct device
*b
)
1496 struct fw_config_probe
*a_probe
= a
->probe
;
1497 struct fw_config_probe
*b_probe
= b
->probe
;
1498 int a_probe_count
= device_probe_count(a_probe
);
1499 int b_probe_count
= device_probe_count(b_probe
);
1500 int match_count
= 0;
1503 if (check_probe_exists(b_probe
, a_probe
->field
, a_probe
->option
))
1505 a_probe
= a_probe
->next
;
1508 if ((a_probe_count
== b_probe_count
) && (a_probe_count
== match_count
))
1512 printf("ERROR: devices with overlapping probes: ");
1513 printf(a
->path
, a
->path_a
, a
->path_b
);
1514 printf(b
->path
, b
->path_a
, b
->path_b
);
1523 * Match device nodes from base and override tree to see if they are the same
1526 static int device_match(struct device
*a
, struct device
*b
)
1528 return ((a
->path_a
== b
->path_a
) &&
1529 (a
->path_b
== b
->path_b
) &&
1530 (a
->bustype
== b
->bustype
) &&
1531 (a
->chip_instance
->chip
==
1532 b
->chip_instance
->chip
));
1536 * Match resource nodes from base and override tree to see if they are the same
1539 static int res_match(struct resource
*a
, struct resource
*b
)
1541 return ((a
->type
== b
->type
) &&
1542 (a
->index
== b
->index
));
1546 * Add resource to device. If resource is already present, then update its base
1547 * and index. If not, then add a new resource to the device.
1549 static void update_resource(struct device
*dev
, struct resource
*res
)
1551 struct resource
*base_res
= dev
->res
;
1554 if (res_match(base_res
, res
)) {
1555 base_res
->base
= res
->base
;
1558 base_res
= base_res
->next
;
1561 new_resource(dev
, res
->type
, res
->index
, res
->base
);
1565 * Add register to chip instance. If register is already present, then update
1566 * its value. If not, then add a new register to the chip instance.
1568 static void update_register(struct reg
**const head
, struct reg
*reg
)
1570 struct reg
*base_reg
= *head
;
1573 if (!strcmp(base_reg
->key
, reg
->key
)) {
1574 base_reg
->value
= reg
->value
;
1577 base_reg
= base_reg
->next
;
1580 add_reg(head
, reg
->key
, reg
->value
);
1583 static void override_devicetree(struct bus
*base_parent
,
1584 struct bus
*override_parent
);
1587 * Update the base device properties using the properties of override device. In
1588 * addition to that, call override_devicetree for all the buses under the
1592 * +--------------------+--------------------------------------------+
1594 * |struct device member| Rule |
1596 * +-----------------------------------------------------------------+
1598 * | id | Unchanged. This is used to generate device |
1599 * | | structure name in static.c. So, no need to |
1602 * +-----------------------------------------------------------------+
1604 * | enabled | Copy enabled state from override device. |
1605 * | | This allows variants to override device |
1608 * +-----------------------------------------------------------------+
1610 * | subsystem_vendor | Copy from override device only if any one |
1611 * | subsystem_device | of the ids is non-zero. |
1613 * +-----------------------------------------------------------------+
1615 * | inherit_subsystem | Copy from override device only if it is |
1616 * | | non-zero. This allows variant to only |
1617 * | | enable inherit flag for a device. |
1619 * +-----------------------------------------------------------------+
1621 * | path | Unchanged since these are same for both |
1622 * | path_a | base and override device (Used for |
1623 * | path_b | matching devices). |
1625 * +-----------------------------------------------------------------+
1627 * | bustype | Unchanged since this is same for both base |
1628 * | | and override device (User for matching |
1631 * +-----------------------------------------------------------------+
1633 * | pci_irq_info | Unchanged. |
1635 * +-----------------------------------------------------------------+
1637 * | parent | Unchanged. This is meaningful only within |
1638 * | sibling | the parse tree, hence not being copied. |
1640 * +-----------------------------------------------------------------+
1642 * | res | Each resource that is present in override |
1643 * | | device is copied over to base device: |
1644 * | | 1. If resource of same type and index is |
1645 * | | present in base device, then base of |
1646 * | | the resource is copied. |
1647 * | | 2. If not, then a new resource is allocated|
1648 * | | under the base device using type, index |
1649 * | | and base from override res. |
1651 * +-----------------------------------------------------------------+
1653 * | ref | Each reference that is present in override |
1654 * | | device is copied over to base device with |
1655 * | | the same rules as registers. |
1657 * +-----------------------------------------------------------------+
1659 * | alias | Base device alias is copied to override. |
1660 * | | Override devices cannot change/remove an |
1661 * | | existing alias, but they can add an alias |
1662 * | | if one does not exist. |
1664 * +-----------------------------------------------------------------+
1666 * | smbios_slot info | Copy SMBIOS slot information from override.|
1667 * | | This allows variants to override PCI(e) |
1668 * | | slot information in SMBIOS tables. |
1670 * +-----------------------------------------------------------------+
1672 * | chip_instance | Each register of chip_instance is copied |
1673 * | | over from override device to base device: |
1674 * | | 1. If register with same key is present in |
1675 * | | base device, then value of the register |
1677 * | | 2. If not, then a new register is allocated|
1678 * | | under the base chip_instance using key |
1679 * | | and value from override register. |
1681 * +-----------------------------------------------------------------+
1683 * | bus | Recursively call override_devicetree on |
1684 * | | each bus of override device. It is assumed |
1685 * | | that bus with id X under base device |
1686 * | | to bus with id X under override device. |
1688 * +-----------------------------------------------------------------+
1690 static void update_device(struct device
*base_dev
, struct device
*override_dev
)
1693 * Copy the enabled state of override device to base device. This allows
1694 * override tree to enable or disable a particular device.
1696 base_dev
->enabled
= override_dev
->enabled
;
1699 * Copy the hidden state of override device to base device. This allows
1700 * override tree to hide or unhide a particular device.
1702 base_dev
->hidden
= override_dev
->hidden
;
1705 * Copy subsystem vendor and device ids from override device to base
1706 * device only if the ids are non-zero in override device. Else, honor
1707 * the values in base device.
1709 if (override_dev
->subsystem_vendor
||
1710 override_dev
->subsystem_device
) {
1711 base_dev
->subsystem_vendor
= override_dev
->subsystem_vendor
;
1712 base_dev
->subsystem_device
= override_dev
->subsystem_device
;
1716 * Copy value of inherity_subsystem from override device to base device
1717 * only if it is non-zero in override device. This allows override
1718 * tree to only enable inhert flag for a device.
1720 if (override_dev
->inherit_subsystem
)
1721 base_dev
->inherit_subsystem
= override_dev
->inherit_subsystem
;
1724 * Copy resources of override device to base device.
1725 * 1. If resource is already present in base device, then index and base
1726 * of the resource will be copied over.
1727 * 2. If resource is not already present in base device, a new resource
1728 * will be allocated.
1730 struct resource
*res
= override_dev
->res
;
1732 update_resource(base_dev
, res
);
1737 * Copy registers of override chip instance to base chip instance.
1738 * 1. If register key is already present in base chip instance, then
1739 * value for the register is copied over.
1740 * 2. If register key is not already present in base chip instance, then
1741 * a new register will be allocated.
1743 struct reg
*reg
= override_dev
->chip_instance
->reg
;
1745 update_register(&base_dev
->chip_instance
->reg
, reg
);
1749 /* Copy references just as with registers. */
1750 reg
= override_dev
->chip_instance
->ref
;
1752 update_register(&base_dev
->chip_instance
->ref
, reg
);
1756 /* Check for alias name conflicts. */
1757 if (override_dev
->alias
&& find_alias(&base_root_dev
, override_dev
->alias
)) {
1758 printf("ERROR: alias already exists: %s\n", override_dev
->alias
);
1763 * Copy alias from base device.
1765 * Override devices cannot change/remove an existing alias,
1766 * but they can add an alias to a device if one does not exist yet.
1768 if (base_dev
->alias
)
1769 override_dev
->alias
= base_dev
->alias
;
1771 base_dev
->alias
= override_dev
->alias
;
1774 * Use probe list from override device in place of base device, in order
1775 * to allow an override to remove a probe from the base device.
1777 base_dev
->probe
= override_dev
->probe
;
1779 /* Copy SMBIOS slot information from base device */
1780 base_dev
->smbios_slot_type
= override_dev
->smbios_slot_type
;
1781 base_dev
->smbios_slot_length
= override_dev
->smbios_slot_length
;
1782 base_dev
->smbios_slot_data_width
= override_dev
->smbios_slot_data_width
;
1783 base_dev
->smbios_slot_designation
= override_dev
->smbios_slot_designation
;
1786 * Update base_chip_instance member in chip instance of override tree to forward it to
1787 * the chip instance in base tree.
1789 override_dev
->chip_instance
->base_chip_instance
= get_chip_instance(base_dev
);
1791 /* Allow to override the ops of a device */
1792 if (override_dev
->ops_id
)
1793 base_dev
->ops_id
= override_dev
->ops_id
;
1796 * Now that the device properties are all copied over, look at each bus
1797 * of the override device and run override_devicetree in a recursive
1798 * manner. If base device has no bus but the override tree has, then a new
1799 * bus is allocated for it.
1801 struct bus
*override_bus
= override_dev
->bus
;
1802 struct bus
*base_bus
= base_dev
->bus
;
1805 * If we have more buses in override tree device, then allocate
1806 * a new bus for the base tree device as well.
1809 alloc_bus(base_dev
);
1811 override_devicetree(base_dev
->bus
, override_dev
->bus
);
1815 * Perform copy of device and properties from override parent to base parent.
1816 * This function walks through the override tree in a depth-first manner
1817 * performing following actions:
1818 * 1. If matching device is found in base tree, then copy the properties of
1819 * override device to base tree device. Call override_devicetree recursively on
1820 * the bus of override device.
1821 * 2. If matching device is not found in base tree, then set override tree
1822 * device as new child of base_parent and update the chip pointers in override
1823 * device subtree to ensure the nodes do not point to override tree chip
1826 static void override_devicetree(struct bus
*base_parent
,
1827 struct bus
*override_parent
)
1829 struct device
*base_child
;
1830 struct device
*override_child
= override_parent
->children
;
1831 struct device
*next_child
;
1833 while (override_child
) {
1835 /* Look for a matching device in base tree. */
1836 for (base_child
= base_parent
->children
;
1837 base_child
; base_child
= base_child
->sibling
) {
1838 if (!device_match(base_child
, override_child
))
1840 /* If base device has no probe statement, nothing else to compare. */
1841 if (base_child
->probe
== NULL
)
1844 * If base device has probe statements, ensure that all probe conditions
1845 * match for base and override device.
1847 if (device_probes_match(base_child
, override_child
))
1851 next_child
= override_child
->sibling
;
1854 * If matching device is found, copy properties of
1855 * override_child to base_child.
1858 update_device(base_child
, override_child
);
1861 * If matching device is not found, set override_child
1862 * as a new child of base_parent.
1864 set_new_child(base_parent
, override_child
);
1867 override_child
= next_child
;
1871 static void parse_override_devicetree(const char *file
, struct device
*dev
)
1873 parse_devicetree(file
, dev
->bus
);
1875 if (!dev_has_children(dev
)) {
1876 fprintf(stderr
, "ERROR: Override tree needs at least one device!\n");
1880 override_devicetree(&base_root_bus
, dev
->bus
);
1883 static void generate_outputh(FILE *f
, const char *fw_conf_header
, const char *device_header
)
1885 fprintf(f
, "#ifndef __STATIC_DEVICE_TREE_H\n");
1886 fprintf(f
, "#define __STATIC_DEVICE_TREE_H\n\n");
1888 fprintf(f
, "#include <%s>\n", fw_conf_header
);
1889 fprintf(f
, "#include <%s>\n\n", device_header
);
1891 fprintf(f
, "\n#endif /* __STATIC_DEVICE_TREE_H */\n");
1894 static void generate_outputc(FILE *f
, const char *static_header
)
1896 fprintf(f
, "#include <boot/coreboot_tables.h>\n");
1897 fprintf(f
, "#include <device/device.h>\n");
1898 fprintf(f
, "#include <device/pci.h>\n");
1899 fprintf(f
, "#include <fw_config.h>\n");
1900 fprintf(f
, "#include <identity.h>\n");
1901 fprintf(f
, "#include <%s>\n", static_header
);
1902 emit_chip_headers(f
, chip_header
.next
);
1903 emit_identifiers(f
, "struct device_operations", device_operations
);
1904 fprintf(f
, "\n#define STORAGE static __maybe_unused DEVTREE_CONST\n\n");
1906 walk_device_tree(NULL
, NULL
, &base_root_dev
, inherit_subsystem_ids
);
1907 fprintf(f
, "\n/* pass 0 */\n");
1908 walk_device_tree(f
, NULL
, &base_root_dev
, pass0
);
1909 walk_device_tree(NULL
, NULL
, &base_root_dev
, update_references
);
1910 fprintf(f
, "\n/* chip configs */\n");
1911 emit_chip_configs(f
);
1912 fprintf(f
, "\n/* pass 1 */\n");
1913 walk_device_tree(f
, NULL
, &base_root_dev
, pass1
);
1916 static void generate_outputd(FILE *gen
, FILE *dev
)
1918 fprintf(dev
, "#ifndef __STATIC_DEVICES_H\n");
1919 fprintf(dev
, "#define __STATIC_DEVICES_H\n\n");
1920 fprintf(dev
, "#include <device/device.h>\n\n");
1921 fprintf(dev
, "/* expose_device_names */\n");
1922 walk_device_tree(gen
, dev
, &base_root_dev
, expose_device_names
);
1923 fprintf(dev
, "\n#endif /* __STATIC_DEVICE_NAMES_H */\n");
1926 static void generate_outputf(FILE *f
)
1928 fprintf(f
, "#ifndef __STATIC_FW_CONFIG_H\n");
1929 fprintf(f
, "#define __STATIC_FW_CONFIG_H\n\n");
1931 fprintf(f
, "\n#endif /* __STATIC_FW_CONFIG_H */\n");
1934 static void usage(void)
1936 printf("Usage: sconfig <options>\n");
1937 printf(" -c | --output_c : Path to output static.c file (required)\n");
1938 printf(" -r | --output_h : Path to header static.h file (required)\n");
1939 printf(" -d | --output_d : Path to header static_devices.h file (required)\n");
1940 printf(" -f | --output_f : Path to header static_fw_config.h file (required)\n");
1941 printf(" -m | --mainboard_devtree : Path to mainboard devicetree file (required)\n");
1942 printf(" -o | --override_devtree : Path to override devicetree file (optional)\n");
1943 printf(" -p | --chipset_devtree : Path to chipset/SOC devicetree file (optional)\n");
1948 int main(int argc
, char **argv
)
1950 static const struct option long_options
[] = {
1951 { "mainboard_devtree", required_argument
, NULL
, 'm' },
1952 { "override_devtree", required_argument
, NULL
, 'o' },
1953 { "chipset_devtree", required_argument
, NULL
, 'p' },
1954 { "output_c", required_argument
, NULL
, 'c' },
1955 { "output_h", required_argument
, NULL
, 'r' },
1956 { "output_d", required_argument
, NULL
, 'd' },
1957 { "output_f", required_argument
, NULL
, 'f' },
1958 { "help", no_argument
, NULL
, 'h' },
1961 const char *override_devtree
= NULL
;
1962 const char *base_devtree
= NULL
;
1963 const char *chipset_devtree
= NULL
;
1964 const char *outputc
= NULL
;
1965 const char *outputh
= NULL
;
1966 const char *outputd
= NULL
;
1967 const char *outputf
= NULL
;
1968 int opt
, option_index
;
1970 while ((opt
= getopt_long(argc
, argv
, "m:o:p:c:r:d:f:h", long_options
,
1971 &option_index
)) != EOF
) {
1974 base_devtree
= strdup(optarg
);
1977 override_devtree
= strdup(optarg
);
1980 chipset_devtree
= strdup(optarg
);
1983 outputc
= strdup(optarg
);
1986 outputh
= strdup(optarg
);
1989 outputd
= strdup(optarg
);
1992 outputf
= strdup(optarg
);
2000 if (!base_devtree
|| !outputc
|| !outputh
|| !outputd
|| !outputf
)
2003 if (chipset_devtree
) {
2004 /* Use the chipset devicetree as the base, then override
2005 with the mainboard "base" devicetree. */
2006 parse_devicetree(chipset_devtree
, &base_root_bus
);
2007 parse_override_devicetree(base_devtree
, &chipset_root_dev
);
2009 parse_devicetree(base_devtree
, &base_root_bus
);
2012 if (override_devtree
)
2013 parse_override_devicetree(override_devtree
, &override_root_dev
);
2016 FILE *autogen
= fopen(outputc
, "w");
2018 fprintf(stderr
, "Could not open file '%s' for writing: ",
2024 FILE *autohead
= fopen(outputh
, "w");
2026 fprintf(stderr
, "Could not open file '%s' for writing: ", outputh
);
2032 FILE *autodev
= fopen(outputd
, "w");
2034 fprintf(stderr
, "Could not open file '%s' for writing: ", outputd
);
2041 FILE *autofwconf
= fopen(outputf
, "w");
2043 fprintf(stderr
, "Could not open file '%s' for writing: ", outputf
);
2051 char *f
= strdup(outputf
);
2053 char *d
= strdup(outputd
);
2055 char *h
= strdup(outputh
);
2058 const char *fw_conf_header
= basename(f
);
2059 const char *device_header
= basename(d
);
2060 const char *static_header
= basename(h
);
2062 generate_outputh(autohead
, fw_conf_header
, device_header
);
2063 generate_outputc(autogen
, static_header
);
2064 generate_outputd(autogen
, autodev
);
2065 generate_outputf(autofwconf
);