/**************************************************************************** * write_cmos_layout * * Write CMOS layout information to file 'f'. The output is written in the * format that CMOS layout files adhere to. ****************************************************************************/ void write_cmos_layout(FILE * f) { const cmos_entry_t *cmos_entry; const cmos_enum_t *cmos_enum; cmos_checksum_layout_t layout; fprintf(f, "entries\n"); for (cmos_entry = first_cmos_entry(); cmos_entry != NULL; cmos_entry = next_cmos_entry(cmos_entry)) fprintf(f, "%u %u %c %u %s\n", cmos_entry->bit, cmos_entry->length, cmos_entry_char_value(cmos_entry->config), cmos_entry->config_id, cmos_entry->name); fprintf(f, "\nenumerations\n"); for (cmos_enum = first_cmos_enum(); cmos_enum != NULL; cmos_enum = next_cmos_enum(cmos_enum)) fprintf(f, "%u %llu %s\n", cmos_enum->config_id, cmos_enum->value, cmos_enum->text); layout.summed_area_start = cmos_checksum_start; layout.summed_area_end = cmos_checksum_end; layout.checksum_at = cmos_checksum_index; checksum_layout_to_bits(&layout); fprintf(f, "\nchecksums\nchecksum %u %u %u\n", layout.summed_area_start, layout.summed_area_end, layout.checksum_at); }
void write_cmos_layout_header(const char *header_filename) { FILE *fp; const cmos_entry_t *cmos_entry; cmos_checksum_layout_t layout; if ((fp = fopen(header_filename, "w+")) == NULL) { fprintf(stderr, "%s: Can't open file %s for writing: %s\n", prog_name, header_filename, strerror(errno)); exit(1); } fprintf(fp, "/**\n * This is an autogenerated file. Do not EDIT.\n" " * All changes made to this file will be lost.\n" " * See mainboard's cmos.layout file.\n */\n" "\n#ifndef __OPTION_TABLE_H\n" "#define __OPTION_TABLE_H\n\n"); for (cmos_entry = first_cmos_entry(); cmos_entry != NULL; cmos_entry = next_cmos_entry(cmos_entry)) { if (!is_ident((char *)cmos_entry->name)) { fprintf(stderr, "Error - Name %s is an invalid identifier\n", cmos_entry->name); fclose(fp); exit(1); } fprintf(fp, "#define CMOS_VSTART_%s\t%d\n", cmos_entry->name, cmos_entry->bit); fprintf(fp, "#define CMOS_VLEN_%s\t%d\n", cmos_entry->name, cmos_entry->length); } layout.summed_area_start = cmos_checksum_start; layout.summed_area_end = cmos_checksum_end; layout.checksum_at = cmos_checksum_index; checksum_layout_to_bits(&layout); fprintf(fp, "\n#define LB_CKS_RANGE_START %d\n", layout.summed_area_start / 8); fprintf(fp, "#define LB_CKS_RANGE_END %d\n", layout.summed_area_end / 8); fprintf(fp, "#define LB_CKS_LOC %d\n", layout.checksum_at / 8); fprintf(fp, "\n#endif /* __OPTION_TABLE_H */\n"); fclose(fp); }
int write_cmos_layout_bin(FILE *f) { const cmos_entry_t *cmos_entry; const cmos_enum_t *cmos_enum; cmos_checksum_layout_t layout; struct cmos_option_table table; struct cmos_entries entry; struct cmos_enums cenum; struct cmos_checksum csum; size_t sum = 0; int len; for (cmos_entry = first_cmos_entry(); cmos_entry != NULL; cmos_entry = next_cmos_entry(cmos_entry)) { if (cmos_entry == first_cmos_entry()) { sum += sizeof(table); table.header_length = sizeof(table); table.tag = LB_TAG_CMOS_OPTION_TABLE; table.size = 0; if (fwrite((char *)&table, sizeof(table), 1, f) != 1) { perror("Error writing image file"); goto err; } } memset(&entry, 0, sizeof(entry)); entry.tag = LB_TAG_OPTION; entry.config = cmos_entry->config; entry.config_id = (uint32_t)cmos_entry->config_id; entry.bit = cmos_entry->bit; entry.length = cmos_entry->length; if (!is_ident((char *)cmos_entry->name)) { fprintf(stderr, "Error - Name %s is an invalid identifier\n", cmos_entry->name); goto err; } memcpy(entry.name, cmos_entry->name, strlen(cmos_entry->name)); entry.name[strlen(cmos_entry->name)] = '\0'; len = strlen(cmos_entry->name) + 1; if (len % 4) ROUNDUP4(len); entry.size = sizeof(entry) - CMOS_MAX_NAME_LENGTH + len; sum += entry.size; if (fwrite((char *)&entry, entry.size, 1, f) != 1) { perror("Error writing image file"); goto err; } } for (cmos_enum = first_cmos_enum(); cmos_enum != NULL; cmos_enum = next_cmos_enum(cmos_enum)) { memset(&cenum, 0, sizeof(cenum)); cenum.tag = LB_TAG_OPTION_ENUM; memcpy(cenum.text, cmos_enum->text, strlen(cmos_enum->text)); cenum.text[strlen(cmos_enum->text)] = '\0'; len = strlen((char *)cenum.text) + 1; if (len % 4) ROUNDUP4(len); cenum.config_id = cmos_enum->config_id; cenum.value = cmos_enum->value; cenum.size = sizeof(cenum) - CMOS_MAX_TEXT_LENGTH + len; sum += cenum.size; if (fwrite((char *)&cenum, cenum.size, 1, f) != 1) { perror("Error writing image file"); goto err; } } layout.summed_area_start = cmos_checksum_start; layout.summed_area_end = cmos_checksum_end; layout.checksum_at = cmos_checksum_index; checksum_layout_to_bits(&layout); csum.tag = LB_TAG_OPTION_CHECKSUM; csum.size = sizeof(csum); csum.range_start = layout.summed_area_start; csum.range_end = layout.summed_area_end; csum.location = layout.checksum_at; csum.type = CHECKSUM_PCBIOS; sum += csum.size; if (fwrite((char *)&csum, csum.size, 1, f) != 1) { perror("Error writing image file"); goto err; } if (fseek(f, 0, SEEK_SET) != 0) { perror("Error while seeking"); goto err; } table.size = sum; if (fwrite((char *)&table, sizeof(table), 1, f) != 1) { perror("Error writing image file"); goto err; } return sum; err: fclose(f); exit(1); }