diff options
author | Arnd Bergmann <arnd@arndb.de> | 2019-09-03 22:06:07 +0200 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2019-09-03 22:06:07 +0200 |
commit | 9ddb2526eb4a5f336ceb059612fa0c02f996d3e8 (patch) | |
tree | 6f1bbdb83c78b92889c1d69f6bcf164762af7fd5 /drivers/soc/fsl/qbman/bman_ccsr.c | |
parent | 328790614d42935db92354bd99137e19aaca8e4f (diff) | |
parent | eadf0b17b43db4e73a6bdde1ad745d3b582a71c5 (diff) |
Merge tag 'soc-fsl-next-v5.4' of git://git.kernel.org/pub/scm/linux/kernel/git/leo/linux into arm/drivers
NXP/FSL SoC driver updates for v5.4
DPAA2 DPIO/MC driver
- Remove explicit device_link_remove() and device_link_del() calls due to
framework change
DPAA QBman driver
- Various changes to make it working with kexec
- Remove dev_err() usage after platform_get_irq()
GUTS driver
- Add LS1028 SoC support
* tag 'soc-fsl-next-v5.4' of git://git.kernel.org/pub/scm/linux/kernel/git/leo/linux:
bus: fsl-mc: remove explicit device_link_del
soc: fsl: dpio: remove explicit device_link_remove
soc: fsl: guts: Add definition for LS1028A
soc/fsl/qbman: Update device tree with reserved memory
soc/fsl/qbman: Fixup qman_shutdown_fq()
soc/fsl/qbman: Disable interrupts during portal recovery
soc/fsl/qbman: Fix drain_mr_fqni()
soc/fsl/qbman: Cleanup QMan queues if device was already initialized
soc/fsl/qbman: Cleanup buffer pools if BMan was initialized prior to bootup
soc/fsl/qbman: Rework QBMan private memory setup
soc: fsl: qbman: Remove dev_err() usage after platform_get_irq()
Link: https://lore.kernel.org/r/20190816195301.26660-1-leoyang.li@nxp.com
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to 'drivers/soc/fsl/qbman/bman_ccsr.c')
-rw-r--r-- | drivers/soc/fsl/qbman/bman_ccsr.c | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/drivers/soc/fsl/qbman/bman_ccsr.c b/drivers/soc/fsl/qbman/bman_ccsr.c index 7c3cc968053c..cb24a08be084 100644 --- a/drivers/soc/fsl/qbman/bman_ccsr.c +++ b/drivers/soc/fsl/qbman/bman_ccsr.c @@ -97,17 +97,40 @@ static void bm_get_version(u16 *id, u8 *major, u8 *minor) /* signal transactions for FBPRs with higher priority */ #define FBPR_AR_RPRIO_HI BIT(30) -static void bm_set_memory(u64 ba, u32 size) +/* Track if probe has occurred and if cleanup is required */ +static int __bman_probed; +static int __bman_requires_cleanup; + + +static int bm_set_memory(u64 ba, u32 size) { + u32 bar, bare; u32 exp = ilog2(size); /* choke if size isn't within range */ DPAA_ASSERT(size >= 4096 && size <= 1024*1024*1024 && is_power_of_2(size)); /* choke if '[e]ba' has lower-alignment than 'size' */ DPAA_ASSERT(!(ba & (size - 1))); + + /* Check to see if BMan has already been initialized */ + bar = bm_ccsr_in(REG_FBPR_BAR); + if (bar) { + /* Maker sure ba == what was programmed) */ + bare = bm_ccsr_in(REG_FBPR_BARE); + if (bare != upper_32_bits(ba) || bar != lower_32_bits(ba)) { + pr_err("Attempted to reinitialize BMan with different BAR, got 0x%llx read BARE=0x%x BAR=0x%x\n", + ba, bare, bar); + return -ENOMEM; + } + pr_info("BMan BAR already configured\n"); + __bman_requires_cleanup = 1; + return 1; + } + bm_ccsr_out(REG_FBPR_BARE, upper_32_bits(ba)); bm_ccsr_out(REG_FBPR_BAR, lower_32_bits(ba)); bm_ccsr_out(REG_FBPR_AR, exp - 1); + return 0; } /* @@ -120,7 +143,6 @@ static void bm_set_memory(u64 ba, u32 size) */ static dma_addr_t fbpr_a; static size_t fbpr_sz; -static int __bman_probed; static int bman_fbpr(struct reserved_mem *rmem) { @@ -173,6 +195,16 @@ int bman_is_probed(void) } EXPORT_SYMBOL_GPL(bman_is_probed); +int bman_requires_cleanup(void) +{ + return __bman_requires_cleanup; +} + +void bman_done_cleanup(void) +{ + __bman_requires_cleanup = 0; +} + static int fsl_bman_probe(struct platform_device *pdev) { int ret, err_irq; |