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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*    $Id: setup.c,v 1.8 2000/02/02 04:42:38 prumpf Exp $
  2.  *
  3.  *    Initial setup-routines for HP 9000 based hardware.
  4.  *
  5.  *    Copyright (C) 1991, 1992, 1995  Linus Torvalds
  6.  *    Modifications for PA-RISC (C) 1999 Helge Deller <deller@gmx.de>
  7.  *    Modifications copyright 1999 SuSE GmbH (Philipp Rumpf)
  8.  *    Modifications copyright 2000 Martin K. Petersen <mkp@mkp.net>
  9.  *    Modifications copyright 2000 Philipp Rumpf <prumpf@tux.org>
  10.  *    Modifications copyright 2001 Ryan Bradetich <rbradetich@uswest.net>
  11.  *
  12.  *    Initial PA-RISC Version: 04-23-1999 by Helge Deller
  13.  *
  14.  *    This program is free software; you can redistribute it and/or modify
  15.  *    it under the terms of the GNU General Public License as published by
  16.  *    the Free Software Foundation; either version 2, or (at your option)
  17.  *    any later version.
  18.  *
  19.  *    This program is distributed in the hope that it will be useful,
  20.  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  21.  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  22.  *    GNU General Public License for more details.
  23.  *
  24.  *    You should have received a copy of the GNU General Public License
  25.  *    along with this program; if not, write to the Free Software
  26.  *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  27.  *
  28.  */
  29. #include <linux/config.h>
  30. #include <linux/kernel.h>
  31. #include <linux/blk.h>          /* for initrd_start and initrd_end */
  32. #include <linux/init.h>
  33. #include <linux/console.h>
  34. #include <linux/seq_file.h>
  35. #define PCI_DEBUG
  36. #include <linux/pci.h>
  37. #undef PCI_DEBUG
  38. #include <linux/proc_fs.h>
  39. #include <asm/processor.h>
  40. #include <asm/pdc.h>
  41. #include <asm/led.h>
  42. #include <asm/machdep.h> /* for pa7300lc_init() proto */
  43. #define COMMAND_LINE_SIZE 1024
  44. char saved_command_line[COMMAND_LINE_SIZE];
  45. char command_line[COMMAND_LINE_SIZE];
  46. /* Intended for ccio/sba/cpu statistics under /proc/bus/{runway|gsc} */
  47. struct proc_dir_entry * proc_runway_root = NULL;
  48. struct proc_dir_entry * proc_gsc_root = NULL;
  49. #ifdef CONFIG_EISA
  50. int EISA_bus; /* This has to go somewhere in architecture specific code. */
  51. #endif
  52. void __init setup_cmdline(char **cmdline_p)
  53. {
  54. extern unsigned int boot_args[];
  55. /* Collect stuff passed in from the boot loader */
  56. /* boot_args[0] is free-mem start, boot_args[1] is ptr to command line */
  57. if (boot_args[0] < 64) {
  58. /* called from hpux boot loader */
  59. saved_command_line[0] = '';
  60. } else {
  61. strcpy(saved_command_line, (char *)__va(boot_args[1]));
  62. #ifdef CONFIG_BLK_DEV_INITRD
  63. if (boot_args[2] != 0) /* did palo pass us a ramdisk? */
  64. {
  65.     initrd_start = (unsigned long)__va(boot_args[2]);
  66.     initrd_end = (unsigned long)__va(boot_args[3]);
  67. }
  68. #endif
  69. }
  70. strcpy(command_line, saved_command_line);
  71. *cmdline_p = command_line;
  72. }
  73. #ifdef CONFIG_PA11
  74. void __init dma_ops_init(void)
  75. {
  76. switch (boot_cpu_data.cpu_type) {
  77. case pcx:
  78. /*
  79.  * We've got way too many dependencies on 1.1 semantics
  80.  * to support 1.0 boxes at this point.
  81.  */
  82. panic( "PA-RISC Linux currently only supports machines that conform ton"
  83. "the PA-RISC 1.1 or 2.0 architecture specification.n");
  84. case pcxs:
  85. case pcxt:
  86. hppa_dma_ops = &pcx_dma_ops;
  87. break;
  88. case pcxl2:
  89. pa7300lc_init();
  90. case pcxl: /* falls through */
  91. hppa_dma_ops = &pcxl_dma_ops;
  92. break;
  93. default:
  94. break;
  95. }
  96. }
  97. #endif
  98. extern int init_per_cpu(int cpuid);
  99. extern void collect_boot_cpu_data(void);
  100. void __init setup_arch(char **cmdline_p)
  101. {
  102. init_per_cpu(smp_processor_id()); /* Set Modes & Enable FP */
  103. #ifdef __LP64__
  104. printk(KERN_INFO "The 64-bit Kernel has started...n");
  105. #else
  106. printk(KERN_INFO "The 32-bit Kernel has started...n");
  107. #endif
  108. pdc_console_init();
  109. #ifdef CONFIG_PDC_NARROW
  110. printk(KERN_INFO "Kernel is using PDC in 32-bit mode.n");
  111. #endif
  112. setup_pdc();
  113. setup_cmdline(cmdline_p);
  114. collect_boot_cpu_data();
  115. do_memory_inventory();  /* probe for physical memory */
  116. cache_init();
  117. paging_init();
  118. #ifdef CONFIG_CHASSIS_LCD_LED
  119. /* initialize the LCD/LED after boot_cpu_data is available ! */
  120.         led_init(); /* LCD/LED initialization */
  121. #endif
  122. #ifdef CONFIG_PA11
  123. dma_ops_init();
  124. #endif
  125. #ifdef CONFIG_VT
  126. # if defined(CONFIG_STI_CONSOLE) || defined(CONFIG_DUMMY_CONSOLE)
  127.         conswitchp = &dummy_con;        /* we use take_over_console() later ! */
  128. # endif
  129. #endif
  130. }
  131. /*
  132.  * Display cpu info for all cpu's.
  133.  * for parisc this is in processor.c
  134.  */
  135. extern int show_cpuinfo (struct seq_file *m, void *v);
  136. static void *
  137. c_start (struct seq_file *m, loff_t *pos)
  138. {
  139.      /* Looks like the caller will call repeatedly until we return
  140.  * 0, signaling EOF perhaps.  This could be used to sequence
  141.  * through CPUs for example.  Since we print all cpu info in our
  142.  * show_cpuinfo() disregarding 'pos' (which I assume is 'v' above)
  143.  * we only allow for one "position".  */
  144. return ((long)*pos < 1) ? (void *)1 : NULL;
  145. }
  146. static void *
  147. c_next (struct seq_file *m, void *v, loff_t *pos)
  148. {
  149. ++*pos;
  150. return c_start(m, pos);
  151. }
  152. static void
  153. c_stop (struct seq_file *m, void *v)
  154. {
  155. }
  156. struct seq_operations cpuinfo_op = {
  157. start: c_start,
  158. next: c_next,
  159. stop: c_stop,
  160. show: show_cpuinfo
  161. };
  162. static void parisc_proc_mkdir(void)
  163. {
  164. /*
  165. ** Can't call proc_mkdir() until after proc_root_init() has been
  166. ** called by start_kernel(). In other words, this code can't
  167. ** live in arch/.../setup.c because start_parisc() calls
  168. ** start_kernel().
  169. */
  170. switch (boot_cpu_data.cpu_type) {
  171. case pcxl:
  172. case pcxl2:
  173. if (NULL == proc_gsc_root)
  174. {
  175. proc_gsc_root = proc_mkdir("bus/gsc", 0);
  176. }
  177. break;
  178.         case pcxt_:
  179.         case pcxu:
  180.         case pcxu_:
  181.         case pcxw:
  182.         case pcxw_:
  183.         case pcxw2:
  184.                 if (NULL == proc_runway_root)
  185.                 {
  186.                         proc_runway_root = proc_mkdir("bus/runway", 0);
  187.                 }
  188.                 break;
  189. }
  190. }
  191. static struct resource central_bus = {
  192. name: "Central Bus",
  193. start: (unsigned long)0xfffffffffff80000,
  194. end:    (unsigned long)0xfffffffffffaffff,
  195. flags: IORESOURCE_MEM,
  196. };
  197. static struct resource local_broadcast = {
  198. name: "Local Broadcast",
  199. start: (unsigned long)0xfffffffffffb0000,
  200. end: (unsigned long)0xfffffffffffdffff,
  201. flags: IORESOURCE_MEM,
  202. };
  203. static struct resource global_broadcast = {
  204. name: "Global Broadcast",
  205. start: (unsigned long)0xfffffffffffe0000,
  206. end: (unsigned long)0xffffffffffffffff,
  207. flags: IORESOURCE_MEM,
  208. };
  209. int __init parisc_init_resources(void)
  210. {
  211. int result;
  212. result = request_resource(&iomem_resource, &central_bus);
  213. if (result < 0) {
  214. printk(KERN_ERR 
  215.        "%s: failed to claim %s address space!n", 
  216.        __FILE__, central_bus.name);
  217. return result;
  218. }
  219. result = request_resource(&iomem_resource, &local_broadcast);
  220. if (result < 0) {
  221. printk(KERN_ERR 
  222.        "%s: failed to claim %saddress space!n", 
  223.        __FILE__, local_broadcast.name);
  224. return result;
  225. }
  226. result = request_resource(&iomem_resource, &global_broadcast);
  227. if (result < 0) {
  228. printk(KERN_ERR 
  229.        "%s: failed to claim %s address space!n", 
  230.        __FILE__, global_broadcast.name);
  231. return result;
  232. }
  233. return 0;
  234. }
  235. extern void gsc_init(void);
  236. extern void processor_init(void);
  237. extern void ccio_init(void);
  238. extern void dino_init(void);
  239. extern void iosapic_init(void);
  240. extern void lba_init(void);
  241. extern void sba_init(void);
  242. extern void eisa_init(void);
  243. void __init parisc_init(void)
  244. {
  245. parisc_proc_mkdir();
  246. parisc_init_resources();
  247. do_device_inventory();                  /* probe for hardware */
  248. processor_init();
  249. printk(KERN_INFO "CPU(s): %d x %s at %d.%06d MHzn",
  250. boot_cpu_data.cpu_count,
  251. boot_cpu_data.cpu_name,
  252. boot_cpu_data.cpu_hz / 1000000,
  253. boot_cpu_data.cpu_hz % 1000000 );
  254. /* These are in a non-obvious order, will fix when we have an iotree */
  255. #if defined(CONFIG_IOSAPIC)
  256. iosapic_init();
  257. #endif
  258. #if defined(CONFIG_IOMMU_SBA)
  259. sba_init();
  260. #endif
  261. #if defined(CONFIG_PCI_LBA)
  262. lba_init();
  263. #endif
  264. /* CCIO before any potential subdevices */
  265. #if defined(CONFIG_IOMMU_CCIO)
  266. ccio_init();
  267. #endif
  268. /*
  269.  * Need to register Asp & Wax before the EISA adapters for the IRQ
  270.  * regions.  EISA must come before PCI to be sure it gets IRQ region
  271.  * 0.
  272.  */
  273. #if defined(CONFIG_GSC_LASI) || defined(CONFIG_GSC_WAX)
  274. gsc_init();
  275. #endif
  276. #ifdef CONFIG_EISA
  277. eisa_init();
  278. #endif
  279. #if defined(CONFIG_GSC_DINO)
  280. dino_init();
  281. #endif
  282. #ifdef CONFIG_CHASSIS_LCD_LED
  283. register_led_regions(); /* register LED port info in procfs */
  284. #endif
  285. }