Merge branch 'for_paulus' of master.kernel.org:/pub/scm/linux/kernel/git/galak/powerpc
This commit is contained in:
commit
973c1fabc7
12 changed files with 64 additions and 47 deletions
|
@ -707,7 +707,7 @@ config FORCE_MAX_ZONEORDER
|
||||||
|
|
||||||
config MATH_EMULATION
|
config MATH_EMULATION
|
||||||
bool "Math emulation"
|
bool "Math emulation"
|
||||||
depends on 4xx || 8xx || E200 || E500
|
depends on 4xx || 8xx || E200 || PPC_83xx || E500
|
||||||
---help---
|
---help---
|
||||||
Some PowerPC chips designed for embedded applications do not have
|
Some PowerPC chips designed for embedded applications do not have
|
||||||
a floating-point unit and therefore do not implement the
|
a floating-point unit and therefore do not implement the
|
||||||
|
|
|
@ -833,7 +833,7 @@ static struct cpu_spec cpu_specs[] = {
|
||||||
.pvr_mask = 0x7fff0000,
|
.pvr_mask = 0x7fff0000,
|
||||||
.pvr_value = 0x00840000,
|
.pvr_value = 0x00840000,
|
||||||
.cpu_name = "e300c2",
|
.cpu_name = "e300c2",
|
||||||
.cpu_features = CPU_FTRS_E300,
|
.cpu_features = CPU_FTRS_E300C2,
|
||||||
.cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
|
.cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
|
||||||
.icache_bsize = 32,
|
.icache_bsize = 32,
|
||||||
.dcache_bsize = 32,
|
.dcache_bsize = 32,
|
||||||
|
@ -1136,8 +1136,7 @@ static struct cpu_spec cpu_specs[] = {
|
||||||
.pvr_mask = 0xff000fff,
|
.pvr_mask = 0xff000fff,
|
||||||
.pvr_value = 0x53000890,
|
.pvr_value = 0x53000890,
|
||||||
.cpu_name = "440SPe Rev. A",
|
.cpu_name = "440SPe Rev. A",
|
||||||
.cpu_features = CPU_FTR_SPLIT_ID_CACHE |
|
.cpu_features = CPU_FTRS_44X,
|
||||||
CPU_FTR_USE_TB,
|
|
||||||
.cpu_user_features = COMMON_USER_BOOKE,
|
.cpu_user_features = COMMON_USER_BOOKE,
|
||||||
.icache_bsize = 32,
|
.icache_bsize = 32,
|
||||||
.dcache_bsize = 32,
|
.dcache_bsize = 32,
|
||||||
|
|
|
@ -437,6 +437,13 @@ Alignment:
|
||||||
/* Floating-point unavailable */
|
/* Floating-point unavailable */
|
||||||
. = 0x800
|
. = 0x800
|
||||||
FPUnavailable:
|
FPUnavailable:
|
||||||
|
BEGIN_FTR_SECTION
|
||||||
|
/*
|
||||||
|
* Certain Freescale cores don't have a FPU and treat fp instructions
|
||||||
|
* as a FP Unavailable exception. Redirect to illegal/emulation handling.
|
||||||
|
*/
|
||||||
|
b ProgramCheck
|
||||||
|
END_FTR_SECTION_IFSET(CPU_FTR_FPU_UNAVAILABLE)
|
||||||
EXCEPTION_PROLOG
|
EXCEPTION_PROLOG
|
||||||
bne load_up_fpu /* if from user, just load it up */
|
bne load_up_fpu /* if from user, just load it up */
|
||||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||||
|
|
|
@ -109,9 +109,7 @@ int of_device_register(struct of_device *ofdev)
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
device_create_file(&ofdev->dev, &dev_attr_devspec);
|
return device_create_file(&ofdev->dev, &dev_attr_devspec);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void of_device_unregister(struct of_device *ofdev)
|
void of_device_unregister(struct of_device *ofdev)
|
||||||
|
|
|
@ -208,7 +208,7 @@ EXPORT_SYMBOL(mmu_hash_lock); /* For MOL */
|
||||||
extern long *intercept_table;
|
extern long *intercept_table;
|
||||||
EXPORT_SYMBOL(intercept_table);
|
EXPORT_SYMBOL(intercept_table);
|
||||||
#endif /* CONFIG_PPC_STD_MMU_32 */
|
#endif /* CONFIG_PPC_STD_MMU_32 */
|
||||||
#if defined(CONFIG_40x) || defined(CONFIG_BOOKE)
|
#ifdef CONFIG_PPC_DCR_NATIVE
|
||||||
EXPORT_SYMBOL(__mtdcr);
|
EXPORT_SYMBOL(__mtdcr);
|
||||||
EXPORT_SYMBOL(__mfdcr);
|
EXPORT_SYMBOL(__mfdcr);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -782,6 +782,8 @@ void __kprobes program_check_exception(struct pt_regs *regs)
|
||||||
unsigned int reason = get_reason(regs);
|
unsigned int reason = get_reason(regs);
|
||||||
extern int do_mathemu(struct pt_regs *regs);
|
extern int do_mathemu(struct pt_regs *regs);
|
||||||
|
|
||||||
|
/* We can now get here via a FP Unavailable exception if the core
|
||||||
|
* has no FPU, in that case no reason flags will be set */
|
||||||
#ifdef CONFIG_MATH_EMULATION
|
#ifdef CONFIG_MATH_EMULATION
|
||||||
/* (reason & REASON_ILLEGAL) would be the obvious thing here,
|
/* (reason & REASON_ILLEGAL) would be the obvious thing here,
|
||||||
* but there seems to be a hardware bug on the 405GP (RevD)
|
* but there seems to be a hardware bug on the 405GP (RevD)
|
||||||
|
|
|
@ -5,7 +5,8 @@ endif
|
||||||
obj-$(CONFIG_MPIC) += mpic.o
|
obj-$(CONFIG_MPIC) += mpic.o
|
||||||
obj-$(CONFIG_PPC_INDIRECT_PCI) += indirect_pci.o
|
obj-$(CONFIG_PPC_INDIRECT_PCI) += indirect_pci.o
|
||||||
obj-$(CONFIG_PPC_MPC106) += grackle.o
|
obj-$(CONFIG_PPC_MPC106) += grackle.o
|
||||||
obj-$(CONFIG_PPC_DCR) += dcr.o dcr-low.o
|
obj-$(CONFIG_PPC_DCR) += dcr.o
|
||||||
|
obj-$(CONFIG_PPC_DCR_NATIVE) += dcr-low.o
|
||||||
obj-$(CONFIG_U3_DART) += dart_iommu.o
|
obj-$(CONFIG_U3_DART) += dart_iommu.o
|
||||||
obj-$(CONFIG_MMIO_NVRAM) += mmio_nvram.o
|
obj-$(CONFIG_MMIO_NVRAM) += mmio_nvram.o
|
||||||
obj-$(CONFIG_FSL_SOC) += fsl_soc.o
|
obj-$(CONFIG_FSL_SOC) += fsl_soc.o
|
||||||
|
|
|
@ -126,6 +126,7 @@ extern void do_feature_fixups(unsigned long value, void *fixup_start,
|
||||||
#define CPU_FTR_NODSISRALIGN ASM_CONST(0x0000000000100000)
|
#define CPU_FTR_NODSISRALIGN ASM_CONST(0x0000000000100000)
|
||||||
#define CPU_FTR_PPC_LE ASM_CONST(0x0000000000200000)
|
#define CPU_FTR_PPC_LE ASM_CONST(0x0000000000200000)
|
||||||
#define CPU_FTR_REAL_LE ASM_CONST(0x0000000000400000)
|
#define CPU_FTR_REAL_LE ASM_CONST(0x0000000000400000)
|
||||||
|
#define CPU_FTR_FPU_UNAVAILABLE ASM_CONST(0x0000000000800000)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add the 64-bit processor unique features in the top half of the word;
|
* Add the 64-bit processor unique features in the top half of the word;
|
||||||
|
@ -296,6 +297,9 @@ extern void do_feature_fixups(unsigned long value, void *fixup_start,
|
||||||
#define CPU_FTRS_E300 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE | \
|
#define CPU_FTRS_E300 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE | \
|
||||||
CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_HAS_HIGH_BATS | \
|
CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_HAS_HIGH_BATS | \
|
||||||
CPU_FTR_COMMON)
|
CPU_FTR_COMMON)
|
||||||
|
#define CPU_FTRS_E300C2 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE | \
|
||||||
|
CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_HAS_HIGH_BATS | \
|
||||||
|
CPU_FTR_COMMON | CPU_FTR_FPU_UNAVAILABLE)
|
||||||
#define CPU_FTRS_CLASSIC32 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
#define CPU_FTRS_CLASSIC32 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \
|
||||||
CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE)
|
CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE)
|
||||||
#define CPU_FTRS_8XX (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB)
|
#define CPU_FTRS_8XX (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB)
|
||||||
|
@ -366,7 +370,8 @@ enum {
|
||||||
CPU_FTRS_7450_21 | CPU_FTRS_7450_23 | CPU_FTRS_7455_1 |
|
CPU_FTRS_7450_21 | CPU_FTRS_7450_23 | CPU_FTRS_7455_1 |
|
||||||
CPU_FTRS_7455_20 | CPU_FTRS_7455 | CPU_FTRS_7447_10 |
|
CPU_FTRS_7455_20 | CPU_FTRS_7455 | CPU_FTRS_7447_10 |
|
||||||
CPU_FTRS_7447 | CPU_FTRS_7447A | CPU_FTRS_82XX |
|
CPU_FTRS_7447 | CPU_FTRS_7447A | CPU_FTRS_82XX |
|
||||||
CPU_FTRS_G2_LE | CPU_FTRS_E300 | CPU_FTRS_CLASSIC32 |
|
CPU_FTRS_G2_LE | CPU_FTRS_E300 | CPU_FTRS_E300C2 |
|
||||||
|
CPU_FTRS_CLASSIC32 |
|
||||||
#else
|
#else
|
||||||
CPU_FTRS_GENERIC_32 |
|
CPU_FTRS_GENERIC_32 |
|
||||||
#endif
|
#endif
|
||||||
|
@ -405,7 +410,8 @@ enum {
|
||||||
CPU_FTRS_7450_21 & CPU_FTRS_7450_23 & CPU_FTRS_7455_1 &
|
CPU_FTRS_7450_21 & CPU_FTRS_7450_23 & CPU_FTRS_7455_1 &
|
||||||
CPU_FTRS_7455_20 & CPU_FTRS_7455 & CPU_FTRS_7447_10 &
|
CPU_FTRS_7455_20 & CPU_FTRS_7455 & CPU_FTRS_7447_10 &
|
||||||
CPU_FTRS_7447 & CPU_FTRS_7447A & CPU_FTRS_82XX &
|
CPU_FTRS_7447 & CPU_FTRS_7447A & CPU_FTRS_82XX &
|
||||||
CPU_FTRS_G2_LE & CPU_FTRS_E300 & CPU_FTRS_CLASSIC32 &
|
CPU_FTRS_G2_LE & CPU_FTRS_E300 & CPU_FTRS_E300C2 &
|
||||||
|
CPU_FTRS_CLASSIC32 &
|
||||||
#else
|
#else
|
||||||
CPU_FTRS_GENERIC_32 &
|
CPU_FTRS_GENERIC_32 &
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -20,8 +20,7 @@
|
||||||
#ifndef _ASM_POWERPC_DCR_NATIVE_H
|
#ifndef _ASM_POWERPC_DCR_NATIVE_H
|
||||||
#define _ASM_POWERPC_DCR_NATIVE_H
|
#define _ASM_POWERPC_DCR_NATIVE_H
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
#include <asm/reg.h>
|
|
||||||
|
|
||||||
typedef struct {} dcr_host_t;
|
typedef struct {} dcr_host_t;
|
||||||
|
|
||||||
|
@ -32,7 +31,41 @@ typedef struct {} dcr_host_t;
|
||||||
#define dcr_read(host, dcr_n) mfdcr(dcr_n)
|
#define dcr_read(host, dcr_n) mfdcr(dcr_n)
|
||||||
#define dcr_write(host, dcr_n, value) mtdcr(dcr_n, value)
|
#define dcr_write(host, dcr_n, value) mtdcr(dcr_n, value)
|
||||||
|
|
||||||
|
/* Device Control Registers */
|
||||||
|
void __mtdcr(int reg, unsigned int val);
|
||||||
|
unsigned int __mfdcr(int reg);
|
||||||
|
#define mfdcr(rn) \
|
||||||
|
({unsigned int rval; \
|
||||||
|
if (__builtin_constant_p(rn)) \
|
||||||
|
asm volatile("mfdcr %0," __stringify(rn) \
|
||||||
|
: "=r" (rval)); \
|
||||||
|
else \
|
||||||
|
rval = __mfdcr(rn); \
|
||||||
|
rval;})
|
||||||
|
|
||||||
|
#define mtdcr(rn, v) \
|
||||||
|
do { \
|
||||||
|
if (__builtin_constant_p(rn)) \
|
||||||
|
asm volatile("mtdcr " __stringify(rn) ",%0" \
|
||||||
|
: : "r" (v)); \
|
||||||
|
else \
|
||||||
|
__mtdcr(rn, v); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* R/W of indirect DCRs make use of standard naming conventions for DCRs */
|
||||||
|
#define mfdcri(base, reg) \
|
||||||
|
({ \
|
||||||
|
mtdcr(base ## _CFGADDR, base ## _ ## reg); \
|
||||||
|
mfdcr(base ## _CFGDATA); \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define mtdcri(base, reg, data) \
|
||||||
|
do { \
|
||||||
|
mtdcr(base ## _CFGADDR, base ## _ ## reg); \
|
||||||
|
mtdcr(base ## _CFGDATA, data); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif /* __ASSEMBLY__ */
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
#endif /* _ASM_POWERPC_DCR_NATIVE_H */
|
#endif /* _ASM_POWERPC_DCR_NATIVE_H */
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#ifndef _ASM_POWERPC_DCR_H
|
#ifndef _ASM_POWERPC_DCR_H
|
||||||
#define _ASM_POWERPC_DCR_H
|
#define _ASM_POWERPC_DCR_H
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
#ifdef CONFIG_PPC_DCR
|
||||||
|
|
||||||
#ifdef CONFIG_PPC_DCR_NATIVE
|
#ifdef CONFIG_PPC_DCR_NATIVE
|
||||||
#include <asm/dcr-native.h>
|
#include <asm/dcr-native.h>
|
||||||
|
@ -38,5 +39,6 @@ extern unsigned int dcr_resource_len(struct device_node *np,
|
||||||
unsigned int index);
|
unsigned int index);
|
||||||
#endif /* CONFIG_PPC_MERGE */
|
#endif /* CONFIG_PPC_MERGE */
|
||||||
|
|
||||||
|
#endif /* CONFIG_PPC_DCR */
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
#endif /* _ASM_POWERPC_DCR_H */
|
#endif /* _ASM_POWERPC_DCR_H */
|
||||||
|
|
|
@ -9,41 +9,9 @@
|
||||||
#ifndef __ASM_PPC_REG_BOOKE_H__
|
#ifndef __ASM_PPC_REG_BOOKE_H__
|
||||||
#define __ASM_PPC_REG_BOOKE_H__
|
#define __ASM_PPC_REG_BOOKE_H__
|
||||||
|
|
||||||
|
#include <asm/dcr.h>
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
/* Device Control Registers */
|
|
||||||
void __mtdcr(int reg, unsigned int val);
|
|
||||||
unsigned int __mfdcr(int reg);
|
|
||||||
#define mfdcr(rn) \
|
|
||||||
({unsigned int rval; \
|
|
||||||
if (__builtin_constant_p(rn)) \
|
|
||||||
asm volatile("mfdcr %0," __stringify(rn) \
|
|
||||||
: "=r" (rval)); \
|
|
||||||
else \
|
|
||||||
rval = __mfdcr(rn); \
|
|
||||||
rval;})
|
|
||||||
|
|
||||||
#define mtdcr(rn, v) \
|
|
||||||
do { \
|
|
||||||
if (__builtin_constant_p(rn)) \
|
|
||||||
asm volatile("mtdcr " __stringify(rn) ",%0" \
|
|
||||||
: : "r" (v)); \
|
|
||||||
else \
|
|
||||||
__mtdcr(rn, v); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* R/W of indirect DCRs make use of standard naming conventions for DCRs */
|
|
||||||
#define mfdcri(base, reg) \
|
|
||||||
({ \
|
|
||||||
mtdcr(base ## _CFGADDR, base ## _ ## reg); \
|
|
||||||
mfdcr(base ## _CFGDATA); \
|
|
||||||
})
|
|
||||||
|
|
||||||
#define mtdcri(base, reg, data) \
|
|
||||||
do { \
|
|
||||||
mtdcr(base ## _CFGADDR, base ## _ ## reg); \
|
|
||||||
mtdcr(base ## _CFGDATA, data); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* Performance Monitor Registers */
|
/* Performance Monitor Registers */
|
||||||
#define mfpmr(rn) ({unsigned int rval; \
|
#define mfpmr(rn) ({unsigned int rval; \
|
||||||
asm volatile("mfpmr %0," __stringify(rn) \
|
asm volatile("mfpmr %0," __stringify(rn) \
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#define _FSL_DEVICE_H_
|
#define _FSL_DEVICE_H_
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
#include <linux/phy.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Some conventions on how we handle peripherals on Freescale chips
|
* Some conventions on how we handle peripherals on Freescale chips
|
||||||
|
|
Loading…
Reference in a new issue