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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: pci.c,v 1.36 2001/10/06 00:38:25 davem Exp $
  2.  * pci.c: UltraSparc PCI controller support.
  3.  *
  4.  * Copyright (C) 1997, 1998, 1999 David S. Miller (davem@redhat.com)
  5.  * Copyright (C) 1998, 1999 Eddie C. Dost   (ecd@skynet.be)
  6.  * Copyright (C) 1999 Jakub Jelinek   (jj@ultra.linux.cz)
  7.  */
  8. #include <linux/config.h>
  9. #include <linux/kernel.h>
  10. #include <linux/string.h>
  11. #include <linux/sched.h>
  12. #include <linux/capability.h>
  13. #include <linux/errno.h>
  14. #include <linux/smp_lock.h>
  15. #include <linux/init.h>
  16. #include <asm/uaccess.h>
  17. #include <asm/pbm.h>
  18. #include <asm/irq.h>
  19. #include <asm/ebus.h>
  20. #include <asm/isa.h>
  21. unsigned long pci_memspace_mask = 0xffffffffUL;
  22. #ifndef CONFIG_PCI
  23. /* A "nop" PCI implementation. */
  24. asmlinkage int sys_pciconfig_read(unsigned long bus, unsigned long dfn,
  25.   unsigned long off, unsigned long len,
  26.   unsigned char *buf)
  27. {
  28. return 0;
  29. }
  30. asmlinkage int sys_pciconfig_write(unsigned long bus, unsigned long dfn,
  31.    unsigned long off, unsigned long len,
  32.    unsigned char *buf)
  33. {
  34. return 0;
  35. }
  36. #else
  37. /* List of all PCI controllers found in the system. */
  38. spinlock_t pci_controller_lock = SPIN_LOCK_UNLOCKED;
  39. struct pci_controller_info *pci_controller_root = NULL;
  40. /* Each PCI controller found gets a unique index. */
  41. int pci_num_controllers = 0;
  42. /* Given an 8-bit PCI bus number, this yields the
  43.  * controlling PBM module info.
  44.  *
  45.  * Some explanation is in order here.  The Linux APIs for
  46.  * the PCI subsystem require that the configuration space
  47.  * types are enough to signify PCI configuration space
  48.  * accesses correctly.  This gives us 8-bits for the bus
  49.  * number, however we have multiple PCI controllers on
  50.  * UltraSparc systems.
  51.  *
  52.  * So what we do is give the PCI busses under each controller
  53.  * a unique portion of the 8-bit PCI bus number space.
  54.  * Therefore one can obtain the controller from the bus
  55.  * number.  For example, say PSYCHO PBM-A a subordinate bus
  56.  * space of 0 to 4, and PBM-B has a space of 0 to 2.  PBM-A
  57.  * will use 0 to 4, and PBM-B will use 5 to 7.
  58.  */
  59. struct pci_pbm_info *pci_bus2pbm[256];
  60. unsigned char pci_highest_busnum = 0;
  61. /* At boot time the user can give the kernel a command
  62.  * line option which controls if and how PCI devices
  63.  * are reordered at PCI bus probing time.
  64.  */
  65. int pci_device_reorder = 0;
  66. spinlock_t pci_poke_lock = SPIN_LOCK_UNLOCKED;
  67. volatile int pci_poke_in_progress;
  68. volatile int pci_poke_cpu = -1;
  69. volatile int pci_poke_faulted;
  70. /* Probe for all PCI controllers in the system. */
  71. extern void sabre_init(int, char *);
  72. extern void psycho_init(int, char *);
  73. extern void schizo_init(int, char *);
  74. static struct {
  75. char *model_name;
  76. void (*init)(int, char *);
  77. } pci_controller_table[] = {
  78. { "SUNW,sabre", sabre_init },
  79. { "pci108e,a000", sabre_init },
  80. { "pci108e,a001", sabre_init },
  81. { "SUNW,psycho", psycho_init },
  82. { "pci108e,8000", psycho_init },
  83. { "SUNW,schizo", schizo_init },
  84. { "pci108e,8001", schizo_init }
  85. };
  86. #define PCI_NUM_CONTROLLER_TYPES (sizeof(pci_controller_table) / 
  87.   sizeof(pci_controller_table[0]))
  88. static void pci_controller_init(char *model_name, int namelen, int node)
  89. {
  90. int i;
  91. for (i = 0; i < PCI_NUM_CONTROLLER_TYPES; i++) {
  92. if (!strncmp(model_name,
  93.      pci_controller_table[i].model_name,
  94.      namelen)) {
  95. pci_controller_table[i].init(node, model_name);
  96. return;
  97. }
  98. }
  99. printk("PCI: Warning unknown controller, model name [%s]n",
  100.        model_name);
  101. printk("PCI: Ignoring controller...n");
  102. }
  103. /* Find each controller in the system, attach and initialize
  104.  * software state structure for each and link into the
  105.  * pci_controller_root.  Setup the controller enough such
  106.  * that bus scanning can be done.
  107.  */
  108. static void pci_controller_probe(void)
  109. {
  110. char namebuf[16];
  111. int node;
  112. printk("PCI: Probing for controllers.n");
  113. node = prom_getchild(prom_root_node);
  114. while ((node = prom_searchsiblings(node, "pci")) != 0) {
  115. int len;
  116. len = prom_getproperty(node, "model",
  117.        namebuf, sizeof(namebuf));
  118. if (len > 0)
  119. pci_controller_init(namebuf, len, node);
  120. else {
  121. len = prom_getproperty(node, "compatible",
  122.        namebuf, sizeof(namebuf));
  123. if (len > 0)
  124. pci_controller_init(namebuf, len, node);
  125. }
  126. node = prom_getsibling(node);
  127. if (!node)
  128. break;
  129. }
  130. }
  131. static void pci_scan_each_controller_bus(void)
  132. {
  133. struct pci_controller_info *p;
  134. unsigned long flags;
  135. spin_lock_irqsave(&pci_controller_lock, flags);
  136. for (p = pci_controller_root; p; p = p->next)
  137. p->scan_bus(p);
  138. spin_unlock_irqrestore(&pci_controller_lock, flags);
  139. }
  140. /* Reorder the pci_dev chain, so that onboard devices come first
  141.  * and then come the pluggable cards.
  142.  */
  143. static void __init pci_reorder_devs(void)
  144. {
  145. struct list_head *pci_onboard = &pci_devices;
  146. struct list_head *walk = pci_onboard->next;
  147. while (walk != pci_onboard) {
  148. struct pci_dev *pdev = pci_dev_g(walk);
  149. struct list_head *walk_next = walk->next;
  150. if (pdev->irq && (__irq_ino(pdev->irq) & 0x20)) {
  151. list_del(walk);
  152. list_add(walk, pci_onboard);
  153. }
  154. walk = walk_next;
  155. }
  156. }
  157. extern void rs_init(void);
  158. extern void clock_probe(void);
  159. extern void power_init(void);
  160. void __init pcibios_init(void)
  161. {
  162. pci_controller_probe();
  163. if (pci_controller_root == NULL)
  164. return;
  165. pci_scan_each_controller_bus();
  166. if (pci_device_reorder)
  167. pci_reorder_devs();
  168. isa_init();
  169. ebus_init();
  170. rs_init();
  171. clock_probe();
  172. power_init();
  173. }
  174. struct pci_fixup pcibios_fixups[] = {
  175. { 0 }
  176. };
  177. void pcibios_fixup_bus(struct pci_bus *pbus)
  178. {
  179. struct pci_pbm_info *pbm = pbus->sysdata;
  180. /* Generic PCI bus probing sets these to point at
  181.  * &io{port,mem}_resouce which is wrong for us.
  182.  */
  183. pbus->resource[0] = &pbm->io_space;
  184. pbus->resource[1] = &pbm->mem_space;
  185. }
  186. /* NOTE: This can get called before we've fixed up pdev->sysdata. */
  187. int pci_claim_resource(struct pci_dev *pdev, int resource)
  188. {
  189. struct pci_pbm_info *pbm = pci_bus2pbm[pdev->bus->number];
  190. struct resource *res = &pdev->resource[resource];
  191. struct resource *root;
  192. if (!pbm)
  193. return -EINVAL;
  194. if (res->flags & IORESOURCE_IO)
  195. root = &pbm->io_space;
  196. else
  197. root = &pbm->mem_space;
  198. pbm->parent->resource_adjust(pdev, res, root);
  199. return request_resource(root, res);
  200. }
  201. int pci_assign_resource(struct pci_dev *pdev, int resource)
  202. {
  203. struct pcidev_cookie *pcp = pdev->sysdata;
  204. struct pci_pbm_info *pbm = pcp->pbm;
  205. struct resource *res = &pdev->resource[resource];
  206. struct resource *root;
  207. unsigned long min, max, size, align;
  208. int err;
  209. if (res->flags & IORESOURCE_IO) {
  210. root = &pbm->io_space;
  211. min = root->start + 0x400UL;
  212. max = root->end;
  213. } else {
  214. root = &pbm->mem_space;
  215. min = root->start;
  216. max = min + 0x80000000UL;
  217. }
  218. size = res->end - res->start;
  219. align = size + 1;
  220. err = allocate_resource(root, res, size + 1, min, max, align, NULL, NULL);
  221. if (err < 0) {
  222. printk("PCI: Failed to allocate resource %d for %sn",
  223.        resource, pdev->name);
  224. } else {
  225. pbm->parent->base_address_update(pdev, resource);
  226. }
  227. return err;
  228. }
  229. void pcibios_update_resource(struct pci_dev *pdev, struct resource *res1,
  230.      struct resource *res2, int index)
  231. {
  232. }
  233. void pcibios_update_irq(struct pci_dev *pdev, int irq)
  234. {
  235. }
  236. void pcibios_fixup_pbus_ranges(struct pci_bus *pbus,
  237.        struct pbus_set_ranges_data *pranges)
  238. {
  239. }
  240. void pcibios_align_resource(void *data, struct resource *res, unsigned long size)
  241. {
  242. }
  243. int pcibios_enable_device(struct pci_dev *pdev)
  244. {
  245. return 0;
  246. }
  247. char * __init pcibios_setup(char *str)
  248. {
  249. if (!strcmp(str, "onboardfirst")) {
  250. pci_device_reorder = 1;
  251. return NULL;
  252. }
  253. if (!strcmp(str, "noreorder")) {
  254. pci_device_reorder = 0;
  255. return NULL;
  256. }
  257. return str;
  258. }
  259. /* Platform support for /proc/bus/pci/X/Y mmap()s. */
  260. /* If the user uses a host-bridge as the PCI device, he may use
  261.  * this to perform a raw mmap() of the I/O or MEM space behind
  262.  * that controller.
  263.  *
  264.  * This can be useful for execution of x86 PCI bios initialization code
  265.  * on a PCI card, like the xfree86 int10 stuff does.
  266.  */
  267. static int __pci_mmap_make_offset_bus(struct pci_dev *pdev, struct vm_area_struct *vma,
  268.       enum pci_mmap_state mmap_state)
  269. {
  270. struct pcidev_cookie *pcp = pdev->sysdata;
  271. struct pci_pbm_info *pbm;
  272. struct pci_controller_info *p;
  273. unsigned long space_size, user_offset, user_size;
  274. if (!pcp)
  275. return -ENXIO;
  276. pbm = pcp->pbm;
  277. if (!pbm)
  278. return -ENXIO;
  279. p = pbm->parent;
  280. if (p->pbms_same_domain) {
  281. unsigned long lowest, highest;
  282. lowest = ~0UL; highest = 0UL;
  283. if (mmap_state == pci_mmap_io) {
  284. if (p->pbm_A.io_space.flags) {
  285. lowest = p->pbm_A.io_space.start;
  286. highest = p->pbm_A.io_space.end + 1;
  287. }
  288. if (p->pbm_B.io_space.flags) {
  289. if (lowest > p->pbm_B.io_space.start)
  290. lowest = p->pbm_B.io_space.start;
  291. if (highest < p->pbm_B.io_space.end + 1)
  292. highest = p->pbm_B.io_space.end + 1;
  293. }
  294. space_size = highest - lowest;
  295. } else {
  296. if (p->pbm_A.mem_space.flags) {
  297. lowest = p->pbm_A.mem_space.start;
  298. highest = p->pbm_A.mem_space.end + 1;
  299. }
  300. if (p->pbm_B.mem_space.flags) {
  301. if (lowest > p->pbm_B.mem_space.start)
  302. lowest = p->pbm_B.mem_space.start;
  303. if (highest < p->pbm_B.mem_space.end + 1)
  304. highest = p->pbm_B.mem_space.end + 1;
  305. }
  306. space_size = highest - lowest;
  307. }
  308. } else {
  309. if (mmap_state == pci_mmap_io) {
  310. space_size = (pbm->io_space.end -
  311.       pbm->io_space.start) + 1;
  312. } else {
  313. space_size = (pbm->mem_space.end -
  314.       pbm->mem_space.start) + 1;
  315. }
  316. }
  317. /* Make sure the request is in range. */
  318. user_offset = vma->vm_pgoff << PAGE_SHIFT;
  319. user_size = vma->vm_end - vma->vm_start;
  320. if (user_offset >= space_size ||
  321.     (user_offset + user_size) > space_size)
  322. return -EINVAL;
  323. if (p->pbms_same_domain) {
  324. unsigned long lowest = ~0UL;
  325. if (mmap_state == pci_mmap_io) {
  326. if (p->pbm_A.io_space.flags)
  327. lowest = p->pbm_A.io_space.start;
  328. if (p->pbm_B.io_space.flags &&
  329.     lowest > p->pbm_B.io_space.start)
  330. lowest = p->pbm_B.io_space.start;
  331. } else {
  332. if (p->pbm_A.mem_space.flags)
  333. lowest = p->pbm_A.mem_space.start;
  334. if (p->pbm_B.mem_space.flags &&
  335.     lowest > p->pbm_B.mem_space.start)
  336. lowest = p->pbm_B.mem_space.start;
  337. }
  338. vma->vm_pgoff = (lowest + user_offset) >> PAGE_SHIFT;
  339. } else {
  340. if (mmap_state == pci_mmap_io) {
  341. vma->vm_pgoff = (pbm->io_space.start +
  342.  user_offset) >> PAGE_SHIFT;
  343. } else {
  344. vma->vm_pgoff = (pbm->mem_space.start +
  345.  user_offset) >> PAGE_SHIFT;
  346. }
  347. }
  348. return 0;
  349. }
  350. /* Adjust vm_pgoff of VMA such that it is the physical page offset corresponding
  351.  * to the 32-bit pci bus offset for DEV requested by the user.
  352.  *
  353.  * Basically, the user finds the base address for his device which he wishes
  354.  * to mmap.  They read the 32-bit value from the config space base register,
  355.  * add whatever PAGE_SIZE multiple offset they wish, and feed this into the
  356.  * offset parameter of mmap on /proc/bus/pci/XXX for that device.
  357.  *
  358.  * Returns negative error code on failure, zero on success.
  359.  */
  360. static int __pci_mmap_make_offset(struct pci_dev *dev, struct vm_area_struct *vma,
  361.   enum pci_mmap_state mmap_state)
  362. {
  363. unsigned long user_offset = vma->vm_pgoff << PAGE_SHIFT;
  364. unsigned long user32 = user_offset & 0xffffffffUL;
  365. unsigned long largest_base, this_base, addr32;
  366. int i;
  367. if ((dev->class >> 8) == PCI_CLASS_BRIDGE_HOST)
  368. return __pci_mmap_make_offset_bus(dev, vma, mmap_state);
  369. /* Figure out which base address this is for. */
  370. largest_base = 0UL;
  371. for (i = 0; i <= PCI_ROM_RESOURCE; i++) {
  372. struct resource *rp = &dev->resource[i];
  373. /* Active? */
  374. if (!rp->flags)
  375. continue;
  376. /* Same type? */
  377. if (i == PCI_ROM_RESOURCE) {
  378. if (mmap_state != pci_mmap_mem)
  379. continue;
  380. } else {
  381. if ((mmap_state == pci_mmap_io &&
  382.      (rp->flags & IORESOURCE_IO) == 0) ||
  383.     (mmap_state == pci_mmap_mem &&
  384.      (rp->flags & IORESOURCE_MEM) == 0))
  385. continue;
  386. }
  387. this_base = rp->start;
  388. addr32 = (this_base & PAGE_MASK) & 0xffffffffUL;
  389. if (mmap_state == pci_mmap_io)
  390. addr32 &= 0xffffff;
  391. if (addr32 <= user32 && this_base > largest_base)
  392. largest_base = this_base;
  393. }
  394. if (largest_base == 0UL)
  395. return -EINVAL;
  396. /* Now construct the final physical address. */
  397. if (mmap_state == pci_mmap_io)
  398. vma->vm_pgoff = (((largest_base & ~0xffffffUL) | user32) >> PAGE_SHIFT);
  399. else
  400. vma->vm_pgoff = (((largest_base & ~0xffffffffUL) | user32) >> PAGE_SHIFT);
  401. return 0;
  402. }
  403. /* Set vm_flags of VMA, as appropriate for this architecture, for a pci device
  404.  * mapping.
  405.  */
  406. static void __pci_mmap_set_flags(struct pci_dev *dev, struct vm_area_struct *vma,
  407.     enum pci_mmap_state mmap_state)
  408. {
  409. vma->vm_flags |= (VM_SHM | VM_LOCKED);
  410. }
  411. /* Set vm_page_prot of VMA, as appropriate for this architecture, for a pci
  412.  * device mapping.
  413.  */
  414. static void __pci_mmap_set_pgprot(struct pci_dev *dev, struct vm_area_struct *vma,
  415.      enum pci_mmap_state mmap_state)
  416. {
  417. /* Our io_remap_page_range takes care of this, do nothing. */
  418. }
  419. extern int io_remap_page_range(unsigned long from, unsigned long offset,
  420.        unsigned long size, pgprot_t prot, int space);
  421. /* Perform the actual remap of the pages for a PCI device mapping, as appropriate
  422.  * for this architecture.  The region in the process to map is described by vm_start
  423.  * and vm_end members of VMA, the base physical address is found in vm_pgoff.
  424.  * The pci device structure is provided so that architectures may make mapping
  425.  * decisions on a per-device or per-bus basis.
  426.  *
  427.  * Returns a negative error code on failure, zero on success.
  428.  */
  429. int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
  430. enum pci_mmap_state mmap_state,
  431. int write_combine)
  432. {
  433. int ret;
  434. ret = __pci_mmap_make_offset(dev, vma, mmap_state);
  435. if (ret < 0)
  436. return ret;
  437. __pci_mmap_set_flags(dev, vma, mmap_state);
  438. __pci_mmap_set_pgprot(dev, vma, mmap_state);
  439. ret = io_remap_page_range(vma->vm_start,
  440.   (vma->vm_pgoff << PAGE_SHIFT |
  441.    (write_combine ? 0x1UL : 0x0UL)),
  442.   vma->vm_end - vma->vm_start, vma->vm_page_prot, 0);
  443. if (ret)
  444. return ret;
  445. vma->vm_flags |= VM_IO;
  446. return 0;
  447. }
  448. /* Return the index of the PCI controller for device PDEV. */
  449. int pci_controller_num(struct pci_dev *pdev)
  450. {
  451. struct pcidev_cookie *cookie = pdev->sysdata;
  452. int ret;
  453. if (cookie != NULL) {
  454. struct pci_pbm_info *pbm = cookie->pbm;
  455. if (pbm == NULL || pbm->parent == NULL) {
  456. ret = -ENXIO;
  457. } else {
  458. struct pci_controller_info *p = pbm->parent;
  459. ret = p->index;
  460. if (p->pbms_same_domain == 0)
  461. ret = ((ret << 1) +
  462.        ((pbm == &pbm->parent->pbm_B) ? 1 : 0));
  463. }
  464. } else {
  465. ret = -ENXIO;
  466. }
  467. return ret;
  468. }
  469. #endif /* !(CONFIG_PCI) */