blackfin: scb: Add system crossbar init code.

If SCB exists in select blackfin cpu, developer can change the SCB
priority in kernel configuration.

Signed-off-by: Sonic Zhang <sonic.zhang@analog.com>
Signed-off-by: Steven Miao <realmz6@gmail.com>
This commit is contained in:
Steven Miao 2013-09-12 16:36:16 +08:00
parent 6e4664525b
commit 24a70cf2b2
7 changed files with 1331 additions and 0 deletions

View File

@ -0,0 +1,21 @@
/*
* arch/blackfin/mach-common/scb-init.c - reprogram system cross bar priority
*
* Copyright 2012 Analog Devices Inc.
*
* Licensed under the GPL-2 or later.
*/
#define SCB_SLOT_OFFSET 24
#define SCB_MI_MAX_SLOT 32
struct scb_mi_prio {
unsigned long scb_mi_arbr;
unsigned long scb_mi_arbw;
unsigned char scb_mi_slots;
unsigned char scb_mi_prio[SCB_MI_MAX_SLOT];
};
extern struct scb_mi_prio scb_data[];
extern void init_scb(void);

View File

@ -35,6 +35,9 @@
#ifdef CONFIG_BF60x
#include <mach/pm.h>
#endif
#ifdef CONFIG_SCB_PRIORITY
#include <asm/scb.h>
#endif
u16 _bfin_swrst;
EXPORT_SYMBOL(_bfin_swrst);
@ -1101,6 +1104,9 @@ void __init setup_arch(char **cmdline_p)
#endif
init_exception_vectors();
bfin_cache_init(); /* Initialize caches for the boot CPU */
#ifdef CONFIG_SCB_PRIORITY
init_scb();
#endif
}
static int __init topology_init(void)

File diff suppressed because it is too large Load Diff

View File

@ -4,3 +4,4 @@
obj-y := dma.o clock.o ints-priority.o
obj-$(CONFIG_PM) += pm.o dpm.o
obj-$(CONFIG_SCB_PRIORITY) += scb.o

View File

