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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (C) 2000, 2001 Broadcom Corporation
  3.  *
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  *
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17.  */
  18. #ifndef __ASM_MIPS_SMP_H
  19. #define __ASM_MIPS_SMP_H
  20. #include <linux/config.h>
  21. #ifdef CONFIG_SMP
  22. #include <asm/spinlock.h>
  23. #include <linux/threads.h>
  24. #include <asm/atomic.h>
  25. #include <asm/current.h>
  26. #define smp_processor_id()  (current->processor)
  27. #define PROC_CHANGE_PENALTY 20
  28. /* Map from cpu id to sequential logical cpu number.  This will only
  29.    not be idempotent when cpus failed to come on-line.  */
  30. extern int __cpu_number_map[NR_CPUS];
  31. #define cpu_number_map(cpu)  __cpu_number_map[cpu]
  32. /* The reverse map from sequential logical cpu number to cpu id.  */
  33. extern int __cpu_logical_map[NR_CPUS];
  34. #define cpu_logical_map(cpu)  __cpu_logical_map[cpu]
  35. #define NO_PROC_ID (-1)
  36. struct call_data_struct {
  37. void (*func)(void *);
  38. void *info;
  39. atomic_t started;
  40. atomic_t finished;
  41. int wait;
  42. };
  43. extern struct call_data_struct *call_data;
  44. /* ipi types that boards must handle, one bit per type   */
  45. #define SMP_RESCHEDULE_YOURSELF 0x1 /* XXX braindead */
  46. #define SMP_CALL_FUNCTION 0x2
  47. #if (NR_CPUS <= _MIPS_SZLONG)
  48. typedef unsigned long   cpumask_t;
  49. #define CPUMASK_CLRALL(p) (p) = 0
  50. #define CPUMASK_SETB(p, bit) (p) |= 1 << (bit)
  51. #define CPUMASK_CLRB(p, bit) (p) &= ~(1UL << (bit))
  52. #define CPUMASK_TSTB(p, bit) ((p) & (1UL << (bit)))
  53. #elif (NR_CPUS <= 128)
  54. /*
  55.  * The foll should work till 128 cpus.
  56.  */
  57. #define CPUMASK_SIZE (NR_CPUS/_MIPS_SZLONG)
  58. #define CPUMASK_INDEX(bit) ((bit) >> 6)
  59. #define CPUMASK_SHFT(bit) ((bit) & 0x3f)
  60. typedef struct {
  61. unsigned long _bits[CPUMASK_SIZE];
  62. } cpumask_t;
  63. #define CPUMASK_CLRALL(p) (p)._bits[0] = 0, (p)._bits[1] = 0
  64. #define CPUMASK_SETB(p, bit) (p)._bits[CPUMASK_INDEX(bit)] |= 
  65. (1UL << CPUMASK_SHFT(bit))
  66. #define CPUMASK_CLRB(p, bit) (p)._bits[CPUMASK_INDEX(bit)] &= 
  67. ~(1UL << CPUMASK_SHFT(bit))
  68. #define CPUMASK_TSTB(p, bit) ((p)._bits[CPUMASK_INDEX(bit)] & 
  69. (1UL << CPUMASK_SHFT(bit)))
  70. #else
  71. #error cpumask macros only defined for 128p kernels
  72. #endif
  73. extern cpumask_t cpu_online_map;
  74. #endif /* CONFIG_SMP */
  75. #endif /* __ASM_MIPS_SMP_H */