1 /* $NetBSD: picvar.h,v 1.16 2026/03/04 10:54:32 jmcneill Exp $ */ 2 3 /*- 4 * Copyright (c) 2007 Michael Lorenz 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #include <sys/cdefs.h> 30 __KERNEL_RCSID(0, "$NetBSD: picvar.h,v 1.16 2026/03/04 10:54:32 jmcneill Exp $"); 31 32 #ifndef PIC_VAR_H 33 #define PIC_VAR_H 34 35 #include <sys/intr.h> 36 37 struct pic_ops { 38 void *pic_cookie; /* private stuff / hardware info */ 39 int pic_intrbase; /* global number of the 1st IRQ we handle */ 40 int pic_numintrs; /* how many IRQs do we handle? */ 41 /* 42 * all functions that take an IRQ number as argument need a local 43 * interrupt number 44 */ 45 void (*pic_enable_irq)(struct pic_ops *, int, int); 46 void (*pic_reenable_irq)(struct pic_ops *, int, int); 47 void (*pic_disable_irq)(struct pic_ops *, int); 48 int (*pic_get_irq)(struct pic_ops *, int); /* PIC_GET_* */ 49 void (*pic_ack_irq)(struct pic_ops *, int); /* IRQ numbner */ 50 /* IRQ number, type, priority */ 51 void (*pic_establish_irq)(struct pic_ops *, int, int, int); 52 /* finish setup after CPUs are attached */ 53 void (*pic_finish_setup)(struct pic_ops *); 54 char pic_name[16]; 55 }; 56 57 struct intr_source { 58 int is_type; 59 int is_ipl; 60 int is_hwirq; 61 imask_t is_mask; 62 struct intrhand *is_hand; 63 struct pic_ops *is_pic; 64 bool is_cascaded; 65 struct evcnt is_ev; 66 char is_evname[16]; 67 char is_intrid[INTRIDBUF]; 68 u_int is_cpuindex; 69 }; 70 71 #define OPENPIC_MAX_ISUS 4 72 #define OPENPIC_FLAG_DIST (1<<0) 73 #define OPENPIC_FLAG_LE (1<<1) 74 75 struct openpic_ops { 76 struct pic_ops pic; 77 uint32_t flags; 78 int nrofisus; 79 volatile unsigned char **isu; 80 uint8_t *irq_per; 81 }; 82 83 struct i8259_ops { 84 struct pic_ops pic; 85 uint32_t pending_events; 86 uint32_t enable_mask; 87 uint32_t irqs; 88 }; 89 90 /* 91 * add a pic, fill in pic_intrbase, return pic_intrbase on success, 92 * -1 otherwise 93 * the PIC must be initialized and ready for use 94 */ 95 int pic_add(struct pic_ops *); 96 97 void pic_do_pending_int(void); 98 void pic_enable_irq(int); 99 void pic_disable_irq(int); 100 int pic_handle_intr(void *); 101 void pic_mark_pending(int); 102 void pic_ext_intr(void); 103 void pic_init(void); 104 const char *intr_typename(int); 105 void dummy_pic_establish_intr(struct pic_ops *, int, int, int); 106 107 /* this is called after attaching CPUs so PICs can setup interrupt routing */ 108 void pic_finish_setup(void); 109 110 /* address, enable passthrough */ 111 #define PIC_IVR_IBM 0 112 #define PIC_IVR_MOT 1 113 #define PIC_GET_IRQ 0 114 #define PIC_GET_RECHECK 1 115 struct pic_ops *setup_openpic(void *, int); 116 struct pic_ops *setup_distributed_openpic(void *, int, void **, int *); 117 struct pic_ops *setup_prepivr(int); 118 struct pic_ops *setup_i8259(void); 119 struct pic_ops *setup_mpcpic(void *); 120 void mpcpic_reserv16(void); 121 struct pic_ops *find_pic_by_cookie(void *); 122 123 /* i8259 common decls */ 124 void i8259_initialize(void); 125 void i8259_enable_irq(struct pic_ops *, int, int); 126 void i8259_disable_irq(struct pic_ops *, int); 127 void i8259_ack_irq(struct pic_ops *, int); 128 int i8259_get_irq(struct pic_ops *, int); 129 130 /* openpic common decls */ 131 void opic_finish_setup(struct pic_ops *pic); 132 void openpic_set_priority(int cpu, int pri); 133 int opic_get_irq(struct pic_ops *pic, int mode); 134 void opic_ack_irq(struct pic_ops *pic, int irq); 135 136 /* IPI handler */ 137 int cpuintr(void *); 138 /* XXX - may need to be PIC specific */ 139 #define IPI_VECTOR 128 140 141 #endif /* PIC_VAR_H */ 142