This is support for Xilinx MicroBlaze processors. MicroBlaze
is a soft core processor designed for Xilinx FPGAs. With this
new architecture ptxdist have to handle dynamic platform
configurations exported by Xilinx design tools.

Some essential changes and extensions inside a few ptxdist core
scripts were made to merge external platform configurations into
the ptxdist platform configuration. That is very important since
the resulting build process have to know about the real CPU
features like hardware multiplier, barrel shifter or similar high
performance accelerators.

So ptxdist knows about this specialty, parse the new platform
directory "xlbsp" and use the content for its own platform
configuration. The content of the new platform directory "xlbsp"
comes from Xilinx design tools and have to be:
  * auto-config.in      (Linux Kernel 2.4 configuration)
  * Kconfig.auto        (Linux Kernel 2.6 configuration)
  * xilinx.dts          (Linux Kernel 2.6 configuration)
  * config.mk           (U-Boot configuration)
  * xparameters.h       (U-Boot configuration)

Signed-off-by: Stephan Linz <l...@li-pro.net>
---
 platforms/architecture.in            |    9 ++
 platforms/kernel.in                  |    9 ++-
 platforms/microblaze.in              |   36 +++++++++
 platforms/xlbsp_softcpu.in           |   25 ++++++
 rules/post/ptxd_make_xilinx_bsp.make |   41 ++++++++++
 rules/pre/Machine.make               |   68 +++++++++++++++++
 rules/pre/Rules.make                 |    4 +-
 scripts/lib/ptxd_lib_00-init.sh      |    3 +
 scripts/lib/ptxd_make_00-init.sh     |    5 +
 scripts/lib/ptxd_make_xilinx_bsp.sh  |  136 ++++++++++++++++++++++++++++++++++
 10 files changed, 333 insertions(+), 3 deletions(-)
 create mode 100644 platforms/microblaze.in
 create mode 100644 platforms/xlbsp_softcpu.in
 create mode 100644 rules/post/ptxd_make_xilinx_bsp.make
 create mode 100644 rules/pre/Machine.make
 create mode 100644 scripts/lib/ptxd_make_xilinx_bsp.sh

diff --git a/platforms/architecture.in b/platforms/architecture.in
index 5a623cb..3b8436b 100644
--- a/platforms/architecture.in
+++ b/platforms/architecture.in
@@ -69,6 +69,13 @@ choice
                help
                  This is support for the SPARC architecture.
 
+       config ARCH_MICROBLAZE
+               bool "microblaze "
+               select HAS_MMU
+               select ARCH_SUPPORTS_ENDIAN_BIG
+               help
+                 This is support for the Xilinx MicroBlaze architecture (with 
MMU).
+
        config ARCH_MIPS
                bool "mips       "
                select HAS_MMU
@@ -302,6 +309,7 @@ config ARCH_STRING
        default "m68k"                  if ARCH_M68K
        default "ppc"                   if ARCH_PPC
        default "sparc"                 if ARCH_SPARC
+       default "microblaze"            if ARCH_MICROBLAZE
        default "mips"                  if ARCH_MIPS
        default "cris"                  if ARCH_CRIS
        default "parisc"                if ARCH_PARISC
@@ -309,6 +317,7 @@ config ARCH_STRING
 
 # ----------------------------------------------------------------------------
 
+source "generated/microblaze_options.in"
 source "generated/architecture_options.in"
 
 endmenu
diff --git a/platforms/kernel.in b/platforms/kernel.in
index 476bdde..0d8702e 100644
--- a/platforms/kernel.in
+++ b/platforms/kernel.in
@@ -83,6 +83,7 @@ config KERNEL_ARCH_STRING
        default "blackfin"              if ARCH_BLACKFIN
        default "m68k"                  if ARCH_M68K
        default "sparc"                 if ARCH_SPARC
+       default "microblaze"            if ARCH_MICROBLAZE
        default "mips"                  if ARCH_MIPS
        default "mips"                  if ARCH_MIPSEL
        default "cris"                  if ARCH_CRIS
@@ -142,11 +143,16 @@ choice
                help
                 This is the target to get the kernel image as an raw 
