smp.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * SMP Support
  3.  *
  4.  * Copyright (C) 1999 VA Linux Systems
  5.  * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
  6.  * Copyright (C) 2001 Hewlett-Packard Co
  7.  * David Mosberger-Tang <davidm@hpl.hp.com>
  8.  */
  9. #ifndef _ASM_IA64_SMP_H
  10. #define _ASM_IA64_SMP_H
  11. #include <linux/config.h>
  12. #ifdef CONFIG_SMP
  13. #include <linux/init.h>
  14. #include <linux/threads.h>
  15. #include <linux/kernel.h>
  16. #include <asm/io.h>
  17. #include <asm/param.h>
  18. #include <asm/processor.h>
  19. #include <asm/ptrace.h>
  20. #define XTP_OFFSET 0x1e0008
  21. #define SMP_IRQ_REDIRECTION (1 << 0)
  22. #define SMP_IPI_REDIRECTION (1 << 1)
  23. #define smp_processor_id() (current->processor)
  24. extern struct smp_boot_data {
  25. int cpu_count;
  26. int cpu_phys_id[NR_CPUS];
  27. } smp_boot_data __initdata;
  28. extern char no_int_routing __initdata;
  29. extern volatile unsigned long cpu_online_map;
  30. extern unsigned long ipi_base_addr;
  31. extern unsigned char smp_int_redirect;
  32. extern int smp_num_cpus;
  33. extern volatile int ia64_cpu_to_sapicid[];
  34. #define cpu_physical_id(i) ia64_cpu_to_sapicid[i]
  35. #define cpu_number_map(i) (i)
  36. #define cpu_logical_map(i) (i)
  37. extern unsigned long ap_wakeup_vector;
  38. /*
  39.  * Function to map hard smp processor id to logical id.  Slow, so
  40.  * don't use this in performance-critical code.
  41.  */
  42. static inline int
  43. cpu_logical_id (int cpuid)
  44. {
  45. int i;
  46. for (i = 0; i < smp_num_cpus; ++i)
  47. if (cpu_physical_id(i) == (__u32) cpuid)
  48. break;
  49. return i;
  50. }
  51. /*
  52.  * XTP control functions:
  53.  * min_xtp   : route all interrupts to this CPU
  54.  * normal_xtp: nominal XTP value
  55.  * max_xtp   : never deliver interrupts to this CPU.
  56.  */
  57. static inline void
  58. min_xtp (void)
  59. {
  60. if (smp_int_redirect & SMP_IRQ_REDIRECTION)
  61. writeb(0x00, ipi_base_addr | XTP_OFFSET); /* XTP to min */
  62. }
  63. static inline void
  64. normal_xtp (void)
  65. {
  66. if (smp_int_redirect & SMP_IRQ_REDIRECTION)
  67. writeb(0x08, ipi_base_addr | XTP_OFFSET); /* XTP normal */
  68. }
  69. static inline void
  70. max_xtp (void)
  71. {
  72. if (smp_int_redirect & SMP_IRQ_REDIRECTION)
  73. writeb(0x0f, ipi_base_addr | XTP_OFFSET); /* Set XTP to max */
  74. }
  75. static inline unsigned int
  76. hard_smp_processor_id (void)
  77. {
  78. union {
  79. struct {
  80. unsigned long reserved : 16;
  81. unsigned long eid : 8;
  82. unsigned long id : 8;
  83. unsigned long ignored : 32;
  84. } f;
  85. unsigned long bits;
  86. } lid;
  87. lid.bits = ia64_get_lid();
  88. return lid.f.id << 8 | lid.f.eid;
  89. }
  90. #define NO_PROC_ID 0xffffffff /* no processor magic marker */
  91. /*
  92.  * Extra overhead to move a task from one cpu to another (due to TLB and cache misses).
  93.  * Expressed in "negative nice value" units (larger number means higher priority/penalty).
  94.  */
  95. #define PROC_CHANGE_PENALTY 20
  96. extern void __init init_smp_config (void);
  97. extern void smp_do_timer (struct pt_regs *regs);
  98. extern int smp_call_function_single (int cpuid, void (*func) (void *info), void *info,
  99.      int retry, int wait);
  100. #endif /* CONFIG_SMP */
  101. #endif /* _ASM_IA64_SMP_H */