@ -0,0 +1,232 @@
/*
* arch/blackfin/mach-common/scb-init.c - reprogram system cross bar priority
*
* Copyright 2012 Analog Devices Inc.
*
* Licensed under the GPL-2 or later.
*/
#include <asm/blackfin.h>
#include <asm/scb.h>
struct scb_mi_prio scb_data[] = {
#ifdef CONFIG_SCB0_MI0
{ REG_SCB0_ARBR0, REG_SCB0_ARBW0, 32, {
CONFIG_SCB0_MI0_SLOT0,
CONFIG_SCB0_MI0_SLOT1,
CONFIG_SCB0_MI0_SLOT2,
CONFIG_SCB0_MI0_SLOT3,
CONFIG_SCB0_MI0_SLOT4,
CONFIG_SCB0_MI0_SLOT5,
CONFIG_SCB0_MI0_SLOT6,
CONFIG_SCB0_MI0_SLOT7,
CONFIG_SCB0_MI0_SLOT8,
CONFIG_SCB0_MI0_SLOT9,
CONFIG_SCB0_MI0_SLOT10,
CONFIG_SCB0_MI0_SLOT11,
CONFIG_SCB0_MI0_SLOT12,
CONFIG_SCB0_MI0_SLOT13,
CONFIG_SCB0_MI0_SLOT14,
CONFIG_SCB0_MI0_SLOT15,
CONFIG_SCB0_MI0_SLOT16,
CONFIG_SCB0_MI0_SLOT17,
CONFIG_SCB0_MI0_SLOT18,
CONFIG_SCB0_MI0_SLOT19,
CONFIG_SCB0_MI0_SLOT20,
CONFIG_SCB0_MI0_SLOT21,
CONFIG_SCB0_MI0_SLOT22,
CONFIG_SCB0_MI0_SLOT23,
CONFIG_SCB0_MI0_SLOT24,
CONFIG_SCB0_MI0_SLOT25,
CONFIG_SCB0_MI0_SLOT26,
CONFIG_SCB0_MI0_SLOT27,
CONFIG_SCB0_MI0_SLOT28,
CONFIG_SCB0_MI0_SLOT29,
CONFIG_SCB0_MI0_SLOT30,
CONFIG_SCB0_MI0_SLOT31
},
},
#endif
#ifdef CONFIG_SCB0_MI1
{ REG_SCB0_ARBR1, REG_SCB0_ARBW1, 32, {
CONFIG_SCB0_MI1_SLOT0,
CONFIG_SCB0_MI1_SLOT1,
CONFIG_SCB0_MI1_SLOT2,
CONFIG_SCB0_MI1_SLOT3,
CONFIG_SCB0_MI1_SLOT4,
CONFIG_SCB0_MI1_SLOT5,
CONFIG_SCB0_MI1_SLOT6,
CONFIG_SCB0_MI1_SLOT7,
CONFIG_SCB0_MI1_SLOT8,
CONFIG_SCB0_MI1_SLOT9,
CONFIG_SCB0_MI1_SLOT10,
CONFIG_SCB0_MI1_SLOT11,
CONFIG_SCB0_MI1_SLOT12,
CONFIG_SCB0_MI1_SLOT13,
CONFIG_SCB0_MI1_SLOT14,
CONFIG_SCB0_MI1_SLOT15,
CONFIG_SCB0_MI1_SLOT16,
CONFIG_SCB0_MI1_SLOT17,
CONFIG_SCB0_MI1_SLOT18,
CONFIG_SCB0_MI1_SLOT19,
CONFIG_SCB0_MI1_SLOT20,
CONFIG_SCB0_MI1_SLOT21,
CONFIG_SCB0_MI1_SLOT22,
CONFIG_SCB0_MI1_SLOT23,
CONFIG_SCB0_MI1_SLOT24,
CONFIG_SCB0_MI1_SLOT25,
CONFIG_SCB0_MI1_SLOT26,
CONFIG_SCB0_MI1_SLOT27,
CONFIG_SCB0_MI1_SLOT28,
CONFIG_SCB0_MI1_SLOT29,
CONFIG_SCB0_MI1_SLOT30,
CONFIG_SCB0_MI1_SLOT31
},
},
#endif
#ifdef CONFIG_SCB0_MI2
{ REG_SCB0_ARBR2, REG_SCB0_ARBW2, 32, {
CONFIG_SCB0_MI2_SLOT0,
CONFIG_SCB0_MI2_SLOT1,
CONFIG_SCB0_MI2_SLOT2,
CONFIG_SCB0_MI2_SLOT3,
CONFIG_SCB0_MI2_SLOT4,
CONFIG_SCB0_MI2_SLOT5,
CONFIG_SCB0_MI2_SLOT6,
CONFIG_SCB0_MI2_SLOT7,
CONFIG_SCB0_MI2_SLOT8,
CONFIG_SCB0_MI2_SLOT9,
CONFIG_SCB0_MI2_SLOT10,
CONFIG_SCB0_MI2_SLOT11,
CONFIG_SCB0_MI2_SLOT12,
CONFIG_SCB0_MI2_SLOT13,
CONFIG_SCB0_MI2_SLOT14,
CONFIG_SCB0_MI2_SLOT15,
CONFIG_SCB0_MI2_SLOT16,
CONFIG_SCB0_MI2_SLOT17,
CONFIG_SCB0_MI2_SLOT18,
CONFIG_SCB0_MI2_SLOT19,
CONFIG_SCB0_MI2_SLOT20,
CONFIG_SCB0_MI2_SLOT21,
CONFIG_SCB0_MI2_SLOT22,
CONFIG_SCB0_MI2_SLOT23,
CONFIG_SCB0_MI2_SLOT24,
CONFIG_SCB0_MI2_SLOT25,
CONFIG_SCB0_MI2_SLOT26,
CONFIG_SCB0_MI2_SLOT27,
CONFIG_SCB0_MI2_SLOT28,
CONFIG_SCB0_MI2_SLOT29,
CONFIG_SCB0_MI2_SLOT30,
CONFIG_SCB0_MI2_SLOT31
},
},
#endif
#ifdef CONFIG_SCB0_MI3
{ REG_SCB0_ARBR3, REG_SCB0_ARBW3, 32, {
CONFIG_SCB0_MI3_SLOT0,
CONFIG_SCB0_MI3_SLOT1,
CONFIG_SCB0_MI3_SLOT2,
CONFIG_SCB0_MI3_SLOT3,
CONFIG_SCB0_MI3_SLOT4,
CONFIG_SCB0_MI3_SLOT5,
CONFIG_SCB0_MI3_SLOT6,
CONFIG_SCB0_MI3_SLOT7,
CONFIG_SCB0_MI3_SLOT8,
CONFIG_SCB0_MI3_SLOT9,
CONFIG_SCB0_MI3_SLOT10,
CONFIG_SCB0_MI3_SLOT11,
CONFIG_SCB0_MI3_SLOT12,
CONFIG_SCB0_MI3_SLOT13,
CONFIG_SCB0_MI3_SLOT14,
CONFIG_SCB0_MI3_SLOT15,
CONFIG_SCB0_MI3_SLOT16,
CONFIG_SCB0_MI3_SLOT17,
CONFIG_SCB0_MI3_SLOT18,
CONFIG_SCB0_MI3_SLOT19,
CONFIG_SCB0_MI3_SLOT20,
CONFIG_SCB0_MI3_SLOT21,
CONFIG_SCB0_MI3_SLOT22,
CONFIG_SCB0_MI3_SLOT23,
CONFIG_SCB0_MI3_SLOT24,
CONFIG_SCB0_MI3_SLOT25,
CONFIG_SCB0_MI3_SLOT26,
CONFIG_SCB0_MI3_SLOT27,
CONFIG_SCB0_MI3_SLOT28,
CONFIG_SCB0_MI3_SLOT29,
CONFIG_SCB0_MI3_SLOT30,
CONFIG_SCB0_MI3_SLOT31
},
},
#endif
#ifdef CONFIG_SCB0_MI4
{ REG_SCB0_ARBR4, REG_SCB4_ARBW0, 32, {
CONFIG_SCB0_MI4_SLOT0,
CONFIG_SCB0_MI4_SLOT1,
CONFIG_SCB0_MI4_SLOT2,
CONFIG_SCB0_MI4_SLOT3,
CONFIG_SCB0_MI4_SLOT4,
CONFIG_SCB0_MI4_SLOT5,
CONFIG_SCB0_MI4_SLOT6,
CONFIG_SCB0_MI4_SLOT7,
CONFIG_SCB0_MI4_SLOT8,
CONFIG_SCB0_MI4_SLOT9,
CONFIG_SCB0_MI4_SLOT10,
CONFIG_SCB0_MI4_SLOT11,
CONFIG_SCB0_MI4_SLOT12,
CONFIG_SCB0_MI4_SLOT13,
CONFIG_SCB0_MI4_SLOT14,
CONFIG_SCB0_MI4_SLOT15,
CONFIG_SCB0_MI4_SLOT16,
CONFIG_SCB0_MI4_SLOT17,
CONFIG_SCB0_MI4_SLOT18,
CONFIG_SCB0_MI4_SLOT19,
CONFIG_SCB0_MI4_SLOT20,
CONFIG_SCB0_MI4_SLOT21,
CONFIG_SCB0_MI4_SLOT22,
CONFIG_SCB0_MI4_SLOT23,
CONFIG_SCB0_MI4_SLOT24,
CONFIG_SCB0_MI4_SLOT25,
CONFIG_SCB0_MI4_SLOT26,
CONFIG_SCB0_MI4_SLOT27,
CONFIG_SCB0_MI4_SLOT28,
CONFIG_SCB0_MI4_SLOT29,
CONFIG_SCB0_MI4_SLOT30,
CONFIG_SCB0_MI4_SLOT31
},
},
#endif
#ifdef CONFIG_SCB0_MI5
{ REG_SCB0_ARBR5, REG_SCB0_ARBW5, 16, {
CONFIG_SCB0_MI5_SLOT0,
CONFIG_SCB0_MI5_SLOT1,
CONFIG_SCB0_MI5_SLOT2,
CONFIG_SCB0_MI5_SLOT3,
CONFIG_SCB0_MI5_SLOT4,
CONFIG_SCB0_MI5_SLOT5,
CONFIG_SCB0_MI5_SLOT6,
CONFIG_SCB0_MI5_SLOT7,
CONFIG_SCB0_MI5_SLOT8,
CONFIG_SCB0_MI5_SLOT9,
CONFIG_SCB0_MI5_SLOT10,
CONFIG_SCB0_MI5_SLOT11,
CONFIG_SCB0_MI5_SLOT12,
CONFIG_SCB0_MI5_SLOT13,
CONFIG_SCB0_MI5_SLOT14,
CONFIG_SCB0_MI5_SLOT15,
},
},
#endif
/*
{ REG_SCB1_ARBR0, REG_SCB1_ARBW0, scb1_mi0, 20 },
{ REG_SCB2_ARBR0, REG_SCB2_ARBW0, scb2_mi0, 10 },
{ REG_SCB3_ARBR0, REG_SCB3_ARBW0, scb3_mi0, 16 },
{ REG_SCB4_ARBR0, REG_SCB4_ARBW0, scb4_mi0, 16 },
{ REG_SCB5_ARBR0, REG_SCB5_ARBW0, scb5_mi0, 8 },
{ REG_SCB6_ARBR0, REG_SCB6_ARBW0, scb6_mi0, 4 },
{ REG_SCB7_ARBR0, REG_SCB7_ARBW0, scb7_mi0, 6 },
{ REG_SCB8_ARBR0, REG_SCB8_ARBW0, scb8_mi0, 8 },
{ REG_SCB9_ARBR0, REG_SCB9_ARBW0, scb9_mi0, 10 },
{ REG_SCB10_ARBR0, REG_SCB10_ARBW0, scb20_mi0, 16 },
*/
{ 0, }
};

