Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/build-nightly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -234,9 +234,9 @@ jobs:
PREV_TAG=$(git tag --sort=-creatordate | grep -vx "${CURRENT_TAG}" | head -n 1 || true)

if [ -z "$PREV_TAG" ]; then
COMMITS=$(git log --pretty=format:"%h %s (%an)" | grep -v "Merge branch" || true)
COMMITS=$(git log --first-parent --pretty=format:"%h %s (%an)" | grep -v "Merge branch" || true)
else
COMMITS=$(git log "${PREV_TAG}..HEAD" --pretty=format:"%h %s (%an)" | grep -v "Merge branch" || true)
COMMITS=$(git log "${PREV_TAG}..HEAD" --first-parent --pretty=format:"%h %s (%an)" | grep -v "Merge branch" || true)
fi

{
Expand Down
19 changes: 19 additions & 0 deletions distributions/ROCKNIX/config/functions
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,11 @@ else
set timeout=-1
fi

if fdtdump --prop model --set abl_model; then
set default="abl"
set timeout=2
fi

if [ x"\${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
else
Expand All @@ -309,6 +314,13 @@ if [ "\${saved_entry}" = "${SHORT}" ]; then set rotation=$(((360 - ROT * 90) % 3
EOF
done

xmlstarlet sel -t -m "//rocknix/${DEVICE}/file[@rotation]" \
-v "concat(@full, '|', @rotation)" -n "${CONFIGXML}" 2>/dev/null | while IFS='|' read -r FULL ROT; do
cat << EOF
if [ "\${abl_model}" = "${FULL}" ]; then set rotation=$(((360 - ROT * 90) % 360)); fi
EOF
done

cat << EOF
set gfxmode=auto
insmod efi_gop
Expand All @@ -317,6 +329,13 @@ terminal_output gfxterm
set menu_color_normal=cyan/blue
set menu_color_highlight=white/blue

if [ -n "\${abl_model}" ]; then
menuentry "ROCKNIX (\${abl_model})" \$menuentry_id_option 'abl' {
search --set -f /KERNEL
linux /KERNEL boot=LABEL=${DISTRO_BOOTLABEL} disk=LABEL=${DISTRO_DISKLABEL} grub_portable ${EXTRA_CMDLINE}
}
fi

EOF

xmlstarlet sel -t -m "//rocknix/${DEVICE}/file" \
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ PKG_NAME="ayn-platform"
PKG_VERSION="7ec810ed2aebe196b68b9cce580d3c9e520e6425"
PKG_LICENSE="GPL"
PKG_SITE="https://github.com/ShadowBlip/ayn-platform"
PKG_URL="${PKG_SITE}.git"
PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz"
PKG_LONGDESC="A hwmon interface for PWM control, as well as RGB control and access to temperature sensors provided by the system EC."
PKG_TOOLCHAIN="make"
PKG_IS_KERNEL_PKG="yes"
Expand Down
9 changes: 5 additions & 4 deletions projects/ROCKNIX/devices/AMD64/packages/ryzenadj/package.mk
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,15 @@ PKG_NAME="ryzenadj"
PKG_VERSION="ea71739b4a3e1a0a624dfd1c9c268a31cb2a4182"
PKG_LICENSE="GPL"
PKG_SITE="https://github.com/FlyGoat/RyzenAdj"
PKG_URL="${PKG_SITE}.git"
PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz"
PKG_DEPENDS_TARGET="toolchain pciutils systemd"
PKG_LONGDESC="Adjust power management settings for Ryzen Mobile Processors."
PKG_BUILD_FLAGS="+pic"

makeinstall_target() {
mkdir -p ${INSTALL}/usr/lib
cp libryzenadj.so ${INSTALL}/usr/lib
mkdir -p ${INSTALL}/usr/bin
cp ryzenadj ${INSTALL}/usr/bin
cp -a libryzenadj.so ${INSTALL}/usr/lib

mkdir -p ${INSTALL}/usr/bin
cp -a ryzenadj ${INSTALL}/usr/bin
}
6 changes: 3 additions & 3 deletions projects/ROCKNIX/devices/AMD64/packages/ryzensmu/package.mk
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS)

PKG_NAME="ryzensmu"
PKG_VERSION="e61177d0ddaebfaeca52094b20a2289287a0838b"
PKG_VERSION="0.1.5"
PKG_LICENSE="GPL"
PKG_SITE="https://gitlab.com/leogx9r/ryzen_smu"
PKG_URL="${PKG_SITE}.git"
PKG_URL="${PKG_SITE}/-/archive/v${PKG_VERSION}/${PKG_NAME}-v${PKG_VERSION}.tar.bz2"
PKG_LONGDESC="A Linux kernel driver that exposes access to the SMU on certain AMD Ryzen processors."
PKG_TOOLCHAIN="make"
PKG_IS_KERNEL_PKG="yes"
Expand All @@ -26,5 +26,5 @@ make_target() {

makeinstall_target() {
mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME}
cp *.ko ${INSTALL}/$(get_full_module_dir)/${PKG_NAME}
cp *.ko ${INSTALL}/$(get_full_module_dir)/${PKG_NAME}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ PKG_NAME="amlogic-boot-fip"
PKG_VERSION="e96b6a694380ff07d5a9e4be644ffe254bd18512"
PKG_LICENSE="GPLv3"
PKG_SITE="https://github.com/LibreELEC/amlogic-boot-fip"
PKG_URL="${PKG_SITE}.git"
PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz"
PKG_DEPENDS_TARGET="toolchain"
PKG_LONGDESC="Firmware Image Pacakge (FIP) sources used to sign Amlogic u-boot binaries"
PKG_TOOLCHAIN="manual"
Original file line number Diff line number Diff line change
Expand Up @@ -2123,7 +2123,7 @@ diff -Naur a/drivers/input/misc/qcom-hv-haptics.c b/drivers/input/misc/qcom-hv-h
+ }
+
+ haptics_read(chip, chip->hbst_addr_base, 0x09, &val, 1);
+ dev_err(chip->dev, "haptics_enable_play, 0xf209=0x%x\n", val);
+ dev_dbg(chip->dev, "haptics_enable_play, 0xf209=0x%x\n", val);
+
+ if (!en)
+ haptics_wait_brake_complete(chip);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
goto restore;
@@ -2121,9 +2125,12 @@
haptics_read(chip, chip->hbst_addr_base, 0x09, &val, 1);
dev_err(chip->dev, "haptics_enable_play, 0xf209=0x%x\n", val);
dev_dbg(chip->dev, "haptics_enable_play, 0xf209=0x%x\n", val);

- if (!en)
+ if (!en) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
From: gh123man <gh123man@users.noreply.github.com>
Subject: [PATCH] input: qcom-hv-haptics: defer rsinput playback bridge

The rsinput force-feedback playback callback runs below input_event(), with
the input device event spinlock held and interrupts disabled. The global
Qualcomm haptics bridge calls haptics_erase() directly from that callback.
haptics_erase() takes a mutex and synchronously cancels delayed work, which
can sleep and produces "BUG: scheduling while atomic" during game rumble.

Keep playback submission atomic by recording the latest request and applying
it from a workqueue. Serialize uploads, playback, and gain changes with a
mutex in process context, and drain both playback work and delayed stop work
before suspending the haptics device.

---
--- a/drivers/input/misc/qcom-hv-haptics.c
+++ b/drivers/input/misc/qcom-hv-haptics.c
@@ -792,6 +792,12 @@
struct notifier_block lpass_ssr_nb;
struct mutex vmax_lock;
struct work_struct set_gain_work;
+ struct mutex global_ff_lock;
+ struct work_struct global_playback_work;
+ spinlock_t global_playback_lock;
+ u32 global_playback_seq;
+ int global_effect_id;
+ int global_playback_val;
volatile bool chip_effect_loaded;
volatile bool chip_is_playing;
struct list_head mmap_effect_list;
@@ -858,6 +864,7 @@
};

static struct haptics_chip *phapchip;
+static void haptics_global_playback_work(struct work_struct *work);

bool qcom_haptics_vi_sense_is_enabled(void)
{
@@ -6438,6 +6445,9 @@
hrtimer_setup(&chip->hbst_off_timer, haptics_disable_hbst_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
INIT_DELAYED_WORK(&chip->stop_work, haptics_stop_constant_effect_play);
INIT_WORK(&chip->set_gain_work, haptics_set_gain_work);
+ mutex_init(&chip->global_ff_lock);
+ spin_lock_init(&chip->global_playback_lock);
+ INIT_WORK(&chip->global_playback_work, haptics_global_playback_work);

atomic_set(&chip->play.fifo_status.is_busy, 0);
atomic_set(&chip->play.fifo_status.written_done, 0);
@@ -6545,6 +6555,7 @@
struct haptics_chip *chip = dev_get_drvdata(&pdev->dev);

phapchip = NULL;
+ cancel_work_sync(&chip->global_playback_work);
if (chip->pbs_node)
of_node_put(chip->pbs_node);

@@ -6602,6 +6613,9 @@
struct haptics_play_info *play = &chip->play;
int rc;

+ cancel_work_sync(&chip->global_playback_work);
+ cancel_delayed_work_sync(&chip->stop_work);
+
mutex_lock(&play->lock);
if ((play->pattern_src == FIFO) &&
atomic_read(&play->fifo_status.is_busy)) {
@@ -6730,54 +6744,91 @@
haptics_ds_suspend_config(chip->dev);
}

-int qcom_spmi_haptics_global_upload(struct ff_effect *effect) {
- int ret;
-
- if (!phapchip)
- return -ENODEV;
-
- spin_lock_irq(&phapchip->input_dev->event_lock);
+static void haptics_global_playback_work(struct work_struct *work)
+{
+ struct haptics_chip *chip = container_of(work, struct haptics_chip,
+ global_playback_work);
+ unsigned long flags;
+ u32 sequence;
+ int effect_id, val, ret;

- ret = phapchip->input_dev->ff->upload(phapchip->input_dev, effect, NULL);
+ /*
+ * Force-feedback playback is called with the input device event lock held,
+ * so it cannot invoke the haptics callbacks directly: erase waits for the
+ * delayed stop work and takes a mutex. Apply the latest requested state
+ * here instead, in sleepable workqueue context. Loop if another event was
+ * delivered while the hardware operation was in progress.
+ */
+ do {
+ spin_lock_irqsave(&chip->global_playback_lock, flags);
+ sequence = chip->global_playback_seq;
+ effect_id = chip->global_effect_id;
+ val = chip->global_playback_val;
+ spin_unlock_irqrestore(&chip->global_playback_lock, flags);
+
+ mutex_lock(&chip->global_ff_lock);
+ if (val)
+ ret = haptics_playback(chip->input_dev, effect_id, val);
+ else
+ ret = haptics_erase(chip->input_dev, effect_id);
+ mutex_unlock(&chip->global_ff_lock);

- spin_unlock_irq(&phapchip->input_dev->event_lock);
+ if (ret)
+ dev_warn(chip->dev, "global %s failed: %d\n",
+ val ? "playback" : "erase", ret);

- return ret;
+ spin_lock_irqsave(&chip->global_playback_lock, flags);
+ ret = sequence != chip->global_playback_seq;
+ spin_unlock_irqrestore(&chip->global_playback_lock, flags);
+ } while (ret);
}

-int qcom_spmi_haptics_global_playback(int effect_id, int val) {
+int qcom_spmi_haptics_global_upload(struct ff_effect *effect)
+{
+ struct haptics_chip *chip = READ_ONCE(phapchip);
int ret;

- if (!phapchip)
+ if (!chip)
return -ENODEV;

- spin_lock_irq(&phapchip->input_dev->event_lock);
+ mutex_lock(&chip->global_ff_lock);
+ ret = haptics_upload_effect(chip->input_dev, effect, NULL);
+ mutex_unlock(&chip->global_ff_lock);

- if (val != 0)
- ret = phapchip->input_dev->ff->playback(phapchip->input_dev, effect_id, val);
- else
- ret = phapchip->input_dev->ff->erase(phapchip->input_dev, effect_id);
+ return ret;
+}
+
+int qcom_spmi_haptics_global_playback(int effect_id, int val)
+{
+ struct haptics_chip *chip = READ_ONCE(phapchip);
+ unsigned long flags;

- if (ret)
- pr_warn("%s called for %s, error in return (%d)\n", __func__, (val!=0 ? "Playback" : "Erase"), ret);
+ if (!chip)
+ return -ENODEV;

- spin_unlock_irq(&phapchip->input_dev->event_lock);
+ spin_lock_irqsave(&chip->global_playback_lock, flags);
+ chip->global_effect_id = effect_id;
+ chip->global_playback_val = val;
+ chip->global_playback_seq++;
+ spin_unlock_irqrestore(&chip->global_playback_lock, flags);

- return ret;
+ schedule_work(&chip->global_playback_work);
+ return 0;
}

-int qcom_spmi_haptics_global_set_gain(u16 gain) {
- if (!phapchip)
- return -ENODEV;
+int qcom_spmi_haptics_global_set_gain(u16 gain)
+{
+ struct haptics_chip *chip = READ_ONCE(phapchip);

- spin_lock_irq(&phapchip->input_dev->event_lock);
+ if (!chip)
+ return -ENODEV;

//max is 0x7fff, and minimum is 0x4000 the same values android uses
gain = clamp(gain, 0x4000, 0x7fff);

- phapchip->input_dev->ff->set_gain(phapchip->input_dev, gain);
-
- spin_unlock_irq(&phapchip->input_dev->event_lock);
+ mutex_lock(&chip->global_ff_lock);
+ haptics_set_gain(chip->input_dev, gain);
+ mutex_unlock(&chip->global_ff_lock);

return 0;
}
10 changes: 4 additions & 6 deletions projects/ROCKNIX/packages/apps/commander/package.mk
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ PKG_NAME="commander"
PKG_VERSION="b3c008cac3bff9de54a3542cecc53cc271058744"
PKG_LICENSE="MIT"
PKG_SITE="https://github.com/ROCKNIX/commander"
PKG_URL="${PKG_SITE}.git"
PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz"
PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_image SDL2_gfx SDL2_ttf dejavu nanumgothic"
PKG_LONGDESC="A minimal SDL2 file manager for embedded Linux devices."
PKG_TOOLCHAIN="cmake"
Expand All @@ -14,10 +14,8 @@ PKG_CMAKE_OPTS_TARGET+=" -DCMAKE_BUILD_TYPE=Release"

makeinstall_target() {
mkdir -p ${INSTALL}/usr/bin
mkdir -p ${INSTALL}/usr/share/commander

cp -rf ${PKG_BUILD}/.${TARGET_NAME}/commander ${INSTALL}/usr/bin/
cp -rf ${PKG_BUILD}/res ${INSTALL}/usr/share/commander/res
cp -a ${PKG_BUILD}/.${TARGET_NAME}/commander ${INSTALL}/usr/bin

chmod 0755 ${INSTALL}/usr/bin/commander
mkdir -p ${INSTALL}/usr/share/commander
cp -a ${PKG_BUILD}/res ${INSTALL}/usr/share/commander
}
12 changes: 6 additions & 6 deletions projects/ROCKNIX/packages/apps/gamecontrollerdb/package.mk
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,18 @@
# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS)

PKG_NAME="gamecontrollerdb"
PKG_VERSION="e1efb4bad8730b2c0c6316617cbd06b9def1192e"
PKG_VERSION="42f28e22d20761e7004e8db91c4ad86402fdf600"
PKG_LICENSE="GPL"
PKG_DEPENDS_TARGET="toolchain SDL2"
PKG_SITE="https://github.com/gabomdq/SDL_GameControllerDB"
PKG_URL="${PKG_SITE}.git"
PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz"
PKG_LONGDESC="SDL Game Controller DB"
PKG_TOOLCHAIN="manual"

makeinstall_target() {
mkdir -p ${INSTALL}/usr/config/SDL-GameControllerDB
if [ -f "${PKG_DIR}/config/gamecontrollerdb.txt" ]; then
cat ${PKG_DIR}/config/gamecontrollerdb.txt >${INSTALL}/usr/config/SDL-GameControllerDB/gamecontrollerdb.txt
fi
cat ${PKG_BUILD}/gamecontrollerdb.txt >>${INSTALL}/usr/config/SDL-GameControllerDB/gamecontrollerdb.txt
if [ -f "${PKG_DIR}/config/gamecontrollerdb.txt" ]; then
cat ${PKG_DIR}/config/gamecontrollerdb.txt >${INSTALL}/usr/config/SDL-GameControllerDB/gamecontrollerdb.txt
fi
cat ${PKG_BUILD}/gamecontrollerdb.txt >>${INSTALL}/usr/config/SDL-GameControllerDB/gamecontrollerdb.txt
}
12 changes: 5 additions & 7 deletions projects/ROCKNIX/packages/apps/gamepadtester/package.mk
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ PKG_NAME="gamepadtester"
PKG_VERSION="6ac49e67aa98fe3dd5c27f73306d65d4b7a82daa"
PKG_LICENSE="GPLv3"
PKG_SITE="https://github.com/timre13/GamepadTester"
PKG_URL="${PKG_SITE}.git"
PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz"
PKG_DEPENDS_TARGET="toolchain SDL2 SDL2_gfx gamecontrollerdb"
PKG_LONGDESC="A simple SDL GUI Gamepad tester"
PKG_TOOLCHAIN="cmake"
Expand All @@ -14,18 +14,16 @@ PKG_PATCH_DIRS+="${DEVICE}"
case ${DEVICE} in
SM8650|SM8750|SM8550|SM8250)
PKG_PATCH_DIRS+=" xbox"
;;
;;
*)
PKG_PATCH_DIRS+=" legacy"
;;
;;
esac

makeinstall_target() {
mkdir -p ${INSTALL}/usr/bin
cp -rf ${PKG_BUILD}/.${TARGET_NAME}/gamepad_test ${INSTALL}/usr/bin/gamepad-tester
chmod 0755 ${INSTALL}/usr/bin/gamepad-tester
cp -a ${PKG_BUILD}/.${TARGET_NAME}/gamepad_test ${INSTALL}/usr/bin/gamepad-tester

mkdir -p ${INSTALL}/usr/config/modules
cp -rf ${PKG_DIR}/scripts/* ${INSTALL}/usr/config/modules
chmod 0755 ${INSTALL}/usr/config/modules/*
cp -a ${PKG_DIR}/scripts/* ${INSTALL}/usr/config/modules
}
Empty file.
Loading
Loading