On Mon, 2018-11-26 at 00:01 +0100, Alexander Graf wrote: > > On 17.11.18 23:51, Auer, Lukas wrote: > > On Wed, 2018-11-14 at 18:27 +0100, Alexander Graf wrote: > > > To support a new architecture we need to provide a few helper > > > functions > > > for memory, cache, timer, etc support. > > > > > > This patch adds the remainders of those. Some bits are still > > > disabled, > > > as I couldn't guarantee that we're always running on models / in > > > modes > > > where the respective hardware is available. > > > > > > Signed-off-by: Alexander Graf <ag...@suse.de> > > > > > > --- > > > > > > v2 -> v3: > > > > > > - Fix riscv32 target > > > --- > > > grub-core/kern/riscv/cache.c | 64 > > > +++++++++++++++++++++++++++++ > > > grub-core/kern/riscv/cache_flush.S | 40 +++++++++++++++++++ > > > grub-core/kern/riscv/efi/init.c | 82 > > > ++++++++++++++++++++++++++++++++++++++ > > > include/grub/riscv32/efi/memory.h | 6 +++ > > > include/grub/riscv32/time.h | 28 +++++++++++++ > > > include/grub/riscv32/types.h | 34 ++++++++++++++++ > > > include/grub/riscv64/efi/memory.h | 6 +++ > > > include/grub/riscv64/time.h | 28 +++++++++++++ > > > include/grub/riscv64/types.h | 34 ++++++++++++++++ > > > 9 files changed, 322 insertions(+) > > > create mode 100644 grub-core/kern/riscv/cache.c > > > create mode 100644 grub-core/kern/riscv/cache_flush.S > > > create mode 100644 grub-core/kern/riscv/efi/init.c > > > create mode 100644 include/grub/riscv32/efi/memory.h > > > create mode 100644 include/grub/riscv32/time.h > > > create mode 100644 include/grub/riscv32/types.h > > > create mode 100644 include/grub/riscv64/efi/memory.h > > > create mode 100644 include/grub/riscv64/time.h > > > create mode 100644 include/grub/riscv64/types.h > > > > > > diff --git a/grub-core/kern/riscv/cache.c b/grub- > > > core/kern/riscv/cache.c > > > new file mode 100644 > > > index 000000000..15dbe6927 > > > --- /dev/null > > > +++ b/grub-core/kern/riscv/cache.c > > > @@ -0,0 +1,64 @@ > > > +/* > > > + * GRUB -- GRand Unified Bootloader > > > + * Copyright (C) 2013 Free Software Foundation, Inc. > > > + * > > > + * GRUB 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, either version 3 of the > > > License, > > > or > > > + * (at your option) any later version. > > > + * > > > + * GRUB 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. > > > + * > > > + * You should have received a copy of the GNU General Public > > > License > > > + * along with GRUB. If not, see <http://www.gnu.org/licenses/> > > > . > > > + */ > > > + > > > +#include <grub/cache.h> > > > +#include <grub/misc.h> > > > + > > > +static grub_int64_t dlinesz; > > > +static grub_int64_t ilinesz; > > > + > > > +/* Prototypes for asm functions. */ > > > +void grub_arch_clean_dcache_range (grub_addr_t beg, grub_addr_t > > > end, > > > + grub_size_t line_size); > > > +void grub_arch_invalidate_icache_range (grub_addr_t beg, > > > grub_addr_t > > > end, > > > + grub_size_t line_size); > > > + > > > +static void > > > +probe_caches (void) > > > +{ > > > + /* TODO */ > > > + dlinesz = 32; > > > + ilinesz = 32; > > > +} > > > + > > > +void > > > +grub_arch_sync_caches (void *address, grub_size_t len) > > > +{ > > > + grub_size_t start, end, max_align; > > > + > > > + if (dlinesz == 0) > > > + probe_caches(); > > > + if (dlinesz == 0) > > > + grub_fatal ("Unknown cache line size!"); > > > + > > > + max_align = dlinesz > ilinesz ? dlinesz : ilinesz; > > > + > > > + start = ALIGN_DOWN ((grub_size_t) address, max_align); > > > + end = ALIGN_UP ((grub_size_t) address + len, max_align); > > > + > > > + grub_arch_clean_dcache_range (start, end, dlinesz); > > > + grub_arch_invalidate_icache_range (start, end, ilinesz); > > > +} > > > + > > > +void > > > +grub_arch_sync_dma_caches (volatile void *address, grub_size_t > > > len) > > > +{ > > > + /* DMA incoherent devices not supported yet */ > > > + if (address || len || 1) > > > + return; > > > +} > > > diff --git a/grub-core/kern/riscv/cache_flush.S b/grub- > > > core/kern/riscv/cache_flush.S > > > new file mode 100644 > > > index 000000000..033a8aac3 > > > --- /dev/null > > > +++ b/grub-core/kern/riscv/cache_flush.S > > > @@ -0,0 +1,40 @@ > > > +/* > > > + * GRUB -- GRand Unified Bootloader > > > + * Copyright (C) 2013 Free Software Foundation, Inc. > > > + * > > > + * GRUB 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, either version 3 of the > > > License, > > > or > > > + * (at your option) any later version. > > > + * > > > + * GRUB 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. > > > + * > > > + * You should have received a copy of the GNU General Public > > > License > > > + * along with GRUB. If not, see <http://www.gnu.org/licenses/> > > > . > > > + */ > > > + > > > +#include <grub/symbol.h> > > > + > > > + .file "cache_flush.S" > > > + .text > > > + > > > +/* > > > + * Simple cache maintenance functions > > > + */ > > > + > > > +// a0 - *beg (inclusive) > > > +// a1 - *end (exclusive) > > > +// a2 - line size > > > +FUNCTION(grub_arch_clean_dcache_range) > > > + // TODO > > > + ret > > > + > > > +// a0 - *beg (inclusive) > > > +// a1 - *end (exclusive) > > > +// a2 - line size > > > +FUNCTION(grub_arch_invalidate_icache_range) > > > + // TODO > > > + ret > > > > You can use fence.i here to synchronize writes to instruction > > memory > > with instruction fetches. Essentially a instruction cache flush, > > but > > different processors may choose different implementations for it. > > I suppose that one is implemented by every reasonable core? I'll add > it > then :). > > > Thanks! > > Alex
Yes definitely, the RISC-V Linux kernel would not work without it. Lukas _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel