mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 23:24:38 +00:00
pci: Make pci apis usable before relocation
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>
This commit is contained in:
parent
fa5530b85d
commit
8f9052fd98
5 changed files with 28 additions and 14 deletions
|
@ -30,7 +30,7 @@ int pci_early_init_hose(struct pci_controller **hosep)
|
|||
board_pci_setup_hose(hose);
|
||||
pci_setup_type1(hose);
|
||||
hose->last_busno = pci_hose_scan(hose);
|
||||
gd->arch.hose = hose;
|
||||
gd->hose = hose;
|
||||
*hosep = hose;
|
||||
|
||||
return 0;
|
||||
|
@ -51,7 +51,7 @@ void pci_init_board(void)
|
|||
struct pci_controller *hose = &x86_hose;
|
||||
|
||||
/* Stop using the early hose */
|
||||
gd->arch.hose = NULL;
|
||||
gd->hose = NULL;
|
||||
|
||||
board_pci_setup_hose(hose);
|
||||
pci_setup_type1(hose);
|
||||
|
@ -64,8 +64,8 @@ void pci_init_board(void)
|
|||
|
||||
static struct pci_controller *get_hose(void)
|
||||
{
|
||||
if (gd->arch.hose)
|
||||
return gd->arch.hose;
|
||||
if (gd->hose)
|
||||
return gd->hose;
|
||||
|
||||
return pci_bus_to_hose(0);
|
||||
}
|
||||
|
|
|
@ -43,7 +43,6 @@ struct arch_global_data {
|
|||
uint32_t tsc_mhz; /* TSC frequency in MHz */
|
||||
void *new_fdt; /* Relocated FDT */
|
||||
uint32_t bist; /* Built-in self test value */
|
||||
struct pci_controller *hose; /* PCI hose for early use */
|
||||
enum pei_boot_mode_t pei_boot_mode;
|
||||
const struct pch_gpio_map *gpio_map; /* board GPIO map */
|
||||
struct memory_info meminfo; /* Memory information */
|
||||
|
|
|
@ -29,7 +29,7 @@ void board_pci_setup_hose(struct pci_controller *hose);
|
|||
* pci_early_init_hose() - Set up PCI host before relocation
|
||||
*
|
||||
* This allocates memory for, sets up and returns the PCI hose. It can be
|
||||
* called before relocation. The hose will be stored in gd->arch.hose for
|
||||
* called before relocation. The hose will be stored in gd->hose for
|
||||
* later use, but will become invalid one DRAM is available.
|
||||
*/
|
||||
int pci_early_init_hose(struct pci_controller **hosep);
|
||||
|
|
|
@ -19,6 +19,8 @@
|
|||
#include <asm/io.h>
|
||||
#include <pci.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
#define PCI_HOSE_OP(rw, size, type) \
|
||||
int pci_hose_##rw##_config_##size(struct pci_controller *hose, \
|
||||
pci_dev_t dev, \
|
||||
|
@ -123,6 +125,14 @@ void *pci_map_bar(pci_dev_t pdev, int bar, int flags)
|
|||
|
||||
static struct pci_controller* hose_head;
|
||||
|
||||
struct pci_controller *pci_get_hose_head(void)
|
||||
{
|
||||
if (gd->hose)
|
||||
return gd->hose;
|
||||
|
||||
return hose_head;
|
||||
}
|
||||
|
||||
void pci_register_hose(struct pci_controller* hose)
|
||||
{
|
||||
struct pci_controller **phose = &hose_head;
|
||||
|
@ -139,7 +149,7 @@ struct pci_controller *pci_bus_to_hose(int bus)
|
|||
{
|
||||
struct pci_controller *hose;
|
||||
|
||||
for (hose = hose_head; hose; hose = hose->next) {
|
||||
for (hose = pci_get_hose_head(); hose; hose = hose->next) {
|
||||
if (bus >= hose->first_busno && bus <= hose->last_busno)
|
||||
return hose;
|
||||
}
|
||||
|
@ -152,7 +162,7 @@ struct pci_controller *find_hose_by_cfg_addr(void *cfg_addr)
|
|||
{
|
||||
struct pci_controller *hose;
|
||||
|
||||
for (hose = hose_head; hose; hose = hose->next) {
|
||||
for (hose = pci_get_hose_head(); hose; hose = hose->next) {
|
||||
if (hose->cfg_addr == cfg_addr)
|
||||
return hose;
|
||||
}
|
||||
|
@ -162,7 +172,7 @@ struct pci_controller *find_hose_by_cfg_addr(void *cfg_addr)
|
|||
|
||||
int pci_last_busno(void)
|
||||
{
|
||||
struct pci_controller *hose = hose_head;
|
||||
struct pci_controller *hose = pci_get_hose_head();
|
||||
|
||||
if (!hose)
|
||||
return -1;
|
||||
|
@ -181,7 +191,7 @@ pci_dev_t pci_find_devices(struct pci_device_id *ids, int index)
|
|||
pci_dev_t bdf;
|
||||
int i, bus, found_multi = 0;
|
||||
|
||||
for (hose = hose_head; hose; hose = hose->next) {
|
||||
for (hose = pci_get_hose_head(); hose; hose = hose->next) {
|
||||
#ifdef CONFIG_SYS_SCSI_SCAN_BUS_REVERSE
|
||||
for (bus = hose->last_busno; bus >= hose->first_busno; bus--)
|
||||
#else
|
||||
|
@ -233,7 +243,7 @@ pci_dev_t pci_find_devices(struct pci_device_id *ids, int index)
|
|||
|
||||
pci_dev_t pci_find_device(unsigned int vendor, unsigned int device, int index)
|
||||
{
|
||||
static struct pci_device_id ids[2] = {{}, {0, 0}};
|
||||
struct pci_device_id ids[2] = { {}, {0, 0} };
|
||||
|
||||
ids[0].vendor = vendor;
|
||||
ids[0].device = device;
|
||||
|
@ -709,11 +719,10 @@ int pci_hose_scan_bus(struct pci_controller *hose, int bus)
|
|||
int pci_hose_scan(struct pci_controller *hose)
|
||||
{
|
||||
#if defined(CONFIG_PCI_BOOTDELAY)
|
||||
static int pcidelay_done;
|
||||
char *s;
|
||||
int i;
|
||||
|
||||
if (!pcidelay_done) {
|
||||
if (!gd->pcidelay_done) {
|
||||
/* wait "pcidelay" ms (if defined)... */
|
||||
s = getenv("pcidelay");
|
||||
if (s) {
|
||||
|
@ -721,7 +730,7 @@ int pci_hose_scan(struct pci_controller *hose)
|
|||
for (i = 0; i < val; i++)
|
||||
udelay(1000);
|
||||
}
|
||||
pcidelay_done = 1;
|
||||
gd->pcidelay_done = 1;
|
||||
}
|
||||
#endif /* CONFIG_PCI_BOOTDELAY */
|
||||
|
||||
|
|
|
@ -90,6 +90,12 @@ typedef struct global_data {
|
|||
unsigned long malloc_base; /* base address of early malloc() */
|
||||
unsigned long malloc_limit; /* limit address */
|
||||
unsigned long malloc_ptr; /* current address */
|
||||
#endif
|
||||
#ifdef CONFIG_PCI
|
||||
struct pci_controller *hose; /* PCI hose for early use */
|
||||
#endif
|
||||
#ifdef CONFIG_PCI_BOOTDELAY
|
||||
int pcidelay_done;
|
||||
#endif
|
||||
struct udevice *cur_serial_dev; /* current serial device */
|
||||
struct arch_global_data arch; /* architecture-specific data */
|
||||
|
|
Loading…
Reference in a new issue