xref: /spdk/scripts/env_dpdk/check_dpdk_pci_api.sh (revision 11694e8d59b8b109194a6acebefd0506ba92d338)
144290e13STomasz Zawadzki#!/usr/bin/env bash
244290e13STomasz Zawadzki#  SPDX-License-Identifier: BSD-3-Clause
344290e13STomasz Zawadzki#  Copyright (C) 2022 Intel Corporation
444290e13STomasz Zawadzki#  All rights reserved.
544290e13STomasz Zawadzki#
644290e13STomasz Zawadzki
744290e13STomasz Zawadzkiscriptdir=$(readlink -f "$(dirname "$0")")
844290e13STomasz Zawadzkirootdir=$(readlink -f "$scriptdir/../..")
944290e13STomasz Zawadzkisource "$rootdir/scripts/common.sh"
1044290e13STomasz Zawadzki
1144290e13STomasz Zawadzkiset -e
1244290e13STomasz Zawadzkishopt -s extglob
13*11694e8dSTomasz Zawadzkishopt -s nullglob
1444290e13STomasz Zawadzki
1544290e13STomasz Zawadzkimode=${1:-check} # check or fix
1644290e13STomasz Zawadzki
1744290e13STomasz Zawadzki# By default verify headers matching the DPDK submodule
1844290e13STomasz Zawadzkidpdk_dir=${2:-"$rootdir/dpdk"}
1944290e13STomasz Zawadzkidpdk_ver=$(< "$dpdk_dir/VERSION")
2044290e13STomasz Zawadzki
2144290e13STomasz Zawadzkienv_path="$rootdir/lib/env_dpdk"
2244290e13STomasz Zawadzkitracked_versions=("$env_path/"+([0-9]).+([0-9])/*.h)
2344290e13STomasz Zawadzkitracked_versions=("${tracked_versions[@]#"$env_path/"}")
2444290e13STomasz Zawadzkitracked_versions=("${tracked_versions[@]%/*}")
2544290e13STomasz Zawadzki
2644290e13STomasz Zawadzki# The DPDK PCI API tracking started with DPDK 22.11, all prior versions will use DPDK 22.07 headers
2744290e13STomasz Zawadzkitarget_ver="22.07"
2844290e13STomasz Zawadzkiwhile read -r ver; do
2944290e13STomasz Zawadzki	ge "$dpdk_ver" "$ver" && target_ver=$ver && break
3044290e13STomasz Zawadzkidone < <(printf "%s\n" "${tracked_versions[@]}" | sort -Vru)
3144290e13STomasz Zawadzki
3244290e13STomasz Zawadzkiecho "Checking DPDK PCI API from $dpdk_ver against $target_ver ..."
3344290e13STomasz Zawadzki
3444290e13STomasz Zawadzkitarget_headers=("$env_path/$target_ver/"*.h)
3544290e13STomasz Zawadzkitarget_headers=("${target_headers[@]##*/}")
3644290e13STomasz Zawadzki
3744290e13STomasz Zawadzki# The includes should point to headers in SPDK tree rather than system ones.
3844290e13STomasz Zawadzkiuse_local_includes="-e "
3944290e13STomasz Zawadzkifor header in "${target_headers[@]}"; do
4044290e13STomasz Zawadzki	use_local_includes+="s/#include <$header>/#include \"$header\"/g;"
4144290e13STomasz Zawadzkidone
4244290e13STomasz Zawadzki
4344290e13STomasz Zawadzkifor header in "${target_headers[@]}"; do
4444290e13STomasz Zawadzki	dpdk_file="$dpdk_dir/$(git -C "$dpdk_dir" ls-files "*/$header")"
45*11694e8dSTomasz Zawadzki	patch_dir="$scriptdir/$target_ver"
46*11694e8dSTomasz Zawadzki	patch_versions=("$patch_dir/"+([0-9]).+([0-9])-$header.patch)
47*11694e8dSTomasz Zawadzki	patch_versions=("${patch_versions[@]#"$patch_dir/"}")
48*11694e8dSTomasz Zawadzki	patch_versions=("${patch_versions[@]%-$header.patch*}")
49*11694e8dSTomasz Zawadzki
50*11694e8dSTomasz Zawadzki	# Patch file version matches to versions equal or greater than
51*11694e8dSTomasz Zawadzki	# their creation.
52*11694e8dSTomasz Zawadzki	while read -r ver; do
53*11694e8dSTomasz Zawadzki		ge "$dpdk_ver" "$ver" && patch_version=$ver && break
54*11694e8dSTomasz Zawadzki	done < <(printf "%s\n" "${patch_versions[@]}" | sort -Vru)
5544290e13STomasz Zawadzki
5644290e13STomasz Zawadzki	# Patch DPDK header with any workarounds necessary
57*11694e8dSTomasz Zawadzki	patch_file="$patch_dir/$patch_version-$header.patch"
5844290e13STomasz Zawadzki	if [[ -s $patch_file ]]; then
5944290e13STomasz Zawadzki		dpdk_header=$(patch -s "$dpdk_file" "$patch_file" -o - | sed "$use_local_includes")
6044290e13STomasz Zawadzki	else
6144290e13STomasz Zawadzki		dpdk_header=$(sed "$use_local_includes" "$dpdk_file")
6244290e13STomasz Zawadzki	fi
6344290e13STomasz Zawadzki
6444290e13STomasz Zawadzki	spdk_file="$env_path/$target_ver/$header"
6544290e13STomasz Zawadzki	if ! single_diff=$(diff -u "$spdk_file" <(echo "$dpdk_header")); then
6644290e13STomasz Zawadzki		header_diff+="$single_diff\n"
6744290e13STomasz Zawadzki	fi
6844290e13STomasz Zawadzkidone
6944290e13STomasz Zawadzki
7044290e13STomasz Zawadzkiif [[ -z "$header_diff" ]]; then
7144290e13STomasz Zawadzki	echo "No differences in headers found."
7244290e13STomasz Zawadzki	exit 0
7344290e13STomasz Zawadzkifi
7444290e13STomasz Zawadzki
7544290e13STomasz Zawadzkiif [[ "$mode" == "check" ]]; then
7644290e13STomasz Zawadzki	cat <<- CHECK
7744290e13STomasz Zawadzki		$(echo -e "$header_diff")
7844290e13STomasz Zawadzki
7944290e13STomasz Zawadzki		Differences in DPDK and internal SPDK headers found.
8044290e13STomasz Zawadzki		For changes that do not affect the API, please use 'fix' as \$1 to this script.
81a6139931STomasz Zawadzki		If API was changed, please create "$env_path/${dpdk_ver%.*}/" with appropriate headers.
8244290e13STomasz Zawadzki
8344290e13STomasz Zawadzki	CHECK
842c8000beSTomasz Zawadzki	exit 1
8544290e13STomasz Zawadzkielif [[ "$mode" == "fix" ]]; then
8644290e13STomasz Zawadzki	echo -e "$header_diff" | patch -d "$env_path/$target_ver/"
8744290e13STomasz Zawadzki	echo "Fixed differences between DPDK and internal SPDK headers."
8844290e13STomasz Zawadzkielse
8944290e13STomasz Zawadzki	echo "Incorrect \$1 passed, please use 'check' or 'fix'."
9044290e13STomasz Zawadzki	exit 1
9144290e13STomasz Zawadzkifi
92