Commit 270952a9 authored by Jack Steiner's avatar Jack Steiner Committed by Linus Torvalds

gru: update to rev 0.9 of gru spec

Update GRU driver to the latest version of the GRU spec. This consists
of minor updates:
	- changes & additions to error status bits
	- new restriction on handling of TLB misses while in FMM mode
	- new field (not used by software) in TFH
Signed-off-by: default avatarJack Steiner <steiner@sgi.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent eb5bd5e5
...@@ -253,32 +253,37 @@ struct gru_instruction { ...@@ -253,32 +253,37 @@ struct gru_instruction {
#define CBE_CAUSE_HA_RESPONSE_FATAL (1 << 13) #define CBE_CAUSE_HA_RESPONSE_FATAL (1 << 13)
#define CBE_CAUSE_HA_RESPONSE_NON_FATAL (1 << 14) #define CBE_CAUSE_HA_RESPONSE_NON_FATAL (1 << 14)
#define CBE_CAUSE_ADDRESS_SPACE_DECODE_ERROR (1 << 15) #define CBE_CAUSE_ADDRESS_SPACE_DECODE_ERROR (1 << 15)
#define CBE_CAUSE_RESPONSE_DATA_ERROR (1 << 16) #define CBE_CAUSE_PROTOCOL_STATE_DATA_ERROR (1 << 16)
#define CBE_CAUSE_PROTOCOL_STATE_DATA_ERROR (1 << 17) #define CBE_CAUSE_RA_RESPONSE_DATA_ERROR (1 << 17)
#define CBE_CAUSE_HA_RESPONSE_DATA_ERROR (1 << 18)
/* CBE cbrexecstatus bits */ /* CBE cbrexecstatus bits */
#define CBR_EXS_ABORT_OCC_BIT 0 #define CBR_EXS_ABORT_OCC_BIT 0
#define CBR_EXS_INT_OCC_BIT 1 #define CBR_EXS_INT_OCC_BIT 1
#define CBR_EXS_PENDING_BIT 2 #define CBR_EXS_PENDING_BIT 2
#define CBR_EXS_QUEUED_BIT 3 #define CBR_EXS_QUEUED_BIT 3
#define CBR_EXS_TLBHW_BIT 4 #define CBR_EXS_TLB_INVAL_BIT 4
#define CBR_EXS_EXCEPTION_BIT 5 #define CBR_EXS_EXCEPTION_BIT 5
#define CBR_EXS_ABORT_OCC (1 << CBR_EXS_ABORT_OCC_BIT) #define CBR_EXS_ABORT_OCC (1 << CBR_EXS_ABORT_OCC_BIT)
#define CBR_EXS_INT_OCC (1 << CBR_EXS_INT_OCC_BIT) #define CBR_EXS_INT_OCC (1 << CBR_EXS_INT_OCC_BIT)
#define CBR_EXS_PENDING (1 << CBR_EXS_PENDING_BIT) #define CBR_EXS_PENDING (1 << CBR_EXS_PENDING_BIT)
#define CBR_EXS_QUEUED (1 << CBR_EXS_QUEUED_BIT) #define CBR_EXS_QUEUED (1 << CBR_EXS_QUEUED_BIT)
#define CBR_EXS_TLBHW (1 << CBR_EXS_TLBHW_BIT) #define CBR_TLB_INVAL (1 << CBR_EXS_TLB_INVAL_BIT)
#define CBR_EXS_EXCEPTION (1 << CBR_EXS_EXCEPTION_BIT) #define CBR_EXS_EXCEPTION (1 << CBR_EXS_EXCEPTION_BIT)
/* /*
* Exceptions are retried for the following cases. If any OTHER bits are set * Exceptions are retried for the following cases. If any OTHER bits are set
* in ecause, the exception is not retryable. * in ecause, the exception is not retryable.
*/ */
#define EXCEPTION_RETRY_BITS (CBE_CAUSE_RESPONSE_DATA_ERROR | \ #define EXCEPTION_RETRY_BITS (CBE_CAUSE_EXECUTION_HW_ERROR | \
CBE_CAUSE_RA_REQUEST_TIMEOUT | \
CBE_CAUSE_TLBHW_ERROR | \ CBE_CAUSE_TLBHW_ERROR | \
CBE_CAUSE_HA_REQUEST_TIMEOUT) CBE_CAUSE_RA_REQUEST_TIMEOUT | \
CBE_CAUSE_RA_RESPONSE_NON_FATAL | \
CBE_CAUSE_HA_RESPONSE_NON_FATAL | \
CBE_CAUSE_RA_RESPONSE_DATA_ERROR | \
CBE_CAUSE_HA_RESPONSE_DATA_ERROR \
)
/* Message queue head structure */ /* Message queue head structure */
union gru_mesqhead { union gru_mesqhead {
......
...@@ -339,8 +339,12 @@ static int gru_try_dropin(struct gru_thread_state *gts, ...@@ -339,8 +339,12 @@ static int gru_try_dropin(struct gru_thread_state *gts,
* Might be a hardware race OR a stupid user. Ignore FMM because FMM * Might be a hardware race OR a stupid user. Ignore FMM because FMM
* is a transient state. * is a transient state.
*/ */
if (tfh->status != TFHSTATUS_EXCEPTION) if (tfh->status != TFHSTATUS_EXCEPTION) {
goto failnoexception; gru_flush_cache(tfh);
if (tfh->status != TFHSTATUS_EXCEPTION)
goto failnoexception;
STAT(tfh_stale_on_fault);
}
if (tfh->state == TFHSTATE_IDLE) if (tfh->state == TFHSTATE_IDLE)
goto failidle; goto failidle;
if (tfh->state == TFHSTATE_MISS_FMM && cb) if (tfh->state == TFHSTATE_MISS_FMM && cb)
......
...@@ -255,7 +255,8 @@ struct gru_tlb_fault_handle { ...@@ -255,7 +255,8 @@ struct gru_tlb_fault_handle {
unsigned int state:3; unsigned int state:3;
unsigned int fill3:1; unsigned int fill3:1;
unsigned int cause:7; unsigned int cause:6;
unsigned int cb_int:1;
unsigned int fill4:1; unsigned int fill4:1;
unsigned int indexway:12; /* DW 0 - high 32 */ unsigned int indexway:12; /* DW 0 - high 32 */
......
...@@ -406,7 +406,8 @@ static int gru_retry_exception(void *cb) ...@@ -406,7 +406,8 @@ static int gru_retry_exception(void *cb)
return CBS_IDLE; return CBS_IDLE;
gru_get_cb_exception_detail(cb, &excdet); gru_get_cb_exception_detail(cb, &excdet);
if (excdet.ecause & ~EXCEPTION_RETRY_BITS) if ((excdet.ecause & ~EXCEPTION_RETRY_BITS) ||
(excdet.cbrexecstatus & CBR_EXS_ABORT_OCC))
break; break;
if (retry-- == 0) if (retry-- == 0)
break; break;
......
...@@ -89,6 +89,7 @@ static int statistics_show(struct seq_file *s, void *p) ...@@ -89,6 +89,7 @@ static int statistics_show(struct seq_file *s, void *p)
printstat(s, tlb_dropin_fail_fmm); printstat(s, tlb_dropin_fail_fmm);
printstat(s, tlb_dropin_fail_no_exception); printstat(s, tlb_dropin_fail_no_exception);
printstat(s, tlb_dropin_fail_no_exception_war); printstat(s, tlb_dropin_fail_no_exception_war);
printstat(s, tfh_stale_on_fault);
printstat(s, mmu_invalidate_range); printstat(s, mmu_invalidate_range);
printstat(s, mmu_invalidate_page); printstat(s, mmu_invalidate_page);
printstat(s, mmu_clear_flush_young); printstat(s, mmu_clear_flush_young);
......
...@@ -212,6 +212,7 @@ struct gru_stats_s { ...@@ -212,6 +212,7 @@ struct gru_stats_s {
atomic_long_t tlb_dropin_fail_fmm; atomic_long_t tlb_dropin_fail_fmm;
atomic_long_t tlb_dropin_fail_no_exception; atomic_long_t tlb_dropin_fail_no_exception;
atomic_long_t tlb_dropin_fail_no_exception_war; atomic_long_t tlb_dropin_fail_no_exception_war;
atomic_long_t tfh_stale_on_fault;
atomic_long_t mmu_invalidate_range; atomic_long_t mmu_invalidate_range;
atomic_long_t mmu_invalidate_page; atomic_long_t mmu_invalidate_page;
atomic_long_t mmu_clear_flush_young; atomic_long_t mmu_clear_flush_young;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment