Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/scottwood/linux into next
Freescale updates from Scott: "Highlights include qbman support (a prerequisite for datapath drivers such as ethernet), a PCI DMA fix+improvement, reset handler changes, more 8xx optimizations, and some cleanups and fixes."
This commit is contained in:
@@ -1248,6 +1248,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
|
||||
.mmu_features = MMU_FTR_TYPE_8xx,
|
||||
.icache_bsize = 16,
|
||||
.dcache_bsize = 16,
|
||||
.machine_check = machine_check_8xx,
|
||||
.platform = "ppc823",
|
||||
},
|
||||
#endif /* CONFIG_8xx */
|
||||
|
@@ -226,7 +226,7 @@ i##n: \
|
||||
ret_from_except)
|
||||
|
||||
/* System reset */
|
||||
EXCEPTION(0x100, Reset, unknown_exception, EXC_XFER_STD)
|
||||
EXCEPTION(0x100, Reset, system_reset_exception, EXC_XFER_STD)
|
||||
|
||||
/* Machine check */
|
||||
. = 0x200
|
||||
@@ -321,7 +321,7 @@ SystemCall:
|
||||
#endif
|
||||
|
||||
InstructionTLBMiss:
|
||||
#ifdef CONFIG_8xx_CPU6
|
||||
#if defined(CONFIG_8xx_CPU6) || defined(CONFIG_MODULES) || defined (CONFIG_DEBUG_PAGEALLOC)
|
||||
mtspr SPRN_SPRG_SCRATCH2, r3
|
||||
#endif
|
||||
EXCEPTION_PROLOG_0
|
||||
@@ -329,23 +329,20 @@ InstructionTLBMiss:
|
||||
/* If we are faulting a kernel address, we have to use the
|
||||
* kernel page tables.
|
||||
*/
|
||||
mfspr r10, SPRN_SRR0 /* Get effective address of fault */
|
||||
INVALIDATE_ADJACENT_PAGES_CPU15(r11, r10)
|
||||
#if defined(CONFIG_MODULES) || defined (CONFIG_DEBUG_PAGEALLOC)
|
||||
/* Only modules will cause ITLB Misses as we always
|
||||
* pin the first 8MB of kernel memory */
|
||||
mfspr r11, SPRN_SRR0 /* Get effective address of fault */
|
||||
INVALIDATE_ADJACENT_PAGES_CPU15(r10, r11)
|
||||
mfcr r10
|
||||
IS_KERNEL(r11, r11)
|
||||
mfcr r3
|
||||
IS_KERNEL(r11, r10)
|
||||
#endif
|
||||
mfspr r11, SPRN_M_TW /* Get level 1 table */
|
||||
#if defined(CONFIG_MODULES) || defined (CONFIG_DEBUG_PAGEALLOC)
|
||||
BRANCH_UNLESS_KERNEL(3f)
|
||||
lis r11, (swapper_pg_dir-PAGE_OFFSET)@ha
|
||||
3:
|
||||
mtcr r10
|
||||
mfspr r10, SPRN_SRR0 /* Get effective address of fault */
|
||||
#else
|
||||
mfspr r10, SPRN_SRR0 /* Get effective address of fault */
|
||||
INVALIDATE_ADJACENT_PAGES_CPU15(r11, r10)
|
||||
mfspr r11, SPRN_M_TW /* Get level 1 table base address */
|
||||
mtcr r3
|
||||
#endif
|
||||
/* Insert level 1 index */
|
||||
rlwimi r11, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29
|
||||
@@ -377,58 +374,39 @@ InstructionTLBMiss:
|
||||
MTSPR_CPU6(SPRN_MI_RPN, r10, r3) /* Update TLB entry */
|
||||
|
||||
/* Restore registers */
|
||||
#ifdef CONFIG_8xx_CPU6
|
||||
#if defined(CONFIG_8xx_CPU6) || defined(CONFIG_MODULES) || defined (CONFIG_DEBUG_PAGEALLOC)
|
||||
mfspr r3, SPRN_SPRG_SCRATCH2
|
||||
#endif
|
||||
EXCEPTION_EPILOG_0
|
||||
rfi
|
||||
|
||||
/*
|
||||
* Bottom part of DataStoreTLBMiss handler for IMMR area
|
||||
* not enough space in the DataStoreTLBMiss area
|
||||
*/
|
||||
DTLBMissIMMR:
|
||||
mtcr r10
|
||||
/* Set 512k byte guarded page and mark it valid */
|
||||
li r10, MD_PS512K | MD_GUARDED | MD_SVALID
|
||||
MTSPR_CPU6(SPRN_MD_TWC, r10, r11)
|
||||
mfspr r10, SPRN_IMMR /* Get current IMMR */
|
||||
rlwinm r10, r10, 0, 0xfff80000 /* Get 512 kbytes boundary */
|
||||
ori r10, r10, 0xf0 | MD_SPS16K | _PAGE_SHARED | _PAGE_DIRTY | \
|
||||
_PAGE_PRESENT | _PAGE_NO_CACHE
|
||||
MTSPR_CPU6(SPRN_MD_RPN, r10, r11) /* Update TLB entry */
|
||||
|
||||
li r11, RPN_PATTERN
|
||||
mtspr SPRN_DAR, r11 /* Tag DAR */
|
||||
EXCEPTION_EPILOG_0
|
||||
rfi
|
||||
|
||||
. = 0x1200
|
||||
DataStoreTLBMiss:
|
||||
mtspr SPRN_SPRG_SCRATCH2, r3
|
||||
EXCEPTION_PROLOG_0
|
||||
mfcr r10
|
||||
mfcr r3
|
||||
|
||||
/* If we are faulting a kernel address, we have to use the
|
||||
* kernel page tables.
|
||||
*/
|
||||
mfspr r11, SPRN_MD_EPN
|
||||
rlwinm r11, r11, 16, 0xfff8
|
||||
mfspr r10, SPRN_MD_EPN
|
||||
rlwinm r10, r10, 16, 0xfff8
|
||||
cmpli cr0, r10, PAGE_OFFSET@h
|
||||
mfspr r11, SPRN_M_TW /* Get level 1 table */
|
||||
blt+ 3f
|
||||
#ifndef CONFIG_PIN_TLB_IMMR
|
||||
cmpli cr0, r11, VIRT_IMMR_BASE@h
|
||||
cmpli cr0, r10, VIRT_IMMR_BASE@h
|
||||
#endif
|
||||
cmpli cr7, r11, PAGE_OFFSET@h
|
||||
_ENTRY(DTLBMiss_cmp)
|
||||
cmpli cr7, r10, (PAGE_OFFSET + 0x1800000)@h
|
||||
lis r11, (swapper_pg_dir-PAGE_OFFSET)@ha
|
||||
#ifndef CONFIG_PIN_TLB_IMMR
|
||||
_ENTRY(DTLBMiss_jmp)
|
||||
beq- DTLBMissIMMR
|
||||
#endif
|
||||
bge- cr7, 4f
|
||||
|
||||
mfspr r11, SPRN_M_TW /* Get level 1 table */
|
||||
blt cr7, DTLBMissLinear
|
||||
3:
|
||||
mtcr r10
|
||||
#ifdef CONFIG_8xx_CPU6
|
||||
mtspr SPRN_SPRG_SCRATCH2, r3
|
||||
#endif
|
||||
mtcr r3
|
||||
mfspr r10, SPRN_MD_EPN
|
||||
|
||||
/* Insert level 1 index */
|
||||
@@ -481,30 +459,7 @@ _ENTRY(DTLBMiss_jmp)
|
||||
MTSPR_CPU6(SPRN_MD_RPN, r10, r3) /* Update TLB entry */
|
||||
|
||||
/* Restore registers */
|
||||
#ifdef CONFIG_8xx_CPU6
|
||||
mfspr r3, SPRN_SPRG_SCRATCH2
|
||||
#endif
|
||||
mtspr SPRN_DAR, r11 /* Tag DAR */
|
||||
EXCEPTION_EPILOG_0
|
||||
rfi
|
||||
|
||||
4:
|
||||
_ENTRY(DTLBMiss_cmp)
|
||||
cmpli cr0, r11, (PAGE_OFFSET + 0x1800000)@h
|
||||
lis r11, (swapper_pg_dir-PAGE_OFFSET)@ha
|
||||
bge- 3b
|
||||
|
||||
mtcr r10
|
||||
/* Set 8M byte page and mark it valid */
|
||||
li r10, MD_PS8MEG | MD_SVALID
|
||||
MTSPR_CPU6(SPRN_MD_TWC, r10, r11)
|
||||
mfspr r10, SPRN_MD_EPN
|
||||
rlwinm r10, r10, 0, 0x0f800000 /* 8xx supports max 256Mb RAM */
|
||||
ori r10, r10, 0xf0 | MD_SPS16K | _PAGE_SHARED | _PAGE_DIRTY | \
|
||||
_PAGE_PRESENT
|
||||
MTSPR_CPU6(SPRN_MD_RPN, r10, r11) /* Update TLB entry */
|
||||
|
||||
li r11, RPN_PATTERN
|
||||
mtspr SPRN_DAR, r11 /* Tag DAR */
|
||||
EXCEPTION_EPILOG_0
|
||||
rfi
|
||||
@@ -570,6 +525,43 @@ DARFixed:/* Return from dcbx instruction bug workaround */
|
||||
|
||||
. = 0x2000
|
||||
|
||||
/*
|
||||
* Bottom part of DataStoreTLBMiss handlers for IMMR area and linear RAM.
|
||||
* not enough space in the DataStoreTLBMiss area.
|
||||
*/
|
||||
DTLBMissIMMR:
|
||||
mtcr r3
|
||||
/* Set 512k byte guarded page and mark it valid */
|
||||
li r10, MD_PS512K | MD_GUARDED | MD_SVALID
|
||||
MTSPR_CPU6(SPRN_MD_TWC, r10, r11)
|
||||
mfspr r10, SPRN_IMMR /* Get current IMMR */
|
||||
rlwinm r10, r10, 0, 0xfff80000 /* Get 512 kbytes boundary */
|
||||
ori r10, r10, 0xf0 | MD_SPS16K | _PAGE_SHARED | _PAGE_DIRTY | \
|
||||
_PAGE_PRESENT | _PAGE_NO_CACHE
|
||||
MTSPR_CPU6(SPRN_MD_RPN, r10, r11) /* Update TLB entry */
|
||||
|
||||
li r11, RPN_PATTERN
|
||||
mtspr SPRN_DAR, r11 /* Tag DAR */
|
||||
mfspr r3, SPRN_SPRG_SCRATCH2
|
||||
EXCEPTION_EPILOG_0
|
||||
rfi
|
||||
|
||||
DTLBMissLinear:
|
||||
mtcr r3
|
||||
/* Set 8M byte page and mark it valid */
|
||||
li r11, MD_PS8MEG | MD_SVALID
|
||||
MTSPR_CPU6(SPRN_MD_TWC, r11, r3)
|
||||
rlwinm r10, r10, 16, 0x0f800000 /* 8xx supports max 256Mb RAM */
|
||||
ori r10, r10, 0xf0 | MD_SPS16K | _PAGE_SHARED | _PAGE_DIRTY | \
|
||||
_PAGE_PRESENT
|
||||
MTSPR_CPU6(SPRN_MD_RPN, r10, r11) /* Update TLB entry */
|
||||
|
||||
li r11, RPN_PATTERN
|
||||
mtspr SPRN_DAR, r11 /* Tag DAR */
|
||||
mfspr r3, SPRN_SPRG_SCRATCH2
|
||||
EXCEPTION_EPILOG_0
|
||||
rfi
|
||||
|
||||
/* This is the procedure to calculate the data EA for buggy dcbx,dcbi instructions
|
||||
* by decoding the registers used by the dcbx instruction and adding them.
|
||||
* DAR is set to the calculated address.
|
||||
@@ -586,7 +578,9 @@ FixupDAR:/* Entry point for dcbx workaround. */
|
||||
rlwinm r11, r10, 16, 0xfff8
|
||||
_ENTRY(FixupDAR_cmp)
|
||||
cmpli cr7, r11, (PAGE_OFFSET + 0x1800000)@h
|
||||
blt- cr7, 200f
|
||||
/* create physical page address from effective address */
|
||||
tophys(r11, r10)
|
||||
blt- cr7, 201f
|
||||
lis r11, (swapper_pg_dir-PAGE_OFFSET)@ha
|
||||
/* Insert level 1 index */
|
||||
3: rlwimi r11, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29
|
||||
@@ -616,10 +610,6 @@ _ENTRY(FixupDAR_cmp)
|
||||
141: mfspr r10,SPRN_SPRG_SCRATCH2
|
||||
b DARFixed /* Nope, go back to normal TLB processing */
|
||||
|
||||
/* create physical page address from effective address */
|
||||
200: tophys(r11, r10)
|
||||
b 201b
|
||||
|
||||
144: mfspr r10, SPRN_DSISR
|
||||
rlwinm r10, r10,0,7,5 /* Clear store bit for buggy dcbst insn */
|
||||
mtspr SPRN_DSISR, r10
|
||||
|
@@ -131,15 +131,26 @@ void machine_shutdown(void)
|
||||
ppc_md.machine_shutdown();
|
||||
}
|
||||
|
||||
static void machine_hang(void)
|
||||
{
|
||||
pr_emerg("System Halted, OK to turn off power\n");
|
||||
local_irq_disable();
|
||||
while (1)
|
||||
;
|
||||
}
|
||||
|
||||
void machine_restart(char *cmd)
|
||||
{
|
||||
machine_shutdown();
|
||||
if (ppc_md.restart)
|
||||
ppc_md.restart(cmd);
|
||||
|
||||
smp_send_stop();
|
||||
printk(KERN_EMERG "System Halted, OK to turn off power\n");
|
||||
local_irq_disable();
|
||||
while (1) ;
|
||||
|
||||
do_kernel_restart(cmd);
|
||||
mdelay(1000);
|
||||
|
||||
machine_hang();
|
||||
}
|
||||
|
||||
void machine_power_off(void)
|
||||
@@ -147,10 +158,9 @@ void machine_power_off(void)
|
||||
machine_shutdown();
|
||||
if (pm_power_off)
|
||||
pm_power_off();
|
||||
|
||||
smp_send_stop();
|
||||
printk(KERN_EMERG "System Halted, OK to turn off power\n");
|
||||
local_irq_disable();
|
||||
while (1) ;
|
||||
machine_hang();
|
||||
}
|
||||
/* Used by the G5 thermal driver */
|
||||
EXPORT_SYMBOL_GPL(machine_power_off);
|
||||
@@ -163,10 +173,9 @@ void machine_halt(void)
|
||||
machine_shutdown();
|
||||
if (ppc_md.halt)
|
||||
ppc_md.halt();
|
||||
|
||||
smp_send_stop();
|
||||
printk(KERN_EMERG "System Halted, OK to turn off power\n");
|
||||
local_irq_disable();
|
||||
while (1) ;
|
||||
machine_hang();
|
||||
}
|
||||
|
||||
|
||||
|
@@ -273,7 +273,6 @@ void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr)
|
||||
force_sig_info(signr, &info, current);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
void system_reset_exception(struct pt_regs *regs)
|
||||
{
|
||||
/* See if any machine dependent calls */
|
||||
@@ -291,6 +290,7 @@ void system_reset_exception(struct pt_regs *regs)
|
||||
/* What should we do here? We could issue a shutdown or hard reset. */
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
/*
|
||||
* This function is called in real mode. Strictly no printk's please.
|
||||
*
|
||||
@@ -352,12 +352,11 @@ static inline int check_io_access(struct pt_regs *regs)
|
||||
* For the debug message, we look at the preceding
|
||||
* load or store.
|
||||
*/
|
||||
if (*nip == 0x60000000) /* nop */
|
||||
if (*nip == PPC_INST_NOP)
|
||||
nip -= 2;
|
||||
else if (*nip == 0x4c00012c) /* isync */
|
||||
else if (*nip == PPC_INST_ISYNC)
|
||||
--nip;
|
||||
if (*nip == 0x7c0004ac || (*nip >> 26) == 3) {
|
||||
/* sync or twi */
|
||||
if (*nip == PPC_INST_SYNC || (*nip >> 26) == OP_TRAP) {
|
||||
unsigned int rb;
|
||||
|
||||
--nip;
|
||||
@@ -668,6 +667,31 @@ int machine_check_e200(struct pt_regs *regs)
|
||||
|
||||
return 0;
|
||||
}
|
||||
#elif defined(CONFIG_PPC_8xx)
|
||||
int machine_check_8xx(struct pt_regs *regs)
|
||||
{
|
||||
unsigned long reason = get_mc_reason(regs);
|
||||
|
||||
pr_err("Machine check in kernel mode.\n");
|
||||
pr_err("Caused by (from SRR1=%lx): ", reason);
|
||||
if (reason & 0x40000000)
|
||||
pr_err("Fetch error at address %lx\n", regs->nip);
|
||||
else
|
||||
pr_err("Data access error at address %lx\n", regs->dar);
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
/* the qspan pci read routines can cause machine checks -- Cort
|
||||
*
|
||||
* yuck !!! that totally needs to go away ! There are better ways
|
||||
* to deal with that than having a wart in the mcheck handler.
|
||||
* -- BenH
|
||||
*/
|
||||
bad_page_fault(regs, regs->dar, SIGBUS);
|
||||
return 1;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
int machine_check_generic(struct pt_regs *regs)
|
||||
{
|
||||
@@ -727,17 +751,6 @@ void machine_check_exception(struct pt_regs *regs)
|
||||
if (recover > 0)
|
||||
goto bail;
|
||||
|
||||
#if defined(CONFIG_8xx) && defined(CONFIG_PCI)
|
||||
/* the qspan pci read routines can cause machine checks -- Cort
|
||||
*
|
||||
* yuck !!! that totally needs to go away ! There are better ways
|
||||
* to deal with that than having a wart in the mcheck handler.
|
||||
* -- BenH
|
||||
*/
|
||||
bad_page_fault(regs, regs->dar, SIGBUS);
|
||||
goto bail;
|
||||
#endif
|
||||
|
||||
if (debugger_fault_handler(regs))
|
||||
goto bail;
|
||||
|
||||
|
Reference in New Issue
Block a user