arm-init.c 8.9 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0
2 3 4 5 6 7 8 9
/*
 * Extensible Firmware Interface
 *
 * Based on Extensible Firmware Interface Specification version 2.4
 *
 * Copyright (C) 2013 - 2015 Linaro Ltd.
 */

10 11
#define pr_fmt(fmt)	"efi: " fmt

12
#include <linux/efi.h>
13
#include <linux/fwnode.h>
14 15 16 17
#include <linux/init.h>
#include <linux/memblock.h>
#include <linux/mm_types.h>
#include <linux/of.h>
18
#include <linux/of_address.h>
19
#include <linux/of_fdt.h>
20
#include <linux/platform_device.h>
21
#include <linux/screen_info.h>
22 23 24 25 26

#include <asm/efi.h>

u64 efi_system_table;

27
static int __init is_memory(efi_memory_desc_t *md)
28
{
29
	if (md->attribute & (EFI_MEMORY_WB|EFI_MEMORY_WT|EFI_MEMORY_WC))
30 31 32 33 34 35 36 37 38 39 40 41 42
		return 1;
	return 0;
}

/*
 * Translate a EFI virtual address into a physical address: this is necessary,
 * as some data members of the EFI system table are virtually remapped after
 * SetVirtualAddressMap() has been called.
 */
static phys_addr_t efi_to_phys(unsigned long addr)
{
	efi_memory_desc_t *md;

43
	for_each_efi_memory_desc(md) {
44 45 46 47 48 49 50 51 52 53 54 55
		if (!(md->attribute & EFI_MEMORY_RUNTIME))
			continue;
		if (md->virt_addr == 0)
			/* no virtual mapping has been installed by the stub */
			break;
		if (md->virt_addr <= addr &&
		    (addr - md->virt_addr) < (md->num_pages << EFI_PAGE_SHIFT))
			return md->phys_addr + addr - md->virt_addr;
	}
	return addr;
}

56 57
static __initdata unsigned long screen_info_table = EFI_INVALID_TABLE_ADDR;

58
static const efi_config_table_type_t arch_tables[] __initconst = {
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
	{LINUX_EFI_ARM_SCREEN_INFO_TABLE_GUID, NULL, &screen_info_table},
	{NULL_GUID, NULL, NULL}
};

static void __init init_screen_info(void)
{
	struct screen_info *si;

	if (screen_info_table != EFI_INVALID_TABLE_ADDR) {
		si = early_memremap_ro(screen_info_table, sizeof(*si));
		if (!si) {
			pr_err("Could not map screen_info config table\n");
			return;
		}
		screen_info = *si;
		early_memunmap(si, sizeof(*si));

		/* dummycon on ARM needs non-zero values for columns/lines */
		screen_info.orig_video_cols = 80;
		screen_info.orig_video_lines = 25;
	}
80 81 82 83

	if (screen_info.orig_video_isVGA == VIDEO_TYPE_EFI &&
	    memblock_is_map_memory(screen_info.lfb_base))
		memblock_mark_nomap(screen_info.lfb_base, screen_info.lfb_size);
84 85
}

86 87
static int __init uefi_init(void)
{
88
	efi_config_table_t *config_tables;
89
	size_t table_size;
90
	int retval;
91

92 93
	efi.systab = early_memremap_ro(efi_system_table,
				       sizeof(efi_system_table_t));
94 95 96 97 98 99
	if (efi.systab == NULL) {
		pr_warn("Unable to map EFI system table.\n");
		return -ENOMEM;
	}

	set_bit(EFI_BOOT, &efi.flags);
100 101
	if (IS_ENABLED(CONFIG_64BIT))
		set_bit(EFI_64BIT, &efi.flags);
102

103 104
	retval = efi_systab_check_header(&efi.systab->hdr, 2);
	if (retval)
105 106
		goto out;

107 108
	efi.runtime_version = efi.systab->hdr.revision;

109 110
	efi_systab_report_header(&efi.systab->hdr,
				 efi_to_phys(efi.systab->fw_vendor));
111 112

	table_size = sizeof(efi_config_table_64_t) * efi.systab->nr_tables;
113 114
	config_tables = early_memremap_ro(efi_to_phys(efi.systab->tables),
					  table_size);
115 116 117 118 119 120
	if (config_tables == NULL) {
		pr_warn("Unable to map EFI config table array.\n");
		retval = -ENOMEM;
		goto out;
	}
	retval = efi_config_parse_tables(config_tables, efi.systab->nr_tables,
121
					 arch_tables);
122

123 124 125
	if (!retval)
		efi.config_table = (unsigned long)efi.systab->tables;

126 127 128 129 130 131 132
	early_memunmap(config_tables, table_size);
out:
	early_memunmap(efi.systab,  sizeof(efi_system_table_t));
	return retval;
}

