From 184980dd70acc1c873411c739877a47e59000b0f Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 2 Aug 2021 11:04:45 +0200 Subject: Support extended interrupts --- Makefile.in | 1 + configure | 20 +++++++------- configure.ac | 2 +- gr740.c | 2 ++ grlib.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++--------- grlib.h | 1 + leon3.c | 3 +++ sis.info | 4 +-- version.texi | 4 +-- 9 files changed, 97 insertions(+), 27 deletions(-) diff --git a/Makefile.in b/Makefile.in index e4dd40b..a621756 100644 --- a/Makefile.in +++ b/Makefile.in @@ -253,6 +253,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ diff --git a/configure b/configure index 6f42079..4a2b73d 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for sis 2.28. +# Generated by GNU Autoconf 2.69 for sis 2.29. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -577,8 +577,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='sis' PACKAGE_TARNAME='sis' -PACKAGE_VERSION='2.28' -PACKAGE_STRING='sis 2.28' +PACKAGE_VERSION='2.29' +PACKAGE_STRING='sis 2.29' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1283,7 +1283,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures sis 2.28 to adapt to many kinds of systems. +\`configure' configures sis 2.29 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1354,7 +1354,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of sis 2.28:";; + short | recursive ) echo "Configuration of sis 2.29:";; esac cat <<\_ACEOF @@ -1444,7 +1444,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -sis configure 2.28 +sis configure 2.29 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1742,7 +1742,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by sis $as_me 2.28, which was +It was created by sis $as_me 2.29, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2569,7 +2569,7 @@ fi # Define the identity of the package. PACKAGE='sis' - VERSION='2.28' + VERSION='2.29' cat >>confdefs.h <<_ACEOF @@ -4911,7 +4911,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by sis $as_me 2.28, which was +This file was extended by sis $as_me 2.29, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -4977,7 +4977,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -sis config.status 2.28 +sis config.status 2.29 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index 362e760..6daf6ef 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -AC_INIT([sis], [2.28]) +AC_INIT([sis], [2.29]) AC_CONFIG_SRCDIR([sis.c]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_HEADERS(config.h) diff --git a/gr740.c b/gr740.c index 6e0bafd..7840ed2 100644 --- a/gr740.c +++ b/gr740.c @@ -56,6 +56,8 @@ init_sim (void) { int i; + irqmp_extirq = 10; + for (i = 0; i < NCPU; i++) grlib_ahbm_add (&leon3s, 0); diff --git a/grlib.c b/grlib.c index b26dfc3..1e03d26 100644 --- a/grlib.c +++ b/grlib.c @@ -390,6 +390,10 @@ const struct grlib_ipcore apbmst = { #define IRQMP_IFR1 0x84 #define IRQMP_IFR2 0x88 #define IRQMP_IFR3 0x8C +#define IRQMP_PEXTACK0 0xC0 +#define IRQMP_PEXTACK1 0xC4 +#define IRQMP_PEXTACK2 0xC8 +#define IRQMP_PEXTACK3 0xCC static void irqmp_intack (int level, int cpu); static void chk_irq (void); @@ -400,6 +404,13 @@ static uint32 irqmp_ipr; static uint32 irqmp_ibr; static uint32 irqmp_imr[NCPU]; static uint32 irqmp_ifr[NCPU]; +static uint32 irqmp_pextack[NCPU]; + +/* Mask with the supported interrupts */ +static uint32 irqmp_mask; + +/* The extended interrupt line (a zero value disables the feature) */ +int irqmp_extirq; static void irqmp_init (void) @@ -410,6 +421,11 @@ irqmp_init (void) { sregs[i].intack = irqmp_intack; } + + if (irqmp_extirq) + irqmp_mask = 0xfffffffe; + else + irqmp_mask = 0x0000fffe; } static void @@ -422,21 +438,40 @@ irqmp_reset (void) { irqmp_imr[i] = 0; irqmp_ifr[i] = 0; + irqmp_pextack[i] = 0; } } static void irqmp_intack (int level, int cpu) { - int irq_test; + int bit = 1 << level; - if ((sis_verbose > 2) && (level != 10)) + if (sis_verbose > 2) printf ("%8" PRIu64 " cpu %d interrupt %d acknowledged\n", ebase.simtime, cpu, level); - if (irqmp_ifr[cpu] & (1 << level)) - irqmp_ifr[cpu] &= ~(1 << level); + + irqmp_pextack[cpu] = 0; + if (level == irqmp_extirq) + { + int i; + + for (i = 16; i < 32; ++i) + if ((irqmp_ipr & (1 << i)) & irqmp_imr[cpu]) + { + if (sis_verbose > 2) + printf ("%8" PRIu64 " cpu %d set extended interrupt " + "acknowledge to %i\n", ebase.simtime, cpu, i); + irqmp_ipr &= ~(1 << i); + irqmp_pextack[cpu] = i; + break; + } + } + + if (irqmp_ifr[cpu] & bit) + irqmp_ifr[cpu] &= ~bit; else - irqmp_ipr &= ~(1 << level); + irqmp_ipr &= ~bit; chk_irq (); } @@ -450,7 +485,14 @@ chk_irq () for (cpu = 0; cpu < ncpu; cpu++) { old_irl = ext_irl[cpu]; - itmp = ((irqmp_ipr | irqmp_ifr[cpu]) & irqmp_imr[cpu]) & 0x0fffe; + itmp = ((irqmp_ipr | irqmp_ifr[cpu]) & irqmp_imr[cpu]) & irqmp_mask; + if (itmp & 0xffff0000) + { + if (sis_verbose > 2) + printf ("%8" PRIu64 " cpu %d forward extended interrupt\n", + ebase.simtime, cpu); + itmp |= 1 << irqmp_extirq; + } ext_irl[cpu] = 0; if (itmp != 0) { @@ -498,7 +540,7 @@ irqmp_read (uint32 addr, uint32 * data) break; case IRQMP_ISR: /* 0x10 */ - *data = ((ncpu - 1) << 28); + *data = ((ncpu - 1) << 28) | (irqmp_extirq << 16); for (i = 0; i < ncpu; i++) *data |= (sregs[i].pwd_mode << i); break; @@ -539,6 +581,22 @@ irqmp_read (uint32 addr, uint32 * data) *data = irqmp_ifr[3]; break; + case IRQMP_PEXTACK0: /* 0xC0 */ + *data = irqmp_pextack[0]; + break; + + case IRQMP_PEXTACK1: /* 0xC4 */ + *data = irqmp_pextack[1]; + break; + + case IRQMP_PEXTACK2: /* 0xC8 */ + *data = irqmp_pextack[2]; + break; + + case IRQMP_PEXTACK3: /* 0xCC */ + *data = irqmp_pextack[3]; + break; + default: *data = 0; } @@ -552,13 +610,18 @@ irqmp_write (uint32 addr, uint32 * data, uint32 size) switch (addr & 0xff) { + case IRQMP_IPR: /* 0x04 */ + irqmp_ipr = *data & irqmp_mask; + chk_irq (); + break; + case IRQMP_IFR: /* 0x08 */ irqmp_ifr[0] = *data & 0xfffe; chk_irq (); break; case IRQMP_ICR: /* 0x0C */ - irqmp_ipr &= ~*data & 0x0fffe; + irqmp_ipr &= ~*data & irqmp_mask; chk_irq (); break; @@ -585,22 +648,22 @@ irqmp_write (uint32 addr, uint32 * data, uint32 size) break; case IRQMP_IMR: /* 0x40 */ - irqmp_imr[0] = *data & 0xfffe; + irqmp_imr[0] = *data & irqmp_mask; chk_irq (); break; case IRQMP_IMR1: /* 0x44 */ - irqmp_imr[1] = *data & 0xfffe; + irqmp_imr[1] = *data & irqmp_mask; chk_irq (); break; case IRQMP_IMR2: /* 0x48 */ - irqmp_imr[2] = *data & 0xfffe; + irqmp_imr[2] = *data & irqmp_mask; chk_irq (); break; case IRQMP_IMR3: /* 0x4C */ - irqmp_imr[3] = *data & 0xfffe; + irqmp_imr[3] = *data & irqmp_mask; chk_irq (); break; diff --git a/grlib.h b/grlib.h index b182884..036a93d 100644 --- a/grlib.h +++ b/grlib.h @@ -106,3 +106,4 @@ extern void apbuart_close_port (void); extern void apbuart_flush (void); extern const struct grlib_ipcore gptimer, irqmp, apbuart, apbmst, greth, l2c, leon3s, srctrl, ns16550, clint, plic, sdctrl, s5test; +extern int irqmp_extirq; diff --git a/leon3.c b/leon3.c index d1bb52c..3a66d1e 100644 --- a/leon3.c +++ b/leon3.c @@ -56,6 +56,9 @@ init_sim (void) { int i; + /* Use extended interrupt line of GR712RC */ + irqmp_extirq = 12; + for (i = 0; i < ncpu; i++) grlib_ahbm_add (&leon3s, 0); diff --git a/sis.info b/sis.info index 042ce5c..00e7a2e 100644 --- a/sis.info +++ b/sis.info @@ -1,6 +1,6 @@ This is sis.info, produced by makeinfo version 6.7 from sis.texi. -This manual is for SIS (version 2.28, 30 July 2021). +This manual is for SIS (version 2.29, 30 July 2021). Copyright (C) 2020 Free Software Foundation, Inc. @@ -21,7 +21,7 @@ File: sis.info, Node: Top, Next: Introduction, Up: (dir) SIS *** -This manual is for SIS (version 2.28, 30 July 2021). +This manual is for SIS (version 2.29, 30 July 2021). * Menu: diff --git a/version.texi b/version.texi index 4db03d6..24573ec 100644 --- a/version.texi +++ b/version.texi @@ -1,4 +1,4 @@ @set UPDATED 30 July 2021 @set UPDATED-MONTH July 2021 -@set EDITION 2.28 -@set VERSION 2.28 +@set EDITION 2.29 +@set VERSION 2.29 -- cgit v1.2.3