Rev 2325 | Rev 2327 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2325 | Rev 2326 | ||
---|---|---|---|
Line 502... | Line 502... | ||
502 | { |
502 | { |
503 | dbgprintf("PCI device %x:%x bus:%x devfn:%x\n", |
503 | dbgprintf("PCI device %x:%x bus:%x devfn:%x\n", |
504 | dev->pci_dev.vendor, |
504 | dev->pci_dev.vendor, |
505 | dev->pci_dev.device, |
505 | dev->pci_dev.device, |
506 | dev->pci_dev.bus, |
506 | dev->pci_dev.busnr, |
507 | dev->pci_dev.devfn); |
507 | dev->pci_dev.devfn); |
508 | 508 | ||
Line 509... | Line 509... | ||
509 | } |
509 | } |
510 | return 0; |
510 | return 0; |
511 | } |
511 | } |
Line 567... | Line 567... | ||
567 | } |
567 | } |
568 | } |
568 | } |
569 | return NULL; |
569 | return NULL; |
570 | };>=>>>><>><>><>>4)><4)> |
570 | }; |
571 | 571 | ||
- | 572 | ||
- | 573 | struct pci_dev * pci_get_bus_and_slot(unsigned int bus, unsigned int devfn) |
|
- | 574 | { |
|
- | 575 | pci_dev_t *dev; |
|
- | 576 | ||
- | 577 | for(dev = (pci_dev_t*)devices.next; |
|
- | 578 | &dev->link != &devices; |
|
- | 579 | dev = (pci_dev_t*)dev->link.next) |
|
- | 580 | { |
|
- | 581 | if ( dev->pci_dev.busnr == bus && dev->pci_dev.devfn == devfn) |
|
- | 582 | return &dev->pci_dev; |
|
- | 583 | } |
|
- | 584 | return NULL; |
|
- | 585 | } |
|
- | 586 | ||
- | 587 | struct pci_dev *pci_get_class(unsigned int class, struct pci_dev *from) |
|
- | 588 | { |
|
- | 589 | pci_dev_t *dev; |
|
- | 590 | ||
- | 591 | dev = (pci_dev_t*)devices.next; |
|
- | 592 | ||
- | 593 | if(from != NULL) |
|
- | 594 | { |
|
- | 595 | for(; &dev->link != &devices; |
|
- | 596 | dev = (pci_dev_t*)dev->link.next) |
|
- | 597 | { |
|
- | 598 | if( &dev->pci_dev == from) |
|
- | 599 | { |
|
- | 600 | dev = (pci_dev_t*)dev->link.next; |
|
- | 601 | break; |
|
- | 602 | }; |
|
- | 603 | } |
|
- | 604 | }; |
|
- | 605 | ||
- | 606 | for(; &dev->link != &devices; |
|
- | 607 | dev = (pci_dev_t*)dev->link.next) |
|
- | 608 | { |
|
- | 609 | if( dev->pci_dev.class == class) |
|
- | 610 | { |
|
- | 611 | return &dev->pci_dev; |
|
- | 612 | } |
|
- | 613 | } |
|
- | 614 | ||
- | 615 | return NULL; |
|
- | 616 | } |
|
- | 617 | ||
- | 618 | ||
- | 619 | #define PIO_OFFSET 0x10000UL |
|
- | 620 | #define PIO_MASK 0x0ffffUL |
|
- | 621 | #define PIO_RESERVED 0x40000UL |
|
- | 622 | ||
- | 623 | #define IO_COND(addr, is_pio, is_mmio) do { \ |
|
- | 624 | unsigned long port = (unsigned long __force)addr; \ |
|
- | 625 | if (port >= PIO_RESERVED) { \ |
|
- | 626 | is_mmio; \ |
|
- | 627 | } else if (port > PIO_OFFSET) { \ |
|
- | 628 | port &= PIO_MASK; \ |
|
- | 629 | is_pio; \ |
|
- | 630 | }; \ |
|
- | 631 | } while (0) |
|
- | 632 | ||
- | 633 | /* Create a virtual mapping cookie for an IO port range */ |
|
- | 634 | void __iomem *ioport_map(unsigned long port, unsigned int nr) |
|
- | 635 | { |
|
- | 636 | if (port > PIO_MASK) |
|
- | 637 | return NULL; |
|
- | 638 | return (void __iomem *) (unsigned long) (port + PIO_OFFSET); |
|
- | 639 | } |
|
- | 640 | ||
- | 641 | void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) |
|
- | 642 | { |
|
- | 643 | resource_size_t start = pci_resource_start(dev, bar); |
|
- | 644 | resource_size_t len = pci_resource_len(dev, bar); |
|
- | 645 | unsigned long flags = pci_resource_flags(dev, bar); |
|
- | 646 | ||
- | 647 | if (!len || !start) |
|
- | 648 | return NULL; |
|
- | 649 | if (maxlen && len > maxlen) |
|
- | 650 | len = maxlen; |
|
- | 651 | if (flags & IORESOURCE_IO) |
|
- | 652 | return ioport_map(start, len); |
|
- | 653 | if (flags & IORESOURCE_MEM) { |
|
- | 654 | return ioremap(start, len); |
|
- | 655 | } |
|
- | 656 | /* What? */ |
|
- | 657 | return NULL; |
|
- | 658 | } |
|
- | 659 | ||
- | 660 | void pci_iounmap(struct pci_dev *dev, void __iomem * addr) |
|
- | 661 | { |
|
- | 662 | IO_COND(addr, /* nothing */, iounmap(addr)); |
|
- | 663 | }>=>>>><>><>><>>4)><4)> |
|
- | 664 | ||
- | 665 |