summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/Kconfig4
-rw-r--r--src/lib/Makefile.mk6
-rw-r--r--src/lib/bootmem.c3
-rw-r--r--src/lib/bootmode.c4
-rw-r--r--src/lib/bootsplash.c14
-rw-r--r--src/lib/coreboot_table.c8
-rw-r--r--src/lib/edid_fill_fb.c7
-rw-r--r--src/lib/ext_stage_cache.c4
-rw-r--r--src/lib/fit_payload.c7
-rw-r--r--src/lib/fmap.c3
-rw-r--r--src/lib/fw_config.c4
-rw-r--r--src/lib/imd_cbmem.c27
-rw-r--r--src/lib/jpeg.c72
-rw-r--r--src/lib/jpeg.h13
-rw-r--r--src/lib/prog_loaders.c4
-rw-r--r--src/lib/smbios.c41
-rw-r--r--src/lib/string.c16
-rw-r--r--src/lib/thread.c2
18 files changed, 142 insertions, 97 deletions
diff --git a/src/lib/Kconfig b/src/lib/Kconfig
index e896704e39..2c1a93cff1 100644
--- a/src/lib/Kconfig
+++ b/src/lib/Kconfig
@@ -49,6 +49,10 @@ config DIMM_MAX
It is multiplication of number of channel to number of DIMMs per
channel
+config MAX_SOCKET
+ int
+ default 1
+
config DIMM_SPD_SIZE
int
default 256
diff --git a/src/lib/Makefile.mk b/src/lib/Makefile.mk
index 56d8b1afd5..40df2b8f56 100644
--- a/src/lib/Makefile.mk
+++ b/src/lib/Makefile.mk
@@ -314,7 +314,11 @@ RMODULE_LDFLAGS := -z defs -Bsymbolic
# rmdoule is named $(1).rmod
define rmodule_link
$(strip $(1)): $(strip $(2)) $$(COMPILER_RT_rmodules_$(3)) $(call src-to-obj,rmodules_$(3),src/lib/rmodule.ld) | $$(RMODTOOL)
- $$(LD_rmodules_$(3)) $$(LDFLAGS_rmodules_$(3)) $(RMODULE_LDFLAGS) $($(1)-ldflags) -T $(call src-to-obj,rmodules_$(3),src/lib/rmodule.ld) -o $$@ --whole-archive --start-group $(filter-out %.ld,$(2)) --end-group
+ifeq ($(CONFIG_LTO),y)
+ $$(CC_rmodules_$(3)) $$(CPPFLAGS_rmodules_$(3)) $$(CFLAGS_rmodules_$(3)) $$(LDFLAGS_rmodules_$(3):%=-Wl,%) $$(COMPILER_RT_FLAGS_rmodules_$(3):%=-Wl,%) $(RMODULE_LDFLAGS) $($(1)-ldflags:%=-Wl,%) -T $(call src-to-obj,rmodules_$(3),src/lib/rmodule.ld) -o $$@ -Wl,--whole-archive -Wl,--start-group $(filter-out %.ld,$(2)) -Wl,--no-whole-archive $$(COMPILER_RT_rmodules_$(3)) -Wl,--end-group
+else
+ $$(LD_rmodules_$(3)) $$(LDFLAGS_rmodules_$(3)) $(RMODULE_LDFLAGS) $($(1)-ldflags) -T $(call src-to-obj,rmodules_$(3),src/lib/rmodule.ld) -o $$@ --whole-archive --start-group $(filter-out %.ld,$(2)) --no-whole-archive $$(COMPILER_RT_rmodules_$(3)) --end-group
+endif
$$(NM_rmodules_$(3)) -n $$@ > $$(basename $$@).map
endef
diff --git a/src/lib/bootmem.c b/src/lib/bootmem.c
index 578ddac19f..ab15e85d08 100644
--- a/src/lib/bootmem.c
+++ b/src/lib/bootmem.c
@@ -4,6 +4,7 @@
#include <bootmem.h>
#include <cbmem.h>
#include <device/resource.h>
+#include <drivers/efi/capsules.h>
#include <symbols.h>
#include <assert.h>
#include <types.h>
@@ -80,6 +81,8 @@ static void bootmem_init(void)
/* Add memory used by CBMEM. */
cbmem_add_bootmem();
+ efi_add_capsules_to_bootmem();
+
bootmem_add_range((uintptr_t)_stack, REGION_SIZE(stack),
BM_MEM_RAMSTAGE);
bootmem_add_range((uintptr_t)_program, REGION_SIZE(program),
diff --git a/src/lib/bootmode.c b/src/lib/bootmode.c
index 2d5a7eb004..3cf77d6fd8 100644
--- a/src/lib/bootmode.c
+++ b/src/lib/bootmode.c
@@ -21,10 +21,6 @@ void gfx_set_init_done(int done)
int display_init_required(void)
{
- /* Need display for showing splash screen. */
- if (CONFIG(BMP_LOGO))
- return 1;
-
/* For vboot, honor VB2_CONTEXT_DISPLAY_INIT. */
if (CONFIG(VBOOT)) {
/* Must always select MUST_REQUEST_DISPLAY when using this
diff --git a/src/lib/bootsplash.c b/src/lib/bootsplash.c
index 38d0ce7c97..2ec0052bfa 100644
--- a/src/lib/bootsplash.c
+++ b/src/lib/bootsplash.c
@@ -28,8 +28,9 @@ void set_bootsplash(unsigned char *framebuffer, unsigned int x_resolution,
}
unsigned int image_width, image_height;
- if (jpeg_fetch_size(jpeg, filesize, &image_width, &image_height) != 0) {
- printk(BIOS_ERR, "Could not parse bootsplash.jpg\n");
+ const char *err = jpeg_fetch_size(jpeg, filesize, &image_width, &image_height);
+ if (err != NULL) {
+ printk(BIOS_ERR, "Could not parse bootsplash.jpg: %s\n", err);
return;
}
@@ -45,12 +46,11 @@ void set_bootsplash(unsigned char *framebuffer, unsigned int x_resolution,
framebuffer += (yres - image_height) / 2 * bytes_per_line
+ (xres - image_width) / 2 * (fb_resolution / 8);
- int ret = jpeg_decode(jpeg, filesize, framebuffer, image_width, image_height,
- bytes_per_line, fb_resolution);
+ err = jpeg_decode(jpeg, filesize, framebuffer, image_width, image_height,
+ bytes_per_line, fb_resolution);
cbfs_unmap(jpeg);
- if (ret != 0) {
- printk(BIOS_ERR, "Bootsplash could not be decoded. jpeg_decode returned %d.\n",
- ret);
+ if (err != NULL) {
+ printk(BIOS_ERR, "Could not decode bootsplash.jpg: %s\n", err);
return;
}
printk(BIOS_INFO, "Bootsplash loaded\n");
diff --git a/src/lib/coreboot_table.c b/src/lib/coreboot_table.c
index d7b6126385..e954edb822 100644
--- a/src/lib/coreboot_table.c
+++ b/src/lib/coreboot_table.c
@@ -536,9 +536,17 @@ static uintptr_t write_coreboot_table(uintptr_t rom_table_end)
if (CONFIG(SMMSTORE_V2))
lb_smmstorev2(head);
+ /* Add information about firmware in form suitable for EFI updates. */
+ if (CONFIG(DRIVERS_EFI_FW_INFO))
+ lb_efi_fw_info(head);
+
/* Add board-specific table entries, if any. */
lb_board(head);
+ /* Possibly add UEFI capsules. */
+ if (CONFIG(DRIVERS_EFI_UPDATE_CAPSULES))
+ lb_efi_capsules(head);
+
if (CONFIG(CHROMEOS_RAMOOPS))
lb_ramoops(head);
diff --git a/src/lib/edid_fill_fb.c b/src/lib/edid_fill_fb.c
index e4fb08c3fd..c72b70172c 100644
--- a/src/lib/edid_fill_fb.c
+++ b/src/lib/edid_fill_fb.c
@@ -148,6 +148,13 @@ fb_add_framebuffer_info(uintptr_t fb_addr, uint32_t x_resolution,
return info;
}
+/* Wrapper for Ada to have a simpler function signature */
+int fb_add_framebuffer_info_simple(uintptr_t fb_addr, uint32_t x_res, uint32_t y_res,
+ uint32_t bytes_per_line, uint8_t bits_per_pixel)
+{
+ return fb_add_framebuffer_info(fb_addr, x_res, y_res, bytes_per_line, bits_per_pixel) != NULL;
+}
+
void fb_set_orientation(struct fb_info *info, enum lb_fb_orientation orientation)
{
if (!info)
diff --git a/src/lib/ext_stage_cache.c b/src/lib/ext_stage_cache.c
index 462a635dc8..427c9c30bb 100644
--- a/src/lib/ext_stage_cache.c
+++ b/src/lib/ext_stage_cache.c
@@ -16,6 +16,8 @@ static void stage_cache_create_empty(void)
imd = &imd_stage_cache;
stage_cache_external_region(&base, &size);
+ if (base == NULL || size == 0)
+ return;
imd_handle_init(imd, (void *)(size + (uintptr_t)base));
printk(BIOS_DEBUG, "External stage cache:\n");
@@ -32,6 +34,8 @@ static void stage_cache_recover(void)
imd = &imd_stage_cache;
stage_cache_external_region(&base, &size);
+ if (base == NULL || size == 0)
+ return;
imd_handle_init(imd, (void *)(size + (uintptr_t)base));
if (imd_recover(imd))
printk(BIOS_DEBUG, "Unable to recover external stage cache.\n");
diff --git a/src/lib/fit_payload.c b/src/lib/fit_payload.c
index 21bc4e87ed..aea1ba75e9 100644
--- a/src/lib/fit_payload.c
+++ b/src/lib/fit_payload.c
@@ -110,8 +110,8 @@ static void add_cb_fdt_data(struct device_tree *tree)
{
u32 addr_cells = 1, size_cells = 1;
u64 reg_addrs[2], reg_sizes[2];
- void *baseptr = NULL;
- size_t size = 0;
+ void *baseptr;
+ size_t size;
static const char *firmware_path[] = {"firmware", NULL};
struct device_tree_node *firmware_node = dt_find_node(tree->root,
@@ -140,8 +140,7 @@ static void add_cb_fdt_data(struct device_tree *tree)
/* Second is the CBMEM area (which usually includes the coreboot
table). */
- cbmem_get_region(&baseptr, &size);
- if (!baseptr || size == 0) {
+ if (cbmem_get_region(&baseptr, &size)) {
printk(BIOS_WARNING, "FIT: CBMEM pointer/size not found!\n");
return;
}
diff --git a/src/lib/fmap.c b/src/lib/fmap.c
index 75c5a9fb1c..80fb0b2be6 100644
--- a/src/lib/fmap.c
+++ b/src/lib/fmap.c
@@ -199,8 +199,7 @@ int fmap_locate_area(const char *name, struct region *ar)
printk(BIOS_DEBUG, "FMAP: area %s found @ %x (%d bytes)\n",
name, le32toh(area->offset), le32toh(area->size));
- ar->offset = le32toh(area->offset);
- ar->size = le32toh(area->size);
+ *ar = region_create(le32toh(area->offset), le32toh(area->size));
rdev_munmap(&fmrd, area);
diff --git a/src/lib/fw_config.c b/src/lib/fw_config.c
index 02e2a7dadd..e03256764b 100644
--- a/src/lib/fw_config.c
+++ b/src/lib/fw_config.c
@@ -104,6 +104,10 @@ bool fw_config_probe_dev(const struct device *dev, const struct fw_config **matc
if (!dev->probe_list)
return true;
+ /* If the device wants to be enabled during unprovisioned fw_config */
+ if (!fw_config_is_provisioned() && dev->enable_on_unprovisioned_fw_config)
+ return true;
+
for (probe = dev->probe_list; probe && probe->mask != 0; probe++) {
if (!fw_config_probe(probe))
continue;
diff --git a/src/lib/imd_cbmem.c b/src/lib/imd_cbmem.c
index 91c86211f5..2fc54bfff7 100644
--- a/src/lib/imd_cbmem.c
+++ b/src/lib/imd_cbmem.c
@@ -15,17 +15,17 @@ uintptr_t _cbmem_top_ptr;
static struct imd imd;
-void *cbmem_top(void)
+uintptr_t cbmem_top(void)
{
if (ENV_CREATES_CBMEM) {
static uintptr_t top;
if (top)
- return (void *)top;
+ return top;
top = cbmem_top_chipset();
- return (void *)top;
+ return top;
}
if (ENV_POSTCAR || ENV_RAMSTAGE)
- return (void *)_cbmem_top_ptr;
+ return _cbmem_top_ptr;
dead_code();
}
@@ -55,7 +55,7 @@ static void cbmem_top_init_once(void)
/* The test is only effective on X86 and when address hits UC memory. */
if (ENV_X86)
- quick_ram_check_or_die((uintptr_t)cbmem_top() - sizeof(u32));
+ quick_ram_check_or_die(cbmem_top() - sizeof(u32));
}
void cbmem_initialize_empty_id_size(u32 id, u64 size)
@@ -64,7 +64,7 @@ void cbmem_initialize_empty_id_size(u32 id, u64 size)
cbmem_top_init_once();
- imd_handle_init(&imd, cbmem_top());
+ imd_handle_init(&imd, (void *)cbmem_top());
printk(BIOS_DEBUG, "CBMEM:\n");
@@ -95,7 +95,7 @@ int cbmem_initialize_id_size(u32 id, u64 size)
cbmem_top_init_once();
- imd_handle_init(&imd, cbmem_top());
+ imd_handle_init(&imd, (void *)cbmem_top());
if (imd_recover(&imd))
return 1;
@@ -193,16 +193,19 @@ void *cbmem_entry_start(const struct cbmem_entry *entry)
void cbmem_add_bootmem(void)
{
- void *baseptr = NULL;
- size_t size = 0;
+ void *baseptr;
+ size_t size;
- cbmem_get_region(&baseptr, &size);
+ if (cbmem_get_region(&baseptr, &size)) {
+ printk(BIOS_ERR, "CBMEM pointer/size not found!\n");
+ return;
+ }
bootmem_add_range((uintptr_t)baseptr, size, BM_MEM_TABLE);
}
-void cbmem_get_region(void **baseptr, size_t *size)
+int cbmem_get_region(void **baseptr, size_t *size)
{
- imd_region_used(&imd, baseptr, size);
+ return imd_region_used(&imd, baseptr, size);
}
#if ENV_PAYLOAD_LOADER || (CONFIG(EARLY_CBMEM_LIST) && ENV_HAS_CBMEM)
diff --git a/src/lib/jpeg.c b/src/lib/jpeg.c
index 242cf0ca8e..d084c1a7a5 100644
--- a/src/lib/jpeg.c
+++ b/src/lib/jpeg.c
@@ -1,9 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
- * Provide a simple API around the Wuffs JPEG decoder
- * Uses the heap (and lots of it) for the image-size specific
- * work buffer, so ramstage-only.
+ * Provide a simple API around the Wuffs JPEG decoder.
*/
#include <stdint.h>
@@ -21,38 +19,38 @@
/* ~16K is big enough to move this off the stack */
static wuffs_jpeg__decoder dec;
-int jpeg_fetch_size(unsigned char *filedata, size_t filesize, unsigned int *width,
- unsigned int *height)
+const char *jpeg_fetch_size(unsigned char *filedata, size_t filesize, unsigned int *width,
+ unsigned int *height)
{
if (!width || !height) {
- return JPEG_DECODE_FAILED;
+ return "invalid arg";
}
wuffs_base__status status = wuffs_jpeg__decoder__initialize(
&dec, sizeof(dec), WUFFS_VERSION, WUFFS_INITIALIZE__DEFAULT_OPTIONS);
if (status.repr) {
- return JPEG_DECODE_FAILED;
+ return status.repr;
}
wuffs_base__image_config imgcfg;
wuffs_base__io_buffer src = wuffs_base__ptr_u8__reader(filedata, filesize, true);
status = wuffs_jpeg__decoder__decode_image_config(&dec, &imgcfg, &src);
if (status.repr) {
- return JPEG_DECODE_FAILED;
+ return status.repr;
}
*width = wuffs_base__pixel_config__width(&imgcfg.pixcfg);
*height = wuffs_base__pixel_config__height(&imgcfg.pixcfg);
- return 0;
+ return NULL;
}
-int jpeg_decode(unsigned char *filedata, size_t filesize, unsigned char *pic,
- unsigned int width, unsigned int height, unsigned int bytes_per_line,
- unsigned int depth)
+const char *jpeg_decode(unsigned char *filedata, size_t filesize, unsigned char *pic,
+ unsigned int width, unsigned int height, unsigned int bytes_per_line,
+ unsigned int depth)
{
if (!filedata || !pic) {
- return JPEG_DECODE_FAILED;
+ return "invalid arg";
}
/* Relatively arbitrary limit that shouldn't hurt anybody.
* 300M (10k*10k*3bytes/pixel) is already larger than our heap, so
@@ -61,7 +59,7 @@ int jpeg_decode(unsigned char *filedata, size_t filesize, unsigned char *pic,
* calculations in this function.
*/
if ((width > 10000) || (height > 10000)) {
- return JPEG_DECODE_FAILED;
+ return "invalid arg";
}
uint32_t pixfmt;
@@ -76,20 +74,38 @@ int jpeg_decode(unsigned char *filedata, size_t filesize, unsigned char *pic,
pixfmt = WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL;
break;
default:
- return JPEG_DECODE_FAILED;
+ return "invalid arg";
}
wuffs_base__status status = wuffs_jpeg__decoder__initialize(
&dec, sizeof(dec), WUFFS_VERSION, WUFFS_INITIALIZE__DEFAULT_OPTIONS);
if (status.repr) {
- return JPEG_DECODE_FAILED;
+ return status.repr;
}
+ /* Opting in to lower quality means that we can pass an empty slice as the
+ * "work buffer" argument to wuffs_jpeg__decoder__decode_frame below.
+ *
+ * Decoding progressive (not sequential) JPEGs would still require dynamic
+ * memory allocation (and the amount of work buffer required depends on the
+ * image dimensions), but we choose to just reject progressive JPEGs. It is
+ * simpler than sometimes calling malloc (which can fail, especially for
+ * large allocations) and free.
+ *
+ * More commentary about these quirks is at
+ * https://github.com/google/wuffs/blob/beaf45650085a16780b5f708b72daaeb1aa865c8/std/jpeg/decode_quirks.wuffs
+ */
+ wuffs_jpeg__decoder__set_quirk(
+ &dec, WUFFS_BASE__QUIRK_QUALITY,
+ WUFFS_BASE__QUIRK_QUALITY__VALUE__LOWER_QUALITY);
+ wuffs_jpeg__decoder__set_quirk(
+ &dec, WUFFS_JPEG__QUIRK_REJECT_PROGRESSIVE_JPEGS, 1);
+
wuffs_base__image_config imgcfg;
wuffs_base__io_buffer src = wuffs_base__ptr_u8__reader(filedata, filesize, true);
status = wuffs_jpeg__decoder__decode_image_config(&dec, &imgcfg, &src);
if (status.repr) {
- return JPEG_DECODE_FAILED;
+ return status.repr;
}
wuffs_base__pixel_config pixcfg;
@@ -101,25 +117,11 @@ int jpeg_decode(unsigned char *filedata, size_t filesize, unsigned char *pic,
wuffs_base__make_table_u8(pic, width * (depth / 8), height, bytes_per_line),
wuffs_base__empty_slice_u8());
if (status.repr) {
- return JPEG_DECODE_FAILED;
+ return status.repr;
}
- uint64_t workbuf_len_min_incl = wuffs_jpeg__decoder__workbuf_len(&dec).min_incl;
- uint8_t *workbuf_array = malloc(workbuf_len_min_incl);
- if ((workbuf_array == NULL) && workbuf_len_min_incl) {
- return JPEG_DECODE_FAILED;
- }
-
- wuffs_base__slice_u8 workbuf =
- wuffs_base__make_slice_u8(workbuf_array, workbuf_len_min_incl);
status = wuffs_jpeg__decoder__decode_frame(&dec, &pixbuf, &src,
- WUFFS_BASE__PIXEL_BLEND__SRC, workbuf, NULL);
-
- free(workbuf_array);
-
- if (status.repr) {
- return JPEG_DECODE_FAILED;
- }
-
- return 0;
+ WUFFS_BASE__PIXEL_BLEND__SRC,
+ wuffs_base__empty_slice_u8(), NULL);
+ return status.repr;
}
diff --git a/src/lib/jpeg.h b/src/lib/jpeg.h
index d2e9e5ffcf..c5179c8c4f 100644
--- a/src/lib/jpeg.h
+++ b/src/lib/jpeg.h
@@ -5,12 +5,13 @@
#include <stdlib.h>
-#define JPEG_DECODE_FAILED 1
+/* These functions return NULL on success and a short error message on
+ * failure. Callers should not free the returned pointer. */
-int jpeg_fetch_size(unsigned char *filedata, size_t filesize, unsigned int *width,
- unsigned int *height);
-int jpeg_decode(unsigned char *filedata, size_t filesize, unsigned char *framebuffer,
- unsigned int width, unsigned int height, unsigned int bytes_per_line,
- unsigned int depth);
+const char *jpeg_fetch_size(unsigned char *filedata, size_t filesize, unsigned int *width,
+ unsigned int *height);
+const char *jpeg_decode(unsigned char *filedata, size_t filesize, unsigned char *framebuffer,
+ unsigned int width, unsigned int height, unsigned int bytes_per_line,
+ unsigned int depth);
#endif
diff --git a/src/lib/prog_loaders.c b/src/lib/prog_loaders.c
index b2abbff575..49056cc024 100644
--- a/src/lib/prog_loaders.c
+++ b/src/lib/prog_loaders.c
@@ -60,7 +60,7 @@ static void run_ramstage_from_resume(struct prog *ramstage)
stage_cache_load_stage(STAGE_RAMSTAGE, ramstage);
ramstage->cbfs_type = CBFS_TYPE_STAGE;
- prog_set_arg(ramstage, cbmem_top());
+ prog_set_arg(ramstage, (void *)cbmem_top());
if (prog_entry(ramstage) != NULL) {
printk(BIOS_DEBUG, "Jumping to image.\n");
@@ -126,7 +126,7 @@ void __noreturn run_ramstage(void)
console_time_report();
/* This overrides the arg fetched from the relocatable module */
- prog_set_arg(&ramstage, cbmem_top());
+ prog_set_arg(&ramstage, (void *)cbmem_top());
prog_run(&ramstage);
diff --git a/src/lib/smbios.c b/src/lib/smbios.c
index ca71e3b053..9cee637b69 100644
--- a/src/lib/smbios.c
+++ b/src/lib/smbios.c
@@ -6,6 +6,7 @@
#include <console/console.h>
#include <version.h>
#include <device/device.h>
+#include <device/pciexp.h>
#include <device/dram/spd.h>
#include <elog.h>
#include <endian.h>
@@ -443,6 +444,14 @@ unsigned int __weak smbios_cpu_get_voltage(void)
return 0; /* Unknown */
}
+unsigned int smbios_get_max_sockets(void)
+{
+ if (CONFIG_MAX_SOCKET == 1)
+ return 1;
+ else
+ return smbios_soc_get_max_sockets();
+}
+
static int smbios_write_type1(unsigned long *current, int handle)
{
struct smbios_type1 *t = smbios_carve_table(*current, SMBIOS_SYSTEM_INFORMATION,
@@ -1128,6 +1137,7 @@ static int smbios_generate_type9_from_devtree(struct device *dev, int *handle,
enum slot_data_bus_bandwidth bandwidth;
enum misc_slot_type type;
enum misc_slot_length length;
+ uint8_t characteristics_1 = 0, characteristics_2 = 0;
if (dev->path.type != DEVICE_PATH_PCI)
return 0;
@@ -1148,16 +1158,31 @@ static int smbios_generate_type9_from_devtree(struct device *dev, int *handle,
else
bandwidth = SlotDataBusWidthUnknown;
- if (dev->smbios_slot_type)
+ if (dev->smbios_slot_type > SlotTypeUnknown) {
type = dev->smbios_slot_type;
- else
+ if ((type >= SlotTypePciExpress && type <= SlotTypeEDSFF_E3) ||
+ (type >= SlotTypeAgp && type <= SlotTypeM2Socket3) ||
+ (type == SlotTypePci)) {
+ characteristics_1 |= SMBIOS_SLOT_3P3V;
+ }
+ if ((type >= SlotTypeAgp && type <= SlotTypeAgp8X) ||
+ (type == SlotTypePci))
+ characteristics_1 |= SMBIOS_SLOT_5V;
+ } else {
+ characteristics_1 = SMBIOS_SLOT_UNKNOWN;
type = SlotTypeUnknown;
+ }
if (dev->smbios_slot_length)
length = dev->smbios_slot_length;
else
length = SlotLengthUnknown;
+ if (pci_has_pme_pin(dev))
+ characteristics_2 |= SMBIOS_SLOT_PME;
+ if (CONFIG(PCIEXP_PLUGIN_SUPPORT) && pciexp_dev_is_slot_hot_plug_cap(dev))
+ characteristics_2 |= SMBIOS_SLOT_HOTPLUG;
+
return smbios_write_type9(current, handle,
dev->smbios_slot_designation,
type,
@@ -1165,8 +1190,8 @@ static int smbios_generate_type9_from_devtree(struct device *dev, int *handle,
usage,
length,
0,
- 1,
- 0,
+ characteristics_1,
+ characteristics_2,
dev->upstream->segment_group,
dev->upstream->secondary,
dev->path.pci.devfn);
@@ -1233,9 +1258,11 @@ unsigned long smbios_write_tables(unsigned long current)
handle++;
update_max(len, max_struct_size, smbios_write_type3(&current, handle++));
- struct smbios_type4 *type4 = (struct smbios_type4 *)current;
- update_max(len, max_struct_size, smbios_write_type4(&current, handle++));
- len += smbios_write_type7_cache_parameters(&current, &handle, &max_struct_size, type4);
+ for (unsigned int s = 0; s < smbios_get_max_sockets(); s++) {
+ struct smbios_type4 *type4 = (struct smbios_type4 *)current;
+ update_max(len, max_struct_size, smbios_write_type4(&current, handle++));
+ len += smbios_write_type7_cache_parameters(&current, &handle, &max_struct_size, type4);
+ }
update_max(len, max_struct_size, smbios_write_type11(&current, &handle));
if (CONFIG(ELOG))
update_max(len, max_struct_size,
diff --git a/src/lib/string.c b/src/lib/string.c
index a7f8074fc7..25d37b68f0 100644
--- a/src/lib/string.c
+++ b/src/lib/string.c
@@ -33,22 +33,6 @@ char *strconcat(const char *s1, const char *s2)
return d;
}
-size_t strnlen(const char *src, size_t max)
-{
- size_t i = 0;
- while ((*src++) && (i < max))
- i++;
- return i;
-}
-
-size_t strlen(const char *src)
-{
- size_t i = 0;
- while (*src++)
- i++;
- return i;
-}
-
char *strchr(const char *s, int c)
{
do {
diff --git a/src/lib/thread.c b/src/lib/thread.c
index 944c75e19c..8b58ca0f3e 100644
--- a/src/lib/thread.c
+++ b/src/lib/thread.c
@@ -251,7 +251,7 @@ static void threads_initialize(void)
set_current_thread(t);
- t->stack_orig = (uintptr_t)NULL; /* We never free the main thread */
+ t->stack_orig = 0; /* We never free the main thread */
t->id = 0;
t->can_yield = 1;