-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Original port to early 2.6 kernel using TI COFF toolchain. Brought up to date by Mark Salter <msalter@redhat.com> Signed-off-by: Aurelien Jacquiot <a-jacquiot@ti.com> Signed-off-by: Mark Salter <msalter@redhat.com> Acked-by: Arnd Bergmann <arnd@arndb.de>
- Loading branch information
Aurelien Jacquiot
authored and
Mark Salter
committed
Oct 6, 2011
1 parent
81ec988
commit 784bdcd
Showing
3 changed files
with
600 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
/* | ||
* Port on Texas Instruments TMS320C6x architecture | ||
* | ||
* Copyright (C) 2005, 2006, 2009, 2010 Texas Instruments Incorporated | ||
* Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com) | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
*/ | ||
#ifndef _ASM_C6X_CACHE_H | ||
#define _ASM_C6X_CACHE_H | ||
|
||
#include <linux/irqflags.h> | ||
|
||
/* | ||
* Cache line size | ||
*/ | ||
#define L1D_CACHE_BYTES 64 | ||
#define L1P_CACHE_BYTES 32 | ||
#define L2_CACHE_BYTES 128 | ||
|
||
/* | ||
* L2 used as cache | ||
*/ | ||
#define L2MODE_SIZE L2MODE_256K_CACHE | ||
|
||
/* | ||
* For practical reasons the L1_CACHE_BYTES defines should not be smaller than | ||
* the L2 line size | ||
*/ | ||
#define L1_CACHE_BYTES L2_CACHE_BYTES | ||
|
||
#define L2_CACHE_ALIGN_LOW(x) \ | ||
(((x) & ~(L2_CACHE_BYTES - 1))) | ||
#define L2_CACHE_ALIGN_UP(x) \ | ||
(((x) + (L2_CACHE_BYTES - 1)) & ~(L2_CACHE_BYTES - 1)) | ||
#define L2_CACHE_ALIGN_CNT(x) \ | ||
(((x) + (sizeof(int) - 1)) & ~(sizeof(int) - 1)) | ||
|
||
#define ARCH_DMA_MINALIGN L1_CACHE_BYTES | ||
#define ARCH_SLAB_MINALIGN L1_CACHE_BYTES | ||
|
||
/* | ||
* This is the granularity of hardware cacheability control. | ||
*/ | ||
#define CACHEABILITY_ALIGN 0x01000000 | ||
|
||
/* | ||
* Align a physical address to MAR regions | ||
*/ | ||
#define CACHE_REGION_START(v) \ | ||
(((u32) (v)) & ~(CACHEABILITY_ALIGN - 1)) | ||
#define CACHE_REGION_END(v) \ | ||
(((u32) (v) + (CACHEABILITY_ALIGN - 1)) & ~(CACHEABILITY_ALIGN - 1)) | ||
|
||
extern void __init c6x_cache_init(void); | ||
|
||
extern void enable_caching(unsigned long start, unsigned long end); | ||
extern void disable_caching(unsigned long start, unsigned long end); | ||
|
||
extern void L1_cache_off(void); | ||
extern void L1_cache_on(void); | ||
|
||
extern void L1P_cache_global_invalidate(void); | ||
extern void L1D_cache_global_invalidate(void); | ||
extern void L1D_cache_global_writeback(void); | ||
extern void L1D_cache_global_writeback_invalidate(void); | ||
extern void L2_cache_set_mode(unsigned int mode); | ||
extern void L2_cache_global_writeback_invalidate(void); | ||
extern void L2_cache_global_writeback(void); | ||
|
||
extern void L1P_cache_block_invalidate(unsigned int start, unsigned int end); | ||
extern void L1D_cache_block_invalidate(unsigned int start, unsigned int end); | ||
extern void L1D_cache_block_writeback_invalidate(unsigned int start, | ||
unsigned int end); | ||
extern void L1D_cache_block_writeback(unsigned int start, unsigned int end); | ||
extern void L2_cache_block_invalidate(unsigned int start, unsigned int end); | ||
extern void L2_cache_block_writeback(unsigned int start, unsigned int end); | ||
extern void L2_cache_block_writeback_invalidate(unsigned int start, | ||
unsigned int end); | ||
extern void L2_cache_block_invalidate_nowait(unsigned int start, | ||
unsigned int end); | ||
extern void L2_cache_block_writeback_nowait(unsigned int start, | ||
unsigned int end); | ||
|
||
extern void L2_cache_block_writeback_invalidate_nowait(unsigned int start, | ||
unsigned int end); | ||
|
||
#endif /* _ASM_C6X_CACHE_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
/* | ||
* Port on Texas Instruments TMS320C6x architecture | ||
* | ||
* Copyright (C) 2004, 2009, 2010 Texas Instruments Incorporated | ||
* Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com) | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
*/ | ||
#ifndef _ASM_C6X_CACHEFLUSH_H | ||
#define _ASM_C6X_CACHEFLUSH_H | ||
|
||
#include <linux/spinlock.h> | ||
|
||
#include <asm/setup.h> | ||
#include <asm/cache.h> | ||
#include <asm/mman.h> | ||
#include <asm/page.h> | ||
#include <asm/string.h> | ||
|
||
/* | ||
* virtually-indexed cache management (our cache is physically indexed) | ||
*/ | ||
#define flush_cache_all() do {} while (0) | ||
#define flush_cache_mm(mm) do {} while (0) | ||
#define flush_cache_dup_mm(mm) do {} while (0) | ||
#define flush_cache_range(mm, start, end) do {} while (0) | ||
#define flush_cache_page(vma, vmaddr, pfn) do {} while (0) | ||
#define flush_cache_vmap(start, end) do {} while (0) | ||
#define flush_cache_vunmap(start, end) do {} while (0) | ||
#define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 0 | ||
#define flush_dcache_page(page) do {} while (0) | ||
#define flush_dcache_mmap_lock(mapping) do {} while (0) | ||
#define flush_dcache_mmap_unlock(mapping) do {} while (0) | ||
|
||
/* | ||
* physically-indexed cache management | ||
*/ | ||
#define flush_icache_range(s, e) \ | ||
do { \ | ||
L1D_cache_block_writeback((s), (e)); \ | ||
L1P_cache_block_invalidate((s), (e)); \ | ||
} while (0) | ||
|
||
#define flush_icache_page(vma, page) \ | ||
do { \ | ||
if ((vma)->vm_flags & PROT_EXEC) \ | ||
L1D_cache_block_writeback_invalidate(page_address(page), \ | ||
(unsigned long) page_address(page) + PAGE_SIZE)); \ | ||
L1P_cache_block_invalidate(page_address(page), \ | ||
(unsigned long) page_address(page) + PAGE_SIZE)); \ | ||
} while (0) | ||
|
||
|
||
#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ | ||
do { \ | ||
memcpy(dst, src, len); \ | ||
flush_icache_range((unsigned) (dst), (unsigned) (dst) + (len)); \ | ||
} while (0) | ||
|
||
#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ | ||
memcpy(dst, src, len) | ||
|
||
#endif /* _ASM_C6X_CACHEFLUSH_H */ |
Oops, something went wrong.