PCI/MSI: Introduce pci_msix_table_size()
Introduce new function pci_msix_table_size() returning the size of the MSI-X table of given PCI device or 0 if the device doesn't support MSI-X. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Reviewed-by: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
This commit is contained in:
parent
a447b77282
commit
a52e2e3513
|
@ -674,6 +674,23 @@ static int msi_free_irqs(struct pci_dev* dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* pci_msix_table_size - return the number of device's MSI-X table entries
|
||||
* @dev: pointer to the pci_dev data structure of MSI-X device function
|
||||
*/
|
||||
int pci_msix_table_size(struct pci_dev *dev)
|
||||
{
|
||||
int pos;
|
||||
u16 control;
|
||||
|
||||
pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
|
||||
if (!pos)
|
||||
return 0;
|
||||
|
||||
pci_read_config_word(dev, msi_control_reg(pos), &control);
|
||||
return multi_msix_capable(control);
|
||||
}
|
||||
|
||||
/**
|
||||
* pci_enable_msix - configure device's MSI-X capability structure
|
||||
* @dev: pointer to the pci_dev data structure of MSI-X device function
|
||||
|
@ -691,9 +708,8 @@ static int msi_free_irqs(struct pci_dev* dev)
|
|||
**/
|
||||
int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec)
|
||||
{
|
||||
int status, pos, nr_entries;
|
||||
int status, nr_entries;
|
||||
int i, j;
|
||||
u16 control;
|
||||
|
||||
if (!entries)
|
||||
return -EINVAL;
|
||||
|
@ -702,9 +718,7 @@ int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec)
|
|||
if (status)
|
||||
return status;
|
||||
|
||||
pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
|
||||
pci_read_config_word(dev, msi_control_reg(pos), &control);
|
||||
nr_entries = multi_msix_capable(control);
|
||||
nr_entries = pci_msix_table_size(dev);
|
||||
if (nvec > nr_entries)
|
||||
return -EINVAL;
|
||||
|
||||
|
|
|
@ -799,6 +799,10 @@ static inline void pci_msi_shutdown(struct pci_dev *dev)
|
|||
static inline void pci_disable_msi(struct pci_dev *dev)
|
||||
{ }
|
||||
|
||||
static inline int pci_msix_table_size(struct pci_dev *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int pci_enable_msix(struct pci_dev *dev,
|
||||
struct msix_entry *entries, int nvec)
|
||||
{
|
||||
|
@ -823,6 +827,7 @@ static inline int pci_msi_enabled(void)
|
|||
extern int pci_enable_msi(struct pci_dev *dev);
|
||||
extern void pci_msi_shutdown(struct pci_dev *dev);
|
||||
extern void pci_disable_msi(struct pci_dev *dev);
|
||||
extern int pci_msix_table_size(struct pci_dev *dev);
|
||||
extern int pci_enable_msix(struct pci_dev *dev,
|
||||
struct msix_entry *entries, int nvec);
|
||||
extern void pci_msix_shutdown(struct pci_dev *dev);
|
||||
|
|
Loading…
Reference in New Issue