From 9b8b9304c51c2887a1e21f28d74adf7fb415cfe3 Mon Sep 17 00:00:00 2001 From: Tomaz Zaman Date: Mon, 10 Aug 2026 15:38:37 +0200 Subject: [PATCH 09/62] layerscape: armv8_64b: full hardware enablement + fancontrol Kernel: SFP cages (+MDIO_I2C), MaxLinear GPY115C and the SFP-module PHY set, HWMON=y + THERMAL_HWMON=y (kmod-hwmon-core would otherwise cap every sensor to an unshipped =m; the thermal bridge exposes cluster_thermal to userspace), EMC2305/TMP401/INA238 sensors, LEDS_GPIO + triggers, USB-C HD3SS3220, gpio-poweroff, SCMI, Lynx 28G. fancontrol: lm-sensors script at the meta-mono SRCREV with the same curve (linear 40-80C on cluster_thermal, MINSTART 51, MINSTOP 34), procd-managed, hwmon devices resolved by name at start. Needs bash from the packages feed. Co-Authored-By: Claude Fable 5 --- package/mono/fancontrol/Makefile | 50 +++++++++++++ package/mono/fancontrol/files/fancontrol.in | 9 +++ package/mono/fancontrol/files/fancontrol.init | 49 ++++++++++++ target/linux/layerscape/armv8_64b/config-6.12 | 75 +++++++++++++++++++ 4 files changed, 183 insertions(+) create mode 100644 package/mono/fancontrol/Makefile create mode 100644 package/mono/fancontrol/files/fancontrol.in create mode 100644 package/mono/fancontrol/files/fancontrol.init diff --git a/package/mono/fancontrol/Makefile b/package/mono/fancontrol/Makefile new file mode 100644 index 0000000000..6de579d440 --- /dev/null +++ b/package/mono/fancontrol/Makefile @@ -0,0 +1,50 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=fancontrol +PKG_VERSION:=3.6.0 +PKG_RELEASE:=1 + +# Same lm-sensors revision the meta-mono layer pins, so the fancontrol +# algorithm (hysteresis, stall detection, restore-on-exit) is identical +# to what runs on the Yocto/Armbian builds. +PKG_SOURCE_PROTO:=git +PKG_SOURCE_URL:=https://github.com/lm-sensors/lm-sensors +PKG_SOURCE_VERSION:=1667b850a1ce38151dae17156276f981be6fb557 +PKG_MIRROR_HASH:=skip + +PKG_LICENSE:=GPL-2.0-or-later + +include $(INCLUDE_DIR)/package.mk + +define Package/fancontrol + SECTION:=utils + CATEGORY:=Utilities + TITLE:=lm-sensors fancontrol daemon (Mono Gateway curve) + DEPENDS:=@TARGET_layerscape +bash +endef + +define Package/fancontrol/description + The lm-sensors fancontrol script with the Mono Gateway fan curve: + linear 40-80 C on the SoC cluster_thermal sensor driving the EMC2305 + PWM (MINSTART 51, MINSTOP 34, 10s interval). hwmon indices are + resolved by name at service start from the /etc/fancontrol.in + template. +endef + +define Build/Compile +endef + +define Package/fancontrol/conffiles +/etc/fancontrol.in +endef + +define Package/fancontrol/install + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/prog/pwm/fancontrol $(1)/usr/sbin/ + $(INSTALL_DIR) $(1)/etc + $(INSTALL_DATA) ./files/fancontrol.in $(1)/etc/fancontrol.in + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) ./files/fancontrol.init $(1)/etc/init.d/fancontrol +endef + +$(eval $(call BuildPackage,fancontrol)) diff --git a/package/mono/fancontrol/files/fancontrol.in b/package/mono/fancontrol/files/fancontrol.in new file mode 100644 index 0000000000..b410247a5e --- /dev/null +++ b/package/mono/fancontrol/files/fancontrol.in @@ -0,0 +1,9 @@ +INTERVAL=10 +DEVPATH=@TEMP@=@TEMP_PATH@ @FAN@=@FAN_PATH@ +DEVNAME=@TEMP@=cluster_thermal @FAN@=emc2305 +FCTEMPS=@FAN@/pwm1=@TEMP@/temp1_input +FCFANS= @FAN@/pwm1=@FAN@/fan1_input +MINTEMP=@FAN@/pwm1=40 +MAXTEMP=@FAN@/pwm1=80 +MINSTART=@FAN@/pwm1=51 +MINSTOP=@FAN@/pwm1=34 diff --git a/package/mono/fancontrol/files/fancontrol.init b/package/mono/fancontrol/files/fancontrol.init new file mode 100644 index 0000000000..bdf8bef1a6 --- /dev/null +++ b/package/mono/fancontrol/files/fancontrol.init @@ -0,0 +1,49 @@ +#!/bin/sh /etc/rc.common +# hwmon indices depend on driver probe order, so /etc/fancontrol.in is a +# template: resolve the fan controller and temperature source by name at +# every start and generate the real config. Ported from the meta-mono +# S99fancontrol; fancontrol runs in the foreground under procd. + +START=95 +USE_PROCD=1 + +TEMPLATE=/etc/fancontrol.in +CONF=/var/run/fancontrol + +find_hwmon() { + for h in /sys/class/hwmon/hwmon*; do + [ "$(cat "$h/name" 2>/dev/null)" = "$1" ] && { + basename "$h" + return 0 + } + done + return 1 +} + +generate_conf() { + local fan temp fan_path temp_path + fan=$(find_hwmon emc2305) || { + echo "fancontrol: no emc2305 hwmon device, not starting" >&2 + return 1 + } + temp=$(find_hwmon cluster_thermal) || { + echo "fancontrol: no cluster_thermal hwmon device, not starting" >&2 + return 1 + } + fan_path=$(readlink -f "/sys/class/hwmon/$fan/device" | sed 's|^/sys/||') + temp_path=$(readlink -f "/sys/class/hwmon/$temp/device" | sed 's|^/sys/||') + sed -e "s|@FAN@|$fan|g" \ + -e "s|@TEMP@|$temp|g" \ + -e "s|@FAN_PATH@|$fan_path|g" \ + -e "s|@TEMP_PATH@|$temp_path|g" \ + "$TEMPLATE" > "$CONF" +} + +start_service() { + generate_conf || return 1 + procd_open_instance + procd_set_param command /usr/sbin/fancontrol "$CONF" + procd_set_param respawn 3600 5 0 + procd_set_param stderr 1 + procd_close_instance +} diff --git a/target/linux/layerscape/armv8_64b/config-6.12 b/target/linux/layerscape/armv8_64b/config-6.12 index a8d377eb88..6076caf86d 100644 --- a/target/linux/layerscape/armv8_64b/config-6.12 +++ b/target/linux/layerscape/armv8_64b/config-6.12 @@ -310,6 +310,48 @@ CONFIG_FSL_XGMAC_MDIO=y CONFIG_FSL_PQ_MDIO=y CONFIG_NET_KEY=y CONFIG_XFRM_USER=y +CONFIG_LEDS_GPIO=y +CONFIG_LEDS_TRIGGER_ONESHOT=y +CONFIG_LEDS_TRIGGER_ACTIVITY=y +CONFIG_LEDS_TRIGGER_PATTERN=y +CONFIG_HWMON=y +CONFIG_THERMAL_HWMON=y +CONFIG_SFP=y +CONFIG_SENSORS_LM75=y +CONFIG_SENSORS_EMC2103=y +CONFIG_SENSORS_EMC2305=y +CONFIG_SENSORS_INA238=y +CONFIG_SENSORS_TMP401=y +CONFIG_TYPEC=y +CONFIG_TYPEC_HD3SS3220=y +CONFIG_USB_ROLE_SWITCH=y +CONFIG_SERIAL_DEV_BUS=y +CONFIG_GPIO_SYSCON=y +CONFIG_POWER_RESET_GPIO=y +CONFIG_PHY_FSL_LYNX_28G=y +CONFIG_MTIP_BACKPLANE_PHY=y +CONFIG_ARM_SCMI_PROTOCOL=y +CONFIG_COMMON_CLK_SCMI=y +CONFIG_CRYPTO_DEV_FSL_CAAM_INTC=y +CONFIG_EEPROM_93CX6=y +CONFIG_NETWORK_PHY_TIMESTAMPING=y +CONFIG_DP83640_PHY=y +CONFIG_DP83867_PHY=y +CONFIG_BROADCOM_PHY=y +CONFIG_BCM87XX_PHY=y +CONFIG_CICADA_PHY=y +CONFIG_CORTINA_PHY=y +CONFIG_DAVICOM_PHY=y +CONFIG_ICPLUS_PHY=y +CONFIG_LXT_PHY=y +CONFIG_LSI_ET1011C_PHY=y +CONFIG_MARVELL_10G_PHY=y +CONFIG_MAXLINEAR_GPHY=y +CONFIG_NATIONAL_PHY=y +CONFIG_QSEMI_PHY=y +CONFIG_SMSC_PHY=y +CONFIG_STE10XP=y +CONFIG_TERANETICS_PHY=y CONFIG_FSL_SDK_BMAN=y CONFIG_FSL_SDK_QMAN=y CONFIG_FSL_SDK_FMAN=y @@ -1000,3 +1042,36 @@ CONFIG_CRYPTO_DEV_FSL_CAAM_SM=y CONFIG_CRYPTO_DEV_FSL_CAAM_SM_SLOTSIZE=7 # CONFIG_CRYPTO_DEV_FSL_CAAM_SM_TEST is not set CONFIG_CRYPTO_DEV_FSL_CAAM_JR_UIO=m +CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y +# CONFIG_ARM_SCMI_CPUFREQ is not set +# CONFIG_ARM_SCMI_RAW_MODE_SUPPORT is not set +# CONFIG_ARM_SCMI_DEBUG_COUNTERS is not set +CONFIG_ARM_SCMI_TRANSPORT_SMC=y +# CONFIG_ARM_SCMI_TRANSPORT_SMC_ATOMIC_ENABLE is not set +# CONFIG_ARM_SCMI_TRANSPORT_VIRTIO is not set +# CONFIG_IMX_SCMI_CPU_EXT is not set +# CONFIG_IMX_SCMI_LMM_EXT is not set +# CONFIG_IMX_SCMI_MISC_EXT is not set +# CONFIG_ARM_SCMI_POWER_CONTROL is not set +CONFIG_SERIAL_DEV_CTRL_TTYPORT=y +# CONFIG_PTP_1588_CLOCK_INES is not set +# CONFIG_RAVE_SP_CORE is not set +# CONFIG_TYPEC_TPS6598X is not set +# CONFIG_TYPEC_ANX7411 is not set +# CONFIG_TYPEC_RT1719 is not set +# CONFIG_TYPEC_STUSB160X is not set +# CONFIG_TYPEC_WUSB3801 is not set +# CONFIG_TYPEC_MUX_FSA4480 is not set +# CONFIG_TYPEC_MUX_GPIO_SBU is not set +# CONFIG_TYPEC_MUX_PI3USB30532 is not set +# CONFIG_TYPEC_MUX_IT5205 is not set +# CONFIG_TYPEC_MUX_NB7VPQ904M is not set +# CONFIG_TYPEC_MUX_PTN36502 is not set +# CONFIG_TYPEC_MUX_WCD939X_USBSS is not set +# CONFIG_TYPEC_SWITCH_GPIO is not set +CONFIG_ARM_SCMI_PERF_DOMAIN=y +CONFIG_ARM_SCMI_POWER_DOMAIN=y +CONFIG_RESET_SCMI=y +CONFIG_CRYPTO_DEV_FSL_CAAM_INTC_COUNT_THLD=255 +CONFIG_CRYPTO_DEV_FSL_CAAM_INTC_TIME_THLD=2048 +CONFIG_RTC_DRV_DS3232_HWMON=y -- 2.47.3