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