aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjorn Helgaas <bhelgaas@google.com>2014-02-20 16:32:34 -0500
committerBjorn Helgaas <bhelgaas@google.com>2014-02-20 16:32:34 -0500
commit02a0947ae458837424c8c77f1922c54678283df7 (patch)
tree798b66b3ecabdfaee04190ea9e49f52fe425077d
parent9d68c783d7e48f0b8cdfc20cd29803b80efe5003 (diff)
parent46cb7b1bd86fc227a5325ba8fa4c8be70fade4e8 (diff)
Merge branch 'pci/dead-code' into next
* pci/dead-code: PCI: Remove unused SR-IOV VF Migration support iommu/amd: Add include of <linux/irqreturn.h> mei: Add include of <linux/irqreturn.h> misc: mic: Add include of <linux/irqreturn.h>
-rw-r--r--Documentation/PCI/pci-iov-howto.txt4
-rw-r--r--drivers/iommu/amd_iommu_types.h1
-rw-r--r--drivers/misc/mei/hw-me.h1
-rw-r--r--drivers/misc/mic/card/mic_device.h1
-rw-r--r--drivers/misc/mic/host/mic_device.h1
-rw-r--r--drivers/pci/iov.c119
-rw-r--r--drivers/pci/pci.h4
-rw-r--r--include/linux/pci.h4
8 files changed, 4 insertions, 131 deletions
diff --git a/Documentation/PCI/pci-iov-howto.txt b/Documentation/PCI/pci-iov-howto.txt
index 86551cc72e03..2d91ae251982 100644
--- a/Documentation/PCI/pci-iov-howto.txt
+++ b/Documentation/PCI/pci-iov-howto.txt
@@ -68,10 +68,6 @@ To disable SR-IOV capability:
68 echo 0 > \ 68 echo 0 > \
69 /sys/bus/pci/devices/<DOMAIN:BUS:DEVICE.FUNCTION>/sriov_numvfs 69 /sys/bus/pci/devices/<DOMAIN:BUS:DEVICE.FUNCTION>/sriov_numvfs
70 70
71To notify SR-IOV core of Virtual Function Migration:
72(a) In the driver:
73 irqreturn_t pci_sriov_migration(struct pci_dev *dev);
74
753.2 Usage example 713.2 Usage example
76 72
77Following piece of code illustrates the usage of the SR-IOV API. 73Following piece of code illustrates the usage of the SR-IOV API.
diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h
index e400fbe411de..cff039df056e 100644
--- a/drivers/iommu/amd_iommu_types.h
+++ b/drivers/iommu/amd_iommu_types.h
@@ -25,6 +25,7 @@
25#include <linux/list.h> 25#include <linux/list.h>
26#include <linux/spinlock.h> 26#include <linux/spinlock.h>
27#include <linux/pci.h> 27#include <linux/pci.h>
28#include <linux/irqreturn.h>
28 29
29/* 30/*
30 * Maximum number of IOMMUs supported 31 * Maximum number of IOMMUs supported
diff --git a/drivers/misc/mei/hw-me.h b/drivers/misc/mei/hw-me.h
index 80bd829fbd9a..893d5119fa9b 100644
--- a/drivers/misc/mei/hw-me.h
+++ b/drivers/misc/mei/hw-me.h
@@ -20,6 +20,7 @@
20#define _MEI_INTERFACE_H_ 20#define _MEI_INTERFACE_H_
21 21
22#include <linux/mei.h> 22#include <linux/mei.h>
23#include <linux/irqreturn.h>
23#include "mei_dev.h" 24#include "mei_dev.h"
24#include "client.h" 25#include "client.h"
25 26
diff --git a/drivers/misc/mic/card/mic_device.h b/drivers/misc/mic/card/mic_device.h
index 347b9b3b7916..306f502be95e 100644
--- a/drivers/misc/mic/card/mic_device.h
+++ b/drivers/misc/mic/card/mic_device.h
@@ -29,6 +29,7 @@
29 29
30#include <linux/workqueue.h> 30#include <linux/workqueue.h>
31#include <linux/io.h> 31#include <linux/io.h>
32#include <linux/irqreturn.h>
32 33
33/** 34/**
34 * struct mic_intr_info - Contains h/w specific interrupt sources info 35 * struct mic_intr_info - Contains h/w specific interrupt sources info
diff --git a/drivers/misc/mic/host/mic_device.h b/drivers/misc/mic/host/mic_device.h
index 1a6edce2ecde..0398c696d257 100644
--- a/drivers/misc/mic/host/mic_device.h
+++ b/drivers/misc/mic/host/mic_device.h
@@ -24,6 +24,7 @@
24#include <linux/cdev.h> 24#include <linux/cdev.h>
25#include <linux/idr.h> 25#include <linux/idr.h>
26#include <linux/notifier.h> 26#include <linux/notifier.h>
27#include <linux/irqreturn.h>
27 28
28#include "mic_intr.h" 29#include "mic_intr.h"
29 30
diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
index 9dce7c5e2a77..de7a74782f92 100644
--- a/drivers/pci/iov.c
+++ b/drivers/pci/iov.c
@@ -170,97 +170,6 @@ static void virtfn_remove(struct pci_dev *dev, int id, int reset)
170 pci_dev_put(dev); 170 pci_dev_put(dev);
171} 171}
172 172
173static int sriov_migration(struct pci_dev *dev)
174{
175 u16 status;
176 struct pci_sriov *iov = dev->sriov;
177
178 if (!iov->num_VFs)
179 return 0;
180
181 if (!(iov->cap & PCI_SRIOV_CAP_VFM))
182 return 0;
183
184 pci_read_config_word(dev, iov->pos + PCI_SRIOV_STATUS, &status);
185 if (!(status & PCI_SRIOV_STATUS_VFM))
186 return 0;
187
188 schedule_work(&iov->mtask);
189
190 return 1;
191}
192
193static void sriov_migration_task(struct work_struct *work)
194{
195 int i;
196 u8 state;
197 u16 status;
198 struct pci_sriov *iov = container_of(work, struct pci_sriov, mtask);
199
200 for (i = iov->initial_VFs; i < iov->num_VFs; i++) {
201 state = readb(iov->mstate + i);
202 if (state == PCI_SRIOV_VFM_MI) {
203 writeb(PCI_SRIOV_VFM_AV, iov->mstate + i);
204 state = readb(iov->mstate + i);
205 if (state == PCI_SRIOV_VFM_AV)
206 virtfn_add(iov->self, i, 1);
207 } else if (state == PCI_SRIOV_VFM_MO) {
208 virtfn_remove(iov->self, i, 1);
209 writeb(PCI_SRIOV_VFM_UA, iov->mstate + i);
210 state = readb(iov->mstate + i);
211 if (state == PCI_SRIOV_VFM_AV)
212 virtfn_add(iov->self, i, 0);
213 }
214 }
215
216 pci_read_config_word(iov->self, iov->pos + PCI_SRIOV_STATUS, &status);
217 status &= ~PCI_SRIOV_STATUS_VFM;
218 pci_write_config_word(iov->self, iov->pos + PCI_SRIOV_STATUS, status);
219}
220
221static int sriov_enable_migration(struct pci_dev *dev, int nr_virtfn)
222{
223 int bir;
224 u32 table;
225 resource_size_t pa;
226 struct pci_sriov *iov = dev->sriov;
227
228 if (nr_virtfn <= iov->initial_VFs)
229 return 0;
230
231 pci_read_config_dword(dev, iov->pos + PCI_SRIOV_VFM, &table);
232 bir = PCI_SRIOV_VFM_BIR(table);
233 if (bir > PCI_STD_RESOURCE_END)
234 return -EIO;
235
236 table = PCI_SRIOV_VFM_OFFSET(table);
237 if (table + nr_virtfn > pci_resource_len(dev, bir))
238 return -EIO;
239
240 pa = pci_resource_start(dev, bir) + table;
241 iov->mstate = ioremap(pa, nr_virtfn);
242 if (!iov->mstate)
243 return -ENOMEM;
244
245 INIT_WORK(&iov->mtask, sriov_migration_task);
246
247 iov->ctrl |= PCI_SRIOV_CTRL_VFM | PCI_SRIOV_CTRL_INTR;
248 pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl);
249
250 return 0;
251}
252
253static void sriov_disable_migration(struct pci_dev *dev)
254{
255 struct pci_sriov *iov = dev->sriov;
256
257 iov->ctrl &= ~(PCI_SRIOV_CTRL_VFM | PCI_SRIOV_CTRL_INTR);
258 pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl);
259
260 cancel_work_sync(&iov->mtask);
261 iounmap(iov->mstate);
262}
263
264static int sriov_enable(struct pci_dev *dev, int nr_virtfn) 173static int sriov_enable(struct pci_dev *dev, int nr_virtfn)
265{ 174{
266 int rc; 175 int rc;
@@ -351,12 +260,6 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn)
351 goto failed; 260 goto failed;
352 } 261 }
353 262
354 if (iov->cap & PCI_SRIOV_CAP_VFM) {
355 rc = sriov_enable_migration(dev, nr_virtfn);
356 if (rc)
357 goto failed;
358 }
359
360 kobject_uevent(&dev->dev.kobj, KOBJ_CHANGE); 263 kobject_uevent(&dev->dev.kobj, KOBJ_CHANGE);
361 iov->num_VFs = nr_virtfn; 264 iov->num_VFs = nr_virtfn;
362 265
@@ -387,9 +290,6 @@ static void sriov_disable(struct pci_dev *dev)
387 if (!iov->num_VFs) 290 if (!iov->num_VFs)
388 return; 291 return;
389 292
390 if (iov->cap & PCI_SRIOV_CAP_VFM)
391 sriov_disable_migration(dev);
392
393 for (i = 0; i < iov->num_VFs; i++) 293 for (i = 0; i < iov->num_VFs; i++)
394 virtfn_remove(dev, i, 0); 294 virtfn_remove(dev, i, 0);
395 295
@@ -688,25 +588,6 @@ void pci_disable_sriov(struct pci_dev *dev)
688EXPORT_SYMBOL_GPL(pci_disable_sriov); 588EXPORT_SYMBOL_GPL(pci_disable_sriov);
689 589
690/** 590/**
691 * pci_sriov_migration - notify SR-IOV core of Virtual Function Migration
692 * @dev: the PCI device
693 *
694 * Returns IRQ_HANDLED if the IRQ is handled, or IRQ_NONE if not.
695 *
696 * Physical Function driver is responsible to register IRQ handler using
697 * VF Migration Interrupt Message Number, and call this function when the
698 * interrupt is generated by the hardware.
699 */
700irqreturn_t pci_sriov_migration(struct pci_dev *dev)
701{
702 if (!dev->is_physfn)
703 return IRQ_NONE;
704
705 return sriov_migration(dev) ? IRQ_HANDLED : IRQ_NONE;
706}
707EXPORT_SYMBOL_GPL(pci_sriov_migration);
708
709/**
710 * pci_num_vf - return number of VFs associated with a PF device_release_driver 591 * pci_num_vf - return number of VFs associated with a PF device_release_driver
711 * @dev: the PCI device 592 * @dev: the PCI device
712 * 593 *
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index 4df38df224f4..6bd082299e31 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -1,8 +1,6 @@
1#ifndef DRIVERS_PCI_H 1#ifndef DRIVERS_PCI_H
2#define DRIVERS_PCI_H 2#define DRIVERS_PCI_H
3 3
4#include <linux/workqueue.h>
5
6#define PCI_CFG_SPACE_SIZE 256 4#define PCI_CFG_SPACE_SIZE 256
7#define PCI_CFG_SPACE_EXP_SIZE 4096 5#define PCI_CFG_SPACE_EXP_SIZE 4096
8 6
@@ -240,8 +238,6 @@ struct pci_sriov {
240 struct pci_dev *dev; /* lowest numbered PF */ 238 struct pci_dev *dev; /* lowest numbered PF */
241 struct pci_dev *self; /* this PF */ 239 struct pci_dev *self; /* this PF */
242 struct mutex lock; /* lock for VF bus */ 240 struct mutex lock; /* lock for VF bus */
243 struct work_struct mtask; /* VF Migration task */
244 u8 __iomem *mstate; /* VF Migration State Array */
245}; 241};
246 242
247#ifdef CONFIG_PCI_ATS 243#ifdef CONFIG_PCI_ATS
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 27b1b9b6dba5..d47b352c2e11 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -29,7 +29,6 @@
29#include <linux/atomic.h> 29#include <linux/atomic.h>
30#include <linux/device.h> 30#include <linux/device.h>
31#include <linux/io.h> 31#include <linux/io.h>
32#include <linux/irqreturn.h>
33#include <uapi/linux/pci.h> 32#include <uapi/linux/pci.h>
34 33
35#include <linux/pci_ids.h> 34#include <linux/pci_ids.h>
@@ -1600,7 +1599,6 @@ void __iomem *pci_ioremap_bar(struct pci_dev *pdev, int bar);
1600#ifdef CONFIG_PCI_IOV 1599#ifdef CONFIG_PCI_IOV
1601int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn); 1600int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn);
1602void pci_disable_sriov(struct pci_dev *dev); 1601void pci_disable_sriov(struct pci_dev *dev);
1603irqreturn_t pci_sriov_migration(struct pci_dev *dev);
1604int pci_num_vf(struct pci_dev *dev); 1602int pci_num_vf(struct pci_dev *dev);
1605int pci_vfs_assigned(struct pci_dev *dev); 1603int pci_vfs_assigned(struct pci_dev *dev);
1606int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs); 1604int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs);
@@ -1609,8 +1607,6 @@ int pci_sriov_get_totalvfs(struct pci_dev *dev);
1609static inline int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn) 1607static inline int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn)
1610{ return -ENODEV; } 1608{ return -ENODEV; }
1611static inline void pci_disable_sriov(struct pci_dev *dev) { } 1609static inline void pci_disable_sriov(struct pci_dev *dev) { }
1612static inline irqreturn_t pci_sriov_migration(struct pci_dev *dev)
1613{ return IRQ_NONE; }
1614static inline int pci_num_vf(struct pci_dev *dev) { return 0; } 1610static inline int pci_num_vf(struct pci_dev *dev) { return 0; }
1615static inline int pci_vfs_assigned(struct pci_dev *dev) 1611static inline int pci_vfs_assigned(struct pci_dev *dev)
1616{ return 0; } 1612{ return 0; }