
We want access PCI earlier in the init sequence, so refactor the code so that it does not require use of a BSS variable to work. This will allow us to use early malloc() to store information about a PCI hose.
Signed-off-by: Simon Glass sjg@chromium.org ---
arch/x86/cpu/pci.c | 26 +++++++++++++++++++++++--- arch/x86/include/asm/u-boot-x86.h | 3 +++ 2 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/arch/x86/cpu/pci.c b/arch/x86/cpu/pci.c index f35c8b3..a72175d 100644 --- a/arch/x86/cpu/pci.c +++ b/arch/x86/cpu/pci.c @@ -10,6 +10,8 @@ */
#include <common.h> +#include <errno.h> +#include <malloc.h> #include <pci.h> #include <asm/pci.h>
@@ -31,10 +33,8 @@ static struct pci_config_table pci_x86_config_table[] = { {} };
-void pci_init_board(void) +static void pci_setup_hose(struct pci_controller *hose) { - struct pci_controller *hose = &x86_hose; - hose->config_table = pci_x86_config_table; hose->first_busno = 0; hose->last_busno = 0; @@ -44,7 +44,27 @@ void pci_init_board(void) hose->region_count = 1;
pci_setup_type1(hose); +} + +int pci_early_init_hose(struct pci_controller **hosep) +{ + struct pci_controller *hose; + + hose = calloc(1, sizeof(struct pci_controller)); + if (!hose) + return -ENOMEM; + + pci_setup_hose(hose); + *hosep = hose; + + return 0; +} + +void pci_init_board(void) +{ + struct pci_controller *hose = &x86_hose;
+ pci_setup_hose(hose); pci_register_hose(hose);
pci_hose_scan(hose); diff --git a/arch/x86/include/asm/u-boot-x86.h b/arch/x86/include/asm/u-boot-x86.h index 8d5b438..6404cd3 100644 --- a/arch/x86/include/asm/u-boot-x86.h +++ b/arch/x86/include/asm/u-boot-x86.h @@ -37,6 +37,9 @@ int cpu_init_interrupts(void); /* board/.../... */ int dram_init(void);
+struct pci_controller; +int pci_early_init_hose(struct pci_controller **hosep); + int cleanup_before_linux(void); int x86_cleanup_before_linux(void); void x86_enable_caches(void);