diff --git a/src/soc/sifive/fu540/Makefile.inc b/src/soc/sifive/fu540/Makefile.inc index abd3458b28..677731a8af 100644 --- a/src/soc/sifive/fu540/Makefile.inc +++ b/src/soc/sifive/fu540/Makefile.inc @@ -14,7 +14,7 @@ ifeq ($(CONFIG_SOC_SIFIVE_FU540),y) bootblock-y += uart.c -bootblock-y += mtime.c +bootblock-y += clint.c bootblock-y += media.c bootblock-y += bootblock.c diff --git a/src/soc/sifive/fu540/clint.c b/src/soc/sifive/fu540/clint.c new file mode 100644 index 0000000000..00aec1ab37 --- /dev/null +++ b/src/soc/sifive/fu540/clint.c @@ -0,0 +1,32 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2018 HardenedLinux + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include + +void mtime_init(void) +{ + long hart_id = read_csr(mhartid); + HLS()->time = (uint64_t *)(FU540_CLINT + 0xbff8); + HLS()->timecmp = (uint64_t *)(FU540_CLINT + 0x4000 + 8 * hart_id); +} + +void set_msip(int hartid, int val) +{ + long hart_id = read_csr(mhartid); + write32((void *)(FU540_CLINT + 4 * hart_id), !!val); +} diff --git a/src/soc/sifive/fu540/include/soc/addressmap.h b/src/soc/sifive/fu540/include/soc/addressmap.h index 904c8b6589..0de1423ae2 100644 --- a/src/soc/sifive/fu540/include/soc/addressmap.h +++ b/src/soc/sifive/fu540/include/soc/addressmap.h @@ -15,6 +15,7 @@ #define FU540_MSEL 0x00001000 #define FU540_DTIM 0x01000000 +#define FU540_CLINT 0x02000000 #define FU540_L2LIM 0x08000000 #define FU540_UART0 0x10010000 #define FU540_UART(x) (FU540_UART0 + 0x1000 * (x)) diff --git a/src/soc/sifive/fu540/mtime.c b/src/soc/sifive/fu540/include/soc/clint.h similarity index 70% rename from src/soc/sifive/fu540/mtime.c rename to src/soc/sifive/fu540/include/soc/clint.h index f8c2717563..d2399c220a 100644 --- a/src/soc/sifive/fu540/mtime.c +++ b/src/soc/sifive/fu540/include/soc/clint.h @@ -13,10 +13,12 @@ * GNU General Public License for more details. */ -#include +#ifndef __SOC_SIFIVE_FU540_CLINT_H +#define __SOC_SIFIVE_FU540_CLINT_H -/* FIXME: This is an empty implementation, please improve */ -/* This function is used to initialize HLS()->time/HLS()->timecmp */ -void mtime_init(void) -{ -} +/* This function is used to set MSIP. + * It can be used to send an IPI (inter-processor interrupt) to + * another hart*/ +void set_msip(int hartid, int val); + +#endif