mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-12-27 03:28:58 +02:00
12a0868f92
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@24087 3c298f89-4303-0410-b956-a3cf2f4a3e73
4001 lines
105 KiB
Diff
4001 lines
105 KiB
Diff
--- a/arch/m68k/include/asm/atomic_mm.h
|
|
+++ b/arch/m68k/include/asm/atomic_mm.h
|
|
@@ -20,12 +20,20 @@
|
|
|
|
static inline void atomic_add(int i, atomic_t *v)
|
|
{
|
|
+#ifndef CONFIG_COLDFIRE
|
|
__asm__ __volatile__("addl %1,%0" : "+m" (*v) : "id" (i));
|
|
+#else
|
|
+ __asm__ __volatile__("addl %1,%0" : "=m" (*v) : "d" (i), "m" (*v));
|
|
+#endif
|
|
}
|
|
|
|
static inline void atomic_sub(int i, atomic_t *v)
|
|
{
|
|
+#ifndef CONFIG_COLDFIRE
|
|
__asm__ __volatile__("subl %1,%0" : "+m" (*v) : "id" (i));
|
|
+#else
|
|
+ __asm__ __volatile__("subl %1,%0" : "=m" (*v) : "d" (i), "m" (*v));
|
|
+#endif
|
|
}
|
|
|
|
static inline void atomic_inc(atomic_t *v)
|
|
@@ -45,6 +53,14 @@ static inline int atomic_dec_and_test(at
|
|
return c != 0;
|
|
}
|
|
|
|
+static __inline__ int atomic_dec_and_test_lt(volatile atomic_t *v)
|
|
+{
|
|
+ char c;
|
|
+ __asm__ __volatile__("subql #1,%1; slt %0" : "=d" (c), "=m" (*v)
|
|
+ : "m" (*v));
|
|
+ return c != 0 ;
|
|
+}
|
|
+
|
|
static inline int atomic_inc_and_test(atomic_t *v)
|
|
{
|
|
char c;
|
|
@@ -155,7 +171,12 @@ static inline int atomic_sub_and_test(in
|
|
static inline int atomic_add_negative(int i, atomic_t *v)
|
|
{
|
|
char c;
|
|
+#ifndef CONFIG_COLDFIRE
|
|
__asm__ __volatile__("addl %2,%1; smi %0" : "=d" (c), "+m" (*v): "g" (i));
|
|
+#else
|
|
+ __asm__ __volatile__("addl %2,%1; smi %0" : "=d" (c), "=m" (*v)
|
|
+ : "d" (i) , "m" (*v));
|
|
+#endif
|
|
return c != 0;
|
|
}
|
|
|
|
--- a/arch/m68k/include/asm/bitops_mm.h
|
|
+++ b/arch/m68k/include/asm/bitops_mm.h
|
|
@@ -8,6 +8,10 @@
|
|
* for more details.
|
|
*/
|
|
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+#include <asm/cf_bitops.h>
|
|
+#else
|
|
+
|
|
#ifndef _LINUX_BITOPS_H
|
|
#error only <linux/bitops.h> can be included directly
|
|
#endif
|
|
@@ -461,4 +465,6 @@ static inline int ext2_find_next_bit(con
|
|
|
|
#endif /* __KERNEL__ */
|
|
|
|
+#endif /* CONFIG_COLDFIRE */
|
|
+
|
|
#endif /* _M68K_BITOPS_H */
|
|
--- a/arch/m68k/include/asm/bootinfo.h
|
|
+++ b/arch/m68k/include/asm/bootinfo.h
|
|
@@ -25,6 +25,51 @@
|
|
#define _M68K_BOOTINFO_H
|
|
|
|
|
|
+#ifndef __ASSEMBLY__
|
|
+/*
|
|
+ * UBoot Support
|
|
+ *
|
|
+ * bd_info structure from uboot1.3.2/arch/m68k/include/asm/u-boot.h
|
|
+ */
|
|
+
|
|
+struct bd_info {
|
|
+ unsigned long bi_memstart; /* start of DRAM memory */
|
|
+ unsigned long bi_memsize; /* size of DRAM memory in bytes */
|
|
+ unsigned long bi_flashstart; /* start of FLASH memory */
|
|
+ unsigned long bi_flashsize; /* size of FLASH memory */
|
|
+ unsigned long bi_flashoffset; /* reserved area for startup monitor */
|
|
+ unsigned long bi_sramstart; /* start of SRAM memory */
|
|
+ unsigned long bi_sramsize; /* size of SRAM memory */
|
|
+ unsigned long bi_mbar_base; /* base of internal registers */
|
|
+ unsigned long bi_bootflags; /* boot / reboot flag (for LynxOS) */
|
|
+ unsigned long bi_boot_params; /* where this board expects params */
|
|
+ unsigned long bi_ip_addr; /* IP Address */
|
|
+ unsigned char bi_enet0addr[6]; /* Ethernet 0 mac address */
|
|
+ unsigned short bi_ethspeed; /* Ethernet speed in Mbps */
|
|
+ unsigned long bi_intfreq; /* Internal Freq, in MHz */
|
|
+ unsigned long bi_busfreq; /* Bus Freq, in MHz */
|
|
+#ifdef UBOOT_EXTRA_CLOCK
|
|
+ unsigned long bi_inpfreq; /* input Freq in MHz */
|
|
+ unsigned long bi_vcofreq; /* vco Freq in MHz */
|
|
+ unsigned long bi_flbfreq; /* Flexbus Freq in MHz */
|
|
+#endif
|
|
+ unsigned long bi_baudrate; /* Console Baudrate */
|
|
+ unsigned char bi_enet1addr[6]; /* eth1 mac address */
|
|
+ unsigned char bi_enet2addr[6]; /* eth2 mac address */
|
|
+ unsigned char bi_enet3addr[6]; /* eth3 mac address */
|
|
+};
|
|
+
|
|
+struct uboot_record {
|
|
+ struct bd_info *bdi;
|
|
+ unsigned long initrd_start;
|
|
+ unsigned long initrd_end;
|
|
+ unsigned long cmd_line_start;
|
|
+ unsigned long cmd_line_stop;
|
|
+};
|
|
+
|
|
+#endif /* __ASSEMBLY__ */
|
|
+
|
|
+
|
|
/*
|
|
* Bootinfo definitions
|
|
*
|
|
--- a/arch/m68k/include/asm/cacheflush_mm.h
|
|
+++ b/arch/m68k/include/asm/cacheflush_mm.h
|
|
@@ -6,6 +6,9 @@
|
|
/* cache code */
|
|
#define FLUSH_I_AND_D (0x00000808)
|
|
#define FLUSH_I (0x00000008)
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+#include <asm/cf_cacheflush.h>
|
|
+#else /* !CONFIG_COLDFIRE */
|
|
|
|
/*
|
|
* Cache handling functions
|
|
@@ -153,4 +156,5 @@ static inline void copy_from_user_page(s
|
|
memcpy(dst, src, len);
|
|
}
|
|
|
|
+#endif /* !CONFIG_COLDFIRE */
|
|
#endif /* _M68K_CACHEFLUSH_H */
|
|
--- a/arch/m68k/include/asm/checksum_mm.h
|
|
+++ b/arch/m68k/include/asm/checksum_mm.h
|
|
@@ -34,6 +34,7 @@ extern __wsum csum_partial_copy_nocheck(
|
|
void *dst, int len,
|
|
__wsum sum);
|
|
|
|
+#ifndef CONFIG_COLDFIRE /* CF has own copy in arch/m68k/lib/checksum.c */
|
|
/*
|
|
* This is a version of ip_compute_csum() optimized for IP headers,
|
|
* which always checksum on 4 octet boundaries.
|
|
@@ -59,6 +60,9 @@ static inline __sum16 ip_fast_csum(const
|
|
: "memory");
|
|
return (__force __sum16)~sum;
|
|
}
|
|
+#else
|
|
+extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl);
|
|
+#endif
|
|
|
|
/*
|
|
* Fold a partial checksum
|
|
@@ -67,6 +71,11 @@ static inline __sum16 ip_fast_csum(const
|
|
static inline __sum16 csum_fold(__wsum sum)
|
|
{
|
|
unsigned int tmp = (__force u32)sum;
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+ tmp = (tmp & 0xffff) + (tmp >> 16);
|
|
+ tmp = (tmp & 0xffff) + (tmp >> 16);
|
|
+ return (__force __sum16) ~tmp;
|
|
+#else
|
|
__asm__("swap %1\n\t"
|
|
"addw %1, %0\n\t"
|
|
"clrw %1\n\t"
|
|
@@ -74,6 +83,7 @@ static inline __sum16 csum_fold(__wsum s
|
|
: "=&d" (sum), "=&d" (tmp)
|
|
: "0" (sum), "1" (tmp));
|
|
return (__force __sum16)~sum;
|
|
+#endif
|
|
}
|
|
|
|
|
|
--- a/arch/m68k/include/asm/coldfire.h
|
|
+++ b/arch/m68k/include/asm/coldfire.h
|
|
@@ -5,6 +5,9 @@
|
|
*
|
|
* (C) Copyright 1999-2006, Greg Ungerer (gerg@snapgear.com)
|
|
* (C) Copyright 2000, Lineo (www.lineo.com)
|
|
+ *
|
|
+ * Shrek Wu b16972@freescale.com
|
|
+ * Copyright Freescale Semiconductor, Inc. 2009
|
|
*/
|
|
|
|
/****************************************************************************/
|
|
@@ -19,25 +22,78 @@
|
|
* here. Also the peripheral clock (bus clock) divide ratio is set
|
|
* at config time too.
|
|
*/
|
|
+/*FIXME Jason*/
|
|
+#if 0
|
|
#ifdef CONFIG_CLOCK_SET
|
|
#define MCF_CLK CONFIG_CLOCK_FREQ
|
|
#define MCF_BUSCLK (CONFIG_CLOCK_FREQ / CONFIG_CLOCK_DIV)
|
|
#else
|
|
#error "Don't know what your ColdFire CPU clock frequency is??"
|
|
#endif
|
|
+#endif
|
|
+
|
|
+
|
|
+#define MCF_CLK CONFIG_MCFCLK
|
|
+#define MCF_BUSCLK (CONFIG_MCFCLK/2)
|
|
+
|
|
+
|
|
+#if defined(CONFIG_M520x)
|
|
+#define MCF_IPSBAR 0xFC000000
|
|
+#else
|
|
+#define MCF_IPSBAR 0x40000000
|
|
+#endif
|
|
|
|
+#if defined(CONFIG_M5445X)
|
|
+#define MCF_MBAR 0x0
|
|
+/*
|
|
+ * Even though RAMBAR1 macro should be in the 0x8xxxxxxx range,
|
|
+ * here set the CONFIG_SDRAM_BASE value to it to use
|
|
+ * SDRAM memory, not SRAM memory.
|
|
+ */
|
|
+#define MCF_RAMBAR1 (CONFIG_SDRAM_BASE)
|
|
+#elif defined(CONFIG_M547X_8X)
|
|
+#define MCF_MBAR 0xF0000000
|
|
+#define MCF_MMUBAR 0xF1000000
|
|
+#define MCF_RAMBAR0 0xF3000000
|
|
+#define MCF_RAMBAR1 0xF3001000
|
|
+#else
|
|
/*
|
|
* Define the processor support peripherals base address.
|
|
* This is generally setup by the boards start up code.
|
|
*/
|
|
#define MCF_MBAR 0x10000000
|
|
#define MCF_MBAR2 0x80000000
|
|
-#if defined(CONFIG_M520x)
|
|
-#define MCF_IPSBAR 0xFC000000
|
|
-#else
|
|
-#define MCF_IPSBAR 0x40000000
|
|
#endif
|
|
|
|
+#ifdef __ASSEMBLY__
|
|
+#define REG32
|
|
+#define REG16
|
|
+#define REG08
|
|
+#else /* __ASSEMBLY__ */
|
|
+#define REG32(x) ((volatile unsigned long *)(x))
|
|
+#define REG16(x) ((volatile unsigned short *)(x))
|
|
+#define REG08(x) ((volatile unsigned char *)(x))
|
|
+
|
|
+#define MCF_REG32(x) *(volatile unsigned long *)(MCF_MBAR+(x))
|
|
+#define MCF_REG16(x) *(volatile unsigned short *)(MCF_MBAR+(x))
|
|
+#define MCF_REG08(x) *(volatile unsigned char *)(MCF_MBAR+(x))
|
|
+
|
|
+void cacr_set(unsigned long);
|
|
+unsigned long cacr_get(void);
|
|
+
|
|
+#define coldfire_enable_irq0(irq) MCF_INTC0_CIMR = (irq);
|
|
+
|
|
+#define coldfire_enable_irq1(irq) MCF_INTC1_CIMR = (irq);
|
|
+
|
|
+#define coldfire_disable_irq0(irq) MCF_INTC0_SIMR = (irq);
|
|
+
|
|
+#define coldfire_disable_irq1(irq) MCF_INTC1_SIMR = (irq);
|
|
+
|
|
+#define getiprh() MCF_INTC0_IPRH
|
|
+
|
|
+#endif /* __ASSEMBLY__ */
|
|
+
|
|
+
|
|
#if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \
|
|
defined(CONFIG_M520x)
|
|
#undef MCF_MBAR
|
|
--- a/arch/m68k/include/asm/delay_mm.h
|
|
+++ b/arch/m68k/include/asm/delay_mm.h
|
|
@@ -11,8 +11,25 @@
|
|
|
|
static inline void __delay(unsigned long loops)
|
|
{
|
|
+#if defined(CONFIG_COLDFIRE)
|
|
+ /* The coldfire runs this loop at significantly different speeds
|
|
+ * depending upon long word alignment or not. We'll pad it to
|
|
+ * long word alignment which is the faster version.
|
|
+ * The 0x4a8e is of course a 'tstl %fp' instruction. This is better
|
|
+ * than using a NOP (0x4e71) instruction because it executes in one
|
|
+ * cycle not three and doesn't allow for an arbitary delay waiting
|
|
+ * for bus cycles to finish. Also fp/a6 isn't likely to cause a
|
|
+ * stall waiting for the register to become valid if such is added
|
|
+ * to the coldfire at some stage.
|
|
+ */
|
|
+ __asm__ __volatile__ (".balignw 4, 0x4a8e\n\t"
|
|
+ "1: subql #1, %0\n\t"
|
|
+ "jcc 1b"
|
|
+ : "=d" (loops) : "0" (loops));
|
|
+#else
|
|
__asm__ __volatile__ ("1: subql #1,%0; jcc 1b"
|
|
: "=d" (loops) : "0" (loops));
|
|
+#endif
|
|
}
|
|
|
|
extern void __bad_udelay(void);
|
|
@@ -26,12 +43,17 @@ extern void __bad_udelay(void);
|
|
*/
|
|
static inline void __const_udelay(unsigned long xloops)
|
|
{
|
|
+#if defined(CONFIG_COLDFIRE)
|
|
+
|
|
+ __delay(((((unsigned long long) xloops * loops_per_jiffy))>>32)*HZ);
|
|
+#else
|
|
unsigned long tmp;
|
|
|
|
__asm__ ("mulul %2,%0:%1"
|
|
: "=d" (xloops), "=d" (tmp)
|
|
: "d" (xloops), "1" (loops_per_jiffy));
|
|
__delay(xloops * HZ);
|
|
+#endif
|
|
}
|
|
|
|
static inline void __udelay(unsigned long usecs)
|
|
@@ -46,12 +68,16 @@ static inline void __udelay(unsigned lon
|
|
static inline unsigned long muldiv(unsigned long a, unsigned long b,
|
|
unsigned long c)
|
|
{
|
|
+#if defined(CONFIG_COLDFIRE)
|
|
+ return (long)(((unsigned long long)a * b)/c);
|
|
+#else
|
|
unsigned long tmp;
|
|
|
|
__asm__ ("mulul %2,%0:%1; divul %3,%0:%1"
|
|
: "=d" (tmp), "=d" (a)
|
|
: "d" (b), "d" (c), "1" (a));
|
|
return a;
|
|
+#endif
|
|
}
|
|
|
|
#endif /* defined(_M68K_DELAY_H) */
|
|
--- a/arch/m68k/include/asm/div64.h
|
|
+++ b/arch/m68k/include/asm/div64.h
|
|
@@ -1,7 +1,7 @@
|
|
#ifndef _M68K_DIV64_H
|
|
#define _M68K_DIV64_H
|
|
|
|
-#ifdef CONFIG_MMU
|
|
+#if defined(CONFIG_MMU) && !defined(CONFIG_COLDFIRE)
|
|
|
|
#include <linux/types.h>
|
|
|
|
--- a/arch/m68k/include/asm/dma_mm.h
|
|
+++ b/arch/m68k/include/asm/dma_mm.h
|
|
@@ -4,13 +4,126 @@
|
|
|
|
/* it's useless on the m68k, but unfortunately needed by the new
|
|
bootmem allocator (but this should do it for this) */
|
|
+/*#ifdef CONFIG_COLDFIRE*/
|
|
+#if defined(CONFIG_M5445X) || defined(CONFIG_M547X_8X)
|
|
+#define MAX_DMA_ADDRESS 0xefffffff
|
|
+#else
|
|
#define MAX_DMA_ADDRESS PAGE_OFFSET
|
|
+#endif
|
|
|
|
+#ifndef CONFIG_COLDFIRE
|
|
#define MAX_DMA_CHANNELS 8
|
|
|
|
extern int request_dma(unsigned int dmanr, const char * device_id); /* reserve a DMA channel */
|
|
extern void free_dma(unsigned int dmanr); /* release it again */
|
|
|
|
+#else /* not (defined(CONFIG_MCF5474) || defined(CONFIG_MCF5484)
|
|
+ || defined(CONFIG_MCF5475) || defined(CONFIG_MCF5485)) */
|
|
+/************************************************
|
|
+ * Multichannel DMA definitions *
|
|
+ ************************************************/
|
|
+#ifdef CONFIG_MCD_DMA
|
|
+#include <asm/MCD_dma.h>
|
|
+#include <asm/m5485dma.h>
|
|
+
|
|
+struct scatterlist;
|
|
+
|
|
+#define MAX_DMA_CHANNELS NCHANNELS
|
|
+/*
|
|
+ * identifiers for each initiator/requestor
|
|
+ */
|
|
+#define DMA_ALWAYS (0)
|
|
+#define DMA_DSPI_RX (1)
|
|
+#define DMA_DSPI_TX (2)
|
|
+#define DMA_DREQ0 (3)
|
|
+#define DMA_PSC0_RX (4)
|
|
+#define DMA_PSC0_TX (5)
|
|
+#define DMA_USBEP0 (6)
|
|
+#define DMA_USBEP1 (7)
|
|
+#define DMA_USBEP2 (8)
|
|
+#define DMA_USBEP3 (9)
|
|
+#define DMA_PCI_TX (10)
|
|
+#define DMA_PCI_RX (11)
|
|
+#define DMA_PSC1_RX (12)
|
|
+#define DMA_PSC1_TX (13)
|
|
+#define DMA_I2C_RX (14)
|
|
+#define DMA_I2C_TX (15)
|
|
+#define DMA_FEC0_RX (16)
|
|
+#define DMA_FEC0_TX (17)
|
|
+#define DMA_FEC1_RX (18)
|
|
+#define DMA_FEC1_TX (19)
|
|
+#define DMA_DREQ1 (20)
|
|
+#define DMA_CTM0 (21)
|
|
+#define DMA_CTM1 (22)
|
|
+#define DMA_CTM2 (23)
|
|
+#define DMA_CTM3 (24)
|
|
+#define DMA_CTM4 (25)
|
|
+#define DMA_CTM5 (26)
|
|
+#define DMA_CTM6 (27)
|
|
+#define DMA_CTM7 (28)
|
|
+#define DMA_USBEP4 (29)
|
|
+#define DMA_USBEP5 (30)
|
|
+#define DMA_USBEP6 (31)
|
|
+#define DMA_PSC2_RX (32)
|
|
+#define DMA_PSC2_TX (33)
|
|
+#define DMA_PSC3_RX (34)
|
|
+#define DMA_PSC3_TX (35)
|
|
+#define DMA_FEC_RX(x) ((x == 0) ? DMA_FEC0_RX : DMA_FEC1_RX)
|
|
+#define DMA_FEC_TX(x) ((x == 0) ? DMA_FEC0_TX : DMA_FEC1_TX)
|
|
+
|
|
+int dma_set_initiator(int);
|
|
+unsigned int dma_get_initiator(int);
|
|
+void dma_remove_initiator(int);
|
|
+int dma_set_channel(int);
|
|
+int dma_get_channel(int);
|
|
+void dma_remove_channel(int);
|
|
+int dma_set_channel_fec(int requestor);
|
|
+int dma_connect(int channel, int address);
|
|
+int dma_disconnect(int channel);
|
|
+void dma_remove_channel_by_number(int channel);
|
|
+int dma_init(void);
|
|
+#endif /* CONFIG_MCD_DMA */
|
|
+
|
|
+extern spinlock_t dma_spin_lock;
|
|
+
|
|
+static __inline__ unsigned long claim_dma_lock(void)
|
|
+{
|
|
+ unsigned long flags;
|
|
+ spin_lock_irqsave(&dma_spin_lock, flags);
|
|
+ return flags;
|
|
+}
|
|
+
|
|
+static __inline__ void release_dma_lock(unsigned long flags)
|
|
+{
|
|
+ spin_unlock_irqrestore(&dma_spin_lock, flags);
|
|
+}
|
|
+
|
|
+
|
|
+/*
|
|
+ * Linux standard DMA stuff
|
|
+ */
|
|
+#if 0
|
|
+int request_dma(unsigned int channel, const char * device_id);
|
|
+void free_dma(unsigned int channel);
|
|
+void enable_dma(unsigned int channel);
|
|
+void disable_dma(unsigned int channel);
|
|
+int dma_channel_active(unsigned int channel);
|
|
+void set_dma_sg(unsigned int channel, struct scatterlist *sg, int nr_sg);
|
|
+void set_dma_page(unsigned int channel, char pagenr);
|
|
+void set_dma_addr(unsigned int channel, unsigned long physaddr);
|
|
+void set_dma_count(unsigned int channel, unsigned long count);
|
|
+void set_dma_mode(unsigned int channel, unsigned int mode);
|
|
+void set_dma_speed(unsigned int channel, int cycle_ns);
|
|
+int get_dma_residue(unsigned int channel);
|
|
+#endif
|
|
+#define clear_dma_ff(channel)
|
|
+
|
|
+#endif
|
|
+
|
|
+#ifdef CONFIG_PCI
|
|
+extern int isa_dma_bridge_buggy;
|
|
+#else
|
|
#define isa_dma_bridge_buggy (0)
|
|
+#endif
|
|
|
|
#endif /* _M68K_DMA_H */
|
|
--- a/arch/m68k/include/asm/elf.h
|
|
+++ b/arch/m68k/include/asm/elf.h
|
|
@@ -35,6 +35,27 @@
|
|
#define R_68K_JMP_SLOT 21
|
|
#define R_68K_RELATIVE 22
|
|
|
|
+/* TLS static relocations */
|
|
+#define R_68K_TLS_GD32 25
|
|
+#define R_68K_TLS_GD16 26
|
|
+#define R_68K_TLS_GD8 27
|
|
+#define R_68K_TLS_LDM32 28
|
|
+#define R_68K_TLS_LDM16 29
|
|
+#define R_68K_TLS_LDM8 30
|
|
+#define R_68K_TLS_LDO32 31
|
|
+#define R_68K_TLS_LDO16 32
|
|
+#define R_68K_TLS_LDO8 33
|
|
+#define R_68K_TLS_IE32 34
|
|
+#define R_68K_TLS_IE16 35
|
|
+#define R_68K_TLS_IE8 36
|
|
+#define R_68K_TLS_LE32 37
|
|
+#define R_68K_TLS_LE16 38
|
|
+#define R_68K_TLS_LE8 39
|
|
+/* TLS dynamic relocations */
|
|
+#define R_68K_TLS_DTPMOD32 40
|
|
+#define R_68K_TLS_DTPREL32 41
|
|
+#define R_68K_TLS_TPREL32 42
|
|
+
|
|
typedef unsigned long elf_greg_t;
|
|
|
|
#define ELF_NGREG (sizeof(struct user_regs_struct) / sizeof(elf_greg_t))
|
|
@@ -60,7 +81,7 @@ typedef struct user_m68kfp_struct elf_fp
|
|
#define ELF_PLAT_INIT(_r, load_addr) _r->a1 = 0
|
|
|
|
#define USE_ELF_CORE_DUMP
|
|
-#ifndef CONFIG_SUN3
|
|
+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
|
|
#define ELF_EXEC_PAGESIZE 4096
|
|
#else
|
|
#define ELF_EXEC_PAGESIZE 8192
|
|
@@ -71,8 +92,10 @@ typedef struct user_m68kfp_struct elf_fp
|
|
the loader. We need to make sure that it is out of the way of the program
|
|
that it will "exec", and that there is sufficient room for the brk. */
|
|
|
|
-#ifndef CONFIG_SUN3
|
|
+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
|
|
#define ELF_ET_DYN_BASE 0xD0000000UL
|
|
+#elif defined(CONFIG_COLDFIRE)
|
|
+#define ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE + 0x10000000)
|
|
#else
|
|
#define ELF_ET_DYN_BASE 0x0D800000UL
|
|
#endif
|
|
@@ -116,4 +139,35 @@ typedef struct user_m68kfp_struct elf_fp
|
|
|
|
#define SET_PERSONALITY(ex) set_personality(PER_LINUX)
|
|
|
|
+/*
|
|
+ * VDSO
|
|
+ */
|
|
+#ifdef CONFIG_VDSO
|
|
+extern unsigned int vdso_enabled;
|
|
+
|
|
+#define VDSO_BASE ((unsigned long)current->mm->context.vdso)
|
|
+#define VDSO_SYM(x) (VDSO_BASE + (unsigned long)(x))
|
|
+
|
|
+#define VDSO_AUX_ENT \
|
|
+ if (vdso_enabled) \
|
|
+ NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_BASE);
|
|
+
|
|
+/* additional pages */
|
|
+#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
|
|
+
|
|
+struct linux_binprm;
|
|
+extern int arch_setup_additional_pages(struct linux_binprm *bprm,
|
|
+ int executable_stack);
|
|
+
|
|
+#else
|
|
+/* no VDSO_AUX_ENT */
|
|
+#define VDSO_AUX_ENT
|
|
+#endif
|
|
+
|
|
+#define ARCH_DLINFO \
|
|
+do { \
|
|
+ /* vdso entry */ \
|
|
+ VDSO_AUX_ENT; \
|
|
+} while (0);
|
|
+
|
|
#endif
|
|
--- a/arch/m68k/include/asm/io_mm.h
|
|
+++ b/arch/m68k/include/asm/io_mm.h
|
|
@@ -7,17 +7,24 @@
|
|
* - added skeleton for GG-II and Amiga PCMCIA
|
|
* 2/3/01 RZ: - moved a few more defs into raw_io.h
|
|
*
|
|
- * inX/outX should not be used by any driver unless it does
|
|
- * ISA access. Other drivers should use function defined in raw_io.h
|
|
+ * inX/outX/readX/writeX should not be used by any driver unless it does
|
|
+ * ISA or PCI access. Other drivers should use function defined in raw_io.h
|
|
* or define its own macros on top of these.
|
|
*
|
|
- * inX(),outX() are for ISA I/O
|
|
+ * inX(),outX() are for PCI and ISA I/O
|
|
+ * readX(),writeX() are for PCI memory
|
|
* isa_readX(),isa_writeX() are for ISA memory
|
|
+ *
|
|
+ * moved mem{cpy,set}_*io inside CONFIG_PCI
|
|
*/
|
|
|
|
#ifndef _IO_H
|
|
#define _IO_H
|
|
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+#include <asm/cf_io.h>
|
|
+#else
|
|
+
|
|
#ifdef __KERNEL__
|
|
|
|
#include <linux/compiler.h>
|
|
@@ -88,20 +95,20 @@ extern unsigned long gg2_isa_base;
|
|
#undef MULTI_ISA
|
|
#endif
|
|
|
|
-#define ISA_TYPE_Q40 (1)
|
|
-#define ISA_TYPE_GG2 (2)
|
|
-#define ISA_TYPE_AG (3)
|
|
+#define Q40_ISA (1)
|
|
+#define GG2_ISA (2)
|
|
+#define AG_ISA (3)
|
|
|
|
#if defined(CONFIG_Q40) && !defined(MULTI_ISA)
|
|
-#define ISA_TYPE ISA_TYPE_Q40
|
|
+#define ISA_TYPE Q40_ISA
|
|
#define ISA_SEX 0
|
|
#endif
|
|
#if defined(CONFIG_AMIGA_PCMCIA) && !defined(MULTI_ISA)
|
|
-#define ISA_TYPE ISA_TYPE_AG
|
|
+#define ISA_TYPE AG_ISA
|
|
#define ISA_SEX 1
|
|
#endif
|
|
#if defined(CONFIG_GG2) && !defined(MULTI_ISA)
|
|
-#define ISA_TYPE ISA_TYPE_GG2
|
|
+#define ISA_TYPE GG2_ISA
|
|
#define ISA_SEX 0
|
|
#endif
|
|
|
|
@@ -123,13 +130,13 @@ static inline u8 __iomem *isa_itb(unsign
|
|
switch(ISA_TYPE)
|
|
{
|
|
#ifdef CONFIG_Q40
|
|
- case ISA_TYPE_Q40: return (u8 __iomem *)Q40_ISA_IO_B(addr);
|
|
+ case Q40_ISA: return (u8 __iomem *)Q40_ISA_IO_B(addr);
|
|
#endif
|
|
#ifdef CONFIG_GG2
|
|
- case ISA_TYPE_GG2: return (u8 __iomem *)GG2_ISA_IO_B(addr);
|
|
+ case GG2_ISA: return (u8 __iomem *)GG2_ISA_IO_B(addr);
|
|
#endif
|
|
#ifdef CONFIG_AMIGA_PCMCIA
|
|
- case ISA_TYPE_AG: return (u8 __iomem *)AG_ISA_IO_B(addr);
|
|
+ case AG_ISA: return (u8 __iomem *)AG_ISA_IO_B(addr);
|
|
#endif
|
|
default: return NULL; /* avoid warnings, just in case */
|
|
}
|
|
@@ -139,13 +146,13 @@ static inline u16 __iomem *isa_itw(unsig
|
|
switch(ISA_TYPE)
|
|
{
|
|
#ifdef CONFIG_Q40
|
|
- case ISA_TYPE_Q40: return (u16 __iomem *)Q40_ISA_IO_W(addr);
|
|
+ case Q40_ISA: return (u16 __iomem *)Q40_ISA_IO_W(addr);
|
|
#endif
|
|
#ifdef CONFIG_GG2
|
|
- case ISA_TYPE_GG2: return (u16 __iomem *)GG2_ISA_IO_W(addr);
|
|
+ case GG2_ISA: return (u16 __iomem *)GG2_ISA_IO_W(addr);
|
|
#endif
|
|
#ifdef CONFIG_AMIGA_PCMCIA
|
|
- case ISA_TYPE_AG: return (u16 __iomem *)AG_ISA_IO_W(addr);
|
|
+ case AG_ISA: return (u16 __iomem *)AG_ISA_IO_W(addr);
|
|
#endif
|
|
default: return NULL; /* avoid warnings, just in case */
|
|
}
|
|
@@ -155,7 +162,7 @@ static inline u32 __iomem *isa_itl(unsig
|
|
switch(ISA_TYPE)
|
|
{
|
|
#ifdef CONFIG_AMIGA_PCMCIA
|
|
- case ISA_TYPE_AG: return (u32 __iomem *)AG_ISA_IO_W(addr);
|
|
+ case AG_ISA: return (u32 __iomem *)AG_ISA_IO_W(addr);
|
|
#endif
|
|
default: return 0; /* avoid warnings, just in case */
|
|
}
|
|
@@ -165,13 +172,13 @@ static inline u8 __iomem *isa_mtb(unsign
|
|
switch(ISA_TYPE)
|
|
{
|
|
#ifdef CONFIG_Q40
|
|
- case ISA_TYPE_Q40: return (u8 __iomem *)Q40_ISA_MEM_B(addr);
|
|
+ case Q40_ISA: return (u8 __iomem *)Q40_ISA_MEM_B(addr);
|
|
#endif
|
|
#ifdef CONFIG_GG2
|
|
- case ISA_TYPE_GG2: return (u8 __iomem *)GG2_ISA_MEM_B(addr);
|
|
+ case GG2_ISA: return (u8 __iomem *)GG2_ISA_MEM_B(addr);
|
|
#endif
|
|
#ifdef CONFIG_AMIGA_PCMCIA
|
|
- case ISA_TYPE_AG: return (u8 __iomem *)addr;
|
|
+ case AG_ISA: return (u8 __iomem *)addr;
|
|
#endif
|
|
default: return NULL; /* avoid warnings, just in case */
|
|
}
|
|
@@ -181,13 +188,13 @@ static inline u16 __iomem *isa_mtw(unsig
|
|
switch(ISA_TYPE)
|
|
{
|
|
#ifdef CONFIG_Q40
|
|
- case ISA_TYPE_Q40: return (u16 __iomem *)Q40_ISA_MEM_W(addr);
|
|
+ case Q40_ISA: return (u16 __iomem *)Q40_ISA_MEM_W(addr);
|
|
#endif
|
|
#ifdef CONFIG_GG2
|
|
- case ISA_TYPE_GG2: return (u16 __iomem *)GG2_ISA_MEM_W(addr);
|
|
+ case GG2_ISA: return (u16 __iomem *)GG2_ISA_MEM_W(addr);
|
|
#endif
|
|
#ifdef CONFIG_AMIGA_PCMCIA
|
|
- case ISA_TYPE_AG: return (u16 __iomem *)addr;
|
|
+ case AG_ISA: return (u16 __iomem *)addr;
|
|
#endif
|
|
default: return NULL; /* avoid warnings, just in case */
|
|
}
|
|
@@ -201,30 +208,29 @@ static inline u16 __iomem *isa_mtw(unsig
|
|
#define isa_outw(val,port) (ISA_SEX ? out_be16(isa_itw(port),(val)) : out_le16(isa_itw(port),(val)))
|
|
#define isa_outl(val,port) (ISA_SEX ? out_be32(isa_itl(port),(val)) : out_le32(isa_itl(port),(val)))
|
|
|
|
-#define isa_readb(p) in_8(isa_mtb((unsigned long)(p)))
|
|
-#define isa_readw(p) \
|
|
- (ISA_SEX ? in_be16(isa_mtw((unsigned long)(p))) \
|
|
- : in_le16(isa_mtw((unsigned long)(p))))
|
|
-#define isa_writeb(val,p) out_8(isa_mtb((unsigned long)(p)),(val))
|
|
-#define isa_writew(val,p) \
|
|
- (ISA_SEX ? out_be16(isa_mtw((unsigned long)(p)),(val)) \
|
|
- : out_le16(isa_mtw((unsigned long)(p)),(val)))
|
|
-
|
|
+#define isa_readb(p) in_8(isa_mtb(p))
|
|
+#define isa_readw(p) (ISA_SEX ? in_be16(isa_mtw(p)) : in_le16(isa_mtw(p)))
|
|
+#define isa_writeb(val,p) out_8(isa_mtb(p),(val))
|
|
+#define isa_writew(val,p) (ISA_SEX ? out_be16(isa_mtw(p),(val)) : out_le16(isa_mtw(p),(val)))
|
|
static inline void isa_delay(void)
|
|
{
|
|
- switch(ISA_TYPE)
|
|
- {
|
|
+ switch (ISA_TYPE) {
|
|
#ifdef CONFIG_Q40
|
|
- case ISA_TYPE_Q40: isa_outb(0,0x80); break;
|
|
+ case Q40_ISA:
|
|
+ isa_outb(0, 0x80);
|
|
+ break;
|
|
#endif
|
|
#ifdef CONFIG_GG2
|
|
- case ISA_TYPE_GG2: break;
|
|
+ case GG2_ISA:
|
|
+ break;
|
|
#endif
|
|
#ifdef CONFIG_AMIGA_PCMCIA
|
|
- case ISA_TYPE_AG: break;
|
|
+ case AG_ISA:
|
|
+ break;
|
|
#endif
|
|
- default: break; /* avoid warnings */
|
|
- }
|
|
+ default:
|
|
+ break; /* avoid warnings */
|
|
+ }
|
|
}
|
|
|
|
#define isa_inb_p(p) ({u8 v=isa_inb(p);isa_delay();v;})
|
|
@@ -253,7 +259,10 @@ static inline void isa_delay(void)
|
|
(ISA_SEX ? raw_outsl(isa_itl(port), (u32 *)(buf), (nr)) : \
|
|
raw_outsw_swapw(isa_itw(port), (u16 *)(buf), (nr)<<1))
|
|
|
|
+#endif /* CONFIG_ISA */
|
|
|
|
+
|
|
+#if defined(CONFIG_ISA) && !defined(CONFIG_PCI)
|
|
#define inb isa_inb
|
|
#define inb_p isa_inb_p
|
|
#define outb isa_outb
|
|
@@ -276,9 +285,80 @@ static inline void isa_delay(void)
|
|
#define readw isa_readw
|
|
#define writeb isa_writeb
|
|
#define writew isa_writew
|
|
+#endif /* CONFIG_ISA */
|
|
+
|
|
+#if defined(CONFIG_PCI)
|
|
+
|
|
+#define readl(addr) in_le32(addr)
|
|
+#define writel(val, addr) out_le32((addr), (val))
|
|
+
|
|
+/* those can be defined for both ISA and PCI - it won't work though */
|
|
+#define readb(addr) in_8(addr)
|
|
+#define readw(addr) in_le16(addr)
|
|
+#define writeb(val, addr) out_8((addr), (val))
|
|
+#define writew(val, addr) out_le16((addr), (val))
|
|
+
|
|
+#define readb_relaxed(addr) readb(addr)
|
|
+#define readw_relaxed(addr) readw(addr)
|
|
+#define readl_relaxed(addr) readl(addr)
|
|
+
|
|
+#ifndef CONFIG_ISA
|
|
+#define inb(port) in_8(port)
|
|
+#define outb(val, port) out_8((port), (val))
|
|
+#define inw(port) in_le16(port)
|
|
+#define outw(val, port) out_le16((port), (val))
|
|
+#define inl(port) in_le32(port)
|
|
+#define outl(val, port) out_le32((port), (val))
|
|
+#define insb(port, buf, nr) \
|
|
+ raw_insb((u8 *)(port), (u8 *)(buf), (nr))
|
|
+#define outsb(port, buf, nr) \
|
|
+ raw_outsb((u8 *)(port), (u8 *)(buf), (nr))
|
|
+#define insw(port, buf, nr) \
|
|
+ raw_insw_swapw((u16 *)(port), (u16 *)(buf), (nr))
|
|
+#define outsw(port, buf, nr) \
|
|
+ raw_outsw_swapw((u16 *)(port), (u16 *)(buf), (nr))
|
|
+#define insl(port, buf, nr) \
|
|
+ raw_insw_swapw((u16 *)(port), (u16 *)(buf), (nr)<<1)
|
|
+#define outsl(port, buf, nr) \
|
|
+ raw_outsw_swapw((u16 *)(port), (u16 *)(buf), (nr)<<1)
|
|
+
|
|
+#define __raw_readb readb
|
|
+#define __raw_readw readw
|
|
+#define __raw_readl readl
|
|
+#define __raw_writeb writeb
|
|
+#define __raw_writew writew
|
|
+#define __raw_writel writel
|
|
|
|
-#else /* CONFIG_ISA */
|
|
+#else
|
|
+/*
|
|
+ * kernel with both ISA and PCI compiled in, those have
|
|
+ * conflicting defs for in/out. Simply consider port < 1024
|
|
+ * ISA and everything else PCI. read,write not defined
|
|
+ * in this case
|
|
+ */
|
|
+#define inb(port) ((port) < 1024 ? isa_inb(port) : in_8(port))
|
|
+#define inb_p(port) ((port) < 1024 ? isa_inb_p(port) : in_8(port))
|
|
+#define inw(port) ((port) < 1024 ? isa_inw(port) : in_le16(port))
|
|
+#define inw_p(port) ((port) < 1024 ? isa_inw_p(port) : in_le16(port))
|
|
+#define inl(port) ((port) < 1024 ? isa_inl(port) : in_le32(port))
|
|
+#define inl_p(port) ((port) < 1024 ? isa_inl_p(port) : in_le32(port))
|
|
+
|
|
+#define outb(val, port) (((port) < 1024) ? isa_outb((val), (port))
|
|
+ : out_8((port), (val)))
|
|
+#define outb_p(val, port) (((port) < 1024) ? isa_outb_p((val), (port))
|
|
+ : out_8((port), (val)))
|
|
+#define outw(val, port) (((port) < 1024) ? isa_outw((val), (port))
|
|
+ : out_le16((port), (val)))
|
|
+#define outw_p(val, port) (((port) < 1024) ? isa_outw_p((val), (port))
|
|
+ : out_le16((port), (val)))
|
|
+#define outl(val, port) (((port) < 1024) ? isa_outl((val), (port))
|
|
+ : out_le32((port), (val)))
|
|
+#define outl_p(val, port) (((port) < 1024) ? isa_outl_p((val), (port))
|
|
+ : out_le32((port), (val)))
|
|
+#endif
|
|
+#endif /* CONFIG_PCI */
|
|
|
|
+#if !defined(CONFIG_ISA) && !defined(CONFIG_PCI)
|
|
/*
|
|
* We need to define dummy functions for GENERIC_IOMAP support.
|
|
*/
|
|
@@ -305,11 +385,11 @@ static inline void isa_delay(void)
|
|
#define writeb(val,addr) out_8((addr),(val))
|
|
#define readw(addr) in_le16(addr)
|
|
#define writew(val,addr) out_le16((addr),(val))
|
|
-
|
|
-#endif /* CONFIG_ISA */
|
|
-
|
|
+#endif
|
|
+#if !defined(CONFIG_PCI)
|
|
#define readl(addr) in_le32(addr)
|
|
#define writel(val,addr) out_le32((addr),(val))
|
|
+#endif
|
|
|
|
#define mmiowb()
|
|
|
|
@@ -345,10 +425,10 @@ static inline void memcpy_toio(volatile
|
|
__builtin_memcpy((void __force *) dst, src, count);
|
|
}
|
|
|
|
-#ifndef CONFIG_SUN3
|
|
-#define IO_SPACE_LIMIT 0xffff
|
|
-#else
|
|
+#if defined(CONFIG_SUN3)
|
|
#define IO_SPACE_LIMIT 0x0fffffff
|
|
+#else
|
|
+#define IO_SPACE_LIMIT 0xffff
|
|
#endif
|
|
|
|
#endif /* __KERNEL__ */
|
|
@@ -366,4 +446,5 @@ static inline void memcpy_toio(volatile
|
|
*/
|
|
#define xlate_dev_kmem_ptr(p) p
|
|
|
|
+#endif /* CONFIG_COLDFIRE */
|
|
#endif /* _IO_H */
|
|
--- a/arch/m68k/include/asm/irq_mm.h
|
|
+++ b/arch/m68k/include/asm/irq_mm.h
|
|
@@ -12,7 +12,10 @@
|
|
* Currently the Atari has 72 and the Amiga 24, but if both are
|
|
* supported in the kernel it is better to make room for 72.
|
|
*/
|
|
-#if defined(CONFIG_VME) || defined(CONFIG_SUN3) || defined(CONFIG_SUN3X)
|
|
+#if defined(CONFIG_COLDFIRE)
|
|
+#define SYS_IRQS 256
|
|
+#define NR_IRQS SYS_IRQS
|
|
+#elif defined(CONFIG_VME) || defined(CONFIG_SUN3) || defined(CONFIG_SUN3X)
|
|
#define NR_IRQS 200
|
|
#elif defined(CONFIG_ATARI) || defined(CONFIG_MAC)
|
|
#define NR_IRQS 72
|
|
--- a/arch/m68k/include/asm/machdep_mm.h
|
|
+++ b/arch/m68k/include/asm/machdep_mm.h
|
|
@@ -32,4 +32,11 @@ extern void (*mach_heartbeat) (int);
|
|
extern void (*mach_l2_flush) (int);
|
|
extern void (*mach_beep) (unsigned int, unsigned int);
|
|
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+extern void __init config_coldfire(void);
|
|
+extern void __init mmu_context_init(void);
|
|
+extern irq_handler_t mach_default_handler;
|
|
+extern void (*mach_tick)(void);
|
|
+#endif
|
|
+
|
|
#endif /* _M68K_MACHDEP_H */
|
|
--- a/arch/m68k/include/asm/mcfsim.h
|
|
+++ b/arch/m68k/include/asm/mcfsim.h
|
|
@@ -39,6 +39,25 @@
|
|
#include <asm/m5407sim.h>
|
|
#endif
|
|
|
|
+#if defined(CONFIG_COLDFIRE)
|
|
+#include <asm/coldfire.h>
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_M5445X)
|
|
+#include <asm/mcf5445x_intc.h>
|
|
+#include <asm/mcf5445x_gpio.h>
|
|
+#include <asm/mcf5445x_ccm.h>
|
|
+#include <asm/mcf5445x_eport.h>
|
|
+#include <asm/mcf5445x_fbcs.h>
|
|
+#include <asm/mcf5445x_xbs.h>
|
|
+#include <asm/mcf5445x_dtim.h>
|
|
+#include <asm/mcf5445x_rtc.h>
|
|
+#include <asm/mcf5445x_scm.h>
|
|
+#elif defined(CONFIG_M547X_8X)
|
|
+#include <asm/m5485sim.h>
|
|
+#include <asm/m5485gpio.h>
|
|
+#include <asm/m5485gpt.h>
|
|
+#endif
|
|
|
|
/*
|
|
* Define the base address of the SIM within the MBAR address space.
|
|
--- a/arch/m68k/include/asm/mmu_context.h
|
|
+++ b/arch/m68k/include/asm/mmu_context.h
|
|
@@ -8,7 +8,7 @@ static inline void enter_lazy_tlb(struct
|
|
}
|
|
|
|
#ifdef CONFIG_MMU
|
|
-#ifndef CONFIG_SUN3
|
|
+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
|
|
|
|
#include <asm/setup.h>
|
|
#include <asm/page.h>
|
|
@@ -103,7 +103,7 @@ static inline void activate_mm(struct mm
|
|
switch_mm_0460(next_mm);
|
|
}
|
|
|
|
-#else /* CONFIG_SUN3 */
|
|
+#elif defined(CONFIG_SUN3)
|
|
#include <asm/sun3mmu.h>
|
|
#include <linux/sched.h>
|
|
|
|
@@ -151,7 +151,179 @@ static inline void activate_mm(struct mm
|
|
activate_context(next_mm);
|
|
}
|
|
|
|
+#else /* CONFIG_COLDFIRE */
|
|
+
|
|
+#include <asm/coldfire.h>
|
|
+#include <asm/atomic.h>
|
|
+#include <asm/bitops.h>
|
|
+#include <asm/mmu.h>
|
|
+
|
|
+#define NO_CONTEXT 256
|
|
+#define LAST_CONTEXT 255
|
|
+#define FIRST_CONTEXT 1
|
|
+
|
|
+#ifdef CONFIG_VDSO
|
|
+#define cpu_context(mm) ((mm)->context.id)
|
|
+#else
|
|
+#define cpu_context(mm) ((mm)->context)
|
|
+#endif
|
|
+
|
|
+#ifdef CONFIG_VDSO
|
|
+extern void set_context(unsigned long context, pgd_t *pgd);
|
|
+#else
|
|
+extern void set_context(mm_context_t context, pgd_t *pgd);
|
|
+#endif
|
|
+extern unsigned long context_map[];
|
|
+#ifdef CONFIG_VDSO
|
|
+extern unsigned long next_mmu_context;
|
|
+#else
|
|
+extern mm_context_t next_mmu_context;
|
|
+#endif
|
|
+
|
|
+
|
|
+extern atomic_t nr_free_contexts;
|
|
+extern struct mm_struct *context_mm[LAST_CONTEXT+1];
|
|
+extern void steal_context(void);
|
|
+
|
|
+static inline void get_mmu_context(struct mm_struct *mm)
|
|
+{
|
|
+#ifdef CONFIG_VDSO
|
|
+ unsigned long ctx;
|
|
+#else
|
|
+ mm_context_t ctx;
|
|
#endif
|
|
+
|
|
+ if (cpu_context(mm) != NO_CONTEXT)
|
|
+ return;
|
|
+ while (atomic_dec_and_test_lt(&nr_free_contexts)) {
|
|
+ atomic_inc(&nr_free_contexts);
|
|
+ steal_context();
|
|
+ }
|
|
+ ctx = next_mmu_context;
|
|
+ while (test_and_set_bit(ctx, context_map)) {
|
|
+ ctx = find_next_zero_bit(context_map, LAST_CONTEXT+1, ctx);
|
|
+ if (ctx > LAST_CONTEXT)
|
|
+ ctx = 0;
|
|
+ }
|
|
+ next_mmu_context = (ctx + 1) & LAST_CONTEXT;
|
|
+ cpu_context(mm) = ctx;
|
|
+ context_mm[ctx] = mm;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Set up the context for a new address space.
|
|
+ */
|
|
+#define init_new_context(tsk, mm) ((cpu_context(mm) = NO_CONTEXT), 0)
|
|
+/* #define init_new_context(tsk, mm) (((mm)->context = NO_CONTEXT), 0) */
|
|
+
|
|
+/*
|
|
+ * We're finished using the context for an address space.
|
|
+ */
|
|
+static inline void destroy_context(struct mm_struct *mm)
|
|
+{
|
|
+ if (cpu_context(mm) != NO_CONTEXT) {
|
|
+ clear_bit(cpu_context(mm), context_map);
|
|
+ cpu_context(mm) = NO_CONTEXT;
|
|
+ atomic_inc(&nr_free_contexts);
|
|
+ }
|
|
+}
|
|
+
|
|
+static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
|
|
+ struct task_struct *tsk)
|
|
+{
|
|
+ get_mmu_context(tsk->mm);
|
|
+ set_context(cpu_context(tsk->mm), next->pgd);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * After we have set current->mm to a new value, this activates
|
|
+ * the context for the new mm so we see the new mappings.
|
|
+ */
|
|
+static inline void activate_mm(struct mm_struct *active_mm,
|
|
+ struct mm_struct *mm)
|
|
+{
|
|
+ get_mmu_context(mm);
|
|
+ set_context(cpu_context(mm), mm->pgd);
|
|
+}
|
|
+
|
|
+#define deactivate_mm(tsk, mm) do { } while (0)
|
|
+
|
|
+extern void mmu_context_init(void);
|
|
+#if defined(CONFIG_M547X_8X)
|
|
+#define prepare_arch_switch(next) load_ksp_mmu(next)
|
|
+
|
|
+static inline void load_ksp_mmu(struct task_struct *task)
|
|
+{
|
|
+ int flags;
|
|
+ struct mm_struct *mm;
|
|
+ int asid;
|
|
+ pgd_t *pgd;
|
|
+ pmd_t *pmd;
|
|
+ pte_t *pte;
|
|
+ unsigned long mmuar;
|
|
+
|
|
+ local_irq_save(flags);
|
|
+ mmuar = task->thread.ksp;
|
|
+
|
|
+ /* Search for a valid TLB entry, if one is found, don't remap */
|
|
+ *MMUAR = mmuar;
|
|
+ *MMUOR = MMUOR_STLB | MMUOR_ADR;
|
|
+ if ((*MMUSR) & MMUSR_HIT)
|
|
+ goto end;
|
|
+
|
|
+ if (mmuar >= PAGE_OFFSET) {
|
|
+ mm = &init_mm;
|
|
+ } else {
|
|
+ printk(KERN_INFO "load_ksp_mmu: non-kernel"
|
|
+ " mm found: 0x%08x\n", (unsigned int) task->mm);
|
|
+ mm = task->mm;
|
|
+ }
|
|
+
|
|
+ if (!mm)
|
|
+ goto bug;
|
|
+
|
|
+ pgd = pgd_offset(mm, mmuar);
|
|
+ if (pgd_none(*pgd))
|
|
+ goto bug;
|
|
+
|
|
+ pmd = pmd_offset(pgd, mmuar);
|
|
+ if (pmd_none(*pmd))
|
|
+ goto bug;
|
|
+
|
|
+ pte = (mmuar >= PAGE_OFFSET) ? pte_offset_kernel(pmd, mmuar)
|
|
+ : pte_offset_map(pmd, mmuar);
|
|
+ if (pte_none(*pte) || !pte_present(*pte))
|
|
+ goto bug;
|
|
+
|
|
+ set_pte(pte, pte_mkyoung(*pte));
|
|
+ asid = cpu_context(mm) & 0xff;
|
|
+ if (!pte_dirty(*pte) && mmuar <= PAGE_OFFSET)
|
|
+ set_pte(pte, pte_wrprotect(*pte));
|
|
+
|
|
+ *MMUTR = (mmuar & PAGE_MASK) | (asid << CF_ASID_MMU_SHIFT)
|
|
+ | (((int)(pte->pte) & (int)CF_PAGE_MMUTR_MASK)
|
|
+ >> CF_PAGE_MMUTR_SHIFT)
|
|
+ | MMUTR_V;
|
|
+
|
|
+ *MMUDR = (pte_val(*pte) & PAGE_MASK)
|
|
+ | ((pte->pte) & CF_PAGE_MMUDR_MASK)
|
|
+ | MMUDR_SZ8K | MMUDR_X;
|
|
+
|
|
+ *MMUOR = MMUOR_ACC | MMUOR_UAA;
|
|
+ asm ("nop");
|
|
+
|
|
+ goto end;
|
|
+
|
|
+bug:
|
|
+ printk(KERN_ERR "ksp load failed: mm=0x%08x ksp=0x%08x\n",
|
|
+ (unsigned int) mm, (unsigned int) mmuar);
|
|
+end:
|
|
+ local_irq_restore(flags);
|
|
+}
|
|
+#endif /* CONFIG_M547X_8X */
|
|
+
|
|
+#endif /* CONFIG_COLDFIRE */
|
|
+
|
|
#else /* !CONFIG_MMU */
|
|
|
|
static inline int init_new_context(struct task_struct *tsk, struct mm_struct *mm)
|
|
--- a/arch/m68k/include/asm/page_mm.h
|
|
+++ b/arch/m68k/include/asm/page_mm.h
|
|
@@ -1,10 +1,15 @@
|
|
#ifndef _M68K_PAGE_H
|
|
#define _M68K_PAGE_H
|
|
|
|
+/*#if defined(CONFIG_COLDFIRE)*/
|
|
+#if defined(CONFIG_M5445X) || defined(CONFIG_M547X_8X)
|
|
+#include <asm/cf_page.h>
|
|
+#else
|
|
+
|
|
#include <linux/const.h>
|
|
|
|
/* PAGE_SHIFT determines the page size */
|
|
-#ifndef CONFIG_SUN3
|
|
+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
|
|
#define PAGE_SHIFT (12)
|
|
#else
|
|
#define PAGE_SHIFT (13)
|
|
@@ -113,10 +118,31 @@ typedef struct page *pgtable_t;
|
|
|
|
extern unsigned long m68k_memoffset;
|
|
|
|
-#ifndef CONFIG_SUN3
|
|
+#if !defined(CONFIG_SUN3)
|
|
|
|
#define WANT_PAGE_VIRTUAL
|
|
|
|
+#if defined(CONFIG_COLDFIRE)
|
|
+static inline unsigned long ___pa(void *vaddr)
|
|
+{
|
|
+#if CONFIG_SDRAM_BASE != PAGE_OFFSET
|
|
+ return (((unsigned long)vaddr & 0x0fffffff) + CONFIG_SDRAM_BASE);
|
|
+#else
|
|
+ return (unsigned long)vaddr;
|
|
+#endif
|
|
+}
|
|
+#define __pa(vaddr) ___pa((void *)(vaddr))
|
|
+
|
|
+static inline void *__va(unsigned long paddr)
|
|
+{
|
|
+#if CONFIG_SDRAM_BASE != PAGE_OFFSET
|
|
+ return (void *)((paddr & 0x0fffffff) + PAGE_OFFSET);
|
|
+#else
|
|
+ return (void *)paddr;
|
|
+#endif
|
|
+}
|
|
+
|
|
+#else
|
|
static inline unsigned long ___pa(void *vaddr)
|
|
{
|
|
unsigned long paddr;
|
|
@@ -138,6 +164,7 @@ static inline void *__va(unsigned long p
|
|
: "0" (paddr), "i" (m68k_fixup_memoffset));
|
|
return vaddr;
|
|
}
|
|
+#endif
|
|
|
|
#else /* !CONFIG_SUN3 */
|
|
/* This #define is a horrible hack to suppress lots of warnings. --m */
|
|
@@ -169,6 +196,8 @@ static inline void *__va(unsigned long x
|
|
* memory node, but we have no highmem, so that works for now.
|
|
* TODO: implement (fast) pfn<->pgdat_idx conversion functions, this makes lots
|
|
* of the shifts unnecessary.
|
|
+ *
|
|
+ * PFNs are used to map physical pages. So PFN[0] maps to the base phys addr.
|
|
*/
|
|
#define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT)
|
|
#define pfn_to_virt(pfn) __va((pfn) << PAGE_SHIFT)
|
|
@@ -225,4 +254,10 @@ static inline __attribute_const__ int __
|
|
|
|
#include <asm-generic/getorder.h>
|
|
|
|
+#ifdef CONFIG_VDSO
|
|
+/* vDSO support */
|
|
+#define __HAVE_ARCH_GATE_AREA
|
|
+#endif
|
|
+
|
|
+#endif /* !CONFIG_COLDFIRE */
|
|
#endif /* _M68K_PAGE_H */
|
|
--- a/arch/m68k/include/asm/page_offset.h
|
|
+++ b/arch/m68k/include/asm/page_offset.h
|
|
@@ -1,10 +1,13 @@
|
|
/* This handles the memory map.. */
|
|
|
|
#ifdef CONFIG_MMU
|
|
-#ifndef CONFIG_SUN3
|
|
-#define PAGE_OFFSET_RAW 0x00000000
|
|
-#else
|
|
+#if defined(CONFIG_SUN3)
|
|
#define PAGE_OFFSET_RAW 0x0E000000
|
|
+#elif defined(CONFIG_M5445X) || defined(CONFIG_M547X_8X)
|
|
+#define PHYS_OFFSET CONFIG_SDRAM_BASE
|
|
+#define PAGE_OFFSET_RAW (PHYS_OFFSET)
|
|
+#else
|
|
+#define PAGE_OFFSET_RAW 0x00000000
|
|
#endif
|
|
#else
|
|
#define PAGE_OFFSET_RAW CONFIG_RAMBASE
|
|
--- a/arch/m68k/include/asm/pgalloc.h
|
|
+++ b/arch/m68k/include/asm/pgalloc.h
|
|
@@ -7,8 +7,10 @@
|
|
|
|
#ifdef CONFIG_MMU
|
|
#include <asm/virtconvert.h>
|
|
-#ifdef CONFIG_SUN3
|
|
+#if defined (CONFIG_SUN3)
|
|
#include <asm/sun3_pgalloc.h>
|
|
+#elif defined(CONFIG_COLDFIRE)
|
|
+#include <asm/cf_pgalloc.h>
|
|
#else
|
|
#include <asm/motorola_pgalloc.h>
|
|
#endif
|
|
--- a/arch/m68k/include/asm/pgtable_mm.h
|
|
+++ b/arch/m68k/include/asm/pgtable_mm.h
|
|
@@ -40,6 +40,8 @@
|
|
/* PGDIR_SHIFT determines what a third-level page table entry can map */
|
|
#ifdef CONFIG_SUN3
|
|
#define PGDIR_SHIFT 17
|
|
+#elif defined(CONFIG_COLDFIRE)
|
|
+#define PGDIR_SHIFT 22
|
|
#else
|
|
#define PGDIR_SHIFT 25
|
|
#endif
|
|
@@ -54,6 +56,10 @@
|
|
#define PTRS_PER_PTE 16
|
|
#define PTRS_PER_PMD 1
|
|
#define PTRS_PER_PGD 2048
|
|
+#elif defined(CONFIG_COLDFIRE)
|
|
+#define PTRS_PER_PTE 512
|
|
+#define PTRS_PER_PMD 1
|
|
+#define PTRS_PER_PGD 1024
|
|
#else
|
|
#define PTRS_PER_PTE 1024
|
|
#define PTRS_PER_PMD 8
|
|
@@ -66,6 +72,11 @@
|
|
#ifdef CONFIG_SUN3
|
|
#define KMAP_START 0x0DC00000
|
|
#define KMAP_END 0x0E000000
|
|
+#elif defined(CONFIG_COLDFIRE)
|
|
+#define VMALLOC_START 0xc0000000
|
|
+#define VMALLOC_END 0xcfffffff
|
|
+#define KMAP_START (VMALLOC_END + 1)
|
|
+#define KMAP_END 0xe8000000
|
|
#else
|
|
#define KMAP_START 0xd0000000
|
|
#define KMAP_END 0xf0000000
|
|
@@ -79,9 +90,11 @@
|
|
* The vmalloc() routines leaves a hole of 4kB between each vmalloced
|
|
* area for the same reason. ;)
|
|
*/
|
|
+#if !defined(CONFIG_COLDFIRE)
|
|
#define VMALLOC_OFFSET (8*1024*1024)
|
|
#define VMALLOC_START (((unsigned long) high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
|
|
#define VMALLOC_END KMAP_START
|
|
+#endif
|
|
#else
|
|
extern unsigned long vmalloc_end;
|
|
#define VMALLOC_START 0x0f800000
|
|
@@ -130,6 +143,8 @@ static inline void update_mmu_cache(stru
|
|
|
|
#ifdef CONFIG_SUN3
|
|
#include <asm/sun3_pgtable.h>
|
|
+#elif defined(CONFIG_COLDFIRE)
|
|
+#include <asm/cf_pgtable.h>
|
|
#else
|
|
#include <asm/motorola_pgtable.h>
|
|
#endif
|
|
@@ -138,6 +153,9 @@ static inline void update_mmu_cache(stru
|
|
/*
|
|
* Macro to mark a page protection value as "uncacheable".
|
|
*/
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+# define pgprot_noncached(prot) (__pgprot(pgprot_val(prot) | CF_PAGE_NOCACHE))
|
|
+#else /* CONFIG_COLDFIRE */
|
|
#ifdef SUN3_PAGE_NOCACHE
|
|
# define __SUN3_PAGE_NOCACHE SUN3_PAGE_NOCACHE
|
|
#else
|
|
@@ -152,6 +170,7 @@ static inline void update_mmu_cache(stru
|
|
? (__pgprot((pgprot_val(prot) & _CACHEMASK040) | _PAGE_NOCACHE_S)) \
|
|
: (prot)))
|
|
|
|
+#endif /* CONFIG_COLDFIRE */
|
|
#include <asm-generic/pgtable.h>
|
|
#endif /* !__ASSEMBLY__ */
|
|
|
|
--- a/arch/m68k/include/asm/processor_mm.h
|
|
+++ b/arch/m68k/include/asm/processor_mm.h
|
|
@@ -2,6 +2,7 @@
|
|
* include/asm-m68k/processor.h
|
|
*
|
|
* Copyright (C) 1995 Hamish Macdonald
|
|
+ * Copyright 2007-2009 Freescale Semiconductor, Inc. All Rights Reserved.
|
|
*/
|
|
|
|
#ifndef __ASM_M68K_PROCESSOR_H
|
|
@@ -22,24 +23,38 @@ static inline unsigned long rdusp(void)
|
|
{
|
|
unsigned long usp;
|
|
|
|
+#ifndef CONFIG_COLDFIRE
|
|
__asm__ __volatile__("move %/usp,%0" : "=a" (usp));
|
|
+#else
|
|
+ __asm__ __volatile__("movel %/usp,%0" : "=a" (usp));
|
|
+#endif
|
|
return usp;
|
|
}
|
|
|
|
static inline void wrusp(unsigned long usp)
|
|
{
|
|
+#ifndef CONFIG_COLDFIRE
|
|
__asm__ __volatile__("move %0,%/usp" : : "a" (usp));
|
|
+#else
|
|
+ __asm__ __volatile__("movel %0,%/usp" : : "a" (usp));
|
|
+#endif
|
|
}
|
|
|
|
/*
|
|
* User space process size: 3.75GB. This is hardcoded into a few places,
|
|
* so don't change it unless you know what you are doing.
|
|
*/
|
|
-#ifndef CONFIG_SUN3
|
|
+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
|
|
#define TASK_SIZE (0xF0000000UL)
|
|
+#elif defined(CONFIG_COLDFIRE)
|
|
+#define TASK_SIZE (0xC0000000UL)
|
|
+#else /* CONFIG_SUN3 */
|
|
+#ifdef __ASSEMBLY__
|
|
+#define TASK_SIZE (0x0E000000)
|
|
#else
|
|
#define TASK_SIZE (0x0E000000UL)
|
|
#endif
|
|
+#endif
|
|
|
|
#ifdef __KERNEL__
|
|
#define STACK_TOP TASK_SIZE
|
|
@@ -49,9 +64,11 @@ static inline void wrusp(unsigned long u
|
|
/* This decides where the kernel will search for a free chunk of vm
|
|
* space during mmap's.
|
|
*/
|
|
-#ifndef CONFIG_SUN3
|
|
-#define TASK_UNMAPPED_BASE 0xC0000000UL
|
|
-#else
|
|
+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
|
|
+#define TASK_UNMAPPED_BASE 0xC0000000UL
|
|
+#elif defined(CONFIG_COLDFIRE)
|
|
+#define TASK_UNMAPPED_BASE 0x60000000UL
|
|
+#else /* CONFIG_SUN3 */
|
|
#define TASK_UNMAPPED_BASE 0x0A000000UL
|
|
#endif
|
|
#define TASK_UNMAPPED_ALIGN(addr, off) PAGE_ALIGN(addr)
|
|
@@ -60,7 +77,11 @@ struct thread_struct {
|
|
unsigned long ksp; /* kernel stack pointer */
|
|
unsigned long usp; /* user stack pointer */
|
|
unsigned short sr; /* saved status register */
|
|
+#ifndef CONFIG_COLDFIRE
|
|
unsigned short fs; /* saved fs (sfc, dfc) */
|
|
+#else
|
|
+ mm_segment_t fs;
|
|
+#endif
|
|
unsigned long crp[2]; /* cpu root pointer */
|
|
unsigned long esp0; /* points to SR of stack frame */
|
|
unsigned long faddr; /* info about last fault */
|
|
@@ -81,6 +102,7 @@ struct thread_struct {
|
|
/*
|
|
* Do necessary setup to start up a newly executed thread.
|
|
*/
|
|
+#ifndef CONFIG_COLDFIRE
|
|
static inline void start_thread(struct pt_regs * regs, unsigned long pc,
|
|
unsigned long usp)
|
|
{
|
|
@@ -91,6 +113,23 @@ static inline void start_thread(struct p
|
|
regs->sr &= ~0x2000;
|
|
wrusp(usp);
|
|
}
|
|
+#else
|
|
+/*
|
|
+ * Do necessary setup to start up a newly executed thread.
|
|
+ *
|
|
+ * pass the data segment into user programs if it exists,
|
|
+ * it can't hurt anything as far as I can tell
|
|
+ */
|
|
+#define start_thread(_regs, _pc, _usp) \
|
|
+do { \
|
|
+ set_fs(USER_DS); /* reads from user space */ \
|
|
+ (_regs)->pc = (_pc); \
|
|
+ if (current->mm) \
|
|
+ (_regs)->d5 = current->mm->start_data; \
|
|
+ (_regs)->sr &= ~0x2000; \
|
|
+ wrusp(_usp); \
|
|
+} while (0)
|
|
+#endif
|
|
|
|
/* Forward declaration, a strange C thing */
|
|
struct task_struct;
|
|
--- a/arch/m68k/include/asm/ptrace.h
|
|
+++ b/arch/m68k/include/asm/ptrace.h
|
|
@@ -39,10 +39,21 @@ struct pt_regs {
|
|
long orig_d0;
|
|
long stkadj;
|
|
#ifdef CONFIG_COLDFIRE
|
|
+#if 0
|
|
unsigned format : 4; /* frame format specifier */
|
|
unsigned vector : 12; /* vector offset */
|
|
unsigned short sr;
|
|
unsigned long pc;
|
|
+#endif
|
|
+/*FROM BSP*/
|
|
+ unsigned long mmuar;
|
|
+ unsigned long mmusr;
|
|
+ unsigned format : 4; /* frame format specifier */
|
|
+ unsigned fs2 : 2;
|
|
+ unsigned vector: 8;
|
|
+ unsigned fs1 : 2;
|
|
+ unsigned short sr;
|
|
+ unsigned long pc;
|
|
#else
|
|
unsigned short sr;
|
|
unsigned long pc;
|
|
@@ -71,6 +82,8 @@ struct switch_stack {
|
|
#define PTRACE_GETFPREGS 14
|
|
#define PTRACE_SETFPREGS 15
|
|
|
|
+#define PTRACE_GET_THREAD_AREA 25
|
|
+
|
|
#ifdef __KERNEL__
|
|
|
|
#ifndef PS_S
|
|
--- a/arch/m68k/include/asm/raw_io.h
|
|
+++ b/arch/m68k/include/asm/raw_io.h
|
|
@@ -8,6 +8,10 @@
|
|
#ifndef _RAW_IO_H
|
|
#define _RAW_IO_H
|
|
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+#include <asm/cf_raw_io.h>
|
|
+#else
|
|
+
|
|
#ifdef __KERNEL__
|
|
|
|
#include <asm/types.h>
|
|
@@ -60,6 +64,9 @@ extern void __iounmap(void *addr, unsign
|
|
#define __raw_writew(val,addr) out_be16((addr),(val))
|
|
#define __raw_writel(val,addr) out_be32((addr),(val))
|
|
|
|
+#define swap_inw(port) in_le16((port))
|
|
+#define swap_outw(val,port) out_le16((port),(val))
|
|
+
|
|
static inline void raw_insb(volatile u8 __iomem *port, u8 *buf, unsigned int len)
|
|
{
|
|
unsigned int i;
|
|
@@ -344,4 +351,6 @@ static inline void raw_outsw_swapw(volat
|
|
|
|
#endif /* __KERNEL__ */
|
|
|
|
+#endif /* CONFIG_COLDFIRE */
|
|
+
|
|
#endif /* _RAW_IO_H */
|
|
--- a/arch/m68k/include/asm/segment.h
|
|
+++ b/arch/m68k/include/asm/segment.h
|
|
@@ -29,6 +29,7 @@ typedef struct {
|
|
* Get/set the SFC/DFC registers for MOVES instructions
|
|
*/
|
|
|
|
+#ifndef CONFIG_COLDFIRE
|
|
static inline mm_segment_t get_fs(void)
|
|
{
|
|
#ifdef CONFIG_MMU
|
|
@@ -56,6 +57,15 @@ static inline void set_fs(mm_segment_t v
|
|
#endif
|
|
}
|
|
|
|
+#else /* CONFIG_COLDFIRE */
|
|
+
|
|
+#include <asm/current.h>
|
|
+#define get_fs() (current->thread.fs)
|
|
+#define set_fs(val) (current->thread.fs = (val))
|
|
+#define get_ds() (KERNEL_DS)
|
|
+
|
|
+#endif /* CONFIG_COLDFIRE */
|
|
+
|
|
#define segment_eq(a,b) ((a).seg == (b).seg)
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
--- a/arch/m68k/include/asm/setup.h
|
|
+++ b/arch/m68k/include/asm/setup.h
|
|
@@ -2,6 +2,7 @@
|
|
** asm/setup.h -- Definition of the Linux/m68k setup information
|
|
**
|
|
** Copyright 1992 by Greg Harp
|
|
+ * Copyright 2007-2009 Freescale Semiconductor, Inc. All Rights Reserved.
|
|
**
|
|
** This file is subject to the terms and conditions of the GNU General Public
|
|
** License. See the file COPYING in the main directory of this archive
|
|
@@ -40,6 +41,7 @@
|
|
#define MACH_HP300 9
|
|
#define MACH_Q40 10
|
|
#define MACH_SUN3X 11
|
|
+#define MACH_CFMMU 12
|
|
|
|
#define COMMAND_LINE_SIZE 256
|
|
|
|
@@ -189,6 +191,14 @@ extern unsigned long m68k_machtype;
|
|
# define MACH_TYPE (MACH_SUN3X)
|
|
#endif
|
|
|
|
+#if !defined(CONFIG_COLDFIRE)
|
|
+# define MACH_IS_COLDFIRE (0)
|
|
+#else
|
|
+# define CONFIG_COLDFIRE_ONLY
|
|
+# define MACH_IS_COLDFIRE (1)
|
|
+# define MACH_TYPE (MACH_CFMMU)
|
|
+#endif
|
|
+
|
|
#ifndef MACH_TYPE
|
|
# define MACH_TYPE (m68k_machtype)
|
|
#endif
|
|
@@ -211,23 +221,31 @@ extern unsigned long m68k_machtype;
|
|
#define CPUB_68030 1
|
|
#define CPUB_68040 2
|
|
#define CPUB_68060 3
|
|
+#define CPUB_CFV4E 4
|
|
|
|
#define CPU_68020 (1<<CPUB_68020)
|
|
#define CPU_68030 (1<<CPUB_68030)
|
|
#define CPU_68040 (1<<CPUB_68040)
|
|
#define CPU_68060 (1<<CPUB_68060)
|
|
+#define CPU_CFV4E (1<<CPUB_CFV4E)
|
|
|
|
#define FPUB_68881 0
|
|
#define FPUB_68882 1
|
|
#define FPUB_68040 2 /* Internal FPU */
|
|
#define FPUB_68060 3 /* Internal FPU */
|
|
#define FPUB_SUNFPA 4 /* Sun-3 FPA */
|
|
+#define FPUB_CFV4E 5
|
|
|
|
#define FPU_68881 (1<<FPUB_68881)
|
|
#define FPU_68882 (1<<FPUB_68882)
|
|
#define FPU_68040 (1<<FPUB_68040)
|
|
#define FPU_68060 (1<<FPUB_68060)
|
|
#define FPU_SUNFPA (1<<FPUB_SUNFPA)
|
|
+#ifdef CONFIG_M547X_8X
|
|
+#define FPU_CFV4E (1<<FPUB_CFV4E)
|
|
+#else
|
|
+#define FPU_CFV4E 0
|
|
+#endif
|
|
|
|
#define MMUB_68851 0
|
|
#define MMUB_68030 1 /* Internal MMU */
|
|
@@ -235,6 +253,7 @@ extern unsigned long m68k_machtype;
|
|
#define MMUB_68060 3 /* Internal MMU */
|
|
#define MMUB_APOLLO 4 /* Custom Apollo */
|
|
#define MMUB_SUN3 5 /* Custom Sun-3 */
|
|
+#define MMUB_CFV4E 6
|
|
|
|
#define MMU_68851 (1<<MMUB_68851)
|
|
#define MMU_68030 (1<<MMUB_68030)
|
|
@@ -242,6 +261,7 @@ extern unsigned long m68k_machtype;
|
|
#define MMU_68060 (1<<MMUB_68060)
|
|
#define MMU_SUN3 (1<<MMUB_SUN3)
|
|
#define MMU_APOLLO (1<<MMUB_APOLLO)
|
|
+#define MMU_CFV4E (1<<MMUB_CFV4E)
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
@@ -341,6 +361,14 @@ extern int m68k_is040or060;
|
|
# endif
|
|
#endif
|
|
|
|
+#if !defined(CONFIG_CFV4E)
|
|
+# define CPU_IS_COLDFIRE (0)
|
|
+#else
|
|
+# define CPU_IS_COLDFIRE (m68k_cputype & CPU_CFV4E)
|
|
+# define CPU_IS_CFV4E (m68k_cputype & CPU_CFV4E)
|
|
+# define MMU_IS_CFV4E (m68k_mmutype & MMU_CFV4E)
|
|
+#endif
|
|
+
|
|
#define CPU_TYPE (m68k_cputype)
|
|
|
|
#ifdef CONFIG_M68KFPU_EMU
|
|
@@ -371,6 +399,14 @@ extern int m68k_realnum_memory; /* real
|
|
extern struct mem_info m68k_memory[NUM_MEMINFO];/* memory description */
|
|
#endif
|
|
|
|
+#ifdef CONFIG_CFV4E
|
|
+#define QCHIP_RESTORE_DIRECTIVE ".chip 547x"
|
|
+#define CHIP_RESTORE_DIRECTIVE .chip 547x
|
|
+#else
|
|
+#define QCHIP_RESTORE_DIRECTIVE ".chip 68k"
|
|
+#define CHIP_RESTORE_DIRECTIVE .chip 68k
|
|
+#endif
|
|
+
|
|
#endif /* __KERNEL__ */
|
|
|
|
#endif /* _M68K_SETUP_H */
|
|
--- a/arch/m68k/include/asm/sigcontext.h
|
|
+++ b/arch/m68k/include/asm/sigcontext.h
|
|
@@ -15,9 +15,15 @@ struct sigcontext {
|
|
unsigned long sc_pc;
|
|
unsigned short sc_formatvec;
|
|
#ifndef __uClinux__
|
|
+# ifdef __mcoldfire__
|
|
+ unsigned long sc_fpregs[2][2]; /* room for two fp registers */
|
|
+ unsigned long sc_fpcntl[3];
|
|
+ unsigned char sc_fpstate[16+6*8];
|
|
+# else
|
|
unsigned long sc_fpregs[2*3]; /* room for two fp registers */
|
|
unsigned long sc_fpcntl[3];
|
|
unsigned char sc_fpstate[216];
|
|
+# endif
|
|
#endif
|
|
};
|
|
|
|
--- a/arch/m68k/include/asm/siginfo.h
|
|
+++ b/arch/m68k/include/asm/siginfo.h
|
|
@@ -29,7 +29,8 @@ typedef struct siginfo {
|
|
struct {
|
|
timer_t _tid; /* timer id */
|
|
int _overrun; /* overrun count */
|
|
- char _pad[sizeof( __ARCH_SI_UID_T) - sizeof(int)];
|
|
+ char _pad[sizeof( __ARCH_SI_UID_T) - sizeof(int)
|
|
+ + sizeof(__kernel_uid_t)];
|
|
sigval_t _sigval; /* same as below */
|
|
int _sys_private; /* not to be passed to user */
|
|
} _timer;
|
|
@@ -38,18 +39,18 @@ typedef struct siginfo {
|
|
struct {
|
|
__kernel_pid_t _pid; /* sender's pid */
|
|
__kernel_uid_t _uid; /* backwards compatibility */
|
|
- sigval_t _sigval;
|
|
__kernel_uid32_t _uid32; /* sender's uid */
|
|
+ sigval_t _sigval;
|
|
} _rt;
|
|
|
|
/* SIGCHLD */
|
|
struct {
|
|
__kernel_pid_t _pid; /* which child */
|
|
__kernel_uid_t _uid; /* backwards compatibility */
|
|
- int _status; /* exit code */
|
|
+ __kernel_uid32_t _uid32; /* sender's uid */
|
|
clock_t _utime;
|
|
clock_t _stime;
|
|
- __kernel_uid32_t _uid32; /* sender's uid */
|
|
+ int _status; /* exit code */
|
|
} _sigchld;
|
|
|
|
/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
|
|
--- a/arch/m68k/include/asm/signal.h
|
|
+++ b/arch/m68k/include/asm/signal.h
|
|
@@ -150,7 +150,8 @@ typedef struct sigaltstack {
|
|
#ifdef __KERNEL__
|
|
#include <asm/sigcontext.h>
|
|
|
|
-#ifndef __uClinux__
|
|
+//#ifndef __uClinux__
|
|
+#ifndef CONFIG_COLDFIRE /*FIXME Jason*/
|
|
#define __HAVE_ARCH_SIG_BITOPS
|
|
|
|
static inline void sigaddset(sigset_t *set, int _sig)
|
|
@@ -201,7 +202,6 @@ static inline int sigfindinword(unsigned
|
|
|
|
struct pt_regs;
|
|
extern void ptrace_signal_deliver(struct pt_regs *regs, void *cookie);
|
|
-
|
|
#else
|
|
|
|
#undef __HAVE_ARCH_SIG_BITOPS
|
|
--- a/arch/m68k/include/asm/string_mm.h
|
|
+++ b/arch/m68k/include/asm/string_mm.h
|
|
@@ -93,6 +93,7 @@ static inline char *strchr(const char *s
|
|
return (char *)s - 1;
|
|
}
|
|
|
|
+#ifndef CONFIG_COLDFIRE
|
|
#define __HAVE_ARCH_STRCMP
|
|
static inline int strcmp(const char *cs, const char *ct)
|
|
{
|
|
@@ -110,6 +111,7 @@ static inline int strcmp(const char *cs,
|
|
: "+a" (cs), "+a" (ct), "=d" (res));
|
|
return res;
|
|
}
|
|
+#endif
|
|
|
|
#define __HAVE_ARCH_MEMSET
|
|
extern void *memset(void *, int, __kernel_size_t);
|
|
--- a/arch/m68k/include/asm/swab.h
|
|
+++ b/arch/m68k/include/asm/swab.h
|
|
@@ -4,7 +4,7 @@
|
|
#include <linux/types.h>
|
|
#include <linux/compiler.h>
|
|
|
|
-#define __SWAB_64_THRU_32__
|
|
+/*#define __SWAB_64_THRU_32__
|
|
|
|
#if defined (__mcfisaaplus__) || defined (__mcfisac__)
|
|
static inline __attribute_const__ __u32 __arch_swab32(__u32 val)
|
|
@@ -23,5 +23,29 @@ static inline __attribute_const__ __u32
|
|
}
|
|
#define __arch_swab32 __arch_swab32
|
|
#endif
|
|
+*/
|
|
+#if defined(__GNUC__)
|
|
+#if defined(__mcfisaaplus__) || defined(__mcfisac__)
|
|
+static inline __attribute_const__ __u32 ___arch__swab32(__u32 val)
|
|
+{
|
|
+ __asm__ ("byterev %0" : "=d" (val) : "0" (val));
|
|
+ return val;
|
|
+}
|
|
+#define __arch__swab32(x) ___arch__swab32(x)
|
|
+#elif !defined(__mcoldfire__)
|
|
+static inline __attribute_const__ __u32 ___arch__swab32(__u32 val)
|
|
+{
|
|
+ __asm__("rolw #8,%0; swap %0; rolw #8,%0" : "=d" (val) : "0" (val));
|
|
+ return val;
|
|
+}
|
|
+#define __arch__swab32(x) ___arch__swab32(x)
|
|
+
|
|
+#endif
|
|
+#endif
|
|
+
|
|
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__)
|
|
+# define __BYTEORDER_HAS_U64__
|
|
+# define __SWAB_64_THRU_32__
|
|
+#endif
|
|
|
|
#endif /* _M68K_SWAB_H */
|
|
--- a/arch/m68k/include/asm/system_mm.h
|
|
+++ b/arch/m68k/include/asm/system_mm.h
|
|
@@ -5,9 +5,24 @@
|
|
#include <linux/kernel.h>
|
|
#include <asm/segment.h>
|
|
#include <asm/entry.h>
|
|
+#include <asm/cfcache.h>
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+#define FLUSH_BC (0x00040000)
|
|
+
|
|
+#define finish_arch_switch(prev) do { \
|
|
+ unsigned long tmpreg; \
|
|
+ asm volatile ( "move.l %2,%0\n" \
|
|
+ "orl %1,%0\n" \
|
|
+ "movec %0,%%cacr" \
|
|
+ : "=&d" (tmpreg) \
|
|
+ : "id" (FLUSH_BC), "m" (shadow_cacr)); \
|
|
+ } while(0)
|
|
+
|
|
+#endif
|
|
+
|
|
/*
|
|
* switch_to(n) should switch tasks to task ptr, first checking that
|
|
* ptr isn't the current task, in which case it does nothing. This
|
|
@@ -63,16 +78,25 @@ asmlinkage void resume(void);
|
|
#define smp_read_barrier_depends() ((void)0)
|
|
|
|
/* interrupt control.. */
|
|
-#if 0
|
|
-#define local_irq_enable() asm volatile ("andiw %0,%%sr": : "i" (ALLOWINT) : "memory")
|
|
-#else
|
|
#include <linux/hardirq.h>
|
|
+#ifndef CONFIG_COLDFIRE
|
|
#define local_irq_enable() ({ \
|
|
if (MACH_IS_Q40 || !hardirq_count()) \
|
|
asm volatile ("andiw %0,%%sr": : "i" (ALLOWINT) : "memory"); \
|
|
})
|
|
-#endif
|
|
#define local_irq_disable() asm volatile ("oriw #0x0700,%%sr": : : "memory")
|
|
+#else /* CONFIG_COLDFIRE */
|
|
+#define local_irq_enable() \
|
|
+ asm volatile ("move.w %%sr, %%d0\n\t" \
|
|
+ "andil #0xf8ff,%%d0\n\t" \
|
|
+ "move.w %%d0, %%sr\n" \
|
|
+ : : : "cc", "d0", "memory")
|
|
+#define local_irq_disable() \
|
|
+ asm volatile ("move %/sr,%%d0\n\t" \
|
|
+ "ori.l #0x0700,%%d0\n\t" \
|
|
+ "move %%d0,%/sr\n" \
|
|
+ : : : "cc", "%d0", "memory")
|
|
+#endif
|
|
#define local_save_flags(x) asm volatile ("movew %%sr,%0":"=d" (x) : : "memory")
|
|
#define local_irq_restore(x) asm volatile ("movew %0,%%sr": :"d" (x) : "memory")
|
|
|
|
--- a/arch/m68k/include/asm/thread_info_mm.h
|
|
+++ b/arch/m68k/include/asm/thread_info_mm.h
|
|
@@ -10,6 +10,7 @@ struct thread_info {
|
|
struct exec_domain *exec_domain; /* execution domain */
|
|
int preempt_count; /* 0 => preemptable, <0 => BUG */
|
|
__u32 cpu; /* should always be 0 on m68k */
|
|
+ unsigned long tp_value;
|
|
struct restart_block restart_block;
|
|
};
|
|
|
|
--- a/arch/m68k/include/asm/tlbflush.h
|
|
+++ b/arch/m68k/include/asm/tlbflush.h
|
|
@@ -2,7 +2,7 @@
|
|
#define _M68K_TLBFLUSH_H
|
|
|
|
#ifdef CONFIG_MMU
|
|
-#ifndef CONFIG_SUN3
|
|
+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
|
|
|
|
#include <asm/current.h>
|
|
|
|
@@ -92,7 +92,12 @@ static inline void flush_tlb_kernel_rang
|
|
flush_tlb_all();
|
|
}
|
|
|
|
-#else
|
|
+static inline void flush_tlb_pgtables(struct mm_struct *mm,
|
|
+ unsigned long start, unsigned long end)
|
|
+{
|
|
+}
|
|
+
|
|
+#elif defined(CONFIG_SUN3)
|
|
|
|
|
|
/* Reserved PMEGs. */
|
|
@@ -214,6 +219,15 @@ static inline void flush_tlb_kernel_page
|
|
sun3_put_segmap (addr & ~(SUN3_PMEG_SIZE - 1), SUN3_INVALID_PMEG);
|
|
}
|
|
|
|
+static inline void flush_tlb_pgtables(struct mm_struct *mm,
|
|
+ unsigned long start, unsigned long end)
|
|
+{
|
|
+}
|
|
+
|
|
+#else /* CONFIG_COLDFIRE */
|
|
+
|
|
+#include <asm/cf_tlbflush.h>
|
|
+
|
|
#endif
|
|
|
|
#else /* !CONFIG_MMU */
|
|
--- a/arch/m68k/include/asm/uaccess_mm.h
|
|
+++ b/arch/m68k/include/asm/uaccess_mm.h
|
|
@@ -1,6 +1,9 @@
|
|
#ifndef __M68K_UACCESS_H
|
|
#define __M68K_UACCESS_H
|
|
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+#include <asm/cf_uaccess.h>
|
|
+#else
|
|
/*
|
|
* User space memory access functions
|
|
*/
|
|
@@ -371,4 +374,5 @@ unsigned long __clear_user(void __user *
|
|
|
|
#define strlen_user(str) strnlen_user(str, 32767)
|
|
|
|
+#endif /* CONFIG_COLDFIRE */
|
|
#endif /* _M68K_UACCESS_H */
|
|
--- a/arch/m68k/include/asm/ucontext.h
|
|
+++ b/arch/m68k/include/asm/ucontext.h
|
|
@@ -7,7 +7,11 @@ typedef greg_t gregset_t[NGREG];
|
|
|
|
typedef struct fpregset {
|
|
int f_fpcntl[3];
|
|
+#ifdef __mcoldfire__
|
|
+ int f_fpregs[8][2];
|
|
+#else
|
|
int f_fpregs[8*3];
|
|
+#endif
|
|
} fpregset_t;
|
|
|
|
struct mcontext {
|
|
--- a/arch/m68k/include/asm/unistd.h
|
|
+++ b/arch/m68k/include/asm/unistd.h
|
|
@@ -336,10 +336,14 @@
|
|
#define __NR_pwritev 330
|
|
#define __NR_rt_tgsigqueueinfo 331
|
|
#define __NR_perf_counter_open 332
|
|
+#define __NR_read_tp 333
|
|
+#define __NR_write_tp 334
|
|
+#define __NR_atomic_cmpxchg_32 335
|
|
+#define __NR_atomic_barrier 336
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
-#define NR_syscalls 333
|
|
+#define NR_syscalls 337
|
|
|
|
#define __ARCH_WANT_IPC_PARSE_VERSION
|
|
#define __ARCH_WANT_OLD_READDIR
|
|
--- a/arch/m68k/include/asm/virtconvert.h
|
|
+++ b/arch/m68k/include/asm/virtconvert.h
|
|
@@ -1,6 +1,10 @@
|
|
#ifndef __VIRT_CONVERT__
|
|
#define __VIRT_CONVERT__
|
|
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+#include <asm/cf_virtconvert.h>
|
|
+#else
|
|
+
|
|
/*
|
|
* Macros used for converting between virtual and physical mappings.
|
|
*/
|
|
@@ -46,3 +50,4 @@ static inline void *phys_to_virt(unsigne
|
|
|
|
#endif
|
|
#endif
|
|
+#endif
|
|
--- a/arch/m68k/Kconfig
|
|
+++ b/arch/m68k/Kconfig
|
|
@@ -12,6 +12,14 @@ config MMU
|
|
bool
|
|
default y
|
|
|
|
+config GENERIC_TIME
|
|
+ bool "Enable generic timer"
|
|
+ default n
|
|
+
|
|
+config GENERIC_CLOCKEVENTS
|
|
+ bool "Enable generic clockevents"
|
|
+ default n
|
|
+
|
|
config RWSEM_GENERIC_SPINLOCK
|
|
bool
|
|
default y
|
|
@@ -37,7 +45,7 @@ config GENERIC_CALIBRATE_DELAY
|
|
|
|
config TIME_LOW_RES
|
|
bool
|
|
- default y
|
|
+ default n
|
|
|
|
config GENERIC_IOMAP
|
|
bool
|
|
@@ -49,7 +57,7 @@ config ARCH_MAY_HAVE_PC_FDC
|
|
default y
|
|
|
|
config NO_IOPORT
|
|
- def_bool y
|
|
+ def_bool !(M5445X || M547X_8X)
|
|
|
|
config NO_DMA
|
|
def_bool SUN3
|
|
@@ -107,6 +115,35 @@ config PCMCIA
|
|
To compile this driver as modules, choose M here: the
|
|
modules will be called pcmcia_core and ds.
|
|
|
|
+config COLDFIRE
|
|
+ bool "ColdFire V4e support"
|
|
+ default y
|
|
+ select CFV4E
|
|
+ help
|
|
+ Say Y if you want to build a kernel to run on one of the ColdFire
|
|
+ V4e boards.
|
|
+
|
|
+config CFV4E
|
|
+ bool
|
|
+ depends on COLDFIRE
|
|
+ select MMU_CFV4E if MMU
|
|
+ default y
|
|
+
|
|
+config FPU
|
|
+ bool "ColdFire V4e FPU support"
|
|
+ default n
|
|
+ help
|
|
+ This enables support for CFV4E FPU feature.
|
|
+
|
|
+config MCD_DMA
|
|
+ bool "ColdFire MCD DMA support"
|
|
+ depends on M547X_8X
|
|
+ default y
|
|
+ help
|
|
+ This enables support for the ColdFire 547x/548x family
|
|
+ multichannel DMA support. Many drivers need it.
|
|
+ If you want it, say Y
|
|
+
|
|
config AMIGA
|
|
bool "Amiga support"
|
|
select MMU_MOTOROLA if MMU
|
|
@@ -124,6 +161,16 @@ config ATARI
|
|
this kernel on an Atari, say Y here and browse the material
|
|
available in <file:Documentation/m68k>; otherwise say N.
|
|
|
|
+config PCI
|
|
+ bool "PCI bus support"
|
|
+ depends on M54455 || M547X_8X
|
|
+ default n
|
|
+ help
|
|
+ Find out whether you have a PCI motherboard. PCI is the name of a
|
|
+ bus system, i.e. the way the CPU talks to the other stuff inside
|
|
+ your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or
|
|
+ VESA. If you have PCI, say Y, otherwise N.
|
|
+
|
|
config MAC
|
|
bool "Macintosh support"
|
|
select MMU_MOTOROLA if MMU
|
|
@@ -278,6 +325,118 @@ config M68060
|
|
If you anticipate running this kernel on a computer with a MC68060
|
|
processor, say Y. Otherwise, say N.
|
|
|
|
+config M5445X
|
|
+ bool "MCF5445x support"
|
|
+ depends on COLDFIRE
|
|
+ select GENERIC_TIME
|
|
+ select USB_EHCI_FSL
|
|
+ select HAVE_FSL_USB_DR
|
|
+ help
|
|
+ This option will add support for the MCF544x processor with mmu.
|
|
+
|
|
+config M54451
|
|
+ bool
|
|
+ depends on M5445X
|
|
+ default n
|
|
+
|
|
+config M54455
|
|
+ bool
|
|
+ depends on M5445X
|
|
+ default n
|
|
+
|
|
+choice
|
|
+ prompt "Model"
|
|
+ depends on M5445X
|
|
+ default M54451EVB
|
|
+ config M54451EVB
|
|
+ bool "M54451EVB"
|
|
+ select M54451
|
|
+ config M54455EVB
|
|
+ bool "M54455EVB"
|
|
+ select M54455
|
|
+endchoice
|
|
+
|
|
+config HAVE_FSL_USB_DR
|
|
+ bool
|
|
+ default n
|
|
+
|
|
+config M547X_8X
|
|
+ bool "MCF547x/MCF548x support"
|
|
+ depends on COLDFIRE
|
|
+ help
|
|
+ This option will add support for the MCF547x/MCF548x processor with mmu.
|
|
+
|
|
+config M547X
|
|
+ bool
|
|
+ depends on M547X_8X
|
|
+ default n
|
|
+
|
|
+config M548X
|
|
+ bool
|
|
+ depends on M547X_8X
|
|
+ default n
|
|
+
|
|
+choice
|
|
+ prompt "Model"
|
|
+ depends on M547X_8X
|
|
+ default M5485CFE
|
|
+
|
|
+config M5475AFE
|
|
+ bool "MCF5475AFE"
|
|
+ select M547X
|
|
+config M5475BFE
|
|
+ bool "MCF5475BFE"
|
|
+ select M547X
|
|
+config M5475CFE
|
|
+ bool "MCF5475CFE"
|
|
+ select M547X
|
|
+config M5475DFE
|
|
+ bool "MCF5475DFE"
|
|
+ select M547X
|
|
+config M5475EFE
|
|
+ bool "MCF5475EFE"
|
|
+ select M547X
|
|
+config M5475FFE
|
|
+ bool "MCF5475FFE"
|
|
+ select M547X
|
|
+config M5485AFE
|
|
+ bool "MCF5485AFE"
|
|
+ select M548X
|
|
+config M5485BFE
|
|
+ bool "MCF5485BFE"
|
|
+ select M548X
|
|
+config M5485CFE
|
|
+ bool "MCF5485CFE"
|
|
+ select M548X
|
|
+config M5485DFE
|
|
+ bool "MCF5485DFE"
|
|
+ select M548X
|
|
+config M5485EFE
|
|
+ bool "MCF5485EFE"
|
|
+ select M548X
|
|
+config M5485FFE
|
|
+ bool "MCF5485FFE"
|
|
+ select M548X
|
|
+
|
|
+endchoice
|
|
+
|
|
+
|
|
+config MCFCLK
|
|
+ int
|
|
+ default 240000000 if M54451EVB
|
|
+ default 266666666 if M54455EVB
|
|
+ default 266000000 if M547X
|
|
+ default 200000000 if M548X
|
|
+ help
|
|
+ Coldfire System clock.
|
|
+
|
|
+config MCF_USER_HALT
|
|
+ bool "Coldfire User Halt Enable"
|
|
+ depends on M5445X || M547X_8X
|
|
+ default n
|
|
+ help
|
|
+ Enables the HALT instruction in User Mode.
|
|
+
|
|
config MMU_MOTOROLA
|
|
bool
|
|
|
|
@@ -285,6 +444,70 @@ config MMU_SUN3
|
|
bool
|
|
depends on MMU && !MMU_MOTOROLA
|
|
|
|
+config MMU_CFV4E
|
|
+ bool
|
|
+
|
|
+config SDRAM_BASE
|
|
+ hex
|
|
+ depends on COLDFIRE
|
|
+ default 0x40000000 if M5445X
|
|
+ default 0x00000000 if M547X_8X
|
|
+
|
|
+config SDRAM_SIZE
|
|
+ hex
|
|
+ depends on COLDFIRE
|
|
+ default 0x08000000 if M54451EVB
|
|
+ default 0x10000000 if M54455EVB
|
|
+ default 0x04000000 if M547X_8X
|
|
+
|
|
+config NOR_FLASH_BASE
|
|
+ hex "NOR Flash Base Address"
|
|
+ depends on COLDFIRE
|
|
+ default 0x00000000 if M54451EVB
|
|
+ default 0x00000000 if M54455EVB
|
|
+ default 0xE0000000 if M547X_8X
|
|
+
|
|
+config DMA_BASE
|
|
+ hex
|
|
+ depends on COLDFIRE
|
|
+ default 0xef000000
|
|
+
|
|
+config DMA_SIZE
|
|
+ hex
|
|
+ depends on COLDFIRE
|
|
+ default 0x1000000 if M5445X
|
|
+ default 0x800000 if M547X_8X
|
|
+
|
|
+config SRAM
|
|
+ bool "SRAM allocation APIs support on mcfv4 platform"
|
|
+ depends on COLDFIRE && M5445X
|
|
+ default y
|
|
+ select GENERIC_ALLOCATOR
|
|
+
|
|
+config SRAM_BASE
|
|
+ hex
|
|
+ depends on COLDFIRE && SRAM
|
|
+ default 0x8ff00000 if M5445X
|
|
+
|
|
+config SRAM_SIZE
|
|
+ hex
|
|
+ depends on COLDFIRE && SRAM
|
|
+ default 0x8000 if M5445X
|
|
+
|
|
+config SRAM_ALLOC_GRANULARITY
|
|
+ hex
|
|
+ depends on SRAM
|
|
+ default 0x200 if M5445X
|
|
+
|
|
+config VDSO
|
|
+ bool "Support VDSO page"
|
|
+ depends on MMU
|
|
+ default n
|
|
+ help
|
|
+ This will enable support for the kernel mapping a vDSO page
|
|
+ in process space, and subsequently handing down the entry point
|
|
+ to the libc through the ELF auxiliary vector.
|
|
+
|
|
config M68KFPU_EMU
|
|
bool "Math emulation support (EXPERIMENTAL)"
|
|
depends on EXPERIMENTAL
|
|
@@ -451,6 +674,14 @@ config ZONE_DMA
|
|
source "drivers/pci/Kconfig"
|
|
|
|
source "drivers/zorro/Kconfig"
|
|
+endmenu
|
|
+
|
|
+menu "Power management options"
|
|
+
|
|
+config PM
|
|
+ bool "Power Management support"
|
|
+ help
|
|
+ Support processor power management modes
|
|
|
|
endmenu
|
|
|
|
@@ -589,7 +820,7 @@ config DN_SERIAL
|
|
|
|
config SERIAL_CONSOLE
|
|
bool "Support for serial port console"
|
|
- depends on (AMIGA || ATARI || MAC || SUN3 || SUN3X || VME || APOLLO) && (ATARI_MFPSER=y || ATARI_MIDI=y || MAC_SCC=y || AMIGA_BUILTIN_SERIAL=y || GVPIOEXT=y || MULTIFACE_III_TTY=y || SERIAL=y || MVME147_SCC || SERIAL167 || MVME162_SCC || BVME6000_SCC || DN_SERIAL)
|
|
+ depends on (AMIGA || ATARI || MAC || SUN3 || SUN3X || VME || APOLLO || COLDFIRE) && (ATARI_MFPSER=y || ATARI_MIDI=y || MAC_SCC=y || AMIGA_BUILTIN_SERIAL=y || GVPIOEXT=y || MULTIFACE_III_TTY=y || SERIAL=y || MVME147_SCC || SERIAL167 || MVME162_SCC || BVME6000_SCC || DN_SERIAL || SERIAL_COLDFIRE)
|
|
---help---
|
|
If you say Y here, it will be possible to use a serial port as the
|
|
system console (the system console is the device which receives all
|
|
@@ -612,6 +843,8 @@ config SERIAL_CONSOLE
|
|
|
|
endmenu
|
|
|
|
+source "kernel/time/Kconfig"
|
|
+
|
|
source "fs/Kconfig"
|
|
|
|
source "arch/m68k/Kconfig.debug"
|
|
--- a/arch/m68k/kernel/asm-offsets.c
|
|
+++ b/arch/m68k/kernel/asm-offsets.c
|
|
@@ -2,6 +2,11 @@
|
|
* This program is used to generate definitions needed by
|
|
* assembly language modules.
|
|
*
|
|
+ * Copyright Freescale Semiconductor, Inc. 2008-2009
|
|
+ * Jason Jin Jason.Jin@freescale.com
|
|
+ * Shrek Wu B16972@freescale.com
|
|
+ * Add Codlfire support
|
|
+ *
|
|
* We use the technique used in the OSF Mach kernel code:
|
|
* generate asm statements containing #defines,
|
|
* compile this file to assembler, and then extract the
|
|
@@ -56,8 +61,15 @@ int main(void)
|
|
DEFINE(PT_A2, offsetof(struct pt_regs, a2));
|
|
DEFINE(PT_PC, offsetof(struct pt_regs, pc));
|
|
DEFINE(PT_SR, offsetof(struct pt_regs, sr));
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+ /* Need to get the context out of struct mm for ASID setting */
|
|
+ DEFINE(MM_CONTEXT, offsetof(struct mm_struct, context));
|
|
+ /* Coldfire exception frame has vector *before* pc */
|
|
+ DEFINE(PT_VECTOR, offsetof(struct pt_regs, pc) - 4);
|
|
+#else
|
|
/* bitfields are a bit difficult */
|
|
DEFINE(PT_VECTOR, offsetof(struct pt_regs, pc) + 4);
|
|
+#endif
|
|
|
|
/* offsets into the irq_handler struct */
|
|
DEFINE(IRQ_HANDLER, offsetof(struct irq_node, handler));
|
|
--- a/arch/m68k/kernel/dma.c
|
|
+++ b/arch/m68k/kernel/dma.c
|
|
@@ -1,4 +1,7 @@
|
|
/*
|
|
+ * Copyright Freescale Semiconductor, Inc. 2008, 2009
|
|
+ * Jason Jin Jason.Jin@freescale.com
|
|
+ * Shrek Wu B16972@freescale.com
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file COPYING in the main directory of this archive
|
|
* for more details.
|
|
@@ -11,12 +14,24 @@
|
|
#include <linux/kernel.h>
|
|
#include <linux/scatterlist.h>
|
|
#include <linux/vmalloc.h>
|
|
-
|
|
+#include <linux/pci.h>
|
|
#include <asm/pgalloc.h>
|
|
|
|
void *dma_alloc_coherent(struct device *dev, size_t size,
|
|
dma_addr_t *handle, gfp_t flag)
|
|
{
|
|
+#if defined(CONFIG_M5445X) | defined(CONFIG_M547X_8X)
|
|
+ /*
|
|
+ * On the M5445x platform the memory allocated with GFP_DMA
|
|
+ * is guaranteed to be DMA'able.
|
|
+ */
|
|
+ void *addr;
|
|
+
|
|
+ size = PAGE_ALIGN(size);
|
|
+ addr = kmalloc(size, GFP_DMA);
|
|
+ *handle = virt_to_phys(addr);
|
|
+ return addr;
|
|
+#else
|
|
struct page *page, **map;
|
|
pgprot_t pgprot;
|
|
void *addr;
|
|
@@ -55,6 +70,7 @@ void *dma_alloc_coherent(struct device *
|
|
kfree(map);
|
|
|
|
return addr;
|
|
+#endif
|
|
}
|
|
EXPORT_SYMBOL(dma_alloc_coherent);
|
|
|
|
@@ -62,7 +78,11 @@ void dma_free_coherent(struct device *de
|
|
void *addr, dma_addr_t handle)
|
|
{
|
|
pr_debug("dma_free_coherent: %p, %x\n", addr, handle);
|
|
+#if defined(CONFIG_M5445X) | defined(CONFIG_M547X_8X)
|
|
+ kfree(addr);
|
|
+#else
|
|
vfree(addr);
|
|
+#endif
|
|
}
|
|
EXPORT_SYMBOL(dma_free_coherent);
|
|
|
|
@@ -88,9 +108,16 @@ void dma_sync_sg_for_device(struct devic
|
|
enum dma_data_direction dir)
|
|
{
|
|
int i;
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+ struct scatterlist *_sg;
|
|
|
|
+ for_each_sg(sg, _sg, nents, i)
|
|
+ dma_sync_single_for_device(dev, _sg->dma_address,
|
|
+ _sg->length, dir);
|
|
+#else
|
|
for (i = 0; i < nents; sg++, i++)
|
|
dma_sync_single_for_device(dev, sg->dma_address, sg->length, dir);
|
|
+#endif
|
|
}
|
|
EXPORT_SYMBOL(dma_sync_sg_for_device);
|
|
|
|
@@ -119,10 +146,19 @@ int dma_map_sg(struct device *dev, struc
|
|
enum dma_data_direction dir)
|
|
{
|
|
int i;
|
|
-
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+ struct scatterlist *_sg;
|
|
+#endif
|
|
+#ifndef CONFIG_COLDFIRE
|
|
for (i = 0; i < nents; sg++, i++) {
|
|
sg->dma_address = sg_phys(sg);
|
|
dma_sync_single_for_device(dev, sg->dma_address, sg->length, dir);
|
|
+#else
|
|
+ for_each_sg(sg, _sg, nents, i) {
|
|
+ _sg->dma_address = sg_phys(_sg);
|
|
+ dma_sync_single_for_device(dev, _sg->dma_address,
|
|
+ _sg->length, dir);
|
|
+#endif
|
|
}
|
|
return nents;
|
|
}
|
|
--- a/arch/m68k/kernel/Makefile
|
|
+++ b/arch/m68k/kernel/Makefile
|
|
@@ -2,16 +2,26 @@
|
|
# Makefile for the linux kernel.
|
|
#
|
|
|
|
-ifndef CONFIG_SUN3
|
|
- extra-y := head.o
|
|
+ifdef CONFIG_SUN3
|
|
+ extra-y := sun3-head.o vmlinux.lds
|
|
+ obj-y := entry.o signal.o ints.o time.o
|
|
else
|
|
- extra-y := sun3-head.o
|
|
+ifndef CONFIG_COLDFIRE
|
|
+ extra-y := head.o vmlinux.lds
|
|
+ obj-y := entry.o signal.o traps.o ints.o time.o
|
|
+else # CONFIG_COLDFIRE
|
|
+ extra-y := vmlinux.lds
|
|
+ ifdef CONFIG_M547X_8X
|
|
+ obj-$(CONFIG_PCI) += bios32_mcf548x.o
|
|
+ endif
|
|
+endif
|
|
endif
|
|
-extra-y += vmlinux.lds
|
|
|
|
-obj-y := entry.o process.o traps.o ints.o signal.o ptrace.o module.o \
|
|
- sys_m68k.o time.o setup.o m68k_ksyms.o devres.o
|
|
+obj-y += process.o ptrace.o module.o \
|
|
+ sys_m68k.o setup.o m68k_ksyms.o devres.o# semaphore.o
|
|
|
|
devres-y = ../../../kernel/irq/devres.o
|
|
|
|
obj-y$(CONFIG_MMU_SUN3) += dma.o # no, it's not a typo
|
|
+
|
|
+EXTRA_AFLAGS := -traditional
|
|
--- a/arch/m68k/kernel/process.c
|
|
+++ b/arch/m68k/kernel/process.c
|
|
@@ -4,6 +4,11 @@
|
|
* Copyright (C) 1995 Hamish Macdonald
|
|
*
|
|
* 68060 fixes by Jesper Skov
|
|
+ *
|
|
+ * Copyright 2008-2009 Freescale Semiconductor, Inc. All Rights Reserved.
|
|
+ * Kurt.Mahan@freescale.com
|
|
+ * Jason Jin Jason.Jin@freescale.com
|
|
+ * Shrek Wu B16972@freescale.com
|
|
*/
|
|
|
|
/*
|
|
@@ -186,12 +191,21 @@ EXPORT_SYMBOL(kernel_thread);
|
|
void flush_thread(void)
|
|
{
|
|
unsigned long zero = 0;
|
|
+#if !defined(CONFIG_COLDFIRE)
|
|
set_fs(USER_DS);
|
|
current->thread.fs = __USER_DS;
|
|
if (!FPU_IS_EMU)
|
|
asm volatile (".chip 68k/68881\n\t"
|
|
"frestore %0@\n\t"
|
|
".chip 68k" : : "a" (&zero));
|
|
+#else
|
|
+ set_fs(USER_DS);
|
|
+ current->thread.fs = USER_DS;
|
|
+#if defined(CONFIG_FPU)
|
|
+ if (!FPU_IS_EMU)
|
|
+ asm volatile ("frestore %0@\n\t" : : "a" (&zero));
|
|
+#endif
|
|
+#endif
|
|
}
|
|
|
|
/*
|
|
@@ -251,10 +265,15 @@ int copy_thread(unsigned long clone_flag
|
|
|
|
p->thread.usp = usp;
|
|
p->thread.ksp = (unsigned long)childstack;
|
|
+
|
|
+ if (clone_flags & CLONE_SETTLS)
|
|
+ task_thread_info(p)->tp_value = regs->d5;
|
|
+
|
|
/*
|
|
* Must save the current SFC/DFC value, NOT the value when
|
|
* the parent was last descheduled - RGH 10-08-96
|
|
*/
|
|
+#if !defined(CONFIG_COLDFIRE)
|
|
p->thread.fs = get_fs().seg;
|
|
|
|
if (!FPU_IS_EMU) {
|
|
@@ -266,9 +285,34 @@ int copy_thread(unsigned long clone_flag
|
|
"fmoveml %/fpiar/%/fpcr/%/fpsr,%1"
|
|
: : "m" (p->thread.fp[0]), "m" (p->thread.fpcntl[0])
|
|
: "memory");
|
|
+#else
|
|
+ p->thread.fs = get_fs();
|
|
+
|
|
+#if defined(CONFIG_FPU)
|
|
+ if (!FPU_IS_EMU) {
|
|
+ /* Copy the current fpu state */
|
|
+ asm volatile ("fsave %0" : : "m" (p->thread.fpstate[0])
|
|
+ : "memory");
|
|
+
|
|
+ if (p->thread.fpstate[0]) {
|
|
+ asm volatile ("fmovemd %/fp0-%/fp7,%0"
|
|
+ : : "m" (p->thread.fp[0])
|
|
+ : "memory");
|
|
+ asm volatile ("fmovel %/fpiar,%0"
|
|
+ : : "m" (p->thread.fpcntl[0])
|
|
+ : "memory");
|
|
+ asm volatile ("fmovel %/fpcr,%0"
|
|
+ : : "m" (p->thread.fpcntl[1])
|
|
+ : "memory");
|
|
+ asm volatile ("fmovel %/fpsr,%0"
|
|
+ : : "m" (p->thread.fpcntl[2])
|
|
+ : "memory");
|
|
+ }
|
|
/* Restore the state in case the fpu was busy */
|
|
asm volatile ("frestore %0" : : "m" (p->thread.fpstate[0]));
|
|
}
|
|
+#endif
|
|
+#endif
|
|
|
|
return 0;
|
|
}
|
|
@@ -277,7 +321,9 @@ int copy_thread(unsigned long clone_flag
|
|
|
|
int dump_fpu (struct pt_regs *regs, struct user_m68kfp_struct *fpu)
|
|
{
|
|
+#if !defined(CONFIG_COLDFIRE) || defined(CONFIG_FPU)
|
|
char fpustate[216];
|
|
+#endif
|
|
|
|
if (FPU_IS_EMU) {
|
|
int i;
|
|
@@ -294,6 +340,7 @@ int dump_fpu (struct pt_regs *regs, stru
|
|
}
|
|
|
|
/* First dump the fpu context to avoid protocol violation. */
|
|
+#if !defined(CONFIG_COLDFIRE)
|
|
asm volatile ("fsave %0" :: "m" (fpustate[0]) : "memory");
|
|
if (!CPU_IS_060 ? !fpustate[0] : !fpustate[2])
|
|
return 0;
|
|
@@ -304,6 +351,25 @@ int dump_fpu (struct pt_regs *regs, stru
|
|
asm volatile ("fmovemx %/fp0-%/fp7,%0"
|
|
:: "m" (fpu->fpregs[0])
|
|
: "memory");
|
|
+#elif defined(CONFIG_FPU)
|
|
+ asm volatile ("fsave %0" :: "m" (fpustate[0]) : "memory");
|
|
+ if (!CPU_IS_060 ? !fpustate[0] : !fpustate[2])
|
|
+ return 0;
|
|
+
|
|
+ asm volatile ("fmovel %/fpiar,%0"
|
|
+ : : "m" (fpu->fpcntl[0])
|
|
+ : "memory");
|
|
+ asm volatile ("fmovel %/fpcr,%0"
|
|
+ : : "m" (fpu->fpcntl[1])
|
|
+ : "memory");
|
|
+ asm volatile ("fmovel %/fpsr,%0"
|
|
+ : : "m" (fpu->fpcntl[2])
|
|
+ : "memory");
|
|
+ asm volatile ("fmovemd %/fp0-%/fp7,%0"
|
|
+ : : "m" (fpu->fpregs[0])
|
|
+ : "memory");
|
|
+#endif
|
|
+
|
|
return 1;
|
|
}
|
|
EXPORT_SYMBOL(dump_fpu);
|
|
--- a/arch/m68k/kernel/ptrace.c
|
|
+++ b/arch/m68k/kernel/ptrace.c
|
|
@@ -265,6 +265,11 @@ long arch_ptrace(struct task_struct *chi
|
|
ret = -EFAULT;
|
|
break;
|
|
|
|
+ case PTRACE_GET_THREAD_AREA:
|
|
+ ret = put_user(task_thread_info(child)->tp_value,
|
|
+ (unsigned long __user *) data);
|
|
+ break;
|
|
+
|
|
default:
|
|
ret = ptrace_request(child, request, addr, data);
|
|
break;
|
|
--- a/arch/m68k/kernel/setup.c
|
|
+++ b/arch/m68k/kernel/setup.c
|
|
@@ -2,6 +2,9 @@
|
|
* linux/arch/m68k/kernel/setup.c
|
|
*
|
|
* Copyright (C) 1995 Hamish Macdonald
|
|
+ * Copyright Freescale Semiconductor, Inc. 2008, 2009
|
|
+ * Jason Jin Jason.Jin@freescale.com
|
|
+ * Shrek Wu B16972@freescale.com
|
|
*/
|
|
|
|
/*
|
|
@@ -75,13 +78,24 @@ EXPORT_SYMBOL(m68k_memory);
|
|
|
|
struct mem_info m68k_ramdisk;
|
|
|
|
+#if !defined(CONFIG_COLDFIRE)
|
|
static char m68k_command_line[CL_SIZE];
|
|
+#else
|
|
+char m68k_command_line[CL_SIZE];
|
|
+unsigned long uboot_info_stk;
|
|
+EXPORT_SYMBOL(uboot_info_stk);
|
|
+#endif
|
|
|
|
void (*mach_sched_init) (irq_handler_t handler) __initdata = NULL;
|
|
/* machine dependent irq functions */
|
|
void (*mach_init_IRQ) (void) __initdata = NULL;
|
|
void (*mach_get_model) (char *model);
|
|
void (*mach_get_hardware_list) (struct seq_file *m);
|
|
+
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+void (*mach_tick)(void);
|
|
+#endif
|
|
+
|
|
/* machine dependent timer functions */
|
|
unsigned long (*mach_gettimeoffset) (void);
|
|
int (*mach_hwclk) (int, struct rtc_time*);
|
|
@@ -137,13 +151,17 @@ extern void config_hp300(void);
|
|
extern void config_q40(void);
|
|
extern void config_sun3x(void);
|
|
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+void coldfire_sort_memrec(void);
|
|
+#endif
|
|
+
|
|
#define MASK_256K 0xfffc0000
|
|
|
|
extern void paging_init(void);
|
|
|
|
static void __init m68k_parse_bootinfo(const struct bi_record *record)
|
|
{
|
|
- while (record->tag != BI_LAST) {
|
|
+ while ((record->tag != BI_LAST)) {
|
|
int unknown = 0;
|
|
const unsigned long *data = record->data;
|
|
|
|
@@ -203,6 +221,10 @@ static void __init m68k_parse_bootinfo(c
|
|
record->size);
|
|
}
|
|
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+ coldfire_sort_memrec();
|
|
+#endif
|
|
+
|
|
m68k_realnum_memory = m68k_num_memory;
|
|
#ifdef CONFIG_SINGLE_MEMORY_CHUNK
|
|
if (m68k_num_memory > 1) {
|
|
@@ -215,8 +237,11 @@ static void __init m68k_parse_bootinfo(c
|
|
|
|
void __init setup_arch(char **cmdline_p)
|
|
{
|
|
- int i;
|
|
|
|
+#if !defined(CONFIG_SUN3)
|
|
+ int i;
|
|
+#endif
|
|
+
|
|
/* The bootinfo is located right after the kernel bss */
|
|
m68k_parse_bootinfo((const struct bi_record *)_end);
|
|
|
|
@@ -230,9 +255,10 @@ void __init setup_arch(char **cmdline_p)
|
|
* We should really do our own FPU check at startup.
|
|
* [what do we do with buggy 68LC040s? if we have problems
|
|
* with them, we should add a test to check_bugs() below] */
|
|
-#ifndef CONFIG_M68KFPU_EMU_ONLY
|
|
+#if !defined(CONFIG_M68KFPU_EMU_ONLY) && defined(CONFIG_FPU)
|
|
/* clear the fpu if we have one */
|
|
- if (m68k_fputype & (FPU_68881|FPU_68882|FPU_68040|FPU_68060)) {
|
|
+ if (m68k_fputype & (FPU_68881|FPU_68882|FPU_68040|FPU_68060|
|
|
+ FPU_CFV4E)) {
|
|
volatile int zero = 0;
|
|
asm volatile ("frestore %0" : : "m" (zero));
|
|
}
|
|
@@ -320,13 +346,18 @@ void __init setup_arch(char **cmdline_p)
|
|
config_sun3x();
|
|
break;
|
|
#endif
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+ case MACH_CFMMU:
|
|
+ config_coldfire();
|
|
+ break;
|
|
+#endif
|
|
default:
|
|
panic("No configuration setup");
|
|
}
|
|
|
|
paging_init();
|
|
|
|
-#ifndef CONFIG_SUN3
|
|
+#if !defined(CONFIG_SUN3)
|
|
for (i = 1; i < m68k_num_memory; i++)
|
|
free_bootmem_node(NODE_DATA(i), m68k_memory[i].addr,
|
|
m68k_memory[i].size);
|
|
@@ -353,6 +384,10 @@ void __init setup_arch(char **cmdline_p)
|
|
|
|
#endif /* !CONFIG_SUN3 */
|
|
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+ mmu_context_init();
|
|
+#endif
|
|
+
|
|
/* set ISA defs early as possible */
|
|
#if defined(CONFIG_ISA) && defined(MULTI_ISA)
|
|
if (MACH_IS_Q40) {
|
|
@@ -383,6 +418,7 @@ static int show_cpuinfo(struct seq_file
|
|
#define LOOP_CYCLES_68030 (8)
|
|
#define LOOP_CYCLES_68040 (3)
|
|
#define LOOP_CYCLES_68060 (1)
|
|
+#define LOOP_CYCLES_COLDFIRE (2)
|
|
|
|
if (CPU_IS_020) {
|
|
cpu = "68020";
|
|
@@ -396,6 +432,9 @@ static int show_cpuinfo(struct seq_file
|
|
} else if (CPU_IS_060) {
|
|
cpu = "68060";
|
|
clockfactor = LOOP_CYCLES_68060;
|
|
+ } else if (CPU_IS_CFV4E) {
|
|
+ cpu = "ColdFire V4e";
|
|
+ clockfactor = LOOP_CYCLES_COLDFIRE;
|
|
} else {
|
|
cpu = "680x0";
|
|
clockfactor = 0;
|
|
@@ -414,6 +453,8 @@ static int show_cpuinfo(struct seq_file
|
|
fpu = "68060";
|
|
else if (m68k_fputype & FPU_SUNFPA)
|
|
fpu = "Sun FPA";
|
|
+ else if (m68k_fputype & FPU_CFV4E)
|
|
+ fpu = "ColdFire V4e";
|
|
else
|
|
fpu = "none";
|
|
#endif
|
|
@@ -430,6 +471,8 @@ static int show_cpuinfo(struct seq_file
|
|
mmu = "Sun-3";
|
|
else if (m68k_mmutype & MMU_APOLLO)
|
|
mmu = "Apollo";
|
|
+ else if (m68k_mmutype & MMU_CFV4E)
|
|
+ mmu = "ColdFire";
|
|
else
|
|
mmu = "unknown";
|
|
|
|
@@ -512,7 +555,7 @@ module_init(proc_hardware_init);
|
|
|
|
void check_bugs(void)
|
|
{
|
|
-#ifndef CONFIG_M68KFPU_EMU
|
|
+#if !defined(CONFIG_M68KFPU_EMU) && !defined(CONFIG_M5445X)
|
|
if (m68k_fputype == 0) {
|
|
printk(KERN_EMERG "*** YOU DO NOT HAVE A FLOATING POINT UNIT, "
|
|
"WHICH IS REQUIRED BY LINUX/M68K ***\n");
|
|
--- a/arch/m68k/kernel/sys_m68k.c
|
|
+++ b/arch/m68k/kernel/sys_m68k.c
|
|
@@ -1,5 +1,8 @@
|
|
/*
|
|
* linux/arch/m68k/kernel/sys_m68k.c
|
|
+ * Copyright Freescale Semiconductor, Inc. 2008-2009
|
|
+ * Jason Jin Jason.Jin@freescale.com
|
|
+ * Shrek Wu B16972@freescale.com
|
|
*
|
|
* This file contains various random system calls that
|
|
* have a non-standard calling sequence on the Linux/m68k
|
|
@@ -29,6 +32,14 @@
|
|
#include <asm/traps.h>
|
|
#include <asm/page.h>
|
|
#include <asm/unistd.h>
|
|
+#include <linux/elf.h>
|
|
+#include <asm/tlb.h>
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+#include <asm/cacheflush.h>
|
|
+#endif
|
|
+
|
|
+asmlinkage int do_page_fault(struct pt_regs *regs, unsigned long address,
|
|
+ unsigned long error_code);
|
|
|
|
/* common code for old and new mmaps */
|
|
static inline long do_mmap2(
|
|
@@ -240,6 +251,7 @@ asmlinkage int sys_ipc (uint call, int f
|
|
return -EINVAL;
|
|
}
|
|
|
|
+#ifndef CONFIG_COLDFIRE
|
|
/* Convert virtual (user) address VADDR to physical address PADDR */
|
|
#define virt_to_phys_040(vaddr) \
|
|
({ \
|
|
@@ -563,6 +575,7 @@ cache_flush_060 (unsigned long addr, int
|
|
}
|
|
return 0;
|
|
}
|
|
+#endif /* CONFIG_COLDFIRE */
|
|
|
|
/* sys_cacheflush -- flush (part of) the processor cache. */
|
|
asmlinkage int
|
|
@@ -595,6 +608,7 @@ sys_cacheflush (unsigned long addr, int
|
|
goto out;
|
|
}
|
|
|
|
+#ifndef CONFIG_COLDFIRE
|
|
if (CPU_IS_020_OR_030) {
|
|
if (scope == FLUSH_SCOPE_LINE && len < 256) {
|
|
unsigned long cacr;
|
|
@@ -639,6 +653,16 @@ sys_cacheflush (unsigned long addr, int
|
|
ret = cache_flush_060 (addr, scope, cache, len);
|
|
}
|
|
}
|
|
+#else /* CONFIG_COLDFIRE */
|
|
+ if ((cache & FLUSH_CACHE_INSN) && (cache & FLUSH_CACHE_DATA))
|
|
+ flush_bcache();
|
|
+ else if (cache & FLUSH_CACHE_INSN)
|
|
+ flush_icache();
|
|
+ else
|
|
+ flush_dcache();
|
|
+
|
|
+ ret = 0;
|
|
+#endif /* CONFIG_COLDFIRE */
|
|
out:
|
|
unlock_kernel();
|
|
return ret;
|
|
@@ -663,3 +687,79 @@ int kernel_execve(const char *filename,
|
|
: "d" (__a), "d" (__b), "d" (__c));
|
|
return __res;
|
|
}
|
|
+
|
|
+asmlinkage unsigned long
|
|
+sys_read_tp(void)
|
|
+{
|
|
+ return current_thread_info()->tp_value;
|
|
+}
|
|
+
|
|
+asmlinkage int
|
|
+sys_write_tp(unsigned long tp)
|
|
+{
|
|
+ current_thread_info()->tp_value = tp;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/* This syscall gets its arguments in A0 (mem), D2 (oldval) and
|
|
+ D1 (newval). */
|
|
+asmlinkage int
|
|
+sys_atomic_cmpxchg_32(unsigned long newval, int oldval, int d3, int d4, int d5,
|
|
+ unsigned long __user *mem)
|
|
+{
|
|
+ /* This was borrowed from ARM's implementation. */
|
|
+ for (;;) {
|
|
+ struct mm_struct *mm = current->mm;
|
|
+ pgd_t *pgd; pmd_t *pmd; pte_t *pte;
|
|
+ spinlock_t *ptl;
|
|
+ unsigned long mem_value;
|
|
+
|
|
+ down_read(&mm->mmap_sem);
|
|
+ pgd = pgd_offset(mm, (unsigned long)mem);
|
|
+ if (!pgd_present(*pgd))
|
|
+ goto bad_access;
|
|
+ pmd = pmd_offset(pgd, (unsigned long)mem);
|
|
+ if (!pmd_present(*pmd))
|
|
+ goto bad_access;
|
|
+ pte = pte_offset_map_lock(mm, pmd, (unsigned long)mem, &ptl);
|
|
+ if (!pte_present(*pte) || !pte_dirty(*pte)) {
|
|
+ pte_unmap_unlock(pte, ptl);
|
|
+ goto bad_access;
|
|
+ }
|
|
+
|
|
+ mem_value = *mem;
|
|
+ if (mem_value == oldval)
|
|
+ *mem = newval;
|
|
+
|
|
+ pte_unmap_unlock(pte, ptl);
|
|
+ up_read(&mm->mmap_sem);
|
|
+ return mem_value;
|
|
+
|
|
+bad_access:
|
|
+ up_read(&mm->mmap_sem);
|
|
+ /* This is not necessarily a bad access, we can get here if
|
|
+ a memory we're trying to write to should be copied-on-write.
|
|
+ Make the kernel do the necessary page stuff, then re-iterate.
|
|
+ Simulate a write access fault to do that. */
|
|
+ {
|
|
+ /* The first argument of the function corresponds to
|
|
+ D1, which is the first field of struct pt_regs. */
|
|
+ struct pt_regs *fp = (struct pt_regs *)&newval;
|
|
+
|
|
+ /* '3' is an RMW flag. */
|
|
+ if (do_page_fault(fp, (unsigned long)mem, 3))
|
|
+ /* If the do_page_fault() failed, we don't
|
|
+ have anything meaningful to return.
|
|
+ There should be a SIGSEGV pending for
|
|
+ the process. */
|
|
+ return 0xdeadbeef;
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+asmlinkage int
|
|
+sys_atomic_barrier(void)
|
|
+{
|
|
+ /* no code needed for uniprocs */
|
|
+ return 0;
|
|
+}
|
|
--- a/arch/m68k/kernel/time.c
|
|
+++ b/arch/m68k/kernel/time.c
|
|
@@ -2,6 +2,9 @@
|
|
* linux/arch/m68k/kernel/time.c
|
|
*
|
|
* Copyright (C) 1991, 1992, 1995 Linus Torvalds
|
|
+ * Copyright Freescale Semiconductor, Inc. 2008-2009
|
|
+ * Jason Jin Jason.Jin@freescale.com
|
|
+ * Shrek Wu B16972@freescale.com
|
|
*
|
|
* This file contains the m68k-specific time handling details.
|
|
* Most of the stuff is located in the machine specific files.
|
|
@@ -41,6 +44,11 @@ static inline int set_rtc_mmss(unsigned
|
|
*/
|
|
static irqreturn_t timer_interrupt(int irq, void *dummy)
|
|
{
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+ /* kick hardware timer if necessary */
|
|
+ if (mach_tick)
|
|
+ mach_tick();
|
|
+#endif
|
|
do_timer(1);
|
|
#ifndef CONFIG_SMP
|
|
update_process_times(user_mode(get_irq_regs()));
|
|
--- a/arch/m68k/kernel/vmlinux.lds.S
|
|
+++ b/arch/m68k/kernel/vmlinux.lds.S
|
|
@@ -1,10 +1,13 @@
|
|
PHDRS
|
|
{
|
|
- text PT_LOAD FILEHDR PHDRS FLAGS (7);
|
|
+ headers PT_PHDR PHDRS ;
|
|
+ text PT_LOAD FILEHDR PHDRS FLAGS (5);
|
|
data PT_LOAD FLAGS (7);
|
|
}
|
|
#ifdef CONFIG_SUN3
|
|
#include "vmlinux-sun3.lds"
|
|
+#elif CONFIG_COLDFIRE
|
|
+#include "vmlinux-cf.lds"
|
|
#else
|
|
#include "vmlinux-std.lds"
|
|
#endif
|
|
--- a/arch/m68k/lib/checksum.c
|
|
+++ b/arch/m68k/lib/checksum.c
|
|
@@ -30,6 +30,10 @@
|
|
* 1998/8/31 Andreas Schwab:
|
|
* Zero out rest of buffer on exception in
|
|
* csum_partial_copy_from_user.
|
|
+ *
|
|
+ * Copyright Freescale Semiconductor, Inc. 2008-2009
|
|
+ * Jason Jin Jason.Jin@freescale.com
|
|
+ * Shrek Wu B16972@freescale.com
|
|
*/
|
|
|
|
#include <linux/module.h>
|
|
@@ -39,8 +43,131 @@
|
|
* computes a partial checksum, e.g. for TCP/UDP fragments
|
|
*/
|
|
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+
|
|
+static inline unsigned short from32to16(unsigned long x)
|
|
+{
|
|
+ /* add up 16-bit and 16-bit for 16+c bit */
|
|
+ x = (x & 0xffff) + (x >> 16);
|
|
+ /* add up carry.. */
|
|
+ x = (x & 0xffff) + (x >> 16);
|
|
+ return x;
|
|
+}
|
|
+
|
|
+static unsigned long do_csum(const unsigned char *buff, int len)
|
|
+{
|
|
+ int odd, count;
|
|
+ unsigned long result = 0;
|
|
+
|
|
+ if (len <= 0)
|
|
+ goto out;
|
|
+ odd = 1 & (unsigned long) buff;
|
|
+ if (odd) {
|
|
+ result = *buff;
|
|
+ len--;
|
|
+ buff++;
|
|
+ }
|
|
+ count = len >> 1; /* nr of 16-bit words.. */
|
|
+ if (count) {
|
|
+ if (2 & (unsigned long) buff) {
|
|
+ result += *(unsigned short *) buff;
|
|
+ count--;
|
|
+ len -= 2;
|
|
+ buff += 2;
|
|
+ }
|
|
+ count >>= 1; /* nr of 32-bit words.. */
|
|
+ if (count) {
|
|
+ unsigned long carry = 0;
|
|
+ do {
|
|
+ unsigned long w = *(unsigned long *) buff;
|
|
+ count--;
|
|
+ buff += 4;
|
|
+ result += carry;
|
|
+ result += w;
|
|
+ carry = (w > result);
|
|
+ } while (count);
|
|
+ result += carry;
|
|
+ result = (result & 0xffff) + (result >> 16);
|
|
+ }
|
|
+ if (len & 2) {
|
|
+ result += *(unsigned short *) buff;
|
|
+ buff += 2;
|
|
+ }
|
|
+ }
|
|
+ if (len & 1)
|
|
+ result += (*buff << 8);
|
|
+ result = from32to16(result);
|
|
+ if (odd)
|
|
+ result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);
|
|
+out:
|
|
+ return result;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * This is a version of ip_compute_csum() optimized for IP headers,
|
|
+ * which always checksum on 4 octet boundaries.
|
|
+ */
|
|
+__sum16 ip_fast_csum(const void *iph, unsigned int ihl)
|
|
+{
|
|
+ return ~do_csum(iph, ihl*4);
|
|
+}
|
|
+EXPORT_SYMBOL(ip_fast_csum);
|
|
+
|
|
+/*
|
|
+ * computes the checksum of a memory block at buff, length len,
|
|
+ * and adds in "sum" (32-bit)
|
|
+ *
|
|
+ * returns a 32-bit number suitable for feeding into itself
|
|
+ * or csum_tcpudp_magic
|
|
+ *
|
|
+ * this function must be called with even lengths, except
|
|
+ * for the last fragment, which may be odd
|
|
+ *
|
|
+ * it's best to have buff aligned on a 32-bit boundary
|
|
+ */
|
|
__wsum csum_partial(const void *buff, int len, __wsum sum)
|
|
{
|
|
+ unsigned int result = do_csum(buff, len);
|
|
+
|
|
+ /* add in old sum, and carry.. */
|
|
+ result += sum;
|
|
+ if (sum > result)
|
|
+ result += 1;
|
|
+ return result;
|
|
+}
|
|
+EXPORT_SYMBOL(csum_partial);
|
|
+
|
|
+/*
|
|
+ * copy from fs while checksumming, otherwise like csum_partial
|
|
+ */
|
|
+
|
|
+__wsum
|
|
+csum_partial_copy_from_user(const void __user *src, void *dst, int len,
|
|
+ __wsum sum, int *csum_err)
|
|
+{
|
|
+ if (csum_err) *csum_err = 0;
|
|
+ memcpy(dst, src, len);
|
|
+ return csum_partial(dst, len, sum);
|
|
+}
|
|
+EXPORT_SYMBOL(csum_partial_copy_from_user);
|
|
+
|
|
+/*
|
|
+ * copy from ds while checksumming, otherwise like csum_partial
|
|
+ */
|
|
+
|
|
+__wsum
|
|
+csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum)
|
|
+{
|
|
+ memcpy(dst, src, len);
|
|
+ return csum_partial(dst, len, sum);
|
|
+}
|
|
+EXPORT_SYMBOL(csum_partial_copy_nocheck);
|
|
+
|
|
+#else /* !CONFIG_COLDFIRE */
|
|
+
|
|
+unsigned int
|
|
+csum_partial(const unsigned char *buff, int len, unsigned int sum)
|
|
+{
|
|
unsigned long tmp1, tmp2;
|
|
/*
|
|
* Experiments with ethernet and slip connections show that buff
|
|
@@ -423,3 +550,4 @@ csum_partial_copy_nocheck(const void *sr
|
|
return(sum);
|
|
}
|
|
EXPORT_SYMBOL(csum_partial_copy_nocheck);
|
|
+#endif /* CONFIG_COLDFIRE */
|
|
--- a/arch/m68k/lib/muldi3.c
|
|
+++ b/arch/m68k/lib/muldi3.c
|
|
@@ -1,6 +1,9 @@
|
|
/* muldi3.c extracted from gcc-2.7.2.3/libgcc2.c and
|
|
gcc-2.7.2.3/longlong.h which is: */
|
|
/* Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
|
|
+ Copyright Freescale Semiconductor, Inc. 2008-2009
|
|
+ Jason Jin Jason.Jin@freescale.com
|
|
+ Shrek Wu B16972@freescale.com
|
|
|
|
This file is part of GNU CC.
|
|
|
|
@@ -21,12 +24,22 @@ Boston, MA 02111-1307, USA. */
|
|
|
|
#define BITS_PER_UNIT 8
|
|
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+#define umul_ppmm(w1, w0, u, v) \
|
|
+ do { \
|
|
+ unsigned long long x; \
|
|
+ x = (unsigned long long)u * v; \
|
|
+ w0 = (unsigned long)(x & 0x00000000ffffffff); \
|
|
+ w1 = (unsigned long)(x & 0xffffffff00000000) >> 32; \
|
|
+ } while (0)
|
|
+#else /* CONFIG_COLDFIRE */
|
|
#define umul_ppmm(w1, w0, u, v) \
|
|
__asm__ ("mulu%.l %3,%1:%0" \
|
|
: "=d" ((USItype)(w0)), \
|
|
"=d" ((USItype)(w1)) \
|
|
: "%0" ((USItype)(u)), \
|
|
"dmi" ((USItype)(v)))
|
|
+#endif /* CONFIG_COLDFIRE */
|
|
|
|
#define __umulsidi3(u, v) \
|
|
({DIunion __w; \
|
|
--- a/arch/m68k/lib/string.c
|
|
+++ b/arch/m68k/lib/string.c
|
|
@@ -1,4 +1,8 @@
|
|
/*
|
|
+ * Copyright Freescale Semiconductor, Inc. 2008-2009
|
|
+ * * Jason Jin Jason.Jin@freescale.com
|
|
+ * Shrek Wu B16972@freescale.com
|
|
+ *
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file COPYING in the main directory of this archive
|
|
* for more details.
|
|
@@ -21,6 +25,7 @@ char *strcat(char *dest, const char *src
|
|
}
|
|
EXPORT_SYMBOL(strcat);
|
|
|
|
+#ifndef CONFIG_COLDFIRE
|
|
void *memset(void *s, int c, size_t count)
|
|
{
|
|
void *xs = s;
|
|
@@ -149,6 +154,69 @@ void *memcpy(void *to, const void *from,
|
|
}
|
|
EXPORT_SYMBOL(memcpy);
|
|
|
|
+#else /* CONFIG_COLDFIRE */
|
|
+
|
|
+void *memset(void *s, int c, size_t count)
|
|
+{
|
|
+ unsigned long x;
|
|
+ void *originalTo = s;
|
|
+
|
|
+ for (x = 0; x < count; x++)
|
|
+ *(unsigned char *)s++ = (unsigned char)c;
|
|
+
|
|
+ return originalTo;
|
|
+}
|
|
+EXPORT_SYMBOL(memset);
|
|
+
|
|
+void *memcpy(void *to, const void *from, size_t n)
|
|
+{
|
|
+ void *xto = to;
|
|
+ size_t temp;
|
|
+
|
|
+ if (!n)
|
|
+ return xto;
|
|
+ if ((long) to & 1) {
|
|
+ char *cto = to;
|
|
+ const char *cfrom = from;
|
|
+ *cto++ = *cfrom++;
|
|
+ to = cto;
|
|
+ from = cfrom;
|
|
+ n--;
|
|
+ }
|
|
+ if (n > 2 && (long) to & 2) {
|
|
+ short *sto = to;
|
|
+ const short *sfrom = from;
|
|
+ *sto++ = *sfrom++;
|
|
+ to = sto;
|
|
+ from = sfrom;
|
|
+ n -= 2;
|
|
+ }
|
|
+ temp = n >> 2;
|
|
+ if (temp) {
|
|
+ long *lto = to;
|
|
+ const long *lfrom = from;
|
|
+ for (; temp; temp--)
|
|
+ *lto++ = *lfrom++;
|
|
+ to = lto;
|
|
+ from = lfrom;
|
|
+ }
|
|
+ if (n & 2) {
|
|
+ short *sto = to;
|
|
+ const short *sfrom = from;
|
|
+ *sto++ = *sfrom++;
|
|
+ to = sto;
|
|
+ from = sfrom;
|
|
+ }
|
|
+ if (n & 1) {
|
|
+ char *cto = to;
|
|
+ const char *cfrom = from;
|
|
+ *cto = *cfrom;
|
|
+ }
|
|
+ return xto;
|
|
+}
|
|
+EXPORT_SYMBOL(memcpy);
|
|
+#endif /* CONFIG_COLDFIRE */
|
|
+
|
|
void *memmove(void *dest, const void *src, size_t n)
|
|
{
|
|
void *xdest = dest;
|
|
--- a/arch/m68k/lib/uaccess.c
|
|
+++ b/arch/m68k/lib/uaccess.c
|
|
@@ -1,10 +1,15 @@
|
|
/*
|
|
+ * Copyright Freescale Semiconductor, Inc. 2008-2009
|
|
+ * Jason Jin Jason.Jin@freescale.com
|
|
+ * Shrek Wu B16972@freescale.com
|
|
+ *
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file COPYING in the main directory of this archive
|
|
* for more details.
|
|
*/
|
|
|
|
#include <linux/module.h>
|
|
+#ifndef CONFIG_COLDFIRE
|
|
#include <asm/uaccess.h>
|
|
|
|
unsigned long __generic_copy_from_user(void *to, const void __user *from,
|
|
@@ -220,3 +225,244 @@ unsigned long __clear_user(void __user *
|
|
return res;
|
|
}
|
|
EXPORT_SYMBOL(__clear_user);
|
|
+
|
|
+#else /* CONFIG_COLDFIRE */
|
|
+
|
|
+#include <asm/cf_uaccess.h>
|
|
+
|
|
+unsigned long __generic_copy_from_user(void *to, const void *from,
|
|
+ unsigned long n)
|
|
+{
|
|
+ unsigned long tmp;
|
|
+ __asm__ __volatile__
|
|
+ (" tstl %2\n"
|
|
+ " jeq 2f\n"
|
|
+ "1: movel (%1)+,%3\n"
|
|
+ " movel %3,(%0)+\n"
|
|
+ " subql #1,%2\n"
|
|
+ " jne 1b\n"
|
|
+ "2: movel %4,%2\n"
|
|
+ " bclr #1,%2\n"
|
|
+ " jeq 4f\n"
|
|
+ "3: movew (%1)+,%3\n"
|
|
+ " movew %3,(%0)+\n"
|
|
+ "4: bclr #0,%2\n"
|
|
+ " jeq 6f\n"
|
|
+ "5: moveb (%1)+,%3\n"
|
|
+ " moveb %3,(%0)+\n"
|
|
+ "6:\n"
|
|
+ ".section .fixup,\"ax\"\n"
|
|
+ " .even\n"
|
|
+ "7: movel %2,%%d0\n"
|
|
+ "71:clrl (%0)+\n"
|
|
+ " subql #1,%%d0\n"
|
|
+ " jne 71b\n"
|
|
+ " lsll #2,%2\n"
|
|
+ " addl %4,%2\n"
|
|
+ " btst #1,%4\n"
|
|
+ " jne 81f\n"
|
|
+ " btst #0,%4\n"
|
|
+ " jne 91f\n"
|
|
+ " jra 6b\n"
|
|
+ "8: addql #2,%2\n"
|
|
+ "81:clrw (%0)+\n"
|
|
+ " btst #0,%4\n"
|
|
+ " jne 91f\n"
|
|
+ " jra 6b\n"
|
|
+ "9: addql #1,%2\n"
|
|
+ "91:clrb (%0)+\n"
|
|
+ " jra 6b\n"
|
|
+ ".previous\n"
|
|
+ ".section __ex_table,\"a\"\n"
|
|
+ " .align 4\n"
|
|
+ " .long 1b,7b\n"
|
|
+ " .long 3b,8b\n"
|
|
+ " .long 5b,9b\n"
|
|
+ ".previous"
|
|
+ : "=a"(to), "=a"(from), "=d"(n), "=&d"(tmp)
|
|
+ : "d"(n & 3), "0"(to), "1"(from), "2"(n/4)
|
|
+ : "d0", "memory");
|
|
+ return n;
|
|
+}
|
|
+EXPORT_SYMBOL(__generic_copy_from_user);
|
|
+
|
|
+
|
|
+unsigned long __generic_copy_to_user(void *to, const void *from,
|
|
+ unsigned long n)
|
|
+{
|
|
+ unsigned long tmp;
|
|
+ __asm__ __volatile__
|
|
+ (" tstl %2\n"
|
|
+ " jeq 3f\n"
|
|
+ "1: movel (%1)+,%3\n"
|
|
+ "22:movel %3,(%0)+\n"
|
|
+ "2: subql #1,%2\n"
|
|
+ " jne 1b\n"
|
|
+ "3: movel %4,%2\n"
|
|
+ " bclr #1,%2\n"
|
|
+ " jeq 4f\n"
|
|
+ " movew (%1)+,%3\n"
|
|
+ "24:movew %3,(%0)+\n"
|
|
+ "4: bclr #0,%2\n"
|
|
+ " jeq 5f\n"
|
|
+ " moveb (%1)+,%3\n"
|
|
+ "25:moveb %3,(%0)+\n"
|
|
+ "5:\n"
|
|
+ ".section .fixup,\"ax\"\n"
|
|
+ " .even\n"
|
|
+ "60:addql #1,%2\n"
|
|
+ "6: lsll #2,%2\n"
|
|
+ " addl %4,%2\n"
|
|
+ " jra 5b\n"
|
|
+ "7: addql #2,%2\n"
|
|
+ " jra 5b\n"
|
|
+ "8: addql #1,%2\n"
|
|
+ " jra 5b\n"
|
|
+ ".previous\n"
|
|
+ ".section __ex_table,\"a\"\n"
|
|
+ " .align 4\n"
|
|
+ " .long 1b,60b\n"
|
|
+ " .long 22b,6b\n"
|
|
+ " .long 2b,6b\n"
|
|
+ " .long 24b,7b\n"
|
|
+ " .long 3b,60b\n"
|
|
+ " .long 4b,7b\n"
|
|
+ " .long 25b,8b\n"
|
|
+ " .long 5b,8b\n"
|
|
+ ".previous"
|
|
+ : "=a"(to), "=a"(from), "=d"(n), "=&d"(tmp)
|
|
+ : "r"(n & 3), "0"(to), "1"(from), "2"(n / 4)
|
|
+ : "memory");
|
|
+ return n;
|
|
+}
|
|
+EXPORT_SYMBOL(__generic_copy_to_user);
|
|
+
|
|
+/*
|
|
+ * Copy a null terminated string from userspace.
|
|
+ */
|
|
+
|
|
+long strncpy_from_user(char *dst, const char *src, long count)
|
|
+{
|
|
+ long res = -EFAULT;
|
|
+ if (!(access_ok(VERIFY_READ, src, 1))) /* --tym-- */
|
|
+ return res;
|
|
+ if (count == 0) return count;
|
|
+ __asm__ __volatile__
|
|
+ ("1: moveb (%2)+,%%d0\n"
|
|
+ "12:moveb %%d0,(%1)+\n"
|
|
+ " jeq 2f\n"
|
|
+ " subql #1,%3\n"
|
|
+ " jne 1b\n"
|
|
+ "2: subl %3,%0\n"
|
|
+ "3:\n"
|
|
+ ".section .fixup,\"ax\"\n"
|
|
+ " .even\n"
|
|
+ "4: movel %4,%0\n"
|
|
+ " jra 3b\n"
|
|
+ ".previous\n"
|
|
+ ".section __ex_table,\"a\"\n"
|
|
+ " .align 4\n"
|
|
+ " .long 1b,4b\n"
|
|
+ " .long 12b,4b\n"
|
|
+ ".previous"
|
|
+ : "=d"(res), "=a"(dst), "=a"(src), "=d"(count)
|
|
+ : "i"(-EFAULT), "0"(count), "1"(dst), "2"(src), "3"(count)
|
|
+ : "d0", "memory");
|
|
+ return res;
|
|
+}
|
|
+EXPORT_SYMBOL(strncpy_from_user);
|
|
+
|
|
+/*
|
|
+ * Return the size of a string (including the ending 0)
|
|
+ *
|
|
+ * Return 0 on exception, a value greater than N if too long
|
|
+ */
|
|
+long strnlen_user(const char *src, long n)
|
|
+{
|
|
+ long res = -EFAULT;
|
|
+ if (!(access_ok(VERIFY_READ, src, 1))) /* --tym-- */
|
|
+ return res;
|
|
+
|
|
+ res = -(long)src;
|
|
+ __asm__ __volatile__
|
|
+ ("1:\n"
|
|
+ " tstl %2\n"
|
|
+ " jeq 3f\n"
|
|
+ "2: moveb (%1)+,%%d0\n"
|
|
+ "22:\n"
|
|
+ " subql #1,%2\n"
|
|
+ " tstb %%d0\n"
|
|
+ " jne 1b\n"
|
|
+ " jra 4f\n"
|
|
+ "3:\n"
|
|
+ " addql #1,%0\n"
|
|
+ "4:\n"
|
|
+ " addl %1,%0\n"
|
|
+ "5:\n"
|
|
+ ".section .fixup,\"ax\"\n"
|
|
+ " .even\n"
|
|
+ "6: moveq %3,%0\n"
|
|
+ " jra 5b\n"
|
|
+ ".previous\n"
|
|
+ ".section __ex_table,\"a\"\n"
|
|
+ " .align 4\n"
|
|
+ " .long 2b,6b\n"
|
|
+ " .long 22b,6b\n"
|
|
+ ".previous"
|
|
+ : "=d"(res), "=a"(src), "=d"(n)
|
|
+ : "i"(0), "0"(res), "1"(src), "2"(n)
|
|
+ : "d0");
|
|
+ return res;
|
|
+}
|
|
+EXPORT_SYMBOL(strnlen_user);
|
|
+
|
|
+
|
|
+/*
|
|
+ * Zero Userspace
|
|
+ */
|
|
+
|
|
+unsigned long __clear_user(void *to, unsigned long n)
|
|
+{
|
|
+ __asm__ __volatile__
|
|
+ (" tstl %1\n"
|
|
+ " jeq 3f\n"
|
|
+ "1: movel %3,(%0)+\n"
|
|
+ "2: subql #1,%1\n"
|
|
+ " jne 1b\n"
|
|
+ "3: movel %2,%1\n"
|
|
+ " bclr #1,%1\n"
|
|
+ " jeq 4f\n"
|
|
+ "24:movew %3,(%0)+\n"
|
|
+ "4: bclr #0,%1\n"
|
|
+ " jeq 5f\n"
|
|
+ "25:moveb %3,(%0)+\n"
|
|
+ "5:\n"
|
|
+ ".section .fixup,\"ax\"\n"
|
|
+ " .even\n"
|
|
+ "61:addql #1,%1\n"
|
|
+ "6: lsll #2,%1\n"
|
|
+ " addl %2,%1\n"
|
|
+ " jra 5b\n"
|
|
+ "7: addql #2,%1\n"
|
|
+ " jra 5b\n"
|
|
+ "8: addql #1,%1\n"
|
|
+ " jra 5b\n"
|
|
+ ".previous\n"
|
|
+ ".section __ex_table,\"a\"\n"
|
|
+ " .align 4\n"
|
|
+ " .long 1b,61b\n"
|
|
+ " .long 2b,6b\n"
|
|
+ " .long 3b,61b\n"
|
|
+ " .long 24b,7b\n"
|
|
+ " .long 4b,7b\n"
|
|
+ " .long 25b,8b\n"
|
|
+ " .long 5b,8b\n"
|
|
+ ".previous"
|
|
+ : "=a"(to), "=d"(n)
|
|
+ : "r"(n & 3), "d"(0), "0"(to), "1"(n/4));
|
|
+ return n;
|
|
+}
|
|
+EXPORT_SYMBOL(__clear_user);
|
|
+
|
|
+#endif /* CONFIG_COLDFIRE */
|
|
+
|
|
--- a/arch/m68k/Makefile
|
|
+++ b/arch/m68k/Makefile
|
|
@@ -1,6 +1,8 @@
|
|
#
|
|
# m68k/Makefile
|
|
#
|
|
+# Copyright 2007-2009 Freescale Semiconductor, Inc. All Rights Reserved.
|
|
+#
|
|
# This file is included by the global makefile so that you can add your own
|
|
# architecture-specific flags and dependencies. Remember to do have actions
|
|
# for "archclean" and "archdep" for cleaning up and making dependencies for
|
|
@@ -10,13 +12,13 @@
|
|
# License. See the file "COPYING" in the main directory of this archive
|
|
# for more details.
|
|
#
|
|
-# Copyright (C) 1994 by Hamish Macdonald
|
|
-#
|
|
|
|
-KBUILD_DEFCONFIG := multi_defconfig
|
|
+KBUILD_DEFCONFIG := amiga_defconfig#multi_defconfig
|
|
|
|
# override top level makefile
|
|
+ifndef CONFIG_COLDFIRE
|
|
AS += -m68020
|
|
+endif
|
|
LDFLAGS := -m m68kelf
|
|
LDFLAGS_MODULE += -T $(srctree)/arch/m68k/kernel/module.lds
|
|
ifneq ($(SUBARCH),$(ARCH))
|
|
@@ -30,12 +32,18 @@ ifdef CONFIG_SUN3
|
|
LDFLAGS_vmlinux = -N
|
|
endif
|
|
|
|
+ifdef CONFIG_COLDFIRE
|
|
+OBJCOPYFLAGS := -O binary -R .note -R .note.gnu.build-id -R .comment -S
|
|
+# LDFLAGS_vmlinux = --verbose
|
|
+endif
|
|
+
|
|
CHECKFLAGS += -D__mc68000__
|
|
|
|
# without -fno-strength-reduce the 53c7xx.c driver fails ;-(
|
|
KBUILD_CFLAGS += -pipe -fno-strength-reduce -ffixed-a2
|
|
|
|
# enable processor switch if compiled only for a single cpu
|
|
+ifndef CONFIG_COLDFIRE
|
|
ifndef CONFIG_M68020
|
|
ifndef CONFIG_M68030
|
|
|
|
@@ -49,6 +57,17 @@ endif
|
|
|
|
endif
|
|
endif
|
|
+endif
|
|
+
|
|
+ifdef CONFIG_M5445X
|
|
+KBUILD_CFLAGS += -march=isac -mcpu=54455 -msoft-float -g
|
|
+KBUILD_AFLAGS += -march=isac -mcpu=54455 -msoft-float
|
|
+endif
|
|
+
|
|
+ifdef CONFIG_M547X_8X
|
|
+KBUILD_CFLAGS += -mcfv4e -g
|
|
+KBUILD_AFLAGS += -mcfv4e
|
|
+endif
|
|
|
|
ifdef CONFIG_KGDB
|
|
# If configured for kgdb support, include debugging infos and keep the
|
|
@@ -57,8 +76,12 @@ KBUILD_CFLAGS := $(subst -fomit-frame-po
|
|
endif
|
|
|
|
ifndef CONFIG_SUN3
|
|
+ifndef CONFIG_COLDFIRE
|
|
head-y := arch/m68k/kernel/head.o
|
|
else
|
|
+head-y := arch/m68k/coldfire/common/head.o
|
|
+endif
|
|
+else
|
|
head-y := arch/m68k/kernel/sun3-head.o
|
|
endif
|
|
|
|
@@ -79,7 +102,20 @@ core-$(CONFIG_SUN3) += arch/m68k/sun3/
|
|
core-$(CONFIG_M68040) += arch/m68k/fpsp040/
|
|
core-$(CONFIG_M68060) += arch/m68k/ifpsp060/
|
|
core-$(CONFIG_M68KFPU_EMU) += arch/m68k/math-emu/
|
|
+core-$(CONFIG_COLDFIRE) += arch/m68k/coldfire/
|
|
+
|
|
+ifdef CONFIG_COLDFIRE
|
|
+boot := arch/m68k/boot
|
|
+
|
|
+all: uImage
|
|
+
|
|
+zImage zImage.srec uImage uImage.srec vmlinux.srec: vmlinux
|
|
+ $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
|
|
|
+archclean:
|
|
+ $(Q)$(MAKE) $(clean)=$(boot)
|
|
+
|
|
+else
|
|
all: zImage
|
|
|
|
lilo: vmlinux
|
|
@@ -117,6 +153,7 @@ endif
|
|
|
|
archclean:
|
|
rm -f vmlinux.gz vmlinux.bz2
|
|
+endif
|
|
|
|
install:
|
|
sh $(srctree)/arch/m68k/install.sh $(KERNELRELEASE) vmlinux.gz System.map "$(INSTALL_PATH)"
|
|
--- a/arch/m68k/mm/cache.c
|
|
+++ b/arch/m68k/mm/cache.c
|
|
@@ -4,13 +4,20 @@
|
|
* Instruction cache handling
|
|
*
|
|
* Copyright (C) 1995 Hamish Macdonald
|
|
+ * Copyright Freescale Semiconductor, Inc. 2008-2009
|
|
+ * Jason Jin Jason.Jin@freescale.com
|
|
+ * Shrek Wu B16972@freescale.com
|
|
*/
|
|
|
|
#include <linux/module.h>
|
|
#include <asm/pgalloc.h>
|
|
#include <asm/traps.h>
|
|
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+#include <asm/cfcache.h>
|
|
+#endif /* CONFIG_COLDFIRE */
|
|
|
|
+#ifndef CONFIG_COLDFIRE
|
|
static unsigned long virt_to_phys_slow(unsigned long vaddr)
|
|
{
|
|
if (CPU_IS_060) {
|
|
@@ -69,11 +76,18 @@ static unsigned long virt_to_phys_slow(u
|
|
}
|
|
return 0;
|
|
}
|
|
+#endif /* CONFIG_COLDFIRE */
|
|
+
|
|
|
|
/* Push n pages at kernel virtual address and clear the icache */
|
|
/* RZ: use cpush %bc instead of cpush %dc, cinv %ic */
|
|
void flush_icache_range(unsigned long address, unsigned long endaddr)
|
|
{
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+// JKM -- hack until new cpushl stuff is in
|
|
+// cf_icache_flush_range(address, endaddr);
|
|
+ flush_icache();
|
|
+#else /* !CONFIG_COLDFIRE */
|
|
|
|
if (CPU_IS_040_OR_060) {
|
|
address &= PAGE_MASK;
|
|
@@ -94,9 +108,11 @@ void flush_icache_range(unsigned long ad
|
|
: "=&d" (tmp)
|
|
: "di" (FLUSH_I));
|
|
}
|
|
+#endif /* CONFIG_COLDFIRE */
|
|
}
|
|
EXPORT_SYMBOL(flush_icache_range);
|
|
|
|
+#ifndef CONFIG_COLDFIRE
|
|
void flush_icache_user_range(struct vm_area_struct *vma, struct page *page,
|
|
unsigned long addr, int len)
|
|
{
|
|
@@ -115,4 +131,5 @@ void flush_icache_user_range(struct vm_a
|
|
: "di" (FLUSH_I));
|
|
}
|
|
}
|
|
+#endif /* CONFIG_COLDFIRE */
|
|
|
|
--- a/arch/m68k/mm/hwtest.c
|
|
+++ b/arch/m68k/mm/hwtest.c
|
|
@@ -12,6 +12,10 @@
|
|
* them here complete with the comments from the original atari
|
|
* config.c...
|
|
* -- PMM <pmaydell@chiark.greenend.org.uk>, 05/1998
|
|
+ *
|
|
+ * Copyright Freescale Semiconductor, Inc. 2008-2009
|
|
+ * Jason Jin Jason.Jin@freescale.com
|
|
+ * Shrek Wu B16972@freescale.com
|
|
*/
|
|
|
|
/* This function tests for the presence of an address, specially a
|
|
@@ -25,6 +29,7 @@
|
|
|
|
#include <linux/module.h>
|
|
|
|
+#ifndef CONFIG_COLDFIRE
|
|
int hwreg_present( volatile void *regp )
|
|
{
|
|
int ret = 0;
|
|
@@ -82,4 +87,5 @@ int hwreg_write( volatile void *regp, un
|
|
return( ret );
|
|
}
|
|
EXPORT_SYMBOL(hwreg_write);
|
|
+#endif
|
|
|
|
--- a/arch/m68k/mm/init.c
|
|
+++ b/arch/m68k/mm/init.c
|
|
@@ -2,6 +2,9 @@
|
|
* linux/arch/m68k/mm/init.c
|
|
*
|
|
* Copyright (C) 1995 Hamish Macdonald
|
|
+ * Copyright Freescale Semiconductor, Inc. 2008-2009
|
|
+ * Jason Jin Jason.Jin@freescale.com
|
|
+ * Shrek Wu B16972@freescale.com
|
|
*
|
|
* Contains common initialization routines, specific init code moved
|
|
* to motorola.c and sun3mmu.c
|
|
@@ -31,6 +34,10 @@
|
|
#include <asm/sections.h>
|
|
#include <asm/tlb.h>
|
|
|
|
+#ifdef CONFIG_VDSO
|
|
+int vdso_init(void);
|
|
+#endif
|
|
+
|
|
DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
|
|
|
|
pg_data_t pg_data_map[MAX_NUMNODES];
|
|
@@ -88,7 +95,6 @@ void __init mem_init(void)
|
|
if (MACH_IS_ATARI)
|
|
atari_stram_mem_init_hook();
|
|
#endif
|
|
-
|
|
/* this will put all memory onto the freelists */
|
|
totalram_pages = num_physpages = 0;
|
|
for_each_online_pgdat(pgdat) {
|
|
@@ -112,7 +118,7 @@ void __init mem_init(void)
|
|
}
|
|
}
|
|
|
|
-#ifndef CONFIG_SUN3
|
|
+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
|
|
/* insert pointer tables allocated so far into the tablelist */
|
|
init_pointer_table((unsigned long)kernel_pg_dir);
|
|
for (i = 0; i < PTRS_PER_PGD; i++) {
|
|
@@ -131,6 +137,11 @@ void __init mem_init(void)
|
|
codepages << (PAGE_SHIFT-10),
|
|
datapages << (PAGE_SHIFT-10),
|
|
initpages << (PAGE_SHIFT-10));
|
|
+
|
|
+#ifdef CONFIG_VDSO
|
|
+ /* init the vdso page */
|
|
+ vdso_init();
|
|
+#endif
|
|
}
|
|
|
|
#ifdef CONFIG_BLK_DEV_INITRD
|
|
--- a/arch/m68k/mm/kmap.c
|
|
+++ b/arch/m68k/mm/kmap.c
|
|
@@ -2,6 +2,9 @@
|
|
* linux/arch/m68k/mm/kmap.c
|
|
*
|
|
* Copyright (C) 1997 Roman Hodek
|
|
+ * Copyright Freescale Semiconductor, Inc. 2008, 2009
|
|
+ * Jason Jin Jason.Jin@freescale.com
|
|
+ * Shrek Wu B16972@freescale.com
|
|
*
|
|
* 10/01/99 cleaned up the code and changing to the same interface
|
|
* used by other architectures /Roman Zippel
|
|
@@ -24,7 +27,11 @@
|
|
|
|
#undef DEBUG
|
|
|
|
+#ifndef CONFIG_COLDFIRE
|
|
#define PTRTREESIZE (256*1024)
|
|
+#else
|
|
+#define PTRTREESIZE PAGE_SIZE
|
|
+#endif
|
|
|
|
/*
|
|
* For 040/060 we can use the virtual memory area like other architectures,
|
|
@@ -50,7 +57,11 @@ static inline void free_io_area(void *ad
|
|
|
|
#else
|
|
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+#define IO_SIZE PAGE_SIZE
|
|
+#else
|
|
#define IO_SIZE (256*1024)
|
|
+#endif
|
|
|
|
static struct vm_struct *iolist;
|
|
|
|
@@ -127,8 +138,41 @@ void __iomem *__ioremap(unsigned long ph
|
|
}
|
|
#endif
|
|
|
|
+#ifdef CONFIG_M5445X
|
|
+ if (physaddr >= 0xf0000000) {
|
|
+ /*
|
|
+ * On the M5445x processors an ACR is setup to map
|
|
+ * the 0xF0000000 range into kernel memory as
|
|
+ * non-cacheable.
|
|
+ */
|
|
+ return (void __iomem *)physaddr;
|
|
+ }
|
|
+ if ((physaddr >= KMAP_START) && (physaddr <= KMAP_END)) {
|
|
+ /* if physaddr belongs to virtual address range for ioremap,
|
|
+ * then return physaddr because it has been ioremapped
|
|
+ */
|
|
+ return (void __iomem *)physaddr;
|
|
+ }
|
|
+#endif
|
|
+#ifdef CONFIG_M547X_8X
|
|
+ if (physaddr >= 0xf0000000) {
|
|
+ /*
|
|
+ * On the M547x/M548x processors an ACR is setup to map
|
|
+ * the 0xF0000000 range into kernel memory as
|
|
+ * non-cacheable.
|
|
+ */
|
|
+ return (void __iomem *)physaddr;
|
|
+ }
|
|
+
|
|
+ if ((physaddr >= 0xd0000000) && (physaddr + size < 0xd800ffff)) {
|
|
+ printk(KERN_ERR "ioremap:PCI 0x%lx,0x%lx(%d)"
|
|
+ " - PCI area hit\n", physaddr, size, cacheflag);
|
|
+ return (void *)physaddr;
|
|
+ }
|
|
+#endif
|
|
#ifdef DEBUG
|
|
- printk("ioremap: 0x%lx,0x%lx(%d) - ", physaddr, size, cacheflag);
|
|
+ printk(KERN_ERR "ioremap: paddr=0x%lx,size=0x%lx(%d) - ",
|
|
+ physaddr, size, cacheflag);
|
|
#endif
|
|
/*
|
|
* Mappings have to be aligned
|
|
@@ -147,7 +191,8 @@ void __iomem *__ioremap(unsigned long ph
|
|
virtaddr = (unsigned long)area->addr;
|
|
retaddr = virtaddr + offset;
|
|
#ifdef DEBUG
|
|
- printk("0x%lx,0x%lx,0x%lx", physaddr, virtaddr, retaddr);
|
|
+ printk(KERN_ERR " paddr=0x%lx,vaddr=0x%lx,retaddr=0x%lx",
|
|
+ physaddr, virtaddr, retaddr);
|
|
#endif
|
|
|
|
/*
|
|
@@ -172,7 +217,12 @@ void __iomem *__ioremap(unsigned long ph
|
|
break;
|
|
}
|
|
} else {
|
|
+#ifndef CONFIG_COLDFIRE
|
|
physaddr |= (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY);
|
|
+#else
|
|
+ physaddr |= (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY | \
|
|
+ _PAGE_READWRITE);
|
|
+#endif
|
|
switch (cacheflag) {
|
|
case IOMAP_NOCACHE_SER:
|
|
case IOMAP_NOCACHE_NONSER:
|
|
@@ -252,6 +302,13 @@ void __iounmap(void *addr, unsigned long
|
|
pmd_t *pmd_dir;
|
|
pte_t *pte_dir;
|
|
|
|
+#ifdef CONFIG_M547X_8X
|
|
+ if ((addr >= (void *)0xd0000000)
|
|
+ && (addr + size < (void *)0xd800ffff)) {
|
|
+ printk(KERN_ERR "%s: PCI address\n", __func__);
|
|
+ return;
|
|
+ }
|
|
+#endif
|
|
while ((long)size > 0) {
|
|
pgd_dir = pgd_offset_k(virtaddr);
|
|
if (pgd_bad(*pgd_dir)) {
|
|
--- a/arch/m68k/mm/Makefile
|
|
+++ b/arch/m68k/mm/Makefile
|
|
@@ -6,3 +6,5 @@ obj-y := cache.o init.o fault.o hwtest.
|
|
|
|
obj-$(CONFIG_MMU_MOTOROLA) += kmap.o memory.o motorola.o
|
|
obj-$(CONFIG_MMU_SUN3) += sun3kmap.o sun3mmu.o
|
|
+obj-$(CONFIG_MMU_CFV4E) += cf-mmu.o kmap.o memory.o
|
|
+obj-$(CONFIG_SRAM) += cf-sram.o
|
|
--- a/arch/m68k/mm/memory.c
|
|
+++ b/arch/m68k/mm/memory.c
|
|
@@ -2,6 +2,10 @@
|
|
* linux/arch/m68k/mm/memory.c
|
|
*
|
|
* Copyright (C) 1995 Hamish Macdonald
|
|
+ * Copyright Freescale Semiconductor, Inc. 2008-2009
|
|
+ * Jason Jin Jason.Jin@freescale.com
|
|
+ * Shrek Wu B16972@freescale.com
|
|
+ *
|
|
*/
|
|
|
|
#include <linux/module.h>
|
|
@@ -127,6 +131,7 @@ int free_pointer_table (pmd_t *ptable)
|
|
return 0;
|
|
}
|
|
|
|
+#ifndef CONFIG_COLDFIRE
|
|
/* invalidate page in both caches */
|
|
static inline void clear040(unsigned long paddr)
|
|
{
|
|
@@ -173,6 +178,7 @@ static inline void pushcl040(unsigned lo
|
|
clear040(paddr);
|
|
local_irq_restore(flags);
|
|
}
|
|
+#endif /* CONFIG_COLDFIRE */
|
|
|
|
/*
|
|
* 040: Hit every page containing an address in the range paddr..paddr+len-1.
|
|
@@ -203,6 +209,11 @@ static inline void pushcl040(unsigned lo
|
|
|
|
void cache_clear (unsigned long paddr, int len)
|
|
{
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+// JKM -- revise to use proper caching
|
|
+// cf_cache_clear(paddr, len);
|
|
+ flush_bcache();
|
|
+#else
|
|
if (CPU_IS_040_OR_060) {
|
|
int tmp;
|
|
|
|
@@ -237,6 +248,7 @@ void cache_clear (unsigned long paddr, i
|
|
if(mach_l2_flush)
|
|
mach_l2_flush(0);
|
|
#endif
|
|
+#endif /* CONFIG_COLDFIRE */
|
|
}
|
|
EXPORT_SYMBOL(cache_clear);
|
|
|
|
@@ -250,6 +262,11 @@ EXPORT_SYMBOL(cache_clear);
|
|
|
|
void cache_push (unsigned long paddr, int len)
|
|
{
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+// JKM -- revise to use proper caching
|
|
+// cf_cache_push(paddr, len);
|
|
+ flush_bcache();
|
|
+#else
|
|
if (CPU_IS_040_OR_060) {
|
|
int tmp = PAGE_SIZE;
|
|
|
|
@@ -290,6 +307,7 @@ void cache_push (unsigned long paddr, in
|
|
if(mach_l2_flush)
|
|
mach_l2_flush(1);
|
|
#endif
|
|
+#endif /* CONFIG_COLDFIRE */
|
|
}
|
|
EXPORT_SYMBOL(cache_push);
|
|
|
|
--- a/fs/namespace.c
|
|
+++ b/fs/namespace.c
|
|
@@ -3,6 +3,10 @@
|
|
*
|
|
* (C) Copyright Al Viro 2000, 2001
|
|
* Released under GPL v2.
|
|
+ * (c) Copyright Freescale Semiconductor, Inc. 2008, 2009
|
|
+ * Change to align on page size for coldfire
|
|
+ * Jason Jin Jason.Jin@freescale.com
|
|
+ * Shrek Wu B16972@freescale.com
|
|
*
|
|
* Based on code from fs/super.c, copyright Linus Torvalds and others.
|
|
* Heavily rewritten.
|
|
@@ -1858,7 +1862,11 @@ int copy_mount_options(const void __user
|
|
/* copy_from_user cannot cross TASK_SIZE ! */
|
|
size = TASK_SIZE - (unsigned long)data;
|
|
if (size > PAGE_SIZE)
|
|
+#ifndef CONFIG_COLDFIRE
|
|
size = PAGE_SIZE;
|
|
+#else
|
|
+ size = PAGE_SIZE - ((unsigned long)data & ~PAGE_MASK);
|
|
+#endif
|
|
|
|
i = size - exact_copy_from_user((void *)page, data, size);
|
|
if (!i) {
|
|
--- a/include/linux/fsl_devices.h
|
|
+++ b/include/linux/fsl_devices.h
|
|
@@ -6,7 +6,7 @@
|
|
*
|
|
* Maintainer: Kumar Gala <galak@kernel.crashing.org>
|
|
*
|
|
- * Copyright 2004 Freescale Semiconductor, Inc
|
|
+ * Copyright 2004-2008 Freescale Semiconductor, Inc
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
@@ -18,6 +18,7 @@
|
|
#define _FSL_DEVICE_H_
|
|
|
|
#include <linux/types.h>
|
|
+#include <linux/interrupt.h>
|
|
|
|
/*
|
|
* Some conventions on how we handle peripherals on Freescale chips
|
|
@@ -58,11 +59,42 @@ enum fsl_usb2_phy_modes {
|
|
FSL_USB2_PHY_SERIAL,
|
|
};
|
|
|
|
+struct platform_device;
|
|
struct fsl_usb2_platform_data {
|
|
/* board specific information */
|
|
enum fsl_usb2_operating_modes operating_mode;
|
|
enum fsl_usb2_phy_modes phy_mode;
|
|
unsigned int port_enables;
|
|
+
|
|
+ char *name; /* pretty print */
|
|
+ int (*platform_init) (struct platform_device *);
|
|
+ void (*platform_uninit) (struct fsl_usb2_platform_data *);
|
|
+ void __iomem *regs; /* ioremap'd register base */
|
|
+ u32 xcvr_type; /* PORTSC_PTS_* */
|
|
+ char *transceiver; /* transceiver name */
|
|
+ unsigned power_budget; /* for hcd->power_budget */
|
|
+ struct platform_device *pdev;
|
|
+ struct fsl_xcvr_ops *xcvr_ops;
|
|
+ int (*gpio_usb_active) (void);
|
|
+ void (*gpio_usb_inactive) (void);
|
|
+ unsigned big_endian_mmio : 1;
|
|
+ unsigned big_endian_desc : 1;
|
|
+ unsigned es : 1; /* need USBMODE:ES */
|
|
+ unsigned have_sysif_regs : 1;
|
|
+ unsigned le_setup_buf : 1;
|
|
+ unsigned suspended : 1;
|
|
+ unsigned already_suspended : 1;
|
|
+
|
|
+ /* register save area for suspend/resume */
|
|
+ u32 pm_command;
|
|
+ u32 pm_status;
|
|
+ u32 pm_intr_enable;
|
|
+ u32 pm_frame_index;
|
|
+ u32 pm_segment;
|
|
+ u32 pm_frame_list;
|
|
+ u32 pm_async_next;
|
|
+ u32 pm_configured_flag;
|
|
+ u32 pm_portsc;
|
|
};
|
|
|
|
/* Flags in fsl_usb2_mph_platform_data */
|
|
@@ -92,4 +124,30 @@ struct mpc8xx_pcmcia_ops {
|
|
*/
|
|
int fsl_deep_sleep(void);
|
|
|
|
+struct fsl_ata_platform_data {
|
|
+#ifdef CONFIG_FSL_PATA_USE_DMA
|
|
+ int udma_mask; /* UDMA modes h/w can handle */
|
|
+ int fifo_alarm; /* value for fifo_alarm reg */
|
|
+ int max_sg; /* longest sglist h/w can handle */
|
|
+#endif
|
|
+ int (*init)(struct platform_device *pdev);
|
|
+ void (*exit)(void);
|
|
+ int (*get_clk_rate)(void);
|
|
+};
|
|
+
|
|
+struct coldfire_fec_platform_data {
|
|
+ int hash_table;
|
|
+ unsigned int *fec_hw;
|
|
+ void (*request_intrs)(struct net_device *dev,
|
|
+ irqreturn_t (*)(int, void *),
|
|
+ void *irq_privatedata);
|
|
+ void (*set_mii)(struct net_device *dev);
|
|
+ void (*get_mac)(struct net_device *dev);
|
|
+ void (*enable_phy_intr)(void);
|
|
+ void (*disable_phy_intr)(void);
|
|
+ void (*phy_ack_intr)(void);
|
|
+ void (*localhw_setup)(void);
|
|
+ void (*uncache)(unsigned long addr);
|
|
+ void (*platform_flush_cache)(void);
|
|
+};
|
|
#endif /* _FSL_DEVICE_H_ */
|