forked from torvalds/linux
-
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.
Merge patch series "Add non-coherent DMA support for AX45MP"
Prabhakar <[email protected]> says: From: Lad Prabhakar <[email protected]> non-coherent DMA support for AX45MP ==================================== On the Andes AX45MP core, cache coherency is a specification option so it may not be supported. In this case DMA will fail. To get around with this issue this patch series does the below: 1] Andes alternative ports is implemented as errata which checks if the IOCP is missing and only then applies to CMO errata. One vendor specific SBI EXT (ANDES_SBI_EXT_IOCP_SW_WORKAROUND) is implemented as part of errata. Below are the configs which Andes port provides (and are selected by RZ/Five): - ERRATA_ANDES - ERRATA_ANDES_CMO OpenSBI patch supporting ANDES_SBI_EXT_IOCP_SW_WORKAROUND SBI is now part v1.3 release. 2] 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. OpenSBI configures the PMA regions as required and creates a reserve memory node and propagates it to the higher boot stack. Currently OpenSBI (upstream) configures the required PMA region and passes this a shared DMA pool to Linux. 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; }; }; The above shared DMA pool gets appended to Linux DTB so the DMA memory requests go through this region. 3] We provide callbacks to synchronize specific content between memory and cache. 4] RZ/Five SoC selects the below configs - AX45MP_L2_CACHE - DMA_GLOBAL_POOL - ERRATA_ANDES - ERRATA_ANDES_CMO ----------x---------------------x--------------------x---------------x---- * b4-shazam-merge: soc: renesas: Kconfig: Select the required configs for RZ/Five SoC cache: Add L2 cache management for Andes AX45MP RISC-V core dt-bindings: cache: andestech,ax45mp-cache: Add DT binding documentation for L2 cache controller riscv: mm: dma-noncoherent: nonstandard cache operations support riscv: errata: Add Andes alternative ports riscv: asm: vendorid_list: Add Andes Technology to the vendors list Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Palmer Dabbelt <[email protected]>
- Loading branch information
Showing
20 changed files
with
516 additions
and
0 deletions.
There are no files selected for viewing
81 changes: 81 additions & 0 deletions
81
Documentation/devicetree/bindings/cache/andestech,ax45mp-cache.yaml
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,81 @@ | ||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) | ||
# Copyright (C) 2023 Renesas Electronics Corp. | ||
%YAML 1.2 | ||
--- | ||
$id: http://devicetree.org/schemas/cache/andestech,ax45mp-cache.yaml# | ||
$schema: http://devicetree.org/meta-schemas/core.yaml# | ||
|
||
title: Andestech AX45MP L2 Cache Controller | ||
|
||
maintainers: | ||
- Lad Prabhakar <[email protected]> | ||
|
||
description: | ||
A level-2 cache (L2C) is used to improve the system performance by providing | ||
a large amount of cache line entries and reasonable access delays. The L2C | ||
is shared between cores, and a non-inclusive non-exclusive policy is used. | ||
|
||
select: | ||
properties: | ||
compatible: | ||
contains: | ||
enum: | ||
- andestech,ax45mp-cache | ||
|
||
required: | ||
- compatible | ||
|
||
properties: | ||
compatible: | ||
items: | ||
- const: andestech,ax45mp-cache | ||
- const: cache | ||
|
||
reg: | ||
maxItems: 1 | ||
|
||
interrupts: | ||
maxItems: 1 | ||
|
||
cache-line-size: | ||
const: 64 | ||
|
||
cache-level: | ||
const: 2 | ||
|
||
cache-sets: | ||
const: 1024 | ||
|
||
cache-size: | ||
enum: [131072, 262144, 524288, 1048576, 2097152] | ||
|
||
cache-unified: true | ||
|
||
next-level-cache: true | ||
|
||
additionalProperties: false | ||
|
||
required: | ||
- compatible | ||
- reg | ||
- interrupts | ||
- cache-line-size | ||
- cache-level | ||
- cache-sets | ||
- cache-size | ||
- cache-unified | ||
|
||
examples: | ||
- | | ||
#include <dt-bindings/interrupt-controller/irq.h> | ||
cache-controller@2010000 { | ||
compatible = "andestech,ax45mp-cache", "cache"; | ||
reg = <0x13400000 0x100000>; | ||
interrupts = <508 IRQ_TYPE_LEVEL_HIGH>; | ||
cache-line-size = <64>; | ||
cache-level = <2>; | ||
cache-sets = <1024>; | ||
cache-size = <262144>; | ||
cache-unified; | ||
}; |
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 |
---|---|---|
|
@@ -20340,6 +20340,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 <[email protected]> | ||
L: [email protected] | ||
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 <[email protected]> | ||
S: Odd Fixes | ||
|
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
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 @@ | ||
obj-y += errata.o |
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,66 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
/* | ||
* Erratas to be applied for Andes CPU cores | ||
* | ||
* Copyright (C) 2023 Renesas Electronics Corporation. | ||
* | ||
* Author: Lad Prabhakar <[email protected]> | ||
*/ | ||
|
||
#include <linux/memory.h> | ||
#include <linux/module.h> | ||
|
||
#include <asm/alternative.h> | ||
#include <asm/cacheflush.h> | ||
#include <asm/errata_list.h> | ||
#include <asm/patch.h> | ||
#include <asm/processor.h> | ||
#include <asm/sbi.h> | ||
#include <asm/vendorid_list.h> | ||
|
||
#define ANDESTECH_AX45MP_MARCHID 0x8000000000008a45UL | ||
#define ANDESTECH_AX45MP_MIMPID 0x500UL | ||
#define ANDESTECH_SBI_EXT_ANDES 0x0900031E | ||
|
||
#define ANDES_SBI_EXT_IOCP_SW_WORKAROUND 1 | ||
|
||
static long ax45mp_iocp_sw_workaround(void) | ||
{ | ||
struct sbiret ret; | ||
|
||
/* | ||
* ANDES_SBI_EXT_IOCP_SW_WORKAROUND SBI EXT checks if the IOCP is missing and | ||
* cache is controllable only then CMO will be applied to the platform. | ||
*/ | ||
ret = sbi_ecall(ANDESTECH_SBI_EXT_ANDES, ANDES_SBI_EXT_IOCP_SW_WORKAROUND, | ||
0, 0, 0, 0, 0, 0); | ||
|
||
return ret.error ? 0 : ret.value; | ||
} | ||
|
||
static bool errata_probe_iocp(unsigned int stage, unsigned long arch_id, unsigned long impid) | ||
{ | ||
if (!IS_ENABLED(CONFIG_ERRATA_ANDES_CMO)) | ||
return false; | ||
|
||
if (arch_id != ANDESTECH_AX45MP_MARCHID || impid != ANDESTECH_AX45MP_MIMPID) | ||
return false; | ||
|
||
if (!ax45mp_iocp_sw_workaround()) | ||
return false; | ||
|
||
/* Set this just to make core cbo code happy */ | ||
riscv_cbom_block_size = 1; | ||
riscv_noncoherent_supported(); | ||
|
||
return true; | ||
} | ||
|
||
void __init_or_module andes_errata_patch_func(struct alt_entry *begin, struct alt_entry *end, | ||
unsigned long archid, unsigned long impid, | ||
unsigned int stage) | ||
{ | ||
errata_probe_iocp(stage, archid, impid); | ||
|
||
/* we have nothing to patch here ATM so just return back */ | ||
} |
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,28 @@ | ||
/* SPDX-License-Identifier: GPL-2.0-only */ | ||
/* | ||
* Copyright (C) 2023 Renesas Electronics Corp. | ||
*/ | ||
|
||
#ifndef __ASM_DMA_NONCOHERENT_H | ||
#define __ASM_DMA_NONCOHERENT_H | ||
|
||
#include <linux/dma-direct.h> | ||
|
||
/* | ||
* struct riscv_nonstd_cache_ops - Structure for non-standard CMO function pointers | ||
* | ||
* @wback: Function pointer for cache writeback | ||
* @inv: Function pointer for invalidating cache | ||
* @wback_inv: Function pointer for flushing the cache (writeback + invalidating) | ||
*/ | ||
struct riscv_nonstd_cache_ops { | ||
void (*wback)(phys_addr_t paddr, size_t size); | ||
void (*inv)(phys_addr_t paddr, size_t size); | ||
void (*wback_inv)(phys_addr_t paddr, size_t size); | ||
}; | ||
|
||
extern struct riscv_nonstd_cache_ops noncoherent_cache_ops; | ||
|
||
void riscv_noncoherent_register_cache_ops(const struct riscv_nonstd_cache_ops *ops); | ||
|
||
#endif /* __ASM_DMA_NONCOHERENT_H */ |
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
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
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
Oops, something went wrong.