| /* SPDX-License-Identifier: GPL-2.0-only */ |
| |
| #include <amdblocks/root_complex.h> |
| #include <cbmem.h> |
| #include <console/console.h> |
| #include <device/device.h> |
| #include <fsp/util.h> |
| #include <types.h> |
| |
| void read_fsp_resources(struct device *dev, unsigned long *idx) |
| { |
| const uint32_t mem_usable = (uintptr_t)cbmem_top(); |
| const struct hob_header *hob_iterator; |
| const struct hob_resource *res; |
| |
| if (fsp_hob_iterator_init(&hob_iterator) != CB_SUCCESS) { |
| printk(BIOS_ERR, "%s incomplete because no HOB list was found\n", __func__); |
| return; |
| } |
| |
| while (fsp_hob_iterator_get_next_resource(&hob_iterator, &res) == CB_SUCCESS) { |
| if (res->type == EFI_RESOURCE_SYSTEM_MEMORY && res->addr < mem_usable) |
| /* 0 through low usable is already reported by the root complex code */ |
| continue; |
| if (res->type == EFI_RESOURCE_MEMORY_MAPPED_IO) |
| continue; /* Done separately */ |
| |
| if (res->type == EFI_RESOURCE_SYSTEM_MEMORY) |
| ram_range(dev, (*idx)++, res->addr, res->length); |
| else if (res->type == EFI_RESOURCE_MEMORY_RESERVED) |
| reserved_ram_range(dev, (*idx)++, res->addr, res->length); |
| else |
| printk(BIOS_ERR, "failed to set resources for type %d\n", res->type); |
| } |
| } |