Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/alpha/pci Reduce code duplication among platforms t...
details: https://anonhg.NetBSD.org/src/rev/4f39996f7fe4
branches: trunk
changeset: 379892:4f39996f7fe4
user: thorpej <thorpej%NetBSD.org@localhost>
date: Fri Jun 25 13:41:33 2021 +0000
description:
Reduce code duplication among platforms that use the i82378 SIO to
route PCI interrupts to the ISA PIC by refactoring it into a new
sio_pirq_intr_map() function.
diffstat:
sys/arch/alpha/pci/pci_2100_a50.c | 35 +++++------------------------------
sys/arch/alpha/pci/pci_axppci_33.c | 36 +++++-------------------------------
sys/arch/alpha/pci/sio_pic.c | 35 +++++++++++++++++++++++++++++++++--
sys/arch/alpha/pci/siovar.h | 3 ++-
4 files changed, 45 insertions(+), 64 deletions(-)
diffs (231 lines):
diff -r 84e2692ad547 -r 4f39996f7fe4 sys/arch/alpha/pci/pci_2100_a50.c
--- a/sys/arch/alpha/pci/pci_2100_a50.c Fri Jun 25 13:38:21 2021 +0000
+++ b/sys/arch/alpha/pci/pci_2100_a50.c Fri Jun 25 13:41:33 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pci_2100_a50.c,v 1.43 2021/06/19 16:59:07 thorpej Exp $ */
+/* $NetBSD: pci_2100_a50.c,v 1.44 2021/06/25 13:41:33 thorpej Exp $ */
/*
* Copyright (c) 1995, 1996 Carnegie-Mellon University.
@@ -29,7 +29,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: pci_2100_a50.c,v 1.43 2021/06/19 16:59:07 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pci_2100_a50.c,v 1.44 2021/06/25 13:41:33 thorpej Exp $");
#include <sys/types.h>
#include <sys/param.h>
@@ -57,21 +57,10 @@
static int dec_2100_a50_intr_map(const struct pci_attach_args *,
pci_intr_handle_t *);
-#define APECS_SIO_DEVICE 7 /* XXX */
-
static void
pci_2100_a50_pickintr(void *core, bus_space_tag_t iot, bus_space_tag_t memt,
pci_chipset_tag_t pc)
{
- pcireg_t sioclass;
- int sioII;
-
- /* XXX MAGIC NUMBER */
- sioclass = pci_conf_read(pc, pci_make_tag(pc, 0, 7, 0), PCI_CLASS_REG);
- sioII = (sioclass & 0xff) >= 3;
-
- if (!sioII)
- printf("WARNING: SIO NOT SIO II... NO BETS...\n");
pc->pc_intr_v = core;
pc->pc_intr_map = dec_2100_a50_intr_map;
@@ -98,8 +87,6 @@ dec_2100_a50_intr_map(const struct pci_a
int buspin = pa->pa_intrpin;
pci_chipset_tag_t pc = pa->pa_pc;
int device, pirq;
- pcireg_t pirqreg;
- uint8_t pirqline;
#ifndef DIAGNOSTIC
pirq = 0; /* XXX gcc -Wuninitialized */
@@ -189,22 +176,10 @@ dec_2100_a50_intr_map(const struct pci_a
return 1;
}
- pirqreg = pci_conf_read(pc, pci_make_tag(pc, 0, APECS_SIO_DEVICE, 0),
- SIO_PCIREG_PIRQ_RTCTRL);
#if 0
- printf("pci_2100_a50_intr_map: device %d pin %c: pirq %d, reg = %x\n",
- device, '@' + buspin, pirq, pirqreg);
-#endif
- pirqline = (pirqreg >> (pirq * 8)) & 0xff;
- if ((pirqline & 0x80) != 0)
- return 1;
- pirqline &= 0xf;
-
-#if 0
- printf("pci_2100_a50_intr_map: device %d pin %c: mapped to line %d\n",
- device, '@' + buspin, pirqline);
+ printf("pci_2100_a50_intr_map: device %d pin %c: pirq %d\n",
+ device, '@' + buspin, pirq);
#endif
- alpha_pci_intr_handle_init(ihp, pirqline, 0);
- return (0);
+ return sio_pirq_intr_map(pc, pirq, ihp);
}
diff -r 84e2692ad547 -r 4f39996f7fe4 sys/arch/alpha/pci/pci_axppci_33.c
--- a/sys/arch/alpha/pci/pci_axppci_33.c Fri Jun 25 13:38:21 2021 +0000
+++ b/sys/arch/alpha/pci/pci_axppci_33.c Fri Jun 25 13:41:33 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pci_axppci_33.c,v 1.40 2021/06/19 16:59:07 thorpej Exp $ */
+/* $NetBSD: pci_axppci_33.c,v 1.41 2021/06/25 13:41:33 thorpej Exp $ */
/*
* Copyright (c) 1995, 1996 Carnegie-Mellon University.
@@ -29,7 +29,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: pci_axppci_33.c,v 1.40 2021/06/19 16:59:07 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pci_axppci_33.c,v 1.41 2021/06/25 13:41:33 thorpej Exp $");
#include <sys/types.h>
#include <sys/param.h>
@@ -57,22 +57,10 @@
static int dec_axppci_33_intr_map(const struct pci_attach_args *,
pci_intr_handle_t *);
-#define LCA_SIO_DEVICE 7 /* XXX */
-
static void
pci_axppci_33_pickintr(void *core, bus_space_tag_t iot, bus_space_tag_t memt,
pci_chipset_tag_t pc)
{
- pcireg_t sioclass;
- int sioII;
-
- /* XXX MAGIC NUMBER */
- sioclass = pci_conf_read(pc, pci_make_tag(pc, 0, LCA_SIO_DEVICE, 0),
- PCI_CLASS_REG);
- sioII = (sioclass & 0xff) >= 3;
-
- if (!sioII)
- printf("WARNING: SIO NOT SIO II... NO BETS...\n");
pc->pc_intr_v = core;
pc->pc_intr_map = dec_axppci_33_intr_map;
@@ -99,8 +87,6 @@ dec_axppci_33_intr_map(const struct pci_
int buspin = pa->pa_intrpin;
pci_chipset_tag_t pc = pa->pa_pc;
int device, pirq;
- pcireg_t pirqreg;
- uint8_t pirqline;
#ifndef DIAGNOSTIC
pirq = 0; /* XXX gcc -Wuninitialized */
@@ -189,22 +175,10 @@ dec_axppci_33_intr_map(const struct pci_
return 1;
}
- pirqreg = pci_conf_read(pc, pci_make_tag(pc, 0, LCA_SIO_DEVICE, 0),
- SIO_PCIREG_PIRQ_RTCTRL);
#if 0
- printf("dec_axppci_33_intr_map: device %d pin %c: pirq %d, reg = %x\n",
- device, '@' + buspin, pirq, pirqreg);
-#endif
- pirqline = (pirqreg >> (pirq * 8)) & 0xff;
- if ((pirqline & 0x80) != 0)
- return 1; /* not routed? */
- pirqline &= 0xf;
-
-#if 0
- printf("dec_axppci_33_intr_map: device %d pin %c: mapped to line %d\n",
- device, '@' + buspin, pirqline);
+ printf("dec_axppci_33_intr_map: device %d pin %c: pirq %d\n",
+ device, '@' + buspin, pirq);
#endif
- alpha_pci_intr_handle_init(ihp, pirqline, 0);
- return (0);
+ return sio_pirq_intr_map(pc, pirq, ihp);
}
diff -r 84e2692ad547 -r 4f39996f7fe4 sys/arch/alpha/pci/sio_pic.c
--- a/sys/arch/alpha/pci/sio_pic.c Fri Jun 25 13:38:21 2021 +0000
+++ b/sys/arch/alpha/pci/sio_pic.c Fri Jun 25 13:41:33 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: sio_pic.c,v 1.48 2021/05/08 00:08:43 thorpej Exp $ */
+/* $NetBSD: sio_pic.c,v 1.49 2021/06/25 13:41:33 thorpej Exp $ */
/*-
* Copyright (c) 1998, 2000, 2020 The NetBSD Foundation, Inc.
@@ -59,7 +59,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: sio_pic.c,v 1.48 2021/05/08 00:08:43 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sio_pic.c,v 1.49 2021/06/25 13:41:33 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -84,6 +84,7 @@
#include <dev/isa/isareg.h>
#include <dev/isa/isavar.h>
+#include <alpha/pci/sioreg.h>
#include <alpha/pci/siovar.h>
#include "sio.h"
@@ -531,6 +532,36 @@ sio_intr_disestablish(void *v, void *coo
alpha_shared_intr_free_intrhand(cookie);
}
+/* XXX All known Alpha systems with Intel i82378 have it at device 7. */
+#define SIO_I82378_DEV 7
+
+int
+sio_pirq_intr_map(pci_chipset_tag_t pc, int pirq, pci_intr_handle_t *ihp)
+{
+ KASSERT(pirq >= 0 && pirq <= 3);
+ KASSERT(pc == sio_pc);
+
+ const pcireg_t rtctrl =
+ pci_conf_read(sio_pc, pci_make_tag(sio_pc, 0, SIO_I82378_DEV, 0),
+ SIO_PCIREG_PIRQ_RTCTRL);
+ const pcireg_t pirqreg = PIRQ_RTCTRL_PIRQx(rtctrl, pirq);
+
+ if (pirqreg & PIRQ_RTCTRL_NOT_ROUTED) {
+ /* not routed -> no mapping */
+ return 1;
+ }
+
+ const int irq = __SHIFTOUT(pirqreg, PIRQ_RTCTRL_IRQ);
+
+#if 0
+ printf("sio_pirq_intr_map: pirq %d -> ISA irq %d, rtctl = 0x%08x\n",
+ pirq, irq, rtctrl);
+#endif
+
+ alpha_pci_intr_handle_init(ihp, irq, 0);
+ return 0;
+}
+
const char *
sio_pci_intr_string(pci_chipset_tag_t const pc, pci_intr_handle_t const ih,
char * const buf, size_t const len)
diff -r 84e2692ad547 -r 4f39996f7fe4 sys/arch/alpha/pci/siovar.h
--- a/sys/arch/alpha/pci/siovar.h Fri Jun 25 13:38:21 2021 +0000
+++ b/sys/arch/alpha/pci/siovar.h Fri Jun 25 13:41:33 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: siovar.h,v 1.13 2020/09/22 15:24:02 thorpej Exp $ */
+/* $NetBSD: siovar.h,v 1.14 2021/06/25 13:41:33 thorpej Exp $ */
/*
* Copyright (c) 1995, 1996 Carnegie-Mellon University.
@@ -37,6 +37,7 @@ void *sio_intr_establish(void *, int, in
void sio_intr_disestablish(void *, void *);
int sio_intr_alloc(void *, int, int, int *);
+int sio_pirq_intr_map(pci_chipset_tag_t, int, pci_intr_handle_t *);
const char *sio_pci_intr_string(pci_chipset_tag_t, pci_intr_handle_t,
char *, size_t);
const struct evcnt *sio_pci_intr_evcnt(pci_chipset_tag_t, pci_intr_handle_t);
Home |
Main Index |
Thread Index |
Old Index