grufault.c (e006043a4d2da52bba9fd9cb7e5a22e2951ff69b) grufault.c (67bf04a5c2574e9495f660f418f6df776821d578)
1/*
2 * SN Platform GRU Driver
3 *
4 * FAULT HANDLER FOR GRU DETECTED TLB MISSES
5 *
6 * This file contains code that handles TLB misses within the GRU.
7 * These misses are reported either via interrupts or user polling of
8 * the user CB.

--- 319 unchanged lines hidden (view full) ---

328
329 /*
330 * Error if TFH state is IDLE or FMM mode & the user issuing a UPM call.
331 * Might be a hardware race OR a stupid user. Ignore FMM because FMM
332 * is a transient state.
333 */
334 if (tfh->status != TFHSTATUS_EXCEPTION) {
335 gru_flush_cache(tfh);
1/*
2 * SN Platform GRU Driver
3 *
4 * FAULT HANDLER FOR GRU DETECTED TLB MISSES
5 *
6 * This file contains code that handles TLB misses within the GRU.
7 * These misses are reported either via interrupts or user polling of
8 * the user CB.

--- 319 unchanged lines hidden (view full) ---

328
329 /*
330 * Error if TFH state is IDLE or FMM mode & the user issuing a UPM call.
331 * Might be a hardware race OR a stupid user. Ignore FMM because FMM
332 * is a transient state.
333 */
334 if (tfh->status != TFHSTATUS_EXCEPTION) {
335 gru_flush_cache(tfh);
336 sync_core();
336 if (tfh->status != TFHSTATUS_EXCEPTION)
337 goto failnoexception;
338 STAT(tfh_stale_on_fault);
339 }
340 if (tfh->state == TFHSTATE_IDLE)
341 goto failidle;
342 if (tfh->state == TFHSTATE_MISS_FMM && cbk)
343 goto failfmm;

--- 250 unchanged lines hidden (view full) ---

594
595 ucbnum = get_cb_number((void *)excdet.cb);
596 if (ucbnum >= gts->ts_cbr_au_count * GRU_CBR_AU_SIZE) {
597 ret = -EINVAL;
598 } else if (gts->ts_gru) {
599 cbrnum = thread_cbr_number(gts, ucbnum);
600 cbe = get_cbe_by_index(gts->ts_gru, cbrnum);
601 gru_flush_cache(cbe); /* CBE not coherent */
337 if (tfh->status != TFHSTATUS_EXCEPTION)
338 goto failnoexception;
339 STAT(tfh_stale_on_fault);
340 }
341 if (tfh->state == TFHSTATE_IDLE)
342 goto failidle;
343 if (tfh->state == TFHSTATE_MISS_FMM && cbk)
344 goto failfmm;

--- 250 unchanged lines hidden (view full) ---

595
596 ucbnum = get_cb_number((void *)excdet.cb);
597 if (ucbnum >= gts->ts_cbr_au_count * GRU_CBR_AU_SIZE) {
598 ret = -EINVAL;
599 } else if (gts->ts_gru) {
600 cbrnum = thread_cbr_number(gts, ucbnum);
601 cbe = get_cbe_by_index(gts->ts_gru, cbrnum);
602 gru_flush_cache(cbe); /* CBE not coherent */
603 sync_core(); /* make sure we are have current data */
602 excdet.opc = cbe->opccpy;
603 excdet.exopc = cbe->exopccpy;
604 excdet.ecause = cbe->ecause;
605 excdet.exceptdet0 = cbe->idef1upd;
606 excdet.exceptdet1 = cbe->idef3upd;
607 excdet.cbrstate = cbe->cbrstate;
608 excdet.cbrexecstatus = cbe->cbrexecstatus;
609 gru_flush_cache(cbe);

--- 173 unchanged lines hidden ---
604 excdet.opc = cbe->opccpy;
605 excdet.exopc = cbe->exopccpy;
606 excdet.ecause = cbe->ecause;
607 excdet.exceptdet0 = cbe->idef1upd;
608 excdet.exceptdet1 = cbe->idef3upd;
609 excdet.cbrstate = cbe->cbrstate;
610 excdet.cbrexecstatus = cbe->cbrexecstatus;
611 gru_flush_cache(cbe);

--- 173 unchanged lines hidden ---