View File

@ -10,6 +10,7 @@ obj-$(CONFIG_PM) += pm.o
ifneq ($(CONFIG_BF60x),y)
obj-$(CONFIG_PM) += dpmc_modes.o
endif
obj-$(CONFIG_SCB_PRIORITY) += scb-init.o
obj-$(CONFIG_CPU_VOLTAGE) += dpmc.o
obj-$(CONFIG_SMP) += smp.o
obj-$(CONFIG_BFIN_KERNEL_CLOCK) += clocks-init.o

View File

@ -0,0 +1,53 @@
/*
* arch/blackfin/mach-common/scb-init.c - reprogram system cross bar priority
*
* Copyright 2012 Analog Devices Inc.
*
* Licensed under the GPL-2 or later.
*/
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/kernel.h>
#include <asm/scb.h>
__attribute__((l1_text))
inline void scb_mi_write(unsigned long scb_mi_arbw, unsigned int slots,
unsigned char *scb_mi_prio)
{
unsigned int i;
for (i = 0; i < slots; ++i)
bfin_write32(scb_mi_arbw, (i << SCB_SLOT_OFFSET) | scb_mi_prio[i]);
}
__attribute__((l1_text))
inline void scb_mi_read(unsigned long scb_mi_arbw, unsigned int slots,
unsigned char *scb_mi_prio)
{
unsigned int i;
for (i = 0; i < slots; ++i) {
bfin_write32(scb_mi_arbw, (0xFF << SCB_SLOT_OFFSET) | i);
scb_mi_prio[i] = bfin_read32(scb_mi_arbw);
}
}
__attribute__((l1_text))
void init_scb(void)
{
unsigned int i, j;
unsigned char scb_tmp_prio[32];
pr_info("Init System Crossbar\n");
for (i = 0; scb_data[i].scb_mi_arbr > 0; ++i) {
scb_mi_write(scb_data[i].scb_mi_arbw, scb_data[i].scb_mi_slots, scb_data[i].scb_mi_prio);
pr_debug("scb priority at 0x%lx:\n", scb_data[i].scb_mi_arbr);
scb_mi_read(scb_data[i].scb_mi_arbw, scb_data[i].scb_mi_slots, scb_tmp_prio);
for (j = 0; j < scb_data[i].scb_mi_slots; ++j)
pr_debug("slot %d = %d\n", j, scb_tmp_prio[j]);
}
}