Unverified Commit d34599bc authored by Lad Prabhakar's avatar Lad Prabhakar Committed by Palmer Dabbelt
Browse files

cache: Add L2 cache management for Andes AX45MP RISC-V core

I/O Coherence Port (IOCP) provides an AXI interface for connecting
external non-caching masters, such as DMA controllers. The accesses
from IOCP are coherent with D-Caches and L2 Cache.

IOCP is a specification option and is disabled on the Renesas RZ/Five
SoC due to this reason IP blocks using DMA will fail.

The Andes AX45MP core has a Programmable Physical Memory Attributes (PMA)
block that allows dynamic adjustment of memory attributes in the runtime.
It contains a configurable amount of PMA entries implemented as CSR
registers to control the attributes of memory locations in interest.
Below are the memory attributes supported:
* Device, Non-bufferable
* Device, bufferable
* Memory, Non-cacheable, Non-bufferable
* Memory, Non-cacheable, Bufferable
* Memory, Write-back, No-allocate
* Memory, Write-back, Read-allocate
* Memory, Write-back, Write-allocate
* Memory, Write-back, Read and Write-allocate

More info about PMA (section 10.3):
Link: http://www.andestech.com/wp-content/uploads/AX45MP-1C-Rev.-5.0.0-Datasheet.pdf



As a workaround for SoCs with IOCP disabled CMO needs to be handled by
software. Firstly OpenSBI configures the memory region as
"Memory, Non-cacheable, Bufferable" and passes this region as a global
shared dma pool as a DT node. With DMA_GLOBAL_POOL enabled all DMA
allocations happen from this region and synchronization callbacks are
implemented to synchronize when doing DMA transactions.

Example PMA region passes as a DT node from OpenSBI:
    reserved-memory {
        #address-cells = <2>;
        #size-cells = <2>;
        ranges;

        pma_resv0@58000000 {
            compatible = "shared-dma-pool";
            reg = <0x0 0x58000000 0x0 0x08000000>;
            no-map;
            linux,dma-default;
        };
    };

Signed-off-by: default avatarLad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: default avatarConor Dooley <conor.dooley@microchip.com>
Tested-by: Conor Dooley <conor.dooley@microchip.com> # tyre-kicking on a d1
Link: https://lore.kernel.org/r/20230818135723.80612-6-prabhakar.mahadev-lad.rj@bp.renesas.com


Signed-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
parent 3e7bf468
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -20241,6 +20241,13 @@ S: Supported
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
F:	drivers/staging/
STANDALONE CACHE CONTROLLER DRIVERS
M:	Conor Dooley <conor@kernel.org>
L:	linux-riscv@lists.infradead.org
S:	Maintained
T:	git https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git/
F:	drivers/cache
STARFIRE/DURALAN NETWORK DRIVER
M:	Ion Badulescu <ionut@badula.org>
S:	Odd Fixes
+2 −0
Original line number Diff line number Diff line
@@ -15,6 +15,8 @@ source "drivers/base/Kconfig"

source "drivers/bus/Kconfig"

source "drivers/cache/Kconfig"

source "drivers/connector/Kconfig"

source "drivers/firmware/Kconfig"
+1 −0
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ ifdef building_out_of_srctree
MAKEFLAGS += --include-dir=$(srctree)
endif

obj-y				+= cache/
obj-y				+= irqchip/
obj-y				+= bus/

drivers/cache/Kconfig

0 → 100644
+11 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0
menu "Cache Drivers"

config AX45MP_L2_CACHE
	bool "Andes Technology AX45MP L2 Cache controller"
	depends on RISCV_DMA_NONCOHERENT
	select RISCV_NONSTANDARD_CACHE_OPS
	help
	  Support for the L2 cache controller on Andes Technology AX45MP platforms.

endmenu

drivers/cache/Makefile

0 → 100644
+3 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0

obj-$(CONFIG_AX45MP_L2_CACHE) += ax45mp_cache.o
Loading