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:
parent
9452b7496f
commit
8e2922e357
@ -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 */
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user