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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: pci.c,v 1.36.2.4 2002/02/10 15:06:48 ecd 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. /*
  202.  * Given the PCI bus a device resides on, try to
  203.  * find an acceptable resource allocation for a
  204.  * specific device resource..
  205.  */
  206. static int pci_assign_bus_resource(const struct pci_bus *bus,
  207. struct pci_dev *dev,
  208. struct resource *res,
  209. unsigned long size,
  210. unsigned long min,
  211. int resno)
  212. {
  213. unsigned int type_mask;
  214. int i;
  215. type_mask = IORESOURCE_IO | IORESOURCE_MEM;
  216. for (i = 0 ; i < 4; i++) {
  217. struct resource *r = bus->resource[i];
  218. if (!r)
  219. continue;
  220. /* type_mask must match */
  221. if ((res->flags ^ r->flags) & type_mask)
  222. continue;
  223. /* Ok, try it out.. */
  224. if (allocate_resource(r, res, size, min, -1, size, NULL, NULL) < 0)
  225. continue;
  226. /* PCI config space updated by caller.  */
  227. return 0;
  228. }
  229. return -EBUSY;
  230. }
  231. int pci_assign_resource(struct pci_dev *pdev, int resource)
  232. {
  233. struct pcidev_cookie *pcp = pdev->sysdata;
  234. struct pci_pbm_info *pbm = pcp->pbm;
  235. struct resource *res = &pdev->resource[resource];
  236. unsigned long min, size;
  237. int err;
  238. if (res->flags & IORESOURCE_IO)
  239. min = pbm->io_space.start + 0x400UL;
  240. else
  241. min = pbm->mem_space.start;
  242. size = res->end - res->start + 1;
  243. err = pci_assign_bus_resource(pdev->bus, pdev, res, size, min, resource);
  244. if (err < 0) {
  245. printk("PCI: Failed to allocate resource %d for %sn",
  246.        resource, pdev->name);
  247. } else {
  248. /* Update PCI config space. */
  249. pbm->parent->base_address_update(pdev, resource);
  250. }
  251. return err;
  252. }
  253. void pcibios_update_resource(struct pci_dev *pdev, struct resource *res1,
  254.      struct resource *res2, int index)
  255. {
  256. }
  257. void pcibios_update_irq(struct pci_dev *pdev, int irq)
  258. {
  259. }
  260. void pcibios_fixup_pbus_ranges(struct pci_bus *pbus,
  261.        struct pbus_set_ranges_data *pranges)
  262. {
  263. }
  264. void pcibios_align_resource(void *data, struct resource *res,
  265.     unsigned long size, unsigned long align)
  266. {
  267. }
  268. int pcibios_enable_device(struct pci_dev *pdev, int mask)
  269. {
  270. return 0;
  271. }
  272. char * __init pcibios_setup(char *str)
  273. {
  274. if (!strcmp(str, "onboardfirst")) {
  275. pci_device_reorder = 1;
  276. return NULL;
  277. }
  278. if (!strcmp(str, "noreorder")) {
  279. pci_device_reorder = 0;
  280. return NULL;
  281. }
  282. return str;
  283. }
  284. /* Platform support for /proc/bus/pci/X/Y mmap()s. */
  285. /* If the user uses a host-bridge as the PCI device, he may use
  286.  * this to perform a raw mmap() of the I/O or MEM space behind
  287.  * that controller.
  288.  *
  289.  * This can be useful for execution of x86 PCI bios initialization code
  290.  * on a PCI card, like the xfree86 int10 stuff does.
  291.  */
  292. static int __pci_mmap_make_offset_bus(struct pci_dev *pdev, struct vm_area_struct *vma,
  293.       enum pci_mmap_state mmap_state)
  294. {
  295. struct pcidev_cookie *pcp = pdev->sysdata;
  296. struct pci_pbm_info *pbm;
  297. struct pci_controller_info *p;
  298. unsigned long space_size, user_offset, user_size;
  299. if (!pcp)
  300. return -ENXIO;
  301. pbm = pcp->pbm;
  302. if (!pbm)
  303. return -ENXIO;
  304. p = pbm->parent;
  305. if (p->pbms_same_domain) {
  306. unsigned long lowest, highest;
  307. lowest = ~0UL; highest = 0UL;
  308. if (mmap_state == pci_mmap_io) {
  309. if (p->pbm_A.io_space.flags) {
  310. lowest = p->pbm_A.io_space.start;
  311. highest = p->pbm_A.io_space.end + 1;
  312. }
  313. if (p->pbm_B.io_space.flags) {
  314. if (lowest > p->pbm_B.io_space.start)
  315. lowest = p->pbm_B.io_space.start;
  316. if (highest < p->pbm_B.io_space.end + 1)
  317. highest = p->pbm_B.io_space.end + 1;
  318. }
  319. space_size = highest - lowest;
  320. } else {
  321. if (p->pbm_A.mem_space.flags) {
  322. lowest = p->pbm_A.mem_space.start;
  323. highest = p->pbm_A.mem_space.end + 1;
  324. }
  325. if (p->pbm_B.mem_space.flags) {
  326. if (lowest > p->pbm_B.mem_space.start)
  327. lowest = p->pbm_B.mem_space.start;
  328. if (highest < p->pbm_B.mem_space.end + 1)
  329. highest = p->pbm_B.mem_space.end + 1;
  330. }
  331. space_size = highest - lowest;
  332. }
  333. } else {
  334. if (mmap_state == pci_mmap_io) {
  335. space_size = (pbm->io_space.end -
  336.       pbm->io_space.start) + 1;
  337. } else {
  338. space_size = (pbm->mem_space.end -
  339.       pbm->mem_space.start) + 1;
  340. }
  341. }
  342. /* Make sure the request is in range. */
  343. user_offset = vma->vm_pgoff << PAGE_SHIFT;
  344. user_size = vma->vm_end - vma->vm_start;
  345. if (user_offset >= space_size ||
  346.     (user_offset + user_size) > space_size)
  347. return -EINVAL;
  348. if (p->pbms_same_domain) {
  349. unsigned long lowest = ~0UL;
  350. if (mmap_state == pci_mmap_io) {
  351. if (p->pbm_A.io_space.flags)
  352. lowest = p->pbm_A.io_space.start;
  353. if (p->pbm_B.io_space.flags &&
  354.     lowest > p->pbm_B.io_space.start)
  355. lowest = p->pbm_B.io_space.start;
  356. } else {
  357. if (p->pbm_A.mem_space.flags)
  358. lowest = p->pbm_A.mem_space.start;
  359. if (p->pbm_B.mem_space.flags &&
  360.     lowest > p->pbm_B.mem_space.start)
  361. lowest = p->pbm_B.mem_space.start;
  362. }
  363. vma->vm_pgoff = (lowest + user_offset) >> PAGE_SHIFT;
  364. } else {
  365. if (mmap_state == pci_mmap_io) {
  366. vma->vm_pgoff = (pbm->io_space.start +
  367.  user_offset) >> PAGE_SHIFT;
  368. } else {
  369. vma->vm_pgoff = (pbm->mem_space.start +
  370.  user_offset) >> PAGE_SHIFT;
  371. }
  372. }
  373. return 0;
  374. }
  375. /* Adjust vm_pgoff of VMA such that it is the physical page offset corresponding
  376.  * to the 32-bit pci bus offset for DEV requested by the user.
  377.  *
  378.  * Basically, the user finds the base address for his device which he wishes
  379.  * to mmap.  They read the 32-bit value from the config space base register,
  380.  * add whatever PAGE_SIZE multiple offset they wish, and feed this into the
  381.  * offset parameter of mmap on /proc/bus/pci/XXX for that device.
  382.  *
  383.  * Returns negative error code on failure, zero on success.
  384.  */
  385. static int __pci_mmap_make_offset(struct pci_dev *dev, struct vm_area_struct *vma,
  386.   enum pci_mmap_state mmap_state)
  387. {
  388. unsigned long user_offset = vma->vm_pgoff << PAGE_SHIFT;
  389. unsigned long user32 = user_offset & pci_memspace_mask;
  390. unsigned long largest_base, this_base, addr32;
  391. int i;
  392. if ((dev->class >> 8) == PCI_CLASS_BRIDGE_HOST)
  393. return __pci_mmap_make_offset_bus(dev, vma, mmap_state);
  394. /* Figure out which base address this is for. */
  395. largest_base = 0UL;
  396. for (i = 0; i <= PCI_ROM_RESOURCE; i++) {
  397. struct resource *rp = &dev->resource[i];
  398. /* Active? */
  399. if (!rp->flags)
  400. continue;
  401. /* Same type? */
  402. if (i == PCI_ROM_RESOURCE) {
  403. if (mmap_state != pci_mmap_mem)
  404. continue;
  405. } else {
  406. if ((mmap_state == pci_mmap_io &&
  407.      (rp->flags & IORESOURCE_IO) == 0) ||
  408.     (mmap_state == pci_mmap_mem &&
  409.      (rp->flags & IORESOURCE_MEM) == 0))
  410. continue;
  411. }
  412. this_base = rp->start;
  413. addr32 = (this_base & PAGE_MASK) & pci_memspace_mask;
  414. if (mmap_state == pci_mmap_io)
  415. addr32 &= 0xffffff;
  416. if (addr32 <= user32 && this_base > largest_base)
  417. largest_base = this_base;
  418. }
  419. if (largest_base == 0UL)
  420. return -EINVAL;
  421. /* Now construct the final physical address. */
  422. if (mmap_state == pci_mmap_io)
  423. vma->vm_pgoff = (((largest_base & ~0xffffffUL) | user32) >> PAGE_SHIFT);
  424. else
  425. vma->vm_pgoff = (((largest_base & ~(pci_memspace_mask)) | user32) >> PAGE_SHIFT);
  426. return 0;
  427. }
  428. /* Set vm_flags of VMA, as appropriate for this architecture, for a pci device
  429.  * mapping.
  430.  */
  431. static void __pci_mmap_set_flags(struct pci_dev *dev, struct vm_area_struct *vma,
  432.     enum pci_mmap_state mmap_state)
  433. {
  434. vma->vm_flags |= (VM_SHM | VM_LOCKED);
  435. }
  436. /* Set vm_page_prot of VMA, as appropriate for this architecture, for a pci
  437.  * device mapping.
  438.  */
  439. static void __pci_mmap_set_pgprot(struct pci_dev *dev, struct vm_area_struct *vma,
  440.      enum pci_mmap_state mmap_state)
  441. {
  442. /* Our io_remap_page_range takes care of this, do nothing. */
  443. }
  444. extern int io_remap_page_range(unsigned long from, unsigned long offset,
  445.        unsigned long size, pgprot_t prot, int space);
  446. /* Perform the actual remap of the pages for a PCI device mapping, as appropriate
  447.  * for this architecture.  The region in the process to map is described by vm_start
  448.  * and vm_end members of VMA, the base physical address is found in vm_pgoff.
  449.  * The pci device structure is provided so that architectures may make mapping
  450.  * decisions on a per-device or per-bus basis.
  451.  *
  452.  * Returns a negative error code on failure, zero on success.
  453.  */
  454. int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
  455. enum pci_mmap_state mmap_state,
  456. int write_combine)
  457. {
  458. int ret;
  459. ret = __pci_mmap_make_offset(dev, vma, mmap_state);
  460. if (ret < 0)
  461. return ret;
  462. __pci_mmap_set_flags(dev, vma, mmap_state);
  463. __pci_mmap_set_pgprot(dev, vma, mmap_state);
  464. ret = io_remap_page_range(vma->vm_start,
  465.   (vma->vm_pgoff << PAGE_SHIFT |
  466.    (write_combine ? 0x1UL : 0x0UL)),
  467.   vma->vm_end - vma->vm_start, vma->vm_page_prot, 0);
  468. if (ret)
  469. return ret;
  470. vma->vm_flags |= VM_IO;
  471. return 0;
  472. }
  473. /* Return the index of the PCI controller for device PDEV. */
  474. int pci_controller_num(struct pci_dev *pdev)
  475. {
  476. struct pcidev_cookie *cookie = pdev->sysdata;
  477. int ret;
  478. if (cookie != NULL) {
  479. struct pci_pbm_info *pbm = cookie->pbm;
  480. if (pbm == NULL || pbm->parent == NULL) {
  481. ret = -ENXIO;
  482. } else {
  483. struct pci_controller_info *p = pbm->parent;
  484. ret = p->index;
  485. if (p->pbms_same_domain == 0)
  486. ret = ((ret << 1) +
  487.        ((pbm == &pbm->parent->pbm_B) ? 1 : 0));
  488. }
  489. } else {
  490. ret = -ENXIO;
  491. }
  492. return ret;
  493. }
  494. #endif /* !(CONFIG_PCI) */