smpboot.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef __ASM_SMPBOOT_H
  2. #define __ASM_SMPBOOT_H
  3. /*emum for clustered_apic_mode values*/
  4. enum{
  5. CLUSTERED_APIC_NONE = 0,
  6. CLUSTERED_APIC_XAPIC,
  7. CLUSTERED_APIC_NUMAQ
  8. };
  9. #ifdef CONFIG_MULTIQUAD
  10.  #define clustered_apic_mode (CLUSTERED_APIC_NUMAQ)
  11. #else /* !CONFIG_MULTIQUAD */
  12.  #define clustered_apic_mode (CLUSTERED_APIC_NONE)
  13. #endif /* CONFIG_MULTIQUAD */
  14. #ifdef CONFIG_X86_LOCAL_APIC
  15. extern unsigned char esr_disable;
  16. static inline int target_cpus(void)
  17. {
  18. switch(clustered_apic_mode){
  19. case CLUSTERED_APIC_NUMAQ:
  20. /* Broadcast intrs to local quad only. */
  21. return APIC_BROADCAST_ID_APIC;
  22. default:
  23. }
  24. return cpu_online_map;
  25. }
  26. #ifdef CONFIG_X86_IO_APIC
  27. extern unsigned char int_delivery_mode;
  28. extern unsigned int int_dest_addr_mode;
  29. #define INT_DEST_ADDR_MODE (int_dest_addr_mode)
  30. #define INT_DELIVERY_MODE (int_delivery_mode)
  31. #endif /* CONFIG_X86_IO_APIC */
  32. #else /* CONFIG_X86_LOCAL_APIC */
  33. #define esr_disable (0)
  34. #define target_cpus() (0x01)
  35. #ifdef CONFIG_X86_IO_APIC
  36. #define INT_DEST_ADDR_MODE (APIC_DEST_LOGICAL) /* logical delivery */
  37. #define INT_DELIVERY_MODE (dest_LowestPrio)
  38. #endif /* CONFIG_X86_IO_APIC */
  39. #endif /* CONFIG_X86_LOCAL_APIC */
  40. #define TRAMPOLINE_LOW phys_to_virt((clustered_apic_mode == CLUSTERED_APIC_NUMAQ)?0x8:0x467)
  41. #define TRAMPOLINE_HIGH phys_to_virt((clustered_apic_mode == CLUSTERED_APIC_NUMAQ)?0xa:0x469)
  42. #define boot_cpu_apicid ((clustered_apic_mode == CLUSTERED_APIC_NUMAQ)?boot_cpu_logical_apicid:boot_cpu_physical_apicid)
  43. /*
  44.  * How to map from the cpu_present_map
  45.  */
  46. static inline int cpu_present_to_apicid(int mps_cpu)
  47. {
  48. if(clustered_apic_mode == CLUSTERED_APIC_NUMAQ)
  49. return (mps_cpu/4)*16 + (1<<(mps_cpu%4));
  50. return mps_cpu;
  51. }
  52. #define physical_to_logical_apicid(phys_apic) ( (1ul << (phys_apic & 0x3)) | (phys_apic & 0xF0u) )
  53. /*
  54.  * Mappings between logical cpu number and logical / physical apicid
  55.  * The first four macros are trivial, but it keeps the abstraction consistent
  56.  */
  57. extern volatile int logical_apicid_2_cpu[];
  58. extern volatile int cpu_2_logical_apicid[];
  59. extern volatile int physical_apicid_2_cpu[];
  60. extern volatile int cpu_2_physical_apicid[];
  61. #define logical_apicid_to_cpu(apicid) logical_apicid_2_cpu[apicid]
  62. #define cpu_to_logical_apicid(cpu) cpu_2_logical_apicid[cpu]
  63. #define physical_apicid_to_cpu(apicid) physical_apicid_2_cpu[apicid]
  64. #define cpu_to_physical_apicid(cpu) cpu_2_physical_apicid[cpu]
  65. #ifdef CONFIG_MULTIQUAD /* use logical IDs to bootstrap */
  66. #define boot_apicid_to_cpu(apicid) logical_apicid_2_cpu[apicid]
  67. #define cpu_to_boot_apicid(cpu) cpu_2_logical_apicid[cpu]
  68. #else /* !CONFIG_MULTIQUAD */ /* use physical IDs to bootstrap */
  69. #define boot_apicid_to_cpu(apicid) physical_apicid_2_cpu[apicid]
  70. #define cpu_to_boot_apicid(cpu) cpu_2_physical_apicid[cpu]
  71. #endif /* CONFIG_MULTIQUAD */
  72. #endif