Merge branch 'for-next/mips'
This commit is contained in:
commit
7991fe1b8e
19 changed files with 510 additions and 12 deletions
|
@ -6,6 +6,7 @@ config MIPS
|
||||||
select HAS_KALLSYMS
|
select HAS_KALLSYMS
|
||||||
select HAVE_CONFIGURABLE_MEMORY_LAYOUT
|
select HAVE_CONFIGURABLE_MEMORY_LAYOUT
|
||||||
select HAVE_CONFIGURABLE_TEXT_BASE
|
select HAVE_CONFIGURABLE_TEXT_BASE
|
||||||
|
select HAS_DMA
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config SYS_SUPPORTS_BIG_ENDIAN
|
config SYS_SUPPORTS_BIG_ENDIAN
|
||||||
|
|
|
@ -26,18 +26,32 @@
|
||||||
|
|
||||||
mips_barebox_10h
|
mips_barebox_10h
|
||||||
|
|
||||||
mips_disable_interrupts
|
hornet_mips24k_cp0_setup
|
||||||
|
|
||||||
pbl_blt 0xbf000000 skip_pll_ram_config t8
|
pbl_blt 0xbf000000 skip_pll_ram_config t8
|
||||||
|
|
||||||
|
hornet_1_1_war
|
||||||
|
|
||||||
pbl_ar9331_pll
|
pbl_ar9331_pll
|
||||||
pbl_ar9331_ddr2_config
|
pbl_ar9331_ddr2_config
|
||||||
|
|
||||||
|
/* Initialize caches... */
|
||||||
|
mips_cache_reset
|
||||||
|
|
||||||
|
/* ... and enable them */
|
||||||
|
dcache_enable
|
||||||
|
|
||||||
skip_pll_ram_config:
|
skip_pll_ram_config:
|
||||||
pbl_ar9331_uart_enable
|
pbl_ar9331_uart_enable
|
||||||
debug_ll_ar9331_init
|
debug_ll_ar9331_init
|
||||||
mips_nmon
|
mips_nmon
|
||||||
|
|
||||||
|
/*
|
||||||
|
* It is amazing but we have to enable MDIO on GPIO
|
||||||
|
* to use GPIO27 for LED1.
|
||||||
|
*/
|
||||||
|
pbl_ar9331_mdio_gpio_enable
|
||||||
|
|
||||||
copy_to_link_location pbl_start
|
copy_to_link_location pbl_start
|
||||||
|
|
||||||
.set pop
|
.set pop
|
||||||
|
|
|
@ -26,18 +26,32 @@
|
||||||
|
|
||||||
mips_barebox_10h
|
mips_barebox_10h
|
||||||
|
|
||||||
mips_disable_interrupts
|
hornet_mips24k_cp0_setup
|
||||||
|
|
||||||
pbl_blt 0xbf000000 skip_pll_ram_config t8
|
pbl_blt 0xbf000000 skip_pll_ram_config t8
|
||||||
|
|
||||||
|
hornet_1_1_war
|
||||||
|
|
||||||
pbl_ar9331_pll
|
pbl_ar9331_pll
|
||||||
pbl_ar9331_ddr1_config
|
pbl_ar9331_ddr1_config
|
||||||
|
|
||||||
|
/* Initialize caches... */
|
||||||
|
mips_cache_reset
|
||||||
|
|
||||||
|
/* ... and enable them */
|
||||||
|
dcache_enable
|
||||||
|
|
||||||
skip_pll_ram_config:
|
skip_pll_ram_config:
|
||||||
pbl_ar9331_uart_enable
|
pbl_ar9331_uart_enable
|
||||||
debug_ll_ar9331_init
|
debug_ll_ar9331_init
|
||||||
mips_nmon
|
mips_nmon
|
||||||
|
|
||||||
|
/*
|
||||||
|
* It is amazing but we have to enable MDIO on GPIO
|
||||||
|
* to use GPIO26 for the "WPS" LED and GPIO27 for the "3G" LED.
|
||||||
|
*/
|
||||||
|
pbl_ar9331_mdio_gpio_enable
|
||||||
|
|
||||||
copy_to_link_location pbl_start
|
copy_to_link_location pbl_start
|
||||||
|
|
||||||
.set pop
|
.set pop
|
||||||
|
|
|
@ -28,11 +28,13 @@ void of_add_memory_bank(struct device_node *node, bool dump, int r,
|
||||||
{
|
{
|
||||||
static char str[12];
|
static char str[12];
|
||||||
|
|
||||||
sprintf(str, "kseg0_ram%d", r);
|
if (IS_ENABLED(CONFIG_MMU)) {
|
||||||
barebox_add_memory_bank(str, KSEG0 | base, size);
|
sprintf(str, "kseg0_ram%d", r);
|
||||||
|
barebox_add_memory_bank(str, KSEG0 | base, size);
|
||||||
sprintf(str, "kseg1_ram%d", r);
|
} else {
|
||||||
barebox_add_memory_bank(str, KSEG1 | base, size);
|
sprintf(str, "kseg1_ram%d", r);
|
||||||
|
barebox_add_memory_bank(str, KSEG1 | base, size);
|
||||||
|
}
|
||||||
|
|
||||||
if (dump)
|
if (dump)
|
||||||
pr_info("%s: %s: 0x%llx@0x%llx\n", node->name, str, size, base);
|
pr_info("%s: %s: 0x%llx@0x%llx\n", node->name, str, size, base);
|
||||||
|
|
|
@ -9,6 +9,8 @@ CONFIG_NMON_USER_START_DELAY=0x5
|
||||||
CONFIG_NMON_HELP=y
|
CONFIG_NMON_HELP=y
|
||||||
CONFIG_PBL_IMAGE=y
|
CONFIG_PBL_IMAGE=y
|
||||||
CONFIG_IMAGE_COMPRESSION_XZKERN=y
|
CONFIG_IMAGE_COMPRESSION_XZKERN=y
|
||||||
|
CONFIG_MMU=y
|
||||||
|
CONFIG_TEXT_BASE=0x82000000
|
||||||
CONFIG_MALLOC_TLSF=y
|
CONFIG_MALLOC_TLSF=y
|
||||||
CONFIG_CMDLINE_EDITING=y
|
CONFIG_CMDLINE_EDITING=y
|
||||||
CONFIG_AUTO_COMPLETE=y
|
CONFIG_AUTO_COMPLETE=y
|
||||||
|
@ -32,6 +34,8 @@ CONFIG_CMD_EDIT=y
|
||||||
CONFIG_CMD_MM=y
|
CONFIG_CMD_MM=y
|
||||||
CONFIG_CMD_CLK=y
|
CONFIG_CMD_CLK=y
|
||||||
CONFIG_CMD_FLASH=y
|
CONFIG_CMD_FLASH=y
|
||||||
|
CONFIG_CMD_GPIO=y
|
||||||
|
CONFIG_CMD_LED=y
|
||||||
CONFIG_CMD_SPI=y
|
CONFIG_CMD_SPI=y
|
||||||
CONFIG_CMD_OF_NODE=y
|
CONFIG_CMD_OF_NODE=y
|
||||||
CONFIG_CMD_OF_PROPERTY=y
|
CONFIG_CMD_OF_PROPERTY=y
|
||||||
|
@ -42,5 +46,9 @@ CONFIG_DRIVER_SPI_ATH79=y
|
||||||
CONFIG_MTD=y
|
CONFIG_MTD=y
|
||||||
# CONFIG_MTD_OOB_DEVICE is not set
|
# CONFIG_MTD_OOB_DEVICE is not set
|
||||||
CONFIG_MTD_M25P80=y
|
CONFIG_MTD_M25P80=y
|
||||||
|
CONFIG_LED=y
|
||||||
|
CONFIG_LED_GPIO=y
|
||||||
|
CONFIG_LED_GPIO_OF=y
|
||||||
|
CONFIG_KEYBOARD_GPIO=y
|
||||||
CONFIG_DIGEST_SHA224_GENERIC=y
|
CONFIG_DIGEST_SHA224_GENERIC=y
|
||||||
CONFIG_DIGEST_SHA256_GENERIC=y
|
CONFIG_DIGEST_SHA256_GENERIC=y
|
||||||
|
|
|
@ -3,6 +3,8 @@ CONFIG_BUILTIN_DTB_NAME="tplink-mr3020"
|
||||||
CONFIG_MACH_MIPS_ATH79=y
|
CONFIG_MACH_MIPS_ATH79=y
|
||||||
CONFIG_PBL_IMAGE=y
|
CONFIG_PBL_IMAGE=y
|
||||||
CONFIG_IMAGE_COMPRESSION_XZKERN=y
|
CONFIG_IMAGE_COMPRESSION_XZKERN=y
|
||||||
|
CONFIG_MMU=y
|
||||||
|
CONFIG_TEXT_BASE=0x81000000
|
||||||
CONFIG_MALLOC_TLSF=y
|
CONFIG_MALLOC_TLSF=y
|
||||||
CONFIG_CMDLINE_EDITING=y
|
CONFIG_CMDLINE_EDITING=y
|
||||||
CONFIG_AUTO_COMPLETE=y
|
CONFIG_AUTO_COMPLETE=y
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
#clock-cells = <1>;
|
#clock-cells = <1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
spi: spi@1f000000{
|
spi: spi@1f000000 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
compatible = "qca,ath79-spi";
|
compatible = "qca,ath79-spi";
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
|
|
||||||
#include "ar9331.dtsi"
|
#include "ar9331.dtsi"
|
||||||
|
#include <dt-bindings/gpio/gpio.h>
|
||||||
|
#include <dt-bindings/input/input.h>
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "Black Swift";
|
model = "Black Swift";
|
||||||
|
@ -13,12 +15,36 @@
|
||||||
aliases {
|
aliases {
|
||||||
spiflash = &spiflash;
|
spiflash = &spiflash;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
buttons {
|
||||||
|
compatible = "gpio-keys";
|
||||||
|
|
||||||
|
s1 {
|
||||||
|
label = "S1";
|
||||||
|
gpios = <&gpio 11 GPIO_ACTIVE_LOW>;
|
||||||
|
linux,code = <KEY_RESTART>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
leds {
|
||||||
|
compatible = "gpio-leds";
|
||||||
|
|
||||||
|
s1 {
|
||||||
|
label = "LED1";
|
||||||
|
gpios = <&gpio 27 GPIO_ACTIVE_LOW>;
|
||||||
|
default-state = "off";
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
&serial0 {
|
&serial0 {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
&gpio {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
&spi {
|
&spi {
|
||||||
num-chipselects = <1>;
|
num-chipselects = <1>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
6
arch/mips/include/asm/cache.h
Normal file
6
arch/mips/include/asm/cache.h
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#ifndef _ASM_MIPS_CACHE_H
|
||||||
|
#define _ASM_MIPS_CACHE_H
|
||||||
|
|
||||||
|
void flush_cache_all(void);
|
||||||
|
|
||||||
|
#endif /* _ASM_MIPS_CACHE_H */
|
36
arch/mips/include/asm/cacheops.h
Normal file
36
arch/mips/include/asm/cacheops.h
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* Cache operations for the cache instruction.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* (C) Copyright 1996, 97, 99, 2002, 03 Ralf Baechle
|
||||||
|
* (C) Copyright 1999 Silicon Graphics, Inc.
|
||||||
|
*/
|
||||||
|
#ifndef __ASM_CACHEOPS_H
|
||||||
|
#define __ASM_CACHEOPS_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Most cache ops are split into a 2 bit field identifying the cache, and a 3
|
||||||
|
* bit field identifying the cache operation.
|
||||||
|
*/
|
||||||
|
#define Cache_I 0x00
|
||||||
|
#define Cache_D 0x01
|
||||||
|
|
||||||
|
#define Index_Writeback_Inv 0x00
|
||||||
|
#define Index_Store_Tag 0x08
|
||||||
|
#define Hit_Invalidate 0x10
|
||||||
|
#define Hit_Writeback_Inv 0x14 /* not with Cache_I though */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Cache Operations available on all MIPS processors with R4000-style caches
|
||||||
|
*/
|
||||||
|
#define Index_Invalidate_I (Cache_I | Index_Writeback_Inv)
|
||||||
|
#define Index_Writeback_Inv_D (Cache_D | Index_Writeback_Inv)
|
||||||
|
#define Index_Store_Tag_I (Cache_I | Index_Store_Tag)
|
||||||
|
#define Index_Store_Tag_D (Cache_D | Index_Store_Tag)
|
||||||
|
#define Hit_Invalidate_D (Cache_D | Hit_Invalidate)
|
||||||
|
#define Hit_Writeback_Inv_D (Cache_D | Hit_Writeback_Inv)
|
||||||
|
|
||||||
|
#endif /* __ASM_CACHEOPS_H */
|
|
@ -1,10 +1,12 @@
|
||||||
#ifndef _ASM_DMA_MAPPING_H
|
#ifndef _ASM_DMA_MAPPING_H
|
||||||
#define _ASM_DMA_MAPPING_H
|
#define _ASM_DMA_MAPPING_H
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
#include <xfuncs.h>
|
#include <xfuncs.h>
|
||||||
#include <asm/addrspace.h>
|
#include <asm/addrspace.h>
|
||||||
#include <asm/types.h>
|
#include <asm/types.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
|
||||||
static inline void *dma_alloc_coherent(size_t size, dma_addr_t *dma_handle)
|
static inline void *dma_alloc_coherent(size_t size, dma_addr_t *dma_handle)
|
||||||
{
|
{
|
||||||
|
@ -12,16 +14,23 @@ static inline void *dma_alloc_coherent(size_t size, dma_addr_t *dma_handle)
|
||||||
|
|
||||||
ret = xmemalign(PAGE_SIZE, size);
|
ret = xmemalign(PAGE_SIZE, size);
|
||||||
|
|
||||||
|
memset(ret, 0, size);
|
||||||
|
|
||||||
if (dma_handle)
|
if (dma_handle)
|
||||||
*dma_handle = CPHYSADDR(ret);
|
*dma_handle = CPHYSADDR(ret);
|
||||||
|
|
||||||
|
dma_flush_range((unsigned long)ret, (unsigned long)(ret + size));
|
||||||
|
|
||||||
return (void *)CKSEG1ADDR(ret);
|
return (void *)CKSEG1ADDR(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void dma_free_coherent(void *vaddr, dma_addr_t dma_handle,
|
static inline void dma_free_coherent(void *vaddr, dma_addr_t dma_handle,
|
||||||
size_t size)
|
size_t size)
|
||||||
{
|
{
|
||||||
free(vaddr);
|
if (IS_ENABLED(CONFIG_MMU))
|
||||||
|
free((void *)CKSEG0ADDR(vaddr));
|
||||||
|
else
|
||||||
|
free(vaddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* _ASM_DMA_MAPPING_H */
|
#endif /* _ASM_DMA_MAPPING_H */
|
||||||
|
|
|
@ -14,6 +14,9 @@
|
||||||
#include <asm/types.h>
|
#include <asm/types.h>
|
||||||
#include <asm/byteorder.h>
|
#include <asm/byteorder.h>
|
||||||
|
|
||||||
|
void dma_flush_range(unsigned long, unsigned long);
|
||||||
|
void dma_inv_range(unsigned long, unsigned long);
|
||||||
|
|
||||||
#define IO_SPACE_LIMIT 0
|
#define IO_SPACE_LIMIT 0
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
|
@ -409,6 +409,14 @@
|
||||||
#define MIPS_CONF1_PC (_ULCAST_(1) << 4)
|
#define MIPS_CONF1_PC (_ULCAST_(1) << 4)
|
||||||
#define MIPS_CONF1_MD (_ULCAST_(1) << 5)
|
#define MIPS_CONF1_MD (_ULCAST_(1) << 5)
|
||||||
#define MIPS_CONF1_C2 (_ULCAST_(1) << 6)
|
#define MIPS_CONF1_C2 (_ULCAST_(1) << 6)
|
||||||
|
#define MIPS_CONF1_DA_SHF 7
|
||||||
|
#define MIPS_CONF1_DA (_ULCAST_(7) << 7)
|
||||||
|
#define MIPS_CONF1_DL_SHF 10
|
||||||
|
#define MIPS_CONF1_DL (_ULCAST_(7) << 10)
|
||||||
|
#define MIPS_CONF1_DS_SHF 13
|
||||||
|
#define MIPS_CONF1_DS (_ULCAST_(7) << 13)
|
||||||
|
#define MIPS_CONF1_IA_SHF 16
|
||||||
|
|
||||||
#define MIPS_CONF1_DA (_ULCAST_(7) << 7)
|
#define MIPS_CONF1_DA (_ULCAST_(7) << 7)
|
||||||
#define MIPS_CONF1_DL (_ULCAST_(7) << 10)
|
#define MIPS_CONF1_DL (_ULCAST_(7) << 10)
|
||||||
#define MIPS_CONF1_DS (_ULCAST_(7) << 13)
|
#define MIPS_CONF1_DS (_ULCAST_(7) << 13)
|
||||||
|
|
|
@ -27,6 +27,8 @@
|
||||||
#include <asm-generic/memory_layout.h>
|
#include <asm-generic/memory_layout.h>
|
||||||
#include <generated/compile.h>
|
#include <generated/compile.h>
|
||||||
#include <generated/utsrelease.h>
|
#include <generated/utsrelease.h>
|
||||||
|
#include <asm/addrspace.h>
|
||||||
|
#include <asm/cacheops.h>
|
||||||
|
|
||||||
.macro pbl_reg_writel val addr
|
.macro pbl_reg_writel val addr
|
||||||
.set push
|
.set push
|
||||||
|
@ -212,4 +214,135 @@ copy_loop_exit:
|
||||||
.set pop
|
.set pop
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
#ifndef CONFIG_SYS_MIPS_CACHE_MODE
|
||||||
|
#define CONFIG_SYS_MIPS_CACHE_MODE CONF_CM_CACHABLE_NONCOHERENT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define INDEX_BASE CKSEG0
|
||||||
|
|
||||||
|
.macro f_fill64 dst, offset, val
|
||||||
|
LONG_S \val, (\offset + 0 * LONGSIZE)(\dst)
|
||||||
|
LONG_S \val, (\offset + 1 * LONGSIZE)(\dst)
|
||||||
|
LONG_S \val, (\offset + 2 * LONGSIZE)(\dst)
|
||||||
|
LONG_S \val, (\offset + 3 * LONGSIZE)(\dst)
|
||||||
|
LONG_S \val, (\offset + 4 * LONGSIZE)(\dst)
|
||||||
|
LONG_S \val, (\offset + 5 * LONGSIZE)(\dst)
|
||||||
|
LONG_S \val, (\offset + 6 * LONGSIZE)(\dst)
|
||||||
|
LONG_S \val, (\offset + 7 * LONGSIZE)(\dst)
|
||||||
|
#if LONGSIZE == 4
|
||||||
|
LONG_S \val, (\offset + 8 * LONGSIZE)(\dst)
|
||||||
|
LONG_S \val, (\offset + 9 * LONGSIZE)(\dst)
|
||||||
|
LONG_S \val, (\offset + 10 * LONGSIZE)(\dst)
|
||||||
|
LONG_S \val, (\offset + 11 * LONGSIZE)(\dst)
|
||||||
|
LONG_S \val, (\offset + 12 * LONGSIZE)(\dst)
|
||||||
|
LONG_S \val, (\offset + 13 * LONGSIZE)(\dst)
|
||||||
|
LONG_S \val, (\offset + 14 * LONGSIZE)(\dst)
|
||||||
|
LONG_S \val, (\offset + 15 * LONGSIZE)(\dst)
|
||||||
|
#endif
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro cache_loop curr, end, line_sz, op
|
||||||
|
10: cache \op, 0(\curr)
|
||||||
|
PTR_ADDU \curr, \curr, \line_sz
|
||||||
|
bne \curr, \end, 10b
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro l1_info sz, line_sz, off
|
||||||
|
.set push
|
||||||
|
.set noat
|
||||||
|
|
||||||
|
mfc0 $1, CP0_CONFIG, 1
|
||||||
|
|
||||||
|
/* detect line size */
|
||||||
|
srl \line_sz, $1, \off + MIPS_CONF1_DL_SHF - MIPS_CONF1_DA_SHF
|
||||||
|
andi \line_sz, \line_sz, (MIPS_CONF1_DL >> MIPS_CONF1_DL_SHF)
|
||||||
|
move \sz, zero
|
||||||
|
beqz \line_sz, 10f
|
||||||
|
li \sz, 2
|
||||||
|
sllv \line_sz, \sz, \line_sz
|
||||||
|
|
||||||
|
/* detect associativity */
|
||||||
|
srl \sz, $1, \off + MIPS_CONF1_DA_SHF - MIPS_CONF1_DA_SHF
|
||||||
|
andi \sz, \sz, (MIPS_CONF1_DA >> MIPS_CONF1_DA_SHF)
|
||||||
|
addi \sz, \sz, 1
|
||||||
|
|
||||||
|
/* sz *= line_sz */
|
||||||
|
mul \sz, \sz, \line_sz
|
||||||
|
|
||||||
|
/* detect log32(sets) */
|
||||||
|
srl $1, $1, \off + MIPS_CONF1_DS_SHF - MIPS_CONF1_DA_SHF
|
||||||
|
andi $1, $1, (MIPS_CONF1_DS >> MIPS_CONF1_DS_SHF)
|
||||||
|
addiu $1, $1, 1
|
||||||
|
andi $1, $1, 0x7
|
||||||
|
|
||||||
|
/* sz <<= log32(sets) */
|
||||||
|
sllv \sz, \sz, $1
|
||||||
|
|
||||||
|
/* sz *= 32 */
|
||||||
|
li $1, 32
|
||||||
|
mul \sz, \sz, $1
|
||||||
|
10:
|
||||||
|
.set pop
|
||||||
|
.endm
|
||||||
|
|
||||||
|
/*
|
||||||
|
* mips_cache_reset - low level initialisation of the primary caches
|
||||||
|
*
|
||||||
|
* This routine initialises the primary caches to ensure that they have good
|
||||||
|
* parity. It must be called by the ROM before any cached locations are used
|
||||||
|
* to prevent the possibility of data with bad parity being written to memory.
|
||||||
|
*
|
||||||
|
* To initialise the instruction cache it is essential that a source of data
|
||||||
|
* with good parity is available. This routine will initialise an area of
|
||||||
|
* memory starting at location zero to be used as a source of parity.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
.macro mips_cache_reset
|
||||||
|
|
||||||
|
l1_info t2, t8, MIPS_CONF1_IA_SHF
|
||||||
|
l1_info t3, t9, MIPS_CONF1_DA_SHF
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The TagLo registers used depend upon the CPU implementation, but the
|
||||||
|
* architecture requires that it is safe for software to write to both
|
||||||
|
* TagLo selects 0 & 2 covering supported cases.
|
||||||
|
*/
|
||||||
|
mtc0 zero, CP0_TAGLO
|
||||||
|
mtc0 zero, CP0_TAGLO, 2
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The caches are probably in an indeterminate state, so we force good
|
||||||
|
* parity into them by doing an invalidate for each line.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize the I-cache first,
|
||||||
|
*/
|
||||||
|
blez t2, 1f
|
||||||
|
PTR_LI t0, INDEX_BASE
|
||||||
|
PTR_ADDU t1, t0, t2
|
||||||
|
/* clear tag to invalidate */
|
||||||
|
cache_loop t0, t1, t8, Index_Store_Tag_I
|
||||||
|
|
||||||
|
/*
|
||||||
|
* then initialize D-cache.
|
||||||
|
*/
|
||||||
|
1: blez t3, 3f
|
||||||
|
PTR_LI t0, INDEX_BASE
|
||||||
|
PTR_ADDU t1, t0, t3
|
||||||
|
/* clear all tags */
|
||||||
|
cache_loop t0, t1, t9, Index_Store_Tag_D
|
||||||
|
|
||||||
|
3: nop
|
||||||
|
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro dcache_enable
|
||||||
|
mfc0 t0, CP0_CONFIG
|
||||||
|
ori t0, CONF_CM_CMASK
|
||||||
|
xori t0, CONF_CM_CMASK
|
||||||
|
ori t0, CONFIG_SYS_MIPS_CACHE_MODE
|
||||||
|
mtc0 t0, CP0_CONFIG
|
||||||
|
.endm
|
||||||
|
|
||||||
#endif /* __ASM_PBL_MACROS_H */
|
#endif /* __ASM_PBL_MACROS_H */
|
||||||
|
|
|
@ -6,6 +6,8 @@ obj-y += ashrdi3.o
|
||||||
obj-y += cpu-probe.o
|
obj-y += cpu-probe.o
|
||||||
obj-y += traps.o
|
obj-y += traps.o
|
||||||
obj-y += genex.o
|
obj-y += genex.o
|
||||||
|
obj-y += shutdown.o
|
||||||
|
obj-y += dma-default.o
|
||||||
|
|
||||||
obj-$(CONFIG_MIPS_OPTIMIZED_STRING_FUNCTIONS) += memcpy.o
|
obj-$(CONFIG_MIPS_OPTIMIZED_STRING_FUNCTIONS) += memcpy.o
|
||||||
obj-$(CONFIG_MIPS_OPTIMIZED_STRING_FUNCTIONS) += memset.o
|
obj-$(CONFIG_MIPS_OPTIMIZED_STRING_FUNCTIONS) += memset.o
|
||||||
|
|
|
@ -10,10 +10,81 @@
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/mipsregs.h>
|
#include <asm/mipsregs.h>
|
||||||
|
#include <asm/cache.h>
|
||||||
|
#include <asm/cacheops.h>
|
||||||
#include <asm/cpu.h>
|
#include <asm/cpu.h>
|
||||||
#include <asm/cpu-info.h>
|
#include <asm/cpu-info.h>
|
||||||
#include <asm/bitops.h>
|
#include <asm/bitops.h>
|
||||||
|
|
||||||
|
#define cache_op(op,addr) \
|
||||||
|
__asm__ __volatile__( \
|
||||||
|
" .set push \n" \
|
||||||
|
" .set noreorder \n" \
|
||||||
|
" .set mips3\n\t \n" \
|
||||||
|
" cache %0, %1 \n" \
|
||||||
|
" .set pop \n" \
|
||||||
|
: \
|
||||||
|
: "i" (op), "R" (*(unsigned char *)(addr)))
|
||||||
|
|
||||||
|
#define __BUILD_BLAST_CACHE_RANGE(pfx, desc, hitop) \
|
||||||
|
static inline void blast_##pfx##cache##_range(unsigned long start, \
|
||||||
|
unsigned long end) \
|
||||||
|
{ \
|
||||||
|
unsigned long lsize = current_cpu_data.desc.linesz; \
|
||||||
|
unsigned long addr = start & ~(lsize - 1); \
|
||||||
|
unsigned long aend = (end - 1) & ~(lsize - 1); \
|
||||||
|
\
|
||||||
|
if (current_cpu_data.desc.flags & MIPS_CACHE_NOT_PRESENT) \
|
||||||
|
return; \
|
||||||
|
\
|
||||||
|
while (1) { \
|
||||||
|
cache_op(hitop, addr); \
|
||||||
|
if (addr == aend) \
|
||||||
|
break; \
|
||||||
|
addr += lsize; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
__BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D)
|
||||||
|
__BUILD_BLAST_CACHE_RANGE(inv_d, dcache, Hit_Invalidate_D)
|
||||||
|
|
||||||
|
void flush_cache_all(void)
|
||||||
|
{
|
||||||
|
struct cpuinfo_mips *c = ¤t_cpu_data;
|
||||||
|
unsigned long lsize;
|
||||||
|
unsigned long addr;
|
||||||
|
unsigned long aend;
|
||||||
|
unsigned int icache_size, dcache_size;
|
||||||
|
|
||||||
|
dcache_size = c->dcache.waysize * c->dcache.ways;
|
||||||
|
lsize = c->dcache.linesz;
|
||||||
|
aend = (KSEG0 + dcache_size - 1) & ~(lsize - 1);
|
||||||
|
for (addr = KSEG0; addr <= aend; addr += lsize)
|
||||||
|
cache_op(Index_Writeback_Inv_D, addr);
|
||||||
|
|
||||||
|
icache_size = c->icache.waysize * c->icache.ways;
|
||||||
|
lsize = c->icache.linesz;
|
||||||
|
aend = (KSEG0 + icache_size - 1) & ~(lsize - 1);
|
||||||
|
for (addr = KSEG0; addr <= aend; addr += lsize)
|
||||||
|
cache_op(Index_Invalidate_I, addr);
|
||||||
|
|
||||||
|
/* secondatory cache skipped */
|
||||||
|
}
|
||||||
|
|
||||||
|
void dma_flush_range(unsigned long start, unsigned long end)
|
||||||
|
{
|
||||||
|
blast_dcache_range(start, end);
|
||||||
|
|
||||||
|
/* secondatory cache skipped */
|
||||||
|
}
|
||||||
|
|
||||||
|
void dma_inv_range(unsigned long start, unsigned long end)
|
||||||
|
{
|
||||||
|
blast_inv_dcache_range(start, end);
|
||||||
|
|
||||||
|
/* secondatory cache skipped */
|
||||||
|
}
|
||||||
|
|
||||||
void r4k_cache_init(void);
|
void r4k_cache_init(void);
|
||||||
|
|
||||||
static void probe_pcache(void)
|
static void probe_pcache(void)
|
||||||
|
@ -91,7 +162,6 @@ static void probe_pcache(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CONFIG_M (1 << 31)
|
|
||||||
#define CONFIG2_SS_OFFSET 8
|
#define CONFIG2_SS_OFFSET 8
|
||||||
#define CONFIG2_SL_OFFSET 4
|
#define CONFIG2_SL_OFFSET 4
|
||||||
#define CONFIG2_SA_OFFSET 0
|
#define CONFIG2_SA_OFFSET 0
|
||||||
|
@ -101,10 +171,10 @@ static void probe_scache(void)
|
||||||
unsigned int config2, config1, config = read_c0_config();
|
unsigned int config2, config1, config = read_c0_config();
|
||||||
unsigned int ss, sl, sa;
|
unsigned int ss, sl, sa;
|
||||||
|
|
||||||
if ((config & CONFIG_M) == 0)
|
if ((config & MIPS_CONF_M) == 0)
|
||||||
goto noscache;
|
goto noscache;
|
||||||
config1 = read_c0_config1();
|
config1 = read_c0_config1();
|
||||||
if ((config1 & CONFIG_M) == 0)
|
if ((config1 & MIPS_CONF_M) == 0)
|
||||||
goto noscache;
|
goto noscache;
|
||||||
config2 = read_c0_config2();
|
config2 = read_c0_config2();
|
||||||
ss = 0xf & (config2 >> CONFIG2_SS_OFFSET);
|
ss = 0xf & (config2 >> CONFIG2_SS_OFFSET);
|
||||||
|
|
57
arch/mips/lib/dma-default.c
Normal file
57
arch/mips/lib/dma-default.c
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2015, 2016 Peter Mamonov <pmamonov@gmail.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License version 2
|
||||||
|
* as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <dma.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
|
||||||
|
#if defined(CONFIG_CPU_MIPS32) || \
|
||||||
|
defined(CONFIG_CPU_MIPS64)
|
||||||
|
static inline void __dma_sync_mips(unsigned long addr, size_t size,
|
||||||
|
enum dma_data_direction direction)
|
||||||
|
{
|
||||||
|
switch (direction) {
|
||||||
|
case DMA_TO_DEVICE:
|
||||||
|
dma_flush_range(addr, addr + size);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DMA_FROM_DEVICE:
|
||||||
|
dma_inv_range(addr, addr + size);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DMA_BIDIRECTIONAL:
|
||||||
|
dma_flush_range(addr, addr + size);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
BUG();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline void __dma_sync_mips(void *addr, size_t size,
|
||||||
|
enum dma_data_direction direction)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void dma_sync_single_for_cpu(unsigned long address, size_t size,
|
||||||
|
enum dma_data_direction dir)
|
||||||
|
{
|
||||||
|
__dma_sync_mips(address, size, dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dma_sync_single_for_device(unsigned long address, size_t size,
|
||||||
|
enum dma_data_direction dir)
|
||||||
|
{
|
||||||
|
__dma_sync_mips(address, size, dir);
|
||||||
|
}
|
12
arch/mips/lib/shutdown.c
Normal file
12
arch/mips/lib/shutdown.c
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
/**
|
||||||
|
* This function is called by shutdown_barebox to get a clean
|
||||||
|
* memory/cache state.
|
||||||
|
*/
|
||||||
|
#include <init.h>
|
||||||
|
#include <asm/cache.h>
|
||||||
|
|
||||||
|
static void arch_shutdown(void)
|
||||||
|
{
|
||||||
|
flush_cache_all();
|
||||||
|
}
|
||||||
|
archshutdown_exitcall(arch_shutdown);
|
|
@ -179,4 +179,99 @@
|
||||||
| AR933X_GPIO_FUNC_RSRV15, GPIO_FUNC
|
| AR933X_GPIO_FUNC_RSRV15, GPIO_FUNC
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
#define RESET_REG_BOOTSTRAP ((KSEG1 | AR71XX_RESET_BASE) \
|
||||||
|
| AR933X_RESET_REG_BOOTSTRAP)
|
||||||
|
|
||||||
|
.macro pbl_ar9331_mdio_gpio_enable
|
||||||
|
/* Bit 18 enables MDC and MDIO function on GPIO26 and GPIO28 */
|
||||||
|
pbl_reg_set (1 << 18), RESET_REG_BOOTSTRAP
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro hornet_mips24k_cp0_setup
|
||||||
|
.set push
|
||||||
|
.set noreorder
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Clearing CP0 registers - This is generally required for the MIPS-24k
|
||||||
|
* core used by Atheros.
|
||||||
|
*/
|
||||||
|
mtc0 zero, CP0_INDEX
|
||||||
|
mtc0 zero, CP0_ENTRYLO0
|
||||||
|
mtc0 zero, CP0_ENTRYLO1
|
||||||
|
mtc0 zero, CP0_CONTEXT
|
||||||
|
mtc0 zero, CP0_PAGEMASK
|
||||||
|
mtc0 zero, CP0_WIRED
|
||||||
|
mtc0 zero, CP0_INFO
|
||||||
|
mtc0 zero, CP0_COUNT
|
||||||
|
mtc0 zero, CP0_ENTRYHI
|
||||||
|
mtc0 zero, CP0_COMPARE
|
||||||
|
|
||||||
|
li t0, ST0_CU0 | ST0_ERL
|
||||||
|
mtc0 t0, CP0_STATUS
|
||||||
|
|
||||||
|
mtc0 zero, CP0_CAUSE
|
||||||
|
mtc0 zero, CP0_EPC
|
||||||
|
|
||||||
|
li t0, CONF_CM_UNCACHED
|
||||||
|
mtc0 t0, CP0_CONFIG
|
||||||
|
|
||||||
|
mtc0 zero, CP0_LLADDR
|
||||||
|
mtc0 zero, CP0_WATCHLO
|
||||||
|
mtc0 zero, CP0_WATCHHI
|
||||||
|
mtc0 zero, CP0_XCONTEXT
|
||||||
|
mtc0 zero, CP0_FRAMEMASK
|
||||||
|
mtc0 zero, CP0_DIAGNOSTIC
|
||||||
|
mtc0 zero, CP0_DEBUG
|
||||||
|
mtc0 zero, CP0_DEPC
|
||||||
|
mtc0 zero, CP0_PERFORMANCE
|
||||||
|
mtc0 zero, CP0_ECC
|
||||||
|
mtc0 zero, CP0_CACHEERR
|
||||||
|
mtc0 zero, CP0_TAGLO
|
||||||
|
|
||||||
|
.set pop
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro hornet_1_1_war
|
||||||
|
.set push
|
||||||
|
.set noreorder
|
||||||
|
|
||||||
|
/*
|
||||||
|
* WAR: Hornet 1.1 currently need a reset once we boot to let the resetb has
|
||||||
|
* enough time to stable, so that trigger reset at 1st boot, system team
|
||||||
|
* is investigaing the issue, will remove in short
|
||||||
|
*/
|
||||||
|
|
||||||
|
li t7, 0xbd000000
|
||||||
|
lw t8, 0(t7)
|
||||||
|
li t9, 0x12345678
|
||||||
|
|
||||||
|
/* if value of 0xbd000000 != 0x12345678, go to do_reset */
|
||||||
|
bne t8, t9, do_reset
|
||||||
|
nop
|
||||||
|
|
||||||
|
li t9, 0xffffffff
|
||||||
|
sw t9, 0(t7)
|
||||||
|
b normal_path
|
||||||
|
nop
|
||||||
|
|
||||||
|
do_reset:
|
||||||
|
/* put 0x12345678 into 0xbd000000 */
|
||||||
|
sw t9, 0(t7)
|
||||||
|
|
||||||
|
/* reset register 0x1806001c */
|
||||||
|
li t7, 0xb806001c
|
||||||
|
lw t8, 0(t7)
|
||||||
|
/* bit24, fullchip reset */
|
||||||
|
li t9, 0x1000000
|
||||||
|
or t8, t8, t9
|
||||||
|
sw t8, 0(t7)
|
||||||
|
|
||||||
|
do_reset_loop:
|
||||||
|
b do_reset_loop
|
||||||
|
nop
|
||||||
|
|
||||||
|
normal_path:
|
||||||
|
.set pop
|
||||||
|
.endm
|
||||||
|
|
||||||
#endif /* __ASM_MACH_ATH79_PBL_MACROS_H */
|
#endif /* __ASM_MACH_ATH79_PBL_MACROS_H */
|
||||||
|
|
Loading…
Reference in a new issue