diff options
| -rw-r--r-- | Documentation/devicetree/bindings/arm/l2cc.txt | 3 | ||||
| -rw-r--r-- | arch/arm/mm/cache-l2x0.c | 31 |
2 files changed, 34 insertions, 0 deletions
diff --git a/Documentation/devicetree/bindings/arm/l2cc.txt b/Documentation/devicetree/bindings/arm/l2cc.txt index b513cb8196fe..af527ee111c2 100644 --- a/Documentation/devicetree/bindings/arm/l2cc.txt +++ b/Documentation/devicetree/bindings/arm/l2cc.txt | |||
| @@ -40,6 +40,9 @@ Optional properties: | |||
| 40 | - arm,filter-ranges : <start length> Starting address and length of window to | 40 | - arm,filter-ranges : <start length> Starting address and length of window to |
| 41 | filter. Addresses in the filter window are directed to the M1 port. Other | 41 | filter. Addresses in the filter window are directed to the M1 port. Other |
| 42 | addresses will go to the M0 port. | 42 | addresses will go to the M0 port. |
| 43 | - arm,io-coherent : indicates that the system is operating in an hardware | ||
| 44 | I/O coherent mode. Valid only when the arm,pl310-cache compatible | ||
| 45 | string is used. | ||
| 43 | - interrupts : 1 combined interrupt. | 46 | - interrupts : 1 combined interrupt. |
| 44 | - cache-id-part: cache id part number to be used if it is not present | 47 | - cache-id-part: cache id part number to be used if it is not present |
| 45 | on hardware | 48 | on hardware |
diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c index efc5cabf70e0..076172b69422 100644 --- a/arch/arm/mm/cache-l2x0.c +++ b/arch/arm/mm/cache-l2x0.c | |||
| @@ -1069,6 +1069,33 @@ static const struct l2c_init_data of_l2c310_data __initconst = { | |||
| 1069 | }; | 1069 | }; |
| 1070 | 1070 | ||
| 1071 | /* | 1071 | /* |
| 1072 | * This is a variant of the of_l2c310_data with .sync set to | ||
| 1073 | * NULL. Outer sync operations are not needed when the system is I/O | ||
| 1074 | * coherent, and potentially harmful in certain situations (PCIe/PL310 | ||
| 1075 | * deadlock on Armada 375/38x due to hardware I/O coherency). The | ||
| 1076 | * other operations are kept because they are infrequent (therefore do | ||
| 1077 | * not cause the deadlock in practice) and needed for secondary CPU | ||
| 1078 | * boot and other power management activities. | ||
| 1079 | */ | ||
| 1080 | static const struct l2c_init_data of_l2c310_coherent_data __initconst = { | ||
| 1081 | .type = "L2C-310 Coherent", | ||
| 1082 | .way_size_0 = SZ_8K, | ||
| 1083 | .num_lock = 8, | ||
| 1084 | .of_parse = l2c310_of_parse, | ||
| 1085 | .enable = l2c310_enable, | ||
| 1086 | .fixup = l2c310_fixup, | ||
| 1087 | .save = l2c310_save, | ||
| 1088 | .outer_cache = { | ||
| 1089 | .inv_range = l2c210_inv_range, | ||
| 1090 | .clean_range = l2c210_clean_range, | ||
| 1091 | .flush_range = l2c210_flush_range, | ||
| 1092 | .flush_all = l2c210_flush_all, | ||
| 1093 | .disable = l2c310_disable, | ||
| 1094 | .resume = l2c310_resume, | ||
| 1095 | }, | ||
| 1096 | }; | ||
| 1097 | |||
| 1098 | /* | ||
| 1072 | * Note that the end addresses passed to Linux primitives are | 1099 | * Note that the end addresses passed to Linux primitives are |
| 1073 | * noninclusive, while the hardware cache range operations use | 1100 | * noninclusive, while the hardware cache range operations use |
| 1074 | * inclusive start and end addresses. | 1101 | * inclusive start and end addresses. |
| @@ -1487,6 +1514,10 @@ int __init l2x0_of_init(u32 aux_val, u32 aux_mask) | |||
| 1487 | 1514 | ||
| 1488 | data = of_match_node(l2x0_ids, np)->data; | 1515 | data = of_match_node(l2x0_ids, np)->data; |
| 1489 | 1516 | ||
| 1517 | if (of_device_is_compatible(np, "arm,pl310-cache") && | ||
| 1518 | of_property_read_bool(np, "arm,io-coherent")) | ||
| 1519 | data = &of_l2c310_coherent_data; | ||
| 1520 | |||
| 1490 | old_aux = readl_relaxed(l2x0_base + L2X0_AUX_CTRL); | 1521 | old_aux = readl_relaxed(l2x0_base + L2X0_AUX_CTRL); |
| 1491 | if (old_aux != ((old_aux & aux_mask) | aux_val)) { | 1522 | if (old_aux != ((old_aux & aux_mask) | aux_val)) { |
| 1492 | pr_warn("L2C: platform modifies aux control register: 0x%08x -> 0x%08x\n", | 1523 | pr_warn("L2C: platform modifies aux control register: 0x%08x -> 0x%08x\n", |
