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 void probe_unprovisioned_fw_config(struct bus
*bus
)
586 bus
->dev
->enable_on_unprovisioned_fw_config
= true;
589 static uint64_t compute_fw_config_mask(const struct fw_config_field_bits
*bits
)
594 /* Compute mask from start and end bit. */
595 uint64_t tmp
= ((1ull << (1ull + bits
->end_bit
- bits
->start_bit
)) - 1ull);
596 tmp
<<= bits
->start_bit
;
604 static unsigned int bits_width(const struct fw_config_field_bits
*bits
)
606 return 1 + bits
->end_bit
- bits
->start_bit
;
609 static uint64_t calc_option_value(const struct fw_config_field
*field
,
610 const struct fw_config_option
*option
)
613 uint64_t original
= option
->value
;
615 struct fw_config_field_bits
*bits
= field
->bits
;
617 const unsigned int width
= bits_width(bits
);
618 const uint64_t orig_mask
= (1ull << width
) - 1ull;
619 const uint64_t orig
= (original
& orig_mask
);
620 value
|= (orig
<< bits
->start_bit
);
629 static void emit_fw_config(FILE *fil
)
631 struct fw_config_field
*field
= fw_config_fields
;
637 struct fw_config_option
*option
= field
->options
;
640 fprintf(fil
, "#define FW_CONFIG_FIELD_%s_NAME \"%s\"\n",
641 field
->name
, field
->name
);
643 mask
= compute_fw_config_mask(field
->bits
);
644 fprintf(fil
, "#define FW_CONFIG_FIELD_%s_MASK 0x%" PRIx64
"\n",
648 const uint64_t value
= calc_option_value(field
, option
);
649 fprintf(fil
, "#define FW_CONFIG_FIELD_%s_OPTION_%s_NAME \"%s\"\n",
650 field
->name
, option
->name
, option
->name
);
651 fprintf(fil
, "#define FW_CONFIG_FIELD_%s_OPTION_%s_VALUE 0x%"
652 PRIx64
"\n", field
->name
, option
->name
, value
);
653 option
= option
->next
;
662 static int emit_fw_config_probe(FILE *fil
, struct device
*dev
)
664 struct fw_config_probe
*probe
= dev
->probe
;
666 fprintf(fil
, "STORAGE struct fw_config %s_probe_list[] = {\n", dev
->name
);
669 /* Find matching field. */
670 struct fw_config_field
*field
;
671 struct fw_config_option
*option
;
672 uint64_t mask
, value
;
674 field
= find_fw_config_field(probe
->field
);
676 printf("ERROR: fw_config_probe field %s not found\n", probe
->field
);
679 option
= find_fw_config_option(field
, probe
->option
);
681 printf("ERROR: fw_config_probe field %s option %s not found\n",
682 probe
->field
, probe
->option
);
686 /* Fill out the probe structure with values from emit_fw_config(). */
687 fprintf(fil
, "\t{\n");
688 fprintf(fil
, "\t\t.field_name = FW_CONFIG_FIELD_%s_NAME,\n", probe
->field
);
689 fprintf(fil
, "\t\t.option_name = FW_CONFIG_FIELD_%s_OPTION_%s_NAME,\n",
690 probe
->field
, probe
->option
);
691 fprintf(fil
, "\t\t.mask = FW_CONFIG_FIELD_%s_MASK,\n", probe
->field
);
692 fprintf(fil
, "\t\t.value = FW_CONFIG_FIELD_%s_OPTION_%s_VALUE,\n",
693 probe
->field
, probe
->option
);
694 fprintf(fil
, "\t},\n");
699 /* Add empty entry to mark end of list. */
700 fprintf(fil
, "\t{ }\n};\n");
704 /* Enqueue identifier to list with head `*it`, if not already present. */
705 void add_identifier(struct identifier
**it
, const char *id
)
707 for (; *it
!= NULL
; it
= &(*it
)->next
) {
708 if (!strcmp((*it
)->id
, id
))
712 *it
= S_ALLOC(sizeof(**it
));
716 void add_device_ops(struct bus
*bus
, char *ops_id
)
718 if (bus
->dev
->ops_id
) {
719 printf("ERROR: Device operations may only be specified once,\n"
720 " found '%s', '%s'.\n", bus
->dev
->ops_id
, ops_id
);
724 add_identifier(&device_operations
, ops_id
);
725 bus
->dev
->ops_id
= ops_id
;
728 /* Allocate a new bus for the provided device. */
729 static void alloc_bus(struct device
*dev
)
731 struct bus
*bus
= S_ALLOC(sizeof(*bus
));
738 * Allocate a new device under the given parent. This function allocates a new
739 * device structure under the provided parent bus and allocates a bus structure
740 * under the newly allocated device.
742 static struct device
*alloc_dev(struct bus
*parent
)
744 struct device
*dev
= S_ALLOC(sizeof(*dev
));
746 dev
->parent
= parent
;
747 dev
->subsystem_vendor
= -1;
748 dev
->subsystem_device
= -1;
756 * This function scans the children of given bus to see if any device matches
757 * the new device that is requested.
759 * Returns pointer to the node if found, else NULL.
761 static struct device
*get_dev(struct bus
*parent
, int path_a
, int path_b
,
762 int bustype
, struct chip_instance
*chip_instance
)
764 struct device
*child
= parent
->children
;
767 if ((child
->path_a
== path_a
) && (child
->path_b
== path_b
) &&
768 (child
->bustype
== bustype
) &&
769 (child
->chip_instance
== chip_instance
))
772 child
= child
->sibling
;
779 * Add given node as child of the provided parent. If this is the first child of
780 * the parent, update parent->children pointer as well.
782 static void set_new_child(struct bus
*parent
, struct device
*child
)
784 struct device
*c
= parent
->children
;
790 parent
->children
= child
;
792 child
->sibling
= NULL
;
793 child
->parent
= parent
;
796 static const struct device
*find_alias(const struct device
*const parent
,
797 const char *const alias
)
799 if (parent
->alias
&& !strcmp(parent
->alias
, alias
))
802 const struct bus
*bus
= parent
->bus
;
806 const struct device
*child
;
807 for (child
= bus
->children
; child
; child
= child
->sibling
) {
808 const struct device
*const ret
= find_alias(child
, alias
);
816 static struct device
*new_device_with_path(struct bus
*parent
,
817 struct chip_instance
*chip_instance
,
818 const int bustype
, int path_a
, int path_b
,
819 char *alias
, int status
)
821 struct device
*new_d
;
823 /* We don't allow duplicate devices in devicetree. */
824 new_d
= get_dev(parent
, path_a
, path_b
, bustype
, chip_instance
);
826 printf("ERROR: Duplicate device! %s\n", new_d
->name
);
830 new_d
= alloc_dev(parent
);
832 new_d
->bustype
= bustype
;
834 new_d
->path_a
= path_a
;
835 new_d
->path_b
= path_b
;
836 new_d
->alias
= alias
;
838 new_d
->enabled
= status
& 0x01;
839 new_d
->hidden
= (status
>> 1) & 0x01;
840 new_d
->mandatory
= (status
>> 2) & 0x01;
841 new_d
->chip_instance
= chip_instance
;
843 set_new_child(parent
, new_d
);
847 new_d
->path
= ".type=DEVICE_PATH_PCI,{.pci={ .devfn = PCI_DEVFN(0x%x,%d)}}";
851 new_d
->path
= ".type=DEVICE_PATH_PNP,{.pnp={ .port = 0x%x, .device = 0x%x }}";
855 new_d
->path
= ".type=DEVICE_PATH_I2C,{.i2c={ .device = 0x%x, .mode_10bit = %d }}";
859 new_d
->path
= ".type=DEVICE_PATH_CPU_CLUSTER,{.cpu_cluster={ .cluster = 0x%x }}";
863 new_d
->path
= ".type=DEVICE_PATH_CPU,{.cpu={ .id = 0x%x }}";
867 new_d
->path
= ".type=DEVICE_PATH_DOMAIN,{.domain={ .domain_id = 0x%x }}";
871 new_d
->path
= ".type=DEVICE_PATH_GENERIC,{.generic={ .id = 0x%x, .subid = 0x%x }}";
875 new_d
->path
= ".type=DEVICE_PATH_SPI,{.spi={ .cs = 0x%x }}";
879 new_d
->path
= ".type=DEVICE_PATH_USB,{.usb={ .port_type = %d, .port_id = %d }}";
883 new_d
->path
= ".type=DEVICE_PATH_MMIO,{.mmio={ .addr = 0x%x }}";
887 new_d
->path
= ".type=DEVICE_PATH_GPIO,{.gpio={ .id = 0x%x }}";
891 new_d
->path
= ".type=DEVICE_PATH_MDIO,{.mdio={ .addr = 0x%x }}";
898 struct device
*new_device_reference(struct bus
*parent
,
899 struct chip_instance
*chip_instance
,
900 const char *reference
, int status
)
902 const struct device
*dev
= find_alias(&base_root_dev
, reference
);
905 printf("ERROR: Unable to find device reference %s\n", reference
);
909 return new_device_with_path(parent
, chip_instance
, dev
->bustype
, dev
->path_a
,
910 dev
->path_b
, NULL
, status
);
913 struct device
*new_device_raw(struct bus
*parent
,
914 struct chip_instance
*chip_instance
,
915 const int bustype
, const char *devnum
,
916 char *alias
, int status
)
922 /* Check for alias name conflicts. */
923 if (alias
&& find_alias(root_parent
->dev
, alias
)) {
924 printf("ERROR: Alias already exists: %s\n", alias
);
928 path_a
= strtol(devnum
, &tmp
, 16);
931 path_b
= strtol(tmp
, NULL
, 16);
934 return new_device_with_path(parent
, chip_instance
, bustype
, path_a
, path_b
, alias
,
938 static void new_resource(struct device
*dev
, int type
, int index
, int base
)
940 struct resource
*r
= S_ALLOC(sizeof(struct resource
));
946 struct resource
*head
= dev
->res
;
955 void add_resource(struct bus
*bus
, int type
, int index
, int base
)
957 new_resource(bus
->dev
, type
, index
, base
);
960 static void add_reg(struct reg
**const head
, char *const name
, char *const val
)
962 struct reg
*const r
= S_ALLOC(sizeof(struct reg
));
963 struct reg
*prev
= NULL
;
969 for (cur
= *head
; cur
!= NULL
; prev
= cur
, cur
= cur
->next
) {
970 const int sort
= strcmp(r
->key
, cur
->key
);
972 printf("ERROR: duplicate 'register' key '%s'.\n", r
->key
);
985 void add_register(struct chip_instance
*chip_instance
, char *name
, char *val
)
987 add_reg(&chip_instance
->reg
, name
, val
);
990 void add_reference(struct chip_instance
*const chip_instance
,
991 char *const name
, char *const alias
)
993 add_reg(&chip_instance
->ref
, name
, alias
);
996 static void set_reference(struct chip_instance
*const chip_instance
,
997 char *const name
, char *const alias
)
999 const struct device
*const dev
= find_alias(&base_root_dev
, alias
);
1001 printf("ERROR: Cannot find device alias '%s'.\n", alias
);
1005 char *const ref_name
= S_ALLOC(strlen(dev
->name
) + 2);
1006 sprintf(ref_name
, "&%s", dev
->name
);
1007 add_register(chip_instance
, name
, ref_name
);
1010 static void update_references(FILE *file
, FILE *head
, struct device
*dev
,
1011 struct device
*next
)
1015 for (ref
= dev
->chip_instance
->ref
; ref
; ref
= ref
->next
)
1016 set_reference(dev
->chip_instance
, ref
->key
, ref
->value
);
1019 void add_slot_desc(struct bus
*bus
, char *type
, char *length
, char *designation
,
1022 struct device
*dev
= bus
->dev
;
1024 if (dev
->bustype
!= PCI
&& dev
->bustype
!= DOMAIN
) {
1025 printf("ERROR: 'slot_type' only allowed for PCI devices\n");
1029 dev
->smbios_slot_type
= type
;
1030 dev
->smbios_slot_length
= length
;
1031 dev
->smbios_slot_data_width
= data_width
;
1032 dev
->smbios_slot_designation
= designation
;
1035 void add_smbios_dev_info(struct bus
*bus
, long instance_id
, const char *refdes
)
1037 struct device
*dev
= bus
->dev
;
1039 if (dev
->bustype
!= PCI
&& dev
->bustype
!= DOMAIN
) {
1040 printf("ERROR: 'dev_info' only allowed for PCI devices\n");
1044 if (instance_id
< 0 || instance_id
> UINT8_MAX
) {
1045 printf("ERROR: SMBIOS dev info instance ID '%ld' out of range\n", instance_id
);
1049 dev
->smbios_instance_id_valid
= 1;
1050 dev
->smbios_instance_id
= (unsigned int)instance_id
;
1051 dev
->smbios_refdes
= refdes
;
1054 void add_pci_subsystem_ids(struct bus
*bus
, int vendor
, int device
,
1057 struct device
*dev
= bus
->dev
;
1059 if (dev
->bustype
!= PCI
&& dev
->bustype
!= DOMAIN
) {
1060 printf("ERROR: 'subsystem' only allowed for PCI devices\n");
1064 dev
->subsystem_vendor
= vendor
;
1065 dev
->subsystem_device
= device
;
1066 dev
->inherit_subsystem
= inherit
;
1069 static int dev_has_children(struct device
*dev
)
1071 struct bus
*bus
= dev
->bus
;
1073 if (bus
&& bus
->children
)
1079 static void pass0(FILE *fil
, FILE *head
, struct device
*ptr
, struct device
*next
)
1083 if (ptr
== &base_root_dev
) {
1084 fprintf(fil
, "STORAGE struct bus %s_bus;\n",
1092 name
= S_ALLOC(6 + strlen(ptr
->alias
));
1093 sprintf(name
, "_dev_%s", ptr
->alias
);
1096 sprintf(name
, "_dev_%d", dev_id
++);
1101 fprintf(fil
, "STORAGE struct device %s;\n", ptr
->name
);
1103 fprintf(fil
, "STORAGE struct resource %s_res[];\n",
1105 if (dev_has_children(ptr
))
1106 fprintf(fil
, "STORAGE struct bus %s_bus;\n",
1113 "DEVTREE_CONST struct device * DEVTREE_CONST last_dev = &%s;\n",
1117 static void emit_smbios_data(FILE *fil
, struct device
*ptr
)
1119 fprintf(fil
, "#if !DEVTREE_EARLY\n");
1120 fprintf(fil
, "#if CONFIG(GENERATE_SMBIOS_TABLES)\n");
1122 /* SMBIOS types start at 1, if zero it hasn't been set */
1123 if (ptr
->smbios_slot_type
)
1124 fprintf(fil
, "\t.smbios_slot_type = %s,\n",
1125 ptr
->smbios_slot_type
);
1126 if (ptr
->smbios_slot_data_width
)
1127 fprintf(fil
, "\t.smbios_slot_data_width = %s,\n",
1128 ptr
->smbios_slot_data_width
);
1129 if (ptr
->smbios_slot_designation
)
1130 fprintf(fil
, "\t.smbios_slot_designation = \"%s\",\n",
1131 ptr
->smbios_slot_designation
);
1132 if (ptr
->smbios_slot_length
)
1133 fprintf(fil
, "\t.smbios_slot_length = %s,\n",
1134 ptr
->smbios_slot_length
);
1136 /* Fill in SMBIOS type41 fields */
1137 if (ptr
->smbios_instance_id_valid
) {
1138 fprintf(fil
, "\t.smbios_instance_id_valid = true,\n");
1139 fprintf(fil
, "\t.smbios_instance_id = %u,\n", ptr
->smbios_instance_id
);
1140 if (ptr
->smbios_refdes
)
1141 fprintf(fil
, "\t.smbios_refdes = \"%s\",\n", ptr
->smbios_refdes
);
1144 fprintf(fil
, "#endif\n");
1145 fprintf(fil
, "#endif\n");
1148 static void emit_resources(FILE *fil
, struct device
*ptr
)
1150 if (ptr
->res
== NULL
)
1154 fprintf(fil
, "STORAGE struct resource %s_res[] = {\n", ptr
->name
);
1155 struct resource
*r
= ptr
->res
;
1158 "\t\t{ .flags=IORESOURCE_FIXED | IORESOURCE_ASSIGNED | IORESOURCE_");
1160 fprintf(fil
, "IRQ");
1162 fprintf(fil
, "DRQ");
1165 fprintf(fil
, ", .index=0x%x, .base=0x%x,", r
->index
,
1168 fprintf(fil
, ".next=&%s_res[%d]},\n", ptr
->name
,
1171 fprintf(fil
, ".next=NULL },\n");
1175 fprintf(fil
, "\t };\n");
1178 static void emit_dev_bus(FILE *fil
, struct device
*ptr
)
1180 fprintf(fil
, "STORAGE struct bus %s_bus = {\n",
1183 assert(ptr
->bus
&& ptr
->bus
->children
);
1184 struct bus
*bus
= ptr
->bus
;
1186 fprintf(fil
, "\t.dev = &%s,\n", bus
->dev
->name
);
1187 fprintf(fil
, "\t.children = &%s,\n", bus
->children
->name
);
1189 fprintf(fil
, "};\n");
1192 static struct chip_instance
*get_chip_instance(const struct device
*dev
)
1194 struct chip_instance
*chip_ins
= dev
->chip_instance
;
1196 * If the chip instance of device has base_chip_instance pointer set, then follow that
1197 * to update the chip instance for current device.
1199 if (chip_ins
->base_chip_instance
)
1200 chip_ins
= chip_ins
->base_chip_instance
;
1205 static void pass1(FILE *fil
, FILE *head
, struct device
*ptr
, struct device
*next
)
1207 struct chip_instance
*chip_ins
= get_chip_instance(ptr
);
1208 int has_children
= dev_has_children(ptr
);
1210 /* Emit probe structures. */
1211 if (ptr
->probe
&& (emit_fw_config_probe(fil
, ptr
) < 0)) {
1218 if (ptr
== &base_root_dev
)
1219 fprintf(fil
, "DEVTREE_CONST struct device %s = {\n", ptr
->name
);
1221 fprintf(fil
, "STORAGE struct device %s = {\n", ptr
->name
);
1223 fprintf(fil
, "#if !DEVTREE_EARLY\n");
1226 * ops field can be set in the devicetree. If unspecified, it is set
1227 * to default_dev_ops_root only for the root device, other devices
1228 * get it set by the driver at runtime.
1231 fprintf(fil
, "\t.ops = &%s,\n", ptr
->ops_id
);
1232 else if (ptr
== &base_root_dev
)
1233 fprintf(fil
, "\t.ops = &default_dev_ops_root,\n");
1235 fprintf(fil
, "\t.ops = NULL,\n");
1236 fprintf(fil
, "#endif\n");
1237 fprintf(fil
, "\t.upstream = &%s_bus,\n", ptr
->parent
->dev
->name
);
1238 fprintf(fil
, "\t.path = {");
1239 fprintf(fil
, ptr
->path
, ptr
->path_a
, ptr
->path_b
);
1240 fprintf(fil
, "},\n");
1241 fprintf(fil
, "\t.enabled = %d,\n", ptr
->enabled
);
1242 fprintf(fil
, "\t.hidden = %d,\n", ptr
->hidden
);
1243 fprintf(fil
, "\t.mandatory = %d,\n", ptr
->mandatory
);
1244 fprintf(fil
, "\t.on_mainboard = 1,\n");
1245 if (ptr
->subsystem_vendor
> 0)
1246 fprintf(fil
, "\t.subsystem_vendor = 0x%04x,\n",
1247 ptr
->subsystem_vendor
);
1249 if (ptr
->subsystem_device
> 0)
1250 fprintf(fil
, "\t.subsystem_device = 0x%04x,\n",
1251 ptr
->subsystem_device
);
1254 fprintf(fil
, "\t.resource_list = &%s_res[0],\n",
1258 fprintf(fil
, "\t.downstream = &%s_bus,\n",
1261 fprintf(fil
, "\t.downstream = NULL,\n");
1263 fprintf(fil
, "\t.sibling = &%s,\n", ptr
->sibling
->name
);
1265 fprintf(fil
, "\t.sibling = NULL,\n");
1267 fprintf(fil
, "\t.probe_list = %s_probe_list,\n", ptr
->name
);
1268 fprintf(fil
, "\t.enable_on_unprovisioned_fw_config = %d,\n",
1269 ptr
->enable_on_unprovisioned_fw_config
);
1270 fprintf(fil
, "#if !DEVTREE_EARLY\n");
1271 fprintf(fil
, "\t.chip_ops = &%s_ops,\n",
1272 chip_ins
->chip
->name_underscore
);
1273 if (chip_ins
== &mainboard_instance
)
1274 fprintf(fil
, "\t.name = mainboard_name,\n");
1275 fprintf(fil
, "#endif\n");
1276 if (chip_ins
->chip
->chiph_exists
)
1277 fprintf(fil
, "\t.chip_info = &%s_info_%d,\n",
1278 chip_ins
->chip
->name_underscore
, chip_ins
->id
);
1280 fprintf(fil
, "\t.next=&%s,\n", next
->name
);
1282 emit_smbios_data(fil
, ptr
);
1284 fprintf(fil
, "};\n");
1286 emit_resources(fil
, ptr
);
1289 emit_dev_bus(fil
, ptr
);
1292 static void expose_device_names(FILE *fil
, FILE *head
, struct device
*ptr
, struct device
*next
)
1294 struct chip_instance
*chip_ins
= get_chip_instance(ptr
);
1296 /* Only devices on root bus here. */
1297 if (ptr
->bustype
== PCI
&& ptr
->parent
->dev
->bustype
== DOMAIN
) {
1299 fprintf(head
, "static const pci_devfn_t _sdev_%s = PCI_DEV(%d, %d, %d);\n",
1300 ptr
->alias
, ptr
->parent
->dev
->path_a
, ptr
->path_a
, ptr
->path_b
);
1302 fprintf(head
, "extern DEVTREE_CONST struct device *const __pci_%d_%02x_%d;\n",
1303 ptr
->parent
->dev
->path_a
, ptr
->path_a
, ptr
->path_b
);
1304 fprintf(fil
, "DEVTREE_CONST struct device *const __pci_%d_%02x_%d = &%s;\n",
1305 ptr
->parent
->dev
->path_a
, ptr
->path_a
, ptr
->path_b
, ptr
->name
);
1307 if (chip_ins
->chip
->chiph_exists
) {
1308 fprintf(head
, "extern DEVTREE_CONST void *const __pci_%d_%02x_%d_config;\n",
1309 ptr
->parent
->dev
->path_a
, ptr
->path_a
, ptr
->path_b
);
1310 fprintf(fil
, "DEVTREE_CONST void *const __pci_%d_%02x_%d_config = &%s_info_%d;\n",
1311 ptr
->parent
->dev
->path_a
, ptr
->path_a
, ptr
->path_b
,
1312 chip_ins
->chip
->name_underscore
, chip_ins
->id
);
1316 if (ptr
->bustype
== PNP
) {
1318 fprintf(head
, "static const pnp_devfn_t _sdev_%s = PNP_DEV(0x%02x, 0x%04x);\n",
1319 ptr
->alias
, ptr
->path_a
, ptr
->path_b
);
1321 fprintf(head
, "extern DEVTREE_CONST struct device *const __pnp_%04x_%02x;\n",
1322 ptr
->path_a
, ptr
->path_b
);
1323 fprintf(fil
, "DEVTREE_CONST struct device *const __pnp_%04x_%02x = &%s;\n",
1324 ptr
->path_a
, ptr
->path_b
, ptr
->name
);
1328 fprintf(head
, "extern DEVTREE_CONST struct device *const %s_ptr;\n", ptr
->name
);
1329 fprintf(fil
, "DEVTREE_CONST struct device *const %s_ptr = &%s;\n",
1330 ptr
->name
, ptr
->name
);
1334 static void add_siblings_to_queue(struct queue_entry
**bfs_q_head
,
1338 enqueue_tail(bfs_q_head
, d
);
1343 static void add_children_to_queue(struct queue_entry
**bfs_q_head
,
1346 struct bus
*bus
= d
->bus
;
1348 if (dev_has_children(d
))
1349 add_siblings_to_queue(bfs_q_head
, bus
->children
);
1352 static void walk_device_tree(FILE *fil
, FILE *head
, struct device
*ptr
,
1353 void (*func
)(FILE *, FILE *, struct device
*,
1356 struct queue_entry
*bfs_q_head
= NULL
;
1358 enqueue_tail(&bfs_q_head
, ptr
);
1360 while ((ptr
= dequeue_head(&bfs_q_head
))) {
1361 add_children_to_queue(&bfs_q_head
, ptr
);
1362 func(fil
, head
, ptr
, peek_queue_head(bfs_q_head
));
1366 static void emit_chip_headers(FILE *fil
, struct chip
*chip
)
1368 struct chip
*tmp
= chip
;
1371 if (chip
->chiph_exists
)
1372 fprintf(fil
, "#include \"%s/chip.h\"\n", chip
->name
);
1375 fprintf(fil
, "\n#if !DEVTREE_EARLY\n");
1377 "__attribute__((weak)) struct chip_operations mainboard_ops = {};\n");
1381 /* A lot of cpus do not define chip_operations at all, and the ones
1382 that do only initialise .name. */
1383 if (strstr(chip
->name_underscore
, "cpu_") == chip
->name_underscore
) {
1385 "__attribute__((weak)) struct chip_operations %s_ops = {};\n",
1386 chip
->name_underscore
);
1388 fprintf(fil
, "extern struct chip_operations %s_ops;\n",
1389 chip
->name_underscore
);
1393 fprintf(fil
, "#endif\n");
1396 static void emit_chip_instance(FILE *fil
, struct chip_instance
*instance
)
1398 fprintf(fil
, "STORAGE struct %s_config %s_info_%d = {",
1399 instance
->chip
->name_underscore
,
1400 instance
->chip
->name_underscore
,
1403 if (instance
->reg
) {
1405 struct reg
*r
= instance
->reg
;
1407 fprintf(fil
, "\t.%s = %s,\n", r
->key
, r
->value
);
1411 fprintf(fil
, "};\n\n");
1414 static void emit_chip_configs(FILE *fil
)
1416 struct chip
*chip
= chip_header
.next
;
1417 struct chip_instance
*instance
;
1420 for (; chip
; chip
= chip
->next
) {
1421 if (!chip
->chiph_exists
)
1425 instance
= chip
->instance
;
1428 * Emit this chip instance only if there is no forwarding pointer to the
1429 * base tree chip instance.
1431 if (instance
->base_chip_instance
== NULL
) {
1432 instance
->id
= chip_id
++;
1433 emit_chip_instance(fil
, instance
);
1435 instance
= instance
->next
;
1440 static void emit_identifiers(FILE *fil
, const char *decl
, const struct identifier
*it
)
1442 for (; it
!= NULL
; it
= it
->next
)
1443 fprintf(fil
, "extern %s %s;\n", decl
, it
->id
);
1446 static void inherit_subsystem_ids(FILE *file
, FILE *head
, struct device
*dev
,
1447 struct device
*next
)
1451 if (dev
->subsystem_vendor
!= -1 && dev
->subsystem_device
!= -1) {
1452 /* user already gave us a subsystem vendor/device */
1456 for (p
= dev
; p
&& p
->parent
->dev
!= p
; p
= p
->parent
->dev
) {
1458 if (p
->bustype
!= PCI
&& p
->bustype
!= DOMAIN
)
1461 if (p
->inherit_subsystem
) {
1462 dev
->subsystem_vendor
= p
->subsystem_vendor
;
1463 dev
->subsystem_device
= p
->subsystem_device
;
1469 static void parse_devicetree(const char *file
, struct bus
*parent
)
1471 FILE *filec
= fopen(file
, "r");
1479 root_parent
= parent
;
1487 static int device_probe_count(struct fw_config_probe
*probe
)
1491 probe
= probe
->next
;
1499 * When overriding devices, use the following rules:
1500 * 1. If probe count matches and:
1501 * a. Entire probe list matches for both devices -> Same device, override.
1502 * b. No probe entries match -> Different devices, do not override.
1503 * c. Partial list matches -> Bad device tree entries, fail build.
1505 * 2. If probe counts do not match and:
1506 * a. No probe entries match -> Different devices, do not override.
1507 * b. Partial list matches -> Bad device tree entries, fail build.
1509 static int device_probes_match(struct device
*a
, struct device
*b
)
1511 struct fw_config_probe
*a_probe
= a
->probe
;
1512 struct fw_config_probe
*b_probe
= b
->probe
;
1513 int a_probe_count
= device_probe_count(a_probe
);
1514 int b_probe_count
= device_probe_count(b_probe
);
1515 int match_count
= 0;
1518 if (check_probe_exists(b_probe
, a_probe
->field
, a_probe
->option
))
1520 a_probe
= a_probe
->next
;
1523 if ((a_probe_count
== b_probe_count
) && (a_probe_count
== match_count
))
1527 printf("ERROR: devices with overlapping probes: ");
1528 printf(a
->path
, a
->path_a
, a
->path_b
);
1529 printf(b
->path
, b
->path_a
, b
->path_b
);
1538 * Match device nodes from base and override tree to see if they are the same
1541 static int device_match(struct device
*a
, struct device
*b
)
1543 return ((a
->path_a
== b
->path_a
) &&
1544 (a
->path_b
== b
->path_b
) &&
1545 (a
->bustype
== b
->bustype
) &&
1546 (a
->chip_instance
->chip
==
1547 b
->chip_instance
->chip
));
1551 * Match resource nodes from base and override tree to see if they are the same
1554 static int res_match(struct resource
*a
, struct resource
*b
)
1556 return ((a
->type
== b
->type
) &&
1557 (a
->index
== b
->index
));
1561 * Add resource to device. If resource is already present, then update its base
1562 * and index. If not, then add a new resource to the device.
1564 static void update_resource(struct device
*dev
, struct resource
*res
)
1566 struct resource
*base_res
= dev
->res
;
1569 if (res_match(base_res
, res
)) {
1570 base_res
->base
= res
->base
;
1573 base_res
= base_res
->next
;
1576 new_resource(dev
, res
->type
, res
->index
, res
->base
);
1580 * Add register to chip instance. If register is already present, then update
1581 * its value. If not, then add a new register to the chip instance.
1583 static void update_register(struct reg
**const head
, struct reg
*reg
)
1585 struct reg
*base_reg
= *head
;
1588 if (!strcmp(base_reg
->key
, reg
->key
)) {
1589 base_reg
->value
= reg
->value
;
1592 base_reg
= base_reg
->next
;
1595 add_reg(head
, reg
->key
, reg
->value
);
1598 static void override_devicetree(struct bus
*base_parent
,
1599 struct bus
*override_parent
);
1602 * Update the base device properties using the properties of override device. In
1603 * addition to that, call override_devicetree for all the buses under the
1607 * +--------------------+--------------------------------------------+
1609 * |struct device member| Rule |
1611 * +-----------------------------------------------------------------+
1613 * | id | Unchanged. This is used to generate device |
1614 * | | structure name in static.c. So, no need to |
1617 * +-----------------------------------------------------------------+
1619 * | enabled | Copy enabled state from override device. |
1620 * | | This allows variants to override device |
1623 * +-----------------------------------------------------------------+
1625 * | subsystem_vendor | Copy from override device only if any one |
1626 * | subsystem_device | of the ids is non-zero. |
1628 * +-----------------------------------------------------------------+
1630 * | inherit_subsystem | Copy from override device only if it is |
1631 * | | non-zero. This allows variant to only |
1632 * | | enable inherit flag for a device. |
1634 * +-----------------------------------------------------------------+
1636 * | path | Unchanged since these are same for both |
1637 * | path_a | base and override device (Used for |
1638 * | path_b | matching devices). |
1640 * +-----------------------------------------------------------------+
1642 * | bustype | Unchanged since this is same for both base |
1643 * | | and override device (User for matching |
1646 * +-----------------------------------------------------------------+
1648 * | pci_irq_info | Unchanged. |
1650 * +-----------------------------------------------------------------+
1652 * | parent | Unchanged. This is meaningful only within |
1653 * | sibling | the parse tree, hence not being copied. |
1655 * +-----------------------------------------------------------------+
1657 * | res | Each resource that is present in override |
1658 * | | device is copied over to base device: |
1659 * | | 1. If resource of same type and index is |
1660 * | | present in base device, then base of |
1661 * | | the resource is copied. |
1662 * | | 2. If not, then a new resource is allocated|
1663 * | | under the base device using type, index |
1664 * | | and base from override res. |
1666 * +-----------------------------------------------------------------+
1668 * | ref | Each reference that is present in override |
1669 * | | device is copied over to base device with |
1670 * | | the same rules as registers. |
1672 * +-----------------------------------------------------------------+
1674 * | alias | Base device alias is copied to override. |
1675 * | | Override devices cannot change/remove an |
1676 * | | existing alias, but they can add an alias |
1677 * | | if one does not exist. |
1679 * +-----------------------------------------------------------------+
1681 * | smbios_slot info | Copy SMBIOS slot information from override.|
1682 * | | This allows variants to override PCI(e) |
1683 * | | slot information in SMBIOS tables. |
1685 * +-----------------------------------------------------------------+
1687 * | chip_instance | Each register of chip_instance is copied |
1688 * | | over from override device to base device: |
1689 * | | 1. If register with same key is present in |
1690 * | | base device, then value of the register |
1692 * | | 2. If not, then a new register is allocated|
1693 * | | under the base chip_instance using key |
1694 * | | and value from override register. |
1696 * +-----------------------------------------------------------------+
1698 * | bus | Recursively call override_devicetree on |
1699 * | | each bus of override device. It is assumed |
1700 * | | that bus with id X under base device |
1701 * | | to bus with id X under override device. |
1703 * +-----------------------------------------------------------------+
1705 static void update_device(struct device
*base_dev
, struct device
*override_dev
)
1708 * Copy the enabled state of override device to base device. This allows
1709 * override tree to enable or disable a particular device.
1711 base_dev
->enabled
= override_dev
->enabled
;
1714 * Copy the hidden state of override device to base device. This allows
1715 * override tree to hide or unhide a particular device.
1717 base_dev
->hidden
= override_dev
->hidden
;
1720 * Copy subsystem vendor and device ids from override device to base
1721 * device only if the ids are non-zero in override device. Else, honor
1722 * the values in base device.
1724 if (override_dev
->subsystem_vendor
||
1725 override_dev
->subsystem_device
) {
1726 base_dev
->subsystem_vendor
= override_dev
->subsystem_vendor
;
1727 base_dev
->subsystem_device
= override_dev
->subsystem_device
;
1731 * Copy value of inherity_subsystem from override device to base device
1732 * only if it is non-zero in override device. This allows override
1733 * tree to only enable inhert flag for a device.
1735 if (override_dev
->inherit_subsystem
)
1736 base_dev
->inherit_subsystem
= override_dev
->inherit_subsystem
;
1739 * Copy resources of override device to base device.
1740 * 1. If resource is already present in base device, then index and base
1741 * of the resource will be copied over.
1742 * 2. If resource is not already present in base device, a new resource
1743 * will be allocated.
1745 struct resource
*res
= override_dev
->res
;
1747 update_resource(base_dev
, res
);
1752 * Copy registers of override chip instance to base chip instance.
1753 * 1. If register key is already present in base chip instance, then
1754 * value for the register is copied over.
1755 * 2. If register key is not already present in base chip instance, then
1756 * a new register will be allocated.
1758 struct reg
*reg
= override_dev
->chip_instance
->reg
;
1760 update_register(&base_dev
->chip_instance
->reg
, reg
);
1764 /* Copy references just as with registers. */
1765 reg
= override_dev
->chip_instance
->ref
;
1767 update_register(&base_dev
->chip_instance
->ref
, reg
);
1771 /* Check for alias name conflicts. */
1772 if (override_dev
->alias
&& find_alias(&base_root_dev
, override_dev
->alias
)) {
1773 printf("ERROR: alias already exists: %s\n", override_dev
->alias
);
1778 * Copy alias from base device.
1780 * Override devices cannot change/remove an existing alias,
1781 * but they can add an alias to a device if one does not exist yet.
1783 if (base_dev
->alias
)
1784 override_dev
->alias
= base_dev
->alias
;
1786 base_dev
->alias
= override_dev
->alias
;
1789 * Use probe list from override device in place of base device, in order
1790 * to allow an override to remove a probe from the base device.
1792 base_dev
->probe
= override_dev
->probe
;
1793 base_dev
->enable_on_unprovisioned_fw_config
=
1794 override_dev
->enable_on_unprovisioned_fw_config
;
1796 /* Copy SMBIOS slot information from base device */
1797 base_dev
->smbios_slot_type
= override_dev
->smbios_slot_type
;
1798 base_dev
->smbios_slot_length
= override_dev
->smbios_slot_length
;
1799 base_dev
->smbios_slot_data_width
= override_dev
->smbios_slot_data_width
;
1800 base_dev
->smbios_slot_designation
= override_dev
->smbios_slot_designation
;
1803 * Update base_chip_instance member in chip instance of override tree to forward it to
1804 * the chip instance in base tree.
1806 override_dev
->chip_instance
->base_chip_instance
= get_chip_instance(base_dev
);
1808 /* Allow to override the ops of a device */
1809 if (override_dev
->ops_id
)
1810 base_dev
->ops_id
= override_dev
->ops_id
;
1813 * Now that the device properties are all copied over, look at each bus
1814 * of the override device and run override_devicetree in a recursive
1815 * manner. If base device has no bus but the override tree has, then a new
1816 * bus is allocated for it.
1818 struct bus
*override_bus
= override_dev
->bus
;
1819 struct bus
*base_bus
= base_dev
->bus
;
1822 * If we have more buses in override tree device, then allocate
1823 * a new bus for the base tree device as well.
1826 alloc_bus(base_dev
);
1828 override_devicetree(base_dev
->bus
, override_dev
->bus
);
1832 * Perform copy of device and properties from override parent to base parent.
1833 * This function walks through the override tree in a depth-first manner
1834 * performing following actions:
1835 * 1. If matching device is found in base tree, then copy the properties of
1836 * override device to base tree device. Call override_devicetree recursively on
1837 * the bus of override device.
1838 * 2. If matching device is not found in base tree, then set override tree
1839 * device as new child of base_parent and update the chip pointers in override
1840 * device subtree to ensure the nodes do not point to override tree chip
1843 static void override_devicetree(struct bus
*base_parent
,
1844 struct bus
*override_parent
)
1846 struct device
*base_child
;
1847 struct device
*override_child
= override_parent
->children
;
1848 struct device
*next_child
;
1850 while (override_child
) {
1852 /* Look for a matching device in base tree. */
1853 for (base_child
= base_parent
->children
;
1854 base_child
; base_child
= base_child
->sibling
) {
1855 if (!device_match(base_child
, override_child
))
1857 /* If base device has no probe statement, nothing else to compare. */
1858 if (base_child
->probe
== NULL
)
1861 * If base device has probe statements, ensure that all probe conditions
1862 * match for base and override device.
1864 if (device_probes_match(base_child
, override_child
))
1868 next_child
= override_child
->sibling
;
1871 * If matching device is found, copy properties of
1872 * override_child to base_child.
1875 update_device(base_child
, override_child
);
1878 * If matching device is not found, set override_child
1879 * as a new child of base_parent.
1881 set_new_child(base_parent
, override_child
);
1884 override_child
= next_child
;
1888 static void parse_override_devicetree(const char *file
, struct device
*dev
)
1890 parse_devicetree(file
, dev
->bus
);
1892 if (!dev_has_children(dev
)) {
1893 fprintf(stderr
, "ERROR: Override tree needs at least one device!\n");
1897 override_devicetree(&base_root_bus
, dev
->bus
);
1900 static void generate_outputh(FILE *f
, const char *fw_conf_header
, const char *device_header
)
1902 fprintf(f
, "#ifndef __STATIC_DEVICE_TREE_H\n");
1903 fprintf(f
, "#define __STATIC_DEVICE_TREE_H\n\n");
1905 fprintf(f
, "#include <%s>\n", fw_conf_header
);
1906 fprintf(f
, "#include <%s>\n\n", device_header
);
1908 fprintf(f
, "/* Returns pointer to config structure of root device (B:D:F = 0:00:0) */\n");
1909 fprintf(f
, "#define config_of_soc() __pci_0_00_0_config\n\n");
1911 fprintf(f
, "/* Macro to generate `struct device *` name that points to a device with the given alias. */\n");
1912 fprintf(f
, "#define DEV_PTR(_alias) \t_dev_##_alias##_ptr\n\n");
1914 fprintf(f
, "/* Macro to generate weak `struct device *` definition that points to a device with the given\n");
1915 fprintf(f
, " alias. */\n");
1916 fprintf(f
, "#define WEAK_DEV_PTR(_alias)\t\t\t\\\n");
1917 fprintf(f
, "\t__weak DEVTREE_CONST struct device *const DEV_PTR(_alias)\n");
1919 fprintf(f
, "\n#endif /* __STATIC_DEVICE_TREE_H */\n");
1922 static void generate_outputc(FILE *f
, const char *static_header
)
1924 fprintf(f
, "#include <boot/coreboot_tables.h>\n");
1925 fprintf(f
, "#include <device/device.h>\n");
1926 fprintf(f
, "#include <device/pci.h>\n");
1927 fprintf(f
, "#include <fw_config.h>\n");
1928 fprintf(f
, "#include <identity.h>\n");
1929 fprintf(f
, "#include <%s>\n", static_header
);
1930 emit_chip_headers(f
, chip_header
.next
);
1931 emit_identifiers(f
, "struct device_operations", device_operations
);
1932 fprintf(f
, "\n#define STORAGE static __maybe_unused DEVTREE_CONST\n\n");
1934 walk_device_tree(NULL
, NULL
, &base_root_dev
, inherit_subsystem_ids
);
1935 fprintf(f
, "\n/* pass 0 */\n");
1936 walk_device_tree(f
, NULL
, &base_root_dev
, pass0
);
1937 walk_device_tree(NULL
, NULL
, &base_root_dev
, update_references
);
1938 fprintf(f
, "\n/* chip configs */\n");
1939 emit_chip_configs(f
);
1940 fprintf(f
, "\n/* pass 1 */\n");
1941 walk_device_tree(f
, NULL
, &base_root_dev
, pass1
);
1944 static void generate_outputd(FILE *gen
, FILE *dev
)
1946 fprintf(dev
, "#ifndef __STATIC_DEVICES_H\n");
1947 fprintf(dev
, "#define __STATIC_DEVICES_H\n\n");
1948 fprintf(dev
, "#include <device/pci_type.h>\n");
1949 fprintf(dev
, "#include <device/pnp_type.h>\n");
1950 fprintf(dev
, "#include <device/device.h>\n\n");
1951 fprintf(dev
, "/* expose_device_names */\n");
1952 walk_device_tree(gen
, dev
, &base_root_dev
, expose_device_names
);
1953 fprintf(dev
, "\n#endif /* __STATIC_DEVICE_NAMES_H */\n");
1956 static void generate_outputf(FILE *f
)
1958 fprintf(f
, "#ifndef __STATIC_FW_CONFIG_H\n");
1959 fprintf(f
, "#define __STATIC_FW_CONFIG_H\n\n");
1961 fprintf(f
, "\n#endif /* __STATIC_FW_CONFIG_H */\n");
1964 static void usage(void)
1966 printf("Usage: sconfig <options>\n");
1967 printf(" -c | --output_c : Path to output static.c file (required)\n");
1968 printf(" -r | --output_h : Path to header static.h file (required)\n");
1969 printf(" -d | --output_d : Path to header static_devices.h file (required)\n");
1970 printf(" -f | --output_f : Path to header static_fw_config.h file (required)\n");
1971 printf(" -m | --mainboard_devtree : Path to mainboard devicetree file (required)\n");
1972 printf(" -o | --override_devtree : Path to override devicetree file (optional)\n");
1973 printf(" -p | --chipset_devtree : Path to chipset/SOC devicetree file (optional)\n");
1978 int main(int argc
, char **argv
)
1980 static const struct option long_options
[] = {
1981 { "mainboard_devtree", required_argument
, NULL
, 'm' },
1982 { "override_devtree", required_argument
, NULL
, 'o' },
1983 { "chipset_devtree", required_argument
, NULL
, 'p' },
1984 { "output_c", required_argument
, NULL
, 'c' },
1985 { "output_h", required_argument
, NULL
, 'r' },
1986 { "output_d", required_argument
, NULL
, 'd' },
1987 { "output_f", required_argument
, NULL
, 'f' },
1988 { "help", no_argument
, NULL
, 'h' },
1991 const char *override_devtree
= NULL
;
1992 const char *base_devtree
= NULL
;
1993 const char *chipset_devtree
= NULL
;
1994 const char *outputc
= NULL
;
1995 const char *outputh
= NULL
;
1996 const char *outputd
= NULL
;
1997 const char *outputf
= NULL
;
1998 int opt
, option_index
;
2000 while ((opt
= getopt_long(argc
, argv
, "m:o:p:c:r:d:f:h", long_options
,
2001 &option_index
)) != EOF
) {
2004 base_devtree
= optarg
;
2007 override_devtree
= optarg
;
2010 chipset_devtree
= optarg
;
2030 if (!base_devtree
|| !outputc
|| !outputh
|| !outputd
|| !outputf
)
2033 if (chipset_devtree
) {
2034 /* Use the chipset devicetree as the base, then override
2035 with the mainboard "base" devicetree. */
2036 parse_devicetree(chipset_devtree
, &base_root_bus
);
2037 parse_override_devicetree(base_devtree
, &chipset_root_dev
);
2039 parse_devicetree(base_devtree
, &base_root_bus
);
2042 if (override_devtree
)
2043 parse_override_devicetree(override_devtree
, &override_root_dev
);
2046 FILE *autogen
= fopen(outputc
, "w");
2048 fprintf(stderr
, "Could not open file '%s' for writing: ",
2054 FILE *autohead
= fopen(outputh
, "w");
2056 fprintf(stderr
, "Could not open file '%s' for writing: ", outputh
);
2062 FILE *autodev
= fopen(outputd
, "w");
2064 fprintf(stderr
, "Could not open file '%s' for writing: ", outputd
);
2071 FILE *autofwconf
= fopen(outputf
, "w");
2073 fprintf(stderr
, "Could not open file '%s' for writing: ", outputf
);
2081 char *f
= strdup(outputf
);
2083 char *d
= strdup(outputd
);
2085 char *h
= strdup(outputh
);
2088 const char *fw_conf_header
= basename(f
);
2089 const char *device_header
= basename(d
);
2090 const char *static_header
= basename(h
);
2092 generate_outputh(autohead
, fw_conf_header
, device_header
);
2093 generate_outputc(autogen
, static_header
);
2094 generate_outputd(autogen
, autodev
);
2095 generate_outputf(autofwconf
);