Commit 0cb256c0 authored by Michal Berger's avatar Michal Berger Committed by Jim Harris
Browse files

scripts: Add helper script for looking up PMR info under qemu



Added mainly to verify if the PMR setup on the VM is correct.

Example of an output with PMR device size of 32M configured for
two nvme devices, and one nvme device with 128M CMB.

[root@fedora31-cloud-1614680581-9ba06c102 ~]# /tmp/get-pmr
nvme0:0000:00:04.0:64-bit:prefetchable:0xf0000000:0xf7ffffff:0x08000000:cmb
nvme1:0000:00:05.0:64-bit:prefetchable:0xf8000000:0xf9ffffff:0x02000000:pmr
nvme2:0000:00:06.0:64-bit:prefetchable:0xfa000000:0xfbffffff:0x02000000:pmr

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


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
parent 45fc211e
Loading
Loading
Loading
Loading

scripts/get-pmr

0 → 100755
+50 −0
Original line number Diff line number Diff line
#!/usr/bin/env bash
# We simply check if BAR2 is present as that's where PMR or CMB is
# meant to be located under qemu. If found, print some stats then exit.

[[ $(uname -s) == Linux ]] || exit 0
# Use MSR instead?
[[ $(< /sys/class/dmi/id/chassis_vendor) == QEMU ]] || exit 0

get_bar2() {
	echo "0x$(setpci -s "$1" 0x18.L)"
}

get_size() {
	local addr=$1
	local start end type

	while IFS="- " read -r start end type; do
		start=0x$start end=0x$end
		if ((start == addr)) && [[ $type == *"$pci"* ]]; then
			printf '0x%08x:0x%08x:0x%08x\n' \
				"$start" "$end" $((end - start + 1))
			return 0
		fi
	done < /proc/iomem
	echo "unknown"
}

info() {
	local bar=$1

	local pref loc

	pref[0]=non-prefetchable
	pref[1]=prefetchable

	loc[0]=32-bit
	loc[1]="<1MiB"
	loc[2]=64-bit

	echo "${loc[(bar >> 1) & 0x3]}:${pref[bar & 1 << 3 ? 1 : 0]}:$(get_size $((bar & ~0xf)))"
}

for nvme in /sys/class/nvme/nvme*; do
	pci=$(readlink -f "$nvme/device") pci=${pci##*/}
	bar2=$(get_bar2 "$pci") || continue
	((bar2 != 0x0)) || continue
	bar=pmr
	[[ -e $nvme/cmb ]] && bar=cmb
	echo "${nvme##*/}:$pci:$(info "$bar2"):$bar"
done