mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-09-07 13:23:20 +09:00
![Bin Meng](/assets/img/avatar_default.png)
Introduce a gd->hose to save the pci hose in the early phase so that apis in drivers/pci/pci.c can be used before relocation. Architecture codes need assign a valid gd->hose in the early phase. Some variables are declared as static so change them to be either stack variable or global data member so that they can be used before relocation, except the 'indent' used by CONFIG_PCI_SCAN_SHOW which just affects some print format. Signed-off-by: Bin Meng <bmeng.cn@gmail.com> Acked-by: Simon Glass <sjg@chromium.org>
114 lines
2.1 KiB
C
114 lines
2.1 KiB
C
/*
|
|
* Copyright (c) 2011 The Chromium OS Authors.
|
|
* (C) Copyright 2008,2009
|
|
* Graeme Russ, <graeme.russ@gmail.com>
|
|
*
|
|
* (C) Copyright 2002
|
|
* Daniel Engström, Omicron Ceti AB, <daniel@omicron.se>
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0+
|
|
*/
|
|
|
|
#include <common.h>
|
|
#include <errno.h>
|
|
#include <malloc.h>
|
|
#include <pci.h>
|
|
#include <asm/pci.h>
|
|
|
|
DECLARE_GLOBAL_DATA_PTR;
|
|
|
|
static struct pci_controller x86_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;
|
|
|
|
board_pci_setup_hose(hose);
|
|
pci_setup_type1(hose);
|
|
hose->last_busno = pci_hose_scan(hose);
|
|
gd->hose = hose;
|
|
*hosep = hose;
|
|
|
|
return 0;
|
|
}
|
|
|
|
__weak int board_pci_pre_scan(struct pci_controller *hose)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
__weak int board_pci_post_scan(struct pci_controller *hose)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
void pci_init_board(void)
|
|
{
|
|
struct pci_controller *hose = &x86_hose;
|
|
|
|
/* Stop using the early hose */
|
|
gd->hose = NULL;
|
|
|
|
board_pci_setup_hose(hose);
|
|
pci_setup_type1(hose);
|
|
pci_register_hose(hose);
|
|
|
|
board_pci_pre_scan(hose);
|
|
hose->last_busno = pci_hose_scan(hose);
|
|
board_pci_post_scan(hose);
|
|
}
|
|
|
|
static struct pci_controller *get_hose(void)
|
|
{
|
|
if (gd->hose)
|
|
return gd->hose;
|
|
|
|
return pci_bus_to_hose(0);
|
|
}
|
|
|
|
unsigned int pci_read_config8(pci_dev_t dev, unsigned where)
|
|
{
|
|
uint8_t value;
|
|
|
|
pci_hose_read_config_byte(get_hose(), dev, where, &value);
|
|
|
|
return value;
|
|
}
|
|
|
|
unsigned int pci_read_config16(pci_dev_t dev, unsigned where)
|
|
{
|
|
uint16_t value;
|
|
|
|
pci_hose_read_config_word(get_hose(), dev, where, &value);
|
|
|
|
return value;
|
|
}
|
|
|
|
unsigned int pci_read_config32(pci_dev_t dev, unsigned where)
|
|
{
|
|
uint32_t value;
|
|
|
|
pci_hose_read_config_dword(get_hose(), dev, where, &value);
|
|
|
|
return value;
|
|
}
|
|
|
|
void pci_write_config8(pci_dev_t dev, unsigned where, unsigned value)
|
|
{
|
|
pci_hose_write_config_byte(get_hose(), dev, where, value);
|
|
}
|
|
|
|
void pci_write_config16(pci_dev_t dev, unsigned where, unsigned value)
|
|
{
|
|
pci_hose_write_config_word(get_hose(), dev, where, value);
|
|
}
|
|
|
|
void pci_write_config32(pci_dev_t dev, unsigned where, unsigned value)
|
|
{
|
|
pci_hose_write_config_dword(get_hose(), dev, where, value);
|
|
}
|