Module Name: src
Committed By: macallan
Date: Wed Dec 28 06:50:23 UTC 2022
Modified Files:
src/sys/arch/macppc/macppc: pic_u3_ht.c
Log Message:
support cascading:
- attach on both /u3 and /u4
- install IPI handling only if we're primary
- link to primary PIC if we're cascaded
To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/macppc/macppc/pic_u3_ht.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/macppc/macppc/pic_u3_ht.c
diff -u src/sys/arch/macppc/macppc/pic_u3_ht.c:1.12 src/sys/arch/macppc/macppc/pic_u3_ht.c:1.13
--- src/sys/arch/macppc/macppc/pic_u3_ht.c:1.12 Sat Mar 6 07:29:05 2021
+++ src/sys/arch/macppc/macppc/pic_u3_ht.c Wed Dec 28 06:50:23 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: pic_u3_ht.c,v 1.12 2021/03/06 07:29:05 rin Exp $ */
+/* $NetBSD: pic_u3_ht.c,v 1.13 2022/12/28 06:50:23 macallan Exp $ */
/*-
* Copyright (c) 2013 Phileas Fogg
* All rights reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pic_u3_ht.c,v 1.12 2021/03/06 07:29:05 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pic_u3_ht.c,v 1.13 2022/12/28 06:50:23 macallan Exp $");
#include "opt_openpic.h"
#include "opt_interrupt.h"
@@ -79,7 +79,7 @@ struct u3_ht_ops {
#define u3_ht_read(ptr,reg) (ptr)->ht_read(ptr, reg)
#define u3_ht_write(ptr,reg,val) (ptr)->ht_write(ptr, reg, val)
-static struct u3_ht_ops *setup_u3_ht(uint32_t, uint32_t, int);
+static struct u3_ht_ops *setup_u3_ht(uint32_t, uint32_t, int, int);
static int setup_u3_ht_workarounds(struct u3_ht_ops *);
static void u3_ht_enable_irq(struct pic_ops *, int, int);
@@ -130,15 +130,18 @@ static void u3_ht_establish_ipi(int, int
int init_u3_ht(void)
{
- int u4, pic;
+ int u4, pic, irq = -1;
uint32_t reg[2];
uint32_t base, len, tmp;
int bigendian;
volatile uint8_t *unin_reg;
u4 = OF_finddevice("/u4");
- if (u4 == -1)
- return FALSE;
+ if (u4 == -1) {
+ u4 = OF_finddevice("/u3");
+ if (u4 == -1)
+ return FALSE;
+ }
if (! of_compatible(u4, u3_compat))
return FALSE;
@@ -173,15 +176,21 @@ int init_u3_ht(void)
base = reg[0];
len = reg[1];
- aprint_normal("found U3/U4 HT PIC at %08x\n", base);
+ if (OF_getprop(pic, "interrupts", reg, 8) > 4) {
+ /* this is a cascaded PIC */
+ irq = reg[0];
+ aprint_normal("found cascaded U3/U4 HT PIC at %08x, IRQ %d\n",
+ base, irq);
+ } else
+ aprint_normal("found U3/U4 HT PIC at %08x\n", base);
- setup_u3_ht(base, len, bigendian);
+ setup_u3_ht(base, len, bigendian, irq);
return TRUE;
}
static struct u3_ht_ops *
-setup_u3_ht(uint32_t addr, uint32_t len, int bigendian)
+setup_u3_ht(uint32_t addr, uint32_t len, int bigendian, int cirq)
{
struct u3_ht_ops *u3_ht;
struct pic_ops *pic;
@@ -264,16 +273,24 @@ setup_u3_ht(uint32_t addr, uint32_t len,
u3_ht_eoi(u3_ht, 0);
}
+ if (cirq > -1) {
+ /* we're subordinate to a normal openpic */
+ intr_establish_xname(cirq, IST_EDGE, IPL_HIGH,
+ pic_handle_intr, pic, "u3_ht");
+ }
#ifdef MULTIPROCESSOR
- ipiops.ppc_send_ipi = u3_ht_send_ipi;
- ipiops.ppc_establish_ipi = u3_ht_establish_ipi;
- ipiops.ppc_ipi_vector = IPI_VECTOR;
-
- x = u3_ht_read(u3_ht, OPENPIC_IPI_VECTOR(1));
- x &= ~(OPENPIC_IMASK | OPENPIC_PRIORITY_MASK | OPENPIC_VECTOR_MASK);
- x |= (15 << OPENPIC_PRIORITY_SHIFT) | ipiops.ppc_ipi_vector;
- u3_ht_write(u3_ht, OPENPIC_IPI_VECTOR(1), x);
- u3ht0 = u3_ht;
+ else {
+ /* only handle IPIs if we're the only openpic */
+ ipiops.ppc_send_ipi = u3_ht_send_ipi;
+ ipiops.ppc_establish_ipi = u3_ht_establish_ipi;
+ ipiops.ppc_ipi_vector = IPI_VECTOR;
+
+ x = u3_ht_read(u3_ht, OPENPIC_IPI_VECTOR(1));
+ x &= ~(OPENPIC_IMASK | OPENPIC_PRIORITY_MASK | OPENPIC_VECTOR_MASK);
+ x |= (15 << OPENPIC_PRIORITY_SHIFT) | ipiops.ppc_ipi_vector;
+ u3_ht_write(u3_ht, OPENPIC_IPI_VECTOR(1), x);
+ u3ht0 = u3_ht;
+ }
#endif /* MULTIPROCESSOR */
return u3_ht;