ppc-pci.h 4.6 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8
/*
 * 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.
 */
9 10
#ifndef _ASM_POWERPC_PPC_PCI_H
#define _ASM_POWERPC_PPC_PCI_H
11
#ifdef __KERNEL__
L
Linus Torvalds 已提交
12

13 14
#ifdef CONFIG_PCI

L
Linus Torvalds 已提交
15 16 17 18 19 20 21 22 23 24 25
#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;

26
extern void find_and_init_phbs(void);
L
Linus Torvalds 已提交
27

28
extern struct pci_dev *isa_bridge_pcidev;	/* may be NULL if no ISA bus */
L
Linus Torvalds 已提交
29

30
/** Bus Unit ID macros; get low and hi 32-bits of the 64-bit BUID */
31 32
#define BUID_HI(buid) upper_32_bits(buid)
#define BUID_LO(buid) lower_32_bits(buid)
33

L
Linus Torvalds 已提交
34 35 36 37 38 39
/* 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);

40 41
extern void pci_devs_phb_init(void);
extern void pci_devs_phb_init_dynamic(struct pci_controller *phb);
L
Linus Torvalds 已提交
42

43
/* From rtas_pci.h */
44 45 46
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);
L
Linus Torvalds 已提交
47

48 49
/* ---- EEH internal-use-only related routines ---- */
#ifdef CONFIG_EEH
50 51 52 53 54 55

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);

56 57
/**
 * eeh_slot_error_detail -- record and EEH error condition to the log
58 59
 * @pdn:      pci device node
 * @severity: EEH_LOG_TEMP_FAILURE or EEH_LOG_PERM_FAILURE
60
 *
61
 * Obtains the EEH error details from the RTAS subsystem,
62 63
 * and then logs these details with the RTAS error log system.
 */
64 65
#define EEH_LOG_TEMP_FAILURE 1
#define EEH_LOG_PERM_FAILURE 2
66 67
void eeh_slot_error_detail (struct pci_dn *pdn, int severity);

68
/**
69
 * rtas_pci_enable - enable IO transfers for this slot
70 71 72 73 74 75 76 77 78
 * @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);

79 80
/**
 * rtas_set_slot_reset -- unfreeze a frozen slot
81
 * @pdn:       pci device node
82 83 84 85 86
 *
 * Clear the EEH-frozen condition on a slot.  This routine
 * does this by asserting the PCI #RST line for 1/8th of
 * a second; this routine will sleep while the adapter is
 * being reset.
87 88
 *
 * Returns a non-zero value if the reset failed.
89
 */
90
int rtas_set_slot_reset (struct pci_dn *);
91
int eeh_wait_for_slot_status(struct pci_dn *pdn, int max_wait_msecs);
92

93 94
/** 
 * eeh_restore_bars - Restore device configuration info.
95
 * @pdn:       pci device node
96 97 98 99 100 101 102 103 104 105
 *
 * 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
106
 * @pdn:       pci device node
107 108 109 110 111 112 113 114 115 116
 *
 * 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);
117
int rtas_read_config(struct pci_dn *, int where, int size, u32 *val);
118

L
Linas Vepstas 已提交
119
/**
120 121 122
 * eeh_mark_slot -- set mode flags for pertition endpoint
 * @pdn:       pci device node
 *
L
Linas Vepstas 已提交
123 124 125 126 127 128
 * 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);

129 130 131 132
/**
 * find_device_pe -- Find the associated "Partiationable Endpoint" PE
 * @pdn:       pci device node
 */
133 134
struct device_node * find_device_pe(struct device_node *dn);

135 136 137
void eeh_sysfs_add_device(struct pci_dev *pdev);
void eeh_sysfs_remove_device(struct pci_dev *pdev);

138 139 140 141 142
static inline const char *eeh_pci_name(struct pci_dev *pdev) 
{ 
	return pdev ? pci_name(pdev) : "<null>";
} 

143
#endif /* CONFIG_EEH */
144

145 146 147 148 149
#else /* CONFIG_PCI */
static inline void find_and_init_phbs(void) { }
static inline void init_pci_config_tokens(void) { }
#endif /* !CONFIG_PCI */

150
#endif /* __KERNEL__ */
151
#endif /* _ASM_POWERPC_PPC_PCI_H */