/*
133
 * Return true for regions that can be used as System RAM.
134
 */
135
static __init int is_usable_memory(efi_memory_desc_t *md)
136 137 138 139
{
	switch (md->type) {
	case EFI_LOADER_CODE:
	case EFI_LOADER_DATA:
140
	case EFI_ACPI_RECLAIM_MEMORY:
141 142 143 144
	case EFI_BOOT_SERVICES_CODE:
	case EFI_BOOT_SERVICES_DATA:
	case EFI_CONVENTIONAL_MEMORY:
	case EFI_PERSISTENT_MEMORY:
145 146 147 148 149 150 151 152 153
		/*
		 * Special purpose memory is 'soft reserved', which means it
		 * is set aside initially, but can be hotplugged back in or
		 * be assigned to the dax driver after boot.
		 */
		if (efi_soft_reserve_enabled() &&
		    (md->attribute & EFI_MEMORY_SP))
			return false;

154 155 156 157 158 159
		/*
		 * According to the spec, these regions are no longer reserved
		 * after calling ExitBootServices(). However, we can only use
		 * them as System RAM if they can be mapped writeback cacheable.
		 */
		return (md->attribute & EFI_MEMORY_WB);
160 161 162
	default:
		break;
	}
163
	return false;
164 165 166 167 168 169 170 171 172 173
}

static __init void reserve_regions(void)
{
	efi_memory_desc_t *md;
	u64 paddr, npages, size;

	if (efi_enabled(EFI_DBG))
		pr_info("Processing EFI memory map:\n");

174 175 176 177 178 179
	/*
	 * Discard memblocks discovered so far: if there are any at this
	 * point, they originate from memory nodes in the DT, and UEFI
	 * uses its own memory map instead.
	 */
	memblock_dump_all();
180
	memblock_remove(0, PHYS_ADDR_MAX);
181

182
	for_each_efi_memory_desc(md) {
183 184 185 186 187 188
		paddr = md->phys_addr;
		npages = md->num_pages;

		if (efi_enabled(EFI_DBG)) {
			char buf[64];

189
			pr_info("  0x%012llx-0x%012llx %s\n",
190
				paddr, paddr + (npages << EFI_PAGE_SHIFT) - 1,
191
				efi_md_typeattr_format(buf, sizeof(buf), md));
192 193 194 195 196
		}

		memrange_efi_to_native(&paddr, &npages);
		size = npages << PAGE_SHIFT;

197
		if (is_memory(md)) {
198 199
			early_init_dt_add_memory_arch(paddr, size);

200 201
			if (!is_usable_memory(md))
				memblock_mark_nomap(paddr, size);
202 203 204 205

			/* keep ACPI reclaim memory intact for kexec etc. */
			if (md->type == EFI_ACPI_RECLAIM_MEMORY)
				memblock_reserve(paddr, size);
206
		}
207 208 209 210 211
	}
}

