###############################################################################
# Helper script: /load_kernel_modules.scr/platform/aarch64/layerscape
# Purpose......: Set the Kernel modules for Hardware Models that use the 
#		 lx2160acex7 SoC within the Slackware initial RAM disk 
# 		 ('OS initrd') and the Slackware Installer.
#                This script is sourced from '/load_kernel_modules'
# Author.......: Brenton Earl <el0226@slackware.com>
# Date.........: 18-Jul-2022
# Maintainer...: Brenton Earl <el0226@slackware.com>
#
# Important Note:
# * You must _append_ to the module lists (as this script does)
#   otherwise the base set of modules will not be loaded and would result in
#   a Kernel panic.
# * The initrd uses the 'bash' shell, rather than 'busybox'
#   (as in upstream/x86 Slackware). This allows you (for example)
#   to use 'fallthrough' (case statements terminated with ';&'
#   rather than ';;') within case statements and regular expression
#   matches within 'if' statements.
#   This permits the 'c'-style switch statements where you can
#   'inherit' the previous matches as you move down the cases.
#   This enables you to match on varients of boards, and inherit
#   a 'baseline' of platform modules for that board.
#
# The 'PLATWALK' match is to enable build scripts to process these
# scripts outside of the initrd environment and determine which
# modules will be loaded by a particular Hardware Model.  This must remain
# in place for all scripts.
###############################################################################

case $HWM in
   "SolidRun CEX7 Platform"*|"SolidRun LX2160A Honeycomb"*|PLATWALK)
      platform_detected=1

      # Load the parent platform drivers for the SoC:
      kmod_load_subsyst_soc=1

      SOC_NAME=layerscape
      # If one of the modules within the base list is causing problems on
      # your platform, here are the options laid out as examples:
      # USB="${USB/ehci_orion/differentmodule}" # Substitute module 'ehci_orion' with 'differentmodule'
      # USB="${USB/ehci_orion/}" # Remove the 'ehci_orion' module from the list
      MOD_GPIO+="   "
      # Drivers for PCI and other core sub systems:
      MOD_PHY+="    ahci_qoriq sdhci_of_esdhc"
      # MFD (Multi Functional Devices) drivers:
      MOD_MFD+="    "

      # Needs a little more work:
      # root@honey:~# modinfo amdgpu|grep depen
      # depends:        ttm,drm_display_helper,drm_suballoc_helper,drm_buddy,i2c-algo-bit,gpu-sched,drm_exec,amdxcp,video,drm_ttm_helper
      # [    9.711289] amdgpu: Unknown symbol acpi_video_register_backlight (err -2)
      # [    9.718369] amdgpu: Unknown symbol __acpi_video_get_backlight_type (err -2)
      # modprobe: ERROR: could not insert 'amdgpu': Unknown symbol in module, or unknown parameter (see dmesg)
      #MOD_VIDEO+="  amdgpu"
      
      # Any known-supported PCIe cards (apart from the AMD gfx card above)
      MOD_CARDS+="  "
      MOD_USB+="    onboard-usb-dev dwc3"
      MOD_NET+="    pcs-lynx fsl-dpaa2-eth" 
      MOD_CMP+="    "
      MOD_CRYPTO+=" caam"
      # Real Time Clock:
      MOD_RTC+="    rtc-pcf2127 rtc-efi"
      # Modules for the peripherals on the Hardware Model's main board
      # (outside of the SoC itself)
      MOD_HWM+="    amc6821"
      # Modules for the IP blocks/peripherals embedded within the SoC:
      MOD_SOC+="    "

      # Detect a specfic AMD graphics card and load the Kernel module:
      # This couldn't be detected during the initial Hardware Model detection because
      # the modules to light up the PCI interface were not loaded.

      # 0004:01:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Lexa PRO [Radeon 540/540X/550/550X / RX 540X/550/550X] (rev c7)
      # 0004:01:00.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Baffin HDMI/DP Audio [Radeon RX 550 640SP / RX 560/560X]
      #function hwm_hook_post-modload() {
      #    { lspci 2>/dev/null | grep -q 'Radeon 540/540X/550/550X' ;} && modprobe amdgpu
      #}

      # Define a function to run from the OS InitRD's '/init' immediately prior
      # to switching into the Slackware OS proper.
      # This is after any software RAID arrays et al have been initialised.
      #
      # At this stage, the following paths for Slackware OS are mounted:
      # /proc, /sys, /run, /dev
      # The root file system ('/') is mounted under /mnt
      #
      #function hwm_hook_pre_switch_root() {
      #  echo "Just about to switch into the Slackware OS proper, leaving the OS InitRD"
      #}
      ;;
esac

# We don't have this defined yet for layerscape as we don't need to blacklist any modules.
#
# Set the short name that is used by /load_kernel_modules to install
# the appropriate configuration for modprobe for this Hardware Model:
# These files are stored within the source tree:
# source/k/SlkOS-initrd-overlay/usr/share/hwm-configure/platform/aarch64/modprobe.d/
#
# Note: Typically these are only used to blacklist particular modules from loading
# within the OS InitRD or Installer.  Within the OS the regular location of
# /lib/modprobe.d/ is used and has no connection to the content of the
# OS InitRD/Installer.
#case $hwm in
#  "Lenovo ThinkPad X13s"*)
#      HWM_SHORTNAME=thinkpad-x13s ;;
#esac

# The '/load_kernel_modules' script will load the modules
# set above.

