blob: a46674f7c2585d5fc86f9ce57ea2bc073718387e [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Rick Chene76b8042017-12-26 13:55:48 +08002/*
3 * Copyright (C) 2017 Andes Technology Corporation
4 * Rick Chen, Andes Technology Corporation <rick@andestech.com>
Rick Chene76b8042017-12-26 13:55:48 +08005 */
6
7/* CPU specific code */
8#include <common.h>
Simon Glass1d91ba72019-11-14 12:57:37 -07009#include <cpu_func.h>
Simon Glass63334482019-11-14 12:57:39 -070010#include <irq_func.h>
Rick Chen842d5802018-11-07 09:34:06 +080011#include <asm/cache.h>
Leo Yu-Chi Liang2795bf22021-09-23 10:34:29 +080012#include <asm/csr.h>
13
14#define CSR_MCACHE_CTL 0x7ca
Rick Chenc1ec25e2023-01-03 16:17:13 +080015#define CSR_MMISC_CTL 0x7d0
16#define CSR_MARCHID 0xf12
Leo Yu-Chi Liang2795bf22021-09-23 10:34:29 +080017
18#define V5_MCACHE_CTL_IC_EN_OFFSET 0
19#define V5_MCACHE_CTL_DC_EN_OFFSET 1
Rick Chenc1ec25e2023-01-03 16:17:13 +080020#define V5_MCACHE_CTL_CCTL_SUEN_OFFSET 8
21#define V5_MCACHE_CTL_DC_COHEN_OFFSET 19
Leo Yu-Chi Liang2795bf22021-09-23 10:34:29 +080022#define V5_MCACHE_CTL_DC_COHSTA_OFFSET 20
23
Rick Chenc1ec25e2023-01-03 16:17:13 +080024#define V5_MCACHE_CTL_IC_EN BIT(V5_MCACHE_CTL_IC_EN_OFFSET)
25#define V5_MCACHE_CTL_DC_EN BIT(V5_MCACHE_CTL_DC_EN_OFFSET)
26#define V5_MCACHE_CTL_CCTL_SUEN BIT(V5_MCACHE_CTL_CCTL_SUEN_OFFSET)
27#define V5_MCACHE_CTL_DC_COHEN_EN BIT(V5_MCACHE_CTL_DC_COHEN_OFFSET)
28#define V5_MCACHE_CTL_DC_COHSTA_EN BIT(V5_MCACHE_CTL_DC_COHSTA_OFFSET)
Leo Yu-Chi Liang2795bf22021-09-23 10:34:29 +080029
Rick Chene76b8042017-12-26 13:55:48 +080030
31/*
32 * cleanup_before_linux() is called just before we call linux
33 * it prepares the processor for linux
34 *
35 * we disable interrupt and caches.
36 */
37int cleanup_before_linux(void)
38{
39 disable_interrupts();
40
41 /* turn off I/D-cache */
Rick Chen842d5802018-11-07 09:34:06 +080042 cache_flush();
43 icache_disable();
44 dcache_disable();
Rick Chene76b8042017-12-26 13:55:48 +080045
46 return 0;
47}
Leo Yu-Chi Liang2795bf22021-09-23 10:34:29 +080048
49void harts_early_init(void)
50{
51 if (CONFIG_IS_ENABLED(RISCV_MMODE)) {
52 unsigned long long mcache_ctl_val = csr_read(CSR_MCACHE_CTL);
53
54 if (!(mcache_ctl_val & V5_MCACHE_CTL_DC_COHEN_EN))
55 mcache_ctl_val |= V5_MCACHE_CTL_DC_COHEN_EN;
56 if (!(mcache_ctl_val & V5_MCACHE_CTL_IC_EN))
57 mcache_ctl_val |= V5_MCACHE_CTL_IC_EN;
58 if (!(mcache_ctl_val & V5_MCACHE_CTL_DC_EN))
59 mcache_ctl_val |= V5_MCACHE_CTL_DC_EN;
Rick Chenc1ec25e2023-01-03 16:17:13 +080060 if (!(mcache_ctl_val & V5_MCACHE_CTL_CCTL_SUEN))
61 mcache_ctl_val |= V5_MCACHE_CTL_CCTL_SUEN;
Leo Yu-Chi Liang2795bf22021-09-23 10:34:29 +080062 csr_write(CSR_MCACHE_CTL, mcache_ctl_val);
63
64 /*
65 * Check DC_COHEN_EN, if cannot write to mcache_ctl,
66 * we assume this bitmap not support L2 CM
67 */
68 mcache_ctl_val = csr_read(CSR_MCACHE_CTL);
69 if ((mcache_ctl_val & V5_MCACHE_CTL_DC_COHEN_EN)) {
70 /* Wait for DC_COHSTA bit be set */
71 while (!(mcache_ctl_val & V5_MCACHE_CTL_DC_COHSTA_EN))
72 mcache_ctl_val = csr_read(CSR_MCACHE_CTL);
73 }
74 }
75}