74 "Cannot register interrupt for '%s' device at IPL %d because it\n"
75 "conflicts with another device using the same vector %d with an IPL\n"
76 "of %d. Reconfigure the conflicting devices to use different vectors.";
77
78 #ifdef __xpv
79 #define MAX_VECT NR_IRQS
80 #else
81 #define MAX_VECT 256
82 #endif
83
84 struct autovec *nmivect = NULL;
85 struct av_head autovect[MAX_VECT];
86 struct av_head softvect[LOCK_LEVEL + 1];
87 kmutex_t av_lock;
88 /*
89 * These are software interrupt handlers dedicated to ddi timer.
90 * The interrupt levels up to 10 are supported, but high interrupts
91 * must not be used there.
92 */
93 ddi_softint_hdl_impl_t softlevel_hdl[DDI_IPL_10] = {
94 {0, NULL, NULL, NULL, 0, NULL, NULL, NULL}, /* level 1 */
95 {0, NULL, NULL, NULL, 0, NULL, NULL, NULL}, /* level 2 */
96 {0, NULL, NULL, NULL, 0, NULL, NULL, NULL}, /* level 3 */
97 {0, NULL, NULL, NULL, 0, NULL, NULL, NULL}, /* level 4 */
98 {0, NULL, NULL, NULL, 0, NULL, NULL, NULL}, /* level 5 */
99 {0, NULL, NULL, NULL, 0, NULL, NULL, NULL}, /* level 6 */
100 {0, NULL, NULL, NULL, 0, NULL, NULL, NULL}, /* level 7 */
101 {0, NULL, NULL, NULL, 0, NULL, NULL, NULL}, /* level 8 */
102 {0, NULL, NULL, NULL, 0, NULL, NULL, NULL}, /* level 9 */
103 {0, NULL, NULL, NULL, 0, NULL, NULL, NULL}, /* level 10 */
104 };
105 ddi_softint_hdl_impl_t softlevel1_hdl =
106 {0, NULL, NULL, NULL, 0, NULL, NULL, NULL};
107
108 /*
109 * clear/check softint pending flag corresponding for
110 * the current CPU
111 */
112 void
113 av_clear_softint_pending(av_softinfo_t *infop)
114 {
115 CPUSET_ATOMIC_DEL(infop->av_pending, CPU->cpu_seqid);
116 }
117
118 boolean_t
119 av_check_softint_pending(av_softinfo_t *infop, boolean_t check_all)
120 {
121 if (check_all)
122 return (!CPUSET_ISNULL(infop->av_pending));
123 else
124 return (CPU_IN_SET(infop->av_pending, CPU->cpu_seqid) != 0);
125 }
126
|
74 "Cannot register interrupt for '%s' device at IPL %d because it\n"
75 "conflicts with another device using the same vector %d with an IPL\n"
76 "of %d. Reconfigure the conflicting devices to use different vectors.";
77
78 #ifdef __xpv
79 #define MAX_VECT NR_IRQS
80 #else
81 #define MAX_VECT 256
82 #endif
83
84 struct autovec *nmivect = NULL;
85 struct av_head autovect[MAX_VECT];
86 struct av_head softvect[LOCK_LEVEL + 1];
87 kmutex_t av_lock;
88 /*
89 * These are software interrupt handlers dedicated to ddi timer.
90 * The interrupt levels up to 10 are supported, but high interrupts
91 * must not be used there.
92 */
93 ddi_softint_hdl_impl_t softlevel_hdl[DDI_IPL_10] = {
94 {NULL, 0, {{NULL}}, NULL, NULL, NULL, NULL, NULL}, /* level 1 */
95 {NULL, 0, {{NULL}}, NULL, NULL, NULL, NULL, NULL}, /* level 2 */
96 {NULL, 0, {{NULL}}, NULL, NULL, NULL, NULL, NULL}, /* level 3 */
97 {NULL, 0, {{NULL}}, NULL, NULL, NULL, NULL, NULL}, /* level 4 */
98 {NULL, 0, {{NULL}}, NULL, NULL, NULL, NULL, NULL}, /* level 5 */
99 {NULL, 0, {{NULL}}, NULL, NULL, NULL, NULL, NULL}, /* level 6 */
100 {NULL, 0, {{NULL}}, NULL, NULL, NULL, NULL, NULL}, /* level 7 */
101 {NULL, 0, {{NULL}}, NULL, NULL, NULL, NULL, NULL}, /* level 8 */
102 {NULL, 0, {{NULL}}, NULL, NULL, NULL, NULL, NULL}, /* level 9 */
103 {NULL, 0, {{NULL}}, NULL, NULL, NULL, NULL, NULL}, /* level 10 */
104 };
105 ddi_softint_hdl_impl_t softlevel1_hdl =
106 {NULL, 0, {{NULL}}, NULL, NULL, NULL, NULL, NULL};
107
108 /*
109 * clear/check softint pending flag corresponding for
110 * the current CPU
111 */
112 void
113 av_clear_softint_pending(av_softinfo_t *infop)
114 {
115 CPUSET_ATOMIC_DEL(infop->av_pending, CPU->cpu_seqid);
116 }
117
118 boolean_t
119 av_check_softint_pending(av_softinfo_t *infop, boolean_t check_all)
120 {
121 if (check_all)
122 return (!CPUSET_ISNULL(infop->av_pending));
123 else
124 return (CPU_IN_SET(infop->av_pending, CPU->cpu_seqid) != 0);
125 }
126
|