Path: blob/master/arch/cris/arch-v32/drivers/pci/bios.c
15131 views
#include <linux/pci.h>1#include <linux/kernel.h>2#include <arch/hwregs/intr_vect.h>34void __devinit pcibios_fixup_bus(struct pci_bus *b)5{6}78char * __devinit pcibios_setup(char *str)9{10return NULL;11}1213void pcibios_set_master(struct pci_dev *dev)14{15u8 lat;16pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat);17printk(KERN_DEBUG "PCI: Setting latency timer of device %s to %d\n", pci_name(dev), lat);18pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat);19}2021int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,22enum pci_mmap_state mmap_state, int write_combine)23{24unsigned long prot;2526/* Leave vm_pgoff as-is, the PCI space address is the physical27* address on this platform.28*/29prot = pgprot_val(vma->vm_page_prot);30vma->vm_page_prot = __pgprot(prot);3132/* Write-combine setting is ignored, it is changed via the mtrr33* interfaces on this platform.34*/35if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,36vma->vm_end - vma->vm_start,37vma->vm_page_prot))38return -EAGAIN;3940return 0;41}4243resource_size_t44pcibios_align_resource(void *data, const struct resource *res,45resource_size_t size, resource_size_t align)46{47resource_size_t start = res->start;4849if ((res->flags & IORESOURCE_IO) && (start & 0x300))50start = (start + 0x3ff) & ~0x3ff;5152return start;53}5455int pcibios_enable_resources(struct pci_dev *dev, int mask)56{57u16 cmd, old_cmd;58int idx;59struct resource *r;6061pci_read_config_word(dev, PCI_COMMAND, &cmd);62old_cmd = cmd;63for(idx=0; idx<6; idx++) {64/* Only set up the requested stuff */65if (!(mask & (1<<idx)))66continue;6768r = &dev->resource[idx];69if (!r->start && r->end) {70printk(KERN_ERR "PCI: Device %s not available because of resource collisions\n", pci_name(dev));71return -EINVAL;72}73if (r->flags & IORESOURCE_IO)74cmd |= PCI_COMMAND_IO;75if (r->flags & IORESOURCE_MEM)76cmd |= PCI_COMMAND_MEMORY;77}78if (dev->resource[PCI_ROM_RESOURCE].start)79cmd |= PCI_COMMAND_MEMORY;80if (cmd != old_cmd) {81printk("PCI: Enabling device %s (%04x -> %04x)\n", pci_name(dev), old_cmd, cmd);82pci_write_config_word(dev, PCI_COMMAND, cmd);83}84return 0;85}8687int pcibios_enable_irq(struct pci_dev *dev)88{89dev->irq = EXT_INTR_VECT;90return 0;91}9293int pcibios_enable_device(struct pci_dev *dev, int mask)94{95int err;9697if ((err = pcibios_enable_resources(dev, mask)) < 0)98return err;99100if (!dev->msi_enabled)101pcibios_enable_irq(dev);102return 0;103}104105int pcibios_assign_resources(void)106{107struct pci_dev *dev = NULL;108int idx;109struct resource *r;110111while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {112int class = dev->class >> 8;113114/* Don't touch classless devices and host bridges */115if (!class || class == PCI_CLASS_BRIDGE_HOST)116continue;117118for(idx=0; idx<6; idx++) {119r = &dev->resource[idx];120121if (!r->start && r->end)122pci_assign_resource(dev, idx);123}124}125return 0;126}127128EXPORT_SYMBOL(pcibios_assign_resources);129130131