Version:  2.0.40 2.2.26 2.4.37 3.12 3.13 3.14 3.15 3.16 3.17 3.18 3.19 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9

Linux/drivers/xen/platform-pci.c

  1 /******************************************************************************
  2  * platform-pci.c
  3  *
  4  * Xen platform PCI device driver
  5  *
  6  * Authors: ssmith@xensource.com and stefano.stabellini@eu.citrix.com
  7  *
  8  * Copyright (c) 2005, Intel Corporation.
  9  * Copyright (c) 2007, XenSource Inc.
 10  * Copyright (c) 2010, Citrix
 11  *
 12  * This program is free software; you can redistribute it and/or modify it
 13  * under the terms and conditions of the GNU General Public License,
 14  * version 2, as published by the Free Software Foundation.
 15  *
 16  * This program is distributed in the hope it will be useful, but WITHOUT
 17  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 18  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 19  * more details.
 20  *
 21  * You should have received a copy of the GNU General Public License along with
 22  * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 23  * Place - Suite 330, Boston, MA 02111-1307 USA.
 24  *
 25  */
 26 
 27 
 28 #include <linux/interrupt.h>
 29 #include <linux/io.h>
 30 #include <linux/init.h>
 31 #include <linux/pci.h>
 32 
 33 #include <xen/platform_pci.h>
 34 #include <xen/grant_table.h>
 35 #include <xen/xenbus.h>
 36 #include <xen/events.h>
 37 #include <xen/hvm.h>
 38 #include <xen/xen-ops.h>
 39 
 40 #define DRV_NAME    "xen-platform-pci"
 41 
 42 static unsigned long platform_mmio;
 43 static unsigned long platform_mmio_alloc;
 44 static unsigned long platform_mmiolen;
 45 
 46 static unsigned long alloc_xen_mmio(unsigned long len)
 47 {
 48         unsigned long addr;
 49 
 50         addr = platform_mmio + platform_mmio_alloc;
 51         platform_mmio_alloc += len;
 52         BUG_ON(platform_mmio_alloc > platform_mmiolen);
 53 
 54         return addr;
 55 }
 56 
 57 static int platform_pci_probe(struct pci_dev *pdev,
 58                               const struct pci_device_id *ent)
 59 {
 60         int i, ret;
 61         long ioaddr;
 62         long mmio_addr, mmio_len;
 63         unsigned int max_nr_gframes;
 64         unsigned long grant_frames;
 65 
 66         if (!xen_domain())
 67                 return -ENODEV;
 68 
 69         i = pci_enable_device(pdev);
 70         if (i)
 71                 return i;
 72 
 73         ioaddr = pci_resource_start(pdev, 0);
 74 
 75         mmio_addr = pci_resource_start(pdev, 1);
 76         mmio_len = pci_resource_len(pdev, 1);
 77 
 78         if (mmio_addr == 0 || ioaddr == 0) {
 79                 dev_err(&pdev->dev, "no resources found\n");
 80                 ret = -ENOENT;
 81                 goto pci_out;
 82         }
 83 
 84         ret = pci_request_region(pdev, 1, DRV_NAME);
 85         if (ret < 0)
 86                 goto pci_out;
 87 
 88         ret = pci_request_region(pdev, 0, DRV_NAME);
 89         if (ret < 0)
 90                 goto mem_out;
 91 
 92         platform_mmio = mmio_addr;
 93         platform_mmiolen = mmio_len;
 94 
 95         max_nr_gframes = gnttab_max_grant_frames();
 96         grant_frames = alloc_xen_mmio(PAGE_SIZE * max_nr_gframes);
 97         ret = gnttab_setup_auto_xlat_frames(grant_frames);
 98         if (ret)
 99                 goto out;
100         ret = gnttab_init();
101         if (ret)
102                 goto grant_out;
103         xenbus_probe(NULL);
104         return 0;
105 grant_out:
106         gnttab_free_auto_xlat_frames();
107 out:
108         pci_release_region(pdev, 0);
109 mem_out:
110         pci_release_region(pdev, 1);
111 pci_out:
112         pci_disable_device(pdev);
113         return ret;
114 }
115 
116 static struct pci_device_id platform_pci_tbl[] = {
117         {PCI_VENDOR_ID_XEN, PCI_DEVICE_ID_XEN_PLATFORM,
118                 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
119         {0,}
120 };
121 
122 static struct pci_driver platform_driver = {
123         .name =           DRV_NAME,
124         .probe =          platform_pci_probe,
125         .id_table =       platform_pci_tbl,
126 };
127 
128 static int __init platform_pci_init(void)
129 {
130         return pci_register_driver(&platform_driver);
131 }
132 device_initcall(platform_pci_init);
133 

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us