2008-10-13 15:18:07 +04:00
# ifndef DRIVERS_PCI_H
# define DRIVERS_PCI_H
# define PCI_CFG_SPACE_SIZE 256
# define PCI_CFG_SPACE_EXP_SIZE 4096
2005-04-17 02:20:36 +04:00
/* Functions internal to the PCI core code */
2007-08-14 17:15:12 +04:00
extern int pci_uevent ( struct device * dev , struct kobj_uevent_env * env ) ;
2005-04-17 02:20:36 +04:00
extern int pci_create_sysfs_dev_files ( struct pci_dev * pdev ) ;
extern void pci_remove_sysfs_dev_files ( struct pci_dev * pdev ) ;
extern void pci_cleanup_rom ( struct pci_dev * dev ) ;
2007-07-17 08:27:10 +04:00
2008-07-07 05:32:02 +04:00
/**
* Firmware PM callbacks
*
* @ is_manageable - returns ' true ' if given device is power manageable by the
* platform firmware
*
* @ set_state - invokes the platform firmware to set the device ' s power state
*
* @ choose_state - returns PCI power state of given device preferred by the
* platform ; to be used during system - wide transitions from a
* sleeping state to the working state and vice versa
*
2008-07-07 05:34:48 +04:00
* @ can_wakeup - returns ' true ' if given device is capable of waking up the
* system from a sleeping state
*
* @ sleep_wake - enables / disables the system wake up capability of given device
*
2008-07-07 05:32:02 +04:00
* If given platform is generally capable of power managing PCI devices , all of
* these callbacks are mandatory .
*/
struct pci_platform_pm_ops {
bool ( * is_manageable ) ( struct pci_dev * dev ) ;
int ( * set_state ) ( struct pci_dev * dev , pci_power_t state ) ;
pci_power_t ( * choose_state ) ( struct pci_dev * dev ) ;
2008-07-07 05:34:48 +04:00
bool ( * can_wakeup ) ( struct pci_dev * dev ) ;
int ( * sleep_wake ) ( struct pci_dev * dev , bool enable ) ;
2008-07-07 05:32:02 +04:00
} ;
extern int pci_set_platform_pm ( struct pci_platform_pm_ops * ops ) ;
2008-07-07 05:34:48 +04:00
extern void pci_pm_init ( struct pci_dev * dev ) ;
2005-03-19 08:15:48 +03:00
2005-09-27 12:21:55 +04:00
extern int pci_user_read_config_byte ( struct pci_dev * dev , int where , u8 * val ) ;
extern int pci_user_read_config_word ( struct pci_dev * dev , int where , u16 * val ) ;
extern int pci_user_read_config_dword ( struct pci_dev * dev , int where , u32 * val ) ;
extern int pci_user_write_config_byte ( struct pci_dev * dev , int where , u8 val ) ;
extern int pci_user_write_config_word ( struct pci_dev * dev , int where , u16 val ) ;
extern int pci_user_write_config_dword ( struct pci_dev * dev , int where , u32 val ) ;
2008-03-05 19:52:39 +03:00
struct pci_vpd_ops {
int ( * read ) ( struct pci_dev * dev , int pos , int size , char * buf ) ;
int ( * write ) ( struct pci_dev * dev , int pos , int size , const char * buf ) ;
void ( * release ) ( struct pci_dev * dev ) ;
} ;
struct pci_vpd {
2008-07-02 21:59:04 +04:00
unsigned int len ;
2008-03-05 19:52:39 +03:00
struct pci_vpd_ops * ops ;
struct bin_attribute * attr ; /* descriptor for sysfs VPD entry */
} ;
extern int pci_vpd_pci22_init ( struct pci_dev * dev ) ;
static inline void pci_vpd_release ( struct pci_dev * dev )
{
if ( dev - > vpd )
dev - > vpd - > ops - > release ( dev ) ;
}
2005-04-17 02:20:36 +04:00
/* PCI /proc functions */
# ifdef CONFIG_PROC_FS
extern int pci_proc_attach_device ( struct pci_dev * dev ) ;
extern int pci_proc_detach_device ( struct pci_dev * dev ) ;
extern int pci_proc_detach_bus ( struct pci_bus * bus ) ;
# else
static inline int pci_proc_attach_device ( struct pci_dev * dev ) { return 0 ; }
static inline int pci_proc_detach_device ( struct pci_dev * dev ) { return 0 ; }
static inline int pci_proc_detach_bus ( struct pci_bus * bus ) { return 0 ; }
# endif
/* Functions for PCI Hotplug drivers to use */
extern unsigned int pci_do_scan_bus ( struct pci_bus * bus ) ;
extern void pci_remove_legacy_files ( struct pci_bus * bus ) ;
/* Lock for read/write access to pci device and bus lists */
2006-06-02 08:35:43 +04:00
extern struct rw_semaphore pci_bus_sem ;
2005-04-17 02:20:36 +04:00
2006-07-12 19:59:00 +04:00
extern unsigned int pci_pm_d3_delay ;
2007-01-25 11:34:07 +03:00
2005-08-17 02:16:05 +04:00
# ifdef CONFIG_PCI_MSI
2006-03-06 08:33:34 +03:00
void pci_no_msi ( void ) ;
2007-04-05 11:19:10 +04:00
extern void pci_msi_init_pci_dev ( struct pci_dev * dev ) ;
2005-08-17 02:16:05 +04:00
# else
2006-03-06 08:33:34 +03:00
static inline void pci_no_msi ( void ) { }
2007-04-05 11:19:10 +04:00
static inline void pci_msi_init_pci_dev ( struct pci_dev * dev ) { }
2005-08-17 02:16:05 +04:00
# endif
2007-01-25 11:34:08 +03:00
2007-10-06 00:17:58 +04:00
# ifdef CONFIG_PCIEAER
void pci_no_aer ( void ) ;
# else
static inline void pci_no_aer ( void ) { }
# endif
2006-07-12 19:59:00 +04:00
static inline int pci_no_d1d2 ( struct pci_dev * dev )
{
unsigned int parent_dstates = 0 ;
2005-08-17 02:16:05 +04:00
2006-07-12 19:59:00 +04:00
if ( dev - > bus - > self )
parent_dstates = dev - > bus - > self - > no_d1d2 ;
return ( dev - > no_d1d2 | | parent_dstates ) ;
}
2005-04-17 02:20:36 +04:00
extern int pcie_mch_quirk ;
extern struct device_attribute pci_dev_attrs [ ] ;
2007-05-23 06:47:54 +04:00
extern struct device_attribute dev_attr_cpuaffinity ;
2008-09-06 16:46:42 +04:00
extern struct device_attribute dev_attr_cpulistaffinity ;
2005-04-17 02:20:36 +04:00
/**
* pci_match_one_device - Tell if a PCI device structure has a matching
* PCI device id structure
* @ id : single PCI device id structure to match
* @ dev : the PCI device structure to match against
2008-01-31 02:21:33 +03:00
*
2005-04-17 02:20:36 +04:00
* Returns the matching pci_device_id structure or % NULL if there is no match .
*/
static inline const struct pci_device_id *
pci_match_one_device ( const struct pci_device_id * id , const struct pci_dev * dev )
{
if ( ( id - > vendor = = PCI_ANY_ID | | id - > vendor = = dev - > vendor ) & &
( id - > device = = PCI_ANY_ID | | id - > device = = dev - > device ) & &
( id - > subvendor = = PCI_ANY_ID | | id - > subvendor = = dev - > subsystem_vendor ) & &
( id - > subdevice = = PCI_ANY_ID | | id - > subdevice = = dev - > subsystem_device ) & &
! ( ( id - > class ^ dev - > class ) & id - > class_mask ) )
return id ;
return NULL ;
}
2007-10-22 03:41:46 +04:00
struct pci_dev * pci_find_upstream_pcie_bridge ( struct pci_dev * pdev ) ;
2008-06-11 01:28:50 +04:00
/* PCI slot sysfs helper code */
# define to_pci_slot(s) container_of(s, struct pci_slot, kobj)
extern struct kset * pci_slots_kset ;
struct pci_slot_attribute {
struct attribute attr ;
ssize_t ( * show ) ( struct pci_slot * , char * ) ;
ssize_t ( * store ) ( struct pci_slot * , const char * , size_t ) ;
} ;
# define to_pci_slot_attr(s) container_of(s, struct pci_slot_attribute, attr)
2008-10-14 10:02:53 +04:00
extern void pci_enable_ari ( struct pci_dev * dev ) ;
/**
* pci_ari_enabled - query ARI forwarding status
* @ dev : the PCI device
*
* Returns 1 if ARI forwarding is enabled , or 0 if not enabled ;
*/
static inline int pci_ari_enabled ( struct pci_dev * dev )
{
return dev - > ari_enabled ;
}
2008-10-13 15:18:07 +04:00
# endif /* DRIVERS_PCI_H */