1 /* 2 * efi.c - EFI subsystem 3 * 4 * Copyright (C) 2001,2003,2004 Dell <Matt_Domsch@dell.com> 5 * Copyright (C) 2004 Intel Corporation <matthew.e.tolentino@intel.com> 6 * Copyright (C) 2013 Tom Gundersen <teg@jklm.no> 7 * 8 * This code registers /sys/firmware/efi{,/efivars} when EFI is supported, 9 * allowing the efivarfs to be mounted or the efivars module to be loaded. 10 * The existance of /sys/firmware/efi may also be used by userspace to 11 * determine that the system supports EFI. 12 * 13 * This file is released under the GPLv2. 14 */ 15 16 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 17 18 #include <linux/kobject.h> 19 #include <linux/module.h> 20 #include <linux/init.h> 21 #include <linux/device.h> 22 #include <linux/efi.h> 23 #include <linux/of.h> 24 #include <linux/of_fdt.h> 25 #include <linux/io.h> 26 #include <linux/platform_device.h> 27 28 struct efi __read_mostly efi = { 29 .mps = EFI_INVALID_TABLE_ADDR, 30 .acpi = EFI_INVALID_TABLE_ADDR, 31 .acpi20 = EFI_INVALID_TABLE_ADDR, 32 .smbios = EFI_INVALID_TABLE_ADDR, 33 .smbios3 = EFI_INVALID_TABLE_ADDR, 34 .sal_systab = EFI_INVALID_TABLE_ADDR, 35 .boot_info = EFI_INVALID_TABLE_ADDR, 36 .hcdp = EFI_INVALID_TABLE_ADDR, 37 .uga = EFI_INVALID_TABLE_ADDR, 38 .uv_systab = EFI_INVALID_TABLE_ADDR, 39 .fw_vendor = EFI_INVALID_TABLE_ADDR, 40 .runtime = EFI_INVALID_TABLE_ADDR, 41 .config_table = EFI_INVALID_TABLE_ADDR, 42 .esrt = EFI_INVALID_TABLE_ADDR, 43 }; 44 EXPORT_SYMBOL(efi); 45 46 static bool disable_runtime; 47 static int __init setup_noefi(char *arg) 48 { 49 disable_runtime = true; 50 return 0; 51 } 52 early_param("noefi", setup_noefi); 53 54 bool efi_runtime_disabled(void) 55 { 56 return disable_runtime; 57 } 58 59 static int __init parse_efi_cmdline(char *str) 60 { 61 if (parse_option_str(str, "noruntime")) 62 disable_runtime = true; 63 64 return 0; 65 } 66 early_param("efi", parse_efi_cmdline); 67 68 struct kobject *efi_kobj; 69 70 /* 71 * Let's not leave out systab information that snuck into 72 * the efivars driver 73 */ 74 static ssize_t systab_show(struct kobject *kobj, 75 struct kobj_attribute *attr, char *buf) 76 { 77 char *str = buf; 78 79 if (!kobj || !buf) 80 return -EINVAL; 81 82 if (efi.mps != EFI_INVALID_TABLE_ADDR) 83 str += sprintf(str, "MPS=0x%lx\n", efi.mps); 84 if (efi.acpi20 != EFI_INVALID_TABLE_ADDR) 85 str += sprintf(str, "ACPI20=0x%lx\n", efi.acpi20); 86 if (efi.acpi != EFI_INVALID_TABLE_ADDR) 87 str += sprintf(str, "ACPI=0x%lx\n", efi.acpi); 88 /* 89 * If both SMBIOS and SMBIOS3 entry points are implemented, the 90 * SMBIOS3 entry point shall be preferred, so we list it first to 91 * let applications stop parsing after the first match. 92 */ 93 if (efi.smbios3 != EFI_INVALID_TABLE_ADDR) 94 str += sprintf(str, "SMBIOS3=0x%lx\n", efi.smbios3); 95 if (efi.smbios != EFI_INVALID_TABLE_ADDR) 96 str += sprintf(str, "SMBIOS=0x%lx\n", efi.smbios); 97 if (efi.hcdp != EFI_INVALID_TABLE_ADDR) 98 str += sprintf(str, "HCDP=0x%lx\n", efi.hcdp); 99 if (efi.boot_info != EFI_INVALID_TABLE_ADDR) 100 str += sprintf(str, "BOOTINFO=0x%lx\n", efi.boot_info); 101 if (efi.uga != EFI_INVALID_TABLE_ADDR) 102 str += sprintf(str, "UGA=0x%lx\n", efi.uga); 103 104 return str - buf; 105 } 106 107 static struct kobj_attribute efi_attr_systab = 108 __ATTR(systab, 0400, systab_show, NULL); 109 110 #define EFI_FIELD(var) efi.var 111 112 #define EFI_ATTR_SHOW(name) \ 113 static ssize_t name##_show(struct kobject *kobj, \ 114 struct kobj_attribute *attr, char *buf) \ 115 { \ 116 return sprintf(buf, "0x%lx\n", EFI_FIELD(name)); \ 117 } 118 119 EFI_ATTR_SHOW(fw_vendor); 120 EFI_ATTR_SHOW(runtime); 121 EFI_ATTR_SHOW(config_table); 122 123 static ssize_t fw_platform_size_show(struct kobject *kobj, 124 struct kobj_attribute *attr, char *buf) 125 { 126 return sprintf(buf, "%d\n", efi_enabled(EFI_64BIT) ? 64 : 32); 127 } 128 129 static struct kobj_attribute efi_attr_fw_vendor = __ATTR_RO(fw_vendor); 130 static struct kobj_attribute efi_attr_runtime = __ATTR_RO(runtime); 131 static struct kobj_attribute efi_attr_config_table = __ATTR_RO(config_table); 132 static struct kobj_attribute efi_attr_fw_platform_size = 133 __ATTR_RO(fw_platform_size); 134 135 static struct attribute *efi_subsys_attrs[] = { 136 &efi_attr_systab.attr, 137 &efi_attr_fw_vendor.attr, 138 &efi_attr_runtime.attr, 139 &efi_attr_config_table.attr, 140 &efi_attr_fw_platform_size.attr, 141 NULL, 142 }; 143 144 static umode_t efi_attr_is_visible(struct kobject *kobj, 145 struct attribute *attr, int n) 146 { 147 if (attr == &efi_attr_fw_vendor.attr) { 148 if (efi_enabled(EFI_PARAVIRT) || 149 efi.fw_vendor == EFI_INVALID_TABLE_ADDR) 150 return 0; 151 } else if (attr == &efi_attr_runtime.attr) { 152 if (efi.runtime == EFI_INVALID_TABLE_ADDR) 153 return 0; 154 } else if (attr == &efi_attr_config_table.attr) { 155 if (efi.config_table == EFI_INVALID_TABLE_ADDR) 156 return 0; 157 } 158 159 return attr->mode; 160 } 161 162 static struct attribute_group efi_subsys_attr_group = { 163 .attrs = efi_subsys_attrs, 164 .is_visible = efi_attr_is_visible, 165 }; 166 167 static struct efivars generic_efivars; 168 static struct efivar_operations generic_ops; 169 170 static int generic_ops_register(void) 171 { 172 generic_ops.get_variable = efi.get_variable; 173 generic_ops.set_variable = efi.set_variable; 174 generic_ops.get_next_variable = efi.get_next_variable; 175 generic_ops.query_variable_store = efi_query_variable_store; 176 177 return efivars_register(&generic_efivars, &generic_ops, efi_kobj); 178 } 179 180 static void generic_ops_unregister(void) 181 { 182 efivars_unregister(&generic_efivars); 183 } 184 185 /* 186 * We register the efi subsystem with the firmware subsystem and the 187 * efivars subsystem with the efi subsystem, if the system was booted with 188 * EFI. 189 */ 190 static int __init efisubsys_init(void) 191 { 192 int error; 193 194 if (!efi_enabled(EFI_BOOT)) 195 return 0; 196 197 /* We register the efi directory at /sys/firmware/efi */ 198 efi_kobj = kobject_create_and_add("efi", firmware_kobj); 199 if (!efi_kobj) { 200 pr_err("efi: Firmware registration failed.\n"); 201 return -ENOMEM; 202 } 203 204 error = generic_ops_register(); 205 if (error) 206 goto err_put; 207 208 error = sysfs_create_group(efi_kobj, &efi_subsys_attr_group); 209 if (error) { 210 pr_err("efi: Sysfs attribute export failed with error %d.\n", 211 error); 212 goto err_unregister; 213 } 214 215 error = efi_runtime_map_init(efi_kobj); 216 if (error) 217 goto err_remove_group; 218 219 /* and the standard mountpoint for efivarfs */ 220 error = sysfs_create_mount_point(efi_kobj, "efivars"); 221 if (error) { 222 pr_err("efivars: Subsystem registration failed.\n"); 223 goto err_remove_group; 224 } 225 226 return 0; 227 228 err_remove_group: 229 sysfs_remove_group(efi_kobj, &efi_subsys_attr_group); 230 err_unregister: 231 generic_ops_unregister(); 232 err_put: 233 kobject_put(efi_kobj); 234 return error; 235 } 236 237 subsys_initcall(efisubsys_init); 238 239 /* 240 * Find the efi memory descriptor for a given physical address. Given a 241 * physicall address, determine if it exists within an EFI Memory Map entry, 242 * and if so, populate the supplied memory descriptor with the appropriate 243 * data. 244 */ 245 int __init efi_mem_desc_lookup(u64 phys_addr, efi_memory_desc_t *out_md) 246 { 247 struct efi_memory_map *map = efi.memmap; 248 void *p, *e; 249 250 if (!efi_enabled(EFI_MEMMAP)) { 251 pr_err_once("EFI_MEMMAP is not enabled.\n"); 252 return -EINVAL; 253 } 254 255 if (!map) { 256 pr_err_once("efi.memmap is not set.\n"); 257 return -EINVAL; 258 } 259 if (!out_md) { 260 pr_err_once("out_md is null.\n"); 261 return -EINVAL; 262 } 263 if (WARN_ON_ONCE(!map->phys_map)) 264 return -EINVAL; 265 if (WARN_ON_ONCE(map->nr_map == 0) || WARN_ON_ONCE(map->desc_size == 0)) 266 return -EINVAL; 267 268 e = map->phys_map + map->nr_map * map->desc_size; 269 for (p = map->phys_map; p < e; p += map->desc_size) { 270 efi_memory_desc_t *md; 271 u64 size; 272 u64 end; 273 274 /* 275 * If a driver calls this after efi_free_boot_services, 276 * ->map will be NULL, and the target may also not be mapped. 277 * So just always get our own virtual map on the CPU. 278 * 279 */ 280 md = early_memremap((phys_addr_t)p, sizeof (*md)); 281 if (!md) { 282 pr_err_once("early_memremap(%p, %zu) failed.\n", 283 p, sizeof (*md)); 284 return -ENOMEM; 285 } 286 287 if (!(md->attribute & EFI_MEMORY_RUNTIME) && 288 md->type != EFI_BOOT_SERVICES_DATA && 289 md->type != EFI_RUNTIME_SERVICES_DATA) { 290 early_memunmap(md, sizeof (*md)); 291 continue; 292 } 293 294 size = md->num_pages << EFI_PAGE_SHIFT; 295 end = md->phys_addr + size; 296 if (phys_addr >= md->phys_addr && phys_addr < end) { 297 memcpy(out_md, md, sizeof(*out_md)); 298 early_memunmap(md, sizeof (*md)); 299 return 0; 300 } 301 302 early_memunmap(md, sizeof (*md)); 303 } 304 pr_err_once("requested map not found.\n"); 305 return -ENOENT; 306 } 307 308 /* 309 * Calculate the highest address of an efi memory descriptor. 310 */ 311 u64 __init efi_mem_desc_end(efi_memory_desc_t *md) 312 { 313 u64 size = md->num_pages << EFI_PAGE_SHIFT; 314 u64 end = md->phys_addr + size; 315 return end; 316 } 317 318 /* 319 * We can't ioremap data in EFI boot services RAM, because we've already mapped 320 * it as RAM. So, look it up in the existing EFI memory map instead. Only 321 * callable after efi_enter_virtual_mode and before efi_free_boot_services. 322 */ 323 void __iomem *efi_lookup_mapped_addr(u64 phys_addr) 324 { 325 struct efi_memory_map *map; 326 void *p; 327 map = efi.memmap; 328 if (!map) 329 return NULL; 330 if (WARN_ON(!map->map)) 331 return NULL; 332 for (p = map->map; p < map->map_end; p += map->desc_size) { 333 efi_memory_desc_t *md = p; 334 u64 size = md->num_pages << EFI_PAGE_SHIFT; 335 u64 end = md->phys_addr + size; 336 if (!(md->attribute & EFI_MEMORY_RUNTIME) && 337 md->type != EFI_BOOT_SERVICES_CODE && 338 md->type != EFI_BOOT_SERVICES_DATA) 339 continue; 340 if (!md->virt_addr) 341 continue; 342 if (phys_addr >= md->phys_addr && phys_addr < end) { 343 phys_addr += md->virt_addr - md->phys_addr; 344 return (__force void __iomem *)(unsigned long)phys_addr; 345 } 346 } 347 return NULL; 348 } 349 350 static __initdata efi_config_table_type_t common_tables[] = { 351 {ACPI_20_TABLE_GUID, "ACPI 2.0", &efi.acpi20}, 352 {ACPI_TABLE_GUID, "ACPI", &efi.acpi}, 353 {HCDP_TABLE_GUID, "HCDP", &efi.hcdp}, 354 {MPS_TABLE_GUID, "MPS", &efi.mps}, 355 {SAL_SYSTEM_TABLE_GUID, "SALsystab", &efi.sal_systab}, 356 {SMBIOS_TABLE_GUID, "SMBIOS", &efi.smbios}, 357 {SMBIOS3_TABLE_GUID, "SMBIOS 3.0", &efi.smbios3}, 358 {UGA_IO_PROTOCOL_GUID, "UGA", &efi.uga}, 359 {EFI_SYSTEM_RESOURCE_TABLE_GUID, "ESRT", &efi.esrt}, 360 {NULL_GUID, NULL, NULL}, 361 }; 362 363 static __init int match_config_table(efi_guid_t *guid, 364 unsigned long table, 365 efi_config_table_type_t *table_types) 366 { 367 int i; 368 369 if (table_types) { 370 for (i = 0; efi_guidcmp(table_types[i].guid, NULL_GUID); i++) { 371 if (!efi_guidcmp(*guid, table_types[i].guid)) { 372 *(table_types[i].ptr) = table; 373 pr_cont(" %s=0x%lx ", 374 table_types[i].name, table); 375 return 1; 376 } 377 } 378 } 379 380 return 0; 381 } 382 383 int __init efi_config_parse_tables(void *config_tables, int count, int sz, 384 efi_config_table_type_t *arch_tables) 385 { 386 void *tablep; 387 int i; 388 389 tablep = config_tables; 390 pr_info(""); 391 for (i = 0; i < count; i++) { 392 efi_guid_t guid; 393 unsigned long table; 394 395 if (efi_enabled(EFI_64BIT)) { 396 u64 table64; 397 guid = ((efi_config_table_64_t *)tablep)->guid; 398 table64 = ((efi_config_table_64_t *)tablep)->table; 399 table = table64; 400 #ifndef CONFIG_64BIT 401 if (table64 >> 32) { 402 pr_cont("\n"); 403 pr_err("Table located above 4GB, disabling EFI.\n"); 404 return -EINVAL; 405 } 406 #endif 407 } else { 408 guid = ((efi_config_table_32_t *)tablep)->guid; 409 table = ((efi_config_table_32_t *)tablep)->table; 410 } 411 412 if (!match_config_table(&guid, table, common_tables)) 413 match_config_table(&guid, table, arch_tables); 414 415 tablep += sz; 416 } 417 pr_cont("\n"); 418 set_bit(EFI_CONFIG_TABLES, &efi.flags); 419 return 0; 420 } 421 422 int __init efi_config_init(efi_config_table_type_t *arch_tables) 423 { 424 void *config_tables; 425 int sz, ret; 426 427 if (efi_enabled(EFI_64BIT)) 428 sz = sizeof(efi_config_table_64_t); 429 else 430 sz = sizeof(efi_config_table_32_t); 431 432 /* 433 * Let's see what config tables the firmware passed to us. 434 */ 435 config_tables = early_memremap(efi.systab->tables, 436 efi.systab->nr_tables * sz); 437 if (config_tables == NULL) { 438 pr_err("Could not map Configuration table!\n"); 439 return -ENOMEM; 440 } 441 442 ret = efi_config_parse_tables(config_tables, efi.systab->nr_tables, sz, 443 arch_tables); 444 445 early_memunmap(config_tables, efi.systab->nr_tables * sz); 446 return ret; 447 } 448 449 #ifdef CONFIG_EFI_VARS_MODULE 450 static int __init efi_load_efivars(void) 451 { 452 struct platform_device *pdev; 453 454 if (!efi_enabled(EFI_RUNTIME_SERVICES)) 455 return 0; 456 457 pdev = platform_device_register_simple("efivars", 0, NULL, 0); 458 return IS_ERR(pdev) ? PTR_ERR(pdev) : 0; 459 } 460 device_initcall(efi_load_efivars); 461 #endif 462 463 #ifdef CONFIG_EFI_PARAMS_FROM_FDT 464 465 #define UEFI_PARAM(name, prop, field) \ 466 { \ 467 { name }, \ 468 { prop }, \ 469 offsetof(struct efi_fdt_params, field), \ 470 FIELD_SIZEOF(struct efi_fdt_params, field) \ 471 } 472 473 static __initdata struct { 474 const char name[32]; 475 const char propname[32]; 476 int offset; 477 int size; 478 } dt_params[] = { 479 UEFI_PARAM("System Table", "linux,uefi-system-table", system_table), 480 UEFI_PARAM("MemMap Address", "linux,uefi-mmap-start", mmap), 481 UEFI_PARAM("MemMap Size", "linux,uefi-mmap-size", mmap_size), 482 UEFI_PARAM("MemMap Desc. Size", "linux,uefi-mmap-desc-size", desc_size), 483 UEFI_PARAM("MemMap Desc. Version", "linux,uefi-mmap-desc-ver", desc_ver) 484 }; 485 486 struct param_info { 487 int verbose; 488 int found; 489 void *params; 490 }; 491 492 static int __init fdt_find_uefi_params(unsigned long node, const char *uname, 493 int depth, void *data) 494 { 495 struct param_info *info = data; 496 const void *prop; 497 void *dest; 498 u64 val; 499 int i, len; 500 501 if (depth != 1 || strcmp(uname, "chosen") != 0) 502 return 0; 503 504 for (i = 0; i < ARRAY_SIZE(dt_params); i++) { 505 prop = of_get_flat_dt_prop(node, dt_params[i].propname, &len); 506 if (!prop) 507 return 0; 508 dest = info->params + dt_params[i].offset; 509 info->found++; 510 511 val = of_read_number(prop, len / sizeof(u32)); 512 513 if (dt_params[i].size == sizeof(u32)) 514 *(u32 *)dest = val; 515 else 516 *(u64 *)dest = val; 517 518 if (info->verbose) 519 pr_info(" %s: 0x%0*llx\n", dt_params[i].name, 520 dt_params[i].size * 2, val); 521 } 522 return 1; 523 } 524 525 int __init efi_get_fdt_params(struct efi_fdt_params *params, int verbose) 526 { 527 struct param_info info; 528 int ret; 529 530 pr_info("Getting EFI parameters from FDT:\n"); 531 532 info.verbose = verbose; 533 info.found = 0; 534 info.params = params; 535 536 ret = of_scan_flat_dt(fdt_find_uefi_params, &info); 537 if (!info.found) 538 pr_info("UEFI not found.\n"); 539 else if (!ret) 540 pr_err("Can't find '%s' in device tree!\n", 541 dt_params[info.found].name); 542 543 return ret; 544 } 545 #endif /* CONFIG_EFI_PARAMS_FROM_FDT */ 546 547 static __initdata char memory_type_name[][20] = { 548 "Reserved", 549 "Loader Code", 550 "Loader Data", 551 "Boot Code", 552 "Boot Data", 553 "Runtime Code", 554 "Runtime Data", 555 "Conventional Memory", 556 "Unusable Memory", 557 "ACPI Reclaim Memory", 558 "ACPI Memory NVS", 559 "Memory Mapped I/O", 560 "MMIO Port Space", 561 "PAL Code" 562 }; 563 564 char * __init efi_md_typeattr_format(char *buf, size_t size, 565 const efi_memory_desc_t *md) 566 { 567 char *pos; 568 int type_len; 569 u64 attr; 570 571 pos = buf; 572 if (md->type >= ARRAY_SIZE(memory_type_name)) 573 type_len = snprintf(pos, size, "[type=%u", md->type); 574 else 575 type_len = snprintf(pos, size, "[%-*s", 576 (int)(sizeof(memory_type_name[0]) - 1), 577 memory_type_name[md->type]); 578 if (type_len >= size) 579 return buf; 580 581 pos += type_len; 582 size -= type_len; 583 584 attr = md->attribute; 585 if (attr & ~(EFI_MEMORY_UC | EFI_MEMORY_WC | EFI_MEMORY_WT | 586 EFI_MEMORY_WB | EFI_MEMORY_UCE | EFI_MEMORY_WP | 587 EFI_MEMORY_RP | EFI_MEMORY_XP | EFI_MEMORY_RUNTIME)) 588 snprintf(pos, size, "|attr=0x%016llx]", 589 (unsigned long long)attr); 590 else 591 snprintf(pos, size, "|%3s|%2s|%2s|%2s|%3s|%2s|%2s|%2s|%2s]", 592 attr & EFI_MEMORY_RUNTIME ? "RUN" : "", 593 attr & EFI_MEMORY_XP ? "XP" : "", 594 attr & EFI_MEMORY_RP ? "RP" : "", 595 attr & EFI_MEMORY_WP ? "WP" : "", 596 attr & EFI_MEMORY_UCE ? "UCE" : "", 597 attr & EFI_MEMORY_WB ? "WB" : "", 598 attr & EFI_MEMORY_WT ? "WT" : "", 599 attr & EFI_MEMORY_WC ? "WC" : "", 600 attr & EFI_MEMORY_UC ? "UC" : ""); 601 return buf; 602 } 603