300 picsetup();
301
302 /*
303 * program timer 0
304 */
305 (void) uppc_clkinit(hz);
306
307 return (PSM_SUCCESS);
308 }
309
310 /*ARGSUSED3*/
311 static int
312 uppc_addspl(int irqno, int ipl, int min_ipl, int max_ipl)
313 {
314 struct standard_pic *pp;
315 int i;
316 int startidx;
317 uchar_t vectmask;
318
319 if (irqno <= MAX_ISA_IRQ)
320 atomic_add_16(&uppc_irq_shared_table[irqno], 1);
321
322 if (ipl != min_ipl)
323 return (0);
324
325 if (irqno > 7) {
326 vectmask = 1 << (irqno - 8);
327 startidx = (ipl << 1);
328 } else {
329 vectmask = 1 << irqno;
330 startidx = (ipl << 1) + 1;
331 }
332
333 /*
334 * mask intr same or above ipl
335 * level MAXIPL has all intr off as init. default
336 */
337 pp = &pics0;
338 for (i = startidx; i < (MAXIPL << 1); i += 2) {
339 if (pp->c_iplmask[i] & vectmask)
340 break;
343
344 /*
345 * unmask intr below ipl
346 */
347 for (i = startidx-2; i >= 0; i -= 2) {
348 if (!(pp->c_iplmask[i] & vectmask))
349 break;
350 pp->c_iplmask[i] &= ~vectmask;
351 }
352 return (0);
353 }
354
355 static int
356 uppc_delspl(int irqno, int ipl, int min_ipl, int max_ipl)
357 {
358 struct standard_pic *pp;
359 int i;
360 uchar_t vectmask;
361
362 if (irqno <= MAX_ISA_IRQ)
363 atomic_add_16(&uppc_irq_shared_table[irqno], -1);
364
365 /*
366 * skip if we are not deleting the last handler
367 * and the ipl is higher than minimum
368 */
369 if ((max_ipl != PSM_INVALID_IPL) && (ipl >= min_ipl))
370 return (0);
371
372 if (irqno > 7) {
373 vectmask = 1 << (irqno - 8);
374 i = 0;
375 } else {
376 vectmask = 1 << irqno;
377 i = 1;
378 }
379
380 pp = &pics0;
381
382 /*
383 * check any handlers left for this irqno
|
300 picsetup();
301
302 /*
303 * program timer 0
304 */
305 (void) uppc_clkinit(hz);
306
307 return (PSM_SUCCESS);
308 }
309
310 /*ARGSUSED3*/
311 static int
312 uppc_addspl(int irqno, int ipl, int min_ipl, int max_ipl)
313 {
314 struct standard_pic *pp;
315 int i;
316 int startidx;
317 uchar_t vectmask;
318
319 if (irqno <= MAX_ISA_IRQ)
320 atomic_inc_16(&uppc_irq_shared_table[irqno]);
321
322 if (ipl != min_ipl)
323 return (0);
324
325 if (irqno > 7) {
326 vectmask = 1 << (irqno - 8);
327 startidx = (ipl << 1);
328 } else {
329 vectmask = 1 << irqno;
330 startidx = (ipl << 1) + 1;
331 }
332
333 /*
334 * mask intr same or above ipl
335 * level MAXIPL has all intr off as init. default
336 */
337 pp = &pics0;
338 for (i = startidx; i < (MAXIPL << 1); i += 2) {
339 if (pp->c_iplmask[i] & vectmask)
340 break;
343
344 /*
345 * unmask intr below ipl
346 */
347 for (i = startidx-2; i >= 0; i -= 2) {
348 if (!(pp->c_iplmask[i] & vectmask))
349 break;
350 pp->c_iplmask[i] &= ~vectmask;
351 }
352 return (0);
353 }
354
355 static int
356 uppc_delspl(int irqno, int ipl, int min_ipl, int max_ipl)
357 {
358 struct standard_pic *pp;
359 int i;
360 uchar_t vectmask;
361
362 if (irqno <= MAX_ISA_IRQ)
363 atomic_dec_16(&uppc_irq_shared_table[irqno]);
364
365 /*
366 * skip if we are not deleting the last handler
367 * and the ipl is higher than minimum
368 */
369 if ((max_ipl != PSM_INVALID_IPL) && (ipl >= min_ipl))
370 return (0);
371
372 if (irqno > 7) {
373 vectmask = 1 << (irqno - 8);
374 i = 0;
375 } else {
376 vectmask = 1 << irqno;
377 i = 1;
378 }
379
380 pp = &pics0;
381
382 /*
383 * check any handlers left for this irqno
|