x86: spi: Add a way to access the SPI mapping via registers

At present the PCI BDF (bus/device/function) is needed to access the SPI
mapping, since the registers are at BAR0. This doesn't work when PCI
auto-config has not been done yet, since BARs are unassigned.

Add another way to find the mapping, using the MMIO base, if the caller
knows this.

Also add a missing function comment.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
Simon Glass 2020-05-27 06:58:46 -06:00 committed by Bin Meng
parent 9452b7496f
commit 8e2922e357
2 changed files with 36 additions and 8 deletions

View File

@ -31,16 +31,11 @@ static ulong fast_spi_get_bios_region(struct fast_spi_regs *regs,
return bios_start;
}
int fast_spi_get_bios_mmap(pci_dev_t pdev, ulong *map_basep, uint *map_sizep,
uint *offsetp)
int fast_spi_get_bios_mmap_regs(struct fast_spi_regs *regs, ulong *map_basep,
uint *map_sizep, uint *offsetp)
{
struct fast_spi_regs *regs;
ulong bar, base, mmio_base;
ulong base;
/* Special case to find mapping without probing the device */
pci_x86_read_config(pdev, PCI_BASE_ADDRESS_0, &bar, PCI_SIZE_32);
mmio_base = bar & PCI_BASE_ADDRESS_MEM_MASK;
regs = (struct fast_spi_regs *)mmio_base;
base = fast_spi_get_bios_region(regs, map_sizep);
*map_basep = (u32)-*map_sizep - base;
*offsetp = base;
@ -48,6 +43,20 @@ int fast_spi_get_bios_mmap(pci_dev_t pdev, ulong *map_basep, uint *map_sizep,
return 0;
}
int fast_spi_get_bios_mmap(pci_dev_t pdev, ulong *map_basep, uint *map_sizep,
uint *offsetp)
{
struct fast_spi_regs *regs;
ulong bar, mmio_base;
/* Special case to find mapping without probing the device */
pci_x86_read_config(pdev, PCI_BASE_ADDRESS_0, &bar, PCI_SIZE_32);
mmio_base = bar & PCI_BASE_ADDRESS_MEM_MASK;
regs = (struct fast_spi_regs *)mmio_base;
return fast_spi_get_bios_mmap_regs(regs, map_basep, map_sizep, offsetp);
}
int fast_spi_early_init(pci_dev_t pdev, ulong mmio_base)
{
/* Program Temporary BAR for SPI */

View File

@ -64,6 +64,25 @@ check_member(fast_spi_regs, ptdata, 0xd0);
int fast_spi_get_bios_mmap(pci_dev_t pdev, ulong *map_basep, uint *map_sizep,
uint *offsetp);
/**
* fast_spi_get_bios_mmap_regs() - Get memory map for SPI flash given regs
*
* @regs: SPI registers to use
* @map_basep: Returns base memory address for mapped SPI
* @map_sizep: Returns size of mapped SPI
* @offsetp: Returns start offset of SPI flash where the map works
* correctly (offsets before this are not visible)
* @return 0 (always)
*/
int fast_spi_get_bios_mmap_regs(struct fast_spi_regs *regs, ulong *map_basep,
uint *map_sizep, uint *offsetp);
/**
* fast_spi_early_init() - Set up a BAR to use SPI early in U-Boot
*
* @pdev: PCI device to use (this is the Fast SPI device)
* @mmio_base: MMIO base to use to access registers
*/
int fast_spi_early_init(pci_dev_t pdev, ulong mmio_base);
#endif /* ASM_FAST_SPI_H */