uncompressed
                 binary file.
+
+if KERNEL_ARCH_POWERPC || ARCH_MICROBLAZE
+
        config KERNEL_IMAGE_SIMPLE
                bool
                prompt "simpleImage"
                help
                  Create a simple Image with embedded DTB
+endif
+
 endchoice
 
 if KERNEL_IMAGE_SIMPLE
@@ -182,7 +188,8 @@ config KERNEL_IMAGE
        default "vmImage" if KERNEL_IMAGE_VM
        default "vmlinux" if KERNEL_IMAGE_VMLINUX
        default "Image"   if KERNEL_IMAGE_RAW
-       default "simpleImage.${PTXCONF_KERNEL_IMAGE_SIMPLE_TARGET}.elf" if 
KERNEL_IMAGE_SIMPLE
+       default "simpleImage.${PTXCONF_KERNEL_IMAGE_SIMPLE_TARGET}.elf" if 
KERNEL_IMAGE_SIMPLE && KERNEL_ARCH_POWERPC
+       default "simpleImage.${PTXCONF_KERNEL_IMAGE_SIMPLE_TARGET}" if 
KERNEL_IMAGE_SIMPLE && ARCH_MICROBLAZE
 
 config KERNEL_XZ
        prompt "build xz-utils hosttool"
diff --git a/platforms/microblaze.in b/platforms/microblaze.in
new file mode 100644
index 0000000..e5c9793
--- /dev/null
+++ b/platforms/microblaze.in
@@ -0,0 +1,36 @@
+## SECTION=microblaze_options
+
+menu "microblaze options            "
+depends on ARCH_MICROBLAZE
+
+config ARCH_MICROBLAZE_HAVE_XLBSP
+       prompt "Xilinx BSP (TPOS)"
+       bool
+       default y
+       help
+         The Xilinx BSP (shortly "xlbsp") is part of a specific OSELAS.BSP()
+         and consits of different automatically generated files from the
+         Xilinx FPGA design. All files for the xlbsp have to be copied from
+         Xilinx FPGA design project into the OSELAS.BSP() platforms directory
+         ${PTXDIST_PLATFORMCONFIGDIR}/platforms/xlbsp. Then make a link in
+         OSELAS.BSP() platforms directory:
+
+               xlbsp_softcpu.in -> xlbsp/Kconfig.auto
+
+         You have to copy all auto generated files from Xilinx BSP "Third
+         Party OS (TPOS)" to xlbsp in your OSELAS.BSP(). To get TPOS you have
+         to include the EDK user repository from MB-Ref into your Xilinx FPGA
+         design flow.
+
+         See: http://gitorious.org/mbref/mbref
+          or: http://www.li-pro.de/xilinx_mb/mbref/start
+
+if ARCH_MICROBLAZE_HAVE_XLBSP
+
+menu "SoftCPU features"
+source "generated/xlbsp_softcpu.in"
+endmenu
+
+endif
+
+endmenu
diff --git a/platforms/xlbsp_softcpu.in b/platforms/xlbsp_softcpu.in
new file mode 100644
index 0000000..a8f6b96
--- /dev/null
+++ b/platforms/xlbsp_softcpu.in
@@ -0,0 +1,25 @@
+## SECTION=xlbsp_softcpu
+
+comment "------------------------------------"
+comment "Xilinx BSP Configuration"
+comment "------------------------------------"
+comment ""
+comment "Do you missing configuration?"
+comment ""
+comment "You need the file 'Kconfig.auto'"
+comment "from your Xilinx BSP directory."
+comment ""
+comment "Copy this file into the Xilinx BSP"
+comment "configuration path, normaly at:"
+comment "'${PTXDIST_WORKSPACE}/platforms/xlbsp' or"
+comment "'${PTXDIST_PLATFORMCONFIGDIR}/platforms/xlbsp'."
+comment ""
+comment "HINT: In some cases, the 'SECTION'"
+comment "comment in Kconfig.auto is missing."
+comment "This leads to the same error. If so"
+comment "adding the comment line on top of"
+comment "the file Kconfig.auto:"
+comment ""
+comment "## SECTION=xlbsp_softcpu"
+comment ""
+comment "------------------------------------"
diff --git a/rules/post/ptxd_make_xilinx_bsp.make 
b/rules/post/ptxd_make_xilinx_bsp.make
new file mode 100644
index 0000000..325714e
--- /dev/null
+++ b/rules/post/ptxd_make_xilinx_bsp.make
@@ -0,0 +1,41 @@
+# -*-makefile-*-
+#
+# Copyright (C) 2011 by Stephan Linz <l...@li-pro.net>
+#
+# See CREDITS for details about who has contributed to this project.
+#
+# For further information about the PTXdist project and license conditions
+# see the README file.
+#
+
+ifeq ($(PTXCONF_ARCH_MICROBLAZE),y)
+
+ifeq ($(PTXCONF_ARCH_MICROBLAZE_HAVE_XLBSP),y)
+$(STATEDIR)/u-boot.prepare: $(STATEDIR)/u-boot.xlbsp
+endif
+
+ifeq ($(PTXCONF_ARCH_MICROBLAZE_HAVE_XLBSP),y)
+$(STATEDIR)/kernel.prepare: $(STATEDIR)/kernel.xlbsp
+endif
+
+ifeq ($(PTXCONF_KERNEL_IMAGE_SIMPLE),y)
+SEL_ROOTFS-$(PTXCONF_IMAGE_KERNEL) += $(IMAGEDIR)/linuximage.ub
+endif
+
+$(IMAGEDIR)/linuximage.ub: $(KERNEL_IMAGE_PATH_y).ub $(IMAGEDIR)/linuximage
+       @echo -n "Creating '$(notdir $(@))' from '$(notdir $(<))'..."
+       @install -m 644 "$(<)" "$(@)"
+       @echo "done."
+
+endif
+
+$(STATEDIR)/%.xlbsp: $(STATEDIR)/%.extract
+       @$(call targetinfo)
+       @$(call xilinx/bsp, $(PTX_MAP_TO_PACKAGE_$(*)), 
$($(PTX_MAP_TO_PACKAGE_$(*))_DIR))
+       @$(call touch)
+
+xilinx/bsp = \
+       $(call world/env, $(1)) \
+       ptxd_make_xilinx_bsp
+
+# vim: syntax=make
diff --git a/rules/pre/Machine.make b/rules/pre/Machine.make
new file mode 100644
index 0000000..e6c9601
--- /dev/null
+++ b/rules/pre/Machine.make
@@ -0,0 +1,68 @@
+# -*-makefile-*-
+#
+# This file contains global machine/cpu dependent definitions.
+#
+# Copyright (C) 2011 by Stephan Linz <l...@li-pro.net>
+#
+# See CREDITS for details about who has contributed to this project.
+#
+# For further information about the PTXdist project and license conditions
+# see the README file.
+#
+
+# ----------------------------------------------------------------------------
+# Machine & CPU Defines (mainly SoftCPU)
+# ----------------------------------------------------------------------------
+
+#
+# Xilinx MicroBlaze, SoftCPU inside a FPGA
+#
+ifeq ($(PTXCONF_ARCH_MICROBLAZE),y)
+
+  # Use defines by Xilinx BSP (borrowed from Linux kernel)
+  ifeq ($(PTXCONF_ARCH_MICROBLAZE_HAVE_XLBSP),y)
+
+    # What CPU vesion are we building for, and crack it open
+    # as major.minor.rev
+    CPU_VER   := $(shell echo $(PTXCONF_XILINX_MICROBLAZE0_HW_VER))
+    CPU_MAJOR := $(shell echo $(CPU_VER) | cut -d '.' -f 1)
+    CPU_MINOR := $(shell echo $(CPU_VER) | cut -d '.' -f 2)
+    CPU_REV   := $(shell echo $(CPU_VER) | cut -d '.' -f 3)
+
+    export CPU_VER CPU_MAJOR CPU_MINOR CPU_REV
+
+    # Use cpu-related PTXCONF_ vars to set compile options.
+    # The various PTXCONF_XILINX cpu features options are integers 0/1/2...
+    # rather than bools y/n
+
+    # Work out HW multiplier support.  This is icky.
+    # 1. Spartan2 has no HW multipliers.
+    # 2. MicroBlaze v3.x always uses them, except in Spartan 2
+    # 3. All other FPGa/CPU ver combos, we can trust the PTXCONF_ settings
+    ifeq (,$(findstring spartan2,$(PTXCONF_XILINX_MICROBLAZE0_FAMILY)))
+      ifeq ($(CPU_MAJOR),3)
+        CPUFLAGS-1 += -mno-xl-soft-mul
+      else
+        # USE_HW_MUL can be 0, 1, or 2, defining a heirarchy of HW Mul support.
+        CPUFLAGS-$(subst 1,,$(PTXCONF_XILINX_MICROBLAZE0_USE_HW_MUL)) += 
-mxl-multiply-high
+        CPUFLAGS-$(PTXCONF_XILINX_MICROBLAZE0_USE_HW_MUL) += -mno-xl-soft-mul
+      endif
+    endif
+    CPUFLAGS-$(PTXCONF_XILINX_MICROBLAZE0_USE_DIV) += -mno-xl-soft-div
+    CPUFLAGS-$(PTXCONF_XILINX_MICROBLAZE0_USE_BARREL) += -mxl-barrel-shift
+    CPUFLAGS-$(PTXCONF_XILINX_MICROBLAZE0_USE_PCMP_INSTR) += 
-mxl-pattern-compare
+
+    ifeq ($(PTXCONF_HAS_HARDFLOAT),y)
+      CPUFLAGS-$(PTXCONF_XILINX_MICROBLAZE0_USE_FPU) += -mhard-float
+      CPUFLAGS-$(PTXCONF_XILINX_MICROBLAZE0_USE_FPU) += -mxl-float-convert
+      CPUFLAGS-$(PTXCONF_XILINX_MICROBLAZE0_USE_FPU) += -mxl-float-sqrt
+    endif
+
+    CPUFLAGS-1 += -mcpu=v$(CPU_VER)
+
+    CPUFLAGS := $(CPUFLAGS-1) $(CPUFLAGS-2)
+
+  endif # PTXCONF_ARCH_MICROBLAZE_HAVE_XLBSP
+
+endif # PTXCONF_ARCH_MICROBLAZE
+
diff --git a/rules/pre/Rules.make b/rules/pre/Rules.make
index c531a50..85babcd 100644
--- a/rules/pre/Rules.make
+++ b/rules/pre/Rules.make
@@ -38,8 +38,8 @@ CROSS_PATH := 
$(PTXDIST_SYSROOT_CROSS)/bin:$(PTXDIST_SYSROOT_CROSS)/sbin:$$PATH
 #
 # Environment variables for the compiler
 #
