layerscape: add 64b/32b target for ls1043ardb device
Add support for NXP layerscape ls1043ardb 64b/32b Dev board. LS1043a is an SoC with 4x64-bit up to 1.6 GHz ARMv8 A53 cores. ls1043ardb support features as: 2GB DDR4, 128MB NOR/512MB NAND, USB3.0, eSDHC, I2C, GPIO, PCIe/Mini-PCIe, 6x1G/1x10G network port, etc. 64b/32b ls1043ardb target is using 4.4 kernel, and rcw/u-boot/fman images from NXP QorIQ SDK release. All of 4.4 kernel patches porting from SDK release or upstream. QorIQ SDK ISOs can be downloaded from this location: http://www.nxp.com/products/software-and-tools/run-time-software/linux-sdk/linux-sdk-for-qoriq-processors:SDKLINUX Signed-off-by: Yutang Jiang <yutang.jiang@nxp.com>
This commit is contained in:
parent
a34f96d6cf
commit
c6c731fe31
86 changed files with 171202 additions and 0 deletions
87
package/boot/uboot-layerscape-32b/Makefile
Normal file
87
package/boot/uboot-layerscape-32b/Makefile
Normal file
|
@ -0,0 +1,87 @@
|
|||
#
|
||||
# Copyright (C) 2016 Jiang Yutang <jiangyutang1978@gmail.com>
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/image.mk
|
||||
|
||||
PKG_NAME:=uboot-layerscape-32bit
|
||||
PKG_VERSION:=v1.0
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_SOURCE_URL:=https://github.com/fsl-jyt/uboot-ls-32b.git
|
||||
PKG_SOURCE_VERSION:=4fbf7e76eb7671d9822d0310319f6ad70d324547
|
||||
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
PKG_LICENSE:=GPL-2.0 GPL-2.0+
|
||||
PKG_LICENSE_FILES:=Licenses/README
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define uboot/Default
|
||||
TITLE:=
|
||||
CONFIG:=
|
||||
endef
|
||||
|
||||
define uboot/ls1043ardb
|
||||
TITLE:=U-Boot binary $(PKG_NAME)-$(PKG_VERSION) for NXP ls1043ardb 32b Dev Board
|
||||
CONFIG=ls1043ardb-uboot.bin
|
||||
endef
|
||||
|
||||
UBOOTS := \
|
||||
ls1043ardb
|
||||
|
||||
define Package/uboot/template
|
||||
define Package/uboot-layerscape-32b-$(1)
|
||||
SECTION:=boot
|
||||
CATEGORY:=Boot Loaders
|
||||
DEPENDS:= @TARGET_layerscape_32b
|
||||
TITLE:=$(2)
|
||||
URL:=https://github.com/fsl-jyt/uboot-ls-32b.git
|
||||
VARIANT:=$(1)
|
||||
MAINTAINER:=Jiang Yutang <jiangyutang1978@gmail.com>
|
||||
endef
|
||||
endef
|
||||
|
||||
define BuildUBootPackage
|
||||
$(eval $(uboot/Default))
|
||||
$(eval $(uboot/$(1)))
|
||||
$(call Package/uboot/template,$(1),$(TITLE))
|
||||
endef
|
||||
|
||||
ifdef BUILD_VARIANT
|
||||
$(eval $(call uboot/$(BUILD_VARIANT)))
|
||||
UBOOT_CONFIG:=$(if $(CONFIG),$(CONFIG),$(BUILD_VARIANT))
|
||||
endif
|
||||
|
||||
define Build/Configure
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
endef
|
||||
|
||||
define Package/uboot/install/default
|
||||
$(CP) $(PKG_BUILD_DIR)/$(UBOOT_CONFIG) $(KDIR)/$(1)-32b-uboot.bin
|
||||
endef
|
||||
|
||||
define Package/uboot/install/template
|
||||
define Package/uboot-layerscape-32b-$(1)/install
|
||||
$(call Package/uboot/install/default,$(2))
|
||||
endef
|
||||
endef
|
||||
|
||||
$(foreach u,$(UBOOTS), \
|
||||
$(eval $(call Package/uboot/install/template,$(u),$(u))) \
|
||||
)
|
||||
|
||||
$(foreach u,$(UBOOTS), \
|
||||
$(eval $(call BuildUBootPackage,$(u))) \
|
||||
$(eval $(call BuildPackage,uboot-layerscape-32b-$(u))) \
|
||||
)
|
90
package/boot/uboot-layerscape/Makefile
Normal file
90
package/boot/uboot-layerscape/Makefile
Normal file
|
@ -0,0 +1,90 @@
|
|||
#
|
||||
# Copyright (C) 2016 Jiang Yutang <jiangyutang1978@gmail.com>
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/image.mk
|
||||
|
||||
PKG_NAME:=fsl-sdk
|
||||
PKG_VERSION:=v2.0
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
||||
PKG_SOURCE_URL:= \
|
||||
http://git.freescale.com/git/cgit.cgi/ppc/sdk/u-boot.git/snapshot
|
||||
PKG_MD5SUM:=14f7ccc757bfa71c9b7fd68d24051231
|
||||
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/u-boot_$(PKG_NAME)-$(PKG_VERSION)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
PKG_LICENSE:=GPL-2.0 GPL-2.0+
|
||||
PKG_LICENSE_FILES:=Licenses/README
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define uboot/Default
|
||||
TITLE:=
|
||||
CONFIG:=
|
||||
IMAGE:=
|
||||
endef
|
||||
|
||||
define uboot/ls1043ardb
|
||||
TITLE:=U-Boot $(PKG_NAME)-$(PKG_VERSION) for NXP ls1043ardb 64b Dev Board
|
||||
CONFIG=ls1043ardb
|
||||
endef
|
||||
|
||||
UBOOTS := \
|
||||
ls1043ardb
|
||||
|
||||
define Package/uboot/template
|
||||
define Package/uboot-layerscape-64b-$(1)
|
||||
SECTION:=boot
|
||||
CATEGORY:=Boot Loaders
|
||||
DEPENDS:= @TARGET_layerscape_64b
|
||||
TITLE:=$(2)
|
||||
URL:=http://git.freescale.com/git/cgit.cgi/ppc/sdk/u-boot.git/snapshot
|
||||
VARIANT:=$(1)
|
||||
MAINTAINER:=Jiang Yutang <jiangyutang1978@gmail.com>
|
||||
endef
|
||||
endef
|
||||
|
||||
define BuildUBootPackage
|
||||
$(eval $(uboot/Default))
|
||||
$(eval $(uboot/$(1)))
|
||||
$(call Package/uboot/template,$(1),$(TITLE))
|
||||
endef
|
||||
|
||||
ifdef BUILD_VARIANT
|
||||
$(eval $(call uboot/$(BUILD_VARIANT)))
|
||||
UBOOT_CONFIG:=$(if $(CONFIG),$(CONFIG),$(BUILD_VARIANT))
|
||||
UBOOT_IMAGE:=$(if $(IMAGE),$(IMAGE),u-boot-dtb.bin)
|
||||
endif
|
||||
|
||||
define Build/Configure
|
||||
+$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \
|
||||
$(UBOOT_CONFIG)_config
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
+$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \
|
||||
CROSS_COMPILE=$(TARGET_CROSS) DTC=$(LINUX_DIR)/scripts/dtc/dtc
|
||||
endef
|
||||
|
||||
define Package/uboot/install/default
|
||||
$(CP) $(PKG_BUILD_DIR)/$(UBOOT_IMAGE) $(KDIR)/$(1)-64b-uboot.bin
|
||||
endef
|
||||
|
||||
define Package/uboot/install/template
|
||||
define Package/uboot-layerscape-64b-$(1)/install
|
||||
$(call Package/uboot/install/default,$(2))
|
||||
endef
|
||||
endef
|
||||
|
||||
$(foreach u,$(UBOOTS), \
|
||||
$(eval $(call Package/uboot/install/template,$(u),$(u))) \
|
||||
)
|
||||
|
||||
$(foreach u,$(UBOOTS), \
|
||||
$(eval $(call BuildUBootPackage,$(u))) \
|
||||
$(eval $(call BuildPackage,uboot-layerscape-64b-$(u))) \
|
||||
)
|
|
@ -0,0 +1,214 @@
|
|||
From e03f571b1e9564ca422134b2013d80c8373c9db2 Mon Sep 17 00:00:00 2001
|
||||
From: Alison Wang <b18965@freescale.com>
|
||||
Date: Fri, 13 May 2016 10:19:24 +0800
|
||||
Subject: [PATCH 01/93] armv8: Support loading 32-bit OS in AArch32 execution
|
||||
state
|
||||
|
||||
To support loading a 32-bit OS, the execution state will change from
|
||||
AArch64 to AArch32 when jumping to kernel.
|
||||
|
||||
The architecture information will be got through checking FIT
|
||||
image, then U-Boot will load 32-bit OS or 64-bit OS automatically.
|
||||
|
||||
Signed-off-by: Ebony Zhu <ebony.zhu@nxp.com>
|
||||
Signed-off-by: Alison Wang <alison.wang@nxp.com>
|
||||
Signed-off-by: Chenhui Zhao <chenhui.zhao@nxp.com>
|
||||
---
|
||||
arch/arm/cpu/armv8/transition.S | 100 +++++++++++++++++++++++++++++++++++++++
|
||||
arch/arm/include/asm/system.h | 2 +
|
||||
arch/arm/lib/bootm.c | 20 +++++++-
|
||||
common/image-fit.c | 12 ++++-
|
||||
4 files changed, 131 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/cpu/armv8/transition.S b/arch/arm/cpu/armv8/transition.S
|
||||
index 253a39b..9d7a17a 100644
|
||||
--- a/arch/arm/cpu/armv8/transition.S
|
||||
+++ b/arch/arm/cpu/armv8/transition.S
|
||||
@@ -21,3 +21,103 @@ ENTRY(armv8_switch_to_el1)
|
||||
0: ret
|
||||
1: armv8_switch_to_el1_m x0, x1
|
||||
ENDPROC(armv8_switch_to_el1)
|
||||
+
|
||||
+/*
|
||||
+ * x0: kernel entry point
|
||||
+ * x1: machine nr
|
||||
+ * x2: fdt address
|
||||
+ */
|
||||
+ENTRY(armv8_switch_to_el2_aarch32)
|
||||
+ switch_el x3, 1f, 0f, 0f
|
||||
+0: ret
|
||||
+1:
|
||||
+ mov x7, x0
|
||||
+ mov x8, x1
|
||||
+ mov x9, x2
|
||||
+
|
||||
+ /* 32bit EL2 | HCE | SMD | RES1 (Bits[5:4]) | Non-secure EL0/EL1 */
|
||||
+ mov x1, 0x1b1
|
||||
+ msr scr_el3, x1
|
||||
+ msr cptr_el3, xzr /* Disable coprocessor traps to EL3 */
|
||||
+ mov x1, 0x33ff
|
||||
+ msr cptr_el2, x1 /* Disable coprocessor traps to EL2 */
|
||||
+
|
||||
+ /* Initialize Generic Timers */
|
||||
+ msr cntvoff_el2, xzr
|
||||
+
|
||||
+ mov x1, #0x0830
|
||||
+ movk x1, #0x30c5, lsl #16
|
||||
+ msr sctlr_el2, x1
|
||||
+
|
||||
+ /* Return to AArch32 Hypervisor mode */
|
||||
+ mov x1, sp
|
||||
+ msr sp_el2, x1
|
||||
+ mrs x1, vbar_el3
|
||||
+ msr vbar_el2, x1 /* Migrate VBAR */
|
||||
+ mov x1, #0x1da
|
||||
+ msr spsr_el3, x1
|
||||
+ msr elr_el3, x7
|
||||
+
|
||||
+ mov x0, #0
|
||||
+ mov x1, x8
|
||||
+ mov x2, x9
|
||||
+
|
||||
+ eret
|
||||
+ENDPROC(armv8_switch_to_el2_aarch32)
|
||||
+
|
||||
+/*
|
||||
+ * x0: kernel entry point
|
||||
+ * x1: machine nr
|
||||
+ * x2: fdt address
|
||||
+ */
|
||||
+ENTRY(armv8_switch_to_el1_aarch32)
|
||||
+ switch_el x3, 0f, 1f, 0f
|
||||
+0: ret
|
||||
+1:
|
||||
+ mov x7, x0
|
||||
+ mov x8, x1
|
||||
+ mov x9, x2
|
||||
+
|
||||
+ /* Initialize Generic Timers */
|
||||
+ mrs x0, cnthctl_el2
|
||||
+ orr x0, x0, #0x3 /* Enable EL1 access to timers */
|
||||
+ msr cnthctl_el2, x0
|
||||
+ msr cntvoff_el2, xzr
|
||||
+
|
||||
+ /* Initialize MPID/MPIDR registers */
|
||||
+ mrs x0, midr_el1
|
||||
+ mrs x1, mpidr_el1
|
||||
+ msr vpidr_el2, x0
|
||||
+ msr vmpidr_el2, x1
|
||||
+
|
||||
+ /* Disable coprocessor traps */
|
||||
+ mov x0, #0x33ff
|
||||
+ msr cptr_el2, x0 /* Disable coprocessor traps to EL2 */
|
||||
+ msr hstr_el2, xzr /* Disable coprocessor traps to EL2 */
|
||||
+ mov x0, #3 << 20
|
||||
+ msr cpacr_el1, x0 /* Enable FP/SIMD at EL1 */
|
||||
+
|
||||
+ /* Initialize HCR_EL2 */
|
||||
+ mov x0, #(0 << 31) /* 32bit EL1 */
|
||||
+ orr x0, x0, #(1 << 29) /* Disable HVC */
|
||||
+ msr hcr_el2, x0
|
||||
+
|
||||
+ mov x0, #0x0800
|
||||
+ movk x0, #0x30d0, lsl #16
|
||||
+ msr sctlr_el1, x0
|
||||
+
|
||||
+ /* Return to AArch32 Supervisor mode */
|
||||
+ mov x0, sp
|
||||
+ msr sp_el1, x0 /* Migrate SP */
|
||||
+ mrs x0, vbar_el2
|
||||
+ msr vbar_el1, x0 /* Migrate VBAR */
|
||||
+ mov x0, #0x1d3
|
||||
+ msr spsr_el2, x0
|
||||
+ msr elr_el2, x7
|
||||
+
|
||||
+ mov x0, #0
|
||||
+ mov x1, x8
|
||||
+ mov x2, x9
|
||||
+
|
||||
+ eret
|
||||
+ENDPROC(armv8_switch_to_el1_aarch32)
|
||||
diff --git a/arch/arm/include/asm/system.h b/arch/arm/include/asm/system.h
|
||||
index 71b3108..0ecbcf7 100644
|
||||
--- a/arch/arm/include/asm/system.h
|
||||
+++ b/arch/arm/include/asm/system.h
|
||||
@@ -81,6 +81,8 @@ int __asm_flush_l3_cache(void);
|
||||
|
||||
void armv8_switch_to_el2(void);
|
||||
void armv8_switch_to_el1(void);
|
||||
+void armv8_switch_to_el2_aarch32(u64 entry_point, u64 mach_nr, u64 fdt_addr);
|
||||
+void armv8_switch_to_el1_aarch32(u64 entry_point, u64 mach_nr, u64 fdt_addr);
|
||||
void gic_init(void);
|
||||
void gic_send_sgi(unsigned long sgino);
|
||||
void wait_for_wakeup(void);
|
||||
diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c
|
||||
index a477cae..36f2cb0 100644
|
||||
--- a/arch/arm/lib/bootm.c
|
||||
+++ b/arch/arm/lib/bootm.c
|
||||
@@ -276,8 +276,24 @@ static void boot_jump_linux(bootm_headers_t *images, int flag)
|
||||
announce_and_cleanup(fake);
|
||||
|
||||
if (!fake) {
|
||||
- do_nonsec_virt_switch();
|
||||
- kernel_entry(images->ft_addr, NULL, NULL, NULL);
|
||||
+ if ((IH_ARCH_DEFAULT == IH_ARCH_ARM64) &&
|
||||
+ (images->os.arch == IH_ARCH_ARM)) {
|
||||
+ smp_kick_all_cpus();
|
||||
+ dcache_disable();
|
||||
+#ifdef CONFIG_ARMV8_SWITCH_TO_EL1
|
||||
+ armv8_switch_to_el2();
|
||||
+ armv8_switch_to_el1_aarch32((u64)images->ep,
|
||||
+ (u64)gd->bd->bi_arch_number,
|
||||
+ (u64)images->ft_addr);
|
||||
+#else
|
||||
+ armv8_switch_to_el2_aarch32((u64)images->ep,
|
||||
+ (u64)gd->bd->bi_arch_number,
|
||||
+ (u64)images->ft_addr);
|
||||
+#endif
|
||||
+ } else {
|
||||
+ do_nonsec_virt_switch();
|
||||
+ kernel_entry(images->ft_addr, NULL, NULL, NULL);
|
||||
+ }
|
||||
}
|
||||
#else
|
||||
unsigned long machid = gd->bd->bi_arch_number;
|
||||
diff --git a/common/image-fit.c b/common/image-fit.c
|
||||
index c531ee7..0d54f71 100644
|
||||
--- a/common/image-fit.c
|
||||
+++ b/common/image-fit.c
|
||||
@@ -1144,7 +1144,8 @@ int fit_image_check_arch(const void *fit, int noffset, uint8_t arch)
|
||||
if (fit_image_get_arch(fit, noffset, &image_arch))
|
||||
return 0;
|
||||
return (arch == image_arch) ||
|
||||
- (arch == IH_ARCH_I386 && image_arch == IH_ARCH_X86_64);
|
||||
+ (arch == IH_ARCH_I386 && image_arch == IH_ARCH_X86_64) ||
|
||||
+ (arch == IH_ARCH_ARM64 && image_arch == IH_ARCH_ARM);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1567,6 +1568,9 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
|
||||
int type_ok, os_ok;
|
||||
ulong load, data, len;
|
||||
uint8_t os;
|
||||
+#ifndef USE_HOSTCC
|
||||
+ uint8_t os_arch;
|
||||
+#endif
|
||||
const char *prop_name;
|
||||
int ret;
|
||||
|
||||
@@ -1650,6 +1654,12 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
|
||||
return -ENOEXEC;
|
||||
}
|
||||
#endif
|
||||
+
|
||||
+#ifndef USE_HOSTCC
|
||||
+ fit_image_get_arch(fit, noffset, &os_arch);
|
||||
+ images->os.arch = os_arch;
|
||||
+#endif
|
||||
+
|
||||
if (image_type == IH_TYPE_FLATDT &&
|
||||
!fit_image_check_comp(fit, noffset, IH_COMP_NONE)) {
|
||||
puts("FDT image is compressed");
|
||||
--
|
||||
1.7.9.5
|
||||
|
|
@ -0,0 +1,141 @@
|
|||
From 014f9196e18f4157232d0521f3a7502e7dbbb974 Mon Sep 17 00:00:00 2001
|
||||
From: Alison Wang <b18965@freescale.com>
|
||||
Date: Fri, 13 May 2016 13:28:07 +0800
|
||||
Subject: [PATCH 02/93] armv8: SMP support for loading 32-bit OS
|
||||
|
||||
Spin-table method is used for secondary cores to load 32-bit OS. The
|
||||
architecture information will be got through checking FIT image and
|
||||
saved in the os_arch element of spin-table, then the secondary cores
|
||||
will check os_arch and jump to 32-bit OS or 64-bit OS automatically.
|
||||
|
||||
Signed-off-by: Alison Wang <alison.wang@nxp.com>
|
||||
Signed-off-by: Chenhui Zhao <chenhui.zhao@nxp.com>
|
||||
---
|
||||
arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S | 21 +++++++++++++++++++++
|
||||
arch/arm/cpu/armv8/fsl-layerscape/mp.c | 10 ++++++++++
|
||||
arch/arm/include/asm/arch-fsl-layerscape/mp.h | 6 ++++++
|
||||
arch/arm/lib/bootm.c | 5 +++++
|
||||
4 files changed, 42 insertions(+)
|
||||
|
||||
diff --git a/arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S b/arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S
|
||||
index 9c69ed1..93f4a65 100644
|
||||
--- a/arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S
|
||||
+++ b/arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S
|
||||
@@ -13,6 +13,7 @@
|
||||
#ifdef CONFIG_MP
|
||||
#include <asm/arch/mp.h>
|
||||
#endif
|
||||
+#include <asm/u-boot.h>
|
||||
|
||||
ENTRY(lowlevel_init)
|
||||
mov x29, lr /* Save LR */
|
||||
@@ -320,6 +321,11 @@ ENTRY(secondary_boot_func)
|
||||
gic_wait_for_interrupt_m x0, w1
|
||||
#endif
|
||||
|
||||
+ ldr x5, [x11, #24]
|
||||
+ ldr x6, =IH_ARCH_DEFAULT
|
||||
+ cmp x6, x5
|
||||
+ b.ne slave_cpu
|
||||
+
|
||||
bl secondary_switch_to_el2
|
||||
#ifdef CONFIG_ARMV8_SWITCH_TO_EL1
|
||||
bl secondary_switch_to_el1
|
||||
@@ -337,6 +343,21 @@ slave_cpu:
|
||||
tbz x1, #25, cpu_is_le
|
||||
rev x0, x0 /* BE to LE conversion */
|
||||
cpu_is_le:
|
||||
+
|
||||
+ ldr x5, [x11, #24]
|
||||
+ ldr x6, =IH_ARCH_DEFAULT
|
||||
+ cmp x6, x5
|
||||
+ b.eq 1f
|
||||
+
|
||||
+#ifdef CONFIG_ARMV8_SWITCH_TO_EL1
|
||||
+ bl secondary_switch_to_el2
|
||||
+ ldr x0, [x11]
|
||||
+ bl armv8_switch_to_el1_aarch32
|
||||
+#else
|
||||
+ bl armv8_switch_to_el2_aarch32
|
||||
+#endif
|
||||
+
|
||||
+1:
|
||||
br x0 /* branch to the given address */
|
||||
ENDPROC(secondary_boot_func)
|
||||
|
||||
diff --git a/arch/arm/cpu/armv8/fsl-layerscape/mp.c b/arch/arm/cpu/armv8/fsl-layerscape/mp.c
|
||||
index df7ffb8..dd91550 100644
|
||||
--- a/arch/arm/cpu/armv8/fsl-layerscape/mp.c
|
||||
+++ b/arch/arm/cpu/armv8/fsl-layerscape/mp.c
|
||||
@@ -22,6 +22,16 @@ phys_addr_t determine_mp_bootpg(void)
|
||||
return (phys_addr_t)&secondary_boot_code;
|
||||
}
|
||||
|
||||
+void update_os_arch_secondary_cores(uint8_t os_arch)
|
||||
+{
|
||||
+ u64 *table = get_spin_tbl_addr();
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 1; i < CONFIG_MAX_CPUS; i++)
|
||||
+ table[i * WORDS_PER_SPIN_TABLE_ENTRY +
|
||||
+ SPIN_TABLE_ELEM_OS_ARCH_IDX] = os_arch;
|
||||
+}
|
||||
+
|
||||
int fsl_layerscape_wake_seconday_cores(void)
|
||||
{
|
||||
struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
|
||||
diff --git a/arch/arm/include/asm/arch-fsl-layerscape/mp.h b/arch/arm/include/asm/arch-fsl-layerscape/mp.h
|
||||
index e46e076..55f0e0c 100644
|
||||
--- a/arch/arm/include/asm/arch-fsl-layerscape/mp.h
|
||||
+++ b/arch/arm/include/asm/arch-fsl-layerscape/mp.h
|
||||
@@ -13,6 +13,7 @@
|
||||
* uint64_t entry_addr;
|
||||
* uint64_t status;
|
||||
* uint64_t lpid;
|
||||
+* uint64_t os_arch;
|
||||
* };
|
||||
* we pad this struct to 64 bytes so each entry is in its own cacheline
|
||||
* the actual spin table is an array of these structures
|
||||
@@ -20,6 +21,7 @@
|
||||
#define SPIN_TABLE_ELEM_ENTRY_ADDR_IDX 0
|
||||
#define SPIN_TABLE_ELEM_STATUS_IDX 1
|
||||
#define SPIN_TABLE_ELEM_LPID_IDX 2
|
||||
+#define SPIN_TABLE_ELEM_OS_ARCH_IDX 3
|
||||
#define WORDS_PER_SPIN_TABLE_ENTRY 8 /* pad to 64 bytes */
|
||||
#define SPIN_TABLE_ELEM_SIZE 64
|
||||
|
||||
@@ -35,4 +37,8 @@ phys_addr_t determine_mp_bootpg(void);
|
||||
void secondary_boot_func(void);
|
||||
int is_core_online(u64 cpu_id);
|
||||
#endif
|
||||
+
|
||||
+#define IH_ARCH_ARM 2 /* ARM */
|
||||
+#define IH_ARCH_ARM64 22 /* ARM64 */
|
||||
+
|
||||
#endif /* _FSL_LAYERSCAPE_MP_H */
|
||||
diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c
|
||||
index 36f2cb0..aae8c5b 100644
|
||||
--- a/arch/arm/lib/bootm.c
|
||||
+++ b/arch/arm/lib/bootm.c
|
||||
@@ -258,6 +258,10 @@ bool armv7_boot_nonsec(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
+__weak void update_os_arch_secondary_cores(uint8_t os_arch)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
/* Subcommand: GO */
|
||||
static void boot_jump_linux(bootm_headers_t *images, int flag)
|
||||
{
|
||||
@@ -276,6 +280,7 @@ static void boot_jump_linux(bootm_headers_t *images, int flag)
|
||||
announce_and_cleanup(fake);
|
||||
|
||||
if (!fake) {
|
||||
+ update_os_arch_secondary_cores(images->os.arch);
|
||||
if ((IH_ARCH_DEFAULT == IH_ARCH_ARM64) &&
|
||||
(images->os.arch == IH_ARCH_ARM)) {
|
||||
smp_kick_all_cpus();
|
||||
--
|
||||
1.7.9.5
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
From f9e93719a99120e93628bf39bd997164a01afda2 Mon Sep 17 00:00:00 2001
|
||||
From: Alison Wang <b18965@freescale.com>
|
||||
Date: Fri, 13 May 2016 15:23:27 +0800
|
||||
Subject: [PATCH 03/93] armv8: aarch32: Disable CONFIG_FSL_LS_PPA for loading
|
||||
32-bit OS
|
||||
|
||||
The current U-Boot doesn't support loading 32-bit OS with PPA, so
|
||||
disable CONFIG_FSL_LS_PPA so far.
|
||||
|
||||
Signed-off-by: Alison Wang <alison.wang@nxp.com>
|
||||
---
|
||||
include/configs/ls1043ardb.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/include/configs/ls1043ardb.h b/include/configs/ls1043ardb.h
|
||||
index c1abc73..af8b441 100644
|
||||
--- a/include/configs/ls1043ardb.h
|
||||
+++ b/include/configs/ls1043ardb.h
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
#include "ls1043a_common.h"
|
||||
|
||||
-#define CONFIG_FSL_LS_PPA
|
||||
+#undef CONFIG_FSL_LS_PPA
|
||||
#if defined(CONFIG_FSL_LS_PPA)
|
||||
#define CONFIG_ARMV8_PSCI
|
||||
#define CONFIG_SYS_LS_PPA_DRAM_BLOCK_MIN_SIZE (1UL * 1024 * 1024)
|
||||
--
|
||||
1.7.9.5
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
From cb5a037831053d22ce260dbec6b378f532bd2c6c Mon Sep 17 00:00:00 2001
|
||||
From: Alison Wang <b18965@freescale.com>
|
||||
Date: Tue, 21 Jun 2016 17:14:35 +0800
|
||||
Subject: [PATCH 04/93] armv8: Support loading 32-bit OS which is not in the
|
||||
form of FIT
|
||||
|
||||
As only FIT image is supported now, this patch is to support loading
|
||||
32-bit uImage, dtb and rootfs separately.
|
||||
|
||||
Signed-off-by: Alison Wang <alison.wang@nxp.com>
|
||||
---
|
||||
include/image.h | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/include/image.h b/include/image.h
|
||||
index 299d6d2..0ea5f8e 100644
|
||||
--- a/include/image.h
|
||||
+++ b/include/image.h
|
||||
@@ -694,7 +694,8 @@ static inline int image_check_type(const image_header_t *hdr, uint8_t type)
|
||||
}
|
||||
static inline int image_check_arch(const image_header_t *hdr, uint8_t arch)
|
||||
{
|
||||
- return (image_get_arch(hdr) == arch);
|
||||
+ return (image_get_arch(hdr) == arch) ||
|
||||
+ (image_get_arch(hdr) == IH_ARCH_ARM && arch == IH_ARCH_ARM64);
|
||||
}
|
||||
static inline int image_check_os(const image_header_t *hdr, uint8_t os)
|
||||
{
|
||||
--
|
||||
1.7.9.5
|
||||
|
|
@ -0,0 +1,68 @@
|
|||
From 3c22f3fcbdb9f919ebdfa87a2ec237ac2abb7e03 Mon Sep 17 00:00:00 2001
|
||||
From: Yutang Jiang <yutang.jiang@nxp.com>
|
||||
Date: Thu, 27 Oct 2016 23:45:45 +0800
|
||||
Subject: [PATCH 05/93] armv8: set openwrt/lede default boot env for
|
||||
ls1043ardb
|
||||
|
||||
Signed-off-by: Yutang Jiang <yutang.jiang@nxp.com>
|
||||
---
|
||||
include/configs/ls1043a_common.h | 28 +++++++++++++++++++++++++---
|
||||
1 file changed, 25 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/include/configs/ls1043a_common.h b/include/configs/ls1043a_common.h
|
||||
index 68678f3..1db05bb 100644
|
||||
--- a/include/configs/ls1043a_common.h
|
||||
+++ b/include/configs/ls1043a_common.h
|
||||
@@ -273,6 +273,16 @@
|
||||
"5m(kernel),1m(dtb),9m(file_system)"
|
||||
#endif
|
||||
|
||||
+#define WRTBOOT_DEFAULT "setenv bootargs root=/dev/mtdblock6 " \
|
||||
+ "rootfstype=squashfs,jffs2 noinitrd earlycon=uart8250,mmio,0x21c0500 " \
|
||||
+ "console=ttyS0,115200 mtdparts=60000000.nor:1M(rcw),1M(u-boot)," \
|
||||
+ "1M(u-boot-env),1M(fman),1M(dtb),5M(kernel),54M(rootfs),64M(otherbank)" \
|
||||
+ " && cp.b 60400000 $fdtaddr 100000 && cp.b 60500000 $loadaddr 500000" \
|
||||
+ " && bootm $loadaddr - $fdtaddr"
|
||||
+#define WRTUPDATE_DEFAULT "tftp a0000000 <tftp_folder>/" \
|
||||
+ "lede-layerscape-64b-ls1043ardb-squashfs-firmware.bin && protect off all" \
|
||||
+ " && erase 60000000 +4000000 && cp.b a0000000 60000000 $filesize && reset"
|
||||
+
|
||||
/* Initial environment variables */
|
||||
#define CONFIG_EXTRA_ENV_SETTINGS \
|
||||
"hwconfig=fsl_ddr:bank_intlv=auto\0" \
|
||||
@@ -286,6 +296,19 @@
|
||||
"kernel_load=0xa0000000\0" \
|
||||
"kernel_size=0x2800000\0" \
|
||||
"console=ttyAMA0,38400n8\0" \
|
||||
+ "ethaddr=00:e0:0c:00:77:00\0" \
|
||||
+ "eth1addr=00:e0:0c:00:77:01\0" \
|
||||
+ "eth2addr=00:e0:0c:00:77:02\0" \
|
||||
+ "eth3addr=00:e0:0c:00:77:03\0" \
|
||||
+ "eth4addr=00:e0:0c:00:77:04\0" \
|
||||
+ "eth5addr=00:e0:0c:00:77:05\0" \
|
||||
+ "eth6addr=00:e0:0c:00:77:06\0" \
|
||||
+ "ethact=FM1@DTSEC2\0" \
|
||||
+ "loadaddr=82000000\0" \
|
||||
+ "ramdiskaddr=88000000\0" \
|
||||
+ "fdtaddr=8f000000\0" \
|
||||
+ "wrtboot=" WRTBOOT_DEFAULT "\0" \
|
||||
+ "wrtupdate=" WRTUPDATE_DEFAULT "\0" \
|
||||
"mtdparts=" MTDPARTS_DEFAULT "\0"
|
||||
|
||||
#define CONFIG_BOOTARGS "console=ttyS0,115200 root=/dev/ram0 " \
|
||||
@@ -296,10 +319,9 @@
|
||||
#define CONFIG_BOOTCOMMAND "sf probe && sf read $kernel_load " \
|
||||
"e0000 f00000 && bootm $kernel_load"
|
||||
#else
|
||||
-#define CONFIG_BOOTCOMMAND "cp.b $kernel_start $kernel_load " \
|
||||
- "$kernel_size && bootm $kernel_load"
|
||||
+#define CONFIG_BOOTCOMMAND "run wrtboot"
|
||||
#endif
|
||||
-#define CONFIG_BOOTDELAY 10
|
||||
+#define CONFIG_BOOTDELAY 3
|
||||
|
||||
/* Monitor Command Prompt */
|
||||
#define CONFIG_SYS_CBSIZE 512 /* Console I/O Buffer Size */
|
||||
--
|
||||
1.7.9.5
|
||||
|
84
package/firmware/fman-ucode/Makefile
Normal file
84
package/firmware/fman-ucode/Makefile
Normal file
|
@ -0,0 +1,84 @@
|
|||
#
|
||||
# Copyright (C) 2016 Jiang Yutang <jiangyutang1978@gmail.com>
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/image.mk
|
||||
|
||||
PKG_NAME:=fman-ucode
|
||||
PKG_VERSION:=fsl-sdk-v2.0
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_SOURCE_URL:=http://git.freescale.com/git/cgit.cgi/ppc/sdk/fm-ucode.git
|
||||
PKG_SOURCE_VERSION:=b19c645821941493fbef32e616b5a16404259976
|
||||
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
PKG_LICENSE:=GPL-2.0 GPL-2.0+
|
||||
PKG_LICENSE_FILES:=Licenses/README
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define fman/Default
|
||||
TITLE:=
|
||||
CONFIG:=
|
||||
endef
|
||||
|
||||
define fman/ls1043ardb
|
||||
TITLE=FMAN UCODE $(PKG_NAME)-$(PKG_VERSION) for NXP ls1043ardb 64b/32b Dev Board
|
||||
CONFIG=fsl_fman_ucode_ls1043_r1.0_108_4_5.bin
|
||||
endef
|
||||
|
||||
FMANS := \
|
||||
ls1043ardb
|
||||
|
||||
define Package/fman/template
|
||||
define Package/fman-layerscape-$(1)
|
||||
SECTION:=firmware
|
||||
CATEGORY:=Firmware
|
||||
DEPENDS:=@TARGET_layerscape
|
||||
TITLE:=$(2)
|
||||
URL:=http://git.freescale.com/git/cgit.cgi/ppc/sdk/fm-ucode.git
|
||||
VARIANT:=$(1)
|
||||
MAINTAINER:=Jiang Yutang <jiangyutang1978@gmail.com>
|
||||
endef
|
||||
endef
|
||||
|
||||
define BuildFMANPackage
|
||||
$(eval $(fman/Default))
|
||||
$(eval $(fman/$(1)))
|
||||
$(call Package/fman/template,$(1),$(TITLE))
|
||||
endef
|
||||
|
||||
ifdef BUILD_VARIANT
|
||||
$(eval $(call fman/$(BUILD_VARIANT)))
|
||||
FMAN_CONFIG:=$(if $(CONFIG),$(CONFIG),$(BUILD_VARIANT))
|
||||
endif
|
||||
|
||||
define Build/Compile
|
||||
endef
|
||||
|
||||
define Package/fman/install/default
|
||||
$(CP) $(PKG_BUILD_DIR)/$(FMAN_CONFIG) $(KDIR)/$(1)-fman.bin
|
||||
endef
|
||||
|
||||
define Package/fman/install/template
|
||||
define Package/fman-layerscape-$(1)/install
|
||||
$(call Package/fman/install/default,$(2))
|
||||
endef
|
||||
endef
|
||||
|
||||
$(foreach f,$(FMANS), \
|
||||
$(eval $(call Package/fman/install/template,$(f),$(f))) \
|
||||
)
|
||||
|
||||
$(foreach f,$(FMANS), \
|
||||
$(eval $(call BuildFMANPackage,$(f))) \
|
||||
$(eval $(call BuildPackage,fman-layerscape-$(f))) \
|
||||
)
|
87
package/firmware/rcw/Makefile
Normal file
87
package/firmware/rcw/Makefile
Normal file
|
@ -0,0 +1,87 @@
|
|||
#
|
||||
# Copyright (C) 2016 Jiang Yutang <jiangyutang1978@gmail.com>
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/image.mk
|
||||
|
||||
PKG_NAME:=rcw
|
||||
PKG_VERSION:=v1.0
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_SOURCE_URL:=https://github.com/fsl-jyt/rcw.git
|
||||
PKG_SOURCE_VERSION:=4c74045c34375ee0cf6a9bbd57ef8f00a5a01fd6
|
||||
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
PKG_LICENSE:=GPL-2.0 GPL-2.0+
|
||||
PKG_LICENSE_FILES:=Licenses/README
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define rcw/Default
|
||||
TITLE:=
|
||||
CONFIG:=
|
||||
endef
|
||||
|
||||
define rcw/ls1043ardb
|
||||
TITLE=RCW binary $(PKG_NAME)-$(PKG_VERSION) for NXP ls1043ardb 64b/32b Dev Board
|
||||
CONFIG=ls1043ardb-rcw.bin
|
||||
endef
|
||||
|
||||
RCWS := \
|
||||
ls1043ardb
|
||||
|
||||
define Package/rcw/template
|
||||
define Package/rcw-layerscape-$(1)
|
||||
SECTION:=firmware
|
||||
CATEGORY:=Firmware
|
||||
DEPENDS:= @TARGET_layerscape
|
||||
TITLE:=$(2)
|
||||
URL:=http://git.freescale.com/git/cgit.cgi/ppc/sdk/rcw.git
|
||||
VARIANT:=$(1)
|
||||
MAINTAINER:=Jiang Yutang <jiangyutang1978@gmail.com>
|
||||
endef
|
||||
endef
|
||||
|
||||
define BuildRCWPackage
|
||||
$(eval $(rcw/Default))
|
||||
$(eval $(rcw/$(1)))
|
||||
$(call Package/rcw/template,$(1),$(TITLE))
|
||||
endef
|
||||
|
||||
ifdef BUILD_VARIANT
|
||||
$(eval $(call rcw/$(BUILD_VARIANT)))
|
||||
RCW_CONFIG:=$(if $(CONFIG),$(CONFIG),$(BUILD_VARIANT))
|
||||
endif
|
||||
|
||||
define Build/Configure
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
endef
|
||||
|
||||
define Package/rcw/install/default
|
||||
$(CP) $(PKG_BUILD_DIR)/$(RCW_CONFIG) $(KDIR)/$(1)-rcw.bin
|
||||
endef
|
||||
|
||||
define Package/rcw/install/template
|
||||
define Package/rcw-layerscape-$(1)/install
|
||||
$(call Package/rcw/install/default,$(2))
|
||||
endef
|
||||
endef
|
||||
|
||||
$(foreach r,$(RCWS), \
|
||||
$(eval $(call Package/rcw/install/template,$(r),$(r))) \
|
||||
)
|
||||
|
||||
$(foreach r,$(RCWS), \
|
||||
$(eval $(call BuildRCWPackage,$(r))) \
|
||||
$(eval $(call BuildPackage,rcw-layerscape-$(r))) \
|
||||
)
|
153
target/linux/layerscape/32b/config-default
Normal file
153
target/linux/layerscape/32b/config-default
Normal file
|
@ -0,0 +1,153 @@
|
|||
CONFIG_ALIGNMENT_TRAP=y
|
||||
# CONFIG_ARCH_AXXIA is not set
|
||||
CONFIG_ARCH_HAS_RESET_CONTROLLER=y
|
||||
CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
|
||||
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||
CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
|
||||
CONFIG_ARCH_MULTIPLATFORM=y
|
||||
# CONFIG_ARCH_MULTI_CPU_AUTO is not set
|
||||
CONFIG_ARCH_MULTI_V6_V7=y
|
||||
CONFIG_ARCH_MULTI_V7=y
|
||||
CONFIG_ARCH_MXC=y
|
||||
CONFIG_ARCH_NR_GPIO=0
|
||||
CONFIG_ARCH_REQUIRE_GPIOLIB=y
|
||||
# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
|
||||
# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
|
||||
CONFIG_ARCH_SUPPORTS_UPROBES=y
|
||||
CONFIG_ARCH_USE_BUILTIN_BSWAP=y
|
||||
CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
|
||||
CONFIG_ARM=y
|
||||
# CONFIG_ARM_CPU_SUSPEND is not set
|
||||
CONFIG_ARM_ERRATA_754322=y
|
||||
CONFIG_ARM_ERRATA_764369=y
|
||||
CONFIG_ARM_ERRATA_775420=y
|
||||
CONFIG_ARM_HAS_SG_CHAIN=y
|
||||
CONFIG_ARM_HEAVY_MB=y
|
||||
CONFIG_ARM_L1_CACHE_SHIFT=6
|
||||
CONFIG_ARM_L1_CACHE_SHIFT_6=y
|
||||
CONFIG_ARM_LPAE=y
|
||||
CONFIG_ARM_PATCH_PHYS_VIRT=y
|
||||
CONFIG_ARM_PMU=y
|
||||
CONFIG_ARM_THUMB=y
|
||||
# CONFIG_ARM_THUMBEE is not set
|
||||
CONFIG_ARM_VIRT_EXT=y
|
||||
CONFIG_ATAGS=y
|
||||
CONFIG_AUTO_ZRELADDR=y
|
||||
CONFIG_CACHE_L2X0=y
|
||||
CONFIG_CLKSRC_IMX_GPT=y
|
||||
CONFIG_CPUFREQ_DT=y
|
||||
CONFIG_CPU_32v6K=y
|
||||
CONFIG_CPU_32v7=y
|
||||
CONFIG_CPU_ABRT_EV7=y
|
||||
# CONFIG_CPU_BPREDICT_DISABLE is not set
|
||||
CONFIG_CPU_CACHE_V7=y
|
||||
CONFIG_CPU_CACHE_VIPT=y
|
||||
CONFIG_CPU_COPY_V6=y
|
||||
CONFIG_CPU_CP15=y
|
||||
CONFIG_CPU_CP15_MMU=y
|
||||
CONFIG_CPU_FREQ=y
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
|
||||
CONFIG_CPU_FREQ_GOV_COMMON=y
|
||||
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
|
||||
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
|
||||
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
|
||||
CONFIG_CPU_FREQ_GOV_USERSPACE=y
|
||||
CONFIG_CPU_FREQ_STAT=y
|
||||
CONFIG_CPU_FREQ_STAT_DETAILS=y
|
||||
CONFIG_CPU_HAS_ASID=y
|
||||
# CONFIG_CPU_ICACHE_DISABLE is not set
|
||||
CONFIG_CPU_PABRT_V7=y
|
||||
# CONFIG_CPU_THERMAL is not set
|
||||
CONFIG_CPU_TLB_V7=y
|
||||
CONFIG_CPU_V7=y
|
||||
CONFIG_CRYPTO_DEFLATE=y
|
||||
CONFIG_CRYPTO_LZO=y
|
||||
CONFIG_CRYPTO_XZ=y
|
||||
CONFIG_DEBUG_IMX_UART_PORT=1
|
||||
CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S"
|
||||
# CONFIG_DEBUG_UART_8250 is not set
|
||||
# CONFIG_DEBUG_USER is not set
|
||||
CONFIG_EDAC_ATOMIC_SCRUB=y
|
||||
# CONFIG_ENABLE_DEFAULT_TRACERS is not set
|
||||
CONFIG_EXTCON=y
|
||||
CONFIG_FEC=y
|
||||
# CONFIG_FSL_QMAN_FQ_LOOKUP is not set
|
||||
# CONFIG_FTRACE_SYSCALLS is not set
|
||||
CONFIG_GENERIC_IRQ_CHIP=y
|
||||
CONFIG_GPIO_MXC=y
|
||||
CONFIG_HAVE_ARM_ARCH_TIMER=y
|
||||
CONFIG_HAVE_HW_BREAKPOINT=y
|
||||
CONFIG_HAVE_IDE=y
|
||||
CONFIG_HAVE_IMX_SRC=y
|
||||
CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
|
||||
CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
CONFIG_HAVE_OPTPROBES=y
|
||||
CONFIG_HAVE_PROC_CPU=y
|
||||
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
|
||||
CONFIG_HAVE_SMP=y
|
||||
CONFIG_HZ_FIXED=0
|
||||
# CONFIG_IMX_WEIM is not set
|
||||
CONFIG_MICREL_PHY=y
|
||||
CONFIG_MIGHT_HAVE_CACHE_L2X0=y
|
||||
CONFIG_MIGHT_HAVE_PCI=y
|
||||
# CONFIG_MMC_SDHCI_ESDHC_IMX is not set
|
||||
# CONFIG_MMC_MXC is not set
|
||||
CONFIG_MODULES_TREE_LOOKUP=y
|
||||
CONFIG_MODULES_USE_ELF_REL=y
|
||||
CONFIG_MULTI_IRQ_HANDLER=y
|
||||
CONFIG_NEON=y
|
||||
CONFIG_NET_PTP_CLASSIFY=y
|
||||
CONFIG_OLD_SIGACTION=y
|
||||
CONFIG_OUTER_CACHE=y
|
||||
CONFIG_OUTER_CACHE_SYNC=y
|
||||
CONFIG_PAGE_OFFSET=0x80000000
|
||||
# CONFIG_PATA_IMX is not set
|
||||
CONFIG_PERF_EVENTS=y
|
||||
CONFIG_PINCTRL=y
|
||||
# CONFIG_PINCTRL_SINGLE is not set
|
||||
CONFIG_PL310_ERRATA_588369=y
|
||||
CONFIG_PL310_ERRATA_727915=y
|
||||
# CONFIG_PL310_ERRATA_753970 is not set
|
||||
CONFIG_PL310_ERRATA_769419=y
|
||||
CONFIG_PM_OPP=y
|
||||
CONFIG_PPS=y
|
||||
# CONFIG_PROBE_EVENTS is not set
|
||||
CONFIG_PTP_1588_CLOCK=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
# CONFIG_RTC_DRV_IMXDI is not set
|
||||
# CONFIG_RTC_DRV_MXC is not set
|
||||
# CONFIG_SERIAL_IMX is not set
|
||||
CONFIG_SMP_ON_UP=y
|
||||
CONFIG_SOC_BUS=y
|
||||
# CONFIG_SOC_IMX50 is not set
|
||||
# CONFIG_SOC_IMX51 is not set
|
||||
# CONFIG_SOC_IMX53 is not set
|
||||
# CONFIG_SOC_IMX6Q is not set
|
||||
# CONFIG_SOC_IMX6SL is not set
|
||||
# CONFIG_SOC_IMX6SX is not set
|
||||
# CONFIG_SOC_IMX6UL is not set
|
||||
# CONFIG_SOC_IMX7D is not set
|
||||
# CONFIG_SOC_LS1021A is not set
|
||||
# CONFIG_SOC_VF610 is not set
|
||||
# CONFIG_SPI_IMX is not set
|
||||
CONFIG_SRAM=y
|
||||
CONFIG_SWP_EMULATE=y
|
||||
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||
CONFIG_THERMAL_WRITABLE_TRIPS=y
|
||||
# CONFIG_THUMB2_KERNEL is not set
|
||||
CONFIG_TRACING_EVENTS_GPIO=y
|
||||
CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h"
|
||||
# CONFIG_USB_IMX21_HCD is not set
|
||||
CONFIG_USE_OF=y
|
||||
CONFIG_VECTORS_BASE=0xffff0000
|
||||
CONFIG_VFP=y
|
||||
CONFIG_VFPv3=y
|
||||
CONFIG_WATCHDOG_CORE=y
|
||||
CONFIG_XZ_DEC_ARM=y
|
||||
CONFIG_XZ_DEC_BCJ=y
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
CONFIG_ZONE_DMA_FLAG=0
|
1
target/linux/layerscape/32b/profiles/00-default.mk
Symbolic link
1
target/linux/layerscape/32b/profiles/00-default.mk
Symbolic link
|
@ -0,0 +1 @@
|
|||
../../64b/profiles/00-default.mk
|
14
target/linux/layerscape/32b/target.mk
Normal file
14
target/linux/layerscape/32b/target.mk
Normal file
|
@ -0,0 +1,14 @@
|
|||
#
|
||||
# Copyright (C) 2016 Jiang Yutang <jiangyutang1978@gmail.com>
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
ARCH:=arm
|
||||
BOARDNAME:=layerscape 32b boards
|
||||
CPU_TYPE:=cortex-a9
|
||||
|
||||
define Target/Description
|
||||
Build firmware images for $(BOARDNAME) SoC devices.
|
||||
endef
|
183
target/linux/layerscape/64b/config-default
Normal file
183
target/linux/layerscape/64b/config-default
Normal file
|
@ -0,0 +1,183 @@
|
|||
CONFIG_64BIT=y
|
||||
CONFIG_ACPI=y
|
||||
CONFIG_ACPI_CCA_REQUIRED=y
|
||||
# CONFIG_ACPI_CONTAINER is not set
|
||||
# CONFIG_ACPI_CUSTOM_DSDT is not set
|
||||
# CONFIG_ACPI_DEBUG is not set
|
||||
# CONFIG_ACPI_DEBUGGER is not set
|
||||
# CONFIG_ACPI_DOCK is not set
|
||||
# CONFIG_ACPI_EC_DEBUGFS is not set
|
||||
CONFIG_ACPI_FAN=y
|
||||
CONFIG_ACPI_GENERIC_GSI=y
|
||||
# CONFIG_ACPI_PCI_SLOT is not set
|
||||
CONFIG_ACPI_PROCESSOR=y
|
||||
CONFIG_ACPI_REDUCED_HARDWARE_ONLY=y
|
||||
CONFIG_ACPI_THERMAL=y
|
||||
# CONFIG_ARCH_BCM_IPROC is not set
|
||||
CONFIG_ARCH_DMA_ADDR_T_64BIT=y
|
||||
# CONFIG_ARCH_EXYNOS7 is not set
|
||||
CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
|
||||
CONFIG_ARCH_HAS_HOLES_MEMORYMODEL=y
|
||||
# CONFIG_ARCH_SEATTLE is not set
|
||||
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
|
||||
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
# CONFIG_ARCH_SPRD is not set
|
||||
# CONFIG_ARCH_STRATIX10 is not set
|
||||
# CONFIG_ARCH_THUNDER is not set
|
||||
CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y
|
||||
CONFIG_ARCH_WANT_FRAME_POINTERS=y
|
||||
CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
|
||||
# CONFIG_ARCH_XGENE is not set
|
||||
# CONFIG_ARCH_ZYNQMP is not set
|
||||
CONFIG_ARM64=y
|
||||
# CONFIG_ARM64_16K_PAGES is not set
|
||||
CONFIG_ARM64_4K_PAGES=y
|
||||
# CONFIG_ARM64_64K_PAGES is not set
|
||||
# CONFIG_ARM64_CRYPTO is not set
|
||||
CONFIG_ARM64_ERRATUM_819472=y
|
||||
CONFIG_ARM64_ERRATUM_824069=y
|
||||
CONFIG_ARM64_ERRATUM_826319=y
|
||||
CONFIG_ARM64_ERRATUM_827319=y
|
||||
CONFIG_ARM64_ERRATUM_832075=y
|
||||
CONFIG_ARM64_ERRATUM_843419=y
|
||||
CONFIG_ARM64_ERRATUM_845719=y
|
||||
CONFIG_ARM64_HW_AFDBM=y
|
||||
# CONFIG_ARM64_LSE_ATOMICS is not set
|
||||
CONFIG_ARM64_PAN=y
|
||||
# CONFIG_ARM64_PTDUMP is not set
|
||||
# CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set
|
||||
CONFIG_ARM64_VA_BITS=39
|
||||
CONFIG_ARM64_VA_BITS_39=y
|
||||
# CONFIG_ARM64_VA_BITS_48 is not set
|
||||
# CONFIG_ARMV8_DEPRECATED is not set
|
||||
CONFIG_ARM_AMBA=y
|
||||
CONFIG_ARM_GIC_V2M=y
|
||||
CONFIG_ARM_GIC_V3=y
|
||||
CONFIG_ARM_GIC_V3_ITS=y
|
||||
# CONFIG_ARM_PL172_MPMC is not set
|
||||
CONFIG_ARM_PSCI_FW=y
|
||||
# CONFIG_ARM_SP805_WATCHDOG is not set
|
||||
CONFIG_ATOMIC64_SELFTEST=y
|
||||
CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y
|
||||
CONFIG_BLOCK_COMPAT=y
|
||||
CONFIG_BOUNCE=y
|
||||
CONFIG_BSD_PROCESS_ACCT=y
|
||||
CONFIG_BSD_PROCESS_ACCT_V3=y
|
||||
CONFIG_BUILD_BIN2C=y
|
||||
# CONFIG_CAVIUM_ERRATUM_22375 is not set
|
||||
# CONFIG_CAVIUM_ERRATUM_23154 is not set
|
||||
CONFIG_CLKSRC_ACPI=y
|
||||
CONFIG_CLK_SP810=y
|
||||
CONFIG_CLK_VEXPRESS_OSC=y
|
||||
CONFIG_CMDLINE="console=ttyAMA0"
|
||||
CONFIG_COMMON_CLK_VERSATILE=y
|
||||
CONFIG_COMMON_CLK_XGENE=y
|
||||
CONFIG_COMPAT=y
|
||||
CONFIG_COMPAT_BINFMT_ELF=y
|
||||
CONFIG_COMPAT_NETLINK_MESSAGES=y
|
||||
CONFIG_COMPAT_OLD_SIGACTION=y
|
||||
# CONFIG_CPU_BIG_ENDIAN is not set
|
||||
CONFIG_CUSE=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEFAULT_IOSCHED="noop"
|
||||
CONFIG_DEFAULT_NOOP=y
|
||||
CONFIG_DMI=y
|
||||
CONFIG_DMIID=y
|
||||
# CONFIG_DMI_SYSFS is not set
|
||||
CONFIG_EFI=y
|
||||
# CONFIG_EFIVAR_FS is not set
|
||||
CONFIG_EFI_ARMSTUB=y
|
||||
CONFIG_EFI_ESRT=y
|
||||
CONFIG_EFI_PARAMS_FROM_FDT=y
|
||||
CONFIG_EFI_RUNTIME_WRAPPERS=y
|
||||
CONFIG_EFI_STUB=y
|
||||
# CONFIG_EFI_VARS is not set
|
||||
CONFIG_FSL_MC_BUS=y
|
||||
CONFIG_FSL_QMAN_FQ_LOOKUP=y
|
||||
CONFIG_FS_MBCACHE=y
|
||||
CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
|
||||
CONFIG_GENERIC_CPU_AUTOPROBE=y
|
||||
CONFIG_GENERIC_CSUM=y
|
||||
CONFIG_GENERIC_EARLY_IOREMAP=y
|
||||
CONFIG_GENERIC_TIME_VSYSCALL=y
|
||||
CONFIG_GPIO_ACPI=y
|
||||
# CONFIG_GPIO_AMDPT is not set
|
||||
# CONFIG_GPIO_XGENE is not set
|
||||
CONFIG_GRACE_PERIOD=y
|
||||
CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y
|
||||
CONFIG_HAVE_ARCH_KASAN=y
|
||||
CONFIG_HAVE_CMPXCHG_DOUBLE=y
|
||||
CONFIG_HAVE_CMPXCHG_LOCAL=y
|
||||
CONFIG_HAVE_DEBUG_BUGVERBOSE=y
|
||||
CONFIG_HAVE_MEMORY_PRESENT=y
|
||||
CONFIG_HAVE_PATA_PLATFORM=y
|
||||
# CONFIG_HPET is not set
|
||||
CONFIG_HW_RANDOM=y
|
||||
CONFIG_HW_RANDOM_VIRTIO=y
|
||||
CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
|
||||
# CONFIG_IOSCHED_DEADLINE is not set
|
||||
CONFIG_IP_PNP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
# CONFIG_IP_PNP_RARP is not set
|
||||
CONFIG_JBD2=y
|
||||
# CONFIG_LIQUIDIO is not set
|
||||
CONFIG_LOCKD=y
|
||||
CONFIG_LOGO=y
|
||||
CONFIG_LOGO_LINUX_CLUT224=y
|
||||
# CONFIG_LOGO_LINUX_MONO is not set
|
||||
# CONFIG_LOGO_LINUX_VGA16 is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_MFD_CORE=y
|
||||
CONFIG_MFD_VEXPRESS_SYSREG=y
|
||||
CONFIG_MODULES_USE_ELF_RELA=y
|
||||
CONFIG_NEED_SG_DMA_LENGTH=y
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_PCI_BUS_ADDR_T_64BIT=y
|
||||
# CONFIG_PCI_HISI is not set
|
||||
CONFIG_PCI_LABEL=y
|
||||
# CONFIG_PHY_XGENE is not set
|
||||
# CONFIG_PMIC_OPREGION is not set
|
||||
CONFIG_PNP=y
|
||||
CONFIG_PNPACPI=y
|
||||
CONFIG_PNP_DEBUG_MESSAGES=y
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
CONFIG_POSIX_MQUEUE_SYSCTL=y
|
||||
# CONFIG_PREEMPT_NONE is not set
|
||||
CONFIG_PREEMPT_VOLUNTARY=y
|
||||
CONFIG_PROFILING=y
|
||||
# CONFIG_POWER_RESET_VEXPRESS is not set
|
||||
CONFIG_ROOT_NFS=y
|
||||
# CONFIG_SCSI_LOWLEVEL is not set
|
||||
# CONFIG_SCSI_PROC_FS is not set
|
||||
CONFIG_SERIAL_8250_PNP=y
|
||||
# CONFIG_SERIAL_AMBA_PL010 is not set
|
||||
CONFIG_SERIAL_AMBA_PL011=y
|
||||
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
|
||||
CONFIG_SMC91X=y
|
||||
CONFIG_SPARSEMEM=y
|
||||
CONFIG_SPARSEMEM_EXTREME=y
|
||||
CONFIG_SPARSEMEM_MANUAL=y
|
||||
CONFIG_SPARSEMEM_VMEMMAP=y
|
||||
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
|
||||
CONFIG_SUNRPC=y
|
||||
# CONFIG_SWAP is not set
|
||||
CONFIG_SYSCTL_EXCEPTION_TRACE=y
|
||||
CONFIG_SYSVIPC_COMPAT=y
|
||||
# CONFIG_THUNDER_NIC_BGX is not set
|
||||
# CONFIG_THUNDER_NIC_PF is not set
|
||||
# CONFIG_THUNDER_NIC_VF is not set
|
||||
CONFIG_UCS2_STRING=y
|
||||
CONFIG_VEXPRESS_CONFIG=y
|
||||
CONFIG_VEXPRESS_SYSCFG=y
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_VIDEOMODE_HELPERS=y
|
||||
CONFIG_VIRTIO=y
|
||||
CONFIG_VIRTIO_BLK=y
|
||||
# CONFIG_VIRTIO_CONSOLE is not set
|
||||
CONFIG_VIRTIO_MMIO=y
|
||||
# CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set
|
||||
CONFIG_VIRTIO_NET=y
|
14
target/linux/layerscape/64b/profiles/00-default.mk
Normal file
14
target/linux/layerscape/64b/profiles/00-default.mk
Normal file
|
@ -0,0 +1,14 @@
|
|||
define Profile/Default
|
||||
NAME:=Default Profile
|
||||
PRIORITY:=1
|
||||
endef
|
||||
|
||||
define Profile/Default/Description
|
||||
Default package set compatible with most boards.
|
||||
endef
|
||||
|
||||
DEFAULT_PACKAGES+= \
|
||||
rcw-layerscape-ls1043ardb uboot-layerscape-$(SUBTARGET)-ls1043ardb \
|
||||
fman-layerscape-ls1043ardb
|
||||
|
||||
$(eval $(call Profile,Default))
|
15
target/linux/layerscape/64b/target.mk
Normal file
15
target/linux/layerscape/64b/target.mk
Normal file
|
@ -0,0 +1,15 @@
|
|||
#
|
||||
# Copyright (C) 2016 Jiang Yutang <jiangyutang1978@gmail.com>
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
ARCH:=aarch64
|
||||
BOARDNAME:=layerscape 64b boards
|
||||
CFLAGS:=-Os -pipe -fno-caller-saves
|
||||
|
||||
define Target/Description
|
||||
Build firmware images for $(BOARDNAME) SoC devices.
|
||||
endef
|
||||
|
26
target/linux/layerscape/Makefile
Normal file
26
target/linux/layerscape/Makefile
Normal file
|
@ -0,0 +1,26 @@
|
|||
#
|
||||
# Copyright (C) 2016 Jiang Yutang <jiangyutang1978@gmail.com>
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
BOARD:=layerscape
|
||||
BOARDNAME:=NXP Layerscape
|
||||
DEVICE_TYPE:=developerboard
|
||||
KERNEL_PATCHVER:=4.4
|
||||
KERNELNAME:=Image dtbs
|
||||
FEATURES:=squashfs nand usb pcie gpio
|
||||
SUBTARGETS:=64b 32b
|
||||
MAINTAINER:=Jiang Yutang <jiangyutang1978@gmail.com>
|
||||
|
||||
include $(INCLUDE_DIR)/target.mk
|
||||
|
||||
define Target/Description
|
||||
Build firmware images for $(BOARDNAME) SoC devices.
|
||||
endef
|
||||
|
||||
DEFAULT_PACKAGES += kmod-usb3 kmod-usb-dwc3 kmod-usb-storage
|
||||
|
||||
$(eval $(call BuildTarget))
|
296
target/linux/layerscape/config-4.4
Normal file
296
target/linux/layerscape/config-4.4
Normal file
|
@ -0,0 +1,296 @@
|
|||
CONFIG_AQUANTIA_PHY=y
|
||||
CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y
|
||||
CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
|
||||
CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
|
||||
CONFIG_ARCH_HAS_SG_CHAIN=y
|
||||
CONFIG_ARCH_HAS_TICK_BROADCAST=y
|
||||
CONFIG_ARCH_LAYERSCAPE=y
|
||||
CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
|
||||
CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
|
||||
CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
|
||||
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
|
||||
CONFIG_ARM_ARCH_TIMER=y
|
||||
CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
|
||||
CONFIG_ARM_GIC=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
# CONFIG_CAVIUM_ERRATUM_27456 is not set
|
||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
CONFIG_CLKDEV_LOOKUP=y
|
||||
CONFIG_CLKSRC_MMIO=y
|
||||
CONFIG_CLKSRC_OF=y
|
||||
CONFIG_CLKSRC_PROBE=y
|
||||
CONFIG_CLK_QORIQ=y
|
||||
CONFIG_CLONE_BACKWARDS=y
|
||||
CONFIG_COMMON_CLK=y
|
||||
CONFIG_CPU_RMAP=y
|
||||
CONFIG_CRC16=y
|
||||
CONFIG_CRYPTO_CRC32C=y
|
||||
CONFIG_CRYPTO_HASH=y
|
||||
CONFIG_CRYPTO_HASH2=y
|
||||
CONFIG_CRYPTO_RNG2=y
|
||||
CONFIG_CRYPTO_WORKQUEUE=y
|
||||
CONFIG_DCACHE_WORD_ACCESS=y
|
||||
CONFIG_DTC=y
|
||||
CONFIG_EDAC_SUPPORT=y
|
||||
CONFIG_EXT4_FS=y
|
||||
CONFIG_FAT_FS=y
|
||||
CONFIG_FIXED_PHY=y
|
||||
CONFIG_FIX_EARLYCON_MEM=y
|
||||
CONFIG_FMAN_ARM=y
|
||||
# CONFIG_FMAN_MIB_CNT_OVF_IRQ_EN is not set
|
||||
# CONFIG_FMAN_P1023 is not set
|
||||
# CONFIG_FMAN_P3040_P4080_P5020 is not set
|
||||
# CONFIG_FMAN_PFC is not set
|
||||
# CONFIG_FMAN_V3H is not set
|
||||
# CONFIG_FMAN_V3L is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
CONFIG_FSL_BMAN=y
|
||||
CONFIG_FSL_BMAN_CONFIG=y
|
||||
CONFIG_FSL_BMAN_DEBUGFS=y
|
||||
# CONFIG_FSL_BMAN_TEST is not set
|
||||
CONFIG_FSL_DPA=y
|
||||
# CONFIG_FSL_DPAA_1588 is not set
|
||||
CONFIG_FSL_DPAA_ADVANCED_DRIVERS=y
|
||||
# CONFIG_FSL_DPAA_CEETM is not set
|
||||
CONFIG_FSL_DPAA_CS_THRESHOLD_10G=0x10000000
|
||||
CONFIG_FSL_DPAA_CS_THRESHOLD_1G=0x06000000
|
||||
# CONFIG_FSL_DPAA_DBG_LOOP is not set
|
||||
# CONFIG_FSL_DPAA_ETH_DEBUG is not set
|
||||
CONFIG_FSL_DPAA_ETH_DEBUGFS=y
|
||||
CONFIG_FSL_DPAA_ETH_MAX_BUF_COUNT=128
|
||||
CONFIG_FSL_DPAA_ETH_REFILL_THRESHOLD=80
|
||||
CONFIG_FSL_DPAA_ETH_USE_NDO_SELECT_QUEUE=y
|
||||
CONFIG_FSL_DPAA_GENERIC_DRIVER=y
|
||||
# CONFIG_FSL_DPAA_HOOKS is not set
|
||||
CONFIG_FSL_DPAA_INGRESS_CS_THRESHOLD=0x10000000
|
||||
# CONFIG_FSL_DPAA_MACSEC is not set
|
||||
CONFIG_FSL_DPAA_OFFLINE_PORTS=y
|
||||
# CONFIG_FSL_DPAA_TS is not set
|
||||
CONFIG_FSL_DPA_CAN_WAIT=y
|
||||
CONFIG_FSL_DPA_CAN_WAIT_SYNC=y
|
||||
# CONFIG_FSL_DPA_CHECKING is not set
|
||||
CONFIG_FSL_DPA_PIRQ_FAST=y
|
||||
CONFIG_FSL_DPA_PIRQ_SLOW=y
|
||||
CONFIG_FSL_DPA_PORTAL_SHARE=y
|
||||
CONFIG_FSL_FM_MAX_FRAME_SIZE=1522
|
||||
CONFIG_FSL_FM_RX_EXTRA_HEADROOM=64
|
||||
CONFIG_FSL_IFC=y
|
||||
CONFIG_FSL_QMAN=y
|
||||
CONFIG_FSL_QMAN_CI_SCHED_CFG_BMAN_W=2
|
||||
CONFIG_FSL_QMAN_CI_SCHED_CFG_RW_W=2
|
||||
CONFIG_FSL_QMAN_CI_SCHED_CFG_SRCCIV=4
|
||||
CONFIG_FSL_QMAN_CI_SCHED_CFG_SRQ_W=3
|
||||
CONFIG_FSL_QMAN_CONFIG=y
|
||||
CONFIG_FSL_QMAN_DEBUGFS=y
|
||||
CONFIG_FSL_QMAN_FQD_SZ=10
|
||||
CONFIG_FSL_QMAN_INIT_TIMEOUT=10
|
||||
CONFIG_FSL_QMAN_PFDR_SZ=13
|
||||
CONFIG_FSL_QMAN_PIRQ_DQRR_ITHRESH=12
|
||||
CONFIG_FSL_QMAN_PIRQ_IPERIOD=100
|
||||
CONFIG_FSL_QMAN_PIRQ_MR_ITHRESH=4
|
||||
CONFIG_FSL_QMAN_POLL_LIMIT=32
|
||||
# CONFIG_FSL_QMAN_TEST is not set
|
||||
CONFIG_FSL_SDK_DPAA_ETH=y
|
||||
CONFIG_FSL_SDK_FMAN=y
|
||||
# CONFIG_FSL_SDK_FMAN_TEST is not set
|
||||
CONFIG_FSL_USDPAA=y
|
||||
CONFIG_FSL_XGMAC_MDIO=y
|
||||
# CONFIG_FTL is not set
|
||||
CONFIG_GENERIC_ALLOCATOR=y
|
||||
CONFIG_GENERIC_BUG=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
|
||||
CONFIG_GENERIC_IDLE_POLL_SETUP=y
|
||||
CONFIG_GENERIC_IO=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
|
||||
CONFIG_GENERIC_MSI_IRQ=y
|
||||
CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
|
||||
CONFIG_GENERIC_PCI_IOMAP=y
|
||||
CONFIG_GENERIC_SCHED_CLOCK=y
|
||||
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||
CONFIG_GENERIC_STRNCPY_FROM_USER=y
|
||||
CONFIG_GENERIC_STRNLEN_USER=y
|
||||
# CONFIG_GIANFAR is not set
|
||||
CONFIG_GPIOLIB=y
|
||||
CONFIG_GPIO_DEVRES=y
|
||||
CONFIG_GPIO_GENERIC=y
|
||||
CONFIG_GPIO_GENERIC_PLATFORM=y
|
||||
CONFIG_GPIO_MPC8XXX=y
|
||||
CONFIG_GPIO_SYSFS=y
|
||||
CONFIG_HANDLE_DOMAIN_IRQ=y
|
||||
CONFIG_HARDIRQS_SW_RESEND=y
|
||||
CONFIG_HAS_DMA=y
|
||||
CONFIG_HAS_FSL_QBMAN=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT_MAP=y
|
||||
# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
|
||||
CONFIG_HAVE_ARCH_AUDITSYSCALL=y
|
||||
CONFIG_HAVE_ARCH_BITREVERSE=y
|
||||
CONFIG_HAVE_ARCH_JUMP_LABEL=y
|
||||
CONFIG_HAVE_ARCH_KGDB=y
|
||||
CONFIG_HAVE_ARCH_PFN_VALID=y
|
||||
CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
|
||||
CONFIG_HAVE_ARCH_TRACEHOOK=y
|
||||
CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y
|
||||
# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
|
||||
CONFIG_HAVE_BPF_JIT=y
|
||||
CONFIG_HAVE_CC_STACKPROTECTOR=y
|
||||
CONFIG_HAVE_CLK=y
|
||||
CONFIG_HAVE_CLK_PREPARE=y
|
||||
CONFIG_HAVE_CONTEXT_TRACKING=y
|
||||
CONFIG_HAVE_C_RECORDMCOUNT=y
|
||||
CONFIG_HAVE_DEBUG_KMEMLEAK=y
|
||||
CONFIG_HAVE_DMA_API_DEBUG=y
|
||||
CONFIG_HAVE_DMA_ATTRS=y
|
||||
CONFIG_HAVE_DMA_CONTIGUOUS=y
|
||||
CONFIG_HAVE_DYNAMIC_FTRACE=y
|
||||
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
|
||||
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
|
||||
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
||||
CONFIG_HAVE_GENERIC_RCU_GUP=y
|
||||
CONFIG_HAVE_MEMBLOCK=y
|
||||
CONFIG_HAVE_NET_DSA=y
|
||||
CONFIG_HAVE_PERF_EVENTS=y
|
||||
CONFIG_HAVE_PERF_REGS=y
|
||||
CONFIG_HAVE_PERF_USER_STACK_DUMP=y
|
||||
CONFIG_HAVE_RCU_TABLE_FREE=y
|
||||
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
|
||||
CONFIG_HAVE_UID16=y
|
||||
CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
|
||||
# CONFIG_HUGETLBFS is not set
|
||||
CONFIG_I2C=y
|
||||
# CONFIG_ACPI_I2C_OPREGION is not set
|
||||
CONFIG_I2C_BOARDINFO=y
|
||||
CONFIG_I2C_CHARDEV=y
|
||||
CONFIG_I2C_IMX=y
|
||||
# CONFIG_IMX2_WDT is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_IOMMU_HELPER=y
|
||||
CONFIG_IRQCHIP=y
|
||||
CONFIG_IRQ_DOMAIN=y
|
||||
CONFIG_IRQ_DOMAIN_HIERARCHY=y
|
||||
CONFIG_IRQ_FORCED_THREADING=y
|
||||
CONFIG_IRQ_WORK=y
|
||||
CONFIG_LIBFDT=y
|
||||
CONFIG_LOCK_SPIN_ON_OWNER=y
|
||||
CONFIG_LS_SCFG_MSI=y
|
||||
CONFIG_LZO_COMPRESS=y
|
||||
CONFIG_LZO_DECOMPRESS=y
|
||||
CONFIG_MDIO_BOARDINFO=y
|
||||
CONFIG_MEMORY=y
|
||||
CONFIG_MFD_SYSCON=y
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_BLOCK=y
|
||||
CONFIG_MMC_BLOCK_MINORS=8
|
||||
CONFIG_MMC_BLOCK_BOUNCE=y
|
||||
CONFIG_MMC_SDHCI=y
|
||||
CONFIG_MMC_SDHCI_PLTFM=y
|
||||
CONFIG_MMC_SDHCI_OF_ESDHC=y
|
||||
# CONFIG_MMC_SDHCI_PCI is not set
|
||||
# CONFIG_MMC_TIFM_SD is not set
|
||||
CONFIG_MTD_CFI_ADV_OPTIONS=y
|
||||
CONFIG_MTD_CFI_BE_BYTE_SWAP=y
|
||||
# CONFIG_MTD_CFI_GEOMETRY is not set
|
||||
# CONFIG_MTD_CFI_NOSWAP is not set
|
||||
CONFIG_MTD_CFI_STAA=y
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_NAND=y
|
||||
CONFIG_MTD_NAND_ECC=y
|
||||
CONFIG_MTD_NAND_FSL_IFC=y
|
||||
CONFIG_MUTEX_SPIN_ON_OWNER=y
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_NET_FLOW_LIMIT=y
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NO_BOOTMEM=y
|
||||
CONFIG_NO_HZ_COMMON=y
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_NR_CPUS=4
|
||||
CONFIG_OF=y
|
||||
CONFIG_OF_ADDRESS=y
|
||||
CONFIG_OF_ADDRESS_PCI=y
|
||||
CONFIG_OF_EARLY_FLATTREE=y
|
||||
CONFIG_OF_FLATTREE=y
|
||||
CONFIG_OF_GPIO=y
|
||||
CONFIG_OF_IRQ=y
|
||||
CONFIG_OF_MDIO=y
|
||||
CONFIG_OF_MTD=y
|
||||
CONFIG_OF_NET=y
|
||||
CONFIG_OF_PCI=y
|
||||
CONFIG_OF_PCI_IRQ=y
|
||||
CONFIG_OF_RESERVED_MEM=y
|
||||
CONFIG_OLD_SIGSUSPEND3=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCIEAER=y
|
||||
CONFIG_PCIEASPM=y
|
||||
# CONFIG_PCIEASPM_DEBUG is not set
|
||||
CONFIG_PCIEASPM_DEFAULT=y
|
||||
# CONFIG_PCIEASPM_PERFORMANCE is not set
|
||||
# CONFIG_PCIEASPM_POWERSAVE is not set
|
||||
CONFIG_PCIEPORTBUS=y
|
||||
CONFIG_PCIE_DW=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
CONFIG_PCI_DOMAINS_GENERIC=y
|
||||
CONFIG_PCI_LAYERSCAPE=y
|
||||
CONFIG_PCI_MSI=y
|
||||
CONFIG_PCI_MSI_IRQ_DOMAIN=y
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
CONFIG_PGTABLE_LEVELS=3
|
||||
CONFIG_PHYLIB=y
|
||||
CONFIG_PHYS_ADDR_T_64BIT=y
|
||||
CONFIG_POWER_RESET=y
|
||||
CONFIG_POWER_RESET_LAYERSCAPE=y
|
||||
# CONFIG_POWER_RESET_XGENE is not set
|
||||
CONFIG_POWER_SUPPLY=y
|
||||
CONFIG_QMAN_CEETM_UPDATE_PERIOD=1000
|
||||
CONFIG_RAS=y
|
||||
CONFIG_RATIONAL=y
|
||||
CONFIG_RCU_STALL_COMMON=y
|
||||
CONFIG_REALTEK_PHY=y
|
||||
CONFIG_REGMAP=y
|
||||
CONFIG_REGMAP_MMIO=y
|
||||
CONFIG_RFS_ACCEL=y
|
||||
CONFIG_RPS=y
|
||||
CONFIG_RWSEM_SPIN_ON_OWNER=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
CONFIG_SCHED_HRTICK=y
|
||||
# CONFIG_SCHED_INFO is not set
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_SERIAL_8250_FSL=y
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_SPARSE_IRQ=y
|
||||
CONFIG_SQUASHFS=y
|
||||
# CONFIG_SQUASHFS_FILE_CACHE is not set
|
||||
CONFIG_SQUASHFS_FILE_DIRECT=y
|
||||
# CONFIG_SQUASHFS_DECOMP_SINGLE is not set
|
||||
# CONFIG_SQUASHFS_DECOMP_MULTI is not set
|
||||
CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y
|
||||
# CONFIG_SQUASHFS_XATTR is not set
|
||||
# CONFIG_SQUASHFS_ZLIB is not set
|
||||
# CONFIG_SQUASHFS_LZ4 is not set
|
||||
# CONFIG_SQUASHFS_LZO is not set
|
||||
CONFIG_SQUASHFS_XZ=y
|
||||
# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set
|
||||
# CONFIG_SQUASHFS_EMBEDDED is not set
|
||||
CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
|
||||
CONFIG_SRCU=y
|
||||
CONFIG_SWIOTLB=y
|
||||
CONFIG_SYS_SUPPORTS_HUGETLBFS=y
|
||||
CONFIG_THERMAL=y
|
||||
CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
|
||||
CONFIG_THERMAL_GOV_STEP_WISE=y
|
||||
CONFIG_THERMAL_OF=y
|
||||
CONFIG_TICK_CPU_ACCOUNTING=y
|
||||
CONFIG_TREE_RCU=y
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_VITESSE_PHY=y
|
||||
CONFIG_XPS=y
|
||||
CONFIG_ZLIB_INFLATE=y
|
60
target/linux/layerscape/image/Makefile
Normal file
60
target/linux/layerscape/image/Makefile
Normal file
|
@ -0,0 +1,60 @@
|
|||
#
|
||||
# Copyright (C) 2016 Jiang Yutang <jiangyutang1978@gmail.com>
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/image.mk
|
||||
|
||||
define Build/append-ls-rcw
|
||||
rm -f $@
|
||||
dd if=$(KDIR)/$(1)-rcw.bin >> $@
|
||||
endef
|
||||
|
||||
define Build/append-ls-uboot
|
||||
dd if=$(KDIR)/$(1)-$(SUBTARGET)-uboot.bin >> $@
|
||||
endef
|
||||
|
||||
define Build/append-ls-fman
|
||||
dd if=$(KDIR)/$(1)-fman.bin >> $@
|
||||
endef
|
||||
|
||||
define Build/append-ls-dtb
|
||||
$(call Image/BuildDTB,$(DTS_DIR)/$(1).dts,$(DTS_DIR)/$(1).dtb)
|
||||
dd if=$(DTS_DIR)/$(1).dtb >> $@
|
||||
endef
|
||||
|
||||
define Device/Default
|
||||
PROFILES = Default
|
||||
FILESYSTEMS := squashfs
|
||||
KERNEL := kernel-bin | gzip | uImage gzip
|
||||
DEVICE_DTS :=
|
||||
IMAGES = firmware.bin
|
||||
|
||||
ifeq ($(SUBTARGET),64b)
|
||||
KERNEL_LOADADDR = 0x80080000
|
||||
KERNEL_ENTRY_POINT = 0x80080000
|
||||
endif
|
||||
ifeq ($(SUBTARGET),32b)
|
||||
KERNEL_LOADADDR = 0x80008000
|
||||
KERNEL_ENTRY_POINT = 0x80008000
|
||||
endif
|
||||
endef
|
||||
|
||||
define Device/ls1043ardb
|
||||
DEVICE_TITLE := ls1043ardb-$(SUBTARGET)
|
||||
DEVICE_PACKAGES += rcw-layerscape-ls1043ardb uboot-layerscape-$(SUBTARGET)-ls1043ardb fman-layerscape-ls1043ardb
|
||||
ifeq ($(SUBTARGET),64b)
|
||||
DEVICE_DTS = freescale/fsl-ls1043a-rdb
|
||||
endif
|
||||
ifeq ($(SUBTARGET),32b)
|
||||
DEVICE_DTS = ../../../arm64/boot/dts/freescale/fsl-ls1043a-rdb
|
||||
endif
|
||||
IMAGE/firmware.bin = append-ls-rcw $(1) | pad-to 1M | append-ls-uboot $(1) | pad-to 3M | \
|
||||
append-ls-fman $(1) | pad-to 4M | append-ls-dtb $$(DEVICE_DTS) | pad-to 5M | \
|
||||
append-kernel | pad-to 10M | append-rootfs | pad-to 64M | check-size 67108865
|
||||
endef
|
||||
TARGET_DEVICES += ls1043ardb
|
||||
|
||||
$(eval $(call BuildImage))
|
|
@ -0,0 +1,43 @@
|
|||
From 7f434723cdb6823443330cd4847d5c3b8dd30bd7 Mon Sep 17 00:00:00 2001
|
||||
From: Stanimir Varbanov <stanimir.varbanov@linaro.org>
|
||||
Date: Fri, 18 Dec 2015 14:38:55 +0200
|
||||
Subject: [PATCH 51/70] PCI: designware: Ensure ATU is enabled before IO/conf
|
||||
space accesses
|
||||
|
||||
Read back the ATU CR2 register to ensure ATU programming is effective
|
||||
before any subsequent I/O or config space accesses.
|
||||
|
||||
Without this, PCI device enumeration is unreliable.
|
||||
|
||||
[bhelgaas: changelog, comment]
|
||||
Signed-off-by: Stanimir Varbanov <stanimir.varbanov@linaro.org>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Acked-by: Pratyush Anand <pratyush.anand@gmail.com>
|
||||
---
|
||||
drivers/pci/host/pcie-designware.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
--- a/drivers/pci/host/pcie-designware.c
|
||||
+++ b/drivers/pci/host/pcie-designware.c
|
||||
@@ -154,6 +154,8 @@ static int dw_pcie_wr_own_conf(struct pc
|
||||
static void dw_pcie_prog_outbound_atu(struct pcie_port *pp, int index,
|
||||
int type, u64 cpu_addr, u64 pci_addr, u32 size)
|
||||
{
|
||||
+ u32 val;
|
||||
+
|
||||
dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | index,
|
||||
PCIE_ATU_VIEWPORT);
|
||||
dw_pcie_writel_rc(pp, lower_32_bits(cpu_addr), PCIE_ATU_LOWER_BASE);
|
||||
@@ -164,6 +166,12 @@ static void dw_pcie_prog_outbound_atu(st
|
||||
dw_pcie_writel_rc(pp, upper_32_bits(pci_addr), PCIE_ATU_UPPER_TARGET);
|
||||
dw_pcie_writel_rc(pp, type, PCIE_ATU_CR1);
|
||||
dw_pcie_writel_rc(pp, PCIE_ATU_ENABLE, PCIE_ATU_CR2);
|
||||
+
|
||||
+ /*
|
||||
+ * Make sure ATU enable takes effect before any subsequent config
|
||||
+ * and I/O accesses.
|
||||
+ */
|
||||
+ dw_pcie_readl_rc(pp, PCIE_ATU_CR2, &val);
|
||||
}
|
||||
|
||||
static struct irq_chip dw_msi_irq_chip = {
|
|
@ -0,0 +1,121 @@
|
|||
From 610b32220391c9d271290bdf8f2b8fe1cf8da9a0 Mon Sep 17 00:00:00 2001
|
||||
From: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Date: Tue, 5 Jan 2016 15:48:11 -0600
|
||||
Subject: [PATCH 52/70] PCI: designware: Simplify control flow
|
||||
|
||||
Return values immediately when possible to simplify the control flow.
|
||||
|
||||
No functional change intended. Folded in unused variable removal as
|
||||
pointed out by Fabio Estevam <fabio.estevam@nxp.com>, Arnd Bergmann
|
||||
<arnd@arndb.de>, and Thierry Reding <thierry.reding@gmail.com>.
|
||||
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Acked-by: Pratyush Anand <pratyush.anand@gmail.com>
|
||||
---
|
||||
drivers/pci/host/pcie-designware.c | 54 ++++++++++++------------------------
|
||||
1 file changed, 18 insertions(+), 36 deletions(-)
|
||||
|
||||
--- a/drivers/pci/host/pcie-designware.c
|
||||
+++ b/drivers/pci/host/pcie-designware.c
|
||||
@@ -128,27 +128,19 @@ static inline void dw_pcie_writel_rc(str
|
||||
static int dw_pcie_rd_own_conf(struct pcie_port *pp, int where, int size,
|
||||
u32 *val)
|
||||
{
|
||||
- int ret;
|
||||
-
|
||||
if (pp->ops->rd_own_conf)
|
||||
- ret = pp->ops->rd_own_conf(pp, where, size, val);
|
||||
- else
|
||||
- ret = dw_pcie_cfg_read(pp->dbi_base + where, size, val);
|
||||
+ return pp->ops->rd_own_conf(pp, where, size, val);
|
||||
|
||||
- return ret;
|
||||
+ return dw_pcie_cfg_read(pp->dbi_base + where, size, val);
|
||||
}
|
||||
|
||||
static int dw_pcie_wr_own_conf(struct pcie_port *pp, int where, int size,
|
||||
u32 val)
|
||||
{
|
||||
- int ret;
|
||||
-
|
||||
if (pp->ops->wr_own_conf)
|
||||
- ret = pp->ops->wr_own_conf(pp, where, size, val);
|
||||
- else
|
||||
- ret = dw_pcie_cfg_write(pp->dbi_base + where, size, val);
|
||||
+ return pp->ops->wr_own_conf(pp, where, size, val);
|
||||
|
||||
- return ret;
|
||||
+ return dw_pcie_cfg_write(pp->dbi_base + where, size, val);
|
||||
}
|
||||
|
||||
static void dw_pcie_prog_outbound_atu(struct pcie_port *pp, int index,
|
||||
@@ -392,8 +384,8 @@ int dw_pcie_link_up(struct pcie_port *pp
|
||||
{
|
||||
if (pp->ops->link_up)
|
||||
return pp->ops->link_up(pp);
|
||||
- else
|
||||
- return 0;
|
||||
+
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static int dw_pcie_msi_map(struct irq_domain *domain, unsigned int irq,
|
||||
@@ -666,46 +658,36 @@ static int dw_pcie_rd_conf(struct pci_bu
|
||||
int size, u32 *val)
|
||||
{
|
||||
struct pcie_port *pp = bus->sysdata;
|
||||
- int ret;
|
||||
|
||||
if (dw_pcie_valid_config(pp, bus, PCI_SLOT(devfn)) == 0) {
|
||||
*val = 0xffffffff;
|
||||
return PCIBIOS_DEVICE_NOT_FOUND;
|
||||
}
|
||||
|
||||
- if (bus->number != pp->root_bus_nr)
|
||||
- if (pp->ops->rd_other_conf)
|
||||
- ret = pp->ops->rd_other_conf(pp, bus, devfn,
|
||||
- where, size, val);
|
||||
- else
|
||||
- ret = dw_pcie_rd_other_conf(pp, bus, devfn,
|
||||
- where, size, val);
|
||||
- else
|
||||
- ret = dw_pcie_rd_own_conf(pp, where, size, val);
|
||||
+ if (bus->number == pp->root_bus_nr)
|
||||
+ return dw_pcie_rd_own_conf(pp, where, size, val);
|
||||
|
||||
- return ret;
|
||||
+ if (pp->ops->rd_other_conf)
|
||||
+ return pp->ops->rd_other_conf(pp, bus, devfn, where, size, val);
|
||||
+
|
||||
+ return dw_pcie_rd_other_conf(pp, bus, devfn, where, size, val);
|
||||
}
|
||||
|
||||
static int dw_pcie_wr_conf(struct pci_bus *bus, u32 devfn,
|
||||
int where, int size, u32 val)
|
||||
{
|
||||
struct pcie_port *pp = bus->sysdata;
|
||||
- int ret;
|
||||
|
||||
if (dw_pcie_valid_config(pp, bus, PCI_SLOT(devfn)) == 0)
|
||||
return PCIBIOS_DEVICE_NOT_FOUND;
|
||||
|
||||
- if (bus->number != pp->root_bus_nr)
|
||||
- if (pp->ops->wr_other_conf)
|
||||
- ret = pp->ops->wr_other_conf(pp, bus, devfn,
|
||||
- where, size, val);
|
||||
- else
|
||||
- ret = dw_pcie_wr_other_conf(pp, bus, devfn,
|
||||
- where, size, val);
|
||||
- else
|
||||
- ret = dw_pcie_wr_own_conf(pp, where, size, val);
|
||||
+ if (bus->number == pp->root_bus_nr)
|
||||
+ return dw_pcie_wr_own_conf(pp, where, size, val);
|
||||
|
||||
- return ret;
|
||||
+ if (pp->ops->wr_other_conf)
|
||||
+ return pp->ops->wr_other_conf(pp, bus, devfn, where, size, val);
|
||||
+
|
||||
+ return dw_pcie_wr_other_conf(pp, bus, devfn, where, size, val);
|
||||
}
|
||||
|
||||
static struct pci_ops dw_pcie_ops = {
|
|
@ -0,0 +1,71 @@
|
|||
From 6882f9eef932e6f5cc3c57115e3d7d4b5bc19662 Mon Sep 17 00:00:00 2001
|
||||
From: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Date: Tue, 5 Jan 2016 15:56:30 -0600
|
||||
Subject: [PATCH 53/70] PCI: designware: Make config accessor override
|
||||
checking symmetric
|
||||
|
||||
Drivers based on the DesignWare core can override the config read accessors
|
||||
by supplying rd_own_conf() and rd_other_conf() function pointers.
|
||||
dw_pcie_rd_conf() calls dw_pcie_rd_own_conf() (for accesses to the root
|
||||
bus) or dw_pcie_rd_other_conf():
|
||||
|
||||
dw_pcie_rd_conf
|
||||
dw_pcie_rd_own_conf # if on root bus
|
||||
dw_pcie_rd_other_conf # if not on root bus
|
||||
|
||||
Previously we checked for rd_other_conf() directly in dw_pcie_rd_conf(),
|
||||
but we checked for rd_own_conf() in dw_pcie_rd_own_conf().
|
||||
|
||||
Check for rd_other_conf() in dw_pcie_rd_other_conf() to make this symmetric
|
||||
with the rd_own_conf() checking, and similarly for the write path.
|
||||
|
||||
No functional change intended.
|
||||
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Acked-by: Pratyush Anand <pratyush.anand@gmail.com>
|
||||
---
|
||||
drivers/pci/host/pcie-designware.c | 12 ++++++------
|
||||
1 file changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/pci/host/pcie-designware.c
|
||||
+++ b/drivers/pci/host/pcie-designware.c
|
||||
@@ -571,6 +571,9 @@ static int dw_pcie_rd_other_conf(struct
|
||||
u64 cpu_addr;
|
||||
void __iomem *va_cfg_base;
|
||||
|
||||
+ if (pp->ops->rd_other_conf)
|
||||
+ return pp->ops->rd_other_conf(pp, bus, devfn, where, size, val);
|
||||
+
|
||||
busdev = PCIE_ATU_BUS(bus->number) | PCIE_ATU_DEV(PCI_SLOT(devfn)) |
|
||||
PCIE_ATU_FUNC(PCI_FUNC(devfn));
|
||||
|
||||
@@ -605,6 +608,9 @@ static int dw_pcie_wr_other_conf(struct
|
||||
u64 cpu_addr;
|
||||
void __iomem *va_cfg_base;
|
||||
|
||||
+ if (pp->ops->wr_other_conf)
|
||||
+ return pp->ops->wr_other_conf(pp, bus, devfn, where, size, val);
|
||||
+
|
||||
busdev = PCIE_ATU_BUS(bus->number) | PCIE_ATU_DEV(PCI_SLOT(devfn)) |
|
||||
PCIE_ATU_FUNC(PCI_FUNC(devfn));
|
||||
|
||||
@@ -667,9 +673,6 @@ static int dw_pcie_rd_conf(struct pci_bu
|
||||
if (bus->number == pp->root_bus_nr)
|
||||
return dw_pcie_rd_own_conf(pp, where, size, val);
|
||||
|
||||
- if (pp->ops->rd_other_conf)
|
||||
- return pp->ops->rd_other_conf(pp, bus, devfn, where, size, val);
|
||||
-
|
||||
return dw_pcie_rd_other_conf(pp, bus, devfn, where, size, val);
|
||||
}
|
||||
|
||||
@@ -684,9 +687,6 @@ static int dw_pcie_wr_conf(struct pci_bu
|
||||
if (bus->number == pp->root_bus_nr)
|
||||
return dw_pcie_wr_own_conf(pp, where, size, val);
|
||||
|
||||
- if (pp->ops->wr_other_conf)
|
||||
- return pp->ops->wr_other_conf(pp, bus, devfn, where, size, val);
|
||||
-
|
||||
return dw_pcie_wr_other_conf(pp, bus, devfn, where, size, val);
|
||||
}
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
From 481b1bc4ce0d58107887558342e50d6323a9601d Mon Sep 17 00:00:00 2001
|
||||
From: Jisheng Zhang <jszhang@marvell.com>
|
||||
Date: Thu, 7 Jan 2016 14:12:38 +0800
|
||||
Subject: [PATCH 54/70] PCI: designware: Explain why we don't program ATU for
|
||||
some platforms
|
||||
|
||||
Some platforms don't support ATU, e.g., pci-keystone.c. These platforms
|
||||
use their own address translation component rather than ATU, and they
|
||||
provide the rd_other_conf and wr_other_conf methods to program the
|
||||
translation component and perform the access.
|
||||
|
||||
Add a comment to explain why we don't program the ATU for these platforms.
|
||||
|
||||
[bhelgaas: changelog]
|
||||
Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
---
|
||||
drivers/pci/host/pcie-designware.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
--- a/drivers/pci/host/pcie-designware.c
|
||||
+++ b/drivers/pci/host/pcie-designware.c
|
||||
@@ -517,6 +517,11 @@ int dw_pcie_host_init(struct pcie_port *
|
||||
if (pp->ops->host_init)
|
||||
pp->ops->host_init(pp);
|
||||
|
||||
+ /*
|
||||
+ * If the platform provides ->rd_other_conf, it means the platform
|
||||
+ * uses its own address translation component rather than ATU, so
|
||||
+ * we should not program the ATU here.
|
||||
+ */
|
||||
if (!pp->ops->rd_other_conf)
|
||||
dw_pcie_prog_outbound_atu(pp, PCIE_ATU_REGION_INDEX1,
|
||||
PCIE_ATU_TYPE_MEM, pp->mem_base,
|
|
@ -0,0 +1,41 @@
|
|||
From ee2a430c1691d0bac3098e8db3c29d8f023b04c2 Mon Sep 17 00:00:00 2001
|
||||
From: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
|
||||
Date: Fri, 29 Jan 2016 11:29:32 +0000
|
||||
Subject: [PATCH 55/70] PCI: designware: Remove PCI_PROBE_ONLY handling
|
||||
|
||||
The PCIe designware host driver is not used in system configurations
|
||||
requiring the PCI_PROBE_ONLY flag to be set to prevent resources
|
||||
assignment, therefore the driver code handling the flag can be removed
|
||||
from the kernel.
|
||||
|
||||
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Acked-by: Pratyush Anand <pratyush.anand@gmail.com>
|
||||
Acked-by: Jingoo Han Jingoo Han <jingoohan1@gmail.com>
|
||||
Cc: Arnd Bergmann <arnd@arndb.de>
|
||||
Cc: Gabriele Paoloni <gabriele.paoloni@huawei.com>
|
||||
Cc: Zhou Wang <wangzhou1@hisilicon.com>
|
||||
---
|
||||
drivers/pci/host/pcie-designware.c | 10 ++++------
|
||||
1 file changed, 4 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/pci/host/pcie-designware.c
|
||||
+++ b/drivers/pci/host/pcie-designware.c
|
||||
@@ -556,13 +556,11 @@ int dw_pcie_host_init(struct pcie_port *
|
||||
pci_fixup_irqs(pci_common_swizzle, of_irq_parse_and_map_pci);
|
||||
#endif
|
||||
|
||||
- if (!pci_has_flag(PCI_PROBE_ONLY)) {
|
||||
- pci_bus_size_bridges(bus);
|
||||
- pci_bus_assign_resources(bus);
|
||||
+ pci_bus_size_bridges(bus);
|
||||
+ pci_bus_assign_resources(bus);
|
||||
|
||||
- list_for_each_entry(child, &bus->children, node)
|
||||
- pcie_bus_configure_settings(child);
|
||||
- }
|
||||
+ list_for_each_entry(child, &bus->children, node)
|
||||
+ pcie_bus_configure_settings(child);
|
||||
|
||||
pci_bus_add_devices(bus);
|
||||
return 0;
|
|
@ -0,0 +1,249 @@
|
|||
From f0c3f31a8bd81b8e7354a187c49200f3ce52740d Mon Sep 17 00:00:00 2001
|
||||
From: Joao Pinto <Joao.Pinto@synopsys.com>
|
||||
Date: Thu, 10 Mar 2016 14:44:35 -0600
|
||||
Subject: [PATCH 56/70] PCI: designware: Add generic dw_pcie_wait_for_link()
|
||||
|
||||
commit 886bc5ceb5cc3ad4b219502d72b277e3c3255a32 upstream
|
||||
[context adjustment]
|
||||
[remove drivers/pci/host/pcie-qcom.c related changes]
|
||||
|
||||
Several DesignWare-based drivers (dra7xx, exynos, imx6, keystone, qcom, and
|
||||
spear13xx) had similar loops waiting for the link to come up.
|
||||
|
||||
Add a generic dw_pcie_wait_for_link() for use by all these drivers so the
|
||||
waiting is done consistently, e.g., always using usleep_range() rather than
|
||||
mdelay() and using similar timeouts and retry counts.
|
||||
|
||||
Note that this changes the Keystone link training/wait for link strategy,
|
||||
so we initiate link training, then wait longer for the link to come up
|
||||
before re-initiating link training.
|
||||
|
||||
[bhelgaas: changelog, split into its own patch, update pci-keystone.c, pcie-qcom.c]
|
||||
Signed-off-by: Joao Pinto <jpinto@synopsys.com>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Acked-by: Pratyush Anand <pratyush.anand@gmail.com>
|
||||
Integrated-by: Jiang Yutang <yutang.jiang@nxp.com>
|
||||
---
|
||||
drivers/pci/host/pci-dra7xx.c | 11 +----------
|
||||
drivers/pci/host/pci-exynos.c | 13 +++----------
|
||||
drivers/pci/host/pci-imx6.c | 13 ++++---------
|
||||
drivers/pci/host/pci-keystone.c | 10 ++++------
|
||||
drivers/pci/host/pcie-designware.c | 19 +++++++++++++++++++
|
||||
drivers/pci/host/pcie-designware.h | 6 ++++++
|
||||
drivers/pci/host/pcie-spear13xx.c | 14 +-------------
|
||||
7 files changed, 38 insertions(+), 48 deletions(-)
|
||||
|
||||
--- a/drivers/pci/host/pci-dra7xx.c
|
||||
+++ b/drivers/pci/host/pci-dra7xx.c
|
||||
@@ -10,7 +10,6 @@
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
-#include <linux/delay.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
@@ -108,7 +107,6 @@ static int dra7xx_pcie_establish_link(st
|
||||
{
|
||||
struct dra7xx_pcie *dra7xx = to_dra7xx_pcie(pp);
|
||||
u32 reg;
|
||||
- unsigned int retries;
|
||||
|
||||
if (dw_pcie_link_up(pp)) {
|
||||
dev_err(pp->dev, "link is already up\n");
|
||||
@@ -119,14 +117,7 @@ static int dra7xx_pcie_establish_link(st
|
||||
reg |= LTSSM_EN;
|
||||
dra7xx_pcie_writel(dra7xx, PCIECTRL_DRA7XX_CONF_DEVICE_CMD, reg);
|
||||
|
||||
- for (retries = 0; retries < 1000; retries++) {
|
||||
- if (dw_pcie_link_up(pp))
|
||||
- return 0;
|
||||
- usleep_range(10, 20);
|
||||
- }
|
||||
-
|
||||
- dev_err(pp->dev, "link is not up\n");
|
||||
- return -EINVAL;
|
||||
+ return dw_pcie_wait_for_link(pp);
|
||||
}
|
||||
|
||||
static void dra7xx_pcie_enable_interrupts(struct pcie_port *pp)
|
||||
--- a/drivers/pci/host/pci-exynos.c
|
||||
+++ b/drivers/pci/host/pci-exynos.c
|
||||
@@ -318,7 +318,6 @@ static int exynos_pcie_establish_link(st
|
||||
{
|
||||
struct exynos_pcie *exynos_pcie = to_exynos_pcie(pp);
|
||||
u32 val;
|
||||
- unsigned int retries;
|
||||
|
||||
if (dw_pcie_link_up(pp)) {
|
||||
dev_err(pp->dev, "Link already up\n");
|
||||
@@ -357,13 +356,8 @@ static int exynos_pcie_establish_link(st
|
||||
PCIE_APP_LTSSM_ENABLE);
|
||||
|
||||
/* check if the link is up or not */
|
||||
- for (retries = 0; retries < 10; retries++) {
|
||||
- if (dw_pcie_link_up(pp)) {
|
||||
- dev_info(pp->dev, "Link up\n");
|
||||
- return 0;
|
||||
- }
|
||||
- mdelay(100);
|
||||
- }
|
||||
+ if (!dw_pcie_wait_for_link(pp))
|
||||
+ return 0;
|
||||
|
||||
while (exynos_phy_readl(exynos_pcie, PCIE_PHY_PLL_LOCKED) == 0) {
|
||||
val = exynos_blk_readl(exynos_pcie, PCIE_PHY_PLL_LOCKED);
|
||||
@@ -372,8 +366,7 @@ static int exynos_pcie_establish_link(st
|
||||
/* power off phy */
|
||||
exynos_pcie_power_off_phy(pp);
|
||||
|
||||
- dev_err(pp->dev, "PCIe Link Fail\n");
|
||||
- return -EINVAL;
|
||||
+ return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
static void exynos_pcie_clear_irq_pulse(struct pcie_port *pp)
|
||||
--- a/drivers/pci/host/pci-imx6.c
|
||||
+++ b/drivers/pci/host/pci-imx6.c
|
||||
@@ -330,19 +330,14 @@ static void imx6_pcie_init_phy(struct pc
|
||||
|
||||
static int imx6_pcie_wait_for_link(struct pcie_port *pp)
|
||||
{
|
||||
- unsigned int retries;
|
||||
+ /* check if the link is up or not */
|
||||
+ if (!dw_pcie_wait_for_link(pp))
|
||||
+ return 0;
|
||||
|
||||
- for (retries = 0; retries < 200; retries++) {
|
||||
- if (dw_pcie_link_up(pp))
|
||||
- return 0;
|
||||
- usleep_range(100, 1000);
|
||||
- }
|
||||
-
|
||||
- dev_err(pp->dev, "phy link never came up\n");
|
||||
dev_dbg(pp->dev, "DEBUG_R0: 0x%08x, DEBUG_R1: 0x%08x\n",
|
||||
readl(pp->dbi_base + PCIE_PHY_DEBUG_R0),
|
||||
readl(pp->dbi_base + PCIE_PHY_DEBUG_R1));
|
||||
- return -EINVAL;
|
||||
+ return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
static int imx6_pcie_wait_for_speed_change(struct pcie_port *pp)
|
||||
--- a/drivers/pci/host/pci-keystone.c
|
||||
+++ b/drivers/pci/host/pci-keystone.c
|
||||
@@ -97,17 +97,15 @@ static int ks_pcie_establish_link(struct
|
||||
return 0;
|
||||
}
|
||||
|
||||
- ks_dw_pcie_initiate_link_train(ks_pcie);
|
||||
/* check if the link is up or not */
|
||||
- for (retries = 0; retries < 200; retries++) {
|
||||
- if (dw_pcie_link_up(pp))
|
||||
- return 0;
|
||||
- usleep_range(100, 1000);
|
||||
+ for (retries = 0; retries < 5; retries++) {
|
||||
ks_dw_pcie_initiate_link_train(ks_pcie);
|
||||
+ if (!dw_pcie_wait_for_link(pp))
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
dev_err(pp->dev, "phy link never came up\n");
|
||||
- return -EINVAL;
|
||||
+ return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
static void ks_pcie_msi_irq_handler(struct irq_desc *desc)
|
||||
--- a/drivers/pci/host/pcie-designware.c
|
||||
+++ b/drivers/pci/host/pcie-designware.c
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <linux/pci_regs.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/types.h>
|
||||
+#include <linux/delay.h>
|
||||
|
||||
#include "pcie-designware.h"
|
||||
|
||||
@@ -380,6 +381,24 @@ static struct msi_controller dw_pcie_msi
|
||||
.teardown_irq = dw_msi_teardown_irq,
|
||||
};
|
||||
|
||||
+int dw_pcie_wait_for_link(struct pcie_port *pp)
|
||||
+{
|
||||
+ int retries;
|
||||
+
|
||||
+ /* check if the link is up or not */
|
||||
+ for (retries = 0; retries < LINK_WAIT_MAX_RETRIES; retries++) {
|
||||
+ if (dw_pcie_link_up(pp)) {
|
||||
+ dev_info(pp->dev, "link up\n");
|
||||
+ return 0;
|
||||
+ }
|
||||
+ usleep_range(LINK_WAIT_USLEEP_MIN, LINK_WAIT_USLEEP_MAX);
|
||||
+ }
|
||||
+
|
||||
+ dev_err(pp->dev, "phy link never came up\n");
|
||||
+
|
||||
+ return -ETIMEDOUT;
|
||||
+}
|
||||
+
|
||||
int dw_pcie_link_up(struct pcie_port *pp)
|
||||
{
|
||||
if (pp->ops->link_up)
|
||||
--- a/drivers/pci/host/pcie-designware.h
|
||||
+++ b/drivers/pci/host/pcie-designware.h
|
||||
@@ -22,6 +22,11 @@
|
||||
#define MAX_MSI_IRQS 32
|
||||
#define MAX_MSI_CTRLS (MAX_MSI_IRQS / 32)
|
||||
|
||||
+/* Parameters for the waiting for link up routine */
|
||||
+#define LINK_WAIT_MAX_RETRIES 10
|
||||
+#define LINK_WAIT_USLEEP_MIN 90000
|
||||
+#define LINK_WAIT_USLEEP_MAX 100000
|
||||
+
|
||||
struct pcie_port {
|
||||
struct device *dev;
|
||||
u8 root_bus_nr;
|
||||
@@ -76,6 +81,7 @@ int dw_pcie_cfg_read(void __iomem *addr,
|
||||
int dw_pcie_cfg_write(void __iomem *addr, int size, u32 val);
|
||||
irqreturn_t dw_handle_msi_irq(struct pcie_port *pp);
|
||||
void dw_pcie_msi_init(struct pcie_port *pp);
|
||||
+int dw_pcie_wait_for_link(struct pcie_port *pp);
|
||||
int dw_pcie_link_up(struct pcie_port *pp);
|
||||
void dw_pcie_setup_rc(struct pcie_port *pp);
|
||||
int dw_pcie_host_init(struct pcie_port *pp);
|
||||
--- a/drivers/pci/host/pcie-spear13xx.c
|
||||
+++ b/drivers/pci/host/pcie-spear13xx.c
|
||||
@@ -13,7 +13,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
-#include <linux/delay.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
@@ -149,7 +148,6 @@ static int spear13xx_pcie_establish_link
|
||||
struct spear13xx_pcie *spear13xx_pcie = to_spear13xx_pcie(pp);
|
||||
struct pcie_app_reg *app_reg = spear13xx_pcie->app_base;
|
||||
u32 exp_cap_off = EXP_CAP_ID_OFFSET;
|
||||
- unsigned int retries;
|
||||
|
||||
if (dw_pcie_link_up(pp)) {
|
||||
dev_err(pp->dev, "link already up\n");
|
||||
@@ -200,17 +198,7 @@ static int spear13xx_pcie_establish_link
|
||||
| ((u32)1 << REG_TRANSLATION_ENABLE),
|
||||
&app_reg->app_ctrl_0);
|
||||
|
||||
- /* check if the link is up or not */
|
||||
- for (retries = 0; retries < 10; retries++) {
|
||||
- if (dw_pcie_link_up(pp)) {
|
||||
- dev_info(pp->dev, "link up\n");
|
||||
- return 0;
|
||||
- }
|
||||
- mdelay(100);
|
||||
- }
|
||||
-
|
||||
- dev_err(pp->dev, "link Fail\n");
|
||||
- return -EINVAL;
|
||||
+ return dw_pcie_wait_for_link(pp);
|
||||
}
|
||||
|
||||
static irqreturn_t spear13xx_pcie_irq_handler(int irq, void *arg)
|
|
@ -0,0 +1,46 @@
|
|||
From a0a4f406c7e90b2be66e88ea8b21699940c0823f Mon Sep 17 00:00:00 2001
|
||||
From: Joao Pinto <Joao.Pinto@synopsys.com>
|
||||
Date: Thu, 10 Mar 2016 14:44:44 -0600
|
||||
Subject: [PATCH 57/70] PCI: designware: Add default link up check if
|
||||
sub-driver doesn't override
|
||||
|
||||
Add a default DesignWare "link_up" test for use when a sub-driver doesn't
|
||||
supply its own pcie_host_ops.link_up() method.
|
||||
|
||||
[bhelgaas: changelog, split into its own patch]
|
||||
Signed-off-by: Joao Pinto <jpinto@synopsys.com>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Acked-by: Pratyush Anand <pratyush.anand@gmail.com>
|
||||
---
|
||||
drivers/pci/host/pcie-designware.c | 10 +++++++++-
|
||||
1 file changed, 9 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/pci/host/pcie-designware.c
|
||||
+++ b/drivers/pci/host/pcie-designware.c
|
||||
@@ -70,6 +70,11 @@
|
||||
#define PCIE_ATU_FUNC(x) (((x) & 0x7) << 16)
|
||||
#define PCIE_ATU_UPPER_TARGET 0x91C
|
||||
|
||||
+/* PCIe Port Logic registers */
|
||||
+#define PLR_OFFSET 0x700
|
||||
+#define PCIE_PHY_DEBUG_R1 (PLR_OFFSET + 0x2c)
|
||||
+#define PCIE_PHY_DEBUG_R1_LINK_UP 0x00000010
|
||||
+
|
||||
static struct pci_ops dw_pcie_ops;
|
||||
|
||||
int dw_pcie_cfg_read(void __iomem *addr, int size, u32 *val)
|
||||
@@ -401,10 +406,13 @@ int dw_pcie_wait_for_link(struct pcie_po
|
||||
|
||||
int dw_pcie_link_up(struct pcie_port *pp)
|
||||
{
|
||||
+ u32 val;
|
||||
+
|
||||
if (pp->ops->link_up)
|
||||
return pp->ops->link_up(pp);
|
||||
|
||||
- return 0;
|
||||
+ val = readl(pp->dbi_base + PCIE_PHY_DEBUG_R1);
|
||||
+ return val & PCIE_PHY_DEBUG_R1_LINK_UP;
|
||||
}
|
||||
|
||||
static int dw_pcie_msi_map(struct irq_domain *domain, unsigned int irq,
|
|
@ -0,0 +1,109 @@
|
|||
From 892a427f8a2b25b561298941cf1fc0373a98b269 Mon Sep 17 00:00:00 2001
|
||||
From: Jisheng Zhang <jszhang@marvell.com>
|
||||
Date: Wed, 16 Mar 2016 19:40:33 +0800
|
||||
Subject: [PATCH 58/70] PCI: designware: Move Root Complex setup code to
|
||||
dw_pcie_setup_rc()
|
||||
|
||||
dw_pcie_host_init() looks up host bridge resources, ioremaps them, creates
|
||||
IRQ domains, and enumerates devices below the bridge. dw_pcie_setup_rc()
|
||||
programs the Root Complex registers. The Root Complex may lose power
|
||||
during suspend-to-RAM, and when we resume, we want to redo the latter but
|
||||
not the former.
|
||||
|
||||
Move some Root Complex programming from dw_pcie_host_init() to
|
||||
dw_pcie_setup_rc() where it belongs. DesignWare-based drivers can call
|
||||
dw_pcie_setup_rc() in their resume paths.
|
||||
|
||||
[Niklas Cassel <niklas.cassel@axis.com>: This change moves outbound ATU
|
||||
programming, which uses pp->mem_base, to dw_pcie_setup_rc(). Apply the
|
||||
dra7xx pp->mem_base update before calling dw_pcie_setup_rc().]
|
||||
|
||||
[bhelgaas: changelog, fold in dra7xx fix from Niklas]
|
||||
Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Acked-by: Pratyush Anand <pratyush.anand@gmail.com>
|
||||
---
|
||||
drivers/pci/host/pci-dra7xx.c | 4 ++--
|
||||
drivers/pci/host/pcie-designware.c | 39 ++++++++++++++++++------------------
|
||||
2 files changed, 21 insertions(+), 22 deletions(-)
|
||||
|
||||
--- a/drivers/pci/host/pci-dra7xx.c
|
||||
+++ b/drivers/pci/host/pci-dra7xx.c
|
||||
@@ -142,13 +142,13 @@ static void dra7xx_pcie_enable_interrupt
|
||||
|
||||
static void dra7xx_pcie_host_init(struct pcie_port *pp)
|
||||
{
|
||||
- dw_pcie_setup_rc(pp);
|
||||
-
|
||||
pp->io_base &= DRA7XX_CPU_TO_BUS_ADDR;
|
||||
pp->mem_base &= DRA7XX_CPU_TO_BUS_ADDR;
|
||||
pp->cfg0_base &= DRA7XX_CPU_TO_BUS_ADDR;
|
||||
pp->cfg1_base &= DRA7XX_CPU_TO_BUS_ADDR;
|
||||
|
||||
+ dw_pcie_setup_rc(pp);
|
||||
+
|
||||
dra7xx_pcie_establish_link(pp);
|
||||
if (IS_ENABLED(CONFIG_PCI_MSI))
|
||||
dw_pcie_msi_init(pp);
|
||||
--- a/drivers/pci/host/pcie-designware.c
|
||||
+++ b/drivers/pci/host/pcie-designware.c
|
||||
@@ -434,7 +434,6 @@ int dw_pcie_host_init(struct pcie_port *
|
||||
struct platform_device *pdev = to_platform_device(pp->dev);
|
||||
struct pci_bus *bus, *child;
|
||||
struct resource *cfg_res;
|
||||
- u32 val;
|
||||
int i, ret;
|
||||
LIST_HEAD(res);
|
||||
struct resource_entry *win;
|
||||
@@ -544,25 +543,6 @@ int dw_pcie_host_init(struct pcie_port *
|
||||
if (pp->ops->host_init)
|
||||
pp->ops->host_init(pp);
|
||||
|
||||
- /*
|
||||
- * If the platform provides ->rd_other_conf, it means the platform
|
||||
- * uses its own address translation component rather than ATU, so
|
||||
- * we should not program the ATU here.
|
||||
- */
|
||||
- if (!pp->ops->rd_other_conf)
|
||||
- dw_pcie_prog_outbound_atu(pp, PCIE_ATU_REGION_INDEX1,
|
||||
- PCIE_ATU_TYPE_MEM, pp->mem_base,
|
||||
- pp->mem_bus_addr, pp->mem_size);
|
||||
-
|
||||
- dw_pcie_wr_own_conf(pp, PCI_BASE_ADDRESS_0, 4, 0);
|
||||
-
|
||||
- /* program correct class for RC */
|
||||
- dw_pcie_wr_own_conf(pp, PCI_CLASS_DEVICE, 2, PCI_CLASS_BRIDGE_PCI);
|
||||
-
|
||||
- dw_pcie_rd_own_conf(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, 4, &val);
|
||||
- val |= PORT_LOGIC_SPEED_CHANGE;
|
||||
- dw_pcie_wr_own_conf(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, 4, val);
|
||||
-
|
||||
pp->root_bus_nr = pp->busn->start;
|
||||
if (IS_ENABLED(CONFIG_PCI_MSI)) {
|
||||
bus = pci_scan_root_bus_msi(pp->dev, pp->root_bus_nr,
|
||||
@@ -800,6 +780,25 @@ void dw_pcie_setup_rc(struct pcie_port *
|
||||
val |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
|
||||
PCI_COMMAND_MASTER | PCI_COMMAND_SERR;
|
||||
dw_pcie_writel_rc(pp, val, PCI_COMMAND);
|
||||
+
|
||||
+ /*
|
||||
+ * If the platform provides ->rd_other_conf, it means the platform
|
||||
+ * uses its own address translation component rather than ATU, so
|
||||
+ * we should not program the ATU here.
|
||||
+ */
|
||||
+ if (!pp->ops->rd_other_conf)
|
||||
+ dw_pcie_prog_outbound_atu(pp, PCIE_ATU_REGION_INDEX1,
|
||||
+ PCIE_ATU_TYPE_MEM, pp->mem_base,
|
||||
+ pp->mem_bus_addr, pp->mem_size);
|
||||
+
|
||||
+ dw_pcie_wr_own_conf(pp, PCI_BASE_ADDRESS_0, 4, 0);
|
||||
+
|
||||
+ /* program correct class for RC */
|
||||
+ dw_pcie_wr_own_conf(pp, PCI_CLASS_DEVICE, 2, PCI_CLASS_BRIDGE_PCI);
|
||||
+
|
||||
+ dw_pcie_rd_own_conf(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, 4, &val);
|
||||
+ val |= PORT_LOGIC_SPEED_CHANGE;
|
||||
+ dw_pcie_wr_own_conf(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, 4, val);
|
||||
}
|
||||
|
||||
MODULE_AUTHOR("Jingoo Han <jg1.han@samsung.com>");
|
|
@ -0,0 +1,45 @@
|
|||
From ae717a9744a3e18f2ed0a6aa44e279c89ad5052c Mon Sep 17 00:00:00 2001
|
||||
From: Gabriele Paoloni <gabriele.paoloni@huawei.com>
|
||||
Date: Sat, 16 Apr 2016 12:03:39 +0100
|
||||
Subject: [PATCH 59/70] PCI: designware: Remove incorrect RC memory base/limit
|
||||
configuration
|
||||
|
||||
Currently dw_pcie_setup_rc() configures memory base and memory limit in the
|
||||
type1 configuration header for the root complex. In doing so it uses the
|
||||
CPU address (pp->mem_base) rather than the bus address (pp->mem_bus_addr).
|
||||
This is wrong and it is useless since the configuration is overwritten
|
||||
later on when pci_bus_assign_resources() is called.
|
||||
|
||||
Remove this configuration from dw_pcie_setup_rc().
|
||||
|
||||
Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Acked-by: Pratyush Anand <pratyush.anand@gmail.com>
|
||||
---
|
||||
drivers/pci/host/pcie-designware.c | 8 --------
|
||||
1 file changed, 8 deletions(-)
|
||||
|
||||
--- a/drivers/pci/host/pcie-designware.c
|
||||
+++ b/drivers/pci/host/pcie-designware.c
|
||||
@@ -708,8 +708,6 @@ static struct pci_ops dw_pcie_ops = {
|
||||
void dw_pcie_setup_rc(struct pcie_port *pp)
|
||||
{
|
||||
u32 val;
|
||||
- u32 membase;
|
||||
- u32 memlimit;
|
||||
|
||||
/* set the number of lanes */
|
||||
dw_pcie_readl_rc(pp, PCIE_PORT_LINK_CONTROL, &val);
|
||||
@@ -768,12 +766,6 @@ void dw_pcie_setup_rc(struct pcie_port *
|
||||
val |= 0x00010100;
|
||||
dw_pcie_writel_rc(pp, val, PCI_PRIMARY_BUS);
|
||||
|
||||
- /* setup memory base, memory limit */
|
||||
- membase = ((u32)pp->mem_base & 0xfff00000) >> 16;
|
||||
- memlimit = (pp->mem_size + (u32)pp->mem_base) & 0xfff00000;
|
||||
- val = memlimit | membase;
|
||||
- dw_pcie_writel_rc(pp, val, PCI_MEMORY_BASE);
|
||||
-
|
||||
/* setup command register */
|
||||
dw_pcie_readl_rc(pp, PCI_COMMAND, &val);
|
||||
val &= 0xffff0000;
|
|
@ -0,0 +1,209 @@
|
|||
From 4c4e5c275a0e37570d6267802e66a350b0b93dcd Mon Sep 17 00:00:00 2001
|
||||
From: Alison Wang <b18965@freescale.com>
|
||||
Date: Tue, 17 May 2016 17:30:19 +0800
|
||||
Subject: [PATCH 06/70] armv8: aarch32: Add the default config
|
||||
ls_aarch32_defconfig
|
||||
|
||||
ls_aarch32_defconfig is used as the default config for running 32-bit
|
||||
Linux.
|
||||
|
||||
Signed-off-by: Ebony Zhu <ebony.zhu@nxp.com>
|
||||
Signed-off-by: Alison Wang <alison.wang@nxp.com>
|
||||
---
|
||||
arch/arm/configs/ls_aarch32_defconfig | 190 +++++++++++++++++++++++++++++++++
|
||||
1 file changed, 190 insertions(+)
|
||||
create mode 100644 arch/arm/configs/ls_aarch32_defconfig
|
||||
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/configs/ls_aarch32_defconfig
|
||||
@@ -0,0 +1,190 @@
|
||||
+# CONFIG_LOCALVERSION_AUTO is not set
|
||||
+CONFIG_SYSVIPC=y
|
||||
+CONFIG_POSIX_MQUEUE=y
|
||||
+# CONFIG_CROSS_MEMORY_ATTACH is not set
|
||||
+CONFIG_IRQ_DOMAIN_DEBUG=y
|
||||
+CONFIG_NO_HZ_IDLE=y
|
||||
+CONFIG_HIGH_RES_TIMERS=y
|
||||
+CONFIG_LOG_BUF_SHIFT=16
|
||||
+CONFIG_BLK_DEV_INITRD=y
|
||||
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
+CONFIG_SYSCTL_SYSCALL=y
|
||||
+CONFIG_KALLSYMS_ALL=y
|
||||
+CONFIG_EMBEDDED=y
|
||||
+# CONFIG_VM_EVENT_COUNTERS is not set
|
||||
+# CONFIG_SLUB_DEBUG is not set
|
||||
+CONFIG_PROFILING=y
|
||||
+CONFIG_OPROFILE=y
|
||||
+CONFIG_KPROBES=y
|
||||
+CONFIG_JUMP_LABEL=y
|
||||
+CONFIG_MODULES=y
|
||||
+CONFIG_MODULE_FORCE_LOAD=y
|
||||
+CONFIG_MODULE_UNLOAD=y
|
||||
+# CONFIG_BLK_DEV_BSG is not set
|
||||
+CONFIG_BLK_CMDLINE_PARSER=y
|
||||
+CONFIG_ARCH_MXC=y
|
||||
+CONFIG_ARCH_LAYERSCAPE=y
|
||||
+CONFIG_ARM_LPAE=y
|
||||
+# CONFIG_CACHE_L2X0 is not set
|
||||
+CONFIG_PCI=y
|
||||
+CONFIG_PCI_MSI=y
|
||||
+CONFIG_PCI_HOST_GENERIC=y
|
||||
+CONFIG_PCI_LAYERSCAPE=y
|
||||
+CONFIG_SMP=y
|
||||
+CONFIG_VMSPLIT_2G=y
|
||||
+CONFIG_PREEMPT_VOLUNTARY=y
|
||||
+CONFIG_AEABI=y
|
||||
+CONFIG_HIGHMEM=y
|
||||
+CONFIG_CLEANCACHE=y
|
||||
+CONFIG_FRONTSWAP=y
|
||||
+CONFIG_CMDLINE="console=ttyS0,115200"
|
||||
+CONFIG_CPU_FREQ=y
|
||||
+CONFIG_CPU_IDLE=y
|
||||
+CONFIG_VFP=y
|
||||
+CONFIG_NEON=y
|
||||
+CONFIG_KERNEL_MODE_NEON=y
|
||||
+CONFIG_BINFMT_MISC=y
|
||||
+CONFIG_NET=y
|
||||
+CONFIG_PACKET=y
|
||||
+CONFIG_UNIX=y
|
||||
+CONFIG_UNIX_DIAG=y
|
||||
+CONFIG_XFRM_USER=y
|
||||
+CONFIG_NET_KEY=y
|
||||
+CONFIG_INET=y
|
||||
+CONFIG_IP_MULTICAST=y
|
||||
+CONFIG_IP_ADVANCED_ROUTER=y
|
||||
+CONFIG_IP_PNP=y
|
||||
+CONFIG_IP_PNP_DHCP=y
|
||||
+CONFIG_IP_MROUTE=y
|
||||
+CONFIG_INET_AH=y
|
||||
+CONFIG_INET_ESP=y
|
||||
+CONFIG_INET_IPCOMP=y
|
||||
+CONFIG_INET_UDP_DIAG=y
|
||||
+# CONFIG_IPV6 is not set
|
||||
+CONFIG_NETFILTER=y
|
||||
+CONFIG_CAN=y
|
||||
+# CONFIG_CAN_BCM is not set
|
||||
+# CONFIG_CAN_GW is not set
|
||||
+CONFIG_CAN_FLEXCAN=y
|
||||
+CONFIG_DEVTMPFS=y
|
||||
+CONFIG_DEVTMPFS_MOUNT=y
|
||||
+# CONFIG_FW_LOADER is not set
|
||||
+CONFIG_MTD=y
|
||||
+CONFIG_MTD_CMDLINE_PARTS=y
|
||||
+CONFIG_MTD_BLOCK=y
|
||||
+CONFIG_MTD_CFI=y
|
||||
+CONFIG_MTD_CFI_ADV_OPTIONS=y
|
||||
+CONFIG_MTD_CFI_BE_BYTE_SWAP=y
|
||||
+CONFIG_MTD_CFI_GEOMETRY=y
|
||||
+CONFIG_MTD_CFI_INTELEXT=y
|
||||
+CONFIG_MTD_CFI_AMDSTD=y
|
||||
+CONFIG_MTD_CFI_STAA=y
|
||||
+CONFIG_MTD_PHYSMAP_OF=y
|
||||
+CONFIG_MTD_DATAFLASH=y
|
||||
+CONFIG_MTD_SST25L=y
|
||||
+CONFIG_MTD_NAND=y
|
||||
+CONFIG_MTD_NAND_FSL_IFC=y
|
||||
+CONFIG_MTD_SPI_NOR=y
|
||||
+CONFIG_SPI_FSL_QUADSPI=y
|
||||
+CONFIG_BLK_DEV_LOOP=y
|
||||
+CONFIG_BLK_DEV_RAM=y
|
||||
+CONFIG_BLK_DEV_RAM_COUNT=8
|
||||
+CONFIG_BLK_DEV_RAM_SIZE=262144
|
||||
+CONFIG_NETDEVICES=y
|
||||
+# CONFIG_NET_VENDOR_FREESCALE is not set
|
||||
+CONFIG_E1000=y
|
||||
+CONFIG_E1000E=y
|
||||
+CONFIG_PHYLIB=y
|
||||
+CONFIG_AT803X_PHY=y
|
||||
+CONFIG_VITESSE_PHY=y
|
||||
+CONFIG_BROADCOM_PHY=y
|
||||
+CONFIG_REALTEK_PHY=y
|
||||
+CONFIG_NATIONAL_PHY=y
|
||||
+CONFIG_MICREL_PHY=y
|
||||
+CONFIG_MDIO_BUS_MUX_MMIOREG=y
|
||||
+CONFIG_INPUT_EVDEV=y
|
||||
+# CONFIG_MOUSE_PS2_TRACKPOINT is not set
|
||||
+CONFIG_SERIO_SERPORT=m
|
||||
+# CONFIG_CONSOLE_TRANSLATIONS is not set
|
||||
+CONFIG_SERIAL_8250=y
|
||||
+# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set
|
||||
+CONFIG_SERIAL_8250_CONSOLE=y
|
||||
+CONFIG_SERIAL_8250_EXTENDED=y
|
||||
+CONFIG_SERIAL_8250_SHARE_IRQ=y
|
||||
+CONFIG_SERIAL_OF_PLATFORM=y
|
||||
+CONFIG_SERIAL_FSL_LPUART=y
|
||||
+CONFIG_SERIAL_FSL_LPUART_CONSOLE=y
|
||||
+CONFIG_HW_RANDOM=y
|
||||
+CONFIG_I2C=y
|
||||
+CONFIG_I2C_CHARDEV=y
|
||||
+CONFIG_I2C_MUX=y
|
||||
+CONFIG_I2C_MUX_PCA954x=y
|
||||
+CONFIG_I2C_IMX=y
|
||||
+CONFIG_SPI=y
|
||||
+CONFIG_SPI_BITBANG=y
|
||||
+CONFIG_SPI_FSL_DSPI=y
|
||||
+CONFIG_PTP_1588_CLOCK=y
|
||||
+CONFIG_GPIO_SYSFS=y
|
||||
+CONFIG_GPIO_MPC8XXX=y
|
||||
+CONFIG_SENSORS_LTC2945=y
|
||||
+CONFIG_SENSORS_LM90=y
|
||||
+CONFIG_SENSORS_INA2XX=y
|
||||
+CONFIG_WATCHDOG=y
|
||||
+CONFIG_IMX2_WDT=y
|
||||
+CONFIG_MFD_SYSCON=y
|
||||
+CONFIG_FB=y
|
||||
+CONFIG_USB=y
|
||||
+CONFIG_USB_XHCI_HCD=y
|
||||
+CONFIG_MMC=y
|
||||
+CONFIG_MMC_SDHCI=y
|
||||
+CONFIG_MMC_SDHCI_PLTFM=y
|
||||
+CONFIG_MMC_SDHCI_OF_ESDHC=y
|
||||
+CONFIG_RTC_CLASS=y
|
||||
+CONFIG_RTC_DRV_DS3232=y
|
||||
+CONFIG_DMADEVICES=y
|
||||
+CONFIG_FSL_EDMA=y
|
||||
+CONFIG_CLK_QORIQ=y
|
||||
+# CONFIG_IOMMU_SUPPORT is not set
|
||||
+CONFIG_MEMORY=y
|
||||
+CONFIG_PWM=y
|
||||
+CONFIG_PWM_FSL_FTM=y
|
||||
+# CONFIG_RESET_CONTROLLER is not set
|
||||
+CONFIG_EXT2_FS=y
|
||||
+CONFIG_EXT2_FS_XATTR=y
|
||||
+CONFIG_EXT3_FS=y
|
||||
+CONFIG_EXT4_FS=y
|
||||
+CONFIG_FANOTIFY=y
|
||||
+CONFIG_ISO9660_FS=m
|
||||
+CONFIG_JOLIET=y
|
||||
+CONFIG_ZISOFS=y
|
||||
+CONFIG_UDF_FS=m
|
||||
+CONFIG_MSDOS_FS=y
|
||||
+CONFIG_VFAT_FS=y
|
||||
+CONFIG_NTFS_FS=m
|
||||
+CONFIG_TMPFS=y
|
||||
+CONFIG_TMPFS_POSIX_ACL=y
|
||||
+CONFIG_CONFIGFS_FS=y
|
||||
+CONFIG_JFFS2_FS=y
|
||||
+CONFIG_NFS_FS=y
|
||||
+CONFIG_NFS_V4=y
|
||||
+CONFIG_ROOT_NFS=y
|
||||
+CONFIG_NLS_DEFAULT="cp437"
|
||||
+CONFIG_NLS_CODEPAGE_437=y
|
||||
+CONFIG_NLS_ASCII=y
|
||||
+CONFIG_NLS_ISO8859_1=y
|
||||
+CONFIG_NLS_ISO8859_2=y
|
||||
+CONFIG_NLS_ISO8859_15=y
|
||||
+CONFIG_NLS_UTF8=y
|
||||
+CONFIG_DEBUG_FS=y
|
||||
+CONFIG_DEBUG_SECTION_MISMATCH=y
|
||||
+CONFIG_MAGIC_SYSRQ=y
|
||||
+# CONFIG_SCHED_DEBUG is not set
|
||||
+# CONFIG_FTRACE is not set
|
||||
+CONFIG_PID_IN_CONTEXTIDR=y
|
||||
+CONFIG_CRYPTO_LZO=y
|
||||
+# CONFIG_CRYPTO_ANSI_CPRNG is not set
|
||||
+# CONFIG_CRYPTO_HW is not set
|
||||
+CONFIG_CRC_CCITT=m
|
||||
+CONFIG_CRC_T10DIF=y
|
||||
+CONFIG_CRC7=m
|
||||
+CONFIG_LIBCRC32C=m
|
|
@ -0,0 +1,101 @@
|
|||
From 0cc4fd2e52f23f9b35dfdac80021da97ac6c2c52 Mon Sep 17 00:00:00 2001
|
||||
From: Pan Jiafei <Jiafei.Pan@nxp.com>
|
||||
Date: Tue, 24 May 2016 16:15:49 +0800
|
||||
Subject: [PATCH 27/70] armv8: aarch32: update defconfig for LayerScape SoC
|
||||
|
||||
Enable QBMan, FMD, DPAA ethernet, kernel bridge, ATA,
|
||||
DMA_CMA, USB_STORAGE, PHY etc.
|
||||
|
||||
Signed-off-by: Pan Jiafei <Jiafei.Pan@nxp.com>
|
||||
---
|
||||
arch/arm/configs/ls_aarch32_defconfig | 20 +++++++++++++++++++-
|
||||
1 file changed, 19 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm/configs/ls_aarch32_defconfig
|
||||
+++ b/arch/arm/configs/ls_aarch32_defconfig
|
||||
@@ -26,6 +26,7 @@ CONFIG_ARCH_MXC=y
|
||||
CONFIG_ARCH_LAYERSCAPE=y
|
||||
CONFIG_ARM_LPAE=y
|
||||
# CONFIG_CACHE_L2X0 is not set
|
||||
+CONFIG_HAS_FSL_QBMAN=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_MSI=y
|
||||
CONFIG_PCI_HOST_GENERIC=y
|
||||
@@ -36,6 +37,7 @@ CONFIG_PREEMPT_VOLUNTARY=y
|
||||
CONFIG_AEABI=y
|
||||
CONFIG_HIGHMEM=y
|
||||
CONFIG_CLEANCACHE=y
|
||||
+CONFIG_CMA=y
|
||||
CONFIG_FRONTSWAP=y
|
||||
CONFIG_CMDLINE="console=ttyS0,115200"
|
||||
CONFIG_CPU_FREQ=y
|
||||
@@ -62,6 +64,7 @@ CONFIG_INET_IPCOMP=y
|
||||
CONFIG_INET_UDP_DIAG=y
|
||||
# CONFIG_IPV6 is not set
|
||||
CONFIG_NETFILTER=y
|
||||
+CONFIG_BRIDGE=y
|
||||
CONFIG_CAN=y
|
||||
# CONFIG_CAN_BCM is not set
|
||||
# CONFIG_CAN_GW is not set
|
||||
@@ -69,6 +72,7 @@ CONFIG_CAN_FLEXCAN=y
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
+CONFIG_DMA_CMA=y
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_BLOCK=y
|
||||
@@ -81,17 +85,26 @@ CONFIG_MTD_CFI_AMDSTD=y
|
||||
CONFIG_MTD_CFI_STAA=y
|
||||
CONFIG_MTD_PHYSMAP_OF=y
|
||||
CONFIG_MTD_DATAFLASH=y
|
||||
+CONFIG_MTD_M25P80=y
|
||||
CONFIG_MTD_SST25L=y
|
||||
CONFIG_MTD_NAND=y
|
||||
CONFIG_MTD_NAND_FSL_IFC=y
|
||||
CONFIG_MTD_SPI_NOR=y
|
||||
+CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y
|
||||
CONFIG_SPI_FSL_QUADSPI=y
|
||||
+CONFIG_BLK_DEV_SD=y
|
||||
+CONFIG_ATA=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=8
|
||||
CONFIG_BLK_DEV_RAM_SIZE=262144
|
||||
CONFIG_NETDEVICES=y
|
||||
-# CONFIG_NET_VENDOR_FREESCALE is not set
|
||||
+CONFIG_NET_VENDOR_FREESCALE is not set
|
||||
+CONFIG_FSL_BMAN=y
|
||||
+CONFIG_FSL_QMAN=y
|
||||
+CONFIG_FSL_SDK_FMAN=y
|
||||
+CONFIG_FMAN_ARM=y
|
||||
+CONFIG_FSL_SDK_DPAA_ETH=y
|
||||
CONFIG_E1000=y
|
||||
CONFIG_E1000E=y
|
||||
CONFIG_PHYLIB=y
|
||||
@@ -101,6 +114,8 @@ CONFIG_BROADCOM_PHY=y
|
||||
CONFIG_REALTEK_PHY=y
|
||||
CONFIG_NATIONAL_PHY=y
|
||||
CONFIG_MICREL_PHY=y
|
||||
+CONFIG_FIXED_PHY=y
|
||||
+CONFIG_FSL_XGMAC_MDIO=y
|
||||
CONFIG_MDIO_BUS_MUX_MMIOREG=y
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
# CONFIG_MOUSE_PS2_TRACKPOINT is not set
|
||||
@@ -135,6 +150,8 @@ CONFIG_MFD_SYSCON=y
|
||||
CONFIG_FB=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_XHCI_HCD=y
|
||||
+CONFIG_USB_DWC3=y
|
||||
+CONFIG_USB_STORAGE=y
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_SDHCI=y
|
||||
CONFIG_MMC_SDHCI_PLTFM=y
|
||||
@@ -143,6 +160,7 @@ CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_DS3232=y
|
||||
CONFIG_DMADEVICES=y
|
||||
CONFIG_FSL_EDMA=y
|
||||
+CONFIG_STAGING=y
|
||||
CONFIG_CLK_QORIQ=y
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
CONFIG_MEMORY=y
|
|
@ -0,0 +1,552 @@
|
|||
From 3ce895cbe3469bfcaa84674ec4f1b2d60e8b370b Mon Sep 17 00:00:00 2001
|
||||
From: Mingkai Hu <Mingkai.Hu@freescale.com>
|
||||
Date: Mon, 21 Jul 2014 14:48:42 +0800
|
||||
Subject: [PATCH 01/70] arm64/ls1043a: add DTS for Freescale LS1043A SoC
|
||||
|
||||
LS1043a is an SoC with 4 ARMv8 A53 cores and most other IP blocks
|
||||
similar to LS1021a which complies to Chassis 2.1 spec.
|
||||
|
||||
Following levels of DTSI/DTS files have been created for the
|
||||
LS1043A SoC family:
|
||||
|
||||
- fsl-ls1043a.dtsi:
|
||||
DTS-Include file for FSL LS1043A SoC.
|
||||
|
||||
Signed-off-by: Li Yang <leoli@freescale.com>
|
||||
Signed-off-by: Hou Zhiqiang <B48286@freescale.com>
|
||||
Signed-off-by: Mingkai Hu <Mingkai.Hu@freescale.com>
|
||||
Signed-off-by: Wenbin Song <Wenbin.Song@freescale.com>
|
||||
Signed-off-by: Mingkai Hu <mingkai.hu@nxp.com>
|
||||
---
|
||||
arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi | 525 ++++++++++++++++++++++++
|
||||
1 file changed, 525 insertions(+)
|
||||
create mode 100644 arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi
|
||||
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi
|
||||
@@ -0,0 +1,525 @@
|
||||
+/*
|
||||
+ * Device Tree Include file for Freescale Layerscape-1043A family SoC.
|
||||
+ *
|
||||
+ * Copyright 2014-2015, Freescale Semiconductor
|
||||
+ *
|
||||
+ * Mingkai Hu <Mingkai.hu@freescale.com>
|
||||
+ *
|
||||
+ * This file is dual-licensed: you can use it either under the terms
|
||||
+ * of the GPLv2 or the X11 license, at your option. Note that this dual
|
||||
+ * licensing only applies to this file, and not this project as a
|
||||
+ * whole.
|
||||
+ *
|
||||
+ * a) This library 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.
|
||||
+ *
|
||||
+ * This library 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.
|
||||
+ *
|
||||
+ * Or, alternatively,
|
||||
+ *
|
||||
+ * b) Permission is hereby granted, free of charge, to any person
|
||||
+ * obtaining a copy of this software and associated documentation
|
||||
+ * files (the "Software"), to deal in the Software without
|
||||
+ * restriction, including without limitation the rights to use,
|
||||
+ * copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
+ * sell copies of the Software, and to permit persons to whom the
|
||||
+ * Software is furnished to do so, subject to the following
|
||||
+ * conditions:
|
||||
+ *
|
||||
+ * The above copyright notice and this permission notice shall be
|
||||
+ * included in all copies or substantial portions of the Software.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
+ * OTHER DEALINGS IN THE SOFTWARE.
|
||||
+ */
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "fsl,ls1043a";
|
||||
+ interrupt-parent = <&gic>;
|
||||
+ #address-cells = <2>;
|
||||
+ #size-cells = <2>;
|
||||
+
|
||||
+ cpus {
|
||||
+ #address-cells = <2>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ /*
|
||||
+ * We expect the enable-method for cpu's to be "psci", but this
|
||||
+ * is dependent on the SoC FW, which will fill this in.
|
||||
+ *
|
||||
+ * Currently supported enable-method is psci v0.2
|
||||
+ */
|
||||
+ cpu0: cpu@0 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,cortex-a53";
|
||||
+ reg = <0x0 0x0>;
|
||||
+ clocks = <&clockgen 1 0>;
|
||||
+ };
|
||||
+
|
||||
+ cpu1: cpu@1 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,cortex-a53";
|
||||
+ reg = <0x0 0x1>;
|
||||
+ clocks = <&clockgen 1 0>;
|
||||
+ };
|
||||
+
|
||||
+ cpu2: cpu@2 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,cortex-a53";
|
||||
+ reg = <0x0 0x2>;
|
||||
+ clocks = <&clockgen 1 0>;
|
||||
+ };
|
||||
+
|
||||
+ cpu3: cpu@3 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,cortex-a53";
|
||||
+ reg = <0x0 0x3>;
|
||||
+ clocks = <&clockgen 1 0>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ memory@80000000 {
|
||||
+ device_type = "memory";
|
||||
+ reg = <0x0 0x80000000 0 0x80000000>;
|
||||
+ /* DRAM space 1, size: 2GiB DRAM */
|
||||
+ };
|
||||
+
|
||||
+ sysclk: sysclk {
|
||||
+ compatible = "fixed-clock";
|
||||
+ #clock-cells = <0>;
|
||||
+ clock-frequency = <100000000>;
|
||||
+ clock-output-names = "sysclk";
|
||||
+ };
|
||||
+
|
||||
+ timer {
|
||||
+ compatible = "arm,armv8-timer";
|
||||
+ interrupts = <1 13 0x1>, /* Physical Secure PPI */
|
||||
+ <1 14 0x1>, /* Physical Non-Secure PPI */
|
||||
+ <1 11 0x1>, /* Virtual PPI */
|
||||
+ <1 10 0x1>; /* Hypervisor PPI */
|
||||
+ };
|
||||
+
|
||||
+ pmu {
|
||||
+ compatible = "arm,armv8-pmuv3";
|
||||
+ interrupts = <0 106 0x4>,
|
||||
+ <0 107 0x4>,
|
||||
+ <0 95 0x4>,
|
||||
+ <0 97 0x4>;
|
||||
+ interrupt-affinity = <&cpu0>,
|
||||
+ <&cpu1>,
|
||||
+ <&cpu2>,
|
||||
+ <&cpu3>;
|
||||
+ };
|
||||
+
|
||||
+ gic: interrupt-controller@1400000 {
|
||||
+ compatible = "arm,gic-400";
|
||||
+ #interrupt-cells = <3>;
|
||||
+ interrupt-controller;
|
||||
+ reg = <0x0 0x1401000 0 0x1000>, /* GICD */
|
||||
+ <0x0 0x1402000 0 0x2000>, /* GICC */
|
||||
+ <0x0 0x1404000 0 0x2000>, /* GICH */
|
||||
+ <0x0 0x1406000 0 0x2000>; /* GICV */
|
||||
+ interrupts = <1 9 0xf08>;
|
||||
+ };
|
||||
+
|
||||
+ soc {
|
||||
+ compatible = "simple-bus";
|
||||
+ #address-cells = <2>;
|
||||
+ #size-cells = <2>;
|
||||
+ ranges;
|
||||
+
|
||||
+ clockgen: clocking@1ee1000 {
|
||||
+ compatible = "fsl,ls1043a-clockgen";
|
||||
+ reg = <0x0 0x1ee1000 0x0 0x1000>;
|
||||
+ #clock-cells = <2>;
|
||||
+ clocks = <&sysclk>;
|
||||
+ };
|
||||
+
|
||||
+ scfg: scfg@1570000 {
|
||||
+ compatible = "fsl,ls1043a-scfg", "syscon";
|
||||
+ reg = <0x0 0x1570000 0x0 0x10000>;
|
||||
+ big-endian;
|
||||
+ };
|
||||
+
|
||||
+ dcfg: dcfg@1ee0000 {
|
||||
+ compatible = "fsl,ls1043a-dcfg", "syscon";
|
||||
+ reg = <0x0 0x1ee0000 0x0 0x10000>;
|
||||
+ };
|
||||
+
|
||||
+ ifc: ifc@1530000 {
|
||||
+ compatible = "fsl,ifc", "simple-bus";
|
||||
+ reg = <0x0 0x1530000 0x0 0x10000>;
|
||||
+ interrupts = <0 43 0x4>;
|
||||
+ };
|
||||
+
|
||||
+ esdhc: esdhc@1560000 {
|
||||
+ compatible = "fsl,ls1043a-esdhc", "fsl,esdhc";
|
||||
+ reg = <0x0 0x1560000 0x0 0x10000>;
|
||||
+ interrupts = <0 62 0x4>;
|
||||
+ clock-frequency = <0>;
|
||||
+ voltage-ranges = <1800 1800 3300 3300>;
|
||||
+ sdhci,auto-cmd12;
|
||||
+ big-endian;
|
||||
+ bus-width = <4>;
|
||||
+ };
|
||||
+
|
||||
+ dspi0: dspi@2100000 {
|
||||
+ compatible = "fsl,ls1043a-dspi", "fsl,ls1021a-v1.0-dspi";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ reg = <0x0 0x2100000 0x0 0x10000>;
|
||||
+ interrupts = <0 64 0x4>;
|
||||
+ clock-names = "dspi";
|
||||
+ clocks = <&clockgen 4 0>;
|
||||
+ spi-num-chipselects = <5>;
|
||||
+ big-endian;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ dspi1: dspi@2110000 {
|
||||
+ compatible = "fsl,ls1043a-dspi", "fsl,ls1021a-v1.0-dspi";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ reg = <0x0 0x2110000 0x0 0x10000>;
|
||||
+ interrupts = <0 65 0x4>;
|
||||
+ clock-names = "dspi";
|
||||
+ clocks = <&clockgen 4 0>;
|
||||
+ spi-num-chipselects = <5>;
|
||||
+ big-endian;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ i2c0: i2c@2180000 {
|
||||
+ compatible = "fsl,vf610-i2c";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ reg = <0x0 0x2180000 0x0 0x10000>;
|
||||
+ interrupts = <0 56 0x4>;
|
||||
+ clock-names = "i2c";
|
||||
+ clocks = <&clockgen 4 0>;
|
||||
+ dmas = <&edma0 1 39>,
|
||||
+ <&edma0 1 38>;
|
||||
+ dma-names = "tx", "rx";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ i2c1: i2c@2190000 {
|
||||
+ compatible = "fsl,vf610-i2c";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ reg = <0x0 0x2190000 0x0 0x10000>;
|
||||
+ interrupts = <0 57 0x4>;
|
||||
+ clock-names = "i2c";
|
||||
+ clocks = <&clockgen 4 0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ i2c2: i2c@21a0000 {
|
||||
+ compatible = "fsl,vf610-i2c";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ reg = <0x0 0x21a0000 0x0 0x10000>;
|
||||
+ interrupts = <0 58 0x4>;
|
||||
+ clock-names = "i2c";
|
||||
+ clocks = <&clockgen 4 0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ i2c3: i2c@21b0000 {
|
||||
+ compatible = "fsl,vf610-i2c";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ reg = <0x0 0x21b0000 0x0 0x10000>;
|
||||
+ interrupts = <0 59 0x4>;
|
||||
+ clock-names = "i2c";
|
||||
+ clocks = <&clockgen 4 0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ duart0: serial@21c0500 {
|
||||
+ compatible = "fsl,ns16550", "ns16550a";
|
||||
+ reg = <0x00 0x21c0500 0x0 0x100>;
|
||||
+ interrupts = <0 54 0x4>;
|
||||
+ clocks = <&clockgen 4 0>;
|
||||
+ };
|
||||
+
|
||||
+ duart1: serial@21c0600 {
|
||||
+ compatible = "fsl,ns16550", "ns16550a";
|
||||
+ reg = <0x00 0x21c0600 0x0 0x100>;
|
||||
+ interrupts = <0 54 0x4>;
|
||||
+ clocks = <&clockgen 4 0>;
|
||||
+ };
|
||||
+
|
||||
+ duart2: serial@21d0500 {
|
||||
+ compatible = "fsl,ns16550", "ns16550a";
|
||||
+ reg = <0x0 0x21d0500 0x0 0x100>;
|
||||
+ interrupts = <0 55 0x4>;
|
||||
+ clocks = <&clockgen 4 0>;
|
||||
+ };
|
||||
+
|
||||
+ duart3: serial@21d0600 {
|
||||
+ compatible = "fsl,ns16550", "ns16550a";
|
||||
+ reg = <0x0 0x21d0600 0x0 0x100>;
|
||||
+ interrupts = <0 55 0x4>;
|
||||
+ clocks = <&clockgen 4 0>;
|
||||
+ };
|
||||
+
|
||||
+ gpio1: gpio@2300000 {
|
||||
+ compatible = "fsl,ls1043a-gpio";
|
||||
+ reg = <0x0 0x2300000 0x0 0x10000>;
|
||||
+ interrupts = <0 66 0x4>;
|
||||
+ gpio-controller;
|
||||
+ #gpio-cells = <2>;
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <2>;
|
||||
+ };
|
||||
+
|
||||
+ gpio2: gpio@2310000 {
|
||||
+ compatible = "fsl,ls1043a-gpio";
|
||||
+ reg = <0x0 0x2310000 0x0 0x10000>;
|
||||
+ interrupts = <0 67 0x4>;
|
||||
+ gpio-controller;
|
||||
+ #gpio-cells = <2>;
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <2>;
|
||||
+ };
|
||||
+
|
||||
+ gpio3: gpio@2320000 {
|
||||
+ compatible = "fsl,ls1043a-gpio";
|
||||
+ reg = <0x0 0x2320000 0x0 0x10000>;
|
||||
+ interrupts = <0 68 0x4>;
|
||||
+ gpio-controller;
|
||||
+ #gpio-cells = <2>;
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <2>;
|
||||
+ };
|
||||
+
|
||||
+ gpio4: gpio@2330000 {
|
||||
+ compatible = "fsl,ls1043a-gpio";
|
||||
+ reg = <0x0 0x2330000 0x0 0x10000>;
|
||||
+ interrupts = <0 134 0x4>;
|
||||
+ gpio-controller;
|
||||
+ #gpio-cells = <2>;
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <2>;
|
||||
+ };
|
||||
+
|
||||
+ lpuart0: serial@2950000 {
|
||||
+ compatible = "fsl,ls1021a-lpuart";
|
||||
+ reg = <0x0 0x2950000 0x0 0x1000>;
|
||||
+ interrupts = <0 48 0x4>;
|
||||
+ clocks = <&clockgen 0 0>;
|
||||
+ clock-names = "ipg";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ lpuart1: serial@2960000 {
|
||||
+ compatible = "fsl,ls1021a-lpuart";
|
||||
+ reg = <0x0 0x2960000 0x0 0x1000>;
|
||||
+ interrupts = <0 49 0x4>;
|
||||
+ clocks = <&clockgen 4 0>;
|
||||
+ clock-names = "ipg";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ lpuart2: serial@2970000 {
|
||||
+ compatible = "fsl,ls1021a-lpuart";
|
||||
+ reg = <0x0 0x2970000 0x0 0x1000>;
|
||||
+ interrupts = <0 50 0x4>;
|
||||
+ clocks = <&clockgen 4 0>;
|
||||
+ clock-names = "ipg";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ lpuart3: serial@2980000 {
|
||||
+ compatible = "fsl,ls1021a-lpuart";
|
||||
+ reg = <0x0 0x2980000 0x0 0x1000>;
|
||||
+ interrupts = <0 51 0x4>;
|
||||
+ clocks = <&clockgen 4 0>;
|
||||
+ clock-names = "ipg";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ lpuart4: serial@2990000 {
|
||||
+ compatible = "fsl,ls1021a-lpuart";
|
||||
+ reg = <0x0 0x2990000 0x0 0x1000>;
|
||||
+ interrupts = <0 52 0x4>;
|
||||
+ clocks = <&clockgen 4 0>;
|
||||
+ clock-names = "ipg";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ lpuart5: serial@29a0000 {
|
||||
+ compatible = "fsl,ls1021a-lpuart";
|
||||
+ reg = <0x0 0x29a0000 0x0 0x1000>;
|
||||
+ interrupts = <0 53 0x4>;
|
||||
+ clocks = <&clockgen 4 0>;
|
||||
+ clock-names = "ipg";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ wdog0: wdog@2ad0000 {
|
||||
+ compatible = "fsl,ls1043a-wdt", "fsl,imx21-wdt";
|
||||
+ reg = <0x0 0x2ad0000 0x0 0x10000>;
|
||||
+ interrupts = <0 83 0x4>;
|
||||
+ clocks = <&clockgen 4 0>;
|
||||
+ clock-names = "wdog";
|
||||
+ big-endian;
|
||||
+ };
|
||||
+
|
||||
+ edma0: edma@2c00000 {
|
||||
+ #dma-cells = <2>;
|
||||
+ compatible = "fsl,vf610-edma";
|
||||
+ reg = <0x0 0x2c00000 0x0 0x10000>,
|
||||
+ <0x0 0x2c10000 0x0 0x10000>,
|
||||
+ <0x0 0x2c20000 0x0 0x10000>;
|
||||
+ interrupts = <0 103 0x4>,
|
||||
+ <0 103 0x4>;
|
||||
+ interrupt-names = "edma-tx", "edma-err";
|
||||
+ dma-channels = <32>;
|
||||
+ big-endian;
|
||||
+ clock-names = "dmamux0", "dmamux1";
|
||||
+ clocks = <&clockgen 4 0>,
|
||||
+ <&clockgen 4 0>;
|
||||
+ };
|
||||
+
|
||||
+ usb0: usb3@2f00000 {
|
||||
+ compatible = "snps,dwc3";
|
||||
+ reg = <0x0 0x2f00000 0x0 0x10000>;
|
||||
+ interrupts = <0 60 0x4>;
|
||||
+ dr_mode = "host";
|
||||
+ };
|
||||
+
|
||||
+ usb1: usb3@3000000 {
|
||||
+ compatible = "snps,dwc3";
|
||||
+ reg = <0x0 0x3000000 0x0 0x10000>;
|
||||
+ interrupts = <0 61 0x4>;
|
||||
+ dr_mode = "host";
|
||||
+ };
|
||||
+
|
||||
+ usb2: usb3@3100000 {
|
||||
+ compatible = "snps,dwc3";
|
||||
+ reg = <0x0 0x3100000 0x0 0x10000>;
|
||||
+ interrupts = <0 63 0x4>;
|
||||
+ dr_mode = "host";
|
||||
+ };
|
||||
+
|
||||
+ sata: sata@3200000 {
|
||||
+ compatible = "fsl,ls1043a-ahci";
|
||||
+ reg = <0x0 0x3200000 0x0 0x10000>;
|
||||
+ interrupts = <0 69 0x4>;
|
||||
+ clocks = <&clockgen 4 0>;
|
||||
+ };
|
||||
+
|
||||
+ msi1: msi-controller1@1571000 {
|
||||
+ compatible = "fsl,1s1043a-msi";
|
||||
+ reg = <0x0 0x1571000 0x0 0x4>,
|
||||
+ <0x0 0x1571004 0x0 0x4>;
|
||||
+ reg-names = "msiir", "msir";
|
||||
+ msi-controller;
|
||||
+ interrupts = <0 116 0x4>;
|
||||
+ };
|
||||
+
|
||||
+ msi2: msi-controller2@1572000 {
|
||||
+ compatible = "fsl,1s1043a-msi";
|
||||
+ reg = <0x0 0x1572000 0x0 0x4>,
|
||||
+ <0x0 0x1572004 0x0 0x4>;
|
||||
+ reg-names = "msiir", "msir";
|
||||
+ msi-controller;
|
||||
+ interrupts = <0 126 0x4>;
|
||||
+ };
|
||||
+
|
||||
+ msi3: msi-controller3@1573000 {
|
||||
+ compatible = "fsl,1s1043a-msi";
|
||||
+ reg = <0x0 0x1573000 0x0 0x4>,
|
||||
+ <0x0 0x1573004 0x0 0x4>;
|
||||
+ reg-names = "msiir", "msir";
|
||||
+ msi-controller;
|
||||
+ interrupts = <0 160 0x4>;
|
||||
+ };
|
||||
+
|
||||
+ pcie@3400000 {
|
||||
+ compatible = "fsl,ls1043a-pcie", "snps,dw-pcie";
|
||||
+ reg = <0x00 0x03400000 0x0 0x00100000 /* controller registers */
|
||||
+ 0x40 0x00000000 0x0 0x00002000>; /* configuration space */
|
||||
+ reg-names = "regs", "config";
|
||||
+ interrupts = <0 118 0x4>, /* controller interrupt */
|
||||
+ <0 117 0x4>; /* PME interrupt */
|
||||
+ interrupt-names = "intr", "pme";
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+ device_type = "pci";
|
||||
+ num-lanes = <4>;
|
||||
+ bus-range = <0x0 0xff>;
|
||||
+ ranges = <0x81000000 0x0 0x00000000 0x40 0x00010000 0x0 0x00010000 /* downstream I/O */
|
||||
+ 0x82000000 0x0 0x40000000 0x40 0x40000000 0x0 0x40000000>; /* non-prefetchable memory */
|
||||
+ msi-parent = <&msi1>;
|
||||
+ #interrupt-cells = <1>;
|
||||
+ interrupt-map-mask = <0 0 0 7>;
|
||||
+ interrupt-map = <0000 0 0 1 &gic 0 110 0x4>,
|
||||
+ <0000 0 0 2 &gic 0 111 0x4>,
|
||||
+ <0000 0 0 3 &gic 0 112 0x4>,
|
||||
+ <0000 0 0 4 &gic 0 113 0x4>;
|
||||
+ };
|
||||
+
|
||||
+ pcie@3500000 {
|
||||
+ compatible = "fsl,ls1043a-pcie", "snps,dw-pcie";
|
||||
+ reg = <0x00 0x03500000 0x0 0x00100000 /* controller registers */
|
||||
+ 0x48 0x00000000 0x0 0x00002000>; /* configuration space */
|
||||
+ reg-names = "regs", "config";
|
||||
+ interrupts = <0 128 0x4>,
|
||||
+ <0 127 0x4>;
|
||||
+ interrupt-names = "intr", "pme";
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+ device_type = "pci";
|
||||
+ num-lanes = <2>;
|
||||
+ bus-range = <0x0 0xff>;
|
||||
+ ranges = <0x81000000 0x0 0x00000000 0x48 0x00010000 0x0 0x00010000 /* downstream I/O */
|
||||
+ 0x82000000 0x0 0x40000000 0x48 0x40000000 0x0 0x40000000>; /* non-prefetchable memory */
|
||||
+ msi-parent = <&msi2>;
|
||||
+ #interrupt-cells = <1>;
|
||||
+ interrupt-map-mask = <0 0 0 7>;
|
||||
+ interrupt-map = <0000 0 0 1 &gic 0 120 0x4>,
|
||||
+ <0000 0 0 2 &gic 0 121 0x4>,
|
||||
+ <0000 0 0 3 &gic 0 122 0x4>,
|
||||
+ <0000 0 0 4 &gic 0 123 0x4>;
|
||||
+ };
|
||||
+
|
||||
+ pcie@3600000 {
|
||||
+ compatible = "fsl,ls1043a-pcie", "snps,dw-pcie";
|
||||
+ reg = <0x00 0x03600000 0x0 0x00100000 /* controller registers */
|
||||
+ 0x50 0x00000000 0x0 0x00002000>; /* configuration space */
|
||||
+ reg-names = "regs", "config";
|
||||
+ interrupts = <0 162 0x4>,
|
||||
+ <0 161 0x4>;
|
||||
+ interrupt-names = "intr", "pme";
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+ device_type = "pci";
|
||||
+ num-lanes = <2>;
|
||||
+ bus-range = <0x0 0xff>;
|
||||
+ ranges = <0x81000000 0x0 0x00000000 0x50 0x00010000 0x0 0x00010000 /* downstream I/O */
|
||||
+ 0x82000000 0x0 0x40000000 0x50 0x40000000 0x0 0x40000000>; /* non-prefetchable memory */
|
||||
+ msi-parent = <&msi3>;
|
||||
+ #interrupt-cells = <1>;
|
||||
+ interrupt-map-mask = <0 0 0 7>;
|
||||
+ interrupt-map = <0000 0 0 1 &gic 0 154 0x4>,
|
||||
+ <0000 0 0 2 &gic 0 155 0x4>,
|
||||
+ <0000 0 0 3 &gic 0 156 0x4>,
|
||||
+ <0000 0 0 4 &gic 0 157 0x4>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+};
|
|
@ -0,0 +1,150 @@
|
|||
From 57d949256241fb79b669bbca0426c2d74a3dfc6e Mon Sep 17 00:00:00 2001
|
||||
From: Shaohui Xie <Shaohui.Xie@freescale.com>
|
||||
Date: Fri, 8 Jul 2016 10:27:39 +0800
|
||||
Subject: [PATCH 02/70] dts/ls1043a: add LS1043ARDB board support
|
||||
|
||||
commit 9a6fce16a82d3412c9350b9f08eacebaa81c0a3d
|
||||
[context adjustment]
|
||||
|
||||
Signed-off-by: Shaohui Xie <Shaohui.Xie@freescale.com>
|
||||
Signed-off-by: Mingkai Hu <Mingkai.Hu@freescale.com>
|
||||
Signed-off-by: Wenbin Song <Wenbin.Song@freescale.com>
|
||||
Signed-off-by: Hou Zhiqiang <B48286@freescale.com>
|
||||
Signed-off-by: Mingkai Hu <mingkai.hu@nxp.com>
|
||||
Integrated-by: Zhao Qiang <qiang.zhao@nxp.com>
|
||||
---
|
||||
arch/arm64/boot/dts/freescale/Makefile | 1 +
|
||||
arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dts | 117 +++++++++++++++++++++
|
||||
2 files changed, 118 insertions(+)
|
||||
create mode 100644 arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dts
|
||||
|
||||
--- a/arch/arm64/boot/dts/freescale/Makefile
|
||||
+++ b/arch/arm64/boot/dts/freescale/Makefile
|
||||
@@ -1,6 +1,7 @@
|
||||
dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls2080a-qds.dtb
|
||||
dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls2080a-rdb.dtb
|
||||
dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls2080a-simu.dtb
|
||||
+dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1043a-rdb.dtb
|
||||
|
||||
always := $(dtb-y)
|
||||
subdir-y := $(dts-dirs)
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dts
|
||||
@@ -0,0 +1,117 @@
|
||||
+/*
|
||||
+ * Device Tree Include file for Freescale Layerscape-1043A family SoC.
|
||||
+ *
|
||||
+ * Copyright 2014-2015, Freescale Semiconductor
|
||||
+ *
|
||||
+ * Mingkai Hu <Mingkai.hu@freescale.com>
|
||||
+ *
|
||||
+ * This file is dual-licensed: you can use it either under the terms
|
||||
+ * of the GPLv2 or the X11 license, at your option. Note that this dual
|
||||
+ * licensing only applies to this file, and not this project as a
|
||||
+ * whole.
|
||||
+ *
|
||||
+ * a) This library 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.
|
||||
+ *
|
||||
+ * This library 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.
|
||||
+ *
|
||||
+ * Or, alternatively,
|
||||
+ *
|
||||
+ * b) Permission is hereby granted, free of charge, to any person
|
||||
+ * obtaining a copy of this software and associated documentation
|
||||
+ * files (the "Software"), to deal in the Software without
|
||||
+ * restriction, including without limitation the rights to use,
|
||||
+ * copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
+ * sell copies of the Software, and to permit persons to whom the
|
||||
+ * Software is furnished to do so, subject to the following
|
||||
+ * conditions:
|
||||
+ *
|
||||
+ * The above copyright notice and this permission notice shall be
|
||||
+ * included in all copies or substantial portions of the Software.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
+ * OTHER DEALINGS IN THE SOFTWARE.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+#include "fsl-ls1043a.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ model = "LS1043A RDB Board";
|
||||
+ compatible = "fsl,ls1043a-rdb", "fsl,ls1043a";
|
||||
+};
|
||||
+
|
||||
+&i2c0 {
|
||||
+ status = "okay";
|
||||
+ ina220@40 {
|
||||
+ compatible = "ti,ina220";
|
||||
+ reg = <0x40>;
|
||||
+ shunt-resistor = <1000>;
|
||||
+ };
|
||||
+ adt7461a@4c {
|
||||
+ compatible = "adi,adt7461";
|
||||
+ reg = <0x4c>;
|
||||
+ };
|
||||
+ eeprom@56 {
|
||||
+ compatible = "at24,24c512";
|
||||
+ reg = <0x52>;
|
||||
+ };
|
||||
+ eeprom@57 {
|
||||
+ compatible = "at24,24c512";
|
||||
+ reg = <0x53>;
|
||||
+ };
|
||||
+ rtc@68 {
|
||||
+ compatible = "pericom,pt7c4338";
|
||||
+ reg = <0x68>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&ifc {
|
||||
+ status = "okay";
|
||||
+ #address-cells = <2>;
|
||||
+ #size-cells = <1>;
|
||||
+ /* NOR, NAND Flashes and FPGA on board */
|
||||
+ ranges = <0x0 0x0 0x0 0x60000000 0x08000000
|
||||
+ 0x1 0x0 0x0 0x7e800000 0x00010000
|
||||
+ 0x2 0x0 0x0 0x7fb00000 0x00000100>;
|
||||
+
|
||||
+ nor@0,0 {
|
||||
+ compatible = "cfi-flash";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ reg = <0x0 0x0 0x8000000>;
|
||||
+ bank-width = <2>;
|
||||
+ device-width = <1>;
|
||||
+ };
|
||||
+
|
||||
+ nand@1,0 {
|
||||
+ compatible = "fsl,ifc-nand";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ reg = <0x1 0x0 0x10000>;
|
||||
+ };
|
||||
+
|
||||
+ cpld: board-control@2,0 {
|
||||
+ compatible = "fsl,ls1043ardb-cpld";
|
||||
+ reg = <0x2 0x0 0x0000100>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&duart0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&duart1 {
|
||||
+ status = "okay";
|
||||
+};
|
|
@ -0,0 +1,141 @@
|
|||
From 3970a709eb4c25e298e11cfe0ea7412bb2139197 Mon Sep 17 00:00:00 2001
|
||||
From: Alison Wang <alison.wang@nxp.com>
|
||||
Date: Fri, 8 Jul 2016 10:50:46 +0800
|
||||
Subject: [PATCH 03/70] arm64: dts: Update address-cells and reg properties of
|
||||
cpu nodes
|
||||
|
||||
commit 67161e229a59faf81732892b45a9ab3bae62ea18
|
||||
[context adjustment]
|
||||
|
||||
MPIDR_EL1[63:32] value is equal to 0 for the CPUs of the LS1043A and
|
||||
LS2080A SoCs. The ARM CPU binding allows #address-cells to be set to 1,
|
||||
since MPIDR_EL1[63:32] bits are not used for CPUs identification. Update
|
||||
the #address-cells and reg properties accordingly.
|
||||
|
||||
Signed-off-by: Alison Wang <alison.wang@nxp.com>
|
||||
Integrated-by: Zhao Qiang <qiang.zhao@nxp.com>
|
||||
---
|
||||
arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi | 10 +++++-----
|
||||
arch/arm64/boot/dts/freescale/fsl-ls2080a.dtsi | 18 +++++++++---------
|
||||
2 files changed, 14 insertions(+), 14 deletions(-)
|
||||
|
||||
--- a/arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi
|
||||
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi
|
||||
@@ -51,7 +51,7 @@
|
||||
#size-cells = <2>;
|
||||
|
||||
cpus {
|
||||
- #address-cells = <2>;
|
||||
+ #address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
/*
|
||||
@@ -63,28 +63,28 @@
|
||||
cpu0: cpu@0 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a53";
|
||||
- reg = <0x0 0x0>;
|
||||
+ reg = <0x0>;
|
||||
clocks = <&clockgen 1 0>;
|
||||
};
|
||||
|
||||
cpu1: cpu@1 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a53";
|
||||
- reg = <0x0 0x1>;
|
||||
+ reg = <0x1>;
|
||||
clocks = <&clockgen 1 0>;
|
||||
};
|
||||
|
||||
cpu2: cpu@2 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a53";
|
||||
- reg = <0x0 0x2>;
|
||||
+ reg = <0x2>;
|
||||
clocks = <&clockgen 1 0>;
|
||||
};
|
||||
|
||||
cpu3: cpu@3 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a53";
|
||||
- reg = <0x0 0x3>;
|
||||
+ reg = <0x3>;
|
||||
clocks = <&clockgen 1 0>;
|
||||
};
|
||||
};
|
||||
--- a/arch/arm64/boot/dts/freescale/fsl-ls2080a.dtsi
|
||||
+++ b/arch/arm64/boot/dts/freescale/fsl-ls2080a.dtsi
|
||||
@@ -51,7 +51,7 @@
|
||||
#size-cells = <2>;
|
||||
|
||||
cpus {
|
||||
- #address-cells = <2>;
|
||||
+ #address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
/*
|
||||
@@ -65,56 +65,56 @@
|
||||
cpu@0 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
- reg = <0x0 0x0>;
|
||||
+ reg = <0x0>;
|
||||
clocks = <&clockgen 1 0>;
|
||||
};
|
||||
|
||||
cpu@1 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
- reg = <0x0 0x1>;
|
||||
+ reg = <0x1>;
|
||||
clocks = <&clockgen 1 0>;
|
||||
};
|
||||
|
||||
cpu@100 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
- reg = <0x0 0x100>;
|
||||
+ reg = <0x100>;
|
||||
clocks = <&clockgen 1 1>;
|
||||
};
|
||||
|
||||
cpu@101 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
- reg = <0x0 0x101>;
|
||||
+ reg = <0x101>;
|
||||
clocks = <&clockgen 1 1>;
|
||||
};
|
||||
|
||||
cpu@200 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
- reg = <0x0 0x200>;
|
||||
+ reg = <0x200>;
|
||||
clocks = <&clockgen 1 2>;
|
||||
};
|
||||
|
||||
cpu@201 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
- reg = <0x0 0x201>;
|
||||
+ reg = <0x201>;
|
||||
clocks = <&clockgen 1 2>;
|
||||
};
|
||||
|
||||
cpu@300 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
- reg = <0x0 0x300>;
|
||||
+ reg = <0x300>;
|
||||
clocks = <&clockgen 1 3>;
|
||||
};
|
||||
|
||||
cpu@301 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
- reg = <0x0 0x301>;
|
||||
+ reg = <0x301>;
|
||||
clocks = <&clockgen 1 3>;
|
||||
};
|
||||
};
|
|
@ -0,0 +1,71 @@
|
|||
From 503f48a0a43ddf20098b2a5ec2c3d9d91775e441 Mon Sep 17 00:00:00 2001
|
||||
From: Alison Wang <b18965@freescale.com>
|
||||
Date: Wed, 9 Dec 2015 10:53:04 +0800
|
||||
Subject: [PATCH 04/70] armv8: aarch32: Add ITS file for AArch32 Linux on
|
||||
LS1043ARDB
|
||||
|
||||
kernel-ls1043a-rdb-aarch32.its is added to load kernel, DTB
|
||||
and root filesystrem together.
|
||||
|
||||
Signed-off-by: Alison Wang <alison.wang@nxp.com>
|
||||
---
|
||||
kernel-ls1043a-rdb-aarch32.its | 53 ++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 53 insertions(+)
|
||||
create mode 100644 kernel-ls1043a-rdb-aarch32.its
|
||||
|
||||
--- /dev/null
|
||||
+++ b/kernel-ls1043a-rdb-aarch32.its
|
||||
@@ -0,0 +1,53 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2015, Freescale Semiconductor
|
||||
+ *
|
||||
+ * This file is licensed under the terms of the GNU General Public
|
||||
+ * License version 2. This program is licensed "as is" without any
|
||||
+ * warranty of any kind, whether express or implied.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+/ {
|
||||
+ description = "RDB Image file for the LS1043A Linux Kernel";
|
||||
+ #address-cells = <1>;
|
||||
+
|
||||
+ images {
|
||||
+ kernel@1 {
|
||||
+ description = "ARM32 Linux kernel";
|
||||
+ data = /incbin/("./arch/arm/boot/zImage");
|
||||
+ type = "kernel";
|
||||
+ arch = "arm";
|
||||
+ os = "linux";
|
||||
+ compression = "none";
|
||||
+ load = <0x80008000>;
|
||||
+ entry = <0x80008000>;
|
||||
+ };
|
||||
+ fdt@1 {
|
||||
+ description = "Flattened Device Tree blob";
|
||||
+ data = /incbin/("./fsl-ls1043a-rdb.dtb");
|
||||
+ type = "flat_dt";
|
||||
+ arch = "arm";
|
||||
+ compression = "none";
|
||||
+ load = <0x90000000>;
|
||||
+ };
|
||||
+ ramdisk@1 {
|
||||
+ description = "LS1 Ramdisk";
|
||||
+ data = /incbin/("./fsl-image-core-ls1021atwr-wifi.rootfs.ext2.gz");
|
||||
+ type = "ramdisk";
|
||||
+ arch = "arm";
|
||||
+ os = "linux";
|
||||
+ compression = "none";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ configurations {
|
||||
+ default = "config@1";
|
||||
+ config@1 {
|
||||
+ description = "Boot Linux kernel";
|
||||
+ kernel = "kernel@1";
|
||||
+ fdt = "fdt@1";
|
||||
+ ramdisk = "ramdisk@1";
|
||||
+ };
|
||||
+ };
|
||||
+};
|
|
@ -0,0 +1,21 @@
|
|||
From 8f9b9d829ea0e67760b2e67c9339f6c417084fdc Mon Sep 17 00:00:00 2001
|
||||
From: Pan Jiafei <Jiafei.Pan@nxp.com>
|
||||
Date: Thu, 28 Jan 2016 12:10:24 +0800
|
||||
Subject: [PATCH 05/70] armv8: aarch32: change FS file name in ITS
|
||||
|
||||
Signed-off-by: Pan Jiafei <Jiafei.Pan@nxp.com>
|
||||
---
|
||||
kernel-ls1043a-rdb-aarch32.its | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/kernel-ls1043a-rdb-aarch32.its
|
||||
+++ b/kernel-ls1043a-rdb-aarch32.its
|
||||
@@ -33,7 +33,7 @@
|
||||
};
|
||||
ramdisk@1 {
|
||||
description = "LS1 Ramdisk";
|
||||
- data = /incbin/("./fsl-image-core-ls1021atwr-wifi.rootfs.ext2.gz");
|
||||
+ data = /incbin/("./fsl-image-core-ls1043ardb-32b.ext2.gz");
|
||||
type = "ramdisk";
|
||||
arch = "arm";
|
||||
os = "linux";
|
|
@ -0,0 +1,79 @@
|
|||
From 3a827762e11670ca815bd4ee305f5faf5f02acb9 Mon Sep 17 00:00:00 2001
|
||||
From: Alison Wang <b18965@freescale.com>
|
||||
Date: Tue, 17 May 2016 17:23:51 +0800
|
||||
Subject: [PATCH 07/70] armv8: aarch32: Run 32-bit Linux in AArch32 execution
|
||||
state
|
||||
|
||||
This patch adds AArch32 execution state support for LS1043A. Verified
|
||||
32-bit Linux kernel can run on LS1043ARDB board.
|
||||
|
||||
Signed-off-by: Ebony Zhu <ebony.zhu@nxp.com>
|
||||
Signed-off-by: Alison Wang <alison.wang@nxp.com>
|
||||
---
|
||||
arch/arm/mach-imx/Kconfig | 10 ++++++++++
|
||||
arch/arm/mach-imx/Makefile | 4 +++-
|
||||
arch/arm/mach-imx/mach-ls1043a.c | 21 +++++++++++++++++++++
|
||||
3 files changed, 34 insertions(+), 1 deletion(-)
|
||||
create mode 100644 arch/arm/mach-imx/mach-ls1043a.c
|
||||
|
||||
--- a/arch/arm/mach-imx/Kconfig
|
||||
+++ b/arch/arm/mach-imx/Kconfig
|
||||
@@ -612,6 +612,16 @@ endchoice
|
||||
|
||||
endif
|
||||
|
||||
+config ARCH_LAYERSCAPE
|
||||
+ bool "Freescale Layerscape SoC support"
|
||||
+ select ARM_GIC
|
||||
+ select HAVE_ARM_ARCH_TIMER
|
||||
+ select PCI_LAYERSCAPE if PCI
|
||||
+ select LS1_MSI if PCI_MSI
|
||||
+
|
||||
+ help
|
||||
+ This enables support for Freescale Layerscape SoC family.
|
||||
+
|
||||
source "arch/arm/mach-imx/devices/Kconfig"
|
||||
|
||||
endif
|
||||
--- a/arch/arm/mach-imx/Makefile
|
||||
+++ b/arch/arm/mach-imx/Makefile
|
||||
@@ -75,7 +75,7 @@ obj-$(CONFIG_HAVE_IMX_ANATOP) += anatop.
|
||||
obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o
|
||||
obj-$(CONFIG_HAVE_IMX_MMDC) += mmdc.o
|
||||
obj-$(CONFIG_HAVE_IMX_SRC) += src.o
|
||||
-ifneq ($(CONFIG_SOC_IMX6)$(CONFIG_SOC_LS1021A),)
|
||||
+ifneq ($(CONFIG_SOC_IMX6)$(CONFIG_SOC_LS1021A)$(CONFIG_ARCH_LAYERSCAPE),)
|
||||
AFLAGS_headsmp.o :=-Wa,-march=armv7-a
|
||||
obj-$(CONFIG_SMP) += headsmp.o platsmp.o
|
||||
obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
|
||||
@@ -101,4 +101,6 @@ obj-$(CONFIG_SOC_VF610) += mach-vf610.o
|
||||
|
||||
obj-$(CONFIG_SOC_LS1021A) += mach-ls1021a.o
|
||||
|
||||
+obj-$(CONFIG_ARCH_LAYERSCAPE) += mach-ls1043a.o
|
||||
+
|
||||
obj-y += devices/
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/mach-imx/mach-ls1043a.c
|
||||
@@ -0,0 +1,21 @@
|
||||
+/*
|
||||
+ * Copyright 2015-2016 Freescale Semiconductor, 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 <asm/mach/arch.h>
|
||||
+
|
||||
+#include "common.h"
|
||||
+
|
||||
+static const char * const ls1043a_dt_compat[] __initconst = {
|
||||
+ "fsl,ls1043a",
|
||||
+ NULL,
|
||||
+};
|
||||
+
|
||||
+DT_MACHINE_START(LS1043A, "Freescale LS1043A")
|
||||
+ .dt_compat = ls1043a_dt_compat,
|
||||
+MACHINE_END
|
|
@ -0,0 +1,103 @@
|
|||
From 5d06e90bd0e3bdd104b7b25173e05617f02dc44d Mon Sep 17 00:00:00 2001
|
||||
From: Alison Wang <b18965@freescale.com>
|
||||
Date: Fri, 13 May 2016 15:09:47 +0800
|
||||
Subject: [PATCH 08/70] armv8: aarch32: Add SMP support for 32-bit Linux
|
||||
|
||||
The patch adds SMP support for running 32-bit Linux kernel. Spin-table
|
||||
method is used for SMP support.
|
||||
|
||||
Signed-off-by: Alison Wang <alison.wang@nxp.com>
|
||||
Signed-off-by: Chenhui Zhao <chenhui.zhao@nxp.com>
|
||||
---
|
||||
arch/arm/mach-imx/common.h | 1 +
|
||||
arch/arm/mach-imx/mach-ls1043a.c | 1 +
|
||||
arch/arm/mach-imx/platsmp.c | 49 ++++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 51 insertions(+)
|
||||
|
||||
--- a/arch/arm/mach-imx/common.h
|
||||
+++ b/arch/arm/mach-imx/common.h
|
||||
@@ -155,5 +155,6 @@ static inline void imx_init_l2cache(void
|
||||
|
||||
extern struct smp_operations imx_smp_ops;
|
||||
extern struct smp_operations ls1021a_smp_ops;
|
||||
+extern const struct smp_operations layerscape_smp_ops;
|
||||
|
||||
#endif
|
||||
--- a/arch/arm/mach-imx/mach-ls1043a.c
|
||||
+++ b/arch/arm/mach-imx/mach-ls1043a.c
|
||||
@@ -17,5 +17,6 @@ static const char * const ls1043a_dt_com
|
||||
};
|
||||
|
||||
DT_MACHINE_START(LS1043A, "Freescale LS1043A")
|
||||
+ .smp = smp_ops(layerscape_smp_ops),
|
||||
.dt_compat = ls1043a_dt_compat,
|
||||
MACHINE_END
|
||||
--- a/arch/arm/mach-imx/platsmp.c
|
||||
+++ b/arch/arm/mach-imx/platsmp.c
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/smp.h>
|
||||
+#include <linux/types.h>
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/page.h>
|
||||
@@ -26,6 +27,8 @@
|
||||
u32 g_diag_reg;
|
||||
static void __iomem *scu_base;
|
||||
|
||||
+static u64 cpu_release_addr[NR_CPUS];
|
||||
+
|
||||
static struct map_desc scu_io_desc __initdata = {
|
||||
/* .virtual and .pfn are run-time assigned */
|
||||
.length = SZ_4K,
|
||||
@@ -127,3 +130,49 @@ struct smp_operations ls1021a_smp_ops _
|
||||
.smp_prepare_cpus = ls1021a_smp_prepare_cpus,
|
||||
.smp_boot_secondary = ls1021a_boot_secondary,
|
||||
};
|
||||
+
|
||||
+static int layerscape_smp_boot_secondary(unsigned int cpu,
|
||||
+ struct task_struct *idle)
|
||||
+{
|
||||
+ u32 secondary_startup_phys;
|
||||
+ __le32 __iomem *release_addr;
|
||||
+
|
||||
+ secondary_startup_phys = virt_to_phys(secondary_startup);
|
||||
+
|
||||
+ release_addr = ioremap_cache((u32)cpu_release_addr[cpu],
|
||||
+ sizeof(u64));
|
||||
+ if (!release_addr)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ writel_relaxed(secondary_startup_phys, release_addr);
|
||||
+ writel_relaxed(0, release_addr + 1);
|
||||
+ __cpuc_flush_dcache_area((__force void *)release_addr,
|
||||
+ sizeof(u64));
|
||||
+
|
||||
+ sev();
|
||||
+
|
||||
+ iounmap(release_addr);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void layerscape_smp_init_cpus(void)
|
||||
+{
|
||||
+ struct device_node *dnt = NULL;
|
||||
+ unsigned int cpu = 0;
|
||||
+
|
||||
+ while ((dnt = of_find_node_by_type(dnt, "cpu"))) {
|
||||
+ if (of_property_read_u64(dnt, "cpu-release-addr",
|
||||
+ &cpu_release_addr[cpu])) {
|
||||
+ pr_err("CPU %d: missing or invalid cpu-release-addr property\n",
|
||||
+ cpu);
|
||||
+ }
|
||||
+
|
||||
+ cpu++;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+const struct smp_operations layerscape_smp_ops __initconst = {
|
||||
+ .smp_init_cpus = layerscape_smp_init_cpus,
|
||||
+ .smp_boot_secondary = layerscape_smp_boot_secondary,
|
||||
+};
|
|
@ -0,0 +1,31 @@
|
|||
From ef25bf644b7de83849a2f804c84bb54cd2f1255f Mon Sep 17 00:00:00 2001
|
||||
From: Alison Wang <b18965@freescale.com>
|
||||
Date: Mon, 11 Apr 2016 17:25:40 +0800
|
||||
Subject: [PATCH 09/70] armv8: aarch32: Allow RAM to be mapped for LayerScape
|
||||
SoC
|
||||
|
||||
This patch is based on Kernel v4.1.8. As in v4.1.8, memremap() is not
|
||||
introduced and the WARN() check is not relaxed to allow MT_MEMORY_RW
|
||||
mappings of pfn_valid() pages, this patch is needed as a workaround for
|
||||
spin-table address which locates in RAM to be mapped.
|
||||
|
||||
For the latest kernel in upstream, this patch is not needed anymore.
|
||||
|
||||
Signed-off-by: Alison Wang <alison.wang@nxp.com>
|
||||
---
|
||||
arch/arm/mm/ioremap.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/arch/arm/mm/ioremap.c
|
||||
+++ b/arch/arm/mm/ioremap.c
|
||||
@@ -298,8 +298,10 @@ static void __iomem * __arm_ioremap_pfn_
|
||||
/*
|
||||
* Don't allow RAM to be mapped - this causes problems with ARMv6+
|
||||
*/
|
||||
+#ifndef CONFIG_ARCH_LAYERSCAPE
|
||||
if (WARN_ON(pfn_valid(pfn)))
|
||||
return NULL;
|
||||
+#endif
|
||||
|
||||
area = get_vm_area_caller(size, VM_IOREMAP, caller);
|
||||
if (!area)
|
|
@ -0,0 +1,26 @@
|
|||
From 31a5b5189bdd33bb87f88320964a47c0da983af2 Mon Sep 17 00:00:00 2001
|
||||
From: Jianhua Xie <jianhua.xie@nxp.com>
|
||||
Date: Fri, 29 Jan 2016 16:40:46 +0800
|
||||
Subject: [PATCH 10/70] arm: add pgprot_cached and pgprot_cached_ns support
|
||||
|
||||
Signed-off-by: Jianhua Xie <jianhua.xie@nxp.com>
|
||||
---
|
||||
arch/arm/include/asm/pgtable.h | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
--- a/arch/arm/include/asm/pgtable.h
|
||||
+++ b/arch/arm/include/asm/pgtable.h
|
||||
@@ -116,6 +116,13 @@ extern pgprot_t pgprot_s2_device;
|
||||
#define pgprot_noncached(prot) \
|
||||
__pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_UNCACHED)
|
||||
|
||||
+#define pgprot_cached(prot) \
|
||||
+ __pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_DEV_CACHED)
|
||||
+
|
||||
+#define pgprot_cached_ns(prot) \
|
||||
+ __pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_DEV_CACHED | \
|
||||
+ L_PTE_MT_DEV_NONSHARED)
|
||||
+
|
||||
#define pgprot_writecombine(prot) \
|
||||
__pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_BUFFERABLE)
|
||||
|
|
@ -0,0 +1,99 @@
|
|||
From 707627a28924320a7a36bdb8b02c05651c0c384d Mon Sep 17 00:00:00 2001
|
||||
From: Pan Jiafei <Jiafei.Pan@nxp.com>
|
||||
Date: Fri, 8 Jul 2016 11:16:13 +0800
|
||||
Subject: [PATCH 11/70] arm: add new non-shareable ioremap
|
||||
|
||||
commit 17d7448eef0fa57a0899e6a864d875e7a9082561
|
||||
[modify ioremap_cache_ns according to Linux v4.4.7]
|
||||
|
||||
Signed-off-by: Pan Jiafei <Jiafei.Pan@nxp.com>
|
||||
Integrated-by: Zhao Qiang <qiang.zhao@nxp.com>
|
||||
---
|
||||
arch/arm/include/asm/io.h | 4 ++++
|
||||
arch/arm/include/asm/mach/map.h | 4 ++--
|
||||
arch/arm/mm/ioremap.c | 7 +++++++
|
||||
arch/arm/mm/mmu.c | 9 +++++++++
|
||||
4 files changed, 22 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/arch/arm/include/asm/io.h
|
||||
+++ b/arch/arm/include/asm/io.h
|
||||
@@ -129,6 +129,7 @@ static inline u32 __raw_readl(const vola
|
||||
#define MT_DEVICE_NONSHARED 1
|
||||
#define MT_DEVICE_CACHED 2
|
||||
#define MT_DEVICE_WC 3
|
||||
+#define MT_MEMORY_RW_NS 4
|
||||
/*
|
||||
* types 4 onwards can be found in asm/mach/map.h and are undefined
|
||||
* for ioremap
|
||||
@@ -399,6 +400,9 @@ void __iomem *ioremap_wc(resource_size_t
|
||||
#define ioremap_wc ioremap_wc
|
||||
#define ioremap_wt ioremap_wc
|
||||
|
||||
+void __iomem *ioremap_cache_ns(resource_size_t res_cookie, size_t size);
|
||||
+#define ioremap_cache_ns ioremap_cache_ns
|
||||
+
|
||||
void iounmap(volatile void __iomem *iomem_cookie);
|
||||
#define iounmap iounmap
|
||||
|
||||
--- a/arch/arm/include/asm/mach/map.h
|
||||
+++ b/arch/arm/include/asm/mach/map.h
|
||||
@@ -21,9 +21,9 @@ struct map_desc {
|
||||
unsigned int type;
|
||||
};
|
||||
|
||||
-/* types 0-3 are defined in asm/io.h */
|
||||
+/* types 0-4 are defined in asm/io.h */
|
||||
enum {
|
||||
- MT_UNCACHED = 4,
|
||||
+ MT_UNCACHED = 5,
|
||||
MT_CACHECLEAN,
|
||||
MT_MINICLEAN,
|
||||
MT_LOW_VECTORS,
|
||||
--- a/arch/arm/mm/ioremap.c
|
||||
+++ b/arch/arm/mm/ioremap.c
|
||||
@@ -394,6 +394,13 @@ void __iomem *ioremap_wc(resource_size_t
|
||||
}
|
||||
EXPORT_SYMBOL(ioremap_wc);
|
||||
|
||||
+void __iomem *ioremap_cache_ns(resource_size_t res_cookie, size_t size)
|
||||
+{
|
||||
+ return arch_ioremap_caller(res_cookie, size, MT_MEMORY_RW_NS,
|
||||
+ __builtin_return_address(0));
|
||||
+}
|
||||
+EXPORT_SYMBOL(ioremap_cache_ns);
|
||||
+
|
||||
/*
|
||||
* Remap an arbitrary physical address space into the kernel virtual
|
||||
* address space as memory. Needed when the kernel wants to execute
|
||||
--- a/arch/arm/mm/mmu.c
|
||||
+++ b/arch/arm/mm/mmu.c
|
||||
@@ -313,6 +313,13 @@ static struct mem_type mem_types[] = {
|
||||
.prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE,
|
||||
.domain = DOMAIN_KERNEL,
|
||||
},
|
||||
+ [MT_MEMORY_RW_NS] = {
|
||||
+ .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY |
|
||||
+ L_PTE_XN,
|
||||
+ .prot_l1 = PMD_TYPE_TABLE,
|
||||
+ .prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_XN,
|
||||
+ .domain = DOMAIN_KERNEL,
|
||||
+ },
|
||||
[MT_ROM] = {
|
||||
.prot_sect = PMD_TYPE_SECT,
|
||||
.domain = DOMAIN_KERNEL,
|
||||
@@ -644,6 +651,7 @@ static void __init build_mem_type_table(
|
||||
}
|
||||
kern_pgprot |= PTE_EXT_AF;
|
||||
vecs_pgprot |= PTE_EXT_AF;
|
||||
+ mem_types[MT_MEMORY_RW_NS].prot_pte |= PTE_EXT_AF | cp->pte;
|
||||
|
||||
/*
|
||||
* Set PXN for user mappings
|
||||
@@ -672,6 +680,7 @@ static void __init build_mem_type_table(
|
||||
mem_types[MT_MEMORY_RWX].prot_pte |= kern_pgprot;
|
||||
mem_types[MT_MEMORY_RW].prot_sect |= ecc_mask | cp->pmd;
|
||||
mem_types[MT_MEMORY_RW].prot_pte |= kern_pgprot;
|
||||
+ mem_types[MT_MEMORY_RW_NS].prot_sect |= ecc_mask | cp->pmd;
|
||||
mem_types[MT_MEMORY_DMA_READY].prot_pte |= kern_pgprot;
|
||||
mem_types[MT_MEMORY_RWX_NONCACHED].prot_sect |= ecc_mask;
|
||||
mem_types[MT_ROM].prot_sect |= cp->pmd;
|
|
@ -0,0 +1,747 @@
|
|||
From 10b0a19d62d932a6eb01ceb8749190aaf0ff063e Mon Sep 17 00:00:00 2001
|
||||
From: Shaohui Xie <Shaohui.Xie@freescale.com>
|
||||
Date: Mon, 11 Jul 2016 10:47:20 +0800
|
||||
Subject: [PATCH 12/70] dts: ls1043a: add fman/bman/qman/ethernet nodes
|
||||
|
||||
commit ecb0901ba0a6558a05054d21ad9e70999a6f7ca1
|
||||
[context adjustment]
|
||||
|
||||
Signed-off-by: Shaohui Xie <Shaohui.Xie@freescale.com>
|
||||
Signed-off-by: Zhao Qiang <qiang.zhao@nxp.com>
|
||||
---
|
||||
arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi | 461 ++++++++++++++++++++
|
||||
.../boot/dts/freescale/qoriq-bman1-portals.dtsi | 104 +++++
|
||||
.../boot/dts/freescale/qoriq-qman1-portals.dtsi | 136 ++++++
|
||||
3 files changed, 701 insertions(+)
|
||||
create mode 100644 arch/arm64/boot/dts/freescale/qoriq-bman1-portals.dtsi
|
||||
create mode 100644 arch/arm64/boot/dts/freescale/qoriq-qman1-portals.dtsi
|
||||
|
||||
--- a/arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi
|
||||
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi
|
||||
@@ -50,6 +50,16 @@
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
|
||||
+ aliases {
|
||||
+ ethernet0 = &fm1mac1;
|
||||
+ ethernet1 = &fm1mac2;
|
||||
+ ethernet2 = &fm1mac3;
|
||||
+ ethernet3 = &fm1mac4;
|
||||
+ ethernet4 = &fm1mac5;
|
||||
+ ethernet5 = &fm1mac6;
|
||||
+ ethernet6 = &fm1mac9;
|
||||
+ };
|
||||
+
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
@@ -174,6 +184,323 @@
|
||||
bus-width = <4>;
|
||||
};
|
||||
|
||||
+ qman: qman@1880000 {
|
||||
+ compatible = "fsl,qman";
|
||||
+ reg = <0x00 0x1880000 0x0 0x10000>;
|
||||
+ interrupts = <0 45 0x4>;
|
||||
+ };
|
||||
+
|
||||
+ bman: bman@1890000 {
|
||||
+ compatible = "fsl,bman";
|
||||
+ reg = <0x00 0x1890000 0x0 0x10000>;
|
||||
+ interrupts = <0 45 0x4>;
|
||||
+ };
|
||||
+
|
||||
+ fman0: fman@1a00000 {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ cell-index = <0>;
|
||||
+ compatible = "fsl,fman", "simple-bus";
|
||||
+ ranges = <0x0 0x00 0x1a00000 0x100000>;
|
||||
+ reg = <0x00 0x1a00000 0x0 0x100000>;
|
||||
+ clock-frequency = <0>;
|
||||
+ interrupts = <0 44 0x4>,
|
||||
+ <0 45 0x4>;
|
||||
+
|
||||
+ cc {
|
||||
+ compatible = "fsl,fman-cc";
|
||||
+ };
|
||||
+
|
||||
+ muram@0 {
|
||||
+ compatible = "fsl,fman-muram";
|
||||
+ reg = <0x0 0x60000>;
|
||||
+ };
|
||||
+
|
||||
+ bmi@80000 {
|
||||
+ compatible = "fsl,fman-bmi";
|
||||
+ reg = <0x80000 0x400>;
|
||||
+ };
|
||||
+
|
||||
+ qmi@80400 {
|
||||
+ compatible = "fsl,fman-qmi";
|
||||
+ reg = <0x80400 0x400>;
|
||||
+ };
|
||||
+
|
||||
+ fman0_oh1: port@82000 {
|
||||
+ cell-index = <0>;
|
||||
+ compatible = "fsl,fman-port-oh";
|
||||
+ reg = <0x82000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fman0_oh2: port@83000 {
|
||||
+ cell-index = <1>;
|
||||
+ compatible = "fsl,fman-port-oh";
|
||||
+ reg = <0x83000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fman0_oh3: port@84000 {
|
||||
+ cell-index = <2>;
|
||||
+ compatible = "fsl,fman-port-oh";
|
||||
+ reg = <0x84000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fman0_oh4: port@85000 {
|
||||
+ cell-index = <3>;
|
||||
+ compatible = "fsl,fman-port-oh";
|
||||
+ reg = <0x85000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fman0_oh5: port@86000 {
|
||||
+ cell-index = <4>;
|
||||
+ compatible = "fsl,fman-port-oh";
|
||||
+ reg = <0x86000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fman0_oh6: port@87000 {
|
||||
+ cell-index = <5>;
|
||||
+ compatible = "fsl,fman-port-oh";
|
||||
+ reg = <0x87000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ policer@c0000 {
|
||||
+ compatible = "fsl,fman-policer";
|
||||
+ reg = <0xc0000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ keygen@c1000 {
|
||||
+ compatible = "fsl,fman-keygen";
|
||||
+ reg = <0xc1000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ dma@c2000 {
|
||||
+ compatible = "fsl,fman-dma";
|
||||
+ reg = <0xc2000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fpm@c3000 {
|
||||
+ compatible = "fsl,fman-fpm";
|
||||
+ reg = <0xc3000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ parser@c7000 {
|
||||
+ compatible = "fsl,fman-parser";
|
||||
+ reg = <0xc7000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ vsps@dc000 {
|
||||
+ compatible = "fsl,fman-vsps";
|
||||
+ reg = <0xdc000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ mdio0: mdio@fc000 {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ compatible = "fsl,fman-memac-mdio";
|
||||
+ reg = <0xfc000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ xmdio0: mdio@fd000 {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ compatible = "fsl,fman-memac-mdio";
|
||||
+ reg = <0xfd000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fman0_rx0: port@88000 {
|
||||
+ cell-index = <0>;
|
||||
+ compatible = "fsl,fman-port-1g-rx";
|
||||
+ reg = <0x88000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fman0_tx0: port@a8000 {
|
||||
+ cell-index = <0>;
|
||||
+ compatible = "fsl,fman-port-1g-tx";
|
||||
+ reg = <0xa8000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fm1mac1: ethernet@e0000 {
|
||||
+ cell-index = <0>;
|
||||
+ compatible = "fsl,fman-memac";
|
||||
+ reg = <0xe0000 0x1000>;
|
||||
+ fsl,port-handles = <&fman0_rx0 &fman0_tx0>;
|
||||
+ ptimer-handle = <&ptp_timer0>;
|
||||
+ };
|
||||
+
|
||||
+ mdio@e1000 {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ compatible = "fsl,fman-memac-mdio";
|
||||
+ reg = <0xe1000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fman0_rx1: port@89000 {
|
||||
+ cell-index = <1>;
|
||||
+ compatible = "fsl,fman-port-1g-rx";
|
||||
+ reg = <0x89000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fman0_tx1: port@a9000 {
|
||||
+ cell-index = <1>;
|
||||
+ compatible = "fsl,fman-port-1g-tx";
|
||||
+ reg = <0xa9000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fm1mac2: ethernet@e2000 {
|
||||
+ cell-index = <1>;
|
||||
+ compatible = "fsl,fman-memac";
|
||||
+ reg = <0xe2000 0x1000>;
|
||||
+ fsl,port-handles = <&fman0_rx1 &fman0_tx1>;
|
||||
+ ptimer-handle = <&ptp_timer0>;
|
||||
+ };
|
||||
+
|
||||
+ mdio@e3000 {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ compatible = "fsl,fman-memac-mdio";
|
||||
+ reg = <0xe3000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fman0_rx2: port@8a000 {
|
||||
+ cell-index = <2>;
|
||||
+ compatible = "fsl,fman-port-1g-rx";
|
||||
+ reg = <0x8a000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fman0_tx2: port@aa000 {
|
||||
+ cell-index = <2>;
|
||||
+ compatible = "fsl,fman-port-1g-tx";
|
||||
+ reg = <0xaa000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fm1mac3: ethernet@e4000 {
|
||||
+ cell-index = <2>;
|
||||
+ compatible = "fsl,fman-memac";
|
||||
+ reg = <0xe4000 0x1000>;
|
||||
+ fsl,port-handles = <&fman0_rx2 &fman0_tx2>;
|
||||
+ ptimer-handle = <&ptp_timer0>;
|
||||
+ };
|
||||
+
|
||||
+ mdio@e5000 {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ compatible = "fsl,fman-memac-mdio";
|
||||
+ reg = <0xe5000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fman0_rx3: port@8b000 {
|
||||
+ cell-index = <3>;
|
||||
+ compatible = "fsl,fman-port-1g-rx";
|
||||
+ reg = <0x8b000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fman0_tx3: port@ab000 {
|
||||
+ cell-index = <3>;
|
||||
+ compatible = "fsl,fman-port-1g-tx";
|
||||
+ reg = <0xab000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fm1mac4: ethernet@e6000 {
|
||||
+ cell-index = <3>;
|
||||
+ compatible = "fsl,fman-memac";
|
||||
+ reg = <0xe6000 0x1000>;
|
||||
+ fsl,port-handles = <&fman0_rx3 &fman0_tx3>;
|
||||
+ ptimer-handle = <&ptp_timer0>;
|
||||
+ };
|
||||
+
|
||||
+ mdio@e7000 {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ compatible = "fsl,fman-memac-mdio";
|
||||
+ reg = <0xe7000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fman0_rx4: port@8c000 {
|
||||
+ cell-index = <4>;
|
||||
+ compatible = "fsl,fman-port-1g-rx";
|
||||
+ reg = <0x8c000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fman0_tx4: port@ac000 {
|
||||
+ cell-index = <4>;
|
||||
+ compatible = "fsl,fman-port-1g-tx";
|
||||
+ reg = <0xac000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fm1mac5: ethernet@e8000 {
|
||||
+ cell-index = <4>;
|
||||
+ compatible = "fsl,fman-memac";
|
||||
+ reg = <0xe8000 0x1000>;
|
||||
+ fsl,port-handles = <&fman0_rx4 &fman0_tx4>;
|
||||
+ ptimer-handle = <&ptp_timer0>;
|
||||
+ };
|
||||
+
|
||||
+ mdio@e9000 {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ compatible = "fsl,fman-memac-mdio";
|
||||
+ reg = <0xe9000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fman0_rx5: port@8d000 {
|
||||
+ cell-index = <5>;
|
||||
+ compatible = "fsl,fman-port-1g-rx";
|
||||
+ reg = <0x8d000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fman0_tx5: port@ad000 {
|
||||
+ cell-index = <5>;
|
||||
+ compatible = "fsl,fman-port-1g-tx";
|
||||
+ reg = <0xad000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fm1mac6: ethernet@ea000 {
|
||||
+ cell-index = <5>;
|
||||
+ compatible = "fsl,fman-memac";
|
||||
+ reg = <0xea000 0x1000>;
|
||||
+ fsl,port-handles = <&fman0_rx5 &fman0_tx5>;
|
||||
+ ptimer-handle = <&ptp_timer0>;
|
||||
+ };
|
||||
+
|
||||
+ mdio@eb000 {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ compatible = "fsl,fman-memac-mdio";
|
||||
+ reg = <0xeb000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fman0_10g_rx0: port@90000 {
|
||||
+ cell-index = <0>;
|
||||
+ compatible = "fsl,fman-port-10g-rx";
|
||||
+ reg = <0x90000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ fman0_10g_tx0: port@b0000 {
|
||||
+ cell-index = <0>;
|
||||
+ compatible = "fsl,fman-port-10g-tx";
|
||||
+ reg = <0xb0000 0x1000>;
|
||||
+ fsl,qman-channel-id = <0x800>;
|
||||
+ };
|
||||
+
|
||||
+ fm1mac9: ethernet@f0000 {
|
||||
+ cell-index = <0>;
|
||||
+ compatible = "fsl,fman-memac";
|
||||
+ reg = <0xf0000 0x1000>;
|
||||
+ fsl,port-handles = <&fman0_10g_rx0 &fman0_10g_tx0>;
|
||||
+ };
|
||||
+
|
||||
+ mdio@f1000 {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ compatible = "fsl,fman-memac-mdio";
|
||||
+ reg = <0xf1000 0x1000>;
|
||||
+ };
|
||||
+
|
||||
+ ptp_timer0: rtc@fe000 {
|
||||
+ compatible = "fsl,fman-rtc";
|
||||
+ reg = <0xfe000 0x1000>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
dspi0: dspi@2100000 {
|
||||
compatible = "fsl,ls1043a-dspi", "fsl,ls1021a-v1.0-dspi";
|
||||
#address-cells = <1>;
|
||||
@@ -522,4 +849,138 @@
|
||||
};
|
||||
};
|
||||
|
||||
+ fsl,dpaa {
|
||||
+ compatible = "fsl,ls1043a-dpaa", "simple-bus", "fsl,dpaa";
|
||||
+ ethernet@0 {
|
||||
+ compatible = "fsl,dpa-ethernet";
|
||||
+ fsl,fman-mac = <&fm1mac1>;
|
||||
+ };
|
||||
+ ethernet@1 {
|
||||
+ compatible = "fsl,dpa-ethernet";
|
||||
+ fsl,fman-mac = <&fm1mac2>;
|
||||
+ };
|
||||
+ ethernet@2 {
|
||||
+ compatible = "fsl,dpa-ethernet";
|
||||
+ fsl,fman-mac = <&fm1mac3>;
|
||||
+ };
|
||||
+ ethernet@3 {
|
||||
+ compatible = "fsl,dpa-ethernet";
|
||||
+ fsl,fman-mac = <&fm1mac4>;
|
||||
+ };
|
||||
+ ethernet@4 {
|
||||
+ compatible = "fsl,dpa-ethernet";
|
||||
+ fsl,fman-mac = <&fm1mac5>;
|
||||
+ };
|
||||
+ ethernet@5 {
|
||||
+ compatible = "fsl,dpa-ethernet";
|
||||
+ fsl,fman-mac = <&fm1mac6>;
|
||||
+ };
|
||||
+ ethernet@8 {
|
||||
+ compatible = "fsl,dpa-ethernet";
|
||||
+ fsl,fman-mac = <&fm1mac9>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ qportals: qman-portals@500000000 {
|
||||
+ ranges = <0x0 0x5 0x00000000 0x8000000>;
|
||||
+ };
|
||||
+ bportals: bman-portals@508000000 {
|
||||
+ ranges = <0x0 0x5 0x08000000 0x8000000>;
|
||||
+ };
|
||||
+ reserved-memory {
|
||||
+ #address-cells = <2>;
|
||||
+ #size-cells = <2>;
|
||||
+ ranges;
|
||||
+
|
||||
+ bman_fbpr: bman-fbpr {
|
||||
+ size = <0 0x1000000>;
|
||||
+ alignment = <0 0x1000000>;
|
||||
+ };
|
||||
+ qman_fqd: qman-fqd {
|
||||
+ size = <0 0x400000>;
|
||||
+ alignment = <0 0x400000>;
|
||||
+ };
|
||||
+ qman_pfdr: qman-pfdr {
|
||||
+ size = <0 0x2000000>;
|
||||
+ alignment = <0 0x2000000>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&fman0 {
|
||||
+ /* offline - 1 */
|
||||
+ port@82000 {
|
||||
+ fsl,qman-channel-id = <0x809>;
|
||||
+ };
|
||||
+
|
||||
+ /* tx - 10g - 2 */
|
||||
+ port@a8000 {
|
||||
+ fsl,qman-channel-id = <0x802>;
|
||||
+ };
|
||||
+ /* tx - 10g - 3 */
|
||||
+ port@a9000 {
|
||||
+ fsl,qman-channel-id = <0x803>;
|
||||
+ };
|
||||
+ /* tx - 1g - 2 */
|
||||
+ port@aa000 {
|
||||
+ fsl,qman-channel-id = <0x804>;
|
||||
+ };
|
||||
+ /* tx - 1g - 3 */
|
||||
+ port@ab000 {
|
||||
+ fsl,qman-channel-id = <0x805>;
|
||||
+ };
|
||||
+ /* tx - 1g - 4 */
|
||||
+ port@ac000 {
|
||||
+ fsl,qman-channel-id = <0x806>;
|
||||
+ };
|
||||
+ /* tx - 1g - 5 */
|
||||
+ port@ad000 {
|
||||
+ fsl,qman-channel-id = <0x807>;
|
||||
+ };
|
||||
+ /* tx - 10g - 0 */
|
||||
+ port@b0000 {
|
||||
+ fsl,qman-channel-id = <0x800>;
|
||||
+ };
|
||||
+ /* tx - 10g - 1 */
|
||||
+ port@b1000 {
|
||||
+ fsl,qman-channel-id = <0x801>;
|
||||
+ };
|
||||
+ /* offline - 2 */
|
||||
+ port@83000 {
|
||||
+ fsl,qman-channel-id = <0x80a>;
|
||||
+ };
|
||||
+ /* offline - 3 */
|
||||
+ port@84000 {
|
||||
+ fsl,qman-channel-id = <0x80b>;
|
||||
+ };
|
||||
+ /* offline - 4 */
|
||||
+ port@85000 {
|
||||
+ fsl,qman-channel-id = <0x80c>;
|
||||
+ };
|
||||
+ /* offline - 5 */
|
||||
+ port@86000 {
|
||||
+ fsl,qman-channel-id = <0x80d>;
|
||||
+ };
|
||||
+ /* offline - 6 */
|
||||
+ port@87000 {
|
||||
+ fsl,qman-channel-id = <0x80e>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&bman_fbpr {
|
||||
+ compatible = "fsl,bman-fbpr";
|
||||
+ alloc-ranges = <0 0 0x10000 0>;
|
||||
};
|
||||
+
|
||||
+&qman_fqd {
|
||||
+ compatible = "fsl,qman-fqd";
|
||||
+ alloc-ranges = <0 0 0x10000 0>;
|
||||
+};
|
||||
+
|
||||
+&qman_pfdr {
|
||||
+ compatible = "fsl,qman-pfdr";
|
||||
+ alloc-ranges = <0 0 0x10000 0>;
|
||||
+};
|
||||
+
|
||||
+/include/ "qoriq-qman1-portals.dtsi"
|
||||
+/include/ "qoriq-bman1-portals.dtsi"
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/freescale/qoriq-bman1-portals.dtsi
|
||||
@@ -0,0 +1,104 @@
|
||||
+/*
|
||||
+ * QorIQ BMan Portal device tree stub for 10 portals
|
||||
+ *
|
||||
+ * Copyright 2011-2016 Freescale Semiconductor Inc.
|
||||
+ *
|
||||
+ * Redistribution and use in source and binary forms, with or without
|
||||
+ * modification, are permitted provided that the following conditions are met:
|
||||
+ * * Redistributions of source code must retain the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer.
|
||||
+ * * Redistributions in binary form must reproduce the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer in the
|
||||
+ * documentation and/or other materials provided with the distribution.
|
||||
+ * * Neither the name of Freescale Semiconductor nor the
|
||||
+ * names of its contributors may be used to endorse or promote products
|
||||
+ * derived from this software without specific prior written permission.
|
||||
+ *
|
||||
+ *
|
||||
+ * ALTERNATIVELY, this software may be distributed under the terms of the
|
||||
+ * GNU General Public License ("GPL") as published by the Free Software
|
||||
+ * Foundation, either version 2 of that License or (at your option) any
|
||||
+ * later version.
|
||||
+ *
|
||||
+ * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
|
||||
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
+ * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
|
||||
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
+ */
|
||||
+
|
||||
+&bportals {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ compatible = "simple-bus";
|
||||
+ bportal0: bman-portal@0 {
|
||||
+ cell-index = <0>;
|
||||
+ compatible = "fsl,bman-portal";
|
||||
+ reg = <0x0 0x4000 0x4000000 0x4000>;
|
||||
+ interrupts = <0 173 0x4>;
|
||||
+ };
|
||||
+ bportal1: bman-portal@10000 {
|
||||
+ cell-index = <1>;
|
||||
+ compatible = "fsl,bman-portal";
|
||||
+ reg = <0x10000 0x4000 0x4010000 0x4000>;
|
||||
+ interrupts = <0 175 0x4>;
|
||||
+ };
|
||||
+ bportal2: bman-portal@20000 {
|
||||
+ cell-index = <2>;
|
||||
+ compatible = "fsl,bman-portal";
|
||||
+ reg = <0x20000 0x4000 0x4020000 0x4000>;
|
||||
+ interrupts = <0 177 0x4>;
|
||||
+ };
|
||||
+ bportal3: bman-portal@30000 {
|
||||
+ cell-index = <3>;
|
||||
+ compatible = "fsl,bman-portal";
|
||||
+ reg = <0x30000 0x4000 0x4030000 0x4000>;
|
||||
+ interrupts = <0 179 0x4>;
|
||||
+ };
|
||||
+ bportal4: bman-portal@40000 {
|
||||
+ cell-index = <4>;
|
||||
+ compatible = "fsl,bman-portal";
|
||||
+ reg = <0x40000 0x4000 0x4040000 0x4000>;
|
||||
+ interrupts = <0 181 0x4>;
|
||||
+ };
|
||||
+ bportal5: bman-portal@50000 {
|
||||
+ cell-index = <5>;
|
||||
+ compatible = "fsl,bman-portal";
|
||||
+ reg = <0x50000 0x4000 0x4050000 0x4000>;
|
||||
+ interrupts = <0 183 0x4>;
|
||||
+ };
|
||||
+ bportal6: bman-portal@60000 {
|
||||
+ cell-index = <6>;
|
||||
+ compatible = "fsl,bman-portal";
|
||||
+ reg = <0x60000 0x4000 0x4060000 0x4000>;
|
||||
+ interrupts = <0 185 0x4>;
|
||||
+ };
|
||||
+ bportal7: bman-portal@70000 {
|
||||
+ cell-index = <7>;
|
||||
+ compatible = "fsl,bman-portal";
|
||||
+ reg = <0x70000 0x4000 0x4070000 0x4000>;
|
||||
+ interrupts = <0 187 0x4>;
|
||||
+ };
|
||||
+ bportal8: bman-portal@80000 {
|
||||
+ cell-index = <8>;
|
||||
+ compatible = "fsl,bman-portal";
|
||||
+ reg = <0x80000 0x4000 0x4080000 0x4000>;
|
||||
+ interrupts = <0 189 0x4>;
|
||||
+ };
|
||||
+/* bportal9: bman-portal@90000 {
|
||||
+ cell-index = <9>;
|
||||
+ compatible = "fsl,bman-portal";
|
||||
+ reg = <0x90000 0x4000 0x4090000 0x4000>;
|
||||
+ interrupts = <0 191 0x4>;
|
||||
+ }; */
|
||||
+ bman-bpids@0 {
|
||||
+ compatible = "fsl,bpid-range";
|
||||
+ fsl,bpid-range = <32 32>;
|
||||
+ };
|
||||
+
|
||||
+};
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/freescale/qoriq-qman1-portals.dtsi
|
||||
@@ -0,0 +1,136 @@
|
||||
+/*
|
||||
+ * QorIQ QMan Portal device tree stub for 10 portals & 15 pool channels
|
||||
+ *
|
||||
+ * Copyright 2011-2016 Freescale Semiconductor Inc.
|
||||
+ *
|
||||
+ * Redistribution and use in source and binary forms, with or without
|
||||
+ * modification, are permitted provided that the following conditions are met:
|
||||
+ * * Redistributions of source code must retain the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer.
|
||||
+ * * Redistributions in binary form must reproduce the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer in the
|
||||
+ * documentation and/or other materials provided with the distribution.
|
||||
+ * * Neither the name of Freescale Semiconductor nor the
|
||||
+ * names of its contributors may be used to endorse or promote products
|
||||
+ * derived from this software without specific prior written permission.
|
||||
+ *
|
||||
+ *
|
||||
+ * ALTERNATIVELY, this software may be distributed under the terms of the
|
||||
+ * GNU General Public License ("GPL") as published by the Free Software
|
||||
+ * Foundation, either version 2 of that License or (at your option) any
|
||||
+ * later version.
|
||||
+ *
|
||||
+ * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
|
||||
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
+ * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
|
||||
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
+ */
|
||||
+&qportals {
|
||||
+
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ compatible = "simple-bus";
|
||||
+ qportal0: qman-portal@0 {
|
||||
+ cell-index = <0>;
|
||||
+ compatible = "fsl,qman-portal";
|
||||
+ reg = <0x0 0x4000 0x4000000 0x4000>;
|
||||
+ interrupts = <0 172 0x4>;
|
||||
+ fsl,qman-channel-id = <0x0>;
|
||||
+ };
|
||||
+
|
||||
+ qportal1: qman-portal@10000 {
|
||||
+ cell-index = <1>;
|
||||
+ compatible = "fsl,qman-portal";
|
||||
+ reg = <0x10000 0x4000 0x4010000 0x4000>;
|
||||
+ interrupts = <0 174 0x4>;
|
||||
+ fsl,qman-channel-id = <1>;
|
||||
+ };
|
||||
+
|
||||
+ qportal2: qman-portal@20000 {
|
||||
+ cell-index = <2>;
|
||||
+ compatible = "fsl,qman-portal";
|
||||
+ reg = <0x20000 0x4000 0x4020000 0x4000>;
|
||||
+ interrupts = <0 176 0x4>;
|
||||
+ fsl,qman-channel-id = <2>;
|
||||
+ };
|
||||
+
|
||||
+ qportal3: qman-portal@30000 {
|
||||
+ cell-index = <3>;
|
||||
+ compatible = "fsl,qman-portal";
|
||||
+ reg = <0x30000 0x4000 0x4030000 0x4000>;
|
||||
+ interrupts = <0 178 0x4>;
|
||||
+ fsl,qman-channel-id = <3>;
|
||||
+ };
|
||||
+
|
||||
+ qportal4: qman-portal@40000 {
|
||||
+ cell-index = <4>;
|
||||
+ compatible = "fsl,qman-portal";
|
||||
+ reg = <0x40000 0x4000 0x4040000 0x4000>;
|
||||
+ interrupts = <0 180 0x4>;
|
||||
+ fsl,qman-channel-id = <4>;
|
||||
+ };
|
||||
+
|
||||
+ qportal5: qman-portal@50000 {
|
||||
+ cell-index = <5>;
|
||||
+ compatible = "fsl,qman-portal";
|
||||
+ reg = <0x50000 0x4000 0x4050000 0x4000>;
|
||||
+ interrupts = <0 182 0x4>;
|
||||
+ fsl,qman-channel-id = <5>;
|
||||
+ };
|
||||
+
|
||||
+ qportal6: qman-portal@60000 {
|
||||
+ cell-index = <6>;
|
||||
+ compatible = "fsl,qman-portal";
|
||||
+ reg = <0x60000 0x4000 0x4060000 0x4000>;
|
||||
+ interrupts = <0 184 0x4>;
|
||||
+ fsl,qman-channel-id = <6>;
|
||||
+ };
|
||||
+
|
||||
+ qportal7: qman-portal@70000 {
|
||||
+ cell-index = <7>;
|
||||
+ compatible = "fsl,qman-portal";
|
||||
+ reg = <0x70000 0x4000 0x4070000 0x4000>;
|
||||
+ interrupts = <0 186 0x4>;
|
||||
+ fsl,qman-channel-id = <7>;
|
||||
+ };
|
||||
+
|
||||
+ qportal8: qman-portal@80000 {
|
||||
+ cell-index = <8>;
|
||||
+ compatible = "fsl,qman-portal";
|
||||
+ reg = <0x80000 0x4000 0x4080000 0x4000>;
|
||||
+ interrupts = <0 188 0x4>;
|
||||
+ fsl,qman-channel-id = <8>;
|
||||
+ };
|
||||
+
|
||||
+/* qportal9: qman-portal@90000 {
|
||||
+ cell-index = <9>;
|
||||
+ compatible = "fsl,qman-portal";
|
||||
+ reg = <0x90000 0x4000 0x4090000 0x4000>;
|
||||
+ interrupts = <0 190 0x4>;
|
||||
+ fsl,qman-channel-id = <9>;
|
||||
+ }; */
|
||||
+
|
||||
+ qman-fqids@0 {
|
||||
+ compatible = "fsl,fqid-range";
|
||||
+ fsl,fqid-range = <256 256>;
|
||||
+ };
|
||||
+ qman-fqids@1 {
|
||||
+ compatible = "fsl,fqid-range";
|
||||
+ fsl,fqid-range = <32768 32768>;
|
||||
+ };
|
||||
+ qman-pools@0 {
|
||||
+ compatible = "fsl,pool-channel-range";
|
||||
+ fsl,pool-channel-range = <0x401 0xf>;
|
||||
+ };
|
||||
+ qman-cgrids@0 {
|
||||
+ compatible = "fsl,cgrid-range";
|
||||
+ fsl,cgrid-range = <0 256>;
|
||||
+ };
|
||||
+
|
||||
+};
|
||||
\ No newline at end of file
|
|
@ -0,0 +1,81 @@
|
|||
From e2b301610e6201df40deb62942b18c772365eb1c Mon Sep 17 00:00:00 2001
|
||||
From: Shaohui Xie <Shaohui.Xie@freescale.com>
|
||||
Date: Thu, 21 Jan 2016 11:29:22 +0800
|
||||
Subject: [PATCH 13/70] dts: ls1043ardb: add mdio & phy nodes
|
||||
|
||||
Signed-off-by: Shaohui Xie <Shaohui.Xie@freescale.com>
|
||||
---
|
||||
arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dts | 65 +++++++++++++++++++++
|
||||
1 file changed, 65 insertions(+)
|
||||
|
||||
--- a/arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dts
|
||||
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dts
|
||||
@@ -115,3 +115,68 @@
|
||||
&duart1 {
|
||||
status = "okay";
|
||||
};
|
||||
+
|
||||
+&fman0 {
|
||||
+ ethernet@e0000 {
|
||||
+ phy-handle = <&qsgmii_phy1>;
|
||||
+ phy-connection-type = "qsgmii";
|
||||
+ };
|
||||
+
|
||||
+ ethernet@e2000 {
|
||||
+ phy-handle = <&qsgmii_phy2>;
|
||||
+ phy-connection-type = "qsgmii";
|
||||
+ };
|
||||
+
|
||||
+ ethernet@e4000 {
|
||||
+ phy-handle = <&rgmii_phy1>;
|
||||
+ phy-connection-type = "rgmii";
|
||||
+ };
|
||||
+
|
||||
+ ethernet@e6000 {
|
||||
+ phy-handle = <&rgmii_phy2>;
|
||||
+ phy-connection-type = "rgmii";
|
||||
+ };
|
||||
+
|
||||
+ ethernet@e8000 {
|
||||
+ phy-handle = <&qsgmii_phy3>;
|
||||
+ phy-connection-type = "qsgmii";
|
||||
+ };
|
||||
+
|
||||
+ ethernet@ea000 {
|
||||
+ phy-handle = <&qsgmii_phy4>;
|
||||
+ phy-connection-type = "qsgmii";
|
||||
+ };
|
||||
+
|
||||
+ ethernet@f0000 { /* 10GEC1 */
|
||||
+ phy-handle = <&aqr105_phy>;
|
||||
+ phy-connection-type = "xgmii";
|
||||
+ };
|
||||
+
|
||||
+ mdio@fc000 {
|
||||
+ rgmii_phy1: ethernet-phy@1 {
|
||||
+ reg = <0x1>;
|
||||
+ };
|
||||
+ rgmii_phy2: ethernet-phy@2 {
|
||||
+ reg = <0x2>;
|
||||
+ };
|
||||
+ qsgmii_phy1: ethernet-phy@3 {
|
||||
+ reg = <0x4>;
|
||||
+ };
|
||||
+ qsgmii_phy2: ethernet-phy@4 {
|
||||
+ reg = <0x5>;
|
||||
+ };
|
||||
+ qsgmii_phy3: ethernet-phy@5 {
|
||||
+ reg = <0x6>;
|
||||
+ };
|
||||
+ qsgmii_phy4: ethernet-phy@6 {
|
||||
+ reg = <0x7>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ mdio@fd000 {
|
||||
+ aqr105_phy: ethernet-phy@c {
|
||||
+ compatible = "ethernet-phy-ieee802.3-c45";
|
||||
+ reg = <0x1>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
|
@ -0,0 +1,108 @@
|
|||
From 0e9d79db770196e94869650d7c4d13ea23937138 Mon Sep 17 00:00:00 2001
|
||||
From: Yangbo Lu <yangbo.lu@nxp.com>
|
||||
Date: Mon, 25 Jan 2016 14:27:27 +0800
|
||||
Subject: [PATCH 22/70] dt: move guts devicetree doc out of powerpc directory
|
||||
|
||||
Move guts devicetree doc to Documentation/devicetree/bindings/soc/fsl/
|
||||
since it's used by not only PowerPC but also ARM. And add a specification
|
||||
for 'little-endian' property.
|
||||
|
||||
Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
|
||||
---
|
||||
.../devicetree/bindings/powerpc/fsl/guts.txt | 41 ------------------
|
||||
Documentation/devicetree/bindings/soc/fsl/guts.txt | 44 ++++++++++++++++++++
|
||||
2 files changed, 44 insertions(+), 41 deletions(-)
|
||||
delete mode 100644 Documentation/devicetree/bindings/powerpc/fsl/guts.txt
|
||||
create mode 100644 Documentation/devicetree/bindings/soc/fsl/guts.txt
|
||||
|
||||
--- a/Documentation/devicetree/bindings/powerpc/fsl/guts.txt
|
||||
+++ /dev/null
|
||||
@@ -1,41 +0,0 @@
|
||||
-* Global Utilities Block
|
||||
-
|
||||
-The global utilities block controls power management, I/O device
|
||||
-enabling, power-on-reset configuration monitoring, general-purpose
|
||||
-I/O signal configuration, alternate function selection for multiplexed
|
||||
-signals, and clock control.
|
||||
-
|
||||
-Required properties:
|
||||
-
|
||||
- - compatible : Should define the compatible device type for
|
||||
- global-utilities.
|
||||
- Possible compatibles:
|
||||
- "fsl,qoriq-device-config-1.0"
|
||||
- "fsl,qoriq-device-config-2.0"
|
||||
- "fsl,<chip>-device-config"
|
||||
- "fsl,<chip>-guts"
|
||||
- - reg : Offset and length of the register set for the device.
|
||||
-
|
||||
-Recommended properties:
|
||||
-
|
||||
- - fsl,has-rstcr : Indicates that the global utilities register set
|
||||
- contains a functioning "reset control register" (i.e. the board
|
||||
- is wired to reset upon setting the HRESET_REQ bit in this register).
|
||||
-
|
||||
- - fsl,liodn-bits : Indicates the number of defined bits in the LIODN
|
||||
- registers, for those SOCs that have a PAMU device.
|
||||
-
|
||||
-Examples:
|
||||
- global-utilities@e0000 { /* global utilities block */
|
||||
- compatible = "fsl,mpc8548-guts";
|
||||
- reg = <e0000 1000>;
|
||||
- fsl,has-rstcr;
|
||||
- };
|
||||
-
|
||||
- guts: global-utilities@e0000 {
|
||||
- compatible = "fsl,qoriq-device-config-1.0";
|
||||
- reg = <0xe0000 0xe00>;
|
||||
- fsl,has-rstcr;
|
||||
- #sleep-cells = <1>;
|
||||
- fsl,liodn-bits = <12>;
|
||||
- };
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/soc/fsl/guts.txt
|
||||
@@ -0,0 +1,44 @@
|
||||
+* Global Utilities Block
|
||||
+
|
||||
+The global utilities block controls power management, I/O device
|
||||
+enabling, power-on-reset configuration monitoring, general-purpose
|
||||
+I/O signal configuration, alternate function selection for multiplexed
|
||||
+signals, and clock control.
|
||||
+
|
||||
+Required properties:
|
||||
+
|
||||
+ - compatible : Should define the compatible device type for
|
||||
+ global-utilities.
|
||||
+ Possible compatibles:
|
||||
+ "fsl,qoriq-device-config-1.0"
|
||||
+ "fsl,qoriq-device-config-2.0"
|
||||
+ "fsl,<chip>-device-config"
|
||||
+ "fsl,<chip>-guts"
|
||||
+ - reg : Offset and length of the register set for the device.
|
||||
+
|
||||
+Recommended properties:
|
||||
+
|
||||
+ - fsl,has-rstcr : Indicates that the global utilities register set
|
||||
+ contains a functioning "reset control register" (i.e. the board
|
||||
+ is wired to reset upon setting the HRESET_REQ bit in this register).
|
||||
+
|
||||
+ - fsl,liodn-bits : Indicates the number of defined bits in the LIODN
|
||||
+ registers, for those SOCs that have a PAMU device.
|
||||
+
|
||||
+ - little-endian : Indicates that the global utilities block is little
|
||||
+ endian. The default is big endian.
|
||||
+
|
||||
+Examples:
|
||||
+ global-utilities@e0000 { /* global utilities block */
|
||||
+ compatible = "fsl,mpc8548-guts";
|
||||
+ reg = <e0000 1000>;
|
||||
+ fsl,has-rstcr;
|
||||
+ };
|
||||
+
|
||||
+ guts: global-utilities@e0000 {
|
||||
+ compatible = "fsl,qoriq-device-config-1.0";
|
||||
+ reg = <0xe0000 0xe00>;
|
||||
+ fsl,has-rstcr;
|
||||
+ #sleep-cells = <1>;
|
||||
+ fsl,liodn-bits = <12>;
|
||||
+ };
|
|
@ -0,0 +1,283 @@
|
|||
From 2d8816af7c19882f62c4a25edb9fcc9040312f96 Mon Sep 17 00:00:00 2001
|
||||
From: Yangbo Lu <yangbo.lu@nxp.com>
|
||||
Date: Tue, 12 Apr 2016 14:21:19 +0800
|
||||
Subject: [PATCH 23/70] powerpc/fsl: move mpc85xx.h to include/linux/fsl
|
||||
|
||||
commit 2a76fbe35c14717b4f4a145e0ab83517b1f4ab4a
|
||||
[context adjustment]
|
||||
[doesn't apply arch/powerpc/kernel/cpu_setup_fsl_booke.S]
|
||||
[doesn't apply arch/powerpc/sysdev/mpic_timer.c]
|
||||
|
||||
Move mpc85xx.h to include/linux/fsl and rename it to svr.h as
|
||||
a common header file. It has been used for mpc85xx and it will
|
||||
be used for ARM-based SoC as well.
|
||||
|
||||
Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
|
||||
Integrated-by: Zhao Qiang <qiang.zhao@nxp.com>
|
||||
---
|
||||
arch/powerpc/include/asm/mpc85xx.h | 95 ------------------------------
|
||||
drivers/clk/clk-qoriq.c | 2 +-
|
||||
drivers/i2c/busses/i2c-mpc.c | 2 +-
|
||||
drivers/iommu/fsl_pamu.c | 2 +-
|
||||
drivers/net/ethernet/freescale/gianfar.c | 2 +-
|
||||
include/linux/fsl/svr.h | 95 ++++++++++++++++++++++++++++++
|
||||
6 files changed, 99 insertions(+), 99 deletions(-)
|
||||
delete mode 100644 arch/powerpc/include/asm/mpc85xx.h
|
||||
create mode 100644 include/linux/fsl/svr.h
|
||||
|
||||
--- a/arch/powerpc/include/asm/mpc85xx.h
|
||||
+++ /dev/null
|
||||
@@ -1,95 +0,0 @@
|
||||
-/*
|
||||
- * MPC85xx cpu type detection
|
||||
- *
|
||||
- * Copyright 2011-2012 Freescale Semiconductor, Inc.
|
||||
- *
|
||||
- * This 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_PPC_MPC85XX_H
|
||||
-#define __ASM_PPC_MPC85XX_H
|
||||
-
|
||||
-#define SVR_REV(svr) ((svr) & 0xFF) /* SOC design resision */
|
||||
-#define SVR_MAJ(svr) (((svr) >> 4) & 0xF) /* Major revision field*/
|
||||
-#define SVR_MIN(svr) (((svr) >> 0) & 0xF) /* Minor revision field*/
|
||||
-
|
||||
-/* Some parts define SVR[0:23] as the SOC version */
|
||||
-#define SVR_SOC_VER(svr) (((svr) >> 8) & 0xFFF7FF) /* SOC Version fields */
|
||||
-
|
||||
-#define SVR_8533 0x803400
|
||||
-#define SVR_8535 0x803701
|
||||
-#define SVR_8536 0x803700
|
||||
-#define SVR_8540 0x803000
|
||||
-#define SVR_8541 0x807200
|
||||
-#define SVR_8543 0x803200
|
||||
-#define SVR_8544 0x803401
|
||||
-#define SVR_8545 0x803102
|
||||
-#define SVR_8547 0x803101
|
||||
-#define SVR_8548 0x803100
|
||||
-#define SVR_8555 0x807100
|
||||
-#define SVR_8560 0x807000
|
||||
-#define SVR_8567 0x807501
|
||||
-#define SVR_8568 0x807500
|
||||
-#define SVR_8569 0x808000
|
||||
-#define SVR_8572 0x80E000
|
||||
-#define SVR_P1010 0x80F100
|
||||
-#define SVR_P1011 0x80E500
|
||||
-#define SVR_P1012 0x80E501
|
||||
-#define SVR_P1013 0x80E700
|
||||
-#define SVR_P1014 0x80F101
|
||||
-#define SVR_P1017 0x80F700
|
||||
-#define SVR_P1020 0x80E400
|
||||
-#define SVR_P1021 0x80E401
|
||||
-#define SVR_P1022 0x80E600
|
||||
-#define SVR_P1023 0x80F600
|
||||
-#define SVR_P1024 0x80E402
|
||||
-#define SVR_P1025 0x80E403
|
||||
-#define SVR_P2010 0x80E300
|
||||
-#define SVR_P2020 0x80E200
|
||||
-#define SVR_P2040 0x821000
|
||||
-#define SVR_P2041 0x821001
|
||||
-#define SVR_P3041 0x821103
|
||||
-#define SVR_P4040 0x820100
|
||||
-#define SVR_P4080 0x820000
|
||||
-#define SVR_P5010 0x822100
|
||||
-#define SVR_P5020 0x822000
|
||||
-#define SVR_P5021 0X820500
|
||||
-#define SVR_P5040 0x820400
|
||||
-#define SVR_T4240 0x824000
|
||||
-#define SVR_T4120 0x824001
|
||||
-#define SVR_T4160 0x824100
|
||||
-#define SVR_T4080 0x824102
|
||||
-#define SVR_C291 0x850000
|
||||
-#define SVR_C292 0x850020
|
||||
-#define SVR_C293 0x850030
|
||||
-#define SVR_B4860 0X868000
|
||||
-#define SVR_G4860 0x868001
|
||||
-#define SVR_G4060 0x868003
|
||||
-#define SVR_B4440 0x868100
|
||||
-#define SVR_G4440 0x868101
|
||||
-#define SVR_B4420 0x868102
|
||||
-#define SVR_B4220 0x868103
|
||||
-#define SVR_T1040 0x852000
|
||||
-#define SVR_T1041 0x852001
|
||||
-#define SVR_T1042 0x852002
|
||||
-#define SVR_T1020 0x852100
|
||||
-#define SVR_T1021 0x852101
|
||||
-#define SVR_T1022 0x852102
|
||||
-#define SVR_T2080 0x853000
|
||||
-#define SVR_T2081 0x853100
|
||||
-
|
||||
-#define SVR_8610 0x80A000
|
||||
-#define SVR_8641 0x809000
|
||||
-#define SVR_8641D 0x809001
|
||||
-
|
||||
-#define SVR_9130 0x860001
|
||||
-#define SVR_9131 0x860000
|
||||
-#define SVR_9132 0x861000
|
||||
-#define SVR_9232 0x861400
|
||||
-
|
||||
-#define SVR_Unknown 0xFFFFFF
|
||||
-
|
||||
-#endif
|
||||
--- a/drivers/clk/clk-qoriq.c
|
||||
+++ b/drivers/clk/clk-qoriq.c
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/fsl/guts.h>
|
||||
+#include <linux/fsl/svr.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
@@ -1148,7 +1149,6 @@ bad_args:
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC
|
||||
-#include <asm/mpc85xx.h>
|
||||
|
||||
static const u32 a4510_svrs[] __initconst = {
|
||||
(SVR_P2040 << 8) | 0x10, /* P2040 1.0 */
|
||||
--- a/drivers/i2c/busses/i2c-mpc.c
|
||||
+++ b/drivers/i2c/busses/i2c-mpc.c
|
||||
@@ -27,9 +27,9 @@
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/delay.h>
|
||||
+#include <linux/fsl/svr.h>
|
||||
|
||||
#include <asm/mpc52xx.h>
|
||||
-#include <asm/mpc85xx.h>
|
||||
#include <sysdev/fsl_soc.h>
|
||||
|
||||
#define DRV_NAME "mpc-i2c"
|
||||
--- a/drivers/iommu/fsl_pamu.c
|
||||
+++ b/drivers/iommu/fsl_pamu.c
|
||||
@@ -21,10 +21,10 @@
|
||||
#include "fsl_pamu.h"
|
||||
|
||||
#include <linux/fsl/guts.h>
|
||||
+#include <linux/fsl/svr.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/genalloc.h>
|
||||
|
||||
-#include <asm/mpc85xx.h>
|
||||
|
||||
/* define indexes for each operation mapping scenario */
|
||||
#define OMI_QMAN 0x00
|
||||
--- a/drivers/net/ethernet/freescale/gianfar.c
|
||||
+++ b/drivers/net/ethernet/freescale/gianfar.c
|
||||
@@ -86,11 +86,11 @@
|
||||
#include <linux/udp.h>
|
||||
#include <linux/in.h>
|
||||
#include <linux/net_tstamp.h>
|
||||
+#include <linux/fsl/svr.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#ifdef CONFIG_PPC
|
||||
#include <asm/reg.h>
|
||||
-#include <asm/mpc85xx.h>
|
||||
#endif
|
||||
#include <asm/irq.h>
|
||||
#include <asm/uaccess.h>
|
||||
--- /dev/null
|
||||
+++ b/include/linux/fsl/svr.h
|
||||
@@ -0,0 +1,95 @@
|
||||
+/*
|
||||
+ * MPC85xx cpu type detection
|
||||
+ *
|
||||
+ * Copyright 2011-2012 Freescale Semiconductor, Inc.
|
||||
+ *
|
||||
+ * This 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 FSL_SVR_H
|
||||
+#define FSL_SVR_H
|
||||
+
|
||||
+#define SVR_REV(svr) ((svr) & 0xFF) /* SOC design resision */
|
||||
+#define SVR_MAJ(svr) (((svr) >> 4) & 0xF) /* Major revision field*/
|
||||
+#define SVR_MIN(svr) (((svr) >> 0) & 0xF) /* Minor revision field*/
|
||||
+
|
||||
+/* Some parts define SVR[0:23] as the SOC version */
|
||||
+#define SVR_SOC_VER(svr) (((svr) >> 8) & 0xFFF7FF) /* SOC Version fields */
|
||||
+
|
||||
+#define SVR_8533 0x803400
|
||||
+#define SVR_8535 0x803701
|
||||
+#define SVR_8536 0x803700
|
||||
+#define SVR_8540 0x803000
|
||||
+#define SVR_8541 0x807200
|
||||
+#define SVR_8543 0x803200
|
||||
+#define SVR_8544 0x803401
|
||||
+#define SVR_8545 0x803102
|
||||
+#define SVR_8547 0x803101
|
||||
+#define SVR_8548 0x803100
|
||||
+#define SVR_8555 0x807100
|
||||
+#define SVR_8560 0x807000
|
||||
+#define SVR_8567 0x807501
|
||||
+#define SVR_8568 0x807500
|
||||
+#define SVR_8569 0x808000
|
||||
+#define SVR_8572 0x80E000
|
||||
+#define SVR_P1010 0x80F100
|
||||
+#define SVR_P1011 0x80E500
|
||||
+#define SVR_P1012 0x80E501
|
||||
+#define SVR_P1013 0x80E700
|
||||
+#define SVR_P1014 0x80F101
|
||||
+#define SVR_P1017 0x80F700
|
||||
+#define SVR_P1020 0x80E400
|
||||
+#define SVR_P1021 0x80E401
|
||||
+#define SVR_P1022 0x80E600
|
||||
+#define SVR_P1023 0x80F600
|
||||
+#define SVR_P1024 0x80E402
|
||||
+#define SVR_P1025 0x80E403
|
||||
+#define SVR_P2010 0x80E300
|
||||
+#define SVR_P2020 0x80E200
|
||||
+#define SVR_P2040 0x821000
|
||||
+#define SVR_P2041 0x821001
|
||||
+#define SVR_P3041 0x821103
|
||||
+#define SVR_P4040 0x820100
|
||||
+#define SVR_P4080 0x820000
|
||||
+#define SVR_P5010 0x822100
|
||||
+#define SVR_P5020 0x822000
|
||||
+#define SVR_P5021 0X820500
|
||||
+#define SVR_P5040 0x820400
|
||||
+#define SVR_T4240 0x824000
|
||||
+#define SVR_T4120 0x824001
|
||||
+#define SVR_T4160 0x824100
|
||||
+#define SVR_T4080 0x824102
|
||||
+#define SVR_C291 0x850000
|
||||
+#define SVR_C292 0x850020
|
||||
+#define SVR_C293 0x850030
|
||||
+#define SVR_B4860 0X868000
|
||||
+#define SVR_G4860 0x868001
|
||||
+#define SVR_G4060 0x868003
|
||||
+#define SVR_B4440 0x868100
|
||||
+#define SVR_G4440 0x868101
|
||||
+#define SVR_B4420 0x868102
|
||||
+#define SVR_B4220 0x868103
|
||||
+#define SVR_T1040 0x852000
|
||||
+#define SVR_T1041 0x852001
|
||||
+#define SVR_T1042 0x852002
|
||||
+#define SVR_T1020 0x852100
|
||||
+#define SVR_T1021 0x852101
|
||||
+#define SVR_T1022 0x852102
|
||||
+#define SVR_T2080 0x853000
|
||||
+#define SVR_T2081 0x853100
|
||||
+
|
||||
+#define SVR_8610 0x80A000
|
||||
+#define SVR_8641 0x809000
|
||||
+#define SVR_8641D 0x809001
|
||||
+
|
||||
+#define SVR_9130 0x860001
|
||||
+#define SVR_9131 0x860000
|
||||
+#define SVR_9132 0x861000
|
||||
+#define SVR_9232 0x861400
|
||||
+
|
||||
+#define SVR_Unknown 0xFFFFFF
|
||||
+
|
||||
+#endif
|
|
@ -0,0 +1,25 @@
|
|||
From caddf479c2deacf3d681a84db56ff164d8a5c9f7 Mon Sep 17 00:00:00 2001
|
||||
From: Madalin Bucur <madalin.bucur@freescale.com>
|
||||
Date: Wed, 23 Mar 2016 21:25:30 +0200
|
||||
Subject: [PATCH 25/70] arm64/dts: align to the new clocking model
|
||||
|
||||
Signed-off-by: Madalin Bucur <madalin.bucur@freescale.com>
|
||||
---
|
||||
arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi
|
||||
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi
|
||||
@@ -203,9 +203,9 @@
|
||||
compatible = "fsl,fman", "simple-bus";
|
||||
ranges = <0x0 0x00 0x1a00000 0x100000>;
|
||||
reg = <0x00 0x1a00000 0x0 0x100000>;
|
||||
- clock-frequency = <0>;
|
||||
- interrupts = <0 44 0x4>,
|
||||
- <0 45 0x4>;
|
||||
+ interrupts = <0 44 0x4>, <0 45 0x4>;
|
||||
+ clocks = <&clockgen 3 0>;
|
||||
+ clock-names = "fmanclk";
|
||||
|
||||
cc {
|
||||
compatible = "fsl,fman-cc";
|
|
@ -0,0 +1,523 @@
|
|||
From ad6176d72132d020317db1496be1485056ac88d7 Mon Sep 17 00:00:00 2001
|
||||
From: Liu Gang <Gang.Liu@nxp.com>
|
||||
Date: Mon, 6 Jun 2016 15:46:00 +0800
|
||||
Subject: [PATCH 28/70] dts/ls1043: update dts for ls1043
|
||||
|
||||
Signed-off-by: Zhao Qiang <qiang.zhao@nxp.com>
|
||||
---
|
||||
arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dts | 59 +++++
|
||||
arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi | 264 +++++++++++++++++++-
|
||||
.../boot/dts/freescale/qoriq-qman1-portals.dtsi | 10 +-
|
||||
3 files changed, 321 insertions(+), 12 deletions(-)
|
||||
|
||||
--- a/arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dts
|
||||
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dts
|
||||
@@ -50,6 +50,10 @@
|
||||
/ {
|
||||
model = "LS1043A RDB Board";
|
||||
compatible = "fsl,ls1043a-rdb", "fsl,ls1043a";
|
||||
+
|
||||
+ aliases {
|
||||
+ crypto = &crypto;
|
||||
+ };
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
@@ -108,6 +112,35 @@
|
||||
};
|
||||
};
|
||||
|
||||
+&dspi0 {
|
||||
+ bus-num = <0>;
|
||||
+ status = "okay";
|
||||
+
|
||||
+ flash@0 {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ compatible = "n25q128a13", "jedec,spi-nor"; /* 16MB */
|
||||
+ reg = <0>;
|
||||
+ spi-max-frequency = <1000000>; /* input clock */
|
||||
+ };
|
||||
+
|
||||
+ slic@2 {
|
||||
+ compatible = "maxim,ds26522";
|
||||
+ reg = <2>;
|
||||
+ spi-max-frequency = <2000000>;
|
||||
+ fsl,spi-cs-sck-delay = <100>;
|
||||
+ fsl,spi-sck-cs-delay = <50>;
|
||||
+ };
|
||||
+
|
||||
+ slic@3 {
|
||||
+ compatible = "maxim,ds26522";
|
||||
+ reg = <3>;
|
||||
+ spi-max-frequency = <2000000>;
|
||||
+ fsl,spi-cs-sck-delay = <100>;
|
||||
+ fsl,spi-sck-cs-delay = <50>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
&duart0 {
|
||||
status = "okay";
|
||||
};
|
||||
@@ -176,7 +209,33 @@
|
||||
mdio@fd000 {
|
||||
aqr105_phy: ethernet-phy@c {
|
||||
compatible = "ethernet-phy-ieee802.3-c45";
|
||||
+ interrupts = <0 132 4>;
|
||||
reg = <0x1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
+
|
||||
+&uqe {
|
||||
+ ucc_hdlc: ucc@2000 {
|
||||
+ compatible = "fsl,ucc_hdlc";
|
||||
+ rx-clock-name = "clk8";
|
||||
+ tx-clock-name = "clk9";
|
||||
+ fsl,rx-sync-clock = "rsync_pin";
|
||||
+ fsl,tx-sync-clock = "tsync_pin";
|
||||
+ fsl,tx-timeslot = <0xfffffffe>;
|
||||
+ fsl,rx-timeslot = <0xfffffffe>;
|
||||
+ fsl,tdm-framer-type = "e1";
|
||||
+ fsl,tdm-mode = "normal";
|
||||
+ fsl,tdm-id = <0>;
|
||||
+ fsl,siram-entry-id = <0>;
|
||||
+ fsl,tdm-interface;
|
||||
+ };
|
||||
+
|
||||
+ ucc_serial: ucc@2200 {
|
||||
+ device_type = "serial";
|
||||
+ compatible = "ucc_uart";
|
||||
+ port-number = <0>;
|
||||
+ rx-clock-name = "brg2";
|
||||
+ tx-clock-name = "brg2";
|
||||
+ };
|
||||
+};
|
||||
--- a/arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi
|
||||
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi
|
||||
@@ -44,6 +44,8 @@
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
+#include <dt-bindings/thermal/thermal.h>
|
||||
+
|
||||
/ {
|
||||
compatible = "fsl,ls1043a";
|
||||
interrupt-parent = <&gic>;
|
||||
@@ -75,6 +77,7 @@
|
||||
compatible = "arm,cortex-a53";
|
||||
reg = <0x0>;
|
||||
clocks = <&clockgen 1 0>;
|
||||
+ #cooling-cells = <2>;
|
||||
};
|
||||
|
||||
cpu1: cpu@1 {
|
||||
@@ -118,6 +121,8 @@
|
||||
<1 14 0x1>, /* Physical Non-Secure PPI */
|
||||
<1 11 0x1>, /* Virtual PPI */
|
||||
<1 10 0x1>; /* Hypervisor PPI */
|
||||
+ arm,reread-timer;
|
||||
+ fsl,erratum-a008585;
|
||||
};
|
||||
|
||||
pmu {
|
||||
@@ -162,11 +167,64 @@
|
||||
big-endian;
|
||||
};
|
||||
|
||||
+ crypto: crypto@1700000 {
|
||||
+ compatible = "fsl,sec-v5.4", "fsl,sec-v5.0",
|
||||
+ "fsl,sec-v4.0";
|
||||
+ fsl,sec-era = <3>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ ranges = <0x0 0x00 0x1700000 0x100000>;
|
||||
+ reg = <0x00 0x1700000 0x0 0x100000>;
|
||||
+ interrupts = <0 75 0x4>;
|
||||
+
|
||||
+ sec_jr0: jr@10000 {
|
||||
+ compatible = "fsl,sec-v5.4-job-ring",
|
||||
+ "fsl,sec-v5.0-job-ring",
|
||||
+ "fsl,sec-v4.0-job-ring";
|
||||
+ reg = <0x10000 0x10000>;
|
||||
+ interrupts = <0 71 0x4>;
|
||||
+ };
|
||||
+
|
||||
+ sec_jr1: jr@20000 {
|
||||
+ compatible = "fsl,sec-v5.4-job-ring",
|
||||
+ "fsl,sec-v5.0-job-ring",
|
||||
+ "fsl,sec-v4.0-job-ring";
|
||||
+ reg = <0x20000 0x10000>;
|
||||
+ interrupts = <0 72 0x4>;
|
||||
+ };
|
||||
+
|
||||
+ sec_jr2: jr@30000 {
|
||||
+ compatible = "fsl,sec-v5.4-job-ring",
|
||||
+ "fsl,sec-v5.0-job-ring",
|
||||
+ "fsl,sec-v4.0-job-ring";
|
||||
+ interrupts = <0 73 0x4>;
|
||||
+ };
|
||||
+
|
||||
+ sec_jr3: jr@40000 {
|
||||
+ compatible = "fsl,sec-v5.4-job-ring",
|
||||
+ "fsl,sec-v5.0-job-ring",
|
||||
+ "fsl,sec-v4.0-job-ring";
|
||||
+ reg = <0x40000 0x10000>;
|
||||
+ interrupts = <0 74 0x4>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
dcfg: dcfg@1ee0000 {
|
||||
compatible = "fsl,ls1043a-dcfg", "syscon";
|
||||
reg = <0x0 0x1ee0000 0x0 0x10000>;
|
||||
};
|
||||
|
||||
+ reset: reset@1EE00B0 {
|
||||
+ compatible = "fsl,ls-reset";
|
||||
+ reg = <0x0 0x1EE00B0 0x0 0x4>;
|
||||
+ big-endian;
|
||||
+ };
|
||||
+
|
||||
+ rcpm: rcpm@1ee2000 {
|
||||
+ compatible = "fsl,ls1043a-rcpm", "fsl,qoriq-rcpm-2.1";
|
||||
+ reg = <0x0 0x1ee2000 0x0 0x10000>;
|
||||
+ };
|
||||
+
|
||||
ifc: ifc@1530000 {
|
||||
compatible = "fsl,ifc", "simple-bus";
|
||||
reg = <0x0 0x1530000 0x0 0x10000>;
|
||||
@@ -501,6 +559,82 @@
|
||||
};
|
||||
};
|
||||
|
||||
+ tmu: tmu@1f00000 {
|
||||
+ compatible = "fsl,qoriq-tmu", "fsl,ls1043a-tmu";
|
||||
+ reg = <0x0 0x1f00000 0x0 0x10000>;
|
||||
+ interrupts = <0 33 0x4>;
|
||||
+ fsl,tmu-range = <0xb0000 0x9002a 0x6004c 0x30062>;
|
||||
+ fsl,tmu-calibration = <0x00000000 0x00000026
|
||||
+ 0x00000001 0x0000002d
|
||||
+ 0x00000002 0x00000032
|
||||
+ 0x00000003 0x00000039
|
||||
+ 0x00000004 0x0000003f
|
||||
+ 0x00000005 0x00000046
|
||||
+ 0x00000006 0x0000004d
|
||||
+ 0x00000007 0x00000054
|
||||
+ 0x00000008 0x0000005a
|
||||
+ 0x00000009 0x00000061
|
||||
+ 0x0000000a 0x0000006a
|
||||
+ 0x0000000b 0x00000071
|
||||
+
|
||||
+ 0x00010000 0x00000025
|
||||
+ 0x00010001 0x0000002c
|
||||
+ 0x00010002 0x00000035
|
||||
+ 0x00010003 0x0000003d
|
||||
+ 0x00010004 0x00000045
|
||||
+ 0x00010005 0x0000004e
|
||||
+ 0x00010006 0x00000057
|
||||
+ 0x00010007 0x00000061
|
||||
+ 0x00010008 0x0000006b
|
||||
+ 0x00010009 0x00000076
|
||||
+
|
||||
+ 0x00020000 0x00000029
|
||||
+ 0x00020001 0x00000033
|
||||
+ 0x00020002 0x0000003d
|
||||
+ 0x00020003 0x00000049
|
||||
+ 0x00020004 0x00000056
|
||||
+ 0x00020005 0x00000061
|
||||
+ 0x00020006 0x0000006d
|
||||
+
|
||||
+ 0x00030000 0x00000021
|
||||
+ 0x00030001 0x0000002a
|
||||
+ 0x00030002 0x0000003c
|
||||
+ 0x00030003 0x0000004e>;
|
||||
+ big-endian;
|
||||
+ #thermal-sensor-cells = <1>;
|
||||
+ };
|
||||
+
|
||||
+ thermal-zones {
|
||||
+ cpu_thermal: cpu-thermal {
|
||||
+ polling-delay-passive = <1000>;
|
||||
+ polling-delay = <5000>;
|
||||
+
|
||||
+ thermal-sensors = <&tmu 3>;
|
||||
+
|
||||
+ trips {
|
||||
+ cpu_alert: cpu-alert {
|
||||
+ temperature = <85000>;
|
||||
+ hysteresis = <2000>;
|
||||
+ type = "passive";
|
||||
+ };
|
||||
+ cpu_crit: cpu-crit {
|
||||
+ temperature = <95000>;
|
||||
+ hysteresis = <2000>;
|
||||
+ type = "critical";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ cooling-maps {
|
||||
+ map0 {
|
||||
+ trip = <&cpu_alert>;
|
||||
+ cooling-device =
|
||||
+ <&cpu0 THERMAL_NO_LIMIT
|
||||
+ THERMAL_NO_LIMIT>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
dspi0: dspi@2100000 {
|
||||
compatible = "fsl,ls1043a-dspi", "fsl,ls1021a-v1.0-dspi";
|
||||
#address-cells = <1>;
|
||||
@@ -527,6 +661,20 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
+ qspi: quadspi@1550000 {
|
||||
+ compatible = "fsl,ls1043a-qspi", "fsl,ls1021a-qspi";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ reg = <0x0 0x1550000 0x0 0x10000>,
|
||||
+ <0x0 0x40000000 0x0 0x4000000>;
|
||||
+ reg-names = "QuadSPI", "QuadSPI-memory";
|
||||
+ interrupts = <0 99 0x4>;
|
||||
+ clock-names = "qspi_en", "qspi";
|
||||
+ clocks = <&clockgen 4 0>, <&clockgen 4 0>;
|
||||
+ big-endian;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
i2c0: i2c@2180000 {
|
||||
compatible = "fsl,vf610-i2c";
|
||||
#address-cells = <1>;
|
||||
@@ -602,8 +750,8 @@
|
||||
clocks = <&clockgen 4 0>;
|
||||
};
|
||||
|
||||
- gpio1: gpio@2300000 {
|
||||
- compatible = "fsl,ls1043a-gpio";
|
||||
+ gpio0: gpio@2300000 {
|
||||
+ compatible = "fsl,qoriq-gpio";
|
||||
reg = <0x0 0x2300000 0x0 0x10000>;
|
||||
interrupts = <0 66 0x4>;
|
||||
gpio-controller;
|
||||
@@ -612,8 +760,8 @@
|
||||
#interrupt-cells = <2>;
|
||||
};
|
||||
|
||||
- gpio2: gpio@2310000 {
|
||||
- compatible = "fsl,ls1043a-gpio";
|
||||
+ gpio1: gpio@2310000 {
|
||||
+ compatible = "fsl,qoriq-gpio";
|
||||
reg = <0x0 0x2310000 0x0 0x10000>;
|
||||
interrupts = <0 67 0x4>;
|
||||
gpio-controller;
|
||||
@@ -622,8 +770,8 @@
|
||||
#interrupt-cells = <2>;
|
||||
};
|
||||
|
||||
- gpio3: gpio@2320000 {
|
||||
- compatible = "fsl,ls1043a-gpio";
|
||||
+ gpio2: gpio@2320000 {
|
||||
+ compatible = "fsl,qoriq-gpio";
|
||||
reg = <0x0 0x2320000 0x0 0x10000>;
|
||||
interrupts = <0 68 0x4>;
|
||||
gpio-controller;
|
||||
@@ -632,8 +780,8 @@
|
||||
#interrupt-cells = <2>;
|
||||
};
|
||||
|
||||
- gpio4: gpio@2330000 {
|
||||
- compatible = "fsl,ls1043a-gpio";
|
||||
+ gpio3: gpio@2330000 {
|
||||
+ compatible = "fsl,qoriq-gpio";
|
||||
reg = <0x0 0x2330000 0x0 0x10000>;
|
||||
interrupts = <0 134 0x4>;
|
||||
gpio-controller;
|
||||
@@ -642,6 +790,70 @@
|
||||
#interrupt-cells = <2>;
|
||||
};
|
||||
|
||||
+ uqe: uqe@2400000 {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ device_type = "qe";
|
||||
+ compatible = "fsl,qe", "simple-bus";
|
||||
+ ranges = <0x0 0x0 0x2400000 0x40000>;
|
||||
+ reg = <0x0 0x2400000 0x0 0x480>;
|
||||
+ brg-frequency = <100000000>;
|
||||
+ bus-frequency = <200000000>;
|
||||
+
|
||||
+ fsl,qe-num-riscs = <1>;
|
||||
+ fsl,qe-num-snums = <28>;
|
||||
+
|
||||
+ qeic: qeic@80 {
|
||||
+ compatible = "fsl,qe-ic";
|
||||
+ reg = <0x80 0x80>;
|
||||
+ #address-cells = <0>;
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <1>;
|
||||
+ interrupts = <0 77 0x04 0 77 0x04>;
|
||||
+ };
|
||||
+
|
||||
+ si1: si@700 {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ compatible = "fsl,qe-si";
|
||||
+ reg = <0x700 0x80>;
|
||||
+ };
|
||||
+
|
||||
+ siram1: siram@1000 {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ compatible = "fsl,qe-siram";
|
||||
+ reg = <0x1000 0x800>;
|
||||
+ };
|
||||
+
|
||||
+ ucc@2000 {
|
||||
+ cell-index = <1>;
|
||||
+ reg = <0x2000 0x200>;
|
||||
+ interrupts = <32>;
|
||||
+ interrupt-parent = <&qeic>;
|
||||
+ };
|
||||
+
|
||||
+ ucc@2200 {
|
||||
+ cell-index = <3>;
|
||||
+ reg = <0x2200 0x200>;
|
||||
+ interrupts = <34>;
|
||||
+ interrupt-parent = <&qeic>;
|
||||
+ };
|
||||
+
|
||||
+ muram@10000 {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ compatible = "fsl,qe-muram", "fsl,cpm-muram";
|
||||
+ ranges = <0x0 0x10000 0x6000>;
|
||||
+
|
||||
+ data-only@0 {
|
||||
+ compatible = "fsl,qe-muram-data",
|
||||
+ "fsl,cpm-muram-data";
|
||||
+ reg = <0x0 0x6000>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
lpuart0: serial@2950000 {
|
||||
compatible = "fsl,ls1021a-lpuart";
|
||||
reg = <0x0 0x2950000 0x0 0x1000>;
|
||||
@@ -696,6 +908,15 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
+ ftm0: ftm0@29d0000 {
|
||||
+ compatible = "fsl,ftm-alarm";
|
||||
+ reg = <0x0 0x29d0000 0x0 0x10000>;
|
||||
+ interrupts = <0 86 0x4>;
|
||||
+ big-endian;
|
||||
+ rcpm-wakeup = <&rcpm 0x0 0x20000000>;
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+
|
||||
wdog0: wdog@2ad0000 {
|
||||
compatible = "fsl,ls1043a-wdt", "fsl,imx21-wdt";
|
||||
reg = <0x0 0x2ad0000 0x0 0x10000>;
|
||||
@@ -726,6 +947,8 @@
|
||||
reg = <0x0 0x2f00000 0x0 0x10000>;
|
||||
interrupts = <0 60 0x4>;
|
||||
dr_mode = "host";
|
||||
+ configure-gfladj;
|
||||
+ snps,dis_rxdet_inp3_quirk;
|
||||
};
|
||||
|
||||
usb1: usb3@3000000 {
|
||||
@@ -733,6 +956,8 @@
|
||||
reg = <0x0 0x3000000 0x0 0x10000>;
|
||||
interrupts = <0 61 0x4>;
|
||||
dr_mode = "host";
|
||||
+ configure-gfladj;
|
||||
+ snps,dis_rxdet_inp3_quirk;
|
||||
};
|
||||
|
||||
usb2: usb3@3100000 {
|
||||
@@ -740,6 +965,8 @@
|
||||
reg = <0x0 0x3100000 0x0 0x10000>;
|
||||
interrupts = <0 63 0x4>;
|
||||
dr_mode = "host";
|
||||
+ configure-gfladj;
|
||||
+ snps,dis_rxdet_inp3_quirk;
|
||||
};
|
||||
|
||||
sata: sata@3200000 {
|
||||
@@ -749,6 +976,20 @@
|
||||
clocks = <&clockgen 4 0>;
|
||||
};
|
||||
|
||||
+ qdma: qdma@8380000 {
|
||||
+ compatible = "fsl,ls1021a-qdma", "fsl,ls1043a-qdma";
|
||||
+ reg = <0x0 0x838f000 0x0 0x11000 /* Controller regs */
|
||||
+ 0x0 0x83a0000 0x0 0x40000>; /* Block regs */
|
||||
+ interrupts = <0 152 0x4>,
|
||||
+ <0 39 0x4>;
|
||||
+ interrupt-names = "qdma-error", "qdma-queue";
|
||||
+ channels = <8>;
|
||||
+ queues = <2>;
|
||||
+ status-sizes = <64>;
|
||||
+ queue-sizes = <64 64>;
|
||||
+ big-endian;
|
||||
+ };
|
||||
+
|
||||
msi1: msi-controller1@1571000 {
|
||||
compatible = "fsl,1s1043a-msi";
|
||||
reg = <0x0 0x1571000 0x0 0x4>,
|
||||
@@ -787,6 +1028,7 @@
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
device_type = "pci";
|
||||
+ dma-coherent;
|
||||
num-lanes = <4>;
|
||||
bus-range = <0x0 0xff>;
|
||||
ranges = <0x81000000 0x0 0x00000000 0x40 0x00010000 0x0 0x00010000 /* downstream I/O */
|
||||
@@ -811,6 +1053,7 @@
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
device_type = "pci";
|
||||
+ dma-coherent;
|
||||
num-lanes = <2>;
|
||||
bus-range = <0x0 0xff>;
|
||||
ranges = <0x81000000 0x0 0x00000000 0x48 0x00010000 0x0 0x00010000 /* downstream I/O */
|
||||
@@ -835,6 +1078,7 @@
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
device_type = "pci";
|
||||
+ dma-coherent;
|
||||
num-lanes = <2>;
|
||||
bus-range = <0x0 0xff>;
|
||||
ranges = <0x81000000 0x0 0x00000000 0x50 0x00010000 0x0 0x00010000 /* downstream I/O */
|
||||
@@ -897,8 +1141,8 @@
|
||||
alignment = <0 0x1000000>;
|
||||
};
|
||||
qman_fqd: qman-fqd {
|
||||
- size = <0 0x400000>;
|
||||
- alignment = <0 0x400000>;
|
||||
+ size = <0 0x800000>;
|
||||
+ alignment = <0 0x800000>;
|
||||
};
|
||||
qman_pfdr: qman-pfdr {
|
||||
size = <0 0x2000000>;
|
||||
--- a/arch/arm64/boot/dts/freescale/qoriq-qman1-portals.dtsi
|
||||
+++ b/arch/arm64/boot/dts/freescale/qoriq-qman1-portals.dtsi
|
||||
@@ -132,5 +132,11 @@
|
||||
compatible = "fsl,cgrid-range";
|
||||
fsl,cgrid-range = <0 256>;
|
||||
};
|
||||
-
|
||||
-};
|
||||
\ No newline at end of file
|
||||
+ qman-ceetm@0 {
|
||||
+ compatible = "fsl,qman-ceetm";
|
||||
+ fsl,ceetm-lfqid-range = <0xf00000 0x1000>;
|
||||
+ fsl,ceetm-sp-range = <0 12>;
|
||||
+ fsl,ceetm-lni-range = <0 8>;
|
||||
+ fsl,ceetm-channel-range = <0 32>;
|
||||
+ };
|
||||
+};
|
|
@ -0,0 +1,51 @@
|
|||
From f7e48669bb75f3b52e9f3ce1a5d885c49b7c4712 Mon Sep 17 00:00:00 2001
|
||||
From: Cristian Sovaiala <cristian.sovaiala@freescale.com>
|
||||
Date: Thu, 4 Jun 2015 18:27:20 +0300
|
||||
Subject: [PATCH 32/70] arm64: Add pdev_archdata for dmamask
|
||||
|
||||
The dma_mask for a device structure is a pointer. This pointer
|
||||
needs to be set up before the dma mask can actually be set. Most
|
||||
frameworks in the kernel take care of setting this up properly but
|
||||
platform devices that don't follow a regular bus structure may not
|
||||
ever have this set. As a result, checks such as dma_capable will
|
||||
always return false on a raw platform device and dma_set_mask will
|
||||
always return -EIO. Fix this by adding a dma_mask in the
|
||||
platform_device archdata and setting it to be the dma_mask. Devices
|
||||
used in other frameworks can change this as needed.
|
||||
|
||||
Signed-off-by: Laura Abbott <lauraa@codeaurora.org>
|
||||
---
|
||||
arch/arm64/include/asm/device.h | 1 +
|
||||
arch/arm64/kernel/setup.c | 7 +++++++
|
||||
2 files changed, 8 insertions(+)
|
||||
|
||||
--- a/arch/arm64/include/asm/device.h
|
||||
+++ b/arch/arm64/include/asm/device.h
|
||||
@@ -25,6 +25,7 @@ struct dev_archdata {
|
||||
};
|
||||
|
||||
struct pdev_archdata {
|
||||
+ u64 dma_mask;
|
||||
};
|
||||
|
||||
#endif
|
||||
--- a/arch/arm64/kernel/setup.c
|
||||
+++ b/arch/arm64/kernel/setup.c
|
||||
@@ -44,6 +44,7 @@
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/efi.h>
|
||||
#include <linux/psci.h>
|
||||
+#include <linux/dma-mapping.h>
|
||||
|
||||
#include <asm/acpi.h>
|
||||
#include <asm/fixmap.h>
|
||||
@@ -381,3 +382,9 @@ static int __init topology_init(void)
|
||||
return 0;
|
||||
}
|
||||
subsys_initcall(topology_init);
|
||||
+
|
||||
+void arch_setup_pdev_archdata(struct platform_device *pdev)
|
||||
+{
|
||||
+ pdev->archdata.dma_mask = DMA_BIT_MASK(32);
|
||||
+ pdev->dev.dma_mask = &pdev->archdata.dma_mask;
|
||||
+}
|
|
@ -0,0 +1,42 @@
|
|||
From 6ef5cf7b8f6b86fb3856f3449f1ad431118e5c9d Mon Sep 17 00:00:00 2001
|
||||
From: Haiying Wang <Haiying.Wang@freescale.com>
|
||||
Date: Wed, 22 Apr 2015 13:07:25 -0400
|
||||
Subject: [PATCH 33/70] arm64: add ioremap for normal cacheable non-shareable
|
||||
memory
|
||||
|
||||
[context adjustment]
|
||||
|
||||
Signed-off-by: Haiying Wang <Haiying.Wang@freescale.com>
|
||||
Change-Id: Iab7413f182a64bd6ad4707dd1d6254d04f51a3b1
|
||||
Reviewed-on: http://git.am.freescale.net:8181/35486
|
||||
Tested-by: Review Code-CDREVIEW <CDREVIEW@freescale.com>
|
||||
Reviewed-by: Roy Pledge <roy.pledge@freescale.com>
|
||||
Reviewed-by: Stuart Yoder <stuart.yoder@freescale.com>
|
||||
Integrated-by: Jiang Yutang <yutang.jiang@nxp.com>
|
||||
---
|
||||
arch/arm64/include/asm/io.h | 2 ++
|
||||
arch/arm64/include/asm/pgtable.h | 2 ++
|
||||
2 files changed, 4 insertions(+)
|
||||
|
||||
--- a/arch/arm64/include/asm/io.h
|
||||
+++ b/arch/arm64/include/asm/io.h
|
||||
@@ -171,6 +171,8 @@ extern void __iomem *ioremap_cache(phys_
|
||||
#define ioremap_nocache(addr, size) __ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))
|
||||
#define ioremap_wc(addr, size) __ioremap((addr), (size), __pgprot(PROT_NORMAL_NC))
|
||||
#define ioremap_wt(addr, size) __ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))
|
||||
+#define ioremap_cache_ns(addr, size) __ioremap((addr), (size), \
|
||||
+ __pgprot(PROT_NORMAL_NS))
|
||||
#define iounmap __iounmap
|
||||
|
||||
/*
|
||||
--- a/arch/arm64/include/asm/pgtable.h
|
||||
+++ b/arch/arm64/include/asm/pgtable.h
|
||||
@@ -74,6 +74,8 @@ extern void __pgd_error(const char *file
|
||||
#define PROT_NORMAL_NC (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_WRITE | PTE_ATTRINDX(MT_NORMAL_NC))
|
||||
#define PROT_NORMAL_WT (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_WRITE | PTE_ATTRINDX(MT_NORMAL_WT))
|
||||
#define PROT_NORMAL (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_WRITE | PTE_ATTRINDX(MT_NORMAL))
|
||||
+#define PROT_NORMAL_NS (PTE_TYPE_PAGE | PTE_AF | PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_WRITE | \
|
||||
+ PTE_ATTRINDX(MT_NORMAL))
|
||||
|
||||
#define PROT_SECT_DEVICE_nGnRE (PROT_SECT_DEFAULT | PMD_SECT_PXN | PMD_SECT_UXN | PMD_ATTRINDX(MT_DEVICE_nGnRE))
|
||||
#define PROT_SECT_NORMAL (PROT_SECT_DEFAULT | PMD_SECT_PXN | PMD_SECT_UXN | PMD_ATTRINDX(MT_NORMAL))
|
|
@ -0,0 +1,28 @@
|
|||
From 52bffb91d40a3090ecf9138fadca97f77c99afa4 Mon Sep 17 00:00:00 2001
|
||||
From: Haiying Wang <Haiying.Wang@freescale.com>
|
||||
Date: Wed, 22 Apr 2015 13:09:47 -0400
|
||||
Subject: [PATCH 34/70] arm64: add support to remap kernel cacheable memory to
|
||||
userspace
|
||||
|
||||
Signed-off-by: Haiying Wang <Haiying.Wang@freescale.com>
|
||||
Change-Id: I50ee4798a2929932fa9ff7c9cdb42cd1a215f77a
|
||||
Reviewed-on: http://git.am.freescale.net:8181/35488
|
||||
Tested-by: Review Code-CDREVIEW <CDREVIEW@freescale.com>
|
||||
Reviewed-by: Roy Pledge <roy.pledge@freescale.com>
|
||||
Reviewed-by: Stuart Yoder <stuart.yoder@freescale.com>
|
||||
---
|
||||
arch/arm64/include/asm/pgtable.h | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- a/arch/arm64/include/asm/pgtable.h
|
||||
+++ b/arch/arm64/include/asm/pgtable.h
|
||||
@@ -389,6 +389,9 @@ static inline int has_transparent_hugepa
|
||||
__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_nGnRnE) | PTE_PXN | PTE_UXN)
|
||||
#define pgprot_writecombine(prot) \
|
||||
__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC) | PTE_PXN | PTE_UXN)
|
||||
+#define pgprot_cached(prot) \
|
||||
+ __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL) | \
|
||||
+ PTE_PXN | PTE_UXN)
|
||||
#define pgprot_device(prot) \
|
||||
__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_nGnRE) | PTE_PXN | PTE_UXN)
|
||||
#define __HAVE_PHYS_MEM_ACCESS_PROT
|
|
@ -0,0 +1,22 @@
|
|||
From 1d6d5b6d2363cf5a0d175f086209fb208692ec00 Mon Sep 17 00:00:00 2001
|
||||
From: Haiying Wang <Haiying.wang@freescale.com>
|
||||
Date: Sat, 8 Aug 2015 07:25:02 -0400
|
||||
Subject: [PATCH 35/70] arm64/pgtable: add support to map cacheable and non
|
||||
shareable memory
|
||||
|
||||
Signed-off-by: Haiying Wang <Haiying.wang@freescale.com>
|
||||
---
|
||||
arch/arm64/include/asm/pgtable.h | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/arch/arm64/include/asm/pgtable.h
|
||||
+++ b/arch/arm64/include/asm/pgtable.h
|
||||
@@ -392,6 +392,8 @@ static inline int has_transparent_hugepa
|
||||
#define pgprot_cached(prot) \
|
||||
__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL) | \
|
||||
PTE_PXN | PTE_UXN)
|
||||
+#define pgprot_cached_ns(prot) \
|
||||
+ __pgprot(pgprot_val(pgprot_cached(prot)) ^ PTE_SHARED)
|
||||
#define pgprot_device(prot) \
|
||||
__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_nGnRE) | PTE_PXN | PTE_UXN)
|
||||
#define __HAVE_PHYS_MEM_ACCESS_PROT
|
|
@ -0,0 +1,79 @@
|
|||
From 03eea243622d85d59653ee076ce43ac0653dc51d Mon Sep 17 00:00:00 2001
|
||||
From: Zhao Qiang <B45475@freescale.com>
|
||||
Date: Fri, 10 Oct 2014 10:38:48 +0800
|
||||
Subject: [PATCH 39/70] arch: arm: add ARM specific fucntions required for
|
||||
ehci fsl driver
|
||||
|
||||
Add below functions for ARM platform which are used by ehci fsl driver:
|
||||
1. spin_event_timeout function
|
||||
2. set/clear bits functions
|
||||
|
||||
Signed-off-by: Zhao Qiang <B45475@freescale.com>
|
||||
Signed-off-by: Rajesh Bhagat <rajesh.bhagat@nxp.com>
|
||||
---
|
||||
arch/arm/include/asm/delay.h | 16 ++++++++++++++++
|
||||
arch/arm/include/asm/io.h | 28 ++++++++++++++++++++++++++++
|
||||
2 files changed, 44 insertions(+)
|
||||
|
||||
--- a/arch/arm/include/asm/delay.h
|
||||
+++ b/arch/arm/include/asm/delay.h
|
||||
@@ -57,6 +57,22 @@ extern void __bad_udelay(void);
|
||||
__const_udelay((n) * UDELAY_MULT)) : \
|
||||
__udelay(n))
|
||||
|
||||
+#define spin_event_timeout(condition, timeout, delay) \
|
||||
+({ \
|
||||
+ typeof(condition) __ret; \
|
||||
+ int i = 0; \
|
||||
+ while (!(__ret = (condition)) && (i++ < timeout)) { \
|
||||
+ if (delay) \
|
||||
+ udelay(delay); \
|
||||
+ else \
|
||||
+ cpu_relax(); \
|
||||
+ udelay(1); \
|
||||
+ } \
|
||||
+ if (!__ret) \
|
||||
+ __ret = (condition); \
|
||||
+ __ret; \
|
||||
+})
|
||||
+
|
||||
/* Loop-based definitions for assembly code. */
|
||||
extern void __loop_delay(unsigned long loops);
|
||||
extern void __loop_udelay(unsigned long usecs);
|
||||
--- a/arch/arm/include/asm/io.h
|
||||
+++ b/arch/arm/include/asm/io.h
|
||||
@@ -221,6 +221,34 @@ extern int pci_ioremap_io(unsigned int o
|
||||
#endif
|
||||
#endif
|
||||
|
||||
+/* access ports */
|
||||
+#define setbits32(_addr, _v) iowrite32be(ioread32be(_addr) | (_v), (_addr))
|
||||
+#define clrbits32(_addr, _v) iowrite32be(ioread32be(_addr) & ~(_v), (_addr))
|
||||
+
|
||||
+#define setbits16(_addr, _v) iowrite16be(ioread16be(_addr) | (_v), (_addr))
|
||||
+#define clrbits16(_addr, _v) iowrite16be(ioread16be(_addr) & ~(_v), (_addr))
|
||||
+
|
||||
+#define setbits8(_addr, _v) iowrite8(ioread8(_addr) | (_v), (_addr))
|
||||
+#define clrbits8(_addr, _v) iowrite8(ioread8(_addr) & ~(_v), (_addr))
|
||||
+
|
||||
+/* Clear and set bits in one shot. These macros can be used to clear and
|
||||
+ * set multiple bits in a register using a single read-modify-write. These
|
||||
+ * macros can also be used to set a multiple-bit bit pattern using a mask,
|
||||
+ * by specifying the mask in the 'clear' parameter and the new bit pattern
|
||||
+ * in the 'set' parameter.
|
||||
+ */
|
||||
+
|
||||
+#define clrsetbits_be32(addr, clear, set) \
|
||||
+ iowrite32be((ioread32be(addr) & ~(clear)) | (set), (addr))
|
||||
+#define clrsetbits_le32(addr, clear, set) \
|
||||
+ iowrite32le((ioread32le(addr) & ~(clear)) | (set), (addr))
|
||||
+#define clrsetbits_be16(addr, clear, set) \
|
||||
+ iowrite16be((ioread16be(addr) & ~(clear)) | (set), (addr))
|
||||
+#define clrsetbits_le16(addr, clear, set) \
|
||||
+ iowrite16le((ioread16le(addr) & ~(clear)) | (set), (addr))
|
||||
+#define clrsetbits_8(addr, clear, set) \
|
||||
+ iowrite8((ioread8(addr) & ~(clear)) | (set), (addr))
|
||||
+
|
||||
/*
|
||||
* IO port access primitives
|
||||
* -------------------------
|
|
@ -0,0 +1,27 @@
|
|||
From 9417a4b5978a7c38ae1dee217c3b22cda8e94731 Mon Sep 17 00:00:00 2001
|
||||
From: Mingkai Hu <Mingkai.Hu@freescale.com>
|
||||
Date: Thu, 19 Nov 2015 15:25:37 +0800
|
||||
Subject: [PATCH 63/70] arm64: add NO_IRQ macro
|
||||
|
||||
Signed-off-by: Mingkai Hu <Mingkai.Hu@freescale.com>
|
||||
---
|
||||
arch/arm64/include/asm/irq.h | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
--- a/arch/arm64/include/asm/irq.h
|
||||
+++ b/arch/arm64/include/asm/irq.h
|
||||
@@ -3,6 +3,14 @@
|
||||
|
||||
#include <asm-generic/irq.h>
|
||||
|
||||
+/*
|
||||
+ * Use this value to indicate lack of interrupt
|
||||
+ * capability
|
||||
+ */
|
||||
+#ifndef NO_IRQ
|
||||
+#define NO_IRQ ((unsigned int)(-1))
|
||||
+#endif
|
||||
+
|
||||
struct pt_regs;
|
||||
|
||||
extern void set_handle_irq(void (*handle_irq)(struct pt_regs *));
|
|
@ -0,0 +1,24 @@
|
|||
From ae1f7ae8bbacbdbf9df3977449f97d1432ff1957 Mon Sep 17 00:00:00 2001
|
||||
From: Raghav Dogra <raghav@freescale.com>
|
||||
Date: Wed, 16 Dec 2015 16:11:31 +0530
|
||||
Subject: [PATCH 43/70] driver/memory: Removal of deprecated NO_IRQ
|
||||
|
||||
Replacing the NO_IRQ macro with 0. If there is no interrupt,
|
||||
returned value will be 0 regardless of what NO_IRQ is defined.
|
||||
|
||||
Signed-off-by: Raghav Dogra <raghav@freescale.com>
|
||||
---
|
||||
drivers/memory/fsl_ifc.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/memory/fsl_ifc.c
|
||||
+++ b/drivers/memory/fsl_ifc.c
|
||||
@@ -260,7 +260,7 @@ static int fsl_ifc_ctrl_probe(struct pla
|
||||
|
||||
/* get the Controller level irq */
|
||||
fsl_ifc_ctrl_dev->irq = irq_of_parse_and_map(dev->dev.of_node, 0);
|
||||
- if (fsl_ifc_ctrl_dev->irq == NO_IRQ) {
|
||||
+ if (fsl_ifc_ctrl_dev->irq == 0) {
|
||||
dev_err(&dev->dev, "failed to get irq resource "
|
||||
"for IFC\n");
|
||||
ret = -ENODEV;
|
|
@ -0,0 +1,233 @@
|
|||
From bb35d670afd2f3501de36c158e9842817ce013b8 Mon Sep 17 00:00:00 2001
|
||||
From: Raghav Dogra <raghav@freescale.com>
|
||||
Date: Fri, 15 Jan 2016 17:10:09 +0530
|
||||
Subject: [PATCH 44/70] drivers/memory: Add deep sleep support for IFC
|
||||
|
||||
Add support of suspend, resume function to support deep sleep.
|
||||
Also make sure of SRAM initialization during resume.
|
||||
|
||||
Signed-off-by: Raghav Dogra <raghav@freescale.com>
|
||||
---
|
||||
drivers/memory/fsl_ifc.c | 163 ++++++++++++++++++++++++++++++++++++++++++++++
|
||||
include/linux/fsl_ifc.h | 6 ++
|
||||
2 files changed, 169 insertions(+)
|
||||
|
||||
--- a/drivers/memory/fsl_ifc.c
|
||||
+++ b/drivers/memory/fsl_ifc.c
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/spinlock.h>
|
||||
+#include <linux/delay.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/io.h>
|
||||
@@ -35,6 +36,8 @@
|
||||
|
||||
struct fsl_ifc_ctrl *fsl_ifc_ctrl_dev;
|
||||
EXPORT_SYMBOL(fsl_ifc_ctrl_dev);
|
||||
+#define FSL_IFC_V1_3_0 0x01030000
|
||||
+#define IFC_TIMEOUT_MSECS 100000 /* 100ms */
|
||||
|
||||
/*
|
||||
* convert_ifc_address - convert the base address
|
||||
@@ -309,6 +312,161 @@ err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
+#ifdef CONFIG_PM_SLEEP
|
||||
+/* save ifc registers */
|
||||
+static int fsl_ifc_suspend(struct device *dev)
|
||||
+{
|
||||
+ struct fsl_ifc_ctrl *ctrl = dev_get_drvdata(dev);
|
||||
+ struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
|
||||
+ __be32 nand_evter_intr_en, cm_evter_intr_en, nor_evter_intr_en,
|
||||
+ gpcm_evter_intr_en;
|
||||
+
|
||||
+ ctrl->saved_regs = kzalloc(sizeof(struct fsl_ifc_regs), GFP_KERNEL);
|
||||
+ if (!ctrl->saved_regs)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ cm_evter_intr_en = ifc_in32(&ifc->cm_evter_intr_en);
|
||||
+ nand_evter_intr_en = ifc_in32(&ifc->ifc_nand.nand_evter_intr_en);
|
||||
+ nor_evter_intr_en = ifc_in32(&ifc->ifc_nor.nor_evter_intr_en);
|
||||
+ gpcm_evter_intr_en = ifc_in32(&ifc->ifc_gpcm.gpcm_evter_intr_en);
|
||||
+
|
||||
+/* IFC interrupts disabled */
|
||||
+
|
||||
+ ifc_out32(0x0, &ifc->cm_evter_intr_en);
|
||||
+ ifc_out32(0x0, &ifc->ifc_nand.nand_evter_intr_en);
|
||||
+ ifc_out32(0x0, &ifc->ifc_nor.nor_evter_intr_en);
|
||||
+ ifc_out32(0x0, &ifc->ifc_gpcm.gpcm_evter_intr_en);
|
||||
+
|
||||
+ memcpy_fromio(ctrl->saved_regs, ifc, sizeof(struct fsl_ifc_regs));
|
||||
+
|
||||
+/* save the interrupt values */
|
||||
+ ctrl->saved_regs->cm_evter_intr_en = cm_evter_intr_en;
|
||||
+ ctrl->saved_regs->ifc_nand.nand_evter_intr_en = nand_evter_intr_en;
|
||||
+ ctrl->saved_regs->ifc_nor.nor_evter_intr_en = nor_evter_intr_en;
|
||||
+ ctrl->saved_regs->ifc_gpcm.gpcm_evter_intr_en = gpcm_evter_intr_en;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/* restore ifc registers */
|
||||
+static int fsl_ifc_resume(struct device *dev)
|
||||
+{
|
||||
+ struct fsl_ifc_ctrl *ctrl = dev_get_drvdata(dev);
|
||||
+ struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
|
||||
+ struct fsl_ifc_regs *savd_regs = ctrl->saved_regs;
|
||||
+ uint32_t ver = 0, ncfgr, status, ifc_bank, i;
|
||||
+
|
||||
+/*
|
||||
+ * IFC interrupts disabled
|
||||
+ */
|
||||
+ ifc_out32(0x0, &ifc->cm_evter_intr_en);
|
||||
+ ifc_out32(0x0, &ifc->ifc_nand.nand_evter_intr_en);
|
||||
+ ifc_out32(0x0, &ifc->ifc_nor.nor_evter_intr_en);
|
||||
+ ifc_out32(0x0, &ifc->ifc_gpcm.gpcm_evter_intr_en);
|
||||
+
|
||||
+
|
||||
+ if (ctrl->saved_regs) {
|
||||
+ for (ifc_bank = 0; ifc_bank < FSL_IFC_BANK_COUNT; ifc_bank++) {
|
||||
+ ifc_out32(savd_regs->cspr_cs[ifc_bank].cspr_ext,
|
||||
+ &ifc->cspr_cs[ifc_bank].cspr_ext);
|
||||
+ ifc_out32(savd_regs->cspr_cs[ifc_bank].cspr,
|
||||
+ &ifc->cspr_cs[ifc_bank].cspr);
|
||||
+ ifc_out32(savd_regs->amask_cs[ifc_bank].amask,
|
||||
+ &ifc->amask_cs[ifc_bank].amask);
|
||||
+ ifc_out32(savd_regs->csor_cs[ifc_bank].csor_ext,
|
||||
+ &ifc->csor_cs[ifc_bank].csor_ext);
|
||||
+ ifc_out32(savd_regs->csor_cs[ifc_bank].csor,
|
||||
+ &ifc->csor_cs[ifc_bank].csor);
|
||||
+ for (i = 0; i < 4; i++) {
|
||||
+ ifc_out32(savd_regs->ftim_cs[ifc_bank].ftim[i],
|
||||
+ &ifc->ftim_cs[ifc_bank].ftim[i]);
|
||||
+ }
|
||||
+ }
|
||||
+ ifc_out32(savd_regs->ifc_gcr, &ifc->ifc_gcr);
|
||||
+ ifc_out32(savd_regs->cm_evter_en, &ifc->cm_evter_en);
|
||||
+
|
||||
+/*
|
||||
+* IFC controller NAND machine registers
|
||||
+*/
|
||||
+ ifc_out32(savd_regs->ifc_nand.ncfgr, &ifc->ifc_nand.ncfgr);
|
||||
+ ifc_out32(savd_regs->ifc_nand.nand_fcr0,
|
||||
+ &ifc->ifc_nand.nand_fcr0);
|
||||
+ ifc_out32(savd_regs->ifc_nand.nand_fcr1,
|
||||
+ &ifc->ifc_nand.nand_fcr1);
|
||||
+ ifc_out32(savd_regs->ifc_nand.row0, &ifc->ifc_nand.row0);
|
||||
+ ifc_out32(savd_regs->ifc_nand.row1, &ifc->ifc_nand.row1);
|
||||
+ ifc_out32(savd_regs->ifc_nand.col0, &ifc->ifc_nand.col0);
|
||||
+ ifc_out32(savd_regs->ifc_nand.col1, &ifc->ifc_nand.col1);
|
||||
+ ifc_out32(savd_regs->ifc_nand.row2, &ifc->ifc_nand.row2);
|
||||
+ ifc_out32(savd_regs->ifc_nand.col2, &ifc->ifc_nand.col2);
|
||||
+ ifc_out32(savd_regs->ifc_nand.row3, &ifc->ifc_nand.row3);
|
||||
+ ifc_out32(savd_regs->ifc_nand.col3, &ifc->ifc_nand.col3);
|
||||
+ ifc_out32(savd_regs->ifc_nand.nand_fbcr,
|
||||
+ &ifc->ifc_nand.nand_fbcr);
|
||||
+ ifc_out32(savd_regs->ifc_nand.nand_fir0,
|
||||
+ &ifc->ifc_nand.nand_fir0);
|
||||
+ ifc_out32(savd_regs->ifc_nand.nand_fir1,
|
||||
+ &ifc->ifc_nand.nand_fir1);
|
||||
+ ifc_out32(savd_regs->ifc_nand.nand_fir2,
|
||||
+ &ifc->ifc_nand.nand_fir2);
|
||||
+ ifc_out32(savd_regs->ifc_nand.nand_csel,
|
||||
+ &ifc->ifc_nand.nand_csel);
|
||||
+ ifc_out32(savd_regs->ifc_nand.nandseq_strt,
|
||||
+ &ifc->ifc_nand.nandseq_strt);
|
||||
+ ifc_out32(savd_regs->ifc_nand.nand_evter_en,
|
||||
+ &ifc->ifc_nand.nand_evter_en);
|
||||
+ ifc_out32(savd_regs->ifc_nand.nanndcr, &ifc->ifc_nand.nanndcr);
|
||||
+
|
||||
+/*
|
||||
+* IFC controller NOR machine registers
|
||||
+*/
|
||||
+ ifc_out32(savd_regs->ifc_nor.nor_evter_en,
|
||||
+ &ifc->ifc_nor.nor_evter_en);
|
||||
+ ifc_out32(savd_regs->ifc_nor.norcr, &ifc->ifc_nor.norcr);
|
||||
+
|
||||
+/*
|
||||
+ * IFC controller GPCM Machine registers
|
||||
+ */
|
||||
+ ifc_out32(savd_regs->ifc_gpcm.gpcm_evter_en,
|
||||
+ &ifc->ifc_gpcm.gpcm_evter_en);
|
||||
+
|
||||
+
|
||||
+
|
||||
+/*
|
||||
+ * IFC interrupts enabled
|
||||
+ */
|
||||
+ ifc_out32(ctrl->saved_regs->cm_evter_intr_en, &ifc->cm_evter_intr_en);
|
||||
+ ifc_out32(ctrl->saved_regs->ifc_nand.nand_evter_intr_en,
|
||||
+ &ifc->ifc_nand.nand_evter_intr_en);
|
||||
+ ifc_out32(ctrl->saved_regs->ifc_nor.nor_evter_intr_en,
|
||||
+ &ifc->ifc_nor.nor_evter_intr_en);
|
||||
+ ifc_out32(ctrl->saved_regs->ifc_gpcm.gpcm_evter_intr_en,
|
||||
+ &ifc->ifc_gpcm.gpcm_evter_intr_en);
|
||||
+
|
||||
+ kfree(ctrl->saved_regs);
|
||||
+ ctrl->saved_regs = NULL;
|
||||
+ }
|
||||
+
|
||||
+ ver = ifc_in32(&ctrl->regs->ifc_rev);
|
||||
+ ncfgr = ifc_in32(&ifc->ifc_nand.ncfgr);
|
||||
+ if (ver >= FSL_IFC_V1_3_0) {
|
||||
+
|
||||
+ ifc_out32(ncfgr | IFC_NAND_SRAM_INIT_EN,
|
||||
+ &ifc->ifc_nand.ncfgr);
|
||||
+ /* wait for SRAM_INIT bit to be clear or timeout */
|
||||
+ status = spin_event_timeout(
|
||||
+ !(ifc_in32(&ifc->ifc_nand.ncfgr)
|
||||
+ & IFC_NAND_SRAM_INIT_EN),
|
||||
+ IFC_TIMEOUT_MSECS, 0);
|
||||
+
|
||||
+ if (!status)
|
||||
+ dev_err(ctrl->dev, "Timeout waiting for IFC SRAM INIT");
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+#endif /* CONFIG_PM_SLEEP */
|
||||
+
|
||||
static const struct of_device_id fsl_ifc_match[] = {
|
||||
{
|
||||
.compatible = "fsl,ifc",
|
||||
@@ -316,10 +474,15 @@ static const struct of_device_id fsl_ifc
|
||||
{},
|
||||
};
|
||||
|
||||
+static const struct dev_pm_ops ifc_pm_ops = {
|
||||
+ SET_SYSTEM_SLEEP_PM_OPS(fsl_ifc_suspend, fsl_ifc_resume)
|
||||
+};
|
||||
+
|
||||
static struct platform_driver fsl_ifc_ctrl_driver = {
|
||||
.driver = {
|
||||
.name = "fsl-ifc",
|
||||
.of_match_table = fsl_ifc_match,
|
||||
+ .pm = &ifc_pm_ops,
|
||||
},
|
||||
.probe = fsl_ifc_ctrl_probe,
|
||||
.remove = fsl_ifc_ctrl_remove,
|
||||
--- a/include/linux/fsl_ifc.h
|
||||
+++ b/include/linux/fsl_ifc.h
|
||||
@@ -270,6 +270,8 @@
|
||||
*/
|
||||
/* Auto Boot Mode */
|
||||
#define IFC_NAND_NCFGR_BOOT 0x80000000
|
||||
+/* SRAM INIT EN */
|
||||
+#define IFC_NAND_SRAM_INIT_EN 0x20000000
|
||||
/* Addressing Mode-ROW0+n/COL0 */
|
||||
#define IFC_NAND_NCFGR_ADDR_MODE_RC0 0x00000000
|
||||
/* Addressing Mode-ROW0+n/COL0+n */
|
||||
@@ -842,6 +844,10 @@ struct fsl_ifc_ctrl {
|
||||
u32 nand_stat;
|
||||
wait_queue_head_t nand_wait;
|
||||
bool little_endian;
|
||||
+#ifdef CONFIG_PM_SLEEP
|
||||
+ /*save regs when system goes to deep sleep*/
|
||||
+ struct fsl_ifc_regs *saved_regs;
|
||||
+#endif
|
||||
};
|
||||
|
||||
extern struct fsl_ifc_ctrl *fsl_ifc_ctrl_dev;
|
|
@ -0,0 +1,51 @@
|
|||
From bf489e54ef3de7de2d9caf896141fd08490a89c9 Mon Sep 17 00:00:00 2001
|
||||
From: Raghav Dogra <raghav@freescale.com>
|
||||
Date: Wed, 16 Dec 2015 16:11:50 +0530
|
||||
Subject: [PATCH 45/70] driver/memory: Update dependency of IFC for Layerscape
|
||||
|
||||
IFC NAND is not working on ARM layescape platform due to
|
||||
undefined macro FSL_SOC.
|
||||
This patch fixes the dependency to enable NAND.
|
||||
|
||||
Signed-off-by: Raghav Dogra <raghav@freescale.com>
|
||||
---
|
||||
drivers/memory/Kconfig | 2 +-
|
||||
drivers/memory/fsl_ifc.c | 4 +++-
|
||||
drivers/mtd/nand/Kconfig | 2 +-
|
||||
3 files changed, 5 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/memory/Kconfig
|
||||
+++ b/drivers/memory/Kconfig
|
||||
@@ -103,7 +103,7 @@ config FSL_CORENET_CF
|
||||
|
||||
config FSL_IFC
|
||||
bool
|
||||
- depends on FSL_SOC
|
||||
+ depends on FSL_SOC || ARCH_LAYERSCAPE
|
||||
|
||||
config JZ4780_NEMC
|
||||
bool "Ingenic JZ4780 SoC NEMC driver"
|
||||
--- a/drivers/memory/fsl_ifc.c
|
||||
+++ b/drivers/memory/fsl_ifc.c
|
||||
@@ -32,7 +32,9 @@
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/fsl_ifc.h>
|
||||
-#include <asm/prom.h>
|
||||
+#include <linux/irqdomain.h>
|
||||
+#include <linux/of_address.h>
|
||||
+#include <linux/of_irq.h>
|
||||
|
||||
struct fsl_ifc_ctrl *fsl_ifc_ctrl_dev;
|
||||
EXPORT_SYMBOL(fsl_ifc_ctrl_dev);
|
||||
--- a/drivers/mtd/nand/Kconfig
|
||||
+++ b/drivers/mtd/nand/Kconfig
|
||||
@@ -436,7 +436,7 @@ config MTD_NAND_FSL_ELBC
|
||||
|
||||
config MTD_NAND_FSL_IFC
|
||||
tristate "NAND support for Freescale IFC controller"
|
||||
- depends on MTD_NAND && FSL_SOC
|
||||
+ depends on MTD_NAND && (FSL_SOC || ARCH_LAYERSCAPE)
|
||||
select FSL_IFC
|
||||
select MEMORY
|
||||
help
|
|
@ -0,0 +1,705 @@
|
|||
From 1c62b9982b7f6cb560d1237d2658945c070c91d4 Mon Sep 17 00:00:00 2001
|
||||
From: Raghav Dogra <raghav@freescale.com>
|
||||
Date: Wed, 20 Jan 2016 13:06:32 +0530
|
||||
Subject: [PATCH 46/70] mtd/ifc: Segregate IFC fcm and runtime registers
|
||||
|
||||
IFC has two set of registers viz FCM (Flash control machine)
|
||||
aka global and run time registers. These set are defined in two
|
||||
memory map PAGES. Upto IFC 1.4 PAGE size is 4 KB and from IFC2.0
|
||||
PAGE size is 64KB
|
||||
|
||||
Signed-off-by: Jaiprakash Singh <b44839@freescale.com>
|
||||
Signed-off-by: Raghav Dogra <raghav@freescale.com>
|
||||
---
|
||||
drivers/memory/fsl_ifc.c | 251 ++++++++++++++++++++-------------------
|
||||
drivers/mtd/nand/fsl_ifc_nand.c | 72 ++++++-----
|
||||
include/linux/fsl_ifc.h | 48 +++++---
|
||||
3 files changed, 203 insertions(+), 168 deletions(-)
|
||||
|
||||
--- a/drivers/memory/fsl_ifc.c
|
||||
+++ b/drivers/memory/fsl_ifc.c
|
||||
@@ -64,11 +64,11 @@ int fsl_ifc_find(phys_addr_t addr_base)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
- if (!fsl_ifc_ctrl_dev || !fsl_ifc_ctrl_dev->regs)
|
||||
+ if (!fsl_ifc_ctrl_dev || !fsl_ifc_ctrl_dev->gregs)
|
||||
return -ENODEV;
|
||||
|
||||
for (i = 0; i < fsl_ifc_ctrl_dev->banks; i++) {
|
||||
- u32 cspr = ifc_in32(&fsl_ifc_ctrl_dev->regs->cspr_cs[i].cspr);
|
||||
+ u32 cspr = ifc_in32(&fsl_ifc_ctrl_dev->gregs->cspr_cs[i].cspr);
|
||||
if (cspr & CSPR_V && (cspr & CSPR_BA) ==
|
||||
convert_ifc_address(addr_base))
|
||||
return i;
|
||||
@@ -80,7 +80,7 @@ EXPORT_SYMBOL(fsl_ifc_find);
|
||||
|
||||
static int fsl_ifc_ctrl_init(struct fsl_ifc_ctrl *ctrl)
|
||||
{
|
||||
- struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
|
||||
+ struct fsl_ifc_fcm __iomem *ifc = ctrl->gregs;
|
||||
|
||||
/*
|
||||
* Clear all the common status and event registers
|
||||
@@ -109,7 +109,7 @@ static int fsl_ifc_ctrl_remove(struct pl
|
||||
irq_dispose_mapping(ctrl->nand_irq);
|
||||
irq_dispose_mapping(ctrl->irq);
|
||||
|
||||
- iounmap(ctrl->regs);
|
||||
+ iounmap(ctrl->gregs);
|
||||
|
||||
dev_set_drvdata(&dev->dev, NULL);
|
||||
kfree(ctrl);
|
||||
@@ -127,7 +127,7 @@ static DEFINE_SPINLOCK(nand_irq_lock);
|
||||
|
||||
static u32 check_nand_stat(struct fsl_ifc_ctrl *ctrl)
|
||||
{
|
||||
- struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
|
||||
+ struct fsl_ifc_runtime __iomem *ifc = ctrl->rregs;
|
||||
unsigned long flags;
|
||||
u32 stat;
|
||||
|
||||
@@ -162,7 +162,7 @@ static irqreturn_t fsl_ifc_nand_irq(int
|
||||
static irqreturn_t fsl_ifc_ctrl_irq(int irqno, void *data)
|
||||
{
|
||||
struct fsl_ifc_ctrl *ctrl = data;
|
||||
- struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
|
||||
+ struct fsl_ifc_fcm __iomem *ifc = ctrl->gregs;
|
||||
u32 err_axiid, err_srcid, status, cs_err, err_addr;
|
||||
irqreturn_t ret = IRQ_NONE;
|
||||
|
||||
@@ -220,6 +220,7 @@ static int fsl_ifc_ctrl_probe(struct pla
|
||||
{
|
||||
int ret = 0;
|
||||
int version, banks;
|
||||
+ void __iomem *addr;
|
||||
|
||||
dev_info(&dev->dev, "Freescale Integrated Flash Controller\n");
|
||||
|
||||
@@ -230,22 +231,13 @@ static int fsl_ifc_ctrl_probe(struct pla
|
||||
dev_set_drvdata(&dev->dev, fsl_ifc_ctrl_dev);
|
||||
|
||||
/* IOMAP the entire IFC region */
|
||||
- fsl_ifc_ctrl_dev->regs = of_iomap(dev->dev.of_node, 0);
|
||||
- if (!fsl_ifc_ctrl_dev->regs) {
|
||||
+ fsl_ifc_ctrl_dev->gregs = of_iomap(dev->dev.of_node, 0);
|
||||
+ if (!fsl_ifc_ctrl_dev->gregs) {
|
||||
dev_err(&dev->dev, "failed to get memory region\n");
|
||||
ret = -ENODEV;
|
||||
goto err;
|
||||
}
|
||||
|
||||
- version = ifc_in32(&fsl_ifc_ctrl_dev->regs->ifc_rev) &
|
||||
- FSL_IFC_VERSION_MASK;
|
||||
- banks = (version == FSL_IFC_VERSION_1_0_0) ? 4 : 8;
|
||||
- dev_info(&dev->dev, "IFC version %d.%d, %d banks\n",
|
||||
- version >> 24, (version >> 16) & 0xf, banks);
|
||||
-
|
||||
- fsl_ifc_ctrl_dev->version = version;
|
||||
- fsl_ifc_ctrl_dev->banks = banks;
|
||||
-
|
||||
if (of_property_read_bool(dev->dev.of_node, "little-endian")) {
|
||||
fsl_ifc_ctrl_dev->little_endian = true;
|
||||
dev_dbg(&dev->dev, "IFC REGISTERS are LITTLE endian\n");
|
||||
@@ -254,8 +246,9 @@ static int fsl_ifc_ctrl_probe(struct pla
|
||||
dev_dbg(&dev->dev, "IFC REGISTERS are BIG endian\n");
|
||||
}
|
||||
|
||||
- version = ioread32be(&fsl_ifc_ctrl_dev->regs->ifc_rev) &
|
||||
+ version = ifc_in32(&fsl_ifc_ctrl_dev->gregs->ifc_rev) &
|
||||
FSL_IFC_VERSION_MASK;
|
||||
+
|
||||
banks = (version == FSL_IFC_VERSION_1_0_0) ? 4 : 8;
|
||||
dev_info(&dev->dev, "IFC version %d.%d, %d banks\n",
|
||||
version >> 24, (version >> 16) & 0xf, banks);
|
||||
@@ -263,6 +256,14 @@ static int fsl_ifc_ctrl_probe(struct pla
|
||||
fsl_ifc_ctrl_dev->version = version;
|
||||
fsl_ifc_ctrl_dev->banks = banks;
|
||||
|
||||
+ addr = fsl_ifc_ctrl_dev->gregs;
|
||||
+ if (version >= FSL_IFC_VERSION_2_0_0)
|
||||
+ fsl_ifc_ctrl_dev->rregs =
|
||||
+ (struct fsl_ifc_runtime *)(addr + PGOFFSET_64K);
|
||||
+ else
|
||||
+ fsl_ifc_ctrl_dev->rregs =
|
||||
+ (struct fsl_ifc_runtime *)(addr + PGOFFSET_4K);
|
||||
+
|
||||
/* get the Controller level irq */
|
||||
fsl_ifc_ctrl_dev->irq = irq_of_parse_and_map(dev->dev.of_node, 0);
|
||||
if (fsl_ifc_ctrl_dev->irq == 0) {
|
||||
@@ -319,33 +320,39 @@ err:
|
||||
static int fsl_ifc_suspend(struct device *dev)
|
||||
{
|
||||
struct fsl_ifc_ctrl *ctrl = dev_get_drvdata(dev);
|
||||
- struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
|
||||
+ struct fsl_ifc_fcm __iomem *fcm = ctrl->gregs;
|
||||
+ struct fsl_ifc_runtime __iomem *runtime = ctrl->rregs;
|
||||
__be32 nand_evter_intr_en, cm_evter_intr_en, nor_evter_intr_en,
|
||||
gpcm_evter_intr_en;
|
||||
|
||||
- ctrl->saved_regs = kzalloc(sizeof(struct fsl_ifc_regs), GFP_KERNEL);
|
||||
- if (!ctrl->saved_regs)
|
||||
+ ctrl->saved_gregs = kzalloc(sizeof(struct fsl_ifc_fcm), GFP_KERNEL);
|
||||
+ if (!ctrl->saved_gregs)
|
||||
+ return -ENOMEM;
|
||||
+ ctrl->saved_rregs = kzalloc(sizeof(struct fsl_ifc_runtime), GFP_KERNEL);
|
||||
+ if (!ctrl->saved_rregs)
|
||||
return -ENOMEM;
|
||||
|
||||
- cm_evter_intr_en = ifc_in32(&ifc->cm_evter_intr_en);
|
||||
- nand_evter_intr_en = ifc_in32(&ifc->ifc_nand.nand_evter_intr_en);
|
||||
- nor_evter_intr_en = ifc_in32(&ifc->ifc_nor.nor_evter_intr_en);
|
||||
- gpcm_evter_intr_en = ifc_in32(&ifc->ifc_gpcm.gpcm_evter_intr_en);
|
||||
+ cm_evter_intr_en = ifc_in32(&fcm->cm_evter_intr_en);
|
||||
+ nand_evter_intr_en = ifc_in32(&runtime->ifc_nand.nand_evter_intr_en);
|
||||
+ nor_evter_intr_en = ifc_in32(&runtime->ifc_nor.nor_evter_intr_en);
|
||||
+ gpcm_evter_intr_en = ifc_in32(&runtime->ifc_gpcm.gpcm_evter_intr_en);
|
||||
|
||||
/* IFC interrupts disabled */
|
||||
|
||||
- ifc_out32(0x0, &ifc->cm_evter_intr_en);
|
||||
- ifc_out32(0x0, &ifc->ifc_nand.nand_evter_intr_en);
|
||||
- ifc_out32(0x0, &ifc->ifc_nor.nor_evter_intr_en);
|
||||
- ifc_out32(0x0, &ifc->ifc_gpcm.gpcm_evter_intr_en);
|
||||
-
|
||||
- memcpy_fromio(ctrl->saved_regs, ifc, sizeof(struct fsl_ifc_regs));
|
||||
+ ifc_out32(0x0, &fcm->cm_evter_intr_en);
|
||||
+ ifc_out32(0x0, &runtime->ifc_nand.nand_evter_intr_en);
|
||||
+ ifc_out32(0x0, &runtime->ifc_nor.nor_evter_intr_en);
|
||||
+ ifc_out32(0x0, &runtime->ifc_gpcm.gpcm_evter_intr_en);
|
||||
+
|
||||
+ memcpy_fromio(ctrl->saved_gregs, fcm, sizeof(struct fsl_ifc_fcm));
|
||||
+ memcpy_fromio(ctrl->saved_rregs, runtime,
|
||||
+ sizeof(struct fsl_ifc_runtime));
|
||||
|
||||
/* save the interrupt values */
|
||||
- ctrl->saved_regs->cm_evter_intr_en = cm_evter_intr_en;
|
||||
- ctrl->saved_regs->ifc_nand.nand_evter_intr_en = nand_evter_intr_en;
|
||||
- ctrl->saved_regs->ifc_nor.nor_evter_intr_en = nor_evter_intr_en;
|
||||
- ctrl->saved_regs->ifc_gpcm.gpcm_evter_intr_en = gpcm_evter_intr_en;
|
||||
+ ctrl->saved_gregs->cm_evter_intr_en = cm_evter_intr_en;
|
||||
+ ctrl->saved_rregs->ifc_nand.nand_evter_intr_en = nand_evter_intr_en;
|
||||
+ ctrl->saved_rregs->ifc_nor.nor_evter_intr_en = nor_evter_intr_en;
|
||||
+ ctrl->saved_rregs->ifc_gpcm.gpcm_evter_intr_en = gpcm_evter_intr_en;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -354,110 +361,116 @@ static int fsl_ifc_suspend(struct device
|
||||
static int fsl_ifc_resume(struct device *dev)
|
||||
{
|
||||
struct fsl_ifc_ctrl *ctrl = dev_get_drvdata(dev);
|
||||
- struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
|
||||
- struct fsl_ifc_regs *savd_regs = ctrl->saved_regs;
|
||||
+ struct fsl_ifc_fcm __iomem *fcm = ctrl->gregs;
|
||||
+ struct fsl_ifc_runtime __iomem *runtime = ctrl->rregs;
|
||||
+ struct fsl_ifc_fcm *savd_gregs = ctrl->saved_gregs;
|
||||
+ struct fsl_ifc_runtime *savd_rregs = ctrl->saved_rregs;
|
||||
uint32_t ver = 0, ncfgr, status, ifc_bank, i;
|
||||
|
||||
/*
|
||||
* IFC interrupts disabled
|
||||
*/
|
||||
- ifc_out32(0x0, &ifc->cm_evter_intr_en);
|
||||
- ifc_out32(0x0, &ifc->ifc_nand.nand_evter_intr_en);
|
||||
- ifc_out32(0x0, &ifc->ifc_nor.nor_evter_intr_en);
|
||||
- ifc_out32(0x0, &ifc->ifc_gpcm.gpcm_evter_intr_en);
|
||||
+ ifc_out32(0x0, &fcm->cm_evter_intr_en);
|
||||
+ ifc_out32(0x0, &runtime->ifc_nand.nand_evter_intr_en);
|
||||
+ ifc_out32(0x0, &runtime->ifc_nor.nor_evter_intr_en);
|
||||
+ ifc_out32(0x0, &runtime->ifc_gpcm.gpcm_evter_intr_en);
|
||||
|
||||
|
||||
- if (ctrl->saved_regs) {
|
||||
+ if (ctrl->saved_gregs) {
|
||||
for (ifc_bank = 0; ifc_bank < FSL_IFC_BANK_COUNT; ifc_bank++) {
|
||||
- ifc_out32(savd_regs->cspr_cs[ifc_bank].cspr_ext,
|
||||
- &ifc->cspr_cs[ifc_bank].cspr_ext);
|
||||
- ifc_out32(savd_regs->cspr_cs[ifc_bank].cspr,
|
||||
- &ifc->cspr_cs[ifc_bank].cspr);
|
||||
- ifc_out32(savd_regs->amask_cs[ifc_bank].amask,
|
||||
- &ifc->amask_cs[ifc_bank].amask);
|
||||
- ifc_out32(savd_regs->csor_cs[ifc_bank].csor_ext,
|
||||
- &ifc->csor_cs[ifc_bank].csor_ext);
|
||||
- ifc_out32(savd_regs->csor_cs[ifc_bank].csor,
|
||||
- &ifc->csor_cs[ifc_bank].csor);
|
||||
+ ifc_out32(savd_gregs->cspr_cs[ifc_bank].cspr_ext,
|
||||
+ &fcm->cspr_cs[ifc_bank].cspr_ext);
|
||||
+ ifc_out32(savd_gregs->cspr_cs[ifc_bank].cspr,
|
||||
+ &fcm->cspr_cs[ifc_bank].cspr);
|
||||
+ ifc_out32(savd_gregs->amask_cs[ifc_bank].amask,
|
||||
+ &fcm->amask_cs[ifc_bank].amask);
|
||||
+ ifc_out32(savd_gregs->csor_cs[ifc_bank].csor_ext,
|
||||
+ &fcm->csor_cs[ifc_bank].csor_ext);
|
||||
+ ifc_out32(savd_gregs->csor_cs[ifc_bank].csor,
|
||||
+ &fcm->csor_cs[ifc_bank].csor);
|
||||
for (i = 0; i < 4; i++) {
|
||||
- ifc_out32(savd_regs->ftim_cs[ifc_bank].ftim[i],
|
||||
- &ifc->ftim_cs[ifc_bank].ftim[i]);
|
||||
+ ifc_out32(savd_gregs->ftim_cs[ifc_bank].ftim[i],
|
||||
+ &fcm->ftim_cs[ifc_bank].ftim[i]);
|
||||
}
|
||||
}
|
||||
- ifc_out32(savd_regs->ifc_gcr, &ifc->ifc_gcr);
|
||||
- ifc_out32(savd_regs->cm_evter_en, &ifc->cm_evter_en);
|
||||
-
|
||||
-/*
|
||||
-* IFC controller NAND machine registers
|
||||
-*/
|
||||
- ifc_out32(savd_regs->ifc_nand.ncfgr, &ifc->ifc_nand.ncfgr);
|
||||
- ifc_out32(savd_regs->ifc_nand.nand_fcr0,
|
||||
- &ifc->ifc_nand.nand_fcr0);
|
||||
- ifc_out32(savd_regs->ifc_nand.nand_fcr1,
|
||||
- &ifc->ifc_nand.nand_fcr1);
|
||||
- ifc_out32(savd_regs->ifc_nand.row0, &ifc->ifc_nand.row0);
|
||||
- ifc_out32(savd_regs->ifc_nand.row1, &ifc->ifc_nand.row1);
|
||||
- ifc_out32(savd_regs->ifc_nand.col0, &ifc->ifc_nand.col0);
|
||||
- ifc_out32(savd_regs->ifc_nand.col1, &ifc->ifc_nand.col1);
|
||||
- ifc_out32(savd_regs->ifc_nand.row2, &ifc->ifc_nand.row2);
|
||||
- ifc_out32(savd_regs->ifc_nand.col2, &ifc->ifc_nand.col2);
|
||||
- ifc_out32(savd_regs->ifc_nand.row3, &ifc->ifc_nand.row3);
|
||||
- ifc_out32(savd_regs->ifc_nand.col3, &ifc->ifc_nand.col3);
|
||||
- ifc_out32(savd_regs->ifc_nand.nand_fbcr,
|
||||
- &ifc->ifc_nand.nand_fbcr);
|
||||
- ifc_out32(savd_regs->ifc_nand.nand_fir0,
|
||||
- &ifc->ifc_nand.nand_fir0);
|
||||
- ifc_out32(savd_regs->ifc_nand.nand_fir1,
|
||||
- &ifc->ifc_nand.nand_fir1);
|
||||
- ifc_out32(savd_regs->ifc_nand.nand_fir2,
|
||||
- &ifc->ifc_nand.nand_fir2);
|
||||
- ifc_out32(savd_regs->ifc_nand.nand_csel,
|
||||
- &ifc->ifc_nand.nand_csel);
|
||||
- ifc_out32(savd_regs->ifc_nand.nandseq_strt,
|
||||
- &ifc->ifc_nand.nandseq_strt);
|
||||
- ifc_out32(savd_regs->ifc_nand.nand_evter_en,
|
||||
- &ifc->ifc_nand.nand_evter_en);
|
||||
- ifc_out32(savd_regs->ifc_nand.nanndcr, &ifc->ifc_nand.nanndcr);
|
||||
-
|
||||
-/*
|
||||
-* IFC controller NOR machine registers
|
||||
-*/
|
||||
- ifc_out32(savd_regs->ifc_nor.nor_evter_en,
|
||||
- &ifc->ifc_nor.nor_evter_en);
|
||||
- ifc_out32(savd_regs->ifc_nor.norcr, &ifc->ifc_nor.norcr);
|
||||
-
|
||||
-/*
|
||||
- * IFC controller GPCM Machine registers
|
||||
- */
|
||||
- ifc_out32(savd_regs->ifc_gpcm.gpcm_evter_en,
|
||||
- &ifc->ifc_gpcm.gpcm_evter_en);
|
||||
-
|
||||
-
|
||||
-
|
||||
-/*
|
||||
- * IFC interrupts enabled
|
||||
- */
|
||||
- ifc_out32(ctrl->saved_regs->cm_evter_intr_en, &ifc->cm_evter_intr_en);
|
||||
- ifc_out32(ctrl->saved_regs->ifc_nand.nand_evter_intr_en,
|
||||
- &ifc->ifc_nand.nand_evter_intr_en);
|
||||
- ifc_out32(ctrl->saved_regs->ifc_nor.nor_evter_intr_en,
|
||||
- &ifc->ifc_nor.nor_evter_intr_en);
|
||||
- ifc_out32(ctrl->saved_regs->ifc_gpcm.gpcm_evter_intr_en,
|
||||
- &ifc->ifc_gpcm.gpcm_evter_intr_en);
|
||||
+ ifc_out32(savd_gregs->rb_map, &fcm->rb_map);
|
||||
+ ifc_out32(savd_gregs->wb_map, &fcm->wb_map);
|
||||
+ ifc_out32(savd_gregs->ifc_gcr, &fcm->ifc_gcr);
|
||||
+ ifc_out32(savd_gregs->ddr_ccr_low, &fcm->ddr_ccr_low);
|
||||
+ ifc_out32(savd_gregs->cm_evter_en, &fcm->cm_evter_en);
|
||||
+ }
|
||||
|
||||
- kfree(ctrl->saved_regs);
|
||||
- ctrl->saved_regs = NULL;
|
||||
+ if (ctrl->saved_rregs) {
|
||||
+ /* IFC controller NAND machine registers */
|
||||
+ ifc_out32(savd_rregs->ifc_nand.ncfgr,
|
||||
+ &runtime->ifc_nand.ncfgr);
|
||||
+ ifc_out32(savd_rregs->ifc_nand.nand_fcr0,
|
||||
+ &runtime->ifc_nand.nand_fcr0);
|
||||
+ ifc_out32(savd_rregs->ifc_nand.nand_fcr1,
|
||||
+ &runtime->ifc_nand.nand_fcr1);
|
||||
+ ifc_out32(savd_rregs->ifc_nand.row0, &runtime->ifc_nand.row0);
|
||||
+ ifc_out32(savd_rregs->ifc_nand.row1, &runtime->ifc_nand.row1);
|
||||
+ ifc_out32(savd_rregs->ifc_nand.col0, &runtime->ifc_nand.col0);
|
||||
+ ifc_out32(savd_rregs->ifc_nand.col1, &runtime->ifc_nand.col1);
|
||||
+ ifc_out32(savd_rregs->ifc_nand.row2, &runtime->ifc_nand.row2);
|
||||
+ ifc_out32(savd_rregs->ifc_nand.col2, &runtime->ifc_nand.col2);
|
||||
+ ifc_out32(savd_rregs->ifc_nand.row3, &runtime->ifc_nand.row3);
|
||||
+ ifc_out32(savd_rregs->ifc_nand.col3, &runtime->ifc_nand.col3);
|
||||
+ ifc_out32(savd_rregs->ifc_nand.nand_fbcr,
|
||||
+ &runtime->ifc_nand.nand_fbcr);
|
||||
+ ifc_out32(savd_rregs->ifc_nand.nand_fir0,
|
||||
+ &runtime->ifc_nand.nand_fir0);
|
||||
+ ifc_out32(savd_rregs->ifc_nand.nand_fir1,
|
||||
+ &runtime->ifc_nand.nand_fir1);
|
||||
+ ifc_out32(savd_rregs->ifc_nand.nand_fir2,
|
||||
+ &runtime->ifc_nand.nand_fir2);
|
||||
+ ifc_out32(savd_rregs->ifc_nand.nand_csel,
|
||||
+ &runtime->ifc_nand.nand_csel);
|
||||
+ ifc_out32(savd_rregs->ifc_nand.nandseq_strt,
|
||||
+ &runtime->ifc_nand.nandseq_strt);
|
||||
+ ifc_out32(savd_rregs->ifc_nand.nand_evter_en,
|
||||
+ &runtime->ifc_nand.nand_evter_en);
|
||||
+ ifc_out32(savd_rregs->ifc_nand.nanndcr,
|
||||
+ &runtime->ifc_nand.nanndcr);
|
||||
+ ifc_out32(savd_rregs->ifc_nand.nand_dll_lowcfg0,
|
||||
+ &runtime->ifc_nand.nand_dll_lowcfg0);
|
||||
+ ifc_out32(savd_rregs->ifc_nand.nand_dll_lowcfg1,
|
||||
+ &runtime->ifc_nand.nand_dll_lowcfg1);
|
||||
+
|
||||
+ /* IFC controller NOR machine registers */
|
||||
+ ifc_out32(savd_rregs->ifc_nor.nor_evter_en,
|
||||
+ &runtime->ifc_nor.nor_evter_en);
|
||||
+ ifc_out32(savd_rregs->ifc_nor.norcr, &runtime->ifc_nor.norcr);
|
||||
+
|
||||
+ /* IFC controller GPCM Machine registers */
|
||||
+ ifc_out32(savd_rregs->ifc_gpcm.gpcm_evter_en,
|
||||
+ &runtime->ifc_gpcm.gpcm_evter_en);
|
||||
+
|
||||
+ /* IFC interrupts enabled */
|
||||
+ ifc_out32(ctrl->saved_gregs->cm_evter_intr_en,
|
||||
+ &fcm->cm_evter_intr_en);
|
||||
+ ifc_out32(ctrl->saved_rregs->ifc_nand.nand_evter_intr_en,
|
||||
+ &runtime->ifc_nand.nand_evter_intr_en);
|
||||
+ ifc_out32(ctrl->saved_rregs->ifc_nor.nor_evter_intr_en,
|
||||
+ &runtime->ifc_nor.nor_evter_intr_en);
|
||||
+ ifc_out32(ctrl->saved_rregs->ifc_gpcm.gpcm_evter_intr_en,
|
||||
+ &runtime->ifc_gpcm.gpcm_evter_intr_en);
|
||||
+
|
||||
+ kfree(ctrl->saved_gregs);
|
||||
+ kfree(ctrl->saved_rregs);
|
||||
+ ctrl->saved_gregs = NULL;
|
||||
+ ctrl->saved_rregs = NULL;
|
||||
}
|
||||
|
||||
- ver = ifc_in32(&ctrl->regs->ifc_rev);
|
||||
- ncfgr = ifc_in32(&ifc->ifc_nand.ncfgr);
|
||||
+ ver = ifc_in32(&fcm->ifc_rev);
|
||||
+ ncfgr = ifc_in32(&runtime->ifc_nand.ncfgr);
|
||||
if (ver >= FSL_IFC_V1_3_0) {
|
||||
|
||||
ifc_out32(ncfgr | IFC_NAND_SRAM_INIT_EN,
|
||||
- &ifc->ifc_nand.ncfgr);
|
||||
+ &runtime->ifc_nand.ncfgr);
|
||||
/* wait for SRAM_INIT bit to be clear or timeout */
|
||||
status = spin_event_timeout(
|
||||
- !(ifc_in32(&ifc->ifc_nand.ncfgr)
|
||||
+ !(ifc_in32(&runtime->ifc_nand.ncfgr)
|
||||
& IFC_NAND_SRAM_INIT_EN),
|
||||
IFC_TIMEOUT_MSECS, 0);
|
||||
|
||||
--- a/drivers/mtd/nand/fsl_ifc_nand.c
|
||||
+++ b/drivers/mtd/nand/fsl_ifc_nand.c
|
||||
@@ -233,7 +233,7 @@ static void set_addr(struct mtd_info *mt
|
||||
struct nand_chip *chip = mtd->priv;
|
||||
struct fsl_ifc_mtd *priv = chip->priv;
|
||||
struct fsl_ifc_ctrl *ctrl = priv->ctrl;
|
||||
- struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
|
||||
+ struct fsl_ifc_runtime __iomem *ifc = ctrl->rregs;
|
||||
int buf_num;
|
||||
|
||||
ifc_nand_ctrl->page = page_addr;
|
||||
@@ -296,7 +296,7 @@ static void fsl_ifc_run_command(struct m
|
||||
struct fsl_ifc_mtd *priv = chip->priv;
|
||||
struct fsl_ifc_ctrl *ctrl = priv->ctrl;
|
||||
struct fsl_ifc_nand_ctrl *nctrl = ifc_nand_ctrl;
|
||||
- struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
|
||||
+ struct fsl_ifc_runtime __iomem *ifc = ctrl->rregs;
|
||||
u32 eccstat[4];
|
||||
int i;
|
||||
|
||||
@@ -372,7 +372,7 @@ static void fsl_ifc_do_read(struct nand_
|
||||
{
|
||||
struct fsl_ifc_mtd *priv = chip->priv;
|
||||
struct fsl_ifc_ctrl *ctrl = priv->ctrl;
|
||||
- struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
|
||||
+ struct fsl_ifc_runtime __iomem *ifc = ctrl->rregs;
|
||||
|
||||
/* Program FIR/IFC_NAND_FCR0 for Small/Large page */
|
||||
if (mtd->writesize > 512) {
|
||||
@@ -412,7 +412,7 @@ static void fsl_ifc_cmdfunc(struct mtd_i
|
||||
struct nand_chip *chip = mtd->priv;
|
||||
struct fsl_ifc_mtd *priv = chip->priv;
|
||||
struct fsl_ifc_ctrl *ctrl = priv->ctrl;
|
||||
- struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
|
||||
+ struct fsl_ifc_runtime __iomem *ifc = ctrl->rregs;
|
||||
|
||||
/* clear the read buffer */
|
||||
ifc_nand_ctrl->read_bytes = 0;
|
||||
@@ -724,7 +724,7 @@ static int fsl_ifc_wait(struct mtd_info
|
||||
{
|
||||
struct fsl_ifc_mtd *priv = chip->priv;
|
||||
struct fsl_ifc_ctrl *ctrl = priv->ctrl;
|
||||
- struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
|
||||
+ struct fsl_ifc_runtime __iomem *ifc = ctrl->rregs;
|
||||
u32 nand_fsr;
|
||||
|
||||
/* Use READ_STATUS command, but wait for the device to be ready */
|
||||
@@ -826,39 +826,42 @@ static int fsl_ifc_chip_init_tail(struct
|
||||
static void fsl_ifc_sram_init(struct fsl_ifc_mtd *priv)
|
||||
{
|
||||
struct fsl_ifc_ctrl *ctrl = priv->ctrl;
|
||||
- struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
|
||||
+ struct fsl_ifc_runtime __iomem *ifc_runtime = ctrl->rregs;
|
||||
+ struct fsl_ifc_fcm __iomem *ifc_global = ctrl->gregs;
|
||||
uint32_t csor = 0, csor_8k = 0, csor_ext = 0;
|
||||
uint32_t cs = priv->bank;
|
||||
|
||||
/* Save CSOR and CSOR_ext */
|
||||
- csor = ifc_in32(&ifc->csor_cs[cs].csor);
|
||||
- csor_ext = ifc_in32(&ifc->csor_cs[cs].csor_ext);
|
||||
+ csor = ifc_in32(&ifc_global->csor_cs[cs].csor);
|
||||
+ csor_ext = ifc_in32(&ifc_global->csor_cs[cs].csor_ext);
|
||||
|
||||
/* chage PageSize 8K and SpareSize 1K*/
|
||||
csor_8k = (csor & ~(CSOR_NAND_PGS_MASK)) | 0x0018C000;
|
||||
- ifc_out32(csor_8k, &ifc->csor_cs[cs].csor);
|
||||
- ifc_out32(0x0000400, &ifc->csor_cs[cs].csor_ext);
|
||||
+ ifc_out32(csor_8k, &ifc_global->csor_cs[cs].csor);
|
||||
+ ifc_out32(0x0000400, &ifc_global->csor_cs[cs].csor_ext);
|
||||
|
||||
/* READID */
|
||||
ifc_out32((IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
|
||||
- (IFC_FIR_OP_UA << IFC_NAND_FIR0_OP1_SHIFT) |
|
||||
- (IFC_FIR_OP_RB << IFC_NAND_FIR0_OP2_SHIFT),
|
||||
- &ifc->ifc_nand.nand_fir0);
|
||||
+ (IFC_FIR_OP_UA << IFC_NAND_FIR0_OP1_SHIFT) |
|
||||
+ (IFC_FIR_OP_RB << IFC_NAND_FIR0_OP2_SHIFT),
|
||||
+ &ifc_runtime->ifc_nand.nand_fir0);
|
||||
ifc_out32(NAND_CMD_READID << IFC_NAND_FCR0_CMD0_SHIFT,
|
||||
- &ifc->ifc_nand.nand_fcr0);
|
||||
- ifc_out32(0x0, &ifc->ifc_nand.row3);
|
||||
+ &ifc_runtime->ifc_nand.nand_fcr0);
|
||||
+ ifc_out32(0x0, &ifc_runtime->ifc_nand.row3);
|
||||
|
||||
- ifc_out32(0x0, &ifc->ifc_nand.nand_fbcr);
|
||||
+ ifc_out32(0x0, &ifc_runtime->ifc_nand.nand_fbcr);
|
||||
|
||||
/* Program ROW0/COL0 */
|
||||
- ifc_out32(0x0, &ifc->ifc_nand.row0);
|
||||
- ifc_out32(0x0, &ifc->ifc_nand.col0);
|
||||
+ ifc_out32(0x0, &ifc_runtime->ifc_nand.row0);
|
||||
+ ifc_out32(0x0, &ifc_runtime->ifc_nand.col0);
|
||||
|
||||
/* set the chip select for NAND Transaction */
|
||||
- ifc_out32(cs << IFC_NAND_CSEL_SHIFT, &ifc->ifc_nand.nand_csel);
|
||||
+ ifc_out32(cs << IFC_NAND_CSEL_SHIFT,
|
||||
+ &ifc_runtime->ifc_nand.nand_csel);
|
||||
|
||||
/* start read seq */
|
||||
- ifc_out32(IFC_NAND_SEQ_STRT_FIR_STRT, &ifc->ifc_nand.nandseq_strt);
|
||||
+ ifc_out32(IFC_NAND_SEQ_STRT_FIR_STRT,
|
||||
+ &ifc_runtime->ifc_nand.nandseq_strt);
|
||||
|
||||
/* wait for command complete flag or timeout */
|
||||
wait_event_timeout(ctrl->nand_wait, ctrl->nand_stat,
|
||||
@@ -868,14 +871,15 @@ static void fsl_ifc_sram_init(struct fsl
|
||||
printk(KERN_ERR "fsl-ifc: Failed to Initialise SRAM\n");
|
||||
|
||||
/* Restore CSOR and CSOR_ext */
|
||||
- ifc_out32(csor, &ifc->csor_cs[cs].csor);
|
||||
- ifc_out32(csor_ext, &ifc->csor_cs[cs].csor_ext);
|
||||
+ ifc_out32(csor, &ifc_global->csor_cs[cs].csor);
|
||||
+ ifc_out32(csor_ext, &ifc_global->csor_cs[cs].csor_ext);
|
||||
}
|
||||
|
||||
static int fsl_ifc_chip_init(struct fsl_ifc_mtd *priv)
|
||||
{
|
||||
struct fsl_ifc_ctrl *ctrl = priv->ctrl;
|
||||
- struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
|
||||
+ struct fsl_ifc_fcm __iomem *ifc_global = ctrl->gregs;
|
||||
+ struct fsl_ifc_runtime __iomem *ifc_runtime = ctrl->rregs;
|
||||
struct nand_chip *chip = &priv->chip;
|
||||
struct nand_ecclayout *layout;
|
||||
u32 csor;
|
||||
@@ -886,7 +890,8 @@ static int fsl_ifc_chip_init(struct fsl_
|
||||
|
||||
/* fill in nand_chip structure */
|
||||
/* set up function call table */
|
||||
- if ((ifc_in32(&ifc->cspr_cs[priv->bank].cspr)) & CSPR_PORT_SIZE_16)
|
||||
+ if ((ifc_in32(&ifc_global->cspr_cs[priv->bank].cspr))
|
||||
+ & CSPR_PORT_SIZE_16)
|
||||
chip->read_byte = fsl_ifc_read_byte16;
|
||||
else
|
||||
chip->read_byte = fsl_ifc_read_byte;
|
||||
@@ -900,13 +905,14 @@ static int fsl_ifc_chip_init(struct fsl_
|
||||
chip->bbt_td = &bbt_main_descr;
|
||||
chip->bbt_md = &bbt_mirror_descr;
|
||||
|
||||
- ifc_out32(0x0, &ifc->ifc_nand.ncfgr);
|
||||
+ ifc_out32(0x0, &ifc_runtime->ifc_nand.ncfgr);
|
||||
|
||||
/* set up nand options */
|
||||
chip->bbt_options = NAND_BBT_USE_FLASH;
|
||||
chip->options = NAND_NO_SUBPAGE_WRITE;
|
||||
|
||||
- if (ifc_in32(&ifc->cspr_cs[priv->bank].cspr) & CSPR_PORT_SIZE_16) {
|
||||
+ if (ifc_in32(&ifc_global->cspr_cs[priv->bank].cspr)
|
||||
+ & CSPR_PORT_SIZE_16) {
|
||||
chip->read_byte = fsl_ifc_read_byte16;
|
||||
chip->options |= NAND_BUSWIDTH_16;
|
||||
} else {
|
||||
@@ -919,7 +925,7 @@ static int fsl_ifc_chip_init(struct fsl_
|
||||
chip->ecc.read_page = fsl_ifc_read_page;
|
||||
chip->ecc.write_page = fsl_ifc_write_page;
|
||||
|
||||
- csor = ifc_in32(&ifc->csor_cs[priv->bank].csor);
|
||||
+ csor = ifc_in32(&ifc_global->csor_cs[priv->bank].csor);
|
||||
|
||||
/* Hardware generates ECC per 512 Bytes */
|
||||
chip->ecc.size = 512;
|
||||
@@ -1005,10 +1011,10 @@ static int fsl_ifc_chip_remove(struct fs
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int match_bank(struct fsl_ifc_regs __iomem *ifc, int bank,
|
||||
+static int match_bank(struct fsl_ifc_fcm __iomem *ifc_global, int bank,
|
||||
phys_addr_t addr)
|
||||
{
|
||||
- u32 cspr = ifc_in32(&ifc->cspr_cs[bank].cspr);
|
||||
+ u32 cspr = ifc_in32(&ifc_global->cspr_cs[bank].cspr);
|
||||
|
||||
if (!(cspr & CSPR_V))
|
||||
return 0;
|
||||
@@ -1022,7 +1028,7 @@ static DEFINE_MUTEX(fsl_ifc_nand_mutex);
|
||||
|
||||
static int fsl_ifc_nand_probe(struct platform_device *dev)
|
||||
{
|
||||
- struct fsl_ifc_regs __iomem *ifc;
|
||||
+ struct fsl_ifc_runtime __iomem *ifc;
|
||||
struct fsl_ifc_mtd *priv;
|
||||
struct resource res;
|
||||
static const char *part_probe_types[]
|
||||
@@ -1033,9 +1039,9 @@ static int fsl_ifc_nand_probe(struct pla
|
||||
struct mtd_part_parser_data ppdata;
|
||||
|
||||
ppdata.of_node = dev->dev.of_node;
|
||||
- if (!fsl_ifc_ctrl_dev || !fsl_ifc_ctrl_dev->regs)
|
||||
+ if (!fsl_ifc_ctrl_dev || !fsl_ifc_ctrl_dev->rregs)
|
||||
return -ENODEV;
|
||||
- ifc = fsl_ifc_ctrl_dev->regs;
|
||||
+ ifc = fsl_ifc_ctrl_dev->rregs;
|
||||
|
||||
/* get, allocate and map the memory resource */
|
||||
ret = of_address_to_resource(node, 0, &res);
|
||||
@@ -1046,7 +1052,7 @@ static int fsl_ifc_nand_probe(struct pla
|
||||
|
||||
/* find which chip select it is connected to */
|
||||
for (bank = 0; bank < fsl_ifc_ctrl_dev->banks; bank++) {
|
||||
- if (match_bank(ifc, bank, res.start))
|
||||
+ if (match_bank(fsl_ifc_ctrl_dev->gregs, bank, res.start))
|
||||
break;
|
||||
}
|
||||
|
||||
--- a/include/linux/fsl_ifc.h
|
||||
+++ b/include/linux/fsl_ifc.h
|
||||
@@ -39,6 +39,10 @@
|
||||
#define FSL_IFC_VERSION_MASK 0x0F0F0000
|
||||
#define FSL_IFC_VERSION_1_0_0 0x01000000
|
||||
#define FSL_IFC_VERSION_1_1_0 0x01010000
|
||||
+#define FSL_IFC_VERSION_2_0_0 0x02000000
|
||||
+
|
||||
+#define PGOFFSET_64K (64*1024)
|
||||
+#define PGOFFSET_4K (4*1024)
|
||||
|
||||
/*
|
||||
* CSPR - Chip Select Property Register
|
||||
@@ -725,20 +729,26 @@ struct fsl_ifc_nand {
|
||||
__be32 nand_evter_en;
|
||||
u32 res17[0x2];
|
||||
__be32 nand_evter_intr_en;
|
||||
- u32 res18[0x2];
|
||||
+ __be32 nand_vol_addr_stat;
|
||||
+ u32 res18;
|
||||
__be32 nand_erattr0;
|
||||
__be32 nand_erattr1;
|
||||
u32 res19[0x10];
|
||||
__be32 nand_fsr;
|
||||
- u32 res20;
|
||||
- __be32 nand_eccstat[4];
|
||||
- u32 res21[0x20];
|
||||
+ u32 res20[0x3];
|
||||
+ __be32 nand_eccstat[6];
|
||||
+ u32 res21[0x1c];
|
||||
__be32 nanndcr;
|
||||
u32 res22[0x2];
|
||||
__be32 nand_autoboot_trgr;
|
||||
u32 res23;
|
||||
__be32 nand_mdr;
|
||||
- u32 res24[0x5C];
|
||||
+ u32 res24[0x1C];
|
||||
+ __be32 nand_dll_lowcfg0;
|
||||
+ __be32 nand_dll_lowcfg1;
|
||||
+ u32 res25;
|
||||
+ __be32 nand_dll_lowstat;
|
||||
+ u32 res26[0x3c];
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -773,13 +783,12 @@ struct fsl_ifc_gpcm {
|
||||
__be32 gpcm_erattr1;
|
||||
__be32 gpcm_erattr2;
|
||||
__be32 gpcm_stat;
|
||||
- u32 res4[0x1F3];
|
||||
};
|
||||
|
||||
/*
|
||||
* IFC Controller Registers
|
||||
*/
|
||||
-struct fsl_ifc_regs {
|
||||
+struct fsl_ifc_fcm {
|
||||
__be32 ifc_rev;
|
||||
u32 res1[0x2];
|
||||
struct {
|
||||
@@ -805,21 +814,26 @@ struct fsl_ifc_regs {
|
||||
} ftim_cs[FSL_IFC_BANK_COUNT];
|
||||
u32 res9[0x30];
|
||||
__be32 rb_stat;
|
||||
- u32 res10[0x2];
|
||||
+ __be32 rb_map;
|
||||
+ __be32 wb_map;
|
||||
__be32 ifc_gcr;
|
||||
- u32 res11[0x2];
|
||||
+ u32 res10[0x2];
|
||||
__be32 cm_evter_stat;
|
||||
- u32 res12[0x2];
|
||||
+ u32 res11[0x2];
|
||||
__be32 cm_evter_en;
|
||||
- u32 res13[0x2];
|
||||
+ u32 res12[0x2];
|
||||
__be32 cm_evter_intr_en;
|
||||
- u32 res14[0x2];
|
||||
+ u32 res13[0x2];
|
||||
__be32 cm_erattr0;
|
||||
__be32 cm_erattr1;
|
||||
- u32 res15[0x2];
|
||||
+ u32 res14[0x2];
|
||||
__be32 ifc_ccr;
|
||||
__be32 ifc_csr;
|
||||
- u32 res16[0x2EB];
|
||||
+ __be32 ddr_ccr_low;
|
||||
+};
|
||||
+
|
||||
+
|
||||
+struct fsl_ifc_runtime {
|
||||
struct fsl_ifc_nand ifc_nand;
|
||||
struct fsl_ifc_nor ifc_nor;
|
||||
struct fsl_ifc_gpcm ifc_gpcm;
|
||||
@@ -833,7 +847,8 @@ extern int fsl_ifc_find(phys_addr_t addr
|
||||
struct fsl_ifc_ctrl {
|
||||
/* device info */
|
||||
struct device *dev;
|
||||
- struct fsl_ifc_regs __iomem *regs;
|
||||
+ struct fsl_ifc_fcm __iomem *gregs;
|
||||
+ struct fsl_ifc_runtime __iomem *rregs;
|
||||
int irq;
|
||||
int nand_irq;
|
||||
spinlock_t lock;
|
||||
@@ -846,7 +861,8 @@ struct fsl_ifc_ctrl {
|
||||
bool little_endian;
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
/*save regs when system goes to deep sleep*/
|
||||
- struct fsl_ifc_regs *saved_regs;
|
||||
+ struct fsl_ifc_fcm *saved_gregs;
|
||||
+ struct fsl_ifc_runtime *saved_rregs;
|
||||
#endif
|
||||
};
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
From 0ce5d6bd62a9f1dbaa2d39c3535a8bdb31cf7951 Mon Sep 17 00:00:00 2001
|
||||
From: Raghav Dogra <raghav.dogra@nxp.com>
|
||||
Date: Wed, 24 Feb 2016 23:12:58 +0530
|
||||
Subject: [PATCH 47/70] drivers/memory: Fix build error for arm64
|
||||
|
||||
Replace spin_event_timeout() with arch independent macro
|
||||
|
||||
Signed-off-by: Raghav Dogra <raghav.dogra@nxp.com>
|
||||
Signed-off-by: Prabhakar Kushwaha <prabhakar.kushwaha@nxp.com>
|
||||
---
|
||||
drivers/memory/fsl_ifc.c | 16 +++++++++-------
|
||||
1 file changed, 9 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/drivers/memory/fsl_ifc.c
|
||||
+++ b/drivers/memory/fsl_ifc.c
|
||||
@@ -39,7 +39,7 @@
|
||||
struct fsl_ifc_ctrl *fsl_ifc_ctrl_dev;
|
||||
EXPORT_SYMBOL(fsl_ifc_ctrl_dev);
|
||||
#define FSL_IFC_V1_3_0 0x01030000
|
||||
-#define IFC_TIMEOUT_MSECS 100000 /* 100ms */
|
||||
+#define IFC_TIMEOUT_MSECS 1000 /* 1000ms */
|
||||
|
||||
/*
|
||||
* convert_ifc_address - convert the base address
|
||||
@@ -365,7 +365,7 @@ static int fsl_ifc_resume(struct device
|
||||
struct fsl_ifc_runtime __iomem *runtime = ctrl->rregs;
|
||||
struct fsl_ifc_fcm *savd_gregs = ctrl->saved_gregs;
|
||||
struct fsl_ifc_runtime *savd_rregs = ctrl->saved_rregs;
|
||||
- uint32_t ver = 0, ncfgr, status, ifc_bank, i;
|
||||
+ uint32_t ver = 0, ncfgr, timeout, ifc_bank, i;
|
||||
|
||||
/*
|
||||
* IFC interrupts disabled
|
||||
@@ -469,12 +469,14 @@ static int fsl_ifc_resume(struct device
|
||||
ifc_out32(ncfgr | IFC_NAND_SRAM_INIT_EN,
|
||||
&runtime->ifc_nand.ncfgr);
|
||||
/* wait for SRAM_INIT bit to be clear or timeout */
|
||||
- status = spin_event_timeout(
|
||||
- !(ifc_in32(&runtime->ifc_nand.ncfgr)
|
||||
- & IFC_NAND_SRAM_INIT_EN),
|
||||
- IFC_TIMEOUT_MSECS, 0);
|
||||
+ timeout = 10;
|
||||
+ while ((ifc_in32(&runtime->ifc_nand.ncfgr) &
|
||||
+ IFC_NAND_SRAM_INIT_EN) && timeout) {
|
||||
+ mdelay(IFC_TIMEOUT_MSECS);
|
||||
+ timeout--;
|
||||
+ }
|
||||
|
||||
- if (!status)
|
||||
+ if (!timeout)
|
||||
dev_err(ctrl->dev, "Timeout waiting for IFC SRAM INIT");
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load diff
116265
target/linux/layerscape/patches-4.4/7015-fmd-add-fman-driver.patch
Normal file
116265
target/linux/layerscape/patches-4.4/7015-fmd-add-fman-driver.patch
Normal file
File diff suppressed because it is too large
Load diff
19160
target/linux/layerscape/patches-4.4/7016-dpa-add-dpaa_eth-driver.patch
Normal file
19160
target/linux/layerscape/patches-4.4/7016-dpa-add-dpaa_eth-driver.patch
Normal file
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,138 @@
|
|||
From f7792176d939e79b4f525114a95d0fd8266bef8e Mon Sep 17 00:00:00 2001
|
||||
From: Madalin Bucur <madalin.bucur@freescale.com>
|
||||
Date: Wed, 19 Nov 2014 13:06:54 +0200
|
||||
Subject: [PATCH 18/70] devres: add devm_alloc_percpu()
|
||||
|
||||
Introduce managed counterparts for alloc_percpu() and free_percpu().
|
||||
Add devm_alloc_percpu() and devm_free_percpu() into the managed
|
||||
interfaces list.
|
||||
|
||||
Signed-off-by: Madalin Bucur <madalin.bucur@freescale.com>
|
||||
|
||||
Change-Id: I93546348e7b0e1974fda8b6c7a3b3710ce45b724
|
||||
Reviewed-on: http://git.am.freescale.net:8181/24140
|
||||
Reviewed-by: Madalin-Cristian Bucur <madalin.bucur@freescale.com>
|
||||
Tested-by: Madalin-Cristian Bucur <madalin.bucur@freescale.com>
|
||||
|
||||
Conflicts:
|
||||
Documentation/driver-model/devres.txt
|
||||
drivers/base/devres.c
|
||||
|
||||
Conflicts:
|
||||
drivers/base/devres.c
|
||||
---
|
||||
Documentation/driver-model/devres.txt | 4 +++
|
||||
drivers/base/devres.c | 63 +++++++++++++++++++++++++++++++++
|
||||
include/linux/device.h | 19 ++++++++++
|
||||
3 files changed, 86 insertions(+)
|
||||
|
||||
--- a/Documentation/driver-model/devres.txt
|
||||
+++ b/Documentation/driver-model/devres.txt
|
||||
@@ -321,6 +321,10 @@ PHY
|
||||
devm_usb_get_phy()
|
||||
devm_usb_put_phy()
|
||||
|
||||
+PER-CPU MEM
|
||||
+ devm_alloc_percpu()
|
||||
+ devm_free_percpu()
|
||||
+
|
||||
PINCTRL
|
||||
devm_pinctrl_get()
|
||||
devm_pinctrl_put()
|
||||
--- a/drivers/base/devres.c
|
||||
+++ b/drivers/base/devres.c
|
||||
@@ -985,3 +985,66 @@ void devm_free_pages(struct device *dev,
|
||||
&devres));
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_free_pages);
|
||||
+
|
||||
+static void devm_percpu_release(struct device *dev, void *pdata)
|
||||
+{
|
||||
+ void __percpu *p;
|
||||
+
|
||||
+ p = *(void __percpu **)pdata;
|
||||
+ free_percpu(p);
|
||||
+}
|
||||
+
|
||||
+static int devm_percpu_match(struct device *dev, void *data, void *p)
|
||||
+{
|
||||
+ struct devres *devr = container_of(data, struct devres, data);
|
||||
+
|
||||
+ return *(void **)devr->data == p;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * __devm_alloc_percpu - Resource-managed alloc_percpu
|
||||
+ * @dev: Device to allocate per-cpu memory for
|
||||
+ * @size: Size of per-cpu memory to allocate
|
||||
+ * @align: Alignement of per-cpu memory to allocate
|
||||
+ *
|
||||
+ * Managed alloc_percpu. Per-cpu memory allocated with this function is
|
||||
+ * automatically freed on driver detach.
|
||||
+ *
|
||||
+ * RETURNS:
|
||||
+ * Pointer to allocated memory on success, NULL on failure.
|
||||
+ */
|
||||
+void __percpu *__devm_alloc_percpu(struct device *dev, size_t size,
|
||||
+ size_t align)
|
||||
+{
|
||||
+ void *p;
|
||||
+ void __percpu *pcpu;
|
||||
+
|
||||
+ pcpu = __alloc_percpu(size, align);
|
||||
+ if (!pcpu)
|
||||
+ return NULL;
|
||||
+
|
||||
+ p = devres_alloc(devm_percpu_release, sizeof(void *), GFP_KERNEL);
|
||||
+ if (!p)
|
||||
+ return NULL;
|
||||
+
|
||||
+ *(void __percpu **)p = pcpu;
|
||||
+
|
||||
+ devres_add(dev, p);
|
||||
+
|
||||
+ return pcpu;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(__devm_alloc_percpu);
|
||||
+
|
||||
+/**
|
||||
+ * devm_free_percpu - Resource-managed free_percpu
|
||||
+ * @dev: Device this memory belongs to
|
||||
+ * @pdata: Per-cpu memory to free
|
||||
+ *
|
||||
+ * Free memory allocated with devm_alloc_percpu().
|
||||
+ */
|
||||
+void devm_free_percpu(struct device *dev, void __percpu *pdata)
|
||||
+{
|
||||
+ WARN_ON(devres_destroy(dev, devm_percpu_release, devm_percpu_match,
|
||||
+ (void *)pdata));
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(devm_free_percpu);
|
||||
--- a/include/linux/device.h
|
||||
+++ b/include/linux/device.h
|
||||
@@ -681,6 +681,25 @@ void __iomem *devm_ioremap_resource(stru
|
||||
int devm_add_action(struct device *dev, void (*action)(void *), void *data);
|
||||
void devm_remove_action(struct device *dev, void (*action)(void *), void *data);
|
||||
|
||||
+/**
|
||||
+ * devm_alloc_percpu - Resource-managed alloc_percpu
|
||||
+ * @dev: Device to allocate per-cpu memory for
|
||||
+ * @type: Type to allocate per-cpu memory for
|
||||
+ *
|
||||
+ * Managed alloc_percpu. Per-cpu memory allocated with this function is
|
||||
+ * automatically freed on driver detach.
|
||||
+ *
|
||||
+ * RETURNS:
|
||||
+ * Pointer to allocated memory on success, NULL on failure.
|
||||
+ */
|
||||
+#define devm_alloc_percpu(dev, type) \
|
||||
+ (typeof(type) __percpu *)__devm_alloc_percpu(dev, sizeof(type), \
|
||||
+ __alignof__(type))
|
||||
+
|
||||
+void __percpu *__devm_alloc_percpu(struct device *dev, size_t size,
|
||||
+ size_t align);
|
||||
+void devm_free_percpu(struct device *dev, void __percpu *pdata);
|
||||
+
|
||||
struct device_dma_parameters {
|
||||
/*
|
||||
* a low level driver may set these to teach IOMMU code about
|
|
@ -0,0 +1,59 @@
|
|||
From abc24ef7a69f54c3317beea98078831ba9bfa2cd Mon Sep 17 00:00:00 2001
|
||||
From: Madalin Bucur <madalin.bucur@freescale.com>
|
||||
Date: Tue, 5 Jan 2016 12:12:07 +0200
|
||||
Subject: [PATCH 19/70] net: readd skb_recycle()
|
||||
|
||||
Adding back skb_recycle() as it's used by the DPAA Ethernet driver.
|
||||
This was removed from the upstream kernel because it was lacking users.
|
||||
|
||||
Signed-off-by: Madalin Bucur <madalin.bucur@freescale.com>
|
||||
---
|
||||
include/linux/skbuff.h | 1 +
|
||||
net/core/skbuff.c | 26 ++++++++++++++++++++++++++
|
||||
2 files changed, 27 insertions(+)
|
||||
|
||||
--- a/include/linux/skbuff.h
|
||||
+++ b/include/linux/skbuff.h
|
||||
@@ -799,6 +799,7 @@ void kfree_skb(struct sk_buff *skb);
|
||||
void kfree_skb_list(struct sk_buff *segs);
|
||||
void skb_tx_error(struct sk_buff *skb);
|
||||
void consume_skb(struct sk_buff *skb);
|
||||
+void skb_recycle(struct sk_buff *skb);
|
||||
void __kfree_skb(struct sk_buff *skb);
|
||||
extern struct kmem_cache *skbuff_head_cache;
|
||||
|
||||
--- a/net/core/skbuff.c
|
||||
+++ b/net/core/skbuff.c
|
||||
@@ -766,6 +766,32 @@ void consume_skb(struct sk_buff *skb)
|
||||
}
|
||||
EXPORT_SYMBOL(consume_skb);
|
||||
|
||||
+/**
|
||||
+ * skb_recycle - clean up an skb for reuse
|
||||
+ * @skb: buffer
|
||||
+ *
|
||||
+ * Recycles the skb to be reused as a receive buffer. This
|
||||
+ * function does any necessary reference count dropping, and
|
||||
+ * cleans up the skbuff as if it just came from __alloc_skb().
|
||||
+ */
|
||||
+void skb_recycle(struct sk_buff *skb)
|
||||
+{
|
||||
+ struct skb_shared_info *shinfo;
|
||||
+ u8 head_frag = skb->head_frag;
|
||||
+
|
||||
+ skb_release_head_state(skb);
|
||||
+
|
||||
+ shinfo = skb_shinfo(skb);
|
||||
+ memset(shinfo, 0, offsetof(struct skb_shared_info, dataref));
|
||||
+ atomic_set(&shinfo->dataref, 1);
|
||||
+
|
||||
+ memset(skb, 0, offsetof(struct sk_buff, tail));
|
||||
+ skb->data = skb->head + NET_SKB_PAD;
|
||||
+ skb->head_frag = head_frag;
|
||||
+ skb_reset_tail_pointer(skb);
|
||||
+}
|
||||
+EXPORT_SYMBOL(skb_recycle);
|
||||
+
|
||||
/* Make sure a field is enclosed inside headers_start/headers_end section */
|
||||
#define CHECK_SKB_FIELD(field) \
|
||||
BUILD_BUG_ON(offsetof(struct sk_buff, field) < \
|
|
@ -0,0 +1,40 @@
|
|||
From 608986fc6b41633753701d5df9c1ab6a13856608 Mon Sep 17 00:00:00 2001
|
||||
From: Madalin Bucur <madalin.bucur@freescale.com>
|
||||
Date: Mon, 11 Jul 2016 14:14:15 +0800
|
||||
Subject: [PATCH 20/70] net: add custom NETIF flags
|
||||
|
||||
commit 6a53650c0c4513429d91e6ad7253340f3d3b9da5
|
||||
[context adjustment]
|
||||
|
||||
These flags are used by DPAA Ethernet to impose different behaviors
|
||||
in the networking stack.
|
||||
|
||||
Signed-off-by: Bogdan Hamciuc <bogdan.hamciuc@freescale.com>
|
||||
Signed-off-by: Madalin Bucur <madalin.bucur@freescale.com>
|
||||
Integrated-by: Zhao Qiang <qiang.zhao@nxp.com>
|
||||
---
|
||||
include/linux/netdev_features.h | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
--- a/include/linux/netdev_features.h
|
||||
+++ b/include/linux/netdev_features.h
|
||||
@@ -66,6 +66,9 @@ enum {
|
||||
NETIF_F_HW_VLAN_STAG_FILTER_BIT,/* Receive filtering on VLAN STAGs */
|
||||
NETIF_F_HW_L2FW_DOFFLOAD_BIT, /* Allow L2 Forwarding in Hardware */
|
||||
NETIF_F_BUSY_POLL_BIT, /* Busy poll */
|
||||
+ /* Freescale DPA support */
|
||||
+ NETIF_F_HW_QDISC_BIT, /* Supports hardware Qdisc */
|
||||
+ NETIF_F_HW_ACCEL_MQ_BIT, /* Hardware-accelerated multiqueue */
|
||||
|
||||
/*
|
||||
* Add your fresh new feature above and remember to update
|
||||
@@ -124,6 +127,9 @@ enum {
|
||||
#define NETIF_F_HW_VLAN_STAG_TX __NETIF_F(HW_VLAN_STAG_TX)
|
||||
#define NETIF_F_HW_L2FW_DOFFLOAD __NETIF_F(HW_L2FW_DOFFLOAD)
|
||||
#define NETIF_F_BUSY_POLL __NETIF_F(BUSY_POLL)
|
||||
+/* Freescale DPA support */
|
||||
+#define NETIF_F_HW_QDISC __NETIF_F(HW_QDISC)
|
||||
+#define NETIF_F_HW_ACCEL_MQ __NETIF_F(HW_ACCEL_MQ)
|
||||
|
||||
#define for_each_netdev_feature(mask_addr, bit) \
|
||||
for_each_set_bit(bit, (unsigned long *)mask_addr, NETDEV_FEATURE_COUNT)
|
|
@ -0,0 +1,48 @@
|
|||
From 6aa1eca98ca44f515e10d8058d0ff6db3c8a3c11 Mon Sep 17 00:00:00 2001
|
||||
From: Bogdan Hamciuc <bogdan.hamciuc@freescale.com>
|
||||
Date: Fri, 28 Sep 2012 17:04:33 +0300
|
||||
Subject: [PATCH 21/70] net: Make the netdev watchdog aware of hardware
|
||||
multiqueue devices
|
||||
|
||||
If the netdev declares the NETIF_F_HW_ACCEL_MQ (accelerated multiqueue)
|
||||
capability, tell the watchdog to consider the per-netdev trans_start
|
||||
field rather than any individual multiqueue's timestamp. That is
|
||||
justified by the fact that queues only go in and out of congestion
|
||||
in groups, not individually, as far as the net device is concerned.
|
||||
|
||||
Change-Id: I07a6693bf1f0bb1e9396c5e232452223a511ecc1
|
||||
Signed-off-by: Bogdan Hamciuc <bogdan.hamciuc@freescale.com>
|
||||
Reviewed-on: http://git.am.freescale.net:8181/1033
|
||||
Reviewed-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com>
|
||||
Tested-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com>
|
||||
---
|
||||
net/sched/sch_generic.c | 17 ++++++++++++++++-
|
||||
1 file changed, 16 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/net/sched/sch_generic.c
|
||||
+++ b/net/sched/sch_generic.c
|
||||
@@ -290,8 +290,23 @@ static void dev_watchdog(unsigned long a
|
||||
txq = netdev_get_tx_queue(dev, i);
|
||||
/*
|
||||
* old device drivers set dev->trans_start
|
||||
+ *
|
||||
+ * (Actually, not only "old" devices, but also
|
||||
+ * those which perform queue management in a
|
||||
+ * separate hw accelerator. So even though the
|
||||
+ * net device itself is single-queued, it makes
|
||||
+ * sense (and is safe, too) to use kernel's
|
||||
+ * multiqueue interface, specifically to avoid
|
||||
+ * unnecessary device locking in SMP systems.
|
||||
+ * In this case, we ought to consider not an
|
||||
+ * individual txq's timestamp as a congestion
|
||||
+ * indicator, but the "old" per-netdev field.)
|
||||
*/
|
||||
- trans_start = txq->trans_start ? : dev->trans_start;
|
||||
+ if (dev->features & NETIF_F_HW_ACCEL_MQ)
|
||||
+ trans_start = dev->trans_start;
|
||||
+ else
|
||||
+ trans_start = txq->trans_start ? :
|
||||
+ dev->trans_start;
|
||||
if (netif_xmit_stopped(txq) &&
|
||||
time_after(jiffies, (trans_start +
|
||||
dev->watchdog_timeo))) {
|
|
@ -0,0 +1,59 @@
|
|||
From 2dcd28f7b4f5b92686da45f4ec46802026fb8573 Mon Sep 17 00:00:00 2001
|
||||
From: Roy Pledge <Roy.Pledge@freescale.com>
|
||||
Date: Mon, 11 Jul 2016 14:34:59 +0800
|
||||
Subject: [PATCH 24/70] Add APIs to setup HugeTLB mappings for USDPAA
|
||||
|
||||
commit 189653d40d5dc41b8bd4cfb61f766bd8a89b1e34
|
||||
[context adjustment]
|
||||
|
||||
Signed-off-by: Zhao Qiang <qiang.zhao@nxp.com>
|
||||
---
|
||||
arch/powerpc/mm/fsl_booke_mmu.c | 14 +++++++++++++-
|
||||
arch/powerpc/mm/mmu_decl.h | 6 ++++++
|
||||
2 files changed, 19 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/powerpc/mm/fsl_booke_mmu.c
|
||||
+++ b/arch/powerpc/mm/fsl_booke_mmu.c
|
||||
@@ -105,7 +105,7 @@ unsigned long p_mapped_by_tlbcam(phys_ad
|
||||
* an unsigned long (for example, 32-bit implementations cannot support a 4GB
|
||||
* size).
|
||||
*/
|
||||
-static void settlbcam(int index, unsigned long virt, phys_addr_t phys,
|
||||
+void settlbcam(int index, unsigned long virt, phys_addr_t phys,
|
||||
unsigned long size, unsigned long flags, unsigned int pid)
|
||||
{
|
||||
unsigned int tsize;
|
||||
@@ -143,6 +143,18 @@ static void settlbcam(int index, unsigne
|
||||
tlbcam_addrs[index].phys = phys;
|
||||
}
|
||||
|
||||
+void cleartlbcam(unsigned long virt, unsigned int pid)
|
||||
+{
|
||||
+ int i = 0;
|
||||
+ for (i = 0; i < NUM_TLBCAMS; i++) {
|
||||
+ if (tlbcam_addrs[i].start == virt) {
|
||||
+ TLBCAM[i].MAS1 = 0;
|
||||
+ loadcam_entry(i);
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
unsigned long calc_cam_sz(unsigned long ram, unsigned long virt,
|
||||
phys_addr_t phys)
|
||||
{
|
||||
--- a/arch/powerpc/mm/mmu_decl.h
|
||||
+++ b/arch/powerpc/mm/mmu_decl.h
|
||||
@@ -91,6 +91,12 @@ extern void _tlbia(void);
|
||||
|
||||
#endif /* CONFIG_PPC_MMU_NOHASH */
|
||||
|
||||
+void settlbcam(int index, unsigned long virt, phys_addr_t phys,
|
||||
+ unsigned long size, unsigned long flags, unsigned int pid);
|
||||
+
|
||||
+void cleartlbcam(unsigned long virt, unsigned int pid);
|
||||
+
|
||||
+
|
||||
#ifdef CONFIG_PPC32
|
||||
|
||||
extern void mapin_ram(void);
|
|
@ -0,0 +1,228 @@
|
|||
From afcfdda960da9d9ad4c4d21c7dd0cc7791cf36c7 Mon Sep 17 00:00:00 2001
|
||||
From: Madalin Bucur <madalin.bucur@freescale.com>
|
||||
Date: Wed, 4 May 2016 19:24:53 +0300
|
||||
Subject: [PATCH 29/70] fmd: SGMII PCS needs to be reprogrammed after sleep
|
||||
|
||||
Signed-off-by: Madalin Bucur <madalin.bucur@freescale.com>
|
||||
---
|
||||
drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.c | 6 ++
|
||||
.../freescale/sdk_fman/Peripherals/FM/MAC/dtsec.c | 1 +
|
||||
.../freescale/sdk_fman/Peripherals/FM/MAC/fm_mac.c | 12 ++++
|
||||
.../freescale/sdk_fman/Peripherals/FM/MAC/fm_mac.h | 1 +
|
||||
.../freescale/sdk_fman/Peripherals/FM/MAC/memac.c | 58 +++++++++++---------
|
||||
.../freescale/sdk_fman/Peripherals/FM/MAC/tgec.c | 1 +
|
||||
.../sdk_fman/inc/Peripherals/fm_mac_ext.h | 13 +++++
|
||||
.../sdk_fman/src/inc/wrapper/lnxwrp_fsl_fman.h | 2 +
|
||||
.../freescale/sdk_fman/src/wrapper/lnxwrp_fm.c | 14 +++++
|
||||
9 files changed, 83 insertions(+), 25 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.c
|
||||
+++ b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.c
|
||||
@@ -175,6 +175,12 @@ static int dpaa_resume(struct device *de
|
||||
priv = netdev_priv(net_dev);
|
||||
mac_dev = priv->mac_dev;
|
||||
|
||||
+ err = fm_mac_resume(mac_dev->get_mac_handle(mac_dev));
|
||||
+ if (err) {
|
||||
+ netdev_err(net_dev, "fm_mac_resume = %d\n", err);
|
||||
+ goto resume_failed;
|
||||
+ }
|
||||
+
|
||||
err = fm_port_resume(mac_dev->port_dev[TX]);
|
||||
if (err) {
|
||||
netdev_err(net_dev, "fm_port_resume(TX) = %d\n", err);
|
||||
--- a/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/dtsec.c
|
||||
+++ b/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/dtsec.c
|
||||
@@ -1371,6 +1371,7 @@ static void InitFmMacControllerDriver(t_
|
||||
|
||||
p_FmMacControllerDriver->f_FM_MAC_Enable = DtsecEnable;
|
||||
p_FmMacControllerDriver->f_FM_MAC_Disable = DtsecDisable;
|
||||
+ p_FmMacControllerDriver->f_FM_MAC_Resume = NULL;
|
||||
|
||||
p_FmMacControllerDriver->f_FM_MAC_SetException = DtsecSetException;
|
||||
|
||||
--- a/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/fm_mac.c
|
||||
+++ b/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/fm_mac.c
|
||||
@@ -299,6 +299,18 @@ t_Error FM_MAC_Disable (t_Handle h_FmMac
|
||||
RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
|
||||
}
|
||||
|
||||
+t_Error FM_MAC_Resume (t_Handle h_FmMac)
|
||||
+{
|
||||
+ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
|
||||
+
|
||||
+ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
|
||||
+
|
||||
+ if (p_FmMacControllerDriver->f_FM_MAC_Resume)
|
||||
+ return p_FmMacControllerDriver->f_FM_MAC_Resume(h_FmMac);
|
||||
+
|
||||
+ return E_OK;
|
||||
+}
|
||||
+
|
||||
/* ......................................................................... */
|
||||
|
||||
t_Error FM_MAC_Enable1588TimeStamp (t_Handle h_FmMac)
|
||||
--- a/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/fm_mac.h
|
||||
+++ b/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/fm_mac.h
|
||||
@@ -91,6 +91,7 @@ typedef struct {
|
||||
|
||||
t_Error (*f_FM_MAC_Enable) (t_Handle h_FmMac, e_CommMode mode);
|
||||
t_Error (*f_FM_MAC_Disable) (t_Handle h_FmMac, e_CommMode mode);
|
||||
+ t_Error (*f_FM_MAC_Resume) (t_Handle h_FmMac);
|
||||
t_Error (*f_FM_MAC_Enable1588TimeStamp) (t_Handle h_FmMac);
|
||||
t_Error (*f_FM_MAC_Disable1588TimeStamp) (t_Handle h_FmMac);
|
||||
t_Error (*f_FM_MAC_Reset) (t_Handle h_FmMac, bool wait);
|
||||
--- a/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/memac.c
|
||||
+++ b/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/memac.c
|
||||
@@ -812,6 +812,37 @@ static uint16_t MemacGetMaxFrameLength(t
|
||||
return fman_memac_get_max_frame_len(p_Memac->p_MemMap);
|
||||
}
|
||||
|
||||
+static t_Error MemacInitInternalPhy(t_Handle h_Memac)
|
||||
+{
|
||||
+ t_Memac *p_Memac = (t_Memac *)h_Memac;
|
||||
+ uint8_t i, phyAddr;
|
||||
+
|
||||
+ if (ENET_INTERFACE_FROM_MODE(p_Memac->enetMode) == e_ENET_IF_SGMII)
|
||||
+ {
|
||||
+ /* Configure internal SGMII PHY */
|
||||
+ if (p_Memac->enetMode & ENET_IF_SGMII_BASEX)
|
||||
+ SetupSgmiiInternalPhyBaseX(p_Memac, PHY_MDIO_ADDR);
|
||||
+ else
|
||||
+ SetupSgmiiInternalPhy(p_Memac, PHY_MDIO_ADDR);
|
||||
+ }
|
||||
+ else if (ENET_INTERFACE_FROM_MODE(p_Memac->enetMode) == e_ENET_IF_QSGMII)
|
||||
+ {
|
||||
+ /* Configure 4 internal SGMII PHYs */
|
||||
+ for (i = 0; i < 4; i++)
|
||||
+ {
|
||||
+ /* QSGMII PHY address occupies 3 upper bits of 5-bit
|
||||
+ phyAddress; the lower 2 bits are used to extend
|
||||
+ register address space and access each one of 4
|
||||
+ ports inside QSGMII. */
|
||||
+ phyAddr = (uint8_t)((PHY_MDIO_ADDR << 2) | i);
|
||||
+ if (p_Memac->enetMode & ENET_IF_SGMII_BASEX)
|
||||
+ SetupSgmiiInternalPhyBaseX(p_Memac, phyAddr);
|
||||
+ else
|
||||
+ SetupSgmiiInternalPhy(p_Memac, phyAddr);
|
||||
+ }
|
||||
+ }
|
||||
+ return E_OK;
|
||||
+}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* mEMAC Init & Free API */
|
||||
@@ -825,7 +856,6 @@ static t_Error MemacInit(t_Handle h_Mema
|
||||
struct memac_cfg *p_MemacDriverParam;
|
||||
enum enet_interface enet_interface;
|
||||
enum enet_speed enet_speed;
|
||||
- uint8_t i, phyAddr;
|
||||
t_EnetAddr ethAddr;
|
||||
e_FmMacType portType;
|
||||
t_Error err;
|
||||
@@ -887,30 +917,7 @@ static t_Error MemacInit(t_Handle h_Mema
|
||||
}
|
||||
#endif /* FM_RX_FIFO_CORRUPT_ERRATA_10GMAC_A006320 */
|
||||
|
||||
- if (ENET_INTERFACE_FROM_MODE(p_Memac->enetMode) == e_ENET_IF_SGMII)
|
||||
- {
|
||||
- /* Configure internal SGMII PHY */
|
||||
- if (p_Memac->enetMode & ENET_IF_SGMII_BASEX)
|
||||
- SetupSgmiiInternalPhyBaseX(p_Memac, PHY_MDIO_ADDR);
|
||||
- else
|
||||
- SetupSgmiiInternalPhy(p_Memac, PHY_MDIO_ADDR);
|
||||
- }
|
||||
- else if (ENET_INTERFACE_FROM_MODE(p_Memac->enetMode) == e_ENET_IF_QSGMII)
|
||||
- {
|
||||
- /* Configure 4 internal SGMII PHYs */
|
||||
- for (i = 0; i < 4; i++)
|
||||
- {
|
||||
- /* QSGMII PHY address occupies 3 upper bits of 5-bit
|
||||
- phyAddress; the lower 2 bits are used to extend
|
||||
- register address space and access each one of 4
|
||||
- ports inside QSGMII. */
|
||||
- phyAddr = (uint8_t)((PHY_MDIO_ADDR << 2) | i);
|
||||
- if (p_Memac->enetMode & ENET_IF_SGMII_BASEX)
|
||||
- SetupSgmiiInternalPhyBaseX(p_Memac, phyAddr);
|
||||
- else
|
||||
- SetupSgmiiInternalPhy(p_Memac, phyAddr);
|
||||
- }
|
||||
- }
|
||||
+ MemacInitInternalPhy(h_Memac);
|
||||
|
||||
/* Max Frame Length */
|
||||
err = FmSetMacMaxFrame(p_Memac->fmMacControllerDriver.h_Fm,
|
||||
@@ -1008,6 +1015,7 @@ static void InitFmMacControllerDriver(t_
|
||||
|
||||
p_FmMacControllerDriver->f_FM_MAC_Enable = MemacEnable;
|
||||
p_FmMacControllerDriver->f_FM_MAC_Disable = MemacDisable;
|
||||
+ p_FmMacControllerDriver->f_FM_MAC_Resume = MemacInitInternalPhy;
|
||||
|
||||
p_FmMacControllerDriver->f_FM_MAC_SetTxAutoPauseFrames = MemacSetTxAutoPauseFrames;
|
||||
p_FmMacControllerDriver->f_FM_MAC_SetTxPauseFrames = MemacSetTxPauseFrames;
|
||||
--- a/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/tgec.c
|
||||
+++ b/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/tgec.c
|
||||
@@ -897,6 +897,7 @@ static void InitFmMacControllerDriver(t_
|
||||
|
||||
p_FmMacControllerDriver->f_FM_MAC_Enable = TgecEnable;
|
||||
p_FmMacControllerDriver->f_FM_MAC_Disable = TgecDisable;
|
||||
+ p_FmMacControllerDriver->f_FM_MAC_Resume = NULL;
|
||||
|
||||
p_FmMacControllerDriver->f_FM_MAC_SetTxAutoPauseFrames = TgecTxMacPause;
|
||||
p_FmMacControllerDriver->f_FM_MAC_SetTxPauseFrames = TgecSetTxPauseFrames;
|
||||
--- a/drivers/net/ethernet/freescale/sdk_fman/inc/Peripherals/fm_mac_ext.h
|
||||
+++ b/drivers/net/ethernet/freescale/sdk_fman/inc/Peripherals/fm_mac_ext.h
|
||||
@@ -467,6 +467,19 @@ t_Error FM_MAC_Enable(t_Handle h_FmMac,
|
||||
t_Error FM_MAC_Disable(t_Handle h_FmMac, e_CommMode mode);
|
||||
|
||||
/**************************************************************************//**
|
||||
+ @Function FM_MAC_Resume
|
||||
+
|
||||
+ @Description Re-init the MAC after suspend
|
||||
+
|
||||
+ @Param[in] h_FmMac A handle to a FM MAC Module.
|
||||
+
|
||||
+ @Return E_OK on success; Error code otherwise.
|
||||
+
|
||||
+ @Cautions Allowed only following FM_MAC_Init().
|
||||
+*//***************************************************************************/
|
||||
+t_Error FM_MAC_Resume(t_Handle h_FmMac);
|
||||
+
|
||||
+/**************************************************************************//**
|
||||
@Function FM_MAC_Enable1588TimeStamp
|
||||
|
||||
@Description Enables the TSU operation.
|
||||
--- a/drivers/net/ethernet/freescale/sdk_fman/src/inc/wrapper/lnxwrp_fsl_fman.h
|
||||
+++ b/drivers/net/ethernet/freescale/sdk_fman/src/inc/wrapper/lnxwrp_fsl_fman.h
|
||||
@@ -765,6 +765,8 @@ int fm_mac_enable(struct fm_mac_dev *fm_
|
||||
|
||||
int fm_mac_disable(struct fm_mac_dev *fm_mac_dev);
|
||||
|
||||
+int fm_mac_resume(struct fm_mac_dev *fm_mac_dev);
|
||||
+
|
||||
int fm_mac_set_promiscuous(struct fm_mac_dev *fm_mac_dev,
|
||||
bool enable);
|
||||
|
||||
--- a/drivers/net/ethernet/freescale/sdk_fman/src/wrapper/lnxwrp_fm.c
|
||||
+++ b/drivers/net/ethernet/freescale/sdk_fman/src/wrapper/lnxwrp_fm.c
|
||||
@@ -1733,6 +1733,20 @@ int fm_mac_disable(struct fm_mac_dev *fm
|
||||
}
|
||||
EXPORT_SYMBOL(fm_mac_disable);
|
||||
|
||||
+int fm_mac_resume(struct fm_mac_dev *fm_mac_dev)
|
||||
+{
|
||||
+ int _errno;
|
||||
+ t_Error err;
|
||||
+
|
||||
+ err = FM_MAC_Resume(fm_mac_dev);
|
||||
+ _errno = -GET_ERROR_TYPE(err);
|
||||
+ if (unlikely(_errno < 0))
|
||||
+ pr_err("FM_MAC_Resume() = 0x%08x\n", err);
|
||||
+
|
||||
+ return _errno;
|
||||
+}
|
||||
+EXPORT_SYMBOL(fm_mac_resume);
|
||||
+
|
||||
int fm_mac_set_promiscuous(struct fm_mac_dev *fm_mac_dev,
|
||||
bool enable)
|
||||
{
|
|
@ -0,0 +1,178 @@
|
|||
From c86be7b4f9ca4f4c8c916a9c350edbcd0e86a528 Mon Sep 17 00:00:00 2001
|
||||
From: Madalin Bucur <madalin.bucur@freescale.com>
|
||||
Date: Mon, 18 Apr 2016 16:41:59 +0300
|
||||
Subject: [PATCH 30/70] fmd: use kernel api for 64bit division
|
||||
|
||||
Signed-off-by: Madalin Bucur <madalin.bucur@freescale.com>
|
||||
---
|
||||
.../freescale/sdk_fman/Peripherals/FM/Pcd/fm_cc.c | 1 +
|
||||
.../sdk_fman/Peripherals/FM/Pcd/fm_plcr.c | 5 +++--
|
||||
.../freescale/sdk_fman/Peripherals/FM/Pcd/fm_prs.c | 1 +
|
||||
.../freescale/sdk_fman/Peripherals/FM/Rtc/fm_rtc.c | 12 ++++++------
|
||||
.../freescale/sdk_fman/Peripherals/FM/fm.c | 5 +++--
|
||||
.../freescale/sdk_fman/Peripherals/FM/fman.c | 7 +++----
|
||||
.../net/ethernet/freescale/sdk_fman/inc/math_ext.h | 1 +
|
||||
.../net/ethernet/freescale/sdk_fman/inc/ncsw_ext.h | 2 +-
|
||||
8 files changed, 19 insertions(+), 15 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/Pcd/fm_cc.c
|
||||
+++ b/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/Pcd/fm_cc.c
|
||||
@@ -36,6 +36,7 @@
|
||||
|
||||
@Description FM Coarse Classifier implementation
|
||||
*//***************************************************************************/
|
||||
+#include <linux/math64.h>
|
||||
#include "std_ext.h"
|
||||
#include "error_ext.h"
|
||||
#include "string_ext.h"
|
||||
--- a/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/Pcd/fm_plcr.c
|
||||
+++ b/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/Pcd/fm_plcr.c
|
||||
@@ -36,6 +36,7 @@
|
||||
|
||||
@Description FM PCD POLICER...
|
||||
*//***************************************************************************/
|
||||
+#include <linux/math64.h>
|
||||
#include "std_ext.h"
|
||||
#include "error_ext.h"
|
||||
#include "string_ext.h"
|
||||
@@ -205,13 +206,13 @@ static void GetInfoRateReg(e_FmPcdPlcrRa
|
||||
div = 1000000000; /* nano */
|
||||
div *= 10; /* 10 nano */
|
||||
}
|
||||
- *p_Integer = (tmp<<fppShift)/div;
|
||||
+ *p_Integer = div64_u64(tmp<<fppShift, div);
|
||||
|
||||
/* for calculating the fraction, we will recalculate cir and deduct the integer.
|
||||
* For precision, we will multiply by 2^16. we do not divid back, since we write
|
||||
* this value as fraction - see spec.
|
||||
*/
|
||||
- *p_Fraction = (((tmp<<fppShift)<<16) - ((*p_Integer<<16)*div))/div;
|
||||
+ *p_Fraction = div64_u64(((tmp<<fppShift)<<16) - ((*p_Integer<<16)*div), div);
|
||||
}
|
||||
|
||||
/* .......... */
|
||||
--- a/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/Pcd/fm_prs.c
|
||||
+++ b/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/Pcd/fm_prs.c
|
||||
@@ -36,6 +36,7 @@
|
||||
|
||||
@Description FM PCD ...
|
||||
*//***************************************************************************/
|
||||
+#include <linux/math64.h>
|
||||
#include "std_ext.h"
|
||||
#include "error_ext.h"
|
||||
#include "string_ext.h"
|
||||
--- a/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/Rtc/fm_rtc.c
|
||||
+++ b/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/Rtc/fm_rtc.c
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
@Cautions None
|
||||
*//***************************************************************************/
|
||||
-
|
||||
+#include <linux/math64.h>
|
||||
#include "error_ext.h"
|
||||
#include "debug_ext.h"
|
||||
#include "string_ext.h"
|
||||
@@ -470,11 +470,11 @@ t_Error FM_RTC_SetAlarm(t_Handle h_FmRtc
|
||||
RETURN_ERROR(MAJOR, E_INVALID_SELECTION,
|
||||
("Alarm time must be equal or larger than RTC period - %d nanoseconds",
|
||||
p_Rtc->clockPeriodNanoSec));
|
||||
- if (p_FmRtcAlarmParams->alarmTime % (uint64_t)p_Rtc->clockPeriodNanoSec)
|
||||
+ tmpAlarm = p_FmRtcAlarmParams->alarmTime;
|
||||
+ if (do_div(tmpAlarm, p_Rtc->clockPeriodNanoSec))
|
||||
RETURN_ERROR(MAJOR, E_INVALID_SELECTION,
|
||||
("Alarm time must be a multiple of RTC period - %d nanoseconds",
|
||||
p_Rtc->clockPeriodNanoSec));
|
||||
- tmpAlarm = p_FmRtcAlarmParams->alarmTime/(uint64_t)p_Rtc->clockPeriodNanoSec;
|
||||
|
||||
if (p_FmRtcAlarmParams->f_AlarmCallback)
|
||||
{
|
||||
@@ -508,11 +508,11 @@ t_Error FM_RTC_SetPeriodicPulse(t_Handle
|
||||
RETURN_ERROR(MAJOR, E_INVALID_SELECTION,
|
||||
("Periodic pulse must be equal or larger than RTC period - %d nanoseconds",
|
||||
p_Rtc->clockPeriodNanoSec));
|
||||
- if (p_FmRtcPeriodicPulseParams->periodicPulsePeriod % (uint64_t)p_Rtc->clockPeriodNanoSec)
|
||||
+ tmpFiper = p_FmRtcPeriodicPulseParams->periodicPulsePeriod;
|
||||
+ if (do_div(tmpFiper, p_Rtc->clockPeriodNanoSec))
|
||||
RETURN_ERROR(MAJOR, E_INVALID_SELECTION,
|
||||
("Periodic pulse must be a multiple of RTC period - %d nanoseconds",
|
||||
p_Rtc->clockPeriodNanoSec));
|
||||
- tmpFiper = p_FmRtcPeriodicPulseParams->periodicPulsePeriod/(uint64_t)p_Rtc->clockPeriodNanoSec;
|
||||
if (tmpFiper & 0xffffffff00000000LL)
|
||||
RETURN_ERROR(MAJOR, E_INVALID_SELECTION,
|
||||
("Periodic pulse/RTC Period must be smaller than 4294967296",
|
||||
@@ -628,7 +628,7 @@ t_Error FM_RTC_SetCurrentTime(t_Handle h
|
||||
SANITY_CHECK_RETURN_ERROR(p_Rtc, E_INVALID_HANDLE);
|
||||
SANITY_CHECK_RETURN_ERROR(!p_Rtc->p_RtcDriverParam, E_INVALID_STATE);
|
||||
|
||||
- ts = ts/p_Rtc->clockPeriodNanoSec;
|
||||
+ do_div(ts, p_Rtc->clockPeriodNanoSec);
|
||||
fman_rtc_set_timer(p_Rtc->p_MemMap, (int64_t)ts);
|
||||
|
||||
return E_OK;
|
||||
--- a/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/fm.c
|
||||
+++ b/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/fm.c
|
||||
@@ -43,6 +43,7 @@
|
||||
#include "sprint_ext.h"
|
||||
#include "debug_ext.h"
|
||||
#include "fm_muram_ext.h"
|
||||
+#include <linux/math64.h>
|
||||
|
||||
#include "fm_common.h"
|
||||
#include "fm_ipc.h"
|
||||
@@ -5087,9 +5088,9 @@ t_Error FM_CtrlMonGetCounters(t_Handle h
|
||||
effValue = (uint64_t)
|
||||
((uint64_t)GET_UINT32(p_MonRegs->tpc2h) << 32 | GET_UINT32(p_MonRegs->tpc2l));
|
||||
|
||||
- p_Mon->percentCnt[0] = (uint8_t)((clkCnt - utilValue) * 100 / clkCnt);
|
||||
+ p_Mon->percentCnt[0] = (uint8_t)div64_u64((clkCnt - utilValue) * 100, clkCnt);
|
||||
if (clkCnt != utilValue)
|
||||
- p_Mon->percentCnt[1] = (uint8_t)(((clkCnt - utilValue) - effValue) * 100 / (clkCnt - utilValue));
|
||||
+ p_Mon->percentCnt[1] = (uint8_t)div64_u64(((clkCnt - utilValue) - effValue) * 100, clkCnt - utilValue);
|
||||
else
|
||||
p_Mon->percentCnt[1] = 0;
|
||||
|
||||
--- a/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/fman.c
|
||||
+++ b/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/fman.c
|
||||
@@ -31,7 +31,7 @@
|
||||
*/
|
||||
|
||||
|
||||
-
|
||||
+#include <linux/math64.h>
|
||||
#include "fsl_fman.h"
|
||||
#include "dpaa_integration_ext.h"
|
||||
|
||||
@@ -186,10 +186,9 @@ void fman_enable_time_stamp(struct fman_
|
||||
* we do not div back, since we write this value as a fraction
|
||||
* see spec */
|
||||
|
||||
- frac = (((uint64_t)ts_freq << 16) - ((uint64_t)intgr << 16) * fm_clk_freq)
|
||||
- / fm_clk_freq;
|
||||
+ frac = ((uint64_t)ts_freq << 16) - ((uint64_t)intgr << 16) * fm_clk_freq;
|
||||
/* we check remainder of the division in order to round up if not int */
|
||||
- if (((ts_freq << 16) - (intgr << 16)*fm_clk_freq) % fm_clk_freq)
|
||||
+ if (do_div(frac, fm_clk_freq))
|
||||
frac++;
|
||||
|
||||
tmp = (intgr << FPM_TS_INT_SHIFT) | (uint16_t)frac;
|
||||
--- a/drivers/net/ethernet/freescale/sdk_fman/inc/math_ext.h
|
||||
+++ b/drivers/net/ethernet/freescale/sdk_fman/inc/math_ext.h
|
||||
@@ -37,6 +37,7 @@
|
||||
|
||||
#if defined(NCSW_LINUX) && defined(__KERNEL__)
|
||||
#include <linux/math.h>
|
||||
+#include <linux/math64.h>
|
||||
|
||||
#elif defined(__MWERKS__)
|
||||
#define LOW(x) ( sizeof(x)==8 ? *(1+(int32_t*)&x) : (*(int32_t*)&x))
|
||||
--- a/drivers/net/ethernet/freescale/sdk_fman/inc/ncsw_ext.h
|
||||
+++ b/drivers/net/ethernet/freescale/sdk_fman/inc/ncsw_ext.h
|
||||
@@ -142,7 +142,7 @@ do
|
||||
} while (0)
|
||||
|
||||
/* Ceiling division - not the fastest way, but safer in terms of overflow */
|
||||
-#define DIV_CEIL(x,y) (((x)/(y)) + ((((((x)/(y)))*(y)) == (x)) ? 0 : 1))
|
||||
+#define DIV_CEIL(x,y) (div64_u64((x),(y)) + (((div64_u64((x),(y))*(y)) == (x)) ? 0 : 1))
|
||||
|
||||
/* Round up a number to be a multiple of a second number */
|
||||
#define ROUND_UP(x,y) ((((x) + (y) - 1) / (y)) * (y))
|
|
@ -0,0 +1,31 @@
|
|||
From d0a7d97bdfb7a755d55bb53725d71f81aab90fe7 Mon Sep 17 00:00:00 2001
|
||||
From: Roy Pledge <Roy.Pledge@freescale.com>
|
||||
Date: Thu, 14 Apr 2016 10:21:02 +0800
|
||||
Subject: [PATCH 31/70] fsl_qbman: Enable DPAA1 QBMan for ARM64 platforms
|
||||
|
||||
commit ddb0ae0f9d638efc70402d4fb570bca3a3178091
|
||||
[context adjustment]
|
||||
|
||||
Enable the QBMan device for ARM64 platofrms. This is needed for
|
||||
ARM based SoCs that have DPAA1 such as the LS1043A
|
||||
|
||||
Signed-off-by: Roy Pledge <Roy.Pledge@freescale.com>
|
||||
Integrated-by: Zhao Qiang <qiang.zhao@nxp.com>
|
||||
---
|
||||
arch/arm64/Kconfig | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
--- a/arch/arm64/Kconfig
|
||||
+++ b/arch/arm64/Kconfig
|
||||
@@ -187,6 +187,11 @@ source "arch/arm64/Kconfig.platforms"
|
||||
|
||||
menu "Bus support"
|
||||
|
||||
+config HAS_FSL_QBMAN
|
||||
+ bool "Datapath Acceleration Queue and Buffer management"
|
||||
+ help
|
||||
+ Datapath Acceleration Queue and Buffer management
|
||||
+
|
||||
config PCI
|
||||
bool "PCI support"
|
||||
help
|
|
@ -0,0 +1,22 @@
|
|||
From e555d24e5df9b2d5b8a613ff46af68fc3ff3a360 Mon Sep 17 00:00:00 2001
|
||||
From: Madalin Bucur <madalin.bucur@freescale.com>
|
||||
Date: Wed, 30 Mar 2016 16:12:33 +0300
|
||||
Subject: [PATCH 64/70] dpaa_eth: repair issue introduced with 2.5G support
|
||||
|
||||
Signed-off-by: Madalin Bucur <madalin.bucur@freescale.com>
|
||||
---
|
||||
drivers/net/ethernet/freescale/sdk_dpaa/mac.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/ethernet/freescale/sdk_dpaa/mac.c
|
||||
+++ b/drivers/net/ethernet/freescale/sdk_dpaa/mac.c
|
||||
@@ -346,7 +346,8 @@ static int __cold mac_probe(struct platf
|
||||
SUPPORTED_100baseT_Half);
|
||||
|
||||
/* Gigabit support (no half-duplex) */
|
||||
- if (mac_dev->max_speed == 1000)
|
||||
+ if (mac_dev->max_speed == SPEED_1000 ||
|
||||
+ mac_dev->max_speed == SPEED_2500)
|
||||
mac_dev->if_support |= SUPPORTED_1000baseT_Full;
|
||||
|
||||
/* The 10G interface only supports one mode */
|
|
@ -0,0 +1,39 @@
|
|||
From a768af05b1ffe644f54303036e5c048952e0f721 Mon Sep 17 00:00:00 2001
|
||||
From: Madalin Bucur <madalin.bucur@freescale.com>
|
||||
Date: Mon, 4 Apr 2016 20:23:21 +0300
|
||||
Subject: [PATCH 65/70] dpaa_eth: replace sgmii-2500 with qsgmii
|
||||
|
||||
Signed-off-by: Madalin Bucur <madalin.bucur@freescale.com>
|
||||
---
|
||||
drivers/net/ethernet/freescale/sdk_dpaa/mac.c | 6 ------
|
||||
1 file changed, 6 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/freescale/sdk_dpaa/mac.c
|
||||
+++ b/drivers/net/ethernet/freescale/sdk_dpaa/mac.c
|
||||
@@ -74,7 +74,6 @@ static const char phy_str[][11] = {
|
||||
[PHY_INTERFACE_MODE_RGMII_TXID] = "rgmii-txid",
|
||||
[PHY_INTERFACE_MODE_RTBI] = "rtbi",
|
||||
[PHY_INTERFACE_MODE_XGMII] = "xgmii",
|
||||
- [PHY_INTERFACE_MODE_QSGMII] = "sgmii-2500"
|
||||
};
|
||||
|
||||
static phy_interface_t __pure __attribute__((nonnull)) str2phy(const char *str)
|
||||
@@ -101,7 +100,6 @@ static const uint16_t phy2speed[] = {
|
||||
[PHY_INTERFACE_MODE_RGMII_TXID] = SPEED_1000,
|
||||
[PHY_INTERFACE_MODE_RTBI] = SPEED_1000,
|
||||
[PHY_INTERFACE_MODE_XGMII] = SPEED_10000,
|
||||
- [PHY_INTERFACE_MODE_QSGMII] = SPEED_2500
|
||||
};
|
||||
|
||||
static struct mac_device * __cold
|
||||
@@ -341,10 +339,6 @@ static int __cold mac_probe(struct platf
|
||||
mac_dev->if_support &= ~(SUPPORTED_10baseT_Half |
|
||||
SUPPORTED_100baseT_Half);
|
||||
|
||||
- if (strstr(char_prop, "sgmii-2500"))
|
||||
- mac_dev->if_support &= ~(SUPPORTED_10baseT_Half |
|
||||
- SUPPORTED_100baseT_Half);
|
||||
-
|
||||
/* Gigabit support (no half-duplex) */
|
||||
if (mac_dev->max_speed == SPEED_1000 ||
|
||||
mac_dev->max_speed == SPEED_2500)
|
|
@ -0,0 +1,38 @@
|
|||
From 95d12688fa875f7a00590aaf6de5f34d55531d68 Mon Sep 17 00:00:00 2001
|
||||
From: Madalin Bucur <madalin.bucur@freescale.com>
|
||||
Date: Thu, 14 Apr 2016 14:12:38 +0300
|
||||
Subject: [PATCH 66/70] fmd: add 2.5G SGMII mode suport
|
||||
|
||||
Signed-off-by: Madalin Bucur <madalin.bucur@freescale.com>
|
||||
---
|
||||
drivers/net/ethernet/freescale/sdk_dpaa/mac.c | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/ethernet/freescale/sdk_dpaa/mac.c
|
||||
+++ b/drivers/net/ethernet/freescale/sdk_dpaa/mac.c
|
||||
@@ -74,6 +74,7 @@ static const char phy_str[][11] = {
|
||||
[PHY_INTERFACE_MODE_RGMII_TXID] = "rgmii-txid",
|
||||
[PHY_INTERFACE_MODE_RTBI] = "rtbi",
|
||||
[PHY_INTERFACE_MODE_XGMII] = "xgmii",
|
||||
+ [PHY_INTERFACE_MODE_SGMII_2500] = "sgmii-2500",
|
||||
};
|
||||
|
||||
static phy_interface_t __pure __attribute__((nonnull)) str2phy(const char *str)
|
||||
@@ -100,6 +101,7 @@ static const uint16_t phy2speed[] = {
|
||||
[PHY_INTERFACE_MODE_RGMII_TXID] = SPEED_1000,
|
||||
[PHY_INTERFACE_MODE_RTBI] = SPEED_1000,
|
||||
[PHY_INTERFACE_MODE_XGMII] = SPEED_10000,
|
||||
+ [PHY_INTERFACE_MODE_SGMII_2500] = SPEED_2500,
|
||||
};
|
||||
|
||||
static struct mac_device * __cold
|
||||
@@ -335,7 +337,8 @@ static int __cold mac_probe(struct platf
|
||||
mac_dev->max_speed = mac_dev->speed;
|
||||
mac_dev->if_support = DTSEC_SUPPORTED;
|
||||
/* We don't support half-duplex in SGMII mode */
|
||||
- if (strstr(char_prop, "sgmii") || strstr(char_prop, "qsgmii"))
|
||||
+ if (strstr(char_prop, "sgmii") || strstr(char_prop, "qsgmii") ||
|
||||
+ strstr(char_prop, "sgmii-2500"))
|
||||
mac_dev->if_support &= ~(SUPPORTED_10baseT_Half |
|
||||
SUPPORTED_100baseT_Half);
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
From 6e4322d938f01f58156b0a5929daa648ecad4754 Mon Sep 17 00:00:00 2001
|
||||
From: Madalin Bucur <madalin.bucur@freescale.com>
|
||||
Date: Thu, 14 Apr 2016 12:03:52 +0300
|
||||
Subject: [PATCH 67/70] net: phy: add SGMII 2500 PHY
|
||||
|
||||
Signed-off-by: Madalin Bucur <madalin.bucur@freescale.com>
|
||||
---
|
||||
include/linux/phy.h | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/include/linux/phy.h
|
||||
+++ b/include/linux/phy.h
|
||||
@@ -77,6 +77,7 @@ typedef enum {
|
||||
PHY_INTERFACE_MODE_XGMII,
|
||||
PHY_INTERFACE_MODE_MOCA,
|
||||
PHY_INTERFACE_MODE_QSGMII,
|
||||
+ PHY_INTERFACE_MODE_SGMII_2500,
|
||||
PHY_INTERFACE_MODE_MAX,
|
||||
} phy_interface_t;
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
From f77f25498902f84d53a64a6397db2fa4b0d0dd4b Mon Sep 17 00:00:00 2001
|
||||
From: Shaohui Xie <Shaohui.Xie@nxp.com>
|
||||
Date: Thu, 31 Mar 2016 10:53:06 +0800
|
||||
Subject: [PATCH 68/70] dpaa_ethernet: fix link state detect for 10G interface
|
||||
|
||||
There are drivers to support 10G PHYs with copper interface, so we
|
||||
change binding between MAC and 10G PHY to use phy_state_machine to
|
||||
detect link state.
|
||||
|
||||
Signed-off-by: Shaohui Xie <Shaohui.Xie@nxp.com>
|
||||
---
|
||||
drivers/net/ethernet/freescale/sdk_dpaa/mac-api.c | 20 ++++++++------------
|
||||
1 file changed, 8 insertions(+), 12 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/freescale/sdk_dpaa/mac-api.c
|
||||
+++ b/drivers/net/ethernet/freescale/sdk_dpaa/mac-api.c
|
||||
@@ -279,20 +279,15 @@ static int __cold start(struct mac_devic
|
||||
|
||||
_errno = fm_mac_enable(mac_dev->get_mac_handle(mac_dev));
|
||||
|
||||
- if (!_errno && phy_dev) {
|
||||
- if (macdev2enetinterface(mac_dev) != e_ENET_MODE_XGMII_10000)
|
||||
- phy_start(phy_dev);
|
||||
- else if (phy_dev->drv->read_status)
|
||||
- phy_dev->drv->read_status(phy_dev);
|
||||
- }
|
||||
+ if (!_errno && phy_dev)
|
||||
+ phy_start(phy_dev);
|
||||
|
||||
return _errno;
|
||||
}
|
||||
|
||||
static int __cold stop(struct mac_device *mac_dev)
|
||||
{
|
||||
- if (mac_dev->phy_dev &&
|
||||
- (macdev2enetinterface(mac_dev) != e_ENET_MODE_XGMII_10000))
|
||||
+ if (mac_dev->phy_dev)
|
||||
phy_stop(mac_dev->phy_dev);
|
||||
|
||||
return fm_mac_disable(mac_dev->get_mac_handle(mac_dev));
|
||||
@@ -477,8 +472,8 @@ static int xgmac_init_phy(struct net_dev
|
||||
phy_dev = phy_attach(net_dev, mac_dev->fixed_bus_id,
|
||||
mac_dev->phy_if);
|
||||
else
|
||||
- phy_dev = of_phy_attach(net_dev, mac_dev->phy_node, 0,
|
||||
- mac_dev->phy_if);
|
||||
+ phy_dev = of_phy_connect(net_dev, mac_dev->phy_node,
|
||||
+ &adjust_link, 0, mac_dev->phy_if);
|
||||
if (unlikely(phy_dev == NULL) || IS_ERR(phy_dev)) {
|
||||
netdev_err(net_dev, "Could not attach to PHY %s\n",
|
||||
mac_dev->phy_node ?
|
||||
@@ -510,8 +505,9 @@ static int memac_init_phy(struct net_dev
|
||||
mac_dev->phy_dev = NULL;
|
||||
return 0;
|
||||
} else
|
||||
- phy_dev = of_phy_attach(net_dev, mac_dev->phy_node, 0,
|
||||
- mac_dev->phy_if);
|
||||
+ phy_dev = of_phy_connect(net_dev, mac_dev->phy_node,
|
||||
+ &adjust_link, 0,
|
||||
+ mac_dev->phy_if);
|
||||
} else {
|
||||
if (!mac_dev->phy_node)
|
||||
phy_dev = phy_connect(net_dev, mac_dev->fixed_bus_id,
|
|
@ -0,0 +1,274 @@
|
|||
From 8f3768a7c649526f821a6a4cd32cc44a8e7fa317 Mon Sep 17 00:00:00 2001
|
||||
From: Scott Wood <scottwood@freescale.com>
|
||||
Date: Fri, 15 Jan 2016 07:34:33 +0000
|
||||
Subject: [PATCH 26/70] cpufreq: qoriq: Don't look at clock implementation
|
||||
details
|
||||
|
||||
Get the CPU clock's potential parent clocks from the clock interface
|
||||
itself, rather than manually parsing the clocks property to find a
|
||||
phandle, looking at the clock-names property of that, and assuming that
|
||||
those are valid parent clocks for the cpu clock.
|
||||
|
||||
This is necessary now that the clocks are generated based on the clock
|
||||
driver's knowledge of the chip rather than a fragile device-tree
|
||||
description of the mux options.
|
||||
|
||||
We can now rely on the clock driver to ensure that the mux only exposes
|
||||
options that are valid. The cpufreq driver was currently being overly
|
||||
conservative in some cases -- for example, the "min_cpufreq =
|
||||
get_bus_freq()" restriction only applies to chips with erratum
|
||||
A-004510, and whether the freq_mask used on p5020 is needed depends on
|
||||
the actual frequencies of the PLLs (FWIW, p5040 has a similar
|
||||
limitation but its .freq_mask was zero) -- and the frequency mask
|
||||
mechanism made assumptions about particular parent clock indices that
|
||||
are no longer valid.
|
||||
|
||||
Signed-off-by: Scott Wood <scottwood@freescale.com>
|
||||
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
|
||||
---
|
||||
drivers/cpufreq/qoriq-cpufreq.c | 138 ++++++++++++---------------------------
|
||||
1 file changed, 41 insertions(+), 97 deletions(-)
|
||||
|
||||
--- a/drivers/cpufreq/qoriq-cpufreq.c
|
||||
+++ b/drivers/cpufreq/qoriq-cpufreq.c
|
||||
@@ -11,6 +11,7 @@
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#include <linux/clk.h>
|
||||
+#include <linux/clk-provider.h>
|
||||
#include <linux/cpufreq.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/init.h>
|
||||
@@ -35,53 +36,20 @@ struct cpu_data {
|
||||
struct cpufreq_frequency_table *table;
|
||||
};
|
||||
|
||||
+/*
|
||||
+ * Don't use cpufreq on this SoC -- used when the SoC would have otherwise
|
||||
+ * matched a more generic compatible.
|
||||
+ */
|
||||
+#define SOC_BLACKLIST 1
|
||||
+
|
||||
/**
|
||||
* struct soc_data - SoC specific data
|
||||
- * @freq_mask: mask the disallowed frequencies
|
||||
- * @flag: unique flags
|
||||
+ * @flags: SOC_xxx
|
||||
*/
|
||||
struct soc_data {
|
||||
- u32 freq_mask[4];
|
||||
- u32 flag;
|
||||
-};
|
||||
-
|
||||
-#define FREQ_MASK 1
|
||||
-/* see hardware specification for the allowed frqeuencies */
|
||||
-static const struct soc_data sdata[] = {
|
||||
- { /* used by p2041 and p3041 */
|
||||
- .freq_mask = {0x8, 0x8, 0x2, 0x2},
|
||||
- .flag = FREQ_MASK,
|
||||
- },
|
||||
- { /* used by p5020 */
|
||||
- .freq_mask = {0x8, 0x2},
|
||||
- .flag = FREQ_MASK,
|
||||
- },
|
||||
- { /* used by p4080, p5040 */
|
||||
- .freq_mask = {0},
|
||||
- .flag = 0,
|
||||
- },
|
||||
+ u32 flags;
|
||||
};
|
||||
|
||||
-/*
|
||||
- * the minimum allowed core frequency, in Hz
|
||||
- * for chassis v1.0, >= platform frequency
|
||||
- * for chassis v2.0, >= platform frequency / 2
|
||||
- */
|
||||
-static u32 min_cpufreq;
|
||||
-static const u32 *fmask;
|
||||
-
|
||||
-#if defined(CONFIG_ARM)
|
||||
-static int get_cpu_physical_id(int cpu)
|
||||
-{
|
||||
- return topology_core_id(cpu);
|
||||
-}
|
||||
-#else
|
||||
-static int get_cpu_physical_id(int cpu)
|
||||
-{
|
||||
- return get_hard_smp_processor_id(cpu);
|
||||
-}
|
||||
-#endif
|
||||
-
|
||||
static u32 get_bus_freq(void)
|
||||
{
|
||||
struct device_node *soc;
|
||||
@@ -99,9 +67,10 @@ static u32 get_bus_freq(void)
|
||||
return sysfreq;
|
||||
}
|
||||
|
||||
-static struct device_node *cpu_to_clk_node(int cpu)
|
||||
+static struct clk *cpu_to_clk(int cpu)
|
||||
{
|
||||
- struct device_node *np, *clk_np;
|
||||
+ struct device_node *np;
|
||||
+ struct clk *clk;
|
||||
|
||||
if (!cpu_present(cpu))
|
||||
return NULL;
|
||||
@@ -110,37 +79,28 @@ static struct device_node *cpu_to_clk_no
|
||||
if (!np)
|
||||
return NULL;
|
||||
|
||||
- clk_np = of_parse_phandle(np, "clocks", 0);
|
||||
- if (!clk_np)
|
||||
- return NULL;
|
||||
-
|
||||
+ clk = of_clk_get(np, 0);
|
||||
of_node_put(np);
|
||||
-
|
||||
- return clk_np;
|
||||
+ return clk;
|
||||
}
|
||||
|
||||
/* traverse cpu nodes to get cpu mask of sharing clock wire */
|
||||
static void set_affected_cpus(struct cpufreq_policy *policy)
|
||||
{
|
||||
- struct device_node *np, *clk_np;
|
||||
struct cpumask *dstp = policy->cpus;
|
||||
+ struct clk *clk;
|
||||
int i;
|
||||
|
||||
- np = cpu_to_clk_node(policy->cpu);
|
||||
- if (!np)
|
||||
- return;
|
||||
-
|
||||
for_each_present_cpu(i) {
|
||||
- clk_np = cpu_to_clk_node(i);
|
||||
- if (!clk_np)
|
||||
+ clk = cpu_to_clk(i);
|
||||
+ if (IS_ERR(clk)) {
|
||||
+ pr_err("%s: no clock for cpu %d\n", __func__, i);
|
||||
continue;
|
||||
+ }
|
||||
|
||||
- if (clk_np == np)
|
||||
+ if (clk_is_match(policy->clk, clk))
|
||||
cpumask_set_cpu(i, dstp);
|
||||
-
|
||||
- of_node_put(clk_np);
|
||||
}
|
||||
- of_node_put(np);
|
||||
}
|
||||
|
||||
/* reduce the duplicated frequencies in frequency table */
|
||||
@@ -198,7 +158,7 @@ static int qoriq_cpufreq_cpu_init(struct
|
||||
{
|
||||
struct device_node *np, *pnode;
|
||||
int i, count, ret;
|
||||
- u32 freq, mask;
|
||||
+ u32 freq;
|
||||
struct clk *clk;
|
||||
struct cpufreq_frequency_table *table;
|
||||
struct cpu_data *data;
|
||||
@@ -219,17 +179,12 @@ static int qoriq_cpufreq_cpu_init(struct
|
||||
goto err_nomem2;
|
||||
}
|
||||
|
||||
- pnode = of_parse_phandle(np, "clocks", 0);
|
||||
- if (!pnode) {
|
||||
- pr_err("%s: could not get clock information\n", __func__);
|
||||
- goto err_nomem2;
|
||||
- }
|
||||
+ count = clk_get_num_parents(policy->clk);
|
||||
|
||||
- count = of_property_count_strings(pnode, "clock-names");
|
||||
data->pclk = kcalloc(count, sizeof(struct clk *), GFP_KERNEL);
|
||||
if (!data->pclk) {
|
||||
pr_err("%s: no memory\n", __func__);
|
||||
- goto err_node;
|
||||
+ goto err_nomem2;
|
||||
}
|
||||
|
||||
table = kcalloc(count + 1, sizeof(*table), GFP_KERNEL);
|
||||
@@ -238,23 +193,11 @@ static int qoriq_cpufreq_cpu_init(struct
|
||||
goto err_pclk;
|
||||
}
|
||||
|
||||
- if (fmask)
|
||||
- mask = fmask[get_cpu_physical_id(cpu)];
|
||||
- else
|
||||
- mask = 0x0;
|
||||
-
|
||||
for (i = 0; i < count; i++) {
|
||||
- clk = of_clk_get(pnode, i);
|
||||
+ clk = clk_get_parent_by_index(policy->clk, i);
|
||||
data->pclk[i] = clk;
|
||||
freq = clk_get_rate(clk);
|
||||
- /*
|
||||
- * the clock is valid if its frequency is not masked
|
||||
- * and large than minimum allowed frequency.
|
||||
- */
|
||||
- if (freq < min_cpufreq || (mask & (1 << i)))
|
||||
- table[i].frequency = CPUFREQ_ENTRY_INVALID;
|
||||
- else
|
||||
- table[i].frequency = freq / 1000;
|
||||
+ table[i].frequency = freq / 1000;
|
||||
table[i].driver_data = i;
|
||||
}
|
||||
freq_table_redup(table, count);
|
||||
@@ -288,10 +231,7 @@ err_nomem1:
|
||||
kfree(table);
|
||||
err_pclk:
|
||||
kfree(data->pclk);
|
||||
-err_node:
|
||||
- of_node_put(pnode);
|
||||
err_nomem2:
|
||||
- policy->driver_data = NULL;
|
||||
kfree(data);
|
||||
err_np:
|
||||
of_node_put(np);
|
||||
@@ -332,12 +272,20 @@ static struct cpufreq_driver qoriq_cpufr
|
||||
.attr = cpufreq_generic_attr,
|
||||
};
|
||||
|
||||
+static const struct soc_data blacklist = {
|
||||
+ .flags = SOC_BLACKLIST,
|
||||
+};
|
||||
+
|
||||
static const struct of_device_id node_matches[] __initconst = {
|
||||
- { .compatible = "fsl,p2041-clockgen", .data = &sdata[0], },
|
||||
- { .compatible = "fsl,p3041-clockgen", .data = &sdata[0], },
|
||||
- { .compatible = "fsl,p5020-clockgen", .data = &sdata[1], },
|
||||
- { .compatible = "fsl,p4080-clockgen", .data = &sdata[2], },
|
||||
- { .compatible = "fsl,p5040-clockgen", .data = &sdata[2], },
|
||||
+ /* e6500 cannot use cpufreq due to erratum A-008083 */
|
||||
+ { .compatible = "fsl,b4420-clockgen", &blacklist },
|
||||
+ { .compatible = "fsl,b4860-clockgen", &blacklist },
|
||||
+ { .compatible = "fsl,t2080-clockgen", &blacklist },
|
||||
+ { .compatible = "fsl,t4240-clockgen", &blacklist },
|
||||
+
|
||||
+ { .compatible = "fsl,ls1021a-clockgen", },
|
||||
+ { .compatible = "fsl,p4080-clockgen", },
|
||||
+ { .compatible = "fsl,qoriq-clockgen-1.0", },
|
||||
{ .compatible = "fsl,qoriq-clockgen-2.0", },
|
||||
{}
|
||||
};
|
||||
@@ -355,16 +303,12 @@ static int __init qoriq_cpufreq_init(voi
|
||||
|
||||
match = of_match_node(node_matches, np);
|
||||
data = match->data;
|
||||
- if (data) {
|
||||
- if (data->flag)
|
||||
- fmask = data->freq_mask;
|
||||
- min_cpufreq = get_bus_freq();
|
||||
- } else {
|
||||
- min_cpufreq = get_bus_freq() / 2;
|
||||
- }
|
||||
|
||||
of_node_put(np);
|
||||
|
||||
+ if (data && data->flags & SOC_BLACKLIST)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
ret = cpufreq_register_driver(&qoriq_cpufreq_driver);
|
||||
if (!ret)
|
||||
pr_info("Freescale QorIQ CPU frequency scaling driver\n");
|
|
@ -0,0 +1,135 @@
|
|||
From 4b9227ba510562a51e87487905895aea97e17e77 Mon Sep 17 00:00:00 2001
|
||||
From: pankaj chauhan <pankaj.chauhan@freescale.com>
|
||||
Date: Tue, 3 Feb 2015 13:08:52 +0530
|
||||
Subject: [PATCH 36/70] ls2085a: Add support for reset
|
||||
|
||||
Add support for layerscape reset driver.
|
||||
Reset is implemented by raising RESET_REQ_B.
|
||||
|
||||
Signed-off-by: pankaj chauhan <pankaj.chauhan@freescale.com>
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@freescale.com>
|
||||
(cherry picked from commit f248be3aea58ca32b7d77413d742996249b293e9)
|
||||
---
|
||||
drivers/power/reset/Kconfig | 7 ++-
|
||||
drivers/power/reset/Makefile | 1 +
|
||||
drivers/power/reset/ls-reboot.c | 93 +++++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 100 insertions(+), 1 deletion(-)
|
||||
create mode 100644 drivers/power/reset/ls-reboot.c
|
||||
|
||||
--- a/drivers/power/reset/Kconfig
|
||||
+++ b/drivers/power/reset/Kconfig
|
||||
@@ -173,5 +173,10 @@ config POWER_RESET_ZX
|
||||
help
|
||||
Reboot support for ZTE SoCs.
|
||||
|
||||
-endif
|
||||
+config POWER_RESET_LAYERSCAPE
|
||||
+ bool "Freescale LayerScape reset driver"
|
||||
+ depends on ARCH_FSL_LS2085A
|
||||
+ help
|
||||
+ Reboot support for the Freescale LayerScape SoCs.
|
||||
|
||||
+endif
|
||||
--- a/drivers/power/reset/Makefile
|
||||
+++ b/drivers/power/reset/Makefile
|
||||
@@ -20,3 +20,4 @@ obj-$(CONFIG_POWER_RESET_SYSCON) += sysc
|
||||
obj-$(CONFIG_POWER_RESET_SYSCON_POWEROFF) += syscon-poweroff.o
|
||||
obj-$(CONFIG_POWER_RESET_RMOBILE) += rmobile-reset.o
|
||||
obj-$(CONFIG_POWER_RESET_ZX) += zx-reboot.o
|
||||
+obj-$(CONFIG_POWER_RESET_LAYERSCAPE) += ls-reboot.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/power/reset/ls-reboot.c
|
||||
@@ -0,0 +1,93 @@
|
||||
+/*
|
||||
+ * Freescale LayerScape reboot driver
|
||||
+ *
|
||||
+ * Copyright (c) 2015, Freescale Semiconductor.
|
||||
+ * Author: Pankaj Chauhan <pankaj.chauhan@freescale.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.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License
|
||||
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/of_device.h>
|
||||
+#include <linux/of_address.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/stat.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <asm/system_misc.h>
|
||||
+
|
||||
+struct ls_reboot_priv {
|
||||
+ struct device *dev;
|
||||
+ u32 *rstcr;
|
||||
+};
|
||||
+
|
||||
+static struct ls_reboot_priv *ls_reboot_priv;
|
||||
+
|
||||
+static void ls_reboot(enum reboot_mode reboot_mode, const char *cmd)
|
||||
+{
|
||||
+ struct ls_reboot_priv *priv = ls_reboot_priv;
|
||||
+ u32 val;
|
||||
+ unsigned long timeout;
|
||||
+
|
||||
+ if (ls_reboot_priv) {
|
||||
+ val = readl(priv->rstcr);
|
||||
+ val |= 0x02;
|
||||
+ writel(val, priv->rstcr);
|
||||
+ }
|
||||
+
|
||||
+ timeout = jiffies + HZ;
|
||||
+ while (time_before(jiffies, timeout))
|
||||
+ cpu_relax();
|
||||
+
|
||||
+}
|
||||
+
|
||||
+static int ls_reboot_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ ls_reboot_priv = devm_kzalloc(&pdev->dev,
|
||||
+ sizeof(*ls_reboot_priv), GFP_KERNEL);
|
||||
+ if (!ls_reboot_priv) {
|
||||
+ dev_err(&pdev->dev, "out of memory for context\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ ls_reboot_priv->rstcr = of_iomap(pdev->dev.of_node, 0);
|
||||
+ if (!ls_reboot_priv->rstcr) {
|
||||
+ devm_kfree(&pdev->dev, ls_reboot_priv);
|
||||
+ dev_err(&pdev->dev, "can not map resource\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ ls_reboot_priv->dev = &pdev->dev;
|
||||
+
|
||||
+ arm_pm_restart = ls_reboot;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct of_device_id ls_reboot_of_match[] = {
|
||||
+ { .compatible = "fsl,ls-reset" },
|
||||
+ {}
|
||||
+};
|
||||
+
|
||||
+static struct platform_driver ls_reboot_driver = {
|
||||
+ .probe = ls_reboot_probe,
|
||||
+ .driver = {
|
||||
+ .name = "ls-reset",
|
||||
+ .of_match_table = ls_reboot_of_match,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static int __init ls_reboot_init(void)
|
||||
+{
|
||||
+ return platform_driver_register(&ls_reboot_driver);
|
||||
+}
|
||||
+device_initcall(ls_reboot_init);
|
|
@ -0,0 +1,56 @@
|
|||
From 5d7f8473e3472c16703bf5692d0b13f47d08c70a Mon Sep 17 00:00:00 2001
|
||||
From: Shaohui Xie <Shaohui.Xie@freescale.com>
|
||||
Date: Fri, 22 Jan 2016 12:01:28 +0800
|
||||
Subject: [PATCH 37/70] ls1043a: Add support for reset
|
||||
|
||||
The reset in ls1043a is similar to ls2085a, but accessed in big endian,
|
||||
so we modify the existing driver to handle endianness, if driver probes
|
||||
property 'big-endian' in DTS, driver works in big endian mode,
|
||||
otherwise, driver works in little endian by default.
|
||||
|
||||
Signed-off-by: Shaohui Xie <Shaohui.Xie@freescale.com>
|
||||
---
|
||||
drivers/power/reset/ls-reboot.c | 18 +++++++++++++++---
|
||||
1 file changed, 15 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/power/reset/ls-reboot.c
|
||||
+++ b/drivers/power/reset/ls-reboot.c
|
||||
@@ -28,6 +28,7 @@
|
||||
struct ls_reboot_priv {
|
||||
struct device *dev;
|
||||
u32 *rstcr;
|
||||
+ bool is_big_endian;
|
||||
};
|
||||
|
||||
static struct ls_reboot_priv *ls_reboot_priv;
|
||||
@@ -39,9 +40,15 @@ static void ls_reboot(enum reboot_mode r
|
||||
unsigned long timeout;
|
||||
|
||||
if (ls_reboot_priv) {
|
||||
- val = readl(priv->rstcr);
|
||||
- val |= 0x02;
|
||||
- writel(val, priv->rstcr);
|
||||
+ if (priv->is_big_endian) {
|
||||
+ val = ioread32be(priv->rstcr);
|
||||
+ val |= 0x02;
|
||||
+ iowrite32be(val, priv->rstcr);
|
||||
+ } else {
|
||||
+ val = readl(priv->rstcr);
|
||||
+ val |= 0x02;
|
||||
+ writel(val, priv->rstcr);
|
||||
+ }
|
||||
}
|
||||
|
||||
timeout = jiffies + HZ;
|
||||
@@ -66,6 +73,11 @@ static int ls_reboot_probe(struct platfo
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
+ if (of_get_property(pdev->dev.of_node, "big-endian", NULL))
|
||||
+ ls_reboot_priv->is_big_endian = true;
|
||||
+ else
|
||||
+ ls_reboot_priv->is_big_endian = false;
|
||||
+
|
||||
ls_reboot_priv->dev = &pdev->dev;
|
||||
|
||||
arm_pm_restart = ls_reboot;
|
|
@ -0,0 +1,22 @@
|
|||
From 6569dc5ba472db76aefe65ef552c3f448348fbec Mon Sep 17 00:00:00 2001
|
||||
From: Rai Harninder-B01044 <harninder.rai@freescale.com>
|
||||
Date: Wed, 28 Oct 2015 13:24:44 +0530
|
||||
Subject: [PATCH 38/70] reset driver: Kconfig: Change define to
|
||||
ARCH_LAYERSCAPE
|
||||
|
||||
Signed-off-by: Rai Harninder-B01044 <harninder.rai@freescale.com>
|
||||
---
|
||||
drivers/power/reset/Kconfig | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/power/reset/Kconfig
|
||||
+++ b/drivers/power/reset/Kconfig
|
||||
@@ -175,7 +175,7 @@ config POWER_RESET_ZX
|
||||
|
||||
config POWER_RESET_LAYERSCAPE
|
||||
bool "Freescale LayerScape reset driver"
|
||||
- depends on ARCH_FSL_LS2085A
|
||||
+ depends on ARCH_LAYERSCAPE
|
||||
help
|
||||
Reboot support for the Freescale LayerScape SoCs.
|
||||
|
|
@ -0,0 +1,289 @@
|
|||
From c2d0a12b5cfa61e43494483f5d1ee466b4998830 Mon Sep 17 00:00:00 2001
|
||||
From: Liu Gang <Gang.Liu@nxp.com>
|
||||
Date: Thu, 14 Jan 2016 19:48:09 +0800
|
||||
Subject: [PATCH 42/70] drivers/gpio: Port gpio driver to support layerscape
|
||||
platform
|
||||
|
||||
Layerscape has the same ip block/controller as
|
||||
GPIO on powerpc platform(MPC8XXX).
|
||||
|
||||
So use portable i/o accessors, as in_be32/out_be32
|
||||
accessors are Power architecture specific whereas
|
||||
ioread32/iowrite32 and ioread32be/iowrite32be are
|
||||
available in other architectures.
|
||||
|
||||
Layerscape GPIO controller's registers may be big
|
||||
or little endian, so the code needs to get the
|
||||
endian property from DTB, then make additional
|
||||
functions to fit right register read/write
|
||||
operations.
|
||||
|
||||
Currently the code can support ls2080a GPIO with
|
||||
little endian registers. And it can also work well
|
||||
on other layerscape platform with big endian GPIO
|
||||
registers.
|
||||
|
||||
Signed-off-by: Liu Gang <Gang.Liu@nxp.com>
|
||||
---
|
||||
drivers/gpio/Kconfig | 7 ++--
|
||||
drivers/gpio/gpio-mpc8xxx.c | 87 +++++++++++++++++++++++++++++++------------
|
||||
2 files changed, 68 insertions(+), 26 deletions(-)
|
||||
|
||||
--- a/drivers/gpio/Kconfig
|
||||
+++ b/drivers/gpio/Kconfig
|
||||
@@ -281,12 +281,13 @@ config GPIO_MPC5200
|
||||
depends on PPC_MPC52xx
|
||||
|
||||
config GPIO_MPC8XXX
|
||||
- bool "MPC512x/MPC8xxx GPIO support"
|
||||
+ bool "MPC512x/MPC8xxx/QorIQ GPIO support"
|
||||
depends on PPC_MPC512x || PPC_MPC831x || PPC_MPC834x || PPC_MPC837x || \
|
||||
- FSL_SOC_BOOKE || PPC_86xx
|
||||
+ FSL_SOC_BOOKE || PPC_86xx || ARCH_LAYERSCAPE || ARM || \
|
||||
+ COMPILE_TEST
|
||||
help
|
||||
Say Y here if you're going to use hardware that connects to the
|
||||
- MPC512x/831x/834x/837x/8572/8610 GPIOs.
|
||||
+ MPC512x/831x/834x/837x/8572/8610/QorIQ GPIOs.
|
||||
|
||||
config GPIO_MVEBU
|
||||
def_bool y
|
||||
--- a/drivers/gpio/gpio-mpc8xxx.c
|
||||
+++ b/drivers/gpio/gpio-mpc8xxx.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
- * GPIOs on MPC512x/8349/8572/8610 and compatible
|
||||
+ * GPIOs on MPC512x/8349/8572/8610/QorIQ and compatible
|
||||
*
|
||||
* Copyright (C) 2008 Peter Korsgaard <jacmet@sunsite.dk>
|
||||
*
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/irq.h>
|
||||
+#include <linux/irqdomain.h>
|
||||
|
||||
#define MPC8XXX_GPIO_PINS 32
|
||||
|
||||
@@ -44,6 +45,27 @@ struct mpc8xxx_gpio_chip {
|
||||
const void *of_dev_id_data;
|
||||
};
|
||||
|
||||
+static bool gpio_little_endian;
|
||||
+static inline u32 gpio_in32(void __iomem *addr)
|
||||
+{
|
||||
+ u32 val;
|
||||
+
|
||||
+ if (gpio_little_endian)
|
||||
+ val = ioread32(addr);
|
||||
+ else
|
||||
+ val = ioread32be(addr);
|
||||
+
|
||||
+ return val;
|
||||
+}
|
||||
+
|
||||
+static inline void gpio_out32(u32 val, void __iomem *addr)
|
||||
+{
|
||||
+ if (gpio_little_endian)
|
||||
+ iowrite32(val, addr);
|
||||
+ else
|
||||
+ iowrite32be(val, addr);
|
||||
+}
|
||||
+
|
||||
static inline u32 mpc8xxx_gpio2mask(unsigned int gpio)
|
||||
{
|
||||
return 1u << (MPC8XXX_GPIO_PINS - 1 - gpio);
|
||||
@@ -59,9 +81,17 @@ static void mpc8xxx_gpio_save_regs(struc
|
||||
{
|
||||
struct mpc8xxx_gpio_chip *mpc8xxx_gc = to_mpc8xxx_gpio_chip(mm);
|
||||
|
||||
- mpc8xxx_gc->data = in_be32(mm->regs + GPIO_DAT);
|
||||
+ mpc8xxx_gc->data = gpio_in32(mm->regs + GPIO_DAT);
|
||||
}
|
||||
|
||||
+/* Generic set and clear bits accessor ports */
|
||||
+#define bgpio_setbits32(_addr, _v) \
|
||||
+ gpio_out32(gpio_in32(_addr) | (_v), (_addr))
|
||||
+#define bgpio_clrbits32(_addr, _v) \
|
||||
+ gpio_out32(gpio_in32(_addr) & ~(_v), (_addr))
|
||||
+#define bgpio_clrsetbits32(addr, clear, set) \
|
||||
+ gpio_out32((gpio_in32(addr) & ~(clear)) | (set), (addr))
|
||||
+
|
||||
/* Workaround GPIO 1 errata on MPC8572/MPC8536. The status of GPIOs
|
||||
* defined as output cannot be determined by reading GPDAT register,
|
||||
* so we use shadow data register instead. The status of input pins
|
||||
@@ -74,9 +104,9 @@ static int mpc8572_gpio_get(struct gpio_
|
||||
struct mpc8xxx_gpio_chip *mpc8xxx_gc = to_mpc8xxx_gpio_chip(mm);
|
||||
u32 out_mask, out_shadow;
|
||||
|
||||
- out_mask = in_be32(mm->regs + GPIO_DIR);
|
||||
+ out_mask = gpio_in32(mm->regs + GPIO_DIR);
|
||||
|
||||
- val = in_be32(mm->regs + GPIO_DAT) & ~out_mask;
|
||||
+ val = gpio_in32(mm->regs + GPIO_DAT) & ~out_mask;
|
||||
out_shadow = mpc8xxx_gc->data & out_mask;
|
||||
|
||||
return (val | out_shadow) & mpc8xxx_gpio2mask(gpio);
|
||||
@@ -86,7 +116,7 @@ static int mpc8xxx_gpio_get(struct gpio_
|
||||
{
|
||||
struct of_mm_gpio_chip *mm = to_of_mm_gpio_chip(gc);
|
||||
|
||||
- return in_be32(mm->regs + GPIO_DAT) & mpc8xxx_gpio2mask(gpio);
|
||||
+ return gpio_in32(mm->regs + GPIO_DAT) & mpc8xxx_gpio2mask(gpio);
|
||||
}
|
||||
|
||||
static void mpc8xxx_gpio_set(struct gpio_chip *gc, unsigned int gpio, int val)
|
||||
@@ -102,7 +132,7 @@ static void mpc8xxx_gpio_set(struct gpio
|
||||
else
|
||||
mpc8xxx_gc->data &= ~mpc8xxx_gpio2mask(gpio);
|
||||
|
||||
- out_be32(mm->regs + GPIO_DAT, mpc8xxx_gc->data);
|
||||
+ gpio_out32(mpc8xxx_gc->data, mm->regs + GPIO_DAT);
|
||||
|
||||
raw_spin_unlock_irqrestore(&mpc8xxx_gc->lock, flags);
|
||||
}
|
||||
@@ -128,7 +158,7 @@ static void mpc8xxx_gpio_set_multiple(st
|
||||
}
|
||||
}
|
||||
|
||||
- out_be32(mm->regs + GPIO_DAT, mpc8xxx_gc->data);
|
||||
+ gpio_out32(mpc8xxx_gc->data, mm->regs + GPIO_DAT);
|
||||
|
||||
raw_spin_unlock_irqrestore(&mpc8xxx_gc->lock, flags);
|
||||
}
|
||||
@@ -141,7 +171,7 @@ static int mpc8xxx_gpio_dir_in(struct gp
|
||||
|
||||
raw_spin_lock_irqsave(&mpc8xxx_gc->lock, flags);
|
||||
|
||||
- clrbits32(mm->regs + GPIO_DIR, mpc8xxx_gpio2mask(gpio));
|
||||
+ bgpio_clrbits32(mm->regs + GPIO_DIR, mpc8xxx_gpio2mask(gpio));
|
||||
|
||||
raw_spin_unlock_irqrestore(&mpc8xxx_gc->lock, flags);
|
||||
|
||||
@@ -158,7 +188,7 @@ static int mpc8xxx_gpio_dir_out(struct g
|
||||
|
||||
raw_spin_lock_irqsave(&mpc8xxx_gc->lock, flags);
|
||||
|
||||
- setbits32(mm->regs + GPIO_DIR, mpc8xxx_gpio2mask(gpio));
|
||||
+ bgpio_setbits32(mm->regs + GPIO_DIR, mpc8xxx_gpio2mask(gpio));
|
||||
|
||||
raw_spin_unlock_irqrestore(&mpc8xxx_gc->lock, flags);
|
||||
|
||||
@@ -201,7 +231,8 @@ static void mpc8xxx_gpio_irq_cascade(str
|
||||
struct of_mm_gpio_chip *mm = &mpc8xxx_gc->mm_gc;
|
||||
unsigned int mask;
|
||||
|
||||
- mask = in_be32(mm->regs + GPIO_IER) & in_be32(mm->regs + GPIO_IMR);
|
||||
+ mask = gpio_in32(mm->regs + GPIO_IER)
|
||||
+ & gpio_in32(mm->regs + GPIO_IMR);
|
||||
if (mask)
|
||||
generic_handle_irq(irq_linear_revmap(mpc8xxx_gc->irq,
|
||||
32 - ffs(mask)));
|
||||
@@ -217,7 +248,8 @@ static void mpc8xxx_irq_unmask(struct ir
|
||||
|
||||
raw_spin_lock_irqsave(&mpc8xxx_gc->lock, flags);
|
||||
|
||||
- setbits32(mm->regs + GPIO_IMR, mpc8xxx_gpio2mask(irqd_to_hwirq(d)));
|
||||
+ bgpio_setbits32(mm->regs + GPIO_IMR,
|
||||
+ mpc8xxx_gpio2mask(irqd_to_hwirq(d)));
|
||||
|
||||
raw_spin_unlock_irqrestore(&mpc8xxx_gc->lock, flags);
|
||||
}
|
||||
@@ -230,7 +262,8 @@ static void mpc8xxx_irq_mask(struct irq_
|
||||
|
||||
raw_spin_lock_irqsave(&mpc8xxx_gc->lock, flags);
|
||||
|
||||
- clrbits32(mm->regs + GPIO_IMR, mpc8xxx_gpio2mask(irqd_to_hwirq(d)));
|
||||
+ bgpio_clrbits32(mm->regs + GPIO_IMR,
|
||||
+ mpc8xxx_gpio2mask(irqd_to_hwirq(d)));
|
||||
|
||||
raw_spin_unlock_irqrestore(&mpc8xxx_gc->lock, flags);
|
||||
}
|
||||
@@ -240,7 +273,7 @@ static void mpc8xxx_irq_ack(struct irq_d
|
||||
struct mpc8xxx_gpio_chip *mpc8xxx_gc = irq_data_get_irq_chip_data(d);
|
||||
struct of_mm_gpio_chip *mm = &mpc8xxx_gc->mm_gc;
|
||||
|
||||
- out_be32(mm->regs + GPIO_IER, mpc8xxx_gpio2mask(irqd_to_hwirq(d)));
|
||||
+ gpio_out32(mpc8xxx_gpio2mask(irqd_to_hwirq(d)), mm->regs + GPIO_IER);
|
||||
}
|
||||
|
||||
static int mpc8xxx_irq_set_type(struct irq_data *d, unsigned int flow_type)
|
||||
@@ -252,15 +285,15 @@ static int mpc8xxx_irq_set_type(struct i
|
||||
switch (flow_type) {
|
||||
case IRQ_TYPE_EDGE_FALLING:
|
||||
raw_spin_lock_irqsave(&mpc8xxx_gc->lock, flags);
|
||||
- setbits32(mm->regs + GPIO_ICR,
|
||||
- mpc8xxx_gpio2mask(irqd_to_hwirq(d)));
|
||||
+ bgpio_setbits32(mm->regs + GPIO_ICR,
|
||||
+ mpc8xxx_gpio2mask(irqd_to_hwirq(d)));
|
||||
raw_spin_unlock_irqrestore(&mpc8xxx_gc->lock, flags);
|
||||
break;
|
||||
|
||||
case IRQ_TYPE_EDGE_BOTH:
|
||||
raw_spin_lock_irqsave(&mpc8xxx_gc->lock, flags);
|
||||
- clrbits32(mm->regs + GPIO_ICR,
|
||||
- mpc8xxx_gpio2mask(irqd_to_hwirq(d)));
|
||||
+ bgpio_clrbits32(mm->regs + GPIO_ICR,
|
||||
+ mpc8xxx_gpio2mask(irqd_to_hwirq(d)));
|
||||
raw_spin_unlock_irqrestore(&mpc8xxx_gc->lock, flags);
|
||||
break;
|
||||
|
||||
@@ -292,20 +325,20 @@ static int mpc512x_irq_set_type(struct i
|
||||
case IRQ_TYPE_EDGE_FALLING:
|
||||
case IRQ_TYPE_LEVEL_LOW:
|
||||
raw_spin_lock_irqsave(&mpc8xxx_gc->lock, flags);
|
||||
- clrsetbits_be32(reg, 3 << shift, 2 << shift);
|
||||
+ bgpio_clrsetbits32(reg, 3 << shift, 2 << shift);
|
||||
raw_spin_unlock_irqrestore(&mpc8xxx_gc->lock, flags);
|
||||
break;
|
||||
|
||||
case IRQ_TYPE_EDGE_RISING:
|
||||
case IRQ_TYPE_LEVEL_HIGH:
|
||||
raw_spin_lock_irqsave(&mpc8xxx_gc->lock, flags);
|
||||
- clrsetbits_be32(reg, 3 << shift, 1 << shift);
|
||||
+ bgpio_clrsetbits32(reg, 3 << shift, 1 << shift);
|
||||
raw_spin_unlock_irqrestore(&mpc8xxx_gc->lock, flags);
|
||||
break;
|
||||
|
||||
case IRQ_TYPE_EDGE_BOTH:
|
||||
raw_spin_lock_irqsave(&mpc8xxx_gc->lock, flags);
|
||||
- clrbits32(reg, 3 << shift);
|
||||
+ bgpio_clrbits32(reg, 3 << shift);
|
||||
raw_spin_unlock_irqrestore(&mpc8xxx_gc->lock, flags);
|
||||
break;
|
||||
|
||||
@@ -398,6 +431,14 @@ static int mpc8xxx_probe(struct platform
|
||||
mm_gc = &mpc8xxx_gc->mm_gc;
|
||||
gc = &mm_gc->gc;
|
||||
|
||||
+ if (of_property_read_bool(np, "little-endian")) {
|
||||
+ gpio_little_endian = true;
|
||||
+ dev_dbg(&pdev->dev, "GPIO REGISTERS are LITTLE endian\n");
|
||||
+ } else {
|
||||
+ gpio_little_endian = false;
|
||||
+ dev_dbg(&pdev->dev, "GPIO REGISTERS are BIG endian\n");
|
||||
+ }
|
||||
+
|
||||
mm_gc->save_regs = mpc8xxx_gpio_save_regs;
|
||||
gc->ngpio = MPC8XXX_GPIO_PINS;
|
||||
gc->direction_input = mpc8xxx_gpio_dir_in;
|
||||
@@ -422,7 +463,7 @@ static int mpc8xxx_probe(struct platform
|
||||
return ret;
|
||||
|
||||
mpc8xxx_gc->irqn = irq_of_parse_and_map(np, 0);
|
||||
- if (mpc8xxx_gc->irqn == NO_IRQ)
|
||||
+ if (mpc8xxx_gc->irqn == 0)
|
||||
return 0;
|
||||
|
||||
mpc8xxx_gc->irq = irq_domain_add_linear(np, MPC8XXX_GPIO_PINS,
|
||||
@@ -435,8 +476,8 @@ static int mpc8xxx_probe(struct platform
|
||||
mpc8xxx_gc->of_dev_id_data = id->data;
|
||||
|
||||
/* ack and mask all irqs */
|
||||
- out_be32(mm_gc->regs + GPIO_IER, 0xffffffff);
|
||||
- out_be32(mm_gc->regs + GPIO_IMR, 0);
|
||||
+ gpio_out32(0xffffffff, mm_gc->regs + GPIO_IER);
|
||||
+ gpio_out32(0, mm_gc->regs + GPIO_IMR);
|
||||
|
||||
irq_set_chained_handler_and_data(mpc8xxx_gc->irqn,
|
||||
mpc8xxx_gpio_irq_cascade, mpc8xxx_gc);
|
|
@ -0,0 +1,60 @@
|
|||
From dfc4661c2499aeb0a43b8a13b55213d1c190f640 Mon Sep 17 00:00:00 2001
|
||||
From: yangbo lu <yangbo.lu@freescale.com>
|
||||
Date: Tue, 19 Apr 2016 09:47:15 +0800
|
||||
Subject: [PATCH 48/70] mmc: sdhci-of-esdhc: add/remove some quirks according
|
||||
to vendor version
|
||||
|
||||
commit 6c42cb309fee2e126beed6b96a986dc7d85a033d
|
||||
[context adjustment]
|
||||
|
||||
A previous patch had removed esdhc_of_platform_init() by mistake.
|
||||
static void esdhc_of_platform_init(struct sdhci_host *host)
|
||||
{
|
||||
u32 vvn;
|
||||
|
||||
vvn = in_be32(host->ioaddr + SDHCI_SLOT_INT_STATUS);
|
||||
vvn = (vvn & SDHCI_VENDOR_VER_MASK) >> SDHCI_VENDOR_VER_SHIFT;
|
||||
if (vvn == VENDOR_V_22)
|
||||
host->quirks2 |= SDHCI_QUIRK2_HOST_NO_CMD23;
|
||||
|
||||
if (vvn > VENDOR_V_22)
|
||||
host->quirks &= ~SDHCI_QUIRK_NO_BUSY_IRQ;
|
||||
}
|
||||
|
||||
This patch is used to fix it by add/remove some quirks according to
|
||||
verdor version in probe.
|
||||
|
||||
Signed-off-by: Yangbo Lu <yangbo.lu@freescale.com>
|
||||
Fixes: f4932cfd22f1 ("mmc: sdhci-of-esdhc: support both BE and LE host controller")
|
||||
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
|
||||
Integrated-by: Zhao Qiang <qiang.zhao@nxp.com>
|
||||
---
|
||||
drivers/mmc/host/sdhci-of-esdhc.c | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
--- a/drivers/mmc/host/sdhci-of-esdhc.c
|
||||
+++ b/drivers/mmc/host/sdhci-of-esdhc.c
|
||||
@@ -584,6 +584,8 @@ static int sdhci_esdhc_probe(struct plat
|
||||
{
|
||||
struct sdhci_host *host;
|
||||
struct device_node *np;
|
||||
+ struct sdhci_pltfm_host *pltfm_host;
|
||||
+ struct sdhci_esdhc *esdhc;
|
||||
int ret;
|
||||
|
||||
np = pdev->dev.of_node;
|
||||
@@ -611,6 +613,14 @@ static int sdhci_esdhc_probe(struct plat
|
||||
if (of_device_is_compatible(np, "fsl,ls1021a-esdhc"))
|
||||
host->quirks |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL;
|
||||
|
||||
+ pltfm_host = sdhci_priv(host);
|
||||
+ esdhc = pltfm_host->priv;
|
||||
+ if (esdhc->vendor_ver == VENDOR_V_22)
|
||||
+ host->quirks2 |= SDHCI_QUIRK2_HOST_NO_CMD23;
|
||||
+
|
||||
+ if (esdhc->vendor_ver > VENDOR_V_22)
|
||||
+ host->quirks &= ~SDHCI_QUIRK_NO_BUSY_IRQ;
|
||||
+
|
||||
if (of_device_is_compatible(np, "fsl,p2020-esdhc")) {
|
||||
/*
|
||||
* Freescale messed up with P2020 as it has a non-standard
|
|
@ -0,0 +1,25 @@
|
|||
From f2d357f86d79141969e29ec1dc1669da5120e022 Mon Sep 17 00:00:00 2001
|
||||
From: Yang Shi <yang.shi@linaro.org>
|
||||
Date: Wed, 27 Jan 2016 09:32:05 -0800
|
||||
Subject: [PATCH 49/70] PCI: layerscape: Add "fsl,ls2085a-pcie" compatible ID
|
||||
|
||||
The Layerscape PCI host driver must recognize ls2085a compatible when using
|
||||
firmware with ls2085a compatible property, otherwise the PCI bus won't be
|
||||
detected even though ls2085a compatible is included by the dts.
|
||||
|
||||
Signed-off-by: Yang Shi <yang.shi@linaro.org>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
---
|
||||
drivers/pci/host/pci-layerscape.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/pci/host/pci-layerscape.c
|
||||
+++ b/drivers/pci/host/pci-layerscape.c
|
||||
@@ -203,6 +203,7 @@ static const struct of_device_id ls_pcie
|
||||
{ .compatible = "fsl,ls1021a-pcie", .data = &ls1021_drvdata },
|
||||
{ .compatible = "fsl,ls1043a-pcie", .data = &ls1043_drvdata },
|
||||
{ .compatible = "fsl,ls2080a-pcie", .data = &ls2080_drvdata },
|
||||
+ { .compatible = "fsl,ls2085a-pcie", .data = &ls2080_drvdata },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, ls_pcie_of_match);
|
|
@ -0,0 +1,66 @@
|
|||
From 61959c53020fff0584d88e28d6dae9806184f1a8 Mon Sep 17 00:00:00 2001
|
||||
From: Minghuan Lian <Minghuan.Lian@nxp.com>
|
||||
Date: Mon, 29 Feb 2016 17:24:15 -0600
|
||||
Subject: [PATCH 50/70] PCI: layerscape: Fix MSG TLP drop setting
|
||||
|
||||
Some kinds of Layerscape PCIe controllers will forward the received message
|
||||
TLPs to system application address space, which could corrupt system memory
|
||||
or lead to a system hang. Enable MSG_DROP to fix this issue.
|
||||
|
||||
Signed-off-by: Minghuan Lian <Minghuan.Lian@nxp.com>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
---
|
||||
drivers/pci/host/pci-layerscape.c | 21 +++++++++++++--------
|
||||
1 file changed, 13 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/pci/host/pci-layerscape.c
|
||||
+++ b/drivers/pci/host/pci-layerscape.c
|
||||
@@ -77,6 +77,16 @@ static void ls_pcie_fix_class(struct ls_
|
||||
iowrite16(PCI_CLASS_BRIDGE_PCI, pcie->dbi + PCI_CLASS_DEVICE);
|
||||
}
|
||||
|
||||
+/* Drop MSG TLP except for Vendor MSG */
|
||||
+static void ls_pcie_drop_msg_tlp(struct ls_pcie *pcie)
|
||||
+{
|
||||
+ u32 val;
|
||||
+
|
||||
+ val = ioread32(pcie->dbi + PCIE_STRFMR1);
|
||||
+ val &= 0xDFFFFFFF;
|
||||
+ iowrite32(val, pcie->dbi + PCIE_STRFMR1);
|
||||
+}
|
||||
+
|
||||
static int ls1021_pcie_link_up(struct pcie_port *pp)
|
||||
{
|
||||
u32 state;
|
||||
@@ -97,7 +107,7 @@ static int ls1021_pcie_link_up(struct pc
|
||||
static void ls1021_pcie_host_init(struct pcie_port *pp)
|
||||
{
|
||||
struct ls_pcie *pcie = to_ls_pcie(pp);
|
||||
- u32 val, index[2];
|
||||
+ u32 index[2];
|
||||
|
||||
pcie->scfg = syscon_regmap_lookup_by_phandle(pp->dev->of_node,
|
||||
"fsl,pcie-scfg");
|
||||
@@ -116,13 +126,7 @@ static void ls1021_pcie_host_init(struct
|
||||
|
||||
dw_pcie_setup_rc(pp);
|
||||
|
||||
- /*
|
||||
- * LS1021A Workaround for internal TKT228622
|
||||
- * to fix the INTx hang issue
|
||||
- */
|
||||
- val = ioread32(pcie->dbi + PCIE_STRFMR1);
|
||||
- val &= 0xffff;
|
||||
- iowrite32(val, pcie->dbi + PCIE_STRFMR1);
|
||||
+ ls_pcie_drop_msg_tlp(pcie);
|
||||
}
|
||||
|
||||
static int ls_pcie_link_up(struct pcie_port *pp)
|
||||
@@ -147,6 +151,7 @@ static void ls_pcie_host_init(struct pci
|
||||
iowrite32(1, pcie->dbi + PCIE_DBI_RO_WR_EN);
|
||||
ls_pcie_fix_class(pcie);
|
||||
ls_pcie_clear_multifunction(pcie);
|
||||
+ ls_pcie_drop_msg_tlp(pcie);
|
||||
iowrite32(0, pcie->dbi + PCIE_DBI_RO_WR_EN);
|
||||
}
|
||||
|
|
@ -0,0 +1,285 @@
|
|||
From 83ec4322b33e8d7908a3df0343246882e4e6b83a Mon Sep 17 00:00:00 2001
|
||||
From: Minghuan Lian <Minghuan.Lian@nxp.com>
|
||||
Date: Wed, 23 Mar 2016 19:08:20 +0800
|
||||
Subject: [PATCH 60/70] irqchip: Add Layerscape SCFG MSI controller support
|
||||
|
||||
upstream b8f3ebe630a4f1b4ff9340103d3b565ad5d78d43 commit
|
||||
[context adjustment]
|
||||
|
||||
Some kind of Freescale Layerscape SoC provides a MSI
|
||||
implementation which uses two SCFG registers MSIIR and
|
||||
MSIR to support 32 MSI interrupts for each PCIe controller.
|
||||
The patch is to support it.
|
||||
|
||||
Signed-off-by: Minghuan Lian <Minghuan.Lian@nxp.com>
|
||||
Tested-by: Alexander Stein <alexander.stein@systec-electronic.com>
|
||||
Acked-by: Marc Zyngier <marc.zyngier@arm.com>
|
||||
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
|
||||
---
|
||||
drivers/irqchip/Kconfig | 5 +
|
||||
drivers/irqchip/Makefile | 1 +
|
||||
drivers/irqchip/irq-ls-scfg-msi.c | 240 +++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 246 insertions(+)
|
||||
create mode 100644 drivers/irqchip/irq-ls-scfg-msi.c
|
||||
|
||||
--- a/drivers/irqchip/Kconfig
|
||||
+++ b/drivers/irqchip/Kconfig
|
||||
@@ -193,3 +193,8 @@ config IRQ_MXS
|
||||
def_bool y if MACH_ASM9260 || ARCH_MXS
|
||||
select IRQ_DOMAIN
|
||||
select STMP_DEVICE
|
||||
+
|
||||
+config LS_SCFG_MSI
|
||||
+ def_bool y if SOC_LS1021A || ARCH_LAYERSCAPE
|
||||
+ depends on PCI && PCI_MSI
|
||||
+ select PCI_MSI_IRQ_DOMAIN
|
||||
--- a/drivers/irqchip/Makefile
|
||||
+++ b/drivers/irqchip/Makefile
|
||||
@@ -55,3 +55,4 @@ obj-$(CONFIG_RENESAS_H8S_INTC) += irq-r
|
||||
obj-$(CONFIG_ARCH_SA1100) += irq-sa11x0.o
|
||||
obj-$(CONFIG_INGENIC_IRQ) += irq-ingenic.o
|
||||
obj-$(CONFIG_IMX_GPCV2) += irq-imx-gpcv2.o
|
||||
+obj-$(CONFIG_LS_SCFG_MSI) += irq-ls-scfg-msi.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/irqchip/irq-ls-scfg-msi.c
|
||||
@@ -0,0 +1,240 @@
|
||||
+/*
|
||||
+ * Freescale SCFG MSI(-X) support
|
||||
+ *
|
||||
+ * Copyright (C) 2016 Freescale Semiconductor.
|
||||
+ *
|
||||
+ * Author: Minghuan Lian <Minghuan.Lian@nxp.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.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/msi.h>
|
||||
+#include <linux/interrupt.h>
|
||||
+#include <linux/irq.h>
|
||||
+#include <linux/irqchip/chained_irq.h>
|
||||
+#include <linux/irqdomain.h>
|
||||
+#include <linux/of_pci.h>
|
||||
+#include <linux/of_platform.h>
|
||||
+#include <linux/spinlock.h>
|
||||
+
|
||||
+#define MSI_MAX_IRQS 32
|
||||
+#define MSI_IBS_SHIFT 3
|
||||
+#define MSIR 4
|
||||
+
|
||||
+struct ls_scfg_msi {
|
||||
+ spinlock_t lock;
|
||||
+ struct platform_device *pdev;
|
||||
+ struct irq_domain *parent;
|
||||
+ struct irq_domain *msi_domain;
|
||||
+ void __iomem *regs;
|
||||
+ phys_addr_t msiir_addr;
|
||||
+ int irq;
|
||||
+ DECLARE_BITMAP(used, MSI_MAX_IRQS);
|
||||
+};
|
||||
+
|
||||
+static struct irq_chip ls_scfg_msi_irq_chip = {
|
||||
+ .name = "MSI",
|
||||
+ .irq_mask = pci_msi_mask_irq,
|
||||
+ .irq_unmask = pci_msi_unmask_irq,
|
||||
+};
|
||||
+
|
||||
+static struct msi_domain_info ls_scfg_msi_domain_info = {
|
||||
+ .flags = (MSI_FLAG_USE_DEF_DOM_OPS |
|
||||
+ MSI_FLAG_USE_DEF_CHIP_OPS |
|
||||
+ MSI_FLAG_PCI_MSIX),
|
||||
+ .chip = &ls_scfg_msi_irq_chip,
|
||||
+};
|
||||
+
|
||||
+static void ls_scfg_msi_compose_msg(struct irq_data *data, struct msi_msg *msg)
|
||||
+{
|
||||
+ struct ls_scfg_msi *msi_data = irq_data_get_irq_chip_data(data);
|
||||
+
|
||||
+ msg->address_hi = upper_32_bits(msi_data->msiir_addr);
|
||||
+ msg->address_lo = lower_32_bits(msi_data->msiir_addr);
|
||||
+ msg->data = data->hwirq << MSI_IBS_SHIFT;
|
||||
+}
|
||||
+
|
||||
+static int ls_scfg_msi_set_affinity(struct irq_data *irq_data,
|
||||
+ const struct cpumask *mask, bool force)
|
||||
+{
|
||||
+ return -EINVAL;
|
||||
+}
|
||||
+
|
||||
+static struct irq_chip ls_scfg_msi_parent_chip = {
|
||||
+ .name = "SCFG",
|
||||
+ .irq_compose_msi_msg = ls_scfg_msi_compose_msg,
|
||||
+ .irq_set_affinity = ls_scfg_msi_set_affinity,
|
||||
+};
|
||||
+
|
||||
+static int ls_scfg_msi_domain_irq_alloc(struct irq_domain *domain,
|
||||
+ unsigned int virq,
|
||||
+ unsigned int nr_irqs,
|
||||
+ void *args)
|
||||
+{
|
||||
+ struct ls_scfg_msi *msi_data = domain->host_data;
|
||||
+ int pos, err = 0;
|
||||
+
|
||||
+ WARN_ON(nr_irqs != 1);
|
||||
+
|
||||
+ spin_lock(&msi_data->lock);
|
||||
+ pos = find_first_zero_bit(msi_data->used, MSI_MAX_IRQS);
|
||||
+ if (pos < MSI_MAX_IRQS)
|
||||
+ __set_bit(pos, msi_data->used);
|
||||
+ else
|
||||
+ err = -ENOSPC;
|
||||
+ spin_unlock(&msi_data->lock);
|
||||
+
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ irq_domain_set_info(domain, virq, pos,
|
||||
+ &ls_scfg_msi_parent_chip, msi_data,
|
||||
+ handle_simple_irq, NULL, NULL);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void ls_scfg_msi_domain_irq_free(struct irq_domain *domain,
|
||||
+ unsigned int virq, unsigned int nr_irqs)
|
||||
+{
|
||||
+ struct irq_data *d = irq_domain_get_irq_data(domain, virq);
|
||||
+ struct ls_scfg_msi *msi_data = irq_data_get_irq_chip_data(d);
|
||||
+ int pos;
|
||||
+
|
||||
+ pos = d->hwirq;
|
||||
+ if (pos < 0 || pos >= MSI_MAX_IRQS) {
|
||||
+ pr_err("failed to teardown msi. Invalid hwirq %d\n", pos);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ spin_lock(&msi_data->lock);
|
||||
+ __clear_bit(pos, msi_data->used);
|
||||
+ spin_unlock(&msi_data->lock);
|
||||
+}
|
||||
+
|
||||
+static const struct irq_domain_ops ls_scfg_msi_domain_ops = {
|
||||
+ .alloc = ls_scfg_msi_domain_irq_alloc,
|
||||
+ .free = ls_scfg_msi_domain_irq_free,
|
||||
+};
|
||||
+
|
||||
+static void ls_scfg_msi_irq_handler(struct irq_desc *desc)
|
||||
+{
|
||||
+ struct ls_scfg_msi *msi_data = irq_desc_get_handler_data(desc);
|
||||
+ unsigned long val;
|
||||
+ int pos, virq;
|
||||
+
|
||||
+ chained_irq_enter(irq_desc_get_chip(desc), desc);
|
||||
+
|
||||
+ val = ioread32be(msi_data->regs + MSIR);
|
||||
+ for_each_set_bit(pos, &val, MSI_MAX_IRQS) {
|
||||
+ virq = irq_find_mapping(msi_data->parent, (31 - pos));
|
||||
+ if (virq)
|
||||
+ generic_handle_irq(virq);
|
||||
+ }
|
||||
+
|
||||
+ chained_irq_exit(irq_desc_get_chip(desc), desc);
|
||||
+}
|
||||
+
|
||||
+static int ls_scfg_msi_domains_init(struct ls_scfg_msi *msi_data)
|
||||
+{
|
||||
+ /* Initialize MSI domain parent */
|
||||
+ msi_data->parent = irq_domain_add_linear(NULL,
|
||||
+ MSI_MAX_IRQS,
|
||||
+ &ls_scfg_msi_domain_ops,
|
||||
+ msi_data);
|
||||
+ if (!msi_data->parent) {
|
||||
+ dev_err(&msi_data->pdev->dev, "failed to create IRQ domain\n");
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ msi_data->msi_domain = pci_msi_create_irq_domain(
|
||||
+ of_node_to_fwnode(msi_data->pdev->dev.of_node),
|
||||
+ &ls_scfg_msi_domain_info,
|
||||
+ msi_data->parent);
|
||||
+ if (!msi_data->msi_domain) {
|
||||
+ dev_err(&msi_data->pdev->dev, "failed to create MSI domain\n");
|
||||
+ irq_domain_remove(msi_data->parent);
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int ls_scfg_msi_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct ls_scfg_msi *msi_data;
|
||||
+ struct resource *res;
|
||||
+ int ret;
|
||||
+
|
||||
+ msi_data = devm_kzalloc(&pdev->dev, sizeof(*msi_data), GFP_KERNEL);
|
||||
+ if (!msi_data)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
+ msi_data->regs = devm_ioremap_resource(&pdev->dev, res);
|
||||
+ if (IS_ERR(msi_data->regs)) {
|
||||
+ dev_err(&pdev->dev, "failed to initialize 'regs'\n");
|
||||
+ return PTR_ERR(msi_data->regs);
|
||||
+ }
|
||||
+ msi_data->msiir_addr = res->start;
|
||||
+
|
||||
+ msi_data->irq = platform_get_irq(pdev, 0);
|
||||
+ if (msi_data->irq <= 0) {
|
||||
+ dev_err(&pdev->dev, "failed to get MSI irq\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ msi_data->pdev = pdev;
|
||||
+ spin_lock_init(&msi_data->lock);
|
||||
+
|
||||
+ ret = ls_scfg_msi_domains_init(msi_data);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ irq_set_chained_handler_and_data(msi_data->irq,
|
||||
+ ls_scfg_msi_irq_handler,
|
||||
+ msi_data);
|
||||
+
|
||||
+ platform_set_drvdata(pdev, msi_data);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int ls_scfg_msi_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct ls_scfg_msi *msi_data = platform_get_drvdata(pdev);
|
||||
+
|
||||
+ irq_set_chained_handler_and_data(msi_data->irq, NULL, NULL);
|
||||
+
|
||||
+ irq_domain_remove(msi_data->msi_domain);
|
||||
+ irq_domain_remove(msi_data->parent);
|
||||
+
|
||||
+ platform_set_drvdata(pdev, NULL);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id ls_scfg_msi_id[] = {
|
||||
+ { .compatible = "fsl,1s1021a-msi", },
|
||||
+ { .compatible = "fsl,1s1043a-msi", },
|
||||
+ {},
|
||||
+};
|
||||
+
|
||||
+static struct platform_driver ls_scfg_msi_driver = {
|
||||
+ .driver = {
|
||||
+ .name = "ls-scfg-msi",
|
||||
+ .of_match_table = ls_scfg_msi_id,
|
||||
+ },
|
||||
+ .probe = ls_scfg_msi_probe,
|
||||
+ .remove = ls_scfg_msi_remove,
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(ls_scfg_msi_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Minghuan Lian <Minghuan.Lian@nxp.com>");
|
||||
+MODULE_DESCRIPTION("Freescale Layerscape SCFG MSI controller driver");
|
||||
+MODULE_LICENSE("GPL v2");
|
|
@ -0,0 +1,22 @@
|
|||
From 99b0e55881b217e9de4efd4d812dd3bd4f8c9380 Mon Sep 17 00:00:00 2001
|
||||
From: Mingkai Hu <Mingkai.Hu@freescale.com>
|
||||
Date: Thu, 19 Nov 2015 12:49:50 +0800
|
||||
Subject: [PATCH 61/70] arm64/layerscape: Enable PCIe for Layerscape
|
||||
|
||||
Signed-off-by: Mingkai Hu <Mingkai.Hu@freescale.com>
|
||||
Integrated-by: Jiang Yutang <yutang.jiang@nxp.com>
|
||||
---
|
||||
arch/arm64/Kconfig.platforms | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/arch/arm64/Kconfig.platforms
|
||||
+++ b/arch/arm64/Kconfig.platforms
|
||||
@@ -31,6 +31,8 @@ config ARCH_EXYNOS7
|
||||
|
||||
config ARCH_LAYERSCAPE
|
||||
bool "ARMv8 based Freescale Layerscape SoC family"
|
||||
+ select PCI_LAYERSCAPE if PCI
|
||||
+ select LS_SCFG_MSI if PCI_MSI
|
||||
help
|
||||
This enables support for the Freescale Layerscape SoC family.
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
From 53ff2bc222c446dfb6ffa9b708a23e7b8b82abb3 Mon Sep 17 00:00:00 2001
|
||||
From: Pan Jiafei <Jiafei.Pan@nxp.com>
|
||||
Date: Fri, 3 Jun 2016 06:45:57 +0000
|
||||
Subject: [PATCH 62/70] armv8: aarch32: enable pci_domains for armv8-32bit
|
||||
|
||||
Signed-off-by: Pan Jiafei <Jiafei.Pan@nxp.com>
|
||||
---
|
||||
arch/arm/mach-imx/Kconfig | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/arch/arm/mach-imx/Kconfig
|
||||
+++ b/arch/arm/mach-imx/Kconfig
|
||||
@@ -617,6 +617,7 @@ config ARCH_LAYERSCAPE
|
||||
select ARM_GIC
|
||||
select HAVE_ARM_ARCH_TIMER
|
||||
select PCI_LAYERSCAPE if PCI
|
||||
+ select PCI_DOMAINS if PCI
|
||||
select LS1_MSI if PCI_MSI
|
||||
|
||||
help
|
|
@ -0,0 +1,93 @@
|
|||
From 4885eb650b27f5639c8c72b8d4daa37f533b0b4d Mon Sep 17 00:00:00 2001
|
||||
From: Yutang Jiang <yutang.jiang@nxp.com>
|
||||
Date: Fri, 22 Jul 2016 01:03:29 +0800
|
||||
Subject: [PATCH 69/70] Revert "arm64: simplify dma_get_ops"
|
||||
|
||||
This reverts commit 1dccb598df549d892b6450c261da54cdd7af44b4.
|
||||
---
|
||||
arch/arm64/include/asm/dma-mapping.h | 13 ++++++++++---
|
||||
arch/arm64/mm/dma-mapping.c | 16 ++++++++++++----
|
||||
2 files changed, 22 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/arch/arm64/include/asm/dma-mapping.h
|
||||
+++ b/arch/arm64/include/asm/dma-mapping.h
|
||||
@@ -18,6 +18,7 @@
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
+#include <linux/acpi.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/vmalloc.h>
|
||||
|
||||
@@ -25,16 +26,22 @@
|
||||
#include <asm/xen/hypervisor.h>
|
||||
|
||||
#define DMA_ERROR_CODE (~(dma_addr_t)0)
|
||||
+extern struct dma_map_ops *dma_ops;
|
||||
extern struct dma_map_ops dummy_dma_ops;
|
||||
|
||||
static inline struct dma_map_ops *__generic_dma_ops(struct device *dev)
|
||||
{
|
||||
- if (dev && dev->archdata.dma_ops)
|
||||
+ if (unlikely(!dev))
|
||||
+ return dma_ops;
|
||||
+ else if (dev->archdata.dma_ops)
|
||||
return dev->archdata.dma_ops;
|
||||
+ else if (acpi_disabled)
|
||||
+ return dma_ops;
|
||||
|
||||
/*
|
||||
- * We expect no ISA devices, and all other DMA masters are expected to
|
||||
- * have someone call arch_setup_dma_ops at device creation time.
|
||||
+ * When ACPI is enabled, if arch_set_dma_ops is not called,
|
||||
+ * we will disable device DMA capability by setting it
|
||||
+ * to dummy_dma_ops.
|
||||
*/
|
||||
return &dummy_dma_ops;
|
||||
}
|
||||
--- a/arch/arm64/mm/dma-mapping.c
|
||||
+++ b/arch/arm64/mm/dma-mapping.c
|
||||
@@ -18,7 +18,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/gfp.h>
|
||||
-#include <linux/acpi.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/genalloc.h>
|
||||
@@ -29,6 +28,9 @@
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
|
||||
+struct dma_map_ops *dma_ops;
|
||||
+EXPORT_SYMBOL(dma_ops);
|
||||
+
|
||||
static pgprot_t __get_dma_pgprot(struct dma_attrs *attrs, pgprot_t prot,
|
||||
bool coherent)
|
||||
{
|
||||
@@ -513,7 +515,13 @@ EXPORT_SYMBOL(dummy_dma_ops);
|
||||
|
||||
static int __init arm64_dma_init(void)
|
||||
{
|
||||
- return atomic_pool_init();
|
||||
+ int ret;
|
||||
+
|
||||
+ dma_ops = &swiotlb_dma_ops;
|
||||
+
|
||||
+ ret = atomic_pool_init();
|
||||
+
|
||||
+ return ret;
|
||||
}
|
||||
arch_initcall(arm64_dma_init);
|
||||
|
||||
@@ -987,8 +995,8 @@ static void __iommu_setup_dma_ops(struct
|
||||
void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
|
||||
struct iommu_ops *iommu, bool coherent)
|
||||
{
|
||||
- if (!dev->archdata.dma_ops)
|
||||
- dev->archdata.dma_ops = &swiotlb_dma_ops;
|
||||
+ if (!acpi_disabled && !dev->archdata.dma_ops)
|
||||
+ dev->archdata.dma_ops = dma_ops;
|
||||
|
||||
dev->archdata.dma_coherent = coherent;
|
||||
__iommu_setup_dma_ops(dev, dma_base, size, iommu);
|
|
@ -0,0 +1,304 @@
|
|||
From 6f7a129e59721f6d97a0f06f7078d06f19ade69e Mon Sep 17 00:00:00 2001
|
||||
From: Yutang Jiang <yutang.jiang@nxp.com>
|
||||
Date: Thu, 21 Jul 2016 19:37:42 +0800
|
||||
Subject: [PATCH 70/70] Revert "arm64: use fixmap region for permanent FDT
|
||||
mapping"
|
||||
|
||||
Signed-off-by: Yutang Jiang <yutang.jiang@nxp.com>
|
||||
---
|
||||
Documentation/arm64/booting.txt | 10 +++----
|
||||
arch/arm64/include/asm/boot.h | 14 ----------
|
||||
arch/arm64/include/asm/fixmap.h | 15 -----------
|
||||
arch/arm64/include/asm/mmu.h | 1 -
|
||||
arch/arm64/kernel/head.S | 39 ++++++++++++++++++++++++++-
|
||||
arch/arm64/kernel/setup.c | 29 +++++++++++++-------
|
||||
arch/arm64/mm/init.c | 1 +
|
||||
arch/arm64/mm/mmu.c | 57 ---------------------------------------
|
||||
8 files changed, 62 insertions(+), 104 deletions(-)
|
||||
delete mode 100644 arch/arm64/include/asm/boot.h
|
||||
|
||||
--- a/Documentation/arm64/booting.txt
|
||||
+++ b/Documentation/arm64/booting.txt
|
||||
@@ -45,13 +45,11 @@ sees fit.)
|
||||
|
||||
Requirement: MANDATORY
|
||||
|
||||
-The device tree blob (dtb) must be placed on an 8-byte boundary and must
|
||||
-not exceed 2 megabytes in size. Since the dtb will be mapped cacheable
|
||||
-using blocks of up to 2 megabytes in size, it must not be placed within
|
||||
-any 2M region which must be mapped with any specific attributes.
|
||||
+The device tree blob (dtb) must be placed on an 8-byte boundary within
|
||||
+the first 512 megabytes from the start of the kernel image and must not
|
||||
+cross a 2-megabyte boundary. This is to allow the kernel to map the
|
||||
+blob using a single section mapping in the initial page tables.
|
||||
|
||||
-NOTE: versions prior to v4.2 also require that the DTB be placed within
|
||||
-the 512 MB region starting at text_offset bytes below the kernel Image.
|
||||
|
||||
3. Decompress the kernel image
|
||||
------------------------------
|
||||
--- a/arch/arm64/include/asm/boot.h
|
||||
+++ /dev/null
|
||||
@@ -1,14 +0,0 @@
|
||||
-
|
||||
-#ifndef __ASM_BOOT_H
|
||||
-#define __ASM_BOOT_H
|
||||
-
|
||||
-#include <asm/sizes.h>
|
||||
-
|
||||
-/*
|
||||
- * arm64 requires the DTB to be 8 byte aligned and
|
||||
- * not exceed 2MB in size.
|
||||
- */
|
||||
-#define MIN_FDT_ALIGN 8
|
||||
-#define MAX_FDT_SIZE SZ_2M
|
||||
-
|
||||
-#endif
|
||||
--- a/arch/arm64/include/asm/fixmap.h
|
||||
+++ b/arch/arm64/include/asm/fixmap.h
|
||||
@@ -18,7 +18,6 @@
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/sizes.h>
|
||||
-#include <asm/boot.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
/*
|
||||
@@ -34,20 +33,6 @@
|
||||
*/
|
||||
enum fixed_addresses {
|
||||
FIX_HOLE,
|
||||
-
|
||||
- /*
|
||||
- * Reserve a virtual window for the FDT that is 2 MB larger than the
|
||||
- * maximum supported size, and put it at the top of the fixmap region.
|
||||
- * The additional space ensures that any FDT that does not exceed
|
||||
- * MAX_FDT_SIZE can be mapped regardless of whether it crosses any
|
||||
- * 2 MB alignment boundaries.
|
||||
- *
|
||||
- * Keep this at the top so it remains 2 MB aligned.
|
||||
- */
|
||||
-#define FIX_FDT_SIZE (MAX_FDT_SIZE + SZ_2M)
|
||||
- FIX_FDT_END,
|
||||
- FIX_FDT = FIX_FDT_END + FIX_FDT_SIZE / PAGE_SIZE - 1,
|
||||
-
|
||||
FIX_EARLYCON_MEM_BASE,
|
||||
FIX_TEXT_POKE0,
|
||||
__end_of_permanent_fixed_addresses,
|
||||
--- a/arch/arm64/include/asm/mmu.h
|
||||
+++ b/arch/arm64/include/asm/mmu.h
|
||||
@@ -34,6 +34,5 @@ extern void init_mem_pgprot(void);
|
||||
extern void create_pgd_mapping(struct mm_struct *mm, phys_addr_t phys,
|
||||
unsigned long virt, phys_addr_t size,
|
||||
pgprot_t prot);
|
||||
-extern void *fixmap_remap_fdt(phys_addr_t dt_phys);
|
||||
|
||||
#endif
|
||||
--- a/arch/arm64/kernel/head.S
|
||||
+++ b/arch/arm64/kernel/head.S
|
||||
@@ -212,6 +212,8 @@ ENTRY(stext)
|
||||
bl el2_setup // Drop to EL1, w20=cpu_boot_mode
|
||||
adrp x24, __PHYS_OFFSET
|
||||
bl set_cpu_boot_mode_flag
|
||||
+
|
||||
+ bl __vet_fdt
|
||||
bl __create_page_tables // x25=TTBR0, x26=TTBR1
|
||||
/*
|
||||
* The following calls CPU setup code, see arch/arm64/mm/proc.S for
|
||||
@@ -243,6 +245,24 @@ preserve_boot_args:
|
||||
ENDPROC(preserve_boot_args)
|
||||
|
||||
/*
|
||||
+ * Determine validity of the x21 FDT pointer.
|
||||
+ * The dtb must be 8-byte aligned and live in the first 512M of memory.
|
||||
+ */
|
||||
+__vet_fdt:
|
||||
+ tst x21, #0x7
|
||||
+ b.ne 1f
|
||||
+ cmp x21, x24
|
||||
+ b.lt 1f
|
||||
+ mov x0, #(1 << 29)
|
||||
+ add x0, x0, x24
|
||||
+ cmp x21, x0
|
||||
+ b.ge 1f
|
||||
+ ret
|
||||
+1:
|
||||
+ mov x21, #0
|
||||
+ ret
|
||||
+ENDPROC(__vet_fdt)
|
||||
+/*
|
||||
* Macro to create a table entry to the next page.
|
||||
*
|
||||
* tbl: page table address
|
||||
@@ -306,7 +326,8 @@ ENDPROC(preserve_boot_args)
|
||||
* required to get the kernel running. The following sections are required:
|
||||
* - identity mapping to enable the MMU (low address, TTBR0)
|
||||
* - first few MB of the kernel linear mapping to jump to once the MMU has
|
||||
- * been enabled
|
||||
+ * been enabled, including the FDT blob (TTBR1)
|
||||
+ * - pgd entry for fixed mappings (TTBR1)
|
||||
*/
|
||||
__create_page_tables:
|
||||
adrp x25, idmap_pg_dir
|
||||
@@ -396,6 +417,22 @@ __create_page_tables:
|
||||
create_block_map x0, x7, x3, x5, x6
|
||||
|
||||
/*
|
||||
+ * Map the FDT blob (maximum 2MB; must be within 512MB of
|
||||
+ * PHYS_OFFSET).
|
||||
+ */
|
||||
+ mov x3, x21 // FDT phys address
|
||||
+ and x3, x3, #~((1 << 21) - 1) // 2MB aligned
|
||||
+ mov x6, #PAGE_OFFSET
|
||||
+ sub x5, x3, x24 // subtract PHYS_OFFSET
|
||||
+ tst x5, #~((1 << 29) - 1) // within 512MB?
|
||||
+ csel x21, xzr, x21, ne // zero the FDT pointer
|
||||
+ b.ne 1f
|
||||
+ add x5, x5, x6 // __va(FDT blob)
|
||||
+ add x6, x5, #1 << 21 // 2MB for the FDT blob
|
||||
+ sub x6, x6, #1 // inclusive range
|
||||
+ create_block_map x0, x7, x3, x5, x6
|
||||
+1:
|
||||
+ /*
|
||||
* Since the page tables have been populated with non-cacheable
|
||||
* accesses (MMU disabled), invalidate the idmap and swapper page
|
||||
* tables again to remove any speculatively loaded cache lines.
|
||||
--- a/arch/arm64/kernel/setup.c
|
||||
+++ b/arch/arm64/kernel/setup.c
|
||||
@@ -87,6 +87,18 @@ static struct resource mem_res[] = {
|
||||
#define kernel_code mem_res[0]
|
||||
#define kernel_data mem_res[1]
|
||||
|
||||
+void __init early_print(const char *str, ...)
|
||||
+{
|
||||
+ char buf[256];
|
||||
+ va_list ap;
|
||||
+
|
||||
+ va_start(ap, str);
|
||||
+ vsnprintf(buf, sizeof(buf), str, ap);
|
||||
+ va_end(ap);
|
||||
+
|
||||
+ printk("%s", buf);
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* The recorded values of x0 .. x3 upon kernel entry.
|
||||
*/
|
||||
@@ -180,14 +192,12 @@ static void __init smp_build_mpidr_hash(
|
||||
|
||||
static void __init setup_machine_fdt(phys_addr_t dt_phys)
|
||||
{
|
||||
- void *dt_virt = fixmap_remap_fdt(dt_phys);
|
||||
-
|
||||
- if (!dt_virt || !early_init_dt_scan(dt_virt)) {
|
||||
- pr_crit("\n"
|
||||
- "Error: invalid device tree blob at physical address %pa (virtual address 0x%p)\n"
|
||||
- "The dtb must be 8-byte aligned and must not exceed 2 MB in size\n"
|
||||
- "\nPlease check your bootloader.",
|
||||
- &dt_phys, dt_virt);
|
||||
+ if (!dt_phys || !early_init_dt_scan(phys_to_virt(dt_phys))) {
|
||||
+ early_print("\n"
|
||||
+ "Error: invalid device tree blob at physical address 0x%p (virtual address 0x%p)\n"
|
||||
+ "The dtb must be 8-byte aligned and passed in the first 512MB of memory\n"
|
||||
+ "\nPlease check your bootloader.\n",
|
||||
+ dt_phys, phys_to_virt(dt_phys));
|
||||
|
||||
while (true)
|
||||
cpu_relax();
|
||||
@@ -294,6 +304,7 @@ void __init setup_arch(char **cmdline_p)
|
||||
pr_info("Boot CPU: AArch64 Processor [%08x]\n", read_cpuid_id());
|
||||
|
||||
sprintf(init_utsname()->machine, ELF_PLATFORM);
|
||||
+ setup_machine_fdt(__fdt_pointer);
|
||||
init_mm.start_code = (unsigned long) _text;
|
||||
init_mm.end_code = (unsigned long) _etext;
|
||||
init_mm.end_data = (unsigned long) _edata;
|
||||
@@ -304,8 +315,6 @@ void __init setup_arch(char **cmdline_p)
|
||||
early_fixmap_init();
|
||||
early_ioremap_init();
|
||||
|
||||
- setup_machine_fdt(__fdt_pointer);
|
||||
-
|
||||
parse_early_param();
|
||||
|
||||
/*
|
||||
--- a/arch/arm64/mm/init.c
|
||||
+++ b/arch/arm64/mm/init.c
|
||||
@@ -171,6 +171,7 @@ void __init arm64_memblock_init(void)
|
||||
memblock_reserve(__virt_to_phys(initrd_start), initrd_end - initrd_start);
|
||||
#endif
|
||||
|
||||
+ early_init_fdt_reserve_self();
|
||||
early_init_fdt_scan_reserved_mem();
|
||||
|
||||
/* 4GB maximum for 32-bit only capable devices */
|
||||
--- a/arch/arm64/mm/mmu.c
|
||||
+++ b/arch/arm64/mm/mmu.c
|
||||
@@ -21,7 +21,6 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/init.h>
|
||||
-#include <linux/libfdt.h>
|
||||
#include <linux/mman.h>
|
||||
#include <linux/nodemask.h>
|
||||
#include <linux/memblock.h>
|
||||
@@ -641,59 +640,3 @@ void __set_fixmap(enum fixed_addresses i
|
||||
flush_tlb_kernel_range(addr, addr+PAGE_SIZE);
|
||||
}
|
||||
}
|
||||
-
|
||||
-void *__init fixmap_remap_fdt(phys_addr_t dt_phys)
|
||||
-{
|
||||
- const u64 dt_virt_base = __fix_to_virt(FIX_FDT);
|
||||
- pgprot_t prot = PAGE_KERNEL_RO;
|
||||
- int size, offset;
|
||||
- void *dt_virt;
|
||||
-
|
||||
- /*
|
||||
- * Check whether the physical FDT address is set and meets the minimum
|
||||
- * alignment requirement. Since we are relying on MIN_FDT_ALIGN to be
|
||||
- * at least 8 bytes so that we can always access the magic and size
|
||||
- * fields of the FDT header after mapping the first chunk, double check
|
||||
- * here if that is indeed the case.
|
||||
- */
|
||||
- BUILD_BUG_ON(MIN_FDT_ALIGN < 8);
|
||||
- if (!dt_phys || dt_phys % MIN_FDT_ALIGN)
|
||||
- return NULL;
|
||||
-
|
||||
- /*
|
||||
- * Make sure that the FDT region can be mapped without the need to
|
||||
- * allocate additional translation table pages, so that it is safe
|
||||
- * to call create_mapping() this early.
|
||||
- *
|
||||
- * On 64k pages, the FDT will be mapped using PTEs, so we need to
|
||||
- * be in the same PMD as the rest of the fixmap.
|
||||
- * On 4k pages, we'll use section mappings for the FDT so we only
|
||||
- * have to be in the same PUD.
|
||||
- */
|
||||
- BUILD_BUG_ON(dt_virt_base % SZ_2M);
|
||||
-
|
||||
- BUILD_BUG_ON(__fix_to_virt(FIX_FDT_END) >> SWAPPER_TABLE_SHIFT !=
|
||||
- __fix_to_virt(FIX_BTMAP_BEGIN) >> SWAPPER_TABLE_SHIFT);
|
||||
-
|
||||
- offset = dt_phys % SWAPPER_BLOCK_SIZE;
|
||||
- dt_virt = (void *)dt_virt_base + offset;
|
||||
-
|
||||
- /* map the first chunk so we can read the size from the header */
|
||||
- create_mapping(round_down(dt_phys, SWAPPER_BLOCK_SIZE), dt_virt_base,
|
||||
- SWAPPER_BLOCK_SIZE, prot);
|
||||
-
|
||||
- if (fdt_magic(dt_virt) != FDT_MAGIC)
|
||||
- return NULL;
|
||||
-
|
||||
- size = fdt_totalsize(dt_virt);
|
||||
- if (size > MAX_FDT_SIZE)
|
||||
- return NULL;
|
||||
-
|
||||
- if (offset + size > SWAPPER_BLOCK_SIZE)
|
||||
- create_mapping(round_down(dt_phys, SWAPPER_BLOCK_SIZE), dt_virt_base,
|
||||
- round_up(offset + size, SWAPPER_BLOCK_SIZE), prot);
|
||||
-
|
||||
- memblock_reserve(dt_phys, size);
|
||||
-
|
||||
- return dt_virt;
|
||||
-}
|
Loading…
Reference in a new issue