void __init efi_init(void)
{
212
	struct efi_memory_map_data data;
213 214 215 216 217 218 219 220
	struct efi_fdt_params params;

	/* Grab UEFI information placed in FDT by stub */
	if (!efi_get_fdt_params(&params))
		return;

	efi_system_table = params.system_table;

221 222 223 224 225 226
	data.desc_version = params.desc_ver;
	data.desc_size = params.desc_size;
	data.size = params.mmap_size;
	data.phys_map = params.mmap;

	if (efi_memmap_init_early(&data) < 0) {
227 228 229 230 231 232 233 234
		/*
		* If we are booting via UEFI, the UEFI memory map is the only
		* description of memory we have, so there is little point in
		* proceeding if we cannot access it.
		*/
		panic("Unable to map EFI memory map.\n");
	}

235 236 237 238
	WARN(efi.memmap.desc_version != 1,
	     "Unexpected EFI_MEMORY_DESCRIPTOR version %ld",
	      efi.memmap.desc_version);

239 240
	if (uefi_init() < 0) {
		efi_memmap_unmap();
241
		return;
242
	}
243 244

	reserve_regions();
245
	efi_esrt_init();
246

247 248 249
	memblock_reserve(params.mmap & PAGE_MASK,
			 PAGE_ALIGN(params.mmap_size +
				    (params.mmap & ~PAGE_MASK)));
250 251

	init_screen_info();
252 253 254 255

	/* ARM does not permit early mappings to persist across paging_init() */
	if (IS_ENABLED(CONFIG_ARM))
		efi_memmap_unmap();
256
}
257

258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344
static bool efifb_overlaps_pci_range(const struct of_pci_range *range)
{
	u64 fb_base = screen_info.lfb_base;

	if (screen_info.capabilities & VIDEO_CAPABILITY_64BIT_BASE)
		fb_base |= (u64)(unsigned long)screen_info.ext_lfb_base << 32;

	return fb_base >= range->cpu_addr &&
	       fb_base < (range->cpu_addr + range->size);
}

static struct device_node *find_pci_overlap_node(void)
{
	struct device_node *np;

	for_each_node_by_type(np, "pci") {
		struct of_pci_range_parser parser;
		struct of_pci_range range;
		int err;

		err = of_pci_range_parser_init(&parser, np);
		if (err) {
			pr_warn("of_pci_range_parser_init() failed: %d\n", err);
			continue;
		}

		for_each_of_pci_range(&parser, &range)
			if (efifb_overlaps_pci_range(&range))
				return np;
	}
	return NULL;
}

/*
 * If the efifb framebuffer is backed by a PCI graphics controller, we have
 * to ensure that this relation is expressed using a device link when
 * running in DT mode, or the probe order may be reversed, resulting in a
 * resource reservation conflict on the memory window that the efifb
 * framebuffer steals from the PCIe host bridge.
 */
static int efifb_add_links(const struct fwnode_handle *fwnode,
			   struct device *dev)
{
	struct device_node *sup_np;
	struct device *sup_dev;

	sup_np = find_pci_overlap_node();

	/*
	 * If there's no PCI graphics controller backing the efifb, we are
	 * done here.
	 */
	if (!sup_np)
		return 0;

	sup_dev = get_dev_from_fwnode(&sup_np->fwnode);
	of_node_put(sup_np);

	/*
	 * Return -ENODEV if the PCI graphics controller device hasn't been
	 * registered yet.  This ensures that efifb isn't allowed to probe
	 * and this function is retried again when new devices are
	 * registered.
	 */
	if (!sup_dev)
		return -ENODEV;

	/*
	 * If this fails, retrying this function at a later point won't
	 * change anything. So, don't return an error after this.
	 */
	if (!device_link_add(dev, sup_dev, 0))
		dev_warn(dev, "device_link_add() failed\n");

	put_device(sup_dev);

	return 0;
}

static const struct fwnode_operations efifb_fwnode_ops = {
	.add_links = efifb_add_links,
};

static struct fwnode_handle efifb_fwnode = {
	.ops = &efifb_fwnode_ops,
};

345 346
static int __init register_gop_device(void)
{
347 348
	struct platform_device *pd;
	int err;
349 350 351 352

	if (screen_info.orig_video_isVGA != VIDEO_TYPE_EFI)
		return 0;

353 354 355 356 357 358 359 360 361 362 363 364
	pd = platform_device_alloc("efi-framebuffer", 0);
	if (!pd)
		return -ENOMEM;

	if (IS_ENABLED(CONFIG_PCI))
		pd->dev.fwnode = &efifb_fwnode;

	err = platform_device_add_data(pd, &screen_info, sizeof(screen_info));
	if (err)
		return err;

	return platform_device_add(pd);
365 366
}
subsys_initcall(register_gop_device);