-CROSS_CFLAGS                   := $(PTXCONF_TARGET_EXTRA_CFLAGS)
-CROSS_CXXFLAGS                 := $(PTXCONF_TARGET_EXTRA_CXXFLAGS)
+CROSS_CFLAGS                   := $(CPUFLAGS) $(PTXCONF_TARGET_EXTRA_CFLAGS)
+CROSS_CXXFLAGS                 := $(CPUFLAGS) $(PTXCONF_TARGET_EXTRA_CXXFLAGS)
 CROSS_CPPFLAGS                 := $(strip $(PTXCONF_TARGET_EXTRA_CPPFLAGS) 
$(PTXDIST_CROSS_CPPFLAGS))
 CROSS_LDFLAGS                  := $(strip $(PTXCONF_TARGET_EXTRA_LDFLAGS)  
$(PTXDIST_CROSS_LDFLAGS))
 
diff --git a/scripts/lib/ptxd_lib_00-init.sh b/scripts/lib/ptxd_lib_00-init.sh
index 02a48e7..524f30a 100644
--- a/scripts/lib/ptxd_lib_00-init.sh
+++ b/scripts/lib/ptxd_lib_00-init.sh
@@ -101,6 +101,9 @@ ptxd_init_ptxdist_path() {
     PTXDIST_PATH_PLATFORMS="${PTXDIST_PATH//://platforms:}"
     export PTXDIST_PATH_PLATFORMS
 
+    PTXDIST_PATH_PLATFORMS_XLBSP="${PTXDIST_PATH_PLATFORMS//://xlbsp:}"
+    export PTXDIST_PATH_PLATFORMS_XLBSP
+
     ptxd_init_ptxdist_path_sysroot
 }
 
