diff options
| author | Chris Metcalf <cmetcalf@tilera.com> | 2010-11-01 17:00:37 -0400 | 
|---|---|---|
| committer | Chris Metcalf <cmetcalf@tilera.com> | 2010-11-24 13:11:18 -0500 | 
| commit | e5a06939736277c54a68ae275433db55b99d187c (patch) | |
| tree | 94a38715a5af3d269574dd4369e37a0f6f859957 /arch/tile/include/asm/cacheflush.h | |
| parent | 239b0b441449b2c70492880e6c6a4a885afa74ba (diff) | |
drivers/net/tile/: on-chip network drivers for the tile architecture
This change adds the first network driver for the tile architecture,
supporting the on-chip XGBE and GBE shims.
The infrastructure is present for the TILE-Gx networking drivers (another
three source files in the new directory) but for now the the actual
tilegx sources are waiting on releasing hardware to initial customers.
Note that arch/tile/include/hv/* are "upstream" headers from the
Tilera hypervisor and will probably benefit less from LKML review.
Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
Diffstat (limited to 'arch/tile/include/asm/cacheflush.h')
| -rw-r--r-- | arch/tile/include/asm/cacheflush.h | 52 | 
1 files changed, 52 insertions, 0 deletions
| diff --git a/arch/tile/include/asm/cacheflush.h b/arch/tile/include/asm/cacheflush.h index c5741da4eeac..14a3f8556ace 100644 --- a/arch/tile/include/asm/cacheflush.h +++ b/arch/tile/include/asm/cacheflush.h @@ -137,4 +137,56 @@ static inline void finv_buffer(void *buffer, size_t size)  	mb_incoherent();  } +/* + * Flush & invalidate a VA range that is homed remotely on a single core, + * waiting until the memory controller holds the flushed values. + */ +static inline void finv_buffer_remote(void *buffer, size_t size) +{ +	char *p; +	int i; + +	/* +	 * Flush and invalidate the buffer out of the local L1/L2 +	 * and request the home cache to flush and invalidate as well. +	 */ +	__finv_buffer(buffer, size); + +	/* +	 * Wait for the home cache to acknowledge that it has processed +	 * all the flush-and-invalidate requests.  This does not mean +	 * that the flushed data has reached the memory controller yet, +	 * but it does mean the home cache is processing the flushes. +	 */ +	__insn_mf(); + +	/* +	 * Issue a load to the last cache line, which can't complete +	 * until all the previously-issued flushes to the same memory +	 * controller have also completed.  If we weren't striping +	 * memory, that one load would be sufficient, but since we may +	 * be, we also need to back up to the last load issued to +	 * another memory controller, which would be the point where +	 * we crossed an 8KB boundary (the granularity of striping +	 * across memory controllers).  Keep backing up and doing this +	 * until we are before the beginning of the buffer, or have +	 * hit all the controllers. +	 */ +	for (i = 0, p = (char *)buffer + size - 1; +	     i < (1 << CHIP_LOG_NUM_MSHIMS()) && p >= (char *)buffer; +	     ++i) { +		const unsigned long STRIPE_WIDTH = 8192; + +		/* Force a load instruction to issue. */ +		*(volatile char *)p; + +		/* Jump to end of previous stripe. */ +		p -= STRIPE_WIDTH; +		p = (char *)((unsigned long)p | (STRIPE_WIDTH - 1)); +	} + +	/* Wait for the loads (and thus flushes) to have completed. */ +	__insn_mf(); +} +  #endif /* _ASM_TILE_CACHEFLUSH_H */ | 
