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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* devices.c: Initial scan of the prom device tree for important
  2.  *            Sparc device nodes which we need to find.
  3.  *
  4.  * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
  5.  */
  6. #include <linux/config.h>
  7. #include <linux/kernel.h>
  8. #include <linux/threads.h>
  9. #include <linux/init.h>
  10. #include <linux/ioport.h>
  11. #include <linux/string.h>
  12. #include <asm/page.h>
  13. #include <asm/oplib.h>
  14. #include <asm/system.h>
  15. #include <asm/smp.h>
  16. #include <asm/spitfire.h>
  17. struct prom_cpuinfo linux_cpus[64] __initdata = { { 0 } };
  18. unsigned prom_cpu_nodes[64];
  19. int linux_num_cpus = 0;
  20. extern void cpu_probe(void);
  21. extern void central_probe(void);
  22. void __init device_scan(void)
  23. {
  24. char node_str[128];
  25. int nd, prom_node_cpu, thismid;
  26. int cpu_nds[64];  /* One node for each cpu */
  27. int cpu_ctr = 0;
  28. /* FIX ME FAST... -DaveM */
  29. ioport_resource.end = 0xffffffffffffffffUL;
  30. iomem_resource.end = 0xffffffffffffffffUL;
  31. prom_getstring(prom_root_node, "device_type", node_str, sizeof(node_str));
  32. prom_printf("Booting Linux...n");
  33. if(strcmp(node_str, "cpu") == 0) {
  34. cpu_nds[0] = prom_root_node;
  35. linux_cpus[0].prom_node = prom_root_node;
  36. linux_cpus[0].mid = 0;
  37. cpu_ctr++;
  38. } else {
  39. int scan;
  40. scan = prom_getchild(prom_root_node);
  41. /* prom_printf("root child is %08xn", (unsigned) scan); */
  42. nd = 0;
  43. while((scan = prom_getsibling(scan)) != 0) {
  44. prom_getstring(scan, "device_type", node_str, sizeof(node_str));
  45. if(strcmp(node_str, "cpu") == 0) {
  46. cpu_nds[cpu_ctr] = scan;
  47. linux_cpus[cpu_ctr].prom_node = scan;
  48. thismid = 0;
  49. if (tlb_type == spitfire) {
  50. prom_getproperty(scan, "upa-portid",
  51.  (char *) &thismid, sizeof(thismid));
  52. } else if (tlb_type == cheetah) {
  53. prom_getproperty(scan, "portid",
  54.  (char *) &thismid, sizeof(thismid));
  55. }
  56. linux_cpus[cpu_ctr].mid = thismid;
  57. printk("Found CPU %d (node=%08x,mid=%d)n",
  58.        cpu_ctr, (unsigned) scan, thismid);
  59. cpu_ctr++;
  60. }
  61. };
  62. if(cpu_ctr == 0) {
  63. prom_printf("No CPU nodes found, cannot continue.n");
  64. prom_halt();
  65. }
  66. printk("Found %d CPU prom device tree node(s).n", cpu_ctr);
  67. }
  68. prom_node_cpu = cpu_nds[0];
  69. linux_num_cpus = cpu_ctr;
  70. prom_cpu_nodes[0] = prom_node_cpu;
  71. #ifndef CONFIG_SMP
  72. {
  73. extern unsigned long up_clock_tick;
  74. up_clock_tick = prom_getintdefault(prom_node_cpu,
  75.    "clock-frequency",
  76.    0);
  77. }
  78. #endif
  79. central_probe();
  80. cpu_probe();
  81. }