Commit 24dfb2b5 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus

* 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus:
  MIPS: SMTC: Fix lockup in smtc_distribute_timer
  MIPS: TXx9: Update rbtx49xx_defconfig
  MIPS: Make local arrays with CL_SIZE static __initdata
  MIPS: Add DMA declare coherent memory support
  MIPS: Fix emulation of 64-bit FPU on FPU-less 64-bit CPUs.
parents cd4ca27d 5df9d11b
config MIPS config MIPS
bool bool
default y default y
select HAVE_GENERIC_DMA_COHERENT
select HAVE_IDE select HAVE_IDE
select HAVE_OPROFILE select HAVE_OPROFILE
select HAVE_ARCH_KGDB select HAVE_ARCH_KGDB
......
...@@ -100,7 +100,7 @@ static __init void prom_init_console(void) ...@@ -100,7 +100,7 @@ static __init void prom_init_console(void)
static __init void prom_init_cmdline(void) static __init void prom_init_cmdline(void)
{ {
char buf[CL_SIZE]; static char buf[CL_SIZE] __initdata;
/* Get the kernel command line from CFE */ /* Get the kernel command line from CFE */
if (cfe_getenv("LINUX_CMDLINE", buf, CL_SIZE) >= 0) { if (cfe_getenv("LINUX_CMDLINE", buf, CL_SIZE) >= 0) {
......
This diff is collapsed.
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#include <asm/scatterlist.h> #include <asm/scatterlist.h>
#include <asm/cache.h> #include <asm/cache.h>
#include <asm-generic/dma-coherent.h>
void *dma_alloc_noncoherent(struct device *dev, size_t size, void *dma_alloc_noncoherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, gfp_t flag); dma_addr_t *dma_handle, gfp_t flag);
...@@ -73,14 +74,4 @@ extern int dma_is_consistent(struct device *dev, dma_addr_t dma_addr); ...@@ -73,14 +74,4 @@ extern int dma_is_consistent(struct device *dev, dma_addr_t dma_addr);
extern void dma_cache_sync(struct device *dev, void *vaddr, size_t size, extern void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
enum dma_data_direction direction); enum dma_data_direction direction);
#if 0
#define ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY
extern int dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,
dma_addr_t device_addr, size_t size, int flags);
extern void dma_release_declared_memory(struct device *dev);
extern void * dma_mark_declared_memory_occupied(struct device *dev,
dma_addr_t device_addr, size_t size);
#endif
#endif /* _ASM_DMA_MAPPING_H */ #endif /* _ASM_DMA_MAPPING_H */
...@@ -173,11 +173,12 @@ void smtc_distribute_timer(int vpe) ...@@ -173,11 +173,12 @@ void smtc_distribute_timer(int vpe)
unsigned int mtflags; unsigned int mtflags;
int cpu; int cpu;
struct clock_event_device *cd; struct clock_event_device *cd;
unsigned long nextstamp = 0L; unsigned long nextstamp;
unsigned long reference; unsigned long reference;
repeat: repeat:
nextstamp = 0L;
for_each_online_cpu(cpu) { for_each_online_cpu(cpu) {
/* /*
* Find virtual CPUs within the current VPE who have * Find virtual CPUs within the current VPE who have
......
...@@ -163,33 +163,34 @@ static int isBranchInstr(mips_instruction * i) ...@@ -163,33 +163,34 @@ static int isBranchInstr(mips_instruction * i)
/* /*
* In the Linux kernel, we support selection of FPR format on the * In the Linux kernel, we support selection of FPR format on the
* basis of the Status.FR bit. This does imply that, if a full 32 * basis of the Status.FR bit. If an FPU is not present, the FR bit
* FPRs are desired, there needs to be a flip-flop that can be written * is hardwired to zero, which would imply a 32-bit FPU even for
* to one at that bit position. In any case, O32 MIPS ABI uses * 64-bit CPUs. For 64-bit kernels with no FPU we use TIF_32BIT_REGS
* only the even FPRs (Status.FR = 0). * as a proxy for the FR bit so that a 64-bit FPU is emulated. In any
* case, for a 32-bit kernel which uses the O32 MIPS ABI, only the
* even FPRs are used (Status.FR = 0).
*/ */
static inline int cop1_64bit(struct pt_regs *xcp)
#define CP0_STATUS_FR_SUPPORT {
if (cpu_has_fpu)
#ifdef CP0_STATUS_FR_SUPPORT return xcp->cp0_status & ST0_FR;
#define FR_BIT ST0_FR #ifdef CONFIG_64BIT
return !test_thread_flag(TIF_32BIT_REGS);
#else #else
#define FR_BIT 0 return 0;
#endif #endif
}
#define SIFROMREG(si, x) ((si) = cop1_64bit(xcp) || !(x & 1) ? \
(int)ctx->fpr[x] : (int)(ctx->fpr[x & ~1] >> 32))
#define SIFROMREG(si, x) ((si) = \ #define SITOREG(si, x) (ctx->fpr[x & ~(cop1_64bit(xcp) == 0)] = \
(xcp->cp0_status & FR_BIT) || !(x & 1) ? \ cop1_64bit(xcp) || !(x & 1) ? \
(int)ctx->fpr[x] : \
(int)(ctx->fpr[x & ~1] >> 32 ))
#define SITOREG(si, x) (ctx->fpr[x & ~((xcp->cp0_status & FR_BIT) == 0)] = \
(xcp->cp0_status & FR_BIT) || !(x & 1) ? \
ctx->fpr[x & ~1] >> 32 << 32 | (u32)(si) : \ ctx->fpr[x & ~1] >> 32 << 32 | (u32)(si) : \
ctx->fpr[x & ~1] << 32 >> 32 | (u64)(si) << 32) ctx->fpr[x & ~1] << 32 >> 32 | (u64)(si) << 32)
#define DIFROMREG(di, x) ((di) = \ #define DIFROMREG(di, x) ((di) = ctx->fpr[x & ~(cop1_64bit(xcp) == 0)])
ctx->fpr[x & ~((xcp->cp0_status & FR_BIT) == 0)]) #define DITOREG(di, x) (ctx->fpr[x & ~(cop1_64bit(xcp) == 0)] = (di))
#define DITOREG(di, x) (ctx->fpr[x & ~((xcp->cp0_status & FR_BIT) == 0)] \
= (di))
#define SPFROMREG(sp, x) SIFROMREG((sp).bits, x) #define SPFROMREG(sp, x) SIFROMREG((sp).bits, x)
#define SPTOREG(sp, x) SITOREG((sp).bits, x) #define SPTOREG(sp, x) SITOREG((sp).bits, x)
......
...@@ -90,6 +90,9 @@ void *dma_alloc_coherent(struct device *dev, size_t size, ...@@ -90,6 +90,9 @@ void *dma_alloc_coherent(struct device *dev, size_t size,
{ {
void *ret; void *ret;
if (dma_alloc_from_coherent(dev, size, dma_handle, &ret))
return ret;
gfp = massage_gfp_flags(dev, gfp); gfp = massage_gfp_flags(dev, gfp);
ret = (void *) __get_free_pages(gfp, get_order(size)); ret = (void *) __get_free_pages(gfp, get_order(size));
...@@ -122,6 +125,10 @@ void dma_free_coherent(struct device *dev, size_t size, void *vaddr, ...@@ -122,6 +125,10 @@ void dma_free_coherent(struct device *dev, size_t size, void *vaddr,
dma_addr_t dma_handle) dma_addr_t dma_handle)
{ {
unsigned long addr = (unsigned long) vaddr; unsigned long addr = (unsigned long) vaddr;
int order = get_order(size);
if (dma_release_from_coherent(dev, order, vaddr))
return;
plat_unmap_dma_mem(dev, dma_handle, size, DMA_BIDIRECTIONAL); plat_unmap_dma_mem(dev, dma_handle, size, DMA_BIDIRECTIONAL);
......
...@@ -54,7 +54,8 @@ static struct prom_pmemblock * __init prom_getmdesc(void) ...@@ -54,7 +54,8 @@ static struct prom_pmemblock * __init prom_getmdesc(void)
{ {
char *memsize_str; char *memsize_str;
unsigned int memsize; unsigned int memsize;
char cmdline[CL_SIZE], *ptr; char *ptr;
static char cmdline[CL_SIZE] __initdata;
/* otherwise look in the environment */ /* otherwise look in the environment */
memsize_str = prom_getenv("memsize"); memsize_str = prom_getenv("memsize");
......
...@@ -69,7 +69,7 @@ static inline unsigned long tag2ul(char *arg, const char *tag) ...@@ -69,7 +69,7 @@ static inline unsigned long tag2ul(char *arg, const char *tag)
void __init prom_setup_cmdline(void) void __init prom_setup_cmdline(void)
{ {
char cmd_line[CL_SIZE]; static char cmd_line[CL_SIZE] __initdata;
char *cp, *board; char *cp, *board;
int prom_argc; int prom_argc;
char **prom_argv, **prom_envp; char **prom_argv, **prom_envp;
......
...@@ -160,7 +160,7 @@ static void __init prom_init_cmdline(void) ...@@ -160,7 +160,7 @@ static void __init prom_init_cmdline(void)
int argc; int argc;
int *argv32; int *argv32;
int i; /* Always ignore the "-c" at argv[0] */ int i; /* Always ignore the "-c" at argv[0] */
char builtin[CL_SIZE]; static char builtin[CL_SIZE] __initdata;
if (fw_arg0 >= CKSEG0 || fw_arg1 < CKSEG0) { if (fw_arg0 >= CKSEG0 || fw_arg1 < CKSEG0) {
/* /*
...@@ -315,7 +315,7 @@ static inline void txx9_cache_fixup(void) ...@@ -315,7 +315,7 @@ static inline void txx9_cache_fixup(void)
static void __init preprocess_cmdline(void) static void __init preprocess_cmdline(void)
{ {
char cmdline[CL_SIZE]; static char cmdline[CL_SIZE] __initdata;
char *s; char *s;
strcpy(cmdline, arcs_cmdline); strcpy(cmdline, arcs_cmdline);
......
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