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

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. #include <linux/sched.h>
  19. #include <linux/smp.h>
  20. #include <asm/mipsregs.h>
  21. #include "cfe_xiocb.h"
  22. #include "cfe_api.h"
  23. #include "cfe_error.h"
  24. extern void asmlinkage smp_bootstrap(void);
  25. /* Boot all other cpus in the system, initialize them, and
  26.    bring them into the boot fn */
  27. int prom_boot_secondary(int cpu, unsigned long sp, unsigned long gp)
  28. {
  29. int retval;
  30. retval = cfe_start_cpu(cpu, &smp_bootstrap, sp, gp, 0);
  31. if (retval != 0) {
  32. printk("cfe_start_cpu(%i) returned %in" , cpu, retval);
  33. return 0;
  34. } else {
  35. return 1;
  36. }
  37. }
  38. void prom_init_secondary(void)
  39. {
  40. /* Set up kseg0 to be cachable coherent */
  41. clear_cp0_config(CONF_CM_CMASK);
  42. set_cp0_config(0x5);
  43. /* Enable interrupts for lines 0-4 */
  44. clear_cp0_status(0xe000);
  45. set_cp0_status(0x1f01);
  46. }
  47. /*
  48.  * Set up state, return the total number of cpus in the system, including
  49.  * the master
  50.  */
  51. int prom_setup_smp(void)
  52. {
  53. int i;
  54. int num_cpus = 1;
  55. /* Use CFE to find out how many CPUs are available */
  56. for (i=1; i<NR_CPUS; i++) {
  57. if (cfe_stop_cpu(i) == 0) {
  58. num_cpus++;
  59. }
  60. }
  61. printk("Detected %i available CPU(s)n", num_cpus);
  62. return num_cpus;
  63. }
  64. void prom_smp_finish(void)
  65. {
  66. extern void sb1250_smp_finish(void);
  67. sb1250_smp_finish();
  68. }