sbus.c 7.3 KB

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