Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/vapier/blackfin
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/vapier/blackfin: (21 commits) Blackfin: define HARDIRQ_BITS again for now arch/blackfin: Add kmalloc NULL tests Blackfin: add CPLB entries for Core B on-chip L1 SRAM regions Blackfin: work around anomaly 05000189 Blackfin: drop per-cpu loops_per_jiffy tracking Blackfin: fix bugs in GPIO resume code Blackfin: bf537-stamp: fix irq decl for AD7142 Blackfin: fix handling of IPEND in interrupt context save Blackfin: drop duplicate runtime checking of anomaly 05000448 Blackfin: fix incomplete renaming of the bfin-twi-lcd driver Blackfin: fix wrong CTS inversion Blackfin: update handling of anomaly 364 (wrong rev id in BF527-0.1) Blackfin: fix early_dma_memcpy() handling of busy channels Blackfin: handle BF561 Core B memory regions better when SMP=n Blackfin: fix miscompilation in lshrdi3 Blackfin: fix silent crash when no uClinux MTD filesystem exists Blackfin: restore exception banner when dumping crash info Blackfin: work around anomaly 05000281 Blackfin: update anomaly lists to match latest sheets/usage Blackfin: drop dead flash_probe call ...
This commit is contained in:
commit
ae42b9e1ca
28 changed files with 143 additions and 113 deletions
|
@ -223,9 +223,10 @@
|
||||||
[--sp] = RETN;
|
[--sp] = RETN;
|
||||||
[--sp] = RETE;
|
[--sp] = RETE;
|
||||||
[--sp] = SEQSTAT;
|
[--sp] = SEQSTAT;
|
||||||
#ifdef CONFIG_KGDB
|
#ifdef CONFIG_DEBUG_KERNEL
|
||||||
r1.l = lo(IPEND);
|
p1.l = lo(IPEND);
|
||||||
r1.h = hi(IPEND);
|
p1.h = hi(IPEND);
|
||||||
|
r1 = [p1];
|
||||||
[--sp] = r1;
|
[--sp] = r1;
|
||||||
#else
|
#else
|
||||||
[--sp] = r0; /* Skip IPEND as well. */
|
[--sp] = r0; /* Skip IPEND as well. */
|
||||||
|
|
|
@ -32,7 +32,6 @@ struct blackfin_cpudata {
|
||||||
struct task_struct *idle;
|
struct task_struct *idle;
|
||||||
unsigned int imemctl;
|
unsigned int imemctl;
|
||||||
unsigned int dmemctl;
|
unsigned int dmemctl;
|
||||||
unsigned long loops_per_jiffy;
|
|
||||||
unsigned long dcache_invld_count;
|
unsigned long dcache_invld_count;
|
||||||
unsigned long icache_invld_count;
|
unsigned long icache_invld_count;
|
||||||
};
|
};
|
||||||
|
|
|
@ -6,6 +6,9 @@
|
||||||
extern void ack_bad_irq(unsigned int irq);
|
extern void ack_bad_irq(unsigned int irq);
|
||||||
#define ack_bad_irq ack_bad_irq
|
#define ack_bad_irq ack_bad_irq
|
||||||
|
|
||||||
|
/* Define until common code gets sane defaults */
|
||||||
|
#define HARDIRQ_BITS 9
|
||||||
|
|
||||||
#include <asm-generic/hardirq.h>
|
#include <asm-generic/hardirq.h>
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -105,23 +105,16 @@ static inline uint32_t __pure bfin_revid(void)
|
||||||
/* Always use CHIPID, to work around ANOMALY_05000234 */
|
/* Always use CHIPID, to work around ANOMALY_05000234 */
|
||||||
uint32_t revid = (bfin_read_CHIPID() & CHIPID_VERSION) >> 28;
|
uint32_t revid = (bfin_read_CHIPID() & CHIPID_VERSION) >> 28;
|
||||||
|
|
||||||
#ifdef CONFIG_BF52x
|
#ifdef _BOOTROM_GET_DXE_ADDRESS_TWI
|
||||||
/* ANOMALY_05000357
|
/*
|
||||||
|
* ANOMALY_05000364
|
||||||
* Incorrect Revision Number in DSPID Register
|
* Incorrect Revision Number in DSPID Register
|
||||||
*/
|
*/
|
||||||
if (revid == 0)
|
if (ANOMALY_05000364 &&
|
||||||
switch (bfin_read16(_BOOTROM_GET_DXE_ADDRESS_TWI)) {
|
bfin_read16(_BOOTROM_GET_DXE_ADDRESS_TWI) == 0x2796)
|
||||||
case 0x0010:
|
revid = 1;
|
||||||
revid = 0;
|
|
||||||
break;
|
|
||||||
case 0x2796:
|
|
||||||
revid = 1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
revid = 0xFFFF;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return revid;
|
return revid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -253,32 +253,31 @@ void __init early_dma_memcpy(void *pdst, const void *psrc, size_t size)
|
||||||
BUG_ON(src % 4);
|
BUG_ON(src % 4);
|
||||||
BUG_ON(size % 4);
|
BUG_ON(size % 4);
|
||||||
|
|
||||||
|
src_ch = 0;
|
||||||
|
/* Find an avalible memDMA channel */
|
||||||
|
while (1) {
|
||||||
|
if (src_ch == (struct dma_register *)MDMA_S0_NEXT_DESC_PTR) {
|
||||||
|
dst_ch = (struct dma_register *)MDMA_D1_NEXT_DESC_PTR;
|
||||||
|
src_ch = (struct dma_register *)MDMA_S1_NEXT_DESC_PTR;
|
||||||
|
} else {
|
||||||
|
dst_ch = (struct dma_register *)MDMA_D0_NEXT_DESC_PTR;
|
||||||
|
src_ch = (struct dma_register *)MDMA_S0_NEXT_DESC_PTR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!bfin_read16(&src_ch->cfg))
|
||||||
|
break;
|
||||||
|
else if (bfin_read16(&dst_ch->irq_status) & DMA_DONE) {
|
||||||
|
bfin_write16(&src_ch->cfg, 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Force a sync in case a previous config reset on this channel
|
/* Force a sync in case a previous config reset on this channel
|
||||||
* occurred. This is needed so subsequent writes to DMA registers
|
* occurred. This is needed so subsequent writes to DMA registers
|
||||||
* are not spuriously lost/corrupted.
|
* are not spuriously lost/corrupted.
|
||||||
*/
|
*/
|
||||||
__builtin_bfin_ssync();
|
__builtin_bfin_ssync();
|
||||||
|
|
||||||
src_ch = 0;
|
|
||||||
/* Find an avalible memDMA channel */
|
|
||||||
while (1) {
|
|
||||||
if (!src_ch || src_ch == (struct dma_register *)MDMA_S1_NEXT_DESC_PTR) {
|
|
||||||
dst_ch = (struct dma_register *)MDMA_D0_NEXT_DESC_PTR;
|
|
||||||
src_ch = (struct dma_register *)MDMA_S0_NEXT_DESC_PTR;
|
|
||||||
} else {
|
|
||||||
dst_ch = (struct dma_register *)MDMA_D1_NEXT_DESC_PTR;
|
|
||||||
src_ch = (struct dma_register *)MDMA_S1_NEXT_DESC_PTR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!bfin_read16(&src_ch->cfg)) {
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
if (bfin_read16(&src_ch->irq_status) & DMA_DONE)
|
|
||||||
bfin_write16(&src_ch->cfg, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Destination */
|
/* Destination */
|
||||||
bfin_write32(&dst_ch->start_addr, dst);
|
bfin_write32(&dst_ch->start_addr, dst);
|
||||||
bfin_write16(&dst_ch->x_count, size >> 2);
|
bfin_write16(&dst_ch->x_count, size >> 2);
|
||||||
|
|
|
@ -686,14 +686,12 @@ void bfin_gpio_pm_hibernate_restore(void)
|
||||||
*port_fer[bank] = gpio_bank_saved[bank].fer;
|
*port_fer[bank] = gpio_bank_saved[bank].fer;
|
||||||
#endif
|
#endif
|
||||||
gpio_array[bank]->inen = gpio_bank_saved[bank].inen;
|
gpio_array[bank]->inen = gpio_bank_saved[bank].inen;
|
||||||
|
gpio_array[bank]->data_set = gpio_bank_saved[bank].data
|
||||||
|
& gpio_bank_saved[bank].dir;
|
||||||
gpio_array[bank]->dir = gpio_bank_saved[bank].dir;
|
gpio_array[bank]->dir = gpio_bank_saved[bank].dir;
|
||||||
gpio_array[bank]->polar = gpio_bank_saved[bank].polar;
|
gpio_array[bank]->polar = gpio_bank_saved[bank].polar;
|
||||||
gpio_array[bank]->edge = gpio_bank_saved[bank].edge;
|
gpio_array[bank]->edge = gpio_bank_saved[bank].edge;
|
||||||
gpio_array[bank]->both = gpio_bank_saved[bank].both;
|
gpio_array[bank]->both = gpio_bank_saved[bank].both;
|
||||||
|
|
||||||
gpio_array[bank]->data_set = gpio_bank_saved[bank].data
|
|
||||||
| gpio_bank_saved[bank].dir;
|
|
||||||
|
|
||||||
gpio_array[bank]->maska = gpio_bank_saved[bank].maska;
|
gpio_array[bank]->maska = gpio_bank_saved[bank].maska;
|
||||||
}
|
}
|
||||||
AWA_DUMMY_READ(maska);
|
AWA_DUMMY_READ(maska);
|
||||||
|
|
|
@ -72,13 +72,24 @@ void __init generate_cplb_tables_cpu(unsigned int cpu)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Cover L1 memory. One 4M area for code and data each is enough. */
|
/* Cover L1 memory. One 4M area for code and data each is enough. */
|
||||||
if (L1_DATA_A_LENGTH || L1_DATA_B_LENGTH) {
|
if (cpu == 0) {
|
||||||
d_tbl[i_d].addr = L1_DATA_A_START;
|
if (L1_DATA_A_LENGTH || L1_DATA_B_LENGTH) {
|
||||||
d_tbl[i_d++].data = L1_DMEMORY | PAGE_SIZE_4MB;
|
d_tbl[i_d].addr = L1_DATA_A_START;
|
||||||
|
d_tbl[i_d++].data = L1_DMEMORY | PAGE_SIZE_4MB;
|
||||||
|
}
|
||||||
|
i_tbl[i_i].addr = L1_CODE_START;
|
||||||
|
i_tbl[i_i++].data = L1_IMEMORY | PAGE_SIZE_4MB;
|
||||||
}
|
}
|
||||||
i_tbl[i_i].addr = L1_CODE_START;
|
#ifdef CONFIG_SMP
|
||||||
i_tbl[i_i++].data = L1_IMEMORY | PAGE_SIZE_4MB;
|
else {
|
||||||
|
if (L1_DATA_A_LENGTH || L1_DATA_B_LENGTH) {
|
||||||
|
d_tbl[i_d].addr = COREB_L1_DATA_A_START;
|
||||||
|
d_tbl[i_d++].data = L1_DMEMORY | PAGE_SIZE_4MB;
|
||||||
|
}
|
||||||
|
i_tbl[i_i].addr = COREB_L1_CODE_START;
|
||||||
|
i_tbl[i_i++].data = L1_IMEMORY | PAGE_SIZE_4MB;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
first_switched_dcplb = i_d;
|
first_switched_dcplb = i_d;
|
||||||
first_switched_icplb = i_i;
|
first_switched_icplb = i_i;
|
||||||
|
|
||||||
|
|
|
@ -361,7 +361,7 @@ static inline
|
||||||
int in_mem_const(unsigned long addr, unsigned long size,
|
int in_mem_const(unsigned long addr, unsigned long size,
|
||||||
unsigned long const_addr, unsigned long const_size)
|
unsigned long const_addr, unsigned long const_size)
|
||||||
{
|
{
|
||||||
return in_mem_const_off(addr, 0, size, const_addr, const_size);
|
return in_mem_const_off(addr, size, 0, const_addr, const_size);
|
||||||
}
|
}
|
||||||
#define IN_ASYNC(bnum, bctlnum) \
|
#define IN_ASYNC(bnum, bctlnum) \
|
||||||
({ \
|
({ \
|
||||||
|
@ -390,13 +390,13 @@ int bfin_mem_access_type(unsigned long addr, unsigned long size)
|
||||||
if (in_mem_const(addr, size, L1_DATA_B_START, L1_DATA_B_LENGTH))
|
if (in_mem_const(addr, size, L1_DATA_B_START, L1_DATA_B_LENGTH))
|
||||||
return cpu == 0 ? BFIN_MEM_ACCESS_CORE : BFIN_MEM_ACCESS_IDMA;
|
return cpu == 0 ? BFIN_MEM_ACCESS_CORE : BFIN_MEM_ACCESS_IDMA;
|
||||||
#ifdef COREB_L1_CODE_START
|
#ifdef COREB_L1_CODE_START
|
||||||
if (in_mem_const(addr, size, COREB_L1_CODE_START, L1_CODE_LENGTH))
|
if (in_mem_const(addr, size, COREB_L1_CODE_START, COREB_L1_CODE_LENGTH))
|
||||||
return cpu == 1 ? BFIN_MEM_ACCESS_ITEST : BFIN_MEM_ACCESS_IDMA;
|
return cpu == 1 ? BFIN_MEM_ACCESS_ITEST : BFIN_MEM_ACCESS_IDMA;
|
||||||
if (in_mem_const(addr, size, COREB_L1_SCRATCH_START, L1_SCRATCH_LENGTH))
|
if (in_mem_const(addr, size, COREB_L1_SCRATCH_START, L1_SCRATCH_LENGTH))
|
||||||
return cpu == 1 ? BFIN_MEM_ACCESS_CORE_ONLY : -EFAULT;
|
return cpu == 1 ? BFIN_MEM_ACCESS_CORE_ONLY : -EFAULT;
|
||||||
if (in_mem_const(addr, size, COREB_L1_DATA_A_START, L1_DATA_A_LENGTH))
|
if (in_mem_const(addr, size, COREB_L1_DATA_A_START, COREB_L1_DATA_A_LENGTH))
|
||||||
return cpu == 1 ? BFIN_MEM_ACCESS_CORE : BFIN_MEM_ACCESS_IDMA;
|
return cpu == 1 ? BFIN_MEM_ACCESS_CORE : BFIN_MEM_ACCESS_IDMA;
|
||||||
if (in_mem_const(addr, size, COREB_L1_DATA_B_START, L1_DATA_B_LENGTH))
|
if (in_mem_const(addr, size, COREB_L1_DATA_B_START, COREB_L1_DATA_B_LENGTH))
|
||||||
return cpu == 1 ? BFIN_MEM_ACCESS_CORE : BFIN_MEM_ACCESS_IDMA;
|
return cpu == 1 ? BFIN_MEM_ACCESS_CORE : BFIN_MEM_ACCESS_IDMA;
|
||||||
#endif
|
#endif
|
||||||
if (in_mem_const(addr, size, L2_START, L2_LENGTH))
|
if (in_mem_const(addr, size, L2_START, L2_LENGTH))
|
||||||
|
@ -472,13 +472,13 @@ int _access_ok(unsigned long addr, unsigned long size)
|
||||||
if (in_mem_const_off(addr, size, _ebss_b_l1 - _sdata_b_l1, L1_DATA_B_START, L1_DATA_B_LENGTH))
|
if (in_mem_const_off(addr, size, _ebss_b_l1 - _sdata_b_l1, L1_DATA_B_START, L1_DATA_B_LENGTH))
|
||||||
return 1;
|
return 1;
|
||||||
#ifdef COREB_L1_CODE_START
|
#ifdef COREB_L1_CODE_START
|
||||||
if (in_mem_const(addr, size, COREB_L1_CODE_START, L1_CODE_LENGTH))
|
if (in_mem_const(addr, size, COREB_L1_CODE_START, COREB_L1_CODE_LENGTH))
|
||||||
return 1;
|
return 1;
|
||||||
if (in_mem_const(addr, size, COREB_L1_SCRATCH_START, L1_SCRATCH_LENGTH))
|
if (in_mem_const(addr, size, COREB_L1_SCRATCH_START, L1_SCRATCH_LENGTH))
|
||||||
return 1;
|
return 1;
|
||||||
if (in_mem_const(addr, size, COREB_L1_DATA_A_START, L1_DATA_A_LENGTH))
|
if (in_mem_const(addr, size, COREB_L1_DATA_A_START, COREB_L1_DATA_A_LENGTH))
|
||||||
return 1;
|
return 1;
|
||||||
if (in_mem_const(addr, size, COREB_L1_DATA_B_START, L1_DATA_B_LENGTH))
|
if (in_mem_const(addr, size, COREB_L1_DATA_B_START, COREB_L1_DATA_B_LENGTH))
|
||||||
return 1;
|
return 1;
|
||||||
#endif
|
#endif
|
||||||
if (in_mem_const_off(addr, size, _ebss_l2 - _stext_l2, L2_START, L2_LENGTH))
|
if (in_mem_const_off(addr, size, _ebss_l2 - _stext_l2, L2_START, L2_LENGTH))
|
||||||
|
|
|
@ -168,7 +168,6 @@ void __cpuinit bfin_setup_cpudata(unsigned int cpu)
|
||||||
struct blackfin_cpudata *cpudata = &per_cpu(cpu_data, cpu);
|
struct blackfin_cpudata *cpudata = &per_cpu(cpu_data, cpu);
|
||||||
|
|
||||||
cpudata->idle = current;
|
cpudata->idle = current;
|
||||||
cpudata->loops_per_jiffy = loops_per_jiffy;
|
|
||||||
cpudata->imemctl = bfin_read_IMEM_CONTROL();
|
cpudata->imemctl = bfin_read_IMEM_CONTROL();
|
||||||
cpudata->dmemctl = bfin_read_DMEM_CONTROL();
|
cpudata->dmemctl = bfin_read_DMEM_CONTROL();
|
||||||
}
|
}
|
||||||
|
@ -568,17 +567,23 @@ static __init void memory_setup(void)
|
||||||
# endif /* ANOMALY_05000263 */
|
# endif /* ANOMALY_05000263 */
|
||||||
# endif /* CONFIG_ROMFS_FS */
|
# endif /* CONFIG_ROMFS_FS */
|
||||||
|
|
||||||
memory_end -= mtd_size;
|
/* Since the default MTD_UCLINUX has no magic number, we just blindly
|
||||||
|
* read 8 past the end of the kernel's image, and look at it.
|
||||||
|
* When no image is attached, mtd_size is set to a random number
|
||||||
|
* Do some basic sanity checks before operating on things
|
||||||
|
*/
|
||||||
|
if (mtd_size == 0 || memory_end <= mtd_size) {
|
||||||
|
pr_emerg("Could not find valid ram mtd attached.\n");
|
||||||
|
} else {
|
||||||
|
memory_end -= mtd_size;
|
||||||
|
|
||||||
if (mtd_size == 0) {
|
/* Relocate MTD image to the top of memory after the uncached memory area */
|
||||||
console_init();
|
uclinux_ram_map.phys = memory_mtd_start = memory_end;
|
||||||
panic("Don't boot kernel without rootfs attached.");
|
uclinux_ram_map.size = mtd_size;
|
||||||
|
pr_info("Found mtd parition at 0x%p, (len=0x%lx), moving to 0x%p\n",
|
||||||
|
_end, mtd_size, (void *)memory_mtd_start);
|
||||||
|
dma_memcpy((void *)uclinux_ram_map.phys, _end, uclinux_ram_map.size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Relocate MTD image to the top of memory after the uncached memory area */
|
|
||||||
uclinux_ram_map.phys = memory_mtd_start = memory_end;
|
|
||||||
uclinux_ram_map.size = mtd_size;
|
|
||||||
dma_memcpy((void *)uclinux_ram_map.phys, _end, uclinux_ram_map.size);
|
|
||||||
#endif /* CONFIG_MTD_UCLINUX */
|
#endif /* CONFIG_MTD_UCLINUX */
|
||||||
|
|
||||||
#if (defined(CONFIG_BFIN_EXTMEM_ICACHEABLE) && ANOMALY_05000263)
|
#if (defined(CONFIG_BFIN_EXTMEM_ICACHEABLE) && ANOMALY_05000263)
|
||||||
|
@ -868,13 +873,6 @@ void __init setup_arch(char **cmdline_p)
|
||||||
else
|
else
|
||||||
printk(KERN_CONT "and Disabled\n");
|
printk(KERN_CONT "and Disabled\n");
|
||||||
|
|
||||||
#if defined(CONFIG_CHR_DEV_FLASH) || defined(CONFIG_BLK_DEV_FLASH)
|
|
||||||
/* we need to initialize the Flashrom device here since we might
|
|
||||||
* do things with flash early on in the boot
|
|
||||||
*/
|
|
||||||
flash_probe();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
printk(KERN_INFO "Boot Mode: %i\n", bfin_read_SYSCR() & 0xF);
|
printk(KERN_INFO "Boot Mode: %i\n", bfin_read_SYSCR() & 0xF);
|
||||||
|
|
||||||
/* Newer parts mirror SWRST bits in SYSCR */
|
/* Newer parts mirror SWRST bits in SYSCR */
|
||||||
|
@ -938,10 +936,6 @@ void __init setup_arch(char **cmdline_p)
|
||||||
CPU, bfin_revid());
|
CPU, bfin_revid());
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We can't run on BF548-0.1 due to ANOMALY 05000448 */
|
|
||||||
if (bfin_cpuid() == 0x27de && bfin_revid() == 1)
|
|
||||||
panic("You can't run on this processor due to 05000448");
|
|
||||||
|
|
||||||
printk(KERN_INFO "Blackfin Linux support by http://blackfin.uclinux.org/\n");
|
printk(KERN_INFO "Blackfin Linux support by http://blackfin.uclinux.org/\n");
|
||||||
|
|
||||||
printk(KERN_INFO "Processor Speed: %lu MHz core clock and %lu MHz System Clock\n",
|
printk(KERN_INFO "Processor Speed: %lu MHz core clock and %lu MHz System Clock\n",
|
||||||
|
@ -1164,9 +1158,9 @@ static int show_cpuinfo(struct seq_file *m, void *v)
|
||||||
sclk/1000000, sclk%1000000);
|
sclk/1000000, sclk%1000000);
|
||||||
seq_printf(m, "bogomips\t: %lu.%02lu\n"
|
seq_printf(m, "bogomips\t: %lu.%02lu\n"
|
||||||
"Calibration\t: %lu loops\n",
|
"Calibration\t: %lu loops\n",
|
||||||
(cpudata->loops_per_jiffy * HZ) / 500000,
|
(loops_per_jiffy * HZ) / 500000,
|
||||||
((cpudata->loops_per_jiffy * HZ) / 5000) % 100,
|
((loops_per_jiffy * HZ) / 5000) % 100,
|
||||||
(cpudata->loops_per_jiffy * HZ));
|
(loops_per_jiffy * HZ));
|
||||||
|
|
||||||
/* Check Cache configutation */
|
/* Check Cache configutation */
|
||||||
switch (cpudata->dmemctl & (1 << DMC0_P | 1 << DMC1_P)) {
|
switch (cpudata->dmemctl & (1 << DMC0_P | 1 << DMC1_P)) {
|
||||||
|
|
|
@ -570,11 +570,12 @@ asmlinkage void trap_c(struct pt_regs *fp)
|
||||||
if (kernel_mode_regs(fp) || (current && !current->mm)) {
|
if (kernel_mode_regs(fp) || (current && !current->mm)) {
|
||||||
console_verbose();
|
console_verbose();
|
||||||
oops_in_progress = 1;
|
oops_in_progress = 1;
|
||||||
if (strerror)
|
|
||||||
verbose_printk(strerror);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sig != SIGTRAP) {
|
if (sig != SIGTRAP) {
|
||||||
|
if (strerror)
|
||||||
|
verbose_printk(strerror);
|
||||||
|
|
||||||
dump_bfin_process(fp);
|
dump_bfin_process(fp);
|
||||||
dump_bfin_mem(fp);
|
dump_bfin_mem(fp);
|
||||||
show_regs(fp);
|
show_regs(fp);
|
||||||
|
@ -619,7 +620,9 @@ asmlinkage void trap_c(struct pt_regs *fp)
|
||||||
force_sig_info(sig, &info, current);
|
force_sig_info(sig, &info, current);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ANOMALY_05000461 && trapnr == VEC_HWERR && !access_ok(VERIFY_READ, fp->pc, 8))
|
if ((ANOMALY_05000461 && trapnr == VEC_HWERR && !access_ok(VERIFY_READ, fp->pc, 8)) ||
|
||||||
|
(ANOMALY_05000281 && trapnr == VEC_HWERR) ||
|
||||||
|
(ANOMALY_05000189 && (trapnr == VEC_CPLB_I_VL || trapnr == VEC_CPLB_VL)))
|
||||||
fp->pc = SAFE_USER_INSTRUCTION;
|
fp->pc = SAFE_USER_INSTRUCTION;
|
||||||
|
|
||||||
traps_done:
|
traps_done:
|
||||||
|
|
|
@ -27,21 +27,7 @@
|
||||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define BITS_PER_UNIT 8
|
#include "gcclib.h"
|
||||||
|
|
||||||
typedef int SItype __attribute__ ((mode(SI)));
|
|
||||||
typedef unsigned int USItype __attribute__ ((mode(SI)));
|
|
||||||
typedef int DItype __attribute__ ((mode(DI)));
|
|
||||||
typedef int word_type __attribute__ ((mode(__word__)));
|
|
||||||
|
|
||||||
struct DIstruct {
|
|
||||||
SItype high, low;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
struct DIstruct s;
|
|
||||||
DItype ll;
|
|
||||||
} DIunion;
|
|
||||||
|
|
||||||
#ifdef CONFIG_ARITHMETIC_OPS_L1
|
#ifdef CONFIG_ARITHMETIC_OPS_L1
|
||||||
DItype __lshrdi3(DItype u, word_type b)__attribute__((l1_text));
|
DItype __lshrdi3(DItype u, word_type b)__attribute__((l1_text));
|
||||||
|
|
|
@ -534,7 +534,7 @@ static struct platform_device i2c_bfin_twi_device = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
||||||
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_TWI_LCD_MODULE)
|
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_BFIN_TWI_LCD_MODULE)
|
||||||
{
|
{
|
||||||
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
||||||
},
|
},
|
||||||
|
|
|
@ -82,6 +82,7 @@
|
||||||
#define ANOMALY_05000179 (0)
|
#define ANOMALY_05000179 (0)
|
||||||
#define ANOMALY_05000182 (0)
|
#define ANOMALY_05000182 (0)
|
||||||
#define ANOMALY_05000183 (0)
|
#define ANOMALY_05000183 (0)
|
||||||
|
#define ANOMALY_05000189 (0)
|
||||||
#define ANOMALY_05000198 (0)
|
#define ANOMALY_05000198 (0)
|
||||||
#define ANOMALY_05000202 (0)
|
#define ANOMALY_05000202 (0)
|
||||||
#define ANOMALY_05000215 (0)
|
#define ANOMALY_05000215 (0)
|
||||||
|
@ -117,6 +118,7 @@
|
||||||
#define ANOMALY_05000357 (0)
|
#define ANOMALY_05000357 (0)
|
||||||
#define ANOMALY_05000362 (1)
|
#define ANOMALY_05000362 (1)
|
||||||
#define ANOMALY_05000363 (0)
|
#define ANOMALY_05000363 (0)
|
||||||
|
#define ANOMALY_05000364 (0)
|
||||||
#define ANOMALY_05000371 (0)
|
#define ANOMALY_05000371 (0)
|
||||||
#define ANOMALY_05000380 (0)
|
#define ANOMALY_05000380 (0)
|
||||||
#define ANOMALY_05000386 (0)
|
#define ANOMALY_05000386 (0)
|
||||||
|
|
|
@ -793,7 +793,7 @@ static struct platform_device i2c_bfin_twi_device = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
||||||
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_TWI_LCD_MODULE)
|
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_BFIN_TWI_LCD_MODULE)
|
||||||
{
|
{
|
||||||
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
||||||
.type = "pcf8574_lcd",
|
.type = "pcf8574_lcd",
|
||||||
|
|
|
@ -591,7 +591,7 @@ static struct platform_device i2c_bfin_twi_device = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
||||||
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_TWI_LCD_MODULE)
|
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_BFIN_TWI_LCD_MODULE)
|
||||||
{
|
{
|
||||||
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
||||||
},
|
},
|
||||||
|
|
|
@ -858,7 +858,7 @@ static struct platform_device i2c_bfin_twi_device = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
||||||
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_TWI_LCD_MODULE)
|
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_BFIN_TWI_LCD_MODULE)
|
||||||
{
|
{
|
||||||
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
||||||
},
|
},
|
||||||
|
|
|
@ -176,6 +176,8 @@
|
||||||
#define ANOMALY_05000443 (1)
|
#define ANOMALY_05000443 (1)
|
||||||
/* The WURESET Bit in the SYSCR Register is not Functional */
|
/* The WURESET Bit in the SYSCR Register is not Functional */
|
||||||
#define ANOMALY_05000445 (1)
|
#define ANOMALY_05000445 (1)
|
||||||
|
/* USB DMA Short Packet Data Corruption */
|
||||||
|
#define ANOMALY_05000450 (1)
|
||||||
/* BCODE_QUICKBOOT, BCODE_ALLBOOT, and BCODE_FULLBOOT Settings in SYSCR Register Not Functional */
|
/* BCODE_QUICKBOOT, BCODE_ALLBOOT, and BCODE_FULLBOOT Settings in SYSCR Register Not Functional */
|
||||||
#define ANOMALY_05000451 (1)
|
#define ANOMALY_05000451 (1)
|
||||||
/* Incorrect Default Hysteresis Setting for RESET, NMI, and BMODE Signals */
|
/* Incorrect Default Hysteresis Setting for RESET, NMI, and BMODE Signals */
|
||||||
|
@ -201,6 +203,7 @@
|
||||||
#define ANOMALY_05000179 (0)
|
#define ANOMALY_05000179 (0)
|
||||||
#define ANOMALY_05000182 (0)
|
#define ANOMALY_05000182 (0)
|
||||||
#define ANOMALY_05000183 (0)
|
#define ANOMALY_05000183 (0)
|
||||||
|
#define ANOMALY_05000189 (0)
|
||||||
#define ANOMALY_05000198 (0)
|
#define ANOMALY_05000198 (0)
|
||||||
#define ANOMALY_05000202 (0)
|
#define ANOMALY_05000202 (0)
|
||||||
#define ANOMALY_05000215 (0)
|
#define ANOMALY_05000215 (0)
|
||||||
|
@ -238,6 +241,5 @@
|
||||||
#define ANOMALY_05000412 (0)
|
#define ANOMALY_05000412 (0)
|
||||||
#define ANOMALY_05000447 (0)
|
#define ANOMALY_05000447 (0)
|
||||||
#define ANOMALY_05000448 (0)
|
#define ANOMALY_05000448 (0)
|
||||||
#define ANOMALY_05000450 (0)
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -453,7 +453,7 @@ static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
||||||
.irq = 39,
|
.irq = 39,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_TWI_LCD_MODULE)
|
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_BFIN_TWI_LCD_MODULE)
|
||||||
{
|
{
|
||||||
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
||||||
},
|
},
|
||||||
|
|
|
@ -335,6 +335,7 @@
|
||||||
#define ANOMALY_05000323 (0)
|
#define ANOMALY_05000323 (0)
|
||||||
#define ANOMALY_05000353 (1)
|
#define ANOMALY_05000353 (1)
|
||||||
#define ANOMALY_05000362 (1)
|
#define ANOMALY_05000362 (1)
|
||||||
|
#define ANOMALY_05000364 (0)
|
||||||
#define ANOMALY_05000380 (0)
|
#define ANOMALY_05000380 (0)
|
||||||
#define ANOMALY_05000386 (1)
|
#define ANOMALY_05000386 (1)
|
||||||
#define ANOMALY_05000389 (0)
|
#define ANOMALY_05000389 (0)
|
||||||
|
|
|
@ -1313,10 +1313,10 @@ static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
||||||
#if defined(CONFIG_JOYSTICK_AD7142) || defined(CONFIG_JOYSTICK_AD7142_MODULE)
|
#if defined(CONFIG_JOYSTICK_AD7142) || defined(CONFIG_JOYSTICK_AD7142_MODULE)
|
||||||
{
|
{
|
||||||
I2C_BOARD_INFO("ad7142_joystick", 0x2C),
|
I2C_BOARD_INFO("ad7142_joystick", 0x2C),
|
||||||
.irq = IRQ_PF5,
|
.irq = IRQ_PG5,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_TWI_LCD_MODULE)
|
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_BFIN_TWI_LCD_MODULE)
|
||||||
{
|
{
|
||||||
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
||||||
},
|
},
|
||||||
|
|
|
@ -167,6 +167,7 @@
|
||||||
#define ANOMALY_05000179 (0)
|
#define ANOMALY_05000179 (0)
|
||||||
#define ANOMALY_05000182 (0)
|
#define ANOMALY_05000182 (0)
|
||||||
#define ANOMALY_05000183 (0)
|
#define ANOMALY_05000183 (0)
|
||||||
|
#define ANOMALY_05000189 (0)
|
||||||
#define ANOMALY_05000198 (0)
|
#define ANOMALY_05000198 (0)
|
||||||
#define ANOMALY_05000202 (0)
|
#define ANOMALY_05000202 (0)
|
||||||
#define ANOMALY_05000215 (0)
|
#define ANOMALY_05000215 (0)
|
||||||
|
@ -186,6 +187,7 @@
|
||||||
#define ANOMALY_05000353 (1)
|
#define ANOMALY_05000353 (1)
|
||||||
#define ANOMALY_05000362 (1)
|
#define ANOMALY_05000362 (1)
|
||||||
#define ANOMALY_05000363 (0)
|
#define ANOMALY_05000363 (0)
|
||||||
|
#define ANOMALY_05000364 (0)
|
||||||
#define ANOMALY_05000380 (0)
|
#define ANOMALY_05000380 (0)
|
||||||
#define ANOMALY_05000386 (1)
|
#define ANOMALY_05000386 (1)
|
||||||
#define ANOMALY_05000389 (0)
|
#define ANOMALY_05000389 (0)
|
||||||
|
|
|
@ -137,6 +137,7 @@
|
||||||
#define ANOMALY_05000158 (0)
|
#define ANOMALY_05000158 (0)
|
||||||
#define ANOMALY_05000171 (0)
|
#define ANOMALY_05000171 (0)
|
||||||
#define ANOMALY_05000182 (0)
|
#define ANOMALY_05000182 (0)
|
||||||
|
#define ANOMALY_05000189 (0)
|
||||||
#define ANOMALY_05000198 (0)
|
#define ANOMALY_05000198 (0)
|
||||||
#define ANOMALY_05000202 (0)
|
#define ANOMALY_05000202 (0)
|
||||||
#define ANOMALY_05000215 (0)
|
#define ANOMALY_05000215 (0)
|
||||||
|
@ -160,6 +161,7 @@
|
||||||
#define ANOMALY_05000353 (1)
|
#define ANOMALY_05000353 (1)
|
||||||
#define ANOMALY_05000362 (1)
|
#define ANOMALY_05000362 (1)
|
||||||
#define ANOMALY_05000363 (0)
|
#define ANOMALY_05000363 (0)
|
||||||
|
#define ANOMALY_05000364 (0)
|
||||||
#define ANOMALY_05000380 (0)
|
#define ANOMALY_05000380 (0)
|
||||||
#define ANOMALY_05000386 (1)
|
#define ANOMALY_05000386 (1)
|
||||||
#define ANOMALY_05000389 (0)
|
#define ANOMALY_05000389 (0)
|
||||||
|
|
|
@ -864,7 +864,7 @@ static struct i2c_board_info __initdata bfin_i2c_board_info0[] = {
|
||||||
|
|
||||||
#if !defined(CONFIG_BF542) /* The BF542 only has 1 TWI */
|
#if !defined(CONFIG_BF542) /* The BF542 only has 1 TWI */
|
||||||
static struct i2c_board_info __initdata bfin_i2c_board_info1[] = {
|
static struct i2c_board_info __initdata bfin_i2c_board_info1[] = {
|
||||||
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_TWI_LCD_MODULE)
|
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_BFIN_TWI_LCD_MODULE)
|
||||||
{
|
{
|
||||||
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
||||||
},
|
},
|
||||||
|
|
|
@ -195,6 +195,7 @@
|
||||||
#define ANOMALY_05000179 (0)
|
#define ANOMALY_05000179 (0)
|
||||||
#define ANOMALY_05000182 (0)
|
#define ANOMALY_05000182 (0)
|
||||||
#define ANOMALY_05000183 (0)
|
#define ANOMALY_05000183 (0)
|
||||||
|
#define ANOMALY_05000189 (0)
|
||||||
#define ANOMALY_05000198 (0)
|
#define ANOMALY_05000198 (0)
|
||||||
#define ANOMALY_05000202 (0)
|
#define ANOMALY_05000202 (0)
|
||||||
#define ANOMALY_05000215 (0)
|
#define ANOMALY_05000215 (0)
|
||||||
|
@ -226,6 +227,7 @@
|
||||||
#define ANOMALY_05000323 (0)
|
#define ANOMALY_05000323 (0)
|
||||||
#define ANOMALY_05000362 (1)
|
#define ANOMALY_05000362 (1)
|
||||||
#define ANOMALY_05000363 (0)
|
#define ANOMALY_05000363 (0)
|
||||||
|
#define ANOMALY_05000364 (0)
|
||||||
#define ANOMALY_05000380 (0)
|
#define ANOMALY_05000380 (0)
|
||||||
#define ANOMALY_05000400 (0)
|
#define ANOMALY_05000400 (0)
|
||||||
#define ANOMALY_05000412 (0)
|
#define ANOMALY_05000412 (0)
|
||||||
|
|
|
@ -288,6 +288,7 @@
|
||||||
#define ANOMALY_05000273 (0)
|
#define ANOMALY_05000273 (0)
|
||||||
#define ANOMALY_05000311 (0)
|
#define ANOMALY_05000311 (0)
|
||||||
#define ANOMALY_05000353 (1)
|
#define ANOMALY_05000353 (1)
|
||||||
|
#define ANOMALY_05000364 (0)
|
||||||
#define ANOMALY_05000380 (0)
|
#define ANOMALY_05000380 (0)
|
||||||
#define ANOMALY_05000386 (1)
|
#define ANOMALY_05000386 (1)
|
||||||
#define ANOMALY_05000389 (0)
|
#define ANOMALY_05000389 (0)
|
||||||
|
|
|
@ -37,7 +37,6 @@
|
||||||
|
|
||||||
/* Memory Map for ADSP-BF561 processors */
|
/* Memory Map for ADSP-BF561 processors */
|
||||||
|
|
||||||
#ifdef CONFIG_BF561
|
|
||||||
#define COREA_L1_CODE_START 0xFFA00000
|
#define COREA_L1_CODE_START 0xFFA00000
|
||||||
#define COREA_L1_DATA_A_START 0xFF800000
|
#define COREA_L1_DATA_A_START 0xFF800000
|
||||||
#define COREA_L1_DATA_B_START 0xFF900000
|
#define COREA_L1_DATA_B_START 0xFF900000
|
||||||
|
@ -74,6 +73,28 @@
|
||||||
#define BFIN_DCACHESIZE (0*1024)
|
#define BFIN_DCACHESIZE (0*1024)
|
||||||
#define BFIN_DSUPBANKS 0
|
#define BFIN_DSUPBANKS 0
|
||||||
#endif /*CONFIG_BFIN_DCACHE*/
|
#endif /*CONFIG_BFIN_DCACHE*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If we are in SMP mode, then the cache settings of Core B will match
|
||||||
|
* the settings of Core A. If we aren't, then we assume Core B is not
|
||||||
|
* using any cache. This allows the rest of the kernel to work with
|
||||||
|
* the core in either mode as we are only loading user code into it and
|
||||||
|
* it is the user's problem to make sure they aren't doing something
|
||||||
|
* stupid there.
|
||||||
|
*
|
||||||
|
* Note that we treat the L1 code region as a contiguous blob to make
|
||||||
|
* the rest of the kernel simpler. Easier to check one region than a
|
||||||
|
* bunch of small ones. Again, possible misbehavior here is the fault
|
||||||
|
* of the user -- don't try to use memory that doesn't exist.
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
# define COREB_L1_CODE_LENGTH L1_CODE_LENGTH
|
||||||
|
# define COREB_L1_DATA_A_LENGTH L1_DATA_A_LENGTH
|
||||||
|
# define COREB_L1_DATA_B_LENGTH L1_DATA_B_LENGTH
|
||||||
|
#else
|
||||||
|
# define COREB_L1_CODE_LENGTH 0x14000
|
||||||
|
# define COREB_L1_DATA_A_LENGTH 0x8000
|
||||||
|
# define COREB_L1_DATA_B_LENGTH 0x8000
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Level 2 Memory */
|
/* Level 2 Memory */
|
||||||
|
|
|
@ -218,7 +218,7 @@ ENTRY(_ex_single_step)
|
||||||
/* Single stepping only a single instruction, so clear the trace
|
/* Single stepping only a single instruction, so clear the trace
|
||||||
* bit here. */
|
* bit here. */
|
||||||
r7 = syscfg;
|
r7 = syscfg;
|
||||||
bitclr (r7, 0);
|
bitclr (r7, SYSCFG_SSSTEP_P);
|
||||||
syscfg = R7;
|
syscfg = R7;
|
||||||
jump _ex_trap_c;
|
jump _ex_trap_c;
|
||||||
|
|
||||||
|
@ -251,7 +251,7 @@ ENTRY(_ex_single_step)
|
||||||
if !cc jump _bfin_return_from_exception;
|
if !cc jump _bfin_return_from_exception;
|
||||||
|
|
||||||
r7 = syscfg;
|
r7 = syscfg;
|
||||||
bitclr (r7, 0);
|
bitclr (r7, SYSCFG_SSSTEP_P); /* Turn off single step */
|
||||||
syscfg = R7;
|
syscfg = R7;
|
||||||
|
|
||||||
/* Fall through to _bfin_return_from_exception. */
|
/* Fall through to _bfin_return_from_exception. */
|
||||||
|
@ -342,9 +342,11 @@ ENTRY(_ex_trap_c)
|
||||||
r6 = retx;
|
r6 = retx;
|
||||||
[p5 + PDA_RETX] = r6;
|
[p5 + PDA_RETX] = r6;
|
||||||
#endif
|
#endif
|
||||||
|
/* Save the state of single stepping */
|
||||||
r6 = SYSCFG;
|
r6 = SYSCFG;
|
||||||
[p5 + PDA_SYSCFG] = r6;
|
[p5 + PDA_SYSCFG] = r6;
|
||||||
BITCLR(r6, 0);
|
/* Clear it while we handle the exception in IRQ5 mode */
|
||||||
|
BITCLR(r6, SYSCFG_SSSTEP_P);
|
||||||
SYSCFG = r6;
|
SYSCFG = r6;
|
||||||
|
|
||||||
/* Disable all interrupts, but make sure level 5 is enabled so
|
/* Disable all interrupts, but make sure level 5 is enabled so
|
||||||
|
@ -367,7 +369,7 @@ ENDPROC(_ex_trap_c)
|
||||||
* exception. This is a unrecoverable event, so crash.
|
* exception. This is a unrecoverable event, so crash.
|
||||||
* Note: this cannot be ENTRY() as we jump here with "if cc jump" ...
|
* Note: this cannot be ENTRY() as we jump here with "if cc jump" ...
|
||||||
*/
|
*/
|
||||||
_double_fault:
|
ENTRY(_double_fault)
|
||||||
/* Turn caches & protection off, to ensure we don't get any more
|
/* Turn caches & protection off, to ensure we don't get any more
|
||||||
* double exceptions
|
* double exceptions
|
||||||
*/
|
*/
|
||||||
|
@ -872,7 +874,7 @@ ENTRY(_ret_from_exception)
|
||||||
raise 15; /* raise evt15 to do signal or reschedule */
|
raise 15; /* raise evt15 to do signal or reschedule */
|
||||||
4:
|
4:
|
||||||
r0 = syscfg;
|
r0 = syscfg;
|
||||||
bitclr(r0, 0);
|
bitclr(r0, SYSCFG_SSSTEP_P); /* Turn off single step */
|
||||||
syscfg = r0;
|
syscfg = r0;
|
||||||
5:
|
5:
|
||||||
rts;
|
rts;
|
||||||
|
|
|
@ -211,6 +211,8 @@ int smp_call_function(void (*func)(void *info), void *info, int wait)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
msg = kmalloc(sizeof(*msg), GFP_ATOMIC);
|
msg = kmalloc(sizeof(*msg), GFP_ATOMIC);
|
||||||
|
if (!msg)
|
||||||
|
return -ENOMEM;
|
||||||
INIT_LIST_HEAD(&msg->list);
|
INIT_LIST_HEAD(&msg->list);
|
||||||
msg->call_struct.func = func;
|
msg->call_struct.func = func;
|
||||||
msg->call_struct.info = info;
|
msg->call_struct.info = info;
|
||||||
|
@ -252,6 +254,8 @@ int smp_call_function_single(int cpuid, void (*func) (void *info), void *info,
|
||||||
cpu_set(cpu, callmap);
|
cpu_set(cpu, callmap);
|
||||||
|
|
||||||
msg = kmalloc(sizeof(*msg), GFP_ATOMIC);
|
msg = kmalloc(sizeof(*msg), GFP_ATOMIC);
|
||||||
|
if (!msg)
|
||||||
|
return -ENOMEM;
|
||||||
INIT_LIST_HEAD(&msg->list);
|
INIT_LIST_HEAD(&msg->list);
|
||||||
msg->call_struct.func = func;
|
msg->call_struct.func = func;
|
||||||
msg->call_struct.info = info;
|
msg->call_struct.info = info;
|
||||||
|
@ -287,6 +291,8 @@ void smp_send_reschedule(int cpu)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
msg = kmalloc(sizeof(*msg), GFP_ATOMIC);
|
msg = kmalloc(sizeof(*msg), GFP_ATOMIC);
|
||||||
|
if (!msg)
|
||||||
|
return;
|
||||||
memset(msg, 0, sizeof(msg));
|
memset(msg, 0, sizeof(msg));
|
||||||
INIT_LIST_HEAD(&msg->list);
|
INIT_LIST_HEAD(&msg->list);
|
||||||
msg->type = BFIN_IPI_RESCHEDULE;
|
msg->type = BFIN_IPI_RESCHEDULE;
|
||||||
|
@ -314,6 +320,8 @@ void smp_send_stop(void)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
msg = kmalloc(sizeof(*msg), GFP_ATOMIC);
|
msg = kmalloc(sizeof(*msg), GFP_ATOMIC);
|
||||||
|
if (!msg)
|
||||||
|
return;
|
||||||
memset(msg, 0, sizeof(msg));
|
memset(msg, 0, sizeof(msg));
|
||||||
INIT_LIST_HEAD(&msg->list);
|
INIT_LIST_HEAD(&msg->list);
|
||||||
msg->type = BFIN_IPI_CPU_STOP;
|
msg->type = BFIN_IPI_CPU_STOP;
|
||||||
|
@ -450,7 +458,7 @@ void __init smp_cpus_done(unsigned int max_cpus)
|
||||||
unsigned int cpu;
|
unsigned int cpu;
|
||||||
|
|
||||||
for_each_online_cpu(cpu)
|
for_each_online_cpu(cpu)
|
||||||
bogosum += per_cpu(cpu_data, cpu).loops_per_jiffy;
|
bogosum += loops_per_jiffy;
|
||||||
|
|
||||||
printk(KERN_INFO "SMP: Total of %d processors activated "
|
printk(KERN_INFO "SMP: Total of %d processors activated "
|
||||||
"(%lu.%02lu BogoMIPS).\n",
|
"(%lu.%02lu BogoMIPS).\n",
|
||||||
|
|
Loading…
Reference in a new issue