diff options
author | Gavin Shan <gwshan@linux.vnet.ibm.com> | 2015-03-26 20:22:17 -0400 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2015-03-30 22:10:39 -0400 |
commit | 433185d2b4e9c25f2a444424c05af72fbadd4275 (patch) | |
tree | 8890e9a7b5560458bdb9d2694b8f0f39633ed5e7 /arch/powerpc/kernel | |
parent | c6406d8fbb014bebdfb5bf3c244548958aec7379 (diff) |
powerpc/eeh: Fix PE#0 check in eeh_add_to_parent_pe()
The function eeh_add_parent_pe() is used to create a PE or add one
edev to its parent PE. Current code checks if PE#0 is valid for the
later case. Actually, we should validate PE#0 for both cases when
EEH core regards PE#0 as invalid one (without flag EEH_VALID_PE_ZERO).
Otherwise, not all EEH devices can be added to its parent PE#0 for
EEH on P7IOC.
The patch fixes the issue by validating PE#0 for the two cases. So far,
we don't have PE#0 for EEH on P7IOC, but it will show up when we enable
M64 for P7IOC. The patch also makes the error message more meaningful.
Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/kernel')
-rw-r--r-- | arch/powerpc/kernel/eeh_pe.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/arch/powerpc/kernel/eeh_pe.c b/arch/powerpc/kernel/eeh_pe.c index f33ceccf6876..35f0b62259bb 100644 --- a/arch/powerpc/kernel/eeh_pe.c +++ b/arch/powerpc/kernel/eeh_pe.c | |||
@@ -328,6 +328,13 @@ int eeh_add_to_parent_pe(struct eeh_dev *edev) | |||
328 | { | 328 | { |
329 | struct eeh_pe *pe, *parent; | 329 | struct eeh_pe *pe, *parent; |
330 | 330 | ||
331 | /* Check if the PE number is valid */ | ||
332 | if (!eeh_has_flag(EEH_VALID_PE_ZERO) && !edev->pe_config_addr) { | ||
333 | pr_err("%s: Invalid PE#0 for edev 0x%x on PHB#%d\n", | ||
334 | __func__, edev->config_addr, edev->phb->global_number); | ||
335 | return -EINVAL; | ||
336 | } | ||
337 | |||
331 | /* | 338 | /* |
332 | * Search the PE has been existing or not according | 339 | * Search the PE has been existing or not according |
333 | * to the PE address. If that has been existing, the | 340 | * to the PE address. If that has been existing, the |
@@ -336,12 +343,6 @@ int eeh_add_to_parent_pe(struct eeh_dev *edev) | |||
336 | */ | 343 | */ |
337 | pe = eeh_pe_get(edev); | 344 | pe = eeh_pe_get(edev); |
338 | if (pe && !(pe->type & EEH_PE_INVALID)) { | 345 | if (pe && !(pe->type & EEH_PE_INVALID)) { |
339 | if (!edev->pe_config_addr) { | ||
340 | pr_err("%s: PE with addr 0x%x already exists\n", | ||
341 | __func__, edev->config_addr); | ||
342 | return -EEXIST; | ||
343 | } | ||
344 | |||
345 | /* Mark the PE as type of PCI bus */ | 346 | /* Mark the PE as type of PCI bus */ |
346 | pe->type = EEH_PE_BUS; | 347 | pe->type = EEH_PE_BUS; |
347 | edev->pe = pe; | 348 | edev->pe = pe; |