1bc7cbb1eSPetr Machata#!/bin/bash
2bc7cbb1eSPetr Machata# SPDX-License-Identifier: GPL-2.0
3bc7cbb1eSPetr Machata
4bc7cbb1eSPetr Machata##############################################################################
5bc7cbb1eSPetr Machata# Defines
6bc7cbb1eSPetr Machata
7*bc030d9cSIdo Schimmelif [[ ! -v DEVLINK_DEV ]]; then
88e46aee6SPetr Machata	DEVLINK_DEV=$(devlink port show "${NETIFS[p1]}" -j \
98e46aee6SPetr Machata			     | jq -r '.port | keys[]' | cut -d/ -f-2)
10bc7cbb1eSPetr Machata	if [ -z "$DEVLINK_DEV" ]; then
11bc7cbb1eSPetr Machata		echo "SKIP: ${NETIFS[p1]} has no devlink device registered for it"
12bc7cbb1eSPetr Machata		exit 1
13bc7cbb1eSPetr Machata	fi
14bc7cbb1eSPetr Machata	if [[ "$(echo $DEVLINK_DEV | grep -c pci)" -eq 0 ]]; then
15bc7cbb1eSPetr Machata		echo "SKIP: devlink device's bus is not PCI"
16bc7cbb1eSPetr Machata		exit 1
17bc7cbb1eSPetr Machata	fi
18bc7cbb1eSPetr Machata
19bc7cbb1eSPetr Machata	DEVLINK_VIDDID=$(lspci -s $(echo $DEVLINK_DEV | cut -d"/" -f2) \
20bc7cbb1eSPetr Machata			 -n | cut -d" " -f3)
21*bc030d9cSIdo Schimmelfi
22bc7cbb1eSPetr Machata
23bc7cbb1eSPetr Machata##############################################################################
24bc7cbb1eSPetr Machata# Sanity checks
25bc7cbb1eSPetr Machata
266f64bcb6SJiri Pirkodevlink help 2>&1 | grep resource &> /dev/null
27bc7cbb1eSPetr Machataif [ $? -ne 0 ]; then
28bc7cbb1eSPetr Machata	echo "SKIP: iproute2 too old, missing devlink resource support"
29bc7cbb1eSPetr Machata	exit 1
30bc7cbb1eSPetr Machatafi
31bc7cbb1eSPetr Machata
32bc7cbb1eSPetr Machata##############################################################################
33bc7cbb1eSPetr Machata# Devlink helpers
34bc7cbb1eSPetr Machata
35bc7cbb1eSPetr Machatadevlink_resource_names_to_path()
36bc7cbb1eSPetr Machata{
37bc7cbb1eSPetr Machata	local resource
38bc7cbb1eSPetr Machata	local path=""
39bc7cbb1eSPetr Machata
40bc7cbb1eSPetr Machata	for resource in "${@}"; do
41bc7cbb1eSPetr Machata		if [ "$path" == "" ]; then
42bc7cbb1eSPetr Machata			path="$resource"
43bc7cbb1eSPetr Machata		else
44bc7cbb1eSPetr Machata			path="${path}/$resource"
45bc7cbb1eSPetr Machata		fi
46bc7cbb1eSPetr Machata	done
47bc7cbb1eSPetr Machata
48bc7cbb1eSPetr Machata	echo "$path"
49bc7cbb1eSPetr Machata}
50bc7cbb1eSPetr Machata
51bc7cbb1eSPetr Machatadevlink_resource_get()
52bc7cbb1eSPetr Machata{
53bc7cbb1eSPetr Machata	local name=$1
54bc7cbb1eSPetr Machata	local resource_name=.[][\"$DEVLINK_DEV\"]
55bc7cbb1eSPetr Machata
56bc7cbb1eSPetr Machata	resource_name="$resource_name | .[] | select (.name == \"$name\")"
57bc7cbb1eSPetr Machata
58bc7cbb1eSPetr Machata	shift
59bc7cbb1eSPetr Machata	for resource in "${@}"; do
60bc7cbb1eSPetr Machata		resource_name="${resource_name} | .[\"resources\"][] | \
61bc7cbb1eSPetr Machata			       select (.name == \"$resource\")"
62bc7cbb1eSPetr Machata	done
63bc7cbb1eSPetr Machata
64bc7cbb1eSPetr Machata	devlink -j resource show "$DEVLINK_DEV" | jq "$resource_name"
65bc7cbb1eSPetr Machata}
66bc7cbb1eSPetr Machata
67bc7cbb1eSPetr Machatadevlink_resource_size_get()
68bc7cbb1eSPetr Machata{
69bc7cbb1eSPetr Machata	local size=$(devlink_resource_get "$@" | jq '.["size_new"]')
70bc7cbb1eSPetr Machata
71bc7cbb1eSPetr Machata	if [ "$size" == "null" ]; then
72bc7cbb1eSPetr Machata		devlink_resource_get "$@" | jq '.["size"]'
73bc7cbb1eSPetr Machata	else
74bc7cbb1eSPetr Machata		echo "$size"
75bc7cbb1eSPetr Machata	fi
76bc7cbb1eSPetr Machata}
77bc7cbb1eSPetr Machata
78bc7cbb1eSPetr Machatadevlink_resource_size_set()
79bc7cbb1eSPetr Machata{
80bc7cbb1eSPetr Machata	local new_size=$1
81bc7cbb1eSPetr Machata	local path
82bc7cbb1eSPetr Machata
83bc7cbb1eSPetr Machata	shift
84bc7cbb1eSPetr Machata	path=$(devlink_resource_names_to_path "$@")
85bc7cbb1eSPetr Machata	devlink resource set "$DEVLINK_DEV" path "$path" size "$new_size"
86bc7cbb1eSPetr Machata	check_err $? "Failed setting path $path to size $size"
87bc7cbb1eSPetr Machata}
88bc7cbb1eSPetr Machata
89bc7cbb1eSPetr Machatadevlink_reload()
90bc7cbb1eSPetr Machata{
91bc7cbb1eSPetr Machata	local still_pending
92bc7cbb1eSPetr Machata
93bc7cbb1eSPetr Machata	devlink dev reload "$DEVLINK_DEV" &> /dev/null
94bc7cbb1eSPetr Machata	check_err $? "Failed reload"
95bc7cbb1eSPetr Machata
96bc7cbb1eSPetr Machata	still_pending=$(devlink resource show "$DEVLINK_DEV" | \
97bc7cbb1eSPetr Machata			grep -c "size_new")
98bc7cbb1eSPetr Machata	check_err $still_pending "Failed reload - There are still unset sizes"
99bc7cbb1eSPetr Machata}
100d04cc726SPetr Machata
101d04cc726SPetr Machatadeclare -A DEVLINK_ORIG
102d04cc726SPetr Machata
103d04cc726SPetr Machatadevlink_port_pool_threshold()
104d04cc726SPetr Machata{
105d04cc726SPetr Machata	local port=$1; shift
106d04cc726SPetr Machata	local pool=$1; shift
107d04cc726SPetr Machata
108d04cc726SPetr Machata	devlink sb port pool show $port pool $pool -j \
109d04cc726SPetr Machata		| jq '.port_pool."'"$port"'"[].threshold'
110d04cc726SPetr Machata}
111d04cc726SPetr Machata
112d04cc726SPetr Machatadevlink_port_pool_th_set()
113d04cc726SPetr Machata{
114d04cc726SPetr Machata	local port=$1; shift
115d04cc726SPetr Machata	local pool=$1; shift
116d04cc726SPetr Machata	local th=$1; shift
117d04cc726SPetr Machata	local key="port_pool($port,$pool).threshold"
118d04cc726SPetr Machata
119d04cc726SPetr Machata	DEVLINK_ORIG[$key]=$(devlink_port_pool_threshold $port $pool)
120d04cc726SPetr Machata	devlink sb port pool set $port pool $pool th $th
121d04cc726SPetr Machata}
122d04cc726SPetr Machata
123d04cc726SPetr Machatadevlink_port_pool_th_restore()
124d04cc726SPetr Machata{
125d04cc726SPetr Machata	local port=$1; shift
126d04cc726SPetr Machata	local pool=$1; shift
127d04cc726SPetr Machata	local key="port_pool($port,$pool).threshold"
128d04cc726SPetr Machata
129d04cc726SPetr Machata	devlink sb port pool set $port pool $pool th ${DEVLINK_ORIG[$key]}
130d04cc726SPetr Machata}
131d04cc726SPetr Machata
132d04cc726SPetr Machatadevlink_pool_size_thtype()
133d04cc726SPetr Machata{
134d04cc726SPetr Machata	local pool=$1; shift
135d04cc726SPetr Machata
136d04cc726SPetr Machata	devlink sb pool show "$DEVLINK_DEV" pool $pool -j \
137d04cc726SPetr Machata	    | jq -r '.pool[][] | (.size, .thtype)'
138d04cc726SPetr Machata}
139d04cc726SPetr Machata
140d04cc726SPetr Machatadevlink_pool_size_thtype_set()
141d04cc726SPetr Machata{
142d04cc726SPetr Machata	local pool=$1; shift
143d04cc726SPetr Machata	local thtype=$1; shift
144d04cc726SPetr Machata	local size=$1; shift
145d04cc726SPetr Machata	local key="pool($pool).size_thtype"
146d04cc726SPetr Machata
147d04cc726SPetr Machata	DEVLINK_ORIG[$key]=$(devlink_pool_size_thtype $pool)
148d04cc726SPetr Machata	devlink sb pool set "$DEVLINK_DEV" pool $pool size $size thtype $thtype
149d04cc726SPetr Machata}
150d04cc726SPetr Machata
151d04cc726SPetr Machatadevlink_pool_size_thtype_restore()
152d04cc726SPetr Machata{
153d04cc726SPetr Machata	local pool=$1; shift
154d04cc726SPetr Machata	local key="pool($pool).size_thtype"
155d04cc726SPetr Machata	local -a orig=(${DEVLINK_ORIG[$key]})
156d04cc726SPetr Machata
157d04cc726SPetr Machata	devlink sb pool set "$DEVLINK_DEV" pool $pool \
158d04cc726SPetr Machata		size ${orig[0]} thtype ${orig[1]}
159d04cc726SPetr Machata}
160d04cc726SPetr Machata
161d04cc726SPetr Machatadevlink_tc_bind_pool_th()
162d04cc726SPetr Machata{
163d04cc726SPetr Machata	local port=$1; shift
164d04cc726SPetr Machata	local tc=$1; shift
165d04cc726SPetr Machata	local dir=$1; shift
166d04cc726SPetr Machata
167d04cc726SPetr Machata	devlink sb tc bind show $port tc $tc type $dir -j \
168d04cc726SPetr Machata	    | jq -r '.tc_bind[][] | (.pool, .threshold)'
169d04cc726SPetr Machata}
170d04cc726SPetr Machata
171d04cc726SPetr Machatadevlink_tc_bind_pool_th_set()
172d04cc726SPetr Machata{
173d04cc726SPetr Machata	local port=$1; shift
174d04cc726SPetr Machata	local tc=$1; shift
175d04cc726SPetr Machata	local dir=$1; shift
176d04cc726SPetr Machata	local pool=$1; shift
177d04cc726SPetr Machata	local th=$1; shift
178d04cc726SPetr Machata	local key="tc_bind($port,$dir,$tc).pool_th"
179d04cc726SPetr Machata
180d04cc726SPetr Machata	DEVLINK_ORIG[$key]=$(devlink_tc_bind_pool_th $port $tc $dir)
181d04cc726SPetr Machata	devlink sb tc bind set $port tc $tc type $dir pool $pool th $th
182d04cc726SPetr Machata}
183d04cc726SPetr Machata
184d04cc726SPetr Machatadevlink_tc_bind_pool_th_restore()
185d04cc726SPetr Machata{
186d04cc726SPetr Machata	local port=$1; shift
187d04cc726SPetr Machata	local tc=$1; shift
188d04cc726SPetr Machata	local dir=$1; shift
189d04cc726SPetr Machata	local key="tc_bind($port,$dir,$tc).pool_th"
190d04cc726SPetr Machata	local -a orig=(${DEVLINK_ORIG[$key]})
191d04cc726SPetr Machata
192d04cc726SPetr Machata	devlink sb tc bind set $port tc $tc type $dir \
193d04cc726SPetr Machata		pool ${orig[0]} th ${orig[1]}
194d04cc726SPetr Machata}
195