xref: /spdk/test/nvme/cmb/cmb.sh (revision 4641aa53ae14ed7b2ae23551837977a7903dd986)
10b55bf71SMichal Berger#!/usr/bin/env bash
2eb53c232Spaul luse#  SPDX-License-Identifier: BSD-3-Clause
3eb53c232Spaul luse#  Copyright (C) 2020 Intel Corporation
4eb53c232Spaul luse#  All rights reserved.
5eb53c232Spaul luse#
6eb53c232Spaul luse
70b55bf71SMichal Bergertestdir=$(readlink -f "$(dirname "$0")")
80b55bf71SMichal Bergerrootdir=$(readlink -f "$testdir/../../../")
90b55bf71SMichal Bergersource "$rootdir/test/common/autotest_common.sh"
100b55bf71SMichal Berger
110b55bf71SMichal Bergerdecode_cmb_regs() {
120b55bf71SMichal Berger	local cmb=$1
130b55bf71SMichal Berger	local cmbs
140b55bf71SMichal Berger	local cmbl
150b55bf71SMichal Berger
160b55bf71SMichal Berger	mapfile -t cmb < "$cmb"
170b55bf71SMichal Berger	cmb=("${cmb[@]##* }")
180b55bf71SMichal Berger
190b55bf71SMichal Berger	cmbl=0${cmb[0]}
200b55bf71SMichal Berger	cmbs=0${cmb[1]}
210b55bf71SMichal Berger
220b55bf71SMichal Berger	local szu szu_unit
230b55bf71SMichal Berger	szu[0]=4 szu_unit[0]=KiB
240b55bf71SMichal Berger	szu[1]=64 szu_unit[1]=KiB
250b55bf71SMichal Berger	szu[2]=1 szu_unit[2]=MiB
260b55bf71SMichal Berger	szu[3]=16 szu_unit[3]=MiB
270b55bf71SMichal Berger	szu[4]=256 szu_unit[4]=MiB
280b55bf71SMichal Berger	szu[5]=4 szu_unit[5]=GiB
290b55bf71SMichal Berger	szu[6]=64 szu_unit[6]=GiB
300b55bf71SMichal Berger
310b55bf71SMichal Berger	local bool
320b55bf71SMichal Berger	bool[0]="not set"
330b55bf71SMichal Berger	bool[1]="set"
340b55bf71SMichal Berger
350b55bf71SMichal Berger	local size size_m
360b55bf71SMichal Berger	local ofst bir
370b55bf71SMichal Berger
380b55bf71SMichal Berger	size=$(((cmbs >> 12) & 0x0fffff))
390b55bf71SMichal Berger	size_m=$(((cmbs >> 8) & 0xf))
400b55bf71SMichal Berger	((size *= szu[size_m]))
410b55bf71SMichal Berger
420b55bf71SMichal Berger	size="$size ${szu_unit[size_m]}"
430b55bf71SMichal Berger	ofst=$(printf '0x%x' $(((cmbl >> 12) & 0x0fffff)))
440b55bf71SMichal Berger	bir=$(printf '0x%x' $((cmbl & 0x7)))
450b55bf71SMichal Berger
460b55bf71SMichal Berger	cat <<- CMBSZ
470b55bf71SMichal Berger		  SZ:    $size
480b55bf71SMichal Berger		  SZU:   ${szu[size_m]} ${szu_unit[size_m]}
490b55bf71SMichal Berger		  WDS:   ${bool[cmbs & 1 << 4 ? 1 : 0]}
500b55bf71SMichal Berger		  RDS:   ${bool[cmbs & 1 << 3 ? 1 : 0]}
510b55bf71SMichal Berger		  LISTS: ${bool[cmbs & 1 << 2 ? 1 : 0]}
520b55bf71SMichal Berger		  CQS:   ${bool[cmbs & 1 << 1 ? 1 : 0]}
530b55bf71SMichal Berger		  SQS:   ${bool[cmbs & 1 << 0 ? 1 : 0]}
540b55bf71SMichal Berger
550b55bf71SMichal Berger	CMBSZ
560b55bf71SMichal Berger
570b55bf71SMichal Berger	cat <<- CMBLOC
580b55bf71SMichal Berger		  OFST:    $ofst
590b55bf71SMichal Berger		  CQDA:    ${bool[cmbl & 1 << 8 ? 1 : 0]}
600b55bf71SMichal Berger		  CDMMMS:  ${bool[cmbl & 1 << 7 ? 1 : 0]}
610b55bf71SMichal Berger		  CDPCILS: ${bool[cmbl & 1 << 6 ? 1 : 0]}
620b55bf71SMichal Berger		  CDPMLS:  ${bool[cmbl & 1 << 5 ? 1 : 0]}
630b55bf71SMichal Berger		  CQPDS:   ${bool[cmbl & 1 << 4 ? 1 : 0]}
640b55bf71SMichal Berger		  CQMMS:   ${bool[cmbl & 1 << 3 ? 1 : 0]}
650b55bf71SMichal Berger		  BIR:     $bir
660b55bf71SMichal Berger
670b55bf71SMichal Berger	CMBLOC
680b55bf71SMichal Berger}
690b55bf71SMichal Berger
700b55bf71SMichal Berger"$rootdir/scripts/setup.sh" reset
710b55bf71SMichal Berger
720b55bf71SMichal Bergerxtrace_disable
730b55bf71SMichal Berger
740b55bf71SMichal Berger# Look for all the nvme controllers which support CMB. The easiest, and
750b55bf71SMichal Berger# fastest, way to do it is by checking if the cmb attr under sysfs has
760b55bf71SMichal Berger# been created. If it doesn't exist, than the nvme driver must have
770b55bf71SMichal Berger# read 0 from the CMBSZ register (meaning CMB is either not supported
780b55bf71SMichal Berger# or the CMBMSC.CRE bit was cleared).
790b55bf71SMichal Berger
80*03e2374cSMichal Berger# FIXME: This is akward but under latest kernels, >=6.1.9, the cmb* attrs
81*03e2374cSMichal Berger# are gone. Do a quick fallback check via get-pmr and skip registry dump.
82*03e2374cSMichal Bergermapfile -t get_pmr < <("$rootdir/scripts/get-pmr")
83*03e2374cSMichal Berger
840b55bf71SMichal Bergercmb_nvmes=()
850b55bf71SMichal Bergerfor nvme in /sys/class/nvme/nvme+([0-9]); do
86*03e2374cSMichal Berger	pci=$(< "$nvme/address")
87*03e2374cSMichal Berger	if [[ ! -e $nvme/cmb ]]; then
88*03e2374cSMichal Berger		if printf '%s\n' "${get_pmr[@]}" | grep -qE "$pci.+:cmb"; then
89*03e2374cSMichal Berger			cmb_nvmes+=("$pci")
90*03e2374cSMichal Berger		fi
91*03e2374cSMichal Berger		# Skip the detailed printout as there's no relevant info to display
92*03e2374cSMichal Berger		# in this case.
93*03e2374cSMichal Berger		continue
94*03e2374cSMichal Berger	fi
95*03e2374cSMichal Berger	cmb_nvmes+=("$pci")
960b55bf71SMichal Berger	printf '* %s (%s:%s:%s:%s) CMB:\n' \
970b55bf71SMichal Berger		"${nvme##*/}" \
98*03e2374cSMichal Berger		"$pci" \
990b55bf71SMichal Berger		"$(< "$nvme/model")" \
1000b55bf71SMichal Berger		"$(< "$nvme/serial")" \
1010b55bf71SMichal Berger		"$(< "$nvme/transport")"
1020b55bf71SMichal Berger	decode_cmb_regs "$nvme/cmb"
1030b55bf71SMichal Bergerdone
1040b55bf71SMichal Berger
1050b55bf71SMichal Bergerxtrace_restore
1060b55bf71SMichal Berger
1070b55bf71SMichal Berger"$rootdir/scripts/setup.sh"
1080b55bf71SMichal Berger
1090b55bf71SMichal Berger# Check if controllers which we found have been taken out from the nvme
1100b55bf71SMichal Berger# driver. If yes then we may safely use it for our tests.
1110b55bf71SMichal Berger
1120b55bf71SMichal Bergerfor nvme in "${!cmb_nvmes[@]}"; do
1130b55bf71SMichal Berger	if [[ -e /sys/bus/pci/drivers/nvme/${cmb_nvmes[nvme]} ]]; then
1140b55bf71SMichal Berger		printf '%s device still in use, skipping\n' "${cmb_nvmes[nvme]}"
1150b55bf71SMichal Berger		unset -v "cmb_nvmes[nvme]"
1160b55bf71SMichal Berger	fi >&2
1170b55bf71SMichal Bergerdone
1180b55bf71SMichal Berger
1190b55bf71SMichal Bergerif ((${#cmb_nvmes[@]} == 0)); then
1200b55bf71SMichal Berger	printf 'No suitable nvme devices found, aborting CMB tests\n' >&2
1210b55bf71SMichal Berger	exit 1
1220b55bf71SMichal Bergerfi
1230b55bf71SMichal Berger
1240b55bf71SMichal Bergerrun_test "cmb_copy" "$testdir/cmb_copy.sh" "${cmb_nvmes[@]}"
125