diff --git a/packages/base/any/initrds/buildroot/APKG.yml b/packages/base/any/initrds/buildroot/APKG.yml
new file mode 100644
index 00000000..c59cf6cd
--- /dev/null
+++ b/packages/base/any/initrds/buildroot/APKG.yml
@@ -0,0 +1,31 @@
+############################################################
+#
+# Buildroot Package Template
+#
+# Requires: ARCH
+#
+############################################################
+prerequisites:
+ submodules:
+ - { root: "${ONL}", path : packages/base/any/initrds/buildroot/builds/buildroot-mirror, recursive: true }
+
+common:
+ arch: $ARCH
+ version: 1.0.0
+ copyright: Copyright 2013, 2014, 2015 Big Switch Networks
+ maintainer: support@bigswitch.com
+
+packages:
+ - name: onl-buildroot-initrd
+ version: 1.0.0
+ summary: Open Network Linux Base Buildroot Initrd CPIO ($ARCH)
+
+ files:
+ builds/onl-buildroot-initrd-$ARCH.cpio.gz : $$PKG_INSTALL/
+ builds/makedevs : $$PKG_INSTALL/buildroot-makedevs
+
+ changelog: Change changes changes.,
+
+
+
+
diff --git a/packages/base/any/initrds/buildroot/Makefile.any b/packages/base/any/initrds/buildroot/Makefile.any
new file mode 100644
index 00000000..e4030ab2
--- /dev/null
+++ b/packages/base/any/initrds/buildroot/Makefile.any
@@ -0,0 +1,46 @@
+# -*- Makefile -*-
+############################################################
+#
+#
+# Copyright 2013, 2014 Big Switch Networks, Inc.
+#
+# Licensed under the Eclipse Public License, Version 1.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+# either express or implied. See the License for the specific
+# language governing permissions and limitations under the
+# License.
+#
+#
+############################################################
+#
+#
+############################################################
+ifndef ARCH
+$(error $$ARCH is not set)
+endif
+
+ifndef BUILDROOT_ARCH
+BUILDROOT_ARCH := $(ARCH)
+endif
+
+ONL_BUILDROOT := $(ONL)/packages/base/any/initrds/buildroot/builds
+
+buildroot-initrd-$(ARCH).cpio.gz: $(ONL_BUILDROOT)/.setup.done
+ $(MAKE) -C $(ONL_BUILDROOT) buildroot-$(BUILDROOT_ARCH)
+ cp $(ONL_BUILDROOT)/buildroot-$(BUILDROOT_ARCH)/images/rootfs.cpio.gz onl-buildroot-initrd-$(ARCH).cpio.gz
+ cp $(ONL_BUILDROOT)/buildroot-$(BUILDROOT_ARCH)/host/usr/bin/makedevs .
+ chmod +x makedevs
+
+$(ONL_BUILDROOT)/.setup.done:
+ $(MAKE) -C $(ONL_BUILDROOT) setup
+ touch $(ONL_BUILDROOT)/.setup.done
+
+
+.PHONY: onl-buildroot-initrd-$(ARCH).cpio.gz
diff --git a/packages/base/any/initrds/buildroot/builds/.gitignore b/packages/base/any/initrds/buildroot/builds/.gitignore
new file mode 100644
index 00000000..120832e6
--- /dev/null
+++ b/packages/base/any/initrds/buildroot/builds/.gitignore
@@ -0,0 +1,3 @@
+.setup.done
+buildroot-powerpc
+buildroot-x86_64
diff --git a/packages/base/any/initrds/buildroot/builds/Makefile b/packages/base/any/initrds/buildroot/builds/Makefile
new file mode 100644
index 00000000..5d84e9ba
--- /dev/null
+++ b/packages/base/any/initrds/buildroot/builds/Makefile
@@ -0,0 +1,58 @@
+############################################################
+#
+#
+# Copyright 2013, 2014 BigSwitch Networks, Inc.
+#
+#
+#
+#
+############################################################
+#
+# ONL base buildroot cpio.
+#
+############################################################
+include $(ONL)/make/config.mk
+
+#
+# We build for these architectures
+#
+ARCHS := powerpc x86_64
+BUILDROOT_ARCHDIRS := $(foreach a,$(ARCHS),buildroot-$(a))
+BUILDROOT_SOURCE := buildroot-mirror
+
+.PHONY: all clean setup $(BUILDROOT_ARCHDIRS)
+
+all: setup $(BUILDROOT_ARCHDIRS)
+
+clean:
+ rm -rf $(BUILDROOT_ARCHDIRS)
+
+
+setup:
+ cp $(wildcard patches/busybox*.patch) $(BUILDROOT_SOURCE)/package/busybox/
+ cp $(wildcard patches/kexec*.patch) $(BUILDROOT_SOURCE)/package/kexec/
+ sed -i 's%^DOSFSTOOLS_SITE =.*%DOSFSTOOLS_SITE = http://downloads.openwrt.org/sources%' $(BUILDROOT_SOURCE)/package/dosfstools/dosfstools.mk
+ sed -i 's%^UEMACS_SITE =.*%UEMACS_SITE = http://www.kernel.org/pub/linux/kernel/uemacs%;s%^UEMACS_SOURCE =.*%UEMACS_SOURCE = em-$$(UEMACS_VERSION).tar.gz%' $(BUILDROOT_SOURCE)/package/uemacs/uemacs.mk
+ mkdir -p $(BUILDROOT_SOURCE)/package/jq
+ cp patches/jq.mk $(BUILDROOT_SOURCE)/package/jq/jq.mk
+ cp patches/jq.Config.in $(BUILDROOT_SOURCE)/package/jq/Config.in
+ sed -i '/[/]jq[/]/d' $(BUILDROOT_SOURCE)/package/Config.in
+ sed -i '/[/]yajl[/]/a\source "package/jq/Config.in"' $(BUILDROOT_SOURCE)/package/Config.in
+ mkdir -p $(BUILDROOT_ARCHDIRS)
+ $(foreach a,$(ARCHS),cp buildroot.config-$(a) buildroot-$(a)/.config ;)
+
+
+define buildroot_arch
+buildroot-$(1):
+ make -C $(BUILDROOT_SOURCE) O=../buildroot-$(1)
+
+buildroot-menuconfig-$(1):
+ make -C $(BUILDROOT_SOURCE) menuconfig O=../buildroot-$(1)
+ cp buildroot-powerpc/.config buildroot.config-$(1)
+endef
+
+$(foreach a,$(ARCHS),$(eval $(call buildroot_arch,$(a))))
+
+busybox-menuconfig:
+ make -C $(BUILDROOT_SOURCE) busybox-menuconfig O=../buildroot-powerpc
+ cp buildroot-powerpc/build/busybox-*/.config busybox.config
diff --git a/packages/base/any/initrds/buildroot/builds/buildroot.config-powerpc b/packages/base/any/initrds/buildroot/builds/buildroot.config-powerpc
new file mode 100644
index 00000000..f136ebbe
--- /dev/null
+++ b/packages/base/any/initrds/buildroot/builds/buildroot.config-powerpc
@@ -0,0 +1,1251 @@
+#
+# Automatically generated make config: don't edit
+# Buildroot 2013.02-rc2-dirty Configuration
+#
+BR2_HAVE_DOT_CONFIG=y
+# BR2_arm is not set
+# BR2_armeb is not set
+# BR2_aarch64 is not set
+# BR2_avr32 is not set
+# BR2_bfin is not set
+# BR2_i386 is not set
+# BR2_microblazeel is not set
+# BR2_microblazebe is not set
+# BR2_mips is not set
+# BR2_mipsel is not set
+# BR2_mips64 is not set
+# BR2_mips64el is not set
+BR2_powerpc=y
+# BR2_sh is not set
+# BR2_sh64 is not set
+# BR2_sparc is not set
+# BR2_x86_64 is not set
+# BR2_xtensa is not set
+BR2_ARCH="powerpc"
+BR2_ENDIAN="BIG"
+BR2_generic_powerpc=y
+# BR2_powerpc_401 is not set
+# BR2_powerpc_403 is not set
+# BR2_powerpc_405 is not set
+# BR2_powerpc_405fp is not set
+# BR2_powerpc_440 is not set
+# BR2_powerpc_440fp is not set
+# BR2_powerpc_464 is not set
+# BR2_powerpc_464fp is not set
+# BR2_powerpc_476 is not set
+# BR2_powerpc_476fp is not set
+# BR2_powerpc_505 is not set
+# BR2_powerpc_601 is not set
+# BR2_powerpc_602 is not set
+# BR2_powerpc_603 is not set
+# BR2_powerpc_603e is not set
+# BR2_powerpc_604 is not set
+# BR2_powerpc_604e is not set
+# BR2_powerpc_620 is not set
+# BR2_powerpc_630 is not set
+# BR2_powerpc_740 is not set
+# BR2_powerpc_7400 is not set
+# BR2_powerpc_7450 is not set
+# BR2_powerpc_750 is not set
+# BR2_powerpc_821 is not set
+# BR2_powerpc_823 is not set
+# BR2_powerpc_860 is not set
+# BR2_powerpc_970 is not set
+# BR2_powerpc_8540 is not set
+# BR2_powerpc_8548 is not set
+# BR2_powerpc_e300c2 is not set
+# BR2_powerpc_e300c3 is not set
+# BR2_powerpc_e500mc is not set
+BR2_powerpc_CLASSIC=y
+
+#
+# Build options
+#
+
+#
+# Commands
+#
+BR2_WGET="wget --passive-ftp -nd -t 3"
+BR2_SVN="svn"
+BR2_BZR="bzr"
+BR2_GIT="git"
+BR2_LOCALFILES="cp"
+BR2_SCP="scp"
+BR2_SSH="ssh"
+BR2_HG="hg"
+BR2_ZCAT="gzip -d -c"
+BR2_BZCAT="bzcat"
+BR2_XZCAT="xzcat"
+BR2_TAR_OPTIONS=""
+BR2_DEFCONFIG="$(CONFIG_DIR)/defconfig"
+BR2_DL_DIR="$(TOPDIR)/dl"
+BR2_HOST_DIR="$(BASE_DIR)/host"
+
+#
+# Mirrors and Download locations
+#
+BR2_PRIMARY_SITE="http://switch-nfs/export/buildroot-download-cache/dl"
+BR2_PRIMARY_SITE_ONLY=y
+BR2_BACKUP_SITE="http://sources.buildroot.net/"
+BR2_KERNEL_MIRROR="http://www.kernel.org/pub/"
+BR2_GNU_MIRROR="http://ftp.gnu.org/pub/gnu"
+BR2_DEBIAN_MIRROR="http://ftp.debian.org"
+BR2_JLEVEL=0
+BR2_CCACHE=y
+BR2_CCACHE_DIR="$(HOME)/.buildroot-ccache"
+# BR2_DEPRECATED is not set
+# BR2_ENABLE_DEBUG is not set
+BR2_STRIP_strip=y
+# BR2_STRIP_sstrip is not set
+# BR2_STRIP_none is not set
+BR2_STRIP_EXCLUDE_FILES=""
+BR2_STRIP_EXCLUDE_DIRS=""
+# BR2_OPTIMIZE_0 is not set
+# BR2_OPTIMIZE_1 is not set
+# BR2_OPTIMIZE_2 is not set
+# BR2_OPTIMIZE_3 is not set
+BR2_OPTIMIZE_S=y
+# BR2_PREFER_STATIC_LIB is not set
+BR2_PACKAGE_OVERRIDE_FILE="$(TOPDIR)/local.mk"
+
+#
+# Toolchain
+#
+BR2_TOOLCHAIN_BUILDROOT=y
+# BR2_TOOLCHAIN_EXTERNAL is not set
+# BR2_TOOLCHAIN_CTNG is not set
+
+#
+# Kernel Header Options
+#
+# BR2_KERNEL_HEADERS_3_0 is not set
+# BR2_KERNEL_HEADERS_3_2 is not set
+# BR2_KERNEL_HEADERS_3_4 is not set
+BR2_KERNEL_HEADERS_3_6=y
+# BR2_KERNEL_HEADERS_3_7 is not set
+# BR2_KERNEL_HEADERS_VERSION is not set
+# BR2_KERNEL_HEADERS_SNAP is not set
+BR2_DEFAULT_KERNEL_HEADERS="3.6.11"
+
+#
+# uClibc Options
+#
+# BR2_UCLIBC_VERSION_0_9_32 is not set
+BR2_UCLIBC_VERSION_0_9_33=y
+# BR2_UCLIBC_VERSION_SNAPSHOT is not set
+BR2_UCLIBC_VERSION_STRING="0.9.33.2"
+BR2_UCLIBC_CONFIG="toolchain/uClibc/uClibc-0.9.33.config"
+# BR2_PTHREAD_DEBUG is not set
+# BR2_UCLIBC_INSTALL_TEST_SUITE is not set
+
+#
+# Binutils Options
+#
+# BR2_BINUTILS_VERSION_2_20_1 is not set
+# BR2_BINUTILS_VERSION_2_21 is not set
+BR2_BINUTILS_VERSION_2_21_1=y
+# BR2_BINUTILS_VERSION_2_22 is not set
+# BR2_BINUTILS_VERSION_2_23_1 is not set
+BR2_BINUTILS_VERSION="2.21.1"
+BR2_BINUTILS_EXTRA_CONFIG_OPTIONS=""
+
+#
+# GCC Options
+#
+# BR2_GCC_VERSION_4_3_X is not set
+# BR2_GCC_VERSION_4_4_X is not set
+# BR2_GCC_VERSION_4_5_X is not set
+BR2_GCC_VERSION_4_6_X=y
+# BR2_GCC_VERSION_4_7_X is not set
+# BR2_GCC_VERSION_SNAP is not set
+BR2_GCC_SUPPORTS_FINEGRAINEDMTUNE=y
+BR2_GCC_VERSION="4.6.3"
+BR2_EXTRA_GCC_CONFIG_OPTIONS=""
+# BR2_INSTALL_OBJC is not set
+# BR2_INSTALL_FORTRAN is not set
+BR2_GCC_SHARED_LIBGCC=y
+BR2_GCC_ENABLE_TLS=y
+# BR2_GCC_ENABLE_OPENMP is not set
+
+#
+# Gdb Options
+#
+# BR2_PACKAGE_GDB is not set
+# BR2_PACKAGE_GDB_SERVER is not set
+# BR2_PACKAGE_GDB_HOST is not set
+BR2_LARGEFILE=y
+BR2_INET_IPV6=y
+BR2_TOOLCHAIN_HAS_NATIVE_RPC=y
+BR2_USE_WCHAR=y
+BR2_TOOLCHAIN_HAS_THREADS=y
+BR2_TOOLCHAIN_HAS_THREADS_DEBUG_IF_NEEDED=y
+BR2_TOOLCHAIN_HAS_SHADOW_PASSWORDS=y
+# BR2_ENABLE_LOCALE_PURGE is not set
+BR2_GENERATE_LOCALE=""
+BR2_NEEDS_GETTEXT=y
+BR2_USE_MMU=y
+# BR2_SOFT_FLOAT is not set
+BR2_TARGET_OPTIMIZATION="-pipe"
+BR2_TARGET_LDFLAGS=""
+# BR2_ECLIPSE_REGISTER is not set
+
+#
+# Toolchain Options
+#
+BR2_TOOLCHAIN_BUILDROOT_LARGEFILE=y
+BR2_TOOLCHAIN_BUILDROOT_INET_IPV6=y
+BR2_TOOLCHAIN_BUILDROOT_INET_RPC=y
+BR2_TOOLCHAIN_BUILDROOT_WCHAR=y
+# BR2_TOOLCHAIN_BUILDROOT_LOCALE is not set
+# BR2_TOOLCHAIN_BUILDROOT_CXX is not set
+# BR2_TOOLCHAIN_BUILDROOT_USE_SSP is not set
+# BR2_PTHREADS_NONE is not set
+# BR2_PTHREADS is not set
+# BR2_PTHREADS_OLD is not set
+BR2_PTHREADS_NATIVE=y
+
+#
+# System configuration
+#
+BR2_TARGET_GENERIC_HOSTNAME=""
+BR2_TARGET_GENERIC_ISSUE=""
+# BR2_TARGET_GENERIC_PASSWD_DES is not set
+BR2_TARGET_GENERIC_PASSWD_MD5=y
+# BR2_TARGET_GENERIC_PASSWD_SHA256 is not set
+# BR2_TARGET_GENERIC_PASSWD_SHA512 is not set
+BR2_TARGET_GENERIC_PASSWD_METHOD="md5"
+# BR2_ROOTFS_DEVICE_CREATION_STATIC is not set
+# BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_DEVTMPFS is not set
+BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_MDEV=y
+# BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_UDEV is not set
+# BR2_INIT_BUSYBOX is not set
+# BR2_INIT_SYSV is not set
+
+#
+# systemd requires largefile, wchar, IPv6, threads and udev support
+#
+BR2_INIT_NONE=y
+BR2_ROOTFS_DEVICE_TABLE="../rootperms"
+# BR2_ROOTFS_SKELETON_DEFAULT is not set
+BR2_ROOTFS_SKELETON_CUSTOM=y
+BR2_ROOTFS_SKELETON_CUSTOM_PATH="system/skeleton"
+BR2_ROOTFS_OVERLAY=""
+BR2_ROOTFS_POST_BUILD_SCRIPT="../post-build"
+BR2_ROOTFS_POST_IMAGE_SCRIPT=""
+
+#
+# Package Selection for the target
+#
+BR2_PACKAGE_BUSYBOX=y
+# BR2_BUSYBOX_VERSION_1_19_X is not set
+BR2_BUSYBOX_VERSION_1_20_X=y
+# BR2_BUSYBOX_VERSION_1_21_X is not set
+# BR2_PACKAGE_BUSYBOX_SNAPSHOT is not set
+BR2_BUSYBOX_VERSION="1.20.2"
+BR2_PACKAGE_BUSYBOX_CONFIG="../busybox.config"
+# BR2_PACKAGE_BUSYBOX_SHOW_OTHERS is not set
+# BR2_PACKAGE_BUSYBOX_WATCHDOG is not set
+
+#
+# Audio and video applications
+#
+# BR2_PACKAGE_ALSA_UTILS is not set
+# BR2_PACKAGE_AUMIX is not set
+
+#
+# bellagio requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_FAAD2 is not set
+# BR2_PACKAGE_FLAC is not set
+# BR2_PACKAGE_FFMPEG is not set
+# BR2_PACKAGE_GSTREAMER is not set
+# BR2_PACKAGE_LAME is not set
+# BR2_PACKAGE_MADPLAY is not set
+
+#
+# mpd requires a toolchain with C++ and WCHAR support
+#
+# BR2_PACKAGE_MPG123 is not set
+# BR2_PACKAGE_MPLAYER is not set
+# BR2_PACKAGE_MUSEPACK is not set
+# BR2_PACKAGE_OPUS_TOOLS is not set
+# BR2_PACKAGE_PULSEAUDIO is not set
+# BR2_PACKAGE_VORBIS_TOOLS is not set
+# BR2_PACKAGE_WAVPACK is not set
+# BR2_PACKAGE_YAVTA is not set
+
+#
+# Compressors and decompressors
+#
+BR2_PACKAGE_BZIP2=y
+# BR2_PACKAGE_INFOZIP is not set
+# BR2_PACKAGE_LZOP is not set
+BR2_PACKAGE_XZ=y
+
+#
+# Debugging, profiling and benchmark
+#
+
+#
+# bonnie++ requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_CACHE_CALIBRATOR is not set
+# BR2_PACKAGE_DHRYSTONE is not set
+# BR2_PACKAGE_DSTAT is not set
+# BR2_PACKAGE_DMALLOC is not set
+BR2_PACKAGE_KEXEC=y
+BR2_PACKAGE_KEXEC_ZLIB=y
+# BR2_PACKAGE_LATENCYTOP is not set
+# BR2_PACKAGE_LMBENCH is not set
+# BR2_PACKAGE_LTP_TESTSUITE is not set
+# BR2_PACKAGE_LTRACE is not set
+# BR2_PACKAGE_MEMSTAT is not set
+# BR2_PACKAGE_NETPERF is not set
+
+#
+# oprofile requires a toolchain with C++ support enabled
+#
+
+#
+# perf only available if Linux kernel is enabled, and requires largefile support
+#
+# BR2_PACKAGE_RAMSPEED is not set
+# BR2_PACKAGE_RT_TESTS is not set
+BR2_PACKAGE_STRACE=y
+# BR2_PACKAGE_STRESS is not set
+# BR2_PACKAGE_SYSPROF is not set
+# BR2_PACKAGE_WHETSTONE is not set
+# BR2_PACKAGE_VALGRIND is not set
+# BR2_PACKAGE_PV is not set
+
+#
+# Development tools
+#
+# BR2_PACKAGE_BINUTILS is not set
+# BR2_PACKAGE_BISON is not set
+# BR2_PACKAGE_BSDIFF is not set
+# BR2_PACKAGE_CVS is not set
+# BR2_PACKAGE_DISTCC is not set
+# BR2_PACKAGE_FLEX is not set
+# BR2_PACKAGE_GETTEXT is not set
+# BR2_PACKAGE_GMP is not set
+
+#
+# gperf requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_MPC is not set
+# BR2_PACKAGE_MPFR is not set
+# BR2_PACKAGE_LIBTOOL is not set
+# BR2_PACKAGE_M4 is not set
+# BR2_PACKAGE_PKGCONF is not set
+# BR2_PACKAGE_SSTRIP is not set
+# BR2_PACKAGE_VALA is not set
+
+#
+# Games
+#
+# BR2_PACKAGE_GNUCHESS is not set
+# BR2_PACKAGE_PRBOOM is not set
+
+#
+# Graphic libraries and applications (graphic/text)
+#
+
+#
+# Graphic applications
+#
+# BR2_PACKAGE_RRDTOOL is not set
+
+#
+# graphic libraries
+#
+
+#
+# cegui06 needs a toolchain with C++ and threads
+#
+# BR2_PACKAGE_DIRECTFB is not set
+# BR2_PACKAGE_FBDUMP is not set
+# BR2_PACKAGE_FBGRAB is not set
+
+#
+# fbterm requires a toolchain with C++, WCHAR and locale support
+#
+# BR2_PACKAGE_FBV is not set
+# BR2_PACKAGE_FB_TEST_APP is not set
+# BR2_PACKAGE_IMAGEMAGICK is not set
+# BR2_PACKAGE_SDL is not set
+
+#
+# other GUIs
+#
+# BR2_PACKAGE_EFL is not set
+
+#
+# qt requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_XORG7 is not set
+
+#
+# X libraries and helper libraries
+#
+# BR2_PACKAGE_LIBERATION is not set
+
+#
+# X Window managers
+#
+
+#
+# X applications
+#
+# BR2_PACKAGE_GOB2 is not set
+
+#
+# midori requires C++, WCHAR in toolchain and libgtk2
+#
+
+#
+# Filesystem and flash utilities
+#
+# BR2_PACKAGE_CIFS_UTILS is not set
+# BR2_PACKAGE_CRAMFS is not set
+# BR2_PACKAGE_CURLFTPFS is not set
+BR2_PACKAGE_DOSFSTOOLS=y
+BR2_PACKAGE_DOSFSTOOLS_MKDOSFS=y
+BR2_PACKAGE_DOSFSTOOLS_DOSFSCK=y
+BR2_PACKAGE_DOSFSTOOLS_DOSFSLABEL=y
+BR2_PACKAGE_E2FSPROGS=y
+# BR2_PACKAGE_E2FSPROGS_BADBLOCKS is not set
+# BR2_PACKAGE_E2FSPROGS_CHATTR is not set
+# BR2_PACKAGE_E2FSPROGS_DEBUGFS is not set
+BR2_PACKAGE_E2FSPROGS_DUMPE2FS=y
+# BR2_PACKAGE_E2FSPROGS_E2FREEFRAG is not set
+BR2_PACKAGE_E2FSPROGS_E2FSCK=y
+# BR2_PACKAGE_E2FSPROGS_E2IMAGE is not set
+BR2_PACKAGE_E2FSPROGS_E2LABEL=y
+# BR2_PACKAGE_E2FSPROGS_E2UNDO is not set
+# BR2_PACKAGE_E2FSPROGS_E4DEFRAG is not set
+# BR2_PACKAGE_E2FSPROGS_FILEFRAG is not set
+# BR2_PACKAGE_E2FSPROGS_FINDFS is not set
+# BR2_PACKAGE_E2FSPROGS_FSCK is not set
+# BR2_PACKAGE_E2FSPROGS_LOGSAVE is not set
+# BR2_PACKAGE_E2FSPROGS_LSATTR is not set
+BR2_PACKAGE_E2FSPROGS_MKE2FS=y
+# BR2_PACKAGE_E2FSPROGS_MKLOSTFOUND is not set
+# BR2_PACKAGE_E2FSPROGS_RESIZE2FS is not set
+BR2_PACKAGE_E2FSPROGS_TUNE2FS=y
+BR2_PACKAGE_E2FSPROGS_UUIDGEN=y
+# BR2_PACKAGE_FLASHBENCH is not set
+# BR2_PACKAGE_GENEXT2FS is not set
+# BR2_PACKAGE_GENROMFS is not set
+# BR2_PACKAGE_MAKEDEVS is not set
+BR2_PACKAGE_MTD=y
+
+#
+# MTD tools selection
+#
+# BR2_PACKAGE_MTD_DOCFDISK is not set
+# BR2_PACKAGE_MTD_DOC_LOADBIOS is not set
+BR2_PACKAGE_MTD_FLASHCP=y
+BR2_PACKAGE_MTD_FLASH_ERASE=y
+BR2_PACKAGE_MTD_FLASH_LOCK=y
+# BR2_PACKAGE_MTD_FLASH_OTP_DUMP is not set
+# BR2_PACKAGE_MTD_FLASH_OTP_INFO is not set
+# BR2_PACKAGE_MTD_FLASH_OTP_LOCK is not set
+# BR2_PACKAGE_MTD_FLASH_OTP_WRITE is not set
+BR2_PACKAGE_MTD_FLASH_UNLOCK=y
+# BR2_PACKAGE_MTD_FTL_CHECK is not set
+# BR2_PACKAGE_MTD_FTL_FORMAT is not set
+# BR2_PACKAGE_MTD_JFFS2DUMP is not set
+# BR2_PACKAGE_MTD_MKFSJFFS2 is not set
+# BR2_PACKAGE_MTD_MTD_DEBUG is not set
+# BR2_PACKAGE_MTD_NANDDUMP is not set
+# BR2_PACKAGE_MTD_NANDTEST is not set
+# BR2_PACKAGE_MTD_NANDWRITE is not set
+# BR2_PACKAGE_MTD_NFTLDUMP is not set
+# BR2_PACKAGE_MTD_NFTL_FORMAT is not set
+# BR2_PACKAGE_MTD_RECV_IMAGE is not set
+# BR2_PACKAGE_MTD_RFDDUMP is not set
+# BR2_PACKAGE_MTD_RFDFORMAT is not set
+# BR2_PACKAGE_MTD_SERVE_IMAGE is not set
+BR2_PACKAGE_MTD_SUMTOOL=y
+BR2_PACKAGE_MTD_MTDINFO=y
+BR2_PACKAGE_MTD_UBIATTACH=y
+# BR2_PACKAGE_MTD_UBICRC32 is not set
+BR2_PACKAGE_MTD_UBIDETACH=y
+BR2_PACKAGE_MTD_UBIFORMAT=y
+BR2_PACKAGE_MTD_UBIMKVOL=y
+BR2_PACKAGE_MTD_UBINFO=y
+# BR2_PACKAGE_MTD_UBINIZE is not set
+# BR2_PACKAGE_MTD_UBIRENAME is not set
+BR2_PACKAGE_MTD_UBIRMVOL=y
+# BR2_PACKAGE_MTD_UBIRSVOL is not set
+BR2_PACKAGE_MTD_UBIUPDATEVOL=y
+# BR2_PACKAGE_NFS_UTILS is not set
+# BR2_PACKAGE_NTFS_3G is not set
+# BR2_PACKAGE_SQUASHFS is not set
+# BR2_PACKAGE_SSHFS is not set
+# BR2_PACKAGE_UNIONFS is not set
+# BR2_PACKAGE_XFSPROGS is not set
+
+#
+# Hardware handling
+#
+
+#
+# Misc devices firmwares
+#
+# BR2_PACKAGE_B43_FIRMWARE is not set
+# BR2_PACKAGE_LINUX_FIRMWARE is not set
+# BR2_PACKAGE_UX500_FIRMWARE is not set
+# BR2_PACKAGE_ZD1211_FIRMWARE is not set
+# BR2_PACKAGE_CDRKIT is not set
+# BR2_PACKAGE_DBUS is not set
+# BR2_PACKAGE_DMRAID is not set
+# BR2_PACKAGE_DVB_APPS is not set
+# BR2_PACKAGE_DVBSNOOP is not set
+# BR2_PACKAGE_EEPROG is not set
+# BR2_PACKAGE_EVTEST is not set
+# BR2_PACKAGE_FCONFIG is not set
+# BR2_PACKAGE_FIS is not set
+# BR2_PACKAGE_FMTOOLS is not set
+# BR2_PACKAGE_FXLOAD is not set
+# BR2_PACKAGE_GADGETFS_TEST is not set
+
+#
+# gdisk requires a toolchain with LARGEFILE/WCHAR/C++ support enabled
+#
+# BR2_PACKAGE_GPSD is not set
+# BR2_PACKAGE_GVFS is not set
+# BR2_PACKAGE_HWDATA is not set
+# BR2_PACKAGE_I2C_TOOLS is not set
+# BR2_PACKAGE_INPUT_EVENT_DAEMON is not set
+# BR2_PACKAGE_INPUT_TOOLS is not set
+# BR2_PACKAGE_IOSTAT is not set
+# BR2_PACKAGE_IRDA_UTILS is not set
+# BR2_PACKAGE_KBD is not set
+# BR2_PACKAGE_LCDPROC is not set
+# BR2_PACKAGE_LM_SENSORS is not set
+
+#
+# lshw requires a toolchain with C++, LARGEFILE & WCHAR support enabled
+#
+# BR2_PACKAGE_LSUIO is not set
+BR2_PACKAGE_LVM2=y
+# BR2_PACKAGE_LVM2_DMSETUP_ONLY is not set
+# BR2_PACKAGE_LVM2_APP_LIBRARY is not set
+# BR2_PACKAGE_MDADM is not set
+# BR2_PACKAGE_MEDIA_CTL is not set
+# BR2_PACKAGE_MEMTESTER is not set
+# BR2_PACKAGE_MINICOM is not set
+# BR2_PACKAGE_NANOCOM is not set
+# BR2_PACKAGE_NEARD is not set
+# BR2_PACKAGE_OFONO is not set
+# BR2_PACKAGE_OPEN2300 is not set
+# BR2_PACKAGE_OPENOCD is not set
+BR2_PACKAGE_PARTED=y
+# BR2_PACKAGE_PCIUTILS is not set
+# BR2_PACKAGE_PICOCOM is not set
+# BR2_PACKAGE_RNG_TOOLS is not set
+
+#
+# rpi-userland requires a toolchain with C++ and LARGEFILE support
+#
+# BR2_PACKAGE_SANE_BACKENDS is not set
+# BR2_PACKAGE_SDPARM is not set
+# BR2_PACKAGE_SETSERIAL is not set
+# BR2_PACKAGE_SG3_UTILS is not set
+
+#
+# smartmontools requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_SNOWBALL_HDMISERVICE is not set
+# BR2_PACKAGE_SREDIRD is not set
+# BR2_PACKAGE_STATSERIAL is not set
+# BR2_PACKAGE_SYSSTAT is not set
+# BR2_PACKAGE_TI_UTILS is not set
+BR2_PACKAGE_UBOOT_TOOLS=y
+BR2_PACKAGE_UBOOT_TOOLS_MKIMAGE=y
+BR2_PACKAGE_UBOOT_TOOLS_FWPRINTENV=y
+
+#
+# udev requires /dev mgmnt set to udev under System configuration
+#
+
+#
+# udisks requires /dev mgmnt set to udev under System configuration
+#
+# BR2_PACKAGE_USB_MODESWITCH is not set
+# BR2_PACKAGE_USB_MODESWITCH_DATA is not set
+# BR2_PACKAGE_USBUTILS is not set
+# BR2_PACKAGE_WIPE is not set
+
+#
+# Interpreter languages and scripting
+#
+# BR2_PACKAGE_ERLANG is not set
+# BR2_PACKAGE_HASERL is not set
+# BR2_PACKAGE_JAMVM is not set
+# BR2_PACKAGE_LUA is not set
+# BR2_PACKAGE_LUAJIT is not set
+# BR2_PACKAGE_PERL is not set
+# BR2_PACKAGE_PHP is not set
+BR2_PACKAGE_PYTHON=y
+BR2_PACKAGE_PYTHON_PY_ONLY=y
+# BR2_PACKAGE_PYTHON_PYC_ONLY is not set
+# BR2_PACKAGE_PYTHON_PY_PYC is not set
+
+#
+# core python modules
+#
+
+#
+# The following modules are unusual or require extra libraries
+#
+BR2_PACKAGE_PYTHON_BZIP2=y
+# BR2_PACKAGE_PYTHON_BSDDB is not set
+# BR2_PACKAGE_PYTHON_CODECSCJK is not set
+# BR2_PACKAGE_PYTHON_CURSES is not set
+# BR2_PACKAGE_PYTHON_PYEXPAT is not set
+BR2_PACKAGE_PYTHON_READLINE=y
+# BR2_PACKAGE_PYTHON_SSL is not set
+# BR2_PACKAGE_PYTHON_UNICODEDATA is not set
+# BR2_PACKAGE_PYTHON_SQLITE is not set
+BR2_PACKAGE_PYTHON_ZLIB=y
+# BR2_PACKAGE_PYTHON3 is not set
+
+#
+# external python modules
+#
+# BR2_PACKAGE_PYTHON_BOTTLE is not set
+# BR2_PACKAGE_PYTHON_DPKT is not set
+# BR2_PACKAGE_PYTHON_ID3 is not set
+# BR2_PACKAGE_PYTHON_MAD is not set
+# BR2_PACKAGE_PYTHON_MELD3 is not set
+# BR2_PACKAGE_PYTHON_NETIFACES is not set
+# BR2_PACKAGE_PYTHON_NFC is not set
+# BR2_PACKAGE_PYTHON_PROTOBUF is not set
+# BR2_PACKAGE_PYTHON_PYGAME is not set
+# BR2_PACKAGE_PYTHON_PYPARSING is not set
+# BR2_PACKAGE_PYTHON_SERIAL is not set
+# BR2_PACKAGE_PYTHON_SETUPTOOLS is not set
+# BR2_PACKAGE_RUBY is not set
+# BR2_PACKAGE_TCL is not set
+
+#
+# Libraries
+#
+
+#
+# Audio/Sound
+#
+# BR2_PACKAGE_ALSA_LIB is not set
+
+#
+# audiofile requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_CELT051 is not set
+# BR2_PACKAGE_LIBAO is not set
+# BR2_PACKAGE_LIBCDAUDIO is not set
+# BR2_PACKAGE_LIBCUE is not set
+# BR2_PACKAGE_LIBCUEFILE is not set
+# BR2_PACKAGE_LIBID3TAG is not set
+# BR2_PACKAGE_LIBLO is not set
+# BR2_PACKAGE_LIBMAD is not set
+# BR2_PACKAGE_LIBMPD is not set
+# BR2_PACKAGE_LIBREPLAYGAIN is not set
+# BR2_PACKAGE_LIBSAMPLERATE is not set
+# BR2_PACKAGE_LIBSNDFILE is not set
+# BR2_PACKAGE_LIBVORBIS is not set
+# BR2_PACKAGE_OPUS is not set
+# BR2_PACKAGE_PORTAUDIO is not set
+# BR2_PACKAGE_SPEEX is not set
+
+#
+# taglib requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_TREMOR is not set
+
+#
+# webrtc-audio-processing requires a toolchain with C++ support enabled
+#
+
+#
+# Compression and decompression
+#
+# BR2_PACKAGE_LIBARCHIVE is not set
+# BR2_PACKAGE_LZO is not set
+BR2_PACKAGE_ZLIB=y
+
+#
+# Crypto
+#
+# BR2_PACKAGE_BEECRYPT is not set
+# BR2_PACKAGE_GNUTLS is not set
+BR2_PACKAGE_LIBGCRYPT=y
+BR2_PACKAGE_LIBGPG_ERROR=y
+# BR2_PACKAGE_LIBMCRYPT is not set
+# BR2_PACKAGE_LIBMHASH is not set
+# BR2_PACKAGE_LIBNSS is not set
+BR2_PACKAGE_LIBSHA1=y
+# BR2_PACKAGE_NETTLE is not set
+# BR2_PACKAGE_OCF_LINUX is not set
+BR2_PACKAGE_OPENSSL=y
+BR2_PACKAGE_OPENSSL_BIN=y
+BR2_PACKAGE_OPENSSL_ENGINES=y
+# BR2_PACKAGE_OPENSSL_OCF is not set
+# BR2_PACKAGE_POLARSSL is not set
+
+#
+# Database
+#
+# BR2_PACKAGE_BERKELEYDB is not set
+# BR2_PACKAGE_GDBM is not set
+
+#
+# Mysql client requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_SQLCIPHER is not set
+# BR2_PACKAGE_SQLITE is not set
+
+#
+# Filesystem
+#
+# BR2_PACKAGE_GAMIN is not set
+# BR2_PACKAGE_LIBCONFIG is not set
+# BR2_PACKAGE_LIBCONFUSE is not set
+# BR2_PACKAGE_LIBFUSE is not set
+# BR2_PACKAGE_LIBLOCKFILE is not set
+# BR2_PACKAGE_LIBSYSFS is not set
+
+#
+# Graphics
+#
+# BR2_PACKAGE_ATK is not set
+# BR2_PACKAGE_CAIRO is not set
+# BR2_PACKAGE_FONTCONFIG is not set
+# BR2_PACKAGE_FREETYPE is not set
+# BR2_PACKAGE_GD is not set
+# BR2_PACKAGE_IMLIB2 is not set
+# BR2_PACKAGE_JPEG is not set
+# BR2_PACKAGE_LIBART is not set
+# BR2_PACKAGE_LIBDMTX is not set
+# BR2_PACKAGE_LIBEXIF is not set
+# BR2_PACKAGE_LIBGEOTIFF is not set
+# BR2_PACKAGE_GDK_PIXBUF is not set
+
+#
+# libgtk2 requires a toolchain with WCHAR and C++ support
+#
+# BR2_PACKAGE_LIBPNG is not set
+
+#
+# libraw requires a toolchain with C++ support enabled
+#
+
+#
+# librsvg requires a toolchain with WCHAR and C++ support
+#
+# BR2_PACKAGE_LIBSVGTINY is not set
+# BR2_PACKAGE_LIBUNGIF is not set
+
+#
+# opencv requires a toolchain with C++ and WCHAR support
+#
+
+#
+# pango requires a toolchain with WCHAR and C++ support
+#
+# BR2_PACKAGE_PIXMAN is not set
+# BR2_PACKAGE_TIFF is not set
+
+#
+# webkit requires C++, WCHAR in toolchain and libgtk2
+#
+
+#
+# zxing requires a toolchain with C++ support
+#
+
+#
+# Hardware handling
+#
+# BR2_PACKAGE_CCID is not set
+
+#
+# lcdapi requires a toolchain with C++ and thread support enabled
+#
+# BR2_PACKAGE_LIBAIO is not set
+
+#
+# libatasmart requires udev to be enabled
+#
+# BR2_PACKAGE_LIBRAW1394 is not set
+# BR2_PACKAGE_TSLIB is not set
+# BR2_PACKAGE_LIBFREEFARE is not set
+# BR2_PACKAGE_LIBFTDI is not set
+# BR2_PACKAGE_LIBHID is not set
+# BR2_PACKAGE_LIBIQRF is not set
+# BR2_PACKAGE_LIBNFC is not set
+# BR2_PACKAGE_LIBNFC_LLCP is not set
+# BR2_PACKAGE_LIBUSB is not set
+# BR2_PACKAGE_LIBV4L is not set
+# BR2_PACKAGE_MTDEV is not set
+# BR2_PACKAGE_NEARDAL is not set
+# BR2_PACKAGE_PCSC_LITE is not set
+
+#
+# Javascript
+#
+# BR2_PACKAGE_EXPLORERCANVAS is not set
+# BR2_PACKAGE_FLOT is not set
+# BR2_PACKAGE_JQUERY is not set
+# BR2_PACKAGE_JQUERY_SPARKLINE is not set
+# BR2_PACKAGE_JQUERY_VALIDATION is not set
+# BR2_PACKAGE_JSMIN is not set
+
+#
+# Multimedia
+#
+# BR2_PACKAGE_LIBDVDREAD is not set
+# BR2_PACKAGE_LIBDVDNAV is not set
+
+#
+# libebml requires a toolchain with C++ support
+#
+
+#
+# libmatroska requires a toolchain with C++ support
+#
+# BR2_PACKAGE_LIBMMS is not set
+# BR2_PACKAGE_LIBMPEG2 is not set
+# BR2_PACKAGE_LIBOGG is not set
+# BR2_PACKAGE_LIBPLAYER is not set
+# BR2_PACKAGE_LIBTHEORA is not set
+
+#
+# Live555 needs C++ compiler
+#
+
+#
+# mediastreamer requires a toolchain with threads and C++ support
+#
+
+#
+# Networking
+#
+# BR2_PACKAGE_GLIB_NETWORKING is not set
+# BR2_PACKAGE_LIBCGI is not set
+
+#
+# libcgicc requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_LIBCURL is not set
+# BR2_PACKAGE_LIBDNET is not set
+# BR2_PACKAGE_LIBESMTP is not set
+# BR2_PACKAGE_LIBEXOSIP2 is not set
+# BR2_PACKAGE_LIBFCGI is not set
+# BR2_PACKAGE_LIBGSASL is not set
+# BR2_PACKAGE_LIBIDN is not set
+# BR2_PACKAGE_LIBISCSI is not set
+# BR2_PACKAGE_LIBOAUTH is not set
+# BR2_PACKAGE_LIBMICROHTTPD is not set
+# BR2_PACKAGE_NEON is not set
+# BR2_PACKAGE_LIBMNL is not set
+# BR2_PACKAGE_LIBMODBUS is not set
+# BR2_PACKAGE_LIBMBUS is not set
+# BR2_PACKAGE_LIBNETFILTER_ACCT is not set
+# BR2_PACKAGE_LIBNETFILTER_CONNTRACK is not set
+# BR2_PACKAGE_LIBNETFILTER_CTHELPER is not set
+# BR2_PACKAGE_LIBNETFILTER_CTTIMEOUT is not set
+# BR2_PACKAGE_LIBNETFILTER_LOG is not set
+# BR2_PACKAGE_LIBNETFILTER_QUEUE is not set
+# BR2_PACKAGE_LIBNFNETLINK is not set
+# BR2_PACKAGE_LIBNL is not set
+# BR2_PACKAGE_LIBOPING is not set
+# BR2_PACKAGE_LIBPCAP is not set
+# BR2_PACKAGE_LIBOSIP2 is not set
+# BR2_PACKAGE_LIBRSYNC is not set
+# BR2_PACKAGE_LIBSOUP is not set
+# BR2_PACKAGE_LIBTIRPC is not set
+
+#
+# libtorrent requires a toolchain with C++ and threads support enabled
+#
+# BR2_PACKAGE_LIBUPNP is not set
+# BR2_PACKAGE_LIBVNCSERVER is not set
+# BR2_PACKAGE_ORTP is not set
+# BR2_PACKAGE_SLIRP is not set
+# BR2_PACKAGE_USBREDIR is not set
+
+#
+# zeromq requires a toolchain with C++, LARGEFILE + WCHAR support
+#
+
+#
+# Other
+#
+# BR2_PACKAGE_APR is not set
+# BR2_PACKAGE_APR_UTIL is not set
+# BR2_PACKAGE_ELFUTILS is not set
+# BR2_PACKAGE_FFTW is not set
+# BR2_PACKAGE_LIBARGTABLE2 is not set
+# BR2_PACKAGE_ARGP_STANDALONE is not set
+
+#
+# boost requires a toolchain with C++, large file and thread support enabled
+#
+# BR2_PACKAGE_LIBATOMIC_OPS is not set
+# BR2_PACKAGE_LIBCAP is not set
+# BR2_PACKAGE_LIBCAP_NG is not set
+# BR2_PACKAGE_LIBDAEMON is not set
+# BR2_PACKAGE_LIBELF is not set
+# BR2_PACKAGE_LIBEVENT is not set
+# BR2_PACKAGE_LIBEV is not set
+BR2_PACKAGE_LIBFFI=y
+# BR2_PACKAGE_GSL is not set
+# BR2_PACKAGE_LIBGLIB2 is not set
+# BR2_PACKAGE_LIBICAL is not set
+# BR2_PACKAGE_LIBNSPR is not set
+
+#
+# libsigc++ requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_LIBTPL is not set
+# BR2_PACKAGE_LIBURCU is not set
+
+#
+# linux-pam requires a toolchain with WCHAR and locale support
+#
+# BR2_PACKAGE_LTTNG_LIBUST is not set
+# BR2_PACKAGE_MTDEV2TUIO is not set
+# BR2_PACKAGE_ORC is not set
+
+#
+# poco requires a toolchain with WCHAR and C++ support
+#
+
+#
+# protobuf requires a toolchain with C++ support enabled
+#
+
+#
+# schifra requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_LIBLOG4C_LOCALTIME is not set
+
+#
+# Text and terminal handling
+#
+
+#
+# enchant requires a toolchain with C++ and WCHAR support enabled
+#
+# BR2_PACKAGE_LIBFRIBIDI is not set
+
+#
+# icu requires a toolchain with C++ support and WCHAR enabled
+#
+# BR2_PACKAGE_LIBICONV is not set
+# BR2_PACKAGE_LINENOISE is not set
+BR2_PACKAGE_NCURSES=y
+# BR2_PACKAGE_NCURSES_TARGET_PANEL is not set
+# BR2_PACKAGE_NCURSES_TARGET_FORM is not set
+# BR2_PACKAGE_NCURSES_TARGET_MENU is not set
+# BR2_PACKAGE_NEWT is not set
+# BR2_PACKAGE_PCRE is not set
+# BR2_PACKAGE_POPT is not set
+BR2_PACKAGE_READLINE=y
+# BR2_PACKAGE_SLANG is not set
+
+#
+# JSON/XML
+#
+# BR2_PACKAGE_CJSON is not set
+# BR2_PACKAGE_EXPAT is not set
+# BR2_PACKAGE_EZXML is not set
+# BR2_PACKAGE_JSON_C is not set
+# BR2_PACKAGE_LIBROXML is not set
+# BR2_PACKAGE_LIBXML2 is not set
+# BR2_PACKAGE_LIBXSLT is not set
+# BR2_PACKAGE_LIBYAML is not set
+# BR2_PACKAGE_MXML is not set
+
+#
+# xerces-c++ requires a toolchain with C++ and WCHAR support enabled
+#
+# BR2_PACKAGE_YAJL is not set
+BR2_PACKAGE_JQ=y
+
+#
+# Miscellaneous
+#
+# BR2_PACKAGE_COLLECTD is not set
+# BR2_PACKAGE_EMPTY is not set
+# BR2_PACKAGE_GOOGLEFONTDIRECTORY is not set
+# BR2_PACKAGE_MCRYPT is not set
+# BR2_PACKAGE_MOBILE_BROADBAND_PROVIDER_INFO is not set
+# BR2_PACKAGE_SHARED_MIME_INFO is not set
+# BR2_PACKAGE_SNOWBALL_INIT is not set
+# BR2_PACKAGE_SOUND_THEME_BOREALIS is not set
+# BR2_PACKAGE_SOUND_THEME_FREEDESKTOP is not set
+
+#
+# Networking applications
+#
+# BR2_PACKAGE_ARGUS is not set
+# BR2_PACKAGE_ARPTABLES is not set
+# BR2_PACKAGE_AVAHI is not set
+# BR2_PACKAGE_AXEL is not set
+# BR2_PACKAGE_BLUEZ_UTILS is not set
+# BR2_PACKAGE_BOA is not set
+BR2_PACKAGE_BIND=y
+# BR2_PACKAGE_BIND_SERVER is not set
+BR2_PACKAGE_BIND_TOOLS=y
+# BR2_PACKAGE_BMON is not set
+# BR2_PACKAGE_BRIDGE_UTILS is not set
+# BR2_PACKAGE_CAN_UTILS is not set
+# BR2_PACKAGE_CONNMAN is not set
+
+#
+# ctorrent requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_CONNTRACK_TOOLS is not set
+# BR2_PACKAGE_CUPS is not set
+# BR2_PACKAGE_DHCPDUMP is not set
+# BR2_PACKAGE_DNSMASQ is not set
+BR2_PACKAGE_DROPBEAR=y
+# BR2_PACKAGE_DROPBEAR_DISABLE_REVERSEDNS is not set
+BR2_PACKAGE_DROPBEAR_SMALL=y
+# BR2_PACKAGE_DROPBEAR_WTMP is not set
+# BR2_PACKAGE_DROPBEAR_LASTLOG is not set
+# BR2_PACKAGE_EBTABLES is not set
+BR2_PACKAGE_ETHTOOL=y
+# BR2_PACKAGE_GESFTPSERVER is not set
+# BR2_PACKAGE_HEIRLOOM_MAILX is not set
+# BR2_PACKAGE_HIAWATHA is not set
+# BR2_PACKAGE_HOSTAPD is not set
+# BR2_PACKAGE_HTTPING is not set
+# BR2_PACKAGE_IFTOP is not set
+# BR2_PACKAGE_INADYN is not set
+
+#
+# iperf requires a toolchain with C++ support enabled
+#
+BR2_PACKAGE_IPROUTE2=y
+# BR2_PACKAGE_IPSEC_TOOLS is not set
+# BR2_PACKAGE_IPSET is not set
+# BR2_PACKAGE_IPTABLES is not set
+# BR2_PACKAGE_IW is not set
+
+#
+# Kismet requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_LIGHTTPD is not set
+# BR2_PACKAGE_LINKS is not set
+
+#
+# linphone requires a toolchain with threads and C++ support enabled
+#
+BR2_PACKAGE_LRZSZ=y
+# BR2_PACKAGE_MACCHANGER is not set
+# BR2_PACKAGE_MII_DIAG is not set
+# BR2_PACKAGE_MROUTED is not set
+# BR2_PACKAGE_MSMTP is not set
+# BR2_PACKAGE_MUTT is not set
+# BR2_PACKAGE_NBD is not set
+# BR2_PACKAGE_NCFTP is not set
+# BR2_PACKAGE_NDISC6 is not set
+# BR2_PACKAGE_NETATALK is not set
+# BR2_PACKAGE_NETPLUG is not set
+# BR2_PACKAGE_NETSNMP is not set
+# BR2_PACKAGE_NETSTAT_NAT is not set
+# BR2_PACKAGE_NFACCT is not set
+# BR2_PACKAGE_NOIP is not set
+# BR2_PACKAGE_NGIRCD is not set
+# BR2_PACKAGE_NGREP is not set
+# BR2_PACKAGE_NTP is not set
+# BR2_PACKAGE_NUTTCP is not set
+# BR2_PACKAGE_OLSR is not set
+# BR2_PACKAGE_OPENNTPD is not set
+# BR2_PACKAGE_OPENSSH is not set
+# BR2_PACKAGE_OPENSWAN is not set
+# BR2_PACKAGE_OPENVPN is not set
+# BR2_PACKAGE_PORTMAP is not set
+# BR2_PACKAGE_PPPD is not set
+# BR2_PACKAGE_PPTP_LINUX is not set
+# BR2_PACKAGE_PROFTPD is not set
+# BR2_PACKAGE_PROXYCHAINS_NG is not set
+# BR2_PACKAGE_QUAGGA is not set
+# BR2_PACKAGE_RADVD is not set
+# BR2_PACKAGE_RPCBIND is not set
+# BR2_PACKAGE_RSH_REDONE is not set
+# BR2_PACKAGE_RSYNC is not set
+
+#
+# rtorrent requires a toolchain with C++, threads and WCHAR support
+#
+# BR2_PACKAGE_SAMBA is not set
+
+#
+# sconeserver requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_SER2NET is not set
+# BR2_PACKAGE_SOCAT is not set
+# BR2_PACKAGE_SOCKETCAND is not set
+# BR2_PACKAGE_SPAWN_FCGI is not set
+# BR2_PACKAGE_SPICE_PROTOCOL is not set
+
+#
+# Squid requires a toolchain with C++ and IPv6 support enabled
+#
+# BR2_PACKAGE_STUNNEL is not set
+# BR2_PACKAGE_TCPDUMP is not set
+# BR2_PACKAGE_TCPREPLAY is not set
+# BR2_PACKAGE_THTTPD is not set
+# BR2_PACKAGE_TINYHTTPD is not set
+# BR2_PACKAGE_TN5250 is not set
+# BR2_PACKAGE_TRANSMISSION is not set
+# BR2_PACKAGE_TVHEADEND is not set
+# BR2_PACKAGE_UDPCAST is not set
+# BR2_PACKAGE_ULOGD is not set
+# BR2_PACKAGE_USHARE is not set
+# BR2_PACKAGE_VDE2 is not set
+# BR2_PACKAGE_VPNC is not set
+# BR2_PACKAGE_VSFTPD is not set
+# BR2_PACKAGE_VTUN is not set
+# BR2_PACKAGE_WIRELESS_TOOLS is not set
+# BR2_PACKAGE_WPA_SUPPLICANT is not set
+# BR2_PACKAGE_XINETD is not set
+# BR2_PACKAGE_XL2TP is not set
+
+#
+# Package managers
+#
+# BR2_PACKAGE_IPKG is not set
+# BR2_PACKAGE_OPKG is not set
+
+#
+# Real-Time
+#
+# BR2_PACKAGE_XENOMAI is not set
+
+#
+# Shell and utilities
+#
+# BR2_PACKAGE_AT is not set
+# BR2_PACKAGE_DIALOG is not set
+# BR2_PACKAGE_FILE is not set
+# BR2_PACKAGE_GNUPG is not set
+# BR2_PACKAGE_INOTIFY_TOOLS is not set
+# BR2_PACKAGE_LOCKFILE_PROGS is not set
+# BR2_PACKAGE_LOGROTATE is not set
+# BR2_PACKAGE_LOGSURFER is not set
+# BR2_PACKAGE_SCREEN is not set
+# BR2_PACKAGE_SUDO is not set
+# BR2_PACKAGE_XMLSTARLET is not set
+
+#
+# System tools
+#
+# BR2_PACKAGE_ACL is not set
+# BR2_PACKAGE_ATTR is not set
+# BR2_PACKAGE_BWM_NG is not set
+# BR2_PACKAGE_CPULOAD is not set
+# BR2_PACKAGE_HTOP is not set
+# BR2_PACKAGE_KEYUTILS is not set
+# BR2_PACKAGE_KMOD is not set
+# BR2_PACKAGE_MONIT is not set
+# BR2_PACKAGE_NCDU is not set
+# BR2_PACKAGE_POLKIT is not set
+# BR2_PACKAGE_QUOTA is not set
+# BR2_PACKAGE_SUPERVISOR is not set
+
+#
+# systemd not available (depends on /dev management with udev and ipv6 support, and thread support in toolchain)
+#
+BR2_PACKAGE_UTIL_LINUX=y
+# BR2_PACKAGE_UTIL_LINUX_MOUNT is not set
+# BR2_PACKAGE_UTIL_LINUX_FSCK is not set
+# BR2_PACKAGE_UTIL_LINUX_LIBMOUNT is not set
+BR2_PACKAGE_UTIL_LINUX_LIBUUID=y
+# BR2_PACKAGE_UTIL_LINUX_UUIDD is not set
+BR2_PACKAGE_UTIL_LINUX_LIBBLKID=y
+# BR2_PACKAGE_UTIL_LINUX_AGETTY is not set
+# BR2_PACKAGE_UTIL_LINUX_CRAMFS is not set
+# BR2_PACKAGE_UTIL_LINUX_SWITCH_ROOT is not set
+# BR2_PACKAGE_UTIL_LINUX_PIVOT_ROOT is not set
+# BR2_PACKAGE_UTIL_LINUX_FALLOCATE is not set
+# BR2_PACKAGE_UTIL_LINUX_UNSHARE is not set
+# BR2_PACKAGE_UTIL_LINUX_RENAME is not set
+# BR2_PACKAGE_UTIL_LINUX_SCHEDUTILS is not set
+# BR2_PACKAGE_UTIL_LINUX_WALL is not set
+# BR2_PACKAGE_UTIL_LINUX_PARTX is not set
+# BR2_PACKAGE_UTIL_LINUX_ARCH is not set
+# BR2_PACKAGE_UTIL_LINUX_INIT is not set
+# BR2_PACKAGE_UTIL_LINUX_KILL is not set
+# BR2_PACKAGE_UTIL_LINUX_LAST is not set
+# BR2_PACKAGE_UTIL_LINUX_MESG is not set
+# BR2_PACKAGE_UTIL_LINUX_RAW is not set
+# BR2_PACKAGE_UTIL_LINUX_RESET is not set
+# BR2_PACKAGE_UTIL_LINUX_LOGIN_UTILS is not set
+# BR2_PACKAGE_UTIL_LINUX_WRITE is not set
+
+#
+# Text editors and viewers
+#
+# BR2_PACKAGE_ED is not set
+BR2_PACKAGE_NANO=y
+BR2_PACKAGE_NANO_TINY=y
+BR2_PACKAGE_UEMACS=y
+
+#
+# Host utilities
+#
+# BR2_PACKAGE_HOST_DFU_UTIL is not set
+# BR2_PACKAGE_HOST_LPC3250LOADER is not set
+# BR2_PACKAGE_HOST_OPENOCD is not set
+# BR2_PACKAGE_HOST_SAM_BA is not set
+# BR2_PACKAGE_HOST_UBOOT_TOOLS is not set
+
+#
+# Filesystem images
+#
+# BR2_TARGET_ROOTFS_CLOOP is not set
+BR2_TARGET_ROOTFS_CPIO=y
+# BR2_TARGET_ROOTFS_CPIO_NONE is not set
+BR2_TARGET_ROOTFS_CPIO_GZIP=y
+# BR2_TARGET_ROOTFS_CPIO_BZIP2 is not set
+# BR2_TARGET_ROOTFS_CPIO_LZMA is not set
+# BR2_TARGET_ROOTFS_CRAMFS is not set
+# BR2_TARGET_ROOTFS_EXT2 is not set
+
+#
+# initramfs requires a Linux kernel to be built
+#
+# BR2_TARGET_ROOTFS_JFFS2 is not set
+# BR2_TARGET_ROOTFS_ROMFS is not set
+# BR2_TARGET_ROOTFS_SQUASHFS is not set
+# BR2_TARGET_ROOTFS_TAR is not set
+# BR2_TARGET_ROOTFS_UBIFS is not set
+
+#
+# Bootloaders
+#
+# BR2_TARGET_BAREBOX is not set
+# BR2_TARGET_UBOOT is not set
+
+#
+# Kernel
+#
+# BR2_LINUX_KERNEL is not set
+
+#
+# Legacy config options
+#
+# BR2_PACKAGE_CUSTOMIZE is not set
+# BR2_PACKAGE_XSERVER_xorg is not set
+# BR2_PACKAGE_XSERVER_tinyx is not set
+# BR2_PACKAGE_PTHREAD_STUBS is not set
+# BR2_PACKAGE_GETTEXT_STATIC is not set
+# BR2_PACKAGE_LIBINTL is not set
+# BR2_PACKAGE_INPUT_TOOLS_EVTEST is not set
diff --git a/packages/base/any/initrds/buildroot/builds/buildroot.config-x86_64 b/packages/base/any/initrds/buildroot/builds/buildroot.config-x86_64
new file mode 100644
index 00000000..c8aaefd3
--- /dev/null
+++ b/packages/base/any/initrds/buildroot/builds/buildroot.config-x86_64
@@ -0,0 +1,1234 @@
+#
+# Automatically generated make config: don't edit
+# Buildroot 2013.02-rc2-dirty Configuration
+#
+BR2_HAVE_DOT_CONFIG=y
+BR2_ARCH_IS_64=y
+# BR2_arm is not set
+# BR2_armeb is not set
+# BR2_aarch64 is not set
+# BR2_avr32 is not set
+# BR2_bfin is not set
+# BR2_i386 is not set
+# BR2_microblazeel is not set
+# BR2_microblazebe is not set
+# BR2_mips is not set
+# BR2_mipsel is not set
+# BR2_mips64 is not set
+# BR2_mips64el is not set
+# BR2_powerpc is not set
+# BR2_sh is not set
+# BR2_sh64 is not set
+# BR2_sparc is not set
+BR2_x86_64=y
+# BR2_xtensa is not set
+BR2_ARCH="x86_64"
+BR2_ENDIAN="LITTLE"
+BR2_GCC_TARGET_TUNE="generic"
+BR2_x86_generic=y
+# BR2_x86_nocona is not set
+# BR2_x86_core2 is not set
+# BR2_x86_atom is not set
+# BR2_x86_opteron is not set
+# BR2_x86_opteron_sse3 is not set
+# BR2_x86_barcelona is not set
+
+#
+# Build options
+#
+
+#
+# Commands
+#
+BR2_WGET="wget --passive-ftp -nd -t 3"
+BR2_SVN="svn"
+BR2_BZR="bzr"
+BR2_GIT="git"
+BR2_LOCALFILES="cp"
+BR2_SCP="scp"
+BR2_SSH="ssh"
+BR2_HG="hg"
+BR2_ZCAT="gzip -d -c"
+BR2_BZCAT="bzcat"
+BR2_XZCAT="xzcat"
+BR2_TAR_OPTIONS=""
+BR2_DEFCONFIG="$(CONFIG_DIR)/defconfig"
+BR2_DL_DIR="$(TOPDIR)/dl"
+BR2_HOST_DIR="$(BASE_DIR)/host"
+
+#
+# Mirrors and Download locations
+#
+BR2_PRIMARY_SITE="http://switch-nfs/export/buildroot-download-cache/dl"
+# BR2_PRIMARY_SITE_ONLY is not set
+BR2_BACKUP_SITE="http://sources.buildroot.net/"
+BR2_KERNEL_MIRROR="http://www.kernel.org/pub/"
+BR2_GNU_MIRROR="http://ftp.gnu.org/pub/gnu"
+BR2_DEBIAN_MIRROR="http://ftp.debian.org"
+BR2_JLEVEL=0
+BR2_CCACHE=y
+BR2_CCACHE_DIR="$(HOME)/.buildroot-ccache"
+# BR2_DEPRECATED is not set
+# BR2_ENABLE_DEBUG is not set
+BR2_STRIP_strip=y
+# BR2_STRIP_sstrip is not set
+# BR2_STRIP_none is not set
+BR2_STRIP_EXCLUDE_FILES=""
+BR2_STRIP_EXCLUDE_DIRS=""
+# BR2_OPTIMIZE_0 is not set
+# BR2_OPTIMIZE_1 is not set
+# BR2_OPTIMIZE_2 is not set
+# BR2_OPTIMIZE_3 is not set
+BR2_OPTIMIZE_S=y
+# BR2_PREFER_STATIC_LIB is not set
+BR2_PACKAGE_OVERRIDE_FILE="$(TOPDIR)/local.mk"
+
+#
+# Toolchain
+#
+BR2_TOOLCHAIN_BUILDROOT=y
+# BR2_TOOLCHAIN_EXTERNAL is not set
+# BR2_TOOLCHAIN_CTNG is not set
+
+#
+# Kernel Header Options
+#
+# BR2_KERNEL_HEADERS_3_0 is not set
+# BR2_KERNEL_HEADERS_3_2 is not set
+# BR2_KERNEL_HEADERS_3_4 is not set
+# BR2_KERNEL_HEADERS_3_6 is not set
+BR2_KERNEL_HEADERS_3_7=y
+# BR2_KERNEL_HEADERS_VERSION is not set
+# BR2_KERNEL_HEADERS_SNAP is not set
+BR2_DEFAULT_KERNEL_HEADERS="3.7.8"
+
+#
+# uClibc Options
+#
+# BR2_UCLIBC_VERSION_0_9_32 is not set
+BR2_UCLIBC_VERSION_0_9_33=y
+# BR2_UCLIBC_VERSION_SNAPSHOT is not set
+BR2_UCLIBC_VERSION_STRING="0.9.33.2"
+BR2_UCLIBC_CONFIG="toolchain/uClibc/uClibc-0.9.33.config"
+# BR2_PTHREAD_DEBUG is not set
+# BR2_UCLIBC_INSTALL_TEST_SUITE is not set
+
+#
+# Binutils Options
+#
+# BR2_BINUTILS_VERSION_2_20_1 is not set
+# BR2_BINUTILS_VERSION_2_21 is not set
+# BR2_BINUTILS_VERSION_2_21_1 is not set
+# BR2_BINUTILS_VERSION_2_22 is not set
+BR2_BINUTILS_VERSION_2_23_1=y
+BR2_BINUTILS_VERSION="2.23.1"
+BR2_BINUTILS_EXTRA_CONFIG_OPTIONS=""
+
+#
+# GCC Options
+#
+# BR2_GCC_VERSION_4_3_X is not set
+# BR2_GCC_VERSION_4_4_X is not set
+# BR2_GCC_VERSION_4_5_X is not set
+# BR2_GCC_VERSION_4_6_X is not set
+BR2_GCC_VERSION_4_7_X=y
+# BR2_GCC_VERSION_SNAP is not set
+BR2_GCC_SUPPORTS_FINEGRAINEDMTUNE=y
+BR2_GCC_VERSION="4.7.2"
+BR2_EXTRA_GCC_CONFIG_OPTIONS=""
+# BR2_INSTALL_OBJC is not set
+# BR2_INSTALL_FORTRAN is not set
+BR2_GCC_SHARED_LIBGCC=y
+# BR2_GCC_ENABLE_OPENMP is not set
+
+#
+# Gdb Options
+#
+# BR2_PACKAGE_GDB is not set
+# BR2_PACKAGE_GDB_SERVER is not set
+# BR2_PACKAGE_GDB_HOST is not set
+BR2_LARGEFILE=y
+BR2_INET_IPV6=y
+BR2_TOOLCHAIN_HAS_NATIVE_RPC=y
+BR2_USE_WCHAR=y
+BR2_TOOLCHAIN_HAS_THREADS=y
+BR2_TOOLCHAIN_HAS_THREADS_DEBUG_IF_NEEDED=y
+BR2_TOOLCHAIN_HAS_SHADOW_PASSWORDS=y
+# BR2_ENABLE_LOCALE_PURGE is not set
+BR2_GENERATE_LOCALE=""
+BR2_NEEDS_GETTEXT=y
+BR2_USE_MMU=y
+BR2_TARGET_OPTIMIZATION="-pipe"
+BR2_TARGET_LDFLAGS=""
+# BR2_ECLIPSE_REGISTER is not set
+
+#
+# Toolchain Options
+#
+BR2_TOOLCHAIN_BUILDROOT_LARGEFILE=y
+BR2_TOOLCHAIN_BUILDROOT_INET_IPV6=y
+BR2_TOOLCHAIN_BUILDROOT_INET_RPC=y
+BR2_TOOLCHAIN_BUILDROOT_WCHAR=y
+# BR2_TOOLCHAIN_BUILDROOT_LOCALE is not set
+# BR2_TOOLCHAIN_BUILDROOT_CXX is not set
+# BR2_TOOLCHAIN_BUILDROOT_USE_SSP is not set
+# BR2_PTHREADS_NONE is not set
+# BR2_PTHREADS is not set
+BR2_PTHREADS_OLD=y
+# BR2_PTHREADS_NATIVE is not set
+
+#
+# System configuration
+#
+BR2_TARGET_GENERIC_HOSTNAME=""
+BR2_TARGET_GENERIC_ISSUE=""
+# BR2_TARGET_GENERIC_PASSWD_DES is not set
+BR2_TARGET_GENERIC_PASSWD_MD5=y
+# BR2_TARGET_GENERIC_PASSWD_SHA256 is not set
+# BR2_TARGET_GENERIC_PASSWD_SHA512 is not set
+BR2_TARGET_GENERIC_PASSWD_METHOD="md5"
+# BR2_ROOTFS_DEVICE_CREATION_STATIC is not set
+# BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_DEVTMPFS is not set
+BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_MDEV=y
+# BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_UDEV is not set
+# BR2_INIT_BUSYBOX is not set
+# BR2_INIT_SYSV is not set
+
+#
+# systemd requires largefile, wchar, IPv6, threads and udev support
+#
+BR2_INIT_NONE=y
+BR2_ROOTFS_DEVICE_TABLE="../rootperms"
+# BR2_ROOTFS_SKELETON_DEFAULT is not set
+BR2_ROOTFS_SKELETON_CUSTOM=y
+BR2_ROOTFS_SKELETON_CUSTOM_PATH="system/skeleton"
+BR2_ROOTFS_OVERLAY=""
+BR2_ROOTFS_POST_BUILD_SCRIPT="../post-build"
+BR2_ROOTFS_POST_IMAGE_SCRIPT=""
+
+#
+# Package Selection for the target
+#
+BR2_PACKAGE_BUSYBOX=y
+# BR2_BUSYBOX_VERSION_1_19_X is not set
+BR2_BUSYBOX_VERSION_1_20_X=y
+# BR2_BUSYBOX_VERSION_1_21_X is not set
+# BR2_PACKAGE_BUSYBOX_SNAPSHOT is not set
+BR2_BUSYBOX_VERSION="1.20.2"
+BR2_PACKAGE_BUSYBOX_CONFIG="../busybox.config"
+# BR2_PACKAGE_BUSYBOX_SHOW_OTHERS is not set
+# BR2_PACKAGE_BUSYBOX_WATCHDOG is not set
+
+#
+# Audio and video applications
+#
+# BR2_PACKAGE_ALSA_UTILS is not set
+# BR2_PACKAGE_AUMIX is not set
+
+#
+# bellagio requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_FAAD2 is not set
+# BR2_PACKAGE_FLAC is not set
+# BR2_PACKAGE_FFMPEG is not set
+# BR2_PACKAGE_GSTREAMER is not set
+# BR2_PACKAGE_LAME is not set
+# BR2_PACKAGE_MADPLAY is not set
+
+#
+# mpd requires a toolchain with C++ and WCHAR support
+#
+# BR2_PACKAGE_MPG123 is not set
+# BR2_PACKAGE_MPLAYER is not set
+# BR2_PACKAGE_MUSEPACK is not set
+# BR2_PACKAGE_OPUS_TOOLS is not set
+# BR2_PACKAGE_PULSEAUDIO is not set
+# BR2_PACKAGE_VORBIS_TOOLS is not set
+# BR2_PACKAGE_WAVPACK is not set
+# BR2_PACKAGE_YAVTA is not set
+
+#
+# Compressors and decompressors
+#
+BR2_PACKAGE_BZIP2=y
+# BR2_PACKAGE_INFOZIP is not set
+# BR2_PACKAGE_LZOP is not set
+BR2_PACKAGE_XZ=y
+
+#
+# Debugging, profiling and benchmark
+#
+
+#
+# bonnie++ requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_CACHE_CALIBRATOR is not set
+# BR2_PACKAGE_DHRYSTONE is not set
+# BR2_PACKAGE_DSTAT is not set
+# BR2_PACKAGE_DMALLOC is not set
+BR2_PACKAGE_KEXEC=y
+BR2_PACKAGE_KEXEC_ZLIB=y
+# BR2_PACKAGE_LATENCYTOP is not set
+# BR2_PACKAGE_LMBENCH is not set
+# BR2_PACKAGE_LTP_TESTSUITE is not set
+# BR2_PACKAGE_LTRACE is not set
+# BR2_PACKAGE_MEMSTAT is not set
+# BR2_PACKAGE_NETPERF is not set
+
+#
+# oprofile requires a toolchain with C++ support enabled
+#
+
+#
+# perf only available if Linux kernel is enabled, and requires largefile support
+#
+# BR2_PACKAGE_RAMSPEED is not set
+# BR2_PACKAGE_RT_TESTS is not set
+BR2_PACKAGE_STRACE=y
+# BR2_PACKAGE_STRESS is not set
+# BR2_PACKAGE_SYSPROF is not set
+# BR2_PACKAGE_WHETSTONE is not set
+# BR2_PACKAGE_VALGRIND is not set
+# BR2_PACKAGE_PV is not set
+
+#
+# Development tools
+#
+# BR2_PACKAGE_BINUTILS is not set
+# BR2_PACKAGE_BISON is not set
+# BR2_PACKAGE_BSDIFF is not set
+# BR2_PACKAGE_CVS is not set
+# BR2_PACKAGE_DISTCC is not set
+# BR2_PACKAGE_FLEX is not set
+# BR2_PACKAGE_GETTEXT is not set
+# BR2_PACKAGE_GMP is not set
+
+#
+# gperf requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_MPC is not set
+# BR2_PACKAGE_MPFR is not set
+# BR2_PACKAGE_LIBTOOL is not set
+# BR2_PACKAGE_M4 is not set
+# BR2_PACKAGE_PKGCONF is not set
+# BR2_PACKAGE_SSTRIP is not set
+# BR2_PACKAGE_VALA is not set
+# BR2_PACKAGE_YASM is not set
+
+#
+# Games
+#
+# BR2_PACKAGE_GNUCHESS is not set
+# BR2_PACKAGE_PRBOOM is not set
+
+#
+# Graphic libraries and applications (graphic/text)
+#
+
+#
+# Graphic applications
+#
+# BR2_PACKAGE_RRDTOOL is not set
+
+#
+# graphic libraries
+#
+
+#
+# cegui06 needs a toolchain with C++ and threads
+#
+# BR2_PACKAGE_DIRECTFB is not set
+# BR2_PACKAGE_FBDUMP is not set
+# BR2_PACKAGE_FBGRAB is not set
+
+#
+# fbterm requires a toolchain with C++, WCHAR and locale support
+#
+# BR2_PACKAGE_FBV is not set
+# BR2_PACKAGE_FB_TEST_APP is not set
+# BR2_PACKAGE_IMAGEMAGICK is not set
+# BR2_PACKAGE_SDL is not set
+
+#
+# other GUIs
+#
+# BR2_PACKAGE_EFL is not set
+
+#
+# qt requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_XORG7 is not set
+
+#
+# X libraries and helper libraries
+#
+# BR2_PACKAGE_LIBERATION is not set
+
+#
+# X Window managers
+#
+
+#
+# X applications
+#
+# BR2_PACKAGE_GOB2 is not set
+
+#
+# midori requires C++, WCHAR in toolchain and libgtk2
+#
+
+#
+# Filesystem and flash utilities
+#
+# BR2_PACKAGE_CIFS_UTILS is not set
+# BR2_PACKAGE_CRAMFS is not set
+# BR2_PACKAGE_CURLFTPFS is not set
+BR2_PACKAGE_DOSFSTOOLS=y
+BR2_PACKAGE_DOSFSTOOLS_MKDOSFS=y
+BR2_PACKAGE_DOSFSTOOLS_DOSFSCK=y
+BR2_PACKAGE_DOSFSTOOLS_DOSFSLABEL=y
+BR2_PACKAGE_E2FSPROGS=y
+# BR2_PACKAGE_E2FSPROGS_BADBLOCKS is not set
+# BR2_PACKAGE_E2FSPROGS_CHATTR is not set
+# BR2_PACKAGE_E2FSPROGS_DEBUGFS is not set
+BR2_PACKAGE_E2FSPROGS_DUMPE2FS=y
+# BR2_PACKAGE_E2FSPROGS_E2FREEFRAG is not set
+BR2_PACKAGE_E2FSPROGS_E2FSCK=y
+# BR2_PACKAGE_E2FSPROGS_E2IMAGE is not set
+BR2_PACKAGE_E2FSPROGS_E2LABEL=y
+# BR2_PACKAGE_E2FSPROGS_E2UNDO is not set
+# BR2_PACKAGE_E2FSPROGS_E4DEFRAG is not set
+# BR2_PACKAGE_E2FSPROGS_FILEFRAG is not set
+# BR2_PACKAGE_E2FSPROGS_FINDFS is not set
+# BR2_PACKAGE_E2FSPROGS_FSCK is not set
+# BR2_PACKAGE_E2FSPROGS_LOGSAVE is not set
+# BR2_PACKAGE_E2FSPROGS_LSATTR is not set
+BR2_PACKAGE_E2FSPROGS_MKE2FS=y
+# BR2_PACKAGE_E2FSPROGS_MKLOSTFOUND is not set
+# BR2_PACKAGE_E2FSPROGS_RESIZE2FS is not set
+BR2_PACKAGE_E2FSPROGS_TUNE2FS=y
+BR2_PACKAGE_E2FSPROGS_UUIDGEN=y
+# BR2_PACKAGE_FLASHBENCH is not set
+# BR2_PACKAGE_GENEXT2FS is not set
+# BR2_PACKAGE_GENROMFS is not set
+# BR2_PACKAGE_MAKEDEVS is not set
+BR2_PACKAGE_MTD=y
+
+#
+# MTD tools selection
+#
+# BR2_PACKAGE_MTD_DOCFDISK is not set
+# BR2_PACKAGE_MTD_DOC_LOADBIOS is not set
+BR2_PACKAGE_MTD_FLASHCP=y
+BR2_PACKAGE_MTD_FLASH_ERASE=y
+BR2_PACKAGE_MTD_FLASH_LOCK=y
+# BR2_PACKAGE_MTD_FLASH_OTP_DUMP is not set
+# BR2_PACKAGE_MTD_FLASH_OTP_INFO is not set
+# BR2_PACKAGE_MTD_FLASH_OTP_LOCK is not set
+# BR2_PACKAGE_MTD_FLASH_OTP_WRITE is not set
+BR2_PACKAGE_MTD_FLASH_UNLOCK=y
+# BR2_PACKAGE_MTD_FTL_CHECK is not set
+# BR2_PACKAGE_MTD_FTL_FORMAT is not set
+# BR2_PACKAGE_MTD_JFFS2DUMP is not set
+# BR2_PACKAGE_MTD_MKFSJFFS2 is not set
+# BR2_PACKAGE_MTD_MTD_DEBUG is not set
+# BR2_PACKAGE_MTD_NANDDUMP is not set
+# BR2_PACKAGE_MTD_NANDTEST is not set
+# BR2_PACKAGE_MTD_NANDWRITE is not set
+# BR2_PACKAGE_MTD_NFTLDUMP is not set
+# BR2_PACKAGE_MTD_NFTL_FORMAT is not set
+# BR2_PACKAGE_MTD_RECV_IMAGE is not set
+# BR2_PACKAGE_MTD_RFDDUMP is not set
+# BR2_PACKAGE_MTD_RFDFORMAT is not set
+# BR2_PACKAGE_MTD_SERVE_IMAGE is not set
+BR2_PACKAGE_MTD_SUMTOOL=y
+BR2_PACKAGE_MTD_MTDINFO=y
+BR2_PACKAGE_MTD_UBIATTACH=y
+# BR2_PACKAGE_MTD_UBICRC32 is not set
+BR2_PACKAGE_MTD_UBIDETACH=y
+BR2_PACKAGE_MTD_UBIFORMAT=y
+BR2_PACKAGE_MTD_UBIMKVOL=y
+BR2_PACKAGE_MTD_UBINFO=y
+# BR2_PACKAGE_MTD_UBINIZE is not set
+# BR2_PACKAGE_MTD_UBIRENAME is not set
+BR2_PACKAGE_MTD_UBIRMVOL=y
+# BR2_PACKAGE_MTD_UBIRSVOL is not set
+BR2_PACKAGE_MTD_UBIUPDATEVOL=y
+# BR2_PACKAGE_NFS_UTILS is not set
+# BR2_PACKAGE_NTFS_3G is not set
+# BR2_PACKAGE_SQUASHFS is not set
+# BR2_PACKAGE_SSHFS is not set
+# BR2_PACKAGE_UNIONFS is not set
+# BR2_PACKAGE_XFSPROGS is not set
+
+#
+# Hardware handling
+#
+
+#
+# Misc devices firmwares
+#
+# BR2_PACKAGE_B43_FIRMWARE is not set
+# BR2_PACKAGE_LINUX_FIRMWARE is not set
+# BR2_PACKAGE_UX500_FIRMWARE is not set
+# BR2_PACKAGE_ZD1211_FIRMWARE is not set
+# BR2_PACKAGE_ACPID is not set
+# BR2_PACKAGE_CDRKIT is not set
+# BR2_PACKAGE_DBUS is not set
+BR2_PACKAGE_DMIDECODE=y
+# BR2_PACKAGE_DMRAID is not set
+# BR2_PACKAGE_DVB_APPS is not set
+# BR2_PACKAGE_DVBSNOOP is not set
+# BR2_PACKAGE_EEPROG is not set
+# BR2_PACKAGE_EVTEST is not set
+# BR2_PACKAGE_FLASHROM is not set
+# BR2_PACKAGE_FCONFIG is not set
+# BR2_PACKAGE_FIS is not set
+# BR2_PACKAGE_FMTOOLS is not set
+# BR2_PACKAGE_FXLOAD is not set
+# BR2_PACKAGE_GADGETFS_TEST is not set
+
+#
+# gdisk requires a toolchain with LARGEFILE/WCHAR/C++ support enabled
+#
+# BR2_PACKAGE_GPSD is not set
+# BR2_PACKAGE_GVFS is not set
+# BR2_PACKAGE_HWDATA is not set
+# BR2_PACKAGE_I2C_TOOLS is not set
+# BR2_PACKAGE_INPUT_EVENT_DAEMON is not set
+# BR2_PACKAGE_INPUT_TOOLS is not set
+# BR2_PACKAGE_IOSTAT is not set
+# BR2_PACKAGE_IRDA_UTILS is not set
+# BR2_PACKAGE_KBD is not set
+# BR2_PACKAGE_LCDPROC is not set
+# BR2_PACKAGE_LM_SENSORS is not set
+
+#
+# lshw requires a toolchain with C++, LARGEFILE & WCHAR support enabled
+#
+# BR2_PACKAGE_LSUIO is not set
+BR2_PACKAGE_LVM2=y
+# BR2_PACKAGE_LVM2_DMSETUP_ONLY is not set
+# BR2_PACKAGE_LVM2_APP_LIBRARY is not set
+# BR2_PACKAGE_MDADM is not set
+# BR2_PACKAGE_MEDIA_CTL is not set
+# BR2_PACKAGE_MEMTESTER is not set
+# BR2_PACKAGE_MINICOM is not set
+# BR2_PACKAGE_NANOCOM is not set
+# BR2_PACKAGE_NEARD is not set
+# BR2_PACKAGE_OFONO is not set
+# BR2_PACKAGE_OPEN2300 is not set
+# BR2_PACKAGE_OPENOCD is not set
+BR2_PACKAGE_PARTED=y
+# BR2_PACKAGE_PCIUTILS is not set
+# BR2_PACKAGE_PICOCOM is not set
+# BR2_PACKAGE_RNG_TOOLS is not set
+
+#
+# rpi-userland requires a toolchain with C++ and LARGEFILE support
+#
+# BR2_PACKAGE_SANE_BACKENDS is not set
+# BR2_PACKAGE_SDPARM is not set
+# BR2_PACKAGE_SETSERIAL is not set
+# BR2_PACKAGE_SG3_UTILS is not set
+
+#
+# smartmontools requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_SNOWBALL_HDMISERVICE is not set
+# BR2_PACKAGE_SREDIRD is not set
+# BR2_PACKAGE_STATSERIAL is not set
+# BR2_PACKAGE_SYSSTAT is not set
+# BR2_PACKAGE_TI_UTILS is not set
+# BR2_PACKAGE_UBOOT_TOOLS is not set
+
+#
+# udev requires /dev mgmnt set to udev under System configuration
+#
+
+#
+# udisks requires /dev mgmnt set to udev under System configuration
+#
+# BR2_PACKAGE_USB_MODESWITCH is not set
+# BR2_PACKAGE_USB_MODESWITCH_DATA is not set
+# BR2_PACKAGE_USBUTILS is not set
+# BR2_PACKAGE_WIPE is not set
+
+#
+# Interpreter languages and scripting
+#
+# BR2_PACKAGE_ERLANG is not set
+# BR2_PACKAGE_HASERL is not set
+# BR2_PACKAGE_JAMVM is not set
+# BR2_PACKAGE_LUA is not set
+# BR2_PACKAGE_LUAJIT is not set
+# BR2_PACKAGE_PERL is not set
+# BR2_PACKAGE_PHP is not set
+BR2_PACKAGE_PYTHON=y
+BR2_PACKAGE_PYTHON_PY_ONLY=y
+# BR2_PACKAGE_PYTHON_PYC_ONLY is not set
+# BR2_PACKAGE_PYTHON_PY_PYC is not set
+
+#
+# core python modules
+#
+
+#
+# The following modules are unusual or require extra libraries
+#
+BR2_PACKAGE_PYTHON_BZIP2=y
+# BR2_PACKAGE_PYTHON_BSDDB is not set
+# BR2_PACKAGE_PYTHON_CODECSCJK is not set
+# BR2_PACKAGE_PYTHON_CURSES is not set
+# BR2_PACKAGE_PYTHON_PYEXPAT is not set
+BR2_PACKAGE_PYTHON_READLINE=y
+# BR2_PACKAGE_PYTHON_SSL is not set
+# BR2_PACKAGE_PYTHON_UNICODEDATA is not set
+# BR2_PACKAGE_PYTHON_SQLITE is not set
+BR2_PACKAGE_PYTHON_ZLIB=y
+# BR2_PACKAGE_PYTHON3 is not set
+
+#
+# external python modules
+#
+# BR2_PACKAGE_PYTHON_BOTTLE is not set
+# BR2_PACKAGE_PYTHON_DPKT is not set
+# BR2_PACKAGE_PYTHON_ID3 is not set
+# BR2_PACKAGE_PYTHON_MAD is not set
+# BR2_PACKAGE_PYTHON_MELD3 is not set
+# BR2_PACKAGE_PYTHON_NETIFACES is not set
+# BR2_PACKAGE_PYTHON_NFC is not set
+# BR2_PACKAGE_PYTHON_PROTOBUF is not set
+# BR2_PACKAGE_PYTHON_PYGAME is not set
+# BR2_PACKAGE_PYTHON_PYPARSING is not set
+# BR2_PACKAGE_PYTHON_SERIAL is not set
+# BR2_PACKAGE_PYTHON_SETUPTOOLS is not set
+# BR2_PACKAGE_RUBY is not set
+# BR2_PACKAGE_TCL is not set
+
+#
+# Libraries
+#
+
+#
+# Audio/Sound
+#
+# BR2_PACKAGE_ALSA_LIB is not set
+
+#
+# audiofile requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_CELT051 is not set
+# BR2_PACKAGE_LIBAO is not set
+# BR2_PACKAGE_LIBCDAUDIO is not set
+# BR2_PACKAGE_LIBCUE is not set
+# BR2_PACKAGE_LIBCUEFILE is not set
+# BR2_PACKAGE_LIBID3TAG is not set
+# BR2_PACKAGE_LIBLO is not set
+# BR2_PACKAGE_LIBMAD is not set
+# BR2_PACKAGE_LIBMPD is not set
+# BR2_PACKAGE_LIBREPLAYGAIN is not set
+# BR2_PACKAGE_LIBSAMPLERATE is not set
+# BR2_PACKAGE_LIBSNDFILE is not set
+# BR2_PACKAGE_LIBVORBIS is not set
+# BR2_PACKAGE_OPUS is not set
+# BR2_PACKAGE_PORTAUDIO is not set
+# BR2_PACKAGE_SPEEX is not set
+
+#
+# taglib requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_TREMOR is not set
+
+#
+# webrtc-audio-processing requires a toolchain with C++ support enabled
+#
+
+#
+# Compression and decompression
+#
+# BR2_PACKAGE_LIBARCHIVE is not set
+# BR2_PACKAGE_LZO is not set
+BR2_PACKAGE_ZLIB=y
+
+#
+# Crypto
+#
+# BR2_PACKAGE_BEECRYPT is not set
+# BR2_PACKAGE_GNUTLS is not set
+BR2_PACKAGE_LIBGCRYPT=y
+BR2_PACKAGE_LIBGPG_ERROR=y
+# BR2_PACKAGE_LIBMCRYPT is not set
+# BR2_PACKAGE_LIBMHASH is not set
+# BR2_PACKAGE_LIBNSS is not set
+BR2_PACKAGE_LIBSHA1=y
+# BR2_PACKAGE_NETTLE is not set
+# BR2_PACKAGE_OCF_LINUX is not set
+BR2_PACKAGE_OPENSSL=y
+BR2_PACKAGE_OPENSSL_BIN=y
+BR2_PACKAGE_OPENSSL_ENGINES=y
+# BR2_PACKAGE_OPENSSL_OCF is not set
+# BR2_PACKAGE_POLARSSL is not set
+
+#
+# Database
+#
+# BR2_PACKAGE_BERKELEYDB is not set
+# BR2_PACKAGE_GDBM is not set
+
+#
+# Mysql client requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_SQLCIPHER is not set
+# BR2_PACKAGE_SQLITE is not set
+
+#
+# Filesystem
+#
+# BR2_PACKAGE_GAMIN is not set
+# BR2_PACKAGE_LIBCONFIG is not set
+# BR2_PACKAGE_LIBCONFUSE is not set
+# BR2_PACKAGE_LIBFUSE is not set
+# BR2_PACKAGE_LIBLOCKFILE is not set
+# BR2_PACKAGE_LIBSYSFS is not set
+
+#
+# Graphics
+#
+# BR2_PACKAGE_ATK is not set
+# BR2_PACKAGE_CAIRO is not set
+# BR2_PACKAGE_FONTCONFIG is not set
+# BR2_PACKAGE_FREETYPE is not set
+# BR2_PACKAGE_GD is not set
+# BR2_PACKAGE_IMLIB2 is not set
+# BR2_PACKAGE_JPEG is not set
+# BR2_PACKAGE_LIBART is not set
+# BR2_PACKAGE_LIBDMTX is not set
+# BR2_PACKAGE_LIBEXIF is not set
+# BR2_PACKAGE_LIBGEOTIFF is not set
+# BR2_PACKAGE_GDK_PIXBUF is not set
+
+#
+# libgtk2 requires a toolchain with WCHAR and C++ support
+#
+# BR2_PACKAGE_LIBPNG is not set
+
+#
+# libraw requires a toolchain with C++ support enabled
+#
+
+#
+# librsvg requires a toolchain with WCHAR and C++ support
+#
+# BR2_PACKAGE_LIBSVGTINY is not set
+# BR2_PACKAGE_LIBUNGIF is not set
+
+#
+# opencv requires a toolchain with C++ and WCHAR support
+#
+
+#
+# pango requires a toolchain with WCHAR and C++ support
+#
+# BR2_PACKAGE_PIXMAN is not set
+# BR2_PACKAGE_TIFF is not set
+
+#
+# webkit requires C++, WCHAR in toolchain and libgtk2
+#
+
+#
+# zxing requires a toolchain with C++ support
+#
+
+#
+# Hardware handling
+#
+# BR2_PACKAGE_CCID is not set
+
+#
+# lcdapi requires a toolchain with C++ and thread support enabled
+#
+# BR2_PACKAGE_LIBAIO is not set
+
+#
+# libatasmart requires udev to be enabled
+#
+# BR2_PACKAGE_LIBRAW1394 is not set
+# BR2_PACKAGE_TSLIB is not set
+# BR2_PACKAGE_LIBFREEFARE is not set
+# BR2_PACKAGE_LIBFTDI is not set
+# BR2_PACKAGE_LIBHID is not set
+# BR2_PACKAGE_LIBIQRF is not set
+# BR2_PACKAGE_LIBNFC is not set
+# BR2_PACKAGE_LIBNFC_LLCP is not set
+# BR2_PACKAGE_LIBUSB is not set
+# BR2_PACKAGE_LIBV4L is not set
+# BR2_PACKAGE_MTDEV is not set
+# BR2_PACKAGE_NEARDAL is not set
+# BR2_PACKAGE_PCSC_LITE is not set
+
+#
+# Javascript
+#
+# BR2_PACKAGE_EXPLORERCANVAS is not set
+# BR2_PACKAGE_FLOT is not set
+# BR2_PACKAGE_JQUERY is not set
+# BR2_PACKAGE_JQUERY_SPARKLINE is not set
+# BR2_PACKAGE_JQUERY_VALIDATION is not set
+# BR2_PACKAGE_JSMIN is not set
+
+#
+# Multimedia
+#
+# BR2_PACKAGE_LIBDVDREAD is not set
+# BR2_PACKAGE_LIBDVDNAV is not set
+
+#
+# libebml requires a toolchain with C++ support
+#
+
+#
+# libmatroska requires a toolchain with C++ support
+#
+# BR2_PACKAGE_LIBMMS is not set
+# BR2_PACKAGE_LIBMPEG2 is not set
+# BR2_PACKAGE_LIBOGG is not set
+# BR2_PACKAGE_LIBPLAYER is not set
+# BR2_PACKAGE_LIBTHEORA is not set
+
+#
+# Live555 needs C++ compiler
+#
+
+#
+# mediastreamer requires a toolchain with threads and C++ support
+#
+
+#
+# Networking
+#
+# BR2_PACKAGE_GLIB_NETWORKING is not set
+# BR2_PACKAGE_LIBCGI is not set
+
+#
+# libcgicc requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_LIBCURL is not set
+# BR2_PACKAGE_LIBDNET is not set
+# BR2_PACKAGE_LIBESMTP is not set
+# BR2_PACKAGE_LIBEXOSIP2 is not set
+# BR2_PACKAGE_LIBFCGI is not set
+# BR2_PACKAGE_LIBGSASL is not set
+# BR2_PACKAGE_LIBIDN is not set
+# BR2_PACKAGE_LIBISCSI is not set
+# BR2_PACKAGE_LIBOAUTH is not set
+# BR2_PACKAGE_LIBMICROHTTPD is not set
+# BR2_PACKAGE_NEON is not set
+# BR2_PACKAGE_LIBMNL is not set
+# BR2_PACKAGE_LIBMODBUS is not set
+# BR2_PACKAGE_LIBMBUS is not set
+# BR2_PACKAGE_LIBNETFILTER_ACCT is not set
+# BR2_PACKAGE_LIBNETFILTER_CONNTRACK is not set
+# BR2_PACKAGE_LIBNETFILTER_CTHELPER is not set
+# BR2_PACKAGE_LIBNETFILTER_CTTIMEOUT is not set
+# BR2_PACKAGE_LIBNETFILTER_LOG is not set
+# BR2_PACKAGE_LIBNETFILTER_QUEUE is not set
+# BR2_PACKAGE_LIBNFNETLINK is not set
+# BR2_PACKAGE_LIBNL is not set
+# BR2_PACKAGE_LIBOPING is not set
+# BR2_PACKAGE_LIBPCAP is not set
+# BR2_PACKAGE_LIBOSIP2 is not set
+# BR2_PACKAGE_LIBRSYNC is not set
+# BR2_PACKAGE_LIBSOUP is not set
+# BR2_PACKAGE_LIBTIRPC is not set
+
+#
+# libtorrent requires a toolchain with C++ and threads support enabled
+#
+# BR2_PACKAGE_LIBUPNP is not set
+# BR2_PACKAGE_LIBVNCSERVER is not set
+# BR2_PACKAGE_ORTP is not set
+# BR2_PACKAGE_SLIRP is not set
+# BR2_PACKAGE_USBREDIR is not set
+
+#
+# zeromq requires a toolchain with C++, LARGEFILE + WCHAR support
+#
+
+#
+# Other
+#
+# BR2_PACKAGE_APR is not set
+# BR2_PACKAGE_APR_UTIL is not set
+# BR2_PACKAGE_ELFUTILS is not set
+# BR2_PACKAGE_FFTW is not set
+# BR2_PACKAGE_LIBARGTABLE2 is not set
+# BR2_PACKAGE_ARGP_STANDALONE is not set
+
+#
+# boost requires a toolchain with C++, large file and thread support enabled
+#
+# BR2_PACKAGE_LIBATOMIC_OPS is not set
+# BR2_PACKAGE_LIBCAP is not set
+# BR2_PACKAGE_LIBCAP_NG is not set
+# BR2_PACKAGE_LIBDAEMON is not set
+# BR2_PACKAGE_LIBELF is not set
+# BR2_PACKAGE_LIBEVENT is not set
+# BR2_PACKAGE_LIBEV is not set
+BR2_PACKAGE_LIBFFI=y
+# BR2_PACKAGE_GSL is not set
+# BR2_PACKAGE_LIBGLIB2 is not set
+# BR2_PACKAGE_LIBICAL is not set
+# BR2_PACKAGE_LIBNSPR is not set
+
+#
+# libsigc++ requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_LIBTPL is not set
+# BR2_PACKAGE_LIBSECCOMP is not set
+# BR2_PACKAGE_LIBURCU is not set
+
+#
+# linux-pam requires a toolchain with WCHAR and locale support
+#
+# BR2_PACKAGE_LTTNG_LIBUST is not set
+# BR2_PACKAGE_MTDEV2TUIO is not set
+# BR2_PACKAGE_ORC is not set
+
+#
+# poco requires a toolchain with WCHAR and C++ support
+#
+
+#
+# protobuf requires a toolchain with C++ support enabled
+#
+
+#
+# schifra requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_LIBLOG4C_LOCALTIME is not set
+
+#
+# Text and terminal handling
+#
+
+#
+# enchant requires a toolchain with C++ and WCHAR support enabled
+#
+# BR2_PACKAGE_LIBFRIBIDI is not set
+
+#
+# icu requires a toolchain with C++ support and WCHAR enabled
+#
+# BR2_PACKAGE_LIBICONV is not set
+# BR2_PACKAGE_LINENOISE is not set
+BR2_PACKAGE_NCURSES=y
+# BR2_PACKAGE_NCURSES_TARGET_PANEL is not set
+# BR2_PACKAGE_NCURSES_TARGET_FORM is not set
+# BR2_PACKAGE_NCURSES_TARGET_MENU is not set
+# BR2_PACKAGE_NEWT is not set
+# BR2_PACKAGE_PCRE is not set
+# BR2_PACKAGE_POPT is not set
+BR2_PACKAGE_READLINE=y
+# BR2_PACKAGE_SLANG is not set
+
+#
+# JSON/XML
+#
+# BR2_PACKAGE_CJSON is not set
+# BR2_PACKAGE_EXPAT is not set
+# BR2_PACKAGE_EZXML is not set
+# BR2_PACKAGE_JSON_C is not set
+# BR2_PACKAGE_LIBROXML is not set
+# BR2_PACKAGE_LIBXML2 is not set
+# BR2_PACKAGE_LIBXSLT is not set
+# BR2_PACKAGE_LIBYAML is not set
+# BR2_PACKAGE_MXML is not set
+
+#
+# xerces-c++ requires a toolchain with C++ and WCHAR support enabled
+#
+# BR2_PACKAGE_YAJL is not set
+BR2_PACKAGE_JQ=y
+
+#
+# Miscellaneous
+#
+# BR2_PACKAGE_COLLECTD is not set
+# BR2_PACKAGE_EMPTY is not set
+# BR2_PACKAGE_GOOGLEFONTDIRECTORY is not set
+# BR2_PACKAGE_MCRYPT is not set
+# BR2_PACKAGE_MOBILE_BROADBAND_PROVIDER_INFO is not set
+# BR2_PACKAGE_SHARED_MIME_INFO is not set
+# BR2_PACKAGE_SNOWBALL_INIT is not set
+# BR2_PACKAGE_SOUND_THEME_BOREALIS is not set
+# BR2_PACKAGE_SOUND_THEME_FREEDESKTOP is not set
+
+#
+# Networking applications
+#
+# BR2_PACKAGE_ARGUS is not set
+# BR2_PACKAGE_ARPTABLES is not set
+# BR2_PACKAGE_AVAHI is not set
+# BR2_PACKAGE_AXEL is not set
+# BR2_PACKAGE_BLUEZ_UTILS is not set
+# BR2_PACKAGE_BOA is not set
+BR2_PACKAGE_BIND=y
+# BR2_PACKAGE_BIND_SERVER is not set
+BR2_PACKAGE_BIND_TOOLS=y
+# BR2_PACKAGE_BMON is not set
+# BR2_PACKAGE_BRIDGE_UTILS is not set
+# BR2_PACKAGE_CAN_UTILS is not set
+# BR2_PACKAGE_CONNMAN is not set
+
+#
+# ctorrent requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_CONNTRACK_TOOLS is not set
+# BR2_PACKAGE_CUPS is not set
+# BR2_PACKAGE_DHCPDUMP is not set
+# BR2_PACKAGE_DNSMASQ is not set
+BR2_PACKAGE_DROPBEAR=y
+# BR2_PACKAGE_DROPBEAR_DISABLE_REVERSEDNS is not set
+BR2_PACKAGE_DROPBEAR_SMALL=y
+# BR2_PACKAGE_DROPBEAR_WTMP is not set
+# BR2_PACKAGE_DROPBEAR_LASTLOG is not set
+# BR2_PACKAGE_EBTABLES is not set
+BR2_PACKAGE_ETHTOOL=y
+# BR2_PACKAGE_GESFTPSERVER is not set
+# BR2_PACKAGE_HEIRLOOM_MAILX is not set
+# BR2_PACKAGE_HIAWATHA is not set
+# BR2_PACKAGE_HOSTAPD is not set
+# BR2_PACKAGE_HTTPING is not set
+# BR2_PACKAGE_IFTOP is not set
+# BR2_PACKAGE_INADYN is not set
+
+#
+# iperf requires a toolchain with C++ support enabled
+#
+BR2_PACKAGE_IPROUTE2=y
+# BR2_PACKAGE_IPSEC_TOOLS is not set
+# BR2_PACKAGE_IPSET is not set
+# BR2_PACKAGE_IPTABLES is not set
+# BR2_PACKAGE_IW is not set
+
+#
+# Kismet requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_LIGHTTPD is not set
+# BR2_PACKAGE_LINKS is not set
+
+#
+# linphone requires a toolchain with threads and C++ support enabled
+#
+BR2_PACKAGE_LRZSZ=y
+# BR2_PACKAGE_MACCHANGER is not set
+# BR2_PACKAGE_MII_DIAG is not set
+# BR2_PACKAGE_MROUTED is not set
+# BR2_PACKAGE_MSMTP is not set
+# BR2_PACKAGE_MUTT is not set
+# BR2_PACKAGE_NBD is not set
+# BR2_PACKAGE_NCFTP is not set
+# BR2_PACKAGE_NDISC6 is not set
+# BR2_PACKAGE_NETATALK is not set
+# BR2_PACKAGE_NETPLUG is not set
+# BR2_PACKAGE_NETSNMP is not set
+# BR2_PACKAGE_NETSTAT_NAT is not set
+# BR2_PACKAGE_NFACCT is not set
+# BR2_PACKAGE_NOIP is not set
+# BR2_PACKAGE_NGIRCD is not set
+# BR2_PACKAGE_NGREP is not set
+# BR2_PACKAGE_NTP is not set
+# BR2_PACKAGE_NUTTCP is not set
+# BR2_PACKAGE_OLSR is not set
+# BR2_PACKAGE_OPENNTPD is not set
+# BR2_PACKAGE_OPENSSH is not set
+# BR2_PACKAGE_OPENSWAN is not set
+# BR2_PACKAGE_OPENVPN is not set
+# BR2_PACKAGE_PORTMAP is not set
+# BR2_PACKAGE_PPPD is not set
+# BR2_PACKAGE_PPTP_LINUX is not set
+# BR2_PACKAGE_PROFTPD is not set
+# BR2_PACKAGE_PROXYCHAINS_NG is not set
+# BR2_PACKAGE_QUAGGA is not set
+# BR2_PACKAGE_RADVD is not set
+# BR2_PACKAGE_RPCBIND is not set
+# BR2_PACKAGE_RSH_REDONE is not set
+# BR2_PACKAGE_RSYNC is not set
+
+#
+# rtorrent requires a toolchain with C++, threads and WCHAR support
+#
+# BR2_PACKAGE_SAMBA is not set
+
+#
+# sconeserver requires a toolchain with C++ support enabled
+#
+# BR2_PACKAGE_SER2NET is not set
+# BR2_PACKAGE_SOCAT is not set
+# BR2_PACKAGE_SOCKETCAND is not set
+# BR2_PACKAGE_SPAWN_FCGI is not set
+# BR2_PACKAGE_SPICE_PROTOCOL is not set
+# BR2_PACKAGE_SPICE is not set
+
+#
+# Squid requires a toolchain with C++ and IPv6 support enabled
+#
+# BR2_PACKAGE_STUNNEL is not set
+# BR2_PACKAGE_TCPDUMP is not set
+# BR2_PACKAGE_TCPREPLAY is not set
+# BR2_PACKAGE_THTTPD is not set
+# BR2_PACKAGE_TINYHTTPD is not set
+# BR2_PACKAGE_TN5250 is not set
+# BR2_PACKAGE_TRANSMISSION is not set
+# BR2_PACKAGE_TVHEADEND is not set
+# BR2_PACKAGE_UDPCAST is not set
+# BR2_PACKAGE_ULOGD is not set
+# BR2_PACKAGE_USHARE is not set
+# BR2_PACKAGE_VDE2 is not set
+# BR2_PACKAGE_VPNC is not set
+# BR2_PACKAGE_VSFTPD is not set
+# BR2_PACKAGE_VTUN is not set
+# BR2_PACKAGE_WIRELESS_TOOLS is not set
+# BR2_PACKAGE_WPA_SUPPLICANT is not set
+# BR2_PACKAGE_XINETD is not set
+# BR2_PACKAGE_XL2TP is not set
+
+#
+# Package managers
+#
+# BR2_PACKAGE_IPKG is not set
+# BR2_PACKAGE_OPKG is not set
+
+#
+# Real-Time
+#
+# BR2_PACKAGE_XENOMAI is not set
+
+#
+# Shell and utilities
+#
+# BR2_PACKAGE_AT is not set
+# BR2_PACKAGE_DIALOG is not set
+# BR2_PACKAGE_FILE is not set
+# BR2_PACKAGE_GNUPG is not set
+# BR2_PACKAGE_INOTIFY_TOOLS is not set
+# BR2_PACKAGE_LOCKFILE_PROGS is not set
+# BR2_PACKAGE_LOGROTATE is not set
+# BR2_PACKAGE_LOGSURFER is not set
+# BR2_PACKAGE_SCREEN is not set
+# BR2_PACKAGE_SUDO is not set
+# BR2_PACKAGE_XMLSTARLET is not set
+
+#
+# System tools
+#
+# BR2_PACKAGE_ACL is not set
+# BR2_PACKAGE_ATTR is not set
+# BR2_PACKAGE_BWM_NG is not set
+# BR2_PACKAGE_CPULOAD is not set
+# BR2_PACKAGE_HTOP is not set
+# BR2_PACKAGE_KEYUTILS is not set
+# BR2_PACKAGE_KMOD is not set
+# BR2_PACKAGE_MONIT is not set
+# BR2_PACKAGE_NCDU is not set
+# BR2_PACKAGE_POLKIT is not set
+# BR2_PACKAGE_QUOTA is not set
+# BR2_PACKAGE_SUPERVISOR is not set
+
+#
+# systemd not available (depends on /dev management with udev and ipv6 support, and thread support in toolchain)
+#
+BR2_PACKAGE_UTIL_LINUX=y
+# BR2_PACKAGE_UTIL_LINUX_MOUNT is not set
+# BR2_PACKAGE_UTIL_LINUX_FSCK is not set
+# BR2_PACKAGE_UTIL_LINUX_LIBMOUNT is not set
+BR2_PACKAGE_UTIL_LINUX_LIBUUID=y
+# BR2_PACKAGE_UTIL_LINUX_UUIDD is not set
+BR2_PACKAGE_UTIL_LINUX_LIBBLKID=y
+# BR2_PACKAGE_UTIL_LINUX_AGETTY is not set
+# BR2_PACKAGE_UTIL_LINUX_CRAMFS is not set
+# BR2_PACKAGE_UTIL_LINUX_SWITCH_ROOT is not set
+# BR2_PACKAGE_UTIL_LINUX_PIVOT_ROOT is not set
+# BR2_PACKAGE_UTIL_LINUX_FALLOCATE is not set
+# BR2_PACKAGE_UTIL_LINUX_UNSHARE is not set
+# BR2_PACKAGE_UTIL_LINUX_RENAME is not set
+# BR2_PACKAGE_UTIL_LINUX_SCHEDUTILS is not set
+# BR2_PACKAGE_UTIL_LINUX_WALL is not set
+# BR2_PACKAGE_UTIL_LINUX_PARTX is not set
+# BR2_PACKAGE_UTIL_LINUX_ARCH is not set
+# BR2_PACKAGE_UTIL_LINUX_INIT is not set
+# BR2_PACKAGE_UTIL_LINUX_KILL is not set
+# BR2_PACKAGE_UTIL_LINUX_LAST is not set
+# BR2_PACKAGE_UTIL_LINUX_MESG is not set
+# BR2_PACKAGE_UTIL_LINUX_RAW is not set
+# BR2_PACKAGE_UTIL_LINUX_RESET is not set
+# BR2_PACKAGE_UTIL_LINUX_LOGIN_UTILS is not set
+# BR2_PACKAGE_UTIL_LINUX_WRITE is not set
+
+#
+# Text editors and viewers
+#
+# BR2_PACKAGE_ED is not set
+BR2_PACKAGE_NANO=y
+BR2_PACKAGE_NANO_TINY=y
+BR2_PACKAGE_UEMACS=y
+
+#
+# Host utilities
+#
+# BR2_PACKAGE_HOST_DFU_UTIL is not set
+# BR2_PACKAGE_HOST_LPC3250LOADER is not set
+# BR2_PACKAGE_HOST_OPENOCD is not set
+# BR2_PACKAGE_HOST_SAM_BA is not set
+# BR2_PACKAGE_HOST_UBOOT_TOOLS is not set
+
+#
+# Filesystem images
+#
+# BR2_TARGET_ROOTFS_CLOOP is not set
+BR2_TARGET_ROOTFS_CPIO=y
+# BR2_TARGET_ROOTFS_CPIO_NONE is not set
+BR2_TARGET_ROOTFS_CPIO_GZIP=y
+# BR2_TARGET_ROOTFS_CPIO_BZIP2 is not set
+# BR2_TARGET_ROOTFS_CPIO_LZMA is not set
+# BR2_TARGET_ROOTFS_CRAMFS is not set
+# BR2_TARGET_ROOTFS_EXT2 is not set
+
+#
+# initramfs requires a Linux kernel to be built
+#
+
+#
+# iso image requires a Linux kernel to be built
+#
+# BR2_TARGET_ROOTFS_JFFS2 is not set
+# BR2_TARGET_ROOTFS_ROMFS is not set
+# BR2_TARGET_ROOTFS_SQUASHFS is not set
+# BR2_TARGET_ROOTFS_TAR is not set
+# BR2_TARGET_ROOTFS_UBIFS is not set
+
+#
+# Bootloaders
+#
+# BR2_TARGET_BAREBOX is not set
+# BR2_TARGET_GRUB is not set
+# BR2_TARGET_SYSLINUX is not set
+# BR2_TARGET_UBOOT is not set
+
+#
+# Kernel
+#
+# BR2_LINUX_KERNEL is not set
+
+#
+# Legacy config options
+#
+# BR2_PACKAGE_CUSTOMIZE is not set
+# BR2_PACKAGE_XSERVER_xorg is not set
+# BR2_PACKAGE_XSERVER_tinyx is not set
+# BR2_PACKAGE_PTHREAD_STUBS is not set
+# BR2_PACKAGE_GETTEXT_STATIC is not set
+# BR2_PACKAGE_LIBINTL is not set
+# BR2_PACKAGE_INPUT_TOOLS_EVTEST is not set
diff --git a/packages/base/any/initrds/buildroot/builds/busybox.config b/packages/base/any/initrds/buildroot/builds/busybox.config
new file mode 100644
index 00000000..8fbde9d9
--- /dev/null
+++ b/packages/base/any/initrds/buildroot/builds/busybox.config
@@ -0,0 +1,1021 @@
+#
+# Automatically generated make config: don't edit
+# Busybox version: 1.20.2
+# Wed Apr 3 09:44:31 2013
+#
+CONFIG_HAVE_DOT_CONFIG=y
+
+#
+# Busybox Settings
+#
+
+#
+# General Configuration
+#
+CONFIG_DESKTOP=y
+# CONFIG_EXTRA_COMPAT is not set
+CONFIG_INCLUDE_SUSv2=y
+# CONFIG_USE_PORTABLE_CODE is not set
+CONFIG_PLATFORM_LINUX=y
+CONFIG_FEATURE_BUFFERS_USE_MALLOC=y
+# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set
+# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set
+CONFIG_SHOW_USAGE=y
+CONFIG_FEATURE_VERBOSE_USAGE=y
+# CONFIG_FEATURE_COMPRESS_USAGE is not set
+CONFIG_FEATURE_INSTALLER=y
+# CONFIG_INSTALL_NO_USR is not set
+# CONFIG_LOCALE_SUPPORT is not set
+# CONFIG_UNICODE_SUPPORT is not set
+# CONFIG_UNICODE_USING_LOCALE is not set
+# CONFIG_FEATURE_CHECK_UNICODE_IN_ENV is not set
+CONFIG_SUBST_WCHAR=0
+CONFIG_LAST_SUPPORTED_WCHAR=0
+# CONFIG_UNICODE_COMBINING_WCHARS is not set
+# CONFIG_UNICODE_WIDE_WCHARS is not set
+# CONFIG_UNICODE_BIDI_SUPPORT is not set
+# CONFIG_UNICODE_NEUTRAL_TABLE is not set
+# CONFIG_UNICODE_PRESERVE_BROKEN is not set
+CONFIG_LONG_OPTS=y
+CONFIG_FEATURE_DEVPTS=y
+CONFIG_FEATURE_CLEAN_UP=y
+# CONFIG_FEATURE_UTMP is not set
+# CONFIG_FEATURE_WTMP is not set
+CONFIG_FEATURE_PIDFILE=y
+# CONFIG_FEATURE_SUID is not set
+# CONFIG_FEATURE_SUID_CONFIG is not set
+# CONFIG_FEATURE_SUID_CONFIG_QUIET is not set
+# CONFIG_SELINUX is not set
+# CONFIG_FEATURE_PREFER_APPLETS is not set
+CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe"
+CONFIG_FEATURE_SYSLOG=y
+# CONFIG_FEATURE_HAVE_RPC is not set
+
+#
+# Build Options
+#
+# CONFIG_STATIC is not set
+# CONFIG_PIE is not set
+# CONFIG_NOMMU is not set
+# CONFIG_BUILD_LIBBUSYBOX is not set
+# CONFIG_FEATURE_INDIVIDUAL is not set
+# CONFIG_FEATURE_SHARED_BUSYBOX is not set
+CONFIG_LFS=y
+CONFIG_CROSS_COMPILER_PREFIX=""
+CONFIG_SYSROOT=""
+CONFIG_EXTRA_CFLAGS=""
+CONFIG_EXTRA_LDFLAGS=""
+CONFIG_EXTRA_LDLIBS=""
+
+#
+# Debugging Options
+#
+# CONFIG_DEBUG is not set
+# CONFIG_DEBUG_PESSIMIZE is not set
+# CONFIG_WERROR is not set
+CONFIG_NO_DEBUG_LIB=y
+# CONFIG_DMALLOC is not set
+# CONFIG_EFENCE is not set
+
+#
+# Installation Options ("make install" behavior)
+#
+CONFIG_INSTALL_APPLET_SYMLINKS=y
+# CONFIG_INSTALL_APPLET_HARDLINKS is not set
+# CONFIG_INSTALL_APPLET_SCRIPT_WRAPPERS is not set
+# CONFIG_INSTALL_APPLET_DONT is not set
+# CONFIG_INSTALL_SH_APPLET_SYMLINK is not set
+# CONFIG_INSTALL_SH_APPLET_HARDLINK is not set
+# CONFIG_INSTALL_SH_APPLET_SCRIPT_WRAPPER is not set
+CONFIG_PREFIX="./_install"
+
+#
+# Busybox Library Tuning
+#
+# CONFIG_FEATURE_SYSTEMD is not set
+CONFIG_FEATURE_RTMINMAX=y
+CONFIG_PASSWORD_MINLEN=6
+CONFIG_MD5_SMALL=1
+CONFIG_FEATURE_FAST_TOP=y
+# CONFIG_FEATURE_ETC_NETWORKS is not set
+CONFIG_FEATURE_USE_TERMIOS=y
+CONFIG_FEATURE_EDITING=y
+CONFIG_FEATURE_EDITING_MAX_LEN=1024
+CONFIG_FEATURE_EDITING_VI=y
+CONFIG_FEATURE_EDITING_HISTORY=999
+# CONFIG_FEATURE_EDITING_SAVEHISTORY is not set
+# CONFIG_FEATURE_EDITING_SAVE_ON_EXIT is not set
+# CONFIG_FEATURE_REVERSE_SEARCH is not set
+CONFIG_FEATURE_TAB_COMPLETION=y
+# CONFIG_FEATURE_USERNAME_COMPLETION is not set
+CONFIG_FEATURE_EDITING_FANCY_PROMPT=y
+# CONFIG_FEATURE_EDITING_ASK_TERMINAL is not set
+CONFIG_FEATURE_NON_POSIX_CP=y
+CONFIG_FEATURE_VERBOSE_CP_MESSAGE=y
+CONFIG_FEATURE_COPYBUF_KB=1024
+# CONFIG_FEATURE_SKIP_ROOTFS is not set
+CONFIG_MONOTONIC_SYSCALL=y
+CONFIG_IOCTL_HEX2STR_ERROR=y
+# CONFIG_FEATURE_HWIB is not set
+
+#
+# Applets
+#
+
+#
+# Archival Utilities
+#
+# CONFIG_FEATURE_SEAMLESS_XZ is not set
+# CONFIG_FEATURE_SEAMLESS_LZMA is not set
+CONFIG_FEATURE_SEAMLESS_BZ2=y
+CONFIG_FEATURE_SEAMLESS_GZ=y
+# CONFIG_FEATURE_SEAMLESS_Z is not set
+# CONFIG_AR is not set
+# CONFIG_FEATURE_AR_LONG_FILENAMES is not set
+# CONFIG_FEATURE_AR_CREATE is not set
+CONFIG_BUNZIP2=y
+CONFIG_BZIP2=y
+CONFIG_CPIO=y
+CONFIG_FEATURE_CPIO_O=y
+CONFIG_FEATURE_CPIO_P=y
+# CONFIG_DPKG is not set
+# CONFIG_DPKG_DEB is not set
+# CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY is not set
+CONFIG_GUNZIP=y
+CONFIG_GZIP=y
+# CONFIG_FEATURE_GZIP_LONG_OPTIONS is not set
+CONFIG_GZIP_FAST=0
+# CONFIG_LZOP is not set
+# CONFIG_LZOP_COMPR_HIGH is not set
+# CONFIG_RPM2CPIO is not set
+# CONFIG_RPM is not set
+CONFIG_TAR=y
+CONFIG_FEATURE_TAR_CREATE=y
+CONFIG_FEATURE_TAR_AUTODETECT=y
+CONFIG_FEATURE_TAR_FROM=y
+# CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY is not set
+# CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY is not set
+CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y
+CONFIG_FEATURE_TAR_LONG_OPTIONS=y
+CONFIG_FEATURE_TAR_TO_COMMAND=y
+# CONFIG_FEATURE_TAR_UNAME_GNAME is not set
+# CONFIG_FEATURE_TAR_NOPRESERVE_TIME is not set
+# CONFIG_FEATURE_TAR_SELINUX is not set
+# CONFIG_UNCOMPRESS is not set
+# CONFIG_UNLZMA is not set
+# CONFIG_FEATURE_LZMA_FAST is not set
+# CONFIG_LZMA is not set
+# CONFIG_UNXZ is not set
+# CONFIG_XZ is not set
+CONFIG_UNZIP=y
+
+#
+# Coreutils
+#
+CONFIG_BASENAME=y
+CONFIG_CAT=y
+CONFIG_DATE=y
+CONFIG_FEATURE_DATE_ISOFMT=y
+# CONFIG_FEATURE_DATE_NANO is not set
+CONFIG_FEATURE_DATE_COMPAT=y
+CONFIG_HOSTID=y
+CONFIG_ID=y
+# CONFIG_GROUPS is not set
+CONFIG_TEST=y
+CONFIG_FEATURE_TEST_64=y
+CONFIG_TOUCH=y
+CONFIG_FEATURE_TOUCH_SUSV3=y
+CONFIG_TR=y
+CONFIG_FEATURE_TR_CLASSES=y
+CONFIG_FEATURE_TR_EQUIV=y
+# CONFIG_BASE64 is not set
+# CONFIG_WHO is not set
+# CONFIG_USERS is not set
+# CONFIG_CAL is not set
+# CONFIG_CATV is not set
+CONFIG_CHGRP=y
+CONFIG_CHMOD=y
+CONFIG_CHOWN=y
+# CONFIG_FEATURE_CHOWN_LONG_OPTIONS is not set
+CONFIG_CHROOT=y
+CONFIG_CKSUM=y
+# CONFIG_COMM is not set
+CONFIG_CP=y
+# CONFIG_FEATURE_CP_LONG_OPTIONS is not set
+CONFIG_CUT=y
+CONFIG_DD=y
+CONFIG_FEATURE_DD_SIGNAL_HANDLING=y
+# CONFIG_FEATURE_DD_THIRD_STATUS_LINE is not set
+CONFIG_FEATURE_DD_IBS_OBS=y
+CONFIG_DF=y
+# CONFIG_FEATURE_DF_FANCY is not set
+CONFIG_DIRNAME=y
+CONFIG_DOS2UNIX=y
+CONFIG_UNIX2DOS=y
+CONFIG_DU=y
+CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y
+CONFIG_ECHO=y
+CONFIG_FEATURE_FANCY_ECHO=y
+CONFIG_ENV=y
+# CONFIG_FEATURE_ENV_LONG_OPTIONS is not set
+# CONFIG_EXPAND is not set
+# CONFIG_FEATURE_EXPAND_LONG_OPTIONS is not set
+CONFIG_EXPR=y
+CONFIG_EXPR_MATH_SUPPORT_64=y
+CONFIG_FALSE=y
+CONFIG_FOLD=y
+# CONFIG_FSYNC is not set
+CONFIG_HEAD=y
+CONFIG_FEATURE_FANCY_HEAD=y
+CONFIG_INSTALL=y
+CONFIG_FEATURE_INSTALL_LONG_OPTIONS=y
+CONFIG_LN=y
+CONFIG_LOGNAME=y
+CONFIG_LS=y
+CONFIG_FEATURE_LS_FILETYPES=y
+CONFIG_FEATURE_LS_FOLLOWLINKS=y
+CONFIG_FEATURE_LS_RECURSIVE=y
+CONFIG_FEATURE_LS_SORTFILES=y
+CONFIG_FEATURE_LS_TIMESTAMPS=y
+CONFIG_FEATURE_LS_USERNAME=y
+CONFIG_FEATURE_LS_COLOR=y
+CONFIG_FEATURE_LS_COLOR_IS_DEFAULT=y
+CONFIG_MD5SUM=y
+CONFIG_MKDIR=y
+CONFIG_FEATURE_MKDIR_LONG_OPTIONS=y
+CONFIG_MKFIFO=y
+CONFIG_MKNOD=y
+CONFIG_MV=y
+CONFIG_FEATURE_MV_LONG_OPTIONS=y
+CONFIG_NICE=y
+CONFIG_NOHUP=y
+CONFIG_OD=y
+CONFIG_PRINTENV=y
+CONFIG_PRINTF=y
+CONFIG_PWD=y
+CONFIG_READLINK=y
+CONFIG_FEATURE_READLINK_FOLLOW=y
+CONFIG_REALPATH=y
+CONFIG_RM=y
+CONFIG_RMDIR=y
+# CONFIG_FEATURE_RMDIR_LONG_OPTIONS is not set
+CONFIG_SEQ=y
+CONFIG_SHA1SUM=y
+CONFIG_SHA256SUM=y
+CONFIG_SHA512SUM=y
+CONFIG_SLEEP=y
+# CONFIG_FEATURE_FANCY_SLEEP is not set
+# CONFIG_FEATURE_FLOAT_SLEEP is not set
+CONFIG_SORT=y
+CONFIG_FEATURE_SORT_BIG=y
+CONFIG_SPLIT=y
+CONFIG_FEATURE_SPLIT_FANCY=y
+CONFIG_STAT=y
+CONFIG_FEATURE_STAT_FORMAT=y
+CONFIG_STTY=y
+CONFIG_SUM=y
+CONFIG_SYNC=y
+# CONFIG_TAC is not set
+CONFIG_TAIL=y
+CONFIG_FEATURE_FANCY_TAIL=y
+CONFIG_TEE=y
+CONFIG_FEATURE_TEE_USE_BLOCK_IO=y
+CONFIG_TRUE=y
+CONFIG_TTY=y
+CONFIG_UNAME=y
+# CONFIG_UNEXPAND is not set
+# CONFIG_FEATURE_UNEXPAND_LONG_OPTIONS is not set
+CONFIG_UNIQ=y
+CONFIG_USLEEP=y
+CONFIG_UUDECODE=y
+CONFIG_UUENCODE=y
+CONFIG_WC=y
+CONFIG_FEATURE_WC_LARGE=y
+CONFIG_WHOAMI=y
+CONFIG_YES=y
+
+#
+# Common options for cp and mv
+#
+CONFIG_FEATURE_PRESERVE_HARDLINKS=y
+
+#
+# Common options for ls, more and telnet
+#
+CONFIG_FEATURE_AUTOWIDTH=y
+
+#
+# Common options for df, du, ls
+#
+CONFIG_FEATURE_HUMAN_READABLE=y
+
+#
+# Common options for md5sum, sha1sum, sha256sum, sha512sum
+#
+CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y
+
+#
+# Console Utilities
+#
+# CONFIG_CHVT is not set
+# CONFIG_FGCONSOLE is not set
+CONFIG_CLEAR=y
+# CONFIG_DEALLOCVT is not set
+# CONFIG_DUMPKMAP is not set
+# CONFIG_KBD_MODE is not set
+# CONFIG_LOADFONT is not set
+# CONFIG_LOADKMAP is not set
+# CONFIG_OPENVT is not set
+CONFIG_RESET=y
+CONFIG_RESIZE=y
+CONFIG_FEATURE_RESIZE_PRINT=y
+# CONFIG_SETCONSOLE is not set
+# CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS is not set
+# CONFIG_SETFONT is not set
+# CONFIG_FEATURE_SETFONT_TEXTUAL_MAP is not set
+CONFIG_DEFAULT_SETFONT_DIR=""
+# CONFIG_SETKEYCODES is not set
+# CONFIG_SETLOGCONS is not set
+# CONFIG_SHOWKEY is not set
+# CONFIG_FEATURE_LOADFONT_PSF2 is not set
+# CONFIG_FEATURE_LOADFONT_RAW is not set
+
+#
+# Debian Utilities
+#
+CONFIG_MKTEMP=y
+CONFIG_PIPE_PROGRESS=y
+# CONFIG_RUN_PARTS is not set
+# CONFIG_FEATURE_RUN_PARTS_LONG_OPTIONS is not set
+# CONFIG_FEATURE_RUN_PARTS_FANCY is not set
+# CONFIG_START_STOP_DAEMON is not set
+# CONFIG_FEATURE_START_STOP_DAEMON_FANCY is not set
+# CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS is not set
+CONFIG_WHICH=y
+
+#
+# Editors
+#
+CONFIG_PATCH=y
+CONFIG_VI=y
+CONFIG_FEATURE_VI_MAX_LEN=4096
+CONFIG_FEATURE_VI_8BIT=y
+CONFIG_FEATURE_VI_COLON=y
+CONFIG_FEATURE_VI_YANKMARK=y
+CONFIG_FEATURE_VI_SEARCH=y
+CONFIG_FEATURE_VI_REGEX_SEARCH=y
+CONFIG_FEATURE_VI_USE_SIGNALS=y
+CONFIG_FEATURE_VI_DOT_CMD=y
+CONFIG_FEATURE_VI_READONLY=y
+CONFIG_FEATURE_VI_SETOPTS=y
+CONFIG_FEATURE_VI_SET=y
+CONFIG_FEATURE_VI_WIN_RESIZE=y
+CONFIG_FEATURE_VI_ASK_TERMINAL=y
+CONFIG_FEATURE_VI_OPTIMIZE_CURSOR=y
+CONFIG_AWK=y
+# CONFIG_FEATURE_AWK_LIBM is not set
+CONFIG_CMP=y
+CONFIG_DIFF=y
+CONFIG_FEATURE_DIFF_LONG_OPTIONS=y
+CONFIG_FEATURE_DIFF_DIR=y
+# CONFIG_ED is not set
+CONFIG_SED=y
+CONFIG_FEATURE_ALLOW_EXEC=y
+
+#
+# Finding Utilities
+#
+CONFIG_FIND=y
+CONFIG_FEATURE_FIND_PRINT0=y
+CONFIG_FEATURE_FIND_MTIME=y
+CONFIG_FEATURE_FIND_MMIN=y
+CONFIG_FEATURE_FIND_PERM=y
+CONFIG_FEATURE_FIND_TYPE=y
+CONFIG_FEATURE_FIND_XDEV=y
+CONFIG_FEATURE_FIND_MAXDEPTH=y
+CONFIG_FEATURE_FIND_NEWER=y
+CONFIG_FEATURE_FIND_INUM=y
+CONFIG_FEATURE_FIND_EXEC=y
+CONFIG_FEATURE_FIND_USER=y
+CONFIG_FEATURE_FIND_GROUP=y
+CONFIG_FEATURE_FIND_NOT=y
+CONFIG_FEATURE_FIND_DEPTH=y
+CONFIG_FEATURE_FIND_PAREN=y
+CONFIG_FEATURE_FIND_SIZE=y
+CONFIG_FEATURE_FIND_PRUNE=y
+CONFIG_FEATURE_FIND_DELETE=y
+CONFIG_FEATURE_FIND_PATH=y
+CONFIG_FEATURE_FIND_REGEX=y
+# CONFIG_FEATURE_FIND_CONTEXT is not set
+CONFIG_FEATURE_FIND_LINKS=y
+CONFIG_GREP=y
+CONFIG_FEATURE_GREP_EGREP_ALIAS=y
+CONFIG_FEATURE_GREP_FGREP_ALIAS=y
+CONFIG_FEATURE_GREP_CONTEXT=y
+CONFIG_XARGS=y
+# CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION is not set
+CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y
+CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y
+CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y
+
+#
+# Init Utilities
+#
+# CONFIG_BOOTCHARTD is not set
+# CONFIG_FEATURE_BOOTCHARTD_BLOATED_HEADER is not set
+# CONFIG_FEATURE_BOOTCHARTD_CONFIG_FILE is not set
+CONFIG_HALT=y
+# CONFIG_FEATURE_CALL_TELINIT is not set
+CONFIG_TELINIT_PATH=""
+CONFIG_INIT=y
+CONFIG_FEATURE_USE_INITTAB=y
+CONFIG_FEATURE_KILL_REMOVED=y
+CONFIG_FEATURE_KILL_DELAY=0
+CONFIG_FEATURE_INIT_SCTTY=y
+CONFIG_FEATURE_INIT_SYSLOG=y
+CONFIG_FEATURE_EXTRA_QUIET=y
+# CONFIG_FEATURE_INIT_COREDUMPS is not set
+CONFIG_FEATURE_INITRD=y
+CONFIG_INIT_TERMINAL_TYPE="linux"
+CONFIG_MESG=y
+CONFIG_FEATURE_MESG_ENABLE_ONLY_GROUP=y
+
+#
+# Login/Password Management Utilities
+#
+# CONFIG_ADD_SHELL is not set
+# CONFIG_REMOVE_SHELL is not set
+# CONFIG_FEATURE_SHADOWPASSWDS is not set
+# CONFIG_USE_BB_PWD_GRP is not set
+# CONFIG_USE_BB_SHADOW is not set
+# CONFIG_USE_BB_CRYPT is not set
+# CONFIG_USE_BB_CRYPT_SHA is not set
+# CONFIG_ADDUSER is not set
+# CONFIG_FEATURE_ADDUSER_LONG_OPTIONS is not set
+# CONFIG_FEATURE_CHECK_NAMES is not set
+CONFIG_FIRST_SYSTEM_ID=0
+CONFIG_LAST_SYSTEM_ID=0
+# CONFIG_ADDGROUP is not set
+# CONFIG_FEATURE_ADDGROUP_LONG_OPTIONS is not set
+# CONFIG_FEATURE_ADDUSER_TO_GROUP is not set
+# CONFIG_DELUSER is not set
+# CONFIG_DELGROUP is not set
+# CONFIG_FEATURE_DEL_USER_FROM_GROUP is not set
+# CONFIG_GETTY is not set
+# CONFIG_LOGIN is not set
+# CONFIG_LOGIN_SESSION_AS_CHILD is not set
+# CONFIG_PAM is not set
+# CONFIG_LOGIN_SCRIPTS is not set
+# CONFIG_FEATURE_NOLOGIN is not set
+# CONFIG_FEATURE_SECURETTY is not set
+# CONFIG_PASSWD is not set
+# CONFIG_FEATURE_PASSWD_WEAK_CHECK is not set
+# CONFIG_CRYPTPW is not set
+# CONFIG_CHPASSWD is not set
+CONFIG_FEATURE_DEFAULT_PASSWD_ALGO=""
+# CONFIG_SU is not set
+# CONFIG_FEATURE_SU_SYSLOG is not set
+# CONFIG_FEATURE_SU_CHECKS_SHELLS is not set
+# CONFIG_SULOGIN is not set
+CONFIG_CHECKPASS=y
+# CONFIG_VLOCK is not set
+
+#
+# Linux Ext2 FS Progs
+#
+# CONFIG_CHATTR is not set
+# CONFIG_FSCK is not set
+# CONFIG_LSATTR is not set
+# CONFIG_TUNE2FS is not set
+
+#
+# Linux Module Utilities
+#
+# CONFIG_MODINFO is not set
+# CONFIG_MODPROBE_SMALL is not set
+# CONFIG_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE is not set
+# CONFIG_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED is not set
+CONFIG_INSMOD=y
+CONFIG_RMMOD=y
+CONFIG_LSMOD=y
+CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT=y
+CONFIG_MODPROBE=y
+# CONFIG_FEATURE_MODPROBE_BLACKLIST is not set
+# CONFIG_DEPMOD is not set
+
+#
+# Options common to multiple modutils
+#
+# CONFIG_FEATURE_2_4_MODULES is not set
+# CONFIG_FEATURE_INSMOD_TRY_MMAP is not set
+# CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set
+# CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set
+# CONFIG_FEATURE_INSMOD_LOADINKMEM is not set
+# CONFIG_FEATURE_INSMOD_LOAD_MAP is not set
+# CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL is not set
+CONFIG_FEATURE_CHECK_TAINTED_MODULE=y
+CONFIG_FEATURE_MODUTILS_ALIAS=y
+CONFIG_FEATURE_MODUTILS_SYMBOLS=y
+CONFIG_DEFAULT_MODULES_DIR="/lib/modules"
+CONFIG_DEFAULT_DEPMOD_FILE="modules.dep"
+
+#
+# Linux System Utilities
+#
+# CONFIG_BLOCKDEV is not set
+CONFIG_MDEV=y
+CONFIG_FEATURE_MDEV_CONF=y
+CONFIG_FEATURE_MDEV_RENAME=y
+# CONFIG_FEATURE_MDEV_RENAME_REGEXP is not set
+CONFIG_FEATURE_MDEV_EXEC=y
+CONFIG_FEATURE_MDEV_LOAD_FIRMWARE=y
+# CONFIG_REV is not set
+# CONFIG_ACPID is not set
+# CONFIG_FEATURE_ACPID_COMPAT is not set
+CONFIG_BLKID=y
+# CONFIG_FEATURE_BLKID_TYPE is not set
+CONFIG_DMESG=y
+CONFIG_FEATURE_DMESG_PRETTY=y
+# CONFIG_FBSET is not set
+# CONFIG_FEATURE_FBSET_FANCY is not set
+# CONFIG_FEATURE_FBSET_READMODE is not set
+# CONFIG_FDFLUSH is not set
+# CONFIG_FDFORMAT is not set
+# CONFIG_FDISK is not set
+# CONFIG_FDISK_SUPPORT_LARGE_DISKS is not set
+# CONFIG_FEATURE_FDISK_WRITABLE is not set
+# CONFIG_FEATURE_AIX_LABEL is not set
+# CONFIG_FEATURE_SGI_LABEL is not set
+# CONFIG_FEATURE_SUN_LABEL is not set
+# CONFIG_FEATURE_OSF_LABEL is not set
+# CONFIG_FEATURE_GPT_LABEL is not set
+# CONFIG_FEATURE_FDISK_ADVANCED is not set
+# CONFIG_FINDFS is not set
+# CONFIG_FLOCK is not set
+CONFIG_FREERAMDISK=y
+# CONFIG_FSCK_MINIX is not set
+# CONFIG_MKFS_EXT2 is not set
+# CONFIG_MKFS_MINIX is not set
+# CONFIG_FEATURE_MINIX2 is not set
+# CONFIG_MKFS_REISER is not set
+# CONFIG_MKFS_VFAT is not set
+CONFIG_GETOPT=y
+CONFIG_FEATURE_GETOPT_LONG=y
+CONFIG_HEXDUMP=y
+# CONFIG_FEATURE_HEXDUMP_REVERSE is not set
+# CONFIG_HD is not set
+CONFIG_HWCLOCK=y
+CONFIG_FEATURE_HWCLOCK_LONG_OPTIONS=y
+CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS=y
+# CONFIG_IPCRM is not set
+# CONFIG_IPCS is not set
+CONFIG_LOSETUP=y
+CONFIG_LSPCI=y
+CONFIG_LSUSB=y
+# CONFIG_MKSWAP is not set
+# CONFIG_FEATURE_MKSWAP_UUID is not set
+CONFIG_MORE=y
+CONFIG_MOUNT=y
+# CONFIG_FEATURE_MOUNT_FAKE is not set
+CONFIG_FEATURE_MOUNT_VERBOSE=y
+# CONFIG_FEATURE_MOUNT_HELPERS is not set
+CONFIG_FEATURE_MOUNT_LABEL=y
+# CONFIG_FEATURE_MOUNT_NFS is not set
+# CONFIG_FEATURE_MOUNT_CIFS is not set
+CONFIG_FEATURE_MOUNT_FLAGS=y
+CONFIG_FEATURE_MOUNT_FSTAB=y
+CONFIG_PIVOT_ROOT=y
+CONFIG_RDATE=y
+# CONFIG_RDEV is not set
+# CONFIG_READPROFILE is not set
+# CONFIG_RTCWAKE is not set
+# CONFIG_SCRIPT is not set
+# CONFIG_SCRIPTREPLAY is not set
+CONFIG_SETARCH=y
+# CONFIG_SWAPONOFF is not set
+# CONFIG_FEATURE_SWAPON_PRI is not set
+CONFIG_SWITCH_ROOT=y
+CONFIG_UMOUNT=y
+CONFIG_FEATURE_UMOUNT_ALL=y
+
+#
+# Common options for mount/umount
+#
+CONFIG_FEATURE_MOUNT_LOOP=y
+CONFIG_FEATURE_MOUNT_LOOP_CREATE=y
+# CONFIG_FEATURE_MTAB_SUPPORT is not set
+CONFIG_VOLUMEID=y
+
+#
+# Filesystem/Volume identification
+#
+# CONFIG_FEATURE_VOLUMEID_EXT is not set
+# CONFIG_FEATURE_VOLUMEID_BTRFS is not set
+# CONFIG_FEATURE_VOLUMEID_REISERFS is not set
+# CONFIG_FEATURE_VOLUMEID_FAT is not set
+# CONFIG_FEATURE_VOLUMEID_HFS is not set
+# CONFIG_FEATURE_VOLUMEID_JFS is not set
+# CONFIG_FEATURE_VOLUMEID_XFS is not set
+# CONFIG_FEATURE_VOLUMEID_NTFS is not set
+# CONFIG_FEATURE_VOLUMEID_ISO9660 is not set
+# CONFIG_FEATURE_VOLUMEID_UDF is not set
+# CONFIG_FEATURE_VOLUMEID_LUKS is not set
+# CONFIG_FEATURE_VOLUMEID_LINUXSWAP is not set
+# CONFIG_FEATURE_VOLUMEID_CRAMFS is not set
+# CONFIG_FEATURE_VOLUMEID_ROMFS is not set
+# CONFIG_FEATURE_VOLUMEID_SYSV is not set
+# CONFIG_FEATURE_VOLUMEID_OCFS2 is not set
+# CONFIG_FEATURE_VOLUMEID_LINUXRAID is not set
+
+#
+# Miscellaneous Utilities
+#
+# CONFIG_CONSPY is not set
+CONFIG_LESS=y
+CONFIG_FEATURE_LESS_MAXLINES=9999999
+CONFIG_FEATURE_LESS_BRACKETS=y
+CONFIG_FEATURE_LESS_FLAGS=y
+# CONFIG_FEATURE_LESS_MARKS is not set
+CONFIG_FEATURE_LESS_REGEXP=y
+# CONFIG_FEATURE_LESS_WINCH is not set
+# CONFIG_FEATURE_LESS_ASK_TERMINAL is not set
+# CONFIG_FEATURE_LESS_DASHCMD is not set
+# CONFIG_FEATURE_LESS_LINENUMS is not set
+# CONFIG_NANDWRITE is not set
+# CONFIG_NANDDUMP is not set
+CONFIG_SETSERIAL=y
+# CONFIG_UBIATTACH is not set
+# CONFIG_UBIDETACH is not set
+# CONFIG_UBIMKVOL is not set
+# CONFIG_UBIRMVOL is not set
+# CONFIG_UBIRSVOL is not set
+# CONFIG_UBIUPDATEVOL is not set
+# CONFIG_ADJTIMEX is not set
+# CONFIG_BBCONFIG is not set
+# CONFIG_FEATURE_COMPRESS_BBCONFIG is not set
+# CONFIG_BEEP is not set
+CONFIG_FEATURE_BEEP_FREQ=0
+CONFIG_FEATURE_BEEP_LENGTH_MS=0
+# CONFIG_CHAT is not set
+# CONFIG_FEATURE_CHAT_NOFAIL is not set
+# CONFIG_FEATURE_CHAT_TTY_HIFI is not set
+# CONFIG_FEATURE_CHAT_IMPLICIT_CR is not set
+# CONFIG_FEATURE_CHAT_SWALLOW_OPTS is not set
+# CONFIG_FEATURE_CHAT_SEND_ESCAPES is not set
+# CONFIG_FEATURE_CHAT_VAR_ABORT_LEN is not set
+# CONFIG_FEATURE_CHAT_CLR_ABORT is not set
+# CONFIG_CHRT is not set
+# CONFIG_CROND is not set
+# CONFIG_FEATURE_CROND_D is not set
+# CONFIG_FEATURE_CROND_CALL_SENDMAIL is not set
+CONFIG_FEATURE_CROND_DIR=""
+# CONFIG_CRONTAB is not set
+CONFIG_DC=y
+# CONFIG_FEATURE_DC_LIBM is not set
+# CONFIG_DEVFSD is not set
+# CONFIG_DEVFSD_MODLOAD is not set
+# CONFIG_DEVFSD_FG_NP is not set
+# CONFIG_DEVFSD_VERBOSE is not set
+# CONFIG_FEATURE_DEVFS is not set
+CONFIG_DEVMEM=y
+# CONFIG_EJECT is not set
+# CONFIG_FEATURE_EJECT_SCSI is not set
+# CONFIG_FBSPLASH is not set
+# CONFIG_FLASHCP is not set
+# CONFIG_FLASH_LOCK is not set
+# CONFIG_FLASH_UNLOCK is not set
+# CONFIG_FLASH_ERASEALL is not set
+# CONFIG_IONICE is not set
+# CONFIG_INOTIFYD is not set
+# CONFIG_LAST is not set
+# CONFIG_FEATURE_LAST_SMALL is not set
+# CONFIG_FEATURE_LAST_FANCY is not set
+# CONFIG_HDPARM is not set
+# CONFIG_FEATURE_HDPARM_GET_IDENTITY is not set
+# CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF is not set
+# CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF is not set
+# CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET is not set
+# CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF is not set
+# CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA is not set
+# CONFIG_MAKEDEVS is not set
+# CONFIG_FEATURE_MAKEDEVS_LEAF is not set
+# CONFIG_FEATURE_MAKEDEVS_TABLE is not set
+# CONFIG_MAN is not set
+# CONFIG_MICROCOM is not set
+CONFIG_MOUNTPOINT=y
+# CONFIG_MT is not set
+# CONFIG_RAIDAUTORUN is not set
+# CONFIG_READAHEAD is not set
+# CONFIG_RFKILL is not set
+# CONFIG_RUNLEVEL is not set
+# CONFIG_RX is not set
+CONFIG_SETSID=y
+# CONFIG_STRINGS is not set
+# CONFIG_TASKSET is not set
+# CONFIG_FEATURE_TASKSET_FANCY is not set
+CONFIG_TIME=y
+CONFIG_TIMEOUT=y
+# CONFIG_TTYSIZE is not set
+# CONFIG_VOLNAME is not set
+# CONFIG_WALL is not set
+CONFIG_WATCHDOG=y
+
+#
+# Networking Utilities
+#
+# CONFIG_NAMEIF is not set
+# CONFIG_FEATURE_NAMEIF_EXTENDED is not set
+# CONFIG_NBDCLIENT is not set
+# CONFIG_NC is not set
+# CONFIG_NC_SERVER is not set
+# CONFIG_NC_EXTRA is not set
+# CONFIG_NC_110_COMPAT is not set
+CONFIG_PING=y
+CONFIG_PING6=y
+CONFIG_FEATURE_FANCY_PING=y
+# CONFIG_WHOIS is not set
+CONFIG_FEATURE_IPV6=y
+# CONFIG_FEATURE_UNIX_LOCAL is not set
+# CONFIG_FEATURE_PREFER_IPV4_ADDRESS is not set
+CONFIG_VERBOSE_RESOLUTION_ERRORS=y
+CONFIG_ARP=y
+CONFIG_ARPING=y
+# CONFIG_BRCTL is not set
+# CONFIG_FEATURE_BRCTL_FANCY is not set
+# CONFIG_FEATURE_BRCTL_SHOW is not set
+# CONFIG_DNSD is not set
+# CONFIG_ETHER_WAKE is not set
+# CONFIG_FAKEIDENTD is not set
+# CONFIG_FTPD is not set
+# CONFIG_FEATURE_FTP_WRITE is not set
+# CONFIG_FEATURE_FTPD_ACCEPT_BROKEN_LIST is not set
+CONFIG_FTPGET=y
+CONFIG_FTPPUT=y
+CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS=y
+CONFIG_HOSTNAME=y
+# CONFIG_HTTPD is not set
+# CONFIG_FEATURE_HTTPD_RANGES is not set
+# CONFIG_FEATURE_HTTPD_USE_SENDFILE is not set
+# CONFIG_FEATURE_HTTPD_SETUID is not set
+# CONFIG_FEATURE_HTTPD_BASIC_AUTH is not set
+# CONFIG_FEATURE_HTTPD_AUTH_MD5 is not set
+# CONFIG_FEATURE_HTTPD_CGI is not set
+# CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR is not set
+# CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV is not set
+# CONFIG_FEATURE_HTTPD_ENCODE_URL_STR is not set
+# CONFIG_FEATURE_HTTPD_ERROR_PAGES is not set
+# CONFIG_FEATURE_HTTPD_PROXY is not set
+# CONFIG_FEATURE_HTTPD_GZIP is not set
+CONFIG_IFCONFIG=y
+CONFIG_FEATURE_IFCONFIG_STATUS=y
+CONFIG_FEATURE_IFCONFIG_SLIP=y
+CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ=y
+CONFIG_FEATURE_IFCONFIG_HW=y
+# CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS is not set
+# CONFIG_IFENSLAVE is not set
+# CONFIG_IFPLUGD is not set
+# CONFIG_IFUPDOWN is not set
+CONFIG_IFUPDOWN_IFSTATE_PATH=""
+# CONFIG_FEATURE_IFUPDOWN_IP is not set
+# CONFIG_FEATURE_IFUPDOWN_IP_BUILTIN is not set
+# CONFIG_FEATURE_IFUPDOWN_IFCONFIG_BUILTIN is not set
+# CONFIG_FEATURE_IFUPDOWN_IPV4 is not set
+# CONFIG_FEATURE_IFUPDOWN_IPV6 is not set
+# CONFIG_FEATURE_IFUPDOWN_MAPPING is not set
+# CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set
+CONFIG_INETD=y
+CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO=y
+CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD=y
+CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME=y
+CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME=y
+CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN=y
+# CONFIG_FEATURE_INETD_RPC is not set
+CONFIG_IP=y
+CONFIG_FEATURE_IP_ADDRESS=y
+CONFIG_FEATURE_IP_LINK=y
+CONFIG_FEATURE_IP_ROUTE=y
+CONFIG_FEATURE_IP_TUNNEL=y
+CONFIG_FEATURE_IP_RULE=y
+CONFIG_FEATURE_IP_SHORT_FORMS=y
+# CONFIG_FEATURE_IP_RARE_PROTOCOLS is not set
+CONFIG_IPADDR=y
+CONFIG_IPLINK=y
+CONFIG_IPROUTE=y
+CONFIG_IPTUNNEL=y
+CONFIG_IPRULE=y
+CONFIG_IPCALC=y
+CONFIG_FEATURE_IPCALC_FANCY=y
+CONFIG_FEATURE_IPCALC_LONG_OPTIONS=y
+CONFIG_NETSTAT=y
+# CONFIG_FEATURE_NETSTAT_WIDE is not set
+# CONFIG_FEATURE_NETSTAT_PRG is not set
+# CONFIG_NSLOOKUP is not set
+# CONFIG_NTPD is not set
+# CONFIG_FEATURE_NTPD_SERVER is not set
+# CONFIG_PSCAN is not set
+CONFIG_ROUTE=y
+# CONFIG_SLATTACH is not set
+# CONFIG_TCPSVD is not set
+CONFIG_TELNET=y
+CONFIG_FEATURE_TELNET_TTYPE=y
+CONFIG_FEATURE_TELNET_AUTOLOGIN=y
+# CONFIG_TELNETD is not set
+# CONFIG_FEATURE_TELNETD_STANDALONE is not set
+# CONFIG_FEATURE_TELNETD_INETD_WAIT is not set
+CONFIG_TFTP=y
+# CONFIG_TFTPD is not set
+
+#
+# Common options for tftp/tftpd
+#
+CONFIG_FEATURE_TFTP_GET=y
+CONFIG_FEATURE_TFTP_PUT=y
+CONFIG_FEATURE_TFTP_BLOCKSIZE=y
+CONFIG_FEATURE_TFTP_PROGRESS_BAR=y
+# CONFIG_TFTP_DEBUG is not set
+CONFIG_TRACEROUTE=y
+CONFIG_TRACEROUTE6=y
+CONFIG_FEATURE_TRACEROUTE_VERBOSE=y
+CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE=y
+CONFIG_FEATURE_TRACEROUTE_USE_ICMP=y
+# CONFIG_TUNCTL is not set
+# CONFIG_FEATURE_TUNCTL_UG is not set
+# CONFIG_UDHCPC6 is not set
+# CONFIG_UDHCPD is not set
+# CONFIG_DHCPRELAY is not set
+# CONFIG_DUMPLEASES is not set
+# CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY is not set
+# CONFIG_FEATURE_UDHCPD_BASE_IP_ON_MAC is not set
+CONFIG_DHCPD_LEASES_FILE=""
+CONFIG_UDHCPC=y
+CONFIG_FEATURE_UDHCPC_ARPING=y
+CONFIG_FEATURE_UDHCP_PORT=y
+CONFIG_UDHCP_DEBUG=1
+CONFIG_FEATURE_UDHCP_RFC3397=y
+CONFIG_FEATURE_UDHCP_8021Q=y
+CONFIG_UDHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script"
+CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=924
+CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS=""
+# CONFIG_UDPSVD is not set
+CONFIG_VCONFIG=y
+CONFIG_WGET=y
+CONFIG_FEATURE_WGET_STATUSBAR=y
+CONFIG_FEATURE_WGET_AUTHENTICATION=y
+CONFIG_FEATURE_WGET_LONG_OPTIONS=y
+CONFIG_FEATURE_WGET_TIMEOUT=y
+CONFIG_ZCIP=y
+
+#
+# Print Utilities
+#
+# CONFIG_LPD is not set
+# CONFIG_LPR is not set
+# CONFIG_LPQ is not set
+
+#
+# Mail Utilities
+#
+# CONFIG_MAKEMIME is not set
+CONFIG_FEATURE_MIME_CHARSET=""
+# CONFIG_POPMAILDIR is not set
+# CONFIG_FEATURE_POPMAILDIR_DELIVERY is not set
+# CONFIG_REFORMIME is not set
+# CONFIG_FEATURE_REFORMIME_COMPAT is not set
+# CONFIG_SENDMAIL is not set
+
+#
+# Process Utilities
+#
+CONFIG_IOSTAT=y
+CONFIG_LSOF=y
+# CONFIG_MPSTAT is not set
+# CONFIG_NMETER is not set
+# CONFIG_PMAP is not set
+# CONFIG_POWERTOP is not set
+CONFIG_PSTREE=y
+# CONFIG_PWDX is not set
+# CONFIG_SMEMCAP is not set
+CONFIG_UPTIME=y
+# CONFIG_FEATURE_UPTIME_UTMP_SUPPORT is not set
+CONFIG_FREE=y
+CONFIG_FUSER=y
+CONFIG_KILL=y
+CONFIG_KILLALL=y
+CONFIG_KILLALL5=y
+# CONFIG_PGREP is not set
+CONFIG_PIDOF=y
+CONFIG_FEATURE_PIDOF_SINGLE=y
+CONFIG_FEATURE_PIDOF_OMIT=y
+CONFIG_PKILL=y
+CONFIG_PS=y
+# CONFIG_FEATURE_PS_WIDE is not set
+# CONFIG_FEATURE_PS_LONG is not set
+CONFIG_FEATURE_PS_TIME=y
+CONFIG_FEATURE_PS_ADDITIONAL_COLUMNS=y
+# CONFIG_FEATURE_PS_UNUSUAL_SYSTEMS is not set
+CONFIG_RENICE=y
+CONFIG_BB_SYSCTL=y
+CONFIG_TOP=y
+CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y
+CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y
+CONFIG_FEATURE_TOP_SMP_CPU=y
+CONFIG_FEATURE_TOP_DECIMALS=y
+CONFIG_FEATURE_TOP_SMP_PROCESS=y
+CONFIG_FEATURE_TOPMEM=y
+CONFIG_FEATURE_SHOW_THREADS=y
+CONFIG_WATCH=y
+
+#
+# Runit Utilities
+#
+# CONFIG_RUNSV is not set
+# CONFIG_RUNSVDIR is not set
+# CONFIG_FEATURE_RUNSVDIR_LOG is not set
+# CONFIG_SV is not set
+CONFIG_SV_DEFAULT_SERVICE_DIR=""
+# CONFIG_SVLOGD is not set
+# CONFIG_CHPST is not set
+# CONFIG_SETUIDGID is not set
+# CONFIG_ENVUIDGID is not set
+# CONFIG_ENVDIR is not set
+# CONFIG_SOFTLIMIT is not set
+# CONFIG_CHCON is not set
+# CONFIG_FEATURE_CHCON_LONG_OPTIONS is not set
+# CONFIG_GETENFORCE is not set
+# CONFIG_GETSEBOOL is not set
+# CONFIG_LOAD_POLICY is not set
+# CONFIG_MATCHPATHCON is not set
+# CONFIG_RESTORECON is not set
+# CONFIG_RUNCON is not set
+# CONFIG_FEATURE_RUNCON_LONG_OPTIONS is not set
+# CONFIG_SELINUXENABLED is not set
+# CONFIG_SETENFORCE is not set
+# CONFIG_SETFILES is not set
+# CONFIG_FEATURE_SETFILES_CHECK_OPTION is not set
+# CONFIG_SETSEBOOL is not set
+# CONFIG_SESTATUS is not set
+
+#
+# Shells
+#
+CONFIG_ASH=y
+CONFIG_ASH_BASH_COMPAT=y
+CONFIG_ASH_IDLE_TIMEOUT=y
+CONFIG_ASH_JOB_CONTROL=y
+CONFIG_ASH_ALIAS=y
+# CONFIG_ASH_GETOPTS is not set
+CONFIG_ASH_BUILTIN_ECHO=y
+CONFIG_ASH_BUILTIN_PRINTF=y
+CONFIG_ASH_BUILTIN_TEST=y
+CONFIG_ASH_CMDCMD=y
+# CONFIG_ASH_MAIL is not set
+CONFIG_ASH_OPTIMIZE_FOR_SIZE=y
+CONFIG_ASH_RANDOM_SUPPORT=y
+CONFIG_ASH_EXPAND_PRMT=y
+# CONFIG_CTTYHACK is not set
+# CONFIG_HUSH is not set
+# CONFIG_HUSH_BASH_COMPAT is not set
+# CONFIG_HUSH_BRACE_EXPANSION is not set
+# CONFIG_HUSH_HELP is not set
+# CONFIG_HUSH_INTERACTIVE is not set
+# CONFIG_HUSH_SAVEHISTORY is not set
+# CONFIG_HUSH_JOB is not set
+# CONFIG_HUSH_TICK is not set
+# CONFIG_HUSH_IF is not set
+# CONFIG_HUSH_LOOPS is not set
+# CONFIG_HUSH_CASE is not set
+# CONFIG_HUSH_FUNCTIONS is not set
+# CONFIG_HUSH_LOCAL is not set
+# CONFIG_HUSH_RANDOM_SUPPORT is not set
+# CONFIG_HUSH_EXPORT_N is not set
+# CONFIG_HUSH_MODE_X is not set
+# CONFIG_MSH is not set
+CONFIG_FEATURE_SH_IS_ASH=y
+# CONFIG_FEATURE_SH_IS_HUSH is not set
+# CONFIG_FEATURE_SH_IS_NONE is not set
+# CONFIG_FEATURE_BASH_IS_ASH is not set
+# CONFIG_FEATURE_BASH_IS_HUSH is not set
+CONFIG_FEATURE_BASH_IS_NONE=y
+CONFIG_SH_MATH_SUPPORT=y
+# CONFIG_SH_MATH_SUPPORT_64 is not set
+CONFIG_FEATURE_SH_EXTRA_QUIET=y
+# CONFIG_FEATURE_SH_STANDALONE is not set
+# CONFIG_FEATURE_SH_NOFORK is not set
+# CONFIG_FEATURE_SH_HISTFILESIZE is not set
+
+#
+# System Logging Utilities
+#
+CONFIG_SYSLOGD=y
+CONFIG_FEATURE_ROTATE_LOGFILE=y
+CONFIG_FEATURE_REMOTE_LOG=y
+# CONFIG_FEATURE_SYSLOGD_DUP is not set
+# CONFIG_FEATURE_SYSLOGD_CFG is not set
+CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=256
+# CONFIG_FEATURE_IPC_SYSLOG is not set
+CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=0
+# CONFIG_LOGREAD is not set
+# CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING is not set
+CONFIG_KLOGD=y
+CONFIG_FEATURE_KLOGD_KLOGCTL=y
+CONFIG_LOGGER=y
diff --git a/packages/base/any/initrds/buildroot/builds/patches/busybox-001-init-quiet-restart.patch b/packages/base/any/initrds/buildroot/builds/patches/busybox-001-init-quiet-restart.patch
new file mode 100755
index 00000000..2394ea06
--- /dev/null
+++ b/packages/base/any/initrds/buildroot/builds/patches/busybox-001-init-quiet-restart.patch
@@ -0,0 +1,24 @@
+Index: busybox-1.18.1/init/init.c
+===================================================================
+--- busybox-1.18.1.orig/init/init.c
++++ busybox-1.18.1/init/init.c
+@@ -721,16 +721,16 @@ static void run_shutdown_and_kill_proces
+ * shut things down gracefully... */
+ run_actions(SHUTDOWN);
+
+- message(L_CONSOLE | L_LOG, "The system is going down NOW!");
++ dbg_message(L_CONSOLE | L_LOG, "The system is going down NOW!");
+
+ /* Send signals to every process _except_ pid 1 */
+ kill(-1, SIGTERM);
+- message(L_CONSOLE | L_LOG, "Sent SIG%s to all processes", "TERM");
++ dbg_message(L_CONSOLE | L_LOG, "Sent SIG%s to all processes", "TERM");
+ sync();
+ sleep(1);
+
+ kill(-1, SIGKILL);
+- message(L_CONSOLE, "Sent SIG%s to all processes", "KILL");
++ dbg_message(L_CONSOLE, "Sent SIG%s to all processes", "KILL");
+ sync();
+ /*sleep(1); - callers take care about making a pause */
+ }
diff --git a/packages/base/any/initrds/buildroot/builds/patches/busybox-002-checkpass-command.patch b/packages/base/any/initrds/buildroot/builds/patches/busybox-002-checkpass-command.patch
new file mode 100644
index 00000000..33856e77
--- /dev/null
+++ b/packages/base/any/initrds/buildroot/builds/patches/busybox-002-checkpass-command.patch
@@ -0,0 +1,102 @@
+diff -BurN busybox-1.20.2.orig/include/applets.src.h busybox-1.20.2/include/applets.src.h
+--- busybox-1.20.2.orig/include/applets.src.h 2012-07-02 07:08:25.000000000 -0700
++++ busybox-1.20.2/include/applets.src.h 2013-02-17 22:44:52.391965779 -0800
+@@ -89,6 +89,7 @@
+ IF_CHAT(APPLET(chat, BB_DIR_USR_BIN, BB_SUID_DROP))
+ IF_CHATTR(APPLET(chattr, BB_DIR_BIN, BB_SUID_DROP))
+ IF_CHCON(APPLET(chcon, BB_DIR_USR_BIN, BB_SUID_DROP))
++IF_CHECKPASS(APPLET(checkpass, BB_DIR_BIN, BB_SUID_DROP))
+ IF_CHGRP(APPLET_NOEXEC(chgrp, chgrp, BB_DIR_BIN, BB_SUID_DROP, chgrp))
+ IF_CHMOD(APPLET_NOEXEC(chmod, chmod, BB_DIR_BIN, BB_SUID_DROP, chmod))
+ IF_CHOWN(APPLET_NOEXEC(chown, chown, BB_DIR_BIN, BB_SUID_DROP, chown))
+diff -BurN busybox-1.20.2.orig/libbb/Kbuild.src busybox-1.20.2/libbb/Kbuild.src
+--- busybox-1.20.2.orig/libbb/Kbuild.src 2012-06-26 06:35:45.000000000 -0700
++++ busybox-1.20.2/libbb/Kbuild.src 2013-02-17 22:44:18.244878185 -0800
+@@ -147,6 +147,7 @@
+ lib-$(CONFIG_CHPASSWD) += pw_encrypt.o update_passwd.o
+ lib-$(CONFIG_CRYPTPW) += pw_encrypt.o
+ lib-$(CONFIG_SULOGIN) += pw_encrypt.o
++lib-$(CONFIG_CHECKPASS) += pw_encrypt.o
+ lib-$(CONFIG_VLOCK) += pw_encrypt.o correct_password.o
+ lib-$(CONFIG_SU) += pw_encrypt.o correct_password.o
+ lib-$(CONFIG_LOGIN) += pw_encrypt.o correct_password.o
+diff -BurN busybox-1.20.2.orig/loginutils/checkpass.c busybox-1.20.2/loginutils/checkpass.c
+--- busybox-1.20.2.orig/loginutils/checkpass.c 1969-12-31 16:00:00.000000000 -0800
++++ busybox-1.20.2/loginutils/checkpass.c 2013-02-17 22:47:59.523281983 -0800
+@@ -0,0 +1,51 @@
++/* vi: set sw=4 ts=4: */
++/*
++ * Mini checkpass for busybox
++ *
++ * Copyright 2013 Big Switch Networks, Inc.
++ *
++ * Licensed under GPLv2 or later, see file LICENSE in this source tree.
++ */
++
++//usage:#define checkpass_trivial_usage
++//usage: "[-p PROMPT] [-t TRIES] ENCRYPTED_PASSWORD"
++//usage:#define checkpass_full_usage "\n\n"
++//usage: "Prompt the user for a password and check it against ENCRYPTED_PASSWORD,\n"
++//usage: "returning 0 if the password matches or 1 otherwise"
++//usage: "\n\nOptions:"
++//usage: "\n -p PROMPT Use PROMPT instead of \"Password:\""
++//usage: "\n -t TRIES Prompt TRIES times before giving up"
++
++#include "libbb.h"
++
++int checkpass_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
++int checkpass_main(int argc, char **argv)
++{
++ char *passwd;
++ unsigned int tries = 3;
++ char *opt_tries = NULL;
++ char *opt_prompt = (char *) "Password:";
++ unsigned int opt;
++
++ opt = getopt32(argv, "t:p:", &opt_tries, &opt_prompt);
++ argc -= optind;
++ argv += optind;
++
++ passwd = argv[0];
++ if (opt_tries)
++ tries = xatou(opt_tries);
++
++ if (argc != 1 || tries < 1)
++ bb_show_usage();
++
++ for (unsigned int try = 0; try < tries; try++) {
++ char *input = bb_ask_stdin(opt_prompt);
++ if (input && !strcmp(pw_encrypt(input, passwd,1), passwd))
++ return 0;
++
++ bb_do_delay(LOGIN_FAIL_DELAY);
++ puts("incorrect password");
++ }
++
++ return 1;
++}
+diff -BurN busybox-1.20.2.orig/loginutils/Config.src busybox-1.20.2/loginutils/Config.src
+--- busybox-1.20.2.orig/loginutils/Config.src 2012-06-26 06:35:45.000000000 -0700
++++ busybox-1.20.2/loginutils/Config.src 2013-02-17 22:44:18.240880167 -0800
+@@ -319,6 +319,13 @@
+ sulogin is invoked when the system goes into single user
+ mode (this is done through an entry in inittab).
+
++config CHECKPASS
++ bool "checkpass"
++ default n
++ help
++ checkpass prompts the user for a password and checks it against the
++ encrypted parameter.
++
+ config VLOCK
+ bool "vlock"
+ default y
+diff -BurN busybox-1.20.2.orig/loginutils/Kbuild.src busybox-1.20.2/loginutils/Kbuild.src
+--- busybox-1.20.2.orig/loginutils/Kbuild.src 2012-06-26 06:35:45.000000000 -0700
++++ busybox-1.20.2/loginutils/Kbuild.src 2013-02-17 22:44:18.240880167 -0800
+@@ -19,3 +19,4 @@
+ lib-$(CONFIG_VLOCK) += vlock.o
+ lib-$(CONFIG_DELUSER) += deluser.o
+ lib-$(CONFIG_DELGROUP) += deluser.o
++lib-$(CONFIG_CHECKPASS) += checkpass.o
diff --git a/packages/base/any/initrds/buildroot/builds/patches/jq.Config.in b/packages/base/any/initrds/buildroot/builds/patches/jq.Config.in
new file mode 100644
index 00000000..ea9a80ac
--- /dev/null
+++ b/packages/base/any/initrds/buildroot/builds/patches/jq.Config.in
@@ -0,0 +1,4 @@
+config BR2_PACKAGE_JQ
+ bool "jq"
+ help
+ Include the 'jq' command-line json tool
diff --git a/packages/base/any/initrds/buildroot/builds/patches/jq.mk b/packages/base/any/initrds/buildroot/builds/patches/jq.mk
new file mode 100644
index 00000000..29ab4acb
--- /dev/null
+++ b/packages/base/any/initrds/buildroot/builds/patches/jq.mk
@@ -0,0 +1,14 @@
+######################################################################
+##
+## jq
+##
+######################################################################
+
+JQ_VERSION = 1.3
+JQ_SOURCE = jq-$(JQ_VERSION).tar.gz
+JQ_SITE = http://stedolan.github.io/jq/download/source
+JQ_INSTALL_STAGING = NO
+JQ_INSTALL_TARGET = YES
+JQ_CONF_OPT = --disable-docs
+
+$(eval $(autotools-package))
diff --git a/packages/base/any/initrds/buildroot/builds/patches/kexec-001-fix-crashkernel-region-overflow-check.patch b/packages/base/any/initrds/buildroot/builds/patches/kexec-001-fix-crashkernel-region-overflow-check.patch
new file mode 100644
index 00000000..a77288e9
--- /dev/null
+++ b/packages/base/any/initrds/buildroot/builds/patches/kexec-001-fix-crashkernel-region-overflow-check.patch
@@ -0,0 +1,24 @@
+Subject: [PATCH] kexec-elf-ppc: Fix crashkernel region overflow check
+From: Anders Hedlund
+Date: 2012-12-17 22:11:48
+
+Signed-off-by: Anders Hedlund
+---
+ kexec/arch/ppc/kexec-elf-ppc.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/kexec/arch/ppc/kexec-elf-ppc.c b/kexec/arch/ppc/kexec-elf-ppc.c
+index 314eb1e..8e408cc 100644
+--- a/kexec/arch/ppc/kexec-elf-ppc.c
++++ b/kexec/arch/ppc/kexec-elf-ppc.c
+@@ -382,7 +382,7 @@ int elf_ppc_load(int argc, char **argv, const char *buf, off_t len,
+ (ramdisk_base > crash_base + crash_size) ) {
+ printf("WARNING: ramdisk is above crashkernel region!\n");
+ }
+- else if (ramdisk_base + initrd_size > crash_base + crash_size) {
++ else if (ramdisk_base + ramdisk_size > crash_base + crash_size) {
+ printf("WARNING: ramdisk overflows crashkernel region!\n");
+ }
+ }
+--
+1.7.10.4
diff --git a/packages/base/any/initrds/buildroot/builds/post-build b/packages/base/any/initrds/buildroot/builds/post-build
new file mode 100755
index 00000000..6b75f7d7
--- /dev/null
+++ b/packages/base/any/initrds/buildroot/builds/post-build
@@ -0,0 +1,47 @@
+#!/bin/bash -ex
+############################################################
+#
+#
+# Copyright 2013, 2014 BigSwitch Networks, Inc.
+#
+#
+#
+#
+############################################################
+#
+# post-build
+#
+############################################################
+TARGET=$1
+[ -d "${TARGET}" ] || { echo "Usage: $0 TARGET_DIR" >&2; exit 1; }
+
+rm -f ${TARGET}/linuxrc
+
+rm -f ${TARGET}/etc/hostname
+rm -f ${TARGET}/etc/inputrc
+rm -f ${TARGET}/etc/issue
+rm -rf ${TARGET}/etc/ld.so.conf*
+rm -f ${TARGET}/etc/mtab
+rm -rf ${TARGET}/etc/network
+rm -f ${TARGET}/etc/nsswitch.conf
+rm -f ${TARGET}/etc/os-release
+rm -f ${TARGET}/etc/protocols
+rm -f ${TARGET}/etc/random-seed
+rm -f ${TARGET}/etc/securetty
+rm -f ${TARGET}/etc/services
+rm -rf ${TARGET}/etc/init.d
+
+rm -rf ${TARGET}/home
+rm -rf ${TARGET}/media
+rm -rf ${TARGET}/opt
+rm -rf ${TARGET}/root
+
+rm -f ${TARGET}/sbin/udhcpc
+rm -f ${TARGET}/sbin/zcip
+
+rm -f ${TARGET}/var/lib/misc
+rm -f ${TARGET}/var/lib/pcmcia
+rm -f ${TARGET}/var/pcmcia
+
+mkdir -p ${TARGET}/lib/modules
+
diff --git a/packages/base/any/initrds/buildroot/builds/rootperms b/packages/base/any/initrds/buildroot/builds/rootperms
new file mode 100644
index 00000000..89e80c80
--- /dev/null
+++ b/packages/base/any/initrds/buildroot/builds/rootperms
@@ -0,0 +1,13 @@
+# See package/makedevs/README for details
+#
+# This device table is used to assign proper ownership and permissions
+# on various files. It doesn't create any device file, as it is used
+# in both static device configurations (where /dev/ is static) and in
+# dynamic configurations (where devtmpfs, mdev or udev are used).
+#
+#
+/dev d 755 0 0 - - - - -
+/tmp d 1777 0 0 - - - - -
+/etc d 755 0 0 - - - - -
+/etc/shadow f 600 0 0 - - - - -
+/etc/passwd f 644 0 0 - - - - -
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/.gitignore b/packages/base/any/kernels/3.2.65-1+deb7u2/.gitignore
new file mode 100644
index 00000000..88a4b311
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/.gitignore
@@ -0,0 +1,4 @@
+linux-3.2.65-1+deb7u2
+linux-3.2.65-1+deb7u2-mbuild
+linux-3.2.65-1+deb7u2-dtbs
+
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/configs/powerpc-e500v-all/.gitignore b/packages/base/any/kernels/3.2.65-1+deb7u2/configs/powerpc-e500v-all/.gitignore
new file mode 100644
index 00000000..921a8fc4
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/configs/powerpc-e500v-all/.gitignore
@@ -0,0 +1 @@
+kernel-3.2-deb7-powerpc-e500-all*
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/configs/powerpc-e500v-all/Makefile b/packages/base/any/kernels/3.2.65-1+deb7u2/configs/powerpc-e500v-all/Makefile
new file mode 100644
index 00000000..9d66ae1e
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/configs/powerpc-e500v-all/Makefile
@@ -0,0 +1,44 @@
+############################################################
+#
+#
+# Copyright 2015 Big Switch Networks, Inc.
+#
+# Licensed under the Eclipse Public License, Version 1.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+# either express or implied. See the License for the specific
+# language governing permissions and limitations under the
+# License.
+#
+#
+############################################################
+#
+# Default 3.2.65-1+deb7u2 configuration for PowerPC e500v platforms.
+#
+############################################################
+THIS_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
+include $(ONL)/make/config.mk
+
+ifndef K_TARGET_DIR
+K_TARGET_DIR := $(THIS_DIR)
+endif
+
+include ../../kconfig.mk
+K_CONFIG := powerpc-e500v-all.config
+K_BUILD_TARGET := uImage
+K_COPY_SRC := vmlinux.bin.gz
+ifndef K_COPY_DST
+K_COPY_DST := kernel-3.2-deb7-powerpc-e500-all.bin.gz
+endif
+
+export ARCH=powerpc
+DTS_LIST := powerpc-quanta-lb9-r0 powerpc-quanta-ly2-r0 powerpc-accton-as4600-54t-r0 powerpc-accton-as5610-52x-r0 powerpc-dni-7448-r0 powerpc-dell-s4810-p2020-r0
+
+include $(ONL)/make/kbuild.mk
+
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/configs/powerpc-e500v-all/powerpc-e500v-all.config b/packages/base/any/kernels/3.2.65-1+deb7u2/configs/powerpc-e500v-all/powerpc-e500v-all.config
new file mode 100644
index 00000000..5ca6ae71
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/configs/powerpc-e500v-all/powerpc-e500v-all.config
@@ -0,0 +1,2349 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# Linux/powerpc 3.2.65 Kernel Configuration
+#
+# CONFIG_PPC64 is not set
+
+#
+# Processor support
+#
+# CONFIG_PPC_BOOK3S_32 is not set
+CONFIG_PPC_85xx=y
+# CONFIG_PPC_8xx is not set
+# CONFIG_40x is not set
+# CONFIG_44x is not set
+# CONFIG_E200 is not set
+CONFIG_E500=y
+# CONFIG_PPC_E500MC is not set
+CONFIG_FSL_EMB_PERFMON=y
+CONFIG_FSL_EMB_PERF_EVENT=y
+CONFIG_FSL_EMB_PERF_EVENT_E500=y
+CONFIG_BOOKE=y
+CONFIG_FSL_BOOKE=y
+CONFIG_PPC_FSL_BOOK3E=y
+# CONFIG_PHYS_64BIT is not set
+CONFIG_SPE=y
+CONFIG_PPC_MMU_NOHASH=y
+CONFIG_PPC_BOOK3E_MMU=y
+# CONFIG_PPC_MM_SLICES is not set
+CONFIG_SMP=y
+CONFIG_NR_CPUS=8
+CONFIG_PPC32=y
+CONFIG_32BIT=y
+CONFIG_WORD_SIZE=32
+# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set
+# CONFIG_ARCH_DMA_ADDR_T_64BIT is not set
+CONFIG_MMU=y
+CONFIG_GENERIC_CMOS_UPDATE=y
+CONFIG_GENERIC_TIME_VSYSCALL=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
+# CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK is not set
+CONFIG_NR_IRQS=512
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_ARCH_HAS_ILOG2_U32=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_GPIO=y
+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
+CONFIG_PPC=y
+CONFIG_EARLY_PRINTK=y
+CONFIG_GENERIC_NVRAM=y
+CONFIG_SCHED_OMIT_FRAME_POINTER=y
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+CONFIG_PPC_OF=y
+CONFIG_PPC_UDBG_16550=y
+CONFIG_GENERIC_TBSYNC=y
+CONFIG_AUDIT_ARCH=y
+CONFIG_GENERIC_BUG=y
+# CONFIG_EPAPR_BOOT is not set
+CONFIG_DEFAULT_UIMAGE=y
+CONFIG_ARCH_HIBERNATION_POSSIBLE=y
+# CONFIG_PPC_DCR_NATIVE is not set
+# CONFIG_PPC_DCR_MMIO is not set
+CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
+CONFIG_PPC_ADV_DEBUG_REGS=y
+CONFIG_PPC_ADV_DEBUG_IACS=2
+CONFIG_PPC_ADV_DEBUG_DACS=2
+CONFIG_PPC_ADV_DEBUG_DVCS=0
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+CONFIG_HAVE_IRQ_WORK=y
+CONFIG_IRQ_WORK=y
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_CROSS_COMPILE="powerpc-linux-gnu-"
+CONFIG_LOCALVERSION="-1+deb7u2-OpenNetworkLinux"
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_DEFAULT_HOSTNAME="(none)"
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_POSIX_MQUEUE_SYSCTL=y
+CONFIG_BSD_PROCESS_ACCT=y
+# CONFIG_BSD_PROCESS_ACCT_V3 is not set
+# CONFIG_FHANDLE is not set
+# CONFIG_TASKSTATS is not set
+CONFIG_AUDIT=y
+# CONFIG_AUDITSYSCALL is not set
+CONFIG_HAVE_GENERIC_HARDIRQS=y
+
+#
+# IRQ subsystem
+#
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_HAVE_SPARSE_IRQ=y
+CONFIG_GENERIC_IRQ_SHOW=y
+CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
+CONFIG_SPARSE_IRQ=y
+
+#
+# RCU Subsystem
+#
+CONFIG_TREE_RCU=y
+# CONFIG_PREEMPT_RCU is not set
+# CONFIG_RCU_TRACE is not set
+CONFIG_RCU_FANOUT=32
+# CONFIG_RCU_FANOUT_EXACT is not set
+# CONFIG_RCU_FAST_NO_HZ is not set
+# CONFIG_TREE_RCU_TRACE is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=17
+# CONFIG_CGROUPS is not set
+# CONFIG_NAMESPACES is not set
+# CONFIG_SCHED_AUTOGROUP is not set
+# CONFIG_SYSFS_DEPRECATED is not set
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_RD_GZIP=y
+# CONFIG_RD_BZIP2 is not set
+# CONFIG_RD_LZMA is not set
+# CONFIG_RD_XZ is not set
+# CONFIG_RD_LZO is not set
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_ANON_INODES=y
+CONFIG_EXPERT=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+CONFIG_KALLSYMS_ALL=y
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_AIO=y
+CONFIG_EMBEDDED=y
+CONFIG_HAVE_PERF_EVENTS=y
+
+#
+# Kernel Performance Events And Counters
+#
+CONFIG_PERF_EVENTS=y
+# CONFIG_PERF_COUNTERS is not set
+# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_PCI_QUIRKS=y
+CONFIG_SLUB_DEBUG=y
+CONFIG_COMPAT_BRK=y
+# CONFIG_SLAB is not set
+CONFIG_SLUB=y
+# CONFIG_SLOB is not set
+# CONFIG_PROFILING is not set
+CONFIG_HAVE_OPROFILE=y
+# CONFIG_KPROBES is not set
+# CONFIG_JUMP_LABEL is not set
+CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
+CONFIG_HAVE_IOREMAP_PROT=y
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_ARCH_TRACEHOOK=y
+CONFIG_HAVE_DMA_ATTRS=y
+CONFIG_USE_GENERIC_SMP_HELPERS=y
+CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
+CONFIG_HAVE_CLK=y
+CONFIG_HAVE_DMA_API_DEBUG=y
+CONFIG_HAVE_ARCH_JUMP_LABEL=y
+CONFIG_HAVE_RCU_TABLE_FREE=y
+CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
+
+#
+# GCOV-based kernel profiling
+#
+# CONFIG_GCOV_KERNEL is not set
+# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+# CONFIG_MODULE_FORCE_LOAD is not set
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_STOP_MACHINE=y
+CONFIG_BLOCK=y
+CONFIG_LBDAF=y
+# CONFIG_BLK_DEV_BSG is not set
+# CONFIG_BLK_DEV_BSGLIB is not set
+# CONFIG_BLK_DEV_INTEGRITY is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+# CONFIG_DEFAULT_DEADLINE is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+# CONFIG_INLINE_SPIN_TRYLOCK is not set
+# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
+# CONFIG_INLINE_SPIN_LOCK is not set
+# CONFIG_INLINE_SPIN_LOCK_BH is not set
+# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
+# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
+CONFIG_INLINE_SPIN_UNLOCK=y
+# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
+CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
+# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
+# CONFIG_INLINE_READ_TRYLOCK is not set
+# CONFIG_INLINE_READ_LOCK is not set
+# CONFIG_INLINE_READ_LOCK_BH is not set
+# CONFIG_INLINE_READ_LOCK_IRQ is not set
+# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
+CONFIG_INLINE_READ_UNLOCK=y
+# CONFIG_INLINE_READ_UNLOCK_BH is not set
+CONFIG_INLINE_READ_UNLOCK_IRQ=y
+# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
+# CONFIG_INLINE_WRITE_TRYLOCK is not set
+# CONFIG_INLINE_WRITE_LOCK is not set
+# CONFIG_INLINE_WRITE_LOCK_BH is not set
+# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
+# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
+CONFIG_INLINE_WRITE_UNLOCK=y
+# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
+CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
+# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
+CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
+CONFIG_MUTEX_SPIN_ON_OWNER=y
+# CONFIG_FREEZER is not set
+CONFIG_PPC_MSI_BITMAP=y
+# CONFIG_PPC_XICS is not set
+# CONFIG_PPC_ICP_NATIVE is not set
+# CONFIG_PPC_ICP_HV is not set
+# CONFIG_PPC_ICS_RTAS is not set
+
+#
+# Platform support
+#
+# CONFIG_PPC_CELL is not set
+# CONFIG_PPC_CELL_NATIVE is not set
+# CONFIG_PQ2ADS is not set
+CONFIG_FSL_SOC_BOOKE=y
+# CONFIG_MPC8540_ADS is not set
+# CONFIG_MPC8560_ADS is not set
+# CONFIG_MPC85xx_CDS is not set
+# CONFIG_MPC85xx_MDS is not set
+# CONFIG_MPC8536_DS is not set
+# CONFIG_MPC85xx_DS is not set
+CONFIG_MPC85xx_RDB=y
+# CONFIG_P1010_RDB is not set
+# CONFIG_P1022_DS is not set
+# CONFIG_P1023_RDS is not set
+# CONFIG_SOCRATES is not set
+# CONFIG_KSI8560 is not set
+# CONFIG_XES_MPC85xx is not set
+# CONFIG_STX_GP3 is not set
+# CONFIG_TQM8540 is not set
+# CONFIG_TQM8541 is not set
+# CONFIG_TQM8548 is not set
+# CONFIG_TQM8555 is not set
+# CONFIG_TQM8560 is not set
+# CONFIG_SBC8548 is not set
+# CONFIG_SBC8560 is not set
+# CONFIG_P2041_RDB is not set
+# CONFIG_P3041_DS is not set
+# CONFIG_P3060_QDS is not set
+# CONFIG_P4080_DS is not set
+# CONFIG_ACCTON_AS4600_54T is not set
+# CONFIG_ACCTON_AS5610_52X is not set
+# CONFIG_ACCTON_AS6701_32X is not set
+# CONFIG_ACCTON_5652 is not set
+# CONFIG_BCM98548XMC is not set
+# CONFIG_CEL_P2020 is not set
+# CONFIG_CEL_REDSTONE is not set
+# CONFIG_CEL_KENNISIS is not set
+# CONFIG_CEL_SMALLSTONE is not set
+# CONFIG_CUMULUS_P2020 is not set
+# CONFIG_DNI_6448 is not set
+CONFIG_DNI_7448=y
+# CONFIG_DNI_C7448N is not set
+# CONFIG_QUANTA_LB8 is not set
+CONFIG_QUANTA_LB9=y
+# CONFIG_QUANTA_LY2_LY2R is not set
+# CONFIG_QUANTA_LY2 is not set
+# CONFIG_QUANTA_LY2R is not set
+# CONFIG_QUANTA_LY6_P2020 is not set
+# CONFIG_P5020_DS is not set
+# CONFIG_PPC_WSP is not set
+# CONFIG_KVM_GUEST is not set
+CONFIG_PPC_SMP_MUXED_IPI=y
+# CONFIG_IPIC is not set
+CONFIG_MPIC=y
+# CONFIG_PPC_EPAPR_HV_PIC is not set
+# CONFIG_MPIC_WEIRD is not set
+CONFIG_PPC_I8259=y
+# CONFIG_PPC_RTAS is not set
+# CONFIG_MMIO_NVRAM is not set
+# CONFIG_MPIC_U3_HT_IRQS is not set
+# CONFIG_PPC_MPC106 is not set
+# CONFIG_PPC_970_NAP is not set
+# CONFIG_PPC_P7_NAP is not set
+
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ is not set
+# CONFIG_QUICC_ENGINE is not set
+CONFIG_CPM2=y
+CONFIG_FSL_ULI1575=y
+CONFIG_CPM=y
+# CONFIG_SIMPLE_GPIO is not set
+
+#
+# Kernel options
+#
+CONFIG_HIGHMEM=y
+CONFIG_TICK_ONESHOT=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_300 is not set
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=250
+CONFIG_SCHED_HRTICK=y
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PREEMPT is not set
+CONFIG_BINFMT_ELF=y
+CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
+# CONFIG_HAVE_AOUT is not set
+CONFIG_BINFMT_MISC=m
+CONFIG_MATH_EMULATION=y
+CONFIG_IOMMU_HELPER=y
+CONFIG_SWIOTLB=y
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+CONFIG_ARCH_HAS_WALK_MEMORY=y
+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
+CONFIG_KEXEC=y
+CONFIG_CRASH_DUMP=y
+CONFIG_IRQ_ALL_CPUS=y
+CONFIG_MAX_ACTIVE_REGIONS=32
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_POPULATES_NODE_MAP=y
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_HAVE_MEMBLOCK=y
+CONFIG_PAGEFLAGS_EXTENDED=y
+CONFIG_SPLIT_PTLOCK_CPUS=4
+# CONFIG_COMPACTION is not set
+CONFIG_MIGRATION=y
+# CONFIG_PHYS_ADDR_T_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=1
+CONFIG_BOUNCE=y
+CONFIG_VIRT_TO_BUS=y
+# CONFIG_KSM is not set
+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
+# CONFIG_CLEANCACHE is not set
+CONFIG_PPC_4K_PAGES=y
+CONFIG_FORCE_MAX_ZONEORDER=11
+# CONFIG_CMDLINE_BOOL is not set
+CONFIG_EXTRA_TARGETS=""
+# CONFIG_HIBERNATION is not set
+# CONFIG_PM_RUNTIME is not set
+CONFIG_SECCOMP=y
+CONFIG_ISA_DMA_API=y
+
+#
+# Bus options
+#
+CONFIG_ZONE_DMA=y
+# CONFIG_NEED_DMA_MAP_STATE is not set
+CONFIG_NEED_SG_DMA_LENGTH=y
+CONFIG_GENERIC_ISA_DMA=y
+CONFIG_PPC_INDIRECT_PCI=y
+CONFIG_FSL_SOC=y
+CONFIG_FSL_PCI=y
+CONFIG_FSL_LBC=y
+# CONFIG_HAS_FSL_PAMU is not set
+# CONFIG_HAS_FSL_QBMAN is not set
+CONFIG_PPC_PCI_CHOICE=y
+CONFIG_PCI=y
+CONFIG_PCI_DOMAINS=y
+CONFIG_PCI_SYSCALL=y
+CONFIG_PCIEPORTBUS=y
+CONFIG_PCIEAER=y
+# CONFIG_PCIE_ECRC is not set
+# CONFIG_PCIEAER_INJECT is not set
+CONFIG_PCIEASPM=y
+# CONFIG_PCIEASPM_DEBUG is not set
+CONFIG_ARCH_SUPPORTS_MSI=y
+CONFIG_PCI_MSI=y
+# CONFIG_PCI_DEBUG is not set
+# CONFIG_PCI_STUB is not set
+# CONFIG_PCI_IOV is not set
+# CONFIG_PCI_PRI is not set
+# CONFIG_PCI_PASID is not set
+# CONFIG_PCCARD is not set
+# CONFIG_HOTPLUG_PCI is not set
+# CONFIG_HAS_RAPIDIO is not set
+# CONFIG_RAPIDIO is not set
+
+#
+# Advanced setup
+#
+CONFIG_ADVANCED_OPTIONS=y
+# CONFIG_LOWMEM_SIZE_BOOL is not set
+CONFIG_LOWMEM_SIZE=0x30000000
+# CONFIG_LOWMEM_CAM_NUM_BOOL is not set
+CONFIG_LOWMEM_CAM_NUM=3
+CONFIG_RELOCATABLE=y
+# CONFIG_PAGE_OFFSET_BOOL is not set
+CONFIG_PAGE_OFFSET=0xc0000000
+# CONFIG_KERNEL_START_BOOL is not set
+CONFIG_KERNEL_START=0xc0000000
+# CONFIG_PHYSICAL_START_BOOL is not set
+CONFIG_PHYSICAL_START=0x00000000
+CONFIG_PHYSICAL_ALIGN=0x04000000
+# CONFIG_TASK_SIZE_BOOL is not set
+CONFIG_TASK_SIZE=0xc0000000
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_XFRM_STATISTICS is not set
+CONFIG_NET_KEY=y
+# CONFIG_NET_KEY_MIGRATE is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_ADVANCED_ROUTER=y
+# CONFIG_IP_FIB_TRIE_STATS is not set
+CONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_IP_ROUTE_MULTIPATH=y
+CONFIG_IP_ROUTE_VERBOSE=y
+# CONFIG_IP_PNP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE_DEMUX is not set
+# CONFIG_IP_MROUTE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_LRO is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+CONFIG_IPV6=y
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_IPV6_OPTIMISTIC_DAD is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET6_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET6_XFRM_MODE_BEET is not set
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+# CONFIG_IPV6_SIT is not set
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_IPV6_MROUTE is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+CONFIG_NETFILTER_ADVANCED=y
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK_QUEUE is not set
+# CONFIG_NETFILTER_NETLINK_LOG is not set
+# CONFIG_NF_CONNTRACK is not set
+CONFIG_NETFILTER_XTABLES=y
+
+#
+# Xtables combined modules
+#
+# CONFIG_NETFILTER_XT_MARK is not set
+
+#
+# Xtables targets
+#
+# CONFIG_NETFILTER_XT_TARGET_AUDIT is not set
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set
+# CONFIG_NETFILTER_XT_TARGET_LED is not set
+# CONFIG_NETFILTER_XT_TARGET_MARK is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set
+# CONFIG_NETFILTER_XT_TARGET_TEE is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_TARGET_ERSPAN is not set
+# CONFIG_NETFILTER_XT_TARGET_SPAN is not set
+# CONFIG_NETFILTER_XT_TARGET_POLICE is not set
+# CONFIG_NETFILTER_XT_TARGET_TRICOLORPOLICE is not set
+# CONFIG_NETFILTER_XT_TARGET_SETCLASS is not set
+# CONFIG_NETFILTER_XT_TARGET_SETQOS is not set
+
+#
+# Xtables matches
+#
+# CONFIG_NETFILTER_XT_MATCH_ADDRTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_CPU is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+CONFIG_NETFILTER_XT_MATCH_HL=y
+# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set
+# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set
+# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set
+# CONFIG_NETFILTER_XT_MATCH_MAC is not set
+# CONFIG_NETFILTER_XT_MATCH_MARK is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_OWNER is not set
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_RECENT is not set
+CONFIG_NETFILTER_XT_MATCH_SCTP=y
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_TIME is not set
+# CONFIG_NETFILTER_XT_MATCH_U32 is not set
+# CONFIG_IP_VS is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_NF_DEFRAG_IPV4 is not set
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=y
+CONFIG_IP_NF_MATCH_AH=y
+CONFIG_IP_NF_MATCH_ECN=y
+CONFIG_IP_NF_MATCH_TTL=y
+CONFIG_IP_NF_FILTER=y
+CONFIG_IP_NF_TARGET_REJECT=y
+# CONFIG_IP_NF_TARGET_LOG is not set
+# CONFIG_IP_NF_TARGET_ULOG is not set
+# CONFIG_IP_NF_MANGLE is not set
+# CONFIG_IP_NF_RAW is not set
+CONFIG_IP_NF_ARPTABLES=y
+CONFIG_IP_NF_ARPFILTER=y
+# CONFIG_IP_NF_ARP_MANGLE is not set
+
+#
+# IPv6: Netfilter Configuration
+#
+# CONFIG_NF_DEFRAG_IPV6 is not set
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=y
+CONFIG_IP6_NF_MATCH_AH=y
+CONFIG_IP6_NF_MATCH_EUI64=y
+CONFIG_IP6_NF_MATCH_FRAG=y
+CONFIG_IP6_NF_MATCH_OPTS=y
+CONFIG_IP6_NF_MATCH_HL=y
+CONFIG_IP6_NF_MATCH_IPV6HEADER=y
+CONFIG_IP6_NF_MATCH_MH=y
+CONFIG_IP6_NF_MATCH_RT=y
+# CONFIG_IP6_NF_TARGET_LOG is not set
+CONFIG_IP6_NF_FILTER=y
+CONFIG_IP6_NF_TARGET_REJECT=y
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW is not set
+# CONFIG_IP_DCCP is not set
+CONFIG_IP_SCTP=y
+# CONFIG_SCTP_DBG_MSG is not set
+# CONFIG_SCTP_DBG_OBJCNT is not set
+# CONFIG_SCTP_HMAC_NONE is not set
+# CONFIG_SCTP_HMAC_SHA1 is not set
+CONFIG_SCTP_HMAC_MD5=y
+# CONFIG_RDS is not set
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_L2TP is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_NET_DSA is not set
+CONFIG_VLAN_8021Q=y
+# CONFIG_VLAN_8021Q_GVRP is not set
+# CONFIG_VLAN_8021Q_MVRP is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_PHONET is not set
+# CONFIG_IEEE802154 is not set
+# CONFIG_NET_SCHED is not set
+# CONFIG_DCB is not set
+# CONFIG_BATMAN_ADV is not set
+CONFIG_RPS=y
+CONFIG_RFS_ACCEL=y
+CONFIG_XPS=y
+CONFIG_BQL=y
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_CAN is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_AF_RXRPC is not set
+CONFIG_FIB_RULES=y
+# CONFIG_WIRELESS is not set
+# CONFIG_WIMAX is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
+# CONFIG_CAIF is not set
+# CONFIG_CEPH_LIB is not set
+# CONFIG_NFC is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+CONFIG_FIRMWARE_IN_KERNEL=y
+CONFIG_EXTRA_FIRMWARE=""
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+# CONFIG_GENERIC_CPU_DEVICES is not set
+CONFIG_CONNECTOR=y
+CONFIG_PROC_EVENTS=y
+CONFIG_MTD=y
+# CONFIG_MTD_TESTS is not set
+# CONFIG_MTD_REDBOOT_PARTS is not set
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_OF_PARTS=y
+# CONFIG_MTD_AR7_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLKDEVS=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+# CONFIG_SM_FTL is not set
+# CONFIG_MTD_OOPS is not set
+# CONFIG_MTD_SWAP is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+CONFIG_MTD_JEDECPROBE=y
+CONFIG_MTD_GEN_PROBE=y
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+# CONFIG_MTD_CFI_NOSWAP is not set
+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
+CONFIG_MTD_CFI_OF_BYTE_SWAP=y
+# CONFIG_MTD_CFI_GEOMETRY is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_OTP is not set
+CONFIG_MTD_CFI_INTELEXT=y
+CONFIG_MTD_CFI_AMDSTD=y
+CONFIG_MTD_CFI_STAA=y
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+CONFIG_MTD_PHYSMAP=y
+# CONFIG_MTD_PHYSMAP_COMPAT is not set
+CONFIG_MTD_PHYSMAP_OF=y
+# CONFIG_MTD_INTEL_VR_NOR is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_DATAFLASH is not set
+CONFIG_MTD_M25P80=y
+CONFIG_M25PXX_USE_FAST_READ=y
+# CONFIG_MTD_SST25L is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+# CONFIG_MTD_DOCG3 is not set
+CONFIG_MTD_NAND_ECC=y
+# CONFIG_MTD_NAND_ECC_SMC is not set
+CONFIG_MTD_NAND=y
+# CONFIG_MTD_NAND_VERIFY_WRITE is not set
+# CONFIG_MTD_NAND_ECC_BCH is not set
+# CONFIG_MTD_SM_COMMON is not set
+# CONFIG_MTD_NAND_MUSEUM_IDS is not set
+# CONFIG_MTD_NAND_DENALI is not set
+CONFIG_MTD_NAND_IDS=y
+# CONFIG_MTD_NAND_RICOH is not set
+# CONFIG_MTD_NAND_DISKONCHIP is not set
+# CONFIG_MTD_NAND_CAFE is not set
+# CONFIG_MTD_NAND_NANDSIM is not set
+CONFIG_MTD_NAND_PLATFORM=y
+# CONFIG_MTD_ALAUDA is not set
+CONFIG_MTD_NAND_FSL_ELBC=y
+CONFIG_MTD_NAND_FSL_UPM=y
+# CONFIG_MTD_ONENAND is not set
+
+#
+# LPDDR flash memory drivers
+#
+# CONFIG_MTD_LPDDR is not set
+CONFIG_MTD_UBI=y
+CONFIG_MTD_UBI_WL_THRESHOLD=4096
+CONFIG_MTD_UBI_BEB_RESERVE=1
+# CONFIG_MTD_UBI_GLUEBI is not set
+# CONFIG_MTD_UBI_DEBUG is not set
+CONFIG_DTC=y
+CONFIG_OF=y
+
+#
+# Device Tree and Open Firmware support
+#
+CONFIG_PROC_DEVICETREE=y
+CONFIG_OF_FLATTREE=y
+CONFIG_OF_EARLY_FLATTREE=y
+CONFIG_OF_DYNAMIC=y
+CONFIG_OF_ADDRESS=y
+CONFIG_OF_IRQ=y
+CONFIG_OF_DEVICE=y
+CONFIG_OF_GPIO=y
+CONFIG_OF_I2C=y
+CONFIG_OF_NET=y
+CONFIG_OF_SPI=y
+CONFIG_OF_MDIO=y
+CONFIG_OF_PCI=y
+CONFIG_OF_PCI_IRQ=y
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+# CONFIG_BLK_DEV_DRBD is not set
+CONFIG_BLK_DEV_NBD=y
+# CONFIG_BLK_DEV_SX8 is not set
+# CONFIG_BLK_DEV_UB is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=131072
+# CONFIG_BLK_DEV_XIP is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_BLK_DEV_HD is not set
+# CONFIG_BLK_DEV_RBD is not set
+CONFIG_MISC_DEVICES=y
+# CONFIG_AD525X_DPOT is not set
+# CONFIG_ATMEL_PWM is not set
+# CONFIG_PHANTOM is not set
+# CONFIG_INTEL_MID_PTI is not set
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
+# CONFIG_ICS932S401 is not set
+# CONFIG_ENCLOSURE_SERVICES is not set
+# CONFIG_HP_ILO is not set
+# CONFIG_APDS9802ALS is not set
+# CONFIG_ISL29003 is not set
+# CONFIG_ISL29020 is not set
+# CONFIG_SENSORS_TSL2550 is not set
+# CONFIG_SENSORS_BH1780 is not set
+# CONFIG_SENSORS_BH1770 is not set
+# CONFIG_SENSORS_APDS990X is not set
+# CONFIG_HMC6352 is not set
+# CONFIG_DS1682 is not set
+# CONFIG_TI_DAC7512 is not set
+# CONFIG_BMP085 is not set
+# CONFIG_PCH_PHUB is not set
+# CONFIG_USB_SWITCH_FSA9480 is not set
+# CONFIG_EARLY_DMA_ALLOC is not set
+CONFIG_RETIMER_CLASS=y
+# CONFIG_DS100DF410 is not set
+# CONFIG_C2PORT is not set
+
+#
+# EEPROM support
+#
+CONFIG_EEPROM_CLASS=y
+CONFIG_EEPROM_AT24=y
+# CONFIG_EEPROM_AT25 is not set
+# CONFIG_EEPROM_LEGACY is not set
+# CONFIG_EEPROM_MAX6875 is not set
+# CONFIG_EEPROM_93CX6 is not set
+# CONFIG_EEPROM_93XX46 is not set
+# CONFIG_EEPROM_SFF_8436 is not set
+# CONFIG_CB710_CORE is not set
+# CONFIG_IWMC3200TOP is not set
+
+#
+# Texas Instruments shared transport line discipline
+#
+# CONFIG_TI_ST is not set
+
+#
+# Altera FPGA firmware download module
+#
+# CONFIG_ALTERA_STAPL is not set
+CONFIG_HAVE_IDE=y
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+CONFIG_SCSI_MOD=y
+# CONFIG_RAID_ATTRS is not set
+CONFIG_SCSI=y
+CONFIG_SCSI_DMA=y
+# CONFIG_SCSI_TGT is not set
+# CONFIG_SCSI_NETLINK is not set
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+CONFIG_BLK_DEV_SR=y
+# CONFIG_BLK_DEV_SR_VENDOR is not set
+CONFIG_CHR_DEV_SG=y
+# CONFIG_CHR_DEV_SCH is not set
+CONFIG_SCSI_MULTI_LUN=y
+# CONFIG_SCSI_CONSTANTS is not set
+CONFIG_SCSI_LOGGING=y
+# CONFIG_SCSI_SCAN_ASYNC is not set
+CONFIG_SCSI_WAIT_SCAN=m
+
+#
+# SCSI Transports
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+# CONFIG_SCSI_SRP_ATTRS is not set
+CONFIG_SCSI_LOWLEVEL=y
+# CONFIG_ISCSI_TCP is not set
+# CONFIG_ISCSI_BOOT_SYSFS is not set
+# CONFIG_SCSI_CXGB3_ISCSI is not set
+# CONFIG_SCSI_CXGB4_ISCSI is not set
+# CONFIG_SCSI_BNX2_ISCSI is not set
+# CONFIG_SCSI_BNX2X_FCOE is not set
+# CONFIG_BE2ISCSI is not set
+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_SCSI_HPSA is not set
+# CONFIG_SCSI_3W_9XXX is not set
+# CONFIG_SCSI_3W_SAS is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AACRAID is not set
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+# CONFIG_SCSI_AIC79XX is not set
+# CONFIG_SCSI_AIC94XX is not set
+# CONFIG_SCSI_MVSAS is not set
+# CONFIG_SCSI_MVUMI is not set
+# CONFIG_SCSI_DPT_I2O is not set
+# CONFIG_SCSI_ADVANSYS is not set
+# CONFIG_SCSI_ARCMSR is not set
+# CONFIG_MEGARAID_NEWGEN is not set
+# CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
+# CONFIG_SCSI_MPT2SAS is not set
+# CONFIG_SCSI_HPTIOP is not set
+# CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_LIBFC is not set
+# CONFIG_LIBFCOE is not set
+# CONFIG_FCOE is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_EATA is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_GDTH is not set
+# CONFIG_SCSI_IPS is not set
+# CONFIG_SCSI_INITIO is not set
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_STEX is not set
+# CONFIG_SCSI_SYM53C8XX_2 is not set
+# CONFIG_SCSI_IPR is not set
+# CONFIG_SCSI_QLOGIC_1280 is not set
+# CONFIG_SCSI_QLA_FC is not set
+# CONFIG_SCSI_QLA_ISCSI is not set
+# CONFIG_SCSI_LPFC is not set
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_DC390T is not set
+# CONFIG_SCSI_NSP32 is not set
+# CONFIG_SCSI_DEBUG is not set
+# CONFIG_SCSI_PMCRAID is not set
+# CONFIG_SCSI_PM8001 is not set
+# CONFIG_SCSI_SRP is not set
+# CONFIG_SCSI_BFA_FC is not set
+# CONFIG_SCSI_DH is not set
+# CONFIG_SCSI_OSD_INITIATOR is not set
+CONFIG_ATA=y
+# CONFIG_ATA_NONSTANDARD is not set
+CONFIG_ATA_VERBOSE_ERROR=y
+# CONFIG_SATA_PMP is not set
+
+#
+# Controllers with non-SFF native interface
+#
+# CONFIG_SATA_AHCI is not set
+# CONFIG_SATA_AHCI_PLATFORM is not set
+# CONFIG_SATA_FSL is not set
+# CONFIG_SATA_INIC162X is not set
+# CONFIG_SATA_ACARD_AHCI is not set
+# CONFIG_SATA_SIL24 is not set
+CONFIG_ATA_SFF=y
+
+#
+# SFF controllers with custom DMA interface
+#
+# CONFIG_PDC_ADMA is not set
+# CONFIG_SATA_QSTOR is not set
+# CONFIG_SATA_SX4 is not set
+# CONFIG_ATA_BMDMA is not set
+
+#
+# PIO-only SFF controllers
+#
+# CONFIG_PATA_CMD640_PCI is not set
+# CONFIG_PATA_MPIIX is not set
+# CONFIG_PATA_NS87410 is not set
+# CONFIG_PATA_OPTI is not set
+CONFIG_PATA_PLATFORM=y
+CONFIG_PATA_OF_PLATFORM=y
+# CONFIG_PATA_RZ1000 is not set
+CONFIG_PATA_QUANTA_LB=y
+
+#
+# Generic fallback / legacy drivers
+#
+# CONFIG_PATA_LEGACY is not set
+# CONFIG_MD is not set
+# CONFIG_TARGET_CORE is not set
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_FIREWIRE is not set
+# CONFIG_FIREWIRE_NOSY is not set
+# CONFIG_I2O is not set
+# CONFIG_MACINTOSH_DRIVERS is not set
+CONFIG_NETDEVICES=y
+CONFIG_NET_CORE=y
+# CONFIG_BONDING is not set
+# CONFIG_DUMMY is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_NET_FC is not set
+CONFIG_MII=y
+# CONFIG_MACVLAN is not set
+# CONFIG_VXLAN is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+CONFIG_TUN=y
+CONFIG_VETH=y
+# CONFIG_ARCNET is not set
+
+#
+# CAIF transport drivers
+#
+CONFIG_ETHERNET=y
+# CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_NET_VENDOR_ADAPTEC is not set
+# CONFIG_NET_VENDOR_ALTEON is not set
+# CONFIG_NET_VENDOR_AMD is not set
+# CONFIG_NET_VENDOR_ATHEROS is not set
+# CONFIG_NET_VENDOR_BROADCOM is not set
+# CONFIG_NET_VENDOR_BROCADE is not set
+# CONFIG_NET_VENDOR_CHELSIO is not set
+# CONFIG_NET_VENDOR_CISCO is not set
+# CONFIG_DNET is not set
+# CONFIG_NET_VENDOR_DEC is not set
+# CONFIG_NET_VENDOR_DLINK is not set
+# CONFIG_NET_VENDOR_EMULEX is not set
+# CONFIG_NET_VENDOR_EXAR is not set
+CONFIG_NET_VENDOR_FREESCALE=y
+# CONFIG_FS_ENET is not set
+CONFIG_FSL_PQ_MDIO=y
+CONFIG_GIANFAR=y
+# CONFIG_NET_VENDOR_HP is not set
+# CONFIG_NET_VENDOR_INTEL is not set
+# CONFIG_IP1000 is not set
+# CONFIG_JME is not set
+# CONFIG_NET_VENDOR_MARVELL is not set
+# CONFIG_NET_VENDOR_MELLANOX is not set
+# CONFIG_NET_VENDOR_MICREL is not set
+# CONFIG_NET_VENDOR_MICROCHIP is not set
+# CONFIG_NET_VENDOR_MYRI is not set
+# CONFIG_FEALNX is not set
+# CONFIG_NET_VENDOR_NATSEMI is not set
+# CONFIG_NET_VENDOR_NVIDIA is not set
+# CONFIG_NET_VENDOR_OKI is not set
+# CONFIG_ETHOC is not set
+# CONFIG_NET_PACKET_ENGINE is not set
+# CONFIG_NET_VENDOR_QLOGIC is not set
+# CONFIG_NET_VENDOR_REALTEK is not set
+# CONFIG_NET_VENDOR_RDC is not set
+# CONFIG_NET_VENDOR_SEEQ is not set
+# CONFIG_NET_VENDOR_SILAN is not set
+# CONFIG_NET_VENDOR_SIS is not set
+# CONFIG_SFC is not set
+# CONFIG_NET_VENDOR_SMSC is not set
+# CONFIG_NET_VENDOR_STMICRO is not set
+# CONFIG_NET_VENDOR_SUN is not set
+# CONFIG_NET_VENDOR_TEHUTI is not set
+# CONFIG_NET_VENDOR_TI is not set
+# CONFIG_NET_VENDOR_VIA is not set
+# CONFIG_NET_VENDOR_XILINX is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+CONFIG_PHYLIB=y
+
+#
+# MII PHY device drivers
+#
+# CONFIG_MARVELL_PHY is not set
+# CONFIG_DAVICOM_PHY is not set
+# CONFIG_QSEMI_PHY is not set
+# CONFIG_LXT_PHY is not set
+# CONFIG_CICADA_PHY is not set
+# CONFIG_VITESSE_PHY is not set
+# CONFIG_SMSC_PHY is not set
+CONFIG_BROADCOM_PHY=y
+# CONFIG_ICPLUS_PHY is not set
+# CONFIG_REALTEK_PHY is not set
+# CONFIG_NATIONAL_PHY is not set
+# CONFIG_STE10XP is not set
+# CONFIG_LSI_ET1011C_PHY is not set
+# CONFIG_MICREL_PHY is not set
+# CONFIG_FIXED_PHY is not set
+# CONFIG_MDIO_BITBANG is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_TR is not set
+
+#
+# USB Network Adapters
+#
+# CONFIG_USB_CATC is not set
+# CONFIG_USB_KAWETH is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_RTL8150 is not set
+# CONFIG_USB_USBNET is not set
+# CONFIG_USB_IPHETH is not set
+# CONFIG_WLAN is not set
+
+#
+# Enable WiMAX (Networking options) to see the WiMAX drivers
+#
+# CONFIG_WAN is not set
+# CONFIG_VMXNET3 is not set
+# CONFIG_DPAA_ETH_USE_NDO_SELECT_QUEUE is not set
+# CONFIG_ISDN is not set
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+# CONFIG_INPUT is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+# CONFIG_VT is not set
+CONFIG_UNIX98_PTYS=y
+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+# CONFIG_SERIAL_NONSTANDARD is not set
+# CONFIG_NOZOMI is not set
+# CONFIG_N_GSM is not set
+# CONFIG_TRACE_SINK is not set
+# CONFIG_PPC_EPAPR_HV_BYTECHAN is not set
+CONFIG_DEVKMEM=y
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_PCI=y
+CONFIG_SERIAL_8250_NR_UARTS=2
+CONFIG_SERIAL_8250_RUNTIME_UARTS=2
+CONFIG_SERIAL_8250_EXTENDED=y
+# CONFIG_SERIAL_8250_MANY_PORTS is not set
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+# CONFIG_SERIAL_8250_RSA is not set
+# CONFIG_SERIAL_8250_DW is not set
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_MAX3100 is not set
+# CONFIG_SERIAL_MAX3107 is not set
+# CONFIG_SERIAL_MFD_HSU is not set
+# CONFIG_SERIAL_UARTLITE is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_CPM is not set
+# CONFIG_SERIAL_JSM is not set
+# CONFIG_SERIAL_OF_PLATFORM is not set
+# CONFIG_SERIAL_TIMBERDALE is not set
+# CONFIG_SERIAL_ALTERA_JTAGUART is not set
+# CONFIG_SERIAL_ALTERA_UART is not set
+# CONFIG_SERIAL_IFX6X60 is not set
+# CONFIG_SERIAL_PCH_UART is not set
+# CONFIG_SERIAL_XILINX_PS_UART is not set
+# CONFIG_TTY_PRINTK is not set
+# CONFIG_HVC_UDBG is not set
+# CONFIG_IPMI_HANDLER is not set
+CONFIG_HW_RANDOM=y
+# CONFIG_HW_RANDOM_TIMERIOMEM is not set
+CONFIG_NVRAM=y
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_TCG_TPM is not set
+CONFIG_DEVPORT=y
+# CONFIG_RAMOOPS is not set
+CONFIG_I2C=y
+CONFIG_I2C_BOARDINFO=y
+CONFIG_I2C_COMPAT=y
+CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_MUX=y
+
+#
+# Multiplexer I2C Chip support
+#
+# CONFIG_I2C_MUX_ACCTON_AS5712_54x_CPLD is not set
+# CONFIG_I2C_MUX_ACCTON_AS6712_32x_CPLD is not set
+# CONFIG_I2C_MUX_GPIO is not set
+# CONFIG_I2C_MUX_PCA9541 is not set
+CONFIG_I2C_MUX_PCA954x=y
+# CONFIG_I2C_MUX_PCA954X_DESELECT_ON_EXIT is not set
+# CONFIG_I2C_MUX_DNI_6448 is not set
+# CONFIG_I2C_MUX_QUANTA is not set
+CONFIG_I2C_MUX_QUANTA_LY2=y
+CONFIG_I2C_HELPER_AUTO=y
+
+#
+# I2C Hardware Bus support
+#
+
+#
+# PC SMBus host controller drivers
+#
+# CONFIG_I2C_ALI1535 is not set
+# CONFIG_I2C_ALI1563 is not set
+# CONFIG_I2C_ALI15X3 is not set
+# CONFIG_I2C_AMD756 is not set
+# CONFIG_I2C_AMD8111 is not set
+# CONFIG_I2C_I801 is not set
+# CONFIG_I2C_ISCH is not set
+# CONFIG_I2C_PIIX4 is not set
+# CONFIG_I2C_NFORCE2 is not set
+# CONFIG_I2C_SIS5595 is not set
+# CONFIG_I2C_SIS630 is not set
+# CONFIG_I2C_SIS96X is not set
+# CONFIG_I2C_VIA is not set
+# CONFIG_I2C_VIAPRO is not set
+
+#
+# I2C system bus drivers (mostly embedded / system-on-chip)
+#
+CONFIG_I2C_CPM=y
+# CONFIG_I2C_DESIGNWARE_PLATFORM is not set
+# CONFIG_I2C_DESIGNWARE_PCI is not set
+# CONFIG_I2C_GPIO is not set
+# CONFIG_I2C_INTEL_MID is not set
+CONFIG_I2C_MPC=y
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PCA_PLATFORM is not set
+# CONFIG_I2C_PXA_PCI is not set
+# CONFIG_I2C_SIMTEC is not set
+# CONFIG_I2C_XILINX is not set
+# CONFIG_I2C_EG20T is not set
+
+#
+# External I2C/SMBus adapter drivers
+#
+# CONFIG_I2C_DIOLAN_U2C is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_TAOS_EVM is not set
+# CONFIG_I2C_TINY_USB is not set
+
+#
+# Other I2C/SMBus bus drivers
+#
+# CONFIG_I2C_STUB is not set
+# CONFIG_I2C_DEBUG_CORE is not set
+# CONFIG_I2C_DEBUG_ALGO is not set
+# CONFIG_I2C_DEBUG_BUS is not set
+CONFIG_SPI=y
+# CONFIG_SPI_DEBUG is not set
+CONFIG_SPI_MASTER=y
+
+#
+# SPI Master Controller Drivers
+#
+# CONFIG_SPI_ALTERA is not set
+# CONFIG_SPI_BITBANG is not set
+# CONFIG_SPI_GPIO is not set
+CONFIG_SPI_FSL_LIB=y
+CONFIG_SPI_FSL_SPI=y
+CONFIG_SPI_FSL_ESPI=y
+# CONFIG_SPI_OC_TINY is not set
+# CONFIG_SPI_PXA2XX_PCI is not set
+# CONFIG_SPI_TOPCLIFF_PCH is not set
+# CONFIG_SPI_XILINX is not set
+# CONFIG_SPI_DESIGNWARE is not set
+
+#
+# SPI Protocol Masters
+#
+# CONFIG_SPI_SPIDEV is not set
+# CONFIG_SPI_TLE62X0 is not set
+
+#
+# PPS support
+#
+# CONFIG_PPS is not set
+
+#
+# PPS generators support
+#
+
+#
+# PTP clock support
+#
+
+#
+# Enable Device Drivers -> PPS to see the PTP clock options.
+#
+CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
+CONFIG_ARCH_REQUIRE_GPIOLIB=y
+CONFIG_GPIOLIB=y
+# CONFIG_DEBUG_GPIO is not set
+CONFIG_GPIO_SYSFS=y
+
+#
+# Memory mapped GPIO drivers:
+#
+# CONFIG_GPIO_GENERIC_PLATFORM is not set
+# CONFIG_GPIO_IT8761E is not set
+CONFIG_GPIO_MPC8XXX=y
+# CONFIG_GPIO_XILINX is not set
+# CONFIG_GPIO_VX855 is not set
+
+#
+# I2C GPIO expanders:
+#
+# CONFIG_GPIO_MAX7300 is not set
+# CONFIG_GPIO_MAX732X is not set
+CONFIG_GPIO_PCA953X=y
+# CONFIG_GPIO_PCA953X_IRQ is not set
+# CONFIG_GPIO_PCF857X is not set
+# CONFIG_GPIO_SX150X is not set
+# CONFIG_GPIO_ADP5588 is not set
+
+#
+# PCI GPIO expanders:
+#
+# CONFIG_GPIO_BT8XX is not set
+# CONFIG_GPIO_ML_IOH is not set
+# CONFIG_GPIO_RDC321X is not set
+
+#
+# SPI GPIO expanders:
+#
+# CONFIG_GPIO_MAX7301 is not set
+# CONFIG_GPIO_MCP23S08 is not set
+# CONFIG_GPIO_MC33880 is not set
+# CONFIG_GPIO_74X164 is not set
+
+#
+# AC97 GPIO expanders:
+#
+
+#
+# MODULbus GPIO expanders:
+#
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
+
+#
+# Native drivers
+#
+# CONFIG_SENSORS_AD7314 is not set
+# CONFIG_SENSORS_AD7414 is not set
+# CONFIG_SENSORS_AD7418 is not set
+# CONFIG_SENSORS_ADCXX is not set
+# CONFIG_SENSORS_ADM1021 is not set
+# CONFIG_SENSORS_ADM1025 is not set
+# CONFIG_SENSORS_ADM1026 is not set
+# CONFIG_SENSORS_ADM1029 is not set
+# CONFIG_SENSORS_ADM1031 is not set
+# CONFIG_SENSORS_ADM9240 is not set
+# CONFIG_SENSORS_ADT7411 is not set
+# CONFIG_SENSORS_ADT7462 is not set
+CONFIG_SENSORS_ADT7470=y
+# CONFIG_SENSORS_ADT7475 is not set
+# CONFIG_SENSORS_ASC7621 is not set
+# CONFIG_SENSORS_ATXP1 is not set
+# CONFIG_SENSORS_CY8CXX is not set
+# CONFIG_SENSORS_CY8C3245R1 is not set
+# CONFIG_SENSORS_DS620 is not set
+# CONFIG_SENSORS_DS1621 is not set
+# CONFIG_SENSORS_I5K_AMB is not set
+# CONFIG_SENSORS_F75375S is not set
+# CONFIG_SENSORS_G760A is not set
+# CONFIG_SENSORS_GL518SM is not set
+# CONFIG_SENSORS_GL520SM is not set
+# CONFIG_SENSORS_GPIO_FAN is not set
+# CONFIG_SENSORS_JC42 is not set
+# CONFIG_SENSORS_LINEAGE is not set
+# CONFIG_SENSORS_LM63 is not set
+# CONFIG_SENSORS_LM70 is not set
+# CONFIG_SENSORS_LM73 is not set
+CONFIG_SENSORS_LM75=y
+# CONFIG_SENSORS_LM77 is not set
+# CONFIG_SENSORS_LM78 is not set
+# CONFIG_SENSORS_LM80 is not set
+# CONFIG_SENSORS_LM83 is not set
+# CONFIG_SENSORS_LM85 is not set
+# CONFIG_SENSORS_LM87 is not set
+# CONFIG_SENSORS_LM90 is not set
+# CONFIG_SENSORS_LM92 is not set
+# CONFIG_SENSORS_LM93 is not set
+# CONFIG_SENSORS_LTC4151 is not set
+CONFIG_SENSORS_LTC4215=y
+# CONFIG_SENSORS_LTC4245 is not set
+# CONFIG_SENSORS_LTC4261 is not set
+# CONFIG_SENSORS_LM95241 is not set
+# CONFIG_SENSORS_LM95245 is not set
+# CONFIG_SENSORS_MAX1111 is not set
+# CONFIG_SENSORS_MAX16065 is not set
+# CONFIG_SENSORS_MAX1619 is not set
+# CONFIG_SENSORS_MAX1668 is not set
+# CONFIG_SENSORS_MAX6639 is not set
+# CONFIG_SENSORS_MAX6642 is not set
+CONFIG_SENSORS_MAX6650=y
+# CONFIG_SENSORS_MAX6620 is not set
+# CONFIG_SENSORS_MAX6697 is not set
+# CONFIG_SENSORS_NTC_THERMISTOR is not set
+# CONFIG_SENSORS_PCF8591 is not set
+CONFIG_PMBUS=y
+CONFIG_SENSORS_PMBUS=y
+# CONFIG_SENSORS_ADM1275 is not set
+# CONFIG_SENSORS_LM25066 is not set
+# CONFIG_SENSORS_LTC2978 is not set
+# CONFIG_SENSORS_MAX16064 is not set
+# CONFIG_SENSORS_MAX34440 is not set
+# CONFIG_SENSORS_DNI_DPS460 is not set
+# CONFIG_SENSORS_MAX8688 is not set
+# CONFIG_SENSORS_UCD9000 is not set
+# CONFIG_SENSORS_UCD9200 is not set
+# CONFIG_SENSORS_ZL6100 is not set
+# CONFIG_SENSORS_SHT15 is not set
+# CONFIG_SENSORS_SHT21 is not set
+# CONFIG_SENSORS_SIS5595 is not set
+# CONFIG_SENSORS_SMM665 is not set
+# CONFIG_SENSORS_EMC1403 is not set
+# CONFIG_SENSORS_EMC2103 is not set
+CONFIG_SENSORS_EMC2305=y
+# CONFIG_SENSORS_EMC6W201 is not set
+# CONFIG_SENSORS_SMSC47M192 is not set
+# CONFIG_SENSORS_SCH56XX_COMMON is not set
+# CONFIG_SENSORS_ADS1015 is not set
+# CONFIG_SENSORS_ADS7828 is not set
+# CONFIG_SENSORS_ADS7871 is not set
+# CONFIG_SENSORS_AMC6821 is not set
+# CONFIG_SENSORS_THMC50 is not set
+# CONFIG_SENSORS_TMP102 is not set
+# CONFIG_SENSORS_TMP401 is not set
+# CONFIG_SENSORS_TMP421 is not set
+# CONFIG_SENSORS_VIA686A is not set
+# CONFIG_SENSORS_VT8231 is not set
+# CONFIG_SENSORS_W83781D is not set
+# CONFIG_SENSORS_W83791D is not set
+# CONFIG_SENSORS_W83792D is not set
+# CONFIG_SENSORS_W83793 is not set
+# CONFIG_SENSORS_W83795 is not set
+# CONFIG_SENSORS_W83L785TS is not set
+# CONFIG_SENSORS_W83L786NG is not set
+CONFIG_SENSORS_QUANTA_LY_HWMON=y
+# CONFIG_SENSORS_CPR_4011_4MXX is not set
+# CONFIG_SENSORS_ACCTON_I2C_CPLD is not set
+# CONFIG_SENSORS_YM2651Y is not set
+# CONFIG_THERMAL is not set
+CONFIG_WATCHDOG=y
+CONFIG_WATCHDOG_CORE=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+
+#
+# Watchdog Device Drivers
+#
+# CONFIG_SOFT_WATCHDOG is not set
+# CONFIG_ALIM7101_WDT is not set
+CONFIG_BOOKE_WDT=y
+CONFIG_BOOKE_WDT_DEFAULT_TIMEOUT=38
+
+#
+# PCI-based Watchdog Cards
+#
+# CONFIG_PCIPCWATCHDOG is not set
+# CONFIG_WDTPCI is not set
+
+#
+# USB-based Watchdog Cards
+#
+# CONFIG_USBPCWATCHDOG is not set
+CONFIG_SSB_POSSIBLE=y
+
+#
+# Sonics Silicon Backplane
+#
+# CONFIG_SSB is not set
+CONFIG_BCMA_POSSIBLE=y
+
+#
+# Broadcom specific AMBA
+#
+# CONFIG_BCMA is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_CORE is not set
+# CONFIG_MFD_88PM860X is not set
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_I2CPLD is not set
+# CONFIG_TPS6105X is not set
+# CONFIG_TPS65010 is not set
+# CONFIG_TPS6507X is not set
+# CONFIG_MFD_TPS6586X is not set
+# CONFIG_MFD_TPS65910 is not set
+# CONFIG_MFD_TPS65912_I2C is not set
+# CONFIG_MFD_TPS65912_SPI is not set
+# CONFIG_TWL4030_CORE is not set
+# CONFIG_MFD_STMPE is not set
+# CONFIG_MFD_TC3589X is not set
+# CONFIG_MFD_TMIO is not set
+# CONFIG_PMIC_DA903X is not set
+# CONFIG_PMIC_ADP5520 is not set
+# CONFIG_MFD_MAX8925 is not set
+# CONFIG_MFD_MAX8997 is not set
+# CONFIG_MFD_MAX8998 is not set
+# CONFIG_MFD_WM8400 is not set
+# CONFIG_MFD_WM831X_I2C is not set
+# CONFIG_MFD_WM831X_SPI is not set
+# CONFIG_MFD_WM8350_I2C is not set
+# CONFIG_MFD_WM8994 is not set
+# CONFIG_MFD_PCF50633 is not set
+# CONFIG_MFD_MC13XXX is not set
+# CONFIG_ABX500_CORE is not set
+# CONFIG_EZX_PCAP is not set
+# CONFIG_MFD_TIMBERDALE is not set
+# CONFIG_LPC_SCH is not set
+# CONFIG_MFD_RDC321X is not set
+# CONFIG_MFD_JANZ_CMODIO is not set
+# CONFIG_MFD_VX855 is not set
+# CONFIG_MFD_WL1273_CORE is not set
+# CONFIG_MFD_AAT2870_CORE is not set
+# CONFIG_REGULATOR is not set
+# CONFIG_MEDIA_SUPPORT is not set
+
+#
+# Graphics support
+#
+# CONFIG_AGP is not set
+# CONFIG_VGA_ARB is not set
+# CONFIG_DRM is not set
+# CONFIG_STUB_POULSBO is not set
+# CONFIG_VGASTATE is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+# CONFIG_FB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+# CONFIG_SOUND is not set
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_COMMON=y
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+CONFIG_USB_ARCH_HAS_EHCI=y
+CONFIG_USB_ARCH_HAS_XHCI=y
+CONFIG_USB=y
+# CONFIG_USB_DEBUG is not set
+# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
+
+#
+# Miscellaneous USB options
+#
+# CONFIG_USB_DEVICEFS is not set
+# CONFIG_USB_DEVICE_CLASS is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+# CONFIG_USB_OTG_WHITELIST is not set
+# CONFIG_USB_OTG_BLACKLIST_HUB is not set
+# CONFIG_USB_DWC3 is not set
+# CONFIG_USB_MON is not set
+# CONFIG_USB_WUSB is not set
+# CONFIG_USB_WUSB_CBAF is not set
+
+#
+# USB Host Controller Drivers
+#
+# CONFIG_USB_C67X00_HCD is not set
+# CONFIG_USB_XHCI_HCD is not set
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_ROOT_HUB_TT=y
+CONFIG_USB_EHCI_TT_NEWSCHED=y
+# CONFIG_XPS_USB_HCD_XILINX is not set
+CONFIG_USB_FSL_MPH_DR_OF=y
+CONFIG_USB_EHCI_FSL=y
+CONFIG_USB_EHCI_HCD_PPC_OF=y
+# CONFIG_USB_OXU210HP_HCD is not set
+# CONFIG_USB_ISP116X_HCD is not set
+# CONFIG_USB_ISP1760_HCD is not set
+# CONFIG_USB_ISP1362_HCD is not set
+# CONFIG_USB_OHCI_HCD is not set
+# CONFIG_USB_UHCI_HCD is not set
+# CONFIG_USB_SL811_HCD is not set
+# CONFIG_USB_R8A66597_HCD is not set
+# CONFIG_USB_WHCI_HCD is not set
+# CONFIG_USB_HWA_HCD is not set
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+# CONFIG_USB_WDM is not set
+# CONFIG_USB_TMC is not set
+
+#
+# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
+#
+
+#
+# also be needed; see USB_STORAGE Help for more info
+#
+CONFIG_USB_STORAGE=y
+# CONFIG_USB_STORAGE_DEBUG is not set
+# CONFIG_USB_STORAGE_REALTEK is not set
+# CONFIG_USB_STORAGE_DATAFAB is not set
+# CONFIG_USB_STORAGE_FREECOM is not set
+# CONFIG_USB_STORAGE_ISD200 is not set
+# CONFIG_USB_STORAGE_USBAT is not set
+# CONFIG_USB_STORAGE_SDDR09 is not set
+# CONFIG_USB_STORAGE_SDDR55 is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+# CONFIG_USB_STORAGE_ALAUDA is not set
+# CONFIG_USB_STORAGE_KARMA is not set
+# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
+# CONFIG_USB_STORAGE_ENE_UB6250 is not set
+# CONFIG_USB_LIBUSUAL is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
+
+#
+# USB port drivers
+#
+# CONFIG_USB_SERIAL is not set
+
+#
+# USB Miscellaneous drivers
+#
+# CONFIG_USB_EMI62 is not set
+# CONFIG_USB_EMI26 is not set
+# CONFIG_USB_ADUTUX is not set
+# CONFIG_USB_SEVSEG is not set
+# CONFIG_USB_RIO500 is not set
+# CONFIG_USB_LEGOTOWER is not set
+# CONFIG_USB_LCD is not set
+# CONFIG_USB_LED is not set
+# CONFIG_USB_CYPRESS_CY7C63 is not set
+# CONFIG_USB_CYTHERM is not set
+# CONFIG_USB_IDMOUSE is not set
+# CONFIG_USB_FTDI_ELAN is not set
+# CONFIG_USB_APPLEDISPLAY is not set
+# CONFIG_USB_SISUSBVGA is not set
+# CONFIG_USB_LD is not set
+# CONFIG_USB_TRANCEVIBRATOR is not set
+# CONFIG_USB_IOWARRIOR is not set
+# CONFIG_USB_TEST is not set
+# CONFIG_USB_ISIGHTFW is not set
+# CONFIG_USB_YUREX is not set
+# CONFIG_USB_GADGET is not set
+
+#
+# OTG and related infrastructure
+#
+# CONFIG_USB_GPIO_VBUS is not set
+# CONFIG_NOP_USB_XCEIV is not set
+# CONFIG_UWB is not set
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+# CONFIG_MMC_UNSAFE_RESUME is not set
+# CONFIG_MMC_CLKGATE is not set
+
+#
+# MMC/SD/SDIO Card Drivers
+#
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_BLOCK_MINORS=8
+CONFIG_MMC_BLOCK_BOUNCE=y
+# CONFIG_SDIO_UART is not set
+# CONFIG_MMC_TEST is not set
+
+#
+# MMC/SD/SDIO Host Controller Drivers
+#
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_IO_ACCESSORS=y
+CONFIG_MMC_SDHCI_BIG_ENDIAN_32BIT_BYTE_SWAPPER=y
+# CONFIG_MMC_SDHCI_PCI is not set
+CONFIG_MMC_SDHCI_PLTFM=y
+CONFIG_MMC_SDHCI_OF_ESDHC=y
+# CONFIG_MMC_SDHCI_OF_HLWD is not set
+# CONFIG_MMC_WBSD is not set
+# CONFIG_MMC_TIFM_SD is not set
+# CONFIG_MMC_CB710 is not set
+# CONFIG_MMC_VIA_SDMMC is not set
+# CONFIG_MMC_VUB300 is not set
+# CONFIG_MMC_USHC is not set
+# CONFIG_MEMSTICK is not set
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_LM3530 is not set
+CONFIG_LEDS_GPIO=y
+# CONFIG_LEDS_LP3944 is not set
+# CONFIG_LEDS_LP5521 is not set
+# CONFIG_LEDS_LP5523 is not set
+CONFIG_LEDS_PCA955X=y
+# CONFIG_LEDS_DAC124S085 is not set
+# CONFIG_LEDS_BD2802 is not set
+# CONFIG_LEDS_LT3593 is not set
+# CONFIG_LEDS_RENESAS_TPU is not set
+CONFIG_LEDS_TRIGGERS=y
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_GPIO is not set
+CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
+
+#
+# iptables trigger is under Netfilter config (LED target)
+#
+# CONFIG_ACCESSIBILITY is not set
+# CONFIG_INFINIBAND is not set
+# CONFIG_EDAC is not set
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+# CONFIG_RTC_DEBUG is not set
+
+#
+# RTC interfaces
+#
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_DEV=y
+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+# CONFIG_RTC_DRV_TEST is not set
+
+#
+# I2C RTC drivers
+#
+CONFIG_RTC_DRV_DS1307=y
+CONFIG_RTC_DRV_DS1374=y
+CONFIG_RTC_DRV_DS1672=y
+CONFIG_RTC_DRV_DS3232=y
+CONFIG_RTC_DRV_MAX6900=y
+CONFIG_RTC_DRV_RS5C372=y
+CONFIG_RTC_DRV_ISL1208=y
+CONFIG_RTC_DRV_ISL12022=y
+CONFIG_RTC_DRV_X1205=y
+CONFIG_RTC_DRV_PCF8563=y
+CONFIG_RTC_DRV_PCF8583=y
+CONFIG_RTC_DRV_M41T80=y
+CONFIG_RTC_DRV_M41T80_WDT=y
+CONFIG_RTC_DRV_BQ32K=y
+CONFIG_RTC_DRV_S35390A=y
+CONFIG_RTC_DRV_FM3130=y
+CONFIG_RTC_DRV_RX8581=y
+CONFIG_RTC_DRV_RX8025=y
+CONFIG_RTC_DRV_EM3027=y
+CONFIG_RTC_DRV_RV3029C2=y
+
+#
+# SPI RTC drivers
+#
+# CONFIG_RTC_DRV_M41T93 is not set
+# CONFIG_RTC_DRV_M41T94 is not set
+# CONFIG_RTC_DRV_DS1305 is not set
+# CONFIG_RTC_DRV_DS1390 is not set
+# CONFIG_RTC_DRV_MAX6902 is not set
+# CONFIG_RTC_DRV_R9701 is not set
+# CONFIG_RTC_DRV_RS5C348 is not set
+# CONFIG_RTC_DRV_DS3234 is not set
+# CONFIG_RTC_DRV_PCF2123 is not set
+
+#
+# Platform RTC drivers
+#
+CONFIG_RTC_DRV_CMOS=y
+# CONFIG_RTC_DRV_DS1286 is not set
+# CONFIG_RTC_DRV_DS1511 is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_STK17TA8 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_M48T35 is not set
+# CONFIG_RTC_DRV_M48T59 is not set
+# CONFIG_RTC_DRV_MSM6242 is not set
+# CONFIG_RTC_DRV_BQ4802 is not set
+# CONFIG_RTC_DRV_RP5C01 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# on-CPU RTC drivers
+#
+# CONFIG_RTC_DRV_GENERIC is not set
+CONFIG_DMADEVICES=y
+# CONFIG_DMADEVICES_DEBUG is not set
+
+#
+# DMA Devices
+#
+CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH=y
+# CONFIG_DW_DMAC is not set
+CONFIG_FSL_DMA=y
+# CONFIG_TIMB_DMA is not set
+CONFIG_DMA_ENGINE=y
+
+#
+# DMA Clients
+#
+CONFIG_NET_DMA_DUMMY=y
+# CONFIG_ASYNC_TX_DMA is not set
+# CONFIG_DMATEST is not set
+# CONFIG_AUXDISPLAY is not set
+# CONFIG_UIO is not set
+
+#
+# Virtio drivers
+#
+# CONFIG_VIRTIO_PCI is not set
+# CONFIG_VIRTIO_BALLOON is not set
+# CONFIG_VIRTIO_MMIO is not set
+# CONFIG_STAGING is not set
+
+#
+# Hardware Spinlock drivers
+#
+# CONFIG_IOMMU_SUPPORT is not set
+# CONFIG_VIRT_DRIVERS is not set
+
+#
+# Microsoft Hyper-V guest support
+#
+# CONFIG_PM_DEVFREQ is not set
+
+#
+# Frame Manager support
+#
+CONFIG_FSL_FMAN=y
+# CONFIG_FSL_FMAN_TEST is not set
+
+#
+# FMAN Processor support
+#
+CONFIG_FMAN_P3040_P4080_P5020=y
+# CONFIG_FMAN_P1023 is not set
+# CONFIG_FMAN_T4240 is not set
+# CONFIG_FMAN_RESOURCE_ALLOCATION_ALGORITHM is not set
+# CONFIG_FMAN_MIB_CNT_OVF_IRQ_EN is not set
+CONFIG_FSL_FM_MAX_FRAME_SIZE=1522
+CONFIG_FSL_FM_RX_EXTRA_HEADROOM=64
+
+#
+# File systems
+#
+# CONFIG_EXT2_FS is not set
+# CONFIG_EXT3_FS is not set
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_USE_FOR_EXT23=y
+# CONFIG_EXT4_FS_XATTR is not set
+# CONFIG_EXT4_DEBUG is not set
+CONFIG_JBD2=y
+# CONFIG_JBD2_DEBUG is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_BTRFS_FS is not set
+# CONFIG_NILFS2_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+CONFIG_FILE_LOCKING=y
+CONFIG_FSNOTIFY=y
+CONFIG_DNOTIFY=y
+CONFIG_INOTIFY_USER=y
+CONFIG_INOTIFY_STACKFS=y
+CONFIG_FANOTIFY=y
+# CONFIG_QUOTA is not set
+# CONFIG_QUOTACTL is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
+CONFIG_OVERLAYFS_FS=y
+
+#
+# Caches
+#
+# CONFIG_FSCACHE is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=y
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_PROC_VMCORE=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+CONFIG_TMPFS_XATTR=y
+# CONFIG_HUGETLB_PAGE is not set
+# CONFIG_CONFIGFS_FS is not set
+CONFIG_MISC_FILESYSTEMS=y
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
+CONFIG_JFFS2_SUMMARY=y
+# CONFIG_JFFS2_FS_XATTR is not set
+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+CONFIG_JFFS2_ZLIB=y
+# CONFIG_JFFS2_LZO is not set
+CONFIG_JFFS2_RTIME=y
+# CONFIG_JFFS2_RUBIN is not set
+CONFIG_UBIFS_FS=y
+# CONFIG_UBIFS_FS_XATTR is not set
+# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
+CONFIG_UBIFS_FS_LZO=y
+CONFIG_UBIFS_FS_ZLIB=y
+# CONFIG_UBIFS_FS_DEBUG is not set
+# CONFIG_LOGFS is not set
+# CONFIG_CRAMFS is not set
+CONFIG_SQUASHFS=y
+# CONFIG_SQUASHFS_XATTR is not set
+CONFIG_SQUASHFS_ZLIB=y
+CONFIG_SQUASHFS_LZO=y
+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_VXFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_OMFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_PSTORE is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+# CONFIG_AUFS_FS is not set
+CONFIG_NETWORK_FILESYSTEMS=y
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_CEPH_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_KARMA_PARTITION is not set
+CONFIG_EFI_PARTITION=y
+# CONFIG_SYSV68_PARTITION is not set
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=y
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=y
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+CONFIG_NLS_UTF8=y
+# CONFIG_BINARY_PRINTF is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+# CONFIG_CRC_CCITT is not set
+CONFIG_CRC16=y
+# CONFIG_CRC_T10DIF is not set
+CONFIG_CRC_ITU_T=y
+CONFIG_CRC32=y
+# CONFIG_CRC7 is not set
+CONFIG_LIBCRC32C=y
+# CONFIG_CRC8 is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_LZO_COMPRESS=y
+CONFIG_LZO_DECOMPRESS=y
+CONFIG_XZ_DEC=y
+# CONFIG_XZ_DEC_X86 is not set
+CONFIG_XZ_DEC_POWERPC=y
+# CONFIG_XZ_DEC_IA64 is not set
+# CONFIG_XZ_DEC_ARM is not set
+# CONFIG_XZ_DEC_ARMTHUMB is not set
+# CONFIG_XZ_DEC_SPARC is not set
+CONFIG_XZ_DEC_BCJ=y
+# CONFIG_XZ_DEC_TEST is not set
+CONFIG_DECOMPRESS_GZIP=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
+CONFIG_CPU_RMAP=y
+CONFIG_DQL=y
+CONFIG_NLATTR=y
+CONFIG_GENERIC_ATOMIC64=y
+# CONFIG_AVERAGE is not set
+# CONFIG_CORDIC is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4
+CONFIG_ENABLE_WARN_DEPRECATED=y
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_FRAME_WARN=1024
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_MAGIC_SYSRQ_DEFAULT_MASK=0x1
+# CONFIG_STRIP_ASM_SYMS is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_DEBUG_SECTION_MISMATCH is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+# CONFIG_LOCKUP_DETECTOR is not set
+# CONFIG_HARDLOCKUP_DETECTOR is not set
+CONFIG_DETECT_HUNG_TASK=y
+CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
+# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
+CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
+CONFIG_PANIC_TIMEOUT=0
+# CONFIG_SCHED_DEBUG is not set
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_DEBUG_OBJECTS is not set
+# CONFIG_SLUB_DEBUG_ON is not set
+# CONFIG_SLUB_STATS is not set
+# CONFIG_DEBUG_KMEMLEAK is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_SPARSE_RCU_POINTER is not set
+# CONFIG_LOCK_STAT is not set
+# CONFIG_DEBUG_ATOMIC_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_HIGHMEM is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_INFO=y
+# CONFIG_DEBUG_INFO_REDUCED is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_WRITECOUNT is not set
+# CONFIG_DEBUG_MEMORY_INIT is not set
+# CONFIG_DEBUG_LIST is not set
+# CONFIG_TEST_LIST_SORT is not set
+# CONFIG_DEBUG_SG is not set
+# CONFIG_DEBUG_NOTIFIERS is not set
+# CONFIG_DEBUG_CREDENTIALS is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+CONFIG_RCU_CPU_STALL_TIMEOUT=60
+# CONFIG_BACKTRACE_SELF_TEST is not set
+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
+# CONFIG_DEBUG_PER_CPU_MAPS is not set
+# CONFIG_LKDTM is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_LATENCYTOP is not set
+CONFIG_SYSCTL_SYSCALL_CHECK=y
+# CONFIG_DEBUG_PAGEALLOC is not set
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
+CONFIG_HAVE_DYNAMIC_FTRACE=y
+CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
+CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
+CONFIG_TRACING_SUPPORT=y
+CONFIG_FTRACE=y
+# CONFIG_FUNCTION_TRACER is not set
+# CONFIG_IRQSOFF_TRACER is not set
+# CONFIG_SCHED_TRACER is not set
+# CONFIG_ENABLE_DEFAULT_TRACERS is not set
+# CONFIG_FTRACE_SYSCALLS is not set
+CONFIG_BRANCH_PROFILE_NONE=y
+# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
+# CONFIG_PROFILE_ALL_BRANCHES is not set
+# CONFIG_STACK_TRACER is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+CONFIG_DYNAMIC_DEBUG=y
+# CONFIG_DMA_API_DEBUG is not set
+# CONFIG_ATOMIC64_SELFTEST is not set
+# CONFIG_SAMPLES is not set
+CONFIG_HAVE_ARCH_KGDB=y
+# CONFIG_KGDB is not set
+# CONFIG_TEST_KSTRTOX is not set
+# CONFIG_PPC_DISABLE_WERROR is not set
+CONFIG_PPC_WERROR=y
+CONFIG_PRINT_STACK_DEPTH=64
+# CONFIG_DEBUG_STACKOVERFLOW is not set
+# CONFIG_PPC_EMULATED_STATS is not set
+# CONFIG_CODE_PATCHING_SELFTEST is not set
+# CONFIG_FTR_FIXUP_SELFTEST is not set
+# CONFIG_MSI_BITMAP_SELFTEST is not set
+# CONFIG_XMON is not set
+CONFIG_VIRQ_DEBUG=y
+# CONFIG_BDI_SWITCH is not set
+# CONFIG_JTAG_DEBUGGER is not set
+# CONFIG_PPC_EARLY_DEBUG is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY_DMESG_RESTRICT is not set
+# CONFIG_SECURITY is not set
+# CONFIG_SECURITYFS is not set
+CONFIG_DEFAULT_SECURITY_DAC=y
+CONFIG_DEFAULT_SECURITY=""
+CONFIG_CRYPTO=y
+
+#
+# Crypto core or helper
+#
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_ALGAPI2=y
+CONFIG_CRYPTO_AEAD=y
+CONFIG_CRYPTO_AEAD2=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_BLKCIPHER2=y
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_HASH2=y
+CONFIG_CRYPTO_RNG2=y
+CONFIG_CRYPTO_PCOMP2=y
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_MANAGER2=y
+# CONFIG_CRYPTO_USER is not set
+CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y
+# CONFIG_CRYPTO_GF128MUL is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_PCRYPT is not set
+CONFIG_CRYPTO_WORKQUEUE=y
+# CONFIG_CRYPTO_CRYPTD is not set
+CONFIG_CRYPTO_AUTHENC=y
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Authenticated Encryption with Associated Data
+#
+# CONFIG_CRYPTO_CCM is not set
+# CONFIG_CRYPTO_GCM is not set
+# CONFIG_CRYPTO_SEQIV is not set
+
+#
+# Block modes
+#
+CONFIG_CRYPTO_CBC=y
+# CONFIG_CRYPTO_CTR is not set
+# CONFIG_CRYPTO_CTS is not set
+# CONFIG_CRYPTO_ECB is not set
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_PCBC is not set
+# CONFIG_CRYPTO_XTS is not set
+
+#
+# Hash modes
+#
+CONFIG_CRYPTO_HMAC=y
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_VMAC is not set
+
+#
+# Digest
+#
+CONFIG_CRYPTO_CRC32C=y
+# CONFIG_CRYPTO_GHASH is not set
+# CONFIG_CRYPTO_MD4 is not set
+CONFIG_CRYPTO_MD5=y
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_RMD128 is not set
+# CONFIG_CRYPTO_RMD160 is not set
+# CONFIG_CRYPTO_RMD256 is not set
+# CONFIG_CRYPTO_RMD320 is not set
+CONFIG_CRYPTO_SHA1=y
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+# CONFIG_CRYPTO_WP512 is not set
+
+#
+# Ciphers
+#
+CONFIG_CRYPTO_AES=y
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_ARC4 is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+CONFIG_CRYPTO_DES=y
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_SALSA20 is not set
+# CONFIG_CRYPTO_SEED is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_TEA is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+
+#
+# Compression
+#
+CONFIG_CRYPTO_DEFLATE=y
+# CONFIG_CRYPTO_ZLIB is not set
+CONFIG_CRYPTO_LZO=y
+
+#
+# Random Number Generation
+#
+# CONFIG_CRYPTO_ANSI_CPRNG is not set
+# CONFIG_CRYPTO_USER_API_HASH is not set
+# CONFIG_CRYPTO_USER_API_SKCIPHER is not set
+CONFIG_CRYPTO_HW=y
+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
+# CONFIG_CRYPTO_DEV_FSL_CAAM is not set
+CONFIG_CRYPTO_DEV_TALITOS=y
+CONFIG_PPC_CLOCK=y
+CONFIG_PPC_LIB_RHEAP=y
+# CONFIG_VIRTUALIZATION is not set
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/configs/x86_64-all/.gitignore b/packages/base/any/kernels/3.2.65-1+deb7u2/configs/x86_64-all/.gitignore
new file mode 100644
index 00000000..b220e48d
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/configs/x86_64-all/.gitignore
@@ -0,0 +1 @@
+kernel-3.2-deb7-x86_64-all
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/configs/x86_64-all/Makefile b/packages/base/any/kernels/3.2.65-1+deb7u2/configs/x86_64-all/Makefile
new file mode 100644
index 00000000..0d857115
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/configs/x86_64-all/Makefile
@@ -0,0 +1,42 @@
+############################################################
+#
+#
+# Copyright 2015 Big Switch Networks, Inc.
+#
+# Licensed under the Eclipse Public License, Version 1.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+# either express or implied. See the License for the specific
+# language governing permissions and limitations under the
+# License.
+#
+#
+############################################################
+#
+# Default 3.2.65-1+deb7u2 configuration for x86_64 platforms.
+#
+############################################################
+THIS_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
+include $(ONL)/make/config.mk
+
+export ARCH := x86_64
+ifndef K_TARGET_DIR
+K_TARGET_DIR := $(THIS_DIR)
+endif
+
+include ../../kconfig.mk
+K_CONFIG := x86_64-all.config
+K_BUILD_TARGET := bzImage
+K_COPY_SRC := arch/x86/boot/bzImage
+ifndef K_COPY_DST
+K_COPY_DST := kernel-3.2-deb7-x86_64-all
+endif
+
+include $(ONL)/make/kbuild.mk
+
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/configs/x86_64-all/x86_64-all.config b/packages/base/any/kernels/3.2.65-1+deb7u2/configs/x86_64-all/x86_64-all.config
new file mode 100644
index 00000000..32ad6dee
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/configs/x86_64-all/x86_64-all.config
@@ -0,0 +1,2966 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# Linux/x86_64 3.2.65 Kernel Configuration
+#
+CONFIG_64BIT=y
+# CONFIG_X86_32 is not set
+CONFIG_X86_64=y
+CONFIG_X86=y
+CONFIG_INSTRUCTION_DECODER=y
+CONFIG_OUTPUT_FORMAT="elf64-x86-64"
+CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"
+CONFIG_GENERIC_CMOS_UPDATE=y
+CONFIG_CLOCKSOURCE_WATCHDOG=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_ARCH_CLOCKSOURCE_DATA=y
+CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+CONFIG_MMU=y
+CONFIG_ZONE_DMA=y
+CONFIG_NEED_DMA_MAP_STATE=y
+CONFIG_NEED_SG_DMA_LENGTH=y
+CONFIG_GENERIC_ISA_DMA=y
+CONFIG_GENERIC_IOMAP=y
+CONFIG_GENERIC_BUG=y
+CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+# CONFIG_RWSEM_GENERIC_SPINLOCK is not set
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_TIME_VSYSCALL=y
+CONFIG_ARCH_HAS_CPU_RELAX=y
+CONFIG_ARCH_HAS_DEFAULT_IDLE=y
+CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
+CONFIG_ARCH_HAS_CPU_AUTOPROBE=y
+CONFIG_HAVE_SETUP_PER_CPU_AREA=y
+CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
+CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
+CONFIG_ARCH_HIBERNATION_POSSIBLE=y
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_ZONE_DMA32=y
+CONFIG_ARCH_POPULATES_NODE_MAP=y
+CONFIG_AUDIT_ARCH=y
+CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y
+CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
+CONFIG_X86_64_SMP=y
+CONFIG_X86_HT=y
+CONFIG_ARCH_HWEIGHT_CFLAGS="-fcall-saved-rdi -fcall-saved-rsi -fcall-saved-rdx -fcall-saved-rcx -fcall-saved-r8 -fcall-saved-r9 -fcall-saved-r10 -fcall-saved-r11"
+# CONFIG_KTIME_SCALAR is not set
+CONFIG_ARCH_CPU_PROBE_RELEASE=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+CONFIG_HAVE_IRQ_WORK=y
+CONFIG_IRQ_WORK=y
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_CROSS_COMPILE=""
+CONFIG_LOCALVERSION="-1+deb7u2-OpenNetworkLinux"
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_HAVE_KERNEL_GZIP=y
+CONFIG_HAVE_KERNEL_BZIP2=y
+CONFIG_HAVE_KERNEL_LZMA=y
+CONFIG_HAVE_KERNEL_XZ=y
+CONFIG_HAVE_KERNEL_LZO=y
+# CONFIG_KERNEL_GZIP is not set
+CONFIG_KERNEL_BZIP2=y
+# CONFIG_KERNEL_LZMA is not set
+# CONFIG_KERNEL_XZ is not set
+# CONFIG_KERNEL_LZO is not set
+CONFIG_DEFAULT_HOSTNAME="(none)"
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_POSIX_MQUEUE_SYSCTL=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_FHANDLE=y
+CONFIG_TASKSTATS=y
+CONFIG_TASK_DELAY_ACCT=y
+CONFIG_TASK_XACCT=y
+CONFIG_TASK_IO_ACCOUNTING=y
+CONFIG_AUDIT=y
+CONFIG_AUDITSYSCALL=y
+CONFIG_AUDIT_WATCH=y
+CONFIG_AUDIT_TREE=y
+CONFIG_HAVE_GENERIC_HARDIRQS=y
+
+#
+# IRQ subsystem
+#
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_HAVE_SPARSE_IRQ=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_GENERIC_IRQ_SHOW=y
+CONFIG_GENERIC_PENDING_IRQ=y
+CONFIG_IRQ_FORCED_THREADING=y
+CONFIG_SPARSE_IRQ=y
+
+#
+# RCU Subsystem
+#
+CONFIG_TREE_RCU=y
+# CONFIG_PREEMPT_RCU is not set
+# CONFIG_RCU_TRACE is not set
+CONFIG_RCU_FANOUT=64
+# CONFIG_RCU_FANOUT_EXACT is not set
+CONFIG_RCU_FAST_NO_HZ=y
+# CONFIG_TREE_RCU_TRACE is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=17
+CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y
+CONFIG_CGROUPS=y
+# CONFIG_CGROUP_DEBUG is not set
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CGROUP_DEVICE=y
+CONFIG_CPUSETS=y
+CONFIG_PROC_PID_CPUSET=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_RESOURCE_COUNTERS=y
+CONFIG_CGROUP_MEM_RES_CTLR=y
+CONFIG_CGROUP_MEM_RES_CTLR_DISABLED=y
+CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y
+# CONFIG_CGROUP_MEM_RES_CTLR_SWAP_ENABLED is not set
+CONFIG_CGROUP_PERF=y
+CONFIG_CGROUP_SCHED=y
+CONFIG_FAIR_GROUP_SCHED=y
+# CONFIG_CFS_BANDWIDTH is not set
+# CONFIG_RT_GROUP_SCHED is not set
+CONFIG_BLK_CGROUP=y
+# CONFIG_DEBUG_BLK_CGROUP is not set
+CONFIG_NAMESPACES=y
+CONFIG_UTS_NS=y
+CONFIG_IPC_NS=y
+CONFIG_USER_NS=y
+CONFIG_PID_NS=y
+CONFIG_NET_NS=y
+CONFIG_SCHED_AUTOGROUP=y
+CONFIG_MM_OWNER=y
+# CONFIG_SYSFS_DEPRECATED is not set
+CONFIG_RELAY=y
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_RD_GZIP=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_XZ=y
+CONFIG_RD_LZO=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_ANON_INODES=y
+CONFIG_EXPERT=y
+CONFIG_UID16=y
+# CONFIG_SYSCTL_SYSCALL is not set
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_PCSPKR_PLATFORM=y
+CONFIG_HAVE_PCSPKR_PLATFORM=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_AIO=y
+CONFIG_EMBEDDED=y
+CONFIG_HAVE_PERF_EVENTS=y
+
+#
+# Kernel Performance Events And Counters
+#
+CONFIG_PERF_EVENTS=y
+# CONFIG_PERF_COUNTERS is not set
+# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_PCI_QUIRKS=y
+# CONFIG_COMPAT_BRK is not set
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+# CONFIG_PROFILING is not set
+CONFIG_TRACEPOINTS=y
+CONFIG_HAVE_OPROFILE=y
+# CONFIG_KPROBES is not set
+# CONFIG_JUMP_LABEL is not set
+CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
+CONFIG_HAVE_IOREMAP_PROT=y
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_OPTPROBES=y
+CONFIG_HAVE_ARCH_TRACEHOOK=y
+CONFIG_HAVE_DMA_ATTRS=y
+CONFIG_USE_GENERIC_SMP_HELPERS=y
+CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
+CONFIG_HAVE_DMA_API_DEBUG=y
+CONFIG_HAVE_HW_BREAKPOINT=y
+CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y
+CONFIG_HAVE_USER_RETURN_NOTIFIER=y
+CONFIG_HAVE_PERF_EVENTS_NMI=y
+CONFIG_HAVE_ARCH_JUMP_LABEL=y
+CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
+
+#
+# GCOV-based kernel profiling
+#
+# CONFIG_GCOV_KERNEL is not set
+# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+# CONFIG_MODULE_FORCE_LOAD is not set
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_STOP_MACHINE=y
+CONFIG_BLOCK=y
+CONFIG_BLK_DEV_BSG=y
+CONFIG_BLK_DEV_BSGLIB=y
+CONFIG_BLK_DEV_INTEGRITY=y
+# CONFIG_BLK_DEV_THROTTLING is not set
+CONFIG_BLOCK_COMPAT=y
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_CFQ_GROUP_IOSCHED=y
+# CONFIG_DEFAULT_DEADLINE is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+# CONFIG_INLINE_SPIN_TRYLOCK is not set
+# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
+# CONFIG_INLINE_SPIN_LOCK is not set
+# CONFIG_INLINE_SPIN_LOCK_BH is not set
+# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
+# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
+CONFIG_INLINE_SPIN_UNLOCK=y
+# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
+CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
+# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
+# CONFIG_INLINE_READ_TRYLOCK is not set
+# CONFIG_INLINE_READ_LOCK is not set
+# CONFIG_INLINE_READ_LOCK_BH is not set
+# CONFIG_INLINE_READ_LOCK_IRQ is not set
+# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
+CONFIG_INLINE_READ_UNLOCK=y
+# CONFIG_INLINE_READ_UNLOCK_BH is not set
+CONFIG_INLINE_READ_UNLOCK_IRQ=y
+# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
+# CONFIG_INLINE_WRITE_TRYLOCK is not set
+# CONFIG_INLINE_WRITE_LOCK is not set
+# CONFIG_INLINE_WRITE_LOCK_BH is not set
+# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
+# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
+CONFIG_INLINE_WRITE_UNLOCK=y
+# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
+CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
+# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
+CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
+CONFIG_MUTEX_SPIN_ON_OWNER=y
+CONFIG_FREEZER=y
+
+#
+# Processor type and features
+#
+CONFIG_TICK_ONESHOT=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y
+CONFIG_SMP=y
+CONFIG_X86_MPPARSE=y
+# CONFIG_X86_EXTENDED_PLATFORM is not set
+CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y
+CONFIG_SCHED_OMIT_FRAME_POINTER=y
+CONFIG_PARAVIRT_GUEST=y
+# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set
+CONFIG_XEN=y
+CONFIG_XEN_DOM0=y
+CONFIG_XEN_PRIVILEGED_GUEST=y
+CONFIG_XEN_PVHVM=y
+CONFIG_XEN_MAX_DOMAIN_MEMORY=128
+CONFIG_XEN_SAVE_RESTORE=y
+# CONFIG_XEN_DEBUG_FS is not set
+CONFIG_KVM_CLOCK=y
+CONFIG_KVM_GUEST=y
+CONFIG_PARAVIRT=y
+# CONFIG_PARAVIRT_SPINLOCKS is not set
+CONFIG_PARAVIRT_CLOCK=y
+# CONFIG_PARAVIRT_DEBUG is not set
+CONFIG_NO_BOOTMEM=y
+CONFIG_MEMTEST=y
+# CONFIG_MK8 is not set
+# CONFIG_MPSC is not set
+# CONFIG_MCORE2 is not set
+# CONFIG_MATOM is not set
+CONFIG_GENERIC_CPU=y
+CONFIG_X86_INTERNODE_CACHE_SHIFT=6
+CONFIG_X86_CMPXCHG=y
+CONFIG_CMPXCHG_LOCAL=y
+CONFIG_CMPXCHG_DOUBLE=y
+CONFIG_X86_L1_CACHE_SHIFT=6
+CONFIG_X86_XADD=y
+CONFIG_X86_WP_WORKS_OK=y
+CONFIG_X86_TSC=y
+CONFIG_X86_CMPXCHG64=y
+CONFIG_X86_CMOV=y
+CONFIG_X86_MINIMUM_CPU_FAMILY=64
+CONFIG_X86_DEBUGCTLMSR=y
+# CONFIG_PROCESSOR_SELECT is not set
+CONFIG_CPU_SUP_INTEL=y
+CONFIG_CPU_SUP_AMD=y
+CONFIG_CPU_SUP_CENTAUR=y
+CONFIG_HPET_TIMER=y
+CONFIG_HPET_EMULATE_RTC=y
+CONFIG_DMI=y
+CONFIG_GART_IOMMU=y
+CONFIG_CALGARY_IOMMU=y
+CONFIG_CALGARY_IOMMU_ENABLED_BY_DEFAULT=y
+CONFIG_SWIOTLB=y
+CONFIG_IOMMU_HELPER=y
+# CONFIG_MAXSMP is not set
+CONFIG_NR_CPUS=512
+CONFIG_SCHED_SMT=y
+CONFIG_SCHED_MC=y
+# CONFIG_IRQ_TIME_ACCOUNTING is not set
+# CONFIG_PREEMPT_NONE is not set
+CONFIG_PREEMPT_VOLUNTARY=y
+# CONFIG_PREEMPT is not set
+CONFIG_X86_LOCAL_APIC=y
+CONFIG_X86_IO_APIC=y
+CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
+CONFIG_X86_MCE=y
+CONFIG_X86_MCE_INTEL=y
+CONFIG_X86_MCE_AMD=y
+CONFIG_X86_MCE_THRESHOLD=y
+# CONFIG_X86_MCE_INJECT is not set
+CONFIG_X86_THERMAL_VECTOR=y
+# CONFIG_X86_16BIT is not set
+# CONFIG_I8K is not set
+# CONFIG_MICROCODE is not set
+CONFIG_X86_MSR=y
+CONFIG_X86_CPUID=y
+CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
+CONFIG_ARCH_DMA_ADDR_T_64BIT=y
+CONFIG_DIRECT_GBPAGES=y
+# CONFIG_NUMA is not set
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_DEFAULT=y
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_ARCH_MEMORY_PROBE=y
+CONFIG_ARCH_PROC_KCORE_TEXT=y
+CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_SPARSEMEM_MANUAL=y
+CONFIG_SPARSEMEM=y
+CONFIG_HAVE_MEMORY_PRESENT=y
+CONFIG_SPARSEMEM_EXTREME=y
+CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
+CONFIG_SPARSEMEM_ALLOC_MEM_MAP_TOGETHER=y
+CONFIG_SPARSEMEM_VMEMMAP=y
+CONFIG_HAVE_MEMBLOCK=y
+CONFIG_MEMORY_HOTPLUG=y
+CONFIG_MEMORY_HOTPLUG_SPARSE=y
+CONFIG_MEMORY_HOTREMOVE=y
+CONFIG_PAGEFLAGS_EXTENDED=y
+CONFIG_SPLIT_PTLOCK_CPUS=4
+CONFIG_COMPACTION=y
+CONFIG_MIGRATION=y
+CONFIG_PHYS_ADDR_T_64BIT=y
+CONFIG_ZONE_DMA_FLAG=1
+CONFIG_BOUNCE=y
+CONFIG_VIRT_TO_BUS=y
+CONFIG_MMU_NOTIFIER=y
+CONFIG_KSM=y
+CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
+CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
+CONFIG_MEMORY_FAILURE=y
+CONFIG_HWPOISON_INJECT=y
+CONFIG_TRANSPARENT_HUGEPAGE=y
+# CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS is not set
+CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
+# CONFIG_CLEANCACHE is not set
+# CONFIG_X86_CHECK_BIOS_CORRUPTION is not set
+CONFIG_X86_RESERVE_LOW=64
+CONFIG_MTRR=y
+CONFIG_MTRR_SANITIZER=y
+CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=0
+CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1
+CONFIG_X86_PAT=y
+CONFIG_ARCH_USES_PG_UNCACHED=y
+CONFIG_ARCH_RANDOM=y
+# CONFIG_EFI is not set
+CONFIG_SECCOMP=y
+CONFIG_CC_STACKPROTECTOR=y
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_300 is not set
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=250
+CONFIG_SCHED_HRTICK=y
+CONFIG_KEXEC=y
+CONFIG_CRASH_DUMP=y
+CONFIG_PHYSICAL_START=0x1000000
+CONFIG_RELOCATABLE=y
+CONFIG_PHYSICAL_ALIGN=0x1000000
+CONFIG_HOTPLUG_CPU=y
+# CONFIG_COMPAT_VDSO is not set
+# CONFIG_CMDLINE_BOOL is not set
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
+
+#
+# Power management and ACPI options
+#
+# CONFIG_SUSPEND is not set
+CONFIG_HIBERNATE_CALLBACKS=y
+# CONFIG_HIBERNATION is not set
+CONFIG_PM_SLEEP=y
+CONFIG_PM_SLEEP_SMP=y
+# CONFIG_PM_RUNTIME is not set
+CONFIG_PM=y
+# CONFIG_PM_DEBUG is not set
+CONFIG_ACPI=y
+# CONFIG_ACPI_PROCFS is not set
+# CONFIG_ACPI_PROCFS_POWER is not set
+# CONFIG_ACPI_EC_DEBUGFS is not set
+CONFIG_ACPI_PROC_EVENT=y
+CONFIG_ACPI_AC=y
+CONFIG_ACPI_BATTERY=y
+CONFIG_ACPI_BUTTON=y
+CONFIG_ACPI_FAN=y
+# CONFIG_ACPI_DOCK is not set
+CONFIG_ACPI_PROCESSOR=y
+CONFIG_ACPI_HOTPLUG_CPU=y
+# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set
+CONFIG_ACPI_THERMAL=y
+# CONFIG_ACPI_CUSTOM_DSDT is not set
+CONFIG_ACPI_BLACKLIST_YEAR=0
+# CONFIG_ACPI_DEBUG is not set
+# CONFIG_ACPI_PCI_SLOT is not set
+CONFIG_X86_PM_TIMER=y
+CONFIG_ACPI_CONTAINER=y
+# CONFIG_ACPI_HOTPLUG_MEMORY is not set
+# CONFIG_ACPI_SBS is not set
+# CONFIG_ACPI_HED is not set
+CONFIG_ACPI_CUSTOM_METHOD=y
+# CONFIG_ACPI_APEI is not set
+# CONFIG_SFI is not set
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_STAT=y
+# CONFIG_CPU_FREQ_STAT_DETAILS is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
+
+#
+# x86 CPU frequency scaling drivers
+#
+# CONFIG_X86_PCC_CPUFREQ is not set
+# CONFIG_X86_ACPI_CPUFREQ is not set
+# CONFIG_X86_POWERNOW_K8 is not set
+# CONFIG_X86_SPEEDSTEP_CENTRINO is not set
+CONFIG_X86_P4_CLOCKMOD=y
+
+#
+# shared options
+#
+CONFIG_X86_SPEEDSTEP_LIB=y
+CONFIG_CPU_IDLE=y
+CONFIG_CPU_IDLE_GOV_LADDER=y
+CONFIG_CPU_IDLE_GOV_MENU=y
+CONFIG_INTEL_IDLE=y
+
+#
+# Memory power savings
+#
+CONFIG_I7300_IDLE_IOAT_CHANNEL=y
+CONFIG_I7300_IDLE=y
+
+#
+# Bus options (PCI etc.)
+#
+CONFIG_PCI=y
+CONFIG_PCI_DIRECT=y
+CONFIG_PCI_MMCONFIG=y
+CONFIG_PCI_XEN=y
+CONFIG_PCI_DOMAINS=y
+# CONFIG_PCI_CNB20LE_QUIRK is not set
+CONFIG_PCIEPORTBUS=y
+CONFIG_HOTPLUG_PCI_PCIE=y
+CONFIG_PCIEAER=y
+# CONFIG_PCIE_ECRC is not set
+CONFIG_PCIEAER_INJECT=y
+CONFIG_PCIEASPM=y
+# CONFIG_PCIEASPM_DEBUG is not set
+CONFIG_ARCH_SUPPORTS_MSI=y
+CONFIG_PCI_MSI=y
+# CONFIG_PCI_DEBUG is not set
+# CONFIG_PCI_STUB is not set
+# CONFIG_XEN_PCIDEV_FRONTEND is not set
+CONFIG_HT_IRQ=y
+CONFIG_PCI_ATS=y
+CONFIG_PCI_IOV=y
+# CONFIG_PCI_PRI is not set
+# CONFIG_PCI_PASID is not set
+CONFIG_PCI_IOAPIC=y
+CONFIG_PCI_LABEL=y
+CONFIG_ISA_DMA_API=y
+CONFIG_AMD_NB=y
+CONFIG_PCCARD=y
+CONFIG_PCMCIA=y
+CONFIG_PCMCIA_LOAD_CIS=y
+CONFIG_CARDBUS=y
+
+#
+# PC-card bridges
+#
+# CONFIG_YENTA is not set
+CONFIG_PD6729=y
+CONFIG_I82092=y
+CONFIG_PCCARD_NONSTATIC=y
+CONFIG_HOTPLUG_PCI=y
+CONFIG_HOTPLUG_PCI_FAKE=y
+# CONFIG_HOTPLUG_PCI_ACPI is not set
+CONFIG_HOTPLUG_PCI_CPCI=y
+CONFIG_HOTPLUG_PCI_CPCI_ZT5550=y
+CONFIG_HOTPLUG_PCI_CPCI_GENERIC=y
+CONFIG_HOTPLUG_PCI_SHPC=y
+# CONFIG_RAPIDIO is not set
+
+#
+# Executable file formats / Emulations
+#
+CONFIG_BINFMT_ELF=y
+CONFIG_COMPAT_BINFMT_ELF=y
+CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
+# CONFIG_HAVE_AOUT is not set
+CONFIG_BINFMT_MISC=y
+CONFIG_IA32_EMULATION=y
+CONFIG_IA32_AOUT=y
+CONFIG_COMPAT=y
+CONFIG_COMPAT_FOR_U64_ALIGNMENT=y
+CONFIG_SYSVIPC_COMPAT=y
+CONFIG_KEYS_COMPAT=y
+CONFIG_HAVE_TEXT_POKE_SMP=y
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+CONFIG_XFRM_USER=y
+CONFIG_XFRM_SUB_POLICY=y
+CONFIG_XFRM_MIGRATE=y
+# CONFIG_XFRM_STATISTICS is not set
+CONFIG_XFRM_IPCOMP=y
+CONFIG_NET_KEY=y
+CONFIG_NET_KEY_MIGRATE=y
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_IP_FIB_TRIE_STATS=y
+CONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_IP_ROUTE_MULTIPATH=y
+CONFIG_IP_ROUTE_VERBOSE=y
+CONFIG_IP_ROUTE_CLASSID=y
+# CONFIG_IP_PNP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE_DEMUX is not set
+# CONFIG_IP_MROUTE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+CONFIG_INET_TUNNEL=y
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+CONFIG_INET_LRO=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+CONFIG_TCP_CONG_ADVANCED=y
+CONFIG_TCP_CONG_BIC=y
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_TCP_CONG_WESTWOOD=y
+CONFIG_TCP_CONG_HTCP=y
+CONFIG_TCP_CONG_HSTCP=y
+CONFIG_TCP_CONG_HYBLA=y
+CONFIG_TCP_CONG_VEGAS=y
+CONFIG_TCP_CONG_SCALABLE=y
+CONFIG_TCP_CONG_LP=y
+CONFIG_TCP_CONG_VENO=y
+CONFIG_TCP_CONG_YEAH=y
+CONFIG_TCP_CONG_ILLINOIS=y
+# CONFIG_DEFAULT_BIC is not set
+CONFIG_DEFAULT_CUBIC=y
+# CONFIG_DEFAULT_HTCP is not set
+# CONFIG_DEFAULT_HYBLA is not set
+# CONFIG_DEFAULT_VEGAS is not set
+# CONFIG_DEFAULT_VENO is not set
+# CONFIG_DEFAULT_WESTWOOD is not set
+# CONFIG_DEFAULT_RENO is not set
+CONFIG_DEFAULT_TCP_CONG="cubic"
+CONFIG_TCP_MD5SIG=y
+CONFIG_IPV6=y
+CONFIG_IPV6_PRIVACY=y
+CONFIG_IPV6_ROUTER_PREF=y
+CONFIG_IPV6_ROUTE_INFO=y
+CONFIG_IPV6_OPTIMISTIC_DAD=y
+CONFIG_INET6_AH=y
+CONFIG_INET6_ESP=y
+CONFIG_INET6_IPCOMP=y
+CONFIG_IPV6_MIP6=y
+CONFIG_INET6_XFRM_TUNNEL=y
+CONFIG_INET6_TUNNEL=y
+CONFIG_INET6_XFRM_MODE_TRANSPORT=y
+CONFIG_INET6_XFRM_MODE_TUNNEL=y
+CONFIG_INET6_XFRM_MODE_BEET=y
+CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=y
+CONFIG_IPV6_SIT=y
+CONFIG_IPV6_SIT_6RD=y
+CONFIG_IPV6_NDISC_NODETYPE=y
+CONFIG_IPV6_TUNNEL=y
+CONFIG_IPV6_MULTIPLE_TABLES=y
+CONFIG_IPV6_SUBTREES=y
+CONFIG_IPV6_MROUTE=y
+CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y
+CONFIG_IPV6_PIMSM_V2=y
+CONFIG_NETWORK_SECMARK=y
+# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+CONFIG_NETFILTER_ADVANCED=y
+
+#
+# Core Netfilter Configuration
+#
+CONFIG_NETFILTER_NETLINK=y
+CONFIG_NETFILTER_NETLINK_QUEUE=y
+CONFIG_NETFILTER_NETLINK_LOG=y
+CONFIG_NF_CONNTRACK=y
+CONFIG_NF_CONNTRACK_MARK=y
+CONFIG_NF_CONNTRACK_SECMARK=y
+CONFIG_NF_CONNTRACK_ZONES=y
+CONFIG_NF_CONNTRACK_EVENTS=y
+CONFIG_NF_CONNTRACK_TIMESTAMP=y
+CONFIG_NF_CT_PROTO_DCCP=y
+CONFIG_NF_CT_PROTO_GRE=y
+CONFIG_NF_CT_PROTO_SCTP=y
+CONFIG_NF_CT_PROTO_UDPLITE=y
+CONFIG_NF_CONNTRACK_AMANDA=y
+CONFIG_NF_CONNTRACK_FTP=y
+CONFIG_NF_CONNTRACK_H323=y
+CONFIG_NF_CONNTRACK_IRC=y
+CONFIG_NF_CONNTRACK_BROADCAST=y
+CONFIG_NF_CONNTRACK_NETBIOS_NS=y
+CONFIG_NF_CONNTRACK_SNMP=y
+CONFIG_NF_CONNTRACK_PPTP=y
+CONFIG_NF_CONNTRACK_SANE=y
+CONFIG_NF_CONNTRACK_SIP=y
+CONFIG_NF_CONNTRACK_TFTP=y
+CONFIG_NF_CT_NETLINK=y
+CONFIG_NETFILTER_TPROXY=y
+CONFIG_NETFILTER_XTABLES=y
+
+#
+# Xtables combined modules
+#
+CONFIG_NETFILTER_XT_MARK=y
+CONFIG_NETFILTER_XT_CONNMARK=y
+CONFIG_NETFILTER_XT_SET=y
+
+#
+# Xtables targets
+#
+CONFIG_NETFILTER_XT_TARGET_AUDIT=y
+CONFIG_NETFILTER_XT_TARGET_CHECKSUM=y
+CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y
+CONFIG_NETFILTER_XT_TARGET_CONNMARK=y
+CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y
+CONFIG_NETFILTER_XT_TARGET_CT=y
+CONFIG_NETFILTER_XT_TARGET_DSCP=y
+CONFIG_NETFILTER_XT_TARGET_HL=y
+CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y
+CONFIG_NETFILTER_XT_TARGET_MARK=y
+CONFIG_NETFILTER_XT_TARGET_NFLOG=y
+CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y
+CONFIG_NETFILTER_XT_TARGET_NOTRACK=y
+CONFIG_NETFILTER_XT_TARGET_RATEEST=y
+CONFIG_NETFILTER_XT_TARGET_TEE=y
+CONFIG_NETFILTER_XT_TARGET_TPROXY=y
+CONFIG_NETFILTER_XT_TARGET_TRACE=y
+CONFIG_NETFILTER_XT_TARGET_SECMARK=y
+CONFIG_NETFILTER_XT_TARGET_TCPMSS=y
+CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=y
+# CONFIG_NETFILTER_XT_TARGET_ERSPAN is not set
+# CONFIG_NETFILTER_XT_TARGET_SPAN is not set
+# CONFIG_NETFILTER_XT_TARGET_POLICE is not set
+# CONFIG_NETFILTER_XT_TARGET_TRICOLORPOLICE is not set
+# CONFIG_NETFILTER_XT_TARGET_SETCLASS is not set
+# CONFIG_NETFILTER_XT_TARGET_SETQOS is not set
+
+#
+# Xtables matches
+#
+CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y
+CONFIG_NETFILTER_XT_MATCH_CLUSTER=y
+CONFIG_NETFILTER_XT_MATCH_COMMENT=y
+CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y
+CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y
+CONFIG_NETFILTER_XT_MATCH_CONNMARK=y
+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
+CONFIG_NETFILTER_XT_MATCH_CPU=y
+CONFIG_NETFILTER_XT_MATCH_DCCP=y
+CONFIG_NETFILTER_XT_MATCH_DEVGROUP=y
+CONFIG_NETFILTER_XT_MATCH_DSCP=y
+CONFIG_NETFILTER_XT_MATCH_ESP=y
+CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y
+CONFIG_NETFILTER_XT_MATCH_HELPER=y
+CONFIG_NETFILTER_XT_MATCH_HL=y
+CONFIG_NETFILTER_XT_MATCH_IPRANGE=y
+CONFIG_NETFILTER_XT_MATCH_IPVS=y
+CONFIG_NETFILTER_XT_MATCH_LENGTH=y
+CONFIG_NETFILTER_XT_MATCH_LIMIT=y
+CONFIG_NETFILTER_XT_MATCH_MAC=y
+CONFIG_NETFILTER_XT_MATCH_MARK=y
+CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y
+CONFIG_NETFILTER_XT_MATCH_OSF=y
+CONFIG_NETFILTER_XT_MATCH_OWNER=y
+CONFIG_NETFILTER_XT_MATCH_POLICY=y
+CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y
+CONFIG_NETFILTER_XT_MATCH_QUOTA=y
+CONFIG_NETFILTER_XT_MATCH_RATEEST=y
+CONFIG_NETFILTER_XT_MATCH_REALM=y
+CONFIG_NETFILTER_XT_MATCH_RECENT=y
+CONFIG_NETFILTER_XT_MATCH_SCTP=y
+CONFIG_NETFILTER_XT_MATCH_SOCKET=y
+CONFIG_NETFILTER_XT_MATCH_STATE=y
+CONFIG_NETFILTER_XT_MATCH_STATISTIC=y
+CONFIG_NETFILTER_XT_MATCH_STRING=y
+CONFIG_NETFILTER_XT_MATCH_TCPMSS=y
+CONFIG_NETFILTER_XT_MATCH_TIME=y
+CONFIG_NETFILTER_XT_MATCH_U32=y
+CONFIG_IP_SET=y
+CONFIG_IP_SET_MAX=256
+CONFIG_IP_SET_BITMAP_IP=y
+CONFIG_IP_SET_BITMAP_IPMAC=y
+CONFIG_IP_SET_BITMAP_PORT=y
+CONFIG_IP_SET_HASH_IP=y
+CONFIG_IP_SET_HASH_IPPORT=y
+CONFIG_IP_SET_HASH_IPPORTIP=y
+CONFIG_IP_SET_HASH_IPPORTNET=y
+CONFIG_IP_SET_HASH_NET=y
+CONFIG_IP_SET_HASH_NETPORT=y
+CONFIG_IP_SET_HASH_NETIFACE=y
+CONFIG_IP_SET_LIST_SET=y
+CONFIG_IP_VS=y
+CONFIG_IP_VS_IPV6=y
+# CONFIG_IP_VS_DEBUG is not set
+CONFIG_IP_VS_TAB_BITS=12
+
+#
+# IPVS transport protocol load balancing support
+#
+CONFIG_IP_VS_PROTO_TCP=y
+CONFIG_IP_VS_PROTO_UDP=y
+CONFIG_IP_VS_PROTO_AH_ESP=y
+CONFIG_IP_VS_PROTO_ESP=y
+CONFIG_IP_VS_PROTO_AH=y
+CONFIG_IP_VS_PROTO_SCTP=y
+
+#
+# IPVS scheduler
+#
+CONFIG_IP_VS_RR=y
+CONFIG_IP_VS_WRR=y
+CONFIG_IP_VS_LC=y
+CONFIG_IP_VS_WLC=y
+CONFIG_IP_VS_LBLC=y
+CONFIG_IP_VS_LBLCR=y
+CONFIG_IP_VS_DH=y
+CONFIG_IP_VS_SH=y
+CONFIG_IP_VS_SED=y
+CONFIG_IP_VS_NQ=y
+
+#
+# IPVS application helper
+#
+CONFIG_IP_VS_FTP=y
+CONFIG_IP_VS_NFCT=y
+CONFIG_IP_VS_PE_SIP=y
+
+#
+# IP: Netfilter Configuration
+#
+CONFIG_NF_DEFRAG_IPV4=y
+CONFIG_NF_CONNTRACK_IPV4=y
+CONFIG_NF_CONNTRACK_PROC_COMPAT=y
+CONFIG_IP_NF_QUEUE=y
+CONFIG_IP_NF_IPTABLES=y
+CONFIG_IP_NF_MATCH_AH=y
+CONFIG_IP_NF_MATCH_ECN=y
+CONFIG_IP_NF_MATCH_TTL=y
+CONFIG_IP_NF_FILTER=y
+CONFIG_IP_NF_TARGET_REJECT=y
+CONFIG_IP_NF_TARGET_LOG=y
+CONFIG_IP_NF_TARGET_ULOG=y
+CONFIG_NF_NAT=y
+CONFIG_NF_NAT_NEEDED=y
+CONFIG_IP_NF_TARGET_MASQUERADE=y
+CONFIG_IP_NF_TARGET_NETMAP=y
+CONFIG_IP_NF_TARGET_REDIRECT=y
+CONFIG_NF_NAT_SNMP_BASIC=y
+CONFIG_NF_NAT_PROTO_DCCP=y
+CONFIG_NF_NAT_PROTO_GRE=y
+CONFIG_NF_NAT_PROTO_UDPLITE=y
+CONFIG_NF_NAT_PROTO_SCTP=y
+CONFIG_NF_NAT_FTP=y
+CONFIG_NF_NAT_IRC=y
+CONFIG_NF_NAT_TFTP=y
+CONFIG_NF_NAT_AMANDA=y
+CONFIG_NF_NAT_PPTP=y
+CONFIG_NF_NAT_H323=y
+CONFIG_NF_NAT_SIP=y
+CONFIG_IP_NF_MANGLE=y
+CONFIG_IP_NF_TARGET_CLUSTERIP=y
+CONFIG_IP_NF_TARGET_ECN=y
+CONFIG_IP_NF_TARGET_TTL=y
+CONFIG_IP_NF_RAW=y
+CONFIG_IP_NF_ARPTABLES=y
+CONFIG_IP_NF_ARPFILTER=y
+CONFIG_IP_NF_ARP_MANGLE=y
+
+#
+# IPv6: Netfilter Configuration
+#
+CONFIG_NF_DEFRAG_IPV6=y
+CONFIG_NF_CONNTRACK_IPV6=y
+CONFIG_IP6_NF_QUEUE=y
+CONFIG_IP6_NF_IPTABLES=y
+CONFIG_IP6_NF_MATCH_AH=y
+CONFIG_IP6_NF_MATCH_EUI64=y
+CONFIG_IP6_NF_MATCH_FRAG=y
+CONFIG_IP6_NF_MATCH_OPTS=y
+CONFIG_IP6_NF_MATCH_HL=y
+CONFIG_IP6_NF_MATCH_IPV6HEADER=y
+CONFIG_IP6_NF_MATCH_MH=y
+CONFIG_IP6_NF_MATCH_RT=y
+CONFIG_IP6_NF_TARGET_HL=y
+CONFIG_IP6_NF_TARGET_LOG=y
+CONFIG_IP6_NF_FILTER=y
+CONFIG_IP6_NF_TARGET_REJECT=y
+CONFIG_IP6_NF_MANGLE=y
+CONFIG_IP6_NF_RAW=y
+# CONFIG_IP_DCCP is not set
+CONFIG_IP_SCTP=y
+# CONFIG_SCTP_DBG_MSG is not set
+# CONFIG_SCTP_DBG_OBJCNT is not set
+# CONFIG_SCTP_HMAC_NONE is not set
+# CONFIG_SCTP_HMAC_SHA1 is not set
+CONFIG_SCTP_HMAC_MD5=y
+# CONFIG_RDS is not set
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_L2TP is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_NET_DSA is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_PHONET is not set
+# CONFIG_IEEE802154 is not set
+# CONFIG_NET_SCHED is not set
+# CONFIG_DCB is not set
+CONFIG_DNS_RESOLVER=y
+# CONFIG_BATMAN_ADV is not set
+CONFIG_RPS=y
+CONFIG_RFS_ACCEL=y
+CONFIG_XPS=y
+CONFIG_BQL=y
+# CONFIG_BPF_JIT is not set
+
+#
+# Network testing
+#
+CONFIG_NET_PKTGEN=y
+CONFIG_NET_DROP_MONITOR=y
+# CONFIG_HAMRADIO is not set
+# CONFIG_CAN is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+CONFIG_AF_RXRPC=y
+# CONFIG_AF_RXRPC_DEBUG is not set
+# CONFIG_RXKAD is not set
+CONFIG_FIB_RULES=y
+CONFIG_WIRELESS=y
+# CONFIG_CFG80211 is not set
+CONFIG_LIB80211=y
+# CONFIG_LIB80211_DEBUG is not set
+
+#
+# CFG80211 needs to be enabled for MAC80211
+#
+# CONFIG_WIMAX is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
+# CONFIG_CAIF is not set
+CONFIG_CEPH_LIB=y
+# CONFIG_CEPH_LIB_PRETTYDEBUG is not set
+# CONFIG_CEPH_LIB_USE_DNS_RESOLVER is not set
+# CONFIG_NFC is not set
+CONFIG_HAVE_BPF_JIT=y
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_UEVENT_HELPER_PATH=""
+CONFIG_DEVTMPFS=y
+# CONFIG_DEVTMPFS_MOUNT is not set
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_FIRMWARE_IN_KERNEL is not set
+CONFIG_EXTRA_FIRMWARE=""
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+CONFIG_SYS_HYPERVISOR=y
+# CONFIG_GENERIC_CPU_DEVICES is not set
+CONFIG_CONNECTOR=y
+CONFIG_PROC_EVENTS=y
+# CONFIG_MTD is not set
+# CONFIG_PARPORT is not set
+CONFIG_PNP=y
+CONFIG_PNP_DEBUG_MESSAGES=y
+
+#
+# Protocols
+#
+CONFIG_PNPACPI=y
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+# CONFIG_BLK_DEV_DRBD is not set
+CONFIG_BLK_DEV_NBD=y
+# CONFIG_BLK_DEV_OSD is not set
+CONFIG_BLK_DEV_SX8=y
+# CONFIG_BLK_DEV_UB is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=65536
+# CONFIG_BLK_DEV_XIP is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_XEN_BLKDEV_FRONTEND is not set
+# CONFIG_XEN_BLKDEV_BACKEND is not set
+# CONFIG_BLK_DEV_HD is not set
+# CONFIG_BLK_DEV_RBD is not set
+# CONFIG_SENSORS_LIS3LV02D is not set
+CONFIG_MISC_DEVICES=y
+# CONFIG_AD525X_DPOT is not set
+# CONFIG_IBM_ASM is not set
+# CONFIG_PHANTOM is not set
+# CONFIG_INTEL_MID_PTI is not set
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
+# CONFIG_ICS932S401 is not set
+# CONFIG_ENCLOSURE_SERVICES is not set
+# CONFIG_HP_ILO is not set
+# CONFIG_APDS9802ALS is not set
+# CONFIG_ISL29003 is not set
+# CONFIG_ISL29020 is not set
+# CONFIG_SENSORS_TSL2550 is not set
+# CONFIG_SENSORS_BH1780 is not set
+# CONFIG_SENSORS_BH1770 is not set
+# CONFIG_SENSORS_APDS990X is not set
+# CONFIG_HMC6352 is not set
+# CONFIG_DS1682 is not set
+CONFIG_TI_DAC7512=y
+# CONFIG_VMWARE_BALLOON is not set
+# CONFIG_BMP085 is not set
+# CONFIG_PCH_PHUB is not set
+# CONFIG_USB_SWITCH_FSA9480 is not set
+CONFIG_EARLY_DMA_ALLOC=y
+CONFIG_EDA_DEF_SIZE=0x04000000
+CONFIG_EDA_DEF_ALIGN=0x00100000
+# CONFIG_RETIMER_CLASS is not set
+# CONFIG_DS100DF410 is not set
+# CONFIG_C2PORT is not set
+
+#
+# EEPROM support
+#
+CONFIG_EEPROM_CLASS=y
+CONFIG_EEPROM_AT24=y
+CONFIG_EEPROM_AT25=y
+# CONFIG_EEPROM_LEGACY is not set
+# CONFIG_EEPROM_MAX6875 is not set
+CONFIG_EEPROM_ACCTON_AS5712_54x_SFP=y
+CONFIG_EEPROM_ACCTON_AS6712_32x_SFP=y
+CONFIG_EEPROM_ACCTON_AS7512_32x_SFP=y
+CONFIG_EEPROM_ACCTON_AS7712_32x_SFP=y
+CONFIG_EEPROM_93CX6=y
+# CONFIG_EEPROM_93XX46 is not set
+CONFIG_EEPROM_SFF_8436=y
+CONFIG_CB710_CORE=y
+# CONFIG_CB710_DEBUG is not set
+CONFIG_CB710_DEBUG_ASSUMPTIONS=y
+# CONFIG_IWMC3200TOP is not set
+
+#
+# Texas Instruments shared transport line discipline
+#
+# CONFIG_TI_ST is not set
+# CONFIG_SENSORS_LIS3_I2C is not set
+
+#
+# Altera FPGA firmware download module
+#
+# CONFIG_ALTERA_STAPL is not set
+CONFIG_HAVE_IDE=y
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+CONFIG_SCSI_MOD=y
+CONFIG_RAID_ATTRS=y
+CONFIG_SCSI=y
+CONFIG_SCSI_DMA=y
+CONFIG_SCSI_TGT=y
+CONFIG_SCSI_NETLINK=y
+# CONFIG_SCSI_PROC_FS is not set
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+# CONFIG_BLK_DEV_SR is not set
+CONFIG_CHR_DEV_SG=y
+# CONFIG_CHR_DEV_SCH is not set
+CONFIG_SCSI_MULTI_LUN=y
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+# CONFIG_SCSI_SCAN_ASYNC is not set
+CONFIG_SCSI_WAIT_SCAN=m
+
+#
+# SCSI Transports
+#
+CONFIG_SCSI_SPI_ATTRS=y
+CONFIG_SCSI_FC_ATTRS=y
+CONFIG_SCSI_FC_TGT_ATTRS=y
+CONFIG_SCSI_ISCSI_ATTRS=y
+CONFIG_SCSI_SAS_ATTRS=y
+CONFIG_SCSI_SAS_LIBSAS=y
+CONFIG_SCSI_SAS_ATA=y
+CONFIG_SCSI_SAS_HOST_SMP=y
+CONFIG_SCSI_SRP_ATTRS=y
+CONFIG_SCSI_SRP_TGT_ATTRS=y
+CONFIG_SCSI_LOWLEVEL=y
+CONFIG_ISCSI_TCP=y
+CONFIG_ISCSI_BOOT_SYSFS=y
+CONFIG_SCSI_CXGB3_ISCSI=y
+CONFIG_SCSI_CXGB4_ISCSI=y
+CONFIG_SCSI_BNX2_ISCSI=y
+CONFIG_SCSI_BNX2X_FCOE=y
+CONFIG_BE2ISCSI=y
+CONFIG_BLK_DEV_3W_XXXX_RAID=y
+CONFIG_SCSI_HPSA=y
+CONFIG_SCSI_3W_9XXX=y
+CONFIG_SCSI_3W_SAS=y
+CONFIG_SCSI_ACARD=y
+CONFIG_SCSI_AACRAID=y
+CONFIG_SCSI_AIC7XXX=y
+CONFIG_AIC7XXX_CMDS_PER_DEVICE=8
+CONFIG_AIC7XXX_RESET_DELAY_MS=15000
+CONFIG_AIC7XXX_DEBUG_ENABLE=y
+CONFIG_AIC7XXX_DEBUG_MASK=0
+CONFIG_AIC7XXX_REG_PRETTY_PRINT=y
+CONFIG_SCSI_AIC7XXX_OLD=y
+CONFIG_SCSI_AIC79XX=y
+CONFIG_AIC79XX_CMDS_PER_DEVICE=32
+CONFIG_AIC79XX_RESET_DELAY_MS=15000
+CONFIG_AIC79XX_DEBUG_ENABLE=y
+CONFIG_AIC79XX_DEBUG_MASK=0
+CONFIG_AIC79XX_REG_PRETTY_PRINT=y
+CONFIG_SCSI_AIC94XX=y
+# CONFIG_AIC94XX_DEBUG is not set
+CONFIG_SCSI_MVSAS=y
+# CONFIG_SCSI_MVSAS_DEBUG is not set
+# CONFIG_SCSI_MVSAS_TASKLET is not set
+CONFIG_SCSI_MVUMI=y
+CONFIG_SCSI_DPT_I2O=y
+CONFIG_SCSI_ADVANSYS=y
+CONFIG_SCSI_ARCMSR=y
+CONFIG_MEGARAID_NEWGEN=y
+CONFIG_MEGARAID_MM=y
+CONFIG_MEGARAID_MAILBOX=y
+CONFIG_MEGARAID_LEGACY=y
+CONFIG_MEGARAID_SAS=y
+CONFIG_SCSI_MPT2SAS=y
+CONFIG_SCSI_MPT2SAS_MAX_SGE=128
+# CONFIG_SCSI_MPT2SAS_LOGGING is not set
+CONFIG_SCSI_HPTIOP=y
+CONFIG_SCSI_BUSLOGIC=y
+CONFIG_VMWARE_PVSCSI=y
+CONFIG_LIBFC=y
+CONFIG_LIBFCOE=y
+CONFIG_FCOE=y
+CONFIG_FCOE_FNIC=y
+CONFIG_SCSI_DMX3191D=y
+CONFIG_SCSI_EATA=y
+CONFIG_SCSI_EATA_TAGGED_QUEUE=y
+CONFIG_SCSI_EATA_LINKED_COMMANDS=y
+CONFIG_SCSI_EATA_MAX_TAGS=16
+CONFIG_SCSI_FUTURE_DOMAIN=y
+CONFIG_SCSI_GDTH=y
+CONFIG_SCSI_ISCI=y
+CONFIG_SCSI_IPS=y
+CONFIG_SCSI_INITIO=y
+CONFIG_SCSI_INIA100=y
+CONFIG_SCSI_STEX=y
+CONFIG_SCSI_SYM53C8XX_2=y
+CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
+CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
+CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
+CONFIG_SCSI_SYM53C8XX_MMIO=y
+CONFIG_SCSI_IPR=y
+# CONFIG_SCSI_IPR_TRACE is not set
+# CONFIG_SCSI_IPR_DUMP is not set
+CONFIG_SCSI_QLOGIC_1280=y
+CONFIG_SCSI_QLA_FC=y
+CONFIG_SCSI_QLA_ISCSI=y
+CONFIG_SCSI_LPFC=y
+# CONFIG_SCSI_LPFC_DEBUG_FS is not set
+CONFIG_SCSI_DC395x=y
+CONFIG_SCSI_DC390T=y
+CONFIG_SCSI_DEBUG=y
+CONFIG_SCSI_PMCRAID=y
+CONFIG_SCSI_PM8001=y
+CONFIG_SCSI_SRP=y
+CONFIG_SCSI_BFA_FC=y
+CONFIG_SCSI_LOWLEVEL_PCMCIA=y
+# CONFIG_PCMCIA_AHA152X is not set
+# CONFIG_PCMCIA_FDOMAIN is not set
+# CONFIG_PCMCIA_QLOGIC is not set
+# CONFIG_PCMCIA_SYM53C500 is not set
+CONFIG_SCSI_DH=y
+CONFIG_SCSI_DH_RDAC=y
+CONFIG_SCSI_DH_HP_SW=y
+CONFIG_SCSI_DH_EMC=y
+CONFIG_SCSI_DH_ALUA=y
+CONFIG_SCSI_OSD_INITIATOR=y
+CONFIG_SCSI_OSD_ULD=y
+CONFIG_SCSI_OSD_DPRINT_SENSE=1
+# CONFIG_SCSI_OSD_DEBUG is not set
+CONFIG_ATA=y
+# CONFIG_ATA_NONSTANDARD is not set
+CONFIG_ATA_VERBOSE_ERROR=y
+CONFIG_ATA_ACPI=y
+CONFIG_SATA_PMP=y
+
+#
+# Controllers with non-SFF native interface
+#
+CONFIG_SATA_AHCI=y
+CONFIG_SATA_AHCI_PLATFORM=y
+# CONFIG_SATA_INIC162X is not set
+CONFIG_SATA_ACARD_AHCI=y
+CONFIG_SATA_SIL24=y
+CONFIG_ATA_SFF=y
+
+#
+# SFF controllers with custom DMA interface
+#
+CONFIG_PDC_ADMA=y
+CONFIG_SATA_QSTOR=y
+CONFIG_SATA_SX4=y
+CONFIG_ATA_BMDMA=y
+
+#
+# SATA SFF controllers with BMDMA
+#
+CONFIG_ATA_PIIX=y
+CONFIG_SATA_MV=y
+CONFIG_SATA_NV=y
+CONFIG_SATA_PROMISE=y
+CONFIG_SATA_SIL=y
+CONFIG_SATA_SIS=y
+CONFIG_SATA_SVW=y
+CONFIG_SATA_ULI=y
+CONFIG_SATA_VIA=y
+CONFIG_SATA_VITESSE=y
+
+#
+# PATA SFF controllers with BMDMA
+#
+CONFIG_PATA_ALI=y
+CONFIG_PATA_AMD=y
+CONFIG_PATA_ARTOP=y
+CONFIG_PATA_ATIIXP=y
+CONFIG_PATA_ATP867X=y
+CONFIG_PATA_CMD64X=y
+CONFIG_PATA_CS5520=y
+CONFIG_PATA_CS5530=y
+# CONFIG_PATA_CS5536 is not set
+# CONFIG_PATA_CYPRESS is not set
+CONFIG_PATA_EFAR=y
+CONFIG_PATA_HPT366=y
+CONFIG_PATA_HPT37X=y
+# CONFIG_PATA_HPT3X2N is not set
+# CONFIG_PATA_HPT3X3 is not set
+CONFIG_PATA_IT8213=y
+CONFIG_PATA_IT821X=y
+CONFIG_PATA_JMICRON=y
+CONFIG_PATA_MARVELL=y
+CONFIG_PATA_NETCELL=y
+CONFIG_PATA_NINJA32=y
+CONFIG_PATA_NS87415=y
+CONFIG_PATA_OLDPIIX=y
+# CONFIG_PATA_OPTIDMA is not set
+CONFIG_PATA_PDC2027X=y
+CONFIG_PATA_PDC_OLD=y
+# CONFIG_PATA_RADISYS is not set
+CONFIG_PATA_RDC=y
+CONFIG_PATA_SC1200=y
+CONFIG_PATA_SCH=y
+CONFIG_PATA_SERVERWORKS=y
+CONFIG_PATA_SIL680=y
+CONFIG_PATA_SIS=y
+CONFIG_PATA_TOSHIBA=y
+CONFIG_PATA_TRIFLEX=y
+CONFIG_PATA_VIA=y
+# CONFIG_PATA_WINBOND is not set
+
+#
+# PIO-only SFF controllers
+#
+# CONFIG_PATA_CMD640_PCI is not set
+CONFIG_PATA_MPIIX=y
+CONFIG_PATA_NS87410=y
+# CONFIG_PATA_OPTI is not set
+CONFIG_PATA_PCMCIA=y
+CONFIG_PATA_PLATFORM=y
+CONFIG_PATA_RZ1000=y
+
+#
+# Generic fallback / legacy drivers
+#
+# CONFIG_PATA_ACPI is not set
+CONFIG_ATA_GENERIC=y
+# CONFIG_PATA_LEGACY is not set
+# CONFIG_MD is not set
+# CONFIG_TARGET_CORE is not set
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+CONFIG_FIREWIRE=y
+CONFIG_FIREWIRE_OHCI=y
+CONFIG_FIREWIRE_OHCI_DEBUG=y
+CONFIG_FIREWIRE_SBP2=y
+CONFIG_FIREWIRE_NET=y
+CONFIG_FIREWIRE_NOSY=y
+# CONFIG_I2O is not set
+# CONFIG_MACINTOSH_DRIVERS is not set
+CONFIG_NETDEVICES=y
+CONFIG_NET_CORE=y
+# CONFIG_BONDING is not set
+# CONFIG_DUMMY is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_NET_FC is not set
+CONFIG_MII=y
+# CONFIG_MACVLAN is not set
+# CONFIG_VXLAN is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+CONFIG_TUN=y
+CONFIG_VETH=y
+# CONFIG_ARCNET is not set
+
+#
+# CAIF transport drivers
+#
+CONFIG_ETHERNET=y
+CONFIG_MDIO=y
+# CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_NET_VENDOR_ADAPTEC is not set
+# CONFIG_NET_VENDOR_ALTEON is not set
+# CONFIG_NET_VENDOR_AMD is not set
+# CONFIG_NET_VENDOR_ATHEROS is not set
+CONFIG_NET_VENDOR_BROADCOM=y
+CONFIG_B44=y
+CONFIG_B44_PCI_AUTOSELECT=y
+CONFIG_B44_PCICORE_AUTOSELECT=y
+CONFIG_B44_PCI=y
+CONFIG_BNX2=y
+CONFIG_CNIC=y
+CONFIG_TIGON3=y
+CONFIG_BNX2X=y
+# CONFIG_NET_VENDOR_BROCADE is not set
+CONFIG_NET_VENDOR_CHELSIO=y
+# CONFIG_CHELSIO_T1 is not set
+CONFIG_CHELSIO_T3=y
+CONFIG_CHELSIO_T4=y
+CONFIG_CHELSIO_T4VF=y
+# CONFIG_NET_VENDOR_CISCO is not set
+# CONFIG_DNET is not set
+# CONFIG_NET_VENDOR_DEC is not set
+# CONFIG_NET_VENDOR_DLINK is not set
+# CONFIG_NET_VENDOR_EMULEX is not set
+# CONFIG_NET_VENDOR_EXAR is not set
+# CONFIG_NET_VENDOR_FUJITSU is not set
+# CONFIG_NET_VENDOR_HP is not set
+CONFIG_NET_VENDOR_INTEL=y
+# CONFIG_E100 is not set
+CONFIG_E1000=y
+CONFIG_E1000E=y
+# CONFIG_E1000E_PTP is not set
+CONFIG_IGB=y
+CONFIG_IGB_HWMON=y
+# CONFIG_IGB_PTP is not set
+CONFIG_IGBVF=y
+CONFIG_IXGB=y
+CONFIG_IXGBE=y
+CONFIG_IXGBEVF=y
+CONFIG_NET_VENDOR_I825XX=y
+# CONFIG_ZNET is not set
+# CONFIG_IP1000 is not set
+# CONFIG_JME is not set
+# CONFIG_NET_VENDOR_MARVELL is not set
+CONFIG_NET_VENDOR_MELLANOX=y
+# CONFIG_MLX4_EN is not set
+# CONFIG_MLX4_CORE is not set
+# CONFIG_NET_VENDOR_MICREL is not set
+CONFIG_NET_VENDOR_MICROCHIP=y
+CONFIG_ENC28J60=y
+CONFIG_ENC28J60_WRITEVERIFY=y
+# CONFIG_NET_VENDOR_MYRI is not set
+# CONFIG_FEALNX is not set
+# CONFIG_NET_VENDOR_NATSEMI is not set
+# CONFIG_NET_VENDOR_NVIDIA is not set
+# CONFIG_NET_VENDOR_OKI is not set
+# CONFIG_ETHOC is not set
+# CONFIG_NET_PACKET_ENGINE is not set
+# CONFIG_NET_VENDOR_QLOGIC is not set
+CONFIG_NET_VENDOR_REALTEK=y
+# CONFIG_8139CP is not set
+# CONFIG_8139TOO is not set
+CONFIG_R8169=y
+# CONFIG_NET_VENDOR_RDC is not set
+# CONFIG_NET_VENDOR_SEEQ is not set
+# CONFIG_NET_VENDOR_SILAN is not set
+# CONFIG_NET_VENDOR_SIS is not set
+# CONFIG_SFC is not set
+# CONFIG_NET_VENDOR_SMSC is not set
+# CONFIG_NET_VENDOR_STMICRO is not set
+# CONFIG_NET_VENDOR_SUN is not set
+# CONFIG_NET_VENDOR_TEHUTI is not set
+# CONFIG_NET_VENDOR_TI is not set
+# CONFIG_NET_VENDOR_VIA is not set
+# CONFIG_NET_VENDOR_XIRCOM is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_NET_SB1000 is not set
+CONFIG_PHYLIB=y
+
+#
+# MII PHY device drivers
+#
+CONFIG_MARVELL_PHY=y
+CONFIG_DAVICOM_PHY=y
+CONFIG_QSEMI_PHY=y
+CONFIG_LXT_PHY=y
+CONFIG_CICADA_PHY=y
+CONFIG_VITESSE_PHY=y
+CONFIG_SMSC_PHY=y
+CONFIG_BROADCOM_PHY=y
+# CONFIG_ICPLUS_PHY is not set
+CONFIG_REALTEK_PHY=y
+CONFIG_NATIONAL_PHY=y
+CONFIG_STE10XP=y
+CONFIG_LSI_ET1011C_PHY=y
+CONFIG_MICREL_PHY=y
+CONFIG_FIXED_PHY=y
+CONFIG_MDIO_BITBANG=y
+# CONFIG_MDIO_GPIO is not set
+CONFIG_PPP=y
+# CONFIG_PPP_BSDCOMP is not set
+# CONFIG_PPP_DEFLATE is not set
+# CONFIG_PPP_FILTER is not set
+# CONFIG_PPP_MPPE is not set
+# CONFIG_PPP_MULTILINK is not set
+# CONFIG_PPPOE is not set
+# CONFIG_PPP_ASYNC is not set
+# CONFIG_PPP_SYNC_TTY is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=y
+# CONFIG_TR is not set
+
+#
+# USB Network Adapters
+#
+# CONFIG_USB_CATC is not set
+# CONFIG_USB_KAWETH is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_RTL8150 is not set
+# CONFIG_USB_USBNET is not set
+# CONFIG_USB_IPHETH is not set
+# CONFIG_WLAN is not set
+
+#
+# Enable WiMAX (Networking options) to see the WiMAX drivers
+#
+# CONFIG_WAN is not set
+# CONFIG_XEN_NETDEV_FRONTEND is not set
+# CONFIG_XEN_NETDEV_BACKEND is not set
+# CONFIG_VMXNET3 is not set
+# CONFIG_DPAA_ETH_USE_NDO_SELECT_QUEUE is not set
+# CONFIG_ISDN is not set
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+CONFIG_INPUT_FF_MEMLESS=y
+CONFIG_INPUT_POLLDEV=y
+CONFIG_INPUT_SPARSEKMAP=y
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+CONFIG_INPUT_JOYDEV=y
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TABLET is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_VT_CONSOLE=y
+CONFIG_VT_CONSOLE_SLEEP=y
+CONFIG_HW_CONSOLE=y
+CONFIG_VT_HW_CONSOLE_BINDING=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_DEVPTS_MULTIPLE_INSTANCES=y
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_SERIAL_NONSTANDARD=y
+# CONFIG_ROCKETPORT is not set
+# CONFIG_CYCLADES is not set
+# CONFIG_MOXA_INTELLIO is not set
+# CONFIG_MOXA_SMARTIO is not set
+# CONFIG_SYNCLINK is not set
+# CONFIG_SYNCLINKMP is not set
+# CONFIG_SYNCLINK_GT is not set
+# CONFIG_NOZOMI is not set
+# CONFIG_ISI is not set
+# CONFIG_N_HDLC is not set
+# CONFIG_N_GSM is not set
+# CONFIG_TRACE_SINK is not set
+# CONFIG_DEVKMEM is not set
+# CONFIG_STALDRV is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_FIX_EARLYCON_MEM=y
+CONFIG_SERIAL_8250_PCI=y
+CONFIG_SERIAL_8250_PNP=y
+CONFIG_SERIAL_8250_CS=y
+CONFIG_SERIAL_8250_NR_UARTS=32
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+CONFIG_SERIAL_8250_RSA=y
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_MAX3100 is not set
+# CONFIG_SERIAL_MAX3107 is not set
+CONFIG_SERIAL_MFD_HSU=y
+# CONFIG_SERIAL_MFD_HSU_CONSOLE is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_SERIAL_JSM=y
+# CONFIG_SERIAL_TIMBERDALE is not set
+# CONFIG_SERIAL_ALTERA_JTAGUART is not set
+# CONFIG_SERIAL_ALTERA_UART is not set
+# CONFIG_SERIAL_IFX6X60 is not set
+CONFIG_SERIAL_PCH_UART=y
+# CONFIG_SERIAL_XILINX_PS_UART is not set
+# CONFIG_TTY_PRINTK is not set
+# CONFIG_HVC_XEN is not set
+# CONFIG_IPMI_HANDLER is not set
+CONFIG_HW_RANDOM=y
+CONFIG_HW_RANDOM_TIMERIOMEM=y
+CONFIG_HW_RANDOM_INTEL=y
+CONFIG_HW_RANDOM_AMD=y
+CONFIG_HW_RANDOM_VIA=y
+CONFIG_NVRAM=y
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# PCMCIA character devices
+#
+CONFIG_SYNCLINK_CS=y
+CONFIG_CARDMAN_4000=y
+CONFIG_CARDMAN_4040=y
+CONFIG_IPWIRELESS=y
+# CONFIG_MWAVE is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_HPET is not set
+# CONFIG_HANGCHECK_TIMER is not set
+# CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
+CONFIG_DEVPORT=y
+# CONFIG_RAMOOPS is not set
+CONFIG_I2C=y
+CONFIG_I2C_BOARDINFO=y
+CONFIG_I2C_COMPAT=y
+CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_MUX=y
+
+#
+# Multiplexer I2C Chip support
+#
+CONFIG_I2C_MUX_ACCTON_AS5712_54x_CPLD=y
+CONFIG_I2C_MUX_ACCTON_AS6712_32x_CPLD=y
+CONFIG_I2C_MUX_GPIO=y
+CONFIG_I2C_MUX_PCA9541=y
+CONFIG_I2C_MUX_PCA954x=y
+CONFIG_I2C_MUX_PCA954X_DESELECT_ON_EXIT=y
+# CONFIG_I2C_MUX_DNI_6448 is not set
+# CONFIG_I2C_MUX_QUANTA is not set
+# CONFIG_I2C_MUX_QUANTA_LY2 is not set
+CONFIG_I2C_HELPER_AUTO=y
+CONFIG_I2C_ALGOBIT=y
+CONFIG_I2C_ALGOPCA=y
+
+#
+# I2C Hardware Bus support
+#
+
+#
+# PC SMBus host controller drivers
+#
+# CONFIG_I2C_ALI1535 is not set
+# CONFIG_I2C_ALI1563 is not set
+# CONFIG_I2C_ALI15X3 is not set
+# CONFIG_I2C_AMD756 is not set
+# CONFIG_I2C_AMD8111 is not set
+CONFIG_I2C_I801=y
+CONFIG_I2C_ISCH=y
+CONFIG_I2C_ISMT=y
+# CONFIG_I2C_PIIX4 is not set
+# CONFIG_I2C_NFORCE2 is not set
+# CONFIG_I2C_SIS5595 is not set
+# CONFIG_I2C_SIS630 is not set
+# CONFIG_I2C_SIS96X is not set
+# CONFIG_I2C_VIA is not set
+# CONFIG_I2C_VIAPRO is not set
+
+#
+# ACPI drivers
+#
+# CONFIG_I2C_SCMI is not set
+
+#
+# I2C system bus drivers (mostly embedded / system-on-chip)
+#
+# CONFIG_I2C_DESIGNWARE_PCI is not set
+# CONFIG_I2C_GPIO is not set
+# CONFIG_I2C_INTEL_MID is not set
+# CONFIG_I2C_OCORES is not set
+CONFIG_I2C_PCA_PLATFORM=y
+# CONFIG_I2C_PXA_PCI is not set
+# CONFIG_I2C_SIMTEC is not set
+# CONFIG_I2C_XILINX is not set
+# CONFIG_I2C_EG20T is not set
+
+#
+# External I2C/SMBus adapter drivers
+#
+# CONFIG_I2C_DIOLAN_U2C is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_TAOS_EVM is not set
+# CONFIG_I2C_TINY_USB is not set
+
+#
+# Other I2C/SMBus bus drivers
+#
+# CONFIG_I2C_STUB is not set
+# CONFIG_I2C_DEBUG_CORE is not set
+# CONFIG_I2C_DEBUG_ALGO is not set
+# CONFIG_I2C_DEBUG_BUS is not set
+CONFIG_SPI=y
+# CONFIG_SPI_DEBUG is not set
+CONFIG_SPI_MASTER=y
+
+#
+# SPI Master Controller Drivers
+#
+# CONFIG_SPI_ALTERA is not set
+# CONFIG_SPI_BITBANG is not set
+# CONFIG_SPI_GPIO is not set
+# CONFIG_SPI_OC_TINY is not set
+# CONFIG_SPI_PXA2XX_PCI is not set
+# CONFIG_SPI_TOPCLIFF_PCH is not set
+# CONFIG_SPI_XILINX is not set
+# CONFIG_SPI_DESIGNWARE is not set
+
+#
+# SPI Protocol Masters
+#
+# CONFIG_SPI_SPIDEV is not set
+# CONFIG_SPI_TLE62X0 is not set
+
+#
+# PPS support
+#
+CONFIG_PPS=y
+# CONFIG_PPS_DEBUG is not set
+
+#
+# PPS clients support
+#
+# CONFIG_PPS_CLIENT_KTIMER is not set
+# CONFIG_PPS_CLIENT_LDISC is not set
+# CONFIG_PPS_CLIENT_GPIO is not set
+
+#
+# PPS generators support
+#
+
+#
+# PTP clock support
+#
+# CONFIG_PTP_1588_CLOCK is not set
+CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
+CONFIG_GPIOLIB=y
+# CONFIG_DEBUG_GPIO is not set
+CONFIG_GPIO_SYSFS=y
+CONFIG_GPIO_GENERIC=y
+CONFIG_GPIO_MAX730X=y
+
+#
+# Memory mapped GPIO drivers:
+#
+CONFIG_GPIO_GENERIC_PLATFORM=y
+# CONFIG_GPIO_IT8761E is not set
+CONFIG_GPIO_SCH=y
+# CONFIG_GPIO_VX855 is not set
+
+#
+# I2C GPIO expanders:
+#
+# CONFIG_GPIO_MAX7300 is not set
+# CONFIG_GPIO_MAX732X is not set
+CONFIG_GPIO_PCA953X=y
+# CONFIG_GPIO_PCA953X_IRQ is not set
+CONFIG_GPIO_PCF857X=y
+# CONFIG_GPIO_SX150X is not set
+# CONFIG_GPIO_ADP5588 is not set
+
+#
+# PCI GPIO expanders:
+#
+# CONFIG_GPIO_BT8XX is not set
+# CONFIG_GPIO_LANGWELL is not set
+# CONFIG_GPIO_PCH is not set
+# CONFIG_GPIO_ML_IOH is not set
+# CONFIG_GPIO_RDC321X is not set
+
+#
+# SPI GPIO expanders:
+#
+CONFIG_GPIO_MAX7301=y
+# CONFIG_GPIO_MCP23S08 is not set
+CONFIG_GPIO_MC33880=y
+CONFIG_GPIO_74X164=y
+
+#
+# AC97 GPIO expanders:
+#
+
+#
+# MODULbus GPIO expanders:
+#
+# CONFIG_W1 is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+# CONFIG_PDA_POWER is not set
+# CONFIG_TEST_POWER is not set
+# CONFIG_BATTERY_DS2780 is not set
+# CONFIG_BATTERY_DS2782 is not set
+# CONFIG_BATTERY_BQ20Z75 is not set
+# CONFIG_BATTERY_BQ27x00 is not set
+# CONFIG_BATTERY_MAX17040 is not set
+# CONFIG_BATTERY_MAX17042 is not set
+# CONFIG_CHARGER_MAX8903 is not set
+# CONFIG_CHARGER_GPIO is not set
+CONFIG_HWMON=y
+CONFIG_HWMON_VID=y
+# CONFIG_HWMON_DEBUG_CHIP is not set
+
+#
+# Native drivers
+#
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_ABITUGURU3 is not set
+# CONFIG_SENSORS_AD7314 is not set
+# CONFIG_SENSORS_AD7414 is not set
+# CONFIG_SENSORS_AD7418 is not set
+# CONFIG_SENSORS_ADCXX is not set
+CONFIG_SENSORS_ADM1021=y
+# CONFIG_SENSORS_ADM1025 is not set
+# CONFIG_SENSORS_ADM1026 is not set
+# CONFIG_SENSORS_ADM1029 is not set
+# CONFIG_SENSORS_ADM1031 is not set
+# CONFIG_SENSORS_ADM9240 is not set
+# CONFIG_SENSORS_ADT7411 is not set
+# CONFIG_SENSORS_ADT7462 is not set
+# CONFIG_SENSORS_ADT7470 is not set
+# CONFIG_SENSORS_ADT7475 is not set
+# CONFIG_SENSORS_ASC7621 is not set
+# CONFIG_SENSORS_K8TEMP is not set
+# CONFIG_SENSORS_K10TEMP is not set
+# CONFIG_SENSORS_FAM15H_POWER is not set
+# CONFIG_SENSORS_ASB100 is not set
+# CONFIG_SENSORS_ATXP1 is not set
+# CONFIG_SENSORS_CY8CXX is not set
+# CONFIG_SENSORS_CY8C3245R1 is not set
+# CONFIG_SENSORS_DS620 is not set
+# CONFIG_SENSORS_DS1621 is not set
+# CONFIG_SENSORS_I5K_AMB is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_F71882FG is not set
+# CONFIG_SENSORS_F75375S is not set
+# CONFIG_SENSORS_FSCHMD is not set
+# CONFIG_SENSORS_G760A is not set
+# CONFIG_SENSORS_GL518SM is not set
+# CONFIG_SENSORS_GL520SM is not set
+CONFIG_SENSORS_GPIO_FAN=y
+CONFIG_SENSORS_CORETEMP=y
+# CONFIG_SENSORS_IT87 is not set
+# CONFIG_SENSORS_JC42 is not set
+# CONFIG_SENSORS_LINEAGE is not set
+# CONFIG_SENSORS_LM63 is not set
+# CONFIG_SENSORS_LM70 is not set
+# CONFIG_SENSORS_LM73 is not set
+CONFIG_SENSORS_LM75=y
+# CONFIG_SENSORS_LM77 is not set
+# CONFIG_SENSORS_LM78 is not set
+# CONFIG_SENSORS_LM80 is not set
+# CONFIG_SENSORS_LM83 is not set
+CONFIG_SENSORS_LM85=y
+# CONFIG_SENSORS_LM87 is not set
+CONFIG_SENSORS_LM90=y
+# CONFIG_SENSORS_LM92 is not set
+# CONFIG_SENSORS_LM93 is not set
+CONFIG_SENSORS_LTC4151=y
+CONFIG_SENSORS_LTC4215=y
+CONFIG_SENSORS_LTC4245=y
+CONFIG_SENSORS_LTC4261=y
+# CONFIG_SENSORS_LM95241 is not set
+# CONFIG_SENSORS_LM95245 is not set
+# CONFIG_SENSORS_MAX1111 is not set
+# CONFIG_SENSORS_MAX16065 is not set
+# CONFIG_SENSORS_MAX1619 is not set
+# CONFIG_SENSORS_MAX1668 is not set
+# CONFIG_SENSORS_MAX6639 is not set
+# CONFIG_SENSORS_MAX6642 is not set
+CONFIG_SENSORS_MAX6650=y
+CONFIG_SENSORS_MAX6620=y
+# CONFIG_SENSORS_MAX6697 is not set
+# CONFIG_SENSORS_NTC_THERMISTOR is not set
+# CONFIG_SENSORS_PC87360 is not set
+# CONFIG_SENSORS_PC87427 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_PMBUS is not set
+# CONFIG_SENSORS_SHT15 is not set
+# CONFIG_SENSORS_SHT21 is not set
+# CONFIG_SENSORS_SIS5595 is not set
+# CONFIG_SENSORS_SMM665 is not set
+# CONFIG_SENSORS_DME1737 is not set
+# CONFIG_SENSORS_EMC1403 is not set
+# CONFIG_SENSORS_EMC2103 is not set
+# CONFIG_SENSORS_EMC2305 is not set
+# CONFIG_SENSORS_EMC6W201 is not set
+# CONFIG_SENSORS_SMSC47M1 is not set
+# CONFIG_SENSORS_SMSC47M192 is not set
+# CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_SCH56XX_COMMON is not set
+# CONFIG_SENSORS_SCH5627 is not set
+# CONFIG_SENSORS_SCH5636 is not set
+# CONFIG_SENSORS_ADS1015 is not set
+# CONFIG_SENSORS_ADS7828 is not set
+# CONFIG_SENSORS_ADS7871 is not set
+# CONFIG_SENSORS_AMC6821 is not set
+# CONFIG_SENSORS_THMC50 is not set
+# CONFIG_SENSORS_TMP102 is not set
+# CONFIG_SENSORS_TMP401 is not set
+# CONFIG_SENSORS_TMP421 is not set
+# CONFIG_SENSORS_VIA_CPUTEMP is not set
+# CONFIG_SENSORS_VIA686A is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_SENSORS_VT8231 is not set
+CONFIG_SENSORS_W83781D=y
+# CONFIG_SENSORS_W83791D is not set
+# CONFIG_SENSORS_W83792D is not set
+# CONFIG_SENSORS_W83793 is not set
+# CONFIG_SENSORS_W83795 is not set
+# CONFIG_SENSORS_W83L785TS is not set
+# CONFIG_SENSORS_W83L786NG is not set
+# CONFIG_SENSORS_W83627HF is not set
+# CONFIG_SENSORS_W83627EHF is not set
+# CONFIG_SENSORS_APPLESMC is not set
+# CONFIG_SENSORS_QUANTA_LY_HWMON is not set
+CONFIG_SENSORS_CPR_4011_4MXX=y
+CONFIG_SENSORS_ACCTON_AS5712_54x_FAN=y
+CONFIG_SENSORS_ACCTON_AS5712_54x_PSU=y
+CONFIG_SENSORS_ACCTON_AS6712_32x_FAN=y
+CONFIG_SENSORS_ACCTON_AS6712_32x_PSU=y
+CONFIG_SENSORS_ACCTON_I2C_CPLD=y
+CONFIG_SENSORS_ACCTON_AS7512_32x_FAN=y
+CONFIG_SENSORS_ACCTON_AS7512_32x_PSU=y
+CONFIG_SENSORS_ACCTON_AS7712_32x_FAN=y
+CONFIG_SENSORS_ACCTON_AS7712_32x_PSU=y
+CONFIG_SENSORS_YM2651Y=y
+
+#
+# ACPI drivers
+#
+# CONFIG_SENSORS_ACPI_POWER is not set
+# CONFIG_SENSORS_ATK0110 is not set
+CONFIG_THERMAL=y
+CONFIG_THERMAL_HWMON=y
+# CONFIG_WATCHDOG is not set
+CONFIG_SSB_POSSIBLE=y
+
+#
+# Sonics Silicon Backplane
+#
+CONFIG_SSB=y
+CONFIG_SSB_SPROM=y
+CONFIG_SSB_PCIHOST_POSSIBLE=y
+CONFIG_SSB_PCIHOST=y
+# CONFIG_SSB_B43_PCI_BRIDGE is not set
+CONFIG_SSB_PCMCIAHOST_POSSIBLE=y
+CONFIG_SSB_PCMCIAHOST=y
+CONFIG_SSB_SDIOHOST_POSSIBLE=y
+CONFIG_SSB_SDIOHOST=y
+# CONFIG_SSB_SILENT is not set
+# CONFIG_SSB_DEBUG is not set
+CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y
+CONFIG_SSB_DRIVER_PCICORE=y
+CONFIG_BCMA_POSSIBLE=y
+
+#
+# Broadcom specific AMBA
+#
+CONFIG_BCMA=y
+CONFIG_BCMA_HOST_PCI_POSSIBLE=y
+CONFIG_BCMA_HOST_PCI=y
+# CONFIG_BCMA_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+CONFIG_MFD_CORE=y
+# CONFIG_MFD_88PM860X is not set
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_I2CPLD is not set
+# CONFIG_TPS6105X is not set
+# CONFIG_TPS65010 is not set
+# CONFIG_TPS6507X is not set
+# CONFIG_MFD_TPS6586X is not set
+# CONFIG_MFD_TPS65910 is not set
+# CONFIG_MFD_TPS65912_I2C is not set
+# CONFIG_MFD_TPS65912_SPI is not set
+# CONFIG_TWL4030_CORE is not set
+# CONFIG_MFD_STMPE is not set
+# CONFIG_MFD_TC3589X is not set
+# CONFIG_MFD_TMIO is not set
+# CONFIG_PMIC_DA903X is not set
+# CONFIG_PMIC_ADP5520 is not set
+# CONFIG_MFD_MAX8925 is not set
+# CONFIG_MFD_MAX8997 is not set
+# CONFIG_MFD_MAX8998 is not set
+# CONFIG_MFD_WM8400 is not set
+# CONFIG_MFD_WM831X_I2C is not set
+# CONFIG_MFD_WM831X_SPI is not set
+# CONFIG_MFD_WM8350_I2C is not set
+# CONFIG_MFD_WM8994 is not set
+# CONFIG_MFD_PCF50633 is not set
+# CONFIG_MFD_MC13XXX is not set
+# CONFIG_ABX500_CORE is not set
+# CONFIG_EZX_PCAP is not set
+# CONFIG_MFD_CS5535 is not set
+# CONFIG_MFD_TIMBERDALE is not set
+CONFIG_LPC_SCH=y
+# CONFIG_MFD_RDC321X is not set
+# CONFIG_MFD_JANZ_CMODIO is not set
+# CONFIG_MFD_VX855 is not set
+CONFIG_MFD_WL1273_CORE=y
+# CONFIG_MFD_AAT2870_CORE is not set
+# CONFIG_REGULATOR is not set
+# CONFIG_MEDIA_SUPPORT is not set
+
+#
+# Graphics support
+#
+# CONFIG_AGP is not set
+# CONFIG_VGA_ARB is not set
+# CONFIG_VGA_SWITCHEROO is not set
+# CONFIG_DRM is not set
+# CONFIG_STUB_POULSBO is not set
+# CONFIG_VGASTATE is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+# CONFIG_FB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Display device support
+#
+CONFIG_DISPLAY_SUPPORT=y
+
+#
+# Display hardware drivers
+#
+
+#
+# Console display driver support
+#
+CONFIG_VGA_CONSOLE=y
+# CONFIG_VGACON_SOFT_SCROLLBACK is not set
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_SOUND is not set
+# CONFIG_HID_SUPPORT is not set
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_COMMON=y
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+CONFIG_USB_ARCH_HAS_EHCI=y
+CONFIG_USB_ARCH_HAS_XHCI=y
+CONFIG_USB=y
+# CONFIG_USB_DEBUG is not set
+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
+
+#
+# Miscellaneous USB options
+#
+# CONFIG_USB_DEVICEFS is not set
+CONFIG_USB_DEVICE_CLASS=y
+# CONFIG_USB_DYNAMIC_MINORS is not set
+# CONFIG_USB_OTG_WHITELIST is not set
+# CONFIG_USB_OTG_BLACKLIST_HUB is not set
+# CONFIG_USB_DWC3 is not set
+# CONFIG_USB_MON is not set
+# CONFIG_USB_WUSB is not set
+# CONFIG_USB_WUSB_CBAF is not set
+
+#
+# USB Host Controller Drivers
+#
+# CONFIG_USB_C67X00_HCD is not set
+CONFIG_USB_XHCI_HCD=y
+# CONFIG_USB_XHCI_HCD_DEBUGGING is not set
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_ROOT_HUB_TT=y
+CONFIG_USB_EHCI_TT_NEWSCHED=y
+# CONFIG_USB_OXU210HP_HCD is not set
+# CONFIG_USB_ISP116X_HCD is not set
+# CONFIG_USB_ISP1760_HCD is not set
+# CONFIG_USB_ISP1362_HCD is not set
+CONFIG_USB_OHCI_HCD=y
+# CONFIG_USB_OHCI_HCD_SSB is not set
+# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
+# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+CONFIG_USB_UHCI_HCD=y
+# CONFIG_USB_SL811_HCD is not set
+# CONFIG_USB_R8A66597_HCD is not set
+# CONFIG_USB_WHCI_HCD is not set
+# CONFIG_USB_HWA_HCD is not set
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+# CONFIG_USB_WDM is not set
+# CONFIG_USB_TMC is not set
+
+#
+# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
+#
+
+#
+# also be needed; see USB_STORAGE Help for more info
+#
+CONFIG_USB_STORAGE=y
+# CONFIG_USB_STORAGE_DEBUG is not set
+# CONFIG_USB_STORAGE_REALTEK is not set
+# CONFIG_USB_STORAGE_DATAFAB is not set
+# CONFIG_USB_STORAGE_FREECOM is not set
+# CONFIG_USB_STORAGE_ISD200 is not set
+# CONFIG_USB_STORAGE_USBAT is not set
+# CONFIG_USB_STORAGE_SDDR09 is not set
+# CONFIG_USB_STORAGE_SDDR55 is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+# CONFIG_USB_STORAGE_ALAUDA is not set
+# CONFIG_USB_STORAGE_ONETOUCH is not set
+# CONFIG_USB_STORAGE_KARMA is not set
+# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
+# CONFIG_USB_STORAGE_ENE_UB6250 is not set
+# CONFIG_USB_LIBUSUAL is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
+
+#
+# USB port drivers
+#
+CONFIG_USB_SERIAL=y
+CONFIG_USB_SERIAL_CONSOLE=y
+# CONFIG_USB_EZUSB is not set
+# CONFIG_USB_SERIAL_GENERIC is not set
+# CONFIG_USB_SERIAL_AIRCABLE is not set
+# CONFIG_USB_SERIAL_ARK3116 is not set
+# CONFIG_USB_SERIAL_BELKIN is not set
+# CONFIG_USB_SERIAL_CH341 is not set
+# CONFIG_USB_SERIAL_WHITEHEAT is not set
+# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
+# CONFIG_USB_SERIAL_CP210X is not set
+# CONFIG_USB_SERIAL_CYPRESS_M8 is not set
+# CONFIG_USB_SERIAL_EMPEG is not set
+# CONFIG_USB_SERIAL_FTDI_SIO is not set
+# CONFIG_USB_SERIAL_FUNSOFT is not set
+# CONFIG_USB_SERIAL_VISOR is not set
+# CONFIG_USB_SERIAL_IPAQ is not set
+# CONFIG_USB_SERIAL_IR is not set
+# CONFIG_USB_SERIAL_EDGEPORT is not set
+# CONFIG_USB_SERIAL_EDGEPORT_TI is not set
+# CONFIG_USB_SERIAL_GARMIN is not set
+# CONFIG_USB_SERIAL_IPW is not set
+# CONFIG_USB_SERIAL_IUU is not set
+# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
+# CONFIG_USB_SERIAL_KEYSPAN is not set
+# CONFIG_USB_SERIAL_KLSI is not set
+# CONFIG_USB_SERIAL_KOBIL_SCT is not set
+# CONFIG_USB_SERIAL_MCT_U232 is not set
+# CONFIG_USB_SERIAL_MOS7720 is not set
+# CONFIG_USB_SERIAL_MOS7840 is not set
+# CONFIG_USB_SERIAL_MOTOROLA is not set
+# CONFIG_USB_SERIAL_NAVMAN is not set
+# CONFIG_USB_SERIAL_PL2303 is not set
+# CONFIG_USB_SERIAL_OTI6858 is not set
+# CONFIG_USB_SERIAL_QCAUX is not set
+# CONFIG_USB_SERIAL_QUALCOMM is not set
+# CONFIG_USB_SERIAL_SPCP8X5 is not set
+# CONFIG_USB_SERIAL_HP4X is not set
+# CONFIG_USB_SERIAL_SAFE is not set
+# CONFIG_USB_SERIAL_SIEMENS_MPI is not set
+# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
+# CONFIG_USB_SERIAL_SYMBOL is not set
+# CONFIG_USB_SERIAL_TI is not set
+# CONFIG_USB_SERIAL_CYBERJACK is not set
+# CONFIG_USB_SERIAL_XIRCOM is not set
+# CONFIG_USB_SERIAL_OPTION is not set
+# CONFIG_USB_SERIAL_OMNINET is not set
+# CONFIG_USB_SERIAL_OPTICON is not set
+# CONFIG_USB_SERIAL_VIVOPAY_SERIAL is not set
+# CONFIG_USB_SERIAL_ZIO is not set
+# CONFIG_USB_SERIAL_SSU100 is not set
+# CONFIG_USB_SERIAL_DEBUG is not set
+
+#
+# USB Miscellaneous drivers
+#
+# CONFIG_USB_EMI62 is not set
+# CONFIG_USB_EMI26 is not set
+# CONFIG_USB_ADUTUX is not set
+# CONFIG_USB_SEVSEG is not set
+# CONFIG_USB_RIO500 is not set
+# CONFIG_USB_LEGOTOWER is not set
+# CONFIG_USB_LCD is not set
+# CONFIG_USB_LED is not set
+# CONFIG_USB_CYPRESS_CY7C63 is not set
+# CONFIG_USB_CYTHERM is not set
+# CONFIG_USB_IDMOUSE is not set
+# CONFIG_USB_FTDI_ELAN is not set
+# CONFIG_USB_APPLEDISPLAY is not set
+# CONFIG_USB_SISUSBVGA is not set
+# CONFIG_USB_LD is not set
+# CONFIG_USB_TRANCEVIBRATOR is not set
+# CONFIG_USB_IOWARRIOR is not set
+# CONFIG_USB_TEST is not set
+# CONFIG_USB_ISIGHTFW is not set
+# CONFIG_USB_YUREX is not set
+# CONFIG_USB_GADGET is not set
+
+#
+# OTG and related infrastructure
+#
+# CONFIG_USB_GPIO_VBUS is not set
+# CONFIG_NOP_USB_XCEIV is not set
+# CONFIG_UWB is not set
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+# CONFIG_MMC_UNSAFE_RESUME is not set
+# CONFIG_MMC_CLKGATE is not set
+
+#
+# MMC/SD/SDIO Card Drivers
+#
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_BLOCK_MINORS=8
+CONFIG_MMC_BLOCK_BOUNCE=y
+# CONFIG_SDIO_UART is not set
+# CONFIG_MMC_TEST is not set
+
+#
+# MMC/SD/SDIO Host Controller Drivers
+#
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_PCI=y
+# CONFIG_MMC_RICOH_MMC is not set
+CONFIG_MMC_SDHCI_PLTFM=y
+# CONFIG_MMC_WBSD is not set
+# CONFIG_MMC_TIFM_SD is not set
+CONFIG_MMC_SPI=y
+# CONFIG_MMC_SDRICOH_CS is not set
+# CONFIG_MMC_CB710 is not set
+# CONFIG_MMC_VIA_SDMMC is not set
+# CONFIG_MMC_VUB300 is not set
+# CONFIG_MMC_USHC is not set
+# CONFIG_MEMSTICK is not set
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+CONFIG_LEDS_ACCTON_AS5712_54x=y
+CONFIG_LEDS_ACCTON_AS6712_32x=y
+CONFIG_LEDS_ACCTON_AS7512_32x=y
+CONFIG_LEDS_ACCTON_AS7712_32x=y
+# CONFIG_LEDS_LM3530 is not set
+# CONFIG_LEDS_PCA9532 is not set
+# CONFIG_LEDS_GPIO is not set
+# CONFIG_LEDS_LP3944 is not set
+# CONFIG_LEDS_LP5521 is not set
+# CONFIG_LEDS_LP5523 is not set
+# CONFIG_LEDS_CLEVO_MAIL is not set
+# CONFIG_LEDS_PCA955X is not set
+# CONFIG_LEDS_DAC124S085 is not set
+# CONFIG_LEDS_BD2802 is not set
+# CONFIG_LEDS_INTEL_SS4200 is not set
+# CONFIG_LEDS_LT3593 is not set
+# CONFIG_LEDS_TRIGGERS is not set
+
+#
+# LED Triggers
+#
+# CONFIG_ACCESSIBILITY is not set
+# CONFIG_INFINIBAND is not set
+# CONFIG_EDAC is not set
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+# CONFIG_RTC_DEBUG is not set
+
+#
+# RTC interfaces
+#
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_DEV=y
+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+# CONFIG_RTC_DRV_TEST is not set
+
+#
+# I2C RTC drivers
+#
+CONFIG_RTC_DRV_DS1307=y
+CONFIG_RTC_DRV_DS1374=y
+CONFIG_RTC_DRV_DS1672=y
+CONFIG_RTC_DRV_DS3232=y
+CONFIG_RTC_DRV_MAX6900=y
+CONFIG_RTC_DRV_RS5C372=y
+CONFIG_RTC_DRV_ISL1208=y
+CONFIG_RTC_DRV_ISL12022=y
+CONFIG_RTC_DRV_X1205=y
+CONFIG_RTC_DRV_PCF8563=y
+CONFIG_RTC_DRV_PCF8583=y
+CONFIG_RTC_DRV_M41T80=y
+# CONFIG_RTC_DRV_M41T80_WDT is not set
+CONFIG_RTC_DRV_BQ32K=y
+CONFIG_RTC_DRV_S35390A=y
+CONFIG_RTC_DRV_FM3130=y
+CONFIG_RTC_DRV_RX8581=y
+CONFIG_RTC_DRV_RX8025=y
+# CONFIG_RTC_DRV_EM3027 is not set
+# CONFIG_RTC_DRV_RV3029C2 is not set
+
+#
+# SPI RTC drivers
+#
+# CONFIG_RTC_DRV_M41T93 is not set
+# CONFIG_RTC_DRV_M41T94 is not set
+# CONFIG_RTC_DRV_DS1305 is not set
+# CONFIG_RTC_DRV_DS1390 is not set
+# CONFIG_RTC_DRV_MAX6902 is not set
+# CONFIG_RTC_DRV_R9701 is not set
+# CONFIG_RTC_DRV_RS5C348 is not set
+# CONFIG_RTC_DRV_DS3234 is not set
+# CONFIG_RTC_DRV_PCF2123 is not set
+
+#
+# Platform RTC drivers
+#
+CONFIG_RTC_DRV_CMOS=y
+CONFIG_RTC_DRV_DS1286=y
+CONFIG_RTC_DRV_DS1511=y
+CONFIG_RTC_DRV_DS1553=y
+CONFIG_RTC_DRV_DS1742=y
+CONFIG_RTC_DRV_STK17TA8=y
+CONFIG_RTC_DRV_M48T86=y
+CONFIG_RTC_DRV_M48T35=y
+CONFIG_RTC_DRV_M48T59=y
+CONFIG_RTC_DRV_MSM6242=y
+CONFIG_RTC_DRV_BQ4802=y
+CONFIG_RTC_DRV_RP5C01=y
+CONFIG_RTC_DRV_V3020=y
+
+#
+# on-CPU RTC drivers
+#
+# CONFIG_DMADEVICES is not set
+# CONFIG_AUXDISPLAY is not set
+CONFIG_UIO=y
+# CONFIG_UIO_CIF is not set
+# CONFIG_UIO_PDRV is not set
+# CONFIG_UIO_PDRV_GENIRQ is not set
+# CONFIG_UIO_AEC is not set
+# CONFIG_UIO_SERCOS3 is not set
+# CONFIG_UIO_PCI_GENERIC is not set
+# CONFIG_UIO_NETX is not set
+
+#
+# Virtio drivers
+#
+# CONFIG_VIRTIO_PCI is not set
+# CONFIG_VIRTIO_BALLOON is not set
+# CONFIG_VIRTIO_MMIO is not set
+
+#
+# Xen driver support
+#
+CONFIG_XEN_BALLOON=y
+# CONFIG_XEN_BALLOON_MEMORY_HOTPLUG is not set
+CONFIG_XEN_SCRUB_PAGES=y
+CONFIG_XEN_DEV_EVTCHN=y
+CONFIG_XEN_BACKEND=y
+CONFIG_XENFS=y
+CONFIG_XEN_COMPAT_XENFS=y
+CONFIG_XEN_SYS_HYPERVISOR=y
+CONFIG_XEN_GNTDEV=y
+CONFIG_XEN_GRANT_DEV_ALLOC=y
+CONFIG_SWIOTLB_XEN=y
+CONFIG_XEN_PCIDEV_BACKEND=m
+# CONFIG_STAGING is not set
+CONFIG_X86_PLATFORM_DEVICES=y
+# CONFIG_ACERHDF is not set
+# CONFIG_ASUS_LAPTOP is not set
+# CONFIG_HP_ACCEL is not set
+# CONFIG_THINKPAD_ACPI is not set
+# CONFIG_SENSORS_HDAPS is not set
+# CONFIG_INTEL_MENLOW is not set
+# CONFIG_EEEPC_LAPTOP is not set
+# CONFIG_ACPI_WMI is not set
+# CONFIG_ACPI_ASUS is not set
+# CONFIG_TOPSTAR_LAPTOP is not set
+# CONFIG_TOSHIBA_BT_RFKILL is not set
+# CONFIG_ACPI_CMPC is not set
+# CONFIG_INTEL_IPS is not set
+# CONFIG_IBM_RTL is not set
+# CONFIG_XO15_EBOOK is not set
+# CONFIG_SAMSUNG_Q10 is not set
+CONFIG_X86_64_DELL_S6000_S1220_R0=y
+
+#
+# Hardware Spinlock drivers
+#
+CONFIG_CLKEVT_I8253=y
+CONFIG_I8253_LOCK=y
+CONFIG_CLKBLD_I8253=y
+CONFIG_IOMMU_SUPPORT=y
+# CONFIG_AMD_IOMMU is not set
+# CONFIG_INTEL_IOMMU is not set
+# CONFIG_IRQ_REMAP is not set
+# CONFIG_VIRT_DRIVERS is not set
+
+#
+# Microsoft Hyper-V guest support
+#
+# CONFIG_HYPERV is not set
+# CONFIG_PM_DEVFREQ is not set
+
+#
+# Frame Manager support
+#
+# CONFIG_FSL_FMAN is not set
+
+#
+# Firmware Drivers
+#
+CONFIG_EDD=y
+# CONFIG_EDD_OFF is not set
+CONFIG_FIRMWARE_MEMMAP=y
+CONFIG_DELL_RBU=y
+CONFIG_DCDBAS=y
+CONFIG_DMIID=y
+CONFIG_DMI_SYSFS=y
+CONFIG_ISCSI_IBFT_FIND=y
+CONFIG_ISCSI_IBFT=y
+# CONFIG_SIGMA is not set
+# CONFIG_GOOGLE_FIRMWARE is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+CONFIG_EXT2_FS_POSIX_ACL=y
+CONFIG_EXT2_FS_SECURITY=y
+# CONFIG_EXT2_FS_XIP is not set
+CONFIG_EXT3_FS=y
+CONFIG_EXT3_DEFAULTS_TO_ORDERED=y
+CONFIG_EXT3_FS_XATTR=y
+CONFIG_EXT3_FS_POSIX_ACL=y
+CONFIG_EXT3_FS_SECURITY=y
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_FS_XATTR=y
+CONFIG_EXT4_FS_POSIX_ACL=y
+CONFIG_EXT4_FS_SECURITY=y
+# CONFIG_EXT4_DEBUG is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+CONFIG_JBD2=y
+# CONFIG_JBD2_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_BTRFS_FS is not set
+# CONFIG_NILFS2_FS is not set
+CONFIG_FS_POSIX_ACL=y
+CONFIG_EXPORTFS=y
+CONFIG_FILE_LOCKING=y
+CONFIG_FSNOTIFY=y
+CONFIG_DNOTIFY=y
+CONFIG_INOTIFY_USER=y
+CONFIG_INOTIFY_STACKFS=y
+CONFIG_FANOTIFY=y
+# CONFIG_QUOTA is not set
+# CONFIG_QUOTACTL is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
+CONFIG_OVERLAYFS_FS=y
+CONFIG_GENERIC_ACL=y
+
+#
+# Caches
+#
+CONFIG_FSCACHE=y
+CONFIG_FSCACHE_STATS=y
+# CONFIG_FSCACHE_HISTOGRAM is not set
+# CONFIG_FSCACHE_DEBUG is not set
+# CONFIG_FSCACHE_OBJECT_LIST is not set
+CONFIG_CACHEFILES=y
+# CONFIG_CACHEFILES_DEBUG is not set
+# CONFIG_CACHEFILES_HISTOGRAM is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=y
+CONFIG_JOLIET=y
+CONFIG_ZISOFS=y
+CONFIG_UDF_FS=y
+CONFIG_UDF_NLS=y
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_PROC_VMCORE=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_TMPFS_XATTR=y
+CONFIG_HUGETLBFS=y
+CONFIG_HUGETLB_PAGE=y
+CONFIG_CONFIGFS_FS=y
+CONFIG_MISC_FILESYSTEMS=y
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_ECRYPT_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_LOGFS is not set
+# CONFIG_CRAMFS is not set
+CONFIG_SQUASHFS=y
+CONFIG_SQUASHFS_XATTR=y
+CONFIG_SQUASHFS_ZLIB=y
+CONFIG_SQUASHFS_LZO=y
+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_VXFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_OMFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_PSTORE is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+# CONFIG_EXOFS_FS is not set
+# CONFIG_AUFS_FS is not set
+CONFIG_ORE=m
+CONFIG_NETWORK_FILESYSTEMS=y
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+CONFIG_NFS_V3_ACL=y
+CONFIG_NFS_V4=y
+CONFIG_NFS_V4_1=y
+CONFIG_PNFS_FILE_LAYOUT=y
+CONFIG_PNFS_OBJLAYOUT=m
+# CONFIG_NFS_FSCACHE is not set
+# CONFIG_NFS_USE_LEGACY_DNS is not set
+CONFIG_NFS_USE_KERNEL_DNS=y
+# CONFIG_NFS_USE_NEW_IDMAPPER is not set
+CONFIG_NFSD=y
+CONFIG_NFSD_V2_ACL=y
+CONFIG_NFSD_V3=y
+CONFIG_NFSD_V3_ACL=y
+CONFIG_NFSD_V4=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_ACL_SUPPORT=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+CONFIG_SUNRPC_GSS=y
+CONFIG_SUNRPC_BACKCHANNEL=y
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_CEPH_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_ACORN_PARTITION=y
+CONFIG_ACORN_PARTITION_CUMANA=y
+CONFIG_ACORN_PARTITION_EESOX=y
+CONFIG_ACORN_PARTITION_ICS=y
+CONFIG_ACORN_PARTITION_ADFS=y
+CONFIG_ACORN_PARTITION_POWERTEC=y
+CONFIG_ACORN_PARTITION_RISCIX=y
+CONFIG_OSF_PARTITION=y
+CONFIG_AMIGA_PARTITION=y
+CONFIG_ATARI_PARTITION=y
+CONFIG_MAC_PARTITION=y
+CONFIG_MSDOS_PARTITION=y
+CONFIG_BSD_DISKLABEL=y
+CONFIG_MINIX_SUBPARTITION=y
+CONFIG_SOLARIS_X86_PARTITION=y
+CONFIG_UNIXWARE_DISKLABEL=y
+CONFIG_LDM_PARTITION=y
+# CONFIG_LDM_DEBUG is not set
+CONFIG_SGI_PARTITION=y
+CONFIG_ULTRIX_PARTITION=y
+CONFIG_SUN_PARTITION=y
+CONFIG_KARMA_PARTITION=y
+CONFIG_EFI_PARTITION=y
+# CONFIG_SYSV68_PARTITION is not set
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=y
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+CONFIG_NLS_ASCII=y
+CONFIG_NLS_ISO8859_1=y
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+CONFIG_NLS_UTF8=y
+# CONFIG_DLM is not set
+
+#
+# Kernel hacking
+#
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+# CONFIG_PRINTK_TIME is not set
+CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4
+CONFIG_ENABLE_WARN_DEPRECATED=y
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_FRAME_WARN=2048
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_MAGIC_SYSRQ_DEFAULT_MASK=0x01b6
+CONFIG_STRIP_ASM_SYMS=y
+CONFIG_UNUSED_SYMBOLS=y
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_DEBUG_SECTION_MISMATCH is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOCKUP_DETECTOR=y
+CONFIG_HARDLOCKUP_DETECTOR=y
+# CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set
+CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0
+# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
+CONFIG_DETECT_HUNG_TASK=y
+CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
+# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
+CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
+CONFIG_PANIC_TIMEOUT=0
+CONFIG_SCHED_DEBUG=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_OBJECTS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_SPARSE_RCU_POINTER is not set
+# CONFIG_LOCK_STAT is not set
+# CONFIG_DEBUG_ATOMIC_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+CONFIG_STACKTRACE=y
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_INFO=y
+# CONFIG_DEBUG_INFO_REDUCED is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_VIRTUAL is not set
+# CONFIG_DEBUG_WRITECOUNT is not set
+CONFIG_DEBUG_MEMORY_INIT=y
+# CONFIG_DEBUG_LIST is not set
+# CONFIG_TEST_LIST_SORT is not set
+# CONFIG_DEBUG_SG is not set
+# CONFIG_DEBUG_NOTIFIERS is not set
+# CONFIG_DEBUG_CREDENTIALS is not set
+CONFIG_ARCH_WANT_FRAME_POINTERS=y
+# CONFIG_FRAME_POINTER is not set
+CONFIG_BOOT_PRINTK_DELAY=y
+# CONFIG_RCU_TORTURE_TEST is not set
+CONFIG_RCU_CPU_STALL_TIMEOUT=60
+# CONFIG_BACKTRACE_SELF_TEST is not set
+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
+# CONFIG_DEBUG_PER_CPU_MAPS is not set
+# CONFIG_LKDTM is not set
+# CONFIG_CPU_NOTIFIER_ERROR_INJECT is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_LATENCYTOP is not set
+CONFIG_SYSCTL_SYSCALL_CHECK=y
+# CONFIG_DEBUG_PAGEALLOC is not set
+CONFIG_USER_STACKTRACE_SUPPORT=y
+CONFIG_NOP_TRACER=y
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
+CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=y
+CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
+CONFIG_HAVE_DYNAMIC_FTRACE=y
+CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
+CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
+CONFIG_HAVE_C_RECORDMCOUNT=y
+CONFIG_RING_BUFFER=y
+CONFIG_EVENT_TRACING=y
+CONFIG_EVENT_POWER_TRACING_DEPRECATED=y
+CONFIG_CONTEXT_SWITCH_TRACER=y
+CONFIG_TRACING=y
+CONFIG_GENERIC_TRACER=y
+CONFIG_TRACING_SUPPORT=y
+CONFIG_FTRACE=y
+# CONFIG_FUNCTION_TRACER is not set
+# CONFIG_IRQSOFF_TRACER is not set
+# CONFIG_SCHED_TRACER is not set
+# CONFIG_FTRACE_SYSCALLS is not set
+CONFIG_BRANCH_PROFILE_NONE=y
+# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
+# CONFIG_PROFILE_ALL_BRANCHES is not set
+# CONFIG_STACK_TRACER is not set
+CONFIG_BLK_DEV_IO_TRACE=y
+# CONFIG_FTRACE_STARTUP_TEST is not set
+# CONFIG_MMIOTRACE is not set
+# CONFIG_RING_BUFFER_BENCHMARK is not set
+# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set
+# CONFIG_FIREWIRE_OHCI_REMOTE_DMA is not set
+# CONFIG_DYNAMIC_DEBUG is not set
+# CONFIG_DMA_API_DEBUG is not set
+# CONFIG_ATOMIC64_SELFTEST is not set
+# CONFIG_SAMPLES is not set
+CONFIG_HAVE_ARCH_KGDB=y
+# CONFIG_KGDB is not set
+CONFIG_HAVE_ARCH_KMEMCHECK=y
+# CONFIG_TEST_KSTRTOX is not set
+CONFIG_STRICT_DEVMEM=y
+CONFIG_X86_VERBOSE_BOOTUP=y
+CONFIG_EARLY_PRINTK=y
+# CONFIG_EARLY_PRINTK_DBGP is not set
+# CONFIG_DEBUG_STACKOVERFLOW is not set
+# CONFIG_X86_PTDUMP is not set
+CONFIG_DEBUG_RODATA=y
+# CONFIG_DEBUG_RODATA_TEST is not set
+# CONFIG_DEBUG_SET_MODULE_RONX is not set
+# CONFIG_DEBUG_NX_TEST is not set
+# CONFIG_IOMMU_DEBUG is not set
+# CONFIG_IOMMU_STRESS is not set
+CONFIG_HAVE_MMIOTRACE_SUPPORT=y
+CONFIG_IO_DELAY_TYPE_0X80=0
+CONFIG_IO_DELAY_TYPE_0XED=1
+CONFIG_IO_DELAY_TYPE_UDELAY=2
+CONFIG_IO_DELAY_TYPE_NONE=3
+CONFIG_IO_DELAY_0X80=y
+# CONFIG_IO_DELAY_0XED is not set
+# CONFIG_IO_DELAY_UDELAY is not set
+# CONFIG_IO_DELAY_NONE is not set
+CONFIG_DEFAULT_IO_DELAY_TYPE=0
+# CONFIG_DEBUG_BOOT_PARAMS is not set
+# CONFIG_CPA_DEBUG is not set
+CONFIG_OPTIMIZE_INLINING=y
+# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set
+
+#
+# Security options
+#
+CONFIG_KEYS=y
+# CONFIG_ENCRYPTED_KEYS is not set
+# CONFIG_KEYS_DEBUG_PROC_KEYS is not set
+# CONFIG_SECURITY_DMESG_RESTRICT is not set
+# CONFIG_SECURITY is not set
+# CONFIG_SECURITYFS is not set
+CONFIG_DEFAULT_SECURITY_DAC=y
+CONFIG_DEFAULT_SECURITY=""
+CONFIG_XOR_BLOCKS=m
+CONFIG_ASYNC_CORE=m
+CONFIG_ASYNC_XOR=m
+CONFIG_CRYPTO=y
+
+#
+# Crypto core or helper
+#
+CONFIG_CRYPTO_FIPS=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_ALGAPI2=y
+CONFIG_CRYPTO_AEAD=y
+CONFIG_CRYPTO_AEAD2=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_BLKCIPHER2=y
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_HASH2=y
+CONFIG_CRYPTO_RNG=y
+CONFIG_CRYPTO_RNG2=y
+CONFIG_CRYPTO_PCOMP=y
+CONFIG_CRYPTO_PCOMP2=y
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_MANAGER2=y
+# CONFIG_CRYPTO_USER is not set
+# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set
+CONFIG_CRYPTO_GF128MUL=y
+CONFIG_CRYPTO_NULL=y
+# CONFIG_CRYPTO_PCRYPT is not set
+CONFIG_CRYPTO_WORKQUEUE=y
+CONFIG_CRYPTO_CRYPTD=y
+CONFIG_CRYPTO_AUTHENC=y
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Authenticated Encryption with Associated Data
+#
+CONFIG_CRYPTO_CCM=y
+CONFIG_CRYPTO_GCM=y
+CONFIG_CRYPTO_SEQIV=y
+
+#
+# Block modes
+#
+CONFIG_CRYPTO_CBC=y
+CONFIG_CRYPTO_CTR=y
+CONFIG_CRYPTO_CTS=y
+CONFIG_CRYPTO_ECB=y
+CONFIG_CRYPTO_LRW=y
+CONFIG_CRYPTO_PCBC=y
+CONFIG_CRYPTO_XTS=y
+
+#
+# Hash modes
+#
+CONFIG_CRYPTO_HMAC=y
+CONFIG_CRYPTO_XCBC=y
+CONFIG_CRYPTO_VMAC=y
+
+#
+# Digest
+#
+CONFIG_CRYPTO_CRC32C=y
+CONFIG_CRYPTO_CRC32C_INTEL=y
+CONFIG_CRYPTO_GHASH=y
+CONFIG_CRYPTO_MD4=y
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_MICHAEL_MIC=y
+CONFIG_CRYPTO_RMD128=y
+CONFIG_CRYPTO_RMD160=y
+CONFIG_CRYPTO_RMD256=y
+CONFIG_CRYPTO_RMD320=y
+CONFIG_CRYPTO_SHA1=y
+CONFIG_CRYPTO_SHA1_SSSE3=y
+CONFIG_CRYPTO_SHA256=y
+CONFIG_CRYPTO_SHA512=y
+CONFIG_CRYPTO_TGR192=y
+CONFIG_CRYPTO_WP512=y
+CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=y
+
+#
+# Ciphers
+#
+CONFIG_CRYPTO_AES=y
+CONFIG_CRYPTO_AES_X86_64=y
+CONFIG_CRYPTO_AES_NI_INTEL=y
+CONFIG_CRYPTO_ANUBIS=y
+CONFIG_CRYPTO_ARC4=y
+CONFIG_CRYPTO_BLOWFISH=y
+CONFIG_CRYPTO_BLOWFISH_COMMON=y
+CONFIG_CRYPTO_BLOWFISH_X86_64=y
+CONFIG_CRYPTO_CAMELLIA=y
+CONFIG_CRYPTO_CAST5=y
+CONFIG_CRYPTO_CAST6=y
+CONFIG_CRYPTO_DES=y
+CONFIG_CRYPTO_FCRYPT=y
+CONFIG_CRYPTO_KHAZAD=y
+CONFIG_CRYPTO_SALSA20=y
+CONFIG_CRYPTO_SALSA20_X86_64=y
+CONFIG_CRYPTO_SEED=y
+CONFIG_CRYPTO_SERPENT=y
+CONFIG_CRYPTO_TEA=y
+CONFIG_CRYPTO_TWOFISH=y
+CONFIG_CRYPTO_TWOFISH_COMMON=y
+CONFIG_CRYPTO_TWOFISH_X86_64=y
+CONFIG_CRYPTO_TWOFISH_X86_64_3WAY=y
+
+#
+# Compression
+#
+CONFIG_CRYPTO_DEFLATE=y
+CONFIG_CRYPTO_ZLIB=y
+CONFIG_CRYPTO_LZO=y
+
+#
+# Random Number Generation
+#
+CONFIG_CRYPTO_ANSI_CPRNG=y
+CONFIG_CRYPTO_USER_API=y
+CONFIG_CRYPTO_USER_API_HASH=y
+CONFIG_CRYPTO_USER_API_SKCIPHER=y
+CONFIG_CRYPTO_HW=y
+CONFIG_CRYPTO_DEV_PADLOCK=y
+CONFIG_CRYPTO_DEV_PADLOCK_AES=y
+CONFIG_CRYPTO_DEV_PADLOCK_SHA=y
+CONFIG_HAVE_KVM=y
+# CONFIG_VIRTUALIZATION is not set
+CONFIG_BINARY_PRINTF=y
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_GENERIC_FIND_FIRST_BIT=y
+CONFIG_CRC_CCITT=y
+CONFIG_CRC16=y
+CONFIG_CRC_T10DIF=y
+CONFIG_CRC_ITU_T=y
+CONFIG_CRC32=y
+CONFIG_CRC7=y
+CONFIG_LIBCRC32C=y
+CONFIG_CRC8=y
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_LZO_COMPRESS=y
+CONFIG_LZO_DECOMPRESS=y
+CONFIG_XZ_DEC=y
+CONFIG_XZ_DEC_X86=y
+CONFIG_XZ_DEC_POWERPC=y
+CONFIG_XZ_DEC_IA64=y
+CONFIG_XZ_DEC_ARM=y
+CONFIG_XZ_DEC_ARMTHUMB=y
+CONFIG_XZ_DEC_SPARC=y
+CONFIG_XZ_DEC_BCJ=y
+# CONFIG_XZ_DEC_TEST is not set
+CONFIG_DECOMPRESS_GZIP=y
+CONFIG_DECOMPRESS_BZIP2=y
+CONFIG_DECOMPRESS_LZMA=y
+CONFIG_DECOMPRESS_XZ=y
+CONFIG_DECOMPRESS_LZO=y
+CONFIG_TEXTSEARCH=y
+CONFIG_TEXTSEARCH_KMP=y
+CONFIG_TEXTSEARCH_BM=y
+CONFIG_TEXTSEARCH_FSM=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
+CONFIG_CHECK_SIGNATURE=y
+CONFIG_CPU_RMAP=y
+CONFIG_DQL=y
+CONFIG_NLATTR=y
+CONFIG_AVERAGE=y
+CONFIG_CORDIC=y
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/kconfig.mk b/packages/base/any/kernels/3.2.65-1+deb7u2/kconfig.mk
new file mode 100644
index 00000000..75eb51d1
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/kconfig.mk
@@ -0,0 +1,31 @@
+############################################################
+#
+#
+# Copyright 2015 Big Switch Networks, Inc.
+#
+# Licensed under the Eclipse Public License, Version 1.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+# either express or implied. See the License for the specific
+# language governing permissions and limitations under the
+# License.
+#
+#
+############################################################
+#
+# 3.2.65-1+deb7u2 Kernel Builds
+#
+############################################################
+THIS_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
+
+K_PATCH_LEVEL := 2
+K_SUB_LEVEL := 65
+K_SUFFIX := -1+deb7u2
+K_PATCH_DIR := $(THIS_DIR)/patches
+K_ARCHIVE_URL := http://opennetlinux.org/tarballs/linux-3.2.65-1+deb7u2.tar.xz
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/README b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/README
new file mode 100644
index 00000000..e9fd4c70
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/README
@@ -0,0 +1,17 @@
+############################################################
+#
+# Debian 3.2 Kernel Patches
+#
+############################################################
+#
+# The majority of these patches were imported from
+# the Cumulus OSS Repository, version 2.5.1, for the Debian 3.2 kernel
+# distributed with Wheezy.
+#
+# http://oss.cumulusnetworks.com/CumulusLinux-2.5.1
+#
+# See the kernel patch directory:
+#
+# http://oss.cumulusnetworks.com/CumulusLinux-2.5.1/patches/kernel
+#
+############################################################
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/README.cumulus b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/README.cumulus
new file mode 100644
index 00000000..f759061a
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/README.cumulus
@@ -0,0 +1,36 @@
+Kernel stgit notes
+==================
+
+See also: https://wiki.cumulusnetworks.com/display/DE/Linux+Kernel+stgit+patches
+
+The Linux kernel stg patches are broken up into categories. The patch
+name is prefixed with the category.
+
+When creating a new patch please put it into an existing category. If
+you really need a new category open a discussion.
+
+Categories:
+
+Prefix Meaning
+=============+===========
+git- Specific to git, e.g. the standard gitignore.patch.
+arch-powerpc- PowerPC CPU patches. Not tied to a specific platform.
+arch-intel- Intel CPU patches. Not tied to a specific platform.
+kernel- Kernel features, like file systems, back ported items.
+driver- Device drivers. Not tied to a specific platform.
+platform- Switching hardware platforms, like DNI-7448.
+network- Networking, routing, bridging, tun, ipv4, ipv6, etc.
+
+
+platform- Category Specific Notes
+=================================
+
+Within this category the platforms are stored alphabetically.
+
+One patch, platform-powerpc-85xx-Makefile.patch, is used by all the
+powerpc platforms. This patch contains changes to
+arch/powerpc/platforms/85xx/Makefile and
+arch/powerpc/platforms/85xx/Kconfig.
+
+By keeping these changes in a separate patch allows the platform
+specific patchsets to sink/float without conflicts in these two files.
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-intel-centerton-pci-id.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-intel-centerton-pci-id.patch
new file mode 100644
index 00000000..daf6556c
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-intel-centerton-pci-id.patch
@@ -0,0 +1,20 @@
+arch-intel-centerton-pci-id.patch
+
+Add the PCI device ID for the Intel Centerton Integrated Legacy Block
+(ILB).
+
+This device ID is used by a number of drivers, including GPIO and
+Multifunction Devices.
+
+diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
+index d93f417..d35b1f4 100644
+--- a/include/linux/pci_ids.h
++++ b/include/linux/pci_ids.h
+@@ -2484,6 +2484,7 @@
+ #define PCI_DEVICE_ID_INTEL_MRST_SD2 0x084F
+ #define PCI_DEVICE_ID_INTEL_I960 0x0960
+ #define PCI_DEVICE_ID_INTEL_I960RM 0x0962
++#define PCI_DEVICE_ID_INTEL_CENTERTON_ILB 0x0c60
+ #define PCI_DEVICE_ID_INTEL_8257X_SOL 0x1062
+ #define PCI_DEVICE_ID_INTEL_82573E_SOL 0x1085
+ #define PCI_DEVICE_ID_INTEL_82573L_SOL 0x108F
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-intel-centerton-reboot-cf9.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-intel-centerton-reboot-cf9.patch
new file mode 100644
index 00000000..7b9bca62
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-intel-centerton-reboot-cf9.patch
@@ -0,0 +1,91 @@
+Patch to reboot x86_64 machines using boot code CF9
+
+diff --git a/arch/x86/include/asm/emergency-restart.h b/arch/x86/include/asm/emergency-restart.h
+index cc70c1c..441a910 100644
+--- a/arch/x86/include/asm/emergency-restart.h
++++ b/arch/x86/include/asm/emergency-restart.h
+@@ -11,6 +11,7 @@ enum reboot_type {
+ BOOT_EFI = 'e',
+ BOOT_CF9 = 'p',
+ BOOT_CF9_COND = 'q',
++ BOOT_CF9_COLD = 'd',
+ };
+
+ extern enum reboot_type reboot_type;
+diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
+index f411aca..a10547c 100644
+--- a/arch/x86/kernel/reboot.c
++++ b/arch/x86/kernel/reboot.c
+@@ -93,6 +93,7 @@ static int __init reboot_setup(char *str)
+ case 'b':
+ #endif
+ case 'a':
++ case 'd':
+ case 'k':
+ case 't':
+ case 'e':
+@@ -395,6 +396,16 @@ static int __init set_pci_reboot(const struct dmi_system_id *d)
+ return 0;
+ }
+
++static int __init set_cold_cf9_reboot(const struct dmi_system_id *d)
++{
++ if (reboot_type != BOOT_CF9_COLD) {
++ reboot_type = BOOT_CF9_COLD;
++ printk(KERN_INFO "%s series board detected. "
++ "Selecting CF9 Cold Reset method for reboots.\n", d->ident);
++ }
++ return 0;
++}
++
+ static struct dmi_system_id __initdata pci_reboot_dmi_table[] = {
+ { /* Handle problems with rebooting on Apple MacBook5 */
+ .callback = set_pci_reboot,
+@@ -468,6 +479,23 @@ static struct dmi_system_id __initdata pci_reboot_dmi_table[] = {
+ DMI_MATCH(DMI_PRODUCT_NAME, "Precision M6600"),
+ },
+ },
++ { /* Perform cold reset on Dell S6000 */
++ .callback = set_cold_cf9_reboot,
++ .ident = "Dell S6000",
++ .matches = {
++ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"),
++ DMI_MATCH(DMI_PRODUCT_NAME, "S6000"),
++ },
++ },
++ { /* Dell S6000 could have either manufacturer names: Dell Inc or
++ Dell Force10 Networks. Accomodating for both */
++ .callback = set_cold_cf9_reboot,
++ .ident = "Dell S6000",
++ .matches = {
++ DMI_MATCH(DMI_SYS_VENDOR, "Dell Force10 Networks"),
++ DMI_MATCH(DMI_PRODUCT_NAME, "S6000"),
++ },
++ },
+ { /* Handle problems with rebooting on the Dell PowerEdge C6100. */
+ .callback = set_pci_reboot,
+ .ident = "Dell PowerEdge C6100",
+@@ -569,6 +597,7 @@ static void native_machine_emergency_restart(void)
+ int i;
+ int attempt = 0;
+ int orig_reboot_type = reboot_type;
++ u8 cf9_cold = 0;
+
+ if (reboot_emergency)
+ emergency_vmx_disable_all();
+@@ -641,6 +670,15 @@ static void native_machine_emergency_restart(void)
+ }
+ reboot_type = BOOT_KBD;
+ break;
++
++ case BOOT_CF9_COLD:
++ cf9_cold = inb(0xcf9) & ~6;
++ outb(cf9_cold|8, 0xcf9); /* Request cold reset */
++ udelay(50);
++ outb(cf9_cold|12, 0xcf9); /* Actually do the reset */
++ udelay(50);
++ reboot_type = BOOT_KBD;
++ break;
+ }
+ }
+ }
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-intel-os-driven-pci-maxpayload-readreq-setup.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-intel-os-driven-pci-maxpayload-readreq-setup.patch
new file mode 100644
index 00000000..f1bc2e0d
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-intel-os-driven-pci-maxpayload-readreq-setup.patch
@@ -0,0 +1,121 @@
+#Copyright 2014 Cumulus Networks, Inc. All rights reserved.
+Have the OS set up all PCI device maxpayload and maxreadrequest on the PCIe bus
+Notes:
+1. This is similar to the payload size fixup done for powerpc.
+Ref: arch-powerpc-os-driven-pci-maxpayload-readreq-setup.patch
+2. pci=pcie_bus_safe is supposed to fix up the entire tree below a root complex
+with the smallest common denominator MPS. However it is only setting the
+devices associated with the children (child buses) of the root. And that leaves
+some of the devices on the root with a different (and in some cases lower MPS
+based on the bios setting).
+2. This patch works by walking the bus underneath each PCIe controller,
+querying PCI_EXP_DEVCAP_PAYLOAD, and finding the minimum value underneath each
+controller. Then it walks though the same set of devices setting
+PCI_EXP_DEVCTL_PAYLOAD and PCI_EXP_DEVCTL_READRQ to this value. The payloads
+are powers of 2 starting at 128...
+
+0 -> 128
+1 -> 256
+...
+7 -> 16,384:1
+
+diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c
+index 0ed97d8..f1a970f 100644
+--- a/arch/x86/pci/acpi.c
++++ b/arch/x86/pci/acpi.c
+@@ -329,6 +329,66 @@ res_alloc_fail:
+ return;
+ }
+
++/*
++ * scan and set the PCIe bus payload and read request sizes.
++ */
++static int __devinit __fixup_pcie_scan_payload(struct pci_dev *pdev,
++ void *data)
++{
++ int *payload_size = data;
++ int rval, cap, payload_cap;
++ uint32_t devcap;
++
++ if (!pci_is_pcie(pdev))
++ return 0;
++
++ cap = pci_find_capability(pdev, PCI_CAP_ID_EXP);
++ if (cap == 0)
++ return -ENODEV;
++
++ rval = pci_read_config_dword(pdev, cap + PCI_EXP_DEVCAP, &devcap);
++ if (rval)
++ return rval;
++
++ payload_cap = devcap & PCI_EXP_DEVCAP_PAYLOAD;
++ if (payload_cap < *payload_size)
++ *payload_size = payload_cap;
++
++ return 0;
++}
++
++static int __devinit __fixup_pcie_set_payload(struct pci_dev *pdev,
++ void *data)
++{
++ int *payload_size = data;
++ int rval, cap;
++ uint16_t devctl;
++
++ if (!pci_is_pcie(pdev))
++ return 0;
++
++ cap = pci_find_capability(pdev, PCI_CAP_ID_EXP);
++ if (cap == 0)
++ return -ENODEV;
++
++ rval = pci_read_config_word(pdev, cap + PCI_EXP_DEVCTL, &devctl);
++ if (rval)
++ return rval;
++
++ devctl &= ~PCI_EXP_DEVCTL_PAYLOAD;
++ devctl |= *payload_size << 5;
++
++ devctl &= ~PCI_EXP_DEVCTL_READRQ;
++ devctl |= *payload_size << 12;
++
++ rval = pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL, devctl);
++ if (rval)
++ return rval;
++
++ return 0;
++}
++
++
+ struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_pci_root *root)
+ {
+ struct acpi_device *device = root->device;
+@@ -395,6 +455,28 @@ struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_pci_root *root)
+ }
+ }
+
++/* Set the payload size for all devices on the bus */
++ if (bus) {
++ int payload_size;
++ payload_size = PCI_EXP_DEVCAP_PAYLOAD;
++ pci_walk_bus(bus, __fixup_pcie_scan_payload, &payload_size);
++ if (payload_size < PCI_EXP_DEVCAP_PAYLOAD) {
++ pci_walk_bus(bus, __fixup_pcie_set_payload,
++ &payload_size);
++ dev_info(&bus->dev,
++ "Set PCIe payload and read request to %d\n",
++ (payload_size == 0) ? 128 :
++ (payload_size == 1) ? 256 :
++ (payload_size == 2) ? 512 :
++ (payload_size == 3) ? 1024 :
++ (payload_size == 4) ? 2048 :
++ (payload_size == 5) ? 4096 :
++ (payload_size == 6) ? 8192 :
++ 16384
++ );
++ }
++ }
++
+ /* After the PCI-E bus has been walked and all devices discovered,
+ * configure any settings of the fabric that might be necessary.
+ */
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-nr-gpio.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-nr-gpio.patch
new file mode 100644
index 00000000..50aaf232
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-nr-gpio.patch
@@ -0,0 +1,15 @@
+
+
+diff --git a/arch/x86/include/asm/gpio.h b/arch/x86/include/asm/gpio.h
+index 91d915a..31ce3f7 100644
+--- a/arch/x86/include/asm/gpio.h
++++ b/arch/x86/include/asm/gpio.h
+@@ -16,6 +16,8 @@
+ #ifndef _ASM_X86_GPIO_H
+ #define _ASM_X86_GPIO_H
+
++#define ARCH_NR_GPIOS 512
++
+ #include
+
+ #ifdef CONFIG_GPIOLIB
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-powerpc-cacheinfo.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-powerpc-cacheinfo.patch
new file mode 100644
index 00000000..61d04d92
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-powerpc-cacheinfo.patch
@@ -0,0 +1,89 @@
+Fix missing L2 cache in /sys/devices/system/cpu/cpu0/cache/index2/size
+This appears to have been introduced in 2.6.29 by
+93197a36a9c16a85fb24cf5a8639f7bf9af838a3.
+
+This caused lscpu to error out on e500v2 devices, and probably others
+ error: cannot open /sys/devices/system/cpu/cpu0/cache/index2/size: No such file or directory
+
+Some embedded powerpc sysystems use cache-size in DTS for the unified L2 cache
+size, not d-cache-size, so we need to allow for both DTS names. Added a
+second CACHE_TYPE_UNIFIED_D cache_type_info structure to handle this.
+
+This is a redo after trying to push the previous version upstream, and finding out
+that the previous patch broke OpenFirmware PowerPC systems like the Mac. This also
+now includes all descriptive entries in the index2 directory; the previous still had
+some missing.
+
+diff --git a/arch/powerpc/kernel/cacheinfo.c b/arch/powerpc/kernel/cacheinfo.c
+index b4437e8..592b096 100644
+--- a/arch/powerpc/kernel/cacheinfo.c
++++ b/arch/powerpc/kernel/cacheinfo.c
+@@ -62,12 +62,22 @@ struct cache_type_info {
+ };
+
+ /* These are used to index the cache_type_info array. */
+-#define CACHE_TYPE_UNIFIED 0
+-#define CACHE_TYPE_INSTRUCTION 1
+-#define CACHE_TYPE_DATA 2
++#define CACHE_TYPE_UNIFIED 0 /* cache-size, cache-block-size, etc. */
++#define CACHE_TYPE_UNIFIED_D 1 /* d-cache-size, d-cache-block-size, etc */
++#define CACHE_TYPE_INSTRUCTION 2
++#define CACHE_TYPE_DATA 3
+
+ static const struct cache_type_info cache_type_info[] = {
+ {
++ /* Embedded systems that use cache-size, cache-block-size,
++ * etc. for the Unified (typically L2) cache. */
++ .name = "Unified",
++ .size_prop = "cache-size",
++ .line_size_props = { "cache-line-size",
++ "cache-block-size", },
++ .nr_sets_prop = "cache-sets",
++ },
++ {
+ /* PowerPC Processor binding says the [di]-cache-*
+ * must be equal on unified caches, so just use
+ * d-cache properties. */
+@@ -293,7 +303,8 @@ static struct cache *cache_find_first_sibling(struct cache *cache)
+ {
+ struct cache *iter;
+
+- if (cache->type == CACHE_TYPE_UNIFIED)
++ if (cache->type == CACHE_TYPE_UNIFIED ||
++ cache->type == CACHE_TYPE_UNIFIED_D)
+ return cache;
+
+ list_for_each_entry(iter, &cache_list, list)
+@@ -324,13 +335,31 @@ static bool cache_node_is_unified(const struct device_node *np)
+ return of_get_property(np, "cache-unified", NULL);
+ }
+
++/*
++ * Handle unified caches that have two different types of tags. Most embedded
++ * use cache-size, etc. for the unified cache size, but open firmware systems
++ * use d-cache-size, etc. Since they all appear to be consistent, check on
++ * initialization for which type we are, and use the appropriate structure.
++ */
+ static struct cache *__cpuinit cache_do_one_devnode_unified(struct device_node *node, int level)
+ {
+ struct cache *cache;
++ int ucache;
+
+ pr_debug("creating L%d ucache for %s\n", level, node->full_name);
+
+- cache = new_cache(CACHE_TYPE_UNIFIED, level, node);
++ if (of_get_property(node,
++ cache_type_info[CACHE_TYPE_UNIFIED_D].size_prop, NULL)) {
++ ucache = CACHE_TYPE_UNIFIED_D;
++ } else {
++ ucache = CACHE_TYPE_UNIFIED; /* assume embedded */
++ if (of_get_property(node,
++ cache_type_info[CACHE_TYPE_UNIFIED].size_prop, NULL) ==
++ NULL)
++ printk(KERN_WARNING "Unified cache property missing\n");
++ }
++
++ cache = new_cache(ucache, level, node);
+
+ return cache;
+ }
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-powerpc-emulated-lwsync.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-powerpc-emulated-lwsync.patch
new file mode 100644
index 00000000..4cd3a1b6
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-powerpc-emulated-lwsync.patch
@@ -0,0 +1,45 @@
+#Copyright 2012 Cumulus Networks, Inc. All rights reserved.
+
+Emulate the 603 lwsync instruction
+
+Issue a memory barrier (mbar) instead of lwsync on e500 processors. This, along with SW emuluation of the FPU allow us to run PPC603 code from the Debian repositories directly on the e500 cores.
+
+diff --git a/arch/powerpc/include/asm/emulated_ops.h b/arch/powerpc/include/asm/emulated_ops.h
+index 63f2a22..093359a 100644
+--- a/arch/powerpc/include/asm/emulated_ops.h
++++ b/arch/powerpc/include/asm/emulated_ops.h
+@@ -44,6 +44,7 @@ extern struct ppc_emulated {
+ struct ppc_emulated_entry spe;
+ struct ppc_emulated_entry string;
+ struct ppc_emulated_entry unaligned;
++ struct ppc_emulated_entry lwsync;
+ #ifdef CONFIG_MATH_EMULATION
+ struct ppc_emulated_entry math;
+ #elif defined(CONFIG_8XX_MINIMAL_FPEMU)
+diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
+index 9844662..a689b66 100644
+--- a/arch/powerpc/kernel/traps.c
++++ b/arch/powerpc/kernel/traps.c
+@@ -928,6 +928,14 @@ static int emulate_instruction(struct pt_regs *regs)
+ return emulate_isel(regs, instword);
+ }
+
++ /* Emulate lwsync (Lightweight Sync) instruction */
++ if (instword == PPC_INST_LWSYNC) {
++ PPC_WARN_EMULATED(lwsync, regs);
++ /* This is probably more pessimistic than required */
++ mb();
++ return 0;
++ }
++
+ #ifdef CONFIG_PPC64
+ /* Emulate the mfspr rD, DSCR. */
+ if (((instword & PPC_INST_MFSPR_DSCR_MASK) == PPC_INST_MFSPR_DSCR) &&
+@@ -1542,6 +1550,7 @@ struct ppc_emulated ppc_emulated = {
+ WARN_EMULATED_SETUP(spe),
+ WARN_EMULATED_SETUP(string),
+ WARN_EMULATED_SETUP(unaligned),
++ WARN_EMULATED_SETUP(lwsync),
+ #ifdef CONFIG_MATH_EMULATION
+ WARN_EMULATED_SETUP(math),
+ #elif defined(CONFIG_8XX_MINIMAL_FPEMU)
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-powerpc-jtag.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-powerpc-jtag.patch
new file mode 100644
index 00000000..64503dd7
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-powerpc-jtag.patch
@@ -0,0 +1,59 @@
+#Copyright 2012 Cumulus Networks, Inc. All rights reserved.
+
+Tweak the kernel to support a JTAG hardware debugger
+
+- disable the software watchdog
+- enable Debug Interrupt in the PPC Machine State Register
+
+diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug
+index 1b8a9c9..aba8704 100644
+--- a/arch/powerpc/Kconfig.debug
++++ b/arch/powerpc/Kconfig.debug
+@@ -132,6 +132,15 @@ config BDI_SWITCH
+ Unless you are intending to debug the kernel with one of these
+ machines, say N here.
+
++config JTAG_DEBUGGER
++ bool "Kernel modifications for JTAG debuggers"
++ depends on DEBUG_KERNEL && PPC32
++ help
++ Modify kernel to allow JTAG debuggers to work. So far, this includes
++ setting the "DE" bit in booke ppc MSR_KERNEL and set the kernel's
++ softlockup threshold to be negative, effectively disabling software based
++ watchdogs.
++
+ config BOOTX_TEXT
+ bool "Support for early boot text console (BootX or OpenFirmware only)"
+ depends on PPC_OF && PPC_BOOK3S
+diff --git a/arch/powerpc/include/asm/reg_booke.h b/arch/powerpc/include/asm/reg_booke.h
+index 03c48e8..cd7b5af 100644
+--- a/arch/powerpc/include/asm/reg_booke.h
++++ b/arch/powerpc/include/asm/reg_booke.h
+@@ -37,7 +37,11 @@
+ #define MSR_KERNEL (MSR_ME|MSR_RI|MSR_IR|MSR_DR|MSR_CE)
+ #define MSR_USER (MSR_KERNEL|MSR_PR|MSR_EE)
+ #else
++#if defined(CONFIG_JTAG_DEBUGGER)
++#define MSR_KERNEL (MSR_ME|MSR_RI|MSR_CE|MSR_DE)
++#else
+ #define MSR_KERNEL (MSR_ME|MSR_RI|MSR_CE)
++#endif
+ #define MSR_USER (MSR_KERNEL|MSR_PR|MSR_EE)
+ #endif
+
+diff --git a/kernel/watchdog.c b/kernel/watchdog.c
+index a8bc4d9..08beea7 100644
+--- a/kernel/watchdog.c
++++ b/kernel/watchdog.c
+@@ -28,7 +28,11 @@
+ #include
+
+ int watchdog_enabled = 1;
++#if defined(CONFIG_JTAG_DEBUGGER)
++int __read_mostly watchdog_thresh = -10;
++#else
+ int __read_mostly watchdog_thresh = 10;
++#endif
+
+ static DEFINE_PER_CPU(unsigned long, watchdog_touch_ts);
+ static DEFINE_PER_CPU(struct task_struct *, softlockup_watchdog);
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-powerpc-os-driven-pci-maxpayload-readreq-setup.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-powerpc-os-driven-pci-maxpayload-readreq-setup.patch
new file mode 100644
index 00000000..c4597215
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-powerpc-os-driven-pci-maxpayload-readreq-setup.patch
@@ -0,0 +1,126 @@
+#Copyright 2012 Cumulus Networks, Inc. All rights reserved.
+
+Have the OS set up all PCI device maxpayload and maxreadrequest on the PCIe bus
+
+This version of the linux kernel doesn't do anything regarding the PCIe max
+payload size or read request size, but rather rely on BIOS to take care of
+things. Upcoming versions of the kernel patch core PCI code in cool and useful
+ways, but there is a lot of flux, every version I've looked at has a different
+take on this.
+
+Rather than patching PCI core code, I've chosen to patch this in an arch
+dependent manner (powerpc only) that will not conflict with any work at the PCI
+core (redundant, but no functional or merge conflicts). We can remove this
+patch once the PCI core code settles down.
+
+The patch works by walking the bus underneath each PCIe controller, querying
+PCI_EXP_DEVCAP_PAYLOAD, and finding the minimum value underneath each
+controller. Then we walk though the same set of devices setting
+PCI_EXP_DEVCTL_PAYLOAD and PCI_EXP_DEVCTL_READRQ to this value. The payloads
+are powers of 2 starting at 128...
+
+0 -> 128
+1 -> 256
+...
+7 -> 16,384
+
+diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
+index 9508bec..abb9e95 100644
+--- a/arch/powerpc/kernel/pci-common.c
++++ b/arch/powerpc/kernel/pci-common.c
+@@ -1697,6 +1697,62 @@ struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus)
+ return of_node_get(hose->dn);
+ }
+
++/*
++ * scan and set the PCIe bus payload and read request sizes.
++ */
++static int __devinit __fixup_pcie_scan_payload(struct pci_dev * pdev,
++ void * data)
++{
++ int * payload_size = data;
++ int rval, cap, payload_cap;
++ uint32_t devcap;
++
++ cap = pci_find_capability(pdev, PCI_CAP_ID_EXP);
++ if (cap == 0) {
++ return -ENODEV;
++ }
++
++ rval = pci_read_config_dword(pdev, cap + PCI_EXP_DEVCAP, &devcap);
++ if (rval) {
++ return rval;
++ }
++ payload_cap = devcap & PCI_EXP_DEVCAP_PAYLOAD;
++ if (payload_cap < *payload_size) {
++ *payload_size = payload_cap;
++ }
++ return 0;
++}
++
++static int __devinit __fixup_pcie_set_payload(struct pci_dev * pdev,
++ void * data)
++{
++ int * payload_size = data;
++ int rval, cap;
++ uint16_t devctl;
++
++ cap = pci_find_capability(pdev, PCI_CAP_ID_EXP);
++ if (cap == 0) {
++ return -ENODEV;
++ }
++
++ rval = pci_read_config_word(pdev, cap + PCI_EXP_DEVCTL, &devctl);
++ if (rval) {
++ return rval;
++ }
++
++ devctl &= ~PCI_EXP_DEVCTL_PAYLOAD;
++ devctl |= *payload_size << 5;
++
++ devctl &= ~PCI_EXP_DEVCTL_READRQ;
++ devctl |= *payload_size << 12;
++
++ rval = pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL, devctl);
++ if (rval) {
++ return rval;
++ }
++ return 0;
++}
++
+ /**
+ * pci_scan_phb - Given a pci_controller, setup and scan the PCI bus
+ * @hose: Pointer to the PCI host controller instance structure
+@@ -1706,6 +1762,7 @@ void __devinit pcibios_scan_phb(struct pci_controller *hose)
+ struct pci_bus *bus;
+ struct device_node *node = hose->dn;
+ int mode;
++ int payload_size;
+
+ pr_debug("PCI: Scanning PHB %s\n",
+ node ? node->full_name : "");
+@@ -1739,6 +1796,24 @@ void __devinit pcibios_scan_phb(struct pci_controller *hose)
+ if (mode == PCI_PROBE_NORMAL)
+ hose->last_busno = bus->subordinate = pci_scan_child_bus(bus);
+
++ /* Set the payload size for all devices on the bus */
++ payload_size = PCI_EXP_DEVCAP_PAYLOAD;
++ pci_walk_bus(hose->bus, __fixup_pcie_scan_payload, &payload_size);
++ if (payload_size < PCI_EXP_DEVCAP_PAYLOAD) {
++ pci_walk_bus(hose->bus, __fixup_pcie_set_payload, &payload_size);
++ dev_info(&hose->bus->dev,
++ "Set PCIe payload and read request to %d\n",
++ (payload_size == 0) ? 128 :
++ (payload_size == 1) ? 256 :
++ (payload_size == 2) ? 512 :
++ (payload_size == 3) ? 1024 :
++ (payload_size == 4) ? 2048 :
++ (payload_size == 5) ? 4096 :
++ (payload_size == 6) ? 8192 :
++ 16384
++ );
++ }
++
+ /* Configure PCI Express settings */
+ if (bus && !pci_has_flag(PCI_PROBE_ONLY)) {
+ struct pci_bus *child;
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-powerpc-remove-arch-specific-overrides-of-panic_timeout.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-powerpc-remove-arch-specific-overrides-of-panic_timeout.patch
new file mode 100644
index 00000000..d90efa32
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-powerpc-remove-arch-specific-overrides-of-panic_timeout.patch
@@ -0,0 +1,33 @@
+From e5ae2bb5c7cf0389f0333e5d36be193e7738f4e9 Mon Sep 17 00:00:00 2001
+Subject: [PATCH 2/2] powerpc: remove arch specific overrides of panic_timeout
+
+Signed-off-by: Jonathan Toppins
+
+diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c
+index ac76108..287d120 100644
+--- a/arch/powerpc/kernel/setup_32.c
++++ b/arch/powerpc/kernel/setup_32.c
+@@ -317,9 +317,6 @@ void __init setup_arch(char **cmdline_p)
+ if (cpu_has_feature(CPU_FTR_UNIFIED_ID_CACHE))
+ ucache_bsize = icache_bsize = dcache_bsize;
+
+- /* reboot on panic */
+- panic_timeout = 180;
+-
+ if (ppc_md.panic)
+ setup_panic();
+
+diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
+index 2c8890a..38533f2 100644
+--- a/arch/powerpc/kernel/setup_64.c
++++ b/arch/powerpc/kernel/setup_64.c
+@@ -554,9 +554,6 @@ void __init setup_arch(char **cmdline_p)
+ dcache_bsize = ppc64_caches.dline_size;
+ icache_bsize = ppc64_caches.iline_size;
+
+- /* reboot on panic */
+- panic_timeout = 180;
+-
+ if (ppc_md.panic)
+ setup_panic();
+
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-powerpc-topology-info.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-powerpc-topology-info.patch
new file mode 100644
index 00000000..b19b2568
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-powerpc-topology-info.patch
@@ -0,0 +1,63 @@
+Fix PPC toology macros
+
+diff --git a/arch/powerpc/include/asm/topology.h b/arch/powerpc/include/asm/topology.h
+index c971858..eefc7df 100644
+--- a/arch/powerpc/include/asm/topology.h
++++ b/arch/powerpc/include/asm/topology.h
+@@ -124,13 +124,15 @@ static inline int stop_topology_update(void)
+ #include
+ #define smt_capable() (cpu_has_feature(CPU_FTR_SMT))
+
+-#ifdef CONFIG_PPC64
+ #include
+
+-#define topology_thread_cpumask(cpu) (per_cpu(cpu_sibling_map, cpu))
+-#define topology_core_cpumask(cpu) (per_cpu(cpu_core_map, cpu))
+-#define topology_core_id(cpu) (cpu_to_core_id(cpu))
++#ifdef CONFIG_PPC64
++#define topology_thread_cpumask(cpu) (per_cpu(cpu_sibling_map, cpu))
++#define topology_physical_package_id(cpu) (get_hard_smp_processor_id(cpu))
+ #endif
++#define topology_core_cpumask(cpu) (per_cpu(cpu_core_map, cpu))
++#define topology_core_id(cpu) (cpu_to_core_id(cpu))
++#define topology_physical_package_id(cpu) (0)
+ #endif
+
+ #endif /* __KERNEL__ */
+diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c
+index 77bb77d..efd43dd 100644
+--- a/arch/powerpc/kernel/setup-common.c
++++ b/arch/powerpc/kernel/setup-common.c
+@@ -199,6 +199,23 @@ static void show_cpuinfo_summary(struct seq_file *m)
+ #endif
+ }
+
++/*
++ * Get CPU information for use by the procfs.
++ */
++static void show_cpuinfo_core(struct seq_file *m, unsigned int cpu)
++{
++
++
++#ifdef CONFIG_SMP
++#ifdef CONFIG_PPC64
++ seq_printf(m, "physical id\t: %d\n", get_hard_smp_processor_id(cpu));
++#else /* Assume 32 bit archs are single package */
++ seq_printf(m, "physical id\t: %d\n", (0));
++#endif /* CONFIG_PPC64 */
++ seq_printf(m, "core id\t\t: %d\n", (cpu_to_core_id(cpu)));
++#endif
++}
++
+ static int show_cpuinfo(struct seq_file *m, void *v)
+ {
+ unsigned long cpu_id = (unsigned long)v - 1;
+@@ -302,6 +319,8 @@ static int show_cpuinfo(struct seq_file *m, void *v)
+ seq_printf(m, "revision\t: %hd.%hd (pvr %04x %04x)\n",
+ maj, min, PVR_VER(pvr), PVR_REV(pvr));
+
++ show_cpuinfo_core(m, cpu_id);
++
+ #ifdef CONFIG_PPC32
+ seq_printf(m, "bogomips\t: %lu.%02lu\n",
+ loops_per_jiffy / (500000/HZ),
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-powerpc-warn-unmapped-irq.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-powerpc-warn-unmapped-irq.patch
new file mode 100644
index 00000000..578fe4b1
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/arch-powerpc-warn-unmapped-irq.patch
@@ -0,0 +1,20 @@
+#Copyright 2012 Cumulus Networks, Inc. All rights reserved.
+
+diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
+index 458ed3b..9508bec 100644
+--- a/arch/powerpc/kernel/pci-common.c
++++ b/arch/powerpc/kernel/pci-common.c
+@@ -1112,6 +1112,13 @@ void __devinit pcibios_setup_bus_devices(struct pci_bus *bus)
+ ppc_md.pci_dma_dev_setup(dev);
+
+ /* Read default IRQs and fixup if necessary */
++ if (pci_read_irq_line(dev) && (dev->devfn != 0)) {
++ printk(KERN_WARNING
++ "WARNING: Unable to map IRQ in device tree for pci device "
++ "%04x:%02x:%02x.%d\n",
++ pci_domain_nr(dev->bus), dev->bus->number, PCI_SLOT(dev->devfn),
++ PCI_FUNC(dev->devfn));
++ }
+ pci_read_irq_line(dev);
+ if (ppc_md.pci_irq_fixup)
+ ppc_md.pci_irq_fixup(dev);
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/debian-build.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/debian-build.patch
new file mode 100644
index 00000000..7714a316
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/debian-build.patch
@@ -0,0 +1,13 @@
+Add control and postinstall
+
+diff --git a/debiancl/control.bcm-modules b/debiancl/control.bcm-modules
+new file mode 100644
+index 0000000..98dd20b
+--- /dev/null
++++ b/debiancl/control.bcm-modules
+@@ -0,0 +1,5 @@
++Package: bcm-modules
++Version: =V
++Architecture: =A
++Maintainer: support@cumulusnetworks.com
++Description: Modules for BCM SDK
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/debian-cumulus-config-abi-ref.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/debian-cumulus-config-abi-ref.patch
new file mode 100644
index 00000000..32e87bca
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/debian-cumulus-config-abi-ref.patch
@@ -0,0 +1,4920 @@
+Abi ref generated with cumulus config file
+
+diff --git a/debian/abi/3.2.0-4/powerpc_none_powerpc-smp-cumulus b/debian/abi/3.2.0-4/powerpc_none_powerpc-smp-cumulus
+new file mode 100644
+index 0000000..f461280
+--- /dev/null
++++ b/debian/abi/3.2.0-4/powerpc_none_powerpc-smp-cumulus
+@@ -0,0 +1,4912 @@
++0x897b7f0f usb_serial_generic_submit_read_urb vmlinux EXPORT_SYMBOL_GPL
++0x7de5bdf0 generic_file_splice_write vmlinux EXPORT_SYMBOL
++0x801e2bc9 set_anon_super vmlinux EXPORT_SYMBOL
++0x6fce9192 kmem_cache_alloc vmlinux EXPORT_SYMBOL
++0x96f799f3 replace_page_cache_page vmlinux EXPORT_SYMBOL_GPL
++0x70523a7a __cond_resched_softirq vmlinux EXPORT_SYMBOL
++0x9147a486 of_get_property vmlinux EXPORT_SYMBOL
++0x009a3fb6 i2c_put_adapter vmlinux EXPORT_SYMBOL
++0x495ed07e rtc_class_open vmlinux EXPORT_SYMBOL_GPL
++0x96cd2b04 scsi_sense_key_string vmlinux EXPORT_SYMBOL
++0x0a2487e0 unblock_all_signals vmlinux EXPORT_SYMBOL
++0x3dcfd253 dev_uc_sync vmlinux EXPORT_SYMBOL
++0x8bdf1749 dev_mc_sync vmlinux EXPORT_SYMBOL
++0xccd91589 hwmon_device_unregister vmlinux EXPORT_SYMBOL_GPL
++0xdf27877b register_timer_hook vmlinux EXPORT_SYMBOL_GPL
++0xfbaaf01e console_lock vmlinux EXPORT_SYMBOL
++0xe113bbbc csum_partial vmlinux EXPORT_SYMBOL
++0xa39d9220 unregister_timer_hook vmlinux EXPORT_SYMBOL_GPL
++0xc068440e __kfifo_alloc vmlinux EXPORT_SYMBOL
++0xddf5478d nf_log_register vmlinux EXPORT_SYMBOL
++0x69aa9637 scsi_execute vmlinux EXPORT_SYMBOL
++0x1b17e06c kstrtoll vmlinux EXPORT_SYMBOL
++0xc161fa2b proc_net_remove vmlinux EXPORT_SYMBOL_GPL
++0xcb8c9724 raw_seq_open vmlinux EXPORT_SYMBOL_GPL
++0x8f6f24c7 device_del vmlinux EXPORT_SYMBOL_GPL
++0x0058381b device_add vmlinux EXPORT_SYMBOL_GPL
++0x416460c6 crypto_hash_walk_done vmlinux EXPORT_SYMBOL_GPL
++0xaf063510 _raw_spin_lock_bh vmlinux EXPORT_SYMBOL
++0x3c942368 profile_event_unregister vmlinux EXPORT_SYMBOL_GPL
++0x89ff43f6 init_uts_ns vmlinux EXPORT_SYMBOL_GPL
++0xca8f2cf7 __inet6_hash vmlinux EXPORT_SYMBOL
++0x69181415 dst_release vmlinux EXPORT_SYMBOL
++0x33213a5f sock_no_mmap vmlinux EXPORT_SYMBOL
++0xba0cf4bd disk_map_sector_rcu vmlinux EXPORT_SYMBOL_GPL
++0x206e3996 sysfs_update_group vmlinux EXPORT_SYMBOL_GPL
++0xa38602cd drain_workqueue vmlinux EXPORT_SYMBOL_GPL
++0xfdb9b629 ioread32be vmlinux EXPORT_SYMBOL
++0x436708b0 tcp_initialize_rcv_mss vmlinux EXPORT_SYMBOL
++0x54e6fcdd net_enable_timestamp vmlinux EXPORT_SYMBOL
++0xea2c390d sockfd_lookup vmlinux EXPORT_SYMBOL
++0xc4f9f419 usb_serial_generic_write_bulk_callback vmlinux EXPORT_SYMBOL_GPL
++0xea9855ae blk_limits_max_hw_sectors vmlinux EXPORT_SYMBOL
++0x3dcb51c4 directly_mappable_cdev_bdi vmlinux EXPORT_SYMBOL
++0x6bc3fbc0 __unregister_chrdev vmlinux EXPORT_SYMBOL
++0xa72f6b4b srcu_notifier_chain_register vmlinux EXPORT_SYMBOL_GPL
++0xb5dea7ef g_token_size vmlinux EXPORT_SYMBOL_GPL
++0x122d10bc dev_graft_qdisc vmlinux EXPORT_SYMBOL
++0x829e76cd scsi_get_command vmlinux EXPORT_SYMBOL
++0x7ff10ccf raw_notifier_call_chain vmlinux EXPORT_SYMBOL_GPL
++0xca18d700 flush_tlb_range vmlinux EXPORT_SYMBOL
++0xd54291e6 scsi_target_quiesce vmlinux EXPORT_SYMBOL
++0x2f225631 transport_class_register vmlinux EXPORT_SYMBOL_GPL
++0x30cada8f radix_tree_next_hole vmlinux EXPORT_SYMBOL
++0x66d0ee54 vfsmount_lock_global_unlock vmlinux EXPORT_SYMBOL
++0xdad1a719 input_handler_for_each_handle vmlinux EXPORT_SYMBOL
++0xe3e619b2 transport_class_unregister vmlinux EXPORT_SYMBOL_GPL
++0xffd5a395 default_wake_function vmlinux EXPORT_SYMBOL
++0x434c3c59 pci_bus_read_config_byte vmlinux EXPORT_SYMBOL
++0x1a58b8f5 mount_subtree vmlinux EXPORT_SYMBOL
++0x7eaa917d iget_locked vmlinux EXPORT_SYMBOL
++0x9a696827 sock_get_timestampns vmlinux EXPORT_SYMBOL
++0x0f4ca848 class_interface_register vmlinux EXPORT_SYMBOL_GPL
++0xb711d84e key_type_keyring vmlinux EXPORT_SYMBOL
++0xa4b94fea iowrite8_rep vmlinux EXPORT_SYMBOL
++0x8c7a3757 of_get_named_gpio_flags vmlinux EXPORT_SYMBOL
++0x0f05e347 spi_get_device_id vmlinux EXPORT_SYMBOL_GPL
++0xfa010184 class_interface_unregister vmlinux EXPORT_SYMBOL_GPL
++0x73a903c4 vfsmount_lock_local_lock vmlinux EXPORT_SYMBOL
++0xa9c530b8 unregister_oom_notifier vmlinux EXPORT_SYMBOL_GPL
++0x2eec63c9 xdr_encode_netobj vmlinux EXPORT_SYMBOL_GPL
++0xd5cd5612 xdr_decode_word vmlinux EXPORT_SYMBOL_GPL
++0x9d92332a tty_register_device vmlinux EXPORT_SYMBOL
++0x44366cfc simple_write_to_buffer vmlinux EXPORT_SYMBOL
++0xa28d5490 __srcu_read_unlock vmlinux EXPORT_SYMBOL_GPL
++0xc2e587d1 reset_devices vmlinux EXPORT_SYMBOL
++0x9cdd28bc of_find_all_nodes vmlinux EXPORT_SYMBOL
++0xac1b6c1d mmc_app_cmd vmlinux EXPORT_SYMBOL_GPL
++0x3df5e4b2 usb_bus_list_lock vmlinux EXPORT_SYMBOL_GPL
++0xa5a633b9 sg_last vmlinux EXPORT_SYMBOL
++0xe601908d __blk_run_queue vmlinux EXPORT_SYMBOL
++0x643eaec8 param_get_string vmlinux EXPORT_SYMBOL
++0x99bb8806 memmove vmlinux EXPORT_SYMBOL
++0xf0904255 __block_page_mkwrite vmlinux EXPORT_SYMBOL
++0x76d3cd60 laptop_mode vmlinux EXPORT_SYMBOL
++0xa10b7029 generic_file_direct_write vmlinux EXPORT_SYMBOL
++0xb7032a2f end_page_writeback vmlinux EXPORT_SYMBOL
++0x50f5e532 call_rcu_sched vmlinux EXPORT_SYMBOL_GPL
++0x46e0a7f2 skb_recv_datagram vmlinux EXPORT_SYMBOL
++0xe230598d d_alloc_pseudo vmlinux EXPORT_SYMBOL
++0x871c0a7e fiemap_check_flags vmlinux EXPORT_SYMBOL
++0x51221294 generic_file_readonly_mmap vmlinux EXPORT_SYMBOL
++0x5d730e7b raw_notifier_chain_unregister vmlinux EXPORT_SYMBOL_GPL
++0x0d542439 __ipv6_addr_type vmlinux EXPORT_SYMBOL
++0x8c5e419b unregister_qdisc vmlinux EXPORT_SYMBOL
++0xe3ebc041 phy_device_register vmlinux EXPORT_SYMBOL
++0x7fd37e2b pci_map_rom vmlinux EXPORT_SYMBOL
++0xdfef1b84 crypto_shash_finup vmlinux EXPORT_SYMBOL_GPL
++0xb58965de crypto_shash_final vmlinux EXPORT_SYMBOL_GPL
++0xea9ea6f1 crypto_ahash_finup vmlinux EXPORT_SYMBOL_GPL
++0x34e42b95 crypto_ahash_final vmlinux EXPORT_SYMBOL_GPL
++0x8da17b42 scatterwalk_copychunks vmlinux EXPORT_SYMBOL_GPL
++0xf9d1164c rpc_free vmlinux EXPORT_SYMBOL_GPL
++0xc78a46ea vm_insert_page vmlinux EXPORT_SYMBOL
++0xad9cdfab register_console vmlinux EXPORT_SYMBOL
++0x243c6e2f nf_conntrack_l4proto_tcp4 net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x227491cf sock_no_socketpair vmlinux EXPORT_SYMBOL
++0x1a0cac4b input_ff_event vmlinux EXPORT_SYMBOL_GPL
++0xb7e566f8 arpt_do_table net/ipv4/netfilter/arp_tables EXPORT_SYMBOL
++0xdfcd2d6f dev_addr_del vmlinux EXPORT_SYMBOL
++0x8631f469 gnet_stats_start_copy vmlinux EXPORT_SYMBOL
++0x87a8ad19 nfs_retry_commit vmlinux EXPORT_SYMBOL_GPL
++0x7aa1a681 tcp_tso_segment vmlinux EXPORT_SYMBOL
++0x9620e18a i2c_lock_adapter vmlinux EXPORT_SYMBOL_GPL
++0xd7ea90c8 platform_device_del vmlinux EXPORT_SYMBOL_GPL
++0x1511ba61 platform_device_put vmlinux EXPORT_SYMBOL_GPL
++0x3e96ee6c __fat_fs_error vmlinux EXPORT_SYMBOL_GPL
++0xb741990c bio_copy_kern vmlinux EXPORT_SYMBOL
++0xe0878bfe __krealloc vmlinux EXPORT_SYMBOL
++0xd8605470 devm_free_irq vmlinux EXPORT_SYMBOL
++0x995d1071 prof_on vmlinux EXPORT_SYMBOL_GPL
++0xa652c4ef __kfifo_dma_in_prepare_r vmlinux EXPORT_SYMBOL
++0xa662b253 task_nice vmlinux EXPORT_SYMBOL
++0x4e9dffb5 ip_fast_csum vmlinux EXPORT_SYMBOL
++0xb9524c5c rpc_exit vmlinux EXPORT_SYMBOL_GPL
++0x5195426a kernel_accept vmlinux EXPORT_SYMBOL
++0x1a26398f pcim_iounmap vmlinux EXPORT_SYMBOL
++0x420ffdd5 kset_create_and_add vmlinux EXPORT_SYMBOL_GPL
++0xc47933f9 mm_kobj vmlinux EXPORT_SYMBOL_GPL
++0xd6d48dbb set_bdi_congested vmlinux EXPORT_SYMBOL
++0x5d9c4677 xt_proto_fini vmlinux EXPORT_SYMBOL_GPL
++0x481bf5f1 driver_find vmlinux EXPORT_SYMBOL_GPL
++0xd461ba2e sg_miter_start vmlinux EXPORT_SYMBOL
++0x4aef7e80 blk_queue_unprep_rq vmlinux EXPORT_SYMBOL
++0x54b411de lock_may_read vmlinux EXPORT_SYMBOL
++0xdbe4131c tty_mode_ioctl vmlinux EXPORT_SYMBOL_GPL
++0x0dc5ceb6 load_nls vmlinux EXPORT_SYMBOL
++0x4563a37d qe_setbrg vmlinux EXPORT_SYMBOL
++0x4859b8bb rtc_year_days vmlinux EXPORT_SYMBOL
++0x4d172ccb ehci_cf_port_reset_rwsem vmlinux EXPORT_SYMBOL_GPL
++0x0c65e73c scsi_normalize_sense vmlinux EXPORT_SYMBOL
++0xb65bd3fc add_timer_on vmlinux EXPORT_SYMBOL_GPL
++0x7e17ba7b klist_iter_exit vmlinux EXPORT_SYMBOL_GPL
++0xcbf1d339 ip6_local_out vmlinux EXPORT_SYMBOL_GPL
++0x8818a3de pci_slots_kset vmlinux EXPORT_SYMBOL_GPL
++0x215ebd78 bitrev16 vmlinux EXPORT_SYMBOL
++0x390def22 kstrtou16_from_user vmlinux EXPORT_SYMBOL
++0x9a74417e kstrtoull_from_user vmlinux EXPORT_SYMBOL
++0x72b243d4 free_dma vmlinux EXPORT_SYMBOL
++0x6e13f758 xdr_init_decode vmlinux EXPORT_SYMBOL_GPL
++0xd072d7d2 device_unregister vmlinux EXPORT_SYMBOL_GPL
++0x30e54d7e crypto_aead_type vmlinux EXPORT_SYMBOL_GPL
++0xafda2ff8 xfrm_state_add vmlinux EXPORT_SYMBOL
++0xcbf4e023 mmc_cleanup_queue vmlinux EXPORT_SYMBOL
++0xed23b4df nf_ct_l3proto_put net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x5b57fe3e scsicam_bios_param vmlinux EXPORT_SYMBOL
++0x853adf25 single_release_net vmlinux EXPORT_SYMBOL_GPL
++0xcd24efa3 I_BDEV vmlinux EXPORT_SYMBOL
++0x74abdafa task_handoff_register vmlinux EXPORT_SYMBOL_GPL
++0x68887e62 tty_port_tty_set vmlinux EXPORT_SYMBOL
++0x5791030d tty_port_tty_get vmlinux EXPORT_SYMBOL
++0x3441c3d6 gpio_set_value_cansleep vmlinux EXPORT_SYMBOL_GPL
++0x6852cd21 seq_release_net vmlinux EXPORT_SYMBOL_GPL
++0x3c0fca43 inet_csk_route_child_sock vmlinux EXPORT_SYMBOL_GPL
++0x28c3aed9 phy_stop_interrupts vmlinux EXPORT_SYMBOL
++0xea5974e8 vfs_path_lookup vmlinux EXPORT_SYMBOL
++0x4790c5b9 find_or_create_page vmlinux EXPORT_SYMBOL
++0x5b0d97e2 schedule_hrtimeout_range vmlinux EXPORT_SYMBOL_GPL
++0xd8849ae7 usb_sg_init vmlinux EXPORT_SYMBOL_GPL
++0x4af7e190 usb_sg_wait vmlinux EXPORT_SYMBOL_GPL
++0xfaf32193 scsi_reset_provider vmlinux EXPORT_SYMBOL
++0x115de368 crypto_register_pcomp vmlinux EXPORT_SYMBOL_GPL
++0x3a47e130 invalidate_bdev vmlinux EXPORT_SYMBOL
++0x9aeacb87 ring_buffer_iter_empty vmlinux EXPORT_SYMBOL_GPL
++0x1f8cee61 tcp_twsk_unique vmlinux EXPORT_SYMBOL_GPL
++0xd3984b47 netdev_info vmlinux EXPORT_SYMBOL
++0x0ba0a26c mmc_try_claim_host vmlinux EXPORT_SYMBOL
++0x11267875 scsi_extd_sense_format vmlinux EXPORT_SYMBOL
++0xeefae453 xdr_buf_from_iov vmlinux EXPORT_SYMBOL_GPL
++0x65b252e9 of_n_addr_cells vmlinux EXPORT_SYMBOL
++0x0e3ead77 pci_bus_write_config_dword vmlinux EXPORT_SYMBOL
++0xf18f172c __dev_printk vmlinux EXPORT_SYMBOL
++0x9445ac6b tty_hung_up_p vmlinux EXPORT_SYMBOL
++0x02e24269 blk_cleanup_queue vmlinux EXPORT_SYMBOL
++0x24995a6b generic_setlease vmlinux EXPORT_SYMBOL
++0x00372404 ipv6_getsockopt vmlinux EXPORT_SYMBOL
++0xdc047fc4 scsi_dev_info_list_add_keyed vmlinux EXPORT_SYMBOL
++0x06094818 pcim_enable_device vmlinux EXPORT_SYMBOL
++0xf9091ce7 timerqueue_del vmlinux EXPORT_SYMBOL_GPL
++0xc742c7f7 usb_driver_release_interface vmlinux EXPORT_SYMBOL_GPL
++0xdaa3f256 swiotlb_unmap_sg vmlinux EXPORT_SYMBOL
++0xbbfeb33c mpage_writepages vmlinux EXPORT_SYMBOL
++0xe1b2b01a write_one_page vmlinux EXPORT_SYMBOL
++0xd944d8f9 ktime_get_boottime vmlinux EXPORT_SYMBOL_GPL
++0x15892417 async_synchronize_cookie vmlinux EXPORT_SYMBOL_GPL
++0x04f58c37 inet_add_protocol vmlinux EXPORT_SYMBOL
++0xd48581cf n_tty_ioctl_helper vmlinux EXPORT_SYMBOL
++0x763793e1 nlmsvc_ops vmlinux EXPORT_SYMBOL_GPL
++0xe01bf95f sync_blockdev vmlinux EXPORT_SYMBOL
++0x4cae72a5 nobh_write_end vmlinux EXPORT_SYMBOL
++0xb753bcc8 __ashrdi3 vmlinux EXPORT_SYMBOL
++0xbd9e5d49 __lshrdi3 vmlinux EXPORT_SYMBOL
++0x6e720ff2 rtnl_unlock vmlinux EXPORT_SYMBOL
++0xfad6aff2 sock_rfree vmlinux EXPORT_SYMBOL
++0x4c4d5c41 kernel_recvmsg vmlinux EXPORT_SYMBOL
++0x9336642f sdhci_alloc_host vmlinux EXPORT_SYMBOL_GPL
++0x809ed043 __root_device_register vmlinux EXPORT_SYMBOL_GPL
++0xc0a3d105 find_next_bit vmlinux EXPORT_SYMBOL
++0x7c43ef3e disk_part_iter_init vmlinux EXPORT_SYMBOL_GPL
++0x2e3f5691 freeze_bdev vmlinux EXPORT_SYMBOL
++0x5bff2a2d srcu_batches_completed vmlinux EXPORT_SYMBOL_GPL
++0x515e24a7 flush_instruction_cache vmlinux EXPORT_SYMBOL
++0x6e44d7eb ip_xfrm_me_harder vmlinux EXPORT_SYMBOL
++0xd7f36357 __netdev_printk vmlinux EXPORT_SYMBOL
++0xc1085178 skb_kill_datagram vmlinux EXPORT_SYMBOL
++0x6d139e79 kfree_skb vmlinux EXPORT_SYMBOL
++0x0d385349 kernel_kobj vmlinux EXPORT_SYMBOL_GPL
++0x0d5b063c atomic_notifier_chain_register vmlinux EXPORT_SYMBOL_GPL
++0x7ce0ae7c param_get_long vmlinux EXPORT_SYMBOL
++0x96cbb2f4 inet_twsk_schedule vmlinux EXPORT_SYMBOL_GPL
++0x79387c50 pci_msi_off vmlinux EXPORT_SYMBOL_GPL
++0x31634792 nfnetlink_parse_nat_setup_hook net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xcc645e42 svc_set_num_threads vmlinux EXPORT_SYMBOL_GPL
++0x11ba3f13 skb_copy_datagram_iovec vmlinux EXPORT_SYMBOL
++0xf674ecb9 __kfree_skb vmlinux EXPORT_SYMBOL
++0x476b6a01 get_mtd_device_nm vmlinux EXPORT_SYMBOL_GPL
++0x55ceb682 pci_find_parent_resource vmlinux EXPORT_SYMBOL
++0x6d69fa17 ip_defrag vmlinux EXPORT_SYMBOL
++0x65b9b8a1 register_qdisc vmlinux EXPORT_SYMBOL
++0x6eab6815 mmc_interrupt_hpi vmlinux EXPORT_SYMBOL
++0x82feec40 mmc_can_discard vmlinux EXPORT_SYMBOL
++0x0d9a9ca3 scsi_flush_work vmlinux EXPORT_SYMBOL_GPL
++0x5b323547 sysdev_show_int vmlinux EXPORT_SYMBOL_GPL
++0x11cf27a9 idr_destroy vmlinux EXPORT_SYMBOL
++0xb857da73 ida_destroy vmlinux EXPORT_SYMBOL
++0x58bd4122 generic_file_aio_read vmlinux EXPORT_SYMBOL
++0x4596db6a sys_sigreturn vmlinux EXPORT_SYMBOL
++0xa9571d6d DMA_MODE_WRITE vmlinux EXPORT_SYMBOL
++0x80c07906 arpt_alloc_initial_table net/ipv4/netfilter/arp_tables EXPORT_SYMBOL_GPL
++0x5013cc99 xprt_wait_for_buffer_space vmlinux EXPORT_SYMBOL_GPL
++0x4379a238 free_netdev vmlinux EXPORT_SYMBOL
++0xc9ec4e21 free_percpu vmlinux EXPORT_SYMBOL_GPL
++0x966ae342 qe_issue_cmd vmlinux EXPORT_SYMBOL
++0x191af13e gss_mech_get_by_pseudoflavor vmlinux EXPORT_SYMBOL_GPL
++0x2764067e sk_setup_caps vmlinux EXPORT_SYMBOL_GPL
++0x6696da6c spi_sync_locked vmlinux EXPORT_SYMBOL_GPL
++0x2e89318f scsi_host_get vmlinux EXPORT_SYMBOL
++0x668da8d5 zlib_inflateIncomp vmlinux EXPORT_SYMBOL
++0xbcffe639 idr_pre_get vmlinux EXPORT_SYMBOL
++0x4430c75c ida_pre_get vmlinux EXPORT_SYMBOL
++0x28d664ff __raw_notifier_call_chain vmlinux EXPORT_SYMBOL_GPL
++0x4d3c153f sigprocmask vmlinux EXPORT_SYMBOL
++0xbafed486 sk_stream_wait_connect vmlinux EXPORT_SYMBOL
++0x2d3dc22e mtd_concat_destroy vmlinux EXPORT_SYMBOL
++0x4a3551ae do_mmap_pgoff vmlinux EXPORT_SYMBOL
++0x8d551bef sysctl_tcp_rmem vmlinux EXPORT_SYMBOL
++0x28053699 sock_no_sendmsg vmlinux EXPORT_SYMBOL
++0x11dee08f i2c_master_recv vmlinux EXPORT_SYMBOL
++0x8239ab90 vfs_unlink vmlinux EXPORT_SYMBOL
++0x7d83ac1c key_revoke vmlinux EXPORT_SYMBOL
++0x4e560ec4 pipe_unlock vmlinux EXPORT_SYMBOL
++0x9f0020c3 xprt_reserve_xprt_cong vmlinux EXPORT_SYMBOL_GPL
++0x777919af genlmsg_multicast_allns vmlinux EXPORT_SYMBOL
++0xd0a074bc bus_rescan_devices vmlinux EXPORT_SYMBOL_GPL
++0x1676e2aa put_tty_driver vmlinux EXPORT_SYMBOL
++0x1655bb05 queue_work_on vmlinux EXPORT_SYMBOL_GPL
++0x59d8223a ioport_resource vmlinux EXPORT_SYMBOL
++0xc7a4fbed rtnl_lock vmlinux EXPORT_SYMBOL
++0x73dc60ee debugfs_create_bool vmlinux EXPORT_SYMBOL_GPL
++0x490c6774 generic_file_splice_read vmlinux EXPORT_SYMBOL
++0xdd2efc0f ring_buffer_reset_cpu vmlinux EXPORT_SYMBOL_GPL
++0x1e10f34d prepare_kernel_cred vmlinux EXPORT_SYMBOL
++0x897473df mktime vmlinux EXPORT_SYMBOL
++0x582a4747 cacheable_memcpy vmlinux EXPORT_SYMBOL
++0x2288378f system_state vmlinux EXPORT_SYMBOL
++0xbe28b63a xfrm6_tunnel_alloc_spi net/ipv6/xfrm6_tunnel EXPORT_SYMBOL
++0x55e7d3c6 llc_add_pack vmlinux EXPORT_SYMBOL
++0x725c25a5 hidinput_connect vmlinux EXPORT_SYMBOL_GPL
++0x906e4ad5 splice_from_pipe_next vmlinux EXPORT_SYMBOL
++0xc3fe87c8 param_ops_uint vmlinux EXPORT_SYMBOL
++0x6f0036d9 del_timer_sync vmlinux EXPORT_SYMBOL
++0xd3187da4 pcibios_align_resource vmlinux EXPORT_SYMBOL
++0x00e8097b csum_partial_copy_fromiovecend vmlinux EXPORT_SYMBOL
++0xda7c407f pci_device_from_OF_node vmlinux EXPORT_SYMBOL
++0xb7ac4d23 __qdisc_calculate_pkt_len vmlinux EXPORT_SYMBOL
++0x0aef6a87 dev_get_by_index vmlinux EXPORT_SYMBOL
++0x8136020d mtd_do_chip_probe vmlinux EXPORT_SYMBOL
++0x75d1b1a3 pci_enable_ido vmlinux EXPORT_SYMBOL
++0x462a2e75 match_strlcpy vmlinux EXPORT_SYMBOL
++0x9eaa0939 ioctl_by_bdev vmlinux EXPORT_SYMBOL
++0x680b7306 init_net vmlinux EXPORT_SYMBOL
++0x43db0e97 mmc_power_restore_host vmlinux EXPORT_SYMBOL
++0x56dbc713 textsearch_find_continuous vmlinux EXPORT_SYMBOL
++0xf0c9ee0d __next_cpu vmlinux EXPORT_SYMBOL
++0x8741e2bf crypto_larval_lookup vmlinux EXPORT_SYMBOL_GPL
++0x6b0bc2b4 __crypto_alloc_tfm vmlinux EXPORT_SYMBOL_GPL
++0xf520946d key_unlink vmlinux EXPORT_SYMBOL
++0xc746051c keyring_search vmlinux EXPORT_SYMBOL
++0xd820c283 eventfd_ctx_remove_wait_queue vmlinux EXPORT_SYMBOL_GPL
++0x4d89bb43 generic_delete_inode vmlinux EXPORT_SYMBOL
++0xb5f17edf perf_register_guest_info_callbacks vmlinux EXPORT_SYMBOL_GPL
++0xb99f2613 nf_nat_pptp_hook_expectfn net/netfilter/nf_conntrack_pptp EXPORT_SYMBOL_GPL
++0x51fa9bbe mmc_wait_for_req vmlinux EXPORT_SYMBOL
++0xd5b037e1 kref_put vmlinux EXPORT_SYMBOL
++0xcf8bcc49 blk_run_queue vmlinux EXPORT_SYMBOL
++0xf1814894 __secpath_destroy vmlinux EXPORT_SYMBOL
++0x5ab518a3 i2c_smbus_write_i2c_block_data vmlinux EXPORT_SYMBOL
++0xaf64ad0d zlib_deflate vmlinux EXPORT_SYMBOL
++0x24fdac79 wake_bit_function vmlinux EXPORT_SYMBOL
++0xe55658d4 inet_csk_route_req vmlinux EXPORT_SYMBOL_GPL
++0xb6a61a86 qdisc_get_rtab vmlinux EXPORT_SYMBOL
++0x87b6bcc7 hid_set_field vmlinux EXPORT_SYMBOL_GPL
++0xb8d10b39 bus_remove_file vmlinux EXPORT_SYMBOL_GPL
++0x91b9e2f2 locks_release_private vmlinux EXPORT_SYMBOL_GPL
++0x06bbb24a mempool_resize vmlinux EXPORT_SYMBOL
++0x739f99ed xfrm_unregister_km vmlinux EXPORT_SYMBOL
++0xee4d52d7 in_dev_finish_destroy vmlinux EXPORT_SYMBOL
++0xadd26e5f of_find_node_by_phandle vmlinux EXPORT_SYMBOL
++0xe01c7326 hid_destroy_device vmlinux EXPORT_SYMBOL_GPL
++0xe094ef39 sg_next vmlinux EXPORT_SYMBOL
++0xe16a87dd bio_map_user vmlinux EXPORT_SYMBOL
++0x0b07abe2 unshare_fs_struct vmlinux EXPORT_SYMBOL_GPL
++0x3a746f01 smp_call_function_any vmlinux EXPORT_SYMBOL_GPL
++0x3534e2a3 system_nrt_wq vmlinux EXPORT_SYMBOL_GPL
++0xd0fb7cd4 __tasklet_hi_schedule_first vmlinux EXPORT_SYMBOL
++0x3913cd81 __nf_conntrack_confirm net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xce24147c mdiobus_scan vmlinux EXPORT_SYMBOL
++0xe4633d09 dmam_alloc_coherent vmlinux EXPORT_SYMBOL
++0xab3a9f77 tty_port_carrier_raised vmlinux EXPORT_SYMBOL
++0x58811a0b __brelse vmlinux EXPORT_SYMBOL
++0xe68e5b43 pipe_lock vmlinux EXPORT_SYMBOL
++0x7de53067 rpc_init_rtt vmlinux EXPORT_SYMBOL_GPL
++0xe05b0141 scsi_device_set_state vmlinux EXPORT_SYMBOL
++0x347fd4b3 eventfd_ctx_get vmlinux EXPORT_SYMBOL_GPL
++0x941f2aaa eventfd_ctx_put vmlinux EXPORT_SYMBOL_GPL
++0xd0d75837 mark_buffer_async_write vmlinux EXPORT_SYMBOL
++0x46d12956 wait_for_completion_interruptible_timeout vmlinux EXPORT_SYMBOL
++0x28e23139 xfrm_probe_algs vmlinux EXPORT_SYMBOL_GPL
++0xf16deeae ip_route_me_harder vmlinux EXPORT_SYMBOL
++0xb0463cdc inet_sock_destruct vmlinux EXPORT_SYMBOL
++0xab462791 nf_reinject vmlinux EXPORT_SYMBOL
++0x27ccd3d0 mmc_add_host vmlinux EXPORT_SYMBOL
++0xd4664535 tty_chars_in_buffer vmlinux EXPORT_SYMBOL
++0x3a9b6fb9 blk_unregister_region vmlinux EXPORT_SYMBOL
++0xb72e0ba9 unregister_nls vmlinux EXPORT_SYMBOL
++0x5358fc36 ring_buffer_discard_commit vmlinux EXPORT_SYMBOL_GPL
++0x2b607170 ktime_sub_ns vmlinux EXPORT_SYMBOL_GPL
++0xc17515d7 usb_hcds_loaded vmlinux EXPORT_SYMBOL_GPL
++0x97e692df skb_pull_rcsum vmlinux EXPORT_SYMBOL_GPL
++0x93055e19 __scsi_device_lookup_by_target vmlinux EXPORT_SYMBOL
++0x01902adf netpoll_trap vmlinux EXPORT_SYMBOL
++0x1a53c006 ethtool_invalid_flags vmlinux EXPORT_SYMBOL
++0xebdbe48c radix_tree_gang_lookup vmlinux EXPORT_SYMBOL
++0x07191aeb register_nls vmlinux EXPORT_SYMBOL
++0x9445cf38 locks_alloc_lock vmlinux EXPORT_SYMBOL_GPL
++0x6585e310 alloc_pages_exact_nid vmlinux EXPORT_SYMBOL
++0x1627ed72 register_dcbevent_notifier vmlinux EXPORT_SYMBOL
++0x62bc31e3 svc_prepare_thread vmlinux EXPORT_SYMBOL_GPL
++0x3dee3f15 xfrm_state_lookup vmlinux EXPORT_SYMBOL
++0x6c1c469c tcp_parse_options vmlinux EXPORT_SYMBOL
++0xd5e04f9e rps_may_expire_flow vmlinux EXPORT_SYMBOL
++0x2c1aaab6 of_gpio_simple_xlate vmlinux EXPORT_SYMBOL
++0xf52be163 i2c_smbus_write_block_data vmlinux EXPORT_SYMBOL
++0x71b46d5a svc_gss_principal vmlinux EXPORT_SYMBOL_GPL
++0x6013246a rpc_unlink vmlinux EXPORT_SYMBOL_GPL
++0x6f959b35 locks_in_grace vmlinux EXPORT_SYMBOL_GPL
++0x2749fd92 module_refcount vmlinux EXPORT_SYMBOL
++0xb1ac2e02 inet_ctl_sock_create vmlinux EXPORT_SYMBOL_GPL
++0xdee5a777 dev_addr_add_multiple vmlinux EXPORT_SYMBOL
++0x2f2c9199 firmware_kobj vmlinux EXPORT_SYMBOL_GPL
++0x91696a6a pci_store_saved_state vmlinux EXPORT_SYMBOL_GPL
++0x009653bb usb_lock_device_for_reset vmlinux EXPORT_SYMBOL_GPL
++0xb95e4ac4 mdiobus_alloc vmlinux EXPORT_SYMBOL
++0x31da061a get_qe_base vmlinux EXPORT_SYMBOL
++0xa3e75545 flush_tlb_kernel_range vmlinux EXPORT_SYMBOL
++0x371d2130 check_legacy_ioport vmlinux EXPORT_SYMBOL
++0xbc8b4faf genl_register_mc_group vmlinux EXPORT_SYMBOL
++0xb7ac5dda ___pskb_trim vmlinux EXPORT_SYMBOL
++0xbaa1069f tty_driver_flush_buffer vmlinux EXPORT_SYMBOL
++0x328b8594 pci_setup_cardbus vmlinux EXPORT_SYMBOL
++0x85df9b6c strsep vmlinux EXPORT_SYMBOL
++0x788fe103 iomem_resource vmlinux EXPORT_SYMBOL
++0xe2d5255a strcmp vmlinux EXPORT_SYMBOL
++0xea07d51b usb_serial_register vmlinux EXPORT_SYMBOL_GPL
++0x355bc233 devm_kfree vmlinux EXPORT_SYMBOL_GPL
++0x051fbdb5 mnt_unpin vmlinux EXPORT_SYMBOL
++0x94da4dd0 end_writeback vmlinux EXPORT_SYMBOL
++0x0e08028c vfs_create vmlinux EXPORT_SYMBOL
++0x2e5fb132 mtd_erase_callback vmlinux EXPORT_SYMBOL_GPL
++0x4b72a3d8 __ablkcipher_walk_complete vmlinux EXPORT_SYMBOL_GPL
++0x750794d1 sb_min_blocksize vmlinux EXPORT_SYMBOL
++0x59d696b6 register_module_notifier vmlinux EXPORT_SYMBOL
++0xf3d30d7b setup_deferrable_timer_on_stack_key vmlinux EXPORT_SYMBOL_GPL
++0xc7208c3a serial8250_resume_port vmlinux EXPORT_SYMBOL
++0xc490d869 hid_input_report vmlinux EXPORT_SYMBOL_GPL
++0xced3e4fb pcix_set_mmrbc vmlinux EXPORT_SYMBOL
++0xaf91d89f __kernel_param_lock vmlinux EXPORT_SYMBOL
++0xadd63611 unregister_sysctl_table vmlinux EXPORT_SYMBOL
++0xd9e09e0c of_find_property vmlinux EXPORT_SYMBOL
++0xb7bd1f4f del_gendisk vmlinux EXPORT_SYMBOL
++0x54d4dba9 block_write_full_page vmlinux EXPORT_SYMBOL
++0x70e009d6 machine_id vmlinux EXPORT_SYMBOL
++0x2af8b550 nf_ct_invert_tuple net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xcc75ede8 xfrm_register_type vmlinux EXPORT_SYMBOL
++0xf6933c48 lockd_up vmlinux EXPORT_SYMBOL_GPL
++0x58652a56 fat_sync_inode vmlinux EXPORT_SYMBOL_GPL
++0xe36816d8 put_mnt_ns vmlinux EXPORT_SYMBOL
++0xe16e2b9f clear_bdi_congested vmlinux EXPORT_SYMBOL
++0x1239f785 ____pagevec_lru_add vmlinux EXPORT_SYMBOL
++0x8df5da63 memstart_addr vmlinux EXPORT_SYMBOL
++0xd1cd3585 sock_no_setsockopt vmlinux EXPORT_SYMBOL
++0x13435bdb sock_no_getsockopt vmlinux EXPORT_SYMBOL
++0x6f0843c1 __blockdev_direct_IO vmlinux EXPORT_SYMBOL
++0x1336c951 splice_from_pipe_end vmlinux EXPORT_SYMBOL
++0x2261d711 migrate_page vmlinux EXPORT_SYMBOL
++0x2e45e488 rcu_note_context_switch vmlinux EXPORT_SYMBOL_GPL
++0x4ae11ab9 ip6_route_me_harder vmlinux EXPORT_SYMBOL
++0x05bfdc15 thermal_zone_device_update vmlinux EXPORT_SYMBOL
++0xe165d0ce nfs_commit_release_pages vmlinux EXPORT_SYMBOL_GPL
++0x10d4e73e nf_nat_proto_range_to_nlattr net/ipv4/netfilter/nf_nat EXPORT_SYMBOL_GPL
++0xee7d731d km_new_mapping vmlinux EXPORT_SYMBOL
++0x408bf35b napi_complete vmlinux EXPORT_SYMBOL
++0xa155dccc of_property_count_strings vmlinux EXPORT_SYMBOL_GPL
++0x96d1f2a7 mmc_assume_removable vmlinux EXPORT_SYMBOL
++0x47229b5c gpio_request vmlinux EXPORT_SYMBOL_GPL
++0x3d0b6923 swiotlb_sync_single_for_cpu vmlinux EXPORT_SYMBOL
++0x7f968718 generic_block_bmap vmlinux EXPORT_SYMBOL
++0x868784cb __symbol_get vmlinux EXPORT_SYMBOL_GPL
++0x36dc730d __ip_dev_find vmlinux EXPORT_SYMBOL
++0xbe0e5118 nla_memcmp vmlinux EXPORT_SYMBOL
++0xf1db1704 nla_memcpy vmlinux EXPORT_SYMBOL
++0x8348bb59 nfs_put_client vmlinux EXPORT_SYMBOL_GPL
++0xbca1e919 d_materialise_unique vmlinux EXPORT_SYMBOL_GPL
++0xf229af8b kmem_cache_free vmlinux EXPORT_SYMBOL
++0x617a2e8b file_remove_suid vmlinux EXPORT_SYMBOL
++0x13b77367 get_cpu_device vmlinux EXPORT_SYMBOL_GPL
++0x4ebf144b swiotlb_bounce vmlinux EXPORT_SYMBOL_GPL
++0x5edd0762 bin2bcd vmlinux EXPORT_SYMBOL
++0x2e9c1dbc lookup_hash vmlinux EXPORT_SYMBOL_GPL
++0xaf2d872c prepare_to_wait vmlinux EXPORT_SYMBOL
++0xadf42bd5 __request_region vmlinux EXPORT_SYMBOL
++0xf71521ba atomic64_add_return vmlinux EXPORT_SYMBOL
++0x5027f8ae bdev_read_only vmlinux EXPORT_SYMBOL
++0xf0009fee put_pages_list vmlinux EXPORT_SYMBOL
++0x3d043ff4 sock_wfree vmlinux EXPORT_SYMBOL
++0x2b318955 test_set_page_writeback vmlinux EXPORT_SYMBOL
++0xa3abc422 abort_exclusive_wait vmlinux EXPORT_SYMBOL
++0x091eb9b4 round_jiffies vmlinux EXPORT_SYMBOL_GPL
++0x86e66c33 gss_mech_get_by_OID vmlinux EXPORT_SYMBOL_GPL
++0xc705dfbd qdisc_destroy vmlinux EXPORT_SYMBOL
++0x5594be03 bitmap_remap vmlinux EXPORT_SYMBOL
++0x23ef48a6 truncate_inode_pages vmlinux EXPORT_SYMBOL
++0x0422fe4a inet_csk_timer_bug_msg vmlinux EXPORT_SYMBOL
++0x58fea811 input_flush_device vmlinux EXPORT_SYMBOL
++0x3b2b6b53 sysfs_notify vmlinux EXPORT_SYMBOL_GPL
++0x0948cde9 num_physpages vmlinux EXPORT_SYMBOL
++0x06295425 inet_hash vmlinux EXPORT_SYMBOL_GPL
++0x9a1dfd65 strpbrk vmlinux EXPORT_SYMBOL
++0x8734a5cd sysfs_create_file vmlinux EXPORT_SYMBOL_GPL
++0xf6a14396 seq_lseek vmlinux EXPORT_SYMBOL
++0xfb596d67 ip6_frag_match vmlinux EXPORT_SYMBOL
++0xa9647a71 sdhci_add_host vmlinux EXPORT_SYMBOL_GPL
++0xb53620d1 pci_vpd_find_info_keyword vmlinux EXPORT_SYMBOL_GPL
++0x1551dc51 bitmap_find_free_region vmlinux EXPORT_SYMBOL
++0x71fa908a cache_flush vmlinux EXPORT_SYMBOL_GPL
++0xd582227a leds_list_lock vmlinux EXPORT_SYMBOL_GPL
++0xe32cbdf9 set_disk_ro vmlinux EXPORT_SYMBOL
++0xfc765c13 journal_invalidatepage vmlinux EXPORT_SYMBOL
++0x4a541e7f bus_find_device vmlinux EXPORT_SYMBOL_GPL
++0xfb814465 blk_rq_unprep_clone vmlinux EXPORT_SYMBOL_GPL
++0xbb7929e0 relay_switch_subbuf vmlinux EXPORT_SYMBOL_GPL
++0xa7a37016 rpc_create vmlinux EXPORT_SYMBOL_GPL
++0x32d5e7fc xfrm_aalg_get_byid vmlinux EXPORT_SYMBOL_GPL
++0x50661a88 tcp_create_openreq_child vmlinux EXPORT_SYMBOL
++0xbe39e738 sk_common_release vmlinux EXPORT_SYMBOL
++0x096bfc06 skb_queue_head vmlinux EXPORT_SYMBOL
++0x03cfa4a0 skb_prepare_seq_read vmlinux EXPORT_SYMBOL
++0x0ecca40e sk_reset_timer vmlinux EXPORT_SYMBOL
++0x90c7fdae irq_get_irq_data vmlinux EXPORT_SYMBOL_GPL
++0x4dfed71c flex_array_get_ptr vmlinux EXPORT_SYMBOL
++0x98ed958c bio_alloc_bioset vmlinux EXPORT_SYMBOL
++0x281bf2dd usb_driver_set_configuration vmlinux EXPORT_SYMBOL_GPL
++0xb5c52e5f mii_ethtool_sset vmlinux EXPORT_SYMBOL
++0x267fd50e mii_ethtool_gset vmlinux EXPORT_SYMBOL
++0x3171d976 class_compat_create_link vmlinux EXPORT_SYMBOL_GPL
++0xfee5e630 vfs_cancel_lock vmlinux EXPORT_SYMBOL_GPL
++0xb602c57e nf_ct_l3proto_module_put net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x3f68a347 release_sock vmlinux EXPORT_SYMBOL
++0xd2d51180 of_gpio_count vmlinux EXPORT_SYMBOL
++0x50e7193a __i2c_first_dynamic_bus_num vmlinux EXPORT_SYMBOL_GPL
++0xcf062b87 class_remove_file vmlinux EXPORT_SYMBOL_GPL
++0xefdcf0e8 textsearch_destroy vmlinux EXPORT_SYMBOL
++0x4610c824 of_phy_connect_fixed_link vmlinux EXPORT_SYMBOL
++0xd71d1167 unmap_underlying_metadata vmlinux EXPORT_SYMBOL
++0x7cd5feb0 sync_inode vmlinux EXPORT_SYMBOL
++0xb859f38b krealloc vmlinux EXPORT_SYMBOL
++0x46ece9e7 input_register_device vmlinux EXPORT_SYMBOL
++0x50e787f3 __invalidate_device vmlinux EXPORT_SYMBOL
++0x2ba707a8 sysctl_tcp_low_latency vmlinux EXPORT_SYMBOL
++0x1163f0a7 blk_max_low_pfn vmlinux EXPORT_SYMBOL
++0x06fd5926 blk_queue_free_tags vmlinux EXPORT_SYMBOL
++0x3cca63a0 elv_unregister_queue vmlinux EXPORT_SYMBOL
++0x67b78eb3 seq_hlist_next_rcu vmlinux EXPORT_SYMBOL
++0x5a9effe0 register_sysctl_table vmlinux EXPORT_SYMBOL
++0x7c9291d1 csum_partial_copy_generic vmlinux EXPORT_SYMBOL
++0xb9a1c8b8 tty_flip_buffer_push vmlinux EXPORT_SYMBOL
++0x929d7ef0 uart_get_divisor vmlinux EXPORT_SYMBOL
++0x425c1c0b ktime_add_safe vmlinux EXPORT_SYMBOL_GPL
++0xf9a482f9 msleep vmlinux EXPORT_SYMBOL
++0x2786a8a5 unregister_netdev vmlinux EXPORT_SYMBOL
++0xdaecbaf2 proc_net_mkdir vmlinux EXPORT_SYMBOL_GPL
++0x832ad813 __bforget vmlinux EXPORT_SYMBOL
++0xcd1dafbc __audit_inode_child vmlinux EXPORT_SYMBOL_GPL
++0xaeffe8a2 xdr_reserve_space vmlinux EXPORT_SYMBOL_GPL
++0xee4de802 inet6_add_protocol vmlinux EXPORT_SYMBOL
++0xb0240e99 raw_unhash_sk vmlinux EXPORT_SYMBOL_GPL
++0xb5be6114 xt_register_table vmlinux EXPORT_SYMBOL_GPL
++0x9e43ccf6 sock_no_listen vmlinux EXPORT_SYMBOL
++0x19990104 input_mt_destroy_slots vmlinux EXPORT_SYMBOL
++0x882fd7db usb_serial_generic_unthrottle vmlinux EXPORT_SYMBOL_GPL
++0x39d7bb0a usb_unpoison_anchored_urbs vmlinux EXPORT_SYMBOL_GPL
++0x3ab69e8f scsi_device_lookup_by_target vmlinux EXPORT_SYMBOL
++0x79aa04a2 get_random_bytes vmlinux EXPORT_SYMBOL
++0xf0efa6e0 rpcauth_unregister vmlinux EXPORT_SYMBOL_GPL
++0x67e38cdf sdhci_get_of_property vmlinux EXPORT_SYMBOL_GPL
++0x3c9390db pci_vpd_find_tag vmlinux EXPORT_SYMBOL_GPL
++0xd38480a0 rb_augment_erase_end vmlinux EXPORT_SYMBOL
++0xa474d088 blk_peek_request vmlinux EXPORT_SYMBOL
++0x5cba6ab9 sock_no_poll vmlinux EXPORT_SYMBOL
++0x2c36d879 sdio_unregister_driver vmlinux EXPORT_SYMBOL_GPL
++0x055c8258 usb_serial_generic_close vmlinux EXPORT_SYMBOL_GPL
++0x8896e0d3 blk_rq_prep_clone vmlinux EXPORT_SYMBOL_GPL
++0xc55a9a33 crypto_alloc_shash vmlinux EXPORT_SYMBOL_GPL
++0xc79bf957 crypto_alloc_ahash vmlinux EXPORT_SYMBOL_GPL
++0x89cafb57 vlan_ioctl_set vmlinux EXPORT_SYMBOL
++0xb75534fa of_alias_get_id vmlinux EXPORT_SYMBOL_GPL
++0xc11d8093 iov_shorten vmlinux EXPORT_SYMBOL
++0x6a037cf1 mempool_kfree vmlinux EXPORT_SYMBOL
++0xcf29542b scsi_scan_target vmlinux EXPORT_SYMBOL
++0xfda88943 subsys_dev_iter_init vmlinux EXPORT_SYMBOL_GPL
++0x27715359 subsys_dev_iter_exit vmlinux EXPORT_SYMBOL_GPL
++0xf0ef15b4 list_sort vmlinux EXPORT_SYMBOL
++0x71d0143a remove_arg_zero vmlinux EXPORT_SYMBOL
++0x328c1012 remap_pfn_range vmlinux EXPORT_SYMBOL
++0x52760ca9 getnstimeofday vmlinux EXPORT_SYMBOL
++0xd1cc986f phy_register_fixup vmlinux EXPORT_SYMBOL
++0xf55a56b6 device_bind_driver vmlinux EXPORT_SYMBOL_GPL
++0x0b137c47 device_store_ulong vmlinux EXPORT_SYMBOL_GPL
++0xe5c97713 pci_vpd_truncate vmlinux EXPORT_SYMBOL
++0x294da23e skcipher_geniv_exit vmlinux EXPORT_SYMBOL_GPL
++0x11eaefc3 file_update_time vmlinux EXPORT_SYMBOL
++0x529c370a bdi_unregister vmlinux EXPORT_SYMBOL
++0xae946285 inet6_csk_search_req vmlinux EXPORT_SYMBOL_GPL
++0x04dfc4d6 dev_mc_init vmlinux EXPORT_SYMBOL
++0x88c994d7 dev_uc_init vmlinux EXPORT_SYMBOL
++0x865029ac __hw_addr_sync vmlinux EXPORT_SYMBOL
++0x5f46d244 of_irq_map_raw vmlinux EXPORT_SYMBOL_GPL
++0x0e516b0a scsi_setup_blk_pc_cmnd vmlinux EXPORT_SYMBOL
++0x11a13e31 _kstrtol vmlinux EXPORT_SYMBOL
++0xc72d33bf mb_cache_entry_alloc vmlinux EXPORT_SYMBOL
++0x0d8d877a relay_file_operations vmlinux EXPORT_SYMBOL_GPL
++0x132a7a5b init_timer_key vmlinux EXPORT_SYMBOL
++0xa473aea0 rpc_wake_up_status vmlinux EXPORT_SYMBOL_GPL
++0xf39bf4d9 put_cmsg vmlinux EXPORT_SYMBOL
++0xe5dd0af1 skb_free_datagram vmlinux EXPORT_SYMBOL
++0x14d5945d of_fdt_unflatten_tree vmlinux EXPORT_SYMBOL_GPL
++0xe8790d79 pci_wake_from_d3 vmlinux EXPORT_SYMBOL
++0x0e23fb6a filp_close vmlinux EXPORT_SYMBOL
++0xb9b1637c truncate_setsize vmlinux EXPORT_SYMBOL
++0x44bcfa6d system_nrt_freezable_wq vmlinux EXPORT_SYMBOL_GPL
++0x39cdf63c wait_for_completion_interruptible vmlinux EXPORT_SYMBOL
++0x86333584 svcauth_gss_flavor vmlinux EXPORT_SYMBOL_GPL
++0x8d1a827e svcauth_gss_register_pseudoflavor vmlinux EXPORT_SYMBOL_GPL
++0x38fb9933 tty_std_termios vmlinux EXPORT_SYMBOL
++0x38320348 generic_readlink vmlinux EXPORT_SYMBOL
++0xe2e0c7c6 __flush_icache_range vmlinux EXPORT_SYMBOL
++0x33b2d26d ether_setup vmlinux EXPORT_SYMBOL
++0xd200c6d4 usb_deregister_device_driver vmlinux EXPORT_SYMBOL_GPL
++0x889b7ccd device_create_file vmlinux EXPORT_SYMBOL_GPL
++0x610d2493 __break_lease vmlinux EXPORT_SYMBOL
++0x5330e4ea get_task_comm vmlinux EXPORT_SYMBOL_GPL
++0xba464a1d __get_vm_area vmlinux EXPORT_SYMBOL_GPL
++0x7a1390f7 param_set_bool vmlinux EXPORT_SYMBOL
++0x034f9e73 param_ops_byte vmlinux EXPORT_SYMBOL
++0xc88f3891 xprt_free vmlinux EXPORT_SYMBOL_GPL
++0x8ab4079e atomic64_add vmlinux EXPORT_SYMBOL
++0xc5f46566 rb_augment_insert vmlinux EXPORT_SYMBOL
++0xb0520bf3 would_dump vmlinux EXPORT_SYMBOL
++0x4a20d82f truncate_inode_pages_range vmlinux EXPORT_SYMBOL
++0x0f62d3b5 force_sig vmlinux EXPORT_SYMBOL
++0xd0417995 pci_set_dma_max_seg_size vmlinux EXPORT_SYMBOL
++0x05240ee7 percpu_counter_batch vmlinux EXPORT_SYMBOL
++0xe3646dbc d_path vmlinux EXPORT_SYMBOL
++0x116ccd8c vfs_fstatat vmlinux EXPORT_SYMBOL
++0x2228a27e sdev_evt_send vmlinux EXPORT_SYMBOL_GPL
++0x175adc1b igrab vmlinux EXPORT_SYMBOL
++0x9d95a606 rtnl_notify vmlinux EXPORT_SYMBOL
++0xc0e1c9dd __rtnl_link_register vmlinux EXPORT_SYMBOL_GPL
++0xf1c8f28f sock_recvmsg vmlinux EXPORT_SYMBOL
++0xcb649c67 mmc_can_secure_erase_trim vmlinux EXPORT_SYMBOL
++0x83ba622a usb_hcd_unmap_urb_for_dma vmlinux EXPORT_SYMBOL_GPL
++0x5bf0f5f6 pci_back_from_sleep vmlinux EXPORT_SYMBOL
++0x0c62cfe7 blk_end_request_err vmlinux EXPORT_SYMBOL_GPL
++0x59d1c938 blk_end_request_all vmlinux EXPORT_SYMBOL
++0x9dba46f5 blk_queue_bio vmlinux EXPORT_SYMBOL_GPL
++0xd16712f3 crypto_check_attr_type vmlinux EXPORT_SYMBOL_GPL
++0x6a80a3f5 cpm_muram_free vmlinux EXPORT_SYMBOL
++0x8c0279d5 nf_ct_l3protos net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x8b63beee linkwatch_fire_event vmlinux EXPORT_SYMBOL
++0xd3505d0c ndisc_build_skb vmlinux EXPORT_SYMBOL
++0x1598dc9d unregister_netevent_notifier vmlinux EXPORT_SYMBOL_GPL
++0xb2dc7101 input_mt_report_slot_state vmlinux EXPORT_SYMBOL
++0xcf0c65bc scsi_init_io vmlinux EXPORT_SYMBOL
++0x8307be63 rpc_queue_upcall vmlinux EXPORT_SYMBOL_GPL
++0xdb484b6d sdhci_remove_host vmlinux EXPORT_SYMBOL_GPL
++0x25b7fdec fib_default_rule_pref vmlinux EXPORT_SYMBOL
++0x12b20fd2 swiotlb_sync_single_for_device vmlinux EXPORT_SYMBOL
++0x6531a053 debugfs_create_x8 vmlinux EXPORT_SYMBOL_GPL
++0x03070efa of_scan_pci_bridge vmlinux EXPORT_SYMBOL
++0x6796dc42 uart_write_wakeup vmlinux EXPORT_SYMBOL
++0xc1e35bf5 pci_bus_read_config_word vmlinux EXPORT_SYMBOL
++0x0c081027 skb_append vmlinux EXPORT_SYMBOL
++0x1aec4408 read_cache_page_gfp vmlinux EXPORT_SYMBOL
++0x9fc89fd1 schedule_delayed_work_on vmlinux EXPORT_SYMBOL
++0xe3319fe9 sk_stream_error vmlinux EXPORT_SYMBOL
++0xeef4a738 usb_stor_CB_reset vmlinux EXPORT_SYMBOL_GPL
++0x6332cc1a audit_log_start vmlinux EXPORT_SYMBOL
++0x1330b831 netdev_crit vmlinux EXPORT_SYMBOL
++0x5651005a sysfs_create_files vmlinux EXPORT_SYMBOL_GPL
++0x27f4a872 sget vmlinux EXPORT_SYMBOL
++0x5f754e5a memset vmlinux EXPORT_SYMBOL
++0x5ca89b3d mtd_kmalloc_up_to vmlinux EXPORT_SYMBOL_GPL
++0xdc3fcbc9 __sw_hweight8 vmlinux EXPORT_SYMBOL
++0x02ee26c1 free_pages_exact vmlinux EXPORT_SYMBOL
++0x95edd27e tasklet_hrtimer_init vmlinux EXPORT_SYMBOL_GPL
++0x064db9a5 mark_mounts_for_expiry vmlinux EXPORT_SYMBOL_GPL
++0xacfd81f6 work_cpu vmlinux EXPORT_SYMBOL_GPL
++0xbc316de4 tty_termios_input_baud_rate vmlinux EXPORT_SYMBOL
++0x0537dc03 d_set_d_op vmlinux EXPORT_SYMBOL
++0x2e47f677 xfrm_aalg_get_byidx vmlinux EXPORT_SYMBOL_GPL
++0x5577ef9e udp_table vmlinux EXPORT_SYMBOL
++0x70bcb245 mmc_erase_group_aligned vmlinux EXPORT_SYMBOL
++0xb24c2db9 idr_get_new_above vmlinux EXPORT_SYMBOL
++0x9704e93a ida_get_new_above vmlinux EXPORT_SYMBOL
++0x2e2f1740 ring_buffer_record_disable_cpu vmlinux EXPORT_SYMBOL_GPL
++0xa1a8f438 transport_configure_device vmlinux EXPORT_SYMBOL_GPL
++0xbd903883 nla_put vmlinux EXPORT_SYMBOL
++0x429bdb0b revalidate_disk vmlinux EXPORT_SYMBOL
++0x72e50086 vm_stat vmlinux EXPORT_SYMBOL
++0xd5b1376d register_shrinker vmlinux EXPORT_SYMBOL
++0xf23fcb99 __kfifo_in vmlinux EXPORT_SYMBOL
++0x38abcc37 get_immrbase vmlinux EXPORT_SYMBOL
++0x624a6406 hwrng_register vmlinux EXPORT_SYMBOL_GPL
++0xfa21edf6 misc_register vmlinux EXPORT_SYMBOL
++0x5d558bfa block_invalidatepage vmlinux EXPORT_SYMBOL
++0x2c793286 may_umount_tree vmlinux EXPORT_SYMBOL
++0x206687ad cpm_muram_alloc_fixed vmlinux EXPORT_SYMBOL
++0x9cedf6bd dma_direct_ops vmlinux EXPORT_SYMBOL
++0x636b12c8 nf_nat_need_gre net/ipv4/netfilter/nf_nat_proto_gre EXPORT_SYMBOL_GPL
++0x0150a066 udp_lib_get_port vmlinux EXPORT_SYMBOL
++0x7b590ac8 skb_defer_rx_timestamp vmlinux EXPORT_SYMBOL_GPL
++0x594b398f tty_ldisc_ref vmlinux EXPORT_SYMBOL_GPL
++0x68d241c1 devm_ioport_map vmlinux EXPORT_SYMBOL
++0x17ce645d locks_end_grace vmlinux EXPORT_SYMBOL_GPL
++0xc3b2d983 rtnl_af_unregister vmlinux EXPORT_SYMBOL_GPL
++0xbfee3ad5 loop_unregister_transfer vmlinux EXPORT_SYMBOL
++0x43d497ca class_dev_iter_exit vmlinux EXPORT_SYMBOL_GPL
++0x7064d556 iget_failed vmlinux EXPORT_SYMBOL
++0xc3880471 xdr_decode_netobj vmlinux EXPORT_SYMBOL_GPL
++0x25c677c4 mac_pton vmlinux EXPORT_SYMBOL
++0x99caf7d2 ethtool_op_set_tso vmlinux EXPORT_SYMBOL
++0xc94c34d0 mmc_cache_ctrl vmlinux EXPORT_SYMBOL
++0x22258364 pci_restore_state vmlinux EXPORT_SYMBOL
++0x1d16856b filemap_fdatawait_range vmlinux EXPORT_SYMBOL
++0xc9833005 skb_complete_tx_timestamp vmlinux EXPORT_SYMBOL_GPL
++0x65b82e1f usb_enable_xhci_ports vmlinux EXPORT_SYMBOL_GPL
++0xa7ddce90 inode_sub_bytes vmlinux EXPORT_SYMBOL
++0x0395d6d3 inode_set_bytes vmlinux EXPORT_SYMBOL
++0x2bd8303c svc_unreg_xprt_class vmlinux EXPORT_SYMBOL_GPL
++0xc59f0fc7 arp_xmit vmlinux EXPORT_SYMBOL
++0x9cb92c72 __dev_getfirstbyhwtype vmlinux EXPORT_SYMBOL
++0xccc53d95 __dev_get_by_index vmlinux EXPORT_SYMBOL
++0xa41a68b5 usb_serial_generic_write vmlinux EXPORT_SYMBOL_GPL
++0xabe0867d mdiobus_register vmlinux EXPORT_SYMBOL
++0xaa5fb7af pci_release_selected_regions vmlinux EXPORT_SYMBOL
++0x6c665691 flex_array_shrink vmlinux EXPORT_SYMBOL
++0xcc17504d _raw_read_unlock_irqrestore vmlinux EXPORT_SYMBOL
++0xedcf6be4 qword_add vmlinux EXPORT_SYMBOL_GPL
++0x9fc77642 __inet6_lookup_established vmlinux EXPORT_SYMBOL
++0x001b7570 skb_recycle vmlinux EXPORT_SYMBOL
++0x4b54f71e sdio_claim_host vmlinux EXPORT_SYMBOL_GPL
++0x7ca60166 __nla_put_nohdr vmlinux EXPORT_SYMBOL
++0x34d8298e bdi_init vmlinux EXPORT_SYMBOL
++0x889c066f flush_tlb_page vmlinux EXPORT_SYMBOL
++0x40973662 sysctl_udp_mem vmlinux EXPORT_SYMBOL
++0x17df17bc sysctl_tcp_ecn vmlinux EXPORT_SYMBOL
++0xa0ebd14c sysctl_tcp_mem vmlinux EXPORT_SYMBOL
++0xc94834cd ethtool_op_set_tx_csum vmlinux EXPORT_SYMBOL
++0x669a989a inet_csk_accept vmlinux EXPORT_SYMBOL
++0xc0574cac inet_hash_connect vmlinux EXPORT_SYMBOL_GPL
++0x74d6ceef generic_mii_ioctl vmlinux EXPORT_SYMBOL
++0x0334da4e scsi_command_size_tbl vmlinux EXPORT_SYMBOL
++0xb58dcfa2 synchronize_sched_expedited vmlinux EXPORT_SYMBOL_GPL
++0xa18106f8 xprt_wake_pending_tasks vmlinux EXPORT_SYMBOL_GPL
++0x35e5a105 usb_bulk_msg vmlinux EXPORT_SYMBOL_GPL
++0x1bb9d4e9 xfrm_state_delete_tunnel vmlinux EXPORT_SYMBOL
++0x03198068 platform_device_add_resources vmlinux EXPORT_SYMBOL_GPL
++0x0a5cfbc7 in6_dev_finish_destroy vmlinux EXPORT_SYMBOL
++0x909a1b12 tcp_gro_receive vmlinux EXPORT_SYMBOL
++0xa9f90244 eth_header vmlinux EXPORT_SYMBOL
++0xdacdd5df scsi_rescan_device vmlinux EXPORT_SYMBOL
++0x8f48679a rb_prev vmlinux EXPORT_SYMBOL
++0x56653400 user_match vmlinux EXPORT_SYMBOL_GPL
++0x21c5a2e1 request_key_async_with_auxdata vmlinux EXPORT_SYMBOL
++0x2a20e3db bd_unlink_disk_holder vmlinux EXPORT_SYMBOL_GPL
++0xea065e01 task_handoff_unregister vmlinux EXPORT_SYMBOL_GPL
++0xfbcac494 down_killable vmlinux EXPORT_SYMBOL
++0x83f383cb napi_gro_receive vmlinux EXPORT_SYMBOL
++0x2750609c pci_reset_function vmlinux EXPORT_SYMBOL_GPL
++0x05eb2ed0 nf_unregister_queue_handler vmlinux EXPORT_SYMBOL
++0x24eb7e32 leds_list vmlinux EXPORT_SYMBOL_GPL
++0x7b6a7955 tcp_v4_tw_get_peer vmlinux EXPORT_SYMBOL
++0x34a52594 dev_get_by_flags_rcu vmlinux EXPORT_SYMBOL
++0x7647726c handle_sysrq vmlinux EXPORT_SYMBOL
++0xea3f9431 pcie_port_bus_type vmlinux EXPORT_SYMBOL_GPL
++0x996bdb64 _kstrtoul vmlinux EXPORT_SYMBOL
++0x7f859c50 __block_write_begin vmlinux EXPORT_SYMBOL
++0x1cc6719a register_reboot_notifier vmlinux EXPORT_SYMBOL
++0xf5c9012e timespec_trunc vmlinux EXPORT_SYMBOL
++0x2b5c303b smp_send_reschedule vmlinux EXPORT_SYMBOL_GPL
++0x5e15425b tcp_sockets_allocated vmlinux EXPORT_SYMBOL
++0xcc167694 inode_owner_or_capable vmlinux EXPORT_SYMBOL
++0x079a369f generic_pipe_buf_confirm vmlinux EXPORT_SYMBOL
++0xc1eecd72 scsi_device_quiesce vmlinux EXPORT_SYMBOL
++0x9748927f _outsw_ns vmlinux EXPORT_SYMBOL
++0xfbfddf0b pci_select_bars vmlinux EXPORT_SYMBOL
++0xf184d189 kernel_power_off vmlinux EXPORT_SYMBOL_GPL
++0x84d095a1 ip6t_unregister_table net/ipv6/netfilter/ip6_tables EXPORT_SYMBOL
++0xdc3ed1f8 svc_create_pooled vmlinux EXPORT_SYMBOL_GPL
++0xcb1fe4f5 genl_register_ops vmlinux EXPORT_SYMBOL
++0x544b760f tty_ldisc_ref_wait vmlinux EXPORT_SYMBOL_GPL
++0x310a0a1b debugfs_create_u64 vmlinux EXPORT_SYMBOL_GPL
++0x9f915995 block_commit_write vmlinux EXPORT_SYMBOL
++0x87e86028 __netdev_alloc_skb vmlinux EXPORT_SYMBOL
++0xfec3c2f2 bcd2bin vmlinux EXPORT_SYMBOL
++0x5d631b05 journal_get_undo_access vmlinux EXPORT_SYMBOL
++0x1fc9cb5b perf_event_create_kernel_counter vmlinux EXPORT_SYMBOL_GPL
++0x90ff6c9f nf_ct_invert_tuplepr net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xe1a5b39b tty_kref_put vmlinux EXPORT_SYMBOL
++0x60d768c8 locks_delete_block vmlinux EXPORT_SYMBOL
++0x8eec5353 dput vmlinux EXPORT_SYMBOL
++0x1314f71a is_container_init vmlinux EXPORT_SYMBOL
++0x5bd26000 rpc_proc_unregister vmlinux EXPORT_SYMBOL_GPL
++0x66df8787 rpc_delay vmlinux EXPORT_SYMBOL_GPL
++0xbefd162c fill_inquiry_response vmlinux EXPORT_SYMBOL_GPL
++0xc4536e19 usb_match_one_id vmlinux EXPORT_SYMBOL_GPL
++0xd1e93218 srcu_notifier_call_chain vmlinux EXPORT_SYMBOL_GPL
++0xe46682b1 sk_free vmlinux EXPORT_SYMBOL
++0xcacd6472 scsi_is_sdev_device vmlinux EXPORT_SYMBOL
++0x50f5d9f6 pci_bus_max_busnr vmlinux EXPORT_SYMBOL_GPL
++0xaaa286ec kobject_init vmlinux EXPORT_SYMBOL
++0x42160169 flush_workqueue vmlinux EXPORT_SYMBOL_GPL
++0x4b7ed27b sleep_on vmlinux EXPORT_SYMBOL
++0x331ac747 key_type_user vmlinux EXPORT_SYMBOL_GPL
++0x80bd6f7b bio_flush_dcache_pages vmlinux EXPORT_SYMBOL
++0xaf4e1072 simple_lookup vmlinux EXPORT_SYMBOL
++0xec4769ef qe_clock_source vmlinux EXPORT_SYMBOL
++0xf78d04ab netlink_register_notifier vmlinux EXPORT_SYMBOL
++0xf8a70670 usb_match_id vmlinux EXPORT_SYMBOL_GPL
++0x9be8ead9 xfrm_policy_insert vmlinux EXPORT_SYMBOL
++0xf360c71e __netpoll_cleanup vmlinux EXPORT_SYMBOL_GPL
++0x1bdf3140 skb_segment vmlinux EXPORT_SYMBOL_GPL
++0x184b82fb mmc_vddrange_to_ocrmask vmlinux EXPORT_SYMBOL
++0x9d02a2b9 usb_add_hcd vmlinux EXPORT_SYMBOL_GPL
++0x88355cbb blk_queue_max_segments vmlinux EXPORT_SYMBOL
++0x3d8aa9cd unlock_rename vmlinux EXPORT_SYMBOL
++0x1983094e fsl_lbc_ctrl_dev vmlinux EXPORT_SYMBOL
++0x2406dae3 pci_address_to_pio vmlinux EXPORT_SYMBOL_GPL
++0xe771423f tcp_init_congestion_ops vmlinux EXPORT_SYMBOL_GPL
++0xa7c0801f dev_gro_receive vmlinux EXPORT_SYMBOL
++0x5732e368 skb_push vmlinux EXPORT_SYMBOL
++0xbeb96094 sdio_f0_writeb vmlinux EXPORT_SYMBOL_GPL
++0x70033701 device_create vmlinux EXPORT_SYMBOL_GPL
++0x6848d183 blk_run_queue_async vmlinux EXPORT_SYMBOL
++0x09949de0 simple_rmdir vmlinux EXPORT_SYMBOL
++0xd28b05ff alloc_file vmlinux EXPORT_SYMBOL
++0xfefb0432 free_task vmlinux EXPORT_SYMBOL
++0x4a9eefcb i2c_del_adapter vmlinux EXPORT_SYMBOL
++0x5838f6c9 rtc_valid_tm vmlinux EXPORT_SYMBOL
++0xdcb944af usb_register_driver vmlinux EXPORT_SYMBOL_GPL
++0xbcda8829 scsi_block_requests vmlinux EXPORT_SYMBOL
++0xaa8a0279 sysfs_get vmlinux EXPORT_SYMBOL_GPL
++0x543ef284 seq_hlist_start vmlinux EXPORT_SYMBOL
++0x96573b80 __kfifo_dma_in_finish_r vmlinux EXPORT_SYMBOL
++0xe2f01afd mmc_release_host vmlinux EXPORT_SYMBOL
++0x3a374dcf fat_dir_empty vmlinux EXPORT_SYMBOL_GPL
++0x74cbb34b __getblk vmlinux EXPORT_SYMBOL
++0xd2f64b53 cdev_alloc vmlinux EXPORT_SYMBOL
++0xfb853c2c rpc_put_task_async vmlinux EXPORT_SYMBOL_GPL
++0x42d56457 usb_hcd_unlink_urb_from_ep vmlinux EXPORT_SYMBOL_GPL
++0xc48ee272 dev_warn vmlinux EXPORT_SYMBOL
++0xab3d1f95 nf_ct_untracked_status_or net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x9cedcd62 get_phy_device vmlinux EXPORT_SYMBOL
++0x74c134b9 __sw_hweight32 vmlinux EXPORT_SYMBOL
++0x57674fd7 __sw_hweight16 vmlinux EXPORT_SYMBOL
++0x9f46ced8 __sw_hweight64 vmlinux EXPORT_SYMBOL
++0xad0a6e0a flex_array_prealloc vmlinux EXPORT_SYMBOL
++0x93215e1d __kfifo_skip_r vmlinux EXPORT_SYMBOL
++0xa5377e1f svc_exit_thread vmlinux EXPORT_SYMBOL_GPL
++0x137b3ec2 pagevec_lookup_tag vmlinux EXPORT_SYMBOL
++0x67053080 current_kernel_time vmlinux EXPORT_SYMBOL
++0x3e187f83 print_tuple net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x4ef191e6 tcp_reno_cong_avoid vmlinux EXPORT_SYMBOL_GPL
++0x5a744b86 netlink_set_nonroot vmlinux EXPORT_SYMBOL
++0x82942563 usb_reset_device vmlinux EXPORT_SYMBOL_GPL
++0x7505bdef memchr_inv vmlinux EXPORT_SYMBOL
++0x1223591c locks_copy_lock vmlinux EXPORT_SYMBOL
++0xaa413a43 gnet_stats_start_copy_compat vmlinux EXPORT_SYMBOL
++0x1029fa00 rtc_alarm_irq_enable vmlinux EXPORT_SYMBOL_GPL
++0x785f307d pcim_iounmap_regions vmlinux EXPORT_SYMBOL
++0x7522f3ba irq_modify_status vmlinux EXPORT_SYMBOL_GPL
++0x52ccfd70 dcbnl_ieee_notify vmlinux EXPORT_SYMBOL
++0xbfd69829 inet6_del_protocol vmlinux EXPORT_SYMBOL
++0x753e1c04 xfrm_input_resume vmlinux EXPORT_SYMBOL
++0xde22dda4 udplite_prot vmlinux EXPORT_SYMBOL
++0xf19b1812 sock_create_kern vmlinux EXPORT_SYMBOL
++0x76b656be scsi_eh_restore_cmnd vmlinux EXPORT_SYMBOL
++0x00b8174b transport_remove_device vmlinux EXPORT_SYMBOL_GPL
++0x8260686f bitmap_find_next_zero_area vmlinux EXPORT_SYMBOL
++0x4a487484 i2c_del_mux_adapter vmlinux EXPORT_SYMBOL_GPL
++0x74cda2a1 sk_detach_filter vmlinux EXPORT_SYMBOL_GPL
++0xf1734ac9 sk_attach_filter vmlinux EXPORT_SYMBOL_GPL
++0x77bebd69 pci_unregister_driver vmlinux EXPORT_SYMBOL
++0xf741c793 zlib_deflateEnd vmlinux EXPORT_SYMBOL
++0x7469fcfe radix_tree_tagged vmlinux EXPORT_SYMBOL
++0x59659594 unload_nls vmlinux EXPORT_SYMBOL
++0x25673182 seq_open_private vmlinux EXPORT_SYMBOL
++0xe9d6801d sunrpc_cache_update vmlinux EXPORT_SYMBOL_GPL
++0xec56166e skb_gso_segment vmlinux EXPORT_SYMBOL
++0x4e128338 kernel_listen vmlinux EXPORT_SYMBOL
++0x76bf656d __bitmap_shift_left vmlinux EXPORT_SYMBOL
++0x291fef69 gss_mech_get vmlinux EXPORT_SYMBOL_GPL
++0x6713b9ea napi_skb_finish vmlinux EXPORT_SYMBOL
++0xdb9433e3 __scsi_device_lookup vmlinux EXPORT_SYMBOL
++0xe23ae481 blk_iopoll_complete vmlinux EXPORT_SYMBOL
++0xb11b4eca crypto_chain vmlinux EXPORT_SYMBOL_GPL
++0x9d669763 memcpy vmlinux EXPORT_SYMBOL
++0x03a5674f ip6t_do_table net/ipv6/netfilter/ip6_tables EXPORT_SYMBOL
++0x86ed218d rpc_run_task vmlinux EXPORT_SYMBOL_GPL
++0x43a0458b blk_start_plug vmlinux EXPORT_SYMBOL
++0xa67752f3 bdevname vmlinux EXPORT_SYMBOL
++0x3d4d9f3c cdev_init vmlinux EXPORT_SYMBOL
++0xbe63ee40 request_resource vmlinux EXPORT_SYMBOL
++0x697cbbb4 threads_per_core vmlinux EXPORT_SYMBOL_GPL
++0xc24dd028 nf_ct_expect_init net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x98ed718a inet_getname vmlinux EXPORT_SYMBOL
++0xe7609b0d generate_netlink_event vmlinux EXPORT_SYMBOL
++0x85e7deb2 iov_iter_fault_in_readable vmlinux EXPORT_SYMBOL
++0x15e9ff97 module_mutex vmlinux EXPORT_SYMBOL_GPL
++0xf5a62ecc _memset_io vmlinux EXPORT_SYMBOL
++0x7c1ac45d put_mtd_device vmlinux EXPORT_SYMBOL_GPL
++0xbf9bcc8d __cap_empty_set vmlinux EXPORT_SYMBOL
++0xe2504d65 xprt_register_transport vmlinux EXPORT_SYMBOL_GPL
++0xe0ead969 i2c_smbus_process_call vmlinux EXPORT_SYMBOL
++0x313f13aa platform_get_resource vmlinux EXPORT_SYMBOL_GPL
++0x42b7e450 pci_disable_pcie_error_reporting vmlinux EXPORT_SYMBOL_GPL
++0xfed042ab crypto_shoot_alg vmlinux EXPORT_SYMBOL_GPL
++0xf37d86d3 iput vmlinux EXPORT_SYMBOL
++0x245a5a94 sleep_on_timeout vmlinux EXPORT_SYMBOL
++0x30a3ce2d xprt_complete_rqst vmlinux EXPORT_SYMBOL_GPL
++0x28a82da4 snmp_mib_init vmlinux EXPORT_SYMBOL_GPL
++0xd91b9062 input_ff_upload vmlinux EXPORT_SYMBOL_GPL
++0x072e69d7 create_proc_entry vmlinux EXPORT_SYMBOL
++0x03fd2571 vm_unmap_ram vmlinux EXPORT_SYMBOL
++0xd39230da proc_doulongvec_ms_jiffies_minmax vmlinux EXPORT_SYMBOL
++0x2d2f8405 xfrm_output vmlinux EXPORT_SYMBOL_GPL
++0x62dd148f of_phy_connect vmlinux EXPORT_SYMBOL
++0x796ef373 pci_enable_device_mem vmlinux EXPORT_SYMBOL
++0xeea9dbaf bitmap_bitremap vmlinux EXPORT_SYMBOL
++0x71a50dbc register_blkdev vmlinux EXPORT_SYMBOL
++0xe1ead0f9 nf_conntrack_alter_reply net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x596ca373 neigh_event_ns vmlinux EXPORT_SYMBOL
++0x88aa1b8c sdhci_free_host vmlinux EXPORT_SYMBOL_GPL
++0xe58fb452 aer_irq vmlinux EXPORT_SYMBOL_GPL
++0x76e3aed7 elevator_change vmlinux EXPORT_SYMBOL
++0x14dc18d8 iterate_supers_type vmlinux EXPORT_SYMBOL
++0x2285200f usb_kill_anchored_urbs vmlinux EXPORT_SYMBOL_GPL
++0x09775cdc kref_get vmlinux EXPORT_SYMBOL
++0x1f46d410 netdev_change_features vmlinux EXPORT_SYMBOL
++0xaa27750a init_dummy_netdev vmlinux EXPORT_SYMBOL_GPL
++0x9e4f1cfb ring_buffer_resize vmlinux EXPORT_SYMBOL_GPL
++0xcb0c622b dst_destroy vmlinux EXPORT_SYMBOL
++0xc4b45e74 pci_disable_rom vmlinux EXPORT_SYMBOL_GPL
++0x443ddc6e pci_disable_ido vmlinux EXPORT_SYMBOL
++0x21962aa1 pci_disable_ltr vmlinux EXPORT_SYMBOL
++0x2c8d9ecf journal_errno vmlinux EXPORT_SYMBOL
++0x78e988ed svc_wake_up vmlinux EXPORT_SYMBOL_GPL
++0x3e4a8504 xprt_write_space vmlinux EXPORT_SYMBOL_GPL
++0x61a39807 ndisc_send_skb vmlinux EXPORT_SYMBOL
++0x2ab23b9b nf_unregister_queue_handlers vmlinux EXPORT_SYMBOL_GPL
++0x3f2f77c8 mtd_blktrans_cease_background vmlinux EXPORT_SYMBOL_GPL
++0x70a7409f scsi_mode_sense vmlinux EXPORT_SYMBOL
++0x2d89342a scsi_show_sense_hdr vmlinux EXPORT_SYMBOL
++0xe87b346a pci_enable_ltr vmlinux EXPORT_SYMBOL
++0x2e5a7064 journal_check_available_features vmlinux EXPORT_SYMBOL
++0x78ed3e5c __init_waitqueue_head vmlinux EXPORT_SYMBOL
++0x836afd32 nf_ct_get_tuple net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x989fa19e xfrm6_tunnel_register net/ipv6/tunnel6 EXPORT_SYMBOL
++0x3d961c15 xfrm4_tunnel_register net/ipv4/tunnel4 EXPORT_SYMBOL
++0x405d6987 of_property_read_u64 vmlinux EXPORT_SYMBOL_GPL
++0x20edb24a blk_insert_cloned_request vmlinux EXPORT_SYMBOL_GPL
++0x6f4b609a init_timer_deferrable_key vmlinux EXPORT_SYMBOL
++0x2dc5379b skb_copy_datagram_from_iovec vmlinux EXPORT_SYMBOL
++0x5f8a2728 isa_io_base vmlinux EXPORT_SYMBOL
++0x907fa9b5 dst_alloc vmlinux EXPORT_SYMBOL
++0xe93e49c3 devres_free vmlinux EXPORT_SYMBOL_GPL
++0x84ecb7cb timerqueue_iterate_next vmlinux EXPORT_SYMBOL_GPL
++0x1fad8e64 blk_put_queue vmlinux EXPORT_SYMBOL
++0xa5df3b80 single_release vmlinux EXPORT_SYMBOL
++0x23663ac5 get_user_pages vmlinux EXPORT_SYMBOL
++0xa108eb4d sysctl_optmem_max vmlinux EXPORT_SYMBOL
++0x14b1b51c enable_kernel_spe vmlinux EXPORT_SYMBOL
++0xe57878a1 in6_pton vmlinux EXPORT_SYMBOL
++0xaccabc6a in4_pton vmlinux EXPORT_SYMBOL
++0xd55d1a4c of_get_mac_address vmlinux EXPORT_SYMBOL
++0x30d70fa9 of_get_pci_address vmlinux EXPORT_SYMBOL
++0x02b1d92b scsi_mode_select vmlinux EXPORT_SYMBOL_GPL
++0xd0181f4f __bitmap_xor vmlinux EXPORT_SYMBOL
++0xed746f71 mnt_want_write vmlinux EXPORT_SYMBOL_GPL
++0xf3341268 __clear_user vmlinux EXPORT_SYMBOL
++0x9d14983a ppc_enable_pmcs vmlinux EXPORT_SYMBOL
++0x519e4247 xprt_lock_and_alloc_slot vmlinux EXPORT_SYMBOL_GPL
++0x62bdb353 __dev_remove_pack vmlinux EXPORT_SYMBOL
++0x1aa8db0c __starget_for_each_device vmlinux EXPORT_SYMBOL
++0x90a1004a crypto_has_alg vmlinux EXPORT_SYMBOL_GPL
++0xd6321e2a iget5_locked vmlinux EXPORT_SYMBOL
++0x3dcb88a0 irq_set_handler_data vmlinux EXPORT_SYMBOL
++0xa5a4e6a7 yield_to vmlinux EXPORT_SYMBOL_GPL
++0x8056c327 mii_check_media vmlinux EXPORT_SYMBOL
++0xc47af61f user_revoke vmlinux EXPORT_SYMBOL
++0x0b263573 debugfs_create_dir vmlinux EXPORT_SYMBOL_GPL
++0xb23b2262 dcache_dir_lseek vmlinux EXPORT_SYMBOL
++0x0c2cdbf1 synchronize_sched vmlinux EXPORT_SYMBOL_GPL
++0x6fff393f time_to_tm vmlinux EXPORT_SYMBOL
++0x651a4139 test_taint vmlinux EXPORT_SYMBOL
++0x6b7d903c netdev_printk vmlinux EXPORT_SYMBOL
++0x8dad55e8 of_address_to_resource vmlinux EXPORT_SYMBOL_GPL
++0x90b3ac7f thermal_zone_device_register vmlinux EXPORT_SYMBOL
++0x73cd0f30 pci_scan_bus_parented vmlinux EXPORT_SYMBOL
++0xf5a691cd invalidate_bh_lrus vmlinux EXPORT_SYMBOL_GPL
++0x518889d8 ipcomp_init_state net/xfrm/xfrm_ipcomp EXPORT_SYMBOL_GPL
++0x90599000 xt_check_match vmlinux EXPORT_SYMBOL_GPL
++0x41cb6ae6 cfi_qry_mode_on vmlinux EXPORT_SYMBOL_GPL
++0x32c3cb4e class_compat_register vmlinux EXPORT_SYMBOL_GPL
++0x24aac4d9 crypto_aes_expand_key vmlinux EXPORT_SYMBOL_GPL
++0x1eb914cc d_splice_alias vmlinux EXPORT_SYMBOL
++0x038de4b7 do_sync_read vmlinux EXPORT_SYMBOL
++0x5be5cfd3 mem_map vmlinux EXPORT_SYMBOL
++0xfedd35fc console_suspend_enabled vmlinux EXPORT_SYMBOL
++0x78f9b710 nf_ct_l3proto_try_module_get net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x199f8f28 svc_reg_xprt_class vmlinux EXPORT_SYMBOL_GPL
++0x40b1319f sdio_release_irq vmlinux EXPORT_SYMBOL_GPL
++0x6986e70b mmc_wait_for_cmd vmlinux EXPORT_SYMBOL
++0x59c20bea kobject_rename vmlinux EXPORT_SYMBOL_GPL
++0x72aa82c6 param_ops_charp vmlinux EXPORT_SYMBOL
++0x8a0e5ca2 rpc_mkpipe vmlinux EXPORT_SYMBOL_GPL
++0x9854bf90 cad_pid vmlinux EXPORT_SYMBOL
++0x5a5a94a6 kstrtou8 vmlinux EXPORT_SYMBOL
++0xb0477a75 get_task_pid vmlinux EXPORT_SYMBOL_GPL
++0x85478a0b inet6_hash_frag vmlinux EXPORT_SYMBOL_GPL
++0x6849a15f flex_array_clear vmlinux EXPORT_SYMBOL
++0x5a7bfe41 crypto_probing_notify vmlinux EXPORT_SYMBOL_GPL
++0xf0a118b4 ip6t_alloc_initial_table net/ipv6/netfilter/ip6_tables EXPORT_SYMBOL_GPL
++0x9ef5eb8e netif_receive_skb vmlinux EXPORT_SYMBOL
++0x196d40cb spi_new_device vmlinux EXPORT_SYMBOL_GPL
++0xc906a49f journal_update_format vmlinux EXPORT_SYMBOL
++0xfb6af58d recalc_sigpending vmlinux EXPORT_SYMBOL
++0x5fc7e979 nf_nat_proto_unique_tuple net/ipv4/netfilter/nf_nat EXPORT_SYMBOL_GPL
++0xdcb45617 nf_nat_mangle_udp_packet net/ipv4/netfilter/nf_nat EXPORT_SYMBOL
++0xaeb5ccdc anon_transport_class_register vmlinux EXPORT_SYMBOL_GPL
++0xf39ae0fb disk_part_iter_exit vmlinux EXPORT_SYMBOL_GPL
++0x6c85445f follow_down_one vmlinux EXPORT_SYMBOL
++0x7944e0fc tracing_off vmlinux EXPORT_SYMBOL_GPL
++0x9fa181ba rpcauth_init_credcache vmlinux EXPORT_SYMBOL_GPL
++0x81c6ed08 raw_seq_next vmlinux EXPORT_SYMBOL_GPL
++0x05f187fd ip_setsockopt vmlinux EXPORT_SYMBOL
++0x1c72d333 ip_getsockopt vmlinux EXPORT_SYMBOL
++0x38074cf6 qdisc_watchdog_schedule vmlinux EXPORT_SYMBOL
++0xed709aff tty_encode_baud_rate vmlinux EXPORT_SYMBOL_GPL
++0x80dd3e42 blk_unprep_request vmlinux EXPORT_SYMBOL_GPL
++0x6e50c56b xdr_shift_buf vmlinux EXPORT_SYMBOL_GPL
++0xf106c813 ip_options_rcv_srr vmlinux EXPORT_SYMBOL
++0x9a5a79fd device_register vmlinux EXPORT_SYMBOL_GPL
++0x3ca8a6b3 pcim_iomap_regions_request_all vmlinux EXPORT_SYMBOL
++0xc159495b dentry_open vmlinux EXPORT_SYMBOL
++0xbb2b98fa skb_checksum_help vmlinux EXPORT_SYMBOL
++0x60ee6103 unregister_netdevice_queue vmlinux EXPORT_SYMBOL
++0x40a27c37 scsi_dev_info_remove_list vmlinux EXPORT_SYMBOL
++0x9545af6d tasklet_init vmlinux EXPORT_SYMBOL
++0x68a29b9a nf_nat_setup_info net/ipv4/netfilter/nf_nat EXPORT_SYMBOL
++0xdf56dcb2 stop_machine vmlinux EXPORT_SYMBOL_GPL
++0x53986488 register_die_notifier vmlinux EXPORT_SYMBOL_GPL
++0x580dfef9 nf_ct_unlink_expect_report net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x3257c865 sock_no_recvmsg vmlinux EXPORT_SYMBOL
++0x6a2126c6 hrtimer_cancel vmlinux EXPORT_SYMBOL_GPL
++0x0a22b996 xt_unregister_matches vmlinux EXPORT_SYMBOL
++0xfdfc0b3b fiemap_fill_next_extent vmlinux EXPORT_SYMBOL
++0x4087f0c0 qdisc_watchdog_cancel vmlinux EXPORT_SYMBOL
++0x4ce6c680 crypto_shash_digest vmlinux EXPORT_SYMBOL_GPL
++0xe8d8b9c7 crypto_ahash_digest vmlinux EXPORT_SYMBOL_GPL
++0x3de9cae1 crypto_remove_final vmlinux EXPORT_SYMBOL_GPL
++0x296b5561 svc_authenticate vmlinux EXPORT_SYMBOL_GPL
++0xd0108d65 rtnl_set_sk_err vmlinux EXPORT_SYMBOL
++0x4865167d usb_hcd_pci_remove vmlinux EXPORT_SYMBOL_GPL
++0xec9ca601 driver_add_kobj vmlinux EXPORT_SYMBOL_GPL
++0x89797060 _raw_read_lock vmlinux EXPORT_SYMBOL
++0x897f061d downgrade_write vmlinux EXPORT_SYMBOL
++0x5568c553 complete vmlinux EXPORT_SYMBOL
++0x6fd12bcc ip_check_defrag vmlinux EXPORT_SYMBOL
++0xdb864d65 iov_iter_single_seg_count vmlinux EXPORT_SYMBOL
++0x9c44f35a scsi_test_unit_ready vmlinux EXPORT_SYMBOL
++0xad37975e dentry_update_name_case vmlinux EXPORT_SYMBOL
++0x8a7d1c31 high_memory vmlinux EXPORT_SYMBOL
++0xd7b213fa smp_call_function_many vmlinux EXPORT_SYMBOL
++0xbdb6ee0c usb_serial_deregister vmlinux EXPORT_SYMBOL_GPL
++0x4d9edeae simple_link vmlinux EXPORT_SYMBOL
++0xbdd2f42a rcu_bh_force_quiescent_state vmlinux EXPORT_SYMBOL_GPL
++0xc458c88f hidinput_find_field vmlinux EXPORT_SYMBOL_GPL
++0x4a6c3f1a usb_serial_suspend vmlinux EXPORT_SYMBOL
++0x14193672 scsi_remove_target vmlinux EXPORT_SYMBOL
++0xb6c5a973 scsi_show_result vmlinux EXPORT_SYMBOL
++0x03e32c1d sysdev_remove_file vmlinux EXPORT_SYMBOL_GPL
++0x99faa353 journal_blocks_per_page vmlinux EXPORT_SYMBOL
++0x63b8f6ef page_cache_async_readahead vmlinux EXPORT_SYMBOL_GPL
++0x8de0b5ac mempool_create vmlinux EXPORT_SYMBOL
++0xe3a98a71 kblockd_schedule_work vmlinux EXPORT_SYMBOL
++0x79d654ef send_sig_info vmlinux EXPORT_SYMBOL
++0x20030ecd ioremap vmlinux EXPORT_SYMBOL
++0xedc03953 iounmap vmlinux EXPORT_SYMBOL
++0xc865db6b xprt_release_xprt vmlinux EXPORT_SYMBOL_GPL
++0xc628e72a __neigh_event_send vmlinux EXPORT_SYMBOL
++0x0c61e098 sk_stream_wait_close vmlinux EXPORT_SYMBOL
++0x3c396f87 show_class_attr_string vmlinux EXPORT_SYMBOL_GPL
++0x441257b7 sysdev_store_int vmlinux EXPORT_SYMBOL_GPL
++0xf3970f1b read_cache_page_async vmlinux EXPORT_SYMBOL
++0xd0ee38b8 schedule_timeout_uninterruptible vmlinux EXPORT_SYMBOL
++0xd79b5a02 allow_signal vmlinux EXPORT_SYMBOL
++0xd3081dfa qe_upload_firmware vmlinux EXPORT_SYMBOL
++0xf4d880ae platform_get_irq vmlinux EXPORT_SYMBOL_GPL
++0x0781bf45 kill_anon_super vmlinux EXPORT_SYMBOL
++0x6676c50d nf_ct_delete_from_lists net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x730d37a5 xfrm6_rcv vmlinux EXPORT_SYMBOL
++0x119a95b0 xfrm4_rcv vmlinux EXPORT_SYMBOL
++0x309ea25a pci_enable_pcie_error_reporting vmlinux EXPORT_SYMBOL_GPL
++0x88ddfe5e xdr_buf_subsegment vmlinux EXPORT_SYMBOL_GPL
++0xed08815e inet_dgram_connect vmlinux EXPORT_SYMBOL
++0x715fb53b usb_find_alt_setting vmlinux EXPORT_SYMBOL_GPL
++0x0f6fbd82 phy_connect vmlinux EXPORT_SYMBOL
++0x34ab3ee2 driver_unregister vmlinux EXPORT_SYMBOL_GPL
++0xc87f94e8 generic_pipe_buf_unmap vmlinux EXPORT_SYMBOL
++0xddd4147d generic_pipe_buf_steal vmlinux EXPORT_SYMBOL
++0xa2c56c31 param_ops_ulong vmlinux EXPORT_SYMBOL
++0x01ca7533 inet_frags_exit_net vmlinux EXPORT_SYMBOL
++0x8e4b1069 kobject_get vmlinux EXPORT_SYMBOL
++0x3fb18605 kobject_put vmlinux EXPORT_SYMBOL
++0x9d033f64 nfs4_reset_write vmlinux EXPORT_SYMBOL_GPL
++0x46214106 files_lglock_local_unlock_cpu vmlinux EXPORT_SYMBOL
++0x58688735 relay_open vmlinux EXPORT_SYMBOL_GPL
++0x4029d238 param_set_copystring vmlinux EXPORT_SYMBOL
++0x59e70f93 __send_remote_softirq vmlinux EXPORT_SYMBOL
++0x2afbe2a5 usb_scuttle_anchored_urbs vmlinux EXPORT_SYMBOL_GPL
++0x51cc13a8 cfi_read_pri vmlinux EXPORT_SYMBOL
++0xf1deabf2 div64_u64 vmlinux EXPORT_SYMBOL
++0x52b34107 relay_close vmlinux EXPORT_SYMBOL_GPL
++0xfc39e32f ioport_unmap vmlinux EXPORT_SYMBOL
++0xbe3ce140 usb_reset_configuration vmlinux EXPORT_SYMBOL_GPL
++0x03dd0aff sysfs_merge_group vmlinux EXPORT_SYMBOL_GPL
++0xc84a0a7e seq_hlist_start_rcu vmlinux EXPORT_SYMBOL
++0xcdada4b3 d_validate vmlinux EXPORT_SYMBOL
++0xb2ebe0b7 __get_user_pages_fast vmlinux EXPORT_SYMBOL_GPL
++0x7bcc3ec6 down_trylock vmlinux EXPORT_SYMBOL
++0x16b67679 genl_register_family vmlinux EXPORT_SYMBOL
++0xc256e762 __bitmap_equal vmlinux EXPORT_SYMBOL
++0x019e7765 __init_rwsem vmlinux EXPORT_SYMBOL
++0x5342878d page_zero_new_buffers vmlinux EXPORT_SYMBOL
++0x7a6737e5 mntget vmlinux EXPORT_SYMBOL
++0x61406732 mntput vmlinux EXPORT_SYMBOL
++0x4f62563b fasync_helper vmlinux EXPORT_SYMBOL
++0x64203ccb mount_mtd vmlinux EXPORT_SYMBOL_GPL
++0x2f4113a2 dcookie_register vmlinux EXPORT_SYMBOL_GPL
++0xeee9690b locks_mandatory_area vmlinux EXPORT_SYMBOL
++0x99060d85 inet_twsk_deschedule vmlinux EXPORT_SYMBOL
++0x140d6513 xt_table_unlock vmlinux EXPORT_SYMBOL_GPL
++0x88b210e6 ethtool_op_set_ufo vmlinux EXPORT_SYMBOL
++0xb887455c sock_alloc_send_pskb vmlinux EXPORT_SYMBOL
++0x0acb1a3c __bitmap_shift_right vmlinux EXPORT_SYMBOL
++0x402b8281 __request_module vmlinux EXPORT_SYMBOL
++0xba215bc2 inet_register_protosw vmlinux EXPORT_SYMBOL
++0x9e041871 __inet_inherit_port vmlinux EXPORT_SYMBOL_GPL
++0x2b4f08e0 dev_deactivate vmlinux EXPORT_SYMBOL
++0x8eed09dc phy_find_first vmlinux EXPORT_SYMBOL
++0xb89af9bf srandom32 vmlinux EXPORT_SYMBOL
++0x23fd3028 vmalloc_node vmlinux EXPORT_SYMBOL
++0x891fbb10 mempool_destroy vmlinux EXPORT_SYMBOL
++0x054e550b kernel_halt vmlinux EXPORT_SYMBOL_GPL
++0xe0b0b13d xfrm6_tunnel_spi_lookup net/ipv6/xfrm6_tunnel EXPORT_SYMBOL
++0xe7a8d75d netpoll_cleanup vmlinux EXPORT_SYMBOL
++0x62005346 scsi_ioctl vmlinux EXPORT_SYMBOL
++0xe7bd56ce set_binfmt vmlinux EXPORT_SYMBOL
++0x9933f8fa km_policy_expired vmlinux EXPORT_SYMBOL
++0xdff2d6cd spi_unregister_master vmlinux EXPORT_SYMBOL_GPL
++0xae973946 __first_cpu vmlinux EXPORT_SYMBOL
++0xe2a6904b elv_rb_find vmlinux EXPORT_SYMBOL
++0xbee90f2f __kfifo_out_peek_r vmlinux EXPORT_SYMBOL
++0xa04a01bd qdisc_class_hash_insert vmlinux EXPORT_SYMBOL
++0xe5867808 dlci_ioctl_set vmlinux EXPORT_SYMBOL
++0x13e1e53c crypto_alg_lookup vmlinux EXPORT_SYMBOL_GPL
++0x8b4ac748 __rpc_wait_for_completion_task vmlinux EXPORT_SYMBOL_GPL
++0x742ec05d ethtool_op_set_tx_ipv6_csum vmlinux EXPORT_SYMBOL
++0x6195e83d scsi_report_device_reset vmlinux EXPORT_SYMBOL
++0x21e29754 scsi_print_sense vmlinux EXPORT_SYMBOL
++0xa34a1e0b locks_free_lock vmlinux EXPORT_SYMBOL
++0xe71c31f7 simple_attr_release vmlinux EXPORT_SYMBOL_GPL
++0xed120683 usb_submit_urb vmlinux EXPORT_SYMBOL_GPL
++0x928dc8b5 rename_lock vmlinux EXPORT_SYMBOL
++0xdebe699e page_symlink_inode_operations vmlinux EXPORT_SYMBOL
++0x99afe916 _raw_write_unlock_bh vmlinux EXPORT_SYMBOL
++0x060ea2d6 kstrtoull vmlinux EXPORT_SYMBOL
++0x5ac15bae kstrtou16 vmlinux EXPORT_SYMBOL
++0x94961283 vunmap vmlinux EXPORT_SYMBOL
++0xc97eeec5 write_cache_pages vmlinux EXPORT_SYMBOL
++0x160a0cad nf_conntrack_l4proto_tcp6 net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x3b21e0c3 xfrm_policy_alloc vmlinux EXPORT_SYMBOL
++0x81b8ae05 __nf_ct_ext_add net/netfilter/nf_conntrack EXPORT_SYMBOL
++0x117093be qdisc_class_hash_init vmlinux EXPORT_SYMBOL
++0xd4fb8ce7 sk_prot_clear_portaddr_nulls vmlinux EXPORT_SYMBOL
++0x787ae952 mtd_del_partition vmlinux EXPORT_SYMBOL_GPL
++0x25f3bd2e atomic64_xchg vmlinux EXPORT_SYMBOL
++0xfcc95cae task_current_syscall vmlinux EXPORT_SYMBOL_GPL
++0x574ed83f single_open_net vmlinux EXPORT_SYMBOL_GPL
++0xcc4c11c3 set_page_dirty_lock vmlinux EXPORT_SYMBOL
++0x8bc74143 tcp_v4_conn_request vmlinux EXPORT_SYMBOL
++0xeace373d usb_get_descriptor vmlinux EXPORT_SYMBOL_GPL
++0xf7064a0d spi_async_locked vmlinux EXPORT_SYMBOL_GPL
++0xca62af4c get_mtd_device vmlinux EXPORT_SYMBOL_GPL
++0x4897a00b blk_rq_init vmlinux EXPORT_SYMBOL
++0x26e76fb8 sysctl_udp_wmem_min vmlinux EXPORT_SYMBOL
++0x60b3b58a tcp_v4_syn_recv_sock vmlinux EXPORT_SYMBOL
++0x906c274e usb_put_dev vmlinux EXPORT_SYMBOL_GPL
++0xa7b0d968 swiotlb_tbl_sync_single vmlinux EXPORT_SYMBOL_GPL
++0x6d464175 __sg_free_table vmlinux EXPORT_SYMBOL
++0x4d6c0e8d kmem_cache_shrink vmlinux EXPORT_SYMBOL
++0x10d9d048 icmp_err_convert vmlinux EXPORT_SYMBOL
++0xf67a2d46 mii_check_link vmlinux EXPORT_SYMBOL
++0xd334a2bd tcp_hashinfo vmlinux EXPORT_SYMBOL
++0x2d140a58 genl_unlock vmlinux EXPORT_SYMBOL
++0x4256c8a3 of_n_size_cells vmlinux EXPORT_SYMBOL
++0xf040786d hid_report_raw_event vmlinux EXPORT_SYMBOL_GPL
++0x8c70d5ae scsi_unregister vmlinux EXPORT_SYMBOL
++0x0087d496 crypto_aead_setauthsize vmlinux EXPORT_SYMBOL_GPL
++0x5676c702 nlmclnt_init vmlinux EXPORT_SYMBOL_GPL
++0xcb09bf1a fd_install vmlinux EXPORT_SYMBOL
++0x4c11435a _raw_read_lock_bh vmlinux EXPORT_SYMBOL
++0x7681e3ba nf_nat_used_tuple net/ipv4/netfilter/nf_nat EXPORT_SYMBOL
++0xc927923a nf_nat_packet net/ipv4/netfilter/nf_nat EXPORT_SYMBOL_GPL
++0x9b8f7dca scsi_internal_device_unblock vmlinux EXPORT_SYMBOL_GPL
++0xbee5153c blk_init_tags vmlinux EXPORT_SYMBOL
++0x0d7d89ce vfs_fsync_range vmlinux EXPORT_SYMBOL
++0x3ce4ca6f disable_irq vmlinux EXPORT_SYMBOL
++0x87754115 raw_notifier_chain_register vmlinux EXPORT_SYMBOL_GPL
++0x20f357ca scsi_host_alloc vmlinux EXPORT_SYMBOL
++0xee146e0a bus_get_device_klist vmlinux EXPORT_SYMBOL_GPL
++0xd25133ac sysfs_remove_file vmlinux EXPORT_SYMBOL_GPL
++0x889d27ce path_put vmlinux EXPORT_SYMBOL
++0x5a9f996e apply_to_page_range vmlinux EXPORT_SYMBOL_GPL
++0xa0ceef51 out_of_line_wait_on_bit vmlinux EXPORT_SYMBOL
++0x70aca666 dst_discard vmlinux EXPORT_SYMBOL
++0xaa2a72bf __iowrite64_copy vmlinux EXPORT_SYMBOL_GPL
++0xf1bcf383 invalidate_partition vmlinux EXPORT_SYMBOL
++0xc26b1d80 kick_process vmlinux EXPORT_SYMBOL_GPL
++0xea41576c sk_release_kernel vmlinux EXPORT_SYMBOL
++0x13701441 sg_miter_stop vmlinux EXPORT_SYMBOL
++0x6f5febee key_reject_and_link vmlinux EXPORT_SYMBOL
++0xe4fe8ca1 _raw_spin_unlock_bh vmlinux EXPORT_SYMBOL
++0xc4aa788d xt_proto_init vmlinux EXPORT_SYMBOL_GPL
++0xdd1c65f6 blk_finish_plug vmlinux EXPORT_SYMBOL
++0x0b1beb31 vmalloc_32_user vmlinux EXPORT_SYMBOL
++0x756f9875 pci_get_subsys vmlinux EXPORT_SYMBOL
++0x9eecde16 do_brk vmlinux EXPORT_SYMBOL
++0x878ab3ce sysctl_tcp_adv_win_scale vmlinux EXPORT_SYMBOL
++0x7d32f0ad ip_local_out vmlinux EXPORT_SYMBOL_GPL
++0xe163a0d1 usb_hcd_check_unlink_urb vmlinux EXPORT_SYMBOL_GPL
++0xb1a9725f phy_device_free vmlinux EXPORT_SYMBOL
++0xb0104373 generic_permission vmlinux EXPORT_SYMBOL
++0xd59668e6 unlock_flocks vmlinux EXPORT_SYMBOL_GPL
++0xd7b7c7e4 uart_get_baud_rate vmlinux EXPORT_SYMBOL
++0xd6d2bfe8 pci_find_next_bus vmlinux EXPORT_SYMBOL
++0x9d3aa376 blk_iopoll_init vmlinux EXPORT_SYMBOL
++0xcbc2c8dd atomic_notifier_chain_unregister vmlinux EXPORT_SYMBOL_GPL
++0x8ba65b48 secpath_dup vmlinux EXPORT_SYMBOL
++0xe1b3830a set_user_nice vmlinux EXPORT_SYMBOL
++0x35c4c2bc gss_pseudoflavor_to_service vmlinux EXPORT_SYMBOL_GPL
++0xe7d71ad5 splice_direct_to_actor vmlinux EXPORT_SYMBOL
++0xf34806ec hrtimer_get_res vmlinux EXPORT_SYMBOL_GPL
++0x7d1541f1 nf_nat_pptp_hook_inbound net/netfilter/nf_conntrack_pptp EXPORT_SYMBOL_GPL
++0x1fdf5145 nf_conntrack_l3proto_unregister net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x895b81a5 nf_conntrack_l4proto_unregister net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x2b9da7a4 genl_lock vmlinux EXPORT_SYMBOL
++0x2d187f6f qdisc_class_hash_grow vmlinux EXPORT_SYMBOL
++0x7528c327 sock_setsockopt vmlinux EXPORT_SYMBOL
++0x7587dd64 tty_port_close_start vmlinux EXPORT_SYMBOL
++0x074989f8 ida_simple_remove vmlinux EXPORT_SYMBOL
++0xdfc46245 unlock_buffer vmlinux EXPORT_SYMBOL
++0x3429114e simple_transaction_release vmlinux EXPORT_SYMBOL
++0x5e4d4180 nfulnl_log_packet net/netfilter/nfnetlink_log EXPORT_SYMBOL_GPL
++0x01010c6d klist_add_before vmlinux EXPORT_SYMBOL_GPL
++0x9cb96e92 qdisc_put_rtab vmlinux EXPORT_SYMBOL
++0x91fd73a4 subsys_find_device_by_id vmlinux EXPORT_SYMBOL_GPL
++0x093e125a crypto_attr_alg2 vmlinux EXPORT_SYMBOL_GPL
++0xfc01e0ca nfs_commit_free vmlinux EXPORT_SYMBOL_GPL
++0x1176e07f __per_cpu_offset vmlinux EXPORT_SYMBOL
++0xbbcd407c proto_register vmlinux EXPORT_SYMBOL
++0x175b8a58 rtc_irq_unregister vmlinux EXPORT_SYMBOL_GPL
++0x9c7a72be tty_wakeup vmlinux EXPORT_SYMBOL_GPL
++0xb1f5c533 check_disk_size_change vmlinux EXPORT_SYMBOL
++0x33839ed8 d_clear_need_lookup vmlinux EXPORT_SYMBOL
++0xbc3f6afa down_read vmlinux EXPORT_SYMBOL
++0x5850f4cd km_report vmlinux EXPORT_SYMBOL
++0x1694ba86 __napi_complete vmlinux EXPORT_SYMBOL
++0xc3bc62fb skb_copy_expand vmlinux EXPORT_SYMBOL
++0xabd0c91c rtc_time_to_tm vmlinux EXPORT_SYMBOL
++0x274f1f9b dmam_free_coherent vmlinux EXPORT_SYMBOL
++0x98c6103a transport_setup_device vmlinux EXPORT_SYMBOL_GPL
++0x3da3a6f5 blk_queue_softirq_done vmlinux EXPORT_SYMBOL
++0x190c3ccc d_lookup vmlinux EXPORT_SYMBOL
++0xabdd83b5 genl_unregister_mc_group vmlinux EXPORT_SYMBOL
++0xf811e69d scsi_eh_flush_done_q vmlinux EXPORT_SYMBOL
++0x99f66401 path_is_under vmlinux EXPORT_SYMBOL
++0xfa590506 pci_iomap vmlinux EXPORT_SYMBOL
++0xa8119c49 xt_hook_unlink vmlinux EXPORT_SYMBOL_GPL
++0xc6435be3 skb_morph vmlinux EXPORT_SYMBOL_GPL
++0xdb0c48bb mmc_erase vmlinux EXPORT_SYMBOL
++0x8baf3116 percpu_counter_set vmlinux EXPORT_SYMBOL
++0x61a90c54 klist_add_head vmlinux EXPORT_SYMBOL_GPL
++0x5269ab27 ethtool_op_set_flags vmlinux EXPORT_SYMBOL
++0x7701acae scsi_remove_host vmlinux EXPORT_SYMBOL
++0x2c88b964 pci_request_selected_regions_exclusive vmlinux EXPORT_SYMBOL
++0xb6822a33 radix_tree_gang_lookup_tag vmlinux EXPORT_SYMBOL
++0xe8e99f5c flush_dcache_page vmlinux EXPORT_SYMBOL
++0xf4449388 timer_interrupt vmlinux EXPORT_SYMBOL
++0x12aab7d1 scsi_is_host_device vmlinux EXPORT_SYMBOL
++0x36ca51ab devm_ioremap_nocache vmlinux EXPORT_SYMBOL
++0xf370333d sync_dirty_buffer vmlinux EXPORT_SYMBOL
++0x6c81fae0 tcp_reno_ssthresh vmlinux EXPORT_SYMBOL_GPL
++0xca461664 netlink_has_listeners vmlinux EXPORT_SYMBOL_GPL
++0xc761c4bf pci_remove_bus_device vmlinux EXPORT_SYMBOL
++0xe075d6eb iter_div_u64_rem vmlinux EXPORT_SYMBOL
++0xd6c9eb4a nf_nat_seq_adjust_hook net/ipv4/netfilter/nf_conntrack_ipv4 EXPORT_SYMBOL_GPL
++0x53bce6b9 usb_alloc_urb vmlinux EXPORT_SYMBOL_GPL
++0x876e5b30 spi_setup vmlinux EXPORT_SYMBOL_GPL
++0x205125b9 __pci_enable_wake vmlinux EXPORT_SYMBOL
++0x1f0ffbff inode_init_once vmlinux EXPORT_SYMBOL
++0x73d69364 ring_buffer_change_overwrite vmlinux EXPORT_SYMBOL_GPL
++0x7fc827a5 __srcu_notifier_call_chain vmlinux EXPORT_SYMBOL_GPL
++0x5bc2e5a1 nf_ip6_checksum vmlinux EXPORT_SYMBOL
++0xeec2364d netpoll_send_skb_on_dev vmlinux EXPORT_SYMBOL
++0x7879bfc8 device_move vmlinux EXPORT_SYMBOL_GPL
++0xc19d6d2b scsi_cmd_ioctl vmlinux EXPORT_SYMBOL
++0x4a22c7b5 neigh_seq_stop vmlinux EXPORT_SYMBOL
++0xfad37936 usb_stor_clear_halt vmlinux EXPORT_SYMBOL_GPL
++0x77fa5d1f ns_to_timespec vmlinux EXPORT_SYMBOL
++0x95c6c48a qe_pin_set_gpio vmlinux EXPORT_SYMBOL
++0xed93f29e __kunmap_atomic vmlinux EXPORT_SYMBOL
++0x8ff80bf7 dev_mc_del_global vmlinux EXPORT_SYMBOL
++0x14880357 dev_mc_add_global vmlinux EXPORT_SYMBOL
++0x99525e3a vfsmount_lock_local_unlock vmlinux EXPORT_SYMBOL
++0xdb7cbcf1 blocking_notifier_chain_unregister vmlinux EXPORT_SYMBOL_GPL
++0x5651fb34 fifo_create_dflt vmlinux EXPORT_SYMBOL
++0x82a1419b neigh_table_init vmlinux EXPORT_SYMBOL
++0x89c4cbce mmc_register_driver vmlinux EXPORT_SYMBOL
++0x38a9c2c7 input_ff_effect_from_user vmlinux EXPORT_SYMBOL_GPL
++0x737e3d28 attribute_container_register vmlinux EXPORT_SYMBOL_GPL
++0x71da73ee blk_queue_segment_boundary vmlinux EXPORT_SYMBOL
++0x76c6ee5c blk_stop_queue vmlinux EXPORT_SYMBOL
++0x40979bcc blk_insert_request vmlinux EXPORT_SYMBOL
++0xea3210a9 blkcipher_walk_virt_block vmlinux EXPORT_SYMBOL_GPL
++0xa2bc62ac sysfs_create_link vmlinux EXPORT_SYMBOL_GPL
++0x3be9e6e8 task_active_pid_ns vmlinux EXPORT_SYMBOL_GPL
++0x94a08134 nf_nat_proto_nlattr_to_range net/ipv4/netfilter/nf_nat EXPORT_SYMBOL_GPL
++0x44dded3f svc_set_client vmlinux EXPORT_SYMBOL_GPL
++0x411b3b69 pci_add_dynid vmlinux EXPORT_SYMBOL_GPL
++0x6d294e43 clock_t_to_jiffies vmlinux EXPORT_SYMBOL
++0xe97f4ce5 qword_get vmlinux EXPORT_SYMBOL_GPL
++0x1f986505 ethtool_op_set_sg vmlinux EXPORT_SYMBOL
++0x4ccb8b94 pcim_iomap_table vmlinux EXPORT_SYMBOL
++0x669f27de crypto_larval_alloc vmlinux EXPORT_SYMBOL_GPL
++0xc7fdc711 journal_revoke vmlinux EXPORT_SYMBOL
++0x72aea9ce seq_release vmlinux EXPORT_SYMBOL
++0x3c5d0faa insert_inode_locked vmlinux EXPORT_SYMBOL
++0x4c3866c0 ring_buffer_size vmlinux EXPORT_SYMBOL_GPL
++0x838b13e7 ring_buffer_free vmlinux EXPORT_SYMBOL_GPL
++0x18852bcc module_layout vmlinux EXPORT_SYMBOL
++0x33945b7d xfrm_audit_state_notfound vmlinux EXPORT_SYMBOL_GPL
++0x37a8f9c9 hidinput_disconnect vmlinux EXPORT_SYMBOL_GPL
++0xcae03562 tun_get_socket drivers/net/tun EXPORT_SYMBOL_GPL
++0x0014c4da __blk_put_request vmlinux EXPORT_SYMBOL_GPL
++0x875ef85c elv_rb_latter_request vmlinux EXPORT_SYMBOL
++0x0ce1b711 sysfs_create_bin_file vmlinux EXPORT_SYMBOL_GPL
++0x66b2a859 nr_free_buffer_pages vmlinux EXPORT_SYMBOL_GPL
++0xeb8ae736 klist_init vmlinux EXPORT_SYMBOL_GPL
++0x0aabe623 xfrm_state_unregister_afinfo vmlinux EXPORT_SYMBOL
++0x60f4c230 of_find_node_by_name vmlinux EXPORT_SYMBOL
++0x83f9a3c9 serial8250_do_pm vmlinux EXPORT_SYMBOL
++0x05aa4eb1 pci_ltr_supported vmlinux EXPORT_SYMBOL
++0x6cdc5c6b nla_strlcpy vmlinux EXPORT_SYMBOL
++0xa46f2f1b kstrtouint vmlinux EXPORT_SYMBOL
++0x4121db0b blk_init_queue_node vmlinux EXPORT_SYMBOL
++0xe4a895fa up_write vmlinux EXPORT_SYMBOL
++0x7665e61c cpu_all_bits vmlinux EXPORT_SYMBOL
++0xb66350c3 auth_domain_put vmlinux EXPORT_SYMBOL_GPL
++0x4d8219f4 scsi_target_block vmlinux EXPORT_SYMBOL_GPL
++0x00d4f811 scsi_prep_state_check vmlinux EXPORT_SYMBOL
++0x8176ea3f free_buffer_head vmlinux EXPORT_SYMBOL
++0x6e4b5afd fget vmlinux EXPORT_SYMBOL
++0xfa1eb910 unregister_syscore_ops vmlinux EXPORT_SYMBOL_GPL
++0x44e9a829 match_token vmlinux EXPORT_SYMBOL
++0x2332418c vmtruncate vmlinux EXPORT_SYMBOL
++0xdbb24fc2 down_write vmlinux EXPORT_SYMBOL
++0xcaf2fc3d ip_route_output_flow vmlinux EXPORT_SYMBOL_GPL
++0x1b9e0ff1 scsilun_to_int vmlinux EXPORT_SYMBOL
++0x3b4572b8 posix_test_lock vmlinux EXPORT_SYMBOL
++0xd127c42a kill_block_super vmlinux EXPORT_SYMBOL
++0x14b68061 flush_signals vmlinux EXPORT_SYMBOL
++0x8c724794 nf_ct_remove_expectations net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x843a658f neigh_lookup_nodev vmlinux EXPORT_SYMBOL
++0x1b52b0d2 kernel_setsockopt vmlinux EXPORT_SYMBOL
++0xfab0ef6e kernel_getsockopt vmlinux EXPORT_SYMBOL
++0x9e4bdfff kernel_sock_ioctl vmlinux EXPORT_SYMBOL
++0x7c9208ff usb_stor_disconnect vmlinux EXPORT_SYMBOL_GPL
++0xcf39c94b mb_cache_entry_insert vmlinux EXPORT_SYMBOL
++0x5242d3b7 kallsyms_on_each_symbol vmlinux EXPORT_SYMBOL_GPL
++0xd2a8caf0 work_on_cpu vmlinux EXPORT_SYMBOL_GPL
++0x59de3119 nfnetlink_unicast net/netfilter/nfnetlink EXPORT_SYMBOL_GPL
++0xab694444 bsearch vmlinux EXPORT_SYMBOL
++0xf3dff1a3 blk_put_request vmlinux EXPORT_SYMBOL
++0x9f40a6d6 async_synchronize_full_domain vmlinux EXPORT_SYMBOL_GPL
++0x6974ef19 usb_serial_generic_throttle vmlinux EXPORT_SYMBOL_GPL
++0xf5fce407 crypto_create_tfm vmlinux EXPORT_SYMBOL_GPL
++0xa3a2d9af walk_system_ram_range vmlinux EXPORT_SYMBOL_GPL
++0xa2dc5981 of_get_cpu_node vmlinux EXPORT_SYMBOL
++0x363380e6 nf_conntrack_in net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xb77ba3a1 sock_queue_rcv_skb vmlinux EXPORT_SYMBOL
++0xfcd35070 blk_limits_io_min vmlinux EXPORT_SYMBOL
++0x05871953 sysfs_remove_files vmlinux EXPORT_SYMBOL_GPL
++0xa3f9df4e mapping_tagged vmlinux EXPORT_SYMBOL
++0x02d848d4 rpc_setbufsize vmlinux EXPORT_SYMBOL_GPL
++0x115258a5 put_disk vmlinux EXPORT_SYMBOL
++0xd9605d4c add_timer vmlinux EXPORT_SYMBOL
++0xabfbc63f irq_find_host vmlinux EXPORT_SYMBOL_GPL
++0x86d76ed4 hid_allocate_device vmlinux EXPORT_SYMBOL_GPL
++0xaaa509d1 spi_sync vmlinux EXPORT_SYMBOL_GPL
++0x732b7833 irq_cpu_rmap_add vmlinux EXPORT_SYMBOL
++0x9ba7089d argv_split vmlinux EXPORT_SYMBOL
++0xf6882e97 blk_queue_max_hw_sectors vmlinux EXPORT_SYMBOL
++0x31a89d59 rpc_debug vmlinux EXPORT_SYMBOL_GPL
++0x223326b1 svc_xprt_enqueue vmlinux EXPORT_SYMBOL_GPL
++0x162a441b bus_create_file vmlinux EXPORT_SYMBOL_GPL
++0x4872ee63 crypto_aes_set_key vmlinux EXPORT_SYMBOL_GPL
++0x5086ac3a alg_test vmlinux EXPORT_SYMBOL_GPL
++0xbef43296 console_conditional_schedule vmlinux EXPORT_SYMBOL
++0x774f22b3 svc_destroy vmlinux EXPORT_SYMBOL_GPL
++0xabb8322f pci_target_state vmlinux EXPORT_SYMBOL
++0xf2ec5b45 blkdev_issue_discard vmlinux EXPORT_SYMBOL
++0x38871428 crypto_unregister_pcomp vmlinux EXPORT_SYMBOL_GPL
++0xdf62a75b debugfs_create_symlink vmlinux EXPORT_SYMBOL_GPL
++0xece345ed fat_detach vmlinux EXPORT_SYMBOL_GPL
++0x698a899f ring_buffer_peek vmlinux EXPORT_SYMBOL_GPL
++0x96937cf7 xt_request_find_match vmlinux EXPORT_SYMBOL_GPL
++0x278d3cc1 writeback_inodes_sb_nr_if_idle vmlinux EXPORT_SYMBOL
++0x8b1b0eea xattr_getsecurity vmlinux EXPORT_SYMBOL_GPL
++0x6228c21f smp_call_function_single vmlinux EXPORT_SYMBOL
++0xc0580937 rb_erase vmlinux EXPORT_SYMBOL
++0x46a23e08 fsnotify_alloc_group vmlinux EXPORT_SYMBOL_GPL
++0xaafdc258 strcasecmp vmlinux EXPORT_SYMBOL
++0x962a13e8 save_mount_options vmlinux EXPORT_SYMBOL
++0xf69dd1ab clockevents_register_device vmlinux EXPORT_SYMBOL_GPL
++0x5672add2 nf_conntrack_set_hashsize net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xe5cf9c6b cache_check vmlinux EXPORT_SYMBOL_GPL
++0x4bc96635 ifla_policy vmlinux EXPORT_SYMBOL
++0x35cb4429 tty_unthrottle vmlinux EXPORT_SYMBOL
++0xdd9d1ca1 set_blocksize vmlinux EXPORT_SYMBOL
++0x8e13511f block_page_mkwrite vmlinux EXPORT_SYMBOL
++0x85b9e216 set_timer_slack vmlinux EXPORT_SYMBOL_GPL
++0x0569dca2 class_compat_remove_link vmlinux EXPORT_SYMBOL_GPL
++0x7d5c1ae6 uart_unregister_driver vmlinux EXPORT_SYMBOL
++0x6fd7b2a5 crypto_spawn_tfm vmlinux EXPORT_SYMBOL_GPL
++0x2e77637b generic_error_remove_page vmlinux EXPORT_SYMBOL
++0xcc344f76 nf_ct_nat_offset net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x4fb169f5 ipv6_chk_prefix vmlinux EXPORT_SYMBOL
++0xed1bfd69 ip6_dst_lookup_flow vmlinux EXPORT_SYMBOL_GPL
++0x39d847fa inet_csk_search_req vmlinux EXPORT_SYMBOL_GPL
++0x6ddfd8bc inet_unhash vmlinux EXPORT_SYMBOL_GPL
++0x6aed133e mdio_bus_type vmlinux EXPORT_SYMBOL
++0xf8ccb652 blk_execute_rq vmlinux EXPORT_SYMBOL
++0x993019f7 rpc_call_sync vmlinux EXPORT_SYMBOL_GPL
++0xef6a7e95 ip6_xmit vmlinux EXPORT_SYMBOL
++0xb5044271 vsscanf vmlinux EXPORT_SYMBOL
++0xa583f8ce seq_open_net vmlinux EXPORT_SYMBOL_GPL
++0x82d79b51 sysctl_vfs_cache_pressure vmlinux EXPORT_SYMBOL_GPL
++0x04486e88 rcu_batches_completed vmlinux EXPORT_SYMBOL_GPL
++0x0e52592a panic vmlinux EXPORT_SYMBOL
++0x96dbcca2 ioremap_prot vmlinux EXPORT_SYMBOL
++0x97f6197b pci_set_dma_seg_boundary vmlinux EXPORT_SYMBOL
++0x5c265cba sg_init_one vmlinux EXPORT_SYMBOL
++0x12da5bb2 __kmalloc vmlinux EXPORT_SYMBOL
++0x26477c07 __vmalloc vmlinux EXPORT_SYMBOL
++0xc19db54a kobject_init_and_add vmlinux EXPORT_SYMBOL_GPL
++0x0aa2fcd3 rpc_wake_up_next vmlinux EXPORT_SYMBOL_GPL
++0x7da4ef46 __ip_select_ident vmlinux EXPORT_SYMBOL
++0x81fb8fe5 skb_gro_receive vmlinux EXPORT_SYMBOL_GPL
++0xbe7e6656 pci_find_ht_capability vmlinux EXPORT_SYMBOL_GPL
++0x066cab2a pci_find_next_ht_capability vmlinux EXPORT_SYMBOL_GPL
++0x18765207 journal_load vmlinux EXPORT_SYMBOL
++0xd9bdbb86 flock_lock_file_wait vmlinux EXPORT_SYMBOL
++0x81f1044c xt_find_match vmlinux EXPORT_SYMBOL
++0x21de11a8 __skb_warn_lro_forwarding vmlinux EXPORT_SYMBOL
++0xbe6f064d idr_for_each vmlinux EXPORT_SYMBOL
++0xf3013d91 shash_ahash_digest vmlinux EXPORT_SYMBOL_GPL
++0x5fcadf66 locks_init_lock vmlinux EXPORT_SYMBOL
++0xfede227a bio_add_pc_page vmlinux EXPORT_SYMBOL
++0x71c90087 memcmp vmlinux EXPORT_SYMBOL
++0x77ec2fe2 netif_stacked_transfer_operstate vmlinux EXPORT_SYMBOL
++0xf5fc2242 d_alloc_name vmlinux EXPORT_SYMBOL
++0xaa6e4df5 _raw_write_lock_irqsave vmlinux EXPORT_SYMBOL
++0xc0a0f334 napi_frags_finish vmlinux EXPORT_SYMBOL
++0xce7ce037 of_translate_address vmlinux EXPORT_SYMBOL
++0xaba0a17d devm_ioport_unmap vmlinux EXPORT_SYMBOL
++0xe809a0f7 cont_write_begin vmlinux EXPORT_SYMBOL
++0x9a48be6f vfs_readdir vmlinux EXPORT_SYMBOL
++0x881039d0 zlib_inflate vmlinux EXPORT_SYMBOL
++0xa43b1297 vscnprintf vmlinux EXPORT_SYMBOL
++0xee4fe3e4 blk_recount_segments vmlinux EXPORT_SYMBOL
++0x94a1af32 simple_statfs vmlinux EXPORT_SYMBOL
++0x3e0e9023 param_set_long vmlinux EXPORT_SYMBOL
++0xd8326202 xfrm6_tunnel_deregister net/ipv6/tunnel6 EXPORT_SYMBOL
++0x3b5a4e82 xfrm4_tunnel_deregister net/ipv4/tunnel4 EXPORT_SYMBOL
++0x5b14ec1a rpc_put_mount vmlinux EXPORT_SYMBOL_GPL
++0x602cf2ee km_policy_notify vmlinux EXPORT_SYMBOL
++0xa47d64bf ip_mc_join_group vmlinux EXPORT_SYMBOL
++0xc099fc6f usb_is_intel_switchable_xhci vmlinux EXPORT_SYMBOL_GPL
++0x3244fd7d usb_string vmlinux EXPORT_SYMBOL_GPL
++0xdb760f52 __kfifo_free vmlinux EXPORT_SYMBOL
++0x0b8fef76 nf_ct_unexpect_related net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x328d3c91 inet_csk_reqsk_queue_hash_add vmlinux EXPORT_SYMBOL_GPL
++0xe6e1c5fe uuid_be_gen vmlinux EXPORT_SYMBOL_GPL
++0xa6fb4d71 debugfs_remove vmlinux EXPORT_SYMBOL_GPL
++0x2f4ac4ea lease_modify vmlinux EXPORT_SYMBOL
++0xf441ac43 ioread8_rep vmlinux EXPORT_SYMBOL
++0x979eddb8 xfrm_dst_ifdown vmlinux EXPORT_SYMBOL
++0x64f428d3 neigh_seq_start vmlinux EXPORT_SYMBOL
++0x59825b9a pci_assign_unassigned_bridge_resources vmlinux EXPORT_SYMBOL_GPL
++0x3f0546a8 ioread32_rep vmlinux EXPORT_SYMBOL
++0xfe7887e9 rpc_put_task vmlinux EXPORT_SYMBOL_GPL
++0xf9f40caa eth_header_cache_update vmlinux EXPORT_SYMBOL
++0xb31526ee sg_copy_from_buffer vmlinux EXPORT_SYMBOL
++0x73e20c1c strlcpy vmlinux EXPORT_SYMBOL
++0x8abacc47 get_max_files vmlinux EXPORT_SYMBOL_GPL
++0x328a05f1 strncpy vmlinux EXPORT_SYMBOL
++0x548a40b6 scsi_release_buffers vmlinux EXPORT_SYMBOL
++0x13574bbf nf_net_netfilter_sysctl_path vmlinux EXPORT_SYMBOL_GPL
++0x738196bf driver_create_file vmlinux EXPORT_SYMBOL_GPL
++0x7193680a kern_mount_data vmlinux EXPORT_SYMBOL_GPL
++0x8ef33ff8 __init_kthread_worker vmlinux EXPORT_SYMBOL_GPL
++0xa10f05a8 par_io_of_config vmlinux EXPORT_SYMBOL
++0xf6367114 blk_requeue_request vmlinux EXPORT_SYMBOL
++0x84fc4fe5 insert_inode_locked4 vmlinux EXPORT_SYMBOL
++0x41482d8b strndup_user vmlinux EXPORT_SYMBOL
++0xddd58dc0 ring_buffer_reset vmlinux EXPORT_SYMBOL_GPL
++0xfae9f8ef crypto_init_spawn vmlinux EXPORT_SYMBOL_GPL
++0x9c78b4da mount_nodev vmlinux EXPORT_SYMBOL
++0xf40fbfa7 pagevec_lookup vmlinux EXPORT_SYMBOL
++0x376591a1 xfrm_find_acq vmlinux EXPORT_SYMBOL
++0xaf7abced eth_mac_addr vmlinux EXPORT_SYMBOL
++0xe7a0dd2c scsi_scan_host vmlinux EXPORT_SYMBOL
++0xa22fa240 scsi_setup_fs_cmnd vmlinux EXPORT_SYMBOL
++0xebf65040 svc_xprt_received vmlinux EXPORT_SYMBOL_GPL
++0x12c92332 tcp_sendpage vmlinux EXPORT_SYMBOL
++0xb98a0185 rtc_tm_to_time vmlinux EXPORT_SYMBOL
++0xe5883bd9 class_compat_unregister vmlinux EXPORT_SYMBOL_GPL
++0x47b3f862 radix_tree_lookup_slot vmlinux EXPORT_SYMBOL
++0x91621d6a allocate_resource vmlinux EXPORT_SYMBOL
++0xc08647ff ring_buffer_bytes_cpu vmlinux EXPORT_SYMBOL_GPL
++0x02d81845 audit_log_task_context vmlinux EXPORT_SYMBOL
++0x6b13f214 task_ns_capable vmlinux EXPORT_SYMBOL
++0x49a08acf spi_write_then_read vmlinux EXPORT_SYMBOL_GPL
++0x264aab93 mtd_device_parse_register vmlinux EXPORT_SYMBOL_GPL
++0x40946686 splice_from_pipe_feed vmlinux EXPORT_SYMBOL
++0xf9a054b5 __round_jiffies vmlinux EXPORT_SYMBOL_GPL
++0xfe822d55 get_brgfreq vmlinux EXPORT_SYMBOL
++0x03c06156 bitmap_fold vmlinux EXPORT_SYMBOL
++0x734b6620 vfs_rmdir vmlinux EXPORT_SYMBOL
++0x92eb404f generic_shutdown_super vmlinux EXPORT_SYMBOL
++0x37e74642 get_jiffies_64 vmlinux EXPORT_SYMBOL
++0x3f3d5755 scsi_track_queue_full vmlinux EXPORT_SYMBOL
++0x45d4a34f init_buffer vmlinux EXPORT_SYMBOL
++0xfa2e134e __sock_recv_ts_and_drops vmlinux EXPORT_SYMBOL_GPL
++0xbf7fd2f5 schedule_timeout_killable vmlinux EXPORT_SYMBOL
++0xc14de4a4 rpcauth_create vmlinux EXPORT_SYMBOL_GPL
++0x286a504e sock_no_getname vmlinux EXPORT_SYMBOL
++0xb2abf6e7 vfs_link vmlinux EXPORT_SYMBOL
++0x85050965 __irq_alloc_descs vmlinux EXPORT_SYMBOL_GPL
++0x6e0778f8 call_usermodehelper_setup vmlinux EXPORT_SYMBOL
++0x46de0081 netlink_rcv_skb vmlinux EXPORT_SYMBOL
++0x7e7aea36 phy_driver_unregister vmlinux EXPORT_SYMBOL
++0xf82abc1d isa_dma_bridge_buggy vmlinux EXPORT_SYMBOL
++0x5aa2ba6e crypto_alloc_pcomp vmlinux EXPORT_SYMBOL_GPL
++0x0254aae8 journal_flush vmlinux EXPORT_SYMBOL
++0xedc2994d ktime_get_real vmlinux EXPORT_SYMBOL_GPL
++0x6258ff7a panic_notifier_list vmlinux EXPORT_SYMBOL
++0x493615f0 __xfrm_state_delete vmlinux EXPORT_SYMBOL
++0x91781620 unregister_mtd_chip_driver vmlinux EXPORT_SYMBOL
++0x82f776b7 gpio_export vmlinux EXPORT_SYMBOL_GPL
++0x8aee4b8e do_splice_from vmlinux EXPORT_SYMBOL_GPL
++0x5edbbeed d_delete vmlinux EXPORT_SYMBOL
++0x35829944 find_get_pages_tag vmlinux EXPORT_SYMBOL
++0xc8fd727e mod_timer vmlinux EXPORT_SYMBOL
++0x68e0e289 idr_remove vmlinux EXPORT_SYMBOL
++0xc61be59c ida_remove vmlinux EXPORT_SYMBOL
++0x76053cac mnt_set_expiry vmlinux EXPORT_SYMBOL
++0xd0ec1a6b use_mm vmlinux EXPORT_SYMBOL_GPL
++0x1d3865da param_get_invbool vmlinux EXPORT_SYMBOL
++0xcc964b37 flush_delayed_work_sync vmlinux EXPORT_SYMBOL
++0xbf9d1b96 nfsd_debug vmlinux EXPORT_SYMBOL_GPL
++0xb84fe6ac devres_destroy vmlinux EXPORT_SYMBOL_GPL
++0xbe3f06f3 tty_hangup vmlinux EXPORT_SYMBOL
++0x67d548bf pci_disable_device vmlinux EXPORT_SYMBOL
++0x873f76af add_page_wait_queue vmlinux EXPORT_SYMBOL_GPL
++0x1a2bc07b flush_tlb_mm vmlinux EXPORT_SYMBOL
++0x17643c44 mdiobus_read vmlinux EXPORT_SYMBOL
++0xd9bac924 tty_termios_copy_hw vmlinux EXPORT_SYMBOL
++0x2f8ebbe0 rpc_ntop vmlinux EXPORT_SYMBOL_GPL
++0x44ed046c rpc_pton vmlinux EXPORT_SYMBOL_GPL
++0xcfd9a2c0 des_ekey vmlinux EXPORT_SYMBOL_GPL
++0x1407c6e7 kmap_prot vmlinux EXPORT_SYMBOL
++0xf120872a dql_completed vmlinux EXPORT_SYMBOL
++0x43a939cc key_link vmlinux EXPORT_SYMBOL
++0x34a8b7a1 read_cache_page vmlinux EXPORT_SYMBOL
++0x1cfc799e dev_change_flags vmlinux EXPORT_SYMBOL
++0x801f5a3f __strncpy_from_user vmlinux EXPORT_SYMBOL
++0x41f9eb17 xfrm_state_walk vmlinux EXPORT_SYMBOL
++0x1165ba63 phy_scan_fixups vmlinux EXPORT_SYMBOL
++0x65420d1e nla_put_nohdr vmlinux EXPORT_SYMBOL
++0x98691115 napi_gro_flush vmlinux EXPORT_SYMBOL
++0xa51f1bdd scsi_set_medium_removal vmlinux EXPORT_SYMBOL
++0x77dab830 keyring_clear vmlinux EXPORT_SYMBOL
++0xff8862d7 rh_get_stats vmlinux EXPORT_SYMBOL_GPL
++0x8fbf37e0 profile_pc vmlinux EXPORT_SYMBOL
++0x6532831c gss_service_to_auth_domain_name vmlinux EXPORT_SYMBOL_GPL
++0x7e1183c9 async_schedule vmlinux EXPORT_SYMBOL_GPL
++0x9e1cfc90 ioremap_wc vmlinux EXPORT_SYMBOL
++0xa47434fb __nla_put vmlinux EXPORT_SYMBOL
++0x4c2ae700 strnstr vmlinux EXPORT_SYMBOL
++0xcbe78671 svc_sock_names vmlinux EXPORT_SYMBOL_GPL
++0x6415b696 inet_diag_register vmlinux EXPORT_SYMBOL_GPL
++0x41a855a9 sdhci_pltfm_unregister vmlinux EXPORT_SYMBOL_GPL
++0xf5222143 _raw_spin_lock_irqsave vmlinux EXPORT_SYMBOL
++0xe17482f0 tcp_done vmlinux EXPORT_SYMBOL_GPL
++0x7fdf3256 sysdev_show_ulong vmlinux EXPORT_SYMBOL_GPL
++0x2fb6de5d add_device_randomness vmlinux EXPORT_SYMBOL
++0xde417b81 async_schedule_domain vmlinux EXPORT_SYMBOL_GPL
++0x6ff5969a usb_init_urb vmlinux EXPORT_SYMBOL_GPL
++0xd4e0fb01 get_phy_id vmlinux EXPORT_SYMBOL
++0x35cca30f blk_free_tags vmlinux EXPORT_SYMBOL
++0xc0b2494c vfsmount_lock_lock_init vmlinux EXPORT_SYMBOL
++0xefdd5a63 ktime_get_ts vmlinux EXPORT_SYMBOL_GPL
++0xe7ce7439 _memcpy_fromio vmlinux EXPORT_SYMBOL
++0xe4ab69a4 usb_hcd_unmap_urb_setup_for_dma vmlinux EXPORT_SYMBOL_GPL
++0xadf804eb scsi_device_get vmlinux EXPORT_SYMBOL
++0xe2ab0f51 scsi_device_put vmlinux EXPORT_SYMBOL
++0x51ce5ad3 files_lglock_local_lock_cpu vmlinux EXPORT_SYMBOL
++0x37eab51b map_vm_area vmlinux EXPORT_SYMBOL_GPL
++0x0084e86d unregister_shrinker vmlinux EXPORT_SYMBOL
++0x05c1da0d isa_bridge_pcidev vmlinux EXPORT_SYMBOL_GPL
++0xcb1c9e78 ipv6_dev_get_saddr vmlinux EXPORT_SYMBOL
++0xcbbd7b2f xfrm_policy_flush vmlinux EXPORT_SYMBOL
++0xab5e43fc mmc_set_blocklen vmlinux EXPORT_SYMBOL
++0xb8aa2342 __check_region vmlinux EXPORT_SYMBOL
++0x328aa64c par_io_data_set vmlinux EXPORT_SYMBOL
++0x90dd262f nf_nat_protocol_register net/ipv4/netfilter/nf_nat EXPORT_SYMBOL
++0xf6388c56 sysctl_ip_default_ttl vmlinux EXPORT_SYMBOL
++0xba7ff9a8 napi_gro_frags vmlinux EXPORT_SYMBOL
++0x59923e50 pci_load_saved_state vmlinux EXPORT_SYMBOL_GPL
++0x15864b03 flex_array_get vmlinux EXPORT_SYMBOL
++0x0cf9a646 key_task_permission vmlinux EXPORT_SYMBOL
++0x9cbb7f29 nf_nat_protocol_unregister net/ipv4/netfilter/nf_nat EXPORT_SYMBOL
++0xfc464847 inet_diag_unregister vmlinux EXPORT_SYMBOL_GPL
++0x70a6efa3 sock_sendmsg vmlinux EXPORT_SYMBOL
++0x61308070 disk_get_part vmlinux EXPORT_SYMBOL_GPL
++0x2333005e netlink_kernel_release vmlinux EXPORT_SYMBOL
++0x0ffc7c8b __sock_create vmlinux EXPORT_SYMBOL
++0x190f4530 rtc_set_mmss vmlinux EXPORT_SYMBOL_GPL
++0x8384d453 pci_bus_resource_n vmlinux EXPORT_SYMBOL_GPL
++0x4289f7df down_interruptible vmlinux EXPORT_SYMBOL
++0x3064cd91 netif_carrier_off vmlinux EXPORT_SYMBOL
++0x26b9af4e mmc_request_done vmlinux EXPORT_SYMBOL
++0x46074c17 sdev_evt_alloc vmlinux EXPORT_SYMBOL_GPL
++0xa43e2c08 lease_get_mtime vmlinux EXPORT_SYMBOL
++0x17d3b09a sb_set_blocksize vmlinux EXPORT_SYMBOL
++0x850ac629 sdio_writew vmlinux EXPORT_SYMBOL_GPL
++0x3744cf36 vmalloc_to_pfn vmlinux EXPORT_SYMBOL
++0x4c18ad3a get_task_mm vmlinux EXPORT_SYMBOL_GPL
++0xe8b2187c nf_ct_expect_put net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xb9b9df41 usb_amd_dev_put vmlinux EXPORT_SYMBOL_GPL
++0x5a642ff0 crypto_unregister_alg vmlinux EXPORT_SYMBOL_GPL
++0x4484a83b dump_write vmlinux EXPORT_SYMBOL
++0x0fae7d45 lock_super vmlinux EXPORT_SYMBOL
++0xb8f92e75 __class_create vmlinux EXPORT_SYMBOL_GPL
++0x86e44713 filp_open vmlinux EXPORT_SYMBOL
++0xad91149b generic_file_aio_write vmlinux EXPORT_SYMBOL
++0x43af7a67 xfrm6_prepare_output vmlinux EXPORT_SYMBOL
++0x4d4fd5f1 xfrm_calg_get_byname vmlinux EXPORT_SYMBOL_GPL
++0xc6c1239b xfrm4_prepare_output vmlinux EXPORT_SYMBOL
++0x14665bed pci_read_vpd vmlinux EXPORT_SYMBOL
++0x51014234 get_disk vmlinux EXPORT_SYMBOL
++0xb2c3e937 __free_pages vmlinux EXPORT_SYMBOL
++0x4ff0cd36 inet_bind vmlinux EXPORT_SYMBOL
++0x034e17a5 qdisc_watchdog_init vmlinux EXPORT_SYMBOL
++0xe861f9ad class_find_device vmlinux EXPORT_SYMBOL_GPL
++0xfe3c4e28 __register_binfmt vmlinux EXPORT_SYMBOL
++0x058e4b7d xfrm_init_state vmlinux EXPORT_SYMBOL
++0x37ac26b3 pci_assign_resource vmlinux EXPORT_SYMBOL
++0x89ca47bf kstrtos8_from_user vmlinux EXPORT_SYMBOL
++0xff18ef68 crypto_init_spawn2 vmlinux EXPORT_SYMBOL_GPL
++0x358365c5 xfrm_user_policy vmlinux EXPORT_SYMBOL
++0x6117420a netif_notify_peers vmlinux EXPORT_SYMBOL
++0xf94b112b netif_napi_add vmlinux EXPORT_SYMBOL
++0x562ccd0e skb_split vmlinux EXPORT_SYMBOL
++0xf5b3060b input_grab_device vmlinux EXPORT_SYMBOL
++0xa177bc19 default_mtd_writev vmlinux EXPORT_SYMBOL_GPL
++0x2376e92b tty_port_block_til_ready vmlinux EXPORT_SYMBOL
++0x81b22cf9 journal_try_to_free_buffers vmlinux EXPORT_SYMBOL
++0xf10de535 ioread8 vmlinux EXPORT_SYMBOL
++0x686c703f xfrm_count_auth_supported vmlinux EXPORT_SYMBOL_GPL
++0x8c10c6f6 netlink_broadcast vmlinux EXPORT_SYMBOL
++0x66645e38 of_property_read_string_index vmlinux EXPORT_SYMBOL_GPL
++0x0343bdf1 __i2c_board_list vmlinux EXPORT_SYMBOL_GPL
++0xa07bb953 block_write_full_page_endio vmlinux EXPORT_SYMBOL
++0x317a1174 shmem_file_setup vmlinux EXPORT_SYMBOL_GPL
++0xc3cf1128 in_group_p vmlinux EXPORT_SYMBOL
++0xc631580a console_unlock vmlinux EXPORT_SYMBOL
++0x9524b0ae _outsb vmlinux EXPORT_SYMBOL
++0xcfea9e86 udp_sendmsg vmlinux EXPORT_SYMBOL
++0x318394d8 mmc_start_req vmlinux EXPORT_SYMBOL
++0xbdfcce9d elv_rb_former_request vmlinux EXPORT_SYMBOL
++0x35fbd6a1 __kfifo_dma_out_prepare_r vmlinux EXPORT_SYMBOL
++0xf34bd1d5 dcb_ieee_setapp vmlinux EXPORT_SYMBOL
++0xcbb30a2b dcb_ieee_delapp vmlinux EXPORT_SYMBOL
++0xf53d4c26 qdisc_class_hash_destroy vmlinux EXPORT_SYMBOL
++0xcc26e5cf sdio_register_driver vmlinux EXPORT_SYMBOL_GPL
++0x50deef5c usb_kill_urb vmlinux EXPORT_SYMBOL_GPL
++0xa87e68e1 usb_get_intf vmlinux EXPORT_SYMBOL_GPL
++0x9e607910 audit_log vmlinux EXPORT_SYMBOL
++0x767b18fb set_security_override_from_ctx vmlinux EXPORT_SYMBOL
++0x5ab3b29b xdr_process_buf vmlinux EXPORT_SYMBOL_GPL
++0x065f3688 sk_wait_data vmlinux EXPORT_SYMBOL
++0xc724970d pci_enable_obff vmlinux EXPORT_SYMBOL
++0x762ea593 crypto_remove_spawns vmlinux EXPORT_SYMBOL_GPL
++0x4fd4e89d ring_buffer_empty_cpu vmlinux EXPORT_SYMBOL_GPL
++0x0f28cb91 nvram_read_byte vmlinux EXPORT_SYMBOL
++0xc390630a xt_replace_table vmlinux EXPORT_SYMBOL_GPL
++0xf9943f1b __netpoll_setup vmlinux EXPORT_SYMBOL_GPL
++0x08cc84e7 __percpu_counter_init vmlinux EXPORT_SYMBOL
++0x6d6c930c irq_set_affinity_notifier vmlinux EXPORT_SYMBOL_GPL
++0x698fe0cc inet_hashinfo_init vmlinux EXPORT_SYMBOL_GPL
++0x262e9a73 input_mt_report_pointer_emulation vmlinux EXPORT_SYMBOL
++0x333bf31b usb_stor_bulk_transfer_sg vmlinux EXPORT_SYMBOL_GPL
++0x56cd1a50 pci_ioremap_bar vmlinux EXPORT_SYMBOL_GPL
++0xadd2969f end_buffer_read_sync vmlinux EXPORT_SYMBOL
++0x227badd6 mod_timer_pinned vmlinux EXPORT_SYMBOL
++0x8276963f set_cpus_allowed_ptr vmlinux EXPORT_SYMBOL_GPL
++0xfd168974 neigh_for_each vmlinux EXPORT_SYMBOL
++0x7e8699a8 rtc_initialize_alarm vmlinux EXPORT_SYMBOL_GPL
++0x6971447a rtc_month_days vmlinux EXPORT_SYMBOL
++0x7e64181d usb_calc_bus_time vmlinux EXPORT_SYMBOL_GPL
++0xabc7e656 sg_miter_next vmlinux EXPORT_SYMBOL
++0xdd8e46ba crypto_init_shash_spawn vmlinux EXPORT_SYMBOL_GPL
++0xe9b01876 crypto_init_ahash_spawn vmlinux EXPORT_SYMBOL_GPL
++0x6e50cff7 posix_timers_register_clock vmlinux EXPORT_SYMBOL_GPL
++0x8ff66782 param_get_ushort vmlinux EXPORT_SYMBOL
++0xe6dd236d clear_pages vmlinux EXPORT_SYMBOL
++0x67ef2a40 svc_sock_update_bufs vmlinux EXPORT_SYMBOL_GPL
++0x5c27b6d6 skb_pull vmlinux EXPORT_SYMBOL
++0x2aa1292b usb_find_interface vmlinux EXPORT_SYMBOL_GPL
++0x8574ca6c gpio_request_array vmlinux EXPORT_SYMBOL_GPL
++0xd988b61f swiotlb_unmap_page vmlinux EXPORT_SYMBOL_GPL
++0x6da928f4 _insw_ns vmlinux EXPORT_SYMBOL
++0x05a514a1 _insl_ns vmlinux EXPORT_SYMBOL
++0x93d2422d snmp_mib_free vmlinux EXPORT_SYMBOL_GPL
++0x1e41fddb neigh_app_ns vmlinux EXPORT_SYMBOL
++0xc9501ade phy_start_interrupts vmlinux EXPORT_SYMBOL
++0x09d998e1 scsi_get_vpd_page vmlinux EXPORT_SYMBOL_GPL
++0x9dfdf722 gpio_free_array vmlinux EXPORT_SYMBOL_GPL
++0x5d51bcf7 scatterwalk_start vmlinux EXPORT_SYMBOL_GPL
++0x53472771 sysfs_put vmlinux EXPORT_SYMBOL_GPL
++0x526c437a xfrm_state_check_expire vmlinux EXPORT_SYMBOL
++0x393c4c4e netdev_boot_setup_check vmlinux EXPORT_SYMBOL
++0x1ef1100f sock_i_uid vmlinux EXPORT_SYMBOL
++0xf4009166 sock_i_ino vmlinux EXPORT_SYMBOL
++0xc046033e seq_bitmap vmlinux EXPORT_SYMBOL
++0x3942b0c9 ip_build_and_send_pkt vmlinux EXPORT_SYMBOL_GPL
++0xb93c76a8 register_gifconf vmlinux EXPORT_SYMBOL
++0xcd07f6b1 gpiochip_find vmlinux EXPORT_SYMBOL_GPL
++0x292be0eb crypto_rng_type vmlinux EXPORT_SYMBOL_GPL
++0x457594fa crypto_alg_list vmlinux EXPORT_SYMBOL_GPL
++0xc04e7aa9 sync_inode_metadata vmlinux EXPORT_SYMBOL
++0xafff3d1d mempool_alloc vmlinux EXPORT_SYMBOL
++0x86f6b99d synchronize_rcu_expedited vmlinux EXPORT_SYMBOL_GPL
++0xaa6901ac __kfifo_out_r vmlinux EXPORT_SYMBOL
++0x52f1bf6b __srcu_read_lock vmlinux EXPORT_SYMBOL_GPL
++0xd03c7700 secure_ipv4_port_ephemeral vmlinux EXPORT_SYMBOL_GPL
++0x79578100 proc_dointvec_minmax vmlinux EXPORT_SYMBOL
++0x8581db4c i2c_bus_type vmlinux EXPORT_SYMBOL_GPL
++0xcd898fd4 do_truncate vmlinux EXPORT_SYMBOL_GPL
++0x7cd81e29 kmalloc_caches vmlinux EXPORT_SYMBOL
++0xdc43a9c8 daemonize vmlinux EXPORT_SYMBOL
++0x390dd42a rpc_malloc vmlinux EXPORT_SYMBOL_GPL
++0xb2390b29 icmpv6_send vmlinux EXPORT_SYMBOL
++0x19ade8fc put_driver vmlinux EXPORT_SYMBOL_GPL
++0xc00f7d59 blk_queue_make_request vmlinux EXPORT_SYMBOL
++0x9cb013cc put_page vmlinux EXPORT_SYMBOL
++0x74954462 timecounter_read vmlinux EXPORT_SYMBOL_GPL
++0x6fff8279 nf_conntrack_lock net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xab930e2e rpc_lookup_cred vmlinux EXPORT_SYMBOL_GPL
++0x801c8645 rtc_device_register vmlinux EXPORT_SYMBOL_GPL
++0x445fc790 input_reset_device vmlinux EXPORT_SYMBOL
++0xbc8a443b tty_ldisc_deref vmlinux EXPORT_SYMBOL_GPL
++0x7b645a57 vfs_getattr vmlinux EXPORT_SYMBOL
++0x31f79892 pci_domain_nr vmlinux EXPORT_SYMBOL
++0x5b582800 inet_del_protocol vmlinux EXPORT_SYMBOL
++0x03b7b2e4 neigh_update vmlinux EXPORT_SYMBOL
++0xe03951df phy_stop vmlinux EXPORT_SYMBOL
++0xcce40c42 put_io_context vmlinux EXPORT_SYMBOL
++0x5baf344d blk_queue_io_min vmlinux EXPORT_SYMBOL
++0xf9fbdc25 nobh_truncate_page vmlinux EXPORT_SYMBOL
++0xc9b8c308 __kfifo_dma_out_prepare vmlinux EXPORT_SYMBOL
++0x045072cd nf_ct_port_nla_policy net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xdfaecb3e ethtool_op_set_tx_hw_csum vmlinux EXPORT_SYMBOL
++0x5412c7c7 up vmlinux EXPORT_SYMBOL
++0x23f5e02a rpc_call_start vmlinux EXPORT_SYMBOL_GPL
++0x8eed1f0d icmp_send vmlinux EXPORT_SYMBOL
++0x1ed928f6 nfs4_set_ds_client vmlinux EXPORT_SYMBOL_GPL
++0x98d5de4f path_get vmlinux EXPORT_SYMBOL
++0x07077c7d iov_iter_copy_from_user_atomic vmlinux EXPORT_SYMBOL
++0x93a2cb47 reserve_pmc_hardware vmlinux EXPORT_SYMBOL_GPL
++0xa726ec8b xfrm_state_update vmlinux EXPORT_SYMBOL
++0x8a74500b usb_deregister_dev vmlinux EXPORT_SYMBOL_GPL
++0x3e2e9995 usb_hcd_is_primary_hcd vmlinux EXPORT_SYMBOL_GPL
++0x9f7d9edf crypto_grab_aead vmlinux EXPORT_SYMBOL_GPL
++0x9c57851d hrtimer_start vmlinux EXPORT_SYMBOL_GPL
++0x0a43ebfc get_pid_task vmlinux EXPORT_SYMBOL_GPL
++0x6c702af7 sysctl_udp_rmem_min vmlinux EXPORT_SYMBOL
++0x6f4d5b8b dev_open vmlinux EXPORT_SYMBOL
++0x25ae2be1 lock_sock_fast vmlinux EXPORT_SYMBOL
++0x65a76805 ilookup vmlinux EXPORT_SYMBOL
++0x4302d0eb free_pages vmlinux EXPORT_SYMBOL
++0xbfc177bc iowrite32_rep vmlinux EXPORT_SYMBOL
++0x8cc79cab iowrite16_rep vmlinux EXPORT_SYMBOL
++0x4e7df11b irq_create_of_mapping vmlinux EXPORT_SYMBOL_GPL
++0x4b48ebf0 of_irq_map_pci vmlinux EXPORT_SYMBOL_GPL
++0x6e999abc mdiobus_free vmlinux EXPORT_SYMBOL
++0x8d610fe8 generic_file_fsync vmlinux EXPORT_SYMBOL
++0x96b22cab unlock_new_inode vmlinux EXPORT_SYMBOL
++0x3f3633b3 __f_setown vmlinux EXPORT_SYMBOL
++0xf82f16b3 execute_in_process_context vmlinux EXPORT_SYMBOL_GPL
++0x11f3795f xt_find_table_lock vmlinux EXPORT_SYMBOL_GPL
++0x62737e1d sock_unregister vmlinux EXPORT_SYMBOL
++0x760a3bf8 kset_register vmlinux EXPORT_SYMBOL
++0xf2e55f98 fput vmlinux EXPORT_SYMBOL
++0x6cf0d67d qe_get_num_of_snums vmlinux EXPORT_SYMBOL
++0x6b3ec69d platform_device_alloc vmlinux EXPORT_SYMBOL_GPL
++0x60da3cf0 posix_timer_event vmlinux EXPORT_SYMBOL_GPL
++0x52e15131 ip6_frag_init vmlinux EXPORT_SYMBOL
++0x234bde50 journal_set_features vmlinux EXPORT_SYMBOL
++0x4cd38ab6 __fsnotify_parent vmlinux EXPORT_SYMBOL_GPL
++0xb78c61e8 param_ops_bool vmlinux EXPORT_SYMBOL
++0xa4274b10 usb_ep0_reinit vmlinux EXPORT_SYMBOL_GPL
++0x8b92c65b add_disk vmlinux EXPORT_SYMBOL
++0x3e1dd4ab xt_rateest_put net/netfilter/xt_RATEEST EXPORT_SYMBOL_GPL
++0xe23deb2d inet_shutdown vmlinux EXPORT_SYMBOL
++0x33ee9189 posix_lock_file_wait vmlinux EXPORT_SYMBOL
++0xc079de49 inet_csk_clone vmlinux EXPORT_SYMBOL_GPL
++0x5dc54a6c xt_unregister_table vmlinux EXPORT_SYMBOL_GPL
++0x2c5b1d98 uart_remove_one_port vmlinux EXPORT_SYMBOL
++0x4e830a3e strnicmp vmlinux EXPORT_SYMBOL
++0x4ef107d9 vmalloc_to_page vmlinux EXPORT_SYMBOL
++0x00a15cc7 usb_get_hcd vmlinux EXPORT_SYMBOL_GPL
++0x9b5913f9 blk_update_request vmlinux EXPORT_SYMBOL_GPL
++0x45c43667 journal_start_commit vmlinux EXPORT_SYMBOL
++0x235e90f3 __wake_up_bit vmlinux EXPORT_SYMBOL
++0x71504b18 xdr_encode_array2 vmlinux EXPORT_SYMBOL_GPL
++0x661a2f0b sock_release vmlinux EXPORT_SYMBOL
++0x56039b1c usb_hcd_giveback_urb vmlinux EXPORT_SYMBOL_GPL
++0x59423726 user_instantiate vmlinux EXPORT_SYMBOL_GPL
++0x75994700 add_wait_queue_exclusive vmlinux EXPORT_SYMBOL
++0xdc9b0085 nf_nat_icmp_reply_translation net/ipv4/netfilter/nf_nat EXPORT_SYMBOL_GPL
++0x34908c14 print_hex_dump_bytes vmlinux EXPORT_SYMBOL
++0x4a37f460 nlmclnt_proc vmlinux EXPORT_SYMBOL_GPL
++0x62118f48 d_add_ci vmlinux EXPORT_SYMBOL
++0xb5020657 phys_mem_access_prot vmlinux EXPORT_SYMBOL
++0x5e6947f7 unregister_dcbevent_notifier vmlinux EXPORT_SYMBOL
++0x017543f0 net_ipv6_ctl_path vmlinux EXPORT_SYMBOL_GPL
++0xa9f3f261 net_ipv4_ctl_path vmlinux EXPORT_SYMBOL_GPL
++0x5243725c netdev_set_master vmlinux EXPORT_SYMBOL
++0x82939f08 __skb_checksum_complete_head vmlinux EXPORT_SYMBOL
++0xe053341e swiotlb_map_sg vmlinux EXPORT_SYMBOL
++0x7c9ac32e __percpu_counter_sum vmlinux EXPORT_SYMBOL
++0xb770be3e __percpu_counter_add vmlinux EXPORT_SYMBOL
++0x9d9c9597 idr_init vmlinux EXPORT_SYMBOL
++0xeaf16558 ida_init vmlinux EXPORT_SYMBOL
++0x9a19604d mpage_readpage vmlinux EXPORT_SYMBOL
++0x70bc17d7 inode_wait vmlinux EXPORT_SYMBOL
++0xd6ee688f vmalloc vmlinux EXPORT_SYMBOL
++0xf31b3fd1 workqueue_set_max_active vmlinux EXPORT_SYMBOL_GPL
++0xe10c1552 tty_port_raise_dtr_rts vmlinux EXPORT_SYMBOL
++0xb32bff81 pci_request_region vmlinux EXPORT_SYMBOL
++0xfa83da2c blk_queue_io_opt vmlinux EXPORT_SYMBOL
++0xd4c14632 system_unbound_wq vmlinux EXPORT_SYMBOL_GPL
++0x576da704 cpm_muram_dma vmlinux EXPORT_SYMBOL
++0xe7420df4 scsi_adjust_queue_depth vmlinux EXPORT_SYMBOL
++0xeae958fa mb_cache_entry_find_first vmlinux EXPORT_SYMBOL
++0x10e22972 gss_mech_get_by_name vmlinux EXPORT_SYMBOL_GPL
++0xc8910e47 tcp_unregister_congestion_control vmlinux EXPORT_SYMBOL_GPL
++0x28811101 bio_split vmlinux EXPORT_SYMBOL
++0x02456663 lock_rename vmlinux EXPORT_SYMBOL
++0x1ab0d653 class_destroy vmlinux EXPORT_SYMBOL_GPL
++0x584637d7 pci_pme_active vmlinux EXPORT_SYMBOL
++0x864fd4d7 gpiochip_remove vmlinux EXPORT_SYMBOL_GPL
++0xae93b4d8 __locks_copy_lock vmlinux EXPORT_SYMBOL
++0x83df0d38 mutex_lock_killable vmlinux EXPORT_SYMBOL
++0xa17874dd nf_ct_remove_userspace_expectations net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xcc9846dc xdr_inline_decode vmlinux EXPORT_SYMBOL_GPL
++0x070f6230 tcp_check_req vmlinux EXPORT_SYMBOL
++0x4fc41dd7 netlink_unicast vmlinux EXPORT_SYMBOL
++0x6c03f58c neigh_sysctl_register vmlinux EXPORT_SYMBOL
++0x534f54dd usb_serial_generic_read_bulk_callback vmlinux EXPORT_SYMBOL_GPL
++0xdcb0349b sys_close vmlinux EXPORT_SYMBOL
++0x3f2c31ce kill_pgrp vmlinux EXPORT_SYMBOL
++0x512c741a ppc_md vmlinux EXPORT_SYMBOL
++0x09959de7 fat_build_inode vmlinux EXPORT_SYMBOL_GPL
++0xd34ed65a seq_read vmlinux EXPORT_SYMBOL
++0x7d19ed18 is_bad_inode vmlinux EXPORT_SYMBOL
++0xf612809a param_get_int vmlinux EXPORT_SYMBOL
++0x915e1208 tb_ticks_per_usec vmlinux EXPORT_SYMBOL
++0xeb903aa6 start_tty vmlinux EXPORT_SYMBOL
++0x7ffc8718 gpio_set_debounce vmlinux EXPORT_SYMBOL_GPL
++0x2b296823 shash_ahash_finup vmlinux EXPORT_SYMBOL_GPL
++0x6544cafe user_update vmlinux EXPORT_SYMBOL_GPL
++0xb454572a irqd_to_hwirq vmlinux EXPORT_SYMBOL_GPL
++0x4ea0d14b nf_ct_get_tuplepr net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x095a5e59 skb_free_datagram_locked vmlinux EXPORT_SYMBOL
++0x76fc0f60 kernel_sock_shutdown vmlinux EXPORT_SYMBOL
++0xa5b5f374 notify_change vmlinux EXPORT_SYMBOL
++0xae5c1715 follow_up vmlinux EXPORT_SYMBOL
++0x0b7086d9 param_get_short vmlinux EXPORT_SYMBOL
++0x944b9776 nf_log_bind_pf vmlinux EXPORT_SYMBOL
++0xe2b8b326 skb_copy_and_csum_datagram_iovec vmlinux EXPORT_SYMBOL
++0x304d21f5 sock_no_ioctl vmlinux EXPORT_SYMBOL
++0x2c738b3f get_user_pages_fast vmlinux EXPORT_SYMBOL_GPL
++0x644e6c65 nf_conntrack_find_get net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x2a873ac0 scsi_remove_device vmlinux EXPORT_SYMBOL
++0x738da129 simple_empty vmlinux EXPORT_SYMBOL
++0xe6e2bc75 shmem_read_mapping_page_gfp vmlinux EXPORT_SYMBOL_GPL
++0x8c3682d4 xfrm_cfg_mutex vmlinux EXPORT_SYMBOL
++0x096e161a __sk_mem_schedule vmlinux EXPORT_SYMBOL
++0xab9efe2e __hid_register_driver vmlinux EXPORT_SYMBOL_GPL
++0xc94631af hid_disconnect vmlinux EXPORT_SYMBOL_GPL
++0x70cf032f usb_hcd_irq vmlinux EXPORT_SYMBOL_GPL
++0x16edea5d __pci_register_driver vmlinux EXPORT_SYMBOL
++0xcde172ac radix_tree_gang_lookup_tag_slot vmlinux EXPORT_SYMBOL
++0xedb6385a blk_queue_merge_bvec vmlinux EXPORT_SYMBOL
++0x920fe930 journal_lock_updates vmlinux EXPORT_SYMBOL
++0x10b39a9d mnt_want_write_file vmlinux EXPORT_SYMBOL_GPL
++0xec1efa4e ip_ct_attach vmlinux EXPORT_SYMBOL
++0xabe640fc dev_set_mtu vmlinux EXPORT_SYMBOL
++0x82ae4fe5 crypto_unregister_template vmlinux EXPORT_SYMBOL_GPL
++0xcddd85e0 bd_link_disk_holder vmlinux EXPORT_SYMBOL_GPL
++0x2919b156 xdr_decode_string_inplace vmlinux EXPORT_SYMBOL_GPL
++0x565b6892 uuid_le_gen vmlinux EXPORT_SYMBOL_GPL
++0xca988dd7 svc_seq_show vmlinux EXPORT_SYMBOL_GPL
++0x52078d48 scsi_free_host_dev vmlinux EXPORT_SYMBOL
++0xd1010d6c driver_register vmlinux EXPORT_SYMBOL_GPL
++0x346c4ded rwsem_down_write_failed vmlinux EXPORT_SYMBOL
++0xc630666e should_remove_suid vmlinux EXPORT_SYMBOL
++0xe9e4c8f7 input_ff_create vmlinux EXPORT_SYMBOL_GPL
++0x103497cf device_destroy vmlinux EXPORT_SYMBOL_GPL
++0x8fae9b4b find_lock_page vmlinux EXPORT_SYMBOL
++0x022d3702 srcu_notifier_chain_unregister vmlinux EXPORT_SYMBOL_GPL
++0x917e424e local_flush_tlb_mm vmlinux EXPORT_SYMBOL
++0x1219dd23 unregister_pernet_device vmlinux EXPORT_SYMBOL_GPL
++0x5fd09748 input_ff_destroy vmlinux EXPORT_SYMBOL_GPL
++0x1b46e897 platform_get_irq_byname vmlinux EXPORT_SYMBOL_GPL
++0x48404b9a remove_wait_queue vmlinux EXPORT_SYMBOL
++0x0f59f197 param_array_ops vmlinux EXPORT_SYMBOL
++0xfe88da83 napi_get_frags vmlinux EXPORT_SYMBOL
++0x21daf6a9 sk_stream_write_space vmlinux EXPORT_SYMBOL
++0x52af66d4 scsi_verify_blk_ioctl vmlinux EXPORT_SYMBOL
++0x446ffab6 sysfs_notify_dirent vmlinux EXPORT_SYMBOL_GPL
++0x13bf0f2d ipv6_dup_options vmlinux EXPORT_SYMBOL_GPL
++0x341c8ed1 phy_register_fixup_for_id vmlinux EXPORT_SYMBOL
++0x59021bf3 add_mtd_blktrans_dev vmlinux EXPORT_SYMBOL_GPL
++0x40344dfc mmc_do_release_host vmlinux EXPORT_SYMBOL
++0x52c1fde9 zap_vma_ptes vmlinux EXPORT_SYMBOL_GPL
++0xa22bc9de rpc_init_priority_wait_queue vmlinux EXPORT_SYMBOL_GPL
++0x0e889016 xfrm_policy_bysel_ctx vmlinux EXPORT_SYMBOL
++0x35d4ae0a tcp_sendmsg vmlinux EXPORT_SYMBOL
++0xfd5866dc i2c_smbus_write_word_data vmlinux EXPORT_SYMBOL
++0x7e275ea8 scsi_complete_async_scans vmlinux EXPORT_SYMBOL_GPL
++0x3bc40f39 elv_rb_del vmlinux EXPORT_SYMBOL
++0x20223395 elv_rb_add vmlinux EXPORT_SYMBOL
++0x2115a784 init_user_ns vmlinux EXPORT_SYMBOL_GPL
++0xa5b00659 ppc_proc_freq vmlinux EXPORT_SYMBOL_GPL
++0x4a4a77e3 netif_skb_features vmlinux EXPORT_SYMBOL
++0xde0a03d6 sock_map_fd vmlinux EXPORT_SYMBOL
++0x00632780 work_busy vmlinux EXPORT_SYMBOL_GPL
++0xc368849f nvram_sync vmlinux EXPORT_SYMBOL
++0x06c5142a __sk_mem_reclaim vmlinux EXPORT_SYMBOL
++0x4be38e61 pcim_pin_device vmlinux EXPORT_SYMBOL
++0xc45755de find_next_zero_bit_le vmlinux EXPORT_SYMBOL
++0x04acf587 d_prune_aliases vmlinux EXPORT_SYMBOL
++0x12a38747 usleep_range vmlinux EXPORT_SYMBOL
++0x11e746e0 flush_icache_user_range vmlinux EXPORT_SYMBOL
++0x2691412e boot_cpuid_phys vmlinux EXPORT_SYMBOL_GPL
++0xa43b9539 memcpy_fromiovecend vmlinux EXPORT_SYMBOL
++0x86e2446c blk_make_request vmlinux EXPORT_SYMBOL
++0xd75c1a07 __pagevec_release vmlinux EXPORT_SYMBOL
++0x51b65a26 rtc_lock vmlinux EXPORT_SYMBOL_GPL
++0xdebf6baa hid_unregister_driver vmlinux EXPORT_SYMBOL_GPL
++0x62062d4b pcie_set_readrq vmlinux EXPORT_SYMBOL
++0xa73e3fb4 pcie_bus_configure_settings vmlinux EXPORT_SYMBOL_GPL
++0x0bf2c9fd nla_reserve_nohdr vmlinux EXPORT_SYMBOL
++0x6d16edba ilookup5 vmlinux EXPORT_SYMBOL
++0x1650bf27 rcutorture_record_progress vmlinux EXPORT_SYMBOL_GPL
++0xcd0529c7 _raw_spin_lock_irq vmlinux EXPORT_SYMBOL
++0x38f962da prepare_creds vmlinux EXPORT_SYMBOL
++0x44399123 mutex_unlock vmlinux EXPORT_SYMBOL
++0xdf8a2c89 genl_register_family_with_ops vmlinux EXPORT_SYMBOL
++0x27ad46ae dev_addr_flush vmlinux EXPORT_SYMBOL
++0x8acf07d0 pci_block_user_cfg_access vmlinux EXPORT_SYMBOL_GPL
++0x83a476ce bitmap_scnlistprintf vmlinux EXPORT_SYMBOL
++0xaee9c392 journal_release_buffer vmlinux EXPORT_SYMBOL
++0xce86792d sunrpc_cache_pipe_upcall vmlinux EXPORT_SYMBOL_GPL
++0x08cf1a7f blkdev_get_by_dev vmlinux EXPORT_SYMBOL
++0xd89da37f movable_zone vmlinux EXPORT_SYMBOL
++0xd87601cc ring_buffer_unlock_commit vmlinux EXPORT_SYMBOL_GPL
++0xd69b30e0 atomic64_add_unless vmlinux EXPORT_SYMBOL
++0xb792aa40 simple_fill_super vmlinux EXPORT_SYMBOL
++0xd7780596 have_submounts vmlinux EXPORT_SYMBOL
++0x07cc4a5d printk_timed_ratelimit vmlinux EXPORT_SYMBOL
++0x0a51ae5b virq_to_hw vmlinux EXPORT_SYMBOL_GPL
++0xeb62ec54 sock_queue_err_skb vmlinux EXPORT_SYMBOL
++0xe6ebc016 key_create_or_update vmlinux EXPORT_SYMBOL
++0x1f8db7f9 ring_buffer_overrun_cpu vmlinux EXPORT_SYMBOL_GPL
++0x0faef0ed __tasklet_schedule vmlinux EXPORT_SYMBOL
++0xfded48ed enable_kernel_fp vmlinux EXPORT_SYMBOL
++0x7b890c7b xprt_adjust_cwnd vmlinux EXPORT_SYMBOL_GPL
++0xf4f14de6 rtnl_trylock vmlinux EXPORT_SYMBOL
++0x1b852c21 dev_load vmlinux EXPORT_SYMBOL
++0xac0ba8c1 blk_iopoll_disable vmlinux EXPORT_SYMBOL
++0x5424df82 debugfs_create_u16 vmlinux EXPORT_SYMBOL_GPL
++0x4bbd1ffa bio_add_page vmlinux EXPORT_SYMBOL
++0x74193242 init_pid_ns vmlinux EXPORT_SYMBOL_GPL
++0x7ca341af kernel_thread vmlinux EXPORT_SYMBOL
++0x70aabf3e ipt_unregister_table net/ipv4/netfilter/ip_tables EXPORT_SYMBOL
++0x159abb63 usb_unlink_anchored_urbs vmlinux EXPORT_SYMBOL_GPL
++0x77ecac9f zlib_inflateEnd vmlinux EXPORT_SYMBOL
++0xa336c35b contig_page_data vmlinux EXPORT_SYMBOL
++0xcaaaccd0 inet_frag_evictor vmlinux EXPORT_SYMBOL
++0x68e0937e xt_unregister_target vmlinux EXPORT_SYMBOL
++0xb4fac2f9 pci_bus_add_device vmlinux EXPORT_SYMBOL_GPL
++0x23679939 __iowrite32_copy vmlinux EXPORT_SYMBOL_GPL
++0x11c5a183 nf_conntrack_unregister_notifier net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x324d7c16 xdr_enter_page vmlinux EXPORT_SYMBOL_GPL
++0x2fff2281 fib_rules_register vmlinux EXPORT_SYMBOL_GPL
++0x612390ad netpoll_set_trap vmlinux EXPORT_SYMBOL
++0xfaf98462 bitrev32 vmlinux EXPORT_SYMBOL
++0xb20a3754 simple_transaction_read vmlinux EXPORT_SYMBOL
++0x8a99a016 mempool_free_slab vmlinux EXPORT_SYMBOL
++0xe384a102 usb_speed_string vmlinux EXPORT_SYMBOL_GPL
++0x27ee902c generic_setxattr vmlinux EXPORT_SYMBOL
++0x00c37822 generic_getxattr vmlinux EXPORT_SYMBOL
++0x6e46a481 dma_mmap_coherent vmlinux EXPORT_SYMBOL_GPL
++0x3d7855c9 gss_mech_register vmlinux EXPORT_SYMBOL_GPL
++0x44a12e1b mpage_readpages vmlinux EXPORT_SYMBOL
++0x01a4494d i2c_unlock_adapter vmlinux EXPORT_SYMBOL_GPL
++0x0960ffb8 pci_request_regions vmlinux EXPORT_SYMBOL
++0x6b807a5f gpio_sysfs_set_active_low vmlinux EXPORT_SYMBOL_GPL
++0x4df119fa __bitmap_parse vmlinux EXPORT_SYMBOL
++0x6bd74d1a __wait_on_buffer vmlinux EXPORT_SYMBOL
++0xe1d61c3a cancel_delayed_work_sync vmlinux EXPORT_SYMBOL
++0xf870a8ab sock_create vmlinux EXPORT_SYMBOL
++0x4315bd81 usb_serial_handle_sysrq_char vmlinux EXPORT_SYMBOL_GPL
++0xadbc1c68 class_dev_iter_next vmlinux EXPORT_SYMBOL_GPL
++0x9dd28e76 debugfs_create_x32 vmlinux EXPORT_SYMBOL_GPL
++0xae6f72ac bprm_change_interp vmlinux EXPORT_SYMBOL
++0x673b3584 kill_litter_super vmlinux EXPORT_SYMBOL
++0x5133c2b5 inet_proto_csum_replace4 vmlinux EXPORT_SYMBOL
++0xadf3fc4c neigh_direct_output vmlinux EXPORT_SYMBOL
++0x0c8395fa usb_free_urb vmlinux EXPORT_SYMBOL_GPL
++0x7aee148f tty_prepare_flip_string_flags vmlinux EXPORT_SYMBOL_GPL
++0x119c901d tty_prepare_flip_string vmlinux EXPORT_SYMBOL_GPL
++0xf1216c75 prandom32 vmlinux EXPORT_SYMBOL
++0x55ba3776 blk_rq_check_limits vmlinux EXPORT_SYMBOL_GPL
++0x75bda77a seq_hlist_next vmlinux EXPORT_SYMBOL
++0x9fd078d4 account_page_dirtied vmlinux EXPORT_SYMBOL
++0x27d7e97e __lock_page_killable vmlinux EXPORT_SYMBOL_GPL
++0x622ef684 fib_rules_unregister vmlinux EXPORT_SYMBOL_GPL
++0x371d2b7d skb_copy_bits vmlinux EXPORT_SYMBOL
++0x189868d7 get_random_bytes_arch vmlinux EXPORT_SYMBOL
++0x6e1d6881 pcim_iomap vmlinux EXPORT_SYMBOL
++0x9b339c60 __blk_end_request_all vmlinux EXPORT_SYMBOL
++0xca601c92 crypto_register_ahash vmlinux EXPORT_SYMBOL_GPL
++0x8453215f sysfs_remove_link vmlinux EXPORT_SYMBOL_GPL
++0x8924eb1e rcu_force_quiescent_state vmlinux EXPORT_SYMBOL_GPL
++0x2827efe8 tcp_make_synack vmlinux EXPORT_SYMBOL
++0xf4979615 mii_check_gmii_support vmlinux EXPORT_SYMBOL
++0xa0d1a668 sysdev_class_create_file vmlinux EXPORT_SYMBOL_GPL
++0xc4fe793b find_get_page vmlinux EXPORT_SYMBOL
++0xae1a6d66 hrtimer_forward vmlinux EXPORT_SYMBOL_GPL
++0xf322a206 bit_waitqueue vmlinux EXPORT_SYMBOL
++0xefc93e71 threads_core_mask vmlinux EXPORT_SYMBOL_GPL
++0xae652611 sock_common_recvmsg vmlinux EXPORT_SYMBOL
++0x6a555f7c drop_file_write_access vmlinux EXPORT_SYMBOL_GPL
++0x966dd23b inet_csk_addr2sockaddr vmlinux EXPORT_SYMBOL_GPL
++0xeda0d76e gen_estimator_active vmlinux EXPORT_SYMBOL
++0x794ed58e get_driver vmlinux EXPORT_SYMBOL_GPL
++0x8251bcc3 bitmap_release_region vmlinux EXPORT_SYMBOL
++0x7054a3e4 request_dma vmlinux EXPORT_SYMBOL
++0x84f47571 ip_mc_inc_group vmlinux EXPORT_SYMBOL
++0x71621fe0 tcp_orphan_count vmlinux EXPORT_SYMBOL_GPL
++0x5f86d84e request_key_with_auxdata vmlinux EXPORT_SYMBOL
++0xaf2518eb fat_attach vmlinux EXPORT_SYMBOL_GPL
++0x22d8e440 sysfs_remove_bin_file vmlinux EXPORT_SYMBOL_GPL
++0xa53e8fbc kick_iocb vmlinux EXPORT_SYMBOL
++0xbc070ddd hid_dump_device vmlinux EXPORT_SYMBOL_GPL
++0xb81960ca snprintf vmlinux EXPORT_SYMBOL
++0x6b5064c6 get_io_context vmlinux EXPORT_SYMBOL
++0x80b3e715 proc_mkdir_mode vmlinux EXPORT_SYMBOL
++0xf57b6671 tag_pages_for_writeback vmlinux EXPORT_SYMBOL
++0x092d50a4 rpcauth_destroy_credcache vmlinux EXPORT_SYMBOL_GPL
++0x22586218 devm_kzalloc vmlinux EXPORT_SYMBOL_GPL
++0x97a8cbdc swiotlb_dma_supported vmlinux EXPORT_SYMBOL
++0x2296c00d crypto_attr_u32 vmlinux EXPORT_SYMBOL_GPL
++0x77dcb28d __bread vmlinux EXPORT_SYMBOL
++0xbba159e0 files_lglock_local_unlock vmlinux EXPORT_SYMBOL
++0xd640e8b8 follow_pfn vmlinux EXPORT_SYMBOL
++0xaa764215 hrtimer_init vmlinux EXPORT_SYMBOL_GPL
++0x954488a4 syncookie_secret vmlinux EXPORT_SYMBOL
++0x9ceb163c memcpy_toiovec vmlinux EXPORT_SYMBOL
++0x74b5d898 usb_disable_xhci_ports vmlinux EXPORT_SYMBOL_GPL
++0x1b6314fd in_aton vmlinux EXPORT_SYMBOL
++0x8bf80102 neigh_resolve_output vmlinux EXPORT_SYMBOL
++0xd6677342 journal_init_dev vmlinux EXPORT_SYMBOL
++0x176b3f91 posix_unblock_lock vmlinux EXPORT_SYMBOL
++0x9acd079c __mnt_is_readonly vmlinux EXPORT_SYMBOL_GPL
++0x500dda7f nf_nat_ftp_hook net/netfilter/nf_conntrack_ftp EXPORT_SYMBOL_GPL
++0x6b52164d tcp_close vmlinux EXPORT_SYMBOL
++0x190b6c5c __scm_send vmlinux EXPORT_SYMBOL
++0x227822d5 usb_register_dev vmlinux EXPORT_SYMBOL_GPL
++0x8fb45bb1 scsi_dma_map vmlinux EXPORT_SYMBOL
++0xa07ed110 xz_dec_init vmlinux EXPORT_SYMBOL
++0x3f906124 try_to_free_buffers vmlinux EXPORT_SYMBOL
++0xef120637 wait_iff_congested vmlinux EXPORT_SYMBOL
++0xe7b1acbe __put_cred vmlinux EXPORT_SYMBOL
++0xb15bd8fa tb_ticks_per_sec vmlinux EXPORT_SYMBOL
++0x3cd06035 add_input_randomness vmlinux EXPORT_SYMBOL_GPL
++0x9ed685ee iov_iter_advance vmlinux EXPORT_SYMBOL
++0x757f088f cpm_muram_offset vmlinux EXPORT_SYMBOL
++0x90501868 transfer_to_handler vmlinux EXPORT_SYMBOL
++0xacf5a07d xdr_set_scratch_buffer vmlinux EXPORT_SYMBOL_GPL
++0x0ac28878 scsi_unblock_requests vmlinux EXPORT_SYMBOL
++0xf6d1a555 device_remove_bin_file vmlinux EXPORT_SYMBOL_GPL
++0x980fd9e0 tty_port_free_xmit_buf vmlinux EXPORT_SYMBOL
++0x8c28d738 nf_ct_deliver_cached_events net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xaf5bf6ef nfs_debug vmlinux EXPORT_SYMBOL_GPL
++0x7267db00 hwrng_unregister vmlinux EXPORT_SYMBOL_GPL
++0x94202ff1 crypto_nivaead_type vmlinux EXPORT_SYMBOL_GPL
++0x4f0d0c17 bdi_writeout_inc vmlinux EXPORT_SYMBOL_GPL
++0xdc7776cc xfrm6_rcv_spi vmlinux EXPORT_SYMBOL
++0x27c1e63f usb_amd_find_chipset_info vmlinux EXPORT_SYMBOL_GPL
++0xcf307410 disk_stack_limits vmlinux EXPORT_SYMBOL
++0x75e8f3c3 crypto_register_notifier vmlinux EXPORT_SYMBOL_GPL
++0x57b57ebe jiffies_to_timespec vmlinux EXPORT_SYMBOL
++0x5f4e77a9 pskb_put vmlinux EXPORT_SYMBOL_GPL
++0xfa6583df i2c_master_send vmlinux EXPORT_SYMBOL
++0xcaae18ce device_reprobe vmlinux EXPORT_SYMBOL_GPL
++0x479c3c86 find_next_zero_bit vmlinux EXPORT_SYMBOL
++0x8ee69235 timeval_to_jiffies vmlinux EXPORT_SYMBOL
++0x0840985a dev_kfree_skb_any vmlinux EXPORT_SYMBOL
++0x384455fa journal_abort vmlinux EXPORT_SYMBOL
++0x2d550ef5 seq_open vmlinux EXPORT_SYMBOL
++0x88c8ae9d mnt_drop_write vmlinux EXPORT_SYMBOL_GPL
++0x297d6b80 rpc_uaddr2sockaddr vmlinux EXPORT_SYMBOL_GPL
++0x7e394c4e sysctl_local_reserved_ports vmlinux EXPORT_SYMBOL
++0x1cc4c90f pci_bus_type vmlinux EXPORT_SYMBOL
++0xeaf46b33 pci_enable_bridges vmlinux EXPORT_SYMBOL
++0x8cf4e71e simple_readpage vmlinux EXPORT_SYMBOL
++0x83f092b9 __lock_page vmlinux EXPORT_SYMBOL
++0xb140d14c ring_buffer_read vmlinux EXPORT_SYMBOL_GPL
++0xf499fdb2 rcu_barrier_bh vmlinux EXPORT_SYMBOL_GPL
++0x46b6baff synchronize_srcu_expedited vmlinux EXPORT_SYMBOL_GPL
++0xe98d2676 cpu_remove_dev_attr vmlinux EXPORT_SYMBOL_GPL
++0xfeb79024 tcp_cong_avoid_ai vmlinux EXPORT_SYMBOL_GPL
++0xab6bde28 sysctl_max_syn_backlog vmlinux EXPORT_SYMBOL
++0xca059c46 usb_altnum_to_altsetting vmlinux EXPORT_SYMBOL_GPL
++0x6f497d79 pci_create_slot vmlinux EXPORT_SYMBOL_GPL
++0xa43762aa blk_delay_queue vmlinux EXPORT_SYMBOL
++0xe6a1e7fb follow_down vmlinux EXPORT_SYMBOL
++0xc06502c4 __generic_file_aio_write vmlinux EXPORT_SYMBOL
++0x5aed6e64 filemap_write_and_wait_range vmlinux EXPORT_SYMBOL
++0xf229625e devm_ioremap_prot vmlinux EXPORT_SYMBOL
++0xd85028c2 genphy_read_status vmlinux EXPORT_SYMBOL
++0x97d977b5 tty_unregister_driver vmlinux EXPORT_SYMBOL
++0xc404cbb3 pci_reenable_device vmlinux EXPORT_SYMBOL
++0xc6a0b57b get_write_access vmlinux EXPORT_SYMBOL
++0x7c22ff1f invalidate_mapping_pages vmlinux EXPORT_SYMBOL
++0xc0c17332 pci_enable_rom vmlinux EXPORT_SYMBOL_GPL
++0xf3bf0bce __bitmap_complement vmlinux EXPORT_SYMBOL
++0xe2e8065e memdup_user vmlinux EXPORT_SYMBOL
++0x221623f5 thermal_cooling_device_unregister vmlinux EXPORT_SYMBOL
++0xcca27eeb del_timer vmlinux EXPORT_SYMBOL
++0xeb9aea7d dma_get_required_mask vmlinux EXPORT_SYMBOL_GPL
++0x4dc45be9 nf_log_unbind_pf vmlinux EXPORT_SYMBOL
++0xeaae7eca usb_get_current_frame_number vmlinux EXPORT_SYMBOL_GPL
++0x80fdefab map_destroy vmlinux EXPORT_SYMBOL
++0x3e3944d8 pcie_update_link_speed vmlinux EXPORT_SYMBOL_GPL
++0x5bb906a7 wait_rcu_gp vmlinux EXPORT_SYMBOL_GPL
++0x74046876 nf_ct_expect_find_get net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xf397c836 tcp_v4_send_check vmlinux EXPORT_SYMBOL
++0xbba15e0b dev_close vmlinux EXPORT_SYMBOL
++0x6e22c276 __mark_inode_dirty vmlinux EXPORT_SYMBOL
++0x97c92d4b noop_qdisc vmlinux EXPORT_SYMBOL
++0x1ce622fb sock_alloc_send_skb vmlinux EXPORT_SYMBOL
++0xd9ce8f0c strnlen vmlinux EXPORT_SYMBOL
++0x4953f064 unregister_filesystem vmlinux EXPORT_SYMBOL
++0xd418e1c0 adjust_resource vmlinux EXPORT_SYMBOL
++0xdd91ae2a xfrm_state_insert vmlinux EXPORT_SYMBOL
++0x030d11a8 kmsg_dump_register vmlinux EXPORT_SYMBOL_GPL
++0x4e05fd2a rpc_peeraddr2str vmlinux EXPORT_SYMBOL_GPL
++0x40728a63 xt_find_revision vmlinux EXPORT_SYMBOL_GPL
++0x82e3b54d of_node_get vmlinux EXPORT_SYMBOL
++0x08ad10e2 of_node_put vmlinux EXPORT_SYMBOL
++0x8d18a199 __destroy_inode vmlinux EXPORT_SYMBOL
++0xb18b572e nf_conntrack_l3proto_generic net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x9a1c768a tcp_is_cwnd_limited vmlinux EXPORT_SYMBOL_GPL
++0xdcc97380 pci_bus_add_devices vmlinux EXPORT_SYMBOL
++0xce9b668c blk_rq_unmap_user vmlinux EXPORT_SYMBOL
++0x768f9bc5 crypto_mod_get vmlinux EXPORT_SYMBOL_GPL
++0x0bc477a2 irq_set_irq_type vmlinux EXPORT_SYMBOL
++0xce2840e7 irq_set_irq_wake vmlinux EXPORT_SYMBOL
++0x36efd128 __remove_inode_hash vmlinux EXPORT_SYMBOL
++0xae52c20e __lru_cache_add vmlinux EXPORT_SYMBOL
++0x6128b5fc __printk_ratelimit vmlinux EXPORT_SYMBOL
++0x7db8133c switch_mmu_context vmlinux EXPORT_SYMBOL
++0xb6938e50 xdr_read_pages vmlinux EXPORT_SYMBOL_GPL
++0xad06c17e xdr_encode_pages vmlinux EXPORT_SYMBOL_GPL
++0xcc1f1c3d inet_twdr_hangman vmlinux EXPORT_SYMBOL_GPL
++0xcacd272d atomic64_sub_return vmlinux EXPORT_SYMBOL
++0x5b256543 __blk_end_request_cur vmlinux EXPORT_SYMBOL
++0x5b40de9d __blk_end_request_err vmlinux EXPORT_SYMBOL_GPL
++0xb2682405 utf8_to_utf32 vmlinux EXPORT_SYMBOL
++0x9621849f ring_buffer_event_data vmlinux EXPORT_SYMBOL_GPL
++0xd2423d66 scsi_prep_return vmlinux EXPORT_SYMBOL
++0x2cf5fa92 __bus_register vmlinux EXPORT_SYMBOL_GPL
++0x4fe99583 atomic64_dec_if_positive vmlinux EXPORT_SYMBOL
++0x2c3b9273 crypto_sha1_update vmlinux EXPORT_SYMBOL
++0x2d727890 override_creds vmlinux EXPORT_SYMBOL
++0x131db64a system_long_wq vmlinux EXPORT_SYMBOL_GPL
++0x3ca16d23 kmsg_dump_unregister vmlinux EXPORT_SYMBOL_GPL
++0x606d0b09 secure_tcpv6_sequence_number vmlinux EXPORT_SYMBOL
++0x78381b79 input_register_handle vmlinux EXPORT_SYMBOL
++0x6ca1d1a4 atomic64_read vmlinux EXPORT_SYMBOL
++0x979a2d28 blkdev_issue_zeroout vmlinux EXPORT_SYMBOL
++0x461818bb journal_get_create_access vmlinux EXPORT_SYMBOL
++0xe15b92eb handle_level_irq vmlinux EXPORT_SYMBOL_GPL
++0xd31ccb06 of_machine_is_compatible vmlinux EXPORT_SYMBOL
++0xf971d6e2 sdio_writesb vmlinux EXPORT_SYMBOL_GPL
++0x42b364ef scatterwalk_done vmlinux EXPORT_SYMBOL_GPL
++0x58ffec8b request_key vmlinux EXPORT_SYMBOL
++0x3923bd3b kern_unmount vmlinux EXPORT_SYMBOL
++0xfa9dd504 timecompare_transform vmlinux EXPORT_SYMBOL_GPL
++0xae616697 usb_control_msg vmlinux EXPORT_SYMBOL_GPL
++0x9846a085 mtd_table_mutex vmlinux EXPORT_SYMBOL_GPL
++0x0c8aadeb nla_append vmlinux EXPORT_SYMBOL
++0x351f3c81 pcim_iomap_regions vmlinux EXPORT_SYMBOL
++0xb86e4ab9 random32 vmlinux EXPORT_SYMBOL
++0x51ad88ca skcipher_geniv_free vmlinux EXPORT_SYMBOL_GPL
++0x2c204319 vfs_llseek vmlinux EXPORT_SYMBOL
++0x81d70b6e __irq_set_handler vmlinux EXPORT_SYMBOL_GPL
++0xa8bdd720 dev_set_drvdata vmlinux EXPORT_SYMBOL
++0xdca20876 dev_get_drvdata vmlinux EXPORT_SYMBOL
++0x7ceaf0d5 generic_handle_irq vmlinux EXPORT_SYMBOL_GPL
++0x9ea865cf blocking_notifier_chain_cond_register vmlinux EXPORT_SYMBOL_GPL
++0xb75cd36b __xfrm_state_destroy vmlinux EXPORT_SYMBOL
++0x400bf80a bfifo_qdisc_ops vmlinux EXPORT_SYMBOL
++0x01c4ff56 usb_unpoison_urb vmlinux EXPORT_SYMBOL_GPL
++0x4242db6e tty_port_init vmlinux EXPORT_SYMBOL
++0x74bae351 complete_request_key vmlinux EXPORT_SYMBOL
++0x1f8544b8 panic_timeout vmlinux EXPORT_SYMBOL_GPL
++0xa20ce1b8 net_msg_warn vmlinux EXPORT_SYMBOL
++0x7e7052eb __sock_recv_timestamp vmlinux EXPORT_SYMBOL_GPL
++0x6225637e md5_transform vmlinux EXPORT_SYMBOL
++0xc0d579ef noop_fsync vmlinux EXPORT_SYMBOL
++0x357d2c4a scsi_add_host_with_dma vmlinux EXPORT_SYMBOL
++0x1d119736 devres_remove_group vmlinux EXPORT_SYMBOL_GPL
++0x4f2a0c62 crypto_hash_walk_first vmlinux EXPORT_SYMBOL_GPL
++0x118f01ea putname vmlinux EXPORT_SYMBOL
++0xb74b1b5c inet_sendpage vmlinux EXPORT_SYMBOL
++0x5fa17c73 sk_filter_release_rcu vmlinux EXPORT_SYMBOL
++0x52aa3821 dev_get_by_index_rcu vmlinux EXPORT_SYMBOL
++0x161edd60 dev_set_allmulti vmlinux EXPORT_SYMBOL
++0x556b4614 mmc_can_erase vmlinux EXPORT_SYMBOL
++0x6fdc65c4 i2c_add_adapter vmlinux EXPORT_SYMBOL
++0x8c140a5a input_mt_report_finger_count vmlinux EXPORT_SYMBOL
++0xea10655a __bitmap_intersects vmlinux EXPORT_SYMBOL
++0xf313da4e sha_transform vmlinux EXPORT_SYMBOL
++0x9b6eb137 ksize vmlinux EXPORT_SYMBOL
++0xf747dd44 kstat vmlinux EXPORT_SYMBOL
++0x68748335 pci_stop_bus_device vmlinux EXPORT_SYMBOL_GPL
++0xf2334557 kobject_set_name vmlinux EXPORT_SYMBOL
++0xcf586f6d shmem_truncate_range vmlinux EXPORT_SYMBOL_GPL
++0xa3e7c113 ring_buffer_iter_peek vmlinux EXPORT_SYMBOL_GPL
++0xa5efbf4c async_synchronize_full vmlinux EXPORT_SYMBOL_GPL
++0xc141de33 set_device_ro vmlinux EXPORT_SYMBOL
++0xbb038ce4 perf_unregister_guest_info_callbacks vmlinux EXPORT_SYMBOL_GPL
++0x6c9e8a40 usb_anchor_urb vmlinux EXPORT_SYMBOL_GPL
++0xa553f1ed pci_clear_mwi vmlinux EXPORT_SYMBOL
++0x0b0c5bc2 shash_attr_alg vmlinux EXPORT_SYMBOL_GPL
++0x63eb9355 panic_blink vmlinux EXPORT_SYMBOL
++0x9b349bdd __sync_dirty_buffer vmlinux EXPORT_SYMBOL
++0xcfbb9503 kmap_high vmlinux EXPORT_SYMBOL
++0x6f86e89e cancel_dirty_page vmlinux EXPORT_SYMBOL
++0xf4fc2d6c __ring_buffer_alloc vmlinux EXPORT_SYMBOL_GPL
++0x82072614 tasklet_kill vmlinux EXPORT_SYMBOL
++0xa8de6a48 i2c_use_client vmlinux EXPORT_SYMBOL
++0xdd66b703 scsi_print_command vmlinux EXPORT_SYMBOL
++0xbb1da1d5 pci_try_set_mwi vmlinux EXPORT_SYMBOL
++0xcda0bf50 bio_endio vmlinux EXPORT_SYMBOL
++0x85c7f674 ring_buffer_normalize_time_stamp vmlinux EXPORT_SYMBOL_GPL
++0x438b62ec nf_ct_expect_unregister_notifier net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xc6f3dff4 sk_stop_timer vmlinux EXPORT_SYMBOL
++0x530e0f8a of_platform_bus_probe vmlinux EXPORT_SYMBOL
++0xffdb82bc sg_free_table vmlinux EXPORT_SYMBOL
++0xbac7a6de locks_remove_posix vmlinux EXPORT_SYMBOL
++0xb0b85f47 ring_buffer_iter_reset vmlinux EXPORT_SYMBOL_GPL
++0xbc68ed8a pcie_port_service_unregister vmlinux EXPORT_SYMBOL
++0x5d5b5a16 radix_tree_delete vmlinux EXPORT_SYMBOL
++0x76831f67 tcp_slow_start vmlinux EXPORT_SYMBOL_GPL
++0xdb9628fb proc_net_netfilter vmlinux EXPORT_SYMBOL
++0x503a9a19 dev_activate vmlinux EXPORT_SYMBOL
++0xa6abec58 __pneigh_lookup vmlinux EXPORT_SYMBOL_GPL
++0xac20b868 i2c_add_mux_adapter vmlinux EXPORT_SYMBOL_GPL
++0xe8cfb9b7 devm_ioremap vmlinux EXPORT_SYMBOL
++0x050dd9e3 devm_iounmap vmlinux EXPORT_SYMBOL
++0x5541ea93 on_each_cpu vmlinux EXPORT_SYMBOL
++0x53775014 dma_set_mask vmlinux EXPORT_SYMBOL
++0x12c21380 nla_reserve vmlinux EXPORT_SYMBOL
++0x179f2b81 bioset_create vmlinux EXPORT_SYMBOL
++0x5717b1d8 rtnl_put_cacheinfo vmlinux EXPORT_SYMBOL_GPL
++0xea124bd1 gcd vmlinux EXPORT_SYMBOL_GPL
++0xb954f080 ihold vmlinux EXPORT_SYMBOL
++0x8a6d1314 names_cachep vmlinux EXPORT_SYMBOL
++0x8aaa5d67 invalidate_inode_pages2_range vmlinux EXPORT_SYMBOL_GPL
++0xc8e96dea qword_addhex vmlinux EXPORT_SYMBOL_GPL
++0x78328e4d xfrm_policy_register_afinfo vmlinux EXPORT_SYMBOL
++0x5d63436b pci_unmap_rom vmlinux EXPORT_SYMBOL
++0x118e0f3d key_instantiate_and_link vmlinux EXPORT_SYMBOL
++0xb1aaff79 dentry_path_raw vmlinux EXPORT_SYMBOL
++0x6a28defe xfrm_sad_getinfo vmlinux EXPORT_SYMBOL
++0x0ac2bf08 netif_napi_del vmlinux EXPORT_SYMBOL
++0x8014b6af input_event_from_user vmlinux EXPORT_SYMBOL_GPL
++0x4484a5a4 wait_for_device_probe vmlinux EXPORT_SYMBOL_GPL
++0xd6244170 tty_port_put vmlinux EXPORT_SYMBOL
++0xf8fa9744 crypto_register_alg vmlinux EXPORT_SYMBOL_GPL
++0xf79a16f8 debugfs_rename vmlinux EXPORT_SYMBOL_GPL
++0xe4653d19 single_open vmlinux EXPORT_SYMBOL
++0xc794266c page_follow_link_light vmlinux EXPORT_SYMBOL
++0x4146fc0f xfrm6_find_1stfragopt vmlinux EXPORT_SYMBOL
++0xfef96e23 __scsi_print_command vmlinux EXPORT_SYMBOL
++0xc40d19d3 kthread_stop vmlinux EXPORT_SYMBOL
++0xa7b91a7b lockd_down vmlinux EXPORT_SYMBOL_GPL
++0xd3481bf6 journal_trans_will_send_data_barrier vmlinux EXPORT_SYMBOL
++0x750b2814 xprt_reserve_xprt vmlinux EXPORT_SYMBOL_GPL
++0x090ed695 hid_register_report vmlinux EXPORT_SYMBOL_GPL
++0x1963b26f rtc_set_alarm vmlinux EXPORT_SYMBOL_GPL
++0x3fe72f15 __scsi_get_command vmlinux EXPORT_SYMBOL_GPL
++0x1b97d8ce __scsi_put_command vmlinux EXPORT_SYMBOL
++0xaa4a7797 hex2bin vmlinux EXPORT_SYMBOL
++0x91d266c7 crypto_default_rng vmlinux EXPORT_SYMBOL_GPL
++0x2c103133 inet_csk_listen_start vmlinux EXPORT_SYMBOL_GPL
++0xb91453c1 of_register_spi_devices vmlinux EXPORT_SYMBOL
++0xfcc2a43c utf32_to_utf8 vmlinux EXPORT_SYMBOL
++0x800df1d7 groups_free vmlinux EXPORT_SYMBOL
++0xf611bda0 cleanup_srcu_struct vmlinux EXPORT_SYMBOL_GPL
++0x3980aac1 unregister_reboot_notifier vmlinux EXPORT_SYMBOL
++0x3aa91a68 tcf_destroy_chain vmlinux EXPORT_SYMBOL
++0x255f3a7f sk_clone vmlinux EXPORT_SYMBOL_GPL
++0x3bd2becc tty_perform_flush vmlinux EXPORT_SYMBOL_GPL
++0x447e96b6 pci_request_region_exclusive vmlinux EXPORT_SYMBOL
++0x9cdf0ec5 vfsmount_lock_global_lock_online vmlinux EXPORT_SYMBOL
++0x495c501c debugfs_remove_recursive vmlinux EXPORT_SYMBOL_GPL
++0xfdb6cedc _raw_read_unlock_bh vmlinux EXPORT_SYMBOL
++0x117b494d neigh_parms_alloc vmlinux EXPORT_SYMBOL
++0x19a304ba usb_disabled vmlinux EXPORT_SYMBOL_GPL
++0xf52321e0 atomic64_sub vmlinux EXPORT_SYMBOL
++0x0bb7c01f mount_single vmlinux EXPORT_SYMBOL
++0xef109449 interruptible_sleep_on vmlinux EXPORT_SYMBOL
++0x111d29eb __ip_route_output_key vmlinux EXPORT_SYMBOL_GPL
++0xb9c425de register_syscore_ops vmlinux EXPORT_SYMBOL_GPL
++0x91a5865c blk_queue_invalidate_tags vmlinux EXPORT_SYMBOL
++0xab5d4b6c remove_irq vmlinux EXPORT_SYMBOL_GPL
++0x93a6e0b2 io_schedule vmlinux EXPORT_SYMBOL
++0x61ce005d disk_part_iter_next vmlinux EXPORT_SYMBOL_GPL
++0xb08b4f8a block_write_end vmlinux EXPORT_SYMBOL
++0xaa8e4c8a pid_vnr vmlinux EXPORT_SYMBOL_GPL
++0x56fa71f2 __xfrm_decode_session vmlinux EXPORT_SYMBOL
++0xad5f1b39 nf_net_ipv4_netfilter_sysctl_path vmlinux EXPORT_SYMBOL_GPL
++0x576dc245 tty_port_lower_dtr_rts vmlinux EXPORT_SYMBOL
++0xf803fe39 bitmap_set vmlinux EXPORT_SYMBOL
++0x230e0698 __clocksource_updatefreq_scale vmlinux EXPORT_SYMBOL_GPL
++0x1528ad8f netlink_set_err vmlinux EXPORT_SYMBOL
++0x8e488ec3 alloc_netdev_mqs vmlinux EXPORT_SYMBOL
++0xc71e5323 bus_register_notifier vmlinux EXPORT_SYMBOL_GPL
++0x1d021d32 gpiochip_add vmlinux EXPORT_SYMBOL_GPL
++0x336154ca rcutorture_record_test_transition vmlinux EXPORT_SYMBOL_GPL
++0xf77020ef inet_listen vmlinux EXPORT_SYMBOL
++0x32e49bab register_snap_client vmlinux EXPORT_SYMBOL
++0x9287ab43 __dst_destroy_metrics_generic vmlinux EXPORT_SYMBOL
++0x3281d137 skb_queue_purge vmlinux EXPORT_SYMBOL
++0xcd0b9f77 get_unmapped_area vmlinux EXPORT_SYMBOL
++0xa196356e add_to_page_cache_lru vmlinux EXPORT_SYMBOL_GPL
++0x07b52e38 rtnl_unregister vmlinux EXPORT_SYMBOL_GPL
++0x816a4a8f platform_bus_type vmlinux EXPORT_SYMBOL_GPL
++0x8eb489cc blk_rq_map_user vmlinux EXPORT_SYMBOL
++0x95666f79 generic_pipe_buf_release vmlinux EXPORT_SYMBOL
++0x9b49a62b nf_ct_gre_keymap_add net/netfilter/nf_conntrack_proto_gre EXPORT_SYMBOL_GPL
++0x76486f91 d_find_alias vmlinux EXPORT_SYMBOL
++0x760a0f4f yield vmlinux EXPORT_SYMBOL
++0xdfce92d0 xt_check_target vmlinux EXPORT_SYMBOL_GPL
++0x693bf8ad sdio_claim_irq vmlinux EXPORT_SYMBOL_GPL
++0x6bd2a517 fsstack_copy_attr_all vmlinux EXPORT_SYMBOL_GPL
++0x7d2d68ef __nf_ct_try_assign_helper net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xf3bfc4a0 udp6_lib_lookup vmlinux EXPORT_SYMBOL_GPL
++0xa9ff0067 xfrm_init_replay vmlinux EXPORT_SYMBOL
++0x4cd13364 udp4_lib_lookup vmlinux EXPORT_SYMBOL_GPL
++0xaee50a42 genl_unregister_ops vmlinux EXPORT_SYMBOL
++0x9e2000a7 memcpy_toiovecend vmlinux EXPORT_SYMBOL
++0xcc3ad809 scsi_command_normalize_sense vmlinux EXPORT_SYMBOL
++0x2f19f806 inode_sb_list_add vmlinux EXPORT_SYMBOL_GPL
++0xc0072342 inode_init_always vmlinux EXPORT_SYMBOL
++0x37443f52 d_invalidate vmlinux EXPORT_SYMBOL
++0xa0b04675 vmalloc_32 vmlinux EXPORT_SYMBOL
++0x8a13f155 pid_task vmlinux EXPORT_SYMBOL
++0x33b84f74 copy_page vmlinux EXPORT_SYMBOL
++0x115dd19b seq_print_acct net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x447aabed stp_proto_register vmlinux EXPORT_SYMBOL_GPL
++0x40b9610d input_register_handler vmlinux EXPORT_SYMBOL
++0xc0572d04 textsearch_unregister vmlinux EXPORT_SYMBOL
++0xf54c51a2 dma_pool_free vmlinux EXPORT_SYMBOL
++0xdb274e52 monotonic_to_bootbased vmlinux EXPORT_SYMBOL_GPL
++0x86b4b68f inet6_csk_bind_conflict vmlinux EXPORT_SYMBOL_GPL
++0xa35de80f ipv4_config vmlinux EXPORT_SYMBOL
++0x94ecde24 netif_carrier_on vmlinux EXPORT_SYMBOL
++0x74b8aeab fib_rules_lookup vmlinux EXPORT_SYMBOL_GPL
++0xb0b847ac __bitmap_full vmlinux EXPORT_SYMBOL
++0x4059792f print_hex_dump vmlinux EXPORT_SYMBOL
++0x22f5f5bd ip6_route_output vmlinux EXPORT_SYMBOL
++0x98c1c63d __rta_fill vmlinux EXPORT_SYMBOL
++0x87b20911 __dst_free vmlinux EXPORT_SYMBOL
++0xfe1c56c4 inode_newsize_ok vmlinux EXPORT_SYMBOL
++0x89b3107b isa_mem_base vmlinux EXPORT_SYMBOL
++0xcbb1b165 inet_csk_destroy_sock vmlinux EXPORT_SYMBOL
++0x290bcd04 pci_disable_obff vmlinux EXPORT_SYMBOL
++0x78df6bd7 no_pci_devices vmlinux EXPORT_SYMBOL
++0xc2e00f4e nfs_pageio_reset_read_mds vmlinux EXPORT_SYMBOL_GPL
++0x1e26be3b get_anon_bdev vmlinux EXPORT_SYMBOL
++0x6b29a1fa ring_buffer_event_length vmlinux EXPORT_SYMBOL_GPL
++0x84b183ae strncmp vmlinux EXPORT_SYMBOL
++0x5ee2150e sock_kfree_s vmlinux EXPORT_SYMBOL
++0xaf67115a usb_stor_access_xfer_buf vmlinux EXPORT_SYMBOL_GPL
++0xa34f1ef5 crc32_le vmlinux EXPORT_SYMBOL
++0xf54bd49b lcm vmlinux EXPORT_SYMBOL_GPL
++0x13354608 scatterwalk_map_and_copy vmlinux EXPORT_SYMBOL_GPL
++0xf7dcfb23 empty_aops vmlinux EXPORT_SYMBOL
++0x43b911a1 __task_pid_nr_ns vmlinux EXPORT_SYMBOL
++0xe368f912 ethtool_op_get_link vmlinux EXPORT_SYMBOL
++0xa40a8590 input_event_to_user vmlinux EXPORT_SYMBOL_GPL
++0x657aa70a input_unregister_device vmlinux EXPORT_SYMBOL
++0xbfbebdf2 read_cache_pages vmlinux EXPORT_SYMBOL
++0x4aadeb9a ring_buffer_alloc_read_page vmlinux EXPORT_SYMBOL_GPL
++0x53445f68 nlm_debug vmlinux EXPORT_SYMBOL_GPL
++0x8ac6cdbe ip_generic_getfrag vmlinux EXPORT_SYMBOL
++0x825f0e72 stp_proto_unregister vmlinux EXPORT_SYMBOL_GPL
++0x42671630 call_netdevice_notifiers vmlinux EXPORT_SYMBOL
++0xdc825d6c usb_amd_quirk_pll_disable vmlinux EXPORT_SYMBOL_GPL
++0xc50de15c mii_nway_restart vmlinux EXPORT_SYMBOL
++0x208c9e61 crypto_dequeue_request vmlinux EXPORT_SYMBOL_GPL
++0x33ee71a8 crypto_enqueue_request vmlinux EXPORT_SYMBOL_GPL
++0x3a45b778 fat_add_entries vmlinux EXPORT_SYMBOL_GPL
++0x63709e0c thaw_bdev vmlinux EXPORT_SYMBOL
++0xec38d5b9 irq_create_mapping vmlinux EXPORT_SYMBOL_GPL
++0x64f9ca11 sk_run_filter vmlinux EXPORT_SYMBOL
++0xa1ec4dcb netdev_rx_csum_fault vmlinux EXPORT_SYMBOL
++0x55e74041 of_pci_address_to_resource vmlinux EXPORT_SYMBOL_GPL
++0xa7355e76 devres_release_group vmlinux EXPORT_SYMBOL_GPL
++0xa2d161c9 ipt_register_table net/ipv4/netfilter/ip_tables EXPORT_SYMBOL
++0x33274026 xdr_decode_array2 vmlinux EXPORT_SYMBOL_GPL
++0x7b594a76 ipv6_push_nfrag_opts vmlinux EXPORT_SYMBOL
++0x7a73b3d5 neigh_sysctl_unregister vmlinux EXPORT_SYMBOL
++0x7d1d23b5 blk_abort_request vmlinux EXPORT_SYMBOL_GPL
++0x7cefa3c8 __scm_destroy vmlinux EXPORT_SYMBOL
++0x88ebb649 sdio_writeb_readb vmlinux EXPORT_SYMBOL_GPL
++0x8b82c4cf d_move vmlinux EXPORT_SYMBOL
++0x5091b823 ring_buffer_read_start vmlinux EXPORT_SYMBOL_GPL
++0x77b851c4 cacheable_memzero vmlinux EXPORT_SYMBOL
++0x8d80529b virq_is_host vmlinux EXPORT_SYMBOL_GPL
++0x450872a4 ipcomp_destroy net/xfrm/xfrm_ipcomp EXPORT_SYMBOL_GPL
++0xd0035e43 dev_addr_del_multiple vmlinux EXPORT_SYMBOL
++0x5f0c41ea request_key_async vmlinux EXPORT_SYMBOL
++0x639ad9ba touch_atime vmlinux EXPORT_SYMBOL
++0x733b2383 next_tlbcam_idx vmlinux EXPORT_SYMBOL
++0x61c243fc mod_timer_pending vmlinux EXPORT_SYMBOL
++0x1f6cf216 rtnl_configure_link vmlinux EXPORT_SYMBOL
++0x5f26443b sock_wmalloc vmlinux EXPORT_SYMBOL
++0x1e6d26a8 strstr vmlinux EXPORT_SYMBOL
++0x349cba85 strchr vmlinux EXPORT_SYMBOL
++0xafba9111 qe_immr vmlinux EXPORT_SYMBOL
++0xadabd59e inet_csk_listen_stop vmlinux EXPORT_SYMBOL_GPL
++0x7ba60ec5 usb_serial_generic_resume vmlinux EXPORT_SYMBOL_GPL
++0x0cf5646d usb_wait_anchor_empty_timeout vmlinux EXPORT_SYMBOL_GPL
++0x71f78ce2 cfi_qry_mode_off vmlinux EXPORT_SYMBOL_GPL
++0xf2fca922 uart_parse_options vmlinux EXPORT_SYMBOL_GPL
++0xcfa90d57 kobject_create_and_add vmlinux EXPORT_SYMBOL_GPL
++0x589483d5 setup_new_exec vmlinux EXPORT_SYMBOL
++0xa65972b8 _memcpy_toio vmlinux EXPORT_SYMBOL
++0x109bccfc xfrm_state_lookup_byaddr vmlinux EXPORT_SYMBOL
++0xac888215 pskb_expand_head vmlinux EXPORT_SYMBOL
++0xeabea9a3 of_i2c_register_devices vmlinux EXPORT_SYMBOL
++0x6f9f1dde i2c_release_client vmlinux EXPORT_SYMBOL
++0xdf2478f7 giveup_fpu vmlinux EXPORT_SYMBOL
++0xbff12409 giveup_spe vmlinux EXPORT_SYMBOL
++0xa19aa2a4 rtnl_link_register vmlinux EXPORT_SYMBOL_GPL
++0xc53bb9d1 lock_may_write vmlinux EXPORT_SYMBOL
++0x7a461bdf bh_submit_read vmlinux EXPORT_SYMBOL
++0x1bb795cc of_create_pci_dev vmlinux EXPORT_SYMBOL
++0x91f08ce3 xdr_buf_read_netobj vmlinux EXPORT_SYMBOL_GPL
++0xad37c04e eth_change_mtu vmlinux EXPORT_SYMBOL
++0x78bb1ee1 eth_header_parse vmlinux EXPORT_SYMBOL
++0x42977ad4 __hw_addr_del_multiple vmlinux EXPORT_SYMBOL
++0x6e586165 bdev_stack_limits vmlinux EXPORT_SYMBOL
++0x1114011d threads_shift vmlinux EXPORT_SYMBOL_GPL
++0x3c9e7dc8 nf_nat_pptp_hook_exp_gre net/netfilter/nf_conntrack_pptp EXPORT_SYMBOL_GPL
++0x3c514b70 nf_conntrack_hash_insert net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xad01e7b9 sock_wake_async vmlinux EXPORT_SYMBOL
++0x506746b6 getrawmonotonic vmlinux EXPORT_SYMBOL
++0xb6599b9a machine_check_exception vmlinux EXPORT_SYMBOL
++0xfd4b9fec of_platform_device_create vmlinux EXPORT_SYMBOL
++0x0e2b0fec fat_free_clusters vmlinux EXPORT_SYMBOL_GPL
++0x7e006219 __set_page_dirty_buffers vmlinux EXPORT_SYMBOL
++0x978f24b1 __wake_up_locked vmlinux EXPORT_SYMBOL_GPL
++0x5994a0d7 sock_prot_inuse_add vmlinux EXPORT_SYMBOL_GPL
++0xbd05294b usb_hcd_platform_shutdown vmlinux EXPORT_SYMBOL_GPL
++0xf9e73082 scnprintf vmlinux EXPORT_SYMBOL
++0x1fb2a93c aead_geniv_exit vmlinux EXPORT_SYMBOL_GPL
++0x0c917640 mod_zone_page_state vmlinux EXPORT_SYMBOL
++0xf4a37928 perf_event_refresh vmlinux EXPORT_SYMBOL_GPL
++0x40f1ad10 tb_ticks_per_jiffy vmlinux EXPORT_SYMBOL
++0xae40342e blk_add_request_payload vmlinux EXPORT_SYMBOL_GPL
++0xf1a62b6f of_i8042_kbd_irq vmlinux EXPORT_SYMBOL_GPL
++0xcd5fcf06 rtnl_link_unregister vmlinux EXPORT_SYMBOL_GPL
++0xe1ad275d copy_strings_kernel vmlinux EXPORT_SYMBOL
++0x751c2917 __wait_on_bit vmlinux EXPORT_SYMBOL
++0x55467ede fsl_upm_find vmlinux EXPORT_SYMBOL
++0x002de09c vfsmount_lock_global_unlock_online vmlinux EXPORT_SYMBOL
++0xc7156d34 hrtimer_get_remaining vmlinux EXPORT_SYMBOL_GPL
++0x3b42483e tcp_enter_memory_pressure vmlinux EXPORT_SYMBOL
++0x1df3dda5 skb_add_rx_frag vmlinux EXPORT_SYMBOL
++0xe9587909 usb_unregister_notify vmlinux EXPORT_SYMBOL_GPL
++0x4982a57f probe_kernel_write vmlinux EXPORT_SYMBOL_GPL
++0x972d7aee arp_create vmlinux EXPORT_SYMBOL
++0xf1e706a7 of_modalias_node vmlinux EXPORT_SYMBOL_GPL
++0xae30905c tty_port_alloc_xmit_buf vmlinux EXPORT_SYMBOL
++0x46d4fb35 no_llseek vmlinux EXPORT_SYMBOL
++0x7da3ce6f rt_mutex_timed_lock vmlinux EXPORT_SYMBOL_GPL
++0xeded8d0e rtc_irq_set_freq vmlinux EXPORT_SYMBOL_GPL
++0xf0fd4e8f rwsem_down_read_failed vmlinux EXPORT_SYMBOL
++0xc606cd3c boot_cpuid vmlinux EXPORT_SYMBOL_GPL
++0xfab35004 generic_show_options vmlinux EXPORT_SYMBOL
++0xbf79c72e pagecache_write_begin vmlinux EXPORT_SYMBOL
++0xe6e1982f register_sysctl_paths vmlinux EXPORT_SYMBOL
++0xc6cbbc89 capable vmlinux EXPORT_SYMBOL
++0x39688afa nf_afinfo vmlinux EXPORT_SYMBOL
++0xa4f7e7fb hid_debug_event vmlinux EXPORT_SYMBOL_GPL
++0x0a0a8628 mmc_can_trim vmlinux EXPORT_SYMBOL
++0x620ed98f input_set_capability vmlinux EXPORT_SYMBOL
++0x4ef5bcf4 perf_swevent_get_recursion_context vmlinux EXPORT_SYMBOL_GPL
++0xc8b57c27 autoremove_wake_function vmlinux EXPORT_SYMBOL
++0x13e5ea13 __wake_up_sync vmlinux EXPORT_SYMBOL_GPL
++0x2e8e2944 irq_find_mapping vmlinux EXPORT_SYMBOL_GPL
++0xb9c06bda nf_ct_port_tuple_to_nlattr net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x7c60d66e getname vmlinux EXPORT_SYMBOL
++0xe7ffe877 pcpu_base_addr vmlinux EXPORT_SYMBOL_GPL
++0xa78649d2 nf_conntrack_helper_register net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x9a11a0fc crypto_attr_alg_name vmlinux EXPORT_SYMBOL_GPL
++0x0d86c5c3 par_io_config_pin vmlinux EXPORT_SYMBOL
++0x1c852e7c xfrm_calg_get_byid vmlinux EXPORT_SYMBOL_GPL
++0x8b26f12b uhci_check_and_reset_hc vmlinux EXPORT_SYMBOL_GPL
++0x05520f5f usb_hc_died vmlinux EXPORT_SYMBOL_GPL
++0xe61a6d2f gpio_unexport vmlinux EXPORT_SYMBOL_GPL
++0xf20dabd8 free_irq vmlinux EXPORT_SYMBOL
++0xa861ab6e __ioremap vmlinux EXPORT_SYMBOL
++0x7976a3fa usb_serial_probe vmlinux EXPORT_SYMBOL_GPL
++0x2b2f2776 deactivate_locked_super vmlinux EXPORT_SYMBOL
++0x432b5ac1 filemap_fdatawait vmlinux EXPORT_SYMBOL
++0x432a0255 rpcauth_register vmlinux EXPORT_SYMBOL_GPL
++0x36ac1b69 xfrm_audit_policy_delete vmlinux EXPORT_SYMBOL_GPL
++0xfb788409 netdev_class_create_file vmlinux EXPORT_SYMBOL
++0x09d44df9 in_lock_functions vmlinux EXPORT_SYMBOL
++0x27e4a550 rpc_wake_up vmlinux EXPORT_SYMBOL_GPL
++0xe67b9f1c netpoll_parse_options vmlinux EXPORT_SYMBOL
++0xe4c4673a netdev_rx_handler_unregister vmlinux EXPORT_SYMBOL_GPL
++0xf3c9e5de skb_copy_datagram_const_iovec vmlinux EXPORT_SYMBOL
++0x1b0d73b7 kernel_getpeername vmlinux EXPORT_SYMBOL
++0xcca50e42 platform_driver_probe vmlinux EXPORT_SYMBOL_GPL
++0x2bb7074d serial8250_do_set_termios vmlinux EXPORT_SYMBOL
++0x436cab8f sysfs_chmod_file vmlinux EXPORT_SYMBOL_GPL
++0x1e69be37 find_module vmlinux EXPORT_SYMBOL_GPL
++0x09b54a84 rt_mutex_lock vmlinux EXPORT_SYMBOL_GPL
++0x28a9171c input_event vmlinux EXPORT_SYMBOL
++0x11f7ed4c hex_to_bin vmlinux EXPORT_SYMBOL
++0xa4338205 simple_pin_fs vmlinux EXPORT_SYMBOL
++0x5635a60a vmalloc_user vmlinux EXPORT_SYMBOL
++0x95fcd41e posix_clock_unregister vmlinux EXPORT_SYMBOL_GPL
++0x31bd442e schedule_delayed_work vmlinux EXPORT_SYMBOL
++0x4d45d89e udp_memory_allocated vmlinux EXPORT_SYMBOL
++0x99dbcc23 tc_classify vmlinux EXPORT_SYMBOL
++0x6b8e3569 sock_no_sendpage vmlinux EXPORT_SYMBOL
++0x6a61f874 to_tm vmlinux EXPORT_SYMBOL
++0x4b4a6de0 get_current_tty vmlinux EXPORT_SYMBOL_GPL
++0x4c1182cb bitmap_scnprintf vmlinux EXPORT_SYMBOL
++0xde6daef6 proc_create_data vmlinux EXPORT_SYMBOL
++0x810b3618 param_ops_string vmlinux EXPORT_SYMBOL
++0xcafc76d2 sunrpc_cache_register_pipefs vmlinux EXPORT_SYMBOL_GPL
++0x4d15f777 kernel_getsockname vmlinux EXPORT_SYMBOL
++0xa5ea73be kernel_sendmsg vmlinux EXPORT_SYMBOL
++0x5f965ae1 uart_register_driver vmlinux EXPORT_SYMBOL
++0xd77a5aa5 __bitmap_and vmlinux EXPORT_SYMBOL
++0xf3012f6c rh_free vmlinux EXPORT_SYMBOL_GPL
++0x38df0067 xfrm_alloc_spi vmlinux EXPORT_SYMBOL
++0xce2e6bf5 netdev_set_bond_master vmlinux EXPORT_SYMBOL
++0xdab749af blk_rq_err_bytes vmlinux EXPORT_SYMBOL_GPL
++0x5390ec7d crypto_blkcipher_type vmlinux EXPORT_SYMBOL_GPL
++0xd5ce0859 crypto_givcipher_type vmlinux EXPORT_SYMBOL_GPL
++0x001425a3 nf_log_packet vmlinux EXPORT_SYMBOL
++0xc9a72270 qdisc_tree_decrease_qlen vmlinux EXPORT_SYMBOL
++0xdd671a8d dev_remove_pack vmlinux EXPORT_SYMBOL
++0x2c256e1f input_scancode_to_scalar vmlinux EXPORT_SYMBOL
++0x647e76d5 rq_flush_dcache_pages vmlinux EXPORT_SYMBOL_GPL
++0xb6a0b482 blkcipher_walk_virt vmlinux EXPORT_SYMBOL_GPL
++0x9607f187 posix_lock_file vmlinux EXPORT_SYMBOL
++0x71a672ef dmam_pool_destroy vmlinux EXPORT_SYMBOL
++0xeb6bb956 set_page_dirty vmlinux EXPORT_SYMBOL
++0xde9360ba totalram_pages vmlinux EXPORT_SYMBOL
++0x6a0a2dcc nf_conntrack_l4proto_udp4 net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x31afdcc9 udp_disconnect vmlinux EXPORT_SYMBOL
++0xc9ef093b dev_uc_unsync vmlinux EXPORT_SYMBOL
++0x92cc73cf dev_mc_unsync vmlinux EXPORT_SYMBOL
++0xde68b34d usb_free_streams vmlinux EXPORT_SYMBOL_GPL
++0x106c8a3c dump_seek vmlinux EXPORT_SYMBOL
++0x67d84b74 mtd_add_partition vmlinux EXPORT_SYMBOL_GPL
++0xd0c663ae bus_get_kset vmlinux EXPORT_SYMBOL_GPL
++0x0874bd6b journal_get_write_access vmlinux EXPORT_SYMBOL
++0x2e4d6a64 __register_chrdev vmlinux EXPORT_SYMBOL
++0xe5919cb1 xdr_encode_opaque vmlinux EXPORT_SYMBOL_GPL
++0x100e6158 rtc_class_close vmlinux EXPORT_SYMBOL_GPL
++0x61c2dac6 kstrtoll_from_user vmlinux EXPORT_SYMBOL
++0x8e010d2c svc_max_payload vmlinux EXPORT_SYMBOL_GPL
++0x4be46578 devres_alloc vmlinux EXPORT_SYMBOL_GPL
++0x2ecee7fb sysdev_unregister vmlinux EXPORT_SYMBOL_GPL
++0xdc14eda7 pci_pci_problems vmlinux EXPORT_SYMBOL
++0x956a91ba gpio_get_value_cansleep vmlinux EXPORT_SYMBOL_GPL
++0x18bff16e blk_queue_stack_limits vmlinux EXPORT_SYMBOL
++0x01e56d33 free_vm_area vmlinux EXPORT_SYMBOL_GPL
++0x748022c5 nf_conntrack_free net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x9317d258 udp_lib_setsockopt vmlinux EXPORT_SYMBOL
++0xfad5b90d udp_lib_getsockopt vmlinux EXPORT_SYMBOL
++0x96898769 sysfs_format_mac vmlinux EXPORT_SYMBOL
++0xddbc1ffe sk_send_sigurg vmlinux EXPORT_SYMBOL
++0x246f019e spi_bus_lock vmlinux EXPORT_SYMBOL_GPL
++0xaa89d28e dev_crit vmlinux EXPORT_SYMBOL
++0x8e45aa4a drop_super vmlinux EXPORT_SYMBOL
++0x27e1a049 printk vmlinux EXPORT_SYMBOL
++0x2f97857d sk_alloc vmlinux EXPORT_SYMBOL
++0xa49390ab bus_unregister_notifier vmlinux EXPORT_SYMBOL_GPL
++0xc48f3373 try_to_release_page vmlinux EXPORT_SYMBOL
++0x7e448a8f synchronize_srcu vmlinux EXPORT_SYMBOL_GPL
++0x9aad6540 klist_iter_init vmlinux EXPORT_SYMBOL_GPL
++0xc3512c1e rpcauth_lookup_credcache vmlinux EXPORT_SYMBOL_GPL
++0x03bab655 platform_driver_register vmlinux EXPORT_SYMBOL_GPL
++0xe381eae4 kobject_add vmlinux EXPORT_SYMBOL
++0xf5a87370 nfs_commitdata_release vmlinux EXPORT_SYMBOL_GPL
++0x10138352 tracing_on vmlinux EXPORT_SYMBOL_GPL
++0x9025d41c xfrm_audit_policy_add vmlinux EXPORT_SYMBOL_GPL
++0x4cedc318 platform_driver_unregister vmlinux EXPORT_SYMBOL_GPL
++0x61634f05 lock_flocks vmlinux EXPORT_SYMBOL_GPL
++0xd19a96e6 queue_kthread_work vmlinux EXPORT_SYMBOL_GPL
++0x756dd160 start_thread vmlinux EXPORT_SYMBOL
++0x219de8a0 br_should_route_hook vmlinux EXPORT_SYMBOL
++0xf6190b08 gnet_stats_copy_queue vmlinux EXPORT_SYMBOL
++0x94ae4c23 of_match_device vmlinux EXPORT_SYMBOL
++0x2bb7992e usb_get_urb vmlinux EXPORT_SYMBOL_GPL
++0x4c715546 pci_scan_single_device vmlinux EXPORT_SYMBOL
++0x12e85778 kstrtol_from_user vmlinux EXPORT_SYMBOL
++0x3aad440e simple_dir_operations vmlinux EXPORT_SYMBOL
++0x6403e338 tcp_memory_pressure vmlinux EXPORT_SYMBOL
++0xb233762c atomic64_set vmlinux EXPORT_SYMBOL
++0xab0e7894 setattr_copy vmlinux EXPORT_SYMBOL
++0xc26c0f33 inet_frags_fini vmlinux EXPORT_SYMBOL
++0xe4cf504e scsi_queue_work vmlinux EXPORT_SYMBOL_GPL
++0x90ef84ba elv_dispatch_sort vmlinux EXPORT_SYMBOL
++0x891a622e elv_add_request vmlinux EXPORT_SYMBOL
++0xf346231f seq_list_start_head vmlinux EXPORT_SYMBOL
++0xa32629f6 dns_query vmlinux EXPORT_SYMBOL
++0x73e659e1 netif_device_attach vmlinux EXPORT_SYMBOL
++0x17de79c5 netif_device_detach vmlinux EXPORT_SYMBOL
++0xe94d82f3 sdhci_pltfm_init vmlinux EXPORT_SYMBOL_GPL
++0x9c247860 device_rename vmlinux EXPORT_SYMBOL_GPL
++0xc88c586d simple_attr_read vmlinux EXPORT_SYMBOL_GPL
++0x7e620c98 relay_flush vmlinux EXPORT_SYMBOL_GPL
++0xc12435e3 rpc_calc_rto vmlinux EXPORT_SYMBOL_GPL
++0x0ffe2bd3 kernel_bind vmlinux EXPORT_SYMBOL
++0xf511e930 dev_notice vmlinux EXPORT_SYMBOL
++0xcc248d26 serial8250_suspend_port vmlinux EXPORT_SYMBOL
++0xcd279169 nla_find vmlinux EXPORT_SYMBOL
++0x3a4dd68a kernel_read vmlinux EXPORT_SYMBOL
++0x8c7b3af2 vfs_read vmlinux EXPORT_SYMBOL
++0xc8add232 ring_buffer_record_disable vmlinux EXPORT_SYMBOL_GPL
++0xf68fe563 __devm_release_region vmlinux EXPORT_SYMBOL
++0xca559706 __inet_hash_nolisten vmlinux EXPORT_SYMBOL_GPL
++0x9fb3dd30 memcpy_fromiovec vmlinux EXPORT_SYMBOL
++0x7e40b8e4 pci_bus_find_capability vmlinux EXPORT_SYMBOL
++0x8a6d8c12 blk_queue_prep_rq vmlinux EXPORT_SYMBOL
++0x262f20a8 local_clock vmlinux EXPORT_SYMBOL_GPL
++0x5b7f8452 vlan_dev_vlan_id vmlinux EXPORT_SYMBOL
++0xce3148ed of_find_matching_node vmlinux EXPORT_SYMBOL
++0xe2457ef0 sysdev_class_register vmlinux EXPORT_SYMBOL_GPL
++0xd6f88a0e journal_unlock_updates vmlinux EXPORT_SYMBOL
++0x457de0d3 sunrpc_cache_unregister_pipefs vmlinux EXPORT_SYMBOL_GPL
++0x7e72637f __class_register vmlinux EXPORT_SYMBOL_GPL
++0xd5e8444a __div64_32 vmlinux EXPORT_SYMBOL
++0xf04ae1ba idr_remove_all vmlinux EXPORT_SYMBOL
++0x3446615d bio_alloc vmlinux EXPORT_SYMBOL
++0x93fca811 __get_free_pages vmlinux EXPORT_SYMBOL
++0xbb189cad disallow_signal vmlinux EXPORT_SYMBOL
++0xd3d2de27 rawv6_mh_filter_register vmlinux EXPORT_SYMBOL
++0xdbcd416e sysctl_ip_nonlocal_bind vmlinux EXPORT_SYMBOL
++0x8fd02ebd usb_free_coherent vmlinux EXPORT_SYMBOL_GPL
++0xa675804c utf8s_to_utf16s vmlinux EXPORT_SYMBOL
++0x31212876 proc_net_fops_create vmlinux EXPORT_SYMBOL_GPL
++0x39e569fd ns_capable vmlinux EXPORT_SYMBOL
++0x979a54c8 rawv6_mh_filter_unregister vmlinux EXPORT_SYMBOL
++0x7fd28838 mmc_fixup_device vmlinux EXPORT_SYMBOL
++0x0ea29024 blk_queue_resize_tags vmlinux EXPORT_SYMBOL
++0x4301f246 nf_ct_l3proto_find_get net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xb391c0ae ipv4_specific vmlinux EXPORT_SYMBOL
++0x3aa08439 proto_unregister vmlinux EXPORT_SYMBOL
++0x70e3ab78 i2c_new_dummy vmlinux EXPORT_SYMBOL_GPL
++0x14f9849f register_mtd_chip_driver vmlinux EXPORT_SYMBOL
++0x9334e2ee __fsnotify_inode_delete vmlinux EXPORT_SYMBOL_GPL
++0xfedbb984 deregister_mtd_parser vmlinux EXPORT_SYMBOL_GPL
++0x6e09073c __any_online_cpu vmlinux EXPORT_SYMBOL
++0xb0d651f5 lookup_instantiate_filp vmlinux EXPORT_SYMBOL_GPL
++0xadf0811d get_baudrate vmlinux EXPORT_SYMBOL
++0x6f7b3dee rtnl_af_register vmlinux EXPORT_SYMBOL_GPL
++0xc6c208cb kunmap_high vmlinux EXPORT_SYMBOL
++0xea8a6c75 param_ops_long vmlinux EXPORT_SYMBOL
++0xacf4d843 match_strdup vmlinux EXPORT_SYMBOL
++0x870bf928 radix_tree_lookup vmlinux EXPORT_SYMBOL
++0x4672e88b __crypto_dequeue_request vmlinux EXPORT_SYMBOL_GPL
++0x7b0f1ab3 ring_buffer_free_read_page vmlinux EXPORT_SYMBOL_GPL
++0xff00f5a4 rt_mutex_unlock vmlinux EXPORT_SYMBOL_GPL
++0xe9d6425d neigh_seq_next vmlinux EXPORT_SYMBOL
++0xb587371d vfs_rename vmlinux EXPORT_SYMBOL
++0x8c2d546c generic_ro_fops vmlinux EXPORT_SYMBOL
++0xabc5855f nf_nat_get_offset net/ipv4/netfilter/nf_nat EXPORT_SYMBOL_GPL
++0xc7037e1e user_path_create vmlinux EXPORT_SYMBOL
++0x78c76bdd kthread_bind vmlinux EXPORT_SYMBOL
++0xc92969b1 xprt_disconnect_done vmlinux EXPORT_SYMBOL_GPL
++0xefd8281a ipv6_setsockopt vmlinux EXPORT_SYMBOL
++0x17c3edfd usb_serial_port_softint vmlinux EXPORT_SYMBOL_GPL
++0x486bfa52 del_mtd_blktrans_dev vmlinux EXPORT_SYMBOL_GPL
++0xdd19ee65 cache_register vmlinux EXPORT_SYMBOL_GPL
++0xc92254c9 inet_frag_find vmlinux EXPORT_SYMBOL
++0x2b281f0e inetdev_by_index vmlinux EXPORT_SYMBOL
++0x7c6b8d30 usb_poison_anchored_urbs vmlinux EXPORT_SYMBOL_GPL
++0x75b20f59 eventfd_signal vmlinux EXPORT_SYMBOL_GPL
++0x21f678b9 clocksource_unregister vmlinux EXPORT_SYMBOL
++0x461ebfa0 __copy_tofrom_user vmlinux EXPORT_SYMBOL
++0xc9ed05e3 fifo_set_limit vmlinux EXPORT_SYMBOL
++0x195d71f7 writeback_in_progress vmlinux EXPORT_SYMBOL
++0x76b28f53 filemap_fdatawrite vmlinux EXPORT_SYMBOL
++0x807d2b2c xt_recseq vmlinux EXPORT_SYMBOL_GPL
++0xc6ff126b __ethtool_get_settings vmlinux EXPORT_SYMBOL
++0x17648396 dev_base_lock vmlinux EXPORT_SYMBOL
++0xbfb8b0b7 _raw_read_lock_irqsave vmlinux EXPORT_SYMBOL
++0x219da672 xt_request_find_target vmlinux EXPORT_SYMBOL_GPL
++0x5ec1f3aa sg_scsi_ioctl vmlinux EXPORT_SYMBOL_GPL
++0xc22a3091 vm_unmap_aliases vmlinux EXPORT_SYMBOL_GPL
++0x0cc6165c cpu_remove_dev_attr_group vmlinux EXPORT_SYMBOL_GPL
++0x418fdef0 gnet_stats_finish_copy vmlinux EXPORT_SYMBOL
++0x5e3c3f48 scsi_get_device_flags_keyed vmlinux EXPORT_SYMBOL
++0x7282cf02 device_show_int vmlinux EXPORT_SYMBOL_GPL
++0x94552a4e swiotlb_tbl_unmap_single vmlinux EXPORT_SYMBOL_GPL
++0x5a6143d7 blk_fetch_request vmlinux EXPORT_SYMBOL
++0xcee07d7c free_inode_nonrcu vmlinux EXPORT_SYMBOL
++0xb7cb7543 dma_pool_create vmlinux EXPORT_SYMBOL
++0x4b34fbf5 block_all_signals vmlinux EXPORT_SYMBOL
++0x1e7af842 sdio_writeb vmlinux EXPORT_SYMBOL_GPL
++0x2e5f37cd usb_hcd_pci_probe vmlinux EXPORT_SYMBOL_GPL
++0x955a8e9a tty_name vmlinux EXPORT_SYMBOL
++0xb5aa7165 dma_pool_destroy vmlinux EXPORT_SYMBOL
++0x9045913c of_dev_put vmlinux EXPORT_SYMBOL
++0x78ab4762 of_dev_get vmlinux EXPORT_SYMBOL
++0xc22d32e4 sysfs_get_dirent vmlinux EXPORT_SYMBOL_GPL
++0x35f7dc5f perf_event_release_kernel vmlinux EXPORT_SYMBOL_GPL
++0x8c03d20c destroy_workqueue vmlinux EXPORT_SYMBOL_GPL
++0xd5901a2e inet6_csk_reqsk_queue_hash_add vmlinux EXPORT_SYMBOL_GPL
++0x7aff474c inet_twsk_put vmlinux EXPORT_SYMBOL_GPL
++0x6409d9b1 fib_default_rule_add vmlinux EXPORT_SYMBOL
++0xc1402a83 do_SAK vmlinux EXPORT_SYMBOL
++0xb5c93022 pci_load_and_free_saved_state vmlinux EXPORT_SYMBOL_GPL
++0x4ed00fb3 pci_save_state vmlinux EXPORT_SYMBOL
++0x5581df9d fat_get_dotdot_entry vmlinux EXPORT_SYMBOL_GPL
++0xcc19c3b6 check_disk_change vmlinux EXPORT_SYMBOL
++0xbcce8393 default_file_splice_read vmlinux EXPORT_SYMBOL
++0x32b2fbcf writeback_inodes_sb vmlinux EXPORT_SYMBOL
++0x8e555738 param_get_uint vmlinux EXPORT_SYMBOL
++0x5d650a5f elv_register vmlinux EXPORT_SYMBOL_GPL
++0x4523b9b7 page_put_link vmlinux EXPORT_SYMBOL
++0xcd70c7f7 release_pages vmlinux EXPORT_SYMBOL
++0xb4cab2ed rpc_sleep_on vmlinux EXPORT_SYMBOL_GPL
++0xc1a33294 km_state_expired vmlinux EXPORT_SYMBOL
++0xfef1d118 qdisc_list_del vmlinux EXPORT_SYMBOL
++0xb0e10781 get_option vmlinux EXPORT_SYMBOL
++0xb323ab9f nf_ct_gre_keymap_destroy net/netfilter/nf_conntrack_proto_gre EXPORT_SYMBOL_GPL
++0xce19bac5 register_inet6addr_notifier vmlinux EXPORT_SYMBOL
++0xcb117d64 inet_accept vmlinux EXPORT_SYMBOL
++0x49b07aec tcp_select_initial_window vmlinux EXPORT_SYMBOL
++0x762ff2b9 register_pernet_device vmlinux EXPORT_SYMBOL_GPL
++0x33b91f1c class_for_each_device vmlinux EXPORT_SYMBOL_GPL
++0xe697d108 __blk_iopoll_complete vmlinux EXPORT_SYMBOL
++0x13e38f5c up_read vmlinux EXPORT_SYMBOL
++0xa1c76e0a _cond_resched vmlinux EXPORT_SYMBOL
++0x595d0946 empty_zero_page vmlinux EXPORT_SYMBOL
++0x76e2075c nfnetlink_subsys_register net/netfilter/nfnetlink EXPORT_SYMBOL_GPL
++0xe5205ca9 __pskb_pull_tail vmlinux EXPORT_SYMBOL
++0x123a8ed7 mtd_is_partition vmlinux EXPORT_SYMBOL_GPL
++0x25c7b476 dev_alert vmlinux EXPORT_SYMBOL
++0xa8e85346 tty_wait_until_sent vmlinux EXPORT_SYMBOL
++0x74d1c3d7 bioset_free vmlinux EXPORT_SYMBOL
++0x7362dd1e vfs_fstat vmlinux EXPORT_SYMBOL
++0x127f1cf8 vfs_lstat vmlinux EXPORT_SYMBOL
++0x5b9828c5 dma_spin_lock vmlinux EXPORT_SYMBOL
++0x20bc3470 orderly_poweroff vmlinux EXPORT_SYMBOL_GPL
++0x0be13004 usb_storage_usb_ids vmlinux EXPORT_SYMBOL_GPL
++0x1556756b usermodehelper_is_disabled vmlinux EXPORT_SYMBOL_GPL
++0x82e704cc __netif_schedule vmlinux EXPORT_SYMBOL
++0x63f7a522 gpio_export_link vmlinux EXPORT_SYMBOL_GPL
++0x75bb9ca1 generic_fh_to_parent vmlinux EXPORT_SYMBOL_GPL
++0xc123374d generic_fillattr vmlinux EXPORT_SYMBOL
++0x183fa88b mempool_alloc_slab vmlinux EXPORT_SYMBOL
++0x379f5837 param_set_invbool vmlinux EXPORT_SYMBOL
++0xc5534d64 ioread16 vmlinux EXPORT_SYMBOL
++0x9f185a94 i2c_register_driver vmlinux EXPORT_SYMBOL
++0x343b3ac1 pci_bus_alloc_resource vmlinux EXPORT_SYMBOL
++0x6579d2f7 d_instantiate_unique vmlinux EXPORT_SYMBOL
++0xd6b8e852 request_threaded_irq vmlinux EXPORT_SYMBOL
++0x9d7ce8dd _raw_spin_trylock vmlinux EXPORT_SYMBOL
++0xc496da96 svc_drop vmlinux EXPORT_SYMBOL_GPL
++0x3a24b303 mutex_lock_interruptible vmlinux EXPORT_SYMBOL
++0xf47788cf skb_clone vmlinux EXPORT_SYMBOL
++0xad167cd8 input_get_keycode vmlinux EXPORT_SYMBOL
++0x6afa9ce8 crypto_find_alg vmlinux EXPORT_SYMBOL_GPL
++0xc6aac677 set_task_ioprio vmlinux EXPORT_SYMBOL_GPL
++0xbe5e9490 setup_arg_pages vmlinux EXPORT_SYMBOL
++0x5dc8d493 usb_serial_generic_process_read_urb vmlinux EXPORT_SYMBOL_GPL
++0x055c3bb2 inode_dio_wait vmlinux EXPORT_SYMBOL_GPL
++0xc34efe27 snmp_fold_field vmlinux EXPORT_SYMBOL_GPL
++0x9d5a6e79 tcp_init_xmit_timers vmlinux EXPORT_SYMBOL
++0x93f1e027 phy_ethtool_gset vmlinux EXPORT_SYMBOL
++0xc200ab97 phy_ethtool_sset vmlinux EXPORT_SYMBOL
++0xd67364f7 eventfd_ctx_fdget vmlinux EXPORT_SYMBOL_GPL
++0x446b3e02 thermal_zone_device_unregister vmlinux EXPORT_SYMBOL
++0x4980c504 vfs_lock_file vmlinux EXPORT_SYMBOL_GPL
++0xa00f2ea1 bio_uncopy_user vmlinux EXPORT_SYMBOL
++0x07f3051f make_bad_inode vmlinux EXPORT_SYMBOL
++0x04cb56f3 __d_drop vmlinux EXPORT_SYMBOL
++0xadb98035 __mmdrop vmlinux EXPORT_SYMBOL_GPL
++0x3065f579 gss_mech_unregister vmlinux EXPORT_SYMBOL_GPL
++0x33dbfd93 tcp_memory_allocated vmlinux EXPORT_SYMBOL
++0xea7be216 hid_check_keys_pressed vmlinux EXPORT_SYMBOL_GPL
++0x0a2e681f scsi_bus_type vmlinux EXPORT_SYMBOL_GPL
++0xa8232c78 strtobool vmlinux EXPORT_SYMBOL
++0xa807009b seq_release_private vmlinux EXPORT_SYMBOL
++0xb9ea2b35 clear_user_page vmlinux EXPORT_SYMBOL
++0x94d397ff uart_console_write vmlinux EXPORT_SYMBOL_GPL
++0x7b59e193 writeback_inodes_sb_nr vmlinux EXPORT_SYMBOL
++0x4f005ac7 vfs_removexattr vmlinux EXPORT_SYMBOL_GPL
++0x3bc25df9 find_symbol vmlinux EXPORT_SYMBOL_GPL
++0x55139b31 __mutex_init vmlinux EXPORT_SYMBOL
++0x807fb25f sdio_readsb vmlinux EXPORT_SYMBOL_GPL
++0x73883f28 mmc_host_enable vmlinux EXPORT_SYMBOL
++0xa4536a78 rtc_set_time vmlinux EXPORT_SYMBOL_GPL
++0x131e5c6e pcix_get_mmrbc vmlinux EXPORT_SYMBOL
++0x6f7d4b21 auth_domain_lookup vmlinux EXPORT_SYMBOL_GPL
++0x0b0d888b icmpv6_err_convert vmlinux EXPORT_SYMBOL
++0x6a010ac4 xfrm_audit_state_delete vmlinux EXPORT_SYMBOL_GPL
++0x7f00decc serial8250_register_port vmlinux EXPORT_SYMBOL
++0xd40d44fb vfs_readv vmlinux EXPORT_SYMBOL
++0xe10285f5 do_sync_write vmlinux EXPORT_SYMBOL
++0x3a63d1e5 mmc_detect_change vmlinux EXPORT_SYMBOL
++0xfe29a782 crypto_shash_setkey vmlinux EXPORT_SYMBOL_GPL
++0x1ad011b8 crypto_ahash_setkey vmlinux EXPORT_SYMBOL_GPL
++0x6b569c7b search_binary_handler vmlinux EXPORT_SYMBOL
++0xaa5dc44d rt_mutex_trylock vmlinux EXPORT_SYMBOL_GPL
++0xa0cc8b48 rtnl_link_get_net vmlinux EXPORT_SYMBOL
++0x4d88ec39 sdio_readw vmlinux EXPORT_SYMBOL_GPL
++0x7a1cde57 sdio_readl vmlinux EXPORT_SYMBOL_GPL
++0x1b2bbad1 sdio_readb vmlinux EXPORT_SYMBOL_GPL
++0xdc8e7a1f usb_remove_hcd vmlinux EXPORT_SYMBOL_GPL
++0x861c1a61 ahash_attr_alg vmlinux EXPORT_SYMBOL_GPL
++0xcfb5871c irq_work_queue vmlinux EXPORT_SYMBOL_GPL
++0x6bac7336 tcp_disconnect vmlinux EXPORT_SYMBOL
++0x0d030f2e put_device vmlinux EXPORT_SYMBOL_GPL
++0xb675788e nfs_initiate_write vmlinux EXPORT_SYMBOL_GPL
++0xef990a5a bio_pair_release vmlinux EXPORT_SYMBOL
++0xd44a50f2 spi_alloc_device vmlinux EXPORT_SYMBOL_GPL
++0xece65659 journal_start vmlinux EXPORT_SYMBOL
++0x77a203d6 register_filesystem vmlinux EXPORT_SYMBOL
++0xba497f13 loops_per_jiffy vmlinux EXPORT_SYMBOL
++0xd850fe94 eth_validate_addr vmlinux EXPORT_SYMBOL
++0xc5718627 sg_copy_to_buffer vmlinux EXPORT_SYMBOL
++0xc316b98c jiffies_to_clock_t vmlinux EXPORT_SYMBOL
++0x0c875058 usb_debug_root vmlinux EXPORT_SYMBOL_GPL
++0x69ef82cd generic_make_request vmlinux EXPORT_SYMBOL
++0x308c701c generic_file_llseek_size vmlinux EXPORT_SYMBOL
++0x38bd731f queue_delayed_work vmlinux EXPORT_SYMBOL_GPL
++0x1c87a811 __round_jiffies_up vmlinux EXPORT_SYMBOL_GPL
++0x98fe7882 DMA_MODE_READ vmlinux EXPORT_SYMBOL
++0x1c80de9c ip_send_check vmlinux EXPORT_SYMBOL
++0xdc8e4d19 __rtnl_register vmlinux EXPORT_SYMBOL_GPL
++0xa6c839d3 usb_serial_generic_disconnect vmlinux EXPORT_SYMBOL_GPL
++0x57db7242 mangle_path vmlinux EXPORT_SYMBOL
++0x81612cb7 pci_get_domain_bus_and_slot vmlinux EXPORT_SYMBOL
++0x4cd416fe anon_inode_getfd vmlinux EXPORT_SYMBOL_GPL
++0xef22332a filemap_flush vmlinux EXPORT_SYMBOL
++0xa4a94d26 find_next_bit_le vmlinux EXPORT_SYMBOL
++0xc1d7d179 blk_stack_limits vmlinux EXPORT_SYMBOL
++0x28ea0728 of_scan_bus vmlinux EXPORT_SYMBOL_GPL
++0x774b6448 unix_domain_find vmlinux EXPORT_SYMBOL_GPL
++0xcc8ebe78 tcp_set_state vmlinux EXPORT_SYMBOL_GPL
++0x00239c1b i2c_smbus_read_i2c_block_data vmlinux EXPORT_SYMBOL
++0x9bd59d1d tty_mutex vmlinux EXPORT_SYMBOL
++0xb28f5ef1 xt_free_table_info vmlinux EXPORT_SYMBOL
++0x0e1fa4e9 mnt_pin vmlinux EXPORT_SYMBOL
++0x616456a1 set_create_files_as vmlinux EXPORT_SYMBOL
++0xb609d16c dev_get_by_name vmlinux EXPORT_SYMBOL
++0x8848b690 __page_symlink vmlinux EXPORT_SYMBOL
++0xd2044f1c install_exec_creds vmlinux EXPORT_SYMBOL
++0xaf488b30 sched_setscheduler vmlinux EXPORT_SYMBOL_GPL
++0x6923ce63 irq_work_sync vmlinux EXPORT_SYMBOL_GPL
++0x30a80826 __kfifo_from_user vmlinux EXPORT_SYMBOL
++0x595c70ed ipcomp_input net/xfrm/xfrm_ipcomp EXPORT_SYMBOL_GPL
++0xead1e53c xdr_skb_read_bits vmlinux EXPORT_SYMBOL_GPL
++0xf20020d8 udp_prot vmlinux EXPORT_SYMBOL
++0x552567c0 inet_putpeer vmlinux EXPORT_SYMBOL_GPL
++0x6a1a16cb mmc_card_sleep vmlinux EXPORT_SYMBOL
++0x0c167229 i2c_adapter_type vmlinux EXPORT_SYMBOL_GPL
++0xebd52fa9 inet6_sk_rebuild_header vmlinux EXPORT_SYMBOL_GPL
++0xe506bc98 mb_cache_shrink vmlinux EXPORT_SYMBOL
++0x2d3385d3 system_wq vmlinux EXPORT_SYMBOL_GPL
++0xf1e98c74 avenrun vmlinux EXPORT_SYMBOL
++0x366e962c nf_ct_extend_register net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x634b5ff0 mmc_calc_max_discard vmlinux EXPORT_SYMBOL
++0xb1356813 register_mtd_parser vmlinux EXPORT_SYMBOL_GPL
++0x3281f449 mark_page_accessed vmlinux EXPORT_SYMBOL
++0x9cb8037b xfrm_count_enc_supported vmlinux EXPORT_SYMBOL_GPL
++0x02a18c74 nf_conntrack_destroy vmlinux EXPORT_SYMBOL
++0x7cac5792 scsi_report_bus_reset vmlinux EXPORT_SYMBOL
++0x5c8a36aa ip6_sk_dst_lookup_flow vmlinux EXPORT_SYMBOL_GPL
++0x460f95b8 hid_output_report vmlinux EXPORT_SYMBOL_GPL
++0xaa072d41 cdev_add vmlinux EXPORT_SYMBOL
++0xfcd7bc0b ring_buffer_empty vmlinux EXPORT_SYMBOL_GPL
++0x69447467 ring_buffer_write vmlinux EXPORT_SYMBOL_GPL
++0x82939ebd rcu_batches_completed_sched vmlinux EXPORT_SYMBOL_GPL
++0xeeacab69 rpc_update_rtt vmlinux EXPORT_SYMBOL_GPL
++0x6ee56ac5 xfrm_input vmlinux EXPORT_SYMBOL
++0x7fccf2c7 dev_mc_del vmlinux EXPORT_SYMBOL
++0xd44258b7 dev_uc_add vmlinux EXPORT_SYMBOL
++0x54a36ee2 dev_mc_add vmlinux EXPORT_SYMBOL
++0xff2dc492 dev_uc_del vmlinux EXPORT_SYMBOL
++0xe17df33d register_pernet_subsys vmlinux EXPORT_SYMBOL_GPL
++0xef850ef5 rtc_update_irq vmlinux EXPORT_SYMBOL_GPL
++0xebdef3fd blk_queue_update_dma_pad vmlinux EXPORT_SYMBOL
++0x30d8f8a2 blkdev_get_by_path vmlinux EXPORT_SYMBOL
++0x8745258d open_exec vmlinux EXPORT_SYMBOL
++0x5fc3a25a cpu_subsys vmlinux EXPORT_SYMBOL_GPL
++0x00f7937a mb_cache_entry_find_next vmlinux EXPORT_SYMBOL
++0xef3c9907 inode_init_owner vmlinux EXPORT_SYMBOL
++0x0b48677a __kfifo_init vmlinux EXPORT_SYMBOL
++0xd7d19d8c pci_find_next_capability vmlinux EXPORT_SYMBOL_GPL
++0xa166674c journal_forget vmlinux EXPORT_SYMBOL
++0xe6506d9b rt_mutex_destroy vmlinux EXPORT_SYMBOL_GPL
++0xa8b1f0bd queue_delayed_work_on vmlinux EXPORT_SYMBOL_GPL
++0xd4034828 system_freezable_wq vmlinux EXPORT_SYMBOL_GPL
++0x615be263 devres_open_group vmlinux EXPORT_SYMBOL_GPL
++0x5b19634d div_s64_rem vmlinux EXPORT_SYMBOL
++0x4a2e3575 __set_page_dirty_nobuffers vmlinux EXPORT_SYMBOL
++0x4b08f423 __nf_ct_kill_acct net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x0561fdb5 svc_xprt_copy_addrs vmlinux EXPORT_SYMBOL_GPL
++0x48000553 mempool_create_node vmlinux EXPORT_SYMBOL
++0xd853827a find_get_pid vmlinux EXPORT_SYMBOL_GPL
++0x1826f0a0 dev_set_promiscuity vmlinux EXPORT_SYMBOL
++0x42ee873c usb_stor_transparent_scsi_command vmlinux EXPORT_SYMBOL_GPL
++0x0eaa69cc scsi_bios_ptable vmlinux EXPORT_SYMBOL
++0x9f4e5960 pci_write_vpd vmlinux EXPORT_SYMBOL
++0x169d875d neigh_connected_output vmlinux EXPORT_SYMBOL
++0xe9f7149c zlib_deflate_workspacesize vmlinux EXPORT_SYMBOL
++0x11633870 param_set_ushort vmlinux EXPORT_SYMBOL
++0x7ae5d317 qe_get_snum vmlinux EXPORT_SYMBOL
++0x910e2911 qe_put_snum vmlinux EXPORT_SYMBOL
++0x4fba15b0 svc_recv vmlinux EXPORT_SYMBOL_GPL
++0x5dcfccd8 udp_flush_pending_frames vmlinux EXPORT_SYMBOL
++0xd445ec0d netlink_kernel_create vmlinux EXPORT_SYMBOL
++0xe5da4ca8 dev_get_stats vmlinux EXPORT_SYMBOL
++0x86fb9b05 bitmap_parse_user vmlinux EXPORT_SYMBOL
++0x01000e51 schedule vmlinux EXPORT_SYMBOL
++0x4f040a49 nlmsg_notify vmlinux EXPORT_SYMBOL
++0x9ac0cf66 mmput vmlinux EXPORT_SYMBOL_GPL
++0x9d438cba init_task vmlinux EXPORT_SYMBOL
++0x0a52a70f rpc_task_reset_client vmlinux EXPORT_SYMBOL_GPL
++0x871477d5 sysdev_class_remove_file vmlinux EXPORT_SYMBOL_GPL
++0x17e28473 fsl_upm_run_pattern vmlinux EXPORT_SYMBOL
++0x262e8cd3 pcibios_resource_to_bus vmlinux EXPORT_SYMBOL
++0x89d66811 build_ehash_secret vmlinux EXPORT_SYMBOL
++0x38e36730 __inet_twsk_hashdance vmlinux EXPORT_SYMBOL_GPL
++0xdfd88ae5 neigh_table_init_no_netlink vmlinux EXPORT_SYMBOL
++0x3c17abfe gnet_stats_copy_app vmlinux EXPORT_SYMBOL
++0x9567b24a i2c_verify_client vmlinux EXPORT_SYMBOL
++0xa2557f57 input_allocate_device vmlinux EXPORT_SYMBOL
++0x1cd4aca8 dev_printk vmlinux EXPORT_SYMBOL
++0x655a6117 pci_set_pcie_reset_state vmlinux EXPORT_SYMBOL_GPL
++0x1b015d25 bitmap_parselist vmlinux EXPORT_SYMBOL
++0x66e042c6 __insert_inode_hash vmlinux EXPORT_SYMBOL
++0x0619ca8a getboottime vmlinux EXPORT_SYMBOL_GPL
++0x80b9cedd revert_creds vmlinux EXPORT_SYMBOL
++0xdf929370 fs_overflowgid vmlinux EXPORT_SYMBOL
++0x9c5f81da cpu_rmap_add vmlinux EXPORT_SYMBOL
++0x0b157e07 swiotlb_unmap_sg_attrs vmlinux EXPORT_SYMBOL
++0x6b252ff6 bio_clone vmlinux EXPORT_SYMBOL
++0xedb52e09 xfrm_policy_walk vmlinux EXPORT_SYMBOL
++0x32f08411 blocking_notifier_call_chain vmlinux EXPORT_SYMBOL_GPL
++0xf6428305 nfs_init_commit vmlinux EXPORT_SYMBOL_GPL
++0x594bf15b ioport_map vmlinux EXPORT_SYMBOL
++0x8cff16ad xfrm_audit_state_add vmlinux EXPORT_SYMBOL_GPL
++0x83b50e64 __skb_checksum_complete vmlinux EXPORT_SYMBOL
++0xed302f0f tty_lock vmlinux EXPORT_SYMBOL
++0xb5a459dc unregister_blkdev vmlinux EXPORT_SYMBOL
++0x3ebc5a82 key_alloc vmlinux EXPORT_SYMBOL
++0xa4b0ca7b write_inode_now vmlinux EXPORT_SYMBOL
++0x5da7c835 sysdev_store_ulong vmlinux EXPORT_SYMBOL_GPL
++0x1bc4ff03 tty_termios_hw_change vmlinux EXPORT_SYMBOL
++0xf2d69a5d fat_search_long vmlinux EXPORT_SYMBOL_GPL
++0x5e181c16 seq_path vmlinux EXPORT_SYMBOL
++0xcc5005fe msleep_interruptible vmlinux EXPORT_SYMBOL
++0xf8b2ff6e g_verify_token_header vmlinux EXPORT_SYMBOL_GPL
++0x7345829d dev_addr_add vmlinux EXPORT_SYMBOL
++0x99544b2e netdev_err vmlinux EXPORT_SYMBOL
++0x65414e67 dev_valid_name vmlinux EXPORT_SYMBOL
++0x3be89d3c usb_register_notify vmlinux EXPORT_SYMBOL_GPL
++0xd2a941d4 sg_init_table vmlinux EXPORT_SYMBOL
++0x5642793a radix_tree_tag_clear vmlinux EXPORT_SYMBOL
++0x17115d7c fsnotify vmlinux EXPORT_SYMBOL_GPL
++0x04d7d50a generic_file_open vmlinux EXPORT_SYMBOL
++0xa357d56e ktime_get vmlinux EXPORT_SYMBOL_GPL
++0x5e4ed6a0 genphy_update_link vmlinux EXPORT_SYMBOL
++0xa0df5c38 generic_cont_expand_simple vmlinux EXPORT_SYMBOL
++0x9000a23c d_instantiate vmlinux EXPORT_SYMBOL
++0x1b6b594c blk_queue_rq_timed_out vmlinux EXPORT_SYMBOL_GPL
++0x08c473b7 xt_alloc_table_info vmlinux EXPORT_SYMBOL
++0xb2f5f9e1 sysdev_create_file vmlinux EXPORT_SYMBOL_GPL
++0xb7b61546 crc32_be vmlinux EXPORT_SYMBOL
++0xe52fec95 rpc_restart_call vmlinux EXPORT_SYMBOL_GPL
++0x660920a6 xfrm_output_resume vmlinux EXPORT_SYMBOL_GPL
++0xc84ba62e skb_find_text vmlinux EXPORT_SYMBOL
++0x500e2d6e i2c_unregister_device vmlinux EXPORT_SYMBOL_GPL
++0xb088b8f4 pci_clear_master vmlinux EXPORT_SYMBOL
++0x1b848d78 current_fs_time vmlinux EXPORT_SYMBOL
++0xc009c0f0 skb_queue_tail vmlinux EXPORT_SYMBOL
++0x953db383 free_irq_cpu_rmap vmlinux EXPORT_SYMBOL
++0x530dca11 crypto_lookup_template vmlinux EXPORT_SYMBOL_GPL
++0x1608951e vfs_test_lock vmlinux EXPORT_SYMBOL_GPL
++0x952664c5 do_exit vmlinux EXPORT_SYMBOL_GPL
++0x7dbeb00f mmc_host_lazy_disable vmlinux EXPORT_SYMBOL
++0xc46197ca mark_buffer_dirty_inode vmlinux EXPORT_SYMBOL
++0x3109b751 cpu_clock vmlinux EXPORT_SYMBOL_GPL
++0x07121133 __put_mtd_device vmlinux EXPORT_SYMBOL_GPL
++0xefbe88ae __get_mtd_device vmlinux EXPORT_SYMBOL_GPL
++0x56011f32 scsi_execute_req vmlinux EXPORT_SYMBOL
++0x33543801 queue_work vmlinux EXPORT_SYMBOL_GPL
++0xb1c3a01a oops_in_progress vmlinux EXPORT_SYMBOL
++0xf1ec57f6 tty_insert_flip_string_fixed_flag vmlinux EXPORT_SYMBOL
++0x19a433b2 tty_register_ldisc vmlinux EXPORT_SYMBOL
++0x1dad9e54 tty_throttle vmlinux EXPORT_SYMBOL
++0xb72b50d8 tty_check_change vmlinux EXPORT_SYMBOL
++0x57f7d2b8 blk_get_backing_dev_info vmlinux EXPORT_SYMBOL
++0xf1abb528 elevator_init vmlinux EXPORT_SYMBOL
++0xe0423822 kill_fasync vmlinux EXPORT_SYMBOL
++0x736c79dc param_get_byte vmlinux EXPORT_SYMBOL
++0x69708997 dev_disable_lro vmlinux EXPORT_SYMBOL
++0x446c0616 attribute_container_classdev_to_container vmlinux EXPORT_SYMBOL_GPL
++0x7d2b62e9 kblockd_schedule_delayed_work vmlinux EXPORT_SYMBOL
++0x6f2fe28d debugfs_create_u8 vmlinux EXPORT_SYMBOL_GPL
++0x6c8d5ae8 __gpio_get_value vmlinux EXPORT_SYMBOL_GPL
++0x432fd7f6 __gpio_set_value vmlinux EXPORT_SYMBOL_GPL
++0xd62c833f schedule_timeout vmlinux EXPORT_SYMBOL
++0x2cadb791 netlink_dump_start vmlinux EXPORT_SYMBOL
++0x65ccb6f0 call_netevent_notifiers vmlinux EXPORT_SYMBOL_GPL
++0xd1cc0681 percpu_counter_compare vmlinux EXPORT_SYMBOL
++0xc365ca35 crypto_alloc_base vmlinux EXPORT_SYMBOL_GPL
++0x7e92c53a aio_put_req vmlinux EXPORT_SYMBOL
++0xb8bddf33 ip6t_ext_hdr net/ipv6/netfilter/ip6_tables EXPORT_SYMBOL
++0x8e0b7743 ipv6_ext_hdr vmlinux EXPORT_SYMBOL
++0x5c311da9 neigh_destroy vmlinux EXPORT_SYMBOL
++0x914859fb netdev_warn vmlinux EXPORT_SYMBOL
++0x32445441 mmc_wait_for_app_cmd vmlinux EXPORT_SYMBOL
++0xcefcd99a serial8250_unregister_port vmlinux EXPORT_SYMBOL
++0x0c077439 blk_end_request_cur vmlinux EXPORT_SYMBOL
++0x5aed1672 replace_mount_options vmlinux EXPORT_SYMBOL
++0x37ea921e vfsmount_lock_local_lock_cpu vmlinux EXPORT_SYMBOL
++0x7303f848 __xfrm_policy_check vmlinux EXPORT_SYMBOL
++0xe9f5462d blk_lld_busy vmlinux EXPORT_SYMBOL_GPL
++0x70f16495 blk_sync_queue vmlinux EXPORT_SYMBOL
++0xf15a9bc6 skb_clone_tx_timestamp vmlinux EXPORT_SYMBOL_GPL
++0xdbba9970 pskb_copy vmlinux EXPORT_SYMBOL
++0x9da1d86b scsi_schedule_eh vmlinux EXPORT_SYMBOL_GPL
++0xa0b474d5 class_unregister vmlinux EXPORT_SYMBOL_GPL
++0xa185f0cd fat_alloc_new_dir vmlinux EXPORT_SYMBOL_GPL
++0x17368f42 simple_write_end vmlinux EXPORT_SYMBOL
++0x37d2c2c5 rh_dump_blk vmlinux EXPORT_SYMBOL_GPL
++0xd07885a5 ip_mc_rejoin_groups vmlinux EXPORT_SYMBOL
++0xa6f04ef7 netdev_update_features vmlinux EXPORT_SYMBOL
++0x45f9ef6a spi_async vmlinux EXPORT_SYMBOL_GPL
++0xd75c79df smp_call_function vmlinux EXPORT_SYMBOL
++0xef6c3f70 round_jiffies_up_relative vmlinux EXPORT_SYMBOL_GPL
++0xd5c1febc of_rescan_bus vmlinux EXPORT_SYMBOL_GPL
++0xd5b2e52a single_step_exception vmlinux EXPORT_SYMBOL
++0xe3f587bb eth_header_cache vmlinux EXPORT_SYMBOL
++0xfd3a2bf8 i2c_smbus_read_byte_data vmlinux EXPORT_SYMBOL
++0xca5dbc50 scsi_print_sense_hdr vmlinux EXPORT_SYMBOL
++0x6bedb1fb scsi_host_lookup vmlinux EXPORT_SYMBOL
++0x83ed980f uart_set_options vmlinux EXPORT_SYMBOL_GPL
++0xf385cf08 pci_find_capability vmlinux EXPORT_SYMBOL
++0x0675c7eb atomic64_cmpxchg vmlinux EXPORT_SYMBOL
++0xb9d025c9 llist_del_first vmlinux EXPORT_SYMBOL_GPL
++0xb678366f int_sqrt vmlinux EXPORT_SYMBOL
++0xfdbe54c4 dec_zone_page_state vmlinux EXPORT_SYMBOL
++0x0799aca4 local_bh_enable vmlinux EXPORT_SYMBOL
++0xf38bcdf3 nf_conntrack_max net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x60763401 tcp_syn_flood_action vmlinux EXPORT_SYMBOL
++0xb9099fb2 llc_mac_hdr_init vmlinux EXPORT_SYMBOL
++0xee8d918e journal_dirty_metadata vmlinux EXPORT_SYMBOL
++0x1eb9516e round_jiffies_relative vmlinux EXPORT_SYMBOL_GPL
++0x17aa156a __ucmpdi2 vmlinux EXPORT_SYMBOL
++0xfab60503 klist_iter_init_node vmlinux EXPORT_SYMBOL_GPL
++0x0634100a bitmap_parselist_user vmlinux EXPORT_SYMBOL
++0xf45c1434 ida_simple_get vmlinux EXPORT_SYMBOL
++0xe87ffb37 blk_queue_update_dma_alignment vmlinux EXPORT_SYMBOL
++0x18d30e30 blk_start_request vmlinux EXPORT_SYMBOL
++0x7c003aef _raw_read_lock_irq vmlinux EXPORT_SYMBOL
++0xf243a51d hrtimer_try_to_cancel vmlinux EXPORT_SYMBOL_GPL
++0xbb543a9f nf_register_hook vmlinux EXPORT_SYMBOL
++0xae870b28 __dev_get_by_name vmlinux EXPORT_SYMBOL
++0x4cfd46aa skb_copy_and_csum_dev vmlinux EXPORT_SYMBOL
++0xb02612a3 input_unregister_handle vmlinux EXPORT_SYMBOL
++0x7e6c28a6 usb_hcd_map_urb_for_dma vmlinux EXPORT_SYMBOL_GPL
++0x8e63350d idr_replace vmlinux EXPORT_SYMBOL
++0x82acfb70 blk_iopoll_sched vmlinux EXPORT_SYMBOL
++0xaa17a2e2 rh_alloc_align vmlinux EXPORT_SYMBOL_GPL
++0x2c7db649 irq_dispose_mapping vmlinux EXPORT_SYMBOL_GPL
++0x2971c44c register_netdev vmlinux EXPORT_SYMBOL
++0xa8223905 blk_limits_io_opt vmlinux EXPORT_SYMBOL
++0x612e9fe1 inet_twsk_purge vmlinux EXPORT_SYMBOL_GPL
++0x9e9f1714 __bitmap_andnot vmlinux EXPORT_SYMBOL
++0x737de5e9 radix_tree_tag_get vmlinux EXPORT_SYMBOL
++0x9941925e get_pci_dma_ops vmlinux EXPORT_SYMBOL
++0xc7041cc2 skb_seq_read vmlinux EXPORT_SYMBOL
++0x712be89f i2c_transfer vmlinux EXPORT_SYMBOL
++0x67eb757c scsi_device_lookup vmlinux EXPORT_SYMBOL
++0xe0fc24aa param_set_int vmlinux EXPORT_SYMBOL
++0x3ec32668 xdr_inline_pages vmlinux EXPORT_SYMBOL_GPL
++0x17d5b36f crypto_drop_spawn vmlinux EXPORT_SYMBOL_GPL
++0x834658ac cmxgcr_lock vmlinux EXPORT_SYMBOL
++0x9ce3f83f nvram_write_byte vmlinux EXPORT_SYMBOL
++0x13ec80f3 param_set_short vmlinux EXPORT_SYMBOL
++0xf4e2a909 nf_nat_tftp_hook net/netfilter/nf_conntrack_tftp EXPORT_SYMBOL_GPL
++0x1d39c751 nf_nat_snmp_hook net/netfilter/nf_conntrack_snmp EXPORT_SYMBOL_GPL
++0xeb810de9 skb_pad vmlinux EXPORT_SYMBOL
++0x77bc13a0 strim vmlinux EXPORT_SYMBOL
++0xc4191169 shash_register_instance vmlinux EXPORT_SYMBOL_GPL
++0xbf84d6ad seq_write vmlinux EXPORT_SYMBOL
++0x3ed6ecb7 generic_file_llseek vmlinux EXPORT_SYMBOL
++0x95922601 rtc_update_irq_enable vmlinux EXPORT_SYMBOL_GPL
++0x999e8297 vfree vmlinux EXPORT_SYMBOL
++0x6906c2dc wait_on_page_bit vmlinux EXPORT_SYMBOL
++0xcbdab685 mutex_lock vmlinux EXPORT_SYMBOL
++0x097d06aa scsi_get_host_dev vmlinux EXPORT_SYMBOL
++0x240bd3e5 swiotlb_sync_sg_for_device vmlinux EXPORT_SYMBOL
++0x6c03da58 elv_rq_merge_ok vmlinux EXPORT_SYMBOL
++0xee3496c3 dma_pool_alloc vmlinux EXPORT_SYMBOL
++0xee766000 tcp_v4_do_rcv vmlinux EXPORT_SYMBOL
++0x0ec55ed1 get_device vmlinux EXPORT_SYMBOL_GPL
++0xbee1171d blk_dump_rq_flags vmlinux EXPORT_SYMBOL
++0x3cfa0f3d sysfs_create_group vmlinux EXPORT_SYMBOL_GPL
++0xf065f629 ioread16be vmlinux EXPORT_SYMBOL
++0x00c52ef5 g_make_token_header vmlinux EXPORT_SYMBOL_GPL
++0xcd2f69d1 xprt_release_rqst_cong vmlinux EXPORT_SYMBOL_GPL
++0x05e73ebe xfrm_unregister_mode vmlinux EXPORT_SYMBOL
++0xa84245d3 consume_skb vmlinux EXPORT_SYMBOL
++0xdd978be5 scsi_add_device vmlinux EXPORT_SYMBOL
++0x2d832e72 pci_match_id vmlinux EXPORT_SYMBOL
++0x01674bbb pci_dev_run_wake vmlinux EXPORT_SYMBOL_GPL
++0x64e716c4 rpc_alloc_iostats vmlinux EXPORT_SYMBOL_GPL
++0xa2a8b984 ethtool_op_get_tso vmlinux EXPORT_SYMBOL
++0xdfc02652 i2c_add_numbered_adapter vmlinux EXPORT_SYMBOL_GPL
++0x12fa94c6 usb_unanchor_urb vmlinux EXPORT_SYMBOL_GPL
++0x8071ec90 bio_kmalloc vmlinux EXPORT_SYMBOL
++0xa62884a3 poll_schedule_timeout vmlinux EXPORT_SYMBOL
++0x30ddb019 tcp_prot vmlinux EXPORT_SYMBOL
++0xbc912b04 root_device_unregister vmlinux EXPORT_SYMBOL_GPL
++0x5ff1e29f textsearch_prepare vmlinux EXPORT_SYMBOL
++0x50ab4c6d files_lglock_global_lock vmlinux EXPORT_SYMBOL
++0x7914c68c proc_dointvec_ms_jiffies vmlinux EXPORT_SYMBOL
++0x63f22305 inet_frag_kill vmlinux EXPORT_SYMBOL
++0x4f90f253 simple_setattr vmlinux EXPORT_SYMBOL
++0xcfea7e86 simple_getattr vmlinux EXPORT_SYMBOL
++0x23f2243d mempool_free vmlinux EXPORT_SYMBOL
++0xc0b11f65 pci_iounmap vmlinux EXPORT_SYMBOL
++0x9edf6333 llc_sap_open vmlinux EXPORT_SYMBOL
++0x88164429 cred_to_ucred vmlinux EXPORT_SYMBOL_GPL
++0x3d418f49 sock_tx_timestamp vmlinux EXPORT_SYMBOL
++0x8d4097dd usb_stor_Bulk_reset vmlinux EXPORT_SYMBOL_GPL
++0x9eb18e34 attribute_container_unregister vmlinux EXPORT_SYMBOL_GPL
++0x277034d4 driver_for_each_device vmlinux EXPORT_SYMBOL_GPL
++0x5c443f95 bdget_disk vmlinux EXPORT_SYMBOL
++0x717ed11e journal_init_inode vmlinux EXPORT_SYMBOL
++0xb41c85dd tcp_v4_get_peer vmlinux EXPORT_SYMBOL
++0xa99ef722 tcp_rcv_state_process vmlinux EXPORT_SYMBOL
++0xf83a1c06 ethtool_op_get_tx_csum vmlinux EXPORT_SYMBOL
++0xf368fcf8 skb_to_sgvec vmlinux EXPORT_SYMBOL_GPL
++0x42224298 sscanf vmlinux EXPORT_SYMBOL
++0x77e35ccc nlmsvc_unlock_all_by_ip vmlinux EXPORT_SYMBOL_GPL
++0x1a24588e nlmsvc_unlock_all_by_sb vmlinux EXPORT_SYMBOL_GPL
++0xdaf873fe __breadahead vmlinux EXPORT_SYMBOL
++0x9531cde3 rpc_bind_new_program vmlinux EXPORT_SYMBOL_GPL
++0x291d6625 pfifo_fast_ops vmlinux EXPORT_SYMBOL
++0x3301ac32 platform_device_register_full vmlinux EXPORT_SYMBOL_GPL
++0x0111955c journal_stop vmlinux EXPORT_SYMBOL
++0x44eb192e wait_for_completion vmlinux EXPORT_SYMBOL
++0x72c09e5c csum_partial_copy_to_xdr vmlinux EXPORT_SYMBOL_GPL
++0xcdbc9355 dev_get_by_name_rcu vmlinux EXPORT_SYMBOL
++0x7f72cd44 i2c_smbus_write_byte_data vmlinux EXPORT_SYMBOL
++0x96786360 usb_unlink_urb vmlinux EXPORT_SYMBOL_GPL
++0xea968c96 ___ratelimit vmlinux EXPORT_SYMBOL
++0x4806976c __nf_nat_mangle_tcp_packet net/ipv4/netfilter/nf_nat EXPORT_SYMBOL
++0x9e672ff6 scsi_kmap_atomic_sg vmlinux EXPORT_SYMBOL
++0xe4c58b28 platform_device_add_data vmlinux EXPORT_SYMBOL_GPL
++0x3a26ed11 sched_clock vmlinux EXPORT_SYMBOL_GPL
++0xefde1bbe flush_dcache_range vmlinux EXPORT_SYMBOL
++0xe1286b24 put_rpccred vmlinux EXPORT_SYMBOL_GPL
++0x4bf99462 rpcauth_init_cred vmlinux EXPORT_SYMBOL_GPL
++0x3cce336f xfrm_audit_state_replay_overflow vmlinux EXPORT_SYMBOL_GPL
++0x1fcece42 inet_twdr_twcal_tick vmlinux EXPORT_SYMBOL_GPL
++0x533977ad sock_create_lite vmlinux EXPORT_SYMBOL
++0x97dba41d mmc_hw_reset_check vmlinux EXPORT_SYMBOL
++0xf1be02c3 swiotlb_dma_mapping_error vmlinux EXPORT_SYMBOL
++0xb1c3fd5a d_obtain_alias vmlinux EXPORT_SYMBOL
++0x493e60ab file_sb_list_del vmlinux EXPORT_SYMBOL_GPL
++0x656e8057 nf_conntrack_helper_try_module_get net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xe160bbbe ip4_datagram_connect vmlinux EXPORT_SYMBOL
++0x6ba0b373 tcp_timewait_state_process vmlinux EXPORT_SYMBOL
++0x75bdea12 iommu_area_alloc vmlinux EXPORT_SYMBOL
++0xc46d877e schedule_hrtimeout vmlinux EXPORT_SYMBOL_GPL
++0x587b892e qe_get_num_of_risc vmlinux EXPORT_SYMBOL
++0x9f8fb40b starget_for_each_device vmlinux EXPORT_SYMBOL
++0x585be6d1 subsys_interface_register vmlinux EXPORT_SYMBOL_GPL
++0x6fdbcab8 nobh_writepage vmlinux EXPORT_SYMBOL
++0xb34ab28b clear_page_dirty_for_io vmlinux EXPORT_SYMBOL
++0xe0573294 srcu_init_notifier_head vmlinux EXPORT_SYMBOL_GPL
++0xcfb9006e jiffies_to_timeval vmlinux EXPORT_SYMBOL
++0x60421247 tcp_reno_min_cwnd vmlinux EXPORT_SYMBOL_GPL
++0x21b65a0b tty_schedule_flip vmlinux EXPORT_SYMBOL
++0x62d55839 tty_get_baud_rate vmlinux EXPORT_SYMBOL
++0x96877ac4 locks_start_grace vmlinux EXPORT_SYMBOL_GPL
++0x2d2aefd5 vfs_follow_link vmlinux EXPORT_SYMBOL
++0xc9d29672 svc_create_xprt vmlinux EXPORT_SYMBOL_GPL
++0xc74a0c83 sysdev_class_unregister vmlinux EXPORT_SYMBOL_GPL
++0xcf038dc7 tty_shutdown vmlinux EXPORT_SYMBOL
++0xfc885e13 tty_devnum vmlinux EXPORT_SYMBOL
++0xbed06f95 sysfs_rename_link vmlinux EXPORT_SYMBOL_GPL
++0x4f391d0e nla_parse vmlinux EXPORT_SYMBOL
++0xc1868f6a write_dirty_buffer vmlinux EXPORT_SYMBOL
++0xe633499a noop_llseek vmlinux EXPORT_SYMBOL
++0xc65d3eed ring_buffer_entries_cpu vmlinux EXPORT_SYMBOL_GPL
++0xf1e28f9a llc_sap_find vmlinux EXPORT_SYMBOL
++0x30fbaf1e input_free_device vmlinux EXPORT_SYMBOL
++0x69f56098 xprt_set_retrans_timeout_rtt vmlinux EXPORT_SYMBOL_GPL
++0x3e9110fa __hw_addr_unsync vmlinux EXPORT_SYMBOL
++0x7d11c268 jiffies vmlinux EXPORT_SYMBOL
++0x3e7bb605 dev_queue_xmit vmlinux EXPORT_SYMBOL
++0x5fa8e9f9 of_device_alloc vmlinux EXPORT_SYMBOL
++0xac57677c do_map_probe vmlinux EXPORT_SYMBOL
++0x5a324753 proc_mkdir vmlinux EXPORT_SYMBOL
++0x13d0adf7 __kfifo_out vmlinux EXPORT_SYMBOL
++0x8379c763 dmam_free_noncoherent vmlinux EXPORT_SYMBOL
++0x0964a2f2 blk_rq_map_sg vmlinux EXPORT_SYMBOL
++0x9b68e095 proc_dointvec_jiffies vmlinux EXPORT_SYMBOL
++0xb53a4336 kmap_pte vmlinux EXPORT_SYMBOL
++0x9105b5ec __napi_schedule vmlinux EXPORT_SYMBOL
++0x48c6fdb8 sk_stream_wait_memory vmlinux EXPORT_SYMBOL
++0xaf78c424 usb_set_interface vmlinux EXPORT_SYMBOL_GPL
++0x8384a2c5 tty_unlock vmlinux EXPORT_SYMBOL
++0x0d3cb182 kstrtos16_from_user vmlinux EXPORT_SYMBOL
++0x9f2bdaac __bitmap_or vmlinux EXPORT_SYMBOL
++0x4b29940c get_dcookie vmlinux EXPORT_SYMBOL_GPL
++0x87480e3f netlink_broadcast_filtered vmlinux EXPORT_SYMBOL
++0x5dd67618 register_netevent_notifier vmlinux EXPORT_SYMBOL_GPL
++0xc7ec6c27 strspn vmlinux EXPORT_SYMBOL
++0x0727c4f3 iowrite8 vmlinux EXPORT_SYMBOL
++0x97255bdf strlen vmlinux EXPORT_SYMBOL
++0x3f44c83f scsi_allocate_command vmlinux EXPORT_SYMBOL
++0xedbaee5e nla_strcmp vmlinux EXPORT_SYMBOL
++0x55786827 crypto_ahash_type vmlinux EXPORT_SYMBOL_GPL
++0x26bb950b __kfifo_from_user_r vmlinux EXPORT_SYMBOL
++0xadd1e971 alignment_exception vmlinux EXPORT_SYMBOL
++0xf6cb376c skb_trim vmlinux EXPORT_SYMBOL
++0x403f9529 gpio_request_one vmlinux EXPORT_SYMBOL_GPL
++0xce3e3387 svc_proc_register vmlinux EXPORT_SYMBOL_GPL
++0x6f35aea7 xfrm_policy_delete vmlinux EXPORT_SYMBOL
++0x40cb7613 inet_frags_init vmlinux EXPORT_SYMBOL
++0x60d5f317 rtc_irq_register vmlinux EXPORT_SYMBOL_GPL
++0x4e3567f7 match_int vmlinux EXPORT_SYMBOL
++0x054434d6 radix_tree_tag_set vmlinux EXPORT_SYMBOL
++0x7c763d45 blk_queue_lld_busy vmlinux EXPORT_SYMBOL_GPL
++0xcfd8a363 shash_free_instance vmlinux EXPORT_SYMBOL_GPL
++0xb663c828 debugfs_create_x64 vmlinux EXPORT_SYMBOL_GPL
++0x7e003b33 bdi_setup_and_register vmlinux EXPORT_SYMBOL
++0x510e2136 rpcauth_generic_bind_cred vmlinux EXPORT_SYMBOL_GPL
++0x5da31da0 skb_cow_data vmlinux EXPORT_SYMBOL_GPL
++0xdc6b4513 pci_fixup_cardbus vmlinux EXPORT_SYMBOL
++0x91acac9a i2c_get_adapter vmlinux EXPORT_SYMBOL
++0x868acba5 get_options vmlinux EXPORT_SYMBOL
++0xe2d57cb8 setup_irq vmlinux EXPORT_SYMBOL_GPL
++0x7e64ffb7 xdr_partial_copy_from_skb vmlinux EXPORT_SYMBOL_GPL
++0xac01fe4e input_unregister_handler vmlinux EXPORT_SYMBOL
++0x467b133c bh_uptodate_or_lock vmlinux EXPORT_SYMBOL
++0x2ec524ad __kfifo_in_r vmlinux EXPORT_SYMBOL
++0x51dce73b xfrm_state_walk_init vmlinux EXPORT_SYMBOL
++0xabeb086a rtc_read_alarm vmlinux EXPORT_SYMBOL_GPL
++0x8841dda6 pci_remove_behind_bridge vmlinux EXPORT_SYMBOL
++0x3c9d1211 string_get_size vmlinux EXPORT_SYMBOL
++0x14a5ead6 fat_fill_super vmlinux EXPORT_SYMBOL_GPL
++0x7b03848a verify_mem_not_deleted vmlinux EXPORT_SYMBOL
++0xee1a5125 register_exec_domain vmlinux EXPORT_SYMBOL
++0x4227283f fl6_sock_lookup vmlinux EXPORT_SYMBOL_GPL
++0x4c40ef7a pci_bus_write_config_word vmlinux EXPORT_SYMBOL
++0x9330cb9f sg_alloc_table vmlinux EXPORT_SYMBOL
++0x9c8d5b93 handle_simple_irq vmlinux EXPORT_SYMBOL_GPL
++0xda1be8e1 async_synchronize_cookie_domain vmlinux EXPORT_SYMBOL_GPL
++0xabd30091 call_usermodehelper_exec vmlinux EXPORT_SYMBOL
++0xa39b4cf2 udelay vmlinux EXPORT_SYMBOL
++0xe7a664c4 nf_hooks vmlinux EXPORT_SYMBOL
++0x339f4657 pci_release_region vmlinux EXPORT_SYMBOL
++0xff1e9dd8 seq_list_start vmlinux EXPORT_SYMBOL
++0x3f5b1415 nf_ct_port_nlattr_to_tuple net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xaeea3073 xfrm_aead_get_byname vmlinux EXPORT_SYMBOL_GPL
++0x02889771 km_state_notify vmlinux EXPORT_SYMBOL
++0xac26b820 _raw_write_lock vmlinux EXPORT_SYMBOL
++0x59b3378a completion_done vmlinux EXPORT_SYMBOL
++0x357c90d2 qdisc_put_stab vmlinux EXPORT_SYMBOL
++0x96a6cb6a seq_printf vmlinux EXPORT_SYMBOL
++0x8669d18f call_usermodehelper_setfns vmlinux EXPORT_SYMBOL
++0x4b98827c rh_init vmlinux EXPORT_SYMBOL_GPL
++0xa35b2101 mmc_free_host vmlinux EXPORT_SYMBOL
++0xe0b0dd36 pci_dev_driver vmlinux EXPORT_SYMBOL
++0x0b742fd7 simple_strtol vmlinux EXPORT_SYMBOL
++0x4da7c931 rwsem_downgrade_wake vmlinux EXPORT_SYMBOL
++0xfd9e2a19 ilookup5_nowait vmlinux EXPORT_SYMBOL
++0xac6855b0 gen_kill_estimator vmlinux EXPORT_SYMBOL
++0xdacc5bd6 pci_set_power_state vmlinux EXPORT_SYMBOL
++0x0a0db355 blk_queue_alignment_offset vmlinux EXPORT_SYMBOL
++0x5f4c2d4c unlock_super vmlinux EXPORT_SYMBOL
++0xdb3aca5d qe_pin_request vmlinux EXPORT_SYMBOL
++0x796fc5ce scsi_get_sense_info_fld vmlinux EXPORT_SYMBOL
++0x16db989b pci_bus_size_bridges vmlinux EXPORT_SYMBOL
++0x7e17c66d __bio_clone vmlinux EXPORT_SYMBOL
++0x4d025d04 vfs_stat vmlinux EXPORT_SYMBOL
++0xa0fbac79 wake_up_bit vmlinux EXPORT_SYMBOL
++0xe1e5b5a7 flush_fp_to_thread vmlinux EXPORT_SYMBOL_GPL
++0x3c93c386 nf_conntrack_flush_report net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x48a488a0 sysctl_tcp_cookie_size vmlinux EXPORT_SYMBOL_GPL
++0xe3a73fdb sysdev_driver_register vmlinux EXPORT_SYMBOL_GPL
++0x48034724 zlib_deflateReset vmlinux EXPORT_SYMBOL
++0x013b835b cap_netlink_recv vmlinux EXPORT_SYMBOL
++0xcdca3691 nr_irqs vmlinux EXPORT_SYMBOL_GPL
++0x8ec04552 _raw_spin_trylock_bh vmlinux EXPORT_SYMBOL
++0x56c8799d scsi_kunmap_atomic_sg vmlinux EXPORT_SYMBOL
++0x1b54f3f0 scsi_block_when_processing_errors vmlinux EXPORT_SYMBOL
++0x2d6604af wait_for_key_construction vmlinux EXPORT_SYMBOL
++0xa85da1dd f_setown vmlinux EXPORT_SYMBOL
++0x05e807a9 xdr_encode_string vmlinux EXPORT_SYMBOL_GPL
++0x3a434310 ip6_dst_hoplimit vmlinux EXPORT_SYMBOL
++0x03e7b88a arp_invalidate vmlinux EXPORT_SYMBOL
++0x81bf1cbf mmc_can_sanitize vmlinux EXPORT_SYMBOL
++0xfb1ebb24 usb_clear_halt vmlinux EXPORT_SYMBOL_GPL
++0xb640c303 swiotlb_map_sg_attrs vmlinux EXPORT_SYMBOL
++0x6d27ef64 __bitmap_empty vmlinux EXPORT_SYMBOL
++0x7c5f611a elv_unregister vmlinux EXPORT_SYMBOL_GPL
++0xf85746f7 submit_bh vmlinux EXPORT_SYMBOL
++0x7babd7ea mnt_clone_write vmlinux EXPORT_SYMBOL_GPL
++0x4e94f614 page_mkclean vmlinux EXPORT_SYMBOL_GPL
++0x405c1144 get_seconds vmlinux EXPORT_SYMBOL
++0x0d706d2e rh_set_owner vmlinux EXPORT_SYMBOL_GPL
++0xcf56c41f unregister_8022_client vmlinux EXPORT_SYMBOL
++0x2ddee4bb usb_anchor_empty vmlinux EXPORT_SYMBOL_GPL
++0xf0f1246c kvasprintf vmlinux EXPORT_SYMBOL
++0xa6dcc773 rb_insert_color vmlinux EXPORT_SYMBOL
++0x09c27acb svcauth_unix_set_client vmlinux EXPORT_SYMBOL_GPL
++0x9cd435ec __xfrm_init_state vmlinux EXPORT_SYMBOL
++0x1b17f158 hid_dump_field vmlinux EXPORT_SYMBOL_GPL
++0xdb80a388 __module_text_address vmlinux EXPORT_SYMBOL_GPL
++0x66d87d38 symbol_put_addr vmlinux EXPORT_SYMBOL_GPL
++0x2a639aaf hrtimer_start_range_ns vmlinux EXPORT_SYMBOL_GPL
++0x7c62d042 cpu_possible_mask vmlinux EXPORT_SYMBOL
++0x65319f3d llc_set_station_handler vmlinux EXPORT_SYMBOL
++0x12500d33 i2c_smbus_read_word_data vmlinux EXPORT_SYMBOL
++0xc2ac0cfe tty_buffer_request_room vmlinux EXPORT_SYMBOL_GPL
++0x00b37551 d_alloc vmlinux EXPORT_SYMBOL
++0xf7b796cc unuse_mm vmlinux EXPORT_SYMBOL_GPL
++0x0b73663b __alloc_pages_nodemask vmlinux EXPORT_SYMBOL
++0x2b0a269a elv_abort_queue vmlinux EXPORT_SYMBOL
++0xe189aa6f journal_extend vmlinux EXPORT_SYMBOL
++0x918ad429 ring_buffer_lock_reserve vmlinux EXPORT_SYMBOL_GPL
++0xe2755929 irq_set_affinity_hint vmlinux EXPORT_SYMBOL_GPL
++0x3abc78ce dev_err vmlinux EXPORT_SYMBOL
++0xfcfa8b04 blk_execute_rq_nowait vmlinux EXPORT_SYMBOL_GPL
++0x6d02eb17 udp_proc_register vmlinux EXPORT_SYMBOL
++0x7bf1cc3b kernel_sendpage vmlinux EXPORT_SYMBOL
++0x9d7e0cfa pci_choose_state vmlinux EXPORT_SYMBOL
++0x0a6c9682 delete_from_page_cache vmlinux EXPORT_SYMBOL
++0x3b615a21 wait_for_completion_killable vmlinux EXPORT_SYMBOL
++0x50c89f23 __alloc_percpu vmlinux EXPORT_SYMBOL_GPL
++0xe7cd06a1 scsi_cmd_get_serial vmlinux EXPORT_SYMBOL
++0xbd8ed748 svc_close_xprt vmlinux EXPORT_SYMBOL_GPL
++0x2fb84137 neigh_parms_release vmlinux EXPORT_SYMBOL
++0xbfd18198 mmc_card_awake vmlinux EXPORT_SYMBOL
++0xba386aa9 usb_hcd_link_urb_to_ep vmlinux EXPORT_SYMBOL_GPL
++0x50c6ae87 device_release_driver vmlinux EXPORT_SYMBOL_GPL
++0xa01f4485 swiotlb_alloc_coherent vmlinux EXPORT_SYMBOL
++0x572e85d4 blk_lookup_devt vmlinux EXPORT_SYMBOL
++0xe415316a crypto_grab_skcipher vmlinux EXPORT_SYMBOL_GPL
++0xe953b21f get_next_ino vmlinux EXPORT_SYMBOL
++0x546c5565 ppc_tb_freq vmlinux EXPORT_SYMBOL_GPL
++0x0bf06d6d usb_serial_handle_dcd_change vmlinux EXPORT_SYMBOL_GPL
++0xcd1bbf43 usb_stor_bulk_srb vmlinux EXPORT_SYMBOL_GPL
++0x326ee682 usb_alloc_streams vmlinux EXPORT_SYMBOL_GPL
++0x984ca836 scsi_register_interface vmlinux EXPORT_SYMBOL
++0xeb72182a vfs_setlease vmlinux EXPORT_SYMBOL_GPL
++0x40d04664 console_trylock vmlinux EXPORT_SYMBOL
++0x2ee496e6 i2c_smbus_read_block_data vmlinux EXPORT_SYMBOL
++0x71d6687e usb_put_intf vmlinux EXPORT_SYMBOL_GPL
++0x5040a36f blk_queue_dma_pad vmlinux EXPORT_SYMBOL
++0x0521b2ee set_current_groups vmlinux EXPORT_SYMBOL
++0xb1c6e787 wait_for_completion_timeout vmlinux EXPORT_SYMBOL
++0x107aa06a dcb_ieee_getapp_mask vmlinux EXPORT_SYMBOL
++0x60ac991d xfrm6_input_addr vmlinux EXPORT_SYMBOL
++0x3aa32d81 usb_stor_probe2 vmlinux EXPORT_SYMBOL_GPL
++0x12cd39ae usb_stor_probe1 vmlinux EXPORT_SYMBOL_GPL
++0x81db6ebb xz_dec_reset vmlinux EXPORT_SYMBOL
++0x661601de sprint_symbol vmlinux EXPORT_SYMBOL_GPL
++0x6e8698ee scm_fp_dup vmlinux EXPORT_SYMBOL
++0x9c2b3860 mmc_card_can_sleep vmlinux EXPORT_SYMBOL
++0x6a7e90da devres_remove vmlinux EXPORT_SYMBOL_GPL
++0x30e28a09 tty_vhangup vmlinux EXPORT_SYMBOL
++0xd3434c3f kref_sub vmlinux EXPORT_SYMBOL
++0x2ce98559 kcrypto_wq vmlinux EXPORT_SYMBOL_GPL
++0x8f860b23 shrink_dcache_parent vmlinux EXPORT_SYMBOL
++0x75c8a11c inet_twdr_twkill_work vmlinux EXPORT_SYMBOL_GPL
++0x609f1c7e synchronize_net vmlinux EXPORT_SYMBOL
++0xa638cf54 bus_for_each_dev vmlinux EXPORT_SYMBOL_GPL
++0x8dcf576a bus_for_each_drv vmlinux EXPORT_SYMBOL_GPL
++0x42825ce2 rcu_scheduler_active vmlinux EXPORT_SYMBOL_GPL
++0xe523ad75 synchronize_irq vmlinux EXPORT_SYMBOL
++0xfa393103 pneigh_lookup vmlinux EXPORT_SYMBOL
++0x0ba2668c kern_path_create vmlinux EXPORT_SYMBOL
++0xc47cdf9c _raw_write_lock_bh vmlinux EXPORT_SYMBOL
++0x72dc286d xdr_terminate_string vmlinux EXPORT_SYMBOL_GPL
++0x28531ce3 blk_queue_find_tag vmlinux EXPORT_SYMBOL
++0x4bc62a81 audit_enabled vmlinux EXPORT_SYMBOL_GPL
++0xd8a2ab95 in_egroup_p vmlinux EXPORT_SYMBOL
++0x919d1163 tty_termios_baud_rate vmlinux EXPORT_SYMBOL
++0x184e6c85 radix_tree_gang_lookup_slot vmlinux EXPORT_SYMBOL
++0xcdb01877 ktime_add_ns vmlinux EXPORT_SYMBOL_GPL
++0x8b96c05a nf_conntrack_broadcast_help net/netfilter/nf_conntrack_broadcast EXPORT_SYMBOL_GPL
++0xcb6e6aa8 skb_append_datato_frags vmlinux EXPORT_SYMBOL
++0x9e0c711d vzalloc_node vmlinux EXPORT_SYMBOL
++0x7f24de73 jiffies_to_usecs vmlinux EXPORT_SYMBOL
++0x37befc70 jiffies_to_msecs vmlinux EXPORT_SYMBOL
++0x436c2179 iowrite32 vmlinux EXPORT_SYMBOL
++0x8c183cbe iowrite16 vmlinux EXPORT_SYMBOL
++0x17774e80 tcp_child_process vmlinux EXPORT_SYMBOL
++0xb6896671 crc_t10dif vmlinux EXPORT_SYMBOL
++0x9ab8808c param_get_charp vmlinux EXPORT_SYMBOL
++0x8025065c mdiobus_write vmlinux EXPORT_SYMBOL
++0x1f852c0d prepare_binprm vmlinux EXPORT_SYMBOL
++0x4db9ec4c tcp_v4_destroy_sock vmlinux EXPORT_SYMBOL
++0x6d6cbadc rb_last vmlinux EXPORT_SYMBOL
++0x7ab3ca18 eventfd_ctx_read vmlinux EXPORT_SYMBOL_GPL
++0x86eb50bf mount_bdev vmlinux EXPORT_SYMBOL
++0xe6fbe430 can_do_mlock vmlinux EXPORT_SYMBOL
++0x60a13e90 rcu_barrier vmlinux EXPORT_SYMBOL_GPL
++0xdf60cc27 __print_symbol vmlinux EXPORT_SYMBOL
++0x96c287fe ndisc_mc_map vmlinux EXPORT_SYMBOL
++0x55da0153 sysdev_register vmlinux EXPORT_SYMBOL_GPL
++0x91715312 sprintf vmlinux EXPORT_SYMBOL
++0x0d05dd4f simple_unlink vmlinux EXPORT_SYMBOL
++0xaa563302 simple_attr_write vmlinux EXPORT_SYMBOL_GPL
++0x099b48fd generic_listxattr vmlinux EXPORT_SYMBOL
++0xf6ebc03b net_ratelimit vmlinux EXPORT_SYMBOL
++0xf9c8fc44 dev_addr_init vmlinux EXPORT_SYMBOL
++0x09ae2253 mmc_host_disable vmlinux EXPORT_SYMBOL
++0x6559ae6c pci_set_ltr vmlinux EXPORT_SYMBOL
++0x1ebf6c2a pci_power_names vmlinux EXPORT_SYMBOL_GPL
++0x57e7529b shash_ahash_update vmlinux EXPORT_SYMBOL_GPL
++0x05c6b149 invalidate_inode_buffers vmlinux EXPORT_SYMBOL
++0x48bea168 scsi_register vmlinux EXPORT_SYMBOL
++0x764c2f05 crypto_shash_update vmlinux EXPORT_SYMBOL_GPL
++0x2eef0ac9 journal_dirty_data vmlinux EXPORT_SYMBOL
++0xb5e31b10 find_vma vmlinux EXPORT_SYMBOL
++0x0d0f4d51 nf_ct_extend_unregister net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x5c936853 svc_print_addr vmlinux EXPORT_SYMBOL_GPL
++0x12505fc7 kernel_connect vmlinux EXPORT_SYMBOL
++0xb8546237 inet_stream_connect vmlinux EXPORT_SYMBOL
++0xa05c03df mempool_kmalloc vmlinux EXPORT_SYMBOL
++0x8dc76dc4 qdisc_warn_nonwc vmlinux EXPORT_SYMBOL
++0x9a7a6123 pci_release_regions vmlinux EXPORT_SYMBOL
++0xc9eec5c2 splice_from_pipe_begin vmlinux EXPORT_SYMBOL
++0xfd6293c2 boot_tvec_bases vmlinux EXPORT_SYMBOL
++0x126cabd2 netdev_class_remove_file vmlinux EXPORT_SYMBOL
++0xbccdc2f6 flex_array_put vmlinux EXPORT_SYMBOL
++0x8164e310 blk_queue_physical_block_size vmlinux EXPORT_SYMBOL
++0x9b724801 nlmclnt_done vmlinux EXPORT_SYMBOL_GPL
++0xf9e2e40e dio_end_io vmlinux EXPORT_SYMBOL_GPL
++0x53735d40 relay_subbufs_consumed vmlinux EXPORT_SYMBOL_GPL
++0xc0bf6ead timecounter_cyc2time vmlinux EXPORT_SYMBOL_GPL
++0x37f6fee5 fsl_lbc_find vmlinux EXPORT_SYMBOL
++0x4f881b16 rtc_tm_to_ktime vmlinux EXPORT_SYMBOL_GPL
++0x325ffbe2 journal_ack_err vmlinux EXPORT_SYMBOL
++0x307c2fd0 generic_check_addressable vmlinux EXPORT_SYMBOL
++0xee2d8f00 perf_event_read_value vmlinux EXPORT_SYMBOL_GPL
++0xc065a455 cpu_core_index_of_thread vmlinux EXPORT_SYMBOL_GPL
++0x33dc9781 inet6_csk_addr2sockaddr vmlinux EXPORT_SYMBOL_GPL
++0x4c50029a netdev_refcnt_read vmlinux EXPORT_SYMBOL
++0xd1b2bc7a input_mt_init_slots vmlinux EXPORT_SYMBOL
++0xa16d230d devres_close_group vmlinux EXPORT_SYMBOL_GPL
++0xa92b183a __blk_end_request vmlinux EXPORT_SYMBOL
++0x7f7bc710 klist_next vmlinux EXPORT_SYMBOL_GPL
++0x0140c06a tcp_rcv_established vmlinux EXPORT_SYMBOL
++0x80c1ac2b ip_queue_rcv_skb vmlinux EXPORT_SYMBOL
++0x4865f9b3 inet_getpeer vmlinux EXPORT_SYMBOL_GPL
++0x3d0688cd xt_unregister_targets vmlinux EXPORT_SYMBOL
++0x4e592d6c spi_alloc_master vmlinux EXPORT_SYMBOL_GPL
++0xce53932d scsi_prep_fn vmlinux EXPORT_SYMBOL
++0xd7e56a4e simple_strtoll vmlinux EXPORT_SYMBOL
++0x20000329 simple_strtoul vmlinux EXPORT_SYMBOL
++0xa3c8685d nfs_initiate_commit vmlinux EXPORT_SYMBOL_GPL
++0xbedc5a25 fsnotify_destroy_mark vmlinux EXPORT_SYMBOL_GPL
++0x65400222 __irq_offset_value vmlinux EXPORT_SYMBOL
++0x540fbf55 nf_register_afinfo vmlinux EXPORT_SYMBOL_GPL
++0x783c65c7 net_ns_type_operations vmlinux EXPORT_SYMBOL_GPL
++0x0d733a10 proc_symlink vmlinux EXPORT_SYMBOL
++0x983c7494 rh_detach_region vmlinux EXPORT_SYMBOL_GPL
++0x6428da4f rh_attach_region vmlinux EXPORT_SYMBOL_GPL
++0xe0f45eeb __rtnl_link_unregister vmlinux EXPORT_SYMBOL_GPL
++0x5497669a blk_queue_dma_alignment vmlinux EXPORT_SYMBOL
++0xc51e0e79 remap_vmalloc_range vmlinux EXPORT_SYMBOL
++0xda869994 noop_backing_dev_info vmlinux EXPORT_SYMBOL_GPL
++0xd985dc99 mempool_free_pages vmlinux EXPORT_SYMBOL
++0xfcec0987 enable_irq vmlinux EXPORT_SYMBOL
++0x1e7bbcb3 kernel_restart vmlinux EXPORT_SYMBOL_GPL
++0x0cc3cab1 dev_alloc_skb vmlinux EXPORT_SYMBOL
++0xdd27fa87 memchr vmlinux EXPORT_SYMBOL
++0xc18ac88d nf_ct_expect_hsize net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x7a00ec15 inet6_release vmlinux EXPORT_SYMBOL
++0xbeff3d59 of_get_parent vmlinux EXPORT_SYMBOL
++0x15a94e65 pci_destroy_slot vmlinux EXPORT_SYMBOL_GPL
++0x2cfc679e vfs_kern_mount vmlinux EXPORT_SYMBOL_GPL
++0xd5bd7dac ring_buffer_record_enable_cpu vmlinux EXPORT_SYMBOL_GPL
++0x1a3c4cdf local_flush_tlb_page vmlinux EXPORT_SYMBOL
++0x36bc9a29 gss_mech_list_pseudoflavors vmlinux EXPORT_SYMBOL_GPL
++0x977832e8 spi_bus_type vmlinux EXPORT_SYMBOL_GPL
++0x840efb10 anon_transport_class_unregister vmlinux EXPORT_SYMBOL_GPL
++0x315c65fd zlib_deflateInit2 vmlinux EXPORT_SYMBOL
++0x6bed2572 submit_bio vmlinux EXPORT_SYMBOL
++0x1aacd048 alloc_page_buffers vmlinux EXPORT_SYMBOL_GPL
++0xfbf9be5d register_oom_notifier vmlinux EXPORT_SYMBOL_GPL
++0xcfc68341 synchronize_rcu_bh vmlinux EXPORT_SYMBOL_GPL
++0x549525ef handle_nested_irq vmlinux EXPORT_SYMBOL_GPL
++0x25a81cc5 qe_get_firmware_info vmlinux EXPORT_SYMBOL
++0xd8525ea7 fl6_update_dst vmlinux EXPORT_SYMBOL_GPL
++0xa4e81ac2 tcp_valid_rtt_meas vmlinux EXPORT_SYMBOL
++0xe0a7f614 neigh_lookup vmlinux EXPORT_SYMBOL
++0x0680ca81 mmc_remove_host vmlinux EXPORT_SYMBOL
++0x7bd25d47 usb_put_hcd vmlinux EXPORT_SYMBOL_GPL
++0x2ef63ad6 scsi_dev_info_list_del_keyed vmlinux EXPORT_SYMBOL
++0x091c824a machine_power_off vmlinux EXPORT_SYMBOL_GPL
++0x3996b31d tcp_mtup_init vmlinux EXPORT_SYMBOL
++0x0ea07ec7 kstrtou8_from_user vmlinux EXPORT_SYMBOL
++0x973d0f9e kstrtoul_from_user vmlinux EXPORT_SYMBOL
++0x45cfa828 cache_purge vmlinux EXPORT_SYMBOL_GPL
++0x222e7ce2 sysfs_streq vmlinux EXPORT_SYMBOL
++0x71dd6c34 alloc_buffer_head vmlinux EXPORT_SYMBOL
++0x49dcec10 xdr_write_pages vmlinux EXPORT_SYMBOL_GPL
++0xbb73bb5c swiotlb_tbl_map_single vmlinux EXPORT_SYMBOL_GPL
++0x1ac51c1e device_remove_file vmlinux EXPORT_SYMBOL_GPL
++0x60506751 unmap_kernel_range_noflush vmlinux EXPORT_SYMBOL_GPL
++0x289c3714 nf_ct_alloc_hashtable net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x49ffc48e ipv6_skip_exthdr vmlinux EXPORT_SYMBOL
++0x5b723c46 ip_options_compile vmlinux EXPORT_SYMBOL
++0x45a37cf4 aio_complete vmlinux EXPORT_SYMBOL
++0x44402b6f param_get_ulong vmlinux EXPORT_SYMBOL
++0x0b19ea8e kill_pid vmlinux EXPORT_SYMBOL
++0x69642f88 pcibios_bus_to_resource vmlinux EXPORT_SYMBOL
++0xea710ef9 rt6_lookup vmlinux EXPORT_SYMBOL
++0x12f99022 inet_frags_init_net vmlinux EXPORT_SYMBOL
++0x796b252b device_store_int vmlinux EXPORT_SYMBOL_GPL
++0x64999478 congestion_wait vmlinux EXPORT_SYMBOL
++0x59eae699 ring_buffer_read_prepare vmlinux EXPORT_SYMBOL_GPL
++0xe4a65c70 i2c_del_driver vmlinux EXPORT_SYMBOL
++0x419b695a blk_queue_dma_drain vmlinux EXPORT_SYMBOL_GPL
++0x9d8331c0 ring_buffer_read_page vmlinux EXPORT_SYMBOL_GPL
++0xae545f06 _raw_write_unlock_irqrestore vmlinux EXPORT_SYMBOL
++0xbad26090 __atomic_notifier_call_chain vmlinux EXPORT_SYMBOL_GPL
++0x057ce975 hex_dump_to_buffer vmlinux EXPORT_SYMBOL
++0x119db340 file_ra_state_init vmlinux EXPORT_SYMBOL_GPL
++0xcd212027 usb_alloc_coherent vmlinux EXPORT_SYMBOL_GPL
++0x74b35a2e crypto_larval_kill vmlinux EXPORT_SYMBOL_GPL
++0xfaa1f7a6 xfrm_register_mode vmlinux EXPORT_SYMBOL
++0xb0559860 inet_csk_get_port vmlinux EXPORT_SYMBOL_GPL
++0x20e9c644 mmc_flush_cache vmlinux EXPORT_SYMBOL
++0xd5f63191 i2c_clients_command vmlinux EXPORT_SYMBOL
++0xd77c0bc8 klist_remove vmlinux EXPORT_SYMBOL_GPL
++0xff121d12 ethtool_op_get_ufo vmlinux EXPORT_SYMBOL
++0x3755e17d dev_get_flags vmlinux EXPORT_SYMBOL
++0x5296e7f4 usb_get_status vmlinux EXPORT_SYMBOL_GPL
++0x790df6ca __wait_on_bit_lock vmlinux EXPORT_SYMBOL
++0x5a4eec67 svc_auth_register vmlinux EXPORT_SYMBOL_GPL
++0xe5122890 flow_cache_genid vmlinux EXPORT_SYMBOL
++0x2c919c63 gen_new_estimator vmlinux EXPORT_SYMBOL
++0x0c812da4 input_class vmlinux EXPORT_SYMBOL_GPL
++0x4e00ab3c pci_set_master vmlinux EXPORT_SYMBOL
++0xfcc8f571 crypto_alg_mod_lookup vmlinux EXPORT_SYMBOL_GPL
++0x31c5af62 freeze_super vmlinux EXPORT_SYMBOL
++0x00c0514b __devm_request_region vmlinux EXPORT_SYMBOL
++0xfb905a24 hid_connect vmlinux EXPORT_SYMBOL_GPL
++0x4b824206 mmc_set_data_timeout vmlinux EXPORT_SYMBOL
++0x1040ca42 usb_set_device_state vmlinux EXPORT_SYMBOL_GPL
++0x12c83422 scsi_eh_finish_cmd vmlinux EXPORT_SYMBOL
++0x87177c3d mmc_can_reset vmlinux EXPORT_SYMBOL
++0x5bc4f32c cpu_rmap_update vmlinux EXPORT_SYMBOL
++0xdd0a2ba2 strlcat vmlinux EXPORT_SYMBOL
++0xd627480b strncat vmlinux EXPORT_SYMBOL
++0xcfeb0be9 rb_augment_erase_begin vmlinux EXPORT_SYMBOL
++0xd6c357db blk_queue_max_discard_sectors vmlinux EXPORT_SYMBOL
++0xd2965f6f kthread_should_stop vmlinux EXPORT_SYMBOL
++0xd0ad960f nfnetlink_set_err net/netfilter/nfnetlink EXPORT_SYMBOL_GPL
++0x1c460693 netdev_notice vmlinux EXPORT_SYMBOL
++0x7f185424 blk_rq_map_kern vmlinux EXPORT_SYMBOL
++0x551de792 sync_mapping_buffers vmlinux EXPORT_SYMBOL
++0x4ac7a222 usb_serial_handle_break vmlinux EXPORT_SYMBOL_GPL
++0x204d23f2 __scsi_add_device vmlinux EXPORT_SYMBOL
++0xaaec89e2 fat_scan vmlinux EXPORT_SYMBOL_GPL
++0x4ca16694 inode_change_ok vmlinux EXPORT_SYMBOL
++0xf1a0626d datagram_poll vmlinux EXPORT_SYMBOL
++0x69d38ed9 __scsi_print_sense vmlinux EXPORT_SYMBOL
++0xf0c18cc1 blk_queue_end_tag vmlinux EXPORT_SYMBOL
++0x1e9edfb7 seq_hlist_start_head_rcu vmlinux EXPORT_SYMBOL
++0x87604ac8 dev_mc_flush vmlinux EXPORT_SYMBOL
++0xf0eb6c0e dev_uc_flush vmlinux EXPORT_SYMBOL
++0xd9fb3de3 usb_stor_Bulk_transport vmlinux EXPORT_SYMBOL_GPL
++0x0bc753c7 flush_old_exec vmlinux EXPORT_SYMBOL
++0x00c4dc87 timecounter_init vmlinux EXPORT_SYMBOL_GPL
++0x0c9b6089 nvram_get_size vmlinux EXPORT_SYMBOL
++0xad9e43be inet_addr_type vmlinux EXPORT_SYMBOL
++0xf22414e2 inet_recvmsg vmlinux EXPORT_SYMBOL
++0xd454b29f llc_sap_close vmlinux EXPORT_SYMBOL
++0x80132d25 mdiobus_unregister vmlinux EXPORT_SYMBOL
++0x65291cff timekeeping_inject_offset vmlinux EXPORT_SYMBOL
++0x7be4827c pci_dram_offset vmlinux EXPORT_SYMBOL
++0xb09c5030 phy_detach vmlinux EXPORT_SYMBOL
++0x01b08eb0 mii_link_ok vmlinux EXPORT_SYMBOL
++0xc741f047 nfs_commitdata_alloc vmlinux EXPORT_SYMBOL_GPL
++0x5892f832 release_pmc_hardware vmlinux EXPORT_SYMBOL_GPL
++0x583c4f4e nf_conntrack_l4proto_udp6 net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xb0a8c94f tcp_proc_register vmlinux EXPORT_SYMBOL
++0x2a939f0e stop_tty vmlinux EXPORT_SYMBOL
++0xb7a99781 __irq_regs vmlinux EXPORT_SYMBOL
++0x774406ff generic_write_sync vmlinux EXPORT_SYMBOL
++0xf5b52822 sdio_writel vmlinux EXPORT_SYMBOL_GPL
++0xa0088161 nfs_pageio_reset_write_mds vmlinux EXPORT_SYMBOL_GPL
++0x92a84998 xfrm_policy_destroy vmlinux EXPORT_SYMBOL
++0x0538c307 sdhci_pltfm_register vmlinux EXPORT_SYMBOL_GPL
++0x43ed8622 sdio_memcpy_toio vmlinux EXPORT_SYMBOL_GPL
++0xb0a6f554 neigh_ifdown vmlinux EXPORT_SYMBOL
++0x00d43c47 cfi_fixup vmlinux EXPORT_SYMBOL
++0x6c1ce5ce strcspn vmlinux EXPORT_SYMBOL
++0x6cc25857 thermal_zone_unbind_cooling_device vmlinux EXPORT_SYMBOL
++0xcea93771 do_kern_mount vmlinux EXPORT_SYMBOL_GPL
++0xa32cec39 nf_conntrack_l3proto_register net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xdfb4377e nf_conntrack_l4proto_register net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xd4b929a5 hid_parse_report vmlinux EXPORT_SYMBOL_GPL
++0xc9b13a79 usb_serial_resume vmlinux EXPORT_SYMBOL
++0xad85acb1 blkdev_aio_write vmlinux EXPORT_SYMBOL_GPL
++0xfc21ea7b seq_bitmap_list vmlinux EXPORT_SYMBOL
++0xaec655c7 alloc_pages_exact vmlinux EXPORT_SYMBOL
++0x283780f9 gss_svc_to_pseudoflavor vmlinux EXPORT_SYMBOL_GPL
++0xeb5f1beb svc_find_xprt vmlinux EXPORT_SYMBOL_GPL
++0xb27c96eb svc_process vmlinux EXPORT_SYMBOL_GPL
++0xf40325f9 rpc_force_rebind vmlinux EXPORT_SYMBOL_GPL
++0x031337c7 __nla_reserve vmlinux EXPORT_SYMBOL
++0x29537c9e alloc_chrdev_region vmlinux EXPORT_SYMBOL
++0xa794e5af inc_zone_page_state vmlinux EXPORT_SYMBOL
++0xbe2ae37c nf_ct_iterate_cleanup net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x159caf84 rpc_killall_tasks vmlinux EXPORT_SYMBOL_GPL
++0x7faee9ca arp_find vmlinux EXPORT_SYMBOL
++0xc9e3b1e4 skb_checksum vmlinux EXPORT_SYMBOL
++0x2ccabce7 deregister_mtd_blktrans vmlinux EXPORT_SYMBOL_GPL
++0x8d8718ca pci_pme_capable vmlinux EXPORT_SYMBOL
++0xbdf5c25c rb_next vmlinux EXPORT_SYMBOL
++0xca4c7f40 inode_permission vmlinux EXPORT_SYMBOL
++0xcc3e77da buffer_migrate_page vmlinux EXPORT_SYMBOL
++0x519b0da3 finish_wait vmlinux EXPORT_SYMBOL
++0x4a290d4d cur_cpu_spec vmlinux EXPORT_SYMBOL
++0x564f1dca klist_add_after vmlinux EXPORT_SYMBOL_GPL
++0xd329f4b2 svc_xprt_init vmlinux EXPORT_SYMBOL_GPL
++0x52d7b2fd llc_sap_list vmlinux EXPORT_SYMBOL
++0x91fe4a85 phy_start_aneg vmlinux EXPORT_SYMBOL
++0x8695c5de scsi_print_result vmlinux EXPORT_SYMBOL
++0x4cbbd171 __bitmap_weight vmlinux EXPORT_SYMBOL
++0x61b7b126 simple_strtoull vmlinux EXPORT_SYMBOL
++0x528c709d simple_read_from_buffer vmlinux EXPORT_SYMBOL
++0x349e53f1 clockevent_delta2ns vmlinux EXPORT_SYMBOL_GPL
++0x6eb85693 nf_defrag_ipv6_enable net/ipv6/netfilter/nf_defrag_ipv6 EXPORT_SYMBOL_GPL
++0x6b6c3d10 nf_defrag_ipv4_enable net/ipv4/netfilter/nf_defrag_ipv4 EXPORT_SYMBOL_GPL
++0xa681fe88 generate_random_uuid vmlinux EXPORT_SYMBOL
++0xad1bb027 nf_ct_free_hashtable net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xc181af4a get_net_ns_by_pid vmlinux EXPORT_SYMBOL_GPL
++0xa1c47d5e mmc_power_save_host vmlinux EXPORT_SYMBOL
++0x86a1aabc vfs_statfs vmlinux EXPORT_SYMBOL
++0x8a50868d iterate_mounts vmlinux EXPORT_SYMBOL_GPL
++0x45838122 udp_ioctl vmlinux EXPORT_SYMBOL
++0xa02f471b i2c_new_probed_device vmlinux EXPORT_SYMBOL_GPL
++0x2e258c1f cfi_cmdset_0003 vmlinux EXPORT_SYMBOL_GPL
++0xe5ccb818 cfi_cmdset_0001 vmlinux EXPORT_SYMBOL_GPL
++0x037508a0 cfi_cmdset_0200 vmlinux EXPORT_SYMBOL_GPL
++0xeacafb73 cfi_cmdset_0006 vmlinux EXPORT_SYMBOL_GPL
++0xa669953c cfi_cmdset_0002 vmlinux EXPORT_SYMBOL_GPL
++0x8c101558 cfi_cmdset_0701 vmlinux EXPORT_SYMBOL_GPL
++0xf32fddac cfi_cmdset_0020 vmlinux EXPORT_SYMBOL_GPL
++0x58d4f625 __pci_complete_power_transition vmlinux EXPORT_SYMBOL_GPL
++0x0223b9bf __nla_reserve_nohdr vmlinux EXPORT_SYMBOL
++0x11fac1b6 __get_page_tail vmlinux EXPORT_SYMBOL
++0x5f5fc264 rtnetlink_put_metrics vmlinux EXPORT_SYMBOL
++0xea10212a int_to_scsilun vmlinux EXPORT_SYMBOL
++0x96fae2c1 may_umount vmlinux EXPORT_SYMBOL
++0xf6f92407 pcix_get_max_mmrbc vmlinux EXPORT_SYMBOL
++0x0b508415 block_read_full_page vmlinux EXPORT_SYMBOL
++0xf7535902 console_drivers vmlinux EXPORT_SYMBOL_GPL
++0x8de519db mmc_hw_reset vmlinux EXPORT_SYMBOL
++0x015ffc4f __scsi_alloc_queue vmlinux EXPORT_SYMBOL
++0x277ba2d9 bus_sort_breadthfirst vmlinux EXPORT_SYMBOL_GPL
++0xe11c50a5 ipt_alloc_initial_table net/ipv4/netfilter/ip_tables EXPORT_SYMBOL_GPL
++0x86c14d2e tcp_v4_connect vmlinux EXPORT_SYMBOL
++0x2c2f763c tcp_sync_mss vmlinux EXPORT_SYMBOL
++0xd0c05159 emergency_restart vmlinux EXPORT_SYMBOL_GPL
++0x3ff62317 local_bh_disable vmlinux EXPORT_SYMBOL
++0x3c5a83ec tcp_death_row vmlinux EXPORT_SYMBOL_GPL
++0xe187693c kstrtouint_from_user vmlinux EXPORT_SYMBOL
++0x1f3e84a0 bio_get_nr_vecs vmlinux EXPORT_SYMBOL
++0xf92a5458 xfrm_policy_byid vmlinux EXPORT_SYMBOL
++0xc871c13b pci_prepare_to_sleep vmlinux EXPORT_SYMBOL
++0x0f6690cf ahash_register_instance vmlinux EXPORT_SYMBOL_GPL
++0x686145ef load_nls_default vmlinux EXPORT_SYMBOL
++0xf209fa23 nonseekable_open vmlinux EXPORT_SYMBOL
++0x3d9e1db6 kmem_cache_create vmlinux EXPORT_SYMBOL
++0x475100c2 inet_get_local_port_range vmlinux EXPORT_SYMBOL
++0xd5683a1b __seq_open_private vmlinux EXPORT_SYMBOL
++0x13bdfe24 seq_escape vmlinux EXPORT_SYMBOL
++0x3108ea46 xfrm_ealg_get_byname vmlinux EXPORT_SYMBOL_GPL
++0x48c5e0f4 of_mdiobus_register vmlinux EXPORT_SYMBOL
++0x22692356 d_alloc_root vmlinux EXPORT_SYMBOL
++0xa0243187 page_address vmlinux EXPORT_SYMBOL
++0x89c72573 xfrm_lookup vmlinux EXPORT_SYMBOL
++0xc4a5fb77 skb_store_bits vmlinux EXPORT_SYMBOL
++0x9565a5a2 page_cache_sync_readahead vmlinux EXPORT_SYMBOL_GPL
++0x79c480da rh_dump vmlinux EXPORT_SYMBOL_GPL
++0xfba770b8 pcibios_fixup_bus vmlinux EXPORT_SYMBOL
++0xa93da361 inet_unregister_protosw vmlinux EXPORT_SYMBOL
++0x7cef3f58 i2c_probe_func_quick_read vmlinux EXPORT_SYMBOL_GPL
++0x65c8d17e i2c_smbus_read_byte vmlinux EXPORT_SYMBOL
++0x294d91c5 platform_create_bundle vmlinux EXPORT_SYMBOL_GPL
++0x99dc6ab8 _dev_info vmlinux EXPORT_SYMBOL
++0x1e4a32eb mb_cache_entry_free vmlinux EXPORT_SYMBOL
++0xeeac816f svc_xprt_put vmlinux EXPORT_SYMBOL_GPL
++0x1345ef47 ethtool_op_get_flags vmlinux EXPORT_SYMBOL
++0xa31feac5 blkcipher_walk_phys vmlinux EXPORT_SYMBOL_GPL
++0x3dfc897c seq_hlist_start_head vmlinux EXPORT_SYMBOL
++0xc34ff0bb clocksource_change_rating vmlinux EXPORT_SYMBOL
++0x9272763d sdio_set_block_size vmlinux EXPORT_SYMBOL_GPL
++0x439751b0 usb_stor_post_reset vmlinux EXPORT_SYMBOL_GPL
++0x9924c496 __usb_get_extra_descriptor vmlinux EXPORT_SYMBOL_GPL
++0xb0b3b849 pci_bus_assign_resources vmlinux EXPORT_SYMBOL
++0x9159b9d6 profile_event_register vmlinux EXPORT_SYMBOL_GPL
++0x6ca4d6ee __nf_conntrack_helper_find net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xd251093f nfs_generic_pg_test vmlinux EXPORT_SYMBOL_GPL
++0x5460c8d8 fsnotify_get_cookie vmlinux EXPORT_SYMBOL_GPL
++0xbeeb9715 dcb_getapp vmlinux EXPORT_SYMBOL
++0xb9a9fe46 dcb_setapp vmlinux EXPORT_SYMBOL
++0xb84d7d46 register_netdevice vmlinux EXPORT_SYMBOL
++0x0c38172a usb_serial_generic_open vmlinux EXPORT_SYMBOL_GPL
++0xfc532eb4 scsi_finish_command vmlinux EXPORT_SYMBOL
++0x11f447ce __gpio_to_irq vmlinux EXPORT_SYMBOL_GPL
++0xeba6034f user_describe vmlinux EXPORT_SYMBOL_GPL
++0x1fb3a608 blkdev_put vmlinux EXPORT_SYMBOL
++0xae6c3303 blkdev_get vmlinux EXPORT_SYMBOL
++0xc7c3a66d tcp_get_info vmlinux EXPORT_SYMBOL_GPL
++0x7a39ec0d __alloc_skb vmlinux EXPORT_SYMBOL
++0x8226642f __gpio_cansleep vmlinux EXPORT_SYMBOL_GPL
++0x98c5718a mutex_trylock vmlinux EXPORT_SYMBOL
++0xe24d3a97 jiffies_64 vmlinux EXPORT_SYMBOL
++0x61eef2c9 _insb vmlinux EXPORT_SYMBOL
++0x89863b3d svc_create vmlinux EXPORT_SYMBOL_GPL
++0xe387568c rpc_lookup_machine_cred vmlinux EXPORT_SYMBOL_GPL
++0x272caed2 pci_cleanup_aer_uncorrect_error_status vmlinux EXPORT_SYMBOL_GPL
++0x6def2db2 half_md4_transform vmlinux EXPORT_SYMBOL
++0xb835b3e4 radix_tree_prev_hole vmlinux EXPORT_SYMBOL
++0xd23a5bcb dcache_readdir vmlinux EXPORT_SYMBOL
++0x0b5cb616 inode_add_bytes vmlinux EXPORT_SYMBOL
++0xdb03e514 thaw_super vmlinux EXPORT_SYMBOL
++0x992edcea generic_file_mmap vmlinux EXPORT_SYMBOL
++0x3bf0c89b abort_creds vmlinux EXPORT_SYMBOL
++0x38b92846 llc_remove_pack vmlinux EXPORT_SYMBOL
++0x4188d439 neigh_rand_reach_time vmlinux EXPORT_SYMBOL
++0x5009e8d3 dev_forward_skb vmlinux EXPORT_SYMBOL_GPL
++0x88a779be sock_common_getsockopt vmlinux EXPORT_SYMBOL
++0xf532f540 sock_common_setsockopt vmlinux EXPORT_SYMBOL
++0xfb09342d n_tty_inherit_ops vmlinux EXPORT_SYMBOL_GPL
++0x65d6d0f0 gpio_direction_input vmlinux EXPORT_SYMBOL_GPL
++0x65408378 zlib_inflate_blob vmlinux EXPORT_SYMBOL
++0x14e837a0 idr_find vmlinux EXPORT_SYMBOL
++0xf1da72e2 vfs_mknod vmlinux EXPORT_SYMBOL
++0xca0bb1d5 ethtool_op_get_sg vmlinux EXPORT_SYMBOL
++0x1c7611b9 skb_dequeue vmlinux EXPORT_SYMBOL
++0x977653c9 filemap_write_and_wait vmlinux EXPORT_SYMBOL
++0x27bbf221 disable_irq_nosync vmlinux EXPORT_SYMBOL
++0x24a79d66 call_usermodehelper_freeinfo vmlinux EXPORT_SYMBOL
++0x00000000 softirq_work_list vmlinux EXPORT_SYMBOL
++0x14e7ca7c alloc_cpu_rmap vmlinux EXPORT_SYMBOL
++0xbc3d7933 netdev_features_change vmlinux EXPORT_SYMBOL
++0x50d5aae6 platform_get_resource_byname vmlinux EXPORT_SYMBOL_GPL
++0x7272c3c8 cpu_online_mask vmlinux EXPORT_SYMBOL
++0x62813e5c nf_ct_port_nlattr_tuple_size net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xe39bc3c9 of_find_node_by_type vmlinux EXPORT_SYMBOL
++0x5fee0ee3 of_find_node_by_path vmlinux EXPORT_SYMBOL
++0x8de66ff6 phy_start vmlinux EXPORT_SYMBOL
++0x2e919a67 devres_find vmlinux EXPORT_SYMBOL_GPL
++0x5df73517 proc_dostring vmlinux EXPORT_SYMBOL
++0xb54533f7 usecs_to_jiffies vmlinux EXPORT_SYMBOL
++0x0037d54d xt_hook_link vmlinux EXPORT_SYMBOL_GPL
++0xb93e2e16 pci_bus_write_config_byte vmlinux EXPORT_SYMBOL
++0x090d7ed0 sysfs_schedule_callback vmlinux EXPORT_SYMBOL_GPL
++0xabcaa577 free_anon_bdev vmlinux EXPORT_SYMBOL
++0xfb7d26f4 files_lglock_lock_init vmlinux EXPORT_SYMBOL
++0xa601a566 raw_hash_sk vmlinux EXPORT_SYMBOL_GPL
++0xa2ef34d7 rps_sock_flow_table vmlinux EXPORT_SYMBOL
++0x9b08b01c skb_insert vmlinux EXPORT_SYMBOL
++0x87ae2dae usb_stor_control_msg vmlinux EXPORT_SYMBOL_GPL
++0x18f9dd97 dev_emerg vmlinux EXPORT_SYMBOL
++0xb012f582 journal_force_commit_nested vmlinux EXPORT_SYMBOL
++0x1c132024 request_any_context_irq vmlinux EXPORT_SYMBOL_GPL
++0xedc410d0 udplite_table vmlinux EXPORT_SYMBOL
++0xbdc36d56 tc_classify_compat vmlinux EXPORT_SYMBOL
++0xcf469f8a blk_queue_max_segment_size vmlinux EXPORT_SYMBOL
++0xf158f170 klist_add_tail vmlinux EXPORT_SYMBOL_GPL
++0x2499acdc dev_kfree_skb_irq vmlinux EXPORT_SYMBOL
++0x8e0fe91b kill_mtd_super vmlinux EXPORT_SYMBOL_GPL
++0x1a2cbf5f pci_find_ext_capability vmlinux EXPORT_SYMBOL_GPL
++0xb9592633 log_wait_commit vmlinux EXPORT_SYMBOL
++0x6e9dd606 __symbol_put vmlinux EXPORT_SYMBOL
++0x884f0c0b netpoll_send_udp vmlinux EXPORT_SYMBOL
++0x89085598 genphy_restart_aneg vmlinux EXPORT_SYMBOL
++0x651b6806 pci_claim_resource vmlinux EXPORT_SYMBOL
++0x9b388444 get_zeroed_page vmlinux EXPORT_SYMBOL
++0xe7bf317d fsl_lbc_addr vmlinux EXPORT_SYMBOL
++0xa1c4b6d2 of_translate_dma_address vmlinux EXPORT_SYMBOL
++0x36d57a24 of_device_is_available vmlinux EXPORT_SYMBOL
++0x6b90f49a input_close_device vmlinux EXPORT_SYMBOL
++0x6bd60be5 key_validate vmlinux EXPORT_SYMBOL
++0xcaea3297 rtnl_create_link vmlinux EXPORT_SYMBOL
++0x92e047fd phy_connect_direct vmlinux EXPORT_SYMBOL
++0xba6f5ed2 tty_insert_flip_string_flags vmlinux EXPORT_SYMBOL
++0xb7188ca3 address_space_init_once vmlinux EXPORT_SYMBOL
++0x8f85f835 prepare_to_wait_exclusive vmlinux EXPORT_SYMBOL
++0x1105338b xfrm_audit_state_replay vmlinux EXPORT_SYMBOL_GPL
++0x0b0fcce8 inet_dev_addr_type vmlinux EXPORT_SYMBOL
++0xe792f22e platform_device_add vmlinux EXPORT_SYMBOL_GPL
++0x035223fb debugfs_create_size_t vmlinux EXPORT_SYMBOL_GPL
++0xdc9c0fca remove_proc_entry vmlinux EXPORT_SYMBOL
++0xd547ec64 fsnotify_add_mark vmlinux EXPORT_SYMBOL_GPL
++0xa502eb8f arpt_register_table net/ipv4/netfilter/arp_tables EXPORT_SYMBOL
++0xbe27f880 ipv6_opt_accepted vmlinux EXPORT_SYMBOL_GPL
++0x46b75886 xfrm_spd_getinfo vmlinux EXPORT_SYMBOL
++0xcd13ff57 pci_walk_bus vmlinux EXPORT_SYMBOL_GPL
++0xf729527b block_is_partially_uptodate vmlinux EXPORT_SYMBOL
++0xd9ecb670 ring_buffer_overruns vmlinux EXPORT_SYMBOL_GPL
++0xcee467f3 xprt_load_transport vmlinux EXPORT_SYMBOL_GPL
++0x9a13af3e alloc_etherdev_mqs vmlinux EXPORT_SYMBOL
++0x2179d22c uart_resume_port vmlinux EXPORT_SYMBOL
++0x83d9de3d ahash_free_instance vmlinux EXPORT_SYMBOL_GPL
++0xe965217d bdi_register_dev vmlinux EXPORT_SYMBOL
++0x9a303feb xt_rateest_lookup net/netfilter/xt_RATEEST EXPORT_SYMBOL_GPL
++0x076eb1e3 nfs_commit_clear_lock vmlinux EXPORT_SYMBOL_GPL
++0x2b76aaca pagecache_write_end vmlinux EXPORT_SYMBOL
++0xc4708199 cpm_muram_addr vmlinux EXPORT_SYMBOL
++0xf5629e6e rpc_clone_client vmlinux EXPORT_SYMBOL_GPL
++0x45704bee xfrm_audit_state_icvfail vmlinux EXPORT_SYMBOL_GPL
++0xb9da2997 snmp_fold_field64 vmlinux EXPORT_SYMBOL_GPL
++0x42621f9f of_get_next_child vmlinux EXPORT_SYMBOL
++0x2618e30b hid_resolv_usage vmlinux EXPORT_SYMBOL_GPL
++0x3e44ea18 sdio_f0_readb vmlinux EXPORT_SYMBOL_GPL
++0x6b645db0 spi_register_master vmlinux EXPORT_SYMBOL_GPL
++0xcc36f32e fb_unregister_client vmlinux EXPORT_SYMBOL
++0x87925ca6 kstrtoint_from_user vmlinux EXPORT_SYMBOL
++0xfde0b92c crypto_larval_error vmlinux EXPORT_SYMBOL_GPL
++0xc8d428d1 __nf_ct_l4proto_find net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x9e9e305b xfrm_inner_extract_output vmlinux EXPORT_SYMBOL_GPL
++0x564436dc inet_csk_init_xmit_timers vmlinux EXPORT_SYMBOL
++0x1b52db1c probe_kernel_read vmlinux EXPORT_SYMBOL_GPL
++0x8111c5eb kmap_atomic_prot vmlinux EXPORT_SYMBOL
++0x900d37fb transport_add_device vmlinux EXPORT_SYMBOL_GPL
++0xbee5ca31 vfs_readlink vmlinux EXPORT_SYMBOL
++0xd00652f3 timecompare_offset vmlinux EXPORT_SYMBOL_GPL
++0x68609857 complete_and_exit vmlinux EXPORT_SYMBOL
++0x6cfe0225 inet6_lookup vmlinux EXPORT_SYMBOL_GPL
++0xae4c9e70 sysfs_remove_group vmlinux EXPORT_SYMBOL_GPL
++0xf583db29 sysfs_remove_file_from_group vmlinux EXPORT_SYMBOL_GPL
++0x83ce82eb get_monotonic_boottime vmlinux EXPORT_SYMBOL_GPL
++0xc91ff664 down_read_trylock vmlinux EXPORT_SYMBOL
++0x4235ac11 dcbnl_cee_notify vmlinux EXPORT_SYMBOL
++0x93200b86 serial8250_handle_irq vmlinux EXPORT_SYMBOL_GPL
++0x4dcec118 nf_nat_set_seq_adjust net/ipv4/netfilter/nf_nat EXPORT_SYMBOL_GPL
++0xc6721caa nf_setsockopt vmlinux EXPORT_SYMBOL
++0x66297ceb nf_getsockopt vmlinux EXPORT_SYMBOL
++0x579e0bf5 rtnl_unregister_all vmlinux EXPORT_SYMBOL_GPL
++0x28d06a1f netif_rx_ni vmlinux EXPORT_SYMBOL
++0x160c8e49 i2c_smbus_xfer vmlinux EXPORT_SYMBOL
++0x1d1183eb device_attach vmlinux EXPORT_SYMBOL_GPL
++0x7b3d0f33 tty_port_open vmlinux EXPORT_SYMBOL
++0xe6faea36 alloc_disk vmlinux EXPORT_SYMBOL
++0xfa0ff0b4 blk_rq_map_user_iov vmlinux EXPORT_SYMBOL
++0x3ec13a0e seq_puts vmlinux EXPORT_SYMBOL
++0x3c620520 seq_putc vmlinux EXPORT_SYMBOL
++0xd7112524 usb_create_shared_hcd vmlinux EXPORT_SYMBOL_GPL
++0xca91df2e uart_update_timeout vmlinux EXPORT_SYMBOL
++0xeea70e8b part_round_stats vmlinux EXPORT_SYMBOL_GPL
++0x5374fd5a d_genocide vmlinux EXPORT_SYMBOL
++0x23af09db __module_put_and_exit vmlinux EXPORT_SYMBOL
++0x0088a193 __alloc_workqueue_key vmlinux EXPORT_SYMBOL_GPL
++0xaee6643e elv_dispatch_add_tail vmlinux EXPORT_SYMBOL
++0xaa966bf7 end_buffer_write_sync vmlinux EXPORT_SYMBOL
++0xa8835c2b d_drop vmlinux EXPORT_SYMBOL
++0xf165adc2 d_rehash vmlinux EXPORT_SYMBOL
++0xdea3251f file_open_root vmlinux EXPORT_SYMBOL
++0xc154f8f2 flush_kthread_work vmlinux EXPORT_SYMBOL_GPL
++0xa89464b7 __ashldi3 vmlinux EXPORT_SYMBOL
++0xb292666e __mmc_claim_host vmlinux EXPORT_SYMBOL
++0xed6010a9 usb_poison_urb vmlinux EXPORT_SYMBOL_GPL
++0xbf7c5874 pci_get_class vmlinux EXPORT_SYMBOL
++0x6b1b67d3 __bdevname vmlinux EXPORT_SYMBOL
++0xad4ba1e4 vfs_write vmlinux EXPORT_SYMBOL
++0xbea16979 netif_rx vmlinux EXPORT_SYMBOL
++0x1fbf241d swiotlb_sync_sg_for_cpu vmlinux EXPORT_SYMBOL
++0x955b0e2e kthread_worker_fn vmlinux EXPORT_SYMBOL_GPL
++0x9d0abaf6 xfrm_stateonly_find vmlinux EXPORT_SYMBOL
++0x34733550 usb_create_hcd vmlinux EXPORT_SYMBOL_GPL
++0x72ea7b2d scsi_device_type vmlinux EXPORT_SYMBOL
++0xadf2bd53 unregister_binfmt vmlinux EXPORT_SYMBOL
++0x2d9402fe alloc_vm_area vmlinux EXPORT_SYMBOL_GPL
++0x65bb58a2 _raw_read_trylock vmlinux EXPORT_SYMBOL
++0x844404cf ISA_DMA_THRESHOLD vmlinux EXPORT_SYMBOL
++0x908169b4 xdr_init_encode vmlinux EXPORT_SYMBOL_GPL
++0xb4bd61df netdev_bonding_change vmlinux EXPORT_SYMBOL
++0xe15c2179 sk_reset_txq vmlinux EXPORT_SYMBOL
++0xb2af542a sock_no_accept vmlinux EXPORT_SYMBOL
++0x2fa50e36 set_groups vmlinux EXPORT_SYMBOL
++0xec25f967 klist_del vmlinux EXPORT_SYMBOL_GPL
++0x3c9d911f skb_dst_set_noref vmlinux EXPORT_SYMBOL
++0x839c2a1f mmc_unregister_driver vmlinux EXPORT_SYMBOL
++0x21f0b642 elevator_exit vmlinux EXPORT_SYMBOL
++0xc4fa4b8f __lock_buffer vmlinux EXPORT_SYMBOL
++0xbb0ab47b debug_locks vmlinux EXPORT_SYMBOL_GPL
++0x6d953c4b ablkcipher_walk_done vmlinux EXPORT_SYMBOL_GPL
++0xed2498e7 ablkcipher_walk_phys vmlinux EXPORT_SYMBOL_GPL
++0x3999991e aead_geniv_alloc vmlinux EXPORT_SYMBOL_GPL
++0x20a789ac irq_set_chip_data vmlinux EXPORT_SYMBOL
++0x5971a2d5 inet6_csk_xmit vmlinux EXPORT_SYMBOL_GPL
++0x4d648b71 tcp_ioctl vmlinux EXPORT_SYMBOL
++0x5d9b4dd5 vfs_symlink vmlinux EXPORT_SYMBOL
++0x3ae34d58 find_vpid vmlinux EXPORT_SYMBOL_GPL
++0xd273b1b1 __round_jiffies_up_relative vmlinux EXPORT_SYMBOL_GPL
++0x17fe13bd unmap_mapping_range vmlinux EXPORT_SYMBOL
++0xeecb92f0 inet_select_addr vmlinux EXPORT_SYMBOL
++0x51855d05 dev_getbyhwaddr_rcu vmlinux EXPORT_SYMBOL
++0xadfbdc10 skb_flow_dissect vmlinux EXPORT_SYMBOL
++0xcd336604 pci_enable_device vmlinux EXPORT_SYMBOL
++0xc86a546a cpu_present_mask vmlinux EXPORT_SYMBOL
++0x6373d84b xprt_release_xprt_cong vmlinux EXPORT_SYMBOL_GPL
++0xbbca5c26 dcache_dir_close vmlinux EXPORT_SYMBOL
++0x82e5a238 vm_get_page_prot vmlinux EXPORT_SYMBOL
++0x6450bfd7 rpc_wake_up_queued_task vmlinux EXPORT_SYMBOL_GPL
++0xa9ade535 unregister_snap_client vmlinux EXPORT_SYMBOL
++0xee6e2a28 rtc_irq_set_state vmlinux EXPORT_SYMBOL_GPL
++0xbd040986 phy_driver_register vmlinux EXPORT_SYMBOL
++0x3b555ebf scsi_dma_unmap vmlinux EXPORT_SYMBOL
++0xb4232cab relay_reset vmlinux EXPORT_SYMBOL_GPL
++0x6971a684 nf_conntrack_register_notifier net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x0dcff8e4 inet_put_port vmlinux EXPORT_SYMBOL
++0xcee525f4 sock_no_connect vmlinux EXPORT_SYMBOL
++0x036f74a7 phy_print_status vmlinux EXPORT_SYMBOL
++0x070473ec pci_remove_bus vmlinux EXPORT_SYMBOL
++0xb3305d52 send_remote_softirq vmlinux EXPORT_SYMBOL
++0xa1f8fe75 wait_for_completion_killable_timeout vmlinux EXPORT_SYMBOL
++0x10ecc52c usb_amd_quirk_pll_enable vmlinux EXPORT_SYMBOL_GPL
++0x279ef3e3 skcipher_geniv_alloc vmlinux EXPORT_SYMBOL_GPL
++0x6e224a7a need_conntrack net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x4a358252 __bitmap_subset vmlinux EXPORT_SYMBOL
++0x1c1af916 set_normalized_timespec vmlinux EXPORT_SYMBOL
++0xbeccc586 eth_type_trans vmlinux EXPORT_SYMBOL
++0xbfdff814 of_get_address vmlinux EXPORT_SYMBOL
++0xaed8bc14 debugfs_create_blob vmlinux EXPORT_SYMBOL_GPL
++0x928f76ce mb_cache_entry_get vmlinux EXPORT_SYMBOL
++0x6655f24b vm_insert_mixed vmlinux EXPORT_SYMBOL
++0x7b08c0c5 send_sig vmlinux EXPORT_SYMBOL
++0xd8d36fcd tcp_shutdown vmlinux EXPORT_SYMBOL
++0x581f6a59 usb_stor_set_xfer_buf vmlinux EXPORT_SYMBOL_GPL
++0xab303c2a scsi_nonblockable_ioctl vmlinux EXPORT_SYMBOL
++0xbe77aebe down_write_trylock vmlinux EXPORT_SYMBOL
++0x730ff363 param_set_uint vmlinux EXPORT_SYMBOL
++0x776637d2 rpc_init_wait_queue vmlinux EXPORT_SYMBOL_GPL
++0xf389fe60 __hw_addr_init vmlinux EXPORT_SYMBOL
++0x199ed0cd net_disable_timestamp vmlinux EXPORT_SYMBOL
++0x96f5cd3e sdio_set_host_pm_flags vmlinux EXPORT_SYMBOL_GPL
++0xe251fc75 usb_stor_ctrl_transfer vmlinux EXPORT_SYMBOL_GPL
++0x4afe9a77 scsi_partsize vmlinux EXPORT_SYMBOL
++0x9ac8f3af of_find_device_by_node vmlinux EXPORT_SYMBOL
++0x4aaab2b1 groups_alloc vmlinux EXPORT_SYMBOL
++0xf338d4c3 netlink_unregister_notifier vmlinux EXPORT_SYMBOL
++0xc4c41664 simple_release_fs vmlinux EXPORT_SYMBOL
++0xdc9498dd down vmlinux EXPORT_SYMBOL
++0x5ab67931 do_IRQ vmlinux EXPORT_SYMBOL
++0x8e2ea861 blk_end_request vmlinux EXPORT_SYMBOL
++0xf3a0e01f skb_put vmlinux EXPORT_SYMBOL
++0xdc5da161 mtd_concat_create vmlinux EXPORT_SYMBOL
++0x22ef965d scsi_host_put vmlinux EXPORT_SYMBOL
++0x3895cd7a nfnl_unlock net/netfilter/nfnetlink EXPORT_SYMBOL_GPL
++0x07ae60b6 nf_nat_proto_in_range net/ipv4/netfilter/nf_nat EXPORT_SYMBOL_GPL
++0xe464582e generic_block_fiemap vmlinux EXPORT_SYMBOL
++0x735d8503 add_wait_queue vmlinux EXPORT_SYMBOL
++0xd276f795 param_ops_invbool vmlinux EXPORT_SYMBOL
++0x65dabd9c dev_add_pack vmlinux EXPORT_SYMBOL
++0xbde3c08a usb_hub_clear_tt_buffer vmlinux EXPORT_SYMBOL_GPL
++0x0a3131f6 strnchr vmlinux EXPORT_SYMBOL
++0x9f984513 strrchr vmlinux EXPORT_SYMBOL
++0xd20bf6ba dcookie_unregister vmlinux EXPORT_SYMBOL_GPL
++0x557e3153 balance_dirty_pages_ratelimited_nr vmlinux EXPORT_SYMBOL
++0x7afa89fc vsnprintf vmlinux EXPORT_SYMBOL
++0x44b911c3 rb_replace_node vmlinux EXPORT_SYMBOL
++0x6ff607b6 crypto_get_default_rng vmlinux EXPORT_SYMBOL_GPL
++0x668402aa crypto_put_default_rng vmlinux EXPORT_SYMBOL_GPL
++0x07c13af6 crypto_mod_put vmlinux EXPORT_SYMBOL_GPL
++0x94a69fd0 journal_clear_err vmlinux EXPORT_SYMBOL
++0x09531a7b mount_pseudo vmlinux EXPORT_SYMBOL
++0x0530dede _raw_write_trylock vmlinux EXPORT_SYMBOL
++0x4205ad24 cancel_work_sync vmlinux EXPORT_SYMBOL_GPL
++0x37382ea4 nf_ct_gre_keymap_flush net/netfilter/nf_conntrack_proto_gre EXPORT_SYMBOL
++0x99cdc86b sysctl_tcp_reordering vmlinux EXPORT_SYMBOL
++0xa3431157 input_set_keycode vmlinux EXPORT_SYMBOL
++0x6b44d1af alloc_pci_dev vmlinux EXPORT_SYMBOL
++0x9754ec10 radix_tree_preload vmlinux EXPORT_SYMBOL
++0x9d1341ef blkdev_ioctl vmlinux EXPORT_SYMBOL_GPL
++0xd11c0dc1 __kernel_param_unlock vmlinux EXPORT_SYMBOL
++0x88279f25 cpm_muram_alloc vmlinux EXPORT_SYMBOL
++0x56a10763 csum_tcpudp_magic vmlinux EXPORT_SYMBOL
++0x9fedb268 __i2c_board_lock vmlinux EXPORT_SYMBOL_GPL
++0x65dba254 tty_ldisc_flush vmlinux EXPORT_SYMBOL_GPL
++0x29028646 crypto_register_instance vmlinux EXPORT_SYMBOL_GPL
++0x2251978a crypto_alloc_tfm vmlinux EXPORT_SYMBOL_GPL
++0x760afcf0 bdi_destroy vmlinux EXPORT_SYMBOL
++0xe88cba4b skb_tstamp_tx vmlinux EXPORT_SYMBOL_GPL
++0x28830c73 tty_set_operations vmlinux EXPORT_SYMBOL
++0x616b825d dql_init vmlinux EXPORT_SYMBOL
++0x69e27c7a bitmap_copy_le vmlinux EXPORT_SYMBOL
++0x4dec6038 memscan vmlinux EXPORT_SYMBOL
++0x239b6d58 mark_buffer_dirty vmlinux EXPORT_SYMBOL
++0x150beb03 get_super vmlinux EXPORT_SYMBOL
++0x00801678 flush_scheduled_work vmlinux EXPORT_SYMBOL
++0xffb6efb2 write_bytes_to_xdr_buf vmlinux EXPORT_SYMBOL_GPL
++0xafdc3bb7 skb_copy_and_csum_bits vmlinux EXPORT_SYMBOL
++0xe03114f3 ll_rw_block vmlinux EXPORT_SYMBOL
++0xd59e518f block_write_begin vmlinux EXPORT_SYMBOL
++0xbe2e3b75 kstrtos8 vmlinux EXPORT_SYMBOL
++0x124f2056 crypto_get_attr_type vmlinux EXPORT_SYMBOL_GPL
++0x1cbc0b01 nfnetlink_send net/netfilter/nfnetlink EXPORT_SYMBOL_GPL
++0x12e280e3 svc_proc_unregister vmlinux EXPORT_SYMBOL_GPL
++0x26c90ea4 scsi_eh_get_sense vmlinux EXPORT_SYMBOL_GPL
++0x5d83dda1 device_create_bin_file vmlinux EXPORT_SYMBOL_GPL
++0xdef35215 pci_intx vmlinux EXPORT_SYMBOL_GPL
++0x83800bfa kref_init vmlinux EXPORT_SYMBOL
++0x2d5cc8db crypto_alloc_aead vmlinux EXPORT_SYMBOL_GPL
++0xba5ad651 crypto_spawn_tfm2 vmlinux EXPORT_SYMBOL_GPL
++0x50fad434 round_jiffies_up vmlinux EXPORT_SYMBOL_GPL
++0x46c1ef6e dev_set_mac_address vmlinux EXPORT_SYMBOL
++0x05c9593c sk_receive_skb vmlinux EXPORT_SYMBOL
++0xf5c05914 generic_segment_checks vmlinux EXPORT_SYMBOL
++0xd0f36f0d audit_log_format vmlinux EXPORT_SYMBOL
++0xec15f00a tcp_cookie_generator vmlinux EXPORT_SYMBOL
++0x6d2fc5a6 net_namespace_list vmlinux EXPORT_SYMBOL_GPL
++0x37287a4f sock_register vmlinux EXPORT_SYMBOL
++0xbcbaf605 loop_register_transfer vmlinux EXPORT_SYMBOL
++0x2c7e8020 pci_find_bus vmlinux EXPORT_SYMBOL
++0x1f58e71b nfnl_lock net/netfilter/nfnetlink EXPORT_SYMBOL_GPL
++0x16bd8d7a inet6_register_protosw vmlinux EXPORT_SYMBOL
++0x3f1c88ef netif_set_real_num_tx_queues vmlinux EXPORT_SYMBOL
++0xb0819781 netif_set_real_num_rx_queues vmlinux EXPORT_SYMBOL
++0x5ad98fe1 dev_set_group vmlinux EXPORT_SYMBOL
++0x8ac0ffc6 phy_register_fixup_for_uid vmlinux EXPORT_SYMBOL
++0xfdbc60ef register_mtd_blktrans vmlinux EXPORT_SYMBOL_GPL
++0xb4709322 scsi_dev_info_add_list vmlinux EXPORT_SYMBOL
++0xf50c9445 end_buffer_async_write vmlinux EXPORT_SYMBOL
++0x111fa7c9 qe_pin_set_dedicated vmlinux EXPORT_SYMBOL
++0x2f045815 ip_nat_decode_session vmlinux EXPORT_SYMBOL
++0xbb9cfeb4 sdio_get_host_pm_caps vmlinux EXPORT_SYMBOL_GPL
++0x75de8c53 vfs_writev vmlinux EXPORT_SYMBOL
++0xb258347c svc_rpcb_cleanup vmlinux EXPORT_SYMBOL_GPL
++0x9062c322 ring_buffer_consume vmlinux EXPORT_SYMBOL_GPL
++0x1c5b1f28 irq_free_descs vmlinux EXPORT_SYMBOL_GPL
++0x4fc9418d proc_dointvec vmlinux EXPORT_SYMBOL
++0xa2a5fd77 inet_ehash_secret vmlinux EXPORT_SYMBOL
++0x7f6680dd __inet_lookup_established vmlinux EXPORT_SYMBOL_GPL
++0x2ab95de3 netdev_alert vmlinux EXPORT_SYMBOL
++0x0a540769 rpc_print_iostats vmlinux EXPORT_SYMBOL_GPL
++0x4bb15c8c udp_lib_rehash vmlinux EXPORT_SYMBOL
++0xb8f4d294 udp_lib_unhash vmlinux EXPORT_SYMBOL
++0x1d9496fc of_pci_find_child_device vmlinux EXPORT_SYMBOL_GPL
++0x05495392 hid_debug vmlinux EXPORT_SYMBOL_GPL
++0x112dcb5f device_show_ulong vmlinux EXPORT_SYMBOL_GPL
++0x79df9c12 cpumask_next_and vmlinux EXPORT_SYMBOL
++0x3969cdfb nf_hook_slow vmlinux EXPORT_SYMBOL
++0xce5ac24f zlib_inflate_workspacesize vmlinux EXPORT_SYMBOL
++0x6103edc6 tcp_recvmsg vmlinux EXPORT_SYMBOL
++0xace5c0fc usb_bus_list vmlinux EXPORT_SYMBOL_GPL
++0x80f2bf56 xfrm_audit_state_notfound_simple vmlinux EXPORT_SYMBOL_GPL
++0xe8b63ace radix_tree_range_tag_if_tagged vmlinux EXPORT_SYMBOL
++0xc2882ea4 proc_dointvec_userhz_jiffies vmlinux EXPORT_SYMBOL
++0xd48f3111 console_start vmlinux EXPORT_SYMBOL
++0x21398e9d tcp_simple_retransmit vmlinux EXPORT_SYMBOL
++0xad58729e inet_csk_bind_conflict vmlinux EXPORT_SYMBOL_GPL
++0x8d93899a xt_register_match vmlinux EXPORT_SYMBOL
++0x68f40f80 of_find_node_with_property vmlinux EXPORT_SYMBOL
++0x17eb9b10 anon_inode_getfile vmlinux EXPORT_SYMBOL_GPL
++0x8ec1678f simple_dir_inode_operations vmlinux EXPORT_SYMBOL
++0x065f1d39 fsl_pq_mdio_bus_name vmlinux EXPORT_SYMBOL_GPL
++0x75a4001c dmam_pool_create vmlinux EXPORT_SYMBOL
++0x8fc5a78b genphy_suspend vmlinux EXPORT_SYMBOL
++0x0878c365 subsys_system_register vmlinux EXPORT_SYMBOL_GPL
++0x55c887e2 __find_get_block vmlinux EXPORT_SYMBOL
++0xcc276874 dcache_dir_open vmlinux EXPORT_SYMBOL
++0x3f4547a7 put_unused_fd vmlinux EXPORT_SYMBOL
++0xd2555f19 jiffies_64_to_clock_t vmlinux EXPORT_SYMBOL
++0x9d51befe inet6_lookup_listener vmlinux EXPORT_SYMBOL_GPL
++0xfbe27a1c rb_first vmlinux EXPORT_SYMBOL
++0x7c904ded unregister_module_notifier vmlinux EXPORT_SYMBOL
++0xddc16c88 flush_delayed_work vmlinux EXPORT_SYMBOL
++0xe5ab60b2 mmc_switch vmlinux EXPORT_SYMBOL_GPL
++0xfb65ffac scsi_cmd_print_sense_hdr vmlinux EXPORT_SYMBOL
++0x616e9785 zero_fill_bio vmlinux EXPORT_SYMBOL
++0xb628f715 files_lglock_local_lock vmlinux EXPORT_SYMBOL
++0x082c3213 pci_root_buses vmlinux EXPORT_SYMBOL
++0x72d4c23c fsl_get_sys_freq vmlinux EXPORT_SYMBOL
++0xfc4d7b87 tcp_syn_ack_timeout vmlinux EXPORT_SYMBOL
++0x0397f6b0 nf_log_unregister vmlinux EXPORT_SYMBOL
++0x72975f42 mmc_alloc_host vmlinux EXPORT_SYMBOL
++0x110020ff scsi_eh_ready_devs vmlinux EXPORT_SYMBOL_GPL
++0x18f4e85e generic_file_buffered_write vmlinux EXPORT_SYMBOL
++0xc1c2dd09 __hw_addr_flush vmlinux EXPORT_SYMBOL
++0x548a8689 of_property_read_string vmlinux EXPORT_SYMBOL_GPL
++0x05b82c15 thermal_cooling_device_register vmlinux EXPORT_SYMBOL
++0xb0e70ae3 input_open_device vmlinux EXPORT_SYMBOL
++0xfe990052 gpio_free vmlinux EXPORT_SYMBOL_GPL
++0xea054b22 nla_policy_len vmlinux EXPORT_SYMBOL
++0xd92afabe bitmap_clear vmlinux EXPORT_SYMBOL
++0xa6e1a05f fsync_bdev vmlinux EXPORT_SYMBOL
++0x710fed59 cache_unregister vmlinux EXPORT_SYMBOL_GPL
++0xa3bbc0ac xprt_set_retrans_timeout_def vmlinux EXPORT_SYMBOL_GPL
++0x0d4d2a18 ip6_dst_lookup vmlinux EXPORT_SYMBOL_GPL
++0xedd0ed46 i2c_new_device vmlinux EXPORT_SYMBOL_GPL
++0xdc39e99d device_for_each_child vmlinux EXPORT_SYMBOL_GPL
++0x40a9b349 vzalloc vmlinux EXPORT_SYMBOL
++0xbaaab8ae timespec_to_jiffies vmlinux EXPORT_SYMBOL
++0x51c251f8 unregister_key_type vmlinux EXPORT_SYMBOL
++0xa38e691a ioremap_bot vmlinux EXPORT_SYMBOL
++0x8530e62e rpc_shutdown_client vmlinux EXPORT_SYMBOL_GPL
++0x11089ac7 _ctype vmlinux EXPORT_SYMBOL
++0x649ddc16 blk_get_queue vmlinux EXPORT_SYMBOL
++0x5eb6f94d bd_set_size vmlinux EXPORT_SYMBOL
++0xa28aaf29 rh_create vmlinux EXPORT_SYMBOL_GPL
++0x0e74417a udp_proc_unregister vmlinux EXPORT_SYMBOL
++0x0deebb29 mtd_device_unregister vmlinux EXPORT_SYMBOL_GPL
++0x37f614b7 __kfifo_len_r vmlinux EXPORT_SYMBOL
++0x6f868b48 svc_xprt_names vmlinux EXPORT_SYMBOL_GPL
++0x92cff065 inet_sk_rebuild_header vmlinux EXPORT_SYMBOL
++0x0ea878cd skb_copy vmlinux EXPORT_SYMBOL
++0x829b3b9d input_inject_event vmlinux EXPORT_SYMBOL
++0x17ec8f5b pci_bus_read_config_dword vmlinux EXPORT_SYMBOL
++0x7593d385 div64_s64 vmlinux EXPORT_SYMBOL
++0x27864d57 memparse vmlinux EXPORT_SYMBOL
++0x3ead9a33 block_truncate_page vmlinux EXPORT_SYMBOL
++0x9d130651 generic_write_checks vmlinux EXPORT_SYMBOL
++0x1d2e87c6 do_gettimeofday vmlinux EXPORT_SYMBOL
++0xcf015f7b do_settimeofday vmlinux EXPORT_SYMBOL
++0xd172cb8d netdev_increment_features vmlinux EXPORT_SYMBOL
++0x264b5eda uart_match_port vmlinux EXPORT_SYMBOL
++0x9e04279a cap_file_mmap vmlinux EXPORT_SYMBOL_GPL
++0xc5a37aa8 flow_cache_lookup vmlinux EXPORT_SYMBOL
++0x55da6c07 alloc_tty_driver vmlinux EXPORT_SYMBOL
++0xfda98690 pcie_port_service_register vmlinux EXPORT_SYMBOL
++0x722852be pci_request_selected_regions vmlinux EXPORT_SYMBOL
++0x45666d9b __splice_from_pipe vmlinux EXPORT_SYMBOL
++0x9c3dd03a __nf_ct_ext_destroy net/netfilter/nf_conntrack EXPORT_SYMBOL
++0x3c65c88c unregister_net_sysctl_table vmlinux EXPORT_SYMBOL_GPL
++0x24e6d442 sdio_align_size vmlinux EXPORT_SYMBOL_GPL
++0x2114d287 tty_write_room vmlinux EXPORT_SYMBOL
++0x586527c3 sysfs_add_file_to_group vmlinux EXPORT_SYMBOL_GPL
++0x8436f8e3 param_ops_ushort vmlinux EXPORT_SYMBOL
++0x546027e3 dev_trans_start vmlinux EXPORT_SYMBOL
++0x94cbd061 dql_reset vmlinux EXPORT_SYMBOL
++0x6a33ea8b blk_register_region vmlinux EXPORT_SYMBOL
++0x93dd83ef bio_put vmlinux EXPORT_SYMBOL
++0x65f9016f task_tgid_nr_ns vmlinux EXPORT_SYMBOL
++0x1b767055 of_find_compatible_node vmlinux EXPORT_SYMBOL
++0xabc50916 input_alloc_absinfo vmlinux EXPORT_SYMBOL
++0x13fe75bb scsi_is_target_device vmlinux EXPORT_SYMBOL
++0x7da357d0 journal_force_commit vmlinux EXPORT_SYMBOL
++0xef91072e each_symbol_section vmlinux EXPORT_SYMBOL_GPL
++0xe697313d sk_dst_check vmlinux EXPORT_SYMBOL
++0x6a76f3ac blk_iopoll_enable vmlinux EXPORT_SYMBOL
++0xb906fe4a inode_needs_sync vmlinux EXPORT_SYMBOL
++0x7d38f2e3 grab_cache_page_nowait vmlinux EXPORT_SYMBOL
++0x8b70e8ea __wake_up_sync_key vmlinux EXPORT_SYMBOL_GPL
++0x042333d2 dev_getfirstbyhwtype vmlinux EXPORT_SYMBOL
++0x9ea7341b scsi_internal_device_block vmlinux EXPORT_SYMBOL_GPL
++0x25820c64 fs_overflowuid vmlinux EXPORT_SYMBOL
++0x4ebd6a47 wake_up_process vmlinux EXPORT_SYMBOL
++0x53ebab1b _outsl_ns vmlinux EXPORT_SYMBOL
++0x9e2ae014 __nf_ct_refresh_acct net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x556a7629 skb_dequeue_tail vmlinux EXPORT_SYMBOL
++0x311f6ed3 input_ff_erase vmlinux EXPORT_SYMBOL_GPL
++0x8472112c scsi_target_resume vmlinux EXPORT_SYMBOL
++0x4cc325f1 nfs_initiate_read vmlinux EXPORT_SYMBOL_GPL
++0x58392cb3 __get_user_pages vmlinux EXPORT_SYMBOL
++0x0c485af1 __module_address vmlinux EXPORT_SYMBOL_GPL
++0x5b076b1b inet_stream_ops vmlinux EXPORT_SYMBOL
++0xe791c07d qdisc_reset vmlinux EXPORT_SYMBOL
++0x63ecad53 register_netdevice_notifier vmlinux EXPORT_SYMBOL
++0xb573cf83 pci_get_device vmlinux EXPORT_SYMBOL
++0x5b237650 blk_complete_request vmlinux EXPORT_SYMBOL
++0x808ec1a3 crypto_alg_tested vmlinux EXPORT_SYMBOL_GPL
++0x583c0845 bio_unmap_user vmlinux EXPORT_SYMBOL
++0xe4a5911c udp_seq_open vmlinux EXPORT_SYMBOL
++0x133b4ee4 idr_get_next vmlinux EXPORT_SYMBOL
++0xc4571a56 fail_migrate_page vmlinux EXPORT_SYMBOL
++0xdf4c8767 ns_to_timeval vmlinux EXPORT_SYMBOL
++0xcacba0a5 nf_ct_expect_register_notifier net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x721b1851 skip_spaces vmlinux EXPORT_SYMBOL
++0x0c0c015e ring_buffer_swap_cpu vmlinux EXPORT_SYMBOL_GPL
++0xdc2adb35 add_taint vmlinux EXPORT_SYMBOL
++0x60a32ea9 pm_power_off vmlinux EXPORT_SYMBOL_GPL
++0x466c14a7 __delay vmlinux EXPORT_SYMBOL
++0x3e09fbde __neigh_for_each_release vmlinux EXPORT_SYMBOL
++0x1ee9814e irq_of_parse_and_map vmlinux EXPORT_SYMBOL_GPL
++0xe0e37b4c spi_busnum_to_master vmlinux EXPORT_SYMBOL_GPL
++0xb73e0c9c device_initialize vmlinux EXPORT_SYMBOL_GPL
++0x0d558de0 blk_queue_init_tags vmlinux EXPORT_SYMBOL
++0x690a7b30 user_destroy vmlinux EXPORT_SYMBOL_GPL
++0x4f69f21d bdget vmlinux EXPORT_SYMBOL
++0x1c326670 bdput vmlinux EXPORT_SYMBOL
++0x42cdd5c5 fsstack_copy_inode_size vmlinux EXPORT_SYMBOL_GPL
++0xd5248f66 nf_conntrack_untracked net/netfilter/nf_conntrack EXPORT_SYMBOL
++0x0e93bb22 usb_usual_ignore_device vmlinux EXPORT_SYMBOL_GPL
++0xed9f8e6d kstrtos16 vmlinux EXPORT_SYMBOL
++0xfb32b30f ring_buffer_read_prepare_sync vmlinux EXPORT_SYMBOL_GPL
++0xadcac4a3 vfsmount_lock_local_unlock_cpu vmlinux EXPORT_SYMBOL
++0xaef2c83c fs_kobj vmlinux EXPORT_SYMBOL_GPL
++0x956657df crypto_alloc_ablkcipher vmlinux EXPORT_SYMBOL_GPL
++0xfb3b51e1 bio_init vmlinux EXPORT_SYMBOL
++0x7278d328 all_vm_events vmlinux EXPORT_SYMBOL_GPL
++0xfe3c4307 gss_mech_put vmlinux EXPORT_SYMBOL_GPL
++0x2ca3edba rpc_max_payload vmlinux EXPORT_SYMBOL_GPL
++0x288092c9 inet6_hash_connect vmlinux EXPORT_SYMBOL_GPL
++0x6dbad0b5 gnet_stats_copy_rate_est vmlinux EXPORT_SYMBOL
++0x115b689d skb_partial_csum_set vmlinux EXPORT_SYMBOL_GPL
++0x0f2bd6b9 sdio_enable_func vmlinux EXPORT_SYMBOL_GPL
++0x4e505436 subsys_dev_iter_next vmlinux EXPORT_SYMBOL_GPL
++0x334a0cd1 create_empty_buffers vmlinux EXPORT_SYMBOL
++0x2f1cd7a8 init_special_inode vmlinux EXPORT_SYMBOL
++0x0e4a8c58 inet_frag_destroy vmlinux EXPORT_SYMBOL
++0x48dd2a9a skb_make_writable vmlinux EXPORT_SYMBOL
++0x2eeceb42 sk_chk_filter vmlinux EXPORT_SYMBOL
++0xf8a88294 cfi_qry_present vmlinux EXPORT_SYMBOL_GPL
++0x6bb87ddb pipe_to_file vmlinux EXPORT_SYMBOL
++0x114604eb __dec_zone_page_state vmlinux EXPORT_SYMBOL
++0x4b6cb580 __inc_zone_page_state vmlinux EXPORT_SYMBOL
++0xd9c6efac __mod_zone_page_state vmlinux EXPORT_SYMBOL
++0x0b55a26a flush_kthread_worker vmlinux EXPORT_SYMBOL_GPL
++0xa5cef8ad release_resource vmlinux EXPORT_SYMBOL
++0x9ef6b7ea powerpc_debugfs_root vmlinux EXPORT_SYMBOL
++0x5e906550 brioctl_set vmlinux EXPORT_SYMBOL
++0x6a496bc1 input_set_abs_params vmlinux EXPORT_SYMBOL
++0x378abc81 spi_bus_unlock vmlinux EXPORT_SYMBOL_GPL
++0xc60fe5e9 device_schedule_callback_owner vmlinux EXPORT_SYMBOL_GPL
++0x8b498a59 vm_insert_pfn vmlinux EXPORT_SYMBOL
++0xfcaa04a0 out_of_line_wait_on_bit_lock vmlinux EXPORT_SYMBOL
++0xf0bfe668 register_net_sysctl_table vmlinux EXPORT_SYMBOL_GPL
++0x2370b4df xfrm_state_alloc vmlinux EXPORT_SYMBOL
++0x85670f1d rtnl_is_locked vmlinux EXPORT_SYMBOL
++0xedd06a1b of_parse_phandles_with_args vmlinux EXPORT_SYMBOL
++0xecc376f4 fat_remove_entries vmlinux EXPORT_SYMBOL_GPL
++0x8a2b65f0 page_symlink vmlinux EXPORT_SYMBOL
++0xbc6f931b workqueue_congested vmlinux EXPORT_SYMBOL_GPL
++0x3d6d8275 __xfrm_route_forward vmlinux EXPORT_SYMBOL
++0xe2ae4be3 gen_replace_estimator vmlinux EXPORT_SYMBOL
++0xe2353e10 scsi_target_unblock vmlinux EXPORT_SYMBOL_GPL
++0x751b2247 param_get_bool vmlinux EXPORT_SYMBOL
++0xb0146c3a param_set_byte vmlinux EXPORT_SYMBOL
++0xf5e3f6f8 rpc_call_null vmlinux EXPORT_SYMBOL_GPL
++0x9fdecc31 unregister_netdevice_many vmlinux EXPORT_SYMBOL
++0x31c11871 rtc_device_unregister vmlinux EXPORT_SYMBOL_GPL
++0x5a21f0f4 blk_abort_queue vmlinux EXPORT_SYMBOL_GPL
++0x3e6e75c0 blk_queue_logical_block_size vmlinux EXPORT_SYMBOL
++0x63f608e4 init_srcu_struct vmlinux EXPORT_SYMBOL_GPL
++0x594b47d6 sunrpc_cache_lookup vmlinux EXPORT_SYMBOL_GPL
++0xdda28e49 arp_tbl vmlinux EXPORT_SYMBOL
++0xfea540c6 __skb_recv_datagram vmlinux EXPORT_SYMBOL
++0x376e7e39 phy_attach vmlinux EXPORT_SYMBOL
++0xfe7c4287 nr_cpu_ids vmlinux EXPORT_SYMBOL
++0xf5e7f053 rh_destroy vmlinux EXPORT_SYMBOL_GPL
++0x065994f1 xdr_encode_opaque_fixed vmlinux EXPORT_SYMBOL_GPL
++0xa516a4a3 tcp_splice_read vmlinux EXPORT_SYMBOL
++0x7c478694 xt_unregister_match vmlinux EXPORT_SYMBOL
++0x36e360e3 __hw_addr_add_multiple vmlinux EXPORT_SYMBOL
++0x0d0c109d of_irq_to_resource vmlinux EXPORT_SYMBOL_GPL
++0xcbc9557f unregister_sysrq_key vmlinux EXPORT_SYMBOL
++0x74ad740d simple_transaction_set vmlinux EXPORT_SYMBOL
++0xed7d1156 simple_transaction_get vmlinux EXPORT_SYMBOL
++0x5f629129 find_pid_ns vmlinux EXPORT_SYMBOL_GPL
++0x17913f3c __nf_conntrack_find net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x56e75d47 klist_node_attached vmlinux EXPORT_SYMBOL_GPL
++0x8b0896a8 lock_sock_nested vmlinux EXPORT_SYMBOL
++0xc0ad921a hid_add_device vmlinux EXPORT_SYMBOL_GPL
++0x1605388f sdio_disable_func vmlinux EXPORT_SYMBOL_GPL
++0x45582f48 scsi_free_command vmlinux EXPORT_SYMBOL
++0xd45c92cb platform_add_devices vmlinux EXPORT_SYMBOL_GPL
++0x92b57248 flush_work vmlinux EXPORT_SYMBOL_GPL
++0x9dd6edf6 usb_deregister vmlinux EXPORT_SYMBOL_GPL
++0x3b261e90 of_device_is_compatible vmlinux EXPORT_SYMBOL
++0x851187ae crypto_alloc_instance vmlinux EXPORT_SYMBOL_GPL
++0xe18b50f9 mpage_writepage vmlinux EXPORT_SYMBOL
++0x18ef997d set_security_override vmlinux EXPORT_SYMBOL
++0x6b2dc060 dump_stack vmlinux EXPORT_SYMBOL
++0x40797035 nfnetlink_subsys_unregister net/netfilter/nfnetlink EXPORT_SYMBOL_GPL
++0xfb9b2d0e raw_seq_start vmlinux EXPORT_SYMBOL_GPL
++0x17f28d7c dst_cow_metrics_generic vmlinux EXPORT_SYMBOL
++0xfa3657fe rtc_read_time vmlinux EXPORT_SYMBOL_GPL
++0x7eacf564 swiotlb_map_page vmlinux EXPORT_SYMBOL_GPL
++0xe8850089 mount_ns vmlinux EXPORT_SYMBOL
++0xf0c82f30 cpu_add_dev_attr vmlinux EXPORT_SYMBOL_GPL
++0x11886e11 kobject_del vmlinux EXPORT_SYMBOL
++0x1343402c crypto_unregister_shash vmlinux EXPORT_SYMBOL_GPL
++0xfbacc823 crypto_unregister_ahash vmlinux EXPORT_SYMBOL_GPL
++0x5eb8e514 usb_reset_endpoint vmlinux EXPORT_SYMBOL_GPL
++0xb6a68816 find_last_bit vmlinux EXPORT_SYMBOL
++0x712dc4d8 inode_dio_done vmlinux EXPORT_SYMBOL_GPL
++0x9a030dc8 poll_initwait vmlinux EXPORT_SYMBOL
++0x5e19264c unregister_console vmlinux EXPORT_SYMBOL
++0xff6dea25 smp_hw_index vmlinux EXPORT_SYMBOL
++0xbe85ec13 nf_ct_helper_ext_add net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x293d41a8 phy_disconnect vmlinux EXPORT_SYMBOL
++0xa8cb5076 aead_geniv_free vmlinux EXPORT_SYMBOL_GPL
++0xd8e484f0 register_chrdev_region vmlinux EXPORT_SYMBOL
++0xf52f4bc3 inet_csk_reqsk_queue_prune vmlinux EXPORT_SYMBOL_GPL
++0xed5f822a netdev_state_change vmlinux EXPORT_SYMBOL
++0x310917fe sort vmlinux EXPORT_SYMBOL
++0x3d19d9ca nfs4_reset_read vmlinux EXPORT_SYMBOL_GPL
++0x541bd60a irq_work_run vmlinux EXPORT_SYMBOL_GPL
++0x6c49c4f2 clockevents_notify vmlinux EXPORT_SYMBOL_GPL
++0x6c1b16e2 usb_sg_cancel vmlinux EXPORT_SYMBOL_GPL
++0xbe3f901e kern_path vmlinux EXPORT_SYMBOL
++0x33817a73 nf_register_queue_handler vmlinux EXPORT_SYMBOL
++0xea91aa6f netpoll_print_options vmlinux EXPORT_SYMBOL
++0x29b1c366 __sg_alloc_table vmlinux EXPORT_SYMBOL
++0x79f9a580 shrink_dcache_sb vmlinux EXPORT_SYMBOL
++0x3ec8886f param_ops_int vmlinux EXPORT_SYMBOL
++0x1b87a6f0 blkdev_issue_flush vmlinux EXPORT_SYMBOL
++0x499043d3 crypto_init_queue vmlinux EXPORT_SYMBOL_GPL
++0xb11b1747 default_backing_dev_info vmlinux EXPORT_SYMBOL_GPL
++0xbdbe7378 cookie_check_timestamp vmlinux EXPORT_SYMBOL
++0x59020915 fsnotify_put_mark vmlinux EXPORT_SYMBOL_GPL
++0x6b4435a7 generic_drop_inode vmlinux EXPORT_SYMBOL_GPL
++0xf57db0bd find_inode_number vmlinux EXPORT_SYMBOL
++0xf5cf326a param_ops_short vmlinux EXPORT_SYMBOL
++0x1f925c00 rpcb_getport_async vmlinux EXPORT_SYMBOL_GPL
++0x8c354480 ip_route_input_common vmlinux EXPORT_SYMBOL
++0xa6970398 __kfifo_to_user_r vmlinux EXPORT_SYMBOL
++0x1de33a9e softnet_data vmlinux EXPORT_SYMBOL
++0x00f42699 files_lglock_global_unlock vmlinux EXPORT_SYMBOL
++0x24e1307e flush_work_sync vmlinux EXPORT_SYMBOL_GPL
++0xfe5d4bb2 sys_tz vmlinux EXPORT_SYMBOL
++0x1ae6ffc8 __skb_tx_hash vmlinux EXPORT_SYMBOL
++0x241f0763 blk_init_queue vmlinux EXPORT_SYMBOL
++0xce67b38d unlock_page vmlinux EXPORT_SYMBOL
++0xcbf10c5b sdio_memcpy_fromio vmlinux EXPORT_SYMBOL_GPL
++0x5785384a flex_array_free_parts vmlinux EXPORT_SYMBOL
++0x0f668ba9 svc_auth_unregister vmlinux EXPORT_SYMBOL_GPL
++0x45456905 xfrm_unregister_type vmlinux EXPORT_SYMBOL
++0x4e781803 nf_ip_checksum vmlinux EXPORT_SYMBOL
++0xe1982309 pci_request_regions_exclusive vmlinux EXPORT_SYMBOL
++0x773a9c94 blk_iopoll_enabled vmlinux EXPORT_SYMBOL
++0xd4d24bb4 hrtimer_init_sleeper vmlinux EXPORT_SYMBOL_GPL
++0x5e1c7425 eth_rebuild_header vmlinux EXPORT_SYMBOL
++0x533031ec neigh_compat_output vmlinux EXPORT_SYMBOL
++0xc6f2dadd user_path_at vmlinux EXPORT_SYMBOL
++0xfd46510b module_put vmlinux EXPORT_SYMBOL
++0x2459bbcc console_set_on_cmdline vmlinux EXPORT_SYMBOL
++0xe9379468 usb_get_from_anchor vmlinux EXPORT_SYMBOL_GPL
++0x2d938d67 genphy_resume vmlinux EXPORT_SYMBOL
++0xee4db89d inode_get_bytes vmlinux EXPORT_SYMBOL
++0x5e3a8a9c __wake_up vmlinux EXPORT_SYMBOL
++0x9fd9cdb0 nf_conntrack_helper_unregister net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xa8a585c0 i2c_for_each_dev vmlinux EXPORT_SYMBOL_GPL
++0x599adf11 dev_driver_string vmlinux EXPORT_SYMBOL
++0x5e52b566 pcie_get_readrq vmlinux EXPORT_SYMBOL
++0xc7a1840e llist_add_batch vmlinux EXPORT_SYMBOL_GPL
++0x0010abad vfs_mkdir vmlinux EXPORT_SYMBOL
++0x79272d01 of_match_node vmlinux EXPORT_SYMBOL
++0x2edfd91a usb_driver_claim_interface vmlinux EXPORT_SYMBOL_GPL
++0x9cfd56c5 scsi_print_status vmlinux EXPORT_SYMBOL
++0x4bf98954 eventfd_ctx_fileget vmlinux EXPORT_SYMBOL_GPL
++0x01139ffc max_mapnr vmlinux EXPORT_SYMBOL
++0xc1ef47df rpc_pipe_generic_upcall vmlinux EXPORT_SYMBOL_GPL
++0x98a76b33 xprt_unregister_transport vmlinux EXPORT_SYMBOL_GPL
++0x93b9629e of_find_i2c_device_by_node vmlinux EXPORT_SYMBOL
++0x7cee66f5 eventfd_fget vmlinux EXPORT_SYMBOL_GPL
++0xc58850d7 dget_parent vmlinux EXPORT_SYMBOL
++0xb36388b7 hid_dump_input vmlinux EXPORT_SYMBOL_GPL
++0x8541878a usb_get_dev vmlinux EXPORT_SYMBOL_GPL
++0x6ecdaa65 mb_cache_create vmlinux EXPORT_SYMBOL
++0x769ec6bc iunique vmlinux EXPORT_SYMBOL
++0x01a4ea6d unregister_die_notifier vmlinux EXPORT_SYMBOL_GPL
++0x5614b010 xfrm_policy_walk_done vmlinux EXPORT_SYMBOL
++0xe0e2d273 inet_dgram_ops vmlinux EXPORT_SYMBOL
++0x8a20e1aa input_release_device vmlinux EXPORT_SYMBOL
++0x9c1c727f scsi_put_command vmlinux EXPORT_SYMBOL
++0xa2134525 blk_alloc_queue vmlinux EXPORT_SYMBOL
++0xdcadc348 mb_cache_destroy vmlinux EXPORT_SYMBOL
++0x0903c239 vid_from_reg drivers/hwmon/hwmon-vid EXPORT_SYMBOL
++0x89253799 get_gendisk vmlinux EXPORT_SYMBOL
++0x99bfbe39 get_unused_fd vmlinux EXPORT_SYMBOL
++0x7a50a315 files_lglock_global_unlock_online vmlinux EXPORT_SYMBOL
++0xbfad4db7 proc_doulongvec_minmax vmlinux EXPORT_SYMBOL
++0x2d36c57b rh_alloc vmlinux EXPORT_SYMBOL_GPL
++0xdd56dbe7 tcp_proc_unregister vmlinux EXPORT_SYMBOL
++0x851d3cba hwmon_device_register vmlinux EXPORT_SYMBOL_GPL
++0xbf4c8a06 sdev_evt_send_simple vmlinux EXPORT_SYMBOL_GPL
++0x6746ae74 pci_renumber_slot vmlinux EXPORT_SYMBOL_GPL
++0xef17cdaf simple_attr_open vmlinux EXPORT_SYMBOL_GPL
++0x9a49d937 __wake_up_locked_key vmlinux EXPORT_SYMBOL_GPL
++0x85c10896 rcu_batches_completed_bh vmlinux EXPORT_SYMBOL_GPL
++0x4578f528 __kfifo_to_user vmlinux EXPORT_SYMBOL
++0xcc7fa952 local_bh_enable_ip vmlinux EXPORT_SYMBOL
++0x27f7e224 xfrm4_rcv_encap vmlinux EXPORT_SYMBOL
++0xc7654bfd udp_poll vmlinux EXPORT_SYMBOL
++0x51ef33b8 kstrndup vmlinux EXPORT_SYMBOL
++0x0583b1a3 irq_set_chip vmlinux EXPORT_SYMBOL
++0x4f513a91 console_stop vmlinux EXPORT_SYMBOL
++0x419cc91e nf_conntrack_tuple_taken net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xd1a9044f inet6_getname vmlinux EXPORT_SYMBOL
++0x8a2cf4b8 xdr_encode_word vmlinux EXPORT_SYMBOL_GPL
++0xf6f682ab auth_domain_find vmlinux EXPORT_SYMBOL_GPL
++0xb95bbaa0 register_mtd_user vmlinux EXPORT_SYMBOL_GPL
++0xbe91f299 debugfs_create_file vmlinux EXPORT_SYMBOL_GPL
++0xc15de2b9 new_inode vmlinux EXPORT_SYMBOL
++0xe16ce22c rpc_restart_call_prepare vmlinux EXPORT_SYMBOL_GPL
++0xa8657869 of_get_phy_mode vmlinux EXPORT_SYMBOL_GPL
++0x28a2ed02 scsi_build_sense_buffer vmlinux EXPORT_SYMBOL
++0xd11042c0 tty_port_close vmlinux EXPORT_SYMBOL
++0x65dccf13 xz_dec_end vmlinux EXPORT_SYMBOL
++0xf9348cbc xz_dec_run vmlinux EXPORT_SYMBOL
++0x76e07962 idr_get_new vmlinux EXPORT_SYMBOL
++0x92a2c46d ida_get_new vmlinux EXPORT_SYMBOL
++0xe0b13336 argv_free vmlinux EXPORT_SYMBOL
++0x3240c65b files_lglock_global_lock_online vmlinux EXPORT_SYMBOL
++0xb7a383e5 genl_unregister_family vmlinux EXPORT_SYMBOL
++0xfe769456 unregister_netdevice_notifier vmlinux EXPORT_SYMBOL
++0x3e01160a tty_register_driver vmlinux EXPORT_SYMBOL
++0xefadeaf0 sdio_release_host vmlinux EXPORT_SYMBOL_GPL
++0xc27db015 driver_remove_file vmlinux EXPORT_SYMBOL_GPL
++0x87f98b5b swiotlb_free_coherent vmlinux EXPORT_SYMBOL
++0x39cb510c kset_unregister vmlinux EXPORT_SYMBOL
++0x1abb4c45 debugfs_create_u32 vmlinux EXPORT_SYMBOL_GPL
++0x98b9e82b register_net_sysctl_rotable vmlinux EXPORT_SYMBOL_GPL
++0x76495a16 llc_build_and_send_ui_pkt vmlinux EXPORT_SYMBOL
++0x87c85967 netdev_rx_handler_register vmlinux EXPORT_SYMBOL_GPL
++0xf0ad1471 inet_csk_reset_keepalive_timer vmlinux EXPORT_SYMBOL
++0xc27d3a6d user_read vmlinux EXPORT_SYMBOL_GPL
++0x53326531 mempool_alloc_pages vmlinux EXPORT_SYMBOL
++0x47939e0d __tasklet_hi_schedule vmlinux EXPORT_SYMBOL
++0x4e4fee60 read_bytes_from_xdr_buf vmlinux EXPORT_SYMBOL_GPL
++0x84d64671 arp_send vmlinux EXPORT_SYMBOL
++0x7b9dea01 xt_register_matches vmlinux EXPORT_SYMBOL
++0x3ed63055 zlib_inflateReset vmlinux EXPORT_SYMBOL
++0xb19760c3 bitmap_onto vmlinux EXPORT_SYMBOL
++0x26faebf0 cdev_del vmlinux EXPORT_SYMBOL
++0x281823c5 __kfifo_out_peek vmlinux EXPORT_SYMBOL
++0x341c41c5 tcp_seq_open vmlinux EXPORT_SYMBOL
++0x456144b4 pneigh_enqueue vmlinux EXPORT_SYMBOL
++0xcc3f71f3 dev_alloc_name vmlinux EXPORT_SYMBOL
++0x6086fae9 rwsem_wake vmlinux EXPORT_SYMBOL
++0x51ee205d fsnotify_init_mark vmlinux EXPORT_SYMBOL_GPL
++0x6c91b04d iov_iter_copy_from_user vmlinux EXPORT_SYMBOL
++0xd5dde498 generic_fh_to_dentry vmlinux EXPORT_SYMBOL_GPL
++0xa3225eb1 try_to_del_timer_sync vmlinux EXPORT_SYMBOL
++0x70469604 ipcomp_output net/xfrm/xfrm_ipcomp EXPORT_SYMBOL_GPL
++0x77d48f27 nf_ct_expect_related_report net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x4afdeb11 svc_addsock vmlinux EXPORT_SYMBOL_GPL
++0xe266f2c3 usb_stor_bulk_transfer_buf vmlinux EXPORT_SYMBOL_GPL
++0x824b05c2 tty_init_termios vmlinux EXPORT_SYMBOL_GPL
++0x20257b88 pci_enable_device_io vmlinux EXPORT_SYMBOL
++0x5d6bdce1 flex_array_alloc vmlinux EXPORT_SYMBOL
++0x61471532 blk_queue_bounce vmlinux EXPORT_SYMBOL
++0x97b13dad __clocksource_register_scale vmlinux EXPORT_SYMBOL_GPL
++0x3145216f pci_dev_present vmlinux EXPORT_SYMBOL
++0x4ff7c43d pci_dev_get vmlinux EXPORT_SYMBOL
++0xe23d3f77 pci_dev_put vmlinux EXPORT_SYMBOL
++0x45d0d7e1 scsi_cmd_blk_ioctl vmlinux EXPORT_SYMBOL
++0x51f53371 crypto_alloc_instance2 vmlinux EXPORT_SYMBOL_GPL
++0x62916e11 read_dev_sector vmlinux EXPORT_SYMBOL
++0x31389d75 usb_ifnum_to_if vmlinux EXPORT_SYMBOL_GPL
++0xd34d1db1 debugfs_create_x16 vmlinux EXPORT_SYMBOL_GPL
++0x14ae9650 journal_create vmlinux EXPORT_SYMBOL
++0x8f6ab23e fsnotify_put_group vmlinux EXPORT_SYMBOL_GPL
++0xd81de62c ring_buffer_record_enable vmlinux EXPORT_SYMBOL_GPL
++0x7400f11e inet6_destroy_sock vmlinux EXPORT_SYMBOL_GPL
++0xc15f809f mb_cache_entry_release vmlinux EXPORT_SYMBOL
++0x5c37f319 _raw_spin_unlock_irqrestore vmlinux EXPORT_SYMBOL
++0x061651be strcat vmlinux EXPORT_SYMBOL
++0xec7e08c7 crypto_register_shash vmlinux EXPORT_SYMBOL_GPL
++0x37c68932 inet6_unregister_protosw vmlinux EXPORT_SYMBOL
++0xa869fd87 nf_register_hooks vmlinux EXPORT_SYMBOL
++0x218ce3f7 pfifo_qdisc_ops vmlinux EXPORT_SYMBOL
++0xf202c5cb radix_tree_insert vmlinux EXPORT_SYMBOL
++0xc59cbc6c vfs_listxattr vmlinux EXPORT_SYMBOL_GPL
++0x1f01c966 find_get_pages_contig vmlinux EXPORT_SYMBOL
++0x388f9128 xfrm_state_walk_done vmlinux EXPORT_SYMBOL
++0xf09c4ca9 qdisc_create_dflt vmlinux EXPORT_SYMBOL
++0x3dbda9ad uart_add_one_port vmlinux EXPORT_SYMBOL
++0xee449310 key_put vmlinux EXPORT_SYMBOL
++0x354798cd bmap vmlinux EXPORT_SYMBOL
++0xe2fae716 kmemdup vmlinux EXPORT_SYMBOL
++0x3f629ad2 __blocking_notifier_call_chain vmlinux EXPORT_SYMBOL_GPL
++0xc6314004 _copy_from_pages vmlinux EXPORT_SYMBOL_GPL
++0xcf901697 __strnlen_user vmlinux EXPORT_SYMBOL
++0x50ff1361 nf_conntrack_alloc net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x1445f5e0 tcp_register_congestion_control vmlinux EXPORT_SYMBOL_GPL
++0xbe130622 tcp_gro_complete vmlinux EXPORT_SYMBOL
++0x4d974b9c register_sysrq_key vmlinux EXPORT_SYMBOL
++0x77747da3 timerqueue_add vmlinux EXPORT_SYMBOL_GPL
++0x481b8361 sync_filesystem vmlinux EXPORT_SYMBOL_GPL
++0x15c3f98b tcp_connect vmlinux EXPORT_SYMBOL
++0xdce0a469 neigh_table_clear vmlinux EXPORT_SYMBOL
++0xb185dff3 of_phy_find_device vmlinux EXPORT_SYMBOL
++0x89f238f8 thermal_zone_bind_cooling_device vmlinux EXPORT_SYMBOL
++0x7c3b0956 do_munmap vmlinux EXPORT_SYMBOL
++0xd05dc2a3 xfrm_aalg_get_byname vmlinux EXPORT_SYMBOL_GPL
++0x2ebf2b40 xfrm_state_flush vmlinux EXPORT_SYMBOL
++0x5fd6befa mmc_align_data_size vmlinux EXPORT_SYMBOL
++0xd2fd47b5 pci_fixup_device vmlinux EXPORT_SYMBOL
++0xd6e34b40 fat_flush_inodes vmlinux EXPORT_SYMBOL_GPL
++0xbdf53fa0 xfrm_find_acq_byseq vmlinux EXPORT_SYMBOL
++0xee328371 xfrm_policy_unregister_afinfo vmlinux EXPORT_SYMBOL
++0x06aee4ce __rtnl_af_register vmlinux EXPORT_SYMBOL_GPL
++0x09c55cec schedule_timeout_interruptible vmlinux EXPORT_SYMBOL
++0x1ace138d bitmap_allocate_region vmlinux EXPORT_SYMBOL
++0x250113b4 memory_read_from_buffer vmlinux EXPORT_SYMBOL
++0xbb5d343d xfrm_get_acqseq vmlinux EXPORT_SYMBOL
++0x33deca5d __scsi_iterate_devices vmlinux EXPORT_SYMBOL
++0xa94aefc1 svc_reserve vmlinux EXPORT_SYMBOL_GPL
++0x6709e159 spi_register_driver vmlinux EXPORT_SYMBOL_GPL
++0xb03b00cd platform_bus vmlinux EXPORT_SYMBOL_GPL
++0xe92bef79 blk_queue_bounce_limit vmlinux EXPORT_SYMBOL
++0x7c543650 netpoll_setup vmlinux EXPORT_SYMBOL
++0xc6ef7368 skb_abort_seq_read vmlinux EXPORT_SYMBOL
++0x2b0ba2b0 scsi_sense_desc_find vmlinux EXPORT_SYMBOL
++0xe197c70b journal_destroy vmlinux EXPORT_SYMBOL
++0xef33727a journal_restart vmlinux EXPORT_SYMBOL
++0x5857b225 ioread16_rep vmlinux EXPORT_SYMBOL
++0x251c3936 inet6_ioctl vmlinux EXPORT_SYMBOL
++0x91fbfe0b tcp_getsockopt vmlinux EXPORT_SYMBOL
++0x1a4fb9e4 tcp_setsockopt vmlinux EXPORT_SYMBOL
++0x6d346876 rtnl_unicast vmlinux EXPORT_SYMBOL
++0x03564dce alloc_disk_node vmlinux EXPORT_SYMBOL
++0x8949858b schedule_work vmlinux EXPORT_SYMBOL
++0x503b8f3e dequeue_signal vmlinux EXPORT_SYMBOL_GPL
++0x91279f07 __rtnl_af_unregister vmlinux EXPORT_SYMBOL_GPL
++0xc8d078df skb_gro_reset_offset vmlinux EXPORT_SYMBOL
++0xb93672bb sysdev_driver_unregister vmlinux EXPORT_SYMBOL_GPL
++0xc553e282 crypto_ablkcipher_type vmlinux EXPORT_SYMBOL_GPL
++0x405b9539 ip6t_register_table net/ipv6/netfilter/ip6_tables EXPORT_SYMBOL
++0x5228f707 crypto_tfm_in_queue vmlinux EXPORT_SYMBOL_GPL
++0x8133f7e5 fget_raw vmlinux EXPORT_SYMBOL
++0x30301151 atomic_notifier_call_chain vmlinux EXPORT_SYMBOL_GPL
++0xcb3c7b08 spi_add_device vmlinux EXPORT_SYMBOL_GPL
++0xfc02b7ad sysctl_tcp_wmem vmlinux EXPORT_SYMBOL
++0xb075d9fd nf_unregister_hook vmlinux EXPORT_SYMBOL
++0x9c723b65 napi_frags_skb vmlinux EXPORT_SYMBOL
++0xe5f91be5 dev_change_net_namespace vmlinux EXPORT_SYMBOL_GPL
++0xd0243795 unregister_mtd_user vmlinux EXPORT_SYMBOL_GPL
++0xc63a5ea9 blk_queue_flush_queueable vmlinux EXPORT_SYMBOL_GPL
++0xa6c79ad9 blk_queue_rq_timeout vmlinux EXPORT_SYMBOL_GPL
++0x04f27610 xdr_init_decode_pages vmlinux EXPORT_SYMBOL_GPL
++0x39a0825d tcp_twsk_destructor vmlinux EXPORT_SYMBOL_GPL
++0xc363ac9f scm_detach_fds vmlinux EXPORT_SYMBOL
++0x1bab249b rtc_ktime_to_tm vmlinux EXPORT_SYMBOL_GPL
++0x7d7fd860 usb_stor_pre_reset vmlinux EXPORT_SYMBOL_GPL
++0x50c8b1e3 put_pid vmlinux EXPORT_SYMBOL_GPL
++0xa77ad493 driver_find_device vmlinux EXPORT_SYMBOL_GPL
++0x58918a30 posix_clock_register vmlinux EXPORT_SYMBOL_GPL
++0xcc4bd58a __par_io_config_pin vmlinux EXPORT_SYMBOL
++0xc35e28f7 llc_sap_list_lock vmlinux EXPORT_SYMBOL
++0xa03ef198 blk_get_request vmlinux EXPORT_SYMBOL
++0x6a3e01d7 pci_read_irq_line vmlinux EXPORT_SYMBOL
++0x6e7474fc xfrm_ealg_get_byid vmlinux EXPORT_SYMBOL_GPL
++0x71dc9998 crypto_il_tab vmlinux EXPORT_SYMBOL_GPL
++0x0cc1e40f crypto_it_tab vmlinux EXPORT_SYMBOL_GPL
++0x3dc916b6 crypto_fl_tab vmlinux EXPORT_SYMBOL_GPL
++0x40d46b21 crypto_ft_tab vmlinux EXPORT_SYMBOL_GPL
++0x4678aa19 down_timeout vmlinux EXPORT_SYMBOL
++0xd2d0e6b4 nfnetlink_has_listeners net/netfilter/nfnetlink EXPORT_SYMBOL_GPL
++0x3bd1b1f6 msecs_to_jiffies vmlinux EXPORT_SYMBOL
++0xce06503d misc_deregister vmlinux EXPORT_SYMBOL
++0xd03a6957 blkdev_fsync vmlinux EXPORT_SYMBOL
++0x5f945856 lookup_one_len vmlinux EXPORT_SYMBOL
++0x7e50cea1 relay_buf_full vmlinux EXPORT_SYMBOL_GPL
++0x6437bd2e inet6_bind vmlinux EXPORT_SYMBOL
++0x3e45e9ff register_inetaddr_notifier vmlinux EXPORT_SYMBOL
++0xa1f0bf08 atomic_dec_and_mutex_lock vmlinux EXPORT_SYMBOL
++0x0de06988 cpu_first_thread_of_core vmlinux EXPORT_SYMBOL_GPL
++0xc5338f4a devres_add vmlinux EXPORT_SYMBOL_GPL
++0xcacda582 devres_get vmlinux EXPORT_SYMBOL_GPL
++0x43e83ea6 journal_wipe vmlinux EXPORT_SYMBOL
++0x8fc5394e pci_set_mwi vmlinux EXPORT_SYMBOL
++0xdce39544 sync_inodes_sb vmlinux EXPORT_SYMBOL
++0x7485e15e unregister_chrdev_region vmlinux EXPORT_SYMBOL
++0x7e25ca93 generic_writepages vmlinux EXPORT_SYMBOL
++0x9d13ddee register_8022_client vmlinux EXPORT_SYMBOL
++0x3847c175 gpiochip_is_requested vmlinux EXPORT_SYMBOL_GPL
++0xf1cf3036 blk_set_default_limits vmlinux EXPORT_SYMBOL
++0x861bbc41 blk_init_allocated_queue vmlinux EXPORT_SYMBOL
++0xe7c5e070 rtnl_register vmlinux EXPORT_SYMBOL_GPL
++0x58f81e73 lookup_bdev vmlinux EXPORT_SYMBOL
++0x0ef20db1 kernstart_addr vmlinux EXPORT_SYMBOL
++0xe484e35f ioread32 vmlinux EXPORT_SYMBOL
++0xdc732024 irq_stat vmlinux EXPORT_SYMBOL
++0x88632b55 raw_seq_stop vmlinux EXPORT_SYMBOL_GPL
++0x1087ecc8 gnet_stats_copy_basic vmlinux EXPORT_SYMBOL
++0xfe35aa4a percpu_counter_destroy vmlinux EXPORT_SYMBOL
++0xa974f717 create_mnt_ns vmlinux EXPORT_SYMBOL
++0xaf8e5276 vm_map_ram vmlinux EXPORT_SYMBOL
++0x7b82dc37 filemap_fdatawrite_range vmlinux EXPORT_SYMBOL
++0xa6cf1ffb inet_sendmsg vmlinux EXPORT_SYMBOL
++0xa60ddb99 ip_cmsg_recv vmlinux EXPORT_SYMBOL
++0xb77bbb6e hidinput_report_event vmlinux EXPORT_SYMBOL_GPL
++0x397ef9ad crypto_alg_sem vmlinux EXPORT_SYMBOL_GPL
++0x3e2af9cd bio_sector_offset vmlinux EXPORT_SYMBOL
++0x2bc61da1 program_check_exception vmlinux EXPORT_SYMBOL
++0xa4beec26 rpc_call_async vmlinux EXPORT_SYMBOL_GPL
++0xed312eb2 pci_unblock_user_cfg_access vmlinux EXPORT_SYMBOL_GPL
++0x79ac1dd3 cpu_sibling_map vmlinux EXPORT_SYMBOL
++0x760b437a unregister_inetaddr_notifier vmlinux EXPORT_SYMBOL
++0x6f707520 unregister_exec_domain vmlinux EXPORT_SYMBOL
++0x262e837a nobh_write_begin vmlinux EXPORT_SYMBOL
++0xd2cd5568 interruptible_sleep_on_timeout vmlinux EXPORT_SYMBOL
++0xbcdd82e7 netlink_ack vmlinux EXPORT_SYMBOL
++0x4b24bd8a sock_no_bind vmlinux EXPORT_SYMBOL
++0x29080e5d sock_get_timestamp vmlinux EXPORT_SYMBOL
++0x4211c3c1 zlib_inflateInit2 vmlinux EXPORT_SYMBOL
++0x8fc7f839 param_set_charp vmlinux EXPORT_SYMBOL
++0xb60b5707 of_i8042_aux_irq vmlinux EXPORT_SYMBOL_GPL
++0x9dbbba05 bio_free vmlinux EXPORT_SYMBOL
++0xef1c781c vid_which_vrm drivers/hwmon/hwmon-vid EXPORT_SYMBOL
++0x6bdcfd99 qdisc_class_hash_remove vmlinux EXPORT_SYMBOL
++0x5e59780b dmam_alloc_noncoherent vmlinux EXPORT_SYMBOL
++0x495b01eb transport_destroy_device vmlinux EXPORT_SYMBOL_GPL
++0x37179733 tty_unregister_device vmlinux EXPORT_SYMBOL
++0xbf8ba54a vprintk vmlinux EXPORT_SYMBOL
++0x2e2ce9e0 sysctl_tcp_syncookies vmlinux EXPORT_SYMBOL
++0xcb40eb53 tcp_poll vmlinux EXPORT_SYMBOL
++0x2482e688 vsprintf vmlinux EXPORT_SYMBOL
++0x3d055d0f generic_splice_sendpage vmlinux EXPORT_SYMBOL
++0xdda593ad attribute_container_find_class_device vmlinux EXPORT_SYMBOL_GPL
++0x0b92397e register_key_type vmlinux EXPORT_SYMBOL
++0xeaea2b74 grab_cache_page_write_begin vmlinux EXPORT_SYMBOL
++0xc2f8a90a rt_mutex_lock_interruptible vmlinux EXPORT_SYMBOL_GPL
++0x598ee3d1 cpu_add_dev_attr_group vmlinux EXPORT_SYMBOL_GPL
++0x10e1bae1 __mtd_next_device vmlinux EXPORT_SYMBOL_GPL
++0xc62f6317 class_create_file vmlinux EXPORT_SYMBOL_GPL
++0x0cae232b utf16s_to_utf8s vmlinux EXPORT_SYMBOL
++0x2f15682e __put_task_struct vmlinux EXPORT_SYMBOL_GPL
++0xcd86c87f __cond_resched_lock vmlinux EXPORT_SYMBOL
++0x1a6a10dd rpc_get_mount vmlinux EXPORT_SYMBOL_GPL
++0x854bdca7 unregister_pernet_subsys vmlinux EXPORT_SYMBOL_GPL
++0x13bbe2f0 wait_on_sync_kiocb vmlinux EXPORT_SYMBOL
++0x7c39cb83 simple_write_begin vmlinux EXPORT_SYMBOL
++0x219087eb bdi_set_max_ratio vmlinux EXPORT_SYMBOL
++0x53bc4229 redirty_page_for_writepage vmlinux EXPORT_SYMBOL
++0x8ffe7e89 nf_conntrack_htable_size net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x44427913 netdev_emerg vmlinux EXPORT_SYMBOL
++0x610b8968 sk_stream_kill_queues vmlinux EXPORT_SYMBOL
++0xe151f34a dev_set_name vmlinux EXPORT_SYMBOL_GPL
++0xeb37101c audit_log_end vmlinux EXPORT_SYMBOL
++0x6d40a921 need_ipv4_conntrack net/ipv4/netfilter/nf_conntrack_ipv4 EXPORT_SYMBOL_GPL
++0xf8bb5353 __sk_dst_check vmlinux EXPORT_SYMBOL
++0x65dbe5b6 usb_queue_reset_device vmlinux EXPORT_SYMBOL_GPL
++0xd7592f72 cfi_varsize_frob vmlinux EXPORT_SYMBOL
++0xbfff4b41 elv_register_queue vmlinux EXPORT_SYMBOL
++0x716265c7 debugfs_initialized vmlinux EXPORT_SYMBOL_GPL
++0x73564277 __timecompare_update vmlinux EXPORT_SYMBOL_GPL
++0x003ed69a __kfifo_dma_in_prepare vmlinux EXPORT_SYMBOL
++0x6db428e3 cpu_core_map vmlinux EXPORT_SYMBOL
++0x9bf6538b usb_interrupt_msg vmlinux EXPORT_SYMBOL_GPL
++0xe30d26f6 bus_unregister vmlinux EXPORT_SYMBOL_GPL
++0x4c759827 byte_rev_table vmlinux EXPORT_SYMBOL_GPL
++0x964d2406 __elv_add_request vmlinux EXPORT_SYMBOL
++0x37305e47 skcipher_geniv_init vmlinux EXPORT_SYMBOL_GPL
++0x5e3c72b7 set_bh_page vmlinux EXPORT_SYMBOL
++0x01a5485d crypto_destroy_tfm vmlinux EXPORT_SYMBOL_GPL
++0x73331311 filemap_fault vmlinux EXPORT_SYMBOL
++0xe914e41e strcpy vmlinux EXPORT_SYMBOL
++0x1bc3edc2 usb_stor_sense_invalidCDB vmlinux EXPORT_SYMBOL_GPL
++0xa1076c97 tty_pair_get_tty vmlinux EXPORT_SYMBOL
++0xa7d098e3 tty_pair_get_pty vmlinux EXPORT_SYMBOL
++0xa0ada1ea key_payload_reserve vmlinux EXPORT_SYMBOL
++0x9da8160b blocking_notifier_chain_register vmlinux EXPORT_SYMBOL_GPL
++0x462da1bf nf_ct_insert_dying_list net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x2e4f42a4 skb_unlink vmlinux EXPORT_SYMBOL
++0x4a9e6b51 crypto_register_template vmlinux EXPORT_SYMBOL_GPL
++0xaab9f7e7 node_states vmlinux EXPORT_SYMBOL
++0x6a5fb566 rcu_sched_force_quiescent_state vmlinux EXPORT_SYMBOL_GPL
++0x6cc37c70 of_property_read_u32_array vmlinux EXPORT_SYMBOL_GPL
++0xbf1cc04b tty_termios_encode_baud_rate vmlinux EXPORT_SYMBOL_GPL
++0x0199224f inet_csk_delete_keepalive_timer vmlinux EXPORT_SYMBOL
++0x47776c55 of_parse_phandle vmlinux EXPORT_SYMBOL
++0x10daa86c usb_hcd_pci_shutdown vmlinux EXPORT_SYMBOL_GPL
++0x6b25bb62 pci_bus_set_ops vmlinux EXPORT_SYMBOL
++0x24518ffa xfrm_state_register_afinfo vmlinux EXPORT_SYMBOL
++0xd2e16256 usb_register_device_driver vmlinux EXPORT_SYMBOL_GPL
++0x8df7d3c5 subsys_interface_unregister vmlinux EXPORT_SYMBOL_GPL
++0x9ed6b52d kmem_cache_size vmlinux EXPORT_SYMBOL
++0x8be716ab inet_ioctl vmlinux EXPORT_SYMBOL
++0x8a1f2ce8 of_device_register vmlinux EXPORT_SYMBOL
++0x0c8c9e99 scsi_show_extd_sense vmlinux EXPORT_SYMBOL
++0x503084b0 __pci_reset_function vmlinux EXPORT_SYMBOL_GPL
++0x5c4260ae kobject_get_path vmlinux EXPORT_SYMBOL_GPL
++0xc55c2a9d inode_sb_list_lock vmlinux EXPORT_SYMBOL_GPL
++0xd8ce7e67 clocksource_register vmlinux EXPORT_SYMBOL
++0x66dc52b5 xt_register_target vmlinux EXPORT_SYMBOL
++0x0a882a67 ping_prot vmlinux EXPORT_SYMBOL
++0x814e7730 nf_ct_destroy vmlinux EXPORT_SYMBOL
++0xbceeac4f nf_unregister_hooks vmlinux EXPORT_SYMBOL
++0x1db99742 device_create_vargs vmlinux EXPORT_SYMBOL_GPL
++0x3668dd26 tty_port_hangup vmlinux EXPORT_SYMBOL
++0x8810ad5e crypto_xor vmlinux EXPORT_SYMBOL_GPL
++0x45bf1ff3 crypto_inc vmlinux EXPORT_SYMBOL_GPL
++0x8f784e32 cpu_bit_bitmap vmlinux EXPORT_SYMBOL_GPL
++0x35448c65 rpc_free_iostats vmlinux EXPORT_SYMBOL_GPL
++0xede6b327 rpc_destroy_wait_queue vmlinux EXPORT_SYMBOL_GPL
++0x6eea229d svcauth_unix_purge vmlinux EXPORT_SYMBOL_GPL
++0xb286adee usb_hcd_poll_rh_status vmlinux EXPORT_SYMBOL_GPL
++0xfa4b3895 device_find_child vmlinux EXPORT_SYMBOL_GPL
++0xe5404b68 fat_getattr vmlinux EXPORT_SYMBOL_GPL
++0xda5c059a fat_setattr vmlinux EXPORT_SYMBOL_GPL
++0x7a43615e generic_read_dir vmlinux EXPORT_SYMBOL
++0x88afffc0 dentry_unhash vmlinux EXPORT_SYMBOL
++0xe007de41 kallsyms_lookup_name vmlinux EXPORT_SYMBOL_GPL
++0xe99d91ed validate_sp vmlinux EXPORT_SYMBOL
++0xf0933596 xprt_lookup_rqst vmlinux EXPORT_SYMBOL_GPL
++0xfade055f do_splice_to vmlinux EXPORT_SYMBOL_GPL
++0xda28eb83 writeback_inodes_sb_if_idle vmlinux EXPORT_SYMBOL
++0xdf86ee64 truncate_pagecache vmlinux EXPORT_SYMBOL
++0x26b71fb4 ring_buffer_time_stamp vmlinux EXPORT_SYMBOL_GPL
++0x5fcdec5d xfrm_ealg_get_byidx vmlinux EXPORT_SYMBOL_GPL
++0xdf7531cb sock_no_shutdown vmlinux EXPORT_SYMBOL
++0x2764e8b7 of_device_unregister vmlinux EXPORT_SYMBOL
++0xf5f63ca5 __generic_block_fiemap vmlinux EXPORT_SYMBOL
++0xb1acbcce rcu_barrier_sched vmlinux EXPORT_SYMBOL_GPL
++0xdc2519e0 param_set_ulong vmlinux EXPORT_SYMBOL
++0xee2d0fc7 _local_bh_enable vmlinux EXPORT_SYMBOL
++0x36b0e732 try_wait_for_completion vmlinux EXPORT_SYMBOL
++0x80dfc988 nf_ct_expect_alloc net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0xc4bf0a92 sysfs_unmerge_group vmlinux EXPORT_SYMBOL_GPL
++0xcbf0b653 cpu_active_mask vmlinux EXPORT_SYMBOL
++0x4498d5aa bus_find_device_by_name vmlinux EXPORT_SYMBOL_GPL
++0x29b96a8a inet_peer_xrlim_allow vmlinux EXPORT_SYMBOL
++0x2a23b66d nf_ct_attach vmlinux EXPORT_SYMBOL
++0xe5ed5467 xfrm_policy_walk_init vmlinux EXPORT_SYMBOL
++0xb0f3f389 driver_attach vmlinux EXPORT_SYMBOL_GPL
++0x0dbd5a25 textsearch_register vmlinux EXPORT_SYMBOL
++0x74baf17a tracing_is_on vmlinux EXPORT_SYMBOL_GPL
++0x381a798a setup_max_cpus vmlinux EXPORT_SYMBOL
++0x5bfbe895 commit_creds vmlinux EXPORT_SYMBOL
++0xd772ed24 __nf_ct_expect_find net/netfilter/nf_conntrack EXPORT_SYMBOL_GPL
++0x5db93a7c platform_device_register vmlinux EXPORT_SYMBOL_GPL
++0x5934392b fb_register_client vmlinux EXPORT_SYMBOL
++0xad0413d4 match_hex vmlinux EXPORT_SYMBOL
++0x0ffce14a __inet_lookup_listener vmlinux EXPORT_SYMBOL_GPL
++0x79eb7536 nf_unregister_sockopt vmlinux EXPORT_SYMBOL
++0x63f2715f __skb_get_rxhash vmlinux EXPORT_SYMBOL
++0x6029f865 skb_realloc_headroom vmlinux EXPORT_SYMBOL
++0x183abba7 platform_device_unregister vmlinux EXPORT_SYMBOL_GPL
++0x4373b84f serial8250_set_isa_configurator vmlinux EXPORT_SYMBOL
++0x9e38fbad generic_pipe_buf_map vmlinux EXPORT_SYMBOL
++0xba1338f3 generic_pipe_buf_get vmlinux EXPORT_SYMBOL
++0xb4b61245 ipv6_find_hdr net/ipv6/netfilter/ip6_tables EXPORT_SYMBOL
++0x2a14e5c1 uhci_reset_hc vmlinux EXPORT_SYMBOL_GPL
++0xfd1f0623 tty_port_close_end vmlinux EXPORT_SYMBOL
++0x77df0847 __set_personality vmlinux EXPORT_SYMBOL
++0x0e3bcc66 blkcipher_walk_done vmlinux EXPORT_SYMBOL_GPL
++0x731705d7 page_readlink vmlinux EXPORT_SYMBOL
++0xaa181411 account_page_writeback vmlinux EXPORT_SYMBOL
++0x6976522d nf_unregister_afinfo vmlinux EXPORT_SYMBOL_GPL
++0xf5eb86ea blk_verify_command vmlinux EXPORT_SYMBOL
++0xc499ae1e kstrdup vmlinux EXPORT_SYMBOL
++0x0e8f30f6 _raw_write_lock_irq vmlinux EXPORT_SYMBOL
++0x89da4432 of_iomap vmlinux EXPORT_SYMBOL
++0x81a07f4e _atomic_dec_and_lock vmlinux EXPORT_SYMBOL
++0xea7987f1 key_update vmlinux EXPORT_SYMBOL
++0xe18ba8e7 xfrm_register_km vmlinux EXPORT_SYMBOL
++0x31a77643 ip_mc_dec_group vmlinux EXPORT_SYMBOL
++0x733c3b54 kasprintf vmlinux EXPORT_SYMBOL
++0x2a24f9c2 simple_rename vmlinux EXPORT_SYMBOL
++0xb2729dbd vfs_setxattr vmlinux EXPORT_SYMBOL_GPL
++0x7d012ee7 vfs_getxattr vmlinux EXPORT_SYMBOL_GPL
++0xa3dd3ddd sock_init_data vmlinux EXPORT_SYMBOL
++0xb2d2b9ab tty_set_termios vmlinux EXPORT_SYMBOL_GPL
++0xe02eb6d0 ring_buffer_commit_overrun_cpu vmlinux EXPORT_SYMBOL_GPL
++0x3a536bd7 ring_buffer_read_finish vmlinux EXPORT_SYMBOL_GPL
++0xde48e9ca _raw_spin_lock vmlinux EXPORT_SYMBOL
++0xba707a78 qe_get_brg_clk vmlinux EXPORT_SYMBOL
++0xc37dddf0 ip_queue_xmit vmlinux EXPORT_SYMBOL
++0x715949d4 class_dev_iter_init vmlinux EXPORT_SYMBOL_GPL
++0x2b2f7e10 pci_get_slot vmlinux EXPORT_SYMBOL
++0x2eb91dfe scatterwalk_map vmlinux EXPORT_SYMBOL_GPL
++0x69a0ca7d iowrite16be vmlinux EXPORT_SYMBOL
++0x6acb973d iowrite32be vmlinux EXPORT_SYMBOL
++0xf4a2585b km_query vmlinux EXPORT_SYMBOL
++0xf9ea6336 inet_release vmlinux EXPORT_SYMBOL
++0x85da4665 blk_queue_start_tag vmlinux EXPORT_SYMBOL
++0x5549ab6e xprt_alloc vmlinux EXPORT_SYMBOL_GPL
++0xe9492d51 neigh_create vmlinux EXPORT_SYMBOL
++0xd3af87a4 usb_stor_CB_transport vmlinux EXPORT_SYMBOL_GPL
++0x9fce80db fb_notifier_call_chain vmlinux EXPORT_SYMBOL_GPL
++0x373db350 kstrtoint vmlinux EXPORT_SYMBOL
++0xdd4a0569 log_start_commit vmlinux EXPORT_SYMBOL
++0x8f6cee77 __round_jiffies_relative vmlinux EXPORT_SYMBOL_GPL
++0x002c769b svc_pool_stats_open vmlinux EXPORT_SYMBOL
++0x536fa1b6 inet_twsk_alloc vmlinux EXPORT_SYMBOL_GPL
++0x978bfc35 tty_put_char vmlinux EXPORT_SYMBOL_GPL
++0x037a0cba kfree vmlinux EXPORT_SYMBOL
++0x5868f579 __rt_mutex_init vmlinux EXPORT_SYMBOL_GPL
++0x6e545da1 kill_pid_info_as_cred vmlinux EXPORT_SYMBOL_GPL
++0x17b07df4 vlan_dev_real_dev vmlinux EXPORT_SYMBOL
++0x3562e58c xfrm_state_delete vmlinux EXPORT_SYMBOL
++0xe492a8e1 nf_register_sockopt vmlinux EXPORT_SYMBOL
++0xbc979fa3 sock_kmalloc vmlinux EXPORT_SYMBOL
++0xb894926d schedule_work_on vmlinux EXPORT_SYMBOL
++0xb2c6eb9f pci_lost_interrupt vmlinux EXPORT_SYMBOL
++0xe7d4daac seq_list_next vmlinux EXPORT_SYMBOL
++0x538383c0 unregister_inet6addr_notifier vmlinux EXPORT_SYMBOL
++0x0d3cc82c of_irq_map_one vmlinux EXPORT_SYMBOL_GPL
++0xa06df9e1 __kfifo_dma_out_finish_r vmlinux EXPORT_SYMBOL
++0xeb7e4ace ipv6_chk_addr vmlinux EXPORT_SYMBOL
++0xdf967a1b uart_suspend_port vmlinux EXPORT_SYMBOL
++0xfb8ca5ae __blkdev_driver_ioctl vmlinux EXPORT_SYMBOL_GPL
++0x1f020c91 blk_alloc_queue_node vmlinux EXPORT_SYMBOL
++0xa3fb4a58 scsi_device_resume vmlinux EXPORT_SYMBOL
++0xafd68c33 flex_array_free vmlinux EXPORT_SYMBOL
++0xc3fb5b3d blk_queue_flush vmlinux EXPORT_SYMBOL_GPL
++0x98b9afaa bio_phys_segments vmlinux EXPORT_SYMBOL
++0xdaa57ec3 totalhigh_pages vmlinux EXPORT_SYMBOL
++0x540c4404 ipv6_find_tlv vmlinux EXPORT_SYMBOL_GPL
++0xfb3ac86b neigh_changeaddr vmlinux EXPORT_SYMBOL
++0xd59bf139 skb_recycle_check vmlinux EXPORT_SYMBOL
++0xa120d33c tty_unregister_ldisc vmlinux EXPORT_SYMBOL
++0x7dc5d0b6 crypto_unregister_notifier vmlinux EXPORT_SYMBOL_GPL
++0x9c09632d invalidate_inode_pages2 vmlinux EXPORT_SYMBOL_GPL
++0x317ce92f ipt_do_table net/ipv4/netfilter/ip_tables EXPORT_SYMBOL
++0xd726d95c scsi_calculate_bounce_limit vmlinux EXPORT_SYMBOL
++0x798959ae kmem_cache_destroy vmlinux EXPORT_SYMBOL
++0x3778ec77 add_to_page_cache_locked vmlinux EXPORT_SYMBOL
++0x4e109192 ring_buffer_entries vmlinux EXPORT_SYMBOL_GPL
++0x6d054375 xfrm_prepare_input vmlinux EXPORT_SYMBOL
++0x4333cc58 xt_find_target vmlinux EXPORT_SYMBOL
++0xb1faff50 usb_serial_disconnect vmlinux EXPORT_SYMBOL_GPL
++0xa1ba2fdb vfsmount_lock_global_lock vmlinux EXPORT_SYMBOL
++0x16947341 rpc_proc_register vmlinux EXPORT_SYMBOL_GPL
++0x6c7c7b9a rpc_queue_empty vmlinux EXPORT_SYMBOL_GPL
++0x6c394758 phy_mii_ioctl vmlinux EXPORT_SYMBOL
++0x905bba18 vm_event_states vmlinux EXPORT_SYMBOL
++0x9bce482f __release_region vmlinux EXPORT_SYMBOL
++0x43a01f90 complete_all vmlinux EXPORT_SYMBOL
++0xf020d96e tty_free_termios vmlinux EXPORT_SYMBOL
++0x347013de nla_validate vmlinux EXPORT_SYMBOL
++0x27adac45 bdi_register vmlinux EXPORT_SYMBOL
++0xc5322a9c xprt_alloc_slot vmlinux EXPORT_SYMBOL_GPL
++0x9eb0209a inet_csk_clear_xmit_timers vmlinux EXPORT_SYMBOL
++0x7129e5f8 hex_asc vmlinux EXPORT_SYMBOL
++0x7dc2f75e fat_time_unix2fat vmlinux EXPORT_SYMBOL_GPL
++0x09dfe73d nf_nat_follow_master net/ipv4/netfilter/nf_nat EXPORT_SYMBOL
++0x8ef99ed3 tty_get_pgrp vmlinux EXPORT_SYMBOL_GPL
++0x2aa0e4fc strncasecmp vmlinux EXPORT_SYMBOL
++0x53301e75 default_llseek vmlinux EXPORT_SYMBOL
++0x5e0120a8 ring_buffer_oldest_event_ts vmlinux EXPORT_SYMBOL_GPL
++0xcb3334bb tcp_read_sock vmlinux EXPORT_SYMBOL
++0xfa741e99 sdhci_pltfm_free vmlinux EXPORT_SYMBOL_GPL
++0x28535cb6 rpc_peeraddr vmlinux EXPORT_SYMBOL_GPL
++0x57958d5a ip_fragment vmlinux EXPORT_SYMBOL
++0x9aa9a810 scsi_eh_prep_cmnd vmlinux EXPORT_SYMBOL
++0x4997d11c pci_set_cacheline_size vmlinux EXPORT_SYMBOL_GPL
++0x815b5dd4 match_octal vmlinux EXPORT_SYMBOL
++0x99baa259 bio_map_kern vmlinux EXPORT_SYMBOL
++0x43969dbe rh_alloc_fixed vmlinux EXPORT_SYMBOL_GPL
++0x531c3179 xt_register_targets vmlinux EXPORT_SYMBOL
++0xf88eee18 i2c_smbus_write_byte vmlinux EXPORT_SYMBOL
++0xf77ff57d scsi_register_driver vmlinux EXPORT_SYMBOL
++0x82e96562 vfs_fsync vmlinux EXPORT_SYMBOL
++0x86acb6ae poll_freewait vmlinux EXPORT_SYMBOL
++0xb3a307c6 si_meminfo vmlinux EXPORT_SYMBOL
++0x7835cfc7 kthread_create_on_node vmlinux EXPORT_SYMBOL
++0x5e95b1cd current_umask vmlinux EXPORT_SYMBOL
++0xbd40cacd get_fs_type vmlinux EXPORT_SYMBOL
++0x377a3400 ref_module vmlinux EXPORT_SYMBOL_GPL
++0xb44478a6 qe_pin_free vmlinux EXPORT_SYMBOL
++0x8f56dfc6 nf_nat_pptp_hook_outbound net/netfilter/nf_conntrack_pptp EXPORT_SYMBOL_GPL
++0x36e46f38 tty_driver_kref_put vmlinux EXPORT_SYMBOL
++0x8e26fda2 sock_prot_inuse_get vmlinux EXPORT_SYMBOL_GPL
++0x932e22fc scsi_host_set_state vmlinux EXPORT_SYMBOL
++0x70b879e3 aead_geniv_init vmlinux EXPORT_SYMBOL_GPL
++0xf9d89d7c generic_write_end vmlinux EXPORT_SYMBOL
++0x362e23ec call_rcu_bh vmlinux EXPORT_SYMBOL_GPL
++0xbf9be642 devm_request_threaded_irq vmlinux EXPORT_SYMBOL
++0x67955ce6 profile_hits vmlinux EXPORT_SYMBOL_GPL
++0xcf764d46 __vlan_find_dev_deep vmlinux EXPORT_SYMBOL
++0x7d62fe80 of_mm_gpiochip_add vmlinux EXPORT_SYMBOL
++0x1c30dd9c genphy_config_aneg vmlinux EXPORT_SYMBOL
++0x95ad803f blk_start_queue vmlinux EXPORT_SYMBOL
++0x9c9c6a5a journal_check_used_features vmlinux EXPORT_SYMBOL
++0xe0dd2be0 bio_copy_user vmlinux EXPORT_SYMBOL
++0x7a4497db kzfree vmlinux EXPORT_SYMBOL
++0xc197d453 arpt_unregister_table net/ipv4/netfilter/arp_tables EXPORT_SYMBOL
++0x2bbf27ee sk_filter vmlinux EXPORT_SYMBOL
++0xa8f59416 gpio_direction_output vmlinux EXPORT_SYMBOL_GPL
++0x92e682eb generic_removexattr vmlinux EXPORT_SYMBOL
++0x83b88ae3 deactivate_super vmlinux EXPORT_SYMBOL
++0xa924a7ed vmap vmlinux EXPORT_SYMBOL
++0x31f0bb78 __kmap_atomic_idx vmlinux EXPORT_SYMBOL
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/debian-cumulus-controlfiles.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/debian-cumulus-controlfiles.patch
new file mode 100644
index 00000000..1d7fee1f
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/debian-cumulus-controlfiles.patch
@@ -0,0 +1,163 @@
+Patch for debian post install script
+
+diff --git a/cumulus/control.linux-headers b/cumulus/control.linux-headers
+new file mode 100644
+index 0000000..6d999dd
+--- /dev/null
++++ b/cumulus/control.linux-headers
+@@ -0,0 +1,5 @@
++Package: linux-headers
++Version: =V
++Maintainer: support@cumulusnetworks.com
++Architecture: =A
++Description: Cumulus Linux kernel headers
+diff --git a/cumulus/control.linux-image b/cumulus/control.linux-image
+new file mode 100644
+index 0000000..03fccc4
+--- /dev/null
++++ b/cumulus/control.linux-image
+@@ -0,0 +1,5 @@
++Package: linux-image
++Version: =V
++Maintainer: support@cumulusnetworks.com
++Architecture: =A
++Description: Cumulus Linux kernel
+diff --git a/cumulus/control.linux-libc-dev b/cumulus/control.linux-libc-dev
+new file mode 100644
+index 0000000..4ae15ce
+--- /dev/null
++++ b/cumulus/control.linux-libc-dev
+@@ -0,0 +1,12 @@
++Package: linux-libc-dev
++Source: linux-upstream
++Version: =V
++Architecture: =A
++Maintainer: cumulus
++Provides: linux-kernel-headers
++Section: devel
++Priority: optional
++Homepage: http://www.kernel.org/
++Description: Linux support headers for userspace development
++ This package provides userspaces headers from the Linux kernel. These headers
++ are used by the installed headers for GNU glibc and other system libraries.
+diff --git a/cumulus/etc/kernel/postinst.d/update-cumulus b/cumulus/etc/kernel/postinst.d/update-cumulus
+new file mode 100755
+index 0000000..0333980
+--- /dev/null
++++ b/cumulus/etc/kernel/postinst.d/update-cumulus
+@@ -0,0 +1,52 @@
++#!/bin/sh -e
++
++version="$1"
++
++# exit if we dont need to update the kernel and initrd
++if [ "$UPDATE_CUMULUS" = 'No' ]; then
++ exit 0
++fi
++
++. /usr/share/cumulus/img/functions
++
++# passing the kernel version is required
++if [ -z "${version}" ]; then
++ echo >&2 "W: cumulus-kernel: ${DPKG_MAINTSCRIPT_PACKAGE:-kernel package} did not pass a version number"
++ exit 2
++fi
++
++bootdir="/boot"
++kernel_newimg_src="${bootdir}/vmlinuz-${version}"
++initrd_newimg_src="${bootdir}/initrd.img-${version}"
++
++if [ ! -e "$kernel_newimg_src" ]; then
++ echo >&2 "W: cumulus-kernel: ${DPKG_MAINTSCRIPT_PACKAGE:-kernel package} cannot find kernel image"
++ exit 2
++fi
++
++if [ ! -e "$initrd_newimg_src" ]; then
++ echo >&2 "W: cumulus-kernel: ${DPKG_MAINTSCRIPT_PACKAGE:-kernel package} cannot find initrd image"
++ exit 2
++fi
++
++cl_check_env root-priv
++
++currslot=${slot_prefix}${active}
++kernel_oldimg=${bootdir}/${kernel_prefix}vmlinuz-*-${currslot}
++initrd_oldimg=${bootdir}/${kernel_prefix}initrd.img-*-${currslot}
++
++kernel_newimg_dst=${bootdir}/${kernel_prefix}vmlinuz-${version}-${currslot}
++initrd_newimg_dst=${bootdir}/${kernel_prefix}initrd.img-${version}-${currslot}
++
++#remove existing currslot images
++rm -f ${kernel_oldimg}
++rm -f ${initrd_oldimg}
++
++# Move kernel/initrd files to the kernel initrd dst files
++cmd="mv -f $kernel_newimg_src $kernel_newimg_dst"
++echo "$cmd"
++$cmd
++
++cmd="mv -f $initrd_newimg_src $initrd_newimg_dst"
++echo "$cmd"
++$cmd
+diff --git a/cumulus/postinst.linux-image.powerpc b/cumulus/postinst.linux-image.powerpc
+new file mode 100755
+index 0000000..2aabfea
+--- /dev/null
++++ b/cumulus/postinst.linux-image.powerpc
+@@ -0,0 +1,57 @@
++#!/bin/sh
++# postinst script for switchd
++#
++# see: dh_installdeb(1)
++
++set -e
++
++# summary of how this script can be called:
++# * `configure'
++# * `abort-upgrade'
++# * `abort-remove' `in-favour'
++#
++# * `abort-remove'
++# * `abort-deconfigure' `in-favour'
++# `removing'
++#
++# for details, see http://www.debian.org/doc/debian-policy/ or
++# the debian-policy package
++
++
++case "$1" in
++ configure)
++ ;;
++
++ abort-upgrade|abort-remove|abort-deconfigue)
++ exit 1
++ ;;
++ *)
++ echo "postinst called with unknown argument \`$1'" >&2
++ exit 1
++ ;;
++esac
++
++. /usr/share/cumulus/img/functions
++
++install_file=/usr/share/cumulus/.installer/kernel_install.sh
++kimage_linkname="uImage.itb"
++kimage_name="uImage-=V-=A.itb"
++kimage_path="/boot/"$kimage_name
++
++if [ -e "/.buildroot" ]; then
++ cd /boot && ln -sf $kimage_name $kimage_linkname
++ exit 0
++fi
++
++cl_check_env root-priv
++slot=$active
++
++sh $install_file $kimage_path $slot || {
++ log_failure_msg "Kernel installtion failed."
++ log_failure_msg "Problems installing image file."
++ exit 1
++}
++
++cd /boot && ln -sf $kimage_name $kimage_linkname
++
++exit 0
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/debian-cumulus-post-inst.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/debian-cumulus-post-inst.patch
new file mode 100644
index 00000000..b0e357c0
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/debian-cumulus-post-inst.patch
@@ -0,0 +1,60 @@
+Patch for debian post install script
+
+diff --git a/cumulus/postinst b/cumulus/postinst
+new file mode 100755
+index 0000000..6b9ca39
+--- /dev/null
++++ b/cumulus/postinst
+@@ -0,0 +1,52 @@
++#!/bin/sh
++# postinst script for switchd
++#
++# see: dh_installdeb(1)
++
++set -e
++
++# summary of how this script can be called:
++# * `configure'
++# * `abort-upgrade'
++# * `abort-remove' `in-favour'
++#
++# * `abort-remove'
++# * `abort-deconfigure' `in-favour'
++# `removing'
++#
++# for details, see http://www.debian.org/doc/debian-policy/ or
++# the debian-policy package
++
++
++case "$1" in
++ configure)
++ ;;
++
++ abort-upgrade|abort-remove|abort-deconfigue)
++ exit 1
++ ;;
++ *)
++ echo "postinst called with unknown argument \`$1'" >&2
++ exit 1
++ ;;
++esac
++
++. /usr/share/cumulus/img/functions
++cl_check_env root-priv
++
++install_file=/usr/share/cumulus/.installer/kernel_install.sh
++slot=$active
++kimage="/boot/uImage-${arch}.itb"
++
++sh $install_file $kimage $slot || {
++ log_failure_msg "Kernel installtion failed."
++ log_failure_msg "Problems installing image file."
++ clean_up 1
++}
++
++# dh_installdeb will replace this with shell code automatically
++# generated by other debhelper scripts.
++
++#DEBHELPER#
++
++exit 0
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/debian-postinstall-call-depmod.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/debian-postinstall-call-depmod.patch
new file mode 100644
index 00000000..dae87459
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/debian-postinstall-call-depmod.patch
@@ -0,0 +1,32 @@
+Post install hooks need to call depmod to properly load kernel modules after
+reboot.
+
+diff --git a/cumulus/etc/kernel/postinst.d/update-cumulus b/cumulus/etc/kernel/postinst.d/update-cumulus
+index 0333980..cd8d311 100755
+--- a/cumulus/etc/kernel/postinst.d/update-cumulus
++++ b/cumulus/etc/kernel/postinst.d/update-cumulus
+@@ -50,3 +50,5 @@ $cmd
+ cmd="mv -f $initrd_newimg_src $initrd_newimg_dst"
+ echo "$cmd"
+ $cmd
++
++depmod -a $version
+diff --git a/cumulus/postinst.linux-image.powerpc b/cumulus/postinst.linux-image.powerpc
+index 2aabfea..fb775d4 100755
+--- a/cumulus/postinst.linux-image.powerpc
++++ b/cumulus/postinst.linux-image.powerpc
+@@ -1,5 +1,5 @@
+ #!/bin/sh
+-# postinst script for switchd
++# postinst script for kernel
+ #
+ # see: dh_installdeb(1)
+
+@@ -54,4 +54,7 @@ sh $install_file $kimage_path $slot || {
+
+ cd /boot && ln -sf $kimage_name $kimage_linkname
+
++echo "depmod -a =V"
++depmod -a =V
++
+ exit 0
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-adt7470-knob-to-disable-smbus-timeout.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-adt7470-knob-to-disable-smbus-timeout.patch
new file mode 100644
index 00000000..9efc5fa5
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-adt7470-knob-to-disable-smbus-timeout.patch
@@ -0,0 +1,57 @@
+driver adt7470 add knob to disable smbus timeout feature
+
+The ADT7470 has a configurable feature called "disable SMBUS timeout".
+
+Quoting their data sheet:
+
+ The ADT7470 includes an SMBus timeout feature. If there is no SMBus
+ activity for more than 31 ms, the ADT7470 assumes that the bus is
+ locked and releases the bus. This prevents the device from locking
+ or holding the SMBus expecting data. Some SMBus controllers cannot
+ handle the SMBus timeout feature, so it can be disabled.
+
+It appears the FSL I2C controller cannot handle this feature. With
+the timeout enabled we see intermittent failures waiting for the bus
+to become ready or for transaction to complete.
+
+This patch adds a configurable option to the device tree. If the
+property "disable-smbus-timeout" exists in the node then the ADT7470
+driver will disable the SMBUS timeout feature.
+
+This way platforms that need to can disable this feature.
+
+diff --git a/drivers/hwmon/adt7470.c b/drivers/hwmon/adt7470.c
+index a9726c1..6ca8aae 100644
+--- a/drivers/hwmon/adt7470.c
++++ b/drivers/hwmon/adt7470.c
+@@ -32,6 +32,7 @@
+ #include
+ #include
+ #include
++#include
+
+ /* Addresses to scan */
+ static const unsigned short normal_i2c[] = { 0x2C, 0x2E, 0x2F, I2C_CLIENT_END };
+@@ -48,6 +49,7 @@ static const unsigned short normal_i2c[] = { 0x2C, 0x2E, 0x2F, I2C_CLIENT_END };
+ #define ADT7470_REG_PWM_MAX_MAX_ADDR 0x3B
+ #define ADT7470_REG_CFG 0x40
+ #define ADT7470_FSPD_MASK 0x04
++#define ADT7470_TODIS_MASK 0x08
+ #define ADT7470_REG_ALARM1 0x41
+ #define ADT7470_R1T_ALARM 0x01
+ #define ADT7470_R2T_ALARM 0x02
+@@ -225,6 +227,14 @@ static void adt7470_init_client(struct i2c_client *client)
+ if (reg < 0) {
+ dev_err(&client->dev, "cannot read configuration register\n");
+ } else {
++ struct property *pp;
++ pp = of_find_property(client->dev.of_node,
++ "disable-smbus-timeout", NULL);
++ if (pp)
++ reg |= ADT7470_TODIS_MASK;
++ else
++ reg &= ~ADT7470_TODIS_MASK;
++
+ /* start monitoring (and do a self-test) */
+ i2c_smbus_write_byte_data(client, ADT7470_REG_CFG, reg | 3);
+ }
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-at24-add-i2cblock-disable-flag.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-at24-add-i2cblock-disable-flag.patch
new file mode 100644
index 00000000..5e709dcb
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-at24-add-i2cblock-disable-flag.patch
@@ -0,0 +1,41 @@
+Adds a flag that lets you disable FEATURE_I2C_BLOCK_READ on a device basis.
+
+diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c
+index 841631c..67f4e6f 100644
+--- a/drivers/misc/eeprom/at24.c
++++ b/drivers/misc/eeprom/at24.c
+@@ -582,8 +582,9 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)
+ if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
+ if (chip.flags & AT24_FLAG_ADDR16) {
+ use_smbus = I2C_SMBUS_BYTE_DATA;
+- } else if (i2c_check_functionality(client->adapter,
+- I2C_FUNC_SMBUS_READ_I2C_BLOCK)) {
++ } else if (!(chip.flags & AT24_FLAG_DISABLE_I2CBLOCK) &&
++ (i2c_check_functionality(client->adapter,
++ I2C_FUNC_SMBUS_READ_I2C_BLOCK))) {
+ use_smbus = I2C_SMBUS_I2C_BLOCK_DATA;
+ } else if (i2c_check_functionality(client->adapter,
+ I2C_FUNC_SMBUS_READ_WORD_DATA)) {
+@@ -630,8 +631,9 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)
+ writable = !(chip.flags & AT24_FLAG_READONLY);
+ if (writable) {
+ if (!use_smbus ||
++ (!(chip.flags & AT24_FLAG_DISABLE_I2CBLOCK) &&
+ i2c_check_functionality(client->adapter,
+- I2C_FUNC_SMBUS_WRITE_I2C_BLOCK) ||
++ I2C_FUNC_SMBUS_WRITE_I2C_BLOCK)) ||
+ i2c_check_functionality(client->adapter,
+ I2C_FUNC_SMBUS_WRITE_WORD_DATA) ||
+ i2c_check_functionality(client->adapter,
+diff --git a/include/linux/i2c/at24.h b/include/linux/i2c/at24.h
+index a881e5e..3bdb466 100644
+--- a/include/linux/i2c/at24.h
++++ b/include/linux/i2c/at24.h
+@@ -25,6 +25,7 @@ struct at24_platform_data {
+ #define AT24_FLAG_READONLY 0x40 /* sysfs-entry will be read-only */
+ #define AT24_FLAG_IRUGO 0x20 /* sysfs-entry will be world-readable */
+ #define AT24_FLAG_TAKE8ADDR 0x10 /* take always 8 addresses (24c00) */
++#define AT24_FLAG_DISABLE_I2CBLOCK 0x08 /*disable smbus i2c block access */
+
+ void (*setup)(struct memory_accessor *, void *context);
+ void *context;
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-at24-byte-word-write-access.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-at24-byte-word-write-access.patch
new file mode 100644
index 00000000..2ab2c2b2
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-at24-byte-word-write-access.patch
@@ -0,0 +1,105 @@
+Adds byte and word write access to the at24 driver
+
+diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c
+index c98c736..2ec05ce 100644
+--- a/drivers/misc/eeprom/at24.c
++++ b/drivers/misc/eeprom/at24.c
+@@ -332,6 +332,7 @@ static ssize_t at24_eeprom_write(struct at24_data *at24, const char *buf,
+ ssize_t status;
+ unsigned long timeout, write_time;
+ unsigned next_page;
++ int i = 0;
+
+ /* Get corresponding I2C address and adjust offset */
+ client = at24_translate_offset(at24, &offset);
+@@ -345,10 +346,22 @@ static ssize_t at24_eeprom_write(struct at24_data *at24, const char *buf,
+ if (offset + count > next_page)
+ count = next_page - offset;
+
+- /* If we'll use I2C calls for I/O, set up the message */
+- if (!at24->use_smbus) {
+- int i = 0;
+
++ switch (at24->use_smbus) {
++ case I2C_SMBUS_I2C_BLOCK_DATA:
++ /* Smaller eeproms can work given some SMBus extension calls */
++ if (count > I2C_SMBUS_BLOCK_MAX)
++ count = I2C_SMBUS_BLOCK_MAX;
++ break;
++ case I2C_SMBUS_WORD_DATA:
++ /* Check for odd length transaction */
++ count = (count == 1) ? 1 : 2;
++ break;
++ case I2C_SMBUS_BYTE_DATA:
++ count = 1;
++ break;
++ default:
++ /* If we'll use I2C calls for I/O, set up the message */
+ msg.addr = client->addr;
+ msg.flags = 0;
+
+@@ -360,6 +373,7 @@ static ssize_t at24_eeprom_write(struct at24_data *at24, const char *buf,
+ msg.buf[i++] = offset;
+ memcpy(&msg.buf[i], buf, count);
+ msg.len = i + count;
++ break;
+ }
+
+ /*
+@@ -370,15 +384,37 @@ static ssize_t at24_eeprom_write(struct at24_data *at24, const char *buf,
+ timeout = jiffies + msecs_to_jiffies(write_timeout);
+ do {
+ write_time = jiffies;
+- if (at24->use_smbus) {
++ switch (at24->use_smbus) {
++ case I2C_SMBUS_I2C_BLOCK_DATA:
+ status = i2c_smbus_write_i2c_block_data(client,
+ offset, count, buf);
+ if (status == 0)
+ status = count;
+- } else {
++ break;
++ case I2C_SMBUS_WORD_DATA:
++ if (count == 2) {
++ status = i2c_smbus_write_word_data(
++ client,offset,(u16)((buf[0]) |
++ (buf[1] << 8)));
++ } else {
++ /* count = 1 */
++ status = i2c_smbus_write_byte_data(
++ client, offset, buf[0]);
++ }
++ if (status == 0)
++ status = count;
++ break;
++ case I2C_SMBUS_BYTE_DATA:
++ status = i2c_smbus_write_byte_data(client, offset,
++ buf[0]);
++ if (status == 0)
++ status = count;
++ break;
++ default:
+ status = i2c_transfer(client->adapter, &msg, 1);
+ if (status == 1)
+ status = count;
++ break;
+ }
+ dev_dbg(&client->dev, "write %zu@%d --> %zd (%ld)\n",
+ count, offset, status, jiffies);
+@@ -585,9 +621,13 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)
+
+ writable = !(chip.flags & AT24_FLAG_READONLY);
+ if (writable) {
+- if (!use_smbus || i2c_check_functionality(client->adapter,
+- I2C_FUNC_SMBUS_WRITE_I2C_BLOCK)) {
+-
++ if (!use_smbus ||
++ i2c_check_functionality(client->adapter,
++ I2C_FUNC_SMBUS_WRITE_I2C_BLOCK) ||
++ i2c_check_functionality(client->adapter,
++ I2C_FUNC_SMBUS_WRITE_WORD_DATA) ||
++ i2c_check_functionality(client->adapter,
++ I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) {
+ unsigned write_max = chip.page_size;
+
+ at24->macc.write = at24_macc_write;
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-at24-eeprom-class.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-at24-eeprom-class.patch
new file mode 100644
index 00000000..784eadf7
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-at24-eeprom-class.patch
@@ -0,0 +1,78 @@
+Add at24 based EEPROMs to the eeprom_dev hardware class
+
+During device instantiation have the at24 driver add the new device to
+the eeprom_dev hardware class. The functionality is enabled by
+CONFIG_EEPROM_CLASS.
+
+diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c
+index 47bcd10..c98c736 100644
+--- a/drivers/misc/eeprom/at24.c
++++ b/drivers/misc/eeprom/at24.c
+@@ -23,6 +23,7 @@
+ #include
+ #include
+ #include
++#include
+
+ /*
+ * I2C EEPROMs from most vendors are inexpensive and mostly interchangeable.
+@@ -68,6 +69,8 @@ struct at24_data {
+ unsigned write_max;
+ unsigned num_addresses;
+
++ struct eeprom_device *eeprom_dev;
++
+ /*
+ * Some chips tie up multiple I2C addresses; dummy devices reserve
+ * them for us, and we'll use them with SMBus calls.
+@@ -514,6 +517,7 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)
+
+ chip.setup = NULL;
+ chip.context = NULL;
++ chip.eeprom_data = NULL;
+ }
+
+ if (!is_power_of_2(chip.byte_len))
+@@ -627,6 +631,13 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)
+ if (err)
+ goto err_clients;
+
++ at24->eeprom_dev = eeprom_device_register(&client->dev, chip.eeprom_data);
++ if (IS_ERR(at24->eeprom_dev)) {
++ dev_err(&client->dev, "error registering eeprom device.\n");
++ err = PTR_ERR(at24->eeprom_dev);
++ goto err_clients;
++ }
++
+ i2c_set_clientdata(client, at24);
+
+ dev_info(&client->dev, "%zu byte %s EEPROM, %s, %u bytes/write\n",
+@@ -669,6 +680,8 @@ static int __devexit at24_remove(struct i2c_client *client)
+ for (i = 1; i < at24->num_addresses; i++)
+ i2c_unregister_device(at24->client[i]);
+
++ eeprom_device_unregister(at24->eeprom_dev);
++
+ kfree(at24->writebuf);
+ kfree(at24);
+ return 0;
+diff --git a/include/linux/i2c/at24.h b/include/linux/i2c/at24.h
+index 8ace930..a881e5e 100644
+--- a/include/linux/i2c/at24.h
++++ b/include/linux/i2c/at24.h
+@@ -3,6 +3,7 @@
+
+ #include
+ #include
++#include
+
+ /*
+ * As seen through Linux I2C, differences between the most common types of I2C
+@@ -27,6 +28,7 @@ struct at24_platform_data {
+
+ void (*setup)(struct memory_accessor *, void *context);
+ void *context;
++ struct eeprom_platform_data *eeprom_data; /* extra data for the eeprom_class */
+ };
+
+ #endif /* _LINUX_AT24_H */
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-at24-fix-odd-length-two-byte-access.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-at24-fix-odd-length-two-byte-access.patch
new file mode 100644
index 00000000..0bdd69b7
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-at24-fix-odd-length-two-byte-access.patch
@@ -0,0 +1,40 @@
+driver at24 fix odd length two byte access
+
+For I2C_SMBUS_WORD_DATA read accesses check if the access length is
+one or two bytes. For transactions that have an odd length eventualy
+we read 1 byte at the end to complete the request.
+
+The previous code always used a count of 2, which works fine if the
+requested total length is even. If the requested length was odd,
+however, the code would cause a kernel OOPS.
+
+The while (count) loop would go forever as count went from 1 to -1,
+never becoming zero. Also the return buffer would overrun.
+
+This patch allows for reading an odd number of bytes in
+I2C_SMBUS_WORD_DATA mode.
+
+diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c
+index ab1ad41..47bcd10 100644
+--- a/drivers/misc/eeprom/at24.c
++++ b/drivers/misc/eeprom/at24.c
+@@ -192,7 +192,8 @@ static ssize_t at24_eeprom_read(struct at24_data *at24, char *buf,
+ count = I2C_SMBUS_BLOCK_MAX;
+ break;
+ case I2C_SMBUS_WORD_DATA:
+- count = 2;
++ /* Check for odd length transaction */
++ count = (count == 1) ? 1 : 2;
+ break;
+ case I2C_SMBUS_BYTE_DATA:
+ count = 1;
+@@ -237,7 +238,8 @@ static ssize_t at24_eeprom_read(struct at24_data *at24, char *buf,
+ status = i2c_smbus_read_word_data(client, offset);
+ if (status >= 0) {
+ buf[0] = status & 0xff;
+- buf[1] = status >> 8;
++ if (count == 2)
++ buf[1] = status >> 8;
+ status = count;
+ }
+ break;
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-at24-smbus-addr16.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-at24-smbus-addr16.patch
new file mode 100644
index 00000000..53e7ddaf
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-at24-smbus-addr16.patch
@@ -0,0 +1,49 @@
+patch for celestica Redstone XP
+
+diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c
+index 2ec05ce..841631c 100644
+--- a/drivers/misc/eeprom/at24.c
++++ b/drivers/misc/eeprom/at24.c
+@@ -247,7 +247,14 @@ static ssize_t at24_eeprom_read(struct at24_data *at24, char *buf,
+ }
+ break;
+ case I2C_SMBUS_BYTE_DATA:
+- status = i2c_smbus_read_byte_data(client, offset);
++ if (at24->chip.flags & AT24_FLAG_ADDR16) {
++ status = i2c_smbus_write_byte_data(client, (offset >> 8) & 0xff, offset & 0xff);
++ if (status >= 0) {
++ status = i2c_smbus_read_byte(client);
++ }
++ } else {
++ status = i2c_smbus_read_byte_data(client, offset);
++ }
+ if (status >= 0) {
+ buf[0] = status;
+ status = count;
+@@ -405,8 +412,11 @@ static ssize_t at24_eeprom_write(struct at24_data *at24, const char *buf,
+ status = count;
+ break;
+ case I2C_SMBUS_BYTE_DATA:
+- status = i2c_smbus_write_byte_data(client, offset,
+- buf[0]);
++ if (at24->chip.flags & AT24_FLAG_ADDR16) {
++ status = i2c_smbus_write_word_data(client, (offset >> 8) & 0xff, buf[0] << 8 | (offset & 0xff));
++ } else {
++ status = i2c_smbus_write_byte_data(client, offset, buf[0]);
++ }
+ if (status == 0)
+ status = count;
+ break;
+@@ -571,10 +581,8 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)
+ /* Use I2C operations unless we're stuck with SMBus extensions. */
+ if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
+ if (chip.flags & AT24_FLAG_ADDR16) {
+- err = -EPFNOSUPPORT;
+- goto err_out;
+- }
+- if (i2c_check_functionality(client->adapter,
++ use_smbus = I2C_SMBUS_BYTE_DATA;
++ } else if (i2c_check_functionality(client->adapter,
+ I2C_FUNC_SMBUS_READ_I2C_BLOCK)) {
+ use_smbus = I2C_SMBUS_I2C_BLOCK_DATA;
+ } else if (i2c_check_functionality(client->adapter,
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-cy8c3245-hwmon.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-cy8c3245-hwmon.patch
new file mode 100644
index 00000000..b8e955f9
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-cy8c3245-hwmon.patch
@@ -0,0 +1,1126 @@
+Add a hwmon style driver for the CY8C3XX family
+
+diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
+index 0c248ec..7e7cdf6 100644
+--- a/drivers/hwmon/Kconfig
++++ b/drivers/hwmon/Kconfig
+@@ -293,6 +293,17 @@ config SENSORS_ATXP1
+ This driver can also be built as a module. If so, the module
+ will be called atxp1.
+
++config SENSORS_CY8CXX
++ tristate "Cypress Semiconductor CY8Cxx"
++ depends on I2C
++ help
++ If you say yes here you get support for Cypress Semiconductor
++ CY8C series sensor chips.
++
++ This driver can also be built as a module. If so, the module
++ will be called cy8cxx.
++
++
+ config SENSORS_DS620
+ tristate "Dallas Semiconductor DS620"
+ depends on I2C
+diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
+index 8251ce8..5e22567 100644
+--- a/drivers/hwmon/Makefile
++++ b/drivers/hwmon/Makefile
+@@ -42,6 +42,7 @@ obj-$(CONFIG_SENSORS_APPLESMC) += applesmc.o
+ obj-$(CONFIG_SENSORS_ASC7621) += asc7621.o
+ obj-$(CONFIG_SENSORS_ATXP1) += atxp1.o
+ obj-$(CONFIG_SENSORS_CORETEMP) += coretemp.o
++obj-$(CONFIG_SENSORS_CY8CXX) += cy8cxx.o
+ obj-$(CONFIG_SENSORS_DME1737) += dme1737.o
+ obj-$(CONFIG_SENSORS_DS620) += ds620.o
+ obj-$(CONFIG_SENSORS_DS1621) += ds1621.o
+diff --git a/drivers/hwmon/cy8cxx.c b/drivers/hwmon/cy8cxx.c
+new file mode 100644
+index 0000000..3edfbe7
+--- /dev/null
++++ b/drivers/hwmon/cy8cxx.c
+@@ -0,0 +1,1084 @@
++/*
++ * A hwmon driver for the Cypress Semiconductor C3245
++ * Copyright (C) 2013 Cumulus Networks
++ *
++ * Author: Shrijeet Mukherjee
++ *
++ * Based on the adt7470 driver
++ *
++ * 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.
++ *
++ * 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, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ */
++
++#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
++
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++
++/* Addresses to scan */
++static const unsigned short normal_i2c[] = { 0x2E, I2C_CLIENT_END };
++
++/* CY8C3XX registers */
++#define CY8C3XX_REG_BASE_ADDR 0x00
++#define CY8C3XX_REG_DEV_ID 0x04
++#define CY8C3XX_REG_COMPANY_ID 0x05
++#define CY8C3XX_REG_FW_REV_MAJ 0x06
++#define CY8C3XX_REG_FW_REV_MIN 0x07
++#define CY8C3XX_REG_RESET 0x08
++
++/*
++ * Fan PWM / RPM Profile control registers
++ *
++ * These registers consist of two-bytes each
++ */
++#define CY8C3XX_REG_FAN_PROFILE_BASE_ADDR 0x10
++#define CY8C3XX_REG_FAN_PROFILE(x) (CY8C3XX_REG_FAN_PROFILE_BASE_ADDR + ((x) * 2))
++enum {
++ CY8C3XX_FAN_PROFILE_LOW_DUTY = 0,
++ CY8C3XX_FAN_PROFILE_LOW_RPM,
++ CY8C3XX_FAN_PROFILE_HIGH_DUTY,
++ CY8C3XX_FAN_PROFILE_HIGH_RPM,
++ CY8C3XX_FAN_PROFILE_SPEED_0_DUTY,
++ CY8C3XX_FAN_PROFILE_SPEED_100_DUTY,
++ CY8C3XX_FAN_PROFILE_MAX
++};
++
++/* skipping over regs to set */
++
++#define CY8C3XX_REG_TEMP_BASE_ADDR 0x30
++
++#define CY8C3XX_REG_FAN_BASE_ADDR 0x80
++#define CY8C3XX_REG_FAN_TARGET_BASE_ADDR 0xA0
++
++#define CY8C3XX_REG_PWM_BASE_ADDR 0x60
++
++#define CY8C3XX_REG_PWM_MAX_BASE_ADDR 0x38
++
++#define CY8C3XX_REG_TEMP_LIMITS_BASE_ADDR 0x30
++#define CY8C3XX_REG_TEMP_LIMITS_MAX_ADDR 0x40
++
++#define CY8C3XX_REG_FAN_MAX_BASE_ADDR 0x16
++
++#define CY8C3XX_REG_PWM_CFG_BASE_ADDR 0x55
++
++#define CY8C3XX_TEMP_COUNT 5
++#define CY8C3XX_TEMP_REG(x) (CY8C3XX_REG_TEMP_BASE_ADDR + (x))
++#define CY8C3XX_TEMP_MAX_REG(x) (CY8C3XX_REG_TEMP_LIMITS_MAX_ADDR + (x))
++
++#define CY8C3XX_FAN_COUNT 8
++#define CY8C3XX_REG_FAN(x) (CY8C3XX_REG_FAN_BASE_ADDR + ((x) * 2))
++
++#define CY8C3XX_REG_FAN_MIN(x) (CY8C3XX_REG_FAN_MIN_BASE_ADDR + ((x) * 2))
++#define CY8C3XX_REG_FAN_MAX(x) (CY8C3XX_REG_FAN_MAX_BASE_ADDR)
++#define CY8C3XX_REG_FAN_TARGET(x) (CY8C3XX_REG_FAN_TARGET_BASE_ADDR + \
++ ((x) * 2))
++
++#define CY8C3XX_PWM_COUNT 8
++#define CY8C3XX_REG_PWM(x) (CY8C3XX_REG_PWM_BASE_ADDR + ((x) * 2))
++
++#define CY8C3XX_COMPANY_ID 0xCC
++#define CY8C3XX_DEV_ID 0x02
++#define CY8C3XX_FW_REV_MAJ 0x01
++
++/* "all temps" according to hwmon sysfs interface spec */
++#define CY8C3XX_PWM_ALL_TEMPS 0x3FF
++
++/* How often do we reread sensors values? (In jiffies) */
++#define SENSOR_REFRESH_INTERVAL (5 * HZ)
++
++/* How often do we reread sensor limit values? (In jiffies) */
++#define LIMIT_REFRESH_INTERVAL (60 * HZ)
++
++/* Wait at least 200ms per sensor for 10 sensors */
++#define TEMP_COLLECTION_TIME 2000
++
++/* auto update thing won't fire more than every 2s */
++#define AUTO_UPDATE_INTERVAL 2000
++
++/* datasheet says to divide this number by the fan reading to get fan rpm */
++#define FAN_PERIOD_INVALID 65535
++#define FAN_DATA_VALID(x) ((x) && (x) != FAN_PERIOD_INVALID)
++
++struct cy8c3xx_data {
++ struct device *hwmon_dev;
++ struct attribute_group attrs;
++ struct mutex lock;
++ char sensors_valid;
++ char limits_valid;
++ unsigned long sensors_last_updated; /* In jiffies */
++ unsigned long limits_last_updated; /* In jiffies */
++
++ int num_temp_sensors; /* -1 = probe */
++ int temperatures_probed;
++
++ s8 temp[CY8C3XX_TEMP_COUNT];
++ s8 temp_max[CY8C3XX_TEMP_COUNT];
++ u16 fan[CY8C3XX_FAN_COUNT];
++ u16 fan_max[CY8C3XX_FAN_COUNT];
++ u16 fan_min[CY8C3XX_FAN_COUNT];
++ u16 fan_tgt[CY8C3XX_FAN_COUNT];
++ u16 fan_profile[CY8C3XX_FAN_PROFILE_MAX];
++ u8 fan_alarm;
++ u8 temp_alarm;
++ u8 force_pwm_max;
++ u8 pwm[CY8C3XX_PWM_COUNT];
++ u8 pwm_automatic;
++ struct task_struct *auto_update;
++ struct completion auto_update_stop;
++ unsigned int auto_update_interval;
++};
++
++static int cy8c3xx_probe(struct i2c_client *client,
++ const struct i2c_device_id *id);
++static int cy8c3xx_detect(struct i2c_client *client,
++ struct i2c_board_info *info);
++static int cy8c3xx_remove(struct i2c_client *client);
++
++static const struct i2c_device_id cy8c3xx_id[] = {
++ { "CY8C3245", 0 },
++ { }
++};
++MODULE_DEVICE_TABLE(i2c, cy8c3xx_id);
++
++static struct i2c_driver cy8c3xx_driver = {
++ .class = I2C_CLASS_HWMON,
++ .driver = {
++ .name = "cy8c3xx",
++ },
++ .probe = cy8c3xx_probe,
++ .remove = cy8c3xx_remove,
++ .id_table = cy8c3xx_id,
++ .detect = cy8c3xx_detect,
++ .address_list = normal_i2c,
++};
++
++/*
++ * 16-bit registers on the CY8C3XX are high-byte first.
++ */
++static inline int cy8c3xx_read_word_data(struct i2c_client *client, u8 reg)
++{
++ s32 rc;
++ u16 val;
++
++ /* read high byte */
++ rc = i2c_smbus_read_byte_data(client, reg);
++ if (rc < 0) {
++ dev_warn(&client->dev, "i2c read failed: 0x%02x, errno %d\n",
++ reg, -rc);
++ return rc;
++ }
++ val = ((u16)rc & 0xFF) << 8;
++
++ /* read low byte */
++ rc = i2c_smbus_read_byte_data(client, reg + 1);
++ if (rc < 0) {
++ dev_warn(&client->dev, "i2c read failed: 0x%02x, errno %d\n",
++ reg + 1, -rc);
++ return rc;
++ }
++ val |= (u16)rc & 0xFF;
++
++ return val;
++}
++
++static inline int cy8c3xx_write_word_data(struct i2c_client *client,
++ u8 reg,
++ u16 value)
++{
++ s32 rc;
++
++ /* write high byte */
++ rc = i2c_smbus_write_byte_data(client, reg, value >> 8);
++ if (rc < 0) {
++ dev_warn(&client->dev,
++ "i2c write failed: 0x%02x: 0x%02x, errno %d\n",
++ reg, value >> 8, -rc);
++ return rc;
++ }
++
++ /* write low byte */
++ rc = i2c_smbus_write_byte_data(client, reg + 1, value & 0xFF);
++ if (rc < 0) {
++ dev_warn(&client->dev,
++ "i2c write failed: 0x%02x: 0x%02x, errno %d\n",
++ reg + 1, value & 0xFF, -rc);
++ return rc;
++ }
++
++ return rc;
++}
++
++/* Probe for temperature sensors. Assumes lock is held */
++static int cy8c3xx_read_temperatures(struct i2c_client *client,
++ struct cy8c3xx_data *data)
++{
++ int i;
++
++ /* Only count fans if we have to */
++ if (data->num_temp_sensors >= 0)
++ return 0;
++
++ for (i = 0; i < CY8C3XX_TEMP_COUNT; i++) {
++ data->temp[i] = i2c_smbus_read_byte_data(client,
++ CY8C3XX_TEMP_REG(i));
++ if (data->temp[i])
++ data->num_temp_sensors = i + 1;
++ }
++ data->temperatures_probed = 1;
++ return 0;
++}
++
++static int cy8c3xx_update_thread(void *p)
++{
++ struct i2c_client *client = p;
++ struct cy8c3xx_data *data = i2c_get_clientdata(client);
++
++ while (!kthread_should_stop()) {
++ mutex_lock(&data->lock);
++ cy8c3xx_read_temperatures(client, data);
++ mutex_unlock(&data->lock);
++ if (kthread_should_stop())
++ break;
++ msleep_interruptible(data->auto_update_interval);
++ }
++
++ complete_all(&data->auto_update_stop);
++ return 0;
++}
++
++static struct cy8c3xx_data *cy8c3xx_update_device(struct device *dev)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct cy8c3xx_data *data = i2c_get_clientdata(client);
++ unsigned long local_jiffies = jiffies;
++ int i;
++ int need_sensors = 1;
++ int need_limits = 1;
++
++ /*
++ * Figure out if we need to update the shadow registers.
++ * Lockless means that we may occasionally report out of
++ * date data.
++ */
++ if (time_before(local_jiffies, data->sensors_last_updated +
++ SENSOR_REFRESH_INTERVAL) &&
++ data->sensors_valid)
++ need_sensors = 0;
++
++ if (time_before(local_jiffies, data->limits_last_updated +
++ LIMIT_REFRESH_INTERVAL) &&
++ data->limits_valid)
++ need_limits = 0;
++
++ if (!need_sensors && !need_limits)
++ return data;
++
++ mutex_lock(&data->lock);
++ if (!need_sensors)
++ goto no_sensor_update;
++
++ if (!data->temperatures_probed)
++ cy8c3xx_read_temperatures(client, data);
++ else
++ for (i = 0; i < CY8C3XX_TEMP_COUNT; i++)
++ data->temp[i] = i2c_smbus_read_byte_data(client,
++ CY8C3XX_TEMP_REG(i));
++
++ for (i = 0; i < CY8C3XX_FAN_COUNT; i++) {
++ data->fan[i] = cy8c3xx_read_word_data(client,
++ CY8C3XX_REG_FAN(i));
++ }
++
++ for (i = 0; i < CY8C3XX_PWM_COUNT; i++) {
++ data->pwm[i] = i2c_smbus_read_byte_data(client,
++ CY8C3XX_REG_PWM(i));
++ }
++
++ data->sensors_last_updated = local_jiffies;
++ data->sensors_valid = 1;
++
++no_sensor_update:
++ if (!need_limits)
++ goto out;
++
++ for (i = 0; i < CY8C3XX_TEMP_COUNT; i++) {
++ data->temp_max[i] = i2c_smbus_read_byte_data(client,
++ CY8C3XX_TEMP_MAX_REG(i));
++ }
++
++ for (i = 0; i < CY8C3XX_FAN_COUNT; i++) {
++ data->fan_max[i] = cy8c3xx_read_word_data(client,
++ CY8C3XX_REG_FAN_MAX(i));
++ data->fan_tgt[i] = cy8c3xx_read_word_data(client,
++ CY8C3XX_REG_FAN_TARGET(i));
++ }
++
++ for (i = 0; i < CY8C3XX_FAN_PROFILE_MAX; i++) {
++ data->fan_profile[i] = cy8c3xx_read_word_data(client,
++ CY8C3XX_REG_FAN_PROFILE(i));
++ }
++
++ data->limits_last_updated = local_jiffies;
++ data->limits_valid = 1;
++
++out:
++ mutex_unlock(&data->lock);
++ return data;
++}
++
++static ssize_t show_auto_update_interval(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct cy8c3xx_data *data = cy8c3xx_update_device(dev);
++ return sprintf(buf, "%d\n", data->auto_update_interval);
++}
++
++static ssize_t set_auto_update_interval(struct device *dev,
++ struct device_attribute *devattr,
++ const char *buf,
++ size_t count)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct cy8c3xx_data *data = i2c_get_clientdata(client);
++ long temp;
++
++ if (strict_strtol(buf, 10, &temp))
++ return -EINVAL;
++
++ temp = SENSORS_LIMIT(temp, 0, 60000);
++
++ mutex_lock(&data->lock);
++ data->auto_update_interval = temp;
++ mutex_unlock(&data->lock);
++
++ return count;
++}
++
++static ssize_t show_num_temp_sensors(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct cy8c3xx_data *data = cy8c3xx_update_device(dev);
++ return sprintf(buf, "%d\n", data->num_temp_sensors);
++}
++
++static ssize_t set_num_temp_sensors(struct device *dev,
++ struct device_attribute *devattr,
++ const char *buf,
++ size_t count)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct cy8c3xx_data *data = i2c_get_clientdata(client);
++ long temp;
++
++ if (strict_strtol(buf, 10, &temp))
++ return -EINVAL;
++
++ temp = SENSORS_LIMIT(temp, -1, 10);
++
++ mutex_lock(&data->lock);
++ data->num_temp_sensors = temp;
++ if (temp < 0)
++ data->temperatures_probed = 0;
++ mutex_unlock(&data->lock);
++
++ return count;
++}
++
++static ssize_t show_temp_max(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct cy8c3xx_data *data = cy8c3xx_update_device(dev);
++ return sprintf(buf, "%d\n", 1000 * data->temp_max[attr->index]);
++}
++
++static ssize_t set_temp_max(struct device *dev,
++ struct device_attribute *devattr,
++ const char *buf,
++ size_t count)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct i2c_client *client = to_i2c_client(dev);
++ struct cy8c3xx_data *data = i2c_get_clientdata(client);
++ long temp;
++
++ if (strict_strtol(buf, 10, &temp))
++ return -EINVAL;
++
++ temp = DIV_ROUND_CLOSEST(temp, 1000);
++ temp = SENSORS_LIMIT(temp, -128, 127);
++
++ mutex_lock(&data->lock);
++ data->temp_max[attr->index] = temp;
++ i2c_smbus_write_byte_data(client, CY8C3XX_TEMP_MAX_REG(attr->index),
++ temp);
++ mutex_unlock(&data->lock);
++
++ return count;
++}
++
++static ssize_t show_temp(struct device *dev, struct device_attribute *devattr,
++ char *buf)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct cy8c3xx_data *data = cy8c3xx_update_device(dev);
++ return sprintf(buf, "%d\n", 1000 * data->temp[attr->index]);
++}
++
++static ssize_t show_fan_max(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct cy8c3xx_data *data = cy8c3xx_update_device(dev);
++
++ if (FAN_DATA_VALID(data->fan_max[attr->index]))
++ return sprintf(buf, "%d\n",
++ data->fan_max[attr->index]);
++ else
++ return sprintf(buf, "0\n");
++}
++
++static ssize_t set_fan_max(struct device *dev,
++ struct device_attribute *devattr,
++ const char *buf, size_t count)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct i2c_client *client = to_i2c_client(dev);
++ struct cy8c3xx_data *data = i2c_get_clientdata(client);
++ long rpm;
++
++ if (strict_strtol(buf, 10, &rpm) || !rpm)
++ return -EINVAL;
++
++ rpm = SENSORS_LIMIT(rpm, 1, 65534);
++
++ mutex_lock(&data->lock);
++ data->fan_max[attr->index] = rpm;
++ cy8c3xx_write_word_data(client, CY8C3XX_REG_FAN_MAX(attr->index), rpm);
++ mutex_unlock(&data->lock);
++
++ return count;
++}
++
++/*
++ * fan_min is a pure software concept, not implemented by hardware.
++ * It is used to compute the alarm status.
++ */
++static ssize_t show_fan_min(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct cy8c3xx_data *data = cy8c3xx_update_device(dev);
++
++ return sprintf(buf, "%d\n", data->fan_min[attr->index]);
++}
++
++static ssize_t set_fan_min(struct device *dev,
++ struct device_attribute *devattr,
++ const char *buf, size_t count)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct i2c_client *client = to_i2c_client(dev);
++ struct cy8c3xx_data *data = i2c_get_clientdata(client);
++ long rpm;
++
++ if (strict_strtol(buf, 10, &rpm) || !rpm)
++ return -EINVAL;
++
++ rpm = SENSORS_LIMIT(rpm, 1, 65534);
++
++ mutex_lock(&data->lock);
++ data->fan_min[attr->index] = rpm;
++ mutex_unlock(&data->lock);
++
++ return count;
++}
++
++static ssize_t show_fan_target(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct cy8c3xx_data *data = cy8c3xx_update_device(dev);
++
++ if (FAN_DATA_VALID(data->fan_tgt[attr->index]))
++ return sprintf(buf, "%d\n",
++ data->fan_tgt[attr->index]);
++ else
++ return sprintf(buf, "0\n");
++}
++
++static ssize_t set_fan_target(struct device *dev,
++ struct device_attribute *devattr,
++ const char *buf, size_t count)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct i2c_client *client = to_i2c_client(dev);
++ struct cy8c3xx_data *data = i2c_get_clientdata(client);
++ long rpm;
++
++ if (strict_strtol(buf, 10, &rpm) || !rpm)
++ return -EINVAL;
++
++ rpm = SENSORS_LIMIT(rpm, 1, 65534);
++
++ mutex_lock(&data->lock);
++ data->fan_tgt[attr->index] = rpm;
++ cy8c3xx_write_word_data(client, CY8C3XX_REG_FAN_TARGET(attr->index), rpm);
++ mutex_unlock(&data->lock);
++
++ return count;
++}
++
++/*
++ * Show Fan Profile Settings
++ */
++static ssize_t show_fan_profile(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct cy8c3xx_data *data = cy8c3xx_update_device(dev);
++
++ return sprintf(buf, "%u\n",
++ data->fan_profile[attr->index]);
++}
++
++/*
++ * Set Fan Profile Settings
++ */
++static ssize_t set_fan_profile(struct device *dev,
++ struct device_attribute *devattr,
++ const char *buf, size_t count)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct i2c_client *client = to_i2c_client(dev);
++ struct cy8c3xx_data *data = i2c_get_clientdata(client);
++ long parm;
++
++ if (strict_strtoul(buf, 10, &parm))
++ return -EINVAL;
++
++ parm = SENSORS_LIMIT(parm, 1, 65534);
++
++ mutex_lock(&data->lock);
++ data->fan_profile[attr->index] = parm;
++ cy8c3xx_write_word_data(client, CY8C3XX_REG_FAN_PROFILE(attr->index), parm);
++ mutex_unlock(&data->lock);
++
++ return count;
++}
++
++static ssize_t show_fan(struct device *dev, struct device_attribute *devattr,
++ char *buf)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct cy8c3xx_data *data = cy8c3xx_update_device(dev);
++
++ if (FAN_DATA_VALID(data->fan[attr->index]))
++ return sprintf(buf, "%d\n", data->fan[attr->index]);
++ else
++ return sprintf(buf, "0\n");
++}
++
++static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr,
++ char *buf)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct cy8c3xx_data *data = cy8c3xx_update_device(dev);
++ return sprintf(buf, "%d\n", data->pwm[attr->index]);
++}
++
++static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr,
++ const char *buf, size_t count)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct i2c_client *client = to_i2c_client(dev);
++ struct cy8c3xx_data *data = i2c_get_clientdata(client);
++ long temp;
++
++ if (strict_strtol(buf, 10, &temp))
++ return -EINVAL;
++
++ temp = SENSORS_LIMIT(temp, 0, 255);
++
++ mutex_lock(&data->lock);
++ data->pwm[attr->index] = temp;
++ i2c_smbus_write_byte_data(client, CY8C3XX_REG_PWM(attr->index), temp);
++ mutex_unlock(&data->lock);
++
++ return count;
++}
++
++static ssize_t show_fan_alarm_mask(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct cy8c3xx_data *data = cy8c3xx_update_device(dev);
++ int i;
++ u32 alarm_mask = 0;
++
++ for (i = 0; i < CY8C3XX_FAN_COUNT; i++)
++ if ((data->fan[i] < data->fan_min[i]) ||
++ (data->fan[i] >= data->fan_max[i]))
++ alarm_mask |= 0x1 << i;
++
++ return sprintf(buf, "%x\n", alarm_mask);
++}
++
++static ssize_t show_temp_alarm_mask(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct cy8c3xx_data *data = cy8c3xx_update_device(dev);
++ int i;
++ u32 alarm_mask = 0;
++
++ for (i = 0; i < CY8C3XX_TEMP_COUNT; i++)
++ if (data->temp[i] >= data->temp_max[i])
++ alarm_mask |= 0x1 << i;
++
++ return sprintf(buf, "%x\n", alarm_mask);
++}
++
++static ssize_t show_fan_alarm(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct cy8c3xx_data *data = cy8c3xx_update_device(dev);
++
++ if ((data->fan[attr->index] < data->fan_min[attr->index]) ||
++ (data->fan[attr->index] >= data->fan_max[attr->index]))
++ return sprintf(buf, "1\n");
++ else
++ return sprintf(buf, "0\n");
++}
++
++static ssize_t show_temp_alarm(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct cy8c3xx_data *data = cy8c3xx_update_device(dev);
++
++ if (data->temp[attr->index] >= data->temp_max[attr->index])
++ return sprintf(buf, "1\n");
++ else
++ return sprintf(buf, "0\n");
++}
++
++static ssize_t set_pwm_auto(struct device *dev,
++ struct device_attribute *devattr,
++ const char *buf,
++ size_t count)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct cy8c3xx_data *data = i2c_get_clientdata(client);
++ long temp;
++
++ if (strict_strtol(buf, 10, &temp))
++ return -EINVAL;
++
++ if (!(temp > 0 && temp < 3))
++ return -EINVAL;
++
++ mutex_lock(&data->lock);
++ data->pwm_automatic = temp;
++ i2c_smbus_write_byte_data(client, CY8C3XX_REG_PWM_CFG_BASE_ADDR, temp);
++ mutex_unlock(&data->lock);
++
++ return count;
++}
++
++static ssize_t show_pwm_auto(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct cy8c3xx_data *data = cy8c3xx_update_device(dev);
++
++ return sprintf(buf, "%d\n", data->pwm_automatic);
++}
++
++#define CY8C3XX_REG_MIN 0x00
++#define CY8C3XX_REG_MAX 0xe0
++
++static ssize_t show_debug(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++
++ int len = 0, i, j;
++ u8 val;
++ for (i = 0; i < (CY8C3XX_REG_MAX - CY8C3XX_REG_MIN) / 16; i++) {
++ len += sprintf(buf+len, "0x%02x: ", CY8C3XX_REG_MIN + (i * 16));
++ for (j = 0; j < 16; j++) {
++ val = i2c_smbus_read_byte_data(client, CY8C3XX_REG_MIN + (i * 16) + j);
++ len += sprintf(buf+len, "%02x ", val);
++ }
++ len += sprintf(buf+len, "\n");
++ }
++ return len;
++}
++
++static DEVICE_ATTR(fan_alarm_mask, S_IRUGO, show_fan_alarm_mask, NULL);
++static DEVICE_ATTR(temp_alarm_mask, S_IRUGO, show_temp_alarm_mask, NULL);
++static DEVICE_ATTR(num_temp_sensors, S_IWUSR | S_IRUGO, show_num_temp_sensors,
++ set_num_temp_sensors);
++static DEVICE_ATTR(auto_update_interval, S_IWUSR | S_IRUGO,
++ show_auto_update_interval, set_auto_update_interval);
++
++static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp_max,
++ set_temp_max, 0);
++static SENSOR_DEVICE_ATTR(temp2_max, S_IWUSR | S_IRUGO, show_temp_max,
++ set_temp_max, 1);
++static SENSOR_DEVICE_ATTR(temp3_max, S_IWUSR | S_IRUGO, show_temp_max,
++ set_temp_max, 2);
++static SENSOR_DEVICE_ATTR(temp4_max, S_IWUSR | S_IRUGO, show_temp_max,
++ set_temp_max, 3);
++static SENSOR_DEVICE_ATTR(temp5_max, S_IWUSR | S_IRUGO, show_temp_max,
++ set_temp_max, 4);
++
++static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0);
++static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1);
++static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2);
++static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, show_temp, NULL, 3);
++static SENSOR_DEVICE_ATTR(temp5_input, S_IRUGO, show_temp, NULL, 4);
++
++static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_temp_alarm, NULL, 0);
++static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_temp_alarm, NULL, 1);
++static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_temp_alarm, NULL, 2);
++static SENSOR_DEVICE_ATTR(temp4_alarm, S_IRUGO, show_temp_alarm, NULL, 3);
++static SENSOR_DEVICE_ATTR(temp5_alarm, S_IRUGO, show_temp_alarm, NULL, 4);
++
++static SENSOR_DEVICE_ATTR(fan1_max, S_IWUSR | S_IRUGO, show_fan_max,
++ set_fan_max, 0);
++static SENSOR_DEVICE_ATTR(fan2_max, S_IWUSR | S_IRUGO, show_fan_max,
++ set_fan_max, 1);
++static SENSOR_DEVICE_ATTR(fan3_max, S_IWUSR | S_IRUGO, show_fan_max,
++ set_fan_max, 2);
++static SENSOR_DEVICE_ATTR(fan4_max, S_IWUSR | S_IRUGO, show_fan_max,
++ set_fan_max, 3);
++static SENSOR_DEVICE_ATTR(fan5_max, S_IWUSR | S_IRUGO, show_fan_max,
++ set_fan_max, 4);
++static SENSOR_DEVICE_ATTR(fan6_max, S_IWUSR | S_IRUGO, show_fan_max,
++ set_fan_max, 5);
++static SENSOR_DEVICE_ATTR(fan7_max, S_IWUSR | S_IRUGO, show_fan_max,
++ set_fan_max, 6);
++static SENSOR_DEVICE_ATTR(fan8_max, S_IWUSR | S_IRUGO, show_fan_max,
++ set_fan_max, 7);
++
++static SENSOR_DEVICE_ATTR(fan1_min, S_IWUSR | S_IRUGO, show_fan_min,
++ set_fan_min, 0);
++static SENSOR_DEVICE_ATTR(fan2_min, S_IWUSR | S_IRUGO, show_fan_min,
++ set_fan_min, 1);
++static SENSOR_DEVICE_ATTR(fan3_min, S_IWUSR | S_IRUGO, show_fan_min,
++ set_fan_min, 2);
++static SENSOR_DEVICE_ATTR(fan4_min, S_IWUSR | S_IRUGO, show_fan_min,
++ set_fan_min, 3);
++static SENSOR_DEVICE_ATTR(fan5_min, S_IWUSR | S_IRUGO, show_fan_min,
++ set_fan_min, 4);
++static SENSOR_DEVICE_ATTR(fan6_min, S_IWUSR | S_IRUGO, show_fan_min,
++ set_fan_min, 5);
++static SENSOR_DEVICE_ATTR(fan7_min, S_IWUSR | S_IRUGO, show_fan_min,
++ set_fan_min, 6);
++static SENSOR_DEVICE_ATTR(fan8_min, S_IWUSR | S_IRUGO, show_fan_min,
++ set_fan_min, 7);
++
++static SENSOR_DEVICE_ATTR(fan1_target, S_IWUSR | S_IRUGO, show_fan_target,
++ set_fan_target, 0);
++static SENSOR_DEVICE_ATTR(fan2_target, S_IWUSR | S_IRUGO, show_fan_target,
++ set_fan_target, 1);
++static SENSOR_DEVICE_ATTR(fan3_target, S_IWUSR | S_IRUGO, show_fan_target,
++ set_fan_target, 2);
++static SENSOR_DEVICE_ATTR(fan4_target, S_IWUSR | S_IRUGO, show_fan_target,
++ set_fan_target, 3);
++static SENSOR_DEVICE_ATTR(fan5_target, S_IWUSR | S_IRUGO, show_fan_target,
++ set_fan_target, 4);
++static SENSOR_DEVICE_ATTR(fan6_target, S_IWUSR | S_IRUGO, show_fan_target,
++ set_fan_target, 5);
++static SENSOR_DEVICE_ATTR(fan7_target, S_IWUSR | S_IRUGO, show_fan_target,
++ set_fan_target, 6);
++static SENSOR_DEVICE_ATTR(fan8_target, S_IWUSR | S_IRUGO, show_fan_target,
++ set_fan_target, 7);
++
++#define FAN_PROFILE_ATTR(_name, _index) \
++ SENSOR_DEVICE_ATTR(_name, S_IWUSR | S_IRUGO, \
++ show_fan_profile, set_fan_profile, _index)
++
++static FAN_PROFILE_ATTR(fan_low_duty, CY8C3XX_FAN_PROFILE_LOW_DUTY);
++static FAN_PROFILE_ATTR(fan_low_rpm, CY8C3XX_FAN_PROFILE_LOW_RPM);
++static FAN_PROFILE_ATTR(fan_high_duty, CY8C3XX_FAN_PROFILE_HIGH_DUTY);
++static FAN_PROFILE_ATTR(fan_high_rpm, CY8C3XX_FAN_PROFILE_HIGH_RPM);
++static FAN_PROFILE_ATTR(fan_speed_0_duty, CY8C3XX_FAN_PROFILE_SPEED_0_DUTY);
++static FAN_PROFILE_ATTR(fan_speed_100_duty,CY8C3XX_FAN_PROFILE_SPEED_100_DUTY);
++
++static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0);
++static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1);
++static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2);
++static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, show_fan, NULL, 3);
++static SENSOR_DEVICE_ATTR(fan5_input, S_IRUGO, show_fan, NULL, 4);
++static SENSOR_DEVICE_ATTR(fan6_input, S_IRUGO, show_fan, NULL, 5);
++static SENSOR_DEVICE_ATTR(fan7_input, S_IRUGO, show_fan, NULL, 6);
++static SENSOR_DEVICE_ATTR(fan8_input, S_IRUGO, show_fan, NULL, 7);
++
++static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_fan_alarm, NULL, 0);
++static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_fan_alarm, NULL, 1);
++static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_fan_alarm, NULL, 2);
++static SENSOR_DEVICE_ATTR(fan4_alarm, S_IRUGO, show_fan_alarm, NULL, 3);
++static SENSOR_DEVICE_ATTR(fan5_alarm, S_IRUGO, show_fan_alarm, NULL, 4);
++static SENSOR_DEVICE_ATTR(fan6_alarm, S_IRUGO, show_fan_alarm, NULL, 5);
++static SENSOR_DEVICE_ATTR(fan7_alarm, S_IRUGO, show_fan_alarm, NULL, 6);
++static SENSOR_DEVICE_ATTR(fan8_alarm, S_IRUGO, show_fan_alarm, NULL, 7);
++
++static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 0);
++static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 1);
++static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 2);
++static SENSOR_DEVICE_ATTR(pwm4, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 3);
++static SENSOR_DEVICE_ATTR(pwm5, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 4);
++static SENSOR_DEVICE_ATTR(pwm6, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 5);
++static SENSOR_DEVICE_ATTR(pwm7, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 6);
++static SENSOR_DEVICE_ATTR(pwm8, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 7);
++
++static SENSOR_DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO, show_pwm_auto,
++ set_pwm_auto, 0);
++static SENSOR_DEVICE_ATTR(pwm2_enable, S_IWUSR | S_IRUGO, show_pwm_auto,
++ set_pwm_auto, 0);
++static SENSOR_DEVICE_ATTR(pwm3_enable, S_IWUSR | S_IRUGO, show_pwm_auto,
++ set_pwm_auto, 0);
++static SENSOR_DEVICE_ATTR(pwm4_enable, S_IWUSR | S_IRUGO, show_pwm_auto,
++ set_pwm_auto, 0);
++static SENSOR_DEVICE_ATTR(pwm5_enable, S_IWUSR | S_IRUGO, show_pwm_auto,
++ set_pwm_auto, 0);
++static SENSOR_DEVICE_ATTR(pwm6_enable, S_IWUSR | S_IRUGO, show_pwm_auto,
++ set_pwm_auto, 0);
++static SENSOR_DEVICE_ATTR(pwm7_enable, S_IWUSR | S_IRUGO, show_pwm_auto,
++ set_pwm_auto, 0);
++static SENSOR_DEVICE_ATTR(pwm8_enable, S_IWUSR | S_IRUGO, show_pwm_auto,
++ set_pwm_auto, 0);
++
++static SENSOR_DEVICE_ATTR(debug, S_IRUGO, show_debug, NULL, 0);
++
++static struct attribute *cy8c3xx_attr[] =
++{
++ &dev_attr_fan_alarm_mask.attr,
++ &dev_attr_temp_alarm_mask.attr,
++ &dev_attr_num_temp_sensors.attr,
++ &dev_attr_auto_update_interval.attr,
++ &sensor_dev_attr_temp1_max.dev_attr.attr,
++ &sensor_dev_attr_temp2_max.dev_attr.attr,
++ &sensor_dev_attr_temp3_max.dev_attr.attr,
++ &sensor_dev_attr_temp4_max.dev_attr.attr,
++ &sensor_dev_attr_temp5_max.dev_attr.attr,
++ &sensor_dev_attr_temp1_input.dev_attr.attr,
++ &sensor_dev_attr_temp2_input.dev_attr.attr,
++ &sensor_dev_attr_temp3_input.dev_attr.attr,
++ &sensor_dev_attr_temp4_input.dev_attr.attr,
++ &sensor_dev_attr_temp5_input.dev_attr.attr,
++ &sensor_dev_attr_temp1_alarm.dev_attr.attr,
++ &sensor_dev_attr_temp2_alarm.dev_attr.attr,
++ &sensor_dev_attr_temp3_alarm.dev_attr.attr,
++ &sensor_dev_attr_temp4_alarm.dev_attr.attr,
++ &sensor_dev_attr_temp5_alarm.dev_attr.attr,
++ &sensor_dev_attr_fan1_max.dev_attr.attr,
++ &sensor_dev_attr_fan2_max.dev_attr.attr,
++ &sensor_dev_attr_fan3_max.dev_attr.attr,
++ &sensor_dev_attr_fan4_max.dev_attr.attr,
++ &sensor_dev_attr_fan5_max.dev_attr.attr,
++ &sensor_dev_attr_fan6_max.dev_attr.attr,
++ &sensor_dev_attr_fan7_max.dev_attr.attr,
++ &sensor_dev_attr_fan8_max.dev_attr.attr,
++ &sensor_dev_attr_fan1_min.dev_attr.attr,
++ &sensor_dev_attr_fan2_min.dev_attr.attr,
++ &sensor_dev_attr_fan3_min.dev_attr.attr,
++ &sensor_dev_attr_fan4_min.dev_attr.attr,
++ &sensor_dev_attr_fan5_min.dev_attr.attr,
++ &sensor_dev_attr_fan6_min.dev_attr.attr,
++ &sensor_dev_attr_fan7_min.dev_attr.attr,
++ &sensor_dev_attr_fan8_min.dev_attr.attr,
++ &sensor_dev_attr_fan1_target.dev_attr.attr,
++ &sensor_dev_attr_fan2_target.dev_attr.attr,
++ &sensor_dev_attr_fan3_target.dev_attr.attr,
++ &sensor_dev_attr_fan4_target.dev_attr.attr,
++ &sensor_dev_attr_fan5_target.dev_attr.attr,
++ &sensor_dev_attr_fan6_target.dev_attr.attr,
++ &sensor_dev_attr_fan7_target.dev_attr.attr,
++ &sensor_dev_attr_fan8_target.dev_attr.attr,
++ &sensor_dev_attr_fan1_input.dev_attr.attr,
++ &sensor_dev_attr_fan2_input.dev_attr.attr,
++ &sensor_dev_attr_fan3_input.dev_attr.attr,
++ &sensor_dev_attr_fan4_input.dev_attr.attr,
++ &sensor_dev_attr_fan5_input.dev_attr.attr,
++ &sensor_dev_attr_fan6_input.dev_attr.attr,
++ &sensor_dev_attr_fan7_input.dev_attr.attr,
++ &sensor_dev_attr_fan8_input.dev_attr.attr,
++ &sensor_dev_attr_fan1_alarm.dev_attr.attr,
++ &sensor_dev_attr_fan2_alarm.dev_attr.attr,
++ &sensor_dev_attr_fan3_alarm.dev_attr.attr,
++ &sensor_dev_attr_fan4_alarm.dev_attr.attr,
++ &sensor_dev_attr_fan5_alarm.dev_attr.attr,
++ &sensor_dev_attr_fan6_alarm.dev_attr.attr,
++ &sensor_dev_attr_fan7_alarm.dev_attr.attr,
++ &sensor_dev_attr_fan8_alarm.dev_attr.attr,
++ &sensor_dev_attr_pwm1.dev_attr.attr,
++ &sensor_dev_attr_pwm2.dev_attr.attr,
++ &sensor_dev_attr_pwm3.dev_attr.attr,
++ &sensor_dev_attr_pwm4.dev_attr.attr,
++ &sensor_dev_attr_pwm5.dev_attr.attr,
++ &sensor_dev_attr_pwm6.dev_attr.attr,
++ &sensor_dev_attr_pwm7.dev_attr.attr,
++ &sensor_dev_attr_pwm8.dev_attr.attr,
++ &sensor_dev_attr_pwm1_enable.dev_attr.attr,
++ &sensor_dev_attr_pwm2_enable.dev_attr.attr,
++ &sensor_dev_attr_pwm3_enable.dev_attr.attr,
++ &sensor_dev_attr_pwm4_enable.dev_attr.attr,
++ &sensor_dev_attr_pwm5_enable.dev_attr.attr,
++ &sensor_dev_attr_pwm6_enable.dev_attr.attr,
++ &sensor_dev_attr_pwm7_enable.dev_attr.attr,
++ &sensor_dev_attr_pwm8_enable.dev_attr.attr,
++ &sensor_dev_attr_fan_low_duty.dev_attr.attr,
++ &sensor_dev_attr_fan_low_rpm.dev_attr.attr,
++ &sensor_dev_attr_fan_high_duty.dev_attr.attr,
++ &sensor_dev_attr_fan_high_rpm.dev_attr.attr,
++ &sensor_dev_attr_fan_speed_0_duty.dev_attr.attr,
++ &sensor_dev_attr_fan_speed_100_duty.dev_attr.attr,
++ &sensor_dev_attr_debug.dev_attr.attr,
++ NULL
++};
++
++/* Return 0 if detection is successful, -ENODEV otherwise */
++static int cy8c3xx_detect(struct i2c_client *client,
++ struct i2c_board_info *info)
++{
++ struct i2c_adapter *adapter = client->adapter;
++ int vendor, device, revision;
++
++ if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
++ return -ENODEV;
++
++ vendor = i2c_smbus_read_byte_data(client, CY8C3XX_REG_COMPANY_ID);
++ printk(KERN_INFO "vendor = %u\n", vendor);
++ if (vendor != CY8C3XX_COMPANY_ID)
++ return -ENODEV;
++
++ device = i2c_smbus_read_byte_data(client, CY8C3XX_REG_DEV_ID);
++ printk(KERN_INFO "device = %u\n", device);
++ if (device != CY8C3XX_DEV_ID)
++ return -ENODEV;
++
++ revision = i2c_smbus_read_byte_data(client, CY8C3XX_REG_FW_REV_MAJ);
++ printk(KERN_INFO "rev = %u\n", revision);
++ if (revision != CY8C3XX_FW_REV_MAJ)
++ return -ENODEV;
++
++ strlcpy(info->type, "cy8c3xx", I2C_NAME_SIZE);
++
++ printk(KERN_INFO "cy8c3xx detected\n");
++ return 0;
++}
++
++static int cy8c3xx_probe(struct i2c_client *client,
++ const struct i2c_device_id *id)
++{
++ struct cy8c3xx_data *data;
++ int err;
++
++ data = kzalloc(sizeof(struct cy8c3xx_data), GFP_KERNEL);
++ if (!data) {
++ err = -ENOMEM;
++ goto exit;
++ }
++
++ data->num_temp_sensors = -1;
++ data->auto_update_interval = AUTO_UPDATE_INTERVAL;
++
++ i2c_set_clientdata(client, data);
++ mutex_init(&data->lock);
++
++ dev_info(&client->dev, "%s chip found\n", client->name);
++
++ /* Register sysfs hooks */
++ data->attrs.attrs = cy8c3xx_attr;
++ if ((err = sysfs_create_group(&client->dev.kobj, &data->attrs)))
++ goto exit_free;
++
++ data->hwmon_dev = hwmon_device_register(&client->dev);
++ if (IS_ERR(data->hwmon_dev)) {
++ err = PTR_ERR(data->hwmon_dev);
++ goto exit_remove;
++ }
++
++ init_completion(&data->auto_update_stop);
++ data->auto_update = kthread_run(cy8c3xx_update_thread, client,
++ dev_name(data->hwmon_dev));
++ if (IS_ERR(data->auto_update)) {
++ err = PTR_ERR(data->auto_update);
++ goto exit_unregister;
++ }
++
++ return 0;
++
++exit_unregister:
++ hwmon_device_unregister(data->hwmon_dev);
++exit_remove:
++ sysfs_remove_group(&client->dev.kobj, &data->attrs);
++exit_free:
++ kfree(data);
++exit:
++ return err;
++}
++
++static int cy8c3xx_remove(struct i2c_client *client)
++{
++ struct cy8c3xx_data *data = i2c_get_clientdata(client);
++
++ kthread_stop(data->auto_update);
++ wait_for_completion(&data->auto_update_stop);
++ hwmon_device_unregister(data->hwmon_dev);
++ sysfs_remove_group(&client->dev.kobj, &data->attrs);
++ kfree(data);
++ return 0;
++}
++
++static int __init cy8c3xx_init(void)
++{
++ return i2c_add_driver(&cy8c3xx_driver);
++}
++
++static void __exit cy8c3xx_exit(void)
++{
++ i2c_del_driver(&cy8c3xx_driver);
++}
++
++MODULE_AUTHOR("Shrijeet Mukherjee ");
++MODULE_DESCRIPTION("CY8C3XX driver");
++MODULE_LICENSE("GPL");
++
++module_init(cy8c3xx_init);
++module_exit(cy8c3xx_exit);
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-cy8c3245r1-hwmon.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-cy8c3245r1-hwmon.patch
new file mode 100644
index 00000000..7009f35c
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-cy8c3245r1-hwmon.patch
@@ -0,0 +1,1127 @@
+Driver for updated PSoc CY8C3245 on Quanta LY6
+
+diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
+index 7e7cdf6..fe87335 100644
+--- a/drivers/hwmon/Kconfig
++++ b/drivers/hwmon/Kconfig
+@@ -303,6 +303,15 @@ config SENSORS_CY8CXX
+ This driver can also be built as a module. If so, the module
+ will be called cy8cxx.
+
++config SENSORS_CY8C3245R1
++ tristate "Cypress Semiconductor CY8C3245R1"
++ depends on I2C
++ help
++ If you say yes here you get support for Cypress Semiconductor
++ CY8C3245 first revision sensor chips.
++
++ This driver can also be built as a module. If so, the module
++ will be called cy8c3245r1.
+
+ config SENSORS_DS620
+ tristate "Dallas Semiconductor DS620"
+diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
+index 5e22567..cf7f0b8 100644
+--- a/drivers/hwmon/Makefile
++++ b/drivers/hwmon/Makefile
+@@ -43,6 +43,7 @@ obj-$(CONFIG_SENSORS_ASC7621) += asc7621.o
+ obj-$(CONFIG_SENSORS_ATXP1) += atxp1.o
+ obj-$(CONFIG_SENSORS_CORETEMP) += coretemp.o
+ obj-$(CONFIG_SENSORS_CY8CXX) += cy8cxx.o
++obj-$(CONFIG_SENSORS_CY8C3245R1) += cy8c3245r1.o
+ obj-$(CONFIG_SENSORS_DME1737) += dme1737.o
+ obj-$(CONFIG_SENSORS_DS620) += ds620.o
+ obj-$(CONFIG_SENSORS_DS1621) += ds1621.o
+diff --git a/drivers/hwmon/cy8c3245r1.c b/drivers/hwmon/cy8c3245r1.c
+new file mode 100644
+index 0000000..0f4f4d1
+--- /dev/null
++++ b/drivers/hwmon/cy8c3245r1.c
+@@ -0,0 +1,1087 @@
++/*
++ * A hwmon driver for the Cypress Semiconductor C3245
++ * Copyright (C) 2014 Cumulus Networks
++ *
++ * Author: Shrijeet Mukherjee
++ * Author: Vidya Ravipati
++ *
++ * Based on the adt7470 driver
++ *
++ * 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.
++ *
++ * 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, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ */
++
++#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
++
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++
++/* cy8c3245r1 registers */
++#define CY8C3245R1_REG_BASE_ADDR 0x00
++#define CY8C3245R1_REG_DEV_ID 0x09
++#define CY8C3245R1_REG_COMPANY_ID 0x05
++#define CY8C3245R1_REG_FW_REV_MAJ 0x06
++#define CY8C3245R1_REG_FW_REV_MIN 0x07
++#define CY8C3245R1_REG_RESET 0x08
++
++/*
++ * Fan PWM / RPM Profile control registers
++ *
++ * These registers consist of two-bytes each
++ */
++#define CY8C3245R1_REG_FAN_PROFILE_BASE_ADDR 0x10
++#define CY8C3245R1_REG_FAN_PROFILE(x) (CY8C3245R1_REG_FAN_PROFILE_BASE_ADDR + ((x) * 2))
++enum {
++ CY8C3245R1_FAN_PROFILE_LOW_DUTY = 0,
++ CY8C3245R1_FAN_PROFILE_LOW_RPM,
++ CY8C3245R1_FAN_PROFILE_HIGH_DUTY,
++ CY8C3245R1_FAN_PROFILE_HIGH_RPM,
++ CY8C3245R1_FAN_PROFILE_SPEED_0_DUTY,
++ CY8C3245R1_FAN_PROFILE_SPEED_100_DUTY,
++ CY8C3245R1_FAN_PROFILE_MAX
++};
++
++/* skipping over regs to set */
++
++#define CY8C3245R1_REG_TEMP_BASE_ADDR 0x20
++
++#define CY8C3245R1_REG_FAN_BASE_ADDR 0x40
++#define CY8C3245R1_REG_FAN_TARGET_BASE_ADDR 0x3E
++
++#define CY8C3245R1_REG_PWM_BASE_ADDR 0x3C
++
++#define CY8C3245R1_REG_TEMP_LIMITS_BASE_ADDR 0x20
++#define CY8C3245R1_REG_TEMP_LIMITS_MAX_ADDR 0x28
++
++#define CY8C3245R1_REG_FAN_MAX_BASE_ADDR 0x16
++
++#define CY8C3245R1_REG_PWM_CFG_BASE_ADDR 0x33
++
++#define CY8C3245R1_TEMP_COUNT 8
++#define CY8C3245R1_TEMP_REG(x) (CY8C3245R1_REG_TEMP_BASE_ADDR + (x))
++#define CY8C3245R1_TEMP_MAX_REG(x) (CY8C3245R1_REG_TEMP_LIMITS_MAX_ADDR + (x))
++
++#define CY8C3245R1_FAN_COUNT 8
++#define CY8C3245R1_REG_FAN(x) (CY8C3245R1_REG_FAN_BASE_ADDR + ((x) * 2))
++
++#define CY8C3245R1_REG_FAN_MIN(x) (CY8C3245R1_REG_FAN_MIN_BASE_ADDR + ((x) * 2))
++#define CY8C3245R1_REG_FAN_MAX(x) (CY8C3245R1_REG_FAN_MAX_BASE_ADDR)
++#define CY8C3245R1_REG_FAN_TARGET (CY8C3245R1_REG_FAN_TARGET_BASE_ADDR)
++
++#define CY8C3245R1_PWM_COUNT 1
++#define CY8C3245R1_REG_PWM (CY8C3245R1_REG_PWM_BASE_ADDR)
++
++#define CY8C3245R1_COMPANY_ID 0xCC
++#define CY8C3245R1_DEV_ID 0x09
++#define CY8C3245R1_FW_REV_MAJ 0x02
++#define CY8C3245R1_FW_REV_MIN 0x03
++
++/* "all temps" according to hwmon sysfs interface spec */
++#define CY8C3245R1_PWM_ALL_TEMPS 0x3FF
++
++/* How often do we reread sensors values? (In jiffies) */
++#define SENSOR_REFRESH_INTERVAL (5 * HZ)
++
++/* How often do we reread sensor limit values? (In jiffies) */
++#define LIMIT_REFRESH_INTERVAL (60 * HZ)
++
++/* Wait at least 200ms per sensor for 10 sensors */
++#define TEMP_COLLECTION_TIME 2000
++
++/* auto update thing won't fire more than every 2s */
++#define AUTO_UPDATE_INTERVAL 2000
++
++/* datasheet says to divide this number by the fan reading to get fan rpm */
++#define FAN_PERIOD_INVALID 65535
++#define FAN_DATA_VALID(x) ((x) && (x) != FAN_PERIOD_INVALID)
++
++struct cy8c3245r1_data {
++ struct device *hwmon_dev;
++ struct attribute_group attrs;
++ struct mutex lock;
++ char sensors_valid;
++ char limits_valid;
++ unsigned long sensors_last_updated; /* In jiffies */
++ unsigned long limits_last_updated; /* In jiffies */
++
++ int num_temp_sensors; /* -1 = probe */
++ int temperatures_probed;
++
++ s8 temp[CY8C3245R1_TEMP_COUNT];
++ s8 temp_max[CY8C3245R1_TEMP_COUNT];
++ u16 fan[CY8C3245R1_FAN_COUNT];
++ u16 fan_max[CY8C3245R1_FAN_COUNT];
++ u16 fan_min[CY8C3245R1_FAN_COUNT];
++ u16 fan_tgt;
++ u16 fan_profile[CY8C3245R1_FAN_PROFILE_MAX];
++ u8 fan_alarm;
++ u8 temp_alarm;
++ u8 force_pwm_max;
++ u8 pwm;
++ u8 pwm_automatic;
++ struct task_struct *auto_update;
++ struct completion auto_update_stop;
++ unsigned int auto_update_interval;
++};
++
++static int cy8c3245r1_probe(struct i2c_client *client,
++ const struct i2c_device_id *id);
++static int cy8c3245r1_remove(struct i2c_client *client);
++
++static const struct i2c_device_id cy8c3245r1_id[] = {
++ { "CY8C3245R1", 0 },
++ { }
++};
++MODULE_DEVICE_TABLE(i2c, cy8c3245r1_id);
++
++static struct i2c_driver cy8c3245r1_driver = {
++ .class = I2C_CLASS_HWMON,
++ .driver = {
++ .name = "cy8c3245r1",
++ },
++ .probe = cy8c3245r1_probe,
++ .remove = cy8c3245r1_remove,
++ .id_table = cy8c3245r1_id,
++};
++
++/*
++ * 16-bit registers on the CY8C3245R1 are high-byte first.
++ */
++static inline int cy8c3245r1_read_word_data(struct i2c_client *client, u8 reg)
++{
++ s32 rc;
++ u16 val;
++
++ /* read high byte */
++ rc = i2c_smbus_read_byte_data(client, reg);
++ if (rc < 0) {
++ dev_warn(&client->dev, "i2c read failed: 0x%02x, errno %d\n",
++ reg, -rc);
++ return rc;
++ }
++ val = ((u16)rc & 0xFF) << 8;
++
++ /* read low byte */
++ rc = i2c_smbus_read_byte_data(client, reg + 1);
++ if (rc < 0) {
++ dev_warn(&client->dev, "i2c read failed: 0x%02x, errno %d\n",
++ reg + 1, -rc);
++ return rc;
++ }
++ val |= (u16)rc & 0xFF;
++
++ return val;
++}
++
++static inline int cy8c3245r1_write_word_data(struct i2c_client *client,
++ u8 reg,
++ u16 value)
++{
++ s32 rc;
++
++ /* write high byte */
++ rc = i2c_smbus_write_byte_data(client, reg, value >> 8);
++ if (rc < 0) {
++ dev_warn(&client->dev,
++ "i2c write failed: 0x%02x: 0x%02x, errno %d\n",
++ reg, value >> 8, -rc);
++ return rc;
++ }
++
++ /* write low byte */
++ rc = i2c_smbus_write_byte_data(client, reg + 1, value & 0xFF);
++ if (rc < 0) {
++ dev_warn(&client->dev,
++ "i2c write failed: 0x%02x: 0x%02x, errno %d\n",
++ reg + 1, value & 0xFF, -rc);
++ return rc;
++ }
++
++ return rc;
++}
++
++static void cy8c3245r1_init_client(struct i2c_client *client)
++{
++ int reg = i2c_smbus_read_byte_data(client, CY8C3245R1_REG_PWM_CFG_BASE_ADDR);
++
++ if (reg < 0) {
++ dev_err(&client->dev, "cannot read configuration register\n");
++ } else {
++ i2c_smbus_write_byte_data(client, CY8C3245R1_REG_PWM_CFG_BASE_ADDR, 0);
++ }
++}
++
++/* Probe for temperature sensors. Assumes lock is held */
++static int cy8c3245r1_read_temperatures(struct i2c_client *client,
++ struct cy8c3245r1_data *data)
++{
++ int i;
++
++ /* Only count fans if we have to */
++ if (data->num_temp_sensors >= 0)
++ return 0;
++
++ for (i = 0; i < CY8C3245R1_TEMP_COUNT; i++) {
++ data->temp[i] = i2c_smbus_read_byte_data(client,
++ CY8C3245R1_TEMP_REG(i));
++ if (data->temp[i])
++ data->num_temp_sensors = i + 1;
++ }
++ data->temperatures_probed = 1;
++ return 0;
++}
++
++static int cy8c3245r1_update_thread(void *p)
++{
++ struct i2c_client *client = p;
++ struct cy8c3245r1_data *data = i2c_get_clientdata(client);
++
++ while (!kthread_should_stop()) {
++ mutex_lock(&data->lock);
++ cy8c3245r1_read_temperatures(client, data);
++ mutex_unlock(&data->lock);
++ if (kthread_should_stop())
++ break;
++ msleep_interruptible(data->auto_update_interval);
++ }
++
++ complete_all(&data->auto_update_stop);
++ return 0;
++}
++
++static struct cy8c3245r1_data *cy8c3245r1_update_device(struct device *dev)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct cy8c3245r1_data *data = i2c_get_clientdata(client);
++ unsigned long local_jiffies = jiffies;
++ int i;
++ int need_sensors = 1;
++ int need_limits = 1;
++
++ /*
++ * Figure out if we need to update the shadow registers.
++ * Lockless means that we may occasionally report out of
++ * date data.
++ */
++ if (time_before(local_jiffies, data->sensors_last_updated +
++ SENSOR_REFRESH_INTERVAL) &&
++ data->sensors_valid)
++ need_sensors = 0;
++
++ if (time_before(local_jiffies, data->limits_last_updated +
++ LIMIT_REFRESH_INTERVAL) &&
++ data->limits_valid)
++ need_limits = 0;
++
++ if (!need_sensors && !need_limits)
++ return data;
++
++ mutex_lock(&data->lock);
++ if (!need_sensors)
++ goto no_sensor_update;
++
++ if (!data->temperatures_probed)
++ cy8c3245r1_read_temperatures(client, data);
++ else
++ for (i = 0; i < CY8C3245R1_TEMP_COUNT; i++)
++ data->temp[i] = i2c_smbus_read_byte_data(client,
++ CY8C3245R1_TEMP_REG(i));
++
++ for (i = 0; i < CY8C3245R1_FAN_COUNT; i++) {
++ data->fan[i] = cy8c3245r1_read_word_data(client,
++ CY8C3245R1_REG_FAN(i));
++ }
++
++ data->pwm = i2c_smbus_read_byte_data(client,
++ CY8C3245R1_REG_PWM);
++
++ data->sensors_last_updated = local_jiffies;
++ data->sensors_valid = 1;
++
++no_sensor_update:
++ if (!need_limits)
++ goto out;
++
++ for (i = 0; i < CY8C3245R1_TEMP_COUNT; i++) {
++ data->temp_max[i] = i2c_smbus_read_byte_data(client,
++ CY8C3245R1_TEMP_MAX_REG(i));
++ }
++
++ for (i = 0; i < CY8C3245R1_FAN_COUNT; i++) {
++ data->fan_max[i] = cy8c3245r1_read_word_data(client,
++ CY8C3245R1_REG_FAN_MAX(i));
++ }
++ data->fan_tgt = cy8c3245r1_read_word_data(client,
++ CY8C3245R1_REG_FAN_TARGET);
++
++ for (i = 0; i < CY8C3245R1_FAN_PROFILE_MAX; i++) {
++ data->fan_profile[i] = cy8c3245r1_read_word_data(client,
++ CY8C3245R1_REG_FAN_PROFILE(i));
++ }
++
++ data->limits_last_updated = local_jiffies;
++ data->limits_valid = 1;
++
++out:
++ mutex_unlock(&data->lock);
++ return data;
++}
++
++static ssize_t show_auto_update_interval(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct cy8c3245r1_data *data = cy8c3245r1_update_device(dev);
++ return sprintf(buf, "%d\n", data->auto_update_interval);
++}
++
++static ssize_t set_auto_update_interval(struct device *dev,
++ struct device_attribute *devattr,
++ const char *buf,
++ size_t count)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct cy8c3245r1_data *data = i2c_get_clientdata(client);
++ long temp;
++
++ if (strict_strtol(buf, 10, &temp))
++ return -EINVAL;
++
++ temp = SENSORS_LIMIT(temp, 0, 60000);
++
++ mutex_lock(&data->lock);
++ data->auto_update_interval = temp;
++ mutex_unlock(&data->lock);
++
++ return count;
++}
++
++static ssize_t show_num_temp_sensors(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct cy8c3245r1_data *data = cy8c3245r1_update_device(dev);
++ return sprintf(buf, "%d\n", data->num_temp_sensors);
++}
++
++static ssize_t set_num_temp_sensors(struct device *dev,
++ struct device_attribute *devattr,
++ const char *buf,
++ size_t count)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct cy8c3245r1_data *data = i2c_get_clientdata(client);
++ long temp;
++
++ if (strict_strtol(buf, 10, &temp))
++ return -EINVAL;
++
++ temp = SENSORS_LIMIT(temp, -1, 10);
++
++ mutex_lock(&data->lock);
++ data->num_temp_sensors = temp;
++ if (temp < 0)
++ data->temperatures_probed = 0;
++ mutex_unlock(&data->lock);
++
++ return count;
++}
++
++static ssize_t show_temp_max(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct cy8c3245r1_data *data = cy8c3245r1_update_device(dev);
++ return sprintf(buf, "%d\n", 1000 * data->temp_max[attr->index]);
++}
++
++static ssize_t set_temp_max(struct device *dev,
++ struct device_attribute *devattr,
++ const char *buf,
++ size_t count)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct i2c_client *client = to_i2c_client(dev);
++ struct cy8c3245r1_data *data = i2c_get_clientdata(client);
++ long temp;
++
++ if (strict_strtol(buf, 10, &temp))
++ return -EINVAL;
++
++ temp = DIV_ROUND_CLOSEST(temp, 1000);
++ temp = SENSORS_LIMIT(temp, -128, 127);
++
++ mutex_lock(&data->lock);
++ data->temp_max[attr->index] = temp;
++ i2c_smbus_write_byte_data(client, CY8C3245R1_TEMP_MAX_REG(attr->index),
++ temp);
++ mutex_unlock(&data->lock);
++
++ return count;
++}
++
++static ssize_t show_temp(struct device *dev, struct device_attribute *devattr,
++ char *buf)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct cy8c3245r1_data *data = cy8c3245r1_update_device(dev);
++ return sprintf(buf, "%d\n", 1000 * data->temp[attr->index]);
++}
++
++static ssize_t show_fan_max(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct cy8c3245r1_data *data = cy8c3245r1_update_device(dev);
++
++ if (FAN_DATA_VALID(data->fan_max[attr->index]))
++ return sprintf(buf, "%d\n",
++ data->fan_max[attr->index]);
++ else
++ return sprintf(buf, "0\n");
++}
++
++static ssize_t set_fan_max(struct device *dev,
++ struct device_attribute *devattr,
++ const char *buf, size_t count)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct i2c_client *client = to_i2c_client(dev);
++ struct cy8c3245r1_data *data = i2c_get_clientdata(client);
++ long rpm;
++
++ if (strict_strtol(buf, 10, &rpm) || !rpm)
++ return -EINVAL;
++
++ rpm = SENSORS_LIMIT(rpm, 1, 65534);
++
++ mutex_lock(&data->lock);
++ data->fan_max[attr->index] = rpm;
++ cy8c3245r1_write_word_data(client, CY8C3245R1_REG_FAN_MAX(attr->index), rpm);
++ mutex_unlock(&data->lock);
++
++ return count;
++}
++
++/*
++ * fan_min is a pure software concept, not implemented by hardware.
++ * It is used to compute the alarm status.
++ */
++static ssize_t show_fan_min(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct cy8c3245r1_data *data = cy8c3245r1_update_device(dev);
++
++ return sprintf(buf, "%d\n", data->fan_min[attr->index]);
++}
++
++static ssize_t set_fan_min(struct device *dev,
++ struct device_attribute *devattr,
++ const char *buf, size_t count)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct i2c_client *client = to_i2c_client(dev);
++ struct cy8c3245r1_data *data = i2c_get_clientdata(client);
++ long rpm;
++
++ if (strict_strtol(buf, 10, &rpm) || !rpm)
++ return -EINVAL;
++
++ rpm = SENSORS_LIMIT(rpm, 1, 65534);
++
++ mutex_lock(&data->lock);
++ data->fan_min[attr->index] = rpm;
++ mutex_unlock(&data->lock);
++
++ return count;
++}
++
++static ssize_t show_fan_target(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct cy8c3245r1_data *data = cy8c3245r1_update_device(dev);
++
++ if (FAN_DATA_VALID(data->fan_tgt))
++ return sprintf(buf, "%d\n",
++ data->fan_tgt);
++ else
++ return sprintf(buf, "0\n");
++}
++
++static ssize_t set_fan_target(struct device *dev,
++ struct device_attribute *devattr,
++ const char *buf, size_t count)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct i2c_client *client = to_i2c_client(dev);
++ struct cy8c3245r1_data *data = i2c_get_clientdata(client);
++ long rpm;
++
++ if (strict_strtol(buf, 10, &rpm) || !rpm)
++ return -EINVAL;
++
++ rpm = SENSORS_LIMIT(rpm, 1, 65534);
++
++ mutex_lock(&data->lock);
++ data->fan_tgt = rpm;
++ cy8c3245r1_write_word_data(client, CY8C3245R1_REG_FAN_TARGET, rpm);
++ mutex_unlock(&data->lock);
++
++ return count;
++}
++
++/*
++ * Show Fan Profile Settings
++ */
++static ssize_t show_fan_profile(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct cy8c3245r1_data *data = cy8c3245r1_update_device(dev);
++
++ return sprintf(buf, "%u\n",
++ data->fan_profile[attr->index]);
++}
++
++/*
++ * Set Fan Profile Settings
++ */
++static ssize_t set_fan_profile(struct device *dev,
++ struct device_attribute *devattr,
++ const char *buf, size_t count)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct i2c_client *client = to_i2c_client(dev);
++ struct cy8c3245r1_data *data = i2c_get_clientdata(client);
++ long parm;
++
++ if (strict_strtoul(buf, 10, &parm))
++ return -EINVAL;
++
++ parm = SENSORS_LIMIT(parm, 1, 65534);
++
++ mutex_lock(&data->lock);
++ data->fan_profile[attr->index] = parm;
++ cy8c3245r1_write_word_data(client, CY8C3245R1_REG_FAN_PROFILE(attr->index), parm);
++ mutex_unlock(&data->lock);
++
++ return count;
++}
++
++static ssize_t show_fan(struct device *dev, struct device_attribute *devattr,
++ char *buf)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct cy8c3245r1_data *data = cy8c3245r1_update_device(dev);
++
++ if (FAN_DATA_VALID(data->fan[attr->index]))
++ return sprintf(buf, "%d\n", data->fan[attr->index]);
++ else
++ return sprintf(buf, "0\n");
++}
++
++static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr,
++ char *buf)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct cy8c3245r1_data *data = cy8c3245r1_update_device(dev);
++ return sprintf(buf, "%d\n", data->pwm);
++}
++
++static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr,
++ const char *buf, size_t count)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct i2c_client *client = to_i2c_client(dev);
++ struct cy8c3245r1_data *data = i2c_get_clientdata(client);
++ long temp;
++
++ if (strict_strtol(buf, 10, &temp))
++ return -EINVAL;
++
++ temp = SENSORS_LIMIT(temp, 0, 255);
++
++ mutex_lock(&data->lock);
++ data->pwm = temp;
++ i2c_smbus_write_byte_data(client, CY8C3245R1_REG_PWM, temp);
++ mutex_unlock(&data->lock);
++
++ return count;
++}
++
++static ssize_t show_fan_alarm_mask(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct cy8c3245r1_data *data = cy8c3245r1_update_device(dev);
++ int i;
++ u32 alarm_mask = 0;
++
++ for (i = 0; i < CY8C3245R1_FAN_COUNT; i++)
++ if ((data->fan[i] < data->fan_min[i]) ||
++ (data->fan[i] >= data->fan_max[i]))
++ alarm_mask |= 0x1 << i;
++
++ return sprintf(buf, "%x\n", alarm_mask);
++}
++
++static ssize_t show_temp_alarm_mask(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct cy8c3245r1_data *data = cy8c3245r1_update_device(dev);
++ int i;
++ u32 alarm_mask = 0;
++
++ for (i = 0; i < CY8C3245R1_TEMP_COUNT; i++)
++ if (data->temp[i] >= data->temp_max[i])
++ alarm_mask |= 0x1 << i;
++
++ return sprintf(buf, "%x\n", alarm_mask);
++}
++
++static ssize_t show_fan_alarm(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct cy8c3245r1_data *data = cy8c3245r1_update_device(dev);
++
++ if ((data->fan[attr->index] < data->fan_min[attr->index]) ||
++ (data->fan[attr->index] >= data->fan_max[attr->index]))
++ return sprintf(buf, "1\n");
++ else
++ return sprintf(buf, "0\n");
++}
++
++static ssize_t show_temp_alarm(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct cy8c3245r1_data *data = cy8c3245r1_update_device(dev);
++
++ if (data->temp[attr->index] >= data->temp_max[attr->index])
++ return sprintf(buf, "1\n");
++ else
++ return sprintf(buf, "0\n");
++}
++
++static ssize_t set_pwm_auto(struct device *dev,
++ struct device_attribute *devattr,
++ const char *buf,
++ size_t count)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct cy8c3245r1_data *data = i2c_get_clientdata(client);
++ long temp;
++
++ if (strict_strtol(buf, 10, &temp))
++ return -EINVAL;
++
++ if (!(temp >= 0 && temp <= 3))
++ return -EINVAL;
++
++ return count;
++}
++
++static ssize_t show_pwm_auto(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct cy8c3245r1_data *data = cy8c3245r1_update_device(dev);
++
++ return sprintf(buf, "%d\n", data->pwm_automatic);
++}
++
++#define CY8C3245R1_REG_MIN 0x00
++#define CY8C3245R1_REG_MAX 0xe0
++
++static ssize_t show_debug(struct device *dev,
++ struct device_attribute *devattr,
++ char *buf)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++
++ int len = 0, i, j;
++ u8 val;
++ for (i = 0; i < (CY8C3245R1_REG_MAX - CY8C3245R1_REG_MIN) / 16; i++) {
++ len += sprintf(buf+len, "0x%02x: ", CY8C3245R1_REG_MIN + (i * 16));
++ for (j = 0; j < 16; j++) {
++ val = i2c_smbus_read_byte_data(client, CY8C3245R1_REG_MIN + (i * 16) + j);
++ len += sprintf(buf+len, "%02x ", val);
++ }
++ len += sprintf(buf+len, "\n");
++ }
++ return len;
++}
++
++static DEVICE_ATTR(fan_alarm_mask, S_IRUGO, show_fan_alarm_mask, NULL);
++static DEVICE_ATTR(temp_alarm_mask, S_IRUGO, show_temp_alarm_mask, NULL);
++static DEVICE_ATTR(num_temp_sensors, S_IWUSR | S_IRUGO, show_num_temp_sensors,
++ set_num_temp_sensors);
++static DEVICE_ATTR(auto_update_interval, S_IWUSR | S_IRUGO,
++ show_auto_update_interval, set_auto_update_interval);
++
++static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp_max,
++ set_temp_max, 0);
++static SENSOR_DEVICE_ATTR(temp2_max, S_IWUSR | S_IRUGO, show_temp_max,
++ set_temp_max, 1);
++static SENSOR_DEVICE_ATTR(temp3_max, S_IWUSR | S_IRUGO, show_temp_max,
++ set_temp_max, 2);
++static SENSOR_DEVICE_ATTR(temp4_max, S_IWUSR | S_IRUGO, show_temp_max,
++ set_temp_max, 3);
++static SENSOR_DEVICE_ATTR(temp5_max, S_IWUSR | S_IRUGO, show_temp_max,
++ set_temp_max, 4);
++static SENSOR_DEVICE_ATTR(temp6_max, S_IWUSR | S_IRUGO, show_temp_max,
++ set_temp_max, 5);
++static SENSOR_DEVICE_ATTR(temp7_max, S_IWUSR | S_IRUGO, show_temp_max,
++ set_temp_max, 6);
++static SENSOR_DEVICE_ATTR(temp8_max, S_IWUSR | S_IRUGO, show_temp_max,
++ set_temp_max, 7);
++
++static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0);
++static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1);
++static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2);
++static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, show_temp, NULL, 3);
++static SENSOR_DEVICE_ATTR(temp5_input, S_IRUGO, show_temp, NULL, 4);
++static SENSOR_DEVICE_ATTR(temp6_input, S_IRUGO, show_temp, NULL, 5);
++static SENSOR_DEVICE_ATTR(temp7_input, S_IRUGO, show_temp, NULL, 6);
++static SENSOR_DEVICE_ATTR(temp8_input, S_IRUGO, show_temp, NULL, 7);
++
++static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_temp_alarm, NULL, 0);
++static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_temp_alarm, NULL, 1);
++static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_temp_alarm, NULL, 2);
++static SENSOR_DEVICE_ATTR(temp4_alarm, S_IRUGO, show_temp_alarm, NULL, 3);
++static SENSOR_DEVICE_ATTR(temp5_alarm, S_IRUGO, show_temp_alarm, NULL, 4);
++static SENSOR_DEVICE_ATTR(temp6_alarm, S_IRUGO, show_temp_alarm, NULL, 4);
++static SENSOR_DEVICE_ATTR(temp7_alarm, S_IRUGO, show_temp_alarm, NULL, 4);
++static SENSOR_DEVICE_ATTR(temp8_alarm, S_IRUGO, show_temp_alarm, NULL, 4);
++
++static SENSOR_DEVICE_ATTR(fan1_max, S_IWUSR | S_IRUGO, show_fan_max,
++ set_fan_max, 0);
++static SENSOR_DEVICE_ATTR(fan2_max, S_IWUSR | S_IRUGO, show_fan_max,
++ set_fan_max, 1);
++static SENSOR_DEVICE_ATTR(fan3_max, S_IWUSR | S_IRUGO, show_fan_max,
++ set_fan_max, 2);
++static SENSOR_DEVICE_ATTR(fan4_max, S_IWUSR | S_IRUGO, show_fan_max,
++ set_fan_max, 3);
++static SENSOR_DEVICE_ATTR(fan5_max, S_IWUSR | S_IRUGO, show_fan_max,
++ set_fan_max, 4);
++static SENSOR_DEVICE_ATTR(fan6_max, S_IWUSR | S_IRUGO, show_fan_max,
++ set_fan_max, 5);
++static SENSOR_DEVICE_ATTR(fan7_max, S_IWUSR | S_IRUGO, show_fan_max,
++ set_fan_max, 6);
++static SENSOR_DEVICE_ATTR(fan8_max, S_IWUSR | S_IRUGO, show_fan_max,
++ set_fan_max, 7);
++
++static SENSOR_DEVICE_ATTR(fan1_min, S_IWUSR | S_IRUGO, show_fan_min,
++ set_fan_min, 0);
++static SENSOR_DEVICE_ATTR(fan2_min, S_IWUSR | S_IRUGO, show_fan_min,
++ set_fan_min, 1);
++static SENSOR_DEVICE_ATTR(fan3_min, S_IWUSR | S_IRUGO, show_fan_min,
++ set_fan_min, 2);
++static SENSOR_DEVICE_ATTR(fan4_min, S_IWUSR | S_IRUGO, show_fan_min,
++ set_fan_min, 3);
++static SENSOR_DEVICE_ATTR(fan5_min, S_IWUSR | S_IRUGO, show_fan_min,
++ set_fan_min, 4);
++static SENSOR_DEVICE_ATTR(fan6_min, S_IWUSR | S_IRUGO, show_fan_min,
++ set_fan_min, 5);
++static SENSOR_DEVICE_ATTR(fan7_min, S_IWUSR | S_IRUGO, show_fan_min,
++ set_fan_min, 6);
++static SENSOR_DEVICE_ATTR(fan8_min, S_IWUSR | S_IRUGO, show_fan_min,
++ set_fan_min, 7);
++
++static SENSOR_DEVICE_ATTR(fan1_target, S_IWUSR | S_IRUGO, show_fan_target,
++ set_fan_target, 0);
++static SENSOR_DEVICE_ATTR(fan2_target, S_IWUSR | S_IRUGO, show_fan_target,
++ set_fan_target, 1);
++static SENSOR_DEVICE_ATTR(fan3_target, S_IWUSR | S_IRUGO, show_fan_target,
++ set_fan_target, 2);
++static SENSOR_DEVICE_ATTR(fan4_target, S_IWUSR | S_IRUGO, show_fan_target,
++ set_fan_target, 3);
++static SENSOR_DEVICE_ATTR(fan5_target, S_IWUSR | S_IRUGO, show_fan_target,
++ set_fan_target, 4);
++static SENSOR_DEVICE_ATTR(fan6_target, S_IWUSR | S_IRUGO, show_fan_target,
++ set_fan_target, 5);
++static SENSOR_DEVICE_ATTR(fan7_target, S_IWUSR | S_IRUGO, show_fan_target,
++ set_fan_target, 6);
++static SENSOR_DEVICE_ATTR(fan8_target, S_IWUSR | S_IRUGO, show_fan_target,
++ set_fan_target, 7);
++
++#define FAN_PROFILE_ATTR(_name, _index) \
++ SENSOR_DEVICE_ATTR(_name, S_IWUSR | S_IRUGO, \
++ show_fan_profile, set_fan_profile, _index)
++
++static FAN_PROFILE_ATTR(fan_low_duty, CY8C3245R1_FAN_PROFILE_LOW_DUTY);
++static FAN_PROFILE_ATTR(fan_low_rpm, CY8C3245R1_FAN_PROFILE_LOW_RPM);
++static FAN_PROFILE_ATTR(fan_high_duty, CY8C3245R1_FAN_PROFILE_HIGH_DUTY);
++static FAN_PROFILE_ATTR(fan_high_rpm, CY8C3245R1_FAN_PROFILE_HIGH_RPM);
++static FAN_PROFILE_ATTR(fan_speed_0_duty, CY8C3245R1_FAN_PROFILE_SPEED_0_DUTY);
++static FAN_PROFILE_ATTR(fan_speed_100_duty,CY8C3245R1_FAN_PROFILE_SPEED_100_DUTY);
++
++static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0);
++static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1);
++static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2);
++static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, show_fan, NULL, 3);
++static SENSOR_DEVICE_ATTR(fan5_input, S_IRUGO, show_fan, NULL, 4);
++static SENSOR_DEVICE_ATTR(fan6_input, S_IRUGO, show_fan, NULL, 5);
++static SENSOR_DEVICE_ATTR(fan7_input, S_IRUGO, show_fan, NULL, 6);
++static SENSOR_DEVICE_ATTR(fan8_input, S_IRUGO, show_fan, NULL, 7);
++
++static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_fan_alarm, NULL, 0);
++static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_fan_alarm, NULL, 1);
++static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_fan_alarm, NULL, 2);
++static SENSOR_DEVICE_ATTR(fan4_alarm, S_IRUGO, show_fan_alarm, NULL, 3);
++static SENSOR_DEVICE_ATTR(fan5_alarm, S_IRUGO, show_fan_alarm, NULL, 4);
++static SENSOR_DEVICE_ATTR(fan6_alarm, S_IRUGO, show_fan_alarm, NULL, 5);
++static SENSOR_DEVICE_ATTR(fan7_alarm, S_IRUGO, show_fan_alarm, NULL, 6);
++static SENSOR_DEVICE_ATTR(fan8_alarm, S_IRUGO, show_fan_alarm, NULL, 7);
++
++static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 0);
++static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 1);
++static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 2);
++static SENSOR_DEVICE_ATTR(pwm4, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 3);
++static SENSOR_DEVICE_ATTR(pwm5, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 4);
++static SENSOR_DEVICE_ATTR(pwm6, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 5);
++static SENSOR_DEVICE_ATTR(pwm7, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 6);
++static SENSOR_DEVICE_ATTR(pwm8, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 7);
++
++static SENSOR_DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO, show_pwm_auto,
++ set_pwm_auto, 0);
++static SENSOR_DEVICE_ATTR(pwm2_enable, S_IWUSR | S_IRUGO, show_pwm_auto,
++ set_pwm_auto, 0);
++static SENSOR_DEVICE_ATTR(pwm3_enable, S_IWUSR | S_IRUGO, show_pwm_auto,
++ set_pwm_auto, 0);
++static SENSOR_DEVICE_ATTR(pwm4_enable, S_IWUSR | S_IRUGO, show_pwm_auto,
++ set_pwm_auto, 0);
++static SENSOR_DEVICE_ATTR(pwm5_enable, S_IWUSR | S_IRUGO, show_pwm_auto,
++ set_pwm_auto, 0);
++static SENSOR_DEVICE_ATTR(pwm6_enable, S_IWUSR | S_IRUGO, show_pwm_auto,
++ set_pwm_auto, 0);
++static SENSOR_DEVICE_ATTR(pwm7_enable, S_IWUSR | S_IRUGO, show_pwm_auto,
++ set_pwm_auto, 0);
++static SENSOR_DEVICE_ATTR(pwm8_enable, S_IWUSR | S_IRUGO, show_pwm_auto,
++ set_pwm_auto, 0);
++
++static SENSOR_DEVICE_ATTR(debug, S_IRUGO, show_debug, NULL, 0);
++
++static struct attribute *cy8c3245r1_attr[] =
++{
++ &dev_attr_fan_alarm_mask.attr,
++ &dev_attr_temp_alarm_mask.attr,
++ &dev_attr_num_temp_sensors.attr,
++ &dev_attr_auto_update_interval.attr,
++ &sensor_dev_attr_temp1_max.dev_attr.attr,
++ &sensor_dev_attr_temp2_max.dev_attr.attr,
++ &sensor_dev_attr_temp3_max.dev_attr.attr,
++ &sensor_dev_attr_temp4_max.dev_attr.attr,
++ &sensor_dev_attr_temp5_max.dev_attr.attr,
++ &sensor_dev_attr_temp6_max.dev_attr.attr,
++ &sensor_dev_attr_temp7_max.dev_attr.attr,
++ &sensor_dev_attr_temp8_max.dev_attr.attr,
++ &sensor_dev_attr_temp1_input.dev_attr.attr,
++ &sensor_dev_attr_temp2_input.dev_attr.attr,
++ &sensor_dev_attr_temp3_input.dev_attr.attr,
++ &sensor_dev_attr_temp4_input.dev_attr.attr,
++ &sensor_dev_attr_temp5_input.dev_attr.attr,
++ &sensor_dev_attr_temp6_input.dev_attr.attr,
++ &sensor_dev_attr_temp7_input.dev_attr.attr,
++ &sensor_dev_attr_temp8_input.dev_attr.attr,
++ &sensor_dev_attr_temp1_alarm.dev_attr.attr,
++ &sensor_dev_attr_temp2_alarm.dev_attr.attr,
++ &sensor_dev_attr_temp3_alarm.dev_attr.attr,
++ &sensor_dev_attr_temp4_alarm.dev_attr.attr,
++ &sensor_dev_attr_temp5_alarm.dev_attr.attr,
++ &sensor_dev_attr_temp6_alarm.dev_attr.attr,
++ &sensor_dev_attr_temp7_alarm.dev_attr.attr,
++ &sensor_dev_attr_temp8_alarm.dev_attr.attr,
++ &sensor_dev_attr_fan1_max.dev_attr.attr,
++ &sensor_dev_attr_fan2_max.dev_attr.attr,
++ &sensor_dev_attr_fan3_max.dev_attr.attr,
++ &sensor_dev_attr_fan4_max.dev_attr.attr,
++ &sensor_dev_attr_fan5_max.dev_attr.attr,
++ &sensor_dev_attr_fan6_max.dev_attr.attr,
++ &sensor_dev_attr_fan7_max.dev_attr.attr,
++ &sensor_dev_attr_fan8_max.dev_attr.attr,
++ &sensor_dev_attr_fan1_min.dev_attr.attr,
++ &sensor_dev_attr_fan2_min.dev_attr.attr,
++ &sensor_dev_attr_fan3_min.dev_attr.attr,
++ &sensor_dev_attr_fan4_min.dev_attr.attr,
++ &sensor_dev_attr_fan5_min.dev_attr.attr,
++ &sensor_dev_attr_fan6_min.dev_attr.attr,
++ &sensor_dev_attr_fan7_min.dev_attr.attr,
++ &sensor_dev_attr_fan8_min.dev_attr.attr,
++ &sensor_dev_attr_fan1_target.dev_attr.attr,
++ &sensor_dev_attr_fan2_target.dev_attr.attr,
++ &sensor_dev_attr_fan3_target.dev_attr.attr,
++ &sensor_dev_attr_fan4_target.dev_attr.attr,
++ &sensor_dev_attr_fan5_target.dev_attr.attr,
++ &sensor_dev_attr_fan6_target.dev_attr.attr,
++ &sensor_dev_attr_fan7_target.dev_attr.attr,
++ &sensor_dev_attr_fan8_target.dev_attr.attr,
++ &sensor_dev_attr_fan1_input.dev_attr.attr,
++ &sensor_dev_attr_fan2_input.dev_attr.attr,
++ &sensor_dev_attr_fan3_input.dev_attr.attr,
++ &sensor_dev_attr_fan4_input.dev_attr.attr,
++ &sensor_dev_attr_fan5_input.dev_attr.attr,
++ &sensor_dev_attr_fan6_input.dev_attr.attr,
++ &sensor_dev_attr_fan7_input.dev_attr.attr,
++ &sensor_dev_attr_fan8_input.dev_attr.attr,
++ &sensor_dev_attr_fan1_alarm.dev_attr.attr,
++ &sensor_dev_attr_fan2_alarm.dev_attr.attr,
++ &sensor_dev_attr_fan3_alarm.dev_attr.attr,
++ &sensor_dev_attr_fan4_alarm.dev_attr.attr,
++ &sensor_dev_attr_fan5_alarm.dev_attr.attr,
++ &sensor_dev_attr_fan6_alarm.dev_attr.attr,
++ &sensor_dev_attr_fan7_alarm.dev_attr.attr,
++ &sensor_dev_attr_fan8_alarm.dev_attr.attr,
++ &sensor_dev_attr_pwm1.dev_attr.attr,
++ &sensor_dev_attr_pwm2.dev_attr.attr,
++ &sensor_dev_attr_pwm3.dev_attr.attr,
++ &sensor_dev_attr_pwm4.dev_attr.attr,
++ &sensor_dev_attr_pwm5.dev_attr.attr,
++ &sensor_dev_attr_pwm6.dev_attr.attr,
++ &sensor_dev_attr_pwm7.dev_attr.attr,
++ &sensor_dev_attr_pwm8.dev_attr.attr,
++ &sensor_dev_attr_pwm1_enable.dev_attr.attr,
++ &sensor_dev_attr_pwm2_enable.dev_attr.attr,
++ &sensor_dev_attr_pwm3_enable.dev_attr.attr,
++ &sensor_dev_attr_pwm4_enable.dev_attr.attr,
++ &sensor_dev_attr_pwm5_enable.dev_attr.attr,
++ &sensor_dev_attr_pwm6_enable.dev_attr.attr,
++ &sensor_dev_attr_pwm7_enable.dev_attr.attr,
++ &sensor_dev_attr_pwm8_enable.dev_attr.attr,
++ &sensor_dev_attr_fan_low_duty.dev_attr.attr,
++ &sensor_dev_attr_fan_low_rpm.dev_attr.attr,
++ &sensor_dev_attr_fan_high_duty.dev_attr.attr,
++ &sensor_dev_attr_fan_high_rpm.dev_attr.attr,
++ &sensor_dev_attr_fan_speed_0_duty.dev_attr.attr,
++ &sensor_dev_attr_fan_speed_100_duty.dev_attr.attr,
++ &sensor_dev_attr_debug.dev_attr.attr,
++ NULL
++};
++
++static int cy8c3245r1_probe(struct i2c_client *client,
++ const struct i2c_device_id *id)
++{
++ struct cy8c3245r1_data *data;
++ int err;
++ int minor_revision, major_revision;
++
++ data = kzalloc(sizeof(struct cy8c3245r1_data), GFP_KERNEL);
++ if (!data) {
++ err = -ENOMEM;
++ goto exit;
++ }
++
++ data->num_temp_sensors = -1;
++ data->auto_update_interval = AUTO_UPDATE_INTERVAL;
++
++ i2c_set_clientdata(client, data);
++ mutex_init(&data->lock);
++
++ dev_info(&client->dev, "%s chip found\n", client->name);
++
++ /* Initialize the CY8C3245R1 chip */
++ cy8c3245r1_init_client(client);
++
++ minor_revision = i2c_smbus_read_byte_data(client, CY8C3245R1_REG_FW_REV_MIN);
++ major_revision = i2c_smbus_read_byte_data(client, CY8C3245R1_REG_FW_REV_MAJ);
++ if ((minor_revision < CY8C3245R1_FW_REV_MIN) ||
++ (major_revision != CY8C3245R1_FW_REV_MAJ)) {
++ dev_err(&client->dev,
++ "PSoC Supported Version >= %u.%u, Current version %u.%u\n",
++ CY8C3245R1_FW_REV_MAJ, CY8C3245R1_FW_REV_MIN, major_revision,
++ minor_revision);
++ err = -ENODEV;
++ goto exit_free;
++ }
++
++ /* Register sysfs hooks */
++ data->attrs.attrs = cy8c3245r1_attr;
++ if ((err = sysfs_create_group(&client->dev.kobj, &data->attrs)))
++ goto exit_free;
++
++ data->hwmon_dev = hwmon_device_register(&client->dev);
++ if (IS_ERR(data->hwmon_dev)) {
++ err = PTR_ERR(data->hwmon_dev);
++ goto exit_remove;
++ }
++
++ init_completion(&data->auto_update_stop);
++ data->auto_update = kthread_run(cy8c3245r1_update_thread, client,
++ dev_name(data->hwmon_dev));
++ if (IS_ERR(data->auto_update)) {
++ err = PTR_ERR(data->auto_update);
++ goto exit_unregister;
++ }
++
++ return 0;
++
++exit_unregister:
++ hwmon_device_unregister(data->hwmon_dev);
++exit_remove:
++ sysfs_remove_group(&client->dev.kobj, &data->attrs);
++exit_free:
++ kfree(data);
++exit:
++ return err;
++}
++
++static int cy8c3245r1_remove(struct i2c_client *client)
++{
++ struct cy8c3245r1_data *data = i2c_get_clientdata(client);
++
++ kthread_stop(data->auto_update);
++ wait_for_completion(&data->auto_update_stop);
++ hwmon_device_unregister(data->hwmon_dev);
++ sysfs_remove_group(&client->dev.kobj, &data->attrs);
++ kfree(data);
++ return 0;
++}
++
++static int __init cy8c3245r1_init(void)
++{
++ return i2c_add_driver(&cy8c3245r1_driver);
++}
++
++static void __exit cy8c3245r1_exit(void)
++{
++ i2c_del_driver(&cy8c3245r1_driver);
++}
++
++MODULE_AUTHOR("Shrijeet Mukherjee ");
++MODULE_AUTHOR("Vidya Ravipati ");
++MODULE_DESCRIPTION("CY8C3245R1 driver");
++MODULE_LICENSE("GPL");
++
++module_init(cy8c3245r1_init);
++module_exit(cy8c3245r1_exit);
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-ds100df410-retimer.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-ds100df410-retimer.patch
new file mode 100644
index 00000000..e5841f8b
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-ds100df410-retimer.patch
@@ -0,0 +1,546 @@
+Driver for DS100DF410 Low Power 10GbE Quad Channel Retimer/Equalizer
+
+diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
+index 846aab1..41989b0 100644
+--- a/drivers/misc/Kconfig
++++ b/drivers/misc/Kconfig
+@@ -527,6 +527,27 @@ config EDA_DEF_ALIGN
+ help
+ Default alignment of the memory region. Default is 1MB.
+
++config RETIMER_CLASS
++ tristate "Retimer Class support"
++ depends on SYSFS
++ default y
++ help
++ Creates a hardware class in sysfs called "retimer_dev",
++ providing a common place to register RETIMER devices.
++
++ This support can also be built as a module. If so, the module
++ will be called retimer_class.
++
++config DS100DF410
++ tristate "DS100DF410 Low Power 10GbE Quad Channel Retimer"
++ depends on I2C && SYSFS
++ help
++ If you say yes here you get support for the DS100DF410
++ Low Power 10GbE Quad Channel Retimer.
++
++ This driver can also be built as a module. If so, the module
++ will be called ds100df410.
++
+ source "drivers/misc/c2port/Kconfig"
+ source "drivers/misc/eeprom/Kconfig"
+ source "drivers/misc/cb710/Kconfig"
+diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
+index cf09aa8..ad70876 100644
+--- a/drivers/misc/Makefile
++++ b/drivers/misc/Makefile
+@@ -49,3 +49,5 @@ obj-y += carma/
+ obj-$(CONFIG_USB_SWITCH_FSA9480) += fsa9480.o
+ obj-$(CONFIG_ALTERA_STAPL) +=altera-stapl/
+ obj-$(CONFIG_EARLY_DMA_ALLOC) += early_dma_alloc.o
++obj-$(CONFIG_RETIMER_CLASS) += retimer_class.o
++obj-$(CONFIG_DS100DF410) += ds100df410.o
+diff --git a/drivers/misc/ds100df410.c b/drivers/misc/ds100df410.c
+new file mode 100644
+index 0000000..b626111
+--- /dev/null
++++ b/drivers/misc/ds100df410.c
+@@ -0,0 +1,290 @@
++/*
++ * ds100df410.c - I2c client driver to manage DS100DF410
++ * DS100DF410 Low Power 10GbE Quad Channel Retimer
++ *
++ * Copyright (C) 2014 Cumulus Networks, Inc.
++ * Author: Puneet Shenoy
++ *
++ * Ideas and structure regarding introducing the class device graciously borrowed
++ * from the eeprom sysfs/class support by:
++ * Copyright (C) 2013 CumulusNetworks, Inc.
++ * Author: Curt Brune
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++
++#ifdef CONFIG_RETIMER_CLASS
++#include
++#endif
++
++#define DS100DF410_DRV_NAME "ds100df410"
++#define DRIVER_VERSION "1.0"
++
++#define DS100DF410_CDR_RST_REG 0x0a
++#define DS100DF410_TAP_DEM_REG 0x15
++#define DS100DF410_PFD_PRBS_DFE_REG 0x1e
++#define DS100DF410_DRV_SEL_VOD_REG 0x2d
++#define DS100DF410_ADAPT_EQ_SM_REG 0x31
++#define DS100DF410_VEO_CLK_CDR_CAP_REG 0x36
++#define DS100DF410_CHANNELS_REG 0xff
++
++struct ds100df410_data {
++ struct i2c_client *client;
++
++#ifdef CONFIG_RETIMER_CLASS
++ struct device *retimer_dev;
++#endif
++ struct mutex lock;
++};
++
++static u32 ds100df410_read(struct device *dev, u8 reg, char *buf)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ u32 ret = i2c_smbus_read_byte_data(client, reg);
++
++ return sprintf(buf, "%d\n", ret);
++}
++
++static u32 ds100df410_write(struct device *dev, u8 reg, const char *buf,
++ size_t count)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ unsigned long val;
++ int ret;
++
++ if (strict_strtoul(buf, 0, &val) < 0)
++ return -EINVAL;
++
++ ret = i2c_smbus_write_byte_data(client, reg, (u8)val);
++ if (ret < 0)
++ return ret;
++
++ return count;
++}
++
++static ssize_t ds100df410_show_cdr_rst(struct device *dev,
++ struct device_attribute *attr,
++ char *buf)
++{
++ return ds100df410_read(dev, DS100DF410_CDR_RST_REG, buf);
++}
++
++static ssize_t ds100df410_store_cdr_rst(struct device *dev,
++ struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ return ds100df410_write(dev, DS100DF410_CDR_RST_REG, buf, count);
++}
++
++static ssize_t ds100df410_show_tap_dem(struct device *dev,
++ struct device_attribute *attr,
++ char *buf)
++{
++ return ds100df410_read(dev, DS100DF410_TAP_DEM_REG, buf);
++}
++
++static ssize_t ds100df410_store_tap_dem(struct device *dev,
++ struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ return ds100df410_write(dev, DS100DF410_TAP_DEM_REG, buf, count);
++}
++
++static ssize_t ds100df410_show_pfd_prbs_dfe(struct device *dev,
++ struct device_attribute *attr,
++ char *buf)
++{
++ return ds100df410_read(dev, DS100DF410_PFD_PRBS_DFE_REG, buf);
++}
++
++static ssize_t ds100df410_store_pfd_prbs_dfe(struct device *dev,
++ struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ return ds100df410_write(dev, DS100DF410_PFD_PRBS_DFE_REG, buf, count);
++}
++
++static ssize_t ds100df410_show_drv_sel_vod(struct device *dev,
++ struct device_attribute *attr,
++ char *buf)
++{
++ return ds100df410_read(dev, DS100DF410_DRV_SEL_VOD_REG, buf);
++}
++
++static ssize_t ds100df410_store_drv_sel_vod(struct device *dev,
++ struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ return ds100df410_write(dev, DS100DF410_DRV_SEL_VOD_REG, buf, count);
++}
++
++static ssize_t ds100df410_show_adapt_eq_sm(struct device *dev,
++ struct device_attribute *attr,
++ char *buf)
++{
++ return ds100df410_read(dev, DS100DF410_ADAPT_EQ_SM_REG, buf);
++}
++
++static ssize_t ds100df410_store_adapt_eq_sm(struct device *dev,
++ struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ return ds100df410_write(dev, DS100DF410_ADAPT_EQ_SM_REG, buf, count);
++}
++
++static ssize_t ds100df410_show_veo_clk_cdr_cap(struct device *dev,
++ struct device_attribute *attr,
++ char *buf)
++{
++ return ds100df410_read(dev, DS100DF410_VEO_CLK_CDR_CAP_REG, buf);
++}
++
++static ssize_t ds100df410_store_veo_clk_cdr_cap(struct device *dev,
++ struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ return ds100df410_write(dev, DS100DF410_VEO_CLK_CDR_CAP_REG, buf, count);
++}
++
++static ssize_t ds100df410_show_channels(struct device *dev,
++ struct device_attribute *attr,
++ char *buf)
++{
++ return ds100df410_read(dev, DS100DF410_CHANNELS_REG, buf);
++}
++
++static ssize_t ds100df410_store_channels(struct device *dev,
++ struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ return ds100df410_write(dev, DS100DF410_CHANNELS_REG, buf, count);
++}
++
++static DEVICE_ATTR(cdr_rst, S_IWUSR | S_IRUGO,
++ ds100df410_show_cdr_rst, ds100df410_store_cdr_rst);
++static DEVICE_ATTR(tap_dem, S_IWUSR | S_IRUGO,
++ ds100df410_show_tap_dem, ds100df410_store_tap_dem);
++static DEVICE_ATTR(pfd_prbs_dfe, S_IWUSR | S_IRUGO,
++ ds100df410_show_pfd_prbs_dfe, ds100df410_store_pfd_prbs_dfe);
++static DEVICE_ATTR(drv_sel_vod, S_IWUSR | S_IRUGO,
++ ds100df410_show_drv_sel_vod, ds100df410_store_drv_sel_vod);
++static DEVICE_ATTR(adapt_eq_sm, S_IWUSR | S_IRUGO,
++ ds100df410_show_adapt_eq_sm, ds100df410_store_adapt_eq_sm);
++static DEVICE_ATTR(veo_clk_cdr_cap, S_IWUSR | S_IRUGO,
++ ds100df410_show_veo_clk_cdr_cap,
++ ds100df410_store_veo_clk_cdr_cap);
++static DEVICE_ATTR(channels, S_IWUSR | S_IRUGO,
++ ds100df410_show_channels, ds100df410_store_channels);
++
++static struct attribute *ds100df410_attributes[] = {
++ &dev_attr_cdr_rst.attr,
++ &dev_attr_tap_dem.attr,
++ &dev_attr_pfd_prbs_dfe.attr,
++ &dev_attr_drv_sel_vod.attr,
++ &dev_attr_adapt_eq_sm.attr,
++ &dev_attr_veo_clk_cdr_cap.attr,
++ &dev_attr_channels.attr,
++ NULL
++};
++
++static const struct attribute_group ds100df410_attr_group = {
++ .attrs = ds100df410_attributes,
++};
++
++static int __devinit ds100df410_probe(struct i2c_client *client,
++ const struct i2c_device_id *id)
++{
++ struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
++ struct ds100df410_data *data;
++ int err = 0;
++
++ if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE)) {
++ return -EIO;
++ }
++
++ data = kzalloc(sizeof(struct ds100df410_data), GFP_KERNEL);
++ if (!data)
++ return -ENOMEM;
++ data->client = client;
++ mutex_init(&data->lock);
++
++ /* register sysfs hooks */
++ err = sysfs_create_group(&client->dev.kobj, &ds100df410_attr_group);
++ if (err)
++ goto exit_kfree;
++
++
++#ifdef CONFIG_RETIMER_CLASS
++ data->retimer_dev = retimer_device_register(&client->dev);
++ if (IS_ERR(data->retimer_dev)) {
++ dev_err(&client->dev, "error registering retimer device.\n");
++ err = PTR_ERR(data->retimer_dev);
++ goto exit_kfree;
++ }
++#endif
++
++ i2c_set_clientdata(client, data);
++ return 0;
++exit_kfree:
++ kfree(data);
++ return err;
++}
++
++static int __devexit ds100df410_remove(struct i2c_client *client)
++{
++ struct ds100df410_data *data;
++
++ data = i2c_get_clientdata(client);
++ sysfs_remove_group(&client->dev.kobj, &ds100df410_attr_group);
++
++#ifdef CONFIG_RETIMER_CLASS
++ retimer_device_unregister(data->retimer_dev);
++#endif
++
++ kfree(data);
++ return 0;
++}
++
++static const struct i2c_device_id ds100df410_id[] = {
++ { "ds100df410", 0 },
++ {}
++};
++MODULE_DEVICE_TABLE(i2c, ds100df410_id);
++
++static struct i2c_driver ds100df410_driver = {
++ .driver = {
++ .name = DS100DF410_DRV_NAME,
++ },
++ .probe = ds100df410_probe,
++ .remove = __devexit_p(ds100df410_remove),
++ .id_table = ds100df410_id,
++};
++
++module_i2c_driver(ds100df410_driver);
++MODULE_AUTHOR("Puneet Shenoy ");
++MODULE_DESCRIPTION("I2C client for DS100DF410 10GE Quad Core Retimer");
++MODULE_LICENSE("GPL v2");
++MODULE_VERSION(DRIVER_VERSION);
+diff --git a/drivers/misc/retimer_class.c b/drivers/misc/retimer_class.c
+new file mode 100644
+index 0000000..176df29
+--- /dev/null
++++ b/drivers/misc/retimer_class.c
+@@ -0,0 +1,159 @@
++/*
++ * retimer_class.c
++ *
++ * This file defines the sysfs class "retimer", for use by RETIMER
++ * drivers.
++ *
++ * Copyright (C) 2014 Cumulus Networks, Inc.
++ * Author: Puneet Shenoy
++ *
++ * Ideas and structure graciously borrowed from the eeprom_class class:
++ * Copyright (C) 2013 Curt Brune
++ *
++ * 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; version 2 of the License.
++ *
++ * 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, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ */
++
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++
++/* Root retimer "class" object (corresponds to '//class/retimer_dev/') */
++static struct class *retimer_class;
++
++#define RETIMER_CLASS_NAME "retimer_dev"
++#define RETIMER_ID_PREFIX "retimer"
++#define RETIMER_ID_FORMAT RETIMER_ID_PREFIX "%d"
++
++static DEFINE_IDA(retimer_ida);
++
++/**
++ * retimer_device_register - register w/ retimer class
++ * @dev: the device to register
++ *
++ * retimer_device_unregister() must be called when the device is no
++ * longer needed.
++ *
++ * Creates a new retimer class device that is a child of @dev. Also
++ * creates a symlink in //class/retimer_dev/retimer[N] pointing
++ * to the new device.
++ *
++ * Returns the pointer to the new device.
++ */
++struct device *retimer_device_register(struct device *dev)
++{
++ struct device *retimer_dev;
++ int id;
++
++ id = ida_simple_get(&retimer_ida, 0, 0, GFP_KERNEL);
++ if (id < 0)
++ return ERR_PTR(id);
++
++ retimer_dev = device_create(retimer_class, dev, MKDEV(0, 0), NULL,
++ RETIMER_ID_FORMAT, id);
++
++ if (IS_ERR(retimer_dev))
++ ida_simple_remove(&retimer_ida, id);
++
++ return retimer_dev;
++}
++
++/**
++ * retimer_device_unregister - removes the previously registered class device
++ *
++ * @dev: the class device to destroy
++ */
++void retimer_device_unregister(struct device *dev)
++{
++ int id;
++
++ if (likely(sscanf(dev_name(dev), RETIMER_ID_FORMAT, &id) == 1)) {
++ device_unregister(dev);
++ ida_simple_remove(&retimer_ida, id);
++ } else
++ dev_dbg(dev->parent,
++ "retimer_device_unregister() failed: bad class ID!\n");
++}
++
++/**
++ * Each member of the retimer class exports a sysfs file called
++ * "label", containing the label property from the corresponding
++ * device tree node.
++ *
++ * Userspace can use the label to identify what the RETIMER is for.
++ */
++static ssize_t label_show(struct device *dev,
++ struct device_attribute *attr,
++ char *buf)
++{
++ const char* cp = NULL;
++ int len = 0;
++
++ /*
++ * The class device is a child of the original device,
++ * i.e. dev->parent points to the original device.
++ */
++ if (dev->parent && dev->parent->of_node)
++ cp = of_get_property(dev->parent->of_node, "label", &len);
++
++ if ((cp == NULL) || (len == 0)) {
++ cp = "unknown";
++ len = strlen(cp) + 1;
++ }
++
++ strncpy(buf, cp, len - 1);
++ buf[len - 1] = '\n';
++ buf[len] = '\0';
++
++ return len;
++}
++
++struct device_attribute retimer_class_dev_attrs[] = {
++ __ATTR_RO(label),
++ __ATTR_NULL,
++};
++
++static int __init retimer_init(void)
++{
++ retimer_class = class_create(THIS_MODULE, RETIMER_CLASS_NAME);
++ if (IS_ERR(retimer_class)) {
++ pr_err("couldn't create sysfs class\n");
++ return PTR_ERR(retimer_class);
++ }
++
++ retimer_class->dev_attrs = retimer_class_dev_attrs;
++
++ return 0;
++}
++
++static void __exit retimer_exit(void)
++{
++ class_destroy(retimer_class);
++}
++
++subsys_initcall(retimer_init);
++module_exit(retimer_exit);
++
++EXPORT_SYMBOL_GPL(retimer_device_register);
++EXPORT_SYMBOL_GPL(retimer_device_unregister);
++
++MODULE_AUTHOR("Puneet Shenoy ");
++MODULE_DESCRIPTION("retimer sysfs/class support");
++MODULE_LICENSE("GPL v2");
+diff --git a/include/linux/retimer_class.h b/include/linux/retimer_class.h
+new file mode 100644
+index 0000000..6f37318
+--- /dev/null
++++ b/include/linux/retimer_class.h
+@@ -0,0 +1,35 @@
++/*
++ * retimer_class.c
++ *
++ * This file exports interface functions for the sysfs class "retimer",
++ * for use by RETIMER drivers.
++ *
++ * Copyright (C) 2014 Cumulus Networks, Inc.
++ * Author: Puneet Shenoy
++ *
++ * 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; version 2 of the License.
++ *
++ * 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, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ */
++
++#ifndef RETIMER_CLASS_H__
++#define RETIMER_CLASS_H__
++
++#include
++#include
++
++struct device *retimer_device_register(struct device *dev);
++
++void retimer_device_unregister(struct device *dev);
++
++#endif /* RETIMER_CLASS_H__ */
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-early-dma-allocator.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-early-dma-allocator.patch
new file mode 100644
index 00000000..5e1d0484
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-early-dma-allocator.patch
@@ -0,0 +1,357 @@
+early dma allocator patch
+
+Add a tiny driver called "Early DMA Allocator (EDA)" that allocates
+memory using the early boot alloc_bootmem() interface. The platform
+dependent kernel code (dni_7448.c for example) would call this
+driver's init at boot time.
+
+The size and alignment of the DMA memory region are specified in any
+one of a kernel command line option, device tree node (compatible with
+"early-dma-alloc"), or a Kbuild configurable compiled in default.
+
+The driver also publishes an interface for other kernel drivers
+to call that returns the physical offset and size of the allocated
+region.
+
+diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
+index b506f41..cfaf677 100644
+--- a/arch/x86/kernel/setup.c
++++ b/arch/x86/kernel/setup.c
+@@ -50,6 +50,9 @@
+ #include
+ #include
+ #include
++#ifdef CONFIG_EARLY_DMA_ALLOC
++#include
++#endif
+
+ #include
+ #include
+@@ -1144,6 +1147,9 @@ void __init setup_arch(char **cmdline_p)
+ mcheck_init();
+
+ arch_init_ideal_nops();
++#ifdef CONFIG_EARLY_DMA_ALLOC
++ eda_init();
++#endif
+ }
+
+ #ifdef CONFIG_X86_32
+diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
+index 5664696..846aab1 100644
+--- a/drivers/misc/Kconfig
++++ b/drivers/misc/Kconfig
+@@ -500,6 +500,33 @@ config USB_SWITCH_FSA9480
+ stereo and mono audio, video, microphone and UART data to use
+ a common connector port.
+
++config EARLY_DMA_ALLOC
++ bool "Early DMA Memory Allocator"
++ depends on HAS_DMA
++
++ ---help---
++ This driver locks down a region of DMA accessible memory
++ early in the boot process. This memory can be used by other
++ drivers that might rmmod/insmod, insuring the memory region
++ does not become fragmented.
++
++config EDA_DEF_SIZE
++ hex "EDA Default Region Size"
++ depends on EARLY_DMA_ALLOC
++ default 0x04000000
++ help
++ Default size of the reserved memory pool, if not altered by the
++ open firmware interface or kernel boot parameter. This memory
++ will not be accessable to the rest of the system. Default is
++ 64MB.
++
++config EDA_DEF_ALIGN
++ hex "EDA Default Alignment"
++ depends on EARLY_DMA_ALLOC
++ default 0x00100000
++ help
++ Default alignment of the memory region. Default is 1MB.
++
+ source "drivers/misc/c2port/Kconfig"
+ source "drivers/misc/eeprom/Kconfig"
+ source "drivers/misc/cb710/Kconfig"
+diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
+index b26495a..cf09aa8 100644
+--- a/drivers/misc/Makefile
++++ b/drivers/misc/Makefile
+@@ -48,3 +48,4 @@ obj-y += lis3lv02d/
+ obj-y += carma/
+ obj-$(CONFIG_USB_SWITCH_FSA9480) += fsa9480.o
+ obj-$(CONFIG_ALTERA_STAPL) +=altera-stapl/
++obj-$(CONFIG_EARLY_DMA_ALLOC) += early_dma_alloc.o
+diff --git a/drivers/misc/early_dma_alloc.c b/drivers/misc/early_dma_alloc.c
+new file mode 100644
+index 0000000..ab3ac32
+--- /dev/null
++++ b/drivers/misc/early_dma_alloc.c
+@@ -0,0 +1,223 @@
++/*
++ * Early DMA Memory Allocator
++ *
++ * Copyright © 2013,2014 Cumulus Networks, Inc.
++ *
++ * Author: Curt Brune
++ * Modified: Jonathan Toppins
++ *
++ * 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.
++ *
++ * 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, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
++ *
++ */
++
++/*
++ * This driver allocates a region of DMA accessible memory, making it
++ * available to one other device driver.
++ *
++ * The client device driver may be unloaded and reloaded over time.
++ * This driver keeps the DMA region from becoming fragmented across
++ * module reloads.
++ *
++ * Memory Region Restrictions
++ * --------------------------
++ * The memory region allocated by EDA MUST exist below a 4GB limit. This
++ * is because EDA's primary (only at time of writing) user is the
++ * Broadcom BDE driver wich assumes a 32-bit physical address space and
++ * assumes paddr is no more than 32-bits wide. Furthermore, before porting
++ * the BDE driver to use EDA the BDE driver specifically checked if the
++ * memory region provided by highmem was less than 4GB. We assume Broadcom
++ * knew what they were doing and there is a specific reason why this 4GB
++ * limit is needed, so we enforce this limit by checking the physical address
++ * after allocation.
++ *
++ * Memory Region Size and Alignment
++ * --------------------------------
++ * This driver allows three ways for the user to define the DMA memory
++ * that will be created, listed in order of preference.
++ * 1. The user may specify on the kernel command line in the boot loader
++ * the "eda_mem" option, this option has the format "size@alignment",
++ * example: eda_mem=0x04000000@0x00100000
++ * 2. This driver looks for a device tree node compatible with
++ * "early-dma-alloc". The "region_size" property of the node contains
++ * the size, in bytes, of the desired DMA memory region. The
++ * "alignment" property contains the desired memory alignment of the
++ * region.
++ * 3. Finally if neither of the above are provided the Kbuild changable,
++ * compiled in default size and alignment will be used.
++ *
++ */
++
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++
++#if (!defined CONFIG_EDA_DEF_SIZE) || \
++ (!defined CONFIG_EDA_DEF_ALIGN)
++#error incorrect kernel config - fix it
++#endif
++
++// #define DEBUG
++#if (defined DEBUG)
++#define eda_debug(fmt, ... ) \
++ printk(KERN_ERR "eda-debug:%s(): " fmt "\n", __func__ , \
++ ##__VA_ARGS__)
++#else
++#define eda_debug(fmt, ... )
++#endif
++
++#define eda_info(fmt, ... ) \
++ printk(KERN_INFO "eda: " fmt "\n", ##__VA_ARGS__)
++
++static uint32_t dma_size;
++static void *dma_vaddr;
++static u32 dma_align __initdata;
++static bool eda_cmdline __initdata;
++
++static int __init setup_eda_mem(char *str)
++{
++ char *endp;
++
++ dma_size = memparse(str, &endp) & PAGE_MASK;
++ if (*endp == '@')
++ dma_align = memparse(endp + 1, NULL) & PAGE_MASK;
++ eda_cmdline = true;
++ return 0;
++}
++early_param("eda_mem", setup_eda_mem);
++
++static int __init of_eda_init(uint32_t *size, u32 *align)
++#ifdef CONFIG_OF_FLATTREE
++{
++ int rc = -ENODEV;
++ struct device_node *np = NULL;
++ const u32 *region_sz_p = NULL;
++ const u32 *align_p = NULL;
++ u32 prop_sz = 0;
++
++ eda_debug("entry");
++
++ /* is a programming error make it really painful so it gets fixed */
++ BUG_ON(NULL == size || NULL == align);
++
++ np = of_find_compatible_node(NULL, NULL, "early-dma-alloc");
++ if (!np) {
++ printk(KERN_WARNING "WARN: Can not find `early-dma-alloc'"
++ " device tree node.\n");
++ goto cleanup;
++ }
++
++ region_sz_p = of_get_property(np, "region_size", &prop_sz);
++ if (!region_sz_p || (prop_sz != sizeof(*region_sz_p))) {
++ printk(KERN_ERR "ERROR: Can not find `region_size' property"
++ " in early-dma-alloc device tree node.\n");
++ goto cleanup;
++ }
++ *size = *region_sz_p;
++
++ align_p = of_get_property(np, "alignment", &prop_sz);
++ if (!align_p || (prop_sz != sizeof(*align_p))) {
++ printk(KERN_ERR "ERROR: Can not find `alignment' property in"
++ "early-dma-alloc device tree node.\n");
++ goto cleanup;
++ }
++ *align = *align_p;
++ rc = 0;
++
++ eda_debug("cleanup");
++
++cleanup:
++ of_node_put(np);
++ return rc;
++
++}
++#else
++{
++ return -ENODEV;
++}
++#endif
++
++int eda_dma_info_get(void **vaddr, uint32_t *paddr, uint32_t *size)
++{
++ eda_debug("entry");
++
++ if (!dma_vaddr)
++ return -ENOMEM;
++
++ if (!vaddr || !paddr || !size)
++ return -EINVAL;
++
++ *vaddr = dma_vaddr;
++ *paddr = (uint32_t) virt_to_phys(dma_vaddr);
++ *size = dma_size;
++
++ eda_debug("returning -- dma_vaddr: 0x%pK, dma_paddr: 0x%08x,"
++ " size: 0x%08x", *vaddr, *paddr, *size);
++
++ return 0;
++}
++EXPORT_SYMBOL(eda_dma_info_get);
++
++int __init eda_init(void)
++{
++ int rc = 0;
++
++ if (eda_cmdline) {
++ if (!dma_align)
++ dma_align = CONFIG_EDA_DEF_ALIGN;
++ if (!dma_size)
++ dma_size = CONFIG_EDA_DEF_SIZE;
++ eda_debug("size & alignment came from: kernel cmdline");
++ } else if (!of_eda_init(&dma_size, &dma_align)) {
++ eda_debug("size & alignment came from: open firmware entry");
++ } else {
++ dma_align = CONFIG_EDA_DEF_ALIGN;
++ dma_size = CONFIG_EDA_DEF_SIZE;
++ eda_debug("size & alignment came from: compiled in defaults");
++ }
++
++ dma_vaddr = __alloc_bootmem_low(dma_size, dma_align, 0);
++ /*
++ * enforce EDA's requirement to allocate the memory region below a
++ * 32-bit limit.
++ */
++ if (virt_to_phys(dma_vaddr) > 0xFFFFFFFFULL) {
++ rc = -ENOMEM;
++ printk(KERN_ERR "ERROR: DMA memory beyond 32-bit address"
++ " space not supported.\n");
++ goto cleanup;
++ }
++
++ eda_info("dma_vaddr: 0x%pK, dma_paddr: 0x%016llx, size: 0x%08x,"
++ " alignment: 0x%08x",
++ dma_vaddr, (unsigned long long) virt_to_phys(dma_vaddr),
++ dma_size, dma_align);
++cleanup:
++ if (rc && dma_vaddr) {
++ free_bootmem(dma_vaddr, dma_size);
++ }
++ if (rc) {
++ dma_vaddr = NULL;
++ dma_size = 0;
++ }
++ return rc;
++}
++EXPORT_SYMBOL(eda_init);
+diff --git a/include/linux/early_dma_alloc.h b/include/linux/early_dma_alloc.h
+new file mode 100644
+index 0000000..a6d87ec
+--- /dev/null
++++ b/include/linux/early_dma_alloc.h
+@@ -0,0 +1,36 @@
++/*
++ * Early DMA Memory Allocator
++ *
++ * Copyright © 2013 Cumulus Networks, Inc.
++ *
++ * Author: Curt Brune
++ *
++ * 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.
++ *
++ * 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, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
++ *
++ */
++
++#ifndef EARLY_DMA_ALLOC_H__
++#define EARLY_DMA_ALLOC_H__
++
++#ifdef __KERNEL__
++
++#include
++
++extern int eda_init(void);
++extern int eda_dma_info_get(void** vaddr, uint32_t* paddr, uint32_t* size);
++
++#endif /* __KERNEL__ */
++
++#endif /* EARLY_DMA_ALLOC_H__ */
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-eeprom-class.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-eeprom-class.patch
new file mode 100644
index 00000000..629493a8
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-eeprom-class.patch
@@ -0,0 +1,345 @@
+Create eeprom_dev hardware class for EEPROM devices
+
+Create a new hardware class under /sys/class/eeprom_dev
+
+EEPROM drivers can register their devices with the eeprom_dev class
+during instantiation.
+
+The registered devices show up as:
+
+ /sys/class/eeprom_dev/eeprom0
+ /sys/class/eeprom_dev/eeprom1
+ ...
+ /sys/class/eeprom_dev/eeprom[N]
+
+Each member of the eeprom class exports a sysfs file called "label",
+containing the label property from the corresponding device tree node.
+
+Example:
+
+ /sys/class/eeprom_dev/eeprom0/label
+
+If the device tree node property "label" does not exist the value
+"unknown" is used.
+
+Userspace can use the label to identify what the EEPROM is for.
+
+The real device is available from the class device via the "device"
+link:
+
+ /sys/class/eeprom_dev/eeprom0/device
+
+diff --git a/drivers/misc/eeprom/Kconfig b/drivers/misc/eeprom/Kconfig
+index 701edf6..08c7a23 100644
+--- a/drivers/misc/eeprom/Kconfig
++++ b/drivers/misc/eeprom/Kconfig
+@@ -1,5 +1,16 @@
+ menu "EEPROM support"
+
++config EEPROM_CLASS
++ tristate "EEPROM Hardware Class support"
++ depends on SYSFS
++ default y
++ help
++ Creates a hardware class in sysfs called "eeprom_dev",
++ providing a common place to register EEPROM devices.
++
++ This support can also be built as a module. If so, the module
++ will be called eeprom_class.
++
+ config EEPROM_AT24
+ tristate "I2C EEPROMs from most vendors"
+ depends on I2C && SYSFS
+diff --git a/drivers/misc/eeprom/Makefile b/drivers/misc/eeprom/Makefile
+index fc1e81d..eabb373 100644
+--- a/drivers/misc/eeprom/Makefile
++++ b/drivers/misc/eeprom/Makefile
+@@ -1,3 +1,4 @@
++obj-$(CONFIG_EEPROM_CLASS) += eeprom_class.o
+ obj-$(CONFIG_EEPROM_AT24) += at24.o
+ obj-$(CONFIG_EEPROM_AT25) += at25.o
+ obj-$(CONFIG_EEPROM_LEGACY) += eeprom.o
+diff --git a/drivers/misc/eeprom/eeprom_class.c b/drivers/misc/eeprom/eeprom_class.c
+new file mode 100644
+index 0000000..aecb778
+--- /dev/null
++++ b/drivers/misc/eeprom/eeprom_class.c
+@@ -0,0 +1,193 @@
++/*
++ * eeprom_class.c
++ *
++ * This file defines the sysfs class "eeprom", for use by EEPROM
++ * drivers.
++ *
++ * Copyright (C) 2013 Cumulus Networks, Inc.
++ * Author: Curt Brune
++ *
++ * Ideas and structure graciously borrowed from the hwmon class:
++ * Copyright (C) 2005 Mark M. Hoffman
++ *
++ * 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; version 2 of the License.
++ *
++ * 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, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ */
++
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++
++/* Root eeprom "class" object (corresponds to '//class/eeprom_dev/') */
++static struct class *eeprom_class;
++
++#define EEPROM_CLASS_NAME "eeprom_dev"
++#define EEPROM_ID_PREFIX "eeprom"
++#define EEPROM_ID_FORMAT EEPROM_ID_PREFIX "%d"
++
++static DEFINE_IDA(eeprom_ida);
++
++/**
++ * eeprom_device_register - register w/ eeprom class
++ * @dev: the device to register
++ * @data: platform data to use for the device
++ *
++ * eeprom_device_unregister() must be called when the device is no
++ * longer needed.
++ *
++ * Creates a new eeprom class device that is a child of @dev. Also
++ * creates a symlink in //class/eeprom_dev/eeprom[N] pointing
++ * to the new device.
++ *
++ * Returns the pointer to the new device.
++ */
++struct eeprom_device *eeprom_device_register(struct device *dev, struct eeprom_platform_data *data)
++{
++ struct eeprom_device *eeprom_dev;
++ int id;
++ int ret;
++
++ id = ida_simple_get(&eeprom_ida, 0, 0, GFP_KERNEL);
++ if (id < 0)
++ return ERR_PTR(id);
++
++ eeprom_dev = kzalloc(sizeof(struct eeprom_device), GFP_KERNEL);
++ if (!eeprom_dev) {
++ ret = -ENOMEM;
++ goto err_ida;
++ }
++
++ eeprom_dev->dev = device_create(eeprom_class, dev, MKDEV(0, 0),
++ eeprom_dev, EEPROM_ID_FORMAT, id);
++ if (IS_ERR(eeprom_dev->dev)) {
++ ret = PTR_ERR(eeprom_dev->dev);
++ goto err_eeprom_dev_free;
++ }
++
++ eeprom_dev->data = data;
++
++ return eeprom_dev;
++
++err_eeprom_dev_free:
++ kfree(eeprom_dev);
++
++err_ida:
++ ida_simple_remove(&eeprom_ida, id);
++ return ERR_PTR(ret);
++}
++
++/**
++ * eeprom_device_unregister - removes the previously registered class device
++ *
++ * @eeprom: the eeprom class device to destroy
++ */
++void eeprom_device_unregister(struct eeprom_device *eeprom_dev)
++{
++ int id;
++
++ if (likely(sscanf(dev_name(eeprom_dev->dev), EEPROM_ID_FORMAT, &id) == 1)) {
++ device_unregister(eeprom_dev->dev);
++ kfree(eeprom_dev);
++ ida_simple_remove(&eeprom_ida, id);
++ } else
++ dev_dbg(eeprom_dev->dev->parent,
++ "eeprom_device_unregister() failed: bad class ID!\n");
++}
++
++/**
++ * Each member of the eeprom class exports a sysfs file called
++ * "label", containing the label property from the corresponding
++ * device tree node.
++ *
++ * Userspace can use the label to identify what the EEPROM is for.
++ */
++static ssize_t label_show(struct device *dev,
++ struct device_attribute *attr,
++ char *buf)
++{
++ struct eeprom_device *eeprom_dev = (struct eeprom_device *)dev_get_drvdata(dev);
++ const char* cp = NULL;
++ int len = 0;
++
++ /* Check if the eeprom device has an explicit label:
++ * - explicitly passed in to eeprom_device_register()
++ * - explicitly passed via the device tree node
++ *
++ * Otherwise use "unknown".
++ */
++ if (eeprom_dev->data && eeprom_dev->data->label) {
++ cp = eeprom_dev->data->label;
++ len = strlen(cp) + 1;
++ } else {
++ /*
++ * Check for a device tree property.
++ *
++ * The class device is a child of the original device,
++ * i.e. dev->parent points to the original device.
++ */
++ if (dev->parent && dev->parent->of_node)
++ cp = of_get_property(dev->parent->of_node, "label", &len);
++ }
++
++ if ((cp == NULL) || (len == 0)) {
++ cp = "unknown";
++ len = strlen(cp) + 1;
++ }
++
++ strncpy(buf, cp, len - 1);
++ buf[len - 1] = '\n';
++ buf[len] = '\0';
++
++ return len;
++}
++
++struct device_attribute eeprom_class_dev_attrs[] = {
++ __ATTR_RO(label),
++ __ATTR_NULL,
++};
++
++static int __init eeprom_init(void)
++{
++ eeprom_class = class_create(THIS_MODULE, EEPROM_CLASS_NAME);
++ if (IS_ERR(eeprom_class)) {
++ pr_err("couldn't create sysfs class\n");
++ return PTR_ERR(eeprom_class);
++ }
++
++ eeprom_class->dev_attrs = eeprom_class_dev_attrs;
++
++ return 0;
++}
++
++static void __exit eeprom_exit(void)
++{
++ class_destroy(eeprom_class);
++}
++
++subsys_initcall(eeprom_init);
++module_exit(eeprom_exit);
++
++EXPORT_SYMBOL_GPL(eeprom_device_register);
++EXPORT_SYMBOL_GPL(eeprom_device_unregister);
++
++MODULE_AUTHOR("Curt Brune ");
++MODULE_DESCRIPTION("eeprom sysfs/class support");
++MODULE_LICENSE("GPL v2");
+diff --git a/include/linux/eeprom_class.h b/include/linux/eeprom_class.h
+new file mode 100644
+index 0000000..d21d350
+--- /dev/null
++++ b/include/linux/eeprom_class.h
+@@ -0,0 +1,79 @@
++/*
++ * eeprom_class.h
++ *
++ * This file exports interface functions for the sysfs class "eeprom",
++ * for use by EEPROM drivers.
++ *
++ * Copyright (C) 2013 Cumulus Networks, Inc.
++ * Author: Curt Brune
++ *
++ * 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; version 2 of the License.
++ *
++ * 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, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ */
++
++#ifndef EEPROM_CLASS_H__
++#define EEPROM_CLASS_H__
++
++#include
++#include
++
++/*
++ * Extra platform data used by the eeprom class
++ *
++ * An eeprom device can include this structure in its own platform
++ * data structure.
++ *
++ * A specific platform can set the values in this structure to values
++ * suitable for that platform.
++ *
++ */
++struct eeprom_platform_data {
++ char *label; /* device label to use with the eeprom class */
++};
++
++/*
++ * EEPROM device structure
++ *
++ * This structure is used by the eeprom_class driver to manage the
++ * state of the class device.
++ *
++ */
++struct eeprom_device {
++ struct device *dev;
++ struct eeprom_platform_data *data;
++};
++
++#if defined(CONFIG_EEPROM_CLASS) || defined (CONFIG_EEPROM_CLASS_MODULE)
++
++extern struct eeprom_device *
++eeprom_device_register(struct device *dev, struct eeprom_platform_data *data);
++extern void
++eeprom_device_unregister(struct eeprom_device *eeprom_dev);
++
++#else
++
++static inline struct eeprom_device *
++eeprom_device_register(struct device *dev, char *label)
++{
++ return NULL;
++}
++
++static inline void
++eeprom_device_unregister(struct eeprom_device *eeprom_dev)
++{
++}
++
++#endif
++
++#endif /* EEPROM_CLASS_H__ */
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-esdhc-p2020-broken-timeout.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-esdhc-p2020-broken-timeout.patch
new file mode 100644
index 00000000..8d8591ff
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-esdhc-p2020-broken-timeout.patch
@@ -0,0 +1,16 @@
+The P2020 platforms have a broken timeout for the ESDHC device.
+This patch forces the driver to use the maximum value.
+
+diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c
+index 01e5f62..92c86bf 100644
+--- a/drivers/mmc/host/sdhci-of-esdhc.c
++++ b/drivers/mmc/host/sdhci-of-esdhc.c
+@@ -98,7 +98,7 @@ static struct sdhci_ops sdhci_esdhc_ops = {
+ static struct sdhci_pltfm_data sdhci_esdhc_pdata = {
+ /* card detection could be handled via GPIO */
+ .quirks = ESDHC_DEFAULT_QUIRKS | SDHCI_QUIRK_BROKEN_CARD_DETECTION
+- | SDHCI_QUIRK_NO_CARD_NO_RESET,
++ | SDHCI_QUIRK_NO_CARD_NO_RESET | SDHCI_QUIRK_BROKEN_TIMEOUT_VAL,
+ .ops = &sdhci_esdhc_ops,
+ };
+
diff --git a/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-fsl-dpaa_eth.patch b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-fsl-dpaa_eth.patch
new file mode 100644
index 00000000..db04de90
--- /dev/null
+++ b/packages/base/any/kernels/3.2.65-1+deb7u2/patches/driver-fsl-dpaa_eth.patch
@@ -0,0 +1,154125 @@
+Freescale DPAA Ethernet Support
+
+diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
+index 491fa33..ca5290a 100644
+--- a/arch/powerpc/Kconfig
++++ b/arch/powerpc/Kconfig
+@@ -693,6 +693,42 @@ config FSL_GTM
+ help
+ Freescale General-purpose Timers support
+
++config HAS_FSL_PAMU
++ bool
++ default n
++
++config FSL_PAMU
++ bool "PAMU/IOMMU support"
++ depends on HAS_FSL_PAMU
++ help
++ Freescale PAMU/IOMMU support
++
++config FSL_PAMU_ERRATUM_A_004510
++ bool "Enable PAMU work-around for erratum A-004510"
++ depends on FSL_PAMU
++ # For now, enable this by default, so that we don't have to update
++ # defconfigs. All current PAMU-enabled SOCs have the erratum.
++ default y
++ help
++ Select this option to enable a work-around for erratum A-004510
++ in the Freescale PAMU device driver. Erratum A-004510 says that
++ under certain load conditions, modified cache lines can be discarded,
++ causing data corruption. This option enables the PAMU portion of
++ the work-around.
++
++config FSL_FMAN_CPC_STASH
++ bool "Enable stashing of FMAN write transactions for ethernet ports"
++ depends on FSL_PAMU
++ default n
++ help
++ Select this option to enable stashing of incoming ethernet frames
++ from FMAN ports into platform cache.
++
++config HAS_FSL_QBMAN
++ bool "Datapath Acceleration Queue and Buffer management"
++ help
++ Datapath Acceleration Queue and Buffer management
++
+ # Yes MCA RS/6000s exist but Linux-PPC does not currently support any
+ config MCA
+ bool
+diff --git a/arch/powerpc/boot/dts/fsl/b4420si-post.dtsi b/arch/powerpc/boot/dts/fsl/b4420si-post.dtsi
+new file mode 100644
+index 0000000..0d13641
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/b4420si-post.dtsi
+@@ -0,0 +1,292 @@
++/*
++ * B4420 Silicon/SoC Device Tree Source (post include)
++ *
++ * Copyright 2012 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.
++ */
++
++&ifc {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ compatible = "fsl,ifc", "simple-bus";
++ interrupts = <25 2 0 0>;
++};
++
++/* controller at 0x200000 */
++&pci0 {
++ compatible = "fsl,b4420-pcie", "fsl,qoriq-pcie-v2.4";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0x0 0xff>;
++ interrupts = <20 2 0 0>;
++ pcie@0 {
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <20 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0 0 1 &mpic 40 1 0 0
++ 0000 0 0 2 &mpic 1 1 0 0
++ 0000 0 0 3 &mpic 2 1 0 0
++ 0000 0 0 4 &mpic 3 1 0 0
++ >;
++ };
++};
++
++&bportals {
++/include/ "qoriq-bman2-portals.dtsi"
++};
++&qportals {
++/include/ "qoriq-qman2-portals.dtsi"
++};
++
++&dcsr {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,dcsr", "simple-bus";
++
++ dcsr-epu@0 {
++ compatible = "fsl,b4420-dcsr-epu", "fsl,dcsr-epu";
++ interrupts = <52 2 0 0
++ 84 2 0 0
++ 85 2 0 0
++ 94 2 0 0
++ 95 2 0 0>;
++ reg = <0x0 0x1000>;
++ };
++ dcsr-npc {
++ compatible = "fsl,b4420-dcsr-cnpc", "fsl,dcsr-cnpc";
++ reg = <0x1000 0x1000 0x1002000 0x10000>;
++ };
++ dcsr-nxc@2000 {
++ compatible = "fsl,dcsr-nxc";
++ reg = <0x2000 0x1000>;
++ };
++ dcsr-corenet {
++ compatible = "fsl,dcsr-corenet";
++ reg = <0x8000 0x1000 0x1A000 0x1000>;
++ };
++ dcsr-dpaa@9000 {
++ compatible = "fsl,b4420-dcsr-dpaa", "fsl,dcsr-dpaa";
++ reg = <0x9000 0x1000>;
++ };
++ dcsr-ocn@11000 {
++ compatible = "fsl,b4420-dcsr-ocn", "fsl,dcsr-ocn";
++ reg = <0x11000 0x1000>;
++ };
++ dcsr-ddr@12000 {
++ compatible = "fsl,dcsr-ddr";
++ dev-handle = <&ddr1>;
++ reg = <0x12000 0x1000>;
++ };
++ dcsr-nal@18000 {
++ compatible = "fsl,b4420-dcsr-nal", "fsl,dcsr-nal";
++ reg = <0x18000 0x1000>;
++ };
++ dcsr-rcpm@22000 {
++ compatible = "fsl,b4420-dcsr-rcpm", "fsl,dcsr-rcpm";
++ reg = <0x22000 0x1000>;
++ };
++ dcsr-snpc@30000 {
++ compatible = "fsl,b4420-dcsr-snpc", "fsl,dcsr-snpc";
++ reg = <0x30000 0x1000 0x1022000 0x10000>;
++ };
++ dcsr-snpc@31000 {
++ compatible = "fsl,b4420-dcsr-snpc", "fsl,dcsr-snpc";
++ reg = <0x31000 0x1000 0x1042000 0x10000>;
++ };
++ dcsr-cpu-sb-proxy@100000 {
++ compatible = "fsl,dcsr-e6500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu0>;
++ reg = <0x100000 0x1000 0x101000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@108000 {
++ compatible = "fsl,dcsr-e6500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu1>;
++ reg = <0x108000 0x1000 0x109000 0x1000>;
++ };
++};
++
++&soc {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ compatible = "simple-bus";
++
++ soc-sram-error {
++ compatible = "fsl,soc-sram-error";
++ interrupts = <16 2 1 2>;
++ };
++
++ corenet-law@0 {
++ compatible = "fsl,corenet-law";
++ reg = <0x0 0x1000>;
++ fsl,num-laws = <32>;
++ };
++
++ ddr1: memory-controller@8000 {
++ compatible = "fsl,qoriq-memory-controller-v4.5", "fsl,qoriq-memory-controller";
++ reg = <0x8000 0x1000>;
++ interrupts = <16 2 1 8>;
++ };
++
++ cpc: l3-cache-controller@10000 {
++ compatible = "fsl,p5020-l3-cache-controller", "fsl,p4080-l3-cache-controller", "cache";
++ reg = <0x10000 0x1000>;
++ interrupts = <16 2 1 4>;
++ };
++
++ corenet-cf@18000 {
++ compatible = "fsl,corenet-cf";
++ reg = <0x18000 0x1000>;
++ interrupts = <16 2 1 0>;
++ fsl,ccf-num-csdids = <32>;
++ fsl,ccf-num-snoopids = <32>;
++ };
++
++ iommu@20000 {
++ compatible = "fsl,pamu";
++ reg = <0x20000 0x4000>;
++ interrupts = <
++ 24 2 0 0
++ 16 2 1 1>;
++ };
++
++/include/ "qoriq-qman1.dtsi"
++
++ qman: qman@318000 {
++ interrupts = <16 2 1 28>;
++ };
++
++/include/ "qoriq-bman1.dtsi"
++
++ bman: bman@31a000 {
++ interrupts = <16 2 1 29>;
++ };
++
++/include/ "qoriq-fman3-0.dtsi"
++/include/ "qoriq-fman3-0-1g-0.dtsi"
++/include/ "qoriq-fman3-0-1g-1.dtsi"
++/include/ "qoriq-fman3-0-1g-2.dtsi"
++/include/ "qoriq-fman3-0-1g-3.dtsi"
++ fman0: fman@400000 {
++ interrupts = <
++ 96 2 0 0
++ 16 2 1 30>;
++
++ /* tx - 1g - 0 */
++ port@a8000 {
++ fsl,qman-channel-id = <0x802>;
++ };
++ /* tx - 1g - 1 */
++ 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>;
++ };
++
++ /* offline - 0 is not usable on B4420 */
++ /* offline - 1 */
++ port@82000 {
++ fsl,qman-channel-id = <0x809>;
++ };
++ /* 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>;
++ };
++ };
++
++/include/ "qoriq-mpic.dtsi"
++
++ guts: global-utilities@e0000 {
++ compatible = "fsl,b4420-device-config";
++ reg = <0xe0000 0xe00>;
++ fsl,has-rstcr;
++ fsl,liodn-bits = <12>;
++ };
++
++ rcpm: global-utilities@e2000 {
++ compatible = "fsl,b4420-rcpm", "fsl,qoriq-rcpm-2";
++ reg = <0xe2000 0x1000>;
++ };
++
++/include/ "qoriq-dma-0.dtsi"
++/include/ "qoriq-dma-1.dtsi"
++
++/include/ "qonverge-usb2-dr-0.dtsi"
++ usb0: usb@210000 {
++ compatible = "fsl-usb2-dr-v2.4", "fsl-usb2-dr";
++ };
++
++/include/ "qoriq-espi-0.dtsi"
++ spi@110000 {
++ fsl,espi-num-chipselects = <4>;
++ };
++
++/include/ "qoriq-esdhc-0.dtsi"
++ sdhc@114000 {
++ sdhci,auto-cmd12;
++ };
++/include/ "qoriq-i2c-0.dtsi"
++/include/ "qoriq-i2c-1.dtsi"
++/include/ "qoriq-duart-0.dtsi"
++/include/ "qoriq-duart-1.dtsi"
++/include/ "qoriq-sec5.3-0.dtsi"
++
++ L2: l2-cache-controller@c20000 {
++ next-level-cache = <&cpc>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi b/arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi
+new file mode 100644
+index 0000000..9493fb0
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi
+@@ -0,0 +1,83 @@
++/*
++ * B4420 Silicon/SoC Device Tree Source (pre include)
++ *
++ * Copyright 2012 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.
++ */
++
++/dts-v1/;
++/ {
++ compatible = "fsl,B4420";
++ #address-cells = <2>;
++ #size-cells = <2>;
++ interrupt-parent = <&mpic>;
++
++ aliases {
++ ccsr = &soc;
++ dcsr = &dcsr;
++
++ serial0 = &serial0;
++ serial1 = &serial1;
++ serial2 = &serial2;
++ serial3 = &serial3;
++ pci0 = &pci0;
++ dma0 = &dma0;
++ dma1 = &dma1;
++ sdhc = &sdhc;
++
++ fman0 = &fman0;
++ crypto = &crypto;
++ sec_jr0 = &sec_jr0;
++ sec_jr1 = &sec_jr1;
++ sec_jr2 = &sec_jr2;
++ sec_jr3 = &sec_jr3;
++ rtic_a = &rtic_a;
++ rtic_b = &rtic_b;
++ rtic_c = &rtic_c;
++ rtic_d = &rtic_d;
++ sec_mon = &sec_mon;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ cpu0: PowerPC,e6500@0 {
++ device_type = "cpu";
++ reg = <0 1>;
++ next-level-cache = <&L2>;
++ };
++ cpu1: PowerPC,e6500@1 {
++ device_type = "cpu";
++ reg = <2 3>;
++ next-level-cache = <&L2>;
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/b4860si-post.dtsi b/arch/powerpc/boot/dts/fsl/b4860si-post.dtsi
+new file mode 100644
+index 0000000..818f652
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/b4860si-post.dtsi
+@@ -0,0 +1,356 @@
++/*
++ * B4860 Silicon/SoC Device Tree Source (post include)
++ *
++ * Copyright 2012 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.
++ */
++
++&ifc {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ compatible = "fsl,ifc", "simple-bus";
++ interrupts = <25 2 0 0>;
++};
++
++/* controller at 0x200000 */
++&pci0 {
++ compatible = "fsl,b4860-pcie", "fsl,qoriq-pcie-v2.4";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0x0 0xff>;
++ interrupts = <20 2 0 0>;
++ pcie@0 {
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <20 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0 0 1 &mpic 40 1 0 0
++ 0000 0 0 2 &mpic 1 1 0 0
++ 0000 0 0 3 &mpic 2 1 0 0
++ 0000 0 0 4 &mpic 3 1 0 0
++ >;
++ };
++};
++
++&rio {
++ compatible = "fsl,srio";
++ interrupts = <16 2 1 11>;
++ #address-cells = <2>;
++ #size-cells = <2>;
++ ranges;
++
++ port1 {
++ #address-cells = <2>;
++ #size-cells = <2>;
++ cell-index = <1>;
++ };
++
++ port2 {
++ #address-cells = <2>;
++ #size-cells = <2>;
++ cell-index = <2>;
++ };
++};
++
++&bportals {
++/include/ "qoriq-bman2-portals.dtsi"
++};
++&qportals {
++/include/ "qoriq-qman2-portals.dtsi"
++};
++
++&dcsr {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,dcsr", "simple-bus";
++
++ dcsr-epu@0 {
++ compatible = "fsl,b4860-dcsr-epu", "fsl,dcsr-epu";
++ interrupts = <52 2 0 0
++ 84 2 0 0
++ 85 2 0 0
++ 94 2 0 0
++ 95 2 0 0>;
++ reg = <0x0 0x1000>;
++ };
++ dcsr-npc {
++ compatible = "fsl,b4860-dcsr-cnpc", "fsl,dcsr-cnpc";
++ reg = <0x1000 0x1000 0x1002000 0x10000>;
++ };
++ dcsr-nxc@2000 {
++ compatible = "fsl,dcsr-nxc";
++ reg = <0x2000 0x1000>;
++ };
++ dcsr-corenet {
++ compatible = "fsl,dcsr-corenet";
++ reg = <0x8000 0x1000 0x1A000 0x1000>;
++ };
++ dcsr-dpaa@9000 {
++ compatible = "fsl,b4860-dcsr-dpaa", "fsl,dcsr-dpaa";
++ reg = <0x9000 0x1000>;
++ };
++ dcsr-ocn@11000 {
++ compatible = "fsl,b4860-dcsr-ocn", "fsl,dcsr-ocn";
++ reg = <0x11000 0x1000>;
++ };
++ dcsr-ddr@12000 {
++ compatible = "fsl,dcsr-ddr";
++ dev-handle = <&ddr1>;
++ reg = <0x12000 0x1000>;
++ };
++ dcsr-ddr@13000 {
++ compatible = "fsl,dcsr-ddr";
++ dev-handle = <&ddr2>;
++ reg = <0x13000 0x1000>;
++ };
++ dcsr-nal@18000 {
++ compatible = "fsl,b4860-dcsr-nal", "fsl,dcsr-nal";
++ reg = <0x18000 0x1000>;
++ };
++ dcsr-rcpm@22000 {
++ compatible = "fsl,b4860-dcsr-rcpm", "fsl,dcsr-rcpm";
++ reg = <0x22000 0x1000>;
++ };
++ dcsr-snpc@30000 {
++ compatible = "fsl,b4860-dcsr-snpc", "fsl,dcsr-snpc";
++ reg = <0x30000 0x1000 0x1022000 0x10000>;
++ };
++ dcsr-snpc@31000 {
++ compatible = "fsl,b4860-dcsr-snpc", "fsl,dcsr-snpc";
++ reg = <0x31000 0x1000 0x1042000 0x10000>;
++ };
++ dcsr-cpu-sb-proxy@100000 {
++ compatible = "fsl,dcsr-e6500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu0>;
++ reg = <0x100000 0x1000 0x101000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@108000 {
++ compatible = "fsl,dcsr-e6500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu1>;
++ reg = <0x108000 0x1000 0x109000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@110000 {
++ compatible = "fsl,dcsr-e6500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu2>;
++ reg = <0x110000 0x1000 0x111000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@118000 {
++ compatible = "fsl,dcsr-e6500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu3>;
++ reg = <0x118000 0x1000 0x119000 0x1000>;
++ };
++};
++
++&soc {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ compatible = "simple-bus";
++
++ soc-sram-error {
++ compatible = "fsl,soc-sram-error";
++ interrupts = <16 2 1 2>;
++ };
++
++ corenet-law@0 {
++ compatible = "fsl,corenet-law";
++ reg = <0x0 0x1000>;
++ fsl,num-laws = <32>;
++ };
++
++ ddr1: memory-controller@8000 {
++ compatible = "fsl,qoriq-memory-controller-v4.5", "fsl,qoriq-memory-controller";
++ reg = <0x8000 0x1000>;
++ interrupts = <16 2 1 8>;
++ };
++
++ ddr2: memory-controller@9000 {
++ compatible = "fsl,qoriq-memory-controller-v4.5","fsl,qoriq-memory-controller";
++ reg = <0x9000 0x1000>;
++ interrupts = <16 2 1 9>;
++ };
++
++ cpc: l3-cache-controller@10000 {
++ compatible = "fsl,p5020-l3-cache-controller", "fsl,p4080-l3-cache-controller", "cache";
++ reg = <0x10000 0x1000
++ 0x11000 0x1000>;
++ interrupts = <16 2 1 4
++ 16 2 1 5>;
++ };
++
++ corenet-cf@18000 {
++ compatible = "fsl,corenet-cf";
++ reg = <0x18000 0x1000>;
++ interrupts = <16 2 1 0>;
++ fsl,ccf-num-csdids = <32>;
++ fsl,ccf-num-snoopids = <32>;
++ };
++
++ iommu@20000 {
++ compatible = "fsl,pamu-v1.0", "fsl,pamu";
++ reg = <0x20000 0x4000>;
++ interrupts = <
++ 24 2 0 0
++ 16 2 1 1>;
++ };
++
++/include/ "qoriq-qman1.dtsi"
++
++ qman: qman@318000 {
++ interrupts = <16 2 1 28>;
++ };
++
++/include/ "qoriq-bman1.dtsi"
++
++ bman: bman@31a000 {
++ interrupts = <16 2 1 29>;
++ };
++
++/include/ "qoriq-rman-0.dtsi"
++ rman: rman@1e0000 {
++ fsl,qman-channels-id = <0x820 0x821>;
++ };
++
++/include/ "qoriq-fman3-0.dtsi"
++/include/ "qoriq-fman3-0-1g-0.dtsi"
++/include/ "qoriq-fman3-0-1g-1.dtsi"
++/include/ "qoriq-fman3-0-1g-2.dtsi"
++/include/ "qoriq-fman3-0-1g-3.dtsi"
++/include/ "qoriq-fman3-0-1g-4.dtsi"
++/include/ "qoriq-fman3-0-1g-5.dtsi"
++/include/ "qoriq-fman3-0-10g-0.dtsi"
++/include/ "qoriq-fman3-0-10g-1.dtsi"
++ fman0: fman@400000 {
++ interrupts = <
++ 96 2 0 0
++ 16 2 1 30>;
++
++ /* tx - 1g - 0 */
++ port@a8000 {
++ fsl,qman-channel-id = <0x802>;
++ };
++ /* tx - 1g - 1 */
++ 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>;
++ };
++ /* offline - 0 is not usable on B4860 */
++ /* offline - 1 */
++ port@82000 {
++ fsl,qman-channel-id = <0x809>;
++ };
++ /* 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>;
++ };
++ };
++
++/include/ "qoriq-mpic.dtsi"
++
++ guts: global-utilities@e0000 {
++ compatible = "fsl,b4860-device-config";
++ reg = <0xe0000 0xe00>;
++ fsl,has-rstcr;
++ fsl,liodn-bits = <12>;
++ };
++
++ clockgen: global-utilities@e1000 {
++ compatible = "fsl,b4860-clockgen", "fsl,qoriq-clockgen-2";
++ reg = <0xe1000 0x1000>;
++ };
++
++ rcpm: global-utilities@e2000 {
++ compatible = "fsl,b4860-rcpm", "fsl,qoriq-rcpm-2";
++ reg = <0xe2000 0x1000>;
++ };
++
++/include/ "qoriq-dma-0.dtsi"
++/include/ "qoriq-dma-1.dtsi"
++
++/include/ "qonverge-usb2-dr-0.dtsi"
++ usb0: usb@210000 {
++ compatible = "fsl-usb2-dr-v2.4", "fsl-usb2-dr";
++ };
++
++/include/ "qoriq-espi-0.dtsi"
++ spi@110000 {
++ fsl,espi-num-chipselects = <4>;
++ };
++
++/include/ "qoriq-esdhc-0.dtsi"
++ sdhc@114000 {
++ sdhci,auto-cmd12;
++ };
++/include/ "qoriq-i2c-0.dtsi"
++/include/ "qoriq-i2c-1.dtsi"
++/include/ "qoriq-duart-0.dtsi"
++/include/ "qoriq-duart-1.dtsi"
++/include/ "qoriq-sec5.3-0.dtsi"
++
++ L2: l2-cache-controller@c20000 {
++ next-level-cache = <&cpc>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/b4860si-pre.dtsi b/arch/powerpc/boot/dts/fsl/b4860si-pre.dtsi
+new file mode 100644
+index 0000000..eb441da
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/b4860si-pre.dtsi
+@@ -0,0 +1,93 @@
++/*
++ * B4860 Silicon/SoC Device Tree Source (pre include)
++ *
++ * Copyright 2012 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.
++ */
++
++/dts-v1/;
++/ {
++ compatible = "fsl,B4860";
++ #address-cells = <2>;
++ #size-cells = <2>;
++ interrupt-parent = <&mpic>;
++
++ aliases {
++ ccsr = &soc;
++ dcsr = &dcsr;
++
++ serial0 = &serial0;
++ serial1 = &serial1;
++ serial2 = &serial2;
++ serial3 = &serial3;
++ pci0 = &pci0;
++ dma0 = &dma0;
++ dma1 = &dma1;
++ sdhc = &sdhc;
++
++ fman0 = &fman0;
++ crypto = &crypto;
++ sec_jr0 = &sec_jr0;
++ sec_jr1 = &sec_jr1;
++ sec_jr2 = &sec_jr2;
++ sec_jr3 = &sec_jr3;
++ rtic_a = &rtic_a;
++ rtic_b = &rtic_b;
++ rtic_c = &rtic_c;
++ rtic_d = &rtic_d;
++ sec_mon = &sec_mon;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ cpu0: PowerPC,e6500@0 {
++ device_type = "cpu";
++ reg = <0 1>;
++ next-level-cache = <&L2>;
++ };
++ cpu1: PowerPC,e6500@1 {
++ device_type = "cpu";
++ reg = <2 3>;
++ next-level-cache = <&L2>;
++ };
++ cpu2: PowerPC,e6500@2 {
++ device_type = "cpu";
++ reg = <4 5>;
++ next-level-cache = <&L2>;
++ };
++ cpu3: PowerPC,e6500@3 {
++ device_type = "cpu";
++ reg = <6 7>;
++ next-level-cache = <&L2>;
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/bsc9131si-post.dtsi b/arch/powerpc/boot/dts/fsl/bsc9131si-post.dtsi
+new file mode 100644
+index 0000000..5180d9d
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/bsc9131si-post.dtsi
+@@ -0,0 +1,193 @@
++/*
++ * BSC9131 Silicon/SoC Device Tree Source (post include)
++ *
++ * Copyright 2011-2012 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.
++ */
++
++&ifc {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ compatible = "fsl,ifc", "simple-bus";
++ interrupts = <16 2 0 0 20 2 0 0>;
++};
++
++&soc {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ compatible = "fsl,bsc9131-immr", "simple-bus";
++ bus-frequency = <0>; // Filled out by uboot.
++
++ ecm-law@0 {
++ compatible = "fsl,ecm-law";
++ reg = <0x0 0x1000>;
++ fsl,num-laws = <12>;
++ };
++
++ ecm@1000 {
++ compatible = "fsl,bsc9131-ecm", "fsl,ecm";
++ reg = <0x1000 0x1000>;
++ interrupts = <16 2 0 0>;
++ };
++
++ memory-controller@2000 {
++ compatible = "fsl,bsc9131-memory-controller";
++ reg = <0x2000 0x1000>;
++ interrupts = <16 2 0 0>;
++ };
++
++/include/ "pq3-i2c-0.dtsi"
++ i2c@3000 {
++ interrupts = <17 2 0 0>;
++ };
++
++/include/ "pq3-i2c-1.dtsi"
++ i2c@3100 {
++ interrupts = <17 2 0 0>;
++ };
++
++/include/ "pq3-duart-0.dtsi"
++ serial0: serial@4500 {
++ interrupts = <18 2 0 0>;
++ };
++
++ serial1: serial@4600 {
++ interrupts = <18 2 0 0 >;
++ };
++/include/ "pq3-espi-0.dtsi"
++ spi0: spi@7000 {
++ fsl,espi-num-chipselects = <1>;
++ interrupts = <22 0x2 0 0>;
++ };
++
++/include/ "pq3-gpio-0.dtsi"
++ gpio-controller@f000 {
++ interrupts = <19 0x2 0 0>;
++ };
++
++ L2: l2-cache-controller@20000 {
++ compatible = "fsl,bsc9131-l2-cache-controller";
++ reg = <0x20000 0x1000>;
++ cache-line-size = <32>; // 32 bytes
++ cache-size = <0x40000>; // L2,256K
++ interrupts = <16 2 0 0>;
++ };
++
++/include/ "pq3-dma-0.dtsi"
++
++dma@21300 {
++
++ dma-channel@0 {
++ interrupts = <62 2 0 0>;
++ };
++
++ dma-channel@80 {
++ interrupts = <63 2 0 0>;
++ };
++
++ dma-channel@100 {
++ interrupts = <64 2 0 0>;
++ };
++
++ dma-channel@180 {
++ interrupts = <65 2 0 0>;
++ };
++};
++
++/include/ "pq3-usb2-dr-0.dtsi"
++usb@22000 {
++ compatible = "fsl-usb2-dr","fsl-usb2-dr-v2.2";
++ interrupts = <40 0x2 0 0>;
++};
++
++/include/ "pq3-esdhc-0.dtsi"
++ sdhc@2e000 {
++ fsl,sdhci-auto-cmd12;
++ interrupts = <41 0x2 0 0>;
++ };
++
++/include/ "pq3-sec4.4-0.dtsi"
++crypto@30000 {
++ interrupts = <57 2 0 0>;
++
++ sec_jr0: jr@1000 {
++ interrupts = <58 2 0 0>;
++ };
++
++ sec_jr1: jr@2000 {
++ interrupts = <59 2 0 0>;
++ };
++
++ sec_jr2: jr@3000 {
++ interrupts = <60 2 0 0>;
++ };
++
++ sec_jr3: jr@4000 {
++ interrupts = <61 2 0 0>;
++ };
++};
++
++/include/ "pq3-mpic.dtsi"
++
++timer@41100 {
++ compatible = "fsl,mpic-v1.2-msgr", "fsl,mpic-msg";
++ reg = <0x41400 0x200>;
++ interrupts = <
++ 0xb0 2
++ 0xb1 2
++ 0xb2 2
++ 0xb3 2>;
++};
++
++/include/ "pq3-etsec2-0.dtsi"
++enet0: ethernet@b0000 {
++ queue-group@b0000 {
++ fsl,rx-bit-map = <0xff>;
++ fsl,tx-bit-map = <0xff>;
++ interrupts = <26 2 0 0 27 2 0 0 28 2 0 0>;
++ };
++};
++
++/include/ "pq3-etsec2-1.dtsi"
++enet1: ethernet@b1000 {
++ queue-group@b1000 {
++ fsl,rx-bit-map = <0xff>;
++ fsl,tx-bit-map = <0xff>;
++ interrupts = <33 2 0 0 34 2 0 0 35 2 0 0>;
++ };
++};
++
++global-utilities@e0000 {
++ compatible = "fsl,bsc9131-guts";
++ reg = <0xe0000 0x1000>;
++ fsl,has-rstcr;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/bsc9131si-pre.dtsi b/arch/powerpc/boot/dts/fsl/bsc9131si-pre.dtsi
+new file mode 100644
+index 0000000..743e4ae
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/bsc9131si-pre.dtsi
+@@ -0,0 +1,59 @@
++/*
++ * BSC9131 Silicon/SoC Device Tree Source (pre include)
++ *
++ * Copyright 2011-2012 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.
++ */
++
++/dts-v1/;
++/ {
++ compatible = "fsl,BSC9131";
++ #address-cells = <2>;
++ #size-cells = <2>;
++ interrupt-parent = <&mpic>;
++
++ aliases {
++ serial0 = &serial0;
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PowerPC,BSC9131@0 {
++ device_type = "cpu";
++ compatible = "fsl,e500v2";
++ reg = <0x0>;
++ next-level-cache = <&L2>;
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/e500mc_power_isa.dtsi b/arch/powerpc/boot/dts/fsl/e500mc_power_isa.dtsi
+new file mode 100644
+index 0000000..870c653
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/e500mc_power_isa.dtsi
+@@ -0,0 +1,58 @@
++/*
++ * e500mc Power ISA Device Tree Source (include)
++ *
++ * Copyright 2012 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.
++ */
++
++/ {
++ cpus {
++ power-isa-version = "2.06";
++ power-isa-b; // Base
++ power-isa-e; // Embedded
++ power-isa-atb; // Alternate Time Base
++ power-isa-cs; // Cache Specification
++ power-isa-ds; // Decorated Storage
++ power-isa-e.ed; // Embedded.Enhanced Debug
++ power-isa-e.pd; // Embedded.External PID
++ power-isa-e.hv; // Embedded.Hypervisor
++ power-isa-e.le; // Embedded.Little-Endian
++ power-isa-e.pm; // Embedded.Performance Monitor
++ power-isa-e.pc; // Embedded.Processor Control
++ power-isa-ecl; // Embedded Cache Locking
++ power-isa-exp; // External Proxy
++ power-isa-fp; // Floating Point
++ power-isa-fp.r; // Floating Point.Record
++ power-isa-mmc; // Memory Coherence
++ power-isa-scpm; // Store Conditional Page Mobility
++ power-isa-wt; // Wait
++ mmu-type = "power-embedded";
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/e500v2_power_isa.dtsi b/arch/powerpc/boot/dts/fsl/e500v2_power_isa.dtsi
+new file mode 100644
+index 0000000..f492814
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/e500v2_power_isa.dtsi
+@@ -0,0 +1,52 @@
++/*
++ * e500v2 Power ISA Device Tree Source (include)
++ *
++ * Copyright 2012 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.
++ */
++
++/ {
++ cpus {
++ power-isa-version = "2.03";
++ power-isa-b; // Base
++ power-isa-e; // Embedded
++ power-isa-atb; // Alternate Time Base
++ power-isa-cs; // Cache Specification
++ power-isa-e.le; // Embedded.Little-Endian
++ power-isa-e.pm; // Embedded.Performance Monitor
++ power-isa-ecl; // Embedded Cache Locking
++ power-isa-mmc; // Memory Coherence
++ power-isa-sp; // Signal Processing Engine
++ power-isa-sp.fd; // SPE.Embedded Float Scalar Double
++ power-isa-sp.fs; // SPE.Embedded Float Scalar Single
++ power-isa-sp.fv; // SPE.Embedded Float Vector
++ mmu-type = "power-embedded";
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/e5500_power_isa.dtsi b/arch/powerpc/boot/dts/fsl/e5500_power_isa.dtsi
+new file mode 100644
+index 0000000..3230212
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/e5500_power_isa.dtsi
+@@ -0,0 +1,59 @@
++/*
++ * e5500 Power ISA Device Tree Source (include)
++ *
++ * Copyright 2012 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.
++ */
++
++/ {
++ cpus {
++ power-isa-version = "2.06";
++ power-isa-b; // Base
++ power-isa-e; // Embedded
++ power-isa-atb; // Alternate Time Base
++ power-isa-cs; // Cache Specification
++ power-isa-ds; // Decorated Storage
++ power-isa-e.ed; // Embedded.Enhanced Debug
++ power-isa-e.pd; // Embedded.External PID
++ power-isa-e.hv; // Embedded.Hypervisor
++ power-isa-e.le; // Embedded.Little-Endian
++ power-isa-e.pm; // Embedded.Performance Monitor
++ power-isa-e.pc; // Embedded.Processor Control
++ power-isa-ecl; // Embedded Cache Locking
++ power-isa-exp; // External Proxy
++ power-isa-fp; // Floating Point
++ power-isa-fp.r; // Floating Point.Record
++ power-isa-mmc; // Memory Coherence
++ power-isa-scpm; // Store Conditional Page Mobility
++ power-isa-wt; // Wait
++ power-isa-64; // 64-bit
++ mmu-type = "power-embedded";
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/interlaken-lac-portals.dtsi b/arch/powerpc/boot/dts/fsl/interlaken-lac-portals.dtsi
+new file mode 100644
+index 0000000..9cffccf
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/interlaken-lac-portals.dtsi
+@@ -0,0 +1,156 @@
++/* T4240 Interlaken LAC Portal device tree stub with 24 portals.
++ *
++ * Copyright 2012 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.
++ */
++
++#address-cells = <0x1>;
++#size-cells = <0x1>;
++compatible = "fsl,interlaken-lac-portals";
++
++lportal0: lac-portal@0 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0x0 0x1000>;
++};
++
++lportal1: lac-portal@1000 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0x1000 0x1000>;
++};
++
++lportal2: lac-portal@2000 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0x2000 0x1000>;
++};
++
++lportal3: lac-portal@3000 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0x3000 0x1000>;
++};
++
++lportal4: lac-portal@4000 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0x4000 0x1000>;
++};
++
++lportal5: lac-portal@5000 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0x5000 0x1000>;
++};
++
++lportal6: lac-portal@6000 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0x6000 0x1000>;
++};
++
++lportal7: lac-portal@7000 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0x7000 0x1000>;
++};
++
++lportal8: lac-portal@8000 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0x8000 0x1000>;
++};
++
++lportal9: lac-portal@9000 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0x9000 0x1000>;
++};
++
++lportal10: lac-portal@A000 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0xA000 0x1000>;
++};
++
++lportal11: lac-portal@B000 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0xB000 0x1000>;
++};
++
++lportal12: lac-portal@C000 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0xC000 0x1000>;
++};
++
++lportal13: lac-portal@D000 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0xD000 0x1000>;
++};
++
++lportal14: lac-portal@E000 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0xE000 0x1000>;
++};
++
++lportal15: lac-portal@F000 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0xF000 0x1000>;
++};
++
++lportal16: lac-portal@10000 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0x10000 0x1000>;
++};
++
++lportal17: lac-portal@11000 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0x11000 0x1000>;
++};
++
++lportal18: lac-portal@1200 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0x12000 0x1000>;
++};
++
++lportal19: lac-portal@13000 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0x13000 0x1000>;
++};
++
++lportal20: lac-portal@14000 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0x14000 0x1000>;
++};
++
++lportal21: lac-portal@15000 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0x15000 0x1000>;
++};
++
++lportal22: lac-portal@16000 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0x16000 0x1000>;
++};
++
++lportal23: lac-portal@17000 {
++ compatible = "fsl,interlaken-lac-portal-v1.0";
++ reg = <0x17000 0x1000>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/interlaken-lac.dtsi b/arch/powerpc/boot/dts/fsl/interlaken-lac.dtsi
+new file mode 100644
+index 0000000..e820872
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/interlaken-lac.dtsi
+@@ -0,0 +1,45 @@
++/*
++ * T4 Interlaken Look-aside Controller (LAC) device tree stub
++ *
++ * Copyright 2012 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.
++ */
++
++lac: lac@229000 {
++ compatible = "fsl,interlaken-lac";
++ reg = <0x229000 0x1000>;
++ interrupts = <16 2 1 18>;
++};
++
++lac-hv@228000 {
++ compatible = "fsl,interlaken-lac-hv";
++ reg = <0x228000 0x1000>;
++ fsl,non-hv-node = <&lac>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/mpc8536si-post.dtsi b/arch/powerpc/boot/dts/fsl/mpc8536si-post.dtsi
+new file mode 100644
+index 0000000..900f117
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/mpc8536si-post.dtsi
+@@ -0,0 +1,262 @@
++/*
++ * MPC8536 Silicon/SoC Device Tree Source (post include)
++ *
++ * Copyright 2011 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.
++ */
++
++&lbc {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ compatible = "fsl,mpc8536-elbc", "fsl,elbc", "simple-bus";
++ interrupts = <19 2 0 0>;
++};
++
++/* controller at 0x8000 */
++&pci0 {
++ compatible = "fsl,mpc8540-pci";
++ device_type = "pci";
++ interrupts = <24 0x2 0 0>;
++ bus-range = <0 0xff>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++};
++
++/* controller at 0x9000 */
++&pci1 {
++ compatible = "fsl,mpc8548-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <25 2 0 0>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <25 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x4 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x5 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0x6 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0x7 0x1 0x0 0x0
++ >;
++ };
++};
++
++/* controller at 0xa000 */
++&pci2 {
++ compatible = "fsl,mpc8548-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <26 2 0 0>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <26 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x0 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x1 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0x2 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0x3 0x1 0x0 0x0
++ >;
++ };
++};
++
++/* controller at 0xb000 */
++&pci3 {
++ compatible = "fsl,mpc8548-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <27 2 0 0>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <27 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x8 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x9 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0xa 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0xb 0x1 0x0 0x0
++ >;
++ };
++};
++&soc {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ compatible = "fsl,mpc8536-immr", "simple-bus";
++ bus-frequency = <0>; // Filled out by uboot.
++
++ ecm-law@0 {
++ compatible = "fsl,ecm-law";
++ reg = <0x0 0x1000>;
++ fsl,num-laws = <12>;
++ };
++
++ ecm@1000 {
++ compatible = "fsl,mpc8536-ecm", "fsl,ecm";
++ reg = <0x1000 0x1000>;
++ interrupts = <17 2 0 0>;
++ };
++
++ memory-controller@2000 {
++ compatible = "fsl,mpc8536-memory-controller";
++ reg = <0x2000 0x1000>;
++ interrupts = <18 2 0 0>;
++ };
++
++/include/ "pq3-i2c-0.dtsi"
++/include/ "pq3-i2c-1.dtsi"
++/include/ "pq3-duart-0.dtsi"
++
++/include/ "pq3-espi-0.dtsi"
++ spi@7000 {
++ fsl,espi-num-chipselects = <4>;
++ };
++
++/include/ "pq3-gpio-0.dtsi"
++
++ /* mark compat w/8572 to get some erratum treatment */
++ gpio-controller@f000 {
++ compatible = "fsl,mpc8572-gpio", "fsl,pq3-gpio";
++ };
++
++ sata@18000 {
++ compatible = "fsl,mpc8536-sata", "fsl,pq-sata";
++ reg = <0x18000 0x1000>;
++ cell-index = <1>;
++ interrupts = <74 0x2 0 0>;
++ };
++
++ sata@19000 {
++ compatible = "fsl,mpc8536-sata", "fsl,pq-sata";
++ reg = <0x19000 0x1000>;
++ cell-index = <2>;
++ interrupts = <41 0x2 0 0>;
++ };
++
++ L2: l2-cache-controller@20000 {
++ compatible = "fsl,mpc8536-l2-cache-controller";
++ reg = <0x20000 0x1000>;
++ cache-line-size = <32>; // 32 bytes
++ cache-size = <0x80000>; // L2, 512K
++ interrupts = <16 2 0 0>;
++ };
++
++/include/ "pq3-dma-0.dtsi"
++/include/ "pq3-etsec1-0.dtsi"
++ enet0: ethernet@24000 {
++ fsl,wake-on-filer;
++ fsl,pmc-handle = <&etsec1_clk>;
++ };
++/include/ "pq3-etsec1-timer-0.dtsi"
++
++ usb@22000 {
++ compatible = "fsl-usb2-mph-v1.2", "fsl,mpc8536-usb2-mph", "fsl-usb2-mph";
++ reg = <0x22000 0x1000>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ interrupts = <28 0x2 0 0>;
++ };
++
++ usb@23000 {
++ compatible = "fsl-usb2-mph-v1.2", "fsl,mpc8536-usb2-mph", "fsl-usb2-mph";
++ reg = <0x23000 0x1000>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ interrupts = <46 0x2 0 0>;
++ };
++
++ ptp_clock@24e00 {
++ interrupts = <68 2 0 0 69 2 0 0 70 2 0 0 71 2 0 0>;
++ };
++
++/include/ "pq3-etsec1-2.dtsi"
++ enet2: ethernet@26000 {
++ cell-index = <1>;
++ fsl,wake-on-filer;
++ fsl,pmc-handle = <&etsec3_clk>;
++ };
++
++ usb@2b000 {
++ compatible = "fsl,mpc8536-usb2-dr", "fsl-usb2-dr";
++ reg = <0x2b000 0x1000>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ interrupts = <60 0x2 0 0>;
++ };
++
++/include/ "pq3-esdhc-0.dtsi"
++ sdhc@2e000 {
++ compatible = "fsl,mpc8536-esdhc", "fsl,esdhc";
++ };
++
++/include/ "pq3-sec3.0-0.dtsi"
++/include/ "pq3-mpic.dtsi"
++/include/ "pq3-mpic-timer-B.dtsi"
++
++ global-utilities@e0000 {
++ compatible = "fsl,mpc8536-guts";
++ reg = <0xe0000 0x1000>;
++ fsl,has-rstcr;
++ };
++
++/include/ "pq3-power.dtsi"
++ power@e0070 {
++ compatible = "fsl,mpc8536-pmc", "fsl,mpc8548-pmc";
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/mpc8536si-pre.dtsi b/arch/powerpc/boot/dts/fsl/mpc8536si-pre.dtsi
+new file mode 100644
+index 0000000..152906f
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/mpc8536si-pre.dtsi
+@@ -0,0 +1,66 @@
++/*
++ * MPC8536 Silicon/SoC Device Tree Source (pre include)
++ *
++ * Copyright 2011 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.
++ */
++
++/dts-v1/;
++
++/include/ "e500v2_power_isa.dtsi"
++
++/ {
++ compatible = "fsl,MPC8536";
++ #address-cells = <2>;
++ #size-cells = <2>;
++ interrupt-parent = <&mpic>;
++
++ aliases {
++ serial0 = &serial0;
++ serial1 = &serial1;
++ ethernet0 = &enet0;
++ ethernet1 = &enet2;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ pci2 = &pci2;
++ pci3 = &pci3;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PowerPC,8536@0 {
++ device_type = "cpu";
++ reg = <0x0>;
++ next-level-cache = <&L2>;
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/mpc8544si-post.dtsi b/arch/powerpc/boot/dts/fsl/mpc8544si-post.dtsi
+new file mode 100644
+index 0000000..ea7416a
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/mpc8544si-post.dtsi
+@@ -0,0 +1,193 @@
++/*
++ * MPC8544 Silicon/SoC Device Tree Source (post include)
++ *
++ * Copyright 2011 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.
++ */
++
++&lbc {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ compatible = "fsl,mpc8544-lbc", "fsl,pq3-localbus", "simple-bus";
++ interrupts = <19 2 0 0>;
++};
++
++/* controller at 0x8000 */
++&pci0 {
++ compatible = "fsl,mpc8540-pci";
++ device_type = "pci";
++ interrupts = <24 0x2 0 0>;
++ bus-range = <0 0xff>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++};
++
++/* controller at 0x9000 */
++&pci1 {
++ compatible = "fsl,mpc8548-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <25 2 0 0>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <25 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x4 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x5 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0x6 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0x7 0x1 0x0 0x0
++ >;
++ };
++};
++
++/* controller at 0xa000 */
++&pci2 {
++ compatible = "fsl,mpc8548-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <26 2 0 0>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <26 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x0 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x1 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0x2 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0x3 0x1 0x0 0x0
++ >;
++ };
++};
++
++/* controller at 0xb000 */
++&pci3 {
++ compatible = "fsl,mpc8548-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <27 2 0 0>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <27 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x8 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x9 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0xa 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0xb 0x1 0x0 0x0
++ >;
++ };
++};
++
++&soc {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ compatible = "fsl,mpc8544-immr", "simple-bus";
++ bus-frequency = <0>; // Filled out by uboot.
++
++ ecm-law@0 {
++ compatible = "fsl,ecm-law";
++ reg = <0x0 0x1000>;
++ fsl,num-laws = <10>;
++ };
++
++ ecm@1000 {
++ compatible = "fsl,mpc8544-ecm", "fsl,ecm";
++ reg = <0x1000 0x1000>;
++ interrupts = <17 2 0 0>;
++ };
++
++ memory-controller@2000 {
++ compatible = "fsl,mpc8544-memory-controller";
++ reg = <0x2000 0x1000>;
++ interrupts = <18 2 0 0>;
++ };
++
++/include/ "pq3-i2c-0.dtsi"
++/include/ "pq3-i2c-1.dtsi"
++/include/ "pq3-duart-0.dtsi"
++
++ L2: l2-cache-controller@20000 {
++ compatible = "fsl,mpc8544-l2-cache-controller";
++ reg = <0x20000 0x1000>;
++ cache-line-size = <32>; // 32 bytes
++ cache-size = <0x40000>; // L2, 256K
++ interrupts = <16 2 0 0>;
++ };
++
++/include/ "pq3-dma-0.dtsi"
++/include/ "pq3-etsec1-0.dtsi"
++/include/ "pq3-etsec1-2.dtsi"
++
++ ethernet@26000 {
++ cell-index = <1>;
++ };
++
++/include/ "pq3-sec2.1-0.dtsi"
++/include/ "pq3-mpic.dtsi"
++
++ global-utilities@e0000 {
++ compatible = "fsl,mpc8544-guts";
++ reg = <0xe0000 0x1000>;
++ fsl,has-rstcr;
++ };
++
++/include/ "pq3-power.dtsi"
++};
+diff --git a/arch/powerpc/boot/dts/fsl/mpc8544si-pre.dtsi b/arch/powerpc/boot/dts/fsl/mpc8544si-pre.dtsi
+new file mode 100644
+index 0000000..5a69baf
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/mpc8544si-pre.dtsi
+@@ -0,0 +1,66 @@
++/*
++ * MPC8544 Silicon/SoC Device Tree Source (pre include)
++ *
++ * Copyright 2011 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.
++ */
++
++/dts-v1/;
++
++/include/ "e500v2_power_isa.dtsi"
++
++/ {
++ compatible = "fsl,MPC8544";
++ #address-cells = <2>;
++ #size-cells = <2>;
++ interrupt-parent = <&mpic>;
++
++ aliases {
++ serial0 = &serial0;
++ serial1 = &serial1;
++ ethernet0 = &enet0;
++ ethernet1 = &enet2;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ pci2 = &pci2;
++ pci3 = &pci3;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PowerPC,8544@0 {
++ device_type = "cpu";
++ reg = <0x0>;
++ next-level-cache = <&L2>;
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/mpc8548si-post.dtsi b/arch/powerpc/boot/dts/fsl/mpc8548si-post.dtsi
+new file mode 100644
+index 0000000..dddb737
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/mpc8548si-post.dtsi
+@@ -0,0 +1,161 @@
++/*
++ * MPC8548 Silicon/SoC Device Tree Source (post include)
++ *
++ * Copyright 2011 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.
++ */
++
++&lbc {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ compatible = "fsl,mpc8548-lbc", "fsl,pq3-localbus", "simple-bus";
++ interrupts = <19 2 0 0>;
++};
++
++/* controller at 0x8000 */
++&pci0 {
++ compatible = "fsl,mpc8540-pcix", "fsl,mpc8540-pci";
++ device_type = "pci";
++ interrupts = <24 0x2 0 0>;
++ bus-range = <0 0xff>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++};
++
++/* controller at 0x9000 */
++&pci1 {
++ compatible = "fsl,mpc8540-pci";
++ device_type = "pci";
++ interrupts = <25 0x2 0 0>;
++ bus-range = <0 0xff>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++};
++
++/* controller at 0xa000 */
++&pci2 {
++ compatible = "fsl,mpc8548-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <26 2 0 0>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <26 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x0 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x1 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0x2 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0x3 0x1 0x0 0x0
++ >;
++ };
++};
++
++&rio {
++ compatible = "fsl,srio";
++ interrupts = <48 2 0 0>;
++ #address-cells = <2>;
++ #size-cells = <2>;
++ fsl,srio-rmu-handle = <&rmu>;
++ ranges;
++
++ port1 {
++ #address-cells = <2>;
++ #size-cells = <2>;
++ cell-index = <1>;
++ };
++};
++
++&soc {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ compatible = "fsl,mpc8548-immr", "simple-bus";
++ bus-frequency = <0>; // Filled out by uboot.
++
++ ecm-law@0 {
++ compatible = "fsl,ecm-law";
++ reg = <0x0 0x1000>;
++ fsl,num-laws = <10>;
++ };
++
++ ecm@1000 {
++ compatible = "fsl,mpc8548-ecm", "fsl,ecm";
++ reg = <0x1000 0x1000>;
++ interrupts = <17 2 0 0>;
++ };
++
++ memory-controller@2000 {
++ compatible = "fsl,mpc8548-memory-controller";
++ reg = <0x2000 0x1000>;
++ interrupts = <18 2 0 0>;
++ };
++
++/include/ "pq3-i2c-0.dtsi"
++/include/ "pq3-i2c-1.dtsi"
++/include/ "pq3-duart-0.dtsi"
++
++ L2: l2-cache-controller@20000 {
++ compatible = "fsl,mpc8548-l2-cache-controller";
++ reg = <0x20000 0x1000>;
++ cache-line-size = <32>; // 32 bytes
++ cache-size = <0x80000>; // L2, 512K
++ interrupts = <16 2 0 0>;
++ };
++
++/include/ "pq3-dma-0.dtsi"
++/include/ "pq3-etsec1-0.dtsi"
++/include/ "pq3-etsec1-1.dtsi"
++/include/ "pq3-etsec1-2.dtsi"
++/include/ "pq3-etsec1-3.dtsi"
++
++/include/ "pq3-sec2.1-0.dtsi"
++/include/ "pq3-mpic.dtsi"
++/include/ "pq3-rmu-0.dtsi"
++
++ global-utilities@e0000 {
++ compatible = "fsl,mpc8548-guts";
++ reg = <0xe0000 0x1000>;
++ fsl,has-rstcr;
++ };
++
++/include/ "pq3-power.dtsi"
++};
+diff --git a/arch/powerpc/boot/dts/fsl/mpc8548si-pre.dtsi b/arch/powerpc/boot/dts/fsl/mpc8548si-pre.dtsi
+new file mode 100644
+index 0000000..fc1ce97
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/mpc8548si-pre.dtsi
+@@ -0,0 +1,67 @@
++/*
++ * MPC8548 Silicon/SoC Device Tree Source (pre include)
++ *
++ * Copyright 2011 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.
++ */
++
++/dts-v1/;
++
++/include/ "e500v2_power_isa.dtsi"
++
++/ {
++ compatible = "fsl,MPC8548";
++ #address-cells = <2>;
++ #size-cells = <2>;
++ interrupt-parent = <&mpic>;
++
++ aliases {
++ serial0 = &serial0;
++ serial1 = &serial1;
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ ethernet2 = &enet2;
++ ethernet3 = &enet3;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ pci2 = &pci2;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PowerPC,8548@0 {
++ device_type = "cpu";
++ reg = <0x0>;
++ next-level-cache = <&L2>;
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/mpc8568si-post.dtsi b/arch/powerpc/boot/dts/fsl/mpc8568si-post.dtsi
+new file mode 100644
+index 0000000..64e7075
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/mpc8568si-post.dtsi
+@@ -0,0 +1,270 @@
++/*
++ * MPC8568 Silicon/SoC Device Tree Source (post include)
++ *
++ * Copyright 2011 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.
++ */
++
++&lbc {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ compatible = "fsl,mpc8568-localbus", "fsl,pq3-localbus", "simple-bus";
++ interrupts = <19 2 0 0>;
++ sleep = <&pmc 0x08000000>;
++};
++
++/* controller at 0x8000 */
++&pci0 {
++ compatible = "fsl,mpc8540-pci";
++ device_type = "pci";
++ interrupts = <24 0x2 0 0>;
++ bus-range = <0 0xff>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ sleep = <&pmc 0x80000000>;
++};
++
++/* controller at 0xa000 */
++&pci1 {
++ compatible = "fsl,mpc8548-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <26 2 0 0>;
++ sleep = <&pmc 0x20000000>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <26 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x0 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x1 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0x2 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0x3 0x1 0x0 0x0
++ >;
++ };
++};
++
++&rio {
++ compatible = "fsl,srio";
++ interrupts = <48 2 0 0>;
++ #address-cells = <2>;
++ #size-cells = <2>;
++ fsl,srio-rmu-handle = <&rmu>;
++ sleep = <&pmc 0x00080000>;
++ ranges;
++
++ port1 {
++ #address-cells = <2>;
++ #size-cells = <2>;
++ cell-index = <1>;
++ };
++};
++
++&soc {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ compatible = "fsl,mpc8568-immr", "simple-bus";
++ bus-frequency = <0>; // Filled out by uboot.
++
++ ecm-law@0 {
++ compatible = "fsl,ecm-law";
++ reg = <0x0 0x1000>;
++ fsl,num-laws = <10>;
++ };
++
++ ecm@1000 {
++ compatible = "fsl,mpc8568-ecm", "fsl,ecm";
++ reg = <0x1000 0x1000>;
++ interrupts = <17 2 0 0>;
++ };
++
++ memory-controller@2000 {
++ compatible = "fsl,mpc8568-memory-controller";
++ reg = <0x2000 0x1000>;
++ interrupts = <18 2 0 0>;
++ };
++
++ i2c-sleep-nexus {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "simple-bus";
++ sleep = <&pmc 0x00000004>;
++ ranges;
++
++/include/ "pq3-i2c-0.dtsi"
++/include/ "pq3-i2c-1.dtsi"
++
++ };
++
++ duart-sleep-nexus {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "simple-bus";
++ sleep = <&pmc 0x00000002>;
++ ranges;
++
++/include/ "pq3-duart-0.dtsi"
++
++ };
++
++ L2: l2-cache-controller@20000 {
++ compatible = "fsl,mpc8568-l2-cache-controller";
++ reg = <0x20000 0x1000>;
++ cache-line-size = <32>; // 32 bytes
++ cache-size = <0x80000>; // L2, 512K
++ interrupts = <16 2 0 0>;
++ };
++
++/include/ "pq3-dma-0.dtsi"
++ dma@21300 {
++ sleep = <&pmc 0x00000400>;
++ };
++
++/include/ "pq3-etsec1-0.dtsi"
++ ethernet@24000 {
++ sleep = <&pmc 0x00000080>;
++ };
++
++/include/ "pq3-etsec1-1.dtsi"
++ ethernet@25000 {
++ sleep = <&pmc 0x00000040>;
++ };
++
++ par_io@e0100 {
++ reg = <0xe0100 0x100>;
++ device_type = "par_io";
++ };
++
++/include/ "pq3-sec2.1-0.dtsi"
++ crypto@30000 {
++ sleep = <&pmc 0x01000000>;
++ };
++
++/include/ "pq3-mpic.dtsi"
++/include/ "pq3-rmu-0.dtsi"
++ rmu@d3000 {
++ sleep = <&pmc 0x00040000>;
++ };
++
++ global-utilities@e0000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,mpc8568-guts", "fsl,mpc8548-guts";
++ reg = <0xe0000 0x1000>;
++ ranges = <0 0xe0000 0x1000>;
++ fsl,has-rstcr;
++
++ pmc: power@70 {
++ compatible = "fsl,mpc8568-pmc",
++ "fsl,mpc8548-pmc";
++ reg = <0x70 0x20>;
++ };
++ };
++};
++
++&qe {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "qe";
++ compatible = "fsl,qe";
++ sleep = <&pmc 0x00000800>;
++ brg-frequency = <0>;
++ bus-frequency = <396000000>;
++ fsl,qe-num-riscs = <2>;
++ fsl,qe-num-snums = <28>;
++
++ qeic: interrupt-controller@80 {
++ interrupt-controller;
++ compatible = "fsl,qe-ic";
++ #address-cells = <0>;
++ #interrupt-cells = <1>;
++ reg = <0x80 0x80>;
++ interrupts = <46 2 0 0 46 2 0 0>; //high:30 low:30
++ interrupt-parent = <&mpic>;
++ };
++
++ spi@4c0 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,spi";
++ reg = <0x4c0 0x40>;
++ cell-index = <0>;
++ interrupts = <2>;
++ interrupt-parent = <&qeic>;
++ };
++
++ spi@500 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <1>;
++ compatible = "fsl,spi";
++ reg = <0x500 0x40>;
++ interrupts = <1>;
++ interrupt-parent = <&qeic>;
++ };
++
++ ucc@2000 {
++ cell-index = <1>;
++ reg = <0x2000 0x200>;
++ interrupts = <32>;
++ interrupt-parent = <&qeic>;
++ };
++
++ ucc@3000 {
++ cell-index = <2>;
++ reg = <0x3000 0x200>;
++ interrupts = <33>;
++ interrupt-parent = <&qeic>;
++ };
++
++ muram@10000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,qe-muram", "fsl,cpm-muram";
++ ranges = <0x0 0x10000 0x10000>;
++
++ data-only@0 {
++ compatible = "fsl,qe-muram-data",
++ "fsl,cpm-muram-data";
++ reg = <0x0 0x10000>;
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/mpc8568si-pre.dtsi b/arch/powerpc/boot/dts/fsl/mpc8568si-pre.dtsi
+new file mode 100644
+index 0000000..122ca3b
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/mpc8568si-pre.dtsi
+@@ -0,0 +1,68 @@
++/*
++ * MPC8568 Silicon/SoC Device Tree Source (pre include)
++ *
++ * Copyright 2011 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.
++ */
++
++/dts-v1/;
++
++/include/ "e500v2_power_isa.dtsi"
++
++/ {
++ compatible = "fsl,MPC8568";
++ #address-cells = <2>;
++ #size-cells = <2>;
++ interrupt-parent = <&mpic>;
++
++ aliases {
++ serial0 = &serial0;
++ serial1 = &serial1;
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ ethernet2 = &enet2;
++ ethernet3 = &enet3;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PowerPC,8568@0 {
++ device_type = "cpu";
++ reg = <0x0>;
++ next-level-cache = <&L2>;
++ sleep = <&pmc 0x00008000 // core
++ &pmc 0x00004000>; // timebase
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/mpc8569si-post.dtsi b/arch/powerpc/boot/dts/fsl/mpc8569si-post.dtsi
+new file mode 100644
+index 0000000..3e6346a
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/mpc8569si-post.dtsi
+@@ -0,0 +1,304 @@
++/*
++ * MPC8569 Silicon/SoC Device Tree Source (post include)
++ *
++ * Copyright 2011 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.
++ */
++
++&lbc {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ compatible = "fsl,mpc8569-elbc", "fsl,elbc", "simple-bus";
++ interrupts = <19 2 0 0>;
++ sleep = <&pmc 0x08000000>;
++};
++
++/* controller at 0xa000 */
++&pci1 {
++ compatible = "fsl,mpc8548-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <26 2 0 0>;
++ sleep = <&pmc 0x20000000>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <26 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x0 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x1 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0x2 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0x3 0x1 0x0 0x0
++ >;
++ };
++};
++
++&rio {
++ compatible = "fsl,srio";
++ interrupts = <48 2 0 0>;
++ #address-cells = <2>;
++ #size-cells = <2>;
++ fsl,srio-rmu-handle = <&rmu>;
++ sleep = <&pmc 0x00080000>;
++ ranges;
++
++ port1 {
++ #address-cells = <2>;
++ #size-cells = <2>;
++ cell-index = <1>;
++ };
++
++ port2 {
++ #address-cells = <2>;
++ #size-cells = <2>;
++ cell-index = <2>;
++ };
++};
++
++&soc {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ compatible = "fsl,mpc8569-immr", "simple-bus";
++ bus-frequency = <0>; // Filled out by uboot.
++
++ ecm-law@0 {
++ compatible = "fsl,ecm-law";
++ reg = <0x0 0x1000>;
++ fsl,num-laws = <10>;
++ };
++
++ ecm@1000 {
++ compatible = "fsl,mpc8569-ecm", "fsl,ecm";
++ reg = <0x1000 0x1000>;
++ interrupts = <17 2 0 0>;
++ };
++
++ memory-controller@2000 {
++ compatible = "fsl,mpc8569-memory-controller";
++ reg = <0x2000 0x1000>;
++ interrupts = <18 2 0 0>;
++ };
++
++ i2c-sleep-nexus {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "simple-bus";
++ sleep = <&pmc 0x00000004>;
++ ranges;
++
++/include/ "pq3-i2c-0.dtsi"
++/include/ "pq3-i2c-1.dtsi"
++
++ };
++
++ duart-sleep-nexus {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "simple-bus";
++ sleep = <&pmc 0x00000002>;
++ ranges;
++
++/include/ "pq3-duart-0.dtsi"
++
++ };
++
++ L2: l2-cache-controller@20000 {
++ compatible = "fsl,mpc8569-l2-cache-controller";
++ reg = <0x20000 0x1000>;
++ cache-line-size = <32>; // 32 bytes
++ cache-size = <0x80000>; // L2, 512K
++ interrupts = <16 2 0 0>;
++ };
++
++/include/ "pq3-dma-0.dtsi"
++/include/ "pq3-esdhc-0.dtsi"
++ sdhc@2e000 {
++ sleep = <&pmc 0x00200000>;
++ };
++
++ par_io@e0100 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0xe0100 0x100>;
++ ranges = <0x0 0xe0100 0x100>;
++ device_type = "par_io";
++ };
++
++/include/ "pq3-sec3.1-0.dtsi"
++ crypto@30000 {
++ sleep = <&pmc 0x01000000>;
++ };
++
++/include/ "pq3-mpic.dtsi"
++/include/ "pq3-rmu-0.dtsi"
++ rmu@d3000 {
++ sleep = <&pmc 0x00040000>;
++ };
++
++ global-utilities@e0000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,mpc8569-guts", "fsl,mpc8548-guts";
++ reg = <0xe0000 0x1000>;
++ ranges = <0 0xe0000 0x1000>;
++ fsl,has-rstcr;
++
++ pmc: power@70 {
++ compatible = "fsl,mpc8569-pmc",
++ "fsl,mpc8548-pmc";
++ reg = <0x70 0x20>;
++ };
++ };
++};
++
++&qe {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "qe";
++ compatible = "fsl,qe";
++ sleep = <&pmc 0x00000800>;
++ brg-frequency = <0>;
++ bus-frequency = <0>;
++ fsl,qe-num-riscs = <4>;
++ fsl,qe-num-snums = <46>;
++
++ qeic: interrupt-controller@80 {
++ interrupt-controller;
++ compatible = "fsl,qe-ic";
++ #address-cells = <0>;
++ #interrupt-cells = <1>;
++ reg = <0x80 0x80>;
++ interrupts = <46 2 0 0 46 2 0 0>; //high:30 low:30
++ interrupt-parent = <&mpic>;
++ };
++
++ timer@440 {
++ compatible = "fsl,mpc8569-qe-gtm",
++ "fsl,qe-gtm", "fsl,gtm";
++ reg = <0x440 0x40>;
++ interrupts = <12 13 14 15>;
++ interrupt-parent = <&qeic>;
++ /* Filled in by U-Boot */
++ clock-frequency = <0>;
++ };
++
++ spi@4c0 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,mpc8569-qe-spi", "fsl,spi";
++ reg = <0x4c0 0x40>;
++ cell-index = <0>;
++ interrupts = <2>;
++ interrupt-parent = <&qeic>;
++ };
++
++ spi@500 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <1>;
++ compatible = "fsl,spi";
++ reg = <0x500 0x40>;
++ interrupts = <1>;
++ interrupt-parent = <&qeic>;
++ };
++
++ usb@6c0 {
++ compatible = "fsl,mpc8569-qe-usb",
++ "fsl,mpc8323-qe-usb";
++ reg = <0x6c0 0x40 0x8b00 0x100>;
++ interrupts = <11>;
++ interrupt-parent = <&qeic>;
++ };
++
++ 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>;
++ };
++
++ ucc@3000 {
++ cell-index = <2>;
++ reg = <0x3000 0x200>;
++ interrupts = <33>;
++ interrupt-parent = <&qeic>;
++ };
++
++ ucc@3200 {
++ cell-index = <4>;
++ reg = <0x3200 0x200>;
++ interrupts = <35>;
++ interrupt-parent = <&qeic>;
++ };
++
++ ucc@3400 {
++ cell-index = <6>;
++ reg = <0x3400 0x200>;
++ interrupts = <41>;
++ interrupt-parent = <&qeic>;
++ };
++
++ ucc@3600 {
++ cell-index = <8>;
++ reg = <0x3600 0x200>;
++ interrupts = <43>;
++ interrupt-parent = <&qeic>;
++ };
++
++ muram@10000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,qe-muram", "fsl,cpm-muram";
++ ranges = <0x0 0x10000 0x20000>;
++
++ data-only@0 {
++ compatible = "fsl,qe-muram-data",
++ "fsl,cpm-muram-data";
++ reg = <0x0 0x20000>;
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/mpc8569si-pre.dtsi b/arch/powerpc/boot/dts/fsl/mpc8569si-pre.dtsi
+new file mode 100644
+index 0000000..2cd15a2
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/mpc8569si-pre.dtsi
+@@ -0,0 +1,67 @@
++/*
++ * MPC8569 Silicon/SoC Device Tree Source (pre include)
++ *
++ * Copyright 2011 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.
++ */
++
++/dts-v1/;
++
++/include/ "e500v2_power_isa.dtsi"
++
++/ {
++ compatible = "fsl,MPC8569";
++ #address-cells = <2>;
++ #size-cells = <2>;
++ interrupt-parent = <&mpic>;
++
++ aliases {
++ serial0 = &serial0;
++ serial1 = &serial1;
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ ethernet2 = &enet2;
++ ethernet3 = &enet3;
++ pci1 = &pci1;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PowerPC,8569@0 {
++ device_type = "cpu";
++ reg = <0x0>;
++ next-level-cache = <&L2>;
++ sleep = <&pmc 0x00008000 // core
++ &pmc 0x00004000>; // timebase
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/mpc8572si-post.dtsi b/arch/powerpc/boot/dts/fsl/mpc8572si-post.dtsi
+new file mode 100644
+index 0000000..7313351
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/mpc8572si-post.dtsi
+@@ -0,0 +1,198 @@
++/*
++ * MPC8572 Silicon/SoC Device Tree Source (post include)
++ *
++ * Copyright 2011 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.
++ */
++
++&lbc {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ compatible = "fsl,mpc8572-elbc", "fsl,elbc", "simple-bus";
++ interrupts = <19 2 0 0>;
++};
++
++/* controller at 0x8000 */
++&pci0 {
++ compatible = "fsl,mpc8548-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <24 2 0 0>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <24 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x8 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x9 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0xa 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0xb 0x1 0x0 0x0
++ >;
++ };
++};
++
++/* controller at 0x9000 */
++&pci1 {
++ compatible = "fsl,mpc8548-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <25 2 0 0>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <25 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x4 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x5 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0x6 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0x7 0x1 0x0 0x0
++ >;
++ };
++};
++
++/* controller at 0xa000 */
++&pci2 {
++ compatible = "fsl,mpc8548-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <26 2 0 0>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <26 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x0 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x1 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0x2 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0x3 0x1 0x0 0x0
++ >;
++ };
++};
++
++&soc {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ compatible = "fsl,mpc8572-immr", "simple-bus";
++ bus-frequency = <0>; // Filled out by uboot.
++
++ ecm-law@0 {
++ compatible = "fsl,ecm-law";
++ reg = <0x0 0x1000>;
++ fsl,num-laws = <12>;
++ };
++
++ ecm@1000 {
++ compatible = "fsl,mpc8572-ecm", "fsl,ecm";
++ reg = <0x1000 0x1000>;
++ interrupts = <17 2 0 0>;
++ };
++
++ memory-controller@2000 {
++ compatible = "fsl,mpc8572-memory-controller";
++ reg = <0x2000 0x1000>;
++ interrupts = <18 2 0 0>;
++ };
++
++ memory-controller@6000 {
++ compatible = "fsl,mpc8572-memory-controller";
++ reg = <0x6000 0x1000>;
++ interrupts = <18 2 0 0>;
++ };
++
++/include/ "pq3-i2c-0.dtsi"
++/include/ "pq3-i2c-1.dtsi"
++/include/ "pq3-duart-0.dtsi"
++/include/ "pq3-dma-1.dtsi"
++/include/ "pq3-gpio-0.dtsi"
++ gpio-controller@f000 {
++ compatible = "fsl,mpc8572-gpio", "fsl,pq3-gpio";
++ };
++
++ L2: l2-cache-controller@20000 {
++ compatible = "fsl,mpc8572-l2-cache-controller";
++ reg = <0x20000 0x1000>;
++ cache-line-size = <32>; // 32 bytes
++ cache-size = <0x100000>; // L2,1M
++ interrupts = <16 2 0 0>;
++ };
++
++/include/ "pq3-dma-0.dtsi"
++/include/ "pq3-etsec1-0.dtsi"
++/include/ "pq3-etsec1-timer-0.dtsi"
++
++ ptp_clock@24e00 {
++ interrupts = <68 2 0 0 69 2 0 0 70 2 0 0 71 2 0 0>;
++ };
++
++/include/ "pq3-etsec1-1.dtsi"
++/include/ "pq3-etsec1-2.dtsi"
++/include/ "pq3-etsec1-3.dtsi"
++/include/ "pq3-sec3.0-0.dtsi"
++/include/ "pq3-mpic.dtsi"
++/include/ "pq3-mpic-timer-B.dtsi"
++
++ global-utilities@e0000 {
++ compatible = "fsl,mpc8572-guts";
++ reg = <0xe0000 0x1000>;
++ fsl,has-rstcr;
++ };
++
++/include/ "pq3-power.dtsi"
++};
+diff --git a/arch/powerpc/boot/dts/fsl/mpc8572si-pre.dtsi b/arch/powerpc/boot/dts/fsl/mpc8572si-pre.dtsi
+new file mode 100644
+index 0000000..28c2a86
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/mpc8572si-pre.dtsi
+@@ -0,0 +1,73 @@
++/*
++ * MPC8572 Silicon/SoC Device Tree Source (pre include)
++ *
++ * Copyright 2011 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.
++ */
++
++/dts-v1/;
++
++/include/ "e500v2_power_isa.dtsi"
++
++/ {
++ compatible = "fsl,MPC8572";
++ #address-cells = <2>;
++ #size-cells = <2>;
++ interrupt-parent = <&mpic>;
++
++ aliases {
++ serial0 = &serial0;
++ serial1 = &serial1;
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ ethernet2 = &enet2;
++ ethernet3 = &enet3;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ pci2 = &pci2;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PowerPC,8572@0 {
++ device_type = "cpu";
++ reg = <0x0>;
++ next-level-cache = <&L2>;
++ };
++
++ PowerPC,8572@1 {
++ device_type = "cpu";
++ reg = <0x1>;
++ next-level-cache = <&L2>;
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/p1010si-post.dtsi b/arch/powerpc/boot/dts/fsl/p1010si-post.dtsi
+new file mode 100644
+index 0000000..e949c47
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/p1010si-post.dtsi
+@@ -0,0 +1,211 @@
++/*
++ * P1010/P1014 Silicon/SoC Device Tree Source (post include)
++ *
++ * Copyright 2011-2012 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.
++ */
++
++&ifc {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ compatible = "fsl,ifc", "simple-bus";
++ interrupts = <16 2 0 0 19 2 0 0>;
++};
++
++/* controller at 0x9000 */
++&pci0 {
++ compatible = "fsl,p1010-pcie", "fsl,qoriq-pcie-v2.3", "fsl,qoriq-pcie-v2.2";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 0 0>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x4 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x5 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0x6 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0x7 0x1 0x0 0x0
++ >;
++ };
++};
++
++/* controller at 0xa000 */
++&pci1 {
++ compatible = "fsl,p1010-pcie", "fsl,qoriq-pcie-v2.3", "fsl,qoriq-pcie-v2.2";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 0 0>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x0 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x1 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0x2 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0x3 0x1 0x0 0x0
++ >;
++ };
++};
++
++&soc {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ compatible = "fsl,p1010-immr", "simple-bus";
++ bus-frequency = <0>; // Filled out by uboot.
++
++ ecm-law@0 {
++ compatible = "fsl,ecm-law";
++ reg = <0x0 0x1000>;
++ fsl,num-laws = <12>;
++ };
++
++ ecm@1000 {
++ compatible = "fsl,p1010-ecm", "fsl,ecm";
++ reg = <0x1000 0x1000>;
++ interrupts = <16 2 0 0>;
++ };
++
++ memory-controller@2000 {
++ compatible = "fsl,p1010-memory-controller";
++ reg = <0x2000 0x1000>;
++ interrupts = <16 2 0 0>;
++ };
++
++/include/ "pq3-i2c-0.dtsi"
++/include/ "pq3-i2c-1.dtsi"
++/include/ "pq3-duart-0.dtsi"
++/include/ "pq3-espi-0.dtsi"
++ spi0: spi@7000 {
++ fsl,espi-num-chipselects = <1>;
++ };
++
++/include/ "pq3-gpio-0.dtsi"
++/include/ "pq3-sata2-0.dtsi"
++/include/ "pq3-sata2-1.dtsi"
++/include/ "pq3-tdm1.0-0.dtsi"
++
++ can0: can@1c000 {
++ compatible = "fsl,p1010-flexcan";
++ reg = <0x1c000 0x1000>;
++ interrupts = <48 0x2 0 0>;
++ };
++
++ can1: can@1d000 {
++ compatible = "fsl,p1010-flexcan";
++ reg = <0x1d000 0x1000>;
++ interrupts = <61 0x2 0 0>;
++ };
++
++ L2: l2-cache-controller@20000 {
++ compatible = "fsl,p1010-l2-cache-controller",
++ "fsl,p1014-l2-cache-controller";
++ reg = <0x20000 0x1000>;
++ cache-line-size = <32>; // 32 bytes
++ cache-size = <0x40000>; // L2,256K
++ interrupts = <16 2 0 0>;
++ };
++
++/include/ "pq3-dma-0.dtsi"
++/include/ "pq3-usb2-dr-0.dtsi"
++ usb@22000 {
++ compatible = "fsl-usb2-dr-v1.6", "fsl-usb2-dr";
++ };
++/include/ "pq3-esdhc-0.dtsi"
++ sdhc@2e000 {
++ compatible = "fsl,p1010-esdhc", "fsl,esdhc";
++ sdhci,auto-cmd12;
++ };
++
++/include/ "pq3-sec4.4-0.dtsi"
++/include/ "pq3-mpic.dtsi"
++/include/ "pq3-mpic-timer-B.dtsi"
++
++/include/ "pq3-etsec2-0.dtsi"
++ enet0: ethernet@b0000 {
++ fsl,pmc-handle = <&etsec1_clk>;
++
++ queue-group@b0000 {
++ fsl,rx-bit-map = <0xff>;
++ fsl,tx-bit-map = <0xff>;
++ };
++ };
++
++/include/ "pq3-etsec2-1.dtsi"
++ enet1: ethernet@b1000 {
++ fsl,pmc-handle = <&etsec2_clk>;
++
++ queue-group@b1000 {
++ fsl,rx-bit-map = <0xff>;
++ fsl,tx-bit-map = <0xff>;
++ };
++ };
++
++/include/ "pq3-etsec2-2.dtsi"
++ enet2: ethernet@b2000 {
++ fsl,pmc-handle = <&etsec3_clk>;
++
++ queue-group@b2000 {
++ fsl,rx-bit-map = <0xff>;
++ fsl,tx-bit-map = <0xff>;
++ };
++
++ };
++
++ global-utilities@e0000 {
++ compatible = "fsl,p1010-guts";
++ reg = <0xe0000 0x1000>;
++ fsl,has-rstcr;
++ };
++
++/include/ "pq3-power.dtsi"
++};
+diff --git a/arch/powerpc/boot/dts/fsl/p1010si-pre.dtsi b/arch/powerpc/boot/dts/fsl/p1010si-pre.dtsi
+new file mode 100644
+index 0000000..6e76f9b
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/p1010si-pre.dtsi
+@@ -0,0 +1,67 @@
++/*
++ * P1010/P1014 Silicon/SoC Device Tree Source (pre include)
++ *
++ * Copyright 2011 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.
++ */
++
++/dts-v1/;
++
++/include/ "e500v2_power_isa.dtsi"
++
++/ {
++ compatible = "fsl,P1010";
++ #address-cells = <2>;
++ #size-cells = <2>;
++ interrupt-parent = <&mpic>;
++
++ aliases {
++ serial0 = &serial0;
++ serial1 = &serial1;
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ ethernet2 = &enet2;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ can0 = &can0;
++ can1 = &can1;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PowerPC,P1010@0 {
++ device_type = "cpu";
++ reg = <0x0>;
++ next-level-cache = <&L2>;
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/p1020si-post.dtsi b/arch/powerpc/boot/dts/fsl/p1020si-post.dtsi
+new file mode 100644
+index 0000000..5af0aae
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/p1020si-post.dtsi
+@@ -0,0 +1,201 @@
++/*
++ * P1020/P1011 Silicon/SoC Device Tree Source (post include)
++ *
++ * Copyright 2011 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.
++ */
++
++&lbc {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ compatible = "fsl,p1020-elbc", "fsl,elbc", "simple-bus";
++ interrupts = <19 2 0 0>;
++};
++
++/* controller at 0x9000 */
++&pci0 {
++ compatible = "fsl,mpc8548-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 0 0>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x4 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x5 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0x6 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0x7 0x1 0x0 0x0
++ >;
++ };
++};
++
++/* controller at 0xa000 */
++&pci1 {
++ compatible = "fsl,mpc8548-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 0 0>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x0 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x1 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0x2 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0x3 0x1 0x0 0x0
++ >;
++ };
++};
++
++&soc {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ compatible = "fsl,p1020-immr", "simple-bus";
++ bus-frequency = <0>; // Filled out by uboot.
++
++ ecm-law@0 {
++ compatible = "fsl,ecm-law";
++ reg = <0x0 0x1000>;
++ fsl,num-laws = <12>;
++ };
++
++ ecm@1000 {
++ compatible = "fsl,p1020-ecm", "fsl,ecm";
++ reg = <0x1000 0x1000>;
++ interrupts = <16 2 0 0>;
++ };
++
++ memory-controller@2000 {
++ compatible = "fsl,p1020-memory-controller";
++ reg = <0x2000 0x1000>;
++ interrupts = <16 2 0 0>;
++ };
++
++/include/ "pq3-i2c-0.dtsi"
++/include/ "pq3-i2c-1.dtsi"
++/include/ "pq3-duart-0.dtsi"
++
++/include/ "pq3-espi-0.dtsi"
++ spi@7000 {
++ fsl,espi-num-chipselects = <4>;
++ };
++
++/include/ "pq3-gpio-0.dtsi"
++/include/ "pq3-tdm1.0-0.dtsi"
++
++ L2: l2-cache-controller@20000 {
++ compatible = "fsl,p1020-l2-cache-controller";
++ reg = <0x20000 0x1000>;
++ cache-line-size = <32>; // 32 bytes
++ cache-size = <0x40000>; // L2,256K
++ interrupts = <16 2 0 0>;
++ };
++
++/include/ "pq3-dma-0.dtsi"
++/include/ "pq3-usb2-dr-0.dtsi"
++ usb@22000 {
++ compatible = "fsl-usb2-dr-v1.6", "fsl-usb2-dr";
++ };
++/include/ "pq3-usb2-dr-1.dtsi"
++ usb@23000 {
++ compatible = "fsl-usb2-dr-v1.6", "fsl-usb2-dr";
++ };
++
++/include/ "pq3-esdhc-0.dtsi"
++ sdhc@2e000 {
++ compatible = "fsl,p1020-esdhc", "fsl,esdhc";
++ sdhci,auto-cmd12;
++ };
++/include/ "pq3-sec3.3-0.dtsi"
++
++/include/ "pq3-mpic.dtsi"
++/include/ "pq3-mpic-timer-B.dtsi"
++
++ ptp_timer: ptimer@b0e00 {
++ compatible = "fsl,gianfar-ptp-timer";
++ reg = <0xb0e00 0xb0>;
++ fsl,ts-to-buffer;
++ fsl,tmr-prsc = <0x2>;
++ fsl,clock-source-select = <1>;
++ };
++
++/include/ "pq3-etsec2-0.dtsi"
++ enet0: enet0_grp2: ethernet@b0000 {
++ fsl,pmc-handle = <&etsec1_clk>;
++ ptimer-handle = <&ptp_timer>;
++ };
++
++/include/ "pq3-etsec2-1.dtsi"
++ enet1: enet1_grp2: ethernet@b1000 {
++ fsl,pmc-handle = <&etsec2_clk>;
++ ptimer-handle = <&ptp_timer>;
++ };
++
++/include/ "pq3-etsec2-2.dtsi"
++ enet2: enet2_grp2: ethernet@b2000 {
++ fsl,pmc-handle = <&etsec3_clk>;
++ ptimer-handle = <&ptp_timer>;
++ };
++
++ global-utilities@e0000 {
++ compatible = "fsl,p1020-guts";
++ reg = <0xe0000 0x1000>;
++ fsl,has-rstcr;
++ };
++
++/include/ "pq3-power.dtsi"
++};
++
++/include/ "pq3-etsec2-grp2-0.dtsi"
++/include/ "pq3-etsec2-grp2-1.dtsi"
++/include/ "pq3-etsec2-grp2-2.dtsi"
+diff --git a/arch/powerpc/boot/dts/fsl/p1020si-pre.dtsi b/arch/powerpc/boot/dts/fsl/p1020si-pre.dtsi
+new file mode 100644
+index 0000000..fed9c4c
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/p1020si-pre.dtsi
+@@ -0,0 +1,71 @@
++/*
++ * P1020/P1011 Silicon/SoC Device Tree Source (pre include)
++ *
++ * Copyright 2011 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.
++ */
++
++/dts-v1/;
++
++/include/ "e500v2_power_isa.dtsi"
++
++/ {
++ compatible = "fsl,P1020";
++ #address-cells = <2>;
++ #size-cells = <2>;
++ interrupt-parent = <&mpic>;
++
++ aliases {
++ serial0 = &serial0;
++ serial1 = &serial1;
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ ethernet2 = &enet2;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PowerPC,P1020@0 {
++ device_type = "cpu";
++ reg = <0x0>;
++ next-level-cache = <&L2>;
++ };
++
++ PowerPC,P1020@1 {
++ device_type = "cpu";
++ reg = <0x1>;
++ next-level-cache = <&L2>;
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/p1021si-post.dtsi b/arch/powerpc/boot/dts/fsl/p1021si-post.dtsi
+new file mode 100644
+index 0000000..cbdf47f
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/p1021si-post.dtsi
+@@ -0,0 +1,262 @@
++/*
++ * P1021/P1012 Silicon/SoC Device Tree Source (post include)
++ *
++ * Copyright 2011-2012 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.
++ */
++
++&lbc {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ compatible = "fsl,p1021-elbc", "fsl,elbc", "simple-bus";
++ interrupts = <19 2 0 0>;
++};
++
++/* controller at 0x9000 */
++&pci0 {
++ compatible = "fsl,mpc8548-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 0 0>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x4 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x5 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0x6 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0x7 0x1 0x0 0x0
++ >;
++ };
++};
++
++/* controller at 0xa000 */
++&pci1 {
++ compatible = "fsl,mpc8548-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 0 0>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x0 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x1 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0x2 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0x3 0x1 0x0 0x0
++ >;
++ };
++};
++
++&soc {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ compatible = "fsl,p1021-immr", "simple-bus";
++ bus-frequency = <0>; // Filled out by uboot.
++
++ ecm-law@0 {
++ compatible = "fsl,ecm-law";
++ reg = <0x0 0x1000>;
++ fsl,num-laws = <12>;
++ };
++
++ ecm@1000 {
++ compatible = "fsl,p1021-ecm", "fsl,ecm";
++ reg = <0x1000 0x1000>;
++ interrupts = <16 2 0 0>;
++ };
++
++ memory-controller@2000 {
++ compatible = "fsl,p1021-memory-controller";
++ reg = <0x2000 0x1000>;
++ interrupts = <16 2 0 0>;
++ };
++
++/include/ "pq3-i2c-0.dtsi"
++/include/ "pq3-i2c-1.dtsi"
++/include/ "pq3-duart-0.dtsi"
++
++/include/ "pq3-espi-0.dtsi"
++ spi@7000 {
++ fsl,espi-num-chipselects = <4>;
++ };
++
++/include/ "pq3-gpio-0.dtsi"
++
++ L2: l2-cache-controller@20000 {
++ compatible = "fsl,p1021-l2-cache-controller";
++ reg = <0x20000 0x1000>;
++ cache-line-size = <32>; // 32 bytes
++ cache-size = <0x40000>; // L2,256K
++ interrupts = <16 2 0 0>;
++ };
++
++/include/ "pq3-dma-0.dtsi"
++/include/ "pq3-usb2-dr-0.dtsi"
++ usb@22000 {
++ compatible = "fsl-usb2-dr-v1.6", "fsl-usb2-dr";
++ };
++
++/include/ "pq3-esdhc-0.dtsi"
++ sdhc@2e000 {
++ sdhci,auto-cmd12;
++ };
++
++/include/ "pq3-sec3.3-0.dtsi"
++
++/include/ "pq3-mpic.dtsi"
++/include/ "pq3-mpic-timer-B.dtsi"
++
++ ptp_timer: ptimer@b0e00 {
++ compatible = "fsl,gianfar-ptp-timer";
++ reg = <0xb0e00 0xb0>;
++ fsl,ts-to-buffer;
++ fsl,tmr-prsc = <0x2>;
++ fsl,clock-source-select = <1>;
++ };
++
++/include/ "pq3-etsec2-0.dtsi"
++ enet0: enet0_grp2: ethernet@b0000 {
++ fsl,pmc-handle = <&etsec1_clk>;
++ ptimer-handle = <&ptp_timer>;
++ };
++
++/include/ "pq3-etsec2-1.dtsi"
++ enet1: enet1_grp2: ethernet@b1000 {
++ fsl,pmc-handle = <&etsec2_clk>;
++ ptimer-handle = <&ptp_timer>;
++ };
++
++/include/ "pq3-etsec2-2.dtsi"
++ enet2: enet2_grp2: ethernet@b2000 {
++ fsl,pmc-handle = <&etsec3_clk>;
++ ptimer-handle = <&ptp_timer>;
++ };
++
++ global-utilities@e0000 {
++ compatible = "fsl,p1021-guts";
++ reg = <0xe0000 0x1000>;
++ fsl,has-rstcr;
++ };
++
++/include/ "pq3-power.dtsi"
++};
++
++&qe {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "qe";
++ compatible = "fsl,qe";
++ fsl,qe-num-riscs = <1>;
++ fsl,qe-num-snums = <28>;
++
++ qeic: interrupt-controller@80 {
++ interrupt-controller;
++ compatible = "fsl,qe-ic";
++ #address-cells = <0>;
++ #interrupt-cells = <1>;
++ reg = <0x80 0x80>;
++ interrupts = <63 2 0 0 60 2 0 0>; //high:47 low:44
++ };
++
++ ucc@2000 {
++ cell-index = <1>;
++ reg = <0x2000 0x200>;
++ interrupts = <32>;
++ interrupt-parent = <&qeic>;
++ };
++
++ mdio@2120 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ reg = <0x2120 0x18>;
++ compatible = "fsl,ucc-mdio";
++ };
++
++ ucc@2400 {
++ cell-index = <5>;
++ reg = <0x2400 0x200>;
++ interrupts = <40>;
++ interrupt-parent = <&qeic>;
++ };
++
++ ucc@2600 {
++ cell-index = <7>;
++ reg = <0x2600 0x200>;
++ interrupts = <42>;
++ 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>;
++ };
++ };
++};
++
++/include/ "pq3-etsec2-grp2-0.dtsi"
++/include/ "pq3-etsec2-grp2-1.dtsi"
++/include/ "pq3-etsec2-grp2-2.dtsi"
+diff --git a/arch/powerpc/boot/dts/fsl/p1021si-pre.dtsi b/arch/powerpc/boot/dts/fsl/p1021si-pre.dtsi
+new file mode 100644
+index 0000000..36161b5
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/p1021si-pre.dtsi
+@@ -0,0 +1,71 @@
++/*
++ * P1021/P1012 Silicon/SoC Device Tree Source (pre include)
++ *
++ * Copyright 2011 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.
++ */
++
++/dts-v1/;
++
++/include/ "e500v2_power_isa.dtsi"
++
++/ {
++ compatible = "fsl,P1021";
++ #address-cells = <2>;
++ #size-cells = <2>;
++ interrupt-parent = <&mpic>;
++
++ aliases {
++ serial0 = &serial0;
++ serial1 = &serial1;
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ ethernet2 = &enet2;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PowerPC,P1021@0 {
++ device_type = "cpu";
++ reg = <0x0>;
++ next-level-cache = <&L2>;
++ };
++
++ PowerPC,P1021@1 {
++ device_type = "cpu";
++ reg = <0x1>;
++ next-level-cache = <&L2>;
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/p1022si-post.dtsi b/arch/powerpc/boot/dts/fsl/p1022si-post.dtsi
+new file mode 100644
+index 0000000..3f3fc1e
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/p1022si-post.dtsi
+@@ -0,0 +1,252 @@
++/*
++ * P1022/P1013 Silicon/SoC Device Tree Source (post include)
++ *
++ * Copyright 2011 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.
++ */
++
++&lbc {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ /*
++ * The localbus on the P1022 is not a simple-bus because of the eLBC
++ * pin muxing when the DIU is enabled.
++ */
++ compatible = "fsl,p1022-elbc", "fsl,elbc";
++ interrupts = <19 2 0 0>;
++};
++
++/* controller at 0x9000 */
++&pci0 {
++ compatible = "fsl,p1022-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 0 0>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x4 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x5 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0x6 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0x7 0x1 0x0 0x0
++ >;
++ };
++};
++
++/* controller at 0xa000 */
++&pci1 {
++ compatible = "fsl,p1022-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 0 0>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x0 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x1 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0x2 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0x3 0x1 0x0 0x0
++ >;
++ };
++};
++
++/* controller at 0xb000 */
++&pci2 {
++ compatible = "fsl,p1022-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 0 0>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x8 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x9 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0xa 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0xb 0x1 0x0 0x0
++ >;
++ };
++};
++
++&soc {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ compatible = "fsl,p1022-immr", "simple-bus";
++ bus-frequency = <0>; // Filled out by uboot.
++
++ ecm-law@0 {
++ compatible = "fsl,ecm-law";
++ reg = <0x0 0x1000>;
++ fsl,num-laws = <12>;
++ };
++
++ ecm@1000 {
++ compatible = "fsl,p1022-ecm", "fsl,ecm";
++ reg = <0x1000 0x1000>;
++ interrupts = <16 2 0 0>;
++ };
++
++ memory-controller@2000 {
++ compatible = "fsl,p1022-memory-controller";
++ reg = <0x2000 0x1000>;
++ interrupts = <16 2 0 0>;
++ };
++
++/include/ "pq3-i2c-0.dtsi"
++/include/ "pq3-i2c-1.dtsi"
++/include/ "pq3-duart-0.dtsi"
++/include/ "pq3-espi-0.dtsi"
++ spi@7000 {
++ fsl,espi-num-chipselects = <4>;
++ };
++
++/include/ "pq3-dma-1.dtsi"
++ dma@c300 {
++ dma00: dma-channel@0 {
++ compatible = "fsl,ssi-dma-channel";
++ };
++ dma01: dma-channel@80 {
++ compatible = "fsl,ssi-dma-channel";
++ };
++ };
++
++/include/ "pq3-gpio-0.dtsi"
++
++ display@10000 {
++ compatible = "fsl,diu", "fsl,p1022-diu";
++ reg = <0x10000 1000>;
++ interrupts = <64 2 0 0>;
++ };
++
++ ssi@15000 {
++ compatible = "fsl,mpc8610-ssi";
++ cell-index = <0>;
++ reg = <0x15000 0x100>;
++ interrupts = <75 2 0 0>;
++ fsl,playback-dma = <&dma00>;
++ fsl,capture-dma = <&dma01>;
++ fsl,fifo-depth = <15>;
++ };
++
++/include/ "pq3-tdm1.0-0.dtsi"
++/include/ "pq3-sata2-0.dtsi"
++/include/ "pq3-sata2-1.dtsi"
++
++ L2: l2-cache-controller@20000 {
++ compatible = "fsl,p1022-l2-cache-controller";
++ reg = <0x20000 0x1000>;
++ cache-line-size = <32>; // 32 bytes
++ cache-size = <0x40000>; // L2,256K
++ interrupts = <16 2 0 0>;
++ };
++
++/include/ "pq3-dma-0.dtsi"
++/include/ "pq3-usb2-dr-0.dtsi"
++ usb@22000 {
++ compatible = "fsl-usb2-dr-v1.6", "fsl-usb2-dr";
++ };
++/include/ "pq3-usb2-dr-1.dtsi"
++ usb@23000 {
++ compatible = "fsl-usb2-dr-v1.6", "fsl-usb2-dr";
++ };
++
++/include/ "pq3-esdhc-0.dtsi"
++ sdhc@2e000 {
++ compatible = "fsl,p1022-esdhc", "fsl,esdhc";
++ sdhci,auto-cmd12;
++ };
++
++/include/ "pq3-sec3.3-0.dtsi"
++/include/ "pq3-mpic.dtsi"
++/include/ "pq3-mpic-timer-B.dtsi"
++
++/include/ "pq3-etsec2-0.dtsi"
++ enet0: enet0_grp2: ethernet@b0000 {
++ fsl,wake-on-filer;
++ fsl,pmc-handle = <&etsec1_clk>;
++ };
++
++/include/ "pq3-etsec2-1.dtsi"
++ enet1: enet1_grp2: ethernet@b1000 {
++ fsl,wake-on-filer;
++ fsl,pmc-handle = <&etsec2_clk>;
++ };
++
++ global-utilities@e0000 {
++ compatible = "fsl,p1022-guts";
++ reg = <0xe0000 0x1000>;
++ fsl,has-rstcr;
++ };
++
++/include/ "pq3-power.dtsi"
++ power@e0070 {
++ compatible = "fsl,p1022-pmc", "fsl,mpc8536-pmc",
++ "fsl,mpc8548-pmc";
++ };
++
++};
++
++/include/ "pq3-etsec2-grp2-0.dtsi"
++/include/ "pq3-etsec2-grp2-1.dtsi"
+diff --git a/arch/powerpc/boot/dts/fsl/p1022si-pre.dtsi b/arch/powerpc/boot/dts/fsl/p1022si-pre.dtsi
+new file mode 100644
+index 0000000..1956dea
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/p1022si-pre.dtsi
+@@ -0,0 +1,71 @@
++/*
++ * P1022/P1013 Silicon/SoC Device Tree Source (pre include)
++ *
++ * Copyright 2011 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.
++ */
++
++/dts-v1/;
++
++/include/ "e500v2_power_isa.dtsi"
++
++/ {
++ compatible = "fsl,P1022";
++ #address-cells = <2>;
++ #size-cells = <2>;
++ interrupt-parent = <&mpic>;
++
++ aliases {
++ serial0 = &serial0;
++ serial1 = &serial1;
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ pci2 = &pci2;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PowerPC,P1022@0 {
++ device_type = "cpu";
++ reg = <0x0>;
++ next-level-cache = <&L2>;
++ };
++
++ PowerPC,P1022@1 {
++ device_type = "cpu";
++ reg = <0x1>;
++ next-level-cache = <&L2>;
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/p1023si-post.dtsi b/arch/powerpc/boot/dts/fsl/p1023si-post.dtsi
+new file mode 100644
+index 0000000..7bb575a
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/p1023si-post.dtsi
+@@ -0,0 +1,413 @@
++/*
++ * P1023/P1017 Silicon/SoC Device Tree Source (post include)
++ *
++ * Copyright 2011-2012 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.
++ */
++
++&lbc {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ compatible = "fsl,p1023-elbc", "fsl,elbc", "simple-bus";
++ interrupts = <19 2 0 0>;
++};
++
++/* controller at 0xa000 */
++&pci0 {
++ compatible = "fsl,p1023-pcie", "fsl,qoriq-pcie-v2.2";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0x0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 0 0>;
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 0 0>;
++ };
++};
++
++/* controller at 0x9000 */
++&pci1 {
++ compatible = "fsl,p1023-pcie", "fsl,qoriq-pcie-v2.2";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 0 0>;
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 0 0>;
++ };
++};
++
++/* controller at 0xb000 */
++&pci2 {
++ compatible = "fsl,p1023-pcie", "fsl,qoriq-pcie-v2.2";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0x0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 0 0>;
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 0 0>;
++ };
++};
++
++&qportals {
++ #address-cells = <0x1>;
++ #size-cells = <0x1>;
++ compatible = "simple-bus";
++ qportal0: qman-portal@0 {
++ cell-index = <0x0>;
++ compatible = "fsl,qman-portal";
++ reg = <0x0 0x4000 0x100000 0x1000>;
++ interrupts = <29 2 0 0>;
++ fsl,qman-channel-id = <0x0>;
++ };
++
++ qportal1: qman-portal@4000 {
++ cell-index = <0x1>;
++ compatible = "fsl,qman-portal";
++ reg = <0x4000 0x4000 0x101000 0x1000>;
++ interrupts = <31 2 0 0>;
++ fsl,qman-channel-id = <0x1>;
++ };
++
++ qportal2: qman-portal@8000 {
++ cell-index = <0x2>;
++ compatible = "fsl,qman-portal";
++ reg = <0x8000 0x4000 0x102000 0x1000>;
++ interrupts = <33 2 0 0>;
++ fsl,qman-channel-id = <0x2>;
++ };
++};
++
++&bportals {
++ #address-cells = <0x1>;
++ #size-cells = <0x1>;
++ compatible = "simple-bus";
++ bman-portal@0 {
++ cell-index = <0x0>;
++ compatible = "fsl,bman-portal";
++ reg = <0x0 0x4000 0x100000 0x1000>;
++ interrupts = <30 2 0 0>;
++ };
++ bman-portal@4000 {
++ cell-index = <0x1>;
++ compatible = "fsl,bman-portal";
++ reg = <0x4000 0x4000 0x101000 0x1000>;
++ interrupts = <32 2 0 0>;
++ };
++ bman-portal@8000 {
++ cell-index = <2>;
++ compatible = "fsl,bman-portal";
++ reg = <0x8000 0x4000 0x102000 0x1000>;
++ interrupts = <34 2 0 0>;
++ };
++};
++
++&soc {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ compatible = "fsl,p1023-immr", "simple-bus";
++ bus-frequency = <0>; // Filled out by uboot.
++
++ ecm-law@0 {
++ compatible = "fsl,ecm-law";
++ reg = <0x0 0x1000>;
++ fsl,num-laws = <12>;
++ };
++
++ ecm@1000 {
++ compatible = "fsl,p1023-ecm", "fsl,ecm";
++ reg = <0x1000 0x1000>;
++ interrupts = <16 2 0 0>;
++ };
++
++ memory-controller@2000 {
++ compatible = "fsl,p1023-memory-controller";
++ reg = <0x2000 0x1000>;
++ interrupts = <16 2 0 0>;
++ };
++
++/include/ "pq3-i2c-0.dtsi"
++/include/ "pq3-i2c-1.dtsi"
++/include/ "pq3-duart-0.dtsi"
++
++/include/ "pq3-espi-0.dtsi"
++ spi@7000 {
++ fsl,espi-num-chipselects = <4>;
++ };
++
++/include/ "pq3-gpio-0.dtsi"
++
++ L2: l2-cache-controller@20000 {
++ compatible = "fsl,p1023-l2-cache-controller";
++ reg = <0x20000 0x1000>;
++ cache-line-size = <32>; // 32 bytes
++ cache-size = <0x40000>; // L2,256K
++ interrupts = <16 2 0 0>;
++ };
++
++/include/ "pq3-dma-0.dtsi"
++/include/ "pq3-usb2-dr-0.dtsi"
++ usb@22000 {
++ compatible = "fsl-usb2-dr-v1.6", "fsl-usb2-dr";
++ };
++
++ crypto: crypto@300000 {
++ compatible = "fsl,sec-v4.2", "fsl,sec-v4.0";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0x30000 0x10000>;
++ ranges = <0 0x30000 0x10000>;
++ interrupts = <58 2 0 0>;
++
++ sec_jr0: jr@1000 {
++ compatible = "fsl,sec-v4.2-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x1000 0x1000>;
++ interrupts = <45 2 0 0>;
++ };
++
++ sec_jr1: jr@2000 {
++ compatible = "fsl,sec-v4.2-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x2000 0x1000>;
++ interrupts = <45 2 0 0>;
++ };
++
++ sec_jr2: jr@3000 {
++ compatible = "fsl,sec-v4.2-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x3000 0x1000>;
++ interrupts = <57 2 0 0>;
++ };
++
++ sec_jr3: jr@4000 {
++ compatible = "fsl,sec-v4.2-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x4000 0x1000>;
++ interrupts = <57 2 0 0>;
++ };
++
++ rtic@6000 {
++ compatible = "fsl,sec-v4.2-rtic",
++ "fsl,sec-v4.0-rtic";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0x6000 0x100>;
++ ranges = <0x0 0x6100 0xe00>;
++
++ rtic_a: rtic-a@0 {
++ compatible = "fsl,sec-v4.2-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x00 0x20 0x100 0x80>;
++ };
++
++ rtic_b: rtic-b@20 {
++ compatible = "fsl,sec-v4.2-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x20 0x20 0x200 0x80>;
++ };
++
++ rtic_c: rtic-c@40 {
++ compatible = "fsl,sec-v4.2-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x40 0x20 0x300 0x80>;
++ };
++
++ rtic_d: rtic-d@60 {
++ compatible = "fsl,sec-v4.2-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x60 0x20 0x500 0x80>;
++ };
++ };
++ };
++
++/include/ "pq3-mpic.dtsi"
++/include/ "pq3-mpic-timer-B.dtsi"
++
++ qman: qman@88000 {
++ compatible = "fsl,qman";
++ reg = <0x88000 0x1000>;
++ interrupts = <16 2 0 0>;
++ };
++
++ bman: bman@8a000 {
++ compatible = "fsl,bman";
++ reg = <0x8a000 0x1000>;
++ interrupts = <16 2 0 0>;
++ };
++
++ global-utilities@e0000 {
++ compatible = "fsl,p1023-guts";
++ reg = <0xe0000 0x1000>;
++ fsl,has-rstcr;
++ };
++
++ fman0: fman@100000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ cell-index = <0>;
++ compatible = "fsl,fman", "simple-bus";
++ ranges = <0 0x100000 0x100000>;
++ reg = <0x100000 0x100000>;
++ clock-frequency = <0>;
++ interrupts = <
++ 24 2 0 0
++ 16 2 0 0>;
++ cc@0 {
++ compatible = "fsl,fman-cc";
++ };
++ muram@0 {
++ compatible = "fsl,fman-muram";
++ reg = <0x0 0x10000>;
++ };
++ bmi@80000 {
++ compatible = "fsl,fman-bmi";
++ reg = <0x80000 0x400>;
++ };
++ qmi@80400 {
++ compatible = "fsl,fman-qmi";
++ reg = <0x80400 0x400>;
++ };
++ 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>;
++ };
++ fman0_rx0: port@88000 {
++ cell-index = <0>;
++ compatible = "fsl,fman-port-1g-rx";
++ reg = <0x88000 0x1000>;
++ };
++ fman0_rx1: port@89000 {
++ cell-index = <1>;
++ compatible = "fsl,fman-port-1g-rx";
++ reg = <0x89000 0x1000>;
++ };
++ fman0_tx0: port@a8000 {
++ cell-index = <0>;
++ compatible = "fsl,fman-port-1g-tx";
++ reg = <0xa8000 0x1000>;
++ fsl,qman-channel-id = <0x40>;
++ };
++ fman0_tx1: port@a9000 {
++ cell-index = <1>;
++ compatible = "fsl,fman-port-1g-tx";
++ reg = <0xa9000 0x1000>;
++ fsl,qman-channel-id = <0x41>;
++ };
++ fman0_oh1: port@82000 {
++ cell-index = <1>;
++ compatible = "fsl,fman-port-oh";
++ reg = <0x82000 0x1000>;
++ fsl,qman-channel-id = <0x43>;
++ };
++ fman0_oh2: port@83000 {
++ cell-index = <2>;
++ compatible = "fsl,fman-port-oh";
++ reg = <0x83000 0x1000>;
++ fsl,qman-channel-id = <0x44>;
++ };
++ fman0_oh3: port@84000 {
++ cell-index = <3>;
++ compatible = "fsl,fman-port-oh";
++ reg = <0x84000 0x1000>;
++ fsl,qman-channel-id = <0x45>;
++ };
++ fman0_oh4: port@85000 {
++ cell-index = <4>;
++ compatible = "fsl,fman-port-oh";
++ reg = <0x85000 0x1000>;
++ fsl,qman-channel-id = <0x46>;
++ };
++ enet0: ethernet@e0000 {
++ cell-index = <0>;
++ compatible = "fsl,fman-1g-mac";
++ reg = <0xe0000 0x1000>;
++ fsl,port-handles = <&fman0_rx0 &fman0_tx0>;
++ ptimer-handle = <&ptp_timer0>;
++ };
++ enet1: ethernet@e2000 {
++ cell-index = <1>;
++ compatible = "fsl,fman-1g-mac";
++ reg = <0xe2000 0x1000>;
++ fsl,port-handles = <&fman0_rx1 &fman0_tx1>;
++ ptimer-handle = <&ptp_timer0>;
++ };
++ mdio0: mdio@e1120 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-mdio";
++ reg = <0xe1120 0xee0>;
++ interrupts = <26 1 0 0>;
++ };
++
++ ptp_timer0: rtc@fe000 {
++ compatible = "fsl,fman-rtc";
++ reg = <0xfe000 0x1000>;
++ };
++ };
++
++};
+diff --git a/arch/powerpc/boot/dts/fsl/p1023si-pre.dtsi b/arch/powerpc/boot/dts/fsl/p1023si-pre.dtsi
+new file mode 100644
+index 0000000..6cfff45
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/p1023si-pre.dtsi
+@@ -0,0 +1,83 @@
++/*
++ * P1023/P1017 Silicon/SoC Device Tree Source (pre include)
++ *
++ * Copyright 2011 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.
++ */
++
++/dts-v1/;
++
++/include/ "e500v2_power_isa.dtsi"
++
++/ {
++ compatible = "fsl,P1023";
++ #address-cells = <2>;
++ #size-cells = <2>;
++ interrupt-parent = <&mpic>;
++
++ aliases {
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ pci2 = &pci2;
++
++ crypto = &crypto;
++ sec_jr0 = &sec_jr0;
++ sec_jr1 = &sec_jr1;
++ sec_jr2 = &sec_jr2;
++ sec_jr3 = &sec_jr3;
++ rtic_a = &rtic_a;
++ rtic_b = &rtic_b;
++ rtic_c = &rtic_c;
++ rtic_d = &rtic_d;
++
++ bman = &bman;
++ qman = &qman;
++ fman0 = &fman0;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ cpu0: PowerPC,P1023@0 {
++ device_type = "cpu";
++ reg = <0x0>;
++ next-level-cache = <&L2>;
++ };
++
++ cpu1: PowerPC,P1023@1 {
++ device_type = "cpu";
++ reg = <0x1>;
++ next-level-cache = <&L2>;
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/p2020si-post.dtsi b/arch/powerpc/boot/dts/fsl/p2020si-post.dtsi
+new file mode 100644
+index 0000000..7d155b3
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/p2020si-post.dtsi
+@@ -0,0 +1,215 @@
++/*
++ * P2020/P2010 Silicon/SoC Device Tree Source (post include)
++ *
++ * Copyright 2011 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.
++ */
++
++&lbc {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ compatible = "fsl,p2020-elbc", "fsl,elbc", "simple-bus";
++ interrupts = <19 2 0 0>;
++};
++
++/* controller at 0xa000 */
++&pci0 {
++ compatible = "fsl,mpc8548-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <26 2 0 0>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <26 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x0 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x1 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0x2 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0x3 0x1 0x0 0x0
++ >;
++ };
++};
++
++/* controller at 0x9000 */
++&pci1 {
++ compatible = "fsl,mpc8548-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <25 2 0 0>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <25 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x4 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x5 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0x6 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0x7 0x1 0x0 0x0
++ >;
++ };
++};
++
++/* controller at 0x8000 */
++&pci2 {
++ compatible = "fsl,mpc8548-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 255>;
++ clock-frequency = <33333333>;
++ interrupts = <24 2 0 0>;
++
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <24 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0x0 0x0 0x1 &mpic 0x8 0x1 0x0 0x0
++ 0000 0x0 0x0 0x2 &mpic 0x9 0x1 0x0 0x0
++ 0000 0x0 0x0 0x3 &mpic 0xa 0x1 0x0 0x0
++ 0000 0x0 0x0 0x4 &mpic 0xb 0x1 0x0 0x0
++ >;
++ };
++};
++
++&soc {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ compatible = "fsl,p2020-immr", "simple-bus";
++ bus-frequency = <0>; // Filled out by uboot.
++
++ ecm-law@0 {
++ compatible = "fsl,ecm-law";
++ reg = <0x0 0x1000>;
++ fsl,num-laws = <12>;
++ };
++
++ ecm@1000 {
++ compatible = "fsl,p2020-ecm", "fsl,ecm";
++ reg = <0x1000 0x1000>;
++ interrupts = <17 2 0 0>;
++ };
++
++ memory-controller@2000 {
++ compatible = "fsl,p2020-memory-controller";
++ reg = <0x2000 0x1000>;
++ interrupts = <18 2 0 0>;
++ };
++
++/include/ "pq3-i2c-0.dtsi"
++/include/ "pq3-i2c-1.dtsi"
++/include/ "pq3-duart-0.dtsi"
++/include/ "pq3-espi-0.dtsi"
++ spi0: spi@7000 {
++ fsl,espi-num-chipselects = <4>;
++ };
++
++/include/ "pq3-dma-1.dtsi"
++/include/ "pq3-gpio-0.dtsi"
++
++ L2: l2-cache-controller@20000 {
++ compatible = "fsl,p2020-l2-cache-controller";
++ reg = <0x20000 0x1000>;
++ cache-line-size = <32>; // 32 bytes
++ cache-size = <0x80000>; // L2,512K
++ interrupts = <16 2 0 0>;
++ };
++
++/include/ "pq3-dma-0.dtsi"
++/include/ "pq3-usb2-dr-0.dtsi"
++ usb@22000 {
++ compatible = "fsl-usb2-dr-v1.6", "fsl-usb2-dr";
++ };
++/include/ "pq3-etsec1-0.dtsi"
++ enet0: ethernet@24000 {
++ fsl,pmc-handle = <&etsec1_clk>;
++
++ };
++/include/ "pq3-etsec1-timer-0.dtsi"
++
++ ptp_clock@24e00 {
++ interrupts = <68 2 0 0 69 2 0 0 70 2 0 0>;
++ };
++
++
++/include/ "pq3-etsec1-1.dtsi"
++ enet1: ethernet@25000 {
++ fsl,pmc-handle = <&etsec2_clk>;
++ };
++
++/include/ "pq3-etsec1-2.dtsi"
++ enet2: ethernet@26000 {
++ fsl,pmc-handle = <&etsec3_clk>;
++ };
++
++/include/ "pq3-esdhc-0.dtsi"
++ sdhc@2e000 {
++ compatible = "fsl,p2020-esdhc", "fsl,esdhc";
++ };
++
++/include/ "pq3-sec3.1-0.dtsi"
++/include/ "pq3-mpic.dtsi"
++/include/ "pq3-mpic-timer-B.dtsi"
++
++ global-utilities@e0000 {
++ compatible = "fsl,p2020-guts";
++ reg = <0xe0000 0x1000>;
++ fsl,has-rstcr;
++ };
++
++/include/ "pq3-power.dtsi"
++};
+diff --git a/arch/powerpc/boot/dts/fsl/p2020si-pre.dtsi b/arch/powerpc/boot/dts/fsl/p2020si-pre.dtsi
+new file mode 100644
+index 0000000..42bf3c6
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/p2020si-pre.dtsi
+@@ -0,0 +1,72 @@
++/*
++ * P2020/P2010 Silicon/SoC Device Tree Source (pre include)
++ *
++ * Copyright 2011 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.
++ */
++
++/dts-v1/;
++
++/include/ "e500v2_power_isa.dtsi"
++
++/ {
++ compatible = "fsl,P2020";
++ #address-cells = <2>;
++ #size-cells = <2>;
++ interrupt-parent = <&mpic>;
++
++ aliases {
++ serial0 = &serial0;
++ serial1 = &serial1;
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ ethernet2 = &enet2;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ pci2 = &pci2;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PowerPC,P2020@0 {
++ device_type = "cpu";
++ reg = <0x0>;
++ next-level-cache = <&L2>;
++ };
++
++ PowerPC,P2020@1 {
++ device_type = "cpu";
++ reg = <0x1>;
++ next-level-cache = <&L2>;
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi b/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi
+new file mode 100644
+index 0000000..d9a9bf4
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi
+@@ -0,0 +1,407 @@
++/*
++ * P2041/P2040 Silicon/SoC Device Tree Source (post include)
++ *
++ * Copyright 2011 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.
++ */
++
++&lbc {
++ compatible = "fsl,p2041-elbc", "fsl,elbc", "simple-bus";
++ interrupts = <25 2 0 0>;
++ #address-cells = <2>;
++ #size-cells = <1>;
++};
++
++/* controller at 0x200000 */
++&pci0 {
++ compatible = "fsl,p2041-pcie", "fsl,qoriq-pcie-v2.2";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0x0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 1 15>;
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 1 15>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0 0 1 &mpic 40 1 0 0
++ 0000 0 0 2 &mpic 1 1 0 0
++ 0000 0 0 3 &mpic 2 1 0 0
++ 0000 0 0 4 &mpic 3 1 0 0
++ >;
++ };
++};
++
++/* controller at 0x201000 */
++&pci1 {
++ compatible = "fsl,p2041-pcie", "fsl,qoriq-pcie-v2.2";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 1 14>;
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 1 14>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0 0 1 &mpic 41 1 0 0
++ 0000 0 0 2 &mpic 5 1 0 0
++ 0000 0 0 3 &mpic 6 1 0 0
++ 0000 0 0 4 &mpic 7 1 0 0
++ >;
++ };
++};
++
++/* controller at 0x202000 */
++&pci2 {
++ compatible = "fsl,p2041-pcie", "fsl,qoriq-pcie-v2.2";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0x0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 1 13>;
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 1 13>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0 0 1 &mpic 42 1 0 0
++ 0000 0 0 2 &mpic 9 1 0 0
++ 0000 0 0 3 &mpic 10 1 0 0
++ 0000 0 0 4 &mpic 11 1 0 0
++ >;
++ };
++};
++
++&rio {
++ compatible = "fsl,srio";
++ interrupts = <16 2 1 11>;
++ #address-cells = <2>;
++ #size-cells = <2>;
++ ranges;
++
++ port1 {
++ #address-cells = <2>;
++ #size-cells = <2>;
++ cell-index = <1>;
++ };
++
++ port2 {
++ #address-cells = <2>;
++ #size-cells = <2>;
++ cell-index = <2>;
++ };
++};
++
++&dcsr {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,dcsr", "simple-bus";
++
++ dcsr-epu@0 {
++ compatible = "fsl,p2041-dcsr-epu", "fsl,dcsr-epu";
++ interrupts = <52 2 0 0
++ 84 2 0 0
++ 85 2 0 0>;
++ reg = <0x0 0x1000>;
++ };
++ dcsr-npc {
++ compatible = "fsl,dcsr-npc";
++ reg = <0x1000 0x1000 0x1000000 0x8000>;
++ };
++ dcsr-nxc@2000 {
++ compatible = "fsl,dcsr-nxc";
++ reg = <0x2000 0x1000>;
++ };
++ dcsr-corenet {
++ compatible = "fsl,dcsr-corenet";
++ reg = <0x8000 0x1000 0xB0000 0x1000>;
++ };
++ dcsr-dpaa@9000 {
++ compatible = "fsl,p2041-dcsr-dpaa", "fsl,dcsr-dpaa";
++ reg = <0x9000 0x1000>;
++ };
++ dcsr-ocn@11000 {
++ compatible = "fsl,p2041-dcsr-ocn", "fsl,dcsr-ocn";
++ reg = <0x11000 0x1000>;
++ };
++ dcsr-ddr@12000 {
++ compatible = "fsl,dcsr-ddr";
++ dev-handle = <&ddr1>;
++ reg = <0x12000 0x1000>;
++ };
++ dcsr-nal@18000 {
++ compatible = "fsl,p2041-dcsr-nal", "fsl,dcsr-nal";
++ reg = <0x18000 0x1000>;
++ };
++ dcsr-rcpm@22000 {
++ compatible = "fsl,p2041-dcsr-rcpm", "fsl,dcsr-rcpm";
++ reg = <0x22000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@40000 {
++ compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu0>;
++ reg = <0x40000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@41000 {
++ compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu1>;
++ reg = <0x41000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@42000 {
++ compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu2>;
++ reg = <0x42000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@43000 {
++ compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu3>;
++ reg = <0x43000 0x1000>;
++ };
++};
++
++&bportals {
++/include/ "qoriq-bman1-portals.dtsi"
++};
++
++&qportals {
++/include/ "qoriq-qman1-portals.dtsi"
++};
++
++&soc {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ compatible = "simple-bus";
++
++ soc-sram-error {
++ compatible = "fsl,soc-sram-error";
++ interrupts = <16 2 1 29>;
++ };
++
++ corenet-law@0 {
++ compatible = "fsl,corenet-law";
++ reg = <0x0 0x1000>;
++ fsl,num-laws = <32>;
++ };
++
++ ddr1: memory-controller@8000 {
++ compatible = "fsl,qoriq-memory-controller-v4.5", "fsl,qoriq-memory-controller";
++ reg = <0x8000 0x1000>;
++ interrupts = <16 2 1 23>;
++ };
++
++ cpc: l3-cache-controller@10000 {
++ compatible = "fsl,p2041-l3-cache-controller", "fsl,p4080-l3-cache-controller", "cache";
++ reg = <0x10000 0x1000>;
++ interrupts = <16 2 1 27>;
++ };
++
++ corenet-cf@18000 {
++ compatible = "fsl,corenet-cf";
++ reg = <0x18000 0x1000>;
++ interrupts = <16 2 1 31>;
++ fsl,ccf-num-csdids = <32>;
++ fsl,ccf-num-snoopids = <32>;
++ };
++
++ iommu@20000 {
++ compatible = "fsl,pamu-v1.0", "fsl,pamu";
++ reg = <0x20000 0x4000>;
++ interrupts = <
++ 24 2 0 0
++ 16 2 1 30>;
++ };
++
++/include/ "qoriq-mpic.dtsi"
++
++ guts: global-utilities@e0000 {
++ compatible = "fsl,qoriq-device-config-1.0";
++ reg = <0xe0000 0xe00>;
++ fsl,has-rstcr;
++ #sleep-cells = <1>;
++ fsl,liodn-bits = <12>;
++ };
++
++ pins: global-utilities@e0e00 {
++ compatible = "fsl,qoriq-pin-control-1.0";
++ reg = <0xe0e00 0x200>;
++ #sleep-cells = <2>;
++ };
++
++ clockgen: global-utilities@e1000 {
++ compatible = "fsl,p2041-clockgen", "fsl,qoriq-clockgen-1.0";
++ reg = <0xe1000 0x1000>;
++ clock-frequency = <0>;
++ };
++
++ rcpm: global-utilities@e2000 {
++ compatible = "fsl,qoriq-rcpm-1.0";
++ reg = <0xe2000 0x1000>;
++ #sleep-cells = <1>;
++ };
++
++ sfp: sfp@e8000 {
++ compatible = "fsl,p2041-sfp", "fsl,qoriq-sfp-1.0";
++ reg = <0xe8000 0x1000>;
++ };
++
++ serdes: serdes@ea000 {
++ compatible = "fsl,p2041-serdes";
++ reg = <0xea000 0x1000>;
++ };
++
++/include/ "qoriq-dma-0.dtsi"
++/include/ "qoriq-dma-1.dtsi"
++/include/ "qoriq-espi-0.dtsi"
++ spi@110000 {
++ fsl,espi-num-chipselects = <4>;
++ };
++
++/include/ "qoriq-esdhc-0.dtsi"
++ sdhc@114000 {
++ sdhci,auto-cmd12;
++ };
++
++/include/ "qoriq-i2c-0.dtsi"
++/include/ "qoriq-i2c-1.dtsi"
++/include/ "qoriq-duart-0.dtsi"
++/include/ "qoriq-duart-1.dtsi"
++/include/ "qoriq-gpio-0.dtsi"
++/include/ "qoriq-usb2-mph-0.dtsi"
++ usb0: usb@210000 {
++ compatible = "fsl-usb2-mph-v1.6", "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph";
++ phy_type = "utmi";
++ port0;
++ };
++
++/include/ "qoriq-usb2-dr-0.dtsi"
++ usb1: usb@211000 {
++ compatible = "fsl-usb2-dr-v1.6", "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr";
++ dr_mode = "host";
++ phy_type = "utmi";
++ };
++
++/include/ "qoriq-sata2-0.dtsi"
++ sata@220000 {
++ compatible = "fsl,p2041-sata", "fsl,pq-sata-v2";
++ };
++/include/ "qoriq-sata2-1.dtsi"
++ sata@221000 {
++ compatible = "fsl,p2041-sata", "fsl,pq-sata-v2";
++ };
++/include/ "qoriq-sec4.2-0.dtsi"
++/include/ "qoriq-pme-0.dtsi"
++/include/ "qoriq-rman-0.dtsi"
++ rman: rman@1e0000 {
++ fsl,qman-channels-id = <0x62 0x63>;
++ };
++
++/include/ "qoriq-qman1.dtsi"
++/include/ "qoriq-bman1.dtsi"
++
++/include/ "qoriq-fman-0.dtsi"
++/include/ "qoriq-fman-0-1g-0.dtsi"
++/include/ "qoriq-fman-0-1g-1.dtsi"
++/include/ "qoriq-fman-0-1g-2.dtsi"
++/include/ "qoriq-fman-0-1g-3.dtsi"
++/include/ "qoriq-fman-0-1g-4.dtsi"
++/include/ "qoriq-fman-0-10g-0.dtsi"
++ fman0: fman@400000 {
++ /* tx - 1g - 0 */
++ port@a8000 {
++ fsl,qman-channel-id = <0x41>;
++ };
++ /* tx - 1g - 1 */
++ port@a9000 {
++ fsl,qman-channel-id = <0x42>;
++ };
++ /* tx - 1g - 2 */
++ port@aa000 {
++ fsl,qman-channel-id = <0x43>;
++ };
++ /* tx - 1g - 3 */
++ port@ab000 {
++ fsl,qman-channel-id = <0x44>;
++ };
++ /* tx - 1g - 4 */
++ port@ac000 {
++ fsl,qman-channel-id = <0x45>;
++ };
++ /* tx - 10g - 0 */
++ port@b0000 {
++ fsl,qman-channel-id = <0x40>;
++ };
++ /* offline 0 */
++ port@81000 {
++ fsl,qman-channel-id = <0x46>;
++ };
++ /* offline 1 */
++ port@82000 {
++ fsl,qman-channel-id = <0x47>;
++ };
++ /* offline 2 */
++ port@83000 {
++ fsl,qman-channel-id = <0x48>;
++ };
++ /* offline 3 */
++ port@84000 {
++ fsl,qman-channel-id = <0x49>;
++ };
++ /* offline 4 */
++ port@85000 {
++ fsl,qman-channel-id = <0x4a>;
++ };
++ /* offline 5 */
++ port@86000 {
++ fsl,qman-channel-id = <0x4b>;
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi b/arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi
+new file mode 100644
+index 0000000..c463a0b
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi
+@@ -0,0 +1,120 @@
++/*
++ * P2041 Silicon/SoC Device Tree Source (pre include)
++ *
++ * Copyright 2011 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.
++ */
++
++/dts-v1/;
++
++/include/ "e500mc_power_isa.dtsi"
++
++/ {
++ compatible = "fsl,P2041";
++ #address-cells = <2>;
++ #size-cells = <2>;
++ interrupt-parent = <&mpic>;
++
++ aliases {
++ ccsr = &soc;
++ dcsr = &dcsr;
++
++ serial0 = &serial0;
++ serial1 = &serial1;
++ serial2 = &serial2;
++ serial3 = &serial3;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ pci2 = &pci2;
++ usb0 = &usb0;
++ usb1 = &usb1;
++ dma0 = &dma0;
++ dma1 = &dma1;
++ sdhc = &sdhc;
++ msi0 = &msi0;
++ msi1 = &msi1;
++ msi2 = &msi2;
++
++ crypto = &crypto;
++ sec_jr0 = &sec_jr0;
++ sec_jr1 = &sec_jr1;
++ sec_jr2 = &sec_jr2;
++ sec_jr3 = &sec_jr3;
++ rtic_a = &rtic_a;
++ rtic_b = &rtic_b;
++ rtic_c = &rtic_c;
++ rtic_d = &rtic_d;
++ sec_mon = &sec_mon;
++
++ bman = &bman;
++ qman = &qman;
++ pme = &pme;
++ rman = &rman;
++ fman0 = &fman0;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ cpu0: PowerPC,e500mc@0 {
++ device_type = "cpu";
++ reg = <0>;
++ next-level-cache = <&L2_0>;
++ L2_0: l2-cache {
++ next-level-cache = <&cpc>;
++ };
++ };
++ cpu1: PowerPC,e500mc@1 {
++ device_type = "cpu";
++ reg = <1>;
++ next-level-cache = <&L2_1>;
++ L2_1: l2-cache {
++ next-level-cache = <&cpc>;
++ };
++ };
++ cpu2: PowerPC,e500mc@2 {
++ device_type = "cpu";
++ reg = <2>;
++ next-level-cache = <&L2_2>;
++ L2_2: l2-cache {
++ next-level-cache = <&cpc>;
++ };
++ };
++ cpu3: PowerPC,e500mc@3 {
++ device_type = "cpu";
++ reg = <3>;
++ next-level-cache = <&L2_3>;
++ L2_3: l2-cache {
++ next-level-cache = <&cpc>;
++ };
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/p3041si-post.dtsi b/arch/powerpc/boot/dts/fsl/p3041si-post.dtsi
+new file mode 100644
+index 0000000..5a8c7e3
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/p3041si-post.dtsi
+@@ -0,0 +1,434 @@
++/*
++ * P3041 Silicon/SoC Device Tree Source (post include)
++ *
++ * Copyright 2011 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.
++ */
++
++&lbc {
++ compatible = "fsl,p3041-elbc", "fsl,elbc", "simple-bus";
++ interrupts = <25 2 0 0>;
++ #address-cells = <2>;
++ #size-cells = <1>;
++};
++
++/* controller at 0x200000 */
++&pci0 {
++ compatible = "fsl,p3041-pcie", "fsl,qoriq-pcie-v2.2";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0x0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 1 15>;
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 1 15>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0 0 1 &mpic 40 1 0 0
++ 0000 0 0 2 &mpic 1 1 0 0
++ 0000 0 0 3 &mpic 2 1 0 0
++ 0000 0 0 4 &mpic 3 1 0 0
++ >;
++ };
++};
++
++/* controller at 0x201000 */
++&pci1 {
++ compatible = "fsl,p3041-pcie", "fsl,qoriq-pcie-v2.2";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 1 14>;
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 1 14>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0 0 1 &mpic 41 1 0 0
++ 0000 0 0 2 &mpic 5 1 0 0
++ 0000 0 0 3 &mpic 6 1 0 0
++ 0000 0 0 4 &mpic 7 1 0 0
++ >;
++ };
++};
++
++/* controller at 0x202000 */
++&pci2 {
++ compatible = "fsl,p3041-pcie", "fsl,qoriq-pcie-v2.2";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0x0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 1 13>;
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 1 13>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0 0 1 &mpic 42 1 0 0
++ 0000 0 0 2 &mpic 9 1 0 0
++ 0000 0 0 3 &mpic 10 1 0 0
++ 0000 0 0 4 &mpic 11 1 0 0
++ >;
++ };
++};
++
++/* controller at 0x203000 */
++&pci3 {
++ compatible = "fsl,p3041-pcie", "fsl,qoriq-pcie-v2.2";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0x0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 1 12>;
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 1 12>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0 0 1 &mpic 43 1 0 0
++ 0000 0 0 2 &mpic 0 1 0 0
++ 0000 0 0 3 &mpic 4 1 0 0
++ 0000 0 0 4 &mpic 8 1 0 0
++ >;
++ };
++};
++
++&rio {
++ compatible = "fsl,srio";
++ interrupts = <16 2 1 11>;
++ #address-cells = <2>;
++ #size-cells = <2>;
++ ranges;
++
++ port1 {
++ #address-cells = <2>;
++ #size-cells = <2>;
++ cell-index = <1>;
++ };
++
++ port2 {
++ #address-cells = <2>;
++ #size-cells = <2>;
++ cell-index = <2>;
++ };
++};
++
++&dcsr {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,dcsr", "simple-bus";
++
++ dcsr-epu@0 {
++ compatible = "fsl,p3041-dcsr-epu", "fsl,dcsr-epu";
++ interrupts = <52 2 0 0
++ 84 2 0 0
++ 85 2 0 0>;
++ reg = <0x0 0x1000>;
++ };
++ dcsr-npc {
++ compatible = "fsl,dcsr-npc";
++ reg = <0x1000 0x1000 0x1000000 0x8000>;
++ };
++ dcsr-nxc@2000 {
++ compatible = "fsl,dcsr-nxc";
++ reg = <0x2000 0x1000>;
++ };
++ dcsr-corenet {
++ compatible = "fsl,dcsr-corenet";
++ reg = <0x8000 0x1000 0xB0000 0x1000>;
++ };
++ dcsr-dpaa@9000 {
++ compatible = "fsl,p3041-dcsr-dpaa", "fsl,dcsr-dpaa";
++ reg = <0x9000 0x1000>;
++ };
++ dcsr-ocn@11000 {
++ compatible = "fsl,p3041-dcsr-ocn", "fsl,dcsr-ocn";
++ reg = <0x11000 0x1000>;
++ };
++ dcsr-ddr@12000 {
++ compatible = "fsl,dcsr-ddr";
++ dev-handle = <&ddr1>;
++ reg = <0x12000 0x1000>;
++ };
++ dcsr-nal@18000 {
++ compatible = "fsl,p3041-dcsr-nal", "fsl,dcsr-nal";
++ reg = <0x18000 0x1000>;
++ };
++ dcsr-rcpm@22000 {
++ compatible = "fsl,p3041-dcsr-rcpm", "fsl,dcsr-rcpm";
++ reg = <0x22000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@40000 {
++ compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu0>;
++ reg = <0x40000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@41000 {
++ compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu1>;
++ reg = <0x41000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@42000 {
++ compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu2>;
++ reg = <0x42000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@43000 {
++ compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu3>;
++ reg = <0x43000 0x1000>;
++ };
++};
++
++&bportals {
++/include/ "qoriq-bman1-portals.dtsi"
++};
++
++&qportals {
++/include/ "qoriq-qman1-portals.dtsi"
++};
++
++&soc {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ compatible = "simple-bus";
++
++ soc-sram-error {
++ compatible = "fsl,soc-sram-error";
++ interrupts = <16 2 1 29>;
++ };
++
++ corenet-law@0 {
++ compatible = "fsl,corenet-law";
++ reg = <0x0 0x1000>;
++ fsl,num-laws = <32>;
++ };
++
++ ddr1: memory-controller@8000 {
++ compatible = "fsl,qoriq-memory-controller-v4.5", "fsl,qoriq-memory-controller";
++ reg = <0x8000 0x1000>;
++ interrupts = <16 2 1 23>;
++ };
++
++ cpc: l3-cache-controller@10000 {
++ compatible = "fsl,p3041-l3-cache-controller", "fsl,p4080-l3-cache-controller", "cache";
++ reg = <0x10000 0x1000>;
++ interrupts = <16 2 1 27>;
++ };
++
++ corenet-cf@18000 {
++ compatible = "fsl,corenet-cf";
++ reg = <0x18000 0x1000>;
++ interrupts = <16 2 1 31>;
++ fsl,ccf-num-csdids = <32>;
++ fsl,ccf-num-snoopids = <32>;
++ };
++
++ iommu@20000 {
++ compatible = "fsl,pamu-v1.0", "fsl,pamu";
++ reg = <0x20000 0x4000>;
++ interrupts = <
++ 24 2 0 0
++ 16 2 1 30>;
++ };
++
++/include/ "qoriq-mpic.dtsi"
++
++ guts: global-utilities@e0000 {
++ compatible = "fsl,qoriq-device-config-1.0";
++ reg = <0xe0000 0xe00>;
++ fsl,has-rstcr;
++ #sleep-cells = <1>;
++ fsl,liodn-bits = <12>;
++ };
++
++ pins: global-utilities@e0e00 {
++ compatible = "fsl,qoriq-pin-control-1.0";
++ reg = <0xe0e00 0x200>;
++ #sleep-cells = <2>;
++ };
++
++ clockgen: global-utilities@e1000 {
++ compatible = "fsl,p3041-clockgen", "fsl,qoriq-clockgen-1.0";
++ reg = <0xe1000 0x1000>;
++ clock-frequency = <0>;
++ };
++
++ rcpm: global-utilities@e2000 {
++ compatible = "fsl,qoriq-rcpm-1.0";
++ reg = <0xe2000 0x1000>;
++ #sleep-cells = <1>;
++ };
++
++ sfp: sfp@e8000 {
++ compatible = "fsl,p3041-sfp", "fsl,qoriq-sfp-1.0";
++ reg = <0xe8000 0x1000>;
++ };
++
++ serdes: serdes@ea000 {
++ compatible = "fsl,p3041-serdes";
++ reg = <0xea000 0x1000>;
++ };
++
++/include/ "qoriq-dma-0.dtsi"
++/include/ "qoriq-dma-1.dtsi"
++/include/ "qoriq-espi-0.dtsi"
++ spi@110000 {
++ fsl,espi-num-chipselects = <4>;
++ };
++
++/include/ "qoriq-esdhc-0.dtsi"
++ sdhc@114000 {
++ sdhci,auto-cmd12;
++ };
++
++/include/ "qoriq-i2c-0.dtsi"
++/include/ "qoriq-i2c-1.dtsi"
++/include/ "qoriq-duart-0.dtsi"
++/include/ "qoriq-duart-1.dtsi"
++/include/ "qoriq-gpio-0.dtsi"
++/include/ "qoriq-usb2-mph-0.dtsi"
++ usb0: usb@210000 {
++ compatible = "fsl-usb2-mph-v1.6", "fsl-usb2-mph";
++ phy_type = "utmi";
++ port0;
++ };
++
++/include/ "qoriq-usb2-dr-0.dtsi"
++ usb1: usb@211000 {
++ compatible = "fsl-usb2-dr-v1.6", "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr";
++ dr_mode = "host";
++ phy_type = "utmi";
++ };
++
++/include/ "qoriq-sata2-0.dtsi"
++ sata@220000 {
++ compatible = "fsl,p3041-sata", "fsl,pq-sata-v2";
++ };
++/include/ "qoriq-sata2-1.dtsi"
++ sata@221000 {
++ compatible = "fsl,p3041-sata", "fsl,pq-sata-v2";
++ };
++/include/ "qoriq-sec4.2-0.dtsi"
++/include/ "qoriq-pme-0.dtsi"
++/include/ "qoriq-rman-0.dtsi"
++ rman: rman@1e0000 {
++ fsl,qman-channels-id = <0x62 0x63>;
++ };
++
++/include/ "qoriq-qman1.dtsi"
++/include/ "qoriq-bman1.dtsi"
++
++/include/ "qoriq-fman-0.dtsi"
++/include/ "qoriq-fman-0-1g-0.dtsi"
++/include/ "qoriq-fman-0-1g-1.dtsi"
++/include/ "qoriq-fman-0-1g-2.dtsi"
++/include/ "qoriq-fman-0-1g-3.dtsi"
++/include/ "qoriq-fman-0-1g-4.dtsi"
++/include/ "qoriq-fman-0-10g-0.dtsi"
++ fman0: fman@400000 {
++ /* tx - 1g - 0 */
++ port@a8000 {
++ fsl,qman-channel-id = <0x41>;
++ };
++ /* tx - 1g - 1 */
++ port@a9000 {
++ fsl,qman-channel-id = <0x42>;
++ };
++ /* tx - 1g - 2 */
++ port@aa000 {
++ fsl,qman-channel-id = <0x43>;
++ };
++ /* tx - 1g - 3 */
++ port@ab000 {
++ fsl,qman-channel-id = <0x44>;
++ };
++ /* tx - 1g - 4 */
++ port@ac000 {
++ fsl,qman-channel-id = <0x45>;
++ };
++ /* tx - 10g - 0 */
++ port@b0000 {
++ fsl,qman-channel-id = <0x40>;
++ };
++ /* offline 0 */
++ port@81000 {
++ fsl,qman-channel-id = <0x46>;
++ };
++ /* offline 1 */
++ port@82000 {
++ fsl,qman-channel-id = <0x47>;
++ };
++ /* offline 2 */
++ port@83000 {
++ fsl,qman-channel-id = <0x48>;
++ };
++ /* offline 3 */
++ port@84000 {
++ fsl,qman-channel-id = <0x49>;
++ };
++ /* offline 4 */
++ port@85000 {
++ fsl,qman-channel-id = <0x4a>;
++ };
++ /* offline 5 */
++ port@86000 {
++ fsl,qman-channel-id = <0x4b>;
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/p3041si-pre.dtsi b/arch/powerpc/boot/dts/fsl/p3041si-pre.dtsi
+new file mode 100644
+index 0000000..18ba76f
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/p3041si-pre.dtsi
+@@ -0,0 +1,121 @@
++/*
++ * P3041 Silicon/SoC Device Tree Source (pre include)
++ *
++ * Copyright 2011 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.
++ */
++
++/dts-v1/;
++
++/include/ "e500mc_power_isa.dtsi"
++
++/ {
++ compatible = "fsl,P3041";
++ #address-cells = <2>;
++ #size-cells = <2>;
++ interrupt-parent = <&mpic>;
++
++ aliases {
++ ccsr = &soc;
++ dcsr = &dcsr;
++
++ serial0 = &serial0;
++ serial1 = &serial1;
++ serial2 = &serial2;
++ serial3 = &serial3;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ pci2 = &pci2;
++ pci3 = &pci3;
++ usb0 = &usb0;
++ usb1 = &usb1;
++ dma0 = &dma0;
++ dma1 = &dma1;
++ sdhc = &sdhc;
++ msi0 = &msi0;
++ msi1 = &msi1;
++ msi2 = &msi2;
++
++ crypto = &crypto;
++ sec_jr0 = &sec_jr0;
++ sec_jr1 = &sec_jr1;
++ sec_jr2 = &sec_jr2;
++ sec_jr3 = &sec_jr3;
++ rtic_a = &rtic_a;
++ rtic_b = &rtic_b;
++ rtic_c = &rtic_c;
++ rtic_d = &rtic_d;
++ sec_mon = &sec_mon;
++
++ bman = &bman;
++ qman = &qman;
++ pme = &pme;
++ rman = &rman;
++ fman0 = &fman0;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ cpu0: PowerPC,e500mc@0 {
++ device_type = "cpu";
++ reg = <0>;
++ next-level-cache = <&L2_0>;
++ L2_0: l2-cache {
++ next-level-cache = <&cpc>;
++ };
++ };
++ cpu1: PowerPC,e500mc@1 {
++ device_type = "cpu";
++ reg = <1>;
++ next-level-cache = <&L2_1>;
++ L2_1: l2-cache {
++ next-level-cache = <&cpc>;
++ };
++ };
++ cpu2: PowerPC,e500mc@2 {
++ device_type = "cpu";
++ reg = <2>;
++ next-level-cache = <&L2_2>;
++ L2_2: l2-cache {
++ next-level-cache = <&cpc>;
++ };
++ };
++ cpu3: PowerPC,e500mc@3 {
++ device_type = "cpu";
++ reg = <3>;
++ next-level-cache = <&L2_3>;
++ L2_3: l2-cache {
++ next-level-cache = <&cpc>;
++ };
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/p4080si-post.dtsi b/arch/powerpc/boot/dts/fsl/p4080si-post.dtsi
+new file mode 100644
+index 0000000..01ce97e
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/p4080si-post.dtsi
+@@ -0,0 +1,481 @@
++/*
++ * P4080/P4040 Silicon/SoC Device Tree Source (post include)
++ *
++ * Copyright 2011 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.
++ */
++
++&lbc {
++ compatible = "fsl,p4080-elbc", "fsl,elbc", "simple-bus";
++ interrupts = <25 2 0 0>;
++ #address-cells = <2>;
++ #size-cells = <1>;
++};
++
++/* controller at 0x200000 */
++&pci0 {
++ compatible = "fsl,p4080-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0x0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 1 15>;
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 1 15>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0 0 1 &mpic 40 1 0 0
++ 0000 0 0 2 &mpic 1 1 0 0
++ 0000 0 0 3 &mpic 2 1 0 0
++ 0000 0 0 4 &mpic 3 1 0 0
++ >;
++ };
++};
++
++/* controller at 0x201000 */
++&pci1 {
++ compatible = "fsl,p4080-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 1 14>;
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 1 14>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0 0 1 &mpic 41 1 0 0
++ 0000 0 0 2 &mpic 5 1 0 0
++ 0000 0 0 3 &mpic 6 1 0 0
++ 0000 0 0 4 &mpic 7 1 0 0
++ >;
++ };
++};
++
++/* controller at 0x202000 */
++&pci2 {
++ compatible = "fsl,p4080-pcie";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0x0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 1 13>;
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 1 13>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0 0 1 &mpic 42 1 0 0
++ 0000 0 0 2 &mpic 9 1 0 0
++ 0000 0 0 3 &mpic 10 1 0 0
++ 0000 0 0 4 &mpic 11 1 0 0
++ >;
++ };
++};
++
++&rio {
++ compatible = "fsl,srio";
++ interrupts = <16 2 1 11>;
++ #address-cells = <2>;
++ #size-cells = <2>;
++ fsl,srio-rmu-handle = <&rmu>;
++ ranges;
++
++ port1 {
++ #address-cells = <2>;
++ #size-cells = <2>;
++ cell-index = <1>;
++ };
++
++ port2 {
++ #address-cells = <2>;
++ #size-cells = <2>;
++ cell-index = <2>;
++ };
++};
++
++&dcsr {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,dcsr", "simple-bus";
++
++ dcsr-epu@0 {
++ compatible = "fsl,p4080-dcsr-epu", "fsl,dcsr-epu";
++ interrupts = <52 2 0 0
++ 84 2 0 0
++ 85 2 0 0>;
++ reg = <0x0 0x1000>;
++ };
++ dcsr-npc {
++ compatible = "fsl,dcsr-npc";
++ reg = <0x1000 0x1000 0x1000000 0x8000>;
++ };
++ dcsr-nxc@2000 {
++ compatible = "fsl,dcsr-nxc";
++ reg = <0x2000 0x1000>;
++ };
++ dcsr-corenet {
++ compatible = "fsl,dcsr-corenet";
++ reg = <0x8000 0x1000 0xB0000 0x1000>;
++ };
++ dcsr-dpaa@9000 {
++ compatible = "fsl,p4080-dcsr-dpaa", "fsl,dcsr-dpaa";
++ reg = <0x9000 0x1000>;
++ };
++ dcsr-ocn@11000 {
++ compatible = "fsl,p4080-dcsr-ocn", "fsl,dcsr-ocn";
++ reg = <0x11000 0x1000>;
++ };
++ dcsr-ddr@12000 {
++ compatible = "fsl,dcsr-ddr";
++ dev-handle = <&ddr1>;
++ reg = <0x12000 0x1000>;
++ };
++ dcsr-ddr@13000 {
++ compatible = "fsl,dcsr-ddr";
++ dev-handle = <&ddr2>;
++ reg = <0x13000 0x1000>;
++ };
++ dcsr-nal@18000 {
++ compatible = "fsl,p4080-dcsr-nal", "fsl,dcsr-nal";
++ reg = <0x18000 0x1000>;
++ };
++ dcsr-rcpm@22000 {
++ compatible = "fsl,p4080-dcsr-rcpm", "fsl,dcsr-rcpm";
++ reg = <0x22000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@40000 {
++ compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu0>;
++ reg = <0x40000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@41000 {
++ compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu1>;
++ reg = <0x41000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@42000 {
++ compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu2>;
++ reg = <0x42000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@43000 {
++ compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu3>;
++ reg = <0x43000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@44000 {
++ compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu4>;
++ reg = <0x44000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@45000 {
++ compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu5>;
++ reg = <0x45000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@46000 {
++ compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu6>;
++ reg = <0x46000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@47000 {
++ compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu7>;
++ reg = <0x47000 0x1000>;
++ };
++
++};
++
++&bportals {
++/include/ "qoriq-bman1-portals.dtsi"
++};
++
++&qportals {
++/include/ "qoriq-qman1-portals.dtsi"
++};
++
++&soc {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ compatible = "simple-bus";
++
++ soc-sram-error {
++ compatible = "fsl,soc-sram-error";
++ interrupts = <16 2 1 29>;
++ };
++
++ corenet-law@0 {
++ compatible = "fsl,corenet-law";
++ reg = <0x0 0x1000>;
++ fsl,num-laws = <32>;
++ };
++
++ ddr1: memory-controller@8000 {
++ compatible = "fsl,qoriq-memory-controller-v4.4", "fsl,qoriq-memory-controller";
++ reg = <0x8000 0x1000>;
++ interrupts = <16 2 1 23>;
++ };
++
++ ddr2: memory-controller@9000 {
++ compatible = "fsl,qoriq-memory-controller-v4.4","fsl,qoriq-memory-controller";
++ reg = <0x9000 0x1000>;
++ interrupts = <16 2 1 22>;
++ };
++
++ cpc: l3-cache-controller@10000 {
++ compatible = "fsl,p4080-l3-cache-controller", "cache";
++ reg = <0x10000 0x1000
++ 0x11000 0x1000>;
++ interrupts = <16 2 1 27
++ 16 2 1 26>;
++ };
++
++ corenet-cf@18000 {
++ compatible = "fsl,corenet-cf";
++ reg = <0x18000 0x1000>;
++ interrupts = <16 2 1 31>;
++ fsl,ccf-num-csdids = <32>;
++ fsl,ccf-num-snoopids = <32>;
++ };
++
++ iommu@20000 {
++ compatible = "fsl,pamu-v1.0", "fsl,pamu";
++ reg = <0x20000 0x5000>;
++ interrupts = <
++ 24 2 0 0
++ 16 2 1 30>;
++ };
++
++/include/ "qoriq-rmu-0.dtsi"
++/include/ "qoriq-mpic.dtsi"
++
++ guts: global-utilities@e0000 {
++ compatible = "fsl,qoriq-device-config-1.0";
++ reg = <0xe0000 0xe00>;
++ fsl,has-rstcr;
++ #sleep-cells = <1>;
++ fsl,liodn-bits = <12>;
++ };
++
++ pins: global-utilities@e0e00 {
++ compatible = "fsl,qoriq-pin-control-1.0";
++ reg = <0xe0e00 0x200>;
++ #sleep-cells = <2>;
++ };
++
++ clockgen: global-utilities@e1000 {
++ compatible = "fsl,p4080-clockgen", "fsl,qoriq-clockgen-1.0";
++ reg = <0xe1000 0x1000>;
++ clock-frequency = <0>;
++ };
++
++ rcpm: global-utilities@e2000 {
++ compatible = "fsl,qoriq-rcpm-1.0";
++ reg = <0xe2000 0x1000>;
++ #sleep-cells = <1>;
++ };
++
++ sfp: sfp@e8000 {
++ compatible = "fsl,p4080-sfp", "fsl,qoriq-sfp-1.0";
++ reg = <0xe8000 0x1000>;
++ };
++
++ serdes: serdes@ea000 {
++ compatible = "fsl,p4080-serdes";
++ reg = <0xea000 0x1000>;
++ };
++
++/include/ "qoriq-dma-0.dtsi"
++/include/ "qoriq-dma-1.dtsi"
++/include/ "qoriq-espi-0.dtsi"
++ spi@110000 {
++ fsl,espi-num-chipselects = <4>;
++ };
++
++/include/ "qoriq-esdhc-0.dtsi"
++ sdhc@114000 {
++ voltage-ranges = <3300 3300>;
++ sdhci,auto-cmd12;
++ };
++
++/include/ "qoriq-i2c-0.dtsi"
++/include/ "qoriq-i2c-1.dtsi"
++/include/ "qoriq-duart-0.dtsi"
++/include/ "qoriq-duart-1.dtsi"
++/include/ "qoriq-gpio-0.dtsi"
++/include/ "qoriq-usb2-mph-0.dtsi"
++ usb@210000 {
++ compatible = "fsl-usb2-mph-v1.6", "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph";
++ port0;
++ };
++/include/ "qoriq-usb2-dr-0.dtsi"
++ usb@211000 {
++ compatible = "fsl-usb2-dr-v1.6", "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr";
++ };
++/include/ "qoriq-sec4.0-0.dtsi"
++/include/ "qoriq-pme-0.dtsi"
++/include/ "qoriq-qman1.dtsi"
++/include/ "qoriq-bman1.dtsi"
++/include/ "qoriq-fman-0.dtsi"
++/include/ "qoriq-fman-0-1g-0.dtsi"
++/include/ "qoriq-fman-0-1g-1.dtsi"
++/include/ "qoriq-fman-0-1g-2.dtsi"
++/include/ "qoriq-fman-0-1g-3.dtsi"
++/include/ "qoriq-fman-0-10g-0.dtsi"
++ fman0: fman@400000 {
++ /* tx - 1g - 0 */
++ port@a8000 {
++ fsl,qman-channel-id = <0x41>;
++ };
++ /* tx - 1g - 1 */
++ port@a9000 {
++ fsl,qman-channel-id = <0x42>;
++ };
++ /* tx - 1g - 2 */
++ port@aa000 {
++ fsl,qman-channel-id = <0x43>;
++ };
++ /* tx - 1g - 3 */
++ port@ab000 {
++ fsl,qman-channel-id = <0x44>;
++ };
++ /* tx - 10g - 0 */
++ port@b0000 {
++ fsl,qman-channel-id = <0x40>;
++ };
++ /* offline 0 */
++ port@81000 {
++ fsl,qman-channel-id = <0x45>;
++ };
++ /* offline 1 */
++ port@82000 {
++ fsl,qman-channel-id = <0x46>;
++ };
++ /* offline 2 */
++ port@83000 {
++ fsl,qman-channel-id = <0x47>;
++ };
++ /* offline 3 */
++ port@84000 {
++ fsl,qman-channel-id = <0x48>;
++ };
++ /* offline 4 */
++ port@85000 {
++ fsl,qman-channel-id = <0x49>;
++ };
++ /* offline 5 */
++ port@86000 {
++ fsl,qman-channel-id = <0x4a>;
++ };
++ /* offline 6 */
++ port@87000 {
++ fsl,qman-channel-id = <0x4b>;
++ };
++ };
++
++/include/ "qoriq-fman-1.dtsi"
++/include/ "qoriq-fman-1-1g-0.dtsi"
++/include/ "qoriq-fman-1-1g-1.dtsi"
++/include/ "qoriq-fman-1-1g-2.dtsi"
++/include/ "qoriq-fman-1-1g-3.dtsi"
++/include/ "qoriq-fman-1-10g-0.dtsi"
++ fman1: fman@500000 {
++ /* tx - 1g - 0 */
++ port@a8000 {
++ fsl,qman-channel-id = <0x61>;
++ };
++ /* tx - 1g - 1 */
++ port@a9000 {
++ fsl,qman-channel-id = <0x62>;
++ };
++ /* tx - 1g - 2 */
++ port@aa000 {
++ fsl,qman-channel-id = <0x63>;
++ };
++ /* tx - 1g - 3 */
++ port@ab000 {
++ fsl,qman-channel-id = <0x64>;
++ };
++ /* tx - 10g - 0 */
++ port@b0000 {
++ fsl,qman-channel-id = <0x60>;
++ };
++ /* offline 0 */
++ port@81000 {
++ fsl,qman-channel-id = <0x65>;
++ };
++ /* offline 1 */
++ port@82000 {
++ fsl,qman-channel-id = <0x66>;
++ };
++ /* offline 2 */
++ port@83000 {
++ fsl,qman-channel-id = <0x67>;
++ };
++ /* offline 3 */
++ port@84000 {
++ fsl,qman-channel-id = <0x68>;
++ };
++ /* offline 4 */
++ port@85000 {
++ fsl,qman-channel-id = <0x69>;
++ };
++ /* offline 5 */
++ port@86000 {
++ fsl,qman-channel-id = <0x6a>;
++ };
++ /* offline 6 */
++ port@87000 {
++ fsl,qman-channel-id = <0x6b>;
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/p4080si-pre.dtsi b/arch/powerpc/boot/dts/fsl/p4080si-pre.dtsi
+new file mode 100644
+index 0000000..aea2e14
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/p4080si-pre.dtsi
+@@ -0,0 +1,152 @@
++/*
++ * P4080/P4040 Silicon/SoC Device Tree Source (pre include)
++ *
++ * Copyright 2011 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.
++ */
++
++/dts-v1/;
++
++/include/ "e500mc_power_isa.dtsi"
++
++/ {
++ compatible = "fsl,P4080";
++ #address-cells = <2>;
++ #size-cells = <2>;
++ interrupt-parent = <&mpic>;
++
++ aliases {
++ ccsr = &soc;
++ dcsr = &dcsr;
++
++ serial0 = &serial0;
++ serial1 = &serial1;
++ serial2 = &serial2;
++ serial3 = &serial3;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ pci2 = &pci2;
++ usb0 = &usb0;
++ usb1 = &usb1;
++ dma0 = &dma0;
++ dma1 = &dma1;
++ sdhc = &sdhc;
++ msi0 = &msi0;
++ msi1 = &msi1;
++ msi2 = &msi2;
++
++ crypto = &crypto;
++ sec_jr0 = &sec_jr0;
++ sec_jr1 = &sec_jr1;
++ sec_jr2 = &sec_jr2;
++ sec_jr3 = &sec_jr3;
++ rtic_a = &rtic_a;
++ rtic_b = &rtic_b;
++ rtic_c = &rtic_c;
++ rtic_d = &rtic_d;
++ sec_mon = &sec_mon;
++
++ bman = &bman;
++ qman = &qman;
++ pme = &pme;
++ fman0 = &fman0;
++ fman1 = &fman1;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ cpu0: PowerPC,e500mc@0 {
++ device_type = "cpu";
++ reg = <0>;
++ next-level-cache = <&L2_0>;
++ L2_0: l2-cache {
++ next-level-cache = <&cpc>;
++ };
++ };
++ cpu1: PowerPC,e500mc@1 {
++ device_type = "cpu";
++ reg = <1>;
++ next-level-cache = <&L2_1>;
++ L2_1: l2-cache {
++ next-level-cache = <&cpc>;
++ };
++ };
++ cpu2: PowerPC,e500mc@2 {
++ device_type = "cpu";
++ reg = <2>;
++ next-level-cache = <&L2_2>;
++ L2_2: l2-cache {
++ next-level-cache = <&cpc>;
++ };
++ };
++ cpu3: PowerPC,e500mc@3 {
++ device_type = "cpu";
++ reg = <3>;
++ next-level-cache = <&L2_3>;
++ L2_3: l2-cache {
++ next-level-cache = <&cpc>;
++ };
++ };
++ cpu4: PowerPC,e500mc@4 {
++ device_type = "cpu";
++ reg = <4>;
++ next-level-cache = <&L2_4>;
++ L2_4: l2-cache {
++ next-level-cache = <&cpc>;
++ };
++ };
++ cpu5: PowerPC,e500mc@5 {
++ device_type = "cpu";
++ reg = <5>;
++ next-level-cache = <&L2_5>;
++ L2_5: l2-cache {
++ next-level-cache = <&cpc>;
++ };
++ };
++ cpu6: PowerPC,e500mc@6 {
++ device_type = "cpu";
++ reg = <6>;
++ next-level-cache = <&L2_6>;
++ L2_6: l2-cache {
++ next-level-cache = <&cpc>;
++ };
++ };
++ cpu7: PowerPC,e500mc@7 {
++ device_type = "cpu";
++ reg = <7>;
++ next-level-cache = <&L2_7>;
++ L2_7: l2-cache {
++ next-level-cache = <&cpc>;
++ };
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/p5020si-post.dtsi b/arch/powerpc/boot/dts/fsl/p5020si-post.dtsi
+new file mode 100644
+index 0000000..3a330c1
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/p5020si-post.dtsi
+@@ -0,0 +1,439 @@
++/*
++ * P5020/5010 Silicon/SoC Device Tree Source (post include)
++ *
++ * Copyright 2011 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.
++ */
++
++&lbc {
++ compatible = "fsl,p5020-elbc", "fsl,elbc", "simple-bus";
++ interrupts = <25 2 0 0>;
++ #address-cells = <2>;
++ #size-cells = <1>;
++};
++
++/* controller at 0x200000 */
++&pci0 {
++ compatible = "fsl,p5020-pcie", "fsl,qoriq-pcie-v2.2";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0x0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 1 15>;
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 1 15>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0 0 1 &mpic 40 1 0 0
++ 0000 0 0 2 &mpic 1 1 0 0
++ 0000 0 0 3 &mpic 2 1 0 0
++ 0000 0 0 4 &mpic 3 1 0 0
++ >;
++ };
++};
++
++/* controller at 0x201000 */
++&pci1 {
++ compatible = "fsl,p5020-pcie", "fsl,qoriq-pcie-v2.2";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 1 14>;
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 1 14>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0 0 1 &mpic 41 1 0 0
++ 0000 0 0 2 &mpic 5 1 0 0
++ 0000 0 0 3 &mpic 6 1 0 0
++ 0000 0 0 4 &mpic 7 1 0 0
++ >;
++ };
++};
++
++/* controller at 0x202000 */
++&pci2 {
++ compatible = "fsl,p5020-pcie", "fsl,qoriq-pcie-v2.2";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0x0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 1 13>;
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 1 13>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0 0 1 &mpic 42 1 0 0
++ 0000 0 0 2 &mpic 9 1 0 0
++ 0000 0 0 3 &mpic 10 1 0 0
++ 0000 0 0 4 &mpic 11 1 0 0
++ >;
++ };
++};
++
++/* controller at 0x203000 */
++&pci3 {
++ compatible = "fsl,p5020-pcie", "fsl,qoriq-pcie-v2.2";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0x0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 1 12>;
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 1 12>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0 0 1 &mpic 43 1 0 0
++ 0000 0 0 2 &mpic 0 1 0 0
++ 0000 0 0 3 &mpic 4 1 0 0
++ 0000 0 0 4 &mpic 8 1 0 0
++ >;
++ };
++};
++
++&rio {
++ compatible = "fsl,srio";
++ interrupts = <16 2 1 11>;
++ #address-cells = <2>;
++ #size-cells = <2>;
++ ranges;
++
++ port1 {
++ #address-cells = <2>;
++ #size-cells = <2>;
++ cell-index = <1>;
++ };
++
++ port2 {
++ #address-cells = <2>;
++ #size-cells = <2>;
++ cell-index = <2>;
++ };
++};
++
++&dcsr {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,dcsr", "simple-bus";
++
++ dcsr-epu@0 {
++ compatible = "fsl,p5020-dcsr-epu", "fsl,dcsr-epu";
++ interrupts = <52 2 0 0
++ 84 2 0 0
++ 85 2 0 0>;
++ reg = <0x0 0x1000>;
++ };
++ dcsr-npc {
++ compatible = "fsl,dcsr-npc";
++ reg = <0x1000 0x1000 0x1000000 0x8000>;
++ };
++ dcsr-nxc@2000 {
++ compatible = "fsl,dcsr-nxc";
++ reg = <0x2000 0x1000>;
++ };
++ dcsr-corenet {
++ compatible = "fsl,dcsr-corenet";
++ reg = <0x8000 0x1000 0xB0000 0x1000>;
++ };
++ dcsr-dpaa@9000 {
++ compatible = "fsl,p5020-dcsr-dpaa", "fsl,dcsr-dpaa";
++ reg = <0x9000 0x1000>;
++ };
++ dcsr-ocn@11000 {
++ compatible = "fsl,p5020-dcsr-ocn", "fsl,dcsr-ocn";
++ reg = <0x11000 0x1000>;
++ };
++ dcsr-ddr@12000 {
++ compatible = "fsl,dcsr-ddr";
++ dev-handle = <&ddr1>;
++ reg = <0x12000 0x1000>;
++ };
++ dcsr-ddr@13000 {
++ compatible = "fsl,dcsr-ddr";
++ dev-handle = <&ddr2>;
++ reg = <0x13000 0x1000>;
++ };
++ dcsr-nal@18000 {
++ compatible = "fsl,p5020-dcsr-nal", "fsl,dcsr-nal";
++ reg = <0x18000 0x1000>;
++ };
++ dcsr-rcpm@22000 {
++ compatible = "fsl,p5020-dcsr-rcpm", "fsl,dcsr-rcpm";
++ reg = <0x22000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@40000 {
++ compatible = "fsl,dcsr-e5500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu0>;
++ reg = <0x40000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@41000 {
++ compatible = "fsl,dcsr-e5500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu1>;
++ reg = <0x41000 0x1000>;
++ };
++};
++
++&bportals {
++/include/ "qoriq-bman1-portals.dtsi"
++};
++
++&qportals {
++/include/ "qoriq-qman1-portals.dtsi"
++};
++
++&soc {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ compatible = "simple-bus";
++
++ soc-sram-error {
++ compatible = "fsl,soc-sram-error";
++ interrupts = <16 2 1 29>;
++ };
++
++ corenet-law@0 {
++ compatible = "fsl,corenet-law";
++ reg = <0x0 0x1000>;
++ fsl,num-laws = <32>;
++ };
++
++ ddr1: memory-controller@8000 {
++ compatible = "fsl,qoriq-memory-controller-v4.5", "fsl,qoriq-memory-controller";
++ reg = <0x8000 0x1000>;
++ interrupts = <16 2 1 23>;
++ };
++
++ ddr2: memory-controller@9000 {
++ compatible = "fsl,qoriq-memory-controller-v4.5","fsl,qoriq-memory-controller";
++ reg = <0x9000 0x1000>;
++ interrupts = <16 2 1 22>;
++ };
++
++ cpc: l3-cache-controller@10000 {
++ compatible = "fsl,p5020-l3-cache-controller", "fsl,p4080-l3-cache-controller", "cache";
++ reg = <0x10000 0x1000
++ 0x11000 0x1000>;
++ interrupts = <16 2 1 27
++ 16 2 1 26>;
++ };
++
++ corenet-cf@18000 {
++ compatible = "fsl,corenet-cf";
++ reg = <0x18000 0x1000>;
++ interrupts = <16 2 1 31>;
++ fsl,ccf-num-csdids = <32>;
++ fsl,ccf-num-snoopids = <32>;
++ };
++
++ iommu@20000 {
++ compatible = "fsl,pamu-v1.0", "fsl,pamu";
++ reg = <0x20000 0x4000>;
++ interrupts = <
++ 24 2 0 0
++ 16 2 1 30>;
++ };
++
++/include/ "qoriq-mpic.dtsi"
++
++ guts: global-utilities@e0000 {
++ compatible = "fsl,qoriq-device-config-1.0";
++ reg = <0xe0000 0xe00>;
++ fsl,has-rstcr;
++ #sleep-cells = <1>;
++ fsl,liodn-bits = <12>;
++ };
++
++ pins: global-utilities@e0e00 {
++ compatible = "fsl,qoriq-pin-control-1.0";
++ reg = <0xe0e00 0x200>;
++ #sleep-cells = <2>;
++ };
++
++ clockgen: global-utilities@e1000 {
++ compatible = "fsl,p5020-clockgen", "fsl,qoriq-clockgen-1.0";
++ reg = <0xe1000 0x1000>;
++ clock-frequency = <0>;
++ };
++
++ rcpm: global-utilities@e2000 {
++ compatible = "fsl,qoriq-rcpm-1.0";
++ reg = <0xe2000 0x1000>;
++ #sleep-cells = <1>;
++ };
++
++ sfp: sfp@e8000 {
++ compatible = "fsl,p5020-sfp", "fsl,qoriq-sfp-1.0";
++ reg = <0xe8000 0x1000>;
++ };
++
++ serdes: serdes@ea000 {
++ compatible = "fsl,p5020-serdes";
++ reg = <0xea000 0x1000>;
++ };
++
++/include/ "qoriq-dma-0.dtsi"
++/include/ "qoriq-dma-1.dtsi"
++/include/ "qoriq-espi-0.dtsi"
++ spi@110000 {
++ fsl,espi-num-chipselects = <4>;
++ };
++
++/include/ "qoriq-esdhc-0.dtsi"
++ sdhc@114000 {
++ sdhci,auto-cmd12;
++ };
++
++/include/ "qoriq-i2c-0.dtsi"
++/include/ "qoriq-i2c-1.dtsi"
++/include/ "qoriq-duart-0.dtsi"
++/include/ "qoriq-duart-1.dtsi"
++/include/ "qoriq-gpio-0.dtsi"
++/include/ "qoriq-usb2-mph-0.dtsi"
++ usb0: usb@210000 {
++ compatible = "fsl-usb2-mph-v1.6", "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph";
++ phy_type = "utmi";
++ port0;
++ };
++
++/include/ "qoriq-usb2-dr-0.dtsi"
++ usb1: usb@211000 {
++ compatible = "fsl-usb2-dr-v1.6", "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr";
++ dr_mode = "host";
++ phy_type = "utmi";
++ };
++
++/include/ "qoriq-sata2-0.dtsi"
++ sata@220000 {
++ compatible = "fsl,p5020-sata", "fsl,pq-sata-v2";
++ };
++/include/ "qoriq-sata2-1.dtsi"
++ sata@221000 {
++ compatible = "fsl,p5020-sata", "fsl,pq-sata-v2";
++ };
++/include/ "qoriq-sec4.2-0.dtsi"
++/include/ "qoriq-pme-0.dtsi"
++/include/ "qoriq-rman-0.dtsi"
++ rman: rman@1e0000 {
++ fsl,qman-channels-id = <0x62 0x63>;
++ };
++
++/include/ "qoriq-qman1.dtsi"
++/include/ "qoriq-bman1.dtsi"
++
++/include/ "qoriq-fman-0.dtsi"
++/include/ "qoriq-fman-0-1g-0.dtsi"
++/include/ "qoriq-fman-0-1g-1.dtsi"
++/include/ "qoriq-fman-0-1g-2.dtsi"
++/include/ "qoriq-fman-0-1g-3.dtsi"
++/include/ "qoriq-fman-0-1g-4.dtsi"
++/include/ "qoriq-fman-0-10g-0.dtsi"
++ fman0: fman@400000 {
++ /* tx - 1g - 0 */
++ port@a8000 {
++ fsl,qman-channel-id = <0x41>;
++ };
++ /* tx - 1g - 1 */
++ port@a9000 {
++ fsl,qman-channel-id = <0x42>;
++ };
++ /* tx - 1g - 2 */
++ port@aa000 {
++ fsl,qman-channel-id = <0x43>;
++ };
++ /* tx - 1g - 3 */
++ port@ab000 {
++ fsl,qman-channel-id = <0x44>;
++ };
++ /* tx - 1g - 4 */
++ port@ac000 {
++ fsl,qman-channel-id = <0x45>;
++ };
++ /* tx - 10g - 0 */
++ port@b0000 {
++ fsl,qman-channel-id = <0x40>;
++ };
++ /* offline 0 */
++ port@81000 {
++ fsl,qman-channel-id = <0x46>;
++ };
++ /* offline 1 */
++ port@82000 {
++ fsl,qman-channel-id = <0x47>;
++ };
++ /* offline 2 */
++ port@83000 {
++ fsl,qman-channel-id = <0x48>;
++ };
++ /* offline 3 */
++ port@84000 {
++ fsl,qman-channel-id = <0x49>;
++ };
++ /* offline 4 */
++ port@85000 {
++ fsl,qman-channel-id = <0x4a>;
++ };
++ /* offline 5 */
++ port@86000 {
++ fsl,qman-channel-id = <0x4b>;
++ };
++ };
++
++/include/ "qoriq-raid1.0-0.dtsi"
++};
+diff --git a/arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi b/arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi
+new file mode 100644
+index 0000000..8cda17b
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi
+@@ -0,0 +1,111 @@
++/*
++ * P5020/P5010 Silicon/SoC Device Tree Source (pre include)
++ *
++ * Copyright 2011 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.
++ */
++
++/dts-v1/;
++
++/include/ "e5500_power_isa.dtsi"
++
++/ {
++ compatible = "fsl,P5020";
++ #address-cells = <2>;
++ #size-cells = <2>;
++ interrupt-parent = <&mpic>;
++
++ aliases {
++ ccsr = &soc;
++ dcsr = &dcsr;
++
++ serial0 = &serial0;
++ serial1 = &serial1;
++ serial2 = &serial2;
++ serial3 = &serial3;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ pci2 = &pci2;
++ pci3 = &pci3;
++ usb0 = &usb0;
++ usb1 = &usb1;
++ dma0 = &dma0;
++ dma1 = &dma1;
++ sdhc = &sdhc;
++ msi0 = &msi0;
++ msi1 = &msi1;
++ msi2 = &msi2;
++
++ crypto = &crypto;
++ sec_jr0 = &sec_jr0;
++ sec_jr1 = &sec_jr1;
++ sec_jr2 = &sec_jr2;
++ sec_jr3 = &sec_jr3;
++ rtic_a = &rtic_a;
++ rtic_b = &rtic_b;
++ rtic_c = &rtic_c;
++ rtic_d = &rtic_d;
++ sec_mon = &sec_mon;
++
++ raideng = &raideng;
++ raideng_jr0 = &raideng_jr0;
++ raideng_jr1 = &raideng_jr1;
++ raideng_jr2 = &raideng_jr2;
++ raideng_jr3 = &raideng_jr3;
++
++ bman = &bman;
++ qman = &qman;
++ pme = &pme;
++ rman = &rman;
++ fman0 = &fman0;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ cpu0: PowerPC,e5500@0 {
++ device_type = "cpu";
++ reg = <0>;
++ next-level-cache = <&L2_0>;
++ L2_0: l2-cache {
++ next-level-cache = <&cpc>;
++ };
++ };
++ cpu1: PowerPC,e5500@1 {
++ device_type = "cpu";
++ reg = <1>;
++ next-level-cache = <&L2_1>;
++ L2_1: l2-cache {
++ next-level-cache = <&cpc>;
++ };
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/p5040si-post.dtsi b/arch/powerpc/boot/dts/fsl/p5040si-post.dtsi
+new file mode 100644
+index 0000000..7eee08c
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/p5040si-post.dtsi
+@@ -0,0 +1,448 @@
++/*
++ * P5040 Silicon/SoC Device Tree Source (post include)
++ *
++ * Copyright 2012 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.
++ */
++
++&lbc {
++ compatible = "fsl,p5040-elbc", "fsl,elbc", "simple-bus";
++ interrupts = <25 2 0 0>;
++ #address-cells = <2>;
++ #size-cells = <1>;
++};
++
++/* controller at 0x200000 */
++&pci0 {
++ compatible = "fsl,p5040-pcie", "fsl,qoriq-pcie-v2.4", "fsl,qoriq-pcie-v2.2";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0x0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 1 15>;
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 1 15>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0 0 1 &mpic 40 1 0 0
++ 0000 0 0 2 &mpic 1 1 0 0
++ 0000 0 0 3 &mpic 2 1 0 0
++ 0000 0 0 4 &mpic 3 1 0 0
++ >;
++ };
++};
++
++/* controller at 0x201000 */
++&pci1 {
++ compatible = "fsl,p5040-pcie", "fsl,qoriq-pcie-v2.4", "fsl,qoriq-pcie-v2.2";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 1 14>;
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 1 14>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0 0 1 &mpic 41 1 0 0
++ 0000 0 0 2 &mpic 5 1 0 0
++ 0000 0 0 3 &mpic 6 1 0 0
++ 0000 0 0 4 &mpic 7 1 0 0
++ >;
++ };
++};
++
++/* controller at 0x202000 */
++&pci2 {
++ compatible = "fsl,p5040-pcie", "fsl,qoriq-pcie-v2.4", "fsl,qoriq-pcie-v2.2";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0x0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <16 2 1 13>;
++ pcie@0 {
++ reg = <0 0 0 0 0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <16 2 1 13>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0 0 1 &mpic 42 1 0 0
++ 0000 0 0 2 &mpic 9 1 0 0
++ 0000 0 0 3 &mpic 10 1 0 0
++ 0000 0 0 4 &mpic 11 1 0 0
++ >;
++ };
++};
++
++&dcsr {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,dcsr", "simple-bus";
++
++ dcsr-epu@0 {
++ compatible = "fsl,p5040-dcsr-epu", "fsl,dcsr-epu";
++ interrupts = <52 2 0 0
++ 84 2 0 0
++ 85 2 0 0>;
++ reg = <0x0 0x1000>;
++ };
++ dcsr-npc {
++ compatible = "fsl,dcsr-npc";
++ reg = <0x1000 0x1000 0x1000000 0x8000>;
++ };
++ dcsr-nxc@2000 {
++ compatible = "fsl,dcsr-nxc";
++ reg = <0x2000 0x1000>;
++ };
++ dcsr-corenet {
++ compatible = "fsl,dcsr-corenet";
++ reg = <0x8000 0x1000 0xB0000 0x1000>;
++ };
++ dcsr-dpaa@9000 {
++ compatible = "fsl,p5040-dcsr-dpaa", "fsl,dcsr-dpaa";
++ reg = <0x9000 0x1000>;
++ };
++ dcsr-ocn@11000 {
++ compatible = "fsl,p5040-dcsr-ocn", "fsl,dcsr-ocn";
++ reg = <0x11000 0x1000>;
++ };
++ dcsr-ddr@12000 {
++ compatible = "fsl,dcsr-ddr";
++ dev-handle = <&ddr1>;
++ reg = <0x12000 0x1000>;
++ };
++ dcsr-ddr@13000 {
++ compatible = "fsl,dcsr-ddr";
++ dev-handle = <&ddr2>;
++ reg = <0x13000 0x1000>;
++ };
++ dcsr-nal@18000 {
++ compatible = "fsl,p5040-dcsr-nal", "fsl,dcsr-nal";
++ reg = <0x18000 0x1000>;
++ };
++ dcsr-rcpm@22000 {
++ compatible = "fsl,p5040-dcsr-rcpm", "fsl,dcsr-rcpm";
++ reg = <0x22000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@40000 {
++ compatible = "fsl,dcsr-e5500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu0>;
++ reg = <0x40000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@41000 {
++ compatible = "fsl,dcsr-e5500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu1>;
++ reg = <0x41000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@42000 {
++ compatible = "fsl,dcsr-e5500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu2>;
++ reg = <0x42000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@43000 {
++ compatible = "fsl,dcsr-e5500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu3>;
++ reg = <0x43000 0x1000>;
++ };
++};
++
++&bportals {
++/include/ "qoriq-bman1-portals.dtsi"
++};
++
++&qportals {
++/include/ "qoriq-qman1-portals.dtsi"
++};
++
++&soc {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ compatible = "simple-bus";
++
++ soc-sram-error {
++ compatible = "fsl,soc-sram-error";
++ interrupts = <16 2 1 29>;
++ };
++
++ corenet-law@0 {
++ compatible = "fsl,corenet-law";
++ reg = <0x0 0x1000>;
++ fsl,num-laws = <32>;
++ };
++
++ ddr1: memory-controller@8000 {
++ compatible = "fsl,qoriq-memory-controller-v4.5", "fsl,qoriq-memory-controller";
++ reg = <0x8000 0x1000>;
++ interrupts = <16 2 1 23>;
++ };
++
++ ddr2: memory-controller@9000 {
++ compatible = "fsl,qoriq-memory-controller-v4.5","fsl,qoriq-memory-controller";
++ reg = <0x9000 0x1000>;
++ interrupts = <16 2 1 22>;
++ };
++
++ cpc: l3-cache-controller@10000 {
++ compatible = "fsl,p5040-l3-cache-controller", "fsl,p4080-l3-cache-controller", "cache";
++ reg = <0x10000 0x1000
++ 0x11000 0x1000>;
++ interrupts = <16 2 1 27
++ 16 2 1 26>;
++ };
++
++ corenet-cf@18000 {
++ compatible = "fsl,corenet-cf";
++ reg = <0x18000 0x1000>;
++ interrupts = <16 2 1 31>;
++ fsl,ccf-num-csdids = <32>;
++ fsl,ccf-num-snoopids = <32>;
++ };
++
++ iommu@20000 {
++ compatible = "fsl,pamu-v1.0", "fsl,pamu";
++ reg = <0x20000 0x5000>;
++ interrupts = <
++ 24 2 0 0
++ 16 2 1 30>;
++ };
++
++/include/ "qoriq-mpic.dtsi"
++
++ guts: global-utilities@e0000 {
++ compatible = "fsl,p5040-device-config", "fsl,qoriq-device-config-1.0";
++ reg = <0xe0000 0xe00>;
++ fsl,has-rstcr;
++ #sleep-cells = <1>;
++ fsl,liodn-bits = <12>;
++ };
++
++ pins: global-utilities@e0e00 {
++ compatible = "fsl,p5040-pin-control", "fsl,qoriq-pin-control-1.0";
++ reg = <0xe0e00 0x200>;
++ #sleep-cells = <2>;
++ };
++
++ clockgen: global-utilities@e1000 {
++ compatible = "fsl,p5040-clockgen", "fsl,qoriq-clockgen-1.0";
++ reg = <0xe1000 0x1000>;
++ clock-frequency = <0>;
++ };
++
++ rcpm: global-utilities@e2000 {
++ compatible = "fsl,p5040-rcpm", "fsl,qoriq-rcpm-1.0";
++ reg = <0xe2000 0x1000>;
++ #sleep-cells = <1>;
++ };
++
++ sfp: sfp@e8000 {
++ compatible = "fsl,p5040-sfp", "fsl,qoriq-sfp-1.0";
++ reg = <0xe8000 0x1000>;
++ };
++
++ serdes: serdes@ea000 {
++ compatible = "fsl,p5040-serdes";
++ reg = <0xea000 0x1000>;
++ };
++
++/include/ "qoriq-dma-0.dtsi"
++/include/ "qoriq-dma-1.dtsi"
++/include/ "qoriq-espi-0.dtsi"
++ spi@110000 {
++ fsl,espi-num-chipselects = <4>;
++ };
++
++/include/ "qoriq-esdhc-0.dtsi"
++ sdhc@114000 {
++ sdhci,auto-cmd12;
++ };
++
++/include/ "qoriq-i2c-0.dtsi"
++/include/ "qoriq-i2c-1.dtsi"
++/include/ "qoriq-duart-0.dtsi"
++/include/ "qoriq-duart-1.dtsi"
++/include/ "qoriq-gpio-0.dtsi"
++/include/ "qoriq-usb2-mph-0.dtsi"
++ usb0: usb@210000 {
++ compatible = "fsl-usb2-mph-v1.6", "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph";
++ phy_type = "utmi";
++ port0;
++ };
++
++/include/ "qoriq-usb2-dr-0.dtsi"
++ usb1: usb@211000 {
++ compatible = "fsl-usb2-dr-v1.6", "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr";
++ dr_mode = "host";
++ phy_type = "utmi";
++ };
++
++/include/ "qoriq-sata2-0.dtsi"
++/include/ "qoriq-sata2-1.dtsi"
++/include/ "qoriq-sec5.2-0.dtsi"
++/include/ "qoriq-qman1.dtsi"
++/include/ "qoriq-bman1.dtsi"
++
++/include/ "qoriq-fman-0.dtsi"
++/include/ "qoriq-fman-0-1g-0.dtsi"
++/include/ "qoriq-fman-0-1g-1.dtsi"
++/include/ "qoriq-fman-0-1g-2.dtsi"
++/include/ "qoriq-fman-0-1g-3.dtsi"
++/include/ "qoriq-fman-0-1g-4.dtsi"
++/include/ "qoriq-fman-0-10g-0.dtsi"
++ fman0: fman@400000 {
++ /* tx - 1g - 0 */
++ port@a8000 {
++ fsl,qman-channel-id = <0x41>;
++ };
++ /* tx - 1g - 1 */
++ port@a9000 {
++ fsl,qman-channel-id = <0x42>;
++ };
++ /* tx - 1g - 2 */
++ port@aa000 {
++ fsl,qman-channel-id = <0x43>;
++ };
++ /* tx - 1g - 3 */
++ port@ab000 {
++ fsl,qman-channel-id = <0x44>;
++ };
++ /* tx - 1g - 4 */
++ port@ac000 {
++ fsl,qman-channel-id = <0x45>;
++ };
++ /* tx - 10g - 0 */
++ port@b0000 {
++ fsl,qman-channel-id = <0x40>;
++ };
++ /* offline 0 */
++ port@81000 {
++ fsl,qman-channel-id = <0x46>;
++ };
++ /* offline 1 */
++ port@82000 {
++ fsl,qman-channel-id = <0x47>;
++ };
++ /* offline 2 */
++ port@83000 {
++ fsl,qman-channel-id = <0x48>;
++ };
++ /* offline 3 */
++ port@84000 {
++ fsl,qman-channel-id = <0x49>;
++ };
++ /* offline 4 */
++ port@85000 {
++ fsl,qman-channel-id = <0x4a>;
++ };
++ /* offline 5 */
++ port@86000 {
++ fsl,qman-channel-id = <0x4b>;
++ };
++ };
++
++/include/ "qoriq-fman-1.dtsi"
++/include/ "qoriq-fman-1-1g-0.dtsi"
++/include/ "qoriq-fman-1-1g-1.dtsi"
++/include/ "qoriq-fman-1-1g-2.dtsi"
++/include/ "qoriq-fman-1-1g-3.dtsi"
++/include/ "qoriq-fman-1-1g-4.dtsi"
++/include/ "qoriq-fman-1-10g-0.dtsi"
++ fman1: fman@500000 {
++ /* tx - 1g - 0 */
++ port@a8000 {
++ fsl,qman-channel-id = <0x61>;
++ };
++ /* tx - 1g - 1 */
++ port@a9000 {
++ fsl,qman-channel-id = <0x62>;
++ };
++ /* tx - 1g - 2 */
++ port@aa000 {
++ fsl,qman-channel-id = <0x63>;
++ };
++ /* tx - 1g - 3 */
++ port@ab000 {
++ fsl,qman-channel-id = <0x64>;
++ };
++ /* tx - 1g - 4 */
++ port@ac000 {
++ fsl,qman-channel-id = <0x65>;
++ };
++ /* tx - 10g - 0 */
++ port@b0000 {
++ fsl,qman-channel-id = <0x60>;
++ };
++ /* offline 0 */
++ port@81000 {
++ fsl,qman-channel-id = <0x66>;
++ };
++ /* offline 1 */
++ port@82000 {
++ fsl,qman-channel-id = <0x67>;
++ };
++ /* offline 2 */
++ port@83000 {
++ fsl,qman-channel-id = <0x68>;
++ };
++ /* offline 3 */
++ port@84000 {
++ fsl,qman-channel-id = <0x69>;
++ };
++ /* offline 4 */
++ port@85000 {
++ fsl,qman-channel-id = <0x6a>;
++ };
++ /* offline 5 */
++ port@86000 {
++ fsl,qman-channel-id = <0x6b>;
++ };
++ };
++
++/include/ "qoriq-raid1.0-0.dtsi"
++};
+diff --git a/arch/powerpc/boot/dts/fsl/p5040si-pre.dtsi b/arch/powerpc/boot/dts/fsl/p5040si-pre.dtsi
+new file mode 100644
+index 0000000..64edbf1
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/p5040si-pre.dtsi
+@@ -0,0 +1,125 @@
++/*
++ * P5040 Silicon/SoC Device Tree Source (pre include)
++ *
++ * Copyright 2012 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.
++ */
++
++/dts-v1/;
++
++/include/ "e5500_power_isa.dtsi"
++
++/ {
++ compatible = "fsl,P5040";
++ #address-cells = <2>;
++ #size-cells = <2>;
++ interrupt-parent = <&mpic>;
++
++ aliases {
++ ccsr = &soc;
++ dcsr = &dcsr;
++
++ serial0 = &serial0;
++ serial1 = &serial1;
++ serial2 = &serial2;
++ serial3 = &serial3;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ pci2 = &pci2;
++ usb0 = &usb0;
++ usb1 = &usb1;
++ dma0 = &dma0;
++ dma1 = &dma1;
++ sdhc = &sdhc;
++ msi0 = &msi0;
++ msi1 = &msi1;
++ msi2 = &msi2;
++
++ crypto = &crypto;
++ sec_jr0 = &sec_jr0;
++ sec_jr1 = &sec_jr1;
++ sec_jr2 = &sec_jr2;
++ sec_jr3 = &sec_jr3;
++ rtic_a = &rtic_a;
++ rtic_b = &rtic_b;
++ rtic_c = &rtic_c;
++ rtic_d = &rtic_d;
++ sec_mon = &sec_mon;
++
++ raideng = &raideng;
++ raideng_jr0 = &raideng_jr0;
++ raideng_jr1 = &raideng_jr1;
++ raideng_jr2 = &raideng_jr2;
++ raideng_jr3 = &raideng_jr3;
++
++ bman = &bman;
++ qman = &qman;
++ fman0 = &fman0;
++ fman1 = &fman1;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ cpu0: PowerPC,e5500@0 {
++ device_type = "cpu";
++ reg = <0>;
++ next-level-cache = <&L2_0>;
++ L2_0: l2-cache {
++ next-level-cache = <&cpc>;
++ };
++ };
++ cpu1: PowerPC,e5500@1 {
++ device_type = "cpu";
++ reg = <1>;
++ next-level-cache = <&L2_1>;
++ L2_1: l2-cache {
++ next-level-cache = <&cpc>;
++ };
++ };
++ cpu2: PowerPC,e5500@2 {
++ device_type = "cpu";
++ reg = <2>;
++ next-level-cache = <&L2_2>;
++ L2_2: l2-cache {
++ next-level-cache = <&cpc>;
++ };
++ };
++ cpu3: PowerPC,e5500@3 {
++ device_type = "cpu";
++ reg = <3>;
++ next-level-cache = <&L2_3>;
++ L2_3: l2-cache {
++ next-level-cache = <&cpc>;
++ };
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-dma-0.dtsi b/arch/powerpc/boot/dts/fsl/pq3-dma-0.dtsi
+new file mode 100644
+index 0000000..b5b37ad
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-dma-0.dtsi
+@@ -0,0 +1,66 @@
++/*
++ * PQ3 DMA device tree stub [ controller @ offset 0x21000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++dma@21300 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,eloplus-dma";
++ reg = <0x21300 0x4>;
++ ranges = <0x0 0x21100 0x200>;
++ cell-index = <0>;
++ dma-channel@0 {
++ compatible = "fsl,eloplus-dma-channel";
++ reg = <0x0 0x80>;
++ cell-index = <0>;
++ interrupts = <20 2 0 0>;
++ };
++ dma-channel@80 {
++ compatible = "fsl,eloplus-dma-channel";
++ reg = <0x80 0x80>;
++ cell-index = <1>;
++ interrupts = <21 2 0 0>;
++ };
++ dma-channel@100 {
++ compatible = "fsl,eloplus-dma-channel";
++ reg = <0x100 0x80>;
++ cell-index = <2>;
++ interrupts = <22 2 0 0>;
++ };
++ dma-channel@180 {
++ compatible = "fsl,eloplus-dma-channel";
++ reg = <0x180 0x80>;
++ cell-index = <3>;
++ interrupts = <23 2 0 0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-dma-1.dtsi b/arch/powerpc/boot/dts/fsl/pq3-dma-1.dtsi
+new file mode 100644
+index 0000000..28cb8a5
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-dma-1.dtsi
+@@ -0,0 +1,66 @@
++/*
++ * PQ3 DMA device tree stub [ controller @ offset 0xc300 ]
++ *
++ * Copyright 2011 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.
++ */
++
++dma@c300 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,eloplus-dma";
++ reg = <0xc300 0x4>;
++ ranges = <0x0 0xc100 0x200>;
++ cell-index = <1>;
++ dma-channel@0 {
++ compatible = "fsl,eloplus-dma-channel";
++ reg = <0x0 0x80>;
++ cell-index = <0>;
++ interrupts = <76 2 0 0>;
++ };
++ dma-channel@80 {
++ compatible = "fsl,eloplus-dma-channel";
++ reg = <0x80 0x80>;
++ cell-index = <1>;
++ interrupts = <77 2 0 0>;
++ };
++ dma-channel@100 {
++ compatible = "fsl,eloplus-dma-channel";
++ reg = <0x100 0x80>;
++ cell-index = <2>;
++ interrupts = <78 2 0 0>;
++ };
++ dma-channel@180 {
++ compatible = "fsl,eloplus-dma-channel";
++ reg = <0x180 0x80>;
++ cell-index = <3>;
++ interrupts = <79 2 0 0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-duart-0.dtsi b/arch/powerpc/boot/dts/fsl/pq3-duart-0.dtsi
+new file mode 100644
+index 0000000..5e268fd
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-duart-0.dtsi
+@@ -0,0 +1,51 @@
++/*
++ * PQ3 DUART device tree stub [ controller @ offset 0x4000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++serial0: serial@4500 {
++ cell-index = <0>;
++ device_type = "serial";
++ compatible = "fsl,ns16550", "ns16550";
++ reg = <0x4500 0x100>;
++ clock-frequency = <0>;
++ interrupts = <42 2 0 0>;
++};
++
++serial1: serial@4600 {
++ cell-index = <1>;
++ device_type = "serial";
++ compatible = "fsl,ns16550", "ns16550";
++ reg = <0x4600 0x100>;
++ clock-frequency = <0>;
++ interrupts = <42 2 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-esdhc-0.dtsi b/arch/powerpc/boot/dts/fsl/pq3-esdhc-0.dtsi
+new file mode 100644
+index 0000000..5743433
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-esdhc-0.dtsi
+@@ -0,0 +1,41 @@
++/*
++ * PQ3 eSDHC device tree stub [ controller @ offset 0x2e000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++sdhc@2e000 {
++ compatible = "fsl,esdhc";
++ reg = <0x2e000 0x1000>;
++ interrupts = <72 0x2 0 0>;
++ /* Filled in by U-Boot */
++ clock-frequency = <0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-espi-0.dtsi b/arch/powerpc/boot/dts/fsl/pq3-espi-0.dtsi
+new file mode 100644
+index 0000000..75854b2
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-espi-0.dtsi
+@@ -0,0 +1,41 @@
++/*
++ * PQ3 eSPI device tree stub [ controller @ offset 0x7000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++spi@7000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,mpc8536-espi";
++ reg = <0x7000 0x1000>;
++ interrupts = <59 0x2 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-etsec1-0.dtsi b/arch/powerpc/boot/dts/fsl/pq3-etsec1-0.dtsi
+new file mode 100644
+index 0000000..3b0650a
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-etsec1-0.dtsi
+@@ -0,0 +1,54 @@
++/*
++ * PQ3 eTSEC device tree stub [ @ offsets 0x24000 ]
++ *
++ * Copyright 2011-2012 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.
++ */
++
++ethernet@24000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ cell-index = <0>;
++ device_type = "network";
++ model = "eTSEC";
++ compatible = "gianfar";
++ reg = <0x24000 0x1000>;
++ ranges = <0x0 0x24000 0x1000>;
++ fsl,magic-packet;
++ local-mac-address = [ 00 00 00 00 00 00 ];
++ interrupts = <29 2 0 0 30 2 0 0 34 2 0 0>;
++};
++
++mdio@24520 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,gianfar-mdio";
++ reg = <0x24520 0x20>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-etsec1-1.dtsi b/arch/powerpc/boot/dts/fsl/pq3-etsec1-1.dtsi
+new file mode 100644
+index 0000000..96693b4
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-etsec1-1.dtsi
+@@ -0,0 +1,54 @@
++/*
++ * PQ3 eTSEC device tree stub [ @ offsets 0x25000 ]
++ *
++ * Copyright 2011-2012 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.
++ */
++
++ethernet@25000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ cell-index = <1>;
++ device_type = "network";
++ model = "eTSEC";
++ compatible = "gianfar";
++ reg = <0x25000 0x1000>;
++ ranges = <0x0 0x25000 0x1000>;
++ fsl,magic-packet;
++ local-mac-address = [ 00 00 00 00 00 00 ];
++ interrupts = <35 2 0 0 36 2 0 0 40 2 0 0>;
++};
++
++mdio@25520 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,gianfar-tbi";
++ reg = <0x25520 0x20>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-etsec1-2.dtsi b/arch/powerpc/boot/dts/fsl/pq3-etsec1-2.dtsi
+new file mode 100644
+index 0000000..6b3fab1
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-etsec1-2.dtsi
+@@ -0,0 +1,54 @@
++/*
++ * PQ3 eTSEC device tree stub [ @ offsets 0x26000 ]
++ *
++ * Copyright 2011-2012 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.
++ */
++
++ethernet@26000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ cell-index = <2>;
++ device_type = "network";
++ model = "eTSEC";
++ compatible = "gianfar";
++ reg = <0x26000 0x1000>;
++ ranges = <0x0 0x26000 0x1000>;
++ fsl,magic-packet;
++ local-mac-address = [ 00 00 00 00 00 00 ];
++ interrupts = <31 2 0 0 32 2 0 0 33 2 0 0>;
++};
++
++mdio@26520 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,gianfar-tbi";
++ reg = <0x26520 0x20>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-etsec1-3.dtsi b/arch/powerpc/boot/dts/fsl/pq3-etsec1-3.dtsi
+new file mode 100644
+index 0000000..0da592d
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-etsec1-3.dtsi
+@@ -0,0 +1,54 @@
++/*
++ * PQ3 eTSEC device tree stub [ @ offsets 0x27000 ]
++ *
++ * Copyright 2011-2012 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.
++ */
++
++ethernet@27000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ cell-index = <3>;
++ device_type = "network";
++ model = "eTSEC";
++ compatible = "gianfar";
++ reg = <0x27000 0x1000>;
++ ranges = <0x0 0x27000 0x1000>;
++ fsl,magic-packet;
++ local-mac-address = [ 00 00 00 00 00 00 ];
++ interrupts = <37 2 0 0 38 2 0 0 39 2 0 0>;
++};
++
++mdio@27520 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,gianfar-tbi";
++ reg = <0x27520 0x20>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-etsec1-timer-0.dtsi b/arch/powerpc/boot/dts/fsl/pq3-etsec1-timer-0.dtsi
+new file mode 100644
+index 0000000..efe2ca0
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-etsec1-timer-0.dtsi
+@@ -0,0 +1,39 @@
++/*
++ * PQ3 eTSEC Timer (IEEE 1588) device tree stub [ @ offsets 0x24e00 ]
++ *
++ * Copyright 2011 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.
++ */
++
++ptp_clock@24e00 {
++ compatible = "fsl,etsec-ptp";
++ reg = <0x24e00 0xb0>;
++ interrupts = <68 2 0 0 69 2 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-etsec2-0.dtsi b/arch/powerpc/boot/dts/fsl/pq3-etsec2-0.dtsi
+new file mode 100644
+index 0000000..1382fec
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-etsec2-0.dtsi
+@@ -0,0 +1,60 @@
++/*
++ * PQ3 eTSEC2 device tree stub [ @ offsets 0x24000/0xb0000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++
++mdio@24000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,etsec2-mdio";
++ reg = <0x24000 0x1000 0xb0030 0x4>;
++};
++
++ethernet@b0000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "network";
++ model = "eTSEC";
++ compatible = "fsl,etsec2";
++ fsl,num_rx_queues = <0x8>;
++ fsl,num_tx_queues = <0x8>;
++ fsl,magic-packet;
++ local-mac-address = [ 00 00 00 00 00 00 ];
++
++ queue-group@b0000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0xb0000 0x1000>;
++ interrupts = <29 2 0 0 30 2 0 0 34 2 0 0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-etsec2-1.dtsi b/arch/powerpc/boot/dts/fsl/pq3-etsec2-1.dtsi
+new file mode 100644
+index 0000000..221cd2e
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-etsec2-1.dtsi
+@@ -0,0 +1,60 @@
++/*
++ * PQ3 eTSEC2 device tree stub [ @ offsets 0x25000/0xb1000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++
++mdio@25000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,etsec2-tbi";
++ reg = <0x25000 0x1000 0xb1030 0x4>;
++};
++
++ethernet@b1000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "network";
++ model = "eTSEC";
++ compatible = "fsl,etsec2";
++ fsl,num_rx_queues = <0x8>;
++ fsl,num_tx_queues = <0x8>;
++ fsl,magic-packet;
++ local-mac-address = [ 00 00 00 00 00 00 ];
++
++ queue-group@b1000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0xb1000 0x1000>;
++ interrupts = <35 2 0 0 36 2 0 0 40 2 0 0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-etsec2-2.dtsi b/arch/powerpc/boot/dts/fsl/pq3-etsec2-2.dtsi
+new file mode 100644
+index 0000000..61456c3
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-etsec2-2.dtsi
+@@ -0,0 +1,59 @@
++/*
++ * PQ3 eTSEC2 device tree stub [ @ offsets 0x26000/0xb2000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++mdio@26000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,etsec2-tbi";
++ reg = <0x26000 0x1000 0xb1030 0x4>;
++};
++
++ethernet@b2000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "network";
++ model = "eTSEC";
++ compatible = "fsl,etsec2";
++ fsl,num_rx_queues = <0x8>;
++ fsl,num_tx_queues = <0x8>;
++ fsl,magic-packet;
++ local-mac-address = [ 00 00 00 00 00 00 ];
++
++ queue-group@b2000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0xb2000 0x1000>;
++ interrupts = <31 2 0 0 32 2 0 0 33 2 0 0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-etsec2-grp2-0.dtsi b/arch/powerpc/boot/dts/fsl/pq3-etsec2-grp2-0.dtsi
+new file mode 100644
+index 0000000..034ab8f
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-etsec2-grp2-0.dtsi
+@@ -0,0 +1,42 @@
++/*
++ * PQ3 eTSEC2 Group 2 device tree stub [ @ offsets 0xb4000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++&enet0_grp2 {
++ queue-group@b4000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0xb4000 0x1000>;
++ interrupts = <17 2 0 0 18 2 0 0 24 2 0 0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-etsec2-grp2-1.dtsi b/arch/powerpc/boot/dts/fsl/pq3-etsec2-grp2-1.dtsi
+new file mode 100644
+index 0000000..3be9ba3
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-etsec2-grp2-1.dtsi
+@@ -0,0 +1,42 @@
++/*
++ * PQ3 eTSEC2 Group 2 device tree stub [ @ offsets 0xb5000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++&enet1_grp2 {
++ queue-group@b5000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0xb5000 0x1000>;
++ interrupts = <51 2 0 0 52 2 0 0 67 2 0 0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-etsec2-grp2-2.dtsi b/arch/powerpc/boot/dts/fsl/pq3-etsec2-grp2-2.dtsi
+new file mode 100644
+index 0000000..02a3345
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-etsec2-grp2-2.dtsi
+@@ -0,0 +1,42 @@
++/*
++ * PQ3 eTSEC2 Group 2 device tree stub [ @ offsets 0xb6000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++&enet2_grp2 {
++ queue-group@b6000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0xb6000 0x1000>;
++ interrupts = <25 2 0 0 26 2 0 0 27 2 0 0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-gpio-0.dtsi b/arch/powerpc/boot/dts/fsl/pq3-gpio-0.dtsi
+new file mode 100644
+index 0000000..72a3ef5
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-gpio-0.dtsi
+@@ -0,0 +1,41 @@
++/*
++ * PQ3 GPIO device tree stub [ controller @ offset 0xf000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++gpio-controller@f000 {
++ #gpio-cells = <2>;
++ compatible = "fsl,pq3-gpio";
++ reg = <0xf000 0x100>;
++ interrupts = <47 0x2 0 0>;
++ gpio-controller;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-i2c-0.dtsi b/arch/powerpc/boot/dts/fsl/pq3-i2c-0.dtsi
+new file mode 100644
+index 0000000..d1dd6fb
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-i2c-0.dtsi
+@@ -0,0 +1,43 @@
++/*
++ * PQ3 I2C device tree stub [ controller @ offset 0x3000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++i2c@3000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <0>;
++ compatible = "fsl-i2c";
++ reg = <0x3000 0x100>;
++ interrupts = <43 2 0 0>;
++ dfsrr;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-i2c-1.dtsi b/arch/powerpc/boot/dts/fsl/pq3-i2c-1.dtsi
+new file mode 100644
+index 0000000..a9bd803
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-i2c-1.dtsi
+@@ -0,0 +1,43 @@
++/*
++ * PQ3 I2C device tree stub [ controller @ offset 0x3100 ]
++ *
++ * Copyright 2011 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.
++ */
++
++i2c@3100 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <1>;
++ compatible = "fsl-i2c";
++ reg = <0x3100 0x100>;
++ interrupts = <43 2 0 0>;
++ dfsrr;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-mpic-timer-B.dtsi b/arch/powerpc/boot/dts/fsl/pq3-mpic-timer-B.dtsi
+new file mode 100644
+index 0000000..8734cff
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-mpic-timer-B.dtsi
+@@ -0,0 +1,42 @@
++/*
++ * PQ3 MPIC Timer (Group B) device tree stub [ controller @ offset 0x42100 ]
++ *
++ * Copyright 2011 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.
++ */
++
++timer@42100 {
++ compatible = "fsl,mpic-global-timer";
++ reg = <0x42100 0x100 0x42300 4>;
++ interrupts = <4 0 3 0
++ 5 0 3 0
++ 6 0 3 0
++ 7 0 3 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-mpic.dtsi b/arch/powerpc/boot/dts/fsl/pq3-mpic.dtsi
+new file mode 100644
+index 0000000..5c80460
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-mpic.dtsi
+@@ -0,0 +1,66 @@
++/*
++ * PQ3 MPIC device tree stub [ controller @ offset 0x40000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++mpic: pic@40000 {
++ interrupt-controller;
++ #address-cells = <0>;
++ #interrupt-cells = <4>;
++ reg = <0x40000 0x40000>;
++ compatible = "fsl,mpic";
++ device_type = "open-pic";
++};
++
++timer@41100 {
++ compatible = "fsl,mpic-global-timer";
++ reg = <0x41100 0x100 0x41300 4>;
++ interrupts = <0 0 3 0
++ 1 0 3 0
++ 2 0 3 0
++ 3 0 3 0>;
++};
++
++msi@41600 {
++ compatible = "fsl,mpic-msi";
++ reg = <0x41600 0x80>;
++ msi-available-ranges = <0 0x100>;
++ interrupts = <
++ 0xe0 0 0 0
++ 0xe1 0 0 0
++ 0xe2 0 0 0
++ 0xe3 0 0 0
++ 0xe4 0 0 0
++ 0xe5 0 0 0
++ 0xe6 0 0 0
++ 0xe7 0 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-power.dtsi b/arch/powerpc/boot/dts/fsl/pq3-power.dtsi
+new file mode 100644
+index 0000000..5aa854c
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-power.dtsi
+@@ -0,0 +1,48 @@
++/*
++ * PQ3 Power Management device tree stub
++ *
++ * Copyright 2012 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.
++ */
++
++power@e0070 {
++ compatible = "fsl,mpc8548-pmc";
++ reg = <0xe0070 0x20>;
++
++ etsec1_clk: soc-clk@24 {
++ fsl,pmcdr-mask = <0x00000080>;
++ };
++ etsec2_clk: soc-clk@25 {
++ fsl,pmcdr-mask = <0x00000040>;
++ };
++ etsec3_clk: soc-clk@26 {
++ fsl,pmcdr-mask = <0x00000020>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-rmu-0.dtsi b/arch/powerpc/boot/dts/fsl/pq3-rmu-0.dtsi
+new file mode 100644
+index 0000000..587ca9f
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-rmu-0.dtsi
+@@ -0,0 +1,68 @@
++/*
++ * PQ3 RIO Message Unit device tree stub [ controller @ offset 0xd3000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++rmu: rmu@d3000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,srio-rmu";
++ reg = <0xd3000 0x500>;
++ ranges = <0x0 0xd3000 0x500>;
++
++ message-unit@0 {
++ compatible = "fsl,srio-msg-unit";
++ reg = <0x0 0x100>;
++ interrupts = <
++ 53 2 0 0 /* msg1_tx_irq */
++ 54 2 0 0>;/* msg1_rx_irq */
++ };
++ message-unit@100 {
++ compatible = "fsl,srio-msg-unit";
++ reg = <0x100 0x100>;
++ interrupts = <
++ 55 2 0 0 /* msg2_tx_irq */
++ 56 2 0 0>;/* msg2_rx_irq */
++ };
++ doorbell-unit@400 {
++ compatible = "fsl,srio-dbell-unit";
++ reg = <0x400 0x80>;
++ interrupts = <
++ 49 2 0 0 /* bell_outb_irq */
++ 50 2 0 0>;/* bell_inb_irq */
++ };
++ port-write-unit@4e0 {
++ compatible = "fsl,srio-port-write-unit";
++ reg = <0x4e0 0x20>;
++ interrupts = <48 2 0 0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-sata2-0.dtsi b/arch/powerpc/boot/dts/fsl/pq3-sata2-0.dtsi
+new file mode 100644
+index 0000000..3c28dd0
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-sata2-0.dtsi
+@@ -0,0 +1,40 @@
++/*
++ * PQ3 SATAv2 device tree stub [ controller @ offset 0x18000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++sata@18000 {
++ compatible = "fsl,pq-sata-v2";
++ reg = <0x18000 0x1000>;
++ cell-index = <1>;
++ interrupts = <74 0x2 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-sata2-1.dtsi b/arch/powerpc/boot/dts/fsl/pq3-sata2-1.dtsi
+new file mode 100644
+index 0000000..eefaf28
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-sata2-1.dtsi
+@@ -0,0 +1,40 @@
++/*
++ * PQ3 SATAv2 device tree stub [ controller @ offset 0x19000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++sata@19000 {
++ compatible = "fsl,pq-sata-v2";
++ reg = <0x19000 0x1000>;
++ cell-index = <2>;
++ interrupts = <41 0x2 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-sec2.1-0.dtsi b/arch/powerpc/boot/dts/fsl/pq3-sec2.1-0.dtsi
+new file mode 100644
+index 0000000..02a5c7a
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-sec2.1-0.dtsi
+@@ -0,0 +1,43 @@
++/*
++ * PQ3 Sec/Crypto 2.1 device tree stub [ controller @ offset 0x30000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++crypto@30000 {
++ compatible = "fsl,sec2.1", "fsl,sec2.0";
++ reg = <0x30000 0x10000>;
++ interrupts = <45 2 0 0>;
++ fsl,num-channels = <4>;
++ fsl,channel-fifo-len = <24>;
++ fsl,exec-units-mask = <0xfe>;
++ fsl,descriptor-types-mask = <0x12b0ebf>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-sec3.0-0.dtsi b/arch/powerpc/boot/dts/fsl/pq3-sec3.0-0.dtsi
+new file mode 100644
+index 0000000..bba1ba4
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-sec3.0-0.dtsi
+@@ -0,0 +1,45 @@
++/*
++ * PQ3 Sec/Crypto 3.0 device tree stub [ controller @ offset 0x30000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++crypto@30000 {
++ compatible = "fsl,sec3.0",
++ "fsl,sec2.4", "fsl,sec2.2", "fsl,sec2.1",
++ "fsl,sec2.0";
++ reg = <0x30000 0x10000>;
++ interrupts = <45 2 0 0 58 2 0 0>;
++ fsl,num-channels = <4>;
++ fsl,channel-fifo-len = <24>;
++ fsl,exec-units-mask = <0x9fe>;
++ fsl,descriptor-types-mask = <0x3ab0ebf>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-sec3.1-0.dtsi b/arch/powerpc/boot/dts/fsl/pq3-sec3.1-0.dtsi
+new file mode 100644
+index 0000000..8f0a566
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-sec3.1-0.dtsi
+@@ -0,0 +1,45 @@
++/*
++ * PQ3 Sec/Crypto 3.1 device tree stub [ controller @ offset 0x30000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++crypto@30000 {
++ compatible = "fsl,sec3.1", "fsl,sec3.0",
++ "fsl,sec2.4", "fsl,sec2.2", "fsl,sec2.1",
++ "fsl,sec2.0";
++ reg = <0x30000 0x10000>;
++ interrupts = <45 2 0 0 58 2 0 0>;
++ fsl,num-channels = <4>;
++ fsl,channel-fifo-len = <24>;
++ fsl,exec-units-mask = <0xbfe>;
++ fsl,descriptor-types-mask = <0x3ab0ebf>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-sec3.3-0.dtsi b/arch/powerpc/boot/dts/fsl/pq3-sec3.3-0.dtsi
+new file mode 100644
+index 0000000..c227f27
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-sec3.3-0.dtsi
+@@ -0,0 +1,45 @@
++/*
++ * PQ3 Sec/Crypto 3.3 device tree stub [ controller @ offset 0x30000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++crypto@30000 {
++ compatible = "fsl,sec3.3", "fsl,sec3.1", "fsl,sec3.0",
++ "fsl,sec2.4", "fsl,sec2.2", "fsl,sec2.1",
++ "fsl,sec2.0";
++ reg = <0x30000 0x10000>;
++ interrupts = <45 2 0 0 58 2 0 0>;
++ fsl,num-channels = <4>;
++ fsl,channel-fifo-len = <24>;
++ fsl,exec-units-mask = <0x97c>;
++ fsl,descriptor-types-mask = <0x3a30abf>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-sec4.4-0.dtsi b/arch/powerpc/boot/dts/fsl/pq3-sec4.4-0.dtsi
+new file mode 100644
+index 0000000..ffadcb5
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-sec4.4-0.dtsi
+@@ -0,0 +1,66 @@
++/*
++ * PQ3 Sec/Crypto 4.4 device tree stub [ controller @ offset 0x30000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++crypto@30000 {
++ compatible = "fsl,sec-v4.4", "fsl,sec-v4.0";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ ranges = <0x0 0x30000 0x10000>;
++ reg = <0x30000 0x10000>;
++ interrupts = <58 2 0 0>;
++
++ sec_jr0: jr@1000 {
++ compatible = "fsl,sec-v4.4-job-ring", "fsl,sec-v4.0-job-ring";
++ reg = <0x1000 0x1000>;
++ interrupts = <45 2 0 0>;
++ };
++
++ sec_jr1: jr@2000 {
++ compatible = "fsl,sec-v4.4-job-ring", "fsl,sec-v4.0-job-ring";
++ reg = <0x2000 0x1000>;
++ interrupts = <45 2 0 0>;
++ };
++
++ sec_jr2: jr@3000 {
++ compatible = "fsl,sec-v4.4-job-ring", "fsl,sec-v4.0-job-ring";
++ reg = <0x3000 0x1000>;
++ interrupts = <45 2 0 0>;
++ };
++
++ sec_jr3: jr@4000 {
++ compatible = "fsl,sec-v4.4-job-ring", "fsl,sec-v4.0-job-ring";
++ reg = <0x4000 0x1000>;
++ interrupts = <45 2 0 0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-tdm1.0-0.dtsi b/arch/powerpc/boot/dts/fsl/pq3-tdm1.0-0.dtsi
+new file mode 100644
+index 0000000..d4bdd5d
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-tdm1.0-0.dtsi
+@@ -0,0 +1,41 @@
++/*
++ * PQ3 TDM device tree stub [ controller @ offset 0x16000 ]
++ *
++ * Copyright 2012 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.
++ */
++
++tdm@16000 {
++ compatible = "fsl,tdm1.0";
++ reg = <0x16000 0x200 0x2c000 0x2000>;
++ clock-frequency = <0>;
++ interrupts = <62 8 0 0>;
++ fsl,max-time-slots = <128>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-usb2-dr-0.dtsi b/arch/powerpc/boot/dts/fsl/pq3-usb2-dr-0.dtsi
+new file mode 100644
+index 0000000..185ab9d
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-usb2-dr-0.dtsi
+@@ -0,0 +1,41 @@
++/*
++ * PQ3 USB DR device tree stub [ controller @ offset 0x22000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++usb@22000 {
++ compatible = "fsl-usb2-dr";
++ reg = <0x22000 0x1000>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ interrupts = <28 0x2 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/pq3-usb2-dr-1.dtsi b/arch/powerpc/boot/dts/fsl/pq3-usb2-dr-1.dtsi
+new file mode 100644
+index 0000000..fe24cd6
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/pq3-usb2-dr-1.dtsi
+@@ -0,0 +1,41 @@
++/*
++ * PQ3 USB DR device tree stub [ controller @ offset 0x23000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++usb@23000 {
++ compatible = "fsl-usb2-dr";
++ reg = <0x23000 0x1000>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ interrupts = <46 0x2 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qonverge-usb2-dr-0.dtsi b/arch/powerpc/boot/dts/fsl/qonverge-usb2-dr-0.dtsi
+new file mode 100644
+index 0000000..8bf4a72
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qonverge-usb2-dr-0.dtsi
+@@ -0,0 +1,41 @@
++/*
++ * QorIQ Qonverge USB Host device tree stub [ controller @ offset 0x210000 ]
++ *
++ * Copyright 2012 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.
++ */
++
++usb@210000 {
++ compatible = "fsl-usb2-dr";
++ reg = <0x210000 0x1000>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ interrupts = <44 0x2 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-bman1-portals.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-bman1-portals.dtsi
+new file mode 100644
+index 0000000..88ccba4
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-bman1-portals.dtsi
+@@ -0,0 +1,97 @@
++/*
++ * QorIQ BMan Portal device tree stub for 10 portals
++ *
++ * Copyright 2011 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.
++ */
++
++#address-cells = <0x1>;
++#size-cells = <0x1>;
++compatible = "simple-bus";
++bman-portal@0 {
++ cell-index = <0x0>;
++ compatible = "fsl,bman-portal";
++ reg = <0x0 0x4000 0x100000 0x1000>;
++ interrupts = <105 2 0 0>;
++};
++bman-portal@4000 {
++ cell-index = <0x1>;
++ compatible = "fsl,bman-portal";
++ reg = <0x4000 0x4000 0x101000 0x1000>;
++ interrupts = <107 2 0 0>;
++};
++bman-portal@8000 {
++ cell-index = <2>;
++ compatible = "fsl,bman-portal";
++ reg = <0x8000 0x4000 0x102000 0x1000>;
++ interrupts = <109 2 0 0>;
++};
++bman-portal@c000 {
++ cell-index = <0x3>;
++ compatible = "fsl,bman-portal";
++ reg = <0xc000 0x4000 0x103000 0x1000>;
++ interrupts = <111 2 0 0>;
++};
++bman-portal@10000 {
++ cell-index = <0x4>;
++ compatible = "fsl,bman-portal";
++ reg = <0x10000 0x4000 0x104000 0x1000>;
++ interrupts = <113 2 0 0>;
++};
++bman-portal@14000 {
++ cell-index = <0x5>;
++ compatible = "fsl,bman-portal";
++ reg = <0x14000 0x4000 0x105000 0x1000>;
++ interrupts = <115 2 0 0>;
++};
++bman-portal@18000 {
++ cell-index = <0x6>;
++ compatible = "fsl,bman-portal";
++ reg = <0x18000 0x4000 0x106000 0x1000>;
++ interrupts = <117 2 0 0>;
++};
++bman-portal@1c000 {
++ cell-index = <0x7>;
++ compatible = "fsl,bman-portal";
++ reg = <0x1c000 0x4000 0x107000 0x1000>;
++ interrupts = <119 2 0 0>;
++};
++bman-portal@20000 {
++ cell-index = <0x8>;
++ compatible = "fsl,bman-portal";
++ reg = <0x20000 0x4000 0x108000 0x1000>;
++ interrupts = <121 2 0 0>;
++};
++bman-portal@24000 {
++ cell-index = <0x9>;
++ compatible = "fsl,bman-portal";
++ reg = <0x24000 0x4000 0x109000 0x1000>;
++ interrupts = <123 2 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-bman1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-bman1.dtsi
+new file mode 100644
+index 0000000..b05be1c
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-bman1.dtsi
+@@ -0,0 +1,39 @@
++/*
++ * QorIQ BMan device tree stub [ controller @ offset 0x31a000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++bman: bman@31a000 {
++ compatible = "fsl,bman";
++ reg = <0x31a000 0x1000>;
++ interrupts = <16 2 1 2>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-bman2-portals.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-bman2-portals.dtsi
+new file mode 100644
+index 0000000..8c0ced5
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-bman2-portals.dtsi
+@@ -0,0 +1,338 @@
++/*
++ * QorIQ BMan Portal device tree stub for 50 portals
++ * i.e BMan2.1
++ *
++ * Copyright 2011-2012 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.
++ */
++
++#address-cells = <0x1>;
++#size-cells = <0x1>;
++compatible = "simple-bus";
++bman-portal@0 {
++ cell-index = <0x0>;
++ compatible = "fsl,bman-portal";
++ reg = <0x0 0x4000 0x1000000 0x1000>;
++ interrupts = <105 2 0 0>;
++};
++bman-portal@4000 {
++ cell-index = <0x1>;
++ compatible = "fsl,bman-portal";
++ reg = <0x4000 0x4000 0x1001000 0x1000>;
++ interrupts = <107 2 0 0>;
++};
++bman-portal@8000 {
++ cell-index = <2>;
++ compatible = "fsl,bman-portal";
++ reg = <0x8000 0x4000 0x1002000 0x1000>;
++ interrupts = <109 2 0 0>;
++};
++bman-portal@c000 {
++ cell-index = <0x3>;
++ compatible = "fsl,bman-portal";
++ reg = <0xc000 0x4000 0x1003000 0x1000>;
++ interrupts = <111 2 0 0>;
++};
++bman-portal@10000 {
++ cell-index = <0x4>;
++ compatible = "fsl,bman-portal";
++ reg = <0x10000 0x4000 0x1004000 0x1000>;
++ interrupts = <113 2 0 0>;
++};
++bman-portal@14000 {
++ cell-index = <0x5>;
++ compatible = "fsl,bman-portal";
++ reg = <0x14000 0x4000 0x1005000 0x1000>;
++ interrupts = <115 2 0 0>;
++};
++bman-portal@18000 {
++ cell-index = <0x6>;
++ compatible = "fsl,bman-portal";
++ reg = <0x18000 0x4000 0x1006000 0x1000>;
++ interrupts = <117 2 0 0>;
++};
++bman-portal@1c000 {
++ cell-index = <0x7>;
++ compatible = "fsl,bman-portal";
++ reg = <0x1c000 0x4000 0x1007000 0x1000>;
++ interrupts = <119 2 0 0>;
++};
++bman-portal@20000 {
++ cell-index = <0x8>;
++ compatible = "fsl,bman-portal";
++ reg = <0x20000 0x4000 0x1008000 0x1000>;
++ interrupts = <121 2 0 0>;
++};
++bman-portal@24000 {
++ cell-index = <0x9>;
++ compatible = "fsl,bman-portal";
++ reg = <0x24000 0x4000 0x1009000 0x1000>;
++ interrupts = <123 2 0 0>;
++};
++bman-portal@28000 {
++ cell-index = <0xa>;
++ compatible = "fsl,bman-portal";
++ reg = <0x28000 0x4000 0x100a000 0x1000>;
++ interrupts = <125 2 0 0>;
++};
++bman-portal@2c000 {
++ cell-index = <0xb>;
++ compatible = "fsl,bman-portal";
++ reg = <0x2c000 0x4000 0x100b000 0x1000>;
++ interrupts = <127 2 0 0>;
++};
++bman-portal@30000 {
++ cell-index = <0xc>;
++ compatible = "fsl,bman-portal";
++ reg = <0x30000 0x4000 0x100c000 0x1000>;
++ interrupts = <129 2 0 0>;
++};
++bman-portal@34000 {
++ cell-index = <0xd>;
++ compatible = "fsl,bman-portal";
++ reg = <0x34000 0x4000 0x100d000 0x1000>;
++ interrupts = <131 2 0 0>;
++};
++bman-portal@38000 {
++ cell-index = <0xe>;
++ compatible = "fsl,bman-portal";
++ reg = <0x38000 0x4000 0x100e000 0x1000>;
++ interrupts = <133 2 0 0>;
++};
++bman-portal@3c000 {
++ cell-index = <0xf>;
++ compatible = "fsl,bman-portal";
++ reg = <0x3c000 0x4000 0x100f000 0x1000>;
++ interrupts = <135 2 0 0>;
++};
++bman-portal@40000 {
++ cell-index = <0x10>;
++ compatible = "fsl,bman-portal";
++ reg = <0x40000 0x4000 0x1010000 0x1000>;
++ interrupts = <137 2 0 0>;
++};
++bman-portal@44000 {
++ cell-index = <0x11>;
++ compatible = "fsl,bman-portal";
++ reg = <0x44000 0x4000 0x1011000 0x1000>;
++ interrupts = <139 2 0 0>;
++};
++bman-portal@48000 {
++ cell-index = <0x12>;
++ compatible = "fsl,bman-portal";
++ reg = <0x48000 0x4000 0x1012000 0x1000>;
++ interrupts = <141 2 0 0>;
++};
++bman-portal@4c000 {
++ cell-index = <0x13>;
++ compatible = "fsl,bman-portal";
++ reg = <0x4c000 0x4000 0x1013000 0x1000>;
++ interrupts = <143 2 0 0>;
++};
++bman-portal@50000 {
++ cell-index = <0x14>;
++ compatible = "fsl,bman-portal";
++ reg = <0x50000 0x4000 0x1014000 0x1000>;
++ interrupts = <145 2 0 0>;
++};
++bman-portal@54000 {
++ cell-index = <0x15>;
++ compatible = "fsl,bman-portal";
++ reg = <0x54000 0x4000 0x1015000 0x1000>;
++ interrupts = <147 2 0 0>;
++};
++bman-portal@58000 {
++ cell-index = <0x16>;
++ compatible = "fsl,bman-portal";
++ reg = <0x58000 0x4000 0x1016000 0x1000>;
++ interrupts = <149 2 0 0>;
++};
++bman-portal@5c000 {
++ cell-index = <0x17>;
++ compatible = "fsl,bman-portal";
++ reg = <0x5c000 0x4000 0x1017000 0x1000>;
++ interrupts = <151 2 0 0>;
++};
++bman-portal@60000 {
++ cell-index = <0x18>;
++ compatible = "fsl,bman-portal";
++ reg = <0x60000 0x4000 0x1018000 0x1000>;
++ interrupts = <153 2 0 0>;
++};
++bman-portal@64000 {
++ cell-index = <0x19>;
++ compatible = "fsl,bman-portal";
++ reg = <0x64000 0x4000 0x1019000 0x1000>;
++ interrupts = <155 2 0 0>;
++};
++bman-portal@68000 {
++ cell-index = <0x1a>;
++ compatible = "fsl,bman-portal";
++ reg = <0x68000 0x4000 0x101a000 0x1000>;
++ interrupts = <157 2 0 0>;
++};
++bman-portal@6c000 {
++ cell-index = <0x1b>;
++ compatible = "fsl,bman-portal";
++ reg = <0x6c000 0x4000 0x101b000 0x1000>;
++ interrupts = <159 2 0 0>;
++};
++bman-portal@70000 {
++ cell-index = <0x1c>;
++ compatible = "fsl,bman-portal";
++ reg = <0x70000 0x4000 0x101c000 0x1000>;
++ interrupts = <161 2 0 0>;
++};
++bman-portal@74000 {
++ cell-index = <0x1d>;
++ compatible = "fsl,bman-portal";
++ reg = <0x74000 0x4000 0x101d000 0x1000>;
++ interrupts = <163 2 0 0>;
++};
++bman-portal@78000 {
++ cell-index = <0x1e>;
++ compatible = "fsl,bman-portal";
++ reg = <0x78000 0x4000 0x101e000 0x1000>;
++ interrupts = <165 2 0 0>;
++};
++bman-portal@7c000 {
++ cell-index = <0x1f>;
++ compatible = "fsl,bman-portal";
++ reg = <0x7c000 0x4000 0x101f000 0x1000>;
++ interrupts = <167 2 0 0>;
++};
++bman-portal@80000 {
++ cell-index = <0x20>;
++ compatible = "fsl,bman-portal";
++ reg = <0x80000 0x4000 0x1020000 0x1000>;
++ interrupts = <169 2 0 0>;
++};
++bman-portal@84000 {
++ cell-index = <0x21>;
++ compatible = "fsl,bman-portal";
++ reg = <0x84000 0x4000 0x1021000 0x1000>;
++ interrupts = <171 2 0 0>;
++};
++bman-portal@88000 {
++ cell-index = <0x22>;
++ compatible = "fsl,bman-portal";
++ reg = <0x88000 0x4000 0x1022000 0x1000>;
++ interrupts = <173 2 0 0>;
++};
++bman-portal@8c000 {
++ cell-index = <0x23>;
++ compatible = "fsl,bman-portal";
++ reg = <0x8c000 0x4000 0x1023000 0x1000>;
++ interrupts = <175 2 0 0>;
++};
++bman-portal@90000 {
++ cell-index = <0x24>;
++ compatible = "fsl,bman-portal";
++ reg = <0x90000 0x4000 0x1024000 0x1000>;
++ interrupts = <385 2 0 0>;
++};
++bman-portal@94000 {
++ cell-index = <0x25>;
++ compatible = "fsl,bman-portal";
++ reg = <0x94000 0x4000 0x1025000 0x1000>;
++ interrupts = <387 2 0 0>;
++};
++bman-portal@98000 {
++ cell-index = <0x26>;
++ compatible = "fsl,bman-portal";
++ reg = <0x98000 0x4000 0x1026000 0x1000>;
++ interrupts = <389 2 0 0>;
++};
++bman-portal@9c000 {
++ cell-index = <0x27>;
++ compatible = "fsl,bman-portal";
++ reg = <0x9c000 0x4000 0x1027000 0x1000>;
++ interrupts = <391 2 0 0>;
++};
++bman-portal@a0000 {
++ cell-index = <0x28>;
++ compatible = "fsl,bman-portal";
++ reg = <0xa0000 0x4000 0x1028000 0x1000>;
++ interrupts = <393 2 0 0>;
++};
++bman-portal@a4000 {
++ cell-index = <0x29>;
++ compatible = "fsl,bman-portal";
++ reg = <0xa4000 0x4000 0x1029000 0x1000>;
++ interrupts = <395 2 0 0>;
++};
++bman-portal@a8000 {
++ cell-index = <0x2a>;
++ compatible = "fsl,bman-portal";
++ reg = <0xa8000 0x4000 0x102a000 0x1000>;
++ interrupts = <397 2 0 0>;
++};
++bman-portal@ac000 {
++ cell-index = <0x2b>;
++ compatible = "fsl,bman-portal";
++ reg = <0xac000 0x4000 0x102b000 0x1000>;
++ interrupts = <399 2 0 0>;
++};
++bman-portal@b0000 {
++ cell-index = <0x2c>;
++ compatible = "fsl,bman-portal";
++ reg = <0xb0000 0x4000 0x102c000 0x1000>;
++ interrupts = <401 2 0 0>;
++};
++bman-portal@b4000 {
++ cell-index = <0x2d>;
++ compatible = "fsl,bman-portal";
++ reg = <0xb4000 0x4000 0x102d000 0x1000>;
++ interrupts = <403 2 0 0>;
++};
++bman-portal@b8000 {
++ cell-index = <0x2e>;
++ compatible = "fsl,bman-portal";
++ reg = <0xb8000 0x4000 0x102e000 0x1000>;
++ interrupts = <405 2 0 0>;
++};
++bman-portal@bc000 {
++ cell-index = <0x2f>;
++ compatible = "fsl,bman-portal";
++ reg = <0xbc000 0x4000 0x102f000 0x1000>;
++ interrupts = <407 2 0 0>;
++};
++bman-portal@c0000 {
++ cell-index = <0x30>;
++ compatible = "fsl,bman-portal";
++ reg = <0xc0000 0x4000 0x1030000 0x1000>;
++ interrupts = <409 2 0 0>;
++};
++bman-portal@c4000 {
++ cell-index = <0x31>;
++ compatible = "fsl,bman-portal";
++ reg = <0xc4000 0x4000 0x1031000 0x1000>;
++ interrupts = <411 2 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-dce-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-dce-0.dtsi
+new file mode 100644
+index 0000000..9b747ba
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-dce-0.dtsi
+@@ -0,0 +1,39 @@
++/*
++ * QorIQ DCE device tree stub [ controller @ offset 0x312000 ]
++ *
++ * Copyright 2012 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.
++ */
++
++dce: dce@312000 {
++ compatible = "fsl,dce";
++ reg = <0x312000 0x10000>;
++ interrupts = <16 2 1 4>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-dma-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-dma-0.dtsi
+new file mode 100644
+index 0000000..1aebf3e
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-dma-0.dtsi
+@@ -0,0 +1,66 @@
++/*
++ * QorIQ DMA device tree stub [ controller @ offset 0x100000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++dma0: dma@100300 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,eloplus-dma";
++ reg = <0x100300 0x4>;
++ ranges = <0x0 0x100100 0x200>;
++ cell-index = <0>;
++ dma-channel@0 {
++ compatible = "fsl,eloplus-dma-channel";
++ reg = <0x0 0x80>;
++ cell-index = <0>;
++ interrupts = <28 2 0 0>;
++ };
++ dma-channel@80 {
++ compatible = "fsl,eloplus-dma-channel";
++ reg = <0x80 0x80>;
++ cell-index = <1>;
++ interrupts = <29 2 0 0>;
++ };
++ dma-channel@100 {
++ compatible = "fsl,eloplus-dma-channel";
++ reg = <0x100 0x80>;
++ cell-index = <2>;
++ interrupts = <30 2 0 0>;
++ };
++ dma-channel@180 {
++ compatible = "fsl,eloplus-dma-channel";
++ reg = <0x180 0x80>;
++ cell-index = <3>;
++ interrupts = <31 2 0 0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-dma-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-dma-1.dtsi
+new file mode 100644
+index 0000000..ecf5e18
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-dma-1.dtsi
+@@ -0,0 +1,66 @@
++/*
++ * QorIQ DMA device tree stub [ controller @ offset 0x101000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++dma1: dma@101300 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,eloplus-dma";
++ reg = <0x101300 0x4>;
++ ranges = <0x0 0x101100 0x200>;
++ cell-index = <1>;
++ dma-channel@0 {
++ compatible = "fsl,eloplus-dma-channel";
++ reg = <0x0 0x80>;
++ cell-index = <0>;
++ interrupts = <32 2 0 0>;
++ };
++ dma-channel@80 {
++ compatible = "fsl,eloplus-dma-channel";
++ reg = <0x80 0x80>;
++ cell-index = <1>;
++ interrupts = <33 2 0 0>;
++ };
++ dma-channel@100 {
++ compatible = "fsl,eloplus-dma-channel";
++ reg = <0x100 0x80>;
++ cell-index = <2>;
++ interrupts = <34 2 0 0>;
++ };
++ dma-channel@180 {
++ compatible = "fsl,eloplus-dma-channel";
++ reg = <0x180 0x80>;
++ cell-index = <3>;
++ interrupts = <35 2 0 0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-dpaa-res1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-dpaa-res1.dtsi
+new file mode 100644
+index 0000000..6c6f7d7
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-dpaa-res1.dtsi
+@@ -0,0 +1,84 @@
++/*
++ * QorIQ DPAA resources device tree stub [ FQIDs, BPIDs ]
++ *
++ * Copyright 2011-2012 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.
++ */
++
++/* These stubs are required to alloc qbman drivers to determine what ranges of
++ * resources are available for dynamic allocation, primarily because there are
++ * some legacy "a priori" assumptions in certain subsystems (eg. networking)
++ * that certain resources are reserved for their use. When those drivers (and in
++ * some cases, their corresponding device-tree nodes) are updated to dynamically
++ * allocate their resources, then *all* resources can be managed by the
++ * allocators and there may be no further need to define these stubs.
++ *
++ * A couple of qualifiers to the above statement though:
++ *
++ * - Some resource ranges are hardware-specific, rather than being defined by
++ * software memory allocation choices. Eg. the number of available BPIDs is
++ * baked into silicon and so will probably always need to be expressed in the
++ * device-tree, though in that case it will express all BPIDs, not just those
++ * available for dynamic allocation.
++ *
++ * - Even for memory-backed resources that are software determined (FQIDs), this
++ * information may only be configured and available on the control-plane
++ * partition that manages the device, so in AMP or hypervised scenarios there
++ * may still be need to a way to provide allocation ranges. Ie. for O/S
++ * instances that don't know how many resources are available to hardware, and
++ * possibly even for O/S instances that do know how many are available but
++ * that should not "own" all of them.
++ */
++
++&bportals {
++ bman-bpids@0 {
++ compatible = "fsl,bpid-range";
++ fsl,bpid-range = <32 32>;
++ };
++};
++
++&qportals {
++ 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 = <0x21 0xf>;
++ };
++ qman-cgrids@0 {
++ compatible = "fsl,cgrid-range";
++ fsl,cgrid-range = <0 256>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-dpaa-res2.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-dpaa-res2.dtsi
+new file mode 100644
+index 0000000..73ee049
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-dpaa-res2.dtsi
+@@ -0,0 +1,63 @@
++/*
++ * QorIQ DPAA resources device tree stub [ FQIDs, BPIDs ]
++ *
++ * Copyright 2011-2012 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.
++ */
++
++/* The comments in qoriq-dpaa-res1.dtsi apply here too so will not be repeated.
++ * This alternative file is to support p1023 which does not have the same
++ * resource ranges as other SoCs to date. */
++
++&bportals {
++ bman-bpids@0 {
++ compatible = "fsl,bpid-range";
++ fsl,bpid-range = <1 7>;
++ };
++};
++
++&qportals {
++ 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 = <0x21 0x3>;
++ };
++ qman-cgrids@0 {
++ compatible = "fsl,cgrid-range";
++ fsl,cgrid-range = <0 64>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-dpaa-res3.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-dpaa-res3.dtsi
+new file mode 100644
+index 0000000..1bc5af9
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-dpaa-res3.dtsi
+@@ -0,0 +1,84 @@
++/*
++ * QorIQ DPAA resources device tree stub [ FQIDs, BPIDs ]
++ *
++ * Copyright 2011-2012 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.
++ */
++
++/* These stubs are required to alloc qbman drivers to determine what ranges of
++ * resources are available for dynamic allocation, primarily because there are
++ * some legacy "a priori" assumptions in certain subsystems (eg. networking)
++ * that certain resources are reserved for their use. When those drivers (and in
++ * some cases, their corresponding device-tree nodes) are updated to dynamically
++ * allocate their resources, then *all* resources can be managed by the
++ * allocators and there may be no further need to define these stubs.
++ *
++ * A couple of qualifiers to the above statement though:
++ *
++ * - Some resource ranges are hardware-specific, rather than being defined by
++ * software memory allocation choices. Eg. the number of available BPIDs is
++ * baked into silicon and so will probably always need to be expressed in the
++ * device-tree, though in that case it will express all BPIDs, not just those
++ * available for dynamic allocation.
++ *
++ * - Even for memory-backed resources that are software determined (FQIDs), this
++ * information may only be configured and available on the control-plane
++ * partition that manages the device, so in AMP or hypervised scenarios there
++ * may still be need to a way to provide allocation ranges. Ie. for O/S
++ * instances that don't know how many resources are available to hardware, and
++ * possibly even for O/S instances that do know how many are available but
++ * that should not "own" all of them.
++ */
++
++&bportals {
++ bman-bpids@0 {
++ compatible = "fsl,bpid-range";
++ fsl,bpid-range = <32 32>;
++ };
++};
++
++&qportals {
++ qman-fqids@0 {
++ compatible = "fsl,fqid-range";
++ fsl,fqid-range = <256 512>;
++ };
++ 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>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-duart-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-duart-0.dtsi
+new file mode 100644
+index 0000000..225c07b
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-duart-0.dtsi
+@@ -0,0 +1,51 @@
++/*
++ * QorIQ DUART device tree stub [ controller @ offset 0x11c000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++serial0: serial@11c500 {
++ cell-index = <0>;
++ device_type = "serial";
++ compatible = "fsl,ns16550", "ns16550";
++ reg = <0x11c500 0x100>;
++ clock-frequency = <0>;
++ interrupts = <36 2 0 0>;
++};
++
++serial1: serial@11c600 {
++ cell-index = <1>;
++ device_type = "serial";
++ compatible = "fsl,ns16550", "ns16550";
++ reg = <0x11c600 0x100>;
++ clock-frequency = <0>;
++ interrupts = <36 2 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-duart-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-duart-1.dtsi
+new file mode 100644
+index 0000000..d23233a
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-duart-1.dtsi
+@@ -0,0 +1,51 @@
++/*
++ * QorIQ DUART device tree stub [ controller @ offset 0x11d000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++serial2: serial@11d500 {
++ cell-index = <2>;
++ device_type = "serial";
++ compatible = "fsl,ns16550", "ns16550";
++ reg = <0x11d500 0x100>;
++ clock-frequency = <0>;
++ interrupts = <37 2 0 0>;
++};
++
++serial3: serial@11d600 {
++ cell-index = <3>;
++ device_type = "serial";
++ compatible = "fsl,ns16550", "ns16550";
++ reg = <0x11d600 0x100>;
++ clock-frequency = <0>;
++ interrupts = <37 2 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-esdhc-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-esdhc-0.dtsi
+new file mode 100644
+index 0000000..20835ae
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-esdhc-0.dtsi
+@@ -0,0 +1,40 @@
++/*
++ * QorIQ eSDHC device tree stub [ controller @ offset 0x114000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++sdhc: sdhc@114000 {
++ compatible = "fsl,esdhc";
++ reg = <0x114000 0x1000>;
++ interrupts = <48 2 0 0>;
++ clock-frequency = <0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-espi-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-espi-0.dtsi
+new file mode 100644
+index 0000000..6db0697
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-espi-0.dtsi
+@@ -0,0 +1,41 @@
++/*
++ * QorIQ eSPI device tree stub [ controller @ offset 0x110000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++spi@110000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,mpc8536-espi";
++ reg = <0x110000 0x1000>;
++ interrupts = <53 0x2 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman-0-10g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman-0-10g-0.dtsi
+new file mode 100644
+index 0000000..c5c5086
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman-0-10g-0.dtsi
+@@ -0,0 +1,63 @@
++/*
++ * QorIQ FMan 10g port #0 device tree stub [ controller @ offset 0x400000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++fman@400000 {
++ 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 = <0x40>;
++ };
++
++ ethernet@f0000 {
++ cell-index = <0>;
++ compatible = "fsl,fman-10g-mac";
++ reg = <0xf0000 0x1000>;
++ fsl,port-handles = <&fman0_10g_rx0 &fman0_10g_tx0>;
++ };
++
++ xmdio0: mdio@f1000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-xmdio";
++ reg = <0xf1000 0x1000>;
++ interrupts = <100 1 0 0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman-0-1g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman-0-1g-0.dtsi
+new file mode 100644
+index 0000000..e52cb1f
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman-0-1g-0.dtsi
+@@ -0,0 +1,63 @@
++/*
++ * QorIQ FMan 1g port #0 device tree stub [ controller @ offset 0x400000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++fman@400000 {
++ 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>;
++ };
++
++ ethernet@e0000 {
++ cell-index = <0>;
++ compatible = "fsl,fman-1g-mac";
++ reg = <0xe0000 0x1000>;
++ fsl,port-handles = <&fman0_rx0 &fman0_tx0>;
++ ptimer-handle = <&ptp_timer0>;
++ };
++
++ mdio0: mdio@e1120 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-mdio";
++ reg = <0xe1120 0xee0>;
++ interrupts = <100 1 0 0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman-0-1g-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman-0-1g-1.dtsi
+new file mode 100644
+index 0000000..a500a84
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman-0-1g-1.dtsi
+@@ -0,0 +1,63 @@
++/*
++ * QorIQ FMan 1g port #1 device tree stub [ controller @ offset 0x400000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++fman@400000 {
++ 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>;
++ };
++
++ ethernet@e2000 {
++ cell-index = <1>;
++ compatible = "fsl,fman-1g-mac";
++ reg = <0xe2000 0x1000>;
++ fsl,port-handles = <&fman0_rx1 &fman0_tx1>;
++ ptimer-handle = <&ptp_timer0>;
++ };
++
++ mdio@e3120 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-tbi";
++ reg = <0xe3120 0xee0>;
++ interrupts = <100 1 0 0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman-0-1g-2.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman-0-1g-2.dtsi
+new file mode 100644
+index 0000000..14a8d22
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman-0-1g-2.dtsi
+@@ -0,0 +1,63 @@
++/*
++ * QorIQ FMan 1g port #2 device tree stub [ controller @ offset 0x400000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++fman@400000 {
++ 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>;
++ };
++
++ ethernet@e4000 {
++ cell-index = <2>;
++ compatible = "fsl,fman-1g-mac";
++ reg = <0xe4000 0x1000>;
++ fsl,port-handles = <&fman0_rx2 &fman0_tx2>;
++ ptimer-handle = <&ptp_timer0>;
++ };
++
++ mdio@e5120 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-tbi";
++ reg = <0xe5120 0xee0>;
++ interrupts = <100 1 0 0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman-0-1g-3.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman-0-1g-3.dtsi
+new file mode 100644
+index 0000000..fbd5887
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman-0-1g-3.dtsi
+@@ -0,0 +1,63 @@
++/*
++ * QorIQ FMan 1g port #3 device tree stub [ controller @ offset 0x400000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++fman@400000 {
++ 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>;
++ };
++
++ ethernet@e6000 {
++ cell-index = <3>;
++ compatible = "fsl,fman-1g-mac";
++ reg = <0xe6000 0x1000>;
++ fsl,port-handles = <&fman0_rx3 &fman0_tx3>;
++ ptimer-handle = <&ptp_timer0>;
++ };
++
++ mdio@e7120 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-tbi";
++ reg = <0xe7120 0xee0>;
++ interrupts = <100 1 0 0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman-0-1g-4.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman-0-1g-4.dtsi
+new file mode 100644
+index 0000000..1c27647
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman-0-1g-4.dtsi
+@@ -0,0 +1,63 @@
++/*
++ * QorIQ FMan 1g port #4 device tree stub [ controller @ offset 0x400000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++fman@400000 {
++ 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>;
++ };
++
++ ethernet@e8000 {
++ cell-index = <4>;
++ compatible = "fsl,fman-1g-mac";
++ reg = <0xe8000 0x1000>;
++ fsl,port-handles = <&fman0_rx4 &fman0_tx4>;
++ ptimer-handle = <&ptp_timer0>;
++ };
++
++ mdio@e9120 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-tbi";
++ reg = <0xe9120 0xee0>;
++ interrupts = <100 1 0 0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman-0.dtsi
+new file mode 100644
+index 0000000..b074d13
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman-0.dtsi
+@@ -0,0 +1,140 @@
++/*
++ * QorIQ FMan device tree stub [ controller @ offset 0x400000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++fman0: fman@400000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ cell-index = <0>;
++ compatible = "fsl,fman", "simple-bus";
++ ranges = <0 0x400000 0x100000>;
++ reg = <0x400000 0x100000>;
++ clock-frequency = <0>;
++ interrupts = <
++ 96 2 0 0
++ 16 2 1 1>;
++
++ cc {
++ compatible = "fsl,fman-cc";
++ };
++
++ muram@0 {
++ compatible = "fsl,fman-muram";
++ reg = <0x0 0x28000>;
++ };
++
++ bmi@80000 {
++ compatible = "fsl,fman-bmi";
++ reg = <0x80000 0x400>;
++ };
++
++ qmi@80400 {
++ compatible = "fsl,fman-qmi";
++ reg = <0x80400 0x400>;
++ };
++
++ fman0_oh0: port@81000 {
++ cell-index = <0>;
++ compatible = "fsl,fman-port-oh";
++ reg = <0x81000 0x1000>;
++ };
++
++ fman0_oh1: port@82000 {
++ cell-index = <1>;
++ compatible = "fsl,fman-port-oh";
++ reg = <0x82000 0x1000>;
++ };
++
++ fman0_oh2: port@83000 {
++ cell-index = <2>;
++ compatible = "fsl,fman-port-oh";
++ reg = <0x83000 0x1000>;
++ };
++
++ fman0_oh3: port@84000 {
++ cell-index = <3>;
++ compatible = "fsl,fman-port-oh";
++ reg = <0x84000 0x1000>;
++ };
++
++ fman0_oh4: port@85000 {
++ cell-index = <4>;
++ compatible = "fsl,fman-port-oh";
++ reg = <0x85000 0x1000>;
++ status = "disabled";
++ };
++
++ fman0_oh5: port@86000 {
++ cell-index = <5>;
++ compatible = "fsl,fman-port-oh";
++ reg = <0x86000 0x1000>;
++ status = "disabled";
++ };
++
++ fman0_oh6: port@87000 {
++ cell-index = <6>;
++ compatible = "fsl,fman-port-oh";
++ reg = <0x87000 0x1000>;
++ status = "disabled";
++ };
++
++ 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>;
++ };
++
++ ptp_timer0: rtc@fe000 {
++ compatible = "fsl,fman-rtc";
++ reg = <0xfe000 0x1000>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman-1-10g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman-1-10g-0.dtsi
+new file mode 100644
+index 0000000..dcaf84a
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman-1-10g-0.dtsi
+@@ -0,0 +1,54 @@
++/*
++ * QorIQ FMan 10g port #0 device tree stub [ controller @ offset 0x500000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++fman@500000 {
++ fman1_10g_rx0: port@90000 {
++ cell-index = <0>;
++ compatible = "fsl,fman-port-10g-rx";
++ reg = <0x90000 0x1000>;
++ };
++
++ fman1_10g_tx0: port@b0000 {
++ cell-index = <0>;
++ compatible = "fsl,fman-port-10g-tx";
++ reg = <0xb0000 0x1000>;
++ };
++
++ ethernet@f0000 {
++ cell-index = <0>;
++ compatible = "fsl,fman-10g-mac";
++ reg = <0xf0000 0x1000>;
++ fsl,port-handles = <&fman1_10g_rx0 &fman1_10g_tx0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman-1-1g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman-1-1g-0.dtsi
+new file mode 100644
+index 0000000..5280661
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman-1-1g-0.dtsi
+@@ -0,0 +1,63 @@
++/*
++ * QorIQ FMan 1g port #0 device tree stub [ controller @ offset 0x500000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++fman@500000 {
++ fman1_rx0: port@88000 {
++ cell-index = <0>;
++ compatible = "fsl,fman-port-1g-rx";
++ reg = <0x88000 0x1000>;
++ };
++
++ fman1_tx0: port@a8000 {
++ cell-index = <0>;
++ compatible = "fsl,fman-port-1g-tx";
++ reg = <0xa8000 0x1000>;
++ };
++
++ ethernet@e0000 {
++ cell-index = <0>;
++ compatible = "fsl,fman-1g-mac";
++ reg = <0xe0000 0x1000>;
++ fsl,port-handles = <&fman1_rx0 &fman1_tx0>;
++ ptimer-handle = <&ptp_timer1>;
++ };
++
++ mdio@e1120 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-tbi";
++ reg = <0xe1120 0xee0>;
++ interrupts = <101 1 0 0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman-1-1g-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman-1-1g-1.dtsi
+new file mode 100644
+index 0000000..1d5fcde
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman-1-1g-1.dtsi
+@@ -0,0 +1,63 @@
++/*
++ * QorIQ FMan 1g port #1 device tree stub [ controller @ offset 0x500000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++fman@500000 {
++ fman1_rx1: port@89000 {
++ cell-index = <1>;
++ compatible = "fsl,fman-port-1g-rx";
++ reg = <0x89000 0x1000>;
++ };
++
++ fman1_tx1: port@a9000 {
++ cell-index = <1>;
++ compatible = "fsl,fman-port-1g-tx";
++ reg = <0xa9000 0x1000>;
++ };
++
++ ethernet@e2000 {
++ cell-index = <1>;
++ compatible = "fsl,fman-1g-mac";
++ reg = <0xe2000 0x1000>;
++ fsl,port-handles = <&fman1_rx1 &fman1_tx1>;
++ ptimer-handle = <&ptp_timer1>;
++ };
++
++ mdio@e3120 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-tbi";
++ reg = <0xe3120 0xee0>;
++ interrupts = <101 1 0 0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman-1-1g-2.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman-1-1g-2.dtsi
+new file mode 100644
+index 0000000..cf6cab1
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman-1-1g-2.dtsi
+@@ -0,0 +1,63 @@
++/*
++ * QorIQ FMan 1g port #2 device tree stub [ controller @ offset 0x500000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++fman@500000 {
++ fman1_rx2: port@8a000 {
++ cell-index = <2>;
++ compatible = "fsl,fman-port-1g-rx";
++ reg = <0x8a000 0x1000>;
++ };
++
++ fman1_tx2: port@aa000 {
++ cell-index = <2>;
++ compatible = "fsl,fman-port-1g-tx";
++ reg = <0xaa000 0x1000>;
++ };
++
++ ethernet@e4000 {
++ cell-index = <2>;
++ compatible = "fsl,fman-1g-mac";
++ reg = <0xe4000 0x1000>;
++ fsl,port-handles = <&fman1_rx2 &fman1_tx2>;
++ ptimer-handle = <&ptp_timer1>;
++ };
++
++ mdio@e5120 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-tbi";
++ reg = <0xe5120 0xee0>;
++ interrupts = <101 1 0 0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman-1-1g-3.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman-1-1g-3.dtsi
+new file mode 100644
+index 0000000..0d85b37
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman-1-1g-3.dtsi
+@@ -0,0 +1,63 @@
++/*
++ * QorIQ FMan 1g port #3 device tree stub [ controller @ offset 0x500000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++fman@500000 {
++ fman1_rx3: port@8b000 {
++ cell-index = <3>;
++ compatible = "fsl,fman-port-1g-rx";
++ reg = <0x8b000 0x1000>;
++ };
++
++ fman1_tx3: port@ab000 {
++ cell-index = <3>;
++ compatible = "fsl,fman-port-1g-tx";
++ reg = <0xab000 0x1000>;
++ };
++
++ ethernet@e6000 {
++ cell-index = <3>;
++ compatible = "fsl,fman-1g-mac";
++ reg = <0xe6000 0x1000>;
++ fsl,port-handles = <&fman1_rx3 &fman1_tx3>;
++ ptimer-handle = <&ptp_timer1>;
++ };
++
++ mdio@e7120 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-tbi";
++ reg = <0xe7120 0xee0>;
++ interrupts = <101 1 0 0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman-1-1g-4.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman-1-1g-4.dtsi
+new file mode 100644
+index 0000000..ed0f504
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman-1-1g-4.dtsi
+@@ -0,0 +1,63 @@
++/*
++ * QorIQ FMan 1g port #4 device tree stub [ controller @ offset 0x500000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++fman@500000 {
++ fman1_rx4: port@8c000 {
++ cell-index = <4>;
++ compatible = "fsl,fman-port-1g-rx";
++ reg = <0x8c000 0x1000>;
++ };
++
++ fman1_tx4: port@ac000 {
++ cell-index = <4>;
++ compatible = "fsl,fman-port-1g-tx";
++ reg = <0xac000 0x1000>;
++ };
++
++ ethernet@e8000 {
++ cell-index = <4>;
++ compatible = "fsl,fman-1g-mac";
++ reg = <0xe8000 0x1000>;
++ fsl,port-handles = <&fman1_rx4 &fman1_tx4>;
++ ptimer-handle = <&ptp_timer1>;
++ };
++
++ mdio@e9120 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-tbi";
++ reg = <0xe9120 0xee0>;
++ interrupts = <101 1 0 0>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman-1.dtsi
+new file mode 100644
+index 0000000..d94f6cc
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman-1.dtsi
+@@ -0,0 +1,140 @@
++/*
++ * QorIQ FMan device tree stub [ controller @ offset 0x500000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++fman1: fman@500000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ cell-index = <1>;
++ compatible = "fsl,fman", "simple-bus";
++ ranges = <0 0x500000 0x100000>;
++ reg = <0x500000 0x100000>;
++ clock-frequency = <0>;
++ interrupts = <
++ 97 2 0 0
++ 16 2 1 0>;
++
++ cc {
++ compatible = "fsl,fman-cc";
++ };
++
++ muram@0 {
++ compatible = "fsl,fman-muram";
++ reg = <0x0 0x28000>;
++ };
++
++ bmi@80000 {
++ compatible = "fsl,fman-bmi";
++ reg = <0x80000 0x400>;
++ };
++
++ qmi@80400 {
++ compatible = "fsl,fman-qmi";
++ reg = <0x80400 0x400>;
++ };
++
++ fman1_oh0: port@81000 {
++ cell-index = <0>;
++ compatible = "fsl,fman-port-oh";
++ reg = <0x81000 0x1000>;
++ };
++
++ fman1_oh1: port@82000 {
++ cell-index = <1>;
++ compatible = "fsl,fman-port-oh";
++ reg = <0x82000 0x1000>;
++ };
++
++ fman1_oh2: port@83000 {
++ cell-index = <2>;
++ compatible = "fsl,fman-port-oh";
++ reg = <0x83000 0x1000>;
++ };
++
++ fman1_oh3: port@84000 {
++ cell-index = <3>;
++ compatible = "fsl,fman-port-oh";
++ reg = <0x84000 0x1000>;
++ };
++
++ fman1_oh4: port@85000 {
++ cell-index = <4>;
++ compatible = "fsl,fman-port-oh";
++ reg = <0x85000 0x1000>;
++ status = "disabled";
++ };
++
++ fman1_oh5: port@86000 {
++ cell-index = <5>;
++ compatible = "fsl,fman-port-oh";
++ reg = <0x86000 0x1000>;
++ status = "disabled";
++ };
++
++ fman1_oh6: port@87000 {
++ cell-index = <6>;
++ compatible = "fsl,fman-port-oh";
++ reg = <0x87000 0x1000>;
++ status = "disabled";
++ };
++
++ 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>;
++ };
++
++ ptp_timer1: rtc@fe000 {
++ compatible = "fsl,fman-rtc";
++ reg = <0xfe000 0x1000>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi
+new file mode 100644
+index 0000000..72c306c
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi
+@@ -0,0 +1,62 @@
++/*
++ * QorIQ FMan v3 10g port #0 device tree stub [ controller @ offset 0x400000 ]
++ *
++ * Copyright 2012 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.
++ */
++
++fman@400000 {
++ 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>;
++ };
++
++ 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-tbi";
++ reg = <0xf1000 0x1000>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi
+new file mode 100644
+index 0000000..c53dadc
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi
+@@ -0,0 +1,62 @@
++/*
++ * QorIQ FMan v3 10g port #1 device tree stub [ controller @ offset 0x400000 ]
++ *
++ * Copyright 2012 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.
++ */
++
++fman@400000 {
++ fman0_10g_rx1: port@91000 {
++ cell-index = <1>;
++ compatible = "fsl,fman-port-10g-rx";
++ reg = <0x91000 0x1000>;
++ };
++
++ fman0_10g_tx1: port@b1000 {
++ cell-index = <1>;
++ compatible = "fsl,fman-port-10g-tx";
++ reg = <0xb1000 0x1000>;
++ fsl,qman-channel-id = <0x801>;
++ };
++
++ ethernet@f2000 {
++ cell-index = <1>;
++ compatible = "fsl,fman-memac";
++ reg = <0xf2000 0x1000>;
++ fsl,port-handles = <&fman0_10g_rx1 &fman0_10g_tx1>;
++ };
++
++ mdio@f3000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-memac-tbi";
++ reg = <0xf3000 0x1000>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi
+new file mode 100644
+index 0000000..5d34959
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi
+@@ -0,0 +1,62 @@
++/*
++ * QorIQ FMan v3 1g port #0 device tree stub [ controller @ offset 0x400000 ]
++ *
++ * Copyright 2012 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.
++ */
++
++fman@400000 {
++ 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>;
++ };
++
++ 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-tbi";
++ reg = <0xe1000 0x1000>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi
+new file mode 100644
+index 0000000..39620a3
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi
+@@ -0,0 +1,62 @@
++/*
++ * QorIQ FMan v3 1g port #1 device tree stub [ controller @ offset 0x400000 ]
++ *
++ * Copyright 2012 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.
++ */
++
++fman@400000 {
++ 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>;
++ };
++
++ 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-tbi";
++ reg = <0xe3000 0x1000>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi
+new file mode 100644
+index 0000000..9c1fb1a
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi
+@@ -0,0 +1,62 @@
++/*
++ * QorIQ FMan v3 1g port #2 device tree stub [ controller @ offset 0x400000 ]
++ *
++ * Copyright 2012 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.
++ */
++
++fman@400000 {
++ 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>;
++ };
++
++ 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-tbi";
++ reg = <0xe5000 0x1000>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi
+new file mode 100644
+index 0000000..5d2ba1a
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi
+@@ -0,0 +1,62 @@
++/*
++ * QorIQ FMan v3 1g port #3 device tree stub [ controller @ offset 0x400000 ]
++ *
++ * Copyright 2012 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.
++ */
++
++fman@400000 {
++ 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>;
++ };
++
++ 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-tbi";
++ reg = <0xe7000 0x1000>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi
+new file mode 100644
+index 0000000..4b1820b
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi
+@@ -0,0 +1,62 @@
++/*
++ * QorIQ FMan v3 1g port #4 device tree stub [ controller @ offset 0x400000 ]
++ *
++ * Copyright 2012 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.
++ */
++
++fman@400000 {
++ 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>;
++ };
++
++ 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-tbi";
++ reg = <0xe9000 0x1000>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi
+new file mode 100644
+index 0000000..aa06d13
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi
+@@ -0,0 +1,62 @@
++/*
++ * QorIQ FMan v3 1g port #5 device tree stub [ controller @ offset 0x400000 ]
++ *
++ * Copyright 2012 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.
++ */
++
++fman@400000 {
++ 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>;
++ };
++
++ 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-tbi";
++ reg = <0xeb000 0x1000>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0.dtsi
+new file mode 100644
+index 0000000..28f38b9
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0.dtsi
+@@ -0,0 +1,150 @@
++/*
++ * QorIQ FMan v3 device tree stub [ controller @ offset 0x400000 ]
++ *
++ * Copyright 2012 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.
++ */
++
++fman0: fman@400000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ cell-index = <0>;
++ compatible = "fsl,fman", "simple-bus";
++ ranges = <0 0x400000 0x100000>;
++ reg = <0x400000 0x100000>;
++ clock-frequency = <0>;
++ interrupts = <
++ 96 2 0 0
++ 16 2 1 1>;
++
++ 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>;
++ };
++
++ mdio@fc000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-memac-mdio";
++ reg = <0xfc000 0x1000>;
++ };
++
++ mdio@fd000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-memac-mdio";
++ reg = <0xfd000 0x1000>;
++ };
++
++ ptp_timer0: rtc@fe000 {
++ compatible = "fsl,fman-rtc";
++ reg = <0xfe000 0x1000>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi
+new file mode 100644
+index 0000000..b63fb54
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi
+@@ -0,0 +1,62 @@
++/*
++ * QorIQ FMan v3 10g port #0 device tree stub [ controller @ offset 0x500000 ]
++ *
++ * Copyright 2012 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.
++ */
++
++fman@500000 {
++ fman1_10g_rx0: port@90000 {
++ cell-index = <0>;
++ compatible = "fsl,fman-port-10g-rx";
++ reg = <0x90000 0x1000>;
++ };
++
++ fman1_10g_tx0: port@b0000 {
++ cell-index = <0>;
++ compatible = "fsl,fman-port-10g-tx";
++ reg = <0xb0000 0x1000>;
++ fsl,qman-channel-id = <0x820>;
++ };
++
++ ethernet@f0000 {
++ cell-index = <0>;
++ compatible = "fsl,fman-memac";
++ reg = <0xf0000 0x1000>;
++ fsl,port-handles = <&fman1_10g_rx0 &fman1_10g_tx0>;
++ };
++
++ mdio@f1000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-memac-tbi";
++ reg = <0xf1000 0x1000>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi
+new file mode 100644
+index 0000000..56cb7b1
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi
+@@ -0,0 +1,62 @@
++/*
++ * QorIQ FMan v3 10g port #1 device tree stub [ controller @ offset 0x500000 ]
++ *
++ * Copyright 2012 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.
++ */
++
++fman@500000 {
++ fman1_10g_rx1: port@91000 {
++ cell-index = <1>;
++ compatible = "fsl,fman-port-10g-rx";
++ reg = <0x91000 0x1000>;
++ };
++
++ fman1_10g_tx1: port@b1000 {
++ cell-index = <1>;
++ compatible = "fsl,fman-port-10g-tx";
++ reg = <0xb1000 0x1000>;
++ fsl,qman-channel-id = <0x821>;
++ };
++
++ ethernet@f2000 {
++ cell-index = <1>;
++ compatible = "fsl,fman-memac";
++ reg = <0xf2000 0x1000>;
++ fsl,port-handles = <&fman1_10g_rx1 &fman1_10g_tx1>;
++ };
++
++ mdio@f3000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-memac-tbi";
++ reg = <0xf3000 0x1000>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi
+new file mode 100644
+index 0000000..6a4fea5
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi
+@@ -0,0 +1,62 @@
++/*
++ * QorIQ FMan v3 1g port #0 device tree stub [ controller @ offset 0x500000 ]
++ *
++ * Copyright 2012 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.
++ */
++
++fman@500000 {
++ fman1_rx0: port@88000 {
++ cell-index = <0>;
++ compatible = "fsl,fman-port-1g-rx";
++ reg = <0x88000 0x1000>;
++ };
++
++ fman1_tx0: port@a8000 {
++ cell-index = <0>;
++ compatible = "fsl,fman-port-1g-tx";
++ reg = <0xa8000 0x1000>;
++ };
++
++ ethernet@e0000 {
++ cell-index = <0>;
++ compatible = "fsl,fman-memac";
++ reg = <0xe0000 0x1000>;
++ fsl,port-handles = <&fman1_rx0 &fman1_tx0>;
++ ptimer-handle = <&ptp_timer1>;
++ };
++
++ mdio@e1000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-memac-tbi";
++ reg = <0xe1000 0x1000>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi
+new file mode 100644
+index 0000000..80f0cd9
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi
+@@ -0,0 +1,62 @@
++/*
++ * QorIQ FMan v3 1g port #1 device tree stub [ controller @ offset 0x500000 ]
++ *
++ * Copyright 2012 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.
++ */
++
++fman@500000 {
++ fman1_rx1: port@89000 {
++ cell-index = <1>;
++ compatible = "fsl,fman-port-1g-rx";
++ reg = <0x89000 0x1000>;
++ };
++
++ fman1_tx1: port@a9000 {
++ cell-index = <1>;
++ compatible = "fsl,fman-port-1g-tx";
++ reg = <0xa9000 0x1000>;
++ };
++
++ ethernet@e2000 {
++ cell-index = <1>;
++ compatible = "fsl,fman-memac";
++ reg = <0xe2000 0x1000>;
++ fsl,port-handles = <&fman1_rx1 &fman1_tx1>;
++ ptimer-handle = <&ptp_timer1>;
++ };
++
++ mdio@e3000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-memac-tbi";
++ reg = <0xe3000 0x1000>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi
+new file mode 100644
+index 0000000..a0cbf96
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi
+@@ -0,0 +1,62 @@
++/*
++ * QorIQ FMan v3 1g port #2 device tree stub [ controller @ offset 0x500000 ]
++ *
++ * Copyright 2012 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.
++ */
++
++fman@500000 {
++ fman1_rx2: port@8a000 {
++ cell-index = <2>;
++ compatible = "fsl,fman-port-1g-rx";
++ reg = <0x8a000 0x1000>;
++ };
++
++ fman1_tx2: port@aa000 {
++ cell-index = <2>;
++ compatible = "fsl,fman-port-1g-tx";
++ reg = <0xaa000 0x1000>;
++ };
++
++ ethernet@e4000 {
++ cell-index = <2>;
++ compatible = "fsl,fman-memac";
++ reg = <0xe4000 0x1000>;
++ fsl,port-handles = <&fman1_rx2 &fman1_tx2>;
++ ptimer-handle = <&ptp_timer1>;
++ };
++
++ mdio@e5000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-memac-tbi";
++ reg = <0xe5000 0x1000>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi
+new file mode 100644
+index 0000000..636ff3e
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi
+@@ -0,0 +1,62 @@
++/*
++ * QorIQ FMan v3 1g port #3 device tree stub [ controller @ offset 0x500000 ]
++ *
++ * Copyright 2012 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.
++ */
++
++fman@500000 {
++ fman1_rx3: port@8b000 {
++ cell-index = <3>;
++ compatible = "fsl,fman-port-1g-rx";
++ reg = <0x8b000 0x1000>;
++ };
++
++ fman1_tx3: port@ab000 {
++ cell-index = <3>;
++ compatible = "fsl,fman-port-1g-tx";
++ reg = <0xab000 0x1000>;
++ };
++
++ ethernet@e6000 {
++ cell-index = <3>;
++ compatible = "fsl,fman-memac";
++ reg = <0xe6000 0x1000>;
++ fsl,port-handles = <&fman1_rx3 &fman1_tx3>;
++ ptimer-handle = <&ptp_timer1>;
++ };
++
++ mdio@e7000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-memac-tbi";
++ reg = <0xe7000 0x1000>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi
+new file mode 100644
+index 0000000..ba12e35
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi
+@@ -0,0 +1,62 @@
++/*
++ * QorIQ FMan v3 1g port #4 device tree stub [ controller @ offset 0x500000 ]
++ *
++ * Copyright 2012 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.
++ */
++
++fman@500000 {
++ fman1_rx4: port@8c000 {
++ cell-index = <4>;
++ compatible = "fsl,fman-port-1g-rx";
++ reg = <0x8c000 0x1000>;
++ };
++
++ fman1_tx4: port@ac000 {
++ cell-index = <4>;
++ compatible = "fsl,fman-port-1g-tx";
++ reg = <0xac000 0x1000>;
++ };
++
++ ethernet@e8000 {
++ cell-index = <4>;
++ compatible = "fsl,fman-memac";
++ reg = <0xe8000 0x1000>;
++ fsl,port-handles = <&fman1_rx4 &fman1_tx4>;
++ ptimer-handle = <&ptp_timer1>;
++ };
++
++ mdio@e9000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-memac-tbi";
++ reg = <0xe9000 0x1000>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi
+new file mode 100644
+index 0000000..c8d145e
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi
+@@ -0,0 +1,62 @@
++/*
++ * QorIQ FMan v3 1g port #5 device tree stub [ controller @ offset 0x500000 ]
++ *
++ * Copyright 2012 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.
++ */
++
++fman@500000 {
++ fman1_rx5: port@8d000 {
++ cell-index = <5>;
++ compatible = "fsl,fman-port-1g-rx";
++ reg = <0x8d000 0x1000>;
++ };
++
++ fman1_tx5: port@ad000 {
++ cell-index = <5>;
++ compatible = "fsl,fman-port-1g-tx";
++ reg = <0xad000 0x1000>;
++ };
++
++ ethernet@ea000 {
++ cell-index = <5>;
++ compatible = "fsl,fman-memac";
++ reg = <0xea000 0x1000>;
++ fsl,port-handles = <&fman1_rx5 &fman1_tx5>;
++ ptimer-handle = <&ptp_timer1>;
++ };
++
++ mdio@eb000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-memac-tbi";
++ reg = <0xeb000 0x1000>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1.dtsi
+new file mode 100644
+index 0000000..4eeb060
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1.dtsi
+@@ -0,0 +1,150 @@
++/*
++ * QorIQ FMan v3 device tree stub [ controller @ offset 0x500000 ]
++ *
++ * Copyright 2012 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.
++ */
++
++fman1: fman@500000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ cell-index = <1>;
++ compatible = "fsl,fman", "simple-bus";
++ ranges = <0 0x500000 0x100000>;
++ reg = <0x500000 0x100000>;
++ clock-frequency = <0>;
++ interrupts = <
++ 97 2 0 0
++ 16 2 1 0>;
++
++ 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>;
++ };
++
++ fman1_oh1: port@82000 {
++ cell-index = <0>;
++ compatible = "fsl,fman-port-oh";
++ reg = <0x82000 0x1000>;
++ };
++
++ fman1_oh2: port@83000 {
++ cell-index = <1>;
++ compatible = "fsl,fman-port-oh";
++ reg = <0x83000 0x1000>;
++ };
++
++ fman1_oh3: port@84000 {
++ cell-index = <2>;
++ compatible = "fsl,fman-port-oh";
++ reg = <0x84000 0x1000>;
++ };
++
++ fman1_oh4: port@85000 {
++ cell-index = <3>;
++ compatible = "fsl,fman-port-oh";
++ reg = <0x85000 0x1000>;
++ };
++
++ fman1_oh5: port@86000 {
++ cell-index = <4>;
++ compatible = "fsl,fman-port-oh";
++ reg = <0x86000 0x1000>;
++ };
++
++ fman1_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>;
++ };
++
++ mdio@fc000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-memac-mdio";
++ reg = <0xfc000 0x1000>;
++ };
++
++ mdio@fd000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,fman-memac-mdio";
++ reg = <0xfd000 0x1000>;
++ };
++
++ ptp_timer1: rtc@fe000 {
++ compatible = "fsl,fman-rtc";
++ reg = <0xfe000 0x1000>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-gpio-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-gpio-0.dtsi
+new file mode 100644
+index 0000000..cf714f5
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-gpio-0.dtsi
+@@ -0,0 +1,41 @@
++/*
++ * QorIQ GPIO device tree stub [ controller @ offset 0x130000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++gpio0: gpio@130000 {
++ compatible = "fsl,qoriq-gpio";
++ reg = <0x130000 0x1000>;
++ interrupts = <55 2 0 0>;
++ #gpio-cells = <2>;
++ gpio-controller;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-i2c-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-i2c-0.dtsi
+new file mode 100644
+index 0000000..5f9bf7d
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-i2c-0.dtsi
+@@ -0,0 +1,53 @@
++/*
++ * QorIQ I2C device tree stub [ controller @ offset 0x118000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++i2c@118000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <0>;
++ compatible = "fsl-i2c";
++ reg = <0x118000 0x100>;
++ interrupts = <38 2 0 0>;
++ dfsrr;
++};
++
++i2c@118100 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <1>;
++ compatible = "fsl-i2c";
++ reg = <0x118100 0x100>;
++ interrupts = <38 2 0 0>;
++ dfsrr;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-i2c-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-i2c-1.dtsi
+new file mode 100644
+index 0000000..7989bf5
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-i2c-1.dtsi
+@@ -0,0 +1,53 @@
++/*
++ * QorIQ I2C device tree stub [ controller @ offset 0x119000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++i2c@119000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <2>;
++ compatible = "fsl-i2c";
++ reg = <0x119000 0x100>;
++ interrupts = <39 2 0 0>;
++ dfsrr;
++};
++
++i2c@119100 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <3>;
++ compatible = "fsl-i2c";
++ reg = <0x119100 0x100>;
++ interrupts = <39 2 0 0>;
++ dfsrr;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-mpic.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-mpic.dtsi
+new file mode 100644
+index 0000000..08f4227
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-mpic.dtsi
+@@ -0,0 +1,106 @@
++/*
++ * QorIQ MPIC device tree stub [ controller @ offset 0x40000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++mpic: pic@40000 {
++ interrupt-controller;
++ #address-cells = <0>;
++ #interrupt-cells = <4>;
++ reg = <0x40000 0x40000>;
++ compatible = "fsl,mpic", "chrp,open-pic";
++ device_type = "open-pic";
++ clock-frequency = <0x0>;
++};
++
++timer@41100 {
++ compatible = "fsl,mpic-global-timer";
++ reg = <0x41100 0x100 0x41300 4>;
++ interrupts = <0 0 3 0
++ 1 0 3 0
++ 2 0 3 0
++ 3 0 3 0>;
++};
++
++msi0: msi@41600 {
++ compatible = "fsl,mpic-msi";
++ reg = <0x41600 0x200 0x44140 4>;
++ msi-available-ranges = <0 0x100>;
++ interrupts = <
++ 0xe0 0 0 0
++ 0xe1 0 0 0
++ 0xe2 0 0 0
++ 0xe3 0 0 0
++ 0xe4 0 0 0
++ 0xe5 0 0 0
++ 0xe6 0 0 0
++ 0xe7 0 0 0>;
++};
++
++msi1: msi@41800 {
++ compatible = "fsl,mpic-msi";
++ reg = <0x41800 0x200 0x45140 4>;
++ msi-available-ranges = <0 0x100>;
++ interrupts = <
++ 0xe8 0 0 0
++ 0xe9 0 0 0
++ 0xea 0 0 0
++ 0xeb 0 0 0
++ 0xec 0 0 0
++ 0xed 0 0 0
++ 0xee 0 0 0
++ 0xef 0 0 0>;
++};
++
++msi2: msi@41a00 {
++ compatible = "fsl,mpic-msi";
++ reg = <0x41a00 0x200 0x46140 4>;
++ msi-available-ranges = <0 0x100>;
++ interrupts = <
++ 0xf0 0 0 0
++ 0xf1 0 0 0
++ 0xf2 0 0 0
++ 0xf3 0 0 0
++ 0xf4 0 0 0
++ 0xf5 0 0 0
++ 0xf6 0 0 0
++ 0xf7 0 0 0>;
++};
++
++timer@42100 {
++ compatible = "fsl,mpic-global-timer";
++ reg = <0x42100 0x100 0x42300 4>;
++ interrupts = <4 0 3 0
++ 5 0 3 0
++ 6 0 3 0
++ 7 0 3 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-pme-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-pme-0.dtsi
+new file mode 100644
+index 0000000..8789df1
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-pme-0.dtsi
+@@ -0,0 +1,39 @@
++/*
++ * QorIQ PME device tree stub [ controller @ offset 0x316000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++pme: pme@316000 {
++ compatible = "fsl,pme";
++ reg = <0x316000 0x10000>;
++ interrupts = <16 2 1 5>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-qman-ceetm0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-qman-ceetm0.dtsi
+new file mode 100644
+index 0000000..9d3cf3e
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-qman-ceetm0.dtsi
+@@ -0,0 +1,43 @@
++/*
++ * QorIQ QMan CEETM stub
++ *
++ * Copyright 2012 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 {
++ 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>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-qman-ceetm1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-qman-ceetm1.dtsi
+new file mode 100644
+index 0000000..4028542
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-qman-ceetm1.dtsi
+@@ -0,0 +1,43 @@
++/*
++ * QorIQ QMan CEETM stub
++ *
++ * Copyright 2012 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 {
++ qman-ceetm@1 {
++ compatible = "fsl,qman-ceetm";
++ fsl,ceetm-lfqid-range = <0xf10000 0x1000>;
++ fsl,ceetm-sp-range = <0 12>;
++ fsl,ceetm-lni-range = <0 8>;
++ fsl,ceetm-channel-range = <0 32>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-qman1-portals.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-qman1-portals.dtsi
+new file mode 100644
+index 0000000..8476b32
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-qman1-portals.dtsi
+@@ -0,0 +1,116 @@
++/*
++ * QorIQ QMan Portal device tree stub for 10 portals & 15 pool channels
++ *
++ * Copyright 2011-2012 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.
++ */
++
++#address-cells = <0x1>;
++#size-cells = <0x1>;
++compatible = "simple-bus";
++qportal0: qman-portal@0 {
++ cell-index = <0x0>;
++ compatible = "fsl,qman-portal";
++ reg = <0x0 0x4000 0x100000 0x1000>;
++ interrupts = <104 0x2 0 0>;
++ fsl,qman-channel-id = <0x0>;
++};
++
++qportal1: qman-portal@4000 {
++ cell-index = <0x1>;
++ compatible = "fsl,qman-portal";
++ reg = <0x4000 0x4000 0x101000 0x1000>;
++ interrupts = <106 0x2 0 0>;
++ fsl,qman-channel-id = <0x1>;
++};
++
++qportal2: qman-portal@8000 {
++ cell-index = <0x2>;
++ compatible = "fsl,qman-portal";
++ reg = <0x8000 0x4000 0x102000 0x1000>;
++ interrupts = <108 0x2 0 0>;
++ fsl,qman-channel-id = <0x2>;
++};
++
++qportal3: qman-portal@c000 {
++ cell-index = <0x3>;
++ compatible = "fsl,qman-portal";
++ reg = <0xc000 0x4000 0x103000 0x1000>;
++ interrupts = <110 0x2 0 0>;
++ fsl,qman-channel-id = <0x3>;
++};
++
++qportal4: qman-portal@10000 {
++ cell-index = <0x4>;
++ compatible = "fsl,qman-portal";
++ reg = <0x10000 0x4000 0x104000 0x1000>;
++ interrupts = <112 0x2 0 0>;
++ fsl,qman-channel-id = <0x4>;
++};
++
++qportal5: qman-portal@14000 {
++ cell-index = <0x5>;
++ compatible = "fsl,qman-portal";
++ reg = <0x14000 0x4000 0x105000 0x1000>;
++ interrupts = <114 0x2 0 0>;
++ fsl,qman-channel-id = <0x5>;
++};
++
++qportal6: qman-portal@18000 {
++ cell-index = <0x6>;
++ compatible = "fsl,qman-portal";
++ reg = <0x18000 0x4000 0x106000 0x1000>;
++ interrupts = <116 0x2 0 0>;
++ fsl,qman-channel-id = <0x6>;
++};
++
++qportal7: qman-portal@1c000 {
++ cell-index = <0x7>;
++ compatible = "fsl,qman-portal";
++ reg = <0x1c000 0x4000 0x107000 0x1000>;
++ interrupts = <118 0x2 0 0>;
++ fsl,qman-channel-id = <0x7>;
++};
++
++qportal8: qman-portal@20000 {
++ cell-index = <0x8>;
++ compatible = "fsl,qman-portal";
++ reg = <0x20000 0x4000 0x108000 0x1000>;
++ interrupts = <120 0x2 0 0>;
++ fsl,qman-channel-id = <0x8>;
++};
++
++qportal9: qman-portal@24000 {
++ cell-index = <0x9>;
++ compatible = "fsl,qman-portal";
++ reg = <0x24000 0x4000 0x109000 0x1000>;
++ interrupts = <122 0x2 0 0>;
++ fsl,qman-channel-id = <0x9>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-qman1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-qman1.dtsi
+new file mode 100644
+index 0000000..8edd2c0
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-qman1.dtsi
+@@ -0,0 +1,39 @@
++/*
++ * QorIQ QMan device tree stub [ controller @ offset 0x318000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++qman: qman@318000 {
++ compatible = "fsl,qman";
++ reg = <0x318000 0x2000>;
++ interrupts = <16 2 1 3>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-qman2-portals.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-qman2-portals.dtsi
+new file mode 100644
+index 0000000..6c6010d
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-qman2-portals.dtsi
+@@ -0,0 +1,436 @@
++/*
++ * QorIQ QMan Portal device tree stub for QMan 3.0 with maximum 50 portals.
++ *
++ * Copyright 2011-2012 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.
++ */
++
++#address-cells = <0x1>;
++#size-cells = <0x1>;
++compatible = "simple-bus";
++qportal0: qman-portal@0 {
++ cell-index = <0x0>;
++ compatible = "fsl,qman-portal";
++ reg = <0x0 0x4000 0x1000000 0x1000>;
++ interrupts = <104 0x2 0 0>;
++ fsl,qman-channel-id = <0x0>;
++};
++
++qportal1: qman-portal@4000 {
++ cell-index = <0x1>;
++ compatible = "fsl,qman-portal";
++ reg = <0x4000 0x4000 0x1001000 0x1000>;
++ interrupts = <106 0x2 0 0>;
++ fsl,qman-channel-id = <0x1>;
++};
++
++qportal2: qman-portal@8000 {
++ cell-index = <0x2>;
++ compatible = "fsl,qman-portal";
++ reg = <0x8000 0x4000 0x1002000 0x1000>;
++ interrupts = <108 0x2 0 0>;
++ fsl,qman-channel-id = <0x2>;
++};
++
++qportal3: qman-portal@c000 {
++ cell-index = <0x3>;
++ compatible = "fsl,qman-portal";
++ reg = <0xc000 0x4000 0x1003000 0x1000>;
++ interrupts = <110 0x2 0 0>;
++ fsl,qman-channel-id = <0x3>;
++};
++
++qportal4: qman-portal@10000 {
++ cell-index = <0x4>;
++ compatible = "fsl,qman-portal";
++ reg = <0x10000 0x4000 0x1004000 0x1000>;
++ interrupts = <112 0x2 0 0>;
++ fsl,qman-channel-id = <0x4>;
++};
++
++qportal5: qman-portal@14000 {
++ cell-index = <0x5>;
++ compatible = "fsl,qman-portal";
++ reg = <0x14000 0x4000 0x1005000 0x1000>;
++ interrupts = <114 0x2 0 0>;
++ fsl,qman-channel-id = <0x5>;
++};
++
++qportal6: qman-portal@18000 {
++ cell-index = <0x6>;
++ compatible = "fsl,qman-portal";
++ reg = <0x18000 0x4000 0x1006000 0x1000>;
++ interrupts = <116 0x2 0 0>;
++ fsl,qman-channel-id = <0x6>;
++};
++
++qportal7: qman-portal@1c000 {
++ cell-index = <0x7>;
++ compatible = "fsl,qman-portal";
++ reg = <0x1c000 0x4000 0x1007000 0x1000>;
++ interrupts = <118 0x2 0 0>;
++ fsl,qman-channel-id = <0x7>;
++};
++
++qportal8: qman-portal@20000 {
++ cell-index = <0x8>;
++ compatible = "fsl,qman-portal";
++ reg = <0x20000 0x4000 0x1008000 0x1000>;
++ interrupts = <120 0x2 0 0>;
++ fsl,qman-channel-id = <0x8>;
++};
++
++qportal9: qman-portal@24000 {
++ cell-index = <0x9>;
++ compatible = "fsl,qman-portal";
++ reg = <0x24000 0x4000 0x1009000 0x1000>;
++ interrupts = <122 0x2 0 0>;
++ fsl,qman-channel-id = <0x9>;
++};
++
++qportal10: qman-portal@28000 {
++ cell-index = <0xa>;
++ compatible = "fsl,qman-portal";
++ reg = <0x28000 0x4000 0x100a000 0x1000>;
++ interrupts = <124 0x2 0 0>;
++ fsl,qman-channel-id = <0xa>;
++};
++
++qportal11: qman-portal@2c000 {
++ cell-index = <0xb>;
++ compatible = "fsl,qman-portal";
++ reg = <0x2c000 0x4000 0x100b000 0x1000>;
++ interrupts = <126 0x2 0 0>;
++ fsl,qman-channel-id = <0xb>;
++};
++
++qportal12: qman-portal@30000 {
++ cell-index = <0xc>;
++ compatible = "fsl,qman-portal";
++ reg = <0x30000 0x4000 0x100c000 0x1000>;
++ interrupts = <128 0x2 0 0>;
++ fsl,qman-channel-id = <0xc>;
++};
++
++qportal13: qman-portal@34000 {
++ cell-index = <0xd>;
++ compatible = "fsl,qman-portal";
++ reg = <0x34000 0x4000 0x100d000 0x1000>;
++ interrupts = <130 0x2 0 0>;
++ fsl,qman-channel-id = <0xd>;
++};
++
++qportal14: qman-portal@38000 {
++ cell-index = <0xe>;
++ compatible = "fsl,qman-portal";
++ reg = <0x38000 0x4000 0x100e000 0x1000>;
++ interrupts = <132 0x2 0 0>;
++ fsl,qman-channel-id = <0xe>;
++};
++
++qportal15: qman-portal@3c000 {
++ cell-index = <0xf>;
++ compatible = "fsl,qman-portal";
++ reg = <0x3c000 0x4000 0x100f000 0x1000>;
++ interrupts = <134 0x2 0 0>;
++ fsl,qman-channel-id = <0xf>;
++};
++
++qportal16: qman-portal@40000 {
++ cell-index = <0x10>;
++ compatible = "fsl,qman-portal";
++ reg = <0x40000 0x4000 0x1010000 0x1000>;
++ interrupts = <136 0x2 0 0>;
++ fsl,qman-channel-id = <0x10>;
++};
++
++qportal17: qman-portal@44000 {
++ cell-index = <0x11>;
++ compatible = "fsl,qman-portal";
++ reg = <0x44000 0x4000 0x1011000 0x1000>;
++ interrupts = <138 0x2 0 0>;
++ fsl,qman-channel-id = <0x11>;
++};
++
++qportal18: qman-portal@48000 {
++ cell-index = <0x12>;
++ compatible = "fsl,qman-portal";
++ reg = <0x48000 0x4000 0x1012000 0x1000>;
++ interrupts = <140 0x2 0 0>;
++ fsl,qman-channel-id = <0x12>;
++};
++
++qportal19: qman-portal@4c000 {
++ cell-index = <0x13>;
++ compatible = "fsl,qman-portal";
++ reg = <0x4c000 0x4000 0x1013000 0x1000>;
++ interrupts = <142 0x2 0 0>;
++ fsl,qman-channel-id = <0x13>;
++};
++
++qportal20: qman-portal@50000 {
++ cell-index = <0x14>;
++ compatible = "fsl,qman-portal";
++ reg = <0x50000 0x4000 0x1014000 0x1000>;
++ interrupts = <144 0x2 0 0>;
++ fsl,qman-channel-id = <0x14>;
++};
++
++qportal21: qman-portal@54000 {
++ cell-index = <0x15>;
++ compatible = "fsl,qman-portal";
++ reg = <0x54000 0x4000 0x1015000 0x1000>;
++ interrupts = <146 0x2 0 0>;
++ fsl,qman-channel-id = <0x15>;
++};
++
++qportal22: qman-portal@58000 {
++ cell-index = <0x16>;
++ compatible = "fsl,qman-portal";
++ reg = <0x58000 0x4000 0x1016000 0x1000>;
++ interrupts = <148 0x2 0 0>;
++ fsl,qman-channel-id = <0x16>;
++};
++
++qportal23: qman-portal@5c000 {
++ cell-index = <0x17>;
++ compatible = "fsl,qman-portal";
++ reg = <0x5c000 0x4000 0x1017000 0x1000>;
++ interrupts = <150 0x2 0 0>;
++ fsl,qman-channel-id = <0x17>;
++};
++
++qportal24: qman-portal@60000 {
++ cell-index = <0x18>;
++ compatible = "fsl,qman-portal";
++ reg = <0x60000 0x4000 0x1018000 0x1000>;
++ interrupts = <152 0x2 0 0>;
++ fsl,qman-channel-id = <0x18>;
++};
++
++qportal25: qman-portal@64000 {
++ cell-index = <0x19>;
++ compatible = "fsl,qman-portal";
++ reg = <0x64000 0x4000 0x1019000 0x1000>;
++ interrupts = <154 0x2 0 0>;
++ fsl,qman-channel-id = <0x19>;
++};
++
++qportal26: qman-portal@68000 {
++ cell-index = <0x1a>;
++ compatible = "fsl,qman-portal";
++ reg = <0x68000 0x4000 0x101a000 0x1000>;
++ interrupts = <156 0x2 0 0>;
++ fsl,qman-channel-id = <0x1a>;
++};
++
++qportal27: qman-portal@6c000 {
++ cell-index = <0x1b>;
++ compatible = "fsl,qman-portal";
++ reg = <0x6c000 0x4000 0x101b000 0x1000>;
++ interrupts = <158 0x2 0 0>;
++ fsl,qman-channel-id = <0x1b>;
++};
++
++qportal28: qman-portal@70000 {
++ cell-index = <0x1c>;
++ compatible = "fsl,qman-portal";
++ reg = <0x70000 0x4000 0x101c000 0x1000>;
++ interrupts = <160 0x2 0 0>;
++ fsl,qman-channel-id = <0x1c>;
++};
++
++qportal29: qman-portal@74000 {
++ cell-index = <0x1d>;
++ compatible = "fsl,qman-portal";
++ reg = <0x74000 0x4000 0x101d000 0x1000>;
++ interrupts = <162 0x2 0 0>;
++ fsl,qman-channel-id = <0x1d>;
++};
++
++qportal30: qman-portal@78000 {
++ cell-index = <0x1e>;
++ compatible = "fsl,qman-portal";
++ reg = <0x78000 0x4000 0x101e000 0x1000>;
++ interrupts = <164 0x2 0 0>;
++ fsl,qman-channel-id = <0x1e>;
++};
++
++qportal31: qman-portal@7c000 {
++ cell-index = <0x1f>;
++ compatible = "fsl,qman-portal";
++ reg = <0x7c000 0x4000 0x101f000 0x1000>;
++ interrupts = <166 0x2 0 0>;
++ fsl,qman-channel-id = <0x1f>;
++};
++
++qportal32: qman-portal@80000 {
++ cell-index = <0x20>;
++ compatible = "fsl,qman-portal";
++ reg = <0x80000 0x4000 0x1020000 0x1000>;
++ interrupts = <168 0x2 0 0>;
++ fsl,qman-channel-id = <0x20>;
++};
++
++qportal33: qman-portal@84000 {
++ cell-index = <0x21>;
++ compatible = "fsl,qman-portal";
++ reg = <0x84000 0x4000 0x1021000 0x1000>;
++ interrupts = <170 0x2 0 0>;
++ fsl,qman-channel-id = <0x21>;
++};
++
++qportal34: qman-portal@88000 {
++ cell-index = <0x22>;
++ compatible = "fsl,qman-portal";
++ reg = <0x88000 0x4000 0x1022000 0x1000>;
++ interrupts = <172 0x2 0 0>;
++ fsl,qman-channel-id = <0x22>;
++};
++
++qportal35: qman-portal@8c000 {
++ cell-index = <0x23>;
++ compatible = "fsl,qman-portal";
++ reg = <0x8c000 0x4000 0x1023000 0x1000>;
++ interrupts = <174 0x2 0 0>;
++ fsl,qman-channel-id = <0x23>;
++};
++
++qportal36: qman-portal@90000 {
++ cell-index = <0x24>;
++ compatible = "fsl,qman-portal";
++ reg = <0x90000 0x4000 0x1024000 0x1000>;
++ interrupts = <384 0x2 0 0>;
++ fsl,qman-channel-id = <0x24>;
++};
++
++qportal37: qman-portal@94000 {
++ cell-index = <0x25>;
++ compatible = "fsl,qman-portal";
++ reg = <0x94000 0x4000 0x1025000 0x1000>;
++ interrupts = <386 0x2 0 0>;
++ fsl,qman-channel-id = <0x25>;
++};
++
++qportal38: qman-portal@98000 {
++ cell-index = <0x26>;
++ compatible = "fsl,qman-portal";
++ reg = <0x98000 0x4000 0x1026000 0x1000>;
++ interrupts = <388 0x2 0 0>;
++ fsl,qman-channel-id = <0x26>;
++};
++
++qportal39: qman-portal@9c000 {
++ cell-index = <0x27>;
++ compatible = "fsl,qman-portal";
++ reg = <0x9c000 0x4000 0x1027000 0x1000>;
++ interrupts = <390 0x2 0 0>;
++ fsl,qman-channel-id = <0x27>;
++};
++
++qportal40: qman-portal@a0000 {
++ cell-index = <0x28>;
++ compatible = "fsl,qman-portal";
++ reg = <0xa0000 0x4000 0x1028000 0x1000>;
++ interrupts = <392 0x2 0 0>;
++ fsl,qman-channel-id = <0x28>;
++};
++
++qportal41: qman-portal@a4000 {
++ cell-index = <0x29>;
++ compatible = "fsl,qman-portal";
++ reg = <0xa4000 0x4000 0x1029000 0x1000>;
++ interrupts = <394 0x2 0 0>;
++ fsl,qman-channel-id = <0x29>;
++};
++
++qportal42: qman-portal@a8000 {
++ cell-index = <0x2a>;
++ compatible = "fsl,qman-portal";
++ reg = <0xa8000 0x4000 0x102a000 0x1000>;
++ interrupts = <396 0x2 0 0>;
++ fsl,qman-channel-id = <0x2a>;
++};
++
++qportal43: qman-portal@ac000 {
++ cell-index = <0x2b>;
++ compatible = "fsl,qman-portal";
++ reg = <0xac000 0x4000 0x102b000 0x1000>;
++ interrupts = <398 0x2 0 0>;
++ fsl,qman-channel-id = <0x2b>;
++};
++
++qportal44: qman-portal@b0000 {
++ cell-index = <0x2c>;
++ compatible = "fsl,qman-portal";
++ reg = <0xb0000 0x4000 0x102c000 0x1000>;
++ interrupts = <400 0x2 0 0>;
++ fsl,qman-channel-id = <0x2c>;
++};
++
++qportal45: qman-portal@b4000 {
++ cell-index = <0x2d>;
++ compatible = "fsl,qman-portal";
++ reg = <0xb4000 0x4000 0x102d000 0x1000>;
++ interrupts = <402 0x2 0 0>;
++ fsl,qman-channel-id = <0x2d>;
++};
++
++qportal46: qman-portal@b8000 {
++ cell-index = <0x2e>;
++ compatible = "fsl,qman-portal";
++ reg = <0xb8000 0x4000 0x102e000 0x1000>;
++ interrupts = <404 0x2 0 0>;
++ fsl,qman-channel-id = <0x2e>;
++};
++
++qportal47: qman-portal@bc000 {
++ cell-index = <0x2f>;
++ compatible = "fsl,qman-portal";
++ reg = <0xbc000 0x4000 0x102f000 0x1000>;
++ interrupts = <406 0x2 0 0>;
++ fsl,qman-channel-id = <0x2f>;
++};
++
++qportal48: qman-portal@c0000 {
++ cell-index = <0x30>;
++ compatible = "fsl,qman-portal";
++ reg = <0xc0000 0x4000 0x1030000 0x1000>;
++ interrupts = <408 0x2 0 0>;
++ fsl,qman-channel-id = <0x30>;
++};
++
++qportal49: qman-portal@c4000 {
++ cell-index = <0x31>;
++ compatible = "fsl,qman-portal";
++ reg = <0xc4000 0x4000 0x1031000 0x1000>;
++ interrupts = <410 0x2 0 0>;
++ fsl,qman-channel-id = <0x31>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-raid1.0-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-raid1.0-0.dtsi
+new file mode 100644
+index 0000000..d2f1315
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-raid1.0-0.dtsi
+@@ -0,0 +1,85 @@
++/*
++ * QorIQ RAID 1.0 device tree stub [ controller @ offset 0x320000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++raideng: raideng@320000 {
++ compatible = "fsl,raideng-v1.0";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0x320000 0x10000>;
++ ranges = <0 0x320000 0x10000>;
++
++ raideng_jq0@1000 {
++ compatible = "fsl,raideng-v1.0-job-queue";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0x1000 0x1000>;
++ ranges = <0x0 0x1000 0x1000>;
++
++ raideng_jr0: jr@0 {
++ compatible = "fsl,raideng-v1.0-job-ring", "fsl,raideng-v1.0-hp-ring";
++ reg = <0x0 0x400>;
++ interrupts = <139 2 0 0>;
++ interrupt-parent = <&mpic>;
++ };
++
++ raideng_jr1: jr@400 {
++ compatible = "fsl,raideng-v1.0-job-ring", "fsl,raideng-v1.0-lp-ring";
++ reg = <0x400 0x400>;
++ interrupts = <140 2 0 0>;
++ interrupt-parent = <&mpic>;
++ };
++ };
++
++ raideng_jq1@2000 {
++ compatible = "fsl,raideng-v1.0-job-queue";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0x2000 0x1000>;
++ ranges = <0x0 0x2000 0x1000>;
++
++ raideng_jr2: jr@0 {
++ compatible = "fsl,raideng-v1.0-job-ring", "fsl,raideng-v1.0-hp-ring";
++ reg = <0x0 0x400>;
++ interrupts = <141 2 0 0>;
++ interrupt-parent = <&mpic>;
++ };
++
++ raideng_jr3: jr@400 {
++ compatible = "fsl,raideng-v1.0-job-ring", "fsl,raideng-v1.0-lp-ring";
++ reg = <0x400 0x400>;
++ interrupts = <142 2 0 0>;
++ interrupt-parent = <&mpic>;
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-rman-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-rman-0.dtsi
+new file mode 100644
+index 0000000..3fcfdde
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-rman-0.dtsi
+@@ -0,0 +1,63 @@
++/*
++ * QorIQ RMan device tree stub [ controller @ offset 0x1e0000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++rman: rman@1e0000 {
++ compatible = "fsl,rman";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ ranges = <0x0 0x1e0000 0x20000>;
++ reg = <0x1e0000 0x20000>;
++ interrupts = <16 2 1 11>; /* err_irq */
++
++ inbound-block@0 {
++ compatible = "fsl,rman-inbound-block";
++ reg = <0x0 0x800>;
++ };
++ global-cfg@b00 {
++ compatible = "fsl,rman-global-cfg";
++ reg = <0xb00 0x500>;
++ };
++ inbound-block@1000 {
++ compatible = "fsl,rman-inbound-block";
++ reg = <0x1000 0x800>;
++ };
++ inbound-block@2000 {
++ compatible = "fsl,rman-inbound-block";
++ reg = <0x2000 0x800>;
++ };
++ inbound-block@3000 {
++ compatible = "fsl,rman-inbound-block";
++ reg = <0x3000 0x800>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-rmu-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-rmu-0.dtsi
+new file mode 100644
+index 0000000..ca7fec7
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-rmu-0.dtsi
+@@ -0,0 +1,68 @@
++/*
++ * QorIQ RIO Message Unit device tree stub [ controller @ offset 0xd3000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++rmu: rmu@d3000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,srio-rmu";
++ reg = <0xd3000 0x500>;
++ ranges = <0x0 0xd3000 0x500>;
++
++ message-unit@0 {
++ compatible = "fsl,srio-msg-unit";
++ reg = <0x0 0x100>;
++ interrupts = <
++ 60 2 0 0 /* msg1_tx_irq */
++ 61 2 0 0>;/* msg1_rx_irq */
++ };
++ message-unit@100 {
++ compatible = "fsl,srio-msg-unit";
++ reg = <0x100 0x100>;
++ interrupts = <
++ 62 2 0 0 /* msg2_tx_irq */
++ 63 2 0 0>;/* msg2_rx_irq */
++ };
++ doorbell-unit@400 {
++ compatible = "fsl,srio-dbell-unit";
++ reg = <0x400 0x80>;
++ interrupts = <
++ 56 2 0 0 /* bell_outb_irq */
++ 57 2 0 0>;/* bell_inb_irq */
++ };
++ port-write-unit@4e0 {
++ compatible = "fsl,srio-port-write-unit";
++ reg = <0x4e0 0x20>;
++ interrupts = <16 2 1 11>;
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-sata2-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-sata2-0.dtsi
+new file mode 100644
+index 0000000..b642047
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-sata2-0.dtsi
+@@ -0,0 +1,39 @@
++/*
++ * QorIQ SATAv2 device tree stub [ controller @ offset 0x220000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++sata@220000 {
++ compatible = "fsl,pq-sata-v2";
++ reg = <0x220000 0x1000>;
++ interrupts = <68 0x2 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-sata2-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-sata2-1.dtsi
+new file mode 100644
+index 0000000..c573702
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-sata2-1.dtsi
+@@ -0,0 +1,39 @@
++/*
++ * QorIQ SATAv2 device tree stub [ controller @ offset 0x221000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++sata@221000 {
++ compatible = "fsl,pq-sata-v2";
++ reg = <0x221000 0x1000>;
++ interrupts = <69 0x2 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-sec4.0-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-sec4.0-0.dtsi
+new file mode 100644
+index 0000000..0cbbac3
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-sec4.0-0.dtsi
+@@ -0,0 +1,100 @@
++/*
++ * QorIQ Sec/Crypto 4.0 device tree stub [ controller @ offset 0x300000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++crypto: crypto@300000 {
++ compatible = "fsl,sec-v4.0";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0x300000 0x10000>;
++ ranges = <0 0x300000 0x10000>;
++ interrupts = <92 2 0 0>;
++
++ sec_jr0: jr@1000 {
++ compatible = "fsl,sec-v4.0-job-ring";
++ reg = <0x1000 0x1000>;
++ interrupts = <88 2 0 0>;
++ };
++
++ sec_jr1: jr@2000 {
++ compatible = "fsl,sec-v4.0-job-ring";
++ reg = <0x2000 0x1000>;
++ interrupts = <89 2 0 0>;
++ };
++
++ sec_jr2: jr@3000 {
++ compatible = "fsl,sec-v4.0-job-ring";
++ reg = <0x3000 0x1000>;
++ interrupts = <90 2 0 0>;
++ };
++
++ sec_jr3: jr@4000 {
++ compatible = "fsl,sec-v4.0-job-ring";
++ reg = <0x4000 0x1000>;
++ interrupts = <91 2 0 0>;
++ };
++
++ rtic@6000 {
++ compatible = "fsl,sec-v4.0-rtic";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0x6000 0x100>;
++ ranges = <0x0 0x6100 0xe00>;
++
++ rtic_a: rtic-a@0 {
++ compatible = "fsl,sec-v4.0-rtic-memory";
++ reg = <0x00 0x20 0x100 0x80>;
++ };
++
++ rtic_b: rtic-b@20 {
++ compatible = "fsl,sec-v4.0-rtic-memory";
++ reg = <0x20 0x20 0x200 0x80>;
++ };
++
++ rtic_c: rtic-c@40 {
++ compatible = "fsl,sec-v4.0-rtic-memory";
++ reg = <0x40 0x20 0x300 0x80>;
++ };
++
++ rtic_d: rtic-d@60 {
++ compatible = "fsl,sec-v4.0-rtic-memory";
++ reg = <0x60 0x20 0x500 0x80>;
++ };
++ };
++};
++
++sec_mon: sec_mon@314000 {
++ compatible = "fsl,sec-v4.0-mon";
++ reg = <0x314000 0x1000>;
++ interrupts = <93 2 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-sec4.1-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-sec4.1-0.dtsi
+new file mode 100644
+index 0000000..3308986
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-sec4.1-0.dtsi
+@@ -0,0 +1,109 @@
++/*
++ * QorIQ Sec/Crypto 4.1 device tree stub [ controller @ offset 0x300000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++crypto: crypto@300000 {
++ compatible = "fsl,sec-v4.1", "fsl,sec-v4.0";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0x300000 0x10000>;
++ ranges = <0 0x300000 0x10000>;
++ interrupts = <92 2 0 0>;
++
++ sec_jr0: jr@1000 {
++ compatible = "fsl,sec-v4.1-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x1000 0x1000>;
++ interrupts = <88 2 0 0>;
++ };
++
++ sec_jr1: jr@2000 {
++ compatible = "fsl,sec-v4.1-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x2000 0x1000>;
++ interrupts = <89 2 0 0>;
++ };
++
++ sec_jr2: jr@3000 {
++ compatible = "fsl,sec-v4.1-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x3000 0x1000>;
++ interrupts = <90 2 0 0>;
++ };
++
++ sec_jr3: jr@4000 {
++ compatible = "fsl,sec-v4.1-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x4000 0x1000>;
++ interrupts = <91 2 0 0>;
++ };
++
++ rtic@6000 {
++ compatible = "fsl,sec-v4.1-rtic",
++ "fsl,sec-v4.0-rtic";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0x6000 0x100>;
++ ranges = <0x0 0x6100 0xe00>;
++
++ rtic_a: rtic-a@0 {
++ compatible = "fsl,sec-v4.1-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x00 0x20 0x100 0x80>;
++ };
++
++ rtic_b: rtic-b@20 {
++ compatible = "fsl,sec-v4.1-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x20 0x20 0x200 0x80>;
++ };
++
++ rtic_c: rtic-c@40 {
++ compatible = "fsl,sec-v4.1-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x40 0x20 0x300 0x80>;
++ };
++
++ rtic_d: rtic-d@60 {
++ compatible = "fsl,sec-v4.1-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x60 0x20 0x500 0x80>;
++ };
++ };
++};
++
++sec_mon: sec_mon@314000 {
++ compatible = "fsl,sec-v4.1-mon", "fsl,sec-v4.0-mon";
++ reg = <0x314000 0x1000>;
++ interrupts = <93 2 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-sec4.2-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-sec4.2-0.dtsi
+new file mode 100644
+index 0000000..7990e0d
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-sec4.2-0.dtsi
+@@ -0,0 +1,109 @@
++/*
++ * QorIQ Sec/Crypto 4.2 device tree stub [ controller @ offset 0x300000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++crypto: crypto@300000 {
++ compatible = "fsl,sec-v4.2", "fsl,sec-v4.0";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0x300000 0x10000>;
++ ranges = <0 0x300000 0x10000>;
++ interrupts = <92 2 0 0>;
++
++ sec_jr0: jr@1000 {
++ compatible = "fsl,sec-v4.2-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x1000 0x1000>;
++ interrupts = <88 2 0 0>;
++ };
++
++ sec_jr1: jr@2000 {
++ compatible = "fsl,sec-v4.2-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x2000 0x1000>;
++ interrupts = <89 2 0 0>;
++ };
++
++ sec_jr2: jr@3000 {
++ compatible = "fsl,sec-v4.2-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x3000 0x1000>;
++ interrupts = <90 2 0 0>;
++ };
++
++ sec_jr3: jr@4000 {
++ compatible = "fsl,sec-v4.2-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x4000 0x1000>;
++ interrupts = <91 2 0 0>;
++ };
++
++ rtic@6000 {
++ compatible = "fsl,sec-v4.2-rtic",
++ "fsl,sec-v4.0-rtic";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0x6000 0x100>;
++ ranges = <0x0 0x6100 0xe00>;
++
++ rtic_a: rtic-a@0 {
++ compatible = "fsl,sec-v4.2-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x00 0x20 0x100 0x80>;
++ };
++
++ rtic_b: rtic-b@20 {
++ compatible = "fsl,sec-v4.2-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x20 0x20 0x200 0x80>;
++ };
++
++ rtic_c: rtic-c@40 {
++ compatible = "fsl,sec-v4.2-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x40 0x20 0x300 0x80>;
++ };
++
++ rtic_d: rtic-d@60 {
++ compatible = "fsl,sec-v4.2-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x60 0x20 0x500 0x80>;
++ };
++ };
++};
++
++sec_mon: sec_mon@314000 {
++ compatible = "fsl,sec-v4.2-mon", "fsl,sec-v4.0-mon";
++ reg = <0x314000 0x1000>;
++ interrupts = <93 2 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-sec5.0-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-sec5.0-0.dtsi
+new file mode 100644
+index 0000000..ffd458f
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-sec5.0-0.dtsi
+@@ -0,0 +1,109 @@
++/*
++ * QorIQ Sec/Crypto 5.0 device tree stub [ controller @ offset 0x300000 ]
++ *
++ * Copyright 2012 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.
++ */
++
++crypto: crypto@300000 {
++ compatible = "fsl,sec-v5.0", "fsl,sec-v4.0";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0x300000 0x10000>;
++ ranges = <0 0x300000 0x10000>;
++ interrupts = <92 2 0 0>;
++
++ sec_jr0: jr@1000 {
++ compatible = "fsl,sec-v5.0-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x1000 0x1000>;
++ interrupts = <88 2 0 0>;
++ };
++
++ sec_jr1: jr@2000 {
++ compatible = "fsl,sec-v5.0-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x2000 0x1000>;
++ interrupts = <89 2 0 0>;
++ };
++
++ sec_jr2: jr@3000 {
++ compatible = "fsl,sec-v5.0-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x3000 0x1000>;
++ interrupts = <90 2 0 0>;
++ };
++
++ sec_jr3: jr@4000 {
++ compatible = "fsl,sec-v5.0-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x4000 0x1000>;
++ interrupts = <91 2 0 0>;
++ };
++
++ rtic@6000 {
++ compatible = "fsl,sec-v5.0-rtic",
++ "fsl,sec-v4.0-rtic";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0x6000 0x100>;
++ ranges = <0x0 0x6100 0xe00>;
++
++ rtic_a: rtic-a@0 {
++ compatible = "fsl,sec-v5.0-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x00 0x20 0x100 0x80>;
++ };
++
++ rtic_b: rtic-b@20 {
++ compatible = "fsl,sec-v5.0-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x20 0x20 0x200 0x80>;
++ };
++
++ rtic_c: rtic-c@40 {
++ compatible = "fsl,sec-v5.0-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x40 0x20 0x300 0x80>;
++ };
++
++ rtic_d: rtic-d@60 {
++ compatible = "fsl,sec-v5.0-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x60 0x20 0x500 0x80>;
++ };
++ };
++};
++
++sec_mon: sec_mon@314000 {
++ compatible = "fsl,sec-v5.0-mon", "fsl,sec-v4.0-mon";
++ reg = <0x314000 0x1000>;
++ interrupts = <93 2 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-sec5.2-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-sec5.2-0.dtsi
+new file mode 100644
+index 0000000..7b2ab8a
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-sec5.2-0.dtsi
+@@ -0,0 +1,118 @@
++/*
++ * QorIQ Sec/Crypto 5.2 device tree stub [ controller @ offset 0x300000 ]
++ *
++ * Copyright 2011-2012 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.
++ */
++
++crypto: crypto@300000 {
++ compatible = "fsl,sec-v5.2", "fsl,sec-v5.0", "fsl,sec-v4.0";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0x300000 0x10000>;
++ ranges = <0 0x300000 0x10000>;
++ interrupts = <92 2 0 0>;
++
++ sec_jr0: jr@1000 {
++ compatible = "fsl,sec-v5.2-job-ring",
++ "fsl,sec-v5.0-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x1000 0x1000>;
++ interrupts = <88 2 0 0>;
++ };
++
++ sec_jr1: jr@2000 {
++ compatible = "fsl,sec-v5.2-job-ring",
++ "fsl,sec-v5.0-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x2000 0x1000>;
++ interrupts = <89 2 0 0>;
++ };
++
++ sec_jr2: jr@3000 {
++ compatible = "fsl,sec-v5.2-job-ring",
++ "fsl,sec-v5.0-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x3000 0x1000>;
++ interrupts = <90 2 0 0>;
++ };
++
++ sec_jr3: jr@4000 {
++ compatible = "fsl,sec-v5.2-job-ring",
++ "fsl,sec-v5.0-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x4000 0x1000>;
++ interrupts = <91 2 0 0>;
++ };
++
++ rtic@6000 {
++ compatible = "fsl,sec-v5.2-rtic",
++ "fsl,sec-v5.0-rtic",
++ "fsl,sec-v4.0-rtic";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0x6000 0x100>;
++ ranges = <0x0 0x6100 0xe00>;
++
++ rtic_a: rtic-a@0 {
++ compatible = "fsl,sec-v5.2-rtic-memory",
++ "fsl,sec-v5.0-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x00 0x20 0x100 0x80>;
++ };
++
++ rtic_b: rtic-b@20 {
++ compatible = "fsl,sec-v5.2-rtic-memory",
++ "fsl,sec-v5.0-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x20 0x20 0x200 0x80>;
++ };
++
++ rtic_c: rtic-c@40 {
++ compatible = "fsl,sec-v5.2-rtic-memory",
++ "fsl,sec-v5.0-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x40 0x20 0x300 0x80>;
++ };
++
++ rtic_d: rtic-d@60 {
++ compatible = "fsl,sec-v5.2-rtic-memory",
++ "fsl,sec-v5.0-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x60 0x20 0x500 0x80>;
++ };
++ };
++};
++
++sec_mon: sec_mon@314000 {
++ compatible = "fsl,sec-v5.2-mon", "fsl,sec-v5.0-mon", "fsl,sec-v4.0-mon";
++ reg = <0x314000 0x1000>;
++ interrupts = <93 2 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-sec5.3-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-sec5.3-0.dtsi
+new file mode 100644
+index 0000000..0339825
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-sec5.3-0.dtsi
+@@ -0,0 +1,118 @@
++/*
++ * QorIQ Sec/Crypto 5.3 device tree stub [ controller @ offset 0x300000 ]
++ *
++ * Copyright 2012 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.
++ */
++
++crypto: crypto@300000 {
++ compatible = "fsl,sec-v5.3", "fsl,sec-v5.0", "fsl,sec-v4.0";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0x300000 0x10000>;
++ ranges = <0 0x300000 0x10000>;
++ interrupts = <92 2 0 0>;
++
++ sec_jr0: jr@1000 {
++ compatible = "fsl,sec-v5.3-job-ring",
++ "fsl,sec-v5.0-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x1000 0x1000>;
++ interrupts = <88 2 0 0>;
++ };
++
++ sec_jr1: jr@2000 {
++ compatible = "fsl,sec-v5.3-job-ring",
++ "fsl,sec-v5.0-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x2000 0x1000>;
++ interrupts = <89 2 0 0>;
++ };
++
++ sec_jr2: jr@3000 {
++ compatible = "fsl,sec-v5.3-job-ring",
++ "fsl,sec-v5.0-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x3000 0x1000>;
++ interrupts = <90 2 0 0>;
++ };
++
++ sec_jr3: jr@4000 {
++ compatible = "fsl,sec-v5.3-job-ring",
++ "fsl,sec-v5.0-job-ring",
++ "fsl,sec-v4.0-job-ring";
++ reg = <0x4000 0x1000>;
++ interrupts = <91 2 0 0>;
++ };
++
++ rtic@6000 {
++ compatible = "fsl,sec-v5.3-rtic",
++ "fsl,sec-v5.0-rtic",
++ "fsl,sec-v4.0-rtic";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0x6000 0x100>;
++ ranges = <0x0 0x6100 0xe00>;
++
++ rtic_a: rtic-a@0 {
++ compatible = "fsl,sec-v5.3-rtic-memory",
++ "fsl,sec-v5.0-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x00 0x20 0x100 0x80>;
++ };
++
++ rtic_b: rtic-b@20 {
++ compatible = "fsl,sec-v5.3-rtic-memory",
++ "fsl,sec-v5.0-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x20 0x20 0x200 0x80>;
++ };
++
++ rtic_c: rtic-c@40 {
++ compatible = "fsl,sec-v5.3-rtic-memory",
++ "fsl,sec-v5.0-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x40 0x20 0x300 0x80>;
++ };
++
++ rtic_d: rtic-d@60 {
++ compatible = "fsl,sec-v5.3-rtic-memory",
++ "fsl,sec-v5.0-rtic-memory",
++ "fsl,sec-v4.0-rtic-memory";
++ reg = <0x60 0x20 0x500 0x80>;
++ };
++ };
++};
++
++sec_mon: sec_mon@314000 {
++ compatible = "fsl,sec-v5.3-mon", "fsl,sec-v5.0-mon", "fsl,sec-v4.0-mon";
++ reg = <0x314000 0x1000>;
++ interrupts = <93 2 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-usb2-dr-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-usb2-dr-0.dtsi
+new file mode 100644
+index 0000000..4dd6f84
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-usb2-dr-0.dtsi
+@@ -0,0 +1,41 @@
++/*
++ * QorIQ USB DR device tree stub [ controller @ offset 0x211000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++usb@211000 {
++ compatible = "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr";
++ reg = <0x211000 0x1000>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ interrupts = <45 0x2 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-usb2-mph-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-usb2-mph-0.dtsi
+new file mode 100644
+index 0000000..f053835
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/qoriq-usb2-mph-0.dtsi
+@@ -0,0 +1,41 @@
++/*
++ * QorIQ USB Host device tree stub [ controller @ offset 0x210000 ]
++ *
++ * Copyright 2011 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.
++ */
++
++usb@210000 {
++ compatible = "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph";
++ reg = <0x210000 0x1000>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ interrupts = <44 0x2 0 0>;
++};
+diff --git a/arch/powerpc/boot/dts/fsl/t4240si-post.dtsi b/arch/powerpc/boot/dts/fsl/t4240si-post.dtsi
+new file mode 100644
+index 0000000..b27fb24
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/t4240si-post.dtsi
+@@ -0,0 +1,599 @@
++/*
++ * T4240 Silicon/SoC Device Tree Source (post include)
++ *
++ * Copyright 2012 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.
++ */
++
++&ifc {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ compatible = "fsl,ifc", "simple-bus";
++ interrupts = <25 2 0 0>;
++};
++
++&lportals {
++/include/ "interlaken-lac-portals.dtsi"
++};
++
++&bportals {
++/include/ "qoriq-bman2-portals.dtsi"
++};
++
++&qportals {
++/include/ "qoriq-qman2-portals.dtsi"
++};
++
++/* controller at 0x240000 */
++&pci0 {
++ compatible = "fsl,t4240-pcie", "fsl,qoriq-pcie-v3.0";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0x0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <20 2 0 0>;
++ pcie@0 {
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <20 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0 0 1 &mpic 40 1 0 0
++ 0000 0 0 2 &mpic 1 1 0 0
++ 0000 0 0 3 &mpic 2 1 0 0
++ 0000 0 0 4 &mpic 3 1 0 0
++ >;
++ };
++};
++
++/* controller at 0x250000 */
++&pci1 {
++ compatible = "fsl,t4240-pcie", "fsl,qoriq-pcie-v3.0";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <21 2 0 0>;
++ pcie@0 {
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <21 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0 0 1 &mpic 41 1 0 0
++ 0000 0 0 2 &mpic 5 1 0 0
++ 0000 0 0 3 &mpic 6 1 0 0
++ 0000 0 0 4 &mpic 7 1 0 0
++ >;
++ };
++};
++
++/* controller at 0x260000 */
++&pci2 {
++ compatible = "fsl,t4240-pcie", "fsl,qoriq-pcie-v3.0";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0x0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <22 2 0 0>;
++ pcie@0 {
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <22 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0 0 1 &mpic 42 1 0 0
++ 0000 0 0 2 &mpic 9 1 0 0
++ 0000 0 0 3 &mpic 10 1 0 0
++ 0000 0 0 4 &mpic 11 1 0 0
++ >;
++ };
++};
++
++/* controller at 0x270000 */
++&pci3 {
++ compatible = "fsl,t4240-pcie", "fsl,qoriq-pcie-v3.0";
++ device_type = "pci";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ bus-range = <0x0 0xff>;
++ clock-frequency = <33333333>;
++ interrupts = <23 2 0 0>;
++ pcie@0 {
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ interrupts = <23 2 0 0>;
++ interrupt-map-mask = <0xf800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 0x0 */
++ 0000 0 0 1 &mpic 43 1 0 0
++ 0000 0 0 2 &mpic 0 1 0 0
++ 0000 0 0 3 &mpic 4 1 0 0
++ 0000 0 0 4 &mpic 8 1 0 0
++ >;
++ };
++};
++
++&rio {
++ compatible = "fsl,srio";
++ interrupts = <16 2 1 11>;
++ #address-cells = <2>;
++ #size-cells = <2>;
++ ranges;
++
++ port1 {
++ #address-cells = <2>;
++ #size-cells = <2>;
++ cell-index = <1>;
++ };
++
++ port2 {
++ #address-cells = <2>;
++ #size-cells = <2>;
++ cell-index = <2>;
++ };
++};
++
++&dcsr {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,dcsr", "simple-bus";
++
++ dcsr-epu@0 {
++ compatible = "fsl,t4240-dcsr-epu", "fsl,dcsr-epu";
++ interrupts = <52 2 0 0
++ 84 2 0 0
++ 85 2 0 0
++ 94 2 0 0
++ 95 2 0 0>;
++ reg = <0x0 0x1000>;
++ };
++ dcsr-npc {
++ compatible = "fsl,t4240-dcsr-cnpc", "fsl,dcsr-cnpc";
++ reg = <0x1000 0x1000 0x1002000 0x10000>;
++ };
++ dcsr-nxc@2000 {
++ compatible = "fsl,dcsr-nxc";
++ reg = <0x2000 0x1000>;
++ };
++ dcsr-corenet {
++ compatible = "fsl,dcsr-corenet";
++ reg = <0x8000 0x1000 0x1A000 0x1000>;
++ };
++ dcsr-dpaa@9000 {
++ compatible = "fsl,t4240-dcsr-dpaa", "fsl,dcsr-dpaa";
++ reg = <0x9000 0x1000>;
++ };
++ dcsr-ocn@11000 {
++ compatible = "fsl,t4240-dcsr-ocn", "fsl,dcsr-ocn";
++ reg = <0x11000 0x1000>;
++ };
++ dcsr-ddr@12000 {
++ compatible = "fsl,dcsr-ddr";
++ dev-handle = <&ddr1>;
++ reg = <0x12000 0x1000>;
++ };
++ dcsr-ddr@13000 {
++ compatible = "fsl,dcsr-ddr";
++ dev-handle = <&ddr2>;
++ reg = <0x13000 0x1000>;
++ };
++ dcsr-ddr@14000 {
++ compatible = "fsl,dcsr-ddr";
++ dev-handle = <&ddr3>;
++ reg = <0x14000 0x1000>;
++ };
++ dcsr-nal@18000 {
++ compatible = "fsl,t4240-dcsr-nal", "fsl,dcsr-nal";
++ reg = <0x18000 0x1000>;
++ };
++ dcsr-rcpm@22000 {
++ compatible = "fsl,t4240-dcsr-rcpm", "fsl,dcsr-rcpm";
++ reg = <0x22000 0x1000>;
++ };
++ dcsr-snpc@30000 {
++ compatible = "fsl,t4240-dcsr-snpc", "fsl,dcsr-snpc";
++ reg = <0x30000 0x1000 0x1022000 0x10000>;
++ };
++ dcsr-snpc@31000 {
++ compatible = "fsl,t4240-dcsr-snpc", "fsl,dcsr-snpc";
++ reg = <0x31000 0x1000 0x1042000 0x10000>;
++ };
++ dcsr-snpc@32000 {
++ compatible = "fsl,t4240-dcsr-snpc", "fsl,dcsr-snpc";
++ reg = <0x32000 0x1000 0x1062000 0x10000>;
++ };
++ dcsr-cpu-sb-proxy@100000 {
++ compatible = "fsl,dcsr-e6500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu0>;
++ reg = <0x100000 0x1000 0x101000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@108000 {
++ compatible = "fsl,dcsr-e6500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu1>;
++ reg = <0x108000 0x1000 0x109000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@110000 {
++ compatible = "fsl,dcsr-e6500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu2>;
++ reg = <0x110000 0x1000 0x111000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@118000 {
++ compatible = "fsl,dcsr-e6500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu3>;
++ reg = <0x118000 0x1000 0x119000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@120000 {
++ compatible = "fsl,dcsr-e6500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu4>;
++ reg = <0x120000 0x1000 0x121000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@128000 {
++ compatible = "fsl,dcsr-e6500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu5>;
++ reg = <0x128000 0x1000 0x129000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@130000 {
++ compatible = "fsl,dcsr-e6500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu6>;
++ reg = <0x130000 0x1000 0x131000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@138000 {
++ compatible = "fsl,dcsr-e6500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu7>;
++ reg = <0x138000 0x1000 0x139000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@140000 {
++ compatible = "fsl,dcsr-e6500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu8>;
++ reg = <0x140000 0x1000 0x141000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@148000 {
++ compatible = "fsl,dcsr-e6500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu9>;
++ reg = <0x148000 0x1000 0x149000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@150000 {
++ compatible = "fsl,dcsr-e6500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu10>;
++ reg = <0x150000 0x1000 0x151000 0x1000>;
++ };
++ dcsr-cpu-sb-proxy@158000 {
++ compatible = "fsl,dcsr-e6500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
++ cpu-handle = <&cpu11>;
++ reg = <0x158000 0x1000 0x159000 0x1000>;
++ };
++};
++
++&soc {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ compatible = "simple-bus";
++
++ soc-sram-error {
++ compatible = "fsl,soc-sram-error";
++ interrupts = <16 2 1 29>;
++ };
++
++ corenet-law@0 {
++ compatible = "fsl,corenet-law";
++ reg = <0x0 0x1000>;
++ fsl,num-laws = <32>;
++ };
++
++ ddr1: memory-controller@8000 {
++ compatible = "fsl,qoriq-memory-controller-v4.7",
++ "fsl,qoriq-memory-controller";
++ reg = <0x8000 0x1000>;
++ interrupts = <16 2 1 23>;
++ };
++
++ ddr2: memory-controller@9000 {
++ compatible = "fsl,qoriq-memory-controller-v4.7",
++ "fsl,qoriq-memory-controller";
++ reg = <0x9000 0x1000>;
++ interrupts = <16 2 1 22>;
++ };
++
++ ddr3: memory-controller@a000 {
++ compatible = "fsl,qoriq-memory-controller-v4.7",
++ "fsl,qoriq-memory-controller";
++ reg = <0xa000 0x1000>;
++ interrupts = <16 2 1 21>;
++ };
++
++ cpc: l3-cache-controller@10000 {
++ compatible = "fsl,p5020-l3-cache-controller", "fsl,p4080-l3-cache-controller", "cache";
++ reg = <0x10000 0x1000
++ 0x11000 0x1000>;
++ interrupts = <16 2 1 27
++ 16 2 1 26>;
++ };
++
++ corenet-cf@18000 {
++ compatible = "fsl,corenet-cf";
++ reg = <0x18000 0x1000>;
++ interrupts = <16 2 1 31>;
++ fsl,ccf-num-csdids = <32>;
++ fsl,ccf-num-snoopids = <32>;
++ };
++
++ iommu@20000 {
++ compatible = "fsl,pamu-v1.0", "fsl,pamu";
++ reg = <0x20000 0x6000>;
++ interrupts = <
++ 24 2 0 0
++ 16 2 1 30>;
++ };
++
++/include/ "qoriq-mpic.dtsi"
++
++ guts: global-utilities@e0000 {
++ compatible = "fsl,t4240-device-config";
++ reg = <0xe0000 0xe00>;
++ fsl,has-rstcr;
++ fsl,liodn-bits = <12>;
++ };
++
++ clockgen: global-utilities@e1000 {
++ compatible = "fsl,t4240-clockgen", "fsl,qoriq-clockgen-2";
++ reg = <0xe1000 0x1000>;
++ };
++
++/include/ "interlaken-lac.dtsi"
++
++ rcpm: global-utilities@e2000 {
++ compatible = "fsl,t4240-rcpm", "fsl,qoriq-rcpm-2";
++ reg = <0xe2000 0x1000>;
++ };
++
++/include/ "qoriq-dma-0.dtsi"
++/include/ "qoriq-dma-1.dtsi"
++
++/include/ "qoriq-espi-0.dtsi"
++ spi@110000 {
++ fsl,espi-num-chipselects = <4>;
++ };
++
++/include/ "qoriq-esdhc-0.dtsi"
++ sdhc@114000 {
++ compatible = "fsl,t4240-esdhc", "fsl,esdhc";
++ sdhci,auto-cmd12;
++ };
++/include/ "qoriq-i2c-0.dtsi"
++/include/ "qoriq-i2c-1.dtsi"
++/include/ "qoriq-duart-0.dtsi"
++/include/ "qoriq-duart-1.dtsi"
++/include/ "qoriq-sec5.0-0.dtsi"
++
++
++ /*
++ * Temporarily define cluster 1/2/3's L2 cache nodes in order to pass
++ * next-level-cache info to uboot to do L3 cache fixup. This can be
++ * removed once u-boot can create cpu node with cache info.
++ */
++ L2_1: l2-cache-controller@c20000 {
++ compatible = "fsl,t4240-l2-cache-controller";
++ reg = <0xc20000 0x40000>;
++ next-level-cache = <&cpc>;
++ };
++ L2_2: l2-cache-controller@c60000 {
++ compatible = "fsl,t4240-l2-cache-controller";
++ reg = <0xc60000 0x40000>;
++ next-level-cache = <&cpc>;
++ };
++ L2_3: l2-cache-controller@ca0000 {
++ compatible = "fsl,t4240-l2-cache-controller";
++ reg = <0xca0000 0x40000>;
++ next-level-cache = <&cpc>;
++ };
++
++/include/ "qoriq-qman1.dtsi"
++/include/ "qoriq-bman1.dtsi"
++
++/include/ "qoriq-rman-0.dtsi"
++ rman: rman@1e0000 {
++ fsl,qman-channels-id = <0x880 0x881>;
++ };
++
++/include/ "qoriq-usb2-mph-0.dtsi"
++ usb0: usb@210000 {
++ compatible = "fsl-usb2-mph-v2.4", "fsl-usb2-mph";
++ phy_type = "utmi";
++ port0;
++ };
++/include/ "qoriq-usb2-dr-0.dtsi"
++ usb1: usb@211000 {
++ compatible = "fsl-usb2-dr-v2.4", "fsl-usb2-dr";
++ dr_mode = "host";
++ phy_type = "utmi";
++ };
++/include/ "qoriq-sata2-0.dtsi"
++ sata0: sata@220000 {
++ compatible = "fsl,t4240-rev1.0-sata", "fsl,pq-sata-v2";
++ };
++/include/ "qoriq-sata2-1.dtsi"
++ sata1: sata@221000 {
++ compatible = "fsl,t4240-rev1.0-sata", "fsl,pq-sata-v2";
++ };
++/include/ "qoriq-dce-0.dtsi"
++/include/ "qoriq-pme-0.dtsi"
++
++/include/ "qoriq-fman3-0.dtsi"
++/include/ "qoriq-fman3-0-1g-0.dtsi"
++/include/ "qoriq-fman3-0-1g-1.dtsi"
++/include/ "qoriq-fman3-0-1g-2.dtsi"
++/include/ "qoriq-fman3-0-1g-3.dtsi"
++/include/ "qoriq-fman3-0-1g-4.dtsi"
++/include/ "qoriq-fman3-0-1g-5.dtsi"
++/include/ "qoriq-fman3-0-10g-0.dtsi"
++/include/ "qoriq-fman3-0-10g-1.dtsi"
++ fman0: fman@400000 {
++ /* tx - 1g - 0 */
++ port@a8000 {
++ fsl,qman-channel-id = <0x802>;
++ };
++ /* tx - 1g - 1 */
++ 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 - 1 */
++ port@82000 {
++ fsl,qman-channel-id = <0x809>;
++ };
++ /* 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>;
++ };
++ };
++
++/include/ "qoriq-fman3-1.dtsi"
++/include/ "qoriq-fman3-1-1g-0.dtsi"
++/include/ "qoriq-fman3-1-1g-1.dtsi"
++/include/ "qoriq-fman3-1-1g-2.dtsi"
++/include/ "qoriq-fman3-1-1g-3.dtsi"
++/include/ "qoriq-fman3-1-1g-4.dtsi"
++/include/ "qoriq-fman3-1-1g-5.dtsi"
++/include/ "qoriq-fman3-1-10g-0.dtsi"
++/include/ "qoriq-fman3-1-10g-1.dtsi"
++ fman1: fman@500000 {
++ /* tx - 1g - 0 */
++ port@a8000 {
++ fsl,qman-channel-id = <0x822>;
++ };
++ /* tx - 1g - 1 */
++ port@a9000 {
++ fsl,qman-channel-id = <0x823>;
++ };
++ /* tx - 1g - 2 */
++ port@aa000 {
++ fsl,qman-channel-id = <0x824>;
++ };
++ /* tx - 1g - 3 */
++ port@ab000 {
++ fsl,qman-channel-id = <0x825>;
++ };
++ /* tx - 1g - 4 */
++ port@ac000 {
++ fsl,qman-channel-id = <0x826>;
++ };
++ /* tx - 1g - 5 */
++ port@ad000 {
++ fsl,qman-channel-id = <0x827>;
++ };
++ /* tx - 10g - 0 */
++ port@b0000 {
++ fsl,qman-channel-id = <0x820>;
++ };
++ /* tx - 10g - 1 */
++ port@b1000 {
++ fsl,qman-channel-id = <0x821>;
++ };
++ /* offline - 1 */
++ port@82000 {
++ fsl,qman-channel-id = <0x829>;
++ };
++ /* offline - 2 */
++ port@83000 {
++ fsl,qman-channel-id = <0x82a>;
++ };
++ /* offline - 3 */
++ port@84000 {
++ fsl,qman-channel-id = <0x82b>;
++ };
++ /* offline - 4 */
++ port@85000 {
++ fsl,qman-channel-id = <0x82c>;
++ };
++ /* offline - 5 */
++ port@86000 {
++ fsl,qman-channel-id = <0x82d>;
++ };
++ /* offline - 6 */
++ port@87000 {
++ fsl,qman-channel-id = <0x82e>;
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/fsl/t4240si-pre.dtsi b/arch/powerpc/boot/dts/fsl/t4240si-pre.dtsi
+new file mode 100644
+index 0000000..0997ef1
+--- /dev/null
++++ b/arch/powerpc/boot/dts/fsl/t4240si-pre.dtsi
+@@ -0,0 +1,156 @@
++/*
++ * T4240 Silicon/SoC Device Tree Source (pre include)
++ *
++ * Copyright 2012 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.
++ */
++
++/dts-v1/;
++/ {
++ compatible = "fsl,T4240";
++ #address-cells = <2>;
++ #size-cells = <2>;
++ interrupt-parent = <&mpic>;
++
++ aliases {
++ ccsr = &soc;
++ dcsr = &dcsr;
++
++ serial0 = &serial0;
++ serial1 = &serial1;
++ serial2 = &serial2;
++ serial3 = &serial3;
++ lac = &lac;
++ bman = &bman;
++ qman = &qman;
++ pme = &pme;
++ dce = &dce;
++ crypto = &crypto;
++ fman0 = &fman0;
++ fman1 = &fman1;
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ ethernet2 = &enet2;
++ ethernet3 = &enet3;
++ ethernet4 = &enet4;
++ ethernet5 = &enet5;
++ ethernet6 = &enet6;
++ ethernet7 = &enet7;
++ ethernet8 = &enet8;
++ ethernet9 = &enet9;
++ ethernet10 = &enet10;
++ ethernet11 = &enet11;
++ ethernet12 = &enet12;
++ ethernet13 = &enet13;
++ ethernet14 = &enet14;
++ ethernet15 = &enet15;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ pci2 = &pci2;
++ pci3 = &pci3;
++ rman = &rman;
++ dma0 = &dma0;
++ dma1 = &dma1;
++ sdhc = &sdhc;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ /*
++ * Temporarily add next-level-cache info in each cpu node so
++ * that uboot can do L2 cache fixup. This can be removed once
++ * u-boot can create cpu node with cache info.
++ */
++ cpu0: PowerPC,e6500@0 {
++ device_type = "cpu";
++ reg = <0 1>;
++ next-level-cache = <&L2_1>;
++ };
++ cpu1: PowerPC,e6500@1 {
++ device_type = "cpu";
++ reg = <2 3>;
++ next-level-cache = <&L2_1>;
++ };
++ cpu2: PowerPC,e6500@2 {
++ device_type = "cpu";
++ reg = <4 5>;
++ next-level-cache = <&L2_1>;
++ };
++ cpu3: PowerPC,e6500@3 {
++ device_type = "cpu";
++ reg = <6 7>;
++ next-level-cache = <&L2_1>;
++ };
++
++ cpu4: PowerPC,e6500@4 {
++ device_type = "cpu";
++ reg = <8 9>;
++ next-level-cache = <&L2_2>;
++ };
++ cpu5: PowerPC,e6500@5 {
++ device_type = "cpu";
++ reg = <10 11>;
++ next-level-cache = <&L2_2>;
++ };
++ cpu6: PowerPC,e6500@6 {
++ device_type = "cpu";
++ reg = <12 13>;
++ next-level-cache = <&L2_2>;
++ };
++ cpu7: PowerPC,e6500@7 {
++ device_type = "cpu";
++ reg = <14 15>;
++ next-level-cache = <&L2_2>;
++ };
++
++ cpu8: PowerPC,e6500@8 {
++ device_type = "cpu";
++ reg = <16 17>;
++ next-level-cache = <&L2_3>;
++ };
++ cpu9: PowerPC,e6500@9 {
++ device_type = "cpu";
++ reg = <18 19>;
++ next-level-cache = <&L2_3>;
++ };
++ cpu10: PowerPC,e6500@10 {
++ device_type = "cpu";
++ reg = <20 21>;
++ next-level-cache = <&L2_3>;
++ };
++ cpu11: PowerPC,e6500@11 {
++ device_type = "cpu";
++ reg = <22 23>;
++ next-level-cache = <&L2_3>;
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/p2041rdb-usdpaa.dts b/arch/powerpc/boot/dts/p2041rdb-usdpaa.dts
+new file mode 100644
+index 0000000..2557614
+--- /dev/null
++++ b/arch/powerpc/boot/dts/p2041rdb-usdpaa.dts
+@@ -0,0 +1,110 @@
++/*
++ * P2041RDB Device Tree Source
++ *
++ * Copyright 2011-2012 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.
++ */
++
++/include/ "p2041rdb.dts"
++
++/ {
++ /* NB: "bpool-ethernet-seeds" is not set to avoid buffer seeding,
++ * because apps seed these pools with buffers allocated at
++ * run-time.
++ * HOWEVER, the kernel driver requires the buffer-size so
++ * "fsl,bpool-ethernet-cfg" is set. It also mis-interprets
++ * things if the base-address is zero (hence the 0xdeadbeef
++ * values).
++ */
++ bp7: buffer-pool@7 {
++ compatible = "fsl,p2041-bpool", "fsl,bpool";
++ fsl,bpid = <7>;
++ fsl,bpool-ethernet-cfg = <0 0 0 192 0 0xdeadbeef>;
++ fsl,bpool-thresholds = <0x400 0xc00 0x0 0x0>;
++ };
++ bp8: buffer-pool@8 {
++ compatible = "fsl,p2041-bpool", "fsl,bpool";
++ fsl,bpid = <8>;
++ fsl,bpool-ethernet-cfg = <0 0 0 576 0 0xabbaf00d>;
++ fsl,bpool-thresholds = <0x100 0x300 0x0 0x0>;
++ };
++ bp9: buffer-pool@9 {
++ compatible = "fsl,p2041-bpool", "fsl,bpool";
++ fsl,bpid = <9>;
++ fsl,bpool-ethernet-cfg = <0 0 0 1728 0 0xfeedabba>;
++ fsl,bpool-thresholds = <0x100 0x300 0x0 0x0>;
++ };
++
++ fsl,dpaa {
++ ethernet@0 {
++ compatible = "fsl,p2041-dpa-ethernet-init", "fsl,dpa-ethernet-init";
++ fsl,bman-buffer-pools = <&bp7 &bp8 &bp9>;
++ fsl,qman-frame-queues-rx = <0x50 1 0x51 1>;
++ fsl,qman-frame-queues-tx = <0x70 1 0x71 1>;
++ };
++ ethernet@1 {
++ compatible = "fsl,p2041-dpa-ethernet-init", "fsl,dpa-ethernet-init";
++ fsl,bman-buffer-pools = <&bp7 &bp8 &bp9>;
++ fsl,qman-frame-queues-rx = <0x52 1 0x53 1>;
++ fsl,qman-frame-queues-tx = <0x72 1 0x73 1>;
++ };
++ ethernet@2 {
++ compatible = "fsl,p2041-dpa-ethernet-init", "fsl,dpa-ethernet-init";
++ fsl,bman-buffer-pools = <&bp7 &bp8 &bp9>;
++ fsl,qman-frame-queues-rx = <0x54 1 0x55 1>;
++ fsl,qman-frame-queues-tx = <0x74 1 0x75 1>;
++ };
++ ethernet@3 {
++ compatible = "fsl,p2041-dpa-ethernet-init", "fsl,dpa-ethernet-init";
++ fsl,bman-buffer-pools = <&bp7 &bp8 &bp9>;
++ fsl,qman-frame-queues-rx = <0x56 1 0x57 1>;
++ fsl,qman-frame-queues-tx = <0x76 1 0x77 1>;
++ };
++ ethernet@4 {
++ compatible = "fsl,p2041-dpa-ethernet-init", "fsl,dpa-ethernet-init";
++ fsl,bman-buffer-pools = <&bp7 &bp8 &bp9>;
++ fsl,qman-frame-queues-rx = <0x58 1 0x59 1>;
++ fsl,qman-frame-queues-tx = <0x78 1 0x79 1>;
++ };
++ ethernet@5 {
++ compatible = "fsl,p2041-dpa-ethernet-init", "fsl,dpa-ethernet-init";
++ fsl,bman-buffer-pools = <&bp7 &bp8 &bp9>;
++ fsl,qman-frame-queues-rx = <0x5a 1 0x5b 1>;
++ fsl,qman-frame-queues-tx = <0x7a 1 0x7b 1>;
++ };
++ dpa-fman0-oh@1 {
++ compatible = "fsl,dpa-oh";
++ /* Define frame queues for the OH port*/
++ /* */
++ fsl,qman-frame-queues-oh = <0x68 1 0x69 1>;
++ fsl,fman-oh-port = <&fman0_oh1>;
++ };
++ };
++};
+diff --git a/arch/powerpc/boot/dts/p2041rdb.dts b/arch/powerpc/boot/dts/p2041rdb.dts
+index 79b6895..c712717 100644
+--- a/arch/powerpc/boot/dts/p2041rdb.dts
++++ b/arch/powerpc/boot/dts/p2041rdb.dts
+@@ -1,7 +1,7 @@
+ /*
+ * P2041RDB Device Tree Source
+ *
+- * Copyright 2011 Freescale Semiconductor Inc.
++ * Copyright 2011-2012 Freescale Semiconductor Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+@@ -32,7 +32,7 @@
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+-/include/ "p2041si.dtsi"
++/include/ "fsl/p2041si-pre.dtsi"
+
+ / {
+ model = "fsl,P2041RDB";
+@@ -41,6 +41,25 @@
+ #size-cells = <2>;
+ interrupt-parent = <&mpic>;
+
++ aliases {
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ ethernet2 = &enet2;
++ ethernet3 = &enet3;
++ ethernet4 = &enet4;
++ ethernet5 = &enet5;
++ phy_rgmii_0 = &phy_rgmii_0;
++ phy_rgmii_1 = &phy_rgmii_1;
++ phy_sgmii_2 = &phy_sgmii_2;
++ phy_sgmii_3 = &phy_sgmii_3;
++ phy_sgmii_4 = &phy_sgmii_4;
++ phy_sgmii_1c = &phy_sgmii_1c;
++ phy_sgmii_1d = &phy_sgmii_1d;
++ phy_sgmii_1e = &phy_sgmii_1e;
++ phy_sgmii_1f = &phy_sgmii_1f;
++ phy_xgmii_2 = &phy_xgmii_2;
++ };
++
+ memory {
+ device_type = "memory";
+ };
+@@ -49,7 +68,17 @@
+ ranges = <0x00000000 0xf 0x00000000 0x01008000>;
+ };
+
++ bportals: bman-portals@ff4000000 {
++ ranges = <0x0 0xf 0xf4000000 0x200000>;
++ };
++
++ qportals: qman-portals@ff4200000 {
++ ranges = <0x0 0xf 0xf4200000 0x200000>;
++ };
++
+ soc: soc@ffe000000 {
++ ranges = <0x00000000 0xf 0xfe000000 0x1000000>;
++ reg = <0xf 0xfe000000 0 0x00001000>;
+ spi@110000 {
+ flash@0 {
+ #address-cells = <1>;
+@@ -92,6 +121,10 @@
+ compatible = "pericom,pt7c4338";
+ reg = <0x68>;
+ };
++ adt7461@4c {
++ compatible = "adi,adt7461";
++ reg = <0x4c>;
++ };
+ };
+
+ i2c@118100 {
+@@ -104,11 +137,134 @@
+ usb1: usb@211000 {
+ dr_mode = "host";
+ };
++
++ fman0: fman@400000 {
++ enet0: ethernet@e0000 {
++ tbi-handle = <&tbi0>;
++ phy-handle = <&phy_sgmii_2>;
++ phy-connection-type = "sgmii";
++ };
++
++ mdio0: mdio@e1120 {
++ tbi0: tbi-phy@8 {
++ reg = <0x8>;
++ device_type = "tbi-phy";
++ };
++
++ phy_rgmii_0: ethernet-phy@0 {
++ reg = <0x0>;
++ };
++ phy_rgmii_1: ethernet-phy@1 {
++ reg = <0x1>;
++ };
++ phy_sgmii_2: ethernet-phy@2 {
++ reg = <0x2>;
++ };
++ phy_sgmii_3: ethernet-phy@3 {
++ reg = <0x3>;
++ };
++ phy_sgmii_4: ethernet-phy@4 {
++ reg = <0x4>;
++ };
++ phy_sgmii_1c: ethernet-phy@1c {
++ reg = <0x1c>;
++ };
++ phy_sgmii_1d: ethernet-phy@1d {
++ reg = <0x1d>;
++ };
++ phy_sgmii_1e: ethernet-phy@1e {
++ reg = <0x1e>;
++ };
++ phy_sgmii_1f: ethernet-phy@1f {
++ reg = <0x1f>;
++ };
++ };
++
++ enet1: ethernet@e2000 {
++ tbi-handle = <&tbi1>;
++ phy-handle = <&phy_sgmii_3>;
++ phy-connection-type = "sgmii";
++ };
++
++ mdio@e3120 {
++ tbi1: tbi-phy@8 {
++ reg = <8>;
++ device_type = "tbi-phy";
++ };
++ };
++
++ enet2: ethernet@e4000 {
++ tbi-handle = <&tbi2>;
++ phy-handle = <&phy_sgmii_4>;
++ phy-connection-type = "sgmii";
++ };
++
++ mdio@e5120 {
++ tbi2: tbi-phy@8 {
++ reg = <8>;
++ device_type = "tbi-phy";
++ };
++ };
++
++ enet3: ethernet@e6000 {
++ tbi-handle = <&tbi3>;
++ phy-handle = <&phy_rgmii_1>;
++ phy-connection-type = "rgmii";
++ };
++
++ mdio@e7120 {
++ tbi3: tbi-phy@8 {
++ reg = <8>;
++ device_type = "tbi-phy";
++ };
++ };
++
++ enet4: ethernet@e8000 {
++ tbi-handle = <&tbi4>;
++ phy-handle = <&phy_rgmii_0>;
++ phy-connection-type = "rgmii";
++ };
++
++ mdio@e9120 {
++ tbi4: tbi-phy@8 {
++ reg = <8>;
++ device_type = "tbi-phy";
++ };
++ };
++
++ enet5: ethernet@f0000 {
++ /*
++ * phy-handle will be updated by U-Boot to
++ * reflect the actual slot the XAUI card is in.
++ */
++ phy-handle = <&phy_xgmii_2>;
++ phy-connection-type = "xgmii";
++ };
++
++ mdio@f1000 {
++ /* XAUI card in slot 2 */
++ phy_xgmii_2: ethernet-phy@0 {
++ reg = <0x0>;
++ };
++ };
++ };
++ };
++
++ rio: rapidio@ffe0c0000 {
++ reg = <0xf 0xfe0c0000 0 0x11000>;
++
++ port1 {
++ ranges = <0 0 0xc 0x20000000 0 0x10000000>;
++ };
++ port2 {
++ ranges = <0 0 0xc 0x30000000 0 0x10000000>;
++ };
+ };
+
+- localbus@ffe124000 {
++ lbc: localbus@ffe124000 {
+ reg = <0xf 0xfe124000 0 0x1000>;
+- ranges = <0 0 0xf 0xe8000000 0x08000000>;
++ ranges = <0 0 0xf 0xe8000000 0x08000000
++ 1 0 0xf 0xffa00000 0x00040000>;
+
+ flash@0,0 {
+ compatible = "cfi-flash";
+@@ -116,6 +272,44 @@
+ bank-width = <2>;
+ device-width = <2>;
+ };
++
++ nand@1,0 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,elbc-fcm-nand";
++ reg = <0x1 0x0 0x40000>;
++
++ partition@0 {
++ label = "NAND U-Boot Image";
++ reg = <0x0 0x02000000>;
++ read-only;
++ };
++
++ partition@2000000 {
++ label = "NAND Root File System";
++ reg = <0x02000000 0x10000000>;
++ };
++
++ partition@12000000 {
++ label = "NAND Compressed RFS Image";
++ reg = <0x12000000 0x08000000>;
++ };
++
++ partition@1a000000 {
++ label = "NAND Linux Kernel Image";
++ reg = <0x1a000000 0x04000000>;
++ };
++
++ partition@1e000000 {
++ label = "NAND DTB Image";
++ reg = <0x1e000000 0x01000000>;
++ };
++
++ partition@1f000000 {
++ label = "NAND Writable User area";
++ reg = <0x1f000000 0x01000000>;
++ };
++ };
+ };
+
+ pci0: pcie@ffe200000 {
+@@ -162,4 +356,37 @@
+ 0 0x00010000>;
+ };
+ };
++
++ fsl,dpaa {
++ compatible = "fsl,p2041-dpaa", "fsl,dpaa";
++
++ ethernet@0 {
++ compatible = "fsl,p2041-dpa-ethernet", "fsl,dpa-ethernet";
++ fsl,fman-mac = <&enet0>;
++ };
++ ethernet@1 {
++ compatible = "fsl,p2041-dpa-ethernet", "fsl,dpa-ethernet";
++ fsl,fman-mac = <&enet1>;
++ };
++ ethernet@2 {
++ compatible = "fsl,p2041-dpa-ethernet", "fsl,dpa-ethernet";
++ fsl,fman-mac = <&enet2>;
++ };
++ ethernet@3 {
++ compatible = "fsl,p2041-dpa-ethernet", "fsl,dpa-ethernet";
++ fsl,fman-mac = <&enet3>;
++ };
++ ethernet@4 {
++ compatible = "fsl,p2041-dpa-ethernet", "fsl,dpa-ethernet";
++ fsl,fman-mac = <&enet4>;
++ };
++ ethernet@5 {
++ compatible = "fsl,p2041-dpa-ethernet", "fsl,dpa-ethernet";
++ fsl,fman-mac = <&enet5>;
++ };
++ };
+ };
++
++/include/ "fsl/p2041si-post.dtsi"
++
++/include/ "fsl/qoriq-dpaa-res1.dtsi"
+diff --git a/arch/powerpc/configs/corenet32_smp_defconfig b/arch/powerpc/configs/corenet32_smp_defconfig
+index f087de6..fc5ece3 100644
+--- a/arch/powerpc/configs/corenet32_smp_defconfig
++++ b/arch/powerpc/configs/corenet32_smp_defconfig
+@@ -26,17 +26,21 @@ CONFIG_P3041_DS=y
+ CONFIG_P3060_QDS=y
+ CONFIG_P4080_DS=y
+ CONFIG_P5020_DS=y
++CONFIG_P5040_DS=y
+ CONFIG_HIGHMEM=y
+ CONFIG_NO_HZ=y
+ CONFIG_HIGH_RES_TIMERS=y
+ # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+ CONFIG_BINFMT_MISC=m
+ CONFIG_KEXEC=y
++CONFIG_IRQ_ALL_CPUS=y
+ CONFIG_FORCE_MAX_ZONEORDER=13
+ CONFIG_FSL_LBC=y
++CONFIG_FSL_PAMU=y
+ CONFIG_PCI=y
+ CONFIG_PCIEPORTBUS=y
+ # CONFIG_PCIEASPM is not set
++CONFIG_PCI_MSI=y
+ CONFIG_NET=y
+ CONFIG_PACKET=y
+ CONFIG_UNIX=y
+@@ -67,6 +71,7 @@ CONFIG_INET_IPCOMP=y
+ CONFIG_IPV6=y
+ CONFIG_IP_SCTP=m
+ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
++CONFIG_DEVTMPFS=y
+ CONFIG_MTD=y
+ CONFIG_MTD_CMDLINE_PARTS=y
+ CONFIG_MTD_CHAR=y
+@@ -78,7 +83,7 @@ CONFIG_MTD_M25P80=y
+ CONFIG_PROC_DEVICETREE=y
+ CONFIG_BLK_DEV_LOOP=y
+ CONFIG_BLK_DEV_RAM=y
+-CONFIG_BLK_DEV_RAM_SIZE=131072
++CONFIG_BLK_DEV_RAM_SIZE=262144
+ CONFIG_MISC_DEVICES=y
+ CONFIG_BLK_DEV_SD=y
+ CONFIG_CHR_DEV_ST=y
+@@ -93,13 +98,18 @@ CONFIG_SATA_FSL=y
+ CONFIG_SATA_SIL24=y
+ CONFIG_SATA_SIL=y
+ CONFIG_PATA_SIL680=y
++CONFIG_MD=y
++CONFIG_BLK_DEV_MD=y
++# CONFIG_MD_AUTODETECT is not set
++CONFIG_MD_RAID456=y
++CONFIG_MULTICORE_RAID456=y
+ CONFIG_NETDEVICES=y
+-CONFIG_VITESSE_PHY=y
+ CONFIG_FIXED_PHY=y
+ CONFIG_NET_ETHERNET=y
+ CONFIG_E1000=y
+ CONFIG_E1000E=y
+ CONFIG_FSL_PQ_MDIO=y
++CONFIG_DPA=y
+ # CONFIG_INPUT_MOUSEDEV is not set
+ # CONFIG_INPUT_KEYBOARD is not set
+ # CONFIG_INPUT_MOUSE is not set
+@@ -133,16 +143,25 @@ CONFIG_USB_OHCI_HCD_PPC_OF_LE=y
+ CONFIG_USB_STORAGE=y
+ CONFIG_MMC=y
+ CONFIG_MMC_SDHCI=y
++CONFIG_MMC_SDHCI_OF=y
++CONFIG_MMC_SDHCI_OF_ESDHC=y
+ CONFIG_EDAC=y
+ CONFIG_EDAC_MM_EDAC=y
+ CONFIG_EDAC_MPC85XX=y
+ CONFIG_RTC_CLASS=y
++CONFIG_RTC_DRV_DS1307=y
+ CONFIG_RTC_DRV_DS3232=y
+ CONFIG_RTC_DRV_CMOS=y
++CONFIG_DMADEVICES=y
++CONFIG_FSL_RAID=y
++CONFIG_ASYNC_TX_DMA=y
+ CONFIG_UIO=y
++CONFIG_UIO_FSL_SRIO=y
++CONFIG_UIO_FSL_DMA=y
+ CONFIG_STAGING=y
+ CONFIG_VIRT_DRIVERS=y
+ CONFIG_FSL_HV_MANAGER=y
++CONFIG_FMAN_RESOURCE_ALLOCATION_ALGORITHM=y
+ CONFIG_EXT2_FS=y
+ CONFIG_EXT3_FS=y
+ # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+@@ -167,6 +186,7 @@ CONFIG_MAC_PARTITION=y
+ CONFIG_NLS_ISO8859_1=y
+ CONFIG_NLS_UTF8=m
+ CONFIG_MAGIC_SYSRQ=y
++CONFIG_DEBUG_KERNEL=y
+ CONFIG_DEBUG_SHIRQ=y
+ CONFIG_DETECT_HUNG_TASK=y
+ CONFIG_DEBUG_INFO=y
+diff --git a/arch/powerpc/include/asm/fsl_guts.h b/arch/powerpc/include/asm/fsl_guts.h
+index bebd124..a9a85ef 100644
+--- a/arch/powerpc/include/asm/fsl_guts.h
++++ b/arch/powerpc/include/asm/fsl_guts.h
+@@ -85,7 +85,9 @@ struct ccsr_guts_86xx {
+ u8 res0c4[0x224 - 0xc4];
+ __be32 iodelay1; /* 0x.0224 - IO delay control register 1 */
+ __be32 iodelay2; /* 0x.0228 - IO delay control register 2 */
+- u8 res22c[0x800 - 0x22c];
++ u8 res22c[0x604 - 0x22c];
++ __be32 pamubypenr; /* 0x.0604 - PAMU bypass enable register */
++ u8 res608[0x800 - 0x608];
+ __be32 clkdvdr; /* 0x.0800 - Clock Divide Register */
+ u8 res804[0x900 - 0x804];
+ __be32 ircr; /* 0x.0900 - Infrared Control Register */
+diff --git a/arch/powerpc/include/asm/fsl_hcalls.h b/arch/powerpc/include/asm/fsl_hcalls.h
+index 922d9b5..7e0b5b7 100644
+--- a/arch/powerpc/include/asm/fsl_hcalls.h
++++ b/arch/powerpc/include/asm/fsl_hcalls.h
+@@ -45,7 +45,7 @@
+ #include
+ #include
+
+-#define FH_API_VERSION 1
++#define FH_API_VERSION 3
+
+ #define FH_ERR_GET_INFO 1
+ #define FH_PARTITION_GET_DTPROP 2
+@@ -65,6 +65,8 @@
+ #define FH_EXIT_NAP 16
+ #define FH_CLAIM_DEVICE 17
+ #define FH_PARTITION_STOP_DMA 18
++#define FH_DMA_ATTR_SET 19
++#define FH_DMA_ATTR_GET 20
+
+ /* vendor ID: Freescale Semiconductor */
+ #define FH_HCALL_TOKEN(num) _EV_HCALL_TOKEN(EV_FSL_VENDOR_ID, num)
+@@ -652,4 +654,80 @@ static inline unsigned int fh_partition_stop_dma(unsigned int handle)
+
+ return r3;
+ }
++
++#define FSL_PAMU_ATTR_STASH 2
++
++struct fh_dma_attr_stash {
++ uint32_t vcpu; /* vcpu number */
++ uint32_t cache; /* cache to stash to: 1=L1, 2=L2, 3=L3 */
++};
++
++/**
++ * fh_dma_attr_set - configure a DMA window
++ * @handle: value from fsl,hv-device-handle property
++ * @attr_name: the FSL_PAMU_ATTR_xxx attribute to change
++ * @attr_address: the physical address of the attribute structure
++ *
++ * FSL_PAMU_ATTR_STASH: Configure the target CPU and cache level for stashing
++ *
++ * Returns 0 for success, or an error code.
++ */
++static inline unsigned int fh_dma_attr_set(unsigned int handle,
++ unsigned int attr_name, phys_addr_t attr_address)
++{
++ register uintptr_t r11 __asm__("r11");
++ register uintptr_t r3 __asm__("r3");
++ register uintptr_t r4 __asm__("r4");
++ register uintptr_t r5 __asm__("r5");
++ register uintptr_t r6 __asm__("r6");
++
++ r11 = FH_HCALL_TOKEN(FH_DMA_ATTR_SET);
++ r3 = handle;
++ r4 = attr_name;
++ r5 = (uint64_t)attr_address >> 32;
++ r6 = (uint32_t)attr_address;
++
++ __asm__ __volatile__ ("sc 1"
++ : "+r" (r11),
++ "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6)
++ : : EV_HCALL_CLOBBERS4
++ );
++
++ return r3;
++}
++
++/**
++ * fh_dma_attr_get - query the DMA window configuration
++ * @handle: value from fsl,hv-device-handle property
++ * @attr_name: the FSL_PAMU_ATTR_xxx attribute to change
++ * @attr_address: the physical address of the attribute structure
++ *
++ * FSL_PAMU_ATTR_STASH: Query the target CPU and cache level for stashing
++ *
++ * Returns 0 for success, or an error code.
++ */
++static inline unsigned int fh_dma_attr_get(unsigned int handle,
++ unsigned int attr_name, phys_addr_t attr_address)
++{
++ register uintptr_t r11 __asm__("r11");
++ register uintptr_t r3 __asm__("r3");
++ register uintptr_t r4 __asm__("r4");
++ register uintptr_t r5 __asm__("r5");
++ register uintptr_t r6 __asm__("r6");
++
++ r11 = FH_HCALL_TOKEN(FH_DMA_ATTR_GET);
++ r3 = handle;
++ r4 = attr_name;
++ r5 = (uint64_t)attr_address >> 32;
++ r6 = (uint32_t)attr_address;
++
++ __asm__ __volatile__ ("sc 1"
++ : "+r" (r11),
++ "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6)
++ : : EV_HCALL_CLOBBERS4
++ );
++
++ return r3;
++}
++
+ #endif
+diff --git a/arch/powerpc/include/asm/pgtable.h b/arch/powerpc/include/asm/pgtable.h
+index 88b0bd9..bc52378 100644
+--- a/arch/powerpc/include/asm/pgtable.h
++++ b/arch/powerpc/include/asm/pgtable.h
+@@ -172,6 +172,9 @@ extern int ptep_set_access_flags(struct vm_area_struct *vma, unsigned long addre
+
+ #define pgprot_writecombine pgprot_noncached_wc
+
++#define pgprot_cached_noncoherent(prot) \
++ (__pgprot(pgprot_val(prot) & ~_PAGE_CACHE_CTL))
++
+ struct file;
+ extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
+ unsigned long size, pgprot_t vma_prot);
+diff --git a/arch/powerpc/platforms/85xx/Kconfig b/arch/powerpc/platforms/85xx/Kconfig
+index d7946be..b9a2559 100644
+--- a/arch/powerpc/platforms/85xx/Kconfig
++++ b/arch/powerpc/platforms/85xx/Kconfig
+@@ -181,6 +181,8 @@ config P2041_RDB
+ select GPIO_MPC8XXX
+ select HAS_RAPIDIO
+ select PPC_EPAPR_HV_PIC
++ select HAS_FSL_PAMU
++ select HAS_FSL_QBMAN
+ help
+ This option enables support for the P2041 RDB board
+
+@@ -194,6 +196,9 @@ config P3041_DS
+ select GPIO_MPC8XXX
+ select HAS_RAPIDIO
+ select PPC_EPAPR_HV_PIC
++ select HAS_FSL_PAMU
++ select HAS_FSL_QBMAN
++ select FSL_HYDRA_DS_MDIO if PHYLIB
+ help
+ This option enables support for the P3041 DS board
+
+@@ -235,6 +240,9 @@ config P5020_DS
+ select GPIO_MPC8XXX
+ select HAS_RAPIDIO
+ select PPC_EPAPR_HV_PIC
++ select HAS_FSL_PAMU
++ select HAS_FSL_QBMAN
++ select FSL_HYDRA_DS_MDIO if PHYLIB
+ help
+ This option enables support for the P5020 DS board
+
+diff --git a/arch/powerpc/platforms/85xx/corenet_ds.c b/arch/powerpc/platforms/85xx/corenet_ds.c
+index 802ad11..5b6aebf 100644
+--- a/arch/powerpc/platforms/85xx/corenet_ds.c
++++ b/arch/powerpc/platforms/85xx/corenet_ds.c
+@@ -112,6 +112,12 @@ static const struct of_device_id of_device_ids[] __devinitconst = {
+ .compatible = "simple-bus"
+ },
+ {
++ .compatible = "fsl,dpaa"
++ },
++ {
++ .compatible = "fsl,srio"
++ },
++ {
+ .compatible = "fsl,rapidio-delta",
+ },
+ {
+@@ -134,3 +140,32 @@ int __init corenet_ds_publish_devices(void)
+ {
+ return of_platform_bus_probe(NULL, of_device_ids, NULL);
+ }
++
++/* Early setup is required for large chunks of contiguous (and coarsely-aligned)
++ * memory. The following shoe-horns Qman/Bman "init_early" calls into the
++ * platform setup to let them parse their CCSR nodes early on. */
++#ifdef CONFIG_FSL_QMAN_CONFIG
++void __init qman_init_early(void);
++#endif
++#ifdef CONFIG_FSL_BMAN_CONFIG
++void __init bman_init_early(void);
++#endif
++#ifdef CONFIG_FSL_PME2_CTRL
++void __init pme2_init_early(void);
++#endif
++
++__init void corenet_ds_init_early(void)
++{
++#ifdef CONFIG_FSL_QMAN_CONFIG
++ qman_init_early();
++#endif
++#ifdef CONFIG_FSL_BMAN_CONFIG
++ bman_init_early();
++#endif
++#ifdef CONFIG_FSL_PME2_CTRL
++ pme2_init_early();
++#endif
++#ifdef CONFIG_FSL_USDPAA
++ fsl_usdpaa_init_early();
++#endif
++}
+diff --git a/arch/powerpc/platforms/85xx/corenet_ds.h b/arch/powerpc/platforms/85xx/corenet_ds.h
+index ddd700b..a5b63c6 100644
+--- a/arch/powerpc/platforms/85xx/corenet_ds.h
++++ b/arch/powerpc/platforms/85xx/corenet_ds.h
+@@ -15,5 +15,6 @@
+ extern void __init corenet_ds_pic_init(void);
+ extern void __init corenet_ds_setup_arch(void);
+ extern int __init corenet_ds_publish_devices(void);
++extern void __init corenet_ds_init_early(void);
+
+ #endif
+diff --git a/arch/powerpc/platforms/85xx/p2041_rdb.c b/arch/powerpc/platforms/85xx/p2041_rdb.c
+index eda6ed5..595670e 100644
+--- a/arch/powerpc/platforms/85xx/p2041_rdb.c
++++ b/arch/powerpc/platforms/85xx/p2041_rdb.c
+@@ -79,6 +79,7 @@ define_machine(p2041_rdb) {
+ .calibrate_decr = generic_calibrate_decr,
+ .progress = udbg_progress,
+ .power_save = e500_idle,
++ .init_early = corenet_ds_init_early,
+ };
+
+ machine_device_initcall(p2041_rdb, corenet_ds_publish_devices);
+diff --git a/arch/powerpc/sysdev/Makefile b/arch/powerpc/sysdev/Makefile
+index 84e1325..94aa06f 100644
+--- a/arch/powerpc/sysdev/Makefile
++++ b/arch/powerpc/sysdev/Makefile
+@@ -18,6 +18,7 @@ obj-$(CONFIG_FSL_PCI) += fsl_pci.o $(fsl-msi-obj-y)
+ obj-$(CONFIG_FSL_PMC) += fsl_pmc.o
+ obj-$(CONFIG_FSL_LBC) += fsl_lbc.o
+ obj-$(CONFIG_FSL_GTM) += fsl_gtm.o
++obj-$(CONFIG_FSL_PAMU) += fsl_pamu.o
+ obj-$(CONFIG_FSL_85XX_CACHE_SRAM) += fsl_85xx_l2ctlr.o fsl_85xx_cache_sram.o
+ obj-$(CONFIG_SIMPLE_GPIO) += simple_gpio.o
+ obj-$(CONFIG_FSL_RIO) += fsl_rio.o
+diff --git a/arch/powerpc/sysdev/fsl_pamu.c b/arch/powerpc/sysdev/fsl_pamu.c
+new file mode 100644
+index 0000000..a9e9fc7
+--- /dev/null
++++ b/arch/powerpc/sysdev/fsl_pamu.c
+@@ -0,0 +1,1431 @@
++/* Copyright (c) 2008-2012 Freescale Semiconductor, Inc.
++ * All rights reserved.
++ *
++ * 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.
++ */
++
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++
++/* PAMU CCSR space */
++#define PAMU_PGC 0x00000000 /* Allows all peripheral accesses */
++#define PAMU_PE 0x40000000 /* enable PAMU */
++
++/* PAMU_OFFSET to the next pamu space in ccsr */
++#define PAMU_OFFSET 0x1000
++
++#define PAMU_MMAP_REGS_BASE 0
++
++struct pamu_mmap_regs {
++ u32 ppbah;
++ u32 ppbal;
++ u32 pplah;
++ u32 pplal;
++ u32 spbah;
++ u32 spbal;
++ u32 splah;
++ u32 splal;
++ u32 obah;
++ u32 obal;
++ u32 olah;
++ u32 olal;
++};
++
++/* PAMU Error Registers */
++#define PAMU_POES1 0x0040
++#define PAMU_POES2 0x0044
++#define PAMU_POEAH 0x0048
++#define PAMU_POEAL 0x004C
++#define PAMU_AVS1 0x0050
++#define PAMU_AVS1_AV 0x1
++#define PAMU_AVS1_OTV 0x6
++#define PAMU_AVS1_APV 0x78
++#define PAMU_AVS1_WAV 0x380
++#define PAMU_AVS1_LAV 0x1c00
++#define PAMU_AVS1_GCV 0x2000
++#define PAMU_AVS1_PDV 0x4000
++#define PAMU_AV_MASK (PAMU_AVS1_AV | PAMU_AVS1_OTV | PAMU_AVS1_APV | \
++ PAMU_AVS1_WAV | PAMU_AVS1_LAV | PAMU_AVS1_GCV | \
++ PAMU_AVS1_PDV)
++#define PAMU_AVS1_LIODN_SHIFT 16
++#define PAMU_LAV_LIODN_NOT_IN_PPAACT 0x400
++
++#define PAMU_AVS2 0x0054
++#define PAMU_AVAH 0x0058
++#define PAMU_AVAL 0x005C
++#define PAMU_EECTL 0x0060
++#define PAMU_EEDIS 0x0064
++#define PAMU_EEINTEN 0x0068
++#define PAMU_EEDET 0x006C
++#define PAMU_EEATTR 0x0070
++#define PAMU_EEAHI 0x0074
++#define PAMU_EEALO 0x0078
++#define PAMU_EEDHI 0X007C
++#define PAMU_EEDLO 0x0080
++#define PAMU_EECC 0x0084
++#define PAMU_UDAD 0x0090
++
++/* PAMU Revision Registers */
++#define PAMU_PR1 0x0BF8
++#define PAMU_PR2 0x0BFC
++
++/* PAMU Capabilities Registers */
++#define PAMU_PC1 0x0C00
++#define PAMU_PC2 0x0C04
++#define PAMU_PC3 0x0C08
++#define PAMU_PC4 0x0C0C
++
++/* PAMU Control Register */
++#define PAMU_PC 0x0C10
++
++/* PAMU control defs */
++#define PAMU_CONTROL 0x0C10
++#define PAMU_PC_PGC 0x80000000 /* 1 = PAMU Gate Closed : block all
++peripheral access, 0 : may allow peripheral access */
++
++#define PAMU_PC_PE 0x40000000 /* 0 = PAMU disabled, 1 = PAMU enabled */
++#define PAMU_PC_SPCC 0x00000010 /* sPAACE cache enable */
++#define PAMU_PC_PPCC 0x00000001 /* pPAACE cache enable */
++#define PAMU_PC_OCE 0x00001000 /* OMT cache enable */
++
++#define PAMU_PFA1 0x0C14
++#define PAMU_PFA2 0x0C18
++
++/* PAMU Interrupt control and Status Register */
++#define PAMU_PICS 0x0C1C
++#define PAMU_ACCESS_VIOLATION_STAT 0x8
++#define PAMU_ACCESS_VIOLATION_ENABLE 0x4
++
++/* PAMU Debug Registers */
++#define PAMU_PD1 0x0F00
++#define PAMU_PD2 0x0F04
++#define PAMU_PD3 0x0F08
++#define PAMU_PD4 0x0F0C
++
++#define PAACE_AP_PERMS_DENIED 0x0
++#define PAACE_AP_PERMS_QUERY 0x1
++#define PAACE_AP_PERMS_UPDATE 0x2
++#define PAACE_AP_PERMS_ALL 0x3
++#define PAACE_DD_TO_HOST 0x0
++#define PAACE_DD_TO_IO 0x1
++#define PAACE_PT_PRIMARY 0x0
++#define PAACE_PT_SECONDARY 0x1
++#define PAACE_V_INVALID 0x0
++#define PAACE_V_VALID 0x1
++#define PAACE_MW_SUBWINDOWS 0x1
++
++#define PAACE_WSE_4K 0xB
++#define PAACE_WSE_8K 0xC
++#define PAACE_WSE_16K 0xD
++#define PAACE_WSE_32K 0xE
++#define PAACE_WSE_64K 0xF
++#define PAACE_WSE_128K 0x10
++#define PAACE_WSE_256K 0x11
++#define PAACE_WSE_512K 0x12
++#define PAACE_WSE_1M 0x13
++#define PAACE_WSE_2M 0x14
++#define PAACE_WSE_4M 0x15
++#define PAACE_WSE_8M 0x16
++#define PAACE_WSE_16M 0x17
++#define PAACE_WSE_32M 0x18
++#define PAACE_WSE_64M 0x19
++#define PAACE_WSE_128M 0x1A
++#define PAACE_WSE_256M 0x1B
++#define PAACE_WSE_512M 0x1C
++#define PAACE_WSE_1G 0x1D
++#define PAACE_WSE_2G 0x1E
++#define PAACE_WSE_4G 0x1F
++
++#define PAACE_DID_PCI_EXPRESS_1 0x00
++#define PAACE_DID_PCI_EXPRESS_2 0x01
++#define PAACE_DID_PCI_EXPRESS_3 0x02
++#define PAACE_DID_PCI_EXPRESS_4 0x03
++#define PAACE_DID_LOCAL_BUS 0x04
++#define PAACE_DID_SRIO 0x0C
++#define PAACE_DID_MEM_1 0x10
++#define PAACE_DID_MEM_2 0x11
++#define PAACE_DID_MEM_3 0x12
++#define PAACE_DID_MEM_4 0x13
++#define PAACE_DID_MEM_1_2 0x14
++#define PAACE_DID_MEM_3_4 0x15
++#define PAACE_DID_MEM_1_4 0x16
++#define PAACE_DID_BM_SW_PORTAL 0x18
++#define PAACE_DID_PAMU 0x1C
++#define PAACE_DID_CAAM 0x21
++#define PAACE_DID_QM_SW_PORTAL 0x3C
++#define PAACE_DID_CORE0_INST 0x80
++#define PAACE_DID_CORE0_DATA 0x81
++#define PAACE_DID_CORE1_INST 0x82
++#define PAACE_DID_CORE1_DATA 0x83
++#define PAACE_DID_CORE2_INST 0x84
++#define PAACE_DID_CORE2_DATA 0x85
++#define PAACE_DID_CORE3_INST 0x86
++#define PAACE_DID_CORE3_DATA 0x87
++#define PAACE_DID_CORE4_INST 0x88
++#define PAACE_DID_CORE4_DATA 0x89
++#define PAACE_DID_CORE5_INST 0x8A
++#define PAACE_DID_CORE5_DATA 0x8B
++#define PAACE_DID_CORE6_INST 0x8C
++#define PAACE_DID_CORE6_DATA 0x8D
++#define PAACE_DID_CORE7_INST 0x8E
++#define PAACE_DID_CORE7_DATA 0x8F
++#define PAACE_DID_BROADCAST 0xFF
++
++#define PAACE_ATM_NO_XLATE 0x00
++#define PAACE_ATM_WINDOW_XLATE 0x01
++#define PAACE_ATM_PAGE_XLATE 0x02
++#define PAACE_ATM_WIN_PG_XLATE (PAACE_ATM_WINDOW_XLATE | PAACE_ATM_PAGE_XLATE)
++#define PAACE_OTM_NO_XLATE 0x00
++#define PAACE_OTM_IMMEDIATE 0x01
++#define PAACE_OTM_INDEXED 0x02
++#define PAACE_OTM_RESERVED 0x03
++
++#define PAACE_M_COHERENCE_REQ 0x01
++
++#define PAACE_TCEF_FORMAT0_8B 0x00
++#define PAACE_TCEF_FORMAT1_RSVD 0x01
++
++#define PAACE_NUMBER_ENTRIES 0x500
++
++#define OME_NUMBER_ENTRIES 16 /* based on P4080 2.0 silicon plan */
++
++/* PAMU Data Structures */
++
++struct ppaace {
++ /* PAACE Offset 0x00 */
++ /* Window Base Address */
++ u32 wbah;
++ unsigned int wbal:20;
++ /* Window Size, 2^(N+1), N must be > 10 */
++ unsigned int wse:6;
++ /* 1 Means there are secondary windows, wce is count */
++ unsigned int mw:1;
++ /* Permissions, see PAACE_AP_PERMS_* defines */
++ unsigned int ap:2;
++ /*
++ * Destination Domain, see PAACE_DD_* defines,
++ * defines data structure reference for ingress ops into
++ * host/coherency domain or ingress ops into I/O domain
++ */
++ unsigned int dd:1;
++ /* PAACE Type, see PAACE_PT_* defines */
++ unsigned int pt:1;
++ /* PAACE Valid, 0 is invalid */
++ unsigned int v:1;
++
++ /* PAACE Offset 0x08 */
++ /* Interpretation of first 32 bits dependent on DD above */
++ union {
++ struct {
++ /* Destination ID, see PAACE_DID_* defines */
++ u8 did;
++ /* Partition ID */
++ u8 pid;
++ /* Snoop ID */
++ u8 snpid;
++ unsigned int coherency_required:1;
++ unsigned int reserved:7;
++ } to_host;
++ struct {
++ /* Destination ID, see PAACE_DID_* defines */
++ u8 did;
++ unsigned int __reserved:24;
++ } to_io;
++ } __packed domain_attr;
++ /* Implementation attributes */
++ struct {
++ unsigned int reserved1:8;
++ unsigned int cid:8;
++ unsigned int reserved2:8;
++ } __packed impl_attr;
++ /* Window Count; 2^(N+1) sub-windows; only valid for primary PAACE */
++ unsigned int wce:4;
++ /* Address translation mode, see PAACE_ATM_* defines */
++ unsigned int atm:2;
++ /* Operation translation mode, see PAACE_OTM_* defines */
++ unsigned int otm:2;
++
++ /* PAACE Offset 0x10 */
++ /* Translated window base address */
++ u32 twbah;
++ unsigned int twbal:20;
++ /* Subwindow size encoding; 2^(N+1), N > 10 */
++ unsigned int swse:6;
++ unsigned int reserved4:6;
++
++ /* PAACE Offset 0x18 */
++ u32 fspi;
++ union {
++ struct {
++ u8 ioea;
++ u8 moea;
++ u8 ioeb;
++ u8 moeb;
++ } immed_ot;
++ struct {
++ u16 reserved;
++ u16 omi;
++ } index_ot;
++ } __packed op_encode;
++
++ /* PAACE Offset 0x20 */
++ u32 sbah;
++ unsigned int sbal:20;
++ unsigned int sse:6;
++ unsigned int reserved5:6;
++
++ /* PAACE Offset 0x28 */
++ u32 tctbah;
++ unsigned int tctbal:20;
++ unsigned int pse:6;
++ unsigned int tcef:1;
++ unsigned int reserved6:5;
++
++ /* PAACE Offset 0x30 */
++ u32 reserved7[2];
++
++ /* PAACE Offset 0x38 */
++ u32 reserved8[2];
++} __packed ppaace;
++
++/* MOE : Mapped Operation Encodings */
++#define NUM_MOE 128
++struct ome {
++ u8 moe[NUM_MOE];
++} __packed ome;
++
++/*
++ * The Primary Peripheral Access Authorization and Control Table
++ *
++ * To keep things simple, we use one shared PPAACT for all PAMUs. This means
++ * that LIODNs must be unique across all PAMUs.
++ */
++static struct ppaace *ppaact;
++static phys_addr_t ppaact_phys;
++
++/* TRUE if we're running under the Freescale hypervisor */
++bool has_fsl_hypervisor;
++
++#define PAACT_SIZE (sizeof(struct ppaace) * PAACE_NUMBER_ENTRIES)
++#define OMT_SIZE (sizeof(struct ome) * OME_NUMBER_ENTRIES)
++
++#define IOE_READ 0x00
++#define IOE_READ_IDX 0x00
++#define IOE_WRITE 0x81
++#define IOE_WRITE_IDX 0x01
++#define IOE_EREAD0 0x82 /* Enhanced read type 0 */
++#define IOE_EREAD0_IDX 0x02 /* Enhanced read type 0 */
++#define IOE_EWRITE0 0x83 /* Enhanced write type 0 */
++#define IOE_EWRITE0_IDX 0x03 /* Enhanced write type 0 */
++#define IOE_DIRECT0 0x84 /* Directive type 0 */
++#define IOE_DIRECT0_IDX 0x04 /* Directive type 0 */
++#define IOE_EREAD1 0x85 /* Enhanced read type 1 */
++#define IOE_EREAD1_IDX 0x05 /* Enhanced read type 1 */
++#define IOE_EWRITE1 0x86 /* Enhanced write type 1 */
++#define IOE_EWRITE1_IDX 0x06 /* Enhanced write type 1 */
++#define IOE_DIRECT1 0x87 /* Directive type 1 */
++#define IOE_DIRECT1_IDX 0x07 /* Directive type 1 */
++#define IOE_RAC 0x8c /* Read with Atomic clear */
++#define IOE_RAC_IDX 0x0c /* Read with Atomic clear */
++#define IOE_RAS 0x8d /* Read with Atomic set */
++#define IOE_RAS_IDX 0x0d /* Read with Atomic set */
++#define IOE_RAD 0x8e /* Read with Atomic decrement */
++#define IOE_RAD_IDX 0x0e /* Read with Atomic decrement */
++#define IOE_RAI 0x8f /* Read with Atomic increment */
++#define IOE_RAI_IDX 0x0f /* Read with Atomic increment */
++
++#define EOE_READ 0x00
++#define EOE_WRITE 0x01
++#define EOE_RAC 0x0c /* Read with Atomic clear */
++#define EOE_RAS 0x0d /* Read with Atomic set */
++#define EOE_RAD 0x0e /* Read with Atomic decrement */
++#define EOE_RAI 0x0f /* Read with Atomic increment */
++#define EOE_LDEC 0x10 /* Load external cache */
++#define EOE_LDECL 0x11 /* Load external cache with stash lock */
++#define EOE_LDECPE 0x12 /* Load ext. cache with preferred exclusive */
++#define EOE_LDECPEL 0x13 /* Load ext. cache w/ preferred excl. & lock */
++#define EOE_LDECFE 0x14 /* Load external cache with forced exclusive */
++#define EOE_LDECFEL 0x15 /* Load ext. cache w/ forced excl. & lock */
++#define EOE_RSA 0x16 /* Read with stash allocate */
++#define EOE_RSAU 0x17 /* Read with stash allocate and unlock */
++#define EOE_READI 0x18 /* Read with invalidate */
++#define EOE_RWNITC 0x19 /* Read with no intention to cache */
++#define EOE_WCI 0x1a /* Write cache inhibited */
++#define EOE_WWSA 0x1b /* Write with stash allocate */
++#define EOE_WWSAL 0x1c /* Write with stash allocate and lock */
++#define EOE_WWSAO 0x1d /* Write with stash allocate only */
++#define EOE_WWSAOL 0x1e /* Write with stash allocate only and lock */
++#define EOE_VALID 0x80
++
++/* define indexes for each operation mapping scenario */
++#define OMI_QMAN 0x00
++#define OMI_FMAN 0x01
++#define OMI_QMAN_PRIV 0x02
++#define OMI_CAAM 0x03
++
++/*
++ * Return the Nth integer of a given property in a given node
++ *
++ * 'index' is the index into the property (e.g. 'N').
++ * 'property' is the name of the property.
++ *
++ * This function assumes the value of the property is <= INT_MAX. A negative
++ * return value indicates an error.
++ */
++static int of_read_indexed_number(struct device_node *node,
++ const char *property, unsigned int index)
++{
++ const u32 *prop;
++ int value;
++ int len;
++
++ prop = of_get_property(node, property, &len);
++ if (!prop || (len % sizeof(uint32_t)))
++ return -ENODEV;
++
++ if (index >= (len / sizeof(uint32_t)))
++ return -EINVAL;
++
++ value = be32_to_cpu(prop[index]);
++
++ return value;
++}
++
++/**
++ * pamu_set_stash_dest() - set the stash target for a given LIODN
++ * @liodn: LIODN to set
++ * @cache_level: target cache level (1, 2, or 3)
++ * @cpu: target CPU (0, 1, 2, etc)
++ *
++ * This function sets the stash target for a given LIODN, assuming that the
++ * PAACE entry for that LIODN is already configured.
++ *
++ * The function returns 0 on success, or a negative error code on failure.
++ */
++int pamu_set_stash_dest(struct device_node *node, unsigned int index,
++ unsigned int cpu, unsigned int cache_level)
++{
++ int liodn;
++ const u32 *prop;
++ unsigned int i;
++ int psize;
++
++#ifdef CONFIG_FSL_PAMU_ERRATUM_A_004510
++ /*
++ * The work-around says that we cannot have multiple writes to the
++ * PAACT in flight simultaneously, which could happen if multiple
++ * cores try to update CID simultaneously. To prevent that, we wrap
++ * the write in a mutex, which will force the cores to perform their
++ * updates in sequence.
++ */
++ static DEFINE_SPINLOCK(pamu_lock);
++#endif
++
++
++ /* If we're running under a support hypervisor, make an hcall instead */
++ if (has_fsl_hypervisor) {
++ struct fh_dma_attr_stash attr;
++ phys_addr_t paddr = virt_to_phys(&attr);
++ int handle;
++
++ handle = of_read_indexed_number(node, "fsl,hv-dma-handle",
++ index);
++
++ if (handle < 0)
++ return -EINVAL;
++
++ attr.vcpu = cpu;
++ attr.cache = cache_level;
++
++ if (fh_dma_attr_set(handle, FSL_PAMU_ATTR_STASH, paddr))
++ return -EINVAL;
++
++ return 0;
++ }
++
++ liodn = of_read_indexed_number(node, "fsl,liodn", index);
++ if (liodn < 0)
++ return liodn;
++
++ for_each_node_by_type(node, "cpu") {
++ prop = of_get_property(node, "reg", &psize);
++ if (prop) {
++ psize /= 4;
++ for (i = 0; i < psize; i++)
++ if (be32_to_cpup(prop++) == cpu)
++ goto found_cpu;
++ }
++ }
++
++ pr_err("fsl-pamu: could not find 'cpu' node %u\n", cpu);
++ return -EINVAL;
++
++found_cpu:
++ /*
++ * Traverse the list of caches until we find the one we want. The CPU
++ * node is also the L1 cache node
++ */
++ for (i = 1; i < cache_level; i++) {
++ node = of_parse_phandle(node, "next-level-cache", 0);
++ if (!node) {
++ pr_err("fsl-pamu: cache level %u invalid for cpu %u\n",
++ i, cpu);
++ return -EINVAL;
++ }
++ }
++
++ prop = of_get_property(node, "cache-stash-id", NULL);
++ if (!prop) {
++ pr_err("fsl-pamu: missing 'cache-stash-id' in %s\n",
++ node->full_name);
++ return -EINVAL;
++ }
++
++#ifdef CONFIG_FSL_PAMU_ERRATUM_A_004510
++ spin_lock(&pamu_lock);
++#endif
++
++ ppaact[liodn].impl_attr.cid = be32_to_cpup(prop);
++ mb();
++
++#ifdef CONFIG_FSL_PAMU_ERRATUM_A_004510
++ spin_unlock(&pamu_lock);
++#endif
++
++ return 0;
++}
++EXPORT_SYMBOL(pamu_set_stash_dest);
++
++/**
++ * pamu_get_liodn_count() - returns the number of LIODNs for a given node
++ * @node: the node to query
++ *
++ * This function returns the number of LIODNs in a given node.
++ *
++ * The function returns the number >= 0 on success, or a negative error code
++ * on failure. Currently, an error code cannot be returned, but that may
++ * change in the future. Callers are still expected to test for an error.
++ */
++int pamu_get_liodn_count(struct device_node *node)
++{
++ const u32 *prop;
++ int len;
++
++ /*
++ * Under the hypervisor, use the "fsl,hv-dma-handle". Otherwise,
++ * use the "fsl,liodn" property.
++ */
++ if (has_fsl_hypervisor)
++ prop = of_get_property(node, "fsl,hv-dma-handle", &len);
++ else
++ prop = of_get_property(node, "fsl,liodn", &len);
++
++ if (!prop)
++ /*
++ * KVM sets up default stashing but does not provide an
++ * interface to the PAMU, so there are no PAMU nodes or LIODN
++ * properties in the guest device tree. Therefore, if the
++ * LIODN property is missing, that doesn't mean that 'node' is
++ * invalid.
++ */
++ return 0;
++
++ return len / sizeof(uint32_t);
++}
++EXPORT_SYMBOL(pamu_get_liodn_count);
++
++
++static void __init setup_omt(struct ome *omt)
++{
++ struct ome *ome;
++
++ /* Configure OMI_QMAN */
++ ome = &omt[OMI_QMAN];
++
++ ome->moe[IOE_READ_IDX] = EOE_VALID | EOE_READ;
++ ome->moe[IOE_EREAD0_IDX] = EOE_VALID | EOE_RSA;
++ ome->moe[IOE_WRITE_IDX] = EOE_VALID | EOE_WRITE;
++ ome->moe[IOE_EWRITE0_IDX] = EOE_VALID | EOE_WWSAO;
++
++ /*
++ * When it comes to stashing DIRECTIVEs, the QMan BG says
++ * (1.5.6.7.1: FQD Context_A field used for dequeued etc.
++ * etc. stashing control):
++ * - AE/DE/CE == 0: don't stash exclusive. Use DIRECT0,
++ * which should be a non-PE LOADEC.
++ * - AE/DE/CE == 1: stash exclusive via DIRECT1, i.e.
++ * LOADEC-PE
++ * If one desires to alter how the three different types of
++ * stashing are done, please alter rx_conf.exclusive in
++ * ipfwd_a.c (that specifies the 3-bit AE/DE/CE field), and
++ * do not alter the settings here. - bgrayson
++ */
++ ome->moe[IOE_DIRECT0_IDX] = EOE_VALID | EOE_LDEC;
++ ome->moe[IOE_DIRECT1_IDX] = EOE_VALID | EOE_LDECPE;
++
++ /* Configure OMI_FMAN */
++ ome = &omt[OMI_FMAN];
++ ome->moe[IOE_READ_IDX] = EOE_VALID | EOE_READI;
++ ome->moe[IOE_WRITE_IDX] = EOE_VALID | EOE_WWSA;
++
++ /* Configure OMI_QMAN private */
++ ome = &omt[OMI_QMAN_PRIV];
++ ome->moe[IOE_READ_IDX] = EOE_VALID | EOE_READ;
++ ome->moe[IOE_WRITE_IDX] = EOE_VALID | EOE_WRITE;
++ ome->moe[IOE_EREAD0_IDX] = EOE_VALID | EOE_RSA;
++ ome->moe[IOE_EWRITE0_IDX] = EOE_VALID | EOE_WWSA;
++
++ /* Configure OMI_CAAM */
++ ome = &omt[OMI_CAAM];
++ ome->moe[IOE_READ_IDX] = EOE_VALID | EOE_READI;
++ ome->moe[IOE_WRITE_IDX] = EOE_VALID | EOE_WRITE;
++}
++
++static u32 __init get_stash_id(unsigned int stash_dest_hint,
++ struct device_node *portal_dn)
++{
++ const u32 *prop;
++ struct device_node *node;
++ unsigned int cache_level;
++
++ /* Fastpath, exit early if 3/CPC cache is target for stashing */
++ if (stash_dest_hint == 3) {
++ node = of_find_compatible_node(NULL, NULL,
++ "fsl,p4080-l3-cache-controller");
++ if (node) {
++ prop = of_get_property(node, "cache-stash-id", 0);
++ if (!prop) {
++ pr_err("fsl-pamu: missing cache-stash-id in "
++ " %s\n", node->full_name);
++ of_node_put(node);
++ return ~(u32)0;
++ }
++ of_node_put(node);
++ return *prop;
++ }
++ return ~(u32)0;
++ }
++
++ prop = of_get_property(portal_dn, "cpu-handle", 0);
++ /* if no cpu-phandle assume that this is not a per-cpu portal */
++ if (!prop)
++ return ~(u32)0;
++
++ node = of_find_node_by_phandle(*prop);
++ if (!node) {
++ pr_err("fsl-pamu: bad cpu-handle reference in %s\n",
++ portal_dn->full_name);
++ return ~(u32)0;
++ }
++
++ /* find the hwnode that represents the cache */
++ for (cache_level = 1; cache_level <= 3; cache_level++) {
++ if (stash_dest_hint == cache_level) {
++ prop = of_get_property(node, "cache-stash-id", 0);
++ of_node_put(node);
++ if (!prop) {
++ pr_err("fsl-pamu: missing cache-stash-id in "
++ "%s\n", node->full_name);
++ return ~(u32)0;
++ }
++ return *prop;
++ }
++
++ prop = of_get_property(node, "next-level-cache", 0);
++ if (!prop) {
++ pr_err("fsl-pamu: can't find next-level-cache in %s\n",
++ node->full_name);
++ of_node_put(node);
++ return ~(u32)0; /* can't traverse any further */
++ }
++ of_node_put(node);
++
++ /* advance to next node in cache hierarchy */
++ node = of_find_node_by_phandle(*prop);
++ if (!node) {
++ pr_err("fsl-pamu: bad cpu phandle reference in %s\n",
++ portal_dn->full_name);
++ return ~(u32)0;
++ }
++ }
++
++ pr_err("fsl-pamu: stash destination not found for cache level %d "
++ "on portal node %s\n", stash_dest_hint, portal_dn->full_name);
++
++ return ~(u32)0;
++}
++
++#ifdef CONFIG_FSL_FMAN_CPC_STASH
++static void __init enable_fman_io_stashing(struct device_node *dn)
++{
++ const u32 *prop;
++ struct ppaace *ppaace;
++ u32 cache_id;
++
++ prop = of_get_property(dn, "fsl,liodn", NULL);
++ if (prop) {
++ ppaace = &ppaact[*prop];
++ ppaace->otm = PAACE_OTM_INDEXED;
++ ppaace->domain_attr.to_host.coherency_required = 1;
++ ppaace->op_encode.index_ot.omi = OMI_FMAN;
++ cache_id = get_stash_id(3, NULL);
++ pr_debug("%s cache_stash_id = %d\n", dn->full_name, cache_id);
++ if (~cache_id != 0)
++ ppaace->impl_attr.cid = cache_id;
++ } else {
++ pr_err("fsl-pamu: missing fsl,liodn property in %s\n",
++ dn->full_name);
++ }
++}
++#endif
++
++static void __init setup_liodns(void)
++{
++ int i, len;
++ struct ppaace *ppaace;
++ struct device_node *qman_portal_dn = NULL;
++ struct device_node *qman_dn = NULL;
++ struct device_node *bman_dn;
++ const u32 *prop;
++ u32 cache_id, prop_cnt;
++#ifdef CONFIG_FSL_FMAN_CPC_STASH
++ struct device_node *port_dn;
++#endif
++
++ for (i = 0; i < PAACE_NUMBER_ENTRIES; i++) {
++ ppaace = &ppaact[i];
++ ppaace->pt = PAACE_PT_PRIMARY;
++ ppaace->domain_attr.to_host.coherency_required =
++ PAACE_M_COHERENCE_REQ;
++ /* window size is 2^(WSE+1) bytes */
++ ppaace->wse = 35; /* 36-bit phys. addr space */
++ ppaace->wbah = ppaace->wbal = 0;
++ ppaace->atm = PAACE_ATM_NO_XLATE;
++ ppaace->ap = PAACE_AP_PERMS_ALL;
++ mb();
++ ppaace->v = 1;
++ }
++
++ /*
++ * Now, do specific stashing setup for qman portals.
++ * We need stashing setup for LIODNs for qman portal(s) dqrr stashing
++ * (DLIODNs), qman portal(s) data stashing (FLIODNs)
++ */
++
++ for_each_compatible_node(qman_portal_dn, NULL, "fsl,qman-portal") {
++ pr_debug("qman portal %s found\n", qman_portal_dn->full_name);
++
++ prop = of_get_property(qman_portal_dn, "fsl,liodn", &len);
++ if (prop) {
++ prop_cnt = len / sizeof(u32);
++ do {
++ pr_debug("liodn = %d\n", *prop);
++ ppaace = &ppaact[*prop++];
++ ppaace->otm = PAACE_OTM_INDEXED;
++ ppaace->op_encode.index_ot.omi = OMI_QMAN;
++ cache_id = get_stash_id(3, qman_portal_dn);
++ pr_debug("cache_stash_id = %d\n", cache_id);
++ if (~cache_id != 0)
++ ppaace->impl_attr.cid = cache_id;
++ } while (--prop_cnt);
++ } else {
++ pr_err("fsl-pamu: missing fsl,liodn property in %s\n",
++ qman_portal_dn->full_name);
++ }
++ }
++
++ /*
++ * Next, do stashing setups for qman private memory access
++ */
++
++ qman_dn = of_find_compatible_node(NULL, NULL, "fsl,qman");
++ if (qman_dn) {
++ prop = of_get_property(qman_dn, "fsl,liodn", NULL);
++ if (prop) {
++ ppaace = &ppaact[*prop];
++ ppaace->otm = PAACE_OTM_INDEXED;
++ ppaace->domain_attr.to_host.coherency_required = 0;
++ ppaace->op_encode.index_ot.omi = OMI_QMAN_PRIV;
++ cache_id = get_stash_id(3, qman_dn);
++ pr_debug("cache_stash_id = %d\n", cache_id);
++ if (~cache_id != 0)
++ ppaace->impl_attr.cid = cache_id;
++ } else {
++ pr_err("fsl-pamu: missing fsl,liodn property in %s\n",
++ qman_dn->full_name);
++ }
++ of_node_put(qman_dn);
++ }
++
++#ifdef CONFIG_FSL_FMAN_CPC_STASH
++ port_dn = NULL;
++ for_each_compatible_node(port_dn, NULL, "fsl,fman-port-10g-rx")
++ enable_fman_io_stashing(port_dn);
++
++ port_dn = NULL;
++ for_each_compatible_node(port_dn, NULL, "fsl,fman-port-1g-rx")
++ enable_fman_io_stashing(port_dn);
++#endif
++ /*
++ * For liodn used by BMAN for its private memory accesses,
++ * turn the 'coherency required' off. This saves snoops to cores.
++ */
++
++ bman_dn = of_find_compatible_node(NULL, NULL, "fsl,bman");
++ if (bman_dn) {
++ prop = of_get_property(bman_dn, "fsl,liodn", NULL);
++ if (prop) {
++ ppaace = &ppaact[*prop];
++ ppaace->domain_attr.to_host.coherency_required = 0;
++ } else {
++ pr_err("fsl-pamu: missing fsl,liodn property in %s\n",
++ bman_dn->full_name);
++ }
++ of_node_put(bman_dn);
++ }
++}
++
++static int __init setup_one_pamu(void *pamu_reg_base, struct ome *omt)
++{
++ struct pamu_mmap_regs *pamu_regs = pamu_reg_base + PAMU_MMAP_REGS_BASE;
++ phys_addr_t phys;
++
++ /* set up pointers to corenet control blocks */
++
++ phys = ppaact_phys;
++ out_be32(&pamu_regs->ppbah, upper_32_bits(phys));
++ out_be32(&pamu_regs->ppbal, lower_32_bits(phys));
++
++ phys = ppaact_phys + PAACE_NUMBER_ENTRIES * sizeof(struct ppaace);
++ out_be32(&pamu_regs->pplah, upper_32_bits(phys));
++ out_be32(&pamu_regs->pplal, lower_32_bits(phys));
++
++ phys = virt_to_phys(omt);
++ out_be32(&pamu_regs->obah, upper_32_bits(phys));
++ out_be32(&pamu_regs->obal, lower_32_bits(phys));
++
++ phys = virt_to_phys(omt + OME_NUMBER_ENTRIES);
++ out_be32(&pamu_regs->olah, upper_32_bits(phys));
++ out_be32(&pamu_regs->olal, lower_32_bits(phys));
++
++
++ /*
++ * set PAMU enable bit,
++ * allow ppaact & omt to be cached
++ * & enable PAMU access violation interrupts.
++ */
++
++ out_be32(pamu_reg_base + PAMU_PICS, PAMU_ACCESS_VIOLATION_ENABLE);
++ out_be32(pamu_reg_base + PAMU_PC,
++ PAMU_PC_PE | PAMU_PC_OCE | PAMU_PC_SPCC | PAMU_PC_PPCC);
++
++ return 0;
++}
++
++#define make64(high, low) (((u64)(high) << 32) | (low))
++
++struct pamu_isr_data {
++ void __iomem *pamu_reg_base; /* Base address of PAMU regs*/
++ unsigned int count; /* The number of PAMUs */
++};
++
++static irqreturn_t pamu_av_isr(int irq, void *arg)
++{
++ struct pamu_isr_data *data = arg;
++ phys_addr_t phys;
++ unsigned int i, j;
++
++ pr_emerg("fsl-pamu: access violation interrupt\n");
++
++ for (i = 0; i < data->count; i++) {
++ void __iomem *p = data->pamu_reg_base + i * PAMU_OFFSET;
++ u32 pics = in_be32(p + PAMU_PICS);
++
++ if (pics & PAMU_ACCESS_VIOLATION_STAT) {
++ pr_emerg("POES1=%08x\n", in_be32(p + PAMU_POES1));
++ pr_emerg("POES2=%08x\n", in_be32(p + PAMU_POES2));
++ pr_emerg("AVS1=%08x\n", in_be32(p + PAMU_AVS1));
++ pr_emerg("AVS2=%08x\n", in_be32(p + PAMU_AVS2));
++ pr_emerg("AVA=%016llx\n", make64(in_be32(p + PAMU_AVAH),
++ in_be32(p + PAMU_AVAL)));
++ pr_emerg("UDAD=%08x\n", in_be32(p + PAMU_UDAD));
++ pr_emerg("POEA=%016llx\n", make64(in_be32(p + PAMU_POEAH),
++ in_be32(p + PAMU_POEAL)));
++
++ phys = make64(in_be32(p + PAMU_POEAH),
++ in_be32(p + PAMU_POEAL));
++
++ /* Assume that POEA points to a PAACE */
++ if (phys) {
++ u32 *paace = phys_to_virt(phys);
++
++ /* Only the first four words are relevant */
++ for (j = 0; j < 4; j++)
++ pr_emerg("PAACE[%u]=%08x\n", j, in_be32(paace + j));
++ }
++ }
++ }
++
++ panic("\n");
++
++ /* NOT REACHED */
++ return IRQ_HANDLED;
++}
++
++#ifdef CONFIG_FSL_PAMU_ERRATUM_A_004510
++
++/*
++ * The work-around for erratum A-004510 says we need to create a coherency
++ * subdomain (CSD), which means we need to create a LAW (local access window)
++ * just for the PAACT and OMT, and then give it a unique CSD ID. Linux
++ * normally doesn't touch the LAWs, so we define everything here.
++ */
++
++#define LAWAR_EN 0x80000000
++#define LAWAR_TARGET_MASK 0x0FF00000
++#define LAWAR_TARGET_SHIFT 20
++#define LAWAR_SIZE_MASK 0x0000003F
++#define LAWAR_CSDID_MASK 0x000FF000
++#define LAWAR_CSDID_SHIFT 12
++
++#define LAW_SIZE_4K 0xb
++
++struct ccsr_law {
++ u32 lawbarh; /* LAWn base address high */
++ u32 lawbarl; /* LAWn base address low */
++ u32 lawar; /* LAWn attributes */
++ u32 reserved;
++};
++
++/*
++ * Create a coherence subdomain for a given memory block.
++ */
++static int __init create_csd(phys_addr_t phys, size_t size, u32 csd_port_id)
++{
++ struct device_node *np;
++ const __be32 *iprop;
++ void __iomem *lac = NULL; /* Local Access Control registers */
++ struct ccsr_law __iomem *law;
++ void __iomem *ccm = NULL;
++ u32 __iomem *csdids;
++ unsigned int i, num_laws, num_csds;
++ u32 law_target = 0;
++ u32 csd_id = 0;
++ int ret = 0;
++
++ np = of_find_compatible_node(NULL, NULL, "fsl,corenet-law");
++ if (!np)
++ return -ENODEV;
++
++ iprop = of_get_property(np, "fsl,num-laws", NULL);
++ if (!iprop) {
++ ret = -ENODEV;
++ goto error;
++ }
++
++ num_laws = be32_to_cpup(iprop);
++ if (!num_laws) {
++ ret = -ENODEV;
++ goto error;
++ }
++
++ lac = of_iomap(np, 0);
++ if (!lac) {
++ ret = -ENODEV;
++ goto error;
++ }
++
++ /* LAW registers are at offset 0xC00 */
++ law = lac + 0xC00;
++
++ of_node_put(np);
++
++ np = of_find_compatible_node(NULL, NULL, "fsl,corenet-cf");
++ if (!np) {
++ ret = -ENODEV;
++ goto error;
++ }
++
++ iprop = of_get_property(np, "fsl,ccf-num-csdids", NULL);
++ if (!iprop) {
++ ret = -ENODEV;
++ goto error;
++ }
++
++ num_csds = be32_to_cpup(iprop);
++ if (!num_csds) {
++ ret = -ENODEV;
++ goto error;
++ }
++
++ ccm = of_iomap(np, 0);
++ if (!ccm) {
++ ret = -ENOMEM;
++ goto error;
++ }
++
++ /* The undocumented CSDID registers are at offset 0x600 */
++ csdids = ccm + 0x600;
++
++ of_node_put(np);
++ np = NULL;
++
++ /* Find an unused coherence subdomain ID */
++ for (csd_id = 0; csd_id < num_csds; csd_id++) {
++ if (!csdids[csd_id])
++ break;
++ }
++
++ /* Store the Port ID in the (undocumented) proper CIDMRxx register */
++ csdids[csd_id] = csd_port_id;
++
++ /* Find the DDR LAW that maps to our buffer. */
++ for (i = 0; i < num_laws; i++) {
++ if (law[i].lawar & LAWAR_EN) {
++ phys_addr_t law_start, law_end;
++
++ law_start = make64(law[i].lawbarh, law[i].lawbarl);
++ law_end = law_start +
++ (2ULL << (law[i].lawar & LAWAR_SIZE_MASK));
++
++ if (law_start <= phys && phys < law_end) {
++ law_target = law[i].lawar & LAWAR_TARGET_MASK;
++ break;
++ }
++ }
++ }
++
++ if (i == 0 || i == num_laws) {
++ /* This should never happen*/
++ ret = -ENOENT;
++ goto error;
++ }
++
++ /* Find a free LAW entry */
++ while (law[--i].lawar & LAWAR_EN) {
++ if (i == 0) {
++ /* No higher priority LAW slots available */
++ ret = -ENOENT;
++ goto error;
++ }
++ }
++
++ law[i].lawbarh = upper_32_bits(phys);
++ law[i].lawbarl = lower_32_bits(phys);
++ wmb();
++ law[i].lawar = LAWAR_EN | law_target | (csd_id << LAWAR_CSDID_SHIFT) |
++ (LAW_SIZE_4K + get_order(size));
++ wmb();
++
++error:
++ if (ccm)
++ iounmap(ccm);
++
++ if (lac)
++ iounmap(lac);
++
++ if (np)
++ of_node_put(np);
++
++ return ret;
++}
++#endif
++
++/*
++ * Table of SVRs and the corresponding PORT_ID values.
++ *
++ * All future CoreNet-enabled SOCs will have this erratum fixed, so this table
++ * should never need to be updated. SVRs are guaranteed to be unique, so
++ * there is no worry that a future SOC will inadvertently have one of these
++ * values.
++ */
++static const struct {
++ u32 svr;
++ u32 port_id;
++} port_id_map[] = {
++ {0x82100010, 0xFF000000}, /* P2040 1.0 */
++ {0x82100011, 0xFF000000}, /* P2040 1.1 */
++ {0x82100110, 0xFF000000}, /* P2041 1.0 */
++ {0x82100111, 0xFF000000}, /* P2041 1.1 */
++ {0x82110310, 0xFF000000}, /* P3041 1.0 */
++ {0x82110311, 0xFF000000}, /* P3041 1.1 */
++ {0x82010020, 0xFFF80000}, /* P4040 2.0 */
++ {0x82000020, 0xFFF80000}, /* P4080 2.0 */
++ {0x82210010, 0xFC000000}, /* P5010 1.0 */
++ {0x82210020, 0xFC000000}, /* P5010 2.0 */
++ {0x82200010, 0xFC000000}, /* P5020 1.0 */
++ {0x82050010, 0xFF800000}, /* P5021 1.0 */
++ {0x82040010, 0xFF800000}, /* P5040 1.0 */
++};
++
++#define SVR_SECURITY 0x80000 /* The Security (E) bit */
++
++static struct of_device_id qoriq_device_config[] = {
++ {
++ .compatible = "fsl,qoriq-device-config-1.0",
++ },
++ {
++ .compatible = "fsl,t4240-device-config",
++ },
++ {
++ .compatible = "fsl,b4860-device-config",
++ },
++ {
++ .compatible = "fsl,b4420-device-config",
++ },
++ {}
++};
++
++static int __init fsl_pamu_probe(struct platform_device *pdev)
++{
++ void __iomem *pamu_regs = NULL;
++ struct ccsr_guts_85xx __iomem *guts_regs = NULL;
++ u32 pamubypenr, pamu_counter;
++ unsigned long pamu_reg_off;
++ struct device_node *guts_node;
++ struct pamu_isr_data *data;
++ u64 size;
++ struct page *p;
++ int ret = 0;
++ struct ome *omt = NULL;
++ int irq;
++#ifdef CONFIG_FSL_PAMU_ERRATUM_A_004510
++ size_t mem_size = 0;
++ unsigned int order = 0;
++ u32 csd_port_id = 0;
++ unsigned i;
++#endif
++
++ /*
++ * enumerate all PAMUs and allocate and setup PAMU tables
++ * for each of them,
++ * NOTE : All PAMUs share the same LIODN tables.
++ */
++
++ pamu_regs = of_iomap(pdev->dev.of_node, 0);
++ if (!pamu_regs) {
++ dev_err(&pdev->dev, "ioremap of PAMU node failed\n");
++ return -ENOMEM;
++ }
++ of_get_address(pdev->dev.of_node, 0, &size, NULL);
++
++ data = kzalloc(sizeof(struct pamu_isr_data), GFP_KERNEL);
++ if (!data) {
++ iounmap(pamu_regs);
++ return -ENOMEM;
++ }
++ data->pamu_reg_base = pamu_regs;
++ data->count = size / PAMU_OFFSET;
++
++ irq = irq_of_parse_and_map(pdev->dev.of_node, 0);
++ if (irq == NO_IRQ) {
++ dev_warn(&pdev->dev, "no interrupts listed in PAMU node\n");
++ goto error;
++ }
++
++ /* The ISR needs access to the regs, so we won't iounmap them */
++ ret = request_irq(irq, pamu_av_isr, 0, "pamu", data);
++ if (ret < 0) {
++ dev_err(&pdev->dev, "error %i installing ISR for irq %i\n",
++ ret, irq);
++ goto error;
++ }
++
++ guts_node = of_find_matching_node(NULL, qoriq_device_config);
++ if (!guts_node) {
++ dev_err(&pdev->dev, "could not find GUTS node %s\n",
++ pdev->dev.of_node->full_name);
++ ret = -ENODEV;
++ goto error;
++ }
++
++ guts_regs = of_iomap(guts_node, 0);
++ of_node_put(guts_node);
++ if (!guts_regs) {
++ dev_err(&pdev->dev, "ioremap of GUTS node failed\n");
++ ret = -ENODEV;
++ goto error;
++ }
++
++#ifdef CONFIG_FSL_PAMU_ERRATUM_A_004510
++ /*
++ * To simplify the allocation of a coherency domain, we allocate the
++ * PAACT and the OMT in the same memory buffer. Unfortunately, this
++ * wastes more memory compared to allocating the buffers separately.
++ */
++
++ /* Determine how much memory we need */
++ mem_size = (PAGE_SIZE << get_order(PAACT_SIZE)) +
++ (PAGE_SIZE << get_order(OMT_SIZE));
++ order = get_order(mem_size);
++
++ p = alloc_pages(GFP_KERNEL | __GFP_ZERO, order);
++ if (!p) {
++ dev_err(&pdev->dev, "unable to allocate PAACT/OMT block\n");
++ ret = -ENOMEM;
++ goto error;
++ }
++
++ ppaact = page_address(p);
++ ppaact_phys = page_to_phys(p);
++
++ /* Make sure the memory is naturally aligned */
++ if (ppaact_phys & ((PAGE_SIZE << order) - 1)) {
++ dev_err(&pdev->dev, "PAACT/OMT block is unaligned\n");
++ ret = -ENOMEM;
++ goto error;
++ }
++
++ /* This assumes that PAACT_SIZE is larger than OMT_SIZE */
++ omt = (void *)ppaact + (PAGE_SIZE << get_order(PAACT_SIZE));
++
++ dev_dbg(&pdev->dev, "ppaact virt=%p phys=0x%llx\n", ppaact,
++ (unsigned long long) ppaact_phys);
++
++ dev_dbg(&pdev->dev, "omt virt=%p phys=0x%llx\n", omt,
++ (unsigned long long) virt_to_phys(omt));
++
++ /* Check to see if we need to implement the work-around on this SOC */
++
++ /* Determine the Port ID for our coherence subdomain */
++ for (i = 0; i < ARRAY_SIZE(port_id_map); i++) {
++ if (port_id_map[i].svr == (mfspr(SPRN_SVR) & ~SVR_SECURITY)) {
++ csd_port_id = port_id_map[i].port_id;
++ dev_dbg(&pdev->dev, "found matching SVR %08x\n",
++ port_id_map[i].svr);
++ break;
++ }
++ }
++
++ if (csd_port_id) {
++ dev_info(&pdev->dev, "implementing work-around for erratum "
++ "A-004510\n");
++ dev_dbg(&pdev->dev, "creating coherency subdomain at address "
++ "0x%llx, size %zu, port id 0x%08x", ppaact_phys,
++ mem_size, csd_port_id);
++
++ ret = create_csd(ppaact_phys, mem_size, csd_port_id);
++ if (ret) {
++ dev_err(&pdev->dev, "could not create coherence "
++ "subdomain\n");
++ return ret;
++ }
++ }
++#else
++ p = alloc_pages(GFP_KERNEL | __GFP_ZERO, get_order(PAACT_SIZE));
++ if (!p) {
++ dev_err(&pdev->dev, "unable to allocate PAACT table\n");
++ ret = -ENOMEM;
++ goto error;
++ }
++ ppaact = page_address(p);
++ ppaact_phys = page_to_phys(p);
++
++ dev_dbg(&pdev->dev, "ppaact virt=%p phys=0x%llx\n", ppaact,
++ (unsigned long long) ppaact_phys);
++
++ p = alloc_pages(GFP_KERNEL | __GFP_ZERO, get_order(OMT_SIZE));
++ if (!p) {
++ dev_err(&pdev->dev, "unable to allocate OMT table\n");
++ ret = -ENOMEM;
++ goto error;
++ }
++ omt = page_address(p);
++
++ dev_dbg(&pdev->dev, "omt virt=%p phys=0x%llx\n", omt,
++ (unsigned long long) page_to_phys(p));
++#endif
++
++ pamubypenr = in_be32(&guts_regs->pamubypenr);
++
++ for (pamu_reg_off = 0, pamu_counter = 0x80000000; pamu_reg_off < size;
++ pamu_reg_off += PAMU_OFFSET, pamu_counter >>= 1) {
++ setup_one_pamu(pamu_regs + pamu_reg_off, omt);
++
++ /* Disable PAMU bypass for this PAMU */
++ pamubypenr &= ~pamu_counter;
++ }
++
++ setup_omt(omt);
++
++ /*
++ * setup all LIODNS(s) to define a 1:1 mapping for the entire
++ * 36-bit physical address space
++ */
++ setup_liodns();
++ mb();
++
++ /* Enable all relevant PAMU(s) */
++ out_be32(&guts_regs->pamubypenr, pamubypenr);
++
++ iounmap(guts_regs);
++
++ return 0;
++
++error:
++ if (irq != NO_IRQ)
++ free_irq(irq, 0);
++
++ if (pamu_regs)
++ iounmap(pamu_regs);
++
++ if (guts_regs)
++ iounmap(guts_regs);
++
++#ifdef CONFIG_FSL_PAMU_ERRATUM_A_004510
++ if (ppaact)
++ free_pages((unsigned long)ppaact, order);
++#else
++ if (ppaact)
++ free_pages((unsigned long)ppaact, get_order(PAACT_SIZE));
++
++ if (omt)
++ free_pages((unsigned long)omt, get_order(OMT_SIZE));
++#endif
++
++ ppaact = NULL;
++ ppaact_phys = 0;
++
++ return ret;
++}
++
++static struct platform_driver fsl_of_pamu_driver = {
++ .driver = {
++ .name = "fsl-of-pamu",
++ .owner = THIS_MODULE,
++ },
++ .probe = fsl_pamu_probe,
++};
++
++static bool is_fsl_hypervisor(void)
++{
++ struct device_node *np;
++ struct property *prop;
++
++ np = of_find_node_by_path("/hypervisor");
++ if (!np)
++ return false;
++
++ prop = of_find_property(np, "fsl,has-stash-attr-hcall", NULL);
++ of_node_put(np);
++
++ if (!prop)
++ pr_notice("fsl-pamu: this hypervisor does not support the "
++ "stash attribute hypercall\n");
++
++ return !!prop;
++}
++
++static __init int fsl_pamu_init(void)
++{
++ struct platform_device *pdev = NULL;
++ struct device_node *np;
++ int ret;
++
++ /*
++ * The normal OF process calls the probe function at some
++ * indeterminate later time, after most drivers have loaded. This is
++ * too late for us, because PAMU clients (like the Qman driver)
++ * depend on PAMU being initialized early.
++ *
++ * So instead, we "manually" call our probe function by creating the
++ * platform devices ourselves.
++ */
++
++ /*
++ * We assume that there is only one PAMU node in the device tree. A
++ * single PAMU node represents all of the PAMU devices in the SOC
++ * already. Everything else already makes that assumption, and the
++ * binding for the PAMU nodes doesn't allow for any parent-child
++ * relationships anyway. In other words, support for more than one
++ * PAMU node would require significant changes to a lot of code.
++ */
++
++ np = of_find_compatible_node(NULL, NULL, "fsl,pamu");
++ if (!np) {
++ /* No PAMU nodes, so check for a hypervisor */
++ if (is_fsl_hypervisor()) {
++ has_fsl_hypervisor = true;
++ /* Remain resident, but we don't need a platform */
++ return 0;
++ }
++
++ pr_err("fsl-pamu: could not find a PAMU node\n");
++ return -ENODEV;
++ }
++
++ ret = platform_driver_register(&fsl_of_pamu_driver);
++ if (ret) {
++ pr_err("fsl-pamu: could not register driver (err=%i)\n", ret);
++ goto error_driver_register;
++ }
++
++ pdev = platform_device_alloc("fsl-of-pamu", 0);
++ if (!pdev) {
++ pr_err("fsl-pamu: could not allocate device %s\n",
++ np->full_name);
++ ret = -ENOMEM;
++ goto error_device_alloc;
++ }
++ pdev->dev.of_node = of_node_get(np);
++
++ ret = platform_device_add(pdev);
++ if (ret) {
++ pr_err("fsl-pamu: could not add device %s (err=%i)\n",
++ np->full_name, ret);
++ goto error_device_add;
++ }
++
++ return 0;
++
++error_device_add:
++ of_node_put(pdev->dev.of_node);
++ pdev->dev.of_node = NULL;
++
++ platform_device_put(pdev);
++
++error_device_alloc:
++ platform_driver_unregister(&fsl_of_pamu_driver);
++
++error_driver_register:
++ of_node_put(np);
++
++ return ret;
++}
++
++arch_initcall(fsl_pamu_init);
+diff --git a/arch/powerpc/sysdev/fsl_pamu.h b/arch/powerpc/sysdev/fsl_pamu.h
+new file mode 100644
+index 0000000..b816812
+--- /dev/null
++++ b/arch/powerpc/sysdev/fsl_pamu.h
+@@ -0,0 +1,58 @@
++/* Copyright (c) 2012 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.
++ */
++
++#ifndef FSL_PAMU_H
++#define FSL_PAMU_H
++
++#ifdef CONFIG_FSL_PAMU
++
++/* Set the stash target for a given LIODN */
++int pamu_set_stash_dest(struct device_node *node, unsigned int index,
++ unsigned int cpu, unsigned int cache_level);
++
++int pamu_get_liodn_count(struct device_node *node);
++
++#else
++
++static inline int pamu_set_stash_dest(struct device_node *node, unsigned int index,
++ unsigned int cpu, unsigned int cache_level)
++{
++ return -ENOSYS;
++}
++
++static inline int pamu_get_liodn_count(struct device_node *node)
++{
++ return 0;
++}
++
++#endif
++
++#endif
+diff --git a/drivers/Kconfig b/drivers/Kconfig
+index b5e6f24..e458b8e 100644
+--- a/drivers/Kconfig
++++ b/drivers/Kconfig
+@@ -136,4 +136,6 @@ source "drivers/hv/Kconfig"
+
+ source "drivers/devfreq/Kconfig"
+
++source "drivers/net/dpa/NetCommSw/Kconfig"
++
+ endmenu
+diff --git a/drivers/mmc/host/sdhci-of-core.c b/drivers/mmc/host/sdhci-of-core.c
+new file mode 100644
+index 0000000..74de0b5
+--- /dev/null
++++ b/drivers/mmc/host/sdhci-of-core.c
+@@ -0,0 +1,274 @@
++/*
++ * OpenFirmware bindings for Secure Digital Host Controller Interface.
++ *
++ * Copyright (c) 2007, 2011 Freescale Semiconductor, Inc.
++ * Copyright (c) 2009 MontaVista Software, Inc.
++ *
++ * Authors: Xiaobo Xie
++ * Anton Vorontsov
++ *
++ * 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
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#ifdef CONFIG_PPC
++#include
++#endif
++#include "sdhci-of.h"
++#include "sdhci.h"
++
++#ifdef CONFIG_MMC_SDHCI_BIG_ENDIAN_32BIT_BYTE_SWAPPER
++
++/*
++ * These accessors are designed for big endian hosts doing I/O to
++ * little endian controllers incorporating a 32-bit hardware byte swapper.
++ */
++
++u32 sdhci_be32bs_readl(struct sdhci_host *host, int reg)
++{
++ return in_be32(host->ioaddr + reg);
++}
++
++u16 sdhci_be32bs_readw(struct sdhci_host *host, int reg)
++{
++ return in_be16(host->ioaddr + (reg ^ 0x2));
++}
++
++u8 sdhci_be32bs_readb(struct sdhci_host *host, int reg)
++{
++ return in_8(host->ioaddr + (reg ^ 0x3));
++}
++
++void sdhci_be32bs_writel(struct sdhci_host *host, u32 val, int reg)
++{
++ out_be32(host->ioaddr + reg, val);
++}
++
++void sdhci_be32bs_writew(struct sdhci_host *host, u16 val, int reg)
++{
++ struct sdhci_of_host *of_host = sdhci_priv(host);
++ int base = reg & ~0x3;
++ int shift = (reg & 0x2) * 8;
++
++ switch (reg) {
++ case SDHCI_TRANSFER_MODE:
++ /*
++ * Postpone this write, we must do it together with a
++ * command write that is down below.
++ */
++ of_host->xfer_mode_shadow = val;
++ return;
++ case SDHCI_COMMAND:
++ sdhci_be32bs_writel(host, val << 16 | of_host->xfer_mode_shadow,
++ SDHCI_TRANSFER_MODE);
++ return;
++ }
++ clrsetbits_be32(host->ioaddr + base, 0xffff << shift, val << shift);
++}
++
++void sdhci_be32bs_writeb(struct sdhci_host *host, u8 val, int reg)
++{
++ int base = reg & ~0x3;
++ int shift = (reg & 0x3) * 8;
++
++ clrsetbits_be32(host->ioaddr + base , 0xff << shift, val << shift);
++}
++#endif /* CONFIG_MMC_SDHCI_BIG_ENDIAN_32BIT_BYTE_SWAPPER */
++
++#ifdef CONFIG_PM
++
++static int sdhci_of_suspend(struct platform_device *ofdev, pm_message_t state)
++{
++ struct sdhci_host *host = dev_get_drvdata(&ofdev->dev);
++
++ return mmc_suspend_host(host->mmc);
++}
++
++static int sdhci_of_resume(struct platform_device *ofdev)
++{
++ struct sdhci_host *host = dev_get_drvdata(&ofdev->dev);
++
++ return mmc_resume_host(host->mmc);
++}
++
++#else
++
++#define sdhci_of_suspend NULL
++#define sdhci_of_resume NULL
++
++#endif
++
++static bool __devinit sdhci_of_wp_inverted(struct device_node *np)
++{
++ if (of_get_property(np, "sdhci,wp-inverted", NULL))
++ return true;
++
++ /* Old device trees don't have the wp-inverted property. */
++#ifdef CONFIG_PPC
++ return machine_is(mpc837x_rdb) || machine_is(mpc837x_mds);
++#else
++ return false;
++#endif
++}
++
++static const struct of_device_id sdhci_of_match[];
++static int __devinit sdhci_of_probe(struct platform_device *ofdev)
++{
++ const struct of_device_id *match;
++ struct device_node *np = ofdev->dev.of_node;
++ struct sdhci_of_data *sdhci_of_data;
++ struct sdhci_host *host;
++ struct sdhci_of_host *of_host;
++ const __be32 *clk;
++ int size;
++ int ret;
++
++ match = of_match_device(sdhci_of_match, &ofdev->dev);
++ if (!match)
++ return -EINVAL;
++ sdhci_of_data = match->data;
++
++ if (!of_device_is_available(np))
++ return -ENODEV;
++
++ host = sdhci_alloc_host(&ofdev->dev, sizeof(*of_host));
++ if (IS_ERR(host))
++ return -ENOMEM;
++
++ of_host = sdhci_priv(host);
++ dev_set_drvdata(&ofdev->dev, host);
++
++ host->ioaddr = of_iomap(np, 0);
++ if (!host->ioaddr) {
++ ret = -ENOMEM;
++ goto err_addr_map;
++ }
++
++ host->irq = irq_of_parse_and_map(np, 0);
++ if (!host->irq) {
++ ret = -EINVAL;
++ goto err_no_irq;
++ }
++
++ host->hw_name = dev_name(&ofdev->dev);
++ if (sdhci_of_data) {
++ host->quirks = sdhci_of_data->quirks;
++ host->ops = &sdhci_of_data->ops;
++ }
++
++ if (of_get_property(np, "sdhci,auto-cmd12", NULL))
++ host->quirks |= SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12;
++
++
++ if (of_get_property(np, "sdhci,1-bit-only", NULL))
++ host->quirks |= SDHCI_QUIRK_FORCE_1_BIT_DATA;
++
++ if (sdhci_of_wp_inverted(np))
++ host->quirks |= SDHCI_QUIRK_INVERTED_WRITE_PROTECT;
++
++ if (of_device_is_compatible(np, "fsl,esdhc"))
++ host->quirks |= SDHCI_QUIRK_QORIQ_PROCTL_WEIRD;
++
++ if (of_device_is_compatible(np, "fsl,p4080-esdhc"))
++ host->quirks |= SDHCI_QUIRK_QORIQ_HOSTCAPBLT_ONLY_VS33;
++
++ if (of_device_is_compatible(np, "fsl,p2020-rev1-esdhc"))
++ host->quirks |= SDHCI_QUIRK_BROKEN_DMA;
++
++ if (of_device_is_compatible(np, "fsl,p2020-esdhc") ||
++ of_device_is_compatible(np, "fsl,p1010-esdhc") ||
++ of_device_is_compatible(np, "fsl,t4240-esdhc") ||
++ of_device_is_compatible(np, "fsl,mpc8536-esdhc"))
++ host->quirks |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL;
++
++ if (of_device_is_compatible(np, "fsl,t4240-esdhc")) {
++ host->quirks |= SDHCI_QUIRK_BROKEN_ADMA;
++ host->quirks |= SDHCI_QUIRK_QORIQ_CIRCUIT_SUPPORT_VS33;
++ host->quirks |= SDHCI_QUIRK_LONG_TIME_CMD_COMPLETE_IRQ;
++ }
++
++ clk = of_get_property(np, "clock-frequency", &size);
++ if (clk && size == sizeof(*clk) && *clk)
++ of_host->clock = be32_to_cpup(clk);
++
++ ret = sdhci_add_host(host);
++ if (ret)
++ goto err_add_host;
++
++ return 0;
++
++err_add_host:
++ irq_dispose_mapping(host->irq);
++err_no_irq:
++ iounmap(host->ioaddr);
++err_addr_map:
++ sdhci_free_host(host);
++ return ret;
++}
++
++static int __devexit sdhci_of_remove(struct platform_device *ofdev)
++{
++ struct sdhci_host *host = dev_get_drvdata(&ofdev->dev);
++
++ sdhci_remove_host(host, 0);
++ sdhci_free_host(host);
++ irq_dispose_mapping(host->irq);
++ iounmap(host->ioaddr);
++ return 0;
++}
++
++static const struct of_device_id sdhci_of_match[] = {
++#ifdef CONFIG_MMC_SDHCI_OF_ESDHC
++ { .compatible = "fsl,mpc8379-esdhc", .data = &sdhci_esdhc, },
++ { .compatible = "fsl,mpc8536-esdhc", .data = &sdhci_esdhc, },
++ { .compatible = "fsl,esdhc", .data = &sdhci_esdhc, },
++#endif
++#ifdef CONFIG_MMC_SDHCI_OF_HLWD
++ { .compatible = "nintendo,hollywood-sdhci", .data = &sdhci_hlwd, },
++#endif
++ { .compatible = "generic-sdhci", },
++ {},
++};
++MODULE_DEVICE_TABLE(of, sdhci_of_match);
++
++static struct platform_driver sdhci_of_driver = {
++ .driver = {
++ .name = "sdhci-of",
++ .owner = THIS_MODULE,
++ .of_match_table = sdhci_of_match,
++ },
++ .probe = sdhci_of_probe,
++ .remove = __devexit_p(sdhci_of_remove),
++ .suspend = sdhci_of_suspend,
++ .resume = sdhci_of_resume,
++};
++
++static int __init sdhci_of_init(void)
++{
++ return platform_driver_register(&sdhci_of_driver);
++}
++module_init(sdhci_of_init);
++
++static void __exit sdhci_of_exit(void)
++{
++ platform_driver_unregister(&sdhci_of_driver);
++}
++module_exit(sdhci_of_exit);
++
++MODULE_DESCRIPTION("Secure Digital Host Controller Interface OF driver");
++MODULE_AUTHOR("Xiaobo Xie , "
++ "Anton Vorontsov ");
++MODULE_LICENSE("GPL");
+diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
+index 99aa7fa..c1384c7 100644
+--- a/drivers/net/Kconfig
++++ b/drivers/net/Kconfig
+@@ -340,4 +340,99 @@ config VMXNET3
+
+ source "drivers/net/hyperv/Kconfig"
+
++config DPA
++ bool "Freescale Data Path Frame Manager Ethernet"
++ depends on FSL_SOC && FSL_BMAN && FSL_QMAN && FSL_FMAN && LIBFCOE=n
++ select PHYLIB
++
++config DPA_OFFLINE_PORTS
++ bool "Offline Ports support"
++ depends on DPA
++ default y
++ help
++ The Offline Parsing / Host Command ports (short: OH ports, of Offline ports) provide
++ most of the functionality of the regular, online ports, except they receive their
++ frames from a core or an accelerator on the SoC, via QMan frame queues,
++ rather than directly from the network.
++ Offline ports are configured via PCD (Parse-Classify-Distribute) schemes, just like
++ any online FMan port. They deliver the processed frames to frame queues, according
++ to the applied PCD configurations.
++
++ Choosing this feature will not impact the functionality and/or performance of the system,
++ so it is safe to have it.
++
++config DPAA_ETH_SG_SUPPORT
++ bool
++
++choice DPAA_ETH_OPTIMIZE
++ prompt "Optimization choices for the DPAA Ethernet driver"
++ depends on DPA
++ default DPAA_ETH_OPTIMIZE_FOR_IPFWD
++
++ ---help---
++ Compile-time switch between driver optimizations for forwarding use-cases and
++ termination scenarios.
++
++ config DPAA_ETH_OPTIMIZE_FOR_IPFWD
++ bool "Optimize for forwarding"
++ select DPA_TX_RECYCLE if FMAN_T4240
++ help
++ Optimize the DPAA-Ethernet driver for IP/IPSec forwarding use-cases.
++
++ config DPAA_ETH_OPTIMIZE_FOR_TERM
++ bool "Optimize for termination"
++ select DPAA_ETH_SG_SUPPORT
++ help
++ Optimize the DPAA-Ethernet driver for termination (TCP, UDP) use-cases.
++ In particular, this choice enables Scatter-Gather (SG) support
++ in the driver, which is momentarily not accessible otherwise.
++
++endchoice
++
++config DPA_TX_RECYCLE
++ bool
++ depends on FMAN_T4240
++
++config FSL_DPA_1588
++ tristate "IEEE 1588-compliant timestamping"
++ depends on DPA
++ default n
++
++choice DPA_ETH_WQ_ASSIGN
++ prompt "WorkQueue assignment scheme for FrameQueues"
++ depends on DPA
++ default DPA_ETH_WQ_MULTI
++ help
++ Selects the FrameQueue to WorkQueue assignment scheme.
++
++ config DPA_ETH_WQ_LEGACY
++ bool "Legacy WQ assignment"
++ help
++ Statically-defined FQIDs are round-robin assigned to all WQs (0..7). PCD queues are always
++ in this category. Other frame queues may be those used for "MAC-less" or "shared MAC" configurations
++ of the driver.
++ Dynamically-defined FQIDs all go to WQ7.
++ config DPA_ETH_WQ_MULTI
++ bool "Multi-WQ assignment"
++ help
++ Tx Confirmation FQs go to WQ1.
++ Rx Default, Tx and PCD FQs go to WQ3.
++ Rx Error and Tx Error FQs go to WQ2.
++endchoice
++
++config DPAA_ETH_USE_NDO_SELECT_QUEUE
++ bool "Use driver's Tx queue selection mechanism"
++ default y
++ ---help---
++ The DPAA-Ethernet driver defines a ndo_select_queue() callback for optimal selection
++ of the egress FQ. That will override the XPS support for this netdevice.
++ If for whatever reason you want to be in control of the egress FQ-to-CPU selection and mapping,
++ or simply don't want to use the driver's ndo_select_queue() callback, then unselect this
++ and use the standard XPS support instead.
++
++config DPAA_ETH_UNIT_TESTS
++ bool "Run Unit Tests for DPAA Ethernet"
++ depends on DPA
++ default y
++
+ endif # NETDEVICES
+diff --git a/drivers/net/Makefile b/drivers/net/Makefile
+index a81192b..435771c 100644
+--- a/drivers/net/Makefile
++++ b/drivers/net/Makefile
+@@ -57,6 +57,8 @@ obj-$(CONFIG_VMXNET3) += vmxnet3/
+ obj-$(CONFIG_XEN_NETDEV_FRONTEND) += xen-netfront.o
+ obj-$(CONFIG_XEN_NETDEV_BACKEND) += xen-netback/
+
++obj-$(if $(CONFIG_DPA),y) += dpa/
++
+ obj-$(CONFIG_USB_CATC) += usb/
+ obj-$(CONFIG_USB_KAWETH) += usb/
+ obj-$(CONFIG_USB_PEGASUS) += usb/
+diff --git a/drivers/net/dpa/Makefile b/drivers/net/dpa/Makefile
+new file mode 100644
+index 0000000..0e59076
+--- /dev/null
++++ b/drivers/net/dpa/Makefile
+@@ -0,0 +1,21 @@
++#
++# Makefile for the Freescale Ethernet controllers
++#
++EXTRA_CFLAGS += -DVERSION=\"\"
++#
++#Include netcomm SW specific definitions
++include $(srctree)/drivers/net/dpa/NetCommSw/ncsw_config.mk
++
++EXTRA_CFLAGS += -I$(NET_DPA)
++
++#Netcomm SW tree
++obj-$(CONFIG_FSL_FMAN) += NetCommSw/
++obj-$(CONFIG_FSL_DPA_1588) += dpaa_1588.o
++obj-$(CONFIG_DPAA_ETH_SG_SUPPORT) += fsl-dpa-sg.o
++obj-$(CONFIG_DPA) += fsl-mac.o fsl-dpa.o
++obj-$(CONFIG_DPA_OFFLINE_PORTS) += fsl-oh.o
++
++fsl-dpa-objs := dpa-ethtool.o dpaa_eth.o dpaa_eth_sysfs.o xgmac_mdio.o memac_mdio.o
++fsl-dpa-sg-objs := dpaa_eth_sg.o
++fsl-mac-objs := mac.o mac-api.o
++fsl-oh-objs := offline_port.o
+diff --git a/drivers/net/dpa/NetCommSw/Kconfig b/drivers/net/dpa/NetCommSw/Kconfig
+new file mode 100644
+index 0000000..e640465
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Kconfig
+@@ -0,0 +1,112 @@
++menu "Frame Manager support"
++
++menuconfig FSL_FMAN
++ bool "Freescale Frame Manager (datapath) support"
++ # depends on PPC_E500MC
++ default y
++ ---help---
++ If unsure, say Y.
++
++if FSL_FMAN
++
++config FSL_FMAN_TEST
++ bool "FMan test module"
++ default n
++ ---help---
++ This option compiles test code for FMan.
++
++menu "FMAN Processor support"
++choice
++ depends on FSL_FMAN
++ prompt "Processor Type"
++
++config FMAN_P3040_P4080_P5020
++ bool "P3040 P4080 5020"
++
++config FMAN_P1023
++ bool "P1023"
++
++config FMAN_T4240
++ bool "T4240"
++
++endchoice
++endmenu
++
++config FMAN_RESOURCE_ALLOCATION_ALGORITHM
++ bool "Enable FMan dynamic resource allocation algorithm"
++ default n
++ ---help---
++ Enables algorithm for dynamic resource allocation
++
++config FMAN_DISABLE_OH_TO_REUSE_RESOURCES
++ depends on FMAN_RESOURCE_ALLOCATION_ALGORITHM
++ bool "Disable offline parsing ports to reuse resources"
++ default n
++ ---help---
++ Redistributes FMan OH's resources to all other ports,
++ thus enabling other configurations.
++
++config FMAN_MIB_CNT_OVF_IRQ_EN
++ bool "Enable the dTSEC MIB counters overflow interrupt"
++ default n
++ ---help---
++ Enable the dTSEC MIB counters overflow interrupt to get
++ accurate MIB counters values. Enabled it compensates
++ for the counters overflow but reduces performance and
++ triggers error messages in HV setups.
++
++
++config FSL_FM_MAX_FRAME_SIZE
++ int "Maximum L2 frame size"
++ depends on FSL_FMAN
++ range 64 9600
++ default "1522"
++ help
++ Configure this in relation to the maximum possible MTU of your
++ network configuration. In particular, one would need to
++ increase this value in order to use jumbo frames.
++ FSL_FM_MAX_FRAME_SIZE must accomodate the Ethernet FCS (4 bytes)
++ and one ETH+VLAN header (18 bytes), to a total of 22 bytes in
++ excess of the desired L3 MTU.
++
++ Note that having too large a FSL_FM_MAX_FRAME_SIZE (much larger
++ than the actual MTU) may lead to buffer exhaustion, especially
++ in the case of badly fragmented datagrams on the Rx path.
++ Conversely, having a FSL_FM_MAX_FRAME_SIZE smaller than the actual
++ MTU will lead to frames being dropped.
++
++ This can be overridden by specifying "fsl_fm_max_frm" in
++ the kernel bootargs:
++ * in Hypervisor-based scenarios, by adding a "chosen" node
++ with the "bootargs" property specifying
++ "fsl_fm_max_frm=";
++ * in non-Hypervisor-based scenarios, via u-boot's env, by
++ modifying the "bootargs" env variable.
++
++config FSL_FM_RX_EXTRA_HEADROOM
++ int "Add extra headroom at beginning of data buffers"
++ depends on FSL_FMAN
++ range 0 384
++ default "64"
++ help
++ Configure this to tell the Frame Manager to reserve some extra
++ space at the beginning of a data buffer on the receive path,
++ before Internal Context fields are copied. This is in addition
++ to the private data area already reserved for driver internal
++ use. The option does not affect in any way the layout of
++ transmitted buffers. You may be required to enable the config
++ option FMAN_RESOURCE_ALLOCATION_ALGORITHM and also
++ FMAN_DISABLE_OH_TO_REUSE_RESOURCES to have enough resources
++ when using this option and also supporting jumbo frames.
++
++ This setting can be overridden by specifying
++ "fsl_fm_rx_extra_headroom" in the kernel bootargs:
++ * in Hypervisor-based scenarios, by adding a "chosen" node
++ with the "bootargs" property specifying
++ "fsl_fm_rx_extra_headroom=";
++ * in non-Hypervisor-based scenarios, via u-boot's env, by
++ modifying the "bootargs" env variable.
++
++endif # FSL_FMAN
++
++endmenu
+diff --git a/drivers/net/dpa/NetCommSw/Makefile b/drivers/net/dpa/NetCommSw/Makefile
+new file mode 100644
+index 0000000..c21d5a5
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Makefile
+@@ -0,0 +1,11 @@
++#
++# Makefile for the Freescale Ethernet controllers
++#
++EXTRA_CFLAGS += -DVERSION=\"\"
++#
++#Include netcomm SW specific definitions
++include $(srctree)/drivers/net/dpa/NetCommSw/ncsw_config.mk
++#
++obj-y += etc/
++obj-y += Peripherals/FM/
++obj-y += src/
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/HC/Makefile b/drivers/net/dpa/NetCommSw/Peripherals/FM/HC/Makefile
+new file mode 100644
+index 0000000..3ec3824
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/HC/Makefile
+@@ -0,0 +1,15 @@
++#
++# Makefile for the Freescale Ethernet controllers
++#
++EXTRA_CFLAGS += -DVERSION=\"\"
++#
++#Include netcomm SW specific definitions
++include $(srctree)/drivers/net/dpa/NetCommSw/ncsw_config.mk
++
++NCSW_FM_INC = $(srctree)/drivers/net/dpa/NetCommSw/Peripherals/FM/inc
++
++EXTRA_CFLAGS += -I$(NCSW_FM_INC)
++
++obj-y += fsl-ncsw-Hc.o
++
++fsl-ncsw-Hc-objs := hc.o
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/HC/hc.c b/drivers/net/dpa/NetCommSw/Peripherals/FM/HC/hc.c
+new file mode 100644
+index 0000000..dca9478
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/HC/hc.c
+@@ -0,0 +1,1191 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++#include "std_ext.h"
++#include "error_ext.h"
++#include "sprint_ext.h"
++#include "string_ext.h"
++
++#include "fm_common.h"
++#include "fm_hc.h"
++
++
++/**************************************************************************//**
++ @Description defaults
++*//***************************************************************************/
++#define DEFAULT_dataMemId 0
++
++#define HC_HCOR_OPCODE_PLCR_PRFL 0x0
++#define HC_HCOR_OPCODE_KG_SCM 0x1
++#define HC_HCOR_OPCODE_SYNC 0x2
++#define HC_HCOR_OPCODE_CC 0x3
++#define HC_HCOR_OPCODE_CC_CAPWAP_REASSM_TIMEOUT 0x5
++#define HC_HCOR_OPCODE_CC_IP_REASSM_TIMEOUT 0x10
++#define HC_HCOR_OPCODE_CC_IP_FRAG_INITIALIZATION 0x11
++#define HC_HCOR_ACTION_REG_IP_REASSM_TIMEOUT_ACTIVE_SHIFT 24
++#define HC_HCOR_EXTRA_REG_IP_REASSM_TIMEOUT_TSBS_SHIFT 24
++#define HC_HCOR_ACTION_REG_IP_REASSM_TIMEOUT_RES_SHIFT 16
++#define HC_HCOR_ACTION_REG_IP_REASSM_TIMEOUT_RES_MASK 0xF
++#define HC_HCOR_ACTION_REG_IP_FRAG_SCRATCH_POOL_CMD_SHIFT 24
++#define HC_HCOR_ACTION_REG_IP_FRAG_SCRATCH_POOL_BPID 16
++
++#define HC_HCOR_GBL 0x20000000
++
++#define HC_HCOR_KG_SCHEME_COUNTER 0x00000400
++
++#if (DPAA_VERSION == 10)
++#define HC_HCOR_KG_SCHEME_REGS_MASK 0xFFFFF800
++#else
++#define HC_HCOR_KG_SCHEME_REGS_MASK 0xFFFFFE00
++#endif /* (DPAA_VERSION == 10) */
++
++#define SIZE_OF_HC_FRAME_PORT_REGS (sizeof(t_HcFrame)-sizeof(struct fman_kg_scheme_regs)+sizeof(t_FmPcdKgPortRegs))
++#define SIZE_OF_HC_FRAME_SCHEME_REGS sizeof(t_HcFrame)
++#define SIZE_OF_HC_FRAME_PROFILES_REGS (sizeof(t_HcFrame)-sizeof(struct fman_kg_scheme_regs)+sizeof(t_FmPcdPlcrProfileRegs))
++#define SIZE_OF_HC_FRAME_PROFILE_CNT (sizeof(t_HcFrame)-sizeof(t_FmPcdPlcrProfileRegs)+sizeof(uint32_t))
++#define SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC 16
++
++#define HC_CMD_POOL_SIZE (INTG_MAX_NUM_OF_CORES)
++
++#define BUILD_FD(len) \
++do { \
++ memset(&fmFd, 0, sizeof(t_DpaaFD)); \
++ DPAA_FD_SET_ADDR(&fmFd, p_HcFrame); \
++ DPAA_FD_SET_OFFSET(&fmFd, 0); \
++ DPAA_FD_SET_LENGTH(&fmFd, len); \
++} while (0)
++
++
++#if defined(__MWERKS__) && !defined(__GNUC__)
++#pragma pack(push,1)
++#endif /* defined(__MWERKS__) && ... */
++
++typedef _Packed struct t_FmPcdKgPortRegs {
++ volatile uint32_t spReg;
++ volatile uint32_t cppReg;
++} _PackedType t_FmPcdKgPortRegs;
++
++typedef _Packed struct t_HcFrame {
++ volatile uint32_t opcode;
++ volatile uint32_t actionReg;
++ volatile uint32_t extraReg;
++ volatile uint32_t commandSequence;
++ union {
++ struct fman_kg_scheme_regs schemeRegs;
++ struct fman_kg_scheme_regs schemeRegsWithoutCounter;
++ t_FmPcdPlcrProfileRegs profileRegs;
++ volatile uint32_t singleRegForWrite; /* for writing SP, CPP, profile counter */
++ t_FmPcdKgPortRegs portRegsForRead;
++ volatile uint32_t clsPlanEntries[CLS_PLAN_NUM_PER_GRP];
++ t_FmPcdCcCapwapReassmTimeoutParams ccCapwapReassmTimeout;
++ t_FmPcdCcIpReassmTimeoutParams ccIpReassmTimeout;
++ } hcSpecificData;
++} _PackedType t_HcFrame;
++
++#if defined(__MWERKS__) && !defined(__GNUC__)
++#pragma pack(pop)
++#endif /* defined(__MWERKS__) && ... */
++
++
++typedef struct t_FmHc {
++ t_Handle h_FmPcd;
++ t_Handle h_HcPortDev;
++ t_FmPcdQmEnqueueCallback *f_QmEnqueue; /**< A callback for enqueuing frames to the QM */
++ t_Handle h_QmArg; /**< A handle to the QM module */
++ uint8_t dataMemId; /**< Memory partition ID for data buffers */
++
++ uint32_t seqNum[HC_CMD_POOL_SIZE]; /* FIFO of seqNum to use when
++ taking buffer */
++ uint32_t nextSeqNumLocation; /* seqNum location in seqNum[] for next buffer */
++ volatile bool enqueued[HC_CMD_POOL_SIZE]; /* HC is active - frame is enqueued
++ and not confirmed yet */
++ t_HcFrame *p_Frm[HC_CMD_POOL_SIZE];
++} t_FmHc;
++
++
++static t_Error FillBufPool(t_FmHc *p_FmHc)
++{
++ uint32_t i;
++
++ ASSERT_COND(p_FmHc);
++
++ for (i = 0; i < HC_CMD_POOL_SIZE; i++)
++ {
++#ifdef FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004
++ p_FmHc->p_Frm[i] = (t_HcFrame *)XX_MallocSmart((sizeof(t_HcFrame) + (16 - (sizeof(t_FmHc) % 16))),
++ p_FmHc->dataMemId,
++ 16);
++#else
++ p_FmHc->p_Frm[i] = (t_HcFrame *)XX_MallocSmart(sizeof(t_HcFrame),
++ p_FmHc->dataMemId,
++ 16);
++#endif /* FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004 */
++ if (!p_FmHc->p_Frm[i])
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("FM HC frames!"));
++ }
++
++ /* Initialize FIFO of seqNum to use during GetBuf */
++ for (i = 0; i < HC_CMD_POOL_SIZE; i++)
++ {
++ p_FmHc->seqNum[i] = i;
++ }
++ p_FmHc->nextSeqNumLocation = 0;
++
++ return E_OK;
++}
++
++static __inline__ t_HcFrame * GetBuf(t_FmHc *p_FmHc, uint32_t *p_SeqNum)
++{
++ uint32_t intFlags;
++
++ ASSERT_COND(p_FmHc);
++
++ intFlags = FmPcdLock(p_FmHc->h_FmPcd);
++
++ if (p_FmHc->nextSeqNumLocation == HC_CMD_POOL_SIZE)
++ {
++ /* No more buffers */
++ FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
++ return NULL;
++ }
++
++ *p_SeqNum = p_FmHc->seqNum[p_FmHc->nextSeqNumLocation];
++ p_FmHc->nextSeqNumLocation++;
++
++ FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
++ return p_FmHc->p_Frm[*p_SeqNum];
++}
++
++static __inline__ void PutBuf(t_FmHc *p_FmHc, t_HcFrame *p_Buf, uint32_t seqNum)
++{
++ uint32_t intFlags;
++
++ UNUSED(p_Buf);
++
++ intFlags = FmPcdLock(p_FmHc->h_FmPcd);
++ ASSERT_COND(p_FmHc->nextSeqNumLocation);
++ p_FmHc->nextSeqNumLocation--;
++ p_FmHc->seqNum[p_FmHc->nextSeqNumLocation] = seqNum;
++ FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
++}
++
++static __inline__ t_Error EnQFrm(t_FmHc *p_FmHc, t_DpaaFD *p_FmFd, uint32_t seqNum)
++{
++ t_Error err = E_OK;
++ uint32_t intFlags;
++ uint32_t timeout=100;
++
++ intFlags = FmPcdLock(p_FmHc->h_FmPcd);
++ ASSERT_COND(!p_FmHc->enqueued[seqNum]);
++ p_FmHc->enqueued[seqNum] = TRUE;
++ FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
++ DBG(TRACE, ("Send Hc, SeqNum %d, buff@0x%x, fd offset 0x%x",
++ seqNum,
++ DPAA_FD_GET_ADDR(p_FmFd),
++ DPAA_FD_GET_OFFSET(p_FmFd)));
++ err = p_FmHc->f_QmEnqueue(p_FmHc->h_QmArg, (void *)p_FmFd);
++ if (err)
++ RETURN_ERROR(MINOR, err, ("HC enqueue failed"));
++
++ while (p_FmHc->enqueued[seqNum] && --timeout)
++ XX_UDelay(100);
++
++ if (!timeout)
++ RETURN_ERROR(MINOR, E_TIMEOUT, ("HC Callback, timeout exceeded"));
++
++ return err;
++}
++
++
++t_Handle FmHcConfigAndInit(t_FmHcParams *p_FmHcParams)
++{
++ t_FmHc *p_FmHc;
++ t_FmPortParams fmPortParam;
++ t_Error err;
++
++ p_FmHc = (t_FmHc *)XX_Malloc(sizeof(t_FmHc));
++ if (!p_FmHc)
++ {
++ REPORT_ERROR(MINOR, E_NO_MEMORY, ("HC obj"));
++ return NULL;
++ }
++ memset(p_FmHc,0,sizeof(t_FmHc));
++
++ p_FmHc->h_FmPcd = p_FmHcParams->h_FmPcd;
++ p_FmHc->f_QmEnqueue = p_FmHcParams->params.f_QmEnqueue;
++ p_FmHc->h_QmArg = p_FmHcParams->params.h_QmArg;
++ p_FmHc->dataMemId = DEFAULT_dataMemId;
++
++ err = FillBufPool(p_FmHc);
++ if (err != E_OK)
++ {
++ REPORT_ERROR(MAJOR, err, NO_MSG);
++ FmHcFree(p_FmHc);
++ return NULL;
++ }
++
++ if (!FmIsMaster(p_FmHcParams->h_Fm))
++ return (t_Handle)p_FmHc;
++
++ memset(&fmPortParam, 0, sizeof(fmPortParam));
++ fmPortParam.baseAddr = p_FmHcParams->params.portBaseAddr;
++ fmPortParam.portType = e_FM_PORT_TYPE_OH_HOST_COMMAND;
++ fmPortParam.portId = p_FmHcParams->params.portId;
++ fmPortParam.liodnBase = p_FmHcParams->params.liodnBase;
++ fmPortParam.h_Fm = p_FmHcParams->h_Fm;
++
++ fmPortParam.specificParams.nonRxParams.errFqid = p_FmHcParams->params.errFqid;
++ fmPortParam.specificParams.nonRxParams.dfltFqid = p_FmHcParams->params.confFqid;
++ fmPortParam.specificParams.nonRxParams.qmChannel = p_FmHcParams->params.qmChannel;
++
++ p_FmHc->h_HcPortDev = FM_PORT_Config(&fmPortParam);
++ if (!p_FmHc->h_HcPortDev)
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_HANDLE, ("FM HC port!"));
++ XX_Free(p_FmHc);
++ return NULL;
++ }
++
++ /* final init */
++ err = FM_PORT_Init(p_FmHc->h_HcPortDev);
++ if (err != E_OK)
++ {
++ REPORT_ERROR(MAJOR, err, ("FM HC port init!"));
++ FmHcFree(p_FmHc);
++ return NULL;
++ }
++
++ err = FM_PORT_Enable(p_FmHc->h_HcPortDev);
++ if (err != E_OK)
++ {
++ REPORT_ERROR(MAJOR, err, ("FM HC port enable!"));
++ FmHcFree(p_FmHc);
++ return NULL;
++ }
++
++ return (t_Handle)p_FmHc;
++}
++
++t_Handle FmGcGetHcPortDevH(t_Handle h_FmHc)
++{
++ t_FmHc *p_FmHc = (t_FmHc *)h_FmHc;
++
++ return (p_FmHc) ? p_FmHc->h_HcPortDev : NULL;
++}
++
++void FmHcFree(t_Handle h_FmHc)
++{
++ t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
++ int i;
++
++ if (!p_FmHc)
++ return;
++
++ for (i=0; ip_Frm[i])
++ XX_FreeSmart(p_FmHc->p_Frm[i]);
++ else
++ break;
++
++ if (p_FmHc->h_HcPortDev)
++ FM_PORT_Free(p_FmHc->h_HcPortDev);
++
++ XX_Free(p_FmHc);
++}
++
++/*****************************************************************************/
++t_Error FmHcSetFramesDataMemory(t_Handle h_FmHc,
++ uint8_t memId)
++{
++ t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
++ int i;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmHc, E_INVALID_HANDLE);
++
++ p_FmHc->dataMemId = memId;
++
++ for (i=0; ip_Frm[i])
++ XX_FreeSmart(p_FmHc->p_Frm[i]);
++
++ return FillBufPool(p_FmHc);
++}
++
++#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
++t_Error FmHcDumpRegs(t_Handle h_FmHc)
++{
++ t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmHc, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmHc->h_HcPortDev, E_INVALID_HANDLE);
++
++ return FM_PORT_DumpRegs(p_FmHc->h_HcPortDev);
++
++}
++#endif /* (defined(DEBUG_ERRORS) && ... */
++
++void FmHcTxConf(t_Handle h_FmHc, t_DpaaFD *p_Fd)
++{
++ t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
++ t_HcFrame *p_HcFrame;
++ uint32_t intFlags;
++
++ ASSERT_COND(p_FmHc);
++
++ intFlags = FmPcdLock(p_FmHc->h_FmPcd);
++ p_HcFrame = (t_HcFrame *)PTR_MOVE(DPAA_FD_GET_ADDR(p_Fd), DPAA_FD_GET_OFFSET(p_Fd));
++
++ DBG(TRACE, ("Hc Conf, SeqNum %d, FD@0x%x, fd offset 0x%x",
++ p_HcFrame->commandSequence, DPAA_FD_GET_ADDR(p_Fd), DPAA_FD_GET_OFFSET(p_Fd)));
++
++ if (!(p_FmHc->enqueued[p_HcFrame->commandSequence]))
++ REPORT_ERROR(MINOR, E_INVALID_FRAME, ("Not an Host-Command frame received!"));
++ else
++ p_FmHc->enqueued[p_HcFrame->commandSequence] = FALSE;
++ FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
++}
++
++t_Error FmHcPcdKgSetScheme(t_Handle h_FmHc,
++ t_Handle h_Scheme,
++ struct fman_kg_scheme_regs *p_SchemeRegs,
++ bool updateCounter)
++{
++ t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
++ t_Error err = E_OK;
++ t_HcFrame *p_HcFrame;
++ t_DpaaFD fmFd;
++ uint8_t physicalSchemeId;
++ uint32_t seqNum;
++
++ p_HcFrame = GetBuf(p_FmHc, &seqNum);
++ if (!p_HcFrame)
++ RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
++
++ physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme);
++
++ memset(p_HcFrame, 0, sizeof(t_HcFrame));
++ p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
++ p_HcFrame->actionReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, updateCounter);
++ p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
++ memcpy(&p_HcFrame->hcSpecificData.schemeRegs, p_SchemeRegs, sizeof(struct fman_kg_scheme_regs));
++ if (!updateCounter)
++ {
++ p_HcFrame->hcSpecificData.schemeRegs.kgse_dv0 = p_SchemeRegs->kgse_dv0;
++ p_HcFrame->hcSpecificData.schemeRegs.kgse_dv1 = p_SchemeRegs->kgse_dv1;
++ p_HcFrame->hcSpecificData.schemeRegs.kgse_ccbs = p_SchemeRegs->kgse_ccbs;
++ p_HcFrame->hcSpecificData.schemeRegs.kgse_mv = p_SchemeRegs->kgse_mv;
++ }
++ p_HcFrame->commandSequence = seqNum;
++
++ BUILD_FD(sizeof(t_HcFrame));
++
++ err = EnQFrm(p_FmHc, &fmFd, seqNum);
++
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++
++ if (err != E_OK)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++
++ return E_OK;
++}
++
++t_Error FmHcPcdKgDeleteScheme(t_Handle h_FmHc, t_Handle h_Scheme)
++{
++ t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
++ t_Error err = E_OK;
++ t_HcFrame *p_HcFrame;
++ t_DpaaFD fmFd;
++ uint8_t physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme);
++ uint32_t seqNum;
++
++ p_HcFrame = GetBuf(p_FmHc, &seqNum);
++ if (!p_HcFrame)
++ RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
++
++ memset(p_HcFrame, 0, sizeof(t_HcFrame));
++ p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
++ p_HcFrame->actionReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, TRUE);
++ p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
++ memset(&p_HcFrame->hcSpecificData.schemeRegs, 0, sizeof(struct fman_kg_scheme_regs));
++ p_HcFrame->commandSequence = seqNum;
++
++ BUILD_FD(sizeof(t_HcFrame));
++
++ err = EnQFrm(p_FmHc, &fmFd, seqNum);
++
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++
++ if (err != E_OK)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++
++ return E_OK;
++}
++
++t_Error FmHcPcdKgCcGetSetParams(t_Handle h_FmHc, t_Handle h_Scheme, uint32_t requiredAction, uint32_t value)
++{
++ t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
++ t_Error err = E_OK;
++ t_HcFrame *p_HcFrame;
++ t_DpaaFD fmFd;
++ uint8_t relativeSchemeId;
++ uint8_t physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme);
++ uint32_t tmpReg32 = 0;
++ uint32_t seqNum;
++
++ /* Scheme is locked by calling routine */
++ /* WARNING - this lock will not be efficient if other HC routine will attempt to change
++ * "kgse_mode" or "kgse_om" without locking scheme !
++ */
++
++ relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmHc->h_FmPcd, physicalSchemeId);
++ if ( relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES)
++ RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
++
++ if (!FmPcdKgGetPointedOwners(p_FmHc->h_FmPcd, relativeSchemeId) ||
++ !(FmPcdKgGetRequiredAction(p_FmHc->h_FmPcd, relativeSchemeId) & requiredAction))
++ {
++ if ((requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA) &&
++ (FmPcdKgGetNextEngine(p_FmHc->h_FmPcd, relativeSchemeId) == e_FM_PCD_PLCR))
++ {
++ if ((FmPcdKgIsDirectPlcr(p_FmHc->h_FmPcd, relativeSchemeId) == FALSE) ||
++ (FmPcdKgIsDistrOnPlcrProfile(p_FmHc->h_FmPcd, relativeSchemeId) == TRUE))
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("In this situation PP can not be with distribution and has to be shared"));
++ err = FmPcdPlcrCcGetSetParams(p_FmHc->h_FmPcd, FmPcdKgGetRelativeProfileId(p_FmHc->h_FmPcd, relativeSchemeId), requiredAction);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++ else /* From here we deal with KG-Schemes only */
++ {
++ /* Pre change general code */
++ p_HcFrame = GetBuf(p_FmHc, &seqNum);
++ if (!p_HcFrame)
++ RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
++ memset(p_HcFrame, 0, sizeof(t_HcFrame));
++ p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
++ p_HcFrame->actionReg = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);
++ p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
++ p_HcFrame->commandSequence = seqNum;
++ BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
++ if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
++ {
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++ RETURN_ERROR(MINOR, err, NO_MSG);
++ }
++
++ /* specific change */
++ if ((requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA) &&
++ ((FmPcdKgGetNextEngine(p_FmHc->h_FmPcd, relativeSchemeId) == e_FM_PCD_DONE) &&
++ (FmPcdKgGetDoneAction(p_FmHc->h_FmPcd, relativeSchemeId) == e_FM_PCD_ENQ_FRAME)))
++ {
++ tmpReg32 = p_HcFrame->hcSpecificData.schemeRegs.kgse_mode;
++ ASSERT_COND(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME));
++ p_HcFrame->hcSpecificData.schemeRegs.kgse_mode = tmpReg32 | NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;
++ }
++
++ if ((requiredAction & UPDATE_KG_NIA_CC_WA) &&
++ (FmPcdKgGetNextEngine(p_FmHc->h_FmPcd, relativeSchemeId) == e_FM_PCD_CC))
++ {
++ tmpReg32 = p_HcFrame->hcSpecificData.schemeRegs.kgse_mode;
++ ASSERT_COND(tmpReg32 & (NIA_ENG_FM_CTL | NIA_FM_CTL_AC_CC));
++ tmpReg32 &= ~NIA_FM_CTL_AC_CC;
++ p_HcFrame->hcSpecificData.schemeRegs.kgse_mode = tmpReg32 | NIA_FM_CTL_AC_PRE_CC;
++ }
++
++ if (requiredAction & UPDATE_KG_OPT_MODE)
++ p_HcFrame->hcSpecificData.schemeRegs.kgse_om = value;
++
++ if (requiredAction & UPDATE_KG_NIA)
++ {
++ tmpReg32 = p_HcFrame->hcSpecificData.schemeRegs.kgse_mode;
++ tmpReg32 &= ~(NIA_ENG_MASK | NIA_AC_MASK);
++ tmpReg32 |= value;
++ p_HcFrame->hcSpecificData.schemeRegs.kgse_mode = tmpReg32;
++ }
++
++ /* Post change general code */
++ p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
++ p_HcFrame->actionReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, FALSE);
++ p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
++
++ BUILD_FD(sizeof(t_HcFrame));
++ err = EnQFrm(p_FmHc, &fmFd, seqNum);
++
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++
++ if (err != E_OK)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++ }
++ }
++
++ return E_OK;
++}
++
++uint32_t FmHcPcdKgGetSchemeCounter(t_Handle h_FmHc, t_Handle h_Scheme)
++{
++ t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
++ t_Error err;
++ t_HcFrame *p_HcFrame;
++ t_DpaaFD fmFd;
++ uint32_t retVal;
++ uint8_t relativeSchemeId;
++ uint8_t physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme);
++ uint32_t seqNum;
++
++ relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmHc->h_FmPcd, physicalSchemeId);
++ if ( relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES)
++ {
++ REPORT_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
++ return 0;
++ }
++
++ /* first read scheme and check that it is valid */
++ p_HcFrame = GetBuf(p_FmHc, &seqNum);
++ if (!p_HcFrame)
++ {
++ REPORT_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
++ return 0;
++ }
++ memset(p_HcFrame, 0, sizeof(t_HcFrame));
++ p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
++ p_HcFrame->actionReg = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);
++ p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
++ p_HcFrame->commandSequence = seqNum;
++
++ BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
++
++ err = EnQFrm(p_FmHc, &fmFd, seqNum);
++ if (err != E_OK)
++ {
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++ REPORT_ERROR(MINOR, err, NO_MSG);
++ return 0;
++ }
++
++ if (!FmPcdKgHwSchemeIsValid(p_HcFrame->hcSpecificData.schemeRegs.kgse_mode))
++ {
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++ REPORT_ERROR(MAJOR, E_ALREADY_EXISTS, ("Scheme is invalid"));
++ return 0;
++ }
++
++ retVal = p_HcFrame->hcSpecificData.schemeRegs.kgse_spc;
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++
++ return retVal;
++}
++
++t_Error FmHcPcdKgSetSchemeCounter(t_Handle h_FmHc, t_Handle h_Scheme, uint32_t value)
++{
++ t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
++ t_Error err = E_OK;
++ t_HcFrame *p_HcFrame;
++ t_DpaaFD fmFd;
++ uint8_t relativeSchemeId, physicalSchemeId;
++ uint32_t seqNum;
++
++ physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme);
++ relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmHc->h_FmPcd, physicalSchemeId);
++ if ( relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES)
++ RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
++
++ /* first read scheme and check that it is valid */
++ p_HcFrame = GetBuf(p_FmHc, &seqNum);
++ if (!p_HcFrame)
++ RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
++ memset(p_HcFrame, 0, sizeof(t_HcFrame));
++ p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
++ p_HcFrame->actionReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, TRUE);
++ p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_COUNTER;
++ /* write counter */
++ p_HcFrame->hcSpecificData.singleRegForWrite = value;
++ p_HcFrame->commandSequence = seqNum;
++
++ BUILD_FD(sizeof(t_HcFrame));
++
++ err = EnQFrm(p_FmHc, &fmFd, seqNum);
++
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++ return err;
++}
++
++t_Error FmHcPcdKgSetClsPlan(t_Handle h_FmHc, t_FmPcdKgInterModuleClsPlanSet *p_Set)
++{
++ t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
++ t_HcFrame *p_HcFrame;
++ t_DpaaFD fmFd;
++ uint32_t i;
++ uint32_t seqNum;
++ t_Error err = E_OK;
++
++ ASSERT_COND(p_FmHc);
++
++ p_HcFrame = GetBuf(p_FmHc, &seqNum);
++ if (!p_HcFrame)
++ RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
++
++ for (i = p_Set->baseEntry; i < (p_Set->baseEntry+p_Set->numOfClsPlanEntries); i+=8)
++ {
++ memset(p_HcFrame, 0, sizeof(t_HcFrame));
++ p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
++ p_HcFrame->actionReg = FmPcdKgBuildWriteClsPlanBlockActionReg((uint8_t)(i / CLS_PLAN_NUM_PER_GRP));
++ p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
++ memcpy((void*)&p_HcFrame->hcSpecificData.clsPlanEntries, (void *)&p_Set->vectors[i-p_Set->baseEntry], CLS_PLAN_NUM_PER_GRP*sizeof(uint32_t));
++ p_HcFrame->commandSequence = seqNum;
++
++ BUILD_FD(sizeof(t_HcFrame));
++
++ if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
++ {
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++ RETURN_ERROR(MINOR, err, NO_MSG);
++ }
++ }
++
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++ return err;
++}
++
++t_Error FmHcPcdKgDeleteClsPlan(t_Handle h_FmHc, uint8_t grpId)
++{
++ t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
++ t_FmPcdKgInterModuleClsPlanSet *p_ClsPlanSet;
++
++ p_ClsPlanSet = (t_FmPcdKgInterModuleClsPlanSet *)XX_Malloc(sizeof(t_FmPcdKgInterModuleClsPlanSet));
++ if (!p_ClsPlanSet)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Classification plan set"));
++
++ memset(p_ClsPlanSet, 0, sizeof(t_FmPcdKgInterModuleClsPlanSet));
++
++ p_ClsPlanSet->baseEntry = FmPcdKgGetClsPlanGrpBase(p_FmHc->h_FmPcd, grpId);
++ p_ClsPlanSet->numOfClsPlanEntries = FmPcdKgGetClsPlanGrpSize(p_FmHc->h_FmPcd, grpId);
++ ASSERT_COND(p_ClsPlanSet->numOfClsPlanEntries <= FM_PCD_MAX_NUM_OF_CLS_PLANS);
++
++ if (FmHcPcdKgSetClsPlan(p_FmHc, p_ClsPlanSet) != E_OK)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
++ XX_Free(p_ClsPlanSet);
++
++ FmPcdKgDestroyClsPlanGrp(p_FmHc->h_FmPcd, grpId);
++
++ return E_OK;
++}
++
++t_Error FmHcPcdCcCapwapTimeoutReassm(t_Handle h_FmHc, t_FmPcdCcCapwapReassmTimeoutParams *p_CcCapwapReassmTimeoutParams )
++{
++ t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
++ t_HcFrame *p_HcFrame;
++ t_DpaaFD fmFd;
++ t_Error err;
++ uint32_t seqNum;
++
++ SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0);
++
++ p_HcFrame = GetBuf(p_FmHc, &seqNum);
++ if (!p_HcFrame)
++ RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
++
++ memset(p_HcFrame, 0, sizeof(t_HcFrame));
++ p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_CC_CAPWAP_REASSM_TIMEOUT);
++ memcpy(&p_HcFrame->hcSpecificData.ccCapwapReassmTimeout, p_CcCapwapReassmTimeoutParams, sizeof(t_FmPcdCcCapwapReassmTimeoutParams));
++ p_HcFrame->commandSequence = seqNum;
++ BUILD_FD(sizeof(t_HcFrame));
++
++ err = EnQFrm(p_FmHc, &fmFd, seqNum);
++
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++ return err;
++}
++
++t_Error FmHcPcdCcIpFragScratchPollCmd(t_Handle h_FmHc, bool fill, t_FmPcdCcFragScratchPoolCmdParams *p_FmPcdCcFragScratchPoolCmdParams)
++{
++ t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
++ t_HcFrame *p_HcFrame;
++ t_DpaaFD fmFd;
++ t_Error err;
++ uint32_t seqNum;
++
++ SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0);
++
++ p_HcFrame = GetBuf(p_FmHc, &seqNum);
++ if (!p_HcFrame)
++ RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
++
++ memset(p_HcFrame, 0, sizeof(t_HcFrame));
++
++ p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_CC_IP_FRAG_INITIALIZATION);
++ p_HcFrame->actionReg = (uint32_t)(((fill == TRUE) ? 0 : 1) << HC_HCOR_ACTION_REG_IP_FRAG_SCRATCH_POOL_CMD_SHIFT);
++ p_HcFrame->actionReg |= p_FmPcdCcFragScratchPoolCmdParams->bufferPoolId << HC_HCOR_ACTION_REG_IP_FRAG_SCRATCH_POOL_BPID;
++ if (fill == TRUE)
++ {
++ p_HcFrame->extraReg = p_FmPcdCcFragScratchPoolCmdParams->numOfBuffers;
++ }
++ p_HcFrame->commandSequence = seqNum;
++
++ BUILD_FD(sizeof(t_HcFrame));
++ if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
++ {
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++ RETURN_ERROR(MINOR, err, NO_MSG);
++ }
++
++ p_FmPcdCcFragScratchPoolCmdParams->numOfBuffers = p_HcFrame->extraReg;
++
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++ return E_OK;
++}
++
++t_Error FmHcPcdCcIpTimeoutReassm(t_Handle h_FmHc, t_FmPcdCcIpReassmTimeoutParams *p_CcIpReassmTimeoutParams, uint8_t *p_Result)
++{
++ t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
++ t_HcFrame *p_HcFrame;
++ t_DpaaFD fmFd;
++ t_Error err;
++ uint32_t seqNum;
++
++ SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0);
++
++ p_HcFrame = GetBuf(p_FmHc, &seqNum);
++ if (!p_HcFrame)
++ RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
++
++ memset(p_HcFrame, 0, sizeof(t_HcFrame));
++ p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_CC_IP_REASSM_TIMEOUT);
++ p_HcFrame->actionReg = (uint32_t)((p_CcIpReassmTimeoutParams->activate ? 0 : 1) << HC_HCOR_ACTION_REG_IP_REASSM_TIMEOUT_ACTIVE_SHIFT);
++ p_HcFrame->extraReg = (p_CcIpReassmTimeoutParams->tsbs << HC_HCOR_EXTRA_REG_IP_REASSM_TIMEOUT_TSBS_SHIFT) | p_CcIpReassmTimeoutParams->iprcpt;
++ p_HcFrame->commandSequence = seqNum;
++
++ BUILD_FD(sizeof(t_HcFrame));
++ if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
++ {
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++ RETURN_ERROR(MINOR, err, NO_MSG);
++ }
++
++ *p_Result = (uint8_t)
++ ((p_HcFrame->actionReg >> HC_HCOR_ACTION_REG_IP_REASSM_TIMEOUT_RES_SHIFT) & HC_HCOR_ACTION_REG_IP_REASSM_TIMEOUT_RES_MASK);
++
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++ return E_OK;
++}
++
++t_Error FmHcPcdPlcrCcGetSetParams(t_Handle h_FmHc,uint16_t absoluteProfileId, uint32_t requiredAction)
++{
++ t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
++ t_HcFrame *p_HcFrame;
++ t_DpaaFD fmFd;
++ t_Error err;
++ uint32_t tmpReg32 = 0;
++ uint32_t requiredActionTmp, pointedOwnersTmp;
++ uint32_t seqNum;
++
++ SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0);
++
++ /* Profile is locked by calling routine */
++ /* WARNING - this lock will not be efficient if other HC routine will attempt to change
++ * "fmpl_pegnia" "fmpl_peynia" or "fmpl_pernia" without locking Profile !
++ */
++
++ requiredActionTmp = FmPcdPlcrGetRequiredAction(p_FmHc->h_FmPcd, absoluteProfileId);
++ pointedOwnersTmp = FmPcdPlcrGetPointedOwners(p_FmHc->h_FmPcd, absoluteProfileId);
++
++ if (!pointedOwnersTmp || !(requiredActionTmp & requiredAction))
++ {
++ if (requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA)
++ {
++ p_HcFrame = GetBuf(p_FmHc, &seqNum);
++ if (!p_HcFrame)
++ RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
++ /* first read scheme and check that it is valid */
++ memset(p_HcFrame, 0, sizeof(t_HcFrame));
++ p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
++ p_HcFrame->actionReg = FmPcdPlcrBuildReadPlcrActionReg(absoluteProfileId);
++ p_HcFrame->extraReg = 0x00008000;
++ p_HcFrame->commandSequence = seqNum;
++
++ BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
++
++ if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
++ {
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++ RETURN_ERROR(MINOR, err, NO_MSG);
++ }
++
++ tmpReg32 = p_HcFrame->hcSpecificData.profileRegs.fmpl_pegnia;
++ if (!(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)))
++ {
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++ RETURN_ERROR(MAJOR, E_INVALID_STATE,
++ ("Next engine of this policer profile has to be assigned to FM_PCD_DONE"));
++ }
++
++ tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;
++
++ p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
++ p_HcFrame->actionReg = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);
++ p_HcFrame->actionReg |= FmPcdPlcrBuildNiaProfileReg(TRUE, FALSE, FALSE);
++ p_HcFrame->extraReg = 0x00008000;
++ p_HcFrame->hcSpecificData.singleRegForWrite = tmpReg32;
++
++ BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT);
++
++ if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
++ {
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++ RETURN_ERROR(MINOR, err, NO_MSG);
++ }
++
++ tmpReg32 = p_HcFrame->hcSpecificData.profileRegs.fmpl_peynia;
++ if (!(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)))
++ {
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Next engine of this policer profile has to be assigned to FM_PCD_DONE"));
++ }
++
++ tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;
++
++ p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
++ p_HcFrame->actionReg = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);
++ p_HcFrame->actionReg |= FmPcdPlcrBuildNiaProfileReg(FALSE, TRUE, FALSE);
++ p_HcFrame->extraReg = 0x00008000;
++ p_HcFrame->hcSpecificData.singleRegForWrite = tmpReg32;
++
++ BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT);
++
++ if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
++ {
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++ RETURN_ERROR(MINOR, err, NO_MSG);
++ }
++
++ tmpReg32 = p_HcFrame->hcSpecificData.profileRegs.fmpl_pernia;
++ if (!(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)))
++ {
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Next engine of this policer profile has to be assigned to FM_PCD_DONE"));
++ }
++
++ tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;
++
++ p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
++ p_HcFrame->actionReg = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);
++ p_HcFrame->actionReg |= FmPcdPlcrBuildNiaProfileReg(FALSE, FALSE, TRUE);
++ p_HcFrame->extraReg = 0x00008000;
++ p_HcFrame->hcSpecificData.singleRegForWrite = tmpReg32;
++
++ BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT);
++
++ if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
++ {
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++ RETURN_ERROR(MINOR, err, NO_MSG);
++ }
++
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++ }
++ }
++
++ return E_OK;
++}
++
++t_Error FmHcPcdPlcrSetProfile(t_Handle h_FmHc, t_Handle h_Profile, t_FmPcdPlcrProfileRegs *p_PlcrRegs)
++{
++ t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
++ t_Error err = E_OK;
++ uint16_t profileIndx;
++ t_HcFrame *p_HcFrame;
++ t_DpaaFD fmFd;
++ uint32_t seqNum;
++
++ p_HcFrame = GetBuf(p_FmHc, &seqNum);
++ if (!p_HcFrame)
++ RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
++
++ profileIndx = FmPcdPlcrProfileGetAbsoluteId(h_Profile);
++
++ memset(p_HcFrame, 0, sizeof(t_HcFrame));
++ p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
++ p_HcFrame->actionReg = FmPcdPlcrBuildWritePlcrActionRegs(profileIndx);
++ p_HcFrame->extraReg = 0x00008000;
++ memcpy(&p_HcFrame->hcSpecificData.profileRegs, p_PlcrRegs, sizeof(t_FmPcdPlcrProfileRegs));
++ p_HcFrame->commandSequence = seqNum;
++
++ BUILD_FD(sizeof(t_HcFrame));
++
++ err = EnQFrm(p_FmHc, &fmFd, seqNum);
++
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++
++ if (err != E_OK)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++
++ return E_OK;
++}
++
++t_Error FmHcPcdPlcrDeleteProfile(t_Handle h_FmHc, t_Handle h_Profile)
++{
++ t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
++ uint16_t absoluteProfileId = FmPcdPlcrProfileGetAbsoluteId(h_Profile);
++ t_Error err = E_OK;
++ t_HcFrame *p_HcFrame;
++ t_DpaaFD fmFd;
++ uint32_t seqNum;
++
++ p_HcFrame = GetBuf(p_FmHc, &seqNum);
++ if (!p_HcFrame)
++ RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
++ memset(p_HcFrame, 0, sizeof(t_HcFrame));
++ p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
++ p_HcFrame->actionReg = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);
++ p_HcFrame->actionReg |= 0x00008000;
++ p_HcFrame->extraReg = 0x00008000;
++ memset(&p_HcFrame->hcSpecificData.profileRegs, 0, sizeof(t_FmPcdPlcrProfileRegs));
++ p_HcFrame->commandSequence = seqNum;
++
++ BUILD_FD(sizeof(t_HcFrame));
++
++ err = EnQFrm(p_FmHc, &fmFd, seqNum);
++
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++
++ if (err != E_OK)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++
++ return E_OK;
++}
++
++t_Error FmHcPcdPlcrSetProfileCounter(t_Handle h_FmHc, t_Handle h_Profile, e_FmPcdPlcrProfileCounters counter, uint32_t value)
++{
++
++ t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
++ uint16_t absoluteProfileId = FmPcdPlcrProfileGetAbsoluteId(h_Profile);
++ t_Error err = E_OK;
++ t_HcFrame *p_HcFrame;
++ t_DpaaFD fmFd;
++ uint32_t seqNum;
++
++ /* first read scheme and check that it is valid */
++ p_HcFrame = GetBuf(p_FmHc, &seqNum);
++ if (!p_HcFrame)
++ RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
++ memset(p_HcFrame, 0, sizeof(t_HcFrame));
++ p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
++ p_HcFrame->actionReg = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);
++ p_HcFrame->actionReg |= FmPcdPlcrBuildCounterProfileReg(counter);
++ p_HcFrame->extraReg = 0x00008000;
++ p_HcFrame->hcSpecificData.singleRegForWrite = value;
++ p_HcFrame->commandSequence = seqNum;
++
++ BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT);
++
++ err = EnQFrm(p_FmHc, &fmFd, seqNum);
++
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++
++ if (err != E_OK)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++
++ return E_OK;
++}
++
++uint32_t FmHcPcdPlcrGetProfileCounter(t_Handle h_FmHc, t_Handle h_Profile, e_FmPcdPlcrProfileCounters counter)
++{
++ t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
++ uint16_t absoluteProfileId = FmPcdPlcrProfileGetAbsoluteId(h_Profile);
++ t_Error err;
++ t_HcFrame *p_HcFrame;
++ t_DpaaFD fmFd;
++ uint32_t retVal = 0;
++ uint32_t seqNum;
++
++ SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0);
++
++ /* first read scheme and check that it is valid */
++ p_HcFrame = GetBuf(p_FmHc, &seqNum);
++ if (!p_HcFrame)
++ {
++ REPORT_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
++ return 0;
++ }
++ memset(p_HcFrame, 0, sizeof(t_HcFrame));
++ p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
++ p_HcFrame->actionReg = FmPcdPlcrBuildReadPlcrActionReg(absoluteProfileId);
++ p_HcFrame->extraReg = 0x00008000;
++ p_HcFrame->commandSequence = seqNum;
++
++ BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
++
++ err = EnQFrm(p_FmHc, &fmFd, seqNum);
++ if (err != E_OK)
++ {
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++ REPORT_ERROR(MINOR, err, NO_MSG);
++ return 0;
++ }
++
++ switch (counter)
++ {
++ case e_FM_PCD_PLCR_PROFILE_GREEN_PACKET_TOTAL_COUNTER:
++ retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_pegpc;
++ break;
++ case e_FM_PCD_PLCR_PROFILE_YELLOW_PACKET_TOTAL_COUNTER:
++ retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_peypc;
++ break;
++ case e_FM_PCD_PLCR_PROFILE_RED_PACKET_TOTAL_COUNTER:
++ retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_perpc;
++ break;
++ case e_FM_PCD_PLCR_PROFILE_RECOLOURED_YELLOW_PACKET_TOTAL_COUNTER:
++ retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_perypc;
++ break;
++ case e_FM_PCD_PLCR_PROFILE_RECOLOURED_RED_PACKET_TOTAL_COUNTER:
++ retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_perrpc;
++ break;
++ default:
++ REPORT_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
++ }
++
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++ return retVal;
++}
++
++t_Error FmHcKgWriteSp(t_Handle h_FmHc, uint8_t hardwarePortId, uint32_t spReg, bool add)
++{
++ t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
++ t_HcFrame *p_HcFrame;
++ t_DpaaFD fmFd;
++ t_Error err = E_OK;
++ uint32_t seqNum;
++
++ ASSERT_COND(p_FmHc);
++
++ p_HcFrame = GetBuf(p_FmHc, &seqNum);
++ if (!p_HcFrame)
++ RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
++ memset(p_HcFrame, 0, sizeof(t_HcFrame));
++ /* first read SP register */
++ p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
++ p_HcFrame->actionReg = FmPcdKgBuildReadPortSchemeBindActionReg(hardwarePortId);
++ p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
++ p_HcFrame->commandSequence = seqNum;
++
++ BUILD_FD(SIZE_OF_HC_FRAME_PORT_REGS);
++
++ if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
++ {
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++ RETURN_ERROR(MINOR, err, NO_MSG);
++ }
++
++ /* spReg is the first reg, so we can use it both for read and for write */
++ if (add)
++ p_HcFrame->hcSpecificData.portRegsForRead.spReg |= spReg;
++ else
++ p_HcFrame->hcSpecificData.portRegsForRead.spReg &= ~spReg;
++
++ p_HcFrame->actionReg = FmPcdKgBuildWritePortSchemeBindActionReg(hardwarePortId);
++
++ BUILD_FD(sizeof(t_HcFrame));
++
++ err = EnQFrm(p_FmHc, &fmFd, seqNum);
++
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++
++ if (err != E_OK)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++
++ return E_OK;
++}
++
++t_Error FmHcKgWriteCpp(t_Handle h_FmHc, uint8_t hardwarePortId, uint32_t cppReg)
++{
++ t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
++ t_HcFrame *p_HcFrame;
++ t_DpaaFD fmFd;
++ t_Error err = E_OK;
++ uint32_t seqNum;
++
++ ASSERT_COND(p_FmHc);
++
++ p_HcFrame = GetBuf(p_FmHc, &seqNum);
++ if (!p_HcFrame)
++ RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
++ memset(p_HcFrame, 0, sizeof(t_HcFrame));
++ /* first read SP register */
++ p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
++ p_HcFrame->actionReg = FmPcdKgBuildWritePortClsPlanBindActionReg(hardwarePortId);
++ p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
++ p_HcFrame->hcSpecificData.singleRegForWrite = cppReg;
++ p_HcFrame->commandSequence = seqNum;
++
++ BUILD_FD(sizeof(t_HcFrame));
++
++ err = EnQFrm(p_FmHc, &fmFd, seqNum);
++
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++
++ if (err != E_OK)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++
++ return E_OK;
++}
++
++t_Error FmHcPcdCcDoDynamicChange(t_Handle h_FmHc, uint32_t oldAdAddrOffset, uint32_t newAdAddrOffset)
++{
++ t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
++ t_HcFrame *p_HcFrame;
++ t_DpaaFD fmFd;
++ t_Error err = E_OK;
++ uint32_t seqNum;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmHc, E_INVALID_HANDLE);
++
++ p_HcFrame = GetBuf(p_FmHc, &seqNum);
++ if (!p_HcFrame)
++ RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
++ memset(p_HcFrame, 0, sizeof(t_HcFrame));
++
++ p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_CC);
++ p_HcFrame->actionReg = newAdAddrOffset;
++ p_HcFrame->actionReg |= 0xc0000000;
++ p_HcFrame->extraReg = oldAdAddrOffset;
++ p_HcFrame->commandSequence = seqNum;
++
++ BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
++
++ err = EnQFrm(p_FmHc, &fmFd, seqNum);
++
++ PutBuf(p_FmHc, p_HcFrame, seqNum);
++
++ if (err != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ return E_OK;
++}
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/Makefile b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/Makefile
+new file mode 100644
+index 0000000..629949c
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/Makefile
+@@ -0,0 +1,20 @@
++#
++# Makefile for the Freescale Ethernet controllers
++#
++EXTRA_CFLAGS += -DVERSION=\"\"
++#
++#Include netcomm SW specific definitions
++include $(srctree)/drivers/net/dpa/NetCommSw/ncsw_config.mk
++NCSW_FM_INC = $(srctree)/drivers/net/dpa/NetCommSw/Peripherals/FM/inc
++
++EXTRA_CFLAGS += -I$(NCSW_FM_INC)
++
++obj-y += fsl-ncsw-MAC.o
++
++fsl-ncsw-MAC-objs := dtsec.o dtsec_mii_acc.o fm_mac.o tgec.o tgec_mii_acc.o \
++ fman_dtsec.o fman_dtsec_mii_acc.o fman_memac.o \
++ fman_tgec.o fman_crc32.o
++
++ifeq ($(CONFIG_FMAN_T4240),y)
++fsl-ncsw-MAC-objs += memac.o memac_mii_acc.o
++endif
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/dtsec.c b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/dtsec.c
+new file mode 100644
+index 0000000..e4cb509
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/dtsec.c
+@@ -0,0 +1,1513 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File dtsec.c
++
++ @Description FM dTSEC ...
++*//***************************************************************************/
++
++#include "std_ext.h"
++#include "error_ext.h"
++#include "string_ext.h"
++#include "xx_ext.h"
++#include "endian_ext.h"
++#include "debug_ext.h"
++#include "crc_mac_addr_ext.h"
++
++#include "fm_common.h"
++#include "dtsec.h"
++#include "fsl_fman_dtsec.h"
++
++
++/*****************************************************************************/
++/* Internal routines */
++/*****************************************************************************/
++
++static t_Error CheckInitParameters(t_Dtsec *p_Dtsec)
++{
++ if (ENET_SPEED_FROM_MODE(p_Dtsec->enetMode) >= e_ENET_SPEED_10000)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Ethernet 1G MAC driver only supports 1G or lower speeds"));
++ if (p_Dtsec->macId >= FM_MAX_NUM_OF_1G_MACS)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("macId can not be greater than the number of 1G MACs"));
++ if (p_Dtsec->addr == 0)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Ethernet MAC Must have a valid MAC Address"));
++ if ((ENET_SPEED_FROM_MODE(p_Dtsec->enetMode) >= e_ENET_SPEED_1000) &&
++ p_Dtsec->p_DtsecDriverParam->halfdup_on)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Ethernet MAC 1G can't work in half duplex"));
++ if (p_Dtsec->p_DtsecDriverParam->halfdup_on && (p_Dtsec->p_DtsecDriverParam)->loopback)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("LoopBack is not supported in halfDuplex mode"));
++#ifdef FM_RX_PREAM_4_ERRATA_DTSEC_A001
++ if (p_Dtsec->fmMacControllerDriver.fmRevInfo.majorRev <= 6) /* fixed for rev3 */
++ if (p_Dtsec->p_DtsecDriverParam->rx_preamble)
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("preambleRxEn"));
++#endif /* FM_RX_PREAM_4_ERRATA_DTSEC_A001 */
++ if (((p_Dtsec->p_DtsecDriverParam)->tx_preamble || (p_Dtsec->p_DtsecDriverParam)->rx_preamble) &&( (p_Dtsec->p_DtsecDriverParam)->preamble_len != 0x7))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Preamble length should be 0x7 bytes"));
++ if ((p_Dtsec->p_DtsecDriverParam)->halfdup_on &&
++ (p_Dtsec->p_DtsecDriverParam->tx_time_stamp_en || p_Dtsec->p_DtsecDriverParam->rx_time_stamp_en))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dTSEC in half duplex mode has to be with 1588 timeStamping diable"));
++ if ((p_Dtsec->p_DtsecDriverParam)->rx_flow && (p_Dtsec->p_DtsecDriverParam)->rx_ctrl_acc )
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Receive control frame are not passed to the system memory so it can not be accept "));
++ if ((p_Dtsec->p_DtsecDriverParam)->rx_prepend > MAX_PACKET_ALIGNMENT)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("packetAlignmentPadding can't be greater than %d ",MAX_PACKET_ALIGNMENT ));
++ if (((p_Dtsec->p_DtsecDriverParam)->non_back_to_back_ipg1 > MAX_INTER_PACKET_GAP) ||
++ ((p_Dtsec->p_DtsecDriverParam)->non_back_to_back_ipg2 > MAX_INTER_PACKET_GAP) ||
++ ((p_Dtsec->p_DtsecDriverParam)->back_to_back_ipg > MAX_INTER_PACKET_GAP))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Inter packet gap can't be greater than %d ",MAX_INTER_PACKET_GAP ));
++ if ((p_Dtsec->p_DtsecDriverParam)->halfdup_alt_backoff_val > MAX_INTER_PALTERNATE_BEB)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("alternateBackoffVal can't be greater than %d ",MAX_INTER_PALTERNATE_BEB ));
++ if ((p_Dtsec->p_DtsecDriverParam)->halfdup_retransmit > MAX_RETRANSMISSION)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("maxRetransmission can't be greater than %d ",MAX_RETRANSMISSION ));
++ if ((p_Dtsec->p_DtsecDriverParam)->halfdup_coll_window > MAX_COLLISION_WINDOW)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("collisionWindow can't be greater than %d ",MAX_COLLISION_WINDOW ));
++
++ /* If Auto negotiation process is disabled, need to */
++ /* Set up the PHY using the MII Management Interface */
++ if (p_Dtsec->p_DtsecDriverParam->tbipa > MAX_PHYS)
++ RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, ("PHY address (should be 0-%d)", MAX_PHYS));
++ if (!p_Dtsec->f_Exception)
++ RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("uninitialized f_Exception"));
++ if (!p_Dtsec->f_Event)
++ RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("uninitialized f_Event"));
++
++#ifdef FM_LEN_CHECK_ERRATA_FMAN_SW002
++ if (p_Dtsec->p_DtsecDriverParam->rx_len_check)
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("LengthCheck!"));
++#endif /* FM_LEN_CHECK_ERRATA_FMAN_SW002 */
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static uint32_t GetMacAddrHashCode(uint64_t ethAddr)
++{
++ uint32_t crc;
++
++ /* CRC calculation */
++ GET_MAC_ADDR_CRC(ethAddr, crc);
++
++ crc = GetMirror32(crc);
++
++ return crc;
++}
++
++/* ......................................................................... */
++
++static void UpdateStatistics(t_Dtsec *p_Dtsec)
++{
++ uint32_t car1, car2;
++
++ dtsec_get_clear_carry_regs(p_Dtsec->p_MemMap, &car1, &car2);
++
++ if (car1)
++ {
++ if (car1 & CAR1_TR64)
++ p_Dtsec->internalStatistics.tr64 += VAL22BIT;
++ if (car1 & CAR1_TR127)
++ p_Dtsec->internalStatistics.tr127 += VAL22BIT;
++ if (car1 & CAR1_TR255)
++ p_Dtsec->internalStatistics.tr255 += VAL22BIT;
++ if (car1 & CAR1_TR511)
++ p_Dtsec->internalStatistics.tr511 += VAL22BIT;
++ if (car1 & CAR1_TRK1)
++ p_Dtsec->internalStatistics.tr1k += VAL22BIT;
++ if (car1 & CAR1_TRMAX)
++ p_Dtsec->internalStatistics.trmax += VAL22BIT;
++ if (car1 & CAR1_TRMGV)
++ p_Dtsec->internalStatistics.trmgv += VAL22BIT;
++ if (car1 & CAR1_RBYT)
++ p_Dtsec->internalStatistics.rbyt += (uint64_t)VAL32BIT;
++ if (car1 & CAR1_RPKT)
++ p_Dtsec->internalStatistics.rpkt += VAL22BIT;
++ if (car1 & CAR1_RMCA)
++ p_Dtsec->internalStatistics.rmca += VAL22BIT;
++ if (car1 & CAR1_RBCA)
++ p_Dtsec->internalStatistics.rbca += VAL22BIT;
++ if (car1 & CAR1_RXPF)
++ p_Dtsec->internalStatistics.rxpf += VAL16BIT;
++ if (car1 & CAR1_RALN)
++ p_Dtsec->internalStatistics.raln += VAL16BIT;
++ if (car1 & CAR1_RFLR)
++ p_Dtsec->internalStatistics.rflr += VAL16BIT;
++ if (car1 & CAR1_RCDE)
++ p_Dtsec->internalStatistics.rcde += VAL16BIT;
++ if (car1 & CAR1_RCSE)
++ p_Dtsec->internalStatistics.rcse += VAL16BIT;
++ if (car1 & CAR1_RUND)
++ p_Dtsec->internalStatistics.rund += VAL16BIT;
++ if (car1 & CAR1_ROVR)
++ p_Dtsec->internalStatistics.rovr += VAL16BIT;
++ if (car1 & CAR1_RFRG)
++ p_Dtsec->internalStatistics.rfrg += VAL16BIT;
++ if (car1 & CAR1_RJBR)
++ p_Dtsec->internalStatistics.rjbr += VAL16BIT;
++ if (car1 & CAR1_RDRP)
++ p_Dtsec->internalStatistics.rdrp += VAL16BIT;
++ }
++ if (car2)
++ {
++ if (car2 & CAR2_TFCS)
++ p_Dtsec->internalStatistics.tfcs += VAL12BIT;
++ if (car2 & CAR2_TBYT)
++ p_Dtsec->internalStatistics.tbyt += (uint64_t)VAL32BIT;
++ if (car2 & CAR2_TPKT)
++ p_Dtsec->internalStatistics.tpkt += VAL22BIT;
++ if (car2 & CAR2_TMCA)
++ p_Dtsec->internalStatistics.tmca += VAL22BIT;
++ if (car2 & CAR2_TBCA)
++ p_Dtsec->internalStatistics.tbca += VAL22BIT;
++ if (car2 & CAR2_TXPF)
++ p_Dtsec->internalStatistics.txpf += VAL16BIT;
++ if (car2 & CAR2_TDRP)
++ p_Dtsec->internalStatistics.tdrp += VAL16BIT;
++ }
++}
++
++/* .............................................................................. */
++
++static uint16_t DtsecGetMaxFrameLength(t_Handle h_Dtsec)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++
++ SANITY_CHECK_RETURN_VALUE(p_Dtsec, E_INVALID_HANDLE, 0);
++ SANITY_CHECK_RETURN_VALUE(!p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE, 0);
++
++ return dtsec_get_max_frame_len(p_Dtsec->p_MemMap);
++}
++
++/* .............................................................................. */
++
++static void DtsecIsr(t_Handle h_Dtsec)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++ uint32_t event;
++ struct dtsec_regs *p_DtsecMemMap = p_Dtsec->p_MemMap;
++
++ /* do not handle MDIO events */
++ event = dtsec_get_event(p_DtsecMemMap, (uint32_t)(~(DTSEC_IMASK_MMRDEN | DTSEC_IMASK_MMWREN)));
++
++ event &= dtsec_get_interrupt_mask(p_DtsecMemMap);
++
++ dtsec_ack_event(p_DtsecMemMap, event);
++
++ if (event & DTSEC_IMASK_BREN)
++ p_Dtsec->f_Exception(p_Dtsec->h_App, e_FM_MAC_EX_1G_BAB_RX);
++ if (event & DTSEC_IMASK_RXCEN)
++ p_Dtsec->f_Exception(p_Dtsec->h_App, e_FM_MAC_EX_1G_RX_CTL);
++ if (event & DTSEC_IMASK_MSROEN)
++ UpdateStatistics(p_Dtsec);
++ if (event & DTSEC_IMASK_GTSCEN)
++ p_Dtsec->f_Exception(p_Dtsec->h_App, e_FM_MAC_EX_1G_GRATEFUL_TX_STP_COMPLET);
++ if (event & DTSEC_IMASK_BTEN)
++ p_Dtsec->f_Exception(p_Dtsec->h_App, e_FM_MAC_EX_1G_BAB_TX);
++ if (event & DTSEC_IMASK_TXCEN)
++ p_Dtsec->f_Exception(p_Dtsec->h_App, e_FM_MAC_EX_1G_TX_CTL);
++ if (event & DTSEC_IMASK_TXEEN)
++ p_Dtsec->f_Exception(p_Dtsec->h_App, e_FM_MAC_EX_1G_TX_ERR);
++ if (event & DTSEC_IMASK_LCEN)
++ p_Dtsec->f_Exception(p_Dtsec->h_App, e_FM_MAC_EX_1G_LATE_COL);
++ if (event & DTSEC_IMASK_CRLEN)
++ p_Dtsec->f_Exception(p_Dtsec->h_App, e_FM_MAC_EX_1G_COL_RET_LMT);
++ if (event & DTSEC_IMASK_XFUNEN)
++ {
++#ifdef FM_TX_LOCKUP_ERRATA_DTSEC6
++ if (p_Dtsec->fmMacControllerDriver.fmRevInfo.majorRev == 2)
++ {
++ uint32_t tpkt1, tmpReg1, tpkt2, tmpReg2, i;
++ /* a. Write 0x00E0_0C00 to DTSEC_ID */
++ /* This is a read only regidter */
++
++ /* b. Read and save the value of TPKT */
++ tpkt1 = GET_UINT32(p_DtsecMemMap->tpkt);
++
++ /* c. Read the register at dTSEC address offset 0x32C */
++ tmpReg1 = GET_UINT32(*(uint32_t*)((uint8_t*)p_DtsecMemMap + 0x32c));
++
++ /* d. Compare bits [9:15] to bits [25:31] of the register at address offset 0x32C. */
++ if ((tmpReg1 & 0x007F0000) != (tmpReg1 & 0x0000007F))
++ {
++ /* If they are not equal, save the value of this register and wait for at least
++ * MAXFRM*16 ns */
++ XX_UDelay((uint32_t)(MIN(DtsecGetMaxFrameLength(p_Dtsec)*16/1000, 1)));
++ }
++
++ /* e. Read and save TPKT again and read the register at dTSEC address offset
++ 0x32C again*/
++ tpkt2 = GET_UINT32(p_DtsecMemMap->tpkt);
++ tmpReg2 = GET_UINT32(*(uint32_t*)((uint8_t*)p_DtsecMemMap + 0x32c));
++
++ /* f. Compare the value of TPKT saved in step b to value read in step e. Also
++ compare bits [9:15] of the register at offset 0x32C saved in step d to the value
++ of bits [9:15] saved in step e. If the two registers values are unchanged, then
++ the transmit portion of the dTSEC controller is locked up and the user should
++ proceed to the recover sequence. */
++ if ((tpkt1 == tpkt2) && ((tmpReg1 & 0x007F0000) == (tmpReg2 & 0x007F0000)))
++ {
++ /* recover sequence */
++
++ /* a.Write a 1 to RCTRL[GRS]*/
++
++ WRITE_UINT32(p_DtsecMemMap->rctrl, GET_UINT32(p_DtsecMemMap->rctrl) | RCTRL_GRS);
++
++ /* b.Wait until IEVENT[GRSC]=1, or at least 100 us has elapsed. */
++ for (i = 0 ; i < 100 ; i++ )
++ {
++ if (GET_UINT32(p_DtsecMemMap->ievent) & DTSEC_IMASK_GRSCEN)
++ break;
++ XX_UDelay(1);
++ }
++ if (GET_UINT32(p_DtsecMemMap->ievent) & DTSEC_IMASK_GRSCEN)
++ WRITE_UINT32(p_DtsecMemMap->ievent, DTSEC_IMASK_GRSCEN);
++ else
++ DBG(INFO,("Rx lockup due to dTSEC Tx lockup"));
++
++ /* c.Write a 1 to bit n of FM_RSTC (offset 0x0CC of FPM)*/
++ FmResetMac(p_Dtsec->fmMacControllerDriver.h_Fm, e_FM_MAC_1G, p_Dtsec->fmMacControllerDriver.macId);
++
++ /* d.Wait 4 Tx clocks (32 ns) */
++ XX_UDelay(1);
++
++ /* e.Write a 0 to bit n of FM_RSTC. */
++ /* cleared by FMAN */
++ }
++ }
++#endif /* FM_TX_LOCKUP_ERRATA_DTSEC6 */
++
++ p_Dtsec->f_Exception(p_Dtsec->h_App, e_FM_MAC_EX_1G_TX_FIFO_UNDRN);
++ }
++ if (event & DTSEC_IMASK_MAGEN)
++ p_Dtsec->f_Exception(p_Dtsec->h_App, e_FM_MAC_EX_1G_MAG_PCKT);
++ if (event & DTSEC_IMASK_GRSCEN)
++ p_Dtsec->f_Exception(p_Dtsec->h_App, e_FM_MAC_EX_1G_GRATEFUL_RX_STP_COMPLET);
++ if (event & DTSEC_IMASK_TDPEEN)
++ p_Dtsec->f_Exception(p_Dtsec->h_App, e_FM_MAC_EX_1G_TX_DATA_ERR);
++ if (event & DTSEC_IMASK_RDPEEN)
++ p_Dtsec->f_Exception(p_Dtsec->h_App, e_FM_MAC_EX_1G_RX_DATA_ERR);
++
++ /* - masked interrupts */
++ ASSERT_COND(!(event & DTSEC_IMASK_ABRTEN));
++ ASSERT_COND(!(event & DTSEC_IMASK_IFERREN));
++}
++
++static void DtsecMdioIsr(t_Handle h_Dtsec)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++ uint32_t event;
++ struct dtsec_regs *p_DtsecMemMap = p_Dtsec->p_MemMap;
++
++ event = GET_UINT32(p_DtsecMemMap->ievent);
++ /* handle only MDIO events */
++ event &= (DTSEC_IMASK_MMRDEN | DTSEC_IMASK_MMWREN);
++ if (event)
++ {
++ event &= GET_UINT32(p_DtsecMemMap->imask);
++
++ WRITE_UINT32(p_DtsecMemMap->ievent, event);
++
++ if (event & DTSEC_IMASK_MMRDEN)
++ p_Dtsec->f_Event(p_Dtsec->h_App, e_FM_MAC_EX_1G_MII_MNG_RD_COMPLET);
++ if (event & DTSEC_IMASK_MMWREN)
++ p_Dtsec->f_Event(p_Dtsec->h_App, e_FM_MAC_EX_1G_MII_MNG_WR_COMPLET);
++ }
++}
++
++static void Dtsec1588Isr(t_Handle h_Dtsec)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++ uint32_t event;
++ struct dtsec_regs *p_DtsecMemMap = p_Dtsec->p_MemMap;
++
++ if (p_Dtsec->ptpTsuEnabled)
++ {
++ event = dtsec_check_and_clear_tmr_event(p_DtsecMemMap);
++
++ if (event)
++ {
++ ASSERT_COND(event & TMR_PEVENT_TSRE);
++ p_Dtsec->f_Exception(p_Dtsec->h_App, e_FM_MAC_EX_1G_1588_TS_RX_ERR);
++ }
++ }
++}
++
++/* ........................................................................... */
++
++static void FreeInitResources(t_Dtsec *p_Dtsec)
++{
++ /*TODO - need to ask why with mdioIrq != 0*/
++ if ((p_Dtsec->mdioIrq != 0) && (p_Dtsec->mdioIrq != NO_IRQ))
++ {
++ XX_DisableIntr(p_Dtsec->mdioIrq);
++ XX_FreeIntr(p_Dtsec->mdioIrq);
++ }
++ FmUnregisterIntr(p_Dtsec->fmMacControllerDriver.h_Fm, e_FM_MOD_1G_MAC, p_Dtsec->macId, e_FM_INTR_TYPE_ERR);
++ FmUnregisterIntr(p_Dtsec->fmMacControllerDriver.h_Fm, e_FM_MOD_1G_MAC, p_Dtsec->macId, e_FM_INTR_TYPE_NORMAL);
++
++ /* release the driver's group hash table */
++ FreeHashTable(p_Dtsec->p_MulticastAddrHash);
++ p_Dtsec->p_MulticastAddrHash = NULL;
++
++ /* release the driver's individual hash table */
++ FreeHashTable(p_Dtsec->p_UnicastAddrHash);
++ p_Dtsec->p_UnicastAddrHash = NULL;
++}
++
++/* ........................................................................... */
++
++static t_Error GracefulStop(t_Dtsec *p_Dtsec, e_CommMode mode)
++{
++ struct dtsec_regs *p_MemMap;
++
++ ASSERT_COND(p_Dtsec);
++
++ p_MemMap = p_Dtsec->p_MemMap;
++ ASSERT_COND(p_MemMap);
++
++ /* Assert the graceful transmit stop bit */
++ if (mode & e_COMM_MODE_RX)
++ {
++ dtsec_stop_rx(p_MemMap);
++
++#ifdef FM_GRS_ERRATA_DTSEC_A002
++ if (p_Dtsec->fmMacControllerDriver.fmRevInfo.majorRev == 2)
++ XX_UDelay(100);
++#else /* FM_GRS_ERRATA_DTSEC_A002 */
++#ifdef FM_GTS_AFTER_DROPPED_FRAME_ERRATA_DTSEC_A004839
++ XX_UDelay(10);
++#endif /* FM_GTS_AFTER_DROPPED_FRAME_ERRATA_DTSEC_A004839 */
++#endif /* FM_GRS_ERRATA_DTSEC_A002 */
++ }
++
++ if (mode & e_COMM_MODE_TX)
++#if defined(FM_GTS_ERRATA_DTSEC_A004) || defined(FM_GTS_AFTER_MAC_ABORTED_FRAME_ERRATA_DTSEC_A0012)
++ if (p_Dtsec->fmMacControllerDriver.fmRevInfo.majorRev == 2)
++ DBG(INFO, ("GTS not supported due to DTSEC_A004 errata."));
++#else /* not defined(FM_GTS_ERRATA_DTSEC_A004) ||... */
++#ifdef FM_GTS_UNDERRUN_ERRATA_DTSEC_A0014
++ DBG(INFO, ("GTS not supported due to DTSEC_A0014 errata."));
++#else /* FM_GTS_UNDERRUN_ERRATA_DTSEC_A0014 */
++ dtsec_stop_tx(p_MemMap);
++#endif /* FM_GTS_UNDERRUN_ERRATA_DTSEC_A0014 */
++#endif /* defined(FM_GTS_ERRATA_DTSEC_A004) ||... */
++
++ return E_OK;
++}
++
++/* .............................................................................. */
++
++static t_Error GracefulRestart(t_Dtsec *p_Dtsec, e_CommMode mode)
++{
++ struct dtsec_regs *p_MemMap;
++
++ ASSERT_COND(p_Dtsec);
++ p_MemMap = p_Dtsec->p_MemMap;
++ ASSERT_COND(p_MemMap);
++
++ /* clear the graceful receive stop bit */
++ if (mode & e_COMM_MODE_TX)
++ dtsec_start_tx(p_MemMap);
++
++ if (mode & e_COMM_MODE_RX)
++ dtsec_start_rx(p_MemMap);
++
++ return E_OK;
++}
++
++
++/*****************************************************************************/
++/* dTSEC Configs modification functions */
++/*****************************************************************************/
++
++
++/* .............................................................................. */
++
++static t_Error DtsecConfigLoopback(t_Handle h_Dtsec, bool newVal)
++{
++
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ p_Dtsec->p_DtsecDriverParam->loopback = newVal;
++
++ return E_OK;
++}
++
++/* .............................................................................. */
++
++static t_Error DtsecConfigMaxFrameLength(t_Handle h_Dtsec, uint16_t newVal)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ p_Dtsec->p_DtsecDriverParam->maximum_frame = newVal;
++
++ return E_OK;
++}
++
++/* .............................................................................. */
++
++static t_Error DtsecConfigPadAndCrc(t_Handle h_Dtsec, bool newVal)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ p_Dtsec->p_DtsecDriverParam->tx_pad_crc = newVal;
++
++ return E_OK;
++}
++
++/* .............................................................................. */
++
++static t_Error DtsecConfigHalfDuplex(t_Handle h_Dtsec, bool newVal)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ p_Dtsec->p_DtsecDriverParam->halfdup_on = newVal;
++
++ return E_OK;
++}
++
++/* .............................................................................. */
++
++static t_Error DtsecConfigTbiPhyAddr(t_Handle h_Dtsec, uint8_t newVal)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ p_Dtsec->p_DtsecDriverParam->tbi_phy_addr = newVal;
++
++ return E_OK;
++}
++
++/* .............................................................................. */
++
++static t_Error DtsecConfigLengthCheck(t_Handle h_Dtsec, bool newVal)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ p_Dtsec->p_DtsecDriverParam->rx_len_check = newVal;
++
++ return E_OK;
++}
++
++static t_Error DtsecConfigException(t_Handle h_Dtsec, e_FmMacExceptions exception, bool enable)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++ uint32_t bitMask = 0;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ if (exception != e_FM_MAC_EX_1G_1588_TS_RX_ERR)
++ {
++ GET_EXCEPTION_FLAG(bitMask, exception);
++ if (bitMask)
++ {
++ if (enable)
++ p_Dtsec->exceptions |= bitMask;
++ else
++ p_Dtsec->exceptions &= ~bitMask;
++ }
++ else
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
++ }
++ else
++ {
++ if (!p_Dtsec->ptpTsuEnabled)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Exception valid for 1588 only"));
++ switch (exception){
++ case (e_FM_MAC_EX_1G_1588_TS_RX_ERR):
++ if (enable)
++ p_Dtsec->enTsuErrExeption = TRUE;
++ else
++ p_Dtsec->enTsuErrExeption = FALSE;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
++ }
++ }
++ return E_OK;
++}
++/*****************************************************************************/
++/* dTSEC Run Time API functions */
++/*****************************************************************************/
++
++/* .............................................................................. */
++
++static t_Error DtsecEnable(t_Handle h_Dtsec, e_CommMode mode)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ dtsec_enable(p_Dtsec->p_MemMap,
++ (bool)!!(mode & e_COMM_MODE_RX),
++ (bool)!!(mode & e_COMM_MODE_TX));
++
++ GracefulRestart(p_Dtsec, mode);
++
++ return E_OK;
++}
++
++/* .............................................................................. */
++
++static t_Error DtsecDisable (t_Handle h_Dtsec, e_CommMode mode)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ GracefulStop(p_Dtsec, mode);
++
++ dtsec_disable(p_Dtsec->p_MemMap,
++ (bool)!!(mode & e_COMM_MODE_RX),
++ (bool)!!(mode & e_COMM_MODE_TX));
++
++ return E_OK;
++}
++
++/* .............................................................................. */
++
++static t_Error DtsecSetTxPauseFrames(t_Handle h_Dtsec,
++ uint8_t priority,
++ uint16_t pauseTime,
++ uint16_t threshTime)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++
++ UNUSED(priority);UNUSED(threshTime);
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(!p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++#ifdef FM_BAD_TX_TS_IN_B_2_B_ERRATA_DTSEC_A003
++ if (p_Dtsec->fmMacControllerDriver.fmRevInfo.majorRev == 2)
++ if (pauseTime <= 320)
++ RETURN_ERROR(MINOR, E_INVALID_VALUE,
++ ("This pause-time value of %d is illegal due to errata dTSEC-A003!"
++ " value should be greater than 320."));
++#endif /* FM_BAD_TX_TS_IN_B_2_B_ERRATA_DTSEC_A003 */
++
++ dtsec_set_tx_pause_time(p_Dtsec->p_MemMap, pauseTime);
++ return E_OK;
++}
++
++/* .............................................................................. */
++/* backward compatibility. will be removed in the future. */
++static t_Error DtsecTxMacPause(t_Handle h_Dtsec, uint16_t pauseTime)
++{
++ return DtsecSetTxPauseFrames(h_Dtsec, 0, pauseTime, 0);
++}
++
++/* .............................................................................. */
++
++static t_Error DtsecRxIgnoreMacPause(t_Handle h_Dtsec, bool en)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++ bool accept_pause = !en;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(!p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ dtsec_handle_rx_pause(p_Dtsec->p_MemMap, accept_pause);
++
++ return E_OK;
++}
++
++/* .............................................................................. */
++
++static t_Error DtsecEnable1588TimeStamp(t_Handle h_Dtsec)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ p_Dtsec->ptpTsuEnabled = TRUE;
++ dtsec_set_ts(p_Dtsec->p_MemMap, TRUE);
++
++ return E_OK;
++}
++
++/* .............................................................................. */
++
++static t_Error DtsecDisable1588TimeStamp(t_Handle h_Dtsec)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ p_Dtsec->ptpTsuEnabled = FALSE;
++ dtsec_set_ts(p_Dtsec->p_MemMap, FALSE);
++
++ return E_OK;
++}
++
++/* .............................................................................. */
++
++static t_Error DtsecGetStatistics(t_Handle h_Dtsec, t_FmMacStatistics *p_Statistics)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++ struct dtsec_regs *p_DtsecMemMap;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(p_Statistics, E_NULL_POINTER);
++
++ p_DtsecMemMap = p_Dtsec->p_MemMap;
++
++ if (p_Dtsec->statisticsLevel == e_FM_MAC_NONE_STATISTICS)
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Statistics disabled"));
++
++ memset(p_Statistics, 0xff, sizeof(t_FmMacStatistics));
++
++ if (p_Dtsec->statisticsLevel == e_FM_MAC_FULL_STATISTICS)
++ {
++ p_Statistics->eStatPkts64 = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_TR64)
++ + p_Dtsec->internalStatistics.tr64;
++ p_Statistics->eStatPkts65to127 = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_TR127)
++ + p_Dtsec->internalStatistics.tr127;
++ p_Statistics->eStatPkts128to255 = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_TR255)
++ + p_Dtsec->internalStatistics.tr255;
++ p_Statistics->eStatPkts256to511 = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_TR511)
++ + p_Dtsec->internalStatistics.tr511;
++ p_Statistics->eStatPkts512to1023 = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_TR1K)
++ + p_Dtsec->internalStatistics.tr1k;
++ p_Statistics->eStatPkts1024to1518 = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_TRMAX)
++ + p_Dtsec->internalStatistics.trmax;
++ p_Statistics->eStatPkts1519to1522 = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_TRMGV)
++ + p_Dtsec->internalStatistics.trmgv;
++
++ /* MIB II */
++ p_Statistics->ifInOctets = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_RBYT)
++ + p_Dtsec->internalStatistics.rbyt;
++ p_Statistics->ifInPkts = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_RPKT)
++ + p_Dtsec->internalStatistics.rpkt;
++ p_Statistics->ifInUcastPkts = 0;
++ p_Statistics->ifInMcastPkts = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_RMCA)
++ + p_Dtsec->internalStatistics.rmca;
++ p_Statistics->ifInBcastPkts = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_RBCA)
++ + p_Dtsec->internalStatistics.rbca;
++ p_Statistics->ifOutOctets = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_TBYT)
++ + p_Dtsec->internalStatistics.tbyt;
++ p_Statistics->ifOutPkts = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_TPKT)
++ + p_Dtsec->internalStatistics.tpkt;
++ p_Statistics->ifOutUcastPkts = 0;
++ p_Statistics->ifOutMcastPkts = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_TMCA)
++ + p_Dtsec->internalStatistics.tmca;
++ p_Statistics->ifOutBcastPkts = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_TBCA)
++ + p_Dtsec->internalStatistics.tbca;
++ }
++
++ p_Statistics->eStatFragments = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_RFRG)
++ + p_Dtsec->internalStatistics.rfrg;
++ p_Statistics->eStatJabbers = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_RJBR)
++ + p_Dtsec->internalStatistics.rjbr;
++ p_Statistics->eStatsDropEvents = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_RDRP)
++ + p_Dtsec->internalStatistics.rdrp;
++ p_Statistics->eStatCRCAlignErrors = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_RALN)
++ + p_Dtsec->internalStatistics.raln;
++ p_Statistics->eStatUndersizePkts = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_RUND)
++ + p_Dtsec->internalStatistics.rund;
++ p_Statistics->eStatOversizePkts = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_ROVR)
++ + p_Dtsec->internalStatistics.rovr;
++ p_Statistics->reStatPause = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_RXPF)
++ + p_Dtsec->internalStatistics.rxpf;
++ p_Statistics->teStatPause = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_TXPF)
++ + p_Dtsec->internalStatistics.txpf;
++ p_Statistics->ifInDiscards = p_Statistics->eStatsDropEvents;
++ p_Statistics->ifInErrors = p_Statistics->eStatsDropEvents + p_Statistics->eStatCRCAlignErrors
++ + dtsec_get_stat_counter(p_DtsecMemMap,E_DTSEC_STAT_RFLR) + p_Dtsec->internalStatistics.rflr
++ + dtsec_get_stat_counter(p_DtsecMemMap,E_DTSEC_STAT_RCDE) + p_Dtsec->internalStatistics.rcde
++ + dtsec_get_stat_counter(p_DtsecMemMap,E_DTSEC_STAT_RCSE) + p_Dtsec->internalStatistics.rcse;
++
++ p_Statistics->ifOutDiscards = dtsec_get_stat_counter(p_DtsecMemMap, E_DTSEC_STAT_TDRP)
++ + p_Dtsec->internalStatistics.tdrp;
++ p_Statistics->ifOutErrors = p_Statistics->ifOutDiscards /**< Number of frames transmitted with error: */
++ + dtsec_get_stat_counter(p_DtsecMemMap,E_DTSEC_STAT_TFCS)
++ + p_Dtsec->internalStatistics.tfcs;
++
++ return E_OK;
++}
++
++/* .............................................................................. */
++
++static t_Error DtsecModifyMacAddress (t_Handle h_Dtsec, t_EnetAddr *p_EnetAddr)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ /* Initialize MAC Station Address registers (1 & 2) */
++ /* Station address have to be swapped (big endian to little endian */
++ p_Dtsec->addr = ENET_ADDR_TO_UINT64(*p_EnetAddr);
++ dtsec_set_mac_address(p_Dtsec->p_MemMap, (uint8_t *)(*p_EnetAddr));
++
++ return E_OK;
++}
++
++/* .............................................................................. */
++
++static t_Error DtsecResetCounters (t_Handle h_Dtsec)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ /* clear HW counters */
++ dtsec_reset_stat(p_Dtsec->p_MemMap);
++
++ /* clear SW counters holding carries */
++ memset(&p_Dtsec->internalStatistics, 0, sizeof(t_InternalStatistics));
++
++ return E_OK;
++}
++
++/* .............................................................................. */
++
++static t_Error DtsecAddExactMatchMacAddress(t_Handle h_Dtsec, t_EnetAddr *p_EthAddr)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *) h_Dtsec;
++ uint64_t ethAddr;
++ uint8_t paddrNum;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ ethAddr = ENET_ADDR_TO_UINT64(*p_EthAddr);
++
++ if (ethAddr & GROUP_ADDRESS)
++ /* Multicast address has no effect in PADDR */
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Multicast address"));
++
++ /* Make sure no PADDR contains this address */
++ for (paddrNum = 0; paddrNum < DTSEC_NUM_OF_PADDRS; paddrNum++)
++ if (p_Dtsec->indAddrRegUsed[paddrNum])
++ if (p_Dtsec->paddr[paddrNum] == ethAddr)
++ RETURN_ERROR(MAJOR, E_ALREADY_EXISTS, NO_MSG);
++
++ /* Find first unused PADDR */
++ for (paddrNum = 0; paddrNum < DTSEC_NUM_OF_PADDRS; paddrNum++)
++ if (!(p_Dtsec->indAddrRegUsed[paddrNum]))
++ {
++ /* mark this PADDR as used */
++ p_Dtsec->indAddrRegUsed[paddrNum] = TRUE;
++ /* store address */
++ p_Dtsec->paddr[paddrNum] = ethAddr;
++
++ /* put in hardware */
++ dtsec_add_addr_in_paddr(p_Dtsec->p_MemMap, (uint64_t)PTR_TO_UINT(ðAddr), paddrNum);
++ p_Dtsec->numOfIndAddrInRegs++;
++
++ return E_OK;
++ }
++
++ /* No free PADDR */
++ RETURN_ERROR(MAJOR, E_FULL, NO_MSG);
++}
++
++/* .............................................................................. */
++
++static t_Error DtsecDelExactMatchMacAddress(t_Handle h_Dtsec, t_EnetAddr *p_EthAddr)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *) h_Dtsec;
++ uint64_t ethAddr;
++ uint8_t paddrNum;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ ethAddr = ENET_ADDR_TO_UINT64(*p_EthAddr);
++
++ /* Find used PADDR containing this address */
++ for (paddrNum = 0; paddrNum < DTSEC_NUM_OF_PADDRS; paddrNum++)
++ {
++ if ((p_Dtsec->indAddrRegUsed[paddrNum]) &&
++ (p_Dtsec->paddr[paddrNum] == ethAddr))
++ {
++ /* mark this PADDR as not used */
++ p_Dtsec->indAddrRegUsed[paddrNum] = FALSE;
++ /* clear in hardware */
++ dtsec_clear_addr_in_paddr(p_Dtsec->p_MemMap, paddrNum);
++ p_Dtsec->numOfIndAddrInRegs--;
++
++ return E_OK;
++ }
++ }
++
++ RETURN_ERROR(MAJOR, E_NOT_FOUND, NO_MSG);
++}
++
++/* .............................................................................. */
++
++static t_Error DtsecAddHashMacAddress(t_Handle h_Dtsec, t_EnetAddr *p_EthAddr)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++ t_EthHashEntry *p_HashEntry;
++ uint64_t ethAddr;
++ int32_t bucket;
++ uint32_t crc;
++ bool mcast, ghtx;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ ethAddr = ENET_ADDR_TO_UINT64(*p_EthAddr);
++
++ ghtx = (bool)((dtsec_get_rctrl(p_Dtsec->p_MemMap) & RCTRL_GHTX) ? TRUE : FALSE);
++ mcast = (bool)((ethAddr & MAC_GROUP_ADDRESS) ? TRUE : FALSE);
++
++ if (ghtx && !mcast) /* Cannot handle unicast mac addr when GHTX is on */
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Could not compute hash bucket"));
++
++ crc = GetMacAddrHashCode(ethAddr);
++
++ /* considering the 9 highest order bits in crc H[8:0]:
++ * if ghtx = 0 H[8:6] (highest order 3 bits) identify the hash register
++ * and H[5:1] (next 5 bits) identify the hash bit
++ * if ghts = 1 H[8:5] (highest order 4 bits) identify the hash register
++ * and H[4:0] (next 5 bits) identify the hash bit.
++ *
++ * In bucket index output the low 5 bits identify the hash register bit,
++ * while the higher 4 bits identify the hash register
++ */
++
++ if (ghtx)
++ bucket = (int32_t)((crc >> 23) & 0x1ff);
++ else {
++ bucket = (int32_t)((crc >> 24) & 0xff);
++ /* if !ghtx and mcast the bit must be set in gaddr instead of igaddr. */
++ if (mcast)
++ bucket += 0x100;
++ }
++
++ dtsec_set_bucket(p_Dtsec->p_MemMap, bucket, TRUE);
++
++ /* Create element to be added to the driver hash table */
++ p_HashEntry = (t_EthHashEntry *)XX_Malloc(sizeof(t_EthHashEntry));
++ p_HashEntry->addr = ethAddr;
++ INIT_LIST(&p_HashEntry->node);
++
++ if (ethAddr & MAC_GROUP_ADDRESS)
++ /* Group Address */
++ LIST_AddToTail(&(p_HashEntry->node), &(p_Dtsec->p_MulticastAddrHash->p_Lsts[bucket]));
++ else
++ LIST_AddToTail(&(p_HashEntry->node), &(p_Dtsec->p_UnicastAddrHash->p_Lsts[bucket]));
++
++ return E_OK;
++}
++
++/* .............................................................................. */
++
++static t_Error DtsecDelHashMacAddress(t_Handle h_Dtsec, t_EnetAddr *p_EthAddr)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++ t_List *p_Pos;
++ t_EthHashEntry *p_HashEntry = NULL;
++ uint64_t ethAddr;
++ int32_t bucket;
++ uint32_t crc;
++ bool mcast, ghtx;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ ethAddr = ENET_ADDR_TO_UINT64(*p_EthAddr);
++
++ ghtx = (bool)((dtsec_get_rctrl(p_Dtsec->p_MemMap) & RCTRL_GHTX) ? TRUE : FALSE);
++ mcast = (bool)((ethAddr & MAC_GROUP_ADDRESS) ? TRUE : FALSE);
++
++ if (ghtx && !mcast) /* Cannot handle unicast mac addr when GHTX is on */
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Could not compute hash bucket"));
++
++ crc = GetMacAddrHashCode(ethAddr);
++
++ if (ghtx)
++ bucket = (int32_t)((crc >> 23) & 0x1ff);
++ else {
++ bucket = (int32_t)((crc >> 24) & 0xff);
++ /* if !ghtx and mcast the bit must be set in gaddr instead of igaddr. */
++ if (mcast)
++ bucket += 0x100;
++ }
++
++ if (ethAddr & MAC_GROUP_ADDRESS)
++ {
++ /* Group Address */
++ LIST_FOR_EACH(p_Pos, &(p_Dtsec->p_MulticastAddrHash->p_Lsts[bucket]))
++ {
++ p_HashEntry = ETH_HASH_ENTRY_OBJ(p_Pos);
++ if (p_HashEntry->addr == ethAddr)
++ {
++ LIST_DelAndInit(&p_HashEntry->node);
++ XX_Free(p_HashEntry);
++ break;
++ }
++ }
++ if (LIST_IsEmpty(&p_Dtsec->p_MulticastAddrHash->p_Lsts[bucket]))
++ dtsec_set_bucket(p_Dtsec->p_MemMap, bucket, FALSE);
++ }
++ else
++ {
++ /* Individual Address */
++ LIST_FOR_EACH(p_Pos, &(p_Dtsec->p_UnicastAddrHash->p_Lsts[bucket]))
++ {
++ p_HashEntry = ETH_HASH_ENTRY_OBJ(p_Pos);
++ if (p_HashEntry->addr == ethAddr)
++ {
++ LIST_DelAndInit(&p_HashEntry->node);
++ XX_Free(p_HashEntry);
++ break;
++ }
++ }
++ if (LIST_IsEmpty(&p_Dtsec->p_UnicastAddrHash->p_Lsts[bucket]))
++ dtsec_set_bucket(p_Dtsec->p_MemMap, bucket, FALSE);
++ }
++
++ /* address does not exist */
++ ASSERT_COND(p_HashEntry != NULL);
++
++ return E_OK;
++}
++
++void DtsecRestartTbiAN(t_Handle h_Dtsec)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++
++ if (!p_Dtsec)
++ return;
++
++ DTSEC_MII_WritePhyReg(p_Dtsec, p_Dtsec->tbi_phy_addr, 0,
++ PHY_CR_ANE | PHY_CR_RESET_AN | PHY_CR_FULLDUPLEX | PHY_CR_SPEED1);
++}
++
++/* .............................................................................. */
++
++static t_Error DtsecSetPromiscuous(t_Handle h_Dtsec, bool newVal)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ dtsec_set_uc_promisc(p_Dtsec->p_MemMap, newVal);
++ dtsec_set_mc_promisc(p_Dtsec->p_MemMap, newVal);
++
++ return E_OK;
++}
++
++/* .............................................................................. */
++
++static t_Error DtsecSetStatistics(t_Handle h_Dtsec, e_FmMacStatisticsLevel statisticsLevel)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ p_Dtsec->statisticsLevel = statisticsLevel;
++
++ err = (t_Error)dtsec_set_stat_level(p_Dtsec->p_MemMap,
++ (enum mac_stat_level)statisticsLevel);
++ if (err != E_OK)
++ return err;
++
++ switch (statisticsLevel)
++ {
++ case (e_FM_MAC_NONE_STATISTICS):
++ p_Dtsec->exceptions &= ~DTSEC_IMASK_MSROEN;
++ break;
++ case (e_FM_MAC_PARTIAL_STATISTICS):
++ p_Dtsec->exceptions |= DTSEC_IMASK_MSROEN;
++ break;
++ case (e_FM_MAC_FULL_STATISTICS):
++ p_Dtsec->exceptions |= DTSEC_IMASK_MSROEN;
++ break;
++ default:
++ RETURN_ERROR(MINOR, E_INVALID_SELECTION, NO_MSG);
++ }
++
++ return E_OK;
++}
++
++/* .............................................................................. */
++
++static t_Error DtsecAdjustLink(t_Handle h_Dtsec, e_EnetSpeed speed, bool fullDuplex)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++ t_Error err;
++ enum enet_interface enet_interface;
++ enum enet_speed enet_speed;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ p_Dtsec->enetMode = MAKE_ENET_MODE(ENET_INTERFACE_FROM_MODE(p_Dtsec->enetMode), speed);
++ enet_interface = (enum enet_interface) ENET_INTERFACE_FROM_MODE(p_Dtsec->enetMode);
++ enet_speed = (enum enet_speed) ENET_SPEED_FROM_MODE(p_Dtsec->enetMode);
++ p_Dtsec->halfDuplex = !fullDuplex;
++
++ err = (t_Error)dtsec_adjust_link(p_Dtsec->p_MemMap, enet_interface, enet_speed, fullDuplex);
++
++ if (err == E_CONFLICT)
++ RETURN_ERROR(MAJOR, E_CONFLICT, ("Ethernet interface does not support Half Duplex mode"));
++
++ return err;
++}
++
++/* .............................................................................. */
++
++static t_Error DtsecRestartAutoneg(t_Handle h_Dtsec)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++ uint16_t tmpReg16;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ DTSEC_MII_ReadPhyReg(p_Dtsec, p_Dtsec->tbi_phy_addr, 0, &tmpReg16);
++ tmpReg16 |= (PHY_CR_RESET_AN);
++ DTSEC_MII_WritePhyReg(p_Dtsec, p_Dtsec->tbi_phy_addr, 0, tmpReg16);
++
++ return E_OK;
++}
++
++/*************************************************************************************/
++/* .............................................................................. */
++
++static t_Error DtsecGetId(t_Handle h_Dtsec, uint32_t *macId)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ *macId = p_Dtsec->macId;
++
++ return E_OK;
++}
++
++/* .............................................................................. */
++
++static t_Error DtsecGetVersion(t_Handle h_Dtsec, uint32_t *macVersion)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ *macVersion = dtsec_get_revision(p_Dtsec->p_MemMap);
++
++ return E_OK;
++}
++
++/* .............................................................................. */
++
++static t_Error DtsecSetException(t_Handle h_Dtsec, e_FmMacExceptions exception, bool enable)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++ uint32_t bitMask = 0;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++
++ if (exception != e_FM_MAC_EX_1G_1588_TS_RX_ERR)
++ {
++ GET_EXCEPTION_FLAG(bitMask, exception);
++ if (bitMask)
++ {
++ if (enable)
++ p_Dtsec->exceptions |= bitMask;
++ else
++ p_Dtsec->exceptions &= ~bitMask;
++ }
++ else
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
++
++ if (enable)
++ dtsec_enable_interrupt(p_Dtsec->p_MemMap, bitMask);
++ else
++ dtsec_disable_interrupt(p_Dtsec->p_MemMap, bitMask);
++ }
++ else
++ {
++ if (!p_Dtsec->ptpTsuEnabled)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Exception valid for 1588 only"));
++ switch (exception)
++ {
++ case (e_FM_MAC_EX_1G_1588_TS_RX_ERR):
++ if (enable)
++ {
++ p_Dtsec->enTsuErrExeption = TRUE;
++ dtsec_enable_tmr_interrupt(p_Dtsec->p_MemMap);
++ } else {
++ p_Dtsec->enTsuErrExeption = FALSE;
++ dtsec_disable_tmr_interrupt(p_Dtsec->p_MemMap);
++ }
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
++ }
++ }
++
++ return E_OK;
++}
++
++
++
++/* ........................................................................... */
++
++#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
++static t_Error DtsecDumpRegs(t_Handle h_Dtsec)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++ int i = 0;
++
++ DECLARE_DUMP;
++
++ if (p_Dtsec->p_MemMap)
++ {
++
++ DUMP_TITLE(p_Dtsec->p_MemMap, ("dTSEC %d: ", p_Dtsec->macId));
++ DUMP_VAR(p_Dtsec->p_MemMap, tsec_id);
++ DUMP_VAR(p_Dtsec->p_MemMap, tsec_id2);
++ DUMP_VAR(p_Dtsec->p_MemMap, ievent);
++ DUMP_VAR(p_Dtsec->p_MemMap, imask);
++ DUMP_VAR(p_Dtsec->p_MemMap, ecntrl);
++ DUMP_VAR(p_Dtsec->p_MemMap, ptv);
++ DUMP_VAR(p_Dtsec->p_MemMap, tmr_ctrl);
++ DUMP_VAR(p_Dtsec->p_MemMap, tmr_pevent);
++ DUMP_VAR(p_Dtsec->p_MemMap, tmr_pemask);
++ DUMP_VAR(p_Dtsec->p_MemMap, tctrl);
++ DUMP_VAR(p_Dtsec->p_MemMap, rctrl);
++ DUMP_VAR(p_Dtsec->p_MemMap, maccfg1);
++ DUMP_VAR(p_Dtsec->p_MemMap, maccfg2);
++ DUMP_VAR(p_Dtsec->p_MemMap, ipgifg);
++ DUMP_VAR(p_Dtsec->p_MemMap, hafdup);
++ DUMP_VAR(p_Dtsec->p_MemMap, maxfrm);
++
++ DUMP_VAR(p_Dtsec->p_MemMap, macstnaddr1);
++ DUMP_VAR(p_Dtsec->p_MemMap, macstnaddr2);
++
++ DUMP_SUBSTRUCT_ARRAY(i, 8)
++ {
++ DUMP_VAR(p_Dtsec->p_MemMap, macaddr[i].exact_match1);
++ DUMP_VAR(p_Dtsec->p_MemMap, macaddr[i].exact_match2);
++ }
++ DUMP_VAR(p_Dtsec->p_MemMap, car1);
++ DUMP_VAR(p_Dtsec->p_MemMap, car2);
++ }
++
++ return E_OK;
++}
++#endif /* (defined(DEBUG_ERRORS) && ... */
++
++
++/*****************************************************************************/
++/* dTSEC Init & Free API */
++/*****************************************************************************/
++
++/* .............................................................................. */
++
++static t_Error DtsecInit(t_Handle h_Dtsec)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++ struct dtsec_cfg *p_DtsecDriverParam;
++ t_Error err;
++ uint16_t maxFrmLn;
++ enum enet_interface enet_interface;
++ enum enet_speed enet_speed;
++ t_EnetAddr ethAddr;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec->fmMacControllerDriver.h_Fm, E_INVALID_HANDLE);
++
++ FM_GetRevision(p_Dtsec->fmMacControllerDriver.h_Fm, &p_Dtsec->fmMacControllerDriver.fmRevInfo);
++ CHECK_INIT_PARAMETERS(p_Dtsec, CheckInitParameters);
++
++ p_DtsecDriverParam = p_Dtsec->p_DtsecDriverParam;
++ p_Dtsec->halfDuplex = p_DtsecDriverParam->halfdup_on;
++
++ enet_interface = (enum enet_interface)ENET_INTERFACE_FROM_MODE(p_Dtsec->enetMode);
++ enet_speed = (enum enet_speed)ENET_SPEED_FROM_MODE(p_Dtsec->enetMode);
++ MAKE_ENET_ADDR_FROM_UINT64(p_Dtsec->addr, ethAddr);
++
++ err = (t_Error)dtsec_init(p_Dtsec->p_MemMap,
++ p_DtsecDriverParam,
++ enet_interface,
++ enet_speed,
++ (uint8_t*)ethAddr,
++ p_Dtsec->fmMacControllerDriver.fmRevInfo.majorRev,
++ p_Dtsec->fmMacControllerDriver.fmRevInfo.minorRev,
++ p_Dtsec->exceptions);
++ if (err)
++ {
++ FreeInitResources(p_Dtsec);
++ RETURN_ERROR(MAJOR, err, ("This DTSEC version does not support the required i/f mode"));
++ }
++
++ DTSEC_MII_Init(h_Dtsec);
++
++ if (ENET_INTERFACE_FROM_MODE(p_Dtsec->enetMode) == e_ENET_IF_SGMII)
++ {
++ uint16_t tmpReg16;
++
++ /* Configure the TBI PHY Control Register */
++ tmpReg16 = PHY_TBICON_CLK_SEL | PHY_TBICON_SRESET;
++ DTSEC_MII_WritePhyReg(p_Dtsec, (uint8_t)p_DtsecDriverParam->tbipa, 17, tmpReg16);
++
++ tmpReg16 = PHY_TBICON_CLK_SEL;
++ DTSEC_MII_WritePhyReg(p_Dtsec, (uint8_t)p_DtsecDriverParam->tbipa, 17, tmpReg16);
++
++ tmpReg16 = (PHY_CR_PHY_RESET | PHY_CR_ANE | PHY_CR_FULLDUPLEX | PHY_CR_SPEED1);
++ DTSEC_MII_WritePhyReg(p_Dtsec, (uint8_t)p_DtsecDriverParam->tbipa, 0, tmpReg16);
++
++ if (p_Dtsec->enetMode & ENET_IF_SGMII_BASEX)
++ tmpReg16 = PHY_TBIANA_1000X;
++ else
++ tmpReg16 = PHY_TBIANA_SGMII;
++ DTSEC_MII_WritePhyReg(p_Dtsec, (uint8_t)p_DtsecDriverParam->tbipa, 4, tmpReg16);
++
++ tmpReg16 = (PHY_CR_ANE | PHY_CR_RESET_AN | PHY_CR_FULLDUPLEX | PHY_CR_SPEED1);
++
++ DTSEC_MII_WritePhyReg(p_Dtsec, (uint8_t)p_DtsecDriverParam->tbipa, 0, tmpReg16);
++ }
++
++ /* Max Frame Length */
++ maxFrmLn = dtsec_get_max_frame_len(p_Dtsec->p_MemMap);
++ err = FmSetMacMaxFrame(p_Dtsec->fmMacControllerDriver.h_Fm, e_FM_MAC_1G,
++ p_Dtsec->fmMacControllerDriver.macId, maxFrmLn);
++
++ p_Dtsec->p_MulticastAddrHash = AllocHashTable(EXTENDED_HASH_TABLE_SIZE);
++ if (!p_Dtsec->p_MulticastAddrHash) {
++ FreeInitResources(p_Dtsec);
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MC hash table is FAILED"));
++ }
++
++ p_Dtsec->p_UnicastAddrHash = AllocHashTable(HASH_TABLE_SIZE);
++ if (!p_Dtsec->p_UnicastAddrHash)
++ {
++ FreeInitResources(p_Dtsec);
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("UC hash table is FAILED"));
++ }
++
++ /* register err intr handler for dtsec to FPM (err)*/
++ FmRegisterIntr(p_Dtsec->fmMacControllerDriver.h_Fm,
++ e_FM_MOD_1G_MAC,
++ p_Dtsec->macId,
++ e_FM_INTR_TYPE_ERR,
++ DtsecIsr,
++ p_Dtsec);
++ /* register 1588 intr handler for TMR to FPM (normal)*/
++ FmRegisterIntr(p_Dtsec->fmMacControllerDriver.h_Fm,
++ e_FM_MOD_1G_MAC,
++ p_Dtsec->macId,
++ e_FM_INTR_TYPE_NORMAL,
++ Dtsec1588Isr,
++ p_Dtsec);
++ /* register normal intr handler for dtsec to main interrupt controller. */
++ if (p_Dtsec->mdioIrq != NO_IRQ)
++ {
++ XX_SetIntr(p_Dtsec->mdioIrq, DtsecMdioIsr, p_Dtsec);
++ XX_EnableIntr(p_Dtsec->mdioIrq);
++ }
++
++ XX_Free(p_DtsecDriverParam);
++ p_Dtsec->p_DtsecDriverParam = NULL;
++
++ err = DtsecSetStatistics(h_Dtsec, e_FM_MAC_FULL_STATISTICS);
++ if (err)
++ {
++ FreeInitResources(p_Dtsec);
++ RETURN_ERROR(MAJOR, err, ("Undefined statistics level"));
++ }
++
++ return E_OK;
++}
++
++/* ........................................................................... */
++
++static t_Error DtsecFree(t_Handle h_Dtsec)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++
++ FreeInitResources(p_Dtsec);
++
++ if (p_Dtsec->p_DtsecDriverParam)
++ {
++ XX_Free(p_Dtsec->p_DtsecDriverParam);
++ p_Dtsec->p_DtsecDriverParam = NULL;
++ }
++ XX_Free (h_Dtsec);
++
++ return E_OK;
++}
++
++/* .............................................................................. */
++
++static void InitFmMacControllerDriver(t_FmMacControllerDriver *p_FmMacControllerDriver)
++{
++ p_FmMacControllerDriver->f_FM_MAC_Init = DtsecInit;
++ p_FmMacControllerDriver->f_FM_MAC_Free = DtsecFree;
++
++ p_FmMacControllerDriver->f_FM_MAC_SetStatistics = DtsecSetStatistics;
++ p_FmMacControllerDriver->f_FM_MAC_ConfigLoopback = DtsecConfigLoopback;
++ p_FmMacControllerDriver->f_FM_MAC_ConfigMaxFrameLength = DtsecConfigMaxFrameLength;
++
++ p_FmMacControllerDriver->f_FM_MAC_ConfigWan = NULL; /* Not supported on dTSEC */
++
++ p_FmMacControllerDriver->f_FM_MAC_ConfigPadAndCrc = DtsecConfigPadAndCrc;
++ p_FmMacControllerDriver->f_FM_MAC_ConfigHalfDuplex = DtsecConfigHalfDuplex;
++ p_FmMacControllerDriver->f_FM_MAC_ConfigLengthCheck = DtsecConfigLengthCheck;
++ p_FmMacControllerDriver->f_FM_MAC_ConfigTbiPhyAddr = DtsecConfigTbiPhyAddr;
++ p_FmMacControllerDriver->f_FM_MAC_ConfigException = DtsecConfigException;
++ p_FmMacControllerDriver->f_FM_MAC_ConfigResetOnInit = NULL;
++
++ p_FmMacControllerDriver->f_FM_MAC_Enable = DtsecEnable;
++ p_FmMacControllerDriver->f_FM_MAC_Disable = DtsecDisable;
++
++ p_FmMacControllerDriver->f_FM_MAC_SetException = DtsecSetException;
++
++ p_FmMacControllerDriver->f_FM_MAC_SetPromiscuous = DtsecSetPromiscuous;
++ p_FmMacControllerDriver->f_FM_MAC_AdjustLink = DtsecAdjustLink;
++ p_FmMacControllerDriver->f_FM_MAC_RestartAutoneg = DtsecRestartAutoneg;
++
++ p_FmMacControllerDriver->f_FM_MAC_Enable1588TimeStamp = DtsecEnable1588TimeStamp;
++ p_FmMacControllerDriver->f_FM_MAC_Disable1588TimeStamp = DtsecDisable1588TimeStamp;
++
++ p_FmMacControllerDriver->f_FM_MAC_SetTxAutoPauseFrames = DtsecTxMacPause;
++ p_FmMacControllerDriver->f_FM_MAC_SetTxPauseFrames = DtsecSetTxPauseFrames;
++ p_FmMacControllerDriver->f_FM_MAC_SetRxIgnorePauseFrames = DtsecRxIgnoreMacPause;
++
++ p_FmMacControllerDriver->f_FM_MAC_ResetCounters = DtsecResetCounters;
++ p_FmMacControllerDriver->f_FM_MAC_GetStatistics = DtsecGetStatistics;
++
++ p_FmMacControllerDriver->f_FM_MAC_ModifyMacAddr = DtsecModifyMacAddress;
++ p_FmMacControllerDriver->f_FM_MAC_AddHashMacAddr = DtsecAddHashMacAddress;
++ p_FmMacControllerDriver->f_FM_MAC_RemoveHashMacAddr = DtsecDelHashMacAddress;
++ p_FmMacControllerDriver->f_FM_MAC_AddExactMatchMacAddr = DtsecAddExactMatchMacAddress;
++ p_FmMacControllerDriver->f_FM_MAC_RemovelExactMatchMacAddr = DtsecDelExactMatchMacAddress;
++ p_FmMacControllerDriver->f_FM_MAC_GetId = DtsecGetId;
++ p_FmMacControllerDriver->f_FM_MAC_GetVersion = DtsecGetVersion;
++ p_FmMacControllerDriver->f_FM_MAC_GetMaxFrameLength = DtsecGetMaxFrameLength;
++
++ p_FmMacControllerDriver->f_FM_MAC_MII_WritePhyReg = DTSEC_MII_WritePhyReg;
++ p_FmMacControllerDriver->f_FM_MAC_MII_ReadPhyReg = DTSEC_MII_ReadPhyReg;
++
++#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
++ p_FmMacControllerDriver->f_FM_MAC_DumpRegs = DtsecDumpRegs;
++#endif /* (defined(DEBUG_ERRORS) && ... */
++}
++
++
++/*****************************************************************************/
++/* dTSEC Config Main Entry */
++/*****************************************************************************/
++
++/* .............................................................................. */
++
++t_Handle DTSEC_Config(t_FmMacParams *p_FmMacParam)
++{
++ t_Dtsec *p_Dtsec;
++ struct dtsec_cfg *p_DtsecDriverParam;
++ uintptr_t baseAddr;
++
++ SANITY_CHECK_RETURN_VALUE(p_FmMacParam, E_NULL_POINTER, NULL);
++
++ baseAddr = p_FmMacParam->baseAddr;
++
++ /* allocate memory for the UCC GETH data structure. */
++ p_Dtsec = (t_Dtsec *)XX_Malloc(sizeof(t_Dtsec));
++ if (!p_Dtsec)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("dTSEC driver structure"));
++ return NULL;
++ }
++ memset(p_Dtsec, 0, sizeof(t_Dtsec));
++ InitFmMacControllerDriver(&p_Dtsec->fmMacControllerDriver);
++
++ /* allocate memory for the dTSEC driver parameters data structure. */
++ p_DtsecDriverParam = (struct dtsec_cfg *) XX_Malloc(sizeof(struct dtsec_cfg));
++ if (!p_DtsecDriverParam)
++ {
++ XX_Free(p_Dtsec);
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("dTSEC driver parameters"));
++ return NULL;
++ }
++ memset(p_DtsecDriverParam, 0, sizeof(struct dtsec_cfg));
++
++ /* Plant parameter structure pointer */
++ p_Dtsec->p_DtsecDriverParam = p_DtsecDriverParam;
++
++ dtsec_defconfig(p_DtsecDriverParam);
++
++ p_Dtsec->p_MemMap = (struct dtsec_regs *)UINT_TO_PTR(baseAddr);
++ p_Dtsec->p_MiiMemMap = (struct dtsec_mii_reg *)UINT_TO_PTR(baseAddr + DTSEC_TO_MII_OFFSET);
++ p_Dtsec->addr = ENET_ADDR_TO_UINT64(p_FmMacParam->addr);
++ p_Dtsec->enetMode = p_FmMacParam->enetMode;
++ p_Dtsec->macId = p_FmMacParam->macId;
++ p_Dtsec->exceptions = DEFAULT_exceptions;
++ p_Dtsec->mdioIrq = p_FmMacParam->mdioIrq;
++ p_Dtsec->f_Exception = p_FmMacParam->f_Exception;
++ p_Dtsec->f_Event = p_FmMacParam->f_Event;
++ p_Dtsec->h_App = p_FmMacParam->h_App;
++ p_Dtsec->ptpTsuEnabled = p_Dtsec->p_DtsecDriverParam->ptp_tsu_en;
++ p_Dtsec->enTsuErrExeption = p_Dtsec->p_DtsecDriverParam->ptp_exception_en;
++ p_Dtsec->tbi_phy_addr = p_Dtsec->p_DtsecDriverParam->tbi_phy_addr;
++
++ return p_Dtsec;
++}
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/dtsec.h b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/dtsec.h
+new file mode 100644
+index 0000000..01296dd
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/dtsec.h
+@@ -0,0 +1,245 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File dtsec.h
++
++ @Description FM dTSEC ...
++*//***************************************************************************/
++#ifndef __DTSEC_H
++#define __DTSEC_H
++
++#include "std_ext.h"
++#include "error_ext.h"
++#include "list_ext.h"
++#include "enet_ext.h"
++
++#include "dtsec_mii_acc.h"
++#include "fm_mac.h"
++
++
++#define DEFAULT_exceptions \
++ ((uint32_t)(DTSEC_IMASK_BREN | \
++ DTSEC_IMASK_RXCEN | \
++ DTSEC_IMASK_BTEN | \
++ DTSEC_IMASK_TXCEN | \
++ DTSEC_IMASK_TXEEN | \
++ DTSEC_IMASK_ABRTEN | \
++ DTSEC_IMASK_LCEN | \
++ DTSEC_IMASK_CRLEN | \
++ DTSEC_IMASK_XFUNEN | \
++ DTSEC_IMASK_IFERREN | \
++ DTSEC_IMASK_MAGEN | \
++ DTSEC_IMASK_TDPEEN | \
++ DTSEC_IMASK_RDPEEN))
++
++#define GET_EXCEPTION_FLAG(bitMask, exception) switch (exception){ \
++ case e_FM_MAC_EX_1G_BAB_RX: \
++ bitMask = DTSEC_IMASK_BREN; break; \
++ case e_FM_MAC_EX_1G_RX_CTL: \
++ bitMask = DTSEC_IMASK_RXCEN; break; \
++ case e_FM_MAC_EX_1G_GRATEFUL_TX_STP_COMPLET: \
++ bitMask = DTSEC_IMASK_GTSCEN ; break; \
++ case e_FM_MAC_EX_1G_BAB_TX: \
++ bitMask = DTSEC_IMASK_BTEN ; break; \
++ case e_FM_MAC_EX_1G_TX_CTL: \
++ bitMask = DTSEC_IMASK_TXCEN ; break; \
++ case e_FM_MAC_EX_1G_TX_ERR: \
++ bitMask = DTSEC_IMASK_TXEEN ; break; \
++ case e_FM_MAC_EX_1G_LATE_COL: \
++ bitMask = DTSEC_IMASK_LCEN ; break; \
++ case e_FM_MAC_EX_1G_COL_RET_LMT: \
++ bitMask = DTSEC_IMASK_CRLEN ; break; \
++ case e_FM_MAC_EX_1G_TX_FIFO_UNDRN: \
++ bitMask = DTSEC_IMASK_XFUNEN ; break; \
++ case e_FM_MAC_EX_1G_MAG_PCKT: \
++ bitMask = DTSEC_IMASK_MAGEN ; break; \
++ case e_FM_MAC_EX_1G_MII_MNG_RD_COMPLET: \
++ bitMask = DTSEC_IMASK_MMRDEN; break; \
++ case e_FM_MAC_EX_1G_MII_MNG_WR_COMPLET: \
++ bitMask = DTSEC_IMASK_MMWREN ; break; \
++ case e_FM_MAC_EX_1G_GRATEFUL_RX_STP_COMPLET: \
++ bitMask = DTSEC_IMASK_GRSCEN; break; \
++ case e_FM_MAC_EX_1G_TX_DATA_ERR: \
++ bitMask = DTSEC_IMASK_TDPEEN; break; \
++ case e_FM_MAC_EX_1G_RX_MIB_CNT_OVFL: \
++ bitMask = DTSEC_IMASK_MSROEN ; break; \
++ default: bitMask = 0;break;}
++
++
++#define MAX_PACKET_ALIGNMENT 31
++#define MAX_INTER_PACKET_GAP 0x7f
++#define MAX_INTER_PALTERNATE_BEB 0x0f
++#define MAX_RETRANSMISSION 0x0f
++#define MAX_COLLISION_WINDOW 0x03ff
++
++
++/********************* From mac ext ******************************************/
++typedef uint32_t t_ErrorDisable;
++
++#define ERROR_DISABLE_TRANSMIT 0x00400000
++#define ERROR_DISABLE_LATE_COLLISION 0x00040000
++#define ERROR_DISABLE_COLLISION_RETRY_LIMIT 0x00020000
++#define ERROR_DISABLE_TxFIFO_UNDERRUN 0x00010000
++#define ERROR_DISABLE_TxABORT 0x00008000
++#define ERROR_DISABLE_INTERFACE 0x00004000
++#define ERROR_DISABLE_TxDATA_PARITY 0x00000002
++#define ERROR_DISABLE_RxDATA_PARITY 0x00000001
++
++/*****************************************************************************/
++#define DTSEC_NUM_OF_PADDRS 15 /* number of pattern match registers (entries) */
++
++#define GROUP_ADDRESS 0x0000010000000000LL /* Group address bit indication */
++
++#define HASH_TABLE_SIZE 256 /* Hash table size (= 32 bits * 8 regs) */
++
++#define HASH_TABLE_SIZE 256 /* Hash table size (32 bits * 8 regs) */
++#define EXTENDED_HASH_TABLE_SIZE 512 /* Extended Hash table size (32 bits * 16 regs) */
++
++#define DTSEC_TO_MII_OFFSET 0x1000 /* number of pattern match registers (entries) */
++
++#define MAX_PHYS 32 /* maximum number of phys */
++
++#define VAL32BIT 0x100000000LL
++#define VAL22BIT 0x00400000
++#define VAL16BIT 0x00010000
++#define VAL12BIT 0x00001000
++
++/* PHY Control Register */
++#define PHY_CR_PHY_RESET 0x8000
++#define PHY_CR_LOOPBACK 0x4000
++#define PHY_CR_SPEED0 0x2000
++#define PHY_CR_ANE 0x1000
++#define PHY_CR_RESET_AN 0x0200
++#define PHY_CR_FULLDUPLEX 0x0100
++#define PHY_CR_SPEED1 0x0040
++
++#define PHY_TBICON_SRESET 0x8000
++#define PHY_TBICON_CLK_SEL 0x0020
++
++#define PHY_TBIANA_SGMII 0x4001
++#define PHY_TBIANA_1000X 0x01a0
++
++
++/* CAR1/2 bits */
++#define CAR1_TR64 0x80000000
++#define CAR1_TR127 0x40000000
++#define CAR1_TR255 0x20000000
++#define CAR1_TR511 0x10000000
++#define CAR1_TRK1 0x08000000
++#define CAR1_TRMAX 0x04000000
++#define CAR1_TRMGV 0x02000000
++
++#define CAR1_RBYT 0x00010000
++#define CAR1_RPKT 0x00008000
++#define CAR1_RMCA 0x00002000
++#define CAR1_RBCA 0x00001000
++#define CAR1_RXPF 0x00000400
++#define CAR1_RALN 0x00000100
++#define CAR1_RFLR 0x00000080
++#define CAR1_RCDE 0x00000040
++#define CAR1_RCSE 0x00000020
++#define CAR1_RUND 0x00000010
++#define CAR1_ROVR 0x00000008
++#define CAR1_RFRG 0x00000004
++#define CAR1_RJBR 0x00000002
++#define CAR1_RDRP 0x00000001
++
++#define CAR2_TFCS 0x00040000
++#define CAR2_TBYT 0x00002000
++#define CAR2_TPKT 0x00001000
++#define CAR2_TMCA 0x00000800
++#define CAR2_TBCA 0x00000400
++#define CAR2_TXPF 0x00000200
++#define CAR2_TDRP 0x00000001
++
++typedef struct t_InternalStatistics
++{
++ uint64_t tr64;
++ uint64_t tr127;
++ uint64_t tr255;
++ uint64_t tr511;
++ uint64_t tr1k;
++ uint64_t trmax;
++ uint64_t trmgv;
++ uint64_t rfrg;
++ uint64_t rjbr;
++ uint64_t rdrp;
++ uint64_t raln;
++ uint64_t rund;
++ uint64_t rovr;
++ uint64_t rxpf;
++ uint64_t txpf;
++ uint64_t rbyt;
++ uint64_t rpkt;
++ uint64_t rmca;
++ uint64_t rbca;
++ uint64_t rflr;
++ uint64_t rcde;
++ uint64_t rcse;
++ uint64_t tbyt;
++ uint64_t tpkt;
++ uint64_t tmca;
++ uint64_t tbca;
++ uint64_t tdrp;
++ uint64_t tfcs;
++} t_InternalStatistics;
++
++typedef struct {
++ t_FmMacControllerDriver fmMacControllerDriver;
++ t_Handle h_App; /**< Handle to the upper layer application */
++ struct dtsec_regs *p_MemMap; /**< pointer to dTSEC memory mapped registers. */
++ struct dtsec_mii_reg *p_MiiMemMap; /**< pointer to dTSEC MII memory mapped registers. */
++ uint64_t addr; /**< MAC address of device; */
++ e_EnetMode enetMode; /**< Ethernet physical interface */
++ t_FmMacExceptionCallback *f_Exception;
++ int mdioIrq;
++ t_FmMacExceptionCallback *f_Event;
++ bool indAddrRegUsed[DTSEC_NUM_OF_PADDRS]; /**< Whether a particular individual address recognition register is being used */
++ uint64_t paddr[DTSEC_NUM_OF_PADDRS]; /**< MAC address for particular individual address recognition register */
++ uint8_t numOfIndAddrInRegs; /**< Number of individual addresses in registers for this station. */
++ bool halfDuplex;
++ t_InternalStatistics internalStatistics;
++ t_EthHash *p_MulticastAddrHash; /* pointer to driver's global address hash table */
++ t_EthHash *p_UnicastAddrHash; /* pointer to driver's individual address hash table */
++ uint8_t macId;
++ uint8_t tbi_phy_addr;
++ uint32_t exceptions;
++ bool ptpTsuEnabled;
++ bool enTsuErrExeption;
++ e_FmMacStatisticsLevel statisticsLevel;
++ struct dtsec_cfg *p_DtsecDriverParam;
++} t_Dtsec;
++
++
++#endif /* __DTSEC_H */
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/dtsec_mii_acc.c b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/dtsec_mii_acc.c
+new file mode 100644
+index 0000000..371e1f9
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/dtsec_mii_acc.c
+@@ -0,0 +1,109 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File dtsec_mii_acc.c
++
++ @Description FM dtsec MII register access MAC ...
++*//***************************************************************************/
++
++#include "error_ext.h"
++#include "std_ext.h"
++#include "fm_mac.h"
++#include "dtsec.h"
++#include "fsl_fman_dtsec_mii_acc.h"
++
++
++/*****************************************************************************/
++t_Error DTSEC_MII_WritePhyReg(t_Handle h_Dtsec,
++ uint8_t phyAddr,
++ uint8_t reg,
++ uint16_t data)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++ struct dtsec_mii_reg *miiregs;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec->p_MiiMemMap, E_INVALID_HANDLE);
++
++ miiregs = p_Dtsec->p_MiiMemMap;
++
++ err = (t_Error)dtsec_mii_write_reg(miiregs, phyAddr, reg, data);
++
++ return err;
++}
++
++/*****************************************************************************/
++t_Error DTSEC_MII_ReadPhyReg(t_Handle h_Dtsec,
++ uint8_t phyAddr,
++ uint8_t reg,
++ uint16_t *p_Data)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++ struct dtsec_mii_reg *miiregs;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec->p_MiiMemMap, E_INVALID_HANDLE);
++
++ miiregs = p_Dtsec->p_MiiMemMap;
++
++ err = (t_Error)dtsec_mii_read_reg(miiregs, phyAddr, reg, p_Data);
++
++ if (*p_Data == 0xffff)
++ RETURN_ERROR(MINOR, E_NO_DEVICE,
++ ("Read wrong data (0xffff): phyAddr 0x%x, reg 0x%x",
++ phyAddr, reg));
++ if (err)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++
++ return err;
++}
++
++t_Error DTSEC_MII_Init(t_Handle h_Dtsec)
++{
++ t_Dtsec *p_Dtsec = (t_Dtsec *)h_Dtsec;
++ struct dtsec_mii_reg *miiregs;
++ uint16_t dtsec_freq;
++
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Dtsec->p_MiiMemMap, E_INVALID_HANDLE);
++
++ miiregs = p_Dtsec->p_MiiMemMap;
++ dtsec_freq = (uint16_t)(p_Dtsec->fmMacControllerDriver.clkFreq >> 1);
++
++ dtsec_mii_init(miiregs, dtsec_freq);
++
++ return E_OK;
++}
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/dtsec_mii_acc.h b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/dtsec_mii_acc.h
+new file mode 100644
+index 0000000..d5dd39a
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/dtsec_mii_acc.h
+@@ -0,0 +1,45 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++#ifndef __DTSEC_MII_ACC_H
++#define __DTSEC_MII_ACC_H
++
++#include "std_ext.h"
++
++
++t_Error DTSEC_MII_WritePhyReg(t_Handle h_Dtsec, uint8_t phyAddr, uint8_t reg, uint16_t data);
++t_Error DTSEC_MII_ReadPhyReg(t_Handle h_Dtsec, uint8_t phyAddr, uint8_t reg, uint16_t *p_Data);
++t_Error DTSEC_MII_Init(t_Handle h_Dtsec);
++
++
++#endif /* __DTSEC_MII_ACC_H */
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fm_mac.c b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fm_mac.c
+new file mode 100644
+index 0000000..e2deaa2
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fm_mac.c
+@@ -0,0 +1,628 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File fm_mac.c
++
++ @Description FM MAC ...
++*//***************************************************************************/
++#include "std_ext.h"
++#include "string_ext.h"
++#include "sprint_ext.h"
++#include "error_ext.h"
++#include "fm_ext.h"
++
++#include "fm_common.h"
++#include "fm_mac.h"
++
++
++/* ......................................................................... */
++
++t_Handle FM_MAC_Config (t_FmMacParams *p_FmMacParam)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver;
++
++ SANITY_CHECK_RETURN_VALUE(p_FmMacParam, E_INVALID_HANDLE, NULL);
++
++#if (DPAA_VERSION == 10)
++ if (ENET_SPEED_FROM_MODE(p_FmMacParam->enetMode) < e_ENET_SPEED_10000)
++ p_FmMacControllerDriver = (t_FmMacControllerDriver *)DTSEC_Config(p_FmMacParam);
++ else
++#if FM_MAX_NUM_OF_10G_MACS > 0
++ p_FmMacControllerDriver = (t_FmMacControllerDriver *)TGEC_Config(p_FmMacParam);
++#else
++ p_FmMacControllerDriver = NULL;
++#endif /* FM_MAX_NUM_OF_10G_MACS > 0 */
++#else
++ p_FmMacControllerDriver = (t_FmMacControllerDriver *)MEMAC_Config(p_FmMacParam);
++#endif /* (DPAA_VERSION == 10) */
++
++ if (!p_FmMacControllerDriver)
++ return NULL;
++
++ p_FmMacControllerDriver->h_Fm = p_FmMacParam->h_Fm;
++ p_FmMacControllerDriver->enetMode = p_FmMacParam->enetMode;
++ p_FmMacControllerDriver->macId = p_FmMacParam->macId;
++ p_FmMacControllerDriver->resetOnInit = DEFAULT_resetOnInit;
++
++ if ((p_FmMacControllerDriver->clkFreq = FmGetClockFreq(p_FmMacControllerDriver->h_Fm)) == 0)
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Can't get clock for MAC!"));
++ return NULL;
++ }
++
++ return (t_Handle)p_FmMacControllerDriver;
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_Init (t_Handle h_FmMac)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->resetOnInit &&
++ !p_FmMacControllerDriver->f_FM_MAC_ConfigResetOnInit &&
++ (FmResetMac(p_FmMacControllerDriver->h_Fm,
++ ((ENET_INTERFACE_FROM_MODE(p_FmMacControllerDriver->enetMode) == e_ENET_IF_XGMII) ?
++ e_FM_MAC_10G : e_FM_MAC_1G),
++ p_FmMacControllerDriver->macId) != E_OK))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Can't reset MAC!"));
++
++ if (p_FmMacControllerDriver->f_FM_MAC_Init)
++ return p_FmMacControllerDriver->f_FM_MAC_Init(h_FmMac);
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_Free (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_Free)
++ return p_FmMacControllerDriver->f_FM_MAC_Free(h_FmMac);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_ConfigResetOnInit (t_Handle h_FmMac, bool enable)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_ConfigResetOnInit)
++ return p_FmMacControllerDriver->f_FM_MAC_ConfigResetOnInit(h_FmMac, enable);
++
++ p_FmMacControllerDriver->resetOnInit = enable;
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_ConfigLoopback (t_Handle h_FmMac, bool newVal)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_ConfigLoopback)
++ return p_FmMacControllerDriver->f_FM_MAC_ConfigLoopback(h_FmMac, newVal);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_ConfigMaxFrameLength (t_Handle h_FmMac, uint16_t newVal)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_ConfigMaxFrameLength)
++ return p_FmMacControllerDriver->f_FM_MAC_ConfigMaxFrameLength(h_FmMac, newVal);
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_ConfigWan (t_Handle h_FmMac, bool flag)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_ConfigWan)
++ return p_FmMacControllerDriver->f_FM_MAC_ConfigWan(h_FmMac, flag);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_ConfigPadAndCrc (t_Handle h_FmMac, bool newVal)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_ConfigPadAndCrc)
++ return p_FmMacControllerDriver->f_FM_MAC_ConfigPadAndCrc(h_FmMac, newVal);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_ConfigHalfDuplex (t_Handle h_FmMac, bool newVal)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_ConfigHalfDuplex)
++ return p_FmMacControllerDriver->f_FM_MAC_ConfigHalfDuplex(h_FmMac,newVal);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_ConfigTbiPhyAddr (t_Handle h_FmMac, uint8_t newVal)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_ConfigTbiPhyAddr)
++ return p_FmMacControllerDriver->f_FM_MAC_ConfigTbiPhyAddr(h_FmMac,newVal);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_ConfigLengthCheck (t_Handle h_FmMac, bool newVal)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_ConfigLengthCheck)
++ return p_FmMacControllerDriver->f_FM_MAC_ConfigLengthCheck(h_FmMac,newVal);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_ConfigException (t_Handle h_FmMac, e_FmMacExceptions ex, bool enable)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_ConfigException)
++ return p_FmMacControllerDriver->f_FM_MAC_ConfigException(h_FmMac, ex, enable);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++#ifdef FM_TX_ECC_FRMS_ERRATA_10GMAC_A004
++/* ......................................................................... */
++
++t_Error FM_MAC_ConfigSkipFman11Workaround (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_ConfigSkipFman11Workaround)
++ return p_FmMacControllerDriver->f_FM_MAC_ConfigSkipFman11Workaround(h_FmMac);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++#endif /* FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 */
++
++
++/*****************************************************************************/
++/* Run Time Control */
++/*****************************************************************************/
++
++/* ......................................................................... */
++
++t_Error FM_MAC_Enable (t_Handle h_FmMac, e_CommMode mode)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_Enable)
++ return p_FmMacControllerDriver->f_FM_MAC_Enable(h_FmMac, mode);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_Disable (t_Handle h_FmMac, e_CommMode mode)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_Disable)
++ return p_FmMacControllerDriver->f_FM_MAC_Disable(h_FmMac, mode);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_Enable1588TimeStamp (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_Enable1588TimeStamp)
++ return p_FmMacControllerDriver->f_FM_MAC_Enable1588TimeStamp(h_FmMac);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_Disable1588TimeStamp (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_Disable1588TimeStamp)
++ return p_FmMacControllerDriver->f_FM_MAC_Disable1588TimeStamp(h_FmMac);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_SetTxAutoPauseFrames(t_Handle h_FmMac,
++ uint16_t pauseTime)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_SetTxAutoPauseFrames)
++ return p_FmMacControllerDriver->f_FM_MAC_SetTxAutoPauseFrames(h_FmMac,
++ pauseTime);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_SetTxPauseFrames(t_Handle h_FmMac,
++ uint8_t priority,
++ uint16_t pauseTime,
++ uint16_t threshTime)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_SetTxPauseFrames)
++ return p_FmMacControllerDriver->f_FM_MAC_SetTxPauseFrames(h_FmMac,
++ priority,
++ pauseTime,
++ threshTime);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_SetRxIgnorePauseFrames (t_Handle h_FmMac, bool en)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_SetRxIgnorePauseFrames)
++ return p_FmMacControllerDriver->f_FM_MAC_SetRxIgnorePauseFrames(h_FmMac, en);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_ResetCounters (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_ResetCounters)
++ return p_FmMacControllerDriver->f_FM_MAC_ResetCounters(h_FmMac);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_SetException(t_Handle h_FmMac, e_FmMacExceptions ex, bool enable)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_SetException)
++ return p_FmMacControllerDriver->f_FM_MAC_SetException(h_FmMac, ex, enable);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_SetStatistics (t_Handle h_FmMac, e_FmMacStatisticsLevel statisticsLevel)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_SetStatistics)
++ return p_FmMacControllerDriver->f_FM_MAC_SetStatistics(h_FmMac, statisticsLevel);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_GetStatistics (t_Handle h_FmMac, t_FmMacStatistics *p_Statistics)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_GetStatistics)
++ return p_FmMacControllerDriver->f_FM_MAC_GetStatistics(h_FmMac, p_Statistics);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_ModifyMacAddr (t_Handle h_FmMac, t_EnetAddr *p_EnetAddr)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_ModifyMacAddr)
++ return p_FmMacControllerDriver->f_FM_MAC_ModifyMacAddr(h_FmMac, p_EnetAddr);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_AddHashMacAddr (t_Handle h_FmMac, t_EnetAddr *p_EnetAddr)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_AddHashMacAddr)
++ return p_FmMacControllerDriver->f_FM_MAC_AddHashMacAddr(h_FmMac, p_EnetAddr);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_RemoveHashMacAddr (t_Handle h_FmMac, t_EnetAddr *p_EnetAddr)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_RemoveHashMacAddr)
++ return p_FmMacControllerDriver->f_FM_MAC_RemoveHashMacAddr(h_FmMac, p_EnetAddr);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_AddExactMatchMacAddr (t_Handle h_FmMac, t_EnetAddr *p_EnetAddr)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_AddExactMatchMacAddr)
++ return p_FmMacControllerDriver->f_FM_MAC_AddExactMatchMacAddr(h_FmMac, p_EnetAddr);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_RemovelExactMatchMacAddr (t_Handle h_FmMac, t_EnetAddr *p_EnetAddr)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_RemovelExactMatchMacAddr)
++ return p_FmMacControllerDriver->f_FM_MAC_RemovelExactMatchMacAddr(h_FmMac, p_EnetAddr);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_GetVesrion (t_Handle h_FmMac, uint32_t *macVresion)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_GetVersion)
++ return p_FmMacControllerDriver->f_FM_MAC_GetVersion(h_FmMac, macVresion);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_GetId (t_Handle h_FmMac, uint32_t *macId)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_GetId)
++ return p_FmMacControllerDriver->f_FM_MAC_GetId(h_FmMac, macId);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_SetPromiscuous (t_Handle h_FmMac, bool newVal)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_SetPromiscuous)
++ return p_FmMacControllerDriver->f_FM_MAC_SetPromiscuous(h_FmMac, newVal);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_AdjustLink(t_Handle h_FmMac, e_EnetSpeed speed, bool fullDuplex)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_AdjustLink)
++ return p_FmMacControllerDriver->f_FM_MAC_AdjustLink(h_FmMac, speed, fullDuplex);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_RestartAutoneg(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_RestartAutoneg)
++ return p_FmMacControllerDriver->f_FM_MAC_RestartAutoneg(h_FmMac);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_MII_WritePhyReg (t_Handle h_FmMac, uint8_t phyAddr, uint8_t reg, uint16_t data)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_MII_WritePhyReg)
++ return p_FmMacControllerDriver->f_FM_MAC_MII_WritePhyReg(h_FmMac, phyAddr, reg, data);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++t_Error FM_MAC_MII_ReadPhyReg(t_Handle h_FmMac, uint8_t phyAddr, uint8_t reg, uint16_t *p_Data)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_MII_ReadPhyReg)
++ return p_FmMacControllerDriver->f_FM_MAC_MII_ReadPhyReg(h_FmMac, phyAddr, reg, p_Data);
++
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++
++/* ......................................................................... */
++
++uint16_t FM_MAC_GetMaxFrameLength(t_Handle h_FmMac)
++{
++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
++
++ SANITY_CHECK_RETURN_VALUE(p_FmMacControllerDriver, E_INVALID_HANDLE, 0);
++
++ if (p_FmMacControllerDriver->f_FM_MAC_GetMaxFrameLength)
++ return p_FmMacControllerDriver->f_FM_MAC_GetMaxFrameLength(h_FmMac);
++
++ REPORT_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++ return 0;
++}
++
++#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
++/*****************************************************************************/
++t_Error FM_MAC_DumpRegs(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_DumpRegs)
++ return p_FmMacControllerDriver->f_FM_MAC_DumpRegs(h_FmMac);
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++}
++#endif /* (defined(DEBUG_ERRORS) && ... */
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fm_mac.h b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fm_mac.h
+new file mode 100644
+index 0000000..94f7b09
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fm_mac.h
+@@ -0,0 +1,222 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File fm_mac.h
++
++ @Description FM MAC ...
++*//***************************************************************************/
++#ifndef __FM_MAC_H
++#define __FM_MAC_H
++
++#include "std_ext.h"
++#include "error_ext.h"
++#include "list_ext.h"
++#include "fm_mac_ext.h"
++#include "fm_common.h"
++
++
++#define __ERR_MODULE__ MODULE_FM_MAC
++
++/**************************************************************************//**
++ @Description defaults
++*//***************************************************************************/
++
++
++#define DEFAULT_halfDuplex FALSE
++#define DEFAULT_padAndCrcEnable TRUE
++#define DEFAULT_resetOnInit FALSE
++
++
++typedef struct {
++ uint64_t addr; /* Ethernet Address */
++ t_List node;
++} t_EthHashEntry;
++#define ETH_HASH_ENTRY_OBJ(ptr) LIST_OBJECT(ptr, t_EthHashEntry, node)
++
++typedef struct {
++ uint16_t size;
++ t_List *p_Lsts;
++} t_EthHash;
++
++typedef struct {
++ t_Error (*f_FM_MAC_Init) (t_Handle h_FmMac);
++ t_Error (*f_FM_MAC_Free) (t_Handle h_FmMac);
++
++ t_Error (*f_FM_MAC_SetStatistics) (t_Handle h_FmMac, e_FmMacStatisticsLevel statisticsLevel);
++ t_Error (*f_FM_MAC_ConfigLoopback) (t_Handle h_FmMac, bool newVal);
++ t_Error (*f_FM_MAC_ConfigMaxFrameLength) (t_Handle h_FmMac, uint16_t newVal);
++ t_Error (*f_FM_MAC_ConfigWan) (t_Handle h_FmMac, bool flag);
++ t_Error (*f_FM_MAC_ConfigPadAndCrc) (t_Handle h_FmMac, bool newVal);
++ t_Error (*f_FM_MAC_ConfigHalfDuplex) (t_Handle h_FmMac, bool newVal);
++ t_Error (*f_FM_MAC_ConfigLengthCheck) (t_Handle h_FmMac, bool newVal);
++ t_Error (*f_FM_MAC_ConfigTbiPhyAddr) (t_Handle h_FmMac, uint8_t newVal);
++ t_Error (*f_FM_MAC_ConfigException) (t_Handle h_FmMac, e_FmMacExceptions, bool enable);
++ t_Error (*f_FM_MAC_ConfigResetOnInit) (t_Handle h_FmMac, bool enable);
++#ifdef FM_TX_ECC_FRMS_ERRATA_10GMAC_A004
++ t_Error (*f_FM_MAC_ConfigSkipFman11Workaround) (t_Handle h_FmMac);
++#endif /* FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 */
++
++ t_Error (*f_FM_MAC_SetException) (t_Handle h_FmMac, e_FmMacExceptions ex, bool enable);
++
++ 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_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);
++
++ t_Error (*f_FM_MAC_SetTxAutoPauseFrames) (t_Handle h_FmMac,
++ uint16_t pauseTime);
++ t_Error (*f_FM_MAC_SetTxPauseFrames) (t_Handle h_FmMac,
++ uint8_t priority,
++ uint16_t pauseTime,
++ uint16_t threshTime);
++ t_Error (*f_FM_MAC_SetRxIgnorePauseFrames) (t_Handle h_FmMac, bool en);
++
++ t_Error (*f_FM_MAC_ResetCounters) (t_Handle h_FmMac);
++ t_Error (*f_FM_MAC_GetStatistics) (t_Handle h_FmMac, t_FmMacStatistics *p_Statistics);
++
++ t_Error (*f_FM_MAC_ModifyMacAddr) (t_Handle h_FmMac, t_EnetAddr *p_EnetAddr);
++ t_Error (*f_FM_MAC_AddHashMacAddr) (t_Handle h_FmMac, t_EnetAddr *p_EnetAddr);
++ t_Error (*f_FM_MAC_RemoveHashMacAddr) (t_Handle h_FmMac, t_EnetAddr *p_EnetAddr);
++ t_Error (*f_FM_MAC_AddExactMatchMacAddr) (t_Handle h_FmMac, t_EnetAddr *p_EnetAddr);
++ t_Error (*f_FM_MAC_RemovelExactMatchMacAddr) (t_Handle h_FmMac, t_EnetAddr *p_EnetAddr);
++
++ t_Error (*f_FM_MAC_SetPromiscuous) (t_Handle h_FmMac, bool newVal);
++ t_Error (*f_FM_MAC_AdjustLink) (t_Handle h_FmMac, e_EnetSpeed speed, bool fullDuplex);
++ t_Error (*f_FM_MAC_RestartAutoneg) (t_Handle h_FmMac);
++
++ t_Error (*f_FM_MAC_GetId) (t_Handle h_FmMac, uint32_t *macId);
++
++ t_Error (*f_FM_MAC_GetVersion) (t_Handle h_FmMac, uint32_t *macVersion);
++
++ uint16_t (*f_FM_MAC_GetMaxFrameLength) (t_Handle h_FmMac);
++
++ t_Error (*f_FM_MAC_MII_WritePhyReg)(t_Handle h_FmMac, uint8_t phyAddr, uint8_t reg, uint16_t data);
++ t_Error (*f_FM_MAC_MII_ReadPhyReg)(t_Handle h_FmMac, uint8_t phyAddr, uint8_t reg, uint16_t *p_Data);
++
++#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
++ t_Error (*f_FM_MAC_DumpRegs) (t_Handle h_FmMac);
++#endif /* (defined(DEBUG_ERRORS) && ... */
++
++ t_Handle h_Fm;
++ t_FmRevisionInfo fmRevInfo;
++ e_EnetMode enetMode;
++ uint8_t macId;
++ bool resetOnInit;
++ uint16_t clkFreq;
++} t_FmMacControllerDriver;
++
++
++#if (DPAA_VERSION == 10)
++t_Handle DTSEC_Config(t_FmMacParams *p_FmMacParam);
++t_Handle TGEC_Config(t_FmMacParams *p_FmMacParams);
++#else
++t_Handle MEMAC_Config(t_FmMacParams *p_FmMacParam);
++#endif /* (DPAA_VERSION == 10) */
++uint16_t FM_MAC_GetMaxFrameLength(t_Handle FmMac);
++
++
++/* ........................................................................... */
++
++static __inline__ t_EthHashEntry *DequeueAddrFromHashEntry(t_List *p_AddrLst)
++{
++ t_EthHashEntry *p_HashEntry = NULL;
++ if (!LIST_IsEmpty(p_AddrLst))
++ {
++ p_HashEntry = ETH_HASH_ENTRY_OBJ(p_AddrLst->p_Next);
++ LIST_DelAndInit(&p_HashEntry->node);
++ }
++ return p_HashEntry;
++}
++
++/* ........................................................................... */
++
++static __inline__ void FreeHashTable(t_EthHash *p_Hash)
++{
++ t_EthHashEntry *p_HashEntry;
++ int i = 0;
++
++ if (p_Hash)
++ {
++ if (p_Hash->p_Lsts)
++ {
++ for (i=0; isize; i++)
++ {
++ p_HashEntry = DequeueAddrFromHashEntry(&p_Hash->p_Lsts[i]);
++ while (p_HashEntry)
++ {
++ XX_Free(p_HashEntry);
++ p_HashEntry = DequeueAddrFromHashEntry(&p_Hash->p_Lsts[i]);
++ }
++ }
++
++ XX_Free(p_Hash->p_Lsts);
++ }
++
++ XX_Free(p_Hash);
++ }
++}
++
++/* ........................................................................... */
++
++static __inline__ t_EthHash * AllocHashTable(uint16_t size)
++{
++ uint32_t i;
++ t_EthHash *p_Hash;
++
++ /* Allocate address hash table */
++ p_Hash = (t_EthHash *)XX_Malloc(size*sizeof(t_EthHash *));
++ if (!p_Hash)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("Address hash table"));
++ return NULL;
++ }
++ p_Hash->size = size;
++
++ p_Hash->p_Lsts = (t_List *)XX_Malloc(p_Hash->size*sizeof(t_List));
++ if (!p_Hash->p_Lsts)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("Address hash table"));
++ XX_Free(p_Hash);
++ return NULL;
++ }
++
++ for (i=0 ; isize; i++)
++ INIT_LIST(&p_Hash->p_Lsts[i]);
++
++ return p_Hash;
++}
++
++
++#endif /* __FM_MAC_H */
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fman_crc32.c b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fman_crc32.c
+new file mode 100644
+index 0000000..b6a4ca2
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fman_crc32.c
+@@ -0,0 +1,119 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++#include "fman_crc32.h"
++#include "common/general.h"
++
++
++/* precomputed CRC values for address hashing */
++static const uint32_t crc_tbl[256] = {
++ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
++ 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
++ 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
++ 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
++ 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
++ 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
++ 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
++ 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
++ 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
++ 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
++ 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
++ 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
++ 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
++ 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
++ 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
++ 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
++ 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
++ 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
++ 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
++ 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
++ 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
++ 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
++ 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
++ 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
++ 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
++ 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
++ 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
++ 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
++ 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
++ 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
++ 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
++ 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
++ 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
++ 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
++ 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
++ 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
++ 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
++ 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
++ 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
++ 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
++ 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
++ 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
++ 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
++};
++
++/* Get the mirrored value of a byte size number. (0x11010011 --> 0x11001011) */
++static inline uint8_t get_mirror8(uint8_t n)
++{
++ uint8_t mirror[16] = {
++ 0x00, 0x08, 0x04, 0x0c, 0x02, 0x0a, 0x06, 0x0e,
++ 0x01, 0x09, 0x05, 0x0d, 0x03, 0x0b, 0x07, 0x0f
++ };
++ return (uint8_t)(((mirror[n & 0x0f] << 4) | (mirror[n >> 4])));
++}
++
++static inline uint32_t get_mirror32(uint32_t n)
++{
++ return ((uint32_t)get_mirror8((uint8_t)(n))<<24) |
++ ((uint32_t)get_mirror8((uint8_t)(n>>8))<<16) |
++ ((uint32_t)get_mirror8((uint8_t)(n>>16))<<8) |
++ ((uint32_t)get_mirror8((uint8_t)(n>>24)));
++}
++
++uint32_t get_mac_addr_crc(uint64_t _addr)
++{
++ uint32_t i;
++ uint8_t data;
++ uint32_t crc;
++
++ /* CRC calculation */
++ crc = 0xffffffff;
++ for (i = 0; i < 6; i++) {
++ data = (uint8_t)(_addr >> ((5-i)*8));
++ crc = crc ^ data;
++ crc = crc_tbl[crc&0xff] ^ (crc>>8);
++ }
++
++ crc = get_mirror32(crc);
++ return crc;
++}
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fman_crc32.h b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fman_crc32.h
+new file mode 100644
+index 0000000..6e32fdc
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fman_crc32.h
+@@ -0,0 +1,43 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++#ifndef __FMAN_CRC32_H
++#define __FMAN_CRC32_H
++
++#include "common/general.h"
++
++
++uint32_t get_mac_addr_crc(uint64_t _addr);
++
++
++#endif /* __FMAN_CRC32_H */
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fman_dtsec.c b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fman_dtsec.c
+new file mode 100644
+index 0000000..2ba8554
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fman_dtsec.c
+@@ -0,0 +1,818 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++#include "fsl_fman_dtsec.h"
++
++
++void dtsec_stop_rx(struct dtsec_regs *regs)
++{
++ /* Assert the graceful stop bit */
++ iowrite32be(ioread32be(®s->rctrl) | RCTRL_GRS, ®s->rctrl);
++}
++
++void dtsec_stop_tx(struct dtsec_regs *regs)
++{
++ /* Assert the graceful stop bit */
++ iowrite32be(ioread32be(®s->tctrl) | DTSEC_TCTRL_GTS, ®s->tctrl);
++}
++
++void dtsec_start_tx(struct dtsec_regs *regs)
++{
++ /* clear the graceful stop bit */
++ iowrite32be(ioread32be(®s->tctrl) & ~DTSEC_TCTRL_GTS, ®s->tctrl);
++}
++
++void dtsec_start_rx(struct dtsec_regs *regs)
++{
++ /* clear the graceful stop bit */
++ iowrite32be(ioread32be(®s->rctrl) & ~RCTRL_GRS, ®s->rctrl);
++}
++
++void dtsec_defconfig(struct dtsec_cfg *cfg)
++{
++ cfg->halfdup_on = DEFAULT_HALFDUP_ON;
++ cfg->halfdup_retransmit = DEFAULT_HALFDUP_RETRANSMIT;
++ cfg->halfdup_coll_window = DEFAULT_HALFDUP_COLL_WINDOW;
++ cfg->halfdup_excess_defer = DEFAULT_HALFDUP_EXCESS_DEFER;
++ cfg->halfdup_no_backoff = DEFAULT_HALFDUP_NO_BACKOFF;
++ cfg->halfdup_bp_no_backoff = DEFAULT_HALFDUP_BP_NO_BACKOFF;
++ cfg->halfdup_alt_backoff_val = DEFAULT_HALFDUP_ALT_BACKOFF_VAL;
++ cfg->halfdup_alt_backoff_en = DEFAULT_HALFDUP_ALT_BACKOFF_EN;
++ cfg->rx_drop_bcast = DEFAULT_RX_DROP_BCAST;
++ cfg->rx_short_frm = DEFAULT_RX_SHORT_FRM;
++ cfg->rx_len_check = DEFAULT_RX_LEN_CHECK;
++ cfg->tx_pad_crc = DEFAULT_TX_PAD_CRC;
++ cfg->tx_crc = DEFAULT_TX_CRC;
++ cfg->rx_ctrl_acc = DEFAULT_RX_CTRL_ACC;
++ cfg->tx_pause_time = DEFAULT_TX_PAUSE_TIME;
++ cfg->tbipa = DEFAULT_TBIPA; /* PHY address 0 is reserved (DPAA RM)*/
++ cfg->rx_prepend = DEFAULT_RX_PREPEND;
++ cfg->ptp_tsu_en = DEFAULT_PTP_TSU_EN;
++ cfg->ptp_exception_en = DEFAULT_PTP_EXCEPTION_EN;
++ cfg->preamble_len = DEFAULT_PREAMBLE_LEN;
++ cfg->rx_preamble = DEFAULT_RX_PREAMBLE;
++ cfg->tx_preamble = DEFAULT_TX_PREAMBLE;
++ cfg->loopback = DEFAULT_LOOPBACK;
++ cfg->rx_time_stamp_en = DEFAULT_RX_TIME_STAMP_EN;
++ cfg->tx_time_stamp_en = DEFAULT_TX_TIME_STAMP_EN;
++ cfg->rx_flow = DEFAULT_RX_FLOW;
++ cfg->tx_flow = DEFAULT_TX_FLOW;
++ cfg->rx_group_hash_exd = DEFAULT_RX_GROUP_HASH_EXD;
++ cfg->tx_pause_time_extd = DEFAULT_TX_PAUSE_TIME_EXTD;
++ cfg->rx_promisc = DEFAULT_RX_PROMISC;
++ cfg->non_back_to_back_ipg1 = DEFAULT_NON_BACK_TO_BACK_IPG1;
++ cfg->non_back_to_back_ipg2 = DEFAULT_NON_BACK_TO_BACK_IPG2;
++ cfg->min_ifg_enforcement = DEFAULT_MIN_IFG_ENFORCEMENT;
++ cfg->back_to_back_ipg = DEFAULT_BACK_TO_BACK_IPG;
++ cfg->maximum_frame = DEFAULT_MAXIMUM_FRAME;
++ cfg->tbi_phy_addr = DEFAULT_TBI_PHY_ADDR;
++}
++
++int dtsec_init(struct dtsec_regs *regs, struct dtsec_cfg *cfg,
++ enum enet_interface iface_mode,
++ enum enet_speed iface_speed,
++ uint8_t *macaddr,
++ uint8_t fm_rev_maj,
++ uint8_t fm_rev_min,
++ uint32_t exception_mask)
++{
++ bool is_rgmii = FALSE;
++ bool is_sgmii = FALSE;
++ bool is_qsgmii = FALSE;
++ int i;
++ uint32_t tmp;
++
++UNUSED(fm_rev_maj);UNUSED(fm_rev_min);
++
++ /* let's start with a soft reset */
++ iowrite32be(MACCFG1_SOFT_RESET, ®s->maccfg1);
++ iowrite32be(0, ®s->maccfg1);
++
++ /*************dtsec_id2******************/
++ tmp = ioread32be(®s->tsec_id2);
++
++ /* check RGMII support */
++ if (iface_mode == E_ENET_IF_RGMII ||
++ iface_mode == E_ENET_IF_RMII)
++ if (tmp & DTSEC_ID2_INT_REDUCED_OFF)
++ return -EINVAL;
++
++ if (iface_mode == E_ENET_IF_SGMII ||
++ iface_mode == E_ENET_IF_MII)
++ if (tmp & DTSEC_ID2_INT_REDUCED_OFF)
++ return -EINVAL;
++
++ /***************ECNTRL************************/
++
++ is_rgmii = (bool)((iface_mode == E_ENET_IF_RGMII) ? TRUE : FALSE);
++ is_sgmii = (bool)((iface_mode == E_ENET_IF_SGMII) ? TRUE : FALSE);
++ is_qsgmii = (bool)((iface_mode == E_ENET_IF_QSGMII) ? TRUE : FALSE);
++
++ tmp = 0;
++ if (is_rgmii || iface_mode == E_ENET_IF_GMII)
++ tmp |= DTSEC_ECNTRL_GMIIM;
++ if (is_sgmii)
++ tmp |= (DTSEC_ECNTRL_SGMIIM | DTSEC_ECNTRL_TBIM);
++ if (is_qsgmii)
++ tmp |= (DTSEC_ECNTRL_SGMIIM | DTSEC_ECNTRL_TBIM |
++ DTSEC_ECNTRL_QSGMIIM);
++ if (is_rgmii)
++ tmp |= DTSEC_ECNTRL_RPM;
++ if (iface_speed == E_ENET_SPEED_100)
++ tmp |= DTSEC_ECNTRL_R100M;
++
++ iowrite32be(tmp, ®s->ecntrl);
++ /***************ECNTRL************************/
++
++ /***************TCTRL************************/
++ tmp = 0;
++ if (cfg->halfdup_on)
++ tmp |= DTSEC_TCTRL_THDF;
++ if (cfg->tx_time_stamp_en)
++ tmp |= DTSEC_TCTRL_TTSE;
++
++ iowrite32be(tmp, ®s->tctrl);
++
++ /***************TCTRL************************/
++
++ /***************PTV************************/
++ tmp = 0;
++
++#ifdef FM_SHORT_PAUSE_TIME_ERRATA_DTSEC1
++ if ((fm_rev_maj == 1) && (fm_rev_min == 0))
++ cfg->tx_pause_time += 2;
++#endif /* FM_SHORT_PAUSE_TIME_ERRATA_DTSEC1 */
++
++ if (cfg->tx_pause_time)
++ tmp |= cfg->tx_pause_time;
++ if (cfg->tx_pause_time_extd)
++ tmp |= cfg->tx_pause_time_extd << PTV_PTE_OFST;
++ iowrite32be(tmp, ®s->ptv);
++
++ /***************RCTRL************************/
++ tmp = 0;
++ tmp |= ((uint32_t)(cfg->rx_prepend & 0x0000001f)) << 16;
++ if (cfg->rx_ctrl_acc)
++ tmp |= RCTRL_CFA;
++ if (cfg->rx_group_hash_exd)
++ tmp |= RCTRL_GHTX;
++ if (cfg->rx_time_stamp_en)
++ tmp |= RCTRL_RTSE;
++ if (cfg->rx_drop_bcast)
++ tmp |= RCTRL_BC_REJ;
++ if (cfg->rx_short_frm)
++ tmp |= RCTRL_RSF;
++ if (cfg->rx_promisc)
++ tmp |= RCTRL_PROM;
++
++ iowrite32be(tmp, ®s->rctrl);
++ /***************RCTRL************************/
++
++ /*
++ * Assign a Phy Address to the TBI (TBIPA).
++ * Done also in cases where TBI is not selected to avoid conflict with
++ * the external PHY's Physical address
++ */
++ iowrite32be(cfg->tbipa, ®s->tbipa);
++
++ /***************TMR_CTL************************/
++ iowrite32be(0, ®s->tmr_ctrl);
++
++ if (cfg->ptp_tsu_en) {
++ tmp = 0;
++ tmp |= TMR_PEVENT_TSRE;
++ iowrite32be(tmp, ®s->tmr_pevent);
++
++ if (cfg->ptp_exception_en) {
++ tmp = 0;
++ tmp |= TMR_PEMASK_TSREEN;
++ iowrite32be(tmp, ®s->tmr_pemask);
++ }
++ }
++
++ /***************MACCFG1***********************/
++ tmp = 0;
++ if (cfg->loopback)
++ tmp |= MACCFG1_LOOPBACK;
++ if (cfg->rx_flow)
++ tmp |= MACCFG1_RX_FLOW;
++ if (cfg->tx_flow)
++ tmp |= MACCFG1_TX_FLOW;
++ iowrite32be(tmp, ®s->maccfg1);
++
++ /***************MACCFG1***********************/
++
++ /***************MACCFG2***********************/
++ tmp = 0;
++
++ if (iface_speed < E_ENET_SPEED_1000)
++ tmp |= MACCFG2_NIBBLE_MODE;
++ else if (iface_speed == E_ENET_SPEED_1000)
++ tmp |= MACCFG2_BYTE_MODE;
++
++ tmp |= ((uint32_t) cfg->preamble_len & 0x0000000f)
++ << PREAMBLE_LENGTH_SHIFT;
++
++ if (cfg->rx_preamble)
++ tmp |= MACCFG2_PRE_AM_Rx_EN;
++ if (cfg->tx_preamble)
++ tmp |= MACCFG2_PRE_AM_Tx_EN;
++ if (cfg->rx_len_check)
++ tmp |= MACCFG2_LENGTH_CHECK;
++ if (cfg->tx_pad_crc)
++ tmp |= MACCFG2_PAD_CRC_EN;
++ if (cfg->tx_crc)
++ tmp |= MACCFG2_CRC_EN;
++ if (!cfg->halfdup_on)
++ tmp |= MACCFG2_FULL_DUPLEX;
++ iowrite32be(tmp, ®s->maccfg2);
++
++ /***************MACCFG2***********************/
++
++ /***************IPGIFG************************/
++ tmp = 0;
++ tmp = (((cfg->non_back_to_back_ipg1 <<
++ IPGIFG_NON_BACK_TO_BACK_IPG_1_SHIFT)
++ & IPGIFG_NON_BACK_TO_BACK_IPG_1)
++ | ((cfg->non_back_to_back_ipg2 <<
++ IPGIFG_NON_BACK_TO_BACK_IPG_2_SHIFT)
++ & IPGIFG_NON_BACK_TO_BACK_IPG_2)
++ | ((cfg->min_ifg_enforcement <<
++ IPGIFG_MIN_IFG_ENFORCEMENT_SHIFT)
++ & IPGIFG_MIN_IFG_ENFORCEMENT)
++ | (cfg->back_to_back_ipg & IPGIFG_BACK_TO_BACK_IPG));
++ iowrite32be(tmp, ®s->ipgifg);
++
++ /***************IPGIFG************************/
++
++ /***************HAFDUP************************/
++ tmp = 0;
++
++ if (cfg->halfdup_alt_backoff_en)
++ tmp = (uint32_t)(HAFDUP_ALT_BEB |
++ ((cfg->halfdup_alt_backoff_val & 0x0000000f)
++ << HAFDUP_ALTERNATE_BEB_TRUNCATION_SHIFT));
++ if (cfg->halfdup_bp_no_backoff)
++ tmp |= HAFDUP_BP_NO_BACKOFF;
++ if (cfg->halfdup_no_backoff)
++ tmp |= HAFDUP_NO_BACKOFF;
++ if (cfg->halfdup_excess_defer)
++ tmp |= HAFDUP_EXCESS_DEFER;
++ tmp |= ((cfg->halfdup_retransmit << HAFDUP_RETRANSMISSION_MAX_SHIFT)
++ & HAFDUP_RETRANSMISSION_MAX);
++ tmp |= (cfg->halfdup_coll_window & HAFDUP_COLLISION_WINDOW);
++
++ iowrite32be(tmp, ®s->hafdup);
++ /***************HAFDUP************************/
++
++ /***************MAXFRM************************/
++ /* Initialize MAXFRM */
++ iowrite32be(cfg->maximum_frame, ®s->maxfrm);
++
++ /***************MAXFRM************************/
++
++ /***************CAM1************************/
++ iowrite32be(0xffffffff, ®s->cam1);
++ iowrite32be(0xffffffff, ®s->cam2);
++
++ /***************IMASK************************/
++ iowrite32be(exception_mask, ®s->imask);
++ /***************IMASK************************/
++
++ /***************IEVENT************************/
++ iowrite32be(0xffffffff, ®s->ievent);
++
++ /***************MACSTNADDR1/2*****************/
++
++ tmp = (uint32_t)((macaddr[5] << 24) |
++ (macaddr[4] << 16) |
++ (macaddr[3] << 8) |
++ macaddr[2]);
++ iowrite32be(tmp, ®s->macstnaddr1);
++
++ tmp = (uint32_t)((macaddr[1] << 24) |
++ (macaddr[0] << 16));
++ iowrite32be(tmp, ®s->macstnaddr2);
++
++ /***************MACSTNADDR1/2*****************/
++
++ /*****************HASH************************/
++ for (i = 0; i < NUM_OF_HASH_REGS ; i++) {
++ /* Initialize IADDRx */
++ iowrite32be(0, ®s->igaddr[i]);
++ /* Initialize GADDRx */
++ iowrite32be(0, ®s->gaddr[i]);
++ }
++
++ dtsec_reset_stat(regs);
++
++ return 0;
++}
++
++uint16_t dtsec_get_max_frame_len(struct dtsec_regs *regs)
++{
++ return (uint16_t)ioread32be(®s->maxfrm);
++}
++
++void dtsec_set_max_frame_len(struct dtsec_regs *regs, uint16_t length)
++{
++ iowrite32be(length, ®s->maxfrm);
++}
++
++void dtsec_set_mac_address(struct dtsec_regs *regs, uint8_t *adr)
++{
++ uint32_t tmp;
++
++ tmp = (uint32_t)((adr[5] << 24) |
++ (adr[4] << 16) |
++ (adr[3] << 8) |
++ adr[2]);
++ iowrite32be(tmp, ®s->macstnaddr1);
++
++ tmp = (uint32_t)((adr[1] << 24) |
++ (adr[0] << 16));
++ iowrite32be(tmp, ®s->macstnaddr2);
++}
++
++void dtsec_get_mac_address(struct dtsec_regs *regs, uint8_t *macaddr)
++{
++ uint32_t tmp1, tmp2;
++
++ tmp1 = ioread32be(®s->macstnaddr1);
++ tmp2 = ioread32be(®s->macstnaddr2);
++
++ macaddr[0] = (uint8_t)((tmp2 & 0x00ff0000) >> 16);
++ macaddr[1] = (uint8_t)((tmp2 & 0xff000000) >> 24);
++ macaddr[2] = (uint8_t)(tmp1 & 0x000000ff);
++ macaddr[3] = (uint8_t)((tmp1 & 0x0000ff00) >> 8);
++ macaddr[4] = (uint8_t)((tmp1 & 0x00ff0000) >> 16);
++ macaddr[5] = (uint8_t)((tmp1 & 0xff000000) >> 24);
++}
++
++void dtsec_set_bucket(struct dtsec_regs *regs, int bucket, bool enable)
++{
++ int reg_idx = (bucket >> 5) & 0xf;
++ int bit_idx = bucket & 0x1f;
++ uint32_t bit_mask = 0x80000000 >> bit_idx;
++ uint32_t *reg;
++
++ if (reg_idx > 7)
++ reg = ®s->gaddr[reg_idx-8];
++ else
++ reg = ®s->igaddr[reg_idx];
++
++ if (enable)
++ iowrite32be(ioread32be(reg) | bit_mask, reg);
++ else
++ iowrite32be(ioread32be(reg) & (~bit_mask), reg);
++}
++
++void dtsec_reset_filter_table(struct dtsec_regs *regs, bool mcast, bool ucast)
++{
++ int i;
++ bool ghtx;
++
++ ghtx = (bool)((ioread32be(®s->rctrl) & RCTRL_GHTX) ? TRUE : FALSE);
++
++ if (ucast || (ghtx && mcast)) {
++ for (i = 0; i < NUM_OF_HASH_REGS; i++)
++ iowrite32be(0, ®s->igaddr[i]);
++ }
++ if (mcast) {
++ for (i = 0; i < NUM_OF_HASH_REGS; i++)
++ iowrite32be(0, ®s->gaddr[i]);
++ }
++}
++
++int dtsec_set_tbi_phy_addr(struct dtsec_regs *regs,
++ uint8_t addr)
++{
++ if (addr > 0 && addr < 32)
++ iowrite32be(addr, ®s->tbipa);
++ else
++ return -EINVAL;
++
++ return 0;
++}
++
++int dtsec_adjust_link(struct dtsec_regs *regs,
++ enum enet_interface iface_mode,
++ enum enet_speed speed, bool full_dx)
++{
++ uint32_t tmp;
++
++ if ((speed == E_ENET_SPEED_1000) && !full_dx)
++ return -EINVAL;
++
++ tmp = ioread32be(®s->maccfg2);
++ if (!full_dx)
++ tmp &= ~MACCFG2_FULL_DUPLEX;
++ else
++ tmp |= MACCFG2_FULL_DUPLEX;
++
++ tmp &= ~(MACCFG2_NIBBLE_MODE | MACCFG2_BYTE_MODE);
++ if (speed < E_ENET_SPEED_1000)
++ tmp |= MACCFG2_NIBBLE_MODE;
++ else if (speed == E_ENET_SPEED_1000)
++ tmp |= MACCFG2_BYTE_MODE;
++ iowrite32be(tmp, ®s->maccfg2);
++
++ tmp = ioread32be(®s->ecntrl);
++ if (speed == E_ENET_SPEED_100)
++ tmp |= DTSEC_ECNTRL_R100M;
++ else
++ tmp &= ~DTSEC_ECNTRL_R100M;
++ iowrite32be(tmp, ®s->ecntrl);
++
++ return 0;
++}
++
++void dtsec_set_uc_promisc(struct dtsec_regs *regs, bool enable)
++{
++ uint32_t tmp;
++
++ tmp = ioread32be(®s->rctrl);
++
++ if (enable)
++ tmp |= RCTRL_UPROM;
++ else
++ tmp &= ~RCTRL_UPROM;
++
++ iowrite32be(tmp, ®s->rctrl);
++}
++
++void dtsec_set_mc_promisc(struct dtsec_regs *regs, bool enable)
++{
++ uint32_t tmp;
++
++ tmp = ioread32be(®s->rctrl);
++
++ if (enable)
++ tmp |= RCTRL_MPROM;
++ else
++ tmp &= ~RCTRL_MPROM;
++
++ iowrite32be(tmp, ®s->rctrl);
++}
++
++bool dtsec_get_clear_carry_regs(struct dtsec_regs *regs,
++ uint32_t *car1, uint32_t *car2)
++{
++ /* read carry registers */
++ *car1 = ioread32be(®s->car1);
++ *car2 = ioread32be(®s->car2);
++ /* clear carry registers */
++ if (*car1)
++ iowrite32be(*car1, ®s->car1);
++ if (*car2)
++ iowrite32be(*car2, ®s->car2);
++
++ return (bool)((*car1 | *car2) ? TRUE : FALSE);
++}
++
++
++void dtsec_reset_stat(struct dtsec_regs *regs)
++{
++ /* clear HW counters */
++ iowrite32be(ioread32be(®s->ecntrl) |
++ DTSEC_ECNTRL_CLRCNT, ®s->ecntrl);
++}
++
++int dtsec_set_stat_level(struct dtsec_regs *regs, enum mac_stat_level level)
++{
++ switch (level) {
++ case E_MAC_STAT_NONE:
++ iowrite32be(0xffffffff, ®s->cam1);
++ iowrite32be(0xffffffff, ®s->cam2);
++ iowrite32be(ioread32be(®s->ecntrl) & ~DTSEC_ECNTRL_STEN,
++ ®s->ecntrl);
++ iowrite32be(ioread32be(®s->imask) & ~DTSEC_IMASK_MSROEN,
++ ®s->imask);
++ break;
++ case E_MAC_STAT_PARTIAL:
++ iowrite32be(CAM1_ERRORS_ONLY, ®s->cam1);
++ iowrite32be(CAM2_ERRORS_ONLY, ®s->cam2);
++ iowrite32be(ioread32be(®s->ecntrl) | DTSEC_ECNTRL_STEN,
++ ®s->ecntrl);
++ iowrite32be(ioread32be(®s->imask) | DTSEC_IMASK_MSROEN,
++ ®s->imask);
++ break;
++ case E_MAC_STAT_MIB_GRP1:
++ iowrite32be((uint32_t)~CAM1_MIB_GRP_1, ®s->cam1);
++ iowrite32be((uint32_t)~CAM2_MIB_GRP_1, ®s->cam2);
++ iowrite32be(ioread32be(®s->ecntrl) | DTSEC_ECNTRL_STEN,
++ ®s->ecntrl);
++ iowrite32be(ioread32be(®s->imask) | DTSEC_IMASK_MSROEN,
++ ®s->imask);
++ break;
++ case E_MAC_STAT_FULL:
++ iowrite32be(0, ®s->cam1);
++ iowrite32be(0, ®s->cam2);
++ iowrite32be(ioread32be(®s->ecntrl) | DTSEC_ECNTRL_STEN,
++ ®s->ecntrl);
++ iowrite32be(ioread32be(®s->imask) | DTSEC_IMASK_MSROEN,
++ ®s->imask);
++ break;
++ default:
++ return -EINVAL;
++ }
++
++ return 0;
++}
++
++void dtsec_set_ts(struct dtsec_regs *regs, bool en)
++{
++ if (en) {
++ iowrite32be(ioread32be(®s->rctrl) | RCTRL_RTSE,
++ ®s->rctrl);
++ iowrite32be(ioread32be(®s->tctrl) | DTSEC_TCTRL_TTSE,
++ ®s->tctrl);
++ } else {
++ iowrite32be(ioread32be(®s->rctrl) & ~RCTRL_RTSE,
++ ®s->rctrl);
++ iowrite32be(ioread32be(®s->tctrl) & ~DTSEC_TCTRL_TTSE,
++ ®s->tctrl);
++ }
++}
++
++void dtsec_enable(struct dtsec_regs *regs, bool apply_rx, bool apply_tx)
++{
++ uint32_t tmp;
++
++ tmp = ioread32be(®s->maccfg1);
++
++ if (apply_rx)
++ tmp |= MACCFG1_RX_EN ;
++
++ if (apply_tx)
++ tmp |= MACCFG1_TX_EN ;
++
++ iowrite32be(tmp, ®s->maccfg1);
++}
++
++void dtsec_clear_addr_in_paddr(struct dtsec_regs *regs, uint8_t paddr_num)
++{
++ iowrite32be(0, ®s->macaddr[paddr_num].exact_match1);
++ iowrite32be(0, ®s->macaddr[paddr_num].exact_match2);
++}
++
++void dtsec_add_addr_in_paddr(struct dtsec_regs *regs,
++ uint64_t addr,
++ uint8_t paddr_num)
++{
++ uint32_t tmp;
++
++ tmp = (uint32_t)(addr);
++ /* swap */
++ tmp = (((tmp & 0x000000FF) << 24) |
++ ((tmp & 0x0000FF00) << 8) |
++ ((tmp & 0x00FF0000) >> 8) |
++ ((tmp & 0xFF000000) >> 24));
++ iowrite32be(tmp, ®s->macaddr[paddr_num].exact_match1);
++
++ tmp = (uint32_t)(addr>>32);
++ /* swap */
++ tmp = (((tmp & 0x000000FF) << 24) |
++ ((tmp & 0x0000FF00) << 8) |
++ ((tmp & 0x00FF0000) >> 8) |
++ ((tmp & 0xFF000000) >> 24));
++ iowrite32be(tmp, ®s->macaddr[paddr_num].exact_match2);
++}
++
++void dtsec_disable(struct dtsec_regs *regs, bool apply_rx, bool apply_tx)
++{
++ uint32_t tmp;
++
++ tmp = ioread32be(®s->maccfg1);
++
++ if (apply_rx)
++ tmp &= ~MACCFG1_RX_EN;
++
++ if (apply_tx)
++ tmp &= ~MACCFG1_TX_EN;
++
++ iowrite32be(tmp, ®s->maccfg1);
++}
++
++void dtsec_set_tx_pause_time(struct dtsec_regs *regs, uint16_t time)
++{
++ uint32_t ptv = 0;
++
++ /* fixme: don't enable tx pause for half-duplex */
++
++ if (time) {
++ ptv = ioread32be(®s->ptv);
++ ptv &= 0xffff0000;
++ ptv |= time & 0x0000ffff;
++ iowrite32be(ptv, ®s->ptv);
++
++ /* trigger the transmission of a flow-control pause frame */
++ iowrite32be(ioread32be(®s->maccfg1) | MACCFG1_TX_FLOW,
++ ®s->maccfg1);
++ } else
++ iowrite32be(ioread32be(®s->maccfg1) & ~MACCFG1_TX_FLOW,
++ ®s->maccfg1);
++}
++
++void dtsec_handle_rx_pause(struct dtsec_regs *regs, bool en)
++{
++ uint32_t tmp;
++
++ /* todo: check if mac is set to full-duplex */
++
++ tmp = ioread32be(®s->maccfg1);
++ if (en)
++ tmp |= MACCFG1_RX_FLOW;
++ else
++ tmp &= ~MACCFG1_RX_FLOW;
++ iowrite32be(tmp, ®s->maccfg1);
++}
++
++uint32_t dtsec_get_rctrl(struct dtsec_regs *regs)
++{
++ return ioread32be(®s->rctrl);
++}
++
++uint32_t dtsec_get_revision(struct dtsec_regs *regs)
++{
++ return ioread32be(®s->tsec_id);
++}
++
++uint32_t dtsec_get_event(struct dtsec_regs *regs, uint32_t ev_mask)
++{
++ return ioread32be(®s->ievent) & ev_mask;
++}
++
++void dtsec_ack_event(struct dtsec_regs *regs, uint32_t ev_mask)
++{
++ iowrite32be(ev_mask, ®s->ievent);
++}
++
++uint32_t dtsec_get_interrupt_mask(struct dtsec_regs *regs)
++{
++ return ioread32be(®s->imask);
++}
++
++uint32_t dtsec_check_and_clear_tmr_event(struct dtsec_regs *regs)
++{
++ uint32_t event;
++
++ event = ioread32be(®s->tmr_pevent);
++ event &= ioread32be(®s->tmr_pemask);
++
++ if (event)
++ iowrite32be(event, ®s->tmr_pevent);
++ return event;
++}
++
++void dtsec_enable_tmr_interrupt(struct dtsec_regs *regs)
++{
++ iowrite32be(ioread32be(®s->tmr_pemask) | TMR_PEMASK_TSREEN,
++ ®s->tmr_pemask);
++}
++
++void dtsec_disable_tmr_interrupt(struct dtsec_regs *regs)
++{
++ iowrite32be(ioread32be(®s->tmr_pemask) & ~TMR_PEMASK_TSREEN,
++ ®s->tmr_pemask);
++}
++
++void dtsec_enable_interrupt(struct dtsec_regs *regs, uint32_t ev_mask)
++{
++ iowrite32be(ioread32be(®s->imask) | ev_mask, ®s->imask);
++}
++
++void dtsec_disable_interrupt(struct dtsec_regs *regs, uint32_t ev_mask)
++{
++ iowrite32be(ioread32be(®s->imask) & ~ev_mask, ®s->imask);
++}
++
++uint32_t dtsec_get_stat_counter(struct dtsec_regs *regs,
++ enum dtsec_stat_counters reg_name)
++{
++ uint32_t ret_val;
++
++ switch (reg_name) {
++ case E_DTSEC_STAT_TR64:
++ ret_val = ioread32be(®s->tr64);
++ break;
++ case E_DTSEC_STAT_TR127:
++ ret_val = ioread32be(®s->tr127);
++ break;
++ case E_DTSEC_STAT_TR255:
++ ret_val = ioread32be(®s->tr255);
++ break;
++ case E_DTSEC_STAT_TR511:
++ ret_val = ioread32be(®s->tr511);
++ break;
++ case E_DTSEC_STAT_TR1K:
++ ret_val = ioread32be(®s->tr1k);
++ break;
++ case E_DTSEC_STAT_TRMAX:
++ ret_val = ioread32be(®s->trmax);
++ break;
++ case E_DTSEC_STAT_TRMGV:
++ ret_val = ioread32be(®s->trmgv);
++ break;
++ case E_DTSEC_STAT_RBYT:
++ ret_val = ioread32be(®s->rbyt);
++ break;
++ case E_DTSEC_STAT_RPKT:
++ ret_val = ioread32be(®s->rpkt);
++ break;
++ case E_DTSEC_STAT_RMCA:
++ ret_val = ioread32be(®s->rmca);
++ break;
++ case E_DTSEC_STAT_RBCA:
++ ret_val = ioread32be(®s->rbca);
++ break;
++ case E_DTSEC_STAT_RXPF:
++ ret_val = ioread32be(®s->rxpf);
++ break;
++ case E_DTSEC_STAT_RALN:
++ ret_val = ioread32be(®s->raln);
++ break;
++ case E_DTSEC_STAT_RFLR:
++ ret_val = ioread32be(®s->rflr);
++ break;
++ case E_DTSEC_STAT_RCDE:
++ ret_val = ioread32be(®s->rcde);
++ break;
++ case E_DTSEC_STAT_RCSE:
++ ret_val = ioread32be(®s->rcse);
++ break;
++ case E_DTSEC_STAT_RUND:
++ ret_val = ioread32be(®s->rund);
++ break;
++ case E_DTSEC_STAT_ROVR:
++ ret_val = ioread32be(®s->rovr);
++ break;
++ case E_DTSEC_STAT_RFRG:
++ ret_val = ioread32be(®s->rfrg);
++ break;
++ case E_DTSEC_STAT_RJBR:
++ ret_val = ioread32be(®s->rjbr);
++ break;
++ case E_DTSEC_STAT_RDRP:
++ ret_val = ioread32be(®s->rdrp);
++ break;
++ case E_DTSEC_STAT_TFCS:
++ ret_val = ioread32be(®s->tfcs);
++ break;
++ case E_DTSEC_STAT_TBYT:
++ ret_val = ioread32be(®s->tbyt);
++ break;
++ case E_DTSEC_STAT_TPKT:
++ ret_val = ioread32be(®s->tpkt);
++ break;
++ case E_DTSEC_STAT_TMCA:
++ ret_val = ioread32be(®s->tmca);
++ break;
++ case E_DTSEC_STAT_TBCA:
++ ret_val = ioread32be(®s->tbca);
++ break;
++ case E_DTSEC_STAT_TXPF:
++ ret_val = ioread32be(®s->txpf);
++ break;
++ case E_DTSEC_STAT_TNCL:
++ ret_val = ioread32be(®s->tncl);
++ break;
++ case E_DTSEC_STAT_TDRP:
++ ret_val = ioread32be(®s->tdrp);
++ break;
++ default:
++ ret_val = 0;
++ }
++
++ return ret_val;
++}
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fman_dtsec_mii_acc.c b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fman_dtsec_mii_acc.c
+new file mode 100644
+index 0000000..82f4997
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fman_dtsec_mii_acc.c
+@@ -0,0 +1,148 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++#include "common/general.h"
++#include "fsl_fman_dtsec_mii_acc.h"
++
++
++/**
++ * dtsec_mii_get_div() - calculates the value of the dtsec mii divider
++ * @dtsec_freq: dtsec clock frequency (in Mhz)
++ *
++ * This function calculates the dtsec mii clock divider that determines
++ * the MII MDC clock. MII MDC clock can work in the range of 2.5 to 12.5 Mhz.
++ * The output of this function is the value of MIIMCFG[MgmtClk] which
++ * implicitly determines the divider value.
++ * Note: the dTSEC system clock is equal to 1/2 of the FMan clock.
++ *
++ * The table below which reflects dtsec_mii_get_div() functionality
++ * shows the relations among dtsec_freq, MgmtClk, actual divider
++ * and the MII frequency:
++ *
++ * dtsec freq MgmtClk div MII freq
++ * [80..159] 0 (1/4)(1/8) [2.5 to 5.0]
++ * [160..319] 1 (1/4)(1/8) [5.0 to 10.0]
++ * [320..479] 2 (1/6)(1/8) [6.7 to 10.0]
++ * [480..639] 3 (1/8)(1/8) [7.5 to 10.0]
++ * [640..799] 4 (1/10)(1/8) [8.0 to 10.0]
++ * [800..959] 5 (1/14)(1/8) [7.1 to 8.5]
++ * [960..1119] 6 (1/20)(1/8) [6.0 to 7.0]
++ * [1120..1279] 7 (1/28)(1/8) [5.0 to 5.7]
++ * [1280..2800] 7 (1/28)(1/8) [5.7 to 12.5]
++ *
++ * Returns: the MIIMCFG[MgmtClk] appropriate value
++ */
++
++static uint8_t dtsec_mii_get_div(uint16_t dtsec_freq)
++{
++ uint16_t mgmt_clk = (uint16_t)(dtsec_freq / 160);
++
++ if (mgmt_clk > 7)
++ mgmt_clk = 7;
++
++ return (uint8_t)mgmt_clk;
++}
++
++void dtsec_mii_reset(struct dtsec_mii_reg *regs)
++{
++ /* Reset the management interface */
++ iowrite32be(ioread32be(®s->miimcfg) | MIIMCFG_RESET_MGMT,
++ ®s->miimcfg);
++ iowrite32be(ioread32be(®s->miimcfg) & ~MIIMCFG_RESET_MGMT,
++ ®s->miimcfg);
++}
++
++void dtsec_mii_init(struct dtsec_mii_reg *regs, uint16_t dtsec_freq)
++{
++ /* Setup the MII Mgmt clock speed */
++ iowrite32be((uint32_t)dtsec_mii_get_div(dtsec_freq), ®s->miimcfg);
++}
++
++int dtsec_mii_write_reg(struct dtsec_mii_reg *regs, uint8_t addr,
++ uint8_t reg, uint16_t data)
++{
++ uint32_t tmp;
++
++ /* Stop the MII management read cycle */
++ iowrite32be(0, ®s->miimcom);
++ /* Dummy read to make sure MIIMCOM is written */
++ tmp = ioread32be(®s->miimcom);
++
++ /* Setting up MII Management Address Register */
++ tmp = (uint32_t)((addr << MIIMADD_PHY_ADDR_SHIFT) | reg);
++ iowrite32be(tmp, ®s->miimadd);
++
++ /* Setting up MII Management Control Register with data */
++ iowrite32be((uint32_t)data, ®s->miimcon);
++ /* Dummy read to make sure MIIMCON is written */
++ tmp = ioread32be(®s->miimcon);
++
++ /* Wait untill MII management write is complete */
++ /* todo: a timeout could be useful here */
++ while ((ioread32be(®s->miimind)) & MIIMIND_BUSY)
++ /* busy wait */;
++
++ return 0;
++}
++
++int dtsec_mii_read_reg(struct dtsec_mii_reg *regs, uint8_t addr,
++ uint8_t reg, uint16_t *data)
++{
++ uint32_t tmp;
++
++ /* Setting up the MII Management Address Register */
++ tmp = (uint32_t)((addr << MIIMADD_PHY_ADDR_SHIFT) | reg);
++ iowrite32be(tmp, ®s->miimadd);
++
++ /* Perform an MII management read cycle */
++ iowrite32be(MIIMCOM_READ_CYCLE, ®s->miimcom);
++ /* Dummy read to make sure MIIMCOM is written */
++ tmp = ioread32be(®s->miimcom);
++
++ /* Wait until MII management read is complete */
++ /* todo: a timeout could be useful here */
++ while ((ioread32be(®s->miimind)) & MIIMIND_BUSY)
++ /* busy wait */;
++
++ /* Read MII management status */
++ *data = (uint16_t)ioread32be(®s->miimstat);
++
++ iowrite32be(0, ®s->miimcom);
++ /* Dummy read to make sure MIIMCOM is written */
++ tmp = ioread32be(®s->miimcom);
++
++ if (*data == 0xffff)
++ return -ENXIO;
++
++ return 0;
++}
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fman_memac.c b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fman_memac.c
+new file mode 100644
+index 0000000..a63d06a
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fman_memac.c
+@@ -0,0 +1,427 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++#include "fsl_fman_memac.h"
++
++
++uint32_t memac_get_event(struct memac_regs *regs, uint32_t ev_mask)
++{
++ return ioread32be(®s->ievent) & ev_mask;
++}
++
++uint32_t memac_get_interrupt_mask(struct memac_regs *regs)
++{
++ return ioread32be(®s->imask);
++}
++
++void memac_ack_event(struct memac_regs *regs, uint32_t ev_mask)
++{
++ iowrite32be(ev_mask, ®s->ievent);
++}
++
++void memac_set_promiscuous(struct memac_regs *regs, bool val)
++{
++ uint32_t tmp;
++
++ tmp = ioread32be(®s->command_config);
++
++ if (val)
++ tmp |= CMD_CFG_PROMIS_EN;
++ else
++ tmp &= ~CMD_CFG_PROMIS_EN;
++
++ iowrite32be(tmp, ®s->command_config);
++}
++
++void memac_hardware_clear_addr_in_paddr(struct memac_regs *regs,
++ uint8_t paddr_num)
++{
++ if (paddr_num == 0) {
++ iowrite32be(0, ®s->mac_addr0.mac_addr_l);
++ iowrite32be(0, ®s->mac_addr0.mac_addr_u);
++ } else {
++ iowrite32be(0x0, ®s->mac_addr[paddr_num - 1].mac_addr_l);
++ iowrite32be(0x0, ®s->mac_addr[paddr_num - 1].mac_addr_u);
++ }
++}
++
++void memac_hardware_add_addr_in_paddr(struct memac_regs *regs,
++ uint8_t *adr,
++ uint8_t paddr_num)
++{
++ uint32_t tmp0, tmp1;
++
++ tmp0 = (uint32_t)(adr[0] |
++ adr[1] << 8 |
++ adr[2] << 16 |
++ adr[3] << 24);
++ tmp1 = (uint32_t)(adr[4] | adr[5] << 8);
++
++ if (paddr_num == 0) {
++ iowrite32be(tmp0, ®s->mac_addr0.mac_addr_l);
++ iowrite32be(tmp1, ®s->mac_addr0.mac_addr_u);
++ } else {
++ iowrite32be(tmp0, ®s->mac_addr[paddr_num-1].mac_addr_l);
++ iowrite32be(tmp1, ®s->mac_addr[paddr_num-1].mac_addr_u);
++ }
++}
++
++void memac_enable(struct memac_regs *regs, bool apply_rx, bool apply_tx)
++{
++ uint32_t tmp;
++
++ tmp = ioread32be(®s->command_config);
++
++ if (apply_rx)
++ tmp |= CMD_CFG_RX_EN;
++
++ if (apply_tx)
++ tmp |= CMD_CFG_TX_EN;
++
++ iowrite32be(tmp, ®s->command_config);
++}
++
++void memac_disable(struct memac_regs *regs, bool apply_rx, bool apply_tx)
++{
++ uint32_t tmp;
++
++ tmp = ioread32be(®s->command_config);
++
++ if (apply_rx)
++ tmp &= ~CMD_CFG_RX_EN;
++
++ if (apply_tx)
++ tmp &= ~CMD_CFG_TX_EN;
++
++ iowrite32be(tmp, ®s->command_config);
++}
++
++void memac_reset_counter(struct memac_regs *regs)
++{
++ uint32_t tmp;
++
++ tmp = ioread32be(®s->statn_config);
++
++ tmp |= STATS_CFG_CLR;
++
++ iowrite32be(tmp, ®s->statn_config);
++
++ while (ioread32be(®s->statn_config) & STATS_CFG_CLR);
++}
++
++void memac_reset(struct memac_regs *regs)
++{
++ uint32_t tmp;
++
++ tmp = ioread32be(®s->command_config);
++
++ tmp |= CMD_CFG_SW_RESET;
++
++ iowrite32be(tmp, ®s->command_config);
++
++ while (ioread32be(®s->command_config) & CMD_CFG_SW_RESET);
++}
++
++void memac_init(struct memac_regs *regs,
++ struct memac_cfg *cfg,
++ enum enet_interface enet_interface,
++ enum enet_speed enet_speed,
++ uint32_t exceptions)
++{
++ uint32_t tmp;
++
++ /* Config */
++ tmp = 0;
++ if (cfg->wan_mode_enable)
++ tmp |= CMD_CFG_WAN_MODE;
++ if (cfg->promiscuous_mode_enable)
++ tmp |= CMD_CFG_PROMIS_EN;
++ if (cfg->pause_forward_enable)
++ tmp |= CMD_CFG_PAUSE_FWD;
++ if (cfg->pause_ignore)
++ tmp |= CMD_CFG_PAUSE_IGNORE;
++ if (cfg->tx_addr_ins_enable)
++ tmp |= CMD_CFG_TX_ADDR_INS;
++ if (cfg->loopback_enable)
++ tmp |= CMD_CFG_LOOPBACK_EN;
++ if (cfg->cmd_frame_enable)
++ tmp |= CMD_CFG_CNT_FRM_EN;
++ if (cfg->send_idle_enable)
++ tmp |= CMD_CFG_SEND_IDLE;
++ if (cfg->no_length_check_enable)
++ tmp |= CMD_CFG_NO_LEN_CHK;
++ if (cfg->rx_sfd_any)
++ tmp |= CMD_CFG_SFD_ANY;
++ if (cfg->pad_enable)
++ tmp |= CMD_CFG_TX_PAD_EN;
++
++ tmp |= CMD_CFG_CRC_FWD;
++
++ iowrite32be(tmp, ®s->command_config);
++
++ /* Max Frame Length */
++ iowrite32be((uint32_t)cfg->max_frame_length, ®s->maxfrm);
++
++ /* Pause Time */
++ iowrite32be(cfg->pause_quanta, ®s->pause_quanta[0]);
++ iowrite32be(0, ®s->pause_thresh[0]);
++
++ /* interrupts */
++ iowrite32be(MEMAC_EVENTS_MASK, ®s->ievent);
++ iowrite32be(exceptions, ®s->imask);
++
++ /* IF_MODE */
++ tmp = 0;
++ switch (enet_interface) {
++ case E_ENET_IF_XGMII:
++ case E_ENET_IF_XFI:
++ tmp |= IF_MODE_XGMII;
++ break;
++ default:
++ tmp |= IF_MODE_GMII;
++ if (enet_interface == E_ENET_IF_RGMII)
++ tmp |= IF_MODE_RGMII | IF_MODE_RGMII_AUTO;
++ }
++ iowrite32be(tmp, ®s->if_mode);
++}
++
++void memac_set_exception(struct memac_regs *regs, uint32_t val, bool enable)
++{
++ uint32_t tmp;
++
++ tmp = ioread32be(®s->imask);
++ if (enable)
++ tmp |= val;
++ else
++ tmp &= ~val;
++
++ iowrite32be(tmp, ®s->imask);
++}
++
++void memac_set_hash_table(struct memac_regs *regs, uint32_t val)
++{
++ iowrite32be(val, ®s->hashtable_ctrl);
++}
++
++uint16_t memac_get_max_frame_length(struct memac_regs *regs)
++{
++ uint32_t tmp;
++
++ tmp = ioread32be(®s->maxfrm);
++
++ return(uint16_t)tmp;
++}
++
++
++void memac_set_tx_pause_frames(struct memac_regs *regs,
++ uint8_t priority,
++ uint16_t pause_time,
++ uint16_t thresh_time)
++{
++ uint32_t tmp;
++
++ tmp = ioread32be(®s->command_config);
++ if (priority == 0xff) {
++ tmp &= ~CMD_CFG_PFC_MODE;
++ priority = 0;
++ }
++ else
++ tmp |= CMD_CFG_PFC_MODE;
++
++ iowrite32be(tmp, ®s->command_config);
++
++ tmp = ioread32be(®s->pause_quanta[priority / 2]);
++ if (priority % 2)
++ tmp &= 0x0000FFFF;
++ else
++ tmp &= 0xFFFF0000;
++ tmp |= ((uint32_t)pause_time << (16 * (priority % 2)));
++ iowrite32be(tmp, ®s->pause_quanta[priority / 2]);
++
++ tmp = ioread32be(®s->pause_thresh[priority / 2]);
++ if (priority % 2)
++ tmp &= 0x0000FFFF;
++ else
++ tmp &= 0xFFFF0000;
++ tmp |= ((uint32_t)thresh_time<<(16 * (priority % 2)));
++ iowrite32be(tmp, ®s->pause_thresh[priority / 2]);
++}
++
++void memac_set_rx_ignore_pause_frames(struct memac_regs *regs,bool enable)
++{
++ uint32_t tmp;
++
++ tmp = ioread32be(®s->command_config);
++ if (enable)
++ tmp |= CMD_CFG_PAUSE_IGNORE;
++ else
++ tmp &= ~CMD_CFG_PAUSE_IGNORE;
++
++ iowrite32be(tmp, ®s->command_config);
++}
++
++void memac_set_loopback(struct memac_regs *regs, bool enable)
++{
++ uint32_t tmp;
++
++ tmp = ioread32be(®s->command_config);
++
++ if (enable)
++ tmp |= CMD_CFG_LOOPBACK_EN;
++ else
++ tmp &= ~CMD_CFG_LOOPBACK_EN;
++
++ iowrite32be(tmp, ®s->command_config);
++}
++
++
++#define GET_MEMAC_CNTR_64(bn) \
++ (ioread32be(®s->bn ## _l) | \
++ ((uint64_t)ioread32be(®s->bn ## _u) << 32))
++
++uint64_t memac_get_counter(struct memac_regs *regs,
++ enum memac_counters reg_name)
++{
++ uint64_t ret_val;
++
++ switch (reg_name) {
++ case E_MEMAC_COUNTER_R64:
++ ret_val = GET_MEMAC_CNTR_64(r64);
++ break;
++ case E_MEMAC_COUNTER_R127:
++ ret_val = GET_MEMAC_CNTR_64(r127);
++ break;
++ case E_MEMAC_COUNTER_R255:
++ ret_val = GET_MEMAC_CNTR_64(r255);
++ break;
++ case E_MEMAC_COUNTER_R511:
++ ret_val = GET_MEMAC_CNTR_64(r511);
++ break;
++ case E_MEMAC_COUNTER_R1023:
++ ret_val = GET_MEMAC_CNTR_64(r1023);
++ break;
++ case E_MEMAC_COUNTER_R1518:
++ ret_val = GET_MEMAC_CNTR_64(r1518);
++ break;
++ case E_MEMAC_COUNTER_R1519X:
++ ret_val = GET_MEMAC_CNTR_64(r1519x);
++ break;
++ case E_MEMAC_COUNTER_RFRG:
++ ret_val = GET_MEMAC_CNTR_64(rfrg);
++ break;
++ case E_MEMAC_COUNTER_RJBR:
++ ret_val = GET_MEMAC_CNTR_64(rjbr);
++ break;
++ case E_MEMAC_COUNTER_RDRP:
++ ret_val = GET_MEMAC_CNTR_64(rdrp);
++ break;
++ case E_MEMAC_COUNTER_RALN:
++ ret_val = GET_MEMAC_CNTR_64(raln);
++ break;
++ case E_MEMAC_COUNTER_TUND:
++ ret_val = GET_MEMAC_CNTR_64(tund);
++ break;
++ case E_MEMAC_COUNTER_ROVR:
++ ret_val = GET_MEMAC_CNTR_64(rovr);
++ break;
++ case E_MEMAC_COUNTER_RXPF:
++ ret_val = GET_MEMAC_CNTR_64(rxpf);
++ break;
++ case E_MEMAC_COUNTER_TXPF:
++ ret_val = GET_MEMAC_CNTR_64(txpf);
++ break;
++ case E_MEMAC_COUNTER_ROCT:
++ ret_val = GET_MEMAC_CNTR_64(roct);
++ break;
++ case E_MEMAC_COUNTER_RMCA:
++ ret_val = GET_MEMAC_CNTR_64(rmca);
++ break;
++ case E_MEMAC_COUNTER_RBCA:
++ ret_val = GET_MEMAC_CNTR_64(rbca);
++ break;
++ case E_MEMAC_COUNTER_RPKT:
++ ret_val = GET_MEMAC_CNTR_64(rpkt);
++ break;
++ case E_MEMAC_COUNTER_RUCA:
++ ret_val = GET_MEMAC_CNTR_64(ruca);
++ break;
++ case E_MEMAC_COUNTER_RERR:
++ ret_val = GET_MEMAC_CNTR_64(rerr);
++ break;
++ case E_MEMAC_COUNTER_TOCT:
++ ret_val = GET_MEMAC_CNTR_64(toct);
++ break;
++ case E_MEMAC_COUNTER_TMCA:
++ ret_val = GET_MEMAC_CNTR_64(tmca);
++ break;
++ case E_MEMAC_COUNTER_TBCA:
++ ret_val = GET_MEMAC_CNTR_64(tbca);
++ break;
++ case E_MEMAC_COUNTER_TUCA:
++ ret_val = GET_MEMAC_CNTR_64(tuca);
++ break;
++ case E_MEMAC_COUNTER_TERR:
++ ret_val = GET_MEMAC_CNTR_64(terr);
++ break;
++ default:
++ ret_val = 0;
++ }
++
++ return ret_val;
++}
++
++void memac_defconfig(struct memac_cfg *cfg)
++{
++ cfg->reset_on_init = FALSE;
++ cfg->wan_mode_enable = FALSE;
++ cfg->promiscuous_mode_enable = FALSE;
++ cfg->pause_forward_enable = FALSE;
++ cfg->pause_ignore = FALSE;
++ cfg->tx_addr_ins_enable = FALSE;
++ cfg->loopback_enable = FALSE;
++ cfg->cmd_frame_enable = FALSE;
++ cfg->rx_error_discard = FALSE;
++ cfg->send_idle_enable = FALSE;
++ cfg->no_length_check_enable = TRUE;
++ cfg->lgth_check_nostdr = FALSE;
++ cfg->time_stamp_enable = FALSE;
++ cfg->tx_ipg_length = DEFAULT_TX_IPG_LENGTH;
++ cfg->max_frame_length = DEFAULT_FRAME_LENGTH;
++ cfg->pause_quanta = DEFAULT_PAUSE_QUANTA;
++ cfg->pad_enable = TRUE;
++ cfg->phy_tx_ena_on = FALSE;
++ cfg->rx_sfd_any = FALSE;
++ cfg->rx_pbl_fwd = FALSE;
++ cfg->tx_pbl_fwd = FALSE;
++ cfg->debug_mode = FALSE;
++}
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fman_tgec.c b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fman_tgec.c
+new file mode 100644
+index 0000000..fa80a36
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fman_tgec.c
+@@ -0,0 +1,355 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++#include "fsl_fman_tgec.h"
++
++
++void tgec_set_mac_address(struct tgec_regs *regs, uint8_t *adr)
++{
++ uint32_t tmp0, tmp1;
++
++ tmp0 = (uint32_t)(adr[0] |
++ adr[1] << 8 |
++ adr[2] << 16 |
++ adr[3] << 24);
++ tmp1 = (uint32_t)(adr[4] | adr[5] << 8);
++ iowrite32be(tmp0, ®s->mac_addr_0);
++ iowrite32be(tmp1, ®s->mac_addr_1);
++}
++
++void tgec_reset_stat(struct tgec_regs *regs)
++{
++ uint32_t tmp;
++
++ tmp = ioread32be(®s->command_config);
++
++ tmp |= CMD_CFG_STAT_CLR;
++
++ iowrite32be(tmp, ®s->command_config);
++
++ while (ioread32be(®s->command_config) & CMD_CFG_STAT_CLR);
++}
++
++#define GET_TGEC_CNTR_64(bn) \
++ (((uint64_t)ioread32be(®s->bn ## _u) << 32) | \
++ ioread32be(®s->bn ## _l))
++
++uint64_t tgec_get_counter(struct tgec_regs *regs, enum tgec_counters reg_name)
++{
++ uint64_t ret_val;
++
++ switch (reg_name) {
++ case E_TGEC_COUNTER_R64:
++ ret_val = GET_TGEC_CNTR_64(r64);
++ break;
++ case E_TGEC_COUNTER_R127:
++ ret_val = GET_TGEC_CNTR_64(r127);
++ break;
++ case E_TGEC_COUNTER_R255:
++ ret_val = GET_TGEC_CNTR_64(r255);
++ break;
++ case E_TGEC_COUNTER_R511:
++ ret_val = GET_TGEC_CNTR_64(r511);
++ break;
++ case E_TGEC_COUNTER_R1023:
++ ret_val = GET_TGEC_CNTR_64(r1023);
++ break;
++ case E_TGEC_COUNTER_R1518:
++ ret_val = GET_TGEC_CNTR_64(r1518);
++ break;
++ case E_TGEC_COUNTER_R1519X:
++ ret_val = GET_TGEC_CNTR_64(r1519x);
++ break;
++ case E_TGEC_COUNTER_TRFRG:
++ ret_val = GET_TGEC_CNTR_64(trfrg);
++ break;
++ case E_TGEC_COUNTER_TRJBR:
++ ret_val = GET_TGEC_CNTR_64(trjbr);
++ break;
++ case E_TGEC_COUNTER_RDRP:
++ ret_val = GET_TGEC_CNTR_64(rdrp);
++ break;
++ case E_TGEC_COUNTER_RALN:
++ ret_val = GET_TGEC_CNTR_64(raln);
++ break;
++ case E_TGEC_COUNTER_TRUND:
++ ret_val = GET_TGEC_CNTR_64(trund);
++ break;
++ case E_TGEC_COUNTER_TROVR:
++ ret_val = GET_TGEC_CNTR_64(trovr);
++ break;
++ case E_TGEC_COUNTER_RXPF:
++ ret_val = GET_TGEC_CNTR_64(rxpf);
++ break;
++ case E_TGEC_COUNTER_TXPF:
++ ret_val = GET_TGEC_CNTR_64(txpf);
++ break;
++ case E_TGEC_COUNTER_ROCT:
++ ret_val = GET_TGEC_CNTR_64(roct);
++ break;
++ case E_TGEC_COUNTER_RMCA:
++ ret_val = GET_TGEC_CNTR_64(rmca);
++ break;
++ case E_TGEC_COUNTER_RBCA:
++ ret_val = GET_TGEC_CNTR_64(rbca);
++ break;
++ case E_TGEC_COUNTER_RPKT:
++ ret_val = GET_TGEC_CNTR_64(rpkt);
++ break;
++ case E_TGEC_COUNTER_RUCA:
++ ret_val = GET_TGEC_CNTR_64(ruca);
++ break;
++ case E_TGEC_COUNTER_RERR:
++ ret_val = GET_TGEC_CNTR_64(rerr);
++ break;
++ case E_TGEC_COUNTER_TOCT:
++ ret_val = GET_TGEC_CNTR_64(toct);
++ break;
++ case E_TGEC_COUNTER_TMCA:
++ ret_val = GET_TGEC_CNTR_64(tmca);
++ break;
++ case E_TGEC_COUNTER_TBCA:
++ ret_val = GET_TGEC_CNTR_64(tbca);
++ break;
++ case E_TGEC_COUNTER_TUCA:
++ ret_val = GET_TGEC_CNTR_64(tuca);
++ break;
++ case E_TGEC_COUNTER_TERR:
++ ret_val = GET_TGEC_CNTR_64(terr);
++ break;
++ default:
++ ret_val = 0;
++ }
++
++ return ret_val;
++}
++
++void tgec_enable(struct tgec_regs *regs, bool apply_rx, bool apply_tx)
++{
++ uint32_t tmp;
++
++ tmp = ioread32be(®s->command_config);
++ if (apply_rx)
++ tmp |= CMD_CFG_RX_EN;
++ if (apply_tx)
++ tmp |= CMD_CFG_TX_EN;
++ iowrite32be(tmp, ®s->command_config);
++}
++
++void tgec_disable(struct tgec_regs *regs, bool apply_rx, bool apply_tx)
++{
++ uint32_t tmp_reg_32;
++
++ tmp_reg_32 = ioread32be(®s->command_config);
++ if (apply_rx)
++ tmp_reg_32 &= ~CMD_CFG_RX_EN;
++ if (apply_tx)
++ tmp_reg_32 &= ~CMD_CFG_TX_EN;
++ iowrite32be(tmp_reg_32, ®s->command_config);
++}
++
++void tgec_set_promiscuous(struct tgec_regs *regs, bool val)
++{
++ uint32_t tmp;
++
++ tmp = ioread32be(®s->command_config);
++
++ if (val)
++ tmp |= CMD_CFG_PROMIS_EN;
++ else
++ tmp &= ~CMD_CFG_PROMIS_EN;
++
++ iowrite32be(tmp, ®s->command_config);
++}
++
++void tgec_set_hash_table(struct tgec_regs *regs, uint32_t value)
++{
++ iowrite32be(value, ®s->hashtable_ctrl);
++}
++
++void tgec_tx_mac_pause(struct tgec_regs *regs, uint16_t pause_time)
++{
++ iowrite32be((uint32_t)pause_time, ®s->pause_quant);
++}
++
++void tgec_rx_ignore_mac_pause(struct tgec_regs *regs, bool en)
++{
++ uint32_t tmp;
++
++ tmp = ioread32be(®s->command_config);
++ if (en)
++ tmp |= CMD_CFG_PAUSE_IGNORE;
++ else
++ tmp &= ~CMD_CFG_PAUSE_IGNORE;
++ iowrite32be(tmp, ®s->command_config);
++}
++
++void tgec_enable_1588_time_stamp(struct tgec_regs *regs, bool en)
++{
++ uint32_t tmp;
++
++ tmp = ioread32be(®s->command_config);
++ if (en)
++ tmp |= CMD_CFG_EN_TIMESTAMP;
++ else
++ tmp &= ~CMD_CFG_EN_TIMESTAMP;
++ iowrite32be(tmp, ®s->command_config);
++}
++
++uint32_t tgec_get_event(struct tgec_regs *regs, uint32_t ev_mask)
++{
++ return ioread32be(®s->ievent) & ev_mask;
++}
++
++void tgec_ack_event(struct tgec_regs *regs, uint32_t ev_mask)
++{
++ iowrite32be(ev_mask, ®s->ievent);
++}
++
++uint32_t tgec_get_interrupt_mask(struct tgec_regs *regs)
++{
++ return ioread32be(®s->imask);
++}
++
++void tgec_add_addr_in_paddr(struct tgec_regs *regs, uint8_t *adr)
++{
++ uint32_t tmp0, tmp1;
++
++ tmp0 = (uint32_t)(adr[0] |
++ adr[1] << 8 |
++ adr[2] << 16 |
++ adr[3] << 24);
++ tmp1 = (uint32_t)(adr[4] | adr[5] << 8);
++ iowrite32be(tmp0, ®s->mac_addr_2);
++ iowrite32be(tmp1, ®s->mac_addr_3);
++}
++
++void tgec_clear_addr_in_paddr(struct tgec_regs *regs)
++{
++ iowrite32be(0, ®s->mac_addr_2);
++ iowrite32be(0, ®s->mac_addr_3);
++}
++
++uint32_t tgec_get_revision(struct tgec_regs *regs)
++{
++ return ioread32be(®s->tgec_id);
++}
++
++void tgec_enable_interrupt(struct tgec_regs *regs, uint32_t ev_mask)
++{
++ iowrite32be(ioread32be(®s->imask) | ev_mask, ®s->imask);
++}
++
++void tgec_disable_interrupt(struct tgec_regs *regs, uint32_t ev_mask)
++{
++ iowrite32be(ioread32be(®s->imask) & ~ev_mask, ®s->imask);
++}
++
++uint16_t tgec_get_max_frame_len(struct tgec_regs *regs)
++{
++ return (uint16_t) ioread32be(®s->maxfrm);
++}
++
++void tgec_defconfig(struct tgec_cfg *cfg)
++{
++ cfg->wan_mode_enable = DEFAULT_WAN_MODE_ENABLE;
++ cfg->promiscuous_mode_enable = DEFAULT_PROMISCUOUS_MODE_ENABLE;
++ cfg->pause_forward_enable = DEFAULT_PAUSE_FORWARD_ENABLE;
++ cfg->pause_ignore = DEFAULT_PAUSE_IGNORE;
++ cfg->tx_addr_ins_enable = DEFAULT_TX_ADDR_INS_ENABLE;
++ cfg->loopback_enable = DEFAULT_LOOPBACK_ENABLE;
++ cfg->cmd_frame_enable = DEFAULT_CMD_FRAME_ENABLE;
++ cfg->rx_error_discard = DEFAULT_RX_ERROR_DISCARD;
++ cfg->send_idle_enable = DEFAULT_SEND_IDLE_ENABLE;
++ cfg->no_length_check_enable = DEFAULT_NO_LENGTH_CHECK_ENABLE;
++ cfg->lgth_check_nostdr = DEFAULT_LGTH_CHECK_NOSTDR;
++ cfg->time_stamp_enable = DEFAULT_TIME_STAMP_ENABLE;
++ cfg->tx_ipg_length = DEFAULT_TX_IPG_LENGTH;
++ cfg->max_frame_length = DEFAULT_MAX_FRAME_LENGTH;
++ cfg->pause_quant = DEFAULT_PAUSE_QUANT;
++#ifdef FM_TX_ECC_FRMS_ERRATA_10GMAC_A004
++ cfg->skip_fman11_workaround = FALSE;
++#endif /* FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 */
++}
++
++int tgec_init(struct tgec_regs *regs, struct tgec_cfg *cfg,
++ uint32_t exception_mask)
++{
++ uint32_t tmp;
++
++ /* Config */
++ tmp = 0x40; /* CRC forward */
++ if (cfg->wan_mode_enable)
++ tmp |= CMD_CFG_WAN_MODE;
++ if (cfg->promiscuous_mode_enable)
++ tmp |= CMD_CFG_PROMIS_EN;
++ if (cfg->pause_forward_enable)
++ tmp |= CMD_CFG_PAUSE_FWD;
++ if (cfg->pause_ignore)
++ tmp |= CMD_CFG_PAUSE_IGNORE;
++ if (cfg->tx_addr_ins_enable)
++ tmp |= CMD_CFG_TX_ADDR_INS;
++ if (cfg->loopback_enable)
++ tmp |= CMD_CFG_LOOPBACK_EN;
++ if (cfg->cmd_frame_enable)
++ tmp |= CMD_CFG_CMD_FRM_EN;
++ if (cfg->rx_error_discard)
++ tmp |= CMD_CFG_RX_ER_DISC;
++ if (cfg->send_idle_enable)
++ tmp |= CMD_CFG_SEND_IDLE;
++ if (cfg->no_length_check_enable)
++ tmp |= CMD_CFG_NO_LEN_CHK;
++ if (cfg->time_stamp_enable)
++ tmp |= CMD_CFG_EN_TIMESTAMP;
++ iowrite32be(tmp, ®s->command_config);
++ /* Max Frame Length */
++ iowrite32be((uint32_t)cfg->max_frame_length, ®s->maxfrm);
++ /* Pause Time */
++ iowrite32be(cfg->pause_quant, ®s->pause_quant);
++
++ /* clear all pending events and set-up interrupts */
++ tgec_ack_event(regs, 0xffffffff);
++ tgec_enable_interrupt(regs, exception_mask);
++ return 0;
++}
++
++void tgec_fm_tx_fifo_corruption_errata_10gmac_a007(struct tgec_regs *regs)
++{
++ uint32_t tmp;
++
++ /* restore the default tx ipg Length */
++ tmp = (ioread32be(®s->tx_ipg_len) & ~TX_IPG_LENGTH_MASK) | 12;
++
++ iowrite32be(tmp, ®s->tx_ipg_len);
++
++}
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fsl_fman_dtsec_mii_acc.h b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fsl_fman_dtsec_mii_acc.h
+new file mode 100644
+index 0000000..2d74b6a
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/fsl_fman_dtsec_mii_acc.h
+@@ -0,0 +1,102 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++#ifndef __FSL_FMAN_DTSEC_MII_ACC_H
++#define __FSL_FMAN_DTSEC_MII_ACC_H
++
++#include "common/general.h"
++
++
++/* MII Management Configuration Register */
++#define MIIMCFG_RESET_MGMT 0x80000000
++#define MIIMCFG_MGNTCLK_MASK 0x00000007
++#define MIIMCFG_MGNTCLK_SHIFT 0
++
++/* MII Management Command Register */
++#define MIIMCOM_SCAN_CYCLE 0x00000002
++#define MIIMCOM_READ_CYCLE 0x00000001
++
++/* MII Management Address Register */
++#define MIIMADD_PHY_ADDR_SHIFT 8
++#define MIIMADD_PHY_ADDR_MASK 0x00001f00
++
++#define MIIMADD_REG_ADDR_SHIFT 0
++#define MIIMADD_REG_ADDR_MASK 0x0000001f
++
++/* MII Management Indicator Register */
++#define MIIMIND_BUSY 0x00000001
++
++
++/* PHY Control Register */
++#define PHY_CR_LOOPBACK 0x4000
++#define PHY_CR_SPEED0 0x2000
++#define PHY_CR_ANE 0x1000
++#define PHY_CR_FULLDUPLEX 0x0100
++#define PHY_CR_SPEED1 0x0040
++
++#define PHY_TBICON_SRESET 0x8000
++#define PHY_TBICON_SPEED2 0x0020
++
++/* register map */
++
++/* MII Configuration Control Memory Map Registers */
++struct dtsec_mii_reg {
++ uint32_t reserved1[72];
++ uint32_t miimcfg; /* MII Mgmt:configuration */
++ uint32_t miimcom; /* MII Mgmt:command */
++ uint32_t miimadd; /* MII Mgmt:address */
++ uint32_t miimcon; /* MII Mgmt:control 3 */
++ uint32_t miimstat; /* MII Mgmt:status */
++ uint32_t miimind; /* MII Mgmt:indicators */
++};
++
++/* dTSEC MII API */
++
++/* functions to access the mii registers for phy configuration.
++ * this functionality may not be available for all dtsecs in the system.
++ * consult the reference manual for details */
++void dtsec_mii_reset(struct dtsec_mii_reg *regs);
++/* frequency is in MHz.
++ * note that dtsec clock is 1/2 of fman clock */
++void dtsec_mii_init(struct dtsec_mii_reg *regs, uint16_t dtsec_freq);
++int dtsec_mii_write_reg(struct dtsec_mii_reg *regs,
++ uint8_t addr,
++ uint8_t reg,
++ uint16_t data);
++
++int dtsec_mii_read_reg(struct dtsec_mii_reg *regs,
++ uint8_t addr,
++ uint8_t reg,
++ uint16_t *data);
++
++#endif /* __FSL_FMAN_DTSEC_MII_ACC_H */
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/memac.c b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/memac.c
+new file mode 100644
+index 0000000..6e5440d
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/memac.c
+@@ -0,0 +1,1036 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File memac.c
++
++ @Description FM mEMAC driver
++*//***************************************************************************/
++
++#include "std_ext.h"
++#include "string_ext.h"
++#include "error_ext.h"
++#include "xx_ext.h"
++#include "endian_ext.h"
++#include "debug_ext.h"
++
++#include "fm_common.h"
++#include "memac.h"
++
++
++/*****************************************************************************/
++/* Internal routines */
++/*****************************************************************************/
++
++/* ......................................................................... */
++
++static uint32_t GetMacAddrHashCode(uint64_t ethAddr)
++{
++ uint64_t mask1, mask2;
++ uint32_t xor = 0;
++ uint8_t i, j;
++
++ for (i=0; i < 6; i++)
++ {
++ mask1 = ethAddr & (uint64_t)0x01;
++ ethAddr >>= 1;
++
++ for (j=0; j < 7; j++)
++ {
++ mask2 = ethAddr & (uint64_t)0x01;
++ mask1 ^= mask2;
++ ethAddr >>= 1;
++ }
++ xor |= (mask1 << (5-i));
++ }
++
++ return xor;
++}
++
++
++/* ......................................................................... */
++
++static void SetupSgmiiInternalPhy(t_Memac *p_Memac, uint8_t phyAddr)
++{
++ uint16_t tmpReg16;
++
++ /* SGMII mode + AN enable */
++ tmpReg16 = PHY_SGMII_IF_MODE_AN | PHY_SGMII_IF_MODE_SGMII;
++ MEMAC_MII_WritePhyReg(p_Memac, phyAddr, 0x14, tmpReg16);
++
++ /* Device ability according to SGMII specification */
++ tmpReg16 = PHY_SGMII_DEV_ABILITY_SGMII;
++ MEMAC_MII_WritePhyReg(p_Memac, phyAddr, 0x4, tmpReg16);
++
++ /* Adjust link timer for SGMII -
++ According to Cisco SGMII specification the timer should be 1.6 ms.
++ The link_timer register is configured in units of the clock.
++ - When running as 1G SGMII, Serdes clock is 125 MHz, so
++ unit = 1 / (125*10^6 Hz) = 8 ns.
++ 1.6 ms in units of 8 ns = 1.6ms / 8ns = 2 * 10^5 = 0x30d40
++ - When running as 2.5G SGMII, Serdes clock is 312.5 MHz, so
++ unit = 1 / (312.5*10^6 Hz) = 3.2 ns.
++ 1.6 ms in units of 3.2 ns = 1.6ms / 3.2ns = 5 * 10^5 = 0x7a120.
++ Since link_timer value of 1G SGMII will be too short for 2.5 SGMII,
++ we always set up here a value of 2.5 SGMII. */
++ MEMAC_MII_WritePhyReg(p_Memac, phyAddr, 0x13, 0x0007);
++ MEMAC_MII_WritePhyReg(p_Memac, phyAddr, 0x12, 0xa120);
++
++ /* Restart AN */
++ tmpReg16 = PHY_SGMII_CR_DEF_VAL | PHY_SGMII_CR_RESET_AN;
++ MEMAC_MII_WritePhyReg(p_Memac, phyAddr, 0x0, tmpReg16);
++}
++
++/* ......................................................................... */
++
++static void SetupSgmiiInternalPhyBaseX(t_Memac *p_Memac, uint8_t phyAddr)
++{
++ uint16_t tmpReg16;
++
++ /* 1000BaseX mode */
++ tmpReg16 = PHY_SGMII_IF_MODE_1000X;
++ MEMAC_MII_WritePhyReg(p_Memac, phyAddr, 0x14, tmpReg16);
++
++ /* AN Device capability */
++ tmpReg16 = PHY_SGMII_DEV_ABILITY_1000X;
++ MEMAC_MII_WritePhyReg(p_Memac, phyAddr, 0x4, tmpReg16);
++
++ /* Adjust link timer for SGMII -
++ For Serdes 1000BaseX auto-negotiation the timer should be 10 ms.
++ The link_timer register is configured in units of the clock.
++ - When running as 1G SGMII, Serdes clock is 125 MHz, so
++ unit = 1 / (125*10^6 Hz) = 8 ns.
++ 10 ms in units of 8 ns = 10ms / 8ns = 1250000 = 0x1312d0
++ - When running as 2.5G SGMII, Serdes clock is 312.5 MHz, so
++ unit = 1 / (312.5*10^6 Hz) = 3.2 ns.
++ 10 ms in units of 3.2 ns = 10ms / 3.2ns = 3125000 = 0x2faf08.
++ Since link_timer value of 1G SGMII will be too short for 2.5 SGMII,
++ we always set up here a value of 2.5 SGMII. */
++ MEMAC_MII_WritePhyReg(p_Memac, phyAddr, 0x13, 0x002f);
++ MEMAC_MII_WritePhyReg(p_Memac, phyAddr, 0x12, 0xaf08);
++
++ /* Restart AN */
++ tmpReg16 = PHY_SGMII_CR_DEF_VAL | PHY_SGMII_CR_RESET_AN;
++ MEMAC_MII_WritePhyReg(p_Memac, phyAddr, 0x0, tmpReg16);
++}
++
++/* ......................................................................... */
++
++static t_Error CheckInitParameters(t_Memac *p_Memac)
++{
++ e_FmMacType portType;
++
++ portType = ((ENET_SPEED_FROM_MODE(p_Memac->enetMode) < e_ENET_SPEED_10000) ? e_FM_MAC_1G : e_FM_MAC_10G);
++
++#if (FM_MAX_NUM_OF_10G_MACS > 0)
++ if ((portType == e_FM_MAC_10G) && (p_Memac->macId >= FM_MAX_NUM_OF_10G_MACS))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("10G MAC ID must be less than %d", FM_MAX_NUM_OF_10G_MACS));
++#endif /* (FM_MAX_NUM_OF_10G_MACS > 0) */
++
++ if ((portType == e_FM_MAC_1G) && (p_Memac->macId >= FM_MAX_NUM_OF_1G_MACS))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("1G MAC ID must be less than %d", FM_MAX_NUM_OF_1G_MACS));
++ if (p_Memac->addr == 0)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Ethernet MAC must have a valid MAC address"));
++ if (!p_Memac->f_Exception)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Uninitialized f_Exception"));
++ if (!p_Memac->f_Event)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Uninitialized f_Event"));
++#ifdef FM_LEN_CHECK_ERRATA_FMAN_SW002
++ if (!p_Memac->p_MemacDriverParam->no_length_check_enable)
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("LengthCheck!"));
++#endif /* FM_LEN_CHECK_ERRATA_FMAN_SW002 */
++
++ return E_OK;
++}
++
++/* ........................................................................... */
++
++static void MemacErrException(t_Handle h_Memac)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++ struct memac_regs *regs = p_Memac->p_MemMap;
++ uint32_t event, imsk;
++
++ event = memac_get_event(regs, 0xffffffff);
++
++ /*
++ * Apparently the imask bits are shifted by 16 bits offset from
++ * their corresponding bits in the ievent - hence the >> 16
++ */
++ imsk = memac_get_interrupt_mask(regs) >> 16;;
++
++ /*
++ * Extract all event bits plus the pending interrupts according to
++ * their imask
++ */
++ event = (event & ~(MEMAC_ALL_IMASKS >> 16)) | (event & imsk);
++
++ /* Ignoring the status bits */
++ event = event & ~(MEMAC_IEVNT_RX_EMPTY |
++ MEMAC_IEVNT_TX_EMPTY |
++ MEMAC_IEVNT_RX_LOWP |
++ MEMAC_IEVNT_PHY_LOS);
++
++ memac_ack_event(regs, event);
++
++ if (event & MEMAC_IEVNT_RX_FIFO_OVFL)
++ p_Memac->f_Exception(p_Memac->h_App, e_FM_MAC_EX_10G_RX_FIFO_OVFL);
++ if (event & MEMAC_IEVNT_TX_FIFO_UNFL)
++ p_Memac->f_Exception(p_Memac->h_App, e_FM_MAC_EX_10G_TX_FIFO_UNFL);
++ if (event & MEMAC_IEVNT_TX_FIFO_OVFL)
++ p_Memac->f_Exception(p_Memac->h_App, e_FM_MAC_EX_10G_TX_FIFO_OVFL);
++ if (event & MEMAC_IEVNT_TX_ECC_ER)
++ p_Memac->f_Exception(p_Memac->h_App, e_FM_MAC_EX_10G_1TX_ECC_ER);
++ if (event & MEMAC_IEVNT_RX_ECC_ER)
++ p_Memac->f_Exception(p_Memac->h_App, e_FM_MAC_EX_10G_RX_ECC_ER);
++ if (event & MEMAC_IEVNT_REM_FAULT)
++ p_Memac->f_Exception(p_Memac->h_App, e_FM_MAC_EX_10G_REM_FAULT);
++ if (event & MEMAC_IEVNT_LOC_FAULT)
++ p_Memac->f_Exception(p_Memac->h_App, e_FM_MAC_EX_10G_LOC_FAULT);
++}
++
++
++/* ......................................................................... */
++
++static void FreeInitResources(t_Memac *p_Memac)
++{
++ e_FmMacType portType;
++
++ portType =
++ ((ENET_SPEED_FROM_MODE(p_Memac->enetMode) < e_ENET_SPEED_10000) ? e_FM_MAC_1G : e_FM_MAC_10G);
++
++ if (portType == e_FM_MAC_10G)
++ FmUnregisterIntr(p_Memac->fmMacControllerDriver.h_Fm, e_FM_MOD_10G_MAC, p_Memac->macId, e_FM_INTR_TYPE_ERR);
++ else
++ FmUnregisterIntr(p_Memac->fmMacControllerDriver.h_Fm, e_FM_MOD_1G_MAC, p_Memac->macId, e_FM_INTR_TYPE_ERR);
++
++ /* release the driver's group hash table */
++ FreeHashTable(p_Memac->p_MulticastAddrHash);
++ p_Memac->p_MulticastAddrHash = NULL;
++
++ /* release the driver's individual hash table */
++ FreeHashTable(p_Memac->p_UnicastAddrHash);
++ p_Memac->p_UnicastAddrHash = NULL;
++}
++
++
++/*****************************************************************************/
++/* mEMAC API routines */
++/*****************************************************************************/
++
++/* ......................................................................... */
++
++static t_Error MemacEnable(t_Handle h_Memac, e_CommMode mode)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Memac->p_MemacDriverParam, E_INVALID_STATE);
++
++ memac_enable(p_Memac->p_MemMap, (mode & e_COMM_MODE_RX), (mode & e_COMM_MODE_TX));
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error MemacDisable (t_Handle h_Memac, e_CommMode mode)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Memac->p_MemacDriverParam, E_INVALID_STATE);
++
++ memac_disable(p_Memac->p_MemMap, (mode & e_COMM_MODE_RX), (mode & e_COMM_MODE_TX));
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error MemacSetPromiscuous(t_Handle h_Memac, bool newVal)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Memac->p_MemacDriverParam, E_INVALID_STATE);
++
++ memac_set_promiscuous(p_Memac->p_MemMap, newVal);
++
++ return E_OK;
++}
++
++/* .............................................................................. */
++
++static t_Error MemacAdjustLink(t_Handle h_Memac, e_EnetSpeed speed, bool fullDuplex)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Memac->p_MemacDriverParam, E_INVALID_STATE);
++UNUSED(p_Memac);
++DBG(WARNING, ("mEMAC works in automatic-mode; therefore, adjust-link is not needed!"));
++
++ return E_OK;
++}
++
++
++/*****************************************************************************/
++/* Memac Configs modification functions */
++/*****************************************************************************/
++
++/* ......................................................................... */
++
++static t_Error MemacConfigLoopback(t_Handle h_Memac, bool newVal)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Memac->p_MemacDriverParam, E_INVALID_STATE);
++
++ p_Memac->p_MemacDriverParam->loopback_enable = newVal;
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error MemacConfigWan(t_Handle h_Memac, bool newVal)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Memac->p_MemacDriverParam, E_INVALID_STATE);
++
++ p_Memac->p_MemacDriverParam->wan_mode_enable = newVal;
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error MemacConfigMaxFrameLength(t_Handle h_Memac, uint16_t newVal)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Memac->p_MemacDriverParam, E_INVALID_STATE);
++
++ p_Memac->p_MemacDriverParam->max_frame_length = newVal;
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error MemacConfigPad(t_Handle h_Memac, bool newVal)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Memac->p_MemacDriverParam, E_INVALID_STATE);
++
++ p_Memac->p_MemacDriverParam->pad_enable = newVal;
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error MemacConfigLengthCheck(t_Handle h_Memac, bool newVal)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Memac->p_MemacDriverParam, E_INVALID_STATE);
++
++ p_Memac->p_MemacDriverParam->no_length_check_enable = !newVal;
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error MemacConfigException(t_Handle h_Memac, e_FmMacExceptions exception, bool enable)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++ uint32_t bitMask = 0;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Memac->p_MemacDriverParam, E_INVALID_STATE);
++
++ GET_EXCEPTION_FLAG(bitMask, exception);
++ if (bitMask)
++ {
++ if (enable)
++ p_Memac->exceptions |= bitMask;
++ else
++ p_Memac->exceptions &= ~bitMask;
++ }
++ else
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error MemacConfigResetOnInit(t_Handle h_Memac, bool enable)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Memac->p_MemacDriverParam, E_INVALID_STATE);
++
++ p_Memac->p_MemacDriverParam->reset_on_init = enable;
++
++ return E_OK;
++}
++
++
++/*****************************************************************************/
++/* Memac Run Time API functions */
++/*****************************************************************************/
++
++/* ......................................................................... */
++
++static t_Error MemacSetTxPauseFrames(t_Handle h_Memac,
++ uint8_t priority,
++ uint16_t pauseTime,
++ uint16_t threshTime)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(!p_Memac->p_MemacDriverParam, E_INVALID_STATE);
++
++ memac_set_tx_pause_frames(p_Memac->p_MemMap, priority, pauseTime, threshTime);
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error MemacSetTxAutoPauseFrames(t_Handle h_Memac,
++ uint16_t pauseTime)
++{
++ return MemacSetTxPauseFrames(h_Memac, FM_MAC_NO_PFC, pauseTime, 0);
++}
++
++/* ......................................................................... */
++
++static t_Error MemacSetRxIgnorePauseFrames(t_Handle h_Memac, bool en)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(!p_Memac->p_MemacDriverParam, E_INVALID_STATE);
++
++ memac_set_rx_ignore_pause_frames(p_Memac->p_MemMap, en);
++
++ return E_OK;
++}
++
++/* .............................................................................. */
++
++static t_Error MemacEnable1588TimeStamp(t_Handle h_Memac)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Memac->p_MemacDriverParam, E_INVALID_STATE);
++UNUSED(p_Memac);
++DBG(WARNING, ("mEMAC has 1588 always enabled!"));
++
++ return E_OK;
++}
++
++/* Counters handling */
++/* ......................................................................... */
++
++static t_Error MemacGetStatistics(t_Handle h_Memac, t_FmMacStatistics *p_Statistics)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(!p_Memac->p_MemacDriverParam, E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(p_Statistics, E_NULL_POINTER);
++
++ p_Statistics->eStatPkts64 = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_R64);
++ p_Statistics->eStatPkts65to127 = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_R127);
++ p_Statistics->eStatPkts128to255 = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_R255);
++ p_Statistics->eStatPkts256to511 = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_R511);
++ p_Statistics->eStatPkts512to1023 = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_R1023);
++ p_Statistics->eStatPkts1024to1518 = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_R1518);
++ p_Statistics->eStatPkts1519to1522 = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_R1519X);
++/* */
++ p_Statistics->eStatFragments = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_RFRG);
++ p_Statistics->eStatJabbers = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_RJBR);
++
++ p_Statistics->eStatsDropEvents = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_RDRP);
++ p_Statistics->eStatCRCAlignErrors = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_RALN);
++
++ p_Statistics->eStatUndersizePkts = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_TUND);
++ p_Statistics->eStatOversizePkts = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_ROVR);
++/* Pause */
++ p_Statistics->reStatPause = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_RXPF);
++ p_Statistics->teStatPause = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_TXPF);
++
++/* MIB II */
++ p_Statistics->ifInOctets = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_ROCT);
++ p_Statistics->ifInUcastPkts = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_RUCA);
++ p_Statistics->ifInMcastPkts = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_RMCA);
++ p_Statistics->ifInBcastPkts = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_RBCA);
++ p_Statistics->ifInPkts = p_Statistics->ifInUcastPkts
++ + p_Statistics->ifInMcastPkts
++ + p_Statistics->ifInBcastPkts;
++ p_Statistics->ifInDiscards = 0;
++ p_Statistics->ifInErrors = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_RERR);
++
++ p_Statistics->ifOutOctets = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_TOCT);
++ p_Statistics->ifOutUcastPkts = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_TUCA);
++ p_Statistics->ifOutMcastPkts = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_TMCA);
++ p_Statistics->ifOutBcastPkts = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_TBCA);
++ p_Statistics->ifOutPkts = p_Statistics->ifOutUcastPkts
++ + p_Statistics->ifOutMcastPkts
++ + p_Statistics->ifOutBcastPkts;
++ p_Statistics->ifOutDiscards = 0;
++ p_Statistics->ifOutErrors = memac_get_counter(p_Memac->p_MemMap, E_MEMAC_COUNTER_TERR);
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error MemacModifyMacAddress (t_Handle h_Memac, t_EnetAddr *p_EnetAddr)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(!p_Memac->p_MemacDriverParam, E_INVALID_STATE);
++
++ memac_hardware_add_addr_in_paddr(p_Memac->p_MemMap, (uint8_t *)(*p_EnetAddr), 0);
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error MemacResetCounters (t_Handle h_Memac)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Memac->p_MemacDriverParam, E_INVALID_STATE);
++
++ memac_reset_counter(p_Memac->p_MemMap);
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error MemacAddExactMatchMacAddress(t_Handle h_Memac, t_EnetAddr *p_EthAddr)
++{
++ t_Memac *p_Memac = (t_Memac *) h_Memac;
++ uint64_t ethAddr;
++ uint8_t paddrNum;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Memac->p_MemacDriverParam, E_INVALID_STATE);
++
++ ethAddr = ENET_ADDR_TO_UINT64(*p_EthAddr);
++
++ if (ethAddr & GROUP_ADDRESS)
++ /* Multicast address has no effect in PADDR */
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Multicast address"));
++
++ /* Make sure no PADDR contains this address */
++ for (paddrNum = 0; paddrNum < MEMAC_NUM_OF_PADDRS; paddrNum++)
++ if (p_Memac->indAddrRegUsed[paddrNum])
++ if (p_Memac->paddr[paddrNum] == ethAddr)
++ RETURN_ERROR(MAJOR, E_ALREADY_EXISTS, NO_MSG);
++
++ /* Find first unused PADDR */
++ for (paddrNum = 0; paddrNum < MEMAC_NUM_OF_PADDRS; paddrNum++)
++ if (!(p_Memac->indAddrRegUsed[paddrNum]))
++ {
++ /* mark this PADDR as used */
++ p_Memac->indAddrRegUsed[paddrNum] = TRUE;
++ /* store address */
++ p_Memac->paddr[paddrNum] = ethAddr;
++
++ /* put in hardware */
++ memac_hardware_add_addr_in_paddr(p_Memac->p_MemMap, (uint8_t*)(*p_EthAddr), paddrNum);
++ p_Memac->numOfIndAddrInRegs++;
++
++ return E_OK;
++ }
++
++ /* No free PADDR */
++ RETURN_ERROR(MAJOR, E_FULL, NO_MSG);
++}
++
++/* ......................................................................... */
++
++static t_Error MemacDelExactMatchMacAddress(t_Handle h_Memac, t_EnetAddr *p_EthAddr)
++{
++ t_Memac *p_Memac = (t_Memac *) h_Memac;
++ uint64_t ethAddr;
++ uint8_t paddrNum;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Memac->p_MemacDriverParam, E_INVALID_STATE);
++
++ ethAddr = ENET_ADDR_TO_UINT64(*p_EthAddr);
++
++ /* Find used PADDR containing this address */
++ for (paddrNum = 0; paddrNum < MEMAC_NUM_OF_PADDRS; paddrNum++)
++ {
++ if ((p_Memac->indAddrRegUsed[paddrNum]) &&
++ (p_Memac->paddr[paddrNum] == ethAddr))
++ {
++ /* mark this PADDR as not used */
++ p_Memac->indAddrRegUsed[paddrNum] = FALSE;
++ /* clear in hardware */
++ memac_hardware_clear_addr_in_paddr(p_Memac->p_MemMap, paddrNum);
++ p_Memac->numOfIndAddrInRegs--;
++
++ return E_OK;
++ }
++ }
++
++ RETURN_ERROR(MAJOR, E_NOT_FOUND, NO_MSG);
++}
++
++/* ......................................................................... */
++
++static t_Error MemacAddHashMacAddress(t_Handle h_Memac, t_EnetAddr *p_EthAddr)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++ t_EthHashEntry *p_HashEntry;
++ uint32_t hash;
++ uint64_t ethAddr;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(!p_Memac->p_MemacDriverParam, E_INVALID_STATE);
++
++ ethAddr = ENET_ADDR_TO_UINT64(*p_EthAddr);
++
++ if (!(ethAddr & GROUP_ADDRESS))
++ /* Unicast addresses not supported in hash */
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("Unicast Address"));
++
++ hash = GetMacAddrHashCode(ethAddr) & HASH_CTRL_ADDR_MASK;
++
++ /* Create element to be added to the driver hash table */
++ p_HashEntry = (t_EthHashEntry *)XX_Malloc(sizeof(t_EthHashEntry));
++ p_HashEntry->addr = ethAddr;
++ INIT_LIST(&p_HashEntry->node);
++
++ LIST_AddToTail(&(p_HashEntry->node), &(p_Memac->p_MulticastAddrHash->p_Lsts[hash]));
++ memac_set_hash_table(p_Memac->p_MemMap, (hash | HASH_CTRL_MCAST_EN));
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error MemacDelHashMacAddress(t_Handle h_Memac, t_EnetAddr *p_EthAddr)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++ t_EthHashEntry *p_HashEntry = NULL;
++ t_List *p_Pos;
++ uint32_t hash;
++ uint64_t ethAddr;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(!p_Memac->p_MemacDriverParam, E_INVALID_STATE);
++
++ ethAddr = ENET_ADDR_TO_UINT64(*p_EthAddr);
++
++ hash = GetMacAddrHashCode(ethAddr) & HASH_CTRL_ADDR_MASK;
++
++ LIST_FOR_EACH(p_Pos, &(p_Memac->p_MulticastAddrHash->p_Lsts[hash]))
++ {
++ p_HashEntry = ETH_HASH_ENTRY_OBJ(p_Pos);
++ if (p_HashEntry->addr == ethAddr)
++ {
++ LIST_DelAndInit(&p_HashEntry->node);
++ XX_Free(p_HashEntry);
++ break;
++ }
++ }
++ if (LIST_IsEmpty(&p_Memac->p_MulticastAddrHash->p_Lsts[hash]))
++ memac_set_hash_table(p_Memac->p_MemMap, (hash & ~HASH_CTRL_MCAST_EN));
++
++ return E_OK;
++}
++
++
++/* ......................................................................... */
++
++static t_Error MemacSetException(t_Handle h_Memac, e_FmMacExceptions exception, bool enable)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++ uint32_t bitMask = 0;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Memac->p_MemacDriverParam, E_INVALID_STATE);
++
++ GET_EXCEPTION_FLAG(bitMask, exception);
++ if (bitMask)
++ {
++ if (enable)
++ p_Memac->exceptions |= bitMask;
++ else
++ p_Memac->exceptions &= ~bitMask;
++ }
++ else
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
++
++ memac_set_exception(p_Memac->p_MemMap, bitMask, enable);
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static uint16_t MemacGetMaxFrameLength(t_Handle h_Memac)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++
++ SANITY_CHECK_RETURN_VALUE(p_Memac, E_INVALID_HANDLE, 0);
++ SANITY_CHECK_RETURN_VALUE(!p_Memac->p_MemacDriverParam, E_INVALID_STATE, 0);
++
++ return memac_get_max_frame_length(p_Memac->p_MemMap);
++}
++
++/* ......................................................................... */
++
++#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
++static t_Error MemacDumpRegs(t_Handle h_Memac)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++ int i = 0;
++
++ DECLARE_DUMP;
++
++ if (p_Memac->p_MemMap)
++ {
++ DUMP_TITLE(p_Memac->p_MemMap, ("mEMAC %d: ", p_Memac->macId));
++ DUMP_VAR(p_Memac->p_MemMap, command_config);
++ DUMP_VAR(p_Memac->p_MemMap, mac_addr0.mac_addr_l);
++ DUMP_VAR(p_Memac->p_MemMap, mac_addr0.mac_addr_u);
++ DUMP_VAR(p_Memac->p_MemMap, maxfrm);
++ DUMP_VAR(p_Memac->p_MemMap, hashtable_ctrl);
++ DUMP_VAR(p_Memac->p_MemMap, ievent);
++ DUMP_VAR(p_Memac->p_MemMap, tx_ipg_length);
++ DUMP_VAR(p_Memac->p_MemMap, imask);
++
++ DUMP_SUBSTRUCT_ARRAY(i, 4)
++ {
++ DUMP_VAR(p_Memac->p_MemMap, pause_quanta[i]);
++ }
++ DUMP_SUBSTRUCT_ARRAY(i, 4)
++ {
++ DUMP_VAR(p_Memac->p_MemMap, pause_thresh[i]);
++ }
++
++ DUMP_VAR(p_Memac->p_MemMap, rx_pause_status);
++
++ DUMP_SUBSTRUCT_ARRAY(i, MEMAC_NUM_OF_PADDRS)
++ {
++ DUMP_VAR(p_Memac->p_MemMap, mac_addr[i].mac_addr_l);
++ DUMP_VAR(p_Memac->p_MemMap, mac_addr[i].mac_addr_u);
++ }
++
++ DUMP_VAR(p_Memac->p_MemMap, lpwake_timer);
++ DUMP_VAR(p_Memac->p_MemMap, sleep_timer);
++ DUMP_VAR(p_Memac->p_MemMap, statn_config);
++ DUMP_VAR(p_Memac->p_MemMap, if_mode);
++ DUMP_VAR(p_Memac->p_MemMap, if_status);
++ DUMP_VAR(p_Memac->p_MemMap, hg_config);
++ DUMP_VAR(p_Memac->p_MemMap, hg_pause_quanta);
++ DUMP_VAR(p_Memac->p_MemMap, hg_pause_thresh);
++ DUMP_VAR(p_Memac->p_MemMap, hgrx_pause_status);
++ DUMP_VAR(p_Memac->p_MemMap, hg_fifos_status);
++ DUMP_VAR(p_Memac->p_MemMap, rhm);
++ DUMP_VAR(p_Memac->p_MemMap, thm);
++ }
++
++ return E_OK;
++}
++#endif /* (defined(DEBUG_ERRORS) && ... */
++
++
++/*****************************************************************************/
++/* mEMAC Init & Free API */
++/*****************************************************************************/
++
++/* ......................................................................... */
++
++static t_Error MemacInit(t_Handle h_Memac)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++ 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;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Memac->p_MemacDriverParam, E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(p_Memac->fmMacControllerDriver.h_Fm, E_INVALID_HANDLE);
++
++ /* not needed! */
++ /*FM_GetRevision(p_Memac->fmMacControllerDriver.h_Fm, &p_Memac->fmMacControllerDriver.fmRevInfo);*/
++
++ CHECK_INIT_PARAMETERS(p_Memac, CheckInitParameters);
++
++ p_MemacDriverParam = p_Memac->p_MemacDriverParam;
++
++ portType =
++ ((ENET_SPEED_FROM_MODE(p_Memac->enetMode) < e_ENET_SPEED_10000) ? e_FM_MAC_1G : e_FM_MAC_10G);
++
++ /* First, reset the MAC if desired. */
++ if (p_MemacDriverParam->reset_on_init)
++ memac_reset(p_Memac->p_MemMap);
++
++ /* MAC Address */
++ MAKE_ENET_ADDR_FROM_UINT64(p_Memac->addr, ethAddr);
++ memac_hardware_add_addr_in_paddr(p_Memac->p_MemMap, (uint8_t*)ethAddr, 0);
++
++ enet_interface = (enum enet_interface) ENET_INTERFACE_FROM_MODE(p_Memac->enetMode);
++ enet_speed = (enum enet_speed) ENET_SPEED_FROM_MODE(p_Memac->enetMode);
++
++ memac_init(p_Memac->p_MemMap,
++ p_Memac->p_MemacDriverParam,
++ enet_interface,
++ enet_speed,
++ p_Memac->exceptions);
++
++ 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);
++ }
++ }
++
++ /* Max Frame Length */
++ err = FmSetMacMaxFrame(p_Memac->fmMacControllerDriver.h_Fm,
++ portType,
++ p_Memac->fmMacControllerDriver.macId,
++ p_MemacDriverParam->max_frame_length);
++ if (err)
++ RETURN_ERROR(MAJOR, err, ("settings Mac max frame length is FAILED"));
++
++ p_Memac->p_MulticastAddrHash = AllocHashTable(HASH_TABLE_SIZE);
++ if (!p_Memac->p_MulticastAddrHash)
++ {
++ FreeInitResources(p_Memac);
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("allocation hash table is FAILED"));
++ }
++
++ p_Memac->p_UnicastAddrHash = AllocHashTable(HASH_TABLE_SIZE);
++ if (!p_Memac->p_UnicastAddrHash)
++ {
++ FreeInitResources(p_Memac);
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("allocation hash table is FAILED"));
++ }
++
++ FmRegisterIntr(p_Memac->fmMacControllerDriver.h_Fm,
++ (portType == e_FM_MAC_10G) ? e_FM_MOD_10G_MAC : e_FM_MOD_1G_MAC,
++ p_Memac->macId,
++ e_FM_INTR_TYPE_ERR,
++ MemacErrException,
++ p_Memac);
++
++
++ XX_Free(p_MemacDriverParam);
++ p_Memac->p_MemacDriverParam = NULL;
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error MemacFree(t_Handle h_Memac)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_INVALID_HANDLE);
++
++ FreeInitResources(p_Memac);
++
++ if (p_Memac->p_MemacDriverParam)
++ {
++ XX_Free(p_Memac->p_MemacDriverParam);
++ p_Memac->p_MemacDriverParam = NULL;
++ }
++ XX_Free(p_Memac);
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static void InitFmMacControllerDriver(t_FmMacControllerDriver *p_FmMacControllerDriver)
++{
++ p_FmMacControllerDriver->f_FM_MAC_Init = MemacInit;
++ p_FmMacControllerDriver->f_FM_MAC_Free = MemacFree;
++
++ p_FmMacControllerDriver->f_FM_MAC_SetStatistics = NULL;
++ p_FmMacControllerDriver->f_FM_MAC_ConfigLoopback = MemacConfigLoopback;
++ p_FmMacControllerDriver->f_FM_MAC_ConfigMaxFrameLength = MemacConfigMaxFrameLength;
++
++ p_FmMacControllerDriver->f_FM_MAC_ConfigWan = MemacConfigWan;
++
++ p_FmMacControllerDriver->f_FM_MAC_ConfigPadAndCrc = MemacConfigPad;
++ p_FmMacControllerDriver->f_FM_MAC_ConfigHalfDuplex = NULL; /* half-duplex is detected automatically */
++ p_FmMacControllerDriver->f_FM_MAC_ConfigLengthCheck = MemacConfigLengthCheck;
++
++ p_FmMacControllerDriver->f_FM_MAC_ConfigException = MemacConfigException;
++ p_FmMacControllerDriver->f_FM_MAC_ConfigResetOnInit = MemacConfigResetOnInit;
++
++ p_FmMacControllerDriver->f_FM_MAC_SetException = MemacSetException;
++
++ p_FmMacControllerDriver->f_FM_MAC_Enable1588TimeStamp = MemacEnable1588TimeStamp; /* always enabled */
++ p_FmMacControllerDriver->f_FM_MAC_Disable1588TimeStamp = NULL;
++
++ p_FmMacControllerDriver->f_FM_MAC_SetPromiscuous = MemacSetPromiscuous;
++ p_FmMacControllerDriver->f_FM_MAC_AdjustLink = MemacAdjustLink;
++ p_FmMacControllerDriver->f_FM_MAC_RestartAutoneg = NULL;
++
++ p_FmMacControllerDriver->f_FM_MAC_Enable = MemacEnable;
++ p_FmMacControllerDriver->f_FM_MAC_Disable = MemacDisable;
++
++ p_FmMacControllerDriver->f_FM_MAC_SetTxAutoPauseFrames = MemacSetTxAutoPauseFrames;
++ p_FmMacControllerDriver->f_FM_MAC_SetTxPauseFrames = MemacSetTxPauseFrames;
++ p_FmMacControllerDriver->f_FM_MAC_SetRxIgnorePauseFrames = MemacSetRxIgnorePauseFrames;
++
++ p_FmMacControllerDriver->f_FM_MAC_ResetCounters = MemacResetCounters;
++ p_FmMacControllerDriver->f_FM_MAC_GetStatistics = MemacGetStatistics;
++
++ p_FmMacControllerDriver->f_FM_MAC_ModifyMacAddr = MemacModifyMacAddress;
++ p_FmMacControllerDriver->f_FM_MAC_AddHashMacAddr = MemacAddHashMacAddress;
++ p_FmMacControllerDriver->f_FM_MAC_RemoveHashMacAddr = MemacDelHashMacAddress;
++ p_FmMacControllerDriver->f_FM_MAC_AddExactMatchMacAddr = MemacAddExactMatchMacAddress;
++ p_FmMacControllerDriver->f_FM_MAC_RemovelExactMatchMacAddr = MemacDelExactMatchMacAddress;
++ p_FmMacControllerDriver->f_FM_MAC_GetId = NULL;
++ p_FmMacControllerDriver->f_FM_MAC_GetVersion = NULL;
++ p_FmMacControllerDriver->f_FM_MAC_GetMaxFrameLength = MemacGetMaxFrameLength;
++
++ p_FmMacControllerDriver->f_FM_MAC_MII_WritePhyReg = MEMAC_MII_WritePhyReg;
++ p_FmMacControllerDriver->f_FM_MAC_MII_ReadPhyReg = MEMAC_MII_ReadPhyReg;
++
++#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
++ p_FmMacControllerDriver->f_FM_MAC_DumpRegs = MemacDumpRegs;
++#endif /* (defined(DEBUG_ERRORS) && ... */
++}
++
++
++/*****************************************************************************/
++/* mEMAC Config Main Entry */
++/*****************************************************************************/
++
++/* ......................................................................... */
++
++t_Handle MEMAC_Config(t_FmMacParams *p_FmMacParam)
++{
++ t_Memac *p_Memac;
++ struct memac_cfg *p_MemacDriverParam;
++ uintptr_t baseAddr;
++
++ SANITY_CHECK_RETURN_VALUE(p_FmMacParam, E_NULL_POINTER, NULL);
++
++ baseAddr = p_FmMacParam->baseAddr;
++ /* Allocate memory for the mEMAC data structure */
++ p_Memac = (t_Memac *)XX_Malloc(sizeof(t_Memac));
++ if (!p_Memac)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("mEMAC driver structure"));
++ return NULL;
++ }
++ memset(p_Memac, 0, sizeof(t_Memac));
++ InitFmMacControllerDriver(&p_Memac->fmMacControllerDriver);
++
++ /* Allocate memory for the mEMAC driver parameters data structure */
++ p_MemacDriverParam = (struct memac_cfg *) XX_Malloc(sizeof(struct memac_cfg));
++ if (!p_MemacDriverParam)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("mEMAC driver parameters"));
++ MemacFree(p_Memac);
++ return NULL;
++ }
++ memset(p_MemacDriverParam, 0, sizeof(struct memac_cfg));
++
++ /* Plant parameter structure pointer */
++ p_Memac->p_MemacDriverParam = p_MemacDriverParam;
++
++ memac_defconfig(p_MemacDriverParam);
++
++ p_Memac->addr = ENET_ADDR_TO_UINT64(p_FmMacParam->addr);
++
++ p_Memac->p_MemMap = (struct memac_regs *)UINT_TO_PTR(baseAddr);
++ p_Memac->p_MiiMemMap = (t_MemacMiiAccessMemMap *)UINT_TO_PTR(baseAddr + MEMAC_TO_MII_OFFSET);
++
++ p_Memac->enetMode = p_FmMacParam->enetMode;
++ p_Memac->macId = p_FmMacParam->macId;
++ p_Memac->exceptions = MEMAC_default_exceptions;
++ p_Memac->f_Exception = p_FmMacParam->f_Exception;
++ p_Memac->f_Event = p_FmMacParam->f_Event;
++ p_Memac->h_App = p_FmMacParam->h_App;
++
++ return p_Memac;
++}
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/memac.h b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/memac.h
+new file mode 100644
+index 0000000..e1c4c53
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/memac.h
+@@ -0,0 +1,104 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File memac.h
++
++ @Description FM Multirate Ethernet MAC (mEMAC)
++*//***************************************************************************/
++#ifndef __MEMAC_H
++#define __MEMAC_H
++
++#include "std_ext.h"
++#include "error_ext.h"
++#include "list_ext.h"
++
++#include "memac_mii_acc.h"
++#include "fm_mac.h"
++#include "fsl_fman_memac.h"
++
++
++#define MEMAC_default_exceptions ((uint32_t)(MEMAC_IMASK_TECC_ER | MEMAC_IMASK_RECC_ER))
++
++#define GET_EXCEPTION_FLAG(bitMask, exception) switch (exception){ \
++ case e_FM_MAC_EX_10G_1TX_ECC_ER: \
++ bitMask = MEMAC_IMASK_TECC_ER; break; \
++ case e_FM_MAC_EX_10G_RX_ECC_ER: \
++ bitMask = MEMAC_IMASK_RECC_ER; break; \
++ default: bitMask = 0;break;}
++
++
++typedef struct
++{
++ t_FmMacControllerDriver fmMacControllerDriver; /**< Upper Mac control block */
++ t_Handle h_App; /**< Handle to the upper layer application */
++ struct memac_regs *p_MemMap; /**< Pointer to MAC memory mapped registers */
++ t_MemacMiiAccessMemMap *p_MiiMemMap; /**< Pointer to MII memory mapped registers */
++ uint64_t addr; /**< MAC address of device */
++ e_EnetMode enetMode; /**< Ethernet physical interface */
++ t_FmMacExceptionCallback *f_Exception;
++ int mdioIrq;
++ t_FmMacExceptionCallback *f_Event;
++ bool indAddrRegUsed[MEMAC_NUM_OF_PADDRS]; /**< Whether a particular individual address recognition register is being used */
++ uint64_t paddr[MEMAC_NUM_OF_PADDRS]; /**< MAC address for particular individual address recognition register */
++ uint8_t numOfIndAddrInRegs; /**< Number of individual addresses in registers for this station. */
++ t_EthHash *p_MulticastAddrHash; /**< Pointer to driver's global address hash table */
++ t_EthHash *p_UnicastAddrHash; /**< Pointer to driver's individual address hash table */
++ bool debugMode;
++ uint8_t macId;
++ uint32_t exceptions;
++ struct memac_cfg *p_MemacDriverParam;
++} t_Memac;
++
++
++/* Internal PHY access */
++#define PHY_MDIO_ADDR 0
++
++/* Internal PHY Registers - SGMII */
++#define PHY_SGMII_CR_PHY_RESET 0x8000
++#define PHY_SGMII_CR_RESET_AN 0x0200
++#define PHY_SGMII_CR_DEF_VAL 0x1140
++#define PHY_SGMII_DEV_ABILITY_SGMII 0x4001
++#define PHY_SGMII_DEV_ABILITY_1000X 0x01A0
++#define PHY_SGMII_IF_MODE_AN 0x0002
++#define PHY_SGMII_IF_MODE_SGMII 0x0001
++#define PHY_SGMII_IF_MODE_1000X 0x0000
++
++
++#define MEMAC_TO_MII_OFFSET 0x030 /* Offset from the MEM map to the MDIO mem map */
++
++t_Error MEMAC_MII_WritePhyReg(t_Handle h_Memac, uint8_t phyAddr, uint8_t reg, uint16_t data);
++t_Error MEMAC_MII_ReadPhyReg(t_Handle h_Memac, uint8_t phyAddr, uint8_t reg, uint16_t *p_Data);
++
++
++#endif /* __MEMAC_H */
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/memac_mii_acc.c b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/memac_mii_acc.c
+new file mode 100644
+index 0000000..be5b867
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/memac_mii_acc.c
+@@ -0,0 +1,240 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++#include "error_ext.h"
++#include "std_ext.h"
++#include "fm_mac.h"
++#include "memac.h"
++#include "xx_ext.h"
++
++#include "fm_common.h"
++
++
++static void WritePhyReg10G(t_MemacMiiAccessMemMap *p_MiiAccess,
++ uint8_t phyAddr,
++ uint8_t reg,
++ uint16_t data)
++{
++ uint32_t tmpReg;
++
++ tmpReg = GET_UINT32(p_MiiAccess->mdio_cfg);
++ /* Leave only MDIO_CLK_DIV bits set on */
++ tmpReg &= MDIO_CFG_CLK_DIV_MASK;
++ /* Set maximum MDIO_HOLD value to allow phy to see
++ change of data signal */
++ tmpReg |= MDIO_CFG_HOLD_MASK;
++ /* Add 10G interface mode */
++ tmpReg |= MDIO_CFG_ENC45;
++ WRITE_UINT32(p_MiiAccess->mdio_cfg, tmpReg);
++
++ /* Wait for command completion */
++ while ((GET_UINT32(p_MiiAccess->mdio_cfg)) & MDIO_CFG_BSY)
++ XX_UDelay(1);
++
++ /* Specify phy and register to be accessed */
++ WRITE_UINT32(p_MiiAccess->mdio_ctrl, phyAddr);
++ WRITE_UINT32(p_MiiAccess->mdio_addr, reg);
++ CORE_MemoryBarrier();
++
++ while ((GET_UINT32(p_MiiAccess->mdio_cfg)) & MDIO_CFG_BSY)
++ XX_UDelay(1);
++
++ /* Write data */
++ WRITE_UINT32(p_MiiAccess->mdio_data, data);
++ CORE_MemoryBarrier();
++
++ /* Wait for write transaction end */
++ while ((GET_UINT32(p_MiiAccess->mdio_data)) & MDIO_DATA_BSY)
++ XX_UDelay(1);
++}
++
++static uint32_t ReadPhyReg10G(t_MemacMiiAccessMemMap *p_MiiAccess,
++ uint8_t phyAddr,
++ uint8_t reg,
++ uint16_t *p_Data)
++{
++ uint32_t tmpReg;
++
++ tmpReg = GET_UINT32(p_MiiAccess->mdio_cfg);
++ /* Leave only MDIO_CLK_DIV bits set on */
++ tmpReg &= MDIO_CFG_CLK_DIV_MASK;
++ /* Set maximum MDIO_HOLD value to allow phy to see
++ change of data signal */
++ tmpReg |= MDIO_CFG_HOLD_MASK;
++ /* Add 10G interface mode */
++ tmpReg |= MDIO_CFG_ENC45;
++ WRITE_UINT32(p_MiiAccess->mdio_cfg, tmpReg);
++
++ /* Wait for command completion */
++ while ((GET_UINT32(p_MiiAccess->mdio_cfg)) & MDIO_CFG_BSY)
++ XX_UDelay(1);
++
++ /* Specify phy and register to be accessed */
++ WRITE_UINT32(p_MiiAccess->mdio_ctrl, phyAddr);
++ WRITE_UINT32(p_MiiAccess->mdio_addr, reg);
++ CORE_MemoryBarrier();
++
++ while ((GET_UINT32(p_MiiAccess->mdio_cfg)) & MDIO_CFG_BSY)
++ XX_UDelay(1);
++
++ /* Read cycle */
++ tmpReg = phyAddr;
++ tmpReg |= MDIO_CTL_READ;
++ WRITE_UINT32(p_MiiAccess->mdio_ctrl, tmpReg);
++ CORE_MemoryBarrier();
++
++ /* Wait for data to be available */
++ while ((GET_UINT32(p_MiiAccess->mdio_data)) & MDIO_DATA_BSY)
++ XX_UDelay(1);
++
++ *p_Data = (uint16_t)GET_UINT32(p_MiiAccess->mdio_data);
++
++ /* Check if there was an error */
++ return GET_UINT32(p_MiiAccess->mdio_cfg);
++}
++
++static void WritePhyReg1G(t_MemacMiiAccessMemMap *p_MiiAccess,
++ uint8_t phyAddr,
++ uint8_t reg,
++ uint16_t data)
++{
++ uint32_t tmpReg;
++
++ /* Leave only MDIO_CLK_DIV and MDIO_HOLD bits set on */
++ tmpReg = GET_UINT32(p_MiiAccess->mdio_cfg);
++ tmpReg &= (MDIO_CFG_CLK_DIV_MASK | MDIO_CFG_HOLD_MASK);
++ WRITE_UINT32(p_MiiAccess->mdio_cfg, tmpReg);
++
++ /* Wait for command completion */
++ while ((GET_UINT32(p_MiiAccess->mdio_cfg)) & MDIO_CFG_BSY)
++ XX_UDelay(1);
++
++ /* Write transaction */
++ tmpReg = (phyAddr << MDIO_CTL_PHY_ADDR_SHIFT);
++ tmpReg |= reg;
++ WRITE_UINT32(p_MiiAccess->mdio_ctrl, tmpReg);
++
++ while ((GET_UINT32(p_MiiAccess->mdio_cfg)) & MDIO_CFG_BSY)
++ XX_UDelay(1);
++
++ WRITE_UINT32(p_MiiAccess->mdio_data, data);
++
++ CORE_MemoryBarrier();
++
++ /* Wait for write transaction to end */
++ while ((GET_UINT32(p_MiiAccess->mdio_data)) & MDIO_DATA_BSY)
++ XX_UDelay(1);
++}
++
++static uint32_t ReadPhyReg1G(t_MemacMiiAccessMemMap *p_MiiAccess,
++ uint8_t phyAddr,
++ uint8_t reg,
++ uint16_t *p_Data)
++{
++ uint32_t tmpReg;
++
++ /* Leave only MDIO_CLK_DIV and MDIO_HOLD bits set on */
++ tmpReg = GET_UINT32(p_MiiAccess->mdio_cfg);
++ tmpReg &= (MDIO_CFG_CLK_DIV_MASK | MDIO_CFG_HOLD_MASK);
++ WRITE_UINT32(p_MiiAccess->mdio_cfg, tmpReg);
++
++ /* Wait for command completion */
++ while ((GET_UINT32(p_MiiAccess->mdio_cfg)) & MDIO_CFG_BSY)
++ XX_UDelay(1);
++
++ /* Read transaction */
++ tmpReg = (phyAddr << MDIO_CTL_PHY_ADDR_SHIFT);
++ tmpReg |= reg;
++ tmpReg |= MDIO_CTL_READ;
++ WRITE_UINT32(p_MiiAccess->mdio_ctrl, tmpReg);
++
++ while ((GET_UINT32(p_MiiAccess->mdio_cfg)) & MDIO_CFG_BSY)
++ XX_UDelay(1);
++
++ /* Wait for data to be available */
++ while ((GET_UINT32(p_MiiAccess->mdio_data)) & MDIO_DATA_BSY)
++ XX_UDelay(1);
++
++ *p_Data = (uint16_t)GET_UINT32(p_MiiAccess->mdio_data);
++
++ /* Check error */
++ return GET_UINT32(p_MiiAccess->mdio_cfg);
++}
++
++/*****************************************************************************/
++t_Error MEMAC_MII_WritePhyReg(t_Handle h_Memac,
++ uint8_t phyAddr,
++ uint8_t reg,
++ uint16_t data)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Memac->p_MiiMemMap, E_INVALID_HANDLE);
++
++ /* Figure out interface type - 10G vs 1G.
++ In 10G interface both phyAddr and devAddr present. */
++ if (ENET_SPEED_FROM_MODE(p_Memac->enetMode) == e_ENET_SPEED_10000)
++ WritePhyReg10G(p_Memac->p_MiiMemMap, phyAddr, reg, data);
++ else
++ WritePhyReg1G(p_Memac->p_MiiMemMap, phyAddr, reg, data);
++
++ return E_OK;
++}
++
++/*****************************************************************************/
++t_Error MEMAC_MII_ReadPhyReg(t_Handle h_Memac,
++ uint8_t phyAddr,
++ uint8_t reg,
++ uint16_t *p_Data)
++{
++ t_Memac *p_Memac = (t_Memac *)h_Memac;
++ uint32_t ans;
++
++ SANITY_CHECK_RETURN_ERROR(p_Memac, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Memac->p_MiiMemMap, E_INVALID_HANDLE);
++
++ /* Figure out interface type - 10G vs 1G.
++ In 10G interface both phyAddr and devAddr present. */
++ if (ENET_SPEED_FROM_MODE(p_Memac->enetMode) == e_ENET_SPEED_10000)
++ ans = ReadPhyReg10G(p_Memac->p_MiiMemMap, phyAddr, reg, p_Data);
++ else
++ ans = ReadPhyReg1G(p_Memac->p_MiiMemMap, phyAddr, reg, p_Data);
++
++ if (ans & MDIO_CFG_READ_ERR)
++ RETURN_ERROR(MINOR, E_INVALID_VALUE,
++ ("Read Error: phyAddr 0x%x, dev 0x%x, reg 0x%x, cfgReg 0x%x",
++ ((phyAddr & 0xe0) >> 5), (phyAddr & 0x1f), reg, ans));
++
++ return E_OK;
++}
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/memac_mii_acc.h b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/memac_mii_acc.h
+new file mode 100644
+index 0000000..dab4360
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/memac_mii_acc.h
+@@ -0,0 +1,73 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++#ifndef __MEMAC_MII_ACC_H
++#define __MEMAC_MII_ACC_H
++
++#include "std_ext.h"
++
++
++/* MII Management Registers */
++#define MDIO_CFG_CLK_DIV_MASK 0x0000ff80
++#define MDIO_CFG_CLK_DIV_SHIFT 7
++#define MDIO_CFG_HOLD_MASK 0x0000001c
++#define MDIO_CFG_ENC45 0x00000040
++#define MDIO_CFG_READ_ERR 0x00000002
++#define MDIO_CFG_BSY 0x00000001
++
++#define MDIO_CTL_PHY_ADDR_SHIFT 5
++#define MDIO_CTL_READ 0x00008000
++
++#define MDIO_DATA_BSY 0x80000000
++
++#if defined(__MWERKS__) && !defined(__GNUC__)
++#pragma pack(push,1)
++#endif /* defined(__MWERKS__) && ... */
++
++/*----------------------------------------------------*/
++/* MII Configuration Control Memory Map Registers */
++/*----------------------------------------------------*/
++typedef _Packed struct t_MemacMiiAccessMemMap
++{
++ volatile uint32_t mdio_cfg; /* 0x030 */
++ volatile uint32_t mdio_ctrl; /* 0x034 */
++ volatile uint32_t mdio_data; /* 0x038 */
++ volatile uint32_t mdio_addr; /* 0x03c */
++} _PackedType t_MemacMiiAccessMemMap ;
++
++#if defined(__MWERKS__) && !defined(__GNUC__)
++#pragma pack(pop)
++#endif /* defined(__MWERKS__) && ... */
++
++
++#endif /* __MEMAC_MII_ACC_H */
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/tgec.c b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/tgec.c
+new file mode 100644
+index 0000000..522d64b
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/tgec.c
+@@ -0,0 +1,1018 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File tgec.c
++
++ @Description FM 10G MAC ...
++*//***************************************************************************/
++
++#include "std_ext.h"
++#include "string_ext.h"
++#include "error_ext.h"
++#include "xx_ext.h"
++#include "endian_ext.h"
++#include "debug_ext.h"
++#include "crc_mac_addr_ext.h"
++
++#include "fm_common.h"
++#include "fsl_fman_tgec.h"
++#include "tgec.h"
++
++
++/*****************************************************************************/
++/* Internal routines */
++/*****************************************************************************/
++
++static t_Error CheckInitParameters(t_Tgec *p_Tgec)
++{
++ if (ENET_SPEED_FROM_MODE(p_Tgec->enetMode) < e_ENET_SPEED_10000)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Ethernet 10G MAC driver only support 10G speed"));
++#if (FM_MAX_NUM_OF_10G_MACS > 0)
++ if (p_Tgec->macId >= FM_MAX_NUM_OF_10G_MACS)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("macId of 10G can not be greater than 0"));
++#endif /* (FM_MAX_NUM_OF_10G_MACS > 0) */
++
++ if (p_Tgec->addr == 0)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Ethernet 10G MAC Must have a valid MAC Address"));
++ if (!p_Tgec->f_Exception)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("uninitialized f_Exception"));
++ if (!p_Tgec->f_Event)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("uninitialized f_Event"));
++#ifdef FM_LEN_CHECK_ERRATA_FMAN_SW002
++ if (!p_Tgec->p_TgecDriverParam->no_length_check_enable)
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("LengthCheck!"));
++#endif /* FM_LEN_CHECK_ERRATA_FMAN_SW002 */
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static uint32_t GetMacAddrHashCode(uint64_t ethAddr)
++{
++ uint32_t crc;
++
++ /* CRC calculation */
++ GET_MAC_ADDR_CRC(ethAddr, crc);
++
++ crc = GetMirror32(crc);
++
++ return crc;
++}
++
++/* ......................................................................... */
++
++static void TgecErrException(t_Handle h_Tgec)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++ uint32_t event;
++ struct tgec_regs *p_TgecMemMap = p_Tgec->p_MemMap;
++
++ /* do not handle MDIO events */
++ event = tgec_get_event(p_TgecMemMap, ~(TGEC_IMASK_MDIO_SCAN_EVENT | TGEC_IMASK_MDIO_CMD_CMPL));
++ event &= tgec_get_interrupt_mask(p_TgecMemMap);
++
++ tgec_ack_event(p_TgecMemMap, event);
++
++ if (event & TGEC_IMASK_REM_FAULT)
++ p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_REM_FAULT);
++ if (event & TGEC_IMASK_LOC_FAULT)
++ p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_LOC_FAULT);
++ if (event & TGEC_IMASK_TX_ECC_ER)
++ p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_1TX_ECC_ER);
++ if (event & TGEC_IMASK_TX_FIFO_UNFL)
++ p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_TX_FIFO_UNFL);
++ if (event & TGEC_IMASK_TX_FIFO_OVFL)
++ p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_TX_FIFO_OVFL);
++ if (event & TGEC_IMASK_TX_ER)
++ p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_TX_ER);
++ if (event & TGEC_IMASK_RX_FIFO_OVFL)
++ p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_FIFO_OVFL);
++ if (event & TGEC_IMASK_RX_ECC_ER)
++ p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_ECC_ER);
++ if (event & TGEC_IMASK_RX_JAB_FRM)
++ p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_JAB_FRM);
++ if (event & TGEC_IMASK_RX_OVRSZ_FRM)
++ p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_OVRSZ_FRM);
++ if (event & TGEC_IMASK_RX_RUNT_FRM)
++ p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_RUNT_FRM);
++ if (event & TGEC_IMASK_RX_FRAG_FRM)
++ p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_FRAG_FRM);
++ if (event & TGEC_IMASK_RX_LEN_ER)
++ p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_LEN_ER);
++ if (event & TGEC_IMASK_RX_CRC_ER)
++ p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_CRC_ER);
++ if (event & TGEC_IMASK_RX_ALIGN_ER)
++ p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_ALIGN_ER);
++}
++
++/* ......................................................................... */
++
++static void TgecException(t_Handle h_Tgec)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++ uint32_t event;
++ struct tgec_regs *p_TgecMemMap = p_Tgec->p_MemMap;
++
++ /* handle only MDIO events */
++ event = tgec_get_event(p_TgecMemMap, (TGEC_IMASK_MDIO_SCAN_EVENT | TGEC_IMASK_MDIO_CMD_CMPL));
++ event &= tgec_get_interrupt_mask(p_TgecMemMap);
++
++ tgec_ack_event(p_TgecMemMap, event);
++
++ if (event & TGEC_IMASK_MDIO_SCAN_EVENT)
++ p_Tgec->f_Event(p_Tgec->h_App, e_FM_MAC_EX_10G_MDIO_SCAN_EVENTMDIO);
++ if (event & TGEC_IMASK_MDIO_CMD_CMPL)
++ p_Tgec->f_Event(p_Tgec->h_App, e_FM_MAC_EX_10G_MDIO_CMD_CMPL);
++}
++
++/* ......................................................................... */
++
++static void FreeInitResources(t_Tgec *p_Tgec)
++{
++ if ((p_Tgec->mdioIrq != 0) && (p_Tgec->mdioIrq != NO_IRQ))
++ {
++ XX_DisableIntr(p_Tgec->mdioIrq);
++ XX_FreeIntr(p_Tgec->mdioIrq);
++ }
++ else if (p_Tgec->mdioIrq == 0)
++ REPORT_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++ FmUnregisterIntr(p_Tgec->fmMacControllerDriver.h_Fm, e_FM_MOD_10G_MAC, p_Tgec->macId, e_FM_INTR_TYPE_ERR);
++
++ /* release the driver's group hash table */
++ FreeHashTable(p_Tgec->p_MulticastAddrHash);
++ p_Tgec->p_MulticastAddrHash = NULL;
++
++ /* release the driver's individual hash table */
++ FreeHashTable(p_Tgec->p_UnicastAddrHash);
++ p_Tgec->p_UnicastAddrHash = NULL;
++}
++
++
++/*****************************************************************************/
++/* 10G MAC API routines */
++/*****************************************************************************/
++
++/* ......................................................................... */
++
++static t_Error TgecEnable(t_Handle h_Tgec, e_CommMode mode)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++
++ tgec_enable(p_Tgec->p_MemMap, (mode & e_COMM_MODE_RX), (mode & e_COMM_MODE_TX));
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error TgecDisable (t_Handle h_Tgec, e_CommMode mode)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++
++ tgec_disable(p_Tgec->p_MemMap, (mode & e_COMM_MODE_RX), (mode & e_COMM_MODE_TX));
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error TgecSetPromiscuous(t_Handle h_Tgec, bool newVal)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++
++ tgec_set_promiscuous(p_Tgec->p_MemMap, newVal);
++
++ return E_OK;
++}
++
++
++/*****************************************************************************/
++/* Tgec Configs modification functions */
++/*****************************************************************************/
++
++/* ......................................................................... */
++
++static t_Error TgecConfigLoopback(t_Handle h_Tgec, bool newVal)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++
++ p_Tgec->p_TgecDriverParam->loopback_enable = newVal;
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error TgecConfigWan(t_Handle h_Tgec, bool newVal)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++
++ p_Tgec->p_TgecDriverParam->wan_mode_enable = newVal;
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error TgecConfigMaxFrameLength(t_Handle h_Tgec, uint16_t newVal)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++
++ p_Tgec->p_TgecDriverParam->max_frame_length = newVal;
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error TgecConfigLengthCheck(t_Handle h_Tgec, bool newVal)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++
++ UNUSED(newVal);
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++
++ p_Tgec->p_TgecDriverParam->no_length_check_enable = !newVal;
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error TgecConfigException(t_Handle h_Tgec, e_FmMacExceptions exception, bool enable)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++ uint32_t bitMask = 0;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++
++ GET_EXCEPTION_FLAG(bitMask, exception);
++ if (bitMask)
++ {
++ if (enable)
++ p_Tgec->exceptions |= bitMask;
++ else
++ p_Tgec->exceptions &= ~bitMask;
++ }
++ else
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
++
++ return E_OK;
++}
++
++#ifdef FM_TX_ECC_FRMS_ERRATA_10GMAC_A004
++/* ......................................................................... */
++
++static t_Error TgecConfigSkipFman11Workaround(t_Handle h_Tgec)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++
++ p_Tgec->p_TgecDriverParam->skip_fman11_workaround = TRUE;
++
++ return E_OK;
++}
++#endif /* FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 */
++
++
++/*****************************************************************************/
++/* Tgec Run Time API functions */
++/*****************************************************************************/
++
++/* ......................................................................... */
++/* backward compatibility. will be removed in the future. */
++static t_Error TgecTxMacPause(t_Handle h_Tgec, uint16_t pauseTime)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++ tgec_tx_mac_pause(p_Tgec->p_MemMap, pauseTime);
++
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error TgecSetTxPauseFrames(t_Handle h_Tgec,
++ uint8_t priority,
++ uint16_t pauseTime,
++ uint16_t threshTime)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++
++ UNUSED(priority); UNUSED(threshTime);
++
++ tgec_tx_mac_pause(p_Tgec->p_MemMap, pauseTime);
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error TgecRxIgnoreMacPause(t_Handle h_Tgec, bool en)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++
++ tgec_rx_ignore_mac_pause(p_Tgec->p_MemMap, en);
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error TgecGetStatistics(t_Handle h_Tgec, t_FmMacStatistics *p_Statistics)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++ struct tgec_regs *p_TgecMemMap;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(p_Statistics, E_NULL_POINTER);
++
++ p_TgecMemMap = p_Tgec->p_MemMap;
++
++ p_Statistics->eStatPkts64 = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_R64);
++ p_Statistics->eStatPkts65to127 = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_R127);
++ p_Statistics->eStatPkts128to255 = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_R255);
++ p_Statistics->eStatPkts256to511 = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_R511);
++ p_Statistics->eStatPkts512to1023 = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_R1023);
++ p_Statistics->eStatPkts1024to1518 = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_R1518);
++ p_Statistics->eStatPkts1519to1522 = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_R1519X);
++/* */
++ p_Statistics->eStatFragments = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TRFRG);
++ p_Statistics->eStatJabbers = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TRJBR);
++
++ p_Statistics->eStatsDropEvents = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_RDRP);
++ p_Statistics->eStatCRCAlignErrors = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_RALN);
++
++ p_Statistics->eStatUndersizePkts = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TRUND);
++ p_Statistics->eStatOversizePkts = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TROVR);
++/* Pause */
++ p_Statistics->reStatPause = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_RXPF);
++ p_Statistics->teStatPause = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TXPF);
++
++/* MIB II */
++ p_Statistics->ifInOctets = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_ROCT);
++ p_Statistics->ifInUcastPkts = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_RUCA);
++ p_Statistics->ifInMcastPkts = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_RMCA);
++ p_Statistics->ifInBcastPkts = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_RBCA);
++ p_Statistics->ifInPkts = p_Statistics->ifInUcastPkts
++ + p_Statistics->ifInMcastPkts
++ + p_Statistics->ifInBcastPkts;
++ p_Statistics->ifInDiscards = 0;
++ p_Statistics->ifInErrors = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_RERR);
++
++ p_Statistics->ifOutOctets = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TOCT);
++ p_Statistics->ifOutUcastPkts = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TUCA);
++ p_Statistics->ifOutMcastPkts = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TMCA);
++ p_Statistics->ifOutBcastPkts = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TBCA);
++ p_Statistics->ifOutPkts = p_Statistics->ifOutUcastPkts
++ + p_Statistics->ifOutMcastPkts
++ + p_Statistics->ifOutBcastPkts;
++ p_Statistics->ifOutDiscards = 0;
++ p_Statistics->ifOutErrors = tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TERR);
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error TgecEnable1588TimeStamp(t_Handle h_Tgec)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++
++ tgec_enable_1588_time_stamp(p_Tgec->p_MemMap, 1);
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error TgecDisable1588TimeStamp(t_Handle h_Tgec)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++
++ tgec_enable_1588_time_stamp(p_Tgec->p_MemMap, 0);
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error TgecModifyMacAddress (t_Handle h_Tgec, t_EnetAddr *p_EnetAddr)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++
++ p_Tgec->addr = ENET_ADDR_TO_UINT64(*p_EnetAddr);
++ tgec_set_mac_address(p_Tgec->p_MemMap, (uint8_t *)(*p_EnetAddr));
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error TgecResetCounters (t_Handle h_Tgec)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++
++ tgec_reset_stat(p_Tgec->p_MemMap);
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error TgecAddExactMatchMacAddress(t_Handle h_Tgec, t_EnetAddr *p_EthAddr)
++{
++ t_Tgec *p_Tgec = (t_Tgec *) h_Tgec;
++ uint64_t ethAddr;
++ uint8_t paddrNum;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++
++ ethAddr = ENET_ADDR_TO_UINT64(*p_EthAddr);
++
++ if (ethAddr & GROUP_ADDRESS)
++ /* Multicast address has no effect in PADDR */
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Multicast address"));
++
++ /* Make sure no PADDR contains this address */
++ for (paddrNum = 0; paddrNum < TGEC_NUM_OF_PADDRS; paddrNum++)
++ if (p_Tgec->indAddrRegUsed[paddrNum])
++ if (p_Tgec->paddr[paddrNum] == ethAddr)
++ RETURN_ERROR(MAJOR, E_ALREADY_EXISTS, NO_MSG);
++
++ /* Find first unused PADDR */
++ for (paddrNum = 0; paddrNum < TGEC_NUM_OF_PADDRS; paddrNum++)
++ {
++ if (!(p_Tgec->indAddrRegUsed[paddrNum]))
++ {
++ /* mark this PADDR as used */
++ p_Tgec->indAddrRegUsed[paddrNum] = TRUE;
++ /* store address */
++ p_Tgec->paddr[paddrNum] = ethAddr;
++
++ /* put in hardware */
++ tgec_add_addr_in_paddr(p_Tgec->p_MemMap, (uint8_t*)(*p_EthAddr)/* , paddrNum */);
++ p_Tgec->numOfIndAddrInRegs++;
++
++ return E_OK;
++ }
++ }
++
++ /* No free PADDR */
++ RETURN_ERROR(MAJOR, E_FULL, NO_MSG);
++}
++
++/* ......................................................................... */
++
++static t_Error TgecDelExactMatchMacAddress(t_Handle h_Tgec, t_EnetAddr *p_EthAddr)
++{
++ t_Tgec *p_Tgec = (t_Tgec *) h_Tgec;
++ uint64_t ethAddr;
++ uint8_t paddrNum;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++
++ ethAddr = ENET_ADDR_TO_UINT64(*p_EthAddr);
++
++ /* Find used PADDR containing this address */
++ for (paddrNum = 0; paddrNum < TGEC_NUM_OF_PADDRS; paddrNum++)
++ {
++ if ((p_Tgec->indAddrRegUsed[paddrNum]) &&
++ (p_Tgec->paddr[paddrNum] == ethAddr))
++ {
++ /* mark this PADDR as not used */
++ p_Tgec->indAddrRegUsed[paddrNum] = FALSE;
++ /* clear in hardware */
++ tgec_clear_addr_in_paddr(p_Tgec->p_MemMap /*, paddrNum */);
++ p_Tgec->numOfIndAddrInRegs--;
++
++ return E_OK;
++ }
++ }
++
++ RETURN_ERROR(MAJOR, E_NOT_FOUND, NO_MSG);
++}
++
++/* ......................................................................... */
++
++static t_Error TgecAddHashMacAddress(t_Handle h_Tgec, t_EnetAddr *p_EthAddr)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++ t_EthHashEntry *p_HashEntry;
++ uint32_t crc;
++ uint32_t hash;
++ uint64_t ethAddr;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++
++ ethAddr = ENET_ADDR_TO_UINT64(*p_EthAddr);
++
++ if (!(ethAddr & GROUP_ADDRESS))
++ /* Unicast addresses not supported in hash */
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("Unicast Address"));
++
++ /* CRC calculation */
++ crc = GetMacAddrHashCode(ethAddr);
++
++ hash = (crc >> TGEC_HASH_MCAST_SHIFT) & TGEC_HASH_ADR_MSK; /* Take 9 MSB bits */
++
++ /* Create element to be added to the driver hash table */
++ p_HashEntry = (t_EthHashEntry *)XX_Malloc(sizeof(t_EthHashEntry));
++ p_HashEntry->addr = ethAddr;
++ INIT_LIST(&p_HashEntry->node);
++
++ LIST_AddToTail(&(p_HashEntry->node), &(p_Tgec->p_MulticastAddrHash->p_Lsts[hash]));
++ tgec_set_hash_table(p_Tgec->p_MemMap, (hash | TGEC_HASH_MCAST_EN));
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error TgecDelHashMacAddress(t_Handle h_Tgec, t_EnetAddr *p_EthAddr)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++ t_EthHashEntry *p_HashEntry = NULL;
++ t_List *p_Pos;
++ uint32_t crc;
++ uint32_t hash;
++ uint64_t ethAddr;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++
++ ethAddr = ((*(uint64_t *)p_EthAddr) >> 16);
++
++ /* CRC calculation */
++ crc = GetMacAddrHashCode(ethAddr);
++
++ hash = (crc >> TGEC_HASH_MCAST_SHIFT) & TGEC_HASH_ADR_MSK; /* Take 9 MSB bits */
++
++ LIST_FOR_EACH(p_Pos, &(p_Tgec->p_MulticastAddrHash->p_Lsts[hash]))
++ {
++ p_HashEntry = ETH_HASH_ENTRY_OBJ(p_Pos);
++ if (p_HashEntry->addr == ethAddr)
++ {
++ LIST_DelAndInit(&p_HashEntry->node);
++ XX_Free(p_HashEntry);
++ break;
++ }
++ }
++ if (LIST_IsEmpty(&p_Tgec->p_MulticastAddrHash->p_Lsts[hash]))
++ tgec_set_hash_table(p_Tgec->p_MemMap, (hash & ~TGEC_HASH_MCAST_EN));
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error TgecGetId(t_Handle h_Tgec, uint32_t *macId)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++
++ UNUSED(p_Tgec);
++ UNUSED(macId);
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("TgecGetId Not Supported"));
++}
++
++/* ......................................................................... */
++
++static t_Error TgecGetVersion(t_Handle h_Tgec, uint32_t *macVersion)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++
++ *macVersion = tgec_get_revision(p_Tgec->p_MemMap);
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error TgecSetExcpetion(t_Handle h_Tgec, e_FmMacExceptions exception, bool enable)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++ uint32_t bitMask = 0;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++
++ GET_EXCEPTION_FLAG(bitMask, exception);
++ if (bitMask)
++ {
++ if (enable)
++ p_Tgec->exceptions |= bitMask;
++ else
++ p_Tgec->exceptions &= ~bitMask;
++ }
++ else
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
++
++ if (enable)
++ tgec_enable_interrupt(p_Tgec->p_MemMap, bitMask);
++ else
++ tgec_disable_interrupt(p_Tgec->p_MemMap, bitMask);
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static uint16_t TgecGetMaxFrameLength(t_Handle h_Tgec)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++
++ SANITY_CHECK_RETURN_VALUE(p_Tgec, E_INVALID_HANDLE, 0);
++ SANITY_CHECK_RETURN_VALUE(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE, 0);
++
++ return tgec_get_max_frame_len(p_Tgec->p_MemMap);
++}
++
++/* ......................................................................... */
++
++#ifdef FM_TX_ECC_FRMS_ERRATA_10GMAC_A004
++static t_Error TgecTxEccWorkaround(t_Tgec *p_Tgec)
++{
++ t_Error err;
++
++#if defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0)
++ XX_Print("Applying 10G TX ECC workaround (10GMAC-A004) ... ");
++#endif /* (DEBUG_ERRORS > 0) */
++ /* enable and set promiscuous */
++ tgec_enable(p_Tgec->p_MemMap, TRUE, TRUE);
++ tgec_set_promiscuous(p_Tgec->p_MemMap, TRUE);
++ err = Fm10GTxEccWorkaround(p_Tgec->fmMacControllerDriver.h_Fm, p_Tgec->macId);
++ /* disable */
++ tgec_set_promiscuous(p_Tgec->p_MemMap, FALSE);
++ tgec_enable(p_Tgec->p_MemMap, FALSE, FALSE);
++#if defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0)
++ if (err)
++ XX_Print("FAILED!\n");
++ else
++ XX_Print("done.\n");
++#endif /* (DEBUG_ERRORS > 0) */
++ tgec_reset_stat(p_Tgec->p_MemMap);
++
++ return err;
++}
++#endif /* FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 */
++
++/* ......................................................................... */
++
++#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
++static t_Error TgecDumpRegs(t_Handle h_Tgec)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++
++ DECLARE_DUMP;
++
++ if (p_Tgec->p_MemMap)
++ {
++ DUMP_TITLE(p_Tgec->p_MemMap, ("10G MAC %d: ", p_Tgec->macId));
++ DUMP_VAR(p_Tgec->p_MemMap, tgec_id);
++ DUMP_VAR(p_Tgec->p_MemMap, command_config);
++ DUMP_VAR(p_Tgec->p_MemMap, mac_addr_0);
++ DUMP_VAR(p_Tgec->p_MemMap, mac_addr_1);
++ DUMP_VAR(p_Tgec->p_MemMap, maxfrm);
++ DUMP_VAR(p_Tgec->p_MemMap, pause_quant);
++ DUMP_VAR(p_Tgec->p_MemMap, rx_fifo_sections);
++ DUMP_VAR(p_Tgec->p_MemMap, tx_fifo_sections);
++ DUMP_VAR(p_Tgec->p_MemMap, rx_fifo_almost_f_e);
++ DUMP_VAR(p_Tgec->p_MemMap, tx_fifo_almost_f_e);
++ DUMP_VAR(p_Tgec->p_MemMap, hashtable_ctrl);
++ DUMP_VAR(p_Tgec->p_MemMap, mdio_cfg_status);
++ DUMP_VAR(p_Tgec->p_MemMap, mdio_command);
++ DUMP_VAR(p_Tgec->p_MemMap, mdio_data);
++ DUMP_VAR(p_Tgec->p_MemMap, mdio_regaddr);
++ DUMP_VAR(p_Tgec->p_MemMap, status);
++ DUMP_VAR(p_Tgec->p_MemMap, tx_ipg_len);
++ DUMP_VAR(p_Tgec->p_MemMap, mac_addr_2);
++ DUMP_VAR(p_Tgec->p_MemMap, mac_addr_3);
++ DUMP_VAR(p_Tgec->p_MemMap, rx_fifo_ptr_rd);
++ DUMP_VAR(p_Tgec->p_MemMap, rx_fifo_ptr_wr);
++ DUMP_VAR(p_Tgec->p_MemMap, tx_fifo_ptr_rd);
++ DUMP_VAR(p_Tgec->p_MemMap, tx_fifo_ptr_wr);
++ DUMP_VAR(p_Tgec->p_MemMap, imask);
++ DUMP_VAR(p_Tgec->p_MemMap, ievent);
++ }
++
++ return E_OK;
++}
++#endif /* (defined(DEBUG_ERRORS) && ... */
++
++
++/*****************************************************************************/
++/* FM Init & Free API */
++/*****************************************************************************/
++
++/* ......................................................................... */
++
++static t_Error TgecInit(t_Handle h_Tgec)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++ struct tgec_cfg *p_TgecDriverParam;
++ t_EnetAddr ethAddr;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(p_Tgec->fmMacControllerDriver.h_Fm, E_INVALID_HANDLE);
++
++ FM_GetRevision(p_Tgec->fmMacControllerDriver.h_Fm, &p_Tgec->fmMacControllerDriver.fmRevInfo);
++ CHECK_INIT_PARAMETERS(p_Tgec, CheckInitParameters);
++
++ p_TgecDriverParam = p_Tgec->p_TgecDriverParam;
++
++ MAKE_ENET_ADDR_FROM_UINT64(p_Tgec->addr, ethAddr);
++ tgec_set_mac_address(p_Tgec->p_MemMap, (uint8_t *)ethAddr);
++
++ /* interrupts */
++#ifdef FM_10G_REM_N_LCL_FLT_EX_10GMAC_ERRATA_SW005
++ {
++ if (p_Tgec->fmMacControllerDriver.fmRevInfo.majorRev <=2)
++ p_Tgec->exceptions &= ~(TGEC_IMASK_REM_FAULT | TGEC_IMASK_LOC_FAULT);
++ }
++#endif /* FM_10G_REM_N_LCL_FLT_EX_10GMAC_ERRATA_SW005 */
++
++#ifdef FM_TX_ECC_FRMS_ERRATA_10GMAC_A004
++ if (p_Tgec->fmMacControllerDriver.fmRevInfo.majorRev <= 6 /*fixed for rev3 */)
++ {
++ if (!p_Tgec->p_TgecDriverParam->skip_fman11_workaround &&
++ ((err = TgecTxEccWorkaround(p_Tgec)) != E_OK))
++ {
++ FreeInitResources(p_Tgec);
++ REPORT_ERROR(MINOR, err, ("TgecTxEccWorkaround FAILED"));
++ }
++ }
++#endif /* FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 */
++
++ err = tgec_init(p_Tgec->p_MemMap, p_TgecDriverParam, p_Tgec->exceptions);
++ if (err)
++ {
++ FreeInitResources(p_Tgec);
++ RETURN_ERROR(MAJOR, err, ("This TGEC version does not support the required i/f mode"));
++ }
++
++ /* Max Frame Length */
++ err = FmSetMacMaxFrame(p_Tgec->fmMacControllerDriver.h_Fm,
++ e_FM_MAC_10G,
++ p_Tgec->fmMacControllerDriver.macId,
++ p_TgecDriverParam->max_frame_length);
++ /* we consider having no IPC a non crasher... */
++
++#ifdef FM_TX_FIFO_CORRUPTION_ERRATA_10GMAC_A007
++ if (p_Tgec->fmMacControllerDriver.fmRevInfo.majorRev == 2)
++ tgec_fm_tx_fifo_corruption_errata_10gmac_a007(p_Tgec->p_MemMap);
++#endif /* FM_TX_FIFO_CORRUPTION_ERRATA_10GMAC_A007 */
++
++ p_Tgec->p_MulticastAddrHash = AllocHashTable(HASH_TABLE_SIZE);
++ if (!p_Tgec->p_MulticastAddrHash)
++ {
++ FreeInitResources(p_Tgec);
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("allocation hash table is FAILED"));
++ }
++
++ p_Tgec->p_UnicastAddrHash = AllocHashTable(HASH_TABLE_SIZE);
++ if (!p_Tgec->p_UnicastAddrHash)
++ {
++ FreeInitResources(p_Tgec);
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("allocation hash table is FAILED"));
++ }
++
++ FmRegisterIntr(p_Tgec->fmMacControllerDriver.h_Fm,
++ e_FM_MOD_10G_MAC,
++ p_Tgec->macId,
++ e_FM_INTR_TYPE_ERR,
++ TgecErrException,
++ p_Tgec);
++ if ((p_Tgec->mdioIrq != 0) && (p_Tgec->mdioIrq != NO_IRQ))
++ {
++ XX_SetIntr(p_Tgec->mdioIrq, TgecException, p_Tgec);
++ XX_EnableIntr(p_Tgec->mdioIrq);
++ }
++ else if (p_Tgec->mdioIrq == 0)
++ REPORT_ERROR(MINOR, E_NOT_SUPPORTED, (NO_MSG));
++
++ XX_Free(p_TgecDriverParam);
++ p_Tgec->p_TgecDriverParam = NULL;
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static t_Error TgecFree(t_Handle h_Tgec)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
++
++ FreeInitResources(p_Tgec);
++
++ if (p_Tgec->p_TgecDriverParam)
++ {
++ XX_Free(p_Tgec->p_TgecDriverParam);
++ p_Tgec->p_TgecDriverParam = NULL;
++ }
++ XX_Free (p_Tgec);
++
++ return E_OK;
++}
++
++/* ......................................................................... */
++
++static void InitFmMacControllerDriver(t_FmMacControllerDriver *p_FmMacControllerDriver)
++{
++ p_FmMacControllerDriver->f_FM_MAC_Init = TgecInit;
++ p_FmMacControllerDriver->f_FM_MAC_Free = TgecFree;
++
++ p_FmMacControllerDriver->f_FM_MAC_SetStatistics = NULL;
++ p_FmMacControllerDriver->f_FM_MAC_ConfigLoopback = TgecConfigLoopback;
++ p_FmMacControllerDriver->f_FM_MAC_ConfigMaxFrameLength = TgecConfigMaxFrameLength;
++
++ p_FmMacControllerDriver->f_FM_MAC_ConfigWan = TgecConfigWan;
++
++ p_FmMacControllerDriver->f_FM_MAC_ConfigPadAndCrc = NULL; /* TGEC always works with pad+crc */
++ p_FmMacControllerDriver->f_FM_MAC_ConfigHalfDuplex = NULL; /* half-duplex is not supported in xgec */
++ p_FmMacControllerDriver->f_FM_MAC_ConfigLengthCheck = TgecConfigLengthCheck;
++ p_FmMacControllerDriver->f_FM_MAC_ConfigException = TgecConfigException;
++ p_FmMacControllerDriver->f_FM_MAC_ConfigResetOnInit = NULL;
++
++#ifdef FM_TX_ECC_FRMS_ERRATA_10GMAC_A004
++ p_FmMacControllerDriver->f_FM_MAC_ConfigSkipFman11Workaround= TgecConfigSkipFman11Workaround;
++#endif /* FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 */
++
++ p_FmMacControllerDriver->f_FM_MAC_SetException = TgecSetExcpetion;
++
++ p_FmMacControllerDriver->f_FM_MAC_Enable1588TimeStamp = TgecEnable1588TimeStamp;
++ p_FmMacControllerDriver->f_FM_MAC_Disable1588TimeStamp = TgecDisable1588TimeStamp;
++
++ p_FmMacControllerDriver->f_FM_MAC_SetPromiscuous = TgecSetPromiscuous;
++ p_FmMacControllerDriver->f_FM_MAC_AdjustLink = NULL;
++ p_FmMacControllerDriver->f_FM_MAC_RestartAutoneg = NULL;
++
++ p_FmMacControllerDriver->f_FM_MAC_Enable = TgecEnable;
++ p_FmMacControllerDriver->f_FM_MAC_Disable = TgecDisable;
++
++ p_FmMacControllerDriver->f_FM_MAC_SetTxAutoPauseFrames = TgecTxMacPause;
++ p_FmMacControllerDriver->f_FM_MAC_SetTxPauseFrames = TgecSetTxPauseFrames;
++ p_FmMacControllerDriver->f_FM_MAC_SetRxIgnorePauseFrames = TgecRxIgnoreMacPause;
++
++ p_FmMacControllerDriver->f_FM_MAC_ResetCounters = TgecResetCounters;
++ p_FmMacControllerDriver->f_FM_MAC_GetStatistics = TgecGetStatistics;
++
++ p_FmMacControllerDriver->f_FM_MAC_ModifyMacAddr = TgecModifyMacAddress;
++ p_FmMacControllerDriver->f_FM_MAC_AddHashMacAddr = TgecAddHashMacAddress;
++ p_FmMacControllerDriver->f_FM_MAC_RemoveHashMacAddr = TgecDelHashMacAddress;
++ p_FmMacControllerDriver->f_FM_MAC_AddExactMatchMacAddr = TgecAddExactMatchMacAddress;
++ p_FmMacControllerDriver->f_FM_MAC_RemovelExactMatchMacAddr = TgecDelExactMatchMacAddress;
++ p_FmMacControllerDriver->f_FM_MAC_GetId = TgecGetId;
++ p_FmMacControllerDriver->f_FM_MAC_GetVersion = TgecGetVersion;
++ p_FmMacControllerDriver->f_FM_MAC_GetMaxFrameLength = TgecGetMaxFrameLength;
++
++ p_FmMacControllerDriver->f_FM_MAC_MII_WritePhyReg = TGEC_MII_WritePhyReg;
++ p_FmMacControllerDriver->f_FM_MAC_MII_ReadPhyReg = TGEC_MII_ReadPhyReg;
++
++#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
++ p_FmMacControllerDriver->f_FM_MAC_DumpRegs = TgecDumpRegs;
++#endif /* (defined(DEBUG_ERRORS) && ... */
++}
++
++
++/*****************************************************************************/
++/* Tgec Config Main Entry */
++/*****************************************************************************/
++
++/* ......................................................................... */
++
++t_Handle TGEC_Config(t_FmMacParams *p_FmMacParam)
++{
++ t_Tgec *p_Tgec;
++ struct tgec_cfg *p_TgecDriverParam;
++ uintptr_t baseAddr;
++
++ SANITY_CHECK_RETURN_VALUE(p_FmMacParam, E_NULL_POINTER, NULL);
++
++ baseAddr = p_FmMacParam->baseAddr;
++ /* allocate memory for the UCC GETH data structure. */
++ p_Tgec = (t_Tgec *)XX_Malloc(sizeof(t_Tgec));
++ if (!p_Tgec)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("10G MAC driver structure"));
++ return NULL;
++ }
++ memset(p_Tgec, 0, sizeof(t_Tgec));
++ InitFmMacControllerDriver(&p_Tgec->fmMacControllerDriver);
++
++ /* allocate memory for the 10G MAC driver parameters data structure. */
++ p_TgecDriverParam = (struct tgec_cfg *) XX_Malloc(sizeof(struct tgec_cfg));
++ if (!p_TgecDriverParam)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("10G MAC driver parameters"));
++ TgecFree(p_Tgec);
++ return NULL;
++ }
++ memset(p_TgecDriverParam, 0, sizeof(struct tgec_cfg));
++
++ /* Plant parameter structure pointer */
++ p_Tgec->p_TgecDriverParam = p_TgecDriverParam;
++
++ tgec_defconfig(p_TgecDriverParam);
++
++ p_Tgec->p_MemMap = (struct tgec_regs *)UINT_TO_PTR(baseAddr);
++ p_Tgec->p_MiiMemMap = (t_TgecMiiAccessMemMap *)UINT_TO_PTR(baseAddr + TGEC_TO_MII_OFFSET);
++ p_Tgec->addr = ENET_ADDR_TO_UINT64(p_FmMacParam->addr);
++ p_Tgec->enetMode = p_FmMacParam->enetMode;
++ p_Tgec->macId = p_FmMacParam->macId;
++ p_Tgec->exceptions = DEFAULT_exceptions;
++ p_Tgec->mdioIrq = p_FmMacParam->mdioIrq;
++ p_Tgec->f_Exception = p_FmMacParam->f_Exception;
++ p_Tgec->f_Event = p_FmMacParam->f_Event;
++ p_Tgec->h_App = p_FmMacParam->h_App;
++
++ return p_Tgec;
++}
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/tgec.h b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/tgec.h
+new file mode 100644
+index 0000000..2aa3923
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/tgec.h
+@@ -0,0 +1,151 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File tgec.h
++
++ @Description FM 10G MAC ...
++*//***************************************************************************/
++#ifndef __TGEC_H
++#define __TGEC_H
++
++#include "std_ext.h"
++#include "error_ext.h"
++#include "list_ext.h"
++#include "enet_ext.h"
++
++#include "tgec_mii_acc.h"
++#include "fm_mac.h"
++
++
++#define DEFAULT_exceptions \
++ ((uint32_t)(TGEC_IMASK_MDIO_SCAN_EVENT | \
++ TGEC_IMASK_REM_FAULT | \
++ TGEC_IMASK_LOC_FAULT | \
++ TGEC_IMASK_TX_ECC_ER | \
++ TGEC_IMASK_TX_FIFO_UNFL | \
++ TGEC_IMASK_TX_FIFO_OVFL | \
++ TGEC_IMASK_TX_ER | \
++ TGEC_IMASK_RX_FIFO_OVFL | \
++ TGEC_IMASK_RX_ECC_ER | \
++ TGEC_IMASK_RX_JAB_FRM | \
++ TGEC_IMASK_RX_OVRSZ_FRM | \
++ TGEC_IMASK_RX_RUNT_FRM | \
++ TGEC_IMASK_RX_FRAG_FRM | \
++ TGEC_IMASK_RX_CRC_ER | \
++ TGEC_IMASK_RX_ALIGN_ER))
++
++#define GET_EXCEPTION_FLAG(bitMask, exception) switch (exception){ \
++ case e_FM_MAC_EX_10G_MDIO_SCAN_EVENTMDIO: \
++ bitMask = TGEC_IMASK_MDIO_SCAN_EVENT ; break; \
++ case e_FM_MAC_EX_10G_MDIO_CMD_CMPL: \
++ bitMask = TGEC_IMASK_MDIO_CMD_CMPL ; break; \
++ case e_FM_MAC_EX_10G_REM_FAULT: \
++ bitMask = TGEC_IMASK_REM_FAULT ; break; \
++ case e_FM_MAC_EX_10G_LOC_FAULT: \
++ bitMask = TGEC_IMASK_LOC_FAULT ; break; \
++ case e_FM_MAC_EX_10G_1TX_ECC_ER: \
++ bitMask = TGEC_IMASK_TX_ECC_ER ; break; \
++ case e_FM_MAC_EX_10G_TX_FIFO_UNFL: \
++ bitMask = TGEC_IMASK_TX_FIFO_UNFL ; break; \
++ case e_FM_MAC_EX_10G_TX_FIFO_OVFL: \
++ bitMask = TGEC_IMASK_TX_FIFO_OVFL ; break; \
++ case e_FM_MAC_EX_10G_TX_ER: \
++ bitMask = TGEC_IMASK_TX_ER ; break; \
++ case e_FM_MAC_EX_10G_RX_FIFO_OVFL: \
++ bitMask = TGEC_IMASK_RX_FIFO_OVFL ; break; \
++ case e_FM_MAC_EX_10G_RX_ECC_ER: \
++ bitMask = TGEC_IMASK_RX_ECC_ER ; break; \
++ case e_FM_MAC_EX_10G_RX_JAB_FRM: \
++ bitMask = TGEC_IMASK_RX_JAB_FRM ; break; \
++ case e_FM_MAC_EX_10G_RX_OVRSZ_FRM: \
++ bitMask = TGEC_IMASK_RX_OVRSZ_FRM ; break; \
++ case e_FM_MAC_EX_10G_RX_RUNT_FRM: \
++ bitMask = TGEC_IMASK_RX_RUNT_FRM ; break; \
++ case e_FM_MAC_EX_10G_RX_FRAG_FRM: \
++ bitMask = TGEC_IMASK_RX_FRAG_FRM ; break; \
++ case e_FM_MAC_EX_10G_RX_LEN_ER: \
++ bitMask = TGEC_IMASK_RX_LEN_ER ; break; \
++ case e_FM_MAC_EX_10G_RX_CRC_ER: \
++ bitMask = TGEC_IMASK_RX_CRC_ER ; break; \
++ case e_FM_MAC_EX_10G_RX_ALIGN_ER: \
++ bitMask = TGEC_IMASK_RX_ALIGN_ER ; break; \
++ default: bitMask = 0;break;}
++
++#define MAX_PACKET_ALIGNMENT 31
++#define MAX_INTER_PACKET_GAP 0x7f
++#define MAX_INTER_PALTERNATE_BEB 0x0f
++#define MAX_RETRANSMISSION 0x0f
++#define MAX_COLLISION_WINDOW 0x03ff
++
++#define TGEC_NUM_OF_PADDRS 1 /* number of pattern match registers (entries) */
++
++#define GROUP_ADDRESS 0x0000010000000000LL /* Group address bit indication */
++
++#define HASH_TABLE_SIZE 512 /* Hash table size (= 32 bits * 8 regs) */
++
++#define TGEC_TO_MII_OFFSET 0x1030 /* Offset from the MEM map to the MDIO mem map */
++
++/* 10-gigabit Ethernet MAC Controller ID (10GEC_ID) */
++#define TGEC_ID_ID 0xffff0000
++#define TGEC_ID_MAC_VERSION 0x0000FF00
++#define TGEC_ID_MAC_REV 0x000000ff
++
++
++typedef struct {
++ t_FmMacControllerDriver fmMacControllerDriver; /**< Upper Mac control block */
++ t_Handle h_App; /**< Handle to the upper layer application */
++ struct tgec_regs *p_MemMap; /**< pointer to 10G memory mapped registers. */
++ t_TgecMiiAccessMemMap *p_MiiMemMap; /**< pointer to MII memory mapped registers. */
++ uint64_t addr; /**< MAC address of device; */
++ e_EnetMode enetMode; /**< Ethernet physical interface */
++ t_FmMacExceptionCallback *f_Exception;
++ int mdioIrq;
++ t_FmMacExceptionCallback *f_Event;
++ bool indAddrRegUsed[TGEC_NUM_OF_PADDRS]; /**< Whether a particular individual address recognition register is being used */
++ uint64_t paddr[TGEC_NUM_OF_PADDRS]; /**< MAC address for particular individual address recognition register */
++ uint8_t numOfIndAddrInRegs; /**< Number of individual addresses in registers for this station. */
++ t_EthHash *p_MulticastAddrHash; /**< pointer to driver's global address hash table */
++ t_EthHash *p_UnicastAddrHash; /**< pointer to driver's individual address hash table */
++ bool debugMode;
++ uint8_t macId;
++ uint32_t exceptions;
++ struct tgec_cfg *p_TgecDriverParam;
++} t_Tgec;
++
++
++t_Error TGEC_MII_WritePhyReg(t_Handle h_Tgec, uint8_t phyAddr, uint8_t reg, uint16_t data);
++t_Error TGEC_MII_ReadPhyReg(t_Handle h_Tgec, uint8_t phyAddr, uint8_t reg, uint16_t *p_Data);
++
++
++#endif /* __TGEC_H */
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/tgec_mii_acc.c b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/tgec_mii_acc.c
+new file mode 100644
+index 0000000..e0fafd1
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/tgec_mii_acc.c
+@@ -0,0 +1,139 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++
++#include "error_ext.h"
++#include "std_ext.h"
++#include "fm_mac.h"
++#include "tgec.h"
++#include "xx_ext.h"
++
++#include "fm_common.h"
++
++
++/*****************************************************************************/
++t_Error TGEC_MII_WritePhyReg(t_Handle h_Tgec,
++ uint8_t phyAddr,
++ uint8_t reg,
++ uint16_t data)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++ t_TgecMiiAccessMemMap *p_MiiAccess;
++ uint32_t cfgStatusReg;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Tgec->p_MiiMemMap, E_INVALID_HANDLE);
++
++ p_MiiAccess = p_Tgec->p_MiiMemMap;
++
++ /* Configure MII */
++ cfgStatusReg = GET_UINT32(p_MiiAccess->mdio_cfg_status);
++ cfgStatusReg &= ~MIIMCOM_DIV_MASK;
++ /* (one half of fm clock => 2.5Mhz) */
++ cfgStatusReg |=((((p_Tgec->fmMacControllerDriver.clkFreq*10)/2)/25) << MIIMCOM_DIV_SHIFT);
++ WRITE_UINT32(p_MiiAccess->mdio_cfg_status, cfgStatusReg);
++
++ while ((GET_UINT32(p_MiiAccess->mdio_cfg_status)) & MIIMIND_BUSY)
++ XX_UDelay (1);
++
++ WRITE_UINT32(p_MiiAccess->mdio_command, phyAddr);
++
++ WRITE_UINT32(p_MiiAccess->mdio_regaddr, reg);
++
++ CORE_MemoryBarrier();
++
++ while ((GET_UINT32(p_MiiAccess->mdio_cfg_status)) & MIIMIND_BUSY)
++ XX_UDelay (1);
++
++ WRITE_UINT32(p_MiiAccess->mdio_data, data);
++
++ CORE_MemoryBarrier();
++
++ while ((GET_UINT32(p_MiiAccess->mdio_data)) & MIIDATA_BUSY)
++ XX_UDelay (1);
++
++ return E_OK;
++}
++
++/*****************************************************************************/
++t_Error TGEC_MII_ReadPhyReg(t_Handle h_Tgec,
++ uint8_t phyAddr,
++ uint8_t reg,
++ uint16_t *p_Data)
++{
++ t_Tgec *p_Tgec = (t_Tgec *)h_Tgec;
++ t_TgecMiiAccessMemMap *p_MiiAccess;
++ uint32_t cfgStatusReg;
++
++ SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Tgec->p_MiiMemMap, E_INVALID_HANDLE);
++
++ p_MiiAccess = p_Tgec->p_MiiMemMap;
++
++ /* Configure MII */
++ cfgStatusReg = GET_UINT32(p_MiiAccess->mdio_cfg_status);
++ cfgStatusReg &= ~MIIMCOM_DIV_MASK;
++ /* (one half of fm clock => 2.5Mhz) */
++ cfgStatusReg |=((((p_Tgec->fmMacControllerDriver.clkFreq*10)/2)/25) << MIIMCOM_DIV_SHIFT);
++ WRITE_UINT32(p_MiiAccess->mdio_cfg_status, cfgStatusReg);
++
++ while ((GET_UINT32(p_MiiAccess->mdio_cfg_status)) & MIIMIND_BUSY)
++ XX_UDelay (1);
++
++ WRITE_UINT32(p_MiiAccess->mdio_command, phyAddr);
++
++ WRITE_UINT32(p_MiiAccess->mdio_regaddr, reg);
++
++ CORE_MemoryBarrier();
++
++ while ((GET_UINT32(p_MiiAccess->mdio_cfg_status)) & MIIMIND_BUSY)
++ XX_UDelay (1);
++
++ WRITE_UINT32(p_MiiAccess->mdio_command, (uint32_t)(phyAddr | MIIMCOM_READ_CYCLE));
++
++ CORE_MemoryBarrier();
++
++ while ((GET_UINT32(p_MiiAccess->mdio_data)) & MIIDATA_BUSY)
++ XX_UDelay (1);
++
++ *p_Data = (uint16_t)GET_UINT32(p_MiiAccess->mdio_data);
++
++ cfgStatusReg = GET_UINT32(p_MiiAccess->mdio_cfg_status);
++
++ if (cfgStatusReg & MIIMIND_READ_ERROR)
++ RETURN_ERROR(MINOR, E_INVALID_VALUE,
++ ("Read Error: phyAddr 0x%x, dev 0x%x, reg 0x%x, cfgStatusReg 0x%x",
++ ((phyAddr & 0xe0)>>5), (phyAddr & 0x1f), reg, cfgStatusReg));
++
++ return E_OK;
++}
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/tgec_mii_acc.h b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/tgec_mii_acc.h
+new file mode 100644
+index 0000000..645cdde
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/MAC/tgec_mii_acc.h
+@@ -0,0 +1,80 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++#ifndef __TGEC_MII_ACC_H
++#define __TGEC_MII_ACC_H
++
++#include "std_ext.h"
++
++
++/* MII Management Command Register */
++#define MIIMCOM_READ_POST_INCREMENT 0x00004000
++#define MIIMCOM_READ_CYCLE 0x00008000
++#define MIIMCOM_SCAN_CYCLE 0x00000800
++#define MIIMCOM_PREAMBLE_DISABLE 0x00000400
++
++#define MIIMCOM_MDIO_HOLD_1_REG_CLK 0
++#define MIIMCOM_MDIO_HOLD_2_REG_CLK 1
++#define MIIMCOM_MDIO_HOLD_3_REG_CLK 2
++#define MIIMCOM_MDIO_HOLD_4_REG_CLK 3
++
++#define MIIMCOM_DIV_MASK 0x0000ff00
++#define MIIMCOM_DIV_SHIFT 8
++
++/* MII Management Indicator Register */
++#define MIIMIND_BUSY 0x00000001
++#define MIIMIND_READ_ERROR 0x00000002
++
++#define MIIDATA_BUSY 0x80000000
++
++#if defined(__MWERKS__) && !defined(__GNUC__)
++#pragma pack(push,1)
++#endif /* defined(__MWERKS__) && ... */
++
++/*----------------------------------------------------*/
++/* MII Configuration Control Memory Map Registers */
++/*----------------------------------------------------*/
++typedef _Packed struct t_TgecMiiAccessMemMap
++{
++ volatile uint32_t mdio_cfg_status; /* 0x030 */
++ volatile uint32_t mdio_command; /* 0x034 */
++ volatile uint32_t mdio_data; /* 0x038 */
++ volatile uint32_t mdio_regaddr; /* 0x03c */
++} _PackedType t_TgecMiiAccessMemMap ;
++
++#if defined(__MWERKS__) && !defined(__GNUC__)
++#pragma pack(pop)
++#endif /* defined(__MWERKS__) && ... */
++
++
++#endif /* __TGEC_MII_ACC_H */
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/Makefile b/drivers/net/dpa/NetCommSw/Peripherals/FM/Makefile
+new file mode 100644
+index 0000000..67d6e21
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/Makefile
+@@ -0,0 +1,22 @@
++#
++# Makefile for the Freescale Ethernet controllers
++#
++EXTRA_CFLAGS += -DVERSION=\"\"
++#
++#Include netcomm SW specific definitions
++include $(srctree)/drivers/net/dpa/NetCommSw/ncsw_config.mk
++NCSW_FM_INC = $(srctree)/drivers/net/dpa/NetCommSw/Peripherals/FM/inc
++
++EXTRA_CFLAGS += -I$(NCSW_FM_INC)
++
++
++obj-y += fsl-ncsw-PFM1.o
++
++fsl-ncsw-PFM1-objs := fm.o fm_muram.o
++
++obj-y += MAC/
++obj-y += Pcd/
++obj-y += SP/
++obj-y += Port/
++obj-y += HC/
++obj-y += Rtc/
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/Makefile b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/Makefile
+new file mode 100644
+index 0000000..72c921d
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/Makefile
+@@ -0,0 +1,19 @@
++#
++# Makefile for the Freescale Ethernet controllers
++#
++EXTRA_CFLAGS += -DVERSION=\"\"
++#
++#Include netcomm SW specific definitions
++include $(srctree)/drivers/net/dpa/NetCommSw/ncsw_config.mk
++
++NCSW_FM_INC = $(srctree)/drivers/net/dpa/NetCommSw/Peripherals/FM/inc
++
++EXTRA_CFLAGS += -I$(NCSW_FM_INC)
++
++obj-y += fsl-ncsw-Pcd.o
++
++fsl-ncsw-Pcd-objs := fman_kg.o fman_prs.o fm_cc.o fm_kg.o fm_pcd.o fm_plcr.o fm_prs.o fm_manip.o
++
++ifeq ($(CONFIG_FMAN_T4240),y)
++fsl-ncsw-Pcd-objs += fm_replic.o
++endif
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/crc64.h b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/crc64.h
+new file mode 100644
+index 0000000..335ee68
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/crc64.h
+@@ -0,0 +1,360 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++ /**************************************************************************//**
++ @File crc64.h
++
++ @Description brief This file contains the CRC64 Table, and __inline__
++ functions used for calculating crc.
++*//***************************************************************************/
++#ifndef __CRC64_H
++#define __CRC64_H
++
++#include "std_ext.h"
++
++
++#define BITS_PER_BYTE 8
++
++#define CRC64_EXPON_ECMA_182 0xC96C5795D7870F42ULL
++#define CRC64_DEFAULT_INITVAL 0xFFFFFFFFFFFFFFFFULL
++
++#define CRC64_BYTE_MASK 0xFF
++#define CRC64_TABLE_ENTRIES ( 1 << BITS_PER_BYTE )
++#define CRC64_ODD_MASK 1
++
++
++/**
++ \brief '64 bit crc' Table
++ */
++struct crc64_t {
++ uint64_t initial; /**< Initial seed */
++ uint64_t table[CRC64_TABLE_ENTRIES]; /**< CRC table entries */
++};
++
++
++static struct crc64_t CRC64_ECMA_182 = {
++ CRC64_DEFAULT_INITVAL,
++ {
++ 0x0000000000000000ULL,
++ 0xb32e4cbe03a75f6fULL,
++ 0xf4843657a840a05bULL,
++ 0x47aa7ae9abe7ff34ULL,
++ 0x7bd0c384ff8f5e33ULL,
++ 0xc8fe8f3afc28015cULL,
++ 0x8f54f5d357cffe68ULL,
++ 0x3c7ab96d5468a107ULL,
++ 0xf7a18709ff1ebc66ULL,
++ 0x448fcbb7fcb9e309ULL,
++ 0x0325b15e575e1c3dULL,
++ 0xb00bfde054f94352ULL,
++ 0x8c71448d0091e255ULL,
++ 0x3f5f08330336bd3aULL,
++ 0x78f572daa8d1420eULL,
++ 0xcbdb3e64ab761d61ULL,
++ 0x7d9ba13851336649ULL,
++ 0xceb5ed8652943926ULL,
++ 0x891f976ff973c612ULL,
++ 0x3a31dbd1fad4997dULL,
++ 0x064b62bcaebc387aULL,
++ 0xb5652e02ad1b6715ULL,
++ 0xf2cf54eb06fc9821ULL,
++ 0x41e11855055bc74eULL,
++ 0x8a3a2631ae2dda2fULL,
++ 0x39146a8fad8a8540ULL,
++ 0x7ebe1066066d7a74ULL,
++ 0xcd905cd805ca251bULL,
++ 0xf1eae5b551a2841cULL,
++ 0x42c4a90b5205db73ULL,
++ 0x056ed3e2f9e22447ULL,
++ 0xb6409f5cfa457b28ULL,
++ 0xfb374270a266cc92ULL,
++ 0x48190ecea1c193fdULL,
++ 0x0fb374270a266cc9ULL,
++ 0xbc9d3899098133a6ULL,
++ 0x80e781f45de992a1ULL,
++ 0x33c9cd4a5e4ecdceULL,
++ 0x7463b7a3f5a932faULL,
++ 0xc74dfb1df60e6d95ULL,
++ 0x0c96c5795d7870f4ULL,
++ 0xbfb889c75edf2f9bULL,
++ 0xf812f32ef538d0afULL,
++ 0x4b3cbf90f69f8fc0ULL,
++ 0x774606fda2f72ec7ULL,
++ 0xc4684a43a15071a8ULL,
++ 0x83c230aa0ab78e9cULL,
++ 0x30ec7c140910d1f3ULL,
++ 0x86ace348f355aadbULL,
++ 0x3582aff6f0f2f5b4ULL,
++ 0x7228d51f5b150a80ULL,
++ 0xc10699a158b255efULL,
++ 0xfd7c20cc0cdaf4e8ULL,
++ 0x4e526c720f7dab87ULL,
++ 0x09f8169ba49a54b3ULL,
++ 0xbad65a25a73d0bdcULL,
++ 0x710d64410c4b16bdULL,
++ 0xc22328ff0fec49d2ULL,
++ 0x85895216a40bb6e6ULL,
++ 0x36a71ea8a7ace989ULL,
++ 0x0adda7c5f3c4488eULL,
++ 0xb9f3eb7bf06317e1ULL,
++ 0xfe5991925b84e8d5ULL,
++ 0x4d77dd2c5823b7baULL,
++ 0x64b62bcaebc387a1ULL,
++ 0xd7986774e864d8ceULL,
++ 0x90321d9d438327faULL,
++ 0x231c512340247895ULL,
++ 0x1f66e84e144cd992ULL,
++ 0xac48a4f017eb86fdULL,
++ 0xebe2de19bc0c79c9ULL,
++ 0x58cc92a7bfab26a6ULL,
++ 0x9317acc314dd3bc7ULL,
++ 0x2039e07d177a64a8ULL,
++ 0x67939a94bc9d9b9cULL,
++ 0xd4bdd62abf3ac4f3ULL,
++ 0xe8c76f47eb5265f4ULL,
++ 0x5be923f9e8f53a9bULL,
++ 0x1c4359104312c5afULL,
++ 0xaf6d15ae40b59ac0ULL,
++ 0x192d8af2baf0e1e8ULL,
++ 0xaa03c64cb957be87ULL,
++ 0xeda9bca512b041b3ULL,
++ 0x5e87f01b11171edcULL,
++ 0x62fd4976457fbfdbULL,
++ 0xd1d305c846d8e0b4ULL,
++ 0x96797f21ed3f1f80ULL,
++ 0x2557339fee9840efULL,
++ 0xee8c0dfb45ee5d8eULL,
++ 0x5da24145464902e1ULL,
++ 0x1a083bacedaefdd5ULL,
++ 0xa9267712ee09a2baULL,
++ 0x955cce7fba6103bdULL,
++ 0x267282c1b9c65cd2ULL,
++ 0x61d8f8281221a3e6ULL,
++ 0xd2f6b4961186fc89ULL,
++ 0x9f8169ba49a54b33ULL,
++ 0x2caf25044a02145cULL,
++ 0x6b055fede1e5eb68ULL,
++ 0xd82b1353e242b407ULL,
++ 0xe451aa3eb62a1500ULL,
++ 0x577fe680b58d4a6fULL,
++ 0x10d59c691e6ab55bULL,
++ 0xa3fbd0d71dcdea34ULL,
++ 0x6820eeb3b6bbf755ULL,
++ 0xdb0ea20db51ca83aULL,
++ 0x9ca4d8e41efb570eULL,
++ 0x2f8a945a1d5c0861ULL,
++ 0x13f02d374934a966ULL,
++ 0xa0de61894a93f609ULL,
++ 0xe7741b60e174093dULL,
++ 0x545a57dee2d35652ULL,
++ 0xe21ac88218962d7aULL,
++ 0x5134843c1b317215ULL,
++ 0x169efed5b0d68d21ULL,
++ 0xa5b0b26bb371d24eULL,
++ 0x99ca0b06e7197349ULL,
++ 0x2ae447b8e4be2c26ULL,
++ 0x6d4e3d514f59d312ULL,
++ 0xde6071ef4cfe8c7dULL,
++ 0x15bb4f8be788911cULL,
++ 0xa6950335e42fce73ULL,
++ 0xe13f79dc4fc83147ULL,
++ 0x521135624c6f6e28ULL,
++ 0x6e6b8c0f1807cf2fULL,
++ 0xdd45c0b11ba09040ULL,
++ 0x9aefba58b0476f74ULL,
++ 0x29c1f6e6b3e0301bULL,
++ 0xc96c5795d7870f42ULL,
++ 0x7a421b2bd420502dULL,
++ 0x3de861c27fc7af19ULL,
++ 0x8ec62d7c7c60f076ULL,
++ 0xb2bc941128085171ULL,
++ 0x0192d8af2baf0e1eULL,
++ 0x4638a2468048f12aULL,
++ 0xf516eef883efae45ULL,
++ 0x3ecdd09c2899b324ULL,
++ 0x8de39c222b3eec4bULL,
++ 0xca49e6cb80d9137fULL,
++ 0x7967aa75837e4c10ULL,
++ 0x451d1318d716ed17ULL,
++ 0xf6335fa6d4b1b278ULL,
++ 0xb199254f7f564d4cULL,
++ 0x02b769f17cf11223ULL,
++ 0xb4f7f6ad86b4690bULL,
++ 0x07d9ba1385133664ULL,
++ 0x4073c0fa2ef4c950ULL,
++ 0xf35d8c442d53963fULL,
++ 0xcf273529793b3738ULL,
++ 0x7c0979977a9c6857ULL,
++ 0x3ba3037ed17b9763ULL,
++ 0x888d4fc0d2dcc80cULL,
++ 0x435671a479aad56dULL,
++ 0xf0783d1a7a0d8a02ULL,
++ 0xb7d247f3d1ea7536ULL,
++ 0x04fc0b4dd24d2a59ULL,
++ 0x3886b22086258b5eULL,
++ 0x8ba8fe9e8582d431ULL,
++ 0xcc0284772e652b05ULL,
++ 0x7f2cc8c92dc2746aULL,
++ 0x325b15e575e1c3d0ULL,
++ 0x8175595b76469cbfULL,
++ 0xc6df23b2dda1638bULL,
++ 0x75f16f0cde063ce4ULL,
++ 0x498bd6618a6e9de3ULL,
++ 0xfaa59adf89c9c28cULL,
++ 0xbd0fe036222e3db8ULL,
++ 0x0e21ac88218962d7ULL,
++ 0xc5fa92ec8aff7fb6ULL,
++ 0x76d4de52895820d9ULL,
++ 0x317ea4bb22bfdfedULL,
++ 0x8250e80521188082ULL,
++ 0xbe2a516875702185ULL,
++ 0x0d041dd676d77eeaULL,
++ 0x4aae673fdd3081deULL,
++ 0xf9802b81de97deb1ULL,
++ 0x4fc0b4dd24d2a599ULL,
++ 0xfceef8632775faf6ULL,
++ 0xbb44828a8c9205c2ULL,
++ 0x086ace348f355aadULL,
++ 0x34107759db5dfbaaULL,
++ 0x873e3be7d8faa4c5ULL,
++ 0xc094410e731d5bf1ULL,
++ 0x73ba0db070ba049eULL,
++ 0xb86133d4dbcc19ffULL,
++ 0x0b4f7f6ad86b4690ULL,
++ 0x4ce50583738cb9a4ULL,
++ 0xffcb493d702be6cbULL,
++ 0xc3b1f050244347ccULL,
++ 0x709fbcee27e418a3ULL,
++ 0x3735c6078c03e797ULL,
++ 0x841b8ab98fa4b8f8ULL,
++ 0xadda7c5f3c4488e3ULL,
++ 0x1ef430e13fe3d78cULL,
++ 0x595e4a08940428b8ULL,
++ 0xea7006b697a377d7ULL,
++ 0xd60abfdbc3cbd6d0ULL,
++ 0x6524f365c06c89bfULL,
++ 0x228e898c6b8b768bULL,
++ 0x91a0c532682c29e4ULL,
++ 0x5a7bfb56c35a3485ULL,
++ 0xe955b7e8c0fd6beaULL,
++ 0xaeffcd016b1a94deULL,
++ 0x1dd181bf68bdcbb1ULL,
++ 0x21ab38d23cd56ab6ULL,
++ 0x9285746c3f7235d9ULL,
++ 0xd52f0e859495caedULL,
++ 0x6601423b97329582ULL,
++ 0xd041dd676d77eeaaULL,
++ 0x636f91d96ed0b1c5ULL,
++ 0x24c5eb30c5374ef1ULL,
++ 0x97eba78ec690119eULL,
++ 0xab911ee392f8b099ULL,
++ 0x18bf525d915feff6ULL,
++ 0x5f1528b43ab810c2ULL,
++ 0xec3b640a391f4fadULL,
++ 0x27e05a6e926952ccULL,
++ 0x94ce16d091ce0da3ULL,
++ 0xd3646c393a29f297ULL,
++ 0x604a2087398eadf8ULL,
++ 0x5c3099ea6de60cffULL,
++ 0xef1ed5546e415390ULL,
++ 0xa8b4afbdc5a6aca4ULL,
++ 0x1b9ae303c601f3cbULL,
++ 0x56ed3e2f9e224471ULL,
++ 0xe5c372919d851b1eULL,
++ 0xa26908783662e42aULL,
++ 0x114744c635c5bb45ULL,
++ 0x2d3dfdab61ad1a42ULL,
++ 0x9e13b115620a452dULL,
++ 0xd9b9cbfcc9edba19ULL,
++ 0x6a978742ca4ae576ULL,
++ 0xa14cb926613cf817ULL,
++ 0x1262f598629ba778ULL,
++ 0x55c88f71c97c584cULL,
++ 0xe6e6c3cfcadb0723ULL,
++ 0xda9c7aa29eb3a624ULL,
++ 0x69b2361c9d14f94bULL,
++ 0x2e184cf536f3067fULL,
++ 0x9d36004b35545910ULL,
++ 0x2b769f17cf112238ULL,
++ 0x9858d3a9ccb67d57ULL,
++ 0xdff2a94067518263ULL,
++ 0x6cdce5fe64f6dd0cULL,
++ 0x50a65c93309e7c0bULL,
++ 0xe388102d33392364ULL,
++ 0xa4226ac498dedc50ULL,
++ 0x170c267a9b79833fULL,
++ 0xdcd7181e300f9e5eULL,
++ 0x6ff954a033a8c131ULL,
++ 0x28532e49984f3e05ULL,
++ 0x9b7d62f79be8616aULL,
++ 0xa707db9acf80c06dULL,
++ 0x14299724cc279f02ULL,
++ 0x5383edcd67c06036ULL,
++ 0xe0ada17364673f59ULL
++ }
++};
++
++
++/**
++ \brief Initializes the crc seed
++ */
++static __inline__ uint64_t crc64_init(void)
++{
++ return CRC64_ECMA_182.initial;
++}
++
++/**
++ \brief Computes 64 bit the crc
++ \param[in] data Pointer to the Data in the frame
++ \param[in] len Length of the Data
++ \param[in] crc seed
++ \return calculated crc
++ */
++static __inline__ uint64_t crc64_compute(void const *data,
++ uint32_t len,
++ uint64_t seed)
++{
++ uint32_t i;
++ uint64_t crc = seed;
++ uint8_t *bdata = (uint8_t *) data;
++
++ for (i = 0; i < len; i++)
++ crc =
++ CRC64_ECMA_182.
++ table[(crc ^ *bdata++) & CRC64_BYTE_MASK] ^ (crc >> 8);
++
++ return crc;
++}
++
++
++#endif /* __CRC64_H */
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_cc.c b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_cc.c
+new file mode 100644
+index 0000000..85810a9
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_cc.c
+@@ -0,0 +1,6940 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File fm_cc.c
++
++ @Description FM Coarse Classifier implementation
++*//***************************************************************************/
++#include "std_ext.h"
++#include "error_ext.h"
++#include "string_ext.h"
++#include "debug_ext.h"
++#include "fm_pcd_ext.h"
++#include "fm_muram_ext.h"
++
++#include "fm_common.h"
++#include "fm_pcd.h"
++#include "fm_hc.h"
++#include "fm_cc.h"
++#include "crc64.h"
++
++
++/****************************************/
++/* static functions */
++/****************************************/
++
++
++static t_Error CcRootTryLock(t_Handle h_FmPcdCcTree)
++{
++ t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmPcdCcTree;
++
++ ASSERT_COND(h_FmPcdCcTree);
++
++ if (FmPcdLockTryLock(p_FmPcdCcTree->p_Lock))
++ return E_OK;
++
++ return ERROR_CODE(E_BUSY);
++}
++
++static void CcRootReleaseLock(t_Handle h_FmPcdCcTree)
++{
++ t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmPcdCcTree;
++
++ ASSERT_COND(h_FmPcdCcTree);
++
++ FmPcdLockUnlock(p_FmPcdCcTree->p_Lock);
++}
++
++static void UpdateNodeOwner(t_FmPcdCcNode *p_CcNode, bool add)
++{
++ uint32_t intFlags;
++
++ ASSERT_COND(p_CcNode);
++
++ intFlags = XX_LockIntrSpinlock(p_CcNode->h_Spinlock);
++
++ if (add)
++ p_CcNode->owners++;
++ else
++ {
++ ASSERT_COND(p_CcNode->owners);
++ p_CcNode->owners--;
++ }
++
++ XX_UnlockIntrSpinlock(p_CcNode->h_Spinlock, intFlags);
++}
++
++static __inline__ t_FmPcdStatsObj* DequeueStatsObj(t_List *p_List)
++{
++ t_FmPcdStatsObj *p_StatsObj = NULL;
++ t_List *p_Next;
++
++ if (!LIST_IsEmpty(p_List))
++ {
++ p_Next = LIST_FIRST(p_List);
++ p_StatsObj = LIST_OBJECT(p_Next, t_FmPcdStatsObj, node);
++ ASSERT_COND(p_StatsObj);
++ LIST_DelAndInit(p_Next);
++ }
++
++ return p_StatsObj;
++}
++
++static __inline__ void EnqueueStatsObj(t_List *p_List,
++ t_FmPcdStatsObj *p_StatsObj)
++{
++ LIST_AddToTail(&p_StatsObj->node, p_List);
++}
++
++static void FreeStatObjects(t_List *p_List,
++ t_Handle h_FmMuram)
++{
++ t_FmPcdStatsObj *p_StatsObj;
++
++ while (!LIST_IsEmpty(p_List))
++ {
++ p_StatsObj = DequeueStatsObj(p_List);
++ ASSERT_COND(p_StatsObj);
++
++ FM_MURAM_FreeMem(h_FmMuram, p_StatsObj->h_StatsAd);
++ FM_MURAM_FreeMem(h_FmMuram, p_StatsObj->h_StatsCounters);
++
++ XX_Free(p_StatsObj);
++ }
++}
++
++static t_FmPcdStatsObj* GetStatsObj(t_FmPcdCcNode *p_CcNode)
++{
++ t_FmPcdStatsObj* p_StatsObj;
++ t_Handle h_FmMuram;
++
++ ASSERT_COND(p_CcNode);
++
++ /* If 'maxNumOfKeys' was passed, all statistics object were preallocated
++ upon node initialization */
++ if (p_CcNode->maxNumOfKeys)
++ {
++ p_StatsObj = DequeueStatsObj(&p_CcNode->availableStatsLst);
++ }
++ else
++ {
++ h_FmMuram = ((t_FmPcd *)(p_CcNode->h_FmPcd))->h_FmMuram;
++ ASSERT_COND(h_FmMuram);
++
++ p_StatsObj = XX_Malloc(sizeof(t_FmPcdStatsObj));
++ if (!p_StatsObj)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("statistics object"));
++ return NULL;
++ }
++
++ p_StatsObj->h_StatsAd = (t_Handle)FM_MURAM_AllocMem(h_FmMuram,
++ FM_PCD_CC_AD_ENTRY_SIZE,
++ FM_PCD_CC_AD_TABLE_ALIGN);
++ if (!p_StatsObj->h_StatsAd)
++ {
++ XX_Free(p_StatsObj);
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for statistics ADs"));
++ return NULL;
++ }
++ IOMemSet32(p_StatsObj->h_StatsAd, 0, FM_PCD_CC_AD_ENTRY_SIZE);
++
++ p_StatsObj->h_StatsCounters = (t_Handle)FM_MURAM_AllocMem(h_FmMuram,
++ p_CcNode->countersArraySize,
++ FM_PCD_CC_AD_TABLE_ALIGN);
++ if (!p_StatsObj->h_StatsCounters)
++ {
++ FM_MURAM_FreeMem(h_FmMuram, p_StatsObj->h_StatsAd);
++ XX_Free(p_StatsObj);
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for statistics counters"));
++ return NULL;
++ }
++ IOMemSet32(p_StatsObj->h_StatsCounters, 0, p_CcNode->countersArraySize);
++ }
++
++ return p_StatsObj;
++}
++
++static void PutStatsObj(t_FmPcdCcNode *p_CcNode,
++ t_FmPcdStatsObj *p_StatsObj)
++{
++ t_Handle h_FmMuram;
++
++ ASSERT_COND(p_CcNode);
++ ASSERT_COND(p_StatsObj);
++
++ /* If 'maxNumOfKeys' was passed, all statistics object were preallocated
++ upon node initialization and now will be enqueued back to the list */
++ if (p_CcNode->maxNumOfKeys)
++ {
++ /* Nullify counters */
++ IOMemSet32(p_StatsObj->h_StatsCounters, 0, p_CcNode->countersArraySize);
++
++ EnqueueStatsObj(&p_CcNode->availableStatsLst, p_StatsObj);
++ }
++ else
++ {
++ h_FmMuram = ((t_FmPcd *)(p_CcNode->h_FmPcd))->h_FmMuram;
++ ASSERT_COND(h_FmMuram);
++
++ FM_MURAM_FreeMem(h_FmMuram, p_StatsObj->h_StatsAd);
++ FM_MURAM_FreeMem(h_FmMuram, p_StatsObj->h_StatsCounters);
++
++ XX_Free(p_StatsObj);
++ }
++}
++
++static void SetStatsCounters(t_AdOfTypeStats *p_StatsAd,
++ uint32_t statsCountersAddr)
++{
++ uint32_t tmp = (statsCountersAddr & FM_PCD_AD_STATS_COUNTERS_ADDR_MASK);
++
++ WRITE_UINT32(p_StatsAd->statsTableAddr, tmp);
++}
++
++
++static void UpdateStatsAd(t_FmPcdCcStatsParams *p_FmPcdCcStatsParams,
++ t_Handle h_Ad,
++ uint64_t physicalMuramBase)
++{
++ t_AdOfTypeStats *p_StatsAd;
++ uint32_t statsCountersAddr, nextActionAddr, tmp;
++#if (DPAA_VERSION >= 11)
++ uint32_t frameLengthRangesAddr;
++#endif /* (DPAA_VERSION >= 11) */
++
++ p_StatsAd = (t_AdOfTypeStats *)p_FmPcdCcStatsParams->h_StatsAd;
++
++ tmp = FM_PCD_AD_STATS_TYPE;
++
++#if (DPAA_VERSION >= 11)
++ if (p_FmPcdCcStatsParams->h_StatsFLRs)
++ {
++ frameLengthRangesAddr = (uint32_t)((XX_VirtToPhys(p_FmPcdCcStatsParams->h_StatsFLRs) - physicalMuramBase));
++ tmp |= (frameLengthRangesAddr & FM_PCD_AD_STATS_FLR_ADDR_MASK);
++ }
++#endif /* (DPAA_VERSION >= 11) */
++ WRITE_UINT32(p_StatsAd->profileTableAddr, tmp);
++
++ nextActionAddr = (uint32_t)((XX_VirtToPhys(h_Ad) - physicalMuramBase));
++ tmp = 0;
++ tmp |= (uint32_t)((nextActionAddr << FM_PCD_AD_STATS_NEXT_ACTION_SHIFT) & FM_PCD_AD_STATS_NEXT_ACTION_MASK);
++ tmp |= (FM_PCD_AD_STATS_NAD_EN | FM_PCD_AD_STATS_OP_CODE);
++
++#if (DPAA_VERSION >= 11)
++ if (p_FmPcdCcStatsParams->h_StatsFLRs)
++ tmp |= FM_PCD_AD_STATS_FLR_EN;
++#endif /* (DPAA_VERSION >= 11) */
++
++ WRITE_UINT32(p_StatsAd->nextActionIndx, tmp);
++
++ statsCountersAddr = (uint32_t)((XX_VirtToPhys(p_FmPcdCcStatsParams->h_StatsCounters) - physicalMuramBase));
++ SetStatsCounters(p_StatsAd, statsCountersAddr);
++}
++
++static void FillAdOfTypeContLookup(t_Handle h_Ad,
++ t_FmPcdCcStatsParams *p_FmPcdCcStatsParams,
++ t_Handle h_FmPcd,
++ t_Handle p_CcNode,
++ t_Handle h_Manip,
++ t_Handle h_FrmReplic)
++{
++ t_FmPcdCcNode *p_Node = (t_FmPcdCcNode *)p_CcNode;
++ t_AdOfTypeContLookup *p_AdContLookup = (t_AdOfTypeContLookup *)h_Ad;
++ t_Handle h_TmpAd;
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ uint32_t tmpReg32;
++ t_Handle p_AdNewPtr = NULL;
++
++ UNUSED(h_Manip);
++ UNUSED(h_FrmReplic);
++
++ /* there are 3 cases handled in this routine of building a "Continue lookup" type AD.
++ * Case 1: No Manip. The action descriptor is built within the match table.
++ * p_AdResult = p_AdNewPtr;
++ * Case 2: Manip exists. A new AD is created - p_AdNewPtr. It is initialized
++ * either in the FmPcdManipUpdateAdResultForCc routine or it was already
++ * initialized and returned here.
++ * p_AdResult (within the match table) will be initialized after
++ * this routine returns and point to the existing AD.
++ * Case 3: Manip exists. The action descriptor is built within the match table.
++ * FmPcdManipUpdateAdContLookupForCc returns a NULL p_AdNewPtr.
++ */
++
++ /* As default, the "new" ptr is the current one. i.e. the content of the result
++ * AD will be written into the match table itself (case (1))*/
++ p_AdNewPtr = p_AdContLookup;
++
++ /* Initialize an action descriptor, if current statistics mode requires an Ad */
++ if (p_FmPcdCcStatsParams)
++ {
++ ASSERT_COND(p_FmPcdCcStatsParams->h_StatsAd);
++ ASSERT_COND(p_FmPcdCcStatsParams->h_StatsCounters);
++
++ /* Swapping addresses between statistics Ad and the current lookup AD */
++ h_TmpAd = p_FmPcdCcStatsParams->h_StatsAd;
++ p_FmPcdCcStatsParams->h_StatsAd = h_Ad;
++ h_Ad = h_TmpAd;
++
++ p_AdNewPtr = h_Ad;
++ p_AdContLookup = h_Ad;
++
++ /* Init statistics Ad and connect current lookup AD as 'next action' from statistics Ad */
++ UpdateStatsAd(p_FmPcdCcStatsParams,
++ h_Ad,
++ p_FmPcd->physicalMuramBase);
++ }
++
++#if DPAA_VERSION >= 11
++ if (h_Manip && h_FrmReplic)
++ FmPcdManipUpdateAdContLookupForCc(h_Manip,
++ h_Ad,
++ &p_AdNewPtr,
++ (uint32_t)((XX_VirtToPhys(FrmReplicGroupGetSourceTableDescriptor(h_FrmReplic)) - p_FmPcd->physicalMuramBase)));
++ else if (h_FrmReplic)
++ FrmReplicGroupUpdateAd(h_FrmReplic, h_Ad, &p_AdNewPtr);
++ else
++#endif /* (DPAA_VERSION >= 11) */
++ if (h_Manip)
++ FmPcdManipUpdateAdContLookupForCc(h_Manip,
++ h_Ad,
++ &p_AdNewPtr,
++
++#ifdef FM_CAPWAP_SUPPORT
++ /*no check for opcode of manip - this step can be reached only with capwap_applic_specific*/
++ (uint32_t)((XX_VirtToPhys(p_Node->h_AdTable) - p_FmPcd->physicalMuramBase))
++#else /* not FM_CAPWAP_SUPPORT */
++ (uint32_t)((XX_VirtToPhys(p_Node->h_Ad) - p_FmPcd->physicalMuramBase))
++#endif /* not FM_CAPWAP_SUPPORT */
++ );
++
++ /* if (p_AdNewPtr = NULL) --> Done. (case (3)) */
++ if (p_AdNewPtr)
++ {
++ /* cases (1) & (2) */
++ tmpReg32 = 0;
++ tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;
++ tmpReg32 |= p_Node->sizeOfExtraction ? ((p_Node->sizeOfExtraction - 1) << 24) : 0;
++ tmpReg32 |= (uint32_t)(XX_VirtToPhys(p_Node->h_AdTable) - p_FmPcd->physicalMuramBase);
++ WRITE_UINT32(p_AdContLookup->ccAdBase, tmpReg32);
++
++ tmpReg32 = 0;
++ tmpReg32 |= p_Node->numOfKeys << 24;
++ tmpReg32 |= (p_Node->lclMask ? FM_PCD_AD_CONT_LOOKUP_LCL_MASK : 0);
++ tmpReg32 |= p_Node->h_KeysMatchTable ?
++ (uint32_t)(XX_VirtToPhys(p_Node->h_KeysMatchTable) - p_FmPcd->physicalMuramBase) : 0;
++ WRITE_UINT32(p_AdContLookup->matchTblPtr, tmpReg32);
++
++ tmpReg32 = 0;
++ tmpReg32 |= p_Node->prsArrayOffset << 24;
++ tmpReg32 |= p_Node->offset << 16;
++ tmpReg32 |= p_Node->parseCode;
++ WRITE_UINT32(p_AdContLookup->pcAndOffsets, tmpReg32);
++
++ Mem2IOCpy32((void*)&p_AdContLookup->gmask, p_Node->p_GlblMask, CC_GLBL_MASK_SIZE);
++ }
++}
++
++static t_Error AllocAndFillAdForContLookupManip(t_Handle h_CcNode)
++{
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
++ uint32_t intFlags;
++
++ ASSERT_COND(p_CcNode);
++
++ intFlags = XX_LockIntrSpinlock(p_CcNode->h_Spinlock);
++
++ if (!p_CcNode->h_Ad)
++ {
++ p_CcNode->h_Ad = (t_Handle)FM_MURAM_AllocMem(((t_FmPcd *)(p_CcNode->h_FmPcd))->h_FmMuram,
++ FM_PCD_CC_AD_ENTRY_SIZE,
++ FM_PCD_CC_AD_TABLE_ALIGN);
++
++ XX_UnlockIntrSpinlock(p_CcNode->h_Spinlock, intFlags);
++
++ if (!p_CcNode->h_Ad)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for CC action descriptor"));
++
++ IOMemSet32(p_CcNode->h_Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE);
++
++ FillAdOfTypeContLookup(p_CcNode->h_Ad,
++ NULL,
++ p_CcNode->h_FmPcd,
++ p_CcNode,
++ NULL,
++ NULL);
++ }
++ else
++ XX_UnlockIntrSpinlock(p_CcNode->h_Spinlock, intFlags);
++
++ return E_OK;
++}
++
++static t_Error SetRequiredAction(t_Handle h_FmPcd,
++ uint32_t requiredAction,
++ t_FmPcdCcKeyAndNextEngineParams *p_CcKeyAndNextEngineParamsTmp,
++ t_Handle h_AdTmp,
++ uint16_t numOfEntries,
++ t_Handle h_Tree)
++{
++ t_AdOfTypeResult *p_AdTmp = (t_AdOfTypeResult *)h_AdTmp;
++ uint32_t tmpReg32;
++ t_Error err;
++ t_FmPcdCcNode *p_CcNode;
++ int i = 0;
++ uint16_t tmp = 0;
++ uint16_t profileId;
++ uint8_t relativeSchemeId, physicalSchemeId;
++ t_CcNodeInformation ccNodeInfo;
++
++ for (i = 0; i < numOfEntries; i++)
++ {
++ if (i == 0)
++ h_AdTmp = PTR_MOVE(h_AdTmp, i*FM_PCD_CC_AD_ENTRY_SIZE);
++ else
++ h_AdTmp = PTR_MOVE(h_AdTmp, FM_PCD_CC_AD_ENTRY_SIZE);
++
++ switch (p_CcKeyAndNextEngineParamsTmp[i].nextEngineParams.nextEngine)
++ {
++ case (e_FM_PCD_CC):
++ if (requiredAction)
++ {
++ p_CcNode = p_CcKeyAndNextEngineParamsTmp[i].nextEngineParams.params.ccParams.h_CcNode;
++ ASSERT_COND(p_CcNode);
++ if (p_CcNode->shadowAction == requiredAction)
++ break;
++ if ((requiredAction & UPDATE_CC_WITH_TREE) && !(p_CcNode->shadowAction & UPDATE_CC_WITH_TREE))
++ {
++
++ ASSERT_COND(LIST_NumOfObjs(&p_CcNode->ccTreesLst) == 0);
++ if (p_CcNode->shadowAction & UPDATE_CC_WITH_DELETE_TREE)
++ p_CcNode->shadowAction &= ~UPDATE_CC_WITH_DELETE_TREE;
++ memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
++ ccNodeInfo.h_CcNode = h_Tree;
++ EnqueueNodeInfoToRelevantLst(&p_CcNode->ccTreesLst, &ccNodeInfo, NULL);
++ p_CcKeyAndNextEngineParamsTmp[i].shadowAction |= UPDATE_CC_WITH_TREE;
++ }
++ if ((requiredAction & UPDATE_CC_WITH_DELETE_TREE) && !(p_CcNode->shadowAction & UPDATE_CC_WITH_DELETE_TREE))
++ {
++ ASSERT_COND(LIST_NumOfObjs(&p_CcNode->ccTreesLst) == 1);
++ if (p_CcNode->shadowAction & UPDATE_CC_WITH_TREE)
++ p_CcNode->shadowAction &= ~UPDATE_CC_WITH_TREE;
++ DequeueNodeInfoFromRelevantLst(&p_CcNode->ccTreesLst, h_Tree, NULL);
++ p_CcKeyAndNextEngineParamsTmp[i].shadowAction |= UPDATE_CC_WITH_DELETE_TREE;
++ }
++ if (p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].nextEngineParams.nextEngine != e_FM_PCD_INVALID)
++ tmp = (uint8_t)(p_CcNode->numOfKeys + 1);
++ else
++ tmp = p_CcNode->numOfKeys;
++ err = SetRequiredAction(h_FmPcd,
++ requiredAction,
++ p_CcNode->keyAndNextEngineParams,
++ p_CcNode->h_AdTable,
++ tmp,
++ h_Tree);
++ if (err != E_OK)
++ return err;
++ p_CcNode->shadowAction |= requiredAction;
++ }
++ break;
++
++ case (e_FM_PCD_KG):
++ if ((requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA) && !(p_CcKeyAndNextEngineParamsTmp[i].shadowAction & UPDATE_NIA_ENQ_WITHOUT_DMA))
++ {
++ physicalSchemeId = FmPcdKgGetSchemeId(p_CcKeyAndNextEngineParamsTmp[i].nextEngineParams.params.kgParams.h_DirectScheme);
++ relativeSchemeId = FmPcdKgGetRelativeSchemeId(h_FmPcd, physicalSchemeId);
++ if (relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES)
++ RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
++ if (!FmPcdKgIsSchemeValidSw(p_CcKeyAndNextEngineParamsTmp[i].nextEngineParams.params.kgParams.h_DirectScheme))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid direct scheme."));
++ if (!KgIsSchemeAlwaysDirect(h_FmPcd, relativeSchemeId))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("For this action scheme has to be direct."));
++ err = FmPcdKgCcGetSetParams(h_FmPcd, p_CcKeyAndNextEngineParamsTmp[i].nextEngineParams.params.kgParams.h_DirectScheme, requiredAction, 0);
++ if (err != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ p_CcKeyAndNextEngineParamsTmp[i].shadowAction |= requiredAction;
++ }
++ break;
++
++ case (e_FM_PCD_PLCR):
++ if ((requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA) && !(p_CcKeyAndNextEngineParamsTmp[i].shadowAction & UPDATE_NIA_ENQ_WITHOUT_DMA))
++ {
++ if (!p_CcKeyAndNextEngineParamsTmp[i].nextEngineParams.params.plcrParams.overrideParams)
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("In this initialization only overrideFqid can be initialized"));
++ if (!p_CcKeyAndNextEngineParamsTmp[i].nextEngineParams.params.plcrParams.sharedProfile)
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("In this initialization only overrideFqid can be initialized"));
++ err = FmPcdPlcrGetAbsoluteIdByProfileParams(h_FmPcd, e_FM_PCD_PLCR_SHARED, NULL, p_CcKeyAndNextEngineParamsTmp[i].nextEngineParams.params.plcrParams.newRelativeProfileId, &profileId);
++ if (err!= E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ err = FmPcdPlcrCcGetSetParams(h_FmPcd, profileId, requiredAction);
++ if (err != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ p_CcKeyAndNextEngineParamsTmp[i].shadowAction |= requiredAction;
++ }
++ break;
++
++ case (e_FM_PCD_DONE):
++ if ((requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA) && !(p_CcKeyAndNextEngineParamsTmp[i].shadowAction & UPDATE_NIA_ENQ_WITHOUT_DMA))
++ {
++ tmpReg32 = GET_UINT32(p_AdTmp->nia);
++ if ((tmpReg32 & GET_NIA_BMI_AC_ENQ_FRAME(h_FmPcd)) != GET_NIA_BMI_AC_ENQ_FRAME(h_FmPcd))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Next engine was previously assigned not as PCD_DONE"));
++ tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;
++ WRITE_UINT32(p_AdTmp->nia, tmpReg32);
++ p_CcKeyAndNextEngineParamsTmp[i].shadowAction |= requiredAction;
++ }
++ break;
++
++ default:
++ break;
++ }
++ }
++
++ return E_OK;
++}
++
++static t_Error ReleaseModifiedDataStructure(t_Handle h_FmPcd,
++ t_List *h_FmPcdOldPointersLst,
++ t_List *h_FmPcdNewPointersLst,
++ uint16_t numOfGoodChanges,
++ t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalParams,
++ bool useShadowStructs)
++{
++ t_List *p_Pos;
++ t_Error err = E_OK;
++ t_CcNodeInformation ccNodeInfo, *p_CcNodeInformation;
++ t_Handle h_Muram;
++ t_FmPcdCcNode *p_FmPcdCcNextNode;
++ t_List *p_UpdateLst;
++ uint32_t intFlags;
++
++ UNUSED(numOfGoodChanges);
++
++ SANITY_CHECK_RETURN_ERROR(h_FmPcd,E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_AdditionalParams->h_CurrentNode,E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(h_FmPcdOldPointersLst,E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(h_FmPcdNewPointersLst,E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR((numOfGoodChanges == LIST_NumOfObjs(h_FmPcdOldPointersLst)),E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR((1 == LIST_NumOfObjs(h_FmPcdNewPointersLst)),E_INVALID_STATE);
++
++ /* We don't update subtree of the new node with new tree because it was done in the previous stage */
++ if (p_AdditionalParams->h_NodeForAdd)
++ {
++ p_FmPcdCcNextNode = (t_FmPcdCcNode*)p_AdditionalParams->h_NodeForAdd;
++
++ if (!p_AdditionalParams->tree)
++ p_UpdateLst = &p_FmPcdCcNextNode->ccPrevNodesLst;
++ else
++ p_UpdateLst = &p_FmPcdCcNextNode->ccTreeIdLst;
++
++ p_CcNodeInformation = FindNodeInfoInReleventLst(p_UpdateLst,
++ p_AdditionalParams->h_CurrentNode,
++ p_FmPcdCcNextNode->h_Spinlock);
++
++ if (p_CcNodeInformation)
++ p_CcNodeInformation->index++;
++ else
++ {
++ memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
++ ccNodeInfo.h_CcNode = (t_Handle)p_AdditionalParams->h_CurrentNode;
++ ccNodeInfo.index = 1;
++ EnqueueNodeInfoToRelevantLst(p_UpdateLst,
++ &ccNodeInfo,
++ p_FmPcdCcNextNode->h_Spinlock);
++ }
++ if (p_AdditionalParams->h_ManipForAdd)
++ {
++ p_CcNodeInformation = FindNodeInfoInReleventLst(FmPcdManipGetNodeLstPointedOnThisManip(p_AdditionalParams->h_ManipForAdd),
++ p_AdditionalParams->h_CurrentNode,
++ FmPcdManipGetSpinlock(p_AdditionalParams->h_ManipForAdd));
++
++ if (p_CcNodeInformation)
++ p_CcNodeInformation->index++;
++ else
++ {
++ memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
++ ccNodeInfo.h_CcNode = (t_Handle)p_AdditionalParams->h_CurrentNode;
++ ccNodeInfo.index = 1;
++ EnqueueNodeInfoToRelevantLst(FmPcdManipGetNodeLstPointedOnThisManip(p_AdditionalParams->h_ManipForAdd),
++ &ccNodeInfo,
++ FmPcdManipGetSpinlock(p_AdditionalParams->h_ManipForAdd));
++ }
++ }
++ }
++
++ if (p_AdditionalParams->h_NodeForRmv)
++ {
++ p_FmPcdCcNextNode = (t_FmPcdCcNode*)p_AdditionalParams->h_NodeForRmv;
++
++ if (!p_AdditionalParams->tree)
++ {
++ p_UpdateLst = &p_FmPcdCcNextNode->ccPrevNodesLst;
++
++ while (!LIST_IsEmpty(&p_FmPcdCcNextNode->ccTreesLst))
++ {
++ p_Pos = LIST_NEXT(&p_FmPcdCcNextNode->ccTreesLst);
++ p_CcNodeInformation = CC_NODE_F_OBJECT(p_Pos);
++
++ ASSERT_COND(p_CcNodeInformation->h_CcNode);
++
++ err = SetRequiredAction(h_FmPcd,
++ UPDATE_CC_WITH_DELETE_TREE,
++ &((t_FmPcdCcNode *)(p_AdditionalParams->h_CurrentNode))->keyAndNextEngineParams[p_AdditionalParams->savedKeyIndex],
++ PTR_MOVE(((t_FmPcdCcNode *)(p_AdditionalParams->h_CurrentNode))->h_AdTable, p_AdditionalParams->savedKeyIndex*FM_PCD_CC_AD_ENTRY_SIZE),
++ 1,
++ p_CcNodeInformation->h_CcNode);
++ }
++ }
++ else
++ {
++ p_UpdateLst = &p_FmPcdCcNextNode->ccTreeIdLst;
++
++ err = SetRequiredAction(h_FmPcd,
++ UPDATE_CC_WITH_DELETE_TREE,
++ &((t_FmPcdCcTree *)(p_AdditionalParams->h_CurrentNode))->keyAndNextEngineParams[p_AdditionalParams->savedKeyIndex],
++ UINT_TO_PTR(((t_FmPcdCcTree *)(p_AdditionalParams->h_CurrentNode))->ccTreeBaseAddr + p_AdditionalParams->savedKeyIndex*FM_PCD_CC_AD_ENTRY_SIZE),
++ 1,
++ p_AdditionalParams->h_CurrentNode);
++ }
++ if (err)
++ return err;
++
++ /* We remove from the subtree of the removed node tree because it wasn't done in the previous stage
++ Update ccPrevNodesLst or ccTreeIdLst of the removed node
++ Update of the node owner */
++ p_CcNodeInformation = FindNodeInfoInReleventLst(p_UpdateLst,
++ p_AdditionalParams->h_CurrentNode,
++ p_FmPcdCcNextNode->h_Spinlock);
++
++ ASSERT_COND(p_CcNodeInformation);
++ ASSERT_COND(p_CcNodeInformation->index);
++
++ p_CcNodeInformation->index--;
++
++ if (p_CcNodeInformation->index == 0)
++ DequeueNodeInfoFromRelevantLst(p_UpdateLst,
++ p_AdditionalParams->h_CurrentNode,
++ p_FmPcdCcNextNode->h_Spinlock);
++
++ UpdateNodeOwner(p_FmPcdCcNextNode, FALSE);
++
++ if (p_AdditionalParams->h_ManipForRmv)
++ {
++ p_CcNodeInformation = FindNodeInfoInReleventLst(FmPcdManipGetNodeLstPointedOnThisManip(p_AdditionalParams->h_ManipForRmv),
++ p_AdditionalParams->h_CurrentNode,
++ FmPcdManipGetSpinlock(p_AdditionalParams->h_ManipForRmv));
++
++ ASSERT_COND(p_CcNodeInformation);
++ ASSERT_COND(p_CcNodeInformation->index);
++
++ p_CcNodeInformation->index--;
++
++ if (p_CcNodeInformation->index == 0)
++ DequeueNodeInfoFromRelevantLst(FmPcdManipGetNodeLstPointedOnThisManip(p_AdditionalParams->h_ManipForRmv),
++ p_AdditionalParams->h_CurrentNode,
++ FmPcdManipGetSpinlock(p_AdditionalParams->h_ManipForRmv));
++ }
++ }
++
++ if (p_AdditionalParams->h_ManipForRmv)
++ FmPcdManipUpdateOwner(p_AdditionalParams->h_ManipForRmv, FALSE);
++
++ if (p_AdditionalParams->p_StatsObjForRmv)
++ PutStatsObj((t_FmPcdCcNode *)(p_AdditionalParams->h_CurrentNode),
++ p_AdditionalParams->p_StatsObjForRmv);
++
++#if (DPAA_VERSION >= 11)
++ if (p_AdditionalParams->h_FrmReplicForRmv)
++ FrmReplicGroupUpdateOwner(p_AdditionalParams->h_FrmReplicForRmv,
++ FALSE/* remove */);
++#endif /* (DPAA_VERSION >= 11) */
++
++ if (!useShadowStructs)
++ {
++ h_Muram = FmPcdGetMuramHandle(h_FmPcd);
++ ASSERT_COND(h_Muram);
++
++ if ((p_AdditionalParams->tree &&
++ !((t_FmPcd *)h_FmPcd)->p_CcShadow) ||
++ (!p_AdditionalParams->tree &&
++ !((t_FmPcdCcNode *)(p_AdditionalParams->h_CurrentNode))->maxNumOfKeys))
++ {
++ /* We release new AD which was allocated and updated for copy from to actual AD */
++ p_Pos = LIST_FIRST(h_FmPcdNewPointersLst);
++ p_CcNodeInformation = CC_NODE_F_OBJECT(p_Pos);
++ ASSERT_COND(p_CcNodeInformation->h_CcNode);
++ FM_MURAM_FreeMem(h_Muram, p_CcNodeInformation->h_CcNode);
++ }
++
++ /* Free Old data structure if it has to be freed - new data structure was allocated*/
++ if (p_AdditionalParams->p_AdTableOld)
++ FM_MURAM_FreeMem(h_Muram,p_AdditionalParams->p_AdTableOld);
++
++ if (p_AdditionalParams->p_KeysMatchTableOld)
++ FM_MURAM_FreeMem(h_Muram,p_AdditionalParams->p_KeysMatchTableOld);
++ }
++
++ /* Update current modified node with changed fields if it's required*/
++ if (!p_AdditionalParams->tree)
++ {
++ if (p_AdditionalParams->p_AdTableNew)
++ ((t_FmPcdCcNode *)(p_AdditionalParams->h_CurrentNode))->h_AdTable = p_AdditionalParams->p_AdTableNew;
++
++ if (p_AdditionalParams->p_KeysMatchTableNew)
++ ((t_FmPcdCcNode *)(p_AdditionalParams->h_CurrentNode))->h_KeysMatchTable = p_AdditionalParams->p_KeysMatchTableNew;
++
++ /* Locking node's spinlock before updating 'keys and next engine' structure,
++ as it maybe used to retrieve keys statistics */
++ intFlags = XX_LockIntrSpinlock(((t_FmPcdCcNode *)(p_AdditionalParams->h_CurrentNode))->h_Spinlock);
++
++ ((t_FmPcdCcNode *)(p_AdditionalParams->h_CurrentNode))->numOfKeys = p_AdditionalParams->numOfKeys;
++
++ memcpy(((t_FmPcdCcNode *)(p_AdditionalParams->h_CurrentNode))->keyAndNextEngineParams,
++ &p_AdditionalParams->keyAndNextEngineParams,
++ sizeof(t_FmPcdCcKeyAndNextEngineParams) * (CC_MAX_NUM_OF_KEYS));
++
++ XX_UnlockIntrSpinlock(((t_FmPcdCcNode *)(p_AdditionalParams->h_CurrentNode))->h_Spinlock, intFlags);
++ }
++ else
++ {
++ uint8_t numEntries = ((t_FmPcdCcTree *)(p_AdditionalParams->h_CurrentNode))->numOfEntries;
++ ASSERT_COND(numEntries < FM_PCD_MAX_NUM_OF_CC_GROUPS);
++ memcpy(&((t_FmPcdCcTree *)(p_AdditionalParams->h_CurrentNode))->keyAndNextEngineParams,
++ &p_AdditionalParams->keyAndNextEngineParams,
++ sizeof(t_FmPcdCcKeyAndNextEngineParams) * numEntries);
++ }
++
++ ReleaseLst(h_FmPcdOldPointersLst);
++ ReleaseLst(h_FmPcdNewPointersLst);
++
++ XX_Free(p_AdditionalParams);
++
++ return E_OK;
++}
++
++static t_Handle BuildNewAd(t_Handle h_Ad,
++ t_FmPcdModifyCcKeyAdditionalParams *p_FmPcdModifyCcKeyAdditionalParams,
++ t_FmPcdCcNode *p_CcNode,
++ t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
++{
++ t_FmPcdCcNode *p_FmPcdCcNodeTmp;
++
++ p_FmPcdCcNodeTmp = (t_FmPcdCcNode*)XX_Malloc(sizeof(t_FmPcdCcNode));
++ if (!p_FmPcdCcNodeTmp)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("p_FmPcdCcNodeTmp"));
++ return NULL;
++ }
++ memset(p_FmPcdCcNodeTmp, 0, sizeof(t_FmPcdCcNode));
++
++ p_FmPcdCcNodeTmp->numOfKeys = p_FmPcdModifyCcKeyAdditionalParams->numOfKeys;
++ p_FmPcdCcNodeTmp->h_KeysMatchTable = p_FmPcdModifyCcKeyAdditionalParams->p_KeysMatchTableNew;
++ p_FmPcdCcNodeTmp->h_AdTable = p_FmPcdModifyCcKeyAdditionalParams->p_AdTableNew;
++
++ p_FmPcdCcNodeTmp->lclMask = p_CcNode->lclMask;
++ p_FmPcdCcNodeTmp->parseCode = p_CcNode->parseCode;
++ p_FmPcdCcNodeTmp->offset = p_CcNode->offset;
++ p_FmPcdCcNodeTmp->prsArrayOffset = p_CcNode->prsArrayOffset;
++ p_FmPcdCcNodeTmp->ctrlFlow = p_CcNode->ctrlFlow;
++ p_FmPcdCcNodeTmp->ccKeySizeAccExtraction = p_CcNode->ccKeySizeAccExtraction;
++ p_FmPcdCcNodeTmp->sizeOfExtraction = p_CcNode->sizeOfExtraction;
++ p_FmPcdCcNodeTmp->glblMaskSize = p_CcNode->glblMaskSize;
++ p_FmPcdCcNodeTmp->p_GlblMask = p_CcNode->p_GlblMask;
++
++ if (p_FmPcdCcNextEngineParams->nextEngine == e_FM_PCD_CC)
++ {
++ if (p_FmPcdCcNextEngineParams->h_Manip)
++ {
++ if (AllocAndFillAdForContLookupManip(p_FmPcdCcNextEngineParams->params.ccParams.h_CcNode)!= E_OK)
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
++ return NULL;
++ }
++ }
++ FillAdOfTypeContLookup(h_Ad,
++ NULL,
++ p_CcNode->h_FmPcd,
++ p_FmPcdCcNodeTmp,
++ p_FmPcdCcNextEngineParams->h_Manip,
++ NULL);
++ }
++
++#if (DPAA_VERSION >= 11)
++ if ((p_FmPcdCcNextEngineParams->nextEngine == e_FM_PCD_FR) &&
++ (p_FmPcdCcNextEngineParams->params.frParams.h_FrmReplic))
++ {
++ FillAdOfTypeContLookup(h_Ad,
++ NULL,
++ p_CcNode->h_FmPcd,
++ p_FmPcdCcNodeTmp,
++ p_FmPcdCcNextEngineParams->h_Manip,
++ p_FmPcdCcNextEngineParams->params.frParams.h_FrmReplic);
++ }
++#endif /* (DPAA_VERSION >= 11) */
++
++ XX_Free(p_FmPcdCcNodeTmp);
++
++ return E_OK;
++}
++
++static t_Error DynamicChangeHc(t_Handle h_FmPcd,
++ t_List *h_OldPointersLst,
++ t_List *h_NewPointersLst,
++ t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalParams,
++ bool useShadowStructs)
++{
++ t_List *p_PosOld, *p_PosNew;
++ uint32_t oldAdAddrOffset, newAdAddrOffset;
++ uint16_t i = 0;
++ t_Error err = E_OK;
++ uint8_t numOfModifiedPtr;
++
++ ASSERT_COND(h_FmPcd);
++ ASSERT_COND(h_OldPointersLst);
++ ASSERT_COND(h_NewPointersLst);
++
++ numOfModifiedPtr = (uint8_t)LIST_NumOfObjs(h_OldPointersLst);
++
++ p_PosNew = LIST_FIRST(h_NewPointersLst);
++ p_PosOld = LIST_FIRST(h_OldPointersLst);
++
++ /* Retrieve address of new AD */
++ newAdAddrOffset = FmPcdCcGetNodeAddrOffsetFromNodeInfo(h_FmPcd, p_PosNew);
++ if (newAdAddrOffset == (uint32_t)ILLEGAL_BASE)
++ {
++ ReleaseModifiedDataStructure(h_FmPcd,
++ h_OldPointersLst,
++ h_NewPointersLst,
++ 0,
++ p_AdditionalParams,
++ useShadowStructs);
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("New AD address"));
++ }
++
++ for (i=0; ih_Hc, oldAdAddrOffset, newAdAddrOffset);
++ if (err)
++ {
++ ReleaseModifiedDataStructure(h_FmPcd,
++ h_OldPointersLst,
++ h_NewPointersLst,
++ i,
++ p_AdditionalParams,
++ useShadowStructs);
++ RETURN_ERROR(MAJOR, err, ("For part of nodes changes are done - situation is danger"));
++ }
++
++ p_PosOld = LIST_NEXT(p_PosOld);
++ }
++
++ return E_OK;
++}
++
++static t_Error DoDynamicChange(t_Handle h_FmPcd,
++ t_List *h_OldPointersLst,
++ t_List *h_NewPointersLst,
++ t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalParams,
++ bool useShadowStructs)
++{
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)(p_AdditionalParams->h_CurrentNode);
++ t_List *p_PosNew;
++ t_CcNodeInformation *p_CcNodeInfo;
++ t_FmPcdCcNextEngineParams nextEngineParams;
++ t_Handle h_Ad;
++ uint32_t keySize;
++ t_Error err = E_OK;
++ uint8_t numOfModifiedPtr;
++
++ ASSERT_COND(h_FmPcd);
++
++ SANITY_CHECK_RETURN_ERROR((LIST_NumOfObjs(h_OldPointersLst) >= 1),E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR((LIST_NumOfObjs(h_NewPointersLst) == 1),E_INVALID_STATE);
++
++ memset(&nextEngineParams, 0, sizeof(t_FmPcdCcNextEngineParams));
++
++ numOfModifiedPtr = (uint8_t)LIST_NumOfObjs(h_OldPointersLst);
++
++ p_PosNew = LIST_FIRST(h_NewPointersLst);
++
++ /* Invoke host-command to copy from the new Ad to existing Ads */
++ err = DynamicChangeHc(h_FmPcd, h_OldPointersLst, h_NewPointersLst, p_AdditionalParams, useShadowStructs);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ if (useShadowStructs)
++ {
++ /* When the host-command above has ended, the old structures are 'free'and we can update
++ them by copying from the new shadow structures. */
++ if (p_CcNode->lclMask)
++ keySize = (uint32_t)(2 * p_CcNode->ccKeySizeAccExtraction);
++ else
++ keySize = p_CcNode->ccKeySizeAccExtraction;
++
++ IO2IOCpy32(p_AdditionalParams->p_KeysMatchTableOld,
++ p_AdditionalParams->p_KeysMatchTableNew,
++ p_CcNode->maxNumOfKeys * keySize * sizeof (uint8_t));
++
++ IO2IOCpy32(p_AdditionalParams->p_AdTableOld,
++ p_AdditionalParams->p_AdTableNew,
++ (uint32_t)((p_CcNode->maxNumOfKeys + 1) * FM_PCD_CC_AD_ENTRY_SIZE));
++
++ /* Retrieve the address of the allocated Ad */
++ p_CcNodeInfo = CC_NODE_F_OBJECT(p_PosNew);
++ h_Ad = p_CcNodeInfo->h_CcNode;
++
++ /* Build a new Ad that holds the old (now updated) structures */
++ p_AdditionalParams->p_KeysMatchTableNew = p_AdditionalParams->p_KeysMatchTableOld;
++ p_AdditionalParams->p_AdTableNew = p_AdditionalParams->p_AdTableOld;
++
++ nextEngineParams.nextEngine = e_FM_PCD_CC;
++ nextEngineParams.params.ccParams.h_CcNode = (t_Handle)p_CcNode;
++
++ BuildNewAd(h_Ad, p_AdditionalParams, p_CcNode, &nextEngineParams);
++
++ /* HC to copy from the new Ad (old updated structures) to current Ad (uses shadow structures) */
++ err = DynamicChangeHc(h_FmPcd, h_OldPointersLst, h_NewPointersLst, p_AdditionalParams, useShadowStructs);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ err = ReleaseModifiedDataStructure(h_FmPcd,
++ h_OldPointersLst,
++ h_NewPointersLst,
++ numOfModifiedPtr,
++ p_AdditionalParams,
++ useShadowStructs);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ return E_OK;
++}
++
++#ifdef FM_CAPWAP_SUPPORT
++static bool IsCapwapApplSpecific(t_Handle h_Node)
++{
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_Node;
++ bool isManipForCapwapApplSpecificBuild = FALSE;
++ int i = 0;
++
++ ASSERT_COND(h_Node);
++ /* assumption that this function called only for INDEXED_FLOW_ID - so no miss*/
++ for (i = 0; i < p_CcNode->numOfKeys; i++)
++ {
++ if ( p_CcNode->keyAndNextEngineParams[i].nextEngineParams.h_Manip &&
++ FmPcdManipIsCapwapApplSpecific(p_CcNode->keyAndNextEngineParams[i].nextEngineParams.h_Manip))
++ {
++ isManipForCapwapApplSpecificBuild = TRUE;
++ break;
++ }
++ }
++ return isManipForCapwapApplSpecificBuild;
++
++}
++#endif /* FM_CAPWAP_SUPPORT */
++
++static t_Error CcUpdateParam(t_Handle h_FmPcd,
++ t_Handle h_PcdParams,
++ t_Handle h_FmPort,
++ t_FmPcdCcKeyAndNextEngineParams *p_CcKeyAndNextEngineParams,
++ uint16_t numOfEntries,
++ t_Handle h_Ad,
++ bool validate,
++ uint16_t level,
++ t_Handle h_FmTree,
++ bool modify)
++{
++ t_FmPcdCcNode *p_CcNode;
++ t_Error err;
++ uint16_t tmp = 0;
++ int i = 0;
++ t_FmPcdCcTree *p_CcTree = (t_FmPcdCcTree *) h_FmTree;
++
++ level++;
++
++ if (p_CcTree->h_IpReassemblyManip)
++ {
++ err = FmPcdManipUpdate(h_FmPcd,
++ h_PcdParams,
++ h_FmPort,
++ p_CcTree->h_IpReassemblyManip,
++ NULL,
++ validate,
++ level,
++ h_FmTree,
++ modify);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ if (numOfEntries)
++ {
++ for (i=0; ikeyAndNextEngineParams[p_CcNode->numOfKeys].nextEngineParams.nextEngine != e_FM_PCD_INVALID)
++ tmp = (uint8_t)(p_CcNode->numOfKeys + 1);
++ else
++ tmp = p_CcNode->numOfKeys;
++
++ err = CcUpdateParam(h_FmPcd,
++ h_PcdParams,
++ h_FmPort,
++ p_CcNode->keyAndNextEngineParams,
++ tmp,
++ p_CcNode->h_AdTable,
++ validate,
++ level,
++ h_FmTree,
++ modify);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++ else
++ {
++ if (p_CcKeyAndNextEngineParams[i].nextEngineParams.h_Manip)
++ {
++ err = FmPcdManipUpdate(h_FmPcd,
++ NULL,
++ h_FmPort,
++ p_CcKeyAndNextEngineParams[i].nextEngineParams.h_Manip,
++ h_Ad,
++ validate,
++ level,
++ h_FmTree,
++ modify);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++ }
++ }
++ }
++
++ return E_OK;
++}
++
++static ccPrivateInfo_t IcDefineCode(t_FmPcdCcNodeParams *p_CcNodeParam)
++{
++ switch (p_CcNodeParam->extractCcParams.extractNonHdr.action)
++ {
++ case (e_FM_PCD_ACTION_EXACT_MATCH):
++ switch (p_CcNodeParam->extractCcParams.extractNonHdr.src)
++ {
++ case (e_FM_PCD_EXTRACT_FROM_KEY):
++ return CC_PRIVATE_INFO_IC_KEY_EXACT_MATCH;
++ case (e_FM_PCD_EXTRACT_FROM_HASH):
++ return CC_PRIVATE_INFO_IC_HASH_EXACT_MATCH;
++ default:
++ return CC_PRIVATE_INFO_NONE;
++ }
++
++ case (e_FM_PCD_ACTION_INDEXED_LOOKUP):
++ switch (p_CcNodeParam->extractCcParams.extractNonHdr.src)
++ {
++ case (e_FM_PCD_EXTRACT_FROM_HASH):
++ return CC_PRIVATE_INFO_IC_HASH_INDEX_LOOKUP;
++ case (e_FM_PCD_EXTRACT_FROM_FLOW_ID):
++ return CC_PRIVATE_INFO_IC_DEQ_FQID_INDEX_LOOKUP;
++ default:
++ return CC_PRIVATE_INFO_NONE;
++ }
++
++ default:
++ break;
++ }
++
++ return CC_PRIVATE_INFO_NONE;
++}
++
++static t_CcNodeInformation * DequeueAdditionalInfoFromRelevantLst(t_List *p_List)
++{
++ t_CcNodeInformation *p_CcNodeInfo = NULL;
++
++ if (!LIST_IsEmpty(p_List))
++ {
++ p_CcNodeInfo = CC_NODE_F_OBJECT(p_List->p_Next);
++ LIST_DelAndInit(&p_CcNodeInfo->node);
++ }
++
++ return p_CcNodeInfo;
++}
++
++void ReleaseLst(t_List *p_List)
++{
++ t_CcNodeInformation *p_CcNodeInfo = NULL;
++
++ if (!LIST_IsEmpty(p_List))
++ {
++ p_CcNodeInfo = DequeueAdditionalInfoFromRelevantLst(p_List);
++ while (p_CcNodeInfo)
++ {
++ XX_Free(p_CcNodeInfo);
++ p_CcNodeInfo = DequeueAdditionalInfoFromRelevantLst(p_List);
++ }
++ }
++
++ LIST_Del(p_List);
++}
++
++static void DeleteNode(t_FmPcdCcNode *p_CcNode)
++{
++ uint32_t i;
++
++ if (!p_CcNode)
++ return;
++
++ if (p_CcNode->p_GlblMask)
++ {
++ XX_Free(p_CcNode->p_GlblMask);
++ p_CcNode->p_GlblMask = NULL;
++ }
++
++ if (p_CcNode->h_KeysMatchTable)
++ {
++ FM_MURAM_FreeMem(FmPcdGetMuramHandle(p_CcNode->h_FmPcd), p_CcNode->h_KeysMatchTable);
++ p_CcNode->h_KeysMatchTable = NULL;
++ }
++
++ if (p_CcNode->h_AdTable)
++ {
++ FM_MURAM_FreeMem(FmPcdGetMuramHandle(p_CcNode->h_FmPcd), p_CcNode->h_AdTable);
++ p_CcNode->h_AdTable = NULL;
++ }
++
++ if (p_CcNode->h_Ad)
++ {
++ FM_MURAM_FreeMem(FmPcdGetMuramHandle(p_CcNode->h_FmPcd), p_CcNode->h_Ad);
++ p_CcNode->h_Ad = NULL;
++ }
++
++ if (p_CcNode->h_StatsFLRs)
++ {
++ FM_MURAM_FreeMem(FmPcdGetMuramHandle(p_CcNode->h_FmPcd), p_CcNode->h_StatsFLRs);
++ p_CcNode->h_StatsFLRs = NULL;
++ }
++
++ if (p_CcNode->h_Spinlock)
++ {
++ XX_FreeSpinlock(p_CcNode->h_Spinlock);
++ p_CcNode->h_Spinlock = NULL;
++ }
++
++ /* Releasing all currently used statistics objects, including 'miss' entry */
++ for (i = 0; i < p_CcNode->numOfKeys + 1; i++)
++ if (p_CcNode->keyAndNextEngineParams[i].p_StatsObj)
++ PutStatsObj(p_CcNode, p_CcNode->keyAndNextEngineParams[i].p_StatsObj);
++
++ if (!LIST_IsEmpty(&p_CcNode->availableStatsLst))
++ {
++ t_Handle h_FmMuram = FmPcdGetMuramHandle(p_CcNode->h_FmPcd);
++
++ ASSERT_COND(h_FmMuram);
++
++ FreeStatObjects(&p_CcNode->availableStatsLst, h_FmMuram);
++ }
++
++ LIST_Del(&p_CcNode->availableStatsLst);
++
++ ReleaseLst(&p_CcNode->ccPrevNodesLst);
++ ReleaseLst(&p_CcNode->ccTreeIdLst);
++ ReleaseLst(&p_CcNode->ccTreesLst);
++
++ XX_Free(p_CcNode);
++}
++
++static void DeleteTree(t_FmPcdCcTree *p_FmPcdTree, t_FmPcd *p_FmPcd)
++{
++ if (p_FmPcdTree)
++ {
++ if (p_FmPcdTree->ccTreeBaseAddr)
++ {
++ FM_MURAM_FreeMem(FmPcdGetMuramHandle(p_FmPcd), UINT_TO_PTR(p_FmPcdTree->ccTreeBaseAddr));
++ p_FmPcdTree->ccTreeBaseAddr = 0;
++ }
++
++ ReleaseLst(&p_FmPcdTree->fmPortsLst);
++
++ XX_Free(p_FmPcdTree);
++ }
++}
++
++static void GetCcExtractKeySize(uint8_t parseCodeRealSize, uint8_t *parseCodeCcSize)
++{
++ if ((parseCodeRealSize > 0) && (parseCodeRealSize < 2))
++ *parseCodeCcSize = 1;
++ else if (parseCodeRealSize == 2)
++ *parseCodeCcSize = 2;
++ else if ((parseCodeRealSize > 2) && (parseCodeRealSize <= 4))
++ *parseCodeCcSize = 4;
++ else if ((parseCodeRealSize > 4) && (parseCodeRealSize <= 8))
++ *parseCodeCcSize = 8;
++ else if ((parseCodeRealSize > 8) && (parseCodeRealSize <= 16))
++ *parseCodeCcSize = 16;
++ else if ((parseCodeRealSize > 16) && (parseCodeRealSize <= 24))
++ *parseCodeCcSize = 24;
++ else if ((parseCodeRealSize > 24) && (parseCodeRealSize <= 32))
++ *parseCodeCcSize = 32;
++ else if ((parseCodeRealSize > 32) && (parseCodeRealSize <= 40))
++ *parseCodeCcSize = 40;
++ else if ((parseCodeRealSize > 40) && (parseCodeRealSize <= 48))
++ *parseCodeCcSize = 48;
++ else if ((parseCodeRealSize > 48) && (parseCodeRealSize <= 56))
++ *parseCodeCcSize = 56;
++ else
++ *parseCodeCcSize = 0;
++}
++
++static void GetSizeHeaderField(e_NetHeaderType hdr,
++ e_FmPcdHdrIndex index,
++ t_FmPcdFields field,
++ uint8_t *parseCodeRealSize)
++{
++ UNUSED(index);
++ switch (hdr)
++ {
++ case (HEADER_TYPE_ETH):
++ switch (field.eth)
++ {
++ case (NET_HEADER_FIELD_ETH_DA):
++ *parseCodeRealSize = 6;
++ break;
++
++ case (NET_HEADER_FIELD_ETH_SA):
++ *parseCodeRealSize = 6;
++ break;
++
++ case (NET_HEADER_FIELD_ETH_TYPE):
++ *parseCodeRealSize = 2;
++ break;
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported1"));
++ *parseCodeRealSize = CC_SIZE_ILLEGAL;
++ break;
++ }
++ break;
++
++ case (HEADER_TYPE_PPPoE):
++ switch (field.pppoe)
++ {
++ case (NET_HEADER_FIELD_PPPoE_PID):
++ *parseCodeRealSize = 2;
++ break;
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported1"));
++ *parseCodeRealSize = CC_SIZE_ILLEGAL;
++ break;
++ }
++ break;
++
++ case (HEADER_TYPE_VLAN):
++ switch (field.vlan)
++ {
++ case (NET_HEADER_FIELD_VLAN_TCI):
++ *parseCodeRealSize = 2;
++ break;
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported2"));
++ *parseCodeRealSize = CC_SIZE_ILLEGAL;
++ break;
++ }
++ break;
++
++ case (HEADER_TYPE_MPLS):
++ switch (field.mpls)
++ {
++ case (NET_HEADER_FIELD_MPLS_LABEL_STACK):
++ *parseCodeRealSize = 4;
++ break;
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported3"));
++ *parseCodeRealSize = CC_SIZE_ILLEGAL;
++ break;
++ }
++ break;
++
++ case (HEADER_TYPE_IPv4):
++ switch (field.ipv4)
++ {
++ case (NET_HEADER_FIELD_IPv4_DST_IP):
++ case (NET_HEADER_FIELD_IPv4_SRC_IP):
++ *parseCodeRealSize = 4;
++ break;
++
++ case (NET_HEADER_FIELD_IPv4_TOS):
++ case (NET_HEADER_FIELD_IPv4_PROTO):
++ *parseCodeRealSize = 1;
++ break;
++
++ case (NET_HEADER_FIELD_IPv4_DST_IP | NET_HEADER_FIELD_IPv4_SRC_IP):
++ *parseCodeRealSize = 8;
++ break;
++
++ case (NET_HEADER_FIELD_IPv4_TTL):
++ *parseCodeRealSize = 1;
++ break;
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported4"));
++ *parseCodeRealSize = CC_SIZE_ILLEGAL;
++ break;
++ }
++ break;
++
++ case (HEADER_TYPE_IPv6):
++ switch (field.ipv6)
++ {
++ case (NET_HEADER_FIELD_IPv6_VER | NET_HEADER_FIELD_IPv6_FL | NET_HEADER_FIELD_IPv6_TC):
++ *parseCodeRealSize = 4;
++ break;
++
++ case (NET_HEADER_FIELD_IPv6_NEXT_HDR):
++ case (NET_HEADER_FIELD_IPv6_HOP_LIMIT):
++ *parseCodeRealSize = 1;
++ break;
++
++ case (NET_HEADER_FIELD_IPv6_DST_IP):
++ case (NET_HEADER_FIELD_IPv6_SRC_IP):
++ *parseCodeRealSize = 16;
++ break;
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported5"));
++ *parseCodeRealSize = CC_SIZE_ILLEGAL;
++ break;
++ }
++ break;
++
++ case (HEADER_TYPE_IP):
++ switch (field.ip)
++ {
++ case (NET_HEADER_FIELD_IP_DSCP):
++ case (NET_HEADER_FIELD_IP_PROTO):
++ *parseCodeRealSize = 1;
++ break;
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported5"));
++ *parseCodeRealSize = CC_SIZE_ILLEGAL;
++ break;
++ }
++ break;
++
++ case (HEADER_TYPE_GRE):
++ switch (field.gre)
++ {
++ case ( NET_HEADER_FIELD_GRE_TYPE):
++ *parseCodeRealSize = 2;
++ break;
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported6"));
++ *parseCodeRealSize = CC_SIZE_ILLEGAL;
++ break;
++ }
++ break;
++
++ case (HEADER_TYPE_MINENCAP):
++ switch (field.minencap)
++ {
++ case (NET_HEADER_FIELD_MINENCAP_TYPE):
++ *parseCodeRealSize = 1;
++ break;
++
++ case (NET_HEADER_FIELD_MINENCAP_DST_IP):
++ case (NET_HEADER_FIELD_MINENCAP_SRC_IP):
++ *parseCodeRealSize = 4;
++ break;
++
++ case (NET_HEADER_FIELD_MINENCAP_SRC_IP | NET_HEADER_FIELD_MINENCAP_DST_IP):
++ *parseCodeRealSize = 8;
++ break;
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported7"));
++ *parseCodeRealSize = CC_SIZE_ILLEGAL;
++ break;
++ }
++ break;
++
++ case (HEADER_TYPE_TCP):
++ switch (field.tcp)
++ {
++ case (NET_HEADER_FIELD_TCP_PORT_SRC):
++ case (NET_HEADER_FIELD_TCP_PORT_DST):
++ *parseCodeRealSize = 2;
++ break;
++
++ case (NET_HEADER_FIELD_TCP_PORT_SRC | NET_HEADER_FIELD_TCP_PORT_DST):
++ *parseCodeRealSize = 4;
++ break;
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported8"));
++ *parseCodeRealSize = CC_SIZE_ILLEGAL;
++ break;
++ }
++ break;
++
++ case (HEADER_TYPE_UDP):
++ switch (field.udp)
++ {
++ case (NET_HEADER_FIELD_UDP_PORT_SRC):
++ case (NET_HEADER_FIELD_UDP_PORT_DST):
++ *parseCodeRealSize = 2;
++ break;
++
++ case (NET_HEADER_FIELD_UDP_PORT_SRC | NET_HEADER_FIELD_UDP_PORT_DST):
++ *parseCodeRealSize = 4;
++ break;
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported9"));
++ *parseCodeRealSize = CC_SIZE_ILLEGAL;
++ break;
++ }
++ break;
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported10"));
++ *parseCodeRealSize = CC_SIZE_ILLEGAL;
++ break;
++ }
++}
++
++t_Error ValidateNextEngineParams(t_Handle h_FmPcd,
++ t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams,
++ e_FmPcdCcStatsMode statsMode)
++{
++ uint16_t absoluteProfileId;
++ t_Error err = E_OK;
++ uint8_t relativeSchemeId;
++
++ if ((statsMode == e_FM_PCD_CC_STATS_MODE_NONE) &&
++ (p_FmPcdCcNextEngineParams->statisticsEn))
++ RETURN_ERROR(MAJOR, E_CONFLICT,
++ ("Statistics are requested for a key, but statistics mode was set"
++ "to 'NONE' upon initialization of this match table"));
++
++ switch (p_FmPcdCcNextEngineParams->nextEngine)
++ {
++ case (e_FM_PCD_INVALID):
++ err = E_NOT_SUPPORTED;
++ break;
++
++ case (e_FM_PCD_DONE):
++ if ((p_FmPcdCcNextEngineParams->params.enqueueParams.action == e_FM_PCD_ENQ_FRAME) &&
++ p_FmPcdCcNextEngineParams->params.enqueueParams.overrideFqid)
++ {
++ if (!p_FmPcdCcNextEngineParams->params.enqueueParams.newFqid)
++ RETURN_ERROR(MAJOR, E_CONFLICT, ("When overrideFqid is set, newFqid must not be zero"));
++ if (p_FmPcdCcNextEngineParams->params.enqueueParams.newFqid & ~0x00FFFFFF)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("fqidForCtrlFlow must be between 1 and 2^24-1"));
++ }
++ break;
++
++ case (e_FM_PCD_KG):
++ relativeSchemeId = FmPcdKgGetRelativeSchemeId(h_FmPcd,
++ FmPcdKgGetSchemeId(p_FmPcdCcNextEngineParams->params.kgParams.h_DirectScheme));
++ if (relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES)
++ RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
++ if (!FmPcdKgIsSchemeValidSw(p_FmPcdCcNextEngineParams->params.kgParams.h_DirectScheme))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("not valid schemeIndex in KG next engine param"));
++ if (!KgIsSchemeAlwaysDirect(h_FmPcd, relativeSchemeId))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("CC Node may point only to a scheme that is always direct."));
++ break;
++
++ case (e_FM_PCD_PLCR):
++ if (p_FmPcdCcNextEngineParams->params.plcrParams.overrideParams)
++ {
++ /* if private policer profile, it may be uninitialized yet, therefore no checks are done at this stage */
++ if (p_FmPcdCcNextEngineParams->params.plcrParams.sharedProfile)
++ {
++ err = FmPcdPlcrGetAbsoluteIdByProfileParams(h_FmPcd,
++ e_FM_PCD_PLCR_SHARED,
++ NULL,
++ p_FmPcdCcNextEngineParams->params.plcrParams.newRelativeProfileId,
++ &absoluteProfileId);
++ if (err)
++ RETURN_ERROR(MAJOR, err, ("Shared profile offset is out of range"));
++ if (!FmPcdPlcrIsProfileValid(h_FmPcd, absoluteProfileId))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid profile"));
++ }
++ }
++ break;
++
++ case (e_FM_PCD_HASH):
++ p_FmPcdCcNextEngineParams->nextEngine = e_FM_PCD_CC;
++ case (e_FM_PCD_CC):
++ if (!p_FmPcdCcNextEngineParams->params.ccParams.h_CcNode)
++ RETURN_ERROR(MAJOR, E_NULL_POINTER, ("handler to next Node is NULL"));
++ break;
++
++#if (DPAA_VERSION >= 11)
++ case (e_FM_PCD_FR):
++ if (!p_FmPcdCcNextEngineParams->params.frParams.h_FrmReplic)
++ err = E_NOT_SUPPORTED;
++ break;
++#endif /* (DPAA_VERSION >= 11) */
++
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Next engine is not correct"));
++ }
++
++
++ return err;
++}
++
++static uint8_t GetGenParseCode(t_Handle h_FmPcd,
++ e_FmPcdExtractFrom src,
++ uint32_t offset,
++ bool glblMask,
++ uint8_t *parseArrayOffset,
++ bool fromIc,
++ ccPrivateInfo_t icCode)
++{
++ UNUSED(h_FmPcd);
++
++ if (!fromIc)
++ {
++ switch (src)
++ {
++ case (e_FM_PCD_EXTRACT_FROM_FRAME_START):
++ if (glblMask)
++ return CC_PC_GENERIC_WITH_MASK ;
++ else
++ return CC_PC_GENERIC_WITHOUT_MASK;
++
++ case (e_FM_PCD_EXTRACT_FROM_CURR_END_OF_PARSE):
++ *parseArrayOffset = CC_PC_PR_NEXT_HEADER_OFFSET;
++ if (offset)
++ return CC_PR_OFFSET;
++ else
++ return CC_PR_WITHOUT_OFFSET;
++
++ default:
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("Illegal 'extract from' src"));
++ return CC_PC_ILLEGAL;
++ }
++ }
++ else
++ {
++ switch (icCode)
++ {
++ case (CC_PRIVATE_INFO_IC_KEY_EXACT_MATCH):
++ *parseArrayOffset = 0x50;
++ return CC_PC_GENERIC_IC_GMASK;
++
++ case (CC_PRIVATE_INFO_IC_HASH_EXACT_MATCH):
++ *parseArrayOffset = 0x48;
++ return CC_PC_GENERIC_IC_GMASK;
++
++ case (CC_PRIVATE_INFO_IC_HASH_INDEX_LOOKUP):
++ *parseArrayOffset = 0x48;
++ return CC_PC_GENERIC_IC_HASH_INDEXED;
++
++ case (CC_PRIVATE_INFO_IC_DEQ_FQID_INDEX_LOOKUP):
++ *parseArrayOffset = 0x16;
++ return CC_PC_GENERIC_IC_HASH_INDEXED;
++
++ default:
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("Illegal 'extract from' src"));
++ break;
++ }
++ }
++
++ return CC_PC_ILLEGAL;
++}
++
++static uint8_t GetFullFieldParseCode(e_NetHeaderType hdr,
++ e_FmPcdHdrIndex index,
++ t_FmPcdFields field)
++{
++ switch (hdr)
++ {
++ case (HEADER_TYPE_NONE):
++ ASSERT_COND(FALSE);
++ return CC_PC_ILLEGAL;
++
++ case (HEADER_TYPE_ETH):
++ switch (field.eth)
++ {
++ case (NET_HEADER_FIELD_ETH_DA):
++ return CC_PC_FF_MACDST;
++ case (NET_HEADER_FIELD_ETH_SA):
++ return CC_PC_FF_MACSRC;
++ case (NET_HEADER_FIELD_ETH_TYPE):
++ return CC_PC_FF_ETYPE;
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return CC_PC_ILLEGAL;
++ }
++
++ case (HEADER_TYPE_VLAN):
++ switch (field.vlan)
++ {
++ case (NET_HEADER_FIELD_VLAN_TCI):
++ if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
++ return CC_PC_FF_TCI1;
++ if (index == e_FM_PCD_HDR_INDEX_LAST)
++ return CC_PC_FF_TCI2;
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return CC_PC_ILLEGAL;
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return CC_PC_ILLEGAL;
++ }
++
++ case (HEADER_TYPE_MPLS):
++ switch (field.mpls)
++ {
++ case (NET_HEADER_FIELD_MPLS_LABEL_STACK):
++ if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
++ return CC_PC_FF_MPLS1;
++ if (index == e_FM_PCD_HDR_INDEX_LAST)
++ return CC_PC_FF_MPLS_LAST;
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal MPLS index"));
++ return CC_PC_ILLEGAL;
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return CC_PC_ILLEGAL;
++ }
++
++ case (HEADER_TYPE_IPv4):
++ switch (field.ipv4)
++ {
++ case (NET_HEADER_FIELD_IPv4_DST_IP):
++ if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
++ return CC_PC_FF_IPV4DST1;
++ if (index == e_FM_PCD_HDR_INDEX_2)
++ return CC_PC_FF_IPV4DST2;
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv4 index"));
++ return CC_PC_ILLEGAL;
++ case (NET_HEADER_FIELD_IPv4_TOS):
++ if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
++ return CC_PC_FF_IPV4IPTOS_TC1;
++ if (index == e_FM_PCD_HDR_INDEX_2)
++ return CC_PC_FF_IPV4IPTOS_TC2;
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv4 index"));
++ return CC_PC_ILLEGAL;
++ case (NET_HEADER_FIELD_IPv4_PROTO):
++ if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
++ return CC_PC_FF_IPV4PTYPE1;
++ if(index == e_FM_PCD_HDR_INDEX_2)
++ return CC_PC_FF_IPV4PTYPE2;
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv4 index"));
++ return CC_PC_ILLEGAL;
++ case (NET_HEADER_FIELD_IPv4_SRC_IP):
++ if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
++ return CC_PC_FF_IPV4SRC1;
++ if (index == e_FM_PCD_HDR_INDEX_2)
++ return CC_PC_FF_IPV4SRC2;
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv4 index"));
++ return CC_PC_ILLEGAL;
++ case (NET_HEADER_FIELD_IPv4_SRC_IP | NET_HEADER_FIELD_IPv4_DST_IP):
++ if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
++ return CC_PC_FF_IPV4SRC1_IPV4DST1;
++ if (index == e_FM_PCD_HDR_INDEX_2)
++ return CC_PC_FF_IPV4SRC2_IPV4DST2;
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv4 index"));
++ return CC_PC_ILLEGAL;
++ case (NET_HEADER_FIELD_IPv4_TTL):
++ return CC_PC_FF_IPV4TTL;
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return CC_PC_ILLEGAL;
++ }
++
++ case (HEADER_TYPE_IPv6):
++ switch (field.ipv6)
++ {
++ case (NET_HEADER_FIELD_IPv6_VER | NET_HEADER_FIELD_IPv6_FL | NET_HEADER_FIELD_IPv6_TC):
++ if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
++ return CC_PC_FF_IPTOS_IPV6TC1_IPV6FLOW1;
++ if (index == e_FM_PCD_HDR_INDEX_2)
++ return CC_PC_FF_IPTOS_IPV6TC2_IPV6FLOW2;
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv6 index"));
++ return CC_PC_ILLEGAL;
++
++ case (NET_HEADER_FIELD_IPv6_NEXT_HDR):
++ if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
++ return CC_PC_FF_IPV6PTYPE1;
++ if (index == e_FM_PCD_HDR_INDEX_2)
++ return CC_PC_FF_IPV6PTYPE2;
++ if (index == e_FM_PCD_HDR_INDEX_LAST)
++ return CC_PC_FF_IPPID;
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv6 index"));
++ return CC_PC_ILLEGAL;
++
++ case (NET_HEADER_FIELD_IPv6_DST_IP):
++ if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
++ return CC_PC_FF_IPV6DST1;
++ if (index == e_FM_PCD_HDR_INDEX_2)
++ return CC_PC_FF_IPV6DST2;
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv6 index"));
++ return CC_PC_ILLEGAL;
++
++ case (NET_HEADER_FIELD_IPv6_SRC_IP):
++ if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
++ return CC_PC_FF_IPV6SRC1;
++ if (index == e_FM_PCD_HDR_INDEX_2)
++ return CC_PC_FF_IPV6SRC2;
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv6 index"));
++ return CC_PC_ILLEGAL;
++
++ case (NET_HEADER_FIELD_IPv6_HOP_LIMIT):
++ return CC_PC_FF_IPV6HOP_LIMIT;
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return CC_PC_ILLEGAL;
++ }
++
++ case (HEADER_TYPE_IP):
++ switch (field.ip)
++ {
++ case (NET_HEADER_FIELD_IP_DSCP):
++ if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
++ return CC_PC_FF_IPDSCP;
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IP index"));
++ return CC_PC_ILLEGAL;
++
++ case (NET_HEADER_FIELD_IP_PROTO):
++ if (index == e_FM_PCD_HDR_INDEX_LAST)
++ return CC_PC_FF_IPPID;
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IP index"));
++ return CC_PC_ILLEGAL;
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return CC_PC_ILLEGAL;
++ }
++
++ case (HEADER_TYPE_GRE):
++ switch (field.gre)
++ {
++ case (NET_HEADER_FIELD_GRE_TYPE):
++ return CC_PC_FF_GREPTYPE;
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return CC_PC_ILLEGAL;
++ }
++
++ case (HEADER_TYPE_MINENCAP):
++ switch (field.minencap)
++ {
++ case (NET_HEADER_FIELD_MINENCAP_TYPE):
++ return CC_PC_FF_MINENCAP_PTYPE;
++
++ case (NET_HEADER_FIELD_MINENCAP_DST_IP):
++ return CC_PC_FF_MINENCAP_IPDST;
++
++ case (NET_HEADER_FIELD_MINENCAP_SRC_IP):
++ return CC_PC_FF_MINENCAP_IPSRC;
++
++ case (NET_HEADER_FIELD_MINENCAP_SRC_IP | NET_HEADER_FIELD_MINENCAP_DST_IP):
++ return CC_PC_FF_MINENCAP_IPSRC_IPDST;
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return CC_PC_ILLEGAL;
++ }
++
++ case (HEADER_TYPE_TCP):
++ switch (field.tcp)
++ {
++ case (NET_HEADER_FIELD_TCP_PORT_SRC):
++ return CC_PC_FF_L4PSRC;
++
++ case (NET_HEADER_FIELD_TCP_PORT_DST):
++ return CC_PC_FF_L4PDST;
++
++ case (NET_HEADER_FIELD_TCP_PORT_DST | NET_HEADER_FIELD_TCP_PORT_SRC):
++ return CC_PC_FF_L4PSRC_L4PDST;
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return CC_PC_ILLEGAL;
++ }
++
++ case (HEADER_TYPE_PPPoE):
++ switch (field.pppoe)
++ {
++ case (NET_HEADER_FIELD_PPPoE_PID):
++ return CC_PC_FF_PPPPID;
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return CC_PC_ILLEGAL;
++ }
++
++ case (HEADER_TYPE_UDP):
++ switch (field.udp)
++ {
++ case (NET_HEADER_FIELD_UDP_PORT_SRC):
++ return CC_PC_FF_L4PSRC;
++
++ case (NET_HEADER_FIELD_UDP_PORT_DST):
++ return CC_PC_FF_L4PDST;
++
++ case (NET_HEADER_FIELD_UDP_PORT_DST | NET_HEADER_FIELD_UDP_PORT_SRC):
++ return CC_PC_FF_L4PSRC_L4PDST;
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return CC_PC_ILLEGAL;
++ }
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return CC_PC_ILLEGAL;
++ }
++}
++
++static uint8_t GetPrParseCode(e_NetHeaderType hdr,
++ e_FmPcdHdrIndex hdrIndex,
++ uint32_t offset,
++ bool glblMask,
++ uint8_t *parseArrayOffset)
++{
++ bool offsetRelevant = FALSE;
++
++ if (offset)
++ offsetRelevant = TRUE;
++
++ switch (hdr)
++ {
++ case (HEADER_TYPE_NONE):
++ ASSERT_COND(FALSE);
++ return CC_PC_ILLEGAL;
++
++ case (HEADER_TYPE_ETH):
++ *parseArrayOffset = (uint8_t)CC_PC_PR_ETH_OFFSET;
++ break;
++
++ case (HEADER_TYPE_USER_DEFINED_SHIM1):
++ if (offset || glblMask)
++ *parseArrayOffset = (uint8_t)CC_PC_PR_USER_DEFINED_SHIM1_OFFSET;
++ else
++ return CC_PC_PR_SHIM1;
++ break;
++
++ case (HEADER_TYPE_USER_DEFINED_SHIM2):
++ if (offset || glblMask)
++ *parseArrayOffset = (uint8_t)CC_PC_PR_USER_DEFINED_SHIM2_OFFSET;
++ else
++ return CC_PC_PR_SHIM2;
++ break;
++
++ case (HEADER_TYPE_LLC_SNAP):
++ *parseArrayOffset = CC_PC_PR_USER_LLC_SNAP_OFFSET;
++ break;
++
++ case (HEADER_TYPE_PPPoE):
++ *parseArrayOffset = CC_PC_PR_PPPOE_OFFSET;
++ break;
++
++ case (HEADER_TYPE_MPLS):
++ if ((hdrIndex == e_FM_PCD_HDR_INDEX_NONE) || (hdrIndex == e_FM_PCD_HDR_INDEX_1))
++ *parseArrayOffset = CC_PC_PR_MPLS1_OFFSET;
++ else if (hdrIndex == e_FM_PCD_HDR_INDEX_LAST)
++ *parseArrayOffset = CC_PC_PR_MPLS_LAST_OFFSET;
++ else
++ {
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal MPLS header index"));
++ return CC_PC_ILLEGAL;
++ }
++ break;
++
++ case (HEADER_TYPE_IPv4):
++ case (HEADER_TYPE_IPv6):
++ if ((hdrIndex == e_FM_PCD_HDR_INDEX_NONE) || (hdrIndex == e_FM_PCD_HDR_INDEX_1))
++ *parseArrayOffset = CC_PC_PR_IP1_OFFSET;
++ else if (hdrIndex == e_FM_PCD_HDR_INDEX_2)
++ *parseArrayOffset = CC_PC_PR_IP_LAST_OFFSET;
++ else
++ {
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IP header index"));
++ return CC_PC_ILLEGAL;
++ }
++ break;
++
++ case (HEADER_TYPE_MINENCAP):
++ *parseArrayOffset = CC_PC_PR_MINENC_OFFSET;
++ break;
++
++ case (HEADER_TYPE_GRE):
++ *parseArrayOffset = CC_PC_PR_GRE_OFFSET;
++ break;
++
++ case (HEADER_TYPE_TCP):
++ case (HEADER_TYPE_UDP):
++ case (HEADER_TYPE_IPSEC_AH):
++ case (HEADER_TYPE_IPSEC_ESP):
++ case (HEADER_TYPE_DCCP):
++ case (HEADER_TYPE_SCTP):
++ *parseArrayOffset = CC_PC_PR_L4_OFFSET;
++ break;
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IP header for this type of operation"));
++ return CC_PC_ILLEGAL;
++ }
++
++ if (offsetRelevant)
++ return CC_PR_OFFSET;
++ else
++ return CC_PR_WITHOUT_OFFSET;
++}
++
++static uint8_t GetFieldParseCode(e_NetHeaderType hdr,
++ t_FmPcdFields field,
++ uint32_t offset,
++ uint8_t *parseArrayOffset,
++ e_FmPcdHdrIndex hdrIndex)
++{
++ bool offsetRelevant = FALSE;
++
++ if (offset)
++ offsetRelevant = TRUE;
++
++ switch (hdr)
++ {
++ case (HEADER_TYPE_NONE):
++ ASSERT_COND(FALSE);
++ case (HEADER_TYPE_ETH):
++ switch (field.eth)
++ {
++ case (NET_HEADER_FIELD_ETH_TYPE):
++ *parseArrayOffset = CC_PC_PR_ETYPE_LAST_OFFSET;
++ break;
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return CC_PC_ILLEGAL;
++ }
++ break;
++
++ case (HEADER_TYPE_VLAN):
++ switch (field.vlan)
++ {
++ case (NET_HEADER_FIELD_VLAN_TCI):
++ if ((hdrIndex == e_FM_PCD_HDR_INDEX_NONE) || (hdrIndex == e_FM_PCD_HDR_INDEX_1))
++ *parseArrayOffset = CC_PC_PR_VLAN1_OFFSET;
++ else if (hdrIndex == e_FM_PCD_HDR_INDEX_LAST)
++ *parseArrayOffset = CC_PC_PR_VLAN2_OFFSET;
++ break;
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return CC_PC_ILLEGAL;
++ }
++ break;
++
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal header "));
++ return CC_PC_ILLEGAL;
++ }
++
++ if (offsetRelevant)
++ return CC_PR_OFFSET;
++ else
++ return CC_PR_WITHOUT_OFFSET;
++}
++
++static void FillAdOfTypeResult(t_Handle h_Ad,
++ t_FmPcdCcStatsParams *p_FmPcdCcStatsParams,
++ t_FmPcd *p_FmPcd,
++ t_FmPcdCcNextEngineParams *p_CcNextEngineParams)
++{
++ t_AdOfTypeResult *p_AdResult = (t_AdOfTypeResult *)h_Ad;
++ t_Handle h_TmpAd;
++ uint32_t tmp = 0, tmpNia = 0;
++ uint16_t profileId;
++ t_Handle p_AdNewPtr = NULL;
++
++ /* There are 3 cases handled in this routine of building a "result" type AD.
++ * Case 1: No Manip. The action descriptor is built within the match table.
++ * Case 2: Manip exists. A new AD is created - p_AdNewPtr. It is initialized
++ * either in the FmPcdManipUpdateAdResultForCc routine or it was already
++ * initialized and returned here.
++ * p_AdResult (within the match table) will be initialized after
++ * this routine returns and point to the existing AD.
++ * Case 3: Manip exists. The action descriptor is built within the match table.
++ * FmPcdManipUpdateAdResultForCc returns a NULL p_AdNewPtr.
++ *
++ * If statistics were enabled and the statistics mode of this node requires
++ * a statistics Ad, it will be placed after the result Ad and before the
++ * manip Ad, if manip Ad exists here.
++ */
++
++ /* As default, the "new" ptr is the current one. i.e. the content of the result
++ * AD will be written into the match table itself (case (1))*/
++ p_AdNewPtr = p_AdResult;
++
++ /* Initialize an action descriptor, if current statistics mode requires an Ad */
++ if (p_FmPcdCcStatsParams)
++ {
++ ASSERT_COND(p_FmPcdCcStatsParams->h_StatsAd);
++ ASSERT_COND(p_FmPcdCcStatsParams->h_StatsCounters);
++
++ /* Swapping addresses between statistics Ad and the current lookup AD addresses */
++ h_TmpAd = p_FmPcdCcStatsParams->h_StatsAd;
++ p_FmPcdCcStatsParams->h_StatsAd = h_Ad;
++ h_Ad = h_TmpAd;
++
++ p_AdNewPtr = h_Ad;
++ p_AdResult = h_Ad;
++
++ /* Init statistics Ad and connect current lookup AD as 'next action' from statistics Ad */
++ UpdateStatsAd(p_FmPcdCcStatsParams,
++ h_Ad,
++ p_FmPcd->physicalMuramBase);
++ }
++
++ /* Create manip and return p_AdNewPtr to either a new descriptor or NULL */
++ if (p_CcNextEngineParams->h_Manip)
++ FmPcdManipUpdateAdResultForCc(p_CcNextEngineParams->h_Manip,
++ p_CcNextEngineParams,
++ h_Ad,
++ &p_AdNewPtr);
++
++ /* if (p_AdNewPtr = NULL) --> Done. (case (3)) */
++ if (p_AdNewPtr)
++ {
++ /* case (1) and (2) */
++ switch (p_CcNextEngineParams->nextEngine)
++ {
++ case (e_FM_PCD_DONE):
++ if (p_CcNextEngineParams->params.enqueueParams.action == e_FM_PCD_ENQ_FRAME)
++ {
++ if (p_CcNextEngineParams->params.enqueueParams.overrideFqid)
++ {
++ tmp = FM_PCD_AD_RESULT_CONTRL_FLOW_TYPE;
++ tmp |= p_CcNextEngineParams->params.enqueueParams.newFqid;
++#if (DPAA_VERSION >= 11)
++ tmp |= (p_CcNextEngineParams->params.enqueueParams.newRelativeStorageProfileId & FM_PCD_AD_RESULT_VSP_MASK) << FM_PCD_AD_RESULT_VSP_SHIFT;
++#endif /* (DPAA_VERSION >= 11) */
++ }
++ else
++ {
++ tmp = FM_PCD_AD_RESULT_DATA_FLOW_TYPE;
++ tmp |= FM_PCD_AD_RESULT_PLCR_DIS;
++ }
++ }
++
++ if (p_CcNextEngineParams->params.enqueueParams.action == e_FM_PCD_DROP_FRAME)
++ tmpNia |= GET_NIA_BMI_AC_DISCARD_FRAME(p_FmPcd);
++ else
++ tmpNia |= GET_NIA_BMI_AC_ENQ_FRAME(p_FmPcd);
++ break;
++
++ case (e_FM_PCD_KG):
++ if (p_CcNextEngineParams->params.kgParams.overrideFqid)
++ {
++ tmp = FM_PCD_AD_RESULT_CONTRL_FLOW_TYPE;
++ tmp |= p_CcNextEngineParams->params.kgParams.newFqid;
++#if (DPAA_VERSION >= 11)
++ tmp |= (p_CcNextEngineParams->params.kgParams.newRelativeStorageProfileId & FM_PCD_AD_RESULT_VSP_MASK) << FM_PCD_AD_RESULT_VSP_SHIFT;
++#endif /* (DPAA_VERSION >= 11) */
++ }
++ else
++ {
++ tmp = FM_PCD_AD_RESULT_DATA_FLOW_TYPE;
++ tmp |= FM_PCD_AD_RESULT_PLCR_DIS;
++ }
++ tmpNia = NIA_KG_DIRECT;
++ tmpNia |= NIA_ENG_KG;
++ tmpNia |= NIA_KG_CC_EN;
++ tmpNia |= FmPcdKgGetSchemeId(p_CcNextEngineParams->params.kgParams.h_DirectScheme);
++ break;
++
++ case (e_FM_PCD_PLCR):
++ tmp = 0;
++ if (p_CcNextEngineParams->params.plcrParams.overrideParams)
++ {
++ tmp = FM_PCD_AD_RESULT_CONTRL_FLOW_TYPE;
++
++ /* if private policer profile, it may be uninitialized yet, therefore no checks are done at this stage */
++ if (p_CcNextEngineParams->params.plcrParams.sharedProfile)
++ {
++ tmpNia |= NIA_PLCR_ABSOLUTE;
++ FmPcdPlcrGetAbsoluteIdByProfileParams((t_Handle)p_FmPcd,
++ e_FM_PCD_PLCR_SHARED,
++ NULL,
++ p_CcNextEngineParams->params.plcrParams.newRelativeProfileId,
++ &profileId);
++ }
++ else
++ profileId = p_CcNextEngineParams->params.plcrParams.newRelativeProfileId;
++
++ tmp |= p_CcNextEngineParams->params.plcrParams.newFqid;
++#if (DPAA_VERSION >= 11)
++ tmp |= (p_CcNextEngineParams->params.plcrParams.newRelativeStorageProfileId & FM_PCD_AD_RESULT_VSP_MASK)<< FM_PCD_AD_RESULT_VSP_SHIFT;
++#endif /* (DPAA_VERSION >= 11) */
++ WRITE_UINT32(p_AdResult->plcrProfile,(uint32_t)((uint32_t)profileId << FM_PCD_AD_PROFILEID_FOR_CNTRL_SHIFT));
++ }
++ else
++ tmp = FM_PCD_AD_RESULT_DATA_FLOW_TYPE;
++
++ tmpNia |= NIA_ENG_PLCR | p_CcNextEngineParams->params.plcrParams.newRelativeProfileId;
++ break;
++
++ default:
++ return;
++ }
++ WRITE_UINT32(p_AdResult->fqid, tmp);
++
++ if (p_CcNextEngineParams->h_Manip)
++ {
++ tmp = GET_UINT32(p_AdResult->plcrProfile);
++ tmp |= (uint32_t)(XX_VirtToPhys(p_AdNewPtr) - (p_FmPcd->physicalMuramBase)) >> 4;
++ WRITE_UINT32(p_AdResult->plcrProfile, tmp);
++
++ tmpNia |= FM_PCD_AD_RESULT_EXTENDED_MODE;
++ tmpNia |= FM_PCD_AD_RESULT_NADEN;
++ }
++
++#if (DPAA_VERSION >= 11)
++ tmpNia |= FM_PCD_AD_RESULT_NO_OM_VSPE;
++#endif /* (DPAA_VERSION >= 11) */
++ WRITE_UINT32(p_AdResult->nia, tmpNia);
++ }
++}
++
++static t_Error CcUpdateParams(t_Handle h_FmPcd,
++ t_Handle h_PcdParams,
++ t_Handle h_FmPort,
++ t_Handle h_FmTree,
++ bool validate)
++{
++ t_FmPcdCcTree *p_CcTree = (t_FmPcdCcTree *) h_FmTree;
++
++ return CcUpdateParam(h_FmPcd,
++ h_PcdParams,
++ h_FmPort,
++ p_CcTree->keyAndNextEngineParams,
++ p_CcTree->numOfEntries,
++ UINT_TO_PTR(p_CcTree->ccTreeBaseAddr),
++ validate,
++ 0,
++ h_FmTree,
++ FALSE);
++}
++
++
++static void ReleaseNewNodeCommonPart(t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalInfo)
++{
++ if (p_AdditionalInfo->p_AdTableNew)
++ FM_MURAM_FreeMem(FmPcdGetMuramHandle(((t_FmPcdCcNode *)(p_AdditionalInfo->h_CurrentNode))->h_FmPcd),
++ p_AdditionalInfo->p_AdTableNew);
++
++ if (p_AdditionalInfo->p_KeysMatchTableNew)
++ FM_MURAM_FreeMem(FmPcdGetMuramHandle(((t_FmPcdCcNode *)(p_AdditionalInfo->h_CurrentNode))->h_FmPcd),
++ p_AdditionalInfo->p_KeysMatchTableNew);
++}
++
++static t_Error UpdateGblMask(t_FmPcdCcNode *p_CcNode,
++ uint8_t keySize,
++ uint8_t *p_Mask)
++{
++ uint8_t prvGlblMaskSize = p_CcNode->glblMaskSize;
++
++ if (p_Mask &&
++ !p_CcNode->glblMaskUpdated &&
++ (keySize <= 4) &&
++ !p_CcNode->lclMask)
++ {
++ memcpy(p_CcNode->p_GlblMask, p_Mask, (sizeof(uint8_t))*keySize);
++ p_CcNode->glblMaskUpdated = TRUE;
++ p_CcNode->glblMaskSize = 4;
++ }
++ else if (p_Mask &&
++ (keySize <= 4) &&
++ !p_CcNode->lclMask)
++ {
++ if (memcmp(p_CcNode->p_GlblMask, p_Mask, keySize) != 0)
++ {
++ p_CcNode->lclMask = TRUE;
++ p_CcNode->glblMaskSize = 0;
++ }
++ }
++ else if (!p_Mask && p_CcNode->glblMaskUpdated && (keySize <= 4))
++ {
++ uint32_t tmpMask = 0xffffffff;
++ if (memcmp(p_CcNode->p_GlblMask, &tmpMask, 4) != 0)
++ {
++ p_CcNode->lclMask = TRUE;
++ p_CcNode->glblMaskSize = 0;
++ }
++ }
++ else if (p_Mask)
++ {
++ p_CcNode->lclMask = TRUE;
++ p_CcNode->glblMaskSize = 0;
++ }
++
++ /* In static mode (maxNumOfKeys > 0), local mask is supported
++ only is mask support was enabled at initialization */
++ if (p_CcNode->maxNumOfKeys && (!p_CcNode->maskSupport) && p_CcNode->lclMask)
++ {
++ p_CcNode->lclMask = FALSE;
++ p_CcNode->glblMaskSize = prvGlblMaskSize;
++ return ERROR_CODE(E_NOT_SUPPORTED);
++ }
++
++ return E_OK;
++}
++
++static __inline__ t_Handle GetNewAd(t_Handle h_FmPcdCcNodeOrTree, bool isTree)
++{
++ t_FmPcd *p_FmPcd;
++ t_Handle h_Ad;
++
++ if (isTree)
++ p_FmPcd = (t_FmPcd *)(((t_FmPcdCcTree *)h_FmPcdCcNodeOrTree)->h_FmPcd);
++ else
++ p_FmPcd = (t_FmPcd *)(((t_FmPcdCcNode *)h_FmPcdCcNodeOrTree)->h_FmPcd);
++
++ if ((isTree && p_FmPcd->p_CcShadow) ||
++ (!isTree && ((t_FmPcdCcNode *)h_FmPcdCcNodeOrTree)->maxNumOfKeys))
++ {
++ /* The allocated shadow is divided as follows:
++ 0 . . . 16 . . .
++ ---------------------------------------------------
++ | Shadow | Shadow Keys | Shadow Next |
++ | Ad | Match Table | Engine Table |
++ | (16 bytes) | (maximal size) | (maximal size) |
++ ---------------------------------------------------
++ */
++ if (!p_FmPcd->p_CcShadow)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("CC Shadow not allocated"));
++ return NULL;
++ }
++
++ h_Ad = p_FmPcd->p_CcShadow;
++ }
++ else
++ {
++ h_Ad = (t_Handle)FM_MURAM_AllocMem(FmPcdGetMuramHandle(p_FmPcd),
++ FM_PCD_CC_AD_ENTRY_SIZE,
++ FM_PCD_CC_AD_TABLE_ALIGN);
++ if (!h_Ad)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for CC node action descriptor"));
++ return NULL;
++ }
++ }
++
++ return h_Ad;
++}
++
++static t_Error BuildNewNodeCommonPart(t_FmPcdCcNode *p_CcNode,
++ int *size,
++ t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalInfo)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
++
++ if (p_CcNode->lclMask)
++ *size = 2 * p_CcNode->ccKeySizeAccExtraction;
++ else
++ *size = p_CcNode->ccKeySizeAccExtraction;
++
++ if (p_CcNode->maxNumOfKeys == 0)
++ {
++ p_AdditionalInfo->p_AdTableNew =
++ (t_Handle)FM_MURAM_AllocMem(FmPcdGetMuramHandle(p_FmPcd),
++ (uint32_t)( (p_AdditionalInfo->numOfKeys+1) * FM_PCD_CC_AD_ENTRY_SIZE),
++ FM_PCD_CC_AD_TABLE_ALIGN);
++ if (!p_AdditionalInfo->p_AdTableNew)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for CC node action descriptors table"));
++
++ p_AdditionalInfo->p_KeysMatchTableNew =
++ (t_Handle)FM_MURAM_AllocMem(FmPcdGetMuramHandle(p_FmPcd),
++ (uint32_t)(*size * sizeof(uint8_t) * (p_AdditionalInfo->numOfKeys + 1)),
++ FM_PCD_CC_KEYS_MATCH_TABLE_ALIGN);
++ if (!p_AdditionalInfo->p_KeysMatchTableNew)
++ {
++ FM_MURAM_FreeMem(FmPcdGetMuramHandle(p_CcNode->h_FmPcd), p_AdditionalInfo->p_AdTableNew);
++ p_AdditionalInfo->p_AdTableNew = NULL;
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for CC node key match table"));
++ }
++
++ IOMemSet32((uint8_t*)p_AdditionalInfo->p_AdTableNew, 0, (uint32_t)((p_AdditionalInfo->numOfKeys+1) * FM_PCD_CC_AD_ENTRY_SIZE));
++ IOMemSet32((uint8_t*)p_AdditionalInfo->p_KeysMatchTableNew, 0, *size * sizeof(uint8_t) * (p_AdditionalInfo->numOfKeys + 1));
++ }
++ else
++ {
++ /* The allocated shadow is divided as follows:
++ 0 . . . 16 . . .
++ ---------------------------------------------------
++ | Shadow | Shadow Keys | Shadow Next |
++ | Ad | Match Table | Engine Table |
++ | (16 bytes) | (maximal size) | (maximal size) |
++ ---------------------------------------------------
++ */
++
++ if (!p_FmPcd->p_CcShadow)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("CC Shadow not allocated"));
++
++ p_AdditionalInfo->p_KeysMatchTableNew = PTR_MOVE(p_FmPcd->p_CcShadow, FM_PCD_CC_AD_ENTRY_SIZE);
++ p_AdditionalInfo->p_AdTableNew = PTR_MOVE(p_AdditionalInfo->p_KeysMatchTableNew, p_CcNode->keysMatchTableMaxSize);
++
++ IOMemSet32((uint8_t*)p_AdditionalInfo->p_AdTableNew, 0, (uint32_t)((p_CcNode->maxNumOfKeys + 1) * FM_PCD_CC_AD_ENTRY_SIZE));
++ IOMemSet32((uint8_t*)p_AdditionalInfo->p_KeysMatchTableNew, 0, (*size) * sizeof(uint8_t) * (p_CcNode->maxNumOfKeys));
++ }
++
++ p_AdditionalInfo->p_AdTableOld = p_CcNode->h_AdTable;
++ p_AdditionalInfo->p_KeysMatchTableOld = p_CcNode->h_KeysMatchTable;
++
++ return E_OK;
++}
++
++static t_Error BuildNewNodeAddOrMdfyKeyAndNextEngine(t_Handle h_FmPcd,
++ t_FmPcdCcNode *p_CcNode,
++ uint16_t keyIndex,
++ t_FmPcdCcKeyParams *p_KeyParams,
++ t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalInfo,
++ bool add)
++{
++ t_Error err = E_OK;
++ t_Handle p_AdTableNewTmp, p_KeysMatchTableNewTmp;
++ t_Handle p_KeysMatchTableOldTmp, p_AdTableOldTmp;
++ int size;
++ int i = 0, j = 0;
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ uint32_t requiredAction = 0;
++ bool prvLclMask;
++ t_CcNodeInformation *p_CcNodeInformation;
++ t_FmPcdCcStatsParams statsParams = {0};
++ t_List *p_Pos;
++ t_FmPcdStatsObj *p_StatsObj;
++
++ /* Check that new NIA is legal */
++ err = ValidateNextEngineParams(h_FmPcd,
++ &p_KeyParams->ccNextEngineParams,
++ p_CcNode->statisticsMode);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ prvLclMask = p_CcNode->lclMask;
++
++ /* Check that new key is not require update of localMask */
++ err = UpdateGblMask(p_CcNode,
++ p_CcNode->ccKeySizeAccExtraction,
++ p_KeyParams->p_Mask);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++
++ /* Update internal data structure with new next engine for the given index */
++ memcpy(&p_AdditionalInfo->keyAndNextEngineParams[keyIndex].nextEngineParams,
++ &p_KeyParams->ccNextEngineParams,
++ sizeof(t_FmPcdCcNextEngineParams));
++
++ memcpy(p_AdditionalInfo->keyAndNextEngineParams[keyIndex].key,
++ p_KeyParams->p_Key,
++ p_CcNode->userSizeOfExtraction);
++
++ if ((p_AdditionalInfo->keyAndNextEngineParams[keyIndex].nextEngineParams.nextEngine == e_FM_PCD_CC)
++ && p_AdditionalInfo->keyAndNextEngineParams[keyIndex].nextEngineParams.h_Manip)
++ {
++ err = AllocAndFillAdForContLookupManip(p_AdditionalInfo->keyAndNextEngineParams[keyIndex].nextEngineParams.params.ccParams.h_CcNode);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++ }
++
++ if (p_KeyParams->p_Mask)
++ memcpy(p_AdditionalInfo->keyAndNextEngineParams[keyIndex].mask,
++ p_KeyParams->p_Mask,
++ p_CcNode->userSizeOfExtraction);
++ else
++ memset(p_AdditionalInfo->keyAndNextEngineParams[keyIndex].mask,
++ 0xFF,
++ p_CcNode->userSizeOfExtraction);
++
++ /* Update numOfKeys */
++ if (add)
++ p_AdditionalInfo->numOfKeys = (uint8_t)(p_CcNode->numOfKeys + 1);
++ else
++ p_AdditionalInfo->numOfKeys = (uint8_t)p_CcNode->numOfKeys;
++
++ /* Allocate new tables in MURAM: keys match table and action descriptors table */
++ err = BuildNewNodeCommonPart(p_CcNode, &size, p_AdditionalInfo);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ /* Check that manip is legal and what requiredAction is necessary for this manip */
++ if (p_KeyParams->ccNextEngineParams.h_Manip)
++ {
++ err = FmPcdManipCheckParamsForCcNextEngine(&p_KeyParams->ccNextEngineParams,&requiredAction);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++ }
++
++ p_AdditionalInfo->keyAndNextEngineParams[keyIndex].requiredAction = requiredAction;
++ p_AdditionalInfo->keyAndNextEngineParams[keyIndex].requiredAction |= UPDATE_CC_WITH_TREE;
++
++ /* Update new Ad and new Key Table according to new requirement */
++ i = 0;
++ for (j = 0; j < p_AdditionalInfo->numOfKeys; j++)
++ {
++ p_AdTableNewTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableNew, j*FM_PCD_CC_AD_ENTRY_SIZE);
++
++ if (j == keyIndex)
++ {
++ if (p_KeyParams->ccNextEngineParams.statisticsEn)
++ {
++ /* Allocate a statistics object that holds statistics AD and counters.
++ - For added key - New statistics AD and counters pointer need to be allocated
++ new statistics object. If statistics were enabled, we need to replace the
++ existing descriptor with a new descriptor with nullified counters.
++ */
++ p_StatsObj = GetStatsObj(p_CcNode);
++ ASSERT_COND(p_StatsObj);
++
++ /* Store allocated statistics object */
++ ASSERT_COND(keyIndex < CC_MAX_NUM_OF_KEYS);
++ p_AdditionalInfo->keyAndNextEngineParams[keyIndex].p_StatsObj = p_StatsObj;
++
++ statsParams.h_StatsAd = p_StatsObj->h_StatsAd;
++ statsParams.h_StatsCounters = p_StatsObj->h_StatsCounters;
++#if (DPAA_VERSION >= 11)
++ statsParams.h_StatsFLRs = p_CcNode->h_StatsFLRs;
++
++#endif /* (DPAA_VERSION >= 11) */
++
++ /* Building action descriptor for the received new key */
++ NextStepAd(p_AdTableNewTmp,
++ &statsParams,
++ &p_KeyParams->ccNextEngineParams,
++ p_FmPcd);
++ }
++ else
++ {
++ /* Building action descriptor for the received new key */
++ NextStepAd(p_AdTableNewTmp,
++ NULL,
++ &p_KeyParams->ccNextEngineParams,
++ p_FmPcd);
++ }
++
++ /* Copy the received new key into keys match table */
++ p_KeysMatchTableNewTmp = PTR_MOVE(p_AdditionalInfo->p_KeysMatchTableNew, j*size*sizeof(uint8_t));
++
++ Mem2IOCpy32((void*)p_KeysMatchTableNewTmp, p_KeyParams->p_Key, p_CcNode->userSizeOfExtraction);
++
++ /* Update mask for the received new key */
++ if (p_CcNode->lclMask)
++ {
++ if (p_KeyParams->p_Mask)
++ {
++ Mem2IOCpy32(PTR_MOVE(p_KeysMatchTableNewTmp,
++ p_CcNode->ccKeySizeAccExtraction),
++ p_KeyParams->p_Mask,
++ p_CcNode->userSizeOfExtraction);
++ }
++ else if (p_CcNode->ccKeySizeAccExtraction > 4)
++ {
++ IOMemSet32(PTR_MOVE(p_KeysMatchTableNewTmp,
++ p_CcNode->ccKeySizeAccExtraction),
++ 0xff,
++ p_CcNode->userSizeOfExtraction);
++ }
++ else
++ {
++ Mem2IOCpy32(PTR_MOVE(p_KeysMatchTableNewTmp,
++ p_CcNode->ccKeySizeAccExtraction),
++ p_CcNode->p_GlblMask,
++ p_CcNode->userSizeOfExtraction);
++ }
++ }
++
++ /* If key modification requested, the old entry is omitted and replaced by the new parameters */
++ if (!add)
++ i++;
++ }
++ else
++ {
++ /* Copy existing action descriptors to the newly allocated Ad table */
++ p_AdTableOldTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableOld, i*FM_PCD_CC_AD_ENTRY_SIZE);
++ IO2IOCpy32(p_AdTableNewTmp, p_AdTableOldTmp, FM_PCD_CC_AD_ENTRY_SIZE);
++
++ /* Copy existing keys and their masks to the newly allocated keys match table */
++ p_KeysMatchTableNewTmp = PTR_MOVE(p_AdditionalInfo->p_KeysMatchTableNew, j * size * sizeof(uint8_t));
++ p_KeysMatchTableOldTmp = PTR_MOVE(p_AdditionalInfo->p_KeysMatchTableOld, i * size * sizeof(uint8_t));
++
++ if (p_CcNode->lclMask)
++ {
++ if (prvLclMask)
++ {
++ IO2IOCpy32(PTR_MOVE(p_KeysMatchTableNewTmp, p_CcNode->ccKeySizeAccExtraction),
++ PTR_MOVE(p_KeysMatchTableOldTmp, p_CcNode->ccKeySizeAccExtraction),
++ p_CcNode->ccKeySizeAccExtraction);
++ }
++ else
++ {
++ p_KeysMatchTableOldTmp = PTR_MOVE(p_CcNode->h_KeysMatchTable,
++ i * p_CcNode->ccKeySizeAccExtraction*sizeof(uint8_t));
++
++ if (p_CcNode->ccKeySizeAccExtraction > 4)
++ {
++ IOMemSet32(PTR_MOVE(p_KeysMatchTableNewTmp,
++ p_CcNode->ccKeySizeAccExtraction),
++ 0xff,
++ p_CcNode->userSizeOfExtraction);
++ }
++ else
++ {
++ IO2IOCpy32(PTR_MOVE(p_KeysMatchTableNewTmp,
++ p_CcNode->ccKeySizeAccExtraction),
++ p_CcNode->p_GlblMask,
++ p_CcNode->userSizeOfExtraction);
++ }
++ }
++ }
++
++ IO2IOCpy32(p_KeysMatchTableNewTmp, p_KeysMatchTableOldTmp, p_CcNode->ccKeySizeAccExtraction);
++
++ i++;
++ }
++ }
++
++ /* Miss action descriptor */
++ p_AdTableNewTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableNew, j * FM_PCD_CC_AD_ENTRY_SIZE);
++ p_AdTableOldTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableOld, i * FM_PCD_CC_AD_ENTRY_SIZE);
++ IO2IOCpy32(p_AdTableNewTmp, p_AdTableOldTmp, FM_PCD_CC_AD_ENTRY_SIZE);
++
++ if (!LIST_IsEmpty(&p_CcNode->ccTreesLst))
++ {
++ LIST_FOR_EACH(p_Pos, &p_CcNode->ccTreesLst)
++ {
++ p_CcNodeInformation = CC_NODE_F_OBJECT(p_Pos);
++ ASSERT_COND(p_CcNodeInformation->h_CcNode);
++ /* Update the manipulation which has to be updated from parameters of the port */
++ /* It's has to be updated with restrictions defined in the function */
++ err = SetRequiredAction(p_CcNode->h_FmPcd,
++ p_CcNode->shadowAction | p_AdditionalInfo->keyAndNextEngineParams[keyIndex].requiredAction,
++ &p_AdditionalInfo->keyAndNextEngineParams[keyIndex],
++ PTR_MOVE(p_AdditionalInfo->p_AdTableNew, keyIndex*FM_PCD_CC_AD_ENTRY_SIZE),
++ 1,
++ p_CcNodeInformation->h_CcNode);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++
++ err = CcUpdateParam(p_CcNode->h_FmPcd,
++ NULL,
++ NULL,
++ &p_AdditionalInfo->keyAndNextEngineParams[keyIndex],
++ 1,
++ PTR_MOVE(p_AdditionalInfo->p_AdTableNew, keyIndex*FM_PCD_CC_AD_ENTRY_SIZE),
++ TRUE,
++ p_CcNodeInformation->index,
++ p_CcNodeInformation->h_CcNode,
++ TRUE);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++ }
++ }
++
++ if (p_CcNode->lclMask)
++ memset(p_CcNode->p_GlblMask, 0xff, CC_GLBL_MASK_SIZE * sizeof(uint8_t));
++
++ if (p_KeyParams->ccNextEngineParams.nextEngine == e_FM_PCD_CC)
++ p_AdditionalInfo->h_NodeForAdd = p_KeyParams->ccNextEngineParams.params.ccParams.h_CcNode;
++ if (p_KeyParams->ccNextEngineParams.h_Manip)
++ p_AdditionalInfo->h_ManipForAdd = p_KeyParams->ccNextEngineParams.h_Manip;
++
++#if (DPAA_VERSION >= 11)
++ if ((p_KeyParams->ccNextEngineParams.nextEngine == e_FM_PCD_FR) &&
++ (p_KeyParams->ccNextEngineParams.params.frParams.h_FrmReplic))
++ p_AdditionalInfo->h_FrmReplicForAdd = p_KeyParams->ccNextEngineParams.params.frParams.h_FrmReplic;
++#endif /* (DPAA_VERSION >= 11) */
++
++ if (!add)
++ {
++ if (p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.nextEngine == e_FM_PCD_CC)
++ p_AdditionalInfo->h_NodeForRmv = p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.params.ccParams.h_CcNode;
++
++ if (p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.h_Manip)
++ p_AdditionalInfo->h_ManipForRmv = p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.h_Manip;
++
++ /* If statistics were previously enabled, store the old statistics object to be released */
++ if (p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj)
++ {
++ p_AdditionalInfo->p_StatsObjForRmv = p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj;
++ }
++
++#if (DPAA_VERSION >= 11)
++ if ((p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.nextEngine == e_FM_PCD_FR) &&
++ (p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.params.frParams.h_FrmReplic))
++ p_AdditionalInfo->h_FrmReplicForRmv = p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.params.frParams.h_FrmReplic;
++#endif /* (DPAA_VERSION >= 11) */
++ }
++
++ return E_OK;
++}
++
++static t_Error BuildNewNodeRemoveKey(t_FmPcdCcNode *p_CcNode,
++ uint16_t keyIndex,
++ t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalInfo)
++{
++ int i = 0, j = 0;
++ t_Handle p_AdTableNewTmp,p_KeysMatchTableNewTmp;
++ t_Handle p_KeysMatchTableOldTmp, p_AdTableOldTmp;
++ int size;
++ t_Error err = E_OK;
++
++ /*save new numOfKeys*/
++ p_AdditionalInfo->numOfKeys = (uint16_t)(p_CcNode->numOfKeys - 1);
++
++ /*function which allocates in the memory new KeyTbl, AdTbl*/
++ err = BuildNewNodeCommonPart(p_CcNode, &size, p_AdditionalInfo);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ /*update new Ad and new Key Table according to new requirement*/
++ for (i=0, j=0; jnumOfKeys; i++, j++)
++ {
++ if (j == keyIndex)
++ {
++ p_AdTableOldTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableOld, j * FM_PCD_CC_AD_ENTRY_SIZE);
++ j++;
++ }
++ if (j == p_CcNode->numOfKeys)
++ break;
++ p_AdTableNewTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableNew, i * FM_PCD_CC_AD_ENTRY_SIZE);
++ p_AdTableOldTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableOld, j * FM_PCD_CC_AD_ENTRY_SIZE);
++ IO2IOCpy32(p_AdTableNewTmp, p_AdTableOldTmp, FM_PCD_CC_AD_ENTRY_SIZE);
++
++ p_KeysMatchTableOldTmp = PTR_MOVE(p_AdditionalInfo->p_KeysMatchTableOld, j * size * sizeof(uint8_t));
++ p_KeysMatchTableNewTmp = PTR_MOVE(p_AdditionalInfo->p_KeysMatchTableNew, i * size * sizeof(uint8_t));
++ IO2IOCpy32(p_KeysMatchTableNewTmp, p_KeysMatchTableOldTmp, size * sizeof(uint8_t));
++ }
++
++ p_AdTableNewTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableNew, i * FM_PCD_CC_AD_ENTRY_SIZE);
++ p_AdTableOldTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableOld, j * FM_PCD_CC_AD_ENTRY_SIZE);
++ IO2IOCpy32(p_AdTableNewTmp, p_AdTableOldTmp, FM_PCD_CC_AD_ENTRY_SIZE);
++
++ if (p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.nextEngine == e_FM_PCD_CC)
++ p_AdditionalInfo->h_NodeForRmv =
++ p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.params.ccParams.h_CcNode;
++
++ if (p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.h_Manip)
++ p_AdditionalInfo->h_ManipForRmv =
++ p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.h_Manip;
++
++ /* If statistics were previously enabled, store the old statistics object to be released */
++ if (p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj)
++ {
++ p_AdditionalInfo->p_StatsObjForRmv = p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj;
++ }
++
++#if (DPAA_VERSION >= 11)
++ if ((p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.nextEngine == e_FM_PCD_FR) &&
++ (p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.params.frParams.h_FrmReplic))
++ p_AdditionalInfo->h_FrmReplicForRmv =
++ p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.params.frParams.h_FrmReplic;
++#endif /* (DPAA_VERSION >= 11) */
++
++ return E_OK;
++}
++
++static t_Error BuildNewNodeModifyKey(t_FmPcdCcNode *p_CcNode,
++ uint16_t keyIndex,
++ uint8_t *p_Key,
++ uint8_t *p_Mask,
++ t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalInfo)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
++ t_Error err = E_OK;
++ t_Handle p_AdTableNewTmp, p_KeysMatchTableNewTmp;
++ t_Handle p_KeysMatchTableOldTmp, p_AdTableOldTmp;
++ int size;
++ int i = 0, j = 0;
++ bool prvLclMask;
++ t_FmPcdStatsObj *p_StatsObj, tmpStatsObj;
++ p_AdditionalInfo->numOfKeys = p_CcNode->numOfKeys;
++
++ prvLclMask = p_CcNode->lclMask;
++
++ /* Check that new key is not require update of localMask */
++ err = UpdateGblMask(p_CcNode,
++ p_CcNode->ccKeySizeAccExtraction,
++ p_Mask);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++
++ /* Update internal data structure with new next engine for the given index */
++ memcpy(p_AdditionalInfo->keyAndNextEngineParams[keyIndex].key,
++ p_Key,
++ p_CcNode->userSizeOfExtraction);
++
++ if (p_Mask)
++ memcpy(p_AdditionalInfo->keyAndNextEngineParams[keyIndex].mask,
++ p_Mask,
++ p_CcNode->userSizeOfExtraction);
++ else
++ memset(p_AdditionalInfo->keyAndNextEngineParams[keyIndex].mask,
++ 0xFF,
++ p_CcNode->userSizeOfExtraction);
++
++ /*function which build in the memory new KeyTbl, AdTbl*/
++ err = BuildNewNodeCommonPart(p_CcNode, &size, p_AdditionalInfo);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ /*fill the New AdTable and New KeyTable*/
++ for (j=0, i=0; jnumOfKeys; j++, i++)
++ {
++ p_AdTableNewTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableNew, j*FM_PCD_CC_AD_ENTRY_SIZE);
++ p_AdTableOldTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableOld, i*FM_PCD_CC_AD_ENTRY_SIZE);
++
++ IO2IOCpy32(p_AdTableNewTmp, p_AdTableOldTmp, FM_PCD_CC_AD_ENTRY_SIZE);
++
++ if (j == keyIndex)
++ {
++ ASSERT_COND(keyIndex < CC_MAX_NUM_OF_KEYS);
++ if (p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj)
++ {
++ /* As statistics were enabled, we need to update the existing
++ statistics descriptor with a new nullified counters. */
++ p_StatsObj = GetStatsObj(p_CcNode);
++ ASSERT_COND(p_StatsObj);
++
++ SetStatsCounters(p_AdTableNewTmp,
++ (uint32_t)((XX_VirtToPhys(p_StatsObj->h_StatsCounters) - p_FmPcd->physicalMuramBase)));
++
++ tmpStatsObj.h_StatsAd = p_StatsObj->h_StatsAd;
++ tmpStatsObj.h_StatsCounters = p_StatsObj->h_StatsCounters;
++
++ /* As we need to replace only the counters, we build a new statistics
++ object that holds the old AD and the new counters - this will be the
++ currently used statistics object.
++ The newly allocated AD is not required and may be released back to
++ the available objects with the previous counters pointer. */
++ p_StatsObj->h_StatsAd = p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj->h_StatsAd;
++
++ p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj->h_StatsAd = tmpStatsObj.h_StatsAd;
++
++ /* Store allocated statistics object */
++ p_AdditionalInfo->keyAndNextEngineParams[keyIndex].p_StatsObj = p_StatsObj;
++
++ /* As statistics were previously enabled, store the old statistics object to be released */
++ p_AdditionalInfo->p_StatsObjForRmv = p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj;
++ }
++
++ p_KeysMatchTableNewTmp = PTR_MOVE(p_AdditionalInfo->p_KeysMatchTableNew, j * size * sizeof(uint8_t));
++
++ Mem2IOCpy32(p_KeysMatchTableNewTmp, p_Key, p_CcNode->userSizeOfExtraction);
++
++ if (p_CcNode->lclMask)
++ {
++ if (p_Mask)
++ Mem2IOCpy32(PTR_MOVE(p_KeysMatchTableNewTmp,
++ p_CcNode->ccKeySizeAccExtraction),
++ p_Mask,
++ p_CcNode->userSizeOfExtraction);
++ else if (p_CcNode->ccKeySizeAccExtraction > 4)
++ IOMemSet32(PTR_MOVE(p_KeysMatchTableNewTmp,
++ p_CcNode->ccKeySizeAccExtraction),
++ 0xff,
++ p_CcNode->userSizeOfExtraction);
++ else
++ Mem2IOCpy32(PTR_MOVE(p_KeysMatchTableNewTmp,
++ p_CcNode->ccKeySizeAccExtraction),
++ p_CcNode->p_GlblMask,
++ p_CcNode->userSizeOfExtraction);
++ }
++ }
++ else
++ {
++ p_KeysMatchTableNewTmp = PTR_MOVE(p_AdditionalInfo->p_KeysMatchTableNew, j * size * sizeof(uint8_t));
++ p_KeysMatchTableOldTmp = PTR_MOVE(p_CcNode->h_KeysMatchTable, i * size * sizeof(uint8_t));
++
++ if (p_CcNode->lclMask)
++ {
++ if (prvLclMask)
++ IO2IOCpy32(PTR_MOVE(p_KeysMatchTableNewTmp, p_CcNode->ccKeySizeAccExtraction),
++ PTR_MOVE(p_KeysMatchTableOldTmp, p_CcNode->ccKeySizeAccExtraction),
++ p_CcNode->userSizeOfExtraction);
++ else
++ {
++ p_KeysMatchTableOldTmp = PTR_MOVE(p_CcNode->h_KeysMatchTable, i * p_CcNode->ccKeySizeAccExtraction * sizeof(uint8_t));
++
++ if (p_CcNode->ccKeySizeAccExtraction > 4)
++ IOMemSet32(PTR_MOVE(p_KeysMatchTableNewTmp,
++ p_CcNode->ccKeySizeAccExtraction),
++ 0xff,
++ p_CcNode->userSizeOfExtraction);
++ else
++ IO2IOCpy32(PTR_MOVE(p_KeysMatchTableNewTmp, p_CcNode->ccKeySizeAccExtraction),
++ p_CcNode->p_GlblMask,
++ p_CcNode->userSizeOfExtraction);
++ }
++ }
++ IO2IOCpy32((void*)p_KeysMatchTableNewTmp,
++ p_KeysMatchTableOldTmp,
++ p_CcNode->ccKeySizeAccExtraction);
++ }
++ }
++
++ p_AdTableNewTmp = PTR_MOVE(p_AdditionalInfo->p_AdTableNew, j * FM_PCD_CC_AD_ENTRY_SIZE);
++ p_AdTableOldTmp = PTR_MOVE(p_CcNode->h_AdTable, i * FM_PCD_CC_AD_ENTRY_SIZE);
++
++ IO2IOCpy32(p_AdTableNewTmp, p_AdTableOldTmp, FM_PCD_CC_AD_ENTRY_SIZE);
++
++ return E_OK;
++}
++
++static t_Error BuildNewNodeModifyNextEngine(t_Handle h_FmPcd,
++ t_Handle h_FmPcdCcNodeOrTree,
++ uint16_t keyIndex,
++ t_FmPcdCcNextEngineParams *p_CcNextEngineParams,
++ t_List *h_OldLst,
++ t_List *h_NewLst,
++ t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalInfo)
++{
++ t_Error err = E_OK;
++ uint32_t requiredAction = 0;
++ t_List *p_Pos;
++ t_CcNodeInformation *p_CcNodeInformation, ccNodeInfo;
++ t_Handle p_Ad;
++ t_FmPcdCcNode *p_FmPcdCcNode1 = NULL;
++ t_FmPcdCcTree *p_FmPcdCcTree = NULL;
++ t_FmPcdStatsObj *p_StatsObj;
++ t_FmPcdCcStatsParams statsParams = {0};
++
++ ASSERT_COND(p_CcNextEngineParams);
++
++ /* check that new NIA is legal */
++ if (!p_AdditionalInfo->tree)
++ err = ValidateNextEngineParams(h_FmPcd,
++ p_CcNextEngineParams,
++ ((t_FmPcdCcNode *)h_FmPcdCcNodeOrTree)->statisticsMode);
++ else
++ /* Statistics are not supported for CC root */
++ err = ValidateNextEngineParams(h_FmPcd,
++ p_CcNextEngineParams,
++ e_FM_PCD_CC_STATS_MODE_NONE);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ /* Update internal data structure for next engine per index (index - key) */
++ memcpy(&p_AdditionalInfo->keyAndNextEngineParams[keyIndex].nextEngineParams,
++ p_CcNextEngineParams,
++ sizeof(t_FmPcdCcNextEngineParams));
++
++ /* Check that manip is legal and what requiredAction is necessary for this manip */
++ if (p_CcNextEngineParams->h_Manip)
++ {
++ err = FmPcdManipCheckParamsForCcNextEngine(p_CcNextEngineParams, &requiredAction);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++ }
++
++ if (!p_AdditionalInfo->tree)
++ {
++ p_FmPcdCcNode1 = (t_FmPcdCcNode *)h_FmPcdCcNodeOrTree;
++ p_AdditionalInfo->numOfKeys = p_FmPcdCcNode1->numOfKeys;
++ p_Ad = p_FmPcdCcNode1->h_AdTable;
++
++ if (p_FmPcdCcNode1->keyAndNextEngineParams[keyIndex].nextEngineParams.nextEngine == e_FM_PCD_CC)
++ p_AdditionalInfo->h_NodeForRmv = p_FmPcdCcNode1->keyAndNextEngineParams[keyIndex].nextEngineParams.params.ccParams.h_CcNode;
++
++ if (p_FmPcdCcNode1->keyAndNextEngineParams[keyIndex].nextEngineParams.h_Manip)
++ p_AdditionalInfo->h_ManipForRmv = p_FmPcdCcNode1->keyAndNextEngineParams[keyIndex].nextEngineParams.h_Manip;
++
++#if (DPAA_VERSION >= 11)
++ if ((p_FmPcdCcNode1->keyAndNextEngineParams[keyIndex].nextEngineParams.nextEngine == e_FM_PCD_FR) &&
++ (p_FmPcdCcNode1->keyAndNextEngineParams[keyIndex].nextEngineParams.params.frParams.h_FrmReplic))
++ p_AdditionalInfo->h_FrmReplicForRmv = p_FmPcdCcNode1->keyAndNextEngineParams[keyIndex].nextEngineParams.params.frParams.h_FrmReplic;
++#endif /* (DPAA_VERSION >= 11) */
++ }
++ else
++ {
++ p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmPcdCcNodeOrTree;
++ p_Ad = UINT_TO_PTR(p_FmPcdCcTree->ccTreeBaseAddr);
++
++ if (p_FmPcdCcTree->keyAndNextEngineParams[keyIndex].nextEngineParams.nextEngine == e_FM_PCD_CC)
++ p_AdditionalInfo->h_NodeForRmv = p_FmPcdCcTree->keyAndNextEngineParams[keyIndex].nextEngineParams.params.ccParams.h_CcNode;
++
++ if (p_FmPcdCcTree->keyAndNextEngineParams[keyIndex].nextEngineParams.h_Manip)
++ p_AdditionalInfo->h_ManipForRmv = p_FmPcdCcTree->keyAndNextEngineParams[keyIndex].nextEngineParams.h_Manip;
++
++#if (DPAA_VERSION >= 11)
++ if ((p_FmPcdCcTree->keyAndNextEngineParams[keyIndex].nextEngineParams.nextEngine == e_FM_PCD_FR) &&
++ (p_FmPcdCcTree->keyAndNextEngineParams[keyIndex].nextEngineParams.params.frParams.h_FrmReplic))
++ p_AdditionalInfo->h_FrmReplicForRmv = p_FmPcdCcTree->keyAndNextEngineParams[keyIndex].nextEngineParams.params.frParams.h_FrmReplic;
++#endif /* (DPAA_VERSION >= 11) */
++ }
++
++ if ((p_CcNextEngineParams->nextEngine == e_FM_PCD_CC)
++ && p_CcNextEngineParams->h_Manip)
++ {
++ err = AllocAndFillAdForContLookupManip(p_CcNextEngineParams->params.ccParams.h_CcNode);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++ }
++
++ ASSERT_COND(p_Ad);
++
++ memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
++ ccNodeInfo.h_CcNode = PTR_MOVE(p_Ad, keyIndex * FM_PCD_CC_AD_ENTRY_SIZE);
++
++ /* If statistics were enabled, this Ad is the statistics Ad. Need to follow its
++ nextAction to retrieve the actual Nia-Ad. If statistics should remain enabled,
++ only the actual Nia-Ad should be modified. */
++ if ((!p_AdditionalInfo->tree) &&
++ (((t_FmPcdCcNode *)h_FmPcdCcNodeOrTree)->keyAndNextEngineParams[keyIndex].p_StatsObj) &&
++ (p_CcNextEngineParams->statisticsEn))
++ ccNodeInfo.h_CcNode = ((t_FmPcdCcNode *)h_FmPcdCcNodeOrTree)->keyAndNextEngineParams[keyIndex].p_StatsObj->h_StatsAd;
++
++ EnqueueNodeInfoToRelevantLst(h_OldLst, &ccNodeInfo, NULL);
++
++ memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
++ p_Ad = GetNewAd(h_FmPcdCcNodeOrTree, p_AdditionalInfo->tree);
++ if (!p_Ad)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for CC node action descriptor"));
++ IOMemSet32((uint8_t *)p_Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE);
++
++ /* If statistics were not enabled before, but requested now - Allocate a statistics
++ object that holds statistics AD and counters. */
++ if ((!p_AdditionalInfo->tree) &&
++ (!((t_FmPcdCcNode *)h_FmPcdCcNodeOrTree)->keyAndNextEngineParams[keyIndex].p_StatsObj) &&
++ (p_CcNextEngineParams->statisticsEn))
++ {
++ p_StatsObj = GetStatsObj((t_FmPcdCcNode *)h_FmPcdCcNodeOrTree);
++ ASSERT_COND(p_StatsObj);
++
++ /* Store allocated statistics object */
++ p_AdditionalInfo->keyAndNextEngineParams[keyIndex].p_StatsObj = p_StatsObj;
++
++ statsParams.h_StatsAd = p_StatsObj->h_StatsAd;
++ statsParams.h_StatsCounters = p_StatsObj->h_StatsCounters;
++
++#if (DPAA_VERSION >= 11)
++ statsParams.h_StatsFLRs = ((t_FmPcdCcNode *)h_FmPcdCcNodeOrTree)->h_StatsFLRs;
++
++#endif /* (DPAA_VERSION >= 11) */
++
++ NextStepAd(p_Ad,
++ &statsParams,
++ p_CcNextEngineParams,
++ h_FmPcd);
++ }
++ else
++ NextStepAd(p_Ad,
++ NULL,
++ p_CcNextEngineParams,
++ h_FmPcd);
++
++ ccNodeInfo.h_CcNode = p_Ad;
++ EnqueueNodeInfoToRelevantLst(h_NewLst, &ccNodeInfo, NULL);
++
++ p_AdditionalInfo->keyAndNextEngineParams[keyIndex].requiredAction = requiredAction;
++ p_AdditionalInfo->keyAndNextEngineParams[keyIndex].requiredAction |= UPDATE_CC_WITH_TREE;
++
++ if (!p_AdditionalInfo->tree)
++ {
++ ASSERT_COND(p_FmPcdCcNode1);
++ if (!LIST_IsEmpty(&p_FmPcdCcNode1->ccTreesLst))
++ {
++ LIST_FOR_EACH(p_Pos, &p_FmPcdCcNode1->ccTreesLst)
++ {
++ p_CcNodeInformation = CC_NODE_F_OBJECT(p_Pos);
++
++ ASSERT_COND(p_CcNodeInformation->h_CcNode);
++ /* Update the manipulation which has to be updated from parameters of the port
++ it's has to be updated with restrictions defined in the function */
++
++ err = SetRequiredAction(p_FmPcdCcNode1->h_FmPcd,
++ p_FmPcdCcNode1->shadowAction | p_AdditionalInfo->keyAndNextEngineParams[keyIndex].requiredAction,
++ &p_AdditionalInfo->keyAndNextEngineParams[keyIndex],
++ p_Ad,
++ 1,
++ p_CcNodeInformation->h_CcNode);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++
++ err = CcUpdateParam(p_FmPcdCcNode1->h_FmPcd,
++ NULL,
++ NULL,
++ &p_AdditionalInfo->keyAndNextEngineParams[keyIndex],
++ 1,
++ p_Ad,
++ TRUE,
++ p_CcNodeInformation->index,
++ p_CcNodeInformation->h_CcNode,
++ TRUE);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++ }
++ }
++ }
++ else
++ {
++ ASSERT_COND(p_FmPcdCcTree);
++
++ err = SetRequiredAction(h_FmPcd,
++ p_FmPcdCcTree->requiredAction | p_AdditionalInfo->keyAndNextEngineParams[keyIndex].requiredAction,
++ &p_AdditionalInfo->keyAndNextEngineParams[keyIndex],
++ p_Ad,
++ 1,
++ (t_Handle)p_FmPcdCcTree);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++
++ err = CcUpdateParam(h_FmPcd,
++ NULL,
++ NULL,
++ &p_AdditionalInfo->keyAndNextEngineParams[keyIndex],
++ 1,
++ p_Ad,
++ TRUE,
++ 0,
++ (t_Handle)p_FmPcdCcTree, TRUE);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++ }
++
++ if (p_CcNextEngineParams->nextEngine == e_FM_PCD_CC)
++ p_AdditionalInfo->h_NodeForAdd = p_CcNextEngineParams->params.ccParams.h_CcNode;
++ if (p_CcNextEngineParams->h_Manip)
++ p_AdditionalInfo->h_ManipForAdd = p_CcNextEngineParams->h_Manip;
++
++ /* If statistics were previously enabled, but now are disabled,
++ store the old statistics object to be released */
++ if ((!p_AdditionalInfo->tree) &&
++ (((t_FmPcdCcNode *)h_FmPcdCcNodeOrTree)->keyAndNextEngineParams[keyIndex].p_StatsObj) &&
++ (!p_CcNextEngineParams->statisticsEn))
++ {
++ p_AdditionalInfo->p_StatsObjForRmv =
++ ((t_FmPcdCcNode *)h_FmPcdCcNodeOrTree)->keyAndNextEngineParams[keyIndex].p_StatsObj;
++
++
++ p_AdditionalInfo->keyAndNextEngineParams[keyIndex].p_StatsObj = NULL;
++ }
++#if (DPAA_VERSION >= 11)
++ if ((p_CcNextEngineParams->nextEngine == e_FM_PCD_FR) &&
++ (p_CcNextEngineParams->params.frParams.h_FrmReplic))
++ p_AdditionalInfo->h_FrmReplicForAdd = p_CcNextEngineParams->params.frParams.h_FrmReplic;
++#endif /* (DPAA_VERSION >= 11) */
++
++ return E_OK;
++}
++
++static void UpdateAdPtrOfNodesWhichPointsOnCrntMdfNode(t_FmPcdCcNode *p_CrntMdfNode,
++ t_List *h_OldLst,
++ t_FmPcdCcNextEngineParams **p_NextEngineParams)
++{
++ t_CcNodeInformation *p_CcNodeInformation;
++ t_FmPcdCcNode *p_NodePtrOnCurrentMdfNode = NULL;
++ t_List *p_Pos;
++ int i = 0;
++ t_Handle p_AdTablePtOnCrntCurrentMdfNode/*, p_AdTableNewModified*/;
++ t_CcNodeInformation ccNodeInfo;
++
++ LIST_FOR_EACH(p_Pos, &p_CrntMdfNode->ccPrevNodesLst)
++ {
++ p_CcNodeInformation = CC_NODE_F_OBJECT(p_Pos);
++ p_NodePtrOnCurrentMdfNode = (t_FmPcdCcNode *)p_CcNodeInformation->h_CcNode;
++
++ ASSERT_COND(p_NodePtrOnCurrentMdfNode);
++
++ /* Search in the previous node which exact index points on this current modified node for getting AD */
++ for (i = 0; i < p_NodePtrOnCurrentMdfNode->numOfKeys + 1; i++)
++ {
++ if (p_NodePtrOnCurrentMdfNode->keyAndNextEngineParams[i].nextEngineParams.nextEngine == e_FM_PCD_CC)
++ {
++ if (p_NodePtrOnCurrentMdfNode->keyAndNextEngineParams[i].nextEngineParams.params.ccParams.h_CcNode == (t_Handle)p_CrntMdfNode)
++ {
++ if (p_NodePtrOnCurrentMdfNode->keyAndNextEngineParams[i].nextEngineParams.h_Manip)
++ p_AdTablePtOnCrntCurrentMdfNode = p_CrntMdfNode->h_Ad;
++ else if (p_NodePtrOnCurrentMdfNode->keyAndNextEngineParams[i].p_StatsObj)
++ p_AdTablePtOnCrntCurrentMdfNode =
++ p_NodePtrOnCurrentMdfNode->keyAndNextEngineParams[i].p_StatsObj->h_StatsAd;
++ else
++ p_AdTablePtOnCrntCurrentMdfNode =
++ PTR_MOVE(p_NodePtrOnCurrentMdfNode->h_AdTable, i*FM_PCD_CC_AD_ENTRY_SIZE);
++
++ memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
++ ccNodeInfo.h_CcNode = p_AdTablePtOnCrntCurrentMdfNode;
++ EnqueueNodeInfoToRelevantLst(h_OldLst, &ccNodeInfo, NULL);
++
++ if (!(*p_NextEngineParams))
++ *p_NextEngineParams = &p_NodePtrOnCurrentMdfNode->keyAndNextEngineParams[i].nextEngineParams;
++ }
++ }
++ }
++
++ ASSERT_COND(i != p_NodePtrOnCurrentMdfNode->numOfKeys);
++ }
++}
++
++static void UpdateAdPtrOfTreesWhichPointsOnCrntMdfNode(t_FmPcdCcNode *p_CrntMdfNode,
++ t_List *h_OldLst,
++ t_FmPcdCcNextEngineParams **p_NextEngineParams)
++{
++ t_CcNodeInformation *p_CcNodeInformation;
++ t_FmPcdCcTree *p_TreePtrOnCurrentMdfNode = NULL;
++ t_List *p_Pos;
++ int i = 0;
++ t_Handle p_AdTableTmp;
++ t_CcNodeInformation ccNodeInfo;
++
++ LIST_FOR_EACH(p_Pos, &p_CrntMdfNode->ccTreeIdLst)
++ {
++ p_CcNodeInformation = CC_NODE_F_OBJECT(p_Pos);
++ p_TreePtrOnCurrentMdfNode = (t_FmPcdCcTree *)p_CcNodeInformation->h_CcNode;
++
++ ASSERT_COND(p_TreePtrOnCurrentMdfNode);
++
++ /*search in the trees which exact index points on this current modified node for getting AD */
++ for (i = 0; i < p_TreePtrOnCurrentMdfNode->numOfEntries; i++)
++ {
++ if (p_TreePtrOnCurrentMdfNode->keyAndNextEngineParams[i].nextEngineParams.nextEngine == e_FM_PCD_CC)
++ {
++ if (p_TreePtrOnCurrentMdfNode->keyAndNextEngineParams[i].nextEngineParams.params.ccParams.h_CcNode == (t_Handle)p_CrntMdfNode)
++ {
++ p_AdTableTmp = UINT_TO_PTR(p_TreePtrOnCurrentMdfNode->ccTreeBaseAddr + i*FM_PCD_CC_AD_ENTRY_SIZE);
++ memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
++ ccNodeInfo.h_CcNode = p_AdTableTmp;
++ EnqueueNodeInfoToRelevantLst(h_OldLst, &ccNodeInfo, NULL);
++
++ if (!(*p_NextEngineParams))
++ *p_NextEngineParams = &p_TreePtrOnCurrentMdfNode->keyAndNextEngineParams[i].nextEngineParams;
++ }
++ }
++ }
++
++ ASSERT_COND(i == p_TreePtrOnCurrentMdfNode->numOfEntries);
++ }
++}
++
++static t_FmPcdModifyCcKeyAdditionalParams* ModifyKeyCommonPart1(t_Handle h_FmPcdCcNodeOrTree,
++ uint16_t keyIndex,
++ e_ModifyState modifyState,
++ bool ttlCheck,
++ bool hashCheck,
++ bool tree)
++{
++ t_FmPcdModifyCcKeyAdditionalParams *p_FmPcdModifyCcKeyAdditionalParams;
++ int i = 0, j = 0;
++ bool wasUpdate = FALSE;
++ t_FmPcdCcNode *p_CcNode = NULL;
++ t_FmPcdCcTree *p_FmPcdCcTree;
++ uint16_t numOfKeys;
++ t_FmPcdCcKeyAndNextEngineParams *p_KeyAndNextEngineParams;
++
++ SANITY_CHECK_RETURN_VALUE(h_FmPcdCcNodeOrTree, E_INVALID_HANDLE, NULL);
++
++ p_KeyAndNextEngineParams = (t_FmPcdCcKeyAndNextEngineParams *)XX_Malloc(sizeof(t_FmPcdCcKeyAndNextEngineParams)*CC_MAX_NUM_OF_KEYS);
++ if (!p_KeyAndNextEngineParams)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("Next engine and required action structure"));
++ return NULL;
++ }
++ memset(p_KeyAndNextEngineParams, 0, sizeof(t_FmPcdCcKeyAndNextEngineParams)*CC_MAX_NUM_OF_KEYS);
++
++ if (!tree)
++ {
++ p_CcNode = (t_FmPcdCcNode *)h_FmPcdCcNodeOrTree;
++ numOfKeys = p_CcNode->numOfKeys;
++
++ /* node has to be pointed by another node or tree */
++ if (!LIST_NumOfObjs(&p_CcNode->ccPrevNodesLst) &&
++ !LIST_NumOfObjs(&p_CcNode->ccTreeIdLst))
++ {
++ XX_Free(p_KeyAndNextEngineParams);
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("node has to be pointed by node or tree"));
++ return NULL;
++ }
++
++ if (!LIST_NumOfObjs(&p_CcNode->ccTreesLst) ||
++ (LIST_NumOfObjs(&p_CcNode->ccTreesLst) != 1))
++ {
++ XX_Free(p_KeyAndNextEngineParams);
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("node has to be belonging to some tree and only to one tree"));
++ return NULL;
++ }
++
++ memcpy(p_KeyAndNextEngineParams,
++ p_CcNode->keyAndNextEngineParams,
++ CC_MAX_NUM_OF_KEYS * sizeof(t_FmPcdCcKeyAndNextEngineParams));
++
++ if (ttlCheck)
++ {
++ if ((p_CcNode->parseCode == CC_PC_FF_IPV4TTL) ||
++ (p_CcNode->parseCode == CC_PC_FF_IPV6HOP_LIMIT))
++ {
++ XX_Free(p_KeyAndNextEngineParams);
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("nodeId of CC_PC_FF_IPV4TTL or CC_PC_FF_IPV6HOP_LIMIT can not be used for this operation"));
++ return NULL;
++ }
++ }
++
++ if (hashCheck)
++ {
++ if (p_CcNode->parseCode == CC_PC_GENERIC_IC_HASH_INDEXED)
++ {
++ XX_Free(p_KeyAndNextEngineParams);
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("nodeId of CC_PC_GENERIC_IC_HASH_INDEXED can not be used for this operation"));
++ return NULL;
++ }
++ }
++ }
++ else
++ {
++ p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmPcdCcNodeOrTree;
++ numOfKeys = p_FmPcdCcTree->numOfEntries;
++ memcpy(p_KeyAndNextEngineParams,
++ p_FmPcdCcTree->keyAndNextEngineParams,
++ FM_PCD_MAX_NUM_OF_CC_GROUPS * sizeof(t_FmPcdCcKeyAndNextEngineParams));
++ }
++
++ p_FmPcdModifyCcKeyAdditionalParams =
++ (t_FmPcdModifyCcKeyAdditionalParams *)XX_Malloc(sizeof(t_FmPcdModifyCcKeyAdditionalParams));
++ if (!p_FmPcdModifyCcKeyAdditionalParams)
++ {
++ XX_Free(p_KeyAndNextEngineParams);
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("Allocation of internal data structure FAILED"));
++ return NULL;
++ }
++ memset(p_FmPcdModifyCcKeyAdditionalParams, 0, sizeof(t_FmPcdModifyCcKeyAdditionalParams));
++
++ p_FmPcdModifyCcKeyAdditionalParams->h_CurrentNode = h_FmPcdCcNodeOrTree;
++ p_FmPcdModifyCcKeyAdditionalParams->savedKeyIndex = keyIndex;
++
++ while (i < numOfKeys)
++ {
++ if ((j == keyIndex) && !wasUpdate)
++ {
++ if (modifyState == e_MODIFY_STATE_ADD)
++ j++;
++ else if (modifyState == e_MODIFY_STATE_REMOVE)
++ i++;
++ wasUpdate = TRUE;
++ }
++ else
++ {
++ memcpy(&p_FmPcdModifyCcKeyAdditionalParams->keyAndNextEngineParams[j],
++ p_KeyAndNextEngineParams + i,
++ sizeof(t_FmPcdCcKeyAndNextEngineParams));
++ i++;
++ j++;
++ }
++ }
++
++ if (keyIndex == numOfKeys)
++ {
++ if (modifyState == e_MODIFY_STATE_ADD)
++ j++;
++ else if (modifyState == e_MODIFY_STATE_REMOVE)
++ i++;
++ }
++
++ memcpy(&p_FmPcdModifyCcKeyAdditionalParams->keyAndNextEngineParams[j],
++ p_KeyAndNextEngineParams + numOfKeys,
++ sizeof(t_FmPcdCcKeyAndNextEngineParams));
++
++ XX_Free(p_KeyAndNextEngineParams);
++
++ return p_FmPcdModifyCcKeyAdditionalParams;
++}
++
++static t_Error UpdatePtrWhichPointOnCrntMdfNode(t_FmPcdCcNode *p_CcNode,
++ t_FmPcdModifyCcKeyAdditionalParams *p_FmPcdModifyCcKeyAdditionalParams,
++ t_List *h_OldLst,
++ t_List *h_NewLst)
++{
++ t_FmPcdCcNextEngineParams *p_NextEngineParams = NULL;
++ t_CcNodeInformation ccNodeInfo = {0};
++ t_Handle h_NewAd;
++
++ /* Building a list of all action descriptors that point to the previous node */
++ if (!LIST_IsEmpty(&p_CcNode->ccPrevNodesLst))
++ UpdateAdPtrOfNodesWhichPointsOnCrntMdfNode(p_CcNode, h_OldLst, &p_NextEngineParams);
++
++ if (!LIST_IsEmpty(&p_CcNode->ccTreeIdLst))
++ UpdateAdPtrOfTreesWhichPointsOnCrntMdfNode(p_CcNode, h_OldLst, &p_NextEngineParams);
++
++ /* This node must be found as next engine of one of its previous nodes or trees*/
++ ASSERT_COND(p_NextEngineParams);
++
++ /* Building a new action descriptor that points to the modified node */
++ h_NewAd = GetNewAd(p_CcNode, FALSE);
++ if (!h_NewAd)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, NO_MSG);
++ IOMemSet32(h_NewAd, 0, FM_PCD_CC_AD_ENTRY_SIZE);
++
++ BuildNewAd(h_NewAd,
++ p_FmPcdModifyCcKeyAdditionalParams,
++ p_CcNode,
++ p_NextEngineParams);
++
++ ccNodeInfo.h_CcNode = h_NewAd;
++ EnqueueNodeInfoToRelevantLst(h_NewLst, &ccNodeInfo, NULL);
++
++ return E_OK;
++}
++
++static void UpdateCcRootOwner(t_FmPcdCcTree *p_FmPcdCcTree, bool add)
++{
++ ASSERT_COND(p_FmPcdCcTree);
++
++ /* this routine must be protected by the calling routine! */
++
++ if (add)
++ p_FmPcdCcTree->owners++;
++ else
++ {
++ ASSERT_COND(p_FmPcdCcTree->owners);
++ p_FmPcdCcTree->owners--;
++ }
++}
++
++static t_Error CheckAndSetManipParamsWithCcNodeParams(t_FmPcdCcNode *p_CcNode)
++{
++ t_Error err = E_OK;
++ int i = 0;
++
++ for (i = 0; i < p_CcNode->numOfKeys; i++)
++ {
++ if (p_CcNode->keyAndNextEngineParams[i].nextEngineParams.h_Manip)
++ {
++ err = FmPcdManipCheckParamsWithCcNodeParams(p_CcNode->keyAndNextEngineParams[i].nextEngineParams.h_Manip,
++ (t_Handle)p_CcNode);
++ if (err)
++ return err;
++ }
++ }
++
++ return err;
++}
++static t_Error ValidateAndCalcStatsParams(t_FmPcdCcNode *p_CcNode,
++ t_FmPcdCcNodeParams *p_CcNodeParam,
++ uint32_t *p_NumOfRanges,
++ uint32_t *p_CountersArraySize)
++{
++ e_FmPcdCcStatsMode statisticsMode = p_CcNode->statisticsMode;
++
++ UNUSED(p_CcNodeParam);
++
++ switch (statisticsMode)
++ {
++ case e_FM_PCD_CC_STATS_MODE_NONE:
++ return E_OK;
++
++ case e_FM_PCD_CC_STATS_MODE_FRAME:
++ case e_FM_PCD_CC_STATS_MODE_BYTE_AND_FRAME:
++ *p_NumOfRanges = 1;
++ *p_CountersArraySize = 2 * FM_PCD_CC_STATS_COUNTER_SIZE;
++ return E_OK;
++
++#if (DPAA_VERSION >= 11)
++ case e_FM_PCD_CC_STATS_MODE_RMON:
++ {
++ uint16_t *p_FrameLengthRanges = p_CcNodeParam->keysParams.frameLengthRanges;
++ uint32_t i;
++
++ if (p_FrameLengthRanges[0] <= 0)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Statistics mode"));
++
++ if (p_FrameLengthRanges[0] == 0xFFFF)
++ {
++ *p_NumOfRanges = 1;
++ *p_CountersArraySize = 2 * FM_PCD_CC_STATS_COUNTER_SIZE;
++ return E_OK;
++ }
++
++ for (i = 1; i < FM_PCD_CC_STATS_MAX_NUM_OF_FLR; i++)
++ {
++ if (p_FrameLengthRanges[i-1] >= p_FrameLengthRanges[i])
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE,
++ ("Frame length range must be larger at least by 1 from preceding range"));
++
++ /* Stop when last range is reached */
++ if (p_FrameLengthRanges[i] == 0xFFFF)
++ break;
++ }
++
++ if ((i >= FM_PCD_CC_STATS_MAX_NUM_OF_FLR) ||
++ (p_FrameLengthRanges[i] != 0xFFFF))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Last Frame length range must be 0xFFFF"));
++
++ *p_NumOfRanges = i+1;
++
++ /* Allocate an extra counter for byte count, as counters
++ array always begins with byte count */
++ *p_CountersArraySize = (*p_NumOfRanges + 1) * FM_PCD_CC_STATS_COUNTER_SIZE;
++
++ }
++ return E_OK;
++#endif /* (DPAA_VERSION >= 11) */
++
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Statistics mode"));
++ }
++}
++
++static t_Error CheckParams(t_Handle h_FmPcd,
++ t_FmPcdCcNodeParams *p_CcNodeParam,
++ t_FmPcdCcNode *p_CcNode,
++ bool *isKeyTblAlloc)
++{
++ int tmp = 0;
++ t_FmPcdCcKeyParams *p_KeyParams;
++ t_Error err;
++ uint32_t requiredAction = 0;
++
++ /* Validate statistics parameters */
++ err = ValidateAndCalcStatsParams(p_CcNode,
++ p_CcNodeParam,
++ &(p_CcNode->numOfStatsFLRs),
++ &(p_CcNode->countersArraySize));
++ if (err)
++ RETURN_ERROR(MAJOR, err, ("Invalid statistics parameters"));
++
++ /* Validate next engine parameters on Miss */
++ err = ValidateNextEngineParams(h_FmPcd,
++ &p_CcNodeParam->keysParams.ccNextEngineParamsForMiss,
++ p_CcNode->statisticsMode);
++ if (err)
++ RETURN_ERROR(MAJOR, err, ("For this node MissNextEngineParams are not valid"));
++
++ if (p_CcNodeParam->keysParams.ccNextEngineParamsForMiss.h_Manip)
++ {
++ err = FmPcdManipCheckParamsForCcNextEngine(&p_CcNodeParam->keysParams.ccNextEngineParamsForMiss, &requiredAction);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++ }
++
++ memcpy(&p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].nextEngineParams,
++ &p_CcNodeParam->keysParams.ccNextEngineParamsForMiss,
++ sizeof(t_FmPcdCcNextEngineParams));
++
++ p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].requiredAction = requiredAction;
++
++ if ((p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].nextEngineParams.nextEngine == e_FM_PCD_CC)
++ && p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].nextEngineParams.h_Manip)
++ {
++ err = AllocAndFillAdForContLookupManip(p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].nextEngineParams.params.ccParams.h_CcNode);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++ }
++
++ for (tmp = 0; tmp < p_CcNode->numOfKeys; tmp++)
++ {
++ p_KeyParams = &p_CcNodeParam->keysParams.keyParams[tmp];
++
++ if (!p_KeyParams->p_Key)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("p_Key is not initialized"));
++
++ err = ValidateNextEngineParams(h_FmPcd,
++ &p_KeyParams->ccNextEngineParams,
++ p_CcNode->statisticsMode);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++
++ err = UpdateGblMask(p_CcNode,
++ p_CcNodeParam->keysParams.keySize,
++ p_KeyParams->p_Mask);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++
++ if (p_KeyParams->ccNextEngineParams.h_Manip)
++ {
++ err = FmPcdManipCheckParamsForCcNextEngine(&p_KeyParams->ccNextEngineParams, &requiredAction);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++ }
++
++ /* Store 'key' parameters - key, mask (if passed by the user) */
++ memcpy(p_CcNode->keyAndNextEngineParams[tmp].key, p_KeyParams->p_Key, p_CcNodeParam->keysParams.keySize);
++
++ if (p_KeyParams->p_Mask)
++ memcpy(p_CcNode->keyAndNextEngineParams[tmp].mask,
++ p_KeyParams->p_Mask,
++ p_CcNodeParam->keysParams.keySize);
++ else
++ memset((void *)(p_CcNode->keyAndNextEngineParams[tmp].mask),
++ 0xFF,
++ p_CcNodeParam->keysParams.keySize);
++
++ /* Store next engine parameters */
++ memcpy(&p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams,
++ &p_KeyParams->ccNextEngineParams,
++ sizeof(t_FmPcdCcNextEngineParams));
++
++ p_CcNode->keyAndNextEngineParams[tmp].requiredAction = requiredAction;
++
++ if ((p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.nextEngine == e_FM_PCD_CC)
++ && p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.h_Manip)
++ {
++ err = AllocAndFillAdForContLookupManip(p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.params.ccParams.h_CcNode);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++ }
++ }
++
++ if (p_CcNode->maxNumOfKeys)
++ {
++ if (p_CcNode->maxNumOfKeys < p_CcNode->numOfKeys)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Number of keys exceed the provided maximal number of keys"));
++ }
++
++ *isKeyTblAlloc = TRUE;
++
++ return E_OK;
++}
++
++static t_Error Ipv4TtlOrIpv6HopLimitCheckParams(t_Handle h_FmPcd,
++ t_FmPcdCcNodeParams *p_CcNodeParam,
++ t_FmPcdCcNode *p_CcNode,
++ bool *isKeyTblAlloc)
++{
++ int tmp = 0;
++ t_FmPcdCcKeyParams *p_KeyParams;
++ t_Error err;
++ uint8_t key = 0x01;
++ uint32_t requiredAction = 0;
++
++ if (p_CcNode->numOfKeys != 1)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("For node of the type IPV4_TTL or IPV6_HOP_LIMIT the maximal supported 'numOfKeys' is 1"));
++
++ if ((p_CcNodeParam->keysParams.maxNumOfKeys) && (p_CcNodeParam->keysParams.maxNumOfKeys != 1))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("For node of the type IPV4_TTL or IPV6_HOP_LIMIT the maximal supported 'maxNumOfKeys' is 1"));
++
++ /* Validate statistics parameters */
++ err = ValidateAndCalcStatsParams(p_CcNode,
++ p_CcNodeParam,
++ &(p_CcNode->numOfStatsFLRs),
++ &(p_CcNode->countersArraySize));
++ if (err)
++ RETURN_ERROR(MAJOR, err, ("Invalid statistics parameters"));
++
++ err = ValidateNextEngineParams(h_FmPcd,
++ &p_CcNodeParam->keysParams.ccNextEngineParamsForMiss,
++ p_CcNodeParam->keysParams.statisticsMode);
++ if (err)
++ RETURN_ERROR(MAJOR, err, ("For this node MissNextEngineParams are not valid"));
++
++ if (p_CcNodeParam->keysParams.ccNextEngineParamsForMiss.h_Manip)
++ {
++ err = FmPcdManipCheckParamsForCcNextEngine(&p_CcNodeParam->keysParams.ccNextEngineParamsForMiss, &requiredAction);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++ }
++
++ memcpy(&p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].nextEngineParams,
++ &p_CcNodeParam->keysParams.ccNextEngineParamsForMiss,
++ sizeof(t_FmPcdCcNextEngineParams));
++
++ p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].requiredAction = requiredAction;
++
++ if ((p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].nextEngineParams.nextEngine == e_FM_PCD_CC)
++ && p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].nextEngineParams.h_Manip)
++ {
++ err = AllocAndFillAdForContLookupManip(p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].nextEngineParams.params.ccParams.h_CcNode);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++ }
++
++ for (tmp = 0; tmp < p_CcNode->numOfKeys; tmp++)
++ {
++ p_KeyParams = &p_CcNodeParam->keysParams.keyParams[tmp];
++
++ if (p_KeyParams->p_Mask)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("For node of the type IPV4_TTL or IPV6_HOP_LIMIT p_Mask can not be initialized"));
++
++ if (memcmp(p_KeyParams->p_Key, &key, 1) != 0)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("For node of the type IPV4_TTL or IPV6_HOP_LIMIT p_Key has to be 1"));
++
++ err = ValidateNextEngineParams(h_FmPcd,
++ &p_KeyParams->ccNextEngineParams,
++ p_CcNode->statisticsMode);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++
++ if (p_KeyParams->ccNextEngineParams.h_Manip)
++ {
++ err = FmPcdManipCheckParamsForCcNextEngine(&p_KeyParams->ccNextEngineParams, &requiredAction);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++ }
++
++ /* Store 'key' parameters - key (fixed to 0x01), key size of 1 byte and full mask */
++ p_CcNode->keyAndNextEngineParams[tmp].key[0] = key;
++ p_CcNode->keyAndNextEngineParams[tmp].mask[0] = 0xFF;
++
++ /* Store NextEngine parameters */
++ memcpy(&p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams,
++ &p_KeyParams->ccNextEngineParams,
++ sizeof(t_FmPcdCcNextEngineParams));
++
++ if ((p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.nextEngine == e_FM_PCD_CC)
++ && p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.h_Manip)
++ {
++ err = AllocAndFillAdForContLookupManip(p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.params.ccParams.h_CcNode);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++ }
++ p_CcNode->keyAndNextEngineParams[tmp].requiredAction = requiredAction;
++ }
++
++ *isKeyTblAlloc = FALSE;
++
++ return E_OK;
++}
++
++static t_Error IcHashIndexedCheckParams(t_Handle h_FmPcd,
++ t_FmPcdCcNodeParams *p_CcNodeParam,
++ t_FmPcdCcNode *p_CcNode,
++ bool *isKeyTblAlloc)
++{
++ int tmp = 0, countOnes = 0;
++ t_FmPcdCcKeyParams *p_KeyParams;
++ t_Error err;
++ uint16_t glblMask = p_CcNodeParam->extractCcParams.extractNonHdr.icIndxMask;
++ uint16_t countMask = (uint16_t)(glblMask >> 4);
++ uint32_t requiredAction = 0;
++
++ if (glblMask & 0x000f)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("icIndxMask has to be with last nibble 0"));
++
++ while (countMask)
++ {
++ countOnes++;
++ countMask = (uint16_t)(countMask >> 1);
++ }
++
++ if (!POWER_OF_2(p_CcNode->numOfKeys))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("For Node of the type INDEXED numOfKeys has to be powerOfTwo"));
++
++ if (p_CcNode->numOfKeys != ((uint32_t)1 << countOnes))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("For Node of the type IC_HASH_INDEXED numOfKeys has to be powerOfTwo"));
++
++ if (p_CcNodeParam->keysParams.maxNumOfKeys &&
++ (p_CcNodeParam->keysParams.maxNumOfKeys != p_CcNode->numOfKeys))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("For Node of the type INDEXED 'maxNumOfKeys' should be 0 or equal 'numOfKeys'"));
++
++ /* Validate statistics parameters */
++ err = ValidateAndCalcStatsParams(p_CcNode,
++ p_CcNodeParam,
++ &(p_CcNode->numOfStatsFLRs),
++ &(p_CcNode->countersArraySize));
++ if (err)
++ RETURN_ERROR(MAJOR, err, ("Invalid statistics parameters"));
++
++ err = ValidateNextEngineParams(h_FmPcd,
++ &p_CcNodeParam->keysParams.ccNextEngineParamsForMiss,
++ p_CcNode->statisticsMode);
++ if (GET_ERROR_TYPE(err)!= E_NOT_SUPPORTED)
++ RETURN_ERROR(MAJOR, err, ("MissNextEngineParams for the node of the type IC_INDEX_HASH has to be UnInitialized"));
++
++ for (tmp = 0; tmp < p_CcNode->numOfKeys; tmp++)
++ {
++ p_KeyParams = &p_CcNodeParam->keysParams.keyParams[tmp];
++
++ if (p_KeyParams->p_Mask || p_KeyParams->p_Key)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("For Node of the type IC_HASH_INDEXED p_Key or p_Mask has to be NULL"));
++
++ if ((glblMask & (tmp * 16)) == (tmp * 16))
++ {
++ err = ValidateNextEngineParams(h_FmPcd,
++ &p_KeyParams->ccNextEngineParams,
++ p_CcNode->statisticsMode);
++ if (err)
++ RETURN_ERROR(MAJOR, err, ("This index has to be initialized for the node of the type IC_INDEX_HASH according to settings of GlobalMask "));
++
++ if (p_KeyParams->ccNextEngineParams.h_Manip)
++ {
++ err = FmPcdManipCheckParamsForCcNextEngine(&p_KeyParams->ccNextEngineParams, &requiredAction);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++ p_CcNode->keyAndNextEngineParams[tmp].requiredAction = requiredAction;
++ }
++
++ memcpy(&p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams,
++ &p_KeyParams->ccNextEngineParams,
++ sizeof(t_FmPcdCcNextEngineParams));
++
++ if ((p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.nextEngine == e_FM_PCD_CC)
++ && p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.h_Manip)
++ {
++ err = AllocAndFillAdForContLookupManip(p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.params.ccParams.h_CcNode);
++ if (err)
++ RETURN_ERROR(MAJOR, err, (NO_MSG));
++ }
++ }
++ else
++ {
++ err = ValidateNextEngineParams(h_FmPcd,
++ &p_KeyParams->ccNextEngineParams,
++ p_CcNode->statisticsMode);
++ if (GET_ERROR_TYPE(err)!= E_NOT_SUPPORTED)
++ RETURN_ERROR(MAJOR, err, ("This index has to be UnInitialized for the node of the type IC_INDEX_HASH according to settings of GlobalMask"));
++ }
++ }
++
++ *isKeyTblAlloc = FALSE;
++ memcpy(PTR_MOVE(p_CcNode->p_GlblMask, 2), &glblMask, 2);
++
++ return E_OK;
++}
++
++static t_Error ModifyNextEngineParamNode(t_Handle h_FmPcd,
++ t_Handle h_FmPcdCcNode,
++ uint16_t keyIndex,
++ t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
++{
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_FmPcdCcNode;
++ t_FmPcd *p_FmPcd;
++ t_List h_OldPointersLst, h_NewPointersLst;
++ t_FmPcdModifyCcKeyAdditionalParams *p_ModifyKeyParams;
++ t_Error err = E_OK;
++
++ SANITY_CHECK_RETURN_ERROR(h_FmPcd,E_INVALID_VALUE);
++ SANITY_CHECK_RETURN_ERROR(p_CcNode,E_INVALID_HANDLE);
++
++ if (keyIndex >= p_CcNode->numOfKeys)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("keyIndex > previously cleared last index + 1"));
++
++ p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
++
++ INIT_LIST(&h_OldPointersLst);
++ INIT_LIST(&h_NewPointersLst);
++
++ p_ModifyKeyParams = ModifyKeyCommonPart1(p_CcNode, keyIndex, e_MODIFY_STATE_CHANGE, FALSE, FALSE, FALSE);
++ if (!p_ModifyKeyParams)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
++
++ if (p_CcNode->maxNumOfKeys)
++ {
++ if (!TRY_LOCK(p_FmPcd->h_ShadowSpinlock, &p_FmPcd->shadowLock))
++ {
++ XX_Free(p_ModifyKeyParams);
++ return ERROR_CODE(E_BUSY);
++ }
++ }
++
++ err = BuildNewNodeModifyNextEngine(h_FmPcd,
++ p_CcNode,
++ keyIndex,
++ p_FmPcdCcNextEngineParams,
++ &h_OldPointersLst,
++ &h_NewPointersLst,
++ p_ModifyKeyParams);
++ if (err)
++ {
++ XX_Free(p_ModifyKeyParams);
++ if (p_CcNode->maxNumOfKeys)
++ RELEASE_LOCK(p_FmPcd->shadowLock);
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ err = DoDynamicChange(p_FmPcd, &h_OldPointersLst, &h_NewPointersLst, p_ModifyKeyParams, FALSE);
++
++ if (p_CcNode->maxNumOfKeys)
++ RELEASE_LOCK(p_FmPcd->shadowLock);
++
++ return err;
++}
++
++static t_Error FindKeyIndex(t_Handle h_CcNode,
++ uint8_t keySize,
++ uint8_t *p_Key,
++ uint8_t *p_Mask,
++ uint16_t *p_KeyIndex)
++{
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
++ uint8_t tmpMask[FM_PCD_MAX_SIZE_OF_KEY];
++ uint16_t i;
++
++ ASSERT_COND(p_Key);
++ ASSERT_COND(p_KeyIndex);
++ ASSERT_COND(keySize < FM_PCD_MAX_SIZE_OF_KEY);
++
++ if (keySize != p_CcNode->userSizeOfExtraction)
++ RETURN_ERROR(MINOR, E_INVALID_VALUE, ("Key size doesn't match the extraction size of the node"));
++
++ /* If user didn't pass a mask for this key, we'll look for full extraction mask */
++ if (!p_Mask)
++ memset(tmpMask, 0xFF, keySize);
++
++ for (i = 0 ; i < p_CcNode->numOfKeys; i++)
++ {
++ /* Comparing received key */
++ if (memcmp(p_Key, p_CcNode->keyAndNextEngineParams[i].key, keySize) == 0)
++ {
++ if (p_Mask)
++ {
++ /* If a user passed a mask for this key, it must match to the existing key's mask for a correct match */
++ if (memcmp(p_Mask, p_CcNode->keyAndNextEngineParams[i].mask, keySize) == 0)
++ {
++ *p_KeyIndex = i;
++ return E_OK;
++ }
++ }
++ else
++ {
++ /* If user didn't pass a mask for this key, check if the existing key mask is full extraction */
++ if (memcmp(tmpMask, p_CcNode->keyAndNextEngineParams[i].mask, keySize) == 0)
++ {
++ *p_KeyIndex = i;
++ return E_OK;
++ }
++ }
++ }
++ }
++
++ return ERROR_CODE(E_NOT_FOUND);
++}
++
++static t_Error CalcAndUpdateCcShadow(t_FmPcdCcNode *p_CcNode,
++ bool isKeyTblAlloc,
++ uint32_t *p_MatchTableSize,
++ uint32_t *p_AdTableSize)
++{
++ uint32_t shadowSize;
++ t_Error err;
++
++ /* Calculate keys table maximal size - each entry consists of a key and a mask,
++ (if local mask support is requested) */
++ *p_MatchTableSize = p_CcNode->ccKeySizeAccExtraction * sizeof(uint8_t) * p_CcNode->maxNumOfKeys;
++
++ if (p_CcNode->maskSupport)
++ *p_MatchTableSize *= 2;
++
++ /* Calculate next action descriptors table, including one more entry for miss */
++ *p_AdTableSize = (uint32_t)((p_CcNode->maxNumOfKeys + 1) * FM_PCD_CC_AD_ENTRY_SIZE);
++
++ /* Calculate maximal shadow size of this node.
++ All shadow structures will be used for runtime modifications host command. If
++ keys table was allocated for this node, the keys table and next engines table may
++ be modified in run time (entries added or removed), so shadow tables are requires.
++ Otherwise, the only supported runtime modification is a specific next engine update
++ and this requires shadow memory of a single AD */
++
++ /* Shadow size should be enough to hold the following 3 structures:
++ * 1 - an action descriptor */
++ shadowSize = FM_PCD_CC_AD_ENTRY_SIZE;
++
++ /* 2 - keys match table, if was allocated for the current node */
++ if (isKeyTblAlloc)
++ shadowSize += *p_MatchTableSize;
++
++ /* 3 - next action descriptors table */
++ shadowSize += *p_AdTableSize;
++
++ /* Update shadow to the calculated size */
++ err = FmPcdUpdateCcShadow (p_CcNode->h_FmPcd, (uint32_t)shadowSize, FM_PCD_CC_AD_TABLE_ALIGN);
++ if (err != E_OK)
++ {
++ DeleteNode(p_CcNode);
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for CC node shadow"));
++ }
++
++ return E_OK;
++}
++
++static t_Error AllocStatsObjs(t_FmPcdCcNode *p_CcNode)
++{
++ t_FmPcdStatsObj *p_StatsObj;
++ t_Handle h_FmMuram, h_StatsAd, h_StatsCounters;
++ uint32_t i;
++
++ h_FmMuram = FmPcdGetMuramHandle(p_CcNode->h_FmPcd);
++ if (!h_FmMuram)
++ RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("FM MURAM"));
++
++ /* Allocate statistics ADs and statistics counter. An extra pair (AD + counters)
++ will be allocated to support runtime modifications */
++ for (i = 0; i < p_CcNode->maxNumOfKeys + 2; i++)
++ {
++ /* Allocate list object structure */
++ p_StatsObj = XX_Malloc(sizeof(t_FmPcdStatsObj));
++ if (!p_StatsObj)
++ {
++ FreeStatObjects(&p_CcNode->availableStatsLst, h_FmMuram);
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Statistics object"));
++ }
++ memset(p_StatsObj, 0, sizeof(t_FmPcdStatsObj));
++
++ /* Allocate statistics AD from MURAM */
++ h_StatsAd = (t_Handle)FM_MURAM_AllocMem(h_FmMuram,
++ FM_PCD_CC_AD_ENTRY_SIZE,
++ FM_PCD_CC_AD_TABLE_ALIGN);
++ if (!h_StatsAd)
++ {
++ FreeStatObjects(&p_CcNode->availableStatsLst, h_FmMuram);
++ XX_Free(p_StatsObj);
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for statistics ADs"));
++ }
++ IOMemSet32(h_StatsAd, 0, FM_PCD_CC_AD_ENTRY_SIZE);
++
++ /* Allocate statistics counters from MURAM */
++ h_StatsCounters = (t_Handle)FM_MURAM_AllocMem(h_FmMuram,
++ p_CcNode->countersArraySize,
++ FM_PCD_CC_AD_TABLE_ALIGN);
++ if (!h_StatsCounters)
++ {
++ FreeStatObjects(&p_CcNode->availableStatsLst, h_FmMuram);
++ FM_MURAM_FreeMem(h_FmMuram, h_StatsAd);
++ XX_Free(p_StatsObj);
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for statistics counters"));
++ }
++ IOMemSet32(h_StatsCounters, 0, p_CcNode->countersArraySize);
++
++ p_StatsObj->h_StatsAd = h_StatsAd;
++ p_StatsObj->h_StatsCounters = h_StatsCounters;
++
++ EnqueueStatsObj(&p_CcNode->availableStatsLst, p_StatsObj);
++ }
++
++ return E_OK;
++}
++
++static t_Error MatchTableGetKeyStatistics(t_FmPcdCcNode *p_CcNode,
++ uint16_t keyIndex,
++ t_FmPcdCcKeyStatistics *p_KeyStatistics)
++{
++ uint32_t *p_StatsCounters, i;
++
++ if (p_CcNode->statisticsMode == e_FM_PCD_CC_STATS_MODE_NONE)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Statistics were not enabled for this match table"));
++
++ if (keyIndex >= p_CcNode->numOfKeys)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("The provided keyIndex exceeds the number of keys in this match table"));
++
++ if (!p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Statistics were not enabled for this key"));
++
++ memset(p_KeyStatistics, 0, sizeof (t_FmPcdCcKeyStatistics));
++
++ p_StatsCounters = p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj->h_StatsCounters;
++ ASSERT_COND(p_StatsCounters);
++
++ p_KeyStatistics->byteCount = GET_UINT32(*p_StatsCounters);
++
++ for (i = 1; i <= p_CcNode->numOfStatsFLRs; i++)
++ {
++ p_StatsCounters = PTR_MOVE(p_StatsCounters, FM_PCD_CC_STATS_COUNTER_SIZE);
++
++ p_KeyStatistics->frameCount += GET_UINT32(*p_StatsCounters);
++
++#if (DPAA_VERSION >= 11)
++ p_KeyStatistics->frameLengthRangeCount[i-1] = GET_UINT32(*p_StatsCounters);
++#endif /* (DPAA_VERSION >= 11) */
++ }
++
++ return E_OK;
++}
++
++
++/*****************************************************************************/
++/* Inter-module API routines */
++/*****************************************************************************/
++
++t_CcNodeInformation* FindNodeInfoInReleventLst(t_List *p_List, t_Handle h_Info, t_Handle h_Spinlock)
++{
++ t_CcNodeInformation *p_CcInformation;
++ t_List *p_Pos;
++ uint32_t intFlags;
++
++ intFlags = XX_LockIntrSpinlock(h_Spinlock);
++
++ for (p_Pos = LIST_FIRST(p_List); p_Pos != (p_List); p_Pos = LIST_NEXT(p_Pos))
++ {
++ p_CcInformation = CC_NODE_F_OBJECT(p_Pos);
++
++ ASSERT_COND(p_CcInformation->h_CcNode);
++
++ if (p_CcInformation->h_CcNode == h_Info)
++ {
++ XX_UnlockIntrSpinlock(h_Spinlock, intFlags);
++ return p_CcInformation;
++ }
++ }
++
++ XX_UnlockIntrSpinlock(h_Spinlock, intFlags);
++
++ return NULL;
++}
++
++void EnqueueNodeInfoToRelevantLst(t_List *p_List, t_CcNodeInformation *p_CcInfo, t_Handle h_Spinlock)
++{
++ t_CcNodeInformation *p_CcInformation;
++ uint32_t intFlags = 0;
++
++ p_CcInformation = (t_CcNodeInformation *)XX_Malloc(sizeof(t_CcNodeInformation));
++
++ if (p_CcInformation)
++ {
++ memset(p_CcInformation, 0, sizeof(t_CcNodeInformation));
++ memcpy(p_CcInformation, p_CcInfo, sizeof(t_CcNodeInformation));
++ INIT_LIST(&p_CcInformation->node);
++
++ if (h_Spinlock)
++ intFlags = XX_LockIntrSpinlock(h_Spinlock);
++
++ LIST_AddToTail(&p_CcInformation->node, p_List);
++
++ if (h_Spinlock)
++ XX_UnlockIntrSpinlock(h_Spinlock, intFlags);
++ }
++ else
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("CC Node Information"));
++}
++
++void DequeueNodeInfoFromRelevantLst(t_List *p_List, t_Handle h_Info, t_Handle h_Spinlock)
++{
++ t_CcNodeInformation *p_CcInformation = NULL;
++ uint32_t intFlags = 0;
++ t_List *p_Pos;
++
++ if (h_Spinlock)
++ intFlags = XX_LockIntrSpinlock(h_Spinlock);
++
++ if (LIST_IsEmpty(p_List))
++ {
++ XX_RestoreAllIntr(intFlags);
++ return;
++ }
++
++ for (p_Pos = LIST_FIRST(p_List); p_Pos != (p_List); p_Pos = LIST_NEXT(p_Pos))
++ {
++ p_CcInformation = CC_NODE_F_OBJECT(p_Pos);
++ ASSERT_COND(p_CcInformation);
++ ASSERT_COND(p_CcInformation->h_CcNode);
++ if (p_CcInformation->h_CcNode == h_Info)
++ break;
++ }
++
++ if (p_CcInformation)
++ {
++ LIST_DelAndInit(&p_CcInformation->node);
++ XX_Free(p_CcInformation);
++ }
++
++ if (h_Spinlock)
++ XX_UnlockIntrSpinlock(h_Spinlock, intFlags);
++}
++
++void NextStepAd(t_Handle h_Ad,
++ t_FmPcdCcStatsParams *p_FmPcdCcStatsParams,
++ t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams,
++ t_FmPcd *p_FmPcd)
++{
++ switch (p_FmPcdCcNextEngineParams->nextEngine)
++ {
++ case (e_FM_PCD_KG):
++ case (e_FM_PCD_PLCR):
++ case (e_FM_PCD_DONE):
++ /* if NIA is not CC, create a "result" type AD */
++ FillAdOfTypeResult(h_Ad,
++ p_FmPcdCcStatsParams,
++ p_FmPcd,
++ p_FmPcdCcNextEngineParams);
++ break;
++#if (DPAA_VERSION >= 11)
++ case (e_FM_PCD_FR):
++ if (p_FmPcdCcNextEngineParams->params.frParams.h_FrmReplic)
++ {
++ FillAdOfTypeContLookup(h_Ad,
++ p_FmPcdCcStatsParams,
++ p_FmPcd,
++ p_FmPcdCcNextEngineParams->params.ccParams.h_CcNode,
++ p_FmPcdCcNextEngineParams->h_Manip,
++ p_FmPcdCcNextEngineParams->params.frParams.h_FrmReplic);
++ FrmReplicGroupUpdateOwner(p_FmPcdCcNextEngineParams->params.frParams.h_FrmReplic,
++ TRUE/* add */);
++ }
++ break;
++#endif /* (DPAA_VERSION >= 11) */
++
++ case (e_FM_PCD_CC):
++ /* if NIA is not CC, create a TD to continue the CC lookup */
++ FillAdOfTypeContLookup(h_Ad,
++ p_FmPcdCcStatsParams,
++ p_FmPcd,
++ p_FmPcdCcNextEngineParams->params.ccParams.h_CcNode,
++ p_FmPcdCcNextEngineParams->h_Manip,
++ NULL);
++
++ UpdateNodeOwner(p_FmPcdCcNextEngineParams->params.ccParams.h_CcNode, TRUE);
++ break;
++
++ default:
++ return;
++ }
++}
++
++t_Error FmPcdCcTreeAddIPR(t_Handle h_FmPcd,
++ t_Handle h_FmTree,
++ t_Handle h_NetEnv,
++ t_Handle h_IpReassemblyManip,
++ bool createSchemes)
++{
++ t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmTree;
++ t_FmPcdCcNextEngineParams nextEngineParams;
++ t_NetEnvParams netEnvParams;
++ t_Handle h_Ad;
++ bool isIpv6Present;
++ uint8_t ipv4GroupId, ipv6GroupId;
++ t_Error err;
++
++ ASSERT_COND(p_FmPcdCcTree);
++
++ /* this routine must be protected by the calling routine! */
++
++ memset(&nextEngineParams, 0, sizeof(t_FmPcdCcNextEngineParams));
++ memset(&netEnvParams, 0, sizeof(t_NetEnvParams));
++
++ h_Ad = UINT_TO_PTR(p_FmPcdCcTree->ccTreeBaseAddr);
++
++ isIpv6Present = FmPcdManipIpReassmIsIpv6Hdr(h_IpReassemblyManip);
++
++ if (isIpv6Present && (p_FmPcdCcTree->numOfEntries > (FM_PCD_MAX_NUM_OF_CC_GROUPS-2)))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("need two free entries for IPR"));
++
++ if (p_FmPcdCcTree->numOfEntries > (FM_PCD_MAX_NUM_OF_CC_GROUPS-1))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("need two free entries for IPR"));
++
++ nextEngineParams.nextEngine = e_FM_PCD_DONE;
++ nextEngineParams.h_Manip = h_IpReassemblyManip;
++
++ /* Lock tree */
++ err = CcRootTryLock(p_FmPcdCcTree);
++ if (err)
++ return ERROR_CODE(E_BUSY);
++
++ if (p_FmPcdCcTree->h_IpReassemblyManip == h_IpReassemblyManip)
++ {
++ CcRootReleaseLock(p_FmPcdCcTree);
++ return E_OK;
++ }
++
++ if ((p_FmPcdCcTree->h_IpReassemblyManip) &&
++ (p_FmPcdCcTree->h_IpReassemblyManip != h_IpReassemblyManip))
++ {
++ CcRootReleaseLock(p_FmPcdCcTree);
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("This tree was previously updated with different IPR"));
++ }
++
++ /* Initialize IPR for the first time for this tree */
++ if (isIpv6Present)
++ {
++ ipv6GroupId = p_FmPcdCcTree->numOfGrps++;
++ p_FmPcdCcTree->fmPcdGroupParam[ipv6GroupId].baseGroupEntry = (FM_PCD_MAX_NUM_OF_CC_GROUPS-2);
++
++ if (createSchemes)
++ {
++ err = FmPcdManipBuildIpReassmScheme(h_FmPcd, h_NetEnv, p_FmPcdCcTree, h_IpReassemblyManip, FALSE, ipv6GroupId);
++ if (err)
++ {
++ p_FmPcdCcTree->numOfGrps--;
++ CcRootReleaseLock(p_FmPcdCcTree);
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++ }
++
++ NextStepAd(PTR_MOVE(h_Ad, (FM_PCD_MAX_NUM_OF_CC_GROUPS-2) * FM_PCD_CC_AD_ENTRY_SIZE),
++ NULL,
++ &nextEngineParams,
++ h_FmPcd);
++ }
++
++ ipv4GroupId = p_FmPcdCcTree->numOfGrps++;
++ p_FmPcdCcTree->fmPcdGroupParam[ipv4GroupId].totalBitsMask = 0;
++ p_FmPcdCcTree->fmPcdGroupParam[ipv4GroupId].baseGroupEntry = (FM_PCD_MAX_NUM_OF_CC_GROUPS-1);
++
++ if (createSchemes)
++ {
++ err = FmPcdManipBuildIpReassmScheme(h_FmPcd, h_NetEnv, p_FmPcdCcTree, h_IpReassemblyManip, TRUE, ipv4GroupId);
++ if (err)
++ {
++ p_FmPcdCcTree->numOfGrps--;
++ if (isIpv6Present)
++ {
++ p_FmPcdCcTree->numOfGrps--;
++ FmPcdManipDeleteIpReassmSchemes(h_IpReassemblyManip);
++ }
++ CcRootReleaseLock(p_FmPcdCcTree);
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++ }
++
++ NextStepAd(PTR_MOVE(h_Ad, (FM_PCD_MAX_NUM_OF_CC_GROUPS-1) * FM_PCD_CC_AD_ENTRY_SIZE),
++ NULL,
++ &nextEngineParams,
++ h_FmPcd);
++
++ p_FmPcdCcTree->h_IpReassemblyManip = h_IpReassemblyManip;
++
++ CcRootReleaseLock(p_FmPcdCcTree);
++
++ return E_OK;
++}
++
++
++t_Handle FmPcdCcTreeGetSavedManipParams(t_Handle h_FmTree)
++{
++ t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmTree;
++
++ ASSERT_COND(p_FmPcdCcTree);
++
++ return p_FmPcdCcTree->h_FmPcdCcSavedManipParams;
++}
++
++void FmPcdCcTreeSetSavedManipParams(t_Handle h_FmTree, t_Handle h_SavedManipParams)
++{
++ t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmTree;
++
++ ASSERT_COND(p_FmPcdCcTree);
++
++ p_FmPcdCcTree->h_FmPcdCcSavedManipParams = h_SavedManipParams;
++}
++
++uint8_t FmPcdCcGetParseCode(t_Handle h_CcNode)
++{
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
++
++ ASSERT_COND(p_CcNode);
++
++ return p_CcNode->parseCode;
++}
++
++uint8_t FmPcdCcGetOffset(t_Handle h_CcNode)
++{
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
++
++ ASSERT_COND(p_CcNode);
++
++ return p_CcNode->offset;
++}
++
++uint16_t FmPcdCcGetNumOfKeys(t_Handle h_CcNode)
++{
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
++
++ ASSERT_COND(p_CcNode);
++
++ return p_CcNode->numOfKeys;
++}
++
++t_Error FmPcdCcModifyNextEngineParamTree(t_Handle h_FmPcd,
++ t_Handle h_FmPcdCcTree,
++ uint8_t grpId,
++ uint8_t index,
++ t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
++{
++ t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmPcdCcTree;
++ t_FmPcd *p_FmPcd;
++ t_List h_OldPointersLst, h_NewPointersLst;
++ uint16_t keyIndex;
++ t_FmPcdModifyCcKeyAdditionalParams *p_ModifyKeyParams;
++ t_Error err = E_OK;
++
++ SANITY_CHECK_RETURN_ERROR(h_FmPcd,E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(h_FmPcdCcTree,E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR((grpId <= 7),E_INVALID_VALUE);
++
++ if (grpId >= p_FmPcdCcTree->numOfGrps)
++ RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("grpId you asked > numOfGroup of relevant tree"));
++
++ if (index >= p_FmPcdCcTree->fmPcdGroupParam[grpId].numOfEntriesInGroup)
++ RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("index > numOfEntriesInGroup"));
++
++ p_FmPcd = (t_FmPcd *)h_FmPcd;
++
++ INIT_LIST(&h_OldPointersLst);
++ INIT_LIST(&h_NewPointersLst);
++
++ keyIndex = (uint16_t)(p_FmPcdCcTree->fmPcdGroupParam[grpId].baseGroupEntry + index);
++
++ p_ModifyKeyParams = ModifyKeyCommonPart1(p_FmPcdCcTree, keyIndex, e_MODIFY_STATE_CHANGE, FALSE, FALSE, TRUE);
++ if (!p_ModifyKeyParams)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
++
++ p_ModifyKeyParams->tree = TRUE;
++
++ if (p_FmPcd->p_CcShadow)
++ if (!TRY_LOCK(p_FmPcd->h_ShadowSpinlock, &p_FmPcd->shadowLock))
++ {
++ XX_Free(p_ModifyKeyParams);
++ return ERROR_CODE(E_BUSY);
++ }
++
++ err = BuildNewNodeModifyNextEngine(p_FmPcd,
++ p_FmPcdCcTree,
++ keyIndex,
++ p_FmPcdCcNextEngineParams,
++ &h_OldPointersLst,
++ &h_NewPointersLst,
++ p_ModifyKeyParams);
++ if (err)
++ {
++ XX_Free(p_ModifyKeyParams);
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ err = DoDynamicChange(p_FmPcd, &h_OldPointersLst, &h_NewPointersLst, p_ModifyKeyParams, FALSE);
++
++ if (p_FmPcd->p_CcShadow)
++ RELEASE_LOCK(p_FmPcd->shadowLock);
++
++ return err;
++
++}
++
++t_Error FmPcdCcRemoveKey(t_Handle h_FmPcd,
++ t_Handle h_FmPcdCcNode,
++ uint16_t keyIndex)
++{
++
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *) h_FmPcdCcNode;
++ t_FmPcd *p_FmPcd;
++ t_FmPcdModifyCcKeyAdditionalParams *p_ModifyKeyParams;
++ t_List h_OldPointersLst, h_NewPointersLst;
++ bool useShadowStructs = FALSE;
++ t_Error err = E_OK;
++
++ if (keyIndex >= p_CcNode->numOfKeys)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("impossible to remove key when numOfKeys <= keyIndex"));
++
++ if (!p_CcNode->numOfKeys)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("keyIndex you asked > numOfKeys of relevant node that was initialized"));
++
++ if (p_CcNode->h_FmPcd != h_FmPcd)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("handler to FmPcd is different from the handle provided at node initialization time"));
++
++ p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
++
++ INIT_LIST(&h_OldPointersLst);
++ INIT_LIST(&h_NewPointersLst);
++
++ p_ModifyKeyParams = ModifyKeyCommonPart1(p_CcNode, keyIndex, e_MODIFY_STATE_REMOVE, TRUE, TRUE, FALSE);
++ if (!p_ModifyKeyParams)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
++
++ if (p_CcNode->maxNumOfKeys)
++ {
++ if (!TRY_LOCK(p_FmPcd->h_ShadowSpinlock, &p_FmPcd->shadowLock))
++ {
++ XX_Free(p_ModifyKeyParams);
++ return ERROR_CODE(E_BUSY);
++ }
++
++ useShadowStructs = TRUE;
++ }
++
++ err = BuildNewNodeRemoveKey(p_CcNode, keyIndex, p_ModifyKeyParams);
++ if (err)
++ {
++ XX_Free(p_ModifyKeyParams);
++ if (p_CcNode->maxNumOfKeys)
++ RELEASE_LOCK(p_FmPcd->shadowLock);
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ err = UpdatePtrWhichPointOnCrntMdfNode(p_CcNode,
++ p_ModifyKeyParams,
++ &h_OldPointersLst,
++ &h_NewPointersLst);
++ if (err)
++ {
++ ReleaseNewNodeCommonPart(p_ModifyKeyParams);
++ XX_Free(p_ModifyKeyParams);
++ if (p_CcNode->maxNumOfKeys)
++ RELEASE_LOCK(p_FmPcd->shadowLock);
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ err = DoDynamicChange(p_FmPcd,
++ &h_OldPointersLst,
++ &h_NewPointersLst,
++ p_ModifyKeyParams,
++ useShadowStructs);
++
++ if (p_CcNode->maxNumOfKeys)
++ RELEASE_LOCK(p_FmPcd->shadowLock);
++
++ return err;
++}
++
++t_Error FmPcdCcModifyKey(t_Handle h_FmPcd,
++ t_Handle h_FmPcdCcNode,
++ uint16_t keyIndex,
++ uint8_t keySize,
++ uint8_t *p_Key,
++ uint8_t *p_Mask)
++{
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_FmPcdCcNode;
++ t_FmPcd *p_FmPcd;
++ t_List h_OldPointersLst, h_NewPointersLst;
++ t_FmPcdModifyCcKeyAdditionalParams *p_ModifyKeyParams;
++ uint16_t tmpKeyIndex;
++ bool useShadowStructs = FALSE;
++ t_Error err = E_OK;
++
++ if (keyIndex >= p_CcNode->numOfKeys)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("keyIndex > previously cleared last index + 1"));
++
++ if (keySize != p_CcNode->userSizeOfExtraction)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("size for ModifyKey has to be the same as defined in SetNode"));
++
++ if (p_CcNode->h_FmPcd != h_FmPcd)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("handler to FmPcd is different from the handle provided at node initialization time"));
++
++ err = FindKeyIndex(h_FmPcdCcNode,
++ keySize,
++ p_Key,
++ p_Mask,
++ &tmpKeyIndex);
++ if (GET_ERROR_TYPE(err) != E_NOT_FOUND)
++ RETURN_ERROR(MINOR, E_ALREADY_EXISTS,
++ ("The received key and mask pair was already found in the match table of the provided node"));
++
++ p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
++
++ INIT_LIST(&h_OldPointersLst);
++ INIT_LIST(&h_NewPointersLst);
++
++ p_ModifyKeyParams = ModifyKeyCommonPart1(p_CcNode, keyIndex, e_MODIFY_STATE_CHANGE, TRUE, TRUE, FALSE);
++ if (!p_ModifyKeyParams)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
++
++ if (p_CcNode->maxNumOfKeys)
++ {
++ if (!TRY_LOCK(p_FmPcd->h_ShadowSpinlock, &p_FmPcd->shadowLock))
++ {
++ XX_Free(p_ModifyKeyParams);
++ return ERROR_CODE(E_BUSY);
++ }
++
++ useShadowStructs = TRUE;
++ }
++
++ err = BuildNewNodeModifyKey(p_CcNode,
++ keyIndex,
++ p_Key,
++ p_Mask,
++ p_ModifyKeyParams);
++ if (err)
++ {
++ XX_Free(p_ModifyKeyParams);
++ if (p_CcNode->maxNumOfKeys)
++ RELEASE_LOCK(p_FmPcd->shadowLock);
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ err = UpdatePtrWhichPointOnCrntMdfNode(p_CcNode,
++ p_ModifyKeyParams,
++ &h_OldPointersLst,
++ &h_NewPointersLst);
++ if (err)
++ {
++ ReleaseNewNodeCommonPart(p_ModifyKeyParams);
++ XX_Free(p_ModifyKeyParams);
++ if (p_CcNode->maxNumOfKeys)
++ RELEASE_LOCK(p_FmPcd->shadowLock);
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ err = DoDynamicChange(p_FmPcd,
++ &h_OldPointersLst,
++ &h_NewPointersLst,
++ p_ModifyKeyParams,
++ useShadowStructs);
++
++ if (p_CcNode->maxNumOfKeys)
++ RELEASE_LOCK(p_FmPcd->shadowLock);
++
++ return err;
++}
++
++t_Error FmPcdCcModifyMissNextEngineParamNode(t_Handle h_FmPcd,
++ t_Handle h_FmPcdCcNode,
++ t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
++{
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_FmPcdCcNode;
++ t_FmPcd *p_FmPcd;
++ t_List h_OldPointersLst, h_NewPointersLst;
++ uint16_t keyIndex;
++ t_FmPcdModifyCcKeyAdditionalParams *p_ModifyKeyParams;
++ t_Error err = E_OK;
++
++ SANITY_CHECK_RETURN_ERROR(p_CcNode,E_INVALID_VALUE);
++
++ keyIndex = p_CcNode->numOfKeys;
++
++ p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
++
++ INIT_LIST(&h_OldPointersLst);
++ INIT_LIST(&h_NewPointersLst);
++
++ p_ModifyKeyParams = ModifyKeyCommonPart1(p_CcNode, keyIndex, e_MODIFY_STATE_CHANGE, FALSE, TRUE, FALSE);
++ if (!p_ModifyKeyParams)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
++
++ if (p_CcNode->maxNumOfKeys)
++ {
++ if (!TRY_LOCK(p_FmPcd->h_ShadowSpinlock, &p_FmPcd->shadowLock))
++ {
++ XX_Free(p_ModifyKeyParams);
++ return ERROR_CODE(E_BUSY);
++ }
++ }
++
++ err = BuildNewNodeModifyNextEngine(h_FmPcd,
++ p_CcNode,
++ keyIndex,
++ p_FmPcdCcNextEngineParams,
++ &h_OldPointersLst,
++ &h_NewPointersLst,
++ p_ModifyKeyParams);
++ if (err)
++ {
++ XX_Free(p_ModifyKeyParams);
++ if (p_CcNode->maxNumOfKeys)
++ RELEASE_LOCK(p_FmPcd->shadowLock);
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ err = DoDynamicChange(p_FmPcd, &h_OldPointersLst, &h_NewPointersLst, p_ModifyKeyParams, FALSE);
++
++ if (p_CcNode->maxNumOfKeys)
++ RELEASE_LOCK(p_FmPcd->shadowLock);
++
++ return err;
++}
++
++t_Error FmPcdCcAddKey(t_Handle h_FmPcd,
++ t_Handle h_FmPcdCcNode,
++ uint16_t keyIndex,
++ uint8_t keySize,
++ t_FmPcdCcKeyParams *p_FmPcdCcKeyParams)
++{
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_FmPcdCcNode;
++ t_FmPcd *p_FmPcd;
++ t_FmPcdModifyCcKeyAdditionalParams *p_ModifyKeyParams;
++ t_List h_OldPointersLst, h_NewPointersLst;
++ bool useShadowStructs = FALSE;
++ uint16_t tmpKeyIndex;
++ t_Error err = E_OK;
++
++ if (keyIndex > p_CcNode->numOfKeys)
++ RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, ("keyIndex > previously cleared last index + 1"));
++
++ if (keySize != p_CcNode->userSizeOfExtraction)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("keySize has to be defined as it was defined in initialization step"));
++
++ if (p_CcNode->h_FmPcd != h_FmPcd)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("handler to FmPcd is different from the handle provided at node initialization time"));
++
++ if (p_CcNode->maxNumOfKeys)
++ {
++ if (p_CcNode->numOfKeys == p_CcNode->maxNumOfKeys)
++ RETURN_ERROR(MAJOR, E_FULL, ("number of keys exceeds the maximal number of keys provided at node initialization time"));
++ }
++ else if (p_CcNode->numOfKeys == FM_PCD_MAX_NUM_OF_KEYS)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("number of keys can not be larger than %d", FM_PCD_MAX_NUM_OF_KEYS));
++
++ err = FindKeyIndex(h_FmPcdCcNode,
++ keySize,
++ p_FmPcdCcKeyParams->p_Key,
++ p_FmPcdCcKeyParams->p_Mask,
++ &tmpKeyIndex);
++ if (GET_ERROR_TYPE(err) != E_NOT_FOUND)
++ RETURN_ERROR(MINOR, E_ALREADY_EXISTS,
++ ("The received key and mask pair was already found in the match table of the provided node"));
++
++ p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
++
++ INIT_LIST(&h_OldPointersLst);
++ INIT_LIST(&h_NewPointersLst);
++
++ p_ModifyKeyParams = ModifyKeyCommonPart1(p_CcNode,
++ keyIndex,
++ e_MODIFY_STATE_ADD,
++ TRUE,
++ TRUE,
++ FALSE);
++ if (!p_ModifyKeyParams)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
++
++ if (p_CcNode->maxNumOfKeys)
++ {
++ if (!TRY_LOCK(p_FmPcd->h_ShadowSpinlock, &p_FmPcd->shadowLock))
++ {
++ XX_Free(p_ModifyKeyParams);
++ return ERROR_CODE(E_BUSY);
++ }
++
++ useShadowStructs = TRUE;
++ }
++
++ err = BuildNewNodeAddOrMdfyKeyAndNextEngine (h_FmPcd,
++ p_CcNode,
++ keyIndex,
++ p_FmPcdCcKeyParams,
++ p_ModifyKeyParams,
++ TRUE);
++ if (err)
++ {
++ ReleaseNewNodeCommonPart(p_ModifyKeyParams);
++ XX_Free(p_ModifyKeyParams);
++ if (p_CcNode->maxNumOfKeys)
++ RELEASE_LOCK(p_FmPcd->shadowLock);
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ err = UpdatePtrWhichPointOnCrntMdfNode(p_CcNode,
++ p_ModifyKeyParams,
++ &h_OldPointersLst,
++ &h_NewPointersLst);
++ if (err)
++ {
++ ReleaseNewNodeCommonPart(p_ModifyKeyParams);
++ XX_Free(p_ModifyKeyParams);
++ if (p_CcNode->maxNumOfKeys)
++ RELEASE_LOCK(p_FmPcd->shadowLock);
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ err = DoDynamicChange(p_FmPcd,
++ &h_OldPointersLst,
++ &h_NewPointersLst,
++ p_ModifyKeyParams,
++ useShadowStructs);
++ if (p_CcNode->maxNumOfKeys)
++ RELEASE_LOCK(p_FmPcd->shadowLock);
++
++ return err;
++}
++
++t_Error FmPcdCcModifyKeyAndNextEngine(t_Handle h_FmPcd,
++ t_Handle h_FmPcdCcNode,
++ uint16_t keyIndex,
++ uint8_t keySize,
++ t_FmPcdCcKeyParams *p_FmPcdCcKeyParams)
++{
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_FmPcdCcNode;
++ t_FmPcd *p_FmPcd;
++ t_List h_OldPointersLst, h_NewPointersLst;
++ t_FmPcdModifyCcKeyAdditionalParams *p_ModifyKeyParams;
++ uint16_t tmpKeyIndex;
++ bool useShadowStructs = FALSE;
++ t_Error err = E_OK;
++
++ if (keyIndex > p_CcNode->numOfKeys)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("keyIndex > previously cleared last index + 1"));
++
++ if (keySize != p_CcNode->userSizeOfExtraction)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("keySize has to be defined as it was defined in initialization step"));
++
++ if (p_CcNode->h_FmPcd != h_FmPcd)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("handler to FmPcd is different from the handle provided at node initialization time"));
++
++ err = FindKeyIndex(h_FmPcdCcNode,
++ keySize,
++ p_FmPcdCcKeyParams->p_Key,
++ p_FmPcdCcKeyParams->p_Mask,
++ &tmpKeyIndex);
++ if (GET_ERROR_TYPE(err) != E_NOT_FOUND)
++ RETURN_ERROR(MINOR, E_ALREADY_EXISTS,
++ ("The received key and mask pair was already found in the match table of the provided node"));
++
++ p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
++
++ INIT_LIST(&h_OldPointersLst);
++ INIT_LIST(&h_NewPointersLst);
++
++ p_ModifyKeyParams = ModifyKeyCommonPart1(p_CcNode, keyIndex, e_MODIFY_STATE_CHANGE, TRUE, TRUE, FALSE);
++ if (!p_ModifyKeyParams)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
++
++ if (p_CcNode->maxNumOfKeys)
++ {
++ if (!TRY_LOCK(p_FmPcd->h_ShadowSpinlock, &p_FmPcd->shadowLock))
++ {
++ XX_Free(p_ModifyKeyParams);
++ return ERROR_CODE(E_BUSY);
++ }
++
++ useShadowStructs = TRUE;
++ }
++
++ err = BuildNewNodeAddOrMdfyKeyAndNextEngine (h_FmPcd,
++ p_CcNode,
++ keyIndex,
++ p_FmPcdCcKeyParams,
++ p_ModifyKeyParams,
++ FALSE);
++ if (err)
++ {
++ ReleaseNewNodeCommonPart(p_ModifyKeyParams);
++ XX_Free(p_ModifyKeyParams);
++ if (p_CcNode->maxNumOfKeys)
++ RELEASE_LOCK(p_FmPcd->shadowLock);
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ err = UpdatePtrWhichPointOnCrntMdfNode(p_CcNode,
++ p_ModifyKeyParams,
++ &h_OldPointersLst,
++ &h_NewPointersLst);
++ if (err)
++ {
++ ReleaseNewNodeCommonPart(p_ModifyKeyParams);
++ XX_Free(p_ModifyKeyParams);
++ if (p_CcNode->maxNumOfKeys)
++ RELEASE_LOCK(p_FmPcd->shadowLock);
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ err = DoDynamicChange(p_FmPcd,
++ &h_OldPointersLst,
++ &h_NewPointersLst,
++ p_ModifyKeyParams,
++ useShadowStructs);
++
++ if (p_CcNode->maxNumOfKeys)
++ RELEASE_LOCK(p_FmPcd->shadowLock);
++
++ return err;
++}
++
++uint32_t FmPcdCcGetNodeAddrOffsetFromNodeInfo(t_Handle h_FmPcd, t_Handle h_Pointer)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++ t_CcNodeInformation *p_CcNodeInfo;
++
++ SANITY_CHECK_RETURN_VALUE(h_FmPcd,E_INVALID_HANDLE, (uint32_t)ILLEGAL_BASE);
++
++ p_CcNodeInfo = CC_NODE_F_OBJECT(h_Pointer);
++
++ return (uint32_t)(XX_VirtToPhys(p_CcNodeInfo->h_CcNode) - p_FmPcd->physicalMuramBase);
++}
++
++t_Error FmPcdCcGetGrpParams(t_Handle h_FmPcdCcTree, uint8_t grpId, uint32_t *p_GrpBits, uint8_t *p_GrpBase)
++{
++ t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *) h_FmPcdCcTree;
++
++ SANITY_CHECK_RETURN_ERROR(h_FmPcdCcTree, E_INVALID_HANDLE);
++
++ if (grpId >= p_FmPcdCcTree->numOfGrps)
++ RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("grpId you asked > numOfGroup of relevant tree"));
++
++ *p_GrpBits = p_FmPcdCcTree->fmPcdGroupParam[grpId].totalBitsMask;
++ *p_GrpBase = p_FmPcdCcTree->fmPcdGroupParam[grpId].baseGroupEntry;
++
++ return E_OK;
++}
++
++t_Error FmPcdCcBindTree(t_Handle h_FmPcd,
++ t_Handle h_PcdParams,
++ t_Handle h_FmPcdCcTree,
++ uint32_t *p_Offset,
++ t_Handle h_FmPort)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmPcdCcTree;
++ t_Error err = E_OK;
++
++ SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(h_FmPcdCcTree, E_INVALID_HANDLE);
++
++ /* this routine must be protected by the calling routine by locking all PCD modules! */
++
++ err = CcUpdateParams(h_FmPcd, h_PcdParams, h_FmPort, h_FmPcdCcTree, TRUE);
++
++ if (err == E_OK)
++ UpdateCcRootOwner(p_FmPcdCcTree, TRUE);
++
++ *p_Offset = (uint32_t)(XX_VirtToPhys(UINT_TO_PTR(p_FmPcdCcTree->ccTreeBaseAddr)) -
++ p_FmPcd->physicalMuramBase);
++
++ return err;
++}
++
++t_Error FmPcdCcUnbindTree(t_Handle h_FmPcd, t_Handle h_FmPcdCcTree)
++{
++ t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmPcdCcTree;
++
++ /* this routine must be protected by the calling routine by locking all PCD modules! */
++
++ UNUSED(h_FmPcd);
++
++ SANITY_CHECK_RETURN_ERROR(h_FmPcdCcTree,E_INVALID_HANDLE);
++
++ UpdateCcRootOwner(p_FmPcdCcTree, FALSE);
++
++ return E_OK;
++}
++
++t_Error FmPcdCcNodeTreeTryLock(t_Handle h_FmPcd,t_Handle h_FmPcdCcNode, t_List *p_List)
++{
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_FmPcdCcNode;
++ t_List *p_Pos, *p_Tmp;
++ t_CcNodeInformation *p_CcNodeInfo, nodeInfo;
++ uint32_t intFlags;
++ t_Error err = E_OK;
++
++ intFlags = FmPcdLock(h_FmPcd);
++
++ if (LIST_IsEmpty(&p_CcNode->ccTreesLst))
++ RETURN_ERROR(MAJOR, E_NOT_AVAILABLE, ("asked for more nodes in CC than MAX"));
++
++ LIST_FOR_EACH(p_Pos, &p_CcNode->ccTreesLst)
++ {
++ p_CcNodeInfo = CC_NODE_F_OBJECT(p_Pos);
++ ASSERT_COND(p_CcNodeInfo->h_CcNode);
++
++ err = CcRootTryLock(p_CcNodeInfo->h_CcNode);
++
++ if (err)
++ {
++ LIST_FOR_EACH(p_Tmp, &p_CcNode->ccTreesLst)
++ {
++ if (p_Tmp == p_Pos)
++ break;
++
++ CcRootReleaseLock(p_CcNodeInfo->h_CcNode);
++ }
++ break;
++ }
++
++ memset(&nodeInfo, 0, sizeof(t_CcNodeInformation));
++ nodeInfo.h_CcNode = p_CcNodeInfo->h_CcNode;
++ EnqueueNodeInfoToRelevantLst(p_List, &nodeInfo, NULL);
++ }
++
++ FmPcdUnlock(h_FmPcd, intFlags);
++ CORE_MemoryBarrier();
++
++ return err;
++}
++
++void FmPcdCcNodeTreeReleaseLock(t_Handle h_FmPcd, t_List *p_List)
++{
++ t_List *p_Pos;
++ t_CcNodeInformation *p_CcNodeInfo;
++ t_Handle h_FmPcdCcTree;
++ uint32_t intFlags;
++
++ intFlags = FmPcdLock(h_FmPcd);
++
++ LIST_FOR_EACH(p_Pos, p_List)
++ {
++ p_CcNodeInfo = CC_NODE_F_OBJECT(p_Pos);
++ h_FmPcdCcTree = p_CcNodeInfo->h_CcNode;
++ CcRootReleaseLock(h_FmPcdCcTree);
++ }
++
++ ReleaseLst(p_List);
++
++ FmPcdUnlock(h_FmPcd, intFlags);
++ CORE_MemoryBarrier();
++}
++
++
++t_Error FmPcdUpdateCcShadow (t_FmPcd *p_FmPcd, uint32_t size, uint32_t align)
++{
++ uint32_t intFlags;
++ uint32_t newSize = 0, newAlign = 0;
++ bool allocFail = FALSE;
++
++ ASSERT_COND(p_FmPcd);
++
++ if (!size)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("size must be larger then 0"));
++
++ if (!POWER_OF_2(align))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("alignment must be power of 2"));
++
++ newSize = p_FmPcd->ccShadowSize;
++ newAlign = p_FmPcd->ccShadowAlign;
++
++ /* Check if current shadow is large enough to hold the requested size */
++ if (size > p_FmPcd->ccShadowSize)
++ newSize = size;
++
++ /* Check if current shadow matches the requested alignment */
++ if (align > p_FmPcd->ccShadowAlign)
++ newAlign = align;
++
++ /* If a bigger shadow size or bigger shadow alignment are required,
++ a new shadow will be allocated */
++ if ((newSize != p_FmPcd->ccShadowSize) || (newAlign != p_FmPcd->ccShadowAlign))
++ {
++ intFlags = FmPcdLock(p_FmPcd);
++
++ if (p_FmPcd->p_CcShadow)
++ {
++ FM_MURAM_FreeMem(FmPcdGetMuramHandle(p_FmPcd), p_FmPcd->p_CcShadow);
++ p_FmPcd->ccShadowSize = 0;
++ p_FmPcd->ccShadowAlign = 0;
++ }
++
++ p_FmPcd->p_CcShadow = FM_MURAM_AllocMem(FmPcdGetMuramHandle(p_FmPcd),
++ newSize,
++ newAlign);
++ if (!p_FmPcd->p_CcShadow)
++ {
++ allocFail = TRUE;
++
++ /* If new shadow size allocation failed,
++ re-allocate with previous parameters */
++ p_FmPcd->p_CcShadow = FM_MURAM_AllocMem(FmPcdGetMuramHandle(p_FmPcd),
++ p_FmPcd->ccShadowSize,
++ p_FmPcd->ccShadowAlign);
++ }
++
++ FmPcdUnlock(p_FmPcd, intFlags);
++
++ if (allocFail)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for CC Shadow memory"));
++
++ p_FmPcd->ccShadowSize = newSize;
++ p_FmPcd->ccShadowAlign = newAlign;
++ }
++
++ return E_OK;
++}
++
++#if (DPAA_VERSION >= 11)
++void FmPcdCcGetAdTablesThatPointOnReplicGroup(t_Handle h_Node,
++ t_Handle h_ReplicGroup,
++ t_List *p_AdTables,
++ uint32_t *p_NumOfAdTables)
++{
++ t_FmPcdCcNode *p_CurrentNode = (t_FmPcdCcNode *)h_Node;
++ int i = 0;
++ void * p_AdTable;
++ t_CcNodeInformation ccNodeInfo;
++
++ ASSERT_COND(h_Node);
++ *p_NumOfAdTables = 0;
++
++ /* search in the current node which exact index points on this current replicator group for getting AD */
++ for (i = 0; i < p_CurrentNode->numOfKeys + 1; i++)
++ {
++ if ((p_CurrentNode->keyAndNextEngineParams[i].nextEngineParams.nextEngine == e_FM_PCD_FR) &&
++ ((p_CurrentNode->keyAndNextEngineParams[i].nextEngineParams.params.frParams.h_FrmReplic == (t_Handle)h_ReplicGroup)))
++ {
++ /* save the current ad table in the list */
++ /* this entry uses the input replicator group */
++ p_AdTable = PTR_MOVE(p_CurrentNode->h_AdTable, i*FM_PCD_CC_AD_ENTRY_SIZE);
++ memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
++ ccNodeInfo.h_CcNode = p_AdTable;
++ EnqueueNodeInfoToRelevantLst(p_AdTables, &ccNodeInfo, NULL);
++ (*p_NumOfAdTables)++;
++ }
++ }
++
++ ASSERT_COND(i != p_CurrentNode->numOfKeys);
++}
++#endif /* (DPAA_VERSION >= 11) */
++/*********************** End of inter-module routines ************************/
++
++
++/****************************************/
++/* API Init unit functions */
++/****************************************/
++
++t_Handle FM_PCD_CcRootBuild(t_Handle h_FmPcd, t_FmPcdCcTreeParams *p_PcdGroupsParam)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++ t_Error err = E_OK;
++ int i = 0, j = 0, k = 0;
++ t_FmPcdCcTree *p_FmPcdCcTree;
++ uint8_t numOfEntries;
++ t_Handle p_CcTreeTmp;
++ t_FmPcdCcGrpParams *p_FmPcdCcGroupParams;
++ t_FmPcdCcKeyAndNextEngineParams *p_Params, *p_KeyAndNextEngineParams;
++ t_NetEnvParams netEnvParams;
++ uint8_t lastOne = 0;
++ uint32_t requiredAction = 0;
++ t_FmPcdCcNode *p_FmPcdCcNextNode;
++ t_CcNodeInformation ccNodeInfo, *p_CcInformation;
++
++ SANITY_CHECK_RETURN_VALUE(h_FmPcd,E_INVALID_HANDLE, NULL);
++ SANITY_CHECK_RETURN_VALUE(p_PcdGroupsParam,E_INVALID_HANDLE, NULL);
++
++ if (p_PcdGroupsParam->numOfGrps > FM_PCD_MAX_NUM_OF_CC_GROUPS)
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("numOfGrps should not exceed %d", FM_PCD_MAX_NUM_OF_CC_GROUPS));
++ return NULL;
++ }
++
++ p_FmPcdCcTree = (t_FmPcdCcTree*)XX_Malloc(sizeof(t_FmPcdCcTree));
++ if (!p_FmPcdCcTree)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("PCD tree structure"));
++ return NULL;
++ }
++ memset(p_FmPcdCcTree, 0, sizeof(t_FmPcdCcTree));
++ p_FmPcdCcTree->h_FmPcd = h_FmPcd;
++
++ p_Params = (t_FmPcdCcKeyAndNextEngineParams*)XX_Malloc(FM_PCD_MAX_NUM_OF_CC_GROUPS * sizeof(t_FmPcdCcKeyAndNextEngineParams));
++ memset(p_Params, 0, FM_PCD_MAX_NUM_OF_CC_GROUPS * sizeof(t_FmPcdCcKeyAndNextEngineParams));
++
++ INIT_LIST(&p_FmPcdCcTree->fmPortsLst);
++
++#ifdef FM_CAPWAP_SUPPORT
++ if ((p_PcdGroupsParam->numOfGrps == 1) &&
++ (p_PcdGroupsParam->ccGrpParams[0].numOfDistinctionUnits == 0) &&
++ (p_PcdGroupsParam->ccGrpParams[0].nextEnginePerEntriesInGrp[0].nextEngine == e_FM_PCD_CC) &&
++ p_PcdGroupsParam->ccGrpParams[0].nextEnginePerEntriesInGrp[0].params.ccParams.h_CcNode &&
++ IsCapwapApplSpecific(p_PcdGroupsParam->ccGrpParams[0].nextEnginePerEntriesInGrp[0].params.ccParams.h_CcNode))
++ {
++ p_PcdGroupsParam->ccGrpParams[0].nextEnginePerEntriesInGrp[0].h_Manip = FmPcdManipApplSpecificBuild();
++ if (!p_PcdGroupsParam->ccGrpParams[0].nextEnginePerEntriesInGrp[0].h_Manip)
++ {
++ DeleteTree(p_FmPcdCcTree,p_FmPcd);
++ XX_Free(p_Params);
++ REPORT_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
++ return NULL;
++ }
++ }
++#endif /* FM_CAPWAP_SUPPORT */
++
++ numOfEntries = 0;
++ p_FmPcdCcTree->netEnvId = FmPcdGetNetEnvId(p_PcdGroupsParam->h_NetEnv);
++
++ for (i = 0; i < p_PcdGroupsParam->numOfGrps; i++)
++ {
++ p_FmPcdCcGroupParams = &p_PcdGroupsParam->ccGrpParams[i];
++
++ if (p_FmPcdCcGroupParams->numOfDistinctionUnits > FM_PCD_MAX_NUM_OF_CC_UNITS)
++ {
++ DeleteTree(p_FmPcdCcTree,p_FmPcd);
++ XX_Free(p_Params);
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE,
++ ("numOfDistinctionUnits (group %d) should not exceed %d", i, FM_PCD_MAX_NUM_OF_CC_UNITS));
++ return NULL;
++ }
++
++ p_FmPcdCcTree->fmPcdGroupParam[i].baseGroupEntry = numOfEntries;
++ p_FmPcdCcTree->fmPcdGroupParam[i].numOfEntriesInGroup =(uint8_t)( 0x01 << p_FmPcdCcGroupParams->numOfDistinctionUnits);
++ numOfEntries += p_FmPcdCcTree->fmPcdGroupParam[i].numOfEntriesInGroup;
++ if (numOfEntries > FM_PCD_MAX_NUM_OF_CC_GROUPS)
++ {
++ DeleteTree(p_FmPcdCcTree,p_FmPcd);
++ XX_Free(p_Params);
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("numOfEntries can not be larger than %d", FM_PCD_MAX_NUM_OF_CC_GROUPS));
++ return NULL;
++ }
++
++ if (lastOne)
++ {
++ if (p_FmPcdCcTree->fmPcdGroupParam[i].numOfEntriesInGroup > lastOne)
++ {
++ DeleteTree(p_FmPcdCcTree,p_FmPcd);
++ XX_Free(p_Params);
++ REPORT_ERROR(MAJOR, E_CONFLICT, ("numOfEntries per group must be set in descending order"));
++ return NULL;
++ }
++ }
++
++ lastOne = p_FmPcdCcTree->fmPcdGroupParam[i].numOfEntriesInGroup;
++
++ netEnvParams.netEnvId = p_FmPcdCcTree->netEnvId;
++ netEnvParams.numOfDistinctionUnits = p_FmPcdCcGroupParams->numOfDistinctionUnits;
++
++ memcpy(netEnvParams.unitIds,
++ &p_FmPcdCcGroupParams->unitIds,
++ (sizeof(uint8_t)) * p_FmPcdCcGroupParams->numOfDistinctionUnits);
++
++ err = PcdGetUnitsVector(p_FmPcd, &netEnvParams);
++ if (err)
++ {
++ DeleteTree(p_FmPcdCcTree,p_FmPcd);
++ XX_Free(p_Params);
++ REPORT_ERROR(MAJOR, err, NO_MSG);
++ return NULL;
++ }
++
++ p_FmPcdCcTree->fmPcdGroupParam[i].totalBitsMask = netEnvParams.vector;
++ for (j = 0; j < p_FmPcdCcTree->fmPcdGroupParam[i].numOfEntriesInGroup; j++)
++ {
++ err = ValidateNextEngineParams(h_FmPcd,
++ &p_FmPcdCcGroupParams->nextEnginePerEntriesInGrp[j],
++ e_FM_PCD_CC_STATS_MODE_NONE);
++ if (err)
++ {
++ DeleteTree(p_FmPcdCcTree,p_FmPcd);
++ XX_Free(p_Params);
++ REPORT_ERROR(MAJOR, err, (NO_MSG));
++ return NULL;
++ }
++
++ if (p_FmPcdCcGroupParams->nextEnginePerEntriesInGrp[j].h_Manip)
++ {
++ err = FmPcdManipCheckParamsForCcNextEngine(&p_FmPcdCcGroupParams->nextEnginePerEntriesInGrp[j], &requiredAction);
++ if (err)
++ {
++ DeleteTree(p_FmPcdCcTree,p_FmPcd);
++ XX_Free(p_Params);
++ REPORT_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
++ return NULL;
++ }
++ }
++ p_KeyAndNextEngineParams = p_Params+k;
++
++ memcpy(&p_KeyAndNextEngineParams->nextEngineParams,
++ &p_FmPcdCcGroupParams->nextEnginePerEntriesInGrp[j],
++ sizeof(t_FmPcdCcNextEngineParams));
++
++ if ((p_KeyAndNextEngineParams->nextEngineParams.nextEngine == e_FM_PCD_CC)
++ && p_KeyAndNextEngineParams->nextEngineParams.h_Manip)
++ {
++ err = AllocAndFillAdForContLookupManip(p_KeyAndNextEngineParams->nextEngineParams.params.ccParams.h_CcNode);
++ if (err)
++ {
++ DeleteTree(p_FmPcdCcTree,p_FmPcd);
++ XX_Free(p_Params);
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for CC Tree"));
++ return NULL;
++ }
++ }
++
++ requiredAction |= UPDATE_CC_WITH_TREE;
++ p_KeyAndNextEngineParams->requiredAction = requiredAction;
++
++ k++;
++ }
++ }
++
++ p_FmPcdCcTree->numOfEntries = (uint8_t)k;
++ p_FmPcdCcTree->numOfGrps = p_PcdGroupsParam->numOfGrps;
++
++ p_FmPcdCcTree->ccTreeBaseAddr =
++ PTR_TO_UINT(FM_MURAM_AllocMem(FmPcdGetMuramHandle(h_FmPcd),
++ (uint32_t)( FM_PCD_MAX_NUM_OF_CC_GROUPS * FM_PCD_CC_AD_ENTRY_SIZE),
++ FM_PCD_CC_TREE_ADDR_ALIGN));
++ if (!p_FmPcdCcTree->ccTreeBaseAddr)
++ {
++ DeleteTree(p_FmPcdCcTree,p_FmPcd);
++ XX_Free(p_Params);
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for CC Tree"));
++ return NULL;
++ }
++ IOMemSet32(UINT_TO_PTR(p_FmPcdCcTree->ccTreeBaseAddr), 0, (uint32_t)(FM_PCD_MAX_NUM_OF_CC_GROUPS * FM_PCD_CC_AD_ENTRY_SIZE));
++
++ p_CcTreeTmp = UINT_TO_PTR(p_FmPcdCcTree->ccTreeBaseAddr);
++
++ j = 0;
++ for (i = 0; i < numOfEntries; i++)
++ {
++ p_KeyAndNextEngineParams = p_Params + i;
++
++ NextStepAd(p_CcTreeTmp,
++ NULL,
++ &p_KeyAndNextEngineParams->nextEngineParams,
++ p_FmPcd);
++
++ p_CcTreeTmp = PTR_MOVE(p_CcTreeTmp, FM_PCD_CC_AD_ENTRY_SIZE);
++
++ memcpy(&p_FmPcdCcTree->keyAndNextEngineParams[i],
++ p_KeyAndNextEngineParams,
++ sizeof(t_FmPcdCcKeyAndNextEngineParams));
++
++ if (p_FmPcdCcTree->keyAndNextEngineParams[i].nextEngineParams.nextEngine== e_FM_PCD_CC)
++ {
++ p_FmPcdCcNextNode = (t_FmPcdCcNode*)p_FmPcdCcTree->keyAndNextEngineParams[i].nextEngineParams.params.ccParams.h_CcNode;
++ p_CcInformation = FindNodeInfoInReleventLst(&p_FmPcdCcNextNode->ccTreeIdLst,
++ (t_Handle)p_FmPcdCcTree,
++ p_FmPcdCcNextNode->h_Spinlock);
++
++ if (!p_CcInformation)
++ {
++ memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
++ ccNodeInfo.h_CcNode = (t_Handle)p_FmPcdCcTree;
++ ccNodeInfo.index = 1;
++ EnqueueNodeInfoToRelevantLst(&p_FmPcdCcNextNode->ccTreeIdLst,
++ &ccNodeInfo,
++ p_FmPcdCcNextNode->h_Spinlock);
++ }
++ else
++ p_CcInformation->index++;
++ }
++ }
++
++ FmPcdIncNetEnvOwners(h_FmPcd, p_FmPcdCcTree->netEnvId);
++ p_CcTreeTmp = UINT_TO_PTR(p_FmPcdCcTree->ccTreeBaseAddr);
++
++ if (!FmPcdLockTryLockAll(p_FmPcd))
++ {
++ FM_PCD_CcRootDelete(p_FmPcdCcTree);
++ XX_Free(p_Params);
++ DBG(TRACE, ("FmPcdLockTryLockAll failed"));
++ return NULL;
++ }
++
++ for (i = 0; i < numOfEntries; i++)
++ {
++ if (p_FmPcdCcTree->keyAndNextEngineParams[i].requiredAction)
++ {
++ err = SetRequiredAction(h_FmPcd,
++ p_FmPcdCcTree->keyAndNextEngineParams[i].requiredAction,
++ &p_FmPcdCcTree->keyAndNextEngineParams[i],
++ p_CcTreeTmp,
++ 1,
++ p_FmPcdCcTree);
++ if (err)
++ {
++ FmPcdLockUnlockAll(p_FmPcd);
++ FM_PCD_CcRootDelete(p_FmPcdCcTree);
++ XX_Free(p_Params);
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("No memory"));
++ return NULL;
++ }
++ p_CcTreeTmp = PTR_MOVE(p_CcTreeTmp, FM_PCD_CC_AD_ENTRY_SIZE);
++ }
++ }
++
++ FmPcdLockUnlockAll(p_FmPcd);
++ p_FmPcdCcTree->p_Lock = FmPcdAcquireLock(p_FmPcd);
++ if (!p_FmPcdCcTree->p_Lock)
++ {
++ FM_PCD_CcRootDelete(p_FmPcdCcTree);
++ XX_Free(p_Params);
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM CC lock"));
++ return NULL;
++ }
++
++ XX_Free(p_Params);
++
++ return p_FmPcdCcTree;
++}
++
++t_Error FM_PCD_CcRootDelete(t_Handle h_CcTree)
++{
++ t_FmPcd *p_FmPcd;
++ t_FmPcdCcTree *p_CcTree = (t_FmPcdCcTree *)h_CcTree;
++ int i= 0;
++
++ SANITY_CHECK_RETURN_ERROR(p_CcTree,E_INVALID_STATE);
++ p_FmPcd = (t_FmPcd *)p_CcTree->h_FmPcd;
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++
++ FmPcdDecNetEnvOwners(p_FmPcd, p_CcTree->netEnvId);
++
++ if (p_CcTree->owners)
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, ("the tree with this ID can not be removed because this tree is occupied, first - unbind this tree"));
++
++ /* Delete reassembly schemes if exist */
++ if (p_CcTree->h_IpReassemblyManip)
++ {
++ FmPcdManipDeleteIpReassmSchemes(p_CcTree->h_IpReassemblyManip);
++ FmPcdManipUpdateOwner(p_CcTree->h_IpReassemblyManip, FALSE);
++ }
++
++ for (i = 0; i numOfEntries; i++)
++ {
++ if (p_CcTree->keyAndNextEngineParams[i].nextEngineParams.nextEngine == e_FM_PCD_CC)
++ UpdateNodeOwner(p_CcTree->keyAndNextEngineParams[i].nextEngineParams.params.ccParams.h_CcNode, FALSE);
++
++ if (p_CcTree->keyAndNextEngineParams[i].nextEngineParams.h_Manip)
++ FmPcdManipUpdateOwner(p_CcTree->keyAndNextEngineParams[i].nextEngineParams.h_Manip, FALSE);
++
++#ifdef FM_CAPWAP_SUPPORT
++ if ((p_CcTree->numOfGrps == 1) &&
++ (p_CcTree->fmPcdGroupParam[0].numOfEntriesInGroup == 1) &&
++ (p_CcTree->keyAndNextEngineParams[0].nextEngineParams.nextEngine == e_FM_PCD_CC) &&
++ p_CcTree->keyAndNextEngineParams[0].nextEngineParams.params.ccParams.h_CcNode &&
++ IsCapwapApplSpecific(p_CcTree->keyAndNextEngineParams[0].nextEngineParams.params.ccParams.h_CcNode))
++ {
++ if (FM_PCD_ManipNodeDelete(p_CcTree->keyAndNextEngineParams[0].nextEngineParams.h_Manip) != E_OK)
++ return E_INVALID_STATE;
++ }
++#endif /* FM_CAPWAP_SUPPORT */
++
++#if (DPAA_VERSION >= 11)
++ if ((p_CcTree->keyAndNextEngineParams[i].nextEngineParams.nextEngine == e_FM_PCD_FR) &&
++ (p_CcTree->keyAndNextEngineParams[i].nextEngineParams.params.frParams.h_FrmReplic))
++ FrmReplicGroupUpdateOwner(p_CcTree->keyAndNextEngineParams[i].nextEngineParams.params.frParams.h_FrmReplic,
++ FALSE);
++#endif /* (DPAA_VERSION >= 11) */
++ }
++
++ if (p_CcTree->p_Lock)
++ FmPcdReleaseLock(p_CcTree->h_FmPcd, p_CcTree->p_Lock);
++
++ DeleteTree(p_CcTree, p_FmPcd);
++
++ return E_OK;
++}
++
++t_Error FM_PCD_CcRootModifyNextEngine(t_Handle h_CcTree,
++ uint8_t grpId,
++ uint8_t index,
++ t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
++{
++ t_FmPcd *p_FmPcd;
++ t_FmPcdCcTree *p_CcTree = (t_FmPcdCcTree *)h_CcTree;
++ t_Error err = E_OK;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcdCcNextEngineParams, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_CcTree,E_INVALID_STATE);
++ p_FmPcd = (t_FmPcd *)p_CcTree->h_FmPcd;
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++
++ if (!FmPcdLockTryLockAll(p_FmPcd))
++ {
++ DBG(TRACE, ("FmPcdLockTryLockAll failed"));
++ return ERROR_CODE(E_BUSY);
++ }
++
++ err = FmPcdCcModifyNextEngineParamTree(p_FmPcd,
++ p_CcTree,
++ grpId,
++ index,
++ p_FmPcdCcNextEngineParams);
++ FmPcdLockUnlockAll(p_FmPcd);
++
++ if (err)
++ {
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ return E_OK;
++}
++
++t_Handle FM_PCD_MatchTableSet(t_Handle h_FmPcd, t_FmPcdCcNodeParams *p_CcNodeParam)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *) h_FmPcd;
++ t_FmPcdCcNode *p_CcNode, *p_FmPcdCcNextNode;
++ t_Error err = E_OK;
++ uint32_t tmp, keySize;
++ bool glblMask = FALSE;
++ t_FmPcdCcKeyParams *p_KeyParams;
++ t_Handle h_FmMuram, p_KeysMatchTblTmp, p_AdTableTmp;
++#if (DPAA_VERSION >= 11)
++ t_Handle h_StatsFLRs;
++#endif /* (DPAA_VERSION >= 11) */
++ bool fullField = FALSE;
++ ccPrivateInfo_t icCode = CC_PRIVATE_INFO_NONE;
++ bool isKeyTblAlloc, fromIc = FALSE;
++ uint32_t matchTableSize, adTableSize;
++ t_CcNodeInformation ccNodeInfo, *p_CcInformation;
++ t_FmPcdStatsObj *p_StatsObj;
++ t_FmPcdCcStatsParams statsParams = {0};
++ t_Handle h_Manip;
++
++ SANITY_CHECK_RETURN_VALUE(h_FmPcd,E_INVALID_HANDLE,NULL);
++
++ p_CcNode = (t_FmPcdCcNode*)XX_Malloc(sizeof(t_FmPcdCcNode));
++ if (!p_CcNode)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("No memory"));
++ return NULL;
++ }
++ memset(p_CcNode, 0, sizeof(t_FmPcdCcNode));
++
++ p_CcNode->p_GlblMask = (t_Handle)XX_Malloc(CC_GLBL_MASK_SIZE * sizeof(uint8_t));
++ memset(p_CcNode->p_GlblMask, 0, CC_GLBL_MASK_SIZE * sizeof(uint8_t));
++
++ p_CcNode->h_FmPcd = h_FmPcd;
++ p_CcNode->numOfKeys = p_CcNodeParam->keysParams.numOfKeys;
++ p_CcNode->maxNumOfKeys = p_CcNodeParam->keysParams.maxNumOfKeys;
++ p_CcNode->maskSupport = p_CcNodeParam->keysParams.maskSupport;
++ p_CcNode->statisticsMode = p_CcNodeParam->keysParams.statisticsMode;
++
++ /* For backward compatibility - even if statistics mode is nullified,
++ we'll fix it to frame mode so we can support per-key request for
++ statistics using 'statisticsEn' in next engine parameters */
++ if (!p_CcNode->maxNumOfKeys &&
++ (p_CcNode->statisticsMode == e_FM_PCD_CC_STATS_MODE_NONE))
++ p_CcNode->statisticsMode = e_FM_PCD_CC_STATS_MODE_FRAME;
++
++ h_FmMuram = FmPcdGetMuramHandle(h_FmPcd);
++ if (!h_FmMuram)
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_HANDLE, ("FM MURAM"));
++ return NULL;
++ }
++
++ INIT_LIST(&p_CcNode->ccPrevNodesLst);
++ INIT_LIST(&p_CcNode->ccTreeIdLst);
++ INIT_LIST(&p_CcNode->ccTreesLst);
++ INIT_LIST(&p_CcNode->availableStatsLst);
++
++ p_CcNode->h_Spinlock = XX_InitSpinlock();
++ if (!p_CcNode->h_Spinlock)
++ {
++ DeleteNode(p_CcNode);
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("CC node spinlock"));
++ return NULL;
++ }
++
++ if ((p_CcNodeParam->extractCcParams.type == e_FM_PCD_EXTRACT_BY_HDR) &&
++ ((p_CcNodeParam->extractCcParams.extractByHdr.hdr == HEADER_TYPE_IPv4) ||
++ (p_CcNodeParam->extractCcParams.extractByHdr.hdr == HEADER_TYPE_IPv6)) &&
++ (p_CcNodeParam->extractCcParams.extractByHdr.type == e_FM_PCD_EXTRACT_FULL_FIELD) &&
++ ((p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fullField.ipv6 == NET_HEADER_FIELD_IPv6_HOP_LIMIT) ||
++ (p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fullField.ipv4 == NET_HEADER_FIELD_IPv4_TTL)))
++ {
++ err = Ipv4TtlOrIpv6HopLimitCheckParams(h_FmPcd, p_CcNodeParam, p_CcNode, &isKeyTblAlloc);
++ glblMask = FALSE;
++ }
++ else if ((p_CcNodeParam->extractCcParams.type == e_FM_PCD_EXTRACT_NON_HDR) &&
++ ((p_CcNodeParam->extractCcParams.extractNonHdr.src == e_FM_PCD_EXTRACT_FROM_KEY) ||
++ (p_CcNodeParam->extractCcParams.extractNonHdr.src == e_FM_PCD_EXTRACT_FROM_HASH) ||
++ (p_CcNodeParam->extractCcParams.extractNonHdr.src == e_FM_PCD_EXTRACT_FROM_FLOW_ID)))
++ {
++ if ((p_CcNodeParam->extractCcParams.extractNonHdr.src == e_FM_PCD_EXTRACT_FROM_FLOW_ID) &&
++ (p_CcNodeParam->extractCcParams.extractNonHdr.offset != 0))
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE,
++ ("In the case of the extraction from e_FM_PCD_EXTRACT_FROM_FLOW_ID offset has to be 0"));
++ return NULL;
++ }
++
++ icCode = IcDefineCode(p_CcNodeParam);
++ fromIc = TRUE;
++ if (icCode == CC_PRIVATE_INFO_NONE)
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_STATE,
++ ("user asked extraction from IC and field in internal context or action wasn't initialized in the right way"));
++ return NULL;
++ }
++
++ if ((icCode == CC_PRIVATE_INFO_IC_DEQ_FQID_INDEX_LOOKUP) ||
++ (icCode == CC_PRIVATE_INFO_IC_HASH_INDEX_LOOKUP))
++ {
++ err = IcHashIndexedCheckParams(h_FmPcd, p_CcNodeParam, p_CcNode, &isKeyTblAlloc);
++ glblMask = TRUE;
++ }
++ else
++ {
++ err = CheckParams(h_FmPcd, p_CcNodeParam, p_CcNode, &isKeyTblAlloc);
++ if (p_CcNode->glblMaskSize)
++ glblMask = TRUE;
++ }
++ }
++ else
++ {
++ err = CheckParams(h_FmPcd, p_CcNodeParam, p_CcNode, &isKeyTblAlloc);
++ if (p_CcNode->glblMaskSize)
++ glblMask = TRUE;
++ }
++
++ if (err)
++ {
++ DeleteNode(p_CcNode);
++ REPORT_ERROR(MAJOR, err, NO_MSG);
++ return NULL;
++ }
++
++ switch (p_CcNodeParam->extractCcParams.type)
++ {
++ case (e_FM_PCD_EXTRACT_BY_HDR):
++ switch (p_CcNodeParam->extractCcParams.extractByHdr.type)
++ {
++ case (e_FM_PCD_EXTRACT_FULL_FIELD):
++ p_CcNode->parseCode =
++ GetFullFieldParseCode(p_CcNodeParam->extractCcParams.extractByHdr.hdr,
++ p_CcNodeParam->extractCcParams.extractByHdr.hdrIndex,
++ p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fullField);
++ GetSizeHeaderField(p_CcNodeParam->extractCcParams.extractByHdr.hdr,
++ p_CcNodeParam->extractCcParams.extractByHdr.hdrIndex,
++ p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fullField,
++ &p_CcNode->sizeOfExtraction);
++ fullField = TRUE;
++ if ((p_CcNode->parseCode != CC_PC_FF_TCI1) &&
++ (p_CcNode->parseCode != CC_PC_FF_TCI2) &&
++ (p_CcNode->parseCode != CC_PC_FF_MPLS1) &&
++ (p_CcNode->parseCode != CC_PC_FF_MPLS1) &&
++ (p_CcNode->parseCode != CC_PC_FF_IPV4IPTOS_TC1) &&
++ (p_CcNode->parseCode != CC_PC_FF_IPV4IPTOS_TC2) &&
++ (p_CcNode->parseCode != CC_PC_FF_IPTOS_IPV6TC1_IPV6FLOW1) &&
++ (p_CcNode->parseCode != CC_PC_FF_IPDSCP) &&
++ (p_CcNode->parseCode != CC_PC_FF_IPTOS_IPV6TC2_IPV6FLOW2) &&
++ glblMask)
++ {
++ glblMask = FALSE;
++ p_CcNode->glblMaskSize = 4;
++ p_CcNode->lclMask = TRUE;
++ }
++ break;
++
++ case (e_FM_PCD_EXTRACT_FROM_HDR):
++ p_CcNode->sizeOfExtraction = p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fromHdr.size;
++ p_CcNode->offset = p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fromHdr.offset;
++ p_CcNode->userOffset = p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fromHdr.offset;
++ p_CcNode->parseCode =
++ GetPrParseCode(p_CcNodeParam->extractCcParams.extractByHdr.hdr,
++ p_CcNodeParam->extractCcParams.extractByHdr.hdrIndex,
++ p_CcNode->offset,glblMask,
++ &p_CcNode->prsArrayOffset);
++ break;
++
++ case (e_FM_PCD_EXTRACT_FROM_FIELD):
++ p_CcNode->offset = p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fromField.offset;
++ p_CcNode->userOffset = p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fromField.offset;
++ p_CcNode->sizeOfExtraction = p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fromField.size;
++ p_CcNode->parseCode =
++ GetFieldParseCode(p_CcNodeParam->extractCcParams.extractByHdr.hdr,
++ p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fromField.field,
++ p_CcNode->offset,
++ &p_CcNode->prsArrayOffset,
++ p_CcNodeParam->extractCcParams.extractByHdr.hdrIndex);
++ break;
++
++ default:
++ DeleteNode(p_CcNode);
++ REPORT_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
++ return NULL;
++ }
++ break;
++
++ case (e_FM_PCD_EXTRACT_NON_HDR):
++ /* get the field code for the generic extract */
++ p_CcNode->sizeOfExtraction = p_CcNodeParam->extractCcParams.extractNonHdr.size;
++ p_CcNode->offset = p_CcNodeParam->extractCcParams.extractNonHdr.offset;
++ p_CcNode->userOffset = p_CcNodeParam->extractCcParams.extractNonHdr.offset;
++ p_CcNode->parseCode =
++ GetGenParseCode(h_FmPcd,
++ p_CcNodeParam->extractCcParams.extractNonHdr.src,
++ p_CcNode->offset,
++ glblMask,
++ &p_CcNode->prsArrayOffset,
++ fromIc,icCode);
++
++ if (p_CcNode->parseCode == CC_PC_GENERIC_IC_HASH_INDEXED)
++ {
++ if ((p_CcNode->offset + p_CcNode->sizeOfExtraction) > 8)
++ {
++ DeleteNode(p_CcNode);
++ REPORT_ERROR(MAJOR, E_INVALID_SELECTION,("when node of the type CC_PC_GENERIC_IC_HASH_INDEXED offset + size can not be bigger then size of HASH 64 bits (8 bytes)"));
++ return NULL;
++ }
++ }
++ if ((p_CcNode->parseCode == CC_PC_GENERIC_IC_GMASK) ||
++ (p_CcNode->parseCode == CC_PC_GENERIC_IC_HASH_INDEXED))
++ {
++ p_CcNode->offset += p_CcNode->prsArrayOffset;
++ p_CcNode->prsArrayOffset = 0;
++ }
++ break;
++
++ default:
++ DeleteNode(p_CcNode);
++ REPORT_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
++ return NULL;
++ }
++
++ if (p_CcNode->parseCode == CC_PC_ILLEGAL)
++ {
++ DeleteNode(p_CcNode);
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("illegal extraction type"));
++ return NULL;
++ }
++
++ if ((p_CcNode->sizeOfExtraction > FM_PCD_MAX_SIZE_OF_KEY) ||
++ !p_CcNode->sizeOfExtraction)
++ {
++ DeleteNode(p_CcNode);
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("sizeOfExatrction can not be greater than 56 and not 0"));
++ return NULL;
++ }
++
++ if (p_CcNodeParam->keysParams.keySize != p_CcNode->sizeOfExtraction)
++ {
++ DeleteNode(p_CcNode);
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("keySize has to be equal to sizeOfExtraction"));
++ return NULL;
++ }
++
++ p_CcNode->userSizeOfExtraction = p_CcNode->sizeOfExtraction;
++
++ if (!glblMask)
++ memset(p_CcNode->p_GlblMask, 0xff, CC_GLBL_MASK_SIZE * sizeof(uint8_t));
++
++ err = CheckAndSetManipParamsWithCcNodeParams(p_CcNode);
++ if (err != E_OK)
++ {
++ DeleteNode(p_CcNode);
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("keySize has to be equal to sizeOfExtraction"));
++ return NULL;
++ }
++
++ /* Calculating matching table entry size by rounding up the user-defined size of extraction to valid entry size */
++ GetCcExtractKeySize(p_CcNode->sizeOfExtraction, &p_CcNode->ccKeySizeAccExtraction);
++
++ /* If local mask is used, it is stored next to each key in the keys match table */
++ if (p_CcNode->lclMask)
++ keySize = (uint32_t)(2 * p_CcNode->ccKeySizeAccExtraction);
++ else
++ keySize = p_CcNode->ccKeySizeAccExtraction;
++
++ /* Update CC shadow with maximal size required by this node */
++ if (p_CcNode->maxNumOfKeys)
++ {
++ err = CalcAndUpdateCcShadow(p_CcNode,
++ isKeyTblAlloc,
++ &matchTableSize,
++ &adTableSize);
++ if (err != E_OK)
++ {
++ DeleteNode(p_CcNode);
++ REPORT_ERROR(MAJOR, err, NO_MSG);
++ return NULL;
++ }
++
++ p_CcNode->keysMatchTableMaxSize = matchTableSize;
++
++ if (p_CcNode->statisticsMode != e_FM_PCD_CC_STATS_MODE_NONE)
++ {
++ err = AllocStatsObjs(p_CcNode);
++ if (err != E_OK)
++ {
++ DeleteNode(p_CcNode);
++ REPORT_ERROR(MAJOR, err, NO_MSG);
++ return NULL;
++ }
++ }
++
++ /* If manipulation will be initialized before this node, it will use the table
++ descriptor in the AD table of previous node and this node will need an extra
++ AD as his table descriptor. */
++ p_CcNode->h_Ad = (t_Handle)FM_MURAM_AllocMem(h_FmMuram,
++ FM_PCD_CC_AD_ENTRY_SIZE,
++ FM_PCD_CC_AD_TABLE_ALIGN);
++ if (!p_CcNode->h_Ad)
++ {
++ DeleteNode(p_CcNode);
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for CC action descriptor"));
++ return NULL;
++ }
++ }
++ else
++ {
++ matchTableSize = (uint32_t)(keySize * sizeof(uint8_t) * (p_CcNode->numOfKeys + 1));
++ adTableSize = (uint32_t)(FM_PCD_CC_AD_ENTRY_SIZE * (p_CcNode->numOfKeys + 1));
++ }
++
++#if (DPAA_VERSION >= 11)
++ switch (p_CcNode->statisticsMode)
++ {
++
++ case e_FM_PCD_CC_STATS_MODE_RMON:
++ /* If RMON statistics or RMON conditional statistics modes are requested,
++ allocate frame length ranges array */
++ p_CcNode->h_StatsFLRs =
++ FM_MURAM_AllocMem(h_FmMuram,
++ (uint32_t)(p_CcNode->numOfStatsFLRs) * FM_PCD_CC_STATS_FLR_SIZE,
++ FM_PCD_CC_AD_TABLE_ALIGN);
++
++ if (!p_CcNode->h_StatsFLRs)
++ {
++ DeleteNode(p_CcNode);
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for CC frame length ranges array"));
++ return NULL;
++ }
++
++ /* Initialize using value received from the user */
++ for (tmp = 0; tmp < p_CcNode->numOfStatsFLRs; tmp++)
++ {
++ h_StatsFLRs = PTR_MOVE(p_CcNode->h_StatsFLRs, tmp * FM_PCD_CC_STATS_FLR_SIZE);
++
++ Mem2IOCpy32(h_StatsFLRs,
++ &(p_CcNodeParam->keysParams.frameLengthRanges[tmp]),
++ FM_PCD_CC_STATS_FLR_SIZE);
++ }
++ break;
++
++ default:
++ break;
++ }
++#endif /* (DPAA_VERSION >= 11) */
++
++
++ /* Allocate keys match table. Not required for some CC nodes, for example for IPv4 TTL
++ identification, IPv6 hop count identification, etc. */
++ if (isKeyTblAlloc)
++ {
++ p_CcNode->h_KeysMatchTable =
++ (t_Handle)FM_MURAM_AllocMem(h_FmMuram,
++ matchTableSize,
++ FM_PCD_CC_KEYS_MATCH_TABLE_ALIGN);
++ if (!p_CcNode->h_KeysMatchTable)
++ {
++ DeleteNode(p_CcNode);
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for CC node key match table"));
++ return NULL;
++ }
++ IOMemSet32((uint8_t *)p_CcNode->h_KeysMatchTable,
++ 0,
++ matchTableSize);
++ }
++
++ /* Allocate action descriptors table */
++ p_CcNode->h_AdTable =
++ (t_Handle)FM_MURAM_AllocMem(h_FmMuram,
++ adTableSize,
++ FM_PCD_CC_AD_TABLE_ALIGN);
++ if (!p_CcNode->h_AdTable)
++ {
++ DeleteNode(p_CcNode);
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for CC node action descriptors table"));
++ return NULL;
++ }
++ IOMemSet32((uint8_t *)p_CcNode->h_AdTable, 0, adTableSize);
++
++ p_KeysMatchTblTmp = p_CcNode->h_KeysMatchTable;
++ p_AdTableTmp = p_CcNode->h_AdTable;
++
++ /* For each key, create the key and the next step AD */
++ for (tmp = 0; tmp < p_CcNode->numOfKeys; tmp++)
++ {
++ p_KeyParams = &p_CcNodeParam->keysParams.keyParams[tmp];
++
++ if (p_KeysMatchTblTmp)
++ {
++ /* Copy the key */
++ Mem2IOCpy32((void*)p_KeysMatchTblTmp, p_KeyParams->p_Key, p_CcNode->sizeOfExtraction);
++
++ /* Copy the key mask or initialize it to 0xFF..F */
++ if (p_CcNode->lclMask && p_KeyParams->p_Mask)
++ {
++ Mem2IOCpy32(PTR_MOVE(p_KeysMatchTblTmp,
++ p_CcNode->ccKeySizeAccExtraction), /* User's size of extraction rounded up to a valid matching table entry size */
++ p_KeyParams->p_Mask,
++ p_CcNode->sizeOfExtraction); /* Exact size of extraction as received from the user */
++ }
++ else if (p_CcNode->lclMask)
++ {
++ IOMemSet32(PTR_MOVE(p_KeysMatchTblTmp,
++ p_CcNode->ccKeySizeAccExtraction), /* User's size of extraction rounded up to a valid matching table entry size */
++ 0xff,
++ p_CcNode->sizeOfExtraction); /* Exact size of extraction as received from the user */
++ }
++
++ p_KeysMatchTblTmp = PTR_MOVE(p_KeysMatchTblTmp, keySize * sizeof(uint8_t));
++ }
++
++ /* Create the next action descriptor in the match table */
++ if (p_KeyParams->ccNextEngineParams.statisticsEn)
++ {
++ p_StatsObj = GetStatsObj(p_CcNode);
++ ASSERT_COND(p_StatsObj);
++
++ statsParams.h_StatsAd = p_StatsObj->h_StatsAd;
++ statsParams.h_StatsCounters = p_StatsObj->h_StatsCounters;
++#if (DPAA_VERSION >= 11)
++ statsParams.h_StatsFLRs = p_CcNode->h_StatsFLRs;
++
++#endif /* (DPAA_VERSION >= 11) */
++ NextStepAd(p_AdTableTmp,
++ &statsParams,
++ &p_KeyParams->ccNextEngineParams,
++ p_FmPcd);
++
++ p_CcNode->keyAndNextEngineParams[tmp].p_StatsObj = p_StatsObj;
++ }
++ else
++ {
++ NextStepAd(p_AdTableTmp,
++ NULL,
++ &p_KeyParams->ccNextEngineParams,
++ p_FmPcd);
++
++ p_CcNode->keyAndNextEngineParams[tmp].p_StatsObj = NULL;
++ }
++
++ p_AdTableTmp = PTR_MOVE(p_AdTableTmp, FM_PCD_CC_AD_ENTRY_SIZE);
++ }
++
++ /* Update next engine for the 'miss' entry */
++ if (p_CcNodeParam->keysParams.ccNextEngineParamsForMiss.statisticsEn)
++ {
++ p_StatsObj = GetStatsObj(p_CcNode);
++ ASSERT_COND(p_StatsObj);
++
++ statsParams.h_StatsAd = p_StatsObj->h_StatsAd;
++ statsParams.h_StatsCounters = p_StatsObj->h_StatsCounters;
++#if (DPAA_VERSION >= 11)
++ statsParams.h_StatsFLRs = p_CcNode->h_StatsFLRs;
++
++#endif /* (DPAA_VERSION >= 11) */
++
++ NextStepAd(p_AdTableTmp,
++ &statsParams,
++ &p_CcNodeParam->keysParams.ccNextEngineParamsForMiss,
++ p_FmPcd);
++
++ p_CcNode->keyAndNextEngineParams[tmp].p_StatsObj = p_StatsObj;
++ }
++ else
++ {
++ NextStepAd(p_AdTableTmp,
++ NULL,
++ &p_CcNodeParam->keysParams.ccNextEngineParamsForMiss,
++ p_FmPcd);
++
++ p_CcNode->keyAndNextEngineParams[tmp].p_StatsObj = NULL;
++ }
++
++ /* This parameter will be used to initialize the "key length" field in the action descriptor
++ that points to this node and it should be 0 for full field extraction */
++ if (fullField == TRUE)
++ p_CcNode->sizeOfExtraction = 0;
++
++ for (tmp = 0; tmp < MIN(p_CcNode->numOfKeys + 1, CC_MAX_NUM_OF_KEYS); tmp++)
++ {
++ if (p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.nextEngine == e_FM_PCD_CC)
++ {
++ p_FmPcdCcNextNode = (t_FmPcdCcNode*)p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.params.ccParams.h_CcNode;
++ p_CcInformation = FindNodeInfoInReleventLst(&p_FmPcdCcNextNode->ccPrevNodesLst,
++ (t_Handle)p_CcNode,
++ p_FmPcdCcNextNode->h_Spinlock);
++ if (!p_CcInformation)
++ {
++ memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
++ ccNodeInfo.h_CcNode = (t_Handle)p_CcNode;
++ ccNodeInfo.index = 1;
++ EnqueueNodeInfoToRelevantLst(&p_FmPcdCcNextNode->ccPrevNodesLst,
++ &ccNodeInfo,
++ p_FmPcdCcNextNode->h_Spinlock);
++ }
++ else
++ p_CcInformation->index++;
++
++ if (p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.h_Manip)
++ {
++ h_Manip = p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.h_Manip;
++ p_CcInformation = FindNodeInfoInReleventLst(FmPcdManipGetNodeLstPointedOnThisManip(h_Manip),
++ (t_Handle)p_CcNode,
++ FmPcdManipGetSpinlock(h_Manip));
++ if (!p_CcInformation)
++ {
++ memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
++ ccNodeInfo.h_CcNode = (t_Handle)p_CcNode;
++ ccNodeInfo.index = 1;
++ EnqueueNodeInfoToRelevantLst(FmPcdManipGetNodeLstPointedOnThisManip(h_Manip),
++ &ccNodeInfo,
++ FmPcdManipGetSpinlock(h_Manip));
++ }
++ else
++ p_CcInformation->index++;
++ }
++ }
++ }
++
++ p_AdTableTmp = p_CcNode->h_AdTable;
++
++ if (!FmPcdLockTryLockAll(h_FmPcd))
++ {
++ FM_PCD_MatchTableDelete((t_Handle)p_CcNode);
++ DBG(TRACE, ("FmPcdLockTryLockAll failed"));
++ return NULL;
++ }
++
++ /* Required action for each next engine */
++ for (tmp = 0; tmp < MIN(p_CcNode->numOfKeys + 1, CC_MAX_NUM_OF_KEYS); tmp++)
++ {
++ if (p_CcNode->keyAndNextEngineParams[tmp].requiredAction)
++ {
++ err = SetRequiredAction(h_FmPcd,
++ p_CcNode->keyAndNextEngineParams[tmp].requiredAction,
++ &p_CcNode->keyAndNextEngineParams[tmp],
++ p_AdTableTmp,
++ 1,
++ NULL);
++ if (err)
++ {
++ FmPcdLockUnlockAll(h_FmPcd);
++ FM_PCD_MatchTableDelete((t_Handle)p_CcNode);
++ REPORT_ERROR(MAJOR, err, NO_MSG);
++ return NULL;
++ }
++ p_AdTableTmp = PTR_MOVE(p_AdTableTmp, FM_PCD_CC_AD_ENTRY_SIZE);
++ }
++ }
++
++ FmPcdLockUnlockAll(h_FmPcd);
++ return p_CcNode;
++}
++
++t_Error FM_PCD_MatchTableDelete(t_Handle h_CcNode)
++{
++ t_FmPcd *p_FmPcd;
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
++ int i = 0;
++
++ SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
++ p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++
++ if (p_CcNode->owners)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("This node cannot be removed because it is occupied; first unbind this node"));
++
++ for (i = 0; i < p_CcNode->numOfKeys; i++)
++ if (p_CcNode->keyAndNextEngineParams[i].nextEngineParams.nextEngine == e_FM_PCD_CC)
++ UpdateNodeOwner(p_CcNode->keyAndNextEngineParams[i].nextEngineParams.params.ccParams.h_CcNode, FALSE);
++
++ if (p_CcNode->keyAndNextEngineParams[i].nextEngineParams.nextEngine == e_FM_PCD_CC)
++ UpdateNodeOwner(p_CcNode->keyAndNextEngineParams[i].nextEngineParams.params.ccParams.h_CcNode, FALSE);
++
++ /* Handle also Miss entry */
++ for (i = 0; i < p_CcNode->numOfKeys + 1; i++)
++ {
++ if (p_CcNode->keyAndNextEngineParams[i].nextEngineParams.h_Manip)
++ FmPcdManipUpdateOwner(p_CcNode->keyAndNextEngineParams[i].nextEngineParams.h_Manip, FALSE);
++
++#if (DPAA_VERSION >= 11)
++ if ((p_CcNode->keyAndNextEngineParams[i].nextEngineParams.nextEngine == e_FM_PCD_FR) &&
++ (p_CcNode->keyAndNextEngineParams[i].nextEngineParams.params.frParams.h_FrmReplic))
++ {
++ FrmReplicGroupUpdateOwner(p_CcNode->keyAndNextEngineParams[i].nextEngineParams.params.frParams.h_FrmReplic,
++ FALSE);
++ }
++#endif /* (DPAA_VERSION >= 11) */
++ }
++
++ DeleteNode(p_CcNode);
++
++ return E_OK;
++}
++
++t_Error FM_PCD_MatchTableAddKey(t_Handle h_CcNode,
++ uint16_t keyIndex,
++ uint8_t keySize,
++ t_FmPcdCcKeyParams *p_KeyParams)
++{
++ t_FmPcd *p_FmPcd;
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
++ t_Error err = E_OK;
++
++ SANITY_CHECK_RETURN_ERROR(p_KeyParams, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
++ p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
++
++ if (keyIndex == FM_PCD_LAST_KEY_INDEX)
++ keyIndex = p_CcNode->numOfKeys;
++
++ if (!FmPcdLockTryLockAll(p_FmPcd))
++ {
++ DBG(TRACE, ("FmPcdLockTryLockAll failed"));
++ return ERROR_CODE(E_BUSY);
++ }
++
++ err = FmPcdCcAddKey(p_FmPcd,
++ p_CcNode,
++ keyIndex,
++ keySize,
++ p_KeyParams);
++
++ FmPcdLockUnlockAll(p_FmPcd);
++
++ switch (GET_ERROR_TYPE(err))
++ {
++ case E_OK:
++ return E_OK;
++
++ case E_BUSY:
++ DBG(TRACE, ("E_BUSY error"));
++ return ERROR_CODE(E_BUSY);
++
++ default:
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++}
++
++t_Error FM_PCD_MatchTableRemoveKey(t_Handle h_CcNode, uint16_t keyIndex)
++{
++ t_FmPcd *p_FmPcd;
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
++ t_Error err = E_OK;
++
++ SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
++ p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
++
++ if (!FmPcdLockTryLockAll(p_FmPcd))
++ {
++ DBG(TRACE, ("FmPcdLockTryLockAll failed"));
++ return ERROR_CODE(E_BUSY);
++ }
++
++ err = FmPcdCcRemoveKey(p_FmPcd, p_CcNode, keyIndex);
++
++ FmPcdLockUnlockAll(p_FmPcd);
++
++ switch (GET_ERROR_TYPE(err))
++ {
++ case E_OK:
++ return E_OK;
++
++ case E_BUSY:
++ DBG(TRACE, ("E_BUSY error"));
++ return ERROR_CODE(E_BUSY);
++
++ default:
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ return E_OK;
++}
++
++t_Error FM_PCD_MatchTableModifyKey(t_Handle h_CcNode,
++ uint16_t keyIndex,
++ uint8_t keySize,
++ uint8_t *p_Key,
++ uint8_t *p_Mask)
++{
++ t_FmPcd *p_FmPcd;
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
++ t_List h_List;
++ t_Error err = E_OK;
++
++ SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Key, E_NULL_POINTER);
++ p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
++
++ INIT_LIST(&h_List);
++
++ err = FmPcdCcNodeTreeTryLock(p_FmPcd, p_CcNode, &h_List);
++ if (err)
++ {
++ DBG(TRACE, ("Node's trees lock failed"));
++ return ERROR_CODE(E_BUSY);
++ }
++
++ err = FmPcdCcModifyKey(p_FmPcd,
++ p_CcNode,
++ keyIndex,
++ keySize,
++ p_Key,
++ p_Mask);
++
++ FmPcdCcNodeTreeReleaseLock(p_FmPcd, &h_List);
++
++ switch (GET_ERROR_TYPE(err))
++ {
++ case E_OK:
++ return E_OK;
++
++ case E_BUSY:
++ DBG(TRACE, ("E_BUSY error"));
++ return ERROR_CODE(E_BUSY);
++
++ default:
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++}
++
++t_Error FM_PCD_MatchTableModifyNextEngine(t_Handle h_CcNode,
++ uint16_t keyIndex,
++ t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
++{
++ t_FmPcd *p_FmPcd;
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
++ t_Error err = E_OK;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcdCcNextEngineParams, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
++ p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
++
++ if (!FmPcdLockTryLockAll(p_FmPcd))
++ {
++ DBG(TRACE, ("FmPcdLockTryLockAll failed"));
++ return ERROR_CODE(E_BUSY);
++ }
++
++ err = ModifyNextEngineParamNode(p_FmPcd,
++ p_CcNode,
++ keyIndex,
++ p_FmPcdCcNextEngineParams);
++
++ FmPcdLockUnlockAll(p_FmPcd);
++
++ switch (GET_ERROR_TYPE(err))
++ {
++ case E_OK:
++ return E_OK;
++
++ case E_BUSY:
++ DBG(TRACE, ("E_BUSY error"));
++ return ERROR_CODE(E_BUSY);
++
++ default:
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++}
++
++t_Error FM_PCD_MatchTableModifyMissNextEngine(t_Handle h_CcNode,
++ t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
++{
++ t_FmPcd *p_FmPcd;
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
++ t_Error err = E_OK;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcdCcNextEngineParams, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
++ p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
++
++ if (!FmPcdLockTryLockAll(p_FmPcd))
++ {
++ DBG(TRACE, ("FmPcdLockTryLockAll failed"));
++ return ERROR_CODE(E_BUSY);
++ }
++
++ err = FmPcdCcModifyMissNextEngineParamNode(p_FmPcd,
++ p_CcNode,
++ p_FmPcdCcNextEngineParams);
++
++ FmPcdLockUnlockAll(p_FmPcd);
++
++ switch (GET_ERROR_TYPE(err))
++ {
++ case E_OK:
++ return E_OK;
++
++ case E_BUSY:
++ DBG(TRACE, ("E_BUSY error"));
++ return ERROR_CODE(E_BUSY);
++
++ default:
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++}
++
++t_Error FM_PCD_MatchTableModifyKeyAndNextEngine(t_Handle h_CcNode,
++ uint16_t keyIndex,
++ uint8_t keySize,
++ t_FmPcdCcKeyParams *p_KeyParams)
++{
++ t_FmPcd *p_FmPcd;
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
++ t_Error err = E_OK;
++
++ SANITY_CHECK_RETURN_ERROR(p_KeyParams, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
++ p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
++
++ if (!FmPcdLockTryLockAll(p_FmPcd))
++ {
++ DBG(TRACE, ("FmPcdLockTryLockAll failed"));
++ return ERROR_CODE(E_BUSY);
++ }
++
++ err = FmPcdCcModifyKeyAndNextEngine(p_FmPcd,
++ p_CcNode,
++ keyIndex,
++ keySize,
++ p_KeyParams);
++
++ FmPcdLockUnlockAll(p_FmPcd);
++
++ switch (GET_ERROR_TYPE(err))
++ {
++ case E_OK:
++ return E_OK;
++
++ case E_BUSY:
++ DBG(TRACE, ("E_BUSY error"));
++ return ERROR_CODE(E_BUSY);
++
++ default:
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++}
++
++
++t_Error FM_PCD_MatchTableFindNRemoveKey(t_Handle h_CcNode,
++ uint8_t keySize,
++ uint8_t *p_Key,
++ uint8_t *p_Mask)
++{
++ t_FmPcd *p_FmPcd;
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
++ uint16_t keyIndex;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_Key, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
++ p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
++
++ if (!FmPcdLockTryLockAll(p_FmPcd))
++ {
++ DBG(TRACE, ("FmPcdLockTryLockAll failed"));
++ return ERROR_CODE(E_BUSY);
++ }
++
++ err = FindKeyIndex(p_CcNode, keySize, p_Key, p_Mask, &keyIndex);
++ if (GET_ERROR_TYPE(err) != E_OK)
++ {
++ FmPcdLockUnlockAll(p_FmPcd);
++ RETURN_ERROR(MAJOR, err, ("The received key and mask pair was not found in the match table of the provided node"));
++ }
++
++ err = FmPcdCcRemoveKey(p_FmPcd, p_CcNode, keyIndex);
++
++ FmPcdLockUnlockAll(p_FmPcd);
++
++ switch (GET_ERROR_TYPE(err))
++ {
++ case E_OK:
++ return E_OK;
++
++ case E_BUSY:
++ DBG(TRACE, ("E_BUSY error"));
++ return ERROR_CODE(E_BUSY);
++
++ default:
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++}
++
++
++t_Error FM_PCD_MatchTableFindNModifyNextEngine(t_Handle h_CcNode,
++ uint8_t keySize,
++ uint8_t *p_Key,
++ uint8_t *p_Mask,
++ t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
++{
++ t_FmPcd *p_FmPcd;
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
++ uint16_t keyIndex;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_Key, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcdCcNextEngineParams, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
++ p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
++
++ if (!FmPcdLockTryLockAll(p_FmPcd))
++ {
++ DBG(TRACE, ("FmPcdLockTryLockAll failed"));
++ return ERROR_CODE(E_BUSY);
++ }
++
++ err = FindKeyIndex(p_CcNode, keySize, p_Key, p_Mask, &keyIndex);
++ if (GET_ERROR_TYPE(err) != E_OK)
++ {
++ FmPcdLockUnlockAll(p_FmPcd);
++ RETURN_ERROR(MAJOR, err, ("The received key and mask pair was not found in the match table of the provided node"));
++ }
++
++ err = ModifyNextEngineParamNode(p_FmPcd,
++ p_CcNode,
++ keyIndex,
++ p_FmPcdCcNextEngineParams);
++
++ FmPcdLockUnlockAll(p_FmPcd);
++
++ switch (GET_ERROR_TYPE(err))
++ {
++ case E_OK:
++ return E_OK;
++
++ case E_BUSY:
++ DBG(TRACE, ("E_BUSY error"));
++ return ERROR_CODE(E_BUSY);
++
++ default:
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++}
++
++t_Error FM_PCD_MatchTableFindNModifyKeyAndNextEngine(t_Handle h_CcNode,
++ uint8_t keySize,
++ uint8_t *p_Key,
++ uint8_t *p_Mask,
++ t_FmPcdCcKeyParams *p_KeyParams)
++{
++ t_FmPcd *p_FmPcd;
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
++ uint16_t keyIndex;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_Key, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_KeyParams, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
++ p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
++
++ if (!FmPcdLockTryLockAll(p_FmPcd))
++ {
++ DBG(TRACE, ("FmPcdLockTryLockAll failed"));
++ return ERROR_CODE(E_BUSY);
++ }
++
++ err = FindKeyIndex(p_CcNode, keySize, p_Key, p_Mask, &keyIndex);
++ if (GET_ERROR_TYPE(err) != E_OK)
++ {
++ FmPcdLockUnlockAll(p_FmPcd);
++ RETURN_ERROR(MAJOR, err, ("The received key and mask pair was not found in the match table of the provided node"));
++ }
++
++ err = FmPcdCcModifyKeyAndNextEngine(p_FmPcd,
++ h_CcNode,
++ keyIndex,
++ keySize,
++ p_KeyParams);
++
++ FmPcdLockUnlockAll(p_FmPcd);
++
++ switch (GET_ERROR_TYPE(err))
++ {
++ case E_OK:
++ return E_OK;
++
++ case E_BUSY:
++ DBG(TRACE, ("E_BUSY error"));
++ return ERROR_CODE(E_BUSY);
++
++ default:
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++}
++
++t_Error FM_PCD_MatchTableFindNModifyKey(t_Handle h_CcNode,
++ uint8_t keySize,
++ uint8_t *p_Key,
++ uint8_t *p_Mask,
++ uint8_t *p_NewKey,
++ uint8_t *p_NewMask)
++{
++ t_FmPcd *p_FmPcd;
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
++ t_List h_List;
++ uint16_t keyIndex;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_Key, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_NewKey, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
++ p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
++
++ INIT_LIST(&h_List);
++
++ err = FmPcdCcNodeTreeTryLock(p_FmPcd, p_CcNode, &h_List);
++ if (err)
++ {
++ DBG(TRACE, ("Node's trees lock failed"));
++ return ERROR_CODE(E_BUSY);
++ }
++
++ err = FindKeyIndex(p_CcNode, keySize, p_Key, p_Mask, &keyIndex);
++ if (GET_ERROR_TYPE(err) != E_OK)
++ {
++ FmPcdCcNodeTreeReleaseLock(p_FmPcd, &h_List);
++ RETURN_ERROR(MAJOR, err, ("The received key and mask pair was not found in the "
++ "match table of the provided node"));
++ }
++
++ err = FmPcdCcModifyKey(p_FmPcd,
++ p_CcNode,
++ keyIndex,
++ keySize,
++ p_NewKey,
++ p_NewMask);
++
++ FmPcdCcNodeTreeReleaseLock(p_FmPcd, &h_List);
++
++ switch (GET_ERROR_TYPE(err))
++ {
++ case E_OK:
++ return E_OK;
++
++ case E_BUSY:
++ DBG(TRACE, ("E_BUSY error"));
++ return ERROR_CODE(E_BUSY);
++
++ default:
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++}
++
++t_Error FM_PCD_MatchTableGetNextEngine(t_Handle h_CcNode,
++ uint16_t keyIndex,
++ t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
++{
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
++
++ SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcdCcNextEngineParams, E_NULL_POINTER);
++
++ if (keyIndex >= p_CcNode->numOfKeys)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("keyIndex exceeds current number of keys"));
++
++ if (keyIndex > (FM_PCD_MAX_NUM_OF_KEYS - 1))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("keyIndex can not be larger than %d", (FM_PCD_MAX_NUM_OF_KEYS - 1)));
++
++ memcpy(p_FmPcdCcNextEngineParams,
++ &p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams,
++ sizeof(t_FmPcdCcNextEngineParams));
++
++ return E_OK;
++}
++
++
++uint32_t FM_PCD_MatchTableGetKeyCounter(t_Handle h_CcNode, uint16_t keyIndex)
++{
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
++ uint32_t *p_StatsCounters, frameCount;
++ uint32_t intFlags;
++
++ SANITY_CHECK_RETURN_VALUE(p_CcNode, E_INVALID_HANDLE, 0);
++
++ if (p_CcNode->statisticsMode == e_FM_PCD_CC_STATS_MODE_NONE)
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Statistics were not enabled for this match table"));
++ return 0;
++ }
++
++ if ((p_CcNode->statisticsMode != e_FM_PCD_CC_STATS_MODE_FRAME) &&
++ (p_CcNode->statisticsMode != e_FM_PCD_CC_STATS_MODE_BYTE_AND_FRAME))
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Frame count is not supported in the statistics mode of this match table"));
++ return 0;
++ }
++
++ intFlags = XX_LockIntrSpinlock(p_CcNode->h_Spinlock);
++
++ if (keyIndex >= p_CcNode->numOfKeys)
++ {
++ XX_UnlockIntrSpinlock(p_CcNode->h_Spinlock, intFlags);
++ REPORT_ERROR(MAJOR, E_INVALID_STATE, ("The provided keyIndex exceeds the number of keys in this match table"));
++ return 0;
++ }
++
++ if (!p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj)
++ {
++ XX_UnlockIntrSpinlock(p_CcNode->h_Spinlock, intFlags);
++ REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Statistics were not enabled for this key"));
++ return 0;
++ }
++
++ p_StatsCounters = p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj->h_StatsCounters;
++ ASSERT_COND(p_StatsCounters);
++
++ /* The first counter is byte counter, so we need to advance to the next counter */
++ frameCount = GET_UINT32(*(uint32_t *)(PTR_MOVE(p_StatsCounters,
++ FM_PCD_CC_STATS_COUNTER_SIZE)));
++
++ XX_UnlockIntrSpinlock(p_CcNode->h_Spinlock, intFlags);
++
++ return frameCount;
++}
++
++t_Error FM_PCD_MatchTableGetKeyStatistics(t_Handle h_CcNode,
++ uint16_t keyIndex,
++ t_FmPcdCcKeyStatistics *p_KeyStatistics)
++{
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
++ uint32_t intFlags;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(h_CcNode, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_KeyStatistics, E_NULL_POINTER);
++
++ intFlags = XX_LockIntrSpinlock(p_CcNode->h_Spinlock);
++
++ err = MatchTableGetKeyStatistics(p_CcNode,
++ keyIndex,
++ p_KeyStatistics);
++
++ XX_UnlockIntrSpinlock(p_CcNode->h_Spinlock, intFlags);
++
++ if (err != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ return E_OK;
++}
++
++t_Error FM_PCD_MatchTableFindNGetKeyStatistics(t_Handle h_CcNode,
++ uint8_t keySize,
++ uint8_t *p_Key,
++ uint8_t *p_Mask,
++ t_FmPcdCcKeyStatistics *p_KeyStatistics)
++{
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
++ uint16_t keyIndex;
++ uint32_t intFlags;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_Key, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_KeyStatistics, E_NULL_POINTER);
++
++ intFlags = XX_LockIntrSpinlock(p_CcNode->h_Spinlock);
++
++ err = FindKeyIndex(p_CcNode, keySize, p_Key, p_Mask, &keyIndex);
++ if (GET_ERROR_TYPE(err) != E_OK)
++ {
++ XX_UnlockIntrSpinlock(p_CcNode->h_Spinlock, intFlags);
++ RETURN_ERROR(MAJOR, err, ("The received key and mask pair was not found in the "
++ "match table of the provided node"));
++ }
++
++ err = MatchTableGetKeyStatistics(p_CcNode,
++ keyIndex,
++ p_KeyStatistics);
++
++ XX_UnlockIntrSpinlock(p_CcNode->h_Spinlock, intFlags);
++
++ if (err != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ return E_OK;
++}
++
++t_Error FM_PCD_MatchTableGetIndexedHashBucket(t_Handle h_CcNode,
++ uint8_t keySize,
++ uint8_t *p_Key,
++ uint8_t hashShift,
++ t_Handle *p_CcNodeBucketHandle,
++ uint8_t *p_BucketIndex,
++ uint16_t *p_LastIndex)
++{
++ t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
++ uint16_t glblMask;
++ uint64_t crc64 = 0;
++
++ SANITY_CHECK_RETURN_ERROR(h_CcNode, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_CcNode->parseCode == CC_PC_GENERIC_IC_HASH_INDEXED, E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(p_Key, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_CcNodeBucketHandle, E_NULL_POINTER);
++
++ memcpy(&glblMask, PTR_MOVE(p_CcNode->p_GlblMask, 2), 2);
++
++ crc64 = crc64_init();
++ crc64 = crc64_compute(p_Key, keySize, crc64);
++ crc64 >>= hashShift;
++
++ *p_BucketIndex = (uint8_t)(((crc64 >> (8 * (6 - p_CcNode->userOffset))) & glblMask) >> 4);
++ if (*p_BucketIndex >= p_CcNode->numOfKeys)
++ RETURN_ERROR(MINOR, E_NOT_IN_RANGE, ("bucket index!"));
++
++ *p_CcNodeBucketHandle = p_CcNode->keyAndNextEngineParams[*p_BucketIndex].nextEngineParams.params.ccParams.h_CcNode;
++ if (!*p_CcNodeBucketHandle)
++ RETURN_ERROR(MINOR, E_NOT_FOUND, ("bucket!"));
++
++ *p_LastIndex = ((t_FmPcdCcNode *)*p_CcNodeBucketHandle)->numOfKeys;
++
++ return E_OK;
++}
++
++t_Handle FM_PCD_HashTableSet(t_Handle h_FmPcd, t_FmPcdHashTableParams *p_Param)
++{
++ t_FmPcdCcNode *p_CcNodeHashTbl;
++ t_FmPcdCcNodeParams *p_IndxHashCcNodeParam, *p_ExactMatchCcNodeParam;
++ t_Handle h_CcNode;
++ t_FmPcdCcKeyParams *p_HashKeyParams;
++ int i;
++ uint16_t numOfSets, numOfWays, countMask, onesCount = 0;
++
++ SANITY_CHECK_RETURN_VALUE(h_FmPcd, E_INVALID_HANDLE, NULL);
++ SANITY_CHECK_RETURN_VALUE(p_Param, E_NULL_POINTER, NULL);
++
++ if (p_Param->maxNumOfKeys == 0)
++ {
++ REPORT_ERROR(MINOR, E_INVALID_VALUE, ("Max number of keys must be higher then 0"));
++ return NULL;
++ }
++
++ if (p_Param->hashResMask == 0)
++ {
++ REPORT_ERROR(MINOR, E_INVALID_VALUE, ("Hash result mask must differ from 0"));
++ return NULL;
++ }
++
++#if (DPAA_VERSION >= 11)
++ if (p_Param->statisticsMode == e_FM_PCD_CC_STATS_MODE_RMON)
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE,
++ ("RMON statistics mode is not supported for hash table"));
++ return NULL;
++ }
++#endif /* (DPAA_VERSION >= 11) */
++
++ p_ExactMatchCcNodeParam = (t_FmPcdCcNodeParams*)XX_Malloc(sizeof(t_FmPcdCcNodeParams));
++ if (!p_ExactMatchCcNodeParam)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("p_ExactMatchCcNodeParam"));
++ return NULL;
++ }
++ memset(p_ExactMatchCcNodeParam, 0, sizeof(t_FmPcdCcNodeParams));
++
++ p_IndxHashCcNodeParam = (t_FmPcdCcNodeParams*)XX_Malloc(sizeof(t_FmPcdCcNodeParams));
++ if (!p_IndxHashCcNodeParam)
++ {
++ XX_Free(p_ExactMatchCcNodeParam);
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("p_IndxHashCcNodeParam"));
++ return NULL;
++ }
++ memset(p_IndxHashCcNodeParam, 0, sizeof(t_FmPcdCcNodeParams));
++
++ /* Calculate number of sets and number of ways of the hash table */
++ countMask = (uint16_t)(p_Param->hashResMask >> 4);
++ while (countMask)
++ {
++ onesCount++;
++ countMask = (uint16_t)(countMask >> 1);
++ }
++
++ numOfSets = (uint16_t)(1 << onesCount);
++ numOfWays = (uint16_t)DIV_CEIL(p_Param->maxNumOfKeys, numOfSets);
++
++ if (p_Param->maxNumOfKeys % numOfSets)
++ DBG(INFO, ("'maxNumOfKeys' is not a multiple of hash number of ways, so number of ways will be rounded up"));
++
++ /* Building exact-match node params, will be used to create the hash buckets */
++ p_ExactMatchCcNodeParam->extractCcParams.type = e_FM_PCD_EXTRACT_NON_HDR;
++
++ p_ExactMatchCcNodeParam->extractCcParams.extractNonHdr.src = e_FM_PCD_EXTRACT_FROM_KEY;
++ p_ExactMatchCcNodeParam->extractCcParams.extractNonHdr.action = e_FM_PCD_ACTION_EXACT_MATCH;
++ p_ExactMatchCcNodeParam->extractCcParams.extractNonHdr.offset = 0;
++ p_ExactMatchCcNodeParam->extractCcParams.extractNonHdr.size = p_Param->matchKeySize;
++
++ p_ExactMatchCcNodeParam->keysParams.maxNumOfKeys = numOfWays;
++ p_ExactMatchCcNodeParam->keysParams.maskSupport = FALSE;
++ p_ExactMatchCcNodeParam->keysParams.statisticsMode = p_Param->statisticsMode;
++ p_ExactMatchCcNodeParam->keysParams.numOfKeys = 0;
++ p_ExactMatchCcNodeParam->keysParams.keySize = p_Param->matchKeySize;
++ p_ExactMatchCcNodeParam->keysParams.ccNextEngineParamsForMiss = p_Param->ccNextEngineParamsForMiss;
++
++ p_HashKeyParams = p_IndxHashCcNodeParam->keysParams.keyParams;
++
++ for (i = 0; i < numOfSets; i++)
++ {
++ h_CcNode = FM_PCD_MatchTableSet(h_FmPcd, p_ExactMatchCcNodeParam);
++ if (!h_CcNode)
++ break;
++
++ p_HashKeyParams[i].ccNextEngineParams.nextEngine = e_FM_PCD_CC;
++ p_HashKeyParams[i].ccNextEngineParams.statisticsEn = FALSE;
++ p_HashKeyParams[i].ccNextEngineParams.params.ccParams.h_CcNode = h_CcNode;
++ }
++
++ if (i < numOfSets)
++ {
++ for (i = i-1; i >=0; i--)
++ FM_PCD_MatchTableDelete(p_HashKeyParams[i].ccNextEngineParams.params.ccParams.h_CcNode);
++
++ REPORT_ERROR(MAJOR, E_NULL_POINTER, NO_MSG);
++ XX_Free(p_IndxHashCcNodeParam);
++ XX_Free(p_ExactMatchCcNodeParam);
++ return NULL;
++ }
++
++ /* Creating indexed-hash CC node */
++ p_IndxHashCcNodeParam->extractCcParams.type = e_FM_PCD_EXTRACT_NON_HDR;
++ p_IndxHashCcNodeParam->extractCcParams.extractNonHdr.src = e_FM_PCD_EXTRACT_FROM_HASH;
++ p_IndxHashCcNodeParam->extractCcParams.extractNonHdr.action = e_FM_PCD_ACTION_INDEXED_LOOKUP;
++ p_IndxHashCcNodeParam->extractCcParams.extractNonHdr.icIndxMask = p_Param->hashResMask;
++ p_IndxHashCcNodeParam->extractCcParams.extractNonHdr.offset = p_Param->hashShift;
++ p_IndxHashCcNodeParam->extractCcParams.extractNonHdr.size = 2;
++
++ p_IndxHashCcNodeParam->keysParams.maxNumOfKeys = numOfSets;
++ p_IndxHashCcNodeParam->keysParams.maskSupport = FALSE;
++ p_IndxHashCcNodeParam->keysParams.statisticsMode = e_FM_PCD_CC_STATS_MODE_NONE;
++ p_IndxHashCcNodeParam->keysParams.numOfKeys = numOfSets; /* Number of keys of this node is number of sets of the hash */
++ p_IndxHashCcNodeParam->keysParams.keySize = 2;
++
++ p_CcNodeHashTbl = FM_PCD_MatchTableSet(h_FmPcd, p_IndxHashCcNodeParam);
++
++ XX_Free(p_IndxHashCcNodeParam);
++ XX_Free(p_ExactMatchCcNodeParam);
++
++ return p_CcNodeHashTbl;
++}
++
++t_Error FM_PCD_HashTableDelete(t_Handle h_HashTbl)
++{
++ t_FmPcdCcNode *p_HashTbl = (t_FmPcdCcNode *)h_HashTbl;
++ t_Handle *p_HashBuckets;
++ uint16_t i, numOfBuckets;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_HashTbl, E_INVALID_HANDLE);
++
++ numOfBuckets = p_HashTbl->numOfKeys;
++
++ p_HashBuckets = (t_Handle *)XX_Malloc(numOfBuckets * sizeof(t_Handle));
++ if (!p_HashBuckets)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, NO_MSG);
++
++ for (i = 0; i < numOfBuckets; i++)
++ p_HashBuckets[i] = p_HashTbl->keyAndNextEngineParams[i].nextEngineParams.params.ccParams.h_CcNode;
++
++ err = FM_PCD_MatchTableDelete(p_HashTbl);
++
++ for (i = 0; i < numOfBuckets; i++)
++ err |= FM_PCD_MatchTableDelete(p_HashBuckets[i]);
++
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ XX_Free(p_HashBuckets);
++
++ return E_OK;
++}
++
++t_Error FM_PCD_HashTableAddKey(t_Handle h_HashTbl,
++ uint8_t keySize,
++ t_FmPcdCcKeyParams *p_KeyParams)
++{
++ t_FmPcdCcNode *p_HashTbl = (t_FmPcdCcNode *)h_HashTbl;
++ t_Handle h_HashBucket;
++ uint8_t bucketIndex;
++ uint16_t lastIndex;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_HashTbl, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_KeyParams, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_KeyParams->p_Key, E_NULL_POINTER);
++
++ if (p_KeyParams->p_Mask)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Keys masks not supported for hash table"));
++
++ err = FM_PCD_MatchTableGetIndexedHashBucket(p_HashTbl,
++ keySize,
++ p_KeyParams->p_Key,
++ p_HashTbl->userOffset,
++ &h_HashBucket,
++ &bucketIndex,
++ &lastIndex);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ return FM_PCD_MatchTableAddKey(h_HashBucket,
++ FM_PCD_LAST_KEY_INDEX,
++ keySize,
++ p_KeyParams);
++}
++
++t_Error FM_PCD_HashTableRemoveKey(t_Handle h_HashTbl,
++ uint8_t keySize,
++ uint8_t *p_Key)
++{
++ t_FmPcdCcNode *p_HashTbl = (t_FmPcdCcNode *)h_HashTbl;
++ t_Handle h_HashBucket;
++ uint8_t bucketIndex;
++ uint16_t lastIndex;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_HashTbl, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Key, E_NULL_POINTER);
++
++ err = FM_PCD_MatchTableGetIndexedHashBucket(p_HashTbl,
++ keySize,
++ p_Key,
++ p_HashTbl->userOffset,
++ &h_HashBucket,
++ &bucketIndex,
++ &lastIndex);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ return FM_PCD_MatchTableFindNRemoveKey(h_HashBucket,
++ keySize,
++ p_Key,
++ NULL);
++}
++
++t_Error FM_PCD_HashTableModifyNextEngine(t_Handle h_HashTbl,
++ uint8_t keySize,
++ uint8_t *p_Key,
++ t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
++{
++ t_FmPcdCcNode *p_HashTbl = (t_FmPcdCcNode *)h_HashTbl;
++ t_Handle h_HashBucket;
++ uint8_t bucketIndex;
++ uint16_t lastIndex;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_HashTbl, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Key, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcdCcNextEngineParams, E_NULL_POINTER);
++
++ err = FM_PCD_MatchTableGetIndexedHashBucket(p_HashTbl,
++ keySize,
++ p_Key,
++ p_HashTbl->userOffset,
++ &h_HashBucket,
++ &bucketIndex,
++ &lastIndex);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ return FM_PCD_MatchTableFindNModifyNextEngine(h_HashBucket,
++ keySize,
++ p_Key,
++ NULL,
++ p_FmPcdCcNextEngineParams);
++}
++
++t_Error FM_PCD_HashTableModifyMissNextEngine(t_Handle h_HashTbl,
++ t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
++{
++ t_FmPcdCcNode *p_HashTbl = (t_FmPcdCcNode *)h_HashTbl;
++ t_Handle h_HashBucket;
++ uint8_t i;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(h_HashTbl, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcdCcNextEngineParams, E_NULL_POINTER);
++
++ for (i = 0; i < p_HashTbl->numOfKeys; i++)
++ {
++ h_HashBucket = p_HashTbl->keyAndNextEngineParams[i].nextEngineParams.params.ccParams.h_CcNode;
++
++ err = FM_PCD_MatchTableModifyMissNextEngine(h_HashBucket,
++ p_FmPcdCcNextEngineParams);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ return E_OK;
++}
++
++
++t_Error FM_PCD_HashTableGetMissNextEngine(t_Handle h_HashTbl,
++ t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
++{
++ t_FmPcdCcNode *p_HashTbl = (t_FmPcdCcNode *)h_HashTbl;
++ t_FmPcdCcNode *p_HashBucket;
++
++ SANITY_CHECK_RETURN_ERROR(p_HashTbl, E_INVALID_HANDLE);
++
++ /* Miss next engine of each bucket was initialized with the next engine of the hash table */
++ p_HashBucket = p_HashTbl->keyAndNextEngineParams[0].nextEngineParams.params.ccParams.h_CcNode;
++
++ memcpy(p_FmPcdCcNextEngineParams,
++ &p_HashBucket->keyAndNextEngineParams[p_HashBucket->numOfKeys].nextEngineParams,
++ sizeof(t_FmPcdCcNextEngineParams));
++
++ return E_OK;
++}
++
++t_Error FM_PCD_HashTableFindNGetKeyStatistics(t_Handle h_HashTbl,
++ uint8_t keySize,
++ uint8_t *p_Key,
++ t_FmPcdCcKeyStatistics *p_KeyStatistics)
++{
++ t_FmPcdCcNode *p_HashTbl = (t_FmPcdCcNode *)h_HashTbl;
++ t_Handle h_HashBucket;
++ uint8_t bucketIndex;
++ uint16_t lastIndex;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_HashTbl, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Key, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_KeyStatistics, E_NULL_POINTER);
++
++ err = FM_PCD_MatchTableGetIndexedHashBucket(p_HashTbl,
++ keySize,
++ p_Key,
++ p_HashTbl->userOffset,
++ &h_HashBucket,
++ &bucketIndex,
++ &lastIndex);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ return FM_PCD_MatchTableFindNGetKeyStatistics(h_HashBucket,
++ keySize,
++ p_Key,
++ NULL,
++ p_KeyStatistics);
++}
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_cc.h b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_cc.h
+new file mode 100644
+index 0000000..9efe721
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_cc.h
+@@ -0,0 +1,390 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File fm_cc.h
++
++ @Description FM PCD CC ...
++*//***************************************************************************/
++#ifndef __FM_CC_H
++#define __FM_CC_H
++
++#include "std_ext.h"
++#include "error_ext.h"
++#include "list_ext.h"
++
++#include "fm_pcd.h"
++
++
++/***********************************************************************/
++/* Coarse classification defines */
++/***********************************************************************/
++
++#define CC_MAX_NUM_OF_KEYS MAX(FM_PCD_MAX_NUM_OF_KEYS + 1, FM_PCD_MAX_NUM_OF_FLOWS)
++
++#define CC_PC_FF_MACDST 0x00
++#define CC_PC_FF_MACSRC 0x01
++#define CC_PC_FF_ETYPE 0x02
++
++#define CC_PC_FF_TCI1 0x03
++#define CC_PC_FF_TCI2 0x04
++
++#define CC_PC_FF_MPLS1 0x06
++#define CC_PC_FF_MPLS_LAST 0x07
++
++#define CC_PC_FF_IPV4DST1 0x08
++#define CC_PC_FF_IPV4DST2 0x16
++#define CC_PC_FF_IPV4IPTOS_TC1 0x09
++#define CC_PC_FF_IPV4IPTOS_TC2 0x17
++#define CC_PC_FF_IPV4PTYPE1 0x0A
++#define CC_PC_FF_IPV4PTYPE2 0x18
++#define CC_PC_FF_IPV4SRC1 0x0b
++#define CC_PC_FF_IPV4SRC2 0x19
++#define CC_PC_FF_IPV4SRC1_IPV4DST1 0x0c
++#define CC_PC_FF_IPV4SRC2_IPV4DST2 0x1a
++#define CC_PC_FF_IPV4TTL 0x29
++
++
++#define CC_PC_FF_IPTOS_IPV6TC1_IPV6FLOW1 0x0d /*TODO - CLASS - what is it? TOS*/
++#define CC_PC_FF_IPTOS_IPV6TC2_IPV6FLOW2 0x1b
++#define CC_PC_FF_IPV6PTYPE1 0x0e
++#define CC_PC_FF_IPV6PTYPE2 0x1c
++#define CC_PC_FF_IPV6DST1 0x0f
++#define CC_PC_FF_IPV6DST2 0x1d
++#define CC_PC_FF_IPV6SRC1 0x10
++#define CC_PC_FF_IPV6SRC2 0x1e
++#define CC_PC_FF_IPV6HOP_LIMIT 0x2a
++#define CC_PC_FF_IPPID 0x24
++#define CC_PC_FF_IPDSCP 0x76
++
++#define CC_PC_FF_GREPTYPE 0x11
++
++#define CC_PC_FF_MINENCAP_PTYPE 0x12
++#define CC_PC_FF_MINENCAP_IPDST 0x13
++#define CC_PC_FF_MINENCAP_IPSRC 0x14
++#define CC_PC_FF_MINENCAP_IPSRC_IPDST 0x15
++
++#define CC_PC_FF_L4PSRC 0x1f
++#define CC_PC_FF_L4PDST 0x20
++#define CC_PC_FF_L4PSRC_L4PDST 0x21
++
++#define CC_PC_FF_PPPPID 0x05
++
++#define CC_PC_PR_SHIM1 0x22
++#define CC_PC_PR_SHIM2 0x23
++
++#define CC_PC_GENERIC_WITHOUT_MASK 0x27
++#define CC_PC_GENERIC_WITH_MASK 0x28
++#define CC_PC_GENERIC_IC_GMASK 0x2B
++#define CC_PC_GENERIC_IC_HASH_INDEXED 0x2C
++
++#define CC_PR_OFFSET 0x25
++#define CC_PR_WITHOUT_OFFSET 0x26
++
++#define CC_PC_PR_ETH_OFFSET 19
++#define CC_PC_PR_USER_DEFINED_SHIM1_OFFSET 16
++#define CC_PC_PR_USER_DEFINED_SHIM2_OFFSET 17
++#define CC_PC_PR_USER_LLC_SNAP_OFFSET 20
++#define CC_PC_PR_VLAN1_OFFSET 21
++#define CC_PC_PR_VLAN2_OFFSET 22
++#define CC_PC_PR_PPPOE_OFFSET 24
++#define CC_PC_PR_MPLS1_OFFSET 25
++#define CC_PC_PR_MPLS_LAST_OFFSET 26
++#define CC_PC_PR_IP1_OFFSET 27
++#define CC_PC_PR_IP_LAST_OFFSET 28
++#define CC_PC_PR_MINENC_OFFSET 28
++#define CC_PC_PR_L4_OFFSET 30
++#define CC_PC_PR_GRE_OFFSET 29
++#define CC_PC_PR_ETYPE_LAST_OFFSET 23
++#define CC_PC_PR_NEXT_HEADER_OFFSET 31
++
++#define CC_PC_ILLEGAL 0xff
++#define CC_SIZE_ILLEGAL 0
++
++#define FM_PCD_CC_KEYS_MATCH_TABLE_ALIGN 16
++#define FM_PCD_CC_AD_TABLE_ALIGN 16
++#define FM_PCD_CC_AD_ENTRY_SIZE 16
++#define FM_PCD_CC_NUM_OF_KEYS 255
++#define FM_PCD_CC_TREE_ADDR_ALIGN 256
++
++#define FM_PCD_AD_RESULT_CONTRL_FLOW_TYPE 0x00000000
++#define FM_PCD_AD_RESULT_DATA_FLOW_TYPE 0x80000000
++#define FM_PCD_AD_RESULT_PLCR_DIS 0x20000000
++#define FM_PCD_AD_RESULT_EXTENDED_MODE 0x80000000
++#define FM_PCD_AD_RESULT_NADEN 0x20000000
++#define FM_PCD_AD_RESULT_STATISTICS_EN 0x40000000
++
++#define FM_PCD_AD_CONT_LOOKUP_TYPE 0x40000000
++#define FM_PCD_AD_CONT_LOOKUP_LCL_MASK 0x00800000
++
++#define FM_PCD_AD_STATS_TYPE 0x40000000
++#define FM_PCD_AD_STATS_FLR_ADDR_MASK 0x00FFFFFF
++#define FM_PCD_AD_STATS_COUNTERS_ADDR_MASK 0x00FFFFFF
++#define FM_PCD_AD_STATS_NEXT_ACTION_MASK 0xFFFF0000
++#define FM_PCD_AD_STATS_NEXT_ACTION_SHIFT 12
++#define FM_PCD_AD_STATS_NAD_EN 0x00008000
++#define FM_PCD_AD_STATS_OP_CODE 0x00000036
++#define FM_PCD_AD_STATS_FLR_EN 0x00004000
++#define FM_PCD_AD_STATS_COND_EN 0x00002000
++
++
++
++#define FM_PCD_AD_BYPASS_TYPE 0xc0000000
++
++#define FM_PCD_AD_TYPE_MASK 0xc0000000
++#define FM_PCD_AD_OPCODE_MASK 0x0000000f
++
++#define FM_PCD_AD_PROFILEID_FOR_CNTRL_SHIFT 16
++#if (DPAA_VERSION >= 11)
++#define FM_PCD_AD_RESULT_VSP_SHIFT 24
++#define FM_PCD_AD_RESULT_NO_OM_VSPE 0x02000000
++#define FM_PCD_AD_RESULT_VSP_MASK 0x3f
++#define FM_PCD_AD_NCSPFQIDM_MASK 0x80000000
++#endif /* (DPAA_VERSION >= 11) */
++
++#define GLBL_MASK_FOR_HASH_INDEXED 0xfff00000
++#define CC_GLBL_MASK_SIZE 4
++
++typedef uint32_t ccPrivateInfo_t; /**< private info of CC: */
++
++#define CC_PRIVATE_INFO_NONE 0
++#define CC_PRIVATE_INFO_IC_HASH_INDEX_LOOKUP 0x80000000
++#define CC_PRIVATE_INFO_IC_HASH_EXACT_MATCH 0x40000000
++#define CC_PRIVATE_INFO_IC_KEY_EXACT_MATCH 0x20000000
++#define CC_PRIVATE_INFO_IC_DEQ_FQID_INDEX_LOOKUP 0x10000000
++
++/***********************************************************************/
++/* Memory map */
++/***********************************************************************/
++#if defined(__MWERKS__) && !defined(__GNUC__)
++#pragma pack(push,1)
++#endif /* defined(__MWERKS__) && ... */
++
++typedef _Packed struct
++{
++ volatile uint32_t fqid;
++ volatile uint32_t plcrProfile;
++ volatile uint32_t nia;
++ volatile uint32_t res;
++} _PackedType t_AdOfTypeResult;
++
++typedef _Packed struct
++{
++ volatile uint32_t ccAdBase;
++ volatile uint32_t matchTblPtr;
++ volatile uint32_t pcAndOffsets;
++ volatile uint32_t gmask;
++} _PackedType t_AdOfTypeContLookup;
++
++typedef _Packed struct
++{
++ volatile uint32_t profileTableAddr;
++ volatile uint32_t reserved;
++ volatile uint32_t nextActionIndx;
++ volatile uint32_t statsTableAddr;
++} _PackedType t_AdOfTypeStats;
++
++typedef _Packed union
++{
++ volatile t_AdOfTypeResult adResult;
++ volatile t_AdOfTypeContLookup adContLookup;
++} _PackedType t_Ad;
++
++#if defined(__MWERKS__) && !defined(__GNUC__)
++#pragma pack(pop)
++#endif /* defined(__MWERKS__) && ... */
++
++
++/***********************************************************************/
++/* Driver's internal structures */
++/***********************************************************************/
++
++typedef enum e_ModifyState
++{
++ e_MODIFY_STATE_ADD = 0,
++ e_MODIFY_STATE_REMOVE,
++ e_MODIFY_STATE_CHANGE
++} e_ModifyState;
++
++typedef struct t_FmPcdStatsObj
++{
++ t_Handle h_StatsAd;
++ t_Handle h_StatsCounters;
++ t_List node;
++} t_FmPcdStatsObj;
++
++typedef struct
++{
++ uint8_t key[FM_PCD_MAX_SIZE_OF_KEY];
++ uint8_t mask[FM_PCD_MAX_SIZE_OF_KEY];
++
++ t_FmPcdCcNextEngineParams nextEngineParams;
++ uint32_t requiredAction;
++ uint32_t shadowAction;
++
++ t_FmPcdStatsObj *p_StatsObj;
++
++} t_FmPcdCcKeyAndNextEngineParams;
++
++typedef struct
++{
++ t_Handle p_Ad;
++ e_FmPcdEngine fmPcdEngine;
++ bool adAllocated;
++ bool isTree;
++
++ uint32_t myInfo;
++ t_List *h_CcNextNodesLst;
++ t_Handle h_AdditionalInfo;
++ t_Handle h_Node;
++} t_FmPcdModifyCcAdditionalParams;
++
++typedef struct
++{
++ t_Handle p_AdTableNew;
++ t_Handle p_KeysMatchTableNew;
++ t_Handle p_AdTableOld;
++ t_Handle p_KeysMatchTableOld;
++ uint16_t numOfKeys;
++ t_Handle h_CurrentNode;
++ uint16_t savedKeyIndex;
++ t_Handle h_NodeForAdd;
++ t_Handle h_NodeForRmv;
++ t_Handle h_ManipForRmv;
++ t_Handle h_ManipForAdd;
++ t_FmPcdStatsObj *p_StatsObjForRmv;
++#if (DPAA_VERSION >= 11)
++ t_Handle h_FrmReplicForAdd;
++ t_Handle h_FrmReplicForRmv;
++#endif /* (DPAA_VERSION >= 11) */
++ bool tree;
++
++ t_FmPcdCcKeyAndNextEngineParams keyAndNextEngineParams[CC_MAX_NUM_OF_KEYS];
++} t_FmPcdModifyCcKeyAdditionalParams;
++
++typedef struct
++{
++ t_Handle h_Manip;
++ t_Handle h_CcNode;
++} t_CcNextEngineInfo;
++
++typedef struct
++{
++ uint16_t numOfKeys;
++ uint16_t maxNumOfKeys;
++
++ bool maskSupport;
++ uint32_t keysMatchTableMaxSize;
++
++ e_FmPcdCcStatsMode statisticsMode;
++ uint32_t numOfStatsFLRs;
++ uint32_t countersArraySize;
++
++ bool glblMaskUpdated;
++ t_Handle p_GlblMask;
++ bool lclMask;
++ uint8_t parseCode;
++ uint8_t offset;
++ uint8_t prsArrayOffset;
++ bool ctrlFlow;
++ uint8_t owners;
++
++ uint8_t ccKeySizeAccExtraction;
++ uint8_t sizeOfExtraction;
++ uint8_t glblMaskSize;
++
++ t_Handle h_KeysMatchTable;
++ t_Handle h_AdTable;
++ t_Handle h_StatsAds;
++ t_Handle h_Ad;
++ t_Handle h_StatsFLRs;
++
++ t_List availableStatsLst;
++
++ t_List ccPrevNodesLst;
++
++ t_List ccTreeIdLst;
++ t_List ccTreesLst;
++
++ t_Handle h_FmPcd;
++ uint32_t shadowAction;
++ uint8_t userSizeOfExtraction;
++ uint8_t userOffset;
++
++ t_Handle h_Spinlock;
++
++ t_FmPcdCcKeyAndNextEngineParams keyAndNextEngineParams[CC_MAX_NUM_OF_KEYS];
++} t_FmPcdCcNode;
++
++typedef struct
++{
++ t_FmPcdCcNode *p_FmPcdCcNode;
++ bool occupied;
++ uint8_t owners;
++ volatile bool lock;
++} t_FmPcdCcNodeArray;
++
++typedef struct
++{
++ uint8_t numOfEntriesInGroup;
++ uint32_t totalBitsMask;
++ uint8_t baseGroupEntry;
++} t_FmPcdCcGroupParam;
++
++typedef struct
++{
++ t_Handle h_FmPcd;
++ uint8_t netEnvId;
++ uintptr_t ccTreeBaseAddr;
++ uint8_t numOfGrps;
++ t_FmPcdCcGroupParam fmPcdGroupParam[FM_PCD_MAX_NUM_OF_CC_GROUPS];
++ t_List fmPortsLst;
++ t_FmPcdLock *p_Lock;
++ uint8_t numOfEntries;
++ uint8_t owners;
++ t_Handle h_FmPcdCcSavedManipParams;
++ bool modifiedState;
++ uint32_t requiredAction;
++ t_Handle h_IpReassemblyManip;
++
++ t_FmPcdCcKeyAndNextEngineParams keyAndNextEngineParams[FM_PCD_MAX_NUM_OF_CC_GROUPS];
++} t_FmPcdCcTree;
++
++
++bool FmPcdManipIsManipNode(t_Handle h_Ad);
++t_Error FmPcdCcNodeTreeTryLock(t_Handle h_FmPcd,t_Handle h_FmPcdCcNode, t_List *p_List);
++void FmPcdCcNodeTreeReleaseLock(t_Handle h_FmPcd, t_List *p_List);
++t_Error FmPcdUpdateCcShadow (t_FmPcd *p_FmPcd, uint32_t size, uint32_t align);
++
++
++#endif /* __FM_CC_H */
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_kg.c b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_kg.c
+new file mode 100644
+index 0000000..bdbc8ae
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_kg.c
+@@ -0,0 +1,3263 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File fm_kg.c
++
++ @Description FM PCD ...
++*//***************************************************************************/
++#include "std_ext.h"
++#include "error_ext.h"
++#include "string_ext.h"
++#include "debug_ext.h"
++#include "net_ext.h"
++#include "fm_port_ext.h"
++
++#include "fm_common.h"
++#include "fm_pcd.h"
++#include "fm_hc.h"
++#include "fm_pcd_ipc.h"
++#include "fm_kg.h"
++#include "fsl_fman_kg.h"
++
++
++/****************************************/
++/* static functions */
++/****************************************/
++
++static uint32_t KgHwLock(t_Handle h_FmPcdKg)
++{
++ ASSERT_COND(h_FmPcdKg);
++ return XX_LockIntrSpinlock(((t_FmPcdKg *)h_FmPcdKg)->h_HwSpinlock);
++}
++
++static void KgHwUnlock(t_Handle h_FmPcdKg, uint32_t intFlags)
++{
++ ASSERT_COND(h_FmPcdKg);
++ XX_UnlockIntrSpinlock(((t_FmPcdKg *)h_FmPcdKg)->h_HwSpinlock, intFlags);
++}
++
++static uint32_t KgSchemeLock(t_Handle h_Scheme)
++{
++ ASSERT_COND(h_Scheme);
++ return FmPcdLockSpinlock(((t_FmPcdKgScheme *)h_Scheme)->p_Lock);
++}
++
++static void KgSchemeUnlock(t_Handle h_Scheme, uint32_t intFlags)
++{
++ ASSERT_COND(h_Scheme);
++ FmPcdUnlockSpinlock(((t_FmPcdKgScheme *)h_Scheme)->p_Lock, intFlags);
++}
++
++static bool KgSchemeFlagTryLock(t_Handle h_Scheme)
++{
++ ASSERT_COND(h_Scheme);
++ return FmPcdLockTryLock(((t_FmPcdKgScheme *)h_Scheme)->p_Lock);
++}
++
++static void KgSchemeFlagUnlock(t_Handle h_Scheme)
++{
++ ASSERT_COND(h_Scheme);
++ FmPcdLockUnlock(((t_FmPcdKgScheme *)h_Scheme)->p_Lock);
++}
++
++static t_Error WriteKgarWait(t_FmPcd *p_FmPcd, uint32_t fmkg_ar)
++{
++
++ struct fman_kg_regs *regs = p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs;
++
++ if (fman_kg_write_ar_wait(regs, fmkg_ar))
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Keygen scheme access violation"));
++
++ return E_OK;
++}
++
++static e_FmPcdKgExtractDfltSelect GetGenericSwDefault(t_FmPcdKgExtractDflt swDefaults[], uint8_t numOfSwDefaults, uint8_t code)
++{
++ int i;
++
++ switch (code)
++ {
++ case (KG_SCH_GEN_PARSE_RESULT_N_FQID):
++ case (KG_SCH_GEN_DEFAULT):
++ case (KG_SCH_GEN_NEXTHDR):
++ for (i=0 ; ifmRevInfo.majorRev < 6)
++ return KG_SCH_KN_PTYPE2;
++#endif /* FM_KG_NO_IPPID_SUPPORT */
++ return KG_SCH_KN_IPPID;
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv6 index"));
++ return 0;
++ case (NET_HEADER_FIELD_IPv6_VER | NET_HEADER_FIELD_IPv6_FL | NET_HEADER_FIELD_IPv6_TC):
++ if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
++ return (KG_SCH_KN_IPV6FL1 | KG_SCH_KN_IPTOS_TC1);
++ if ((index == e_FM_PCD_HDR_INDEX_2) || (index == e_FM_PCD_HDR_INDEX_LAST))
++ return (KG_SCH_KN_IPV6FL2 | KG_SCH_KN_IPTOS_TC2);
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv6 index"));
++ return 0;
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return 0;
++ }
++ case (HEADER_TYPE_GRE):
++ switch (field.gre)
++ {
++ case (NET_HEADER_FIELD_GRE_TYPE):
++ return KG_SCH_KN_GREPTYPE;
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return 0;
++ }
++ case (HEADER_TYPE_MINENCAP):
++ switch (field.minencap)
++ {
++ case (NET_HEADER_FIELD_MINENCAP_SRC_IP):
++ return KG_SCH_KN_IPSRC2;
++ case (NET_HEADER_FIELD_MINENCAP_DST_IP):
++ return KG_SCH_KN_IPDST2;
++ case (NET_HEADER_FIELD_MINENCAP_TYPE):
++ return KG_SCH_KN_PTYPE2;
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return 0;
++ }
++ case (HEADER_TYPE_TCP):
++ switch (field.tcp)
++ {
++ case (NET_HEADER_FIELD_TCP_PORT_SRC):
++ return KG_SCH_KN_L4PSRC;
++ case (NET_HEADER_FIELD_TCP_PORT_DST):
++ return KG_SCH_KN_L4PDST;
++ case (NET_HEADER_FIELD_TCP_FLAGS):
++ return KG_SCH_KN_TFLG;
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return 0;
++ }
++ case (HEADER_TYPE_UDP):
++ switch (field.udp)
++ {
++ case (NET_HEADER_FIELD_UDP_PORT_SRC):
++ return KG_SCH_KN_L4PSRC;
++ case (NET_HEADER_FIELD_UDP_PORT_DST):
++ return KG_SCH_KN_L4PDST;
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return 0;
++ }
++ case (HEADER_TYPE_IPSEC_AH):
++ switch (field.ipsecAh)
++ {
++ case (NET_HEADER_FIELD_IPSEC_AH_SPI):
++ return KG_SCH_KN_IPSEC_SPI;
++ case (NET_HEADER_FIELD_IPSEC_AH_NH):
++ return KG_SCH_KN_IPSEC_NH;
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return 0;
++ }
++ case (HEADER_TYPE_IPSEC_ESP):
++ switch (field.ipsecEsp)
++ {
++ case (NET_HEADER_FIELD_IPSEC_ESP_SPI):
++ return KG_SCH_KN_IPSEC_SPI;
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return 0;
++ }
++ case (HEADER_TYPE_SCTP):
++ switch (field.sctp)
++ {
++ case (NET_HEADER_FIELD_SCTP_PORT_SRC):
++ return KG_SCH_KN_L4PSRC;
++ case (NET_HEADER_FIELD_SCTP_PORT_DST):
++ return KG_SCH_KN_L4PDST;
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return 0;
++ }
++ case (HEADER_TYPE_DCCP):
++ switch (field.dccp)
++ {
++ case (NET_HEADER_FIELD_DCCP_PORT_SRC):
++ return KG_SCH_KN_L4PSRC;
++ case (NET_HEADER_FIELD_DCCP_PORT_DST):
++ return KG_SCH_KN_L4PDST;
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return 0;
++ }
++ case (HEADER_TYPE_PPPoE):
++ switch (field.pppoe)
++ {
++ case (NET_HEADER_FIELD_PPPoE_PID):
++ return KG_SCH_KN_PPPID;
++ case (NET_HEADER_FIELD_PPPoE_SID):
++ return KG_SCH_KN_PPPSID;
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return 0;
++ }
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
++ return 0;
++ }
++}
++
++
++static uint8_t GetKnownFieldId(uint32_t bitMask)
++{
++ uint8_t cnt = 0;
++
++ while (bitMask)
++ if (bitMask & 0x80000000)
++ break;
++ else
++ {
++ cnt++;
++ bitMask <<= 1;
++ }
++ return cnt;
++
++}
++
++static uint8_t GetExtractedOrMask(uint8_t bitOffset, bool fqid)
++{
++ uint8_t i, mask, numOfOnesToClear, walking1Mask = 1;
++
++ /* bitOffset 1-7 --> mask 0x1-0x7F */
++ if (bitOffset<8)
++ {
++ mask = 0;
++ for (i = 0 ; i < bitOffset ; i++, walking1Mask <<= 1)
++ mask |= walking1Mask;
++ }
++ else
++ {
++ mask = 0xFF;
++ numOfOnesToClear = 0;
++ if (fqid && bitOffset>24)
++ /* bitOffset 25-31 --> mask 0xFE-0x80 */
++ numOfOnesToClear = (uint8_t)(bitOffset-24);
++ else
++ /* bitOffset 9-15 --> mask 0xFE-0x80 */
++ if (!fqid && bitOffset>8)
++ numOfOnesToClear = (uint8_t)(bitOffset-8);
++ for (i = 0 ; i < numOfOnesToClear ; i++, walking1Mask <<= 1)
++ mask &= ~walking1Mask;
++ /* bitOffset 8-24 for FQID, 8 for PP --> no mask (0xFF)*/
++ }
++ return mask;
++}
++
++static void IncSchemeOwners(t_FmPcd *p_FmPcd, t_FmPcdKgInterModuleBindPortToSchemes *p_BindPort)
++{
++ t_FmPcdKg *p_FmPcdKg;
++ t_FmPcdKgScheme *p_Scheme;
++ uint32_t intFlags;
++ uint8_t relativeSchemeId;
++ int i;
++
++ p_FmPcdKg = p_FmPcd->p_FmPcdKg;
++
++ /* for each scheme - update owners counters */
++ for (i = 0; i < p_BindPort->numOfSchemes; i++)
++ {
++ relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmPcd, p_BindPort->schemesIds[i]);
++ ASSERT_COND(relativeSchemeId < FM_PCD_KG_NUM_OF_SCHEMES);
++
++ p_Scheme = &p_FmPcdKg->schemes[relativeSchemeId];
++
++ /* increment owners number */
++ intFlags = KgSchemeLock(p_Scheme);
++ p_Scheme->owners++;
++ KgSchemeUnlock(p_Scheme, intFlags);
++ }
++}
++
++static void DecSchemeOwners(t_FmPcd *p_FmPcd, t_FmPcdKgInterModuleBindPortToSchemes *p_BindPort)
++{
++ t_FmPcdKg *p_FmPcdKg;
++ t_FmPcdKgScheme *p_Scheme;
++ uint32_t intFlags;
++ uint8_t relativeSchemeId;
++ int i;
++
++ p_FmPcdKg = p_FmPcd->p_FmPcdKg;
++
++ /* for each scheme - update owners counters */
++ for (i = 0; i < p_BindPort->numOfSchemes; i++)
++ {
++ relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmPcd, p_BindPort->schemesIds[i]);
++ ASSERT_COND(relativeSchemeId < FM_PCD_KG_NUM_OF_SCHEMES);
++
++ p_Scheme = &p_FmPcdKg->schemes[relativeSchemeId];
++
++ /* increment owners number */
++ ASSERT_COND(p_Scheme->owners);
++ intFlags = KgSchemeLock(p_Scheme);
++ p_Scheme->owners--;
++ KgSchemeUnlock(p_Scheme, intFlags);
++ }
++}
++
++static void UpateSchemePointedOwner(t_FmPcdKgScheme *p_Scheme, bool add)
++{
++ /* this routine is locked by the calling routine */
++ ASSERT_COND(p_Scheme);
++ ASSERT_COND(p_Scheme->valid);
++
++ if (add)
++ p_Scheme->pointedOwners++;
++ else
++ p_Scheme->pointedOwners--;
++}
++
++static t_Error KgWriteSp(t_FmPcd *p_FmPcd, uint8_t hardwarePortId, uint32_t spReg, bool add)
++{
++ struct fman_kg_regs *p_KgRegs;
++
++ uint32_t tmpKgarReg = 0, intFlags;
++ t_Error err = E_OK;
++
++ /* The calling routine had locked the port, so for each port only one core can access
++ * (so we don't need a lock here) */
++
++ if (p_FmPcd->h_Hc)
++ return FmHcKgWriteSp(p_FmPcd->h_Hc, hardwarePortId, spReg, add);
++
++ p_KgRegs = p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs;
++
++ tmpKgarReg = FmPcdKgBuildReadPortSchemeBindActionReg(hardwarePortId);
++ /* lock a common KG reg */
++ intFlags = KgHwLock(p_FmPcd->p_FmPcdKg);
++ err = WriteKgarWait(p_FmPcd, tmpKgarReg);
++ if (err)
++ {
++ KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
++ RETURN_ERROR(MINOR, err, NO_MSG);
++ }
++
++ fman_kg_write_sp(p_KgRegs, spReg, add);
++
++ tmpKgarReg = FmPcdKgBuildWritePortSchemeBindActionReg(hardwarePortId);
++
++ err = WriteKgarWait(p_FmPcd, tmpKgarReg);
++ KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
++ return err;
++}
++
++static t_Error KgWriteCpp(t_FmPcd *p_FmPcd, uint8_t hardwarePortId, uint32_t cppReg)
++{
++ struct fman_kg_regs *p_KgRegs;
++ uint32_t tmpKgarReg, intFlags;
++ t_Error err;
++
++ p_KgRegs = p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs;
++
++ if (p_FmPcd->h_Hc)
++ {
++ err = FmHcKgWriteCpp(p_FmPcd->h_Hc, hardwarePortId, cppReg);
++ return err;
++ }
++
++ intFlags = KgHwLock(p_FmPcd->p_FmPcdKg);
++ fman_kg_write_cpp(p_KgRegs, cppReg);
++ tmpKgarReg = FmPcdKgBuildWritePortClsPlanBindActionReg(hardwarePortId);
++ err = WriteKgarWait(p_FmPcd, tmpKgarReg);
++ KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
++
++ return err;
++}
++
++static uint32_t BuildCppReg(t_FmPcd *p_FmPcd, uint8_t clsPlanGrpId)
++{
++ uint32_t tmpKgpeCpp;
++
++ tmpKgpeCpp = (uint32_t)(p_FmPcd->p_FmPcdKg->clsPlanGrps[clsPlanGrpId].baseEntry / 8);
++ tmpKgpeCpp |= (uint32_t)(((p_FmPcd->p_FmPcdKg->clsPlanGrps[clsPlanGrpId].sizeOfGrp / 8) - 1) << FM_KG_PE_CPP_MASK_SHIFT);
++
++ return tmpKgpeCpp;
++}
++
++static t_Error BindPortToClsPlanGrp(t_FmPcd *p_FmPcd, uint8_t hardwarePortId, uint8_t clsPlanGrpId)
++{
++ uint32_t tmpKgpeCpp = 0;
++
++ tmpKgpeCpp = BuildCppReg(p_FmPcd, clsPlanGrpId);
++ return KgWriteCpp(p_FmPcd, hardwarePortId, tmpKgpeCpp);
++}
++
++static void UnbindPortToClsPlanGrp(t_FmPcd *p_FmPcd, uint8_t hardwarePortId)
++{
++ KgWriteCpp(p_FmPcd, hardwarePortId, 0);
++}
++
++static uint32_t ReadClsPlanBlockActionReg(uint8_t grpId)
++{
++ return (uint32_t)(FM_KG_KGAR_GO |
++ FM_KG_KGAR_READ |
++ FM_PCD_KG_KGAR_SEL_CLS_PLAN_ENTRY |
++ DUMMY_PORT_ID |
++ ((uint32_t)grpId << FM_PCD_KG_KGAR_NUM_SHIFT) |
++ FM_PCD_KG_KGAR_WSEL_MASK);
++
++ /* if we ever want to write 1 by 1, use:
++ sel = (uint8_t)(0x01 << (7- (entryId % CLS_PLAN_NUM_PER_GRP)));
++ */
++}
++
++static void PcdKgErrorException(t_Handle h_FmPcd)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++ uint32_t event,schemeIndexes = 0, index = 0;
++ struct fman_kg_regs *p_KgRegs;
++
++ ASSERT_COND(FmIsMaster(p_FmPcd->h_Fm));
++ p_KgRegs = p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs;
++ fman_kg_get_event(p_KgRegs, &event, &schemeIndexes);
++
++ if (event & FM_EX_KG_DOUBLE_ECC)
++ p_FmPcd->f_Exception(p_FmPcd->h_App,e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC);
++ if (event & FM_EX_KG_KEYSIZE_OVERFLOW)
++ {
++ if (schemeIndexes)
++ {
++ while (schemeIndexes)
++ {
++ if (schemeIndexes & 0x1)
++ p_FmPcd->f_FmPcdIndexedException(p_FmPcd->h_App,e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW, (uint16_t)(31 - index));
++ schemeIndexes >>= 1;
++ index+=1;
++ }
++ }
++ else /* this should happen only when interrupt is forced. */
++ p_FmPcd->f_Exception(p_FmPcd->h_App,e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW);
++ }
++}
++
++static t_Error KgInitGuest(t_FmPcd *p_FmPcd)
++{
++ t_Error err = E_OK;
++ t_FmPcdIpcKgSchemesParams kgAlloc;
++ uint32_t replyLength;
++ t_FmPcdIpcReply reply;
++ t_FmPcdIpcMsg msg;
++
++ ASSERT_COND(p_FmPcd->guestId != NCSW_MASTER_ID);
++
++ /* in GUEST_PARTITION, we use the IPC */
++ memset(&reply, 0, sizeof(reply));
++ memset(&msg, 0, sizeof(msg));
++ memset(&kgAlloc, 0, sizeof(t_FmPcdIpcKgSchemesParams));
++ kgAlloc.numOfSchemes = p_FmPcd->p_FmPcdKg->numOfSchemes;
++ kgAlloc.guestId = p_FmPcd->guestId;
++ msg.msgId = FM_PCD_ALLOC_KG_SCHEMES;
++ memcpy(msg.msgBody, &kgAlloc, sizeof(kgAlloc));
++ replyLength = sizeof(uint32_t) + p_FmPcd->p_FmPcdKg->numOfSchemes*sizeof(uint8_t);
++ if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
++ (uint8_t*)&msg,
++ sizeof(msg.msgId) + sizeof(kgAlloc),
++ (uint8_t*)&reply,
++ &replyLength,
++ NULL,
++ NULL)) != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ if (replyLength != (sizeof(uint32_t) + p_FmPcd->p_FmPcdKg->numOfSchemes*sizeof(uint8_t)))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
++ memcpy(p_FmPcd->p_FmPcdKg->schemesIds, (uint8_t*)(reply.replyBody),p_FmPcd->p_FmPcdKg->numOfSchemes*sizeof(uint8_t));
++
++ return (t_Error)reply.error;
++}
++
++static t_Error KgInitMaster(t_FmPcd *p_FmPcd)
++{
++ t_Error err = E_OK;
++ struct fman_kg_regs *p_Regs = p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs;
++
++ ASSERT_COND(p_FmPcd->guestId == NCSW_MASTER_ID);
++
++ if (p_FmPcd->exceptions & FM_EX_KG_DOUBLE_ECC)
++ FmEnableRamsEcc(p_FmPcd->h_Fm);
++
++ fman_kg_init(p_Regs, p_FmPcd->exceptions, GET_NIA_BMI_AC_ENQ_FRAME(p_FmPcd));
++
++ /* register even if no interrupts enabled, to allow future enablement */
++ FmRegisterIntr(p_FmPcd->h_Fm,
++ e_FM_MOD_KG,
++ 0,
++ e_FM_INTR_TYPE_ERR,
++ PcdKgErrorException,
++ p_FmPcd);
++
++ fman_kg_enable_scheme_interrupts(p_Regs);
++
++ if (p_FmPcd->p_FmPcdKg->numOfSchemes)
++ {
++ err = FmPcdKgAllocSchemes(p_FmPcd,
++ p_FmPcd->p_FmPcdKg->numOfSchemes,
++ p_FmPcd->guestId,
++ p_FmPcd->p_FmPcdKg->schemesIds);
++ if (err)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++ }
++
++ return E_OK;
++}
++
++static void ValidateSchemeSw(t_FmPcdKgScheme *p_Scheme)
++{
++ ASSERT_COND(!p_Scheme->valid);
++ if (p_Scheme->netEnvId != ILLEGAL_NETENV)
++ FmPcdIncNetEnvOwners(p_Scheme->h_FmPcd, p_Scheme->netEnvId);
++ p_Scheme->valid = TRUE;
++}
++
++static t_Error InvalidateSchemeSw(t_FmPcdKgScheme *p_Scheme)
++{
++ if (p_Scheme->owners)
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Trying to delete a scheme that has ports bound to"));
++
++ if (p_Scheme->netEnvId != ILLEGAL_NETENV)
++ FmPcdDecNetEnvOwners(p_Scheme->h_FmPcd, p_Scheme->netEnvId);
++ p_Scheme->valid = FALSE;
++
++ return E_OK;
++}
++
++static t_Error BuildSchemeRegs(t_FmPcdKgScheme *p_Scheme,
++ t_FmPcdKgSchemeParams *p_SchemeParams,
++ struct fman_kg_scheme_regs *p_SchemeRegs)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)(p_Scheme->h_FmPcd);
++ uint32_t grpBits = 0;
++ uint8_t grpBase;
++ bool direct=TRUE, absolute=FALSE;
++ uint16_t profileId=0, numOfProfiles=0, relativeProfileId;
++ t_Error err = E_OK;
++ int i = 0;
++ t_NetEnvParams netEnvParams;
++ uint32_t tmpReg, fqbTmp = 0, ppcTmp = 0, selectTmp, maskTmp, knownTmp, genTmp;
++ t_FmPcdKgKeyExtractAndHashParams *p_KeyAndHash = NULL;
++ uint8_t j, curr, idx;
++ uint8_t id, shift=0, code=0, offset=0, size=0;
++ t_FmPcdExtractEntry *p_Extract = NULL;
++ t_FmPcdKgExtractedOrParams *p_ExtractOr;
++ bool generic = FALSE;
++ t_KnownFieldsMasks bitMask;
++ e_FmPcdKgExtractDfltSelect swDefault = (e_FmPcdKgExtractDfltSelect)0;
++ t_FmPcdKgSchemesExtracts *p_LocalExtractsArray;
++ uint8_t numOfSwDefaults = 0;
++ t_FmPcdKgExtractDflt swDefaults[NUM_OF_SW_DEFAULTS];
++ uint8_t currGenId = 0;
++
++ memset(swDefaults, 0, NUM_OF_SW_DEFAULTS*sizeof(t_FmPcdKgExtractDflt));
++ memset(p_SchemeRegs, 0, sizeof(struct fman_kg_scheme_regs));
++
++ if (p_SchemeParams->netEnvParams.numOfDistinctionUnits > FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE,
++ ("numOfDistinctionUnits should not exceed %d", FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS));
++
++ /* by netEnv parameters, get match vector */
++ if (!p_SchemeParams->alwaysDirect)
++ {
++ p_Scheme->netEnvId = FmPcdGetNetEnvId(p_SchemeParams->netEnvParams.h_NetEnv);
++ netEnvParams.netEnvId = p_Scheme->netEnvId;
++ netEnvParams.numOfDistinctionUnits = p_SchemeParams->netEnvParams.numOfDistinctionUnits;
++ memcpy(netEnvParams.unitIds, p_SchemeParams->netEnvParams.unitIds, (sizeof(uint8_t))*p_SchemeParams->netEnvParams.numOfDistinctionUnits);
++ err = PcdGetUnitsVector(p_FmPcd, &netEnvParams);
++ if (err)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
++ p_Scheme->matchVector = netEnvParams.vector;
++ }
++ else
++ {
++ p_Scheme->matchVector = SCHEME_ALWAYS_DIRECT;
++ p_Scheme->netEnvId = ILLEGAL_NETENV;
++ }
++
++ if (p_SchemeParams->nextEngine == e_FM_PCD_INVALID)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Next Engine of the scheme is not Valid"));
++
++ if (p_SchemeParams->bypassFqidGeneration)
++ {
++#ifdef FM_KG_NO_BYPASS_FQID_GEN
++ if ((p_FmPcd->fmRevInfo.majorRev != 4) && (p_FmPcd->fmRevInfo.majorRev < 6))
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("bypassFqidGeneration."));
++#endif /* FM_KG_NO_BYPASS_FQID_GEN */
++ if (p_SchemeParams->baseFqid)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("baseFqid set for a scheme that does not generate an FQID"));
++ }
++ else
++ if (!p_SchemeParams->baseFqid)
++ DBG(WARNING, ("baseFqid is 0."));
++
++ if (p_SchemeParams->nextEngine == e_FM_PCD_PLCR)
++ {
++ direct = p_SchemeParams->kgNextEngineParams.plcrProfile.direct;
++ p_Scheme->directPlcr = direct;
++ absolute = (bool)(p_SchemeParams->kgNextEngineParams.plcrProfile.sharedProfile ? TRUE : FALSE);
++ if (!direct && absolute)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Indirect policing is not available when profile is shared."));
++
++ if (direct)
++ {
++ profileId = p_SchemeParams->kgNextEngineParams.plcrProfile.profileSelect.directRelativeProfileId;
++ numOfProfiles = 1;
++ }
++ else
++ {
++ profileId = p_SchemeParams->kgNextEngineParams.plcrProfile.profileSelect.indirectProfile.fqidOffsetRelativeProfileIdBase;
++ shift = p_SchemeParams->kgNextEngineParams.plcrProfile.profileSelect.indirectProfile.fqidOffsetShift;
++ numOfProfiles = p_SchemeParams->kgNextEngineParams.plcrProfile.profileSelect.indirectProfile.numOfProfiles;
++ }
++ }
++
++ if (p_SchemeParams->nextEngine == e_FM_PCD_CC)
++ {
++#ifdef FM_KG_NO_BYPASS_PLCR_PROFILE_GEN
++ if ((p_SchemeParams->kgNextEngineParams.cc.plcrNext) && (p_SchemeParams->kgNextEngineParams.cc.bypassPlcrProfileGeneration))
++ {
++ if ((p_FmPcd->fmRevInfo.majorRev != 4) && (p_FmPcd->fmRevInfo.majorRev < 6))
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("bypassPlcrProfileGeneration."));
++ }
++#endif /* FM_KG_NO_BYPASS_PLCR_PROFILE_GEN */
++
++ err = FmPcdCcGetGrpParams(p_SchemeParams->kgNextEngineParams.cc.h_CcTree,
++ p_SchemeParams->kgNextEngineParams.cc.grpId,
++ &grpBits,
++ &grpBase);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ p_Scheme->ccUnits = grpBits;
++
++ if ((p_SchemeParams->kgNextEngineParams.cc.plcrNext) &&
++ (!p_SchemeParams->kgNextEngineParams.cc.bypassPlcrProfileGeneration))
++ {
++ if (p_SchemeParams->kgNextEngineParams.cc.plcrProfile.sharedProfile)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Shared profile may not be used after Coarse classification."));
++ absolute = FALSE;
++ direct = p_SchemeParams->kgNextEngineParams.cc.plcrProfile.direct;
++ if (direct)
++ {
++ profileId = p_SchemeParams->kgNextEngineParams.cc.plcrProfile.profileSelect.directRelativeProfileId;
++ numOfProfiles = 1;
++ }
++ else
++ {
++ profileId = p_SchemeParams->kgNextEngineParams.cc.plcrProfile.profileSelect.indirectProfile.fqidOffsetRelativeProfileIdBase;
++ shift = p_SchemeParams->kgNextEngineParams.cc.plcrProfile.profileSelect.indirectProfile.fqidOffsetShift;
++ numOfProfiles = p_SchemeParams->kgNextEngineParams.cc.plcrProfile.profileSelect.indirectProfile.numOfProfiles;
++ }
++ }
++ }
++
++ /* if policer is used directly after KG, or after CC */
++ if ((p_SchemeParams->nextEngine == e_FM_PCD_PLCR) ||
++ ((p_SchemeParams->nextEngine == e_FM_PCD_CC) &&
++ (p_SchemeParams->kgNextEngineParams.cc.plcrNext) &&
++ (!p_SchemeParams->kgNextEngineParams.cc.bypassPlcrProfileGeneration)))
++ {
++ /* if private policer profile, it may be uninitialized yet, therefore no checks are done at this stage */
++ if (absolute)
++ {
++ /* for absolute direct policy only, */
++ relativeProfileId = profileId;
++ err = FmPcdPlcrGetAbsoluteIdByProfileParams((t_Handle)p_FmPcd,e_FM_PCD_PLCR_SHARED,NULL, relativeProfileId, &profileId);
++ if (err)
++ RETURN_ERROR(MAJOR, err, ("Shared profile not valid offset"));
++ if (!FmPcdPlcrIsProfileValid(p_FmPcd, profileId))
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Shared profile not valid."));
++ p_Scheme->relativeProfileId = profileId;
++ }
++ else
++ {
++ /* save relative profile id's for later check */
++ p_Scheme->nextRelativePlcrProfile = TRUE;
++ p_Scheme->relativeProfileId = profileId;
++ p_Scheme->numOfProfiles = numOfProfiles;
++ }
++ }
++ else
++ {
++ /* if policer is NOT going to be used after KG at all than if bypassFqidGeneration
++ is set, we do not need numOfUsedExtractedOrs and hashDistributionNumOfFqids */
++ if (p_SchemeParams->bypassFqidGeneration && p_SchemeParams->numOfUsedExtractedOrs)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE,
++ ("numOfUsedExtractedOrs is set in a scheme that does not generate FQID or policer profile ID"));
++ if (p_SchemeParams->bypassFqidGeneration &&
++ p_SchemeParams->useHash &&
++ p_SchemeParams->keyExtractAndHashParams.hashDistributionNumOfFqids)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE,
++ ("hashDistributionNumOfFqids is set in a scheme that does not generate FQID or policer profile ID"));
++ }
++
++ /* configure all 21 scheme registers */
++ tmpReg = KG_SCH_MODE_EN;
++ switch (p_SchemeParams->nextEngine)
++ {
++ case (e_FM_PCD_PLCR):
++ /* add to mode register - NIA */
++ tmpReg |= KG_SCH_MODE_NIA_PLCR;
++ tmpReg |= NIA_ENG_PLCR;
++ tmpReg |= (uint32_t)(p_SchemeParams->kgNextEngineParams.plcrProfile.sharedProfile ? NIA_PLCR_ABSOLUTE:0);
++ /* initialize policer profile command - */
++ /* configure kgse_ppc */
++ if (direct)
++ /* use profileId as base, other fields are 0 */
++ p_SchemeRegs->kgse_ppc = (uint32_t)profileId;
++ else
++ {
++ if (shift > MAX_PP_SHIFT)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("fqidOffsetShift may not be larger than %d", MAX_PP_SHIFT));
++
++ if (!numOfProfiles || !POWER_OF_2(numOfProfiles))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("numOfProfiles must not be 0 and must be a power of 2"));
++
++ ppcTmp = ((uint32_t)shift << KG_SCH_PP_SHIFT_HIGH_SHIFT) & KG_SCH_PP_SHIFT_HIGH;
++ ppcTmp |= ((uint32_t)shift << KG_SCH_PP_SHIFT_LOW_SHIFT) & KG_SCH_PP_SHIFT_LOW;
++ ppcTmp |= ((uint32_t)(numOfProfiles-1) << KG_SCH_PP_MASK_SHIFT);
++ ppcTmp |= (uint32_t)profileId;
++
++ p_SchemeRegs->kgse_ppc = ppcTmp;
++ }
++ break;
++ case (e_FM_PCD_CC):
++ /* mode reg - define NIA */
++ tmpReg |= (NIA_ENG_FM_CTL | NIA_FM_CTL_AC_CC);
++
++ p_SchemeRegs->kgse_ccbs = grpBits;
++ tmpReg |= (uint32_t)(grpBase << KG_SCH_MODE_CCOBASE_SHIFT);
++
++ if (p_SchemeParams->kgNextEngineParams.cc.plcrNext)
++ {
++ if (!p_SchemeParams->kgNextEngineParams.cc.bypassPlcrProfileGeneration)
++ {
++ /* find out if absolute or relative */
++ if (absolute)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("It is illegal to request a shared profile in a scheme that is in a KG->CC->PLCR flow"));
++ if (direct)
++ {
++ /* mask = 0, base = directProfileId */
++ p_SchemeRegs->kgse_ppc = (uint32_t)profileId;
++ }
++ else
++ {
++ if (shift > MAX_PP_SHIFT)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("fqidOffsetShift may not be larger than %d", MAX_PP_SHIFT));
++ if (!numOfProfiles || !POWER_OF_2(numOfProfiles))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("numOfProfiles must not be 0 and must be a power of 2"));
++
++ ppcTmp = ((uint32_t)shift << KG_SCH_PP_SHIFT_HIGH_SHIFT) & KG_SCH_PP_SHIFT_HIGH;
++ ppcTmp |= ((uint32_t)shift << KG_SCH_PP_SHIFT_LOW_SHIFT) & KG_SCH_PP_SHIFT_LOW;
++ ppcTmp |= ((uint32_t)(numOfProfiles-1) << KG_SCH_PP_MASK_SHIFT);
++ ppcTmp |= (uint32_t)profileId;
++
++ p_SchemeRegs->kgse_ppc = ppcTmp;
++ }
++ }
++ else
++ ppcTmp = KG_SCH_PP_NO_GEN;
++ }
++ break;
++ case (e_FM_PCD_DONE):
++ if (p_SchemeParams->kgNextEngineParams.doneAction == e_FM_PCD_DROP_FRAME)
++ tmpReg |= GET_NIA_BMI_AC_DISCARD_FRAME(p_FmPcd);
++ else
++ tmpReg |= GET_NIA_BMI_AC_ENQ_FRAME(p_FmPcd);
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("Next engine not supported"));
++ }
++ p_SchemeRegs->kgse_mode = tmpReg;
++
++ p_SchemeRegs->kgse_mv = p_Scheme->matchVector;
++
++#if (DPAA_VERSION >= 11)
++ if (p_SchemeParams->overrideStorageProfile)
++ {
++ p_SchemeRegs->kgse_om |= KG_SCH_OM_VSPE;
++
++ tmpReg = 0;
++ if (p_SchemeParams->storageProfile.direct)
++ {
++ profileId = p_SchemeParams->storageProfile.profileSelect.directRelativeProfileId;
++ shift = 0;
++ numOfProfiles = 1;
++ }
++ else
++ {
++ profileId = p_SchemeParams->storageProfile.profileSelect.indirectProfile.fqidOffsetRelativeProfileIdBase;
++ shift = p_SchemeParams->storageProfile.profileSelect.indirectProfile.fqidOffsetShift;
++ numOfProfiles = p_SchemeParams->storageProfile.profileSelect.indirectProfile.numOfProfiles;
++ }
++ if (shift > MAX_SP_SHIFT)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("fqidOffsetShift may not be larger than %d", MAX_SP_SHIFT));
++
++ if (!numOfProfiles || !POWER_OF_2(numOfProfiles))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("numOfProfiles must not be 0 and must be a power of 2"));
++
++ tmpReg = (uint32_t)shift << KG_SCH_VSP_SHIFT;
++ tmpReg |= ((uint32_t)(numOfProfiles-1) << KG_SCH_VSP_MASK_SHIFT);
++ tmpReg |= (uint32_t)profileId;
++
++
++ p_SchemeRegs->kgse_vsp = tmpReg;
++
++ p_Scheme->vspe = TRUE;
++
++ }
++ else
++ p_SchemeRegs->kgse_vsp = KG_SCH_VSP_NO_KSP_EN;
++#endif /* (DPAA_VERSION >= 11) */
++
++ if (p_SchemeParams->useHash)
++ {
++ p_KeyAndHash = &p_SchemeParams->keyExtractAndHashParams;
++
++ if (p_KeyAndHash->numOfUsedExtracts >= FM_PCD_KG_MAX_NUM_OF_EXTRACTS_PER_KEY)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("numOfUsedExtracts out of range"));
++
++ /* configure kgse_dv0 */
++ p_SchemeRegs->kgse_dv0 = p_KeyAndHash->privateDflt0;
++
++ /* configure kgse_dv1 */
++ p_SchemeRegs->kgse_dv1 = p_KeyAndHash->privateDflt1;
++
++ if (!p_SchemeParams->bypassFqidGeneration)
++ {
++ if (!p_KeyAndHash->hashDistributionNumOfFqids || !POWER_OF_2(p_KeyAndHash->hashDistributionNumOfFqids))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("hashDistributionNumOfFqids must not be 0 and must be a power of 2"));
++ if ((p_KeyAndHash->hashDistributionNumOfFqids-1) & p_SchemeParams->baseFqid)
++ DBG(WARNING, ("baseFqid unaligned. Distribution may result in less than hashDistributionNumOfFqids queues."));
++ }
++
++ /* configure kgse_ekdv */
++ tmpReg = 0;
++ for ( i=0 ;inumOfUsedDflts ; i++)
++ {
++ switch (p_KeyAndHash->dflts[i].type)
++ {
++ case (e_FM_PCD_KG_MAC_ADDR):
++ tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_MAC_ADDR_SHIFT);
++ break;
++ case (e_FM_PCD_KG_TCI):
++ tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_TCI_SHIFT);
++ break;
++ case (e_FM_PCD_KG_ENET_TYPE):
++ tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_ENET_TYPE_SHIFT);
++ break;
++ case (e_FM_PCD_KG_PPP_SESSION_ID):
++ tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_PPP_SESSION_ID_SHIFT);
++ break;
++ case (e_FM_PCD_KG_PPP_PROTOCOL_ID):
++ tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_PPP_PROTOCOL_ID_SHIFT);
++ break;
++ case (e_FM_PCD_KG_MPLS_LABEL):
++ tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_MPLS_LABEL_SHIFT);
++ break;
++ case (e_FM_PCD_KG_IP_ADDR):
++ tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_IP_ADDR_SHIFT);
++ break;
++ case (e_FM_PCD_KG_PROTOCOL_TYPE):
++ tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_PROTOCOL_TYPE_SHIFT);
++ break;
++ case (e_FM_PCD_KG_IP_TOS_TC):
++ tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_IP_TOS_TC_SHIFT);
++ break;
++ case (e_FM_PCD_KG_IPV6_FLOW_LABEL):
++ tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_L4_PORT_SHIFT);
++ break;
++ case (e_FM_PCD_KG_IPSEC_SPI):
++ tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_IPSEC_SPI_SHIFT);
++ break;
++ case (e_FM_PCD_KG_L4_PORT):
++ tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_L4_PORT_SHIFT);
++ break;
++ case (e_FM_PCD_KG_TCP_FLAG):
++ tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_TCP_FLAG_SHIFT);
++ break;
++ case (e_FM_PCD_KG_GENERIC_FROM_DATA):
++ swDefaults[numOfSwDefaults].type = e_FM_PCD_KG_GENERIC_FROM_DATA;
++ swDefaults[numOfSwDefaults].dfltSelect = p_KeyAndHash->dflts[i].dfltSelect;
++ numOfSwDefaults ++;
++ break;
++ case (e_FM_PCD_KG_GENERIC_FROM_DATA_NO_V):
++ swDefaults[numOfSwDefaults].type = e_FM_PCD_KG_GENERIC_FROM_DATA_NO_V;
++ swDefaults[numOfSwDefaults].dfltSelect = p_KeyAndHash->dflts[i].dfltSelect;
++ numOfSwDefaults ++;
++ break;
++ case (e_FM_PCD_KG_GENERIC_NOT_FROM_DATA):
++ swDefaults[numOfSwDefaults].type = e_FM_PCD_KG_GENERIC_NOT_FROM_DATA;
++ swDefaults[numOfSwDefaults].dfltSelect = p_KeyAndHash->dflts[i].dfltSelect;
++ numOfSwDefaults ++;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
++ }
++ }
++ p_SchemeRegs->kgse_ekdv = tmpReg;
++
++ p_LocalExtractsArray = (t_FmPcdKgSchemesExtracts *)XX_Malloc(sizeof(t_FmPcdKgSchemesExtracts));
++ if (!p_LocalExtractsArray)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("No memory"));
++
++ /* configure kgse_ekfc and kgse_gec */
++ knownTmp = 0;
++ for ( i=0 ;inumOfUsedExtracts ; i++)
++ {
++ p_Extract = &p_KeyAndHash->extractArray[i];
++ switch (p_Extract->type)
++ {
++ case (e_FM_PCD_KG_EXTRACT_PORT_PRIVATE_INFO):
++ knownTmp |= KG_SCH_KN_PORT_ID;
++ /* save in driver structure */
++ p_LocalExtractsArray->extractsArray[i].id = GetKnownFieldId(KG_SCH_KN_PORT_ID);
++ p_LocalExtractsArray->extractsArray[i].known = TRUE;
++ break;
++ case (e_FM_PCD_EXTRACT_BY_HDR):
++ switch (p_Extract->extractByHdr.hdr)
++ {
++
++#ifdef FM_CAPWAP_SUPPORT
++ case (HEADER_TYPE_UDP_LITE):
++ p_Extract->extractByHdr.hdr = HEADER_TYPE_UDP;
++ break;
++#endif
++ case (HEADER_TYPE_UDP_ENCAP_ESP):
++ switch (p_Extract->extractByHdr.type)
++ {
++ case (e_FM_PCD_EXTRACT_FROM_HDR):
++ /* case where extraction from ESP only */
++ if (p_Extract->extractByHdr.extractByHdrType.fromHdr.offset >= UDP_HEADER_SIZE)
++ {
++ p_Extract->extractByHdr.hdr = FmPcdGetAliasHdr(p_FmPcd, p_Scheme->netEnvId, HEADER_TYPE_UDP_ENCAP_ESP);
++ p_Extract->extractByHdr.extractByHdrType.fromHdr.offset -= UDP_HEADER_SIZE;
++ p_Extract->extractByHdr.ignoreProtocolValidation = TRUE;
++ }
++ else
++ {
++ p_Extract->extractByHdr.hdr = HEADER_TYPE_UDP;
++ p_Extract->extractByHdr.ignoreProtocolValidation = FALSE;
++ }
++ break;
++ case (e_FM_PCD_EXTRACT_FROM_FIELD):
++ switch (p_Extract->extractByHdr.extractByHdrType.fromField.field.udpEncapEsp)
++ {
++ case (NET_HEADER_FIELD_UDP_ENCAP_ESP_PORT_SRC):
++ case (NET_HEADER_FIELD_UDP_ENCAP_ESP_PORT_DST):
++ case (NET_HEADER_FIELD_UDP_ENCAP_ESP_LEN):
++ case (NET_HEADER_FIELD_UDP_ENCAP_ESP_CKSUM):
++ p_Extract->extractByHdr.hdr = HEADER_TYPE_UDP;
++ break;
++ case (NET_HEADER_FIELD_UDP_ENCAP_ESP_SPI):
++ p_Extract->extractByHdr.type = e_FM_PCD_EXTRACT_FROM_HDR;
++ p_Extract->extractByHdr.hdr = FmPcdGetAliasHdr(p_FmPcd, p_Scheme->netEnvId, HEADER_TYPE_UDP_ENCAP_ESP);
++ p_Extract->extractByHdr.extractByHdrType.fromField.size = p_Extract->extractByHdr.extractByHdrType.fromField.size;
++ /*p_Extract->extractByHdr.extractByHdrType.fromField.offset += ESP_SPI_OFFSET;*/
++ p_Extract->extractByHdr.ignoreProtocolValidation = TRUE;
++ break;
++ case (NET_HEADER_FIELD_UDP_ENCAP_ESP_SEQUENCE_NUM):
++ p_Extract->extractByHdr.type = e_FM_PCD_EXTRACT_FROM_HDR;
++ p_Extract->extractByHdr.hdr = FmPcdGetAliasHdr(p_FmPcd, p_Scheme->netEnvId, HEADER_TYPE_UDP_ENCAP_ESP);
++ p_Extract->extractByHdr.extractByHdrType.fromField.size = p_Extract->extractByHdr.extractByHdrType.fromField.size;
++ p_Extract->extractByHdr.extractByHdrType.fromField.offset += ESP_SEQ_NUM_OFFSET;
++ p_Extract->extractByHdr.ignoreProtocolValidation = TRUE;
++ break;
++ }
++ break;
++ case (e_FM_PCD_EXTRACT_FULL_FIELD):
++ switch (p_Extract->extractByHdr.extractByHdrType.fullField.udpEncapEsp)
++ {
++ case (NET_HEADER_FIELD_UDP_ENCAP_ESP_PORT_SRC):
++ case (NET_HEADER_FIELD_UDP_ENCAP_ESP_PORT_DST):
++ case (NET_HEADER_FIELD_UDP_ENCAP_ESP_LEN):
++ case (NET_HEADER_FIELD_UDP_ENCAP_ESP_CKSUM):
++ p_Extract->extractByHdr.hdr = HEADER_TYPE_UDP;
++ break;
++ case (NET_HEADER_FIELD_UDP_ENCAP_ESP_SPI):
++ p_Extract->extractByHdr.type = e_FM_PCD_EXTRACT_FROM_HDR;
++ p_Extract->extractByHdr.hdr = FmPcdGetAliasHdr(p_FmPcd, p_Scheme->netEnvId, HEADER_TYPE_UDP_ENCAP_ESP);
++ p_Extract->extractByHdr.extractByHdrType.fromHdr.size = ESP_SPI_SIZE;
++ p_Extract->extractByHdr.extractByHdrType.fromHdr.offset = ESP_SPI_OFFSET;
++ p_Extract->extractByHdr.ignoreProtocolValidation = TRUE;
++ break;
++ case (NET_HEADER_FIELD_UDP_ENCAP_ESP_SEQUENCE_NUM):
++ p_Extract->extractByHdr.type = e_FM_PCD_EXTRACT_FROM_HDR;
++ p_Extract->extractByHdr.hdr = FmPcdGetAliasHdr(p_FmPcd, p_Scheme->netEnvId, HEADER_TYPE_UDP_ENCAP_ESP);
++ p_Extract->extractByHdr.extractByHdrType.fromHdr.size = ESP_SEQ_NUM_SIZE;
++ p_Extract->extractByHdr.extractByHdrType.fromHdr.offset = ESP_SEQ_NUM_OFFSET;
++ p_Extract->extractByHdr.ignoreProtocolValidation = TRUE;
++ break;
++ }
++ break;
++ }
++ break;
++ default:
++ break;
++ }
++ switch (p_Extract->extractByHdr.type)
++ {
++ case (e_FM_PCD_EXTRACT_FROM_HDR):
++ generic = TRUE;
++ /* get the header code for the generic extract */
++ code = GetGenHdrCode(p_Extract->extractByHdr.hdr, p_Extract->extractByHdr.hdrIndex, p_Extract->extractByHdr.ignoreProtocolValidation);
++ /* set generic register fields */
++ offset = p_Extract->extractByHdr.extractByHdrType.fromHdr.offset;
++ size = p_Extract->extractByHdr.extractByHdrType.fromHdr.size;
++ break;
++ case (e_FM_PCD_EXTRACT_FROM_FIELD):
++ generic = TRUE;
++ /* get the field code for the generic extract */
++ code = GetGenFieldCode(p_Extract->extractByHdr.hdr,
++ p_Extract->extractByHdr.extractByHdrType.fromField.field, p_Extract->extractByHdr.ignoreProtocolValidation,p_Extract->extractByHdr.hdrIndex);
++ offset = p_Extract->extractByHdr.extractByHdrType.fromField.offset;
++ size = p_Extract->extractByHdr.extractByHdrType.fromField.size;
++ break;
++ case (e_FM_PCD_EXTRACT_FULL_FIELD):
++ if (!p_Extract->extractByHdr.ignoreProtocolValidation)
++ {
++ /* if we have a known field for it - use it, otherwise use generic */
++ bitMask = GetKnownProtMask(p_FmPcd, p_Extract->extractByHdr.hdr, p_Extract->extractByHdr.hdrIndex,
++ p_Extract->extractByHdr.extractByHdrType.fullField);
++ if (bitMask)
++ {
++ knownTmp |= bitMask;
++ /* save in driver structure */
++ p_LocalExtractsArray->extractsArray[i].id = GetKnownFieldId(bitMask);
++ p_LocalExtractsArray->extractsArray[i].known = TRUE;
++ }
++ else
++ generic = TRUE;
++
++ }
++ else
++ generic = TRUE;
++ if (generic)
++ {
++ /* tmp - till we cover more headers under generic */
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("Full header selection not supported"));
++ }
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
++ }
++ break;
++ case (e_FM_PCD_EXTRACT_NON_HDR):
++ /* use generic */
++ generic = TRUE;
++ offset = 0;
++ /* get the field code for the generic extract */
++ code = GetGenCode(p_Extract->extractNonHdr.src, &offset);
++ offset += p_Extract->extractNonHdr.offset;
++ size = p_Extract->extractNonHdr.size;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
++ }
++
++ if (generic)
++ {
++ /* set generic register fields */
++ if (currGenId >= FM_KG_NUM_OF_GENERIC_REGS)
++ RETURN_ERROR(MAJOR, E_FULL, ("Generic registers are fully used"));
++ if (!code)
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, NO_MSG);
++
++ genTmp = KG_SCH_GEN_VALID;
++ genTmp |= (uint32_t)(code << KG_SCH_GEN_HT_SHIFT);
++ genTmp |= offset;
++ if ((size > MAX_KG_SCH_SIZE) || (size < 1))
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal extraction (size out of range)"));
++ genTmp |= (uint32_t)((size - 1) << KG_SCH_GEN_SIZE_SHIFT);
++ swDefault = GetGenericSwDefault(swDefaults, numOfSwDefaults, code);
++ if (swDefault == e_FM_PCD_KG_DFLT_ILLEGAL)
++ DBG(WARNING, ("No sw default configured"));
++
++ genTmp |= swDefault << KG_SCH_GEN_DEF_SHIFT;
++ genTmp |= KG_SCH_GEN_MASK;
++ p_SchemeRegs->kgse_gec[currGenId] = genTmp;
++ /* save in driver structure */
++ p_LocalExtractsArray->extractsArray[i].id = currGenId++;
++ p_LocalExtractsArray->extractsArray[i].known = FALSE;
++ generic = FALSE;
++ }
++ }
++ p_SchemeRegs->kgse_ekfc = knownTmp;
++
++ selectTmp = 0;
++ maskTmp = 0xFFFFFFFF;
++ /* configure kgse_bmch, kgse_bmcl and kgse_fqb */
++
++ if (p_KeyAndHash->numOfUsedMasks >= FM_PCD_KG_NUM_OF_EXTRACT_MASKS)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Only %d masks supported", FM_PCD_KG_NUM_OF_EXTRACT_MASKS));
++ for ( i=0 ;inumOfUsedMasks ; i++)
++ {
++ /* Get the relative id of the extract (for known 0-0x1f, for generic 0-7) */
++ id = p_LocalExtractsArray->extractsArray[p_KeyAndHash->masks[i].extractArrayIndex].id;
++ /* Get the shift of the select field (depending on i) */
++ GET_MASK_SEL_SHIFT(shift,i);
++ if (p_LocalExtractsArray->extractsArray[p_KeyAndHash->masks[i].extractArrayIndex].known)
++ selectTmp |= id << shift;
++ else
++ selectTmp |= (id + MASK_FOR_GENERIC_BASE_ID) << shift;
++
++ /* Get the shift of the offset field (depending on i) - may
++ be in kgse_bmch or in kgse_fqb (depending on i) */
++ GET_MASK_OFFSET_SHIFT(shift,i);
++ if (i<=1)
++ selectTmp |= p_KeyAndHash->masks[i].offset << shift;
++ else
++ fqbTmp |= p_KeyAndHash->masks[i].offset << shift;
++
++ /* Get the shift of the mask field (depending on i) */
++ GET_MASK_SHIFT(shift,i);
++ /* pass all bits */
++ maskTmp |= KG_SCH_BITMASK_MASK << shift;
++ /* clear bits that need masking */
++ maskTmp &= ~(0xFF << shift) ;
++ /* set mask bits */
++ maskTmp |= (p_KeyAndHash->masks[i].mask << shift) ;
++ }
++ p_SchemeRegs->kgse_bmch = selectTmp;
++ p_SchemeRegs->kgse_bmcl = maskTmp;
++ /* kgse_fqb will be written t the end of the routine */
++
++ /* configure kgse_hc */
++ if (p_KeyAndHash->hashShift > MAX_HASH_SHIFT)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("hashShift must not be larger than %d", MAX_HASH_SHIFT));
++ if (p_KeyAndHash->hashDistributionFqidsShift > MAX_DIST_FQID_SHIFT)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("hashDistributionFqidsShift must not be larger than %d", MAX_DIST_FQID_SHIFT));
++
++ tmpReg = 0;
++
++ tmpReg |= ((p_KeyAndHash->hashDistributionNumOfFqids - 1) << p_KeyAndHash->hashDistributionFqidsShift);
++ tmpReg |= p_KeyAndHash->hashShift << KG_SCH_HASH_CONFIG_SHIFT_SHIFT;
++
++ if (p_KeyAndHash->symmetricHash)
++ {
++ if ((!!(p_SchemeRegs->kgse_ekfc & KG_SCH_KN_MACSRC) != !!(p_SchemeRegs->kgse_ekfc & KG_SCH_KN_MACDST)) ||
++ (!!(p_SchemeRegs->kgse_ekfc & KG_SCH_KN_IPSRC1) != !!(p_SchemeRegs->kgse_ekfc & KG_SCH_KN_IPDST1)) ||
++ (!!(p_SchemeRegs->kgse_ekfc & KG_SCH_KN_IPSRC2) != !!(p_SchemeRegs->kgse_ekfc & KG_SCH_KN_IPDST2)) ||
++ (!!(p_SchemeRegs->kgse_ekfc & KG_SCH_KN_L4PSRC) != !!(p_SchemeRegs->kgse_ekfc & KG_SCH_KN_L4PDST)))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("symmetricHash set but src/dest extractions missing"));
++ tmpReg |= KG_SCH_HASH_CONFIG_SYM;
++ }
++ p_SchemeRegs->kgse_hc = tmpReg;
++
++ /* build the return array describing the order of the extractions */
++
++ /* the last currGenId places of the array
++ are for generic extracts that are always last.
++ We now sort for the calculation of the order of the known
++ extractions we sort the known extracts between orderedArray[0] and
++ orderedArray[p_KeyAndHash->numOfUsedExtracts - currGenId - 1].
++ for the calculation of the order of the generic extractions we use:
++ num_of_generic - currGenId
++ num_of_known - p_KeyAndHash->numOfUsedExtracts - currGenId
++ first_generic_index = num_of_known */
++ curr = 0;
++ for (i=0;inumOfUsedExtracts ; i++)
++ {
++ if (p_LocalExtractsArray->extractsArray[i].known)
++ {
++ ASSERT_COND(curr<(p_KeyAndHash->numOfUsedExtracts - currGenId));
++ j = curr;
++ /* id is the extract id (port id = 0, mac src = 1 etc.). the value in the array is the original
++ index in the user's extractions array */
++ /* we compare the id of the current extract with the id of the extract in the orderedArray[j-1]
++ location */
++ while ((j > 0) && (p_LocalExtractsArray->extractsArray[i].id <
++ p_LocalExtractsArray->extractsArray[p_Scheme->orderedArray[j-1]].id))
++ {
++ p_Scheme->orderedArray[j] =
++ p_Scheme->orderedArray[j-1];
++ j--;
++ }
++ p_Scheme->orderedArray[j] = (uint8_t)i;
++ curr++;
++ }
++ else
++ {
++ /* index is first_generic_index + generic index (id) */
++ idx = (uint8_t)(p_KeyAndHash->numOfUsedExtracts - currGenId + p_LocalExtractsArray->extractsArray[i].id);
++ ASSERT_COND(idx < FM_PCD_KG_MAX_NUM_OF_EXTRACTS_PER_KEY);
++ p_Scheme->orderedArray[idx]= (uint8_t)i;
++ }
++ }
++ XX_Free(p_LocalExtractsArray);
++ p_LocalExtractsArray = NULL;
++
++ }
++ else
++ {
++ /* clear all unused registers: */
++ p_SchemeRegs->kgse_ekfc = 0;
++ p_SchemeRegs->kgse_ekdv = 0;
++ p_SchemeRegs->kgse_bmch = 0;
++ p_SchemeRegs->kgse_bmcl = 0;
++ p_SchemeRegs->kgse_hc = 0;
++ p_SchemeRegs->kgse_dv0 = 0;
++ p_SchemeRegs->kgse_dv1 = 0;
++ }
++
++ if (p_SchemeParams->bypassFqidGeneration)
++ p_SchemeRegs->kgse_hc |= KG_SCH_HASH_CONFIG_NO_FQID;
++
++ /* configure kgse_spc */
++ if ( p_SchemeParams->schemeCounter.update)
++ p_SchemeRegs->kgse_spc = p_SchemeParams->schemeCounter.value;
++
++
++ /* check that are enough generic registers */
++ if (p_SchemeParams->numOfUsedExtractedOrs + currGenId > FM_KG_NUM_OF_GENERIC_REGS)
++ RETURN_ERROR(MAJOR, E_FULL, ("Generic registers are fully used"));
++
++ /* extracted OR mask on Qid */
++ for ( i=0 ;inumOfUsedExtractedOrs ; i++)
++ {
++
++ p_Scheme->extractedOrs = TRUE;
++ /* configure kgse_gec[i] */
++ p_ExtractOr = &p_SchemeParams->extractedOrs[i];
++ switch (p_ExtractOr->type)
++ {
++ case (e_FM_PCD_KG_EXTRACT_PORT_PRIVATE_INFO):
++ code = KG_SCH_GEN_PARSE_RESULT_N_FQID;
++ offset = 0;
++ break;
++ case (e_FM_PCD_EXTRACT_BY_HDR):
++ /* get the header code for the generic extract */
++ code = GetGenHdrCode(p_ExtractOr->extractByHdr.hdr, p_ExtractOr->extractByHdr.hdrIndex, p_ExtractOr->extractByHdr.ignoreProtocolValidation);
++ /* set generic register fields */
++ offset = p_ExtractOr->extractionOffset;
++ break;
++ case (e_FM_PCD_EXTRACT_NON_HDR):
++ /* get the field code for the generic extract */
++ offset = 0;
++ code = GetGenCode(p_ExtractOr->src, &offset);
++ offset += p_ExtractOr->extractionOffset;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
++ }
++
++ /* set generic register fields */
++ if (!code)
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, NO_MSG);
++ genTmp = KG_SCH_GEN_EXTRACT_TYPE | KG_SCH_GEN_VALID;
++ genTmp |= (uint32_t)(code << KG_SCH_GEN_HT_SHIFT);
++ genTmp |= offset;
++ if (!!p_ExtractOr->bitOffsetInFqid == !!p_ExtractOr->bitOffsetInPlcrProfile)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, (" extracted byte must effect either FQID or Policer profile"));
++
++ /************************************************************************************
++ bitOffsetInFqid and bitOffsetInPolicerProfile are translated to rotate parameter
++ in the following way:
++
++ Driver API and implementation:
++ ==============================
++ FQID: extracted OR byte may be shifted right 1-31 bits to effect parts of the FQID.
++ if shifted less than 8 bits, or more than 24 bits a mask is set on the bits that
++ are not overlapping FQID.
++ ------------------------
++ | FQID (24) |
++ ------------------------
++ --------
++ | | extracted OR byte
++ --------
++
++ Policer Profile: extracted OR byte may be shifted right 1-15 bits to effect parts of the
++ PP id. Unless shifted exactly 8 bits to overlap the PP id, a mask is set on the bits that
++ are not overlapping PP id.
++
++ --------
++ | PP (8) |
++ --------
++ --------
++ | | extracted OR byte
++ --------
++
++ HW implementation
++ =================
++ FQID and PP construct a 32 bit word in the way describe below. Extracted byte is located
++ as the highest byte of that word and may be rotated to effect any part os the FQID or
++ the PP.
++ ------------------------ --------
++ | FQID (24) || PP (8) |
++ ------------------------ --------
++ --------
++ | | extracted OR byte
++ --------
++
++ ************************************************************************************/
++
++ if (p_ExtractOr->bitOffsetInFqid)
++ {
++ if (p_ExtractOr->bitOffsetInFqid > MAX_KG_SCH_FQID_BIT_OFFSET )
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Illegal extraction (bitOffsetInFqid out of range)"));
++ if (p_ExtractOr->bitOffsetInFqid<8)
++ genTmp |= (uint32_t)((p_ExtractOr->bitOffsetInFqid+24) << KG_SCH_GEN_SIZE_SHIFT);
++ else
++ genTmp |= (uint32_t)((p_ExtractOr->bitOffsetInFqid-8) << KG_SCH_GEN_SIZE_SHIFT);
++ p_ExtractOr->mask &= GetExtractedOrMask(p_ExtractOr->bitOffsetInFqid, TRUE);
++ }
++ else /* effect policer profile */
++ {
++ if (p_ExtractOr->bitOffsetInPlcrProfile > MAX_KG_SCH_PP_BIT_OFFSET )
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Illegal extraction (bitOffsetInPlcrProfile out of range)"));
++ p_Scheme->bitOffsetInPlcrProfile = p_ExtractOr->bitOffsetInPlcrProfile;
++ genTmp |= (uint32_t)((p_ExtractOr->bitOffsetInPlcrProfile+16) << KG_SCH_GEN_SIZE_SHIFT);
++ p_ExtractOr->mask &= GetExtractedOrMask(p_ExtractOr->bitOffsetInPlcrProfile, FALSE);
++ }
++
++ genTmp |= (uint32_t)(p_ExtractOr->extractionOffset << KG_SCH_GEN_DEF_SHIFT);
++ /* clear bits that need masking */
++ genTmp &= ~KG_SCH_GEN_MASK ;
++ /* set mask bits */
++ genTmp |= (uint32_t)(p_ExtractOr->mask << KG_SCH_GEN_MASK_SHIFT);
++ p_SchemeRegs->kgse_gec[currGenId++] = genTmp;
++
++ }
++ /* clear all unused GEC registers */
++ for ( i=currGenId ;ikgse_gec[i] = 0;
++
++ /* add base Qid for this scheme */
++ /* add configuration for kgse_fqb */
++ if (p_SchemeParams->baseFqid & ~0x00FFFFFF)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("baseFqid must be between 1 and 2^24-1"));
++
++ fqbTmp |= p_SchemeParams->baseFqid;
++ p_SchemeRegs->kgse_fqb = fqbTmp;
++
++ p_Scheme->nextEngine = p_SchemeParams->nextEngine;
++ p_Scheme->doneAction = p_SchemeParams->kgNextEngineParams.doneAction;
++
++ return E_OK;
++}
++
++
++/*****************************************************************************/
++/* Inter-module API routines */
++/*****************************************************************************/
++
++t_Error FmPcdKgBuildClsPlanGrp(t_Handle h_FmPcd, t_FmPcdKgInterModuleClsPlanGrpParams *p_Grp, t_FmPcdKgInterModuleClsPlanSet *p_ClsPlanSet)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ t_FmPcdKgClsPlanGrp *p_ClsPlanGrp;
++ t_FmPcdIpcKgClsPlanParams kgAlloc;
++ t_Error err = E_OK;
++ uint32_t oredVectors = 0;
++ int i, j;
++
++ /* this routine is protected by the calling routine ! */
++ if (p_Grp->numOfOptions >= FM_PCD_MAX_NUM_OF_OPTIONS(FM_PCD_MAX_NUM_OF_CLS_PLANS))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE,("Too many classification plan basic options selected."));
++
++ /* find a new clsPlan group */
++ for (i = 0; i < FM_MAX_NUM_OF_PORTS; i++)
++ if (!p_FmPcd->p_FmPcdKg->clsPlanGrps[i].used)
++ break;
++ if (i == FM_MAX_NUM_OF_PORTS)
++ RETURN_ERROR(MAJOR, E_FULL,("No classification plan groups available."));
++
++ p_FmPcd->p_FmPcdKg->clsPlanGrps[i].used = TRUE;
++
++ p_Grp->clsPlanGrpId = (uint8_t)i;
++
++ if (p_Grp->numOfOptions == 0)
++ p_FmPcd->p_FmPcdKg->emptyClsPlanGrpId = (uint8_t)i;
++
++ p_ClsPlanGrp = &p_FmPcd->p_FmPcdKg->clsPlanGrps[i];
++ p_ClsPlanGrp->netEnvId = p_Grp->netEnvId;
++ p_ClsPlanGrp->owners = 0;
++ FmPcdSetClsPlanGrpId(p_FmPcd, p_Grp->netEnvId, p_Grp->clsPlanGrpId);
++ if (p_Grp->numOfOptions != 0)
++ FmPcdIncNetEnvOwners(p_FmPcd, p_Grp->netEnvId);
++
++ p_ClsPlanGrp->sizeOfGrp = (uint16_t)(1 << p_Grp->numOfOptions);
++ /* a minimal group of 8 is required */
++ if (p_ClsPlanGrp->sizeOfGrp < CLS_PLAN_NUM_PER_GRP)
++ p_ClsPlanGrp->sizeOfGrp = CLS_PLAN_NUM_PER_GRP;
++ if (p_FmPcd->guestId == NCSW_MASTER_ID)
++ {
++ err = KgAllocClsPlanEntries(h_FmPcd, p_ClsPlanGrp->sizeOfGrp, p_FmPcd->guestId, &p_ClsPlanGrp->baseEntry);
++
++ if (err)
++ RETURN_ERROR(MINOR, E_INVALID_STATE, NO_MSG);
++ }
++ else
++ {
++ t_FmPcdIpcMsg msg;
++ uint32_t replyLength;
++ t_FmPcdIpcReply reply;
++
++ /* in GUEST_PARTITION, we use the IPC, to also set a private driver group if required */
++ memset(&reply, 0, sizeof(reply));
++ memset(&msg, 0, sizeof(msg));
++ memset(&kgAlloc, 0, sizeof(kgAlloc));
++ kgAlloc.guestId = p_FmPcd->guestId;
++ kgAlloc.numOfClsPlanEntries = p_ClsPlanGrp->sizeOfGrp;
++ msg.msgId = FM_PCD_ALLOC_KG_CLSPLAN;
++ memcpy(msg.msgBody, &kgAlloc, sizeof(kgAlloc));
++ replyLength = (sizeof(uint32_t) + sizeof(p_ClsPlanGrp->baseEntry));
++ if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
++ (uint8_t*)&msg,
++ sizeof(msg.msgId) + sizeof(kgAlloc),
++ (uint8_t*)&reply,
++ &replyLength,
++ NULL,
++ NULL)) != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ if (replyLength != (sizeof(uint32_t) + sizeof(p_ClsPlanGrp->baseEntry)))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
++ if ((t_Error)reply.error != E_OK)
++ RETURN_ERROR(MINOR, (t_Error)reply.error, NO_MSG);
++
++ p_ClsPlanGrp->baseEntry = *(uint8_t*)(reply.replyBody);
++ }
++
++ /* build classification plan entries parameters */
++ p_ClsPlanSet->baseEntry = p_ClsPlanGrp->baseEntry;
++ p_ClsPlanSet->numOfClsPlanEntries = p_ClsPlanGrp->sizeOfGrp;
++
++ oredVectors = 0;
++ for (i = 0; inumOfOptions; i++)
++ {
++ oredVectors |= p_Grp->optVectors[i];
++ /* save an array of used options - the indexes represent the power of 2 index */
++ p_ClsPlanGrp->optArray[i] = p_Grp->options[i];
++ }
++ /* set the classification plan relevant entries so that all bits
++ * relevant to the list of options is cleared
++ */
++ for (j = 0; jsizeOfGrp; j++)
++ p_ClsPlanSet->vectors[j] = ~oredVectors;
++
++ for (i = 0; inumOfOptions; i++)
++ {
++ /* option i got the place 2^i in the clsPlan array. all entries that
++ * have bit i set, should have the vector bit cleared. So each option
++ * has one location that it is exclusive (1,2,4,8...) and represent the
++ * presence of that option only, and other locations that represent a
++ * combination of options.
++ * e.g:
++ * If ethernet-BC is option 1 it gets entry 2 in the table. Entry 2
++ * now represents a frame with ethernet-BC header - so the bit
++ * representing ethernet-BC should be set and all other option bits
++ * should be cleared.
++ * Entries 2,3,6,7,10... also have ethernet-BC and therefore have bit
++ * vector[1] set, but they also have other bits set:
++ * 3=1+2, options 0 and 1
++ * 6=2+4, options 1 and 2
++ * 7=1+2+4, options 0,1,and 2
++ * 10=2+8, options 1 and 3
++ * etc.
++ * */
++
++ /* now for each option (i), we set their bits in all entries (j)
++ * that contain bit 2^i.
++ */
++ for (j = 0; jsizeOfGrp; j++)
++ {
++ if (j & (1<vectors[j] |= p_Grp->optVectors[i];
++ }
++ }
++
++ return E_OK;
++}
++
++void FmPcdKgDestroyClsPlanGrp(t_Handle h_FmPcd, uint8_t grpId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ t_FmPcdIpcKgClsPlanParams kgAlloc;
++ t_Error err;
++ t_FmPcdIpcMsg msg;
++ uint32_t replyLength;
++ t_FmPcdIpcReply reply;
++
++ /* check that no port is bound to this clsPlan */
++ if (p_FmPcd->p_FmPcdKg->clsPlanGrps[grpId].owners)
++ {
++ REPORT_ERROR(MINOR, E_INVALID_STATE, ("Trying to delete a clsPlan grp that has ports bound to"));
++ return;
++ }
++
++ FmPcdSetClsPlanGrpId(p_FmPcd, p_FmPcd->p_FmPcdKg->clsPlanGrps[grpId].netEnvId, ILLEGAL_CLS_PLAN);
++
++ if (grpId == p_FmPcd->p_FmPcdKg->emptyClsPlanGrpId)
++ p_FmPcd->p_FmPcdKg->emptyClsPlanGrpId = ILLEGAL_CLS_PLAN;
++ else
++ FmPcdDecNetEnvOwners(p_FmPcd, p_FmPcd->p_FmPcdKg->clsPlanGrps[grpId].netEnvId);
++
++ /* free blocks */
++ if (p_FmPcd->guestId == NCSW_MASTER_ID)
++ KgFreeClsPlanEntries(h_FmPcd,
++ p_FmPcd->p_FmPcdKg->clsPlanGrps[grpId].sizeOfGrp,
++ p_FmPcd->guestId,
++ p_FmPcd->p_FmPcdKg->clsPlanGrps[grpId].baseEntry);
++ else /* in GUEST_PARTITION, we use the IPC, to also set a private driver group if required */
++ {
++ memset(&reply, 0, sizeof(reply));
++ memset(&msg, 0, sizeof(msg));
++ kgAlloc.guestId = p_FmPcd->guestId;
++ kgAlloc.numOfClsPlanEntries = p_FmPcd->p_FmPcdKg->clsPlanGrps[grpId].sizeOfGrp;
++ kgAlloc.clsPlanBase = p_FmPcd->p_FmPcdKg->clsPlanGrps[grpId].baseEntry;
++ msg.msgId = FM_PCD_FREE_KG_CLSPLAN;
++ memcpy(msg.msgBody, &kgAlloc, sizeof(kgAlloc));
++ replyLength = sizeof(uint32_t);
++ err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
++ (uint8_t*)&msg,
++ sizeof(msg.msgId) + sizeof(kgAlloc),
++ (uint8_t*)&reply,
++ &replyLength,
++ NULL,
++ NULL);
++ if (err != E_OK)
++ {
++ REPORT_ERROR(MINOR, err, NO_MSG);
++ return;
++ }
++ if (replyLength != sizeof(uint32_t))
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
++ return;
++ }
++ if ((t_Error)reply.error != E_OK)
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Free KG clsPlan failed"));
++ return;
++ }
++ }
++
++ /* clear clsPlan driver structure */
++ memset(&p_FmPcd->p_FmPcdKg->clsPlanGrps[grpId], 0, sizeof(t_FmPcdKgClsPlanGrp));
++}
++
++t_Error FmPcdKgBuildBindPortToSchemes(t_Handle h_FmPcd , t_FmPcdKgInterModuleBindPortToSchemes *p_BindPort, uint32_t *p_SpReg, bool add)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ uint32_t j, schemesPerPortVector = 0;
++ t_FmPcdKgScheme *p_Scheme;
++ uint8_t i, relativeSchemeId;
++ uint32_t tmp, walking1Mask;
++ uint8_t swPortIndex = 0;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdKg, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
++
++ /* for each scheme */
++ for (i = 0; inumOfSchemes; i++)
++ {
++ relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmPcd, p_BindPort->schemesIds[i]);
++ if (relativeSchemeId >= FM_PCD_KG_NUM_OF_SCHEMES)
++ RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
++
++ if (add)
++ {
++ p_Scheme = &p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId];
++ if (!FmPcdKgIsSchemeValidSw(p_Scheme))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Requested scheme is invalid."));
++ /* check netEnvId of the port against the scheme netEnvId */
++ if ((p_Scheme->netEnvId != p_BindPort->netEnvId) && (p_Scheme->netEnvId != ILLEGAL_NETENV))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Port may not be bound to requested scheme - differ in netEnvId"));
++
++ /* if next engine is private port policer profile, we need to check that it is valid */
++ HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, p_BindPort->hardwarePortId);
++ if (p_Scheme->nextRelativePlcrProfile)
++ {
++ for (j = 0;jnumOfProfiles;j++)
++ {
++ ASSERT_COND(p_FmPcd->p_FmPcdPlcr->portsMapping[swPortIndex].h_FmPort);
++ if (p_Scheme->relativeProfileId+j >= p_FmPcd->p_FmPcdPlcr->portsMapping[swPortIndex].numOfProfiles)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Relative profile not in range"));
++ if (!FmPcdPlcrIsProfileValid(p_FmPcd, (uint16_t)(p_FmPcd->p_FmPcdPlcr->portsMapping[swPortIndex].profilesBase + p_Scheme->relativeProfileId + j)))
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Relative profile not valid."));
++ }
++ }
++ if (!p_BindPort->useClsPlan)
++ {
++ /* This check may be redundant as port is a assigned to the whole NetEnv */
++
++ /* if this port does not use clsPlan, it may not be bound to schemes with units that contain
++ cls plan options. Schemes that are used only directly, should not be checked.
++ it also may not be bound to schemes that go to CC with units that are options - so we OR
++ the match vector and the grpBits (= ccUnits) */
++ if ((p_Scheme->matchVector != SCHEME_ALWAYS_DIRECT) || p_Scheme->ccUnits)
++ {
++ walking1Mask = 0x80000000;
++ tmp = (p_Scheme->matchVector == SCHEME_ALWAYS_DIRECT)? 0:p_Scheme->matchVector;
++ tmp |= p_Scheme->ccUnits;
++ while (tmp)
++ {
++ if (tmp & walking1Mask)
++ {
++ tmp &= ~walking1Mask;
++ if (!PcdNetEnvIsUnitWithoutOpts(p_FmPcd, p_Scheme->netEnvId, walking1Mask))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Port (without clsPlan) may not be bound to requested scheme - uses clsPlan options"));
++ }
++ walking1Mask >>= 1;
++ }
++ }
++ }
++ }
++ /* build vector */
++ schemesPerPortVector |= 1 << (31 - p_BindPort->schemesIds[i]);
++ }
++
++ *p_SpReg = schemesPerPortVector;
++
++ return E_OK;
++}
++
++t_Error FmPcdKgBindPortToSchemes(t_Handle h_FmPcd , t_FmPcdKgInterModuleBindPortToSchemes *p_SchemeBind)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ uint32_t spReg;
++ t_Error err = E_OK;
++
++ err = FmPcdKgBuildBindPortToSchemes(h_FmPcd, p_SchemeBind, &spReg, TRUE);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ err = KgWriteSp(p_FmPcd, p_SchemeBind->hardwarePortId, spReg, TRUE);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ IncSchemeOwners(p_FmPcd, p_SchemeBind);
++
++ return E_OK;
++}
++
++t_Error FmPcdKgUnbindPortToSchemes(t_Handle h_FmPcd, t_FmPcdKgInterModuleBindPortToSchemes *p_SchemeBind)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ uint32_t spReg;
++ t_Error err = E_OK;
++
++ err = FmPcdKgBuildBindPortToSchemes(p_FmPcd, p_SchemeBind, &spReg, FALSE);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ err = KgWriteSp(p_FmPcd, p_SchemeBind->hardwarePortId, spReg, FALSE);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ DecSchemeOwners(p_FmPcd, p_SchemeBind);
++
++ return E_OK;
++}
++
++bool FmPcdKgIsSchemeValidSw(t_Handle h_Scheme)
++{
++ t_FmPcdKgScheme *p_Scheme = (t_FmPcdKgScheme*)h_Scheme;
++
++ return p_Scheme->valid;
++}
++
++bool KgIsSchemeAlwaysDirect(t_Handle h_FmPcd, uint8_t schemeId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ if (p_FmPcd->p_FmPcdKg->schemes[schemeId].matchVector == SCHEME_ALWAYS_DIRECT)
++ return TRUE;
++ else
++ return FALSE;
++}
++
++t_Error FmPcdKgAllocSchemes(t_Handle h_FmPcd, uint8_t numOfSchemes, uint8_t guestId, uint8_t *p_SchemesIds)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++ uint8_t i, j;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdKg, E_INVALID_HANDLE);
++
++ /* This routine is issued only on master core of master partition -
++ either directly or through IPC, so no need for lock */
++
++ for (j = 0, i = 0; i < FM_PCD_KG_NUM_OF_SCHEMES && j < numOfSchemes; i++)
++ {
++ if (!p_FmPcd->p_FmPcdKg->schemesMng[i].allocated)
++ {
++ p_FmPcd->p_FmPcdKg->schemesMng[i].allocated = TRUE;
++ p_FmPcd->p_FmPcdKg->schemesMng[i].ownerId = guestId;
++ p_SchemesIds[j] = i;
++ j++;
++ }
++ }
++
++ if (j != numOfSchemes)
++ {
++ /* roll back */
++ for (j--; j; j--)
++ {
++ p_FmPcd->p_FmPcdKg->schemesMng[p_SchemesIds[j]].allocated = FALSE;
++ p_FmPcd->p_FmPcdKg->schemesMng[p_SchemesIds[j]].ownerId = 0;
++ p_SchemesIds[j] = 0;
++ }
++
++ RETURN_ERROR(MAJOR, E_NOT_AVAILABLE, ("No schemes found"));
++ }
++
++ return E_OK;
++}
++
++t_Error FmPcdKgFreeSchemes(t_Handle h_FmPcd, uint8_t numOfSchemes, uint8_t guestId, uint8_t *p_SchemesIds)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++ uint8_t i;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdKg, E_INVALID_HANDLE);
++
++ /* This routine is issued only on master core of master partition -
++ either directly or through IPC */
++
++ for (i = 0; i < numOfSchemes; i++)
++ {
++ if (!p_FmPcd->p_FmPcdKg->schemesMng[p_SchemesIds[i]].allocated)
++ {
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Scheme was not previously allocated"));
++ }
++ if (p_FmPcd->p_FmPcdKg->schemesMng[p_SchemesIds[i]].ownerId != guestId)
++ {
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Scheme is not owned by caller. "));
++ }
++ p_FmPcd->p_FmPcdKg->schemesMng[p_SchemesIds[i]].allocated = FALSE;
++ p_FmPcd->p_FmPcdKg->schemesMng[p_SchemesIds[i]].ownerId = 0;
++ }
++
++ return E_OK;
++}
++
++t_Error KgAllocClsPlanEntries(t_Handle h_FmPcd, uint16_t numOfClsPlanEntries, uint8_t guestId, uint8_t *p_First)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++ uint8_t numOfBlocks, blocksFound=0, first=0;
++ uint8_t i, j;
++
++ /* This routine is issued only on master core of master partition -
++ either directly or through IPC, so no need for lock */
++
++ if (!numOfClsPlanEntries)
++ return E_OK;
++
++ if ((numOfClsPlanEntries % CLS_PLAN_NUM_PER_GRP) || (!POWER_OF_2(numOfClsPlanEntries)))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("numOfClsPlanEntries must be a power of 2 and divisible by 8"));
++
++ numOfBlocks = (uint8_t)(numOfClsPlanEntries/CLS_PLAN_NUM_PER_GRP);
++
++ /* try to find consequent blocks */
++ first = 0;
++ for (i = 0; i < FM_PCD_MAX_NUM_OF_CLS_PLANS/CLS_PLAN_NUM_PER_GRP;)
++ {
++ if (!p_FmPcd->p_FmPcdKg->clsPlanBlocksMng[i].allocated)
++ {
++ blocksFound++;
++ i++;
++ if (blocksFound == numOfBlocks)
++ break;
++ }
++ else
++ {
++ blocksFound = 0;
++ /* advance i to the next aligned address */
++ first = i = (uint8_t)(first + numOfBlocks);
++ }
++ }
++
++ if (blocksFound == numOfBlocks)
++ {
++ *p_First = (uint8_t)(first * CLS_PLAN_NUM_PER_GRP);
++ for (j = first; j < (first + numOfBlocks); j++)
++ {
++ p_FmPcd->p_FmPcdKg->clsPlanBlocksMng[j].allocated = TRUE;
++ p_FmPcd->p_FmPcdKg->clsPlanBlocksMng[j].ownerId = guestId;
++ }
++ return E_OK;
++ }
++ else
++ RETURN_ERROR(MINOR, E_FULL, ("No resources for clsPlan"));
++}
++
++void KgFreeClsPlanEntries(t_Handle h_FmPcd, uint16_t numOfClsPlanEntries, uint8_t guestId, uint8_t base)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ uint8_t numOfBlocks;
++ uint8_t i, baseBlock;
++
++#ifdef DISABLE_ASSERTIONS
++UNUSED(guestId);
++#endif /* DISABLE_ASSERTIONS */
++
++ /* This routine is issued only on master core of master partition -
++ either directly or through IPC, so no need for lock */
++
++ numOfBlocks = (uint8_t)(numOfClsPlanEntries/CLS_PLAN_NUM_PER_GRP);
++ ASSERT_COND(!(base%CLS_PLAN_NUM_PER_GRP));
++
++ baseBlock = (uint8_t)(base/CLS_PLAN_NUM_PER_GRP);
++ for (i=baseBlock;ip_FmPcdKg->clsPlanBlocksMng[i].allocated);
++ ASSERT_COND(guestId == p_FmPcd->p_FmPcdKg->clsPlanBlocksMng[i].ownerId);
++ p_FmPcd->p_FmPcdKg->clsPlanBlocksMng[i].allocated = FALSE;
++ p_FmPcd->p_FmPcdKg->clsPlanBlocksMng[i].ownerId = 0;
++ }
++}
++
++void KgEnable(t_FmPcd *p_FmPcd)
++{
++ struct fman_kg_regs *p_Regs = p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs;
++
++ ASSERT_COND(FmIsMaster(p_FmPcd->h_Fm));
++ fman_kg_enable(p_Regs);
++}
++
++void KgDisable(t_FmPcd *p_FmPcd)
++{
++ struct fman_kg_regs *p_Regs = p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs;
++
++ ASSERT_COND(FmIsMaster(p_FmPcd->h_Fm));
++ fman_kg_disable(p_Regs);
++}
++
++void KgSetClsPlan(t_Handle h_FmPcd, t_FmPcdKgInterModuleClsPlanSet *p_Set)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++ struct fman_kg_cp_regs *p_FmPcdKgPortRegs;
++ uint32_t tmpKgarReg = 0, intFlags;
++ uint16_t i, j;
++
++ /* This routine is protected by the calling routine ! */
++ ASSERT_COND(FmIsMaster(p_FmPcd->h_Fm));
++ p_FmPcdKgPortRegs = &p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->clsPlanRegs;
++
++ intFlags = KgHwLock(p_FmPcd->p_FmPcdKg);
++ for (i=p_Set->baseEntry;ibaseEntry+p_Set->numOfClsPlanEntries;i+=8)
++ {
++ tmpKgarReg = FmPcdKgBuildWriteClsPlanBlockActionReg((uint8_t)(i / CLS_PLAN_NUM_PER_GRP));
++
++ for (j = i; j < i+8; j++)
++ {
++ ASSERT_COND(IN_RANGE(0, (j - p_Set->baseEntry), FM_PCD_MAX_NUM_OF_CLS_PLANS-1));
++ WRITE_UINT32(p_FmPcdKgPortRegs->kgcpe[j % CLS_PLAN_NUM_PER_GRP],p_Set->vectors[j - p_Set->baseEntry]);
++ }
++
++ if (WriteKgarWait(p_FmPcd, tmpKgarReg) != E_OK)
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_STATE, ("WriteKgarWait FAILED"));
++ KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
++ return;
++ }
++ }
++ KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
++}
++
++t_Handle KgConfig( t_FmPcd *p_FmPcd, t_FmPcdParams *p_FmPcdParams)
++{
++ t_FmPcdKg *p_FmPcdKg;
++
++ UNUSED(p_FmPcd);
++
++ if (p_FmPcdParams->numOfSchemes > FM_PCD_KG_NUM_OF_SCHEMES)
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE,
++ ("numOfSchemes should not exceed %d", FM_PCD_KG_NUM_OF_SCHEMES));
++ return NULL;
++ }
++
++ p_FmPcdKg = (t_FmPcdKg *)XX_Malloc(sizeof(t_FmPcdKg));
++ if (!p_FmPcdKg)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Keygen allocation FAILED"));
++ return NULL;
++ }
++ memset(p_FmPcdKg, 0, sizeof(t_FmPcdKg));
++
++
++ if (FmIsMaster(p_FmPcd->h_Fm))
++ {
++ p_FmPcdKg->p_FmPcdKgRegs = (struct fman_kg_regs *)UINT_TO_PTR(FmGetPcdKgBaseAddr(p_FmPcdParams->h_Fm));
++ p_FmPcd->exceptions |= DEFAULT_fmPcdKgErrorExceptions;
++ p_FmPcdKg->p_IndirectAccessRegs = (u_FmPcdKgIndirectAccessRegs *)&p_FmPcdKg->p_FmPcdKgRegs->fmkg_indirect[0];
++ }
++
++ p_FmPcdKg->numOfSchemes = p_FmPcdParams->numOfSchemes;
++ if ((p_FmPcd->guestId == NCSW_MASTER_ID) && !p_FmPcdKg->numOfSchemes)
++ {
++ p_FmPcdKg->numOfSchemes = FM_PCD_KG_NUM_OF_SCHEMES;
++ DBG(WARNING, ("numOfSchemes was defined 0 by user, re-defined by driver to FM_PCD_KG_NUM_OF_SCHEMES"));
++ }
++
++ p_FmPcdKg->emptyClsPlanGrpId = ILLEGAL_CLS_PLAN;
++
++ return p_FmPcdKg;
++}
++
++t_Error KgInit(t_FmPcd *p_FmPcd)
++{
++ t_Error err = E_OK;
++
++ p_FmPcd->p_FmPcdKg->h_HwSpinlock = XX_InitSpinlock();
++ if (!p_FmPcd->p_FmPcdKg->h_HwSpinlock)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("FM KG HW spinlock"));
++
++ if (p_FmPcd->guestId == NCSW_MASTER_ID)
++ err = KgInitMaster(p_FmPcd);
++ else
++ err = KgInitGuest(p_FmPcd);
++
++ if (err != E_OK)
++ {
++ if (p_FmPcd->p_FmPcdKg->h_HwSpinlock)
++ XX_FreeSpinlock(p_FmPcd->p_FmPcdKg->h_HwSpinlock);
++ }
++
++ return err;
++}
++
++t_Error KgFree(t_FmPcd *p_FmPcd)
++{
++ t_FmPcdIpcKgSchemesParams kgAlloc;
++ t_Error err = E_OK;
++ t_FmPcdIpcMsg msg;
++ uint32_t replyLength;
++ t_FmPcdIpcReply reply;
++
++ FmUnregisterIntr(p_FmPcd->h_Fm, e_FM_MOD_KG, 0, e_FM_INTR_TYPE_ERR);
++
++ if (p_FmPcd->guestId == NCSW_MASTER_ID)
++ {
++ err = FmPcdKgFreeSchemes(p_FmPcd,
++ p_FmPcd->p_FmPcdKg->numOfSchemes,
++ p_FmPcd->guestId,
++ p_FmPcd->p_FmPcdKg->schemesIds);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ if (p_FmPcd->p_FmPcdKg->h_HwSpinlock)
++ XX_FreeSpinlock(p_FmPcd->p_FmPcdKg->h_HwSpinlock);
++
++ return E_OK;
++ }
++
++ /* guest */
++ memset(&reply, 0, sizeof(reply));
++ memset(&msg, 0, sizeof(msg));
++ kgAlloc.numOfSchemes = p_FmPcd->p_FmPcdKg->numOfSchemes;
++ kgAlloc.guestId = p_FmPcd->guestId;
++ ASSERT_COND(kgAlloc.numOfSchemes < FM_PCD_KG_NUM_OF_SCHEMES);
++ memcpy(kgAlloc.schemesIds, p_FmPcd->p_FmPcdKg->schemesIds, (sizeof(uint8_t))*kgAlloc.numOfSchemes);
++ msg.msgId = FM_PCD_FREE_KG_SCHEMES;
++ memcpy(msg.msgBody, &kgAlloc, sizeof(kgAlloc));
++ replyLength = sizeof(uint32_t);
++ if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
++ (uint8_t*)&msg,
++ sizeof(msg.msgId) + sizeof(kgAlloc),
++ (uint8_t*)&reply,
++ &replyLength,
++ NULL,
++ NULL)) != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ if (replyLength != sizeof(uint32_t))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
++
++ if (p_FmPcd->p_FmPcdKg->h_HwSpinlock)
++ XX_FreeSpinlock(p_FmPcd->p_FmPcdKg->h_HwSpinlock);
++
++ return (t_Error)reply.error;
++}
++
++t_Error FmPcdKgSetOrBindToClsPlanGrp(t_Handle h_FmPcd, uint8_t hardwarePortId, uint8_t netEnvId, protocolOpt_t *p_OptArray, uint8_t *p_ClsPlanGrpId, bool *p_IsEmptyClsPlanGrp)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++ t_FmPcdKgInterModuleClsPlanGrpParams grpParams, *p_GrpParams;
++ t_FmPcdKgClsPlanGrp *p_ClsPlanGrp;
++ t_FmPcdKgInterModuleClsPlanSet *p_ClsPlanSet;
++ t_Error err;
++
++ /* This function is issued only from FM_PORT_SetPcd which locked all PCD modules,
++ so no need for lock here */
++
++ memset(&grpParams, 0, sizeof(grpParams));
++ grpParams.clsPlanGrpId = ILLEGAL_CLS_PLAN;
++ p_GrpParams = &grpParams;
++
++ p_GrpParams->netEnvId = netEnvId;
++
++ /* Get from the NetEnv the information of the clsPlan (can be already created,
++ * or needs to build) */
++ err = PcdGetClsPlanGrpParams(h_FmPcd, p_GrpParams);
++ if (err)
++ RETURN_ERROR(MINOR,err,NO_MSG);
++
++ if (p_GrpParams->grpExists)
++ {
++ /* this group was already updated (at least) in SW */
++ *p_ClsPlanGrpId = p_GrpParams->clsPlanGrpId;
++ }
++ else
++ {
++ p_ClsPlanSet = (t_FmPcdKgInterModuleClsPlanSet *)XX_Malloc(sizeof(t_FmPcdKgInterModuleClsPlanSet));
++ if (!p_ClsPlanSet)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Classification plan set"));
++ memset(p_ClsPlanSet, 0, sizeof(t_FmPcdKgInterModuleClsPlanSet));
++ /* Build (in SW) the clsPlan parameters, including the vectors to be written to HW */
++ err = FmPcdKgBuildClsPlanGrp(h_FmPcd, p_GrpParams, p_ClsPlanSet);
++ if (err)
++ {
++ XX_Free(p_ClsPlanSet);
++ RETURN_ERROR(MINOR, err, NO_MSG);
++ }
++ *p_ClsPlanGrpId = p_GrpParams->clsPlanGrpId;
++
++ if (p_FmPcd->h_Hc)
++ {
++ /* write clsPlan entries to memory */
++ err = FmHcPcdKgSetClsPlan(p_FmPcd->h_Hc, p_ClsPlanSet);
++ if (err)
++ {
++ XX_Free(p_ClsPlanSet);
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++ }
++ else
++ /* write clsPlan entries to memory */
++ KgSetClsPlan(p_FmPcd, p_ClsPlanSet);
++
++ XX_Free(p_ClsPlanSet);
++ }
++
++ /* Set caller parameters */
++
++ /* mark if this is an empty classification group */
++ if (*p_ClsPlanGrpId == p_FmPcd->p_FmPcdKg->emptyClsPlanGrpId)
++ *p_IsEmptyClsPlanGrp = TRUE;
++ else
++ *p_IsEmptyClsPlanGrp = FALSE;
++
++ p_ClsPlanGrp = &p_FmPcd->p_FmPcdKg->clsPlanGrps[*p_ClsPlanGrpId];
++
++ /* increment owners number */
++ p_ClsPlanGrp->owners++;
++
++ /* copy options array for port */
++ memcpy(p_OptArray, &p_FmPcd->p_FmPcdKg->clsPlanGrps[*p_ClsPlanGrpId].optArray, FM_PCD_MAX_NUM_OF_OPTIONS(FM_PCD_MAX_NUM_OF_CLS_PLANS)*sizeof(protocolOpt_t));
++
++ /* bind port to the new or existing group */
++ err = BindPortToClsPlanGrp(p_FmPcd, hardwarePortId, p_GrpParams->clsPlanGrpId);
++ if (err)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++
++ return E_OK;
++}
++
++t_Error FmPcdKgDeleteOrUnbindPortToClsPlanGrp(t_Handle h_FmPcd, uint8_t hardwarePortId, uint8_t clsPlanGrpId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++ t_FmPcdKgClsPlanGrp *p_ClsPlanGrp = &p_FmPcd->p_FmPcdKg->clsPlanGrps[clsPlanGrpId];
++ t_FmPcdKgInterModuleClsPlanSet *p_ClsPlanSet;
++ t_Error err;
++
++ /* This function is issued only from FM_PORT_DeletePcd which locked all PCD modules,
++ so no need for lock here */
++
++ UnbindPortToClsPlanGrp(p_FmPcd, hardwarePortId);
++
++ /* decrement owners number */
++ ASSERT_COND(p_ClsPlanGrp->owners);
++ p_ClsPlanGrp->owners--;
++
++ if (!p_ClsPlanGrp->owners)
++ {
++ if (p_FmPcd->h_Hc)
++ {
++ err = FmHcPcdKgDeleteClsPlan(p_FmPcd->h_Hc, clsPlanGrpId);
++ return err;
++ }
++ else
++ {
++ /* clear clsPlan entries in memory */
++ p_ClsPlanSet = (t_FmPcdKgInterModuleClsPlanSet *)XX_Malloc(sizeof(t_FmPcdKgInterModuleClsPlanSet));
++ if (!p_ClsPlanSet)
++ {
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Classification plan set"));
++ }
++ memset(p_ClsPlanSet, 0, sizeof(t_FmPcdKgInterModuleClsPlanSet));
++
++ p_ClsPlanSet->baseEntry = p_FmPcd->p_FmPcdKg->clsPlanGrps[clsPlanGrpId].baseEntry;
++ p_ClsPlanSet->numOfClsPlanEntries = p_FmPcd->p_FmPcdKg->clsPlanGrps[clsPlanGrpId].sizeOfGrp;
++ KgSetClsPlan(p_FmPcd, p_ClsPlanSet);
++ XX_Free(p_ClsPlanSet);
++
++ FmPcdKgDestroyClsPlanGrp(h_FmPcd, clsPlanGrpId);
++ }
++ }
++ return E_OK;
++}
++
++uint32_t FmPcdKgGetRequiredAction(t_Handle h_FmPcd, uint8_t schemeId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ ASSERT_COND(p_FmPcd->p_FmPcdKg->schemes[schemeId].valid);
++
++ return p_FmPcd->p_FmPcdKg->schemes[schemeId].requiredAction;
++}
++
++uint32_t FmPcdKgGetPointedOwners(t_Handle h_FmPcd, uint8_t schemeId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ ASSERT_COND(p_FmPcd->p_FmPcdKg->schemes[schemeId].valid);
++
++ return p_FmPcd->p_FmPcdKg->schemes[schemeId].pointedOwners;
++}
++
++bool FmPcdKgIsDirectPlcr(t_Handle h_FmPcd, uint8_t schemeId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ ASSERT_COND(p_FmPcd->p_FmPcdKg->schemes[schemeId].valid);
++
++ return p_FmPcd->p_FmPcdKg->schemes[schemeId].directPlcr;
++}
++
++
++uint16_t FmPcdKgGetRelativeProfileId(t_Handle h_FmPcd, uint8_t schemeId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ ASSERT_COND(p_FmPcd->p_FmPcdKg->schemes[schemeId].valid);
++
++ return p_FmPcd->p_FmPcdKg->schemes[schemeId].relativeProfileId;
++}
++
++bool FmPcdKgIsDistrOnPlcrProfile(t_Handle h_FmPcd, uint8_t schemeId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ ASSERT_COND(p_FmPcd->p_FmPcdKg->schemes[schemeId].valid);
++
++ if ((p_FmPcd->p_FmPcdKg->schemes[schemeId].extractedOrs &&
++ p_FmPcd->p_FmPcdKg->schemes[schemeId].bitOffsetInPlcrProfile) ||
++ p_FmPcd->p_FmPcdKg->schemes[schemeId].nextRelativePlcrProfile)
++ return TRUE;
++ else
++ return FALSE;
++
++}
++
++e_FmPcdEngine FmPcdKgGetNextEngine(t_Handle h_FmPcd, uint8_t relativeSchemeId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ ASSERT_COND(p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].valid);
++
++ return p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].nextEngine;
++}
++
++e_FmPcdDoneAction FmPcdKgGetDoneAction(t_Handle h_FmPcd, uint8_t schemeId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ ASSERT_COND(p_FmPcd->p_FmPcdKg->schemes[schemeId].valid);
++
++ return p_FmPcd->p_FmPcdKg->schemes[schemeId].doneAction;
++}
++
++void FmPcdKgUpdateRequiredAction(t_Handle h_Scheme, uint32_t requiredAction)
++{
++ t_FmPcdKgScheme *p_Scheme = (t_FmPcdKgScheme *)h_Scheme;
++
++ /* this routine is protected by calling routine */
++
++ ASSERT_COND(p_Scheme->valid);
++
++ p_Scheme->requiredAction |= requiredAction;
++}
++
++bool FmPcdKgHwSchemeIsValid(uint32_t schemeModeReg)
++{
++ return (bool)!!(schemeModeReg & KG_SCH_MODE_EN);
++}
++
++uint32_t FmPcdKgBuildWriteSchemeActionReg(uint8_t schemeId, bool updateCounter)
++{
++ return (uint32_t)(((uint32_t)schemeId << FM_PCD_KG_KGAR_NUM_SHIFT) |
++ FM_KG_KGAR_GO |
++ FM_KG_KGAR_WRITE |
++ FM_KG_KGAR_SEL_SCHEME_ENTRY |
++ DUMMY_PORT_ID |
++ (updateCounter ? FM_KG_KGAR_SCM_WSEL_UPDATE_CNT:0));
++}
++
++uint32_t FmPcdKgBuildReadSchemeActionReg(uint8_t schemeId)
++{
++ return (uint32_t)(((uint32_t)schemeId << FM_PCD_KG_KGAR_NUM_SHIFT) |
++ FM_KG_KGAR_GO |
++ FM_KG_KGAR_READ |
++ FM_KG_KGAR_SEL_SCHEME_ENTRY |
++ DUMMY_PORT_ID |
++ FM_KG_KGAR_SCM_WSEL_UPDATE_CNT);
++
++}
++
++uint32_t FmPcdKgBuildWriteClsPlanBlockActionReg(uint8_t grpId)
++{
++ return (uint32_t)(FM_KG_KGAR_GO |
++ FM_KG_KGAR_WRITE |
++ FM_PCD_KG_KGAR_SEL_CLS_PLAN_ENTRY |
++ DUMMY_PORT_ID |
++ ((uint32_t)grpId << FM_PCD_KG_KGAR_NUM_SHIFT) |
++ FM_PCD_KG_KGAR_WSEL_MASK);
++
++ /* if we ever want to write 1 by 1, use:
++ sel = (uint8_t)(0x01 << (7- (entryId % CLS_PLAN_NUM_PER_GRP)));
++ */
++}
++
++uint32_t FmPcdKgBuildWritePortSchemeBindActionReg(uint8_t hardwarePortId)
++{
++
++ return (uint32_t)(FM_KG_KGAR_GO |
++ FM_KG_KGAR_WRITE |
++ FM_PCD_KG_KGAR_SEL_PORT_ENTRY |
++ hardwarePortId |
++ FM_PCD_KG_KGAR_SEL_PORT_WSEL_SP);
++}
++
++uint32_t FmPcdKgBuildReadPortSchemeBindActionReg(uint8_t hardwarePortId)
++{
++
++ return (uint32_t)(FM_KG_KGAR_GO |
++ FM_KG_KGAR_READ |
++ FM_PCD_KG_KGAR_SEL_PORT_ENTRY |
++ hardwarePortId |
++ FM_PCD_KG_KGAR_SEL_PORT_WSEL_SP);
++}
++
++uint32_t FmPcdKgBuildWritePortClsPlanBindActionReg(uint8_t hardwarePortId)
++{
++
++ return (uint32_t)(FM_KG_KGAR_GO |
++ FM_KG_KGAR_WRITE |
++ FM_PCD_KG_KGAR_SEL_PORT_ENTRY |
++ hardwarePortId |
++ FM_PCD_KG_KGAR_SEL_PORT_WSEL_CPP);
++}
++
++uint8_t FmPcdKgGetClsPlanGrpBase(t_Handle h_FmPcd, uint8_t clsPlanGrp)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ return p_FmPcd->p_FmPcdKg->clsPlanGrps[clsPlanGrp].baseEntry;
++}
++
++uint16_t FmPcdKgGetClsPlanGrpSize(t_Handle h_FmPcd, uint8_t clsPlanGrp)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ return p_FmPcd->p_FmPcdKg->clsPlanGrps[clsPlanGrp].sizeOfGrp;
++}
++
++
++uint8_t FmPcdKgGetSchemeId(t_Handle h_Scheme)
++{
++ return ((t_FmPcdKgScheme*)h_Scheme)->schemeId;
++
++}
++
++#if (DPAA_VERSION >= 11)
++bool FmPcdKgGetVspe(t_Handle h_Scheme)
++{
++ return ((t_FmPcdKgScheme*)h_Scheme)->vspe;
++
++}
++#endif /* (DPAA_VERSION >= 11) */
++
++uint8_t FmPcdKgGetRelativeSchemeId(t_Handle h_FmPcd, uint8_t schemeId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ uint8_t i;
++
++ for (i = 0;ip_FmPcdKg->numOfSchemes;i++)
++ if (p_FmPcd->p_FmPcdKg->schemesIds[i] == schemeId)
++ return i;
++
++ if (i == p_FmPcd->p_FmPcdKg->numOfSchemes)
++ REPORT_ERROR(MAJOR, E_NOT_IN_RANGE, ("Scheme is out of partition range"));
++
++ return FM_PCD_KG_NUM_OF_SCHEMES;
++}
++
++t_Error FmPcdKgCcGetSetParams(t_Handle h_FmPcd, t_Handle h_Scheme, uint32_t requiredAction, uint32_t value)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ uint8_t relativeSchemeId, physicalSchemeId;
++ uint32_t tmpKgarReg, tmpReg32 = 0, intFlags;
++ t_Error err;
++ t_FmPcdKgScheme *p_Scheme = (t_FmPcdKgScheme*)h_Scheme;
++
++ SANITY_CHECK_RETURN_VALUE(h_FmPcd, E_INVALID_HANDLE, 0);
++ SANITY_CHECK_RETURN_VALUE(p_FmPcd->p_FmPcdKg, E_INVALID_HANDLE, 0);
++ SANITY_CHECK_RETURN_VALUE(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE, 0);
++
++ /* Calling function locked all PCD modules, so no need to lock here */
++
++ if (!FmPcdKgIsSchemeValidSw(h_Scheme))
++ RETURN_ERROR(MAJOR, E_ALREADY_EXISTS, ("Scheme is Invalid"));
++
++ if (p_FmPcd->h_Hc)
++ {
++ err = FmHcPcdKgCcGetSetParams(p_FmPcd->h_Hc, h_Scheme, requiredAction, value);
++
++ UpateSchemePointedOwner(h_Scheme,TRUE);
++ FmPcdKgUpdateRequiredAction(h_Scheme,requiredAction);
++ return err;
++ }
++
++ physicalSchemeId = p_Scheme->schemeId;
++
++ relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmPcd, physicalSchemeId);
++ if (relativeSchemeId >= FM_PCD_KG_NUM_OF_SCHEMES)
++ RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
++
++ if (!p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].pointedOwners ||
++ !(p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].requiredAction & requiredAction))
++ {
++ if (requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA)
++ {
++ switch (p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].nextEngine)
++ {
++ case (e_FM_PCD_DONE):
++ if (p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].doneAction == e_FM_PCD_ENQ_FRAME)
++ {
++ tmpKgarReg = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);
++ intFlags = KgHwLock(p_FmPcd->p_FmPcdKg);
++ WriteKgarWait(p_FmPcd, tmpKgarReg);
++ tmpReg32 = GET_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_mode);
++ ASSERT_COND(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME));
++ WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_mode, tmpReg32 | NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA);
++ /* call indirect command for scheme write */
++ tmpKgarReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, FALSE);
++ WriteKgarWait(p_FmPcd, tmpKgarReg);
++ KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
++ }
++ break;
++ case (e_FM_PCD_PLCR):
++ if (!p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].directPlcr ||
++ (p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].extractedOrs &&
++ p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].bitOffsetInPlcrProfile) ||
++ p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].nextRelativePlcrProfile)
++ {
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("In this situation PP can not be with distribution and has to be shared"));
++ }
++ err = FmPcdPlcrCcGetSetParams(h_FmPcd, p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].relativeProfileId, requiredAction);
++ if (err)
++ {
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE,("in this situation the next engine after scheme can be or PLCR or ENQ_FRAME"));
++ }
++ }
++ if (requiredAction & UPDATE_KG_NIA_CC_WA)
++ {
++ if (p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].nextEngine == e_FM_PCD_CC)
++ {
++ tmpKgarReg = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);
++ intFlags = KgHwLock(p_FmPcd->p_FmPcdKg);
++ WriteKgarWait(p_FmPcd, tmpKgarReg);
++ tmpReg32 = GET_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_mode);
++ ASSERT_COND(tmpReg32 & (NIA_ENG_FM_CTL | NIA_FM_CTL_AC_CC));
++ tmpReg32 &= ~NIA_FM_CTL_AC_CC;
++ WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_mode, tmpReg32 | NIA_FM_CTL_AC_PRE_CC);
++ /* call indirect command for scheme write */
++ tmpKgarReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, FALSE);
++ WriteKgarWait(p_FmPcd, tmpKgarReg);
++ KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
++ }
++ }
++ if (requiredAction & UPDATE_KG_OPT_MODE)
++ {
++ tmpKgarReg = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);
++ intFlags = KgHwLock(p_FmPcd->p_FmPcdKg);
++ WriteKgarWait(p_FmPcd, tmpKgarReg);
++ WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_om, value);
++ /* call indirect command for scheme write */
++ tmpKgarReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, FALSE);
++ WriteKgarWait(p_FmPcd, tmpKgarReg);
++ KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
++ }
++ if (requiredAction & UPDATE_KG_NIA)
++ {
++ tmpKgarReg = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);
++ intFlags = KgHwLock(p_FmPcd->p_FmPcdKg);
++ WriteKgarWait(p_FmPcd, tmpKgarReg);
++ tmpReg32 = GET_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_mode);
++ tmpReg32 &= ~(NIA_ENG_MASK | NIA_AC_MASK);
++ tmpReg32 |= value;
++ WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_mode, tmpReg32);
++ /* call indirect command for scheme write */
++ tmpKgarReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, FALSE);
++ WriteKgarWait(p_FmPcd, tmpKgarReg);
++ KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
++ }
++ }
++
++ UpateSchemePointedOwner(h_Scheme, TRUE);
++ FmPcdKgUpdateRequiredAction(h_Scheme, requiredAction);
++
++ return E_OK;
++}
++/*********************** End of inter-module routines ************************/
++
++
++/****************************************/
++/* API routines */
++/****************************************/
++
++t_Handle FM_PCD_KgSchemeSet(t_Handle h_FmPcd, t_FmPcdKgSchemeParams *p_SchemeParams)
++{
++ t_FmPcd *p_FmPcd;
++ struct fman_kg_scheme_regs schemeRegs;
++ struct fman_kg_scheme_regs *p_MemRegs;
++ uint8_t i;
++ t_Error err = E_OK;
++ uint32_t tmpKgarReg;
++ uint32_t intFlags;
++ uint8_t physicalSchemeId, relativeSchemeId = 0;
++ t_FmPcdKgScheme *p_Scheme;
++
++ if (p_SchemeParams->modify)
++ {
++ p_Scheme = (t_FmPcdKgScheme *)p_SchemeParams->id.h_Scheme;
++ p_FmPcd = p_Scheme->h_FmPcd;
++
++ SANITY_CHECK_RETURN_VALUE(p_FmPcd, E_INVALID_HANDLE, NULL);
++ SANITY_CHECK_RETURN_VALUE(p_FmPcd->p_FmPcdKg, E_INVALID_HANDLE, NULL);
++
++ if (!FmPcdKgIsSchemeValidSw(p_Scheme))
++ {
++ REPORT_ERROR(MAJOR, E_ALREADY_EXISTS,
++ ("Scheme is invalid"));
++ return NULL;
++ }
++
++ if (!KgSchemeFlagTryLock(p_Scheme))
++ {
++ DBG(TRACE, ("Scheme Try Lock - BUSY"));
++ /* Signal to caller BUSY condition */
++ p_SchemeParams->id.h_Scheme = NULL;
++ return NULL;
++ }
++ }
++ else
++ {
++ p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ SANITY_CHECK_RETURN_VALUE(p_FmPcd, E_INVALID_HANDLE, NULL);
++ SANITY_CHECK_RETURN_VALUE(p_FmPcd->p_FmPcdKg, E_INVALID_HANDLE, NULL);
++
++ relativeSchemeId = p_SchemeParams->id.relativeSchemeId;
++ /* check that schemeId is in range */
++ if (relativeSchemeId >= p_FmPcd->p_FmPcdKg->numOfSchemes)
++ {
++ REPORT_ERROR(MAJOR, E_NOT_IN_RANGE, ("relative-scheme-id %d!", relativeSchemeId));
++ return NULL;
++ }
++
++ p_Scheme = &p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId];
++ if (FmPcdKgIsSchemeValidSw(p_Scheme))
++ {
++ REPORT_ERROR(MAJOR, E_ALREADY_EXISTS,
++ ("Scheme id (%d)!", relativeSchemeId));
++ return NULL;
++ }
++
++ p_Scheme->schemeId = p_FmPcd->p_FmPcdKg->schemesIds[relativeSchemeId];
++ p_Scheme->h_FmPcd = p_FmPcd;
++
++ p_Scheme->p_Lock = FmPcdAcquireLock(p_FmPcd);
++ if (!p_Scheme->p_Lock)
++ REPORT_ERROR(MAJOR, E_NOT_AVAILABLE, ("FM KG Scheme lock obj!"));
++ }
++
++ err = BuildSchemeRegs((t_Handle)p_Scheme, p_SchemeParams, &schemeRegs);
++ if (err)
++ {
++ REPORT_ERROR(MAJOR, err, NO_MSG);
++ if (p_SchemeParams->modify)
++ KgSchemeFlagUnlock(p_Scheme);
++ if (!p_SchemeParams->modify &&
++ p_Scheme->p_Lock)
++ FmPcdReleaseLock(p_FmPcd, p_Scheme->p_Lock);
++ return NULL;
++ }
++
++ if (p_FmPcd->h_Hc)
++ {
++ err = FmHcPcdKgSetScheme(p_FmPcd->h_Hc,
++ (t_Handle)p_Scheme,
++ &schemeRegs,
++ p_SchemeParams->schemeCounter.update);
++ if (p_SchemeParams->modify)
++ KgSchemeFlagUnlock(p_Scheme);
++ if (err)
++ {
++ if (!p_SchemeParams->modify &&
++ p_Scheme->p_Lock)
++ FmPcdReleaseLock(p_FmPcd, p_Scheme->p_Lock);
++ return NULL;
++ }
++ if (!p_SchemeParams->modify)
++ ValidateSchemeSw(p_Scheme);
++ return (t_Handle)p_Scheme;
++ }
++
++ physicalSchemeId = p_Scheme->schemeId;
++
++ /* configure all 21 scheme registers */
++ p_MemRegs = &p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs;
++ intFlags = KgHwLock(p_FmPcd->p_FmPcdKg);
++ WRITE_UINT32(p_MemRegs->kgse_ppc, schemeRegs.kgse_ppc);
++ WRITE_UINT32(p_MemRegs->kgse_ccbs, schemeRegs.kgse_ccbs);
++ WRITE_UINT32(p_MemRegs->kgse_mode, schemeRegs.kgse_mode);
++ WRITE_UINT32(p_MemRegs->kgse_mv, schemeRegs.kgse_mv);
++ WRITE_UINT32(p_MemRegs->kgse_dv0, schemeRegs.kgse_dv0);
++ WRITE_UINT32(p_MemRegs->kgse_dv1, schemeRegs.kgse_dv1);
++ WRITE_UINT32(p_MemRegs->kgse_ekdv, schemeRegs.kgse_ekdv);
++ WRITE_UINT32(p_MemRegs->kgse_ekfc, schemeRegs.kgse_ekfc);
++ WRITE_UINT32(p_MemRegs->kgse_bmch, schemeRegs.kgse_bmch);
++ WRITE_UINT32(p_MemRegs->kgse_bmcl, schemeRegs.kgse_bmcl);
++ WRITE_UINT32(p_MemRegs->kgse_hc, schemeRegs.kgse_hc);
++ WRITE_UINT32(p_MemRegs->kgse_spc, schemeRegs.kgse_spc);
++ WRITE_UINT32(p_MemRegs->kgse_fqb, schemeRegs.kgse_fqb);
++ WRITE_UINT32(p_MemRegs->kgse_om, schemeRegs.kgse_om);
++ WRITE_UINT32(p_MemRegs->kgse_vsp, schemeRegs.kgse_vsp);
++ for (i=0 ; ikgse_gec[i], schemeRegs.kgse_gec[i]);
++
++ /* call indirect command for scheme write */
++ tmpKgarReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, p_SchemeParams->schemeCounter.update);
++
++ WriteKgarWait(p_FmPcd, tmpKgarReg);
++ KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
++
++ if (!p_SchemeParams->modify)
++ ValidateSchemeSw(p_Scheme);
++ else
++ KgSchemeFlagUnlock(p_Scheme);
++
++ return (t_Handle)p_Scheme;
++}
++
++t_Error FM_PCD_KgSchemeDelete(t_Handle h_Scheme)
++{
++ t_FmPcd *p_FmPcd;
++ uint8_t physicalSchemeId;
++ uint32_t tmpKgarReg, intFlags;
++ t_Error err = E_OK;
++ t_FmPcdKgScheme *p_Scheme = (t_FmPcdKgScheme *)h_Scheme;
++
++ SANITY_CHECK_RETURN_ERROR(h_Scheme, E_INVALID_HANDLE);
++
++ p_FmPcd = (t_FmPcd*)(p_Scheme->h_FmPcd);
++
++ /* check that no port is bound to this scheme */
++ err = InvalidateSchemeSw(h_Scheme);
++ if (err)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++
++ if (p_FmPcd->h_Hc)
++ {
++ err = FmHcPcdKgDeleteScheme(p_FmPcd->h_Hc, h_Scheme);
++ if (p_Scheme->p_Lock)
++ FmPcdReleaseLock(p_FmPcd, p_Scheme->p_Lock);
++ return err;
++ }
++
++ physicalSchemeId = ((t_FmPcdKgScheme *)h_Scheme)->schemeId;
++
++ intFlags = KgHwLock(p_FmPcd->p_FmPcdKg);
++ /* clear mode register, including enable bit */
++ WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_mode, 0);
++
++ /* call indirect command for scheme write */
++ tmpKgarReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, FALSE);
++
++ WriteKgarWait(p_FmPcd, tmpKgarReg);
++ KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
++
++ if (p_Scheme->p_Lock)
++ FmPcdReleaseLock(p_FmPcd, p_Scheme->p_Lock);
++
++ return E_OK;
++}
++
++uint32_t FM_PCD_KgSchemeGetCounter(t_Handle h_Scheme)
++{
++ t_FmPcd *p_FmPcd;
++ uint32_t tmpKgarReg, spc, intFlags;
++ uint8_t physicalSchemeId;
++
++ SANITY_CHECK_RETURN_VALUE(h_Scheme, E_INVALID_HANDLE, 0);
++
++ p_FmPcd = (t_FmPcd*)(((t_FmPcdKgScheme *)h_Scheme)->h_FmPcd);
++ if (p_FmPcd->h_Hc)
++ return FmHcPcdKgGetSchemeCounter(p_FmPcd->h_Hc, h_Scheme);
++
++ physicalSchemeId = ((t_FmPcdKgScheme *)h_Scheme)->schemeId;
++
++ if (FmPcdKgGetRelativeSchemeId(p_FmPcd, physicalSchemeId) == FM_PCD_KG_NUM_OF_SCHEMES)
++ REPORT_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
++
++ tmpKgarReg = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);
++ intFlags = KgHwLock(p_FmPcd->p_FmPcdKg);
++ WriteKgarWait(p_FmPcd, tmpKgarReg);
++ if (!(GET_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_mode) & KG_SCH_MODE_EN))
++ REPORT_ERROR(MAJOR, E_ALREADY_EXISTS, ("Scheme is Invalid"));
++ spc = GET_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_spc);
++ KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
++
++ return spc;
++}
++
++t_Error FM_PCD_KgSchemeSetCounter(t_Handle h_Scheme, uint32_t value)
++{
++ t_FmPcd *p_FmPcd;
++ uint32_t tmpKgarReg, intFlags;
++ uint8_t physicalSchemeId;
++
++ SANITY_CHECK_RETURN_VALUE(h_Scheme, E_INVALID_HANDLE, 0);
++
++ p_FmPcd = (t_FmPcd*)(((t_FmPcdKgScheme *)h_Scheme)->h_FmPcd);
++
++ if (!FmPcdKgIsSchemeValidSw(h_Scheme))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Requested scheme is invalid."));
++
++ if (p_FmPcd->h_Hc)
++ return FmHcPcdKgSetSchemeCounter(p_FmPcd->h_Hc, h_Scheme, value);
++
++ physicalSchemeId = ((t_FmPcdKgScheme *)h_Scheme)->schemeId;
++ /* check that schemeId is in range */
++ if (FmPcdKgGetRelativeSchemeId(p_FmPcd, physicalSchemeId) == FM_PCD_KG_NUM_OF_SCHEMES)
++ REPORT_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
++
++ /* read specified scheme into scheme registers */
++ tmpKgarReg = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);
++ intFlags = KgHwLock(p_FmPcd->p_FmPcdKg);
++ WriteKgarWait(p_FmPcd, tmpKgarReg);
++ if (!(GET_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_mode) & KG_SCH_MODE_EN))
++ {
++ KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
++ RETURN_ERROR(MAJOR, E_ALREADY_EXISTS, ("Scheme is Invalid"));
++ }
++
++ /* change counter value */
++ WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_spc, value);
++
++ /* call indirect command for scheme write */
++ tmpKgarReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, TRUE);
++
++ WriteKgarWait(p_FmPcd, tmpKgarReg);
++ KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
++
++ return E_OK;
++}
++
++t_Error FM_PCD_KgSetAdditionalDataAfterParsing(t_Handle h_FmPcd, uint8_t payloadOffset)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ struct fman_kg_regs *p_Regs;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdKg, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs, E_NULL_POINTER);
++
++ p_Regs = p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs;
++ if (!FmIsMaster(p_FmPcd->h_Fm))
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_KgSetAdditionalDataAfterParsing - guest mode!"));
++
++ WRITE_UINT32(p_Regs->fmkg_fdor,payloadOffset);
++
++ return E_OK;
++}
++
++t_Error FM_PCD_KgSetDfltValue(t_Handle h_FmPcd, uint8_t valueId, uint32_t value)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ struct fman_kg_regs *p_Regs;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(((valueId == 0) || (valueId == 1)), E_INVALID_VALUE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdKg, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs, E_NULL_POINTER);
++
++ p_Regs = p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs;
++
++ if (!FmIsMaster(p_FmPcd->h_Fm))
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_KgSetDfltValue - guest mode!"));
++
++ if (valueId == 0)
++ WRITE_UINT32(p_Regs->fmkg_gdv0r,value);
++ else
++ WRITE_UINT32(p_Regs->fmkg_gdv1r,value);
++ return E_OK;
++}
++
++#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
++t_Error FM_PCD_KgDumpRegs(t_Handle h_FmPcd)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ int i = 0, j = 0;
++ uint8_t hardwarePortId = 0;
++ uint32_t tmpKgarReg, intFlags;
++ t_Error err = E_OK;
++
++ DECLARE_DUMP;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdKg, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(((p_FmPcd->guestId == NCSW_MASTER_ID) ||
++ p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs), E_INVALID_OPERATION);
++
++ DUMP_SUBTITLE(("\n"));
++ DUMP_TITLE(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs, ("FmPcdKgRegs Regs"));
++
++ DUMP_VAR(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs,fmkg_gcr);
++ DUMP_VAR(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs,fmkg_eer);
++ DUMP_VAR(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs,fmkg_eeer);
++ DUMP_VAR(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs,fmkg_seer);
++ DUMP_VAR(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs,fmkg_seeer);
++ DUMP_VAR(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs,fmkg_gsr);
++ DUMP_VAR(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs,fmkg_tpc);
++ DUMP_VAR(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs,fmkg_serc);
++ DUMP_VAR(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs,fmkg_fdor);
++ DUMP_VAR(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs,fmkg_gdv0r);
++ DUMP_VAR(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs,fmkg_gdv1r);
++ DUMP_VAR(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs,fmkg_feer);
++ DUMP_VAR(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs,fmkg_ar);
++
++ DUMP_SUBTITLE(("\n"));
++ intFlags = KgHwLock(p_FmPcd->p_FmPcdKg);
++ for (j = 0;jp_FmPcdKg->p_IndirectAccessRegs->schemeRegs, ("FmPcdKgIndirectAccessSchemeRegs Scheme %d Regs", j));
++
++ DUMP_VAR(&p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs,kgse_mode);
++ DUMP_VAR(&p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs,kgse_ekfc);
++ DUMP_VAR(&p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs,kgse_ekdv);
++ DUMP_VAR(&p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs,kgse_bmch);
++ DUMP_VAR(&p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs,kgse_bmcl);
++ DUMP_VAR(&p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs,kgse_fqb);
++ DUMP_VAR(&p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs,kgse_hc);
++ DUMP_VAR(&p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs,kgse_ppc);
++
++ DUMP_TITLE(&p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_gec, ("kgse_gec"));
++ DUMP_SUBSTRUCT_ARRAY(i, FM_KG_NUM_OF_GENERIC_REGS)
++ {
++ DUMP_MEMORY(&p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_gec[i], sizeof(uint32_t));
++ }
++
++ DUMP_VAR(&p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs,kgse_spc);
++ DUMP_VAR(&p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs,kgse_dv0);
++ DUMP_VAR(&p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs,kgse_dv1);
++ DUMP_VAR(&p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs,kgse_ccbs);
++ DUMP_VAR(&p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs,kgse_mv);
++ }
++ DUMP_SUBTITLE(("\n"));
++
++ for (i=0;ip_FmPcdKg->p_IndirectAccessRegs->portRegs, ("FmPcdKgIndirectAccessPortRegs PCD Port %d regs", hardwarePortId));
++
++ DUMP_VAR(&p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->portRegs, fmkg_pe_sp);
++ DUMP_VAR(&p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->portRegs, fmkg_pe_cpp);
++ }
++
++ DUMP_SUBTITLE(("\n"));
++ for (j=0;jp_FmPcdKg->p_IndirectAccessRegs->clsPlanRegs, ("FmPcdKgIndirectAccessClsPlanRegs Regs group %d", j));
++ DUMP_TITLE(&p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->clsPlanRegs.kgcpe, ("kgcpe"));
++
++ tmpKgarReg = ReadClsPlanBlockActionReg((uint8_t)j);
++ err = WriteKgarWait(p_FmPcd, tmpKgarReg);
++ if (err)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++ DUMP_SUBSTRUCT_ARRAY(i, 8)
++ DUMP_MEMORY(&p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->clsPlanRegs.kgcpe[i], sizeof(uint32_t));
++ }
++ KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
++
++ return E_OK;
++}
++#endif /* (defined(DEBUG_ERRORS) && ... */
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_kg.h b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_kg.h
+new file mode 100644
+index 0000000..cb7521a
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_kg.h
+@@ -0,0 +1,206 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File fm_kg.h
++
++ @Description FM KG private header
++*//***************************************************************************/
++#ifndef __FM_KG_H
++#define __FM_KG_H
++
++#include "std_ext.h"
++
++/***********************************************************************/
++/* Keygen defines */
++/***********************************************************************/
++/* maskes */
++#if (DPAA_VERSION >= 11)
++#define KG_SCH_VSP_SHIFT_MASK 0x0003f000
++#define KG_SCH_OM_VSPE 0x00000001
++#define KG_SCH_VSP_NO_KSP_EN 0x80000000
++
++#define MAX_SP_SHIFT 23
++#define KG_SCH_VSP_MASK_SHIFT 12
++#define KG_SCH_VSP_SHIFT 24
++#endif /* (DPAA_VERSION >= 11) */
++
++typedef uint32_t t_KnownFieldsMasks;
++#define KG_SCH_KN_PORT_ID 0x80000000
++#define KG_SCH_KN_MACDST 0x40000000
++#define KG_SCH_KN_MACSRC 0x20000000
++#define KG_SCH_KN_TCI1 0x10000000
++#define KG_SCH_KN_TCI2 0x08000000
++#define KG_SCH_KN_ETYPE 0x04000000
++#define KG_SCH_KN_PPPSID 0x02000000
++#define KG_SCH_KN_PPPID 0x01000000
++#define KG_SCH_KN_MPLS1 0x00800000
++#define KG_SCH_KN_MPLS2 0x00400000
++#define KG_SCH_KN_MPLS_LAST 0x00200000
++#define KG_SCH_KN_IPSRC1 0x00100000
++#define KG_SCH_KN_IPDST1 0x00080000
++#define KG_SCH_KN_PTYPE1 0x00040000
++#define KG_SCH_KN_IPTOS_TC1 0x00020000
++#define KG_SCH_KN_IPV6FL1 0x00010000
++#define KG_SCH_KN_IPSRC2 0x00008000
++#define KG_SCH_KN_IPDST2 0x00004000
++#define KG_SCH_KN_PTYPE2 0x00002000
++#define KG_SCH_KN_IPTOS_TC2 0x00001000
++#define KG_SCH_KN_IPV6FL2 0x00000800
++#define KG_SCH_KN_GREPTYPE 0x00000400
++#define KG_SCH_KN_IPSEC_SPI 0x00000200
++#define KG_SCH_KN_IPSEC_NH 0x00000100
++#define KG_SCH_KN_IPPID 0x00000080
++#define KG_SCH_KN_L4PSRC 0x00000004
++#define KG_SCH_KN_L4PDST 0x00000002
++#define KG_SCH_KN_TFLG 0x00000001
++
++typedef uint8_t t_GenericCodes;
++#define KG_SCH_GEN_SHIM1 0x70
++#define KG_SCH_GEN_DEFAULT 0x10
++#define KG_SCH_GEN_PARSE_RESULT_N_FQID 0x20
++#define KG_SCH_GEN_START_OF_FRM 0x40
++#define KG_SCH_GEN_SHIM2 0x71
++#define KG_SCH_GEN_IP_PID_NO_V 0x72
++#define KG_SCH_GEN_ETH 0x03
++#define KG_SCH_GEN_ETH_NO_V 0x73
++#define KG_SCH_GEN_SNAP 0x04
++#define KG_SCH_GEN_SNAP_NO_V 0x74
++#define KG_SCH_GEN_VLAN1 0x05
++#define KG_SCH_GEN_VLAN1_NO_V 0x75
++#define KG_SCH_GEN_VLAN2 0x06
++#define KG_SCH_GEN_VLAN2_NO_V 0x76
++#define KG_SCH_GEN_ETH_TYPE 0x07
++#define KG_SCH_GEN_ETH_TYPE_NO_V 0x77
++#define KG_SCH_GEN_PPP 0x08
++#define KG_SCH_GEN_PPP_NO_V 0x78
++#define KG_SCH_GEN_MPLS1 0x09
++#define KG_SCH_GEN_MPLS2 0x19
++#define KG_SCH_GEN_MPLS3 0x29
++#define KG_SCH_GEN_MPLS1_NO_V 0x79
++#define KG_SCH_GEN_MPLS_LAST 0x0a
++#define KG_SCH_GEN_MPLS_LAST_NO_V 0x7a
++#define KG_SCH_GEN_IPV4 0x0b
++#define KG_SCH_GEN_IPV6 0x1b
++#define KG_SCH_GEN_L3_NO_V 0x7b
++#define KG_SCH_GEN_IPV4_TUNNELED 0x0c
++#define KG_SCH_GEN_IPV6_TUNNELED 0x1c
++#define KG_SCH_GEN_MIN_ENCAP 0x2c
++#define KG_SCH_GEN_IP2_NO_V 0x7c
++#define KG_SCH_GEN_GRE 0x0d
++#define KG_SCH_GEN_GRE_NO_V 0x7d
++#define KG_SCH_GEN_TCP 0x0e
++#define KG_SCH_GEN_UDP 0x1e
++#define KG_SCH_GEN_IPSEC_AH 0x2e
++#define KG_SCH_GEN_SCTP 0x3e
++#define KG_SCH_GEN_DCCP 0x4e
++#define KG_SCH_GEN_IPSEC_ESP 0x6e
++#define KG_SCH_GEN_L4_NO_V 0x7e
++#define KG_SCH_GEN_NEXTHDR 0x7f
++/* shifts */
++#define KG_SCH_PP_SHIFT_HIGH_SHIFT 27
++#define KG_SCH_PP_SHIFT_LOW_SHIFT 12
++#define KG_SCH_PP_MASK_SHIFT 16
++#define KG_SCH_MODE_CCOBASE_SHIFT 24
++#define KG_SCH_DEF_MAC_ADDR_SHIFT 30
++#define KG_SCH_DEF_TCI_SHIFT 28
++#define KG_SCH_DEF_ENET_TYPE_SHIFT 26
++#define KG_SCH_DEF_PPP_SESSION_ID_SHIFT 24
++#define KG_SCH_DEF_PPP_PROTOCOL_ID_SHIFT 22
++#define KG_SCH_DEF_MPLS_LABEL_SHIFT 20
++#define KG_SCH_DEF_IP_ADDR_SHIFT 18
++#define KG_SCH_DEF_PROTOCOL_TYPE_SHIFT 16
++#define KG_SCH_DEF_IP_TOS_TC_SHIFT 14
++#define KG_SCH_DEF_IPV6_FLOW_LABEL_SHIFT 12
++#define KG_SCH_DEF_IPSEC_SPI_SHIFT 10
++#define KG_SCH_DEF_L4_PORT_SHIFT 8
++#define KG_SCH_DEF_TCP_FLAG_SHIFT 6
++#define KG_SCH_HASH_CONFIG_SHIFT_SHIFT 24
++#define KG_SCH_GEN_MASK_SHIFT 16
++#define KG_SCH_GEN_HT_SHIFT 8
++#define KG_SCH_GEN_SIZE_SHIFT 24
++#define KG_SCH_GEN_DEF_SHIFT 29
++#define FM_PCD_KG_KGAR_NUM_SHIFT 16
++
++/* others */
++#define NUM_OF_SW_DEFAULTS 3
++#define MAX_PP_SHIFT 23
++#define MAX_KG_SCH_SIZE 16
++#define MASK_FOR_GENERIC_BASE_ID 0x20
++#define MAX_HASH_SHIFT 40
++#define MAX_KG_SCH_FQID_BIT_OFFSET 31
++#define MAX_KG_SCH_PP_BIT_OFFSET 15
++#define MAX_DIST_FQID_SHIFT 23
++
++#define GET_MASK_SEL_SHIFT(shift,i) \
++switch (i) { \
++ case (0):shift = 26;break; \
++ case (1):shift = 20;break; \
++ case (2):shift = 10;break; \
++ case (3):shift = 4;break; \
++ default: \
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, NO_MSG); \
++}
++
++#define GET_MASK_OFFSET_SHIFT(shift,i) \
++switch (i) { \
++ case (0):shift = 16;break; \
++ case (1):shift = 0;break; \
++ case (2):shift = 28;break; \
++ case (3):shift = 24;break; \
++ default: \
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, NO_MSG); \
++}
++
++#define GET_MASK_SHIFT(shift,i) \
++switch (i) { \
++ case (0):shift = 24;break; \
++ case (1):shift = 16;break; \
++ case (2):shift = 8;break; \
++ case (3):shift = 0;break; \
++ default: \
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, NO_MSG); \
++}
++
++/***********************************************************************/
++/* Keygen defines */
++/***********************************************************************/
++
++#define KG_DOUBLE_MEANING_REGS_OFFSET 0x100
++#define NO_VALIDATION 0x70
++#define KG_ACTION_REG_TO 1024
++#define KG_MAX_PROFILE 255
++#define SCHEME_ALWAYS_DIRECT 0xFFFFFFFF
++
++
++#endif /* __FM_KG_H */
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_manip.c b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_manip.c
+new file mode 100644
+index 0000000..e6c8d2d
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_manip.c
+@@ -0,0 +1,4193 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File fm_manip.c
++
++ @Description FM PCD manip ...
++*//***************************************************************************/
++#include "std_ext.h"
++#include "error_ext.h"
++#include "string_ext.h"
++#include "debug_ext.h"
++#include "fm_pcd_ext.h"
++#include "fm_port_ext.h"
++#include "fm_muram_ext.h"
++#include "memcpy_ext.h"
++
++#include "fm_common.h"
++#include "fm_hc.h"
++#include "fm_manip.h"
++
++
++/****************************************/
++/* static functions */
++/****************************************/
++static t_Handle GetManipInfo(t_FmPcdManip *p_Manip, e_ManipInfo manipInfo)
++{
++ t_FmPcdManip *p_CurManip = p_Manip;
++
++ if (!MANIP_IS_UNIFIED(p_Manip))
++ p_CurManip = p_Manip;
++ else
++ {
++ /* go to first unified */
++ while (MANIP_IS_UNIFIED_NON_FIRST(p_CurManip))
++ p_CurManip = p_CurManip->h_PrevManip;
++ }
++
++ switch (manipInfo)
++ {
++ case (e_MANIP_HMCT):
++ return p_CurManip->p_Hmct;
++ case (e_MANIP_HMTD):
++ return p_CurManip->h_Ad;
++ case (e_MANIP_HANDLER_TABLE_OWNER):
++ return (t_Handle)p_CurManip;
++ default:
++ return NULL;
++ }
++}
++static uint16_t GetHmctSize(t_FmPcdManip *p_Manip)
++{
++ uint16_t size = 0;
++ t_FmPcdManip *p_CurManip = p_Manip;
++
++ if (!MANIP_IS_UNIFIED(p_Manip))
++ return p_Manip->tableSize;
++
++ /* accumulate sizes, starting with the first node */
++ while (MANIP_IS_UNIFIED_NON_FIRST(p_CurManip))
++ p_CurManip = p_CurManip->h_PrevManip;
++
++ while (MANIP_IS_UNIFIED_NON_LAST(p_CurManip))
++ {
++ size += p_CurManip->tableSize;
++ p_CurManip = (t_FmPcdManip *)p_CurManip->h_NextManip;
++ }
++ size += p_CurManip->tableSize; /* add last size */
++
++ return(size);
++}
++static uint16_t GetDataSize(t_FmPcdManip *p_Manip)
++{
++ uint16_t size = 0;
++ t_FmPcdManip *p_CurManip = p_Manip;
++
++ if (!MANIP_IS_UNIFIED(p_Manip))
++ return p_Manip->dataSize;
++
++ /* accumulate sizes, starting with the first node */
++ while (MANIP_IS_UNIFIED_NON_FIRST(p_CurManip))
++ p_CurManip = p_CurManip->h_PrevManip;
++
++ while (MANIP_IS_UNIFIED_NON_LAST(p_CurManip))
++ {
++ size += p_CurManip->dataSize;
++ p_CurManip = (t_FmPcdManip *)p_CurManip->h_NextManip;
++ }
++ size += p_CurManip->dataSize; /* add last size */
++
++ return(size);
++}
++static t_Error CalculateTableSize(t_FmPcdManipParams *p_FmPcdManipParams, uint16_t *p_TableSize, uint8_t *p_DataSize)
++{
++ uint8_t localDataSize, remain, tableSize = 0, dataSize = 0;
++
++ if (p_FmPcdManipParams->u.hdr.rmv)
++ {
++ switch (p_FmPcdManipParams->u.hdr.rmvParams.type){
++ case (e_FM_PCD_MANIP_RMV_GENERIC):
++ case (e_FM_PCD_MANIP_RMV_BY_HDR):
++ /* As long as the only rmv command is the L2, no check on type is required */
++ tableSize += HMCD_BASIC_SIZE;
++ break;
++ default:
++ RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("Unknown rmvParams.type"));
++ }
++ }
++
++ if (p_FmPcdManipParams->u.hdr.insrt)
++ {
++ switch (p_FmPcdManipParams->u.hdr.insrtParams.type){
++ case (e_FM_PCD_MANIP_INSRT_GENERIC):
++ remain = (uint8_t)(p_FmPcdManipParams->u.hdr.insrtParams.u.generic.size % 4);
++ if (remain)
++ localDataSize = (uint8_t)(p_FmPcdManipParams->u.hdr.insrtParams.u.generic.size + 4 - remain);
++ else
++ localDataSize = p_FmPcdManipParams->u.hdr.insrtParams.u.generic.size;
++ tableSize += (uint8_t)(HMCD_BASIC_SIZE + localDataSize);
++ break;
++ case (e_FM_PCD_MANIP_INSRT_BY_HDR):
++ /* As long as the only insert command is the internal L2, no check on type is required */
++ tableSize += HMCD_BASIC_SIZE+HMCD_PTR_SIZE;
++ if (p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.type == e_FM_PCD_MANIP_INSRT_BY_HDR_SPECIFIC_L2)
++ switch (p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.specificL2Params.specificL2)
++ {
++ case (e_FM_PCD_MANIP_HDR_INSRT_MPLS):
++ dataSize += p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.specificL2Params.size;
++ break;
++ default:
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++ }
++ break;
++ default:
++ RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("Unknown insrtParams.type"));
++ }
++ }
++ if (p_FmPcdManipParams->u.hdr.fieldUpdate)
++ {
++ switch (p_FmPcdManipParams->u.hdr.fieldUpdateParams.type){
++ case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_VLAN):
++ tableSize += HMCD_BASIC_SIZE;
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.vlan.updateType ==
++ e_FM_PCD_MANIP_HDR_FIELD_UPDATE_DSCP_TO_VLAN)
++ {
++ tableSize += HMCD_PTR_SIZE;
++ dataSize += DSCP_TO_VLAN_TABLE_SIZE;
++ }
++ break;
++ case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_IPV4):
++ tableSize += HMCD_BASIC_SIZE;
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates & HDR_MANIP_IPV4_ID)
++ {
++ tableSize += HMCD_PARAM_SIZE;
++ dataSize += 2;
++ }
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates & HDR_MANIP_IPV4_SRC)
++ tableSize += HMCD_IPV4_ADDR_SIZE;
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates & HDR_MANIP_IPV4_DST)
++ tableSize += HMCD_IPV4_ADDR_SIZE;
++ break;
++ case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_IPV6):
++ tableSize += HMCD_BASIC_SIZE;
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates & HDR_MANIP_IPV6_SRC)
++ tableSize += HMCD_IPV6_ADDR_SIZE;
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates & HDR_MANIP_IPV6_DST)
++ tableSize += HMCD_IPV6_ADDR_SIZE;
++ break;
++ case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_TCP_UDP):
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.validUpdates == HDR_MANIP_TCP_UDP_CHECKSUM)
++ /* we implement this case with the update-checksum descriptor */
++ tableSize += HMCD_BASIC_SIZE;
++ else
++ /* we implement this case with the TCP/UDP-update descriptor */
++ tableSize += HMCD_BASIC_SIZE + HMCD_PARAM_SIZE;
++ break;
++ default:
++ RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("Unknown fieldUpdateParams.type"));
++ }
++ }
++
++ if (p_FmPcdManipParams->u.hdr.custom)
++ {
++ switch (p_FmPcdManipParams->u.hdr.customParams.type){
++ case (e_FM_PCD_MANIP_HDR_CUSTOM_IP_REPLACE):
++ {
++ tableSize += HMCD_BASIC_SIZE + HMCD_PARAM_SIZE + HMCD_PARAM_SIZE;
++ dataSize += p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.hdrSize;
++ if ((p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.replaceType == e_FM_PCD_MANIP_HDR_CUSTOM_REPLACE_IPV6_BY_IPV4) &&
++ (p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.updateIpv4Id))
++ dataSize += 2;
++ }
++ break;
++ default:
++ RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("Unknown customParams.type"));
++ }
++ }
++
++ *p_TableSize = tableSize;
++ *p_DataSize = dataSize;
++
++ return E_OK;
++}
++
++static t_Error BuildHmct(t_FmPcdManip *p_Manip, t_FmPcdManipParams *p_FmPcdManipParams, uint8_t *p_DestHmct, uint8_t *p_DestData, bool new)
++{
++ uint32_t *p_TmpHmct = (uint32_t*)p_DestHmct, *p_LocalData;
++ uint32_t tmpReg=0, *p_Last = NULL;
++ uint8_t remain, i, size=0, origSize, *p_UsrData = NULL, *p_TmpData = p_DestData;
++ t_Handle h_FmPcd = p_Manip->h_FmPcd;
++ uint8_t j=0;
++
++ if (p_FmPcdManipParams->u.hdr.rmv)
++ {
++ if (p_FmPcdManipParams->u.hdr.rmvParams.type == e_FM_PCD_MANIP_RMV_GENERIC)
++ {
++ /* initialize HMCD */
++ tmpReg = (uint32_t)(HMCD_OPCODE_GENERIC_RMV) << HMCD_OC_SHIFT;
++ /* tmp, should be conditional */
++ tmpReg |= p_FmPcdManipParams->u.hdr.rmvParams.u.generic.offset << HMCD_RMV_OFFSET_SHIFT;
++ tmpReg |= p_FmPcdManipParams->u.hdr.rmvParams.u.generic.size << HMCD_RMV_SIZE_SHIFT;
++ }
++ else if (p_FmPcdManipParams->u.hdr.rmvParams.type == e_FM_PCD_MANIP_RMV_BY_HDR)
++ {
++ uint8_t hmcdOpt;
++ if (!p_FmPcdManipParams->u.hdr.rmvParams.u.byHdr.type == e_FM_PCD_MANIP_RMV_BY_HDR_SPECIFIC_L2)
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++
++ /* initialize HMCD */
++ tmpReg = (uint32_t)(HMCD_OPCODE_L2_RMV) << HMCD_OC_SHIFT;
++
++ switch (p_FmPcdManipParams->u.hdr.rmvParams.u.byHdr.u.specificL2)
++ {
++ case (e_FM_PCD_MANIP_HDR_RMV_ETHERNET):
++ hmcdOpt = HMCD_RMV_L2_ETHERNET;
++ break;
++ case (e_FM_PCD_MANIP_HDR_RMV_STACKED_QTAGS):
++ hmcdOpt = HMCD_RMV_L2_STACKED_QTAGS;
++ break;
++ case (e_FM_PCD_MANIP_HDR_RMV_ETHERNET_AND_MPLS):
++ hmcdOpt = HMCD_RMV_L2_ETHERNET_AND_MPLS;
++ break;
++ case (e_FM_PCD_MANIP_HDR_RMV_MPLS):
++ hmcdOpt = HMCD_RMV_L2_MPLS;
++ break;
++ default:
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++ }
++ tmpReg |= hmcdOpt << HMCD_L2_MODE_SHIFT;
++ }
++ else
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("manip header remove type!"));
++
++ WRITE_UINT32(*p_TmpHmct, tmpReg);
++ /* save a pointer to the "last" indication word */
++ p_Last = p_TmpHmct;
++ /* advance to next command */
++ p_TmpHmct += HMCD_BASIC_SIZE/4;
++ }
++
++ if (p_FmPcdManipParams->u.hdr.insrt)
++ {
++ if (p_FmPcdManipParams->u.hdr.insrtParams.type == e_FM_PCD_MANIP_INSRT_GENERIC)
++ {
++ /* initialize HMCD */
++ if (p_FmPcdManipParams->u.hdr.insrtParams.u.generic.replace)
++ tmpReg = (uint32_t)(HMCD_OPCODE_GENERIC_REPLACE) << HMCD_OC_SHIFT;
++ else
++ tmpReg = (uint32_t)(HMCD_OPCODE_GENERIC_INSRT) << HMCD_OC_SHIFT;
++
++ tmpReg |= p_FmPcdManipParams->u.hdr.insrtParams.u.generic.offset << HMCD_INSRT_OFFSET_SHIFT;
++ tmpReg |= p_FmPcdManipParams->u.hdr.insrtParams.u.generic.size << HMCD_INSRT_SIZE_SHIFT;
++
++ size = p_FmPcdManipParams->u.hdr.insrtParams.u.generic.size;
++ p_UsrData = p_FmPcdManipParams->u.hdr.insrtParams.u.generic.p_Data;
++
++ WRITE_UINT32(*p_TmpHmct, tmpReg);
++ /* save a pointer to the "last" indication word */
++ p_Last = p_TmpHmct;
++
++ p_TmpHmct += HMCD_BASIC_SIZE/4;
++
++ /* initialize data to be inserted */
++ /* if size is not a multiple of 4, padd with 0's */
++ origSize = size;
++ remain = (uint8_t)(size % 4);
++ if (remain)
++ {
++ size += (uint8_t)(4 - remain);
++ p_LocalData = (uint32_t *)XX_Malloc(size);
++ memset((uint8_t *)p_LocalData, 0, size);
++ memcpy((uint8_t *)p_LocalData, p_UsrData, origSize);
++ }
++ else
++ p_LocalData = (uint32_t*)p_UsrData;
++
++ /* initialize data and advance pointer to next command */
++ for (i = 0; iu.hdr.insrtParams.type == e_FM_PCD_MANIP_INSRT_BY_HDR)
++ {
++ uint8_t hmcdOpt;
++ if (!p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.type == e_FM_PCD_MANIP_INSRT_BY_HDR_SPECIFIC_L2)
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++
++ /* initialize HMCD */
++ tmpReg = (uint32_t)(HMCD_OPCODE_L2_INSRT) << HMCD_OC_SHIFT;
++
++ switch (p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.specificL2Params.specificL2)
++ {
++ case (e_FM_PCD_MANIP_HDR_INSRT_MPLS):
++ if (p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.specificL2Params.update)
++ hmcdOpt = HMCD_INSRT_N_UPDATE_L2_MPLS;
++ else
++ hmcdOpt = HMCD_INSRT_L2_MPLS;
++ break;
++ default:
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
++ }
++ tmpReg |= hmcdOpt << HMCD_L2_MODE_SHIFT;
++
++ WRITE_UINT32(*p_TmpHmct, tmpReg);
++ /* save a pointer to the "last" indication word */
++ p_Last = p_TmpHmct;
++
++ p_TmpHmct += HMCD_BASIC_SIZE/4;
++
++ /* set size and pointer of user's data */
++ size = (uint8_t)p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.specificL2Params.size;
++
++ ASSERT_COND(p_TmpData);
++ Mem2IOCpy32(p_TmpData, p_FmPcdManipParams->u.hdr.insrtParams.u.byHdr.u.specificL2Params.p_Data, size);
++ tmpReg = (size << HMCD_INSRT_L2_SIZE_SHIFT) | (uint32_t)(XX_VirtToPhys(p_TmpData) - (((t_FmPcd*)h_FmPcd)->physicalMuramBase));
++ WRITE_UINT32(*p_TmpHmct, tmpReg);
++ p_TmpHmct += HMCD_PTR_SIZE/4;
++ p_TmpData += size;
++ }
++ else
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("manip header insert type!"));
++ }
++
++ if (p_FmPcdManipParams->u.hdr.fieldUpdate)
++ {
++ switch (p_FmPcdManipParams->u.hdr.fieldUpdateParams.type){
++ case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_VLAN):
++ /* set opcode */
++ tmpReg = (uint32_t)(HMCD_OPCODE_VLAN_PRI_UPDATE) << HMCD_OC_SHIFT;
++
++ /* set mode & table pointer */
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.vlan.updateType ==
++ e_FM_PCD_MANIP_HDR_FIELD_UPDATE_DSCP_TO_VLAN)
++ {
++ /* set Mode */
++ tmpReg |= (uint32_t)(HMCD_VLAN_PRI_UPDATE_DSCP_TO_VPRI) << HMCD_VLAN_PRI_REP_MODE_SHIFT;
++ /* set VPRI default */
++ tmpReg |= p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.vlan.u.dscpToVpri.vpriDefVal;
++ WRITE_UINT32(*p_TmpHmct, tmpReg);
++ /* save a pointer to the "last" indication word */
++ p_Last = p_TmpHmct;
++ /* write the table pointer into the Manip descriptor */
++ p_TmpHmct += HMCD_BASIC_SIZE/4;
++
++ tmpReg = 0;
++ ASSERT_COND(p_TmpData);
++ for (i=0; iu.hdr.fieldUpdateParams.u.vlan.u.dscpToVpri.dscpToVpriTable[i]) << (32-4*(j+1));
++ j++;
++ /* Than we write this register to the next table word
++ * (i=7-->word 0, i=15-->word 1,... i=63-->word 7) */
++ if ((i%8) == 7)
++ {
++ WRITE_UINT32(*((uint32_t*)p_TmpData + (i+1)/8-1), tmpReg);
++ tmpReg = 0;
++ j = 0;
++ }
++ }
++ WRITE_UINT32(*p_TmpHmct, (uint32_t)(XX_VirtToPhys(p_TmpData) - (((t_FmPcd*)h_FmPcd)->physicalMuramBase)));
++ p_TmpHmct += HMCD_PTR_SIZE/4;
++
++ p_TmpData += DSCP_TO_VLAN_TABLE_SIZE;
++ }
++ else if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.vlan.updateType ==
++ e_FM_PCD_MANIP_HDR_FIELD_UPDATE_VLAN_VPRI)
++ {
++ /* set Mode */
++ /* line commented out as it has no-side-effect ('0' value). */
++ /*tmpReg |= HMCD_VLAN_PRI_UPDATE << HMCD_VLAN_PRI_REP_MODE_SHIFT*/;
++ /* set VPRI parameter */
++ tmpReg |= p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.vlan.u.vpri;
++ WRITE_UINT32(*p_TmpHmct, tmpReg);
++ /* save a pointer to the "last" indication word */
++ p_Last = p_TmpHmct;
++ p_TmpHmct += HMCD_BASIC_SIZE/4;
++ }
++ break;
++
++ case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_IPV4):
++ /* set opcode */
++ tmpReg = (uint32_t)(HMCD_OPCODE_IPV4_UPDATE) << HMCD_OC_SHIFT;
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates & HDR_MANIP_IPV4_TTL)
++ tmpReg |= HMCD_IPV4_UPDATE_TTL;
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates & HDR_MANIP_IPV4_TOS)
++ {
++ tmpReg |= HMCD_IPV4_UPDATE_TOS;
++ tmpReg |= p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.tos << HMCD_IPV4_UPDATE_TOS_SHIFT;
++ }
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates & HDR_MANIP_IPV4_ID)
++ tmpReg |= HMCD_IPV4_UPDATE_ID;
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates & HDR_MANIP_IPV4_SRC)
++ tmpReg |= HMCD_IPV4_UPDATE_SRC;
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates & HDR_MANIP_IPV4_DST)
++ tmpReg |= HMCD_IPV4_UPDATE_DST;
++ /* write the first 4 bytes of the descriptor */
++ WRITE_UINT32(*p_TmpHmct, tmpReg);
++ /* save a pointer to the "last" indication word */
++ p_Last = p_TmpHmct;
++
++ p_TmpHmct += HMCD_BASIC_SIZE/4;
++
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates & HDR_MANIP_IPV4_ID)
++ {
++ ASSERT_COND(p_TmpData);
++ WRITE_UINT16(*(uint16_t*)p_TmpData, p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.id);
++ WRITE_UINT32(*p_TmpHmct, (uint32_t)(XX_VirtToPhys(p_TmpData) - (((t_FmPcd*)p_Manip->h_FmPcd)->physicalMuramBase)));
++ p_TmpData += 2;
++ p_TmpHmct += HMCD_PTR_SIZE/4;
++ }
++
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates & HDR_MANIP_IPV4_SRC)
++ {
++ WRITE_UINT32(*p_TmpHmct, p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.src);
++ p_TmpHmct += HMCD_IPV4_ADDR_SIZE/4;
++ }
++
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.validUpdates & HDR_MANIP_IPV4_DST)
++ {
++ WRITE_UINT32(*p_TmpHmct, p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv4.dst);
++ p_TmpHmct += HMCD_IPV4_ADDR_SIZE/4;
++ }
++ break;
++
++ case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_IPV6):
++ /* set opcode */
++ tmpReg = (uint32_t)(HMCD_OPCODE_IPV6_UPDATE) << HMCD_OC_SHIFT;
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.validUpdates & HDR_MANIP_IPV6_HL)
++ tmpReg |= HMCD_IPV6_UPDATE_HL;
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.validUpdates & HDR_MANIP_IPV6_TC)
++ {
++ tmpReg |= HMCD_IPV6_UPDATE_TC;
++ tmpReg |= p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.trafficClass << HMCD_IPV6_UPDATE_TC_SHIFT;
++ }
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.validUpdates & HDR_MANIP_IPV6_SRC)
++ tmpReg |= HMCD_IPV6_UPDATE_SRC;
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.validUpdates & HDR_MANIP_IPV6_DST)
++ tmpReg |= HMCD_IPV6_UPDATE_DST;
++ /* write the first 4 bytes of the descriptor */
++ WRITE_UINT32(*p_TmpHmct, tmpReg);
++ /* save a pointer to the "last" indication word */
++ p_Last = p_TmpHmct;
++
++ p_TmpHmct += HMCD_BASIC_SIZE/4;
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.validUpdates & HDR_MANIP_IPV6_SRC)
++ for (i = 0 ; i < NET_HEADER_FIELD_IPv6_ADDR_SIZE ; i+=4)
++ {
++ WRITE_UINT32(*p_TmpHmct, *(uint32_t*)&p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.src[i]);
++ p_TmpHmct += HMCD_PTR_SIZE/4;
++ }
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.validUpdates & HDR_MANIP_IPV6_DST)
++ for (i = 0 ; i < NET_HEADER_FIELD_IPv6_ADDR_SIZE ; i+=4)
++ {
++ WRITE_UINT32(*p_TmpHmct, *(uint32_t*)&p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.ipv6.dst[i]);
++ p_TmpHmct += HMCD_PTR_SIZE/4;
++ }
++ break;
++
++ case (e_FM_PCD_MANIP_HDR_FIELD_UPDATE_TCP_UDP):
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.validUpdates == HDR_MANIP_TCP_UDP_CHECKSUM)
++ {
++ /* we implement this case with the update-checksum descriptor */
++ /* set opcode */
++ tmpReg = (uint32_t)(HMCD_OPCODE_TCP_UDP_CHECKSUM) << HMCD_OC_SHIFT;
++ /* write the first 4 bytes of the descriptor */
++ WRITE_UINT32(*p_TmpHmct, tmpReg);
++ /* save a pointer to the "last" indication word */
++ p_Last = p_TmpHmct;
++
++ p_TmpHmct += HMCD_BASIC_SIZE/4;
++ }
++ else
++ {
++ /* we implement this case with the TCP/UDP update descriptor */
++ /* set opcode */
++ tmpReg = (uint32_t)(HMCD_OPCODE_TCP_UDP_UPDATE) << HMCD_OC_SHIFT;
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.validUpdates & HDR_MANIP_TCP_UDP_DST)
++ tmpReg |= HMCD_TCP_UDP_UPDATE_DST;
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.validUpdates & HDR_MANIP_TCP_UDP_SRC)
++ tmpReg |= HMCD_TCP_UDP_UPDATE_SRC;
++ /* write the first 4 bytes of the descriptor */
++ WRITE_UINT32(*p_TmpHmct, tmpReg);
++ /* save a pointer to the "last" indication word */
++ p_Last = p_TmpHmct;
++
++ p_TmpHmct += HMCD_BASIC_SIZE/4;
++
++ tmpReg = 0;
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.validUpdates & HDR_MANIP_TCP_UDP_SRC)
++ tmpReg |= ((uint32_t)p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.src) << HMCD_TCP_UDP_UPDATE_SRC_SHIFT;
++ if (p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.validUpdates & HDR_MANIP_TCP_UDP_DST)
++ tmpReg |= ((uint32_t)p_FmPcdManipParams->u.hdr.fieldUpdateParams.u.tcpUdp.dst);
++ WRITE_UINT32(*p_TmpHmct, tmpReg);
++ p_TmpHmct += HMCD_PTR_SIZE/4;
++ }
++ break;
++
++ default:
++ RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("Unknown fieldUpdateParams.type"));
++ }
++ }
++
++ if (p_FmPcdManipParams->u.hdr.custom)
++ {
++ switch (p_FmPcdManipParams->u.hdr.customParams.type)
++ {
++ case (e_FM_PCD_MANIP_HDR_CUSTOM_IP_REPLACE):
++ /* set opcode */
++ tmpReg = (uint32_t)(HMCD_OPCODE_REPLACE_IP) << HMCD_OC_SHIFT;
++
++ if (p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.decTtlHl)
++ tmpReg |= HMCD_IP_REPLACE_TTL_HL;
++ if (p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.replaceType == e_FM_PCD_MANIP_HDR_CUSTOM_REPLACE_IPV4_BY_IPV6)
++ /* line commented out as it has no-side-effect ('0' value). */
++ /*tmpReg |= HMCD_IP_REPLACE_REPLACE_IPV4*/;
++ else if (p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.replaceType == e_FM_PCD_MANIP_HDR_CUSTOM_REPLACE_IPV6_BY_IPV4)
++ {
++ tmpReg |= HMCD_IP_REPLACE_REPLACE_IPV6;
++ if (p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.updateIpv4Id)
++ tmpReg |= HMCD_IP_REPLACE_ID;
++ }
++ else
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
++ ("One flag out of HDR_MANIP_IP_REPLACE_IPV4, HDR_MANIP_IP_REPLACE_IPV6 - must be set."));
++
++ /* write the first 4 bytes of the descriptor */
++ WRITE_UINT32(*p_TmpHmct, tmpReg);
++ /* save a pointer to the "last" indication word */
++ p_Last = p_TmpHmct;
++
++ p_TmpHmct += HMCD_BASIC_SIZE/4;
++
++ size = p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.hdrSize;
++ ASSERT_COND(p_TmpData);
++ Mem2IOCpy32(p_TmpData, p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.hdr, size);
++ tmpReg = (uint32_t)(size << HMCD_IP_REPLACE_L3HDRSIZE_SHIFT);
++ tmpReg |= (uint32_t)(XX_VirtToPhys(p_TmpData) - (((t_FmPcd*)h_FmPcd)->physicalMuramBase));
++ WRITE_UINT32(*p_TmpHmct, tmpReg);
++ p_TmpHmct += HMCD_PTR_SIZE/4;
++ p_TmpData += size;
++
++ if ((p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.replaceType == e_FM_PCD_MANIP_HDR_CUSTOM_REPLACE_IPV6_BY_IPV4) &&
++ (p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.updateIpv4Id))
++ {
++ WRITE_UINT16(*(uint16_t*)p_TmpData, p_FmPcdManipParams->u.hdr.customParams.u.ipHdrReplace.id);
++ WRITE_UINT32(*p_TmpHmct, (uint32_t)(XX_VirtToPhys(p_TmpData) - (((t_FmPcd*)h_FmPcd)->physicalMuramBase)));
++ p_TmpData += 2;
++ }
++ p_TmpHmct += HMCD_PTR_SIZE/4;
++ break;
++ default:
++ RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("Unknown customParams.type"));
++ }
++ }
++
++
++ /* If this node has a nextManip, and no parsing is required after it, the old table must be copied to the new table
++ the old table and should be freed */
++ if (p_FmPcdManipParams->h_NextManip &&
++ (MANIP_DONT_REPARSE(p_FmPcdManipParams->h_NextManip)))
++ {
++ if (new)
++ {
++ /* If this is the first time this manip is created we need to free unused memory. If it
++ * is a dynamic changes case, the memory used is either the CC shadow or the existing
++ * table - no allocation, no free */
++ MANIP_UPDATE_UNIFIED_POSITION(p_FmPcdManipParams->h_NextManip);
++
++ p_Manip->unifiedPosition = e_MANIP_UNIFIED_FIRST;
++
++ /* The HMTD of the next Manip is never going to be used */
++ if (((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->muramAllocate)
++ FM_MURAM_FreeMem(((t_FmPcd *)((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_FmPcd)->h_FmMuram, ((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad);
++ else
++ XX_Free(((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad);
++ ((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad = NULL;
++
++ /* advance pointer */
++ p_TmpHmct += MANIP_GET_HMCT_SIZE(p_FmPcdManipParams->h_NextManip)/4;
++ }
++ }
++ else
++ {
++ ASSERT_COND(p_Last);
++ /* set the "last" indication on the last command of the current table */
++ WRITE_UINT32(*p_Last, GET_UINT32(*p_Last) | HMCD_LAST);
++ }
++
++ return E_OK;
++}
++
++static t_Error CreateManipActionNew(t_FmPcdManip *p_Manip, t_FmPcdManipParams *p_FmPcdManipParams)
++{
++ t_FmPcdManip *p_CurManip;
++ t_Error err;
++ uint32_t nextSize = 0, totalSize;
++ uint16_t tmpReg;
++ uint8_t *p_OldHmct, *p_TmpHmctPtr, *p_TmpDataPtr;
++
++ /* set Manip structure */
++ if (p_FmPcdManipParams->h_NextManip)
++ {
++ if (MANIP_DONT_REPARSE(p_FmPcdManipParams->h_NextManip))
++ nextSize = (uint32_t)(GetHmctSize(p_FmPcdManipParams->h_NextManip) + GetDataSize(p_FmPcdManipParams->h_NextManip));
++ else
++ p_Manip->cascadedNext = TRUE;
++ }
++ p_Manip->dontParseAfterManip = p_FmPcdManipParams->u.hdr.dontParseAfterManip;
++
++ /* Allocate new table */
++ /* calculate table size according to manip parameters */
++ err = CalculateTableSize(p_FmPcdManipParams, &p_Manip->tableSize, &p_Manip->dataSize);
++ if (err)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++
++ totalSize =(uint16_t)(p_Manip->tableSize + p_Manip->dataSize + nextSize);
++
++ p_Manip->p_Hmct = (uint8_t*)FM_MURAM_AllocMem(((t_FmPcd *)p_Manip->h_FmPcd)->h_FmMuram, totalSize, 4);
++ if (!p_Manip->p_Hmct)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc failed"));
++
++ if (p_Manip->dataSize)
++ p_Manip->p_Data = (uint8_t*)PTR_MOVE(p_Manip->p_Hmct, (p_Manip->tableSize + nextSize));
++
++ /* update shadow size to allow runtime replacement of Header manipulation */
++ /* The allocated shadow is divided as follows:
++ 0 . . . 16 . . .
++ --------------------------------
++ | Shadow | Shadow HMTD |
++ | HMTD | Match Table |
++ | (16 bytes) | (maximal size) |
++ --------------------------------
++ */
++
++ err = FmPcdUpdateCcShadow (p_Manip->h_FmPcd, (uint32_t)(totalSize + 16), (uint16_t)FM_PCD_CC_AD_TABLE_ALIGN);
++ if (err != E_OK)
++ {
++ FM_MURAM_FreeMem(p_Manip->h_FmPcd, p_Manip->p_Hmct);
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for HdrManip node shadow"));
++ }
++
++
++ if (p_FmPcdManipParams->h_NextManip &&
++ (MANIP_DONT_REPARSE(p_FmPcdManipParams->h_NextManip)))
++ {
++ p_OldHmct = (uint8_t *)GetManipInfo(p_FmPcdManipParams->h_NextManip, e_MANIP_HMCT);
++ p_CurManip = p_FmPcdManipParams->h_NextManip;
++ /* Run till the last Manip (which is the first to configure) */
++ while (MANIP_IS_UNIFIED_NON_LAST(p_CurManip))
++ p_CurManip = p_CurManip->h_NextManip;
++
++ while (p_CurManip)
++ {
++ /* If this is a unified table, point to the part of the table
++ * which is the relative offset in HMCT.
++ */
++ p_TmpHmctPtr = (uint8_t*)PTR_MOVE(p_Manip->p_Hmct,
++ (p_Manip->tableSize +
++ (PTR_TO_UINT(p_CurManip->p_Hmct) -
++ PTR_TO_UINT(p_OldHmct))));
++ if (p_CurManip->p_Data)
++ p_TmpDataPtr = (uint8_t*)PTR_MOVE(p_Manip->p_Hmct,
++ (p_Manip->tableSize +
++ (PTR_TO_UINT(p_CurManip->p_Data) -
++ PTR_TO_UINT(p_OldHmct))));
++ else
++ p_TmpDataPtr = NULL;
++
++ BuildHmct(p_CurManip, &p_CurManip->manipParams, p_TmpHmctPtr, p_TmpDataPtr, FALSE);
++ /* update old manip table pointer */
++ MANIP_SET_HMCT_PTR(p_CurManip, p_TmpHmctPtr);
++ MANIP_SET_DATA_PTR(p_CurManip, p_TmpDataPtr);
++
++ p_CurManip = p_CurManip->h_PrevManip;
++ }
++ /* We copied the HMCT to create a new large HMCT so we can free the old one */
++ FM_MURAM_FreeMem(MANIP_GET_MURAM(p_FmPcdManipParams->h_NextManip), p_OldHmct);
++ }
++
++ /* Fill table */
++ err = BuildHmct(p_Manip, p_FmPcdManipParams, p_Manip->p_Hmct, p_Manip->p_Data, TRUE);
++ if (err)
++ {
++ FM_MURAM_FreeMem(p_Manip->h_FmPcd, p_Manip->p_Hmct);
++ RETURN_ERROR(MINOR, err, NO_MSG);
++ }
++
++ /* Build HMTD (table descriptor) */
++ tmpReg = HMTD_CFG_TYPE; /* NADEN = 0 */
++ /* add parseAfterManip */
++ if (!p_Manip->dontParseAfterManip)
++ tmpReg |= HMTD_CFG_PRS_AFTER_HM;
++ /* create cascade */
++ if (p_FmPcdManipParams->h_NextManip &&
++ !MANIP_DONT_REPARSE(p_FmPcdManipParams->h_NextManip))
++ {
++ /* indicate that there's another HM table descriptor */
++ tmpReg |= HMTD_CFG_NEXT_AD_EN;
++ WRITE_UINT16(((t_Hmtd *)p_Manip->h_Ad)->nextAdIdx,
++ (uint16_t)((uint32_t)(XX_VirtToPhys(MANIP_GET_HMTD_PTR(p_FmPcdManipParams->h_NextManip)) -
++ (((t_FmPcd*)p_Manip->h_FmPcd)->physicalMuramBase)) >> 4));
++ }
++
++ WRITE_UINT16(((t_Hmtd *)p_Manip->h_Ad)->cfg, tmpReg);
++ WRITE_UINT32(((t_Hmtd *)p_Manip->h_Ad)->hmcdBasePtr,
++ (uint32_t)(XX_VirtToPhys(p_Manip->p_Hmct) - (((t_FmPcd*)p_Manip->h_FmPcd)->physicalMuramBase)));
++
++ WRITE_UINT8(((t_Hmtd *)p_Manip->h_Ad)->opCode, HMAN_OC);
++
++ return E_OK;
++}
++
++static t_Error CreateManipActionShadow(t_FmPcdManip *p_Manip, t_FmPcdManipParams *p_FmPcdManipParams)
++{
++ uint8_t *p_WholeHmct, *p_TmpHmctPtr, newDataSize, *p_TmpDataPtr = NULL;
++ uint16_t newSize;
++ t_FmPcd *p_FmPcd = (t_FmPcd *)p_Manip->h_FmPcd;
++ t_Error err;
++ t_FmPcdManip *p_CurManip = p_Manip;
++
++ err = CalculateTableSize(p_FmPcdManipParams, &newSize, &newDataSize);
++ if (err)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++
++ /* check coherency of new table parameters */
++ if (newSize > p_Manip->tableSize)
++ RETURN_ERROR(MINOR, E_INVALID_VALUE, ("New Hdr Manip configuration requires larger size than current one (command table)."));
++ if (newDataSize > p_Manip->dataSize)
++ RETURN_ERROR(MINOR, E_INVALID_VALUE, ("New Hdr Manip configuration requires larger size than current one (data)."));
++ if (p_FmPcdManipParams->h_NextManip)
++ RETURN_ERROR(MINOR, E_INVALID_VALUE, ("New Hdr Manip configuration can not contain h_NextManip."));
++ if (MANIP_IS_UNIFIED(p_Manip) && (newSize != p_Manip->tableSize))
++ RETURN_ERROR(MINOR, E_INVALID_VALUE, ("New Hdr Manip configuration in a chained manipulation requires different size than current one."));
++ if (p_Manip->dontParseAfterManip != p_FmPcdManipParams->u.hdr.dontParseAfterManip)
++ RETURN_ERROR(MINOR, E_INVALID_VALUE, ("New Hdr Manip configuration differs in dontParseAfterManip value."));
++
++ p_Manip->tableSize = newSize;
++ p_Manip->dataSize = newDataSize;
++
++
++ /* Build the new table in the shadow */
++ if (!MANIP_IS_UNIFIED(p_Manip))
++ {
++ p_TmpHmctPtr = (uint8_t*)PTR_MOVE(p_FmPcd->p_CcShadow, 16);
++ if (p_Manip->p_Data)
++ p_TmpDataPtr = (uint8_t*)PTR_MOVE(p_TmpHmctPtr,
++ (PTR_TO_UINT(p_Manip->p_Data) - PTR_TO_UINT(p_Manip->p_Hmct)));
++
++ BuildHmct(p_Manip, p_FmPcdManipParams, p_TmpHmctPtr, p_Manip->p_Data, FALSE);
++ }
++ else
++ {
++ p_WholeHmct = (uint8_t *)GetManipInfo(p_Manip, e_MANIP_HMCT);
++ ASSERT_COND(p_WholeHmct);
++
++ /* Run till the last Manip (which is the first to configure) */
++ while (MANIP_IS_UNIFIED_NON_LAST(p_CurManip))
++ p_CurManip = p_CurManip->h_NextManip;
++
++ while (p_CurManip)
++ {
++ /* If this is a non-head node in a unified table, point to the part of the shadow
++ * which is the relative offset in HMCT.
++ * else, point to the beginning of the
++ * shadow table (we save 16 for the HMTD.
++ */
++ p_TmpHmctPtr = (uint8_t*)PTR_MOVE(p_FmPcd->p_CcShadow,
++ (16 + PTR_TO_UINT(p_CurManip->p_Hmct) - PTR_TO_UINT(p_WholeHmct)));
++ if (p_CurManip->p_Data)
++ p_TmpDataPtr = (uint8_t*)PTR_MOVE(p_FmPcd->p_CcShadow,
++ (16 + PTR_TO_UINT(p_CurManip->p_Data) - PTR_TO_UINT(p_WholeHmct)));
++
++ BuildHmct(p_CurManip, &p_CurManip->manipParams, p_TmpHmctPtr, p_TmpDataPtr, FALSE);
++ p_CurManip = p_CurManip->h_PrevManip;
++ }
++ }
++
++ return E_OK;
++}
++
++static t_Error CreateManipActionBackToOrig(t_FmPcdManip *p_Manip, t_FmPcdManipParams *p_FmPcdManipParams)
++{
++ uint8_t *p_WholeHmct, *p_TmpHmctPtr, *p_TmpDataPtr;
++ t_FmPcdManip *p_CurManip = p_Manip;
++
++ /* Build the new table in the shadow */
++ if (!MANIP_IS_UNIFIED(p_Manip))
++ BuildHmct(p_Manip, p_FmPcdManipParams, p_Manip->p_Hmct, p_Manip->p_Data, FALSE);
++ else
++ {
++ p_WholeHmct = (uint8_t *)GetManipInfo(p_Manip, e_MANIP_HMCT);
++ ASSERT_COND(p_WholeHmct);
++
++ /* Run till the last Manip (which is the first to configure) */
++ while (MANIP_IS_UNIFIED_NON_LAST(p_CurManip))
++ p_CurManip = p_CurManip->h_NextManip;
++
++ while (p_CurManip)
++ {
++ /* If this is a unified table, point to the part of the table
++ * which is the relative offset in HMCT.
++ */
++ p_TmpHmctPtr = p_CurManip->p_Hmct; /*- (uint32_t)p_WholeHmct*/
++ p_TmpDataPtr = p_CurManip->p_Data; /*- (uint32_t)p_WholeHmct*/
++
++ BuildHmct(p_CurManip, &p_CurManip->manipParams, p_TmpHmctPtr, p_TmpDataPtr, FALSE);
++
++ p_CurManip = p_CurManip->h_PrevManip;
++ }
++ }
++
++ return E_OK;
++}
++
++static t_Error UpdateManipIc(t_Handle h_Manip, uint8_t icOffset)
++{
++ t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;
++ t_Handle p_Ad;
++ uint32_t tmpReg32 = 0;
++ SANITY_CHECK_RETURN_ERROR(h_Manip,E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad, E_INVALID_HANDLE);
++
++ switch (p_Manip->opcode)
++ {
++ case (HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX):
++ p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
++ if (p_Manip->updateParams & INTERNAL_CONTEXT_OFFSET)
++ {
++ tmpReg32 = *(uint32_t *)&((t_AdOfTypeContLookup *)p_Ad)->pcAndOffsets;
++ tmpReg32 |= (uint32_t)((uint32_t)icOffset << 16);
++ *(uint32_t *)&((t_AdOfTypeContLookup *)p_Ad)->pcAndOffsets = tmpReg32;
++ p_Manip->updateParams &= ~INTERNAL_CONTEXT_OFFSET;
++ p_Manip->icOffset = icOffset;
++ }
++ else
++ {
++ if (p_Manip->icOffset != icOffset)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("this manipulation was updated previously by different value"););
++ }
++ break;
++#ifdef FM_CAPWAP_SUPPORT
++ case (HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST):
++ if (p_Manip->h_Frag)
++ {
++ if (p_Manip->updateParams & INTERNAL_CONTEXT_OFFSET)
++ {
++ p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
++ tmpReg32 |= GET_UINT32(((t_AdOfTypeContLookup *)p_Ad)->pcAndOffsets);
++ tmpReg32 |= (uint32_t)((uint32_t)icOffset << 16);
++ WRITE_UINT32(((t_AdOfTypeContLookup *)p_Ad)->pcAndOffsets, tmpReg32);
++ p_Manip->updateParams &= ~INTERNAL_CONTEXT_OFFSET;
++ p_Manip->icOffset = icOffset;
++ }
++ else
++ {
++ if (p_Manip->icOffset != icOffset)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("this manipulation was updated previousely by different value"););
++ }
++ }
++ break;
++#endif /* FM_CAPWAP_SUPPORT */
++ }
++
++ return E_OK;
++}
++
++static t_Error UpdateInitMvIntFrameHeaderFromFrameToBufferPrefix(t_Handle h_FmPort, t_FmPcdManip *p_Manip, t_Handle h_Ad, bool validate)
++{
++
++ t_AdOfTypeContLookup *p_Ad = (t_AdOfTypeContLookup *)h_Ad;
++ t_FmPortGetSetCcParams fmPortGetSetCcParams;
++ t_Error err;
++ uint32_t tmpReg32;
++
++ memset(&fmPortGetSetCcParams, 0, sizeof(t_FmPortGetSetCcParams));
++
++ SANITY_CHECK_RETURN_ERROR(p_Manip,E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR((p_Manip->opcode & HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX), E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(!p_Manip->muramAllocate, E_INVALID_STATE);
++
++ if (p_Manip->updateParams)
++ {
++ if ((!(p_Manip->updateParams & OFFSET_OF_PR)) ||
++ (p_Manip->shadowUpdateParams & OFFSET_OF_PR))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("in this stage parameters from Port has not be updated"));
++
++ fmPortGetSetCcParams.getCcParams.type = p_Manip->updateParams;
++ fmPortGetSetCcParams.setCcParams.type = UPDATE_PSO;
++ fmPortGetSetCcParams.setCcParams.psoSize = 16;
++
++ err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ if (fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_PR)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Parser result offset wasn't configured previousely"));
++#ifdef FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004
++ ASSERT_COND(!(fmPortGetSetCcParams.getCcParams.prOffset % 16));
++#endif
++ }
++ else if (validate)
++ {
++ if ((!(p_Manip->shadowUpdateParams & OFFSET_OF_PR)) ||
++ (p_Manip->updateParams & OFFSET_OF_PR))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("in this stage parameters from Port has be updated"));
++ fmPortGetSetCcParams.getCcParams.type = p_Manip->shadowUpdateParams;
++ fmPortGetSetCcParams.setCcParams.type = UPDATE_PSO;
++ fmPortGetSetCcParams.setCcParams.psoSize = 16;
++
++ err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ if (fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_PR)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Parser result offset wasn't configured previousely"));
++
++ }
++
++ ASSERT_COND(p_Ad);
++
++ if (p_Manip->updateParams & OFFSET_OF_PR)
++ {
++ tmpReg32 = 0;
++ tmpReg32 |= fmPortGetSetCcParams.getCcParams.prOffset;
++ WRITE_UINT32(p_Ad->matchTblPtr, (GET_UINT32(p_Ad->matchTblPtr) | tmpReg32));
++ p_Manip->updateParams &= ~OFFSET_OF_PR;
++ p_Manip->shadowUpdateParams |= OFFSET_OF_PR;
++ }
++ else if (validate)
++ {
++ tmpReg32 = GET_UINT32(p_Ad->matchTblPtr);
++ if ((uint8_t)tmpReg32 != fmPortGetSetCcParams.getCcParams.prOffset)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("this manipulation was updated previousely by different value"););
++ }
++
++ return E_OK;
++}
++
++#ifdef FM_CAPWAP_SUPPORT
++static t_Error UpdateModifyCapwapFragmenation(t_FmPcdManip *p_Manip, t_Handle h_Ad, bool validate,t_Handle h_FmTree)
++{
++ t_AdOfTypeContLookup *p_Ad = (t_AdOfTypeContLookup *)h_Ad;
++ t_FmPcdCcSavedManipParams *p_SavedManipParams = NULL;
++ uint32_t tmpReg32 = 0;
++
++ SANITY_CHECK_RETURN_ERROR(p_Manip,E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Manip->h_Frag,E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Manip->frag,E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(((p_Manip->opcode == HMAN_OC_CAPWAP_FRAGMENTATION) || (p_Manip->opcode == HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER)), E_INVALID_STATE);
++
++ p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Frag;
++
++ if (p_Manip->updateParams)
++ {
++
++ if ((!(p_Manip->updateParams & OFFSET_OF_DATA)) ||
++ ((p_Manip->shadowUpdateParams & OFFSET_OF_DATA)))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("in this stage parameters from Port has not be updated"));
++ p_SavedManipParams = FmPcdCcTreeGetSavedManipParams(h_FmTree);
++ if (!p_SavedManipParams)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("for this manipulation tree has to be configured previosely with this type"));
++ p_Manip->fragParams.dataOffset = p_SavedManipParams->capwapParams.dataOffset;
++
++ tmpReg32 = GET_UINT32(p_Ad->pcAndOffsets);
++ tmpReg32 |= ((uint32_t)p_Manip->fragParams.dataOffset<< 16);
++ WRITE_UINT32(p_Ad->pcAndOffsets,tmpReg32);
++
++ p_Manip->updateParams &= ~OFFSET_OF_DATA;
++ p_Manip->shadowUpdateParams |= OFFSET_OF_DATA;
++ }
++ else if (validate)
++ {
++
++ p_SavedManipParams = FmPcdCcTreeGetSavedManipParams(h_FmTree);
++ if (!p_SavedManipParams)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("for this manipulation tree has to be configured previosely with this type"));
++ if (p_Manip->fragParams.dataOffset != p_SavedManipParams->capwapParams.dataOffset)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("this manipulation was updated previousely by different value"));
++ }
++
++ return E_OK;
++}
++
++static t_Error UpdateInitCapwapFragmentation(t_Handle h_FmPort,
++ t_FmPcdManip *p_Manip,
++ t_Handle h_Ad,
++ bool validate,
++ t_Handle h_FmTree)
++{
++ t_AdOfTypeContLookup *p_Ad;
++ t_FmPortGetSetCcParams fmPortGetSetCcParams;
++ t_Error err;
++ uint32_t tmpReg32 = 0;
++ t_FmPcdCcSavedManipParams *p_SavedManipParams;
++
++ UNUSED(h_Ad);
++
++ SANITY_CHECK_RETURN_ERROR(p_Manip,E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Manip->h_Frag,E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Manip->frag,E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(((p_Manip->opcode == HMAN_OC_CAPWAP_FRAGMENTATION) ||
++ (p_Manip->opcode == HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER)), E_INVALID_STATE);
++
++ p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Frag;
++
++ if (p_Manip->updateParams)
++ {
++ if ((!(p_Manip->updateParams & OFFSET_OF_DATA)) ||
++ ((p_Manip->shadowUpdateParams & OFFSET_OF_DATA)))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("in this stage parameters from Port has not be updated"));
++ fmPortGetSetCcParams.getCcParams.type = p_Manip->updateParams;
++ fmPortGetSetCcParams.setCcParams.type = UPDATE_NIA_PNEN | UPDATE_FMFP_PRC_WITH_ONE_RISC_ONLY;
++ fmPortGetSetCcParams.setCcParams.nia = NIA_FM_CTL_AC_FRAG | NIA_ENG_FM_CTL;
++ /* For CAPWAP Rassembly used FMAN_CTRL2 hardcoded - so for fragmentation its better to use FMAN_CTRL1 */
++ fmPortGetSetCcParams.setCcParams.orFmanCtrl = FPM_PORT_FM_CTL1;
++
++ err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ if (fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_DATA)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Data offset wasn't configured previousely"));
++
++ p_SavedManipParams = (t_FmPcdCcSavedManipParams *)XX_Malloc(sizeof(t_FmPcdCcSavedManipParams));
++ p_SavedManipParams->capwapParams.dataOffset = fmPortGetSetCcParams.getCcParams.dataOffset;
++
++#ifdef FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004
++ ASSERT_COND(!(p_SavedManipParams->capwapParams.dataOffset % 16));
++#endif /* FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004 */
++
++ FmPcdCcTreeSetSavedManipParams(h_FmTree, (t_Handle)p_SavedManipParams);
++ }
++ else if (validate)
++ {
++ if ((!(p_Manip->shadowUpdateParams & OFFSET_OF_DATA)) ||
++ ((p_Manip->updateParams & OFFSET_OF_DATA)))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("in this stage parameters from Port has be updated"));
++ fmPortGetSetCcParams.getCcParams.type = p_Manip->shadowUpdateParams;
++ fmPortGetSetCcParams.setCcParams.type = UPDATE_NIA_PNEN | UPDATE_FMFP_PRC_WITH_ONE_RISC_ONLY;
++ fmPortGetSetCcParams.setCcParams.nia = NIA_FM_CTL_AC_FRAG | NIA_ENG_FM_CTL;
++ err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ if (fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_DATA)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Data offset wasn't configured previousely"));
++ }
++
++ if (p_Manip->updateParams)
++ {
++ tmpReg32 = GET_UINT32(p_Ad->pcAndOffsets);
++ tmpReg32 |= ((uint32_t)fmPortGetSetCcParams.getCcParams.dataOffset<< 16);
++ WRITE_UINT32(p_Ad->pcAndOffsets,tmpReg32);
++
++ p_Manip->updateParams &= ~OFFSET_OF_DATA;
++ p_Manip->shadowUpdateParams |= OFFSET_OF_DATA;
++ p_Manip->fragParams.dataOffset = fmPortGetSetCcParams.getCcParams.dataOffset;
++ }
++ else if (validate)
++ {
++ if (p_Manip->fragParams.dataOffset != fmPortGetSetCcParams.getCcParams.dataOffset)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("this manipulation was updated previousely by different value"));
++ }
++
++ return E_OK;
++}
++
++static t_Error UpdateInitCapwapReasm(t_Handle h_FmPcd,
++ t_Handle h_FmPort,
++ t_FmPcdManip *p_Manip,
++ t_Handle h_Ad,
++ bool validate)
++{
++ t_CapwapReasmPram *p_ReassmTbl;
++ t_Error err;
++ t_FmPortGetSetCcParams fmPortGetSetCcParams;
++ uint8_t i = 0;
++ uint16_t size;
++ uint32_t tmpReg32;
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++ t_FmPcdCcCapwapReassmTimeoutParams ccCapwapReassmTimeoutParams;
++
++ SANITY_CHECK_RETURN_ERROR(p_Manip,E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Manip->h_Frag,E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Manip->frag,E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR((p_Manip->opcode == HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST), E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(h_FmPcd,E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc,E_INVALID_HANDLE);
++
++ if (p_Manip->h_FmPcd != h_FmPcd)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE,
++ ("handler of PCD previously was initiated by different value"));
++
++ UNUSED(h_Ad);
++
++ memset(&fmPortGetSetCcParams, 0, sizeof(t_FmPortGetSetCcParams));
++ p_ReassmTbl = (t_CapwapReasmPram *)p_Manip->h_Frag;
++
++ if (p_Manip->updateParams)
++ {
++ if ((!(p_Manip->updateParams & NUM_OF_TASKS) &&
++ !(p_Manip->updateParams & OFFSET_OF_DATA) &&
++ !(p_Manip->updateParams & OFFSET_OF_PR) &&
++ !(p_Manip->updateParams & HW_PORT_ID)) ||
++ ((p_Manip->shadowUpdateParams & NUM_OF_TASKS) ||
++ (p_Manip->shadowUpdateParams & OFFSET_OF_DATA) || (p_Manip->shadowUpdateParams & OFFSET_OF_PR) ||
++ (p_Manip->shadowUpdateParams & HW_PORT_ID)))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("in this stage parameters from Port has not be updated"));
++
++ fmPortGetSetCcParams.getCcParams.type = p_Manip->updateParams;
++ fmPortGetSetCcParams.setCcParams.type = UPDATE_NIA_PNEN;
++ fmPortGetSetCcParams.setCcParams.nia = NIA_FM_CTL_AC_FRAG | NIA_ENG_FM_CTL;
++
++ err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ if (fmPortGetSetCcParams.getCcParams.type & NUM_OF_TASKS)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Num of tasks wasn't configured previousely"));
++ if (fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_DATA)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("offset of the data wasn't configured previousely"));
++ if (fmPortGetSetCcParams.getCcParams.type & HW_PORT_ID)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("hwPortId wasn't updated"));
++#ifdef FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004
++ ASSERT_COND((fmPortGetSetCcParams.getCcParams.dataOffset % 16) == 0);
++#endif /* FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004 */
++ }
++ else if (validate)
++ {
++ if ((!(p_Manip->shadowUpdateParams & NUM_OF_TASKS) &&
++ !(p_Manip->shadowUpdateParams & OFFSET_OF_DATA) &&
++ !(p_Manip->shadowUpdateParams & OFFSET_OF_PR) &&
++ !(p_Manip->shadowUpdateParams & HW_PORT_ID)) &&
++ ((p_Manip->updateParams & NUM_OF_TASKS) ||
++ (p_Manip->updateParams & OFFSET_OF_DATA) || (p_Manip->updateParams & OFFSET_OF_PR) ||
++ (p_Manip->updateParams & HW_PORT_ID)))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("in this stage parameters from Port has be updated"));
++
++ fmPortGetSetCcParams.getCcParams.type = p_Manip->shadowUpdateParams;
++ fmPortGetSetCcParams.setCcParams.type = UPDATE_NIA_PNEN;
++ fmPortGetSetCcParams.setCcParams.nia = NIA_FM_CTL_AC_FRAG | NIA_ENG_FM_CTL;
++
++ err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ if (fmPortGetSetCcParams.getCcParams.type & NUM_OF_TASKS)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("NumOfTasks wasn't configured previously"));
++ if (fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_DATA)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("offset of the data wasn't configured previously"));
++ if (fmPortGetSetCcParams.getCcParams.type & HW_PORT_ID)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("hwPortId wasn't updated"));
++ }
++
++ if (p_Manip->updateParams)
++ {
++ if (p_Manip->updateParams & NUM_OF_TASKS)
++ {
++ /*recommendation of Microcode team - (maxNumFramesInProcess * 2) */
++ size = (uint16_t)(p_Manip->fragParams.maxNumFramesInProcess*2 + fmPortGetSetCcParams.getCcParams.numOfTasks);
++ if (size > 255)
++ RETURN_ERROR(MAJOR,E_INVALID_VALUE, ("numOfOpenReassmEntries + numOfTasks per port can not be greater than 256"));
++
++ p_Manip->fragParams.numOfTasks = fmPortGetSetCcParams.getCcParams.numOfTasks;
++
++ /*p_ReassmFrmDescrIndxPoolTbl*/
++ p_Manip->fragParams.p_ReassmFrmDescrIndxPoolTbl =
++ (t_Handle)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
++ (uint32_t)(size + 1),
++ 4);
++ if (!p_Manip->fragParams.p_ReassmFrmDescrIndxPoolTbl)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for CAPWAP Reassembly frame buffer index pool table"));
++
++ IOMemSet32(p_Manip->fragParams.p_ReassmFrmDescrIndxPoolTbl, 0, (uint32_t)(size + 1));
++
++ for ( i = 0; i < size; i++)
++ WRITE_UINT8(*(uint8_t *)PTR_MOVE(p_Manip->fragParams.p_ReassmFrmDescrIndxPoolTbl, i), (uint8_t)(i+1));
++
++ tmpReg32 = (uint32_t)(XX_VirtToPhys(p_Manip->fragParams.p_ReassmFrmDescrIndxPoolTbl) - p_FmPcd->physicalMuramBase);
++
++ WRITE_UINT32(p_ReassmTbl->reasmFrmDescIndexPoolTblPtr, tmpReg32);
++
++ /*p_ReassmFrmDescrPoolTbl*/
++ p_Manip->fragParams.p_ReassmFrmDescrPoolTbl =
++ (t_Handle)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
++ (uint32_t)((size + 1) * FM_PCD_MANIP_CAPWAP_REASM_RFD_SIZE),
++ 4);
++
++ if (!p_Manip->fragParams.p_ReassmFrmDescrPoolTbl)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for CAPWAP Reassembly frame buffer pool table"));
++
++ IOMemSet32(p_Manip->fragParams.p_ReassmFrmDescrPoolTbl, 0, (uint32_t)((size +1)* FM_PCD_MANIP_CAPWAP_REASM_RFD_SIZE));
++
++ tmpReg32 = (uint32_t)(XX_VirtToPhys(p_Manip->fragParams.p_ReassmFrmDescrPoolTbl) - p_FmPcd->physicalMuramBase);
++
++ WRITE_UINT32(p_ReassmTbl->reasmFrmDescPoolTblPtr, tmpReg32);
++
++ /*p_TimeOutTbl*/
++
++ p_Manip->fragParams.p_TimeOutTbl =
++ (t_Handle)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
++ (uint32_t)((size + 1)* FM_PCD_MANIP_CAPWAP_REASM_TIME_OUT_ENTRY_SIZE),
++ 4);
++
++ if (!p_Manip->fragParams.p_TimeOutTbl)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for CAPWAP Reassembly timeout table"));
++
++ IOMemSet32(p_Manip->fragParams.p_TimeOutTbl, 0, (uint16_t)((size + 1)*FM_PCD_MANIP_CAPWAP_REASM_TIME_OUT_ENTRY_SIZE));
++
++ tmpReg32 = (uint32_t)(XX_VirtToPhys(p_Manip->fragParams.p_TimeOutTbl) - p_FmPcd->physicalMuramBase);
++ WRITE_UINT32(p_ReassmTbl->timeOutTblPtr, tmpReg32);
++
++ p_Manip->updateParams &= ~NUM_OF_TASKS;
++ p_Manip->shadowUpdateParams |= NUM_OF_TASKS;
++ }
++
++ if (p_Manip->updateParams & OFFSET_OF_DATA)
++ {
++ p_Manip->fragParams.dataOffset = fmPortGetSetCcParams.getCcParams.dataOffset;
++ tmpReg32 = GET_UINT32(p_ReassmTbl->mode);
++ tmpReg32|= p_Manip->fragParams.dataOffset;
++ WRITE_UINT32(p_ReassmTbl->mode, tmpReg32);
++ p_Manip->updateParams &= ~OFFSET_OF_DATA;
++ p_Manip->shadowUpdateParams |= OFFSET_OF_DATA;
++ }
++
++ if (!(fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_PR))
++ {
++ p_Manip->fragParams.prOffset = fmPortGetSetCcParams.getCcParams.prOffset;
++
++ tmpReg32 = GET_UINT32(p_ReassmTbl->mode);
++ tmpReg32|= FM_PCD_MANIP_CAPWAP_REASM_PR_COPY;
++ WRITE_UINT32(p_ReassmTbl->mode, tmpReg32);
++
++ tmpReg32 = GET_UINT32(p_ReassmTbl->intStatsTblPtr);
++ tmpReg32 |= (uint32_t)p_Manip->fragParams.prOffset << 24;
++ WRITE_UINT32(p_ReassmTbl->intStatsTblPtr, tmpReg32);
++ p_Manip->updateParams &= ~OFFSET_OF_PR;
++ p_Manip->shadowUpdateParams |= OFFSET_OF_PR;
++ }
++ else
++ {
++ p_Manip->fragParams.prOffset = 0xff;
++ p_Manip->updateParams &= ~OFFSET_OF_PR;
++ p_Manip->shadowUpdateParams |= OFFSET_OF_PR;
++ }
++
++ p_Manip->fragParams.hwPortId = fmPortGetSetCcParams.getCcParams.hardwarePortId;
++ p_Manip->updateParams &= ~HW_PORT_ID;
++ p_Manip->shadowUpdateParams |= HW_PORT_ID;
++
++ /*timeout hc */
++ ccCapwapReassmTimeoutParams.fqidForTimeOutFrames = p_Manip->fragParams.fqidForTimeOutFrames;
++ ccCapwapReassmTimeoutParams.portIdAndCapwapReassmTbl = (uint32_t)p_Manip->fragParams.hwPortId << 24;
++ ccCapwapReassmTimeoutParams.portIdAndCapwapReassmTbl |= (uint32_t)((XX_VirtToPhys(p_ReassmTbl) - p_FmPcd->physicalMuramBase));
++ ccCapwapReassmTimeoutParams.timeoutRequestTime = (((uint32_t)1<fragParams.bitFor1Micro) * p_Manip->fragParams.timeoutRoutineRequestTime)/2;
++ return FmHcPcdCcCapwapTimeoutReassm(p_FmPcd->h_Hc,&ccCapwapReassmTimeoutParams);
++ }
++
++ else if (validate)
++ {
++ if (fmPortGetSetCcParams.getCcParams.hardwarePortId != p_Manip->fragParams.hwPortId)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Reassembly manipulation previously was assigned to another port"));
++ if (fmPortGetSetCcParams.getCcParams.numOfTasks != p_Manip->fragParams.numOfTasks)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("numOfTasks for this manipulation previously was defined by another value "));
++
++
++ if (!(fmPortGetSetCcParams.getCcParams.type & OFFSET_OF_PR))
++ {
++ if (p_Manip->fragParams.prOffset != fmPortGetSetCcParams.getCcParams.prOffset)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Parse result offset previously was defined by another value "));
++ }
++ else
++ {
++ if (p_Manip->fragParams.prOffset != 0xff)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Parse result offset previously was defined by another value "));
++ }
++ if (fmPortGetSetCcParams.getCcParams.dataOffset != p_Manip->fragParams.dataOffset)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Data offset previously was defined by another value "));
++ }
++
++ return E_OK;
++}
++#endif /* FM_CAPWAP_SUPPORT */
++
++t_Error FmPcdRegisterReassmPort(t_Handle h_FmPcd, t_Handle h_IpReasmCommonPramTbl)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ t_FmPcdCcIpReassmTimeoutParams ccIpReassmTimeoutParams = {0};
++ t_Error err = E_OK;
++ uint8_t result;
++ uint32_t bitFor1Micro, tsbs, log2num;
++
++ ASSERT_COND(p_FmPcd);
++ ASSERT_COND(h_IpReasmCommonPramTbl);
++
++ bitFor1Micro = FmGetTimeStampScale(p_FmPcd->h_Fm);
++ bitFor1Micro = 32 - bitFor1Micro;
++ LOG2(FM_PCD_MANIP_IP_REASSM_TIMEOUT_THREAD_THRESH, log2num);
++ tsbs = bitFor1Micro - log2num;
++
++ ccIpReassmTimeoutParams.iprcpt = (uint32_t)(XX_VirtToPhys(h_IpReasmCommonPramTbl) - p_FmPcd->physicalMuramBase);
++ ccIpReassmTimeoutParams.tsbs = (uint8_t)tsbs;
++ ccIpReassmTimeoutParams.activate = TRUE;
++ if ((err = FmHcPcdCcIpTimeoutReassm(p_FmPcd->h_Hc, &ccIpReassmTimeoutParams, &result)) != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ switch (result)
++ {
++ case (0):
++ return E_OK;
++ case (1):
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("failed to allocate TNUM"));
++ case (2):
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("failed to allocate internal buffer"));
++ case (3):
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("'Disable Timeout Task' with invalid IPRCPT"));
++ case (4):
++ RETURN_ERROR(MAJOR, E_FULL, ("too many timeout tasks"));
++ case (5):
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, ("invalid sub command"));
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, NO_MSG);
++ }
++ return E_OK;
++}
++
++static t_Error CreateIpReassCommonTable(t_FmPcdManip *p_Manip)
++{
++ uint32_t tmpReg32 = 0, i;
++ uint64_t tmpReg64, size;
++ t_FmPcd *p_FmPcd = (t_FmPcd *)p_Manip->h_FmPcd;
++ t_Error err = E_OK;
++
++ /* Allocation of the IP Reassembly Common Parameters table. This table is located in the
++ MURAM. Its size is 64 bytes and its base address should be 8-byte aligned.
++ It contains parameters that are common to both the IPv4 reassembly function and IPv6
++ reassembly function.*/
++ p_Manip->ipReassmParams.p_IpReassCommonTbl =
++ (t_IpReassCommonTbl *)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
++ FM_PCD_MANIP_IP_REASM_COMMON_PARAM_TABLE_SIZE,
++ FM_PCD_MANIP_IP_REASM_COMMON_PARAM_TABLE_ALIGN);
++
++ if (!p_Manip->ipReassmParams.p_IpReassCommonTbl)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for Reassembly common parameters table"));
++
++ IOMemSet32(p_Manip->ipReassmParams.p_IpReassCommonTbl, 0, FM_PCD_MANIP_IP_REASM_COMMON_PARAM_TABLE_SIZE);
++
++ /* Setting the TimeOut Mode.*/
++ tmpReg32 = 0;
++ if (p_Manip->ipReassmParams.timeOutMode == e_FM_PCD_MANIP_TIME_OUT_BETWEEN_FRAMES)
++ tmpReg32 |= FM_PCD_MANIP_IP_REASM_TIME_OUT_BETWEEN_FRAMES;
++
++ /* Setting TimeOut FQID - Frames that time out are enqueued to this FQID.
++ In order to cause TimeOut frames to be discarded, this queue should be configured accordingly*/
++ tmpReg32 |= p_Manip->ipReassmParams.fqidForTimeOutFrames;
++ WRITE_UINT32(p_Manip->ipReassmParams.p_IpReassCommonTbl->timeoutModeAndFqid, tmpReg32);
++
++ /* Calculation the size of IP Reassembly Frame Descriptor - number of frames that are allowed to be reassembled simultaneously + 129.*/
++ size = p_Manip->ipReassmParams.maxNumFramesInProcess + 129;
++
++ /*Allocation of IP Reassembly Frame Descriptor Indexes Pool - This pool resides in the MURAM */
++ p_Manip->ipReassmParams.reassFrmDescrIndxPoolTblAddr =
++ PTR_TO_UINT(FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
++ (uint32_t)(size * 2),
++ 256));
++ if (!p_Manip->ipReassmParams.reassFrmDescrIndxPoolTblAddr)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for Reassembly frame descriptor indexes pool"));
++
++ IOMemSet32(UINT_TO_PTR(p_Manip->ipReassmParams.reassFrmDescrIndxPoolTblAddr), 0, (uint32_t)(size * 2));
++
++ /* The entries in IP Reassembly Frame Descriptor Indexes Pool contains indexes starting with 1 up to
++ the maximum number of frames that are allowed to be reassembled simultaneously + 128.
++ The last entry in this pool must contain the index zero*/
++ for (i=0; i<(size-1); i++)
++ WRITE_UINT16(*(uint16_t *)PTR_MOVE(UINT_TO_PTR(p_Manip->ipReassmParams.reassFrmDescrIndxPoolTblAddr), (i<<1)),
++ (uint16_t)(i+1));
++
++ /* Sets the IP Reassembly Frame Descriptor Indexes Pool offset from MURAM */
++ tmpReg32 = (uint32_t)(XX_VirtToPhys(UINT_TO_PTR(p_Manip->ipReassmParams.reassFrmDescrIndxPoolTblAddr)) - p_FmPcd->physicalMuramBase);
++ WRITE_UINT32(p_Manip->ipReassmParams.p_IpReassCommonTbl->reassFrmDescIndexPoolTblPtr, tmpReg32);
++
++ /* Allocation of the Reassembly Frame Descriptors Pool - This pool resides in external memory.
++ The number of entries in this pool should be equal to the number of entries in IP Reassembly Frame Descriptor Indexes Pool.*/
++ p_Manip->ipReassmParams.reassFrmDescrPoolTblAddr =
++ PTR_TO_UINT(XX_MallocSmart((uint32_t)(size * 64), p_Manip->ipReassmParams.dataMemId, 64));
++
++ if (!p_Manip->ipReassmParams.reassFrmDescrPoolTblAddr)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Memory allocation FAILED"));
++
++ IOMemSet32(UINT_TO_PTR(p_Manip->ipReassmParams.reassFrmDescrPoolTblAddr), 0, (uint32_t)(size * 64));
++
++ /* Sets the Reassembly Frame Descriptors Pool and liodn offset*/
++ tmpReg64 = (uint64_t)(XX_VirtToPhys(UINT_TO_PTR(p_Manip->ipReassmParams.reassFrmDescrPoolTblAddr)));
++ tmpReg64 |= ((uint64_t)(p_Manip->ipReassmParams.dataLiodnOffset & FM_PCD_MANIP_IP_REASM_LIODN_MASK) << (uint64_t)FM_PCD_MANIP_IP_REASM_LIODN_SHIFT);
++ tmpReg64 |= ((uint64_t)(p_Manip->ipReassmParams.dataLiodnOffset & FM_PCD_MANIP_IP_REASM_ELIODN_MASK) << (uint64_t)FM_PCD_MANIP_IP_REASM_ELIODN_SHIFT);
++ WRITE_UINT32(p_Manip->ipReassmParams.p_IpReassCommonTbl->liodnAndReassFrmDescPoolPtrHi, (uint32_t)(tmpReg64 >> 32));
++ WRITE_UINT32(p_Manip->ipReassmParams.p_IpReassCommonTbl->reassFrmDescPoolPtrLow, (uint32_t)tmpReg64);
++
++ /*Allocation of the TimeOut table - This table resides in the MURAM.
++ The number of entries in this table is identical to the number of entries in the Reassembly Frame Descriptors Pool*/
++ p_Manip->ipReassmParams.timeOutTblAddr =
++ PTR_TO_UINT(FM_MURAM_AllocMem(p_FmPcd->h_FmMuram, (uint32_t)(size * 8),8));
++
++ if (!p_Manip->ipReassmParams.timeOutTblAddr)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for Reassembly timeout table"));
++
++ IOMemSet32(UINT_TO_PTR(p_Manip->ipReassmParams.timeOutTblAddr), 0, (uint16_t)(size * 8));
++
++ /* Sets the TimeOut table offset from MURAM */
++ tmpReg32 = (uint32_t)(XX_VirtToPhys(UINT_TO_PTR(p_Manip->ipReassmParams.timeOutTblAddr)) - p_FmPcd->physicalMuramBase);
++ WRITE_UINT32(p_Manip->ipReassmParams.p_IpReassCommonTbl->timeOutTblPtr, tmpReg32);
++
++ /* Sets the Expiration Delay */
++ tmpReg32 = 0;
++ tmpReg32 |= (((uint32_t)(1 << FmGetTimeStampScale(p_FmPcd->h_Fm))) * p_Manip->ipReassmParams.timeoutThresholdForReassmProcess);
++ WRITE_UINT32(p_Manip->ipReassmParams.p_IpReassCommonTbl->expirationDelay, tmpReg32);
++
++ err = FmPcdRegisterReassmPort(p_FmPcd, p_Manip->ipReassmParams.p_IpReassCommonTbl);
++ if (err != E_OK)
++ {
++ FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->ipReassmParams.p_IpReassCommonTbl);
++ RETURN_ERROR(MAJOR, err, ("port registration"));
++ }
++
++ return err;
++}
++
++static t_Error CreateIpReassTable(t_FmPcdManip *p_Manip, bool ipv4)
++{
++ t_FmPcd *p_FmPcd = p_Manip->h_FmPcd;
++ uint32_t tmpReg32, autoLearnHashTblSize;
++ uint32_t numOfWays, setSize, setSizeCode, keySize;
++ uint32_t waySize, numOfSets, numOfEntries;
++ uint64_t tmpReg64;
++ uint16_t minFragSize;
++ uintptr_t *p_AutoLearnHashTblAddr, *p_AutoLearnSetLockTblAddr;
++ t_IpReassTbl **p_IpReassTbl;
++
++ if (ipv4)
++ {
++ p_IpReassTbl = &p_Manip->ipReassmParams.p_Ipv4ReassTbl;
++ p_AutoLearnHashTblAddr = &p_Manip->ipReassmParams.ipv4AutoLearnHashTblAddr;
++ p_AutoLearnSetLockTblAddr = &p_Manip->ipReassmParams.ipv4AutoLearnSetLockTblAddr;
++ minFragSize = p_Manip->ipReassmParams.minFragSize[0];
++ numOfWays = p_Manip->ipReassmParams.numOfFramesPerHashEntry[0];
++ keySize = 4 + 4 + 1 + 2; /* 3-tuple + IP-Id */
++ }
++ else
++ {
++ p_IpReassTbl = &p_Manip->ipReassmParams.p_Ipv6ReassTbl;
++ p_AutoLearnHashTblAddr = &p_Manip->ipReassmParams.ipv6AutoLearnHashTblAddr;
++ p_AutoLearnSetLockTblAddr = &p_Manip->ipReassmParams.ipv6AutoLearnSetLockTblAddr;
++ minFragSize = p_Manip->ipReassmParams.minFragSize[1];
++ numOfWays = p_Manip->ipReassmParams.numOfFramesPerHashEntry[1];
++ keySize = 16 + 16 + 4; /* 2-tuple + IP-Id */
++ if (numOfWays > e_FM_PCD_MANIP_SIX_WAYS_HASH)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("num of ways"));
++ }
++ keySize += 2; /* 2 bytes reserved for RFDIndex */
++#if (DPAA_VERSION >= 11)
++ keySize += 2; /* 2 bytes reserved */
++#endif /* (DPAA_VERSION >= 11) */
++ waySize = ROUND_UP(keySize, 8);
++
++ /* Allocates the IP Reassembly Parameters Table - This table is located in the MURAM.*/
++ *p_IpReassTbl = (t_IpReassTbl *)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
++ FM_PCD_MANIP_IP_REASM_TABLE_SIZE,
++ FM_PCD_MANIP_IP_REASM_TABLE_ALIGN);
++ if (!*p_IpReassTbl)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for Reassembly IPv4/IPv6 specific parameters table"));
++ memset(*p_IpReassTbl, 0, sizeof(t_IpReassTbl));
++
++ /* Sets the IP Reassembly common Parameters table offset from MURAM in the IP Reassembly Table descriptor*/
++ tmpReg32 = (uint32_t)(XX_VirtToPhys(p_Manip->ipReassmParams.p_IpReassCommonTbl) - p_FmPcd->physicalMuramBase);
++ WRITE_UINT32((*p_IpReassTbl)->ipReassCommonPrmTblPtr, tmpReg32);
++
++ /* Calculate set size (set size is rounded-up to next power of 2) */
++ NEXT_POWER_OF_2(numOfWays * waySize, setSize);
++
++ /* Get set size code */
++ LOG2(setSize, setSizeCode);
++
++ /* Sets ways number and set size code */
++ WRITE_UINT16((*p_IpReassTbl)->waysNumAndSetSize, (uint16_t)((numOfWays << 8) | setSizeCode));
++
++ /* It is recommended that the total number of entries in this table
++ (number of sets * number of ways) will be twice the number of frames that
++ are expected to be reassembled simultaneously.*/
++ numOfEntries = (uint32_t)(p_Manip->ipReassmParams.maxNumFramesInProcess * 2);
++
++ /* sets number calculation - number of entries = number of sets * number of ways */
++ numOfSets = numOfEntries / numOfWays;
++
++ /* Sets AutoLearnHashKeyMask*/
++ NEXT_POWER_OF_2(numOfSets, numOfSets);
++
++ WRITE_UINT16((*p_IpReassTbl)->autoLearnHashKeyMask, (uint16_t)(numOfSets - 1));
++
++ /* Allocation of IP Reassembly Automatic Learning Hash Table - This table resides in external memory.
++ The size of this table is determined by the number of sets and the set size.
++ Table size = set size * number of sets
++ This table base address should be aligned to SetSize.*/
++ autoLearnHashTblSize = numOfSets * setSize;
++
++ *p_AutoLearnHashTblAddr = PTR_TO_UINT(XX_MallocSmart(autoLearnHashTblSize, p_Manip->ipReassmParams.dataMemId, setSize));
++ if (!*p_AutoLearnHashTblAddr)
++ {
++ FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, *p_IpReassTbl);
++ *p_IpReassTbl = NULL;
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Memory allocation FAILED"));
++ }
++ IOMemSet32(UINT_TO_PTR(*p_AutoLearnHashTblAddr), 0, autoLearnHashTblSize);
++
++ /* Sets the IP Reassembly Automatic Learning Hash Table and liodn offset */
++ tmpReg64 = ((uint64_t)(p_Manip->ipReassmParams.dataLiodnOffset & FM_PCD_MANIP_IP_REASM_LIODN_MASK) << (uint64_t)FM_PCD_MANIP_IP_REASM_LIODN_SHIFT);
++ tmpReg64 |= ((uint64_t)(p_Manip->ipReassmParams.dataLiodnOffset & FM_PCD_MANIP_IP_REASM_ELIODN_MASK) << (uint64_t)FM_PCD_MANIP_IP_REASM_ELIODN_SHIFT);
++ tmpReg64 |= XX_VirtToPhys(UINT_TO_PTR(*p_AutoLearnHashTblAddr));
++ WRITE_UINT32((*p_IpReassTbl)->liodnAlAndAutoLearnHashTblPtrHi, (uint32_t)(tmpReg64 >> 32));
++ WRITE_UINT32((*p_IpReassTbl)->autoLearnHashTblPtrLow, (uint32_t)tmpReg64);
++
++ /* Allocation of the Set Lock table - This table resides in external memory
++ The size of this table is (number of sets in the IP Reassembly Automatic Learning Hash table)*4 bytes.
++ This table resides in external memory and its base address should be 4-byte aligned */
++ *p_AutoLearnSetLockTblAddr = PTR_TO_UINT(XX_MallocSmart((uint32_t)(numOfSets * 4), p_Manip->ipReassmParams.dataMemId, 4));
++ if (!*p_AutoLearnSetLockTblAddr)
++ {
++ FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, *p_IpReassTbl);
++ *p_IpReassTbl = NULL;
++ XX_FreeSmart(UINT_TO_PTR(*p_AutoLearnHashTblAddr));
++ *p_AutoLearnHashTblAddr = 0;
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Memory allocation FAILED"));
++ }
++ IOMemSet32(UINT_TO_PTR(*p_AutoLearnSetLockTblAddr), 0, (numOfSets * 4));
++
++ /* sets Set Lock table pointer and liodn offset*/
++ tmpReg64 = ((uint64_t)(p_Manip->ipReassmParams.dataLiodnOffset & FM_PCD_MANIP_IP_REASM_LIODN_MASK) << (uint64_t)FM_PCD_MANIP_IP_REASM_LIODN_SHIFT);
++ tmpReg64 |= ((uint64_t)(p_Manip->ipReassmParams.dataLiodnOffset & FM_PCD_MANIP_IP_REASM_ELIODN_MASK) << (uint64_t)FM_PCD_MANIP_IP_REASM_ELIODN_SHIFT);
++ tmpReg64 |= XX_VirtToPhys(UINT_TO_PTR(*p_AutoLearnSetLockTblAddr));
++ WRITE_UINT32((*p_IpReassTbl)->liodnSlAndAutoLearnSetLockTblPtrHi, (uint32_t)(tmpReg64 >> 32));
++ WRITE_UINT32((*p_IpReassTbl)->autoLearnSetLockTblPtrLow, (uint32_t)tmpReg64);
++
++ /* Sets user's requested minimum fragment size (in Bytes) for First/Middle fragment */
++ WRITE_UINT16((*p_IpReassTbl)->minFragSize, minFragSize);
++
++ return E_OK;
++}
++
++static t_Error UpdateInitIpReasm(t_Handle h_FmPcd,
++ t_Handle h_PcdParams,
++ t_Handle h_FmPort,
++ t_FmPcdManip *p_Manip,
++ t_Handle h_Ad,
++ bool validate)
++{
++ t_FmPortGetSetCcParams fmPortGetSetCcParams;
++ uint32_t tmpReg32;
++ t_Error err;
++ t_FmPortPcdParams *p_PcdParams = (t_FmPortPcdParams *)h_PcdParams;
++#if (DPAA_VERSION >= 11)
++ uint8_t *p_Ptr;
++#endif /* (DPAA_VERSION >= 11) */
++
++ SANITY_CHECK_RETURN_ERROR(p_Manip, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Manip->frag, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR((p_Manip->opcode == HMAN_OC_IP_REASSEMBLY), E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_Manip->updateParams || h_PcdParams, E_INVALID_HANDLE);
++
++ UNUSED(h_Ad);
++
++ if (!p_Manip->updateParams)
++ return E_OK;
++
++ if (p_Manip->h_FmPcd != h_FmPcd)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("handler of PCD previously was initiated by different value"));
++
++ if (p_Manip->updateParams)
++ {
++ if ((!(p_Manip->updateParams & (NUM_OF_TASKS | NUM_OF_EXTRA_TASKS))) ||
++ ((p_Manip->shadowUpdateParams & (NUM_OF_TASKS | NUM_OF_EXTRA_TASKS))))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("in this stage parameters from Port has not be updated"));
++
++ fmPortGetSetCcParams.setCcParams.type = 0;
++ fmPortGetSetCcParams.getCcParams.type = p_Manip->updateParams;
++ if ((err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams)) != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ if (fmPortGetSetCcParams.getCcParams.type & (NUM_OF_TASKS | NUM_OF_EXTRA_TASKS))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("offset of the data wasn't configured previously"));
++ }
++ else if (validate)
++ {
++ if ((!(p_Manip->shadowUpdateParams & (NUM_OF_TASKS | NUM_OF_EXTRA_TASKS))) ||
++ ((p_Manip->updateParams & (NUM_OF_TASKS | NUM_OF_EXTRA_TASKS))))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("in this stage parameters from Port has be updated"));
++
++ fmPortGetSetCcParams.setCcParams.type = 0;
++ fmPortGetSetCcParams.getCcParams.type = p_Manip->shadowUpdateParams;
++ if ((err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams)) != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ if (fmPortGetSetCcParams.getCcParams.type & (NUM_OF_TASKS | NUM_OF_EXTRA_TASKS))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("offset of the data wasn't configured previously"));
++ }
++
++ if (p_Manip->updateParams)
++ {
++ if (p_Manip->updateParams & (NUM_OF_TASKS | NUM_OF_EXTRA_TASKS))
++ {
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++ uint8_t *p_Ptr, i, totalNumOfTnums;
++
++ totalNumOfTnums = (uint8_t)(fmPortGetSetCcParams.getCcParams.numOfTasks +
++ fmPortGetSetCcParams.getCcParams.numOfExtraTasks);
++
++ p_Manip->ipReassmParams.internalBufferPoolAddr =
++ PTR_TO_UINT(FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
++ (uint32_t)(totalNumOfTnums * BMI_FIFO_UNITS),
++ BMI_FIFO_UNITS));
++ if (!p_Manip->ipReassmParams.internalBufferPoolAddr)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for Reassembly internal buffers pool"));
++ IOMemSet32(UINT_TO_PTR(p_Manip->ipReassmParams.internalBufferPoolAddr),
++ 0,
++ (uint32_t)(totalNumOfTnums * BMI_FIFO_UNITS));
++
++ p_Manip->ipReassmParams.internalBufferPoolManagementIndexAddr =
++ PTR_TO_UINT(FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
++ (uint32_t)(5 + totalNumOfTnums),
++ 4));
++ if (!p_Manip->ipReassmParams.internalBufferPoolManagementIndexAddr)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for Reassembly internal buffers management"));
++
++ p_Ptr = (uint8_t*)UINT_TO_PTR(p_Manip->ipReassmParams.internalBufferPoolManagementIndexAddr);
++ WRITE_UINT32(*(uint32_t*)p_Ptr, (uint32_t)(XX_VirtToPhys(UINT_TO_PTR(p_Manip->ipReassmParams.internalBufferPoolAddr)) - p_FmPcd->physicalMuramBase));
++ for (i=0, p_Ptr += 4; i < totalNumOfTnums; i++, p_Ptr++)
++ WRITE_UINT8(*p_Ptr, i);
++ WRITE_UINT8(*p_Ptr, 0xFF);
++
++ tmpReg32 = (4 << FM_PCD_MANIP_IP_REASM_COMMON_INT_BUFFER_IDX_SHIFT) |
++ ((uint32_t)(XX_VirtToPhys(UINT_TO_PTR(p_Manip->ipReassmParams.internalBufferPoolManagementIndexAddr)) - p_FmPcd->physicalMuramBase));
++ WRITE_UINT32(p_Manip->ipReassmParams.p_IpReassCommonTbl->internalBufferManagement, tmpReg32);
++
++ p_Manip->updateParams &= ~(NUM_OF_TASKS | NUM_OF_EXTRA_TASKS);
++ p_Manip->shadowUpdateParams |= (NUM_OF_TASKS | NUM_OF_EXTRA_TASKS);
++ }
++ }
++
++ if (p_Manip->ipReassmParams.h_Ipv4Scheme)
++ {
++ p_PcdParams->p_KgParams->h_Schemes[p_PcdParams->p_KgParams->numOfSchemes] = p_Manip->ipReassmParams.h_Ipv4Scheme;
++ p_PcdParams->p_KgParams->numOfSchemes++;
++ }
++ if (p_Manip->ipReassmParams.h_Ipv6Scheme)
++ {
++ p_PcdParams->p_KgParams->h_Schemes[p_PcdParams->p_KgParams->numOfSchemes] = p_Manip->ipReassmParams.h_Ipv6Scheme;
++ p_PcdParams->p_KgParams->numOfSchemes++;
++ }
++
++#if (DPAA_VERSION >= 11)
++ memset(&fmPortGetSetCcParams, 0, sizeof(t_FmPortGetSetCcParams));
++ fmPortGetSetCcParams.setCcParams.type = 0;
++ fmPortGetSetCcParams.getCcParams.type = FM_REV;
++ if ((err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams)) != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ if (fmPortGetSetCcParams.getCcParams.revInfo.majorRev >= 6)
++ {
++ if ((err = FmPortSetGprFunc(h_FmPort, e_FM_PORT_GPR_MURAM_PAGE, (void**)&p_Ptr)) != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ tmpReg32 = NIA_ENG_KG;
++ if (p_Manip->ipReassmParams.h_Ipv4Scheme)
++ {
++ tmpReg32 |= NIA_KG_DIRECT;
++ tmpReg32 |= NIA_KG_CC_EN;
++ tmpReg32 |= FmPcdKgGetSchemeId(p_Manip->ipReassmParams.h_Ipv4Scheme);
++ WRITE_UINT32(*(uint32_t*)PTR_MOVE(p_Ptr, NIA_IPR_DIRECT_SCHEME_IPV4_OFFSET), tmpReg32);
++ }
++ if (p_Manip->ipReassmParams.h_Ipv6Scheme)
++ {
++ tmpReg32 &= ~NIA_AC_MASK;
++ tmpReg32 |= NIA_KG_DIRECT;
++ tmpReg32 |= NIA_KG_CC_EN;
++ tmpReg32 |= FmPcdKgGetSchemeId(p_Manip->ipReassmParams.h_Ipv6Scheme);
++ WRITE_UINT32(*(uint32_t*)PTR_MOVE(p_Ptr, NIA_IPR_DIRECT_SCHEME_IPV6_OFFSET), tmpReg32);
++ }
++ }
++#endif /* (DPAA_VERSION >= 11) */
++
++ return E_OK;
++}
++
++#if (DPAA_VERSION == 10)
++static t_Error FmPcdFragHcScratchPoolFill(t_Handle h_FmPcd, uint8_t scratchBpid)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ t_FmPcdCcFragScratchPoolCmdParams fmPcdCcFragScratchPoolCmdParams;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++
++ memset(&fmPcdCcFragScratchPoolCmdParams, 0, sizeof(t_FmPcdCcFragScratchPoolCmdParams));
++
++ fmPcdCcFragScratchPoolCmdParams.numOfBuffers = NUM_OF_SCRATCH_POOL_BUFFERS;
++ fmPcdCcFragScratchPoolCmdParams.bufferPoolId = scratchBpid;
++ if ((err = FmHcPcdCcIpFragScratchPollCmd(p_FmPcd->h_Hc, TRUE, &fmPcdCcFragScratchPoolCmdParams)) != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ if (fmPcdCcFragScratchPoolCmdParams.numOfBuffers != 0)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Fill scratch pool failed,"
++ "Failed to release %d buffers to the BM (missing FBPRs)",
++ fmPcdCcFragScratchPoolCmdParams.numOfBuffers));
++
++ return E_OK;
++}
++
++static t_Error FmPcdFragHcScratchPoolEmpty(t_Handle h_FmPcd, uint8_t scratchBpid)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ t_FmPcdCcFragScratchPoolCmdParams fmPcdCcFragScratchPoolCmdParams;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++
++ memset(&fmPcdCcFragScratchPoolCmdParams, 0, sizeof(t_FmPcdCcFragScratchPoolCmdParams));
++
++ fmPcdCcFragScratchPoolCmdParams.bufferPoolId = scratchBpid;
++ if ((err = FmHcPcdCcIpFragScratchPollCmd(p_FmPcd->h_Hc, FALSE, &fmPcdCcFragScratchPoolCmdParams)) != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ return E_OK;
++}
++#endif /* (DPAA_VERSION == 10) */
++
++static void ReleaseManipHandler(t_FmPcdManip *p_Manip, t_FmPcd *p_FmPcd)
++{
++ if (p_Manip->h_Ad)
++ {
++ if (p_Manip->muramAllocate)
++ FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->h_Ad);
++ else
++ XX_Free(p_Manip->h_Ad);
++ p_Manip->h_Ad = NULL;
++ }
++ if (p_Manip->p_Template)
++ {
++ FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->p_Template);
++ p_Manip->p_Template = NULL;
++ }
++ if (p_Manip->h_Frag)
++ {
++ if (p_Manip->fragParams.p_AutoLearnHashTbl)
++ FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->fragParams.p_AutoLearnHashTbl);
++ if (p_Manip->fragParams.p_ReassmFrmDescrPoolTbl)
++ FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->fragParams.p_ReassmFrmDescrPoolTbl);
++ if (p_Manip->fragParams.p_ReassmFrmDescrIndxPoolTbl)
++ FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->fragParams.p_ReassmFrmDescrIndxPoolTbl);
++ if (p_Manip->fragParams.p_TimeOutTbl)
++ FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->fragParams.p_TimeOutTbl);
++ FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->h_Frag);
++
++ }
++ if (p_Manip->frag)
++ {
++ if (p_Manip->ipFragParams.p_Frag)
++ {
++#if (DPAA_VERSION == 10)
++ FmPcdFragHcScratchPoolEmpty((t_Handle)p_FmPcd, p_Manip->ipFragParams.scratchBpid);
++#endif /* (DPAA_VERSION == 10) */
++
++ FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->ipFragParams.p_Frag);
++ }
++ }
++ else if (p_Manip->reassm)
++ {
++ FmPcdUnregisterReassmPort(p_FmPcd, p_Manip->ipReassmParams.p_IpReassCommonTbl);
++
++ if (p_Manip->ipReassmParams.timeOutTblAddr)
++ FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, UINT_TO_PTR(p_Manip->ipReassmParams.timeOutTblAddr));
++ if (p_Manip->ipReassmParams.reassFrmDescrPoolTblAddr)
++ XX_FreeSmart(UINT_TO_PTR(p_Manip->ipReassmParams.reassFrmDescrPoolTblAddr));
++
++ if (p_Manip->ipReassmParams.ipv4AutoLearnHashTblAddr)
++ XX_FreeSmart(UINT_TO_PTR(p_Manip->ipReassmParams.ipv4AutoLearnHashTblAddr));
++ if (p_Manip->ipReassmParams.ipv6AutoLearnHashTblAddr)
++ XX_FreeSmart(UINT_TO_PTR(p_Manip->ipReassmParams.ipv6AutoLearnHashTblAddr));
++ if (p_Manip->ipReassmParams.ipv4AutoLearnSetLockTblAddr)
++ XX_FreeSmart(UINT_TO_PTR(p_Manip->ipReassmParams.ipv4AutoLearnSetLockTblAddr));
++ if (p_Manip->ipReassmParams.ipv6AutoLearnSetLockTblAddr)
++ XX_FreeSmart(UINT_TO_PTR(p_Manip->ipReassmParams.ipv6AutoLearnSetLockTblAddr));
++ if (p_Manip->ipReassmParams.p_Ipv4ReassTbl)
++ FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->ipReassmParams.p_Ipv4ReassTbl);
++ if (p_Manip->ipReassmParams.p_Ipv6ReassTbl)
++ FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->ipReassmParams.p_Ipv6ReassTbl);
++ if (p_Manip->ipReassmParams.p_IpReassCommonTbl)
++ FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->ipReassmParams.p_IpReassCommonTbl);
++ if (p_Manip->ipReassmParams.reassFrmDescrIndxPoolTblAddr)
++ FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, UINT_TO_PTR(p_Manip->ipReassmParams.reassFrmDescrIndxPoolTblAddr));
++ if (p_Manip->ipReassmParams.internalBufferPoolManagementIndexAddr)
++ FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, UINT_TO_PTR(p_Manip->ipReassmParams.internalBufferPoolManagementIndexAddr));
++ if (p_Manip->ipReassmParams.internalBufferPoolAddr)
++ FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, UINT_TO_PTR(p_Manip->ipReassmParams.internalBufferPoolAddr));
++
++ if (p_Manip->ipReassmParams.h_Ipv6Ad)
++ XX_FreeSmart(p_Manip->ipReassmParams.h_Ipv6Ad);
++ if (p_Manip->ipReassmParams.h_Ipv4Ad)
++ XX_FreeSmart(p_Manip->ipReassmParams.h_Ipv4Ad);
++ }
++
++ if (p_Manip->p_StatsTbl)
++ FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->p_StatsTbl);
++}
++
++#ifdef FM_CAPWAP_SUPPORT
++static t_Error CheckManipParamsAndSetType(t_FmPcdManip *p_Manip, t_FmPcdManipParams *p_ManipParams)
++{
++ if (p_ManipParams->u.hdr.rmv)
++ {
++ switch (p_ManipParams->u.hdr.rmvParams.type)
++ {
++ case (e_FM_PCD_MANIP_RMV_BY_HDR):
++ switch (p_ManipParams->u.hdr.rmvParams.u.byHdr.type)
++ {
++ case (e_FM_PCD_MANIP_RMV_BY_HDR_FROM_START) :
++ if (p_ManipParams->u.hdr.rmvParams.u.byHdr.u.fromStartByHdr.include)
++ {
++ switch (p_ManipParams->u.hdr.rmvParams.u.byHdr.u.fromStartByHdr.hdrInfo.hdr)
++ {
++ case (HEADER_TYPE_CAPWAP_DTLS) :
++ p_Manip->opcode = HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST;
++ p_Manip->muramAllocate = TRUE;
++ if (p_ManipParams->u.hdr.insrt)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("for CAPWAP_DTLS_HDR remove can not be insrt manipualtion after"));
++ if (p_ManipParams->fragOrReasm)
++ {
++ if (!p_ManipParams->fragOrReasmParams.frag)
++ {
++ switch (p_ManipParams->fragOrReasmParams.hdr)
++ {
++ case (HEADER_TYPE_CAPWAP):
++ p_Manip->opcode = HMAN_OC_CAPWAP_REASSEMBLY;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("unsupported header for Reassembly"));
++ }
++ }
++ else
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("for this type of manipulation frag can not be TRUE"));
++ }
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("non valid net header of remove location"));
++ }
++ }
++ else
++ {
++ switch (p_ManipParams->u.hdr.rmvParams.u.byHdr.u.fromStartByHdr.hdrInfo.hdr)
++ {
++ case (HEADER_TYPE_CAPWAP_DTLS) :
++ case (HEADER_TYPE_CAPWAP) :
++ if (p_ManipParams->fragOrReasm || p_ManipParams->u.hdr.insrt)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("for the type of remove e_FM_PCD_MANIP_RMV_FROM_START_OF_FRAME_TILL_CAPWAP can not be insert or fragOrReasm TRUE"));
++ p_Manip->opcode = HMAN_OC_RMV_N_OR_INSRT_INT_FRM_HDR;
++ p_Manip->muramAllocate = TRUE;
++ p_ManipParams->u.hdr.insrt = TRUE; //internal frame header
++ break;
++ default :
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("invalid type of remove manipulation"));
++ }
++ }
++ break;
++ default :
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("invalid type of remove manipulation"));
++ }
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("invalid type of remove manipulation"));
++ }
++ }
++ else if (p_ManipParams->u.hdr.insrt)
++ {
++ switch (p_ManipParams->u.hdr.insrtParams.type)
++ {
++ case (e_FM_PCD_MANIP_INSRT_BY_TEMPLATE) :
++
++ p_Manip->opcode = HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER;
++ p_Manip->muramAllocate = FALSE;
++ if (p_ManipParams->fragOrReasm)
++ {
++ if (p_ManipParams->fragOrReasmParams.frag)
++ {
++ switch (p_ManipParams->fragOrReasmParams.hdr)
++ {
++ case (HEADER_TYPE_CAPWAP):
++ p_Manip->opcode = HMAN_OC_CAPWAP_FRAGMENTATION;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid header for fragmentation"));
++ }
++ }
++ else
++ RETURN_ERROR(MAJOR, E_INVALID_STATE,("can not reach this point"));
++ }
++ break;
++
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("for only isert manipulation unsupported type"));
++ }
++ }
++ else if (p_ManipParams->fragOrReasm)
++ {
++ if (p_ManipParams->fragOrReasmParams.frag)
++ {
++ switch (p_ManipParams->fragOrReasmParams.hdr)
++ {
++ case (HEADER_TYPE_CAPWAP):
++ p_Manip->opcode = HMAN_OC_CAPWAP_FRAGMENTATION;
++ p_Manip->muramAllocate = FALSE;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Unsupported header for fragmentation"));
++ }
++ }
++ else
++ {
++ switch (p_ManipParams->fragOrReasmParams.hdr)
++ {
++ case (HEADER_TYPE_CAPWAP):
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Reassembly has to be with additional operation - rmv = TRUE, type of remove - e_FM_PCD_MANIP_RMV_FROM_START_OF_FRAME_INCLUDE_SPECIFIC_LOCATION,type = e_FM_PCD_MANIP_LOC_BY_HDR, hdr = HEADER_TYPE_CAPWAP_DTLS"));
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Unsupported header for reassembly"));
++ }
++ }
++
++ }
++ else
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("User didn't ask for any manipulation"));
++
++ p_Manip->insrt = p_ManipParams->u.hdr.insrt;
++ p_Manip->rmv = p_ManipParams->u.hdr.rmv;
++
++ return E_OK;
++}
++
++#else /* not FM_CAPWAP_SUPPORT */
++static t_Error CheckManipParamsAndSetType(t_FmPcdManip *p_Manip, t_FmPcdManipParams *p_ManipParams)
++{
++ switch (p_ManipParams->type)
++ {
++ case e_FM_PCD_MANIP_HDR :
++ /* Check that next-manip is not already used */
++ if (p_ManipParams->h_NextManip)
++ {
++ if (!MANIP_IS_FIRST(p_ManipParams->h_NextManip))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("h_NextManip is already a part of another chain"));
++ if (MANIP_GET_TYPE(p_ManipParams->h_NextManip) != e_FM_PCD_MANIP_HDR)
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("For a Header Manipulation node - no support of h_NextManip of type other than Header Manipulation."));
++ }
++
++ if (p_ManipParams->u.hdr.rmv)
++ {
++ switch (p_ManipParams->u.hdr.rmvParams.type)
++ {
++ case (e_FM_PCD_MANIP_RMV_BY_HDR):
++ switch (p_ManipParams->u.hdr.rmvParams.u.byHdr.type)
++ {
++ case (e_FM_PCD_MANIP_RMV_BY_HDR_SPECIFIC_L2) :
++ p_Manip->opcode = HMAN_OC;
++ p_Manip->muramAllocate = TRUE;
++ break;
++ default :
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("invalid type of remove manipulation"));
++ }
++ break;
++ case (e_FM_PCD_MANIP_RMV_GENERIC):
++ p_Manip->opcode = HMAN_OC;
++ p_Manip->muramAllocate = TRUE;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("invalid type of remove manipulation"));
++ }
++ p_Manip->rmv = TRUE;
++ }
++ else if (p_ManipParams->u.hdr.insrt)
++ {
++ switch (p_ManipParams->u.hdr.insrtParams.type)
++ {
++ case (e_FM_PCD_MANIP_INSRT_BY_HDR) :
++ case (e_FM_PCD_MANIP_INSRT_GENERIC):
++ p_Manip->opcode = HMAN_OC;
++ p_Manip->muramAllocate = TRUE;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("for only isert manipulation unsupported type"));
++ }
++ p_Manip->insrt = TRUE;
++ }
++ else if (p_ManipParams->u.hdr.fieldUpdate)
++ {
++ /* Check parameters */
++ if (p_ManipParams->u.hdr.fieldUpdateParams.type == e_FM_PCD_MANIP_HDR_FIELD_UPDATE_VLAN)
++ {
++ if ((p_ManipParams->u.hdr.fieldUpdateParams.u.vlan.updateType == e_FM_PCD_MANIP_HDR_FIELD_UPDATE_VLAN_VPRI)
++ && (p_ManipParams->u.hdr.fieldUpdateParams.u.vlan.u.vpri > 7))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("vpri should get values of 0-7 "));
++ if (p_ManipParams->u.hdr.fieldUpdateParams.u.vlan.updateType == e_FM_PCD_MANIP_HDR_FIELD_UPDATE_DSCP_TO_VLAN)
++ {
++ int i;
++
++ if (p_ManipParams->u.hdr.fieldUpdateParams.u.vlan.u.dscpToVpri.vpriDefVal > 7)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("vpriDefVal should get values of 0-7 "));
++ for (i = 0 ; i < FM_PCD_MANIP_DSCP_TO_VLAN_TRANS ; i++)
++ if (p_ManipParams->u.hdr.fieldUpdateParams.u.vlan.u.dscpToVpri.dscpToVpriTable[i] & 0xf0)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dscpToVpriTabl value out of range (0-15)"));
++ }
++
++ }
++
++ p_Manip->opcode = HMAN_OC;
++ p_Manip->muramAllocate = TRUE;
++ p_Manip->fieldUpdate = TRUE;
++ }
++ else if (p_ManipParams->u.hdr.custom)
++ {
++ p_Manip->opcode = HMAN_OC;
++ p_Manip->muramAllocate = TRUE;
++ p_Manip->custom = TRUE;
++ }
++ break;
++ case e_FM_PCD_MANIP_REASSEM :
++ if (p_ManipParams->h_NextManip)
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("next manip with reassembly"));
++ switch (p_ManipParams->u.reassem.hdr)
++ {
++ case (HEADER_TYPE_IPv4):
++ p_Manip->ipReassmParams.hdr = HEADER_TYPE_IPv4;
++ break;
++ case (HEADER_TYPE_IPv6):
++ p_Manip->ipReassmParams.hdr = HEADER_TYPE_IPv6;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("header for reassembly"));
++ }
++ p_Manip->opcode = HMAN_OC_IP_REASSEMBLY;
++ break;
++ case e_FM_PCD_MANIP_FRAG :
++ if (p_ManipParams->h_NextManip)
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("next manip with fragmentation"));
++ switch (p_ManipParams->u.frag.hdr)
++ {
++ case (HEADER_TYPE_IPv4):
++ case (HEADER_TYPE_IPv6):
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("header for fragmentation"));
++ }
++ p_Manip->opcode = HMAN_OC_IP_FRAGMENTATION;
++ p_Manip->muramAllocate = TRUE;
++ break;
++ case e_FM_PCD_MANIP_SPECIAL_OFFLOAD :
++ switch (p_ManipParams->u.specialOffload.type)
++ {
++ case (e_FM_PCD_MANIP_SPECIAL_OFFLOAD_IPSEC):
++ p_Manip->opcode = HMAN_OC_IPSEC_MANIP;
++ p_Manip->muramAllocate = TRUE;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("special offload type"));
++ }
++ break;
++ default :
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("manip type"));
++ }
++
++ return E_OK;
++}
++#endif /* not FM_CAPWAP_SUPPORT */
++
++#ifdef FM_CAPWAP_SUPPORT
++static t_Error UpdateIndxStats(t_Handle h_FmPcd,
++ t_Handle h_FmPort,
++ t_FmPcdManip *p_Manip)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++ uint32_t tmpReg32 = 0;
++ t_AdOfTypeContLookup *p_Ad;
++ t_FmPortGetSetCcParams fmPortGetSetCcParams;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_Manip,E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad,E_INVALID_HANDLE);
++
++ p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
++ if (p_Manip->h_FmPcd != h_FmPcd)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE,
++ ("handler of PCD previously was initiated by different value"));
++
++ memset(&fmPortGetSetCcParams, 0, sizeof(t_FmPortGetSetCcParams));
++
++ if (!p_Manip->p_StatsTbl)
++ {
++
++ fmPortGetSetCcParams.setCcParams.type = UPDATE_NIA_PNDN;
++ fmPortGetSetCcParams.setCcParams.nia = NIA_FM_CTL_AC_CC;
++ err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ tmpReg32 = GET_UINT32(p_Ad->ccAdBase);
++
++ p_Manip->p_StatsTbl =
++ (t_Handle)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
++ (uint32_t)p_Manip->owner * FM_PCD_MANIP_INDEXED_STATS_ENTRY_SIZE,
++ 4);
++ if (!p_Manip->p_StatsTbl)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for Manipulation indexed statistics table"));
++
++ IOMemSet32(p_Manip->p_StatsTbl, 0, (uint32_t)(p_Manip->owner * 4));
++
++ tmpReg32 |= (uint32_t)(XX_VirtToPhys(p_Manip->p_StatsTbl) - p_FmPcd->physicalMuramBase);
++
++ if (p_Manip->cnia)
++ tmpReg32 |= FM_PCD_MANIP_INDEXED_STATS_CNIA;
++
++ tmpReg32 |= FM_PCD_MANIP_INDEXED_STATS_DPD;
++ WRITE_UINT32(p_Ad->ccAdBase, tmpReg32);
++ }
++ else
++ {
++ fmPortGetSetCcParams.setCcParams.type = UPDATE_NIA_PNDN;
++ fmPortGetSetCcParams.setCcParams.nia = NIA_FM_CTL_AC_CC;
++ err = FmPortGetSetCcParams(h_FmPort, &fmPortGetSetCcParams);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ return E_OK;
++}
++#endif /* FM_CAPWAP_SUPPORT */
++
++static t_Error FmPcdManipInitUpdate(t_Handle h_FmPcd,
++ t_Handle h_PcdParams,
++ t_Handle h_FmPort,
++ t_Handle h_Manip,
++ t_Handle h_Ad,
++ bool validate,
++ int level,
++ t_Handle h_FmTree)
++{
++ t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;
++ t_Error err = E_OK;
++
++ SANITY_CHECK_RETURN_ERROR(h_Manip,E_INVALID_HANDLE);
++
++ UNUSED(level);
++ UNUSED(h_FmPcd);
++ UNUSED(h_FmTree);
++
++ switch (p_Manip->opcode)
++ {
++ case (HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX):
++ err = UpdateInitMvIntFrameHeaderFromFrameToBufferPrefix(h_FmPort, p_Manip, h_Ad, validate);
++ break;
++#ifdef FM_CAPWAP_SUPPORT
++ case (HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER):
++ if (!p_Manip->h_Frag)
++ break;
++ case (HMAN_OC_CAPWAP_FRAGMENTATION):
++ err = UpdateInitCapwapFragmentation(h_FmPort, p_Manip, h_Ad, validate, h_FmTree);
++ break;
++ case (HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST):
++ if (p_Manip->h_Frag)
++ err = UpdateInitCapwapReasm(h_FmPcd, h_FmPort, p_Manip, h_Ad, validate);
++ break;
++ case (HMAN_OC_CAPWAP_INDEXED_STATS):
++ err = UpdateIndxStats(h_FmPcd, h_FmPort, p_Manip);
++ break;
++#endif /* FM_CAPWAP_SUPPORT */
++ case (HMAN_OC_IP_REASSEMBLY):
++ err = UpdateInitIpReasm(h_FmPcd, h_PcdParams, h_FmPort, p_Manip, h_Ad, validate);
++ break;
++ default:
++ return E_OK;
++ }
++
++ return err;
++}
++
++static t_Error FmPcdManipModifyUpdate(t_Handle h_Manip, t_Handle h_Ad, bool validate, int level, t_Handle h_FmTree)
++{
++
++ t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;
++ t_Error err = E_OK;
++
++ UNUSED(level);
++
++ switch (p_Manip->opcode)
++ {
++ case (HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX):
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("modify node with this type of manipulation is not suppported"));
++ case (HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST):
++
++ if (p_Manip->h_Frag)
++ {
++ if (!(p_Manip->shadowUpdateParams & NUM_OF_TASKS) &&
++ !(p_Manip->shadowUpdateParams & OFFSET_OF_DATA) &&
++ !(p_Manip->shadowUpdateParams & OFFSET_OF_PR))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("modify node with this type of manipulation requires manipulation be updated previously in SetPcd function"));
++ }
++ break;
++#ifdef FM_CAPWAP_SUPPORT
++ case (HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER):
++ if (p_Manip->h_Frag)
++ err = UpdateModifyCapwapFragmenation(p_Manip, h_Ad, validate, h_FmTree);
++ break;
++#endif /* FM_CAPWAP_SUPPORT */
++ default:
++ return E_OK;
++ }
++
++ return err;
++}
++
++#ifdef FM_CAPWAP_SUPPORT
++static t_Error GetPrOffsetByHeaderOrField(t_FmManipHdrInfo *p_HdrInfo, uint8_t *parseArrayOffset)
++{
++ e_NetHeaderType hdr = p_HdrInfo->hdr;
++ e_FmPcdHdrIndex hdrIndex = p_HdrInfo->hdrIndex;
++ bool byField = p_HdrInfo->byField;
++ t_FmPcdFields field;
++
++ if (byField)
++ field = p_HdrInfo->fullField;
++
++ if (byField)
++ {
++ switch (hdr)
++ {
++ case (HEADER_TYPE_ETH):
++ switch (field.eth)
++ {
++ case (NET_HEADER_FIELD_ETH_TYPE):
++ *parseArrayOffset = CC_PC_PR_ETYPE_LAST_OFFSET;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("Header manipulation of the type Ethernet with this field not supported"));
++ }
++ break;
++ case (HEADER_TYPE_VLAN):
++ switch (field.vlan)
++ {
++ case (NET_HEADER_FIELD_VLAN_TCI) :
++ if ((hdrIndex == e_FM_PCD_HDR_INDEX_NONE) || (hdrIndex == e_FM_PCD_HDR_INDEX_1))
++ *parseArrayOffset = CC_PC_PR_VLAN1_OFFSET;
++ else if (hdrIndex == e_FM_PCD_HDR_INDEX_LAST)
++ *parseArrayOffset = CC_PC_PR_VLAN2_OFFSET;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("Header manipulation of the type VLAN with this field not supported"));
++ }
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("Header manipulation of this header by field not supported"));
++ }
++ }
++ else
++ {
++ switch (hdr){
++ case (HEADER_TYPE_ETH):
++ *parseArrayOffset = (uint8_t)CC_PC_PR_ETH_OFFSET;
++ break;
++ case (HEADER_TYPE_USER_DEFINED_SHIM1):
++ *parseArrayOffset = (uint8_t)CC_PC_PR_USER_DEFINED_SHIM1_OFFSET;
++ break;
++ case (HEADER_TYPE_USER_DEFINED_SHIM2):
++ *parseArrayOffset = (uint8_t)CC_PC_PR_USER_DEFINED_SHIM2_OFFSET;
++ break;
++ case (HEADER_TYPE_LLC_SNAP):
++ *parseArrayOffset = CC_PC_PR_USER_LLC_SNAP_OFFSET;
++ break;
++ case (HEADER_TYPE_PPPoE):
++ *parseArrayOffset = CC_PC_PR_PPPOE_OFFSET;
++ break;
++ case (HEADER_TYPE_MPLS):
++ if ((hdrIndex == e_FM_PCD_HDR_INDEX_NONE) || (hdrIndex == e_FM_PCD_HDR_INDEX_1))
++ *parseArrayOffset = CC_PC_PR_MPLS1_OFFSET;
++ else if (hdrIndex == e_FM_PCD_HDR_INDEX_LAST)
++ *parseArrayOffset = CC_PC_PR_MPLS_LAST_OFFSET;
++ break;
++ case (HEADER_TYPE_IPv4):
++ case (HEADER_TYPE_IPv6):
++ if ((hdrIndex == e_FM_PCD_HDR_INDEX_NONE) || (hdrIndex == e_FM_PCD_HDR_INDEX_1))
++ *parseArrayOffset = CC_PC_PR_IP1_OFFSET;
++ else if (hdrIndex == e_FM_PCD_HDR_INDEX_2)
++ *parseArrayOffset = CC_PC_PR_IP_LAST_OFFSET;
++ break;
++ case (HEADER_TYPE_MINENCAP):
++ *parseArrayOffset = CC_PC_PR_MINENC_OFFSET;
++ break;
++ case (HEADER_TYPE_GRE):
++ *parseArrayOffset = CC_PC_PR_GRE_OFFSET;
++ break;
++ case (HEADER_TYPE_TCP):
++ case (HEADER_TYPE_UDP):
++ case (HEADER_TYPE_IPSEC_AH):
++ case (HEADER_TYPE_IPSEC_ESP):
++ case (HEADER_TYPE_DCCP):
++ case (HEADER_TYPE_SCTP):
++ *parseArrayOffset = CC_PC_PR_L4_OFFSET;
++ break;
++ case (HEADER_TYPE_CAPWAP):
++ case (HEADER_TYPE_CAPWAP_DTLS):
++ *parseArrayOffset = CC_PC_PR_NEXT_HEADER_OFFSET;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("Header manipulation of this header is not supported"));
++ }
++ }
++ return E_OK;
++}
++
++static t_Error RmvHdrTillSpecLocNOrInsrtIntFrmHdr(t_FmPcdManipHdrRmvParams *p_ManipParams, t_FmPcdManip *p_Manip)
++{
++ t_AdOfTypeContLookup *p_Ad;
++ uint32_t tmpReg32 = 0;
++ uint8_t prsArrayOffset = 0;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_Manip,E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_ManipParams,E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad,E_INVALID_HANDLE);
++
++ p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
++ if (p_Manip->rmv)
++ {
++ err = GetPrOffsetByHeaderOrField(&p_ManipParams->u.byHdr.u.fromStartByHdr.hdrInfo, &prsArrayOffset);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ tmpReg32 |= (uint32_t)prsArrayOffset << 24;
++ tmpReg32 |= HMAN_RMV_HDR;
++ }
++
++ if (p_Manip->insrt)
++ tmpReg32 |= HMAN_INSRT_INT_FRM_HDR;
++
++ tmpReg32 |= (uint32_t)HMAN_OC_RMV_N_OR_INSRT_INT_FRM_HDR;
++
++ WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);
++
++ tmpReg32 = 0;
++ tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;
++ WRITE_UINT32(p_Ad->ccAdBase, tmpReg32);
++
++ return E_OK;
++}
++#endif /* FM_CAPWAP_SUPPORT */
++
++static t_Error MvIntFrameHeaderFromFrameToBufferPrefix(t_FmPcdManip *p_Manip, bool caamUsed)
++{
++ t_AdOfTypeContLookup *p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
++ uint32_t tmpReg32 = 0;
++
++ SANITY_CHECK_RETURN_ERROR(p_Ad,E_INVALID_HANDLE);
++
++ p_Manip->updateParams |= OFFSET_OF_PR | INTERNAL_CONTEXT_OFFSET;
++
++ tmpReg32 = 0;
++ tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;
++ *(uint32_t *)&p_Ad->ccAdBase = tmpReg32;
++
++ tmpReg32 = 0;
++ tmpReg32 |= HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX;
++ tmpReg32 |= (uint32_t)0x16 << 16;
++ *(uint32_t *)&p_Ad->pcAndOffsets = tmpReg32;
++
++ if (caamUsed)
++ *(uint32_t *)&p_Ad->gmask = 0xf0000000;
++
++ return E_OK;
++}
++
++#ifdef FM_CAPWAP_SUPPORT
++static t_Error CapwapRmvDtlsHdr(t_FmPcd *p_FmPcd, t_FmPcdManip *p_Manip)
++{
++ t_AdOfTypeContLookup *p_Ad;
++ uint32_t tmpReg32 = 0;
++ t_Error err = E_OK;
++
++ SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad,E_INVALID_HANDLE);
++
++ p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
++
++ tmpReg32 = 0;
++ tmpReg32 |= (uint32_t)HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST;
++ WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);
++
++ tmpReg32 = 0;
++ tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;
++
++
++ if (p_Manip->h_Frag)
++ {
++ p_Manip->updateParams |= INTERNAL_CONTEXT_OFFSET;
++ tmpReg32 |= (uint32_t)(XX_VirtToPhys(p_Manip->h_Frag) - (p_FmPcd->physicalMuramBase));
++ }
++
++ WRITE_UINT32(p_Ad->ccAdBase, tmpReg32);
++
++ return err;
++}
++
++static t_Error CapwapReassembly(t_CapwapReassemblyParams *p_ManipParams,
++ t_FmPcdManip *p_Manip,
++ t_FmPcd *p_FmPcd,
++ uint8_t poolId)
++{
++ t_Handle p_Table;
++ uint32_t tmpReg32 = 0;
++ int i = 0;
++ uint8_t log2Num;
++ uint8_t numOfSets;
++ uint32_t j = 0;
++
++ SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
++
++ if (!p_FmPcd->h_Hc)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE,("hc port has to be initialized in this mode"));
++ if (!POWER_OF_2(p_ManipParams->timeoutRoutineRequestTime))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("timeoutRoutineRequestTime has to be power of 2"));
++ if (!POWER_OF_2(p_ManipParams->maxNumFramesInProcess))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE,("maxNumFramesInProcess has to be power of 2"));
++ if (!p_ManipParams->timeoutRoutineRequestTime && p_ManipParams->timeoutThresholdForReassmProcess)
++ DBG(WARNING, ("if timeoutRoutineRequestTime 0, timeoutThresholdForReassmProcess is uselessly"));
++ if (p_ManipParams->numOfFramesPerHashEntry == e_FM_PCD_MANIP_FOUR_WAYS_HASH)
++ {
++ if ((p_ManipParams->maxNumFramesInProcess < 4) ||
++ (p_ManipParams->maxNumFramesInProcess > 512))
++ RETURN_ERROR(MAJOR,E_INVALID_VALUE, ("In the case of numOfFramesPerHashEntry = e_FM_PCD_MANIP_EIGHT_WAYS_HASH maxNumFramesInProcess has to be in the range 4-512"));
++ }
++ else
++ {
++ if ((p_ManipParams->maxNumFramesInProcess < 8) ||
++ (p_ManipParams->maxNumFramesInProcess > 2048))
++ RETURN_ERROR(MAJOR,E_INVALID_VALUE, ("In the case of numOfFramesPerHashEntry = e_FM_PCD_MANIP_FOUR_WAYS_HASH maxNumFramesInProcess has to be in the range 8-2048"));
++ }
++
++ p_Manip->updateParams |= (NUM_OF_TASKS | OFFSET_OF_PR | OFFSET_OF_DATA | HW_PORT_ID);
++
++ p_Manip->h_Frag = (t_Handle)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
++ FM_PCD_MANIP_CAPWAP_REASM_TABLE_SIZE,
++ FM_PCD_MANIP_CAPWAP_REASM_TABLE_ALIGN);
++ if (!p_Manip->h_Frag)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc CAPWAP reassembly parameters table"));
++
++ IOMemSet32(p_Manip->h_Frag, 0, FM_PCD_MANIP_CAPWAP_REASM_TABLE_SIZE);
++
++ p_Table = (t_CapwapReasmPram *)p_Manip->h_Frag;
++
++ p_Manip->fragParams.p_AutoLearnHashTbl =
++ (t_Handle)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
++ (uint32_t)(p_ManipParams->maxNumFramesInProcess * 2 * FM_PCD_MANIP_CAPWAP_REASM_AUTO_LEARNING_HASH_ENTRY_SIZE),
++ FM_PCD_MANIP_CAPWAP_REASM_TABLE_ALIGN);
++
++ if (!p_Manip->fragParams.p_AutoLearnHashTbl)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY,("MURAM alloc for CAPWAP automatic learning hash table"));
++
++ IOMemSet32(p_Manip->fragParams.p_AutoLearnHashTbl, 0, (uint32_t)(p_ManipParams->maxNumFramesInProcess * 2 * FM_PCD_MANIP_CAPWAP_REASM_AUTO_LEARNING_HASH_ENTRY_SIZE));
++
++
++ tmpReg32 = (uint32_t)(XX_VirtToPhys(p_Manip->fragParams.p_AutoLearnHashTbl) - p_FmPcd->physicalMuramBase);
++
++ WRITE_UINT32(((t_CapwapReasmPram *)p_Table)->autoLearnHashTblPtr, tmpReg32);
++
++ tmpReg32 = 0;
++ if (p_ManipParams->timeOutMode == e_FM_PCD_MANIP_TIME_OUT_BETWEEN_FRAMES)
++ tmpReg32 |= FM_PCD_MANIP_CAPWAP_REASM_TIME_OUT_BETWEEN_FRAMES;
++ if (p_ManipParams->haltOnDuplicationFrag)
++ tmpReg32 |= FM_PCD_MANIP_CAPWAP_REASM_HALT_ON_DUPLICATE_FRAG;
++ if (p_ManipParams->numOfFramesPerHashEntry == e_FM_PCD_MANIP_EIGHT_WAYS_HASH)
++ {
++ i = 8;
++ tmpReg32 |= FM_PCD_MANIP_CAPWAP_REASM_AUTOMATIC_LEARNIN_HASH_8_WAYS;
++ }
++ else
++ i = 4;
++
++ numOfSets = (uint8_t)((p_ManipParams->maxNumFramesInProcess * 2) / i);
++ LOG2(numOfSets, log2Num);
++ tmpReg32 |= (uint32_t)(log2Num - 1) << 24;
++
++ WRITE_UINT32(((t_CapwapReasmPram *)p_Table)->mode, tmpReg32);
++
++ for (j=0; jmaxNumFramesInProcess*2; j++)
++ if (((j / i) % 2)== 0)
++ WRITE_UINT32(*(uint32_t *)PTR_MOVE(p_Manip->fragParams.p_AutoLearnHashTbl, j * FM_PCD_MANIP_CAPWAP_REASM_AUTO_LEARNING_HASH_ENTRY_SIZE), 0x80000000);
++
++ tmpReg32 = 0x00008000;
++ tmpReg32 |= (uint32_t)poolId << 16;
++ WRITE_UINT32(((t_CapwapReasmPram *)p_Table)->bufferPoolIdAndRisc1SetIndexes, tmpReg32);
++ WRITE_UINT32(((t_CapwapReasmPram *)p_Table)->risc23SetIndexes, 0x80008000);
++ WRITE_UINT32(((t_CapwapReasmPram *)p_Table)->risc4SetIndexesAndExtendedStatsTblPtr, 0x80000000);
++
++ p_Manip->fragParams.maxNumFramesInProcess = p_ManipParams->maxNumFramesInProcess;
++
++ p_Manip->fragParams.sgBpid = poolId;
++
++ p_Manip->fragParams.fqidForTimeOutFrames = p_ManipParams->fqidForTimeOutFrames;
++ p_Manip->fragParams.timeoutRoutineRequestTime = p_ManipParams->timeoutRoutineRequestTime;
++ p_Manip->fragParams.bitFor1Micro = FmGetTimeStampScale(p_FmPcd->h_Fm);
++
++ tmpReg32 = 0;
++ tmpReg32 |= (((uint32_t)1<fragParams.bitFor1Micro) * p_ManipParams->timeoutThresholdForReassmProcess);
++ WRITE_UINT32(((t_CapwapReasmPram *)p_Table)->expirationDelay, tmpReg32);
++
++ return E_OK;
++}
++
++static t_Error CapwapFragmentation(t_CapwapFragmentationParams *p_ManipParams,
++ t_FmPcdManip *p_Manip,
++ t_FmPcd *p_FmPcd,
++ uint8_t poolId)
++{
++ t_AdOfTypeContLookup *p_Ad;
++ uint32_t tmpReg32 = 0;
++
++ SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad,E_INVALID_HANDLE);
++
++ p_Manip->updateParams |= OFFSET_OF_DATA;
++
++ p_Manip->frag = TRUE;
++
++ p_Manip->h_Frag = (t_Handle)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
++ FM_PCD_CC_AD_ENTRY_SIZE,
++ FM_PCD_CC_AD_TABLE_ALIGN);
++ if (!p_Manip->h_Frag)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for CAPWAP fragmentation table descriptor"));
++
++ IOMemSet32(p_Manip->h_Frag, 0, FM_PCD_CC_AD_ENTRY_SIZE);
++
++ p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Frag;
++
++ tmpReg32 = 0;
++ tmpReg32 |= (uint32_t)HMAN_OC_CAPWAP_FRAGMENTATION;
++
++ if (p_ManipParams->headerOptionsCompr)
++ tmpReg32 |= FM_PCD_MANIP_CAPWAP_FRAG_COMPR_OPTION_FIELD_EN;
++ tmpReg32 |= ((uint32_t)poolId << 8);
++ WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);
++
++ tmpReg32 = 0;
++ tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;
++ WRITE_UINT32(p_Ad->ccAdBase, tmpReg32);
++
++ p_Manip->sizeForFragmentation = p_ManipParams->sizeForFragmentation;
++ p_Manip->fragParams.sgBpid = poolId;
++
++ return E_OK;
++}
++#endif /* FM_CAPWAP_SUPPORT */
++
++static t_Error FillReassmManipParams(t_FmPcdManip *p_Manip, bool ipv4)
++{
++ t_AdOfTypeContLookup *p_Ad;
++ t_FmPcd *p_FmPcd = (t_FmPcd *)p_Manip->h_FmPcd;
++ uint32_t tmpReg32;
++ t_Error err = E_OK;
++
++ /* Creates the IP Reassembly Parameters table. It contains parameters that are specific to either the IPv4 reassembly
++ function or to the IPv6 reassembly function. If both IPv4 reassembly and IPv6 reassembly are required, then
++ two separate IP Reassembly Parameter tables are required.*/
++ if ((err = CreateIpReassTable(p_Manip, ipv4)) != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ /* Sets the first Ad register (ccAdBase) - Action Descriptor Type and Pointer to the IP Reassembly Parameters Table offset from MURAM*/
++ tmpReg32 = 0;
++ tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;
++
++ /* Gets the required Action descriptor table pointer */
++ if (ipv4)
++ {
++ p_Ad = (t_AdOfTypeContLookup *)p_Manip->ipReassmParams.h_Ipv4Ad;
++ tmpReg32 |= (uint32_t)(XX_VirtToPhys(p_Manip->ipReassmParams.p_Ipv4ReassTbl) - (p_FmPcd->physicalMuramBase));
++ }
++ else
++ {
++ p_Ad = (t_AdOfTypeContLookup *)p_Manip->ipReassmParams.h_Ipv6Ad;
++ tmpReg32 |= (uint32_t)(XX_VirtToPhys(p_Manip->ipReassmParams.p_Ipv6ReassTbl) - (p_FmPcd->physicalMuramBase));
++ }
++
++ WRITE_UINT32(p_Ad->ccAdBase, tmpReg32);
++
++ /* Sets the second Ad register (matchTblPtr) - Buffer pool ID (BPID for V2) and Scatter/Gather table offset*/
++ /* mark the Scatter/Gather table offset to be set later on when the port will be known */
++ p_Manip->updateParams = (NUM_OF_TASKS | NUM_OF_EXTRA_TASKS);
++
++#if (DPAA_VERSION == 10)
++ tmpReg32 = (uint32_t)(p_Manip->ipReassmParams.sgBpid << 8);
++ WRITE_UINT32(p_Ad->matchTblPtr, tmpReg32);
++#endif /* (DPAA_VERSION == 10) */
++#if (DPAA_VERSION >= 11)
++ if (p_Manip->ipReassmParams.nonConsistentSpFqid != 0)
++ {
++ tmpReg32 = FM_PCD_AD_NCSPFQIDM_MASK | (uint32_t)(p_Manip->ipReassmParams.nonConsistentSpFqid);
++ WRITE_UINT32(p_Ad->gmask, tmpReg32);
++ }
++#endif /* (DPAA_VERSION >= 11) */
++
++ /* Sets the third Ad register (pcAndOffsets)- IP Reassemble Operation Code*/
++ tmpReg32 = 0;
++ tmpReg32 |= (uint32_t)HMAN_OC_IP_REASSEMBLY;
++ WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);
++
++ p_Manip->reassm = TRUE;
++
++ return E_OK;
++}
++
++static t_Error SetIpv4ReassmManip(t_FmPcdManip *p_Manip)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)p_Manip->h_FmPcd;
++
++ /* Allocation if IPv4 Action descriptor */
++ p_Manip->ipReassmParams.h_Ipv4Ad =
++ (t_Handle)XX_MallocSmart(FM_PCD_CC_AD_ENTRY_SIZE,
++ p_Manip->ipReassmParams.dataMemId,
++ FM_PCD_CC_AD_TABLE_ALIGN);
++ if (!p_Manip->ipReassmParams.h_Ipv4Ad)
++ {
++ ReleaseManipHandler(p_Manip, p_FmPcd);
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Allocation of IPv4 table descriptor"));
++ }
++
++ memset(p_Manip->ipReassmParams.h_Ipv4Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE);
++
++ /* Fill reassembly manipulation parameter in the IP Reassembly Action Descriptor */
++ return FillReassmManipParams(p_Manip, TRUE);
++}
++
++static t_Error SetIpv6ReassmManip(t_FmPcdManip *p_Manip)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)p_Manip->h_FmPcd;
++
++ /* Allocation if IPv6 Action descriptor */
++ p_Manip->ipReassmParams.h_Ipv6Ad =
++ (t_Handle)XX_MallocSmart(FM_PCD_CC_AD_ENTRY_SIZE,
++ p_Manip->ipReassmParams.dataMemId,
++ FM_PCD_CC_AD_TABLE_ALIGN);
++ if (!p_Manip->ipReassmParams.h_Ipv6Ad)
++ {
++ ReleaseManipHandler(p_Manip, p_FmPcd);
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Allocation of IPv6 table descriptor"));
++ }
++
++ memset(p_Manip->ipReassmParams.h_Ipv6Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE);
++
++ /* Fill reassembly manipulation parameter in the IP Reassembly Action Descriptor */
++ return FillReassmManipParams(p_Manip, FALSE);
++}
++
++static t_Error IpReassembly(t_FmPcdManipReassemParams *p_ManipReassmParams,
++ t_FmPcdManip *p_Manip)
++{
++ uint32_t maxSetNumber = 10000;
++ t_FmPcdManipReassemIpParams reassmManipParams = p_ManipReassmParams->u.ipReassem;
++ t_Error res;
++
++ SANITY_CHECK_RETURN_ERROR(p_Manip->h_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(((t_FmPcd *)p_Manip->h_FmPcd)->h_Hc, E_INVALID_HANDLE);
++
++ /* Check validation of user's parameter.*/
++ if ((reassmManipParams.timeoutThresholdForReassmProcess < 1000) ||
++ (reassmManipParams.timeoutThresholdForReassmProcess > 8000000))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE,("timeoutThresholdForReassmProcess should be 1msec - 8sec"));
++ /* It is recommended that the total number of entries in this table (number of sets * number of ways)
++ will be twice the number of frames that are expected to be reassembled simultaneously.*/
++ if (reassmManipParams.maxNumFramesInProcess >
++ (reassmManipParams.maxNumFramesInProcess * maxSetNumber / 2))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("maxNumFramesInProcess has to be less than (maximun set number * number of ways / 2)"));
++
++ if ((p_ManipReassmParams->hdr == HEADER_TYPE_IPv6) &&
++ (reassmManipParams.minFragSize[1] < 256))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("minFragSize[1] must be >= 256"));
++
++ /* Saves user's reassembly manipulation parameters */
++ p_Manip->ipReassmParams.relativeSchemeId[0] = reassmManipParams.relativeSchemeId[0];
++ p_Manip->ipReassmParams.relativeSchemeId[1] = reassmManipParams.relativeSchemeId[1];
++ p_Manip->ipReassmParams.numOfFramesPerHashEntry[0] = reassmManipParams.numOfFramesPerHashEntry[0];
++ p_Manip->ipReassmParams.numOfFramesPerHashEntry[1] = reassmManipParams.numOfFramesPerHashEntry[1];
++ p_Manip->ipReassmParams.minFragSize[0] = reassmManipParams.minFragSize[0];
++ p_Manip->ipReassmParams.minFragSize[1] = reassmManipParams.minFragSize[1];
++ p_Manip->ipReassmParams.maxNumFramesInProcess = reassmManipParams.maxNumFramesInProcess;
++ p_Manip->ipReassmParams.timeOutMode = reassmManipParams.timeOutMode;
++ p_Manip->ipReassmParams.fqidForTimeOutFrames = reassmManipParams.fqidForTimeOutFrames;
++ p_Manip->ipReassmParams.timeoutThresholdForReassmProcess = reassmManipParams.timeoutThresholdForReassmProcess;
++ p_Manip->ipReassmParams.dataMemId = reassmManipParams.dataMemId;
++ p_Manip->ipReassmParams.dataLiodnOffset = reassmManipParams.dataLiodnOffset;
++#if (DPAA_VERSION == 10)
++ p_Manip->ipReassmParams.sgBpid = reassmManipParams.sgBpid;
++#endif /* (DPAA_VERSION == 10) */
++#if (DPAA_VERSION >= 11)
++ if (reassmManipParams.nonConsistentSpFqid != 0)
++ {
++ p_Manip->ipReassmParams.nonConsistentSpFqid = reassmManipParams.nonConsistentSpFqid;
++ }
++#endif /* (DPAA_VERSION >= 11) */
++
++ /* Creates and initializes the IP Reassembly common parameter table */
++ CreateIpReassCommonTable(p_Manip);
++
++ /* Creation of IPv4 reassembly manipulation */
++ if ((p_Manip->ipReassmParams.hdr == HEADER_TYPE_IPv6) || (p_Manip->ipReassmParams.hdr == HEADER_TYPE_IPv4))
++ {
++ res = SetIpv4ReassmManip(p_Manip);
++ if (res != E_OK)
++ return res;
++ }
++
++ /* Creation of IPv6 reassembly manipulation */
++ if (p_Manip->ipReassmParams.hdr == HEADER_TYPE_IPv6)
++ {
++ res = SetIpv6ReassmManip(p_Manip);
++ if (res != E_OK)
++ return res;
++ }
++
++ return E_OK;
++}
++
++static void setReassmSchemeParams(t_FmPcd* p_FmPcd, t_FmPcdKgSchemeParams *p_Scheme, t_Handle h_CcTree, bool ipv4, uint8_t groupId)
++{
++ uint32_t j;
++ uint8_t res;
++
++ /* Configures scheme's network environment parameters */
++ p_Scheme->netEnvParams.numOfDistinctionUnits = 2;
++ if (ipv4)
++ res = FmPcdNetEnvGetUnitId(p_FmPcd, FmPcdGetNetEnvId(p_Scheme->netEnvParams.h_NetEnv), HEADER_TYPE_IPv4, FALSE, 0);
++ else
++ res = FmPcdNetEnvGetUnitId(p_FmPcd, FmPcdGetNetEnvId(p_Scheme->netEnvParams.h_NetEnv), HEADER_TYPE_IPv6, FALSE, 0);
++ ASSERT_COND(res != FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS);
++ p_Scheme->netEnvParams.unitIds[0] = res;
++
++ res = FmPcdNetEnvGetUnitId(p_FmPcd, FmPcdGetNetEnvId(p_Scheme->netEnvParams.h_NetEnv), HEADER_TYPE_USER_DEFINED_SHIM2, FALSE, 0);
++ ASSERT_COND(res != FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS);
++ p_Scheme->netEnvParams.unitIds[1] = res;
++
++ /* Configures scheme's next engine parameters*/
++ p_Scheme->nextEngine = e_FM_PCD_CC;
++ p_Scheme->kgNextEngineParams.cc.h_CcTree = h_CcTree;
++ p_Scheme->kgNextEngineParams.cc.grpId = groupId;
++ p_Scheme->useHash = TRUE;
++
++ /* Configures scheme's key*/
++ if (ipv4 == TRUE)
++ {
++ p_Scheme->keyExtractAndHashParams.numOfUsedExtracts = 4;
++ p_Scheme->keyExtractAndHashParams.extractArray[0].type = e_FM_PCD_EXTRACT_BY_HDR;
++ p_Scheme->keyExtractAndHashParams.extractArray[0].extractByHdr.type = e_FM_PCD_EXTRACT_FULL_FIELD;
++ p_Scheme->keyExtractAndHashParams.extractArray[0].extractByHdr.hdr = HEADER_TYPE_IPv4 ;
++ p_Scheme->keyExtractAndHashParams.extractArray[0].extractByHdr.extractByHdrType.fullField.ipv4 = NET_HEADER_FIELD_IPv4_DST_IP;
++ p_Scheme->keyExtractAndHashParams.extractArray[1].type = e_FM_PCD_EXTRACT_BY_HDR;
++ p_Scheme->keyExtractAndHashParams.extractArray[1].extractByHdr.type = e_FM_PCD_EXTRACT_FULL_FIELD;
++ p_Scheme->keyExtractAndHashParams.extractArray[1].extractByHdr.hdr = HEADER_TYPE_IPv4;
++ p_Scheme->keyExtractAndHashParams.extractArray[1].extractByHdr.extractByHdrType.fullField.ipv4 = NET_HEADER_FIELD_IPv4_SRC_IP;
++ p_Scheme->keyExtractAndHashParams.extractArray[2].type = e_FM_PCD_EXTRACT_BY_HDR;
++ p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.type = e_FM_PCD_EXTRACT_FULL_FIELD;
++ p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.hdr = HEADER_TYPE_IPv4;
++ p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.extractByHdrType.fullField.ipv4 = NET_HEADER_FIELD_IPv4_PROTO;
++ p_Scheme->keyExtractAndHashParams.extractArray[3].type = e_FM_PCD_EXTRACT_BY_HDR;
++ p_Scheme->keyExtractAndHashParams.extractArray[3].extractByHdr.hdr = HEADER_TYPE_IPv4;
++ p_Scheme->keyExtractAndHashParams.extractArray[3].extractByHdr.type = e_FM_PCD_EXTRACT_FROM_HDR;
++ p_Scheme->keyExtractAndHashParams.extractArray[3].extractByHdr.ignoreProtocolValidation = FALSE;
++ p_Scheme->keyExtractAndHashParams.extractArray[3].extractByHdr.extractByHdrType.fromHdr.size = 2;
++ p_Scheme->keyExtractAndHashParams.extractArray[3].extractByHdr.extractByHdrType.fromHdr.offset = 4;
++ }
++ else /* IPv6 */
++ {
++ p_Scheme->keyExtractAndHashParams.numOfUsedExtracts = 3;
++ p_Scheme->keyExtractAndHashParams.extractArray[0].type = e_FM_PCD_EXTRACT_BY_HDR;
++ p_Scheme->keyExtractAndHashParams.extractArray[0].extractByHdr.type = e_FM_PCD_EXTRACT_FULL_FIELD;
++ p_Scheme->keyExtractAndHashParams.extractArray[0].extractByHdr.hdr = HEADER_TYPE_IPv6 ;
++ p_Scheme->keyExtractAndHashParams.extractArray[0].extractByHdr.extractByHdrType.fullField.ipv6 = NET_HEADER_FIELD_IPv6_DST_IP;
++ p_Scheme->keyExtractAndHashParams.extractArray[1].type = e_FM_PCD_EXTRACT_BY_HDR;
++ p_Scheme->keyExtractAndHashParams.extractArray[1].extractByHdr.type = e_FM_PCD_EXTRACT_FULL_FIELD;
++ p_Scheme->keyExtractAndHashParams.extractArray[1].extractByHdr.hdr = HEADER_TYPE_IPv6;
++ p_Scheme->keyExtractAndHashParams.extractArray[1].extractByHdr.extractByHdrType.fullField.ipv6 = NET_HEADER_FIELD_IPv6_SRC_IP;
++ p_Scheme->keyExtractAndHashParams.extractArray[2].type = e_FM_PCD_EXTRACT_BY_HDR;
++ p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.hdr = HEADER_TYPE_USER_DEFINED_SHIM2;
++ p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.type = e_FM_PCD_EXTRACT_FROM_HDR;
++ p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.extractByHdrType.fromHdr.size = 4;
++ p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.extractByHdrType.fromHdr.offset = 4;
++ p_Scheme->keyExtractAndHashParams.extractArray[2].extractByHdr.ignoreProtocolValidation = TRUE;
++ }
++
++ p_Scheme->keyExtractAndHashParams.privateDflt0 = 0x01020304;
++ p_Scheme->keyExtractAndHashParams.privateDflt1 = 0x11121314;
++ p_Scheme->keyExtractAndHashParams.numOfUsedDflts = FM_PCD_KG_NUM_OF_DEFAULT_GROUPS;
++ for (j=0; jkeyExtractAndHashParams.dflts[j].type = (e_FmPcdKgKnownFieldsDfltTypes)j; /* all types */
++ p_Scheme->keyExtractAndHashParams.dflts[j].dfltSelect = e_FM_PCD_KG_DFLT_GBL_0;
++ }
++}
++
++static t_Error IpReassemblyStats(t_FmPcdManip *p_Manip, t_FmPcdManipReassemIpStats *p_Stats)
++{
++ ASSERT_COND(p_Manip);
++ ASSERT_COND(p_Stats);
++ ASSERT_COND(p_Manip->ipReassmParams.p_IpReassCommonTbl);
++
++ p_Stats->timeout = GET_UINT32(p_Manip->ipReassmParams.p_IpReassCommonTbl->totalTimeOutCounter);
++ p_Stats->rfdPoolBusy = GET_UINT32(p_Manip->ipReassmParams.p_IpReassCommonTbl->totalRfdPoolBusyCounter);
++ p_Stats->internalBufferBusy = GET_UINT32(p_Manip->ipReassmParams.p_IpReassCommonTbl->totalInternalBufferBusy);
++ p_Stats->externalBufferBusy = GET_UINT32(p_Manip->ipReassmParams.p_IpReassCommonTbl->totalExternalBufferBusy);
++ p_Stats->sgFragments = GET_UINT32(p_Manip->ipReassmParams.p_IpReassCommonTbl->totalSgFragmentCounter);
++ p_Stats->dmaSemaphoreDepletion = GET_UINT32(p_Manip->ipReassmParams.p_IpReassCommonTbl->totalDmaSemaphoreDepletionCounter);
++
++ if (p_Manip->ipReassmParams.p_Ipv4ReassTbl)
++ {
++ p_Stats->specificHdrStatistics[0].successfullyReassembled = GET_UINT32(p_Manip->ipReassmParams.p_Ipv4ReassTbl->totalSuccessfullyReasmFramesCounter);
++ p_Stats->specificHdrStatistics[0].validFragments = GET_UINT32(p_Manip->ipReassmParams.p_Ipv4ReassTbl->totalValidFragmentCounter);
++ p_Stats->specificHdrStatistics[0].processedFragments = GET_UINT32(p_Manip->ipReassmParams.p_Ipv4ReassTbl->totalProcessedFragCounter);
++ p_Stats->specificHdrStatistics[0].malformedFragments = GET_UINT32(p_Manip->ipReassmParams.p_Ipv4ReassTbl->totalMalformdFragCounter);
++ p_Stats->specificHdrStatistics[0].autoLearnBusy = GET_UINT32(p_Manip->ipReassmParams.p_Ipv4ReassTbl->totalSetBusyCounter);
++ p_Stats->specificHdrStatistics[0].discardedFragments = GET_UINT32(p_Manip->ipReassmParams.p_Ipv4ReassTbl->totalDiscardedFragsCounter);
++ p_Stats->specificHdrStatistics[0].moreThan16Fragments = GET_UINT32(p_Manip->ipReassmParams.p_Ipv4ReassTbl->totalMoreThan16FramesCounter);
++ }
++ if (p_Manip->ipReassmParams.p_Ipv6ReassTbl)
++ {
++ p_Stats->specificHdrStatistics[1].successfullyReassembled = GET_UINT32(p_Manip->ipReassmParams.p_Ipv6ReassTbl->totalSuccessfullyReasmFramesCounter);
++ p_Stats->specificHdrStatistics[1].validFragments = GET_UINT32(p_Manip->ipReassmParams.p_Ipv6ReassTbl->totalValidFragmentCounter);
++ p_Stats->specificHdrStatistics[1].processedFragments = GET_UINT32(p_Manip->ipReassmParams.p_Ipv6ReassTbl->totalProcessedFragCounter);
++ p_Stats->specificHdrStatistics[1].malformedFragments = GET_UINT32(p_Manip->ipReassmParams.p_Ipv6ReassTbl->totalMalformdFragCounter);
++ p_Stats->specificHdrStatistics[1].autoLearnBusy = GET_UINT32(p_Manip->ipReassmParams.p_Ipv6ReassTbl->totalSetBusyCounter);
++ p_Stats->specificHdrStatistics[1].discardedFragments = GET_UINT32(p_Manip->ipReassmParams.p_Ipv6ReassTbl->totalDiscardedFragsCounter);
++ p_Stats->specificHdrStatistics[1].moreThan16Fragments = GET_UINT32(p_Manip->ipReassmParams.p_Ipv6ReassTbl->totalMoreThan16FramesCounter);
++ }
++ return E_OK;
++}
++
++#ifdef FM_CAPWAP_SUPPORT
++static t_Error IndxStats(t_FmPcdStatsParams *p_StatsParams,t_FmPcdManip *p_Manip,t_FmPcd *p_FmPcd)
++{
++ t_AdOfTypeContLookup *p_Ad;
++ uint32_t tmpReg32 = 0;
++
++ SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad,E_INVALID_HANDLE);
++
++ UNUSED(p_FmPcd);
++
++ p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
++
++ tmpReg32 = 0;
++ tmpReg32 |= (uint32_t)HMAN_OC_CAPWAP_INDEXED_STATS;
++ if (p_StatsParams->type == e_FM_PCD_STATS_PER_FLOWID)
++ tmpReg32 |= (uint32_t)0x16 << 16;
++ WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);
++
++ tmpReg32 = 0;
++ tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;
++ WRITE_UINT32(p_Ad->ccAdBase, tmpReg32);
++
++ return E_OK;
++}
++
++static t_Error InsrtHdrByTempl(t_FmPcdManipHdrInsrtParams *p_ManipParams, t_FmPcdManip *p_Manip, t_FmPcd *p_FmPcd)
++{
++ t_FmPcdManipHdrInsrtByTemplateParams *p_InsrtByTemplate = &p_ManipParams->u.byTemplate;
++ uint8_t tmpReg8 = 0xff;
++ t_AdOfTypeContLookup *p_Ad;
++ bool ipModify = FALSE;
++ uint32_t tmpReg32 = 0, tmpRegNia = 0;
++ uint16_t tmpReg16 = 0;
++ t_Error err = E_OK;
++ uint8_t extraAddedBytes = 0, blockSize = 0, extraAddedBytesAlignedToBlockSize = 0, log2Num = 0;
++ uint8_t *p_Template = NULL;
++
++ SANITY_CHECK_RETURN_ERROR(p_ManipParams,E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_Manip,E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad,E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd,E_NULL_POINTER);
++
++ p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
++ if (p_Manip->insrt)
++ {
++ if ((!p_InsrtByTemplate->size && p_InsrtByTemplate->modifyOuterIp) ||
++ (!p_InsrtByTemplate->size && p_InsrtByTemplate->modifyOuterVlan))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Inconsistent parameters : asking for header template modifications with no template for insertion (template size)"));
++
++ if (p_InsrtByTemplate->size && p_InsrtByTemplate->modifyOuterIp && (p_InsrtByTemplate->size <= p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Inconsistent parameters : size of template < ipOuterOffset"));
++
++ if (p_InsrtByTemplate->size > 128)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Size of header template for insertion can not be more than 128"));
++
++ if (p_InsrtByTemplate->size)
++ {
++ p_Manip->p_Template = (uint8_t *)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
++ p_InsrtByTemplate->size,
++ FM_PCD_CC_AD_TABLE_ALIGN);
++ if(!p_Manip->p_Template)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Memory allocation in MURAM FAILED"));
++
++ tmpReg32 = (uint32_t)(XX_VirtToPhys(p_Manip->p_Template) - (p_FmPcd->physicalMuramBase));
++ tmpReg32 |= (uint32_t)p_InsrtByTemplate->size << 24;
++ *(uint32_t *)&p_Ad->matchTblPtr = tmpReg32;
++ }
++
++ tmpReg32 = 0;
++
++ p_Template = (uint8_t *)XX_Malloc(p_InsrtByTemplate->size * sizeof(uint8_t));
++
++ if (!p_Template)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("XX_Malloc allocation FAILED"));
++
++ memcpy(p_Template, p_InsrtByTemplate->hdrTemplate, p_InsrtByTemplate->size * sizeof(uint8_t));
++
++
++ if (p_InsrtByTemplate->modifyOuterIp)
++ {
++ ipModify = TRUE;
++
++ tmpReg8 = (uint8_t)p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset];
++
++ if((tmpReg8 & 0xf0) == 0x40)
++ tmpReg8 = 4;
++ else if((tmpReg8 & 0xf0) == 0x60)
++ tmpReg8 = 6;
++ else
++ tmpReg8 = 0xff;
++
++ if (tmpReg8 != 0xff)
++ {
++ if(p_InsrtByTemplate->modifyOuterIpParams.dscpEcn & 0xff00)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Inconsistent parameters : IPV4 present in header template, dscpEcn has to be only 1 byte"));
++ if(p_InsrtByTemplate->modifyOuterIpParams.recalculateLength)
++ {
++
++ if((p_InsrtByTemplate->modifyOuterIpParams.recalculateLengthParams.extraBytesAddedAlignedToBlockSize + p_InsrtByTemplate->modifyOuterIpParams.recalculateLengthParams.extraBytesAddedNotAlignedToBlockSize) > 255)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("extra Byte added can not be more than 256 bytes"));
++ extraAddedBytes = (uint8_t) (p_InsrtByTemplate->modifyOuterIpParams.recalculateLengthParams.extraBytesAddedAlignedToBlockSize + p_InsrtByTemplate->modifyOuterIpParams.recalculateLengthParams.extraBytesAddedNotAlignedToBlockSize);
++ blockSize = p_InsrtByTemplate->modifyOuterIpParams.recalculateLengthParams.blockSize;
++ extraAddedBytesAlignedToBlockSize = p_InsrtByTemplate->modifyOuterIpParams.recalculateLengthParams.extraBytesAddedAlignedToBlockSize;
++ /*IP header template - IP totalLength -
++ (1 byte) extraByteForIp = headerTemplateSize - ipOffset + insertedBytesAfterThisStage ,
++ in the case of SEC insertedBytesAfterThisStage - SEC trailer (21/31) + header(13)
++ second byte - extraByteForIp = headerTemplate - ipOffset + insertedBytesAfterThisStage*/
++ }
++ if (blockSize)
++ {
++ if (!POWER_OF_2(blockSize))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("inputFrmPaddingUpToBlockSize has to be power of 2"));
++ }
++
++ }
++ if (tmpReg8 == 4)
++ {
++ if ((IPv4_HDRCHECKSUM_FIELD_OFFSET_FROM_IP + p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset) > p_InsrtByTemplate->size)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Inconsistent parameters : IP present in header template, user asked for IP modifications but ipOffset + ipTotalLengthFieldOffset in header template bigger than template size"));
++
++
++ p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv4_DSCECN_FIELD_OFFSET_FROM_IP] = (uint8_t)p_InsrtByTemplate->modifyOuterIpParams.dscpEcn;
++
++ if (blockSize)
++ blockSize -= 1;
++
++ if ((p_InsrtByTemplate->size - p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + extraAddedBytes) > 255)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("p_InsrtByTemplate->size - p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + extraAddedBytes has to be less than 255"));
++
++ p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv4_TOTALLENGTH_FIELD_OFFSET_FROM_IP + 1] = blockSize;// IPV6 - in AD instead of SEQ IND
++ p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv4_TOTALLENGTH_FIELD_OFFSET_FROM_IP] = (uint8_t)(p_InsrtByTemplate->size - p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + extraAddedBytes);// for IPV6 decrement additional 40 bytes of IPV6 heade size
++
++ p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv4_ID_FIELD_OFFSET_FROM_IP] = 0x00;
++ p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv4_ID_FIELD_OFFSET_FROM_IP + 1] = extraAddedBytesAlignedToBlockSize;
++
++
++
++ /*IP header template - relevant only for ipv4 CheckSum = 0*/
++ p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv4_HDRCHECKSUM_FIELD_OFFSET_FROM_IP] = 0x00;
++ p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv4_HDRCHECKSUM_FIELD_OFFSET_FROM_IP + 1] = 0x00;
++
++
++ /*UDP checksum has to be 0*/
++ if (p_InsrtByTemplate->modifyOuterIpParams.udpPresent)
++ {
++ if ((p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_CHECKSUM_FIELD_OFFSET_FROM_UDP + UDP_CHECKSUM_FIELD_SIZE) > p_InsrtByTemplate->size)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Inconsistent parameters : UDP present according to user but (UDP offset + UDP header size) < size of header template"));
++
++ p_Template[p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_CHECKSUM_FIELD_OFFSET_FROM_UDP ] = 0x00;
++ p_Template[p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_CHECKSUM_FIELD_OFFSET_FROM_UDP + 1] = 0x00;
++
++ }
++
++ if (p_InsrtByTemplate->modifyOuterIpParams.ipIdentGenId > 7)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("ipIdentGenId has to be one out of 8 sequence number generators (0 - 7) for IP identification field"));
++
++ tmpRegNia |= (uint32_t)p_InsrtByTemplate->modifyOuterIpParams.ipIdentGenId<<24;
++ }
++ else if (tmpReg8 == 6)
++ {
++ /*TODO - add check for maximum value of blockSize;*/
++ if (blockSize)
++ LOG2(blockSize, log2Num);
++ tmpRegNia |= (uint32_t)log2Num << 24;
++
++ // for IPV6 decrement additional 40 bytes of IPV6 heade size - because IPV6 header size is not included in payloadLength
++ p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv6_PAYLOAD_LENGTH_OFFSET_FROM_IP] = (uint8_t)(p_InsrtByTemplate->size - p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + extraAddedBytes - 40);
++ p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv6_PAYLOAD_LENGTH_OFFSET_FROM_IP + 1] = extraAddedBytesAlignedToBlockSize;
++ if (p_InsrtByTemplate->modifyOuterIpParams.udpPresent)
++ {
++ if ((p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_CHECKSUM_FIELD_OFFSET_FROM_UDP + UDP_CHECKSUM_FIELD_SIZE) > p_InsrtByTemplate->size)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Inconsistent parameters : UDP present according to user but (UDP offset + UDP header size) < size of header template"));
++ if (p_Template[p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset + IPv6_NEXT_HEADER_OFFSET_FROM_IP] != 0x88)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("OUr suppport is only IPv6/UDPLite"));
++ p_Template[p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_LENGTH_FIELD_OFFSET_FROM_UDP] = 0x00;
++ p_Template[p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_LENGTH_FIELD_OFFSET_FROM_UDP + 1] = 0x08;
++ p_Template[p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_CHECKSUM_FIELD_OFFSET_FROM_UDP] = 0x00;
++ p_Template[p_InsrtByTemplate->modifyOuterIpParams.udpOffset + UDP_CHECKSUM_FIELD_OFFSET_FROM_UDP + 1] = 0x00;
++ }
++ }
++ else
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("IP version supported only IPV4"));
++ }
++
++ tmpReg32 = tmpReg16 = tmpReg8 = 0;
++ /*TODO - check it*/
++ if (p_InsrtByTemplate->modifyOuterVlan)
++ {
++ if (p_InsrtByTemplate->modifyOuterVlanParams.vpri & ~0x07)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE,("Inconsistent parameters : user asked for VLAN modifications but VPRI more than 3 bits"));
++
++ memcpy(&tmpReg16, &p_Template[VLAN_TAG_FIELD_OFFSET_FROM_ETH], 2*(sizeof(uint8_t)));
++ if ((tmpReg16 != 0x9100) && (tmpReg16!= 0x9200) && (tmpReg16 != 0x8100))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE,("Inconsistent parameters : user asked for VLAN modifications but Tag Protocol identifier is not VLAN "));
++
++ memcpy(&tmpReg8, &p_Template[14],1*(sizeof(uint8_t)));
++ tmpReg8 &= 0x1f;
++ tmpReg8 |= (uint8_t)(p_InsrtByTemplate->modifyOuterVlanParams.vpri << 5);
++
++ p_Template[14] = tmpReg8;
++ }
++
++ Mem2IOCpy32(p_Manip->p_Template, p_Template, p_InsrtByTemplate->size);
++
++ XX_Free(p_Template);
++ }
++
++ tmpReg32 = 0;
++ if (p_Manip->h_Frag)
++ {
++ tmpRegNia |= (uint32_t)(XX_VirtToPhys(p_Manip->h_Frag) - (p_FmPcd->physicalMuramBase));
++ tmpReg32 |= (uint32_t)p_Manip->sizeForFragmentation << 16;
++ }
++ else
++ tmpReg32 = 0xffff0000;
++
++ if (ipModify)
++ tmpReg32 |= (uint32_t)p_InsrtByTemplate->modifyOuterIpParams.ipOuterOffset << 8;
++ else
++ tmpReg32 |= (uint32_t)0x0000ff00;
++
++ tmpReg32 |= (uint32_t)HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER;
++ *(uint32_t *)&p_Ad->pcAndOffsets = tmpReg32;
++
++ tmpRegNia |= FM_PCD_AD_CONT_LOOKUP_TYPE;
++ *(uint32_t *)&p_Ad->ccAdBase = tmpRegNia;
++
++ return err;
++}
++#endif /* FM_CAPWAP_SUPPORT */
++
++static t_Error IpFragmentationStats(t_FmPcdManip *p_Manip, t_FmPcdManipFragIpStats *p_Stats)
++{
++ t_AdOfTypeContLookup *p_Ad;
++
++ ASSERT_COND(p_Manip);
++ ASSERT_COND(p_Stats);
++ ASSERT_COND(p_Manip->h_Ad);
++ ASSERT_COND(p_Manip->ipFragParams.p_Frag);
++
++ p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
++
++ p_Stats->totalFrames = GET_UINT32(p_Ad->gmask);
++ p_Stats->fragmentedFrames = GET_UINT32(p_Manip->ipFragParams.p_Frag->ccAdBase) & 0x00ffffff;
++ p_Stats->generatedFragments = GET_UINT32(p_Manip->ipFragParams.p_Frag->matchTblPtr);
++
++ return E_OK;
++}
++
++static t_Error IpFragmentation(t_FmPcdManipFragIpParams *p_ManipParams, t_FmPcdManip *p_Manip)
++{
++ uint32_t pcAndOffsetsReg = 0, ccAdBaseReg = 0, gmaskReg = 0;
++ t_FmPcd *p_FmPcd;
++#if (DPAA_VERSION == 10)
++ t_Error err = E_OK;
++#endif /* (DPAA_VERSION == 10) */
++
++ SANITY_CHECK_RETURN_ERROR(p_Manip->h_Ad,E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_ManipParams->sizeForFragmentation != 0xFFFF, E_INVALID_VALUE);
++
++ p_FmPcd = p_Manip->h_FmPcd;
++ /* Allocation of fragmentation Action Descriptor */
++ p_Manip->ipFragParams.p_Frag = (t_AdOfTypeContLookup *)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
++ FM_PCD_CC_AD_ENTRY_SIZE,
++ FM_PCD_CC_AD_TABLE_ALIGN);
++ if (!p_Manip->ipFragParams.p_Frag)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for Fragmentation table descriptor"));
++ IOMemSet32( p_Manip->ipFragParams.p_Frag, 0, FM_PCD_CC_AD_ENTRY_SIZE);
++
++ /* Prepare the third Ad register (pcAndOffsets)- OperationCode */
++ pcAndOffsetsReg = (uint32_t)HMAN_OC_IP_FRAGMENTATION;
++
++ /* Prepare the first Ad register (ccAdBase) - Don't frag action and Action descriptor type*/
++ ccAdBaseReg = FM_PCD_AD_CONT_LOOKUP_TYPE;
++ ccAdBaseReg |= (p_ManipParams->dontFragAction << FM_PCD_MANIP_IP_FRAG_DF_SHIFT);
++
++
++ /* Set Scatter/Gather BPid */
++ if (p_ManipParams->sgBpidEn)
++ {
++ ccAdBaseReg |= FM_PCD_MANIP_IP_FRAG_SG_BDID_EN;
++ pcAndOffsetsReg |= ((p_ManipParams->sgBpid << FM_PCD_MANIP_IP_FRAG_SG_BDID_SHIFT) & FM_PCD_MANIP_IP_FRAG_SG_BDID_MASK);
++ }
++
++ /* Prepare the first Ad register (gmask) - scratch buffer pool id and Pointer to fragment ID */
++ gmaskReg = (uint32_t)(XX_VirtToPhys(UINT_TO_PTR(p_FmPcd->ipv6FrameIdAddr)) - p_FmPcd->physicalMuramBase);
++#if (DPAA_VERSION == 10)
++ gmaskReg |= p_ManipParams->scratchBpid << FM_PCD_MANIP_IP_FRAG_SCRATCH_BPID;
++#else
++ gmaskReg |= (0xFF) << FM_PCD_MANIP_IP_FRAG_SCRATCH_BPID;
++#endif /* (DPAA_VERSION == 10) */
++
++ /* Set all Ad registers */
++ WRITE_UINT32(p_Manip->ipFragParams.p_Frag->pcAndOffsets, pcAndOffsetsReg);
++ WRITE_UINT32(p_Manip->ipFragParams.p_Frag->ccAdBase, ccAdBaseReg);
++ WRITE_UINT32(p_Manip->ipFragParams.p_Frag->gmask, gmaskReg);
++
++ /* Saves user's fragmentation manipulation parameters */
++ p_Manip->frag = TRUE;
++ p_Manip->sizeForFragmentation = p_ManipParams->sizeForFragmentation;
++
++#if (DPAA_VERSION == 10)
++ p_Manip->ipFragParams.scratchBpid = p_ManipParams->scratchBpid;
++
++ /* scratch buffer pool initialization */
++ if ((err = FmPcdFragHcScratchPoolFill((t_Handle)p_FmPcd, p_ManipParams->scratchBpid)) != E_OK)
++ {
++ FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, p_Manip->ipFragParams.p_Frag);
++ p_Manip->ipFragParams.p_Frag = NULL;
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++#endif /* (DPAA_VERSION == 10) */
++
++ return E_OK;
++}
++
++static t_Error IPManip(t_FmPcdManip *p_Manip)
++{
++ t_Error err = E_OK;
++ t_FmPcd *p_FmPcd;
++ t_AdOfTypeContLookup *p_Ad;
++ uint32_t tmpReg32 = 0, tmpRegNia = 0;
++
++ SANITY_CHECK_RETURN_ERROR(p_Manip,E_INVALID_HANDLE);
++ p_FmPcd = p_Manip->h_FmPcd;
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd,E_INVALID_HANDLE);
++
++ p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
++
++ tmpReg32 = FM_PCD_MANIP_IP_NO_FRAGMENTATION;
++ if (p_Manip->frag == TRUE)
++ {
++ tmpRegNia = (uint32_t)(XX_VirtToPhys(p_Manip->ipFragParams.p_Frag) - (p_FmPcd->physicalMuramBase));
++ tmpReg32 = (uint32_t)p_Manip->sizeForFragmentation << FM_PCD_MANIP_IP_MTU_SHIFT;
++ }
++
++ tmpRegNia |= FM_PCD_AD_CONT_LOOKUP_TYPE;
++ tmpReg32 |= HMAN_OC_IP_MANIP;
++
++#if (DPAA_VERSION >= 11)
++ tmpRegNia |= FM_PCD_MANIP_IP_CNIA;
++#endif /* (DPAA_VERSION >= 11) */
++
++ WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);
++ WRITE_UINT32(p_Ad->ccAdBase, tmpRegNia);
++ WRITE_UINT32(p_Ad->gmask, 0); /* Total frame counter - MUST be initialized to zero.*/
++
++ return err;
++}
++
++static t_Error IPSecManip(t_FmPcdManipParams *p_ManipParams,
++ t_FmPcdManip *p_Manip)
++{
++ t_AdOfTypeContLookup *p_Ad;
++ t_FmPcdManipSpecialOffloadIPSecParams *p_IPSecParams;
++ t_Error err = E_OK;
++ uint32_t tmpReg32 = 0;
++
++ SANITY_CHECK_RETURN_ERROR(p_Manip,E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_ManipParams,E_INVALID_HANDLE);
++
++ p_IPSecParams = &p_ManipParams->u.specialOffload.u.ipsec;
++
++ SANITY_CHECK_RETURN_ERROR(!p_IPSecParams->variableIpHdrLen ||
++ p_IPSecParams->decryption, E_INVALID_VALUE);
++ SANITY_CHECK_RETURN_ERROR(!p_IPSecParams->variableIpVersion ||
++ !p_IPSecParams->decryption, E_INVALID_VALUE);
++ SANITY_CHECK_RETURN_ERROR(!p_IPSecParams->variableIpVersion ||
++ p_IPSecParams->outerIPHdrLen, E_INVALID_VALUE);
++
++ p_Ad = (t_AdOfTypeContLookup *)p_Manip->h_Ad;
++
++ tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;
++ tmpReg32 |= (p_IPSecParams->decryption)?FM_PCD_MANIP_IPSEC_DEC:0;
++ tmpReg32 |= (p_IPSecParams->ecnCopy)?FM_PCD_MANIP_IPSEC_ECN_EN:0;
++ tmpReg32 |= (p_IPSecParams->dscpCopy)?FM_PCD_MANIP_IPSEC_DSCP_EN:0;
++ tmpReg32 |= (p_IPSecParams->variableIpHdrLen)?FM_PCD_MANIP_IPSEC_VIPL_EN:0;
++ tmpReg32 |= (p_IPSecParams->variableIpVersion)?FM_PCD_MANIP_IPSEC_VIPV_EN:0;
++ WRITE_UINT32(p_Ad->ccAdBase, tmpReg32);
++
++ tmpReg32 = HMAN_OC_IPSEC_MANIP;
++ tmpReg32 |= p_IPSecParams->outerIPHdrLen << FM_PCD_MANIP_IPSEC_IP_HDR_LEN_SHIFT;
++ if (p_ManipParams->h_NextManip)
++ {
++ WRITE_UINT32(p_Ad->matchTblPtr,
++ (uint32_t)(XX_VirtToPhys(((t_FmPcdManip *)p_ManipParams->h_NextManip)->h_Ad)-
++ (((t_FmPcd *)p_Manip->h_FmPcd)->physicalMuramBase)) >> 4);
++
++ tmpReg32 |= FM_PCD_MANIP_IPSEC_NADEN;
++ }
++ WRITE_UINT32(p_Ad->pcAndOffsets, tmpReg32);
++
++ return err;
++}
++
++#ifdef FM_CAPWAP_SUPPORT
++static t_Error CheckStatsParamsAndSetType(t_FmPcdManip *p_Manip, t_FmPcdStatsParams *p_StatsParams)
++{
++
++ switch (p_StatsParams->type)
++ {
++ case (e_FM_PCD_STATS_PER_FLOWID):
++ p_Manip->opcode = HMAN_OC_CAPWAP_INDEXED_STATS;
++ p_Manip->muramAllocate = TRUE;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Unsupported statistics type"));
++ }
++
++ return E_OK;
++}
++#endif /* FM_CAPWAP_SUPPORT */
++
++static t_Handle ManipOrStatsSetNode(t_Handle h_FmPcd, t_Handle *p_Params, bool stats)
++{
++ t_FmPcdManip *p_Manip;
++ t_Error err;
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++
++ p_Manip = (t_FmPcdManip*)XX_Malloc(sizeof(t_FmPcdManip));
++ if (!p_Manip)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("No memory"));
++ return NULL;
++ }
++ memset(p_Manip, 0, sizeof(t_FmPcdManip));
++
++ p_Manip->type = ((t_FmPcdManipParams *)p_Params)->type;
++ memcpy((uint8_t*)&p_Manip->manipParams, p_Params, sizeof(p_Manip->manipParams));
++
++ if (!stats)
++ err = CheckManipParamsAndSetType(p_Manip, (t_FmPcdManipParams *)p_Params);
++#ifdef FM_CAPWAP_SUPPORT
++ else
++ err = CheckStatsParamsAndSetType(p_Manip, (t_FmPcdStatsParams *)p_Params);
++#else
++ else
++ {
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Statistics node!"));
++ return NULL;
++ }
++#endif /* FM_CAPWAP_SUPPORT */
++ if (err)
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("INVALID HEADER MANIPULATION TYPE"));
++ ReleaseManipHandler(p_Manip, p_FmPcd);
++ XX_Free(p_Manip);
++ return NULL;
++ }
++
++ if (p_Manip->opcode != HMAN_OC_IP_REASSEMBLY)
++ {
++ /* In Case of IP reassembly manipulation the IPv4/IPv6 reassembly action descriptor will
++ be defines later on */
++ if (p_Manip->muramAllocate)
++ {
++ p_Manip->h_Ad = (t_Handle)FM_MURAM_AllocMem(p_FmPcd->h_FmMuram,
++ FM_PCD_CC_AD_ENTRY_SIZE,
++ FM_PCD_CC_AD_TABLE_ALIGN);
++ if (!p_Manip->h_Ad)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for Manipulation action descriptor"));
++ ReleaseManipHandler(p_Manip, p_FmPcd);
++ XX_Free(p_Manip);
++ return NULL;
++ }
++
++ IOMemSet32(p_Manip->h_Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE);
++ }
++ else
++ {
++ p_Manip->h_Ad = (t_Handle)XX_Malloc(FM_PCD_CC_AD_ENTRY_SIZE * sizeof(uint8_t));
++ if (!p_Manip->h_Ad)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("Allocation of Manipulation action descriptor"));
++ ReleaseManipHandler(p_Manip, p_FmPcd);
++ XX_Free(p_Manip);
++ return NULL;
++ }
++
++ memset(p_Manip->h_Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE * sizeof(uint8_t));
++ }
++ }
++
++ p_Manip->h_FmPcd = h_FmPcd;
++
++ return p_Manip;
++}
++
++static void UpdateAdPtrOfNodesWhichPointsOnCrntMdfManip(t_FmPcdManip *p_CrntMdfManip,
++ t_List *h_NodesLst)
++{
++ t_CcNodeInformation *p_CcNodeInformation;
++ t_FmPcdCcNode *p_NodePtrOnCurrentMdfManip = NULL;
++ t_List *p_Pos;
++ int i = 0;
++ t_Handle p_AdTablePtOnCrntCurrentMdfNode/*, p_AdTableNewModified*/;
++ t_CcNodeInformation ccNodeInfo;
++
++ LIST_FOR_EACH(p_Pos, &p_CrntMdfManip->nodesLst)
++ {
++ p_CcNodeInformation = CC_NODE_F_OBJECT(p_Pos);
++ p_NodePtrOnCurrentMdfManip = (t_FmPcdCcNode *)p_CcNodeInformation->h_CcNode;
++
++ ASSERT_COND(p_NodePtrOnCurrentMdfManip);
++
++ /* Search in the previous node which exact index points on this current modified node for getting AD */
++ for (i = 0; i < p_NodePtrOnCurrentMdfManip->numOfKeys + 1; i++)
++ {
++ if (p_NodePtrOnCurrentMdfManip->keyAndNextEngineParams[i].nextEngineParams.nextEngine == e_FM_PCD_CC)
++ {
++ if (p_NodePtrOnCurrentMdfManip->keyAndNextEngineParams[i].nextEngineParams.h_Manip == (t_Handle)p_CrntMdfManip)
++ {
++ if (p_NodePtrOnCurrentMdfManip->keyAndNextEngineParams[i].p_StatsObj)
++ p_AdTablePtOnCrntCurrentMdfNode =
++ p_NodePtrOnCurrentMdfManip->keyAndNextEngineParams[i].p_StatsObj->h_StatsAd;
++ else
++ p_AdTablePtOnCrntCurrentMdfNode =
++ PTR_MOVE(p_NodePtrOnCurrentMdfManip->h_AdTable, i*FM_PCD_CC_AD_ENTRY_SIZE);
++
++ memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
++ ccNodeInfo.h_CcNode = p_AdTablePtOnCrntCurrentMdfNode;
++ EnqueueNodeInfoToRelevantLst(h_NodesLst, &ccNodeInfo, NULL);
++ }
++ }
++ }
++
++ ASSERT_COND(i != p_NodePtrOnCurrentMdfManip->numOfKeys);
++ }
++}
++
++static void BuildHmtd(uint8_t *p_Dest, uint8_t *p_Src, uint8_t *p_Hmcd, t_FmPcd *p_FmPcd)
++{
++ t_Error err;
++
++ /* Copy the HMTD */
++ IO2IOCpy32(p_Dest, (uint8_t*)p_Src, 16);
++ /* Replace the HMCT table pointer */
++ WRITE_UINT32(((t_Hmtd *)p_Dest)->hmcdBasePtr,
++ (uint32_t)(XX_VirtToPhys(p_Hmcd) - ((t_FmPcd*)p_FmPcd)->physicalMuramBase));
++ /* Call Host Command to replace HMTD by a new HMTD */
++ err = FmHcPcdCcDoDynamicChange(p_FmPcd->h_Hc,
++ (uint32_t)(XX_VirtToPhys(p_Src) - p_FmPcd->physicalMuramBase),
++ (uint32_t)(XX_VirtToPhys(p_Dest) - p_FmPcd->physicalMuramBase));
++ if (err)
++ REPORT_ERROR(MINOR, err, ("Failed in dynamic manip change, continued to the rest of the owners."));
++}
++
++/*****************************************************************************/
++/* Inter-module API routines */
++/*****************************************************************************/
++
++t_Error FmPcdManipUpdate(t_Handle h_FmPcd,
++ t_Handle h_PcdParams,
++ t_Handle h_FmPort,
++ t_Handle h_Manip,
++ t_Handle h_Ad,
++ bool validate,
++ int level,
++ t_Handle h_FmTree,
++ bool modify)
++{
++ t_Error err;
++
++ if (!modify)
++ err = FmPcdManipInitUpdate(h_FmPcd, h_PcdParams, h_FmPort, h_Manip, h_Ad, validate, level, h_FmTree);
++ else
++ err = FmPcdManipModifyUpdate(h_Manip, h_Ad, validate, level, h_FmTree);
++
++ return err;
++}
++
++uint32_t FmPcdManipGetRequiredAction (t_Handle h_Manip)
++{
++ t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;
++
++ ASSERT_COND(h_Manip);
++
++ switch (p_Manip->opcode)
++ {
++ case (HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST):
++ case (HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX):
++ return UPDATE_NIA_ENQ_WITHOUT_DMA;
++ default:
++ return 0;
++ }
++}
++
++void FmPcdManipUpdateOwner(t_Handle h_Manip, bool add)
++{
++
++ uint32_t intFlags;
++
++ intFlags = XX_LockIntrSpinlock(((t_FmPcdManip *)h_Manip)->h_Spinlock);
++ if (add)
++ ((t_FmPcdManip *)h_Manip)->owner++;
++ else
++ {
++ ASSERT_COND(((t_FmPcdManip *)h_Manip)->owner);
++ ((t_FmPcdManip *)h_Manip)->owner--;
++ }
++ XX_UnlockIntrSpinlock(((t_FmPcdManip *)h_Manip)->h_Spinlock, intFlags);
++}
++
++t_List *FmPcdManipGetNodeLstPointedOnThisManip(t_Handle h_Manip)
++{
++ ASSERT_COND(h_Manip);
++ return &((t_FmPcdManip *)h_Manip)->nodesLst;
++}
++
++t_List *FmPcdManipGetSpinlock(t_Handle h_Manip)
++{
++ ASSERT_COND(h_Manip);
++ return ((t_FmPcdManip *)h_Manip)->h_Spinlock;
++}
++
++t_Error FmPcdManipCheckParamsForCcNextEngine(t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams, uint32_t *requiredAction)
++{
++ t_FmPcdManip *p_Manip;
++ t_Error err;
++ bool pointFromCc = TRUE;
++
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcdCcNextEngineParams, E_NULL_POINTER);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcdCcNextEngineParams->h_Manip, E_NULL_POINTER);
++
++ p_Manip = (t_FmPcdManip *)(p_FmPcdCcNextEngineParams->h_Manip);
++ *requiredAction = 0;
++
++ while (p_Manip)
++ {
++ switch (p_Manip->opcode)
++ {
++ case (HMAN_OC_CAPWAP_INDEXED_STATS):
++ if (p_FmPcdCcNextEngineParams->nextEngine != e_FM_PCD_DONE)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("For this type of header manipulation has to be nextEngine e_FM_PCD_DONE"));
++ if (p_FmPcdCcNextEngineParams->params.enqueueParams.overrideFqid)
++ p_Manip->cnia = TRUE;
++ case (HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST):
++ *requiredAction = UPDATE_NIA_ENQ_WITHOUT_DMA;
++ case (HMAN_OC_RMV_N_OR_INSRT_INT_FRM_HDR):
++ p_Manip->ownerTmp++;
++ break;
++ case (HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER):
++ if ((p_FmPcdCcNextEngineParams->nextEngine != e_FM_PCD_DONE) &&
++ !p_FmPcdCcNextEngineParams->params.enqueueParams.overrideFqid)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("For this type of header manipulation has to be nextEngine e_FM_PCD_DONE with fqidForCtrlFlow FALSE"));
++ p_Manip->ownerTmp++;
++ break;
++ case (HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX):
++ if ((p_FmPcdCcNextEngineParams->nextEngine != e_FM_PCD_CC) &&
++ (FmPcdCcGetParseCode(p_FmPcdCcNextEngineParams->params.ccParams.h_CcNode) != CC_PC_GENERIC_IC_HASH_INDEXED))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("For this type of header manipulation next engine has to be CC and action = e_FM_PCD_ACTION_INDEXED_LOOKUP"));
++ err = UpdateManipIc(p_FmPcdCcNextEngineParams->h_Manip, FmPcdCcGetOffset(p_FmPcdCcNextEngineParams->params.ccParams.h_CcNode));
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ *requiredAction = UPDATE_NIA_ENQ_WITHOUT_DMA;
++ break;
++ case (HMAN_OC_IP_FRAGMENTATION):
++#if (DPAA_VERSION == 10)
++ if (!(p_FmPcdCcNextEngineParams->nextEngine == e_FM_PCD_DONE))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE,
++ ("For this type of header manipulation has to be nextEngine e_FM_PCD_DONE"));
++#else
++ if (!((p_FmPcdCcNextEngineParams->nextEngine == e_FM_PCD_DONE) ||
++ (p_FmPcdCcNextEngineParams->nextEngine == e_FM_PCD_PLCR)))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE,
++ ("For this type of header manipulation has to be nextEngine "
++ "e_FM_PCD_DONE or e_FM_PCD_PLCR"));
++#endif /* (DPAA_VERSION == 10) */
++ p_Manip->ownerTmp++;
++ break;
++ case (HMAN_OC_IP_REASSEMBLY):
++ if (p_FmPcdCcNextEngineParams->nextEngine != e_FM_PCD_DONE)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("For this type of header manipulation has to be nextEngine e_FM_PCD_DONE"));
++ p_Manip->ownerTmp++;
++ break;
++ case (HMAN_OC_IPSEC_MANIP):
++ p_Manip->ownerTmp++;
++ break;
++ case (HMAN_OC):
++ if (( p_FmPcdCcNextEngineParams->nextEngine == e_FM_PCD_CC) && MANIP_IS_CASCADE_NEXT(p_Manip))
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't have a cascaded manipulation when and Next Engine is CC"));
++ if (!MANIP_IS_FIRST(p_Manip) && pointFromCc)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("h_Manip is already used and may not be shared (no sharing of non-head manip nodes)"));
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE,("invalid type of header manipulation for this state"));
++ }
++ p_Manip = p_Manip->h_NextManip;
++ pointFromCc = FALSE;
++ }
++ return E_OK;
++}
++
++
++t_Error FmPcdManipCheckParamsWithCcNodeParams(t_Handle h_Manip, t_Handle h_FmPcdCcNode)
++{
++ t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;
++ t_Error err = E_OK;
++
++ SANITY_CHECK_RETURN_ERROR(h_Manip, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(h_FmPcdCcNode, E_INVALID_HANDLE);
++
++ switch (p_Manip->opcode)
++ {
++ case (HMAN_OC_CAPWAP_INDEXED_STATS):
++ if (p_Manip->ownerTmp != FmPcdCcGetNumOfKeys(h_FmPcdCcNode))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("The manipulation of the type statistics flowId if exist has to be pointed by all numOfKeys"));
++ break;
++ case (HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST):
++ if (p_Manip->h_Frag)
++ {
++ if (p_Manip->ownerTmp != FmPcdCcGetNumOfKeys(h_FmPcdCcNode))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("The manipulation of the type remove DTLS if exist has to be pointed by all numOfKeys"));
++ err = UpdateManipIc(h_Manip, FmPcdCcGetOffset(h_FmPcdCcNode));
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++ break;
++ default:
++ break;
++ }
++
++ return err;
++}
++
++void FmPcdManipUpdateAdResultForCc(t_Handle h_Manip,
++ t_FmPcdCcNextEngineParams *p_CcNextEngineParams,
++ t_Handle p_Ad,
++ t_Handle *p_AdNewPtr)
++{
++ t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;
++
++
++ /* This routine creates a Manip AD and can return in "p_AdNewPtr"
++ * either the new descriptor or NULL if it writes the Manip AD into p_AD (into the match table) */
++
++ ASSERT_COND(p_Manip);
++ ASSERT_COND(p_CcNextEngineParams);
++ ASSERT_COND(p_Ad);
++ ASSERT_COND(p_AdNewPtr);
++
++ FmPcdManipUpdateOwner(h_Manip, TRUE);
++
++ /* According to "type", either build & initialize a new AD (p_AdNew) or initialize
++ * p_Ad ( the AD in the match table) and set p_AdNew = NULL. */
++ switch (p_Manip->opcode)
++ {
++ case (HMAN_OC_RMV_N_OR_INSRT_INT_FRM_HDR):
++ case (HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST):
++ case (HMAN_OC_CAPWAP_INDEXED_STATS):
++ *p_AdNewPtr = p_Manip->h_Ad;
++ break;
++ case (HMAN_OC_IPSEC_MANIP):
++ *p_AdNewPtr = p_Manip->h_Ad;
++ break;
++ case (HMAN_OC_IP_FRAGMENTATION):
++ if ((p_CcNextEngineParams->nextEngine == e_FM_PCD_DONE) &&
++ (!p_CcNextEngineParams->params.enqueueParams.overrideFqid))
++ {
++ memcpy((uint8_t *)p_Ad, (uint8_t *)p_Manip->h_Ad, sizeof(t_AdOfTypeContLookup));
++#if (DPAA_VERSION >= 11)
++ WRITE_UINT32(((t_AdOfTypeContLookup *)p_Ad)->ccAdBase,
++ GET_UINT32(((t_AdOfTypeContLookup *)p_Ad)->ccAdBase) & ~FM_PCD_MANIP_IP_CNIA);
++#endif /* (DPAA_VERSION >= 11) */
++ *p_AdNewPtr = NULL;
++ }
++ else
++ *p_AdNewPtr = p_Manip->h_Ad;
++ break;
++ case (HMAN_OC_IP_REASSEMBLY):
++ if (FmPcdManipIpReassmIsIpv6Hdr(p_Manip))
++ {
++ if (!p_Manip->ipReassmParams.ipv6Assigned)
++ {
++ *p_AdNewPtr = p_Manip->ipReassmParams.h_Ipv6Ad;
++ p_Manip->ipReassmParams.ipv6Assigned = TRUE;
++ FmPcdManipUpdateOwner(h_Manip, FALSE);
++ }
++ else
++ {
++ *p_AdNewPtr = p_Manip->ipReassmParams.h_Ipv4Ad;
++ p_Manip->ipReassmParams.ipv6Assigned = FALSE;
++ }
++ }
++ else
++ *p_AdNewPtr = p_Manip->ipReassmParams.h_Ipv4Ad;
++ memcpy((uint8_t *)p_Ad, (uint8_t *)*p_AdNewPtr, sizeof(t_AdOfTypeContLookup));
++ *p_AdNewPtr = NULL;
++ break;
++ case (HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER):
++ case (HMAN_OC_CAPWAP_FRAGMENTATION):
++ WRITE_UINT32(((t_AdOfTypeResult *)p_Ad)->fqid, ((t_AdOfTypeResult *)(p_Manip->h_Ad))->fqid);
++ WRITE_UINT32(((t_AdOfTypeResult *)p_Ad)->plcrProfile, ((t_AdOfTypeResult *)(p_Manip->h_Ad))->plcrProfile);
++ WRITE_UINT32(((t_AdOfTypeResult *)p_Ad)->nia, ((t_AdOfTypeResult *)(p_Manip->h_Ad))->nia);
++ *p_AdNewPtr = NULL;
++ break;
++ case (HMAN_OC):
++ /* Allocate and initialize HMTD */
++ *p_AdNewPtr = p_Manip->h_Ad;
++ break;
++ default:
++ break;
++ }
++}
++
++void FmPcdManipUpdateAdContLookupForCc(t_Handle h_Manip, t_Handle p_Ad, t_Handle *p_AdNewPtr, uint32_t adTableOffset)
++{
++ t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;
++
++ /* This routine creates a Manip AD and can return in "p_AdNewPtr"
++ * either the new descriptor or NULL if it writes the Manip AD into p_AD (into the match table) */
++ ASSERT_COND(p_Manip);
++
++ FmPcdManipUpdateOwner(h_Manip, TRUE);
++
++ switch (p_Manip->opcode)
++ {
++ case (HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX):
++ WRITE_UINT32(((t_AdOfTypeContLookup *)p_Ad)->ccAdBase, ((t_AdOfTypeContLookup *)(p_Manip->h_Ad))->ccAdBase);
++ WRITE_UINT32(((t_AdOfTypeContLookup *)p_Ad)->matchTblPtr, ((t_AdOfTypeContLookup *)(p_Manip->h_Ad))->matchTblPtr);
++ WRITE_UINT32(((t_AdOfTypeContLookup *)p_Ad)->pcAndOffsets, ((t_AdOfTypeContLookup *)(p_Manip->h_Ad))->pcAndOffsets);
++ WRITE_UINT32(((t_AdOfTypeContLookup *)p_Ad)->gmask, ((t_AdOfTypeContLookup *)(p_Manip->h_Ad))->gmask);
++ WRITE_UINT32(((t_AdOfTypeContLookup *)p_Ad)->ccAdBase, (GET_UINT32(((t_AdOfTypeContLookup *)p_Ad)->ccAdBase) | adTableOffset));
++ *p_AdNewPtr = NULL;
++ break;
++
++ case (HMAN_OC):
++ /* Initialize HMTD within the match table*/
++ IOMemSet32(p_Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE);
++ /* copy the existing HMTD */ /* ask Alla - memcpy??? */
++ memcpy((uint8_t*)p_Ad, p_Manip->h_Ad, sizeof(t_Hmtd));
++ /* update NADEN to be "1"*/
++ WRITE_UINT16(((t_Hmtd *)p_Ad)->cfg,
++ (uint16_t)(GET_UINT16(((t_Hmtd *)p_Ad)->cfg) | HMTD_CFG_NEXT_AD_EN));
++ /* update next action descriptor */
++ WRITE_UINT16(((t_Hmtd *)p_Ad)->nextAdIdx, (uint16_t)(adTableOffset >> 4));
++ /* mark that Manip's HMTD is not used */
++ *p_AdNewPtr = NULL;
++ break;
++
++ default:
++ break;
++ }
++}
++
++t_Error FmPcdManipBuildIpReassmScheme(t_FmPcd *p_FmPcd, t_Handle h_NetEnv, t_Handle h_CcTree, t_Handle h_Manip, bool isIpv4, uint8_t groupId)
++{
++ t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;
++ t_FmPcdKgSchemeParams *p_SchemeParams = NULL;
++
++ ASSERT_COND(p_FmPcd);
++ ASSERT_COND(h_NetEnv);
++ ASSERT_COND(p_Manip);
++
++ /* scheme was already build, no need to check for IPv6 */
++ if (p_Manip->ipReassmParams.h_Ipv4Scheme)
++ return E_OK;
++
++ p_SchemeParams = XX_Malloc(sizeof(t_FmPcdKgSchemeParams));
++ if (!p_SchemeParams)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Memory allocation failed for scheme"));
++
++ /* Configures the IPv4 or IPv6 scheme*/
++ memset(p_SchemeParams, 0, sizeof(t_FmPcdKgSchemeParams));
++ p_SchemeParams->netEnvParams.h_NetEnv = h_NetEnv;
++ p_SchemeParams->id.relativeSchemeId =
++ (uint8_t)((isIpv4 == TRUE) ?
++ p_Manip->ipReassmParams.relativeSchemeId[0] :
++ p_Manip->ipReassmParams.relativeSchemeId[1]);
++ p_SchemeParams->schemeCounter.update = TRUE;
++#if (DPAA_VERSION >= 11)
++ p_SchemeParams->alwaysDirect = TRUE;
++ p_SchemeParams->bypassFqidGeneration = TRUE;
++#else
++ p_SchemeParams->keyExtractAndHashParams.hashDistributionNumOfFqids = 1;
++ p_SchemeParams->baseFqid = 0xFFFFFF; /*TODO- baseFqid*/
++#endif /* (DPAA_VERSION >= 11) */
++
++ setReassmSchemeParams(p_FmPcd, p_SchemeParams, h_CcTree, isIpv4, groupId);
++
++ /* Sets the new scheme */
++ if (isIpv4)
++ p_Manip->ipReassmParams.h_Ipv4Scheme = FM_PCD_KgSchemeSet(p_FmPcd, p_SchemeParams);
++ else
++ p_Manip->ipReassmParams.h_Ipv6Scheme = FM_PCD_KgSchemeSet(p_FmPcd, p_SchemeParams);
++
++ XX_Free(p_SchemeParams);
++
++ return E_OK;
++}
++
++t_Error FmPcdManipDeleteIpReassmSchemes(t_Handle h_Manip)
++{
++ t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;
++
++ ASSERT_COND(p_Manip);
++
++ if (p_Manip->ipReassmParams.h_Ipv4Scheme)
++ FM_PCD_KgSchemeDelete(p_Manip->ipReassmParams.h_Ipv4Scheme);
++
++ if (p_Manip->ipReassmParams.h_Ipv6Scheme)
++ FM_PCD_KgSchemeDelete(p_Manip->ipReassmParams.h_Ipv6Scheme);
++
++ return E_OK;
++}
++
++bool FmPcdManipIpReassmIsIpv6Hdr(t_Handle h_Manip)
++{
++ t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;
++
++ ASSERT_COND(p_Manip);
++
++ return (p_Manip->ipReassmParams.hdr == HEADER_TYPE_IPv6);
++}
++
++#ifdef FM_CAPWAP_SUPPORT
++t_Handle FmPcdManipApplSpecificBuild(void)
++{
++ t_FmPcdManip *p_Manip;
++
++ p_Manip = (t_FmPcdManip*)XX_Malloc(sizeof(t_FmPcdManip));
++ if (!p_Manip)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("No memory"));
++ return NULL;
++ }
++ memset(p_Manip, 0, sizeof(t_FmPcdManip));
++
++ p_Manip->opcode = HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX;
++ p_Manip->muramAllocate = FALSE;
++
++ p_Manip->h_Ad = (t_Handle)XX_Malloc(FM_PCD_CC_AD_ENTRY_SIZE * sizeof(uint8_t));
++ if (!p_Manip->h_Ad)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("Allocation of Manipulation action descriptor"));
++ XX_Free(p_Manip);
++ return NULL;
++ }
++
++ memset(p_Manip->h_Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE * sizeof(uint8_t));
++
++ /*treatFdStatusFieldsAsErrors = TRUE hardcoded - assumption its always come after CAAM*/
++ /*Application specific = type of flowId index, move internal frame header from data to IC,
++ SEC errors check*/
++ if (MvIntFrameHeaderFromFrameToBufferPrefix(p_Manip, TRUE)!= E_OK)
++ {
++ XX_Free(p_Manip->h_Ad);
++ XX_Free(p_Manip);
++ return NULL;
++ }
++ return p_Manip;
++}
++
++bool FmPcdManipIsCapwapApplSpecific(t_Handle h_Manip)
++{
++ t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip;
++ ASSERT_COND(h_Manip);
++
++ return (bool)((p_Manip->opcode == HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST) ? TRUE : FALSE);
++}
++#endif /* FM_CAPWAP_SUPPORT */
++/*********************** End of inter-module routines ************************/
++
++
++/****************************************/
++/* API Init unit functions */
++/****************************************/
++
++t_Handle FM_PCD_ManipNodeSet(t_Handle h_FmPcd, t_FmPcdManipParams *p_ManipParams)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++ t_FmPcdManip *p_Manip;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_VALUE(h_FmPcd,E_INVALID_HANDLE,NULL);
++ SANITY_CHECK_RETURN_VALUE(p_ManipParams,E_INVALID_HANDLE,NULL);
++
++ p_Manip = ManipOrStatsSetNode(h_FmPcd, (t_Handle)p_ManipParams, FALSE);
++ if (!p_Manip)
++ return NULL;
++
++ if (((p_Manip->opcode == HMAN_OC_IP_REASSEMBLY) ||
++ (p_Manip->opcode == HMAN_OC_IP_FRAGMENTATION) ||
++ (p_Manip->opcode == HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX) ||
++ (p_Manip->opcode == HMAN_OC) ||
++ (p_Manip->opcode == HMAN_OC_IPSEC_MANIP)) &&
++ (!FmPcdIsAdvancedOffloadSupported(p_FmPcd)))
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Advanced-offload must be enabled"));
++ XX_Free(p_Manip);
++ return NULL;
++ }
++ p_Manip->h_Spinlock = XX_InitSpinlock();
++ if (!p_Manip->h_Spinlock)
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("UNSUPPORTED HEADER MANIPULATION TYPE"));
++ ReleaseManipHandler(p_Manip, p_FmPcd);
++ XX_Free(p_Manip);
++ return NULL;
++ }
++ INIT_LIST(&p_Manip->nodesLst);
++
++ switch (p_Manip->opcode)
++ {
++ case (HMAN_OC_IP_REASSEMBLY):
++ /* IpReassembly */
++ err = IpReassembly(&p_ManipParams->u.reassem, p_Manip);
++ break;
++ case (HMAN_OC_IP_FRAGMENTATION):
++ /* IpFragmentation */
++ err = IpFragmentation(&p_ManipParams->u.frag.u.ipFrag ,p_Manip);
++ if (err)
++ break;
++ err = IPManip(p_Manip);
++ break;
++ case (HMAN_OC_IPSEC_MANIP) :
++ err = IPSecManip(p_ManipParams, p_Manip);
++ break;
++#ifdef FM_CAPWAP_SUPPORT
++ case (HMAN_OC_RMV_N_OR_INSRT_INT_FRM_HDR):
++ /* HmanType1 */
++ err = RmvHdrTillSpecLocNOrInsrtIntFrmHdr(&p_ManipParams->u.hdr.rmvParams, p_Manip);
++ break;
++ case (HMAN_OC_CAPWAP_FRAGMENTATION):
++ err = CapwapFragmentation(&p_ManipParams->fragOrReasmParams.u.capwapFragParams,
++ p_Manip,
++ p_FmPcd,
++ p_ManipParams->fragOrReasmParams.sgBpid);
++ if (err)
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("UNSUPPORTED HEADER MANIPULATION TYPE"));
++ ReleaseManipHandler(p_Manip, p_FmPcd);
++ XX_Free(p_Manip);
++ return NULL;
++ }
++ if (p_Manip->insrt)
++ p_Manip->opcode = HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER;
++ case (HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER):
++ /* HmanType2 + if user asked only for fragmentation still need to allocate HmanType2 */
++ err = InsrtHdrByTempl(&p_ManipParams->u.hdr.insrtParams, p_Manip, p_FmPcd);
++ break;
++ case (HMAN_OC_CAPWAP_REASSEMBLY):
++ err = CapwapReassembly(&p_ManipParams->fragOrReasmParams.u.capwapReasmParams,
++ p_Manip,
++ p_FmPcd,
++ p_ManipParams->fragOrReasmParams.sgBpid);
++ if (err)
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("UNSUPPORTED HEADER MANIPULATION TYPE"));
++ ReleaseManipHandler(p_Manip, p_FmPcd);
++ XX_Free(p_Manip);
++ return NULL;
++ }
++ if (p_Manip->rmv)
++ p_Manip->opcode = HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST;
++ case (HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST):
++ /*CAPWAP decapsulation + if user asked only for reassembly still need to allocate CAPWAP decapsulation*/
++ err = CapwapRmvDtlsHdr(p_FmPcd, p_Manip);
++ break;
++#endif /* FM_CAPWAP_SUPPORT */
++ case (HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX):
++ /*Application Specific type 1*/
++ err = MvIntFrameHeaderFromFrameToBufferPrefix(p_Manip, TRUE);
++ break;
++ case (HMAN_OC):
++ /* New Manip */
++ err = CreateManipActionNew(p_Manip, p_ManipParams);
++ break;
++ default:
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("UNSUPPORTED HEADER MANIPULATION TYPE"));
++ ReleaseManipHandler(p_Manip, p_FmPcd);
++ XX_Free(p_Manip);
++ return NULL;
++ }
++
++ if (err)
++ {
++ REPORT_ERROR(MAJOR, err, NO_MSG);
++ ReleaseManipHandler(p_Manip, p_FmPcd);
++ XX_Free(p_Manip);
++ return NULL;
++ }
++
++ if (p_ManipParams->h_NextManip)
++ {
++ /* in the check routine we've verified that h_NextManip has no owners
++ * and that only supported types are allowed. */
++ p_Manip->h_NextManip = p_ManipParams->h_NextManip;
++ /* save a "prev" pointer in h_NextManip */
++ MANIP_SET_PREV(p_Manip->h_NextManip, p_Manip);
++ FmPcdManipUpdateOwner(p_Manip->h_NextManip, TRUE);
++ }
++
++ return p_Manip;
++}
++
++t_Error FM_PCD_ManipNodeReplace(t_Handle h_Manip, t_FmPcdManipParams *p_ManipParams)
++{
++ t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_Manip, *p_FirstManip;
++ t_FmPcd *p_FmPcd = (t_FmPcd *)(p_Manip->h_FmPcd);
++ t_Error err;
++ uint8_t *p_WholeHmct = NULL, *p_ShadowHmct = NULL, *p_Hmtd = NULL;
++ t_List lstOfNodeshichPointsOnCrntMdfManip, *p_Pos;
++ t_CcNodeInformation *p_CcNodeInfo;
++ SANITY_CHECK_RETURN_ERROR(h_Manip,E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_ManipParams,E_INVALID_HANDLE);
++
++ INIT_LIST(&lstOfNodeshichPointsOnCrntMdfManip);
++
++ if ((p_ManipParams->type != e_FM_PCD_MANIP_HDR) ||
++ (p_Manip->type != e_FM_PCD_MANIP_HDR))
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
++ ("FM_PCD_ManipNodeReplace Functionality supported only for Header Manipulation."));
++
++ ASSERT_COND(p_Manip->opcode == HMAN_OC);
++ ASSERT_COND(p_Manip->manipParams.h_NextManip == p_Manip->h_NextManip);
++ memcpy((uint8_t*)&p_Manip->manipParams, p_ManipParams, sizeof(p_Manip->manipParams));
++ p_Manip->manipParams.h_NextManip = p_Manip->h_NextManip;
++
++ /* The replacement of the HdrManip depends on the node type.*/
++ /*
++ * (1) If this is an independent node, all its owners should be updated.
++ *
++ * (2) If it is the head of a cascaded chain (it does not have a "prev" but
++ * it has a "next" and it has a "cascaded-next" indication), the next
++ * node remains unchanged, and the behavior is as in (1).
++ *
++ * (3) If it is not the head, but a part of a cascaded chain, in can be
++ * also replaced as a regular node with just one owner.
++ *
++ * (4) If it is a part of a chain implemented as a unified table, the
++ * whole table is replaced and the owners of the head node must be updated.
++ *
++ */
++ /* lock shadow */
++ if (!p_FmPcd->p_CcShadow)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("CC Shadow not allocated"));
++
++ if (!TRY_LOCK(p_FmPcd->h_ShadowSpinlock, &p_FmPcd->shadowLock))
++ return ERROR_CODE(E_BUSY);
++
++ /* this routine creates a new manip action in the CC Shadow. */
++ err = CreateManipActionShadow(p_Manip, p_ManipParams);
++ if (err)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++
++ /* If the owners list is empty (these are NOT the "owners" counter, but pointers from CC)
++ * replace only HMTD and no lcok is required. Otherwise
++ * lock the whole PCD
++ * In case 4 MANIP_IS_UNIFIED_NON_FIRST(p_Manip) - Use the head node instead. */
++ if (!FmPcdLockTryLockAll(p_FmPcd))
++ {
++ DBG(TRACE, ("FmPcdLockTryLockAll failed"));
++ return ERROR_CODE(E_BUSY);
++ }
++
++ p_ShadowHmct = (uint8_t*)PTR_MOVE(p_FmPcd->p_CcShadow, 16);
++
++ p_FirstManip = (t_FmPcdManip*)GetManipInfo(p_Manip, e_MANIP_HANDLER_TABLE_OWNER);
++ ASSERT_COND(p_FirstManip);
++
++ if (!LIST_IsEmpty(&p_FirstManip->nodesLst))
++ UpdateAdPtrOfNodesWhichPointsOnCrntMdfManip(p_FirstManip, &lstOfNodeshichPointsOnCrntMdfManip);
++
++ p_Hmtd = (uint8_t *)GetManipInfo(p_Manip, e_MANIP_HMTD);
++ ASSERT_COND(p_Hmtd);
++ BuildHmtd(p_FmPcd->p_CcShadow, (uint8_t *)p_Hmtd, p_ShadowHmct, ((t_FmPcd*)(p_Manip->h_FmPcd)));
++
++ LIST_FOR_EACH(p_Pos, &lstOfNodeshichPointsOnCrntMdfManip)
++ {
++ p_CcNodeInfo = CC_NODE_F_OBJECT(p_Pos);
++ BuildHmtd(p_FmPcd->p_CcShadow, (uint8_t *)p_CcNodeInfo->h_CcNode, p_ShadowHmct, ((t_FmPcd*)(p_Manip->h_FmPcd)));
++ }
++
++ p_WholeHmct = (uint8_t *)GetManipInfo(p_Manip, e_MANIP_HMCT);
++ ASSERT_COND(p_WholeHmct);
++
++ /* re-build the HMCT n the original location */
++ err = CreateManipActionBackToOrig(p_Manip, p_ManipParams);
++ if (err)
++ {
++ RELEASE_LOCK(p_FmPcd->shadowLock);
++ RETURN_ERROR(MINOR, err, NO_MSG);
++ }
++
++ p_Hmtd = (uint8_t *)GetManipInfo(p_Manip, e_MANIP_HMTD);
++ ASSERT_COND(p_Hmtd);
++ BuildHmtd(p_FmPcd->p_CcShadow, (uint8_t *)p_Hmtd, p_WholeHmct,((t_FmPcd*)p_Manip->h_FmPcd));
++
++ /* If LIST > 0, create a list of p_Ad's that point to the HMCT. Join also t_HMTD to this list.
++ * For each p_Hmct (from list+fixed):
++ * call Host Command to replace HMTD by a new one */
++ LIST_FOR_EACH(p_Pos, &lstOfNodeshichPointsOnCrntMdfManip)
++ {
++ p_CcNodeInfo = CC_NODE_F_OBJECT(p_Pos);
++ BuildHmtd(p_FmPcd->p_CcShadow, (uint8_t *)p_CcNodeInfo->h_CcNode, p_WholeHmct, ((t_FmPcd*)(p_Manip->h_FmPcd)));
++ }
++
++
++ ReleaseLst(&lstOfNodeshichPointsOnCrntMdfManip);
++
++ FmPcdLockUnlockAll(p_FmPcd);
++
++ /* unlock shadow */
++ RELEASE_LOCK(p_FmPcd->shadowLock);
++
++ return E_OK;
++}
++
++t_Error FM_PCD_ManipNodeDelete(t_Handle h_ManipNode)
++{
++ t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_ManipNode;
++
++ SANITY_CHECK_RETURN_ERROR(p_Manip,E_INVALID_HANDLE);
++
++ if (p_Manip->owner)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("This manipulation node not be removed because this node is occupied, first - unbind this node "));
++
++ if (p_Manip->h_NextManip)
++ {
++ MANIP_SET_PREV(p_Manip->h_NextManip, NULL);
++ FmPcdManipUpdateOwner(p_Manip->h_NextManip, FALSE);
++ }
++
++ if (p_Manip->p_Hmct && MANIP_IS_UNIFIED_FIRST(p_Manip))
++ FM_MURAM_FreeMem(((t_FmPcd *)p_Manip->h_FmPcd)->h_FmMuram, p_Manip->p_Hmct);
++
++ if (p_Manip->h_Spinlock)
++ {
++ XX_FreeSpinlock(p_Manip->h_Spinlock);
++ p_Manip->h_Spinlock = NULL;
++ }
++
++ ReleaseManipHandler(p_Manip, p_Manip->h_FmPcd);
++
++ XX_Free(h_ManipNode);
++
++ return E_OK;
++}
++
++t_Error FM_PCD_ManipGetStatistics(t_Handle h_ManipNode, t_FmPcdManipStats *p_FmPcdManipStats)
++{
++ t_FmPcdManip *p_Manip = (t_FmPcdManip *)h_ManipNode;
++
++ SANITY_CHECK_RETURN_ERROR(p_Manip, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcdManipStats, E_NULL_POINTER);
++
++ switch (p_Manip->opcode)
++ {
++ case (HMAN_OC_IP_REASSEMBLY):
++ return IpReassemblyStats(p_Manip, &p_FmPcdManipStats->u.reassem.u.ipReassem);
++ case (HMAN_OC_IP_FRAGMENTATION):
++ return IpFragmentationStats(p_Manip, &p_FmPcdManipStats->u.frag.u.ipFrag);
++ default:
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("no statistics to this type of manip"));
++ }
++
++ return E_OK;
++}
++
++#ifdef FM_CAPWAP_SUPPORT
++t_Handle FM_PCD_StatisticsSetNode(t_Handle h_FmPcd, t_FmPcdStatsParams *p_StatsParams)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++ t_FmPcdManip *p_Manip;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_VALUE(h_FmPcd,E_INVALID_HANDLE,NULL);
++ SANITY_CHECK_RETURN_VALUE(p_StatsParams,E_INVALID_HANDLE,NULL);
++
++ p_Manip = ManipOrStatsSetNode(h_FmPcd, (t_Handle)p_StatsParams, TRUE);
++ if (!p_Manip)
++ return NULL;
++
++ switch (p_Manip->opcode)
++ {
++ case (HMAN_OC_CAPWAP_INDEXED_STATS):
++ /* Indexed statistics */
++ err = IndxStats(p_StatsParams, p_Manip, p_FmPcd);
++ break;
++ default:
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("UNSUPPORTED Statistics type"));
++ ReleaseManipHandler(p_Manip, p_FmPcd);
++ XX_Free(p_Manip);
++ return NULL;
++ }
++
++ if (err)
++ {
++ REPORT_ERROR(MAJOR, err, NO_MSG);
++ ReleaseManipHandler(p_Manip, p_FmPcd);
++ XX_Free(p_Manip);
++ return NULL;
++ }
++
++ return p_Manip;
++}
++#endif /* FM_CAPWAP_SUPPORT */
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_manip.h b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_manip.h
+new file mode 100644
+index 0000000..390ca6e
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_manip.h
+@@ -0,0 +1,480 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File fm_manip.h
++
++ @Description FM PCD manip...
++*//***************************************************************************/
++#ifndef __FM_MANIP_H
++#define __FM_MANIP_H
++
++#include "std_ext.h"
++#include "error_ext.h"
++#include "list_ext.h"
++
++#include "fm_cc.h"
++
++
++/***********************************************************************/
++/* Header manipulations defines */
++/***********************************************************************/
++
++#define NUM_OF_SCRATCH_POOL_BUFFERS 1000 /*TODO - Change it!!*/
++
++#define HMAN_OC_RMV_N_OR_INSRT_INT_FRM_HDR 0x2e
++#define HMAN_OC_INSRT_HDR_BY_TEMPL_N_OR_FRAG_AFTER 0x31
++#define HMAN_OC_CAPWAP_FRAGMENTATION 0x33
++#define HMAN_OC_IP_MANIP 0x34
++#define HMAN_OC_IP_FRAGMENTATION 0x74
++#define HMAN_OC_IP_REASSEMBLY 0xB4
++#define HMAN_OC_IPSEC_MANIP 0xF4
++#define HMAN_OC_MV_INT_FRAME_HDR_FROM_FRM_TO_BUFFER_PREFFIX 0x2f
++#define HMAN_OC_CAPWAP_RMV_DTLS_IF_EXIST 0x30
++#define HMAN_OC_CAPWAP_REASSEMBLY 0x11 /* dummy */
++#define HMAN_OC_CAPWAP_INDEXED_STATS 0x32 /* dummy */
++#define HMAN_OC 0x35
++
++#define HMAN_RMV_HDR 0x80000000
++#define HMAN_INSRT_INT_FRM_HDR 0x40000000
++
++#define UDP_CHECKSUM_FIELD_OFFSET_FROM_UDP 6
++#define UDP_CHECKSUM_FIELD_SIZE 2
++#define UDP_LENGTH_FIELD_OFFSET_FROM_UDP 4
++
++#define IPv4_DSCECN_FIELD_OFFSET_FROM_IP 1
++#define IPv4_TOTALLENGTH_FIELD_OFFSET_FROM_IP 2
++#define IPv4_HDRCHECKSUM_FIELD_OFFSET_FROM_IP 10
++#define VLAN_TAG_FIELD_OFFSET_FROM_ETH 12
++#define IPv4_ID_FIELD_OFFSET_FROM_IP 4
++
++#define IPv6_PAYLOAD_LENGTH_OFFSET_FROM_IP 4
++#define IPv6_NEXT_HEADER_OFFSET_FROM_IP 6
++
++#define FM_PCD_MANIP_CAPWAP_REASM_TABLE_SIZE 0x80
++#define FM_PCD_MANIP_CAPWAP_REASM_TABLE_ALIGN 8
++#define FM_PCD_MANIP_CAPWAP_REASM_RFD_SIZE 32
++#define FM_PCD_MANIP_CAPWAP_REASM_AUTO_LEARNING_HASH_ENTRY_SIZE 4
++#define FM_PCD_MANIP_CAPWAP_REASM_TIME_OUT_ENTRY_SIZE 8
++
++
++#define FM_PCD_MANIP_CAPWAP_REASM_TIME_OUT_BETWEEN_FRAMES 0x40000000
++#define FM_PCD_MANIP_CAPWAP_REASM_HALT_ON_DUPLICATE_FRAG 0x10000000
++#define FM_PCD_MANIP_CAPWAP_REASM_AUTOMATIC_LEARNIN_HASH_8_WAYS 0x08000000
++#define FM_PCD_MANIP_CAPWAP_REASM_PR_COPY 0x00800000
++
++#define FM_PCD_MANIP_CAPWAP_FRAG_COMPR_OPTION_FIELD_EN 0x80000000
++
++#define FM_PCD_MANIP_INDEXED_STATS_ENTRY_SIZE 4
++#define FM_PCD_MANIP_INDEXED_STATS_CNIA 0x20000000
++#define FM_PCD_MANIP_INDEXED_STATS_DPD 0x10000000
++
++#define FM_PCD_MANIP_IP_REASM_TABLE_SIZE 0x40
++#define FM_PCD_MANIP_IP_REASM_TABLE_ALIGN 8
++
++#define FM_PCD_MANIP_IP_REASM_COMMON_PARAM_TABLE_SIZE 64
++#define FM_PCD_MANIP_IP_REASM_COMMON_PARAM_TABLE_ALIGN 8
++#define FM_PCD_MANIP_IP_REASM_TIME_OUT_BETWEEN_FRAMES 0x80000000
++#define FM_PCD_MANIP_IP_REASM_COUPLING_ENABLE 0x40000000
++#define FM_PCD_MANIP_IP_REASM_COUPLING_MASK 0xFF000000
++#define FM_PCD_MANIP_IP_REASM_COUPLING_SHIFT 24
++#define FM_PCD_MANIP_IP_REASM_LIODN_MASK 0x0000003F
++#define FM_PCD_MANIP_IP_REASM_LIODN_SHIFT 56
++#define FM_PCD_MANIP_IP_REASM_ELIODN_MASK 0x000003c0
++#define FM_PCD_MANIP_IP_REASM_ELIODN_SHIFT 38
++#define FM_PCD_MANIP_IP_REASM_COMMON_INT_BUFFER_IDX_MASK 0x000000FF
++#define FM_PCD_MANIP_IP_REASM_COMMON_INT_BUFFER_IDX_SHIFT 24
++
++#define FM_PCD_MANIP_IP_MTU_SHIFT 16
++#define FM_PCD_MANIP_IP_NO_FRAGMENTATION 0xFFFF0000
++#define FM_PCD_MANIP_IP_CNIA 0x20000000
++
++#define FM_PCD_MANIP_IP_REASSM_TIMEOUT_THREAD_THRESH 1024
++#define FM_PCD_MANIP_IP_FRAG_DF_SHIFT 28
++#define FM_PCD_MANIP_IP_FRAG_SCRATCH_BPID 24
++#define FM_PCD_MANIP_IP_FRAG_SG_BDID_EN 0x08000000
++#define FM_PCD_MANIP_IP_FRAG_SG_BDID_MASK 0xFF000000
++#define FM_PCD_MANIP_IP_FRAG_SG_BDID_SHIFT 24
++
++#define FM_PCD_MANIP_IPSEC_DEC 0x10000000
++#define FM_PCD_MANIP_IPSEC_VIPV_EN 0x08000000
++#define FM_PCD_MANIP_IPSEC_ECN_EN 0x04000000
++#define FM_PCD_MANIP_IPSEC_DSCP_EN 0x02000000
++#define FM_PCD_MANIP_IPSEC_VIPL_EN 0x01000000
++#define FM_PCD_MANIP_IPSEC_NADEN 0x20000000
++
++#define FM_PCD_MANIP_IPSEC_IP_HDR_LEN_MASK 0x00FF0000
++#define FM_PCD_MANIP_IPSEC_IP_HDR_LEN_SHIFT 16
++
++#define e_FM_MANIP_IP_INDX 1
++
++#define HMCD_OPCODE_GENERIC_RMV 0x01
++#define HMCD_OPCODE_GENERIC_INSRT 0x02
++#define HMCD_OPCODE_GENERIC_REPLACE 0x05
++#define HMCD_OPCODE_L2_RMV 0x08
++#define HMCD_OPCODE_L2_INSRT 0x09
++#define HMCD_OPCODE_VLAN_PRI_UPDATE 0x0B
++#define HMCD_OPCODE_IPV4_UPDATE 0x0C
++#define HMCD_OPCODE_IPV6_UPDATE 0x10
++#define HMCD_OPCODE_TCP_UDP_UPDATE 0x0E
++#define HMCD_OPCODE_TCP_UDP_CHECKSUM 0x14
++#define HMCD_OPCODE_REPLACE_IP 0x12
++
++#define HMCD_DSCP_VALUES 64
++
++#define HMCD_BASIC_SIZE 4
++#define HMCD_PTR_SIZE 4
++#define HMCD_PARAM_SIZE 4
++#define HMCD_IPV4_ADDR_SIZE 4
++#define HMCD_IPV6_ADDR_SIZE 0x10
++
++#define HMCD_LAST 0x00800000
++
++#define HMCD_OC_SHIFT 24
++
++#define HMCD_RMV_OFFSET_SHIFT 0
++#define HMCD_RMV_SIZE_SHIFT 8
++
++#define HMCD_INSRT_OFFSET_SHIFT 0
++#define HMCD_INSRT_SIZE_SHIFT 8
++
++#define HMTD_CFG_TYPE 0x4000
++#define HMTD_CFG_EXT_HMCT 0x0080
++#define HMTD_CFG_PRS_AFTER_HM 0x0040
++#define HMTD_CFG_NEXT_AD_EN 0x0020
++
++#define HMCD_RMV_L2_ETHERNET 0
++#define HMCD_RMV_L2_STACKED_QTAGS 1
++#define HMCD_RMV_L2_ETHERNET_AND_MPLS 2
++#define HMCD_RMV_L2_MPLS 3
++
++#define HMCD_INSRT_L2_MPLS 0
++#define HMCD_INSRT_N_UPDATE_L2_MPLS 1
++#define HMCD_INSRT_L2_SIZE_SHIFT 24
++
++#define HMCD_L2_MODE_SHIFT 16
++
++#define HMCD_VLAN_PRI_REP_MODE_SHIFT 16
++#define HMCD_VLAN_PRI_UPDATE 0
++#define HMCD_VLAN_PRI_UPDATE_DSCP_TO_VPRI 1
++
++#define HMCD_IPV4_UPDATE_TTL 0x00000001
++#define HMCD_IPV4_UPDATE_TOS 0x00000002
++#define HMCD_IPV4_UPDATE_DST 0x00000020
++#define HMCD_IPV4_UPDATE_SRC 0x00000040
++#define HMCD_IPV4_UPDATE_ID 0x00000080
++#define HMCD_IPV4_UPDATE_TOS_SHIFT 8
++
++#define HMCD_IPV6_UPDATE_HL 0x00000001
++#define HMCD_IPV6_UPDATE_TC 0x00000002
++#define HMCD_IPV6_UPDATE_DST 0x00000040
++#define HMCD_IPV6_UPDATE_SRC 0x00000080
++#define HMCD_IPV6_UPDATE_TC_SHIFT 8
++
++#define HMCD_TCP_UDP_UPDATE_DST 0x00004000
++#define HMCD_TCP_UDP_UPDATE_SRC 0x00008000
++#define HMCD_TCP_UDP_UPDATE_SRC_SHIFT 16
++
++#define HMCD_IP_REPLACE_REPLACE_IPV4 0x00000000
++#define HMCD_IP_REPLACE_REPLACE_IPV6 0x00010000
++#define HMCD_IP_REPLACE_TTL_HL 0x00200000
++#define HMCD_IP_REPLACE_ID 0x00400000
++
++#define HMCD_IP_REPLACE_L3HDRSIZE_SHIFT 24
++
++#define DSCP_TO_VLAN_TABLE_SIZE 32
++
++#define MANIP_GET_HMCT_SIZE(h_Manip) (((t_FmPcdManip *)h_Manip)->tableSize)
++#define MANIP_GET_DATA_SIZE(h_Manip) (((t_FmPcdManip *)h_Manip)->dataSize)
++
++#define MANIP_GET_HMCT_PTR(h_Manip) (((t_FmPcdManip *)h_Manip)->p_Hmct)
++#define MANIP_GET_DATA_PTR(h_Manip) (((t_FmPcdManip *)h_Manip)->p_Data)
++
++#define MANIP_SET_HMCT_PTR(h_Manip, h_NewPtr) (((t_FmPcdManip *)h_Manip)->p_Hmct = h_NewPtr)
++#define MANIP_SET_DATA_PTR(h_Manip, h_NewPtr) (((t_FmPcdManip *)h_Manip)->p_Data = h_NewPtr)
++
++#define MANIP_GET_HMTD_PTR(h_Manip) (((t_FmPcdManip *)h_Manip)->h_Ad)
++#define MANIP_DONT_REPARSE(h_Manip) (((t_FmPcdManip *)h_Manip)->dontParseAfterManip)
++#define MANIP_SET_PREV(h_Manip, h_Prev) (((t_FmPcdManip *)h_Manip)->h_PrevManip = h_Prev)
++#define MANIP_GET_OWNERS(h_Manip) (((t_FmPcdManip *)h_Manip)->owner)
++#define MANIP_GET_TYPE(h_Manip) (((t_FmPcdManip *)h_Manip)->type)
++#define MANIP_SET_UNIFIED_TBL_PTR_INDICATION(h_Manip) (((t_FmPcdManip *)h_Manip)->unifiedTablePtr = TRUE)
++#define MANIP_GET_MURAM(h_Manip) (((t_FmPcd *)((t_FmPcdManip *)h_Manip)->h_FmPcd)->h_FmMuram)
++#define MANIP_FREE_HMTD(h_Manip) \
++ {if (((t_FmPcdManip *)h_Manip)->muramAllocate) \
++ FM_MURAM_FreeMem(((t_FmPcd *)((t_FmPcdManip *)h_Manip)->h_FmPcd)->h_FmMuram, ((t_FmPcdManip *)h_Manip)->h_Ad);\
++ else \
++ XX_Free(((t_FmPcdManip *)h_Manip)->h_Ad); \
++ ((t_FmPcdManip *)h_Manip)->h_Ad = NULL; \
++ }
++/* position regarding Manip SW structure */
++#define MANIP_IS_FIRST(h_Manip) (!(((t_FmPcdManip *)h_Manip)->h_PrevManip))
++#define MANIP_IS_CASCADE_NEXT(h_Manip) (((t_FmPcdManip *)h_Manip)->cascadedNext)
++#define MANIP_IS_UNIFIED(h_Manip) (!(((t_FmPcdManip *)h_Manip)->unifiedPosition == e_MANIP_UNIFIED_NONE))
++#define MANIP_IS_UNIFIED_NON_FIRST(h_Manip) ((((t_FmPcdManip *)h_Manip)->unifiedPosition == e_MANIP_UNIFIED_MID) || \
++ (((t_FmPcdManip *)h_Manip)->unifiedPosition == e_MANIP_UNIFIED_LAST))
++#define MANIP_IS_UNIFIED_NON_LAST(h_Manip) ((((t_FmPcdManip *)h_Manip)->unifiedPosition == e_MANIP_UNIFIED_FIRST) ||\
++ (((t_FmPcdManip *)h_Manip)->unifiedPosition == e_MANIP_UNIFIED_MID))
++#define MANIP_IS_UNIFIED_FIRST(h_Manip) (((t_FmPcdManip *)h_Manip)->unifiedPosition == e_MANIP_UNIFIED_FIRST)
++#define MANIP_IS_UNIFIED_LAST(h_Manip) (((t_FmPcdManip *)h_Manip)->unifiedPosition == e_MANIP_UNIFIED_LAST)
++
++#define MANIP_UPDATE_UNIFIED_POSITION(h_Manip) (((t_FmPcdManip *)h_Manip)->unifiedPosition = \
++ (((t_FmPcdManip *)h_Manip)->unifiedPosition == e_MANIP_UNIFIED_NONE)? \
++ e_MANIP_UNIFIED_LAST : e_MANIP_UNIFIED_MID)
++
++typedef enum e_ManipUnifiedPosition {
++ e_MANIP_UNIFIED_NONE = 0,
++ e_MANIP_UNIFIED_FIRST,
++ e_MANIP_UNIFIED_MID,
++ e_MANIP_UNIFIED_LAST
++} e_ManipUnifiedPosition;
++
++typedef enum e_ManipInfo {
++ e_MANIP_HMTD,
++ e_MANIP_HMCT,
++ e_MANIP_HANDLER_TABLE_OWNER
++}e_ManipInfo;
++/***********************************************************************/
++/* Memory map */
++/***********************************************************************/
++#if defined(__MWERKS__) && !defined(__GNUC__)
++#pragma pack(push,1)
++#endif /* defined(__MWERKS__) && ... */
++
++typedef _Packed struct t_CapwapReasmPram {
++ volatile uint32_t mode;
++ volatile uint32_t autoLearnHashTblPtr;
++ volatile uint32_t intStatsTblPtr;
++ volatile uint32_t reasmFrmDescPoolTblPtr;
++ volatile uint32_t reasmFrmDescIndexPoolTblPtr;
++ volatile uint32_t timeOutTblPtr;
++ volatile uint32_t bufferPoolIdAndRisc1SetIndexes;
++ volatile uint32_t risc23SetIndexes;
++ volatile uint32_t risc4SetIndexesAndExtendedStatsTblPtr;
++ volatile uint32_t extendedStatsTblPtr;
++ volatile uint32_t expirationDelay;
++ volatile uint32_t totalProcessedFragCounter;
++ volatile uint32_t totalUnsuccessfulReasmFramesCounter;
++ volatile uint32_t totalDuplicatedFragCounter;
++ volatile uint32_t totalMalformdFragCounter;
++ volatile uint32_t totalTimeOutCounter;
++ volatile uint32_t totalSetBusyCounter;
++ volatile uint32_t totalRfdPoolBusyCounter;
++ volatile uint32_t totalDiscardedFragsCounter;
++ volatile uint32_t totalMoreThan16FramesCounter;
++ volatile uint32_t internalBufferBusy;
++ volatile uint32_t externalBufferBusy;
++ volatile uint32_t reserved1[4];
++} _PackedType t_CapwapReasmPram;
++
++typedef _Packed struct t_IpReassTbl {
++ volatile uint16_t waysNumAndSetSize;
++ volatile uint16_t autoLearnHashKeyMask;
++ volatile uint32_t ipReassCommonPrmTblPtr;
++ volatile uint32_t liodnAlAndAutoLearnHashTblPtrHi;
++ volatile uint32_t autoLearnHashTblPtrLow;
++ volatile uint32_t liodnSlAndAutoLearnSetLockTblPtrHi;
++ volatile uint32_t autoLearnSetLockTblPtrLow;
++ volatile uint16_t minFragSize;
++ volatile uint16_t reserved1;
++ volatile uint32_t totalSuccessfullyReasmFramesCounter;
++ volatile uint32_t totalValidFragmentCounter;
++ volatile uint32_t totalProcessedFragCounter;
++ volatile uint32_t totalMalformdFragCounter;
++ volatile uint32_t totalSetBusyCounter;
++ volatile uint32_t totalDiscardedFragsCounter;
++ volatile uint32_t totalMoreThan16FramesCounter;
++ volatile uint32_t reserved2[2];
++} _PackedType t_IpReassTbl;
++
++typedef _Packed struct t_IpReassCommonTbl {
++ volatile uint32_t timeoutModeAndFqid;
++ volatile uint32_t reassFrmDescIndexPoolTblPtr;
++ volatile uint32_t liodnAndReassFrmDescPoolPtrHi;
++ volatile uint32_t reassFrmDescPoolPtrLow;
++ volatile uint32_t timeOutTblPtr;
++ volatile uint32_t expirationDelay;
++ volatile uint32_t internalBufferManagement;
++ volatile uint32_t reserved2;
++ volatile uint32_t totalTimeOutCounter;
++ volatile uint32_t totalRfdPoolBusyCounter;
++ volatile uint32_t totalInternalBufferBusy;
++ volatile uint32_t totalExternalBufferBusy;
++ volatile uint32_t totalSgFragmentCounter;
++ volatile uint32_t totalDmaSemaphoreDepletionCounter;
++ volatile uint32_t reserved3[2];
++} _PackedType t_IpReassCommonTbl;
++
++typedef _Packed struct t_Hmtd {
++ volatile uint16_t cfg;
++ volatile uint8_t eliodnOffset;
++ volatile uint8_t extHmcdBasePtrHi;
++ volatile uint32_t hmcdBasePtr;
++ volatile uint16_t nextAdIdx;
++ volatile uint8_t res1;
++ volatile uint8_t opCode;
++ volatile uint32_t res2;
++} _PackedType t_Hmtd;
++
++#if defined(__MWERKS__) && !defined(__GNUC__)
++#pragma pack(pop)
++#endif /* defined(__MWERKS__) && ... */
++
++
++/***********************************************************************/
++/* Driver's internal structures */
++/***********************************************************************/
++typedef struct
++{
++ t_Handle p_AutoLearnHashTbl;
++ t_Handle p_ReassmFrmDescrPoolTbl;
++ t_Handle p_ReassmFrmDescrIndxPoolTbl;
++ t_Handle p_TimeOutTbl;
++ uint16_t maxNumFramesInProcess;
++ uint8_t numOfTasks;
++ //uint8_t poolId;
++ uint8_t prOffset;
++ uint16_t dataOffset;
++ uint8_t sgBpid;
++ uint8_t hwPortId;
++ uint32_t fqidForTimeOutFrames;
++ uint32_t timeoutRoutineRequestTime;
++ uint32_t bitFor1Micro;
++} t_FragParams;
++
++typedef struct
++{
++ t_AdOfTypeContLookup *p_Frag;
++#if (DPAA_VERSION == 10)
++ uint8_t scratchBpid;
++#endif /* (DPAA_VERSION == 10) */
++} t_IpFragParams;
++
++typedef struct t_IpReassmParams
++{
++ t_Handle h_Ipv4Ad;
++ t_Handle h_Ipv6Ad;
++ bool ipv6Assigned;
++ e_NetHeaderType hdr; /* Header selection */
++ t_IpReassCommonTbl *p_IpReassCommonTbl;
++ t_IpReassTbl *p_Ipv4ReassTbl;
++ t_IpReassTbl *p_Ipv6ReassTbl;
++ uintptr_t ipv4AutoLearnHashTblAddr;
++ uintptr_t ipv6AutoLearnHashTblAddr;
++ uintptr_t ipv4AutoLearnSetLockTblAddr;
++ uintptr_t ipv6AutoLearnSetLockTblAddr;
++ uintptr_t reassFrmDescrIndxPoolTblAddr;
++ uintptr_t reassFrmDescrPoolTblAddr;
++ uintptr_t timeOutTblAddr;
++ uintptr_t internalBufferPoolManagementIndexAddr;
++ uintptr_t internalBufferPoolAddr;
++ uint32_t maxNumFramesInProcess;
++ uint8_t sgBpid;
++ uint8_t dataMemId;
++ uint16_t dataLiodnOffset;
++ uint32_t fqidForTimeOutFrames;
++ e_FmPcdManipReassemTimeOutMode timeOutMode;
++ uint32_t timeoutThresholdForReassmProcess;
++ uint16_t minFragSize[2];
++ e_FmPcdManipReassemWaysNumber numOfFramesPerHashEntry[2];
++ uint8_t relativeSchemeId[2];
++ t_Handle h_Ipv4Scheme;
++ t_Handle h_Ipv6Scheme;
++ uint32_t nonConsistentSpFqid;
++} t_IpReassmParams;
++
++
++typedef struct{
++ e_FmPcdManipType type;
++ t_FmPcdManipParams manipParams;
++ bool muramAllocate;
++ t_Handle h_Ad;
++ uint32_t opcode;
++ bool rmv;
++ bool insrt;
++ t_Handle h_NextManip;
++ t_Handle h_PrevManip;
++ /* HdrManip parameters*/
++ uint8_t *p_Hmct;
++ uint8_t *p_Data;
++ bool dontParseAfterManip;
++ bool fieldUpdate;
++ bool custom;
++ uint16_t tableSize;
++ uint8_t dataSize;
++ bool cascadedNext;
++ e_ManipUnifiedPosition unifiedPosition;
++ /* end HdrManip */
++ uint8_t *p_Template;
++ t_Handle h_Frag;
++ bool frag;
++ bool reassm;
++ uint16_t sizeForFragmentation;
++ uint8_t owner;
++ uint32_t updateParams;
++ uint32_t shadowUpdateParams;
++ t_FragParams fragParams;
++ union {
++ t_IpReassmParams ipReassmParams;
++ t_IpFragParams ipFragParams;
++ };
++ uint8_t icOffset;
++ uint16_t ownerTmp;
++ bool cnia;
++ t_Handle p_StatsTbl;
++ t_Handle h_FmPcd;
++ t_List nodesLst;
++ t_Handle h_Spinlock;
++
++} t_FmPcdManip;
++
++typedef struct t_FmPcdCcSavedManipParams
++{
++ union
++ {
++ struct
++ {
++ uint16_t dataOffset;
++ //uint8_t poolId;
++ }capwapParams;
++ struct
++ {
++ uint16_t dataOffset;
++ uint8_t poolId;
++ }ipParams;
++ };
++
++} t_FmPcdCcSavedManipParams;
++
++
++#endif /* __FM_MANIP_H */
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_pcd.c b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_pcd.c
+new file mode 100644
+index 0000000..0f54050
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_pcd.c
+@@ -0,0 +1,2112 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File fm_pcd.c
++
++ @Description FM PCD ...
++*//***************************************************************************/
++#include "std_ext.h"
++#include "error_ext.h"
++#include "string_ext.h"
++#include "xx_ext.h"
++#include "sprint_ext.h"
++#include "debug_ext.h"
++#include "net_ext.h"
++#include "fm_ext.h"
++#include "fm_pcd_ext.h"
++
++#include "fm_common.h"
++#include "fm_pcd.h"
++#include "fm_pcd_ipc.h"
++#include "fm_hc.h"
++#include "fm_muram_ext.h"
++
++
++/****************************************/
++/* static functions */
++/****************************************/
++
++static t_Error CheckFmPcdParameters(t_FmPcd *p_FmPcd)
++{
++ if (!p_FmPcd->h_Fm)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("h_Fm has to be initialized"));
++
++ if (p_FmPcd->guestId == NCSW_MASTER_ID)
++ {
++ if (p_FmPcd->p_FmPcdKg && !p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Something WRONG"));
++
++ if (p_FmPcd->p_FmPcdPlcr && !p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Something WRONG"));
++
++ if (!p_FmPcd->f_Exception)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("f_FmPcdExceptions has to be initialized"));
++
++ if ((!p_FmPcd->f_FmPcdIndexedException) && (p_FmPcd->p_FmPcdPlcr || p_FmPcd->p_FmPcdKg))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("f_FmPcdIndexedException has to be initialized"));
++
++ if (p_FmPcd->p_FmPcdDriverParam->prsMaxParseCycleLimit > PRS_MAX_CYCLE_LIMIT)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("prsMaxParseCycleLimit has to be less than 8191"));
++ }
++
++ return E_OK;
++}
++
++static volatile bool blockingFlag = FALSE;
++static void IpcMsgCompletionCB(t_Handle h_FmPcd,
++ uint8_t *p_Msg,
++ uint8_t *p_Reply,
++ uint32_t replyLength,
++ t_Error status)
++{
++ UNUSED(h_FmPcd);UNUSED(p_Msg);UNUSED(p_Reply);UNUSED(replyLength);UNUSED(status);
++ blockingFlag = FALSE;
++}
++
++static t_Error IpcMsgHandlerCB(t_Handle h_FmPcd,
++ uint8_t *p_Msg,
++ uint32_t msgLength,
++ uint8_t *p_Reply,
++ uint32_t *p_ReplyLength)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ t_Error err = E_OK;
++ t_FmPcdIpcMsg *p_IpcMsg = (t_FmPcdIpcMsg*)p_Msg;
++ t_FmPcdIpcReply *p_IpcReply = (t_FmPcdIpcReply*)p_Reply;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR((msgLength >= sizeof(uint32_t)), E_INVALID_VALUE);
++
++#ifdef DISABLE_SANITY_CHECKS
++ UNUSED(msgLength);
++#endif /* DISABLE_SANITY_CHECKS */
++
++ ASSERT_COND(p_Msg);
++
++ memset(p_IpcReply, 0, (sizeof(uint8_t) * FM_PCD_MAX_REPLY_SIZE));
++ *p_ReplyLength = 0;
++
++ switch (p_IpcMsg->msgId)
++ {
++ case (FM_PCD_MASTER_IS_ALIVE):
++ *(uint8_t*)(p_IpcReply->replyBody) = 1;
++ p_IpcReply->error = E_OK;
++ *p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);
++ break;
++ case (FM_PCD_MASTER_IS_ENABLED):
++ /* count partitions registrations */
++ if (p_FmPcd->enabled)
++ p_FmPcd->numOfEnabledGuestPartitionsPcds++;
++ *(uint8_t*)(p_IpcReply->replyBody) = (uint8_t)p_FmPcd->enabled;
++ p_IpcReply->error = E_OK;
++ *p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);
++ break;
++ case (FM_PCD_GUEST_DISABLE):
++ if (p_FmPcd->numOfEnabledGuestPartitionsPcds)
++ {
++ p_FmPcd->numOfEnabledGuestPartitionsPcds--;
++ p_IpcReply->error = E_OK;
++ }
++ else
++ {
++ REPORT_ERROR(MINOR, E_INVALID_STATE,("Trying to disable an unregistered partition"));
++ p_IpcReply->error = E_INVALID_STATE;
++ }
++ *p_ReplyLength = sizeof(uint32_t);
++ break;
++ case (FM_PCD_GET_COUNTER):
++ {
++ e_FmPcdCounters inCounter;
++ uint32_t outCounter;
++
++ memcpy((uint8_t*)&inCounter, p_IpcMsg->msgBody, sizeof(uint32_t));
++ outCounter = FM_PCD_GetCounter(h_FmPcd, inCounter);
++ memcpy(p_IpcReply->replyBody, (uint8_t*)&outCounter, sizeof(uint32_t));
++ p_IpcReply->error = E_OK;
++ *p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t);
++ break;
++ }
++ case (FM_PCD_ALLOC_KG_SCHEMES):
++ {
++ t_FmPcdIpcKgSchemesParams ipcSchemesParams;
++
++ memcpy((uint8_t*)&ipcSchemesParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgSchemesParams));
++ err = FmPcdKgAllocSchemes(h_FmPcd,
++ ipcSchemesParams.numOfSchemes,
++ ipcSchemesParams.guestId,
++ p_IpcReply->replyBody);
++ p_IpcReply->error = err;
++ *p_ReplyLength = sizeof(uint32_t) + ipcSchemesParams.numOfSchemes*sizeof(uint8_t);
++ break;
++ }
++ case (FM_PCD_FREE_KG_SCHEMES):
++ {
++ t_FmPcdIpcKgSchemesParams ipcSchemesParams;
++
++ memcpy((uint8_t*)&ipcSchemesParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgSchemesParams));
++ err = FmPcdKgFreeSchemes(h_FmPcd,
++ ipcSchemesParams.numOfSchemes,
++ ipcSchemesParams.guestId,
++ ipcSchemesParams.schemesIds);
++ p_IpcReply->error = err;
++ *p_ReplyLength = sizeof(uint32_t);
++ break;
++ }
++ case (FM_PCD_ALLOC_KG_CLSPLAN):
++ {
++ t_FmPcdIpcKgClsPlanParams ipcKgClsPlanParams;
++
++ memcpy((uint8_t*)&ipcKgClsPlanParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgClsPlanParams));
++ err = KgAllocClsPlanEntries(h_FmPcd,
++ ipcKgClsPlanParams.numOfClsPlanEntries,
++ ipcKgClsPlanParams.guestId,
++ p_IpcReply->replyBody);
++ p_IpcReply->error = err;
++ *p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);
++ break;
++ }
++ case (FM_PCD_FREE_KG_CLSPLAN):
++ {
++ t_FmPcdIpcKgClsPlanParams ipcKgClsPlanParams;
++
++ memcpy((uint8_t*)&ipcKgClsPlanParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgClsPlanParams));
++ KgFreeClsPlanEntries(h_FmPcd,
++ ipcKgClsPlanParams.numOfClsPlanEntries,
++ ipcKgClsPlanParams.guestId,
++ ipcKgClsPlanParams.clsPlanBase);
++ *p_ReplyLength = sizeof(uint32_t);
++ break;
++ }
++ case (FM_PCD_ALLOC_PROFILES):
++ {
++ t_FmIpcResourceAllocParams ipcAllocParams;
++ uint16_t base;
++ memcpy(&ipcAllocParams, p_IpcMsg->msgBody, sizeof(t_FmIpcResourceAllocParams));
++ base = PlcrAllocProfilesForPartition(h_FmPcd,
++ ipcAllocParams.base,
++ ipcAllocParams.num,
++ ipcAllocParams.guestId);
++ memcpy(p_IpcReply->replyBody, (uint16_t*)&base, sizeof(uint16_t));
++ *p_ReplyLength = sizeof(uint32_t) + sizeof(uint16_t);
++ break;
++ }
++ case (FM_PCD_FREE_PROFILES):
++ {
++ t_FmIpcResourceAllocParams ipcAllocParams;
++ memcpy(&ipcAllocParams, p_IpcMsg->msgBody, sizeof(t_FmIpcResourceAllocParams));
++ PlcrFreeProfilesForPartition(h_FmPcd,
++ ipcAllocParams.base,
++ ipcAllocParams.num,
++ ipcAllocParams.guestId);
++ break;
++ }
++ case (FM_PCD_SET_PORT_PROFILES):
++ {
++ t_FmIpcResourceAllocParams ipcAllocParams;
++ memcpy(&ipcAllocParams, p_IpcMsg->msgBody, sizeof(t_FmIpcResourceAllocParams));
++ PlcrSetPortProfiles(h_FmPcd,
++ ipcAllocParams.guestId,
++ ipcAllocParams.num,
++ ipcAllocParams.base);
++ break;
++ }
++ case (FM_PCD_CLEAR_PORT_PROFILES):
++ {
++ t_FmIpcResourceAllocParams ipcAllocParams;
++ memcpy(&ipcAllocParams, p_IpcMsg->msgBody, sizeof(t_FmIpcResourceAllocParams));
++ PlcrClearPortProfiles(h_FmPcd,
++ ipcAllocParams.guestId);
++ break;
++ }
++ case (FM_PCD_GET_SW_PRS_OFFSET):
++ {
++ t_FmPcdIpcSwPrsLable ipcSwPrsLable;
++ uint32_t swPrsOffset;
++
++ memcpy((uint8_t*)&ipcSwPrsLable, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcSwPrsLable));
++ swPrsOffset =
++ FmPcdGetSwPrsOffset(h_FmPcd,
++ (e_NetHeaderType)ipcSwPrsLable.enumHdr,
++ ipcSwPrsLable.indexPerHdr);
++ memcpy(p_IpcReply->replyBody, (uint8_t*)&swPrsOffset, sizeof(uint32_t));
++ *p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t);
++ break;
++ }
++ case (FM_PCD_PRS_INC_PORT_STATS):
++ {
++ t_FmPcdIpcPrsIncludePort ipcPrsIncludePort;
++
++ memcpy((uint8_t*)&ipcPrsIncludePort, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcPrsIncludePort));
++ PrsIncludePortInStatistics(h_FmPcd,
++ ipcPrsIncludePort.hardwarePortId,
++ ipcPrsIncludePort.include);
++ break;
++ }
++ default:
++ *p_ReplyLength = 0;
++ RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("command not found!!!"));
++ }
++ return E_OK;
++}
++
++static uint32_t NetEnvLock(t_Handle h_NetEnv)
++{
++ ASSERT_COND(h_NetEnv);
++ return XX_LockIntrSpinlock(((t_FmPcdNetEnv*)h_NetEnv)->h_Spinlock);
++}
++
++static void NetEnvUnlock(t_Handle h_NetEnv, uint32_t intFlags)
++{
++ ASSERT_COND(h_NetEnv);
++ XX_UnlockIntrSpinlock(((t_FmPcdNetEnv*)h_NetEnv)->h_Spinlock, intFlags);
++}
++
++static void EnqueueLockToFreeLst(t_FmPcd *p_FmPcd, t_FmPcdLock *p_Lock)
++{
++ uint32_t intFlags;
++
++ intFlags = XX_LockIntrSpinlock(p_FmPcd->h_Spinlock);
++ LIST_AddToTail(&p_Lock->node, &p_FmPcd->freeLocksLst);
++ XX_UnlockIntrSpinlock(p_FmPcd->h_Spinlock, intFlags);
++}
++
++static t_FmPcdLock * DequeueLockFromFreeLst(t_FmPcd *p_FmPcd)
++{
++ t_FmPcdLock *p_Lock = NULL;
++ uint32_t intFlags;
++
++ intFlags = XX_LockIntrSpinlock(p_FmPcd->h_Spinlock);
++ if (!LIST_IsEmpty(&p_FmPcd->freeLocksLst))
++ {
++ p_Lock = FM_PCD_LOCK_OBJ(p_FmPcd->freeLocksLst.p_Next);
++ LIST_DelAndInit(&p_Lock->node);
++ }
++ XX_UnlockIntrSpinlock(p_FmPcd->h_Spinlock, intFlags);
++
++ return p_Lock;
++}
++
++static void EnqueueLockToAcquiredLst(t_FmPcd *p_FmPcd, t_FmPcdLock *p_Lock)
++{
++ uint32_t intFlags;
++
++ intFlags = XX_LockIntrSpinlock(p_FmPcd->h_Spinlock);
++ LIST_AddToTail(&p_Lock->node, &p_FmPcd->acquiredLocksLst);
++ XX_UnlockIntrSpinlock(p_FmPcd->h_Spinlock, intFlags);
++}
++
++static t_Error FillFreeLocksLst(t_FmPcd *p_FmPcd)
++{
++ t_FmPcdLock *p_Lock;
++ int i;
++
++ for (i=0; i<10; i++)
++ {
++ p_Lock = (t_FmPcdLock *)XX_Malloc(sizeof(t_FmPcdLock));
++ if (!p_Lock)
++ RETURN_ERROR(MINOR, E_NO_MEMORY, ("FM-PCD lock obj!"));
++ memset(p_Lock, 0, sizeof(t_FmPcdLock));
++ INIT_LIST(&p_Lock->node);
++ p_Lock->h_Spinlock = XX_InitSpinlock();
++ if (!p_Lock->h_Spinlock)
++ {
++ XX_Free(p_Lock);
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("FM-PCD spinlock obj!"));
++ }
++ EnqueueLockToFreeLst(p_FmPcd, p_Lock);
++ }
++
++ return E_OK;
++}
++
++static void ReleaseFreeLocksLst(t_FmPcd *p_FmPcd)
++{
++ t_FmPcdLock *p_Lock;
++
++ p_Lock = DequeueLockFromFreeLst(p_FmPcd);
++ while (p_Lock)
++ {
++ XX_FreeSpinlock(p_Lock->h_Spinlock);
++ XX_Free(p_Lock);
++ p_Lock = DequeueLockFromFreeLst(p_FmPcd);
++ }
++}
++
++
++
++/*****************************************************************************/
++/* Inter-module API routines */
++/*****************************************************************************/
++
++void FmPcdSetClsPlanGrpId(t_FmPcd *p_FmPcd, uint8_t netEnvId, uint8_t clsPlanGrpId)
++{
++ ASSERT_COND(p_FmPcd);
++ p_FmPcd->netEnvs[netEnvId].clsPlanGrpId = clsPlanGrpId;
++}
++
++t_Error PcdGetClsPlanGrpParams(t_FmPcd *p_FmPcd, t_FmPcdKgInterModuleClsPlanGrpParams *p_GrpParams)
++{
++ uint8_t netEnvId = p_GrpParams->netEnvId;
++ int i, k, j;
++
++ ASSERT_COND(p_FmPcd);
++ if (p_FmPcd->netEnvs[netEnvId].clsPlanGrpId != ILLEGAL_CLS_PLAN)
++ {
++ p_GrpParams->grpExists = TRUE;
++ p_GrpParams->clsPlanGrpId = p_FmPcd->netEnvs[netEnvId].clsPlanGrpId;
++ return E_OK;
++ }
++
++ for (i=0; ((i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) &&
++ (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE)); i++)
++ {
++ for (k=0; ((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&
++ (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE)); k++)
++ {
++ /* if an option exists, add it to the opts list */
++ if (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt)
++ {
++ /* check if this option already exists, add if it doesn't */
++ for (j = 0;jnumOfOptions;j++)
++ {
++ if (p_GrpParams->options[j] == p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt)
++ break;
++ }
++ p_GrpParams->optVectors[j] |= p_FmPcd->netEnvs[netEnvId].unitsVectors[i];
++ if (j == p_GrpParams->numOfOptions)
++ {
++ p_GrpParams->options[p_GrpParams->numOfOptions] = p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt;
++ p_GrpParams->numOfOptions++;
++ }
++ }
++ }
++ }
++
++ if (p_GrpParams->numOfOptions == 0)
++ {
++ if (p_FmPcd->p_FmPcdKg->emptyClsPlanGrpId != ILLEGAL_CLS_PLAN)
++ {
++ p_GrpParams->grpExists = TRUE;
++ p_GrpParams->clsPlanGrpId = p_FmPcd->p_FmPcdKg->emptyClsPlanGrpId;
++ }
++ }
++
++ return E_OK;
++
++}
++
++t_Error PcdGetVectorForOpt(t_FmPcd *p_FmPcd, uint8_t netEnvId, protocolOpt_t opt, uint32_t *p_Vector)
++{
++ uint8_t j,k;
++
++ *p_Vector = 0;
++
++ ASSERT_COND(p_FmPcd);
++ for (j=0; ((j < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) &&
++ (p_FmPcd->netEnvs[netEnvId].units[j].hdrs[0].hdr != HEADER_TYPE_NONE)); j++)
++ {
++ for (k=0; ((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&
++ (p_FmPcd->netEnvs[netEnvId].units[j].hdrs[k].hdr != HEADER_TYPE_NONE)); k++)
++ {
++ if (p_FmPcd->netEnvs[netEnvId].units[j].hdrs[k].opt == opt)
++ *p_Vector |= p_FmPcd->netEnvs[netEnvId].unitsVectors[j];
++ }
++ }
++
++ if (!*p_Vector)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Requested option was not defined for this Network Environment Characteristics module"));
++ else
++ return E_OK;
++}
++
++t_Error PcdGetUnitsVector(t_FmPcd *p_FmPcd, t_NetEnvParams *p_Params)
++{
++ int i;
++
++ ASSERT_COND(p_FmPcd);
++ ASSERT_COND(p_Params->netEnvId < FM_MAX_NUM_OF_PORTS);
++
++ p_Params->vector = 0;
++ for (i=0; inumOfDistinctionUnits ;i++)
++ {
++ if (p_FmPcd->netEnvs[p_Params->netEnvId].units[p_Params->unitIds[i]].hdrs[0].hdr == HEADER_TYPE_NONE)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Requested unit was not defined for this Network Environment Characteristics module"));
++ ASSERT_COND(p_FmPcd->netEnvs[p_Params->netEnvId].unitsVectors[p_Params->unitIds[i]]);
++ p_Params->vector |= p_FmPcd->netEnvs[p_Params->netEnvId].unitsVectors[p_Params->unitIds[i]];
++ }
++
++ return E_OK;
++}
++
++bool PcdNetEnvIsUnitWithoutOpts(t_FmPcd *p_FmPcd, uint8_t netEnvId, uint32_t unitVector)
++{
++ int i=0, k;
++
++ ASSERT_COND(p_FmPcd);
++ /* check whether a given unit may be used by non-clsPlan users. */
++ /* first, recognize the unit by its vector */
++ while (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE)
++ {
++ if (p_FmPcd->netEnvs[netEnvId].unitsVectors[i] == unitVector)
++ {
++ for (k=0;
++ ((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&
++ (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE));
++ k++)
++ /* check that no option exists */
++ if ((protocolOpt_t)p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt)
++ return FALSE;
++ break;
++ }
++ i++;
++ }
++ /* assert that a unit was found to mach the vector */
++ ASSERT_COND(p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE);
++
++ return TRUE;
++}
++bool FmPcdNetEnvIsHdrExist(t_Handle h_FmPcd, uint8_t netEnvId, e_NetHeaderType hdr)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ int i, k;
++
++ ASSERT_COND(p_FmPcd);
++
++ for (i=0; ((i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) &&
++ (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE)); i++)
++ {
++ for (k=0; ((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&
++ (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE)); k++)
++ if (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr == hdr)
++ return TRUE;
++ }
++ for (i=0; ((i < FM_PCD_MAX_NUM_OF_ALIAS_HDRS) &&
++ (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr != HEADER_TYPE_NONE)); i++)
++ {
++ if (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr == hdr)
++ return TRUE;
++ }
++
++ return FALSE;
++}
++
++uint8_t FmPcdNetEnvGetUnitId(t_FmPcd *p_FmPcd, uint8_t netEnvId, e_NetHeaderType hdr, bool interchangable, protocolOpt_t opt)
++{
++ uint8_t i, k;
++
++ ASSERT_COND(p_FmPcd);
++
++ if (interchangable)
++ {
++ for (i=0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) &&
++ (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)
++ {
++ for (k=0; (k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&
++ (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE); k++)
++ {
++ if ((p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr == hdr) &&
++ (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt == opt))
++
++ return i;
++ }
++ }
++ }
++ else
++ {
++ for (i=0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) &&
++ (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)
++ if ((p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr == hdr) &&
++ (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].opt == opt) &&
++ (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[1].hdr == HEADER_TYPE_NONE))
++ return i;
++
++ for (i=0; (i < FM_PCD_MAX_NUM_OF_ALIAS_HDRS) &&
++ (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr != HEADER_TYPE_NONE); i++)
++ if ((p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr == hdr) &&
++ (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].opt == opt))
++ return p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].aliasHdr;
++ }
++
++ return FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS;
++}
++
++t_Error FmPcdUnregisterReassmPort(t_Handle h_FmPcd, t_Handle h_IpReasmCommonPramTbl)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ t_FmPcdCcIpReassmTimeoutParams ccIpReassmTimeoutParams = {0};
++ uint8_t result;
++ t_Error err = E_OK;
++
++ ASSERT_COND(p_FmPcd);
++ ASSERT_COND(h_IpReasmCommonPramTbl);
++
++ ccIpReassmTimeoutParams.iprcpt = (uint32_t)(XX_VirtToPhys(h_IpReasmCommonPramTbl) - p_FmPcd->physicalMuramBase);
++ ccIpReassmTimeoutParams.activate = FALSE; /*Disable Timeout Task*/
++
++ if ((err = FmHcPcdCcIpTimeoutReassm(p_FmPcd->h_Hc, &ccIpReassmTimeoutParams, &result)) != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ switch (result)
++ {
++ case (0):
++ return E_OK;
++ case (1):
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, (""));
++ case (2):
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, (""));
++ case (3):
++ RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("Disable Timeout Task with invalid IPRCPT"));
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, NO_MSG);
++ }
++
++ return E_OK;
++}
++
++e_NetHeaderType FmPcdGetAliasHdr(t_FmPcd *p_FmPcd, uint8_t netEnvId, e_NetHeaderType hdr)
++{
++ int i;
++
++ ASSERT_COND(p_FmPcd);
++ ASSERT_COND(netEnvId < FM_MAX_NUM_OF_PORTS);
++
++ for (i=0; (i < FM_PCD_MAX_NUM_OF_ALIAS_HDRS)
++ && (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr != HEADER_TYPE_NONE); i++)
++ {
++ if (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr == hdr)
++ return p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].aliasHdr;
++ }
++
++ return HEADER_TYPE_NONE;
++}
++
++void FmPcdPortRegister(t_Handle h_FmPcd, t_Handle h_FmPort, uint8_t hardwarePortId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ uint16_t swPortIndex = 0;
++
++ ASSERT_COND(h_FmPcd);
++ HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, hardwarePortId);
++ p_FmPcd->p_FmPcdPlcr->portsMapping[swPortIndex].h_FmPort = h_FmPort;
++}
++
++uint32_t FmPcdGetLcv(t_Handle h_FmPcd, uint32_t netEnvId, uint8_t hdrNum)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ ASSERT_COND(h_FmPcd);
++ return p_FmPcd->netEnvs[netEnvId].lcvs[hdrNum];
++}
++
++uint32_t FmPcdGetMacsecLcv(t_Handle h_FmPcd, uint32_t netEnvId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ ASSERT_COND(h_FmPcd);
++ return p_FmPcd->netEnvs[netEnvId].macsecVector;
++}
++
++uint8_t FmPcdGetNetEnvId(t_Handle h_NetEnv)
++{
++ return ((t_FmPcdNetEnv*)h_NetEnv)->netEnvId;
++}
++
++void FmPcdIncNetEnvOwners(t_Handle h_FmPcd, uint8_t netEnvId)
++{
++ uint32_t intFlags;
++
++ ASSERT_COND(h_FmPcd);
++
++ intFlags = NetEnvLock(&((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId]);
++ ((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId].owners++;
++ NetEnvUnlock(&((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId], intFlags);
++}
++
++void FmPcdDecNetEnvOwners(t_Handle h_FmPcd, uint8_t netEnvId)
++{
++ uint32_t intFlags;
++
++ ASSERT_COND(h_FmPcd);
++ ASSERT_COND(((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId].owners);
++
++ intFlags = NetEnvLock(&((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId]);
++ ((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId].owners--;
++ NetEnvUnlock(&((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId], intFlags);
++}
++
++uint32_t FmPcdLock(t_Handle h_FmPcd)
++{
++ ASSERT_COND(h_FmPcd);
++ return XX_LockIntrSpinlock(((t_FmPcd*)h_FmPcd)->h_Spinlock);
++}
++
++void FmPcdUnlock(t_Handle h_FmPcd, uint32_t intFlags)
++{
++ ASSERT_COND(h_FmPcd);
++ XX_UnlockIntrSpinlock(((t_FmPcd*)h_FmPcd)->h_Spinlock, intFlags);
++}
++
++t_FmPcdLock * FmPcdAcquireLock(t_Handle h_FmPcd)
++{
++ t_FmPcdLock *p_Lock;
++ ASSERT_COND(h_FmPcd);
++ p_Lock = DequeueLockFromFreeLst((t_FmPcd*)h_FmPcd);
++ if (!p_Lock)
++ {
++ FillFreeLocksLst(h_FmPcd);
++ p_Lock = DequeueLockFromFreeLst((t_FmPcd*)h_FmPcd);
++ }
++
++ if (p_Lock)
++ EnqueueLockToAcquiredLst((t_FmPcd*)h_FmPcd, p_Lock);
++ return p_Lock;
++}
++
++void FmPcdReleaseLock(t_Handle h_FmPcd, t_FmPcdLock *p_Lock)
++{
++ uint32_t intFlags;
++ ASSERT_COND(h_FmPcd);
++ intFlags = FmPcdLock(h_FmPcd);
++ LIST_DelAndInit(&p_Lock->node);
++ FmPcdUnlock(h_FmPcd, intFlags);
++ EnqueueLockToFreeLst((t_FmPcd*)h_FmPcd, p_Lock);
++}
++
++bool FmPcdLockTryLockAll(t_Handle h_FmPcd)
++{
++ uint32_t intFlags;
++ t_List *p_Pos, *p_SavedPos=NULL;
++
++ ASSERT_COND(h_FmPcd);
++ intFlags = FmPcdLock(h_FmPcd);
++ LIST_FOR_EACH(p_Pos, &((t_FmPcd*)h_FmPcd)->acquiredLocksLst)
++ {
++ t_FmPcdLock *p_Lock = FM_PCD_LOCK_OBJ(p_Pos);
++ if (!FmPcdLockTryLock(p_Lock))
++ {
++ p_SavedPos = p_Pos;
++ break;
++ }
++ }
++ if (p_SavedPos)
++ {
++ LIST_FOR_EACH(p_Pos, &((t_FmPcd*)h_FmPcd)->acquiredLocksLst)
++ {
++ t_FmPcdLock *p_Lock = FM_PCD_LOCK_OBJ(p_Pos);
++ if (p_Pos == p_SavedPos)
++ break;
++ FmPcdLockUnlock(p_Lock);
++ }
++ }
++ FmPcdUnlock(h_FmPcd, intFlags);
++
++ CORE_MemoryBarrier();
++
++ if (p_SavedPos)
++ return FALSE;
++
++ return TRUE;
++}
++
++void FmPcdLockUnlockAll(t_Handle h_FmPcd)
++{
++ uint32_t intFlags;
++ t_List *p_Pos;
++
++ ASSERT_COND(h_FmPcd);
++ intFlags = FmPcdLock(h_FmPcd);
++ LIST_FOR_EACH(p_Pos, &((t_FmPcd*)h_FmPcd)->acquiredLocksLst)
++ {
++ t_FmPcdLock *p_Lock = FM_PCD_LOCK_OBJ(p_Pos);
++ p_Lock->flag = FALSE;
++ }
++ FmPcdUnlock(h_FmPcd, intFlags);
++
++ CORE_MemoryBarrier();
++}
++
++t_Handle FmPcdGetHcHandle(t_Handle h_FmPcd)
++{
++ ASSERT_COND(h_FmPcd);
++ SANITY_CHECK_RETURN_VALUE(((t_FmPcd*)h_FmPcd)->h_Hc, E_INVALID_HANDLE, NULL);
++ return ((t_FmPcd*)h_FmPcd)->h_Hc;
++}
++
++bool FmPcdIsAdvancedOffloadSupported(t_Handle h_FmPcd)
++{
++ ASSERT_COND(h_FmPcd);
++ return ((t_FmPcd*)h_FmPcd)->advancedOffloadSupport;
++}
++/*********************** End of inter-module routines ************************/
++
++
++/****************************************/
++/* API Init unit functions */
++/****************************************/
++
++t_Handle FM_PCD_Config(t_FmPcdParams *p_FmPcdParams)
++{
++ t_FmPcd *p_FmPcd = NULL;
++ t_FmPhysAddr physicalMuramBase;
++ uint8_t i;
++
++ SANITY_CHECK_RETURN_VALUE(p_FmPcdParams, E_INVALID_HANDLE,NULL);
++
++ p_FmPcd = (t_FmPcd *) XX_Malloc(sizeof(t_FmPcd));
++ if (!p_FmPcd)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD"));
++ return NULL;
++ }
++ memset(p_FmPcd, 0, sizeof(t_FmPcd));
++
++ p_FmPcd->p_FmPcdDriverParam = (t_FmPcdDriverParam *) XX_Malloc(sizeof(t_FmPcdDriverParam));
++ if (!p_FmPcd->p_FmPcdDriverParam)
++ {
++ XX_Free(p_FmPcd);
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD Driver Param"));
++ return NULL;
++ }
++ memset(p_FmPcd->p_FmPcdDriverParam, 0, sizeof(t_FmPcdDriverParam));
++
++ p_FmPcd->h_Fm = p_FmPcdParams->h_Fm;
++ p_FmPcd->guestId = FmGetGuestId(p_FmPcd->h_Fm);
++ p_FmPcd->h_FmMuram = FmGetMuramHandle(p_FmPcd->h_Fm);
++ if (p_FmPcd->h_FmMuram)
++ {
++ FmGetPhysicalMuramBase(p_FmPcdParams->h_Fm, &physicalMuramBase);
++ p_FmPcd->physicalMuramBase = (uint64_t)((uint64_t)(&physicalMuramBase)->low | ((uint64_t)(&physicalMuramBase)->high << 32));
++ }
++
++ for (i = 0; inetEnvs[i].clsPlanGrpId = ILLEGAL_CLS_PLAN;
++
++ if (p_FmPcdParams->useHostCommand)
++ {
++ t_FmHcParams hcParams;
++
++ memset(&hcParams, 0, sizeof(hcParams));
++ hcParams.h_Fm = p_FmPcd->h_Fm;
++ hcParams.h_FmPcd = (t_Handle)p_FmPcd;
++ memcpy((uint8_t*)&hcParams.params, (uint8_t*)&p_FmPcdParams->hc, sizeof(t_FmPcdHcParams));
++ p_FmPcd->h_Hc = FmHcConfigAndInit(&hcParams);
++ if (!p_FmPcd->h_Hc)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD HC"));
++ FM_PCD_Free(p_FmPcd);
++ return NULL;
++ }
++ }
++ else if (p_FmPcd->guestId != NCSW_MASTER_ID)
++ REPORT_ERROR(MAJOR, E_INVALID_STATE, ("No Host Command defined for a guest partition."));
++
++ if (p_FmPcdParams->kgSupport)
++ {
++ p_FmPcd->p_FmPcdKg = (t_FmPcdKg *)KgConfig(p_FmPcd, p_FmPcdParams);
++ if (!p_FmPcd->p_FmPcdKg)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD Keygen"));
++ FM_PCD_Free(p_FmPcd);
++ return NULL;
++ }
++ }
++
++ if (p_FmPcdParams->plcrSupport)
++ {
++ p_FmPcd->p_FmPcdPlcr = (t_FmPcdPlcr *)PlcrConfig(p_FmPcd, p_FmPcdParams);
++ if (!p_FmPcd->p_FmPcdPlcr)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD Policer"));
++ FM_PCD_Free(p_FmPcd);
++ return NULL;
++ }
++ }
++
++ if (p_FmPcdParams->prsSupport)
++ {
++ p_FmPcd->p_FmPcdPrs = (t_FmPcdPrs *)PrsConfig(p_FmPcd, p_FmPcdParams);
++ if (!p_FmPcd->p_FmPcdPrs)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD Parser"));
++ FM_PCD_Free(p_FmPcd);
++ return NULL;
++ }
++ }
++
++ p_FmPcd->h_Spinlock = XX_InitSpinlock();
++ if (!p_FmPcd->h_Spinlock)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD spinlock"));
++ FM_PCD_Free(p_FmPcd);
++ return NULL;
++ }
++ INIT_LIST(&p_FmPcd->freeLocksLst);
++ INIT_LIST(&p_FmPcd->acquiredLocksLst);
++
++ p_FmPcd->numOfEnabledGuestPartitionsPcds = 0;
++
++ p_FmPcd->f_Exception = p_FmPcdParams->f_Exception;
++ p_FmPcd->f_FmPcdIndexedException = p_FmPcdParams->f_ExceptionId;
++ p_FmPcd->h_App = p_FmPcdParams->h_App;
++
++ p_FmPcd->p_CcShadow = NULL;
++ p_FmPcd->ccShadowSize = 0;
++ p_FmPcd->ccShadowAlign = 0;
++
++ p_FmPcd->h_ShadowSpinlock = XX_InitSpinlock();
++ if (!p_FmPcd->h_ShadowSpinlock)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD shadow spinlock"));
++ FM_PCD_Free(p_FmPcd);
++ return NULL;
++ }
++
++ return p_FmPcd;
++}
++
++t_Handle FM_PCD_GetHcDevH(t_Handle h_FmPcd)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *) h_FmPcd;
++
++ return (p_FmPcd) ? FmGcGetHcPortDevH(p_FmPcd->h_Hc) : NULL;
++}
++
++t_Error FM_PCD_Init(t_Handle h_FmPcd)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ t_Error err = E_OK;
++ t_FmPcdIpcMsg msg;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdDriverParam, E_INVALID_HANDLE);
++
++ FM_GetRevision(p_FmPcd->h_Fm, &p_FmPcd->fmRevInfo);
++
++ if (p_FmPcd->guestId != NCSW_MASTER_ID)
++ {
++ memset(p_FmPcd->fmPcdIpcHandlerModuleName, 0, (sizeof(char)) * MODULE_NAME_SIZE);
++ if (Sprint (p_FmPcd->fmPcdIpcHandlerModuleName, "FM_PCD_%d_%d", FmGetId(p_FmPcd->h_Fm), NCSW_MASTER_ID) != 10)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));
++ memset(p_FmPcd->fmPcdModuleName, 0, (sizeof(char)) * MODULE_NAME_SIZE);
++ if (Sprint (p_FmPcd->fmPcdModuleName, "FM_PCD_%d_%d",FmGetId(p_FmPcd->h_Fm), p_FmPcd->guestId) != (p_FmPcd->guestId<10 ? 10:11))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));
++
++ p_FmPcd->h_IpcSession = XX_IpcInitSession(p_FmPcd->fmPcdIpcHandlerModuleName, p_FmPcd->fmPcdModuleName);
++ if (p_FmPcd->h_IpcSession)
++ {
++ t_FmPcdIpcReply reply;
++ uint32_t replyLength;
++ uint8_t isMasterAlive = 0;
++
++ memset(&msg, 0, sizeof(msg));
++ memset(&reply, 0, sizeof(reply));
++ msg.msgId = FM_PCD_MASTER_IS_ALIVE;
++ msg.msgBody[0] = p_FmPcd->guestId;
++ blockingFlag = TRUE;
++
++ do
++ {
++ replyLength = sizeof(uint32_t) + sizeof(isMasterAlive);
++ if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
++ (uint8_t*)&msg,
++ sizeof(msg.msgId)+sizeof(p_FmPcd->guestId),
++ (uint8_t*)&reply,
++ &replyLength,
++ IpcMsgCompletionCB,
++ h_FmPcd)) != E_OK)
++ REPORT_ERROR(MAJOR, err, NO_MSG);
++ while (blockingFlag) ;
++ if (replyLength != (sizeof(uint32_t) + sizeof(isMasterAlive)))
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
++ isMasterAlive = *(uint8_t*)(reply.replyBody);
++ } while (!isMasterAlive);
++ }
++ }
++
++ CHECK_INIT_PARAMETERS(p_FmPcd, CheckFmPcdParameters);
++
++ if (p_FmPcd->p_FmPcdKg)
++ {
++ err = KgInit(p_FmPcd);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ if (p_FmPcd->p_FmPcdPlcr)
++ {
++ err = PlcrInit(p_FmPcd);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ if (p_FmPcd->p_FmPcdPrs)
++ {
++ err = PrsInit(p_FmPcd);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ if (p_FmPcd->guestId == NCSW_MASTER_ID)
++ {
++ /* register to inter-core messaging mechanism */
++ memset(p_FmPcd->fmPcdModuleName, 0, (sizeof(char)) * MODULE_NAME_SIZE);
++ if (Sprint (p_FmPcd->fmPcdModuleName, "FM_PCD_%d_%d",FmGetId(p_FmPcd->h_Fm),NCSW_MASTER_ID) != 10)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));
++ err = XX_IpcRegisterMsgHandler(p_FmPcd->fmPcdModuleName, IpcMsgHandlerCB, p_FmPcd, FM_PCD_MAX_REPLY_SIZE);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ /* IPv6 Frame-Id used for fragmentation */
++ p_FmPcd->ipv6FrameIdAddr = PTR_TO_UINT(FM_MURAM_AllocMem(p_FmPcd->h_FmMuram, 4, 4));
++ if (!p_FmPcd->ipv6FrameIdAddr)
++ {
++ FM_PCD_Free(p_FmPcd);
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for IPv6 Frame-Id"));
++ }
++ IOMemSet32(UINT_TO_PTR(p_FmPcd->ipv6FrameIdAddr), 0, 4);
++
++ XX_Free(p_FmPcd->p_FmPcdDriverParam);
++ p_FmPcd->p_FmPcdDriverParam = NULL;
++
++ FmRegisterPcd(p_FmPcd->h_Fm, p_FmPcd);
++
++ return E_OK;
++}
++
++t_Error FM_PCD_Free(t_Handle h_FmPcd)
++{
++ t_FmPcd *p_FmPcd =(t_FmPcd *)h_FmPcd;
++ t_Error err = E_OK;
++
++ if (p_FmPcd->ipv6FrameIdAddr)
++ FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, UINT_TO_PTR(p_FmPcd->ipv6FrameIdAddr));
++
++ if (p_FmPcd->enabled)
++ FM_PCD_Disable(p_FmPcd);
++
++ if (p_FmPcd->p_FmPcdDriverParam)
++ {
++ XX_Free(p_FmPcd->p_FmPcdDriverParam);
++ p_FmPcd->p_FmPcdDriverParam = NULL;
++ }
++
++ if (p_FmPcd->p_FmPcdKg)
++ {
++ if ((err = KgFree(p_FmPcd)) != E_OK)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++ XX_Free(p_FmPcd->p_FmPcdKg);
++ p_FmPcd->p_FmPcdKg = NULL;
++ }
++
++ if (p_FmPcd->p_FmPcdPlcr)
++ {
++ if ((err = PlcrFree(p_FmPcd)) != E_OK)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++ XX_Free(p_FmPcd->p_FmPcdPlcr);
++ p_FmPcd->p_FmPcdPlcr = NULL;
++ }
++
++ if (p_FmPcd->p_FmPcdPrs)
++ {
++ if (p_FmPcd->guestId == NCSW_MASTER_ID)
++ PrsFree(p_FmPcd);
++ XX_Free(p_FmPcd->p_FmPcdPrs);
++ p_FmPcd->p_FmPcdPrs = NULL;
++ }
++
++ if (p_FmPcd->h_Hc)
++ {
++ FmHcFree(p_FmPcd->h_Hc);
++ p_FmPcd->h_Hc = NULL;
++ }
++
++ XX_IpcUnregisterMsgHandler(p_FmPcd->fmPcdModuleName);
++
++ FmUnregisterPcd(p_FmPcd->h_Fm);
++
++ ReleaseFreeLocksLst(p_FmPcd);
++
++ if (p_FmPcd->h_Spinlock)
++ XX_FreeSpinlock(p_FmPcd->h_Spinlock);
++
++ if (p_FmPcd->h_ShadowSpinlock)
++ XX_FreeSpinlock(p_FmPcd->h_ShadowSpinlock);
++
++ XX_Free(p_FmPcd);
++
++ return E_OK;
++}
++
++t_Error FM_PCD_ConfigException(t_Handle h_FmPcd, e_FmPcdExceptions exception, bool enable)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ uint32_t bitMask = 0;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++
++ if (p_FmPcd->guestId != NCSW_MASTER_ID)
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_ConfigException - guest mode!"));
++
++ GET_FM_PCD_EXCEPTION_FLAG(bitMask, exception);
++ if (bitMask)
++ {
++ if (enable)
++ p_FmPcd->exceptions |= bitMask;
++ else
++ p_FmPcd->exceptions &= ~bitMask;
++ }
++ else
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
++
++ return E_OK;
++}
++
++t_Error FM_PCD_ConfigHcFramesDataMemory(t_Handle h_FmPcd, uint8_t memId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
++
++ return FmHcSetFramesDataMemory(p_FmPcd->h_Hc, memId);
++}
++
++t_Error FM_PCD_Enable(t_Handle h_FmPcd)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ t_Error err = E_OK;
++
++ SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
++
++ if (p_FmPcd->enabled)
++ return E_OK;
++
++ if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
++ p_FmPcd->h_IpcSession)
++ {
++ uint8_t enabled;
++ t_FmPcdIpcMsg msg;
++ t_FmPcdIpcReply reply;
++ uint32_t replyLength;
++
++ memset(&reply, 0, sizeof(reply));
++ memset(&msg, 0, sizeof(msg));
++ msg.msgId = FM_PCD_MASTER_IS_ENABLED;
++ replyLength = sizeof(uint32_t) + sizeof(enabled);
++ if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
++ (uint8_t*)&msg,
++ sizeof(msg.msgId),
++ (uint8_t*)&reply,
++ &replyLength,
++ NULL,
++ NULL)) != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ if (replyLength != sizeof(uint32_t) + sizeof(enabled))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
++ p_FmPcd->enabled = (bool)!!(*(uint8_t*)(reply.replyBody));
++ if (!p_FmPcd->enabled)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("FM-PCD master should be enabled first!"));
++
++ return E_OK;
++ }
++ else if (p_FmPcd->guestId != NCSW_MASTER_ID)
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
++ ("running in guest-mode without IPC!"));
++
++ if (p_FmPcd->p_FmPcdKg)
++ KgEnable(p_FmPcd);
++
++ if (p_FmPcd->p_FmPcdPlcr)
++ PlcrEnable(p_FmPcd);
++
++ if (p_FmPcd->p_FmPcdPrs)
++ PrsEnable(p_FmPcd);
++
++ p_FmPcd->enabled = TRUE;
++
++ return E_OK;
++}
++
++t_Error FM_PCD_Disable(t_Handle h_FmPcd)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ t_Error err = E_OK;
++
++ SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
++
++ if (!p_FmPcd->enabled)
++ return E_OK;
++
++ if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
++ p_FmPcd->h_IpcSession)
++ {
++ t_FmPcdIpcMsg msg;
++ t_FmPcdIpcReply reply;
++ uint32_t replyLength;
++
++ memset(&reply, 0, sizeof(reply));
++ memset(&msg, 0, sizeof(msg));
++ msg.msgId = FM_PCD_GUEST_DISABLE;
++ replyLength = sizeof(uint32_t);
++ if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
++ (uint8_t*)&msg,
++ sizeof(msg.msgId),
++ (uint8_t*)&reply,
++ &replyLength,
++ NULL,
++ NULL)) != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ if (replyLength != sizeof(uint32_t))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
++ if (reply.error == E_OK)
++ p_FmPcd->enabled = FALSE;
++
++ return (t_Error)(reply.error);
++ }
++ else if (p_FmPcd->guestId != NCSW_MASTER_ID)
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
++ ("running in guest-mode without IPC!"));
++
++ if (p_FmPcd->numOfEnabledGuestPartitionsPcds != 0)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE,
++ ("Trying to disable a master partition PCD while"
++ "guest partitions are still enabled!"));
++
++ if (p_FmPcd->p_FmPcdKg)
++ KgDisable(p_FmPcd);
++
++ if (p_FmPcd->p_FmPcdPlcr)
++ PlcrDisable(p_FmPcd);
++
++ if (p_FmPcd->p_FmPcdPrs)
++ PrsDisable(p_FmPcd);
++
++ p_FmPcd->enabled = FALSE;
++
++ return E_OK;
++}
++
++t_Handle FM_PCD_NetEnvCharacteristicsSet(t_Handle h_FmPcd, t_FmPcdNetEnvParams *p_NetEnvParams)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ uint32_t intFlags, specialUnits = 0;
++ uint8_t bitId = 0;
++ uint8_t i, j, k;
++ uint8_t netEnvCurrId;
++ uint8_t ipsecAhUnit = 0,ipsecEspUnit = 0;
++ bool ipsecAhExists = FALSE, ipsecEspExists = FALSE, shim1Selected = FALSE;
++ uint8_t hdrNum;
++ t_FmPcdNetEnvParams *p_modifiedNetEnvParams;
++
++ SANITY_CHECK_RETURN_VALUE(h_FmPcd, E_INVALID_STATE, NULL);
++ SANITY_CHECK_RETURN_VALUE(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE, NULL);
++ SANITY_CHECK_RETURN_VALUE(p_NetEnvParams, E_NULL_POINTER, NULL);
++
++ intFlags = FmPcdLock(p_FmPcd);
++
++ /* find a new netEnv */
++ for (i = 0; i < FM_MAX_NUM_OF_PORTS; i++)
++ if (!p_FmPcd->netEnvs[i].used)
++ break;
++
++ if (i== FM_MAX_NUM_OF_PORTS)
++ {
++ REPORT_ERROR(MAJOR, E_FULL,("No more than %d netEnv's allowed.", FM_MAX_NUM_OF_PORTS));
++ FmPcdUnlock(p_FmPcd, intFlags);
++ return NULL;
++ }
++
++ p_FmPcd->netEnvs[i].used = TRUE;
++ FmPcdUnlock(p_FmPcd, intFlags);
++
++ /* As anyone doesn't have handle of this netEnv yet, no need
++ to protect it with spinlocks */
++
++ p_modifiedNetEnvParams = (t_FmPcdNetEnvParams *) XX_Malloc(sizeof(t_FmPcdNetEnvParams));
++ if (!p_modifiedNetEnvParams)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FmPcdNetEnvParams"));
++ return NULL;
++ }
++
++ memcpy(p_modifiedNetEnvParams, p_NetEnvParams, sizeof(t_FmPcdNetEnvParams));
++ p_NetEnvParams = p_modifiedNetEnvParams;
++
++ netEnvCurrId = (uint8_t)i;
++
++ /* clear from previous use */
++ memset(&p_FmPcd->netEnvs[netEnvCurrId].units, 0, FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS * sizeof(t_FmPcdIntDistinctionUnit));
++ memset(&p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs, 0, FM_PCD_MAX_NUM_OF_ALIAS_HDRS * sizeof(t_FmPcdNetEnvAliases));
++ memcpy(&p_FmPcd->netEnvs[netEnvCurrId].units, p_NetEnvParams->units, p_NetEnvParams->numOfDistinctionUnits*sizeof(t_FmPcdIntDistinctionUnit));
++
++ p_FmPcd->netEnvs[netEnvCurrId].netEnvId = netEnvCurrId;
++ p_FmPcd->netEnvs[netEnvCurrId].h_FmPcd = p_FmPcd;
++
++ p_FmPcd->netEnvs[netEnvCurrId].clsPlanGrpId = ILLEGAL_CLS_PLAN;
++
++ /* check that header with opt is not interchanged with the same header */
++ for (i = 0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
++ && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)
++ {
++ for (k = 0; (k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS)
++ && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE); k++)
++ {
++ /* if an option exists, check that other headers are not the same header
++ without option */
++ if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt)
++ {
++ for (j = 0; (j < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS)
++ && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[j].hdr != HEADER_TYPE_NONE); j++)
++ {
++ if ((p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[j].hdr == p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr) &&
++ !p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[j].opt)
++ {
++ REPORT_ERROR(MINOR, E_FULL,
++ ("Illegal unit - header with opt may not be interchangeable with the same header without opt"));
++ XX_Free(p_modifiedNetEnvParams);
++ return NULL;
++ }
++ }
++ }
++ }
++ }
++
++ /* Specific headers checking */
++ for (i = 0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
++ && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)
++ {
++ for (k = 0; (k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS)
++ && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE); k++)
++ {
++ /* Some headers pairs may not be defined on different units as the parser
++ doesn't distinguish */
++ /* IPSEC_AH and IPSEC_SPI can't be 2 units, */
++ /* check that header with opt is not interchanged with the same header */
++ if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_IPSEC_AH)
++ {
++ if (ipsecEspExists && (ipsecEspUnit != i))
++ {
++ REPORT_ERROR(MINOR, E_INVALID_STATE, ("HEADER_TYPE_IPSEC_AH and HEADER_TYPE_IPSEC_ESP may not be defined in separate units"));
++ XX_Free(p_modifiedNetEnvParams);
++ return NULL;
++ }
++ else
++ {
++ ipsecAhUnit = i;
++ ipsecAhExists = TRUE;
++ }
++ }
++ if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_IPSEC_ESP)
++ {
++ if (ipsecAhExists && (ipsecAhUnit != i))
++ {
++ REPORT_ERROR(MINOR, E_INVALID_STATE, ("HEADER_TYPE_IPSEC_AH and HEADER_TYPE_IPSEC_ESP may not be defined in separate units"));
++ XX_Free(p_modifiedNetEnvParams);
++ return NULL;
++ }
++ else
++ {
++ ipsecEspUnit = i;
++ ipsecEspExists = TRUE;
++ }
++ }
++ /* ENCAP_ESP */
++ if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_UDP_ENCAP_ESP)
++ {
++ /* IPSec UDP encapsulation is currently set to use SHIM1 */
++ p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].hdr = HEADER_TYPE_UDP_ENCAP_ESP;
++ p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits++].aliasHdr = HEADER_TYPE_USER_DEFINED_SHIM1;
++ p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr = HEADER_TYPE_USER_DEFINED_SHIM1;
++ p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt = 0;
++ }
++#ifdef FM_CAPWAP_SUPPORT
++ /* UDP_LITE */
++ if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_UDP_LITE)
++ {
++ /* IPSec UDP encapsulation is currently set to use SHIM1 */
++ p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].hdr = HEADER_TYPE_UDP_LITE;
++ p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits++].aliasHdr = HEADER_TYPE_UDP;
++ p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr = HEADER_TYPE_UDP;
++ p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt = 0;
++ }
++#endif /* FM_CAPWAP_SUPPORT */
++
++ /* IP FRAG */
++ if ((p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_IPv4) &&
++ (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt == IPV4_FRAG_1))
++ {
++ /* If IPv4+Frag, we need to set 2 units - SHIM 2 and IPv4. We first set SHIM2, and than check if
++ * IPv4 exists. If so we don't need to set an extra unit
++ * We consider as "having IPv4" any IPv4 without interchangable headers
++ * but including any options. */
++ p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].hdr = HEADER_TYPE_IPv4;
++ p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].opt = IPV4_FRAG_1;
++ p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits++].aliasHdr = HEADER_TYPE_USER_DEFINED_SHIM2;
++ p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr = HEADER_TYPE_USER_DEFINED_SHIM2;
++ p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt = 0;
++
++ /* check if IPv4 header exists by itself */
++ if (FmPcdNetEnvGetUnitId(p_FmPcd, netEnvCurrId, HEADER_TYPE_IPv4, FALSE, 0) == FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
++ {
++ p_FmPcd->netEnvs[netEnvCurrId].units[p_NetEnvParams->numOfDistinctionUnits].hdrs[0].hdr = HEADER_TYPE_IPv4;
++ p_FmPcd->netEnvs[netEnvCurrId].units[p_NetEnvParams->numOfDistinctionUnits++].hdrs[0].opt = 0;
++ }
++ }
++ if ((p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_IPv6) &&
++ (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt == IPV6_FRAG_1))
++ {
++ /* If IPv6+Frag, we need to set 2 units - SHIM 2 and IPv6. We first set SHIM2, and than check if
++ * IPv4 exists. If so we don't need to set an extra unit
++ * We consider as "having IPv6" any IPv6 without interchangable headers
++ * but including any options. */
++ p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].hdr = HEADER_TYPE_IPv6;
++ p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].opt = IPV6_FRAG_1;
++ p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits++].aliasHdr = HEADER_TYPE_USER_DEFINED_SHIM2;
++ p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr = HEADER_TYPE_USER_DEFINED_SHIM2;
++ p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt = 0;
++
++ /* check if IPv6 header exists by itself */
++ if (FmPcdNetEnvGetUnitId(p_FmPcd, netEnvCurrId, HEADER_TYPE_IPv6, FALSE, 0) == FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
++ {
++ p_FmPcd->netEnvs[netEnvCurrId].units[p_NetEnvParams->numOfDistinctionUnits].hdrs[0].hdr = HEADER_TYPE_IPv6;
++ p_FmPcd->netEnvs[netEnvCurrId].units[p_NetEnvParams->numOfDistinctionUnits++].hdrs[0].opt = 0;
++ }
++ }
++ }
++ }
++
++ /* if private header (shim), check that no other headers specified */
++ for (i = 0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
++ && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)
++ {
++ if (IS_PRIVATE_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr))
++ if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[1].hdr != HEADER_TYPE_NONE)
++ {
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("SHIM header may not be interchanged with other headers"));
++ XX_Free(p_modifiedNetEnvParams);
++ return NULL;
++ }
++ }
++
++ for (i = 0; i < p_NetEnvParams->numOfDistinctionUnits; i++)
++ {
++ if (IS_PRIVATE_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr))
++ switch (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr)
++ {
++ case (HEADER_TYPE_USER_DEFINED_SHIM1):
++ if (shim1Selected)
++ {
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("SHIM header cannot be selected with UDP_IPSEC_ESP"));
++ XX_Free(p_modifiedNetEnvParams);
++ return NULL;
++ }
++ shim1Selected = TRUE;
++ p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i] = 0x00000001;
++ break;
++ case (HEADER_TYPE_USER_DEFINED_SHIM2):
++ p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i] = 0x00000002;
++ break;
++ default:
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Requested SHIM not supported"));
++ }
++ else
++ {
++ p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i] = (uint32_t)(0x80000000 >> bitId++);
++
++ if (IS_SPECIAL_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr))
++ p_FmPcd->netEnvs[netEnvCurrId].macsecVector = p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i];
++ }
++ }
++
++ /* define a set of hardware parser LCV's according to the defined netenv */
++
++ /* set an array of LCV's for each header in the netEnv */
++ for (i = 0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
++ && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)
++ {
++ /* private headers have no LCV in the hard parser */
++ if (!IS_PRIVATE_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr))
++ {
++ for (k = 0; (k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS)
++ && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE); k++)
++ {
++ GET_PRS_HDR_NUM(hdrNum, p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr);
++ if ((hdrNum == ILLEGAL_HDR_NUM) || (hdrNum == NO_HDR_NUM))
++ {
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, NO_MSG);
++ XX_Free(p_modifiedNetEnvParams);
++ return NULL;
++ }
++ p_FmPcd->netEnvs[netEnvCurrId].lcvs[hdrNum] |= p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i];
++ }
++ }
++ }
++ XX_Free(p_modifiedNetEnvParams);
++
++ p_FmPcd->netEnvs[netEnvCurrId].h_Spinlock = XX_InitSpinlock();
++ if (!p_FmPcd->netEnvs[netEnvCurrId].h_Spinlock)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Pcd NetEnv spinlock"));
++ return NULL;
++ }
++ return &p_FmPcd->netEnvs[netEnvCurrId];
++}
++
++t_Error FM_PCD_NetEnvCharacteristicsDelete(t_Handle h_NetEnv)
++{
++ t_FmPcdNetEnv *p_NetEnv = (t_FmPcdNetEnv*)h_NetEnv;
++ t_FmPcd *p_FmPcd = p_NetEnv->h_FmPcd;
++ uint32_t intFlags;
++ uint8_t netEnvId = p_NetEnv->netEnvId;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
++
++ /* check that no port is bound to this netEnv */
++ if (p_FmPcd->netEnvs[netEnvId].owners)
++ {
++ RETURN_ERROR(MINOR, E_INVALID_STATE,
++ ("Trying to delete a netEnv that has ports/schemes/trees/clsPlanGrps bound to"));
++ }
++
++ intFlags = FmPcdLock(p_FmPcd);
++
++ p_FmPcd->netEnvs[netEnvId].used = FALSE;
++ p_FmPcd->netEnvs[netEnvId].clsPlanGrpId = ILLEGAL_CLS_PLAN;
++
++ memset(p_FmPcd->netEnvs[netEnvId].units, 0, sizeof(t_FmPcdIntDistinctionUnit)*FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS);
++ memset(p_FmPcd->netEnvs[netEnvId].unitsVectors, 0, sizeof(uint32_t)*FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS);
++ memset(p_FmPcd->netEnvs[netEnvId].lcvs, 0, sizeof(uint32_t)*FM_PCD_PRS_NUM_OF_HDRS);
++
++ if (p_FmPcd->netEnvs[netEnvId].h_Spinlock)
++ XX_FreeSpinlock(p_FmPcd->netEnvs[netEnvId].h_Spinlock);
++
++ FmPcdUnlock(p_FmPcd, intFlags);
++ return E_OK;
++}
++
++void FM_PCD_HcTxConf(t_Handle h_FmPcd, t_DpaaFD *p_Fd)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ SANITY_CHECK_RETURN(h_FmPcd, E_INVALID_STATE);
++
++ FmHcTxConf(p_FmPcd->h_Hc, p_Fd);
++}
++
++t_Error FM_PCD_SetAdvancedOffloadSupport(t_Handle h_FmPcd)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ t_FmCtrlCodeRevisionInfo revInfo;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPcd->enabled, E_INVALID_STATE);
++
++ if ((err = FM_GetFmanCtrlCodeRevision(p_FmPcd->h_Fm, &revInfo)) != E_OK)
++ {
++ DBG(WARNING, ("FM in guest-mode without IPC, can't validate firmware revision."));
++ revInfo.packageRev = IP_OFFLOAD_PACKAGE_NUMBER;
++ }
++ if (revInfo.packageRev != IP_OFFLOAD_PACKAGE_NUMBER)
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("Fman ctrl code package"));
++
++ p_FmPcd->advancedOffloadSupport = TRUE;
++
++ return E_OK;
++}
++
++uint32_t FM_PCD_GetCounter(t_Handle h_FmPcd, e_FmPcdCounters counter)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ uint32_t outCounter = 0;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_VALUE(h_FmPcd, E_INVALID_HANDLE, 0);
++ SANITY_CHECK_RETURN_VALUE(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE, 0);
++
++ switch (counter)
++ {
++ case (e_FM_PCD_KG_COUNTERS_TOTAL):
++ if (!p_FmPcd->p_FmPcdKg)
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_STATE, ("KeyGen is not activated"));
++ return 0;
++ }
++ if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
++ !p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs &&
++ !p_FmPcd->h_IpcSession)
++ {
++ REPORT_ERROR(MINOR, E_NOT_SUPPORTED,
++ ("running in guest-mode without neither IPC nor mapped register!"));
++ return 0;
++ }
++ break;
++
++ case (e_FM_PCD_PLCR_COUNTERS_YELLOW):
++ case (e_FM_PCD_PLCR_COUNTERS_RED):
++ case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED):
++ case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW):
++ case (e_FM_PCD_PLCR_COUNTERS_TOTAL):
++ case (e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH):
++ if (!p_FmPcd->p_FmPcdPlcr)
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Policer is not activated"));
++ return 0;
++ }
++ if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
++ !p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs &&
++ !p_FmPcd->h_IpcSession)
++ {
++ REPORT_ERROR(MINOR, E_NOT_SUPPORTED,
++ ("running in \"guest-mode\" without neither IPC nor mapped register!"));
++ return 0;
++ }
++
++ /* check that counters are enabled */
++ if (p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs &&
++ !(GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_gcr) & FM_PCD_PLCR_GCR_STEN))
++ {
++ REPORT_ERROR(MINOR, E_INVALID_STATE, ("Requested counter was not enabled"));
++ return 0;
++ }
++ ASSERT_COND(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs ||
++ ((p_FmPcd->guestId != NCSW_MASTER_ID) && p_FmPcd->h_IpcSession));
++ break;
++
++ case (e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH):
++ case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED):
++ case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED):
++ case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED):
++ case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED):
++ case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR):
++ case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR):
++ case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR):
++ case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR):
++ case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES):
++ case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES):
++ case (e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES):
++ case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES):
++ case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES):
++ case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES):
++ case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES):
++ case (e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES):
++ if (!p_FmPcd->p_FmPcdPrs)
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Parser is not activated"));
++ return 0;
++ }
++ if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
++ !p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs &&
++ !p_FmPcd->h_IpcSession)
++ {
++ REPORT_ERROR(MINOR, E_NOT_SUPPORTED,
++ ("running in guest-mode without neither IPC nor mapped register!"));
++ return 0;
++ }
++ break;
++ default:
++ REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Unsupported type of counter"));
++ return 0;
++ }
++
++ if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
++ p_FmPcd->h_IpcSession)
++ {
++ t_FmPcdIpcMsg msg;
++ t_FmPcdIpcReply reply;
++ uint32_t replyLength;
++
++ memset(&msg, 0, sizeof(msg));
++ memset(&reply, 0, sizeof(reply));
++ msg.msgId = FM_PCD_GET_COUNTER;
++ memcpy(msg.msgBody, (uint8_t *)&counter, sizeof(uint32_t));
++ replyLength = sizeof(uint32_t) + sizeof(uint32_t);
++ if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
++ (uint8_t*)&msg,
++ sizeof(msg.msgId) +sizeof(uint32_t),
++ (uint8_t*)&reply,
++ &replyLength,
++ NULL,
++ NULL)) != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ if (replyLength != sizeof(uint32_t) + sizeof(uint32_t))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
++
++ memcpy((uint8_t*)&outCounter, reply.replyBody, sizeof(uint32_t));
++ return outCounter;
++ }
++
++ switch (counter)
++ {
++ /* Parser statistics */
++ case (e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH):
++ return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_pds);
++ case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED):
++ return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l2rrs);
++ case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED):
++ return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l3rrs);
++ case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED):
++ return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l4rrs);
++ case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED):
++ return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_srrs);
++ case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR):
++ return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l2rres);
++ case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR):
++ return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l3rres);
++ case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR):
++ return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l4rres);
++ case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR):
++ return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_srres);
++ case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES):
++ return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_spcs);
++ case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES):
++ return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_spscs);
++ case (e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES):
++ return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_hxscs);
++ case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES):
++ return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mrcs);
++ case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES):
++ return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mrscs);
++ case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES):
++ return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mwcs);
++ case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES):
++ return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mwscs);
++ case (e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES):
++ return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_fcscs);
++ case (e_FM_PCD_KG_COUNTERS_TOTAL):
++ return GET_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_tpc);
++
++ /* Policer statistics */
++ case (e_FM_PCD_PLCR_COUNTERS_YELLOW):
++ return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ypcnt);
++ case (e_FM_PCD_PLCR_COUNTERS_RED):
++ return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rpcnt);
++ case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED):
++ return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rrpcnt);
++ case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW):
++ return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rypcnt);
++ case (e_FM_PCD_PLCR_COUNTERS_TOTAL):
++ return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_tpcnt);
++ case (e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH):
++ return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_flmcnt);
++
++ default:
++ REPORT_ERROR(MINOR, E_INVALID_STATE, ("Unsupported type of counter"));
++ return 0;
++ }
++}
++
++#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
++t_Error FM_PCD_DumpRegs(t_Handle h_FmPcd)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ t_Error err = E_OK;
++
++ DECLARE_DUMP;
++
++ SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
++
++ if (p_FmPcd->p_FmPcdKg)
++ err |= FM_PCD_KgDumpRegs(h_FmPcd);
++ if (p_FmPcd->p_FmPcdPlcr)
++ err |= FM_PCD_PlcrDumpRegs(h_FmPcd);
++ if (p_FmPcd->p_FmPcdPrs)
++ err |= FM_PCD_PrsDumpRegs(h_FmPcd);
++
++ return err;
++}
++
++t_Error FM_PCD_HcDumpRegs(t_Handle h_FmPcd)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ DECLARE_DUMP;
++
++ SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_STATE);
++
++ return FmHcDumpRegs(p_FmPcd->h_Hc);
++}
++#endif /* (defined(DEBUG_ERRORS) && ... */
++
++t_Error FM_PCD_SetException(t_Handle h_FmPcd, e_FmPcdExceptions exception, bool enable)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ uint32_t bitMask = 0, tmpReg;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
++
++ if (p_FmPcd->guestId != NCSW_MASTER_ID)
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_SetException - guest mode!"));
++
++ GET_FM_PCD_EXCEPTION_FLAG(bitMask, exception);
++
++ if (bitMask)
++ {
++ if (enable)
++ p_FmPcd->exceptions |= bitMask;
++ else
++ p_FmPcd->exceptions &= ~bitMask;
++
++ switch (exception)
++ {
++ case (e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC):
++ case (e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW):
++ if (!p_FmPcd->p_FmPcdKg)
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - keygen is not working"));
++ break;
++ case (e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC):
++ case (e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR):
++ case (e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE):
++ case (e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE):
++ if (!p_FmPcd->p_FmPcdPlcr)
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - policer is not working"));
++ break;
++ case (e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC):
++ case (e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC):
++ if (!p_FmPcd->p_FmPcdPrs)
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - parser is not working"));
++ break;
++ default:
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Unsupported exception"));
++
++ }
++
++ switch (exception)
++ {
++ case (e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC):
++ tmpReg = GET_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_eeer);
++ if (enable)
++ tmpReg |= FM_EX_KG_DOUBLE_ECC;
++ else
++ tmpReg &= ~FM_EX_KG_DOUBLE_ECC;
++ WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_eeer, tmpReg);
++ break;
++ case (e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW):
++ tmpReg = GET_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_eeer);
++ if (enable)
++ tmpReg |= FM_EX_KG_KEYSIZE_OVERFLOW;
++ else
++ tmpReg &= ~FM_EX_KG_KEYSIZE_OVERFLOW;
++ WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_eeer, tmpReg);
++ break;
++ case (e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC):
++ tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_perer);
++ if (enable)
++ tmpReg |= FM_PCD_PRS_DOUBLE_ECC;
++ else
++ tmpReg &= ~FM_PCD_PRS_DOUBLE_ECC;
++ WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_perer, tmpReg);
++ break;
++ case (e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC):
++ tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_pever);
++ if (enable)
++ tmpReg |= FM_PCD_PRS_SINGLE_ECC;
++ else
++ tmpReg &= ~FM_PCD_PRS_SINGLE_ECC;
++ WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_pever, tmpReg);
++ break;
++ case (e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC):
++ tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier);
++ if (enable)
++ tmpReg |= FM_PCD_PLCR_DOUBLE_ECC;
++ else
++ tmpReg &= ~FM_PCD_PLCR_DOUBLE_ECC;
++ WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier, tmpReg);
++ break;
++ case (e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR):
++ tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier);
++ if (enable)
++ tmpReg |= FM_PCD_PLCR_INIT_ENTRY_ERROR;
++ else
++ tmpReg &= ~FM_PCD_PLCR_INIT_ENTRY_ERROR;
++ WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier, tmpReg);
++ break;
++ case (e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE):
++ tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier);
++ if (enable)
++ tmpReg |= FM_PCD_PLCR_PRAM_SELF_INIT_COMPLETE;
++ else
++ tmpReg &= ~FM_PCD_PLCR_PRAM_SELF_INIT_COMPLETE;
++ WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier, tmpReg);
++ break;
++ case (e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE):
++ tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier);
++ if (enable)
++ tmpReg |= FM_PCD_PLCR_ATOMIC_ACTION_COMPLETE;
++ else
++ tmpReg &= ~FM_PCD_PLCR_ATOMIC_ACTION_COMPLETE;
++ WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier, tmpReg);
++ break;
++ default:
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Unsupported exception"));
++ }
++ /* for ECC exceptions driver automatically enables ECC mechanism, if disabled.
++ Driver may disable them automatically, depending on driver's status */
++ if (enable && ( (exception == e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC) |
++ (exception == e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC) |
++ (exception == e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC) |
++ (exception == e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC)))
++ FmEnableRamsEcc(p_FmPcd->h_Fm);
++ if (!enable && ( (exception == e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC) |
++ (exception == e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC) |
++ (exception == e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC) |
++ (exception == e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC)))
++ FmDisableRamsEcc(p_FmPcd->h_Fm);
++ }
++ else
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
++
++ return E_OK;
++}
++
++t_Error FM_PCD_ForceIntr (t_Handle h_FmPcd, e_FmPcdExceptions exception)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
++
++ if (p_FmPcd->guestId != NCSW_MASTER_ID)
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_ForceIntr - guest mode!"));
++
++ switch (exception)
++ {
++ case (e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC):
++ case (e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW):
++ if (!p_FmPcd->p_FmPcdKg)
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - keygen is not working"));
++ break;
++ case (e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC):
++ case (e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR):
++ case (e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE):
++ case (e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE):
++ if (!p_FmPcd->p_FmPcdPlcr)
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - policer is not working"));
++ break;
++ case (e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC):
++ case (e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC):
++ if (!p_FmPcd->p_FmPcdPrs)
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt -parsrer is not working"));
++ break;
++ default:
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Invalid interrupt requested"));
++
++ }
++ switch (exception)
++ {
++ case e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC:
++ if (!(p_FmPcd->exceptions & FM_PCD_EX_PRS_DOUBLE_ECC))
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
++ break;
++ case e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC:
++ if (!(p_FmPcd->exceptions & FM_PCD_EX_PRS_SINGLE_ECC))
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
++ break;
++ case e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC:
++ if (!(p_FmPcd->exceptions & FM_EX_KG_DOUBLE_ECC))
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
++ WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_feer, FM_EX_KG_DOUBLE_ECC);
++ break;
++ case e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW:
++ if (!(p_FmPcd->exceptions & FM_EX_KG_KEYSIZE_OVERFLOW))
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
++ WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_feer, FM_EX_KG_KEYSIZE_OVERFLOW);
++ break;
++ case e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC:
++ if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_DOUBLE_ECC))
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
++ WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eifr, FM_PCD_PLCR_DOUBLE_ECC);
++ break;
++ case e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR:
++ if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_INIT_ENTRY_ERROR))
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
++ WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eifr, FM_PCD_PLCR_INIT_ENTRY_ERROR);
++ break;
++ case e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE:
++ if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_PRAM_SELF_INIT_COMPLETE))
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
++ WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ifr, FM_PCD_PLCR_PRAM_SELF_INIT_COMPLETE);
++ break;
++ case e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE:
++ if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_ATOMIC_ACTION_COMPLETE))
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
++ WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ifr, FM_PCD_PLCR_ATOMIC_ACTION_COMPLETE);
++ break;
++ default:
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception may not be forced"));
++ }
++
++ return E_OK;
++}
++
++
++t_Error FM_PCD_ModifyCounter(t_Handle h_FmPcd, e_FmPcdCounters counter, uint32_t value)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
++
++ if (p_FmPcd->guestId != NCSW_MASTER_ID)
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_ModifyCounter - guest mode!"));
++
++ switch (counter)
++ {
++ case (e_FM_PCD_KG_COUNTERS_TOTAL):
++ if (!p_FmPcd->p_FmPcdKg)
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Invalid counters - KeyGen is not working"));
++ break;
++ case (e_FM_PCD_PLCR_COUNTERS_YELLOW):
++ case (e_FM_PCD_PLCR_COUNTERS_RED):
++ case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED):
++ case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW):
++ case (e_FM_PCD_PLCR_COUNTERS_TOTAL):
++ case (e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH):
++ if (!p_FmPcd->p_FmPcdPlcr)
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Invalid counters - Policer is not working"));
++ if (!(GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_gcr) & FM_PCD_PLCR_GCR_STEN))
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Requested counter was not enabled"));
++ break;
++ case (e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH):
++ case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED):
++ case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED):
++ case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED):
++ case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED):
++ case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR):
++ case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR):
++ case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR):
++ case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR):
++ case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES):
++ case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES):
++ case (e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES):
++ case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES):
++ case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES):
++ case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES):
++ case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES):
++ case (e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES):
++ if (!p_FmPcd->p_FmPcdPrs)
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Unsupported type of counter"));
++ break;
++ default:
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Unsupported type of counter"));
++ }
++ switch (counter)
++ {
++ case (e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH):
++ WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_pds, value);
++ break;
++ case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED):
++ WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l2rrs, value);
++ break;
++ case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED):
++ WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l3rrs, value);
++ break;
++ case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED):
++ WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l4rrs, value);
++ break;
++ case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED):
++ WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_srrs, value);
++ break;
++ case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR):
++ WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l2rres, value);
++ break;
++ case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR):
++ WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l3rres, value);
++ break;
++ case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR):
++ WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l4rres, value);
++ break;
++ case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR):
++ WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_srres, value);
++ break;
++ case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES):
++ WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_spcs, value);
++ break;
++ case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES):
++ WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_spscs, value);
++ break;
++ case (e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES):
++ WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_hxscs, value);
++ break;
++ case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES):
++ WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mrcs, value);
++ break;
++ case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES):
++ WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mrscs, value);
++ break;
++ case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES):
++ WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mwcs, value);
++ break;
++ case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES):
++ WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mwscs, value);
++ break;
++ case (e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES):
++ WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_fcscs, value);
++ break;
++ case (e_FM_PCD_KG_COUNTERS_TOTAL):
++ WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_tpc,value);
++ break;
++
++ /*Policer counters*/
++ case (e_FM_PCD_PLCR_COUNTERS_YELLOW):
++ WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ypcnt, value);
++ break;
++ case (e_FM_PCD_PLCR_COUNTERS_RED):
++ WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rpcnt, value);
++ break;
++ case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED):
++ WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rrpcnt, value);
++ break;
++ case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW):
++ WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rypcnt, value);
++ break;
++ case (e_FM_PCD_PLCR_COUNTERS_TOTAL):
++ WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_tpcnt, value);
++ break;
++ case (e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH):
++ WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_flmcnt, value);
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Unsupported type of counter"));
++ }
++
++ return E_OK;
++}
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_pcd.h b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_pcd.h
+new file mode 100644
+index 0000000..b6b9b35
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_pcd.h
+@@ -0,0 +1,540 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File fm_pcd.h
++
++ @Description FM PCD ...
++*//***************************************************************************/
++#ifndef __FM_PCD_H
++#define __FM_PCD_H
++
++#include "std_ext.h"
++#include "error_ext.h"
++#include "list_ext.h"
++#include "fm_pcd_ext.h"
++#include "fm_common.h"
++#include "fsl_fman_prs.h"
++#include "fsl_fman_kg.h"
++
++#define __ERR_MODULE__ MODULE_FM_PCD
++
++
++/****************************/
++/* Defaults */
++/****************************/
++#define DEFAULT_plcrAutoRefresh FALSE
++#define DEFAULT_fmPcdKgErrorExceptions (FM_EX_KG_DOUBLE_ECC | FM_EX_KG_KEYSIZE_OVERFLOW)
++#define DEFAULT_fmPcdPlcrErrorExceptions (FM_PCD_EX_PLCR_DOUBLE_ECC | FM_PCD_EX_PLCR_INIT_ENTRY_ERROR)
++#define DEFAULT_fmPcdPlcrExceptions 0
++#define DEFAULT_fmPcdPrsErrorExceptions (FM_PCD_EX_PRS_DOUBLE_ECC)
++
++#define DEFAULT_fmPcdPrsExceptions FM_PCD_EX_PRS_SINGLE_ECC
++#define DEFAULT_numOfUsedProfilesPerWindow 16
++#define DEFAULT_numOfSharedPlcrProfiles 4
++
++/****************************/
++/* Network defines */
++/****************************/
++#define UDP_HEADER_SIZE 8
++
++#define ESP_SPI_OFFSET 0
++#define ESP_SPI_SIZE 4
++#define ESP_SEQ_NUM_OFFSET ESP_SPI_SIZE
++#define ESP_SEQ_NUM_SIZE 4
++
++/****************************/
++/* General defines */
++/****************************/
++#define ILLEGAL_CLS_PLAN 0xff
++#define ILLEGAL_NETENV 0xff
++
++#define FM_PCD_MAX_NUM_OF_ALIAS_HDRS 3
++
++/****************************/
++/* Error defines */
++/****************************/
++
++#define FM_PCD_EX_PLCR_DOUBLE_ECC 0x20000000
++#define FM_PCD_EX_PLCR_INIT_ENTRY_ERROR 0x10000000
++#define FM_PCD_EX_PLCR_PRAM_SELF_INIT_COMPLETE 0x08000000
++#define FM_PCD_EX_PLCR_ATOMIC_ACTION_COMPLETE 0x04000000
++
++#define GET_FM_PCD_EXCEPTION_FLAG(bitMask, exception) \
++switch (exception){ \
++ case e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC: \
++ bitMask = FM_EX_KG_DOUBLE_ECC; break; \
++ case e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC: \
++ bitMask = FM_PCD_EX_PLCR_DOUBLE_ECC; break; \
++ case e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW: \
++ bitMask = FM_EX_KG_KEYSIZE_OVERFLOW; break; \
++ case e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR: \
++ bitMask = FM_PCD_EX_PLCR_INIT_ENTRY_ERROR; break; \
++ case e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE: \
++ bitMask = FM_PCD_EX_PLCR_PRAM_SELF_INIT_COMPLETE; break; \
++ case e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE: \
++ bitMask = FM_PCD_EX_PLCR_ATOMIC_ACTION_COMPLETE; break; \
++ case e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC: \
++ bitMask = FM_PCD_EX_PRS_DOUBLE_ECC; break; \
++ case e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC: \
++ bitMask = FM_PCD_EX_PRS_SINGLE_ECC; break; \
++ default: bitMask = 0;break;}
++
++/***********************************************************************/
++/* Policer defines */
++/***********************************************************************/
++#define FM_PCD_PLCR_GCR_STEN 0x40000000
++#define FM_PCD_PLCR_DOUBLE_ECC 0x80000000
++#define FM_PCD_PLCR_INIT_ENTRY_ERROR 0x40000000
++#define FM_PCD_PLCR_PRAM_SELF_INIT_COMPLETE 0x80000000
++#define FM_PCD_PLCR_ATOMIC_ACTION_COMPLETE 0x40000000
++
++/***********************************************************************/
++/* Memory map */
++/***********************************************************************/
++#if defined(__MWERKS__) && !defined(__GNUC__)
++#pragma pack(push,1)
++#endif /* defined(__MWERKS__) && ... */
++
++
++typedef _Packed struct {
++/* General Configuration and Status Registers */
++ volatile uint32_t fmpl_gcr; /* 0x000 FMPL_GCR - FM Policer General Configuration */
++ volatile uint32_t fmpl_gsr; /* 0x004 FMPL_GSR - FM Policer Global Status Register */
++ volatile uint32_t fmpl_evr; /* 0x008 FMPL_EVR - FM Policer Event Register */
++ volatile uint32_t fmpl_ier; /* 0x00C FMPL_IER - FM Policer Interrupt Enable Register */
++ volatile uint32_t fmpl_ifr; /* 0x010 FMPL_IFR - FM Policer Interrupt Force Register */
++ volatile uint32_t fmpl_eevr; /* 0x014 FMPL_EEVR - FM Policer Error Event Register */
++ volatile uint32_t fmpl_eier; /* 0x018 FMPL_EIER - FM Policer Error Interrupt Enable Register */
++ volatile uint32_t fmpl_eifr; /* 0x01C FMPL_EIFR - FM Policer Error Interrupt Force Register */
++/* Global Statistic Counters */
++ volatile uint32_t fmpl_rpcnt; /* 0x020 FMPL_RPC - FM Policer RED Packets Counter */
++ volatile uint32_t fmpl_ypcnt; /* 0x024 FMPL_YPC - FM Policer YELLOW Packets Counter */
++ volatile uint32_t fmpl_rrpcnt; /* 0x028 FMPL_RRPC - FM Policer Recolored RED Packet Counter */
++ volatile uint32_t fmpl_rypcnt; /* 0x02C FMPL_RYPC - FM Policer Recolored YELLOW Packet Counter */
++ volatile uint32_t fmpl_tpcnt; /* 0x030 FMPL_TPC - FM Policer Total Packet Counter */
++ volatile uint32_t fmpl_flmcnt; /* 0x034 FMPL_FLMC - FM Policer Frame Length Mismatch Counter */
++ volatile uint32_t fmpl_res0[21]; /* 0x038 - 0x08B Reserved */
++/* Profile RAM Access Registers */
++ volatile uint32_t fmpl_par; /* 0x08C FMPL_PAR - FM Policer Profile Action Register*/
++ t_FmPcdPlcrProfileRegs profileRegs;
++/* Error Capture Registers */
++ volatile uint32_t fmpl_serc; /* 0x100 FMPL_SERC - FM Policer Soft Error Capture */
++ volatile uint32_t fmpl_upcr; /* 0x104 FMPL_UPCR - FM Policer Uninitialized Profile Capture Register */
++ volatile uint32_t fmpl_res2; /* 0x108 Reserved */
++/* Debug Registers */
++ volatile uint32_t fmpl_res3[61]; /* 0x10C-0x200 Reserved Debug*/
++/* Profile Selection Mapping Registers Per Port-ID (n=1-11, 16) */
++ volatile uint32_t fmpl_dpmr; /* 0x200 FMPL_DPMR - FM Policer Default Mapping Register */
++ volatile uint32_t fmpl_pmr[63]; /*+default 0x204-0x2FF FMPL_PMR1 - FMPL_PMR63, - FM Policer Profile Mapping Registers.
++ (for port-ID 1-11, only for supported Port-ID registers) */
++} _PackedType t_FmPcdPlcrRegs;
++
++#if defined(__MWERKS__) && !defined(__GNUC__)
++#pragma pack(pop)
++#endif /* defined(__MWERKS__) && ... */
++
++
++/***********************************************************************/
++/* Driver's internal structures */
++/***********************************************************************/
++
++typedef struct {
++ bool known;
++ uint8_t id;
++} t_FmPcdKgSchemesExtractsEntry;
++
++typedef struct {
++ t_FmPcdKgSchemesExtractsEntry extractsArray[FM_PCD_KG_MAX_NUM_OF_EXTRACTS_PER_KEY];
++} t_FmPcdKgSchemesExtracts;
++
++typedef struct {
++ t_Handle h_Manip;
++ bool keepRes;
++ e_FmPcdEngine nextEngine;
++ uint8_t parseCode;
++} t_FmPcdInfoForManip;
++
++/**************************************************************************//**
++ @Description A structure of parameters to communicate
++ between the port and PCD regarding the KG scheme.
++*//***************************************************************************/
++typedef struct {
++ uint8_t netEnvId; /* in */
++ uint8_t numOfDistinctionUnits; /* in */
++ uint8_t unitIds[FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS]; /* in */
++ uint32_t vector; /* out */
++} t_NetEnvParams;
++
++typedef struct {
++ bool allocated;
++ uint8_t ownerId; /* guestId for KG in multi-partition only.
++ portId for PLCR in any environment */
++} t_FmPcdAllocMng;
++
++typedef struct {
++ volatile bool lock;
++ bool used;
++ uint8_t owners;
++ uint8_t netEnvId;
++ uint8_t guestId;
++ uint8_t baseEntry;
++ uint16_t sizeOfGrp;
++ protocolOpt_t optArray[FM_PCD_MAX_NUM_OF_OPTIONS(FM_PCD_MAX_NUM_OF_CLS_PLANS)];
++} t_FmPcdKgClsPlanGrp;
++
++typedef struct {
++ t_Handle h_FmPcd;
++ uint8_t schemeId;
++ t_FmPcdLock *p_Lock;
++ bool valid;
++ uint8_t netEnvId;
++ uint8_t owners;
++ uint32_t matchVector;
++ uint32_t ccUnits;
++ bool nextRelativePlcrProfile;
++ uint16_t relativeProfileId;
++ uint16_t numOfProfiles;
++ t_FmPcdKgKeyOrder orderedArray;
++ e_FmPcdEngine nextEngine;
++ e_FmPcdDoneAction doneAction;
++ uint8_t pointedOwners;
++ uint32_t requiredAction;
++ bool extractedOrs;
++ uint8_t bitOffsetInPlcrProfile;
++ bool directPlcr;
++#if (DPAA_VERSION >= 11)
++ bool vspe;
++#endif
++} t_FmPcdKgScheme;
++
++typedef _Packed union {
++ struct fman_kg_scheme_regs schemeRegs;
++ struct fman_kg_pe_regs portRegs;
++ struct fman_kg_cp_regs clsPlanRegs;
++} _PackedType u_FmPcdKgIndirectAccessRegs;
++
++typedef struct {
++ struct fman_kg_regs *p_FmPcdKgRegs;
++ uint32_t schemeExceptionsBitMask;
++ uint8_t numOfSchemes;
++ t_Handle h_HwSpinlock;
++ uint8_t schemesIds[FM_PCD_KG_NUM_OF_SCHEMES];
++ t_FmPcdKgScheme schemes[FM_PCD_KG_NUM_OF_SCHEMES];
++ t_FmPcdKgClsPlanGrp clsPlanGrps[FM_MAX_NUM_OF_PORTS];
++ uint8_t emptyClsPlanGrpId;
++ t_FmPcdAllocMng schemesMng[FM_PCD_KG_NUM_OF_SCHEMES]; /* only for MASTER ! */
++ t_FmPcdAllocMng clsPlanBlocksMng[FM_PCD_MAX_NUM_OF_CLS_PLANS/CLS_PLAN_NUM_PER_GRP];
++ u_FmPcdKgIndirectAccessRegs *p_IndirectAccessRegs;
++} t_FmPcdKg;
++
++typedef struct {
++ uint16_t profilesBase;
++ uint16_t numOfProfiles;
++ t_Handle h_FmPort;
++} t_FmPcdPlcrMapParam;
++
++typedef struct {
++ uint16_t absoluteProfileId;
++ t_Handle h_FmPcd;
++ bool valid;
++ t_FmPcdLock *p_Lock;
++ t_FmPcdAllocMng profilesMng;
++ uint8_t pointedOwners;
++ uint32_t requiredAction;
++ e_FmPcdEngine nextEngineOnGreen; /**< Green next engine type */
++ u_FmPcdPlcrNextEngineParams paramsOnGreen; /**< Green next engine params */
++
++ e_FmPcdEngine nextEngineOnYellow; /**< Yellow next engine type */
++ u_FmPcdPlcrNextEngineParams paramsOnYellow; /**< Yellow next engine params */
++
++ e_FmPcdEngine nextEngineOnRed; /**< Red next engine type */
++ u_FmPcdPlcrNextEngineParams paramsOnRed; /**< Red next engine params */
++} t_FmPcdPlcrProfile;
++
++typedef struct {
++ t_FmPcdPlcrRegs *p_FmPcdPlcrRegs;
++ uint16_t partPlcrProfilesBase;
++ uint16_t partNumOfPlcrProfiles;
++ t_FmPcdPlcrProfile profiles[FM_PCD_PLCR_NUM_ENTRIES];
++ uint16_t numOfSharedProfiles;
++ uint16_t sharedProfilesIds[FM_PCD_PLCR_NUM_ENTRIES];
++ t_FmPcdPlcrMapParam portsMapping[FM_MAX_NUM_OF_PORTS];
++ t_Handle h_HwSpinlock;
++ t_Handle h_SwSpinlock;
++} t_FmPcdPlcr;
++
++typedef struct {
++ uint32_t *p_SwPrsCode;
++ uint32_t *p_CurrSwPrs;
++ uint8_t currLabel;
++ struct fman_prs_regs *p_FmPcdPrsRegs;
++ t_FmPcdPrsLabelParams labelsTable[FM_PCD_PRS_NUM_OF_LABELS];
++ uint32_t fmPcdPrsPortIdStatistics;
++} t_FmPcdPrs;
++
++typedef struct {
++ struct {
++ e_NetHeaderType hdr;
++ protocolOpt_t opt; /* only one option !! */
++ } hdrs[FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS];
++} t_FmPcdIntDistinctionUnit;
++
++typedef struct {
++ e_NetHeaderType hdr;
++ protocolOpt_t opt; /* only one option !! */
++ e_NetHeaderType aliasHdr;
++} t_FmPcdNetEnvAliases;
++
++typedef struct {
++ uint8_t netEnvId;
++ t_Handle h_FmPcd;
++ t_Handle h_Spinlock;
++ bool used;
++ uint8_t owners;
++ uint8_t clsPlanGrpId;
++ t_FmPcdIntDistinctionUnit units[FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS];
++ uint32_t unitsVectors[FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS];
++ uint32_t lcvs[FM_PCD_PRS_NUM_OF_HDRS];
++ uint32_t macsecVector;
++ t_FmPcdNetEnvAliases aliasHdrs[FM_PCD_MAX_NUM_OF_ALIAS_HDRS];
++} t_FmPcdNetEnv;
++
++typedef struct {
++ struct fman_prs_cfg dfltCfg;
++ bool plcrAutoRefresh;
++ uint16_t prsMaxParseCycleLimit;
++} t_FmPcdDriverParam;
++
++typedef struct {
++ t_Handle h_Fm;
++ t_Handle h_FmMuram;
++ t_FmRevisionInfo fmRevInfo;
++
++ uint64_t physicalMuramBase;
++
++ t_Handle h_Spinlock;
++ t_List freeLocksLst;
++ t_List acquiredLocksLst;
++
++ t_Handle h_IpcSession; /* relevant for guest only */
++ bool enabled;
++ uint8_t guestId; /**< Guest Partition Id */
++ uint8_t numOfEnabledGuestPartitionsPcds;
++ char fmPcdModuleName[MODULE_NAME_SIZE];
++ char fmPcdIpcHandlerModuleName[MODULE_NAME_SIZE]; /* relevant for guest only - this is the master's name */
++ t_FmPcdNetEnv netEnvs[FM_MAX_NUM_OF_PORTS];
++ t_FmPcdKg *p_FmPcdKg;
++ t_FmPcdPlcr *p_FmPcdPlcr;
++ t_FmPcdPrs *p_FmPcdPrs;
++
++ void *p_CcShadow; /**< CC MURAM shadow */
++ uint32_t ccShadowSize;
++ uint32_t ccShadowAlign;
++ volatile bool shadowLock;
++ t_Handle h_ShadowSpinlock;
++
++ t_Handle h_Hc;
++
++ uint32_t exceptions;
++ t_FmPcdExceptionCallback *f_Exception;
++ t_FmPcdIdExceptionCallback *f_FmPcdIndexedException;
++ t_Handle h_App;
++ uintptr_t ipv6FrameIdAddr;
++ bool advancedOffloadSupport;
++
++ t_FmPcdDriverParam *p_FmPcdDriverParam;
++} t_FmPcd;
++
++#if (DPAA_VERSION >= 11)
++typedef uint8_t t_FmPcdFrmReplicUpdateType;
++#define FRM_REPLIC_UPDATE_COUNTER 0x01
++#define FRM_REPLIC_UPDATE_INFO 0x02
++#endif /* (DPAA_VERSION >= 11) */
++/***********************************************************************/
++/* PCD internal routines */
++/***********************************************************************/
++
++t_Error PcdGetVectorForOpt(t_FmPcd *p_FmPcd, uint8_t netEnvId, protocolOpt_t opt, uint32_t *p_Vector);
++t_Error PcdGetUnitsVector(t_FmPcd *p_FmPcd, t_NetEnvParams *p_Params);
++bool PcdNetEnvIsUnitWithoutOpts(t_FmPcd *p_FmPcd, uint8_t netEnvId, uint32_t unitVector);
++t_Error PcdGetClsPlanGrpParams(t_FmPcd *p_FmPcd, t_FmPcdKgInterModuleClsPlanGrpParams *p_GrpParams);
++void FmPcdSetClsPlanGrpId(t_FmPcd *p_FmPcd, uint8_t netEnvId, uint8_t clsPlanGrpId);
++e_NetHeaderType FmPcdGetAliasHdr(t_FmPcd *p_FmPcd, uint8_t netEnvId, e_NetHeaderType hdr);
++uint8_t FmPcdNetEnvGetUnitIdForSingleHdr(t_FmPcd *p_FmPcd, uint8_t netEnvId, e_NetHeaderType hdr);
++uint8_t FmPcdNetEnvGetUnitId(t_FmPcd *p_FmPcd, uint8_t netEnvId, e_NetHeaderType hdr, bool interchangable, protocolOpt_t opt);
++
++t_Error FmPcdManipBuildIpReassmScheme(t_FmPcd *p_FmPcd, t_Handle h_NetEnv, t_Handle h_CcTree, t_Handle h_Manip, bool isIpv4, uint8_t groupId);
++t_Error FmPcdManipDeleteIpReassmSchemes(t_Handle h_Manip);
++bool FmPcdManipIpReassmIsIpv6Hdr(t_Handle h_Manip);
++
++t_Handle KgConfig( t_FmPcd *p_FmPcd, t_FmPcdParams *p_FmPcdParams);
++t_Error KgInit(t_FmPcd *p_FmPcd);
++t_Error KgFree(t_FmPcd *p_FmPcd);
++void KgSetClsPlan(t_Handle h_FmPcd, t_FmPcdKgInterModuleClsPlanSet *p_Set);
++bool KgIsSchemeAlwaysDirect(t_Handle h_FmPcd, uint8_t schemeId);
++void KgEnable(t_FmPcd *p_FmPcd);
++void KgDisable(t_FmPcd *p_FmPcd);
++t_Error KgAllocClsPlanEntries(t_Handle h_FmPcd, uint16_t numOfClsPlanEntries, uint8_t guestId, uint8_t *p_First);
++void KgFreeClsPlanEntries(t_Handle h_FmPcd, uint16_t numOfClsPlanEntries, uint8_t guestId, uint8_t base);
++
++/* only for MULTI partittion */
++t_Error FmPcdKgAllocSchemes(t_Handle h_FmPcd, uint8_t numOfSchemes, uint8_t guestId, uint8_t *p_SchemesIds);
++t_Error FmPcdKgFreeSchemes(t_Handle h_FmPcd, uint8_t numOfSchemes, uint8_t guestId, uint8_t *p_SchemesIds);
++/* only for SINGLE partittion */
++t_Error KgBindPortToSchemes(t_Handle h_FmPcd , uint8_t hardwarePortId, uint32_t spReg);
++
++t_FmPcdLock *FmPcdAcquireLock(t_Handle h_FmPcd);
++void FmPcdReleaseLock(t_Handle h_FmPcd, t_FmPcdLock *p_Lock);
++
++t_Handle PlcrConfig(t_FmPcd *p_FmPcd, t_FmPcdParams *p_FmPcdParams);
++t_Error PlcrInit(t_FmPcd *p_FmPcd);
++t_Error PlcrFree(t_FmPcd *p_FmPcd);
++void PlcrEnable(t_FmPcd *p_FmPcd);
++void PlcrDisable(t_FmPcd *p_FmPcd);
++uint16_t PlcrAllocProfilesForPartition(t_FmPcd *p_FmPcd, uint16_t base, uint16_t numOfProfiles, uint8_t guestId);
++void PlcrFreeProfilesForPartition(t_FmPcd *p_FmPcd, uint16_t base, uint16_t numOfProfiles, uint8_t guestId);
++t_Error PlcrSetPortProfiles(t_FmPcd *p_FmPcd,
++ uint8_t hardwarePortId,
++ uint16_t numOfProfiles,
++ uint16_t base);
++t_Error PlcrClearPortProfiles(t_FmPcd *p_FmPcd, uint8_t hardwarePortId);
++
++t_Handle PrsConfig(t_FmPcd *p_FmPcd,t_FmPcdParams *p_FmPcdParams);
++t_Error PrsInit(t_FmPcd *p_FmPcd);
++void PrsEnable(t_FmPcd *p_FmPcd);
++void PrsDisable(t_FmPcd *p_FmPcd);
++void PrsFree(t_FmPcd *p_FmPcd );
++t_Error PrsIncludePortInStatistics(t_FmPcd *p_FmPcd, uint8_t hardwarePortId, bool include);
++
++t_Error FmPcdCcGetGrpParams(t_Handle treeId, uint8_t grpId, uint32_t *p_GrpBits, uint8_t *p_GrpBase);
++uint8_t FmPcdCcGetOffset(t_Handle h_CcNode);
++uint8_t FmPcdCcGetParseCode(t_Handle h_CcNode);
++uint16_t FmPcdCcGetNumOfKeys(t_Handle h_CcNode);
++t_Error ValidateNextEngineParams(t_Handle h_FmPcd, t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams, e_FmPcdCcStatsMode supportedStatsMode);
++
++void FmPcdManipUpdateOwner(t_Handle h_Manip, bool add);
++t_Error FmPcdManipCheckParamsForCcNextEngine(t_FmPcdCcNextEngineParams *p_InfoForManip, uint32_t *requiredAction);
++void FmPcdManipUpdateAdResultForCc(t_Handle h_Manip,
++ t_FmPcdCcNextEngineParams *p_CcNextEngineParams,
++ t_Handle p_Ad,
++ t_Handle *p_AdNewPtr);
++void FmPcdManipUpdateAdContLookupForCc(t_Handle h_Manip, t_Handle p_Ad, t_Handle *p_AdNew, uint32_t adTableOffset);
++void FmPcdManipUpdateOwner(t_Handle h_Manip, bool add);
++t_Error FmPcdManipCheckParamsWithCcNodeParams(t_Handle h_Manip, t_Handle h_FmPcdCcNode);
++#ifdef FM_CAPWAP_SUPPORT
++t_Handle FmPcdManipApplSpecificBuild(void);
++bool FmPcdManipIsCapwapApplSpecific(t_Handle h_Manip);
++#endif /* FM_CAPWAP_SUPPORT */
++#if (DPAA_VERSION >= 11)
++void * FrmReplicGroupGetSourceTableDescriptor(t_Handle h_ReplicGroup);
++void FrmReplicGroupUpdateOwner(t_Handle h_ReplicGroup, bool add);
++void FrmReplicGroupUpdateAd(t_Handle h_ReplicGroup, void *p_Ad, t_Handle *h_AdNew);
++
++void FmPcdCcGetAdTablesThatPointOnReplicGroup(t_Handle h_Node,
++ t_Handle h_ReplicGroup,
++ t_List *p_AdTables,
++ uint32_t *p_NumOfAdTables);
++#endif /* (DPAA_VERSION >= 11) */
++
++void EnqueueNodeInfoToRelevantLst(t_List *p_List, t_CcNodeInformation *p_CcInfo, t_Handle h_Spinlock);
++void DequeueNodeInfoFromRelevantLst(t_List *p_List, t_Handle h_Info, t_Handle h_Spinlock);
++t_CcNodeInformation* FindNodeInfoInReleventLst(t_List *p_List, t_Handle h_Info, t_Handle h_Spinlock);
++t_List *FmPcdManipGetSpinlock(t_Handle h_Manip);
++t_List *FmPcdManipGetNodeLstPointedOnThisManip(t_Handle h_Manip);
++
++typedef struct
++{
++ t_Handle h_StatsAd;
++ t_Handle h_StatsCounters;
++#if (DPAA_VERSION >= 11)
++ t_Handle h_StatsFLRs;
++#endif /* (DPAA_VERSION >= 11) */
++} t_FmPcdCcStatsParams;
++
++void NextStepAd(t_Handle h_Ad,
++ t_FmPcdCcStatsParams *p_FmPcdCcStatsParams,
++ t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams,
++ t_FmPcd *p_FmPcd);
++void ReleaseLst(t_List *p_List);
++
++static __inline__ t_Handle FmPcdGetMuramHandle(t_Handle h_FmPcd)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ ASSERT_COND(p_FmPcd);
++ return p_FmPcd->h_FmMuram;
++}
++
++static __inline__ uint64_t FmPcdGetMuramPhysBase(t_Handle h_FmPcd)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ ASSERT_COND(p_FmPcd);
++ return p_FmPcd->physicalMuramBase;
++}
++
++static __inline__ uint32_t FmPcdLockSpinlock(t_FmPcdLock *p_Lock)
++{
++ ASSERT_COND(p_Lock);
++ return XX_LockIntrSpinlock(p_Lock->h_Spinlock);
++}
++
++static __inline__ void FmPcdUnlockSpinlock(t_FmPcdLock *p_Lock, uint32_t flags)
++{
++ ASSERT_COND(p_Lock);
++ XX_UnlockIntrSpinlock(p_Lock->h_Spinlock, flags);
++}
++
++static __inline__ bool FmPcdLockTryLock(t_FmPcdLock *p_Lock)
++{
++ uint32_t intFlags;
++
++ ASSERT_COND(p_Lock);
++ intFlags = XX_LockIntrSpinlock(p_Lock->h_Spinlock);
++ if (p_Lock->flag)
++ {
++ XX_UnlockIntrSpinlock(p_Lock->h_Spinlock, intFlags);
++ return FALSE;
++ }
++ p_Lock->flag = TRUE;
++ XX_UnlockIntrSpinlock(p_Lock->h_Spinlock, intFlags);
++ return TRUE;
++}
++
++static __inline__ void FmPcdLockUnlock(t_FmPcdLock *p_Lock)
++{
++ ASSERT_COND(p_Lock);
++ p_Lock->flag = FALSE;
++}
++
++
++#endif /* __FM_PCD_H */
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_pcd_ipc.h b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_pcd_ipc.h
+new file mode 100644
+index 0000000..5184ce6
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_pcd_ipc.h
+@@ -0,0 +1,280 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/**************************************************************************//**
++ @File fm_pcd_ipc.h
++
++ @Description FM PCD Inter-Partition prototypes, structures and definitions.
++*//***************************************************************************/
++#ifndef __FM_PCD_IPC_H
++#define __FM_PCD_IPC_H
++
++#include "std_ext.h"
++
++
++/**************************************************************************//**
++ @Group FM_grp Frame Manager API
++
++ @Description FM API functions, definitions and enums
++
++ @{
++*//***************************************************************************/
++
++
++#if defined(__MWERKS__) && !defined(__GNUC__)
++#pragma pack(push,1)
++#endif /* defined(__MWERKS__) && ... */
++
++/**************************************************************************//**
++ @Description Structure for getting a sw parser address according to a label
++ Fields commented 'IN' are passed by the port module to be used
++ by the FM module.
++ Fields commented 'OUT' will be filled by FM before returning to port.
++*//***************************************************************************/
++typedef _Packed struct t_FmPcdIpcSwPrsLable
++{
++ uint32_t enumHdr; /**< IN. The existance of this header will envoke
++ the sw parser code. */
++ uint8_t indexPerHdr; /**< IN. Normally 0, if more than one sw parser
++ attachments for the same header, use this
++
++ index to distinguish between them. */
++} _PackedType t_FmPcdIpcSwPrsLable;
++
++/**************************************************************************//**
++ @Description Structure for port-PCD communication.
++ Fields commented 'IN' are passed by the port module to be used
++ by the FM module.
++ Fields commented 'OUT' will be filled by FM before returning to port.
++ Some fields are optional (depending on configuration) and
++ will be analized by the port and FM modules accordingly.
++*//***************************************************************************/
++
++typedef struct t_FmPcdIpcKgSchemesParams
++{
++ uint8_t guestId;
++ uint8_t numOfSchemes;
++ uint8_t schemesIds[FM_PCD_KG_NUM_OF_SCHEMES];
++} _PackedType t_FmPcdIpcKgSchemesParams;
++
++typedef struct t_FmPcdIpcKgClsPlanParams
++{
++ uint8_t guestId;
++ uint16_t numOfClsPlanEntries;
++ uint8_t clsPlanBase;
++} _PackedType t_FmPcdIpcKgClsPlanParams;
++
++typedef _Packed struct t_FmPcdIpcPrsIncludePort
++{
++ uint8_t hardwarePortId;
++ bool include;
++} _PackedType t_FmPcdIpcPrsIncludePort;
++
++
++#define FM_PCD_MAX_REPLY_SIZE 16
++#define FM_PCD_MAX_MSG_SIZE 36
++#define FM_PCD_MAX_REPLY_BODY_SIZE 36
++
++typedef _Packed struct {
++ uint32_t msgId;
++ uint8_t msgBody[FM_PCD_MAX_MSG_SIZE];
++} _PackedType t_FmPcdIpcMsg;
++
++typedef _Packed struct t_FmPcdIpcReply {
++ uint32_t error;
++ uint8_t replyBody[FM_PCD_MAX_REPLY_BODY_SIZE];
++} _PackedType t_FmPcdIpcReply;
++
++typedef _Packed struct t_FmIpcResourceAllocParams {
++ uint8_t guestId;
++ uint16_t base;
++ uint16_t num;
++}_PackedType t_FmIpcResourceAllocParams;
++
++#if defined(__MWERKS__) && !defined(__GNUC__)
++#pragma pack(pop)
++#endif /* defined(__MWERKS__) && ... */
++
++
++
++/**************************************************************************//**
++ @Function FM_PCD_ALLOC_KG_SCHEMES
++
++ @Description Used by FM PCD front-end in order to allocate KG resources
++
++ @Param[in/out] t_FmPcdIpcKgAllocParams Pointer
++*//***************************************************************************/
++#define FM_PCD_ALLOC_KG_SCHEMES 3
++
++/**************************************************************************//**
++ @Function FM_PCD_FREE_KG_SCHEMES
++
++ @Description Used by FM PCD front-end in order to Free KG resources
++
++ @Param[in/out] t_FmPcdIpcKgSchemesParams Pointer
++*//***************************************************************************/
++#define FM_PCD_FREE_KG_SCHEMES 4
++
++/**************************************************************************//**
++ @Function FM_PCD_ALLOC_PROFILES
++
++ @Description Used by FM PCD front-end in order to allocate Policer profiles
++
++ @Param[in/out] t_FmIpcResourceAllocParams Pointer
++*//***************************************************************************/
++#define FM_PCD_ALLOC_PROFILES 5
++
++/**************************************************************************//**
++ @Function FM_PCD_FREE_PROFILES
++
++ @Description Used by FM PCD front-end in order to Free Policer profiles
++
++ @Param[in/out] t_FmIpcResourceAllocParams Pointer
++*//***************************************************************************/
++#define FM_PCD_FREE_PROFILES 6
++
++/**************************************************************************//**
++ @Function FM_PCD_SET_PORT_PROFILES
++
++ @Description Used by FM PCD front-end in order to allocate Policer profiles
++ for specific port
++
++ @Param[in/out] t_FmIpcResourceAllocParams Pointer
++*//***************************************************************************/
++#define FM_PCD_SET_PORT_PROFILES 7
++
++/**************************************************************************//**
++ @Function FM_PCD_CLEAR_PORT_PROFILES
++
++ @Description Used by FM PCD front-end in order to allocate Policer profiles
++ for specific port
++
++ @Param[in/out] t_FmIpcResourceAllocParams Pointer
++*//***************************************************************************/
++#define FM_PCD_CLEAR_PORT_PROFILES 8
++
++/**************************************************************************//**
++ @Function FM_PCD_GET_PHYS_MURAM_BASE
++
++ @Description Used by FM PCD front-end in order to get MURAM base address
++
++ @Param[in/out] t_FmPcdIcPhysAddr Pointer
++*//***************************************************************************/
++#define FM_PCD_GET_PHYS_MURAM_BASE 9
++
++/**************************************************************************//**
++ @Function FM_PCD_GET_SW_PRS_OFFSET
++
++ @Description Used by FM front-end to get the SW parser offset of the start of
++ code relevant to a given label.
++
++ @Param[in/out] t_FmPcdIpcSwPrsLable Pointer
++*//***************************************************************************/
++#define FM_PCD_GET_SW_PRS_OFFSET 10
++
++/**************************************************************************//**
++ @Function FM_PCD_MASTER_IS_ENABLED
++
++ @Description Used by FM front-end in order to verify
++ PCD enablement.
++
++ @Param[in] bool Pointer
++*//***************************************************************************/
++#define FM_PCD_MASTER_IS_ENABLED 15
++
++/**************************************************************************//**
++ @Function FM_PCD_GUEST_DISABLE
++
++ @Description Used by FM front-end to inform back-end when
++ front-end PCD is disabled
++
++ @Param[in] None
++*//***************************************************************************/
++#define FM_PCD_GUEST_DISABLE 16
++
++/**************************************************************************//**
++ @Function FM_PCD_FREE_KG_CLSPLAN
++
++ @Description Used by FM PCD front-end in order to Free KG classification plan entries
++
++ @Param[in/out] t_FmPcdIpcKgClsPlanParams Pointer
++*//***************************************************************************/
++#define FM_PCD_FREE_KG_CLSPLAN 22
++
++/**************************************************************************//**
++ @Function FM_PCD_ALLOC_KG_CLSPLAN
++
++ @Description Used by FM PCD front-end in order to allocate KG classification plan entries
++
++ @Param[in/out] t_FmPcdIpcKgClsPlanParams Pointer
++*//***************************************************************************/
++#define FM_PCD_ALLOC_KG_CLSPLAN 23
++
++/**************************************************************************//**
++ @Function FM_PCD_MASTER_IS_ALIVE
++
++ @Description Used by FM front-end to check that back-end exists
++
++ @Param[in] None
++*//***************************************************************************/
++#define FM_PCD_MASTER_IS_ALIVE 24
++
++/**************************************************************************//**
++ @Function FM_PCD_GET_COUNTER
++
++ @Description Used by FM front-end to read PCD counters
++
++ @Param[in/out] t_FmPcdIpcGetCounter Pointer
++*//***************************************************************************/
++#define FM_PCD_GET_COUNTER 25
++
++/**************************************************************************//**
++ @Function FM_PCD_PRS_INC_PORT_STATS
++
++ @Description Used by FM front-end to set/clear statistics for port
++
++ @Param[in/out] t_FmPcdIpcPrsIncludePort Pointer
++*//***************************************************************************/
++#define FM_PCD_PRS_INC_PORT_STATS 26
++
++#if (DPAA_VERSION >= 11)
++/* TODO - doc */
++#define FM_PCD_ALLOC_SP 27
++#endif /* (DPAA_VERSION >= 11) */
++
++
++/** @} */ /* end of FM_PCD_IPC_grp group */
++/** @} */ /* end of FM_grp group */
++
++
++#endif /* __FM_PCD_IPC_H */
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_plcr.c b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_plcr.c
+new file mode 100644
+index 0000000..ded7960
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_plcr.c
+@@ -0,0 +1,1927 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File fm_plcr.c
++
++ @Description FM PCD POLICER...
++*//***************************************************************************/
++#include "std_ext.h"
++#include "error_ext.h"
++#include "string_ext.h"
++#include "debug_ext.h"
++#include "net_ext.h"
++#include "fm_ext.h"
++
++#include "fm_common.h"
++#include "fm_pcd.h"
++#include "fm_hc.h"
++#include "fm_pcd_ipc.h"
++#include "fm_plcr.h"
++
++
++/****************************************/
++/* static functions */
++/****************************************/
++
++static uint32_t PlcrProfileLock(t_Handle h_Profile)
++{
++ ASSERT_COND(h_Profile);
++ return FmPcdLockSpinlock(((t_FmPcdPlcrProfile *)h_Profile)->p_Lock);
++}
++
++static void PlcrProfileUnlock(t_Handle h_Profile, uint32_t intFlags)
++{
++ ASSERT_COND(h_Profile);
++ FmPcdUnlockSpinlock(((t_FmPcdPlcrProfile *)h_Profile)->p_Lock, intFlags);
++}
++
++static bool PlcrProfileFlagTryLock(t_Handle h_Profile)
++{
++ ASSERT_COND(h_Profile);
++ return FmPcdLockTryLock(((t_FmPcdPlcrProfile *)h_Profile)->p_Lock);
++}
++
++static void PlcrProfileFlagUnlock(t_Handle h_Profile)
++{
++ ASSERT_COND(h_Profile);
++ FmPcdLockUnlock(((t_FmPcdPlcrProfile *)h_Profile)->p_Lock);
++}
++
++static uint32_t PlcrHwLock(t_Handle h_FmPcdPlcr)
++{
++ ASSERT_COND(h_FmPcdPlcr);
++ return XX_LockIntrSpinlock(((t_FmPcdPlcr*)h_FmPcdPlcr)->h_HwSpinlock);
++}
++
++static void PlcrHwUnlock(t_Handle h_FmPcdPlcr, uint32_t intFlags)
++{
++ ASSERT_COND(h_FmPcdPlcr);
++ XX_UnlockIntrSpinlock(((t_FmPcdPlcr*)h_FmPcdPlcr)->h_HwSpinlock, intFlags);
++}
++
++static uint32_t PlcrSwLock(t_Handle h_FmPcdPlcr)
++{
++ ASSERT_COND(h_FmPcdPlcr);
++ return XX_LockIntrSpinlock(((t_FmPcdPlcr*)h_FmPcdPlcr)->h_SwSpinlock);
++}
++
++static void PlcrSwUnlock(t_Handle h_FmPcdPlcr, uint32_t intFlags)
++{
++ ASSERT_COND(h_FmPcdPlcr);
++ XX_UnlockIntrSpinlock(((t_FmPcdPlcr*)h_FmPcdPlcr)->h_SwSpinlock, intFlags);
++}
++
++static bool IsProfileShared(t_Handle h_FmPcd, uint16_t absoluteProfileId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ uint16_t i;
++
++ SANITY_CHECK_RETURN_VALUE(p_FmPcd, E_INVALID_HANDLE, FALSE);
++
++ for (i=0;ip_FmPcdPlcr->numOfSharedProfiles;i++)
++ if (p_FmPcd->p_FmPcdPlcr->sharedProfilesIds[i] == absoluteProfileId)
++ return TRUE;
++ return FALSE;
++}
++
++static t_Error SetProfileNia(t_FmPcd *p_FmPcd, e_FmPcdEngine nextEngine, u_FmPcdPlcrNextEngineParams *p_NextEngineParams, uint32_t *nextAction)
++{
++ uint32_t nia;
++ uint16_t absoluteProfileId;
++ uint8_t relativeSchemeId, physicalSchemeId;
++
++ nia = FM_PCD_PLCR_NIA_VALID;
++
++ switch (nextEngine)
++ {
++ case e_FM_PCD_DONE :
++ switch (p_NextEngineParams->action)
++ {
++ case e_FM_PCD_DROP_FRAME :
++ nia |= GET_NIA_BMI_AC_DISCARD_FRAME(p_FmPcd);
++ break;
++ case e_FM_PCD_ENQ_FRAME:
++ nia |= GET_NIA_BMI_AC_ENQ_FRAME(p_FmPcd);
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
++ }
++ break;
++ case e_FM_PCD_KG:
++ physicalSchemeId = FmPcdKgGetSchemeId(p_NextEngineParams->h_DirectScheme);
++ relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmPcd, physicalSchemeId);
++ if (relativeSchemeId >= FM_PCD_KG_NUM_OF_SCHEMES)
++ RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
++ if (!FmPcdKgIsSchemeValidSw(p_NextEngineParams->h_DirectScheme))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid direct scheme."));
++ if (!KgIsSchemeAlwaysDirect(p_FmPcd, relativeSchemeId))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Policer Profile may point only to a scheme that is always direct."));
++ nia |= NIA_ENG_KG | NIA_KG_DIRECT | physicalSchemeId;
++ break;
++ case e_FM_PCD_PLCR:
++ absoluteProfileId = ((t_FmPcdPlcrProfile *)p_NextEngineParams->h_Profile)->absoluteProfileId;
++ if (!IsProfileShared(p_FmPcd, absoluteProfileId))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Next profile must be a shared profile"));
++ if (!FmPcdPlcrIsProfileValid(p_FmPcd, absoluteProfileId))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid profile "));
++ nia |= NIA_ENG_PLCR | NIA_PLCR_ABSOLUTE | absoluteProfileId;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
++ }
++
++ *nextAction = nia;
++
++ return E_OK;
++}
++
++static uint32_t CalcFPP(uint32_t fpp)
++{
++ if (fpp > 15)
++ return 15 - (0x1f - fpp);
++ else
++ return 16 + fpp;
++}
++
++static void GetInfoRateReg(e_FmPcdPlcrRateMode rateMode,
++ uint32_t rate,
++ uint64_t tsuInTenthNano,
++ uint32_t fppShift,
++ uint64_t *p_Integer,
++ uint64_t *p_Fraction)
++{
++ uint64_t tmp, div;
++
++ if (rateMode == e_FM_PCD_PLCR_BYTE_MODE)
++ {
++ /* now we calculate the initial integer for the bigger rate */
++ /* from Kbps to Bytes/TSU */
++ tmp = (uint64_t)rate;
++ tmp *= 1000; /* kb --> b */
++ tmp *= tsuInTenthNano; /* bps --> bpTsu(in 10nano) */
++
++ div = 1000000000; /* nano */
++ div *= 10; /* 10 nano */
++ div *= 8; /* bit to byte */
++ }
++ else
++ {
++ /* now we calculate the initial integer for the bigger rate */
++ /* from Kbps to Bytes/TSU */
++ tmp = (uint64_t)rate;
++ tmp *= tsuInTenthNano; /* bps --> bpTsu(in 10nano) */
++
++ div = 1000000000; /* nano */
++ div *= 10; /* 10 nano */
++ }
++ *p_Integer = (tmp<h_Fm); /* TimeStamp per nano seconds units */
++ /* we want the tsu to count 10 nano for better precision normally tsu is 3.9 nano, now we will get 39 */
++ tsuInTenthNanos = (uint32_t)(1000*10/(1<comittedInfoRate > p_NonPassthroughAlgParam->peakOrAccessiveInfoRate)
++ GetInfoRateReg(p_NonPassthroughAlgParam->rateMode, p_NonPassthroughAlgParam->comittedInfoRate, tsuInTenthNanos, 0, &integer, &fraction);
++ else
++ GetInfoRateReg(p_NonPassthroughAlgParam->rateMode, p_NonPassthroughAlgParam->peakOrAccessiveInfoRate, tsuInTenthNanos, 0, &integer, &fraction);
++
++ /* we shift integer, as in cir/pir it is represented by the MSB 16 bits, and
++ * the LSB bits are for the fraction */
++ temp = (uint32_t)((integer<<16) & 0x00000000FFFFFFFF);
++ /* temp is effected by the rate. For low rates it may be as low as 0, and then we'll
++ * take max FP = 31.
++ * For high rates it will never exceed the 32 bit reg (after the 16 shift), as it is
++ * limited by the 10G physical port.
++ */
++ if (temp != 0)
++ {
++ /* In this case, the largest rate integer is non 0, if it does not occupy all (high) 16
++ * bits of the PIR_EIR we can use this fact and enlarge it to occupy all 16 bits.
++ * The logic is to have as many bits for integer in the higher rates, but if we have "0"s
++ * in the integer part of the cir/pir register, than these bits are wasted. So we want
++ * to use these bits for the fraction. in this way we will have for fraction - the number
++ * of "0" bits and the rest - for integer.
++ * In other words: For each bit we shift it in PIR_EIR, we move the FP in the TS
++ * one bit to the left - preserving the relationship and achieving more bits
++ * for integer in the TS.
++ */
++
++ /* count zeroes left of the higher used bit (in order to shift the value such that
++ * unused bits may be used for fraction).
++ */
++ while ((temp & 0x80000000) == 0)
++ {
++ temp = temp << 1;
++ fppShift++;
++ }
++ if (fppShift > 15)
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_SELECTION, ("timeStampPeriod to Information rate ratio is too small"));
++ return;
++ }
++ }
++ else
++ {
++ temp = (uint32_t)fraction; /* fraction will alyas be smaller than 2^16 */
++ if (!temp)
++ /* integer and fraction are 0, we set FP to its max val */
++ fppShift = 31;
++ else
++ {
++ /* integer was 0 but fraction is not. FP is 16 for the fraction,
++ * + all left zeroes of the fraction. */
++ fppShift=16;
++ /* count zeroes left of the higher used bit (in order to shift the value such that
++ * unused bits may be used for fraction).
++ */
++ while ((temp & 0x8000) == 0)
++ {
++ temp = temp << 1;
++ fppShift++;
++ }
++ }
++ }
++
++ /*
++ * This means that the FM TS register will now be used so that 'fppShift' bits are for
++ * fraction and the rest for integer */
++ /* now we re-calculate cir and pir_eir with the calculated FP */
++ GetInfoRateReg(p_NonPassthroughAlgParam->rateMode, p_NonPassthroughAlgParam->comittedInfoRate, tsuInTenthNanos, fppShift, &integer, &fraction);
++ *cir = (uint32_t)(integer << 16 | (fraction & 0xFFFF));
++ GetInfoRateReg(p_NonPassthroughAlgParam->rateMode, p_NonPassthroughAlgParam->peakOrAccessiveInfoRate, tsuInTenthNanos, fppShift, &integer, &fraction);
++ *pir_eir = (uint32_t)(integer << 16 | (fraction & 0xFFFF));
++
++ *cbs = p_NonPassthroughAlgParam->comittedBurstSize;
++ *pbs_ebs = p_NonPassthroughAlgParam->peakOrAccessiveBurstSize;
++
++ /* convert FP as it should be written to reg.
++ * 0-15 --> 16-31
++ * 16-31 --> 0-15
++ */
++ *fpp = CalcFPP(fppShift);
++}
++
++static void WritePar(t_FmPcd *p_FmPcd, uint32_t par)
++{
++ t_FmPcdPlcrRegs *p_FmPcdPlcrRegs = p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs;
++
++ ASSERT_COND(FmIsMaster(p_FmPcd->h_Fm));
++ WRITE_UINT32(p_FmPcdPlcrRegs->fmpl_par, par);
++
++ while (GET_UINT32(p_FmPcdPlcrRegs->fmpl_par) & FM_PCD_PLCR_PAR_GO) ;
++}
++
++static t_Error BuildProfileRegs(t_FmPcd *p_FmPcd,
++ t_FmPcdPlcrProfileParams *p_ProfileParams,
++ t_FmPcdPlcrProfileRegs *p_PlcrRegs)
++{
++ t_Error err = E_OK;
++ uint32_t pemode, gnia, ynia, rnia;
++
++ ASSERT_COND(p_FmPcd);
++
++/* Set G, Y, R Nia */
++ err = SetProfileNia(p_FmPcd, p_ProfileParams->nextEngineOnGreen, &(p_ProfileParams->paramsOnGreen), &gnia);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ err = SetProfileNia(p_FmPcd, p_ProfileParams->nextEngineOnYellow, &(p_ProfileParams->paramsOnYellow), &ynia);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ err = SetProfileNia(p_FmPcd, p_ProfileParams->nextEngineOnRed, &(p_ProfileParams->paramsOnRed), &rnia);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++/* Mode fmpl_pemode */
++ pemode = FM_PCD_PLCR_PEMODE_PI;
++
++ switch (p_ProfileParams->algSelection)
++ {
++ case e_FM_PCD_PLCR_PASS_THROUGH:
++ p_PlcrRegs->fmpl_pecir = 0;
++ p_PlcrRegs->fmpl_pecbs = 0;
++ p_PlcrRegs->fmpl_pepepir_eir = 0;
++ p_PlcrRegs->fmpl_pepbs_ebs = 0;
++ p_PlcrRegs->fmpl_pelts = 0;
++ p_PlcrRegs->fmpl_pects = 0;
++ p_PlcrRegs->fmpl_pepts_ets = 0;
++ pemode &= ~FM_PCD_PLCR_PEMODE_ALG_MASK;
++ switch (p_ProfileParams->colorMode)
++ {
++ case e_FM_PCD_PLCR_COLOR_BLIND:
++ pemode |= FM_PCD_PLCR_PEMODE_CBLND;
++ switch (p_ProfileParams->color.dfltColor)
++ {
++ case e_FM_PCD_PLCR_GREEN:
++ pemode &= ~FM_PCD_PLCR_PEMODE_DEFC_MASK;
++ break;
++ case e_FM_PCD_PLCR_YELLOW:
++ pemode |= FM_PCD_PLCR_PEMODE_DEFC_Y;
++ break;
++ case e_FM_PCD_PLCR_RED:
++ pemode |= FM_PCD_PLCR_PEMODE_DEFC_R;
++ break;
++ case e_FM_PCD_PLCR_OVERRIDE:
++ pemode |= FM_PCD_PLCR_PEMODE_DEFC_OVERRIDE;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
++ }
++
++ break;
++ case e_FM_PCD_PLCR_COLOR_AWARE:
++ pemode &= ~FM_PCD_PLCR_PEMODE_CBLND;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
++ }
++ break;
++
++ case e_FM_PCD_PLCR_RFC_2698:
++ /* Select algorithm MODE[ALG] = "01" */
++ pemode |= FM_PCD_PLCR_PEMODE_ALG_RFC2698;
++ if (p_ProfileParams->nonPassthroughAlgParams.comittedInfoRate > p_ProfileParams->nonPassthroughAlgParams.peakOrAccessiveInfoRate)
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, ("in RFC2698 Peak rate must be equal or larger than comittedInfoRate."));
++ goto cont_rfc;
++ case e_FM_PCD_PLCR_RFC_4115:
++ /* Select algorithm MODE[ALG] = "10" */
++ pemode |= FM_PCD_PLCR_PEMODE_ALG_RFC4115;
++cont_rfc:
++ /* Select Color-Blind / Color-Aware operation (MODE[CBLND]) */
++ switch (p_ProfileParams->colorMode)
++ {
++ case e_FM_PCD_PLCR_COLOR_BLIND:
++ pemode |= FM_PCD_PLCR_PEMODE_CBLND;
++ break;
++ case e_FM_PCD_PLCR_COLOR_AWARE:
++ pemode &= ~FM_PCD_PLCR_PEMODE_CBLND;
++ /*In color aware more select override color interpretation (MODE[OVCLR]) */
++ switch (p_ProfileParams->color.override)
++ {
++ case e_FM_PCD_PLCR_GREEN:
++ pemode &= ~FM_PCD_PLCR_PEMODE_OVCLR_MASK;
++ break;
++ case e_FM_PCD_PLCR_YELLOW:
++ pemode |= FM_PCD_PLCR_PEMODE_OVCLR_Y;
++ break;
++ case e_FM_PCD_PLCR_RED:
++ pemode |= FM_PCD_PLCR_PEMODE_OVCLR_R;
++ break;
++ case e_FM_PCD_PLCR_OVERRIDE:
++ pemode |= FM_PCD_PLCR_PEMODE_OVCLR_G_NC;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
++ }
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
++ }
++ /* Select Measurement Unit Mode to BYTE or PACKET (MODE[PKT]) */
++ switch (p_ProfileParams->nonPassthroughAlgParams.rateMode)
++ {
++ case e_FM_PCD_PLCR_BYTE_MODE :
++ pemode &= ~FM_PCD_PLCR_PEMODE_PKT;
++ switch (p_ProfileParams->nonPassthroughAlgParams.byteModeParams.frameLengthSelection)
++ {
++ case e_FM_PCD_PLCR_L2_FRM_LEN:
++ pemode |= FM_PCD_PLCR_PEMODE_FLS_L2;
++ break;
++ case e_FM_PCD_PLCR_L3_FRM_LEN:
++ pemode |= FM_PCD_PLCR_PEMODE_FLS_L3;
++ break;
++ case e_FM_PCD_PLCR_L4_FRM_LEN:
++ pemode |= FM_PCD_PLCR_PEMODE_FLS_L4;
++ break;
++ case e_FM_PCD_PLCR_FULL_FRM_LEN:
++ pemode |= FM_PCD_PLCR_PEMODE_FLS_FULL;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
++ }
++ switch (p_ProfileParams->nonPassthroughAlgParams.byteModeParams.rollBackFrameSelection)
++ {
++ case e_FM_PCD_PLCR_ROLLBACK_L2_FRM_LEN:
++ pemode &= ~FM_PCD_PLCR_PEMODE_RBFLS;
++ break;
++ case e_FM_PCD_PLCR_ROLLBACK_FULL_FRM_LEN:
++ pemode |= FM_PCD_PLCR_PEMODE_RBFLS;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
++ }
++ break;
++ case e_FM_PCD_PLCR_PACKET_MODE :
++ pemode |= FM_PCD_PLCR_PEMODE_PKT;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
++ }
++ /* Select timeStamp floating point position (MODE[FPP]) to fit the actual traffic rates. For PACKET
++ mode with low traffic rates move the fixed point to the left to increase fraction accuracy. For BYTE
++ mode with high traffic rates move the fixed point to the right to increase integer accuracy. */
++
++ /* Configure Traffic Parameters*/
++ {
++ uint32_t cir=0, cbs=0, pir_eir=0, pbs_ebs=0, fpp=0;
++
++ CalcRates(p_FmPcd, &p_ProfileParams->nonPassthroughAlgParams, &cir, &cbs, &pir_eir, &pbs_ebs, &fpp);
++
++ /* Set Committed Information Rate (CIR) */
++ p_PlcrRegs->fmpl_pecir = cir;
++ /* Set Committed Burst Size (CBS). */
++ p_PlcrRegs->fmpl_pecbs = cbs;
++ /* Set Peak Information Rate (PIR_EIR used as PIR) */
++ p_PlcrRegs->fmpl_pepepir_eir = pir_eir;
++ /* Set Peak Burst Size (PBS_EBS used as PBS) */
++ p_PlcrRegs->fmpl_pepbs_ebs = pbs_ebs;
++
++ /* Initialize the Metering Buckets to be full (write them with 0xFFFFFFFF. */
++ /* Peak Rate Token Bucket Size (PTS_ETS used as PTS) */
++ p_PlcrRegs->fmpl_pepts_ets = 0xFFFFFFFF;
++ /* Committed Rate Token Bucket Size (CTS) */
++ p_PlcrRegs->fmpl_pects = 0xFFFFFFFF;
++
++ /* Set the FPP based on calculation */
++ pemode |= (fpp << FM_PCD_PLCR_PEMODE_FPP_SHIFT);
++ }
++ break; /* FM_PCD_PLCR_PEMODE_ALG_RFC2698 , FM_PCD_PLCR_PEMODE_ALG_RFC4115 */
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
++ }
++
++ p_PlcrRegs->fmpl_pemode = pemode;
++
++ p_PlcrRegs->fmpl_pegnia = gnia;
++ p_PlcrRegs->fmpl_peynia = ynia;
++ p_PlcrRegs->fmpl_pernia = rnia;
++
++ /* Zero Counters */
++ p_PlcrRegs->fmpl_pegpc = 0;
++ p_PlcrRegs->fmpl_peypc = 0;
++ p_PlcrRegs->fmpl_perpc = 0;
++ p_PlcrRegs->fmpl_perypc = 0;
++ p_PlcrRegs->fmpl_perrpc = 0;
++
++ return E_OK;
++}
++
++static t_Error AllocSharedProfiles(t_FmPcd *p_FmPcd, uint16_t numOfProfiles, uint16_t *profilesIds)
++{
++ uint32_t profilesFound;
++ uint16_t i, k=0;
++ uint32_t intFlags;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++
++ if (!numOfProfiles)
++ return E_OK;
++
++ if (numOfProfiles>FM_PCD_PLCR_NUM_ENTRIES)
++ RETURN_ERROR(MINOR, E_INVALID_VALUE, ("numProfiles is too big."));
++
++ intFlags = PlcrSwLock(p_FmPcd->p_FmPcdPlcr);
++ /* Find numOfProfiles free profiles (may be spread) */
++ profilesFound = 0;
++ for (i=0;ip_FmPcdPlcr->profiles[i].profilesMng.allocated)
++ {
++ profilesFound++;
++ profilesIds[k] = i;
++ k++;
++ if (profilesFound == numOfProfiles)
++ break;
++ }
++
++ if (profilesFound != numOfProfiles)
++ {
++ PlcrSwUnlock(p_FmPcd->p_FmPcdPlcr, intFlags);
++ RETURN_ERROR(MAJOR, E_INVALID_STATE,NO_MSG);
++ }
++
++ for (i = 0;ip_FmPcdPlcr->profiles[profilesIds[i]].profilesMng.allocated = TRUE;
++ p_FmPcd->p_FmPcdPlcr->profiles[profilesIds[i]].profilesMng.ownerId = 0;
++ }
++ PlcrSwUnlock(p_FmPcd->p_FmPcdPlcr, intFlags);
++
++ return E_OK;
++}
++
++static void FreeSharedProfiles(t_FmPcd *p_FmPcd, uint16_t numOfProfiles, uint16_t *profilesIds)
++{
++ uint16_t i;
++
++ SANITY_CHECK_RETURN(p_FmPcd, E_INVALID_HANDLE);
++
++ ASSERT_COND(numOfProfiles);
++
++ for (i=0; i < numOfProfiles; i++)
++ {
++ ASSERT_COND(p_FmPcd->p_FmPcdPlcr->profiles[profilesIds[i]].profilesMng.allocated);
++ p_FmPcd->p_FmPcdPlcr->profiles[profilesIds[i]].profilesMng.allocated = FALSE;
++ p_FmPcd->p_FmPcdPlcr->profiles[profilesIds[i]].profilesMng.ownerId = p_FmPcd->guestId;
++ }
++}
++
++/*********************************************/
++/*............Policer Exception..............*/
++/*********************************************/
++static void EventsCB(t_Handle h_FmPcd)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++ uint32_t event, mask, force;
++
++ ASSERT_COND(FmIsMaster(p_FmPcd->h_Fm));
++ event = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_evr);
++ mask = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier);
++
++ event &= mask;
++
++ /* clear the forced events */
++ force = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ifr);
++ if (force & event)
++ WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ifr, force & ~event);
++
++
++ WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_evr, event);
++
++ if (event & FM_PCD_PLCR_PRAM_SELF_INIT_COMPLETE)
++ p_FmPcd->f_Exception(p_FmPcd->h_App,e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE);
++ if (event & FM_PCD_PLCR_ATOMIC_ACTION_COMPLETE)
++ p_FmPcd->f_Exception(p_FmPcd->h_App,e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE);
++}
++
++/* ..... */
++
++static void ErrorExceptionsCB(t_Handle h_FmPcd)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++ uint32_t event, force, captureReg, mask;
++
++ ASSERT_COND(FmIsMaster(p_FmPcd->h_Fm));
++ event = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eevr);
++ mask = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier);
++
++ event &= mask;
++
++ /* clear the forced events */
++ force = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eifr);
++ if (force & event)
++ WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eifr, force & ~event);
++
++ WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eevr, event);
++
++ if (event & FM_PCD_PLCR_DOUBLE_ECC)
++ p_FmPcd->f_Exception(p_FmPcd->h_App,e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC);
++ if (event & FM_PCD_PLCR_INIT_ENTRY_ERROR)
++ {
++ captureReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_upcr);
++ /*ASSERT_COND(captureReg & PLCR_ERR_UNINIT_CAP);
++ p_UnInitCapt->profileNum = (uint8_t)(captureReg & PLCR_ERR_UNINIT_NUM_MASK);
++ p_UnInitCapt->portId = (uint8_t)((captureReg & PLCR_ERR_UNINIT_PID_MASK) >>PLCR_ERR_UNINIT_PID_SHIFT) ;
++ p_UnInitCapt->absolute = (bool)(captureReg & PLCR_ERR_UNINIT_ABSOLUTE_MASK);*/
++ p_FmPcd->f_FmPcdIndexedException(p_FmPcd->h_App,e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR,(uint16_t)(captureReg & PLCR_ERR_UNINIT_NUM_MASK));
++ WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_upcr, PLCR_ERR_UNINIT_CAP);
++ }
++}
++
++
++/*****************************************************************************/
++/* Inter-module API routines */
++/*****************************************************************************/
++
++t_Handle PlcrConfig(t_FmPcd *p_FmPcd, t_FmPcdParams *p_FmPcdParams)
++{
++ t_FmPcdPlcr *p_FmPcdPlcr;
++ uint16_t i=0;
++
++ UNUSED(p_FmPcd);
++ UNUSED(p_FmPcdParams);
++
++ p_FmPcdPlcr = (t_FmPcdPlcr *) XX_Malloc(sizeof(t_FmPcdPlcr));
++ if (!p_FmPcdPlcr)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Policer structure allocation FAILED"));
++ return NULL;
++ }
++ memset(p_FmPcdPlcr, 0, sizeof(t_FmPcdPlcr));
++ if (p_FmPcd->guestId == NCSW_MASTER_ID)
++ {
++ p_FmPcdPlcr->p_FmPcdPlcrRegs = (t_FmPcdPlcrRegs *)UINT_TO_PTR(FmGetPcdPlcrBaseAddr(p_FmPcdParams->h_Fm));
++ p_FmPcd->p_FmPcdDriverParam->plcrAutoRefresh = DEFAULT_plcrAutoRefresh;
++ p_FmPcd->exceptions |= (DEFAULT_fmPcdPlcrExceptions | DEFAULT_fmPcdPlcrErrorExceptions);
++ }
++
++ p_FmPcdPlcr->numOfSharedProfiles = DEFAULT_numOfSharedPlcrProfiles;
++
++ p_FmPcdPlcr->partPlcrProfilesBase = p_FmPcdParams->partPlcrProfilesBase;
++ p_FmPcdPlcr->partNumOfPlcrProfiles = p_FmPcdParams->partNumOfPlcrProfiles;
++ /* for backward compatabilty. if no policer profile, will set automatically to the max */
++ if ((p_FmPcd->guestId == NCSW_MASTER_ID) &&
++ (p_FmPcdPlcr->partNumOfPlcrProfiles == 0))
++ p_FmPcdPlcr->partNumOfPlcrProfiles = FM_PCD_PLCR_NUM_ENTRIES;
++
++ for (i=0; iprofiles[i].profilesMng.ownerId = (uint8_t)ILLEGAL_BASE;
++
++ return p_FmPcdPlcr;
++}
++
++t_Error PlcrInit(t_FmPcd *p_FmPcd)
++{
++ t_FmPcdDriverParam *p_Param = p_FmPcd->p_FmPcdDriverParam;
++ t_FmPcdPlcr *p_FmPcdPlcr = p_FmPcd->p_FmPcdPlcr;
++ t_FmPcdPlcrRegs *p_Regs = p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs;
++ t_Error err = E_OK;
++ uint32_t tmpReg32 = 0;
++ uint16_t base;
++
++ if ((p_FmPcdPlcr->partPlcrProfilesBase + p_FmPcdPlcr->partNumOfPlcrProfiles) > FM_PCD_PLCR_NUM_ENTRIES)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("partPlcrProfilesBase+partNumOfPlcrProfiles out of range!!!"));
++
++ p_FmPcdPlcr->h_HwSpinlock = XX_InitSpinlock();
++ if (!p_FmPcdPlcr->h_HwSpinlock)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("FM Policer HW spinlock"));
++
++ p_FmPcdPlcr->h_SwSpinlock = XX_InitSpinlock();
++ if (!p_FmPcdPlcr->h_SwSpinlock)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("FM Policer SW spinlock"));
++
++ base = PlcrAllocProfilesForPartition(p_FmPcd,
++ p_FmPcdPlcr->partPlcrProfilesBase,
++ p_FmPcdPlcr->partNumOfPlcrProfiles,
++ p_FmPcd->guestId);
++ if (base == (uint16_t)ILLEGAL_BASE)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, NO_MSG);
++
++ if (p_FmPcdPlcr->numOfSharedProfiles)
++ {
++ err = AllocSharedProfiles(p_FmPcd,
++ p_FmPcdPlcr->numOfSharedProfiles,
++ p_FmPcdPlcr->sharedProfilesIds);
++ if (err)
++ RETURN_ERROR(MAJOR, err,NO_MSG);
++ }
++
++ if (p_FmPcd->guestId != NCSW_MASTER_ID)
++ return E_OK;
++
++ /**********************FMPL_GCR******************/
++ tmpReg32 = 0;
++ tmpReg32 |= FM_PCD_PLCR_GCR_STEN;
++ if (p_Param->plcrAutoRefresh)
++ tmpReg32 |= FM_PCD_PLCR_GCR_DAR;
++ tmpReg32 |= GET_NIA_BMI_AC_ENQ_FRAME(p_FmPcd);
++
++ WRITE_UINT32(p_Regs->fmpl_gcr, tmpReg32);
++ /**********************FMPL_GCR******************/
++
++ /**********************FMPL_EEVR******************/
++ WRITE_UINT32(p_Regs->fmpl_eevr, (FM_PCD_PLCR_DOUBLE_ECC | FM_PCD_PLCR_INIT_ENTRY_ERROR));
++ /**********************FMPL_EEVR******************/
++ /**********************FMPL_EIER******************/
++ tmpReg32 = 0;
++ if (p_FmPcd->exceptions & FM_PCD_EX_PLCR_DOUBLE_ECC)
++ {
++ FmEnableRamsEcc(p_FmPcd->h_Fm);
++ tmpReg32 |= FM_PCD_PLCR_DOUBLE_ECC;
++ }
++ if (p_FmPcd->exceptions & FM_PCD_EX_PLCR_INIT_ENTRY_ERROR)
++ tmpReg32 |= FM_PCD_PLCR_INIT_ENTRY_ERROR;
++ WRITE_UINT32(p_Regs->fmpl_eier, tmpReg32);
++ /**********************FMPL_EIER******************/
++
++ /**********************FMPL_EVR******************/
++ WRITE_UINT32(p_Regs->fmpl_evr, (FM_PCD_PLCR_PRAM_SELF_INIT_COMPLETE | FM_PCD_PLCR_ATOMIC_ACTION_COMPLETE));
++ /**********************FMPL_EVR******************/
++ /**********************FMPL_IER******************/
++ tmpReg32 = 0;
++ if (p_FmPcd->exceptions & FM_PCD_EX_PLCR_PRAM_SELF_INIT_COMPLETE)
++ tmpReg32 |= FM_PCD_PLCR_PRAM_SELF_INIT_COMPLETE;
++ if (p_FmPcd->exceptions & FM_PCD_EX_PLCR_ATOMIC_ACTION_COMPLETE)
++ tmpReg32 |= FM_PCD_PLCR_ATOMIC_ACTION_COMPLETE;
++ WRITE_UINT32(p_Regs->fmpl_ier, tmpReg32);
++ /**********************FMPL_IER******************/
++
++ /* register even if no interrupts enabled, to allow future enablement */
++ FmRegisterIntr(p_FmPcd->h_Fm,
++ e_FM_MOD_PLCR,
++ 0,
++ e_FM_INTR_TYPE_ERR,
++ ErrorExceptionsCB,
++ p_FmPcd);
++ FmRegisterIntr(p_FmPcd->h_Fm,
++ e_FM_MOD_PLCR,
++ 0,
++ e_FM_INTR_TYPE_NORMAL,
++ EventsCB,
++ p_FmPcd);
++
++ /* driver initializes one DFLT profile at the last entry*/
++ /**********************FMPL_DPMR******************/
++ tmpReg32 = 0;
++ WRITE_UINT32(p_Regs->fmpl_dpmr, tmpReg32);
++ p_FmPcd->p_FmPcdPlcr->profiles[0].profilesMng.allocated = TRUE;
++
++ return E_OK;
++}
++
++t_Error PlcrFree(t_FmPcd *p_FmPcd)
++{
++ FmUnregisterIntr(p_FmPcd->h_Fm, e_FM_MOD_PLCR, 0, e_FM_INTR_TYPE_ERR);
++ FmUnregisterIntr(p_FmPcd->h_Fm, e_FM_MOD_PLCR, 0, e_FM_INTR_TYPE_NORMAL);
++
++ if (p_FmPcd->p_FmPcdPlcr->numOfSharedProfiles)
++ FreeSharedProfiles(p_FmPcd,
++ p_FmPcd->p_FmPcdPlcr->numOfSharedProfiles,
++ p_FmPcd->p_FmPcdPlcr->sharedProfilesIds);
++
++ if (p_FmPcd->p_FmPcdPlcr->partNumOfPlcrProfiles)
++ PlcrFreeProfilesForPartition(p_FmPcd,
++ p_FmPcd->p_FmPcdPlcr->partPlcrProfilesBase,
++ p_FmPcd->p_FmPcdPlcr->partNumOfPlcrProfiles,
++ p_FmPcd->guestId);
++
++ if (p_FmPcd->p_FmPcdPlcr->h_SwSpinlock)
++ XX_FreeSpinlock(p_FmPcd->p_FmPcdPlcr->h_SwSpinlock);
++
++ if (p_FmPcd->p_FmPcdPlcr->h_HwSpinlock)
++ XX_FreeSpinlock(p_FmPcd->p_FmPcdPlcr->h_HwSpinlock);
++
++ return E_OK;
++}
++
++void PlcrEnable(t_FmPcd *p_FmPcd)
++{
++ t_FmPcdPlcrRegs *p_Regs = p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs;
++
++ WRITE_UINT32(p_Regs->fmpl_gcr, GET_UINT32(p_Regs->fmpl_gcr) | FM_PCD_PLCR_GCR_EN);
++}
++
++void PlcrDisable(t_FmPcd *p_FmPcd)
++{
++ t_FmPcdPlcrRegs *p_Regs = p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs;
++
++ WRITE_UINT32(p_Regs->fmpl_gcr, GET_UINT32(p_Regs->fmpl_gcr) & ~FM_PCD_PLCR_GCR_EN);
++}
++
++uint16_t PlcrAllocProfilesForPartition(t_FmPcd *p_FmPcd, uint16_t base, uint16_t numOfProfiles, uint8_t guestId)
++{
++ uint32_t intFlags;
++ uint16_t profilesFound = 0;
++ int i = 0;
++
++ ASSERT_COND(p_FmPcd);
++ ASSERT_COND(p_FmPcd->p_FmPcdPlcr);
++
++ if (!numOfProfiles)
++ return 0;
++
++ if ((numOfProfiles > FM_PCD_PLCR_NUM_ENTRIES) ||
++ (base + numOfProfiles > FM_PCD_PLCR_NUM_ENTRIES))
++ return (uint16_t)ILLEGAL_BASE;
++
++ if (p_FmPcd->h_IpcSession)
++ {
++ t_FmIpcResourceAllocParams ipcAllocParams;
++ t_FmPcdIpcMsg msg;
++ t_FmPcdIpcReply reply;
++ t_Error err;
++ uint32_t replyLength;
++
++ memset(&msg, 0, sizeof(msg));
++ memset(&reply, 0, sizeof(reply));
++ memset(&ipcAllocParams, 0, sizeof(t_FmIpcResourceAllocParams));
++ ipcAllocParams.guestId = p_FmPcd->guestId;
++ ipcAllocParams.num = p_FmPcd->p_FmPcdPlcr->partNumOfPlcrProfiles;
++ ipcAllocParams.base = p_FmPcd->p_FmPcdPlcr->partPlcrProfilesBase;
++ msg.msgId = FM_PCD_ALLOC_PROFILES;
++ memcpy(msg.msgBody, &ipcAllocParams, sizeof(t_FmIpcResourceAllocParams));
++ replyLength = sizeof(uint32_t) + sizeof(uint16_t);
++ err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
++ (uint8_t*)&msg,
++ sizeof(msg.msgId) + sizeof(t_FmIpcResourceAllocParams),
++ (uint8_t*)&reply,
++ &replyLength,
++ NULL,
++ NULL);
++ if ((err != E_OK) ||
++ (replyLength != (sizeof(uint32_t) + sizeof(uint16_t))))
++ {
++ REPORT_ERROR(MAJOR, err, NO_MSG);
++ return (uint16_t)ILLEGAL_BASE;
++ }
++ else
++ memcpy((uint8_t*)&p_FmPcd->p_FmPcdPlcr->partPlcrProfilesBase, reply.replyBody, sizeof(uint16_t));
++ if (p_FmPcd->p_FmPcdPlcr->partPlcrProfilesBase == (uint16_t)ILLEGAL_BASE)
++ {
++ REPORT_ERROR(MAJOR, err, NO_MSG);
++ return (uint16_t)ILLEGAL_BASE;
++ }
++ }
++ else if (p_FmPcd->guestId != NCSW_MASTER_ID)
++ {
++ DBG(WARNING, ("FM Guest mode, without IPC - can't validate Policer-profiles range!"));
++ return (uint16_t)ILLEGAL_BASE;
++ }
++
++ intFlags = XX_LockIntrSpinlock(p_FmPcd->h_Spinlock);
++ for (i=base; i<(base+numOfProfiles); i++)
++ if (p_FmPcd->p_FmPcdPlcr->profiles[i].profilesMng.ownerId == (uint8_t)ILLEGAL_BASE)
++ profilesFound++;
++ else
++ break;
++
++ if (profilesFound == numOfProfiles)
++ for (i=base; i<(base+numOfProfiles); i++)
++ p_FmPcd->p_FmPcdPlcr->profiles[i].profilesMng.ownerId = guestId;
++ else
++ {
++ XX_UnlockIntrSpinlock(p_FmPcd->h_Spinlock, intFlags);
++ return (uint16_t)ILLEGAL_BASE;
++ }
++ XX_UnlockIntrSpinlock(p_FmPcd->h_Spinlock, intFlags);
++
++ return base;
++}
++
++void PlcrFreeProfilesForPartition(t_FmPcd *p_FmPcd, uint16_t base, uint16_t numOfProfiles, uint8_t guestId)
++{
++ int i = 0;
++
++ ASSERT_COND(p_FmPcd);
++ ASSERT_COND(p_FmPcd->p_FmPcdPlcr);
++
++ if (p_FmPcd->h_IpcSession)
++ {
++ t_FmIpcResourceAllocParams ipcAllocParams;
++ t_FmPcdIpcMsg msg;
++ t_Error err;
++
++ memset(&msg, 0, sizeof(msg));
++ memset(&ipcAllocParams, 0, sizeof(t_FmIpcResourceAllocParams));
++ ipcAllocParams.guestId = p_FmPcd->guestId;
++ ipcAllocParams.num = p_FmPcd->p_FmPcdPlcr->partNumOfPlcrProfiles;
++ ipcAllocParams.base = p_FmPcd->p_FmPcdPlcr->partPlcrProfilesBase;
++ msg.msgId = FM_PCD_FREE_PROFILES;
++ memcpy(msg.msgBody, &ipcAllocParams, sizeof(t_FmIpcResourceAllocParams));
++ err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
++ (uint8_t*)&msg,
++ sizeof(msg.msgId) + sizeof(t_FmIpcResourceAllocParams),
++ NULL,
++ NULL,
++ NULL,
++ NULL);
++ if (err != E_OK)
++ REPORT_ERROR(MAJOR, err, NO_MSG);
++ return;
++ }
++ else if (p_FmPcd->guestId != NCSW_MASTER_ID)
++ {
++ DBG(WARNING, ("FM Guest mode, without IPC - can't validate Policer-profiles range!"));
++ return;
++ }
++
++ for (i=base; i<(base+numOfProfiles); i++)
++ {
++ if (p_FmPcd->p_FmPcdPlcr->profiles[i].profilesMng.ownerId == guestId)
++ p_FmPcd->p_FmPcdPlcr->profiles[i].profilesMng.ownerId = (uint8_t)ILLEGAL_BASE;
++ else
++ DBG(WARNING, ("Request for freeing storage profile window which wasn't allocated to this partition"));
++ }
++}
++
++t_Error PlcrSetPortProfiles(t_FmPcd *p_FmPcd,
++ uint8_t hardwarePortId,
++ uint16_t numOfProfiles,
++ uint16_t base)
++{
++ t_FmPcdPlcrRegs *p_Regs = p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs;
++ uint32_t log2Num, tmpReg32;
++
++ if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
++ !p_Regs &&
++ p_FmPcd->h_IpcSession)
++ {
++ t_FmIpcResourceAllocParams ipcAllocParams;
++ t_FmPcdIpcMsg msg;
++ t_Error err;
++
++ memset(&msg, 0, sizeof(msg));
++ memset(&ipcAllocParams, 0, sizeof(t_FmIpcResourceAllocParams));
++ ipcAllocParams.guestId = hardwarePortId;
++ ipcAllocParams.num = numOfProfiles;
++ ipcAllocParams.base = base;
++ msg.msgId = FM_PCD_SET_PORT_PROFILES;
++ memcpy(msg.msgBody, &ipcAllocParams, sizeof(t_FmIpcResourceAllocParams));
++ err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
++ (uint8_t*)&msg,
++ sizeof(msg.msgId) + sizeof(t_FmIpcResourceAllocParams),
++ NULL,
++ NULL,
++ NULL,
++ NULL);
++ if (err != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ return E_OK;
++ }
++ else if (!p_Regs)
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
++ ("Either IPC or 'baseAddress' is required!"));
++
++ ASSERT_COND(IN_RANGE(1, hardwarePortId, 63));
++
++ if (GET_UINT32(p_Regs->fmpl_pmr[hardwarePortId-1]) & FM_PCD_PLCR_PMR_V)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE,
++ ("The requesting port has already an allocated profiles window."));
++
++ /**********************FMPL_PMRx******************/
++ LOG2((uint64_t)numOfProfiles, log2Num);
++ tmpReg32 = base;
++ tmpReg32 |= log2Num << 16;
++ tmpReg32 |= FM_PCD_PLCR_PMR_V;
++ WRITE_UINT32(p_Regs->fmpl_pmr[hardwarePortId-1], tmpReg32);
++
++ return E_OK;
++}
++
++t_Error PlcrClearPortProfiles(t_FmPcd *p_FmPcd, uint8_t hardwarePortId)
++{
++ t_FmPcdPlcrRegs *p_Regs = p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs;
++
++ if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
++ !p_Regs &&
++ p_FmPcd->h_IpcSession)
++ {
++ t_FmIpcResourceAllocParams ipcAllocParams;
++ t_FmPcdIpcMsg msg;
++ t_Error err;
++
++ memset(&msg, 0, sizeof(msg));
++ memset(&ipcAllocParams, 0, sizeof(t_FmIpcResourceAllocParams));
++ ipcAllocParams.guestId = hardwarePortId;
++ msg.msgId = FM_PCD_CLEAR_PORT_PROFILES;
++ memcpy(msg.msgBody, &ipcAllocParams, sizeof(t_FmIpcResourceAllocParams));
++ err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
++ (uint8_t*)&msg,
++ sizeof(msg.msgId) + sizeof(t_FmIpcResourceAllocParams),
++ NULL,
++ NULL,
++ NULL,
++ NULL);
++ if (err != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ return E_OK;
++ }
++ else if (!p_Regs)
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
++ ("Either IPC or 'baseAddress' is required!"));
++
++ ASSERT_COND(IN_RANGE(1, hardwarePortId, 63));
++ WRITE_UINT32(p_Regs->fmpl_pmr[hardwarePortId-1], 0);
++
++ return E_OK;
++}
++
++t_Error FmPcdPlcrAllocProfiles(t_Handle h_FmPcd, uint8_t hardwarePortId, uint16_t numOfProfiles)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ t_Error err = E_OK;
++ uint32_t profilesFound;
++ uint32_t intFlags;
++ uint16_t i, first, swPortIndex = 0;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++
++ if (!numOfProfiles)
++ return E_OK;
++
++ ASSERT_COND(hardwarePortId);
++
++ if (numOfProfiles>FM_PCD_PLCR_NUM_ENTRIES)
++ RETURN_ERROR(MINOR, E_INVALID_VALUE, ("numProfiles is too big."));
++
++ if (!POWER_OF_2(numOfProfiles))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("numProfiles must be a power of 2."));
++
++ first = 0;
++ profilesFound = 0;
++ intFlags = PlcrSwLock(p_FmPcd->p_FmPcdPlcr);
++
++ for (i=0; ip_FmPcdPlcr->profiles[i].profilesMng.allocated)
++ {
++ profilesFound++;
++ i++;
++ if (profilesFound == numOfProfiles)
++ break;
++ }
++ else
++ {
++ profilesFound = 0;
++ /* advance i to the next aligned address */
++ i = first = (uint16_t)(first + numOfProfiles);
++ }
++ }
++
++ if (profilesFound == numOfProfiles)
++ {
++ for (i=first; ip_FmPcdPlcr->profiles[i].profilesMng.allocated = TRUE;
++ p_FmPcd->p_FmPcdPlcr->profiles[i].profilesMng.ownerId = hardwarePortId;
++ }
++ }
++ else
++ {
++ PlcrSwUnlock(p_FmPcd->p_FmPcdPlcr, intFlags);
++ RETURN_ERROR(MINOR, E_FULL, ("No profiles."));
++ }
++ PlcrSwUnlock(p_FmPcd->p_FmPcdPlcr, intFlags);
++
++ err = PlcrSetPortProfiles(p_FmPcd, hardwarePortId, numOfProfiles, first);
++ if (err)
++ {
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, hardwarePortId);
++
++ p_FmPcd->p_FmPcdPlcr->portsMapping[swPortIndex].numOfProfiles = numOfProfiles;
++ p_FmPcd->p_FmPcdPlcr->portsMapping[swPortIndex].profilesBase = first;
++
++ return E_OK;
++}
++
++t_Error FmPcdPlcrFreeProfiles(t_Handle h_FmPcd, uint8_t hardwarePortId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ t_Error err = E_OK;
++ uint32_t intFlags;
++ uint16_t i, swPortIndex = 0;
++
++ ASSERT_COND(IN_RANGE(1, hardwarePortId, 63));
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_HANDLE);
++
++ HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, hardwarePortId);
++
++ err = PlcrClearPortProfiles(p_FmPcd, hardwarePortId);
++ if (err)
++ RETURN_ERROR(MAJOR, err,NO_MSG);
++
++ intFlags = PlcrSwLock(p_FmPcd->p_FmPcdPlcr);
++ for (i=p_FmPcd->p_FmPcdPlcr->portsMapping[swPortIndex].profilesBase;
++ i<(p_FmPcd->p_FmPcdPlcr->portsMapping[swPortIndex].profilesBase +
++ p_FmPcd->p_FmPcdPlcr->portsMapping[swPortIndex].numOfProfiles);
++ i++)
++ {
++ ASSERT_COND(p_FmPcd->p_FmPcdPlcr->profiles[i].profilesMng.ownerId == hardwarePortId);
++ ASSERT_COND(p_FmPcd->p_FmPcdPlcr->profiles[i].profilesMng.allocated);
++
++ p_FmPcd->p_FmPcdPlcr->profiles[i].profilesMng.allocated = FALSE;
++ p_FmPcd->p_FmPcdPlcr->profiles[i].profilesMng.ownerId = p_FmPcd->guestId;
++ }
++ PlcrSwUnlock(p_FmPcd->p_FmPcdPlcr, intFlags);
++
++ p_FmPcd->p_FmPcdPlcr->portsMapping[swPortIndex].numOfProfiles = 0;
++ p_FmPcd->p_FmPcdPlcr->portsMapping[swPortIndex].profilesBase = 0;
++
++ return E_OK;
++}
++
++t_Error FmPcdPlcrCcGetSetParams(t_Handle h_FmPcd, uint16_t profileIndx ,uint32_t requiredAction)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++ t_FmPcdPlcr *p_FmPcdPlcr = p_FmPcd->p_FmPcdPlcr;
++ t_FmPcdPlcrRegs *p_FmPcdPlcrRegs = p_FmPcdPlcr->p_FmPcdPlcrRegs;
++ uint32_t tmpReg32, intFlags;
++ t_Error err;
++
++ /* Calling function locked all PCD modules, so no need to lock here */
++
++ if (profileIndx >= FM_PCD_PLCR_NUM_ENTRIES)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE,("Policer profile out of range"));
++
++ if (!FmPcdPlcrIsProfileValid(p_FmPcd, profileIndx))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE,("Policer profile is not valid"));
++
++ /*intFlags = PlcrProfileLock(&p_FmPcd->p_FmPcdPlcr->profiles[profileIndx]);*/
++
++ if (p_FmPcd->h_Hc)
++ {
++ err = FmHcPcdPlcrCcGetSetParams(p_FmPcd->h_Hc, profileIndx, requiredAction);
++
++ FmPcdPlcrUpatePointedOwner(p_FmPcd, profileIndx, TRUE);
++ FmPcdPlcrUpdateRequiredAction(p_FmPcd, profileIndx, requiredAction);
++
++ /*PlcrProfileUnlock(&p_FmPcd->p_FmPcdPlcr->profiles[profileIndx], intFlags);*/
++ return err;
++ }
++
++ /* lock the HW because once we read the registers we don't want them to be changed
++ * by another access. (We can copy to a tmp location and release the lock!) */
++
++ intFlags = PlcrHwLock(p_FmPcdPlcr);
++ WritePar(p_FmPcd, FmPcdPlcrBuildReadPlcrActionReg(profileIndx));
++
++ if (!p_FmPcd->p_FmPcdPlcr->profiles[profileIndx].pointedOwners ||
++ !(p_FmPcd->p_FmPcdPlcr->profiles[profileIndx].requiredAction & requiredAction))
++ {
++ if (requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA)
++ {
++ if ((p_FmPcd->p_FmPcdPlcr->profiles[profileIndx].nextEngineOnGreen!= e_FM_PCD_DONE) ||
++ (p_FmPcd->p_FmPcdPlcr->profiles[profileIndx].nextEngineOnYellow!= e_FM_PCD_DONE) ||
++ (p_FmPcd->p_FmPcdPlcr->profiles[profileIndx].nextEngineOnRed!= e_FM_PCD_DONE))
++ {
++ PlcrHwUnlock(p_FmPcdPlcr, intFlags);
++ /*PlcrProfileUnlock(&p_FmPcd->p_FmPcdPlcr->profiles[profileIndx], intFlags);*/
++ RETURN_ERROR (MAJOR, E_OK, ("In this case the next engine can be e_FM_PCD_DONE"));
++ }
++
++ if (p_FmPcd->p_FmPcdPlcr->profiles[profileIndx].paramsOnGreen.action == e_FM_PCD_ENQ_FRAME)
++ {
++ tmpReg32 = GET_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_pegnia);
++ if (!(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)))
++ {
++ PlcrHwUnlock(p_FmPcdPlcr, intFlags);
++ /*PlcrProfileUnlock(&p_FmPcd->p_FmPcdPlcr->profiles[profileIndx], intFlags);*/
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Next engine of this policer profile has to be assigned to FM_PCD_DONE"));
++ }
++ tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_pegnia, tmpReg32);
++ tmpReg32 = FmPcdPlcrBuildWritePlcrActionReg(profileIndx);
++ tmpReg32 |= FM_PCD_PLCR_PAR_PWSEL_PEGNIA;
++ WritePar(p_FmPcd, tmpReg32);
++ }
++
++ if (p_FmPcd->p_FmPcdPlcr->profiles[profileIndx].paramsOnYellow.action == e_FM_PCD_ENQ_FRAME)
++ {
++ tmpReg32 = GET_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_peynia);
++ if (!(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)))
++ {
++ PlcrHwUnlock(p_FmPcdPlcr, intFlags);
++ /*PlcrProfileUnlock(&p_FmPcd->p_FmPcdPlcr->profiles[profileIndx], intFlags);*/
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Next engine of this policer profile has to be assigned to FM_PCD_DONE"));
++ }
++ tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_peynia, tmpReg32);
++ tmpReg32 = FmPcdPlcrBuildWritePlcrActionReg(profileIndx);
++ tmpReg32 |= FM_PCD_PLCR_PAR_PWSEL_PEYNIA;
++ WritePar(p_FmPcd, tmpReg32);
++ PlcrHwUnlock(p_FmPcdPlcr, intFlags);
++ }
++
++ if (p_FmPcd->p_FmPcdPlcr->profiles[profileIndx].paramsOnRed.action == e_FM_PCD_ENQ_FRAME)
++ {
++ tmpReg32 = GET_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_pernia);
++ if (!(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)))
++ {
++ PlcrHwUnlock(p_FmPcdPlcr, intFlags);
++ /*PlcrProfileUnlock(&p_FmPcd->p_FmPcdPlcr->profiles[profileIndx], intFlags);*/
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Next engine of this policer profile has to be assigned to FM_PCD_DONE"));
++ }
++ tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_pernia, tmpReg32);
++ tmpReg32 = FmPcdPlcrBuildWritePlcrActionReg(profileIndx);
++ tmpReg32 |= FM_PCD_PLCR_PAR_PWSEL_PERNIA;
++ WritePar(p_FmPcd, tmpReg32);
++
++ }
++ }
++ }
++ PlcrHwUnlock(p_FmPcdPlcr, intFlags);
++
++ FmPcdPlcrUpatePointedOwner(p_FmPcd, profileIndx, TRUE);
++ FmPcdPlcrUpdateRequiredAction(p_FmPcd, profileIndx, requiredAction);
++
++ /*PlcrProfileUnlock(&p_FmPcd->p_FmPcdPlcr->profiles[profileIndx], intFlags);*/
++
++ return E_OK;
++}
++
++void FmPcdPlcrUpatePointedOwner(t_Handle h_FmPcd, uint16_t absoluteProfileId, bool add)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ /* this routine is protected by calling routine */
++
++ ASSERT_COND(p_FmPcd->p_FmPcdPlcr->profiles[absoluteProfileId].valid);
++
++ if (add)
++ p_FmPcd->p_FmPcdPlcr->profiles[absoluteProfileId].pointedOwners++;
++ else
++ p_FmPcd->p_FmPcdPlcr->profiles[absoluteProfileId].pointedOwners--;
++}
++
++uint32_t FmPcdPlcrGetPointedOwners(t_Handle h_FmPcd, uint16_t absoluteProfileId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ ASSERT_COND(p_FmPcd->p_FmPcdPlcr->profiles[absoluteProfileId].valid);
++
++ return p_FmPcd->p_FmPcdPlcr->profiles[absoluteProfileId].pointedOwners;
++}
++
++uint32_t FmPcdPlcrGetRequiredAction(t_Handle h_FmPcd, uint16_t absoluteProfileId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ ASSERT_COND(p_FmPcd->p_FmPcdPlcr->profiles[absoluteProfileId].valid);
++
++ return p_FmPcd->p_FmPcdPlcr->profiles[absoluteProfileId].requiredAction;
++}
++
++bool FmPcdPlcrIsProfileValid(t_Handle h_FmPcd, uint16_t absoluteProfileId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ t_FmPcdPlcr *p_FmPcdPlcr = p_FmPcd->p_FmPcdPlcr;
++
++ ASSERT_COND(absoluteProfileId < FM_PCD_PLCR_NUM_ENTRIES);
++
++ return p_FmPcdPlcr->profiles[absoluteProfileId].valid;
++}
++
++void FmPcdPlcrValidateProfileSw(t_Handle h_FmPcd, uint16_t absoluteProfileId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ uint32_t intFlags;
++
++ ASSERT_COND(!p_FmPcd->p_FmPcdPlcr->profiles[absoluteProfileId].valid);
++
++ intFlags = PlcrProfileLock(&p_FmPcd->p_FmPcdPlcr->profiles[absoluteProfileId]);
++ p_FmPcd->p_FmPcdPlcr->profiles[absoluteProfileId].valid = TRUE;
++ PlcrProfileUnlock(&p_FmPcd->p_FmPcdPlcr->profiles[absoluteProfileId], intFlags);
++}
++
++void FmPcdPlcrInvalidateProfileSw(t_Handle h_FmPcd, uint16_t absoluteProfileId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ uint32_t intFlags;
++
++ ASSERT_COND(p_FmPcd->p_FmPcdPlcr->profiles[absoluteProfileId].valid);
++
++ intFlags = PlcrProfileLock(&p_FmPcd->p_FmPcdPlcr->profiles[absoluteProfileId]);
++ p_FmPcd->p_FmPcdPlcr->profiles[absoluteProfileId].valid = FALSE;
++ PlcrProfileUnlock(&p_FmPcd->p_FmPcdPlcr->profiles[absoluteProfileId], intFlags);
++}
++
++uint16_t FmPcdPlcrProfileGetAbsoluteId(t_Handle h_Profile)
++{
++ return ((t_FmPcdPlcrProfile*)h_Profile)->absoluteProfileId;
++}
++
++t_Error FmPcdPlcrGetAbsoluteIdByProfileParams(t_Handle h_FmPcd,
++ e_FmPcdProfileTypeSelection profileType,
++ t_Handle h_FmPort,
++ uint16_t relativeProfile,
++ uint16_t *p_AbsoluteId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ t_FmPcdPlcr *p_FmPcdPlcr = p_FmPcd->p_FmPcdPlcr;
++ uint8_t i;
++
++ switch (profileType)
++ {
++ case e_FM_PCD_PLCR_PORT_PRIVATE:
++ /* get port PCD id from port handle */
++ for (i=0;ip_FmPcdPlcr->portsMapping[i].h_FmPort == h_FmPort)
++ break;
++ if (i == FM_MAX_NUM_OF_PORTS)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE , ("Invalid port handle."));
++
++ if (!p_FmPcd->p_FmPcdPlcr->portsMapping[i].numOfProfiles)
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION , ("Port has no allocated profiles"));
++ if (relativeProfile >= p_FmPcd->p_FmPcdPlcr->portsMapping[i].numOfProfiles)
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION , ("Profile id is out of range"));
++ *p_AbsoluteId = (uint16_t)(p_FmPcd->p_FmPcdPlcr->portsMapping[i].profilesBase + relativeProfile);
++ break;
++ case e_FM_PCD_PLCR_SHARED:
++ if (relativeProfile >= p_FmPcdPlcr->numOfSharedProfiles)
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION , ("Profile id is out of range"));
++ *p_AbsoluteId = (uint16_t)(p_FmPcdPlcr->sharedProfilesIds[relativeProfile]);
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, ("Invalid policer profile type"));
++ }
++
++ return E_OK;
++}
++
++uint16_t FmPcdPlcrGetPortProfilesBase(t_Handle h_FmPcd, uint8_t hardwarePortId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++ uint16_t swPortIndex = 0;
++
++ HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, hardwarePortId);
++
++ return p_FmPcd->p_FmPcdPlcr->portsMapping[swPortIndex].profilesBase;
++}
++
++uint16_t FmPcdPlcrGetPortNumOfProfiles(t_Handle h_FmPcd, uint8_t hardwarePortId)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++ uint16_t swPortIndex = 0;
++
++ HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, hardwarePortId);
++
++ return p_FmPcd->p_FmPcdPlcr->portsMapping[swPortIndex].numOfProfiles;
++
++}
++uint32_t FmPcdPlcrBuildWritePlcrActionReg(uint16_t absoluteProfileId)
++{
++ return (uint32_t)(FM_PCD_PLCR_PAR_GO |
++ ((uint32_t)absoluteProfileId << FM_PCD_PLCR_PAR_PNUM_SHIFT));
++}
++
++uint32_t FmPcdPlcrBuildWritePlcrActionRegs(uint16_t absoluteProfileId)
++{
++ return (uint32_t)(FM_PCD_PLCR_PAR_GO |
++ ((uint32_t)absoluteProfileId << FM_PCD_PLCR_PAR_PNUM_SHIFT) |
++ FM_PCD_PLCR_PAR_PWSEL_MASK);
++}
++
++bool FmPcdPlcrHwProfileIsValid(uint32_t profileModeReg)
++{
++
++ if (profileModeReg & FM_PCD_PLCR_PEMODE_PI)
++ return TRUE;
++ else
++ return FALSE;
++}
++
++uint32_t FmPcdPlcrBuildReadPlcrActionReg(uint16_t absoluteProfileId)
++{
++ return (uint32_t)(FM_PCD_PLCR_PAR_GO |
++ FM_PCD_PLCR_PAR_R |
++ ((uint32_t)absoluteProfileId << FM_PCD_PLCR_PAR_PNUM_SHIFT) |
++ FM_PCD_PLCR_PAR_PWSEL_MASK);
++}
++
++uint32_t FmPcdPlcrBuildCounterProfileReg(e_FmPcdPlcrProfileCounters counter)
++{
++ switch (counter)
++ {
++ case (e_FM_PCD_PLCR_PROFILE_GREEN_PACKET_TOTAL_COUNTER):
++ return FM_PCD_PLCR_PAR_PWSEL_PEGPC;
++ case (e_FM_PCD_PLCR_PROFILE_YELLOW_PACKET_TOTAL_COUNTER):
++ return FM_PCD_PLCR_PAR_PWSEL_PEYPC;
++ case (e_FM_PCD_PLCR_PROFILE_RED_PACKET_TOTAL_COUNTER) :
++ return FM_PCD_PLCR_PAR_PWSEL_PERPC;
++ case (e_FM_PCD_PLCR_PROFILE_RECOLOURED_YELLOW_PACKET_TOTAL_COUNTER) :
++ return FM_PCD_PLCR_PAR_PWSEL_PERYPC;
++ case (e_FM_PCD_PLCR_PROFILE_RECOLOURED_RED_PACKET_TOTAL_COUNTER) :
++ return FM_PCD_PLCR_PAR_PWSEL_PERRPC;
++ default:
++ REPORT_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
++ return 0;
++ }
++}
++
++uint32_t FmPcdPlcrBuildNiaProfileReg(bool green, bool yellow, bool red)
++{
++
++ uint32_t tmpReg32 = 0;
++
++ if (green)
++ tmpReg32 |= FM_PCD_PLCR_PAR_PWSEL_PEGNIA;
++ if (yellow)
++ tmpReg32 |= FM_PCD_PLCR_PAR_PWSEL_PEYNIA;
++ if (red)
++ tmpReg32 |= FM_PCD_PLCR_PAR_PWSEL_PERNIA;
++
++ return tmpReg32;
++}
++
++void FmPcdPlcrUpdateRequiredAction(t_Handle h_FmPcd, uint16_t absoluteProfileId, uint32_t requiredAction)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ /* this routine is protected by calling routine */
++
++ ASSERT_COND(p_FmPcd->p_FmPcdPlcr->profiles[absoluteProfileId].valid);
++
++ p_FmPcd->p_FmPcdPlcr->profiles[absoluteProfileId].requiredAction |= requiredAction;
++}
++/*********************** End of inter-module routines ************************/
++
++
++/**************************************************/
++/*............Policer API.........................*/
++/**************************************************/
++
++t_Error FM_PCD_ConfigPlcrAutoRefreshMode(t_Handle h_FmPcd, bool enable)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdDriverParam, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdPlcr, E_INVALID_HANDLE);
++
++ if (!FmIsMaster(p_FmPcd->h_Fm))
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_ConfigPlcrAutoRefreshMode - guest mode!"));
++
++ p_FmPcd->p_FmPcdDriverParam->plcrAutoRefresh = enable;
++
++ return E_OK;
++}
++
++t_Error FM_PCD_ConfigPlcrNumOfSharedProfiles(t_Handle h_FmPcd, uint16_t numOfSharedPlcrProfiles)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdDriverParam, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdPlcr, E_INVALID_HANDLE);
++
++ p_FmPcd->p_FmPcdPlcr->numOfSharedProfiles = numOfSharedPlcrProfiles;
++
++ return E_OK;
++}
++
++t_Error FM_PCD_SetPlcrStatistics(t_Handle h_FmPcd, bool enable)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ uint32_t tmpReg32;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdPlcr, E_INVALID_HANDLE);
++
++ if (!FmIsMaster(p_FmPcd->h_Fm))
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_SetPlcrStatistics - guest mode!"));
++
++ tmpReg32 = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_gcr);
++ if (enable)
++ tmpReg32 |= FM_PCD_PLCR_GCR_STEN;
++ else
++ tmpReg32 &= ~FM_PCD_PLCR_GCR_STEN;
++
++ WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_gcr, tmpReg32);
++ return E_OK;
++}
++
++/* ... */
++#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
++t_Error FM_PCD_PlcrDumpRegs(t_Handle h_FmPcd)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ int i = 0;
++
++ DECLARE_DUMP;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdPlcr, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(((p_FmPcd->guestId == NCSW_MASTER_ID) ||
++ p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs), E_INVALID_OPERATION);
++
++ DUMP_SUBTITLE(("\n"));
++ DUMP_TITLE(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs, ("FM-PCD policer regs"));
++
++ DUMP_VAR(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs,fmpl_gcr);
++ DUMP_VAR(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs,fmpl_gsr);
++ DUMP_VAR(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs,fmpl_evr);
++ DUMP_VAR(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs,fmpl_ier);
++ DUMP_VAR(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs,fmpl_ifr);
++ DUMP_VAR(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs,fmpl_eevr);
++ DUMP_VAR(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs,fmpl_eier);
++ DUMP_VAR(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs,fmpl_eifr);
++ DUMP_VAR(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs,fmpl_rpcnt);
++ DUMP_VAR(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs,fmpl_ypcnt);
++ DUMP_VAR(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs,fmpl_rrpcnt);
++ DUMP_VAR(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs,fmpl_rypcnt);
++ DUMP_VAR(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs,fmpl_tpcnt);
++ DUMP_VAR(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs,fmpl_flmcnt);
++
++ DUMP_VAR(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs,fmpl_serc);
++ DUMP_VAR(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs,fmpl_upcr);
++ DUMP_VAR(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs,fmpl_dpmr);
++
++ DUMP_TITLE(&p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_pmr, ("fmpl_pmr"));
++ DUMP_SUBSTRUCT_ARRAY(i, 63)
++ {
++ DUMP_MEMORY(&p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_pmr[i], sizeof(uint32_t));
++ }
++
++ return E_OK;
++}
++#endif /* (defined(DEBUG_ERRORS) && ... */
++
++t_Handle FM_PCD_PlcrProfileSet(t_Handle h_FmPcd,
++ t_FmPcdPlcrProfileParams *p_ProfileParams)
++{
++ t_FmPcd *p_FmPcd;
++ t_FmPcdPlcrRegs *p_FmPcdPlcrRegs;
++ t_FmPcdPlcrProfileRegs plcrProfileReg;
++ uint32_t intFlags;
++ uint16_t absoluteProfileId;
++ t_Error err = E_OK;
++ uint32_t tmpReg32;
++ t_FmPcdPlcrProfile *p_Profile;
++
++ SANITY_CHECK_RETURN_VALUE(h_FmPcd, E_INVALID_HANDLE, NULL);
++
++ if (p_ProfileParams->modify)
++ {
++ p_Profile = (t_FmPcdPlcrProfile *)p_ProfileParams->id.h_Profile;
++ p_FmPcd = p_Profile->h_FmPcd;
++ absoluteProfileId = p_Profile->absoluteProfileId;
++ if (absoluteProfileId >= FM_PCD_PLCR_NUM_ENTRIES)
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("profileId too Big "));
++ return NULL;
++ }
++
++ SANITY_CHECK_RETURN_VALUE(p_FmPcd->p_FmPcdPlcr, E_INVALID_HANDLE, NULL);
++
++ /* Try lock profile using flag */
++ if (!PlcrProfileFlagTryLock(p_Profile))
++ {
++ DBG(TRACE, ("Profile Try Lock - BUSY"));
++ /* Signal to caller BUSY condition */
++ p_ProfileParams->id.h_Profile = NULL;
++ return NULL;
++ }
++ }
++ else
++ {
++ p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ SANITY_CHECK_RETURN_VALUE(p_FmPcd->p_FmPcdPlcr, E_INVALID_HANDLE, NULL);
++
++ /* SMP: needs to be protected only if another core now changes the windows */
++ err = FmPcdPlcrGetAbsoluteIdByProfileParams(h_FmPcd,
++ p_ProfileParams->id.newParams.profileType,
++ p_ProfileParams->id.newParams.h_FmPort,
++ p_ProfileParams->id.newParams.relativeProfileId,
++ &absoluteProfileId);
++
++ if (absoluteProfileId >= FM_PCD_PLCR_NUM_ENTRIES)
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("profileId too Big "));
++ return NULL;
++ }
++
++ if (FmPcdPlcrIsProfileValid(p_FmPcd, absoluteProfileId))
++ {
++ REPORT_ERROR(MAJOR, E_ALREADY_EXISTS, ("Policer Profile is already used"));
++ return NULL;
++ }
++
++ /* initialize profile struct */
++ p_Profile = &p_FmPcd->p_FmPcdPlcr->profiles[absoluteProfileId];
++ p_Profile->h_FmPcd = p_FmPcd;
++ p_Profile->absoluteProfileId = absoluteProfileId;
++
++ p_Profile->p_Lock = FmPcdAcquireLock(p_FmPcd);
++ if (!p_Profile->p_Lock)
++ REPORT_ERROR(MAJOR, E_NOT_AVAILABLE, ("FM Policer Profile lock obj!"));
++ }
++
++ SANITY_CHECK_RETURN_VALUE(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE, NULL);
++
++ p_Profile->nextEngineOnGreen = p_ProfileParams->nextEngineOnGreen;
++ memcpy(&p_Profile->paramsOnGreen, &(p_ProfileParams->paramsOnGreen), sizeof(u_FmPcdPlcrNextEngineParams));
++
++ p_Profile->nextEngineOnYellow = p_ProfileParams->nextEngineOnYellow;
++ memcpy(&p_Profile->paramsOnYellow, &(p_ProfileParams->paramsOnYellow), sizeof(u_FmPcdPlcrNextEngineParams));
++
++ p_Profile->nextEngineOnRed = p_ProfileParams->nextEngineOnRed;
++ memcpy(&p_Profile->paramsOnRed, &(p_ProfileParams->paramsOnRed), sizeof(u_FmPcdPlcrNextEngineParams));
++
++ memset(&plcrProfileReg, 0, sizeof(t_FmPcdPlcrProfileRegs));
++
++ /* build the policer profile registers */
++ err = BuildProfileRegs(h_FmPcd, p_ProfileParams, &plcrProfileReg);
++ if (err)
++ {
++ REPORT_ERROR(MAJOR, err, NO_MSG);
++ if (p_ProfileParams->modify)
++ /* unlock */
++ PlcrProfileFlagUnlock(p_Profile);
++ if (!p_ProfileParams->modify &&
++ p_Profile->p_Lock)
++ /* release allocated Profile lock */
++ FmPcdReleaseLock(p_FmPcd, p_Profile->p_Lock);
++ return NULL;
++ }
++
++ if (p_FmPcd->h_Hc)
++ {
++ err = FmHcPcdPlcrSetProfile(p_FmPcd->h_Hc, (t_Handle)p_Profile, &plcrProfileReg);
++ if (p_ProfileParams->modify)
++ PlcrProfileFlagUnlock(p_Profile);
++ if (err)
++ {
++ /* release the allocated scheme lock */
++ if (!p_ProfileParams->modify &&
++ p_Profile->p_Lock)
++ FmPcdReleaseLock(p_FmPcd, p_Profile->p_Lock);
++
++ return NULL;
++ }
++ if (!p_ProfileParams->modify)
++ FmPcdPlcrValidateProfileSw(p_FmPcd,absoluteProfileId);
++ return (t_Handle)p_Profile;
++ }
++
++ p_FmPcdPlcrRegs = p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs;
++ SANITY_CHECK_RETURN_VALUE(p_FmPcdPlcrRegs, E_INVALID_HANDLE, NULL);
++
++ intFlags = PlcrHwLock(p_FmPcd->p_FmPcdPlcr);
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_pemode , plcrProfileReg.fmpl_pemode);
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_pegnia , plcrProfileReg.fmpl_pegnia);
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_peynia , plcrProfileReg.fmpl_peynia);
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_pernia , plcrProfileReg.fmpl_pernia);
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_pecir , plcrProfileReg.fmpl_pecir);
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_pecbs , plcrProfileReg.fmpl_pecbs);
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_pepepir_eir,plcrProfileReg.fmpl_pepepir_eir);
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_pepbs_ebs,plcrProfileReg.fmpl_pepbs_ebs);
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_pelts , plcrProfileReg.fmpl_pelts);
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_pects , plcrProfileReg.fmpl_pects);
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_pepts_ets,plcrProfileReg.fmpl_pepts_ets);
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_pegpc , plcrProfileReg.fmpl_pegpc);
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_peypc , plcrProfileReg.fmpl_peypc);
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_perpc , plcrProfileReg.fmpl_perpc);
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_perypc , plcrProfileReg.fmpl_perypc);
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_perrpc , plcrProfileReg.fmpl_perrpc);
++
++ tmpReg32 = FmPcdPlcrBuildWritePlcrActionRegs(absoluteProfileId);
++ WritePar(p_FmPcd, tmpReg32);
++
++ PlcrHwUnlock(p_FmPcd->p_FmPcdPlcr, intFlags);
++
++ if (!p_ProfileParams->modify)
++ FmPcdPlcrValidateProfileSw(p_FmPcd,absoluteProfileId);
++ else
++ PlcrProfileFlagUnlock(p_Profile);
++
++ return (t_Handle)p_Profile;
++}
++
++t_Error FM_PCD_PlcrProfileDelete(t_Handle h_Profile)
++{
++ t_FmPcdPlcrProfile *p_Profile = (t_FmPcdPlcrProfile*)h_Profile;
++ t_FmPcd *p_FmPcd;
++ uint16_t profileIndx;
++ uint32_t tmpReg32, intFlags;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_Profile, E_INVALID_HANDLE);
++ p_FmPcd = p_Profile->h_FmPcd;
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++
++ profileIndx = p_Profile->absoluteProfileId;
++
++ FmPcdPlcrInvalidateProfileSw(p_FmPcd,profileIndx);
++
++ if (p_FmPcd->h_Hc)
++ {
++ err = FmHcPcdPlcrDeleteProfile(p_FmPcd->h_Hc, h_Profile);
++ if (p_Profile->p_Lock)
++ /* release allocated Profile lock */
++ FmPcdReleaseLock(p_FmPcd, p_Profile->p_Lock);
++
++ return err;
++ }
++
++ intFlags = PlcrHwLock(p_FmPcd->p_FmPcdPlcr);
++ WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->profileRegs.fmpl_pemode, ~FM_PCD_PLCR_PEMODE_PI);
++
++ tmpReg32 = FmPcdPlcrBuildWritePlcrActionRegs(profileIndx);
++ WritePar(p_FmPcd, tmpReg32);
++ PlcrHwUnlock(p_FmPcd->p_FmPcdPlcr, intFlags);
++
++ if (p_Profile->p_Lock)
++ /* release allocated Profile lock */
++ FmPcdReleaseLock(p_FmPcd, p_Profile->p_Lock);
++
++ return E_OK;
++}
++
++/***************************************************/
++/*............Policer Profile Counter..............*/
++/***************************************************/
++uint32_t FM_PCD_PlcrProfileGetCounter(t_Handle h_Profile, e_FmPcdPlcrProfileCounters counter)
++{
++ t_FmPcdPlcrProfile *p_Profile = (t_FmPcdPlcrProfile*)h_Profile;
++ t_FmPcd *p_FmPcd;
++ uint16_t profileIndx;
++ uint32_t intFlags, counterVal = 0;
++ t_FmPcdPlcrRegs *p_FmPcdPlcrRegs;
++
++ SANITY_CHECK_RETURN_ERROR(p_Profile, E_INVALID_HANDLE);
++ p_FmPcd = p_Profile->h_FmPcd;
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++
++ if (p_FmPcd->h_Hc)
++ return FmHcPcdPlcrGetProfileCounter(p_FmPcd->h_Hc, h_Profile, counter);
++
++ p_FmPcdPlcrRegs = p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs;
++ SANITY_CHECK_RETURN_VALUE(p_FmPcdPlcrRegs, E_INVALID_HANDLE, 0);
++
++ profileIndx = p_Profile->absoluteProfileId;
++
++ if (profileIndx >= FM_PCD_PLCR_NUM_ENTRIES)
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("profileId too Big "));
++ return 0;
++ }
++ intFlags = PlcrHwLock(p_FmPcd->p_FmPcdPlcr);
++ WritePar(p_FmPcd, FmPcdPlcrBuildReadPlcrActionReg(profileIndx));
++
++ switch (counter)
++ {
++ case e_FM_PCD_PLCR_PROFILE_GREEN_PACKET_TOTAL_COUNTER:
++ counterVal = (GET_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_pegpc));
++ break;
++ case e_FM_PCD_PLCR_PROFILE_YELLOW_PACKET_TOTAL_COUNTER:
++ counterVal = GET_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_peypc);
++ break;
++ case e_FM_PCD_PLCR_PROFILE_RED_PACKET_TOTAL_COUNTER:
++ counterVal = GET_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_perpc);
++ break;
++ case e_FM_PCD_PLCR_PROFILE_RECOLOURED_YELLOW_PACKET_TOTAL_COUNTER:
++ counterVal = GET_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_perypc);
++ break;
++ case e_FM_PCD_PLCR_PROFILE_RECOLOURED_RED_PACKET_TOTAL_COUNTER:
++ counterVal = GET_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_perrpc);
++ break;
++ default:
++ REPORT_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
++ break;
++ }
++ PlcrHwUnlock(p_FmPcd->p_FmPcdPlcr, intFlags);
++
++ return counterVal;
++}
++
++t_Error FM_PCD_PlcrProfileSetCounter(t_Handle h_Profile, e_FmPcdPlcrProfileCounters counter, uint32_t value)
++{
++ t_FmPcdPlcrProfile *p_Profile = (t_FmPcdPlcrProfile*)h_Profile;
++ t_FmPcd *p_FmPcd;
++ uint16_t profileIndx;
++ uint32_t tmpReg32, intFlags;
++ t_FmPcdPlcrRegs *p_FmPcdPlcrRegs;
++
++ SANITY_CHECK_RETURN_ERROR(p_Profile, E_INVALID_HANDLE);
++
++ p_FmPcd = p_Profile->h_FmPcd;
++ profileIndx = p_Profile->absoluteProfileId;
++
++ if (p_FmPcd->h_Hc)
++ return FmHcPcdPlcrSetProfileCounter(p_FmPcd->h_Hc, h_Profile, counter, value);
++
++ p_FmPcdPlcrRegs = p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs;
++ SANITY_CHECK_RETURN_ERROR(p_FmPcdPlcrRegs, E_INVALID_HANDLE);
++
++ intFlags = PlcrHwLock(p_FmPcd->p_FmPcdPlcr);
++ switch (counter)
++ {
++ case e_FM_PCD_PLCR_PROFILE_GREEN_PACKET_TOTAL_COUNTER:
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_pegpc, value);
++ break;
++ case e_FM_PCD_PLCR_PROFILE_YELLOW_PACKET_TOTAL_COUNTER:
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_peypc, value);
++ break;
++ case e_FM_PCD_PLCR_PROFILE_RED_PACKET_TOTAL_COUNTER:
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_perpc, value);
++ break;
++ case e_FM_PCD_PLCR_PROFILE_RECOLOURED_YELLOW_PACKET_TOTAL_COUNTER:
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_perypc ,value);
++ break;
++ case e_FM_PCD_PLCR_PROFILE_RECOLOURED_RED_PACKET_TOTAL_COUNTER:
++ WRITE_UINT32(p_FmPcdPlcrRegs->profileRegs.fmpl_perrpc ,value);
++ break;
++ default:
++ PlcrHwUnlock(p_FmPcd->p_FmPcdPlcr, intFlags);
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
++ }
++
++ /* Activate the atomic write action by writing FMPL_PAR with: GO=1, RW=1, PSI=0, PNUM =
++ * Profile Number, PWSEL=0xFFFF (select all words).
++ */
++ tmpReg32 = FmPcdPlcrBuildWritePlcrActionReg(profileIndx);
++ tmpReg32 |= FmPcdPlcrBuildCounterProfileReg(counter);
++ WritePar(p_FmPcd, tmpReg32);
++ PlcrHwUnlock(p_FmPcd->p_FmPcdPlcr, intFlags);
++
++ return E_OK;
++}
++
++#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
++t_Error FM_PCD_PlcrProfileDumpRegs(t_Handle h_Profile)
++{
++ t_FmPcdPlcrProfile *p_Profile = (t_FmPcdPlcrProfile*)h_Profile;
++ t_FmPcd *p_FmPcd;
++ t_FmPcdPlcrProfileRegs *p_ProfilesRegs;
++ uint16_t profileIndx;
++ uint32_t tmpReg, intFlags;
++
++ DECLARE_DUMP;
++
++ SANITY_CHECK_RETURN_ERROR(p_Profile, E_INVALID_HANDLE);
++ p_FmPcd = p_Profile->h_FmPcd;
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdPlcr, E_INVALID_HANDLE);
++
++ profileIndx = p_Profile->absoluteProfileId;
++
++ DUMP_SUBTITLE(("\n"));
++ DUMP_TITLE(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs, ("FM-PCD policer-profile regs"));
++
++ p_ProfilesRegs = &p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->profileRegs;
++
++ tmpReg = FmPcdPlcrBuildReadPlcrActionReg((uint16_t)profileIndx);
++ intFlags = PlcrHwLock(p_FmPcd->p_FmPcdPlcr);
++ WritePar(p_FmPcd, tmpReg);
++
++ DUMP_TITLE(p_ProfilesRegs, ("Profile %d regs", profileIndx));
++
++ DUMP_VAR(p_ProfilesRegs, fmpl_pemode);
++ DUMP_VAR(p_ProfilesRegs, fmpl_pegnia);
++ DUMP_VAR(p_ProfilesRegs, fmpl_peynia);
++ DUMP_VAR(p_ProfilesRegs, fmpl_pernia);
++ DUMP_VAR(p_ProfilesRegs, fmpl_pecir);
++ DUMP_VAR(p_ProfilesRegs, fmpl_pecbs);
++ DUMP_VAR(p_ProfilesRegs, fmpl_pepepir_eir);
++ DUMP_VAR(p_ProfilesRegs, fmpl_pepbs_ebs);
++ DUMP_VAR(p_ProfilesRegs, fmpl_pelts);
++ DUMP_VAR(p_ProfilesRegs, fmpl_pects);
++ DUMP_VAR(p_ProfilesRegs, fmpl_pepts_ets);
++ DUMP_VAR(p_ProfilesRegs, fmpl_pegpc);
++ DUMP_VAR(p_ProfilesRegs, fmpl_peypc);
++ DUMP_VAR(p_ProfilesRegs, fmpl_perpc);
++ DUMP_VAR(p_ProfilesRegs, fmpl_perypc);
++ DUMP_VAR(p_ProfilesRegs, fmpl_perrpc);
++ PlcrHwUnlock(p_FmPcd->p_FmPcdPlcr, intFlags);
++
++ return E_OK;
++}
++#endif /* (defined(DEBUG_ERRORS) && ... */
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_plcr.h b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_plcr.h
+new file mode 100644
+index 0000000..2bb8b96
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_plcr.h
+@@ -0,0 +1,165 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File fm_plcr.h
++
++ @Description FM Policer private header
++*//***************************************************************************/
++#ifndef __FM_PLCR_H
++#define __FM_PLCR_H
++
++#include "std_ext.h"
++
++
++/***********************************************************************/
++/* Policer defines */
++/***********************************************************************/
++
++#define FM_PCD_PLCR_PAR_GO 0x80000000
++#define FM_PCD_PLCR_PAR_PWSEL_MASK 0x0000FFFF
++#define FM_PCD_PLCR_PAR_R 0x40000000
++
++/* shifts */
++#define FM_PCD_PLCR_PAR_PNUM_SHIFT 16
++
++/* masks */
++#define FM_PCD_PLCR_PEMODE_PI 0x80000000
++#define FM_PCD_PLCR_PEMODE_CBLND 0x40000000
++#define FM_PCD_PLCR_PEMODE_ALG_MASK 0x30000000
++#define FM_PCD_PLCR_PEMODE_ALG_RFC2698 0x10000000
++#define FM_PCD_PLCR_PEMODE_ALG_RFC4115 0x20000000
++#define FM_PCD_PLCR_PEMODE_DEFC_MASK 0x0C000000
++#define FM_PCD_PLCR_PEMODE_DEFC_Y 0x04000000
++#define FM_PCD_PLCR_PEMODE_DEFC_R 0x08000000
++#define FM_PCD_PLCR_PEMODE_DEFC_OVERRIDE 0x0C000000
++#define FM_PCD_PLCR_PEMODE_OVCLR_MASK 0x03000000
++#define FM_PCD_PLCR_PEMODE_OVCLR_Y 0x01000000
++#define FM_PCD_PLCR_PEMODE_OVCLR_R 0x02000000
++#define FM_PCD_PLCR_PEMODE_OVCLR_G_NC 0x03000000
++#define FM_PCD_PLCR_PEMODE_PKT 0x00800000
++#define FM_PCD_PLCR_PEMODE_FPP_MASK 0x001F0000
++#define FM_PCD_PLCR_PEMODE_FPP_SHIFT 16
++#define FM_PCD_PLCR_PEMODE_FLS_MASK 0x0000F000
++#define FM_PCD_PLCR_PEMODE_FLS_L2 0x00003000
++#define FM_PCD_PLCR_PEMODE_FLS_L3 0x0000B000
++#define FM_PCD_PLCR_PEMODE_FLS_L4 0x0000E000
++#define FM_PCD_PLCR_PEMODE_FLS_FULL 0x0000F000
++#define FM_PCD_PLCR_PEMODE_RBFLS 0x00000800
++#define FM_PCD_PLCR_PEMODE_TRA 0x00000004
++#define FM_PCD_PLCR_PEMODE_TRB 0x00000002
++#define FM_PCD_PLCR_PEMODE_TRC 0x00000001
++#define FM_PCD_PLCR_DOUBLE_ECC 0x80000000
++#define FM_PCD_PLCR_INIT_ENTRY_ERROR 0x40000000
++#define FM_PCD_PLCR_PRAM_SELF_INIT_COMPLETE 0x80000000
++#define FM_PCD_PLCR_ATOMIC_ACTION_COMPLETE 0x40000000
++
++#define FM_PCD_PLCR_NIA_VALID 0x80000000
++
++#define FM_PCD_PLCR_GCR_EN 0x80000000
++#define FM_PCD_PLCR_GCR_STEN 0x40000000
++#define FM_PCD_PLCR_GCR_DAR 0x20000000
++#define FM_PCD_PLCR_GCR_DEFNIA 0x00FFFFFF
++#define FM_PCD_PLCR_NIA_ABS 0x00000100
++
++#define FM_PCD_PLCR_GSR_BSY 0x80000000
++#define FM_PCD_PLCR_GSR_DQS 0x60000000
++#define FM_PCD_PLCR_GSR_RPB 0x20000000
++#define FM_PCD_PLCR_GSR_FQS 0x0C000000
++#define FM_PCD_PLCR_GSR_LPALG 0x0000C000
++#define FM_PCD_PLCR_GSR_LPCA 0x00003000
++#define FM_PCD_PLCR_GSR_LPNUM 0x000000FF
++
++#define FM_PCD_PLCR_EVR_PSIC 0x80000000
++#define FM_PCD_PLCR_EVR_AAC 0x40000000
++
++#define FM_PCD_PLCR_PAR_PSI 0x20000000
++#define FM_PCD_PLCR_PAR_PNUM 0x00FF0000
++/* PWSEL Selctive select options */
++#define FM_PCD_PLCR_PAR_PWSEL_PEMODE 0x00008000 /* 0 */
++#define FM_PCD_PLCR_PAR_PWSEL_PEGNIA 0x00004000 /* 1 */
++#define FM_PCD_PLCR_PAR_PWSEL_PEYNIA 0x00002000 /* 2 */
++#define FM_PCD_PLCR_PAR_PWSEL_PERNIA 0x00001000 /* 3 */
++#define FM_PCD_PLCR_PAR_PWSEL_PECIR 0x00000800 /* 4 */
++#define FM_PCD_PLCR_PAR_PWSEL_PECBS 0x00000400 /* 5 */
++#define FM_PCD_PLCR_PAR_PWSEL_PEPIR_EIR 0x00000200 /* 6 */
++#define FM_PCD_PLCR_PAR_PWSEL_PEPBS_EBS 0x00000100 /* 7 */
++#define FM_PCD_PLCR_PAR_PWSEL_PELTS 0x00000080 /* 8 */
++#define FM_PCD_PLCR_PAR_PWSEL_PECTS 0x00000040 /* 9 */
++#define FM_PCD_PLCR_PAR_PWSEL_PEPTS_ETS 0x00000020 /* 10 */
++#define FM_PCD_PLCR_PAR_PWSEL_PEGPC 0x00000010 /* 11 */
++#define FM_PCD_PLCR_PAR_PWSEL_PEYPC 0x00000008 /* 12 */
++#define FM_PCD_PLCR_PAR_PWSEL_PERPC 0x00000004 /* 13 */
++#define FM_PCD_PLCR_PAR_PWSEL_PERYPC 0x00000002 /* 14 */
++#define FM_PCD_PLCR_PAR_PWSEL_PERRPC 0x00000001 /* 15 */
++
++#define FM_PCD_PLCR_PAR_PMR_BRN_1TO1 0x0000 /* - Full bit replacement. {PBNUM[0:N-1]
++ 1-> 2^N specific locations. */
++#define FM_PCD_PLCR_PAR_PMR_BRN_2TO2 0x1 /* - {PBNUM[0:N-2],PNUM[N-1]}.
++ 2-> 2^(N-1) base locations. */
++#define FM_PCD_PLCR_PAR_PMR_BRN_4TO4 0x2 /* - {PBNUM[0:N-3],PNUM[N-2:N-1]}.
++ 4-> 2^(N-2) base locations. */
++#define FM_PCD_PLCR_PAR_PMR_BRN_8TO8 0x3 /* - {PBNUM[0:N-4],PNUM[N-3:N-1]}.
++ 8->2^(N-3) base locations. */
++#define FM_PCD_PLCR_PAR_PMR_BRN_16TO16 0x4 /* - {PBNUM[0:N-5],PNUM[N-4:N-1]}.
++ 16-> 2^(N-4) base locations. */
++#define FM_PCD_PLCR_PAR_PMR_BRN_32TO32 0x5 /* {PBNUM[0:N-6],PNUM[N-5:N-1]}.
++ 32-> 2^(N-5) base locations. */
++#define FM_PCD_PLCR_PAR_PMR_BRN_64TO64 0x6 /* {PBNUM[0:N-7],PNUM[N-6:N-1]}.
++ 64-> 2^(N-6) base locations. */
++#define FM_PCD_PLCR_PAR_PMR_BRN_128TO128 0x7 /* {PBNUM[0:N-8],PNUM[N-7:N-1]}.
++ 128-> 2^(N-7) base locations. */
++#define FM_PCD_PLCR_PAR_PMR_BRN_256TO256 0x8 /* - No bit replacement for N=8. {PNUM[N-8:N-1]}.
++ When N=8 this option maps all 256 profiles by the DISPATCH bus into one group. */
++
++#define FM_PCD_PLCR_PMR_V 0x80000000
++#define PLCR_ERR_ECC_CAP 0x80000000
++#define PLCR_ERR_ECC_TYPE_DOUBLE 0x40000000
++#define PLCR_ERR_ECC_PNUM_MASK 0x00000FF0
++#define PLCR_ERR_ECC_OFFSET_MASK 0x0000000F
++
++#define PLCR_ERR_UNINIT_CAP 0x80000000
++#define PLCR_ERR_UNINIT_NUM_MASK 0x000000FF
++#define PLCR_ERR_UNINIT_PID_MASK 0x003f0000
++#define PLCR_ERR_UNINIT_ABSOLUTE_MASK 0x00008000
++
++/* shifts */
++#define PLCR_ERR_ECC_PNUM_SHIFT 4
++#define PLCR_ERR_UNINIT_PID_SHIFT 16
++
++#define FM_PCD_PLCR_PMR_BRN_SHIFT 16
++
++#define PLCR_PORT_WINDOW_SIZE(hardwarePortId)
++
++
++#endif /* __FM_PLCR_H */
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_prs.c b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_prs.c
+new file mode 100644
+index 0000000..e198afd
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_prs.c
+@@ -0,0 +1,457 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File fm_pcd.c
++
++ @Description FM PCD ...
++*//***************************************************************************/
++#include "std_ext.h"
++#include "error_ext.h"
++#include "string_ext.h"
++#include "debug_ext.h"
++#include "net_ext.h"
++
++#include "fm_common.h"
++#include "fm_pcd.h"
++#include "fm_pcd_ipc.h"
++#include "fm_prs.h"
++#include "fsl_fman_prs.h"
++
++
++static void PcdPrsErrorException(t_Handle h_FmPcd)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++ uint32_t event, ev_mask;
++ struct fman_prs_regs *PrsRegs = (struct fman_prs_regs *)p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs;
++
++ ASSERT_COND(p_FmPcd->guestId == NCSW_MASTER_ID);
++ ev_mask = fman_prs_get_err_ev_mask(PrsRegs);
++
++ event = fman_prs_get_err_event(PrsRegs, ev_mask);
++
++ fman_prs_ack_err_event(PrsRegs, event);
++
++ DBG(TRACE, ("parser error - 0x%08x\n",event));
++
++ if(event & FM_PCD_PRS_DOUBLE_ECC)
++ p_FmPcd->f_Exception(p_FmPcd->h_App,e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC);
++}
++
++static void PcdPrsException(t_Handle h_FmPcd)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++ uint32_t event, ev_mask;
++ struct fman_prs_regs *PrsRegs = (struct fman_prs_regs *)p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs;
++
++ ASSERT_COND(p_FmPcd->guestId == NCSW_MASTER_ID);
++ ev_mask = fman_prs_get_expt_ev_mask(PrsRegs);
++ event = fman_prs_get_expt_event(PrsRegs, ev_mask);
++
++ ASSERT_COND(event & FM_PCD_PRS_SINGLE_ECC);
++
++ DBG(TRACE, ("parser event - 0x%08x\n",event));
++
++ fman_prs_ack_expt_event(PrsRegs, event);
++
++ p_FmPcd->f_Exception(p_FmPcd->h_App,e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC);
++}
++
++t_Handle PrsConfig(t_FmPcd *p_FmPcd,t_FmPcdParams *p_FmPcdParams)
++{
++ t_FmPcdPrs *p_FmPcdPrs;
++ uintptr_t baseAddr;
++
++ UNUSED(p_FmPcd);
++ UNUSED(p_FmPcdParams);
++
++ p_FmPcdPrs = (t_FmPcdPrs *) XX_Malloc(sizeof(t_FmPcdPrs));
++ if (!p_FmPcdPrs)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Parser structure allocation FAILED"));
++ return NULL;
++ }
++ memset(p_FmPcdPrs, 0, sizeof(t_FmPcdPrs));
++ fman_prs_defconfig(&p_FmPcd->p_FmPcdDriverParam->dfltCfg);
++
++ if (p_FmPcd->guestId == NCSW_MASTER_ID)
++ {
++ baseAddr = FmGetPcdPrsBaseAddr(p_FmPcdParams->h_Fm);
++ p_FmPcdPrs->p_SwPrsCode = (uint32_t *)UINT_TO_PTR(baseAddr);
++ p_FmPcdPrs->p_FmPcdPrsRegs = (struct fman_prs_regs *)UINT_TO_PTR(baseAddr + PRS_REGS_OFFSET);
++ }
++
++ p_FmPcdPrs->fmPcdPrsPortIdStatistics = p_FmPcd->p_FmPcdDriverParam->dfltCfg.port_id_stat;
++ p_FmPcd->p_FmPcdDriverParam->prsMaxParseCycleLimit = p_FmPcd->p_FmPcdDriverParam->dfltCfg.max_prs_cyc_lim;
++ p_FmPcd->exceptions |= p_FmPcd->p_FmPcdDriverParam->dfltCfg.prs_exceptions;
++
++ return p_FmPcdPrs;
++}
++
++t_Error PrsInit(t_FmPcd *p_FmPcd)
++{
++ t_FmPcdDriverParam *p_Param = p_FmPcd->p_FmPcdDriverParam;
++ uint32_t *p_TmpCode;
++ uint32_t *p_LoadTarget = (uint32_t *)PTR_MOVE(p_FmPcd->p_FmPcdPrs->p_SwPrsCode,
++ FM_PCD_SW_PRS_SIZE-FM_PCD_PRS_SW_PATCHES_SIZE);
++ struct fman_prs_regs *PrsRegs = (struct fman_prs_regs *)p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs;
++#ifdef FM_CAPWAP_SUPPORT
++ uint8_t swPrsPatch[] = SW_PRS_UDP_LITE_PATCH;
++#else
++ uint8_t swPrsPatch[] = SW_PRS_IP_FRAG_PATCH;
++#endif /* FM_CAPWAP_SUPPORT */
++ uint32_t i;
++
++ ASSERT_COND(sizeof(swPrsPatch) <= (FM_PCD_PRS_SW_PATCHES_SIZE-FM_PCD_PRS_SW_TAIL_SIZE));
++
++ /* nothing to do in guest-partition */
++ if (p_FmPcd->guestId != NCSW_MASTER_ID)
++ return E_OK;
++
++ p_TmpCode = (uint32_t *)XX_MallocSmart(ROUND_UP(sizeof(swPrsPatch),4), 0, sizeof(uint32_t));
++ if (!p_TmpCode)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Tmp Sw-Parser code allocation FAILED"));
++ memset((uint8_t *)p_TmpCode, 0, ROUND_UP(sizeof(swPrsPatch),4));
++ memcpy((uint8_t *)p_TmpCode, (uint8_t *)swPrsPatch, sizeof(swPrsPatch));
++
++ fman_prs_init(PrsRegs, &p_Param->dfltCfg);
++
++ /* register even if no interrupts enabled, to allow future enablement */
++ FmRegisterIntr(p_FmPcd->h_Fm, e_FM_MOD_PRS, 0, e_FM_INTR_TYPE_ERR, PcdPrsErrorException, p_FmPcd);
++
++ /* register even if no interrupts enabled, to allow future enablement */
++ FmRegisterIntr(p_FmPcd->h_Fm, e_FM_MOD_PRS, 0, e_FM_INTR_TYPE_NORMAL, PcdPrsException, p_FmPcd);
++
++ if(p_FmPcd->exceptions & FM_PCD_EX_PRS_SINGLE_ECC)
++ FmEnableRamsEcc(p_FmPcd->h_Fm);
++
++ if(p_FmPcd->exceptions & FM_PCD_EX_PRS_DOUBLE_ECC)
++ FmEnableRamsEcc(p_FmPcd->h_Fm);
++
++ /* load sw parser Ip-Frag patch */
++ for (i=0; iguestId == NCSW_MASTER_ID);
++ FmUnregisterIntr(p_FmPcd->h_Fm, e_FM_MOD_PRS, 0, e_FM_INTR_TYPE_ERR);
++ /* register even if no interrupts enabled, to allow future enablement */
++ FmUnregisterIntr(p_FmPcd->h_Fm, e_FM_MOD_PRS, 0, e_FM_INTR_TYPE_NORMAL);
++}
++
++void PrsEnable(t_FmPcd *p_FmPcd)
++{
++ struct fman_prs_regs *PrsRegs = (struct fman_prs_regs *)p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs;
++
++ ASSERT_COND(p_FmPcd->guestId == NCSW_MASTER_ID);
++ fman_prs_enable(PrsRegs);
++}
++
++void PrsDisable(t_FmPcd *p_FmPcd)
++{
++ struct fman_prs_regs *PrsRegs = (struct fman_prs_regs *)p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs;
++
++ ASSERT_COND(p_FmPcd->guestId == NCSW_MASTER_ID);
++ fman_prs_disable(PrsRegs);
++}
++
++t_Error PrsIncludePortInStatistics(t_FmPcd *p_FmPcd, uint8_t hardwarePortId, bool include)
++{
++ struct fman_prs_regs *PrsRegs;
++ uint32_t bitMask = 0;
++ uint8_t prsPortId;
++
++ SANITY_CHECK_RETURN_ERROR((hardwarePortId >=1 && hardwarePortId <= 16), E_INVALID_VALUE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdPrs, E_INVALID_HANDLE);
++
++ PrsRegs = (struct fman_prs_regs *)p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs;
++
++ GET_FM_PCD_PRS_PORT_ID(prsPortId, hardwarePortId);
++ GET_FM_PCD_INDEX_FLAG(bitMask, prsPortId);
++
++ if (include)
++ p_FmPcd->p_FmPcdPrs->fmPcdPrsPortIdStatistics |= bitMask;
++ else
++ p_FmPcd->p_FmPcdPrs->fmPcdPrsPortIdStatistics &= ~bitMask;
++
++ fman_prs_set_stst_port_msk(PrsRegs,
++ p_FmPcd->p_FmPcdPrs->fmPcdPrsPortIdStatistics);
++
++ return E_OK;
++}
++
++t_Error FmPcdPrsIncludePortInStatistics(t_Handle h_FmPcd, uint8_t hardwarePortId, bool include)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR((hardwarePortId >=1 && hardwarePortId <= 16), E_INVALID_VALUE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdPrs, E_INVALID_HANDLE);
++
++ if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
++ p_FmPcd->h_IpcSession)
++ {
++ t_FmPcdIpcPrsIncludePort prsIncludePortParams;
++ t_FmPcdIpcMsg msg;
++
++ prsIncludePortParams.hardwarePortId = hardwarePortId;
++ prsIncludePortParams.include = include;
++ memset(&msg, 0, sizeof(msg));
++ msg.msgId = FM_PCD_PRS_INC_PORT_STATS;
++ memcpy(msg.msgBody, &prsIncludePortParams, sizeof(prsIncludePortParams));
++ err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
++ (uint8_t*)&msg,
++ sizeof(msg.msgId) +sizeof(prsIncludePortParams),
++ NULL,
++ NULL,
++ NULL,
++ NULL);
++ if (err != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ return E_OK;
++ }
++ else if (p_FmPcd->guestId != NCSW_MASTER_ID)
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
++ ("running in guest-mode without IPC!"));
++
++ return PrsIncludePortInStatistics(p_FmPcd, hardwarePortId, include);
++}
++
++uint32_t FmPcdGetSwPrsOffset(t_Handle h_FmPcd, e_NetHeaderType hdr, uint8_t indexPerHdr)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
++ t_FmPcdPrsLabelParams *p_Label;
++ int i;
++
++ SANITY_CHECK_RETURN_VALUE(p_FmPcd, E_INVALID_HANDLE, 0);
++ SANITY_CHECK_RETURN_VALUE(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_HANDLE, 0);
++
++ if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
++ p_FmPcd->h_IpcSession)
++ {
++ t_Error err = E_OK;
++ t_FmPcdIpcSwPrsLable labelParams;
++ t_FmPcdIpcMsg msg;
++ uint32_t prsOffset = 0;
++ t_FmPcdIpcReply reply;
++ uint32_t replyLength;
++
++ memset(&reply, 0, sizeof(reply));
++ memset(&msg, 0, sizeof(msg));
++ labelParams.enumHdr = (uint32_t)hdr;
++ labelParams.indexPerHdr = indexPerHdr;
++ msg.msgId = FM_PCD_GET_SW_PRS_OFFSET;
++ memcpy(msg.msgBody, &labelParams, sizeof(labelParams));
++ replyLength = sizeof(uint32_t) + sizeof(uint32_t);
++ err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
++ (uint8_t*)&msg,
++ sizeof(msg.msgId) +sizeof(labelParams),
++ (uint8_t*)&reply,
++ &replyLength,
++ NULL,
++ NULL);
++ if (err != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ if (replyLength != sizeof(uint32_t) + sizeof(uint32_t))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
++
++ memcpy((uint8_t*)&prsOffset, reply.replyBody, sizeof(uint32_t));
++ return prsOffset;
++ }
++ else if (p_FmPcd->guestId != NCSW_MASTER_ID)
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
++ ("running in guest-mode without IPC!"));
++
++ ASSERT_COND(p_FmPcd->p_FmPcdPrs->currLabel < FM_PCD_PRS_NUM_OF_LABELS);
++
++ for (i=0; ip_FmPcdPrs->currLabel; i++)
++ {
++ p_Label = &p_FmPcd->p_FmPcdPrs->labelsTable[i];
++
++ if ((hdr == p_Label->hdr) && (indexPerHdr == p_Label->indexPerHdr))
++ return p_Label->instructionOffset;
++ }
++
++ REPORT_ERROR(MAJOR, E_NOT_FOUND, ("Sw Parser attachment Not found"));
++ return (uint32_t)ILLEGAL_BASE;
++}
++
++void FM_PCD_SetPrsStatistics(t_Handle h_FmPcd, bool enable)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ struct fman_prs_regs *PrsRegs;
++
++ SANITY_CHECK_RETURN(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN(p_FmPcd->p_FmPcdPrs, E_INVALID_HANDLE);
++
++ PrsRegs = (struct fman_prs_regs *)p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs;
++
++
++ if(p_FmPcd->guestId != NCSW_MASTER_ID)
++ {
++ REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_SetPrsStatistics - guest mode!"));
++ return;
++ }
++
++ fman_prs_set_stst(PrsRegs, enable);
++}
++
++t_Error FM_PCD_PrsLoadSw(t_Handle h_FmPcd, t_FmPcdPrsSwParams *p_SwPrs)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++ uint32_t *p_LoadTarget;
++ uint32_t *p_TmpCode;
++ int i;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdPrs, E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(p_SwPrs, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPcd->enabled, E_INVALID_HANDLE);
++
++ if (p_FmPcd->guestId != NCSW_MASTER_ID)
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM in guest-mode!"));
++
++ if (!p_SwPrs->override)
++ {
++ if(p_FmPcd->p_FmPcdPrs->p_CurrSwPrs > p_FmPcd->p_FmPcdPrs->p_SwPrsCode + p_SwPrs->base*2/4)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("SW parser base must be larger than current loaded code"));
++ }
++ else
++ p_FmPcd->p_FmPcdPrs->currLabel = 0;
++
++ if (p_SwPrs->size > FM_PCD_SW_PRS_SIZE - FM_PCD_PRS_SW_TAIL_SIZE - p_SwPrs->base*2)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("p_SwPrs->size may not be larger than MAX_SW_PRS_CODE_SIZE"));
++
++ if (p_FmPcd->p_FmPcdPrs->currLabel + p_SwPrs->numOfLabels > FM_PCD_PRS_NUM_OF_LABELS)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Exceeded number of labels allowed "));
++
++ p_TmpCode = (uint32_t *)XX_MallocSmart(ROUND_UP(p_SwPrs->size,4), 0, sizeof(uint32_t));
++ if (!p_TmpCode)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Tmp Sw-Parser code allocation FAILED"));
++ memset((uint8_t *)p_TmpCode, 0, ROUND_UP(p_SwPrs->size,4));
++ memcpy((uint8_t *)p_TmpCode, p_SwPrs->p_Code, p_SwPrs->size);
++
++ /* save sw parser labels */
++ memcpy(&p_FmPcd->p_FmPcdPrs->labelsTable[p_FmPcd->p_FmPcdPrs->currLabel],
++ p_SwPrs->labelsTable,
++ p_SwPrs->numOfLabels*sizeof(t_FmPcdPrsLabelParams));
++ p_FmPcd->p_FmPcdPrs->currLabel += p_SwPrs->numOfLabels;
++
++ /* load sw parser code */
++ p_LoadTarget = p_FmPcd->p_FmPcdPrs->p_SwPrsCode + p_SwPrs->base*2/4;
++ for(i=0; isize,4); i++)
++ WRITE_UINT32(p_LoadTarget[i], p_TmpCode[i]);
++ p_FmPcd->p_FmPcdPrs->p_CurrSwPrs =
++ p_FmPcd->p_FmPcdPrs->p_SwPrsCode + p_SwPrs->base*2/4 + ROUND_UP(p_SwPrs->size,4);
++
++ /* copy data parameters */
++ for (i=0;ip_FmPcdPrs->p_SwPrsCode+PRS_SW_DATA/4+i), p_SwPrs->swPrsDataParams[i]);
++
++ /* Clear last 4 bytes */
++ WRITE_UINT32(*(p_FmPcd->p_FmPcdPrs->p_SwPrsCode+(PRS_SW_DATA-FM_PCD_PRS_SW_TAIL_SIZE)/4), 0);
++
++ XX_FreeSmart(p_TmpCode);
++
++ return E_OK;
++}
++
++t_Error FM_PCD_ConfigPrsMaxCycleLimit(t_Handle h_FmPcd,uint16_t value)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdDriverParam, E_INVALID_HANDLE);
++
++ if(p_FmPcd->guestId != NCSW_MASTER_ID)
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_ConfigPrsMaxCycleLimit - guest mode!"));
++
++ p_FmPcd->p_FmPcdDriverParam->prsMaxParseCycleLimit = value;
++
++ return E_OK;
++}
++
++#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
++t_Error FM_PCD_PrsDumpRegs(t_Handle h_FmPcd)
++{
++ t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
++
++ DECLARE_DUMP;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdPrs, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
++ SANITY_CHECK_RETURN_ERROR(((p_FmPcd->guestId == NCSW_MASTER_ID) ||
++ p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs), E_INVALID_OPERATION);
++
++ DUMP_SUBTITLE(("\n"));
++ DUMP_TITLE(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs, ("FM-PCD parser regs"));
++
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_rpclim);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_rpimac);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,pmeec);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_pevr);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_pever);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_perr);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_perer);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_ppsc);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_pds);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_l2rrs);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_l3rrs);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_l4rrs);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_srrs);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_l2rres);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_l3rres);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_l4rres);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_srres);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_spcs);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_spscs);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_hxscs);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_mrcs);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_mwcs);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_mrscs);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_mwscs);
++ DUMP_VAR(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs,fmpr_fcscs);
++
++ return E_OK;
++}
++#endif /* (defined(DEBUG_ERRORS) && ... */
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_prs.h b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_prs.h
+new file mode 100644
+index 0000000..3e5974c
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_prs.h
+@@ -0,0 +1,193 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File fm_prs.h
++
++ @Description FM Parser private header
++*//***************************************************************************/
++#ifndef __FM_PRS_H
++#define __FM_PRS_H
++
++#include "std_ext.h"
++
++
++/***********************************************************************/
++/* SW parser IP_FRAG patch */
++/***********************************************************************/
++
++
++#ifdef FM_CAPWAP_SUPPORT
++#define SW_PRS_UDP_LITE_PATCH \
++{\
++ 0x31,0x92,0x50,0x29,0x00,0x88,0x08,0x16,0x00,0x00, \
++ 0x00,0x01,0x00,0x05,0x00,0x81,0x1C,0x0B,0x00,0x01, \
++ 0x1B,0xFF, \
++}
++#endif /* FM_CAPWAP_SUPPORT */
++
++#if (DPAA_VERSION == 10)
++/* Version: 106.1.9 */
++#define SW_PRS_IP_FRAG_PATCH \
++{ \
++ 0x31,0x52,0x00,0xDA,0x0A,0x00,0x00,0x00,0x00,0x00, \
++ 0x00,0x00,0x43,0x0A,0x00,0x00,0x00,0x01,0x1B,0xFE, \
++ 0x00,0x00,0x99,0x00,0x53,0x13,0x00,0x00,0x00,0x00, \
++ 0x9F,0x98,0x53,0x13,0x00,0x00,0x1B,0x23,0x33,0xF1, \
++ 0x00,0xF9,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00, \
++ 0x28,0x7F,0x00,0x03,0x00,0x02,0x00,0x00,0x00,0x01, \
++ 0x32,0xC1,0x32,0xF0,0x00,0x4A,0x00,0x80,0x1F,0xFF, \
++ 0x00,0x01,0x1B,0xFE,0x31,0x52,0x00,0xDA,0x06,0x00, \
++ 0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x2F,0x00,0x00, \
++ 0x00,0x01,0x1B,0xFE,0x31,0x52,0x00,0xDA,0x00,0x40, \
++ 0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x95,0x00,0x00, \
++ 0x00,0x00,0x9B,0x8F,0x2F,0x0F,0x32,0xC1,0x00,0x55, \
++ 0x00,0x28,0x28,0x43,0x30,0x7E,0x43,0x45,0x00,0x00, \
++ 0x30,0x7E,0x43,0x45,0x00,0x3C,0x1B,0x5D,0x32,0x11, \
++ 0x32,0xC0,0x00,0x4F,0x00,0x81,0x00,0x00,0x83,0x8F, \
++ 0x2F,0x0F,0x06,0x00,0x32,0x11,0x32,0xC0,0x00,0x4F, \
++ 0x00,0x55,0x00,0x01,0x00,0x81,0x32,0x11,0x00,0x00, \
++ 0x83,0x8E,0x00,0x50,0x00,0x01,0x01,0x04,0x00,0x4D, \
++ 0x28,0x43,0x06,0x00,0x1B,0x3E,0x30,0x7E,0x53,0x79, \
++ 0x00,0x2B,0x32,0x11,0x32,0xC0,0x00,0x4F,0x00,0x81, \
++ 0x00,0x00,0x87,0x8F,0x28,0x23,0x06,0x00,0x32,0x11, \
++ 0x32,0xC0,0x00,0x4F,0x00,0x55,0x00,0x01,0x00,0x81, \
++ 0x32,0x11,0x00,0x00,0x83,0x8E,0x00,0x50,0x00,0x01, \
++ 0x01,0x04,0x00,0x4D,0x28,0x43,0x06,0x00,0x00,0x01, \
++ 0x1B,0xFE,0x00,0x00,0x9B,0x8E,0x53,0x90,0x00,0x00, \
++ 0x06,0x29,0x00,0x00,0x83,0x8F,0x28,0x23,0x06,0x00, \
++ 0x06,0x29,0x32,0xC1,0x00,0x55,0x00,0x28,0x00,0x00, \
++ 0x83,0x8E,0x00,0x50,0x00,0x01,0x01,0x04,0x00,0x4D, \
++ 0x28,0x43,0x06,0x00,0x00,0x01,0x1B,0xFE,0x32,0xC1, \
++ 0x00,0x55,0x00,0x28,0x28,0x43,0x1B,0xCF,0x00,0x00, \
++ 0x9B,0x8F,0x2F,0x0F,0x32,0xC1,0x00,0x55,0x00,0x28, \
++ 0x28,0x43,0x30,0x7E,0x43,0xBF,0x00,0x2C,0x32,0x11, \
++ 0x32,0xC0,0x00,0x4F,0x00,0x81,0x00,0x00,0x87,0x8F, \
++ 0x28,0x23,0x06,0x00,0x32,0x11,0x32,0xC0,0x00,0x4F, \
++ 0x00,0x81,0x00,0x00,0x83,0x8F,0x2F,0x0F,0x06,0x00, \
++ 0x32,0x11,0x32,0xC0,0x00,0x4F,0x00,0x55,0x00,0x01, \
++ 0x00,0x81,0x32,0x11,0x00,0x00,0x83,0x8E,0x00,0x50, \
++ 0x00,0x01,0x01,0x04,0x00,0x4D,0x28,0x43,0x06,0x00, \
++ 0x1B,0x9C,0x33,0xF1,0x00,0xF9,0x00,0x01,0x00,0x00, \
++ 0x00,0x00,0x00,0x00,0x28,0x7F,0x00,0x03,0x00,0x02, \
++ 0x00,0x00,0x00,0x01,0x32,0xC1,0x32,0xF0,0x00,0x4A, \
++ 0x00,0x80,0x1F,0xFF,0x00,0x01,0x1B,0xFE, \
++}
++
++#else
++/* version: 106.3.13 */
++#define SW_PRS_IP_FRAG_PATCH \
++{ \
++ 0x31,0x52,0x00,0xDA,0x0E,0x4F,0x00,0x00,0x00,0x00, \
++ 0x00,0x00,0x52,0xF6,0x08,0x4B,0x31,0x53,0x00,0xFB, \
++ 0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x2B, \
++ 0x33,0xF1,0x00,0xFB,0x00,0xDF,0x00,0x00,0x00,0x00, \
++ 0x00,0x00,0x28,0x7F,0x31,0x52,0x00,0xDA,0x0A,0x00, \
++ 0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00, \
++ 0x00,0x01,0x1B,0xFE,0x00,0x00,0x99,0x00,0x53,0x09, \
++ 0x00,0x00,0x00,0x00,0x9F,0x98,0x53,0x09,0x00,0x00, \
++ 0x1B,0x24,0x09,0x5F,0x00,0x20,0x00,0x00,0x09,0x4F, \
++ 0x00,0x20,0x00,0x00,0x34,0xB7,0x00,0xF9,0x00,0x00, \
++ 0x01,0x00,0x00,0x00,0x00,0x00,0x2B,0x97,0x31,0xB3, \
++ 0x29,0x8F,0x33,0xF1,0x00,0xF9,0x00,0x01,0x00,0x00, \
++ 0x00,0x00,0x00,0x00,0x28,0x7F,0x00,0x03,0x00,0x02, \
++ 0x00,0x00,0x00,0x01,0x1B,0xFE,0x00,0x01,0x1B,0xFE, \
++ 0x31,0x52,0x00,0xDA,0x0E,0x4F,0x00,0x00,0x00,0x00, \
++ 0x00,0x00,0x53,0x3C,0x04,0x4B,0x31,0x53,0x00,0xFB, \
++ 0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x2B, \
++ 0x33,0xF1,0x00,0xFB,0x00,0xDF,0x00,0x00,0x00,0x00, \
++ 0x00,0x00,0x28,0x7F,0x31,0x52,0x00,0xDA,0x06,0x00, \
++ 0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x46,0x00,0x00, \
++ 0x00,0x01,0x1B,0xFE,0x31,0x52,0x00,0xDA,0x00,0x40, \
++ 0x00,0x00,0x00,0x00,0x00,0x00,0x53,0xAC,0x00,0x00, \
++ 0x00,0x00,0x9B,0x8F,0x2F,0x0F,0x32,0xC1,0x00,0x55, \
++ 0x00,0x28,0x28,0x43,0x30,0x7E,0x43,0x5C,0x00,0x00, \
++ 0x30,0x7E,0x43,0x5C,0x00,0x3C,0x1B,0x74,0x32,0x11, \
++ 0x32,0xC0,0x00,0x4F,0x00,0x81,0x00,0x00,0x83,0x8F, \
++ 0x2F,0x0F,0x06,0x00,0x32,0x11,0x32,0xC0,0x00,0x4F, \
++ 0x00,0x55,0x00,0x01,0x00,0x81,0x32,0x11,0x00,0x00, \
++ 0x83,0x8E,0x00,0x50,0x00,0x01,0x01,0x04,0x00,0x4D, \
++ 0x28,0x43,0x06,0x00,0x1B,0x55,0x30,0x7E,0x53,0x90, \
++ 0x00,0x2B,0x32,0x11,0x32,0xC0,0x00,0x4F,0x00,0x81, \
++ 0x00,0x00,0x87,0x8F,0x28,0x23,0x06,0x00,0x32,0x11, \
++ 0x32,0xC0,0x00,0x4F,0x00,0x55,0x00,0x01,0x00,0x81, \
++ 0x32,0x11,0x00,0x00,0x83,0x8E,0x00,0x50,0x00,0x01, \
++ 0x01,0x04,0x00,0x4D,0x28,0x43,0x06,0x00,0x00,0x01, \
++ 0x1B,0xFE,0x00,0x00,0x9B,0x8E,0x53,0xA7,0x00,0x00, \
++ 0x06,0x29,0x00,0x00,0x83,0x8F,0x28,0x23,0x06,0x00, \
++ 0x06,0x29,0x32,0xC1,0x00,0x55,0x00,0x28,0x00,0x00, \
++ 0x83,0x8E,0x00,0x50,0x00,0x01,0x01,0x04,0x00,0x4D, \
++ 0x28,0x43,0x06,0x00,0x00,0x01,0x1B,0xFE,0x32,0xC1, \
++ 0x00,0x55,0x00,0x28,0x28,0x43,0x1B,0xF1,0x00,0x00, \
++ 0x9B,0x8F,0x2F,0x0F,0x32,0xC1,0x00,0x55,0x00,0x28, \
++ 0x28,0x43,0x30,0x7E,0x43,0xD6,0x00,0x2C,0x32,0x11, \
++ 0x32,0xC0,0x00,0x4F,0x00,0x81,0x00,0x00,0x87,0x8F, \
++ 0x28,0x23,0x06,0x00,0x32,0x11,0x32,0xC0,0x00,0x4F, \
++ 0x00,0x81,0x00,0x00,0x83,0x8F,0x2F,0x0F,0x06,0x00, \
++ 0x32,0x11,0x32,0xC0,0x00,0x4F,0x00,0x55,0x00,0x01, \
++ 0x00,0x81,0x32,0x11,0x00,0x00,0x83,0x8E,0x00,0x50, \
++ 0x00,0x01,0x01,0x04,0x00,0x4D,0x28,0x43,0x06,0x00, \
++ 0x1B,0xB3,0x09,0x5F,0x00,0x20,0x00,0x00,0x09,0x4F, \
++ 0x00,0x20,0x00,0x00,0x34,0xB7,0x00,0xF9,0x00,0x00, \
++ 0x01,0x00,0x00,0x00,0x00,0x00,0x2B,0x97,0x31,0xB3, \
++ 0x29,0x8F,0x33,0xF1,0x00,0xF9,0x00,0x01,0x00,0x00, \
++ 0x00,0x00,0x00,0x00,0x28,0x7F,0x00,0x03,0x00,0x02, \
++ 0x00,0x00,0x00,0x01,0x1B,0xFE,0x00,0x01,0x1B,0xFE, \
++}
++#endif /* (DPAA_VERSION == 10) */
++
++/****************************/
++/* Parser defines */
++/****************************/
++#define FM_PCD_PRS_SW_TAIL_SIZE 4 /**< Number of bytes that must be cleared at
++ the end of the SW parser area */
++
++/* masks */
++#define PRS_ERR_CAP 0x80000000
++#define PRS_ERR_TYPE_DOUBLE 0x40000000
++#define PRS_ERR_SINGLE_ECC_CNT_MASK 0x00FF0000
++#define PRS_ERR_ADDR_MASK 0x000001FF
++
++/* others */
++#define PRS_MAX_CYCLE_LIMIT 8191
++#define PRS_SW_DATA 0x00000800
++#define PRS_REGS_OFFSET 0x00000840
++
++#define GET_FM_PCD_PRS_PORT_ID(prsPortId,hardwarePortId) \
++ prsPortId = (uint8_t)(hardwarePortId & 0x0f)
++
++#define GET_FM_PCD_INDEX_FLAG(bitMask, prsPortId) \
++ bitMask = 0x80000000>>prsPortId
++
++
++#endif /* __FM_PRS_H */
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_replic.c b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_replic.c
+new file mode 100644
+index 0000000..6f8b3a3
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_replic.c
+@@ -0,0 +1,991 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File fm_replic.c
++
++ @Description FM frame replicator
++*//***************************************************************************/
++#include "std_ext.h"
++#include "error_ext.h"
++#include "string_ext.h"
++#include "debug_ext.h"
++#include "fm_pcd_ext.h"
++#include "fm_muram_ext.h"
++#include "fm_common.h"
++#include "fm_hc.h"
++#include "fm_replic.h"
++#include "fm_cc.h"
++#include "list_ext.h"
++
++
++/****************************************/
++/* static functions */
++/****************************************/
++static uint8_t GetMemberPosition(t_FmPcdFrmReplicGroup *p_ReplicGroup,
++ uint32_t memberIndex,
++ bool isAddOperation)
++{
++ uint8_t memberPosition;
++ uint32_t lastMemberIndex;
++
++ ASSERT_COND(p_ReplicGroup);
++
++ /* the last member index is different between add and remove operation -
++ in case of remove - this is exactly the last member index
++ in case of add - this is the last member index + 1 - e.g.
++ if we have 4 members, the index of the actual last member is 3(because the
++ index starts from 0) therefore in order to add a new member as the last
++ member we shall use memberIndex = 4 and not 3
++ */
++ if (isAddOperation)
++ lastMemberIndex = p_ReplicGroup->numOfEntries;
++ else
++ lastMemberIndex = p_ReplicGroup->numOfEntries-1;
++
++ /* last */
++ if (memberIndex == lastMemberIndex)
++ memberPosition = FRM_REPLIC_LAST_MEMBER_INDEX;
++ else
++ {
++ /* first */
++ if (memberIndex == 0)
++ memberPosition = FRM_REPLIC_FIRST_MEMBER_INDEX;
++ else
++ {
++ /* middle */
++ ASSERT_COND(memberIndex < lastMemberIndex);
++ memberPosition = FRM_REPLIC_MIDDLE_MEMBER_INDEX;
++ }
++ }
++ return memberPosition;
++}
++
++static t_Error MemberCheckParams(t_Handle h_FmPcd,
++ t_FmPcdCcNextEngineParams *p_MemberParams)
++{
++ t_Error err;
++
++
++ if ((p_MemberParams->nextEngine != e_FM_PCD_DONE) &&
++ (p_MemberParams->nextEngine != e_FM_PCD_KG) &&
++ (p_MemberParams->nextEngine != e_FM_PCD_PLCR))
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("Next engine of a member should be MatchTable(cc) or Done or Policer"));
++
++ /* check the regular parameters of the next engine */
++ err = ValidateNextEngineParams(h_FmPcd, p_MemberParams, e_FM_PCD_CC_STATS_MODE_NONE);
++ if (err)
++ RETURN_ERROR(MAJOR, err, ("member next engine parameters"));
++
++ return E_OK;
++}
++
++static t_Error CheckParams(t_Handle h_FmPcd,
++ t_FmPcdFrmReplicGroupParams *p_ReplicGroupParam)
++{
++ int i;
++ t_Error err;
++
++ /* check that max num of entries is at least 2 */
++ if (!IN_RANGE(2, p_ReplicGroupParam->maxNumOfEntries, FM_PCD_FRM_REPLIC_MAX_NUM_OF_ENTRIES))
++ RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, ("maxNumOfEntries in the frame replicator parameters should be 2-%d",FM_PCD_FRM_REPLIC_MAX_NUM_OF_ENTRIES));
++
++ /* check that number of entries is greater than zero */
++ if (!p_ReplicGroupParam->numOfEntries)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("numOFEntries in the frame replicator group should be greater than zero"));
++
++ /* check that max num of entries is equal or greater than number of entries */
++ if (p_ReplicGroupParam->maxNumOfEntries < p_ReplicGroupParam->numOfEntries)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("maxNumOfEntries should be equal or greater than numOfEntries"));
++
++ for (i=0; inumOfEntries; i++)
++ {
++ err = MemberCheckParams(h_FmPcd, &p_ReplicGroupParam->nextEngineParams[i]);
++ if (err)
++ RETURN_ERROR(MAJOR, err, ("member check parameters"));
++ }
++ return E_OK;
++}
++
++static t_FmPcdFrmReplicMember *GetAvailableMember(t_FmPcdFrmReplicGroup *p_ReplicGroup)
++{
++ t_FmPcdFrmReplicMember *p_ReplicMember = NULL;
++ t_List *p_Next;
++
++ if (!LIST_IsEmpty(&p_ReplicGroup->availableMembersList))
++ {
++ p_Next = LIST_FIRST(&p_ReplicGroup->availableMembersList);
++ p_ReplicMember = LIST_OBJECT(p_Next, t_FmPcdFrmReplicMember, node);
++ ASSERT_COND(p_ReplicMember);
++ LIST_DelAndInit(p_Next);
++ }
++ return p_ReplicMember;
++}
++
++static void PutAvailableMember(t_FmPcdFrmReplicGroup *p_ReplicGroup,
++ t_FmPcdFrmReplicMember *p_ReplicMember)
++{
++ LIST_AddToTail(&p_ReplicMember->node, &p_ReplicGroup->availableMembersList);
++}
++
++static void AddMemberToList(t_FmPcdFrmReplicGroup *p_ReplicGroup,
++ t_FmPcdFrmReplicMember *p_CurrentMember,
++ t_List *p_ListHead)
++{
++ LIST_Add(&p_CurrentMember->node, p_ListHead);
++
++ p_ReplicGroup->numOfEntries++;
++}
++
++static void RemoveMemberFromList(t_FmPcdFrmReplicGroup *p_ReplicGroup,
++ t_FmPcdFrmReplicMember *p_CurrentMember)
++{
++ ASSERT_COND(p_ReplicGroup->numOfEntries);
++ LIST_DelAndInit(&p_CurrentMember->node);
++ p_ReplicGroup->numOfEntries--;
++}
++
++static void LinkSourceToMember(t_FmPcdFrmReplicGroup *p_ReplicGroup,
++ t_AdOfTypeContLookup *p_SourceTd,
++ t_FmPcdFrmReplicMember *p_ReplicMember)
++{
++ t_FmPcd *p_FmPcd;
++
++ ASSERT_COND(p_SourceTd);
++ ASSERT_COND(p_ReplicMember);
++ ASSERT_COND(p_ReplicGroup);
++ ASSERT_COND(p_ReplicGroup->h_FmPcd);
++
++ /* Link the first member in the group to the source TD */
++ p_FmPcd = p_ReplicGroup->h_FmPcd;
++
++ WRITE_UINT32(p_SourceTd->matchTblPtr,
++ (uint32_t)(XX_VirtToPhys(p_ReplicMember->p_MemberAd) -
++ p_FmPcd->physicalMuramBase));
++}
++
++static void LinkMemberToMember(t_FmPcdFrmReplicGroup *p_ReplicGroup,
++ t_FmPcdFrmReplicMember *p_CurrentMember,
++ t_FmPcdFrmReplicMember *p_NextMember)
++{
++ t_AdOfTypeResult *p_CurrReplicAd = (t_AdOfTypeResult*)p_CurrentMember->p_MemberAd;
++ t_AdOfTypeResult *p_NextReplicAd = NULL;
++ t_FmPcd *p_FmPcd;
++ uint32_t offset = 0;
++
++ /* Check if the next member exists or it's NULL (- means that this is the last member) */
++ if (p_NextMember)
++ {
++ p_NextReplicAd = (t_AdOfTypeResult*)p_NextMember->p_MemberAd;
++ p_FmPcd = p_ReplicGroup->h_FmPcd;
++ offset = (XX_VirtToPhys(p_NextReplicAd) - (p_FmPcd->physicalMuramBase));
++ offset = ((offset>>NEXT_FRM_REPLIC_ADDR_SHIFT)<< NEXT_FRM_REPLIC_MEMBER_INDEX_SHIFT);
++ }
++
++ /* link the current AD to point to the AD of the next member */
++ WRITE_UINT32(p_CurrReplicAd->res, offset);
++}
++
++static t_Error ModifyDescriptor(t_FmPcdFrmReplicGroup *p_ReplicGroup,
++ void *p_OldDescriptor,
++ void *p_NewDescriptor)
++{
++ t_Handle h_Hc;
++ t_Error err;
++ t_FmPcd *p_FmPcd;
++
++ ASSERT_COND(p_ReplicGroup);
++ ASSERT_COND(p_ReplicGroup->h_FmPcd);
++ ASSERT_COND(p_OldDescriptor);
++ ASSERT_COND(p_NewDescriptor);
++
++ p_FmPcd = p_ReplicGroup->h_FmPcd;
++ h_Hc = FmPcdGetHcHandle(p_FmPcd);
++ if (!h_Hc)
++ RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("Host command"));
++
++ err = FmHcPcdCcDoDynamicChange(h_Hc,
++ (uint32_t)(XX_VirtToPhys(p_OldDescriptor) - p_FmPcd->physicalMuramBase),
++ (uint32_t)(XX_VirtToPhys(p_NewDescriptor) - p_FmPcd->physicalMuramBase));
++ if (err)
++ RETURN_ERROR(MAJOR, err, ("Dynamic change host command"));
++
++ return E_OK;
++}
++
++static void FillReplicAdOfTypeResult(void *p_ReplicAd, bool last)
++{
++ t_AdOfTypeResult *p_CurrReplicAd = (t_AdOfTypeResult*)p_ReplicAd;
++ uint32_t tmp;
++
++ tmp = GET_UINT32(p_CurrReplicAd->plcrProfile);
++ if (last)
++ /* clear the NL bit in case it's the last member in the group*/
++ WRITE_UINT32(p_CurrReplicAd->plcrProfile,(tmp & ~FRM_REPLIC_NL_BIT));
++ else
++ /* set the NL bit in case it's not the last member in the group */
++ WRITE_UINT32(p_CurrReplicAd->plcrProfile, (tmp |FRM_REPLIC_NL_BIT));
++
++ /* set FR bit in the action descriptor */
++ tmp = GET_UINT32(p_CurrReplicAd->nia);
++ WRITE_UINT32(p_CurrReplicAd->nia,
++ (tmp | FRM_REPLIC_FR_BIT | FM_PCD_AD_RESULT_EXTENDED_MODE ));
++}
++
++static void BuildSourceTd(void *p_Ad)
++{
++ t_AdOfTypeContLookup *p_SourceTd;
++
++ ASSERT_COND(p_Ad);
++
++ p_SourceTd = (t_AdOfTypeContLookup *)p_Ad;
++
++ IOMemSet32((uint8_t*)p_SourceTd, 0, FM_PCD_CC_AD_ENTRY_SIZE);
++
++ /* initialize the source table descriptor */
++ WRITE_UINT32(p_SourceTd->ccAdBase, FM_PCD_AD_CONT_LOOKUP_TYPE);
++ WRITE_UINT32(p_SourceTd->pcAndOffsets, FRM_REPLIC_SOURCE_TD_OPCODE);
++}
++
++static t_Error BuildShadowAndModifyDescriptor(t_FmPcdFrmReplicGroup *p_ReplicGroup,
++ t_FmPcdFrmReplicMember *p_NextMember,
++ t_FmPcdFrmReplicMember *p_CurrentMember,
++ bool sourceDescriptor,
++ bool last)
++{
++ t_FmPcd *p_FmPcd;
++ t_FmPcdFrmReplicMember shadowMember;
++ t_Error err;
++
++ ASSERT_COND(p_ReplicGroup);
++ ASSERT_COND(p_ReplicGroup->h_FmPcd);
++
++ p_FmPcd = p_ReplicGroup->h_FmPcd;
++ ASSERT_COND(p_FmPcd->p_CcShadow);
++
++ if (!TRY_LOCK(p_FmPcd->h_ShadowSpinlock, &p_FmPcd->shadowLock))
++ return ERROR_CODE(E_BUSY);
++
++ if (sourceDescriptor)
++ {
++ BuildSourceTd(p_FmPcd->p_CcShadow);
++ LinkSourceToMember(p_ReplicGroup, p_FmPcd->p_CcShadow, p_NextMember);
++
++ /* Modify the source table descriptor according to the prepared shadow descriptor */
++ err = ModifyDescriptor(p_ReplicGroup,
++ p_ReplicGroup->p_SourceTd,
++ p_FmPcd->p_CcShadow/* new prepared source td */);
++
++ RELEASE_LOCK(p_FmPcd->shadowLock);
++ if (err)
++ RETURN_ERROR(MAJOR, err, ("Modify source Descriptor in BuildShadowAndModifyDescriptor"));
++
++ }
++ else
++ {
++ IO2IOCpy32(p_FmPcd->p_CcShadow,
++ p_CurrentMember->p_MemberAd,
++ FM_PCD_CC_AD_ENTRY_SIZE);
++
++ /* update the last bit in the shadow ad */
++ FillReplicAdOfTypeResult(p_FmPcd->p_CcShadow, last);
++
++ shadowMember.p_MemberAd = p_FmPcd->p_CcShadow;
++
++ /* update the next FR member index */
++ LinkMemberToMember(p_ReplicGroup, &shadowMember, p_NextMember);
++
++ /* Modify the next member according to the prepared shadow descriptor */
++ err = ModifyDescriptor(p_ReplicGroup,
++ p_CurrentMember->p_MemberAd,
++ p_FmPcd->p_CcShadow);
++
++ RELEASE_LOCK(p_FmPcd->shadowLock);
++ if (err)
++ RETURN_ERROR(MAJOR, err, ("Modify Descriptor in BuildShadowAndModifyDescriptor"));
++ }
++
++
++ return E_OK;
++}
++
++static t_FmPcdFrmReplicMember* GetMemberByIndex(t_FmPcdFrmReplicGroup *p_ReplicGroup,
++ uint16_t memberIndex)
++{
++ int i=0;
++ t_List *p_Pos;
++ t_FmPcdFrmReplicMember *p_Member = NULL;
++
++ LIST_FOR_EACH(p_Pos, &p_ReplicGroup->membersList)
++ {
++ if (i == memberIndex)
++ {
++ p_Member = LIST_OBJECT(p_Pos, t_FmPcdFrmReplicMember, node);
++ return p_Member;
++ }
++ i++;
++ }
++ return p_Member;
++}
++
++static t_Error AllocMember(t_FmPcdFrmReplicGroup *p_ReplicGroup)
++{
++ t_FmPcdFrmReplicMember *p_CurrentMember;
++ t_Handle h_Muram;
++
++ ASSERT_COND(p_ReplicGroup);
++
++ h_Muram = FmPcdGetMuramHandle(p_ReplicGroup->h_FmPcd);
++ ASSERT_COND(h_Muram);
++
++ /* Initialize an internal structure of a member to add to the available members list */
++ p_CurrentMember = (t_FmPcdFrmReplicMember *)XX_Malloc(sizeof(t_FmPcdFrmReplicMember));
++ if (!p_CurrentMember)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Frame replicator member"));
++
++ memset(p_CurrentMember, 0 ,sizeof(t_FmPcdFrmReplicMember));
++
++ /* Allocate the member AD */
++ p_CurrentMember->p_MemberAd =
++ (t_AdOfTypeResult*)FM_MURAM_AllocMem(h_Muram,
++ FM_PCD_CC_AD_ENTRY_SIZE,
++ FM_PCD_CC_AD_TABLE_ALIGN);
++
++ if (!p_CurrentMember->p_MemberAd)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("member AD table"));
++
++ IOMemSet32((uint8_t*)p_CurrentMember->p_MemberAd, 0, FM_PCD_CC_AD_ENTRY_SIZE);
++
++ /* Add the new member to the available members list */
++ LIST_AddToTail(&p_CurrentMember->node, &(p_ReplicGroup->availableMembersList));
++
++ return E_OK;
++}
++
++static t_FmPcdFrmReplicMember* InitMember(t_FmPcdFrmReplicGroup *p_ReplicGroup,
++ t_FmPcdCcNextEngineParams *p_MemberParams,
++ bool last)
++{
++ t_FmPcdFrmReplicMember *p_CurrentMember = NULL;
++
++ ASSERT_COND(p_ReplicGroup);
++
++ /* Get an available member from the internal members list */
++ p_CurrentMember = GetAvailableMember(p_ReplicGroup);
++ if (!p_CurrentMember)
++ {
++ REPORT_ERROR(MAJOR, E_NOT_FOUND, ("Available member"));
++ return NULL;
++ }
++ p_CurrentMember->h_Manip = NULL;
++
++ /* clear the Ad of the new member */
++ IOMemSet32((uint8_t*)p_CurrentMember->p_MemberAd, 0, FM_PCD_CC_AD_ENTRY_SIZE);
++
++ INIT_LIST(&p_CurrentMember->node);
++
++ /* Initialize the Ad of the member */
++ NextStepAd(p_CurrentMember->p_MemberAd,
++ NULL,
++ p_MemberParams,
++ p_ReplicGroup->h_FmPcd);
++
++ /* save Manip handle (for free needs) */
++ if (p_MemberParams->h_Manip)
++ p_CurrentMember->h_Manip = p_MemberParams->h_Manip;
++
++ /* Initialize the relevant frame replicator fields in the AD */
++ FillReplicAdOfTypeResult(p_CurrentMember->p_MemberAd, last);
++
++ return p_CurrentMember;
++}
++
++static void FreeMember(t_FmPcdFrmReplicGroup *p_ReplicGroup,
++ t_FmPcdFrmReplicMember *p_Member)
++{
++ /* Note: Can't free the member AD just returns the member to the available
++ member list - therefore only memset the AD */
++
++ /* zero the AD */
++ IOMemSet32(p_Member->p_MemberAd, 0, FM_PCD_CC_AD_ENTRY_SIZE);
++
++
++ /* return the member to the available members list */
++ PutAvailableMember(p_ReplicGroup, p_Member);
++}
++
++static t_Error RemoveMember(t_FmPcdFrmReplicGroup *p_ReplicGroup,
++ uint16_t memberIndex)
++{
++ t_FmPcd *p_FmPcd = NULL;
++ t_FmPcdFrmReplicMember *p_CurrentMember = NULL, *p_PreviousMember = NULL, *p_NextMember = NULL;
++ t_Error err;
++ uint8_t memberPosition;
++
++ p_FmPcd = p_ReplicGroup->h_FmPcd;
++ ASSERT_COND(p_FmPcd);
++
++ p_CurrentMember = GetMemberByIndex(p_ReplicGroup, memberIndex);
++ ASSERT_COND(p_CurrentMember);
++
++ /* determine the member position in the group */
++ memberPosition = GetMemberPosition(p_ReplicGroup,
++ memberIndex,
++ FALSE/*remove operation*/);
++
++ switch (memberPosition)
++ {
++ case FRM_REPLIC_FIRST_MEMBER_INDEX:
++ p_NextMember = GetMemberByIndex(p_ReplicGroup, (uint16_t)(memberIndex+1));
++ ASSERT_COND(p_NextMember);
++
++ /* update the source td itself by using a host command */
++ err = BuildShadowAndModifyDescriptor(p_ReplicGroup,
++ p_NextMember,
++ NULL,
++ TRUE/*sourceDescriptor*/,
++ FALSE/*last*/);
++ break;
++
++ case FRM_REPLIC_MIDDLE_MEMBER_INDEX:
++ p_PreviousMember = GetMemberByIndex(p_ReplicGroup, (uint16_t)(memberIndex-1));
++ ASSERT_COND(p_PreviousMember);
++
++ p_NextMember = GetMemberByIndex(p_ReplicGroup, (uint16_t)(memberIndex+1));
++ ASSERT_COND(p_NextMember);
++
++ err = BuildShadowAndModifyDescriptor(p_ReplicGroup,
++ p_NextMember,
++ p_PreviousMember,
++ FALSE/*sourceDescriptor*/,
++ FALSE/*last*/);
++
++ break;
++
++ case FRM_REPLIC_LAST_MEMBER_INDEX:
++ p_PreviousMember = GetMemberByIndex(p_ReplicGroup, (uint16_t)(memberIndex-1));
++ ASSERT_COND(p_PreviousMember);
++
++ err = BuildShadowAndModifyDescriptor(p_ReplicGroup,
++ NULL,
++ p_PreviousMember,
++ FALSE/*sourceDescriptor*/,
++ TRUE/*last*/);
++ break;
++
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, ("member position in remove member"));
++ }
++
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ if (p_CurrentMember->h_Manip)
++ {
++ FmPcdManipUpdateOwner(p_CurrentMember->h_Manip, FALSE);
++ p_CurrentMember->h_Manip = NULL;
++ }
++
++ /* remove the member from the driver internal members list */
++ RemoveMemberFromList(p_ReplicGroup, p_CurrentMember);
++
++ /* return the member to the available members list */
++ FreeMember(p_ReplicGroup, p_CurrentMember);
++
++ return E_OK;
++}
++
++static void DeleteGroup(t_FmPcdFrmReplicGroup *p_ReplicGroup)
++{
++ int i, j;
++ t_Handle h_Muram;
++ t_FmPcdFrmReplicMember *p_Member, *p_CurrentMember;
++
++ if (p_ReplicGroup)
++ {
++ ASSERT_COND(p_ReplicGroup->h_FmPcd);
++ h_Muram = FmPcdGetMuramHandle(p_ReplicGroup->h_FmPcd);
++ ASSERT_COND(h_Muram);
++
++ /* free the source table descriptor */
++ if (p_ReplicGroup->p_SourceTd)
++ {
++ FM_MURAM_FreeMem(h_Muram, p_ReplicGroup->p_SourceTd);
++ p_ReplicGroup->p_SourceTd = NULL;
++ }
++
++ /* Remove all members from the members linked list (hw and sw) and
++ return the members to the available members list */
++ if (p_ReplicGroup->numOfEntries)
++ {
++ j = p_ReplicGroup->numOfEntries-1;
++
++ /* manually removal of the member because there are no owners of
++ this group */
++ for (i=j; i>=0; i--)
++ {
++ p_CurrentMember = GetMemberByIndex(p_ReplicGroup, (uint16_t)i/*memberIndex*/);
++ ASSERT_COND(p_CurrentMember);
++
++ if (p_CurrentMember->h_Manip)
++ {
++ FmPcdManipUpdateOwner(p_CurrentMember->h_Manip, FALSE);
++ p_CurrentMember->h_Manip = NULL;
++ }
++
++ /* remove the member from the internal driver members list */
++ RemoveMemberFromList(p_ReplicGroup, p_CurrentMember);
++
++ /* return the member to the available members list */
++ FreeMember(p_ReplicGroup, p_CurrentMember);
++ }
++ }
++
++ /* Free members AD */
++ for (i=0; imaxNumOfEntries; i++)
++ {
++ p_Member = GetAvailableMember(p_ReplicGroup);
++ ASSERT_COND(p_Member);
++ if (p_Member->p_MemberAd)
++ {
++ FM_MURAM_FreeMem(h_Muram, p_Member->p_MemberAd);
++ p_Member->p_MemberAd = NULL;
++ }
++ XX_Free(p_Member);
++ }
++
++ /* release the group lock */
++ if (p_ReplicGroup->p_Lock)
++ FmPcdReleaseLock(p_ReplicGroup->h_FmPcd, p_ReplicGroup->p_Lock);
++
++ /* free the replicator group */
++ XX_Free(p_ReplicGroup);
++ p_ReplicGroup = NULL;
++ }
++}
++
++
++/*****************************************************************************/
++/* Inter-module API routines */
++/*****************************************************************************/
++
++/* NOTE: the inter-module routines are locked by cc in case of using them */
++void * FrmReplicGroupGetSourceTableDescriptor(t_Handle h_ReplicGroup)
++{
++ t_FmPcdFrmReplicGroup *p_ReplicGroup = (t_FmPcdFrmReplicGroup *)h_ReplicGroup;
++ ASSERT_COND(p_ReplicGroup);
++
++ return (p_ReplicGroup->p_SourceTd);
++}
++
++void FrmReplicGroupUpdateAd(t_Handle h_ReplicGroup,
++ void *p_Ad,
++ t_Handle *h_AdNew)
++{
++ t_FmPcdFrmReplicGroup *p_ReplicGroup = (t_FmPcdFrmReplicGroup *)h_ReplicGroup;
++ t_AdOfTypeResult *p_AdResult = (t_AdOfTypeResult*)p_Ad;
++ t_FmPcd *p_FmPcd;
++
++ ASSERT_COND(p_ReplicGroup);
++ p_FmPcd = p_ReplicGroup->h_FmPcd;
++
++ /* build a bypass ad */
++ WRITE_UINT32(p_AdResult->fqid, FM_PCD_AD_BYPASS_TYPE |
++ (uint32_t)((XX_VirtToPhys(p_ReplicGroup->p_SourceTd)) - p_FmPcd->physicalMuramBase));
++
++ *h_AdNew = NULL;
++}
++
++void FrmReplicGroupUpdateOwner(t_Handle h_ReplicGroup,
++ bool add)
++{
++ t_FmPcdFrmReplicGroup *p_ReplicGroup = (t_FmPcdFrmReplicGroup *)h_ReplicGroup;
++ ASSERT_COND(p_ReplicGroup);
++
++ /* update the group owner counter */
++ if (add)
++ p_ReplicGroup->owners++;
++ else
++ {
++ ASSERT_COND(p_ReplicGroup->owners);
++ p_ReplicGroup->owners--;
++ }
++}
++
++t_Error FrmReplicGroupTryLock(t_Handle h_ReplicGroup)
++{
++ t_FmPcdFrmReplicGroup *p_ReplicGroup = (t_FmPcdFrmReplicGroup *)h_ReplicGroup;
++
++ ASSERT_COND(h_ReplicGroup);
++
++ if (FmPcdLockTryLock(p_ReplicGroup->p_Lock))
++ return E_OK;
++
++ return ERROR_CODE(E_BUSY);
++}
++
++void FrmReplicGroupUnlock(t_Handle h_ReplicGroup)
++{
++ t_FmPcdFrmReplicGroup *p_ReplicGroup = (t_FmPcdFrmReplicGroup *)h_ReplicGroup;
++
++ ASSERT_COND(h_ReplicGroup);
++
++ FmPcdLockUnlock(p_ReplicGroup->p_Lock);
++}
++/*********************** End of inter-module routines ************************/
++
++
++/****************************************/
++/* API Init unit functions */
++/****************************************/
++t_Handle FM_PCD_FrmReplicSetGroup(t_Handle h_FmPcd,
++ t_FmPcdFrmReplicGroupParams *p_ReplicGroupParam)
++{
++ t_FmPcdFrmReplicGroup *p_ReplicGroup;
++ t_FmPcdFrmReplicMember *p_CurrentMember, *p_NextMember = NULL;
++ int i;
++ t_Error err;
++ bool last = FALSE;
++ t_Handle h_Muram;
++
++ SANITY_CHECK_RETURN_VALUE(h_FmPcd, E_INVALID_HANDLE, NULL);
++ SANITY_CHECK_RETURN_VALUE(p_ReplicGroupParam, E_INVALID_HANDLE, NULL);
++
++ if (!FmPcdIsAdvancedOffloadSupported(h_FmPcd))
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Advanced-offload must be enabled"));
++ return NULL;
++ }
++
++ err = CheckParams(h_FmPcd, p_ReplicGroupParam);
++ if (err)
++ {
++ REPORT_ERROR(MAJOR, err, (NO_MSG));
++ return NULL;
++ }
++
++ p_ReplicGroup = (t_FmPcdFrmReplicGroup*)XX_Malloc(sizeof(t_FmPcdFrmReplicGroup));
++ if (!p_ReplicGroup)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("No memory"));
++ return NULL;
++ }
++ memset(p_ReplicGroup, 0, sizeof(t_FmPcdFrmReplicGroup));
++
++ /* initialize lists for internal driver use */
++ INIT_LIST(&p_ReplicGroup->availableMembersList);
++ INIT_LIST(&p_ReplicGroup->membersList);
++
++ p_ReplicGroup->h_FmPcd = h_FmPcd;
++
++ h_Muram = FmPcdGetMuramHandle(p_ReplicGroup->h_FmPcd);
++ ASSERT_COND(h_Muram);
++
++ /* initialize the group lock */
++ p_ReplicGroup->p_Lock = FmPcdAcquireLock(p_ReplicGroup->h_FmPcd);
++ if (!p_ReplicGroup->p_Lock)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("Replic group lock"));
++ DeleteGroup(p_ReplicGroup);
++ return NULL;
++ }
++
++ /* Allocate the frame replicator source table descriptor */
++ p_ReplicGroup->p_SourceTd =
++ (t_Handle)FM_MURAM_AllocMem(h_Muram,
++ FM_PCD_CC_AD_ENTRY_SIZE,
++ FM_PCD_CC_AD_TABLE_ALIGN);
++ if (!p_ReplicGroup->p_SourceTd)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("frame replicator source table descriptor"));
++ DeleteGroup(p_ReplicGroup);
++ return NULL;
++ }
++
++ /* update the shadow size - required for the host commands */
++ err = FmPcdUpdateCcShadow(p_ReplicGroup->h_FmPcd,
++ FM_PCD_CC_AD_ENTRY_SIZE,
++ FM_PCD_CC_AD_TABLE_ALIGN);
++ if (err)
++ {
++ REPORT_ERROR(MAJOR, err, ("Update CC shadow"));
++ DeleteGroup(p_ReplicGroup);
++ return NULL;
++ }
++
++ p_ReplicGroup->maxNumOfEntries = p_ReplicGroupParam->maxNumOfEntries;
++
++ /* Allocate the maximal number of members ADs and Statistics AD for the group
++ It prevents allocation of Muram in run-time */
++ for (i=0; imaxNumOfEntries; i++)
++ {
++ err = AllocMember(p_ReplicGroup);
++ if (err)
++ {
++ REPORT_ERROR(MAJOR, err, ("allocate a new member"));
++ DeleteGroup(p_ReplicGroup);
++ return NULL;
++ }
++ }
++
++ /* Initialize the members linked lists:
++ (hw - the one that is used by the FMan controller and
++ sw - the one that is managed by the driver internally) */
++ for (i=(p_ReplicGroupParam->numOfEntries-1); i>=0; i--)
++ {
++ /* check if this is the last member in the group */
++ if (i == (p_ReplicGroupParam->numOfEntries-1))
++ last = TRUE;
++ else
++ last = FALSE;
++
++ /* Initialize a new member */
++ p_CurrentMember = InitMember(p_ReplicGroup,
++ &(p_ReplicGroupParam->nextEngineParams[i]),
++ last);
++ if (!p_CurrentMember)
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_HANDLE, ("No available member"));
++ DeleteGroup(p_ReplicGroup);
++ return NULL;
++ }
++
++ /* Build the members group - link two consecutive members in the hw linked list */
++ LinkMemberToMember(p_ReplicGroup, p_CurrentMember, p_NextMember);
++
++ /* update the driver internal members list to be compatible to the hw members linked list */
++ AddMemberToList(p_ReplicGroup, p_CurrentMember, &p_ReplicGroup->membersList);
++
++ p_NextMember = p_CurrentMember;
++ }
++
++ /* initialize the source table descriptor */
++ BuildSourceTd(p_ReplicGroup->p_SourceTd);
++
++ /* link the source table descriptor to point to the first member in the group */
++ LinkSourceToMember(p_ReplicGroup, p_ReplicGroup->p_SourceTd, p_NextMember);
++
++ return p_ReplicGroup;
++}
++
++t_Error FM_PCD_FrmReplicDeleteGroup(t_Handle h_ReplicGroup)
++{
++ t_FmPcdFrmReplicGroup *p_ReplicGroup = (t_FmPcdFrmReplicGroup *)h_ReplicGroup;
++
++ SANITY_CHECK_RETURN_ERROR(p_ReplicGroup, E_INVALID_HANDLE);
++
++ if (p_ReplicGroup->owners)
++ RETURN_ERROR(MAJOR,
++ E_INVALID_STATE,
++ ("the group has owners and can't be deleted"));
++
++ DeleteGroup(p_ReplicGroup);
++
++ return E_OK;
++}
++
++
++/*****************************************************************************/
++/* API Run-time Frame replicator Control unit functions */
++/*****************************************************************************/
++t_Error FM_PCD_FrmReplicAddMember(t_Handle h_ReplicGroup,
++ uint16_t memberIndex,
++ t_FmPcdCcNextEngineParams *p_MemberParams)
++{
++ t_FmPcdFrmReplicGroup *p_ReplicGroup = (t_FmPcdFrmReplicGroup*) h_ReplicGroup;
++ t_FmPcdFrmReplicMember *p_NewMember, *p_CurrentMember = NULL, *p_PreviousMember = NULL;
++ t_Error err;
++ uint8_t memberPosition;
++
++ SANITY_CHECK_RETURN_ERROR(p_ReplicGroup, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_MemberParams, E_INVALID_HANDLE);
++
++ /* group lock */
++ err = FrmReplicGroupTryLock(p_ReplicGroup);
++ if (err)
++ {
++ if (GET_ERROR_TYPE(err) == E_BUSY)
++ return ERROR_CODE(E_BUSY);
++ else
++ RETURN_ERROR(MAJOR, err, ("try lock in Add member"));
++ }
++
++ if (memberIndex > p_ReplicGroup->numOfEntries)
++ {
++ /* unlock */
++ FrmReplicGroupUnlock(p_ReplicGroup);
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION,
++ ("memberIndex is greater than the members in the list"));
++ }
++
++ if (memberIndex >= p_ReplicGroup->maxNumOfEntries)
++ {
++ /* unlock */
++ FrmReplicGroupUnlock(p_ReplicGroup);
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, ("memberIndex is greater than the allowed number of members in the group"));
++ }
++
++ if ((p_ReplicGroup->numOfEntries + 1) > FM_PCD_FRM_REPLIC_MAX_NUM_OF_ENTRIES)
++ {
++ /* unlock */
++ FrmReplicGroupUnlock(p_ReplicGroup);
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE,
++ ("numOfEntries with new entry can not be larger than %d\n",
++ FM_PCD_FRM_REPLIC_MAX_NUM_OF_ENTRIES));
++ }
++
++ err = MemberCheckParams(p_ReplicGroup->h_FmPcd, p_MemberParams);
++ if (err)
++ {
++ /* unlock */
++ FrmReplicGroupUnlock(p_ReplicGroup);
++ RETURN_ERROR(MAJOR, err, ("member check parameters in add operation"));
++ }
++ /* determine the member position in the group */
++ memberPosition = GetMemberPosition(p_ReplicGroup,
++ memberIndex,
++ TRUE/* add operation */);
++
++ /* Initialize a new member */
++ p_NewMember = InitMember(p_ReplicGroup,
++ p_MemberParams,
++ (memberPosition == FRM_REPLIC_LAST_MEMBER_INDEX ? TRUE : FALSE));
++ if (!p_NewMember)
++ {
++ /* unlock */
++ FrmReplicGroupUnlock(p_ReplicGroup);
++ RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("No available member"));
++ }
++
++ switch (memberPosition)
++ {
++ case FRM_REPLIC_FIRST_MEMBER_INDEX:
++ p_CurrentMember = GetMemberByIndex(p_ReplicGroup, memberIndex);
++ ASSERT_COND(p_CurrentMember);
++
++ LinkMemberToMember(p_ReplicGroup, p_NewMember, p_CurrentMember);
++
++ /* update the internal group source TD */
++ LinkSourceToMember(p_ReplicGroup,
++ p_ReplicGroup->p_SourceTd,
++ p_NewMember);
++
++ /* add member to the internal sw member list */
++ AddMemberToList(p_ReplicGroup,
++ p_NewMember,
++ &p_ReplicGroup->membersList);
++ break;
++
++ case FRM_REPLIC_MIDDLE_MEMBER_INDEX:
++ p_CurrentMember = GetMemberByIndex(p_ReplicGroup, memberIndex);
++ ASSERT_COND(p_CurrentMember);
++
++ p_PreviousMember = GetMemberByIndex(p_ReplicGroup, (uint16_t)(memberIndex-1));
++ ASSERT_COND(p_PreviousMember);
++
++ LinkMemberToMember(p_ReplicGroup, p_NewMember, p_CurrentMember);
++ LinkMemberToMember(p_ReplicGroup, p_PreviousMember, p_NewMember);
++
++ AddMemberToList(p_ReplicGroup, p_NewMember, &p_PreviousMember->node);
++ break;
++
++ case FRM_REPLIC_LAST_MEMBER_INDEX:
++ p_PreviousMember = GetMemberByIndex(p_ReplicGroup, (uint16_t)(memberIndex-1));
++ ASSERT_COND(p_PreviousMember);
++
++ LinkMemberToMember(p_ReplicGroup, p_PreviousMember, p_NewMember);
++ FillReplicAdOfTypeResult(p_PreviousMember->p_MemberAd, FALSE/*last*/);
++
++ /* add the new member to the internal sw member list */
++ AddMemberToList(p_ReplicGroup, p_NewMember, &p_PreviousMember->node);
++ break;
++
++ default:
++ /* unlock */
++ FrmReplicGroupUnlock(p_ReplicGroup);
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, ("member position in add member"));
++
++ }
++
++ /* unlock */
++ FrmReplicGroupUnlock(p_ReplicGroup);
++
++ return E_OK;
++}
++
++t_Error FM_PCD_FrmReplicRemoveMember(t_Handle h_ReplicGroup,
++ uint16_t memberIndex)
++{
++ t_FmPcdFrmReplicGroup *p_ReplicGroup = (t_FmPcdFrmReplicGroup*) h_ReplicGroup;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_ReplicGroup, E_INVALID_HANDLE);
++
++ /* lock */
++ err = FrmReplicGroupTryLock(p_ReplicGroup);
++ if (err)
++ {
++ if (GET_ERROR_TYPE(err) == E_BUSY)
++ return ERROR_CODE(E_BUSY);
++ else
++ RETURN_ERROR(MAJOR, err, ("try lock in Remove member"));
++ }
++
++ if (memberIndex >= p_ReplicGroup->numOfEntries)
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, ("member index to remove"));
++
++ /* Design decision: group must contain at least one member
++ No possibility to remove the last member from the group */
++ if (p_ReplicGroup->numOfEntries == 1)
++ RETURN_ERROR(MAJOR, E_CONFLICT, ("Can't remove the last member. At least one member should be related to a group."));
++
++ err = RemoveMember(p_ReplicGroup, memberIndex);
++
++ /* unlock */
++ FrmReplicGroupUnlock(p_ReplicGroup);
++
++ switch (GET_ERROR_TYPE(err))
++ {
++ case E_OK:
++ return E_OK;
++
++ case E_BUSY:
++ DBG(TRACE, ("E_BUSY error"));
++ return ERROR_CODE(E_BUSY);
++
++ default:
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++}
++
++/*********************** End of API routines ************************/
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_replic.h b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_replic.h
+new file mode 100644
+index 0000000..3cfd67e
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fm_replic.h
+@@ -0,0 +1,104 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File fm_replic.h
++
++ @Description FM frame replicator
++*//***************************************************************************/
++#ifndef __FM_REPLIC_H
++#define __FM_REPLIC_H
++
++#include "std_ext.h"
++#include "error_ext.h"
++
++
++#define FRM_REPLIC_SOURCE_TD_OPCODE 0x75
++#define NEXT_FRM_REPLIC_ADDR_SHIFT 4
++#define NEXT_FRM_REPLIC_MEMBER_INDEX_SHIFT 16
++#define FRM_REPLIC_FR_BIT 0x08000000
++#define FRM_REPLIC_NL_BIT 0x10000000
++#define FRM_REPLIC_INVALID_MEMBER_INDEX 0xffff
++#define FRM_REPLIC_FIRST_MEMBER_INDEX 0
++
++#define FRM_REPLIC_MIDDLE_MEMBER_INDEX 1
++#define FRM_REPLIC_LAST_MEMBER_INDEX 2
++
++#define SOURCE_TD_ITSELF_OPTION 0x01
++#define SOURCE_TD_COPY_OPTION 0x02
++#define SOURCE_TD_ITSELF_AND_COPY_OPTION SOURCE_TD_ITSELF_OPTION | SOURCE_TD_COPY_OPTION
++#define SOURCE_TD_NONE 0x04
++
++/*typedef enum e_SourceTdOption
++{
++ e_SOURCE_TD_NONE = 0,
++ e_SOURCE_TD_ITSELF_OPTION = 1,
++ e_SOURCE_TD_COPY_OPTION = 2,
++ e_SOURCE_TD_ITSELF_AND_COPY_OPTION = e_SOURCE_TD_ITSELF_OPTION | e_SOURCE_TD_COPY_OPTION
++} e_SourceTdOption;
++*/
++
++typedef _Packed struct
++{
++ volatile uint32_t type;
++ volatile uint32_t frGroupPointer;
++ volatile uint32_t operationCode;
++ volatile uint32_t reserved;
++} _PackedType t_FrmReplicGroupSourceAd;
++
++typedef struct t_FmPcdFrmReplicMember
++{
++ void *p_MemberAd; /**< pointer to the member AD */
++ void *p_StatisticsAd;/**< pointer to the statistics AD of the member */
++ t_Handle h_Manip; /**< manip handle - need for free routines */
++ t_List node;
++} t_FmPcdFrmReplicMember;
++
++typedef struct t_FmPcdFrmReplicGroup
++{
++ t_Handle h_FmPcd;
++#ifdef UNDER_CONSTRUCTION_STATISTICS_SUPPORT
++ e_FmPcdCcStatsMode statisticsMode;
++#endif /* UNDER_CONSTRUCTION_STATISTICS_SUPPORT */
++
++ uint8_t maxNumOfEntries;/**< maximal number of members in the group */
++ uint8_t numOfEntries; /**< actual number of members in the group */
++ uint16_t owners; /**< how many keys share this frame replicator group */
++ void *p_SourceTd; /**< pointer to the frame replicator source table descriptor */
++ t_List membersList; /**< the members list - should reflect the order of the members as in the hw linked list*/
++ t_List availableMembersList;/**< list of all the available members in the group */
++ t_FmPcdLock *p_Lock;
++} t_FmPcdFrmReplicGroup;
++
++
++#endif /* __FM_REPLIC_H */
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fman_kg.c b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fman_kg.c
+new file mode 100644
+index 0000000..14a680e
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fman_kg.c
+@@ -0,0 +1,888 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++#include "fsl_fman_kg.h"
++
++/****************************************/
++/* static functions */
++/****************************************/
++
++
++static uint32_t build_ar_bind_scheme(uint8_t hwport_id, bool write)
++{
++ uint32_t rw;
++
++ rw = write ? (uint32_t)FM_KG_KGAR_WRITE : (uint32_t)FM_KG_KGAR_READ;
++
++ return (uint32_t)(FM_KG_KGAR_GO |
++ rw |
++ FM_PCD_KG_KGAR_SEL_PORT_ENTRY |
++ hwport_id |
++ FM_PCD_KG_KGAR_SEL_PORT_WSEL_SP);
++}
++
++static void clear_pe_all_scheme(struct fman_kg_regs *regs, uint8_t hwport_id)
++{
++ uint32_t ar;
++
++ fman_kg_write_sp(regs, 0xffffffff, 0);
++
++ ar = build_ar_bind_scheme(hwport_id, TRUE);
++ fman_kg_write_ar_wait(regs, ar);
++}
++
++static uint32_t build_ar_bind_cls_plan(uint8_t hwport_id, bool write)
++{
++ uint32_t rw;
++
++ rw = write ? (uint32_t)FM_KG_KGAR_WRITE : (uint32_t)FM_KG_KGAR_READ;
++
++ return (uint32_t)(FM_KG_KGAR_GO |
++ rw |
++ FM_PCD_KG_KGAR_SEL_PORT_ENTRY |
++ hwport_id |
++ FM_PCD_KG_KGAR_SEL_PORT_WSEL_CPP);
++}
++
++static void clear_pe_all_cls_plan(struct fman_kg_regs *regs, uint8_t hwport_id)
++{
++ uint32_t ar;
++
++ fman_kg_write_cpp(regs, 0);
++
++ ar = build_ar_bind_cls_plan(hwport_id, TRUE);
++ fman_kg_write_ar_wait(regs, ar);
++}
++
++static uint8_t get_gen_ht_code(enum fman_kg_gen_extract_src src,
++ bool no_validation,
++ uint8_t *offset)
++{
++ int code;
++
++ switch (src) {
++ case E_FMAN_KG_GEN_EXTRACT_ETH:
++ code = no_validation ? 0x73 : 0x3;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_ETYPE:
++ code = no_validation ? 0x77 : 0x7;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_SNAP:
++ code = no_validation ? 0x74 : 0x4;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_VLAN_TCI_1:
++ code = no_validation ? 0x75 : 0x5;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_VLAN_TCI_N:
++ code = no_validation ? 0x76 : 0x6;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_PPPoE:
++ code = no_validation ? 0x78 : 0x8;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_MPLS_1:
++ code = no_validation ? 0x79 : 0x9;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_MPLS_2:
++ code = no_validation ? FM_KG_SCH_GEN_HT_INVALID : 0x19;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_MPLS_3:
++ code = no_validation ? FM_KG_SCH_GEN_HT_INVALID : 0x29;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_MPLS_N:
++ code = no_validation ? 0x7a : 0xa;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_IPv4_1:
++ code = no_validation ? 0x7b : 0xb;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_IPv6_1:
++ code = no_validation ? 0x7b : 0x1b;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_IPv4_2:
++ code = no_validation ? 0x7c : 0xc;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_IPv6_2:
++ code = no_validation ? 0x7c : 0x1c;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_MINENCAP:
++ code = no_validation ? 0x7c : 0x2c;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_IP_PID:
++ code = no_validation ? 0x72 : 0x2;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_GRE:
++ code = no_validation ? 0x7d : 0xd;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_TCP:
++ code = no_validation ? 0x7e : 0xe;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_UDP:
++ code = no_validation ? 0x7e : 0x1e;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_SCTP:
++ code = no_validation ? 0x7e : 0x3e;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_DCCP:
++ code = no_validation ? 0x7e : 0x4e;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_IPSEC_AH:
++ code = no_validation ? 0x7e : 0x2e;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_IPSEC_ESP:
++ code = no_validation ? 0x7e : 0x6e;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_SHIM_1:
++ code = 0x70;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_SHIM_2:
++ code = 0x71;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_FROM_DFLT:
++ code = 0x10;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_FROM_FRAME_START:
++ code = 0x40;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_FROM_PARSE_RESULT:
++ code = 0x20;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_FROM_END_OF_PARSE:
++ code = 0x7f;
++ break;
++
++ case E_FMAN_KG_GEN_EXTRACT_FROM_FQID:
++ code = 0x20;
++ *offset += 0x20;
++ break;
++
++ default:
++ code = FM_KG_SCH_GEN_HT_INVALID;
++ }
++
++ return (uint8_t)code;
++}
++
++static uint32_t build_ar_scheme(uint8_t scheme,
++ uint8_t hwport_id,
++ bool update_counter,
++ bool write)
++{
++ uint32_t rw;
++
++ rw = (uint32_t)(write ? FM_KG_KGAR_WRITE : FM_KG_KGAR_READ);
++
++ return (uint32_t)(FM_KG_KGAR_GO |
++ rw |
++ FM_KG_KGAR_SEL_SCHEME_ENTRY |
++ hwport_id |
++ ((uint32_t)scheme << FM_KG_KGAR_NUM_SHIFT) |
++ (update_counter ? FM_KG_KGAR_SCM_WSEL_UPDATE_CNT : 0));
++}
++
++static uint32_t build_ar_cls_plan(uint8_t grp,
++ uint8_t entries_mask,
++ uint8_t hwport_id,
++ bool write)
++{
++ uint32_t rw;
++
++ rw = (uint32_t)(write ? FM_KG_KGAR_WRITE : FM_KG_KGAR_READ);
++
++ return (uint32_t)(FM_KG_KGAR_GO |
++ rw |
++ FM_PCD_KG_KGAR_SEL_CLS_PLAN_ENTRY |
++ hwport_id |
++ ((uint32_t)grp << FM_KG_KGAR_NUM_SHIFT) |
++ ((uint32_t)entries_mask << FM_KG_KGAR_WSEL_SHIFT));
++}
++
++int fman_kg_write_ar_wait(struct fman_kg_regs *regs, uint32_t fmkg_ar)
++{
++ iowrite32be(fmkg_ar, ®s->fmkg_ar);
++ /* Wait for GO to be idle and read error */
++ while ((fmkg_ar = ioread32be(®s->fmkg_ar)) & FM_KG_KGAR_GO) ;
++ if (fmkg_ar & FM_PCD_KG_KGAR_ERR)
++ return -EINVAL;
++ return 0;
++}
++
++void fman_kg_write_sp(struct fman_kg_regs *regs, uint32_t sp, bool add)
++{
++
++ struct fman_kg_pe_regs *kgpe_regs;
++ uint32_t tmp;
++
++ kgpe_regs = (struct fman_kg_pe_regs *)&(regs->fmkg_indirect[0]);
++ tmp = ioread32be(&kgpe_regs->fmkg_pe_sp);
++
++ if (add)
++ tmp |= sp;
++ else /* clear */
++ tmp &= ~sp;
++
++ iowrite32be(tmp, &kgpe_regs->fmkg_pe_sp);
++
++}
++
++void fman_kg_write_cpp(struct fman_kg_regs *regs, uint32_t cpp)
++{
++ struct fman_kg_pe_regs *kgpe_regs;
++
++ kgpe_regs = (struct fman_kg_pe_regs *)&(regs->fmkg_indirect[0]);
++
++ iowrite32be(cpp, &kgpe_regs->fmkg_pe_cpp);
++}
++
++void fman_kg_get_event(struct fman_kg_regs *regs,
++ uint32_t *event,
++ uint32_t *scheme_idx)
++{
++ uint32_t mask, force;
++
++ *event = ioread32be(®s->fmkg_eer);
++ mask = ioread32be(®s->fmkg_eeer);
++ *scheme_idx = ioread32be(®s->fmkg_seer);
++ *scheme_idx &= ioread32be(®s->fmkg_seeer);
++
++ *event &= mask;
++
++ /* clear the forced events */
++ force = ioread32be(®s->fmkg_feer);
++ if (force & *event)
++ iowrite32be(force & ~*event ,®s->fmkg_feer);
++
++ iowrite32be(*event, ®s->fmkg_eer);
++ iowrite32be(*scheme_idx, ®s->fmkg_seer);
++}
++
++
++void fman_kg_init(struct fman_kg_regs *regs,
++ uint32_t exceptions,
++ uint32_t dflt_nia)
++{
++ uint32_t tmp;
++ int i;
++
++ iowrite32be(FM_EX_KG_DOUBLE_ECC | FM_EX_KG_KEYSIZE_OVERFLOW,
++ ®s->fmkg_eer);
++
++ tmp = 0;
++ if (exceptions & FM_EX_KG_DOUBLE_ECC)
++ tmp |= FM_EX_KG_DOUBLE_ECC;
++
++ if (exceptions & FM_EX_KG_KEYSIZE_OVERFLOW)
++ tmp |= FM_EX_KG_KEYSIZE_OVERFLOW;
++
++ iowrite32be(tmp, ®s->fmkg_eeer);
++ iowrite32be(0, ®s->fmkg_fdor);
++ iowrite32be(0, ®s->fmkg_gdv0r);
++ iowrite32be(0, ®s->fmkg_gdv1r);
++ iowrite32be(dflt_nia, ®s->fmkg_gcr);
++
++ /* Clear binding between ports to schemes and classification plans
++ * so that all ports are not bound to any scheme/classification plan */
++ for (i = 0; i < FMAN_MAX_NUM_OF_HW_PORTS; i++) {
++ clear_pe_all_scheme(regs, (uint8_t)i);
++ clear_pe_all_cls_plan(regs, (uint8_t)i);
++ }
++}
++
++void fman_kg_enable_scheme_interrupts(struct fman_kg_regs *regs)
++{
++ /* enable and enable all scheme interrupts */
++ iowrite32be(0xFFFFFFFF, ®s->fmkg_seer);
++ iowrite32be(0xFFFFFFFF, ®s->fmkg_seeer);
++}
++
++void fman_kg_enable(struct fman_kg_regs *regs)
++{
++ iowrite32be(ioread32be(®s->fmkg_gcr) | FM_KG_KGGCR_EN,
++ ®s->fmkg_gcr);
++}
++
++void fman_kg_disable(struct fman_kg_regs *regs)
++{
++ iowrite32be(ioread32be(®s->fmkg_gcr) & ~FM_KG_KGGCR_EN,
++ ®s->fmkg_gcr);
++}
++
++void fman_kg_set_data_after_prs(struct fman_kg_regs *regs, uint8_t offset)
++{
++ iowrite32be(offset, ®s->fmkg_fdor);
++}
++
++void fman_kg_set_dflt_val(struct fman_kg_regs *regs,
++ uint8_t def_id,
++ uint32_t val)
++{
++ if(def_id == 0)
++ iowrite32be(val, ®s->fmkg_gdv0r);
++ else
++ iowrite32be(val, ®s->fmkg_gdv1r);
++}
++
++
++void fman_kg_set_exception(struct fman_kg_regs *regs,
++ uint32_t exception,
++ bool enable)
++{
++ uint32_t tmp;
++
++ tmp = ioread32be(®s->fmkg_eeer);
++
++ if (enable) {
++ tmp |= exception;
++ } else {
++ tmp &= ~exception;
++ }
++
++ iowrite32be(tmp, ®s->fmkg_eeer);
++}
++
++void fman_kg_get_exception(struct fman_kg_regs *regs,
++ uint32_t *events,
++ uint32_t *scheme_ids,
++ bool clear)
++{
++ uint32_t mask;
++
++ *events = ioread32be(®s->fmkg_eer);
++ mask = ioread32be(®s->fmkg_eeer);
++ *events &= mask;
++
++ *scheme_ids = 0;
++
++ if (*events & FM_EX_KG_KEYSIZE_OVERFLOW) {
++ *scheme_ids = ioread32be(®s->fmkg_seer);
++ mask = ioread32be(®s->fmkg_seeer);
++ *scheme_ids &= mask;
++ }
++
++ if (clear) {
++ iowrite32be(*scheme_ids, ®s->fmkg_seer);
++ iowrite32be(*events, ®s->fmkg_eer);
++ }
++}
++
++void fman_kg_get_capture(struct fman_kg_regs *regs,
++ struct fman_kg_ex_ecc_attr *ecc_attr,
++ bool clear)
++{
++ uint32_t tmp;
++
++ tmp = ioread32be(®s->fmkg_serc);
++
++ if (tmp & KG_FMKG_SERC_CAP) {
++ /* Captured data is valid */
++ ecc_attr->valid = TRUE;
++ ecc_attr->double_ecc =
++ (bool)((tmp & KG_FMKG_SERC_CET) ? TRUE : FALSE);
++ ecc_attr->single_ecc_count =
++ (uint8_t)((tmp & KG_FMKG_SERC_CNT_MSK) >>
++ KG_FMKG_SERC_CNT_SHIFT);
++ ecc_attr->addr = (uint16_t)(tmp & KG_FMKG_SERC_ADDR_MSK);
++
++ if (clear)
++ iowrite32be(KG_FMKG_SERC_CAP, ®s->fmkg_serc);
++ } else {
++ /* No ECC error is captured */
++ ecc_attr->valid = FALSE;
++ }
++}
++
++int fman_kg_build_scheme(struct fman_kg_scheme_params *params,
++ struct fman_kg_scheme_regs *scheme_regs)
++{
++ struct fman_kg_extract_params *extract_params;
++ struct fman_kg_gen_extract_params *gen_params;
++ uint32_t tmp_reg, i, select, mask, fqb;
++ uint8_t offset, shift, ht;
++
++ /* Zero out all registers so no need to care about unused ones */
++ memset(scheme_regs, 0, sizeof(struct fman_kg_scheme_regs));
++
++ /* Mode register */
++ tmp_reg = fm_kg_build_nia(params->next_engine,
++ params->next_engine_action);
++ if (tmp_reg == KG_NIA_INVALID) {
++ return -EINVAL;
++ }
++
++ if (params->next_engine == E_FMAN_PCD_PLCR) {
++ tmp_reg |= FMAN_KG_SCH_MODE_NIA_PLCR;
++ }
++ else if (params->next_engine == E_FMAN_PCD_CC) {
++ tmp_reg |= (uint32_t)params->cc_params.base_offset <<
++ FMAN_KG_SCH_MODE_CCOBASE_SHIFT;
++ }
++
++ tmp_reg |= FMAN_KG_SCH_MODE_EN;
++ scheme_regs->kgse_mode = tmp_reg;
++
++ /* Match vector */
++ scheme_regs->kgse_mv = params->match_vector;
++
++ extract_params = ¶ms->extract_params;
++
++ /* Scheme default values registers */
++ scheme_regs->kgse_dv0 = extract_params->def_scheme_0;
++ scheme_regs->kgse_dv1 = extract_params->def_scheme_1;
++
++ /* Extract Known Fields Command register */
++ scheme_regs->kgse_ekfc = extract_params->known_fields;
++
++ /* Entry Extract Known Default Value register */
++ tmp_reg = 0;
++ tmp_reg |= extract_params->known_fields_def.mac_addr <<
++ FMAN_KG_SCH_DEF_MAC_ADDR_SHIFT;
++ tmp_reg |= extract_params->known_fields_def.vlan_tci <<
++ FMAN_KG_SCH_DEF_VLAN_TCI_SHIFT;
++ tmp_reg |= extract_params->known_fields_def.etype <<
++ FMAN_KG_SCH_DEF_ETYPE_SHIFT;
++ tmp_reg |= extract_params->known_fields_def.ppp_sid <<
++ FMAN_KG_SCH_DEF_PPP_SID_SHIFT;
++ tmp_reg |= extract_params->known_fields_def.ppp_pid <<
++ FMAN_KG_SCH_DEF_PPP_PID_SHIFT;
++ tmp_reg |= extract_params->known_fields_def.mpls <<
++ FMAN_KG_SCH_DEF_MPLS_SHIFT;
++ tmp_reg |= extract_params->known_fields_def.ip_addr <<
++ FMAN_KG_SCH_DEF_IP_ADDR_SHIFT;
++ tmp_reg |= extract_params->known_fields_def.ptype <<
++ FMAN_KG_SCH_DEF_PTYPE_SHIFT;
++ tmp_reg |= extract_params->known_fields_def.ip_tos_tc <<
++ FMAN_KG_SCH_DEF_IP_TOS_TC_SHIFT;
++ tmp_reg |= extract_params->known_fields_def.ipv6_fl <<
++ FMAN_KG_SCH_DEF_IPv6_FL_SHIFT;
++ tmp_reg |= extract_params->known_fields_def.ipsec_spi <<
++ FMAN_KG_SCH_DEF_IPSEC_SPI_SHIFT;
++ tmp_reg |= extract_params->known_fields_def.l4_port <<
++ FMAN_KG_SCH_DEF_L4_PORT_SHIFT;
++ tmp_reg |= extract_params->known_fields_def.tcp_flg <<
++ FMAN_KG_SCH_DEF_TCP_FLG_SHIFT;
++
++ scheme_regs->kgse_ekdv = tmp_reg;
++
++ /* Generic extract registers */
++ if (extract_params->gen_extract_num > FM_KG_NUM_OF_GENERIC_REGS) {
++ return -EINVAL;
++ }
++
++ for (i = 0; i < extract_params->gen_extract_num; i++) {
++ gen_params = extract_params->gen_extract + i;
++
++ tmp_reg = FMAN_KG_SCH_GEN_VALID;
++ tmp_reg |= (uint32_t)gen_params->def_val <<
++ FMAN_KG_SCH_GEN_DEF_SHIFT;
++
++ if (gen_params->type == E_FMAN_KG_HASH_EXTRACT) {
++ if ((gen_params->extract > FMAN_KG_SCH_GEN_SIZE_MAX) ||
++ (gen_params->extract == 0)) {
++ return -EINVAL;
++ }
++ } else {
++ tmp_reg |= FMAN_KG_SCH_GEN_OR;
++ }
++
++ tmp_reg |= (uint32_t)gen_params->extract <<
++ FMAN_KG_SCH_GEN_SIZE_SHIFT;
++ tmp_reg |= (uint32_t)gen_params->mask <<
++ FMAN_KG_SCH_GEN_MASK_SHIFT;
++
++ offset = gen_params->offset;
++ ht = get_gen_ht_code(gen_params->src,
++ gen_params->no_validation,
++ &offset);
++ tmp_reg |= (uint32_t)ht << FMAN_KG_SCH_GEN_HT_SHIFT;
++ tmp_reg |= offset;
++
++ scheme_regs->kgse_gec[i] = tmp_reg;
++ }
++
++ /* Masks registers */
++ if (extract_params->masks_num > FM_KG_EXTRACT_MASKS_NUM) {
++ return -EINVAL;
++ }
++
++ select = 0;
++ mask = 0;
++ fqb = 0;
++ for (i = 0; i < extract_params->masks_num; i++) {
++ /* MCSx fields */
++ KG_GET_MASK_SEL_SHIFT(shift, i);
++ if (extract_params->masks[i].is_known) {
++ /* Mask known field */
++ select |= extract_params->masks[i].field_or_gen_idx <<
++ shift;
++ } else {
++ /* Mask generic extract */
++ select |= (extract_params->masks[i].field_or_gen_idx +
++ FM_KG_MASK_SEL_GEN_BASE) << shift;
++ }
++
++ /* MOx fields - spread between se_bmch and se_fqb registers */
++ KG_GET_MASK_OFFSET_SHIFT(shift, i);
++ if (i < 2) {
++ select |= (uint32_t)extract_params->masks[i].offset <<
++ shift;
++ } else {
++ fqb |= (uint32_t)extract_params->masks[i].offset <<
++ shift;
++ }
++
++ /* BMx fields */
++ KG_GET_MASK_SHIFT(shift, i);
++ mask |= (uint32_t)extract_params->masks[i].mask << shift;
++ }
++
++ /* Finish with rest of BMx fileds -
++ * don't mask bits for unused masks by setting
++ * corresponding BMx field = 0xFF */
++ for (i = extract_params->masks_num; i < FM_KG_EXTRACT_MASKS_NUM; i++) {
++ KG_GET_MASK_SHIFT(shift, i);
++ mask |= 0xFF << shift;
++ }
++
++ scheme_regs->kgse_bmch = select;
++ scheme_regs->kgse_bmcl = mask;
++
++ /* Finish with FQB register initialization.
++ * Check fqid is 24-bit value. */
++ if (params->base_fqid & ~0x00FFFFFF) {
++ return -EINVAL;
++ }
++
++ fqb |= params->base_fqid;
++ scheme_regs->kgse_fqb = fqb;
++
++ /* Hash Configuration register */
++ tmp_reg = 0;
++ if (params->hash_params.use_hash) {
++ /* Check hash mask is 24-bit value */
++ if (params->hash_params.mask & ~0x00FFFFFF) {
++ return -EINVAL;
++ }
++
++ /* Hash function produces 64-bit value, 24 bits of that
++ * are used to generate fq_id and policer profile.
++ * Thus, maximal shift is 40 bits to allow 24 bits out of 64.
++ */
++ if (params->hash_params.shift_r > FMAN_KG_SCH_HASH_HSHIFT_MAX) {
++ return -EINVAL;
++ }
++
++ tmp_reg |= params->hash_params.mask;
++ tmp_reg |= (uint32_t)params->hash_params.shift_r <<
++ FMAN_KG_SCH_HASH_HSHIFT_SHIFT;
++
++ if (params->hash_params.sym) {
++ tmp_reg |= FMAN_KG_SCH_HASH_SYM;
++ }
++
++ }
++
++ if (params->bypass_fqid_gen) {
++ tmp_reg |= FMAN_KG_SCH_HASH_NO_FQID_GEN;
++ }
++
++ scheme_regs->kgse_hc = tmp_reg;
++
++ /* Policer Profile register */
++ if (params->policer_params.bypass_pp_gen) {
++ tmp_reg = FMAN_KG_SCH_PP_NO_GEN;
++ } else {
++ /* Lower 8 bits of 24-bits extracted from hash result
++ * are used for policer profile generation.
++ * That leaves maximum shift value = 23. */
++ if (params->policer_params.shift > FMAN_KG_SCH_PP_SHIFT_MAX) {
++ return -EINVAL;
++ }
++
++ tmp_reg = params->policer_params.base;
++ tmp_reg |= ((uint32_t)params->policer_params.shift <<
++ FMAN_KG_SCH_PP_SH_SHIFT) &
++ FMAN_KG_SCH_PP_SH_MASK;
++ tmp_reg |= ((uint32_t)params->policer_params.shift <<
++ FMAN_KG_SCH_PP_SL_SHIFT) &
++ FMAN_KG_SCH_PP_SL_MASK;
++ tmp_reg |= (uint32_t)params->policer_params.mask <<
++ FMAN_KG_SCH_PP_MASK_SHIFT;
++ }
++
++ scheme_regs->kgse_ppc = tmp_reg;
++
++ /* Coarse Classification Bit Select register */
++ if (params->next_engine == E_FMAN_PCD_CC) {
++ scheme_regs->kgse_ccbs = params->cc_params.qlcv_bits_sel;
++ }
++
++ /* Packets Counter register */
++ if (params->update_counter) {
++ scheme_regs->kgse_spc = params->counter_value;
++ }
++
++ return 0;
++}
++
++int fman_kg_write_scheme(struct fman_kg_regs *regs,
++ uint8_t scheme_id,
++ uint8_t hwport_id,
++ struct fman_kg_scheme_regs *scheme_regs,
++ bool update_counter)
++{
++ struct fman_kg_scheme_regs *kgse_regs;
++ uint32_t tmp_reg;
++ int err, i;
++
++ /* Write indirect scheme registers */
++ kgse_regs = (struct fman_kg_scheme_regs *)&(regs->fmkg_indirect[0]);
++
++ iowrite32be(scheme_regs->kgse_mode, &kgse_regs->kgse_mode);
++ iowrite32be(scheme_regs->kgse_ekfc, &kgse_regs->kgse_ekfc);
++ iowrite32be(scheme_regs->kgse_ekdv, &kgse_regs->kgse_ekdv);
++ iowrite32be(scheme_regs->kgse_bmch, &kgse_regs->kgse_bmch);
++ iowrite32be(scheme_regs->kgse_bmcl, &kgse_regs->kgse_bmcl);
++ iowrite32be(scheme_regs->kgse_fqb, &kgse_regs->kgse_fqb);
++ iowrite32be(scheme_regs->kgse_hc, &kgse_regs->kgse_hc);
++ iowrite32be(scheme_regs->kgse_ppc, &kgse_regs->kgse_ppc);
++ iowrite32be(scheme_regs->kgse_spc, &kgse_regs->kgse_spc);
++ iowrite32be(scheme_regs->kgse_dv0, &kgse_regs->kgse_dv0);
++ iowrite32be(scheme_regs->kgse_dv1, &kgse_regs->kgse_dv1);
++ iowrite32be(scheme_regs->kgse_ccbs, &kgse_regs->kgse_ccbs);
++ iowrite32be(scheme_regs->kgse_mv, &kgse_regs->kgse_mv);
++
++ for (i = 0 ; i < FM_KG_NUM_OF_GENERIC_REGS ; i++)
++ iowrite32be(scheme_regs->kgse_gec[i], &kgse_regs->kgse_gec[i]);
++
++ /* Write AR (Action register) */
++ tmp_reg = build_ar_scheme(scheme_id, hwport_id, update_counter, TRUE);
++ err = fman_kg_write_ar_wait(regs, tmp_reg);
++ return err;
++}
++
++int fman_kg_delete_scheme(struct fman_kg_regs *regs,
++ uint8_t scheme_id,
++ uint8_t hwport_id)
++{
++ struct fman_kg_scheme_regs *kgse_regs;
++ uint32_t tmp_reg;
++ int err, i;
++
++ kgse_regs = (struct fman_kg_scheme_regs *)&(regs->fmkg_indirect[0]);
++
++ /* Clear all registers including enable bit in mode register */
++ for (i = 0; i < (sizeof(struct fman_kg_scheme_regs)) / 4; ++i) {
++ iowrite32be(0, ((uint32_t *)kgse_regs + i));
++ }
++
++ /* Write AR (Action register) */
++ tmp_reg = build_ar_scheme(scheme_id, hwport_id, FALSE, TRUE);
++ err = fman_kg_write_ar_wait(regs, tmp_reg);
++ return err;
++}
++
++int fman_kg_get_scheme_counter(struct fman_kg_regs *regs,
++ uint8_t scheme_id,
++ uint8_t hwport_id,
++ uint32_t *counter)
++{
++ struct fman_kg_scheme_regs *kgse_regs;
++ uint32_t tmp_reg;
++ int err;
++
++ kgse_regs = (struct fman_kg_scheme_regs *)&(regs->fmkg_indirect[0]);
++
++ tmp_reg = build_ar_scheme(scheme_id, hwport_id, TRUE, FALSE);
++ err = fman_kg_write_ar_wait(regs, tmp_reg);
++
++ if (err != 0)
++ return err;
++
++ *counter = ioread32be(&kgse_regs->kgse_spc);
++
++ return 0;
++}
++
++int fman_kg_set_scheme_counter(struct fman_kg_regs *regs,
++ uint8_t scheme_id,
++ uint8_t hwport_id,
++ uint32_t counter)
++{
++ struct fman_kg_scheme_regs *kgse_regs;
++ uint32_t tmp_reg;
++ int err;
++
++ kgse_regs = (struct fman_kg_scheme_regs *)&(regs->fmkg_indirect[0]);
++
++ tmp_reg = build_ar_scheme(scheme_id, hwport_id, TRUE, FALSE);
++
++ err = fman_kg_write_ar_wait(regs, tmp_reg);
++ if (err != 0)
++ return err;
++
++ /* Keygen indirect access memory contains all scheme_id registers
++ * by now. Change only counter value. */
++ iowrite32be(counter, &kgse_regs->kgse_spc);
++
++ /* Write back scheme registers */
++ tmp_reg = build_ar_scheme(scheme_id, hwport_id, TRUE, TRUE);
++ err = fman_kg_write_ar_wait(regs, tmp_reg);
++
++ return err;
++}
++
++uint32_t fman_kg_get_schemes_total_counter(struct fman_kg_regs *regs)
++{
++ return ioread32be(®s->fmkg_tpc);
++}
++
++int fman_kg_build_cls_plan(struct fman_kg_cls_plan_params *params,
++ struct fman_kg_cp_regs *cls_plan_regs)
++{
++ uint8_t entries_set, entry_bit;
++ int i;
++
++ /* Zero out all group's register */
++ memset(cls_plan_regs, 0, sizeof(struct fman_kg_cp_regs));
++
++ /* Go over all classification entries in params->entries_mask and
++ * configure the corresponding cpe register */
++ entries_set = params->entries_mask;
++ for (i = 0; entries_set; i++) {
++ entry_bit = (uint8_t)(0x80 >> i);
++ if ((entry_bit & entries_set) == 0)
++ continue;
++ entries_set ^= entry_bit;
++ cls_plan_regs->kgcpe[i] = params->mask_vector[i];
++ }
++
++ return 0;
++}
++
++int fman_kg_write_cls_plan(struct fman_kg_regs *regs,
++ uint8_t grp_id,
++ uint8_t entries_mask,
++ uint8_t hwport_id,
++ struct fman_kg_cp_regs *cls_plan_regs)
++{
++ struct fman_kg_cp_regs *kgcpe_regs;
++ uint32_t tmp_reg;
++ int i, err;
++
++ /* Check group index is valid and the group isn't empty */
++ if (grp_id >= FM_KG_CLS_PLAN_GRPS_NUM)
++ return -EINVAL;
++
++ /* Write indirect classification plan registers */
++ kgcpe_regs = (struct fman_kg_cp_regs *)&(regs->fmkg_indirect[0]);
++
++ for (i = 0; i < FM_KG_NUM_CLS_PLAN_ENTR; i++) {
++ iowrite32be(cls_plan_regs->kgcpe[i], &kgcpe_regs->kgcpe[i]);
++ }
++
++ tmp_reg = build_ar_cls_plan(grp_id, entries_mask, hwport_id, TRUE);
++ err = fman_kg_write_ar_wait(regs, tmp_reg);
++ return err;
++}
++
++int fman_kg_write_bind_schemes(struct fman_kg_regs *regs,
++ uint8_t hwport_id,
++ uint32_t schemes)
++{
++ struct fman_kg_pe_regs *kg_pe_regs;
++ uint32_t tmp_reg;
++ int err;
++
++ kg_pe_regs = (struct fman_kg_pe_regs *)&(regs->fmkg_indirect[0]);
++
++ iowrite32be(schemes, &kg_pe_regs->fmkg_pe_sp);
++
++ tmp_reg = build_ar_bind_scheme(hwport_id, TRUE);
++ err = fman_kg_write_ar_wait(regs, tmp_reg);
++ return err;
++}
++
++int fman_kg_build_bind_cls_plans(uint8_t grp_base,
++ uint8_t grp_mask,
++ uint32_t *bind_cls_plans)
++{
++ /* Check grp_base and grp_mask are 5-bits values */
++ if ((grp_base & ~0x0000001F) || (grp_mask & !0x0000001F))
++ return -EINVAL;
++
++ *bind_cls_plans = (uint32_t) ((grp_mask << FMAN_KG_PE_CPP_MASK_SHIFT) | grp_base);
++ return 0;
++}
++
++
++int fman_kg_write_bind_cls_plans(struct fman_kg_regs *regs,
++ uint8_t hwport_id,
++ uint32_t bind_cls_plans)
++{
++ struct fman_kg_pe_regs *kg_pe_regs;
++ uint32_t tmp_reg;
++ int err;
++
++ kg_pe_regs = (struct fman_kg_pe_regs *)&(regs->fmkg_indirect[0]);
++
++ iowrite32be(bind_cls_plans, &kg_pe_regs->fmkg_pe_cpp);
++
++ tmp_reg = build_ar_bind_cls_plan(hwport_id, TRUE);
++ err = fman_kg_write_ar_wait(regs, tmp_reg);
++ return err;
++}
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fman_prs.c b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fman_prs.c
+new file mode 100644
+index 0000000..caa1d28
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/Pcd/fman_prs.c
+@@ -0,0 +1,124 @@
++/*
++ * Copyright 2012 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.
++ */
++
++#include "fsl_fman_prs.h"
++
++uint32_t fman_prs_get_err_event(struct fman_prs_regs *regs, uint32_t ev_mask)
++{
++ return ioread32be(®s->fmpr_perr) & ev_mask;
++}
++
++uint32_t fman_prs_get_err_ev_mask(struct fman_prs_regs *regs)
++{
++ return ioread32be(®s->fmpr_perer);
++}
++
++void fman_prs_ack_err_event(struct fman_prs_regs *regs, uint32_t event)
++{
++ iowrite32be(event, ®s->fmpr_perr);
++}
++
++uint32_t fman_prs_get_expt_event(struct fman_prs_regs *regs, uint32_t ev_mask)
++{
++ return ioread32be(®s->fmpr_pevr) & ev_mask;
++}
++
++uint32_t fman_prs_get_expt_ev_mask(struct fman_prs_regs *regs)
++{
++ return ioread32be(®s->fmpr_pever);
++}
++
++void fman_prs_ack_expt_event(struct fman_prs_regs *regs, uint32_t event)
++{
++ iowrite32be(event, ®s->fmpr_pevr);
++}
++
++void fman_prs_defconfig(struct fman_prs_cfg *cfg)
++{
++ cfg->port_id_stat = 0;
++ cfg->max_prs_cyc_lim = DEFAULT_MAX_PRS_CYC_LIM;
++ cfg->prs_exceptions = 0x03000000;
++}
++
++int fman_prs_init(struct fman_prs_regs *regs, struct fman_prs_cfg *cfg)
++{
++ uint32_t tmp;
++
++ iowrite32be(cfg->max_prs_cyc_lim, ®s->fmpr_rpclim);
++ iowrite32be((FM_PCD_PRS_SINGLE_ECC | FM_PCD_PRS_PORT_IDLE_STS),
++ ®s->fmpr_pevr);
++
++ if (cfg->prs_exceptions & FM_PCD_EX_PRS_SINGLE_ECC)
++ iowrite32be(FM_PCD_PRS_SINGLE_ECC, ®s->fmpr_pever);
++ else
++ iowrite32be(0, ®s->fmpr_pever);
++
++ iowrite32be(FM_PCD_PRS_DOUBLE_ECC, ®s->fmpr_perr);
++
++ tmp = 0;
++ if (cfg->prs_exceptions & FM_PCD_EX_PRS_DOUBLE_ECC)
++ tmp |= FM_PCD_PRS_DOUBLE_ECC;
++ iowrite32be(tmp, ®s->fmpr_perer);
++
++ iowrite32be(cfg->port_id_stat, ®s->fmpr_ppsc);
++
++ return 0;
++}
++
++void fman_prs_enable(struct fman_prs_regs *regs)
++{
++ uint32_t tmp;
++
++ tmp = ioread32be(®s->fmpr_rpimac) | FM_PCD_PRS_RPIMAC_EN;
++ iowrite32be(tmp, ®s->fmpr_rpimac);
++}
++
++void fman_prs_disable(struct fman_prs_regs *regs)
++{
++ uint32_t tmp;
++
++ tmp = ioread32be(®s->fmpr_rpimac) & ~FM_PCD_PRS_RPIMAC_EN;
++ iowrite32be(tmp, ®s->fmpr_rpimac);
++}
++
++void fman_prs_set_stst_port_msk(struct fman_prs_regs *regs, uint32_t pid_msk)
++{
++ iowrite32be(pid_msk, ®s->fmpr_ppsc);
++}
++
++void fman_prs_set_stst(struct fman_prs_regs *regs, bool enable)
++{
++ if (enable)
++ iowrite32be(FM_PCD_PRS_PPSC_ALL_PORTS, ®s->fmpr_ppsc);
++ else
++ iowrite32be(0, ®s->fmpr_ppsc);
++}
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/Port/Makefile b/drivers/net/dpa/NetCommSw/Peripherals/FM/Port/Makefile
+new file mode 100644
+index 0000000..9acf110
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/Port/Makefile
+@@ -0,0 +1,15 @@
++#
++# Makefile for the Freescale Ethernet controllers
++#
++EXTRA_CFLAGS += -DVERSION=\"\"
++#
++#Include netcomm SW specific definitions
++include $(srctree)/drivers/net/dpa/NetCommSw/ncsw_config.mk
++
++NCSW_FM_INC = $(srctree)/drivers/net/dpa/NetCommSw/Peripherals/FM/inc
++
++EXTRA_CFLAGS += -I$(NCSW_FM_INC)
++
++obj-y += fsl-ncsw-Pcd.o
++
++fsl-ncsw-Pcd-objs := fm_port.o fm_port_im.o
+diff --git a/drivers/net/dpa/NetCommSw/Peripherals/FM/Port/fm_port.c b/drivers/net/dpa/NetCommSw/Peripherals/FM/Port/fm_port.c
+new file mode 100644
+index 0000000..b7cd2da
+--- /dev/null
++++ b/drivers/net/dpa/NetCommSw/Peripherals/FM/Port/fm_port.c
+@@ -0,0 +1,5725 @@
++/*
++ * Copyright 2008-2012 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.
++ */
++
++
++/******************************************************************************
++ @File fm_port.c
++
++ @Description FM driver routines implementation.
++*//***************************************************************************/
++#include "error_ext.h"
++#include "std_ext.h"
++#include "string_ext.h"
++#include "sprint_ext.h"
++#include "debug_ext.h"
++#include "fm_muram_ext.h"
++
++#include "fm_port.h"
++
++/****************************************/
++/* static functions */
++/****************************************/
++
++static t_Error CheckInitParameters(t_FmPort *p_FmPort)
++{
++ t_FmPortDriverParam *p_Params = p_FmPort->p_FmPortDriverParam;
++ t_Error ans = E_OK;
++ uint32_t unusedMask;
++
++ if (p_FmPort->imEn)
++ {
++ if (p_FmPort->portType == e_FM_PORT_TYPE_RX_10G)
++ if (p_FmPort->fifoDeqPipelineDepth > 2)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("fifoDeqPipelineDepth for IM 10G can't be larger than 2"));
++
++ if ((ans = FmPortImCheckInitParameters(p_FmPort)) != E_OK)
++ return ERROR_CODE(ans);
++ }
++ else
++ {
++ /****************************************/
++ /* Rx only */
++ /****************************************/
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_RX) || (p_FmPort->portType == e_FM_PORT_TYPE_RX_10G))
++ {
++ /* external buffer pools */
++ if (!p_Params->extBufPools.numOfPoolsUsed)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("extBufPools.numOfPoolsUsed=0. At least one buffer pool must be defined"));
++
++ if (FmSpCheckBufPoolsParams(&p_Params->extBufPools, p_Params->p_BackupBmPools, &p_Params->bufPoolDepletion)!= E_OK)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, NO_MSG);
++
++ /* Check that part of IC that needs copying is small enough to enter start margin */
++ if (p_Params->intContext.size && (p_Params->intContext.size + p_Params->intContext.extBufOffset > p_Params->bufMargins.startMargins))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("intContext.size is larger than start margins"));
++
++ if (p_Params->liodnOffset & ~FM_LIODN_OFFSET_MASK)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("liodnOffset is larger than %d", FM_LIODN_OFFSET_MASK+1));
++
++#ifdef FM_NO_BACKUP_POOLS
++ if ((p_FmPort->fmRevInfo.majorRev != 4) && (p_FmPort->fmRevInfo.majorRev < 6))
++ if (p_FmPort->p_FmPortDriverParam->p_BackupBmPools)
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("BackupBmPools"));
++#endif /* FM_NO_BACKUP_POOLS */
++ }
++
++ /****************************************/
++ /* Non Rx ports */
++ /****************************************/
++ else
++ {
++ if (p_Params->deqSubPortal >= FM_MAX_NUM_OF_SUB_PORTALS)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, (" deqSubPortal has to be in the range of 0 - %d", FM_MAX_NUM_OF_SUB_PORTALS));
++
++ /* to protect HW internal-context from overwrite */
++ if ((p_Params->intContext.size) && (p_Params->intContext.intContextOffset < MIN_TX_INT_OFFSET))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("non-Rx intContext.intContextOffset can't be smaller than %d", MIN_TX_INT_OFFSET));
++
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_TX) || (p_FmPort->portType == e_FM_PORT_TYPE_TX_10G)
++ /* in O/H DEFAULT_notSupported indicates that it is not suppported and should not be checked */
++ || (p_FmPort->fifoDeqPipelineDepth != DEFAULT_notSupported))
++ {
++ /* Check that not larger than 8 */
++ if ((!p_FmPort->fifoDeqPipelineDepth) ||( p_FmPort->fifoDeqPipelineDepth > MAX_FIFO_PIPELINE_DEPTH))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("fifoDeqPipelineDepth can't be larger than %d", MAX_FIFO_PIPELINE_DEPTH));
++ }
++ }
++
++ /****************************************/
++ /* Rx Or Offline Parsing */
++ /****************************************/
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_RX) || (p_FmPort->portType == e_FM_PORT_TYPE_RX_10G) || (p_FmPort->portType == e_FM_PORT_TYPE_OH_OFFLINE_PARSING))
++ {
++
++ if (!p_Params->dfltFqid)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dfltFqid must be between 1 and 2^24-1"));
++#if defined(FM_CAPWAP_SUPPORT) && defined(FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004)
++ if (p_FmPort->p_FmPortDriverParam->bufferPrefixContent.manipExtraSpace % 16)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("bufferPrefixContent.manipExtraSpace has to be devidable by 16"));
++#endif /* defined(FM_CAPWAP_SUPPORT) && ... */
++ }
++
++ /****************************************/
++ /* All ports */
++ /****************************************/
++ /* common BMI registers values */
++ /* Check that Queue Id is not larger than 2^24, and is not 0 */
++ if ((p_Params->errFqid & ~0x00FFFFFF) || !p_Params->errFqid)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("errFqid must be between 1 and 2^24-1"));
++ if (p_Params->dfltFqid & ~0x00FFFFFF)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dfltFqid must be between 1 and 2^24-1"));
++ }
++
++ /****************************************/
++ /* Rx only */
++ /****************************************/
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_RX) || (p_FmPort->portType == e_FM_PORT_TYPE_RX_10G))
++ {
++ /* Check that divisible by 256 and not larger than 256 */
++ if (p_Params->rxFifoPriElevationLevel % BMI_FIFO_UNITS)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("rxFifoPriElevationLevel has to be divisible by %d", BMI_FIFO_UNITS));
++ if (!p_Params->rxFifoPriElevationLevel || (p_Params->rxFifoPriElevationLevel > BMI_MAX_FIFO_SIZE))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("rxFifoPriElevationLevel has to be in the range of 256 - %d", BMI_MAX_FIFO_SIZE));
++ if (p_Params->rxFifoThreshold % BMI_FIFO_UNITS)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("rxFifoThreshold has to be divisible by %d", BMI_FIFO_UNITS));
++ if (!p_Params->rxFifoThreshold ||(p_Params->rxFifoThreshold > BMI_MAX_FIFO_SIZE))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("rxFifoThreshold has to be in the range of 256 - %d", BMI_MAX_FIFO_SIZE));
++
++ /* Check that not larger than 16 */
++ if (p_Params->cutBytesFromEnd > FRAME_END_DATA_SIZE)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("cutBytesFromEnd can't be larger than %d", FRAME_END_DATA_SIZE));
++
++ if (FmSpCheckBufMargins(&p_Params->bufMargins)!= E_OK)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, NO_MSG);
++
++ /* extra FIFO size (allowed only to Rx ports) */
++ if (p_Params->setSizeOfFifo && (p_FmPort->fifoBufs.extra % BMI_FIFO_UNITS))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("fifoBufs.extra has to be divisible by %d", BMI_FIFO_UNITS));
++
++ if (p_Params->bufPoolDepletion.poolsGrpModeEnable &&
++ !p_Params->bufPoolDepletion.numOfPools)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("bufPoolDepletion.numOfPools can not be 0 when poolsGrpModeEnable=TRUE"));
++#ifdef FM_CSI_CFED_LIMIT
++ if (p_FmPort->fmRevInfo.majorRev == 4)
++ {
++ /* Check that not larger than 16 */
++ if (p_Params->cutBytesFromEnd + p_Params->cheksumLastBytesIgnore > FRAME_END_DATA_SIZE)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("cheksumLastBytesIgnore + cutBytesFromEnd can't be larger than %d", FRAME_END_DATA_SIZE));
++ }
++#endif /* FM_CSI_CFED_LIMIT */
++ }
++
++ /****************************************/
++ /* Non Rx ports */
++ /****************************************/
++ /* extra FIFO size (allowed only to Rx ports) */
++ else if (p_FmPort->fifoBufs.extra)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, (" No fifoBufs.extra for non Rx ports"));
++
++
++ /****************************************/
++ /* Tx only */
++ /****************************************/
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_TX) ||
++ (p_FmPort->portType == e_FM_PORT_TYPE_TX_10G))
++ {
++ /* Check that divisible by 256 and not larger than 256 */
++ if (p_Params->txFifoMinFillLevel % BMI_FIFO_UNITS)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("txFifoMinFillLevel has to be divisible by %d", BMI_FIFO_UNITS));
++ if (p_Params->txFifoMinFillLevel > (BMI_MAX_FIFO_SIZE - 256))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("txFifoMinFillLevel has to be in the range of 0 - %d", BMI_MAX_FIFO_SIZE));
++ if (p_Params->txFifoLowComfLevel % BMI_FIFO_UNITS)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("txFifoLowComfLevel has to be divisible by %d", BMI_FIFO_UNITS));
++ if (!p_Params->txFifoLowComfLevel || (p_Params->txFifoLowComfLevel > BMI_MAX_FIFO_SIZE))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("txFifoLowComfLevel has to be in the range of 256 - %d", BMI_MAX_FIFO_SIZE));
++
++ if (p_FmPort->portType == e_FM_PORT_TYPE_TX)
++ if (p_FmPort->fifoDeqPipelineDepth > 2)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("fifoDeqPipelineDepth for 1G can't be larger than 2"));
++ }
++ /****************************************/
++ /* Non Tx Ports */
++ /****************************************/
++ /* If discard override was selected , no frames may be discarded. */
++ else if (p_Params->frmDiscardOverride && p_Params->errorsToDiscard)
++ RETURN_ERROR(MAJOR, E_CONFLICT,
++ ("errorsToDiscard is not empty, but frmDiscardOverride selected (all discarded frames to be enqueued to error queue)."));
++
++ /****************************************/
++ /* Rx and Offline parsing */
++ /****************************************/
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_RX) ||
++ (p_FmPort->portType == e_FM_PORT_TYPE_RX_10G) ||
++ (p_FmPort->portType == e_FM_PORT_TYPE_OH_OFFLINE_PARSING))
++ {
++ if (p_FmPort->portType == e_FM_PORT_TYPE_OH_OFFLINE_PARSING)
++ unusedMask = BMI_STATUS_OP_MASK_UNUSED;
++ else
++ unusedMask = BMI_STATUS_RX_MASK_UNUSED;
++
++ /* Check that no common bits with BMI_STATUS_MASK_UNUSED */
++ if (p_Params->errorsToDiscard & unusedMask)
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, ("errorsToDiscard contains undefined bits"));
++ }
++
++ /****************************************/
++ /* Offline Ports */
++ /****************************************/
++#ifdef FM_OP_OPEN_DMA_MIN_LIMIT
++ if ((p_FmPort->fmRevInfo.majorRev >= 6) &&
++ (p_FmPort->portType == e_FM_PORT_TYPE_OH_OFFLINE_PARSING) &&
++ p_Params->setNumOfOpenDmas &&
++ (p_FmPort->openDmas.num < MIN_NUM_OF_OP_DMAS))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("For Offline port, openDmas.num can't be smaller than %d", MIN_NUM_OF_OP_DMAS));
++#endif /* FM_OP_OPEN_DMA_MIN_LIMIT */
++
++ /****************************************/
++ /* Offline & HC Ports */
++ /****************************************/
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_OH_OFFLINE_PARSING) ||
++ (p_FmPort->portType == e_FM_PORT_TYPE_OH_HOST_COMMAND))
++ {
++#ifndef FM_FRAME_END_PARAMS_FOR_OP
++ if ((p_FmPort->fmRevInfo.majorRev < 6) &&
++ (p_FmPort->p_FmPortDriverParam->cheksumLastBytesIgnore != DEFAULT_notSupported))
++ /* this is an indication that user called config for this mode which is not supported in this integration */
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("cheksumLastBytesIgnore is available for Rx & Tx ports only"));
++#endif /* !FM_FRAME_END_PARAMS_FOR_OP */
++
++#ifndef FM_DEQ_PIPELINE_PARAMS_FOR_OP
++ if ((!((p_FmPort->fmRevInfo.majorRev == 4) ||
++ (p_FmPort->fmRevInfo.majorRev >= 6))) &&
++ (p_FmPort->fifoDeqPipelineDepth != DEFAULT_notSupported))
++ /* this is an indication that user called config for this mode which is not supported in this integration */
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("fifoDeqPipelineDepth is available for Tx ports only"));
++#endif /* !FM_DEQ_PIPELINE_PARAMS_FOR_OP */
++ }
++ /****************************************/
++ /* All ports */
++ /****************************************/
++
++ /* Check that not larger than 16 */
++ if ((p_Params->cheksumLastBytesIgnore > FRAME_END_DATA_SIZE) && ((p_Params->cheksumLastBytesIgnore != DEFAULT_notSupported)))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("cheksumLastBytesIgnore can't be larger than %d", FRAME_END_DATA_SIZE));
++
++ if (FmSpCheckIntContextParams(&p_Params->intContext)!= E_OK)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, NO_MSG);
++
++ /* common BMI registers values */
++ if (p_Params->setNumOfTasks && ((!p_FmPort->tasks.num) || (p_FmPort->tasks.num > MAX_NUM_OF_TASKS)))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("tasks.num can't be larger than %d", MAX_NUM_OF_TASKS));
++ if (p_Params->setNumOfTasks && (p_FmPort->tasks.extra > MAX_NUM_OF_EXTRA_TASKS))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("tasks.extra can't be larger than %d", MAX_NUM_OF_EXTRA_TASKS));
++ if (p_Params->setNumOfOpenDmas && ((!p_FmPort->openDmas.num) || (p_FmPort->openDmas.num > MAX_NUM_OF_DMAS)))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("openDmas.num can't be larger than %d", MAX_NUM_OF_DMAS));
++ if (p_Params->setNumOfOpenDmas && (p_FmPort->openDmas.extra > MAX_NUM_OF_EXTRA_DMAS))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("openDmas.extra can't be larger than %d", MAX_NUM_OF_EXTRA_DMAS));
++ if (p_Params->setSizeOfFifo && (!p_FmPort->fifoBufs.num || (p_FmPort->fifoBufs.num > BMI_MAX_FIFO_SIZE)))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("fifoBufs.num has to be in the range of 256 - %d", BMI_MAX_FIFO_SIZE));
++ if (p_Params->setSizeOfFifo && (p_FmPort->fifoBufs.num % BMI_FIFO_UNITS))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("fifoBufs.num has to be divisible by %d", BMI_FIFO_UNITS));
++
++#ifdef FM_QMI_NO_DEQ_OPTIONS_SUPPORT
++ if (p_FmPort->fmRevInfo.majorRev == 4)
++ if (p_FmPort->p_FmPortDriverParam->deqPrefetchOption != DEFAULT_notSupported)
++ /* this is an indication that user called config for this mode which is not supported in this integration */
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("deqPrefetchOption"));
++#endif /* FM_QMI_NO_DEQ_OPTIONS_SUPPORT */
++
++ return E_OK;
++}
++
++static t_Error VerifySizeOfFifo(t_FmPort *p_FmPort)
++{
++ uint32_t minFifoSizeRequired = 0;
++
++ /*************************/
++ /* TX PORTS */
++ /*************************/
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_TX) ||
++ (p_FmPort->portType == e_FM_PORT_TYPE_TX_10G))
++ {
++ minFifoSizeRequired = (uint32_t)DIV_CEIL(p_FmPort->maxFrameLength, BMI_FIFO_UNITS);
++ if (p_FmPort->imEn)
++ minFifoSizeRequired += 3*BMI_FIFO_UNITS;
++ else
++ minFifoSizeRequired += (p_FmPort->fifoDeqPipelineDepth+3)*BMI_FIFO_UNITS;
++
++ /* add some margin for back to back capability to improve performance
++ * allows the hardware to pipeline new frame dma while the previous
++ * frame not yet transmitted). */
++ if (p_FmPort->portType == e_FM_PORT_TYPE_TX_10G)
++ minFifoSizeRequired += 3*BMI_FIFO_UNITS;
++ else
++ minFifoSizeRequired += 2*BMI_FIFO_UNITS;
++ }
++
++ /*************************/
++ /* RX IM PORTS */
++ /*************************/
++ else if (((p_FmPort->portType == e_FM_PORT_TYPE_RX) ||
++ (p_FmPort->portType == e_FM_PORT_TYPE_RX_10G)) &&
++ p_FmPort->imEn)
++ minFifoSizeRequired = (uint32_t)(DIV_CEIL(p_FmPort->maxFrameLength, BMI_FIFO_UNITS) +
++ (4*BMI_FIFO_UNITS));
++
++ /*************************/
++ /* RX non-IM PORTS */
++ /*************************/
++ else if (((p_FmPort->portType == e_FM_PORT_TYPE_RX) ||
++ (p_FmPort->portType == e_FM_PORT_TYPE_RX_10G)) &&
++ !p_FmPort->imEn)
++ {
++#ifdef FM_FIFO_ALLOCATION_ALG
++ if (p_FmPort->fmRevInfo.majorRev == 4)
++ {
++ if (p_FmPort->rxPoolsParams.numOfPools == 1)
++ minFifoSizeRequired = 8*BMI_FIFO_UNITS;
++ else
++ minFifoSizeRequired = (uint32_t)(DIV_CEIL(p_FmPort->rxPoolsParams.secondLargestBufSize, BMI_FIFO_UNITS) +
++ (7*BMI_FIFO_UNITS));
++ }
++ else
++#endif /* FM_FIFO_ALLOCATION_ALG */
++ minFifoSizeRequired = (uint32_t)(DIV_CEIL(p_FmPort->rxPoolsParams.largestBufSize, BMI_FIFO_UNITS) +
++ (7*BMI_FIFO_UNITS));
++
++ if (p_FmPort->portType == e_FM_PORT_TYPE_RX_10G)
++ minFifoSizeRequired += 12*BMI_FIFO_UNITS;
++ else
++ minFifoSizeRequired += 3*BMI_FIFO_UNITS;
++ }
++
++ /* For O/H ports, check fifo size and update if necessary */
++ else if ((p_FmPort->portType == e_FM_PORT_TYPE_OH_OFFLINE_PARSING) ||
++ (p_FmPort->portType == e_FM_PORT_TYPE_OH_HOST_COMMAND))
++ minFifoSizeRequired = (uint32_t)((p_FmPort->tasks.num + 4)*BMI_FIFO_UNITS);
++
++ /* for all ports - verify size */
++ if (minFifoSizeRequired && (p_FmPort->fifoBufs.num < minFifoSizeRequired))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE,
++ ("User defined FIFO size should be enlarged to %d",
++ minFifoSizeRequired));
++
++ /* check if pool size is not too big */
++ /* This is a definition problem in which if the fifo for the RX port
++ is lower than the largest pool size the hardware will allocate scatter gather
++ buffers even though the frame size can fit in a single buffer. */
++ if (((p_FmPort->portType == e_FM_PORT_TYPE_RX) ||
++ (p_FmPort->portType == e_FM_PORT_TYPE_RX_10G))
++ && !p_FmPort->imEn)
++ {
++ if (p_FmPort->rxPoolsParams.largestBufSize > p_FmPort->fifoBufs.num)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE,
++ ("Frame larger than port Fifo size (%u) will be split to more "\
++ "than a single buffer (S/G) even if shorter than largest buffer size (%u)",
++ p_FmPort->fifoBufs.num, p_FmPort->rxPoolsParams.largestBufSize));
++ }
++
++ return E_OK;
++}
++
++static void FmPortDriverParamFree(t_FmPort *p_FmPort)
++{
++ if (p_FmPort->p_FmPortDriverParam)
++ {
++ XX_Free(p_FmPort->p_FmPortDriverParam);
++ p_FmPort->p_FmPortDriverParam = NULL;
++ }
++}
++
++static t_Error SetExtBufferPools(t_FmPort *p_FmPort)
++{
++ t_FmExtPools *p_ExtBufPools = &p_FmPort->p_FmPortDriverParam->extBufPools;
++ t_FmBufPoolDepletion *p_BufPoolDepletion = &p_FmPort->p_FmPortDriverParam->bufPoolDepletion;
++ volatile uint32_t *p_ExtBufRegs;
++ volatile uint32_t *p_BufPoolDepletionReg;
++ bool rxPort;
++ uint8_t orderedArray[FM_PORT_MAX_NUM_OF_EXT_POOLS];
++ uint16_t sizesArray[BM_MAX_NUM_OF_POOLS];
++ uint8_t numOfPools;
++ int i=0, j=0;
++ uint32_t tmpReg, vector;
++
++ memset(&orderedArray, 0, sizeof(uint8_t) * FM_PORT_MAX_NUM_OF_EXT_POOLS);
++ memset(&sizesArray, 0, sizeof(uint16_t) * BM_MAX_NUM_OF_POOLS);
++ memcpy(&p_FmPort->extBufPools, p_ExtBufPools, sizeof(t_FmExtPools));
++
++ switch (p_FmPort->portType)
++ {
++ case (e_FM_PORT_TYPE_RX_10G):
++ case (e_FM_PORT_TYPE_RX):
++ p_ExtBufRegs = p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_ebmpi;
++ p_BufPoolDepletionReg = &p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rmpd;
++ rxPort = TRUE;
++ break;
++ case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
++ p_ExtBufRegs = p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_oebmpi;
++ p_BufPoolDepletionReg = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_ompd;
++ rxPort = FALSE;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("Not available for port type"));
++ }
++
++ FmSpSetBufPoolsInAscOrderOfBufSizes(p_ExtBufPools, orderedArray, sizesArray);
++
++ /* build the register value */
++ for (i=0;inumOfPoolsUsed;i++)
++ {
++ tmpReg = BMI_EXT_BUF_POOL_VALID | BMI_EXT_BUF_POOL_EN_COUNTER;
++ tmpReg |= ((uint32_t)orderedArray[i] << BMI_EXT_BUF_POOL_ID_SHIFT);
++ tmpReg |= sizesArray[orderedArray[i]];
++ /* functionality available only for some deriviatives (limited by config) */
++ if (p_FmPort->p_FmPortDriverParam->p_BackupBmPools)
++ for (j=0;jp_FmPortDriverParam->p_BackupBmPools->numOfBackupPools;j++)
++ if (orderedArray[i] == p_FmPort->p_FmPortDriverParam->p_BackupBmPools->poolIds[j])
++ {
++ tmpReg |= BMI_EXT_BUF_POOL_BACKUP;
++ break;
++ }
++ WRITE_UINT32(*(p_ExtBufRegs+i), tmpReg);
++ }
++
++ if (p_FmPort->p_FmPortDriverParam->p_BackupBmPools)
++ XX_Free(p_FmPort->p_FmPortDriverParam->p_BackupBmPools);
++
++ numOfPools = (uint8_t)(rxPort ? FM_PORT_MAX_NUM_OF_EXT_POOLS:FM_PORT_MAX_NUM_OF_OBSERVED_EXT_POOLS);
++
++ /* clear unused pools */
++ for (i=p_ExtBufPools->numOfPoolsUsed;irxPoolsParams.numOfPools = p_ExtBufPools->numOfPoolsUsed;
++ p_FmPort->rxPoolsParams.largestBufSize = sizesArray[orderedArray[p_ExtBufPools->numOfPoolsUsed-1]];
++ p_FmPort->rxPoolsParams.secondLargestBufSize = sizesArray[orderedArray[p_ExtBufPools->numOfPoolsUsed-2]];
++
++ /* FMBM_RMPD reg. - pool depletion */
++ tmpReg = 0;
++ if (p_BufPoolDepletion->poolsGrpModeEnable)
++ {
++ /* calculate vector for number of pools depletion */
++ vector = 0;
++ for (i=0;ipoolsToConsider[i])
++ {
++ for (j=0;jnumOfPoolsUsed;j++)
++ {
++ if (i == orderedArray[j])
++ {
++ vector |= 0x80000000 >> j;
++ break;
++ }
++ }
++ }
++ }
++ /* configure num of pools and vector for number of pools mode */
++ tmpReg |= (((uint32_t)p_BufPoolDepletion->numOfPools - 1) << BMI_POOL_DEP_NUM_OF_POOLS_SHIFT);
++ tmpReg |= vector;
++ }
++
++ if (p_BufPoolDepletion->singlePoolModeEnable)
++ {
++ /* calculate vector for number of pools depletion */
++ vector = 0;
++ for (i=0;ipoolsToConsiderForSingleMode[i])
++ {
++ for (j=0;jnumOfPoolsUsed;j++)
++ {
++ if (i == orderedArray[j])
++ {
++ vector |= 0x00000080 >> j;
++ break;
++ }
++ }
++ }
++ }
++ tmpReg |= vector;
++ }
++
++#if (DPAA_VERSION >= 11)
++ /* fill QbbPEV */
++ if (p_BufPoolDepletion->poolsGrpModeEnable ||
++ p_BufPoolDepletion->singlePoolModeEnable)
++ {
++ vector = 0;
++ for (i=0; ipfcPrioritiesEn[i] == TRUE)
++ {
++ vector |= 0x00008000 >> i;
++ }
++ }
++ tmpReg |= vector;
++ }
++#endif /* (DPAA_VERSION >= 11) */
++
++ WRITE_UINT32(*p_BufPoolDepletionReg, tmpReg);
++
++ return E_OK;
++}
++
++static t_Error ClearPerfCnts(t_FmPort *p_FmPort)
++{
++ if (p_FmPort->portType != e_FM_PORT_TYPE_OH_OFFLINE_PARSING)
++ FM_PORT_ModifyCounter(p_FmPort, e_FM_PORT_COUNTERS_QUEUE_UTIL, 0);
++ FM_PORT_ModifyCounter(p_FmPort, e_FM_PORT_COUNTERS_TASK_UTIL, 0);
++ FM_PORT_ModifyCounter(p_FmPort, e_FM_PORT_COUNTERS_DMA_UTIL, 0);
++ FM_PORT_ModifyCounter(p_FmPort, e_FM_PORT_COUNTERS_FIFO_UTIL, 0);
++ return E_OK;
++}
++
++static t_Error BmiRxPortInit(t_FmPort *p_FmPort)
++{
++ t_FmPortRxBmiRegs *p_Regs = &p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs;
++ uint32_t tmpReg;
++ t_FmPortDriverParam *p_Params = p_FmPort->p_FmPortDriverParam;
++ uint32_t errorsToEnq = 0;
++ t_FmPortPerformanceCnt performanceContersParams;
++ t_Error err;
++
++ /* check that port is not busy */
++ if (GET_UINT32(p_Regs->fmbm_rcfg) & BMI_PORT_CFG_EN)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE,
++ ("Port(%d,%d) is already enabled",p_FmPort->portType, p_FmPort->portId));
++
++ /* Set Config register */
++ tmpReg = 0;
++ if (p_FmPort->imEn)
++ tmpReg |= BMI_PORT_CFG_IM;
++ /* No discard - all error frames go to error queue */
++ else if (p_Params->frmDiscardOverride)
++ tmpReg |= BMI_PORT_CFG_FDOVR;
++
++ WRITE_UINT32(p_Regs->fmbm_rcfg, tmpReg);
++
++ /* Configure dma attributes */
++ tmpReg = 0;
++ tmpReg |= (uint32_t)p_Params->dmaSwapData << BMI_DMA_ATTR_SWP_SHIFT;
++ tmpReg |= (uint32_t)p_Params->dmaIntContextCacheAttr << BMI_DMA_ATTR_IC_CACHE_SHIFT;
++ tmpReg |= (uint32_t)p_Params->dmaHeaderCacheAttr << BMI_DMA_ATTR_HDR_CACHE_SHIFT;
++ tmpReg |= (uint32_t)p_Params->dmaScatterGatherCacheAttr << BMI_DMA_ATTR_SG_CACHE_SHIFT;
++ if (p_Params->dmaWriteOptimize)
++ tmpReg |= BMI_DMA_ATTR_WRITE_OPTIMIZE;
++
++ WRITE_UINT32(p_Regs->fmbm_rda, tmpReg);
++
++ /* Configure Rx Fifo params */
++ tmpReg = 0;
++ tmpReg |= ((p_Params->rxFifoPriElevationLevel/BMI_FIFO_UNITS - 1) << BMI_RX_FIFO_PRI_ELEVATION_SHIFT);
++ tmpReg |= ((p_Params->rxFifoThreshold/BMI_FIFO_UNITS - 1) << BMI_RX_FIFO_THRESHOLD_SHIFT);
++
++ WRITE_UINT32(p_Regs->fmbm_rfp, tmpReg);
++
++#ifdef FM_NO_RESTRICT_ON_ACCESS_RSRC
++ if (p_FmPort->fmRevInfo.majorRev < 6)
++ /* always allow access to the extra resources */
++ WRITE_UINT32(p_Regs->fmbm_reth, BMI_RX_FIFO_THRESHOLD_BC);
++#endif /* FM_NO_RESTRICT_ON_ACCESS_RSRC */
++
++ /* frame end parameters */
++ tmpReg = 0;
++ tmpReg |= ((uint32_t)p_Params->cheksumLastBytesIgnore << BMI_RX_FRAME_END_CS_IGNORE_SHIFT);
++ tmpReg |= ((uint32_t)p_Params->cutBytesFromEnd<< BMI_RX_FRAME_END_CUT_SHIFT);
++
++ WRITE_UINT32(p_Regs->fmbm_rfed, tmpReg);
++
++ /* IC parameters */
++ tmpReg = 0;
++ tmpReg |= (((uint32_t)p_Params->intContext.extBufOffset/OFFSET_UNITS) << BMI_IC_TO_EXT_SHIFT);
++ tmpReg |= (((uint32_t)p_Params->intContext.intContextOffset/OFFSET_UNITS) << BMI_IC_FROM_INT_SHIFT);
++ tmpReg |= (((uint32_t)p_Params->intContext.size/OFFSET_UNITS) << BMI_IC_SIZE_SHIFT);
++
++ WRITE_UINT32(p_Regs->fmbm_ricp, tmpReg);
++
++ if (!p_FmPort->imEn)
++ {
++ /* Call the external Buffer routine which also checks fifo
++ size and updates it if necessary */
++ /* define external buffer pools and pool depletion*/
++
++ /* check if the largest external buffer pool is large enough */
++ if ((p_Params->bufMargins.startMargins +
++ MIN_EXT_BUF_SIZE +
++ p_Params->bufMargins.endMargins) > p_FmPort->rxPoolsParams.largestBufSize)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE,
++ ("bufMargins.startMargins (%d) + minimum buf size (64) + "
++ "bufMargins.endMargins (%d) is larger than maximum external buffer size (%d)",
++ p_Params->bufMargins.startMargins,
++ p_Params->bufMargins.endMargins,
++ p_FmPort->rxPoolsParams.largestBufSize));
++
++ /* buffer margins */
++ tmpReg = 0;
++ tmpReg |= (((uint32_t)p_Params->bufMargins.startMargins) << BMI_EXT_BUF_MARG_START_SHIFT);
++ tmpReg |= (((uint32_t)p_Params->bufMargins.endMargins) << BMI_EXT_BUF_MARG_END_SHIFT);
++#if (DPAA_VERSION >= 11)
++ if (p_Params->noScatherGather)
++ tmpReg |= BMI_SG_DISABLE;
++#endif
++ WRITE_UINT32(p_Regs->fmbm_rebm, tmpReg);
++ }
++
++ if (p_FmPort->internalBufferOffset)
++ {
++ tmpReg = (uint32_t)((p_FmPort->internalBufferOffset%OFFSET_UNITS) ?
++ (p_FmPort->internalBufferOffset/OFFSET_UNITS + 1) :
++ (p_FmPort->internalBufferOffset/OFFSET_UNITS));
++ p_FmPort->internalBufferOffset = (uint8_t)(tmpReg * OFFSET_UNITS);
++ WRITE_UINT32(p_Regs->fmbm_rim, tmpReg << BMI_IM_FOF_SHIFT);
++ }
++
++ /* NIA */
++ if (p_FmPort->imEn)
++ WRITE_UINT32(p_Regs->fmbm_rfne, NIA_ENG_FM_CTL | NIA_FM_CTL_AC_IND_MODE_RX);
++ else
++ {
++ tmpReg = 0;
++ if (p_Params->forwardReuseIntContext)
++ tmpReg |= BMI_PORT_RFNE_FRWD_RPD;
++ /* L3/L4 checksum verify is enabled by default. */
++ /*tmpReg |= BMI_PORT_RFNE_FRWD_DCL4C;*/
++ WRITE_UINT32(p_Regs->fmbm_rfne, tmpReg | (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME));
++ }
++ WRITE_UINT32(p_Regs->fmbm_rfene, NIA_ENG_QMI_ENQ | NIA_ORDER_RESTOR);
++
++ /* command attribute */
++ tmpReg = BMI_CMD_RX_MR_DEF;
++ if (!p_FmPort->imEn)
++ {
++ tmpReg |= BMI_CMD_ATTR_ORDER;
++ if (p_Params->syncReq)
++ tmpReg |= BMI_CMD_ATTR_SYNC;
++ tmpReg |= ((uint32_t)p_Params->color << BMI_CMD_ATTR_COLOR_SHIFT);
++ }
++
++ WRITE_UINT32(p_Regs->fmbm_rfca, tmpReg);
++
++ /* default queues */
++ if (!p_FmPort->imEn)
++ {
++ WRITE_UINT32(p_Regs->fmbm_rfqid, p_Params->dfltFqid);
++ WRITE_UINT32(p_Regs->fmbm_refqid, p_Params->errFqid);
++ }
++
++ /* set counters */
++ WRITE_UINT32(p_Regs->fmbm_rstc, BMI_COUNTERS_EN);
++
++ performanceContersParams.taskCompVal = (uint8_t)p_FmPort->tasks.num;
++ performanceContersParams.queueCompVal = 1;
++ performanceContersParams.dmaCompVal =(uint8_t) p_FmPort->openDmas.num;
++ performanceContersParams.fifoCompVal = p_FmPort->fifoBufs.num;
++ if ((err = FM_PORT_SetPerformanceCountersParams(p_FmPort, &performanceContersParams)) != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ WRITE_UINT32(p_Regs->fmbm_rpc, BMI_COUNTERS_EN);
++
++ /* error/status mask - check that if discard OV is set, no
++ discard is required for specific errors.*/
++ WRITE_UINT32(p_Regs->fmbm_rfsdm, p_Params->errorsToDiscard);
++
++ errorsToEnq = (RX_ERRS_TO_ENQ & ~p_Params->errorsToDiscard);
++ WRITE_UINT32(p_Regs->fmbm_rfsem, errorsToEnq);
++
++ return E_OK;
++}
++
++static t_Error BmiTxPortInit(t_FmPort *p_FmPort)
++{
++ t_FmPortTxBmiRegs *p_Regs = &p_FmPort->p_FmPortBmiRegs->txPortBmiRegs;
++ uint32_t tmpReg;
++ t_FmPortDriverParam *p_Params = p_FmPort->p_FmPortDriverParam;
++ /*uint32_t rateCountUnit;*/
++ t_FmPortPerformanceCnt performanceContersParams;
++
++ /* check that port is not busy */
++ if (GET_UINT32(p_Regs->fmbm_tcfg) & BMI_PORT_CFG_EN)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Port is already enabled"));
++
++ tmpReg = 0;
++ if (p_FmPort->imEn)
++ tmpReg |= BMI_PORT_CFG_IM;
++
++ WRITE_UINT32(p_Regs->fmbm_tcfg, tmpReg);
++
++ /* Configure dma attributes */
++ tmpReg = 0;
++ tmpReg |= (uint32_t)p_Params->dmaSwapData << BMI_DMA_ATTR_SWP_SHIFT;
++ tmpReg |= (uint32_t)p_Params->dmaIntContextCacheAttr << BMI_DMA_ATTR_IC_CACHE_SHIFT;
++ tmpReg |= (uint32_t)p_Params->dmaHeaderCacheAttr << BMI_DMA_ATTR_HDR_CACHE_SHIFT;
++ tmpReg |= (uint32_t)p_Params->dmaScatterGatherCacheAttr << BMI_DMA_ATTR_SG_CACHE_SHIFT;
++
++ WRITE_UINT32(p_Regs->fmbm_tda, tmpReg);
++
++ /* Configure Tx Fifo params */
++ tmpReg = 0;
++ tmpReg |= ((p_Params->txFifoMinFillLevel/BMI_FIFO_UNITS) << BMI_TX_FIFO_MIN_FILL_SHIFT);
++ tmpReg |= (((uint32_t)p_FmPort->fifoDeqPipelineDepth - 1) << BMI_FIFO_PIPELINE_DEPTH_SHIFT);
++ tmpReg |= ((p_Params->txFifoLowComfLevel/BMI_FIFO_UNITS - 1) << BMI_TX_LOW_COMF_SHIFT);
++
++ WRITE_UINT32(p_Regs->fmbm_tfp, tmpReg);
++
++ /* frame end parameters */
++ tmpReg = 0;
++ tmpReg |= ((uint32_t)p_Params->cheksumLastBytesIgnore << BMI_FRAME_END_CS_IGNORE_SHIFT);
++
++ WRITE_UINT32(p_Regs->fmbm_tfed, tmpReg);
++
++ if (!p_FmPort->imEn)
++ {
++ /* IC parameters */
++ tmpReg = 0;
++ tmpReg |= (((uint32_t)p_Params->intContext.extBufOffset/OFFSET_UNITS) << BMI_IC_TO_EXT_SHIFT);
++ tmpReg |= (((uint32_t)p_Params->intContext.intContextOffset/OFFSET_UNITS) << BMI_IC_FROM_INT_SHIFT);
++ tmpReg |= (((uint32_t)p_Params->intContext.size/OFFSET_UNITS) << BMI_IC_SIZE_SHIFT);
++
++ WRITE_UINT32(p_Regs->fmbm_ticp, tmpReg);
++ }
++
++ /* NIA */
++ if (p_FmPort->imEn)
++ {
++ WRITE_UINT32(p_Regs->fmbm_tfdne, NIA_ENG_FM_CTL | NIA_FM_CTL_AC_IND_MODE_TX);
++ WRITE_UINT32(p_Regs->fmbm_tfene, NIA_ENG_FM_CTL | NIA_FM_CTL_AC_IND_MODE_TX);
++#if (DPAA_VERSION >= 11)
++/* TODO - what should be the TFNE for FMan v3 IM? */
++#endif /* (DPAA_VERSION >= 11) */
++ }
++ else
++ {
++ WRITE_UINT32(p_Regs->fmbm_tfdne, NIA_ENG_QMI_DEQ);
++ WRITE_UINT32(p_Regs->fmbm_tfene, NIA_ENG_QMI_ENQ | NIA_ORDER_RESTOR);
++#if (DPAA_VERSION >= 11)
++ WRITE_UINT32(p_Regs->fmbm_tfne,
++ (!p_Params->dfltFqid ?
++ BMI_EBD_EN | NIA_BMI_AC_FETCH_ALL_FRAME :
++ NIA_BMI_AC_FETCH_ALL_FRAME));
++#endif /* (DPAA_VERSION >= 11) */
++
++ /* The line bellow is a trick so the FM will not release the buffer
++ to BM nor will try to enq the frame to QM */
++ if (!p_Params->dfltFqid && p_Params->dontReleaseBuf)
++ {
++ /* override fmbm_tcfqid 0 with a false non-0 value. This will force FM to
++ * act according to tfene. Otherwise, if fmbm_tcfqid is 0 the FM will release
++ * buffers to BM regardless of fmbm_tfene
++ */
++ WRITE_UINT32(p_Regs->fmbm_tcfqid, 0xFFFFFF);
++ WRITE_UINT32(p_Regs->fmbm_tfene, NIA_ENG_BMI | NIA_BMI_AC_TX_RELEASE);
++#if (DPAA_VERSION >= 11)
++ WRITE_UINT32(p_Regs->fmbm_tfne,
++ (GET_UINT32(p_Regs->fmbm_tfne) & ~BMI_EBD_EN));
++#endif /* (DPAA_VERSION >= 11) */
++ }
++ }
++
++ /* command attribute */
++ tmpReg = BMI_CMD_TX_MR_DEF;
++ if (p_FmPort->imEn)
++ tmpReg |= BMI_CMD_MR_DEAS;
++ else
++ {
++ tmpReg |= BMI_CMD_ATTR_ORDER;
++ tmpReg |= ((uint32_t)p_Params->color << BMI_CMD_ATTR_COLOR_SHIFT);
++ }
++ WRITE_UINT32(p_Regs->fmbm_tfca, tmpReg);
++
++ /* default queues */
++ if (!p_FmPort->imEn)
++ {
++ if (p_Params->dfltFqid || !p_Params->dontReleaseBuf)
++ WRITE_UINT32(p_Regs->fmbm_tcfqid, p_Params->dfltFqid);
++ WRITE_UINT32(p_Regs->fmbm_tfeqid, p_Params->errFqid);
++ }
++
++ /* statistics & performance counters */
++ WRITE_UINT32(p_Regs->fmbm_tstc, BMI_COUNTERS_EN);
++
++ performanceContersParams.taskCompVal = (uint8_t)p_FmPort->tasks.num;
++ performanceContersParams.queueCompVal = 1;
++ performanceContersParams.dmaCompVal = (uint8_t)p_FmPort->openDmas.num;
++ performanceContersParams.fifoCompVal = p_FmPort->fifoBufs.num;
++ FM_PORT_SetPerformanceCountersParams(p_FmPort, &performanceContersParams);
++
++ WRITE_UINT32(p_Regs->fmbm_tpc, BMI_COUNTERS_EN);
++
++
++ return E_OK;
++}
++
++static t_Error BmiOhPortInit(t_FmPort *p_FmPort)
++{
++ t_FmPortOhBmiRegs *p_Regs = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs;
++ uint32_t tmpReg, errorsToEnq = 0;
++ t_FmPortDriverParam *p_Params = p_FmPort->p_FmPortDriverParam;
++ t_FmPortPerformanceCnt performanceContersParams;
++
++ /* check that port is not busy */
++ if (GET_UINT32(p_Regs->fmbm_ocfg) & BMI_PORT_CFG_EN)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Port is already enabled"));
++
++ /* Configure dma attributes */
++ tmpReg = 0;
++ tmpReg |= (uint32_t)p_Params->dmaSwapData << BMI_DMA_ATTR_SWP_SHIFT;
++ tmpReg |= (uint32_t)p_Params->dmaIntContextCacheAttr << BMI_DMA_ATTR_IC_CACHE_SHIFT;
++ tmpReg |= (uint32_t)p_Params->dmaHeaderCacheAttr << BMI_DMA_ATTR_HDR_CACHE_SHIFT;
++ tmpReg |= (uint32_t)p_Params->dmaScatterGatherCacheAttr << BMI_DMA_ATTR_SG_CACHE_SHIFT;
++ if (p_Params->dmaWriteOptimize)
++ tmpReg |= BMI_DMA_ATTR_WRITE_OPTIMIZE;
++
++ WRITE_UINT32(p_Regs->fmbm_oda, tmpReg);
++
++ /* IC parameters */
++ tmpReg = 0;
++ tmpReg |= (((uint32_t)p_Params->intContext.extBufOffset/OFFSET_UNITS) << BMI_IC_TO_EXT_SHIFT);
++ tmpReg |= (((uint32_t)p_Params->intContext.intContextOffset/OFFSET_UNITS) << BMI_IC_FROM_INT_SHIFT);
++ tmpReg |= (((uint32_t)p_Params->intContext.size/OFFSET_UNITS) << BMI_IC_SIZE_SHIFT);
++
++ WRITE_UINT32(p_Regs->fmbm_oicp, tmpReg);
++
++ /* NIA */
++ WRITE_UINT32(p_Regs->fmbm_ofdne, NIA_ENG_QMI_DEQ);
++
++ if (p_FmPort->portType==e_FM_PORT_TYPE_OH_HOST_COMMAND)
++ WRITE_UINT32(p_Regs->fmbm_ofene, NIA_ENG_QMI_ENQ);
++ else
++ WRITE_UINT32(p_Regs->fmbm_ofene, NIA_ENG_QMI_ENQ | NIA_ORDER_RESTOR);
++
++ /* command attribute */
++ if (p_FmPort->portType==e_FM_PORT_TYPE_OH_HOST_COMMAND)
++ tmpReg = BMI_CMD_MR_DEAS | BMI_CMD_MR_MA;
++ else
++ tmpReg = BMI_CMD_ATTR_ORDER | BMI_CMD_MR_DEAS | BMI_CMD_MR_MA;
++
++ if (p_Params->syncReq)
++ tmpReg |= BMI_CMD_ATTR_SYNC;
++ tmpReg |= ((uint32_t)p_Params->color << BMI_CMD_ATTR_COLOR_SHIFT);
++ WRITE_UINT32(p_Regs->fmbm_ofca, tmpReg);
++
++ /* No discard - all error frames go to error queue */
++ if (p_Params->frmDiscardOverride)
++ tmpReg = BMI_PORT_CFG_FDOVR;
++ else
++ tmpReg = 0;
++ WRITE_UINT32(p_Regs->fmbm_ocfg, tmpReg);
++
++ if (p_FmPort->portType == e_FM_PORT_TYPE_OH_OFFLINE_PARSING)
++ {
++ WRITE_UINT32(p_Regs->fmbm_ofsdm, p_Params->errorsToDiscard);
++
++ errorsToEnq = (OP_ERRS_TO_ENQ & ~p_Params->errorsToDiscard);
++ WRITE_UINT32(p_Regs->fmbm_ofsem, errorsToEnq);
++
++ /* NIA */
++ WRITE_UINT32(p_Regs->fmbm_ofne, (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME));
++
++#ifndef FM_NO_OP_OBSERVED_POOLS
++ /* Call the external Buffer routine which also checks fifo
++ size and updates it if necessary */
++ if ((p_FmPort->fmRevInfo.majorRev == 4) &&
++ p_Params->enBufPoolDepletion)
++ {
++ /* define external buffer pools */
++ t_Error err = SetExtBufferPools(p_FmPort);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++#endif /* FM_NO_OP_OBSERVED_POOLS */
++ }
++ else
++ /* NIA */
++ WRITE_UINT32(p_Regs->fmbm_ofne, NIA_ENG_FM_CTL | NIA_FM_CTL_AC_HC);
++
++ /* default queues */
++ WRITE_UINT32(p_Regs->fmbm_ofqid, p_Params->dfltFqid);
++ WRITE_UINT32(p_Regs->fmbm_oefqid, p_Params->errFqid);
++
++ if (p_FmPort->internalBufferOffset)
++ {
++ tmpReg = (uint32_t)((p_FmPort->internalBufferOffset % OFFSET_UNITS) ?
++ (p_FmPort->internalBufferOffset/OFFSET_UNITS + 1):
++ (p_FmPort->internalBufferOffset/OFFSET_UNITS));
++ p_FmPort->internalBufferOffset = (uint8_t)(tmpReg * OFFSET_UNITS);
++ WRITE_UINT32(p_Regs->fmbm_oim, tmpReg << BMI_IM_FOF_SHIFT);
++ }
++ /* statistics & performance counters */
++ WRITE_UINT32(p_Regs->fmbm_ostc, BMI_COUNTERS_EN);
++
++ performanceContersParams.taskCompVal = (uint8_t)p_FmPort->tasks.num;
++ performanceContersParams.queueCompVal = 0;
++ performanceContersParams.dmaCompVal = (uint8_t)p_FmPort->openDmas.num;
++ performanceContersParams.fifoCompVal = p_FmPort->fifoBufs.num;
++ FM_PORT_SetPerformanceCountersParams(p_FmPort, &performanceContersParams);
++
++ WRITE_UINT32(p_Regs->fmbm_opc, BMI_COUNTERS_EN);
++#ifdef FM_DEQ_PIPELINE_PARAMS_FOR_OP
++ if ((p_FmPort->fmRevInfo.majorRev == 4) ||
++ (p_FmPort->fmRevInfo.majorRev >= 6))
++ {
++ tmpReg = (((uint32_t)p_FmPort->fifoDeqPipelineDepth - 1) << BMI_FIFO_PIPELINE_DEPTH_SHIFT);
++ WRITE_UINT32(p_Regs->fmbm_ofp, tmpReg);
++ }
++#endif /* FM_DEQ_PIPELINE_PARAMS_FOR_OP */
++
++#ifdef FM_FRAME_END_PARAMS_FOR_OP
++ if (p_FmPort->fmRevInfo.majorRev >= 6)
++ {
++ /* frame end parameters */
++ tmpReg = 0;
++ tmpReg |= ((uint32_t)p_Params->cheksumLastBytesIgnore << BMI_FRAME_END_CS_IGNORE_SHIFT);
++
++ WRITE_UINT32(p_Regs->fmbm_ofed, tmpReg);
++ }
++#endif /* FM_FRAME_END_PARAMS_FOR_OP */
++
++ return E_OK;
++}
++
++static t_Error QmiInit(t_FmPort *p_FmPort)
++{
++ t_FmPortDriverParam *p_Params = NULL;
++ uint32_t tmpReg;
++
++ p_Params = p_FmPort->p_FmPortDriverParam;
++
++ /* check that port is not busy */
++ if (((p_FmPort->portType != e_FM_PORT_TYPE_RX_10G) &&
++ (p_FmPort->portType != e_FM_PORT_TYPE_RX)) &&
++ (GET_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnc) & QMI_PORT_CFG_EN))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Port is already enabled"));
++
++ /* enable & clear counters */
++ WRITE_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnc, QMI_PORT_CFG_EN_COUNTERS);
++
++ /* The following is done for non-Rx ports only */
++ if ((p_FmPort->portType != e_FM_PORT_TYPE_RX_10G) &&
++ (p_FmPort->portType != e_FM_PORT_TYPE_RX))
++ {
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_TX_10G) ||
++ (p_FmPort->portType == e_FM_PORT_TYPE_TX))
++ {
++ /* define dequeue NIA */
++ WRITE_UINT32(p_FmPort->p_FmPortQmiRegs->nonRxQmiRegs.fmqm_pndn, NIA_ENG_BMI | NIA_BMI_AC_TX);
++ /* define enqueue NIA */
++ WRITE_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnen, NIA_ENG_BMI | NIA_BMI_AC_TX_RELEASE);
++ }
++ else /* for HC & OP */
++ {
++ WRITE_UINT32(p_FmPort->p_FmPortQmiRegs->nonRxQmiRegs.fmqm_pndn, NIA_ENG_BMI | NIA_BMI_AC_FETCH);
++ /* define enqueue NIA */
++ WRITE_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnen, NIA_ENG_BMI | NIA_BMI_AC_RELEASE);
++ }
++
++ /* configure dequeue */
++ tmpReg = 0;
++ if (p_Params->deqHighPriority)
++ tmpReg |= QMI_DEQ_CFG_PRI;
++
++ switch (p_Params->deqType)
++ {
++ case (e_FM_PORT_DEQ_TYPE1):
++ tmpReg |= QMI_DEQ_CFG_TYPE1;
++ break;
++ case (e_FM_PORT_DEQ_TYPE2):
++ tmpReg |= QMI_DEQ_CFG_TYPE2;
++ break;
++ case (e_FM_PORT_DEQ_TYPE3):
++ tmpReg |= QMI_DEQ_CFG_TYPE3;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid dequeue type"));
++ }
++
++#ifdef FM_QMI_NO_DEQ_OPTIONS_SUPPORT
++ if (p_FmPort->fmRevInfo.majorRev != 4)
++#endif /* FM_QMI_NO_DEQ_OPTIONS_SUPPORT */
++ switch (p_Params->deqPrefetchOption)
++ {
++ case (e_FM_PORT_DEQ_NO_PREFETCH):
++ /* Do nothing - QMI_DEQ_CFG_PREFETCH_WAITING_TNUM | QMI_DEQ_CFG_PREFETCH_1_FRAME = 0 */
++ break;
++ case (e_FM_PORT_DEQ_PARTIAL_PREFETCH):
++ tmpReg |= QMI_DEQ_CFG_PREFETCH_WAITING_TNUM | QMI_DEQ_CFG_PREFETCH_3_FRAMES;
++ break;
++ case (e_FM_PORT_DEQ_FULL_PREFETCH):
++ tmpReg |= QMI_DEQ_CFG_PREFETCH_NO_TNUM | QMI_DEQ_CFG_PREFETCH_3_FRAMES;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid dequeue prefetch option"));
++ }
++
++ tmpReg |= p_Params->deqByteCnt;
++ tmpReg |= (uint32_t)p_Params->deqSubPortal << QMI_DEQ_CFG_SUBPORTAL_SHIFT;
++
++ WRITE_UINT32(p_FmPort->p_FmPortQmiRegs->nonRxQmiRegs.fmqm_pndc, tmpReg);
++ }
++ else /* rx port */
++ /* define enqueue NIA */
++ WRITE_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnen, NIA_ENG_BMI | NIA_BMI_AC_RELEASE);
++
++ return E_OK;
++}
++
++static t_Error BmiRxPortCheckAndGetCounterPtr(t_FmPort *p_FmPort, e_FmPortCounters counter, volatile uint32_t **p_Ptr)
++{
++ t_FmPortRxBmiRegs *p_BmiRegs = &p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs;
++
++ /* check that counters are enabled */
++ switch (counter)
++ {
++ case (e_FM_PORT_COUNTERS_CYCLE):
++ case (e_FM_PORT_COUNTERS_TASK_UTIL):
++ case (e_FM_PORT_COUNTERS_QUEUE_UTIL):
++ case (e_FM_PORT_COUNTERS_DMA_UTIL):
++ case (e_FM_PORT_COUNTERS_FIFO_UTIL):
++ case (e_FM_PORT_COUNTERS_RX_PAUSE_ACTIVATION):
++ /* performance counters - may be read when disabled */
++ break;
++ case (e_FM_PORT_COUNTERS_FRAME):
++ case (e_FM_PORT_COUNTERS_DISCARD_FRAME):
++ case (e_FM_PORT_COUNTERS_RX_BAD_FRAME):
++ case (e_FM_PORT_COUNTERS_RX_LARGE_FRAME):
++ case (e_FM_PORT_COUNTERS_RX_FILTER_FRAME):
++ case (e_FM_PORT_COUNTERS_RX_LIST_DMA_ERR):
++ case (e_FM_PORT_COUNTERS_RX_OUT_OF_BUFFERS_DISCARD):
++ case (e_FM_PORT_COUNTERS_DEALLOC_BUF):
++ case (e_FM_PORT_COUNTERS_PREPARE_TO_ENQUEUE_COUNTER):
++ if (!(GET_UINT32(p_BmiRegs->fmbm_rstc) & BMI_COUNTERS_EN))
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Requested counter was not enabled"));
++ break;
++ default:
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Requested counter is not available for Rx ports"));
++ }
++
++ /* Set counter */
++ switch (counter)
++ {
++ case (e_FM_PORT_COUNTERS_CYCLE):
++ *p_Ptr = &p_BmiRegs->fmbm_rccn;
++ break;
++ case (e_FM_PORT_COUNTERS_TASK_UTIL):
++ *p_Ptr = &p_BmiRegs->fmbm_rtuc;
++ break;
++ case (e_FM_PORT_COUNTERS_QUEUE_UTIL):
++ *p_Ptr = &p_BmiRegs->fmbm_rrquc;
++ break;
++ case (e_FM_PORT_COUNTERS_DMA_UTIL):
++ *p_Ptr = &p_BmiRegs->fmbm_rduc;
++ break;
++ case (e_FM_PORT_COUNTERS_FIFO_UTIL):
++ *p_Ptr = &p_BmiRegs->fmbm_rfuc;
++ break;
++ case (e_FM_PORT_COUNTERS_RX_PAUSE_ACTIVATION):
++ *p_Ptr = &p_BmiRegs->fmbm_rpac;
++ break;
++ case (e_FM_PORT_COUNTERS_FRAME):
++ *p_Ptr = &p_BmiRegs->fmbm_rfrc;
++ break;
++ case (e_FM_PORT_COUNTERS_DISCARD_FRAME):
++ *p_Ptr = &p_BmiRegs->fmbm_rfcd;
++ break;
++ case (e_FM_PORT_COUNTERS_RX_BAD_FRAME):
++ *p_Ptr = &p_BmiRegs->fmbm_rfbc;
++ break;
++ case (e_FM_PORT_COUNTERS_RX_LARGE_FRAME):
++ *p_Ptr = &p_BmiRegs->fmbm_rlfc;
++ break;
++ case (e_FM_PORT_COUNTERS_RX_FILTER_FRAME):
++ *p_Ptr = &p_BmiRegs->fmbm_rffc;
++ break;
++ case (e_FM_PORT_COUNTERS_RX_LIST_DMA_ERR):
++ *p_Ptr = &p_BmiRegs->fmbm_rfldec;
++ break;
++ case (e_FM_PORT_COUNTERS_RX_OUT_OF_BUFFERS_DISCARD):
++ *p_Ptr = &p_BmiRegs->fmbm_rodc;
++ break;
++ case (e_FM_PORT_COUNTERS_DEALLOC_BUF):
++ *p_Ptr = &p_BmiRegs->fmbm_rbdc;
++ break;
++ case (e_FM_PORT_COUNTERS_PREPARE_TO_ENQUEUE_COUNTER):
++ *p_Ptr = &p_BmiRegs->fmbm_rpec;
++ break;
++ default:
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Requested counter is not available for Rx ports"));
++ }
++
++ return E_OK;
++}
++
++static t_Error BmiTxPortCheckAndGetCounterPtr(t_FmPort *p_FmPort, e_FmPortCounters counter, volatile uint32_t **p_Ptr)
++{
++ t_FmPortTxBmiRegs *p_BmiRegs = &p_FmPort->p_FmPortBmiRegs->txPortBmiRegs;
++
++ /* check that counters are enabled */
++ switch (counter)
++ {
++ case (e_FM_PORT_COUNTERS_CYCLE):
++ case (e_FM_PORT_COUNTERS_TASK_UTIL):
++ case (e_FM_PORT_COUNTERS_QUEUE_UTIL):
++ case (e_FM_PORT_COUNTERS_DMA_UTIL):
++ case (e_FM_PORT_COUNTERS_FIFO_UTIL):
++ /* performance counters - may be read when disabled */
++ break;
++ case (e_FM_PORT_COUNTERS_FRAME):
++ case (e_FM_PORT_COUNTERS_DISCARD_FRAME):
++ case (e_FM_PORT_COUNTERS_LENGTH_ERR):
++ case (e_FM_PORT_COUNTERS_UNSUPPRTED_FORMAT):
++ case (e_FM_PORT_COUNTERS_DEALLOC_BUF):
++ if (!(GET_UINT32(p_BmiRegs->fmbm_tstc) & BMI_COUNTERS_EN))
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Requested counter was not enabled"));
++ break;
++ default:
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Requested counter is not available for Tx ports"));
++ }
++
++ /* Set counter */
++ switch (counter)
++ {
++ case (e_FM_PORT_COUNTERS_CYCLE):
++ *p_Ptr = &p_BmiRegs->fmbm_tccn;
++ break;
++ case (e_FM_PORT_COUNTERS_TASK_UTIL):
++ *p_Ptr = &p_BmiRegs->fmbm_ttuc;
++ break;
++ case (e_FM_PORT_COUNTERS_QUEUE_UTIL):
++ *p_Ptr = &p_BmiRegs->fmbm_ttcquc;
++ break;
++ case (e_FM_PORT_COUNTERS_DMA_UTIL):
++ *p_Ptr = &p_BmiRegs->fmbm_tduc;
++ break;
++ case (e_FM_PORT_COUNTERS_FIFO_UTIL):
++ *p_Ptr = &p_BmiRegs->fmbm_tfuc;
++ break;
++ case (e_FM_PORT_COUNTERS_FRAME):
++ *p_Ptr = &p_BmiRegs->fmbm_tfrc;
++ break;
++ case (e_FM_PORT_COUNTERS_DISCARD_FRAME):
++ *p_Ptr = &p_BmiRegs->fmbm_tfdc;
++ break;
++ case (e_FM_PORT_COUNTERS_LENGTH_ERR):
++ *p_Ptr = &p_BmiRegs->fmbm_tfledc;
++ break;
++ case (e_FM_PORT_COUNTERS_UNSUPPRTED_FORMAT):
++ *p_Ptr = &p_BmiRegs->fmbm_tfufdc;
++ break;
++ case (e_FM_PORT_COUNTERS_DEALLOC_BUF):
++ *p_Ptr = &p_BmiRegs->fmbm_tbdc;
++ break;
++ default:
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Requested counter is not available for Tx ports"));
++ }
++
++ return E_OK;
++}
++
++static t_Error BmiOhPortCheckAndGetCounterPtr(t_FmPort *p_FmPort, e_FmPortCounters counter, volatile uint32_t **p_Ptr)
++{
++ t_FmPortOhBmiRegs *p_BmiRegs = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs;
++
++ /* check that counters are enabled */
++ switch (counter)
++ {
++ case (e_FM_PORT_COUNTERS_CYCLE):
++ case (e_FM_PORT_COUNTERS_TASK_UTIL):
++ case (e_FM_PORT_COUNTERS_DMA_UTIL):
++ case (e_FM_PORT_COUNTERS_FIFO_UTIL):
++ /* performance counters - may be read when disabled */
++ break;
++ case (e_FM_PORT_COUNTERS_FRAME):
++ case (e_FM_PORT_COUNTERS_DISCARD_FRAME):
++ case (e_FM_PORT_COUNTERS_RX_LIST_DMA_ERR):
++ case (e_FM_PORT_COUNTERS_RX_OUT_OF_BUFFERS_DISCARD):
++ case (e_FM_PORT_COUNTERS_WRED_DISCARD):
++ case (e_FM_PORT_COUNTERS_LENGTH_ERR):
++ case (e_FM_PORT_COUNTERS_UNSUPPRTED_FORMAT):
++ case (e_FM_PORT_COUNTERS_DEALLOC_BUF):
++ if (!(GET_UINT32(p_BmiRegs->fmbm_ostc) & BMI_COUNTERS_EN))
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Requested counter was not enabled"));
++ break;
++ case (e_FM_PORT_COUNTERS_RX_FILTER_FRAME): /* only valid for offline parsing */
++ /* only driver uses host command port, so ASSERT rather than RETURN_ERROR */
++ ASSERT_COND(p_FmPort->portType != e_FM_PORT_TYPE_OH_HOST_COMMAND);
++ if (!(GET_UINT32(p_BmiRegs->fmbm_ostc) & BMI_COUNTERS_EN))
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Requested counter was not enabled"));
++ break;
++ default:
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Requested counter(%d) is not available for O/H ports", counter));
++ }
++
++ /* Set counter */
++ switch (counter)
++ {
++ case (e_FM_PORT_COUNTERS_CYCLE):
++ *p_Ptr = &p_BmiRegs->fmbm_occn;
++ break;
++ case (e_FM_PORT_COUNTERS_TASK_UTIL):
++ *p_Ptr = &p_BmiRegs->fmbm_otuc;
++ break;
++ case (e_FM_PORT_COUNTERS_DMA_UTIL):
++ *p_Ptr = &p_BmiRegs->fmbm_oduc;
++ break;
++ case (e_FM_PORT_COUNTERS_FIFO_UTIL):
++ *p_Ptr = &p_BmiRegs->fmbm_ofuc;
++ break;
++ case (e_FM_PORT_COUNTERS_FRAME):
++ *p_Ptr = &p_BmiRegs->fmbm_ofrc;
++ break;
++ case (e_FM_PORT_COUNTERS_DISCARD_FRAME):
++ *p_Ptr = &p_BmiRegs->fmbm_ofdc;
++ break;
++ case (e_FM_PORT_COUNTERS_RX_FILTER_FRAME):
++ *p_Ptr = &p_BmiRegs->fmbm_offc;
++ break;
++ case (e_FM_PORT_COUNTERS_RX_LIST_DMA_ERR):
++ *p_Ptr = &p_BmiRegs->fmbm_ofldec;
++ break;
++ case (e_FM_PORT_COUNTERS_WRED_DISCARD):
++ *p_Ptr = &p_BmiRegs->fmbm_ofwdc;
++ break;
++ case (e_FM_PORT_COUNTERS_LENGTH_ERR):
++ *p_Ptr = &p_BmiRegs->fmbm_ofledc;
++ break;
++ case (e_FM_PORT_COUNTERS_UNSUPPRTED_FORMAT):
++ *p_Ptr = &p_BmiRegs->fmbm_ofufdc;
++ break;
++ case (e_FM_PORT_COUNTERS_DEALLOC_BUF):
++ *p_Ptr = &p_BmiRegs->fmbm_obdc;
++ break;
++ case (e_FM_PORT_COUNTERS_RX_OUT_OF_BUFFERS_DISCARD):
++ *p_Ptr = &p_BmiRegs->fmbm_oodc;
++ break;
++ case (e_FM_PORT_COUNTERS_PREPARE_TO_ENQUEUE_COUNTER):
++ *p_Ptr = &p_BmiRegs->fmbm_opec;
++ break;
++ default:
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Requested counter is not available for O/H ports"));
++ }
++
++ return E_OK;
++}
++
++static t_Error AdditionalPrsParams(t_FmPort *p_FmPort, t_FmPcdPrsAdditionalHdrParams *p_HdrParams, uint32_t *p_SoftSeqAttachReg)
++{
++ uint8_t hdrNum, Ipv4HdrNum;
++ u_FmPcdHdrPrsOpts *p_prsOpts;
++ uint32_t tmpReg = *p_SoftSeqAttachReg, tmpPrsOffset;
++
++ if (IS_PRIVATE_HEADER(p_HdrParams->hdr) || IS_SPECIAL_HEADER(p_HdrParams->hdr))
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("No additional parameters for private or special headers."));
++
++ if (p_HdrParams->errDisable)
++ tmpReg |= PRS_HDR_ERROR_DIS;
++
++ /* Set parser options */
++ if (p_HdrParams->usePrsOpts)
++ {
++ p_prsOpts = &p_HdrParams->prsOpts;
++ switch (p_HdrParams->hdr)
++ {
++ case (HEADER_TYPE_MPLS):
++ if (p_prsOpts->mplsPrsOptions.labelInterpretationEnable)
++ tmpReg |= PRS_HDR_MPLS_LBL_INTER_EN;
++ GET_PRS_HDR_NUM(hdrNum, p_prsOpts->mplsPrsOptions.nextParse);
++ if (hdrNum == ILLEGAL_HDR_NUM)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, NO_MSG);
++ GET_PRS_HDR_NUM(Ipv4HdrNum, HEADER_TYPE_IPv4);
++ if (hdrNum < Ipv4HdrNum)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE,
++ ("Header must be equal or higher than IPv4"));
++ tmpReg |= ((uint32_t)hdrNum * PRS_HDR_ENTRY_SIZE) << PRS_HDR_MPLS_NEXT_HDR_SHIFT;
++ break;
++ case (HEADER_TYPE_PPPoE):
++ if (p_prsOpts->pppoePrsOptions.enableMTUCheck)
++ tmpReg |= PRS_HDR_PPPOE_MTU_CHECK_EN;
++ break;
++ case (HEADER_TYPE_IPv6):
++ if (p_prsOpts->ipv6PrsOptions.routingHdrEnable)
++ tmpReg |= PRS_HDR_IPV6_ROUTE_HDR_EN;
++ break;
++ case (HEADER_TYPE_TCP):
++ if (p_prsOpts->tcpPrsOptions.padIgnoreChecksum)
++ tmpReg |= PRS_HDR_TCP_PAD_REMOVAL;
++ else
++ tmpReg &= ~PRS_HDR_TCP_PAD_REMOVAL;
++ break;
++ case (HEADER_TYPE_UDP):
++ if (p_prsOpts->udpPrsOptions.padIgnoreChecksum)
++ tmpReg |= PRS_HDR_UDP_PAD_REMOVAL;
++ else
++ tmpReg &= ~PRS_HDR_UDP_PAD_REMOVAL;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid header"));
++ }
++ }
++
++ /* set software parsing (address is devided in 2 since parser uses 2 byte access. */
++ if (p_HdrParams->swPrsEnable)
++ {
++ tmpPrsOffset = FmPcdGetSwPrsOffset(p_FmPort->h_FmPcd, p_HdrParams->hdr, p_HdrParams->indexPerHdr);
++ if (tmpPrsOffset == ILLEGAL_BASE)
++ RETURN_ERROR(MINOR, E_INVALID_VALUE, NO_MSG);
++ tmpReg |= (PRS_HDR_SW_PRS_EN | tmpPrsOffset);
++ }
++ *p_SoftSeqAttachReg = tmpReg;
++
++ return E_OK;
++}
++
++static uint32_t GetPortSchemeBindParams(t_Handle h_FmPort, t_FmPcdKgInterModuleBindPortToSchemes *p_SchemeBind)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ uint32_t walking1Mask = 0x80000000, tmp;
++ uint8_t idx = 0;
++
++ p_SchemeBind->netEnvId = p_FmPort->netEnvId;
++ p_SchemeBind->hardwarePortId = p_FmPort->hardwarePortId;
++ p_SchemeBind->useClsPlan = p_FmPort->useClsPlan;
++ p_SchemeBind->numOfSchemes = 0;
++ tmp = p_FmPort->schemesPerPortVector;
++ if (tmp)
++ {
++ while (tmp)
++ {
++ if (tmp & walking1Mask)
++ {
++ p_SchemeBind->schemesIds[p_SchemeBind->numOfSchemes] = idx;
++ p_SchemeBind->numOfSchemes++;
++ tmp &= ~walking1Mask;
++ }
++ walking1Mask >>= 1;
++ idx++;
++ }
++ }
++
++ return tmp;
++}
++
++static t_Error SetPcd(t_FmPort *p_FmPort, t_FmPortPcdParams *p_PcdParams)
++{
++ t_Error err = E_OK;
++ uint32_t tmpReg;
++ volatile uint32_t *p_BmiNia=NULL;
++ volatile uint32_t *p_BmiPrsNia=NULL;
++ volatile uint32_t *p_BmiPrsStartOffset=NULL;
++ volatile uint32_t *p_BmiInitPrsResult=NULL;
++ volatile uint32_t *p_BmiCcBase=NULL;
++ uint8_t hdrNum, L3HdrNum, greHdrNum;
++ int i;
++ bool isEmptyClsPlanGrp;
++ uint32_t tmpHxs[FM_PCD_PRS_NUM_OF_HDRS];
++ uint16_t absoluteProfileId;
++ uint8_t physicalSchemeId;
++ uint32_t ccTreePhysOffset;
++ t_FmPcdKgInterModuleBindPortToSchemes schemeBind;
++
++ ASSERT_COND(p_FmPort);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPort->p_FmPortDriverParam, E_INVALID_STATE);
++
++ if (p_FmPort->imEn)
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("available for non-independant mode ports only"));
++
++ if ((p_FmPort->portType != e_FM_PORT_TYPE_RX_10G) &&
++ (p_FmPort->portType != e_FM_PORT_TYPE_RX) &&
++ (p_FmPort->portType != e_FM_PORT_TYPE_OH_OFFLINE_PARSING))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("available for Rx and offline parsing ports only"));
++
++ p_FmPort->netEnvId = FmPcdGetNetEnvId(p_PcdParams->h_NetEnv);
++
++ p_FmPort->pcdEngines = 0;
++
++ /* initialize p_FmPort->pcdEngines field in port's structure */
++ switch (p_PcdParams->pcdSupport)
++ {
++ case (e_FM_PORT_PCD_SUPPORT_NONE):
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("No PCD configuration required if e_FM_PORT_PCD_SUPPORT_NONE selected"));
++ case (e_FM_PORT_PCD_SUPPORT_PRS_ONLY):
++ p_FmPort->pcdEngines |= FM_PCD_PRS;
++ break;
++ case (e_FM_PORT_PCD_SUPPORT_PLCR_ONLY):
++ p_FmPort->pcdEngines |= FM_PCD_PLCR;
++ break;
++ case (e_FM_PORT_PCD_SUPPORT_PRS_AND_PLCR):
++ p_FmPort->pcdEngines |= FM_PCD_PRS;
++ p_FmPort->pcdEngines |= FM_PCD_PLCR;
++ break;
++ case (e_FM_PORT_PCD_SUPPORT_PRS_AND_KG):
++ p_FmPort->pcdEngines |= FM_PCD_PRS;
++ p_FmPort->pcdEngines |= FM_PCD_KG;
++ break;
++ case (e_FM_PORT_PCD_SUPPORT_PRS_AND_KG_AND_CC):
++ p_FmPort->pcdEngines |= FM_PCD_PRS;
++ p_FmPort->pcdEngines |= FM_PCD_CC;
++ p_FmPort->pcdEngines |= FM_PCD_KG;
++ break;
++ case (e_FM_PORT_PCD_SUPPORT_PRS_AND_KG_AND_CC_AND_PLCR):
++ p_FmPort->pcdEngines |= FM_PCD_PRS;
++ p_FmPort->pcdEngines |= FM_PCD_KG;
++ p_FmPort->pcdEngines |= FM_PCD_CC;
++ p_FmPort->pcdEngines |= FM_PCD_PLCR;
++ break;
++ case (e_FM_PORT_PCD_SUPPORT_PRS_AND_CC):
++ p_FmPort->pcdEngines |= FM_PCD_PRS;
++ p_FmPort->pcdEngines |= FM_PCD_CC;
++ break;
++ case (e_FM_PORT_PCD_SUPPORT_PRS_AND_CC_AND_PLCR):
++ p_FmPort->pcdEngines |= FM_PCD_PRS;
++ p_FmPort->pcdEngines |= FM_PCD_CC;
++ p_FmPort->pcdEngines |= FM_PCD_PLCR;
++ break;
++ case (e_FM_PORT_PCD_SUPPORT_PRS_AND_KG_AND_PLCR):
++ p_FmPort->pcdEngines |= FM_PCD_PRS;
++ p_FmPort->pcdEngines |= FM_PCD_KG;
++ p_FmPort->pcdEngines |= FM_PCD_PLCR;
++ break;
++#ifdef FM_CAPWAP_SUPPORT
++ case (e_FM_PORT_PCD_SUPPORT_CC_ONLY):
++ p_FmPort->pcdEngines |= FM_PCD_CC;
++ break;
++ case (e_FM_PORT_PCD_SUPPORT_CC_AND_KG):
++ p_FmPort->pcdEngines |= FM_PCD_CC;
++ p_FmPort->pcdEngines |= FM_PCD_KG;
++ break;
++ case (e_FM_PORT_PCD_SUPPORT_CC_AND_KG_AND_PLCR):
++ p_FmPort->pcdEngines |= FM_PCD_CC;
++ p_FmPort->pcdEngines |= FM_PCD_KG;
++ p_FmPort->pcdEngines |= FM_PCD_PLCR;
++ break;
++#endif /* FM_CAPWAP_SUPPORT */
++
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("invalid pcdSupport"));
++ }
++
++ if ((p_FmPort->pcdEngines & FM_PCD_PRS) &&
++ (p_PcdParams->p_PrsParams->numOfHdrsWithAdditionalParams > FM_PCD_PRS_NUM_OF_HDRS))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Port parser numOfHdrsWithAdditionalParams may not exceed %d", FM_PCD_PRS_NUM_OF_HDRS));
++
++ /* check that parameters exist for each and only each defined engine */
++ if ((!!(p_FmPort->pcdEngines & FM_PCD_PRS) != !!p_PcdParams->p_PrsParams) ||
++ (!!(p_FmPort->pcdEngines & FM_PCD_KG) != !!p_PcdParams->p_KgParams) ||
++ (!!(p_FmPort->pcdEngines & FM_PCD_CC) != !!p_PcdParams->p_CcParams))
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("PCD initialization structure is not consistent with pcdSupport"));
++
++ /* get PCD registers pointers */
++ switch (p_FmPort->portType)
++ {
++ case (e_FM_PORT_TYPE_RX_10G):
++ case (e_FM_PORT_TYPE_RX):
++ p_BmiNia = &p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rfne;
++ p_BmiPrsNia = &p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rfpne;
++ p_BmiPrsStartOffset = &p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rpso;
++ p_BmiInitPrsResult = &p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rprai[0];
++ p_BmiCcBase = &p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rccb;
++ break;
++ case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
++ p_BmiNia = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_ofne;
++ p_BmiPrsNia = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_ofpne;
++ p_BmiPrsStartOffset = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_opso;
++ p_BmiInitPrsResult = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_oprai[0];
++ p_BmiCcBase = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_occb;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid port type"));
++ }
++
++ /* set PCD port parameter */
++ if (p_FmPort->pcdEngines & FM_PCD_CC)
++ {
++ err = FmPcdCcBindTree(p_FmPort->h_FmPcd,
++ p_PcdParams,
++ p_PcdParams->p_CcParams->h_CcTree,
++ &ccTreePhysOffset,
++ p_FmPort);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ WRITE_UINT32(*p_BmiCcBase, ccTreePhysOffset);
++ p_FmPort->ccTreeId = p_PcdParams->p_CcParams->h_CcTree;
++ }
++
++ if (p_FmPort->pcdEngines & FM_PCD_KG)
++ {
++ if (p_PcdParams->p_KgParams->numOfSchemes == 0)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("For ports using Keygen, at least one scheme must be bound. "));
++
++ err = FmPcdKgSetOrBindToClsPlanGrp(p_FmPort->h_FmPcd,
++ p_FmPort->hardwarePortId,
++ p_FmPort->netEnvId,
++ p_FmPort->optArray,
++ &p_FmPort->clsPlanGrpId,
++ &isEmptyClsPlanGrp);
++ if (err)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("FmPcdKgSetOrBindToClsPlanGrp failed. "));
++
++ p_FmPort->useClsPlan = !isEmptyClsPlanGrp;
++
++ schemeBind.netEnvId = p_FmPort->netEnvId;
++ schemeBind.hardwarePortId = p_FmPort->hardwarePortId;
++ schemeBind.numOfSchemes = p_PcdParams->p_KgParams->numOfSchemes;
++ schemeBind.useClsPlan = p_FmPort->useClsPlan;
++
++ /* for each scheme */
++ for (i=0; ip_KgParams->numOfSchemes; i++)
++ {
++ ASSERT_COND(p_PcdParams->p_KgParams->h_Schemes[i]);
++ physicalSchemeId = FmPcdKgGetSchemeId(p_PcdParams->p_KgParams->h_Schemes[i]);
++ schemeBind.schemesIds[i] = physicalSchemeId;
++ /* build vector */
++ p_FmPort->schemesPerPortVector |= 1 << (31 - (uint32_t)physicalSchemeId);
++#if (DPAA_VERSION >= 11)
++ /*because of the state that VSPE is defined per port - all PCD path should be according to this requirement
++ if !VSPE - in port, for relevant scheme VSPE can not be set*/
++ if (!p_FmPort->vspe && FmPcdKgGetVspe((p_PcdParams->p_KgParams->h_Schemes[i])))
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("VSPE is not at port level"));
++#endif /* (DPAA_VERSION >= 11) */
++ }
++
++ err = FmPcdKgBindPortToSchemes(p_FmPort->h_FmPcd, &schemeBind);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ /***************************/
++ /* configure NIA after BMI */
++ /***************************/
++ /* rfne may contain FDCS bits, so first we read them. */
++ p_FmPort->savedBmiNia = GET_UINT32(*p_BmiNia) & BMI_RFNE_FDCS_MASK;
++
++ /* If policer is used directly after BMI or PRS */
++ if ((p_FmPort->pcdEngines & FM_PCD_PLCR) &&
++ ((p_PcdParams->pcdSupport == e_FM_PORT_PCD_SUPPORT_PLCR_ONLY) ||
++ (p_PcdParams->pcdSupport == e_FM_PORT_PCD_SUPPORT_PRS_AND_PLCR)))
++ {
++ if (!p_PcdParams->p_PlcrParams->h_Profile)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Profile should be initialized"));
++
++ absoluteProfileId = (uint16_t)FmPcdPlcrProfileGetAbsoluteId(p_PcdParams->p_PlcrParams->h_Profile);
++
++ if (!FmPcdPlcrIsProfileValid(p_FmPort->h_FmPcd, absoluteProfileId))
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Private port profile not valid."));
++
++ tmpReg = (uint32_t)(absoluteProfileId | NIA_PLCR_ABSOLUTE);
++
++ if (p_FmPort->pcdEngines & FM_PCD_PRS) /* e_FM_PCD_SUPPORT_PRS_AND_PLCR */
++ /* update BMI HPNIA */
++ WRITE_UINT32(*p_BmiPrsNia, (uint32_t)(NIA_ENG_PLCR | tmpReg));
++ else /* e_FM_PCD_SUPPORT_PLCR_ONLY */
++ /* update BMI NIA */
++ p_FmPort->savedBmiNia |= (uint32_t)(NIA_ENG_PLCR);
++ }
++
++#ifdef FM_CAPWAP_SUPPORT
++ /* if CC is used directly after BMI */
++ if ((p_PcdParams->pcdSupport == e_FM_PORT_PCD_SUPPORT_CC_ONLY) ||
++ (p_PcdParams->pcdSupport == e_FM_PORT_PCD_SUPPORT_CC_AND_KG) ||
++ (p_PcdParams->pcdSupport == e_FM_PORT_PCD_SUPPORT_CC_AND_KG_AND_PLCR))
++ {
++ if (p_FmPort->portType != e_FM_PORT_TYPE_OH_OFFLINE_PARSING)
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("e_FM_PORT_PCD_SUPPORT_CC_xx available for offline parsing ports only"));
++ p_FmPort->savedBmiNia |= (uint32_t)(NIA_ENG_FM_CTL | NIA_FM_CTL_AC_CC);
++ /* check that prs start offset == RIM[FOF] */
++ }
++#endif /* FM_CAPWAP_SUPPORT */
++
++ if (p_FmPort->pcdEngines & FM_PCD_PRS)
++ {
++ ASSERT_COND(p_PcdParams->p_PrsParams);
++ /* if PRS is used it is always first */
++ GET_PRS_HDR_NUM(hdrNum, p_PcdParams->p_PrsParams->firstPrsHdr);
++ if (hdrNum == ILLEGAL_HDR_NUM)
++ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("Unsupported header."));
++ p_FmPort->savedBmiNia |= (uint32_t)(NIA_ENG_PRS | (uint32_t)(hdrNum));
++ /* set after parser NIA */
++ tmpReg = 0;
++ switch (p_PcdParams->pcdSupport)
++ {
++ case (e_FM_PORT_PCD_SUPPORT_PRS_ONLY):
++ WRITE_UINT32(*p_BmiPrsNia, GET_NIA_BMI_AC_ENQ_FRAME(p_FmPort->h_FmPcd));
++ break;
++ case (e_FM_PORT_PCD_SUPPORT_PRS_AND_KG_AND_CC):
++ case (e_FM_PORT_PCD_SUPPORT_PRS_AND_KG_AND_CC_AND_PLCR):
++ tmpReg = NIA_KG_CC_EN;
++ case (e_FM_PORT_PCD_SUPPORT_PRS_AND_KG):
++ case (e_FM_PORT_PCD_SUPPORT_PRS_AND_KG_AND_PLCR):
++ if (p_PcdParams->p_KgParams->directScheme)
++ {
++ physicalSchemeId = FmPcdKgGetSchemeId(p_PcdParams->p_KgParams->h_DirectScheme);
++ /* check that this scheme was bound to this port */
++ for (i=0 ; ip_KgParams->numOfSchemes; i++)
++ if (p_PcdParams->p_KgParams->h_DirectScheme == p_PcdParams->p_KgParams->h_Schemes[i])
++ break;
++ if (i == p_PcdParams->p_KgParams->numOfSchemes)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Direct scheme is not one of the port selected schemes."));
++ tmpReg |= (uint32_t)(NIA_KG_DIRECT | physicalSchemeId);
++ }
++ WRITE_UINT32(*p_BmiPrsNia, NIA_ENG_KG | tmpReg);
++ break;
++ case (e_FM_PORT_PCD_SUPPORT_PRS_AND_CC):
++ case (e_FM_PORT_PCD_SUPPORT_PRS_AND_CC_AND_PLCR):
++ WRITE_UINT32(*p_BmiPrsNia, (uint32_t)(NIA_ENG_FM_CTL | NIA_FM_CTL_AC_CC));
++ break;
++ case (e_FM_PORT_PCD_SUPPORT_PRS_AND_PLCR):
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid PCD support"));
++ }
++
++ /* set start parsing offset */
++ WRITE_UINT32(*p_BmiPrsStartOffset, p_PcdParams->p_PrsParams->parsingOffset);
++
++ /************************************/
++ /* Parser port parameters */
++ /************************************/
++ /* stop before configuring */
++ WRITE_UINT32(p_FmPort->p_FmPortPrsRegs->pcac, PRS_CAC_STOP);
++ /* wait for parser to be in idle state */
++ while (GET_UINT32(p_FmPort->p_FmPortPrsRegs->pcac) & PRS_CAC_ACTIVE) ;
++
++ /* set soft seq attachment register */
++ memset(tmpHxs, 0, FM_PCD_PRS_NUM_OF_HDRS*sizeof(uint32_t));
++
++ /* set protocol options */
++ for (i=0;p_FmPort->optArray[i];i++)
++ switch (p_FmPort->optArray[i])
++ {
++ case (ETH_BROADCAST):
++ GET_PRS_HDR_NUM(hdrNum, HEADER_TYPE_ETH)
++ tmpHxs[hdrNum] |= (i+1) << PRS_HDR_ETH_BC_SHIFT;
++ break;
++ case (ETH_MULTICAST):
++ GET_PRS_HDR_NUM(hdrNum, HEADER_TYPE_ETH)
++ tmpHxs[hdrNum] |= (i+1) << PRS_HDR_ETH_MC_SHIFT;
++ break;
++ case (VLAN_STACKED):
++ GET_PRS_HDR_NUM(hdrNum, HEADER_TYPE_VLAN)
++ tmpHxs[hdrNum] |= (i+1)<< PRS_HDR_VLAN_STACKED_SHIFT;
++ break;
++ case (MPLS_STACKED):
++ GET_PRS_HDR_NUM(hdrNum, HEADER_TYPE_MPLS)
++ tmpHxs[hdrNum] |= (i+1) << PRS_HDR_MPLS_STACKED_SHIFT;
++ break;
++ case (IPV4_BROADCAST_1):
++ GET_PRS_HDR_NUM(hdrNum, HEADER_TYPE_IPv4)
++ tmpHxs[hdrNum] |= (i+1) << PRS_HDR_IPV4_1_BC_SHIFT;
++ break;
++ case (IPV4_MULTICAST_1):
++ GET_PRS_HDR_NUM(hdrNum, HEADER_TYPE_IPv4)
++ tmpHxs[hdrNum] |= (i+1) << PRS_HDR_IPV4_1_MC_SHIFT;
++ break;
++ case (IPV4_UNICAST_2):
++ GET_PRS_HDR_NUM(hdrNum, HEADER_TYPE_IPv4)
++ tmpHxs[hdrNum] |= (i+1) << PRS_HDR_IPV4_2_UC_SHIFT;
++ break;
++ case (IPV4_MULTICAST_BROADCAST_2):
++ GET_PRS_HDR_NUM(hdrNum, HEADER_TYPE_IPv4)
++ tmpHxs[hdrNum] |= (i+1) << PRS_HDR_IPV4_2_MC_BC_SHIFT;
++ break;
++ case (IPV6_MULTICAST_1):
++ GET_PRS_HDR_NUM(hdrNum, HEADER_TYPE_IPv6)
++ tmpHxs[hdrNum] |= (i+1) << PRS_HDR_IPV6_1_MC_SHIFT;
++ break;
++ case (IPV6_UNICAST_2):
++ GET_PRS_HDR_NUM(hdrNum, HEADER_TYPE_IPv6)
++ tmpHxs[hdrNum] |= (i+1) << PRS_HDR_IPV6_2_UC_SHIFT;
++ break;
++ case (IPV6_MULTICAST_2):
++ GET_PRS_HDR_NUM(hdrNum, HEADER_TYPE_IPv6)
++ tmpHxs[hdrNum] |= (i+1) << PRS_HDR_IPV6_2_MC_SHIFT;
++ break;
++ }
++
++ if (FmPcdNetEnvIsHdrExist(p_FmPort->h_FmPcd,
++ p_FmPort->netEnvId, HEADER_TYPE_UDP_ENCAP_ESP))
++ {
++ p_PcdParams->p_PrsParams->additionalParams
++ [p_PcdParams->p_PrsParams->numOfHdrsWithAdditionalParams].hdr = HEADER_TYPE_UDP;
++ p_PcdParams->p_PrsParams->additionalParams
++ [p_PcdParams->p_PrsParams->numOfHdrsWithAdditionalParams].swPrsEnable = TRUE;
++ p_PcdParams->p_PrsParams->numOfHdrsWithAdditionalParams++;
++ }
++
++ /* set MPLS default next header - HW reset workaround */
++ GET_PRS_HDR_NUM(hdrNum, HEADER_TYPE_MPLS)
++ tmpHxs[hdrNum] |= PRS_HDR_MPLS_LBL_INTER_EN;
++ GET_PRS_HDR_NUM(L3HdrNum, HEADER_TYPE_USER_DEFINED_L3);
++ tmpHxs[hdrNum] |= (uint32_t)L3HdrNum << PRS_HDR_MPLS_NEXT_HDR_SHIFT;
++
++ /* for GRE, disable errors */
++ GET_PRS_HDR_NUM(greHdrNum, HEADER_TYPE_GRE);
++ tmpHxs[greHdrNum] |= PRS_HDR_ERROR_DIS;
++
++ /* For UDP remove PAD from L4 checksum calculation */
++ GET_PRS_HDR_NUM(hdrNum, HEADER_TYPE_UDP);
++ tmpHxs[hdrNum] |= PRS_HDR_UDP_PAD_REMOVAL;
++ /* For TCP remove PAD from L4 checksum calculation */
++ GET_PRS_HDR_NUM(hdrNum, HEADER_TYPE_TCP);
++ tmpHxs[hdrNum] |= PRS_HDR_TCP_PAD_REMOVAL;
++
++ /* config additional params for specific headers */
++ for (i=0; ip_PrsParams->numOfHdrsWithAdditionalParams; i++)
++ {
++ GET_PRS_HDR_NUM(hdrNum, p_PcdParams->p_PrsParams->additionalParams[i].hdr);
++ if (hdrNum== ILLEGAL_HDR_NUM)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, NO_MSG);
++ if (hdrNum==NO_HDR_NUM)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Private headers may not use additional parameters"));
++
++ err = AdditionalPrsParams(p_FmPort, &p_PcdParams->p_PrsParams->additionalParams[i], &tmpHxs[hdrNum]);
++ if (err)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, NO_MSG);
++ }
++
++ /* Check if ip-reassembly port - need to update NIAs */
++ if (p_FmPort->h_IpReassemblyManip)
++ {
++ /* link to sw parser code for IP Frag - only if no other code is applied. */
++ GET_PRS_HDR_NUM(hdrNum, HEADER_TYPE_IPv4)
++ if (!(tmpHxs[hdrNum] & PRS_HDR_SW_PRS_EN))
++ tmpHxs[hdrNum] |= (PRS_HDR_SW_PRS_EN | IP_FRAG_SW_PATCH_IPv4_LABEL);
++ GET_PRS_HDR_NUM(hdrNum, HEADER_TYPE_IPv6)
++ if (!(tmpHxs[hdrNum] & PRS_HDR_SW_PRS_EN))
++ tmpHxs[hdrNum] |= (PRS_HDR_SW_PRS_EN | IP_FRAG_SW_PATCH_IPv6_LABEL);
++ }
++
++ if (FmPcdIsAdvancedOffloadSupported(p_FmPort->h_FmPcd) &&
++ (p_FmPort->portType == e_FM_PORT_TYPE_OH_OFFLINE_PARSING))
++ {
++ /* link to sw parser code for IP Frag - only if no other code is applied. */
++ GET_PRS_HDR_NUM(hdrNum, HEADER_TYPE_IPv6)
++ if (!(tmpHxs[hdrNum] & PRS_HDR_SW_PRS_EN))
++ tmpHxs[hdrNum] |= (PRS_HDR_SW_PRS_EN | IP_FRAG_SW_PATCH_IPv6_LABEL);
++ }
++
++#ifdef FM_CAPWAP_SUPPORT
++ if (FmPcdNetEnvIsHdrExist(p_FmPort->h_FmPcd,
++ p_FmPort->netEnvId, HEADER_TYPE_UDP_LITE))
++ {
++ /* link to sw parser code for udp lite - only if no other code is applied. */
++ GET_PRS_HDR_NUM(hdrNum, HEADER_TYPE_USER_DEFINED_L4)
++ if (!(tmpHxs[hdrNum] & PRS_HDR_SW_PRS_EN))
++ tmpHxs[hdrNum] |= (PRS_HDR_SW_PRS_EN | UDP_LITE_SW_PATCH_LABEL);
++ }
++#endif /* FM_CAPWAP_SUPPORT */
++ for (i=0 ; ip_FmPortPrsRegs->hdrs[i].lcv,
++ FmPcdGetLcv(p_FmPort->h_FmPcd, p_FmPort->netEnvId, (uint8_t)i));
++ /* set HXS register according to default+Additional params+protocol options */
++ WRITE_UINT32(p_FmPort->p_FmPortPrsRegs->hdrs[i].softSeqAttach, tmpHxs[i]);
++ }
++
++ /* set tpid. */
++ tmpReg = PRS_TPID_DFLT;
++ if (p_PcdParams->p_PrsParams->setVlanTpid1)
++ {
++ tmpReg &= PRS_TPID2_MASK;
++ tmpReg |= (uint32_t)p_PcdParams->p_PrsParams->vlanTpid1 << PRS_PCTPID_SHIFT;
++ }
++ if (p_PcdParams->p_PrsParams->setVlanTpid2)
++ {
++ tmpReg &= PRS_TPID1_MASK;
++ tmpReg |= (uint32_t)p_PcdParams->p_PrsParams->vlanTpid2;
++ }
++ WRITE_UINT32(p_FmPort->p_FmPortPrsRegs->pctpid, tmpReg);
++
++ /* enable parser */
++ WRITE_UINT32(p_FmPort->p_FmPortPrsRegs->pcac, 0);
++
++ if (p_PcdParams->p_PrsParams->prsResultPrivateInfo)
++ p_FmPort->privateInfo = p_PcdParams->p_PrsParams->prsResultPrivateInfo;
++
++ } /* end parser */
++ else
++ p_FmPort->privateInfo = 0;
++
++ WRITE_UINT32(*p_BmiPrsStartOffset, GET_UINT32(*p_BmiPrsStartOffset) + p_FmPort->internalBufferOffset);
++
++ /* set initial parser result - used for all engines */
++ for (i=0;iprivateInfo << BMI_PR_PORTID_SHIFT)
++ | BMI_PRS_RESULT_HIGH));
++ else
++ {
++ if (i< FM_PORT_PRS_RESULT_NUM_OF_WORDS/2)
++ WRITE_UINT32(*(p_BmiInitPrsResult+i), BMI_PRS_RESULT_HIGH);
++ else
++ WRITE_UINT32(*(p_BmiInitPrsResult+i), BMI_PRS_RESULT_LOW);
++ }
++ }
++
++ return E_OK;
++}
++
++static t_Error DeletePcd(t_FmPort *p_FmPort)
++{
++ t_Error err = E_OK;
++ volatile uint32_t *p_BmiNia=NULL;
++ volatile uint32_t *p_BmiPrsStartOffset = NULL;
++
++ ASSERT_COND(p_FmPort);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPort->p_FmPortDriverParam, E_INVALID_STATE);
++
++ if (p_FmPort->imEn)
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("available for non-independant mode ports only"));
++
++ if ((p_FmPort->portType != e_FM_PORT_TYPE_RX_10G) &&
++ (p_FmPort->portType != e_FM_PORT_TYPE_RX) &&
++ (p_FmPort->portType != e_FM_PORT_TYPE_OH_OFFLINE_PARSING))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("available for Rx and offline parsing ports only"));
++
++ if (!p_FmPort->pcdEngines)
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("called for non PCD port"));
++
++ /* get PCD registers pointers */
++ switch (p_FmPort->portType)
++ {
++ case (e_FM_PORT_TYPE_RX_10G):
++ case (e_FM_PORT_TYPE_RX):
++ p_BmiNia = &p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rfne;
++ p_BmiPrsStartOffset = &p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rpso;
++ break;
++ case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
++ p_BmiNia = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_ofne;
++ p_BmiPrsStartOffset = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_opso;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid port type"));
++ }
++
++ if ((GET_UINT32(*p_BmiNia) & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)) != (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("port has to be detached previousely"));
++
++ /* "cut" PCD out of the port's flow - go to BMI */
++ /* WRITE_UINT32(*p_BmiNia, (p_FmPort->savedBmiNia & BMI_RFNE_FDCS_MASK) | (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)); */
++
++ if (p_FmPort->pcdEngines | FM_PCD_PRS)
++ {
++ WRITE_UINT32(*p_BmiPrsStartOffset, 0);
++
++ /* stop parser */
++ WRITE_UINT32(p_FmPort->p_FmPortPrsRegs->pcac, PRS_CAC_STOP);
++ /* wait for parser to be in idle state */
++ while (GET_UINT32(p_FmPort->p_FmPortPrsRegs->pcac) & PRS_CAC_ACTIVE) ;
++ }
++
++ if (p_FmPort->pcdEngines & FM_PCD_KG)
++ {
++ t_FmPcdKgInterModuleBindPortToSchemes schemeBind;
++
++ /* unbind all schemes */
++ p_FmPort->schemesPerPortVector = GetPortSchemeBindParams(p_FmPort, &schemeBind);
++
++ err = FmPcdKgUnbindPortToSchemes(p_FmPort->h_FmPcd, &schemeBind);
++ if (err)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++
++ err = FmPcdKgDeleteOrUnbindPortToClsPlanGrp(p_FmPort->h_FmPcd, p_FmPort->hardwarePortId, p_FmPort->clsPlanGrpId);
++ if (err)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++ p_FmPort->useClsPlan = FALSE;
++ }
++
++ if (p_FmPort->pcdEngines & FM_PCD_CC)
++ {
++ /* unbind - we need to get the treeId too */
++ err = FmPcdCcUnbindTree(p_FmPort->h_FmPcd, p_FmPort->ccTreeId);
++ if (err)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++ }
++
++ p_FmPort->pcdEngines = 0;
++
++ return E_OK;
++}
++
++static t_Error AttachPCD(t_FmPort *p_FmPort)
++{
++ volatile uint32_t *p_BmiNia=NULL;
++
++ ASSERT_COND(p_FmPort);
++
++ /* get PCD registers pointers */
++ switch (p_FmPort->portType)
++ {
++ case (e_FM_PORT_TYPE_RX_10G):
++ case (e_FM_PORT_TYPE_RX):
++ p_BmiNia = &p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rfne;
++ break;
++ case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
++ p_BmiNia = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_ofne;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("available for Rx and offline parsing ports only"));
++ }
++
++ if (p_FmPort->requiredAction & UPDATE_FMFP_PRC_WITH_ONE_RISC_ONLY)
++ if (FmSetNumOfRiscsPerPort(p_FmPort->h_Fm, p_FmPort->hardwarePortId, 1, p_FmPort->orFmanCtrl)!= E_OK)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
++
++ /* check that current NIA is BMI to BMI */
++ if ((GET_UINT32(*p_BmiNia) & ~BMI_RFNE_FDCS_MASK) != (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION,
++ ("may be called only for ports in BMI-to-BMI state."));
++
++ WRITE_UINT32(*p_BmiNia, p_FmPort->savedBmiNia);
++
++ if (p_FmPort->requiredAction & UPDATE_NIA_PNEN)
++ WRITE_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnen, p_FmPort->savedQmiPnen);
++
++ if (p_FmPort->requiredAction & UPDATE_NIA_PNDN)
++ WRITE_UINT32(p_FmPort->p_FmPortQmiRegs->nonRxQmiRegs.fmqm_pndn, p_FmPort->savedNonRxQmiRegsPndn);
++
++ if (p_FmPort->requiredAction & UPDATE_NIA_FENE)
++ {
++ if (p_FmPort->portType == e_FM_PORT_TYPE_OH_OFFLINE_PARSING)
++ WRITE_UINT32(p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_ofene, p_FmPort->savedBmiFene);
++ else
++ WRITE_UINT32(p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rfene, p_FmPort->savedBmiFene);
++ }
++ if (p_FmPort->requiredAction & UPDATE_NIA_FPNE)
++ {
++ if (p_FmPort->portType == e_FM_PORT_TYPE_OH_OFFLINE_PARSING)
++ WRITE_UINT32(p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_ofpne, p_FmPort->savedBmiFpne);
++ else
++ WRITE_UINT32(p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rfpne, p_FmPort->savedBmiFpne);
++ }
++ if (p_FmPort->requiredAction & UPDATE_NIA_CMNE)
++ {
++ if (p_FmPort->portType == e_FM_PORT_TYPE_OH_OFFLINE_PARSING)
++ WRITE_UINT32(p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_ocmne, p_FmPort->savedBmiCmne);
++ else
++ WRITE_UINT32(p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rcmne, p_FmPort->savedBmiCmne);
++ }
++
++ return E_OK;
++}
++
++static t_Error DetachPCD(t_FmPort *p_FmPort)
++{
++ volatile uint32_t *p_BmiNia=NULL;
++
++ ASSERT_COND(p_FmPort);
++
++ /* get PCD registers pointers */
++ switch (p_FmPort->portType)
++ {
++ case (e_FM_PORT_TYPE_RX_10G):
++ case (e_FM_PORT_TYPE_RX):
++ p_BmiNia = &p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rfne;
++ break;
++ case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
++ p_BmiNia = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_ofne;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("available for Rx and offline parsing ports only"));
++ }
++
++ WRITE_UINT32(*p_BmiNia, (p_FmPort->savedBmiNia & BMI_RFNE_FDCS_MASK) | (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME));
++
++ if (p_FmPort->requiredAction & UPDATE_NIA_PNEN)
++ {
++ switch (p_FmPort->portType)
++ {
++ case (e_FM_PORT_TYPE_TX_10G):
++ case (e_FM_PORT_TYPE_TX):
++ WRITE_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnen, NIA_ENG_BMI | NIA_BMI_AC_TX_RELEASE);
++ break;
++ case (e_FM_PORT_TYPE_OH_HOST_COMMAND):
++ case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
++ case (e_FM_PORT_TYPE_RX):
++ case (e_FM_PORT_TYPE_RX_10G):
++ WRITE_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnen, NIA_ENG_BMI | NIA_BMI_AC_RELEASE);
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Can not reach this stage"));
++ }
++ }
++
++ if (p_FmPort->requiredAction & UPDATE_NIA_PNDN)
++ {
++ switch (p_FmPort->portType)
++ {
++ case (e_FM_PORT_TYPE_TX_10G):
++ case (e_FM_PORT_TYPE_TX):
++ WRITE_UINT32(p_FmPort->p_FmPortQmiRegs->nonRxQmiRegs.fmqm_pndn, NIA_ENG_BMI | NIA_BMI_AC_TX);
++ break;
++ case (e_FM_PORT_TYPE_OH_HOST_COMMAND):
++ case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
++ WRITE_UINT32(p_FmPort->p_FmPortQmiRegs->nonRxQmiRegs.fmqm_pndn, NIA_ENG_BMI | NIA_BMI_AC_FETCH);
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Can not reach this stage"));
++ }
++ }
++
++ if (p_FmPort->requiredAction & UPDATE_NIA_FENE)
++ {
++ if (p_FmPort->portType == e_FM_PORT_TYPE_OH_OFFLINE_PARSING)
++ WRITE_UINT32(p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_ofene, NIA_ENG_QMI_ENQ | NIA_ORDER_RESTOR);
++ else
++ WRITE_UINT32(p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rfene, NIA_ENG_QMI_ENQ | NIA_ORDER_RESTOR);
++ }
++
++ if (p_FmPort->requiredAction & UPDATE_FMFP_PRC_WITH_ONE_RISC_ONLY)
++ if (FmSetNumOfRiscsPerPort(p_FmPort->h_Fm, p_FmPort->hardwarePortId, 2, p_FmPort->orFmanCtrl)!= E_OK)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
++
++ p_FmPort->requiredAction = 0;
++
++ return E_OK;
++}
++
++
++/*****************************************************************************/
++/* Inter-module API routines */
++/*****************************************************************************/
++
++void FmPortSetMacsecLcv(t_Handle h_FmPort)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ volatile uint32_t *p_BmiCfgReg = NULL;
++ uint32_t macsecEn = BMI_PORT_CFG_EN_MACSEC;
++ uint32_t lcv, walking1Mask = 0x80000000;
++ uint8_t cnt = 0;
++
++ SANITY_CHECK_RETURN(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN(!p_FmPort->p_FmPortDriverParam, E_INVALID_STATE);
++
++ if ((p_FmPort->portType != e_FM_PORT_TYPE_RX_10G) && (p_FmPort->portType != e_FM_PORT_TYPE_RX))
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_OPERATION, ("The routine is relevant for Rx ports only"));
++ return;
++ }
++
++ p_BmiCfgReg = &p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rcfg;
++ /* get LCV for MACSEC */
++ if ((p_FmPort->h_FmPcd) && ((lcv = FmPcdGetMacsecLcv(p_FmPort->h_FmPcd, p_FmPort->netEnvId))!= 0))
++ {
++ while (!(lcv & walking1Mask))
++ {
++ cnt++;
++ walking1Mask >>= 1;
++ }
++
++ macsecEn |= (uint32_t)cnt << BMI_PORT_CFG_MS_SEL_SHIFT;
++ }
++
++ WRITE_UINT32(*p_BmiCfgReg, GET_UINT32(*p_BmiCfgReg) | macsecEn);
++}
++
++void FmPortSetMacsecCmd(t_Handle h_FmPort, uint8_t dfltSci)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ volatile uint32_t *p_BmiCfgReg = NULL;
++ uint32_t tmpReg;
++
++ SANITY_CHECK_RETURN(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN(p_FmPort->p_FmPortDriverParam, E_INVALID_STATE);
++
++ if ((p_FmPort->portType != e_FM_PORT_TYPE_TX_10G) && (p_FmPort->portType != e_FM_PORT_TYPE_TX))
++ {
++ REPORT_ERROR(MAJOR, E_INVALID_OPERATION, ("The routine is relevant for Tx ports only"));
++ return;
++ }
++
++ p_BmiCfgReg = &p_FmPort->p_FmPortBmiRegs->txPortBmiRegs.fmbm_tfca;
++ tmpReg = GET_UINT32(*p_BmiCfgReg) & ~BMI_CMD_ATTR_MACCMD_MASK;
++ tmpReg |= BMI_CMD_ATTR_MACCMD_SECURED;
++ tmpReg |= (((uint32_t)dfltSci << BMI_CMD_ATTR_MACCMD_SC_SHIFT) & BMI_CMD_ATTR_MACCMD_SC_MASK);
++
++ WRITE_UINT32(*p_BmiCfgReg, tmpReg);
++}
++
++uint8_t FmPortGetNetEnvId(t_Handle h_FmPort)
++{
++ return ((t_FmPort*)h_FmPort)->netEnvId;
++}
++
++uint8_t FmPortGetHardwarePortId(t_Handle h_FmPort)
++{
++ return ((t_FmPort*)h_FmPort)->hardwarePortId;
++}
++
++uint32_t FmPortGetPcdEngines(t_Handle h_FmPort)
++{
++ return ((t_FmPort*)h_FmPort)->pcdEngines;
++}
++
++#if (DPAA_VERSION >= 11)
++t_Error FmPortSetGprFunc(t_Handle h_FmPort, e_FmPortGprFuncType gprFunc, void **p_Value)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ uint32_t muramPageOffset;
++
++ ASSERT_COND(p_FmPort);
++ ASSERT_COND(p_Value);
++
++ if (p_FmPort->gprFunc != e_FM_PORT_GPR_EMPTY)
++ {
++ if (p_FmPort->gprFunc != gprFunc)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("gpr was assigned with different func"));
++ }
++ else
++ {
++ switch (gprFunc)
++ {
++ case (e_FM_PORT_GPR_MURAM_PAGE):
++ p_FmPort->p_MuramPage = FM_MURAM_AllocMem(p_FmPort->h_FmMuram,
++ 256,
++ 8);
++ if (!p_FmPort->p_MuramPage)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for page"));
++
++ IOMemSet32(p_FmPort->p_MuramPage, 0, 256);
++ muramPageOffset = (uint32_t)(XX_VirtToPhys(p_FmPort->p_MuramPage) -
++ p_FmPort->fmMuramPhysBaseAddr);
++ switch (p_FmPort->portType)
++ {
++ case (e_FM_PORT_TYPE_RX_10G):
++ case (e_FM_PORT_TYPE_RX):
++ WRITE_UINT32(p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rgpr, muramPageOffset);
++ break;
++ case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
++ WRITE_UINT32(p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_ogpr, muramPageOffset);
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid port type"));
++ }
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
++ }
++ p_FmPort->gprFunc = gprFunc;
++ }
++
++ switch (p_FmPort->gprFunc)
++ {
++ case (e_FM_PORT_GPR_MURAM_PAGE):
++ *p_Value = p_FmPort->p_MuramPage;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
++ }
++
++ return E_OK;
++}
++#endif /* (DPAA_VERSION >= 11) */
++
++t_Error FmPortGetSetCcParams(t_Handle h_FmPort, t_FmPortGetSetCcParams *p_CcParams)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ int tmpInt;
++ volatile uint32_t *p_BmiPrsStartOffset = NULL;
++
++ /* this function called from Cc for pass and receive parameters port params between CC and PORT*/
++
++ if ((p_CcParams->getCcParams.type & OFFSET_OF_PR) &&
++ (p_FmPort->bufferOffsets.prsResultOffset != ILLEGAL_BASE))
++ {
++ p_CcParams->getCcParams.prOffset = (uint8_t)p_FmPort->bufferOffsets.prsResultOffset;
++ p_CcParams->getCcParams.type &= ~OFFSET_OF_PR;
++ }
++ if (p_CcParams->getCcParams.type & HW_PORT_ID)
++ {
++ p_CcParams->getCcParams.hardwarePortId = (uint8_t)p_FmPort->hardwarePortId;
++ p_CcParams->getCcParams.type &= ~HW_PORT_ID;
++ }
++ if ((p_CcParams->getCcParams.type & OFFSET_OF_DATA) &&
++ (p_FmPort->bufferOffsets.dataOffset != ILLEGAL_BASE))
++ {
++ p_CcParams->getCcParams.dataOffset = (uint16_t)p_FmPort->bufferOffsets.dataOffset;
++ p_CcParams->getCcParams.type &= ~OFFSET_OF_DATA;
++ }
++ if (p_CcParams->getCcParams.type & NUM_OF_TASKS)
++ {
++ p_CcParams->getCcParams.numOfTasks = (uint8_t)p_FmPort->tasks.num;
++ p_CcParams->getCcParams.type &= ~NUM_OF_TASKS;
++ }
++ if (p_CcParams->getCcParams.type & NUM_OF_EXTRA_TASKS)
++ {
++ p_CcParams->getCcParams.numOfExtraTasks = (uint8_t)p_FmPort->tasks.extra;
++ p_CcParams->getCcParams.type &= ~NUM_OF_EXTRA_TASKS;
++ }
++ if (p_CcParams->getCcParams.type & FM_REV)
++ {
++ p_CcParams->getCcParams.revInfo.majorRev = p_FmPort->fmRevInfo.majorRev;
++ p_CcParams->getCcParams.revInfo.minorRev = p_FmPort->fmRevInfo.minorRev;
++ p_CcParams->getCcParams.type &= ~FM_REV;
++ }
++ if (p_CcParams->getCcParams.type & GET_NIA_FPNE)
++ {
++ if (p_FmPort->portType == e_FM_PORT_TYPE_OH_OFFLINE_PARSING)
++ p_CcParams->getCcParams.nia = GET_UINT32(p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_ofpne);
++ else
++ p_CcParams->getCcParams.nia = GET_UINT32(p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rfpne);
++ p_CcParams->getCcParams.type &= ~GET_NIA_FPNE;
++ }
++ if (p_CcParams->getCcParams.type & GET_NIA_PNDN)
++ {
++ if (p_FmPort->portType != e_FM_PORT_TYPE_OH_OFFLINE_PARSING)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid port type"));
++ p_CcParams->getCcParams.nia = GET_UINT32(p_FmPort->p_FmPortQmiRegs->nonRxQmiRegs.fmqm_pndn);
++ p_CcParams->getCcParams.type &= ~GET_NIA_PNDN;
++ }
++
++ if ((p_CcParams->setCcParams.type & UPDATE_FMFP_PRC_WITH_ONE_RISC_ONLY) &&
++ !(p_FmPort->requiredAction & UPDATE_FMFP_PRC_WITH_ONE_RISC_ONLY))
++ {
++ p_FmPort->requiredAction |= UPDATE_FMFP_PRC_WITH_ONE_RISC_ONLY;
++ p_FmPort->orFmanCtrl = p_CcParams->setCcParams.orFmanCtrl;
++ }
++
++ if ((p_CcParams->setCcParams.type & UPDATE_NIA_PNEN) &&
++ !(p_FmPort->requiredAction & UPDATE_NIA_PNEN))
++ {
++ p_FmPort->savedQmiPnen = p_CcParams->setCcParams.nia;
++ p_FmPort->requiredAction |= UPDATE_NIA_PNEN;
++ }
++ else if (p_CcParams->setCcParams.type & UPDATE_NIA_PNEN)
++ {
++ if (p_FmPort->savedQmiPnen != p_CcParams->setCcParams.nia)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("PNEN was defined previously different"));
++ }
++
++ if ((p_CcParams->setCcParams.type & UPDATE_NIA_PNDN) &&
++ !(p_FmPort->requiredAction & UPDATE_NIA_PNDN))
++ {
++ p_FmPort->savedNonRxQmiRegsPndn = p_CcParams->setCcParams.nia;
++ p_FmPort->requiredAction |= UPDATE_NIA_PNDN;
++ }
++ else if (p_CcParams->setCcParams.type & UPDATE_NIA_PNDN)
++ {
++ if (p_FmPort->savedNonRxQmiRegsPndn != p_CcParams->setCcParams.nia)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("PNDN was defined previously different"));
++ }
++
++ if ((p_CcParams->setCcParams.type & UPDATE_NIA_FENE) &&
++ (p_CcParams->setCcParams.overwrite ||
++ !(p_FmPort->requiredAction & UPDATE_NIA_FENE)))
++ {
++ p_FmPort->savedBmiFene = p_CcParams->setCcParams.nia;
++ p_FmPort->requiredAction |= UPDATE_NIA_FENE;
++ }
++ else if (p_CcParams->setCcParams.type & UPDATE_NIA_FENE)
++ {
++ if (p_FmPort->savedBmiFene != p_CcParams->setCcParams.nia)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("xFENE was defined previously different"));
++ }
++
++ if ((p_CcParams->setCcParams.type & UPDATE_NIA_FPNE) &&
++ !(p_FmPort->requiredAction & UPDATE_NIA_FPNE))
++ {
++ p_FmPort->savedBmiFpne = p_CcParams->setCcParams.nia;
++ p_FmPort->requiredAction |= UPDATE_NIA_FPNE;
++ }
++ else if (p_CcParams->setCcParams.type & UPDATE_NIA_FPNE)
++ {
++ if (p_FmPort->savedBmiFpne != p_CcParams->setCcParams.nia)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("xFPNE was defined previously different"));
++ }
++
++ if ((p_CcParams->setCcParams.type & UPDATE_NIA_CMNE) &&
++ !(p_FmPort->requiredAction & UPDATE_NIA_CMNE))
++ {
++ p_FmPort->savedBmiCmne = p_CcParams->setCcParams.nia;
++ p_FmPort->requiredAction |= UPDATE_NIA_CMNE;
++ }
++ else if (p_CcParams->setCcParams.type & UPDATE_NIA_CMNE)
++ {
++ if (p_FmPort->savedBmiCmne != p_CcParams->setCcParams.nia)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("xCMNE was defined previously different"));
++ }
++
++ if ((p_CcParams->setCcParams.type & UPDATE_PSO) &&
++ !(p_FmPort->requiredAction & UPDATE_PSO))
++ {
++ /* get PCD registers pointers */
++ switch (p_FmPort->portType)
++ {
++ case (e_FM_PORT_TYPE_RX_10G):
++ case (e_FM_PORT_TYPE_RX):
++ p_BmiPrsStartOffset = &p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rpso;
++ break;
++ case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
++ p_BmiPrsStartOffset = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_opso;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid port type"));
++ }
++ /* set start parsing offset */
++ tmpInt = (int)GET_UINT32(*p_BmiPrsStartOffset)+ p_CcParams->setCcParams.psoSize;
++ if (tmpInt>0)
++ WRITE_UINT32(*p_BmiPrsStartOffset, (uint32_t)tmpInt);
++
++ p_FmPort->requiredAction |= UPDATE_PSO;
++ p_FmPort->savedPrsStartOffset = p_CcParams->setCcParams.psoSize;
++
++ }
++ else if (p_CcParams->setCcParams.type & UPDATE_PSO)
++ {
++ if (p_FmPort->savedPrsStartOffset != p_CcParams->setCcParams.psoSize)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("parser start offset was defoned previousley different"));
++ }
++
++ return E_OK;
++}
++/*********************** End of inter-module routines ************************/
++
++
++/****************************************/
++/* API Init unit functions */
++/****************************************/
++
++t_Handle FM_PORT_Config(t_FmPortParams *p_FmPortParams)
++{
++ t_FmPort *p_FmPort;
++ uintptr_t baseAddr = p_FmPortParams->baseAddr;
++ uint32_t tmpReg;
++
++ /* Allocate FM structure */
++ p_FmPort = (t_FmPort *) XX_Malloc(sizeof(t_FmPort));
++ if (!p_FmPort)
++ {
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Port driver structure"));
++ return NULL;
++ }
++ memset(p_FmPort, 0, sizeof(t_FmPort));
++
++ /* Allocate the FM driver's parameters structure */
++ p_FmPort->p_FmPortDriverParam = (t_FmPortDriverParam *)XX_Malloc(sizeof(t_FmPortDriverParam));
++ if (!p_FmPort->p_FmPortDriverParam)
++ {
++ XX_Free(p_FmPort);
++ REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Port driver parameters"));
++ return NULL;
++ }
++ memset(p_FmPort->p_FmPortDriverParam, 0, sizeof(t_FmPortDriverParam));
++
++ /* Initialize FM port parameters which will be kept by the driver */
++ p_FmPort->portType = p_FmPortParams->portType;
++ p_FmPort->portId = p_FmPortParams->portId;
++ p_FmPort->pcdEngines = FM_PCD_NONE;
++ p_FmPort->f_Exception = p_FmPortParams->f_Exception;
++ p_FmPort->h_App = p_FmPortParams->h_App;
++ p_FmPort->h_Fm = p_FmPortParams->h_Fm;
++
++ /* get FM revision */
++ FM_GetRevision(p_FmPort->h_Fm, &p_FmPort->fmRevInfo);
++
++ /* calculate global portId number */
++ SW_PORT_ID_TO_HW_PORT_ID(p_FmPort->hardwarePortId, p_FmPort->portType, p_FmPortParams->portId);
++
++ if (p_FmPort->fmRevInfo.majorRev >= 6)
++ {
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_OH_HOST_COMMAND) &&
++ (p_FmPortParams->portId != FM_OH_PORT_ID))
++ DBG(WARNING,
++ ("Port ID %d is recommended for HC port. Overwriting HW defaults to be suitable for HC.",
++ FM_OH_PORT_ID));
++
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_OH_OFFLINE_PARSING) &&
++ (p_FmPortParams->portId == FM_OH_PORT_ID))
++ DBG(WARNING, ("Use non-zero portId for OP port due to insufficient resources on portId 0."));
++ }
++
++ /* Initialize FM port parameters for initialization phase only */
++ p_FmPort->p_FmPortDriverParam->baseAddr = baseAddr;
++ /* set memory map pointers */
++ p_FmPort->p_FmPortQmiRegs = (t_FmPortQmiRegs *)UINT_TO_PTR(baseAddr + QMI_PORT_REGS_OFFSET);
++ p_FmPort->p_FmPortBmiRegs = (u_FmPortBmiRegs *)UINT_TO_PTR(baseAddr + BMI_PORT_REGS_OFFSET);
++ p_FmPort->p_FmPortPrsRegs = (t_FmPortPrsRegs *)UINT_TO_PTR(baseAddr + PRS_PORT_REGS_OFFSET);
++
++ p_FmPort->p_FmPortDriverParam->bufferPrefixContent.privDataSize = DEFAULT_PORT_bufferPrefixContent_privDataSize;
++ p_FmPort->p_FmPortDriverParam->bufferPrefixContent.passPrsResult= DEFAULT_PORT_bufferPrefixContent_passPrsResult;
++ p_FmPort->p_FmPortDriverParam->bufferPrefixContent.passTimeStamp= DEFAULT_PORT_bufferPrefixContent_passTimeStamp;
++ p_FmPort->p_FmPortDriverParam->bufferPrefixContent.passAllOtherPCDInfo
++ = DEFAULT_PORT_bufferPrefixContent_passTimeStamp;
++ p_FmPort->p_FmPortDriverParam->bufferPrefixContent.dataAlign = DEFAULT_PORT_bufferPrefixContent_dataAlign;
++ p_FmPort->p_FmPortDriverParam->dmaSwapData = DEFAULT_PORT_dmaSwapData;
++ p_FmPort->p_FmPortDriverParam->dmaIntContextCacheAttr = DEFAULT_PORT_dmaIntContextCacheAttr;
++ p_FmPort->p_FmPortDriverParam->dmaHeaderCacheAttr = DEFAULT_PORT_dmaHeaderCacheAttr;
++ p_FmPort->p_FmPortDriverParam->dmaScatterGatherCacheAttr = DEFAULT_PORT_dmaScatterGatherCacheAttr;
++ p_FmPort->p_FmPortDriverParam->dmaWriteOptimize = DEFAULT_PORT_dmaWriteOptimize;
++ p_FmPort->p_FmPortDriverParam->liodnBase = p_FmPortParams->liodnBase;
++ p_FmPort->p_FmPortDriverParam->cheksumLastBytesIgnore = DEFAULT_PORT_cheksumLastBytesIgnore;
++ p_FmPort->p_FmPortDriverParam->color = DEFAULT_PORT_color;
++
++ p_FmPort->maxFrameLength = DEFAULT_PORT_maxFrameLength;
++ /* resource distribution. */
++#ifdef FM_NO_GUARANTEED_RESET_VALUES
++ if (1) /* if (p_FmPort->fmRevInfo.majorRev < 6) */
++ {
++ p_FmPort->fifoBufs.num = DEFAULT_PORT_numOfFifoBufs(p_FmPort->portType)*BMI_FIFO_UNITS;
++ p_FmPort->fifoBufs.extra = DEFAULT_PORT_extraNumOfFifoBufs*BMI_FIFO_UNITS;
++ p_FmPort->openDmas.num = DEFAULT_PORT_numOfOpenDmas(p_FmPort->portType, p_FmPort->fmRevInfo.majorRev);
++ p_FmPort->openDmas.extra = DEFAULT_PORT_extraNumOfOpenDmas(p_FmPort->portType);
++ p_FmPort->tasks.num = DEFAULT_PORT_numOfTasks(p_FmPort->portType);
++ p_FmPort->tasks.extra = DEFAULT_PORT_extraNumOfTasks(p_FmPort->portType);
++ }
++ else
++#endif /* FM_NO_GUARANTEED_RESET_VALUES */
++ {
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_OH_HOST_COMMAND) &&
++ (p_FmPortParams->portId != FM_OH_PORT_ID))
++ {
++ /* Overwrite HC defaults */
++ p_FmPort->fifoBufs.num = DEFAULT_PORT_numOfFifoBufs(p_FmPort->portType)*BMI_FIFO_UNITS;
++ p_FmPort->fifoBufs.extra = DEFAULT_PORT_extraNumOfFifoBufs*BMI_FIFO_UNITS;
++ p_FmPort->openDmas.num = DEFAULT_PORT_numOfOpenDmas(p_FmPort->portType, p_FmPort->fmRevInfo.majorRev);
++ p_FmPort->openDmas.extra = DEFAULT_PORT_extraNumOfOpenDmas(p_FmPort->portType);
++ p_FmPort->tasks.num = DEFAULT_PORT_numOfTasks(p_FmPort->portType);
++ p_FmPort->tasks.extra = DEFAULT_PORT_extraNumOfTasks(p_FmPort->portType);
++ }
++ else
++ {
++ p_FmPort->fifoBufs.num = 0;
++ p_FmPort->fifoBufs.extra = 0;
++ p_FmPort->openDmas.num = 0;
++ p_FmPort->openDmas.extra = 0;
++ p_FmPort->tasks.num = 0;
++ p_FmPort->tasks.extra = 0;
++ }
++ }
++
++ if (p_FmPort->portType == e_FM_PORT_TYPE_OH_HOST_COMMAND)
++ p_FmPort->p_FmPortDriverParam->syncReq = DEFAULT_PORT_syncReqForHc;
++ else
++ p_FmPort->p_FmPortDriverParam->syncReq = DEFAULT_PORT_syncReq;
++
++ /* Port type specific initialization: */
++ if ((p_FmPort->portType != e_FM_PORT_TYPE_TX) &&
++ (p_FmPort->portType != e_FM_PORT_TYPE_TX_10G))
++ p_FmPort->p_FmPortDriverParam->frmDiscardOverride = DEFAULT_PORT_frmDiscardOverride;
++
++ switch (p_FmPort->portType)
++ {
++ case (e_FM_PORT_TYPE_RX):
++ case (e_FM_PORT_TYPE_RX_10G):
++ /* Initialize FM port parameters for initialization phase only */
++ p_FmPort->p_FmPortDriverParam->cutBytesFromEnd = DEFAULT_PORT_cutBytesFromEnd;
++ p_FmPort->p_FmPortDriverParam->enBufPoolDepletion = FALSE;
++ p_FmPort->p_FmPortDriverParam->frmDiscardOverride = DEFAULT_PORT_frmDiscardOverride;
++#ifdef FM_NO_GUARANTEED_RESET_VALUES
++ if (1) /* if (p_FmPort->fmRevInfo.majorRev < 6) */
++ {
++ p_FmPort->p_FmPortDriverParam->rxFifoPriElevationLevel = DEFAULT_PORT_rxFifoPriElevationLevel;
++ p_FmPort->p_FmPortDriverParam->rxFifoThreshold = DEFAULT_PORT_rxFifoThreshold;
++ }
++ else
++#endif /* FM_NO_GUARANTEED_RESET_VALUES */
++ {
++ tmpReg = GET_UINT32(p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rfp);
++ p_FmPort->p_FmPortDriverParam->rxFifoPriElevationLevel = (((tmpReg & BMI_RX_FIFO_PRI_ELEVATION_MASK) >> BMI_RX_FIFO_PRI_ELEVATION_SHIFT) + 1) * BMI_FIFO_UNITS ;
++ p_FmPort->p_FmPortDriverParam->rxFifoThreshold = (((tmpReg & BMI_RX_FIFO_THRESHOLD_MASK) >> BMI_RX_FIFO_THRESHOLD_SHIFT) + 1) * BMI_FIFO_UNITS;
++ }
++
++ p_FmPort->p_FmPortDriverParam->bufMargins.endMargins = DEFAULT_PORT_BufMargins_endMargins;
++ p_FmPort->p_FmPortDriverParam->errorsToDiscard = DEFAULT_PORT_errorsToDiscard;
++ p_FmPort->p_FmPortDriverParam->forwardReuseIntContext = DEFAULT_PORT_forwardIntContextReuse;
++#if (DPAA_VERSION >= 11)
++ p_FmPort->p_FmPortDriverParam->noScatherGather = DEFAULT_PORT_noScatherGather;
++#endif /* (DPAA_VERSION >= 11) */
++ break;
++
++ case (e_FM_PORT_TYPE_TX):
++ p_FmPort->p_FmPortDriverParam->dontReleaseBuf = FALSE;
++#ifdef FM_WRONG_RESET_VALUES_ERRATA_FMAN_A005127
++ tmpReg = 0x00001013;
++ WRITE_UINT32(p_FmPort->p_FmPortBmiRegs->txPortBmiRegs.fmbm_tfp, tmpReg);
++#endif /* FM_WRONG_RESET_VALUES_ERRATA_FMAN_A005127 */
++ case (e_FM_PORT_TYPE_TX_10G):
++#ifdef FM_NO_GUARANTEED_RESET_VALUES
++ if (1) /* if (p_FmPort->fmRevInfo.majorRev < 6) */
++ {
++ p_FmPort->p_FmPortDriverParam->txFifoMinFillLevel = DEFAULT_PORT_txFifoMinFillLevel;
++ p_FmPort->fifoDeqPipelineDepth =
++ (uint8_t)((p_FmPort->portType == e_FM_PORT_TYPE_TX) ?
++ DEFAULT_PORT_fifoDeqPipelineDepth_1G :
++ DEFAULT_PORT_fifoDeqPipelineDepth_10G);
++ p_FmPort->p_FmPortDriverParam->txFifoLowComfLevel = DEFAULT_PORT_txFifoLowComfLevel;
++ }
++ else
++#endif /* FM_NO_GUARANTEED_RESET_VALUES */
++ {
++ tmpReg = GET_UINT32(p_FmPort->p_FmPortBmiRegs->txPortBmiRegs.fmbm_tfp);
++ p_FmPort->p_FmPortDriverParam->txFifoMinFillLevel =
++ ((tmpReg & BMI_TX_FIFO_MIN_FILL_MASK) >> BMI_TX_FIFO_MIN_FILL_SHIFT) * BMI_FIFO_UNITS ;
++ p_FmPort->fifoDeqPipelineDepth =
++ (uint8_t)(((tmpReg & BMI_FIFO_PIPELINE_DEPTH_MASK) >> BMI_FIFO_PIPELINE_DEPTH_SHIFT) + 1);
++ p_FmPort->p_FmPortDriverParam->txFifoLowComfLevel =
++ (((tmpReg & BMI_TX_LOW_COMF_MASK) >> BMI_TX_LOW_COMF_SHIFT) + 1) * BMI_FIFO_UNITS;
++ }
++
++ p_FmPort->p_FmPortDriverParam->deqType = DEFAULT_PORT_deqType;
++ p_FmPort->p_FmPortDriverParam->deqPrefetchOption = DEFAULT_PORT_deqPrefetchOption;
++ p_FmPort->p_FmPortDriverParam->deqHighPriority =
++ (bool)((p_FmPort->portType == e_FM_PORT_TYPE_TX) ?
++ DEFAULT_PORT_deqHighPriority_1G :
++ DEFAULT_PORT_deqHighPriority_10G);
++ p_FmPort->p_FmPortDriverParam->deqByteCnt =
++ (uint16_t)((p_FmPort->portType == e_FM_PORT_TYPE_TX) ?
++ DEFAULT_PORT_deqByteCnt_1G :
++ DEFAULT_PORT_deqByteCnt_10G);
++ break;
++ case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
++ p_FmPort->p_FmPortDriverParam->errorsToDiscard = DEFAULT_PORT_errorsToDiscard;
++#if (DPAA_VERSION >= 11)
++ p_FmPort->p_FmPortDriverParam->noScatherGather = DEFAULT_PORT_noScatherGather;
++#endif /* (DPAA_VERSION >= 11) */
++ case (e_FM_PORT_TYPE_OH_HOST_COMMAND):
++ p_FmPort->p_FmPortDriverParam->deqPrefetchOption = DEFAULT_PORT_deqPrefetchOption_HC;
++ p_FmPort->p_FmPortDriverParam->deqHighPriority = DEFAULT_PORT_deqHighPriority_1G;
++ p_FmPort->p_FmPortDriverParam->deqType = DEFAULT_PORT_deqType;
++ p_FmPort->p_FmPortDriverParam->deqByteCnt = DEFAULT_PORT_deqByteCnt_1G;
++
++#ifdef FM_NO_GUARANTEED_RESET_VALUES
++ if (1) /* if (p_FmPort->fmRevInfo.majorRev < 6) */
++ p_FmPort->fifoDeqPipelineDepth = DEFAULT_PORT_fifoDeqPipelineDepth_OH;
++ else
++#endif /* FM_NO_GUARANTEED_RESET_VALUES */
++ {
++ tmpReg = GET_UINT32(p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_ofp);
++ p_FmPort->fifoDeqPipelineDepth =
++ (uint8_t)(((tmpReg & BMI_FIFO_PIPELINE_DEPTH_MASK) >> BMI_FIFO_PIPELINE_DEPTH_SHIFT) + 1);
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_OH_HOST_COMMAND) &&
++ (p_FmPortParams->portId != FM_OH_PORT_ID))
++ {
++ /* Overwrite HC defaults */
++ p_FmPort->fifoDeqPipelineDepth = DEFAULT_PORT_fifoDeqPipelineDepth_OH;
++ }
++ }
++
++#ifndef FM_FRAME_END_PARAMS_FOR_OP
++ if (p_FmPort->fmRevInfo.majorRev < 6)
++ p_FmPort->p_FmPortDriverParam->cheksumLastBytesIgnore = DEFAULT_notSupported;
++#endif /* !FM_FRAME_END_PARAMS_FOR_OP */
++
++#ifndef FM_DEQ_PIPELINE_PARAMS_FOR_OP
++ if (!((p_FmPort->fmRevInfo.majorRev == 4) ||
++ (p_FmPort->fmRevInfo.majorRev >= 6)))
++ p_FmPort->fifoDeqPipelineDepth = DEFAULT_notSupported;
++#endif /* !FM_DEQ_PIPELINE_PARAMS_FOR_OP */
++ break;
++
++ default:
++ XX_Free(p_FmPort->p_FmPortDriverParam);
++ XX_Free(p_FmPort);
++ REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Invalid port type"));
++ return NULL;
++ }
++#ifdef FM_QMI_NO_DEQ_OPTIONS_SUPPORT
++ if (p_FmPort->fmRevInfo.majorRev == 4)
++ p_FmPort->p_FmPortDriverParam->deqPrefetchOption = (e_FmPortDeqPrefetchOption)DEFAULT_notSupported;
++#endif /* FM_QMI_NO_DEQ_OPTIONS_SUPPORT */
++
++ p_FmPort->imEn = p_FmPortParams->independentModeEnable;
++
++ if (p_FmPort->imEn)
++ {
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_TX) ||
++ (p_FmPort->portType == e_FM_PORT_TYPE_TX_10G))
++ p_FmPort->fifoDeqPipelineDepth = DEFAULT_PORT_fifoDeqPipelineDepth_IM;
++ FmPortConfigIM(p_FmPort, p_FmPortParams);
++ }
++ else
++ {
++ switch (p_FmPort->portType)
++ {
++ case (e_FM_PORT_TYPE_RX):
++ case (e_FM_PORT_TYPE_RX_10G):
++ /* Initialize FM port parameters for initialization phase only */
++ memcpy(&p_FmPort->p_FmPortDriverParam->extBufPools,
++ &p_FmPortParams->specificParams.rxParams.extBufPools,
++ sizeof(t_FmExtPools));
++ p_FmPort->p_FmPortDriverParam->errFqid = p_FmPortParams->specificParams.rxParams.errFqid;
++ p_FmPort->p_FmPortDriverParam->dfltFqid = p_FmPortParams->specificParams.rxParams.dfltFqid;
++ p_FmPort->p_FmPortDriverParam->liodnOffset = p_FmPortParams->specificParams.rxParams.liodnOffset;
++ break;
++ case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
++ case (e_FM_PORT_TYPE_TX):
++ case (e_FM_PORT_TYPE_TX_10G):
++ case (e_FM_PORT_TYPE_OH_HOST_COMMAND):
++ p_FmPort->p_FmPortDriverParam->errFqid = p_FmPortParams->specificParams.nonRxParams.errFqid;
++ p_FmPort->p_FmPortDriverParam->deqSubPortal =
++ (uint8_t)(p_FmPortParams->specificParams.nonRxParams.qmChannel & QMI_DEQ_CFG_SUBPORTAL_MASK);
++ p_FmPort->p_FmPortDriverParam->dfltFqid = p_FmPortParams->specificParams.nonRxParams.dfltFqid;
++ break;
++ default:
++ XX_Free(p_FmPort->p_FmPortDriverParam);
++ XX_Free(p_FmPort);
++ REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Invalid port type"));
++ return NULL;
++ }
++ }
++
++ memset(p_FmPort->name, 0, (sizeof(char)) * MODULE_NAME_SIZE);
++ if (Sprint (p_FmPort->name, "FM-%d-port-%s-%d",
++ FmGetId(p_FmPort->h_Fm),
++ ((p_FmPort->portType == e_FM_PORT_TYPE_OH_OFFLINE_PARSING ||
++ (p_FmPort->portType == e_FM_PORT_TYPE_OH_HOST_COMMAND)) ?
++ "OH" : (p_FmPort->portType == e_FM_PORT_TYPE_RX ?
++ "1g-RX" : (p_FmPort->portType == e_FM_PORT_TYPE_TX ?
++ "1g-TX" : (p_FmPort->portType == e_FM_PORT_TYPE_RX_10G ?
++ "10g-RX" : "10g-TX")))),
++ p_FmPort->portId) == 0)
++ {
++ XX_Free(p_FmPort->p_FmPortDriverParam);
++ XX_Free(p_FmPort);
++ REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));
++ return NULL;
++ }
++
++ p_FmPort->h_Spinlock = XX_InitSpinlock();
++ if (!p_FmPort->h_Spinlock)
++ {
++ XX_Free(p_FmPort->p_FmPortDriverParam);
++ XX_Free(p_FmPort);
++ REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));
++ return NULL;
++ }
++
++ return p_FmPort;
++}
++
++/**************************************************************************//**
++ @Function FM_PORT_Init
++
++ @Description Initializes the FM module
++
++ @Param[in] h_FmPort - FM module descriptor
++
++ @Return E_OK on success; Error code otherwise.
++*//***************************************************************************/
++t_Error FM_PORT_Init(t_Handle h_FmPort)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ t_FmPortDriverParam *p_Params;
++ t_Error err = E_OK;
++ t_FmInterModulePortInitParams fmParams;
++
++ SANITY_CHECK_RETURN_ERROR(h_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++
++ err = FmSpBuildBufferStructure(&p_FmPort->p_FmPortDriverParam->intContext,
++ &p_FmPort->p_FmPortDriverParam->bufferPrefixContent,
++ &p_FmPort->p_FmPortDriverParam->bufMargins,
++ &p_FmPort->bufferOffsets,
++ &p_FmPort->internalBufferOffset);
++ if (err != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++#ifdef FM_HEAVY_TRAFFIC_HANG_ERRATA_FMAN_A005669
++ if ((p_FmPort->p_FmPortDriverParam->bcbWorkaround) &&
++ (p_FmPort->portType == e_FM_PORT_TYPE_RX))
++ {
++ p_FmPort->p_FmPortDriverParam->errorsToDiscard |= FM_PORT_FRM_ERR_PHYSICAL;
++ if (!p_FmPort->fifoBufs.num)
++ p_FmPort->fifoBufs.num = 50 * BMI_FIFO_UNITS;
++ p_FmPort->fifoBufs.num += 4*KILOBYTE;
++ }
++#endif /* FM_HEAVY_TRAFFIC_HANG_ERRATA_FMAN_A005669 */
++
++ CHECK_INIT_PARAMETERS(p_FmPort, CheckInitParameters);
++
++ p_Params = p_FmPort->p_FmPortDriverParam;
++
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_RX_10G) ||
++ (p_FmPort->portType == e_FM_PORT_TYPE_RX))
++ if (!p_FmPort->imEn)
++ {
++ /* Call the external Buffer routine which also checks fifo
++ size and updates it if necessary */
++ /* define external buffer pools and pool depletion*/
++ err = SetExtBufferPools(p_FmPort);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++
++ /************************************************************/
++ /* Call FM module routine for communicating parameters */
++ /************************************************************/
++ memset(&fmParams, 0, sizeof(fmParams));
++ fmParams.hardwarePortId = p_FmPort->hardwarePortId;
++ fmParams.portType = (e_FmPortType)p_FmPort->portType;
++ fmParams.numOfTasks = (uint8_t)p_FmPort->tasks.num;
++ fmParams.numOfExtraTasks = (uint8_t)p_FmPort->tasks.extra;
++ fmParams.numOfOpenDmas = (uint8_t)p_FmPort->openDmas.num;
++ fmParams.numOfExtraOpenDmas = (uint8_t)p_FmPort->openDmas.extra;
++ if (p_FmPort->fifoBufs.num)
++ {
++ err = VerifySizeOfFifo(p_FmPort);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ }
++ fmParams.sizeOfFifo = p_FmPort->fifoBufs.num;
++ fmParams.extraSizeOfFifo = p_FmPort->fifoBufs.extra;
++ fmParams.independentMode = p_FmPort->imEn;
++ fmParams.liodnOffset = p_Params->liodnOffset;
++ fmParams.liodnBase = p_Params->liodnBase;
++ fmParams.deqPipelineDepth = p_FmPort->fifoDeqPipelineDepth;
++ fmParams.maxFrameLength = p_FmPort->maxFrameLength;
++#ifndef FM_DEQ_PIPELINE_PARAMS_FOR_OP
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_OH_OFFLINE_PARSING) ||
++ (p_FmPort->portType == e_FM_PORT_TYPE_OH_HOST_COMMAND))
++ {
++ if (!((p_FmPort->fmRevInfo.majorRev == 4) ||
++ (p_FmPort->fmRevInfo.majorRev >= 6)))
++ /* HC ports do not have fifoDeqPipelineDepth, but it is needed only
++ * for deq threshold calculation.
++ */
++ fmParams.deqPipelineDepth = 2;
++ }
++#endif /* !FM_DEQ_PIPELINE_PARAMS_FOR_OP */
++
++
++ err = FmGetSetPortParams(p_FmPort->h_Fm, &fmParams);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ /* get params for use in init */
++ p_FmPort->fmMuramPhysBaseAddr =
++ (uint64_t)((uint64_t)(fmParams.fmMuramPhysBaseAddr.low) |
++ ((uint64_t)(fmParams.fmMuramPhysBaseAddr.high) << 32));
++ p_FmPort->h_FmMuram = FmGetMuramHandle(p_FmPort->h_Fm);
++
++#ifndef FM_NO_GUARANTEED_RESET_VALUES
++ if (p_FmPort->fmRevInfo.majorRev >= 6)
++ {
++ p_FmPort->tasks.num = fmParams.numOfTasks;
++ p_FmPort->tasks.extra = fmParams.numOfExtraTasks;
++ p_FmPort->openDmas.num = fmParams.numOfOpenDmas;
++ p_FmPort->openDmas.extra = fmParams.numOfExtraOpenDmas;
++ p_FmPort->fifoBufs.num = fmParams.sizeOfFifo;
++ p_FmPort->fifoBufs.extra = fmParams.extraSizeOfFifo;
++ }
++#endif /* FM_NO_GUARANTEED_RESET_VALUES */
++
++ /**********************/
++ /* Init BMI Registers */
++ /**********************/
++ switch (p_FmPort->portType)
++ {
++ case (e_FM_PORT_TYPE_RX_10G):
++ case (e_FM_PORT_TYPE_RX):
++ err = BmiRxPortInit(p_FmPort);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ break;
++ case (e_FM_PORT_TYPE_TX_10G):
++ case (e_FM_PORT_TYPE_TX):
++ err = BmiTxPortInit(p_FmPort);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ break;
++ case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
++ case (e_FM_PORT_TYPE_OH_HOST_COMMAND):
++ err = BmiOhPortInit(p_FmPort);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
++ }
++
++ /**********************/
++ /* Init QMI Registers */
++ /**********************/
++ if (!p_FmPort->imEn && ((err = QmiInit(p_FmPort)) != E_OK))
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ if (p_FmPort->imEn && ((err = FmPortImInit(p_FmPort)) != E_OK))
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ FmPortDriverParamFree(p_FmPort);
++
++ return E_OK;
++}
++
++/**************************************************************************//**
++ @Function FM_PORT_Free
++
++ @Description Frees all resources that were assigned to FM module.
++
++ Calling this routine invalidates the descriptor.
++
++ @Param[in] h_FmPort - FM module descriptor
++
++ @Return E_OK on success; Error code otherwise.
++*//***************************************************************************/
++t_Error FM_PORT_Free(t_Handle h_FmPort)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ t_FmInterModulePortFreeParams fmParams;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++
++ if (p_FmPort->pcdEngines)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Trying to free a port with PCD. FM_PORT_DeletePCD must be called first."));
++
++ if (p_FmPort->enabled)
++ {
++ if (FM_PORT_Disable(p_FmPort) != E_OK)
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("FM_PORT_Disable FAILED"));
++ }
++
++ if (p_FmPort->imEn)
++ FmPortImFree(p_FmPort);
++
++ FmPortDriverParamFree(p_FmPort);
++
++ fmParams.hardwarePortId = p_FmPort->hardwarePortId;
++ fmParams.portType = (e_FmPortType)p_FmPort->portType;
++ fmParams.deqPipelineDepth = p_FmPort->fifoDeqPipelineDepth;
++
++ FmFreePortParams(p_FmPort->h_Fm, &fmParams);
++
++#if (DPAA_VERSION >= 11)
++ if (FmVSPFreeForPort(p_FmPort->h_Fm,
++ p_FmPort->portType,
++ p_FmPort->portId) != E_OK)
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("VSP free of port FAILED"));
++
++ if (p_FmPort->p_MuramPage)
++ FM_MURAM_FreeMem(p_FmPort->h_FmMuram, p_FmPort->p_MuramPage);
++#endif /* (DPAA_VERSION >= 11) */
++
++ if (p_FmPort->h_Spinlock)
++ XX_FreeSpinlock(p_FmPort->h_Spinlock);
++
++ XX_Free(p_FmPort);
++
++ return E_OK;
++}
++
++
++/*************************************************/
++/* API Advanced Init unit functions */
++/*************************************************/
++
++t_Error FM_PORT_ConfigNumOfOpenDmas(t_Handle h_FmPort, t_FmPortRsrc *p_OpenDmas)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++
++ p_FmPort->p_FmPortDriverParam->setNumOfOpenDmas = TRUE;
++ memcpy(&p_FmPort->openDmas, p_OpenDmas, sizeof(t_FmPortRsrc));
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigNumOfTasks(t_Handle h_FmPort, t_FmPortRsrc *p_NumOfTasks)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++
++ memcpy(&p_FmPort->tasks, p_NumOfTasks, sizeof(t_FmPortRsrc));
++ p_FmPort->p_FmPortDriverParam->setNumOfTasks = TRUE;
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigSizeOfFifo(t_Handle h_FmPort, t_FmPortRsrc *p_SizeOfFifo)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++
++ p_FmPort->p_FmPortDriverParam->setSizeOfFifo = TRUE;
++ memcpy(&p_FmPort->fifoBufs, p_SizeOfFifo, sizeof(t_FmPortRsrc));
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigDeqHighPriority(t_Handle h_FmPort, bool highPri)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_RX_10G) || (p_FmPort->portType == e_FM_PORT_TYPE_RX))
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("not available for Rx ports"));
++
++ p_FmPort->p_FmPortDriverParam->deqHighPriority = highPri;
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigDeqType(t_Handle h_FmPort, e_FmPortDeqType deqType)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_RX_10G) || (p_FmPort->portType == e_FM_PORT_TYPE_RX))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("not available for Rx ports"));
++
++ p_FmPort->p_FmPortDriverParam->deqType = deqType;
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigDeqPrefetchOption(t_Handle h_FmPort, e_FmPortDeqPrefetchOption deqPrefetchOption)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_RX_10G) || (p_FmPort->portType == e_FM_PORT_TYPE_RX))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("not available for Rx ports"));
++ p_FmPort->p_FmPortDriverParam->deqPrefetchOption = deqPrefetchOption;
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigBackupPools(t_Handle h_FmPort, t_FmBackupBmPools *p_BackupBmPools)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++ if ((p_FmPort->portType != e_FM_PORT_TYPE_RX_10G) && (p_FmPort->portType != e_FM_PORT_TYPE_RX))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("available for Rx ports only"));
++
++ p_FmPort->p_FmPortDriverParam->p_BackupBmPools = (t_FmBackupBmPools *)XX_Malloc(sizeof(t_FmBackupBmPools));
++ if (!p_FmPort->p_FmPortDriverParam->p_BackupBmPools)
++ RETURN_ERROR(MAJOR, E_NO_MEMORY, ("p_BackupBmPools allocation failed"));
++ memcpy(p_FmPort->p_FmPortDriverParam->p_BackupBmPools, p_BackupBmPools, sizeof(t_FmBackupBmPools));
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigDeqByteCnt(t_Handle h_FmPort, uint16_t deqByteCnt)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_RX_10G) || (p_FmPort->portType == e_FM_PORT_TYPE_RX))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("not available for Rx ports"));
++
++ p_FmPort->p_FmPortDriverParam->deqByteCnt = deqByteCnt;
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigBufferPrefixContent(t_Handle h_FmPort, t_FmBufferPrefixContent *p_FmBufferPrefixContent)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++
++ memcpy(&p_FmPort->p_FmPortDriverParam->bufferPrefixContent, p_FmBufferPrefixContent, sizeof(t_FmBufferPrefixContent));
++ /* if dataAlign was not initialized by user, we return to driver's deafult */
++ if (!p_FmPort->p_FmPortDriverParam->bufferPrefixContent.dataAlign)
++ p_FmPort->p_FmPortDriverParam->bufferPrefixContent.dataAlign = DEFAULT_PORT_bufferPrefixContent_dataAlign;
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigCheksumLastBytesIgnore(t_Handle h_FmPort, uint8_t cheksumLastBytesIgnore)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++
++ p_FmPort->p_FmPortDriverParam->cheksumLastBytesIgnore = cheksumLastBytesIgnore;
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigCutBytesFromEnd(t_Handle h_FmPort, uint8_t cutBytesFromEnd)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++ if ((p_FmPort->portType != e_FM_PORT_TYPE_RX_10G) && (p_FmPort->portType != e_FM_PORT_TYPE_RX))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("available for Rx ports only"));
++
++ p_FmPort->p_FmPortDriverParam->cutBytesFromEnd = cutBytesFromEnd;
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigPoolDepletion(t_Handle h_FmPort, t_FmBufPoolDepletion *p_BufPoolDepletion)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++ if ((p_FmPort->portType != e_FM_PORT_TYPE_RX_10G) && (p_FmPort->portType != e_FM_PORT_TYPE_RX))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("available for Rx ports only"));
++
++ p_FmPort->p_FmPortDriverParam->enBufPoolDepletion = TRUE;
++ memcpy(&p_FmPort->p_FmPortDriverParam->bufPoolDepletion, p_BufPoolDepletion, sizeof(t_FmBufPoolDepletion));
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigObservedPoolDepletion(t_Handle h_FmPort, t_FmPortObservedBufPoolDepletion *p_FmPortObservedBufPoolDepletion)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++ if (p_FmPort->portType != e_FM_PORT_TYPE_OH_OFFLINE_PARSING)
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("available for OP ports only"));
++
++ p_FmPort->p_FmPortDriverParam->enBufPoolDepletion = TRUE;
++ memcpy(&p_FmPort->p_FmPortDriverParam->bufPoolDepletion,
++ &p_FmPortObservedBufPoolDepletion->poolDepletionParams,
++ sizeof(t_FmBufPoolDepletion));
++ memcpy(&p_FmPort->p_FmPortDriverParam->extBufPools,
++ &p_FmPortObservedBufPoolDepletion->poolsParams,
++ sizeof(t_FmExtPools));
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigExtBufPools(t_Handle h_FmPort, t_FmExtPools *p_FmExtPools)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++
++ if (p_FmPort->portType != e_FM_PORT_TYPE_OH_OFFLINE_PARSING)
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("available for OP ports only"));
++
++ memcpy(&p_FmPort->p_FmPortDriverParam->extBufPools, p_FmExtPools, sizeof(t_FmExtPools));
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigDontReleaseTxBufToBM(t_Handle h_FmPort)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++ if ((p_FmPort->portType != e_FM_PORT_TYPE_TX_10G) && (p_FmPort->portType != e_FM_PORT_TYPE_TX))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("available for Tx ports only"));
++
++ p_FmPort->p_FmPortDriverParam->dontReleaseBuf = TRUE;
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigDfltColor(t_Handle h_FmPort, e_FmPortColor color)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++ p_FmPort->p_FmPortDriverParam->color = color;
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigSyncReq(t_Handle h_FmPort, bool syncReq)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_TX_10G) && (p_FmPort->portType == e_FM_PORT_TYPE_TX))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("Not available for Tx ports"));
++
++ p_FmPort->p_FmPortDriverParam->syncReq = syncReq;
++
++ return E_OK;
++}
++
++
++t_Error FM_PORT_ConfigFrmDiscardOverride(t_Handle h_FmPort, bool override)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_TX_10G) && (p_FmPort->portType == e_FM_PORT_TYPE_TX))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("not available for Tx ports"));
++
++ p_FmPort->p_FmPortDriverParam->frmDiscardOverride = override;
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigErrorsToDiscard(t_Handle h_FmPort, fmPortFrameErrSelect_t errs)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++ if ((p_FmPort->portType != e_FM_PORT_TYPE_RX_10G) && (p_FmPort->portType != e_FM_PORT_TYPE_RX) &&
++ (p_FmPort->portType != e_FM_PORT_TYPE_OH_OFFLINE_PARSING))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("available for Rx and offline parsing ports only"));
++
++ p_FmPort->p_FmPortDriverParam->errorsToDiscard = errs;
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigDmaSwapData(t_Handle h_FmPort, e_FmDmaSwapOption swapData)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++
++ p_FmPort->p_FmPortDriverParam->dmaSwapData = swapData;
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigDmaIcCacheAttr(t_Handle h_FmPort, e_FmDmaCacheOption intContextCacheAttr)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++
++ p_FmPort->p_FmPortDriverParam->dmaIntContextCacheAttr = intContextCacheAttr;
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigDmaHdrAttr(t_Handle h_FmPort, e_FmDmaCacheOption headerCacheAttr)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++
++ p_FmPort->p_FmPortDriverParam->dmaHeaderCacheAttr = headerCacheAttr;
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigDmaScatterGatherAttr(t_Handle h_FmPort, e_FmDmaCacheOption scatterGatherCacheAttr)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++
++ p_FmPort->p_FmPortDriverParam->dmaScatterGatherCacheAttr = scatterGatherCacheAttr;
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigDmaWriteOptimize(t_Handle h_FmPort, bool optimize)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_TX_10G) || (p_FmPort->portType == e_FM_PORT_TYPE_TX))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("Not available for Tx ports"));
++
++ p_FmPort->p_FmPortDriverParam->dmaWriteOptimize = optimize;
++
++ return E_OK;
++}
++
++#if (DPAA_VERSION >= 11)
++t_Error FM_PORT_ConfigNoScatherGather(t_Handle h_FmPort, bool noScatherGather)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ UNUSED(noScatherGather);
++ UNUSED(p_FmPort);
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++
++ p_FmPort->p_FmPortDriverParam->noScatherGather = noScatherGather;
++
++ return E_OK;
++}
++#endif /* (DPAA_VERSION >= 11) */
++
++t_Error FM_PORT_ConfigForwardReuseIntContext(t_Handle h_FmPort, bool forwardReuse)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++
++ if ((p_FmPort->portType != e_FM_PORT_TYPE_RX_10G) && (p_FmPort->portType != e_FM_PORT_TYPE_RX))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("available for Rx ports only"));
++
++ p_FmPort->p_FmPortDriverParam->forwardReuseIntContext = forwardReuse;
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigMaxFrameLength(t_Handle h_FmPort, uint16_t length)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++
++ p_FmPort->maxFrameLength = length;
++
++ return E_OK;
++}
++
++#ifdef FM_HEAVY_TRAFFIC_HANG_ERRATA_FMAN_A005669
++t_Error FM_PORT_ConfigBCBWorkaround(t_Handle h_FmPort)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++
++ p_FmPort->p_FmPortDriverParam->bcbWorkaround = TRUE;
++
++ return E_OK;
++}
++#endif /* FM_HEAVY_TRAFFIC_HANG_ERRATA_FMAN_A005669 */
++
++/****************************************************/
++/* Hidden-DEBUG Only API */
++/****************************************************/
++
++t_Error FM_PORT_ConfigTxFifoMinFillLevel(t_Handle h_FmPort, uint32_t minFillLevel)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++ if ((p_FmPort->portType != e_FM_PORT_TYPE_TX_10G) && (p_FmPort->portType != e_FM_PORT_TYPE_TX))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("available for Tx ports only"));
++
++ p_FmPort->p_FmPortDriverParam->txFifoMinFillLevel = minFillLevel;
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigFifoDeqPipelineDepth(t_Handle h_FmPort, uint8_t deqPipelineDepth)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_RX_10G) || (p_FmPort->portType == e_FM_PORT_TYPE_RX))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("Not available for Rx ports"));
++
++ if (p_FmPort->imEn)
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("Not available for IM ports!"));
++
++ p_FmPort->fifoDeqPipelineDepth = deqPipelineDepth;
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigTxFifoLowComfLevel(t_Handle h_FmPort, uint32_t fifoLowComfLevel)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++ if ((p_FmPort->portType != e_FM_PORT_TYPE_TX_10G) && (p_FmPort->portType != e_FM_PORT_TYPE_TX))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("available for Tx ports only"));
++
++ p_FmPort->p_FmPortDriverParam->txFifoLowComfLevel = fifoLowComfLevel;
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigRxFifoThreshold(t_Handle h_FmPort, uint32_t fifoThreshold)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++ if ((p_FmPort->portType != e_FM_PORT_TYPE_RX_10G) && (p_FmPort->portType != e_FM_PORT_TYPE_RX))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("available for Rx ports only"));
++
++ p_FmPort->p_FmPortDriverParam->rxFifoThreshold = fifoThreshold;
++
++ return E_OK;
++}
++
++t_Error FM_PORT_ConfigRxFifoPriElevationLevel(t_Handle h_FmPort, uint32_t priElevationLevel)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++ if ((p_FmPort->portType != e_FM_PORT_TYPE_RX_10G) && (p_FmPort->portType != e_FM_PORT_TYPE_RX))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("available for Rx ports only"));
++
++ p_FmPort->p_FmPortDriverParam->rxFifoPriElevationLevel = priElevationLevel;
++
++ return E_OK;
++}
++/****************************************************/
++/* API Run-time Control unit functions */
++/****************************************************/
++
++t_Error FM_PORT_SetNumOfOpenDmas(t_Handle h_FmPort, t_FmPortRsrc *p_NumOfOpenDmas)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++
++ if ((!p_NumOfOpenDmas->num) || (p_NumOfOpenDmas->num > MAX_NUM_OF_DMAS))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("openDmas-num can't be larger than %d", MAX_NUM_OF_DMAS));
++ if (p_NumOfOpenDmas->extra > MAX_NUM_OF_EXTRA_DMAS)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("openDmas-extra can't be larger than %d", MAX_NUM_OF_EXTRA_DMAS));
++ err = FmSetNumOfOpenDmas(p_FmPort->h_Fm, p_FmPort->hardwarePortId, (uint8_t*)&p_NumOfOpenDmas->num, (uint8_t*)&p_NumOfOpenDmas->extra, FALSE);
++ if (err)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++
++ memcpy(&p_FmPort->openDmas, p_NumOfOpenDmas, sizeof(t_FmPortRsrc));
++
++ return E_OK;
++}
++
++t_Error FM_PORT_SetNumOfTasks(t_Handle h_FmPort, t_FmPortRsrc *p_NumOfTasks)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++
++ /* only driver uses host command port, so ASSERT rather than RETURN_ERROR */
++ ASSERT_COND(p_FmPort->portType != e_FM_PORT_TYPE_OH_HOST_COMMAND);
++
++ if ((!p_NumOfTasks->num) || (p_NumOfTasks->num > MAX_NUM_OF_TASKS))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("NumOfTasks-num can't be larger than %d", MAX_NUM_OF_TASKS));
++ if (p_NumOfTasks->extra > MAX_NUM_OF_EXTRA_TASKS)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("NumOfTasks-extra can't be larger than %d", MAX_NUM_OF_EXTRA_TASKS));
++
++ err = FmSetNumOfTasks(p_FmPort->h_Fm, p_FmPort->hardwarePortId, (uint8_t*)&p_NumOfTasks->num, (uint8_t*)&p_NumOfTasks->extra, FALSE);
++ if (err)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++
++ /* update driver's struct */
++ memcpy(&p_FmPort->tasks, p_NumOfTasks, sizeof(t_FmPortRsrc));
++ return E_OK;
++}
++
++t_Error FM_PORT_SetSizeOfFifo(t_Handle h_FmPort, t_FmPortRsrc *p_SizeOfFifo)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ t_Error err;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++
++ if (!p_SizeOfFifo->num || (p_SizeOfFifo->num > BMI_MAX_FIFO_SIZE))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("SizeOfFifo-num has to be in the range of 256 - %d", BMI_MAX_FIFO_SIZE));
++ if (p_SizeOfFifo->num % BMI_FIFO_UNITS)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("SizeOfFifo-num has to be divisible by %d", BMI_FIFO_UNITS));
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_RX) || (p_FmPort->portType == e_FM_PORT_TYPE_RX_10G))
++ {
++ /* extra FIFO size (allowed only to Rx ports) */
++ if (p_SizeOfFifo->extra % BMI_FIFO_UNITS)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("SizeOfFifo-extra has to be divisible by %d", BMI_FIFO_UNITS));
++ }
++ else
++ if (p_SizeOfFifo->extra)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, (" No SizeOfFifo-extra for non Rx ports"));
++
++ memcpy(&p_FmPort->fifoBufs, p_SizeOfFifo, sizeof(t_FmPortRsrc));
++
++ /* we do not change user's parameter */
++ err = VerifySizeOfFifo(p_FmPort);
++ if (err)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++
++ err = FmSetSizeOfFifo(p_FmPort->h_Fm,
++ p_FmPort->hardwarePortId,
++ &p_SizeOfFifo->num,
++ &p_SizeOfFifo->extra,
++ FALSE);
++ if (err)
++ RETURN_ERROR(MINOR, err, NO_MSG);
++
++ return E_OK;
++}
++
++uint32_t FM_PORT_GetBufferDataOffset(t_Handle h_FmPort)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_VALUE(p_FmPort, E_INVALID_HANDLE, 0);
++ SANITY_CHECK_RETURN_VALUE(!p_FmPort->p_FmPortDriverParam, E_INVALID_STATE, 0);
++
++ return p_FmPort->bufferOffsets.dataOffset;
++}
++
++uint8_t * FM_PORT_GetBufferICInfo(t_Handle h_FmPort, char *p_Data)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_VALUE(p_FmPort, E_INVALID_HANDLE, NULL);
++ SANITY_CHECK_RETURN_VALUE(!p_FmPort->p_FmPortDriverParam, E_INVALID_STATE, NULL);
++
++ if (p_FmPort->bufferOffsets.pcdInfoOffset == ILLEGAL_BASE)
++ return NULL;
++
++ return (uint8_t *)PTR_MOVE(p_Data, p_FmPort->bufferOffsets.pcdInfoOffset);
++}
++
++t_FmPrsResult * FM_PORT_GetBufferPrsResult(t_Handle h_FmPort, char *p_Data)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_VALUE(p_FmPort, E_INVALID_HANDLE, NULL);
++ SANITY_CHECK_RETURN_VALUE(!p_FmPort->p_FmPortDriverParam, E_INVALID_STATE, NULL);
++
++ if (p_FmPort->bufferOffsets.prsResultOffset == ILLEGAL_BASE)
++ return NULL;
++
++ return (t_FmPrsResult *)PTR_MOVE(p_Data, p_FmPort->bufferOffsets.prsResultOffset);
++}
++
++uint64_t * FM_PORT_GetBufferTimeStamp(t_Handle h_FmPort, char *p_Data)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_VALUE(p_FmPort, E_INVALID_HANDLE, NULL);
++ SANITY_CHECK_RETURN_VALUE(!p_FmPort->p_FmPortDriverParam, E_INVALID_STATE, NULL);
++
++ if (p_FmPort->bufferOffsets.timeStampOffset == ILLEGAL_BASE)
++ return NULL;
++
++ return (uint64_t *)PTR_MOVE(p_Data, p_FmPort->bufferOffsets.timeStampOffset);
++}
++
++uint8_t * FM_PORT_GetBufferHashResult(t_Handle h_FmPort, char *p_Data)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++
++ SANITY_CHECK_RETURN_VALUE(p_FmPort, E_INVALID_HANDLE, NULL);
++ SANITY_CHECK_RETURN_VALUE(!p_FmPort->p_FmPortDriverParam, E_INVALID_STATE, NULL);
++
++ if (p_FmPort->bufferOffsets.hashResultOffset == ILLEGAL_BASE)
++ return NULL;
++
++ return (uint8_t *)PTR_MOVE(p_Data, p_FmPort->bufferOffsets.hashResultOffset);
++}
++
++t_Error FM_PORT_Disable(t_Handle h_FmPort)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ volatile uint32_t *p_BmiCfgReg = NULL;
++ volatile uint32_t *p_BmiStatusReg = NULL;
++ bool rxPort = FALSE;
++ int tries;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPort->p_FmPortDriverParam, E_INVALID_STATE);
++
++ switch (p_FmPort->portType)
++ {
++ case (e_FM_PORT_TYPE_RX_10G):
++ case (e_FM_PORT_TYPE_RX):
++ p_BmiCfgReg = &p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rcfg;
++ p_BmiStatusReg = &p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rst;
++ rxPort = TRUE;
++ break;
++ case (e_FM_PORT_TYPE_TX_10G):
++ case (e_FM_PORT_TYPE_TX):
++ p_BmiCfgReg = &p_FmPort->p_FmPortBmiRegs->txPortBmiRegs.fmbm_tcfg;
++ p_BmiStatusReg = &p_FmPort->p_FmPortBmiRegs->txPortBmiRegs.fmbm_tst;
++ break;
++ case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
++ case (e_FM_PORT_TYPE_OH_HOST_COMMAND):
++ p_BmiCfgReg = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_ocfg;
++ p_BmiStatusReg = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_ost;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid port type"));
++ }
++
++ /* check if port is already disabled */
++ if (!(GET_UINT32(*p_BmiCfgReg) & BMI_PORT_CFG_EN))
++ {
++ if (!rxPort && !p_FmPort->imEn)
++ {
++ if (!(GET_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnc)& QMI_PORT_CFG_EN))
++ /* port is disabled */
++ return E_OK;
++ else
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Inconsistency: Port's QMI is enabled but BMI disabled"));
++ }
++ /* port is disabled */
++ return E_OK;
++ }
++
++ /* Disable QMI */
++ if (!rxPort && !p_FmPort->imEn)
++ {
++ WRITE_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnc,
++ GET_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnc) & ~QMI_PORT_CFG_EN);
++ /* wait for QMI to finish Handling dequeue tnums */
++ tries=1000;
++ while ((GET_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pns) & QMI_PORT_STATUS_DEQ_FD_BSY) &&
++ --tries)
++ XX_UDelay(1);
++ if (!tries)
++ {
++ WRITE_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnc,
++ GET_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnc) | QMI_PORT_CFG_EN);
++ RETURN_ERROR(MAJOR, E_BUSY, ("%s: can't disable! QMI busy", p_FmPort->name));
++ }
++ }
++
++ /* Disable BMI */
++ WRITE_UINT32(*p_BmiCfgReg, GET_UINT32(*p_BmiCfgReg) & ~BMI_PORT_CFG_EN);
++
++ if (p_FmPort->imEn)
++ FmPortImDisable(p_FmPort);
++
++ tries=5000;
++ while ((GET_UINT32(*p_BmiStatusReg) & BMI_PORT_STATUS_BSY) &&
++ --tries)
++ XX_UDelay(1);
++
++ if (!tries)
++ {
++ if (!rxPort && !p_FmPort->imEn)
++ WRITE_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnc,
++ GET_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnc) | QMI_PORT_CFG_EN);
++ WRITE_UINT32(*p_BmiCfgReg, GET_UINT32(*p_BmiCfgReg) | BMI_PORT_CFG_EN);
++
++ RETURN_ERROR(MAJOR, E_BUSY, ("%s: can't disable! BMI Busy", p_FmPort->name));
++ }
++
++ p_FmPort->enabled = 0;
++
++ return E_OK;
++}
++
++t_Error FM_PORT_Enable(t_Handle h_FmPort)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ volatile uint32_t *p_BmiCfgReg = NULL;
++ bool rxPort = FALSE;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPort->p_FmPortDriverParam, E_INVALID_STATE);
++
++ switch (p_FmPort->portType)
++ {
++ case (e_FM_PORT_TYPE_RX_10G):
++ case (e_FM_PORT_TYPE_RX):
++ p_BmiCfgReg = &p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rcfg;
++ rxPort = TRUE;
++ break;
++ case (e_FM_PORT_TYPE_TX_10G):
++ case (e_FM_PORT_TYPE_TX):
++ p_BmiCfgReg = &p_FmPort->p_FmPortBmiRegs->txPortBmiRegs.fmbm_tcfg;
++ break;
++ case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
++ case (e_FM_PORT_TYPE_OH_HOST_COMMAND):
++ p_BmiCfgReg = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_ocfg;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid port type"));
++ }
++
++ /* check if port is already enabled */
++ if (GET_UINT32(*p_BmiCfgReg) & BMI_PORT_CFG_EN)
++ {
++ if (!rxPort && !p_FmPort->imEn)
++ {
++ if (GET_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnc)& QMI_PORT_CFG_EN)
++ /* port is enabled */
++ return E_OK;
++ else
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Inconsistency: Port's BMI is enabled but QMI disabled"));
++ }
++ /* port is enabled */
++ return E_OK;
++ }
++
++ if (p_FmPort->imEn)
++ FmPortImEnable(p_FmPort);
++
++ /* Enable QMI */
++ if (!rxPort && !p_FmPort->imEn)
++ WRITE_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnc,
++ GET_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnc) | QMI_PORT_CFG_EN);
++
++ /* Enable BMI */
++ WRITE_UINT32(*p_BmiCfgReg, GET_UINT32(*p_BmiCfgReg) | BMI_PORT_CFG_EN);
++
++ p_FmPort->enabled = 1;
++
++ return E_OK;
++}
++
++t_Error FM_PORT_SetRateLimit(t_Handle h_FmPort, t_FmPortRateLimit *p_RateLimit)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ uint32_t tmpRateLimit, tmpRateLimitScale;
++ volatile uint32_t *p_RateLimitReg, *p_RateLimitScaleReg;
++ uint8_t factor, countUnitBit;
++ uint16_t baseGran;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_RX_10G) || (p_FmPort->portType == e_FM_PORT_TYPE_RX) ||
++ (p_FmPort->portType == e_FM_PORT_TYPE_OH_HOST_COMMAND))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("available for Tx and Offline parsing ports only"));
++
++ switch (p_FmPort->portType)
++ {
++ case (e_FM_PORT_TYPE_TX_10G):
++ case (e_FM_PORT_TYPE_TX):
++ p_RateLimitReg = &p_FmPort->p_FmPortBmiRegs->txPortBmiRegs.fmbm_trlmt;
++ p_RateLimitScaleReg = &p_FmPort->p_FmPortBmiRegs->txPortBmiRegs.fmbm_trlmts;
++ baseGran = 16000;
++ break;
++ case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
++ p_RateLimitReg = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_orlmt;
++ p_RateLimitScaleReg = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_orlmts;
++ baseGran = 10000;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid port type"));
++ }
++
++ countUnitBit = (uint8_t)FmGetTimeStampScale(p_FmPort->h_Fm); /* TimeStamp per nano seconds units */
++ /* normally, we use 1 usec as the reference count */
++ factor = 1;
++ /* if ratelimit is too small for a 1usec factor, multiply the factor */
++ while (p_RateLimit->rateLimit < baseGran/factor)
++ {
++ if (countUnitBit==31)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Rate limit is too small"));
++
++ countUnitBit++;
++ factor <<= 1;
++ }
++ /* if ratelimit is too large for a 1usec factor, it is also larger than max rate*/
++ if (p_RateLimit->rateLimit > ((uint32_t)baseGran * (1<<10) * (uint32_t)factor))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Rate limit is too large"));
++
++ tmpRateLimit = (uint32_t)(p_RateLimit->rateLimit*factor/baseGran - 1);
++
++ if (!p_RateLimit->maxBurstSize || (p_RateLimit->maxBurstSize > MAX_BURST_SIZE))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("maxBurstSize must be between 1K and %dk", MAX_BURST_SIZE));
++
++ tmpRateLimitScale = ((31 - (uint32_t)countUnitBit) << BMI_COUNT_RATE_UNIT_SHIFT) | BMI_RATE_LIMIT_EN;
++
++ if (p_FmPort->portType != e_FM_PORT_TYPE_OH_OFFLINE_PARSING)
++ tmpRateLimit |= (uint32_t)(p_RateLimit->maxBurstSize - 1) << BMI_MAX_BURST_SHIFT;
++ else
++ {
++#ifndef FM_NO_ADVANCED_RATE_LIMITER
++
++ if ((p_FmPort->fmRevInfo.majorRev == 4) || (p_FmPort->fmRevInfo.majorRev >= 6))
++ {
++ switch (p_RateLimit->rateLimitDivider)
++ {
++ case (e_FM_PORT_DUAL_RATE_LIMITER_NONE):
++ break;
++ case (e_FM_PORT_DUAL_RATE_LIMITER_SCALE_DOWN_BY_2):
++ tmpRateLimitScale |= BMI_RATE_LIMIT_SCALE_BY_2;
++ break;
++ case (e_FM_PORT_DUAL_RATE_LIMITER_SCALE_DOWN_BY_4):
++ tmpRateLimitScale |= BMI_RATE_LIMIT_SCALE_BY_4;
++ break;
++ case (e_FM_PORT_DUAL_RATE_LIMITER_SCALE_DOWN_BY_8):
++ tmpRateLimitScale |= BMI_RATE_LIMIT_SCALE_BY_8;
++ break;
++ default:
++ break;
++ }
++ tmpRateLimit |= BMI_RATE_LIMIT_BURST_SIZE_GRAN;
++ }
++ else
++#endif /* ! FM_NO_ADVANCED_RATE_LIMITER */
++ {
++ if (p_RateLimit->rateLimitDivider != e_FM_PORT_DUAL_RATE_LIMITER_NONE)
++ RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("FM_PORT_ConfigDualRateLimitScaleDown"));
++
++ if (p_RateLimit->maxBurstSize % 1000)
++ {
++ p_RateLimit->maxBurstSize = (uint16_t)((p_RateLimit->maxBurstSize/1000)+1);
++ DBG(WARNING, ("rateLimit.maxBurstSize rounded up to %d", (p_RateLimit->maxBurstSize/1000+1)*1000));
++ }
++ else
++ p_RateLimit->maxBurstSize = (uint16_t)(p_RateLimit->maxBurstSize/1000);
++ }
++ tmpRateLimit |= (uint32_t)(p_RateLimit->maxBurstSize - 1) << BMI_MAX_BURST_SHIFT;
++
++ }
++ WRITE_UINT32(*p_RateLimitScaleReg, tmpRateLimitScale);
++ WRITE_UINT32(*p_RateLimitReg, tmpRateLimit);
++
++ return E_OK;
++}
++
++t_Error FM_PORT_DeleteRateLimit(t_Handle h_FmPort)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ volatile uint32_t *p_RateLimitReg, *p_RateLimitScaleReg;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
++
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_RX_10G) || (p_FmPort->portType == e_FM_PORT_TYPE_RX) ||
++ (p_FmPort->portType == e_FM_PORT_TYPE_OH_HOST_COMMAND))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("available for Tx and Offline parsing ports only"));
++
++ switch (p_FmPort->portType)
++ {
++ case (e_FM_PORT_TYPE_TX_10G):
++ case (e_FM_PORT_TYPE_TX):
++ p_RateLimitReg = &p_FmPort->p_FmPortBmiRegs->txPortBmiRegs.fmbm_trlmt;
++ p_RateLimitScaleReg = &p_FmPort->p_FmPortBmiRegs->txPortBmiRegs.fmbm_trlmts;
++ break;
++ case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
++ p_RateLimitReg = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_orlmt;
++ p_RateLimitScaleReg = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_orlmts;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid port type"));
++ }
++
++ WRITE_UINT32(*p_RateLimitScaleReg, 0);
++ WRITE_UINT32(*p_RateLimitReg, 0);
++
++ return E_OK;
++}
++
++
++t_Error FM_PORT_SetFrameQueueCounters(t_Handle h_FmPort, bool enable)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ uint32_t tmpReg;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPort->p_FmPortDriverParam, E_INVALID_STATE);
++
++ tmpReg = GET_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnc);
++ if (enable)
++ tmpReg |= QMI_PORT_CFG_EN_COUNTERS ;
++ else
++ tmpReg &= ~QMI_PORT_CFG_EN_COUNTERS;
++
++ WRITE_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnc, tmpReg);
++
++ return E_OK;
++}
++
++t_Error FM_PORT_SetPerformanceCounters(t_Handle h_FmPort, bool enable)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ volatile uint32_t *p_BmiPcReg = NULL;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPort->p_FmPortDriverParam, E_INVALID_STATE);
++
++ switch (p_FmPort->portType)
++ {
++ case (e_FM_PORT_TYPE_RX_10G):
++ case (e_FM_PORT_TYPE_RX):
++ p_BmiPcReg = &p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rpc;
++ break;
++ case (e_FM_PORT_TYPE_TX_10G):
++ case (e_FM_PORT_TYPE_TX):
++ p_BmiPcReg = &p_FmPort->p_FmPortBmiRegs->txPortBmiRegs.fmbm_tpc;
++ break;
++ case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
++ case (e_FM_PORT_TYPE_OH_HOST_COMMAND):
++ p_BmiPcReg = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_opc;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid port type"));
++ }
++
++ if (enable)
++ WRITE_UINT32(*p_BmiPcReg, BMI_COUNTERS_EN);
++ else
++ WRITE_UINT32(*p_BmiPcReg, 0);
++
++ return E_OK;
++}
++
++t_Error FM_PORT_SetPerformanceCountersParams(t_Handle h_FmPort, t_FmPortPerformanceCnt *p_FmPortPerformanceCnt)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ uint32_t tmpReg;
++ volatile uint32_t *p_BmiPcpReg = NULL;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++
++ switch (p_FmPort->portType)
++ {
++ case (e_FM_PORT_TYPE_RX_10G):
++ case (e_FM_PORT_TYPE_RX):
++ p_BmiPcpReg = &p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rpcp;
++ break;
++ case (e_FM_PORT_TYPE_TX_10G):
++ case (e_FM_PORT_TYPE_TX):
++ p_BmiPcpReg = &p_FmPort->p_FmPortBmiRegs->txPortBmiRegs.fmbm_tpcp;
++ break;
++ case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
++ case (e_FM_PORT_TYPE_OH_HOST_COMMAND):
++ p_BmiPcpReg = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_opcp;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid port type"));
++ }
++
++ /* check parameters */
++ if (!p_FmPortPerformanceCnt->taskCompVal ||
++ (p_FmPortPerformanceCnt->taskCompVal > p_FmPort->tasks.num))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE,
++ ("performanceCnt.taskCompVal has to be in the range of 1 - %d (current value)!",
++ p_FmPort->tasks.num));
++ if (!p_FmPortPerformanceCnt->dmaCompVal ||
++ (p_FmPortPerformanceCnt->dmaCompVal > p_FmPort->openDmas.num))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE,
++ ("performanceCnt.dmaCompVal has to be in the range of 1 - %d (current value)!",
++ p_FmPort->openDmas.num));
++ if (!p_FmPortPerformanceCnt->fifoCompVal ||
++ (p_FmPortPerformanceCnt->fifoCompVal > p_FmPort->fifoBufs.num))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE,
++ ("performanceCnt.fifoCompVal has to be in the range of 256 - %d (current value)!",
++ p_FmPort->fifoBufs.num));
++ if (p_FmPortPerformanceCnt->fifoCompVal % BMI_FIFO_UNITS)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE,
++ ("performanceCnt.fifoCompVal has to be divisible by %d",
++ BMI_FIFO_UNITS));
++ switch (p_FmPort->portType)
++ {
++ case (e_FM_PORT_TYPE_RX_10G):
++ case (e_FM_PORT_TYPE_RX):
++ if (!p_FmPortPerformanceCnt->queueCompVal ||
++ (p_FmPortPerformanceCnt->queueCompVal > MAX_PERFORMANCE_RX_QUEUE_COMP))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE,
++ ("performanceCnt.queueCompVal for Rx has to be in the range of 1 - %d",
++ MAX_PERFORMANCE_RX_QUEUE_COMP));
++ break;
++ case (e_FM_PORT_TYPE_TX_10G):
++ case (e_FM_PORT_TYPE_TX):
++ if (!p_FmPortPerformanceCnt->queueCompVal ||
++ (p_FmPortPerformanceCnt->queueCompVal > MAX_PERFORMANCE_TX_QUEUE_COMP))
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE,
++ ("performanceCnt.queueCompVal for Tx has to be in the range of 1 - %d",
++ MAX_PERFORMANCE_TX_QUEUE_COMP));
++ break;
++ case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
++ case (e_FM_PORT_TYPE_OH_HOST_COMMAND):
++ if (p_FmPortPerformanceCnt->queueCompVal)
++ RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("performanceCnt.queueCompVal is not relevant for H/O ports."));
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid port type"));
++ }
++
++ tmpReg = 0;
++ tmpReg |= ((uint32_t)(p_FmPortPerformanceCnt->queueCompVal - 1) << BMI_PERFORMANCE_PORT_COMP_SHIFT);
++ tmpReg |= ((uint32_t)(p_FmPortPerformanceCnt->dmaCompVal- 1) << BMI_PERFORMANCE_DMA_COMP_SHIFT);
++ tmpReg |= ((uint32_t)(p_FmPortPerformanceCnt->fifoCompVal/BMI_FIFO_UNITS - 1) << BMI_PERFORMANCE_FIFO_COMP_SHIFT);
++ if ((p_FmPort->portType != e_FM_PORT_TYPE_OH_OFFLINE_PARSING) && (p_FmPort->portType != e_FM_PORT_TYPE_OH_HOST_COMMAND))
++ tmpReg |= ((uint32_t)(p_FmPortPerformanceCnt->taskCompVal - 1) << BMI_PERFORMANCE_TASK_COMP_SHIFT);
++
++ WRITE_UINT32(*p_BmiPcpReg, tmpReg);
++
++ return E_OK;
++}
++
++t_Error FM_PORT_AnalyzePerformanceParams(t_Handle h_FmPort)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ t_FmPortPerformanceCnt currParams, savedParams;
++ t_Error err;
++ bool underTest, failed = FALSE;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++
++ XX_Print("Analyzing Performance parameters for port (type %d, id%d)\n",
++ p_FmPort->portType, p_FmPort->portId);
++
++ currParams.taskCompVal = (uint8_t)p_FmPort->tasks.num;
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_OH_OFFLINE_PARSING) ||
++ (p_FmPort->portType == e_FM_PORT_TYPE_OH_HOST_COMMAND))
++ currParams.queueCompVal = 0;
++ else
++ currParams.queueCompVal = 1;
++ currParams.dmaCompVal =(uint8_t) p_FmPort->openDmas.num;
++ currParams.fifoCompVal = p_FmPort->fifoBufs.num;
++
++ FM_PORT_SetPerformanceCounters(p_FmPort, FALSE);
++ ClearPerfCnts(p_FmPort);
++ if ((err = FM_PORT_SetPerformanceCountersParams(p_FmPort, &currParams)) != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ FM_PORT_SetPerformanceCounters(p_FmPort, TRUE);
++ XX_UDelay(1000000);
++ FM_PORT_SetPerformanceCounters(p_FmPort, FALSE);
++ if (FM_PORT_GetCounter(p_FmPort, e_FM_PORT_COUNTERS_TASK_UTIL))
++ {
++ XX_Print ("Max num of defined port tasks (%d) utilized - Please enlarge\n",p_FmPort->tasks.num);
++ failed = TRUE;
++ }
++ if (FM_PORT_GetCounter(p_FmPort, e_FM_PORT_COUNTERS_DMA_UTIL))
++ {
++ XX_Print ("Max num of defined port openDmas (%d) utilized - Please enlarge\n",p_FmPort->openDmas.num);
++ failed = TRUE;
++ }
++ if (FM_PORT_GetCounter(p_FmPort, e_FM_PORT_COUNTERS_FIFO_UTIL))
++ {
++ XX_Print("Max size of defined port fifo (%d) utilized - Please enlarge\n",p_FmPort->fifoBufs.num);
++ failed = TRUE;
++ }
++ if (failed)
++ RETURN_ERROR(MINOR, E_INVALID_STATE, NO_MSG);
++
++ memset(&savedParams, 0, sizeof(savedParams));
++ while (TRUE)
++ {
++ underTest = FALSE;
++ if ((currParams.taskCompVal != 1) && !savedParams.taskCompVal)
++ {
++ currParams.taskCompVal--;
++ underTest = TRUE;
++ }
++ if ((currParams.dmaCompVal != 1) && !savedParams.dmaCompVal)
++ {
++ currParams.dmaCompVal--;
++ underTest = TRUE;
++ }
++ if ((currParams.fifoCompVal != BMI_FIFO_UNITS) && !savedParams.fifoCompVal)
++ {
++ currParams.fifoCompVal -= BMI_FIFO_UNITS;
++ underTest = TRUE;
++ }
++ if (!underTest)
++ break;
++
++ ClearPerfCnts(p_FmPort);
++ if ((err = FM_PORT_SetPerformanceCountersParams(p_FmPort, &currParams)) != E_OK)
++ RETURN_ERROR(MAJOR, err, NO_MSG);
++ FM_PORT_SetPerformanceCounters(p_FmPort, TRUE);
++ XX_UDelay(1000000);
++ FM_PORT_SetPerformanceCounters(p_FmPort, FALSE);
++
++ if (!savedParams.taskCompVal && FM_PORT_GetCounter(p_FmPort, e_FM_PORT_COUNTERS_TASK_UTIL))
++ savedParams.taskCompVal = (uint8_t)(currParams.taskCompVal+2);
++ if (!savedParams.dmaCompVal && FM_PORT_GetCounter(p_FmPort, e_FM_PORT_COUNTERS_DMA_UTIL))
++ savedParams.dmaCompVal = (uint8_t)(currParams.dmaCompVal+2);
++ if (!savedParams.fifoCompVal && FM_PORT_GetCounter(p_FmPort, e_FM_PORT_COUNTERS_FIFO_UTIL))
++ savedParams.fifoCompVal = currParams.fifoCompVal+(2*BMI_FIFO_UNITS);
++ }
++
++ XX_Print("best vals: tasks %d, dmas %d, fifos %d\n",
++ savedParams.taskCompVal, savedParams.dmaCompVal, savedParams.fifoCompVal);
++ return E_OK;
++}
++
++t_Error FM_PORT_SetStatisticsCounters(t_Handle h_FmPort, bool enable)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ uint32_t tmpReg;
++ volatile uint32_t *p_BmiStcReg = NULL;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPort->p_FmPortDriverParam, E_INVALID_STATE);
++
++ switch (p_FmPort->portType)
++ {
++ case (e_FM_PORT_TYPE_RX_10G):
++ case (e_FM_PORT_TYPE_RX):
++ p_BmiStcReg = &p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rstc;
++ break;
++ case (e_FM_PORT_TYPE_TX_10G):
++ case (e_FM_PORT_TYPE_TX):
++ p_BmiStcReg = &p_FmPort->p_FmPortBmiRegs->txPortBmiRegs.fmbm_tstc;
++ break;
++ case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
++ case (e_FM_PORT_TYPE_OH_HOST_COMMAND):
++ p_BmiStcReg = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_ostc;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid port type"));
++ }
++
++ tmpReg = GET_UINT32(*p_BmiStcReg);
++
++ if (enable)
++ tmpReg |= BMI_COUNTERS_EN;
++ else
++ tmpReg &= ~BMI_COUNTERS_EN;
++
++ WRITE_UINT32(*p_BmiStcReg, tmpReg);
++
++ return E_OK;
++}
++
++t_Error FM_PORT_SetErrorsRoute(t_Handle h_FmPort, fmPortFrameErrSelect_t errs)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ volatile uint32_t *p_ErrQReg, *p_ErrDiscard;
++
++ switch (p_FmPort->portType)
++ {
++ case (e_FM_PORT_TYPE_RX_10G):
++ case (e_FM_PORT_TYPE_RX):
++ p_ErrQReg = &p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rfsem;
++ p_ErrDiscard = &p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rfsdm;
++ break;
++ case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
++ p_ErrQReg = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_ofsem;
++ p_ErrDiscard = &p_FmPort->p_FmPortBmiRegs->ohPortBmiRegs.fmbm_ofsdm;
++ break;
++ default:
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("available for Rx and offline parsing ports only"));
++ }
++
++ if (GET_UINT32(*p_ErrDiscard) & errs)
++ RETURN_ERROR(MAJOR, E_INVALID_SELECTION, ("Selectd Errors that were configured to cause frame discard."));
++
++ WRITE_UINT32(*p_ErrQReg, errs);
++
++ return E_OK;
++}
++
++t_Error FM_PORT_SetAllocBufCounter(t_Handle h_FmPort, uint8_t poolId, bool enable)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ uint32_t tmpReg;
++ int i;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(poolIdp_FmPortDriverParam, E_INVALID_STATE);
++
++ if ((p_FmPort->portType != e_FM_PORT_TYPE_RX_10G) && (p_FmPort->portType != e_FM_PORT_TYPE_RX))
++ RETURN_ERROR(MAJOR, E_INVALID_OPERATION, ("available for Rx ports only"));
++
++ for (i=0 ; i< FM_PORT_MAX_NUM_OF_EXT_POOLS ; i++)
++ {
++ tmpReg = GET_UINT32(p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_ebmpi[i]);
++ if ((uint8_t)((tmpReg & BMI_EXT_BUF_POOL_ID_MASK) >> BMI_EXT_BUF_POOL_ID_SHIFT) == poolId)
++ {
++ if (enable)
++ tmpReg |= BMI_EXT_BUF_POOL_EN_COUNTER;
++ else
++ tmpReg &= ~BMI_EXT_BUF_POOL_EN_COUNTER;
++ WRITE_UINT32(p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_ebmpi[i], tmpReg);
++ break;
++ }
++ }
++ if (i == FM_PORT_MAX_NUM_OF_EXT_POOLS)
++ RETURN_ERROR(MINOR, E_INVALID_VALUE,("poolId %d is not included in this ports pools", poolId));
++
++ return E_OK;
++}
++
++uint32_t FM_PORT_GetCounter(t_Handle h_FmPort, e_FmPortCounters counter)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ bool bmiCounter = FALSE;
++ volatile uint32_t *p_Reg;
++
++ SANITY_CHECK_RETURN_VALUE(p_FmPort, E_INVALID_HANDLE, 0);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPort->p_FmPortDriverParam, E_INVALID_STATE);
++
++ switch (counter)
++ {
++ case (e_FM_PORT_COUNTERS_DEQ_TOTAL):
++ case (e_FM_PORT_COUNTERS_DEQ_FROM_DEFAULT):
++ case (e_FM_PORT_COUNTERS_DEQ_CONFIRM):
++ /* check that counter is available for the port type */
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_RX) ||
++ (p_FmPort->portType == e_FM_PORT_TYPE_RX_10G))
++ {
++ REPORT_ERROR(MINOR, E_INVALID_STATE, ("Requested counter is not available for Rx ports"));
++ return 0;
++ }
++ bmiCounter = FALSE;
++ case (e_FM_PORT_COUNTERS_ENQ_TOTAL):
++ bmiCounter = FALSE;
++ break;
++ default: /* BMI counters (or error - will be checked in BMI routine )*/
++ bmiCounter = TRUE;
++ break;
++ }
++
++ if (bmiCounter)
++ {
++ switch (p_FmPort->portType)
++ {
++ case (e_FM_PORT_TYPE_RX_10G):
++ case (e_FM_PORT_TYPE_RX):
++ if (BmiRxPortCheckAndGetCounterPtr(p_FmPort, counter, &p_Reg))
++ {
++ REPORT_ERROR(MINOR, E_INVALID_STATE, NO_MSG);
++ return 0;
++ }
++ break;
++ case (e_FM_PORT_TYPE_TX_10G):
++ case (e_FM_PORT_TYPE_TX):
++ if (BmiTxPortCheckAndGetCounterPtr(p_FmPort, counter, &p_Reg))
++ {
++ REPORT_ERROR(MINOR, E_INVALID_STATE, NO_MSG);
++ return 0;
++ }
++ break;
++ case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
++ case (e_FM_PORT_TYPE_OH_HOST_COMMAND):
++ if (BmiOhPortCheckAndGetCounterPtr(p_FmPort, counter, &p_Reg))
++ {
++ REPORT_ERROR(MINOR, E_INVALID_STATE, NO_MSG);
++ return 0;
++ }
++ break;
++ default:
++ REPORT_ERROR(MINOR, E_INVALID_STATE, ("Unsupported port type"));
++ return 0;
++ }
++ return GET_UINT32(*p_Reg);
++ }
++ else /* QMI counter */
++ {
++ /* check that counters are enabled */
++ if (!(GET_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnc) & QMI_PORT_CFG_EN_COUNTERS))
++ {
++ REPORT_ERROR(MINOR, E_INVALID_STATE, ("Requested counter was not enabled"));
++ return 0;
++ }
++
++ /* Set counter */
++ switch (counter)
++ {
++ case (e_FM_PORT_COUNTERS_ENQ_TOTAL):
++ return GET_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnetfc);
++ case (e_FM_PORT_COUNTERS_DEQ_TOTAL):
++ return GET_UINT32(p_FmPort->p_FmPortQmiRegs->nonRxQmiRegs.fmqm_pndtfc);
++ case (e_FM_PORT_COUNTERS_DEQ_FROM_DEFAULT):
++ return GET_UINT32(p_FmPort->p_FmPortQmiRegs->nonRxQmiRegs.fmqm_pndfdc);
++ case (e_FM_PORT_COUNTERS_DEQ_CONFIRM):
++ return GET_UINT32(p_FmPort->p_FmPortQmiRegs->nonRxQmiRegs.fmqm_pndcc);
++ default:
++ REPORT_ERROR(MINOR, E_INVALID_STATE, ("Requested counter is not available"));
++ return 0;
++ }
++ }
++}
++
++t_Error FM_PORT_ModifyCounter(t_Handle h_FmPort, e_FmPortCounters counter, uint32_t value)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ bool bmiCounter = FALSE;
++ volatile uint32_t *p_Reg;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPort->p_FmPortDriverParam, E_INVALID_STATE);
++
++ switch (counter)
++ {
++ case (e_FM_PORT_COUNTERS_DEQ_TOTAL):
++ case (e_FM_PORT_COUNTERS_DEQ_FROM_DEFAULT):
++ case (e_FM_PORT_COUNTERS_DEQ_CONFIRM ):
++ /* check that counter is available for the port type */
++ if ((p_FmPort->portType == e_FM_PORT_TYPE_RX) || (p_FmPort->portType == e_FM_PORT_TYPE_RX_10G))
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Requested counter is not available for Rx ports"));
++ case (e_FM_PORT_COUNTERS_ENQ_TOTAL):
++ bmiCounter = FALSE;
++ break;
++ default: /* BMI counters (or error - will be checked in BMI routine )*/
++ bmiCounter = TRUE;
++ break;
++ }
++
++ if (bmiCounter)
++ {
++ switch (p_FmPort->portType)
++ {
++ case (e_FM_PORT_TYPE_RX_10G):
++ case (e_FM_PORT_TYPE_RX):
++ if (BmiRxPortCheckAndGetCounterPtr(p_FmPort, counter, &p_Reg))
++ RETURN_ERROR(MINOR, E_INVALID_STATE, NO_MSG);
++ break;
++ case (e_FM_PORT_TYPE_TX_10G):
++ case (e_FM_PORT_TYPE_TX):
++ if (BmiTxPortCheckAndGetCounterPtr(p_FmPort, counter, &p_Reg))
++ RETURN_ERROR(MINOR, E_INVALID_STATE, NO_MSG);
++ break;
++ case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
++ case (e_FM_PORT_TYPE_OH_HOST_COMMAND):
++ if (BmiOhPortCheckAndGetCounterPtr(p_FmPort, counter, &p_Reg))
++ RETURN_ERROR(MINOR, E_INVALID_STATE, NO_MSG);
++ break;
++ default:
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Unsupported port type"));
++ }
++ WRITE_UINT32(*p_Reg, value);
++ }
++ else /* QMI counter */
++ {
++
++ /* check that counters are enabled */
++ if (!(GET_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnc) & QMI_PORT_CFG_EN_COUNTERS))
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Requested counter was not enabled"));
++
++ /* Set counter */
++ switch (counter)
++ {
++ case (e_FM_PORT_COUNTERS_ENQ_TOTAL):
++ WRITE_UINT32(p_FmPort->p_FmPortQmiRegs->fmqm_pnetfc, value);
++ break;
++ case (e_FM_PORT_COUNTERS_DEQ_TOTAL):
++ WRITE_UINT32(p_FmPort->p_FmPortQmiRegs->nonRxQmiRegs.fmqm_pndtfc, value);
++ break;
++ case (e_FM_PORT_COUNTERS_DEQ_FROM_DEFAULT):
++ WRITE_UINT32(p_FmPort->p_FmPortQmiRegs->nonRxQmiRegs.fmqm_pndfdc, value);
++ break;
++ case (e_FM_PORT_COUNTERS_DEQ_CONFIRM):
++ WRITE_UINT32(p_FmPort->p_FmPortQmiRegs->nonRxQmiRegs.fmqm_pndcc, value);
++ break;
++ default:
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Requested counter is not available"));
++ }
++ }
++
++ return E_OK;
++}
++
++uint32_t FM_PORT_GetAllocBufCounter(t_Handle h_FmPort, uint8_t poolId)
++{
++ t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
++ uint32_t extPoolReg;
++ uint8_t tmpPool;
++ uint8_t i;
++
++ SANITY_CHECK_RETURN_VALUE(p_FmPort, E_INVALID_HANDLE, 0);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPort->p_FmPortDriverParam, E_INVALID_STATE);
++
++ if ((p_FmPort->portType != e_FM_PORT_TYPE_RX) && (p_FmPort->portType == e_FM_PORT_TYPE_RX_10G))
++ {
++ REPORT_ERROR(MINOR, E_INVALID_STATE, ("Requested counter is not available for non-Rx ports"));
++ return 0;
++ }
++
++ for (i=0;ip_FmPortBmiRegs->rxPortBmiRegs.fmbm_ebmpi[i]);
++ if (extPoolReg & BMI_EXT_BUF_POOL_VALID)
++ {
++ tmpPool = (uint8_t)((extPoolReg & BMI_EXT_BUF_POOL_ID_MASK) >> BMI_EXT_BUF_POOL_ID_SHIFT);
++ if (tmpPool == poolId)
++ {
++ if (extPoolReg & BMI_EXT_BUF_POOL_EN_COUNTER)
++ return GET_UINT32(p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_acnt[i]);
++ else
++ {
++ REPORT_ERROR(MINOR, E_INVALID_STATE, ("Requested counter is not enabled"));
++ return 0;
++ }
++ }
++ }
++ }
++ REPORT_ERROR(MINOR, E_INVALID_STATE, ("Pool %d is not used", poolId));
++ return 0;
++}
++
++t_Error FM_PORT_ModifyAllocBufCounter(t_Handle h_FmPort, uint8_t poolId, uint32_t value)
++{
++ t_FmPort *p_FmPort = (t_FmPort *)h_FmPort;
++ uint32_t extPoolReg;
++ uint8_t tmpPool;
++ uint8_t i;
++
++ SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
++ SANITY_CHECK_RETURN_ERROR(!p_FmPort->p_FmPortDriverParam, E_INVALID_STATE);
++
++ if ((p_FmPort->portType != e_FM_PORT_TYPE_RX) && (p_FmPort->portType == e_FM_PORT_TYPE_RX_10G))
++ RETURN_ERROR(MINOR, E_INVALID_STATE, ("Requested counter is not available for non-Rx ports"));
++
++
++ for (i=0;i