#!/bin/bash

# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)

COMPATIBLE=$(cat /proc/device-tree/compatible 2>/dev/null | tr -d '\000' | sed -n -e 's/.*\(allwinner\|amlogic\|fsl\|nxp\|qcom\|raspberrypi\|rockchip\|samsung\).*/\1/p')

do_dtfile() {
  if [[ -n $(find /flash -name extlinux.conf) ]]; then
    EXTLINUX=$(find /flash -name extlinux.conf)
    DTFILE=$(grep FDT "${EXTLINUX}" | sed 's,^ *FDT /,,g')
  elif [ -e /flash/boot.ini ]; then
    DTFILE=$(grep -m 1 dtb_name /flash/boot.ini | cut -d \" -f2 | sed 's,/dtb/,,g')
  elif [ -e /flash/uEnv.ini ]; then
    DTFILE=$(grep dtb_name /flash/uEnv.ini | sed 's,dtb_name=/dtb/,,g')
  else
    do_unknown
  fi
  echo "${DTFILE}"
}

do_dtflag() {
  if [ "${COMPATIBLE}" = "raspberrypi" ]; then
    DTFLAG=$(cat /proc/device-tree/compatible | cut -f1,2 -d',' | head -n 1)
    PIREV=$(awk '/^Revision/ {sub($3,-6, "", $3); print $3}' /proc/cpuinfo) # truncate to 6-chars
    case "${PIREV}" in
      d*)
        MEMSIZE="-8g"
        ;;
      c*)
        MEMSIZE="-4g"
        ;;
      b*)
        MEMSIZE="-2g"
        ;;
      a*)
        MEMSIZE="-1g"
        ;;
      *0002 | *0003 | *0004 | *0005 | *0006 | *0007 | *0008 | *0009 | *0012)
        MEMSIZE="-256"
        ;;
      0* | 9*)
        MEMSIZE="-512"
        ;;
      *)
        MEMSIZE=""
        ;;
    esac
  else
    DTFLAG=$(cat /proc/device-tree/compatible | cut -f1,2 -d',' | head -n 1)
    MEMSIZE=$(awk -F " " '/MemTotal:/ {print $2}' /proc/meminfo)
    if [ "${MEMSIZE}" -lt "524288" ]; then
      MEMSIZE="-512"
    else
      MEMSIZE=""
    fi
  fi
  echo "${DTFLAG}${MEMSIZE}"
}

do_dtname() {
  DTNAME=$(cat /proc/device-tree/compatible | cut -f1,2 -d',' | head -n 1)
  echo "${DTNAME}"
}

do_dtsoc() {
  DTSOC=$(cat /proc/device-tree/compatible | cut -f1,2 -d',' | tail -n 1)
  echo "${DTSOC}"
}

do_unknown() {
  echo "unknown"
  exit 1
}

if [ -n "${COMPATIBLE}" ]; then
  case $(basename "${0}") in
    dtfile)
      do_dtfile
      ;;
    dtflag)
      do_dtflag
      ;;
    dtname)
      do_dtname
      ;;
    dtsoc)
      do_dtsoc
      ;;
  esac
else
  do_unknown
fi
