topology.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /*
  2. * Populate sysfs with topology information
  3. *
  4. * Written by: Matthew Dobson, IBM Corporation
  5. * Original Code: Paul Dorwin, IBM Corporation, Patrick Mochel, OSDL
  6. *
  7. * Copyright (C) 2002, IBM Corp.
  8. *
  9. * All rights reserved.
  10. *
  11. * This program is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License as published by
  13. * the Free Software Foundation; either version 2 of the License, or
  14. * (at your option) any later version.
  15. *
  16. * This program is distributed in the hope that it will be useful, but
  17. * WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
  19. * NON INFRINGEMENT. See the GNU General Public License for more
  20. * details.
  21. *
  22. * You should have received a copy of the GNU General Public License
  23. * along with this program; if not, write to the Free Software
  24. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  25. *
  26. * Send feedback to <colpatch@us.ibm.com>
  27. */
  28. #include <linux/nodemask.h>
  29. #include <linux/export.h>
  30. #include <linux/mmzone.h>
  31. #include <linux/init.h>
  32. #include <linux/smp.h>
  33. #include <linux/irq.h>
  34. #include <asm/cpu.h>
  35. static DEFINE_PER_CPU(struct x86_cpu, cpu_devices);
  36. #ifdef CONFIG_HOTPLUG_CPU
  37. #ifdef CONFIG_BOOTPARAM_HOTPLUG_CPU0
  38. static int cpu0_hotpluggable = 1;
  39. #else
  40. static int cpu0_hotpluggable;
  41. static int __init enable_cpu0_hotplug(char *str)
  42. {
  43. cpu0_hotpluggable = 1;
  44. return 1;
  45. }
  46. __setup("cpu0_hotplug", enable_cpu0_hotplug);
  47. #endif
  48. int __ref arch_register_cpu(int num)
  49. {
  50. struct cpuinfo_x86 *c = &cpu_data(num);
  51. /*
  52. * Currently CPU0 is only hotpluggable on Intel platforms. Other
  53. * vendors can add hotplug support later.
  54. */
  55. if (c->x86_vendor != X86_VENDOR_INTEL)
  56. cpu0_hotpluggable = 0;
  57. /*
  58. * Two known BSP/CPU0 dependencies: Resume from suspend/hibernate
  59. * depends on BSP. PIC interrupts depend on BSP.
  60. *
  61. * If the BSP depencies are under control, one can tell kernel to
  62. * enable BSP hotplug. This basically adds a control file and
  63. * one can attempt to offline BSP.
  64. */
  65. if (num == 0 && cpu0_hotpluggable) {
  66. unsigned int irq;
  67. /*
  68. * We won't take down the boot processor on i386 if some
  69. * interrupts only are able to be serviced by the BSP in PIC.
  70. */
  71. for_each_active_irq(irq) {
  72. if (!IO_APIC_IRQ(irq) && irq_has_action(irq)) {
  73. cpu0_hotpluggable = 0;
  74. break;
  75. }
  76. }
  77. }
  78. if (num || cpu0_hotpluggable)
  79. per_cpu(cpu_devices, num).cpu.hotpluggable = 1;
  80. return register_cpu(&per_cpu(cpu_devices, num).cpu, num);
  81. }
  82. EXPORT_SYMBOL(arch_register_cpu);
  83. void arch_unregister_cpu(int num)
  84. {
  85. unregister_cpu(&per_cpu(cpu_devices, num).cpu);
  86. }
  87. EXPORT_SYMBOL(arch_unregister_cpu);
  88. #else /* CONFIG_HOTPLUG_CPU */
  89. static int __init arch_register_cpu(int num)
  90. {
  91. return register_cpu(&per_cpu(cpu_devices, num).cpu, num);
  92. }
  93. #endif /* CONFIG_HOTPLUG_CPU */
  94. static int __init topology_init(void)
  95. {
  96. int i;
  97. #ifdef CONFIG_NUMA
  98. for_each_online_node(i)
  99. register_one_node(i);
  100. #endif
  101. for_each_present_cpu(i)
  102. arch_register_cpu(i);
  103. return 0;
  104. }
  105. subsys_initcall(topology_init);