diff --git a/scripts/lib/ptxd_make_00-init.sh b/scripts/lib/ptxd_make_00-init.sh
index b74e47a..526dbae 100644
--- a/scripts/lib/ptxd_make_00-init.sh
+++ b/scripts/lib/ptxd_make_00-init.sh
@@ -32,6 +32,11 @@ ptxd_init_arch() {
                    ipkg_arch=arm
                    ;;
            esac
+           ;;
+
+       microblaze)
+           ipkg_arch=mb
+           ;;
     esac
 
     PTXDIST_IPKG_ARCH_STRING="${ipkg_arch}"
diff --git a/scripts/lib/ptxd_make_xilinx_bsp.sh 
b/scripts/lib/ptxd_make_xilinx_bsp.sh
new file mode 100644
index 0000000..4e53a8b
--- /dev/null
+++ b/scripts/lib/ptxd_make_xilinx_bsp.sh
@@ -0,0 +1,136 @@
+#!/bin/bash
+#
+# Copyright (C) 2011 by Stephan Linz <l...@li-pro.net>
+#
+# See CREDITS for details about who has contributed to this project.
+#
+# For further information about the PTXdist project and license conditions
+# see the README file.
+#
+
+#
+# apply Xilinx BSP for U-Boot
+#
+ptxd_make_xilinx_bsp_apply_uboot()
+{
+    local ptx_xlbsp_uboot_cfg="$(ptxd_get_ptxconf PTXCONF_U_BOOT_CONFIG)"
+    local pkg_xlbsp_uboot_files="${pkg_xlbsp_dir}/config.mk            \
+                                ${pkg_xlbsp_dir}/xparameters.h"
+    local pkg_xlbsp_uboot_file
+    local ptx_xlbsp_uboot_dir
+
+    # find ptx_xlbsp_uboot_dir
+    if ! ptxd_get_path 
"${pkg_build_dir}/board/xilinx/${ptx_xlbsp_uboot_cfg%%_config}"; then
+       echo "xlbsp: ${pkg_xlbsp_apply}: no board path found"
+       return
+    fi
+    ptx_xlbsp_uboot_dir="${ptxd_reply}"
+
+    # apply files (remove old, link new)
+    echo "xlbsp: ${pkg_xlbsp_apply}: board '$(ptxd_print_path 
"${ptx_xlbsp_uboot_dir:-<none>}")'"
+    pushd "${ptx_xlbsp_uboot_dir}" > /dev/null &&
+    for pkg_xlbsp_uboot_file in ${pkg_xlbsp_uboot_files}; do
+       echo "xlbsp: ${pkg_xlbsp_apply}: rm/ln '$(ptxd_print_path 
"${pkg_xlbsp_uboot_file:-<none>}")'"
+
+       local pkg_uboot_file="$(basename "${pkg_xlbsp_uboot_file}")" &&
+       rm -f ${pkg_uboot_file} &&
+       ln -s ${pkg_xlbsp_uboot_file} ${pkg_uboot_file}
+
+    done &&
+    popd > /dev/null
+}
+export -f ptxd_make_xilinx_bsp_apply_uboot
+
+#
+# apply Xilinx BSP for Linux kernel 2.6
+#
+ptxd_make_xilinx_bsp_apply_kernel()
+{
+    local ptx_xlbsp_kernel_arch="$(ptxd_get_ptxconf 
PTXCONF_KERNEL_ARCH_STRING)"
+    local pkg_xlbsp_kernel24_files="${pkg_xlbsp_dir}/auto-config.in"
+    local pkg_xlbsp_kernel26_files="${pkg_xlbsp_dir}/Kconfig.auto"
+    local ptx_xlbsp_kernel_platform
+    local pkg_xlbsp_kernel_files
+    local pkg_xlbsp_kernel_file
+    local ptx_xlbsp_kernel_dir
+
+    # files and platform to use per version
+    case "${pkg_pkg}" in
+       linux-24*|linux-2.4*)
+           pkg_xlbsp_kernel_files=${pkg_xlbsp_kernel24_files};
+           ptx_xlbsp_kernel_platform="uclinux-auto";
+           ;;
+       linux-26*|linux-2.6*)
+           pkg_xlbsp_kernel_files=${pkg_xlbsp_kernel26_files};
+           ptx_xlbsp_kernel_platform="generic";
+           ;;
+       *)
+           echo "xlbsp: ${pkg_xlbsp_apply}: unsupported kernel version: 
${pkg_pkg##linux-}"
+           return
+           ;;
+    esac
+
+    # find ptx_xlbsp_kernel_dir
+    if ! ptxd_get_path 
"${pkg_build_dir}/arch/${ptx_xlbsp_kernel_arch}/platform/${ptx_xlbsp_kernel_platform}";
 then
+       echo "xlbsp: ${pkg_xlbsp_apply}: no board path found"
+       return
+    fi
+    ptx_xlbsp_kernel_dir="${ptxd_reply}"
+
+    # apply files (remove old, link new)
+    echo "xlbsp: ${pkg_xlbsp_apply}: board '$(ptxd_print_path 
"${ptx_xlbsp_kernel_dir:-<none>}")'"
+    pushd "${ptx_xlbsp_kernel_dir}" > /dev/null &&
+    for pkg_xlbsp_kernel_file in ${pkg_xlbsp_kernel_files}; do
+       echo "xlbsp: ${pkg_xlbsp_apply}: rm/ln '$(ptxd_print_path 
"${pkg_xlbsp_kernel_file:-<none>}")'"
+
+       local pkg_kernel_file="$(basename "${pkg_xlbsp_kernel_file}")" &&
+       rm -f ${pkg_kernel_file} &&
+       ln -s ${pkg_xlbsp_kernel_file} ${pkg_kernel_file}
+
+    done &&
+    popd > /dev/null
+}
+export -f ptxd_make_xilinx_bsp_apply_kernel
+
+#
+# generic apply Xilinx BSP function
+#
+ptxd_make_xilinx_bsp_apply()
+{
+    local pkg_xlbsp_dir
+    local pkg_xlbsp_apply
+
+    ptxd_in_path PTXDIST_PATH_PLATFORMS_XLBSP || return
+    pkg_xlbsp_dir="${ptxd_reply}"
+
+    # files to use per package
+    case "${pkg_pkg}" in
+       u-boot*)
+           pkg_xlbsp_apply="uboot";
+           ;;
+       linux*)
+           pkg_xlbsp_apply="kernel";
+           ;;
+    esac || return
+
+    echo "pkg_xlbsp_dir:     '$(ptxd_print_path "${pkg_xlbsp_dir:-<none>}")'"
+    echo "pkg_build_dir:     '$(ptxd_print_path "${pkg_build_dir:-<none>}")'"
+    echo
+
+    # apply Xilinx BSP per package if files are available
+    if [ -n "${pkg_xlbsp_apply}" ]; then
+       echo    "xlbsp: ${pkg_xlbsp_apply}: apply '$(ptxd_print_path 
"${pkg_xlbsp_dir:-<none>}")'"
+       "ptxd_make_xilinx_bsp_apply_${pkg_xlbsp_apply}" || return
+       echo -e "xlbsp: ${pkg_xlbsp_apply}: done\n"
+    fi
+}
+export -f ptxd_make_xilinx_bsp_apply
+
+#
+# copy and adjust per package
+#
+ptxd_make_xilinx_bsp() {
+    ptxd_make_world_init || return
+    ptxd_make_xilinx_bsp_apply
+}
+export -f ptxd_make_xilinx_bsp
-- 
1.6.0.4


-- 
ptxdist mailing list
ptxdist@pengutronix.de

Reply via email to