mirror of
https://github.com/ukui/kernel.git
synced 2026-03-09 10:07:04 -07:00
Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus
Pull MIPS updates from Ralf Baechle: - More work on DT support for various platforms - Various fixes that were to late to make it straight into 3.9 - Improved platform support, in particular the Netlogic XLR and BCM63xx, and the SEAD3 and Malta eval boards. - Support for several Ralink SOC families. - Complete support for the microMIPS ASE which basically reencodes the existing MIPS32/MIPS64 ISA to use non-constant size instructions. - Some fallout from LTO work which remove old cruft and will generally make the MIPS kernel easier to maintain and resistant to compiler optimization, even in absence of LTO. - KVM support. While MIPS has announced hardware virtualization extensions this KVM extension uses trap and emulate mode for virtualization of MIPS32. More KVM work to add support for VZ hardware virtualizaiton extensions and MIPS64 will probably already be merged for 3.11. Most of this has been sitting in -next for a long time. All defconfigs have been build or run time tested except three for which fixes are being sent by other maintainers. Semantic conflict with kvm updates done as per Ralf * 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus: (118 commits) MIPS: Add new GIC clockevent driver. MIPS: Formatting clean-ups for clocksources. MIPS: Refactor GIC clocksource code. MIPS: Move 'gic_frequency' to common location. MIPS: Move 'gic_present' to common location. MIPS: MIPS16e: Add unaligned access support. MIPS: MIPS16e: Support handling of delay slots. MIPS: MIPS16e: Add instruction formats. MIPS: microMIPS: Optimise 'strnlen' core library function. MIPS: microMIPS: Optimise 'strlen' core library function. MIPS: microMIPS: Optimise 'strncpy' core library function. MIPS: microMIPS: Optimise 'memset' core library function. MIPS: microMIPS: Add configuration option for microMIPS kernel. MIPS: microMIPS: Disable LL/SC and fix linker bug. MIPS: microMIPS: Add vdso support. MIPS: microMIPS: Add unaligned access support. MIPS: microMIPS: Support handling of delay slots. MIPS: microMIPS: Add support for exception handling. MIPS: microMIPS: Floating point support. MIPS: microMIPS: Fix macro naming in micro-assembler. ...
This commit is contained in:
17
Documentation/devicetree/bindings/mips/ralink.txt
Normal file
17
Documentation/devicetree/bindings/mips/ralink.txt
Normal file
@@ -0,0 +1,17 @@
|
||||
Ralink MIPS SoC device tree bindings
|
||||
|
||||
1. SoCs
|
||||
|
||||
Each device tree must specify a compatible value for the Ralink SoC
|
||||
it uses in the compatible property of the root node. The compatible
|
||||
value must be one of the following values:
|
||||
|
||||
ralink,rt2880-soc
|
||||
ralink,rt3050-soc
|
||||
ralink,rt3052-soc
|
||||
ralink,rt3350-soc
|
||||
ralink,rt3352-soc
|
||||
ralink,rt3883-soc
|
||||
ralink,rt5350-soc
|
||||
ralink,mt7620a-soc
|
||||
ralink,mt7620n-soc
|
||||
@@ -42,6 +42,7 @@ onnn ON Semiconductor Corp.
|
||||
picochip Picochip Ltd
|
||||
powervr PowerVR (deprecated, use img)
|
||||
qcom Qualcomm, Inc.
|
||||
ralink Mediatek/Ralink Technology Corp.
|
||||
ramtron Ramtron International
|
||||
realtek Realtek Semiconductor Corp.
|
||||
renesas Renesas Electronics Corporation
|
||||
|
||||
@@ -17,3 +17,7 @@ obj- := $(platform-)
|
||||
obj-y += kernel/
|
||||
obj-y += mm/
|
||||
obj-y += math-emu/
|
||||
|
||||
ifdef CONFIG_KVM
|
||||
obj-y += kvm/
|
||||
endif
|
||||
|
||||
@@ -304,7 +304,6 @@ config MIPS_MALTA
|
||||
select HW_HAS_PCI
|
||||
select I8253
|
||||
select I8259
|
||||
select MIPS_BOARDS_GEN
|
||||
select MIPS_BONITO64
|
||||
select MIPS_CPU_SCACHE
|
||||
select PCI_GT64XXX_PCI0
|
||||
@@ -335,12 +334,12 @@ config MIPS_SEAD3
|
||||
select BOOT_RAW
|
||||
select CEVT_R4K
|
||||
select CSRC_R4K
|
||||
select CSRC_GIC
|
||||
select CPU_MIPSR2_IRQ_VI
|
||||
select CPU_MIPSR2_IRQ_EI
|
||||
select DMA_NONCOHERENT
|
||||
select IRQ_CPU
|
||||
select IRQ_GIC
|
||||
select MIPS_BOARDS_GEN
|
||||
select MIPS_CPU_SCACHE
|
||||
select MIPS_MSC
|
||||
select SYS_HAS_CPU_MIPS32_R1
|
||||
@@ -352,6 +351,7 @@ config MIPS_SEAD3
|
||||
select SYS_SUPPORTS_BIG_ENDIAN
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_SUPPORTS_SMARTMIPS
|
||||
select SYS_SUPPORTS_MICROMIPS
|
||||
select USB_ARCH_HAS_EHCI
|
||||
select USB_EHCI_BIG_ENDIAN_DESC
|
||||
select USB_EHCI_BIG_ENDIAN_MMIO
|
||||
@@ -910,6 +910,9 @@ config CEVT_GT641XX
|
||||
config CEVT_R4K
|
||||
bool
|
||||
|
||||
config CEVT_GIC
|
||||
bool
|
||||
|
||||
config CEVT_SB1250
|
||||
bool
|
||||
|
||||
@@ -982,9 +985,6 @@ config MIPS_MSC
|
||||
config MIPS_NILE4
|
||||
bool
|
||||
|
||||
config MIPS_DISABLE_OBSOLETE_IDE
|
||||
bool
|
||||
|
||||
config SYNC_R4K
|
||||
bool
|
||||
|
||||
@@ -1075,9 +1075,6 @@ config IRQ_GT641XX
|
||||
config IRQ_GIC
|
||||
bool
|
||||
|
||||
config MIPS_BOARDS_GEN
|
||||
bool
|
||||
|
||||
config PCI_GT64XXX_PCI0
|
||||
bool
|
||||
|
||||
@@ -1147,7 +1144,7 @@ config BOOT_ELF32
|
||||
|
||||
config MIPS_L1_CACHE_SHIFT
|
||||
int
|
||||
default "4" if MACH_DECSTATION || MIKROTIK_RB532 || PMC_MSP4200_EVAL
|
||||
default "4" if MACH_DECSTATION || MIKROTIK_RB532 || PMC_MSP4200_EVAL || SOC_RT288X
|
||||
default "6" if MIPS_CPU_SCACHE
|
||||
default "7" if SGI_IP22 || SGI_IP27 || SGI_IP28 || SNI_RM || CPU_CAVIUM_OCTEON
|
||||
default "5"
|
||||
@@ -1236,6 +1233,7 @@ config CPU_MIPS32_R2
|
||||
select CPU_HAS_PREFETCH
|
||||
select CPU_SUPPORTS_32BIT_KERNEL
|
||||
select CPU_SUPPORTS_HIGHMEM
|
||||
select HAVE_KVM
|
||||
help
|
||||
Choose this option to build a kernel for release 2 or later of the
|
||||
MIPS32 architecture. Most modern embedded systems with a 32-bit
|
||||
@@ -1736,6 +1734,20 @@ config 64BIT
|
||||
|
||||
endchoice
|
||||
|
||||
config KVM_GUEST
|
||||
bool "KVM Guest Kernel"
|
||||
help
|
||||
Select this option if building a guest kernel for KVM (Trap & Emulate) mode
|
||||
|
||||
config KVM_HOST_FREQ
|
||||
int "KVM Host Processor Frequency (MHz)"
|
||||
depends on KVM_GUEST
|
||||
default 500
|
||||
help
|
||||
Select this option if building a guest kernel for KVM to skip
|
||||
RTC emulation when determining guest CPU Frequency. Instead, the guest
|
||||
processor frequency is automatically derived from the host frequency.
|
||||
|
||||
choice
|
||||
prompt "Kernel page size"
|
||||
default PAGE_SIZE_4KB
|
||||
@@ -1811,6 +1823,15 @@ config FORCE_MAX_ZONEORDER
|
||||
The page size is not necessarily 4KB. Keep this in mind
|
||||
when choosing a value for this option.
|
||||
|
||||
config CEVT_GIC
|
||||
bool "Use GIC global counter for clock events"
|
||||
depends on IRQ_GIC && !(MIPS_SEAD3 || MIPS_MT_SMTC)
|
||||
help
|
||||
Use the GIC global counter for the clock events. The R4K clock
|
||||
event driver is always present, so if the platform ends up not
|
||||
detecting a GIC, it will fall back to the R4K timer for the
|
||||
generation of clock events.
|
||||
|
||||
config BOARD_SCACHE
|
||||
bool
|
||||
|
||||
@@ -2016,6 +2037,7 @@ config SB1_PASS_2_1_WORKAROUNDS
|
||||
depends on CPU_SB1 && CPU_SB1_PASS_2
|
||||
default y
|
||||
|
||||
|
||||
config 64BIT_PHYS_ADDR
|
||||
bool
|
||||
|
||||
@@ -2034,6 +2056,13 @@ config CPU_HAS_SMARTMIPS
|
||||
you don't know you probably don't have SmartMIPS and should say N
|
||||
here.
|
||||
|
||||
config CPU_MICROMIPS
|
||||
depends on SYS_SUPPORTS_MICROMIPS
|
||||
bool "Build kernel using microMIPS ISA"
|
||||
help
|
||||
When this option is enabled the kernel will be built using the
|
||||
microMIPS ISA
|
||||
|
||||
config CPU_HAS_WB
|
||||
bool
|
||||
|
||||
@@ -2096,6 +2125,9 @@ config SYS_SUPPORTS_HIGHMEM
|
||||
config SYS_SUPPORTS_SMARTMIPS
|
||||
bool
|
||||
|
||||
config SYS_SUPPORTS_MICROMIPS
|
||||
bool
|
||||
|
||||
config ARCH_FLATMEM_ENABLE
|
||||
def_bool y
|
||||
depends on !NUMA && !CPU_LOONGSON2
|
||||
@@ -2556,3 +2588,5 @@ source "security/Kconfig"
|
||||
source "crypto/Kconfig"
|
||||
|
||||
source "lib/Kconfig"
|
||||
|
||||
source "arch/mips/kvm/Kconfig"
|
||||
|
||||
@@ -114,6 +114,7 @@ cflags-$(CONFIG_CPU_BIG_ENDIAN) += $(shell $(CC) -dumpmachine |grep -q 'mips.*e
|
||||
cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += $(shell $(CC) -dumpmachine |grep -q 'mips.*el-.*' || echo -EL $(undef-all) $(predef-le))
|
||||
|
||||
cflags-$(CONFIG_CPU_HAS_SMARTMIPS) += $(call cc-option,-msmartmips)
|
||||
cflags-$(CONFIG_CPU_MICROMIPS) += $(call cc-option,-mmicromips -mno-jals)
|
||||
|
||||
cflags-$(CONFIG_SB1XXX_CORELIS) += $(call cc-option,-mno-sched-prolog) \
|
||||
-fno-omit-frame-pointer
|
||||
|
||||
@@ -31,7 +31,6 @@ config MIPS_DB1000
|
||||
select ALCHEMY_GPIOINT_AU1000
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select MIPS_DISABLE_OBSOLETE_IDE
|
||||
select SYS_SUPPORTS_BIG_ENDIAN
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
@@ -41,7 +40,6 @@ config MIPS_DB1235
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
select HW_HAS_PCI
|
||||
select DMA_COHERENT
|
||||
select MIPS_DISABLE_OBSOLETE_IDE
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
|
||||
@@ -57,7 +55,6 @@ config MIPS_GPR
|
||||
select ALCHEMY_GPIOINT_AU1000
|
||||
select HW_HAS_PCI
|
||||
select DMA_NONCOHERENT
|
||||
select MIPS_DISABLE_OBSOLETE_IDE
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
|
||||
|
||||
@@ -5,32 +5,14 @@ platform-$(CONFIG_MIPS_ALCHEMY) += alchemy/common/
|
||||
|
||||
|
||||
#
|
||||
# AMD Alchemy Pb1100 eval board
|
||||
#
|
||||
platform-$(CONFIG_MIPS_PB1100) += alchemy/devboards/
|
||||
load-$(CONFIG_MIPS_PB1100) += 0xffffffff80100000
|
||||
|
||||
#
|
||||
# AMD Alchemy Pb1500 eval board
|
||||
#
|
||||
platform-$(CONFIG_MIPS_PB1500) += alchemy/devboards/
|
||||
load-$(CONFIG_MIPS_PB1500) += 0xffffffff80100000
|
||||
|
||||
#
|
||||
# AMD Alchemy Pb1550 eval board
|
||||
#
|
||||
platform-$(CONFIG_MIPS_PB1550) += alchemy/devboards/
|
||||
load-$(CONFIG_MIPS_PB1550) += 0xffffffff80100000
|
||||
|
||||
#
|
||||
# AMD Alchemy Db1000/Db1500/Db1100 eval boards
|
||||
# AMD Alchemy Db1000/Db1500/Pb1500/Db1100/Pb1100 eval boards
|
||||
#
|
||||
platform-$(CONFIG_MIPS_DB1000) += alchemy/devboards/
|
||||
cflags-$(CONFIG_MIPS_DB1000) += -I$(srctree)/arch/mips/include/asm/mach-db1x00
|
||||
load-$(CONFIG_MIPS_DB1000) += 0xffffffff80100000
|
||||
|
||||
#
|
||||
# AMD Alchemy Db1200/Pb1200/Db1550/Db1300 eval boards
|
||||
# AMD Alchemy Db1200/Pb1200/Db1550/Pb1550/Db1300 eval boards
|
||||
#
|
||||
platform-$(CONFIG_MIPS_DB1235) += alchemy/devboards/
|
||||
cflags-$(CONFIG_MIPS_DB1235) += -I$(srctree)/arch/mips/include/asm/mach-db1x00
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
#include <asm/sections.h>
|
||||
|
||||
#include <asm/mach-ar7/ar7.h>
|
||||
#include <asm/mips-boards/prom.h>
|
||||
|
||||
static int __init memsize(void)
|
||||
{
|
||||
|
||||
@@ -51,20 +51,6 @@ static void ath79_halt(void)
|
||||
cpu_wait();
|
||||
}
|
||||
|
||||
static void __init ath79_detect_mem_size(void)
|
||||
{
|
||||
unsigned long size;
|
||||
|
||||
for (size = ATH79_MEM_SIZE_MIN; size < ATH79_MEM_SIZE_MAX;
|
||||
size <<= 1) {
|
||||
if (!memcmp(ath79_detect_mem_size,
|
||||
ath79_detect_mem_size + size, 1024))
|
||||
break;
|
||||
}
|
||||
|
||||
add_memory_region(0, size, BOOT_MEM_RAM);
|
||||
}
|
||||
|
||||
static void __init ath79_detect_sys_type(void)
|
||||
{
|
||||
char *chip = "????";
|
||||
@@ -212,7 +198,7 @@ void __init plat_mem_setup(void)
|
||||
AR71XX_DDR_CTRL_SIZE);
|
||||
|
||||
ath79_detect_sys_type();
|
||||
ath79_detect_mem_size();
|
||||
detect_memory_region(0, ATH79_MEM_SIZE_MIN, ATH79_MEM_SIZE_MAX);
|
||||
ath79_clocks_init();
|
||||
|
||||
_machine_restart = ath79_restart;
|
||||
|
||||
@@ -25,6 +25,10 @@ config BCM63XX_CPU_6358
|
||||
bool "support 6358 CPU"
|
||||
select HW_HAS_PCI
|
||||
|
||||
config BCM63XX_CPU_6362
|
||||
bool "support 6362 CPU"
|
||||
select HW_HAS_PCI
|
||||
|
||||
config BCM63XX_CPU_6368
|
||||
bool "support 6368 CPU"
|
||||
select HW_HAS_PCI
|
||||
|
||||
@@ -726,11 +726,11 @@ void __init board_prom_init(void)
|
||||
u32 val;
|
||||
|
||||
/* read base address of boot chip select (0)
|
||||
* 6328 does not have MPI but boots from a fixed address
|
||||
* 6328/6362 do not have MPI but boot from a fixed address
|
||||
*/
|
||||
if (BCMCPU_IS_6328())
|
||||
if (BCMCPU_IS_6328() || BCMCPU_IS_6362()) {
|
||||
val = 0x18000000;
|
||||
else {
|
||||
} else {
|
||||
val = bcm_mpi_readl(MPI_CSBASE_REG(0));
|
||||
val &= MPI_CSBASE_BASE_MASK;
|
||||
}
|
||||
|
||||
@@ -15,7 +15,13 @@
|
||||
#include <bcm63xx_io.h>
|
||||
#include <bcm63xx_regs.h>
|
||||
#include <bcm63xx_reset.h>
|
||||
#include <bcm63xx_clk.h>
|
||||
|
||||
struct clk {
|
||||
void (*set)(struct clk *, int);
|
||||
unsigned int rate;
|
||||
unsigned int usage;
|
||||
int id;
|
||||
};
|
||||
|
||||
static DEFINE_MUTEX(clocks_mutex);
|
||||
|
||||
@@ -119,11 +125,18 @@ static struct clk clk_ephy = {
|
||||
*/
|
||||
static void enetsw_set(struct clk *clk, int enable)
|
||||
{
|
||||
if (!BCMCPU_IS_6368())
|
||||
if (BCMCPU_IS_6328())
|
||||
bcm_hwclock_set(CKCTL_6328_ROBOSW_EN, enable);
|
||||
else if (BCMCPU_IS_6362())
|
||||
bcm_hwclock_set(CKCTL_6362_ROBOSW_EN, enable);
|
||||
else if (BCMCPU_IS_6368())
|
||||
bcm_hwclock_set(CKCTL_6368_ROBOSW_EN |
|
||||
CKCTL_6368_SWPKT_USB_EN |
|
||||
CKCTL_6368_SWPKT_SAR_EN,
|
||||
enable);
|
||||
else
|
||||
return;
|
||||
bcm_hwclock_set(CKCTL_6368_ROBOSW_EN |
|
||||
CKCTL_6368_SWPKT_USB_EN |
|
||||
CKCTL_6368_SWPKT_SAR_EN, enable);
|
||||
|
||||
if (enable) {
|
||||
/* reset switch core afer clock change */
|
||||
bcm63xx_core_set_reset(BCM63XX_RESET_ENETSW, 1);
|
||||
@@ -160,6 +173,8 @@ static void usbh_set(struct clk *clk, int enable)
|
||||
bcm_hwclock_set(CKCTL_6328_USBH_EN, enable);
|
||||
else if (BCMCPU_IS_6348())
|
||||
bcm_hwclock_set(CKCTL_6348_USBH_EN, enable);
|
||||
else if (BCMCPU_IS_6362())
|
||||
bcm_hwclock_set(CKCTL_6362_USBH_EN, enable);
|
||||
else if (BCMCPU_IS_6368())
|
||||
bcm_hwclock_set(CKCTL_6368_USBH_EN, enable);
|
||||
}
|
||||
@@ -175,6 +190,8 @@ static void usbd_set(struct clk *clk, int enable)
|
||||
{
|
||||
if (BCMCPU_IS_6328())
|
||||
bcm_hwclock_set(CKCTL_6328_USBD_EN, enable);
|
||||
else if (BCMCPU_IS_6362())
|
||||
bcm_hwclock_set(CKCTL_6362_USBD_EN, enable);
|
||||
else if (BCMCPU_IS_6368())
|
||||
bcm_hwclock_set(CKCTL_6368_USBD_EN, enable);
|
||||
}
|
||||
@@ -196,6 +213,8 @@ static void spi_set(struct clk *clk, int enable)
|
||||
mask = CKCTL_6348_SPI_EN;
|
||||
else if (BCMCPU_IS_6358())
|
||||
mask = CKCTL_6358_SPI_EN;
|
||||
else if (BCMCPU_IS_6362())
|
||||
mask = CKCTL_6362_SPI_EN;
|
||||
else
|
||||
/* BCMCPU_IS_6368 */
|
||||
mask = CKCTL_6368_SPI_EN;
|
||||
@@ -236,7 +255,10 @@ static struct clk clk_xtm = {
|
||||
*/
|
||||
static void ipsec_set(struct clk *clk, int enable)
|
||||
{
|
||||
bcm_hwclock_set(CKCTL_6368_IPSEC_EN, enable);
|
||||
if (BCMCPU_IS_6362())
|
||||
bcm_hwclock_set(CKCTL_6362_IPSEC_EN, enable);
|
||||
else if (BCMCPU_IS_6368())
|
||||
bcm_hwclock_set(CKCTL_6368_IPSEC_EN, enable);
|
||||
}
|
||||
|
||||
static struct clk clk_ipsec = {
|
||||
@@ -249,7 +271,10 @@ static struct clk clk_ipsec = {
|
||||
|
||||
static void pcie_set(struct clk *clk, int enable)
|
||||
{
|
||||
bcm_hwclock_set(CKCTL_6328_PCIE_EN, enable);
|
||||
if (BCMCPU_IS_6328())
|
||||
bcm_hwclock_set(CKCTL_6328_PCIE_EN, enable);
|
||||
else if (BCMCPU_IS_6362())
|
||||
bcm_hwclock_set(CKCTL_6362_PCIE_EN, enable);
|
||||
}
|
||||
|
||||
static struct clk clk_pcie = {
|
||||
@@ -315,9 +340,9 @@ struct clk *clk_get(struct device *dev, const char *id)
|
||||
return &clk_periph;
|
||||
if (BCMCPU_IS_6358() && !strcmp(id, "pcm"))
|
||||
return &clk_pcm;
|
||||
if (BCMCPU_IS_6368() && !strcmp(id, "ipsec"))
|
||||
if ((BCMCPU_IS_6362() || BCMCPU_IS_6368()) && !strcmp(id, "ipsec"))
|
||||
return &clk_ipsec;
|
||||
if (BCMCPU_IS_6328() && !strcmp(id, "pcie"))
|
||||
if ((BCMCPU_IS_6328() || BCMCPU_IS_6362()) && !strcmp(id, "pcie"))
|
||||
return &clk_pcie;
|
||||
return ERR_PTR(-ENOENT);
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ const int *bcm63xx_irqs;
|
||||
EXPORT_SYMBOL(bcm63xx_irqs);
|
||||
|
||||
static u16 bcm63xx_cpu_id;
|
||||
static u16 bcm63xx_cpu_rev;
|
||||
static u8 bcm63xx_cpu_rev;
|
||||
static unsigned int bcm63xx_cpu_freq;
|
||||
static unsigned int bcm63xx_memory_size;
|
||||
|
||||
@@ -71,6 +71,15 @@ static const int bcm6358_irqs[] = {
|
||||
|
||||
};
|
||||
|
||||
static const unsigned long bcm6362_regs_base[] = {
|
||||
__GEN_CPU_REGS_TABLE(6362)
|
||||
};
|
||||
|
||||
static const int bcm6362_irqs[] = {
|
||||
__GEN_CPU_IRQ_TABLE(6362)
|
||||
|
||||
};
|
||||
|
||||
static const unsigned long bcm6368_regs_base[] = {
|
||||
__GEN_CPU_REGS_TABLE(6368)
|
||||
};
|
||||
@@ -87,7 +96,7 @@ u16 __bcm63xx_get_cpu_id(void)
|
||||
|
||||
EXPORT_SYMBOL(__bcm63xx_get_cpu_id);
|
||||
|
||||
u16 bcm63xx_get_cpu_rev(void)
|
||||
u8 bcm63xx_get_cpu_rev(void)
|
||||
{
|
||||
return bcm63xx_cpu_rev;
|
||||
}
|
||||
@@ -169,6 +178,42 @@ static unsigned int detect_cpu_clock(void)
|
||||
return (16 * 1000000 * n1 * n2) / m1;
|
||||
}
|
||||
|
||||
case BCM6362_CPU_ID:
|
||||
{
|
||||
unsigned int tmp, mips_pll_fcvo;
|
||||
|
||||
tmp = bcm_misc_readl(MISC_STRAPBUS_6362_REG);
|
||||
mips_pll_fcvo = (tmp & STRAPBUS_6362_FCVO_MASK)
|
||||
>> STRAPBUS_6362_FCVO_SHIFT;
|
||||
switch (mips_pll_fcvo) {
|
||||
case 0x03:
|
||||
case 0x0b:
|
||||
case 0x13:
|
||||
case 0x1b:
|
||||
return 240000000;
|
||||
case 0x04:
|
||||
case 0x0c:
|
||||
case 0x14:
|
||||
case 0x1c:
|
||||
return 160000000;
|
||||
case 0x05:
|
||||
case 0x0e:
|
||||
case 0x16:
|
||||
case 0x1e:
|
||||
case 0x1f:
|
||||
return 400000000;
|
||||
case 0x06:
|
||||
return 440000000;
|
||||
case 0x07:
|
||||
case 0x17:
|
||||
return 384000000;
|
||||
case 0x15:
|
||||
case 0x1d:
|
||||
return 200000000;
|
||||
default:
|
||||
return 320000000;
|
||||
}
|
||||
}
|
||||
case BCM6368_CPU_ID:
|
||||
{
|
||||
unsigned int tmp, p1, p2, ndiv, m1;
|
||||
@@ -205,7 +250,7 @@ static unsigned int detect_memory_size(void)
|
||||
unsigned int cols = 0, rows = 0, is_32bits = 0, banks = 0;
|
||||
u32 val;
|
||||
|
||||
if (BCMCPU_IS_6328())
|
||||
if (BCMCPU_IS_6328() || BCMCPU_IS_6362())
|
||||
return bcm_ddr_readl(DDR_CSEND_REG) << 24;
|
||||
|
||||
if (BCMCPU_IS_6345()) {
|
||||
@@ -240,53 +285,27 @@ static unsigned int detect_memory_size(void)
|
||||
|
||||
void __init bcm63xx_cpu_init(void)
|
||||
{
|
||||
unsigned int tmp, expected_cpu_id;
|
||||
unsigned int tmp;
|
||||
struct cpuinfo_mips *c = ¤t_cpu_data;
|
||||
unsigned int cpu = smp_processor_id();
|
||||
u32 chipid_reg;
|
||||
|
||||
/* soc registers location depends on cpu type */
|
||||
expected_cpu_id = 0;
|
||||
chipid_reg = 0;
|
||||
|
||||
switch (c->cputype) {
|
||||
case CPU_BMIPS3300:
|
||||
if ((read_c0_prid() & 0xff00) == PRID_IMP_BMIPS3300_ALT) {
|
||||
expected_cpu_id = BCM6348_CPU_ID;
|
||||
bcm63xx_regs_base = bcm6348_regs_base;
|
||||
bcm63xx_irqs = bcm6348_irqs;
|
||||
} else {
|
||||
if ((read_c0_prid() & 0xff00) != PRID_IMP_BMIPS3300_ALT)
|
||||
__cpu_name[cpu] = "Broadcom BCM6338";
|
||||
expected_cpu_id = BCM6338_CPU_ID;
|
||||
bcm63xx_regs_base = bcm6338_regs_base;
|
||||
bcm63xx_irqs = bcm6338_irqs;
|
||||
}
|
||||
break;
|
||||
/* fall-through */
|
||||
case CPU_BMIPS32:
|
||||
expected_cpu_id = BCM6345_CPU_ID;
|
||||
bcm63xx_regs_base = bcm6345_regs_base;
|
||||
bcm63xx_irqs = bcm6345_irqs;
|
||||
chipid_reg = BCM_6345_PERF_BASE;
|
||||
break;
|
||||
case CPU_BMIPS4350:
|
||||
if ((read_c0_prid() & 0xf0) == 0x10) {
|
||||
expected_cpu_id = BCM6358_CPU_ID;
|
||||
bcm63xx_regs_base = bcm6358_regs_base;
|
||||
bcm63xx_irqs = bcm6358_irqs;
|
||||
} else {
|
||||
/* all newer chips have the same chip id location */
|
||||
u16 chip_id = bcm_readw(BCM_6368_PERF_BASE);
|
||||
|
||||
switch (chip_id) {
|
||||
case BCM6328_CPU_ID:
|
||||
expected_cpu_id = BCM6328_CPU_ID;
|
||||
bcm63xx_regs_base = bcm6328_regs_base;
|
||||
bcm63xx_irqs = bcm6328_irqs;
|
||||
break;
|
||||
case BCM6368_CPU_ID:
|
||||
expected_cpu_id = BCM6368_CPU_ID;
|
||||
bcm63xx_regs_base = bcm6368_regs_base;
|
||||
bcm63xx_irqs = bcm6368_irqs;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ((read_c0_prid() & 0xf0) == 0x10)
|
||||
chipid_reg = BCM_6345_PERF_BASE;
|
||||
else
|
||||
chipid_reg = BCM_6368_PERF_BASE;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -294,20 +313,47 @@ void __init bcm63xx_cpu_init(void)
|
||||
* really early to panic, but delaying panic would not help since we
|
||||
* will never get any working console
|
||||
*/
|
||||
if (!expected_cpu_id)
|
||||
if (!chipid_reg)
|
||||
panic("unsupported Broadcom CPU");
|
||||
|
||||
/*
|
||||
* bcm63xx_regs_base is set, we can access soc registers
|
||||
*/
|
||||
|
||||
/* double check CPU type */
|
||||
tmp = bcm_perf_readl(PERF_REV_REG);
|
||||
/* read out CPU type */
|
||||
tmp = bcm_readl(chipid_reg);
|
||||
bcm63xx_cpu_id = (tmp & REV_CHIPID_MASK) >> REV_CHIPID_SHIFT;
|
||||
bcm63xx_cpu_rev = (tmp & REV_REVID_MASK) >> REV_REVID_SHIFT;
|
||||
|
||||
if (bcm63xx_cpu_id != expected_cpu_id)
|
||||
panic("bcm63xx CPU id mismatch");
|
||||
switch (bcm63xx_cpu_id) {
|
||||
case BCM6328_CPU_ID:
|
||||
bcm63xx_regs_base = bcm6328_regs_base;
|
||||
bcm63xx_irqs = bcm6328_irqs;
|
||||
break;
|
||||
case BCM6338_CPU_ID:
|
||||
bcm63xx_regs_base = bcm6338_regs_base;
|
||||
bcm63xx_irqs = bcm6338_irqs;
|
||||
break;
|
||||
case BCM6345_CPU_ID:
|
||||
bcm63xx_regs_base = bcm6345_regs_base;
|
||||
bcm63xx_irqs = bcm6345_irqs;
|
||||
break;
|
||||
case BCM6348_CPU_ID:
|
||||
bcm63xx_regs_base = bcm6348_regs_base;
|
||||
bcm63xx_irqs = bcm6348_irqs;
|
||||
break;
|
||||
case BCM6358_CPU_ID:
|
||||
bcm63xx_regs_base = bcm6358_regs_base;
|
||||
bcm63xx_irqs = bcm6358_irqs;
|
||||
break;
|
||||
case BCM6362_CPU_ID:
|
||||
bcm63xx_regs_base = bcm6362_regs_base;
|
||||
bcm63xx_irqs = bcm6362_irqs;
|
||||
break;
|
||||
case BCM6368_CPU_ID:
|
||||
bcm63xx_regs_base = bcm6368_regs_base;
|
||||
bcm63xx_irqs = bcm6368_irqs;
|
||||
break;
|
||||
default:
|
||||
panic("unsupported broadcom CPU %x", bcm63xx_cpu_id);
|
||||
break;
|
||||
}
|
||||
|
||||
bcm63xx_cpu_freq = detect_cpu_clock();
|
||||
bcm63xx_memory_size = detect_memory_size();
|
||||
|
||||
@@ -77,6 +77,12 @@ static int __init bcm63xx_detect_flash_type(void)
|
||||
return BCM63XX_FLASH_TYPE_PARALLEL;
|
||||
else
|
||||
return BCM63XX_FLASH_TYPE_SERIAL;
|
||||
case BCM6362_CPU_ID:
|
||||
val = bcm_misc_readl(MISC_STRAPBUS_6362_REG);
|
||||
if (val & STRAPBUS_6362_BOOT_SEL_SERIAL)
|
||||
return BCM63XX_FLASH_TYPE_SERIAL;
|
||||
else
|
||||
return BCM63XX_FLASH_TYPE_NAND;
|
||||
case BCM6368_CPU_ID:
|
||||
val = bcm_gpio_readl(GPIO_STRAPBUS_REG);
|
||||
switch (val & STRAPBUS_6368_BOOT_SEL_MASK) {
|
||||
|
||||
@@ -22,10 +22,6 @@
|
||||
/*
|
||||
* register offsets
|
||||
*/
|
||||
static const unsigned long bcm6338_regs_spi[] = {
|
||||
__GEN_SPI_REGS_TABLE(6338)
|
||||
};
|
||||
|
||||
static const unsigned long bcm6348_regs_spi[] = {
|
||||
__GEN_SPI_REGS_TABLE(6348)
|
||||
};
|
||||
@@ -34,23 +30,15 @@ static const unsigned long bcm6358_regs_spi[] = {
|
||||
__GEN_SPI_REGS_TABLE(6358)
|
||||
};
|
||||
|
||||
static const unsigned long bcm6368_regs_spi[] = {
|
||||
__GEN_SPI_REGS_TABLE(6368)
|
||||
};
|
||||
|
||||
const unsigned long *bcm63xx_regs_spi;
|
||||
EXPORT_SYMBOL(bcm63xx_regs_spi);
|
||||
|
||||
static __init void bcm63xx_spi_regs_init(void)
|
||||
{
|
||||
if (BCMCPU_IS_6338())
|
||||
bcm63xx_regs_spi = bcm6338_regs_spi;
|
||||
if (BCMCPU_IS_6348())
|
||||
if (BCMCPU_IS_6338() || BCMCPU_IS_6348())
|
||||
bcm63xx_regs_spi = bcm6348_regs_spi;
|
||||
if (BCMCPU_IS_6358())
|
||||
if (BCMCPU_IS_6358() || BCMCPU_IS_6362() || BCMCPU_IS_6368())
|
||||
bcm63xx_regs_spi = bcm6358_regs_spi;
|
||||
if (BCMCPU_IS_6368())
|
||||
bcm63xx_regs_spi = bcm6368_regs_spi;
|
||||
}
|
||||
#else
|
||||
static __init void bcm63xx_spi_regs_init(void) { }
|
||||
@@ -93,13 +81,13 @@ int __init bcm63xx_spi_register(void)
|
||||
spi_resources[1].start = bcm63xx_get_irq_number(IRQ_SPI);
|
||||
|
||||
if (BCMCPU_IS_6338() || BCMCPU_IS_6348()) {
|
||||
spi_resources[0].end += BCM_6338_RSET_SPI_SIZE - 1;
|
||||
spi_pdata.fifo_size = SPI_6338_MSG_DATA_SIZE;
|
||||
spi_pdata.msg_type_shift = SPI_6338_MSG_TYPE_SHIFT;
|
||||
spi_pdata.msg_ctl_width = SPI_6338_MSG_CTL_WIDTH;
|
||||
spi_resources[0].end += BCM_6348_RSET_SPI_SIZE - 1;
|
||||
spi_pdata.fifo_size = SPI_6348_MSG_DATA_SIZE;
|
||||
spi_pdata.msg_type_shift = SPI_6348_MSG_TYPE_SHIFT;
|
||||
spi_pdata.msg_ctl_width = SPI_6348_MSG_CTL_WIDTH;
|
||||
}
|
||||
|
||||
if (BCMCPU_IS_6358() || BCMCPU_IS_6368()) {
|
||||
if (BCMCPU_IS_6358() || BCMCPU_IS_6362() || BCMCPU_IS_6368()) {
|
||||
spi_resources[0].end += BCM_6358_RSET_SPI_SIZE - 1;
|
||||
spi_pdata.fifo_size = SPI_6358_MSG_DATA_SIZE;
|
||||
spi_pdata.msg_type_shift = SPI_6358_MSG_TYPE_SHIFT;
|
||||
|
||||
@@ -82,6 +82,17 @@ static void __internal_irq_unmask_64(unsigned int irq) __maybe_unused;
|
||||
#define ext_irq_cfg_reg1 PERF_EXTIRQ_CFG_REG_6358
|
||||
#define ext_irq_cfg_reg2 0
|
||||
#endif
|
||||
#ifdef CONFIG_BCM63XX_CPU_6362
|
||||
#define irq_stat_reg PERF_IRQSTAT_6362_REG
|
||||
#define irq_mask_reg PERF_IRQMASK_6362_REG
|
||||
#define irq_bits 64
|
||||
#define is_ext_irq_cascaded 1
|
||||
#define ext_irq_start (BCM_6362_EXT_IRQ0 - IRQ_INTERNAL_BASE)
|
||||
#define ext_irq_end (BCM_6362_EXT_IRQ3 - IRQ_INTERNAL_BASE)
|
||||
#define ext_irq_count 4
|
||||
#define ext_irq_cfg_reg1 PERF_EXTIRQ_CFG_REG_6362
|
||||
#define ext_irq_cfg_reg2 0
|
||||
#endif
|
||||
#ifdef CONFIG_BCM63XX_CPU_6368
|
||||
#define irq_stat_reg PERF_IRQSTAT_6368_REG
|
||||
#define irq_mask_reg PERF_IRQMASK_6368_REG
|
||||
@@ -170,6 +181,16 @@ static void bcm63xx_init_irq(void)
|
||||
ext_irq_end = BCM_6358_EXT_IRQ3 - IRQ_INTERNAL_BASE;
|
||||
ext_irq_cfg_reg1 = PERF_EXTIRQ_CFG_REG_6358;
|
||||
break;
|
||||
case BCM6362_CPU_ID:
|
||||
irq_stat_addr += PERF_IRQSTAT_6362_REG;
|
||||
irq_mask_addr += PERF_IRQMASK_6362_REG;
|
||||
irq_bits = 64;
|
||||
ext_irq_count = 4;
|
||||
is_ext_irq_cascaded = 1;
|
||||
ext_irq_start = BCM_6362_EXT_IRQ0 - IRQ_INTERNAL_BASE;
|
||||
ext_irq_end = BCM_6362_EXT_IRQ3 - IRQ_INTERNAL_BASE;
|
||||
ext_irq_cfg_reg1 = PERF_EXTIRQ_CFG_REG_6362;
|
||||
break;
|
||||
case BCM6368_CPU_ID:
|
||||
irq_stat_addr += PERF_IRQSTAT_6368_REG;
|
||||
irq_mask_addr += PERF_IRQMASK_6368_REG;
|
||||
@@ -458,6 +479,7 @@ static int bcm63xx_external_irq_set_type(struct irq_data *d,
|
||||
case BCM6338_CPU_ID:
|
||||
case BCM6345_CPU_ID:
|
||||
case BCM6358_CPU_ID:
|
||||
case BCM6362_CPU_ID:
|
||||
case BCM6368_CPU_ID:
|
||||
if (levelsense)
|
||||
reg |= EXTIRQ_CFG_LEVELSENSE(irq);
|
||||
|
||||
@@ -36,6 +36,8 @@ void __init prom_init(void)
|
||||
mask = CKCTL_6348_ALL_SAFE_EN;
|
||||
else if (BCMCPU_IS_6358())
|
||||
mask = CKCTL_6358_ALL_SAFE_EN;
|
||||
else if (BCMCPU_IS_6362())
|
||||
mask = CKCTL_6362_ALL_SAFE_EN;
|
||||
else if (BCMCPU_IS_6368())
|
||||
mask = CKCTL_6368_ALL_SAFE_EN;
|
||||
else
|
||||
|
||||
@@ -85,6 +85,20 @@
|
||||
#define BCM6358_RESET_PCIE 0
|
||||
#define BCM6358_RESET_PCIE_EXT 0
|
||||
|
||||
#define BCM6362_RESET_SPI SOFTRESET_6362_SPI_MASK
|
||||
#define BCM6362_RESET_ENET 0
|
||||
#define BCM6362_RESET_USBH SOFTRESET_6362_USBH_MASK
|
||||
#define BCM6362_RESET_USBD SOFTRESET_6362_USBS_MASK
|
||||
#define BCM6362_RESET_DSL 0
|
||||
#define BCM6362_RESET_SAR SOFTRESET_6362_SAR_MASK
|
||||
#define BCM6362_RESET_EPHY SOFTRESET_6362_EPHY_MASK
|
||||
#define BCM6362_RESET_ENETSW SOFTRESET_6362_ENETSW_MASK
|
||||
#define BCM6362_RESET_PCM SOFTRESET_6362_PCM_MASK
|
||||
#define BCM6362_RESET_MPI 0
|
||||
#define BCM6362_RESET_PCIE (SOFTRESET_6362_PCIE_MASK | \
|
||||
SOFTRESET_6362_PCIE_CORE_MASK)
|
||||
#define BCM6362_RESET_PCIE_EXT SOFTRESET_6362_PCIE_EXT_MASK
|
||||
|
||||
#define BCM6368_RESET_SPI SOFTRESET_6368_SPI_MASK
|
||||
#define BCM6368_RESET_ENET 0
|
||||
#define BCM6368_RESET_USBH SOFTRESET_6368_USBH_MASK
|
||||
@@ -119,6 +133,10 @@ static const u32 bcm6358_reset_bits[] = {
|
||||
__GEN_RESET_BITS_TABLE(6358)
|
||||
};
|
||||
|
||||
static const u32 bcm6362_reset_bits[] = {
|
||||
__GEN_RESET_BITS_TABLE(6362)
|
||||
};
|
||||
|
||||
static const u32 bcm6368_reset_bits[] = {
|
||||
__GEN_RESET_BITS_TABLE(6368)
|
||||
};
|
||||
@@ -140,6 +158,9 @@ static int __init bcm63xx_reset_bits_init(void)
|
||||
} else if (BCMCPU_IS_6358()) {
|
||||
reset_reg = PERF_SOFTRESET_6358_REG;
|
||||
bcm63xx_reset_bits = bcm6358_reset_bits;
|
||||
} else if (BCMCPU_IS_6362()) {
|
||||
reset_reg = PERF_SOFTRESET_6362_REG;
|
||||
bcm63xx_reset_bits = bcm6362_reset_bits;
|
||||
} else if (BCMCPU_IS_6368()) {
|
||||
reset_reg = PERF_SOFTRESET_6368_REG;
|
||||
bcm63xx_reset_bits = bcm6368_reset_bits;
|
||||
@@ -182,6 +203,13 @@ static const u32 bcm63xx_reset_bits[] = {
|
||||
#define reset_reg PERF_SOFTRESET_6358_REG
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_BCM63XX_CPU_6362
|
||||
static const u32 bcm63xx_reset_bits[] = {
|
||||
__GEN_RESET_BITS_TABLE(6362)
|
||||
};
|
||||
#define reset_reg PERF_SOFTRESET_6362_REG
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_BCM63XX_CPU_6368
|
||||
static const u32 bcm63xx_reset_bits[] = {
|
||||
__GEN_RESET_BITS_TABLE(6368)
|
||||
|
||||
@@ -83,6 +83,9 @@ void bcm63xx_machine_reboot(void)
|
||||
case BCM6358_CPU_ID:
|
||||
perf_regs[0] = PERF_EXTIRQ_CFG_REG_6358;
|
||||
break;
|
||||
case BCM6362_CPU_ID:
|
||||
perf_regs[0] = PERF_EXTIRQ_CFG_REG_6362;
|
||||
break;
|
||||
}
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
@@ -126,7 +129,7 @@ static void __bcm63xx_machine_reboot(char *p)
|
||||
const char *get_system_type(void)
|
||||
{
|
||||
static char buf[128];
|
||||
snprintf(buf, sizeof(buf), "bcm63xx/%s (0x%04x/0x%04X)",
|
||||
snprintf(buf, sizeof(buf), "bcm63xx/%s (0x%04x/0x%02X)",
|
||||
board_get_name(),
|
||||
bcm63xx_get_cpu_id(), bcm63xx_get_cpu_rev());
|
||||
return buf;
|
||||
|
||||
@@ -1032,9 +1032,8 @@ static int octeon_irq_gpio_map_common(struct irq_domain *d,
|
||||
if (!octeon_irq_virq_in_range(virq))
|
||||
return -EINVAL;
|
||||
|
||||
hw += gpiod->base_hwirq;
|
||||
line = hw >> 6;
|
||||
bit = hw & 63;
|
||||
line = (hw + gpiod->base_hwirq) >> 6;
|
||||
bit = (hw + gpiod->base_hwirq) & 63;
|
||||
if (line > line_limit || octeon_irq_ciu_to_irq[line][bit] != 0)
|
||||
return -EINVAL;
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user