From 68935911697149a544cd912c6d7f63a95d53b5a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Thu, 5 Mar 2026 22:14:00 +0100 Subject: [PATCH] Make more functions reentrant MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reduces compile time DSEG usage. Signed-off-by: Michał Kopeć --- src/board/system76/common/dgpu.c | 5 +++-- src/board/system76/common/fan.c | 5 +++-- src/board/system76/common/include/board/dgpu.h | 2 +- src/board/system76/common/include/board/fan.h | 2 +- src/board/system76/common/include/board/peci.h | 6 +++--- src/board/system76/common/peci.c | 18 +++++++++++------- src/board/system76/common/usbpd/tps65987.c | 2 +- src/common/i2c.c | 18 ++++++++++++++---- src/ec/ite/i2c.c | 7 ++++++- 9 files changed, 43 insertions(+), 22 deletions(-) diff --git a/src/board/system76/common/dgpu.c b/src/board/system76/common/dgpu.c index 658ea7a..f3644b5 100644 --- a/src/board/system76/common/dgpu.c +++ b/src/board/system76/common/dgpu.c @@ -94,13 +94,14 @@ uint8_t dgpu_get_d_notify_level(bool ac) { return 0; } -int16_t dgpu_set_fan_curve(uint8_t count, struct FanPoint *points) { +int16_t dgpu_set_fan_curve(uint8_t count, struct FanPoint *points) __reentrant { + int i; if (count != FAN.points_size) { TRACE("DGPU: Incorrect number of fan points: %d, expected %d\n", count, FAN.points_size); return -1; } - for (int i = 0; i < count; ++i) { + for (i = 0; i < count; ++i) { TRACE("DGPU: fan curve t%d: %d, d%d: %d\n", i, points[i].temp, i, points[i].duty); FAN.points[i].temp = points[i].temp; FAN.points[i].duty = points[i].duty; diff --git a/src/board/system76/common/fan.c b/src/board/system76/common/fan.c index d0e1199..eac1868 100644 --- a/src/board/system76/common/fan.c +++ b/src/board/system76/common/fan.c @@ -159,12 +159,13 @@ uint8_t fan_smooth(uint8_t last_duty, uint8_t duty) __reentrant { return next_duty; } -uint8_t fan_points_are_valid(uint8_t count, struct FanPoint *points) { +uint8_t fan_points_are_valid(uint8_t count, struct FanPoint *points) __reentrant { + int i; /* * Fan curve speeds have to be non-decreasing. * Fan curve temperatures have to be increasing. */ - for (int i = 1; i < count; i++) { + for (i = 1; i < count; i++) { if (points[i].temp <= points[i - 1].temp || points[i].duty < points[i - 1].duty) return false; } diff --git a/src/board/system76/common/include/board/dgpu.h b/src/board/system76/common/include/board/dgpu.h index f0b5a4d..05e38cf 100644 --- a/src/board/system76/common/include/board/dgpu.h +++ b/src/board/system76/common/include/board/dgpu.h @@ -19,7 +19,7 @@ extern int16_t dgpu_temp; #endif // HAVE_DGPU void dgpu_init(void); -int16_t dgpu_set_fan_curve(uint8_t count, struct FanPoint *points); +int16_t dgpu_set_fan_curve(uint8_t count, struct FanPoint *points) __reentrant; uint8_t dgpu_get_fan_duty(void); uint8_t dgpu_get_d_notify_level(bool ac); void set_mux_ctrl(void); diff --git a/src/board/system76/common/include/board/fan.h b/src/board/system76/common/include/board/fan.h index 1406238..253beb8 100644 --- a/src/board/system76/common/include/board/fan.h +++ b/src/board/system76/common/include/board/fan.h @@ -64,6 +64,6 @@ void fan_duty_set(uint8_t peci_fan_duty, uint8_t dgpu_fan_duty) __reentrant; uint8_t fan_heatup(const struct Fan *fan, uint8_t duty) __reentrant; uint8_t fan_cooldown(const struct Fan *fan, uint8_t duty) __reentrant; uint8_t fan_smooth(uint8_t last_duty, uint8_t duty) __reentrant; -uint8_t fan_points_are_valid(uint8_t count, struct FanPoint *points); +uint8_t fan_points_are_valid(uint8_t count, struct FanPoint *points) __reentrant; #endif // _BOARD_FAN_H diff --git a/src/board/system76/common/include/board/peci.h b/src/board/system76/common/include/board/peci.h index 1b2ab0c..029671a 100644 --- a/src/board/system76/common/include/board/peci.h +++ b/src/board/system76/common/include/board/peci.h @@ -29,9 +29,9 @@ extern uint8_t t_junction; void peci_init(void); bool peci_available(void); -int16_t peci_set_fan_curve(uint8_t count, struct FanPoint *points); -int16_t peci_wr_pkg_config(uint8_t index, uint16_t param, uint32_t data); -int16_t peci_rd_pkg_config(uint8_t index, uint16_t param, uint32_t *value); +int16_t peci_set_fan_curve(uint8_t count, struct FanPoint *points) __reentrant; +int16_t peci_wr_pkg_config(uint8_t index, uint16_t param, uint32_t data) __reentrant; +int16_t peci_rd_pkg_config(uint8_t index, uint16_t param, uint32_t *value) __reentrant; uint8_t peci_get_fan_duty(void); #endif // _BOARD_PECI_H diff --git a/src/board/system76/common/peci.c b/src/board/system76/common/peci.c index 0e8c6fa..797732a 100644 --- a/src/board/system76/common/peci.c +++ b/src/board/system76/common/peci.c @@ -61,13 +61,14 @@ static struct Fan FAN = { .interpolate = SMOOTH_FANS != 0, }; -int16_t peci_set_fan_curve(uint8_t count, struct FanPoint *points) { +int16_t peci_set_fan_curve(uint8_t count, struct FanPoint *points) __reentrant { + int i; if (count != FAN.points_size) { TRACE("PECI: Incorrect number of fan points: %d, expected %d\n", count, FAN.points_size); return -1; } - for (int i = 0; i < count; ++i) { + for (i = 0; i < count; ++i) { TRACE("PECI: fan curve t%d: %d, d%d: %d\n", i, points[i].temp, i, points[i].duty); FAN.points[i].temp = points[i].temp; FAN.points[i].duty = points[i].duty; @@ -347,9 +348,10 @@ bool peci_get_temp(int16_t *data) { // Returns positive completion code on success, negative completion code or // negative (0x1000 | status register) on PECI hardware error -int16_t peci_wr_pkg_config(uint8_t index, uint16_t param, uint32_t data) { +int16_t peci_wr_pkg_config(uint8_t index, uint16_t param, uint32_t data) __reentrant { int retry = 50; // TODO how many retries are appropriate? uint8_t cc = HORDDR; + uint8_t status; // Wait for any in-progress transaction to complete while (HOSTAR & BIT(0)) {} @@ -387,7 +389,7 @@ int16_t peci_wr_pkg_config(uint8_t index, uint16_t param, uint32_t data) { // Wait for command completion while (!(HOSTAR & BIT(1))) {} - uint8_t status = HOSTAR; + status = HOSTAR; if (status & 0xEC) { ERROR("peci_wr_pkg_config: hardware error: 0x%02X\n", status); // Clear status @@ -411,9 +413,11 @@ int16_t peci_wr_pkg_config(uint8_t index, uint16_t param, uint32_t data) { return -((int16_t)cc); } -int16_t peci_rd_pkg_config(uint8_t index, uint16_t param, uint32_t *value) { +int16_t peci_rd_pkg_config(uint8_t index, uint16_t param, uint32_t *value) __reentrant { int retry = 50; // TODO how many retries are appropriate? uint8_t cc = HORDDR; + uint8_t status; + int i; *value = 0; // Wait for any in-progress transaction to complete @@ -447,7 +451,7 @@ int16_t peci_rd_pkg_config(uint8_t index, uint16_t param, uint32_t *value) { // Wait for command completion while (!(HOSTAR & BIT(1))) {} - uint8_t status = HOSTAR; + status = HOSTAR; if (status & 0xEC) { ERROR("peci_rd_pkg_config: hardware error: 0x%02X\n", status); // Clear status @@ -466,7 +470,7 @@ int16_t peci_rd_pkg_config(uint8_t index, uint16_t param, uint32_t *value) { return -((int16_t)cc); } else { // Read data if finished successfully - for (int i = 0; i < 4; ++i) { + for (i = 0; i < 4; ++i) { *value |= (((uint32_t)HORDDR) << (8 * i)); } diff --git a/src/board/system76/common/usbpd/tps65987.c b/src/board/system76/common/usbpd/tps65987.c index 04e3cc7..0d52b2c 100644 --- a/src/board/system76/common/usbpd/tps65987.c +++ b/src/board/system76/common/usbpd/tps65987.c @@ -65,7 +65,7 @@ enum { #define PDO_CURRENT_MA(pdo) (((pdo) & 0x3FF) * 10) -static int16_t usbpd_current_limit(uint8_t address) { +static int16_t usbpd_current_limit(uint8_t address) __reentrant { uint8_t value[7] = { 0 }; int16_t res = i2c_get(&I2C_USBPD, address, REG_ACTIVE_CONTRACT_PDO, value, sizeof(value)); if (res == 7) { diff --git a/src/common/i2c.c b/src/common/i2c.c index c1c1c74..160c4fd 100644 --- a/src/common/i2c.c +++ b/src/common/i2c.c @@ -34,8 +34,13 @@ int16_t i2c_send(struct I2C *i2c, uint8_t addr, uint8_t *data, uint16_t length) return res; } -int16_t i2c_get(struct I2C *i2c, uint8_t addr, uint8_t reg, uint8_t *data, uint16_t length) - __reentrant { +int16_t i2c_get( + struct I2C *i2c, + uint8_t addr, + uint8_t reg, + uint8_t *data, + uint16_t length +) __reentrant { int16_t res = 0; res = i2c_start(i2c, addr, false); @@ -49,8 +54,13 @@ int16_t i2c_get(struct I2C *i2c, uint8_t addr, uint8_t reg, uint8_t *data, uint1 return i2c_recv(i2c, addr, data, length); } -int16_t i2c_set(struct I2C *i2c, uint8_t addr, uint8_t reg, uint8_t *data, uint16_t length) - __reentrant { +int16_t i2c_set( + struct I2C *i2c, + uint8_t addr, + uint8_t reg, + uint8_t *data, + uint16_t length +) __reentrant { int16_t res = 0; res = i2c_start(i2c, addr, false); diff --git a/src/ec/ite/i2c.c b/src/ec/ite/i2c.c index c1ef73d..a380dda 100644 --- a/src/ec/ite/i2c.c +++ b/src/ec/ite/i2c.c @@ -95,7 +95,12 @@ void i2c_stop(struct I2C *i2c) { i2c_reset(i2c, false); } -static int16_t i2c_transaction(struct I2C *i2c, uint8_t *data, uint16_t length, bool read) { +static int16_t i2c_transaction( + struct I2C *i2c, + uint8_t *data, + uint16_t length, + bool read +) __reentrant { uint16_t i; for (i = 0; i < length; i++) { if (read) {