1 /* 2 * Intel CPU Microcode Update Driver for Linux 3 * 4 * Copyright (C) 2000-2006 Tigran Aivazian <tigran@aivazian.fsnet.co.uk> 5 * 2006 Shaohua Li <shaohua.li@intel.com> 6 * 7 * This driver allows to upgrade microcode on Intel processors 8 * belonging to IA-32 family - PentiumPro, Pentium II, 9 * Pentium III, Xeon, Pentium 4, etc. 10 * 11 * Reference: Section 8.11 of Volume 3a, IA-32 Intel? Architecture 12 * Software Developer's Manual 13 * Order Number 253668 or free download from: 14 * 15 * http://developer.intel.com/Assets/PDF/manual/253668.pdf 16 * 17 * For more information, go to http://www.urbanmyth.org/microcode 18 * 19 * This program is free software; you can redistribute it and/or 20 * modify it under the terms of the GNU General Public License 21 * as published by the Free Software Foundation; either version 22 * 2 of the License, or (at your option) any later version. 23 * 24 * 1.0 16 Feb 2000, Tigran Aivazian <tigran@sco.com> 25 * Initial release. 26 * 1.01 18 Feb 2000, Tigran Aivazian <tigran@sco.com> 27 * Added read() support + cleanups. 28 * 1.02 21 Feb 2000, Tigran Aivazian <tigran@sco.com> 29 * Added 'device trimming' support. open(O_WRONLY) zeroes 30 * and frees the saved copy of applied microcode. 31 * 1.03 29 Feb 2000, Tigran Aivazian <tigran@sco.com> 32 * Made to use devfs (/dev/cpu/microcode) + cleanups. 33 * 1.04 06 Jun 2000, Simon Trimmer <simon@veritas.com> 34 * Added misc device support (now uses both devfs and misc). 35 * Added MICROCODE_IOCFREE ioctl to clear memory. 36 * 1.05 09 Jun 2000, Simon Trimmer <simon@veritas.com> 37 * Messages for error cases (non Intel & no suitable microcode). 38 * 1.06 03 Aug 2000, Tigran Aivazian <tigran@veritas.com> 39 * Removed ->release(). Removed exclusive open and status bitmap. 40 * Added microcode_rwsem to serialize read()/write()/ioctl(). 41 * Removed global kernel lock usage. 42 * 1.07 07 Sep 2000, Tigran Aivazian <tigran@veritas.com> 43 * Write 0 to 0x8B msr and then cpuid before reading revision, 44 * so that it works even if there were no update done by the 45 * BIOS. Otherwise, reading from 0x8B gives junk (which happened 46 * to be 0 on my machine which is why it worked even when I 47 * disabled update by the BIOS) 48 * Thanks to Eric W. Biederman <ebiederman@lnxi.com> for the fix. 49 * 1.08 11 Dec 2000, Richard Schaal <richard.schaal@intel.com> and 50 * Tigran Aivazian <tigran@veritas.com> 51 * Intel Pentium 4 processor support and bugfixes. 52 * 1.09 30 Oct 2001, Tigran Aivazian <tigran@veritas.com> 53 * Bugfix for HT (Hyper-Threading) enabled processors 54 * whereby processor resources are shared by all logical processors 55 * in a single CPU package. 56 * 1.10 28 Feb 2002 Asit K Mallick <asit.k.mallick@intel.com> and 57 * Tigran Aivazian <tigran@veritas.com>, 58 * Serialize updates as required on HT processors due to 59 * speculative nature of implementation. 60 * 1.11 22 Mar 2002 Tigran Aivazian <tigran@veritas.com> 61 * Fix the panic when writing zero-length microcode chunk. 62 * 1.12 29 Sep 2003 Nitin Kamble <nitin.a.kamble@intel.com>, 63 * Jun Nakajima <jun.nakajima@intel.com> 64 * Support for the microcode updates in the new format. 65 * 1.13 10 Oct 2003 Tigran Aivazian <tigran@veritas.com> 66 * Removed ->read() method and obsoleted MICROCODE_IOCFREE ioctl 67 * because we no longer hold a copy of applied microcode 68 * in kernel memory. 69 * 1.14 25 Jun 2004 Tigran Aivazian <tigran@veritas.com> 70 * Fix sigmatch() macro to handle old CPUs with pf == 0. 71 * Thanks to Stuart Swales for pointing out this bug. 72 */ 73 74 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 75 76 #include <linux/platform_device.h> 77 #include <linux/miscdevice.h> 78 #include <linux/capability.h> 79 #include <linux/kernel.h> 80 #include <linux/module.h> 81 #include <linux/mutex.h> 82 #include <linux/cpu.h> 83 #include <linux/fs.h> 84 #include <linux/mm.h> 85 #include <linux/syscore_ops.h> 86 87 #include <asm/microcode.h> 88 #include <asm/processor.h> 89 #include <asm/cpu_device_id.h> 90 #include <asm/perf_event.h> 91 92 MODULE_DESCRIPTION("Microcode Update Driver"); 93 MODULE_AUTHOR("Tigran Aivazian <tigran@aivazian.fsnet.co.uk>"); 94 MODULE_LICENSE("GPL"); 95 96 #define MICROCODE_VERSION "2.00" 97 98 static struct microcode_ops *microcode_ops; 99 100 /* 101 * Synchronization. 102 * 103 * All non cpu-hotplug-callback call sites use: 104 * 105 * - microcode_mutex to synchronize with each other; 106 * - get/put_online_cpus() to synchronize with 107 * the cpu-hotplug-callback call sites. 108 * 109 * We guarantee that only a single cpu is being 110 * updated at any particular moment of time. 111 */ 112 static DEFINE_MUTEX(microcode_mutex); 113 114 struct ucode_cpu_info ucode_cpu_info[NR_CPUS]; 115 EXPORT_SYMBOL_GPL(ucode_cpu_info); 116 117 /* 118 * Operations that are run on a target cpu: 119 */ 120 121 struct cpu_info_ctx { 122 struct cpu_signature *cpu_sig; 123 int err; 124 }; 125 126 static void collect_cpu_info_local(void *arg) 127 { 128 struct cpu_info_ctx *ctx = arg; 129 130 ctx->err = microcode_ops->collect_cpu_info(smp_processor_id(), 131 ctx->cpu_sig); 132 } 133 134 static int collect_cpu_info_on_target(int cpu, struct cpu_signature *cpu_sig) 135 { 136 struct cpu_info_ctx ctx = { .cpu_sig = cpu_sig, .err = 0 }; 137 int ret; 138 139 ret = smp_call_function_single(cpu, collect_cpu_info_local, &ctx, 1); 140 if (!ret) 141 ret = ctx.err; 142 143 return ret; 144 } 145 146 static int collect_cpu_info(int cpu) 147 { 148 struct ucode_cpu_info *uci = ucode_cpu_info + cpu; 149 int ret; 150 151 memset(uci, 0, sizeof(*uci)); 152 153 ret = collect_cpu_info_on_target(cpu, &uci->cpu_sig); 154 if (!ret) 155 uci->valid = 1; 156 157 return ret; 158 } 159 160 struct apply_microcode_ctx { 161 int err; 162 }; 163 164 static void apply_microcode_local(void *arg) 165 { 166 struct apply_microcode_ctx *ctx = arg; 167 168 ctx->err = microcode_ops->apply_microcode(smp_processor_id()); 169 } 170 171 static int apply_microcode_on_target(int cpu) 172 { 173 struct apply_microcode_ctx ctx = { .err = 0 }; 174 int ret; 175 176 ret = smp_call_function_single(cpu, apply_microcode_local, &ctx, 1); 177 if (!ret) 178 ret = ctx.err; 179 180 return ret; 181 } 182 183 #ifdef CONFIG_MICROCODE_OLD_INTERFACE 184 static int do_microcode_update(const void __user *buf, size_t size) 185 { 186 int error = 0; 187 int cpu; 188 189 for_each_online_cpu(cpu) { 190 struct ucode_cpu_info *uci = ucode_cpu_info + cpu; 191 enum ucode_state ustate; 192 193 if (!uci->valid) 194 continue; 195 196 ustate = microcode_ops->request_microcode_user(cpu, buf, size); 197 if (ustate == UCODE_ERROR) { 198 error = -1; 199 break; 200 } else if (ustate == UCODE_OK) 201 apply_microcode_on_target(cpu); 202 } 203 204 return error; 205 } 206 207 static int microcode_open(struct inode *inode, struct file *file) 208 { 209 return capable(CAP_SYS_RAWIO) ? nonseekable_open(inode, file) : -EPERM; 210 } 211 212 static ssize_t microcode_write(struct file *file, const char __user *buf, 213 size_t len, loff_t *ppos) 214 { 215 ssize_t ret = -EINVAL; 216 217 if ((len >> PAGE_SHIFT) > totalram_pages) { 218 pr_err("too much data (max %ld pages)\n", totalram_pages); 219 return ret; 220 } 221 222 get_online_cpus(); 223 mutex_lock(µcode_mutex); 224 225 if (do_microcode_update(buf, len) == 0) 226 ret = (ssize_t)len; 227 228 if (ret > 0) 229 perf_check_microcode(); 230 231 mutex_unlock(µcode_mutex); 232 put_online_cpus(); 233 234 return ret; 235 } 236 237 static const struct file_operations microcode_fops = { 238 .owner = THIS_MODULE, 239 .write = microcode_write, 240 .open = microcode_open, 241 .llseek = no_llseek, 242 }; 243 244 static struct miscdevice microcode_dev = { 245 .minor = MICROCODE_MINOR, 246 .name = "microcode", 247 .nodename = "cpu/microcode", 248 .fops = µcode_fops, 249 }; 250 251 static int __init microcode_dev_init(void) 252 { 253 int error; 254 255 error = misc_register(µcode_dev); 256 if (error) { 257 pr_err("can't misc_register on minor=%d\n", MICROCODE_MINOR); 258 return error; 259 } 260 261 return 0; 262 } 263 264 static void __exit microcode_dev_exit(void) 265 { 266 misc_deregister(µcode_dev); 267 } 268 269 MODULE_ALIAS_MISCDEV(MICROCODE_MINOR); 270 MODULE_ALIAS("devname:cpu/microcode"); 271 #else 272 #define microcode_dev_init() 0 273 #define microcode_dev_exit() do { } while (0) 274 #endif 275 276 /* fake device for request_firmware */ 277 static struct platform_device *microcode_pdev; 278 279 static int reload_for_cpu(int cpu) 280 { 281 struct ucode_cpu_info *uci = ucode_cpu_info + cpu; 282 enum ucode_state ustate; 283 int err = 0; 284 285 if (!uci->valid) 286 return err; 287 288 ustate = microcode_ops->request_microcode_fw(cpu, µcode_pdev->dev, true); 289 if (ustate == UCODE_OK) 290 apply_microcode_on_target(cpu); 291 else 292 if (ustate == UCODE_ERROR) 293 err = -EINVAL; 294 return err; 295 } 296 297 static ssize_t reload_store(struct device *dev, 298 struct device_attribute *attr, 299 const char *buf, size_t size) 300 { 301 unsigned long val; 302 int cpu; 303 ssize_t ret = 0, tmp_ret; 304 305 ret = kstrtoul(buf, 0, &val); 306 if (ret) 307 return ret; 308 309 if (val != 1) 310 return size; 311 312 get_online_cpus(); 313 mutex_lock(µcode_mutex); 314 for_each_online_cpu(cpu) { 315 tmp_ret = reload_for_cpu(cpu); 316 if (tmp_ret != 0) 317 pr_warn("Error reloading microcode on CPU %d\n", cpu); 318 319 /* save retval of the first encountered reload error */ 320 if (!ret) 321 ret = tmp_ret; 322 } 323 if (!ret) 324 perf_check_microcode(); 325 mutex_unlock(µcode_mutex); 326 put_online_cpus(); 327 328 if (!ret) 329 ret = size; 330 331 return ret; 332 } 333 334 static ssize_t version_show(struct device *dev, 335 struct device_attribute *attr, char *buf) 336 { 337 struct ucode_cpu_info *uci = ucode_cpu_info + dev->id; 338 339 return sprintf(buf, "0x%x\n", uci->cpu_sig.rev); 340 } 341 342 static ssize_t pf_show(struct device *dev, 343 struct device_attribute *attr, char *buf) 344 { 345 struct ucode_cpu_info *uci = ucode_cpu_info + dev->id; 346 347 return sprintf(buf, "0x%x\n", uci->cpu_sig.pf); 348 } 349 350 static DEVICE_ATTR(reload, 0200, NULL, reload_store); 351 static DEVICE_ATTR(version, 0400, version_show, NULL); 352 static DEVICE_ATTR(processor_flags, 0400, pf_show, NULL); 353 354 static struct attribute *mc_default_attrs[] = { 355 &dev_attr_version.attr, 356 &dev_attr_processor_flags.attr, 357 NULL 358 }; 359 360 static struct attribute_group mc_attr_group = { 361 .attrs = mc_default_attrs, 362 .name = "microcode", 363 }; 364 365 static void microcode_fini_cpu(int cpu) 366 { 367 microcode_ops->microcode_fini_cpu(cpu); 368 } 369 370 static enum ucode_state microcode_resume_cpu(int cpu) 371 { 372 pr_debug("CPU%d updated upon resume\n", cpu); 373 374 if (apply_microcode_on_target(cpu)) 375 return UCODE_ERROR; 376 377 return UCODE_OK; 378 } 379 380 static enum ucode_state microcode_init_cpu(int cpu, bool refresh_fw) 381 { 382 enum ucode_state ustate; 383 struct ucode_cpu_info *uci = ucode_cpu_info + cpu; 384 385 if (uci && uci->valid) 386 return UCODE_OK; 387 388 if (collect_cpu_info(cpu)) 389 return UCODE_ERROR; 390 391 /* --dimm. Trigger a delayed update? */ 392 if (system_state != SYSTEM_RUNNING) 393 return UCODE_NFOUND; 394 395 ustate = microcode_ops->request_microcode_fw(cpu, µcode_pdev->dev, 396 refresh_fw); 397 398 if (ustate == UCODE_OK) { 399 pr_debug("CPU%d updated upon init\n", cpu); 400 apply_microcode_on_target(cpu); 401 } 402 403 return ustate; 404 } 405 406 static enum ucode_state microcode_update_cpu(int cpu) 407 { 408 struct ucode_cpu_info *uci = ucode_cpu_info + cpu; 409 410 if (uci->valid) 411 return microcode_resume_cpu(cpu); 412 413 return microcode_init_cpu(cpu, false); 414 } 415 416 static int mc_device_add(struct device *dev, struct subsys_interface *sif) 417 { 418 int err, cpu = dev->id; 419 420 if (!cpu_online(cpu)) 421 return 0; 422 423 pr_debug("CPU%d added\n", cpu); 424 425 err = sysfs_create_group(&dev->kobj, &mc_attr_group); 426 if (err) 427 return err; 428 429 if (microcode_init_cpu(cpu, true) == UCODE_ERROR) 430 return -EINVAL; 431 432 return err; 433 } 434 435 static int mc_device_remove(struct device *dev, struct subsys_interface *sif) 436 { 437 int cpu = dev->id; 438 439 if (!cpu_online(cpu)) 440 return 0; 441 442 pr_debug("CPU%d removed\n", cpu); 443 microcode_fini_cpu(cpu); 444 sysfs_remove_group(&dev->kobj, &mc_attr_group); 445 return 0; 446 } 447 448 static struct subsys_interface mc_cpu_interface = { 449 .name = "microcode", 450 .subsys = &cpu_subsys, 451 .add_dev = mc_device_add, 452 .remove_dev = mc_device_remove, 453 }; 454 455 /** 456 * mc_bp_resume - Update boot CPU microcode during resume. 457 */ 458 static void mc_bp_resume(void) 459 { 460 int cpu = smp_processor_id(); 461 struct ucode_cpu_info *uci = ucode_cpu_info + cpu; 462 463 if (uci->valid && uci->mc) 464 microcode_ops->apply_microcode(cpu); 465 } 466 467 static struct syscore_ops mc_syscore_ops = { 468 .resume = mc_bp_resume, 469 }; 470 471 static int 472 mc_cpu_callback(struct notifier_block *nb, unsigned long action, void *hcpu) 473 { 474 unsigned int cpu = (unsigned long)hcpu; 475 struct device *dev; 476 477 dev = get_cpu_device(cpu); 478 479 switch (action & ~CPU_TASKS_FROZEN) { 480 case CPU_ONLINE: 481 microcode_update_cpu(cpu); 482 pr_debug("CPU%d added\n", cpu); 483 /* 484 * "break" is missing on purpose here because we want to fall 485 * through in order to create the sysfs group. 486 */ 487 488 case CPU_DOWN_FAILED: 489 if (sysfs_create_group(&dev->kobj, &mc_attr_group)) 490 pr_err("Failed to create group for CPU%d\n", cpu); 491 break; 492 493 case CPU_DOWN_PREPARE: 494 /* Suspend is in progress, only remove the interface */ 495 sysfs_remove_group(&dev->kobj, &mc_attr_group); 496 pr_debug("CPU%d removed\n", cpu); 497 break; 498 499 /* 500 * case CPU_DEAD: 501 * 502 * When a CPU goes offline, don't free up or invalidate the copy of 503 * the microcode in kernel memory, so that we can reuse it when the 504 * CPU comes back online without unnecessarily requesting the userspace 505 * for it again. 506 */ 507 } 508 509 /* The CPU refused to come up during a system resume */ 510 if (action == CPU_UP_CANCELED_FROZEN) 511 microcode_fini_cpu(cpu); 512 513 return NOTIFY_OK; 514 } 515 516 static struct notifier_block __refdata mc_cpu_notifier = { 517 .notifier_call = mc_cpu_callback, 518 }; 519 520 #ifdef MODULE 521 /* Autoload on Intel and AMD systems */ 522 static const struct x86_cpu_id __initconst microcode_id[] = { 523 #ifdef CONFIG_MICROCODE_INTEL 524 { X86_VENDOR_INTEL, X86_FAMILY_ANY, X86_MODEL_ANY, }, 525 #endif 526 #ifdef CONFIG_MICROCODE_AMD 527 { X86_VENDOR_AMD, X86_FAMILY_ANY, X86_MODEL_ANY, }, 528 #endif 529 {} 530 }; 531 MODULE_DEVICE_TABLE(x86cpu, microcode_id); 532 #endif 533 534 static struct attribute *cpu_root_microcode_attrs[] = { 535 &dev_attr_reload.attr, 536 NULL 537 }; 538 539 static struct attribute_group cpu_root_microcode_group = { 540 .name = "microcode", 541 .attrs = cpu_root_microcode_attrs, 542 }; 543 544 static int __init microcode_init(void) 545 { 546 struct cpuinfo_x86 *c = &cpu_data(0); 547 int error; 548 549 if (c->x86_vendor == X86_VENDOR_INTEL) 550 microcode_ops = init_intel_microcode(); 551 else if (c->x86_vendor == X86_VENDOR_AMD) 552 microcode_ops = init_amd_microcode(); 553 else 554 pr_err("no support for this CPU vendor\n"); 555 556 if (!microcode_ops) 557 return -ENODEV; 558 559 microcode_pdev = platform_device_register_simple("microcode", -1, 560 NULL, 0); 561 if (IS_ERR(microcode_pdev)) 562 return PTR_ERR(microcode_pdev); 563 564 get_online_cpus(); 565 mutex_lock(µcode_mutex); 566 567 error = subsys_interface_register(&mc_cpu_interface); 568 if (!error) 569 perf_check_microcode(); 570 mutex_unlock(µcode_mutex); 571 put_online_cpus(); 572 573 if (error) 574 goto out_pdev; 575 576 error = sysfs_create_group(&cpu_subsys.dev_root->kobj, 577 &cpu_root_microcode_group); 578 579 if (error) { 580 pr_err("Error creating microcode group!\n"); 581 goto out_driver; 582 } 583 584 error = microcode_dev_init(); 585 if (error) 586 goto out_ucode_group; 587 588 register_syscore_ops(&mc_syscore_ops); 589 register_hotcpu_notifier(&mc_cpu_notifier); 590 591 pr_info("Microcode Update Driver: v" MICROCODE_VERSION 592 " <tigran@aivazian.fsnet.co.uk>, Peter Oruba\n"); 593 594 return 0; 595 596 out_ucode_group: 597 sysfs_remove_group(&cpu_subsys.dev_root->kobj, 598 &cpu_root_microcode_group); 599 600 out_driver: 601 get_online_cpus(); 602 mutex_lock(µcode_mutex); 603 604 subsys_interface_unregister(&mc_cpu_interface); 605 606 mutex_unlock(µcode_mutex); 607 put_online_cpus(); 608 609 out_pdev: 610 platform_device_unregister(microcode_pdev); 611 return error; 612 613 } 614 module_init(microcode_init); 615 616 static void __exit microcode_exit(void) 617 { 618 struct cpuinfo_x86 *c = &cpu_data(0); 619 620 microcode_dev_exit(); 621 622 unregister_hotcpu_notifier(&mc_cpu_notifier); 623 unregister_syscore_ops(&mc_syscore_ops); 624 625 sysfs_remove_group(&cpu_subsys.dev_root->kobj, 626 &cpu_root_microcode_group); 627 628 get_online_cpus(); 629 mutex_lock(µcode_mutex); 630 631 subsys_interface_unregister(&mc_cpu_interface); 632 633 mutex_unlock(µcode_mutex); 634 put_online_cpus(); 635 636 platform_device_unregister(microcode_pdev); 637 638 microcode_ops = NULL; 639 640 if (c->x86_vendor == X86_VENDOR_AMD) 641 exit_amd_microcode(); 642 643 pr_info("Microcode Update Driver: v" MICROCODE_VERSION " removed.\n"); 644 } 645 module_exit(microcode_exit); 646