2005-04-17 02:20:36 +04:00
/*
* c 2001 PPC 64 Team , IBM Corp
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version
* 2 of the License , or ( at your option ) any later version .
*/
2005-09-27 20:50:25 +04:00
# ifndef _ASM_POWERPC_PPC_PCI_H
# define _ASM_POWERPC_PPC_PCI_H
2005-12-17 00:43:46 +03:00
# ifdef __KERNEL__
2005-04-17 02:20:36 +04:00
# include <linux/pci.h>
# include <asm/pci-bridge.h>
extern unsigned long isa_io_base ;
extern void pci_setup_phb_io ( struct pci_controller * hose , int primary ) ;
extern void pci_setup_phb_io_dynamic ( struct pci_controller * hose , int primary ) ;
extern struct list_head hose_list ;
extern int global_phb_number ;
extern unsigned long find_and_init_phbs ( void ) ;
extern struct pci_dev * ppc64_isabridge_dev ; /* may be NULL if no ISA bus */
2005-11-04 03:42:26 +03:00
/** Bus Unit ID macros; get low and hi 32-bits of the 64-bit BUID */
# define BUID_HI(buid) ((buid) >> 32)
# define BUID_LO(buid) ((buid) & 0xffffffff)
2005-04-17 02:20:36 +04:00
/* PCI device_node operations */
struct device_node ;
typedef void * ( * traverse_func ) ( struct device_node * me , void * data ) ;
void * traverse_pci_devices ( struct device_node * start , traverse_func pre ,
void * data ) ;
2006-11-11 09:25:08 +03:00
extern void pci_devs_phb_init ( void ) ;
extern void pci_devs_phb_init_dynamic ( struct pci_controller * phb ) ;
extern void scan_phb ( struct pci_controller * hose ) ;
2005-04-17 02:20:36 +04:00
2005-06-23 11:09:54 +04:00
/* From rtas_pci.h */
2006-11-11 09:25:08 +03:00
extern void init_pci_config_tokens ( void ) ;
extern unsigned long get_phb_buid ( struct device_node * ) ;
extern int rtas_setup_phb ( struct pci_controller * phb ) ;
2005-04-17 02:20:36 +04:00
2005-06-23 11:09:54 +04:00
/* From pSeries_pci.h */
extern void pSeries_final_fixup ( void ) ;
2005-04-17 02:20:36 +04:00
extern unsigned long pci_probe_only ;
2005-11-04 03:50:10 +03:00
/* ---- EEH internal-use-only related routines ---- */
# ifdef CONFIG_EEH
2005-11-04 03:53:07 +03:00
void pci_addr_cache_insert_device ( struct pci_dev * dev ) ;
void pci_addr_cache_remove_device ( struct pci_dev * dev ) ;
void pci_addr_cache_build ( void ) ;
struct pci_dev * pci_get_device_by_addr ( unsigned long addr ) ;
2005-11-04 03:52:49 +03:00
/**
* eeh_slot_error_detail - - record and EEH error condition to the log
* @ severity : 1 if temporary , 2 if permanent failure .
*
* Obtains the the EEH error details from the RTAS subsystem ,
* and then logs these details with the RTAS error log system .
*/
void eeh_slot_error_detail ( struct pci_dn * pdn , int severity ) ;
2006-09-16 03:57:42 +04:00
/**
* rtas_pci_enableo - enable IO transfers for this slot
* @ pdn : pci device node
* @ function : either EEH_THAW_MMIO or EEH_THAW_DMA
*
* Enable I / O transfers to this slot
*/
# define EEH_THAW_MMIO 2
# define EEH_THAW_DMA 3
int rtas_pci_enable ( struct pci_dn * pdn , int function ) ;
2005-11-04 03:50:10 +03:00
/**
* rtas_set_slot_reset - - unfreeze a frozen slot
*
* Clear the EEH - frozen condition on a slot . This routine
* does this by asserting the PCI # RST line for 1 / 8 th of
* a second ; this routine will sleep while the adapter is
* being reset .
2005-11-04 03:54:54 +03:00
*
* Returns a non - zero value if the reset failed .
2005-11-04 03:50:10 +03:00
*/
2005-11-04 03:54:54 +03:00
int rtas_set_slot_reset ( struct pci_dn * ) ;
2005-11-04 03:50:10 +03:00
2005-11-04 03:50:17 +03:00
/**
* eeh_restore_bars - Restore device configuration info .
*
* A reset of a PCI device will clear out its config space .
* This routines will restore the config space for this
* device , and is children , to values previously obtained
* from the firmware .
*/
void eeh_restore_bars ( struct pci_dn * ) ;
/**
* rtas_configure_bridge - - firmware initialization of pci bridge
*
* Ask the firmware to configure all PCI bridges devices
* located behind the indicated node . Required after a
* pci device reset . Does essentially the same hing as
* eeh_restore_bars , but for brdges , and lets firmware
* do the work .
*/
void rtas_configure_bridge ( struct pci_dn * ) ;
int rtas_write_config ( struct pci_dn * , int where , int size , u32 val ) ;
2005-11-04 03:55:19 +03:00
int rtas_read_config ( struct pci_dn * , int where , int size , u32 * val ) ;
2005-11-04 03:50:17 +03:00
2005-11-04 03:50:48 +03:00
/**
* mark and clear slots : find " partition endpoint " PE and set or
* clear the flags for each subnode of the PE .
*/
void eeh_mark_slot ( struct device_node * dn , int mode_flag ) ;
void eeh_clear_slot ( struct device_node * dn , int mode_flag ) ;
2005-11-04 03:54:29 +03:00
/* Find the associated "Partiationable Endpoint" PE */
struct device_node * find_device_pe ( struct device_node * dn ) ;
2005-11-04 03:50:10 +03:00
# endif
2005-12-17 00:43:46 +03:00
# endif /* __KERNEL__ */
2005-09-27 20:50:25 +04:00
# endif /* _ASM_POWERPC_PPC_PCI_H */