15e2400e8SBin Meng /* 25e2400e8SBin Meng * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com> 35e2400e8SBin Meng * 45e2400e8SBin Meng * SPDX-License-Identifier: GPL-2.0+ 55e2400e8SBin Meng */ 65e2400e8SBin Meng 75e2400e8SBin Meng #include <common.h> 86388e357SSimon Glass #include <asm/sfi.h> 907545d86SBin Meng #include <asm/mpspec.h> 10721e992aSBin Meng #include <asm/smbios.h> 115e2400e8SBin Meng #include <asm/tables.h> 12867bcb63SSaket Sinha #include <asm/acpi_table.h> 135e2400e8SBin Meng 145e2400e8SBin Meng u8 table_compute_checksum(void *v, int len) 155e2400e8SBin Meng { 165e2400e8SBin Meng u8 *bytes = v; 175e2400e8SBin Meng u8 checksum = 0; 185e2400e8SBin Meng int i; 195e2400e8SBin Meng 205e2400e8SBin Meng for (i = 0; i < len; i++) 215e2400e8SBin Meng checksum -= bytes[i]; 225e2400e8SBin Meng 235e2400e8SBin Meng return checksum; 245e2400e8SBin Meng } 255e2400e8SBin Meng 267f5df8d4SBin Meng void table_fill_string(char *dest, const char *src, size_t n, char pad) 277f5df8d4SBin Meng { 287f5df8d4SBin Meng int start, len; 297f5df8d4SBin Meng int i; 307f5df8d4SBin Meng 317f5df8d4SBin Meng strncpy(dest, src, n); 327f5df8d4SBin Meng 337f5df8d4SBin Meng /* Fill the remaining bytes with pad */ 347f5df8d4SBin Meng len = strlen(src); 357f5df8d4SBin Meng start = len < n ? len : n; 367f5df8d4SBin Meng for (i = start; i < n; i++) 377f5df8d4SBin Meng dest[i] = pad; 387f5df8d4SBin Meng } 397f5df8d4SBin Meng 405e2400e8SBin Meng void write_tables(void) 415e2400e8SBin Meng { 42*a5221b52SBin Meng u32 __maybe_unused rom_table_start = ROM_TABLE_ADDR; 43*a5221b52SBin Meng u32 __maybe_unused rom_table_end; 445e2400e8SBin Meng 45cc4c8acaSBin Meng #ifdef CONFIG_GENERATE_PIRQ_TABLE 46*a5221b52SBin Meng rom_table_end = write_pirq_routing_table(rom_table_start); 475e2400e8SBin Meng rom_table_end = ALIGN(rom_table_end, 1024); 48*a5221b52SBin Meng rom_table_start = rom_table_end; 495e2400e8SBin Meng #endif 506388e357SSimon Glass #ifdef CONFIG_GENERATE_SFI_TABLE 51*a5221b52SBin Meng rom_table_end = write_sfi_table(rom_table_start); 526388e357SSimon Glass rom_table_end = ALIGN(rom_table_end, 1024); 53*a5221b52SBin Meng rom_table_start = rom_table_end; 546388e357SSimon Glass #endif 5507545d86SBin Meng #ifdef CONFIG_GENERATE_MP_TABLE 56*a5221b52SBin Meng rom_table_end = write_mp_table(rom_table_start); 5707545d86SBin Meng rom_table_end = ALIGN(rom_table_end, 1024); 58*a5221b52SBin Meng rom_table_start = rom_table_end; 5907545d86SBin Meng #endif 60867bcb63SSaket Sinha #ifdef CONFIG_GENERATE_ACPI_TABLE 61*a5221b52SBin Meng rom_table_end = write_acpi_tables(rom_table_start); 62867bcb63SSaket Sinha rom_table_end = ALIGN(rom_table_end, 1024); 63*a5221b52SBin Meng rom_table_start = rom_table_end; 64867bcb63SSaket Sinha #endif 65721e992aSBin Meng #ifdef CONFIG_GENERATE_SMBIOS_TABLE 66*a5221b52SBin Meng rom_table_end = write_smbios_table(rom_table_start); 67721e992aSBin Meng rom_table_end = ALIGN(rom_table_end, 1024); 68*a5221b52SBin Meng rom_table_start = rom_table_end; 69721e992aSBin Meng #endif 705e2400e8SBin Meng } 71