forked from Minki/linux
Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus
Pull MIPS updates from Ralf Baechle: "These are the highlists of the main MIPS pull request for 4.4: - Add latencytop support - Support appended DTBs - VDSO support and initially use it for gettimeofday. - Drop the .MIPS.abiflags and ELF NOTE sections from vmlinux - Support for the 5KE, an internal test core. - Switch all MIPS platfroms to libata drivers. - Improved support, cleanups for ralink and Lantiq platforms. - Support for the new xilfpga platform. - A number of DTB improvments for BMIPS. - Improved support for CM and CPS. - Minor JZ4740 and BCM47xx enhancements" * 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus: (120 commits) MIPS: idle: add case for CPU_5KE MIPS: Octeon: Support APPENDED_DTB MIPS: vmlinux: create a section for appended DTB MIPS: Clean up compat_siginfo_t MIPS: Fix PAGE_MASK definition MIPS: BMIPS: Enable GZIP ramdisk and timed printks MIPS: Add xilfpga defconfig MIPS: xilfpga: Add mipsfpga platform code MIPS: xilfpga: Add xilfpga device tree files. dt-bindings: MIPS: Document xilfpga bindings and boot style MIPS: Make MIPS_CMDLINE_DTB default MIPS: Make the kernel arguments from dtb available MIPS: Use USE_OF as the guard for appended dtb MIPS: BCM63XX: Use pr_* instead of printk MIPS: Loongson: Cleanup CONFIG_LOONGSON_SUSPEND. MIPS: lantiq: Disable xbar fpi burst mode MIPS: lantiq: Force the crossbar to big endian MIPS: lantiq: Initialize the USB core on boot MIPS: lantiq: Return correct value for fpi clock on ar9 MIPS: ralink: Add missing clock on rt305x ...
This commit is contained in:
commit
b84da9fa47
83
Documentation/devicetree/bindings/mips/img/xilfpga.txt
Normal file
83
Documentation/devicetree/bindings/mips/img/xilfpga.txt
Normal file
@ -0,0 +1,83 @@
|
||||
Imagination University Program MIPSfpga
|
||||
=======================================
|
||||
|
||||
Under the Imagination University Program, a microAptiv UP core has been
|
||||
released for academic usage.
|
||||
|
||||
As we are dealing with a MIPS core instantiated on an FPGA, specifications
|
||||
are fluid and can be varied in RTL.
|
||||
|
||||
This binding document is provided as baseline guidance for the example
|
||||
project provided by IMG.
|
||||
|
||||
The example project runs on the Nexys4DDR board by Digilent powered by
|
||||
the ARTIX-7 FPGA by Xilinx.
|
||||
|
||||
Relevant details about the example project and the Nexys4DDR board:
|
||||
|
||||
- microAptiv UP core m14Kc
|
||||
- 50MHz clock speed
|
||||
- 128Mbyte DDR RAM at 0x0000_0000
|
||||
- 8Kbyte RAM at 0x1000_0000
|
||||
- axi_intc at 0x1020_0000
|
||||
- axi_uart16550 at 0x1040_0000
|
||||
- axi_gpio at 0x1060_0000
|
||||
- axi_i2c at 0x10A0_0000
|
||||
- custom_gpio at 0x10C0_0000
|
||||
- axi_ethernetlite at 0x10E0_0000
|
||||
- 8Kbyte BootRAM at 0x1FC0_0000
|
||||
|
||||
Required properties:
|
||||
--------------------
|
||||
- compatible: Must include "digilent,nexys4ddr","img,xilfpga".
|
||||
|
||||
CPU nodes:
|
||||
----------
|
||||
A "cpus" node is required. Required properties:
|
||||
- #address-cells: Must be 1.
|
||||
- #size-cells: Must be 0.
|
||||
A CPU sub-node is also required for at least CPU 0. Required properties:
|
||||
- device_type: Must be "cpu".
|
||||
- compatible: Must be "mips,m14Kc".
|
||||
- reg: Must be <0>.
|
||||
- clocks: phandle to ext clock for fixed-clock received by MIPS core.
|
||||
|
||||
Example:
|
||||
|
||||
compatible = "img,xilfpga","digilent,nexys4ddr";
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
cpu0: cpu@0 {
|
||||
device_type = "cpu";
|
||||
compatible = "mips,m14Kc";
|
||||
reg = <0>;
|
||||
clocks = <&ext>;
|
||||
};
|
||||
};
|
||||
|
||||
ext: ext {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <50000000>;
|
||||
};
|
||||
|
||||
Boot protocol:
|
||||
--------------
|
||||
|
||||
The BootRAM is a writeable "RAM" in FPGA at 0x1FC0_0000.
|
||||
This is for easy reprogrammibility via JTAG.
|
||||
|
||||
The BootRAM initializes the cache and the axi_uart peripheral.
|
||||
|
||||
DDR initialization is already handled by a HW IP block.
|
||||
|
||||
When the example project bitstream is loaded, the cpu_reset button
|
||||
needs to be pressed.
|
||||
|
||||
The bootram initializes the cache and axi_uart.
|
||||
Then outputs MIPSFPGA\n\r on the serial port on the Nexys4DDR board.
|
||||
|
||||
At this point, the board is ready to load the Linux kernel
|
||||
vmlinux file via JTAG.
|
@ -17,6 +17,7 @@ obj- := $(platform-)
|
||||
obj-y += kernel/
|
||||
obj-y += mm/
|
||||
obj-y += net/
|
||||
obj-y += vdso/
|
||||
|
||||
ifdef CONFIG_KVM
|
||||
obj-y += kvm/
|
||||
|
@ -33,6 +33,7 @@ platforms += sibyte
|
||||
platforms += sni
|
||||
platforms += txx9
|
||||
platforms += vr41xx
|
||||
platforms += xilfpga
|
||||
|
||||
# include the platform specific files
|
||||
include $(patsubst %, $(srctree)/arch/mips/%/Platform, $(platforms))
|
||||
|
@ -5,6 +5,7 @@ config MIPS
|
||||
select ARCH_MIGHT_HAVE_PC_PARPORT
|
||||
select ARCH_MIGHT_HAVE_PC_SERIO
|
||||
select ARCH_USE_CMPXCHG_LOCKREF if 64BIT
|
||||
select ARCH_USE_BUILTIN_BSWAP
|
||||
select HAVE_CONTEXT_TRACKING
|
||||
select HAVE_GENERIC_DMA_COHERENT
|
||||
select HAVE_IDE
|
||||
@ -60,6 +61,8 @@ config MIPS
|
||||
select SYSCTL_EXCEPTION_TRACE
|
||||
select HAVE_VIRT_CPU_ACCOUNTING_GEN
|
||||
select HAVE_IRQ_TIME_ACCOUNTING
|
||||
select GENERIC_TIME_VSYSCALL
|
||||
select ARCH_CLOCKSOURCE_DATA
|
||||
|
||||
menu "Machine selection"
|
||||
|
||||
@ -401,6 +404,28 @@ config MACH_PISTACHIO
|
||||
help
|
||||
This enables support for the IMG Pistachio SoC platform.
|
||||
|
||||
config MACH_XILFPGA
|
||||
bool "MIPSfpga Xilinx based boards"
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
select BOOT_ELF32
|
||||
select BOOT_RAW
|
||||
select BUILTIN_DTB
|
||||
select CEVT_R4K
|
||||
select COMMON_CLK
|
||||
select CSRC_R4K
|
||||
select IRQ_MIPS_CPU
|
||||
select LIBFDT
|
||||
select MIPS_CPU_SCACHE
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
select SYS_HAS_CPU_MIPS32_R2
|
||||
select SYS_SUPPORTS_32BIT_KERNEL
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_SUPPORTS_ZBOOT_UART16550
|
||||
select USE_OF
|
||||
select USE_GENERIC_EARLY_PRINTK_8250
|
||||
help
|
||||
This enables support for the IMG University Program MIPSfpga platform.
|
||||
|
||||
config MIPS_MALTA
|
||||
bool "MIPS Malta board"
|
||||
select ARCH_MAY_HAVE_PC_FDC
|
||||
@ -424,6 +449,7 @@ config MIPS_MALTA
|
||||
select MIPS_L1_CACHE_SHIFT_6
|
||||
select PCI_GT64XXX_PCI0
|
||||
select MIPS_MSC
|
||||
select SMP_UP if SMP
|
||||
select SWAP_IO_SPACE
|
||||
select SYS_HAS_CPU_MIPS32_R1
|
||||
select SYS_HAS_CPU_MIPS32_R2
|
||||
@ -449,6 +475,8 @@ config MIPS_MALTA
|
||||
select SYS_SUPPORTS_ZBOOT
|
||||
select USE_OF
|
||||
select ZONE_DMA32 if 64BIT
|
||||
select BUILTIN_DTB
|
||||
select LIBFDT
|
||||
help
|
||||
This enables support for the MIPS Technologies Malta evaluation
|
||||
board.
|
||||
@ -964,6 +992,7 @@ source "arch/mips/loongson32/Kconfig"
|
||||
source "arch/mips/loongson64/Kconfig"
|
||||
source "arch/mips/netlogic/Kconfig"
|
||||
source "arch/mips/paravirt/Kconfig"
|
||||
source "arch/mips/xilfpga/Kconfig"
|
||||
|
||||
endmenu
|
||||
|
||||
@ -1036,6 +1065,9 @@ config CSRC_R4K
|
||||
config CSRC_SB1250
|
||||
bool
|
||||
|
||||
config MIPS_CLOCK_VSYSCALL
|
||||
def_bool CSRC_R4K || CLKSRC_MIPS_GIC
|
||||
|
||||
config GPIO_TXX9
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
bool
|
||||
@ -2529,6 +2561,9 @@ choice
|
||||
help
|
||||
Allows the configuration of the timer frequency.
|
||||
|
||||
config HZ_24
|
||||
bool "24 HZ" if SYS_SUPPORTS_24HZ || SYS_SUPPORTS_ARBIT_HZ
|
||||
|
||||
config HZ_48
|
||||
bool "48 HZ" if SYS_SUPPORTS_48HZ || SYS_SUPPORTS_ARBIT_HZ
|
||||
|
||||
@ -2552,6 +2587,9 @@ choice
|
||||
|
||||
endchoice
|
||||
|
||||
config SYS_SUPPORTS_24HZ
|
||||
bool
|
||||
|
||||
config SYS_SUPPORTS_48HZ
|
||||
bool
|
||||
|
||||
@ -2575,13 +2613,18 @@ config SYS_SUPPORTS_1024HZ
|
||||
|
||||
config SYS_SUPPORTS_ARBIT_HZ
|
||||
bool
|
||||
default y if !SYS_SUPPORTS_48HZ && !SYS_SUPPORTS_100HZ && \
|
||||
!SYS_SUPPORTS_128HZ && !SYS_SUPPORTS_250HZ && \
|
||||
!SYS_SUPPORTS_256HZ && !SYS_SUPPORTS_1000HZ && \
|
||||
default y if !SYS_SUPPORTS_24HZ && \
|
||||
!SYS_SUPPORTS_48HZ && \
|
||||
!SYS_SUPPORTS_100HZ && \
|
||||
!SYS_SUPPORTS_128HZ && \
|
||||
!SYS_SUPPORTS_250HZ && \
|
||||
!SYS_SUPPORTS_256HZ && \
|
||||
!SYS_SUPPORTS_1000HZ && \
|
||||
!SYS_SUPPORTS_1024HZ
|
||||
|
||||
config HZ
|
||||
int
|
||||
default 24 if HZ_24
|
||||
default 48 if HZ_48
|
||||
default 100 if HZ_100
|
||||
default 128 if HZ_128
|
||||
@ -2685,7 +2728,7 @@ config BUILTIN_DTB
|
||||
bool
|
||||
|
||||
choice
|
||||
prompt "Kernel appended dtb support" if OF
|
||||
prompt "Kernel appended dtb support" if USE_OF
|
||||
default MIPS_NO_APPENDED_DTB
|
||||
|
||||
config MIPS_NO_APPENDED_DTB
|
||||
@ -2693,6 +2736,20 @@ choice
|
||||
help
|
||||
Do not enable appended dtb support.
|
||||
|
||||
config MIPS_ELF_APPENDED_DTB
|
||||
bool "vmlinux"
|
||||
help
|
||||
With this option, the boot code will look for a device tree binary
|
||||
DTB) included in the vmlinux ELF section .appended_dtb. By default
|
||||
it is empty and the DTB can be appended using binutils command
|
||||
objcopy:
|
||||
|
||||
objcopy --update-section .appended_dtb=<filename>.dtb vmlinux
|
||||
|
||||
This is meant as a backward compatiblity convenience for those
|
||||
systems with a bootloader that can't be upgraded to accommodate
|
||||
the documented boot protocol using a device tree.
|
||||
|
||||
config MIPS_RAW_APPENDED_DTB
|
||||
bool "vmlinux.bin"
|
||||
help
|
||||
@ -2729,6 +2786,25 @@ choice
|
||||
if you don't intend to always append a DTB.
|
||||
endchoice
|
||||
|
||||
choice
|
||||
prompt "Kernel command line type" if !CMDLINE_OVERRIDE
|
||||
default MIPS_CMDLINE_FROM_DTB if USE_OF && !ATH79 && !MACH_INGENIC && \
|
||||
!MIPS_MALTA && !MIPS_SEAD3 && \
|
||||
!CAVIUM_OCTEON_SOC
|
||||
default MIPS_CMDLINE_FROM_BOOTLOADER
|
||||
|
||||
config MIPS_CMDLINE_FROM_DTB
|
||||
depends on USE_OF
|
||||
bool "Dtb kernel arguments if available"
|
||||
|
||||
config MIPS_CMDLINE_DTB_EXTEND
|
||||
depends on USE_OF
|
||||
bool "Extend dtb kernel arguments with bootloader arguments"
|
||||
|
||||
config MIPS_CMDLINE_FROM_BOOTLOADER
|
||||
bool "Bootloader kernel arguments if available"
|
||||
endchoice
|
||||
|
||||
endmenu
|
||||
|
||||
config LOCKDEP_SUPPORT
|
||||
@ -2739,6 +2815,10 @@ config STACKTRACE_SUPPORT
|
||||
bool
|
||||
default y
|
||||
|
||||
config HAVE_LATENCYTOP_SUPPORT
|
||||
bool
|
||||
default y
|
||||
|
||||
config PGTABLE_LEVELS
|
||||
int
|
||||
default 3 if 64BIT && !PAGE_SIZE_64KB
|
||||
|
@ -113,4 +113,76 @@ config SPINLOCK_TEST
|
||||
help
|
||||
Add several files to the debugfs to test spinlock speed.
|
||||
|
||||
if CPU_MIPSR6
|
||||
|
||||
choice
|
||||
prompt "Compact branch policy"
|
||||
default MIPS_COMPACT_BRANCHES_OPTIMAL
|
||||
|
||||
config MIPS_COMPACT_BRANCHES_NEVER
|
||||
bool "Never (force delay slot branches)"
|
||||
help
|
||||
Pass the -mcompact-branches=never flag to the compiler in order to
|
||||
force it to always emit branches with delay slots, and make no use
|
||||
of the compact branch instructions introduced by MIPSr6. This is
|
||||
useful if you suspect there may be an issue with compact branches in
|
||||
either the compiler or the CPU.
|
||||
|
||||
config MIPS_COMPACT_BRANCHES_OPTIMAL
|
||||
bool "Optimal (use where beneficial)"
|
||||
help
|
||||
Pass the -mcompact-branches=optimal flag to the compiler in order for
|
||||
it to make use of compact branch instructions where it deems them
|
||||
beneficial, and use branches with delay slots elsewhere. This is the
|
||||
default compiler behaviour, and should be used unless you have a
|
||||
reason to choose otherwise.
|
||||
|
||||
config MIPS_COMPACT_BRANCHES_ALWAYS
|
||||
bool "Always (force compact branches)"
|
||||
help
|
||||
Pass the -mcompact-branches=always flag to the compiler in order to
|
||||
force it to always emit compact branches, making no use of branch
|
||||
instructions with delay slots. This can result in more compact code
|
||||
which may be beneficial in some scenarios.
|
||||
|
||||
endchoice
|
||||
|
||||
endif # CPU_MIPSR6
|
||||
|
||||
config SCACHE_DEBUGFS
|
||||
bool "L2 cache debugfs entries"
|
||||
depends on DEBUG_FS
|
||||
help
|
||||
Enable this to allow parts of the L2 cache configuration, such as
|
||||
whether or not prefetching is enabled, to be exposed to userland
|
||||
via debugfs.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
menuconfig MIPS_CPS_NS16550
|
||||
bool "CPS SMP NS16550 UART output"
|
||||
depends on MIPS_CPS
|
||||
help
|
||||
Output debug information via an ns16550 compatible UART if exceptions
|
||||
occur early in the boot process of a secondary core.
|
||||
|
||||
if MIPS_CPS_NS16550
|
||||
|
||||
config MIPS_CPS_NS16550_BASE
|
||||
hex "UART Base Address"
|
||||
default 0x1b0003f8 if MIPS_MALTA
|
||||
help
|
||||
The base address of the ns16550 compatible UART on which to output
|
||||
debug information from the early stages of core startup.
|
||||
|
||||
config MIPS_CPS_NS16550_SHIFT
|
||||
int "UART Register Shift"
|
||||
default 0 if MIPS_MALTA
|
||||
help
|
||||
The number of bits to shift ns16550 register indices by in order to
|
||||
form their addresses. That is, log base 2 of the span between
|
||||
adjacent ns16550 registers in the system.
|
||||
|
||||
endif # MIPS_CPS_NS16550
|
||||
|
||||
endmenu
|
||||
|
@ -204,6 +204,10 @@ toolchain-msa := $(call cc-option-yn,$(mips-cflags) -mhard-float -mfp64 -Wa$(
|
||||
cflags-$(toolchain-msa) += -DTOOLCHAIN_SUPPORTS_MSA
|
||||
endif
|
||||
|
||||
cflags-$(CONFIG_MIPS_COMPACT_BRANCHES_NEVER) += -mcompact-branches=never
|
||||
cflags-$(CONFIG_MIPS_COMPACT_BRANCHES_OPTIMAL) += -mcompact-branches=optimal
|
||||
cflags-$(CONFIG_MIPS_COMPACT_BRANCHES_ALWAYS) += -mcompact-branches=always
|
||||
|
||||
#
|
||||
# Firmware support
|
||||
#
|
||||
|
@ -105,11 +105,28 @@ static int bcm47xx_get_invariants(struct ssb_bus *bus,
|
||||
struct ssb_init_invariants *iv)
|
||||
{
|
||||
char buf[20];
|
||||
int len, err;
|
||||
|
||||
/* Fill boardinfo structure */
|
||||
memset(&iv->boardinfo, 0 , sizeof(struct ssb_boardinfo));
|
||||
|
||||
bcm47xx_fill_ssb_boardinfo(&iv->boardinfo, NULL);
|
||||
len = bcm47xx_nvram_getenv("boardvendor", buf, sizeof(buf));
|
||||
if (len > 0) {
|
||||
err = kstrtou16(strim(buf), 0, &iv->boardinfo.vendor);
|
||||
if (err)
|
||||
pr_warn("Couldn't parse nvram board vendor entry with value \"%s\"\n",
|
||||
buf);
|
||||
}
|
||||
if (!iv->boardinfo.vendor)
|
||||
iv->boardinfo.vendor = SSB_BOARDVENDOR_BCM;
|
||||
|
||||
len = bcm47xx_nvram_getenv("boardtype", buf, sizeof(buf));
|
||||
if (len > 0) {
|
||||
err = kstrtou16(strim(buf), 0, &iv->boardinfo.type);
|
||||
if (err)
|
||||
pr_warn("Couldn't parse nvram board type entry with value \"%s\"\n",
|
||||
buf);
|
||||
}
|
||||
|
||||
memset(&iv->sprom, 0, sizeof(struct ssb_sprom));
|
||||
bcm47xx_fill_sprom(&iv->sprom, NULL, false);
|
||||
|
@ -60,9 +60,9 @@ static int get_nvram_var(const char *prefix, const char *postfix,
|
||||
}
|
||||
|
||||
#define NVRAM_READ_VAL(type) \
|
||||
static void nvram_read_ ## type (const char *prefix, \
|
||||
const char *postfix, const char *name, \
|
||||
type *val, type allset, bool fallback) \
|
||||
static void nvram_read_ ## type(const char *prefix, \
|
||||
const char *postfix, const char *name, \
|
||||
type *val, type allset, bool fallback) \
|
||||
{ \
|
||||
char buf[100]; \
|
||||
int err; \
|
||||
@ -422,7 +422,10 @@ static void bcm47xx_fill_sprom_path_r4589(struct ssb_sprom *sprom,
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(sprom->core_pwr_info); i++) {
|
||||
struct ssb_sprom_core_pwr_info *pwr_info = &sprom->core_pwr_info[i];
|
||||
struct ssb_sprom_core_pwr_info *pwr_info;
|
||||
|
||||
pwr_info = &sprom->core_pwr_info[i];
|
||||
|
||||
snprintf(postfix, sizeof(postfix), "%i", i);
|
||||
nvram_read_u8(prefix, postfix, "maxp2ga",
|
||||
&pwr_info->maxpwr_2g, 0, fallback);
|
||||
@ -470,7 +473,10 @@ static void bcm47xx_fill_sprom_path_r45(struct ssb_sprom *sprom,
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(sprom->core_pwr_info); i++) {
|
||||
struct ssb_sprom_core_pwr_info *pwr_info = &sprom->core_pwr_info[i];
|
||||
struct ssb_sprom_core_pwr_info *pwr_info;
|
||||
|
||||
pwr_info = &sprom->core_pwr_info[i];
|
||||
|
||||
snprintf(postfix, sizeof(postfix), "%i", i);
|
||||
nvram_read_u16(prefix, postfix, "pa2gw3a",
|
||||
&pwr_info->pa_2g[3], 0, fallback);
|
||||
@ -535,10 +541,11 @@ static void bcm47xx_fill_sprom_ethernet(struct ssb_sprom *sprom,
|
||||
nvram_read_macaddr(prefix, "il0macaddr", sprom->il0mac, fallback);
|
||||
|
||||
/* The address prefix 00:90:4C is used by Broadcom in their initial
|
||||
configuration. When a mac address with the prefix 00:90:4C is used
|
||||
all devices from the same series are sharing the same mac address.
|
||||
To prevent mac address collisions we replace them with a mac address
|
||||
based on the base address. */
|
||||
* configuration. When a mac address with the prefix 00:90:4C is used
|
||||
* all devices from the same series are sharing the same mac address.
|
||||
* To prevent mac address collisions we replace them with a mac address
|
||||
* based on the base address.
|
||||
*/
|
||||
if (!bcm47xx_is_valid_mac(sprom->il0mac)) {
|
||||
u8 mac[6];
|
||||
|
||||
@ -592,32 +599,23 @@ void bcm47xx_fill_sprom(struct ssb_sprom *sprom, const char *prefix,
|
||||
bcm47xx_sprom_fill_auto(sprom, prefix, fallback);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BCM47XX_SSB
|
||||
void bcm47xx_fill_ssb_boardinfo(struct ssb_boardinfo *boardinfo,
|
||||
const char *prefix)
|
||||
{
|
||||
nvram_read_u16(prefix, NULL, "boardvendor", &boardinfo->vendor, 0,
|
||||
true);
|
||||
if (!boardinfo->vendor)
|
||||
boardinfo->vendor = SSB_BOARDVENDOR_BCM;
|
||||
|
||||
nvram_read_u16(prefix, NULL, "boardtype", &boardinfo->type, 0, true);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_BCM47XX_SSB)
|
||||
static int bcm47xx_get_sprom_ssb(struct ssb_bus *bus, struct ssb_sprom *out)
|
||||
{
|
||||
char prefix[10];
|
||||
|
||||
if (bus->bustype == SSB_BUSTYPE_PCI) {
|
||||
switch (bus->bustype) {
|
||||
case SSB_BUSTYPE_SSB:
|
||||
bcm47xx_fill_sprom(out, NULL, false);
|
||||
return 0;
|
||||
case SSB_BUSTYPE_PCI:
|
||||
memset(out, 0, sizeof(struct ssb_sprom));
|
||||
snprintf(prefix, sizeof(prefix), "pci/%u/%u/",
|
||||
bus->host_pci->bus->number + 1,
|
||||
PCI_SLOT(bus->host_pci->devfn));
|
||||
bcm47xx_fill_sprom(out, prefix, false);
|
||||
return 0;
|
||||
} else {
|
||||
default:
|
||||
pr_warn("Unable to fill SPROM for given bustype.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -7,6 +7,8 @@
|
||||
* Copyright (C) 2008 Florian Fainelli <florian@openwrt.org>
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/string.h>
|
||||
@ -31,7 +33,6 @@
|
||||
|
||||
#include <uapi/linux/bcm933xx_hcs.h>
|
||||
|
||||
#define PFX "board_bcm963xx: "
|
||||
|
||||
#define HCS_OFFSET_128K 0x20000
|
||||
|
||||
@ -740,7 +741,7 @@ int bcm63xx_get_fallback_sprom(struct ssb_bus *bus, struct ssb_sprom *out)
|
||||
memcpy(out, &bcm63xx_sprom, sizeof(struct ssb_sprom));
|
||||
return 0;
|
||||
} else {
|
||||
printk(KERN_ERR PFX "unable to fill SPROM for given bustype.\n");
|
||||
pr_err("unable to fill SPROM for given bustype\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
@ -784,7 +785,7 @@ void __init board_prom_init(void)
|
||||
cfe[5], cfe[6], cfe[7], cfe[8], cfe[9]);
|
||||
else
|
||||
strcpy(cfe_version, "unknown");
|
||||
printk(KERN_INFO PFX "CFE version: %s\n", cfe_version);
|
||||
pr_info("CFE version: %s\n", cfe_version);
|
||||
|
||||
bcm63xx_nvram_init(boot_addr + BCM963XX_NVRAM_OFFSET);
|
||||
|
||||
@ -808,8 +809,7 @@ void __init board_prom_init(void)
|
||||
char name[17];
|
||||
memcpy(name, board_name, 16);
|
||||
name[16] = 0;
|
||||
printk(KERN_ERR PFX "unknown bcm963xx board: %s\n",
|
||||
name);
|
||||
pr_err("unknown bcm963xx board: %s\n", name);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -854,7 +854,7 @@ void __init board_setup(void)
|
||||
{
|
||||
if (!board.name[0])
|
||||
panic("unable to detect bcm963xx board");
|
||||
printk(KERN_INFO PFX "board name: %s\n", board.name);
|
||||
pr_info("board name: %s\n", board.name);
|
||||
|
||||
/* make sure we're running on expected cpu */
|
||||
if (bcm63xx_get_cpu_id() != board.expected_cpu_id)
|
||||
@ -910,7 +910,7 @@ int __init board_register_devices(void)
|
||||
memcpy(bcm63xx_sprom.et1mac, bcm63xx_sprom.il0mac, ETH_ALEN);
|
||||
if (ssb_arch_register_fallback_sprom(
|
||||
&bcm63xx_get_fallback_sprom) < 0)
|
||||
pr_err(PFX "failed to register fallback SPROM\n");
|
||||
pr_err("failed to register fallback SPROM\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -376,10 +376,10 @@ void __init bcm63xx_cpu_init(void)
|
||||
bcm63xx_cpu_freq = detect_cpu_clock();
|
||||
bcm63xx_memory_size = detect_memory_size();
|
||||
|
||||
printk(KERN_INFO "Detected Broadcom 0x%04x CPU revision %02x\n",
|
||||
bcm63xx_cpu_id, bcm63xx_cpu_rev);
|
||||
printk(KERN_INFO "CPU frequency is %u MHz\n",
|
||||
bcm63xx_cpu_freq / 1000000);
|
||||
printk(KERN_INFO "%uMB of RAM installed\n",
|
||||
bcm63xx_memory_size >> 20);
|
||||
pr_info("Detected Broadcom 0x%04x CPU revision %02x\n",
|
||||
bcm63xx_cpu_id, bcm63xx_cpu_rev);
|
||||
pr_info("CPU frequency is %u MHz\n",
|
||||
bcm63xx_cpu_freq / 1000000);
|
||||
pr_info("%uMB of RAM installed\n",
|
||||
bcm63xx_memory_size >> 20);
|
||||
}
|
||||
|
@ -139,6 +139,6 @@ int __init bcm63xx_pcmcia_register(void)
|
||||
return platform_device_register(&bcm63xx_pcmcia_device);
|
||||
|
||||
out_err:
|
||||
printk(KERN_ERR "unable to set pcmcia chip select\n");
|
||||
pr_err("unable to set pcmcia chip select\n");
|
||||
return ret;
|
||||
}
|
||||
|
@ -311,7 +311,7 @@ static int bcm63xx_external_irq_set_type(struct irq_data *d,
|
||||
break;
|
||||
|
||||
default:
|
||||
printk(KERN_ERR "bogus flow type combination given !\n");
|
||||
pr_err("bogus flow type combination given !\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -24,7 +24,7 @@
|
||||
|
||||
void bcm63xx_machine_halt(void)
|
||||
{
|
||||
printk(KERN_INFO "System halted\n");
|
||||
pr_info("System halted\n");
|
||||
while (1)
|
||||
;
|
||||
}
|
||||
@ -34,7 +34,7 @@ static void bcm6348_a1_reboot(void)
|
||||
u32 reg;
|
||||
|
||||
/* soft reset all blocks */
|
||||
printk(KERN_INFO "soft-resetting all blocks ...\n");
|
||||
pr_info("soft-resetting all blocks ...\n");
|
||||
reg = bcm_perf_readl(PERF_SOFTRESET_REG);
|
||||
reg &= ~SOFTRESET_6348_ALL;
|
||||
bcm_perf_writel(reg, PERF_SOFTRESET_REG);
|
||||
@ -46,7 +46,7 @@ static void bcm6348_a1_reboot(void)
|
||||
mdelay(10);
|
||||
|
||||
/* Jump to the power on address. */
|
||||
printk(KERN_INFO "jumping to reset vector.\n");
|
||||
pr_info("jumping to reset vector.\n");
|
||||
/* set high vectors (base at 0xbfc00000 */
|
||||
set_c0_status(ST0_BEV | ST0_ERL);
|
||||
/* run uncached in kseg0 */
|
||||
@ -110,7 +110,7 @@ void bcm63xx_machine_reboot(void)
|
||||
if (BCMCPU_IS_6348() && (bcm63xx_get_cpu_rev() == 0xa1))
|
||||
bcm6348_a1_reboot();
|
||||
|
||||
printk(KERN_INFO "triggering watchdog soft-reset...\n");
|
||||
pr_info("triggering watchdog soft-reset...\n");
|
||||
if (BCMCPU_IS_6328()) {
|
||||
bcm_wdt_writel(1, WDT_SOFTRESET_REG);
|
||||
} else {
|
||||
|
@ -195,7 +195,7 @@ int bcm63xx_timer_init(void)
|
||||
irq = bcm63xx_get_irq_number(IRQ_TIMER);
|
||||
ret = request_irq(irq, timer_interrupt, 0, "bcm63xx_timer", NULL);
|
||||
if (ret) {
|
||||
printk(KERN_ERR "bcm63xx_timer: failed to register irq\n");
|
||||
pr_err("%s: failed to register irq\n", __func__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -157,7 +157,6 @@ void __init plat_mem_setup(void)
|
||||
panic("no dtb found");
|
||||
|
||||
__dt_setup_arch(dtb);
|
||||
strlcpy(arcs_cmdline, boot_command_line, COMMAND_LINE_SIZE);
|
||||
|
||||
for (q = bmips_quirk_list; q->quirk_fn; q++) {
|
||||
if (of_flat_dt_is_compatible(of_get_flat_dt_root(),
|
||||
|
@ -6,6 +6,7 @@ dts-dirs += mti
|
||||
dts-dirs += netlogic
|
||||
dts-dirs += qca
|
||||
dts-dirs += ralink
|
||||
dts-dirs += xilfpga
|
||||
|
||||
obj-y := $(addsuffix /, $(dts-dirs))
|
||||
|
||||
|
@ -87,14 +87,32 @@
|
||||
compatible = "brcm,bcm7120-l2-intc";
|
||||
reg = <0x406780 0x8>;
|
||||
|
||||
brcm,int-map-mask = <0x44>;
|
||||
brcm,int-map-mask = <0x44>, <0xf000000>;
|
||||
brcm,int-fwd-mask = <0x70000>;
|
||||
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
|
||||
interrupt-parent = <&periph_intc>;
|
||||
interrupts = <59>;
|
||||
interrupts = <59>, <57>;
|
||||
interrupt-names = "upg_main", "upg_bsc";
|
||||
};
|
||||
|
||||
upg_aon_irq0_intc: upg_aon_irq0_intc@408b80 {
|
||||
compatible = "brcm,bcm7120-l2-intc";
|
||||
reg = <0x408b80 0x8>;
|
||||
|
||||
brcm,int-map-mask = <0x40>, <0x8000000>, <0x100000>;
|
||||
brcm,int-fwd-mask = <0>;
|
||||
brcm,irq-can-wake;
|
||||
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
|
||||
interrupt-parent = <&periph_intc>;
|
||||
interrupts = <60>, <58>, <62>;
|
||||
interrupt-names = "upg_main_aon", "upg_bsc_aon",
|
||||
"upg_spi";
|
||||
};
|
||||
|
||||
sun_top_ctrl: syscon@404000 {
|
||||
@ -144,6 +162,56 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
bsca: i2c@406200 {
|
||||
clock-frequency = <390000>;
|
||||
compatible = "brcm,brcmstb-i2c";
|
||||
interrupt-parent = <&upg_irq0_intc>;
|
||||
reg = <0x406200 0x58>;
|
||||
interrupts = <24>;
|
||||
interrupt-names = "upg_bsca";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
bscb: i2c@406280 {
|
||||
clock-frequency = <390000>;
|
||||
compatible = "brcm,brcmstb-i2c";
|
||||
interrupt-parent = <&upg_irq0_intc>;
|
||||
reg = <0x406280 0x58>;
|
||||
interrupts = <25>;
|
||||
interrupt-names = "upg_bscb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
bscc: i2c@406300 {
|
||||
clock-frequency = <390000>;
|
||||
compatible = "brcm,brcmstb-i2c";
|
||||
interrupt-parent = <&upg_irq0_intc>;
|
||||
reg = <0x406300 0x58>;
|
||||
interrupts = <26>;
|
||||
interrupt-names = "upg_bscc";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
bscd: i2c@406380 {
|
||||
clock-frequency = <390000>;
|
||||
compatible = "brcm,brcmstb-i2c";
|
||||
interrupt-parent = <&upg_irq0_intc>;
|
||||
reg = <0x406380 0x58>;
|
||||
interrupts = <27>;
|
||||
interrupt-names = "upg_bscd";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
bsce: i2c@408980 {
|
||||
clock-frequency = <390000>;
|
||||
compatible = "brcm,brcmstb-i2c";
|
||||
interrupt-parent = <&upg_aon_irq0_intc>;
|
||||
reg = <0x408980 0x58>;
|
||||
interrupts = <27>;
|
||||
interrupt-names = "upg_bsce";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
enet0: ethernet@430000 {
|
||||
phy-mode = "internal";
|
||||
phy-handle = <&phy1>;
|
||||
@ -246,5 +314,47 @@
|
||||
interrupts = <76>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sata: sata@181000 {
|
||||
compatible = "brcm,bcm7425-ahci", "brcm,sata3-ahci";
|
||||
reg-names = "ahci", "top-ctrl";
|
||||
reg = <0x181000 0xa9c>, <0x180020 0x1c>;
|
||||
interrupt-parent = <&periph_intc>;
|
||||
interrupts = <40>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
brcm,broken-ncq;
|
||||
brcm,broken-phy;
|
||||
status = "disabled";
|
||||
|
||||
sata0: sata-port@0 {
|
||||
reg = <0>;
|
||||
phys = <&sata_phy0>;
|
||||
};
|
||||
|
||||
sata1: sata-port@1 {
|
||||
reg = <1>;
|
||||
phys = <&sata_phy1>;
|
||||
};
|
||||
};
|
||||
|
||||
sata_phy: sata-phy@1800000 {
|
||||
compatible = "brcm,bcm7425-sata-phy", "brcm,phy-sata3";
|
||||
reg = <0x180100 0x0eff>;
|
||||
reg-names = "phy";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
|
||||
sata_phy0: sata-phy@0 {
|
||||
reg = <0>;
|
||||
#phy-cells = <0>;
|
||||
};
|
||||
|
||||
sata_phy1: sata-phy@1 {
|
||||
reg = <1>;
|
||||
#phy-cells = <0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -81,14 +81,32 @@
|
||||
compatible = "brcm,bcm7120-l2-intc";
|
||||
reg = <0x406600 0x8>;
|
||||
|
||||
brcm,int-map-mask = <0x44>;
|
||||
brcm,int-map-mask = <0x44>, <0x7000000>;
|
||||
brcm,int-fwd-mask = <0x70000>;
|
||||
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
|
||||
interrupt-parent = <&periph_intc>;
|
||||
interrupts = <56>;
|
||||
interrupts = <56>, <54>;
|
||||
interrupt-names = "upg_main", "upg_bsc";
|
||||
};
|
||||
|
||||
upg_aon_irq0_intc: upg_aon_irq0_intc@408b80 {
|
||||
compatible = "brcm,bcm7120-l2-intc";
|
||||
reg = <0x408b80 0x8>;
|
||||
|
||||
brcm,int-map-mask = <0x40>, <0x8000000>, <0x100000>;
|
||||
brcm,int-fwd-mask = <0>;
|
||||
brcm,irq-can-wake;
|
||||
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
|
||||
interrupt-parent = <&periph_intc>;
|
||||
interrupts = <57>, <55>, <59>;
|
||||
interrupt-names = "upg_main_aon", "upg_bsc_aon",
|
||||
"upg_spi";
|
||||
};
|
||||
|
||||
sun_top_ctrl: syscon@404000 {
|
||||
@ -138,6 +156,46 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
bsca: i2c@406200 {
|
||||
clock-frequency = <390000>;
|
||||
compatible = "brcm,brcmstb-i2c";
|
||||
interrupt-parent = <&upg_irq0_intc>;
|
||||
reg = <0x406200 0x58>;
|
||||
interrupts = <24>;
|
||||
interrupt-names = "upg_bsca";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
bscb: i2c@406280 {
|
||||
clock-frequency = <390000>;
|
||||
compatible = "brcm,brcmstb-i2c";
|
||||
interrupt-parent = <&upg_irq0_intc>;
|
||||
reg = <0x406280 0x58>;
|
||||
interrupts = <25>;
|
||||
interrupt-names = "upg_bscb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
bscc: i2c@406300 {
|
||||
clock-frequency = <390000>;
|
||||
compatible = "brcm,brcmstb-i2c";
|
||||
interrupt-parent = <&upg_irq0_intc>;
|
||||
reg = <0x406300 0x58>;
|
||||
interrupts = <26>;
|
||||
interrupt-names = "upg_bscc";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
bscd: i2c@408980 {
|
||||
clock-frequency = <390000>;
|
||||
compatible = "brcm,brcmstb-i2c";
|
||||
interrupt-parent = <&upg_aon_irq0_intc>;
|
||||
reg = <0x408980 0x58>;
|
||||
interrupts = <27>;
|
||||
interrupt-names = "upg_bscd";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
enet0: ethernet@430000 {
|
||||
phy-mode = "internal";
|
||||
phy-handle = <&phy1>;
|
||||
|
@ -81,14 +81,32 @@
|
||||
compatible = "brcm,bcm7120-l2-intc";
|
||||
reg = <0x406600 0x8>;
|
||||
|
||||
brcm,int-map-mask = <0x44>;
|
||||
brcm,int-map-mask = <0x44>, <0x7000000>;
|
||||
brcm,int-fwd-mask = <0x70000>;
|
||||
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
|
||||
interrupt-parent = <&periph_intc>;
|
||||
interrupts = <56>;
|
||||
interrupts = <56>, <54>;
|
||||
interrupt-names = "upg_main", "upg_bsc";
|
||||
};
|
||||
|
||||
upg_aon_irq0_intc: upg_aon_irq0_intc@408b80 {
|
||||
compatible = "brcm,bcm7120-l2-intc";
|
||||
reg = <0x408b80 0x8>;
|
||||
|
||||
brcm,int-map-mask = <0x40>, <0x8000000>, <0x100000>;
|
||||
brcm,int-fwd-mask = <0>;
|
||||
brcm,irq-can-wake;
|
||||
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
|
||||
interrupt-parent = <&periph_intc>;
|
||||
interrupts = <57>, <55>, <59>;
|
||||
interrupt-names = "upg_main_aon", "upg_bsc_aon",
|
||||
"upg_spi";
|
||||
};
|
||||
|
||||
sun_top_ctrl: syscon@404000 {
|
||||
@ -138,6 +156,46 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
bsca: i2c@406200 {
|
||||
clock-frequency = <390000>;
|
||||
compatible = "brcm,brcmstb-i2c";
|
||||
interrupt-parent = <&upg_irq0_intc>;
|
||||
reg = <0x406200 0x58>;
|
||||
interrupts = <24>;
|
||||
interrupt-names = "upg_bsca";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
bscb: i2c@406280 {
|
||||
clock-frequency = <390000>;
|
||||
compatible = "brcm,brcmstb-i2c";
|
||||
interrupt-parent = <&upg_irq0_intc>;
|
||||
reg = <0x406280 0x58>;
|
||||
interrupts = <25>;
|
||||
interrupt-names = "upg_bscb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
bscc: i2c@406300 {
|
||||
clock-frequency = <390000>;
|
||||
compatible = "brcm,brcmstb-i2c";
|
||||
interrupt-parent = <&upg_irq0_intc>;
|
||||
reg = <0x406300 0x58>;
|
||||
interrupts = <26>;
|
||||
interrupt-names = "upg_bscc";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
bscd: i2c@408980 {
|
||||
clock-frequency = <390000>;
|
||||
compatible = "brcm,brcmstb-i2c";
|
||||
interrupt-parent = <&upg_aon_irq0_intc>;
|
||||
reg = <0x408980 0x58>;
|
||||
interrupts = <27>;
|
||||
interrupt-names = "upg_bscd";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
enet0: ethernet@430000 {
|
||||
phy-mode = "internal";
|
||||
phy-handle = <&phy1>;
|
||||
|
@ -87,14 +87,32 @@
|
||||
compatible = "brcm,bcm7120-l2-intc";
|
||||
reg = <0x406600 0x8>;
|
||||
|
||||
brcm,int-map-mask = <0x44>;
|
||||
brcm,int-map-mask = <0x44>, <0x7000000>;
|
||||
brcm,int-fwd-mask = <0x70000>;
|
||||
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
|
||||
interrupt-parent = <&periph_intc>;
|
||||
interrupts = <56>;
|
||||
interrupts = <56>, <54>;
|
||||
interrupt-names = "upg_main", "upg_bsc";
|
||||
};
|
||||
|
||||
upg_aon_irq0_intc: upg_aon_irq0_intc@408b80 {
|
||||
compatible = "brcm,bcm7120-l2-intc";
|
||||
reg = <0x408b80 0x8>;
|
||||
|
||||
brcm,int-map-mask = <0x40>, <0x8000000>, <0x100000>;
|
||||
brcm,int-fwd-mask = <0>;
|
||||
brcm,irq-can-wake;
|
||||
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
|
||||
interrupt-parent = <&periph_intc>;
|
||||
interrupts = <57>, <55>, <59>;
|
||||
interrupt-names = "upg_main_aon", "upg_bsc_aon",
|
||||
"upg_spi";
|
||||
};
|
||||
|
||||
sun_top_ctrl: syscon@404000 {
|
||||
@ -144,6 +162,36 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
bsca: i2c@406200 {
|
||||
clock-frequency = <390000>;
|
||||
compatible = "brcm,brcmstb-i2c";
|
||||
interrupt-parent = <&upg_irq0_intc>;
|
||||
reg = <0x406200 0x58>;
|
||||
interrupts = <24>;
|
||||
interrupt-names = "upg_bsca";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
bscb: i2c@406280 {
|
||||
clock-frequency = <390000>;
|
||||
compatible = "brcm,brcmstb-i2c";
|
||||
interrupt-parent = <&upg_irq0_intc>;
|
||||
reg = <0x406280 0x58>;
|
||||
interrupts = <25>;
|
||||
interrupt-names = "upg_bscb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
bscd: i2c@408980 {
|
||||
clock-frequency = <390000>;
|
||||
compatible = "brcm,brcmstb-i2c";
|
||||
interrupt-parent = <&upg_aon_irq0_intc>;
|
||||
reg = <0x408980 0x58>;
|
||||
interrupts = <27>;
|
||||
interrupt-names = "upg_bscd";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
enet0: ethernet@430000 {
|
||||
phy-mode = "internal";
|
||||
phy-handle = <&phy1>;
|
||||
@ -189,5 +237,47 @@
|
||||
interrupts = <66>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sata: sata@181000 {
|
||||
compatible = "brcm,bcm7425-ahci", "brcm,sata3-ahci";
|
||||
reg-names = "ahci", "top-ctrl";
|
||||
reg = <0x181000 0xa9c>, <0x180020 0x1c>;
|
||||
interrupt-parent = <&periph_intc>;
|
||||
interrupts = <86>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
brcm,broken-ncq;
|
||||
brcm,broken-phy;
|
||||
status = "disabled";
|
||||
|
||||
sata0: sata-port@0 {
|
||||
reg = <0>;
|
||||
phys = <&sata_phy0>;
|
||||
};
|
||||
|
||||
sata1: sata-port@1 {
|
||||
reg = <1>;
|
||||
phys = <&sata_phy1>;
|
||||
};
|
||||
};
|
||||
|
||||
sata_phy: sata-phy@1800000 {
|
||||
compatible = "brcm,bcm7425-sata-phy", "brcm,phy-sata3";
|
||||
reg = <0x180100 0x0eff>;
|
||||
reg-names = "phy";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
|
||||
sata_phy0: sata-phy@0 {
|
||||
reg = <0>;
|
||||
#phy-cells = <0>;
|
||||
};
|
||||
|
||||
sata_phy1: sata-phy@1 {
|
||||
reg = <1>;
|
||||
#phy-cells = <0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -221,5 +221,47 @@
|
||||
interrupts = <73>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sata: sata@181000 {
|
||||
compatible = "brcm,bcm7425-ahci", "brcm,sata3-ahci";
|
||||
reg-names = "ahci", "top-ctrl";
|
||||
reg = <0x181000 0xa9c>, <0x180020 0x1c>;
|
||||
interrupt-parent = <&periph_intc>;
|
||||
interrupts = <40>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
brcm,broken-ncq;
|
||||
brcm,broken-phy;
|
||||
status = "disabled";
|
||||
|
||||
sata0: sata-port@0 {
|
||||
reg = <0>;
|
||||
phys = <&sata_phy0>;
|
||||
};
|
||||
|
||||
sata1: sata-port@1 {
|
||||
reg = <1>;
|
||||
phys = <&sata_phy1>;
|
||||
};
|
||||
};
|
||||
|
||||
sata_phy: sata-phy@1800000 {
|
||||
compatible = "brcm,bcm7425-sata-phy", "brcm,phy-sata3";
|
||||
reg = <0x180100 0x0eff>;
|
||||
reg-names = "phy";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
|
||||
sata_phy0: sata-phy@0 {
|
||||
reg = <0>;
|
||||
#phy-cells = <0>;
|
||||
};
|
||||
|
||||
sata_phy1: sata-phy@1 {
|
||||
reg = <1>;
|
||||
#phy-cells = <0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -29,6 +29,26 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&bsca {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&bscb {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&bscc {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&bscd {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&bsce {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&enet0 {
|
||||
status = "okay";
|
||||
};
|
||||
@ -64,3 +84,11 @@
|
||||
&ohci3 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&sata {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&sata_phy {
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -29,6 +29,22 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&bsca {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&bscb {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&bscc {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&bscd {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&enet0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -29,6 +29,22 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&bsca {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&bscb {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&bscc {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&bscd {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&enet0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -29,6 +29,18 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&bsca {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&bscb {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&bscd {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&enet0 {
|
||||
status = "okay";
|
||||
};
|
||||
@ -40,3 +52,11 @@
|
||||
&ohci0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&sata {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&sata_phy {
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -1,5 +1,9 @@
|
||||
/dts-v1/;
|
||||
|
||||
/memreserve/ 0x00000000 0x00001000; /* YAMON exception vectors */
|
||||
/memreserve/ 0x00001000 0x000ef000; /* YAMON */
|
||||
/memreserve/ 0x000f0000 0x00010000; /* PIIX4 ISA memory */
|
||||
|
||||
/ {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
9
arch/mips/boot/dts/xilfpga/Makefile
Normal file
9
arch/mips/boot/dts/xilfpga/Makefile
Normal file
@ -0,0 +1,9 @@
|
||||
dtb-$(CONFIG_XILFPGA_NEXYS4DDR) += nexys4ddr.dtb
|
||||
|
||||
obj-y += $(patsubst %.dtb, %.dtb.o, $(dtb-y))
|
||||
|
||||
# Force kbuild to make empty built-in.o if necessary
|
||||
obj- += dummy.o
|
||||
|
||||
always := $(dtb-y)
|
||||
clean-files := *.dtb *.dtb.S
|
21
arch/mips/boot/dts/xilfpga/microAptiv.dtsi
Normal file
21
arch/mips/boot/dts/xilfpga/microAptiv.dtsi
Normal file
@ -0,0 +1,21 @@
|
||||
/ {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "img,xilfpga";
|
||||
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
cpu@0 {
|
||||
device_type = "cpu";
|
||||
compatible = "mips,m14Kc";
|
||||
clocks = <&ext>;
|
||||
reg = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
ext: ext {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
};
|
||||
};
|
46
arch/mips/boot/dts/xilfpga/nexys4ddr.dts
Normal file
46
arch/mips/boot/dts/xilfpga/nexys4ddr.dts
Normal file
@ -0,0 +1,46 @@
|
||||
/dts-v1/;
|
||||
|
||||
#include "microAptiv.dtsi"
|
||||
|
||||
/ {
|
||||
compatible = "digilent,nexys4ddr";
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0x0 0x08000000>;
|
||||
};
|
||||
|
||||
cpuintc: interrupt-controller@0 {
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-controller;
|
||||
compatible = "mti,cpu-interrupt-controller";
|
||||
};
|
||||
|
||||
axi_gpio: gpio@10600000 {
|
||||
#gpio-cells = <1>;
|
||||
compatible = "xlnx,xps-gpio-1.00.a";
|
||||
gpio-controller;
|
||||
reg = <0x10600000 0x10000>;
|
||||
xlnx,all-inputs = <0x0>;
|
||||
xlnx,dout-default = <0x0>;
|
||||
xlnx,gpio-width = <0x16>;
|
||||
xlnx,interrupt-present = <0x0>;
|
||||
xlnx,is-dual = <0x0>;
|
||||
xlnx,tri-default = <0xffffffff>;
|
||||
} ;
|
||||
|
||||
axi_uart16550: serial@10400000 {
|
||||
compatible = "ns16550a";
|
||||
reg = <0x10400000 0x10000>;
|
||||
|
||||
reg-shift = <2>;
|
||||
reg-offset = <0x1000>;
|
||||
|
||||
clocks = <&ext>;
|
||||
};
|
||||
};
|
||||
|
||||
&ext {
|
||||
clock-frequency = <50000000>;
|
||||
};
|
@ -1081,6 +1081,7 @@ void __init prom_free_prom_memory(void)
|
||||
|
||||
int octeon_prune_device_tree(void);
|
||||
|
||||
extern const char __appended_dtb;
|
||||
extern const char __dtb_octeon_3xxx_begin;
|
||||
extern const char __dtb_octeon_68xx_begin;
|
||||
void __init device_tree_init(void)
|
||||
@ -1088,11 +1089,19 @@ void __init device_tree_init(void)
|
||||
const void *fdt;
|
||||
bool do_prune;
|
||||
|
||||
#ifdef CONFIG_MIPS_ELF_APPENDED_DTB
|
||||
if (!fdt_check_header(&__appended_dtb)) {
|
||||
fdt = &__appended_dtb;
|
||||
do_prune = false;
|
||||
pr_info("Using appended Device Tree.\n");
|
||||
} else
|
||||
#endif
|
||||
if (octeon_bootinfo->minor_version >= 3 && octeon_bootinfo->fdt_addr) {
|
||||
fdt = phys_to_virt(octeon_bootinfo->fdt_addr);
|
||||
if (fdt_check_header(fdt))
|
||||
panic("Corrupt Device Tree passed to kernel.");
|
||||
do_prune = false;
|
||||
pr_info("Using passed Device Tree.\n");
|
||||
} else if (OCTEON_IS_MODEL(OCTEON_CN68XX)) {
|
||||
fdt = &__dtb_octeon_68xx_begin;
|
||||
do_prune = true;
|
||||
@ -1106,8 +1115,6 @@ void __init device_tree_init(void)
|
||||
if (do_prune) {
|
||||
octeon_prune_device_tree();
|
||||
pr_info("Using internal Device Tree.\n");
|
||||
} else {
|
||||
pr_info("Using passed Device Tree.\n");
|
||||
}
|
||||
unflatten_and_copy_device_tree();
|
||||
}
|
||||
|
@ -122,20 +122,20 @@ CONFIG_EEPROM_MAX6875=y
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDECD=y
|
||||
CONFIG_BLK_DEV_IDETAPE=y
|
||||
CONFIG_IDE_GENERIC=y
|
||||
CONFIG_BLK_DEV_GENERIC=y
|
||||
CONFIG_BLK_DEV_CMD64X=y
|
||||
CONFIG_BLK_DEV_IT8213=m
|
||||
CONFIG_BLK_DEV_TC86C001=m
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_BLK_DEV_SR=m
|
||||
CONFIG_CHR_DEV_ST=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_CHR_DEV_SCH=m
|
||||
CONFIG_ATA=y
|
||||
CONFIG_SATA_SIL24=y
|
||||
CONFIG_PATA_CMD64X=y
|
||||
CONFIG_PATA_IT8213=m
|
||||
CONFIG_PATA_SIL680=y
|
||||
CONFIG_ATA_GENERIC=y
|
||||
CONFIG_PATA_LEGACY=y
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=y
|
||||
|
@ -8,7 +8,7 @@ CONFIG_MIPS_O32_FP64_SUPPORT=y
|
||||
# CONFIG_SWAP is not set
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_RD_GZIP is not set
|
||||
CONFIG_RD_GZIP=y
|
||||
CONFIG_EXPERT=y
|
||||
# CONFIG_VM_EVENT_COUNTERS is not set
|
||||
# CONFIG_SLUB_DEBUG is not set
|
||||
@ -33,6 +33,7 @@ CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
# CONFIG_STANDALONE is not set
|
||||
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_BRCMSTB_GISB_ARB=y
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_CFI=y
|
||||
|
@ -9,7 +9,7 @@ CONFIG_MIPS_O32_FP64_SUPPORT=y
|
||||
# CONFIG_SWAP is not set
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_RD_GZIP is not set
|
||||
CONFIG_RD_GZIP=y
|
||||
CONFIG_EXPERT=y
|
||||
# CONFIG_VM_EVENT_COUNTERS is not set
|
||||
# CONFIG_SLUB_DEBUG is not set
|
||||
@ -34,6 +34,7 @@ CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
# CONFIG_STANDALONE is not set
|
||||
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_BRCMSTB_GISB_ARB=y
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_CFI=y
|
||||
|
@ -31,9 +31,9 @@ CONFIG_NETWORK_SECMARK=y
|
||||
CONFIG_IP_SCTP=m
|
||||
CONFIG_FW_LOADER=m
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
# CONFIG_MISC_DEVICES is not set
|
||||
CONFIG_IDE=y
|
||||
CONFIG_IDE_GENERIC=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_ATA=y
|
||||
CONFIG_PATA_LEGACY=y
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_PHYLIB=m
|
||||
CONFIG_MARVELL_PHY=m
|
||||
|
@ -14,9 +14,9 @@ CONFIG_MODVERSIONS=y
|
||||
CONFIG_MODULE_SRCVERSION_ALL=y
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
# CONFIG_MISC_DEVICES is not set
|
||||
CONFIG_IDE=y
|
||||
CONFIG_IDE_GENERIC=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_ATA=y
|
||||
CONFIG_PATA_LEGACY=y
|
||||
# CONFIG_INPUT_MOUSEDEV is not set
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
|
@ -34,7 +34,7 @@ CONFIG_MIPS32_N32=y
|
||||
CONFIG_PM=y
|
||||
# CONFIG_SUSPEND is not set
|
||||
CONFIG_HIBERNATION=y
|
||||
CONFIG_PM_STD_PARTITION="/dev/hda3"
|
||||
CONFIG_PM_STD_PARTITION="/dev/sda3"
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
@ -114,20 +114,16 @@ CONFIG_BLK_DEV_CRYPTOLOOP=m
|
||||
CONFIG_BLK_DEV_RAM=m
|
||||
CONFIG_CDROM_PKTCDVD=m
|
||||
CONFIG_ATA_OVER_ETH=m
|
||||
# CONFIG_MISC_DEVICES is not set
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDECD=y
|
||||
CONFIG_IDE_TASK_IOCTL=y
|
||||
CONFIG_IDE_GENERIC=y
|
||||
CONFIG_BLK_DEV_GENERIC=y
|
||||
CONFIG_BLK_DEV_VIA82CXXX=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
# CONFIG_SCSI_LOWLEVEL is not set
|
||||
CONFIG_ATA=y
|
||||
CONFIG_PATA_VIA=y
|
||||
CONFIG_ATA_GENERIC=y
|
||||
CONFIG_PATA_LEGACY=y
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_MACVLAN=m
|
||||
CONFIG_VETH=m
|
||||
|
@ -35,11 +35,11 @@ CONFIG_MTD_CHAR=y
|
||||
CONFIG_MTD_BLOCK=y
|
||||
CONFIG_MTD_CFI=y
|
||||
CONFIG_MTD_CFI_AMDSTD=y
|
||||
# CONFIG_MISC_DEVICES is not set
|
||||
CONFIG_IDE=y
|
||||
CONFIG_IDE_GENERIC=y
|
||||
CONFIG_BLK_DEV_GENERIC=y
|
||||
CONFIG_BLK_DEV_CMD64X=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_ATA=y
|
||||
CONFIG_PATA_CMD64X=y
|
||||
CONFIG_ATA_GENERIC=y
|
||||
CONFIG_PATA_LEGACY=y
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_NET_PCI=y
|
||||
|
@ -108,16 +108,11 @@ CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_CRYPTOLOOP=m
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||
# CONFIG_MISC_DEVICES is not set
|
||||
CONFIG_IDE=y
|
||||
CONFIG_IDE_TASK_IOCTL=y
|
||||
# CONFIG_IDEPCI_PCIBUS_ORDER is not set
|
||||
CONFIG_BLK_DEV_AMD74XX=y
|
||||
CONFIG_SCSI=m
|
||||
CONFIG_BLK_DEV_SD=m
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_MULTI_LUN=y
|
||||
# CONFIG_SCSI_LOWLEVEL is not set
|
||||
CONFIG_ATA=y
|
||||
CONFIG_PATA_AMD=y
|
||||
CONFIG_MD=y
|
||||
CONFIG_BLK_DEV_MD=m
|
||||
CONFIG_MD_LINEAR=m
|
||||
|
@ -241,14 +241,11 @@ CONFIG_BLK_DEV_NBD=m
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_CDROM_PKTCDVD=m
|
||||
CONFIG_ATA_OVER_ETH=m
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDECD=y
|
||||
CONFIG_IDE_GENERIC=y
|
||||
CONFIG_RAID_ATTRS=m
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_CHR_DEV_OSST=m
|
||||
CONFIG_BLK_DEV_SR=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
@ -265,6 +262,7 @@ CONFIG_AIC7XXX_RESET_DELAY_MS=15000
|
||||
# CONFIG_AIC7XXX_DEBUG_ENABLE is not set
|
||||
CONFIG_ATA=y
|
||||
CONFIG_ATA_PIIX=y
|
||||
CONFIG_PATA_LEGACY=y
|
||||
CONFIG_MD=y
|
||||
CONFIG_BLK_DEV_MD=m
|
||||
CONFIG_MD_LINEAR=m
|
||||
|
@ -248,17 +248,12 @@ CONFIG_CDROM_PKTCDVD=m
|
||||
CONFIG_ATA_OVER_ETH=m
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDECD=y
|
||||
CONFIG_IDE_GENERIC=y
|
||||
CONFIG_BLK_DEV_GENERIC=y
|
||||
CONFIG_BLK_DEV_PIIX=y
|
||||
CONFIG_BLK_DEV_IT8213=m
|
||||
CONFIG_BLK_DEV_TC86C001=m
|
||||
CONFIG_RAID_ATTRS=m
|
||||
CONFIG_SCSI=m
|
||||
CONFIG_BLK_DEV_SD=m
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_CHR_DEV_OSST=m
|
||||
CONFIG_BLK_DEV_SR=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_MULTI_LUN=y
|
||||
@ -274,6 +269,13 @@ CONFIG_SCSI_AACRAID=m
|
||||
CONFIG_SCSI_AIC7XXX=m
|
||||
CONFIG_AIC7XXX_RESET_DELAY_MS=15000
|
||||
# CONFIG_AIC7XXX_DEBUG_ENABLE is not set
|
||||
CONFIG_ATA=y
|
||||
CONFIG_ATA_PIIX=y
|
||||
CONFIG_PATA_IT8213=m
|
||||
CONFIG_PATA_OLDPIIX=y
|
||||
CONFIG_PATA_MPIIX=y
|
||||
CONFIG_ATA_GENERIC=y
|
||||
CONFIG_PATA_LEGACY=y
|
||||
CONFIG_MD=y
|
||||
CONFIG_BLK_DEV_MD=m
|
||||
CONFIG_MD_LINEAR=m
|
||||
|
@ -248,17 +248,12 @@ CONFIG_ATA_OVER_ETH=m
|
||||
CONFIG_VIRTIO_BLK=y
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDECD=y
|
||||
CONFIG_IDE_GENERIC=y
|
||||
CONFIG_BLK_DEV_GENERIC=y
|
||||
CONFIG_BLK_DEV_PIIX=y
|
||||
CONFIG_BLK_DEV_IT8213=m
|
||||
CONFIG_BLK_DEV_TC86C001=m
|
||||
CONFIG_RAID_ATTRS=m
|
||||
CONFIG_SCSI=m
|
||||
CONFIG_BLK_DEV_SD=m
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_CHR_DEV_OSST=m
|
||||
CONFIG_BLK_DEV_SR=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_MULTI_LUN=y
|
||||
@ -274,6 +269,13 @@ CONFIG_SCSI_AACRAID=m
|
||||
CONFIG_SCSI_AIC7XXX=m
|
||||
CONFIG_AIC7XXX_RESET_DELAY_MS=15000
|
||||
# CONFIG_AIC7XXX_DEBUG_ENABLE is not set
|
||||
CONFIG_ATA=y
|
||||
CONFIG_ATA_PIIX=y
|
||||
CONFIG_PATA_IT8213=m
|
||||
CONFIG_PATA_OLDPIIX=y
|
||||
CONFIG_PATA_MPIIX=y
|
||||
CONFIG_ATA_GENERIC=y
|
||||
CONFIG_PATA_LEGACY=y
|
||||
CONFIG_MD=y
|
||||
CONFIG_BLK_DEV_MD=m
|
||||
CONFIG_MD_LINEAR=m
|
||||
|
@ -80,15 +80,14 @@ CONFIG_NET_CLS_IND=y
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_CRYPTOLOOP=m
|
||||
CONFIG_IDE=y
|
||||
# CONFIG_IDE_PROC_FS is not set
|
||||
# CONFIG_IDEPCI_PCIBUS_ORDER is not set
|
||||
CONFIG_BLK_DEV_GENERIC=y
|
||||
CONFIG_BLK_DEV_PIIX=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
# CONFIG_SCSI_LOWLEVEL is not set
|
||||
CONFIG_ATA=y
|
||||
CONFIG_ATA_PIIX=y
|
||||
CONFIG_PATA_OLDPIIX=y
|
||||
CONFIG_PATA_MPIIX=y
|
||||
CONFIG_ATA_GENERIC=y
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
# CONFIG_NET_VENDOR_ADAPTEC is not set
|
||||
|
@ -81,15 +81,14 @@ CONFIG_NET_CLS_IND=y
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_CRYPTOLOOP=m
|
||||
CONFIG_IDE=y
|
||||
# CONFIG_IDE_PROC_FS is not set
|
||||
# CONFIG_IDEPCI_PCIBUS_ORDER is not set
|
||||
CONFIG_BLK_DEV_GENERIC=y
|
||||
CONFIG_BLK_DEV_PIIX=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
# CONFIG_SCSI_LOWLEVEL is not set
|
||||
CONFIG_ATA=y
|
||||
CONFIG_ATA_PIIX=y
|
||||
CONFIG_PATA_OLDPIIX=y
|
||||
CONFIG_PATA_MPIIX=y
|
||||
CONFIG_ATA_GENERIC=y
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
# CONFIG_NET_VENDOR_ADAPTEC is not set
|
||||
|
@ -85,15 +85,14 @@ CONFIG_NET_CLS_IND=y
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_CRYPTOLOOP=m
|
||||
CONFIG_IDE=y
|
||||
# CONFIG_IDE_PROC_FS is not set
|
||||
# CONFIG_IDEPCI_PCIBUS_ORDER is not set
|
||||
CONFIG_BLK_DEV_GENERIC=y
|
||||
CONFIG_BLK_DEV_PIIX=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
# CONFIG_SCSI_LOWLEVEL is not set
|
||||
CONFIG_ATA=y
|
||||
CONFIG_ATA_PIIX=y
|
||||
CONFIG_PATA_OLDPIIX=y
|
||||
CONFIG_PATA_MPIIX=y
|
||||
CONFIG_ATA_GENERIC=y
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
# CONFIG_NET_VENDOR_ADAPTEC is not set
|
||||
|
@ -80,15 +80,14 @@ CONFIG_NET_CLS_IND=y
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_CRYPTOLOOP=m
|
||||
CONFIG_IDE=y
|
||||
# CONFIG_IDE_PROC_FS is not set
|
||||
# CONFIG_IDEPCI_PCIBUS_ORDER is not set
|
||||
CONFIG_BLK_DEV_GENERIC=y
|
||||
CONFIG_BLK_DEV_PIIX=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
# CONFIG_SCSI_LOWLEVEL is not set
|
||||
CONFIG_ATA=y
|
||||
CONFIG_ATA_PIIX=y
|
||||
CONFIG_PATA_OLDPIIX=y
|
||||
CONFIG_PATA_MPIIX=y
|
||||
CONFIG_ATA_GENERIC=y
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
# CONFIG_NET_VENDOR_ADAPTEC is not set
|
||||
|
@ -244,17 +244,12 @@ CONFIG_CDROM_PKTCDVD=m
|
||||
CONFIG_ATA_OVER_ETH=m
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDECD=y
|
||||
CONFIG_IDE_GENERIC=y
|
||||
CONFIG_BLK_DEV_GENERIC=y
|
||||
CONFIG_BLK_DEV_PIIX=y
|
||||
CONFIG_BLK_DEV_IT8213=m
|
||||
CONFIG_BLK_DEV_TC86C001=m
|
||||
CONFIG_RAID_ATTRS=m
|
||||
CONFIG_SCSI=m
|
||||
CONFIG_BLK_DEV_SD=m
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_CHR_DEV_OSST=m
|
||||
CONFIG_BLK_DEV_SR=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
@ -269,6 +264,13 @@ CONFIG_SCSI_AACRAID=m
|
||||
CONFIG_SCSI_AIC7XXX=m
|
||||
CONFIG_AIC7XXX_RESET_DELAY_MS=15000
|
||||
# CONFIG_AIC7XXX_DEBUG_ENABLE is not set
|
||||
CONFIG_ATA=y
|
||||
CONFIG_ATA_PIIX=y
|
||||
CONFIG_PATA_IT8213=m
|
||||
CONFIG_PATA_OLDPIIX=y
|
||||
CONFIG_PATA_MPIIX=y
|
||||
CONFIG_ATA_GENERIC=y
|
||||
CONFIG_PATA_LEGACY=y
|
||||
CONFIG_MD=y
|
||||
CONFIG_BLK_DEV_MD=m
|
||||
CONFIG_MD_LINEAR=m
|
||||
|
@ -27,9 +27,9 @@ CONFIG_INET_XFRM_MODE_BEET=m
|
||||
CONFIG_NETWORK_SECMARK=y
|
||||
CONFIG_CONNECTOR=m
|
||||
CONFIG_ATA_OVER_ETH=m
|
||||
# CONFIG_MISC_DEVICES is not set
|
||||
CONFIG_IDE=y
|
||||
CONFIG_IDE_GENERIC=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_ATA=y
|
||||
CONFIG_PATA_LEGACY=y
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_NETDEV_1000 is not set
|
||||
# CONFIG_NETDEV_10000 is not set
|
||||
|
40
arch/mips/configs/xilfpga_defconfig
Normal file
40
arch/mips/configs/xilfpga_defconfig
Normal file
@ -0,0 +1,40 @@
|
||||
CONFIG_MACH_XILFPGA=y
|
||||
# CONFIG_COMPACTION is not set
|
||||
# CONFIG_LOCALVERSION_AUTO is not set
|
||||
CONFIG_EMBEDDED=y
|
||||
# CONFIG_VM_EVENT_COUNTERS is not set
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_BLOCK is not set
|
||||
# CONFIG_SUSPEND is not set
|
||||
# CONFIG_UEVENT_HELPER is not set
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
# CONFIG_STANDALONE is not set
|
||||
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
|
||||
# CONFIG_FW_LOADER is not set
|
||||
# CONFIG_ALLOW_DEV_COREDUMP is not set
|
||||
# CONFIG_INPUT_MOUSEDEV is not set
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_SERIO is not set
|
||||
CONFIG_VT_HW_CONSOLE_BINDING=y
|
||||
# CONFIG_UNIX98_PTYS is not set
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
# CONFIG_HW_RANDOM is not set
|
||||
CONFIG_GPIO_SYSFS=y
|
||||
CONFIG_GPIO_XILINX=y
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_USB_SUPPORT is not set
|
||||
# CONFIG_MIPS_PLATFORM_DEVICES is not set
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
# CONFIG_PROC_PAGE_MONITOR is not set
|
||||
# CONFIG_MISC_FILESYSTEMS is not set
|
||||
CONFIG_PANIC_ON_OOPS=y
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
# CONFIG_FTRACE is not set
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
CONFIG_CMDLINE="console=ttyS0,115200"
|
@ -11,19 +11,20 @@
|
||||
|
||||
#include <asm/signal.h>
|
||||
#include <asm/siginfo.h>
|
||||
#include <asm/vdso.h>
|
||||
|
||||
struct mips_abi {
|
||||
int (* const setup_frame)(void *sig_return, struct ksignal *ksig,
|
||||
struct pt_regs *regs, sigset_t *set);
|
||||
const unsigned long signal_return_offset;
|
||||
int (* const setup_rt_frame)(void *sig_return, struct ksignal *ksig,
|
||||
struct pt_regs *regs, sigset_t *set);
|
||||
const unsigned long rt_signal_return_offset;
|
||||
const unsigned long restart;
|
||||
|
||||
unsigned off_sc_fpregs;
|
||||
unsigned off_sc_fpc_csr;
|
||||
unsigned off_sc_used_math;
|
||||
|
||||
struct mips_vdso_image *vdso;
|
||||
};
|
||||
|
||||
#endif /* _ASM_ABI_H */
|
||||
|
@ -507,7 +507,7 @@ static __inline__ long atomic64_sub_if_positive(long i, atomic64_t * v)
|
||||
* @u: ...unless v is equal to u.
|
||||
*
|
||||
* Atomically adds @a to @v, so long as it was not @u.
|
||||
* Returns the old value of @v.
|
||||
* Returns true iff @v was not @u.
|
||||
*/
|
||||
static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u)
|
||||
{
|
||||
|
@ -9,6 +9,7 @@
|
||||
#ifndef _ASM_BCACHE_H
|
||||
#define _ASM_BCACHE_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
/* Some R4000 / R4400 / R4600 / R5000 machines may have a non-dma-coherent,
|
||||
chipset implemented caches. On machines with other CPUs the CPU does the
|
||||
@ -18,6 +19,9 @@ struct bcache_ops {
|
||||
void (*bc_disable)(void);
|
||||
void (*bc_wback_inv)(unsigned long page, unsigned long size);
|
||||
void (*bc_inv)(unsigned long page, unsigned long size);
|
||||
void (*bc_prefetch_enable)(void);
|
||||
void (*bc_prefetch_disable)(void);
|
||||
bool (*bc_prefetch_is_enabled)(void);
|
||||
};
|
||||
|
||||
extern void indy_sc_init(void);
|
||||
@ -46,6 +50,26 @@ static inline void bc_inv(unsigned long page, unsigned long size)
|
||||
bcops->bc_inv(page, size);
|
||||
}
|
||||
|
||||
static inline void bc_prefetch_enable(void)
|
||||
{
|
||||
if (bcops->bc_prefetch_enable)
|
||||
bcops->bc_prefetch_enable();
|
||||
}
|
||||
|
||||
static inline void bc_prefetch_disable(void)
|
||||
{
|
||||
if (bcops->bc_prefetch_disable)
|
||||
bcops->bc_prefetch_disable();
|
||||
}
|
||||
|
||||
static inline bool bc_prefetch_is_enabled(void)
|
||||
{
|
||||
if (bcops->bc_prefetch_is_enabled)
|
||||
return bcops->bc_prefetch_is_enabled();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
#else /* !defined(CONFIG_BOARD_SCACHE) */
|
||||
|
||||
/* Not R4000 / R4400 / R4600 / R5000. */
|
||||
@ -54,6 +78,9 @@ static inline void bc_inv(unsigned long page, unsigned long size)
|
||||
#define bc_disable() do { } while (0)
|
||||
#define bc_wback_inv(page, size) do { } while (0)
|
||||
#define bc_inv(page, size) do { } while (0)
|
||||
#define bc_prefetch_enable() do { } while (0)
|
||||
#define bc_prefetch_disable() do { } while (0)
|
||||
#define bc_prefetch_is_enabled() 0
|
||||
|
||||
#endif /* !defined(CONFIG_BOARD_SCACHE) */
|
||||
|
||||
|
@ -84,6 +84,17 @@ void mips_cdmm_driver_unregister(struct mips_cdmm_driver *);
|
||||
module_driver(__mips_cdmm_driver, mips_cdmm_driver_register, \
|
||||
mips_cdmm_driver_unregister)
|
||||
|
||||
/*
|
||||
* builtin_mips_cdmm_driver() - Helper macro for drivers that don't do anything
|
||||
* special in init and have no exit. This eliminates some boilerplate. Each
|
||||
* driver may only use this macro once, and calling it replaces device_initcall
|
||||
* (or in some cases, the legacy __initcall). This is meant to be a direct
|
||||
* parallel of module_mips_cdmm_driver() above but without the __exit stuff that
|
||||
* is not used for builtin cases.
|
||||
*/
|
||||
#define builtin_mips_cdmm_driver(__mips_cdmm_driver) \
|
||||
builtin_driver(__mips_cdmm_driver, mips_cdmm_driver_register)
|
||||
|
||||
/* drivers/tty/mips_ejtag_fdc.c */
|
||||
|
||||
#ifdef CONFIG_MIPS_EJTAG_FDC_EARLYCON
|
||||
|
29
arch/mips/include/asm/clocksource.h
Normal file
29
arch/mips/include/asm/clocksource.h
Normal file
@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Imagination Technologies
|
||||
* Author: Alex Smith <alex.smith@imgtec.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_CLOCKSOURCE_H
|
||||
#define __ASM_CLOCKSOURCE_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
/* VDSO clocksources. */
|
||||
#define VDSO_CLOCK_NONE 0 /* No suitable clocksource. */
|
||||
#define VDSO_CLOCK_R4K 1 /* Use the coprocessor 0 count. */
|
||||
#define VDSO_CLOCK_GIC 2 /* Use the GIC. */
|
||||
|
||||
/**
|
||||
* struct arch_clocksource_data - Architecture-specific clocksource information.
|
||||
* @vdso_clock_mode: Method the VDSO should use to access the clocksource.
|
||||
*/
|
||||
struct arch_clocksource_data {
|
||||
u8 vdso_clock_mode;
|
||||
};
|
||||
|
||||
#endif /* __ASM_CLOCKSOURCE_H */
|
@ -130,6 +130,8 @@ typedef union compat_sigval {
|
||||
compat_uptr_t sival_ptr;
|
||||
} compat_sigval_t;
|
||||
|
||||
/* Can't use the generic version because si_code and si_errno are swapped */
|
||||
|
||||
#define SI_PAD_SIZE32 (128/sizeof(int) - 3)
|
||||
|
||||
typedef struct compat_siginfo {
|
||||
@ -138,57 +140,61 @@ typedef struct compat_siginfo {
|
||||
int si_errno;
|
||||
|
||||
union {
|
||||
int _pad[SI_PAD_SIZE32];
|
||||
int _pad[128 / sizeof(int) - 3];
|
||||
|
||||
/* kill() */
|
||||
struct {
|
||||
compat_pid_t _pid; /* sender's pid */
|
||||
__compat_uid_t _uid; /* sender's uid */
|
||||
__compat_uid32_t _uid; /* sender's uid */
|
||||
} _kill;
|
||||
|
||||
/* SIGCHLD */
|
||||
struct {
|
||||
compat_pid_t _pid; /* which child */
|
||||
__compat_uid_t _uid; /* sender's uid */
|
||||
int _status; /* exit code */
|
||||
compat_clock_t _utime;
|
||||
compat_clock_t _stime;
|
||||
} _sigchld;
|
||||
|
||||
/* IRIX SIGCHLD */
|
||||
struct {
|
||||
compat_pid_t _pid; /* which child */
|
||||
compat_clock_t _utime;
|
||||
int _status; /* exit code */
|
||||
compat_clock_t _stime;
|
||||
} _irix_sigchld;
|
||||
|
||||
/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
|
||||
struct {
|
||||
s32 _addr; /* faulting insn/memory ref. */
|
||||
} _sigfault;
|
||||
|
||||
/* SIGPOLL, SIGXFSZ (To do ...) */
|
||||
struct {
|
||||
int _band; /* POLL_IN, POLL_OUT, POLL_MSG */
|
||||
int _fd;
|
||||
} _sigpoll;
|
||||
|
||||
/* POSIX.1b timers */
|
||||
struct {
|
||||
timer_t _tid; /* timer id */
|
||||
compat_timer_t _tid; /* timer id */
|
||||
int _overrun; /* overrun count */
|
||||
compat_sigval_t _sigval;/* same as below */
|
||||
int _sys_private; /* not to be passed to user */
|
||||
compat_sigval_t _sigval; /* same as below */
|
||||
} _timer;
|
||||
|
||||
/* POSIX.1b signals */
|
||||
struct {
|
||||
compat_pid_t _pid; /* sender's pid */
|
||||
__compat_uid_t _uid; /* sender's uid */
|
||||
__compat_uid32_t _uid; /* sender's uid */
|
||||
compat_sigval_t _sigval;
|
||||
} _rt;
|
||||
|
||||
/* SIGCHLD */
|
||||
struct {
|
||||
compat_pid_t _pid; /* which child */
|
||||
__compat_uid32_t _uid; /* sender's uid */
|
||||
int _status; /* exit code */
|
||||
compat_clock_t _utime;
|
||||
compat_clock_t _stime;
|
||||
} _sigchld;
|
||||
|
||||
/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
|
||||
struct {
|
||||
compat_uptr_t _addr; /* faulting insn/memory ref. */
|
||||
#ifdef __ARCH_SI_TRAPNO
|
||||
int _trapno; /* TRAP # which caused the signal */
|
||||
#endif
|
||||
short _addr_lsb; /* LSB of the reported address */
|
||||
struct {
|
||||
compat_uptr_t _lower;
|
||||
compat_uptr_t _upper;
|
||||
} _addr_bnd;
|
||||
} _sigfault;
|
||||
|
||||
/* SIGPOLL */
|
||||
struct {
|
||||
compat_long_t _band; /* POLL_IN, POLL_OUT, POLL_MSG */
|
||||
int _fd;
|
||||
} _sigpoll;
|
||||
|
||||
struct {
|
||||
compat_uptr_t _call_addr; /* calling insn */
|
||||
int _syscall; /* triggering system call number */
|
||||
compat_uint_t _arch; /* AUDIT_ARCH_* of syscall */
|
||||
} _sigsys;
|
||||
} _sifields;
|
||||
} compat_siginfo_t;
|
||||
|
||||
|
@ -131,11 +131,7 @@
|
||||
#endif
|
||||
|
||||
#ifndef cpu_has_rixi
|
||||
# ifdef CONFIG_64BIT
|
||||
# define cpu_has_rixi (cpu_data[0].options & MIPS_CPU_RIXI)
|
||||
# else /* CONFIG_32BIT */
|
||||
# define cpu_has_rixi ((cpu_data[0].options & MIPS_CPU_RIXI) && !cpu_has_64bits)
|
||||
# endif
|
||||
#define cpu_has_rixi (cpu_data[0].options & MIPS_CPU_RIXI)
|
||||
#endif
|
||||
|
||||
#ifndef cpu_has_mmips
|
||||
|
22
arch/mips/include/asm/debug.h
Normal file
22
arch/mips/include/asm/debug.h
Normal file
@ -0,0 +1,22 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Imagination Technologies
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef __MIPS_ASM_DEBUG_H__
|
||||
#define __MIPS_ASM_DEBUG_H__
|
||||
|
||||
#include <linux/dcache.h>
|
||||
|
||||
/*
|
||||
* mips_debugfs_dir corresponds to the "mips" directory at the top level
|
||||
* of the DebugFS hierarchy. MIPS-specific DebugFS entires should be
|
||||
* placed beneath this directory.
|
||||
*/
|
||||
extern struct dentry *mips_debugfs_dir;
|
||||
|
||||
#endif /* __MIPS_ASM_DEBUG_H__ */
|
@ -8,6 +8,7 @@
|
||||
#ifndef _ASM_ELF_H
|
||||
#define _ASM_ELF_H
|
||||
|
||||
#include <linux/auxvec.h>
|
||||
#include <linux/fs.h>
|
||||
#include <uapi/linux/elf.h>
|
||||
|
||||
@ -419,6 +420,12 @@ extern const char *__elf_platform;
|
||||
#define ELF_ET_DYN_BASE (TASK_SIZE / 3 * 2)
|
||||
#endif
|
||||
|
||||
#define ARCH_DLINFO \
|
||||
do { \
|
||||
NEW_AUX_ENT(AT_SYSINFO_EHDR, \
|
||||
(unsigned long)current->mm->context.vdso); \
|
||||
} while (0)
|
||||
|
||||
#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
|
||||
struct linux_binprm;
|
||||
extern int arch_setup_additional_pages(struct linux_binprm *bprm,
|
||||
|
@ -10,21 +10,6 @@
|
||||
|
||||
#include <asm/bootinfo.h> /* For cleaner code... */
|
||||
|
||||
enum fw_memtypes {
|
||||
fw_dontuse,
|
||||
fw_code,
|
||||
fw_free,
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
unsigned long base; /* Within KSEG0 */
|
||||
unsigned int size; /* bytes */
|
||||
enum fw_memtypes type; /* fw_memtypes */
|
||||
} fw_memblock_t;
|
||||
|
||||
/* Maximum number of memory block descriptors. */
|
||||
#define FW_MAX_MEMBLOCKS 32
|
||||
|
||||
extern int fw_argc;
|
||||
extern int *_fw_argv;
|
||||
extern int *_fw_envp;
|
||||
@ -38,7 +23,6 @@ extern int *_fw_envp;
|
||||
|
||||
extern void fw_init_cmdline(void);
|
||||
extern char *fw_getcmdline(void);
|
||||
extern fw_memblock_t *fw_getmdesc(int);
|
||||
extern void fw_meminit(void);
|
||||
extern char *fw_getenv(char *name);
|
||||
extern unsigned long fw_getenvl(char *name);
|
||||
|
@ -48,11 +48,6 @@ extern enum bcm47xx_bus_type bcm47xx_bus_type;
|
||||
void bcm47xx_fill_sprom(struct ssb_sprom *sprom, const char *prefix,
|
||||
bool fallback);
|
||||
|
||||
#ifdef CONFIG_BCM47XX_SSB
|
||||
void bcm47xx_fill_ssb_boardinfo(struct ssb_boardinfo *boardinfo,
|
||||
const char *prefix);
|
||||
#endif
|
||||
|
||||
void bcm47xx_set_system_type(u16 chip_id);
|
||||
|
||||
#endif /* __ASM_BCM47XX_H */
|
||||
|
@ -35,6 +35,17 @@
|
||||
#define SOC_ID_VRX268_2 0x00C /* v1.2 */
|
||||
#define SOC_ID_GRX288_2 0x00D /* v1.2 */
|
||||
#define SOC_ID_GRX282_2 0x00E /* v1.2 */
|
||||
#define SOC_ID_VRX220 0x000
|
||||
|
||||
#define SOC_ID_ARX362 0x004
|
||||
#define SOC_ID_ARX368 0x005
|
||||
#define SOC_ID_ARX382 0x007
|
||||
#define SOC_ID_ARX388 0x008
|
||||
#define SOC_ID_URX388 0x009
|
||||
#define SOC_ID_GRX383 0x010
|
||||
#define SOC_ID_GRX369 0x011
|
||||
#define SOC_ID_GRX387 0x00F
|
||||
#define SOC_ID_GRX389 0x012
|
||||
|
||||
/* SoC Types */
|
||||
#define SOC_TYPE_DANUBE 0x01
|
||||
@ -43,6 +54,9 @@
|
||||
#define SOC_TYPE_VR9 0x04 /* v1.1 */
|
||||
#define SOC_TYPE_VR9_2 0x05 /* v1.2 */
|
||||
#define SOC_TYPE_AMAZON_SE 0x06
|
||||
#define SOC_TYPE_AR10 0x07
|
||||
#define SOC_TYPE_GRX390 0x08
|
||||
#define SOC_TYPE_VRX220 0x09
|
||||
|
||||
/* BOOT_SEL - find what boot media we have */
|
||||
#define BS_EXT_ROM 0x0
|
||||
|
29
arch/mips/include/asm/mach-malta/malta-dtshim.h
Normal file
29
arch/mips/include/asm/mach-malta/malta-dtshim.h
Normal file
@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Imagination Technologies
|
||||
* Author: Paul Burton <paul.burton@imgtec.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef __MIPS_MALTA_DTSHIM_H__
|
||||
#define __MIPS_MALTA_DTSHIM_H__
|
||||
|
||||
#include <linux/init.h>
|
||||
|
||||
#ifdef CONFIG_MIPS_MALTA
|
||||
|
||||
extern void __init *malta_dt_shim(void *fdt);
|
||||
|
||||
#else /* !CONFIG_MIPS_MALTA */
|
||||
|
||||
static inline void *malta_dt_shim(void *fdt)
|
||||
{
|
||||
return fdt;
|
||||
}
|
||||
|
||||
#endif /* !CONFIG_MIPS_MALTA */
|
||||
|
||||
#endif /* __MIPS_MALTA_DTSHIM_H__ */
|
@ -13,17 +13,11 @@
|
||||
#ifndef _MT7620_REGS_H_
|
||||
#define _MT7620_REGS_H_
|
||||
|
||||
enum mt762x_soc_type {
|
||||
MT762X_SOC_UNKNOWN = 0,
|
||||
MT762X_SOC_MT7620A,
|
||||
MT762X_SOC_MT7620N,
|
||||
MT762X_SOC_MT7628AN,
|
||||
};
|
||||
|
||||
#define MT7620_SYSC_BASE 0x10000000
|
||||
|
||||
#define SYSC_REG_CHIP_NAME0 0x00
|
||||
#define SYSC_REG_CHIP_NAME1 0x04
|
||||
#define SYSC_REG_EFUSE_CFG 0x08
|
||||
#define SYSC_REG_CHIP_REV 0x0c
|
||||
#define SYSC_REG_SYSTEM_CONFIG0 0x10
|
||||
#define SYSC_REG_SYSTEM_CONFIG1 0x14
|
||||
|
@ -13,6 +13,23 @@
|
||||
#ifndef _RALINK_REGS_H_
|
||||
#define _RALINK_REGS_H_
|
||||
|
||||
enum ralink_soc_type {
|
||||
RALINK_UNKNOWN = 0,
|
||||
RT2880_SOC,
|
||||
RT3883_SOC,
|
||||
RT305X_SOC_RT3050,
|
||||
RT305X_SOC_RT3052,
|
||||
RT305X_SOC_RT3350,
|
||||
RT305X_SOC_RT3352,
|
||||
RT305X_SOC_RT5350,
|
||||
MT762X_SOC_MT7620A,
|
||||
MT762X_SOC_MT7620N,
|
||||
MT762X_SOC_MT7621AT,
|
||||
MT762X_SOC_MT7628AN,
|
||||
MT762X_SOC_MT7688,
|
||||
};
|
||||
extern enum ralink_soc_type ralink_soc;
|
||||
|
||||
extern __iomem void *rt_sysc_membase;
|
||||
extern __iomem void *rt_memc_membase;
|
||||
|
||||
|
@ -13,25 +13,16 @@
|
||||
#ifndef _RT305X_REGS_H_
|
||||
#define _RT305X_REGS_H_
|
||||
|
||||
enum rt305x_soc_type {
|
||||
RT305X_SOC_UNKNOWN = 0,
|
||||
RT305X_SOC_RT3050,
|
||||
RT305X_SOC_RT3052,
|
||||
RT305X_SOC_RT3350,
|
||||
RT305X_SOC_RT3352,
|
||||
RT305X_SOC_RT5350,
|
||||
};
|
||||
|
||||
extern enum rt305x_soc_type rt305x_soc;
|
||||
extern enum ralink_soc_type ralink_soc;
|
||||
|
||||
static inline int soc_is_rt3050(void)
|
||||
{
|
||||
return rt305x_soc == RT305X_SOC_RT3050;
|
||||
return ralink_soc == RT305X_SOC_RT3050;
|
||||
}
|
||||
|
||||
static inline int soc_is_rt3052(void)
|
||||
{
|
||||
return rt305x_soc == RT305X_SOC_RT3052;
|
||||
return ralink_soc == RT305X_SOC_RT3052;
|
||||
}
|
||||
|
||||
static inline int soc_is_rt305x(void)
|
||||
@ -41,17 +32,17 @@ static inline int soc_is_rt305x(void)
|
||||
|
||||
static inline int soc_is_rt3350(void)
|
||||
{
|
||||
return rt305x_soc == RT305X_SOC_RT3350;
|
||||
return ralink_soc == RT305X_SOC_RT3350;
|
||||
}
|
||||
|
||||
static inline int soc_is_rt3352(void)
|
||||
{
|
||||
return rt305x_soc == RT305X_SOC_RT3352;
|
||||
return ralink_soc == RT305X_SOC_RT3352;
|
||||
}
|
||||
|
||||
static inline int soc_is_rt5350(void)
|
||||
{
|
||||
return rt305x_soc == RT305X_SOC_RT5350;
|
||||
return ralink_soc == RT305X_SOC_RT5350;
|
||||
}
|
||||
|
||||
#define RT305X_SYSC_BASE 0x10000000
|
||||
|
18
arch/mips/include/asm/mach-xilfpga/irq.h
Normal file
18
arch/mips/include/asm/mach-xilfpga/irq.h
Normal file
@ -0,0 +1,18 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Imagination Technologies
|
||||
* Author: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef __MIPS_ASM_MACH_XILFPGA_IRQ_H__
|
||||
#define __MIPS_ASM_MACH_XILFPGA_IRQ_H__
|
||||
|
||||
#define NR_IRQS 32
|
||||
|
||||
#include_next <irq.h>
|
||||
|
||||
#endif /* __MIPS_ASM_MACH_XILFPGA_IRQ_H__ */
|
@ -11,6 +11,7 @@
|
||||
#ifndef __MIPS_ASM_MIPS_CM_H__
|
||||
#define __MIPS_ASM_MIPS_CM_H__
|
||||
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/types.h>
|
||||
@ -36,12 +37,12 @@ extern phys_addr_t __mips_cm_phys_base(void);
|
||||
/*
|
||||
* mips_cm_is64 - determine CM register width
|
||||
*
|
||||
* The CM register width is processor and CM specific. A 64-bit processor
|
||||
* usually has a 64-bit CM and a 32-bit one has a 32-bit CM but a 64-bit
|
||||
* processor could come with a 32-bit CM. Moreover, accesses on 64-bit CMs
|
||||
* can be done either using regular 64-bit load/store instructions, or 32-bit
|
||||
* load/store instruction on 32-bit register pairs. We opt for using 64-bit
|
||||
* accesses on 64-bit CMs and kernels and 32-bit in any other case.
|
||||
* The CM register width is determined by the version of the CM, with CM3
|
||||
* introducing 64 bit GCRs and all prior CM versions having 32 bit GCRs.
|
||||
* However we may run a kernel built for MIPS32 on a system with 64 bit GCRs,
|
||||
* or vice-versa. This variable indicates the width of the memory accesses
|
||||
* that the kernel will perform to GCRs, which may differ from the actual
|
||||
* width of the GCRs.
|
||||
*
|
||||
* It's set to 0 for 32-bit accesses and 1 for 64-bit accesses.
|
||||
*/
|
||||
@ -125,7 +126,17 @@ static inline u32 read32_gcr_##name(void) \
|
||||
\
|
||||
static inline u64 read64_gcr_##name(void) \
|
||||
{ \
|
||||
return __raw_readq(addr_gcr_##name()); \
|
||||
void __iomem *addr = addr_gcr_##name(); \
|
||||
u64 ret; \
|
||||
\
|
||||
if (mips_cm_is64) { \
|
||||
ret = __raw_readq(addr); \
|
||||
} else { \
|
||||
ret = __raw_readl(addr); \
|
||||
ret |= (u64)__raw_readl(addr + 0x4) << 32; \
|
||||
} \
|
||||
\
|
||||
return ret; \
|
||||
} \
|
||||
\
|
||||
static inline unsigned long read_gcr_##name(void) \
|
||||
@ -195,6 +206,8 @@ BUILD_CM_R_(gic_status, MIPS_CM_GCB_OFS + 0xd0)
|
||||
BUILD_CM_R_(cpc_status, MIPS_CM_GCB_OFS + 0xf0)
|
||||
BUILD_CM_RW(l2_config, MIPS_CM_GCB_OFS + 0x130)
|
||||
BUILD_CM_RW(sys_config2, MIPS_CM_GCB_OFS + 0x150)
|
||||
BUILD_CM_RW(l2_pft_control, MIPS_CM_GCB_OFS + 0x300)
|
||||
BUILD_CM_RW(l2_pft_control_b, MIPS_CM_GCB_OFS + 0x308)
|
||||
|
||||
/* Core Local & Core Other register accessor functions */
|
||||
BUILD_CM_Cx_RW(reset_release, 0x00)
|
||||
@ -245,11 +258,14 @@ BUILD_CM_Cx_R_(tcid_8_priority, 0x80)
|
||||
((minor) << CM_GCR_REV_MINOR_SHF))
|
||||
|
||||
#define CM_REV_CM2 CM_ENCODE_REV(6, 0)
|
||||
#define CM_REV_CM2_5 CM_ENCODE_REV(7, 0)
|
||||
#define CM_REV_CM3 CM_ENCODE_REV(8, 0)
|
||||
|
||||
/* GCR_ERROR_CAUSE register fields */
|
||||
#define CM_GCR_ERROR_CAUSE_ERRTYPE_SHF 27
|
||||
#define CM_GCR_ERROR_CAUSE_ERRTYPE_MSK (_ULCAST_(0x1f) << 27)
|
||||
#define CM3_GCR_ERROR_CAUSE_ERRTYPE_SHF 58
|
||||
#define CM3_GCR_ERROR_CAUSE_ERRTYPE_MSK GENMASK_ULL(63, 58)
|
||||
#define CM_GCR_ERROR_CAUSE_ERRINFO_SHF 0
|
||||
#define CM_GCR_ERROR_CAUSE_ERRINGO_MSK (_ULCAST_(0x7ffffff) << 0)
|
||||
|
||||
@ -321,6 +337,20 @@ BUILD_CM_Cx_R_(tcid_8_priority, 0x80)
|
||||
#define CM_GCR_SYS_CONFIG2_MAXVPW_SHF 0
|
||||
#define CM_GCR_SYS_CONFIG2_MAXVPW_MSK (_ULCAST_(0xf) << 0)
|
||||
|
||||
/* GCR_L2_PFT_CONTROL register fields */
|
||||
#define CM_GCR_L2_PFT_CONTROL_PAGEMASK_SHF 12
|
||||
#define CM_GCR_L2_PFT_CONTROL_PAGEMASK_MSK (_ULCAST_(0xfffff) << 12)
|
||||
#define CM_GCR_L2_PFT_CONTROL_PFTEN_SHF 8
|
||||
#define CM_GCR_L2_PFT_CONTROL_PFTEN_MSK (_ULCAST_(0x1) << 8)
|
||||
#define CM_GCR_L2_PFT_CONTROL_NPFT_SHF 0
|
||||
#define CM_GCR_L2_PFT_CONTROL_NPFT_MSK (_ULCAST_(0xff) << 0)
|
||||
|
||||
/* GCR_L2_PFT_CONTROL_B register fields */
|
||||
#define CM_GCR_L2_PFT_CONTROL_B_CEN_SHF 8
|
||||
#define CM_GCR_L2_PFT_CONTROL_B_CEN_MSK (_ULCAST_(0x1) << 8)
|
||||
#define CM_GCR_L2_PFT_CONTROL_B_PORTID_SHF 0
|
||||
#define CM_GCR_L2_PFT_CONTROL_B_PORTID_MSK (_ULCAST_(0xff) << 0)
|
||||
|
||||
/* GCR_Cx_COHERENCE register fields */
|
||||
#define CM_GCR_Cx_COHERENCE_COHDOMAINEN_SHF 0
|
||||
#define CM_GCR_Cx_COHERENCE_COHDOMAINEN_MSK (_ULCAST_(0xff) << 0)
|
||||
@ -329,11 +359,15 @@ BUILD_CM_Cx_R_(tcid_8_priority, 0x80)
|
||||
#define CM_GCR_Cx_CONFIG_IOCUTYPE_SHF 10
|
||||
#define CM_GCR_Cx_CONFIG_IOCUTYPE_MSK (_ULCAST_(0x3) << 10)
|
||||
#define CM_GCR_Cx_CONFIG_PVPE_SHF 0
|
||||
#define CM_GCR_Cx_CONFIG_PVPE_MSK (_ULCAST_(0x1ff) << 0)
|
||||
#define CM_GCR_Cx_CONFIG_PVPE_MSK (_ULCAST_(0x3ff) << 0)
|
||||
|
||||
/* GCR_Cx_OTHER register fields */
|
||||
#define CM_GCR_Cx_OTHER_CORENUM_SHF 16
|
||||
#define CM_GCR_Cx_OTHER_CORENUM_MSK (_ULCAST_(0xffff) << 16)
|
||||
#define CM3_GCR_Cx_OTHER_CORE_SHF 8
|
||||
#define CM3_GCR_Cx_OTHER_CORE_MSK (_ULCAST_(0x3f) << 8)
|
||||
#define CM3_GCR_Cx_OTHER_VP_SHF 0
|
||||
#define CM3_GCR_Cx_OTHER_VP_MSK (_ULCAST_(0x7) << 0)
|
||||
|
||||
/* GCR_Cx_RESET_BASE register fields */
|
||||
#define CM_GCR_Cx_RESET_BASE_BEVEXCBASE_SHF 12
|
||||
@ -444,4 +478,32 @@ static inline unsigned int mips_cm_vp_id(unsigned int cpu)
|
||||
return (core * mips_cm_max_vp_width()) + vp;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MIPS_CM
|
||||
|
||||
/**
|
||||
* mips_cm_lock_other - lock access to another core
|
||||
* @core: the other core to be accessed
|
||||
* @vp: the VP within the other core to be accessed
|
||||
*
|
||||
* Call before operating upon a core via the 'other' register region in
|
||||
* order to prevent the region being moved during access. Must be followed
|
||||
* by a call to mips_cm_unlock_other.
|
||||
*/
|
||||
extern void mips_cm_lock_other(unsigned int core, unsigned int vp);
|
||||
|
||||
/**
|
||||
* mips_cm_unlock_other - unlock access to another core
|
||||
*
|
||||
* Call after operating upon another core via the 'other' register region.
|
||||
* Must be called after mips_cm_lock_other.
|
||||
*/
|
||||
extern void mips_cm_unlock_other(void);
|
||||
|
||||
#else /* !CONFIG_MIPS_CM */
|
||||
|
||||
static inline void mips_cm_lock_other(unsigned int core) { }
|
||||
static inline void mips_cm_unlock_other(void) { }
|
||||
|
||||
#endif /* !CONFIG_MIPS_CM */
|
||||
|
||||
#endif /* __MIPS_ASM_MIPS_CM_H__ */
|
||||
|
@ -149,7 +149,8 @@ BUILD_CPC_Cx_RW(other, 0x10)
|
||||
* core: the other core to be accessed
|
||||
*
|
||||
* Call before operating upon a core via the 'other' register region in
|
||||
* order to prevent the region being moved during access. Must be followed
|
||||
* order to prevent the region being moved during access. Must be called
|
||||
* within the bounds of a mips_cm_{lock,unlock}_other pair, and followed
|
||||
* by a call to mips_cpc_unlock_other.
|
||||
*/
|
||||
extern void mips_cpc_lock_other(unsigned int core);
|
||||
|
@ -50,7 +50,9 @@
|
||||
#define CP0_PAGEMASK $5
|
||||
#define CP0_WIRED $6
|
||||
#define CP0_INFO $7
|
||||
#define CP0_HWRENA $7, 0
|
||||
#define CP0_BADVADDR $8
|
||||
#define CP0_BADINSTR $8, 1
|
||||
#define CP0_COUNT $9
|
||||
#define CP0_ENTRYHI $10
|
||||
#define CP0_COMPARE $11
|
||||
@ -58,7 +60,11 @@
|
||||
#define CP0_CAUSE $13
|
||||
#define CP0_EPC $14
|
||||
#define CP0_PRID $15
|
||||
#define CP0_EBASE $15, 1
|
||||
#define CP0_CMGCRBASE $15, 3
|
||||
#define CP0_CONFIG $16
|
||||
#define CP0_CONFIG3 $16, 3
|
||||
#define CP0_CONFIG5 $16, 5
|
||||
#define CP0_LLADDR $17
|
||||
#define CP0_WATCHLO $18
|
||||
#define CP0_WATCHHI $19
|
||||
@ -126,15 +132,9 @@
|
||||
#define R3K_ENTRYLO_N (_ULCAST_(1) << 11)
|
||||
|
||||
/* MIPS32/64 EntryLo bit definitions */
|
||||
#ifdef CONFIG_64BIT
|
||||
/* as read by dmfc0 */
|
||||
#define MIPS_ENTRYLO_XI (_ULCAST_(1) << 62)
|
||||
#define MIPS_ENTRYLO_RI (_ULCAST_(1) << 63)
|
||||
#else
|
||||
/* as read by mfc0 */
|
||||
#define MIPS_ENTRYLO_XI (_ULCAST_(1) << 30)
|
||||
#define MIPS_ENTRYLO_RI (_ULCAST_(1) << 31)
|
||||
#endif
|
||||
#define MIPS_ENTRYLO_PFN_SHIFT 6
|
||||
#define MIPS_ENTRYLO_XI (_ULCAST_(1) << (BITS_PER_LONG - 2))
|
||||
#define MIPS_ENTRYLO_RI (_ULCAST_(1) << (BITS_PER_LONG - 1))
|
||||
|
||||
/*
|
||||
* Values for PageMask register
|
||||
|
@ -33,7 +33,7 @@
|
||||
#define PAGE_SHIFT 16
|
||||
#endif
|
||||
#define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT)
|
||||
#define PAGE_MASK (~((1 << PAGE_SHIFT) - 1))
|
||||
#define PAGE_MASK (~(PAGE_SIZE - 1))
|
||||
|
||||
/*
|
||||
* This is used for calculating the real page sizes
|
||||
|
@ -36,12 +36,6 @@ extern unsigned int vced_count, vcei_count;
|
||||
*/
|
||||
#define HAVE_ARCH_PICK_MMAP_LAYOUT 1
|
||||
|
||||
/*
|
||||
* A special page (the vdso) is mapped into all processes at the very
|
||||
* top of the virtual memory space.
|
||||
*/
|
||||
#define SPECIAL_PAGES_SIZE PAGE_SIZE
|
||||
|
||||
#ifdef CONFIG_32BIT
|
||||
#ifdef CONFIG_KVM_GUEST
|
||||
/* User space process size is limited to 1GB in KVM Guest Mode */
|
||||
@ -80,7 +74,7 @@ extern unsigned int vced_count, vcei_count;
|
||||
|
||||
#endif
|
||||
|
||||
#define STACK_TOP ((TASK_SIZE & PAGE_MASK) - SPECIAL_PAGES_SIZE)
|
||||
#define STACK_TOP (TASK_SIZE & PAGE_MASK)
|
||||
|
||||
/*
|
||||
* This decides where the kernel will search for a free chunk of vm
|
||||
|
@ -1,29 +1,136 @@
|
||||
/*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
* Copyright (C) 2015 Imagination Technologies
|
||||
* Author: Alex Smith <alex.smith@imgtec.com>
|
||||
*
|
||||
* Copyright (C) 2009 Cavium Networks
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_VDSO_H
|
||||
#define __ASM_VDSO_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/mm_types.h>
|
||||
|
||||
#include <asm/barrier.h>
|
||||
|
||||
#ifdef CONFIG_32BIT
|
||||
struct mips_vdso {
|
||||
u32 signal_trampoline[2];
|
||||
u32 rt_signal_trampoline[2];
|
||||
/**
|
||||
* struct mips_vdso_image - Details of a VDSO image.
|
||||
* @data: Pointer to VDSO image data (page-aligned).
|
||||
* @size: Size of the VDSO image data (page-aligned).
|
||||
* @off_sigreturn: Offset of the sigreturn() trampoline.
|
||||
* @off_rt_sigreturn: Offset of the rt_sigreturn() trampoline.
|
||||
* @mapping: Special mapping structure.
|
||||
*
|
||||
* This structure contains details of a VDSO image, including the image data
|
||||
* and offsets of certain symbols required by the kernel. It is generated as
|
||||
* part of the VDSO build process, aside from the mapping page array, which is
|
||||
* populated at runtime.
|
||||
*/
|
||||
struct mips_vdso_image {
|
||||
void *data;
|
||||
unsigned long size;
|
||||
|
||||
unsigned long off_sigreturn;
|
||||
unsigned long off_rt_sigreturn;
|
||||
|
||||
struct vm_special_mapping mapping;
|
||||
};
|
||||
#else /* !CONFIG_32BIT */
|
||||
struct mips_vdso {
|
||||
u32 o32_signal_trampoline[2];
|
||||
u32 o32_rt_signal_trampoline[2];
|
||||
u32 rt_signal_trampoline[2];
|
||||
u32 n32_rt_signal_trampoline[2];
|
||||
|
||||
/*
|
||||
* The following structures are auto-generated as part of the build for each
|
||||
* ABI by genvdso, see arch/mips/vdso/Makefile.
|
||||
*/
|
||||
|
||||
extern struct mips_vdso_image vdso_image;
|
||||
|
||||
#ifdef CONFIG_MIPS32_O32
|
||||
extern struct mips_vdso_image vdso_image_o32;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MIPS32_N32
|
||||
extern struct mips_vdso_image vdso_image_n32;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* union mips_vdso_data - Data provided by the kernel for the VDSO.
|
||||
* @xtime_sec: Current real time (seconds part).
|
||||
* @xtime_nsec: Current real time (nanoseconds part, shifted).
|
||||
* @wall_to_mono_sec: Wall-to-monotonic offset (seconds part).
|
||||
* @wall_to_mono_nsec: Wall-to-monotonic offset (nanoseconds part).
|
||||
* @seq_count: Counter to synchronise updates (odd = updating).
|
||||
* @cs_shift: Clocksource shift value.
|
||||
* @clock_mode: Clocksource to use for time functions.
|
||||
* @cs_mult: Clocksource multiplier value.
|
||||
* @cs_cycle_last: Clock cycle value at last update.
|
||||
* @cs_mask: Clocksource mask value.
|
||||
* @tz_minuteswest: Minutes west of Greenwich (from timezone).
|
||||
* @tz_dsttime: Type of DST correction (from timezone).
|
||||
*
|
||||
* This structure contains data needed by functions within the VDSO. It is
|
||||
* populated by the kernel and mapped read-only into user memory. The time
|
||||
* fields are mirrors of internal data from the timekeeping infrastructure.
|
||||
*
|
||||
* Note: Care should be taken when modifying as the layout must remain the same
|
||||
* for both 64- and 32-bit (for 32-bit userland on 64-bit kernel).
|
||||
*/
|
||||
union mips_vdso_data {
|
||||
struct {
|
||||
u64 xtime_sec;
|
||||
u64 xtime_nsec;
|
||||
u32 wall_to_mono_sec;
|
||||
u32 wall_to_mono_nsec;
|
||||
u32 seq_count;
|
||||
u32 cs_shift;
|
||||
u8 clock_mode;
|
||||
u32 cs_mult;
|
||||
u64 cs_cycle_last;
|
||||
u64 cs_mask;
|
||||
s32 tz_minuteswest;
|
||||
s32 tz_dsttime;
|
||||
};
|
||||
|
||||
u8 page[PAGE_SIZE];
|
||||
};
|
||||
#endif /* CONFIG_32BIT */
|
||||
|
||||
static inline u32 vdso_data_read_begin(const union mips_vdso_data *data)
|
||||
{
|
||||
u32 seq;
|
||||
|
||||
while (true) {
|
||||
seq = ACCESS_ONCE(data->seq_count);
|
||||
if (likely(!(seq & 1))) {
|
||||
/* Paired with smp_wmb() in vdso_data_write_*(). */
|
||||
smp_rmb();
|
||||
return seq;
|
||||
}
|
||||
|
||||
cpu_relax();
|
||||
}
|
||||
}
|
||||
|
||||
static inline bool vdso_data_read_retry(const union mips_vdso_data *data,
|
||||
u32 start_seq)
|
||||
{
|
||||
/* Paired with smp_wmb() in vdso_data_write_*(). */
|
||||
smp_rmb();
|
||||
return unlikely(data->seq_count != start_seq);
|
||||
}
|
||||
|
||||
static inline void vdso_data_write_begin(union mips_vdso_data *data)
|
||||
{
|
||||
++data->seq_count;
|
||||
|
||||
/* Ensure sequence update is written before other data page values. */
|
||||
smp_wmb();
|
||||
}
|
||||
|
||||
static inline void vdso_data_write_end(union mips_vdso_data *data)
|
||||
{
|
||||
/* Ensure data values are written before updating sequence again. */
|
||||
smp_wmb();
|
||||
++data->seq_count;
|
||||
}
|
||||
|
||||
#endif /* __ASM_VDSO_H */
|
||||
|
@ -1,9 +1,9 @@
|
||||
# UAPI Header export list
|
||||
include include/uapi/asm-generic/Kbuild.asm
|
||||
|
||||
generic-y += auxvec.h
|
||||
generic-y += ipcbuf.h
|
||||
|
||||
header-y += auxvec.h
|
||||
header-y += bitfield.h
|
||||
header-y += bitsperlong.h
|
||||
header-y += break.h
|
||||
|
17
arch/mips/include/uapi/asm/auxvec.h
Normal file
17
arch/mips/include/uapi/asm/auxvec.h
Normal file
@ -0,0 +1,17 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Imagination Technologies
|
||||
* Author: Alex Smith <alex.smith@imgtec.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_AUXVEC_H
|
||||
#define __ASM_AUXVEC_H
|
||||
|
||||
/* Location of VDSO image. */
|
||||
#define AT_SYSINFO_EHDR 33
|
||||
|
||||
#endif /* __ASM_AUXVEC_H */
|
@ -25,6 +25,7 @@
|
||||
#include <linux/power_supply.h>
|
||||
#include <linux/power/jz4740-battery.h>
|
||||
#include <linux/power/gpio-charger.h>
|
||||
#include <linux/pwm.h>
|
||||
|
||||
#include <asm/mach-jz4740/gpio.h>
|
||||
#include <asm/mach-jz4740/jz4740_fb.h>
|
||||
@ -34,8 +35,6 @@
|
||||
#include <linux/regulator/fixed.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
|
||||
#include <linux/leds_pwm.h>
|
||||
|
||||
#include <asm/mach-jz4740/platform.h>
|
||||
|
||||
#include "clock.h"
|
||||
@ -399,13 +398,15 @@ static struct platform_device avt2_usb_regulator_device = {
|
||||
}
|
||||
};
|
||||
|
||||
static struct pwm_lookup qi_lb60_pwm_lookup[] = {
|
||||
PWM_LOOKUP("jz4740-pwm", 4, "pwm-beeper", NULL, 0,
|
||||
PWM_POLARITY_NORMAL),
|
||||
};
|
||||
|
||||
/* beeper */
|
||||
static struct platform_device qi_lb60_pwm_beeper = {
|
||||
.name = "pwm-beeper",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = (void *)4,
|
||||
},
|
||||
};
|
||||
|
||||
/* charger */
|
||||
@ -491,6 +492,8 @@ static int __init qi_lb60_init_platform_devices(void)
|
||||
platform_device_register(&jz4740_usb_ohci_device);
|
||||
}
|
||||
|
||||
pwm_add_table(qi_lb60_pwm_lookup, ARRAY_SIZE(qi_lb60_pwm_lookup));
|
||||
|
||||
return platform_add_devices(jz_platform_devices,
|
||||
ARRAY_SIZE(jz_platform_devices));
|
||||
|
||||
|
@ -51,6 +51,7 @@ obj-$(CONFIG_MIPS_MT_FPAFF) += mips-mt-fpaff.o
|
||||
obj-$(CONFIG_MIPS_MT_SMP) += smp-mt.o
|
||||
obj-$(CONFIG_MIPS_CMP) += smp-cmp.o
|
||||
obj-$(CONFIG_MIPS_CPS) += smp-cps.o cps-vec.o
|
||||
obj-$(CONFIG_MIPS_CPS_NS16550) += cps-vec-ns16550.o
|
||||
obj-$(CONFIG_MIPS_GIC_IPI) += smp-gic.o
|
||||
obj-$(CONFIG_MIPS_SPRAM) += spram.o
|
||||
|
||||
|
202
arch/mips/kernel/cps-vec-ns16550.S
Normal file
202
arch/mips/kernel/cps-vec-ns16550.S
Normal file
@ -0,0 +1,202 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Imagination Technologies
|
||||
* Author: Paul Burton <paul.burton@imgtec.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
#include <asm/addrspace.h>
|
||||
#include <asm/asm.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/regdef.h>
|
||||
#include <linux/serial_reg.h>
|
||||
|
||||
#define UART_TX_OFS (UART_TX << CONFIG_MIPS_CPS_NS16550_SHIFT)
|
||||
#define UART_LSR_OFS (UART_LSR << CONFIG_MIPS_CPS_NS16550_SHIFT)
|
||||
|
||||
/**
|
||||
* _mips_cps_putc() - write a character to the UART
|
||||
* @a0: ASCII character to write
|
||||
* @t9: UART base address
|
||||
*/
|
||||
LEAF(_mips_cps_putc)
|
||||
1: lw t0, UART_LSR_OFS(t9)
|
||||
andi t0, t0, UART_LSR_TEMT
|
||||
beqz t0, 1b
|
||||
sb a0, UART_TX_OFS(t9)
|
||||
jr ra
|
||||
END(_mips_cps_putc)
|
||||
|
||||
/**
|
||||
* _mips_cps_puts() - write a string to the UART
|
||||
* @a0: pointer to NULL-terminated ASCII string
|
||||
* @t9: UART base address
|
||||
*
|
||||
* Write a null-terminated ASCII string to the UART.
|
||||
*/
|
||||
NESTED(_mips_cps_puts, 0, ra)
|
||||
move s7, ra
|
||||
move s6, a0
|
||||
|
||||
1: lb a0, 0(s6)
|
||||
beqz a0, 2f
|
||||
jal _mips_cps_putc
|
||||
PTR_ADDIU s6, s6, 1
|
||||
b 1b
|
||||
|
||||
2: jr s7
|
||||
END(_mips_cps_puts)
|
||||
|
||||
/**
|
||||
* _mips_cps_putx4 - write a 4b hex value to the UART
|
||||
* @a0: the 4b value to write to the UART
|
||||
* @t9: UART base address
|
||||
*
|
||||
* Write a single hexadecimal character to the UART.
|
||||
*/
|
||||
NESTED(_mips_cps_putx4, 0, ra)
|
||||
andi a0, a0, 0xf
|
||||
li t0, '0'
|
||||
blt a0, 10, 1f
|
||||
li t0, 'a'
|
||||
addiu a0, a0, -10
|
||||
1: addu a0, a0, t0
|
||||
b _mips_cps_putc
|
||||
END(_mips_cps_putx4)
|
||||
|
||||
/**
|
||||
* _mips_cps_putx8 - write an 8b hex value to the UART
|
||||
* @a0: the 8b value to write to the UART
|
||||
* @t9: UART base address
|
||||
*
|
||||
* Write an 8 bit value (ie. 2 hexadecimal characters) to the UART.
|
||||
*/
|
||||
NESTED(_mips_cps_putx8, 0, ra)
|
||||
move s3, ra
|
||||
move s2, a0
|
||||
srl a0, a0, 4
|
||||
jal _mips_cps_putx4
|
||||
move a0, s2
|
||||
move ra, s3
|
||||
b _mips_cps_putx4
|
||||
END(_mips_cps_putx8)
|
||||
|
||||
/**
|
||||
* _mips_cps_putx16 - write a 16b hex value to the UART
|
||||
* @a0: the 16b value to write to the UART
|
||||
* @t9: UART base address
|
||||
*
|
||||
* Write a 16 bit value (ie. 4 hexadecimal characters) to the UART.
|
||||
*/
|
||||
NESTED(_mips_cps_putx16, 0, ra)
|
||||
move s5, ra
|
||||
move s4, a0
|
||||
srl a0, a0, 8
|
||||
jal _mips_cps_putx8
|
||||
move a0, s4
|
||||
move ra, s5
|
||||
b _mips_cps_putx8
|
||||
END(_mips_cps_putx16)
|
||||
|
||||
/**
|
||||
* _mips_cps_putx32 - write a 32b hex value to the UART
|
||||
* @a0: the 32b value to write to the UART
|
||||
* @t9: UART base address
|
||||
*
|
||||
* Write a 32 bit value (ie. 8 hexadecimal characters) to the UART.
|
||||
*/
|
||||
NESTED(_mips_cps_putx32, 0, ra)
|
||||
move s7, ra
|
||||
move s6, a0
|
||||
srl a0, a0, 16
|
||||
jal _mips_cps_putx16
|
||||
move a0, s6
|
||||
move ra, s7
|
||||
b _mips_cps_putx16
|
||||
END(_mips_cps_putx32)
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
|
||||
/**
|
||||
* _mips_cps_putx64 - write a 64b hex value to the UART
|
||||
* @a0: the 64b value to write to the UART
|
||||
* @t9: UART base address
|
||||
*
|
||||
* Write a 64 bit value (ie. 16 hexadecimal characters) to the UART.
|
||||
*/
|
||||
NESTED(_mips_cps_putx64, 0, ra)
|
||||
move sp, ra
|
||||
move s8, a0
|
||||
dsrl32 a0, a0, 0
|
||||
jal _mips_cps_putx32
|
||||
move a0, s8
|
||||
move ra, sp
|
||||
b _mips_cps_putx32
|
||||
END(_mips_cps_putx64)
|
||||
|
||||
#define _mips_cps_putxlong _mips_cps_putx64
|
||||
|
||||
#else /* !CONFIG_64BIT */
|
||||
|
||||
#define _mips_cps_putxlong _mips_cps_putx32
|
||||
|
||||
#endif /* !CONFIG_64BIT */
|
||||
|
||||
/**
|
||||
* mips_cps_bev_dump() - dump relevant exception state to UART
|
||||
* @a0: pointer to NULL-terminated ASCII string naming the exception
|
||||
*
|
||||
* Write information that may be useful in debugging an exception to the
|
||||
* UART configured by CONFIG_MIPS_CPS_NS16550_*. As this BEV exception
|
||||
* will only be run if something goes horribly wrong very early during
|
||||
* the bringup of a core and it is very likely to be unsafe to perform
|
||||
* memory accesses at that point (cache state indeterminate, EVA may not
|
||||
* be configured, coherence may be disabled) let alone have a stack,
|
||||
* this is all written in assembly using only registers & unmapped
|
||||
* uncached access to the UART registers.
|
||||
*/
|
||||
LEAF(mips_cps_bev_dump)
|
||||
move s0, ra
|
||||
move s1, a0
|
||||
|
||||
li t9, CKSEG1ADDR(CONFIG_MIPS_CPS_NS16550_BASE)
|
||||
|
||||
PTR_LA a0, str_newline
|
||||
jal _mips_cps_puts
|
||||
PTR_LA a0, str_bev
|
||||
jal _mips_cps_puts
|
||||
move a0, s1
|
||||
jal _mips_cps_puts
|
||||
PTR_LA a0, str_newline
|
||||
jal _mips_cps_puts
|
||||
PTR_LA a0, str_newline
|
||||
jal _mips_cps_puts
|
||||
|
||||
#define DUMP_COP0_REG(reg, name, sz, _mfc0) \
|
||||
PTR_LA a0, 8f; \
|
||||
jal _mips_cps_puts; \
|
||||
_mfc0 a0, reg; \
|
||||
jal _mips_cps_putx##sz; \
|
||||
PTR_LA a0, str_newline; \
|
||||
jal _mips_cps_puts; \
|
||||
TEXT(name)
|
||||
|
||||
DUMP_COP0_REG(CP0_CAUSE, "Cause: 0x", 32, mfc0)
|
||||
DUMP_COP0_REG(CP0_STATUS, "Status: 0x", 32, mfc0)
|
||||
DUMP_COP0_REG(CP0_EBASE, "EBase: 0x", long, MFC0)
|
||||
DUMP_COP0_REG(CP0_BADVADDR, "BadVAddr: 0x", long, MFC0)
|
||||
DUMP_COP0_REG(CP0_BADINSTR, "BadInstr: 0x", 32, mfc0)
|
||||
|
||||
PTR_LA a0, str_newline
|
||||
jal _mips_cps_puts
|
||||
jr s0
|
||||
END(mips_cps_bev_dump)
|
||||
|
||||
.pushsection .data
|
||||
str_bev: .asciiz "BEV Exception: "
|
||||
str_newline: .asciiz "\r\n"
|
||||
.popsection
|
@ -25,14 +25,32 @@
|
||||
|
||||
.set noreorder
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
# define STATUS_BITDEPS ST0_KX
|
||||
#else
|
||||
# define STATUS_BITDEPS 0
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MIPS_CPS_NS16550
|
||||
|
||||
#define DUMP_EXCEP(name) \
|
||||
PTR_LA a0, 8f; \
|
||||
jal mips_cps_bev_dump; \
|
||||
nop; \
|
||||
TEXT(name)
|
||||
|
||||
#else /* !CONFIG_MIPS_CPS_NS16550 */
|
||||
|
||||
#define DUMP_EXCEP(name)
|
||||
|
||||
#endif /* !CONFIG_MIPS_CPS_NS16550 */
|
||||
|
||||
/*
|
||||
* Set dest to non-zero if the core supports the MT ASE, else zero. If
|
||||
* MT is not supported then branch to nomt.
|
||||
*/
|
||||
.macro has_mt dest, nomt
|
||||
mfc0 \dest, CP0_CONFIG
|
||||
bgez \dest, \nomt
|
||||
mfc0 \dest, CP0_CONFIG, 1
|
||||
mfc0 \dest, CP0_CONFIG, 1
|
||||
bgez \dest, \nomt
|
||||
mfc0 \dest, CP0_CONFIG, 2
|
||||
bgez \dest, \nomt
|
||||
@ -47,11 +65,9 @@
|
||||
|
||||
LEAF(mips_cps_core_entry)
|
||||
/*
|
||||
* These first 12 bytes will be patched by cps_smp_setup to load the
|
||||
* base address of the CM GCRs into register v1 and the CCA to use into
|
||||
* register s0.
|
||||
* These first 4 bytes will be patched by cps_smp_setup to load the
|
||||
* CCA to use into register s0.
|
||||
*/
|
||||
.quad 0
|
||||
.word 0
|
||||
|
||||
/* Check whether we're here due to an NMI */
|
||||
@ -71,7 +87,7 @@ not_nmi:
|
||||
mtc0 t0, CP0_CAUSE
|
||||
|
||||
/* Setup Status */
|
||||
li t0, ST0_CU1 | ST0_CU0
|
||||
li t0, ST0_CU1 | ST0_CU0 | ST0_BEV | STATUS_BITDEPS
|
||||
mtc0 t0, CP0_STATUS
|
||||
|
||||
/*
|
||||
@ -151,6 +167,12 @@ dcache_done:
|
||||
mtc0 t0, CP0_CONFIG
|
||||
ehb
|
||||
|
||||
/* Calculate an uncached address for the CM GCRs */
|
||||
MFC0 v1, CP0_CMGCRBASE
|
||||
PTR_SLL v1, v1, 4
|
||||
PTR_LI t0, UNCAC_BASE
|
||||
PTR_ADDU v1, v1, t0
|
||||
|
||||
/* Enter the coherent domain */
|
||||
li t0, 0xff
|
||||
sw t0, GCR_CL_COHERENCE_OFS(v1)
|
||||
@ -188,36 +210,42 @@ dcache_done:
|
||||
|
||||
.org 0x200
|
||||
LEAF(excep_tlbfill)
|
||||
DUMP_EXCEP("TLB Fill")
|
||||
b .
|
||||
nop
|
||||
END(excep_tlbfill)
|
||||
|
||||
.org 0x280
|
||||
LEAF(excep_xtlbfill)
|
||||
DUMP_EXCEP("XTLB Fill")
|
||||
b .
|
||||
nop
|
||||
END(excep_xtlbfill)
|
||||
|
||||
.org 0x300
|
||||
LEAF(excep_cache)
|
||||
DUMP_EXCEP("Cache")
|
||||
b .
|
||||
nop
|
||||
END(excep_cache)
|
||||
|
||||
.org 0x380
|
||||
LEAF(excep_genex)
|
||||
DUMP_EXCEP("General")
|
||||
b .
|
||||
nop
|
||||
END(excep_genex)
|
||||
|
||||
.org 0x400
|
||||
LEAF(excep_intex)
|
||||
DUMP_EXCEP("Interrupt")
|
||||
b .
|
||||
nop
|
||||
END(excep_intex)
|
||||
|
||||
.org 0x480
|
||||
LEAF(excep_ejtag)
|
||||
DUMP_EXCEP("EJTAG")
|
||||
PTR_LA k0, ejtag_debug_handler
|
||||
jr k0
|
||||
nop
|
||||
|
@ -536,8 +536,7 @@ static inline unsigned int decode_config3(struct cpuinfo_mips *c)
|
||||
c->options |= MIPS_CPU_SEGMENTS;
|
||||
if (config3 & MIPS_CONF3_MSA)
|
||||
c->ases |= MIPS_ASE_MSA;
|
||||
/* Only tested on 32-bit cores */
|
||||
if ((config3 & MIPS_CONF3_PW) && config_enabled(CONFIG_32BIT)) {
|
||||
if (config3 & MIPS_CONF3_PW) {
|
||||
c->htw_seq = 0;
|
||||
c->options |= MIPS_CPU_HTW;
|
||||
}
|
||||
|
@ -28,6 +28,43 @@ static u64 notrace r4k_read_sched_clock(void)
|
||||
return read_c0_count();
|
||||
}
|
||||
|
||||
static inline unsigned int rdhwr_count(void)
|
||||
{
|
||||
unsigned int count;
|
||||
|
||||
__asm__ __volatile__(
|
||||
" .set push\n"
|
||||
" .set mips32r2\n"
|
||||
" rdhwr %0, $2\n"
|
||||
" .set pop\n"
|
||||
: "=r" (count));
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static bool rdhwr_count_usable(void)
|
||||
{
|
||||
unsigned int prev, curr, i;
|
||||
|
||||
/*
|
||||
* Older QEMUs have a broken implementation of RDHWR for the CP0 count
|
||||
* which always returns a constant value. Try to identify this and don't
|
||||
* use it in the VDSO if it is broken. This workaround can be removed
|
||||
* once the fix has been in QEMU stable for a reasonable amount of time.
|
||||
*/
|
||||
for (i = 0, prev = rdhwr_count(); i < 100; i++) {
|
||||
curr = rdhwr_count();
|
||||
|
||||
if (curr != prev)
|
||||
return true;
|
||||
|
||||
prev = curr;
|
||||
}
|
||||
|
||||
pr_warn("Not using R4K clocksource in VDSO due to broken RDHWR\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
int __init init_r4k_clocksource(void)
|
||||
{
|
||||
if (!cpu_has_counter || !mips_hpt_frequency)
|
||||
@ -36,6 +73,13 @@ int __init init_r4k_clocksource(void)
|
||||
/* Calculate a somewhat reasonable rating value */
|
||||
clocksource_mips.rating = 200 + mips_hpt_frequency / 10000000;
|
||||
|
||||
/*
|
||||
* R2 onwards makes the count accessible to user mode so it can be used
|
||||
* by the VDSO (HWREna is configured by configure_hwrena()).
|
||||
*/
|
||||
if (cpu_has_mips_r2_r6 && rdhwr_count_usable())
|
||||
clocksource_mips.archdata.vdso_clock_mode = VDSO_CLOCK_R4K;
|
||||
|
||||
clocksource_register_hz(&clocksource_mips, mips_hpt_frequency);
|
||||
|
||||
sched_clock_register(r4k_read_sched_clock, 32, mips_hpt_frequency);
|
||||
|
@ -134,6 +134,16 @@ void __init check_wait(void)
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* MIPSr6 specifies that masked interrupts should unblock an executing
|
||||
* wait instruction, and thus that it is safe for us to use
|
||||
* r4k_wait_irqoff. Yippee!
|
||||
*/
|
||||
if (cpu_has_mips_r6) {
|
||||
cpu_wait = r4k_wait_irqoff;
|
||||
return;
|
||||
}
|
||||
|
||||
switch (current_cpu_type()) {
|
||||
case CPU_R3081:
|
||||
case CPU_R3081E:
|
||||
@ -155,12 +165,12 @@ void __init check_wait(void)
|
||||
case CPU_4KEC:
|
||||
case CPU_4KSC:
|
||||
case CPU_5KC:
|
||||
case CPU_5KE:
|
||||
case CPU_25KF:
|
||||
case CPU_PR4450:
|
||||
case CPU_BMIPS3300:
|
||||
case CPU_BMIPS4350:
|
||||
case CPU_BMIPS4380:
|
||||
case CPU_BMIPS5000:
|
||||
case CPU_CAVIUM_OCTEON:
|
||||
case CPU_CAVIUM_OCTEON_PLUS:
|
||||
case CPU_CAVIUM_OCTEON2:
|
||||
@ -171,7 +181,9 @@ void __init check_wait(void)
|
||||
case CPU_XLP:
|
||||
cpu_wait = r4k_wait;
|
||||
break;
|
||||
|
||||
case CPU_BMIPS5000:
|
||||
cpu_wait = r4k_wait_irqoff;
|
||||
break;
|
||||
case CPU_RM7000:
|
||||
cpu_wait = rm7k_wait_irqoff;
|
||||
break;
|
||||
@ -196,7 +208,6 @@ void __init check_wait(void)
|
||||
case CPU_INTERAPTIV:
|
||||
case CPU_M5150:
|
||||
case CPU_QEMU_GENERIC:
|
||||
case CPU_I6400:
|
||||
cpu_wait = r4k_wait;
|
||||
if (read_c0_config7() & MIPS_CONF7_WII)
|
||||
cpu_wait = r4k_wait_irqoff;
|
||||
|
@ -9,6 +9,8 @@
|
||||
*/
|
||||
|
||||
#include <linux/errno.h>
|
||||
#include <linux/percpu.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include <asm/mips-cm.h>
|
||||
#include <asm/mipsregs.h>
|
||||
@ -136,6 +138,9 @@ static char *cm3_causes[32] = {
|
||||
"0x19", "0x1a", "0x1b", "0x1c", "0x1d", "0x1e", "0x1f"
|
||||
};
|
||||
|
||||
static DEFINE_PER_CPU_ALIGNED(spinlock_t, cm_core_lock);
|
||||
static DEFINE_PER_CPU_ALIGNED(unsigned long, cm_core_lock_flags);
|
||||
|
||||
phys_addr_t __mips_cm_phys_base(void)
|
||||
{
|
||||
u32 config3 = read_c0_config3();
|
||||
@ -200,6 +205,7 @@ int mips_cm_probe(void)
|
||||
{
|
||||
phys_addr_t addr;
|
||||
u32 base_reg;
|
||||
unsigned cpu;
|
||||
|
||||
/*
|
||||
* No need to probe again if we have already been
|
||||
@ -247,38 +253,70 @@ int mips_cm_probe(void)
|
||||
/* determine register width for this CM */
|
||||
mips_cm_is64 = config_enabled(CONFIG_64BIT) && (mips_cm_revision() >= CM_REV_CM3);
|
||||
|
||||
for_each_possible_cpu(cpu)
|
||||
spin_lock_init(&per_cpu(cm_core_lock, cpu));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mips_cm_lock_other(unsigned int core, unsigned int vp)
|
||||
{
|
||||
unsigned curr_core;
|
||||
u32 val;
|
||||
|
||||
preempt_disable();
|
||||
curr_core = current_cpu_data.core;
|
||||
spin_lock_irqsave(&per_cpu(cm_core_lock, curr_core),
|
||||
per_cpu(cm_core_lock_flags, curr_core));
|
||||
|
||||
if (mips_cm_revision() >= CM_REV_CM3) {
|
||||
val = core << CM3_GCR_Cx_OTHER_CORE_SHF;
|
||||
val |= vp << CM3_GCR_Cx_OTHER_VP_SHF;
|
||||
} else {
|
||||
BUG_ON(vp != 0);
|
||||
val = core << CM_GCR_Cx_OTHER_CORENUM_SHF;
|
||||
}
|
||||
|
||||
write_gcr_cl_other(val);
|
||||
|
||||
/*
|
||||
* Ensure the core-other region reflects the appropriate core &
|
||||
* VP before any accesses to it occur.
|
||||
*/
|
||||
mb();
|
||||
}
|
||||
|
||||
void mips_cm_unlock_other(void)
|
||||
{
|
||||
unsigned curr_core = current_cpu_data.core;
|
||||
|
||||
spin_unlock_irqrestore(&per_cpu(cm_core_lock, curr_core),
|
||||
per_cpu(cm_core_lock_flags, curr_core));
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
void mips_cm_error_report(void)
|
||||
{
|
||||
unsigned long revision = mips_cm_revision();
|
||||
/*
|
||||
* CM3 has a 64-bit Error cause register with 0:57 containing the error
|
||||
* info and 63:58 the error type. For old CMs, everything is contained
|
||||
* in a single 32-bit register (0:26 and 31:27 respectively). Even
|
||||
* though the cm_error is u64, we will simply ignore the upper word
|
||||
* for CM2.
|
||||
*/
|
||||
u64 cm_error = read_gcr_error_cause();
|
||||
int cm_error_cause_sft = CM_GCR_ERROR_CAUSE_ERRTYPE_SHF +
|
||||
((revision >= CM_REV_CM3) ? 31 : 0);
|
||||
unsigned long cm_addr = read_gcr_error_addr();
|
||||
unsigned long cm_other = read_gcr_error_mult();
|
||||
u64 cm_error, cm_addr, cm_other;
|
||||
unsigned long revision;
|
||||
int ocause, cause;
|
||||
char buf[256];
|
||||
|
||||
if (!mips_cm_present())
|
||||
return;
|
||||
|
||||
cause = cm_error >> cm_error_cause_sft;
|
||||
revision = mips_cm_revision();
|
||||
|
||||
if (!cause)
|
||||
/* All good */
|
||||
return;
|
||||
|
||||
ocause = cm_other >> CM_GCR_ERROR_MULT_ERR2ND_SHF;
|
||||
if (revision < CM_REV_CM3) { /* CM2 */
|
||||
cm_error = read_gcr_error_cause();
|
||||
cm_addr = read_gcr_error_addr();
|
||||
cm_other = read_gcr_error_mult();
|
||||
cause = cm_error >> CM_GCR_ERROR_CAUSE_ERRTYPE_SHF;
|
||||
ocause = cm_other >> CM_GCR_ERROR_MULT_ERR2ND_SHF;
|
||||
|
||||
if (!cause)
|
||||
return;
|
||||
|
||||
if (cause < 16) {
|
||||
unsigned long cca_bits = (cm_error >> 15) & 7;
|
||||
unsigned long tr_bits = (cm_error >> 12) & 7;
|
||||
@ -310,18 +348,30 @@ void mips_cm_error_report(void)
|
||||
}
|
||||
pr_err("CM_ERROR=%08llx %s <%s>\n", cm_error,
|
||||
cm2_causes[cause], buf);
|
||||
pr_err("CM_ADDR =%08lx\n", cm_addr);
|
||||
pr_err("CM_OTHER=%08lx %s\n", cm_other, cm2_causes[ocause]);
|
||||
pr_err("CM_ADDR =%08llx\n", cm_addr);
|
||||
pr_err("CM_OTHER=%08llx %s\n", cm_other, cm2_causes[ocause]);
|
||||
} else { /* CM3 */
|
||||
/* Used by cause == {1,2,3} */
|
||||
unsigned long core_id_bits = (cm_error >> 22) & 0xf;
|
||||
unsigned long vp_id_bits = (cm_error >> 18) & 0xf;
|
||||
unsigned long cmd_bits = (cm_error >> 14) & 0xf;
|
||||
unsigned long cmd_group_bits = (cm_error >> 11) & 0xf;
|
||||
unsigned long cm3_cca_bits = (cm_error >> 8) & 7;
|
||||
unsigned long mcp_bits = (cm_error >> 5) & 0xf;
|
||||
unsigned long cm3_tr_bits = (cm_error >> 1) & 0xf;
|
||||
unsigned long sched_bit = cm_error & 0x1;
|
||||
ulong core_id_bits, vp_id_bits, cmd_bits, cmd_group_bits;
|
||||
ulong cm3_cca_bits, mcp_bits, cm3_tr_bits, sched_bit;
|
||||
|
||||
cm_error = read64_gcr_error_cause();
|
||||
cm_addr = read64_gcr_error_addr();
|
||||
cm_other = read64_gcr_error_mult();
|
||||
cause = cm_error >> CM3_GCR_ERROR_CAUSE_ERRTYPE_SHF;
|
||||
ocause = cm_other >> CM_GCR_ERROR_MULT_ERR2ND_SHF;
|
||||
|
||||
if (!cause)
|
||||
return;
|
||||
|
||||
/* Used by cause == {1,2,3} */
|
||||
core_id_bits = (cm_error >> 22) & 0xf;
|
||||
vp_id_bits = (cm_error >> 18) & 0xf;
|
||||
cmd_bits = (cm_error >> 14) & 0xf;
|
||||
cmd_group_bits = (cm_error >> 11) & 0xf;
|
||||
cm3_cca_bits = (cm_error >> 8) & 7;
|
||||
mcp_bits = (cm_error >> 5) & 0xf;
|
||||
cm3_tr_bits = (cm_error >> 1) & 0xf;
|
||||
sched_bit = cm_error & 0x1;
|
||||
|
||||
if (cause == 1 || cause == 3) { /* Tag ECC */
|
||||
unsigned long tag_ecc = (cm_error >> 57) & 0x1;
|
||||
@ -363,12 +413,14 @@ void mips_cm_error_report(void)
|
||||
cm3_cmd_group[cmd_group_bits],
|
||||
cm3_cca_bits, 1 << mcp_bits,
|
||||
cm3_tr[cm3_tr_bits], sched_bit);
|
||||
} else {
|
||||
buf[0] = 0;
|
||||
}
|
||||
|
||||
pr_err("CM_ERROR=%llx %s <%s>\n", cm_error,
|
||||
cm3_causes[cause], buf);
|
||||
pr_err("CM_ADDR =%lx\n", cm_addr);
|
||||
pr_err("CM_OTHER=%lx %s\n", cm_other, cm3_causes[ocause]);
|
||||
pr_err("CM_ADDR =%llx\n", cm_addr);
|
||||
pr_err("CM_OTHER=%llx %s\n", cm_other, cm3_causes[ocause]);
|
||||
}
|
||||
|
||||
/* reprime cause register */
|
||||
|
@ -76,6 +76,12 @@ void mips_cpc_lock_other(unsigned int core)
|
||||
spin_lock_irqsave(&per_cpu(cpc_core_lock, curr_core),
|
||||
per_cpu(cpc_core_lock_flags, curr_core));
|
||||
write_cpc_cl_other(core << CPC_Cx_OTHER_CORENUM_SHF);
|
||||
|
||||
/*
|
||||
* Ensure the core-other region reflects the appropriate core &
|
||||
* VP before any accesses to it occur.
|
||||
*/
|
||||
mb();
|
||||
}
|
||||
|
||||
void mips_cpc_unlock_other(void)
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <asm/asm.h>
|
||||
#include <asm/branch.h>
|
||||
#include <asm/break.h>
|
||||
#include <asm/debug.h>
|
||||
#include <asm/fpu.h>
|
||||
#include <asm/fpu_emulator.h>
|
||||
#include <asm/inst.h>
|
||||
@ -2363,7 +2364,6 @@ static const struct file_operations mipsr2_clear_fops = {
|
||||
|
||||
static int __init mipsr2_init_debugfs(void)
|
||||
{
|
||||
extern struct dentry *mips_debugfs_dir;
|
||||
struct dentry *mipsr2_emul;
|
||||
|
||||
if (!mips_debugfs_dir)
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/debug.h>
|
||||
#include <asm/mipsregs.h>
|
||||
|
||||
static void build_segment_config(char *str, unsigned int cfg)
|
||||
@ -91,7 +92,6 @@ static const struct file_operations segments_fops = {
|
||||
|
||||
static int __init segments_info(void)
|
||||
{
|
||||
extern struct dentry *mips_debugfs_dir;
|
||||
struct dentry *segments;
|
||||
|
||||
if (cpu_has_segments) {
|
||||
|
@ -33,11 +33,16 @@
|
||||
#include <asm/cache.h>
|
||||
#include <asm/cdmm.h>
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/debug.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/smp-ops.h>
|
||||
#include <asm/prom.h>
|
||||
|
||||
#ifdef CONFIG_MIPS_ELF_APPENDED_DTB
|
||||
const char __section(.appended_dtb) __appended_dtb[0x100000];
|
||||
#endif /* CONFIG_MIPS_ELF_APPENDED_DTB */
|
||||
|
||||
struct cpuinfo_mips cpu_data[NR_CPUS] __read_mostly;
|
||||
|
||||
EXPORT_SYMBOL(cpu_data);
|
||||
@ -616,6 +621,10 @@ static void __init request_crashkernel(struct resource *res)
|
||||
}
|
||||
#endif /* !defined(CONFIG_KEXEC) */
|
||||
|
||||
#define USE_PROM_CMDLINE IS_ENABLED(CONFIG_MIPS_CMDLINE_FROM_BOOTLOADER)
|
||||
#define USE_DTB_CMDLINE IS_ENABLED(CONFIG_MIPS_CMDLINE_FROM_DTB)
|
||||
#define EXTEND_WITH_PROM IS_ENABLED(CONFIG_MIPS_CMDLINE_EXTEND)
|
||||
|
||||
static void __init arch_mem_init(char **cmdline_p)
|
||||
{
|
||||
struct memblock_region *reg;
|
||||
@ -640,18 +649,24 @@ static void __init arch_mem_init(char **cmdline_p)
|
||||
pr_info("Determined physical RAM map:\n");
|
||||
print_memory_map();
|
||||
|
||||
#ifdef CONFIG_CMDLINE_BOOL
|
||||
#ifdef CONFIG_CMDLINE_OVERRIDE
|
||||
#if defined(CONFIG_CMDLINE_BOOL) && defined(CONFIG_CMDLINE_OVERRIDE)
|
||||
strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
|
||||
#else
|
||||
if (builtin_cmdline[0]) {
|
||||
strlcat(arcs_cmdline, " ", COMMAND_LINE_SIZE);
|
||||
strlcat(arcs_cmdline, builtin_cmdline, COMMAND_LINE_SIZE);
|
||||
if ((USE_PROM_CMDLINE && arcs_cmdline[0]) ||
|
||||
(USE_DTB_CMDLINE && !boot_command_line[0]))
|
||||
strlcpy(boot_command_line, arcs_cmdline, COMMAND_LINE_SIZE);
|
||||
|
||||
if (EXTEND_WITH_PROM && arcs_cmdline[0]) {
|
||||
strlcat(boot_command_line, " ", COMMAND_LINE_SIZE);
|
||||
strlcat(boot_command_line, arcs_cmdline, COMMAND_LINE_SIZE);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_CMDLINE_BOOL)
|
||||
if (builtin_cmdline[0]) {
|
||||
strlcat(boot_command_line, " ", COMMAND_LINE_SIZE);
|
||||
strlcat(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
|
||||
}
|
||||
strlcpy(boot_command_line, arcs_cmdline, COMMAND_LINE_SIZE);
|
||||
#endif
|
||||
#else
|
||||
strlcpy(boot_command_line, arcs_cmdline, COMMAND_LINE_SIZE);
|
||||
#endif
|
||||
strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
|
||||
|
||||
|
@ -36,7 +36,6 @@
|
||||
#include <asm/ucontext.h>
|
||||
#include <asm/cpu-features.h>
|
||||
#include <asm/war.h>
|
||||
#include <asm/vdso.h>
|
||||
#include <asm/dsp.h>
|
||||
#include <asm/inst.h>
|
||||
#include <asm/msa.h>
|
||||
@ -752,16 +751,15 @@ static int setup_rt_frame(void *sig_return, struct ksignal *ksig,
|
||||
struct mips_abi mips_abi = {
|
||||
#ifdef CONFIG_TRAD_SIGNALS
|
||||
.setup_frame = setup_frame,
|
||||
.signal_return_offset = offsetof(struct mips_vdso, signal_trampoline),
|
||||
#endif
|
||||
.setup_rt_frame = setup_rt_frame,
|
||||
.rt_signal_return_offset =
|
||||
offsetof(struct mips_vdso, rt_signal_trampoline),
|
||||
.restart = __NR_restart_syscall,
|
||||
|
||||
.off_sc_fpregs = offsetof(struct sigcontext, sc_fpregs),
|
||||
.off_sc_fpc_csr = offsetof(struct sigcontext, sc_fpc_csr),
|
||||
.off_sc_used_math = offsetof(struct sigcontext, sc_used_math),
|
||||
|
||||
.vdso = &vdso_image,
|
||||
};
|
||||
|
||||
static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
|
||||
@ -801,11 +799,11 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
|
||||
}
|
||||
|
||||
if (sig_uses_siginfo(&ksig->ka))
|
||||
ret = abi->setup_rt_frame(vdso + abi->rt_signal_return_offset,
|
||||
ret = abi->setup_rt_frame(vdso + abi->vdso->off_rt_sigreturn,
|
||||
ksig, regs, oldset);
|
||||
else
|
||||
ret = abi->setup_frame(vdso + abi->signal_return_offset, ksig,
|
||||
regs, oldset);
|
||||
ret = abi->setup_frame(vdso + abi->vdso->off_sigreturn,
|
||||
ksig, regs, oldset);
|
||||
|
||||
signal_setup_done(ret, ksig, 0);
|
||||
}
|
||||
|
@ -31,7 +31,6 @@
|
||||
#include <asm/ucontext.h>
|
||||
#include <asm/fpu.h>
|
||||
#include <asm/war.h>
|
||||
#include <asm/vdso.h>
|
||||
#include <asm/dsp.h>
|
||||
|
||||
#include "signal-common.h"
|
||||
@ -406,14 +405,12 @@ static int setup_rt_frame_32(void *sig_return, struct ksignal *ksig,
|
||||
*/
|
||||
struct mips_abi mips_abi_32 = {
|
||||
.setup_frame = setup_frame_32,
|
||||
.signal_return_offset =
|
||||
offsetof(struct mips_vdso, o32_signal_trampoline),
|
||||
.setup_rt_frame = setup_rt_frame_32,
|
||||
.rt_signal_return_offset =
|
||||
offsetof(struct mips_vdso, o32_rt_signal_trampoline),
|
||||
.restart = __NR_O32_restart_syscall,
|
||||
|
||||
.off_sc_fpregs = offsetof(struct sigcontext32, sc_fpregs),
|
||||
.off_sc_fpc_csr = offsetof(struct sigcontext32, sc_fpc_csr),
|
||||
.off_sc_used_math = offsetof(struct sigcontext32, sc_used_math),
|
||||
|
||||
.vdso = &vdso_image_o32,
|
||||
};
|
||||
|
@ -38,7 +38,6 @@
|
||||
#include <asm/fpu.h>
|
||||
#include <asm/cpu-features.h>
|
||||
#include <asm/war.h>
|
||||
#include <asm/vdso.h>
|
||||
|
||||
#include "signal-common.h"
|
||||
|
||||
@ -151,11 +150,11 @@ static int setup_rt_frame_n32(void *sig_return, struct ksignal *ksig,
|
||||
|
||||
struct mips_abi mips_abi_n32 = {
|
||||
.setup_rt_frame = setup_rt_frame_n32,
|
||||
.rt_signal_return_offset =
|
||||
offsetof(struct mips_vdso, n32_rt_signal_trampoline),
|
||||
.restart = __NR_N32_restart_syscall,
|
||||
|
||||
.off_sc_fpregs = offsetof(struct sigcontext, sc_fpregs),
|
||||
.off_sc_fpc_csr = offsetof(struct sigcontext, sc_fpc_csr),
|
||||
.off_sc_used_math = offsetof(struct sigcontext, sc_used_math),
|
||||
|
||||
.vdso = &vdso_image_n32,
|
||||
};
|
||||
|
@ -8,6 +8,7 @@
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/irqchip/mips-gic.h>
|
||||
#include <linux/sched.h>
|
||||
@ -37,8 +38,9 @@ static unsigned core_vpe_count(unsigned core)
|
||||
if (!config_enabled(CONFIG_MIPS_MT_SMP) || !cpu_has_mipsmt)
|
||||
return 1;
|
||||
|
||||
write_gcr_cl_other(core << CM_GCR_Cx_OTHER_CORENUM_SHF);
|
||||
mips_cm_lock_other(core, 0);
|
||||
cfg = read_gcr_co_config() & CM_GCR_Cx_CONFIG_PVPE_MSK;
|
||||
mips_cm_unlock_other();
|
||||
return (cfg >> CM_GCR_Cx_CONFIG_PVPE_SHF) + 1;
|
||||
}
|
||||
|
||||
@ -133,11 +135,9 @@ static void __init cps_prepare_cpus(unsigned int max_cpus)
|
||||
/*
|
||||
* Patch the start of mips_cps_core_entry to provide:
|
||||
*
|
||||
* v1 = CM base address
|
||||
* s0 = kseg0 CCA
|
||||
*/
|
||||
entry_code = (u32 *)&mips_cps_core_entry;
|
||||
UASM_i_LA(&entry_code, 3, (long)mips_cm_base);
|
||||
uasm_i_addiu(&entry_code, 16, 0, cca);
|
||||
blast_dcache_range((unsigned long)&mips_cps_core_entry,
|
||||
(unsigned long)entry_code);
|
||||
@ -190,10 +190,11 @@ err_out:
|
||||
|
||||
static void boot_core(unsigned core)
|
||||
{
|
||||
u32 access;
|
||||
u32 access, stat, seq_state;
|
||||
unsigned timeout;
|
||||
|
||||
/* Select the appropriate core */
|
||||
write_gcr_cl_other(core << CM_GCR_Cx_OTHER_CORENUM_SHF);
|
||||
mips_cm_lock_other(core, 0);
|
||||
|
||||
/* Set its reset vector */
|
||||
write_gcr_co_reset_base(CKSEG1ADDR((unsigned long)mips_cps_core_entry));
|
||||
@ -210,12 +211,36 @@ static void boot_core(unsigned core)
|
||||
/* Reset the core */
|
||||
mips_cpc_lock_other(core);
|
||||
write_cpc_co_cmd(CPC_Cx_CMD_RESET);
|
||||
|
||||
timeout = 100;
|
||||
while (true) {
|
||||
stat = read_cpc_co_stat_conf();
|
||||
seq_state = stat & CPC_Cx_STAT_CONF_SEQSTATE_MSK;
|
||||
|
||||
/* U6 == coherent execution, ie. the core is up */
|
||||
if (seq_state == CPC_Cx_STAT_CONF_SEQSTATE_U6)
|
||||
break;
|
||||
|
||||
/* Delay a little while before we start warning */
|
||||
if (timeout) {
|
||||
timeout--;
|
||||
mdelay(10);
|
||||
continue;
|
||||
}
|
||||
|
||||
pr_warn("Waiting for core %u to start... STAT_CONF=0x%x\n",
|
||||
core, stat);
|
||||
mdelay(1000);
|
||||
}
|
||||
|
||||
mips_cpc_unlock_other();
|
||||
} else {
|
||||
/* Take the core out of reset */
|
||||
write_gcr_co_reset_release(0);
|
||||
}
|
||||
|
||||
mips_cm_unlock_other();
|
||||
|
||||
/* The core is now powered up */
|
||||
bitmap_set(core_power, core, 1);
|
||||
}
|
||||
|
@ -46,9 +46,11 @@ void gic_send_ipi_single(int cpu, unsigned int action)
|
||||
|
||||
if (mips_cpc_present() && (core != current_cpu_data.core)) {
|
||||
while (!cpumask_test_cpu(cpu, &cpu_coherent_mask)) {
|
||||
mips_cm_lock_other(core, 0);
|
||||
mips_cpc_lock_other(core);
|
||||
write_cpc_co_cmd(CPC_Cx_CMD_PWRUP);
|
||||
mips_cpc_unlock_other();
|
||||
mips_cm_unlock_other();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include <asm/debug.h>
|
||||
|
||||
static int ss_get(void *data, u64 *val)
|
||||
{
|
||||
@ -115,8 +115,6 @@ static int multi_get(void *data, u64 *val)
|
||||
|
||||
DEFINE_SIMPLE_ATTRIBUTE(fops_multi, multi_get, NULL, "%llu\n");
|
||||
|
||||
|
||||
extern struct dentry *mips_debugfs_dir;
|
||||
static int __init spinlock_test(void)
|
||||
{
|
||||
struct dentry *d;
|
||||
|
@ -12,14 +12,15 @@
|
||||
* Save stack-backtrace addresses into a stack_trace buffer:
|
||||
*/
|
||||
static void save_raw_context_stack(struct stack_trace *trace,
|
||||
unsigned long reg29)
|
||||
unsigned long reg29, int savesched)
|
||||
{
|
||||
unsigned long *sp = (unsigned long *)reg29;
|
||||
unsigned long addr;
|
||||
|
||||
while (!kstack_end(sp)) {
|
||||
addr = *sp++;
|
||||
if (__kernel_text_address(addr)) {
|
||||
if (__kernel_text_address(addr) &&
|
||||
(savesched || !in_sched_functions(addr))) {
|
||||
if (trace->skip > 0)
|
||||
trace->skip--;
|
||||
else
|
||||
@ -31,7 +32,7 @@ static void save_raw_context_stack(struct stack_trace *trace,
|
||||
}
|
||||
|
||||
static void save_context_stack(struct stack_trace *trace,
|
||||
struct task_struct *tsk, struct pt_regs *regs)
|
||||
struct task_struct *tsk, struct pt_regs *regs, int savesched)
|
||||
{
|
||||
unsigned long sp = regs->regs[29];
|
||||
#ifdef CONFIG_KALLSYMS
|
||||
@ -43,20 +44,22 @@ static void save_context_stack(struct stack_trace *trace,
|
||||
(unsigned long)task_stack_page(tsk);
|
||||
if (stack_page && sp >= stack_page &&
|
||||
sp <= stack_page + THREAD_SIZE - 32)
|
||||
save_raw_context_stack(trace, sp);
|
||||
save_raw_context_stack(trace, sp, savesched);
|
||||
return;
|
||||
}
|
||||
do {
|
||||
if (trace->skip > 0)
|
||||
trace->skip--;
|
||||
else
|
||||
trace->entries[trace->nr_entries++] = pc;
|
||||
if (trace->nr_entries >= trace->max_entries)
|
||||
break;
|
||||
if (savesched || !in_sched_functions(pc)) {
|
||||
if (trace->skip > 0)
|
||||
trace->skip--;
|
||||
else
|
||||
trace->entries[trace->nr_entries++] = pc;
|
||||
if (trace->nr_entries >= trace->max_entries)
|
||||
break;
|
||||
}
|
||||
pc = unwind_stack(tsk, &sp, pc, &ra);
|
||||
} while (pc);
|
||||
#else
|
||||
save_raw_context_stack(trace, sp);
|
||||
save_raw_context_stack(trace, sp, savesched);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -82,6 +85,6 @@ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
|
||||
regs->cp0_epc = tsk->thread.reg31;
|
||||
} else
|
||||
prepare_frametrace(regs);
|
||||
save_context_stack(trace, tsk, regs);
|
||||
save_context_stack(trace, tsk, regs, tsk == current);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(save_stack_trace_tsk);
|
||||
|
@ -37,6 +37,7 @@
|
||||
#include <linux/irq.h>
|
||||
#include <linux/perf_event.h>
|
||||
|
||||
#include <asm/addrspace.h>
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/branch.h>
|
||||
#include <asm/break.h>
|
||||
@ -1856,12 +1857,14 @@ void __noreturn nmi_exception_handler(struct pt_regs *regs)
|
||||
{
|
||||
char str[100];
|
||||
|
||||
nmi_enter();
|
||||
raw_notifier_call_chain(&nmi_chain, 0, regs);
|
||||
bust_spinlocks(1);
|
||||
snprintf(str, 100, "CPU%d NMI taken, CP0_EPC=%lx\n",
|
||||
smp_processor_id(), regs->cp0_epc);
|
||||
regs->cp0_epc = read_c0_errorepc();
|
||||
die(str, regs);
|
||||
nmi_exit();
|
||||
}
|
||||
|
||||
#define VECTORSPACING 0x100 /* for EI/VI mode */
|
||||
@ -2204,12 +2207,8 @@ void __init trap_init(void)
|
||||
ebase = (unsigned long)
|
||||
__alloc_bootmem(size, 1 << fls(size), 0);
|
||||
} else {
|
||||
#ifdef CONFIG_KVM_GUEST
|
||||
#define KVM_GUEST_KSEG0 0x40000000
|
||||
ebase = KVM_GUEST_KSEG0;
|
||||
#else
|
||||
ebase = CKSEG0;
|
||||
#endif
|
||||
ebase = CAC_BASE;
|
||||
|
||||
if (cpu_has_mips_r2_r6)
|
||||
ebase += (read_c0_ebase() & 0x3ffff000);
|
||||
}
|
||||
|
@ -85,6 +85,7 @@
|
||||
#include <asm/branch.h>
|
||||
#include <asm/byteorder.h>
|
||||
#include <asm/cop2.h>
|
||||
#include <asm/debug.h>
|
||||
#include <asm/fpu.h>
|
||||
#include <asm/fpu_emulator.h>
|
||||
#include <asm/inst.h>
|
||||
@ -2295,7 +2296,6 @@ sigbus:
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
extern struct dentry *mips_debugfs_dir;
|
||||
static int __init debugfs_unaligned(void)
|
||||
{
|
||||
struct dentry *d;
|
||||
|
@ -1,122 +1,175 @@
|
||||
/*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
* Copyright (C) 2015 Imagination Technologies
|
||||
* Author: Alex Smith <alex.smith@imgtec.com>
|
||||
*
|
||||
* Copyright (C) 2009, 2010 Cavium Networks, Inc.
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/binfmts.h>
|
||||
#include <linux/elf.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/unistd.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/irqchip/mips-gic.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/timekeeper_internal.h>
|
||||
|
||||
#include <asm/abi.h>
|
||||
#include <asm/vdso.h>
|
||||
#include <asm/uasm.h>
|
||||
#include <asm/processor.h>
|
||||
|
||||
/* Kernel-provided data used by the VDSO. */
|
||||
static union mips_vdso_data vdso_data __page_aligned_data;
|
||||
|
||||
/*
|
||||
* Including <asm/unistd.h> would give use the 64-bit syscall numbers ...
|
||||
* Mapping for the VDSO data/GIC pages. The real pages are mapped manually, as
|
||||
* what we map and where within the area they are mapped is determined at
|
||||
* runtime.
|
||||
*/
|
||||
#define __NR_O32_sigreturn 4119
|
||||
#define __NR_O32_rt_sigreturn 4193
|
||||
#define __NR_N32_rt_sigreturn 6211
|
||||
static struct page *no_pages[] = { NULL };
|
||||
static struct vm_special_mapping vdso_vvar_mapping = {
|
||||
.name = "[vvar]",
|
||||
.pages = no_pages,
|
||||
};
|
||||
|
||||
static struct page *vdso_page;
|
||||
|
||||
static void __init install_trampoline(u32 *tramp, unsigned int sigreturn)
|
||||
static void __init init_vdso_image(struct mips_vdso_image *image)
|
||||
{
|
||||
uasm_i_addiu(&tramp, 2, 0, sigreturn); /* li v0, sigreturn */
|
||||
uasm_i_syscall(&tramp, 0);
|
||||
unsigned long num_pages, i;
|
||||
|
||||
BUG_ON(!PAGE_ALIGNED(image->data));
|
||||
BUG_ON(!PAGE_ALIGNED(image->size));
|
||||
|
||||
num_pages = image->size / PAGE_SIZE;
|
||||
|
||||
for (i = 0; i < num_pages; i++) {
|
||||
image->mapping.pages[i] =
|
||||
virt_to_page(image->data + (i * PAGE_SIZE));
|
||||
}
|
||||
}
|
||||
|
||||
static int __init init_vdso(void)
|
||||
{
|
||||
struct mips_vdso *vdso;
|
||||
init_vdso_image(&vdso_image);
|
||||
|
||||
vdso_page = alloc_page(GFP_KERNEL);
|
||||
if (!vdso_page)
|
||||
panic("Cannot allocate vdso");
|
||||
|
||||
vdso = vmap(&vdso_page, 1, 0, PAGE_KERNEL);
|
||||
if (!vdso)
|
||||
panic("Cannot map vdso");
|
||||
clear_page(vdso);
|
||||
|
||||
install_trampoline(vdso->rt_signal_trampoline, __NR_rt_sigreturn);
|
||||
#ifdef CONFIG_32BIT
|
||||
install_trampoline(vdso->signal_trampoline, __NR_sigreturn);
|
||||
#else
|
||||
install_trampoline(vdso->n32_rt_signal_trampoline,
|
||||
__NR_N32_rt_sigreturn);
|
||||
install_trampoline(vdso->o32_signal_trampoline, __NR_O32_sigreturn);
|
||||
install_trampoline(vdso->o32_rt_signal_trampoline,
|
||||
__NR_O32_rt_sigreturn);
|
||||
#ifdef CONFIG_MIPS32_O32
|
||||
init_vdso_image(&vdso_image_o32);
|
||||
#endif
|
||||
|
||||
vunmap(vdso);
|
||||
#ifdef CONFIG_MIPS32_N32
|
||||
init_vdso_image(&vdso_image_n32);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
subsys_initcall(init_vdso);
|
||||
|
||||
static unsigned long vdso_addr(unsigned long start)
|
||||
void update_vsyscall(struct timekeeper *tk)
|
||||
{
|
||||
unsigned long offset = 0UL;
|
||||
vdso_data_write_begin(&vdso_data);
|
||||
|
||||
if (current->flags & PF_RANDOMIZE) {
|
||||
offset = get_random_int();
|
||||
offset <<= PAGE_SHIFT;
|
||||
if (TASK_IS_32BIT_ADDR)
|
||||
offset &= 0xfffffful;
|
||||
else
|
||||
offset &= 0xffffffful;
|
||||
vdso_data.xtime_sec = tk->xtime_sec;
|
||||
vdso_data.xtime_nsec = tk->tkr_mono.xtime_nsec;
|
||||
vdso_data.wall_to_mono_sec = tk->wall_to_monotonic.tv_sec;
|
||||
vdso_data.wall_to_mono_nsec = tk->wall_to_monotonic.tv_nsec;
|
||||
vdso_data.cs_shift = tk->tkr_mono.shift;
|
||||
|
||||
vdso_data.clock_mode = tk->tkr_mono.clock->archdata.vdso_clock_mode;
|
||||
if (vdso_data.clock_mode != VDSO_CLOCK_NONE) {
|
||||
vdso_data.cs_mult = tk->tkr_mono.mult;
|
||||
vdso_data.cs_cycle_last = tk->tkr_mono.cycle_last;
|
||||
vdso_data.cs_mask = tk->tkr_mono.mask;
|
||||
}
|
||||
|
||||
return STACK_TOP + offset;
|
||||
vdso_data_write_end(&vdso_data);
|
||||
}
|
||||
|
||||
void update_vsyscall_tz(void)
|
||||
{
|
||||
if (vdso_data.clock_mode != VDSO_CLOCK_NONE) {
|
||||
vdso_data.tz_minuteswest = sys_tz.tz_minuteswest;
|
||||
vdso_data.tz_dsttime = sys_tz.tz_dsttime;
|
||||
}
|
||||
}
|
||||
|
||||
int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
|
||||
{
|
||||
int ret;
|
||||
unsigned long addr;
|
||||
struct mips_vdso_image *image = current->thread.abi->vdso;
|
||||
struct mm_struct *mm = current->mm;
|
||||
unsigned long gic_size, vvar_size, size, base, data_addr, vdso_addr;
|
||||
struct vm_area_struct *vma;
|
||||
struct resource gic_res;
|
||||
int ret;
|
||||
|
||||
down_write(&mm->mmap_sem);
|
||||
|
||||
addr = vdso_addr(mm->start_stack);
|
||||
/*
|
||||
* Determine total area size. This includes the VDSO data itself, the
|
||||
* data page, and the GIC user page if present. Always create a mapping
|
||||
* for the GIC user area if the GIC is present regardless of whether it
|
||||
* is the current clocksource, in case it comes into use later on. We
|
||||
* only map a page even though the total area is 64K, as we only need
|
||||
* the counter registers at the start.
|
||||
*/
|
||||
gic_size = gic_present ? PAGE_SIZE : 0;
|
||||
vvar_size = gic_size + PAGE_SIZE;
|
||||
size = vvar_size + image->size;
|
||||
|
||||
addr = get_unmapped_area(NULL, addr, PAGE_SIZE, 0, 0);
|
||||
if (IS_ERR_VALUE(addr)) {
|
||||
ret = addr;
|
||||
goto up_fail;
|
||||
base = get_unmapped_area(NULL, 0, size, 0, 0);
|
||||
if (IS_ERR_VALUE(base)) {
|
||||
ret = base;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = install_special_mapping(mm, addr, PAGE_SIZE,
|
||||
VM_READ|VM_EXEC|
|
||||
VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC,
|
||||
&vdso_page);
|
||||
data_addr = base + gic_size;
|
||||
vdso_addr = data_addr + PAGE_SIZE;
|
||||
|
||||
vma = _install_special_mapping(mm, base, vvar_size,
|
||||
VM_READ | VM_MAYREAD,
|
||||
&vdso_vvar_mapping);
|
||||
if (IS_ERR(vma)) {
|
||||
ret = PTR_ERR(vma);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Map GIC user page. */
|
||||
if (gic_size) {
|
||||
ret = gic_get_usm_range(&gic_res);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = io_remap_pfn_range(vma, base,
|
||||
gic_res.start >> PAGE_SHIFT,
|
||||
gic_size,
|
||||
pgprot_noncached(PAGE_READONLY));
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Map data page. */
|
||||
ret = remap_pfn_range(vma, data_addr,
|
||||
virt_to_phys(&vdso_data) >> PAGE_SHIFT,
|
||||
PAGE_SIZE, PAGE_READONLY);
|
||||
if (ret)
|
||||
goto up_fail;
|
||||
goto out;
|
||||
|
||||
mm->context.vdso = (void *)addr;
|
||||
/* Map VDSO image. */
|
||||
vma = _install_special_mapping(mm, vdso_addr, image->size,
|
||||
VM_READ | VM_EXEC |
|
||||
VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC,
|
||||
&image->mapping);
|
||||
if (IS_ERR(vma)) {
|
||||
ret = PTR_ERR(vma);
|
||||
goto out;
|
||||
}
|
||||
|
||||
up_fail:
|
||||
mm->context.vdso = (void *)vdso_addr;
|
||||
ret = 0;
|
||||
|
||||
out:
|
||||
up_write(&mm->mmap_sem);
|
||||
return ret;
|
||||
}
|
||||
|
||||
const char *arch_vma_name(struct vm_area_struct *vma)
|
||||
{
|
||||
if (vma->vm_mm && vma->vm_start == (long)vma->vm_mm->context.vdso)
|
||||
return "[vdso]";
|
||||
return NULL;
|
||||
}
|
||||
|
@ -17,7 +17,9 @@ OUTPUT_ARCH(mips)
|
||||
ENTRY(kernel_entry)
|
||||
PHDRS {
|
||||
text PT_LOAD FLAGS(7); /* RWX */
|
||||
#ifndef CONFIG_CAVIUM_OCTEON_SOC
|
||||
note PT_NOTE FLAGS(4); /* R__ */
|
||||
#endif /* CAVIUM_OCTEON_SOC */
|
||||
}
|
||||
|
||||
#ifdef CONFIG_32BIT
|
||||
@ -71,7 +73,12 @@ SECTIONS
|
||||
__stop___dbe_table = .;
|
||||
}
|
||||
|
||||
NOTES :text :note
|
||||
#ifdef CONFIG_CAVIUM_OCTEON_SOC
|
||||
#define NOTES_HEADER
|
||||
#else /* CONFIG_CAVIUM_OCTEON_SOC */
|
||||
#define NOTES_HEADER :note
|
||||
#endif /* CONFIG_CAVIUM_OCTEON_SOC */
|
||||
NOTES :text NOTES_HEADER
|
||||
.dummy : { *(.dummy) } :text
|
||||
|
||||
_sdata = .; /* Start of data section */
|
||||
@ -132,6 +139,11 @@ SECTIONS
|
||||
__appended_dtb = .;
|
||||
/* leave space for appended DTB */
|
||||
. += 0x100000;
|
||||
#elif defined(CONFIG_MIPS_ELF_APPENDED_DTB)
|
||||
.appended_dtb : AT(ADDR(.appended_dtb) - LOAD_OFFSET) {
|
||||
*(.appended_dtb)
|
||||
KEEP(*(.appended_dtb))
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
* Align to 64K in attempt to eliminate holes before the
|
||||
@ -181,6 +193,7 @@ SECTIONS
|
||||
DISCARDS
|
||||
/DISCARD/ : {
|
||||
/* ABI crap starts here */
|
||||
*(.MIPS.abiflags)
|
||||
*(.MIPS.options)
|
||||
*(.options)
|
||||
*(.pdr)
|
||||
|
@ -36,14 +36,6 @@
|
||||
#define PT_HOST_USERLOCAL PT_EPC
|
||||
|
||||
#define CP0_DDATA_LO $28,3
|
||||
#define CP0_CONFIG3 $16,3
|
||||
#define CP0_CONFIG5 $16,5
|
||||
#define CP0_EBASE $15,1
|
||||
|
||||
#define CP0_INTCTL $12,1
|
||||
#define CP0_SRSCTL $12,2
|
||||
#define CP0_SRSMAP $12,3
|
||||
#define CP0_HWRENA $7,0
|
||||
|
||||
/* Resume Flags */
|
||||
#define RESUME_FLAG_HOST (1<<1) /* Resume host? */
|
||||
|
@ -99,6 +99,23 @@ int clk_set_rate(struct clk *clk, unsigned long rate)
|
||||
}
|
||||
EXPORT_SYMBOL(clk_set_rate);
|
||||
|
||||
long clk_round_rate(struct clk *clk, unsigned long rate)
|
||||
{
|
||||
if (unlikely(!clk_good(clk)))
|
||||
return 0;
|
||||
if (clk->rates && *clk->rates) {
|
||||
unsigned long *r = clk->rates;
|
||||
|
||||
while (*r && (*r != rate))
|
||||
r++;
|
||||
if (!*r) {
|
||||
return clk->rate;
|
||||
}
|
||||
}
|
||||
return rate;
|
||||
}
|
||||
EXPORT_SYMBOL(clk_round_rate);
|
||||
|
||||
int clk_enable(struct clk *clk)
|
||||
{
|
||||
if (unlikely(!clk_good(clk)))
|
||||
|
@ -31,13 +31,18 @@
|
||||
#define CLOCK_240M 240000000
|
||||
#define CLOCK_250M 250000000
|
||||
#define CLOCK_266M 266666666
|
||||
#define CLOCK_288M 288888888
|
||||
#define CLOCK_300M 300000000
|
||||
#define CLOCK_333M 333333333
|
||||
#define CLOCK_360M 360000000
|
||||
#define CLOCK_393M 393215332
|
||||
#define CLOCK_400M 400000000
|
||||
#define CLOCK_432M 432000000
|
||||
#define CLOCK_450M 450000000
|
||||
#define CLOCK_500M 500000000
|
||||
#define CLOCK_600M 600000000
|
||||
#define CLOCK_666M 666666666
|
||||
#define CLOCK_720M 720000000
|
||||
|
||||
/* clock out speeds */
|
||||
#define CLOCK_32_768K 32768
|
||||
@ -80,4 +85,12 @@ extern unsigned long ltq_vr9_cpu_hz(void);
|
||||
extern unsigned long ltq_vr9_fpi_hz(void);
|
||||
extern unsigned long ltq_vr9_pp32_hz(void);
|
||||
|
||||
extern unsigned long ltq_ar10_cpu_hz(void);
|
||||
extern unsigned long ltq_ar10_fpi_hz(void);
|
||||
extern unsigned long ltq_ar10_pp32_hz(void);
|
||||
|
||||
extern unsigned long ltq_grx390_cpu_hz(void);
|
||||
extern unsigned long ltq_grx390_fpi_hz(void);
|
||||
extern unsigned long ltq_grx390_pp32_hz(void);
|
||||
|
||||
#endif
|
||||
|
@ -369,8 +369,8 @@ int __init icu_of_init(struct device_node *node, struct device_node *parent)
|
||||
if (of_address_to_resource(node, i, &res))
|
||||
panic("Failed to get icu memory range");
|
||||
|
||||
if (request_mem_region(res.start, resource_size(&res),
|
||||
res.name) < 0)
|
||||
if (!request_mem_region(res.start, resource_size(&res),
|
||||
res.name))
|
||||
pr_err("Failed to request icu memory");
|
||||
|
||||
ltq_icu_membase[i] = ioremap_nocache(res.start,
|
||||
@ -449,8 +449,8 @@ int __init icu_of_init(struct device_node *node, struct device_node *parent)
|
||||
if (ret != exin_avail)
|
||||
panic("failed to load external irq resources");
|
||||
|
||||
if (request_mem_region(res.start, resource_size(&res),
|
||||
res.name) < 0)
|
||||
if (!request_mem_region(res.start, resource_size(&res),
|
||||
res.name))
|
||||
pr_err("Failed to request eiu memory");
|
||||
|
||||
ltq_eiu_membase = ioremap_nocache(res.start,
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user