You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'xtensa-20151108' of git://github.com/czankel/xtensa-linux
Pull xtensa updates from Chris Zankel: - fix remaining issues with noMMU cores - fix build for cores w/o cache or zero overhead loop options - fix boot of secondary cores in SMP configuration - add support for DMA to high memory pages - add dma_to_phys and phys_to_dma functions. * tag 'xtensa-20151108' of git://github.com/czankel/xtensa-linux: xtensa: implement dma_to_phys and phys_to_dma xtensa: support DMA to high memory Revert "xtensa: cache inquiry and unaligned cache handling functions" xtensa: drop unused sections and remapped reset handlers xtensa: fix secondary core boot in SMP xtensa: add FORCE_MAX_ZONEORDER to Kconfig xtensa: nommu: provide defconfig for de212 on kc705 xtensa: nommu: xtfpga: add kc705 DTS xtensa: add de212 core variant xtensa: nommu: select HAVE_FUTEX_CMPXCHG xtensa: nommu: fix default memory start address xtensa: nommu: provide correct KIO addresses xtensa: nommu: fix USER_RING definition xtensa: xtfpga: fix integer overflow in TASK_SIZE xtensa: fix build for configs without cache options xtensa: fixes for configs without loop option
This commit is contained in:
+16
-1
@@ -17,6 +17,7 @@ config XTENSA
|
||||
select HAVE_DMA_API_DEBUG
|
||||
select HAVE_DMA_ATTRS
|
||||
select HAVE_FUNCTION_TRACER
|
||||
select HAVE_FUTEX_CMPXCHG if !MMU
|
||||
select HAVE_IRQ_TIME_ACCOUNTING
|
||||
select HAVE_OPROFILE
|
||||
select HAVE_PERF_EVENTS
|
||||
@@ -397,6 +398,20 @@ config SIMDISK1_FILENAME
|
||||
|
||||
source "mm/Kconfig"
|
||||
|
||||
config FORCE_MAX_ZONEORDER
|
||||
int "Maximum zone order"
|
||||
default "11"
|
||||
help
|
||||
The kernel memory allocator divides physically contiguous memory
|
||||
blocks into "zones", where each zone is a power of two number of
|
||||
pages. This option selects the largest power of two that the kernel
|
||||
keeps in the memory allocator. If you need to allocate very large
|
||||
blocks of physically contiguous memory, then you may need to
|
||||
increase this value.
|
||||
|
||||
This config option is actually maximum order plus one. For example,
|
||||
a value of 11 means that the largest free memory block is 2^10 pages.
|
||||
|
||||
source "drivers/pcmcia/Kconfig"
|
||||
|
||||
source "drivers/pci/hotplug/Kconfig"
|
||||
@@ -408,7 +423,7 @@ config DEFAULT_MEM_START
|
||||
hex "Physical address of the default memory area start"
|
||||
depends on PLATFORM_WANT_DEFAULT_MEM
|
||||
default 0x00000000 if MMU
|
||||
default 0x40000000 if !MMU
|
||||
default 0x60000000 if !MMU
|
||||
help
|
||||
This is a fallback start address of the default memory area, it is
|
||||
used when no physical memory size is passed through DTB or through
|
||||
|
||||
@@ -40,17 +40,4 @@ SECTIONS
|
||||
*(.bss)
|
||||
__bss_end = .;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
/*
|
||||
* This is a remapped copy of the Reset Vector Code.
|
||||
* It keeps gdb in sync with the PC after switching
|
||||
* to the temporary mapping used while setting up
|
||||
* the V2 MMU mappings for Linux.
|
||||
*/
|
||||
.ResetVector.remapped_text 0x46000000 (INFO):
|
||||
{
|
||||
*(.ResetVector.remapped_text)
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -58,8 +58,6 @@ _SetupMMU:
|
||||
wsr a0, ps
|
||||
rsync
|
||||
|
||||
Offset = _SetupMMU - _ResetVector
|
||||
|
||||
#ifndef CONFIG_INITIALIZE_XTENSA_MMU_INSIDE_VMLINUX
|
||||
initialize_mmu
|
||||
#endif
|
||||
@@ -74,29 +72,3 @@ reset:
|
||||
movi a3, 0
|
||||
movi a4, 0
|
||||
jx a0
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
.align 4
|
||||
|
||||
.section .ResetVector.remapped_text, "x"
|
||||
.global _RemappedResetVector
|
||||
|
||||
/* Do org before literals */
|
||||
.org 0
|
||||
|
||||
_RemappedResetVector:
|
||||
.begin no-absolute-literals
|
||||
.literal_position
|
||||
|
||||
_j _RemappedSetupMMU
|
||||
|
||||
/* Position Remapped code at the same location as the original code */
|
||||
. = _RemappedResetVector + Offset
|
||||
|
||||
_RemappedSetupMMU:
|
||||
#ifndef CONFIG_INITIALIZE_XTENSA_MMU_INSIDE_VMLINUX
|
||||
initialize_mmu
|
||||
#endif
|
||||
|
||||
.end no-absolute-literals
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
/dts-v1/;
|
||||
/include/ "xtfpga.dtsi"
|
||||
/include/ "xtfpga-flash-128m.dtsi"
|
||||
|
||||
/ {
|
||||
compatible = "cdns,xtensa-kc705";
|
||||
chosen {
|
||||
bootargs = "earlycon=uart8250,mmio32,0x9d050020,115200n8 console=ttyS0,115200n8 ip=dhcp root=/dev/nfs rw debug";
|
||||
};
|
||||
memory@0 {
|
||||
device_type = "memory";
|
||||
reg = <0x60000000 0x10000000>;
|
||||
};
|
||||
soc {
|
||||
ranges = <0x00000000 0x90000000 0x10000000>;
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,131 @@
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
CONFIG_FHANDLE=y
|
||||
CONFIG_IRQ_DOMAIN_DEBUG=y
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_IRQ_TIME_ACCOUNTING=y
|
||||
CONFIG_BSD_PROCESS_ACCT=y
|
||||
CONFIG_CGROUP_DEBUG=y
|
||||
CONFIG_CGROUP_FREEZER=y
|
||||
CONFIG_CGROUP_DEVICE=y
|
||||
CONFIG_CPUSETS=y
|
||||
CONFIG_CGROUP_CPUACCT=y
|
||||
CONFIG_MEMCG=y
|
||||
CONFIG_NAMESPACES=y
|
||||
CONFIG_SCHED_AUTOGROUP=y
|
||||
CONFIG_RELAY=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_RD_BZIP2 is not set
|
||||
# CONFIG_RD_LZMA is not set
|
||||
# CONFIG_RD_XZ is not set
|
||||
# CONFIG_RD_LZO is not set
|
||||
# CONFIG_RD_LZ4 is not set
|
||||
CONFIG_EXPERT=y
|
||||
CONFIG_SYSCTL_SYSCALL=y
|
||||
CONFIG_KALLSYMS_ALL=y
|
||||
CONFIG_PERF_EVENTS=y
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_IOSCHED_DEADLINE is not set
|
||||
# CONFIG_IOSCHED_CFQ is not set
|
||||
CONFIG_XTENSA_VARIANT_CUSTOM=y
|
||||
CONFIG_XTENSA_VARIANT_CUSTOM_NAME="de212"
|
||||
# CONFIG_XTENSA_VARIANT_MMU is not set
|
||||
CONFIG_XTENSA_UNALIGNED_USER=y
|
||||
CONFIG_PREEMPT=y
|
||||
# CONFIG_PCI is not set
|
||||
CONFIG_XTENSA_PLATFORM_XTFPGA=y
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
CONFIG_CMDLINE="earlycon=uart8250,mmio32,0x9d050020,115200n8 console=ttyS0,115200n8 ip=dhcp root=/dev/nfs rw debug"
|
||||
CONFIG_USE_OF=y
|
||||
CONFIG_BUILTIN_DTB="kc705_nommu"
|
||||
CONFIG_DEFAULT_MEM_SIZE=0x10000000
|
||||
CONFIG_BINFMT_FLAT=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
CONFIG_IP_PNP=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
CONFIG_IP_PNP_RARP=y
|
||||
# CONFIG_IPV6 is not set
|
||||
CONFIG_NETFILTER=y
|
||||
# CONFIG_WIRELESS is not set
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
# CONFIG_STANDALONE is not set
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_CFI=y
|
||||
CONFIG_MTD_JEDECPROBE=y
|
||||
CONFIG_MTD_CFI_INTELEXT=y
|
||||
CONFIG_MTD_CFI_AMDSTD=y
|
||||
CONFIG_MTD_CFI_STAA=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_NET_VENDOR_ARC is not set
|
||||
# CONFIG_NET_VENDOR_BROADCOM is not set
|
||||
# CONFIG_NET_VENDOR_INTEL is not set
|
||||
# CONFIG_NET_VENDOR_MARVELL is not set
|
||||
# CONFIG_NET_VENDOR_MICREL is not set
|
||||
# CONFIG_NET_VENDOR_NATSEMI is not set
|
||||
# CONFIG_NET_VENDOR_SEEQ is not set
|
||||
# CONFIG_NET_VENDOR_STMICRO is not set
|
||||
# CONFIG_NET_VENDOR_VIA is not set
|
||||
# CONFIG_NET_VENDOR_WIZNET is not set
|
||||
CONFIG_MARVELL_PHY=y
|
||||
# CONFIG_WLAN is not set
|
||||
# CONFIG_INPUT_MOUSEDEV is not set
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_SERIO is not set
|
||||
CONFIG_SERIAL_8250=y
|
||||
# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
CONFIG_HW_RANDOM=y
|
||||
# CONFIG_HWMON is not set
|
||||
CONFIG_WATCHDOG=y
|
||||
CONFIG_WATCHDOG_NOWAYOUT=y
|
||||
CONFIG_SOFT_WATCHDOG=y
|
||||
# CONFIG_VGA_CONSOLE is not set
|
||||
# CONFIG_USB_SUPPORT is not set
|
||||
CONFIG_EXT3_FS=y
|
||||
CONFIG_EXT4_FS=y
|
||||
CONFIG_FANOTIFY=y
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V4=y
|
||||
CONFIG_NFS_SWAP=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_SUNRPC_DEBUG=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_DYNAMIC_DEBUG=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_FRAME_POINTER is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_VM=y
|
||||
CONFIG_DEBUG_NOMMU_REGIONS=y
|
||||
CONFIG_DEBUG_SHIRQ=y
|
||||
CONFIG_LOCKUP_DETECTOR=y
|
||||
CONFIG_SCHEDSTATS=y
|
||||
CONFIG_TIMER_STATS=y
|
||||
CONFIG_DEBUG_RT_MUTEXES=y
|
||||
CONFIG_DEBUG_SPINLOCK=y
|
||||
CONFIG_DEBUG_MUTEXES=y
|
||||
CONFIG_DEBUG_ATOMIC_SLEEP=y
|
||||
CONFIG_STACKTRACE=y
|
||||
# CONFIG_RCU_CPU_STALL_INFO is not set
|
||||
CONFIG_RCU_TRACE=y
|
||||
# CONFIG_FTRACE is not set
|
||||
# CONFIG_LD_NO_RELAX is not set
|
||||
# CONFIG_CRYPTO_ECHAINIV is not set
|
||||
CONFIG_CRYPTO_ANSI_CPRNG=y
|
||||
@@ -35,9 +35,10 @@
|
||||
* __loop as
|
||||
* restart loop. 'as' register must not have been modified!
|
||||
*
|
||||
* __endla ar, at, incr
|
||||
* __endla ar, as, incr
|
||||
* ar start address (modified)
|
||||
* as scratch register used by macro
|
||||
* as scratch register used by __loops/__loopi macros or
|
||||
* end address used by __loopt macro
|
||||
* inc increment
|
||||
*/
|
||||
|
||||
@@ -97,7 +98,7 @@
|
||||
.endm
|
||||
|
||||
/*
|
||||
* loop from ar to ax
|
||||
* loop from ar to as
|
||||
*/
|
||||
|
||||
.macro __loopt ar, as, at, incr_log2
|
||||
|
||||
@@ -73,7 +73,9 @@
|
||||
|
||||
.macro ___unlock_dcache_all ar at
|
||||
|
||||
#if XCHAL_DCACHE_SIZE
|
||||
__loop_cache_all \ar \at diu XCHAL_DCACHE_SIZE XCHAL_DCACHE_LINEWIDTH
|
||||
#endif
|
||||
|
||||
.endm
|
||||
|
||||
@@ -90,30 +92,38 @@
|
||||
|
||||
.macro ___flush_invalidate_dcache_all ar at
|
||||
|
||||
#if XCHAL_DCACHE_SIZE
|
||||
__loop_cache_all \ar \at diwbi XCHAL_DCACHE_SIZE XCHAL_DCACHE_LINEWIDTH
|
||||
#endif
|
||||
|
||||
.endm
|
||||
|
||||
|
||||
.macro ___flush_dcache_all ar at
|
||||
|
||||
#if XCHAL_DCACHE_SIZE
|
||||
__loop_cache_all \ar \at diwb XCHAL_DCACHE_SIZE XCHAL_DCACHE_LINEWIDTH
|
||||
#endif
|
||||
|
||||
.endm
|
||||
|
||||
|
||||
.macro ___invalidate_dcache_all ar at
|
||||
|
||||
#if XCHAL_DCACHE_SIZE
|
||||
__loop_cache_all \ar \at dii __stringify(DCACHE_WAY_SIZE) \
|
||||
XCHAL_DCACHE_LINEWIDTH
|
||||
#endif
|
||||
|
||||
.endm
|
||||
|
||||
|
||||
.macro ___invalidate_icache_all ar at
|
||||
|
||||
#if XCHAL_ICACHE_SIZE
|
||||
__loop_cache_all \ar \at iii __stringify(ICACHE_WAY_SIZE) \
|
||||
XCHAL_ICACHE_LINEWIDTH
|
||||
#endif
|
||||
|
||||
.endm
|
||||
|
||||
@@ -121,28 +131,36 @@
|
||||
|
||||
.macro ___flush_invalidate_dcache_range ar as at
|
||||
|
||||
#if XCHAL_DCACHE_SIZE
|
||||
__loop_cache_range \ar \as \at dhwbi XCHAL_DCACHE_LINEWIDTH
|
||||
#endif
|
||||
|
||||
.endm
|
||||
|
||||
|
||||
.macro ___flush_dcache_range ar as at
|
||||
|
||||
#if XCHAL_DCACHE_SIZE
|
||||
__loop_cache_range \ar \as \at dhwb XCHAL_DCACHE_LINEWIDTH
|
||||
#endif
|
||||
|
||||
.endm
|
||||
|
||||
|
||||
.macro ___invalidate_dcache_range ar as at
|
||||
|
||||
#if XCHAL_DCACHE_SIZE
|
||||
__loop_cache_range \ar \as \at dhi XCHAL_DCACHE_LINEWIDTH
|
||||
#endif
|
||||
|
||||
.endm
|
||||
|
||||
|
||||
.macro ___invalidate_icache_range ar as at
|
||||
|
||||
#if XCHAL_ICACHE_SIZE
|
||||
__loop_cache_range \ar \as \at ihi XCHAL_ICACHE_LINEWIDTH
|
||||
#endif
|
||||
|
||||
.endm
|
||||
|
||||
@@ -150,27 +168,35 @@
|
||||
|
||||
.macro ___flush_invalidate_dcache_page ar as
|
||||
|
||||
#if XCHAL_DCACHE_SIZE
|
||||
__loop_cache_page \ar \as dhwbi XCHAL_DCACHE_LINEWIDTH
|
||||
#endif
|
||||
|
||||
.endm
|
||||
|
||||
|
||||
.macro ___flush_dcache_page ar as
|
||||
|
||||
#if XCHAL_DCACHE_SIZE
|
||||
__loop_cache_page \ar \as dhwb XCHAL_DCACHE_LINEWIDTH
|
||||
#endif
|
||||
|
||||
.endm
|
||||
|
||||
|
||||
.macro ___invalidate_dcache_page ar as
|
||||
|
||||
#if XCHAL_DCACHE_SIZE
|
||||
__loop_cache_page \ar \as dhi XCHAL_DCACHE_LINEWIDTH
|
||||
#endif
|
||||
|
||||
.endm
|
||||
|
||||
|
||||
.macro ___invalidate_icache_page ar as
|
||||
|
||||
#if XCHAL_ICACHE_SIZE
|
||||
__loop_cache_page \ar \as ihi XCHAL_ICACHE_LINEWIDTH
|
||||
#endif
|
||||
|
||||
.endm
|
||||
|
||||
@@ -55,9 +55,14 @@ extern void __flush_dcache_range(unsigned long, unsigned long);
|
||||
extern void __flush_invalidate_dcache_page(unsigned long);
|
||||
extern void __flush_invalidate_dcache_range(unsigned long, unsigned long);
|
||||
#else
|
||||
# define __flush_dcache_range(p,s) do { } while(0)
|
||||
# define __flush_dcache_page(p) do { } while(0)
|
||||
# define __flush_invalidate_dcache_page(p) __invalidate_dcache_page(p)
|
||||
static inline void __flush_dcache_page(unsigned long va)
|
||||
{
|
||||
}
|
||||
static inline void __flush_dcache_range(unsigned long va, unsigned long sz)
|
||||
{
|
||||
}
|
||||
# define __flush_invalidate_dcache_all() __invalidate_dcache_all()
|
||||
# define __flush_invalidate_dcache_page(p) __invalidate_dcache_page(p)
|
||||
# define __flush_invalidate_dcache_range(p,s) __invalidate_dcache_range(p,s)
|
||||
#endif
|
||||
|
||||
@@ -174,99 +179,4 @@ extern void copy_from_user_page(struct vm_area_struct*, struct page*,
|
||||
|
||||
#endif
|
||||
|
||||
#define XTENSA_CACHEBLK_LOG2 29
|
||||
#define XTENSA_CACHEBLK_SIZE (1 << XTENSA_CACHEBLK_LOG2)
|
||||
#define XTENSA_CACHEBLK_MASK (7 << XTENSA_CACHEBLK_LOG2)
|
||||
|
||||
#if XCHAL_HAVE_CACHEATTR
|
||||
static inline u32 xtensa_get_cacheattr(void)
|
||||
{
|
||||
u32 r;
|
||||
asm volatile(" rsr %0, cacheattr" : "=a"(r));
|
||||
return r;
|
||||
}
|
||||
|
||||
static inline u32 xtensa_get_dtlb1(u32 addr)
|
||||
{
|
||||
u32 r = addr & XTENSA_CACHEBLK_MASK;
|
||||
return r | ((xtensa_get_cacheattr() >> (r >> (XTENSA_CACHEBLK_LOG2-2)))
|
||||
& 0xF);
|
||||
}
|
||||
#else
|
||||
static inline u32 xtensa_get_dtlb1(u32 addr)
|
||||
{
|
||||
u32 r;
|
||||
asm volatile(" rdtlb1 %0, %1" : "=a"(r) : "a"(addr));
|
||||
asm volatile(" dsync");
|
||||
return r;
|
||||
}
|
||||
|
||||
static inline u32 xtensa_get_cacheattr(void)
|
||||
{
|
||||
u32 r = 0;
|
||||
u32 a = 0;
|
||||
do {
|
||||
a -= XTENSA_CACHEBLK_SIZE;
|
||||
r = (r << 4) | (xtensa_get_dtlb1(a) & 0xF);
|
||||
} while (a);
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline int xtensa_need_flush_dma_source(u32 addr)
|
||||
{
|
||||
return (xtensa_get_dtlb1(addr) & ((1 << XCHAL_CA_BITS) - 1)) >= 4;
|
||||
}
|
||||
|
||||
static inline int xtensa_need_invalidate_dma_destination(u32 addr)
|
||||
{
|
||||
return (xtensa_get_dtlb1(addr) & ((1 << XCHAL_CA_BITS) - 1)) != 2;
|
||||
}
|
||||
|
||||
static inline void flush_dcache_unaligned(u32 addr, u32 size)
|
||||
{
|
||||
u32 cnt;
|
||||
if (size) {
|
||||
cnt = (size + ((XCHAL_DCACHE_LINESIZE - 1) & addr)
|
||||
+ XCHAL_DCACHE_LINESIZE - 1) / XCHAL_DCACHE_LINESIZE;
|
||||
while (cnt--) {
|
||||
asm volatile(" dhwb %0, 0" : : "a"(addr));
|
||||
addr += XCHAL_DCACHE_LINESIZE;
|
||||
}
|
||||
asm volatile(" dsync");
|
||||
}
|
||||
}
|
||||
|
||||
static inline void invalidate_dcache_unaligned(u32 addr, u32 size)
|
||||
{
|
||||
int cnt;
|
||||
if (size) {
|
||||
asm volatile(" dhwbi %0, 0 ;" : : "a"(addr));
|
||||
cnt = (size + ((XCHAL_DCACHE_LINESIZE - 1) & addr)
|
||||
- XCHAL_DCACHE_LINESIZE - 1) / XCHAL_DCACHE_LINESIZE;
|
||||
while (cnt-- > 0) {
|
||||
asm volatile(" dhi %0, %1" : : "a"(addr),
|
||||
"n"(XCHAL_DCACHE_LINESIZE));
|
||||
addr += XCHAL_DCACHE_LINESIZE;
|
||||
}
|
||||
asm volatile(" dhwbi %0, %1" : : "a"(addr),
|
||||
"n"(XCHAL_DCACHE_LINESIZE));
|
||||
asm volatile(" dsync");
|
||||
}
|
||||
}
|
||||
|
||||
static inline void flush_invalidate_dcache_unaligned(u32 addr, u32 size)
|
||||
{
|
||||
u32 cnt;
|
||||
if (size) {
|
||||
cnt = (size + ((XCHAL_DCACHE_LINESIZE - 1) & addr)
|
||||
+ XCHAL_DCACHE_LINESIZE - 1) / XCHAL_DCACHE_LINESIZE;
|
||||
while (cnt--) {
|
||||
asm volatile(" dhwbi %0, 0" : : "a"(addr));
|
||||
addr += XCHAL_DCACHE_LINESIZE;
|
||||
}
|
||||
asm volatile(" dsync");
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* _XTENSA_CACHEFLUSH_H */
|
||||
|
||||
@@ -35,4 +35,14 @@ static inline struct dma_map_ops *get_dma_ops(struct device *dev)
|
||||
void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
|
||||
enum dma_data_direction direction);
|
||||
|
||||
static inline dma_addr_t phys_to_dma(struct device *dev, phys_addr_t paddr)
|
||||
{
|
||||
return (dma_addr_t)paddr;
|
||||
}
|
||||
|
||||
static inline phys_addr_t dma_to_phys(struct device *dev, dma_addr_t daddr)
|
||||
{
|
||||
return (phys_addr_t)daddr;
|
||||
}
|
||||
|
||||
#endif /* _XTENSA_DMA_MAPPING_H */
|
||||
|
||||
@@ -161,7 +161,8 @@
|
||||
#endif /* defined(CONFIG_MMU) && XCHAL_HAVE_PTP_MMU &&
|
||||
XCHAL_HAVE_SPANNING_WAY */
|
||||
|
||||
#if !defined(CONFIG_MMU) && XCHAL_HAVE_TLBS
|
||||
#if !defined(CONFIG_MMU) && XCHAL_HAVE_TLBS && \
|
||||
(XCHAL_DCACHE_SIZE || XCHAL_ICACHE_SIZE)
|
||||
/* Enable data and instruction cache in the DEFAULT_MEMORY region
|
||||
* if the processor has DTLB and ITLB.
|
||||
*/
|
||||
@@ -175,14 +176,18 @@
|
||||
1:
|
||||
sub a9, a9, a8
|
||||
2:
|
||||
#if XCHAL_DCACHE_SIZE
|
||||
rdtlb1 a3, a5
|
||||
ritlb1 a4, a5
|
||||
and a3, a3, a6
|
||||
and a4, a4, a6
|
||||
or a3, a3, a7
|
||||
or a4, a4, a7
|
||||
wdtlb a3, a5
|
||||
#endif
|
||||
#if XCHAL_ICACHE_SIZE
|
||||
ritlb1 a4, a5
|
||||
and a4, a4, a6
|
||||
or a4, a4, a7
|
||||
witlb a4, a5
|
||||
#endif
|
||||
add a5, a5, a8
|
||||
bltu a8, a9, 1b
|
||||
|
||||
|
||||
@@ -25,15 +25,6 @@
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
|
||||
#if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && defined(CONFIG_OF)
|
||||
extern unsigned long xtensa_kio_paddr;
|
||||
|
||||
static inline unsigned long xtensa_get_kio_paddr(void)
|
||||
{
|
||||
return xtensa_kio_paddr;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Return the virtual address for the specified bus memory.
|
||||
* Note that we currently don't support any address outside the KIO segment.
|
||||
|
||||
@@ -18,7 +18,11 @@
|
||||
* We only use two ring levels, user and kernel space.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
#define USER_RING 1 /* user ring level */
|
||||
#else
|
||||
#define USER_RING 0
|
||||
#endif
|
||||
#define KERNEL_RING 0 /* kernel ring level */
|
||||
|
||||
/*
|
||||
|
||||
@@ -21,13 +21,26 @@
|
||||
#include <variant/core.h>
|
||||
#include <platform/hardware.h>
|
||||
|
||||
#if XCHAL_HAVE_PTP_MMU
|
||||
#define XCHAL_KIO_CACHED_VADDR 0xe0000000
|
||||
#define XCHAL_KIO_BYPASS_VADDR 0xf0000000
|
||||
#define XCHAL_KIO_DEFAULT_PADDR 0xf0000000
|
||||
#else
|
||||
#define XCHAL_KIO_BYPASS_VADDR XCHAL_KIO_PADDR
|
||||
#define XCHAL_KIO_DEFAULT_PADDR 0x90000000
|
||||
#endif
|
||||
#define XCHAL_KIO_SIZE 0x10000000
|
||||
|
||||
#if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && defined(CONFIG_OF)
|
||||
#if (!XCHAL_HAVE_PTP_MMU || XCHAL_HAVE_SPANNING_WAY) && defined(CONFIG_OF)
|
||||
#define XCHAL_KIO_PADDR xtensa_get_kio_paddr()
|
||||
#ifndef __ASSEMBLY__
|
||||
extern unsigned long xtensa_kio_paddr;
|
||||
|
||||
static inline unsigned long xtensa_get_kio_paddr(void)
|
||||
{
|
||||
return xtensa_kio_paddr;
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
#define XCHAL_KIO_PADDR XCHAL_KIO_DEFAULT_PADDR
|
||||
#endif
|
||||
@@ -48,6 +61,9 @@
|
||||
#define LOAD_MEMORY_ADDRESS 0xD0003000
|
||||
#endif
|
||||
|
||||
#define RESET_VECTOR1_VADDR (VIRTUAL_MEMORY_ADDRESS + \
|
||||
XCHAL_RESET_VECTOR1_PADDR)
|
||||
|
||||
#else /* !defined(CONFIG_MMU) */
|
||||
/* MMU Not being used - Virtual == Physical */
|
||||
|
||||
@@ -60,6 +76,8 @@
|
||||
/* Loaded just above possibly live vectors */
|
||||
#define LOAD_MEMORY_ADDRESS (PLATFORM_DEFAULT_MEM_START + 0x3000)
|
||||
|
||||
#define RESET_VECTOR1_VADDR (XCHAL_RESET_VECTOR1_VADDR)
|
||||
|
||||
#endif /* CONFIG_MMU */
|
||||
|
||||
#define XC_VADDR(offset) (VIRTUAL_MEMORY_ADDRESS + offset)
|
||||
@@ -67,14 +85,6 @@
|
||||
/* Used to set VECBASE register */
|
||||
#define VECBASE_RESET_VADDR VIRTUAL_MEMORY_ADDRESS
|
||||
|
||||
#define RESET_VECTOR_VECOFS (XCHAL_RESET_VECTOR_VADDR - \
|
||||
VECBASE_RESET_VADDR)
|
||||
#define RESET_VECTOR_VADDR XC_VADDR(RESET_VECTOR_VECOFS)
|
||||
|
||||
#define RESET_VECTOR1_VECOFS (XCHAL_RESET_VECTOR1_VADDR - \
|
||||
VECBASE_RESET_VADDR)
|
||||
#define RESET_VECTOR1_VADDR XC_VADDR(RESET_VECTOR1_VECOFS)
|
||||
|
||||
#if defined(XCHAL_HAVE_VECBASE) && XCHAL_HAVE_VECBASE
|
||||
|
||||
#define USER_VECTOR_VADDR XC_VADDR(XCHAL_USER_VECOFS)
|
||||
|
||||
@@ -16,6 +16,7 @@ obj-$(CONFIG_SMP) += smp.o mxhead.o
|
||||
obj-$(CONFIG_XTENSA_VARIANT_HAVE_PERF_EVENTS) += perf_event.o
|
||||
|
||||
AFLAGS_head.o += -mtext-section-literals
|
||||
AFLAGS_mxhead.o += -mtext-section-literals
|
||||
|
||||
# In the Xtensa architecture, assembly generates literals which must always
|
||||
# precede the L32R instruction with a relative offset less than 256 kB.
|
||||
|
||||
@@ -367,8 +367,10 @@ common_exception:
|
||||
s32i a2, a1, PT_SYSCALL
|
||||
movi a2, 0
|
||||
s32i a3, a1, PT_EXCVADDR
|
||||
#if XCHAL_HAVE_LOOPS
|
||||
xsr a2, lcount
|
||||
s32i a2, a1, PT_LCOUNT
|
||||
#endif
|
||||
|
||||
/* It is now save to restore the EXC_TABLE_FIXUP variable. */
|
||||
|
||||
@@ -429,11 +431,12 @@ common_exception:
|
||||
rsync # PS.WOE => rsync => overflow
|
||||
|
||||
/* Save lbeg, lend */
|
||||
|
||||
#if XCHAL_HAVE_LOOPS
|
||||
rsr a4, lbeg
|
||||
rsr a3, lend
|
||||
s32i a4, a1, PT_LBEG
|
||||
s32i a3, a1, PT_LEND
|
||||
#endif
|
||||
|
||||
/* Save SCOMPARE1 */
|
||||
|
||||
@@ -724,13 +727,14 @@ common_exception_exit:
|
||||
wsr a3, sar
|
||||
|
||||
/* Restore LBEG, LEND, LCOUNT */
|
||||
|
||||
#if XCHAL_HAVE_LOOPS
|
||||
l32i a2, a1, PT_LBEG
|
||||
l32i a3, a1, PT_LEND
|
||||
wsr a2, lbeg
|
||||
l32i a2, a1, PT_LCOUNT
|
||||
wsr a3, lend
|
||||
wsr a2, lcount
|
||||
#endif
|
||||
|
||||
/* We control single stepping through the ICOUNTLEVEL register. */
|
||||
|
||||
|
||||
@@ -249,7 +249,7 @@ ENTRY(_startup)
|
||||
|
||||
__loopt a2, a3, a4, 2
|
||||
s32i a0, a2, 0
|
||||
__endla a2, a4, 4
|
||||
__endla a2, a3, 4
|
||||
|
||||
#if XCHAL_DCACHE_IS_WRITEBACK
|
||||
|
||||
|
||||
@@ -48,8 +48,6 @@ _SetupOCD:
|
||||
rsync
|
||||
|
||||
_SetupMMU:
|
||||
Offset = _SetupMMU - _SecondaryResetVector
|
||||
|
||||
#ifdef CONFIG_INITIALIZE_XTENSA_MMU_INSIDE_VMLINUX
|
||||
initialize_mmu
|
||||
#endif
|
||||
@@ -62,24 +60,3 @@ _SetupMMU:
|
||||
jx a3
|
||||
|
||||
.end no-absolute-literals
|
||||
|
||||
|
||||
.section .SecondaryResetVector.remapped_text, "ax"
|
||||
.global _RemappedSecondaryResetVector
|
||||
|
||||
.org 0 # Need to do org before literals
|
||||
|
||||
_RemappedSecondaryResetVector:
|
||||
.begin no-absolute-literals
|
||||
.literal_position
|
||||
|
||||
_j _RemappedSetupMMU
|
||||
. = _RemappedSecondaryResetVector + Offset
|
||||
|
||||
_RemappedSetupMMU:
|
||||
|
||||
#ifdef CONFIG_INITIALIZE_XTENSA_MMU_INSIDE_VMLINUX
|
||||
initialize_mmu
|
||||
#endif
|
||||
|
||||
.end no-absolute-literals
|
||||
|
||||
@@ -15,14 +15,15 @@
|
||||
* Joe Taylor <joe@tensilica.com, joetylr@yahoo.com>
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/highmem.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/module.h>
|
||||
#include <asm/io.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/types.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
|
||||
enum dma_data_direction dir)
|
||||
@@ -47,17 +48,36 @@ void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
|
||||
}
|
||||
EXPORT_SYMBOL(dma_cache_sync);
|
||||
|
||||
static void do_cache_op(dma_addr_t dma_handle, size_t size,
|
||||
void (*fn)(unsigned long, unsigned long))
|
||||
{
|
||||
unsigned long off = dma_handle & (PAGE_SIZE - 1);
|
||||
unsigned long pfn = PFN_DOWN(dma_handle);
|
||||
struct page *page = pfn_to_page(pfn);
|
||||
|
||||
if (!PageHighMem(page))
|
||||
fn((unsigned long)bus_to_virt(dma_handle), size);
|
||||
else
|
||||
while (size > 0) {
|
||||
size_t sz = min_t(size_t, size, PAGE_SIZE - off);
|
||||
void *vaddr = kmap_atomic(page);
|
||||
|
||||
fn((unsigned long)vaddr + off, sz);
|
||||
kunmap_atomic(vaddr);
|
||||
off = 0;
|
||||
++page;
|
||||
size -= sz;
|
||||
}
|
||||
}
|
||||
|
||||
static void xtensa_sync_single_for_cpu(struct device *dev,
|
||||
dma_addr_t dma_handle, size_t size,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
void *vaddr;
|
||||
|
||||
switch (dir) {
|
||||
case DMA_BIDIRECTIONAL:
|
||||
case DMA_FROM_DEVICE:
|
||||
vaddr = bus_to_virt(dma_handle);
|
||||
__invalidate_dcache_range((unsigned long)vaddr, size);
|
||||
do_cache_op(dma_handle, size, __invalidate_dcache_range);
|
||||
break;
|
||||
|
||||
case DMA_NONE:
|
||||
@@ -73,13 +93,11 @@ static void xtensa_sync_single_for_device(struct device *dev,
|
||||
dma_addr_t dma_handle, size_t size,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
void *vaddr;
|
||||
|
||||
switch (dir) {
|
||||
case DMA_BIDIRECTIONAL:
|
||||
case DMA_TO_DEVICE:
|
||||
vaddr = bus_to_virt(dma_handle);
|
||||
__flush_dcache_range((unsigned long)vaddr, size);
|
||||
if (XCHAL_DCACHE_IS_WRITEBACK)
|
||||
do_cache_op(dma_handle, size, __flush_dcache_range);
|
||||
break;
|
||||
|
||||
case DMA_NONE:
|
||||
@@ -171,7 +189,6 @@ static dma_addr_t xtensa_map_page(struct device *dev, struct page *page,
|
||||
{
|
||||
dma_addr_t dma_handle = page_to_phys(page) + offset;
|
||||
|
||||
BUG_ON(PageHighMem(page));
|
||||
xtensa_sync_single_for_device(dev, dma_handle, size, dir);
|
||||
return dma_handle;
|
||||
}
|
||||
|
||||
@@ -190,7 +190,7 @@ static int __init parse_bootparam(const bp_tag_t* tag)
|
||||
#ifdef CONFIG_OF
|
||||
bool __initdata dt_memory_scan = false;
|
||||
|
||||
#if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY
|
||||
#if !XCHAL_HAVE_PTP_MMU || XCHAL_HAVE_SPANNING_WAY
|
||||
unsigned long xtensa_kio_paddr = XCHAL_KIO_DEFAULT_PADDR;
|
||||
EXPORT_SYMBOL(xtensa_kio_paddr);
|
||||
|
||||
@@ -334,7 +334,10 @@ extern char _Level5InterruptVector_text_end;
|
||||
extern char _Level6InterruptVector_text_start;
|
||||
extern char _Level6InterruptVector_text_end;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
extern char _SecondaryResetVector_text_start;
|
||||
extern char _SecondaryResetVector_text_end;
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef CONFIG_S32C1I_SELFTEST
|
||||
@@ -506,6 +509,10 @@ void __init setup_arch(char **cmdline_p)
|
||||
__pa(&_Level6InterruptVector_text_end), 0);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
mem_reserve(__pa(&_SecondaryResetVector_text_start),
|
||||
__pa(&_SecondaryResetVector_text_end), 0);
|
||||
#endif
|
||||
parse_early_param();
|
||||
bootmem_init();
|
||||
|
||||
|
||||
@@ -478,6 +478,9 @@ _DoubleExceptionVector_handle_exception:
|
||||
|
||||
ENDPROC(_DoubleExceptionVector)
|
||||
|
||||
.end literal_prefix
|
||||
|
||||
.text
|
||||
/*
|
||||
* Fixup handler for TLB miss in double exception handler for window owerflow.
|
||||
* We get here with windowbase set to the window that was being spilled and
|
||||
@@ -587,7 +590,6 @@ ENTRY(window_overflow_restore_a0_fixup)
|
||||
|
||||
ENDPROC(window_overflow_restore_a0_fixup)
|
||||
|
||||
.end literal_prefix
|
||||
/*
|
||||
* Debug interrupt vector
|
||||
*
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user