Merge tag 'mips_4.11' of git://git.kernel.org/pub/scm/linux/kernel/git/jhogan/mips
Pull MIPS updates from James Hogan: "Here's the main MIPS pull request for 4.11. It contains a few new features such as IRQ stacks, cacheinfo support, and KASLR for Octeon CPUs, and a variety of smaller improvements and fixes including devicetree additions, kexec cleanups, microMIPS stack unwinding fixes, and a bunch of build fixes to clean up continuous integration builds. Its all been in linux-next for at least a couple of days, most of it far longer. Miscellaneous: - Add IRQ stacks - Add cacheinfo support - Add "uzImage.bin" zboot target - Unify performance counter definitions - Export various (mainly assembly) symbols alongside their definitions - Audit and remove unnecessary uses of module.h kexec & kdump: - Lots of improvements and fixes - Add correct copy_regs implementations - Add debug logging of new kernel information Security: - Use Makefile.postlink to insert relocations into vmlinux - Provide plat_post_relocation hook (used for Octeon KASLR) - Add support for tuning mmap randomisation - Relocate DTB microMIPS: - A load of unwind fixes - Add some missing .insn to fix link errors MIPSr6: - Fix MULTU/MADDU/MSUBU sign extension in r2 emulation - Remove r2_emul_return and use ERETNC unconditionally on MIPSr6 - Allow pre-r6 emulation on SMP MIPSr6 kernels Cache management: - Treat physically indexed dcache as non-aliasing - Add return errors to protected cache ops for KVM - CM3: Ensure L1 & L2 cache ECC checking matches - CM3: Indicate inclusive caches - I6400: Treat dcache as physically indexed Memory management: - Ensure bootmem doesn't corrupt reserved memory - Export some TLB exception generation functions for KVM OF: - NULL check initial_boot_params before use in of_scan_flat_dt() - Fix unaligned access in of_alias_scan() SMP: - CPS: Don't BUG if a CPU fails to start Other fixes: - Fix longstanding 64-bit IP checksum carry bug - Fix KERN_CONT fallout in cpu-bugs64.c and sync-r4k.c - Update defconfigs for NF_CT_PROTO_DCCP, DPLITE, CPU_FREQ_STAT,SCSI_DH changes - Disable certain builtin compiler options, stack-check (whole kernel), asynchronous-unwind-tables (VDSO). - A bunch of build fixes from kernelci.org testing - Various other minor cleanups & corrections BMIPS: - Migrate interrupts during bmips_cpu_disable - BCM47xx: Add Luxul devices - BCM47xx: Fix Asus WL-500W button inversion - BCM7xxx: Add SPI device nodes Generic (multiplatform): - Add kexec DTB passing - Fix big endian - Add cpp_its_S in ksym_dep_filter to silence build warning IP22: - Reformat inline assembler code to modern standards - Fix binutils 2.25 build error IP27: - Fix duplicate CAC_BASE definition build error - Disable qlge driver to workaround broken compiler Lantiq: - Refresh defconfig and activate more drivers - Lock DMA register access - Fix cascading IRQ setup - Fix build of VPE loader - xway: Fix ethernet packet header corruption over reboot Loongson1 - Add watchdog support - 1B: Reduce DEFAULT_MEMSIZE to 64MB - 1B: Change OSC clock name to match rest of kernel - 1C: Remove ARCH_WANT_OPTIONAL_GPIOLIB Octeon: - Add KASLR support - Support Octeon III USB controller - Fix large copy_from_user corner case - Enable devtmpfs in defconfig Netlogic: - Fix non-default XLR build error due to netlogic,xlp-pic code - Fix assembler warning from smpboot.S pic32mzda: - Fix linker error when early printk is disabled Pistachio: - Add base device tree - Add Ci40 "Marduk" device tree Ralink: - Support raw appended DTB - Add missing I2C & I2S clocks - Add missing pinmux and fix pinmux function name typo - Add missing clk_round_rate() - Clean up prom_init() - MT7621: Set SoC type - MT7621: Support highmem TXx9: - Modernize printing of kernel messages and resolve KERN_CONT fallout - 7segled: use permission-specific DEVICE_ATTR variants XilFPGA: - Add IRQ controller and UART IRQ - Add AXI I2C and emaclite to DT & defconfig" * tag 'mips_4.11' of git://git.kernel.org/pub/scm/linux/kernel/git/jhogan/mips: (148 commits) MIPS: VDSO: Explicitly use -fno-asynchronous-unwind-tables MIPS: BCM47XX: Fix button inversion for Asus WL-500W MIPS: DTS: Add img directory to Makefile MIPS: ip27: Disable qlge driver in defconfig MIPS: pic32mzda: Fix linker error for pic32_get_pbclk() MIPS: Lantiq: Keep ethernet enabled during boot MIPS: OCTEON: Fix copy_from_user fault handling for large buffers MIPS: Fix special case in 64 bit IP checksumming. MIPS: OCTEON: Enable DEVTMPFS MIPS: lantiq: Set physical_memsize MIPS: sysmips: Remove duplicated include from syscall.c Kbuild: Add cpp_its_S in ksym_dep_filter MIPS: Audit and remove any unnecessary uses of module.h MIPS: Unify perf counter register definitions MIPS: Disable stack checks on MIPS kernels MIPS: OCTEON: Platform support for OCTEON III USB controller MIPS: Lantiq: Fix cascaded IRQ setup MIPS: sync-r4k: Fix KERN_CONT fallout MIPS: IRQ Stack: Fix erroneous jal to plat_irq_dispatch MIPS: Fix distclean with Makefile.postlink ...
This commit is contained in:
@@ -4,6 +4,7 @@ generic-y += clkdev.h
|
||||
generic-y += current.h
|
||||
generic-y += dma-contiguous.h
|
||||
generic-y += emergency-restart.h
|
||||
generic-y += export.h
|
||||
generic-y += irq_work.h
|
||||
generic-y += local64.h
|
||||
generic-y += mcs_spinlock.h
|
||||
@@ -15,6 +16,7 @@ generic-y += sections.h
|
||||
generic-y += segment.h
|
||||
generic-y += serial.h
|
||||
generic-y += trace_clock.h
|
||||
generic-y += unaligned.h
|
||||
generic-y += user.h
|
||||
generic-y += word-at-a-time.h
|
||||
generic-y += xor.h
|
||||
|
5
arch/mips/include/asm/asm-prototypes.h
Normal file
5
arch/mips/include/asm/asm-prototypes.h
Normal file
@@ -0,0 +1,5 @@
|
||||
#include <asm/checksum.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/fpu.h>
|
||||
#include <asm-generic/asm-prototypes.h>
|
||||
#include <asm/uaccess.h>
|
@@ -54,7 +54,8 @@
|
||||
.align 2; \
|
||||
.type symbol, @function; \
|
||||
.ent symbol, 0; \
|
||||
symbol: .frame sp, 0, ra
|
||||
symbol: .frame sp, 0, ra; \
|
||||
.insn
|
||||
|
||||
/*
|
||||
* NESTED - declare nested routine entry point
|
||||
@@ -63,8 +64,9 @@ symbol: .frame sp, 0, ra
|
||||
.globl symbol; \
|
||||
.align 2; \
|
||||
.type symbol, @function; \
|
||||
.ent symbol, 0; \
|
||||
symbol: .frame sp, framesize, rpc
|
||||
.ent symbol, 0; \
|
||||
symbol: .frame sp, framesize, rpc; \
|
||||
.insn
|
||||
|
||||
/*
|
||||
* END - mark end of function
|
||||
@@ -86,7 +88,7 @@ symbol:
|
||||
#define FEXPORT(symbol) \
|
||||
.globl symbol; \
|
||||
.type symbol, @function; \
|
||||
symbol:
|
||||
symbol: .insn
|
||||
|
||||
/*
|
||||
* ABS - export absolute symbol
|
||||
|
@@ -164,6 +164,19 @@ static inline void plat_swiotlb_setup(void) {}
|
||||
* Return: Pointer to the flattened device tree blob.
|
||||
*/
|
||||
extern void *plat_get_fdt(void);
|
||||
|
||||
#ifdef CONFIG_RELOCATABLE
|
||||
|
||||
/**
|
||||
* plat_fdt_relocated() - Update platform's information about relocated dtb
|
||||
*
|
||||
* This function provides a platform-independent API to set platform's
|
||||
* information about relocated DTB if it needs to be moved due to kernel
|
||||
* relocation occurring at boot.
|
||||
*/
|
||||
void plat_fdt_relocated(void *new_location);
|
||||
|
||||
#endif /* CONFIG_RELOCATABLE */
|
||||
#endif /* CONFIG_USE_OF */
|
||||
|
||||
#endif /* _ASM_BOOTINFO_H */
|
||||
|
@@ -186,7 +186,9 @@ static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
|
||||
" daddu %0, %4 \n"
|
||||
" dsll32 $1, %0, 0 \n"
|
||||
" daddu %0, $1 \n"
|
||||
" sltu $1, %0, $1 \n"
|
||||
" dsra32 %0, %0, 0 \n"
|
||||
" addu %0, $1 \n"
|
||||
#endif
|
||||
" .set pop"
|
||||
: "=r" (sum)
|
||||
|
@@ -210,6 +210,9 @@ typedef elf_greg_t elf_gregset_t[ELF_NGREG];
|
||||
typedef double elf_fpreg_t;
|
||||
typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
|
||||
|
||||
void mips_dump_regs32(u32 *uregs, const struct pt_regs *regs);
|
||||
void mips_dump_regs64(u64 *uregs, const struct pt_regs *regs);
|
||||
|
||||
#ifdef CONFIG_32BIT
|
||||
/*
|
||||
* This is used to ensure we don't load something for the wrong architecture.
|
||||
@@ -221,6 +224,9 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
|
||||
*/
|
||||
#define ELF_CLASS ELFCLASS32
|
||||
|
||||
#define ELF_CORE_COPY_REGS(dest, regs) \
|
||||
mips_dump_regs32((u32 *)&(dest), (regs));
|
||||
|
||||
#endif /* CONFIG_32BIT */
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
@@ -234,6 +240,9 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
|
||||
*/
|
||||
#define ELF_CLASS ELFCLASS64
|
||||
|
||||
#define ELF_CORE_COPY_REGS(dest, regs) \
|
||||
mips_dump_regs64((u64 *)&(dest), (regs));
|
||||
|
||||
#endif /* CONFIG_64BIT */
|
||||
|
||||
/*
|
||||
|
@@ -25,9 +25,6 @@
|
||||
#include <asm/cpu-features.h>
|
||||
#include <asm/kmap_types.h>
|
||||
|
||||
/* undef for production */
|
||||
#define HIGHMEM_DEBUG 1
|
||||
|
||||
/* declarations for highmem.c */
|
||||
extern unsigned long highstart_pfn, highend_pfn;
|
||||
|
||||
|
@@ -40,7 +40,6 @@ extern raw_spinlock_t i8259A_lock;
|
||||
extern void make_8259A_irq(unsigned int irq);
|
||||
|
||||
extern void init_i8259_irqs(void);
|
||||
extern int i8259_of_init(struct device_node *node, struct device_node *parent);
|
||||
|
||||
/**
|
||||
* i8159_set_poll() - Override the i8259 polling function
|
||||
|
@@ -17,6 +17,18 @@
|
||||
|
||||
#include <irq.h>
|
||||
|
||||
#define IRQ_STACK_SIZE THREAD_SIZE
|
||||
|
||||
extern void *irq_stack[NR_CPUS];
|
||||
|
||||
static inline bool on_irq_stack(int cpu, unsigned long sp)
|
||||
{
|
||||
unsigned long low = (unsigned long)irq_stack[cpu];
|
||||
unsigned long high = low + IRQ_STACK_SIZE;
|
||||
|
||||
return (low <= sp && sp <= high);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_I8259
|
||||
static inline int irq_canonicalize(int irq)
|
||||
{
|
||||
|
@@ -80,6 +80,15 @@ enum bcm47xx_board {
|
||||
BCM47XX_BOARD_LINKSYS_WRT610NV2,
|
||||
BCM47XX_BOARD_LINKSYS_WRTSL54GS,
|
||||
|
||||
BCM47XX_BOARD_LUXUL_ABR_4400_V1,
|
||||
BCM47XX_BOARD_LUXUL_XAP_310_V1,
|
||||
BCM47XX_BOARD_LUXUL_XAP_1210_V1,
|
||||
BCM47XX_BOARD_LUXUL_XAP_1230_V1,
|
||||
BCM47XX_BOARD_LUXUL_XAP_1240_V1,
|
||||
BCM47XX_BOARD_LUXUL_XAP_1500_V1,
|
||||
BCM47XX_BOARD_LUXUL_XBR_4400_V1,
|
||||
BCM47XX_BOARD_LUXUL_XVW_P30_V1,
|
||||
BCM47XX_BOARD_LUXUL_XWR_600_V1,
|
||||
BCM47XX_BOARD_LUXUL_XWR_1750_V1,
|
||||
|
||||
BCM47XX_BOARD_MICROSOFT_MN700,
|
||||
|
@@ -99,9 +99,20 @@
|
||||
# to begin
|
||||
#
|
||||
|
||||
# This is the variable where the next core to boot os stored
|
||||
PTR_LA t0, octeon_processor_boot
|
||||
octeon_spin_wait_boot:
|
||||
#ifdef CONFIG_RELOCATABLE
|
||||
PTR_LA t0, octeon_processor_relocated_kernel_entry
|
||||
LONG_L t0, (t0)
|
||||
beq zero, t0, 1f
|
||||
nop
|
||||
|
||||
jr t0
|
||||
nop
|
||||
1:
|
||||
#endif /* CONFIG_RELOCATABLE */
|
||||
|
||||
# This is the variable where the next core to boot is stored
|
||||
PTR_LA t0, octeon_processor_boot
|
||||
# Get the core id of the next to be booted
|
||||
LONG_L t1, (t0)
|
||||
# Keep looping if it isn't me
|
||||
|
@@ -12,14 +12,16 @@
|
||||
|
||||
/*
|
||||
* IP27 uses the R10000's uncached attribute feature. Attribute 3 selects
|
||||
* uncached memory addressing.
|
||||
* uncached memory addressing. Hide the definitions on 32-bit compilation
|
||||
* of the compat-vdso code.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
#define HSPEC_BASE 0x9000000000000000
|
||||
#define IO_BASE 0x9200000000000000
|
||||
#define MSPEC_BASE 0x9400000000000000
|
||||
#define UNCAC_BASE 0x9600000000000000
|
||||
#define CAC_BASE 0xa800000000000000
|
||||
#endif
|
||||
|
||||
#define TO_MSPEC(x) (MSPEC_BASE | ((x) & TO_PHYS_MASK))
|
||||
#define TO_HSPEC(x) (HSPEC_BASE | ((x) & TO_PHYS_MASK))
|
||||
|
@@ -3,9 +3,9 @@
|
||||
*
|
||||
* Register mappings for Loongson 1
|
||||
*
|
||||
* 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
|
||||
* 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.
|
||||
*/
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
#define __ASM_MACH_LOONGSON32_LOONGSON1_H
|
||||
|
||||
#if defined(CONFIG_LOONGSON1_LS1B)
|
||||
#define DEFAULT_MEMSIZE 256 /* If no memsize provided */
|
||||
#define DEFAULT_MEMSIZE 64 /* If no memsize provided */
|
||||
#elif defined(CONFIG_LOONGSON1_LS1C)
|
||||
#define DEFAULT_MEMSIZE 32
|
||||
#endif
|
||||
@@ -52,6 +52,7 @@
|
||||
#include <regs-clk.h>
|
||||
#include <regs-mux.h>
|
||||
#include <regs-pwm.h>
|
||||
#include <regs-rtc.h>
|
||||
#include <regs-wdt.h>
|
||||
|
||||
#endif /* __ASM_MACH_LOONGSON32_LOONGSON1_H */
|
||||
|
@@ -1,9 +1,9 @@
|
||||
/*
|
||||
* Copyright (c) 2011 Zhang, Keguang <keguang.zhang@gmail.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
|
||||
* 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.
|
||||
*/
|
||||
|
||||
@@ -25,11 +25,12 @@ extern struct platform_device ls1x_gpio0_pdev;
|
||||
extern struct platform_device ls1x_gpio1_pdev;
|
||||
extern struct platform_device ls1x_nand_pdev;
|
||||
extern struct platform_device ls1x_rtc_pdev;
|
||||
extern struct platform_device ls1x_wdt_pdev;
|
||||
|
||||
void __init ls1x_clk_init(void);
|
||||
void __init ls1x_dma_set_platdata(struct plat_ls1x_dma *pdata);
|
||||
void __init ls1x_nand_set_platdata(struct plat_ls1x_nand *pdata);
|
||||
void __init ls1x_serial_set_uartclk(struct platform_device *pdev);
|
||||
void __init ls1x_rtc_set_extclk(struct platform_device *pdev);
|
||||
void __init ls1x_serial_set_uartclk(struct platform_device *pdev);
|
||||
|
||||
#endif /* __ASM_MACH_LOONGSON32_PLATFORM_H */
|
||||
|
23
arch/mips/include/asm/mach-loongson32/regs-rtc.h
Normal file
23
arch/mips/include/asm/mach-loongson32/regs-rtc.h
Normal file
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* Copyright (c) 2016 Yang Ling <gnaygnil@gmail.com>
|
||||
*
|
||||
* Loongson 1 RTC timer Register Definitions.
|
||||
*
|
||||
* 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_MACH_LOONGSON32_REGS_RTC_H
|
||||
#define __ASM_MACH_LOONGSON32_REGS_RTC_H
|
||||
|
||||
#define LS1X_RTC_REG(x) \
|
||||
((void __iomem *)KSEG1ADDR(LS1X_RTC_BASE + (x)))
|
||||
|
||||
#define LS1X_RTC_CTRL LS1X_RTC_REG(0x40)
|
||||
|
||||
#define RTC_EXTCLK_OK (BIT(5) | BIT(8))
|
||||
#define RTC_EXTCLK_EN BIT(8)
|
||||
|
||||
#endif /* __ASM_MACH_LOONGSON32_REGS_RTC_H */
|
@@ -115,9 +115,14 @@
|
||||
#define MT7620_GPIO_MODE_WDT_MASK 0x3
|
||||
#define MT7620_GPIO_MODE_WDT_SHIFT 21
|
||||
|
||||
#define MT7620_GPIO_MODE_MDIO 0
|
||||
#define MT7620_GPIO_MODE_MDIO_REFCLK 1
|
||||
#define MT7620_GPIO_MODE_MDIO_GPIO 2
|
||||
#define MT7620_GPIO_MODE_MDIO_MASK 0x3
|
||||
#define MT7620_GPIO_MODE_MDIO_SHIFT 7
|
||||
|
||||
#define MT7620_GPIO_MODE_I2C 0
|
||||
#define MT7620_GPIO_MODE_UART1 5
|
||||
#define MT7620_GPIO_MODE_MDIO 8
|
||||
#define MT7620_GPIO_MODE_RGMII1 9
|
||||
#define MT7620_GPIO_MODE_RGMII2 10
|
||||
#define MT7620_GPIO_MODE_SPI 11
|
||||
|
@@ -187,6 +187,7 @@ BUILD_CM_R_(config, MIPS_CM_GCB_OFS + 0x00)
|
||||
BUILD_CM_RW(base, MIPS_CM_GCB_OFS + 0x08)
|
||||
BUILD_CM_RW(access, MIPS_CM_GCB_OFS + 0x20)
|
||||
BUILD_CM_R_(rev, MIPS_CM_GCB_OFS + 0x30)
|
||||
BUILD_CM_RW(err_control, MIPS_CM_GCB_OFS + 0x38)
|
||||
BUILD_CM_RW(error_mask, MIPS_CM_GCB_OFS + 0x40)
|
||||
BUILD_CM_RW(error_cause, MIPS_CM_GCB_OFS + 0x48)
|
||||
BUILD_CM_RW(error_addr, MIPS_CM_GCB_OFS + 0x50)
|
||||
@@ -266,6 +267,12 @@ BUILD_CM_Cx_R_(tcid_8_priority, 0x80)
|
||||
#define CM_REV_CM2_5 CM_ENCODE_REV(7, 0)
|
||||
#define CM_REV_CM3 CM_ENCODE_REV(8, 0)
|
||||
|
||||
/* GCR_ERR_CONTROL register fields */
|
||||
#define CM_GCR_ERR_CONTROL_L2_ECC_EN_SHF 1
|
||||
#define CM_GCR_ERR_CONTROL_L2_ECC_EN_MSK (_ULCAST_(0x1) << 1)
|
||||
#define CM_GCR_ERR_CONTROL_L2_ECC_SUPPORT_SHF 0
|
||||
#define CM_GCR_ERR_CONTROL_L2_ECC_SUPPORT_MSK (_ULCAST_(0x1) << 0)
|
||||
|
||||
/* GCR_ERROR_CAUSE register fields */
|
||||
#define CM_GCR_ERROR_CAUSE_ERRTYPE_SHF 27
|
||||
#define CM_GCR_ERROR_CAUSE_ERRTYPE_MSK (_ULCAST_(0x1f) << 27)
|
||||
|
@@ -685,6 +685,39 @@
|
||||
#define MIPS_WATCHHI_W (_ULCAST_(1) << 0)
|
||||
#define MIPS_WATCHHI_IRW (_ULCAST_(0x7) << 0)
|
||||
|
||||
/* PerfCnt control register definitions */
|
||||
#define MIPS_PERFCTRL_EXL (_ULCAST_(1) << 0)
|
||||
#define MIPS_PERFCTRL_K (_ULCAST_(1) << 1)
|
||||
#define MIPS_PERFCTRL_S (_ULCAST_(1) << 2)
|
||||
#define MIPS_PERFCTRL_U (_ULCAST_(1) << 3)
|
||||
#define MIPS_PERFCTRL_IE (_ULCAST_(1) << 4)
|
||||
#define MIPS_PERFCTRL_EVENT_S 5
|
||||
#define MIPS_PERFCTRL_EVENT (_ULCAST_(0x3ff) << MIPS_PERFCTRL_EVENT_S)
|
||||
#define MIPS_PERFCTRL_PCTD (_ULCAST_(1) << 15)
|
||||
#define MIPS_PERFCTRL_EC (_ULCAST_(0x3) << 23)
|
||||
#define MIPS_PERFCTRL_EC_R (_ULCAST_(0) << 23)
|
||||
#define MIPS_PERFCTRL_EC_RI (_ULCAST_(1) << 23)
|
||||
#define MIPS_PERFCTRL_EC_G (_ULCAST_(2) << 23)
|
||||
#define MIPS_PERFCTRL_EC_GRI (_ULCAST_(3) << 23)
|
||||
#define MIPS_PERFCTRL_W (_ULCAST_(1) << 30)
|
||||
#define MIPS_PERFCTRL_M (_ULCAST_(1) << 31)
|
||||
|
||||
/* PerfCnt control register MT extensions used by MIPS cores */
|
||||
#define MIPS_PERFCTRL_VPEID_S 16
|
||||
#define MIPS_PERFCTRL_VPEID (_ULCAST_(0xf) << MIPS_PERFCTRL_VPEID_S)
|
||||
#define MIPS_PERFCTRL_TCID_S 22
|
||||
#define MIPS_PERFCTRL_TCID (_ULCAST_(0xff) << MIPS_PERFCTRL_TCID_S)
|
||||
#define MIPS_PERFCTRL_MT_EN (_ULCAST_(0x3) << 20)
|
||||
#define MIPS_PERFCTRL_MT_EN_ALL (_ULCAST_(0) << 20)
|
||||
#define MIPS_PERFCTRL_MT_EN_VPE (_ULCAST_(1) << 20)
|
||||
#define MIPS_PERFCTRL_MT_EN_TC (_ULCAST_(2) << 20)
|
||||
|
||||
/* PerfCnt control register MT extensions used by BMIPS5000 */
|
||||
#define BRCM_PERFCTRL_TC (_ULCAST_(1) << 30)
|
||||
|
||||
/* PerfCnt control register MT extensions used by Netlogic XLR */
|
||||
#define XLR_PERFCTRL_ALLTHREADS (_ULCAST_(1) << 13)
|
||||
|
||||
/* MAAR bit definitions */
|
||||
#define MIPS_MAAR_ADDR ((BIT_ULL(BITS_PER_LONG - 12) - 1) << 12)
|
||||
#define MIPS_MAAR_ADDR_SHIFT 12
|
||||
|
@@ -46,7 +46,8 @@ union cvmx_gpio_bit_cfgx {
|
||||
uint64_t u64;
|
||||
struct cvmx_gpio_bit_cfgx_s {
|
||||
#ifdef __BIG_ENDIAN_BITFIELD
|
||||
uint64_t reserved_17_63:47;
|
||||
uint64_t reserved_21_63:42;
|
||||
uint64_t output_sel:5;
|
||||
uint64_t synce_sel:2;
|
||||
uint64_t clk_gen:1;
|
||||
uint64_t clk_sel:2;
|
||||
@@ -66,7 +67,8 @@ union cvmx_gpio_bit_cfgx {
|
||||
uint64_t clk_sel:2;
|
||||
uint64_t clk_gen:1;
|
||||
uint64_t synce_sel:2;
|
||||
uint64_t reserved_17_63:47;
|
||||
uint64_t output_sel:5;
|
||||
uint64_t reserved_21_63:42;
|
||||
#endif
|
||||
} s;
|
||||
struct cvmx_gpio_bit_cfgx_cn30xx {
|
||||
@@ -126,6 +128,8 @@ union cvmx_gpio_bit_cfgx {
|
||||
struct cvmx_gpio_bit_cfgx_s cn66xx;
|
||||
struct cvmx_gpio_bit_cfgx_s cn68xx;
|
||||
struct cvmx_gpio_bit_cfgx_s cn68xxp1;
|
||||
struct cvmx_gpio_bit_cfgx_s cn70xx;
|
||||
struct cvmx_gpio_bit_cfgx_s cn73xx;
|
||||
struct cvmx_gpio_bit_cfgx_s cnf71xx;
|
||||
};
|
||||
|
||||
|
@@ -80,8 +80,7 @@ extern cvmx_helper_link_info_t __cvmx_helper_rgmii_link_get(int ipd_port);
|
||||
* Configure an IPD/PKO port for the specified link state. This
|
||||
* function does not influence auto negotiation at the PHY level.
|
||||
* The passed link state must always match the link state returned
|
||||
* by cvmx_helper_link_get(). It is normally best to use
|
||||
* cvmx_helper_link_autoconf() instead.
|
||||
* by cvmx_helper_link_get().
|
||||
*
|
||||
* @ipd_port: IPD/PKO port to configure
|
||||
* @link_info: The new link state
|
||||
|
@@ -74,8 +74,7 @@ extern cvmx_helper_link_info_t __cvmx_helper_sgmii_link_get(int ipd_port);
|
||||
* Configure an IPD/PKO port for the specified link state. This
|
||||
* function does not influence auto negotiation at the PHY level.
|
||||
* The passed link state must always match the link state returned
|
||||
* by cvmx_helper_link_get(). It is normally best to use
|
||||
* cvmx_helper_link_autoconf() instead.
|
||||
* by cvmx_helper_link_get().
|
||||
*
|
||||
* @ipd_port: IPD/PKO port to configure
|
||||
* @link_info: The new link state
|
||||
|
@@ -71,8 +71,7 @@ extern cvmx_helper_link_info_t __cvmx_helper_spi_link_get(int ipd_port);
|
||||
* Configure an IPD/PKO port for the specified link state. This
|
||||
* function does not influence auto negotiation at the PHY level.
|
||||
* The passed link state must always match the link state returned
|
||||
* by cvmx_helper_link_get(). It is normally best to use
|
||||
* cvmx_helper_link_autoconf() instead.
|
||||
* by cvmx_helper_link_get().
|
||||
*
|
||||
* @ipd_port: IPD/PKO port to configure
|
||||
* @link_info: The new link state
|
||||
|
@@ -74,8 +74,7 @@ extern cvmx_helper_link_info_t __cvmx_helper_xaui_link_get(int ipd_port);
|
||||
* Configure an IPD/PKO port for the specified link state. This
|
||||
* function does not influence auto negotiation at the PHY level.
|
||||
* The passed link state must always match the link state returned
|
||||
* by cvmx_helper_link_get(). It is normally best to use
|
||||
* cvmx_helper_link_autoconf() instead.
|
||||
* by cvmx_helper_link_get().
|
||||
*
|
||||
* @ipd_port: IPD/PKO port to configure
|
||||
* @link_info: The new link state
|
||||
|
@@ -155,17 +155,6 @@ extern int cvmx_helper_get_number_of_interfaces(void);
|
||||
extern cvmx_helper_interface_mode_t cvmx_helper_interface_get_mode(int
|
||||
interface);
|
||||
|
||||
/**
|
||||
* Auto configure an IPD/PKO port link state and speed. This
|
||||
* function basically does the equivalent of:
|
||||
* cvmx_helper_link_set(ipd_port, cvmx_helper_link_get(ipd_port));
|
||||
*
|
||||
* @ipd_port: IPD/PKO port to auto configure
|
||||
*
|
||||
* Returns Link state after configure
|
||||
*/
|
||||
extern cvmx_helper_link_info_t cvmx_helper_link_autoconf(int ipd_port);
|
||||
|
||||
/**
|
||||
* Return the link state of an IPD/PKO port as returned by
|
||||
* auto negotiation. The result of this function may not match
|
||||
@@ -182,8 +171,7 @@ extern cvmx_helper_link_info_t cvmx_helper_link_get(int ipd_port);
|
||||
* Configure an IPD/PKO port for the specified link state. This
|
||||
* function does not influence auto negotiation at the PHY level.
|
||||
* The passed link state must always match the link state returned
|
||||
* by cvmx_helper_link_get(). It is normally best to use
|
||||
* cvmx_helper_link_autoconf() instead.
|
||||
* by cvmx_helper_link_get().
|
||||
*
|
||||
* @ipd_port: IPD/PKO port to configure
|
||||
* @link_info: The new link state
|
||||
|
@@ -43,21 +43,7 @@ static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
|
||||
* Initialize a new pgd / pmd table with invalid pointers.
|
||||
*/
|
||||
extern void pgd_init(unsigned long page);
|
||||
|
||||
static inline pgd_t *pgd_alloc(struct mm_struct *mm)
|
||||
{
|
||||
pgd_t *ret, *init;
|
||||
|
||||
ret = (pgd_t *) __get_free_pages(GFP_KERNEL, PGD_ORDER);
|
||||
if (ret) {
|
||||
init = pgd_offset(&init_mm, 0UL);
|
||||
pgd_init((unsigned long)ret);
|
||||
memcpy(ret + USER_PTRS_PER_PGD, init + USER_PTRS_PER_PGD,
|
||||
(PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
extern pgd_t *pgd_alloc(struct mm_struct *mm);
|
||||
|
||||
static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
|
||||
{
|
||||
|
@@ -147,49 +147,66 @@ static inline void flush_scache_line(unsigned long addr)
|
||||
}
|
||||
|
||||
#define protected_cache_op(op,addr) \
|
||||
({ \
|
||||
int __err = 0; \
|
||||
__asm__ __volatile__( \
|
||||
" .set push \n" \
|
||||
" .set noreorder \n" \
|
||||
" .set "MIPS_ISA_ARCH_LEVEL" \n" \
|
||||
"1: cache %0, (%1) \n" \
|
||||
"2: .set pop \n" \
|
||||
"1: cache %1, (%2) \n" \
|
||||
"2: .insn \n" \
|
||||
" .set pop \n" \
|
||||
" .section .fixup,\"ax\" \n" \
|
||||
"3: li %0, %3 \n" \
|
||||
" j 2b \n" \
|
||||
" .previous \n" \
|
||||
" .section __ex_table,\"a\" \n" \
|
||||
" "STR(PTR)" 1b, 2b \n" \
|
||||
" "STR(PTR)" 1b, 3b \n" \
|
||||
" .previous" \
|
||||
: \
|
||||
: "i" (op), "r" (addr))
|
||||
: "+r" (__err) \
|
||||
: "i" (op), "r" (addr), "i" (-EFAULT)); \
|
||||
__err; \
|
||||
})
|
||||
|
||||
|
||||
#define protected_cachee_op(op,addr) \
|
||||
({ \
|
||||
int __err = 0; \
|
||||
__asm__ __volatile__( \
|
||||
" .set push \n" \
|
||||
" .set noreorder \n" \
|
||||
" .set mips0 \n" \
|
||||
" .set eva \n" \
|
||||
"1: cachee %0, (%1) \n" \
|
||||
"2: .set pop \n" \
|
||||
"1: cachee %1, (%2) \n" \
|
||||
"2: .insn \n" \
|
||||
" .set pop \n" \
|
||||
" .section .fixup,\"ax\" \n" \
|
||||
"3: li %0, %3 \n" \
|
||||
" j 2b \n" \
|
||||
" .previous \n" \
|
||||
" .section __ex_table,\"a\" \n" \
|
||||
" "STR(PTR)" 1b, 2b \n" \
|
||||
" "STR(PTR)" 1b, 3b \n" \
|
||||
" .previous" \
|
||||
: \
|
||||
: "i" (op), "r" (addr))
|
||||
: "+r" (__err) \
|
||||
: "i" (op), "r" (addr), "i" (-EFAULT)); \
|
||||
__err; \
|
||||
})
|
||||
|
||||
/*
|
||||
* The next two are for badland addresses like signal trampolines.
|
||||
*/
|
||||
static inline void protected_flush_icache_line(unsigned long addr)
|
||||
static inline int protected_flush_icache_line(unsigned long addr)
|
||||
{
|
||||
switch (boot_cpu_type()) {
|
||||
case CPU_LOONGSON2:
|
||||
protected_cache_op(Hit_Invalidate_I_Loongson2, addr);
|
||||
break;
|
||||
return protected_cache_op(Hit_Invalidate_I_Loongson2, addr);
|
||||
|
||||
default:
|
||||
#ifdef CONFIG_EVA
|
||||
protected_cachee_op(Hit_Invalidate_I, addr);
|
||||
return protected_cachee_op(Hit_Invalidate_I, addr);
|
||||
#else
|
||||
protected_cache_op(Hit_Invalidate_I, addr);
|
||||
return protected_cache_op(Hit_Invalidate_I, addr);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -199,21 +216,21 @@ static inline void protected_flush_icache_line(unsigned long addr)
|
||||
* caches. We're talking about one cacheline unnecessarily getting invalidated
|
||||
* here so the penalty isn't overly hard.
|
||||
*/
|
||||
static inline void protected_writeback_dcache_line(unsigned long addr)
|
||||
static inline int protected_writeback_dcache_line(unsigned long addr)
|
||||
{
|
||||
#ifdef CONFIG_EVA
|
||||
protected_cachee_op(Hit_Writeback_Inv_D, addr);
|
||||
return protected_cachee_op(Hit_Writeback_Inv_D, addr);
|
||||
#else
|
||||
protected_cache_op(Hit_Writeback_Inv_D, addr);
|
||||
return protected_cache_op(Hit_Writeback_Inv_D, addr);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void protected_writeback_scache_line(unsigned long addr)
|
||||
static inline int protected_writeback_scache_line(unsigned long addr)
|
||||
{
|
||||
#ifdef CONFIG_EVA
|
||||
protected_cachee_op(Hit_Writeback_Inv_SD, addr);
|
||||
return protected_cachee_op(Hit_Writeback_Inv_SD, addr);
|
||||
#else
|
||||
protected_cache_op(Hit_Writeback_Inv_SD, addr);
|
||||
return protected_cache_op(Hit_Writeback_Inv_SD, addr);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@@ -42,11 +42,7 @@ extern int __cpu_logical_map[NR_CPUS];
|
||||
#define SMP_CALL_FUNCTION 0x2
|
||||
/* Octeon - Tell another core to flush its icache */
|
||||
#define SMP_ICACHE_FLUSH 0x4
|
||||
/* Used by kexec crashdump to save all cpu's state */
|
||||
#define SMP_DUMP 0x8
|
||||
#define SMP_ASK_C0COUNT 0x10
|
||||
|
||||
extern cpumask_t cpu_callin_map;
|
||||
#define SMP_ASK_C0COUNT 0x8
|
||||
|
||||
/* Mask of CPUs which are currently definitely operating coherently */
|
||||
extern cpumask_t cpu_coherent_mask;
|
||||
@@ -113,8 +109,4 @@ static inline void arch_send_call_function_ipi_mask(const struct cpumask *mask)
|
||||
mp_ops->send_ipi_mask(mask, SMP_CALL_FUNCTION);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_KEXEC)
|
||||
extern void (*dump_ipi_function_ptr)(void *);
|
||||
void dump_send_ipi(void (*dump_ipi_callback)(void *));
|
||||
#endif
|
||||
#endif /* __ASM_SMP_H */
|
||||
|
@@ -216,12 +216,19 @@
|
||||
LONG_S $25, PT_R25(sp)
|
||||
LONG_S $28, PT_R28(sp)
|
||||
LONG_S $31, PT_R31(sp)
|
||||
|
||||
/* Set thread_info if we're coming from user mode */
|
||||
mfc0 k0, CP0_STATUS
|
||||
sll k0, 3 /* extract cu0 bit */
|
||||
bltz k0, 9f
|
||||
|
||||
ori $28, sp, _THREAD_MASK
|
||||
xori $28, _THREAD_MASK
|
||||
#ifdef CONFIG_CPU_CAVIUM_OCTEON
|
||||
.set mips64
|
||||
pref 0, 0($28) /* Prefetch the current pointer */
|
||||
#endif
|
||||
9:
|
||||
.set pop
|
||||
.endm
|
||||
|
||||
@@ -357,9 +364,13 @@
|
||||
|
||||
.macro RESTORE_SP_AND_RET
|
||||
LONG_L sp, PT_R29(sp)
|
||||
#ifdef CONFIG_CPU_MIPSR6
|
||||
eretnc
|
||||
#else
|
||||
.set arch=r4000
|
||||
eret
|
||||
.set mips0
|
||||
#endif
|
||||
.endm
|
||||
|
||||
#endif
|
||||
@@ -376,14 +387,6 @@
|
||||
RESTORE_SP
|
||||
.endm
|
||||
|
||||
.macro RESTORE_ALL_AND_RET
|
||||
RESTORE_TEMP
|
||||
RESTORE_STATIC
|
||||
RESTORE_AT
|
||||
RESTORE_SOME
|
||||
RESTORE_SP_AND_RET
|
||||
.endm
|
||||
|
||||
/*
|
||||
* Move to kernel mode and disable interrupts.
|
||||
* Set cp0 enable bit as sign that we're running on the kernel stack
|
||||
|
@@ -66,13 +66,18 @@ do { \
|
||||
#define __mips_mt_fpaff_switch_to(prev) do { (void) (prev); } while (0)
|
||||
#endif
|
||||
|
||||
#define __clear_software_ll_bit() \
|
||||
do { if (cpu_has_rw_llb) { \
|
||||
/*
|
||||
* Clear LLBit during context switches on MIPSr6 such that eretnc can be used
|
||||
* unconditionally when returning to userland in entry.S.
|
||||
*/
|
||||
#define __clear_r6_hw_ll_bit() do { \
|
||||
if (cpu_has_mips_r6) \
|
||||
write_c0_lladdr(0); \
|
||||
} else { \
|
||||
if (!__builtin_constant_p(cpu_has_llsc) || !cpu_has_llsc)\
|
||||
ll_bit = 0; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define __clear_software_ll_bit() do { \
|
||||
if (!__builtin_constant_p(cpu_has_llsc) || !cpu_has_llsc) \
|
||||
ll_bit = 0; \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
@@ -120,6 +125,7 @@ do { \
|
||||
} \
|
||||
clear_c0_status(ST0_CU2); \
|
||||
} \
|
||||
__clear_r6_hw_ll_bit(); \
|
||||
__clear_software_ll_bit(); \
|
||||
if (cpu_has_userlocal) \
|
||||
write_c0_userlocal(task_thread_info(next)->tp_value); \
|
||||
|
@@ -27,7 +27,6 @@ struct thread_info {
|
||||
unsigned long tp_value; /* thread pointer */
|
||||
__u32 cpu; /* current CPU */
|
||||
int preempt_count; /* 0 => preemptable, <0 => BUG */
|
||||
int r2_emul_return; /* 1 => Returning from R2 emulator */
|
||||
mm_segment_t addr_limit; /*
|
||||
* thread address space limit:
|
||||
* 0x7fffffff for user-thead
|
||||
|
26
arch/mips/include/asm/tlbex.h
Normal file
26
arch/mips/include/asm/tlbex.h
Normal file
@@ -0,0 +1,26 @@
|
||||
#ifndef __ASM_TLBEX_H
|
||||
#define __ASM_TLBEX_H
|
||||
|
||||
#include <asm/uasm.h>
|
||||
|
||||
/*
|
||||
* Write random or indexed TLB entry, and care about the hazards from
|
||||
* the preceding mtc0 and for the following eret.
|
||||
*/
|
||||
enum tlb_write_entry {
|
||||
tlb_random,
|
||||
tlb_indexed
|
||||
};
|
||||
|
||||
extern int pgd_reg;
|
||||
|
||||
void build_get_pmde64(u32 **p, struct uasm_label **l, struct uasm_reloc **r,
|
||||
unsigned int tmp, unsigned int ptr);
|
||||
void build_get_pgde32(u32 **p, unsigned int tmp, unsigned int ptr);
|
||||
void build_get_ptep(u32 **p, unsigned int tmp, unsigned int ptr);
|
||||
void build_update_entries(u32 **p, unsigned int tmp, unsigned int ptep);
|
||||
void build_tlb_write_entry(u32 **p, struct uasm_label **l,
|
||||
struct uasm_reloc **r,
|
||||
enum tlb_write_entry wmode);
|
||||
|
||||
#endif /* __ASM_TLBEX_H */
|
@@ -1241,6 +1241,9 @@ extern size_t __copy_in_user_eva(void *__to, const void *__from, size_t __n);
|
||||
__cu_len; \
|
||||
})
|
||||
|
||||
extern __kernel_size_t __bzero_kernel(void __user *addr, __kernel_size_t size);
|
||||
extern __kernel_size_t __bzero(void __user *addr, __kernel_size_t size);
|
||||
|
||||
/*
|
||||
* __clear_user: - Zero a block of memory in user space, with less checking.
|
||||
* @to: Destination address, in user space.
|
||||
@@ -1293,6 +1296,9 @@ __clear_user(void __user *addr, __kernel_size_t size)
|
||||
__cl_size; \
|
||||
})
|
||||
|
||||
extern long __strncpy_from_kernel_nocheck_asm(char *__to, const char __user *__from, long __len);
|
||||
extern long __strncpy_from_user_nocheck_asm(char *__to, const char __user *__from, long __len);
|
||||
|
||||
/*
|
||||
* __strncpy_from_user: - Copy a NUL terminated string from userspace, with less checking.
|
||||
* @dst: Destination address, in kernel space. This buffer must be at
|
||||
@@ -1344,6 +1350,9 @@ __strncpy_from_user(char *__to, const char __user *__from, long __len)
|
||||
return res;
|
||||
}
|
||||
|
||||
extern long __strncpy_from_kernel_asm(char *__to, const char __user *__from, long __len);
|
||||
extern long __strncpy_from_user_asm(char *__to, const char __user *__from, long __len);
|
||||
|
||||
/*
|
||||
* strncpy_from_user: - Copy a NUL terminated string from userspace.
|
||||
* @dst: Destination address, in kernel space. This buffer must be at
|
||||
@@ -1393,6 +1402,9 @@ strncpy_from_user(char *__to, const char __user *__from, long __len)
|
||||
return res;
|
||||
}
|
||||
|
||||
extern long __strlen_kernel_asm(const char __user *s);
|
||||
extern long __strlen_user_asm(const char __user *s);
|
||||
|
||||
/*
|
||||
* strlen_user: - Get the size of a string in user space.
|
||||
* @str: The string to measure.
|
||||
@@ -1434,6 +1446,9 @@ static inline long strlen_user(const char __user *s)
|
||||
return res;
|
||||
}
|
||||
|
||||
extern long __strnlen_kernel_nocheck_asm(const char __user *s, long n);
|
||||
extern long __strnlen_user_nocheck_asm(const char __user *s, long n);
|
||||
|
||||
/* Returns: 0 if bad, string length+1 (memory size) of string if ok */
|
||||
static inline long __strnlen_user(const char __user *s, long n)
|
||||
{
|
||||
@@ -1463,6 +1478,9 @@ static inline long __strnlen_user(const char __user *s, long n)
|
||||
return res;
|
||||
}
|
||||
|
||||
extern long __strnlen_kernel_asm(const char __user *s, long n);
|
||||
extern long __strnlen_user_asm(const char __user *s, long n);
|
||||
|
||||
/*
|
||||
* strnlen_user: - Get the size of a string in user space.
|
||||
* @str: The string to measure.
|
||||
|
@@ -9,6 +9,9 @@
|
||||
* Copyright (C) 2012, 2013 MIPS Technologies, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_UASM_H
|
||||
#define __ASM_UASM_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#ifdef CONFIG_EXPORT_UASM
|
||||
@@ -309,3 +312,5 @@ void uasm_il_bltz(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid);
|
||||
void uasm_il_bne(u32 **p, struct uasm_reloc **r, unsigned int reg1,
|
||||
unsigned int reg2, int lid);
|
||||
void uasm_il_bnez(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid);
|
||||
|
||||
#endif /* __ASM_UASM_H */
|
||||
|
@@ -1,28 +0,0 @@
|
||||
/*
|
||||
* 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) 2007 Ralf Baechle (ralf@linux-mips.org)
|
||||
*/
|
||||
#ifndef _ASM_MIPS_UNALIGNED_H
|
||||
#define _ASM_MIPS_UNALIGNED_H
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#if defined(__MIPSEB__)
|
||||
# include <linux/unaligned/be_struct.h>
|
||||
# include <linux/unaligned/le_byteshift.h>
|
||||
# define get_unaligned __get_unaligned_be
|
||||
# define put_unaligned __put_unaligned_be
|
||||
#elif defined(__MIPSEL__)
|
||||
# include <linux/unaligned/le_struct.h>
|
||||
# include <linux/unaligned/be_byteshift.h>
|
||||
# define get_unaligned __get_unaligned_le
|
||||
# define put_unaligned __put_unaligned_le
|
||||
#else
|
||||
# error "MIPS, but neither __MIPSEB__, nor __MIPSEL__???"
|
||||
#endif
|
||||
|
||||
# include <linux/unaligned/generic.h>
|
||||
|
||||
#endif /* _ASM_MIPS_UNALIGNED_H */
|
Reference in New Issue
Block a user