xref: /openbmc/u-boot/arch/x86/lib/tables.c (revision a5221b52)
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