Skip to content
Snippets Groups Projects
Commit 715d8f76 authored by Ed Swarthout's avatar Ed Swarthout Committed by Kumar Gala
Browse files

fsl_pci_init_port end-point initialization is broken


commit 70ed869e broke fsl pcie end-point initialization.
Returning 0 is not correct.  The function must return the first free
bus number for the next controller.

fsl_pci_init() must still be called and a bus allocated even if the
controller is an end-point.

Signed-off-by: default avatarEd Swarthout <Ed.Swarthout@freescale.com>
Acked-by: default avatarVivek Mahajan <vivek.mahajan@freescale.com>
Signed-off-by: default avatarKumar Gala <galak@kernel.crashing.org>
parent 01471d53
No related branches found
No related tags found
No related merge requests found
/* /*
* Copyright 2007 Freescale Semiconductor, Inc. * Copyright 2007-2009 Freescale Semiconductor, Inc.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
...@@ -42,6 +42,7 @@ DECLARE_GLOBAL_DATA_PTR; ...@@ -42,6 +42,7 @@ DECLARE_GLOBAL_DATA_PTR;
#define FSL_PCI_PBFR 0x44 #define FSL_PCI_PBFR 0x44
#define FSL_PCIE_CAP_ID 0x4c #define FSL_PCIE_CAP_ID 0x4c
#define FSL_PCIE_CFG_RDY 0x4b0 #define FSL_PCIE_CFG_RDY 0x4b0
#define FSL_PROG_IF_AGENT 0x1
void pciauto_prescan_setup_bridge(struct pci_controller *hose, void pciauto_prescan_setup_bridge(struct pci_controller *hose,
pci_dev_t dev, int sub_bus); pci_dev_t dev, int sub_bus);
...@@ -412,6 +413,16 @@ void fsl_pci_init(struct pci_controller *hose, u32 cfg_addr, u32 cfg_data) ...@@ -412,6 +413,16 @@ void fsl_pci_init(struct pci_controller *hose, u32 cfg_addr, u32 cfg_data)
} }
} }
int fsl_is_pci_agent(struct pci_controller *hose)
{
u8 prog_if;
pci_dev_t dev = PCI_BDF(hose->first_busno, 0, 0);
pci_hose_read_config_byte(hose, dev, PCI_CLASS_PROG, &prog_if);
return (prog_if == FSL_PROG_IF_AGENT);
}
int fsl_pci_init_port(struct fsl_pci_info *pci_info, int fsl_pci_init_port(struct fsl_pci_info *pci_info,
struct pci_controller *hose, int busno) struct pci_controller *hose, int busno)
{ {
...@@ -450,6 +461,11 @@ int fsl_pci_init_port(struct fsl_pci_info *pci_info, ...@@ -450,6 +461,11 @@ int fsl_pci_init_port(struct fsl_pci_info *pci_info,
fsl_pci_init(hose, (u32)&pci->cfg_addr, (u32)&pci->cfg_data); fsl_pci_init(hose, (u32)&pci->cfg_addr, (u32)&pci->cfg_data);
if (fsl_is_pci_agent(hose)) {
fsl_pci_config_unlock(hose);
hose->last_busno = hose->first_busno;
}
printf(" PCIE%x on bus %02x - %02x\n", pci_info->pci_num, printf(" PCIE%x on bus %02x - %02x\n", pci_info->pci_num,
hose->first_busno, hose->last_busno); hose->first_busno, hose->last_busno);
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
int is_fsl_pci_agent(enum law_trgt_if trgt, u32 host_agent); int is_fsl_pci_agent(enum law_trgt_if trgt, u32 host_agent);
int is_fsl_pci_cfg(enum law_trgt_if trgt, u32 io_sel); int is_fsl_pci_cfg(enum law_trgt_if trgt, u32 io_sel);
int fsl_is_pci_agent(struct pci_controller *hose);
void fsl_pci_init(struct pci_controller *hose, u32 cfg_addr, u32 cfg_data); void fsl_pci_init(struct pci_controller *hose, u32 cfg_addr, u32 cfg_data);
void fsl_pci_config_unlock(struct pci_controller *hose); void fsl_pci_config_unlock(struct pci_controller *hose);
void ft_fsl_pci_setup(void *blob, const char *pci_alias, void ft_fsl_pci_setup(void *blob, const char *pci_alias,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment