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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: %F% %I% %G% %U% %#%
  3.  */
  4. /*
  5.  * Common pmac/prep/chrp pci routines. -- Cort
  6.  */
  7. #include <linux/config.h>
  8. #include <linux/kernel.h>
  9. #include <linux/pci.h>
  10. #include <linux/delay.h>
  11. #include <linux/string.h>
  12. #include <linux/init.h>
  13. #include <linux/capability.h>
  14. #include <linux/sched.h>
  15. #include <linux/errno.h>
  16. #include <linux/bootmem.h>
  17. #include <asm/processor.h>
  18. #include <asm/io.h>
  19. #include <asm/prom.h>
  20. #include <asm/sections.h>
  21. #include <asm/pci-bridge.h>
  22. #include <asm/byteorder.h>
  23. #include <asm/irq.h>
  24. #include <asm/uaccess.h>
  25. #undef DEBUG
  26. #ifdef DEBUG
  27. #define DBG(x...) printk(x)
  28. #else
  29. #define DBG(x...)
  30. #endif
  31. unsigned long isa_io_base     = 0;
  32. unsigned long isa_mem_base    = 0;
  33. unsigned long pci_dram_offset = 0;
  34. void pcibios_make_OF_bus_map(void);
  35. static void pcibios_fixup_resources(struct pci_dev* dev);
  36. static void fixup_broken_pcnet32(struct pci_dev* dev);
  37. static void fixup_rev1_53c810(struct pci_dev* dev);
  38. static void fixup_cpc710_pci64(struct pci_dev* dev);
  39. #ifdef CONFIG_ALL_PPC
  40. static void pcibios_fixup_cardbus(struct pci_dev* dev);
  41. static u8* pci_to_OF_bus_map;
  42. #endif
  43. /* By default, we don't re-assign bus numbers. We do this only on
  44.  * some pmacs
  45.  */
  46. int pci_assign_all_busses;
  47. struct pci_controller* hose_head;
  48. struct pci_controller** hose_tail = &hose_head;
  49. static int pci_bus_count;
  50. struct pci_fixup pcibios_fixups[] = {
  51. { PCI_FIXUP_HEADER, PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32 },
  52. { PCI_FIXUP_HEADER, PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, fixup_rev1_53c810 },
  53. { PCI_FIXUP_HEADER, PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CPC710_PCI64, fixup_cpc710_pci64},
  54. { PCI_FIXUP_HEADER, PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_resources },
  55. #ifdef CONFIG_ALL_PPC
  56. /* We should add per-machine fixup support in xxx_setup.c or xxx_pci.c */
  57. { PCI_FIXUP_FINAL, PCI_VENDOR_ID_TI, PCI_ANY_ID, pcibios_fixup_cardbus }, 
  58. #endif /* CONFIG_ALL_PPC */
  59.   { 0 }
  60. };
  61. static void
  62. fixup_rev1_53c810(struct pci_dev* dev)
  63. {
  64. /* rev 1 ncr53c810 chips don't set the class at all which means
  65.  * they don't get their resources remapped. Fix that here.
  66.  */
  67. if ((dev->class == PCI_CLASS_NOT_DEFINED)) {
  68. printk("NCR 53c810 rev 1 detected, setting PCI class.n");
  69. dev->class = PCI_CLASS_STORAGE_SCSI;
  70. }
  71. }
  72. static void
  73. fixup_broken_pcnet32(struct pci_dev* dev)
  74. {
  75. if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) {
  76. dev->vendor = PCI_VENDOR_ID_AMD;
  77. pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD);
  78. pci_name_device(dev);
  79. }
  80. }
  81. static void
  82. fixup_cpc710_pci64(struct pci_dev* dev)
  83. {
  84. /* Hide the PCI64 BARs from the kernel as their content doesn't
  85.  * fit well in the resource management
  86.  */
  87. dev->resource[0].start = dev->resource[0].end = 0;
  88. dev->resource[0].flags = 0;
  89. dev->resource[1].start = dev->resource[1].end = 0;
  90. dev->resource[1].flags = 0;
  91. }
  92. void
  93. pcibios_update_resource(struct pci_dev *dev, struct resource *root,
  94.      struct resource *res, int resource)
  95. {
  96. u32 new, check;
  97. int reg;
  98. struct pci_controller* hose = dev->sysdata;
  99. unsigned long io_offset;
  100. new = res->start;
  101. if (hose && res->flags & IORESOURCE_IO) {
  102. io_offset = (unsigned long)hose->io_base_virt - isa_io_base;
  103. new -= io_offset;
  104. }
  105. if (hose && res->flags & IORESOURCE_MEM)
  106. new -= hose->pci_mem_offset;
  107. new |= (res->flags & PCI_REGION_FLAG_MASK);
  108. if (resource < 6) {
  109. reg = PCI_BASE_ADDRESS_0 + 4*resource;
  110. } else if (resource == PCI_ROM_RESOURCE) {
  111. res->flags |= PCI_ROM_ADDRESS_ENABLE;
  112. reg = dev->rom_base_reg;
  113. } else {
  114. /* Somebody might have asked allocation of a non-standard resource */
  115. return;
  116. }
  117. pci_write_config_dword(dev, reg, new);
  118. pci_read_config_dword(dev, reg, &check);
  119. if ((new ^ check) & ((new & PCI_BASE_ADDRESS_SPACE_IO) ? PCI_BASE_ADDRESS_IO_MASK : PCI_BASE_ADDRESS_MEM_MASK)) {
  120. printk(KERN_ERR "PCI: Error while updating region "
  121.        "%s/%d (%08x != %08x)n", dev->slot_name, resource,
  122.        new, check);
  123. }
  124. }
  125. static void
  126. pcibios_fixup_resources(struct pci_dev *dev)
  127. {
  128. struct pci_controller* hose = (struct pci_controller *)dev->sysdata;
  129. int i;
  130. unsigned long offset;
  131. if (!hose) {
  132. printk(KERN_ERR "No hose for PCI dev %s!n", dev->slot_name);
  133. return;
  134. }
  135. for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
  136. struct resource *res = dev->resource + i;
  137. if (!res->start || !res->flags)
  138. continue;
  139. if (res->end == 0xffffffff) {
  140. DBG("PCI:%s Resource %d [%08lx-%08lx] is unassignedn",
  141.     dev->slot_name, i, res->start, res->end);
  142. res->end -= res->start;
  143. res->start = 0;
  144. continue;
  145. }
  146. offset = 0;
  147. if (res->flags & IORESOURCE_MEM) {
  148. offset = hose->pci_mem_offset;
  149. } else if (res->flags & IORESOURCE_IO) {
  150. offset = (unsigned long) hose->io_base_virt
  151. - isa_io_base;
  152. }
  153. if (offset != 0) {
  154. res->start += offset;
  155. res->end += offset;
  156. #ifdef DEBUG
  157. printk("Fixup res %d (%lx) of dev %s: %lx -> %lxn",
  158.        i, res->flags, dev->slot_name,
  159.        res->start - offset, res->start);
  160. #endif
  161. }
  162. }
  163. /* Call machine specific resource fixup */
  164. if (ppc_md.pcibios_fixup_resources)
  165. ppc_md.pcibios_fixup_resources(dev);
  166. }
  167. #ifdef CONFIG_ALL_PPC
  168. static void
  169. pcibios_fixup_cardbus(struct pci_dev* dev)
  170. {
  171. if (_machine != _MACH_Pmac)
  172. return;
  173. /*
  174.  * Fix the interrupt routing on the various cardbus bridges
  175.  * used on powerbooks
  176.  */
  177. if (dev->vendor != PCI_VENDOR_ID_TI)
  178. return;
  179. if (dev->device == PCI_DEVICE_ID_TI_1130 ||
  180.     dev->device == PCI_DEVICE_ID_TI_1131) {
  181. u8 val;
  182.      /* Enable PCI interrupt */
  183. if (pci_read_config_byte(dev, 0x91, &val) == 0)
  184. pci_write_config_byte(dev, 0x91, val | 0x30);
  185. /* Disable ISA interrupt mode */
  186. if (pci_read_config_byte(dev, 0x92, &val) == 0)
  187. pci_write_config_byte(dev, 0x92, val & ~0x06);
  188. }
  189. if (dev->device == PCI_DEVICE_ID_TI_1210 ||
  190.     dev->device == PCI_DEVICE_ID_TI_1211 ||
  191.     dev->device == PCI_DEVICE_ID_TI_1410) {
  192. u8 val;
  193. /* 0x8c == TI122X_IRQMUX, 2 says to route the INTA
  194.    signal out the MFUNC0 pin */
  195. if (pci_read_config_byte(dev, 0x8c, &val) == 0)
  196. pci_write_config_byte(dev, 0x8c, (val & ~0x0f) | 2);
  197. /* Disable ISA interrupt mode */
  198. if (pci_read_config_byte(dev, 0x92, &val) == 0)
  199. pci_write_config_byte(dev, 0x92, val & ~0x06);
  200. }
  201. }
  202. #endif /* CONFIG_ALL_PPC */
  203. /*
  204.  * We need to avoid collisions with `mirrored' VGA ports
  205.  * and other strange ISA hardware, so we always want the
  206.  * addresses to be allocated in the 0x000-0x0ff region
  207.  * modulo 0x400.
  208.  *
  209.  * Why? Because some silly external IO cards only decode
  210.  * the low 10 bits of the IO address. The 0x00-0xff region
  211.  * is reserved for motherboard devices that decode all 16
  212.  * bits, so it's ok to allocate at, say, 0x2800-0x28ff,
  213.  * but we want to try to avoid allocating at 0x2900-0x2bff
  214.  * which might have be mirrored at 0x0100-0x03ff..
  215.  */
  216. void
  217. pcibios_align_resource(void *data, struct resource *res, unsigned long size,
  218.        unsigned long align)
  219. {
  220. struct pci_dev *dev = data;
  221. if (res->flags & IORESOURCE_IO) {
  222. unsigned long start = res->start;
  223. if (size > 0x100) {
  224. printk(KERN_ERR "PCI: I/O Region %s/%d too large"
  225.        " (%ld bytes)n", dev->slot_name,
  226.        dev->resource - res, size);
  227. }
  228. if (start & 0x300) {
  229. start = (start + 0x3ff) & ~0x3ff;
  230. res->start = start;
  231. }
  232. }
  233. }
  234. /*
  235.  *  Handle resources of PCI devices.  If the world were perfect, we could
  236.  *  just allocate all the resource regions and do nothing more.  It isn't.
  237.  *  On the other hand, we cannot just re-allocate all devices, as it would
  238.  *  require us to know lots of host bridge internals.  So we attempt to
  239.  *  keep as much of the original configuration as possible, but tweak it
  240.  *  when it's found to be wrong.
  241.  *
  242.  *  Known BIOS problems we have to work around:
  243.  * - I/O or memory regions not configured
  244.  * - regions configured, but not enabled in the command register
  245.  * - bogus I/O addresses above 64K used
  246.  * - expansion ROMs left enabled (this may sound harmless, but given
  247.  *   the fact the PCI specs explicitly allow address decoders to be
  248.  *   shared between expansion ROMs and other resource regions, it's
  249.  *   at least dangerous)
  250.  *
  251.  *  Our solution:
  252.  * (1) Allocate resources for all buses behind PCI-to-PCI bridges.
  253.  *     This gives us fixed barriers on where we can allocate.
  254.  * (2) Allocate resources for all enabled devices.  If there is
  255.  *     a collision, just mark the resource as unallocated. Also
  256.  *     disable expansion ROMs during this step.
  257.  * (3) Try to allocate resources for disabled devices.  If the
  258.  *     resources were assigned correctly, everything goes well,
  259.  *     if they weren't, they won't disturb allocation of other
  260.  *     resources.
  261.  * (4) Assign new addresses to resources which were either
  262.  *     not configured at all or misconfigured.  If explicitly
  263.  *     requested by the user, configure expansion ROM address
  264.  *     as well.
  265.  */
  266. static void __init
  267. pcibios_allocate_bus_resources(struct list_head *bus_list)
  268. {
  269. struct list_head *ln;
  270. struct pci_bus *bus;
  271. int i;
  272. struct resource *res, *pr;
  273. /* Depth-First Search on bus tree */
  274. for (ln = bus_list->next; ln != bus_list; ln=ln->next) {
  275. bus = pci_bus_b(ln);
  276. for (i = 0; i < 4; ++i) {
  277. if ((res = bus->resource[i]) == NULL || !res->flags)
  278. continue;
  279. if (bus->parent == NULL)
  280. pr = (res->flags & IORESOURCE_IO)?
  281. &ioport_resource: &iomem_resource;
  282. else {
  283. pr = pci_find_parent_resource(bus->self, res);
  284. if (pr == res) {
  285. /* this happens when the generic PCI
  286.  * code (wrongly) decides that this
  287.  * bridge is transparent  -- paulus
  288.  */
  289. continue;
  290. }
  291. }
  292. if (pr && request_resource(pr, res) == 0)
  293. continue;
  294. printk(KERN_ERR "PCI: Cannot allocate resource region "
  295.        "%d of PCI bridge %dn", i, bus->number);
  296. DBG("PCI: resource is %lx..%lx (%lx), parent %pn",
  297.     res->start, res->end, res->flags, pr);
  298. }
  299. pcibios_allocate_bus_resources(&bus->children);
  300. }
  301. }
  302. static inline void alloc_resource(struct pci_dev *dev, int idx)
  303. {
  304. struct resource *pr, *r = &dev->resource[idx];
  305. DBG("PCI:%s: Resource %d: %08lx-%08lx (f=%lx)n",
  306.     dev->slot_name, idx, r->start, r->end, r->flags);
  307. pr = pci_find_parent_resource(dev, r);
  308. if (!pr || request_resource(pr, r) < 0) {
  309. printk(KERN_ERR "PCI: Cannot allocate resource region %d"
  310.        " of device %sn", idx, dev->slot_name);
  311. if (pr)
  312. DBG("PCI:  parent is %p: %08lx-%08lx (f=%lx)n",
  313.     pr, pr->start, pr->end, pr->flags);
  314. /* We'll assign a new address later */
  315. r->end -= r->start;
  316. r->start = 0;
  317. }
  318. }
  319. static void __init
  320. pcibios_allocate_resources(int pass)
  321. {
  322. struct pci_dev *dev;
  323. int idx, disabled;
  324. u16 command;
  325. struct resource *r;
  326. pci_for_each_dev(dev) {
  327. pci_read_config_word(dev, PCI_COMMAND, &command);
  328. for (idx = 0; idx < 6; idx++) {
  329. r = &dev->resource[idx];
  330. if (r->parent) /* Already allocated */
  331. continue;
  332. if (!r->start) /* Not assigned at all */
  333. continue;
  334. if (r->flags & IORESOURCE_IO)
  335. disabled = !(command & PCI_COMMAND_IO);
  336. else
  337. disabled = !(command & PCI_COMMAND_MEMORY);
  338. if (pass == disabled)
  339. alloc_resource(dev, idx);
  340. }
  341. if (pass)
  342. continue;
  343. r = &dev->resource[PCI_ROM_RESOURCE];
  344. if (r->flags & PCI_ROM_ADDRESS_ENABLE) {
  345. /* Turn the ROM off, leave the resource region, but keep it unregistered. */
  346. u32 reg;
  347. DBG("PCI: Switching off ROM of %sn", dev->slot_name);
  348. r->flags &= ~PCI_ROM_ADDRESS_ENABLE;
  349. pci_read_config_dword(dev, dev->rom_base_reg, &reg);
  350. pci_write_config_dword(dev, dev->rom_base_reg,
  351.        reg & ~PCI_ROM_ADDRESS_ENABLE);
  352. }
  353. }
  354. }
  355. static void __init
  356. pcibios_assign_resources(void)
  357. {
  358. struct pci_dev *dev;
  359. int idx;
  360. struct resource *r;
  361. pci_for_each_dev(dev) {
  362. int class = dev->class >> 8;
  363. /* Don't touch classless devices and host bridges */
  364. if (!class || class == PCI_CLASS_BRIDGE_HOST)
  365. continue;
  366. for (idx = 0; idx < 6; idx++) {
  367. r = &dev->resource[idx];
  368. /*
  369.  * We shall assign a new address to this resource,
  370.  * either because the BIOS (sic) forgot to do so
  371.  * or because we have decided the old address was
  372.  * unusable for some reason.
  373.  */
  374. if (!r->start && r->end &&
  375.     (!ppc_md.pcibios_enable_device_hook ||
  376.      !ppc_md.pcibios_enable_device_hook(dev, 1)))
  377. pci_assign_resource(dev, idx);
  378. }
  379. #if 0 /* don't assign ROMs */
  380. r = &dev->resource[PCI_ROM_RESOURCE];
  381. r->end -= r->start;
  382. r->start = 0;
  383. if (r->end)
  384. pci_assign_resource(dev, PCI_ROM_RESOURCE);
  385. #endif
  386. }
  387. }
  388. int
  389. pcibios_enable_resources(struct pci_dev *dev)
  390. {
  391. u16 cmd, old_cmd;
  392. int idx;
  393. struct resource *r;
  394. pci_read_config_word(dev, PCI_COMMAND, &cmd);
  395. old_cmd = cmd;
  396. for(idx=0; idx<6; idx++) {
  397. r = &dev->resource[idx];
  398. if (!r->start && r->end) {
  399. printk(KERN_ERR "PCI: Device %s not available because of resource collisionsn", dev->slot_name);
  400. return -EINVAL;
  401. }
  402. if (r->flags & IORESOURCE_IO)
  403. cmd |= PCI_COMMAND_IO;
  404. if (r->flags & IORESOURCE_MEM)
  405. cmd |= PCI_COMMAND_MEMORY;
  406. }
  407. if (dev->resource[PCI_ROM_RESOURCE].start)
  408. cmd |= PCI_COMMAND_MEMORY;
  409. if (cmd != old_cmd) {
  410. printk("PCI: Enabling device %s (%04x -> %04x)n", dev->slot_name, old_cmd, cmd);
  411. pci_write_config_word(dev, PCI_COMMAND, cmd);
  412. }
  413. return 0;
  414. }
  415. static int next_controller_index;
  416. struct pci_controller * __init
  417. pcibios_alloc_controller(void)
  418. {
  419. struct pci_controller *hose;
  420. hose = (struct pci_controller *)alloc_bootmem(sizeof(*hose));
  421. memset(hose, 0, sizeof(struct pci_controller));
  422. *hose_tail = hose;
  423. hose_tail = &hose->next;
  424. hose->index = next_controller_index++;
  425. return hose;
  426. }
  427. #ifdef CONFIG_ALL_PPC
  428. /*
  429.  * Functions below are used on OpenFirmware machines.
  430.  */
  431. static void __openfirmware
  432. make_one_node_map(struct device_node* node, u8 pci_bus)
  433. {
  434. int *bus_range;
  435. int len;
  436. if (pci_bus >= pci_bus_count)
  437. return;
  438. bus_range = (int *) get_property(node, "bus-range", &len);
  439. if (bus_range == NULL || len < 2 * sizeof(int)) {
  440. printk(KERN_WARNING "Can't get bus-range for %sn",
  441.        node->full_name);
  442. return;
  443. }
  444. pci_to_OF_bus_map[pci_bus] = bus_range[0];
  445. for (node=node->child; node != 0;node = node->sibling) {
  446. struct pci_dev* dev;
  447. unsigned int *class_code, *reg;
  448. class_code = (unsigned int *) get_property(node, "class-code", 0);
  449. if (!class_code || ((*class_code >> 8) != PCI_CLASS_BRIDGE_PCI &&
  450. (*class_code >> 8) != PCI_CLASS_BRIDGE_CARDBUS))
  451. continue;
  452. reg = (unsigned int *)get_property(node, "reg", 0);
  453. if (!reg)
  454. continue;
  455. dev = pci_find_slot(pci_bus, ((reg[0] >> 8) & 0xff));
  456. if (!dev || !dev->subordinate)
  457. continue;
  458. make_one_node_map(node, dev->subordinate->number);
  459. }
  460. }
  461. void __openfirmware
  462. pcibios_make_OF_bus_map(void)
  463. {
  464. int i;
  465. struct pci_controller* hose;
  466. u8* of_prop_map;
  467. pci_to_OF_bus_map = (u8*)kmalloc(pci_bus_count, GFP_KERNEL);
  468. if (!pci_to_OF_bus_map) {
  469. printk(KERN_ERR "Can't allocate OF bus map !n");
  470. return;
  471. }
  472. /* We fill the bus map with invalid values, that helps
  473.  * debugging.
  474.  */
  475. for (i=0; i<pci_bus_count; i++)
  476. pci_to_OF_bus_map[i] = 0xff;
  477. /* For each hose, we begin searching bridges */
  478. for(hose=hose_head; hose; hose=hose->next) {
  479. struct device_node* node;
  480. node = (struct device_node *)hose->arch_data;
  481. if (!node)
  482. continue;
  483. make_one_node_map(node, hose->first_busno);
  484. }
  485. of_prop_map = get_property(find_path_device("/"), "pci-OF-bus-map", 0);
  486. if (of_prop_map)
  487. memcpy(of_prop_map, pci_to_OF_bus_map, pci_bus_count);
  488. #ifdef DEBUG
  489. printk("PCI->OF bus map:n");
  490. for (i=0; i<pci_bus_count; i++) {
  491. if (pci_to_OF_bus_map[i] == 0xff)
  492. continue;
  493. printk("%d -> %dn", i, pci_to_OF_bus_map[i]);
  494. }
  495. #endif
  496. }
  497. typedef int (*pci_OF_scan_iterator)(struct device_node* node, void* data);
  498. static struct device_node* __openfirmware
  499. scan_OF_pci_childs(struct device_node* node, pci_OF_scan_iterator filter, void* data)
  500. {
  501. struct device_node* sub_node;
  502. for (; node != 0;node = node->sibling) {
  503. unsigned int *class_code;
  504. if (filter(node, data))
  505. return node;
  506. /* For PCI<->PCI bridges or CardBus bridges, we go down
  507.  * Note: some OFs create a parent node "multifunc-device" as
  508.  * a fake root for all functions of a multi-function device,
  509.  * we go down them as well.
  510.  */
  511. class_code = (unsigned int *) get_property(node, "class-code", 0);
  512. if ((!class_code || ((*class_code >> 8) != PCI_CLASS_BRIDGE_PCI &&
  513. (*class_code >> 8) != PCI_CLASS_BRIDGE_CARDBUS)) &&
  514. strcmp(node->name, "multifunc-device"))
  515. continue;
  516. sub_node = scan_OF_pci_childs(node->child, filter, data);
  517. if (sub_node)
  518. return sub_node;
  519. }
  520. return NULL;
  521. }
  522. static int
  523. scan_OF_pci_childs_iterator(struct device_node* node, void* data)
  524. {
  525. unsigned int *reg;
  526. u8* fdata = (u8*)data;
  527. reg = (unsigned int *) get_property(node, "reg", 0);
  528. if (reg && ((reg[0] >> 8) & 0xff) == fdata[1]
  529. && ((reg[0] >> 16) & 0xff) == fdata[0])
  530. return 1;
  531. return 0;
  532. }
  533. static struct device_node* __openfirmware
  534. scan_OF_childs_for_device(struct device_node* node, u8 bus, u8 dev_fn)
  535. {
  536. u8 filter_data[2] = {bus, dev_fn};
  537. return scan_OF_pci_childs(node, scan_OF_pci_childs_iterator, filter_data);
  538. }
  539. /* 
  540.  * Scans the OF tree for a device node matching a PCI device
  541.  */
  542. struct device_node*
  543. pci_device_to_OF_node(struct pci_dev *dev)
  544. {
  545. struct pci_controller *hose;
  546. struct device_node *node;
  547. int bus;
  548. if (!have_of)
  549. return NULL;
  550. /* Lookup the hose */
  551. bus = dev->bus->number;
  552. hose = pci_bus_to_hose(bus);
  553. if (!hose)
  554. return NULL;
  555. /* Check it has an OF node associated */
  556. node = (struct device_node *) hose->arch_data;
  557. if (!node)
  558. return NULL;
  559. /* Fixup bus number according to what OF think it is. */
  560. if (pci_to_OF_bus_map)
  561. bus = pci_to_OF_bus_map[bus];
  562. if (bus == 0xff)
  563. return NULL;
  564. /* Now, lookup childs of the hose */
  565. return scan_OF_childs_for_device(node->child, bus, dev->devfn);
  566. }
  567. /* This routine is meant to be used early during boot, when the
  568.  * PCI bus numbers have not yet been assigned, and you need to
  569.  * issue PCI config cycles to an OF device.
  570.  * It could also be used to "fix" RTAS config cycles if you want
  571.  * to set pci_assign_all_busses to 1 and still use RTAS for PCI
  572.  * config cycles.
  573.  */
  574. struct pci_controller*
  575. pci_find_hose_for_OF_device(struct device_node* node)
  576. {
  577. if (!have_of)
  578. return NULL;
  579. while(node) {
  580. struct pci_controller* hose;
  581. for (hose=hose_head;hose;hose=hose->next)
  582. if (hose->arch_data == node)
  583. return hose;
  584. node=node->parent;
  585. }
  586. return NULL;
  587. }
  588. static int __openfirmware
  589. find_OF_pci_device_filter(struct device_node* node, void* data)
  590. {
  591. return ((void *)node == data);
  592. }
  593. /* 
  594.  * Returns the PCI device matching a given OF node
  595.  */
  596. int
  597. pci_device_from_OF_node(struct device_node* node, u8* bus, u8* devfn)
  598. {
  599. unsigned int *reg;
  600. struct pci_controller* hose;
  601. struct pci_dev* dev;
  602. if (!have_of)
  603. return -ENODEV;
  604. /* Make sure it's really a PCI device */
  605. hose = pci_find_hose_for_OF_device(node);
  606. if (!hose || !hose->arch_data)
  607. return -ENODEV;
  608. if (!scan_OF_pci_childs(((struct device_node*)hose->arch_data)->child,
  609. find_OF_pci_device_filter, (void *)node))
  610. return -ENODEV;
  611. reg = (unsigned int *) get_property(node, "reg", 0);
  612. if (!reg)
  613. return -ENODEV;
  614. *bus = (reg[0] >> 16) & 0xff;
  615. *devfn = ((reg[0] >> 8) & 0xff);
  616. /* Ok, here we need some tweak. If we have already renumbered
  617.  * all busses, we can't rely on the OF bus number any more.
  618.  * the pci_to_OF_bus_map is not enough as several PCI busses
  619.  * may match the same OF bus number.
  620.  */
  621. if (!pci_to_OF_bus_map)
  622. return 0;
  623. pci_for_each_dev(dev) {
  624. if (pci_to_OF_bus_map[dev->bus->number] != *bus)
  625. continue;
  626. if (dev->devfn != *devfn)
  627. continue;
  628. *bus = dev->bus->number;
  629. return 0;
  630. }
  631. return -ENODEV;
  632. }
  633. void __init
  634. pci_process_bridge_OF_ranges(struct pci_controller *hose,
  635.    struct device_node *dev, int primary)
  636. {
  637. unsigned int *ranges, *prev;
  638. int rlen = 0;
  639. int memno = 0;
  640. struct resource *res;
  641. int np, na = prom_n_addr_cells(dev);
  642. np = na + 5;
  643. /* First we try to merge ranges to fix a problem with some pmacs
  644.  * that can have more than 3 ranges, fortunately using contiguous
  645.  * addresses -- BenH
  646.  */
  647. ranges = (unsigned int *) get_property(dev, "ranges", &rlen);
  648. prev = NULL;
  649. while ((rlen -= np * sizeof(unsigned int)) >= 0) {
  650. if (prev) {
  651. if (prev[0] == ranges[0] && prev[1] == ranges[1] &&
  652. (prev[2] + prev[na+4]) == ranges[2] &&
  653. (prev[na+2] + prev[na+4]) == ranges[na+2]) {
  654. prev[na+4] += ranges[na+4];
  655. ranges[0] = 0;
  656. ranges += np;
  657. continue;
  658. }
  659. }
  660. prev = ranges;
  661. ranges += np;
  662. }
  663. /*
  664.  * The ranges property is laid out as an array of elements,
  665.  * each of which comprises:
  666.  *   cells 0 - 2: a PCI address
  667.  *   cells 3 or 3+4: a CPU physical address
  668.  * (size depending on dev->n_addr_cells)
  669.  *   cells 4+5 or 5+6: the size of the range
  670.  */
  671. rlen = 0;
  672. hose->io_base_phys = 0;
  673. ranges = (unsigned int *) get_property(dev, "ranges", &rlen);
  674. while ((rlen -= np * sizeof(unsigned int)) >= 0) {
  675. res = NULL;
  676. switch (ranges[0] >> 24) {
  677. case 1: /* I/O space */
  678. if (ranges[2] != 0)
  679. break;
  680. hose->io_base_phys = ranges[na+2];
  681. hose->io_base_virt = ioremap(ranges[na+2], ranges[na+4]);
  682. if (primary)
  683. isa_io_base = (unsigned long) hose->io_base_virt;
  684. res = &hose->io_resource;
  685. res->flags = IORESOURCE_IO;
  686. res->start = ranges[2];
  687. break;
  688. case 2: /* memory space */
  689. memno = 0;
  690. if (ranges[1] == 0 && ranges[2] == 0
  691.     && ranges[na+4] <= (16 << 20)) {
  692. /* 1st 16MB, i.e. ISA memory area */
  693. if (primary)
  694. isa_mem_base = ranges[na+2];
  695. memno = 1;
  696. }
  697. while (memno < 3 && hose->mem_resources[memno].flags)
  698. ++memno;
  699. if (memno == 0)
  700. hose->pci_mem_offset = ranges[na+2] - ranges[2];
  701. if (memno < 3) {
  702. res = &hose->mem_resources[memno];
  703. res->flags = IORESOURCE_MEM;
  704. res->start = ranges[na+2];
  705. }
  706. break;
  707. }
  708. if (res != NULL) {
  709. res->name = dev->full_name;
  710. res->end = res->start + ranges[na+4] - 1;
  711. res->parent = NULL;
  712. res->sibling = NULL;
  713. res->child = NULL;
  714. }
  715. ranges += np;
  716. }
  717. }
  718. /* We create the "pci-OF-bus-map" property now so it appears in the
  719.  * /proc device tree
  720.  */
  721. void __init
  722. pci_create_OF_bus_map(void)
  723. {
  724. struct property* of_prop;
  725. of_prop = (struct property*) alloc_bootmem(sizeof(struct property) + 256);
  726. if (of_prop && find_path_device("/")) {
  727. memset(of_prop, -1, sizeof(struct property) + 256);
  728. of_prop->name = "pci-OF-bus-map";
  729. of_prop->length = 256;
  730. of_prop->value = (unsigned char *)&of_prop[1];
  731. prom_add_property(find_path_device("/"), of_prop);
  732. }
  733. }
  734. #endif /* CONFIG_ALL_PPC */
  735. /*
  736.  * This set of routines checks for PCI<->PCI bridges that have closed
  737.  * IO resources and have child devices. It tries to re-open an IO
  738.  * window on them. 
  739.  * 
  740.  * This is a _temporary_ fix to workaround a problem with Apple's OF
  741.  * closing IO windows on P2P bridges when the OF drivers of cards
  742.  * below this bridge don't claim any IO range (typically ATI or
  743.  * Adaptec).
  744.  * 
  745.  * A more complete fix would be to use drivers/pci/setup-bus.c, which
  746.  * involves a working pcibios_fixup_pbus_ranges(), some more care about
  747.  * ordering when creating the host bus resources, and maybe a few more
  748.  * minor tweaks
  749.  */
  750. /* Initialize bridges with base/limit values we have collected */
  751. static void __init
  752. do_update_p2p_io_resource(struct pci_bus *bus, int enable_vga)
  753. {
  754. struct pci_dev *bridge = bus->self;
  755. struct pci_controller* hose = (struct pci_controller *)bridge->sysdata;
  756. u32 l;
  757. u16 w;
  758. struct resource res;
  759.   res = *(bus->resource[0]);
  760. DBG("Remapping Bus %d, bridge: %sn", bus->number, bridge->name);
  761. res.start -= ((unsigned long) hose->io_base_virt - isa_io_base);
  762. res.end -= ((unsigned long) hose->io_base_virt - isa_io_base);
  763. DBG("  IO window: %08lx-%08lxn", res.start, res.end);
  764. /* Set up the top and bottom of the PCI I/O segment for this bus. */
  765. pci_read_config_dword(bridge, PCI_IO_BASE, &l);
  766. l &= 0xffff000f;
  767. l |= (res.start >> 8) & 0x00f0;
  768. l |= res.end & 0xf000;
  769. pci_write_config_dword(bridge, PCI_IO_BASE, l);
  770. if ((l & PCI_IO_RANGE_TYPE_MASK) == PCI_IO_RANGE_TYPE_32) {
  771. l = (res.start >> 16) | (res.end & 0xffff0000);
  772. pci_write_config_dword(bridge, PCI_IO_BASE_UPPER16, l);
  773. }
  774. pci_read_config_word(bridge, PCI_COMMAND, &w);
  775. w |= PCI_COMMAND_IO;
  776. pci_write_config_word(bridge, PCI_COMMAND, w);
  777. #if 0 /* Enabling this causes XFree 4.2.0 to hang during PCI probe */
  778. if (enable_vga) {
  779. pci_read_config_word(bridge, PCI_BRIDGE_CONTROL, &w);
  780. w |= PCI_BRIDGE_CTL_VGA;
  781. pci_write_config_word(bridge, PCI_BRIDGE_CONTROL, w);
  782. }
  783. #endif
  784. }
  785. /* This function is pretty basic and actually quite broken for the
  786.  * general case, it's enough for us right now though. It's supposed
  787.  * to tell us if we need to open an IO range at all or not and what
  788.  * size.
  789.  */
  790. static int __init
  791. check_for_io_childs(struct pci_bus *bus, struct resource* res, int *found_vga)
  792. {
  793. struct list_head *ln;
  794. int i;
  795. int rc = 0;
  796. #define push_end(res, size) do { unsigned long __sz = (size) ; 
  797. res->end = ((res->end + __sz) / (__sz + 1)) * (__sz + 1) + __sz; 
  798.     } while (0)
  799. for (ln=bus->devices.next; ln != &bus->devices; ln=ln->next) {
  800. struct pci_dev *dev = pci_dev_b(ln);
  801. u16 class = dev->class >> 8;
  802. if (class == PCI_CLASS_DISPLAY_VGA || class == PCI_CLASS_NOT_DEFINED_VGA)
  803. *found_vga = 1;
  804. if (class >> 8 == PCI_BASE_CLASS_BRIDGE && dev->subordinate)
  805. rc |= check_for_io_childs(dev->subordinate, res, found_vga);
  806. if (class == PCI_CLASS_BRIDGE_CARDBUS)
  807. push_end(res, 0xfff);
  808. for (i=0; i<PCI_NUM_RESOURCES; i++) {
  809. struct resource *r;
  810. unsigned long r_size;
  811. if (dev->class >> 8 == PCI_CLASS_BRIDGE_PCI && i >= PCI_BRIDGE_RESOURCES)
  812. continue;
  813. r = &dev->resource[i];
  814. r_size = r->end - r->start;
  815. if (r_size < 0xfff)
  816. r_size = 0xfff;
  817. if (r->flags & IORESOURCE_IO && (r_size) != 0) {
  818. rc = 1;
  819. push_end(res, r_size);
  820. }
  821. }
  822. }
  823. return rc;
  824. }
  825. /* Here we scan all P2P bridges of a given level that have a closed
  826.  * IO window. Note that the test for the presence of a VGA card should
  827.  * be improved to take into account already configured P2P bridges,
  828.  * currently, we don't see them and might end up configuring 2 bridges
  829.  * with VGA pass through enabled
  830.  */
  831. static void __init
  832. do_fixup_p2p_level(struct pci_bus *bus)
  833. {
  834. struct list_head *ln;
  835. int i;
  836. int has_vga = 0;
  837. for (ln=bus->children.next; ln != &bus->children; ln=ln->next) {
  838. struct pci_bus *b = pci_bus_b(ln);
  839. struct pci_dev *d = b->self;
  840. struct pci_controller* hose = (struct pci_controller *)d->sysdata;
  841. struct resource *res = b->resource[0];
  842. unsigned long max;
  843. int found_vga = 0;
  844. res->end = 0;
  845. res->start = 0x1000;
  846. if (!list_empty(&b->devices) && res && res->flags == 0 && res != bus->resource[0] &&
  847.     (d->class >> 8) == PCI_CLASS_BRIDGE_PCI &&
  848.     check_for_io_childs(b, res, &found_vga)) {
  849. u8 io_base_lo;
  850. printk(KERN_INFO "Fixing up IO bus %sn", b->name);
  851. if (found_vga) {
  852. if (has_vga) {
  853. printk(KERN_WARNING "Skipping VGA, already active on bus segmentn");
  854. found_vga = 0;
  855. } else
  856. has_vga = 1;
  857. }
  858. pci_read_config_byte(d, PCI_IO_BASE, &io_base_lo);
  859. if ((io_base_lo & PCI_IO_RANGE_TYPE_MASK) == PCI_IO_RANGE_TYPE_32)
  860. max = ((unsigned long) hose->io_base_virt - isa_io_base) + 0xffffffff;
  861. else
  862. max = ((unsigned long) hose->io_base_virt - isa_io_base) + 0xffff;
  863. res->flags = IORESOURCE_IO;
  864. res->name = b->name;
  865. /* Find a resource in the parent where we can allocate */
  866. for (i = 0 ; i < 4; i++) {
  867. struct resource *r = bus->resource[i];
  868. if (!r)
  869. continue;
  870. if ((r->flags & IORESOURCE_IO) == 0)
  871. continue;
  872. DBG("Trying to allocate from %08lx, size %08lx from parent res %d: %08lx -> %08lxn",
  873. res->start, res->end, i, r->start, r->end);
  874. if (allocate_resource(r, res, res->end + 1, res->start, max, res->end + 1, NULL, NULL) < 0) {
  875. DBG("Failed !n");
  876. continue;
  877. }
  878. do_update_p2p_io_resource(b, found_vga);
  879. break;
  880. }
  881. }
  882. do_fixup_p2p_level(b);
  883. }
  884. }
  885. static void
  886. pcibios_fixup_p2p_bridges(void)
  887. {
  888. struct list_head *ln;
  889. for(ln=pci_root_buses.next; ln != &pci_root_buses; ln=ln->next) {
  890. struct pci_bus *b = pci_bus_b(ln);
  891. do_fixup_p2p_level(b);
  892. }
  893. }
  894. void __init
  895. pcibios_init(void)
  896. {
  897. struct pci_controller *hose;
  898. struct pci_bus *bus;
  899. int next_busno, bus_offset;
  900. printk(KERN_INFO "PCI: Probing PCI hardwaren");
  901. /* There is a problem with bus renumbering currently. If
  902.  * you have 2 sibling pci<->pci bridges, and during PCI
  903.  * probe, the first one gets assigned a new number equal
  904.  * to the old number of the second one, you'll end up
  905.  * probing that branch with 2 bridges racing on the bus
  906.  * numbers.
  907.  * I work around this on pmac by adding a large offset
  908.  * between host bridges, though a better long term solution
  909.  * will have to be found in the generic code. --BenH
  910.  */
  911. #ifdef CONFIG_ALL_PPC
  912. if (machine_is_compatible("MacRISC"))
  913. bus_offset = 0x10;
  914. else
  915. #endif
  916. bus_offset = 1;
  917. /* Scan all of the recorded PCI controllers.  */
  918. for (next_busno = 0, hose = hose_head; hose; hose = hose->next) {
  919. if (pci_assign_all_busses)
  920. hose->first_busno = next_busno;
  921. hose->last_busno = 0xff;
  922. bus = pci_scan_bus(hose->first_busno, hose->ops, hose);
  923. hose->last_busno = bus->subordinate;
  924. if (pci_assign_all_busses || next_busno <= hose->last_busno)
  925. next_busno = hose->last_busno + bus_offset;
  926. }
  927. pci_bus_count = next_busno;
  928. /* OpenFirmware based machines need a map of OF bus
  929.  * numbers vs. kernel bus numbers since we may have to
  930.  * remap them.
  931.  */
  932. if (pci_assign_all_busses && have_of)
  933. pcibios_make_OF_bus_map();
  934. /* Do machine dependent PCI interrupt routing */
  935. if (ppc_md.pci_swizzle && ppc_md.pci_map_irq)
  936. pci_fixup_irqs(ppc_md.pci_swizzle, ppc_md.pci_map_irq);
  937. /* Call machine dependant fixup */
  938. if (ppc_md.pcibios_fixup)
  939. ppc_md.pcibios_fixup();
  940. /* Allocate and assign resources */
  941. pcibios_allocate_bus_resources(&pci_root_buses);
  942. pcibios_allocate_resources(0);
  943. pcibios_allocate_resources(1);
  944. pcibios_fixup_p2p_bridges();
  945. pcibios_assign_resources();
  946. /* Call machine dependent post-init code */
  947. if (ppc_md.pcibios_after_init)
  948. ppc_md.pcibios_after_init();
  949. }
  950. unsigned char __init
  951. common_swizzle(struct pci_dev *dev, unsigned char *pinp)
  952. {
  953. struct pci_controller *hose = dev->sysdata;
  954. if (dev->bus->number != hose->first_busno) {
  955. u8 pin = *pinp;
  956. do {
  957. pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn));
  958. /* Move up the chain of bridges. */
  959. dev = dev->bus->self;
  960. } while (dev->bus->self);
  961. *pinp = pin;
  962. /* The slot is the idsel of the last bridge. */
  963. }
  964. return PCI_SLOT(dev->devfn);
  965. }
  966. void __init
  967. pcibios_fixup_pbus_ranges(struct pci_bus * bus, struct pbus_set_ranges_data * ranges)
  968. {
  969. ranges->io_start -= bus->resource[0]->start;
  970. ranges->io_end -= bus->resource[0]->start;
  971. ranges->mem_start -= bus->resource[1]->start;
  972. ranges->mem_end -= bus->resource[1]->start;
  973. }
  974. unsigned long resource_fixup(struct pci_dev * dev, struct resource * res,
  975.      unsigned long start, unsigned long size)
  976. {
  977. return start;
  978. }
  979. void __init pcibios_fixup_bus(struct pci_bus *bus)
  980. {
  981. struct pci_controller *hose = (struct pci_controller *) bus->sysdata;
  982. unsigned long io_offset;
  983. struct resource *res;
  984. int i;
  985. io_offset = (unsigned long)hose->io_base_virt - isa_io_base;
  986. if (bus->parent == NULL) {
  987. /* This is a host bridge - fill in its resources */
  988. hose->bus = bus;
  989. bus->resource[0] = res = &hose->io_resource;
  990. if (!res->flags) {
  991. if (io_offset)
  992. printk(KERN_ERR "I/O resource not set for host"
  993.        " bridge %dn", hose->index);
  994. res->start = 0;
  995. res->end = IO_SPACE_LIMIT;
  996. res->flags = IORESOURCE_IO;
  997. }
  998. res->start += io_offset;
  999. res->end += io_offset;
  1000. for (i = 0; i < 3; ++i) {
  1001. res = &hose->mem_resources[i];
  1002. if (!res->flags) {
  1003. if (i > 0)
  1004. continue;
  1005. printk(KERN_ERR "Memory resource not set for "
  1006.        "host bridge %dn", hose->index);
  1007. res->start = hose->pci_mem_offset;
  1008. res->end = ~0U;
  1009. res->flags = IORESOURCE_MEM;
  1010. }
  1011. bus->resource[i+1] = res;
  1012. }
  1013. } else {
  1014. /* This is a subordinate bridge */
  1015. pci_read_bridge_bases(bus);
  1016. for (i = 0; i < 4; ++i) {
  1017. if ((res = bus->resource[i]) == NULL)
  1018. continue;
  1019. if (!res->flags)
  1020. continue;
  1021. if (io_offset && (res->flags & IORESOURCE_IO)) {
  1022. res->start += io_offset;
  1023. res->end += io_offset;
  1024. } else if (hose->pci_mem_offset
  1025.    && (res->flags & IORESOURCE_MEM)) {
  1026. res->start += hose->pci_mem_offset;
  1027. res->end += hose->pci_mem_offset;
  1028. }
  1029. }
  1030. }
  1031. if (ppc_md.pcibios_fixup_bus)
  1032. ppc_md.pcibios_fixup_bus(bus);
  1033. }
  1034. char __init *pcibios_setup(char *str)
  1035. {
  1036. return str;
  1037. }
  1038. /* the next one is stolen from the alpha port... */
  1039. void __init
  1040. pcibios_update_irq(struct pci_dev *dev, int irq)
  1041. {
  1042. pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq);
  1043. /* XXX FIXME - update OF device tree node interrupt property */
  1044. }
  1045. int pcibios_enable_device(struct pci_dev *dev, int mask)
  1046. {
  1047. u16 cmd, old_cmd;
  1048. int idx;
  1049. struct resource *r;
  1050. if (ppc_md.pcibios_enable_device_hook)
  1051. if (ppc_md.pcibios_enable_device_hook(dev, 0))
  1052. return -EINVAL;
  1053. pci_read_config_word(dev, PCI_COMMAND, &cmd);
  1054. old_cmd = cmd;
  1055. for (idx=0; idx<6; idx++) {
  1056. if(!(mask & (1<<idx)))
  1057. continue;
  1058. r = &dev->resource[idx];
  1059. if (!r->start && r->end) {
  1060. printk(KERN_ERR "PCI: Device %s not available because of resource collisionsn", dev->slot_name);
  1061. return -EINVAL;
  1062. }
  1063. if (r->flags & IORESOURCE_IO)
  1064. cmd |= PCI_COMMAND_IO;
  1065. if (r->flags & IORESOURCE_MEM)
  1066. cmd |= PCI_COMMAND_MEMORY;
  1067. }
  1068. if (cmd != old_cmd) {
  1069. printk("PCI: Enabling device %s (%04x -> %04x)n",
  1070.        dev->slot_name, old_cmd, cmd);
  1071. pci_write_config_word(dev, PCI_COMMAND, cmd);
  1072. }
  1073. return 0;
  1074. }
  1075. struct pci_controller*
  1076. pci_bus_to_hose(int bus)
  1077. {
  1078. struct pci_controller* hose = hose_head;
  1079. for (; hose; hose = hose->next)
  1080. if (bus >= hose->first_busno && bus <= hose->last_busno)
  1081. return hose;
  1082. return NULL;
  1083. }
  1084. void*
  1085. pci_bus_io_base(unsigned int bus)
  1086. {
  1087. struct pci_controller *hose;
  1088. hose = pci_bus_to_hose(bus);
  1089. if (!hose)
  1090. return NULL;
  1091. return hose->io_base_virt;
  1092. }
  1093. unsigned long
  1094. pci_bus_io_base_phys(unsigned int bus)
  1095. {
  1096. struct pci_controller *hose;
  1097. hose = pci_bus_to_hose(bus);
  1098. if (!hose)
  1099. return 0;
  1100. return hose->io_base_phys;
  1101. }
  1102. unsigned long
  1103. pci_bus_mem_base_phys(unsigned int bus)
  1104. {
  1105. struct pci_controller *hose;
  1106. hose = pci_bus_to_hose(bus);
  1107. if (!hose)
  1108. return 0;
  1109. return hose->pci_mem_offset;
  1110. }
  1111. unsigned long
  1112. pci_resource_to_bus(struct pci_dev *pdev, struct resource *res)
  1113. {
  1114. /* Hack alert again ! See comments in chrp_pci.c
  1115.  */
  1116. struct pci_controller* hose =
  1117. (struct pci_controller *)pdev->sysdata;
  1118. if (hose && res->flags & IORESOURCE_MEM)
  1119. return res->start - hose->pci_mem_offset;
  1120. /* We may want to do something with IOs here... */
  1121. return res->start;
  1122. }
  1123. /*
  1124.  * Return the index of the PCI controller for device pdev.
  1125.  */
  1126. int pci_controller_num(struct pci_dev *dev)
  1127. {
  1128. struct pci_controller *hose = (struct pci_controller *) dev->sysdata;
  1129. return hose->index;
  1130. }
  1131. /*
  1132.  * Platform support for /proc/bus/pci/X/Y mmap()s,
  1133.  * modelled on the sparc64 implementation by Dave Miller.
  1134.  *  -- paulus.
  1135.  */
  1136. /*
  1137.  * Adjust vm_pgoff of VMA such that it is the physical page offset
  1138.  * corresponding to the 32-bit pci bus offset for DEV requested by the user.
  1139.  *
  1140.  * Basically, the user finds the base address for his device which he wishes
  1141.  * to mmap.  They read the 32-bit value from the config space base register,
  1142.  * add whatever PAGE_SIZE multiple offset they wish, and feed this into the
  1143.  * offset parameter of mmap on /proc/bus/pci/XXX for that device.
  1144.  *
  1145.  * Returns negative error code on failure, zero on success.
  1146.  */
  1147. static __inline__ int
  1148. __pci_mmap_make_offset(struct pci_dev *dev, struct vm_area_struct *vma,
  1149.        enum pci_mmap_state mmap_state)
  1150. {
  1151. struct pci_controller *hose = (struct pci_controller *) dev->sysdata;
  1152. unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
  1153. unsigned long io_offset = 0;
  1154. int i, res_bit;
  1155. if (hose == 0)
  1156. return -EINVAL; /* should never happen */
  1157. /* If memory, add on the PCI bridge address offset */
  1158. if (mmap_state == pci_mmap_mem) {
  1159. offset += hose->pci_mem_offset;
  1160. res_bit = IORESOURCE_MEM;
  1161. } else {
  1162. io_offset = (unsigned long)hose->io_base_virt - isa_io_base;
  1163. offset += io_offset;
  1164. res_bit = IORESOURCE_IO;
  1165. }
  1166. /*
  1167.  * Check that the offset requested corresponds to one of the
  1168.  * resources of the device.
  1169.  */
  1170. for (i = 0; i <= PCI_ROM_RESOURCE; i++) {
  1171. struct resource *rp = &dev->resource[i];
  1172. int flags = rp->flags;
  1173. /* treat ROM as memory (should be already) */
  1174. if (i == PCI_ROM_RESOURCE)
  1175. flags |= IORESOURCE_MEM;
  1176. /* Active and same type? */
  1177. if ((flags & res_bit) == 0)
  1178. continue;
  1179. /* In the range of this resource? */
  1180. if (offset < (rp->start & PAGE_MASK) || offset > rp->end)
  1181. continue;
  1182. /* found it! construct the final physical address */
  1183. if (mmap_state == pci_mmap_io)
  1184. offset += hose->io_base_phys - io_offset;
  1185. vma->vm_pgoff = offset >> PAGE_SHIFT;
  1186. return 0;
  1187. }
  1188. return -EINVAL;
  1189. }
  1190. /*
  1191.  * Set vm_flags of VMA, as appropriate for this architecture, for a pci device
  1192.  * mapping.
  1193.  */
  1194. static __inline__ void
  1195. __pci_mmap_set_flags(struct pci_dev *dev, struct vm_area_struct *vma,
  1196.      enum pci_mmap_state mmap_state)
  1197. {
  1198. vma->vm_flags |= VM_SHM | VM_LOCKED | VM_IO;
  1199. }
  1200. /*
  1201.  * Set vm_page_prot of VMA, as appropriate for this architecture, for a pci
  1202.  * device mapping.
  1203.  */
  1204. static __inline__ void
  1205. __pci_mmap_set_pgprot(struct pci_dev *dev, struct vm_area_struct *vma,
  1206.       enum pci_mmap_state mmap_state, int write_combine)
  1207. {
  1208. int prot = pgprot_val(vma->vm_page_prot);
  1209. /* XXX would be nice to have a way to ask for write-through */
  1210. prot |= _PAGE_NO_CACHE;
  1211. if (!write_combine)
  1212. prot |= _PAGE_GUARDED;
  1213. vma->vm_page_prot = __pgprot(prot);
  1214. }
  1215. /*
  1216.  * Perform the actual remap of the pages for a PCI device mapping, as
  1217.  * appropriate for this architecture.  The region in the process to map
  1218.  * is described by vm_start and vm_end members of VMA, the base physical
  1219.  * address is found in vm_pgoff.
  1220.  * The pci device structure is provided so that architectures may make mapping
  1221.  * decisions on a per-device or per-bus basis.
  1222.  *
  1223.  * Returns a negative error code on failure, zero on success.
  1224.  */
  1225. int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
  1226. enum pci_mmap_state mmap_state,
  1227. int write_combine)
  1228. {
  1229. int ret;
  1230. ret = __pci_mmap_make_offset(dev, vma, mmap_state);
  1231. if (ret < 0)
  1232. return ret;
  1233. __pci_mmap_set_flags(dev, vma, mmap_state);
  1234. __pci_mmap_set_pgprot(dev, vma, mmap_state, write_combine);
  1235. ret = remap_page_range(vma->vm_start, vma->vm_pgoff << PAGE_SHIFT,
  1236.        vma->vm_end - vma->vm_start, vma->vm_page_prot);
  1237. return ret;
  1238. }
  1239. /* Obsolete functions. Should be removed once the symbios driver
  1240.  * is fixed
  1241.  */
  1242. unsigned long
  1243. phys_to_bus(unsigned long pa)
  1244. {
  1245. struct pci_controller *hose;
  1246. int i;
  1247. for (hose = hose_head; hose; hose = hose->next) {
  1248. for (i = 0; i < 3; ++i) {
  1249. if (pa >= hose->mem_resources[i].start
  1250.     && pa <= hose->mem_resources[i].end) {
  1251. /*
  1252.  * XXX the hose->pci_mem_offset really
  1253.  * only applies to mem_resources[0].
  1254.  * We need a way to store an offset for
  1255.  * the others.  -- paulus
  1256.  */
  1257. if (i == 0)
  1258. pa -= hose->pci_mem_offset;
  1259. return pa;
  1260. }
  1261. }
  1262. }
  1263. /* hmmm, didn't find it */
  1264. return 0;
  1265. }
  1266. unsigned long
  1267. pci_phys_to_bus(unsigned long pa, int busnr)
  1268. {
  1269. struct pci_controller* hose = pci_bus_to_hose(busnr);
  1270. if (!hose)
  1271. return pa;
  1272. return pa - hose->pci_mem_offset;
  1273. }
  1274. unsigned long
  1275. pci_bus_to_phys(unsigned int ba, int busnr)
  1276. {
  1277. struct pci_controller* hose = pci_bus_to_hose(busnr);
  1278. if (!hose)
  1279. return ba;
  1280. return ba + hose->pci_mem_offset;
  1281. }
  1282. /* Provide information on locations of various I/O regions in physical
  1283.  * memory.  Do this on a per-card basis so that we choose the right
  1284.  * root bridge.
  1285.  * Note that the returned IO or memory base is a physical address
  1286.  */
  1287. long
  1288. sys_pciconfig_iobase(long which, unsigned long bus, unsigned long devfn)
  1289. {
  1290. struct pci_controller* hose = pci_bus_to_hose(bus);
  1291. long result = -EOPNOTSUPP;
  1292. if (!hose)
  1293. return -ENODEV;
  1294. switch (which) {
  1295. case IOBASE_BRIDGE_NUMBER:
  1296. return (long)hose->first_busno;
  1297. case IOBASE_MEMORY:
  1298. return (long)hose->pci_mem_offset;
  1299. case IOBASE_IO:
  1300. return (long)hose->io_base_phys;
  1301. case IOBASE_ISA_IO:
  1302. return (long)isa_io_base;
  1303. case IOBASE_ISA_MEM:
  1304. return (long)isa_mem_base;
  1305. }
  1306. return result;
  1307. }
  1308. void __init
  1309. pci_init_resource(struct resource *res, unsigned long start, unsigned long end,
  1310.   int flags, char *name)
  1311. {
  1312. res->start = start;
  1313. res->end = end;
  1314. res->flags = flags;
  1315. res->name = name;
  1316. res->parent = NULL;
  1317. res->sibling = NULL;
  1318. res->child = NULL;
  1319. }
  1320. /*
  1321.  * Null PCI config access functions, for the case when we can't
  1322.  * find a hose.
  1323.  */
  1324. #define NULL_PCI_OP(rw, size, type)
  1325. static int
  1326. null_##rw##_config_##size(struct pci_dev *dev, int offset, type val)
  1327. {
  1328. return PCIBIOS_DEVICE_NOT_FOUND;    
  1329. }
  1330. NULL_PCI_OP(read, byte, u8 *)
  1331. NULL_PCI_OP(read, word, u16 *)
  1332. NULL_PCI_OP(read, dword, u32 *)
  1333. NULL_PCI_OP(write, byte, u8)
  1334. NULL_PCI_OP(write, word, u16)
  1335. NULL_PCI_OP(write, dword, u32)
  1336. static struct pci_ops null_pci_ops =
  1337. {
  1338. null_read_config_byte,
  1339. null_read_config_word,
  1340. null_read_config_dword,
  1341. null_write_config_byte,
  1342. null_write_config_word,
  1343. null_write_config_dword
  1344. };
  1345. /*
  1346.  * These functions are used early on before PCI scanning is done
  1347.  * and all of the pci_dev and pci_bus structures have been created.
  1348.  */
  1349. static struct pci_dev *
  1350. fake_pci_dev(struct pci_controller *hose, int busnr, int devfn)
  1351. {
  1352. static struct pci_dev dev;
  1353. static struct pci_bus bus;
  1354. if (hose == 0) {
  1355. hose = pci_bus_to_hose(busnr);
  1356. if (hose == 0)
  1357. printk(KERN_ERR "Can't find hose for PCI bus %d!n", busnr);
  1358. }
  1359. dev.bus = &bus;
  1360. dev.sysdata = hose;
  1361. dev.devfn = devfn;
  1362. bus.number = busnr;
  1363. bus.ops = hose? hose->ops: &null_pci_ops;
  1364. return &dev;
  1365. }
  1366. #define EARLY_PCI_OP(rw, size, type)
  1367. int early_##rw##_config_##size(struct pci_controller *hose, int bus,
  1368.        int devfn, int offset, type value)
  1369. {
  1370. return pci_##rw##_config_##size(fake_pci_dev(hose, bus, devfn),
  1371. offset, value);
  1372. }
  1373. EARLY_PCI_OP(read, byte, u8 *)
  1374. EARLY_PCI_OP(read, word, u16 *)
  1375. EARLY_PCI_OP(read, dword, u32 *)
  1376. EARLY_PCI_OP(write, byte, u8)
  1377. EARLY_PCI_OP(write, word, u16)
  1378. EARLY_PCI_OP(write, dword, u32)