c36cf18
#!/bin/bash
c36cf18
c36cf18
source configlib.sh
c36cf18
c36cf18
# Generates arch configurations in the current directory based on
c36cf18
# 1. an openvswitch.spec file
c36cf18
# 2. an expanded dpdk tree
c36cf18
c36cf18
if (( $# != 2 )); then
c36cf18
    echo "$0: openvswitch.spec dpdk_tree" >&2
c36cf18
    exit 1
c36cf18
fi
c36cf18
c36cf18
OVSSPEC="$1"
c36cf18
DPDKDIR="$2"
c36cf18
c36cf18
# accumulate all arch + name triples
c36cf18
OVS_DPDK_CONF_MACH_ARCH=()
c36cf18
for arch in $(grep %define\ dpdk_mach_arch "$OVSSPEC" | sed 's@%define dpdk_mach_arch @@')
c36cf18
do
c36cf18
    OVS_DPDK_CONF_MACH_ARCH+=($arch)
c36cf18
done
c36cf18
c36cf18
OVS_DPDK_CONF_MACH_TMPL=()
c36cf18
for tmpl in $(grep %define\ dpdk_mach_tmpl "$OVSSPEC" | sed 's@%define dpdk_mach_tmpl @@')
c36cf18
do
c36cf18
    OVS_DPDK_CONF_MACH_TMPL+=($tmpl)
c36cf18
done
c36cf18
c36cf18
OVS_DPDK_CONF_MACH=()
c36cf18
for mach in $(grep %define\ dpdk_mach\  "$OVSSPEC" | sed 's@%define dpdk_mach @@')
c36cf18
do
c36cf18
    OVS_DPDK_CONF_MACH+=($mach)
c36cf18
done
c36cf18
c36cf18
OVS_DPDK_TARGETS=()
c36cf18
for ((i=0; i < ${#OVS_DPDK_CONF_MACH[@]}; i++));
c36cf18
do
c36cf18
    OVS_DPDK_TARGETS+=("${OVS_DPDK_CONF_MACH_ARCH[$i]}-${OVS_DPDK_CONF_MACH_TMPL[$i]}-linuxapp-gcc")
c36cf18
    echo "DPDK-target: ${OVS_DPDK_TARGETS[$i]}"
c36cf18
done
c36cf18
c36cf18
OUTPUT_DIR=$(pwd)
c36cf18
pushd "$DPDKDIR"
c36cf18
for ((i=0; i < ${#OVS_DPDK_TARGETS[@]}; i++));
c36cf18
do
c36cf18
    echo "For ${OVS_DPDK_TARGETS[$i]}:"
c36cf18
c36cf18
    echo "     a. Generating initial config"
c36cf18
    echo "        make V=1 T=${OVS_DPDK_TARGETS[$i]} O=${OVS_DPDK_TARGETS[$i]}"
c36cf18
    make V=1 T=${OVS_DPDK_TARGETS[$i]} O=${OVS_DPDK_TARGETS[$i]} -j8 config
c36cf18
    ORIG_SHA=""
c36cf18
    OUTDIR="${OVS_DPDK_TARGETS[$i]}"
c36cf18
c36cf18
    echo "     b. calculating and applying sha"
c36cf18
    calc_sha ORIG_SHA "${OUTDIR}/.config"
c36cf18
    if [ "$ORIG_SHA" == "" ]; then
c36cf18
        echo "ERROR: Unable to get sha for arch ${OVS_DPDK_TARGETS[$i]}"
c36cf18
        exit 1
c36cf18
    fi
c36cf18
    echo "# -*- cfg-sha: ${ORIG_SHA}" > ${OUTDIR}/.config.new
c36cf18
    cat "${OUTDIR}/.config" >> "${OUTDIR}/.config.new"
c36cf18
    cp "${OUTDIR}/.config" "${OUTDIR}/.config.orig"
c36cf18
    mv -f "${OUTDIR}/.config.new" "${OUTDIR}/.config"
c36cf18
c36cf18
    echo "     c. setting initial configurations"
c36cf18
    # these are the original setconf values from openvswitch.spec
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_MACHINE "\\\"${OVS_DPDK_CONF_MACH[$i]}\\\""
c36cf18
c36cf18
    # Disable DPDK libraries not needed by OVS
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_TIMER n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_CFGFILE n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_JOBSTATS n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_LPM n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_ACL n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_POWER n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_DISTRIBUTOR n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_REORDER n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_PORT n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_TABLE n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_PIPELINE n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_KNI n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_CRYPTODEV n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_SECURITY n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_FLOW_CLASSIFY n
c36cf18
c36cf18
    # Disable virtio user as not used by OVS
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_VIRTIO_USER n
c36cf18
c36cf18
    # Enable DPDK libraries needed by OVS
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_VHOST_NUMA y
c36cf18
c36cf18
    # start by disabling ALL PMDs
c36cf18
    for pmd in $(grep _PMD= "${OUTDIR}/.config" | sed 's@=\(y\|n\)@@g')
c36cf18
    do
c36cf18
        set_conf "${OUTDIR}" $pmd n
c36cf18
    done
c36cf18
c36cf18
    # PMDs which have their own naming scheme
c36cf18
    # the default for this was 'n' at one point.  Make sure we keep it
c36cf18
    # as such
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_PMD_QAT n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_PMD_OCTEONTX_SSOVF n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_PMD_VHOST n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_PMD_KNI n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_PMD_XENVIRT n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_PMD_NULL_CRYPTO n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_PMD_NULL n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_PMD_TAP n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_PMD_CRYPTO_SCHEDULER n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_PMD_SKELETON_EVENTDEV n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_PMD_SW_EVENTDEV n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_PMD_PCAP n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_PMD_BOND n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_PMD_AF_PACKET n
c36cf18
c36cf18
    # whitelist of enabled PMDs
c36cf18
    # Soft PMDs to enable
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_PMD_RING y
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_VIRTIO_PMD y
c36cf18
c36cf18
    # HW PMDs
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_I40E_PMD y
c36cf18
    case "${OVS_DPDK_CONF_MACH_ARCH[i]}" in
c36cf18
    x86_64)
c36cf18
        set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_ENIC_PMD y
c36cf18
        ;&
c36cf18
    arm64)
c36cf18
        set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_IXGBE_PMD y
c36cf18
        set_conf "${OUTDIR}" CONFIG_RTE_LIBRTE_IGB_PMD y
c36cf18
        ;;
c36cf18
    esac
c36cf18
c36cf18
    # Disable kernel modules
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_EAL_IGB_UIO n
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_KNI_KMOD n
c36cf18
c36cf18
    # Disable experimental stuff
c36cf18
    set_conf "${OUTDIR}" CONFIG_RTE_NEXT_ABI n
c36cf18
c36cf18
    cp "${OUTDIR}/.config" "${OUTPUT_DIR}/${OVS_DPDK_TARGETS[$i]}-config"
c36cf18
done
c36cf18
popd >/dev/null
c36cf18
c36cf18
echo -n "For each arch ( "
c36cf18
for ((i=0; i < ${#OVS_DPDK_CONF_MACH_ARCH[@]}; i++));
c36cf18
do
c36cf18
    echo -n "${OVS_DPDK_CONF_MACH_ARCH[i]} "
c36cf18
done
c36cf18
echo "):"
c36cf18
echo "1. ensure you enable the requisite hw"