Tuning

There are a number of optional performance tuning steps you can take.

Memory allocation

The file /boot/start.elf contains the GPU's firmware. It also controls the allocation of memory between Linux and the GPU. The Pi has a total of 256Mb of memory, and the default allocation is set to 224Mb for Linux and 32Mb for the GPU.

If you want to allocate 192Mb for Linux and 64Mb for the GPU, copy /boot/arm192_start.elf to /boot/start.elf and reboot. (You can't use a symlink instead of copying because the GPU's boot code can only read from a vfat filesystem, and vfat does not support symlinks.)

If you want to allocate 128Mb for Linux and 128Mb for the GPU, copy /boot/arm128_start.elf to /boot/start.elf and reboot.

If you want to allocate 240Mb for Linux and 16Mb for the GPU, copy /boot/arm240_start.elf to /boot/start.elf and reboot. Note that this choice may cause problems if you wish to play audio or change framebuffer settings.

If you want to restore the default allocation of 224Mb for Linux and 32Mb for the GPU, copy /boot/arm224_start.elf to /boot/start.elf and reboot.

When the raspi-boot package is upgraded, it will attempt to keep your current choice of memory allocation, but this may not always be possible. Please check the Linux boot messages and, if necessary, copy your choice of arm*_start.elf file again.

Building Pi-optimised packages

Alien Bob has recently been sneaking a new ARCH handling code block into Slackware's own SlackBuilds that, with one small change, can be used to build packages optimised for the Pi. The code is:

MARCH=$( uname -m )
if [ -z "$ARCH" ]; then
  case "$MARCH" in
    i?86)    export ARCH=i486 ;;
    armv7hl) export ARCH=$MARCH ;;
    arm*)    export ARCH=arm ;;
    *)       export ARCH=$MARCH ;;
  esac
fi

if [ "$ARCH" = "i486" ]; then
  SLKCFLAGS="-O2 -march=i486 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
  SLKCFLAGS="-O2 -march=i686 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
  SLKCFLAGS="-O2 -fPIC"
  LIBDIRSUFFIX="64"
elif [ "$ARCH" = "armv7hl" ]; then
  SLKCFLAGS="-O2 -march=armv7-a -mfpu=vfpv3-d16"
  LIBDIRSUFFIX=""
else
  SLKCFLAGS="${SLKCFLAGS:-O2}"   # changed from SLKCFLAGS="-O2"
  LIBDIRSUFFIX=""
fi

case "$ARCH" in
    arm*) TARGET=$ARCH-slackware-linux-gnueabi ;;
    *)    TARGET=$ARCH-slackware-linux ;;
esac

[...]
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
./configure \
[...]
  --build=$TARGET
SlackBuilds that include this code block can then be called as shown below. This example will produce a Pi-optimised package that is compatible with the Slackware ARM packages already installed on your Pi, although the package won't work on other ARM systems that don't have hardware floating point.
ARCH=armv5hl \
SLKCFLAGS="-O2 -mthumb -march=armv5te -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=softfp" \
sh example.SlackBuild
Other combinations of GCC flags will give greater optimisation but less compatibility. For more details, see http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/ARM-Options.html