// SPDX-License-Identifier: GPL-2.0-only /* * Coherency fabric (Aurora) support for Armada 370, 375, 38x and XP * platforms. * * Copyright (C) 2012 Marvell * * Yehuda Yitschak <yehuday@marvell.com> * Gregory Clement <gregory.clement@free-electrons.com> * Thomas Petazzoni <thomas.petazzoni@free-electrons.com> * * The Armada 370, 375, 38x and XP SOCs have a coherency fabric which is * responsible for ensuring hardware coherency between all CPUs and between * CPUs and I/O masters. This file initializes the coherency fabric and * supplies basic routines for configuring and controlling hardware coherency
*/
/* Functions defined in coherency_ll.S */ int ll_enable_coherency(void); void ll_add_cpu_to_smp_group(void);
#define CPU_CONFIG_SHARED_L2 BIT(16)
/* * Disable the "Shared L2 Present" bit in CPU Configuration register * on Armada XP. * * The "Shared L2 Present" bit affects the "level of coherence" value * in the clidr CP15 register. Cache operation functions such as * "flush all" and "invalidate all" operate on all the cache levels * that included in the defined level of coherence. When HW I/O * coherency is used, this bit causes unnecessary flushes of the L2 * cache.
*/ staticvoid armada_xp_clear_shared_l2(void)
{
u32 reg;
of_address_to_resource(np, 0, &res);
coherency_phys_base = res.start; /* * Ensure secondary CPUs will see the updated value, * which they read before they join the coherency * fabric, and therefore before they are coherent with * the boot CPU cache.
*/
sync_cache_w(&coherency_phys_base);
coherency_base = of_iomap(np, 0);
coherency_cpu_base = of_iomap(np, 1);
cpu_config_np = of_find_compatible_node(NULL, NULL, "marvell,armada-xp-cpu-config"); if (!cpu_config_np) gotoexit;
cpu_config_base = of_iomap(cpu_config_np, 0); if (!cpu_config_base) {
of_node_put(cpu_config_np); gotoexit;
}
/* * This ioremap hook is used on Armada 375/38x to ensure that all MMIO * areas are mapped as MT_UNCACHED instead of MT_DEVICE. This is * needed for the HW I/O coherency mechanism to work properly without * deadlock.
*/ staticvoid __iomem *
armada_wa_ioremap_caller(phys_addr_t phys_addr, size_t size, unsignedint mtype, void *caller)
{
mtype = MT_UNCACHED; return __arm_ioremap_caller(phys_addr, size, mtype, caller);
}
/* * We should switch the PL310 to I/O coherency mode only if * I/O coherency is actually enabled.
*/ if (!coherency_available()) return;
/* * Add the PL310 property "arm,io-coherent". This makes sure the * outer sync operation is not used, which allows to * workaround the system erratum that causes deadlocks when * doing PCIe in an SMP situation on Armada 375 and Armada * 38x.
*/
for_each_compatible_node(cache_dn, NULL, "arm,pl310-cache") { struct property *p;
/* * The coherency fabric is needed: * - For coherency between processors on Armada XP, so only * when SMP is enabled. * - For coherency between the processor and I/O devices, but * this coherency requires many pre-requisites (write * allocate cache policy, shareable pages, SMP bit set) that * are only meant in SMP situations. * * Note that this means that on Armada 370, there is currently * no way to use hardware I/O coherency, because even when * CONFIG_SMP is enabled, is_smp() returns false due to the * Armada 370 being a single-core processor. To lift this * limitation, we would have to find a way to make the cache * policy set to write-allocate (on all Armada SoCs), and to * set the shareable attribute in page tables (on all Armada * SoCs except the Armada 370). Unfortunately, such decisions * are taken very early in the kernel boot process, at a point * where we don't know yet on which SoC we are running.
*/ if (!is_smp()) return COHERENCY_FABRIC_TYPE_NONE;
np = of_find_matching_node_and_match(NULL, of_coherency_table, &match); if (!np) return COHERENCY_FABRIC_TYPE_NONE;
type = (int) match->data;
of_node_put(np);
return type;
}
int set_cpu_coherent(void)
{ int type = coherency_type();
if (type == COHERENCY_FABRIC_TYPE_ARMADA_370_XP) { if (!coherency_base) {
pr_warn("Can't make current CPU cache coherent.\n");
pr_warn("Coherency fabric is not initialized\n"); return 1;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.