summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2021-08-02 11:04:45 +0200
committerJiri Gaisler <jiri@gaisler.se>2021-08-04 17:35:28 +0200
commit184980dd70acc1c873411c739877a47e59000b0f (patch)
tree9e10210bcdd8a7342cf1473f543d03df691cfcdd
parentAdded GR740 L2 configuration register (diff)
downloadsis-184980dd70acc1c873411c739877a47e59000b0f.tar.bz2
Support extended interrupts2.29
-rw-r--r--Makefile.in1
-rwxr-xr-xconfigure20
-rw-r--r--configure.ac2
-rw-r--r--gr740.c2
-rw-r--r--grlib.c87
-rw-r--r--grlib.h1
-rw-r--r--leon3.c3
-rw-r--r--sis.info4
-rw-r--r--version.texi4
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