mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-06-09 23:36:03 +09:00
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;
|
return bios_start;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fast_spi_get_bios_mmap(pci_dev_t pdev, ulong *map_basep, uint *map_sizep,
|
int fast_spi_get_bios_mmap_regs(struct fast_spi_regs *regs, ulong *map_basep,
|
||||||
uint *offsetp)
|
uint *map_sizep, uint *offsetp)
|
||||||
{
|
{
|
||||||
struct fast_spi_regs *regs;
|
ulong base;
|
||||||
ulong bar, base, 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;
|
|
||||||
base = fast_spi_get_bios_region(regs, map_sizep);
|
base = fast_spi_get_bios_region(regs, map_sizep);
|
||||||
*map_basep = (u32)-*map_sizep - base;
|
*map_basep = (u32)-*map_sizep - base;
|
||||||
*offsetp = 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;
|
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)
|
int fast_spi_early_init(pci_dev_t pdev, ulong mmio_base)
|
||||||
{
|
{
|
||||||
/* Program Temporary BAR for SPI */
|
/* 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,
|
int fast_spi_get_bios_mmap(pci_dev_t pdev, ulong *map_basep, uint *map_sizep,
|
||||||
uint *offsetp);
|
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);
|
int fast_spi_early_init(pci_dev_t pdev, ulong mmio_base);
|
||||||
|
|
||||||
#endif /* ASM_FAST_SPI_H */
|
#endif /* ASM_FAST_SPI_H */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user