Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus
Pull MIPS updates from Ralf Baechle: "This is an unusually large pull request for MIPS - in parts because lots of patches missed the 3.18 deadline but primarily because some folks opened the flood gates. - Retire the MIPS-specific phys_t with the generic phys_addr_t. - Improvments for the backtrace code used by oprofile. - Better backtraces on SMP systems. - Cleanups for the Octeon platform code. - Cleanups and fixes for the Loongson platform code. - Cleanups and fixes to the firmware library. - Switch ATH79 platform to use the firmware library. - Grand overhault to the SEAD3 and Malta interrupt code. - Move the GIC interrupt code to drivers/irqchip - Lots of GIC cleanups and updates to the GIC code to use modern IRQ infrastructures and features of the kernel. - OF documentation updates for the GIC bindings - Move GIC clocksource driver to drivers/clocksource - Merge GIC clocksource driver with clockevent driver. - Further updates to bring the GIC clocksource driver up to date. - R3000 TLB code cleanups - Improvments to the Loongson 3 platform code. - Convert pr_warning to pr_warn. - Merge a bunch of small lantiq and ralink fixes that have been staged/lingering inside the openwrt tree for a while. - Update archhelp for IP22/IP32 - Fix a number of issues for Loongson 1B. - New clocksource and clockevent driver for Loongson 1B. - Further work on clk handling for Loongson 1B. - Platform work for Broadcom BMIPS. - Error handling cleanups for TurboChannel. - Fixes and optimization to the microMIPS support. - Option to disable the FTLB. - Dump more relevant information on machine check exception - Change binfmt to allow arch to examine PT_*PROC headers - Support for new style FPU register model in O32 - VDSO randomization. - BCM47xx cleanups - BCM47xx reimplement the way the kernel accesses NVRAM information. - Random cleanups - Add support for ATH25 platforms - Remove pointless locking code in some PCI platforms. - Some improvments to EVA support - Minor Alchemy cleanup" * 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus: (185 commits) MIPS: Add MFHC0 and MTHC0 instructions to uasm. MIPS: Cosmetic cleanups of page table headers. MIPS: Add CP0 macros for extended EntryLo registers MIPS: Remove now unused definition of phys_t. MIPS: Replace use of phys_t with phys_addr_t. MIPS: Replace MIPS-specific 64BIT_PHYS_ADDR with generic PHYS_ADDR_T_64BIT PCMCIA: Alchemy Don't select 64BIT_PHYS_ADDR in Kconfig. MIPS: lib: memset: Clean up some MIPS{EL,EB} ifdefery MIPS: iomap: Use __mem_{read,write}{b,w,l} for MMIO MIPS: <asm/types.h> fix indentation. MAINTAINERS: Add entry for BMIPS multiplatform kernel MIPS: Enable VDSO randomization MIPS: Remove a temporary hack for debugging cache flushes in SMTC configuration MIPS: Remove declaration of obsolete arch_init_clk_ops() MIPS: atomic.h: Reformat to fit in 79 columns MIPS: Apply `.insn' to fixup labels throughout MIPS: Fix microMIPS LL/SC immediate offsets MIPS: Kconfig: Only allow 32-bit microMIPS builds MIPS: signal.c: Fix an invalid cast in ISA mode bit handling MIPS: mm: Only build one microassembler that is suitable ...
This commit is contained in:
@@ -4,7 +4,13 @@
|
||||
|
||||
obj-y += cache.o dma-default.o extable.o fault.o \
|
||||
gup.o init.o mmap.o page.o page-funcs.o \
|
||||
tlbex.o tlbex-fault.o tlb-funcs.o uasm-mips.o
|
||||
tlbex.o tlbex-fault.o tlb-funcs.o
|
||||
|
||||
ifdef CONFIG_CPU_MICROMIPS
|
||||
obj-y += uasm-micromips.o
|
||||
else
|
||||
obj-y += uasm-mips.o
|
||||
endif
|
||||
|
||||
obj-$(CONFIG_32BIT) += ioremap.o pgtable-32.o
|
||||
obj-$(CONFIG_64BIT) += pgtable-64.o
|
||||
@@ -22,5 +28,3 @@ obj-$(CONFIG_IP22_CPU_SCACHE) += sc-ip22.o
|
||||
obj-$(CONFIG_R5000_CPU_SCACHE) += sc-r5k.o
|
||||
obj-$(CONFIG_RM7000_CPU_SCACHE) += sc-rm7k.o
|
||||
obj-$(CONFIG_MIPS_CPU_SCACHE) += sc-mips.o
|
||||
|
||||
obj-$(CONFIG_SYS_SUPPORTS_MICROMIPS) += uasm-micromips.o
|
||||
|
@@ -917,6 +917,18 @@ static inline void alias_74k_erratum(struct cpuinfo_mips *c)
|
||||
}
|
||||
}
|
||||
|
||||
static void b5k_instruction_hazard(void)
|
||||
{
|
||||
__sync();
|
||||
__sync();
|
||||
__asm__ __volatile__(
|
||||
" nop; nop; nop; nop; nop; nop; nop; nop\n"
|
||||
" nop; nop; nop; nop; nop; nop; nop; nop\n"
|
||||
" nop; nop; nop; nop; nop; nop; nop; nop\n"
|
||||
" nop; nop; nop; nop; nop; nop; nop; nop\n"
|
||||
: : : "memory");
|
||||
}
|
||||
|
||||
static char *way_string[] = { NULL, "direct mapped", "2-way",
|
||||
"3-way", "4-way", "5-way", "6-way", "7-way", "8-way"
|
||||
};
|
||||
@@ -1683,6 +1695,37 @@ void r4k_cache_init(void)
|
||||
|
||||
coherency_setup();
|
||||
board_cache_error_setup = r4k_cache_error_setup;
|
||||
|
||||
/*
|
||||
* Per-CPU overrides
|
||||
*/
|
||||
switch (current_cpu_type()) {
|
||||
case CPU_BMIPS4350:
|
||||
case CPU_BMIPS4380:
|
||||
/* No IPI is needed because all CPUs share the same D$ */
|
||||
flush_data_cache_page = r4k_blast_dcache_page;
|
||||
break;
|
||||
case CPU_BMIPS5000:
|
||||
/* We lose our superpowers if L2 is disabled */
|
||||
if (c->scache.flags & MIPS_CACHE_NOT_PRESENT)
|
||||
break;
|
||||
|
||||
/* I$ fills from D$ just by emptying the write buffers */
|
||||
flush_cache_page = (void *)b5k_instruction_hazard;
|
||||
flush_cache_range = (void *)b5k_instruction_hazard;
|
||||
flush_cache_sigtramp = (void *)b5k_instruction_hazard;
|
||||
local_flush_data_cache_page = (void *)b5k_instruction_hazard;
|
||||
flush_data_cache_page = (void *)b5k_instruction_hazard;
|
||||
flush_icache_range = (void *)b5k_instruction_hazard;
|
||||
local_flush_icache_range = (void *)b5k_instruction_hazard;
|
||||
|
||||
/* Cache aliases are handled in hardware; allow HIGHMEM */
|
||||
current_cpu_data.dcache.flags &= ~MIPS_CACHE_ALIASES;
|
||||
|
||||
/* Optimization: an L2 flush implicitly flushes the L1 */
|
||||
current_cpu_data.options |= MIPS_CPU_INCLUSIVE_CACHES;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int r4k_cache_pm_notifier(struct notifier_block *self, unsigned long cmd,
|
||||
|
@@ -61,6 +61,11 @@ static inline struct page *dma_addr_to_page(struct device *dev,
|
||||
* Warning on the terminology - Linux calls an uncached area coherent;
|
||||
* MIPS terminology calls memory areas with hardware maintained coherency
|
||||
* coherent.
|
||||
*
|
||||
* Note that the R14000 and R16000 should also be checked for in this
|
||||
* condition. However this function is only called on non-I/O-coherent
|
||||
* systems and only the R10000 and R12000 are used in such systems, the
|
||||
* SGI IP28 Indigo² rsp. SGI IP32 aka O2.
|
||||
*/
|
||||
static inline int cpu_needs_post_dma_flush(struct device *dev)
|
||||
{
|
||||
|
@@ -17,7 +17,7 @@
|
||||
|
||||
static inline pte_t gup_get_pte(pte_t *ptep)
|
||||
{
|
||||
#if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32)
|
||||
#if defined(CONFIG_PHYS_ADDR_T_64BIT) && defined(CONFIG_CPU_MIPS32)
|
||||
pte_t pte;
|
||||
|
||||
retry:
|
||||
|
@@ -95,7 +95,7 @@ static void *__kmap_pgprot(struct page *page, unsigned long addr, pgprot_t prot)
|
||||
idx += in_interrupt() ? FIX_N_COLOURS : 0;
|
||||
vaddr = __fix_to_virt(FIX_CMAP_END - idx);
|
||||
pte = mk_pte(page, prot);
|
||||
#if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32)
|
||||
#if defined(CONFIG_PHYS_ADDR_T_64BIT) && defined(CONFIG_CPU_MIPS32)
|
||||
entrylo = pte.pte_high;
|
||||
#else
|
||||
entrylo = pte_to_entrylo(pte_val(pte));
|
||||
|
@@ -17,9 +17,9 @@
|
||||
#include <asm/tlbflush.h>
|
||||
|
||||
static inline void remap_area_pte(pte_t * pte, unsigned long address,
|
||||
phys_t size, phys_t phys_addr, unsigned long flags)
|
||||
phys_addr_t size, phys_addr_t phys_addr, unsigned long flags)
|
||||
{
|
||||
phys_t end;
|
||||
phys_addr_t end;
|
||||
unsigned long pfn;
|
||||
pgprot_t pgprot = __pgprot(_PAGE_GLOBAL | _PAGE_PRESENT | __READABLE
|
||||
| __WRITEABLE | flags);
|
||||
@@ -43,9 +43,9 @@ static inline void remap_area_pte(pte_t * pte, unsigned long address,
|
||||
}
|
||||
|
||||
static inline int remap_area_pmd(pmd_t * pmd, unsigned long address,
|
||||
phys_t size, phys_t phys_addr, unsigned long flags)
|
||||
phys_addr_t size, phys_addr_t phys_addr, unsigned long flags)
|
||||
{
|
||||
phys_t end;
|
||||
phys_addr_t end;
|
||||
|
||||
address &= ~PGDIR_MASK;
|
||||
end = address + size;
|
||||
@@ -64,8 +64,8 @@ static inline int remap_area_pmd(pmd_t * pmd, unsigned long address,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int remap_area_pages(unsigned long address, phys_t phys_addr,
|
||||
phys_t size, unsigned long flags)
|
||||
static int remap_area_pages(unsigned long address, phys_addr_t phys_addr,
|
||||
phys_addr_t size, unsigned long flags)
|
||||
{
|
||||
int error;
|
||||
pgd_t * dir;
|
||||
@@ -111,13 +111,13 @@ static int remap_area_pages(unsigned long address, phys_t phys_addr,
|
||||
* caller shouldn't need to know that small detail.
|
||||
*/
|
||||
|
||||
#define IS_LOW512(addr) (!((phys_t)(addr) & (phys_t) ~0x1fffffffULL))
|
||||
#define IS_LOW512(addr) (!((phys_addr_t)(addr) & (phys_addr_t) ~0x1fffffffULL))
|
||||
|
||||
void __iomem * __ioremap(phys_t phys_addr, phys_t size, unsigned long flags)
|
||||
void __iomem * __ioremap(phys_addr_t phys_addr, phys_addr_t size, unsigned long flags)
|
||||
{
|
||||
struct vm_struct * area;
|
||||
unsigned long offset;
|
||||
phys_t last_addr;
|
||||
phys_addr_t last_addr;
|
||||
void * addr;
|
||||
|
||||
phys_addr = fixup_bigphys_addr(phys_addr, size);
|
||||
|
@@ -81,7 +81,7 @@ static inline int __init r5k_sc_probe(void)
|
||||
unsigned long config = read_c0_config();
|
||||
|
||||
if (config & CONF_SC)
|
||||
return(0);
|
||||
return 0;
|
||||
|
||||
scache_size = (512 * 1024) << ((config & R5K_CONF_SS) >> 20);
|
||||
|
||||
|
@@ -332,7 +332,7 @@ void __update_tlb(struct vm_area_struct * vma, unsigned long address, pte_t pte)
|
||||
{
|
||||
ptep = pte_offset_map(pmdp, address);
|
||||
|
||||
#if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32)
|
||||
#if defined(CONFIG_PHYS_ADDR_T_64BIT) && defined(CONFIG_CPU_MIPS32)
|
||||
write_c0_entrylo0(ptep->pte_high);
|
||||
ptep++;
|
||||
write_c0_entrylo1(ptep->pte_high);
|
||||
|
@@ -637,7 +637,7 @@ static __maybe_unused void build_convert_pte_to_entrylo(u32 **p,
|
||||
if (cpu_has_rixi) {
|
||||
UASM_i_ROTR(p, reg, reg, ilog2(_PAGE_GLOBAL));
|
||||
} else {
|
||||
#ifdef CONFIG_64BIT_PHYS_ADDR
|
||||
#ifdef CONFIG_PHYS_ADDR_T_64BIT
|
||||
uasm_i_dsrl_safe(p, reg, reg, ilog2(_PAGE_GLOBAL));
|
||||
#else
|
||||
UASM_i_SRL(p, reg, reg, ilog2(_PAGE_GLOBAL));
|
||||
@@ -1009,7 +1009,7 @@ static void build_update_entries(u32 **p, unsigned int tmp, unsigned int ptep)
|
||||
* 64bit address support (36bit on a 32bit CPU) in a 32bit
|
||||
* Kernel is a special case. Only a few CPUs use it.
|
||||
*/
|
||||
#ifdef CONFIG_64BIT_PHYS_ADDR
|
||||
#ifdef CONFIG_PHYS_ADDR_T_64BIT
|
||||
if (cpu_has_64bits) {
|
||||
uasm_i_ld(p, tmp, 0, ptep); /* get even pte */
|
||||
uasm_i_ld(p, ptep, sizeof(pte_t), ptep); /* get odd pte */
|
||||
@@ -1510,14 +1510,14 @@ static void
|
||||
iPTE_LW(u32 **p, unsigned int pte, unsigned int ptr)
|
||||
{
|
||||
#ifdef CONFIG_SMP
|
||||
# ifdef CONFIG_64BIT_PHYS_ADDR
|
||||
# ifdef CONFIG_PHYS_ADDR_T_64BIT
|
||||
if (cpu_has_64bits)
|
||||
uasm_i_lld(p, pte, 0, ptr);
|
||||
else
|
||||
# endif
|
||||
UASM_i_LL(p, pte, 0, ptr);
|
||||
#else
|
||||
# ifdef CONFIG_64BIT_PHYS_ADDR
|
||||
# ifdef CONFIG_PHYS_ADDR_T_64BIT
|
||||
if (cpu_has_64bits)
|
||||
uasm_i_ld(p, pte, 0, ptr);
|
||||
else
|
||||
@@ -1530,13 +1530,13 @@ static void
|
||||
iPTE_SW(u32 **p, struct uasm_reloc **r, unsigned int pte, unsigned int ptr,
|
||||
unsigned int mode)
|
||||
{
|
||||
#ifdef CONFIG_64BIT_PHYS_ADDR
|
||||
#ifdef CONFIG_PHYS_ADDR_T_64BIT
|
||||
unsigned int hwmode = mode & (_PAGE_VALID | _PAGE_DIRTY);
|
||||
#endif
|
||||
|
||||
uasm_i_ori(p, pte, pte, mode);
|
||||
#ifdef CONFIG_SMP
|
||||
# ifdef CONFIG_64BIT_PHYS_ADDR
|
||||
# ifdef CONFIG_PHYS_ADDR_T_64BIT
|
||||
if (cpu_has_64bits)
|
||||
uasm_i_scd(p, pte, 0, ptr);
|
||||
else
|
||||
@@ -1548,7 +1548,7 @@ iPTE_SW(u32 **p, struct uasm_reloc **r, unsigned int pte, unsigned int ptr,
|
||||
else
|
||||
uasm_il_beqz(p, r, pte, label_smp_pgtable_change);
|
||||
|
||||
# ifdef CONFIG_64BIT_PHYS_ADDR
|
||||
# ifdef CONFIG_PHYS_ADDR_T_64BIT
|
||||
if (!cpu_has_64bits) {
|
||||
/* no uasm_i_nop needed */
|
||||
uasm_i_ll(p, pte, sizeof(pte_t) / 2, ptr);
|
||||
@@ -1563,14 +1563,14 @@ iPTE_SW(u32 **p, struct uasm_reloc **r, unsigned int pte, unsigned int ptr,
|
||||
uasm_i_nop(p);
|
||||
# endif
|
||||
#else
|
||||
# ifdef CONFIG_64BIT_PHYS_ADDR
|
||||
# ifdef CONFIG_PHYS_ADDR_T_64BIT
|
||||
if (cpu_has_64bits)
|
||||
uasm_i_sd(p, pte, 0, ptr);
|
||||
else
|
||||
# endif
|
||||
UASM_i_SW(p, pte, 0, ptr);
|
||||
|
||||
# ifdef CONFIG_64BIT_PHYS_ADDR
|
||||
# ifdef CONFIG_PHYS_ADDR_T_64BIT
|
||||
if (!cpu_has_64bits) {
|
||||
uasm_i_lw(p, pte, sizeof(pte_t) / 2, ptr);
|
||||
uasm_i_ori(p, pte, pte, hwmode);
|
||||
|
@@ -96,9 +96,11 @@ static struct insn insn_table[] = {
|
||||
{ insn_lw, M(lw_op, 0, 0, 0, 0, 0), RS | RT | SIMM },
|
||||
{ insn_lwx, M(spec3_op, 0, 0, 0, lwx_op, lx_op), RS | RT | RD },
|
||||
{ insn_mfc0, M(cop0_op, mfc_op, 0, 0, 0, 0), RT | RD | SET},
|
||||
{ insn_mfhc0, M(cop0_op, mfhc0_op, 0, 0, 0, 0), RT | RD | SET},
|
||||
{ insn_mfhi, M(spec_op, 0, 0, 0, 0, mfhi_op), RD },
|
||||
{ insn_mflo, M(spec_op, 0, 0, 0, 0, mflo_op), RD },
|
||||
{ insn_mtc0, M(cop0_op, mtc_op, 0, 0, 0, 0), RT | RD | SET},
|
||||
{ insn_mthc0, M(cop0_op, mthc0_op, 0, 0, 0, 0), RT | RD | SET},
|
||||
{ insn_mul, M(spec2_op, 0, 0, 0, 0, mul_op), RS | RT | RD},
|
||||
{ insn_ori, M(ori_op, 0, 0, 0, 0, 0), RS | RT | UIMM },
|
||||
{ insn_or, M(spec_op, 0, 0, 0, 0, or_op), RS | RT | RD },
|
||||
|
@@ -51,12 +51,12 @@ enum opcode {
|
||||
insn_dsll32, insn_dsra, insn_dsrl, insn_dsrl32, insn_dsubu, insn_eret,
|
||||
insn_ext, insn_ins, insn_j, insn_jal, insn_jalr, insn_jr, insn_lb,
|
||||
insn_ld, insn_ldx, insn_lh, insn_ll, insn_lld, insn_lui, insn_lw,
|
||||
insn_lwx, insn_mfc0, insn_mfhi, insn_mflo, insn_mtc0, insn_mul,
|
||||
insn_or, insn_ori, insn_pref, insn_rfe, insn_rotr, insn_sc, insn_scd,
|
||||
insn_sd, insn_sll, insn_sllv, insn_slt, insn_sltiu, insn_sltu, insn_sra,
|
||||
insn_srl, insn_srlv, insn_subu, insn_sw, insn_sync, insn_syscall,
|
||||
insn_tlbp, insn_tlbr, insn_tlbwi, insn_tlbwr, insn_wait, insn_wsbh,
|
||||
insn_xor, insn_xori, insn_yield,
|
||||
insn_lwx, insn_mfc0, insn_mfhc0, insn_mfhi, insn_mflo, insn_mtc0,
|
||||
insn_mthc0, insn_mul, insn_or, insn_ori, insn_pref, insn_rfe,
|
||||
insn_rotr, insn_sc, insn_scd, insn_sd, insn_sll, insn_sllv, insn_slt,
|
||||
insn_sltiu, insn_sltu, insn_sra, insn_srl, insn_srlv, insn_subu,
|
||||
insn_sw, insn_sync, insn_syscall, insn_tlbp, insn_tlbr, insn_tlbwi,
|
||||
insn_tlbwr, insn_wait, insn_wsbh, insn_xor, insn_xori, insn_yield,
|
||||
};
|
||||
|
||||
struct insn {
|
||||
@@ -284,9 +284,11 @@ I_u2s3u1(_lld)
|
||||
I_u1s2(_lui)
|
||||
I_u2s3u1(_lw)
|
||||
I_u1u2u3(_mfc0)
|
||||
I_u1u2u3(_mfhc0)
|
||||
I_u1(_mfhi)
|
||||
I_u1(_mflo)
|
||||
I_u1u2u3(_mtc0)
|
||||
I_u1u2u3(_mthc0)
|
||||
I_u3u1u2(_mul)
|
||||
I_u2u1u3(_ori)
|
||||
I_u3u1u2(_or)
|
||||
|
Reference in New Issue
Block a user