1#!/bin/sh -e
2# AVSBus control for PMBUS voltage regulator modules (VRMs)
3# Switches output voltage target between
4# - VOUT_COMMAND register (AVSBus disabled, default on Zaius)
5# - AVSBus target output (AVSBus enabled, voltage set by host)
6
7cpu0_i2c_bus="7"
8cpu1_i2c_bus="8"
9buses="$cpu0_i2c_bus $cpu1_i2c_bus"
10vdd_i2c_addr_page="0x60:0x01"
11vdn_i2c_addr_page="0x64:0x01"
12vcs_i2c_addr_page="0x64:0x00"
13addrs_pages="$vdd_i2c_addr_page $vdn_i2c_addr_page $vcs_i2c_addr_page"
14
15i2c_path="/sys/bus/i2c/devices/"
16
17# Usage: vrm_avs_enable <bus> <i2c_address> <page>
18# Initializes the AVSBus VOUT setpoint to the value in PMBus VOUT_COMMAND
19vrm_avs_enable()
20{
21    echo "Enabling AVSBus on bus $1 VRM @$2 rail $3..."
22    echo 1 > "${i2c_path}/$1-$(printf "%04x" "$2")/hwmon/hwmon*/avs$(printf "%d" "$3")_enable"
23}
24
25# Usage: vrm_avs_disable <bus> <i2c_address> <page>
26# Sets OPERATION PMBUS register to
27# - Enable/Disable: On
28# - VOUT Source: VOUT_COMMAND
29# - AVSBus Copy: VOUT_COMMAND remains unchanged
30vrm_avs_disable()
31{
32    echo "Disabling AVSBus on bus $1 VRM @$2 rail $3..."
33    echo 0 > "${i2c_path}/$1-$(printf "%04x" "$2")/hwmon/hwmon*/avs$(printf "%d" "$3")_enable"
34}
35
36# Usage: for_each_rail <command>
37# <command> will be invoked with <bus> <i2c_address> <page>
38for_each_rail()
39{
40    for bus in $buses
41    do
42        for addr_page in $addrs_pages
43        do
44            $1 "$bus" "$(echo "$addr_page" | tr : " ")"
45        done
46    done
47}
48
49if [ "$1" = "enable" ]
50then
51    for_each_rail vrm_avs_enable
52elif [ "$1" = "disable" ]
53then
54    for_each_rail vrm_avs_disable
55else
56    echo "\"$0 <enable|disable>\" to control whether VRMs use AVSBus"
57    echo "\"$0 <vdn_max>\" to set VDN rails VOUT_MAX to 1.1V"
58fi
59