Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
powerpc
platforms
pseries
eeh_dev.c
Go to the documentation of this file.
1
/*
2
* The file intends to implement dynamic creation of EEH device, which will
3
* be bound with OF node and PCI device simutaneously. The EEH devices would
4
* be foundamental information for EEH core components to work proerly. Besides,
5
* We have to support multiple situations where dynamic creation of EEH device
6
* is required:
7
*
8
* 1) Before PCI emunation starts, we need create EEH devices according to the
9
* PCI sensitive OF nodes.
10
* 2) When PCI emunation is done, we need do the binding between PCI device and
11
* the associated EEH device.
12
* 3) DR (Dynamic Reconfiguration) would create PCI sensitive OF node. EEH device
13
* will be created while PCI sensitive OF node is detected from DR.
14
* 4) PCI hotplug needs redoing the binding between PCI device and EEH device. If
15
* PHB is newly inserted, we also need create EEH devices accordingly.
16
*
17
* Copyright Benjamin Herrenschmidt & Gavin Shan, IBM Corporation 2012.
18
*
19
* This program is free software; you can redistribute it and/or modify
20
* it under the terms of the GNU General Public License as published by
21
* the Free Software Foundation; either version 2 of the License, or
22
* (at your option) any later version.
23
*
24
* This program is distributed in the hope that it will be useful,
25
* but WITHOUT ANY WARRANTY; without even the implied warranty of
26
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27
* GNU General Public License for more details.
28
*
29
* You should have received a copy of the GNU General Public License
30
* along with this program; if not, write to the Free Software
31
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
32
*/
33
34
#include <linux/export.h>
35
#include <
linux/gfp.h
>
36
#include <
linux/init.h
>
37
#include <linux/kernel.h>
38
#include <linux/pci.h>
39
#include <linux/string.h>
40
41
#include <asm/pci-bridge.h>
42
#include <
asm/ppc-pci.h
>
43
52
void
*
__devinit
eeh_dev_init
(
struct
device_node
*
dn
,
void
*
data
)
53
{
54
struct
pci_controller
*phb =
data
;
55
struct
eeh_dev *edev;
56
57
/* Allocate EEH device */
58
edev = kzalloc(
sizeof
(*edev),
GFP_KERNEL
);
59
if
(!edev) {
60
pr_warning
(
"%s: out of memory\n"
, __func__);
61
return
NULL
;
62
}
63
64
/* Associate EEH device with OF node */
65
PCI_DN(dn)->edev = edev;
66
edev->dn =
dn
;
67
edev->phb = phb;
68
INIT_LIST_HEAD(&edev->list);
69
70
return
NULL
;
71
}
72
80
void
__devinit
eeh_dev_phb_init_dynamic
(
struct
pci_controller
*phb)
81
{
82
struct
device_node
*
dn
= phb->dn;
83
84
/* EEH PE for PHB */
85
eeh_phb_pe_create
(phb);
86
87
/* EEH device for PHB */
88
eeh_dev_init
(dn, phb);
89
90
/* EEH devices for children OF nodes */
91
traverse_pci_devices
(dn,
eeh_dev_init
, phb);
92
}
93
100
static
int
__init
eeh_dev_phb_init(
void
)
101
{
102
struct
pci_controller
*phb, *
tmp
;
103
104
list_for_each_entry_safe
(phb, tmp, &hose_list, list_node)
105
eeh_dev_phb_init_dynamic
(phb);
106
107
pr_info
("EEH: devices
created
\
n
");
108
109
return
0;
110
}
111
112
core_initcall
(eeh_dev_phb_init);
Generated on Thu Jan 10 2013 13:15:52 for Linux Kernel by
1.8.2