Commit c133015d authored by Michal Berger's avatar Michal Berger Committed by Tomasz Zawadzki
Browse files

scripts/get-pmr: Workaround for missing cmb attributes



Squashed commits:
cherry-pick: 843606d7
cherry-pick: 03e2374c

Signed-off-by: default avatarMichal Berger <michal.berger@intel.com>
Change-Id: Ia659518224899cbb3e9cef19681a457c945a9c96
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/17031


Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
parent 0b261cfd
Loading
Loading
Loading
Loading
+10 −8
Original line number Diff line number Diff line
@@ -12,7 +12,7 @@ shopt -s nullglob
[[ $(< /sys/class/dmi/id/chassis_vendor) == QEMU ]] || exit 0

get_bar() {
	echo "0x$(setpci -s "$1" "$2.L")"
	echo "0x$(setpci -s "$1" "$2.${3:-L}")"
}

get_size() {
@@ -34,12 +34,12 @@ info() {
	local dev=$1

	local pref
	local head

	local base_addr2
	local base_addr4

	local bar bar2 bar3 bar4 bar5
	local bar_type2
	local bar2 bar3 bar4 bar5

	pref[0]=non-prefetchable
	pref[1]=prefetchable
@@ -56,11 +56,17 @@ info() {
			"$bar_type"
	}

	head=$(get_bar "$dev" 0x0e B)
	bar2=$(get_bar "$dev" 0x18)
	bar3=$(get_bar "$dev" 0x1c)
	bar4=$(get_bar "$dev" 0x20)
	bar5=$(get_bar "$dev" 0x24)

	if ((head != 0)); then
		echo "Wrong haeder type under $dev" >&2
		return 1
	fi

	# QEMU uses 64-bit BARs. If there is no CMB or PMR present, report
	# that to the user and signal failure.
	if ((!(bar2 & 1 << 2) && !(bar4 & 1 << 2))); then
@@ -69,12 +75,8 @@ info() {
	fi

	if ((bar2 & 1 << 2)); then
		bar_type2=pmr
		if [[ -e $nvme/cmb ]]; then
			bar_type2=cmb
		fi
		base_addr2=$(((bar2 & ~0xf) + (bar3 << 32)))
		print_info "$bar2" "$base_addr2" "$bar_type2"
		print_info "$bar2" "$base_addr2" cmb
	fi

	if ((bar4 & 1 << 2)); then
+15 −3
Original line number Diff line number Diff line
@@ -79,13 +79,25 @@ xtrace_disable
# read 0 from the CMBSZ register (meaning CMB is either not supported
# or the CMBMSC.CRE bit was cleared).

# FIXME: This is akward but under latest kernels, >=6.1.9, the cmb* attrs
# are gone. Do a quick fallback check via get-pmr and skip registry dump.
mapfile -t get_pmr < <("$rootdir/scripts/get-pmr")

cmb_nvmes=()
for nvme in /sys/class/nvme/nvme+([0-9]); do
	[[ -e $nvme/cmb ]] || continue
	cmb_nvmes+=("$(< "$nvme/address")")
	pci=$(< "$nvme/address")
	if [[ ! -e $nvme/cmb ]]; then
		if printf '%s\n' "${get_pmr[@]}" | grep -qE "$pci.+:cmb"; then
			cmb_nvmes+=("$pci")
		fi
		# Skip the detailed printout as there's no relevant info to display
		# in this case.
		continue
	fi
	cmb_nvmes+=("$pci")
	printf '* %s (%s:%s:%s:%s) CMB:\n' \
		"${nvme##*/}" \
		"$(< "$nvme/address")" \
		"$pci" \
		"$(< "$nvme/model")" \
		"$(< "$nvme/serial")" \
		"$(< "$nvme/transport")"