-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
yaml --- r: 272571 b: refs/heads/master c: 458eef2 h: refs/heads/master i: 272569: 4c3b5f4 272567: c3363b8 v: v3
- Loading branch information
Linus Walleij
committed
Aug 30, 2011
1 parent
00cad5e
commit 7544d34
Showing
4 changed files
with
74 additions
and
70 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: fb0225871eea232fbfd2c4b356f5be172122a0fe | ||
refs/heads/master: 458eef2f4d73a55efa835ed891922e31efe91920 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
/* | ||
* Copyright (C) ST-Ericsson SA 2011 | ||
* | ||
* License terms: GNU General Public License (GPL) version 2 | ||
*/ | ||
|
||
#include <linux/io.h> | ||
#include <asm/cacheflush.h> | ||
#include <asm/hardware/cache-l2x0.h> | ||
#include <mach/hardware.h> | ||
#include <mach/id.h> | ||
|
||
static void __iomem *l2x0_base; | ||
|
||
static inline void ux500_cache_wait(void __iomem *reg, unsigned long mask) | ||
{ | ||
/* wait for the operation to complete */ | ||
while (readl_relaxed(reg) & mask) | ||
cpu_relax(); | ||
} | ||
|
||
static inline void ux500_cache_sync(void) | ||
{ | ||
writel_relaxed(0, l2x0_base + L2X0_CACHE_SYNC); | ||
ux500_cache_wait(l2x0_base + L2X0_CACHE_SYNC, 1); | ||
} | ||
|
||
/* | ||
* The L2 cache cannot be turned off in the non-secure world. | ||
* Dummy until a secure service is in place. | ||
*/ | ||
static void ux500_l2x0_disable(void) | ||
{ | ||
} | ||
|
||
/* | ||
* This is only called when doing a kexec, just after turning off the L2 | ||
* and L1 cache, and it is surrounded by a spinlock in the generic version. | ||
* However, we're not really turning off the L2 cache right now and the | ||
* PL310 does not support exclusive accesses (used to implement the spinlock). | ||
* So, the invalidation needs to be done without the spinlock. | ||
*/ | ||
static void ux500_l2x0_inv_all(void) | ||
{ | ||
uint32_t l2x0_way_mask = (1<<16) - 1; /* Bitmask of active ways */ | ||
|
||
/* invalidate all ways */ | ||
writel_relaxed(l2x0_way_mask, l2x0_base + L2X0_INV_WAY); | ||
ux500_cache_wait(l2x0_base + L2X0_INV_WAY, l2x0_way_mask); | ||
ux500_cache_sync(); | ||
} | ||
|
||
static int ux500_l2x0_init(void) | ||
{ | ||
if (cpu_is_u5500()) | ||
l2x0_base = __io_address(U5500_L2CC_BASE); | ||
else if (cpu_is_u8500()) | ||
l2x0_base = __io_address(U8500_L2CC_BASE); | ||
else | ||
ux500_unknown_soc(); | ||
|
||
/* 64KB way size, 8 way associativity, force WA */ | ||
l2x0_init(l2x0_base, 0x3e060000, 0xc0000fff); | ||
|
||
/* Override invalidate function */ | ||
outer_cache.disable = ux500_l2x0_disable; | ||
outer_cache.inv_all = ux500_l2x0_inv_all; | ||
|
||
return 0; | ||
} | ||
|
||
early_initcall(ux500_l2x0_init); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters