#!/bin/sh -e
#
# Copyright 2020 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# This library is compatible with set -e, and its use is recommended.
#
# Expected usage of this library: Create a device-specific or display-specific
# script which looks up the necessary args for update_tcon_fw() and calls that
# function.  get_display_res() may be useful for identifying different display
# models which need different firmware.
#
# It is *not* recommended to source this library from any script responsible for
# more than just using this updater.  Instead create a higher level script with
# the broader responsibility, and have it execute in a subprocess the script
# which sources this library.
#
# If using this library for multiple displays on one device, it is recommended
# to use each from a separate script or invocation, and append a unique suffix
# to $LOG_TAG so that the source of log messages can be identified.

LOG_TAG="chromeos-nvt-tcon-firmware-update"
INHIBIT_SUSPEND_FILE="/run/lock/power_override/${LOG_TAG}.lock"

# Require a minimum battery percentage to mitigate
# https://issuetracker.google.com/144947174 as best we can.
# This should NOT be necessary for most firmware update processes in the
# Chromium OS ecosystem.
MIN_BATTERY_PERCENT=15

loginfo() {
  echo "$*"
  logger --tag="${LOG_TAG}" -- "$*"
}

logerror() {
  logger --stderr --tag="${LOG_TAG}" -- "$*"
}

# Pipe a non-negative integer to this.
#
# If the version is a non-negative integer, this will write the input unmodified
# to stdout and return zero.
#
# If the input is not a non-negative integer, this will write nothing to stdout,
# and will return non-zero.
verify_integer() {
  grep -o -E '^(0|[1-9][0-9]*)$'
}

# Pipe a TCON firmware version to this.
#
# If the version matches the expected format, this will write the input
# unmodified to stdout and return zero.
#
# If the input is not formatted properly, this will write nothing to stdout, and
# will return non-zero.
verify_fw_ver() {
  grep -o -E '^0x[0-9A-F]{2}-0x[0-9A-F]{2}$'
}

# Block suspend while running a command.
#
# Args:
#   $@ The command to run while suspend is blocked.
block_suspend_and_run_cmd() {
  local ret=0

  trap 'rm -f -- "${INHIBIT_SUSPEND_FILE}"' EXIT
  echo "$$" > "${INHIBIT_SUSPEND_FILE}"

  "$@"
  # Preserve the exit status in case we're running without set -e.
  ret="$?"

  rm -f "${INHIBIT_SUSPEND_FILE}"
  trap - EXIT
  return "${ret}"
}

# Prints display resolution string to stdout as one line, with trailing newline.
#
# Args:
#   dp_modes_path: path to DP modes sysfs file, e.g.
#       /sys/class/drm/card0-eDP-1/modes
#
# Sample display resolutions:
#   1920x1080
#   3840x2160
get_display_res() {
  [ "$#" -eq 1 ] || return
  local dp_modes_path="$1"

  if [ ! -e "${dp_modes_path}" ]; then
    logerror "expected sysfs path is missing: ${dp_modes_path}"
    return 1
  fi
  head -n 1 "${dp_modes_path}"
}

# Prints battery percentage as non-negative integer to stdout as one line, with
# trailing newline.
#
# Sample percentages:
#   8
#   98
#   100
#
# IMPORTANT:
# Battery charge state is checked to help mitigate
# https://issuetracker.google.com/144947174 as best we can.
# Most firmware update processes in the Chromium OS ecosystem should NOT need
# to care about battery charge state.
get_battery_percent() {
  # Use of battery_display_percent based on:
  # https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/chromeos-base/infineon-firmware-updater/files/tpm-firmware-updater
  # (latest revision 1f9212ce3222e59aa221cccb97b2ce709c5614da)
  dump_power_status \
      | grep -E '^battery_display_percent [1-9][0-9]*(\.[0-9]+)?$' \
      | awk '{print $2}' | cut -d. -f1 | verify_integer
}

# Prints firmware file version string to stdout as one line, with trailing
# newline.
#
# Args:
#   firmware_file: path to TCON firmware binary file
#
# Sample versions:
#   0x00-0x00
#   0x01-0x02
#   0x01-0x04
#
# The current implementation resolves any symlinks in firmware_file and then
# uses the real path to determine the firmware version.  This is subject to
# change.
get_fw_file_ver() {
  [ "$#" -eq 1 ] || return
  local firmware_file="$1"

  # The use of grep ensures empty output if ${firmware_file} does not match the
  # expected format.
  realpath -e -- "${firmware_file}" | head -n 1 \
      | grep -o -E '_0x[0-9A-F]{2}_0x[0-9A-F]{2}\.bin$' \
      | sed 's/^_//; s/\.bin$//; s/_/-/g' | verify_fw_ver
}

# Prints installed firmware version to stdout as one line, with trailing
# newline.
#
# Args:
#   dp_aux_device: path to DP aux device, e.g. /dev/drm_dp_aux0
#
# Sample versions:
#   0x00-0x00
#   0x01-0x02
#   0x01-0x04
get_installed_fw_ver() {
  [ "$#" -eq 1 ] || return
  local dp_aux_device="$1"

  if [ ! -e "${dp_aux_device}" ]; then
    logerror "expected device file is missing: ${dp_aux_device}"
    return 1
  fi
  hexdump -s 0x40A -n 2 -e '1/1 "0x%02X-" 1/1 "0x%02X\n"' "${dp_aux_device}" \
      | verify_fw_ver
}

# Override this to perform actions immediately prior to display reset.
#
# This is only invoked when a TCON FW update is about to be attempted.
#
# A typical action might be to disable Panel Self-Refresh (PSR), which requires
# a driver-specific implementation.
#
# This MUST be overridden by the script using this library.  If no actions are
# needed, override with an empty no-op function.
hook_pre_display_reset() {
  logerror "hook_pre_display_reset() is not implemented.  THIS IS A BUG."
  exit 1
}

# "chromeos-boot-alert" uses "display_boot_message show_message" which
# conveniently performs the panel reset necessary for PSR disable to take
# effect.
show_message_and_reset_panel() {
  display_boot_message action restore_frecon
  chromeos-boot-alert update_tcon_firmware
}

# Override this to perform actions immediately after display reset.
#
# This is only invoked when a TCON FW update is about to be attempted.
#
# A typical action might be to verify that Panel Self-Refresh (PSR) is disabled,
# which requires a driver-specific implementation.
#
# This MUST be overridden by the script using this library.  If no actions are
# needed, override with an empty no-op function.
hook_post_display_reset() {
  logerror "hook_post_display_reset() is not implemented.  THIS IS A BUG."
  exit 1
}

# Args:
#   num_attempts: number of times to check for PSR being disabled
#   sleep_seconds: number of seconds to sleep between checking PSR status
#   dp_aux_device: path to DP aux device, e.g. /dev/drm_dp_aux0
#   i2c_device: path to I2C device, e.g. /dev/i2c-3
#   config_file: path to TCON firmware updater config file
#   firmware_file: path to TCON firmware binary file
invoke_updater_binary_loop() {
  [ "$#" -eq 6 ] || return
  local num_attempts="$1"
  local sleep_seconds="$2"
  local dp_aux_device="$3"
  local i2c_device="$4"
  local config_file="$5"
  local firmware_file="$6"

  local ret=1
  local i
  for i in $(seq -- "${num_attempts}"); do
    if [ "${i}" -gt 1 ]; then
      sleep -- "${sleep_seconds}"
    fi
    loginfo "invoking TCON firmware updater attempt ${i} of ${num_attempts}"
    ret=0
    # Executing this from a cwd that will not exist in the pivot_root results in
    # failure, so chdir to / to ensure success.  The initial deployment of this
    # script executes from / already, but safest not to rely on that.
    (cd / && exec minijail0 --profile=minimalistic-mountns -n -p \
        --uts=localhost -b /sys -b "${dp_aux_device}" -b "${i2c_device}" \
        -u fwupdate-drm_dp_aux-i2c -g fwupdate-drm_dp_aux-i2c -G \
        -S /opt/google/tcon/policies/nvt-tcon-fw-updater.update.policy -- \
        /usr/sbin/nvt-tcon-fw-updater -p:"${firmware_file}" "${config_file}") \
        || ret="$?"
    if [ "${ret}" -eq 0 ]; then
      loginfo "TCON firmware updater attempt ${i} of ${num_attempts} succeeded"
      return
    fi
    logerror "TCON firmware updater attempt ${i} of ${num_attempts} failed" \
        "with exit status ${ret}"
  done
  return "${ret}"
}

request_reboot_after_update() {
  touch /tmp/force_reboot_after_fw_update
}

# Args:
#   dp_aux_device: path to DP aux device, e.g. /dev/drm_dp_aux0
#   i2c_device: path to I2C device, e.g. /dev/i2c-3
#   config_file: path to TCON firmware updater config file
#   firmware_file: path to TCON firmware binary file
update_tcon_fw() {
  [ "$#" -eq 4 ] || return
  local dp_aux_device="$1"
  local i2c_device="$2"
  local config_file="$3"
  local firmware_file="$4"

  local target_fw_ver
  target_fw_ver="$(get_fw_file_ver "${firmware_file}")"
  local installed_fw_ver
  installed_fw_ver="$(get_installed_fw_ver "${dp_aux_device}")"

  if [ "${installed_fw_ver}" = "${target_fw_ver}" ]; then
    loginfo "no TCON firmware update needed, installed version" \
        "${installed_fw_ver} matches target version"
    return
  fi

  loginfo "TCON firmware update needed, installed version is" \
      "${installed_fw_ver} target version is ${target_fw_ver}"

  # Require a minimum battery percentage to mitigate
  # https://issuetracker.google.com/144947174 as best we can.
  # This check should NOT be necessary for most firmware update processes in the
  # Chromium OS ecosystem.
  local battery_percent
  battery_percent="$(get_battery_percent)"
  if [ "${battery_percent}" -lt "${MIN_BATTERY_PERCENT}" ]; then
    loginfo "skipping TCON firmware update due to low battery charge"
    return
  fi

  block_suspend_and_run_cmd do_tcon_fw_update
}

# Only update_tcon_fw() should invoke this.
#
# Preconditions:
# - Suspend must be inhibited.
# - Battery state of charge must be sufficient to complete the update.
do_tcon_fw_update() {
  hook_pre_display_reset || return
  show_message_and_reset_panel || return
  hook_post_display_reset || return

  # Without this sleep, encountered updater failures resulting in permanently
  # broken sleeps.  From initial testing 1 second sleep is enough, going with
  # 2 seconds just in case.  This extra time is trivial compared to updater
  # wall time.
  sleep 2
  invoke_updater_binary_loop 4 2 "${dp_aux_device}" "${i2c_device}" \
      "${config_file}" "${firmware_file}" || return

  # This sleep is just in case, have not yet tested whether we can do without
  # this reliably.
  sleep 2
  # Reset the display so get_installed_fw_ver can detect the new version.
  show_message_and_reset_panel

  # This sleep is just in case, initial testing without this was successful.
  sleep 2
  local post_update_fw_ver
  post_update_fw_ver="$(get_installed_fw_ver "${dp_aux_device}")"

  if [ "${post_update_fw_ver}" != "${target_fw_ver}" ]; then
    logerror "attempted and failed to update TCON firmware, expected" \
        "installed version to become ${target_fw_ver} instead it is " \
        "${post_update_fw_ver}"
    return 1
  fi

  # Only request a reboot after successful update to reduce risk of this updater
  # causing a boot loop.
  request_reboot_after_update
  loginfo "successfully updated TCON firmware to ${post_update_fw_ver}"
}
