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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * 
  3.  *
  4.  * Port for PPC64 David Engebretsen, IBM Corp.
  5.  *   Contains common pci routines for ppc64 platform, pSeries and iSeries brands. 
  6.  * 
  7.  *      This program is free software; you can redistribute it and/or
  8.  *      modify it under the terms of the GNU General Public License
  9.  *      as published by the Free Software Foundation; either version
  10.  *      2 of the License, or (at your option) any later version.
  11.  */
  12. #include <linux/config.h>
  13. #include <linux/kernel.h>
  14. #include <linux/pci.h>
  15. #include <linux/delay.h>
  16. #include <linux/string.h>
  17. #include <linux/init.h>
  18. #include <linux/capability.h>
  19. #include <linux/sched.h>
  20. #include <linux/errno.h>
  21. #include <linux/bootmem.h>
  22. #include <asm/processor.h>
  23. #include <asm/io.h>
  24. #include <asm/prom.h>
  25. #include <asm/pci-bridge.h>
  26. #include <asm/byteorder.h>
  27. #include <asm/irq.h>
  28. #include <asm/uaccess.h>
  29. #include <asm/flight_recorder.h>
  30. #include <asm/ppcdebug.h>
  31. #include <asm/naca.h>
  32. #include <asm/pci_dma.h>
  33. #include <asm/machdep.h>
  34. #include <asm/eeh.h>
  35. #include "pci.h"
  36. /* pci_io_base -- the base address from which io bars are offsets.
  37.  * This is the lowest I/O base address (so bar values are always positive),
  38.  * and it *must* be the start of ISA space if an ISA bus exists because
  39.  * ISA drivers use hard coded offsets.  If no ISA bus exists a dummy
  40.  * page is mapped and isa_io_limit prevents access to it.
  41.  */
  42. unsigned long isa_io_base     = 0; /* NULL if no ISA bus */
  43. unsigned long pci_io_base     = 0;
  44. unsigned long isa_mem_base    = 0;
  45. unsigned long pci_dram_offset = 0;
  46. /******************************************************************
  47.  * Forward declare of prototypes
  48.  ******************************************************************/
  49. static void pcibios_fixup_resources(struct pci_dev* dev);
  50. static void fixup_broken_pcnet32(struct pci_dev* dev);
  51. static void fixup_windbond_82c105(struct pci_dev* dev);
  52. void        fixup_resources(struct pci_dev* dev);
  53. void   iSeries_pcibios_init(void);
  54. void   pSeries_pcibios_init(void);
  55. int    pci_assign_all_busses = 0;
  56. struct pci_controller* hose_head;
  57. struct pci_controller** hose_tail = &hose_head;
  58. LIST_HEAD(iSeries_Global_Device_List);
  59. /*******************************************************************
  60.  * Counters and control flags. 
  61.  *******************************************************************/
  62. long   Pci_Io_Read_Count  = 0;
  63. long   Pci_Io_Write_Count = 0;
  64. long   Pci_Cfg_Read_Count = 0;
  65. long   Pci_Cfg_Write_Count= 0;
  66. long   Pci_Error_Count    = 0;
  67. int    Pci_Retry_Max      = 7; /* Retry set to 7 times  */
  68. int    Pci_Error_Flag     = 1; /* Set Retry Error on. */
  69. int    Pci_Trace_Flag     = 0;
  70. /******************************************************************
  71.  * 
  72.  ******************************************************************/
  73. int  global_phb_number    = 0;           /* Global phb counter    */
  74. int  Pci_Large_Bus_System = 0;
  75. int  Pci_Set_IOA_Address  = 0;
  76. int  Pci_Manage_Phb_Space = 0;
  77. struct pci_controller *phbtab[PCI_MAX_PHB];
  78. static int pci_bus_count;
  79. /* Cached ISA bridge dev. */
  80. struct pci_dev *ppc64_isabridge_dev = NULL;
  81. struct pci_fixup pcibios_fixups[] = {
  82. { PCI_FIXUP_HEADER, PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32 },
  83. { PCI_FIXUP_HEADER, PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_82C105, fixup_windbond_82c105 },
  84. { PCI_FIXUP_HEADER, PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_resources },
  85.   { 0 }
  86. };
  87. static void fixup_broken_pcnet32(struct pci_dev* dev)
  88. {
  89. if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) {
  90. dev->vendor = PCI_VENDOR_ID_AMD;
  91. pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD);
  92. pci_name_device(dev);
  93. }
  94. }
  95. static void fixup_windbond_82c105(struct pci_dev* dev)
  96. {
  97. /* Assume the windbond 82c105 is the IDE controller on a
  98.  * p610.  We should probably be more careful in case
  99.  * someone tries to plug in a similar adapter.
  100.  */
  101. unsigned int reg;
  102. printk("Using INTC for W82c105 IDE controller.n");
  103. pci_read_config_dword(dev, 0x40, &reg);
  104. /* Enable LEGIRQ to use INTC instead of ISA interrupts */
  105. pci_write_config_dword(dev, 0x40, reg | (1<<11));
  106. }
  107. void pcibios_fixup_pbus_ranges(struct pci_bus *pbus,
  108. struct pbus_set_ranges_data *pranges)
  109. {
  110. }
  111. void
  112. pcibios_update_resource(struct pci_dev *dev, struct resource *root,
  113.      struct resource *res, int resource)
  114. {
  115. u32 new, check;
  116. int reg;
  117. struct pci_controller* hose = PCI_GET_PHB_PTR(dev);
  118. new = res->start;
  119. if (hose && res->flags & IORESOURCE_MEM)
  120. new -= hose->pci_mem_offset;
  121. new |= (res->flags & PCI_REGION_FLAG_MASK);
  122. if (resource < 6) {
  123. reg = PCI_BASE_ADDRESS_0 + 4*resource;
  124. } else if (resource == PCI_ROM_RESOURCE) {
  125. res->flags |= PCI_ROM_ADDRESS_ENABLE;
  126. reg = dev->rom_base_reg;
  127. } else {
  128. /* Somebody might have asked allocation of a non-standard resource */
  129. return;
  130. }
  131. pci_write_config_dword(dev, reg, new);
  132. pci_read_config_dword(dev, reg, &check);
  133. if ((new ^ check) & ((new & PCI_BASE_ADDRESS_SPACE_IO) ? PCI_BASE_ADDRESS_IO_MASK : PCI_BASE_ADDRESS_MEM_MASK)) {
  134. printk(KERN_ERR "PCI: Error while updating region "
  135.        "%s/%d (%08x != %08x)n", dev->slot_name, resource,
  136.        new, check);
  137. }
  138. }
  139. static void
  140. pcibios_fixup_resources(struct pci_dev* dev)
  141. {
  142. fixup_resources(dev);
  143. }
  144. /*
  145.  * We need to avoid collisions with `mirrored' VGA ports
  146.  * and other strange ISA hardware, so we always want the
  147.  * addresses to be allocated in the 0x000-0x0ff region
  148.  * modulo 0x400.
  149.  *
  150.  * Why? Because some silly external IO cards only decode
  151.  * the low 10 bits of the IO address. The 0x00-0xff region
  152.  * is reserved for motherboard devices that decode all 16
  153.  * bits, so it's ok to allocate at, say, 0x2800-0x28ff,
  154.  * but we want to try to avoid allocating at 0x2900-0x2bff
  155.  * which might have be mirrored at 0x0100-0x03ff..
  156.  */
  157. void
  158. pcibios_align_resource(void *data, struct resource *res, unsigned long size,
  159.        unsigned long align)
  160. {
  161. struct pci_dev *dev = data;
  162. if (res->flags & IORESOURCE_IO) {
  163. unsigned long start = res->start;
  164. if (size > 0x100) {
  165. printk(KERN_ERR "PCI: Can not align I/O Region %s %s because size %ld is too large.n",
  166.                                         dev->slot_name, res->name, size);
  167. }
  168. if (start & 0x300) {
  169. start = (start + 0x3ff) & ~0x3ff;
  170. res->start = start;
  171. }
  172. }
  173. }
  174. /*
  175.  *  Handle resources of PCI devices.  If the world were perfect, we could
  176.  *  just allocate all the resource regions and do nothing more.  It isn't.
  177.  *  On the other hand, we cannot just re-allocate all devices, as it would
  178.  *  require us to know lots of host bridge internals.  So we attempt to
  179.  *  keep as much of the original configuration as possible, but tweak it
  180.  *  when it's found to be wrong.
  181.  *
  182.  *  Known BIOS problems we have to work around:
  183.  * - I/O or memory regions not configured
  184.  * - regions configured, but not enabled in the command register
  185.  * - bogus I/O addresses above 64K used
  186.  * - expansion ROMs left enabled (this may sound harmless, but given
  187.  *   the fact the PCI specs explicitly allow address decoders to be
  188.  *   shared between expansion ROMs and other resource regions, it's
  189.  *   at least dangerous)
  190.  *
  191.  *  Our solution:
  192.  * (1) Allocate resources for all buses behind PCI-to-PCI bridges.
  193.  *     This gives us fixed barriers on where we can allocate.
  194.  * (2) Allocate resources for all enabled devices.  If there is
  195.  *     a collision, just mark the resource as unallocated. Also
  196.  *     disable expansion ROMs during this step.
  197.  * (3) Try to allocate resources for disabled devices.  If the
  198.  *     resources were assigned correctly, everything goes well,
  199.  *     if they weren't, they won't disturb allocation of other
  200.  *     resources.
  201.  * (4) Assign new addresses to resources which were either
  202.  *     not configured at all or misconfigured.  If explicitly
  203.  *     requested by the user, configure expansion ROM address
  204.  *     as well.
  205.  */
  206. static void __init
  207. pcibios_allocate_bus_resources(struct list_head *bus_list)
  208. {
  209. struct list_head *ln;
  210. struct pci_bus *bus;
  211. int i;
  212. struct resource *res, *pr;
  213. /* Depth-First Search on bus tree */
  214. for (ln=bus_list->next; ln != bus_list; ln=ln->next) {
  215. bus = pci_bus_b(ln);
  216. for (i = 0; i < 4; ++i) {
  217. if ((res = bus->resource[i]) == NULL || !res->flags)
  218. continue;
  219. if (bus->parent == NULL)
  220. pr = (res->flags & IORESOURCE_IO)?
  221. &ioport_resource: &iomem_resource;
  222. else
  223. pr = pci_find_parent_resource(bus->self, res);
  224. if (pr == res)
  225. continue; /* transparent bus or undefined */
  226. if (pr && request_resource(pr, res) == 0)
  227. continue;
  228. printk(KERN_ERR "PCI: Cannot allocate resource region "
  229.        "%d of PCI bridge %xn", i, bus->number);
  230. printk(KERN_ERR "PCI: resource is %lx..%lx (%lx), parent %pn",
  231.     res->start, res->end, res->flags, pr);
  232. }
  233. pcibios_allocate_bus_resources(&bus->children);
  234. }
  235. }
  236. static void __init
  237. pcibios_allocate_resources(int pass)
  238. {
  239. struct pci_dev *dev;
  240. int idx, disabled;
  241. u16 command;
  242. struct resource *r, *pr;
  243. pci_for_each_dev(dev) {
  244. pci_read_config_word(dev, PCI_COMMAND, &command);
  245. for(idx = 0; idx < 6; idx++) {
  246. r = &dev->resource[idx];
  247. if (r->parent) /* Already allocated */
  248. continue;
  249. if (!r->start) /* Address not assigned at all */
  250. continue;
  251. if (r->flags & IORESOURCE_IO)
  252. disabled = !(command & PCI_COMMAND_IO);
  253. else
  254. disabled = !(command & PCI_COMMAND_MEMORY);
  255. if (pass == disabled) {
  256. PPCDBG(PPCDBG_PHBINIT,
  257.        "PCI: Resource %08lx-%08lx (f=%lx, d=%d, p=%d)n",
  258.        r->start, r->end, r->flags, disabled, pass);
  259. pr = pci_find_parent_resource(dev, r);
  260. if (!pr || request_resource(pr, r) < 0) {
  261. PPCDBG(PPCDBG_PHBINIT,
  262.        "PCI: Cannot allocate resource region %d of device %s, pr = 0x%lxn", idx, dev->slot_name, pr);
  263. if(pr) {
  264. PPCDBG(PPCDBG_PHBINIT,
  265.        "PCI: Cannot allocate resource 0x%lxn", request_resource(pr,r));
  266. }
  267. /* We'll assign a new address later */
  268. r->end -= r->start;
  269. r->start = 0;
  270. }
  271. }
  272. }
  273. if (!pass) {
  274. r = &dev->resource[PCI_ROM_RESOURCE];
  275. if (r->flags & PCI_ROM_ADDRESS_ENABLE) {
  276. /* Turn the ROM off, leave the resource region, but keep it unregistered. */
  277. u32 reg;
  278. r->flags &= ~PCI_ROM_ADDRESS_ENABLE;
  279. pci_read_config_dword(dev, dev->rom_base_reg, &reg);
  280. pci_write_config_dword(dev, dev->rom_base_reg, reg & ~PCI_ROM_ADDRESS_ENABLE);
  281. }
  282. }
  283. }
  284. }
  285. static void __init
  286. pcibios_assign_resources(void)
  287. {
  288. struct pci_dev *dev;
  289. int idx;
  290. struct resource *r;
  291. pci_for_each_dev(dev) {
  292. int class = dev->class >> 8;
  293. /* Don't touch classless devices and host bridges */
  294. if (!class || class == PCI_CLASS_BRIDGE_HOST)
  295. continue;
  296. for(idx=0; idx<6; idx++) {
  297. r = &dev->resource[idx];
  298. /*
  299.  *  Don't touch IDE controllers and I/O ports of video cards!
  300.  */
  301. if ((class == PCI_CLASS_STORAGE_IDE && idx < 4) ||
  302.     (class == PCI_CLASS_DISPLAY_VGA && (r->flags & IORESOURCE_IO)))
  303. continue;
  304. /*
  305.  *  We shall assign a new address to this resource, either because
  306.  *  the BIOS forgot to do so or because we have decided the old
  307.  *  address was unusable for some reason.
  308.  */
  309. if (!r->start && r->end && ppc_md.pcibios_enable_device_hook &&
  310.     !ppc_md.pcibios_enable_device_hook(dev, 1))
  311. pci_assign_resource(dev, idx);
  312. }
  313. if (0) { /* don't assign ROMs */
  314. r = &dev->resource[PCI_ROM_RESOURCE];
  315. r->end -= r->start;
  316. r->start = 0;
  317. if (r->end)
  318. pci_assign_resource(dev, PCI_ROM_RESOURCE);
  319. }
  320. }
  321. }
  322. int
  323. pcibios_enable_resources(struct pci_dev *dev, int mask)
  324. {
  325. u16 cmd, old_cmd;
  326. int idx;
  327. struct resource *r;
  328. pci_read_config_word(dev, PCI_COMMAND, &cmd);
  329. old_cmd = cmd;
  330. for(idx=0; idx<6; idx++) {
  331. if(!(mask & (1<<idx)))
  332. continue;
  333. r = &dev->resource[idx];
  334. if (!r->start && r->end) {
  335. printk(KERN_ERR "PCI: Device %s not available because of resource collisionsn", dev->slot_name);
  336. return -EINVAL;
  337. }
  338. if (r->flags & IORESOURCE_IO)
  339. cmd |= PCI_COMMAND_IO;
  340. if (r->flags & IORESOURCE_MEM)
  341. cmd |= PCI_COMMAND_MEMORY;
  342. }
  343. if (dev->resource[PCI_ROM_RESOURCE].start)
  344. cmd |= PCI_COMMAND_MEMORY;
  345. if (cmd != old_cmd) {
  346. printk("PCI: Enabling device %s (%04x -> %04x)n", dev->slot_name, old_cmd, cmd);
  347. pci_write_config_word(dev, PCI_COMMAND, cmd);
  348. }
  349. return 0;
  350. }
  351. /* 
  352.  * Allocate pci_controller(phb) initialized common variables. 
  353.  */
  354. struct pci_controller * __init
  355. pci_alloc_pci_controller(char *model, enum phb_types controller_type)
  356. {
  357.         struct pci_controller *hose;
  358.         PPCDBG(PPCDBG_PHBINIT, "PCI: Allocate pci_controller for %sn",model);
  359.         hose = (struct pci_controller *)alloc_bootmem(sizeof(struct pci_controller));
  360.         if(hose == NULL) {
  361.                 printk(KERN_ERR "PCI: Allocate pci_controller failed.n");
  362.                 return NULL;
  363.         }
  364.         memset(hose, 0, sizeof(struct pci_controller));
  365.         if(strlen(model) < 8) strcpy(hose->what,model);
  366.         else                  memcpy(hose->what,model,7);
  367.         hose->type = controller_type;
  368.         hose->global_number = global_phb_number;
  369. phbtab[global_phb_number++] = hose;
  370.         
  371.         *hose_tail = hose;
  372.         hose_tail = &hose->next;
  373.         return hose;
  374. }
  375. /*
  376.  * This fixup is arch independent and probably should go somewhere else.
  377.  */
  378. void __init
  379. pcibios_generic_fixup(void)
  380. {
  381. struct pci_dev *dev;
  382. /* Fix miss-identified vendor AMD pcnet32 adapters. */
  383. dev = NULL;
  384. while ((dev = pci_find_device(PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_AMD_LANCE, dev)) != NULL &&
  385.        dev->class == (PCI_CLASS_NETWORK_ETHERNET << 8))
  386. dev->vendor = PCI_VENDOR_ID_AMD;
  387. }
  388. /*********************************************************************** 
  389.  *
  390.  *
  391.  * 
  392.  ***********************************************************************/
  393. void __init
  394. pcibios_init(void)
  395. {
  396. struct pci_controller *hose;
  397. struct pci_bus *bus;
  398. int    next_busno;
  399. #ifndef CONFIG_PPC_ISERIES
  400. pSeries_pcibios_init();
  401. #else
  402. iSeries_pcibios_init(); 
  403. #endif
  404. ppc64_boot_msg(0x40, "PCI Probe");
  405. printk("PCI: Probing PCI hardwaren");
  406. PPCDBG(PPCDBG_BUSWALK,"PCI: Probing PCI hardwaren");
  407. /* Scan all of the recorded PCI controllers.  */
  408. for (next_busno = 0, hose = hose_head; hose; hose = hose->next) {
  409. hose->last_busno = 0xff;
  410. bus = pci_scan_bus(hose->first_busno, hose->ops, hose->arch_data);
  411. hose->bus = bus;
  412. hose->last_busno = bus->subordinate;
  413. if (pci_assign_all_busses || next_busno <= hose->last_busno)
  414. next_busno = hose->last_busno+1;
  415. }
  416. pci_bus_count = next_busno;
  417. /* Call machine dependant fixup */
  418. if (ppc_md.pcibios_fixup) {
  419. ppc_md.pcibios_fixup();
  420. }
  421. /* Generic fixups */
  422. pcibios_generic_fixup();
  423. /* Allocate and assign resources */
  424. pcibios_allocate_bus_resources(&pci_root_buses);
  425. pcibios_allocate_resources(0);
  426. pcibios_allocate_resources(1);
  427. pcibios_assign_resources();
  428. #ifndef CONFIG_PPC_ISERIES
  429. pci_fix_bus_sysdata();
  430. create_tce_tables();
  431. PPCDBG(PPCDBG_BUSWALK,"pSeries create_tce_tables()n");
  432. #endif
  433. /* Cache the location of the ISA bridge (if we have one) */
  434. ppc64_isabridge_dev = pci_find_class(PCI_CLASS_BRIDGE_ISA << 8, NULL);
  435. if (ppc64_isabridge_dev != NULL )
  436. printk("ISA bridge at %sn", ppc64_isabridge_dev->slot_name);
  437. printk("PCI: Probing PCI hardware donen");
  438. PPCDBG(PPCDBG_BUSWALK,"PCI: Probing PCI hardware done.n");
  439. ppc64_boot_msg(0x41, "PCI Done");
  440. }
  441. int __init
  442. pcibios_assign_all_busses(void)
  443. {
  444. return pci_assign_all_busses;
  445. }
  446. unsigned long resource_fixup(struct pci_dev * dev, struct resource * res,
  447.      unsigned long start, unsigned long size)
  448. {
  449. return start;
  450. }
  451. void __init pcibios_fixup_bus(struct pci_bus *bus)
  452. {
  453. #ifndef CONFIG_PPC_ISERIES
  454. struct pci_controller *phb = PCI_GET_PHB_PTR(bus);
  455. struct resource *res;
  456. int i;
  457. if (bus->parent == NULL) {
  458. /* This is a host bridge - fill in its resources */
  459. phb->bus = bus;
  460. bus->resource[0] = res = &phb->io_resource;
  461. if (!res->flags)
  462. BUG(); /* No I/O resource for this PHB? */
  463. for (i = 0; i < 3; ++i) {
  464. res = &phb->mem_resources[i];
  465. if (!res->flags) {
  466. if (i == 0)
  467. BUG(); /* No memory resource for this PHB? */
  468. }
  469. bus->resource[i+1] = res;
  470. }
  471. } else {
  472. /* This is a subordinate bridge */
  473. pci_read_bridge_bases(bus);
  474. for (i = 0; i < 4; ++i) {
  475. if ((res = bus->resource[i]) == NULL)
  476. continue;
  477. if (!res->flags)
  478. continue;
  479. if (res == pci_find_parent_resource(bus->self, res)) {
  480. /* Transparent resource -- don't try to "fix" it. */
  481. continue;
  482. }
  483. if (is_eeh_implemented()) {
  484. if (res->flags & (IORESOURCE_IO|IORESOURCE_MEM)) {
  485. res->start = eeh_token(phb->global_number, bus->number, 0, 0);
  486. res->end = eeh_token(phb->global_number, bus->number, 0xff, 0xffffffff);
  487. }
  488. } else {
  489. if (res->flags & IORESOURCE_IO) {
  490. res->start += (unsigned long)phb->io_base_virt;
  491. res->end += (unsigned long)phb->io_base_virt;
  492. } else if (phb->pci_mem_offset
  493.    && (res->flags & IORESOURCE_MEM)) {
  494. if (res->start < phb->pci_mem_offset) {
  495. res->start += phb->pci_mem_offset;
  496. res->end += phb->pci_mem_offset;
  497. }
  498. }
  499. }
  500. }
  501. }
  502. #endif
  503. if ( ppc_md.pcibios_fixup_bus )
  504. ppc_md.pcibios_fixup_bus(bus);
  505. }
  506. char __init *pcibios_setup(char *str)
  507. {
  508. return str;
  509. }
  510. int pcibios_enable_device(struct pci_dev *dev, int mask)
  511. {
  512. u16 cmd, old_cmd;
  513. int idx;
  514. struct resource *r;
  515. PPCDBG(PPCDBG_BUSWALK,"PCI: %s for device %s n",__FUNCTION__,dev->slot_name);
  516. if (ppc_md.pcibios_enable_device_hook)
  517. if (ppc_md.pcibios_enable_device_hook(dev, 0))
  518. return -EINVAL;
  519. pci_read_config_word(dev, PCI_COMMAND, &cmd);
  520. old_cmd = cmd;
  521. for (idx=0; idx<6; idx++) {
  522. r = &dev->resource[idx];
  523. if (!r->start && r->end) {
  524. printk(KERN_ERR "PCI: Device %s not available because of resource collisionsn", dev->slot_name);
  525. return -EINVAL;
  526. }
  527. if (r->flags & IORESOURCE_IO)
  528. cmd |= PCI_COMMAND_IO;
  529. if (r->flags & IORESOURCE_MEM)
  530. cmd |= PCI_COMMAND_MEMORY;
  531. }
  532. if (cmd != old_cmd) {
  533. printk("PCI: Enabling device %s (%04x -> %04x)n",
  534.        dev->slot_name, old_cmd, cmd);
  535. PPCDBG(PPCDBG_BUSWALK,"PCI: Enabling device %s n",dev->slot_name);
  536. pci_write_config_word(dev, PCI_COMMAND, cmd);
  537. }
  538. return 0;
  539. }
  540. struct pci_controller*
  541. pci_bus_to_hose(int bus)
  542. {
  543. struct pci_controller* hose = hose_head;
  544. for (; hose; hose = hose->next)
  545. if (bus >= hose->first_busno && bus <= hose->last_busno)
  546. return hose;
  547. return NULL;
  548. }
  549. void*
  550. pci_bus_io_base(unsigned int bus)
  551. {
  552. struct pci_controller *hose;
  553. hose = pci_bus_to_hose(bus);
  554. if (!hose)
  555. return NULL;
  556. return hose->io_base_virt;
  557. }
  558. unsigned long
  559. pci_bus_io_base_phys(unsigned int bus)
  560. {
  561. struct pci_controller *hose;
  562. hose = pci_bus_to_hose(bus);
  563. if (!hose)
  564. return 0;
  565. return hose->io_base_phys;
  566. }
  567. unsigned long
  568. pci_bus_mem_base_phys(unsigned int bus)
  569. {
  570. struct pci_controller *hose;
  571. hose = pci_bus_to_hose(bus);
  572. if (!hose)
  573. return 0;
  574. return hose->pci_mem_offset;
  575. }
  576. /*
  577.  * Return the index of the PCI controller for device pdev.
  578.  */
  579. int pci_controller_num(struct pci_dev *dev)
  580. {
  581. struct pci_controller *hose = PCI_GET_PHB_PTR(dev);
  582. return hose->global_number;
  583. }
  584. /*
  585.  * Platform support for /proc/bus/pci/X/Y mmap()s,
  586.  * modelled on the sparc64 implementation by Dave Miller.
  587.  *  -- paulus.
  588.  */
  589. /*
  590.  * Adjust vm_pgoff of VMA such that it is the physical page offset
  591.  * corresponding to the 32-bit pci bus offset for DEV requested by the user.
  592.  *
  593.  * Basically, the user finds the base address for his device which he wishes
  594.  * to mmap.  They read the 32-bit value from the config space base register,
  595.  * add whatever PAGE_SIZE multiple offset they wish, and feed this into the
  596.  * offset parameter of mmap on /proc/bus/pci/XXX for that device.
  597.  *
  598.  * Returns negative error code on failure, zero on success.
  599.  */
  600. static __inline__ int
  601. __pci_mmap_make_offset(struct pci_dev *dev, struct vm_area_struct *vma,
  602.        enum pci_mmap_state mmap_state)
  603. {
  604. struct pci_controller *hose = PCI_GET_PHB_PTR(dev);
  605. unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
  606. unsigned long io_offset = 0;
  607. int i, res_bit;
  608. if (hose == 0)
  609. return -EINVAL; /* should never happen */
  610. /* If memory, add on the PCI bridge address offset */
  611. if (mmap_state == pci_mmap_mem) {
  612. offset += hose->pci_mem_offset;
  613. res_bit = IORESOURCE_MEM;
  614. } else {
  615. io_offset = (unsigned long)hose->io_base_virt;
  616. offset += io_offset;
  617. res_bit = IORESOURCE_IO;
  618. }
  619. /*
  620.  * Check that the offset requested corresponds to one of the
  621.  * resources of the device.
  622.  */
  623. for (i = 0; i <= PCI_ROM_RESOURCE; i++) {
  624. struct resource *rp = &dev->resource[i];
  625. int flags = rp->flags;
  626. /* treat ROM as memory (should be already) */
  627. if (i == PCI_ROM_RESOURCE)
  628. flags |= IORESOURCE_MEM;
  629. /* Active and same type? */
  630. if ((flags & res_bit) == 0)
  631. continue;
  632. /* In the range of this resource? */
  633. if (offset < (rp->start & PAGE_MASK) || offset > rp->end)
  634. continue;
  635. /* found it! construct the final physical address */
  636. if (mmap_state == pci_mmap_io)
  637. offset += hose->io_base_phys - io_offset;
  638. vma->vm_pgoff = offset >> PAGE_SHIFT;
  639. return 0;
  640. }
  641. return -EINVAL;
  642. }
  643. /*
  644.  * Set vm_flags of VMA, as appropriate for this architecture, for a pci device
  645.  * mapping.
  646.  */
  647. static __inline__ void
  648. __pci_mmap_set_flags(struct pci_dev *dev, struct vm_area_struct *vma,
  649.      enum pci_mmap_state mmap_state)
  650. {
  651. vma->vm_flags |= VM_SHM | VM_LOCKED | VM_IO;
  652. }
  653. /*
  654.  * Set vm_page_prot of VMA, as appropriate for this architecture, for a pci
  655.  * device mapping.
  656.  */
  657. static __inline__ void
  658. __pci_mmap_set_pgprot(struct pci_dev *dev, struct vm_area_struct *vma,
  659.       enum pci_mmap_state mmap_state, int write_combine)
  660. {
  661. long prot = pgprot_val(vma->vm_page_prot);
  662. /* XXX would be nice to have a way to ask for write-through */
  663. prot |= _PAGE_NO_CACHE;
  664. prot |= _PAGE_GUARDED;
  665. vma->vm_page_prot = __pgprot(prot);
  666. }
  667. /*
  668.  * Perform the actual remap of the pages for a PCI device mapping, as
  669.  * appropriate for this architecture.  The region in the process to map
  670.  * is described by vm_start and vm_end members of VMA, the base physical
  671.  * address is found in vm_pgoff.
  672.  * The pci device structure is provided so that architectures may make mapping
  673.  * decisions on a per-device or per-bus basis.
  674.  *
  675.  * Returns a negative error code on failure, zero on success.
  676.  */
  677. int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
  678. enum pci_mmap_state mmap_state,
  679. int write_combine)
  680. {
  681. int ret;
  682. ret = __pci_mmap_make_offset(dev, vma, mmap_state);
  683. if (ret < 0)
  684. return ret;
  685. __pci_mmap_set_flags(dev, vma, mmap_state);
  686. __pci_mmap_set_pgprot(dev, vma, mmap_state, write_combine);
  687. ret = remap_page_range(vma->vm_start, vma->vm_pgoff << PAGE_SHIFT,
  688.        vma->vm_end - vma->vm_start, vma->vm_page_prot);
  689. return ret;
  690. }
  691. /* Provide information on locations of various I/O regions in physical
  692.  * memory.  Do this on a per-card basis so that we choose the right
  693.  * root bridge.
  694.  * Note that the returned IO or memory base is a physical address
  695.  */
  696. long
  697. sys_pciconfig_iobase(long which, unsigned long bus, unsigned long devfn)
  698. {
  699. struct pci_controller* hose = pci_bus_to_hose(bus);
  700. long result = -EOPNOTSUPP;
  701. if (!hose)
  702. return -ENODEV;
  703. switch (which) {
  704. case IOBASE_BRIDGE_NUMBER:
  705. return (long)hose->first_busno;
  706. case IOBASE_MEMORY:
  707. return (long)hose->pci_mem_offset;
  708. case IOBASE_IO:
  709. return (long)hose->io_base_phys;
  710. case IOBASE_ISA_IO:
  711. return (long)isa_io_base;
  712. case IOBASE_ISA_MEM:
  713. return (long)isa_mem_base;
  714. }
  715. return result;
  716. }
  717. /************************************************************************/
  718. /* Formats the device information and location for service.             */
  719. /* - Pass in pci_dev* pointer to the device.                            */
  720. /* - Pass in buffer to place the data.  Danger here is the buffer must  */
  721. /*   be as big as the client says it is.   Should be at least 128 bytes.*/
  722. /* Return will the length of the string data put in the buffer.         */
  723. /* The brand specific method device_Location is called.                 */
  724. /* Format:                                                              */
  725. /* PCI: Bus  0, Device 26, Vendor 0x12AE  Frame  1, Card  C10  Ethernet */
  726. /* PCI: Bus  0, Device 26, Vendor 0x12AE  Location U0.3-P1-I8  Ethernet */
  727. /* For pSeries, see the Product Topology in the RS/6000 Architecture.   */
  728. /* For iSeries, see the Service Manuals.                                */
  729. /************************************************************************/
  730. int  format_device_location(struct pci_dev* PciDev,char* BufPtr, int BufferSize)
  731. {
  732. struct device_node* DevNode = (struct device_node*)PciDev->sysdata;
  733. int  LineLen = 0;
  734. if (DevNode != NULL && BufferSize >= 128) {
  735. LineLen += device_Location(PciDev,BufPtr+LineLen);
  736. LineLen += sprintf(BufPtr+LineLen," %12s",pci_class_name(PciDev->class >> 8) );
  737. }
  738. return LineLen;
  739. }
  740. /************************************************************************
  741.  * Saves the config registers for a device.                             *
  742.  ************************************************************************
  743.  * Note: This does byte reads so the data may appear byte swapped,      *
  744.  * The data returned in the pci_config_reg_save_area structure can be   *
  745.  * used to the restore of the data.  If the save failed, the data       *
  746.  * will not be restore.  Yes I know, you are most likey toast.          *
  747.  ************************************************************************/
  748. int pci_save_config_regs(struct pci_dev* PciDev,struct pci_config_reg_save_area* SaveArea)
  749. {
  750. memset(SaveArea,0x00,sizeof(struct pci_config_reg_save_area) );
  751. SaveArea->PciDev    = PciDev;
  752. SaveArea->RCode     = 0;
  753. SaveArea->Register  = 0;
  754. /******************************************************************
  755.  * Save All the Regs,  NOTE: restore skips the first 16 bytes.    *
  756.  ******************************************************************/
  757. while (SaveArea->Register < REG_SAVE_SIZE && SaveArea->RCode == 0) {
  758. SaveArea->RCode = pci_read_config_byte(PciDev, SaveArea->Register, &SaveArea->Regs[SaveArea->Register]);
  759. ++SaveArea->Register;
  760. }
  761. if (SaveArea->RCode != 0) {  /* Ouch */
  762. SaveArea->Flags = 0x80;
  763. printk("PCI: pci_restore_save_regs failed! %pn 0x%04X",PciDev,SaveArea->RCode);
  764. PCIFR(      "pci_restore_save_regs failed! %pn 0x%04X",PciDev,SaveArea->RCode);
  765. }
  766. else {
  767. SaveArea->Flags = 0x01;
  768. }
  769. return  SaveArea->RCode;
  770. }
  771. /************************************************************************
  772.  * Restores the registers saved via the save function.  See the save    *
  773.  * function for details.                                                *
  774.  ************************************************************************/
  775. int pci_restore_config_regs(struct pci_dev* PciDev,struct pci_config_reg_save_area* SaveArea)
  776. {
  777.   if (SaveArea->PciDev != PciDev || SaveArea->Flags == 0x80 || SaveArea->RCode != 0) {
  778. printk("PCI: pci_restore_config_regs failed! %pn",PciDev);
  779. return -1;
  780. }
  781. /******************************************************************
  782.  * Don't touch the Cmd or BIST regs, user must restore those.     *
  783.  * Restore PCI_VENDOR_ID & PCI_DEVICE_ID                          *
  784.  * Restore PCI_CACHE_LINE_SIZE & PCI_LATENCY_TIMER                *
  785.  * Restore Saved Regs from 0x10 to 0x3F                           * 
  786.  ******************************************************************/
  787. SaveArea->Register = 0;
  788. while(SaveArea->Register < REG_SAVE_SIZE && SaveArea->RCode == 0) {
  789. SaveArea->RCode = pci_write_config_byte(PciDev,SaveArea->Register,SaveArea->Regs[SaveArea->Register]);
  790. ++SaveArea->Register;
  791. if (     SaveArea->Register == PCI_COMMAND)     SaveArea->Register = PCI_CACHE_LINE_SIZE;
  792. else if (SaveArea->Register == PCI_HEADER_TYPE) SaveArea->Register = PCI_BASE_ADDRESS_0;
  793. }
  794. if (SaveArea->RCode != 0) {
  795. printk("PCI: pci_restore_config_regs failed! %pn 0x%04X",PciDev,SaveArea->RCode);
  796. PCIFR(      "pci_restore_config_regs failed! %pn 0x%04X",PciDev,SaveArea->RCode);
  797. }
  798. return  SaveArea->RCode;
  799. }
  800. /************************************************************************/
  801. /* Interface to toggle the reset line                                   */
  802. /* Time is in .1 seconds, need for seconds.                             */
  803. /************************************************************************/
  804. int  pci_reset_device(struct pci_dev* PciDev, int AssertTime, int DelayTime)
  805. {
  806. unsigned long AssertDelay, WaitDelay;
  807. int RtnCode;
  808. /********************************************************************
  809.  * Set defaults, Assert is .5 second, Wait is 3 seconds.
  810.  ********************************************************************/
  811. if (AssertTime == 0) AssertDelay = ( 5 * HZ)/10;
  812. else                 AssertDelay = (AssertTime*HZ)/10;
  813. if (WaitDelay == 0)  WaitDelay   = (30 * HZ)/10;
  814. else                 WaitDelay   = (DelayTime* HZ)/10;
  815. /********************************************************************
  816.  * Assert reset, wait, de-assert reset, wait for IOA to reset.
  817.  * - Don't waste the CPU time on jiffies.
  818.  ********************************************************************/
  819. RtnCode = pci_set_reset(PciDev,1);
  820. if (RtnCode == 0) {
  821. set_current_state(TASK_UNINTERRUPTIBLE);
  822. schedule_timeout(AssertDelay);   /* Sleep for the time     */
  823. RtnCode = pci_set_reset(PciDev,0);
  824. set_current_state(TASK_UNINTERRUPTIBLE);  
  825. schedule_timeout(WaitDelay);
  826. }
  827. if (RtnCode == 0) {
  828. PCIFR(      "Bus%3d, Device%3d, Resetn",PciDev->bus->number,PCI_SLOT(PciDev->devfn) );
  829. else {
  830. printk("PCI: Bus%3d, Device%3d, Reset Failed:0x%04Xn",PciDev->bus->number,PCI_SLOT(PciDev->devfn),RtnCode );
  831. PCIFR(      "Bus%3d, Device%3d, Reset Failed:0x%04Xn",PciDev->bus->number,PCI_SLOT(PciDev->devfn),RtnCode );
  832. }
  833. return RtnCode;
  834. }
  835. /*****************************************************
  836.  * Dump Resource information
  837.  *****************************************************/
  838. void dumpResources(struct resource* Resource)
  839. {
  840. if(Resource != NULL) {
  841. int Flags = 0x00000F00 & Resource->flags;
  842. if(Resource->start == 0 && Resource->end == 0) return;
  843. else if(Resource->start == Resource->end )     return;
  844. else {
  845. if     (Flags == IORESOURCE_IO)  udbg_printf("IO.:");
  846. else if(Flags == IORESOURCE_MEM) udbg_printf("MEM:");
  847. else if(Flags == IORESOURCE_IRQ) udbg_printf("IRQ:");
  848. else                             udbg_printf("0x%02X:",Resource->flags);
  849. }
  850. udbg_printf("0x%016LX / 0x%016LX (0x%08X)n",
  851.     Resource->start, Resource->end, Resource->end - Resource->start);
  852. }
  853. }
  854. int  resourceSize(struct resource* Resource)
  855. {
  856. if(Resource->start == 0 && Resource->end == 0) return 0;
  857. else if(Resource->start == Resource->end )     return 0;
  858. else return (Resource->end-1)-Resource->start;
  859. }
  860. /*****************************************************
  861.  * Dump PHB information for Debug
  862.  *****************************************************/
  863. void dumpPci_Controller(struct pci_controller* phb)
  864. {
  865. udbg_printf("tpci_controller= 0x%016LXn", phb);
  866. if (phb != NULL) {
  867. udbg_printf("twhat & type   = %s 0x%02Xn ",phb->what,phb->type);
  868. udbg_printf("tbus           = ");
  869. if (phb->bus != NULL) udbg_printf("0x%02Xn",   phb->bus->number);
  870. else                  udbg_printf("<NULL>n");
  871. udbg_printf("tarch_data     = 0x%016LXn", phb->arch_data);
  872. udbg_printf("tfirst_busno   = 0x%02Xn",   phb->first_busno);
  873. udbg_printf("tlast_busno    = 0x%02Xn",   phb->last_busno);
  874. udbg_printf("tio_base_virt* = 0x%016LXn", phb->io_base_virt);
  875. udbg_printf("tio_base_phys  = 0x%016LXn", phb->io_base_phys);
  876. udbg_printf("tpci_mem_offset= 0x%016LXn", phb->pci_mem_offset);
  877. udbg_printf("tpci_io_offset = 0x%016LXn", phb->pci_io_offset);
  878. udbg_printf("tcfg_addr      = 0x%016LXn", phb->cfg_addr);
  879. udbg_printf("tcfg_data      = 0x%016LXn", phb->cfg_data);
  880. udbg_printf("tphb_regs      = 0x%016LXn", phb->phb_regs);
  881. udbg_printf("tchip_regs     = 0x%016LXn", phb->chip_regs);
  882. udbg_printf("tResourcesn");
  883. dumpResources(&phb->io_resource);
  884. if (phb->mem_resource_count >  0) dumpResources(&phb->mem_resources[0]);
  885. if (phb->mem_resource_count >  1) dumpResources(&phb->mem_resources[1]);
  886. if (phb->mem_resource_count >  2) dumpResources(&phb->mem_resources[2]);
  887. udbg_printf("tglobal_num    = 0x%02Xn",   phb->global_number);
  888. udbg_printf("tlocal_num     = 0x%02Xn",   phb->local_number);
  889. }
  890. }
  891. /*****************************************************
  892.  * Dump PHB information for Debug
  893.  *****************************************************/
  894. void dumpPci_Bus(struct pci_bus* Pci_Bus)
  895. {
  896. int i;
  897. udbg_printf("tpci_bus         = 0x%016LX   n",Pci_Bus);
  898. if (Pci_Bus != NULL) {
  899. udbg_printf("tnumber          = 0x%02X     n",Pci_Bus->number);
  900. udbg_printf("tprimary         = 0x%02X     n",Pci_Bus->primary);
  901. udbg_printf("tsecondary       = 0x%02X     n",Pci_Bus->secondary);
  902. udbg_printf("tsubordinate     = 0x%02X     n",Pci_Bus->subordinate);
  903. for (i=0;i<4;++i) {
  904. if(Pci_Bus->resource[i] == NULL) continue;
  905. if(Pci_Bus->resource[i]->start == 0 && Pci_Bus->resource[i]->end == 0) break;
  906. udbg_printf("tResources[%d]",i);
  907. dumpResources(Pci_Bus->resource[i]);
  908. }
  909. }
  910. }
  911. /*****************************************************
  912.  * Dump Device information for Debug
  913.  *****************************************************/
  914. void dumpPci_Dev(struct pci_dev* Pci_Dev)
  915. {
  916. int i;
  917. udbg_printf("tpci_dev*        = 0x%pn",Pci_Dev);
  918. if ( Pci_Dev == NULL )  return;
  919. udbg_printf("tname            = %s  n",Pci_Dev->name);
  920. udbg_printf("tbus*            = 0x%pn",Pci_Dev->bus);
  921. udbg_printf("tsysdata*        = 0x%pn",Pci_Dev->sysdata);
  922. udbg_printf("tDevice          = 0x%4X%02X:%02X.%02X 0x%04X:%04Xn",
  923.     PCI_GET_PHB_NUMBER(Pci_Dev),
  924.     PCI_GET_BUS_NUMBER(Pci_Dev),
  925.     PCI_SLOT(Pci_Dev->devfn),
  926.     PCI_FUNC(Pci_Dev->devfn),
  927.     Pci_Dev->vendor,
  928.     Pci_Dev->device);
  929. udbg_printf("tHdr/Irq         = 0x%02X/0x%02X n",Pci_Dev->hdr_type,Pci_Dev->irq);
  930. for (i=0;i<DEVICE_COUNT_RESOURCE;++i) {
  931. if (Pci_Dev->resource[i].start == 0 && Pci_Dev->resource[i].end == 0) continue;
  932. udbg_printf("tResources[%d] ",i);
  933. dumpResources(&Pci_Dev->resource[i]);
  934. }
  935. dumpResources(&Pci_Dev->resource[i]);
  936. }