sbus.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. /* sbus.c: SBus support routines.
  2. *
  3. * Copyright (C) 1995, 2006 David S. Miller (davem@davemloft.net)
  4. */
  5. #include <linux/kernel.h>
  6. #include <linux/slab.h>
  7. #include <linux/init.h>
  8. #include <linux/device.h>
  9. #include <linux/of_device.h>
  10. #include <asm/system.h>
  11. #include <asm/sbus.h>
  12. #include <asm/dma.h>
  13. #include <asm/oplib.h>
  14. #include <asm/prom.h>
  15. #include <asm/irq.h>
  16. static ssize_t
  17. show_sbusobppath_attr(struct device * dev, struct device_attribute * attr, char * buf)
  18. {
  19. struct sbus_dev *sbus;
  20. sbus = to_sbus_device(dev);
  21. return snprintf (buf, PAGE_SIZE, "%s\n", sbus->ofdev.node->full_name);
  22. }
  23. static DEVICE_ATTR(obppath, S_IRUSR | S_IRGRP | S_IROTH, show_sbusobppath_attr, NULL);
  24. struct sbus_bus *sbus_root;
  25. static void __init fill_sbus_device(struct device_node *dp, struct sbus_dev *sdev)
  26. {
  27. struct dev_archdata *sd;
  28. unsigned long base;
  29. const void *pval;
  30. int len, err;
  31. sdev->prom_node = dp->node;
  32. strcpy(sdev->prom_name, dp->name);
  33. pval = of_get_property(dp, "reg", &len);
  34. sdev->num_registers = 0;
  35. if (pval) {
  36. memcpy(sdev->reg_addrs, pval, len);
  37. sdev->num_registers =
  38. len / sizeof(struct linux_prom_registers);
  39. base = (unsigned long) sdev->reg_addrs[0].phys_addr;
  40. /* Compute the slot number. */
  41. if (base >= SUN_SBUS_BVADDR && sparc_cpu_model == sun4m)
  42. sdev->slot = sbus_dev_slot(base);
  43. else
  44. sdev->slot = sdev->reg_addrs[0].which_io;
  45. }
  46. pval = of_get_property(dp, "ranges", &len);
  47. sdev->num_device_ranges = 0;
  48. if (pval) {
  49. memcpy(sdev->device_ranges, pval, len);
  50. sdev->num_device_ranges =
  51. len / sizeof(struct linux_prom_ranges);
  52. }
  53. sbus_fill_device_irq(sdev);
  54. sd = &sdev->ofdev.dev.archdata;
  55. sd->prom_node = dp;
  56. sd->op = &sdev->ofdev;
  57. sdev->ofdev.node = dp;
  58. if (sdev->parent)
  59. sdev->ofdev.dev.parent = &sdev->parent->ofdev.dev;
  60. else
  61. sdev->ofdev.dev.parent = &sdev->bus->ofdev.dev;
  62. sdev->ofdev.dev.bus = &sbus_bus_type;
  63. dev_set_name(&sdev->ofdev.dev, "sbus[%08x]", dp->node);
  64. if (of_device_register(&sdev->ofdev) != 0)
  65. printk(KERN_DEBUG "sbus: device registration error for %s!\n",
  66. dp->path_component_name);
  67. /* WE HAVE BEEN INVADED BY ALIENS! */
  68. err = sysfs_create_file(&sdev->ofdev.dev.kobj, &dev_attr_obppath.attr);
  69. }
  70. static void __init sbus_bus_ranges_init(struct device_node *dp, struct sbus_bus *sbus)
  71. {
  72. const void *pval;
  73. int len;
  74. pval = of_get_property(dp, "ranges", &len);
  75. sbus->num_sbus_ranges = 0;
  76. if (pval) {
  77. memcpy(sbus->sbus_ranges, pval, len);
  78. sbus->num_sbus_ranges =
  79. len / sizeof(struct linux_prom_ranges);
  80. sbus_arch_bus_ranges_init(dp->parent, sbus);
  81. }
  82. }
  83. static void __init __apply_ranges_to_regs(struct linux_prom_ranges *ranges,
  84. int num_ranges,
  85. struct linux_prom_registers *regs,
  86. int num_regs)
  87. {
  88. if (num_ranges) {
  89. int regnum;
  90. for (regnum = 0; regnum < num_regs; regnum++) {
  91. int rngnum;
  92. for (rngnum = 0; rngnum < num_ranges; rngnum++) {
  93. if (regs[regnum].which_io == ranges[rngnum].ot_child_space)
  94. break;
  95. }
  96. if (rngnum == num_ranges) {
  97. /* We used to flag this as an error. Actually
  98. * some devices do not report the regs as we expect.
  99. * For example, see SUNW,pln device. In that case
  100. * the reg property is in a format internal to that
  101. * node, ie. it is not in the SBUS register space
  102. * per se. -DaveM
  103. */
  104. return;
  105. }
  106. regs[regnum].which_io = ranges[rngnum].ot_parent_space;
  107. regs[regnum].phys_addr -= ranges[rngnum].ot_child_base;
  108. regs[regnum].phys_addr += ranges[rngnum].ot_parent_base;
  109. }
  110. }
  111. }
  112. static void __init __fixup_regs_sdev(struct sbus_dev *sdev)
  113. {
  114. if (sdev->num_registers != 0) {
  115. struct sbus_dev *parent = sdev->parent;
  116. int i;
  117. while (parent != NULL) {
  118. __apply_ranges_to_regs(parent->device_ranges,
  119. parent->num_device_ranges,
  120. sdev->reg_addrs,
  121. sdev->num_registers);
  122. parent = parent->parent;
  123. }
  124. __apply_ranges_to_regs(sdev->bus->sbus_ranges,
  125. sdev->bus->num_sbus_ranges,
  126. sdev->reg_addrs,
  127. sdev->num_registers);
  128. for (i = 0; i < sdev->num_registers; i++) {
  129. struct resource *res = &sdev->resource[i];
  130. res->start = sdev->reg_addrs[i].phys_addr;
  131. res->end = (res->start +
  132. (unsigned long)sdev->reg_addrs[i].reg_size - 1UL);
  133. res->flags = IORESOURCE_IO |
  134. (sdev->reg_addrs[i].which_io & 0xff);
  135. }
  136. }
  137. }
  138. static void __init sbus_fixup_all_regs(struct sbus_dev *first_sdev)
  139. {
  140. struct sbus_dev *sdev;
  141. for (sdev = first_sdev; sdev; sdev = sdev->next) {
  142. if (sdev->child)
  143. sbus_fixup_all_regs(sdev->child);
  144. __fixup_regs_sdev(sdev);
  145. }
  146. }
  147. /* We preserve the "probe order" of these bus and device lists to give
  148. * the same ordering as the old code.
  149. */
  150. static void __init sbus_insert(struct sbus_bus *sbus, struct sbus_bus **root)
  151. {
  152. while (*root)
  153. root = &(*root)->next;
  154. *root = sbus;
  155. sbus->next = NULL;
  156. }
  157. static void __init sdev_insert(struct sbus_dev *sdev, struct sbus_dev **root)
  158. {
  159. while (*root)
  160. root = &(*root)->next;
  161. *root = sdev;
  162. sdev->next = NULL;
  163. }
  164. static void __init walk_children(struct device_node *dp, struct sbus_dev *parent, struct sbus_bus *sbus)
  165. {
  166. dp = dp->child;
  167. while (dp) {
  168. struct sbus_dev *sdev;
  169. sdev = kzalloc(sizeof(struct sbus_dev), GFP_ATOMIC);
  170. if (sdev) {
  171. sdev_insert(sdev, &parent->child);
  172. sdev->bus = sbus;
  173. sdev->parent = parent;
  174. sdev->ofdev.dev.archdata.iommu =
  175. sbus->ofdev.dev.archdata.iommu;
  176. sdev->ofdev.dev.archdata.stc =
  177. sbus->ofdev.dev.archdata.stc;
  178. fill_sbus_device(dp, sdev);
  179. walk_children(dp, sdev, sbus);
  180. }
  181. dp = dp->sibling;
  182. }
  183. }
  184. static void __init build_one_sbus(struct device_node *dp, int num_sbus)
  185. {
  186. struct sbus_bus *sbus;
  187. unsigned int sbus_clock;
  188. struct device_node *dev_dp;
  189. sbus = kzalloc(sizeof(struct sbus_bus), GFP_ATOMIC);
  190. if (!sbus)
  191. return;
  192. sbus_insert(sbus, &sbus_root);
  193. sbus->prom_node = dp->node;
  194. sbus_setup_iommu(sbus, dp);
  195. printk("sbus%d: ", num_sbus);
  196. sbus_clock = of_getintprop_default(dp, "clock-frequency",
  197. (25*1000*1000));
  198. sbus->clock_freq = sbus_clock;
  199. printk("Clock %d.%d MHz\n", (int) ((sbus_clock/1000)/1000),
  200. (int) (((sbus_clock/1000)%1000 != 0) ?
  201. (((sbus_clock/1000)%1000) + 1000) : 0));
  202. strcpy(sbus->prom_name, dp->name);
  203. sbus_setup_arch_props(sbus, dp);
  204. sbus_bus_ranges_init(dp, sbus);
  205. sbus->ofdev.node = dp;
  206. sbus->ofdev.dev.parent = NULL;
  207. sbus->ofdev.dev.bus = &sbus_bus_type;
  208. dev_set_name(&sbus->ofdev.dev, "sbus%d", num_sbus);
  209. if (of_device_register(&sbus->ofdev) != 0)
  210. printk(KERN_DEBUG "sbus: device registration error for %s!\n",
  211. dev_name(&sbus->ofdev.dev));
  212. dev_dp = dp->child;
  213. while (dev_dp) {
  214. struct sbus_dev *sdev;
  215. sdev = kzalloc(sizeof(struct sbus_dev), GFP_ATOMIC);
  216. if (sdev) {
  217. sdev_insert(sdev, &sbus->devices);
  218. sdev->bus = sbus;
  219. sdev->parent = NULL;
  220. sdev->ofdev.dev.archdata.iommu =
  221. sbus->ofdev.dev.archdata.iommu;
  222. sdev->ofdev.dev.archdata.stc =
  223. sbus->ofdev.dev.archdata.stc;
  224. fill_sbus_device(dev_dp, sdev);
  225. walk_children(dev_dp, sdev, sbus);
  226. }
  227. dev_dp = dev_dp->sibling;
  228. }
  229. sbus_fixup_all_regs(sbus->devices);
  230. dvma_init(sbus);
  231. }
  232. static int __init sbus_init(void)
  233. {
  234. struct device_node *dp;
  235. const char *sbus_name = "sbus";
  236. int num_sbus = 0;
  237. if (sbus_arch_preinit())
  238. return 0;
  239. if (sparc_cpu_model == sun4d)
  240. sbus_name = "sbi";
  241. for_each_node_by_name(dp, sbus_name) {
  242. build_one_sbus(dp, num_sbus);
  243. num_sbus++;
  244. }
  245. sbus_arch_postinit();
  246. return 0;
  247. }
  248. subsys_initcall(sbus_init);