From: Greg Kroah-Hartman Date: Mon, 25 Aug 2025 07:33:12 +0000 (+0200) Subject: 6.16-stable patches X-Git-Tag: v5.4.297~19 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ffe4adfddc170ca7838987fb1a13795921935185;p=thirdparty%2Fkernel%2Fstable-queue.git 6.16-stable patches added patches: devlink-let-driver-opt-out-of-automatic-phys_port_name-generation.patch i2c-rtl9300-add-missing-count-byte-for-smbus-block-ops.patch i2c-rtl9300-fix-multi-byte-i2c-write.patch i2c-rtl9300-fix-out-of-bounds-bug-in-rtl9300_i2c_smbus_xfer.patch i2c-rtl9300-increase-timeout-for-transfer-polling.patch iio-imu-inv_icm42600-change-invalid-data-error-to-ebusy.patch iio-imu-inv_icm42600-convert-to-uxx-and-sxx-integer-types.patch iio-imu-inv_icm42600-use-instead-of-memset.patch ixgbe-prevent-from-unwanted-interface-name-changes.patch x86-cpu-amd-ignore-invalid-reset-reason-value.patch x86-cpu-hygon-add-missing-resctrl_cpu_detect-in-bsp_init-helper.patch --- diff --git a/queue-6.16/devlink-let-driver-opt-out-of-automatic-phys_port_name-generation.patch b/queue-6.16/devlink-let-driver-opt-out-of-automatic-phys_port_name-generation.patch new file mode 100644 index 0000000000..71981f0a3e --- /dev/null +++ b/queue-6.16/devlink-let-driver-opt-out-of-automatic-phys_port_name-generation.patch @@ -0,0 +1,70 @@ +From stable+bounces-172772-greg=kroah.com@vger.kernel.org Mon Aug 25 05:30:59 2025 +From: Calvin Owens +Date: Sun, 24 Aug 2025 20:30:13 -0700 +Subject: devlink: let driver opt out of automatic phys_port_name generation +To: stable@vger.kernel.org +Cc: jedrzej.jagielski@intel.com, anthony.l.nguyen@intel.com, David.Kaplan@amd.com, dhowells@redhat.com, kyle.leet@gmail.com +Message-ID: <20597f81c1439569e34d026542365aef1cedfb00.1756088250.git.calvin@wbinvd.org> + +From: Jedrzej Jagielski + +[ Upstream commit c5ec7f49b480db0dfc83f395755b1c2a7c979920 ] + +Currently when adding devlink port, phys_port_name is automatically +generated within devlink port initialization flow. As a result adding +devlink port support to driver may result in forced changes of interface +names, which breaks already existing network configs. + +This is an expected behavior but in some scenarios it would not be +preferable to provide such limitation for legacy driver not being able to +keep 'pre-devlink' interface name. + +Add flag no_phys_port_name to devlink_port_attrs struct which indicates +if devlink should not alter name of interface. + +Suggested-by: Jiri Pirko +Link: https://lore.kernel.org/all/nbwrfnjhvrcduqzjl4a2jafnvvud6qsbxlvxaxilnryglf4j7r@btuqrimnfuly/ +Signed-off-by: Jedrzej Jagielski +Signed-off-by: Tony Nguyen +Cc: stable@vger.kernel.org # 6.16 +Tested-By: Calvin Owens +Signed-off-by: Calvin Owens +Signed-off-by: Greg Kroah-Hartman +--- + include/net/devlink.h | 6 +++++- + net/devlink/port.c | 2 +- + 2 files changed, 6 insertions(+), 2 deletions(-) + +--- a/include/net/devlink.h ++++ b/include/net/devlink.h +@@ -78,6 +78,9 @@ struct devlink_port_pci_sf_attrs { + * @flavour: flavour of the port + * @split: indicates if this is split port + * @splittable: indicates if the port can be split. ++ * @no_phys_port_name: skip automatic phys_port_name generation; for ++ * compatibility only, newly added driver/port instance ++ * should never set this. + * @lanes: maximum number of lanes the port supports. 0 value is not passed to netlink. + * @switch_id: if the port is part of switch, this is buffer with ID, otherwise this is NULL + * @phys: physical port attributes +@@ -87,7 +90,8 @@ struct devlink_port_pci_sf_attrs { + */ + struct devlink_port_attrs { + u8 split:1, +- splittable:1; ++ splittable:1, ++ no_phys_port_name:1; + u32 lanes; + enum devlink_port_flavour flavour; + struct netdev_phys_item_id switch_id; +--- a/net/devlink/port.c ++++ b/net/devlink/port.c +@@ -1519,7 +1519,7 @@ static int __devlink_port_phys_port_name + struct devlink_port_attrs *attrs = &devlink_port->attrs; + int n = 0; + +- if (!devlink_port->attrs_set) ++ if (!devlink_port->attrs_set || devlink_port->attrs.no_phys_port_name) + return -EOPNOTSUPP; + + switch (attrs->flavour) { diff --git a/queue-6.16/i2c-rtl9300-add-missing-count-byte-for-smbus-block-ops.patch b/queue-6.16/i2c-rtl9300-add-missing-count-byte-for-smbus-block-ops.patch new file mode 100644 index 0000000000..e586d2b4b9 --- /dev/null +++ b/queue-6.16/i2c-rtl9300-add-missing-count-byte-for-smbus-block-ops.patch @@ -0,0 +1,61 @@ +From 82b350dd8185ce790e61555c436f90b6501af23c Mon Sep 17 00:00:00 2001 +From: Sven Eckelmann +Date: Sun, 10 Aug 2025 20:05:16 +0200 +Subject: i2c: rtl9300: Add missing count byte for SMBus Block Ops + +From: Sven Eckelmann + +commit 82b350dd8185ce790e61555c436f90b6501af23c upstream. + +The expected on-wire format of an SMBus Block Write is + + S Addr Wr [A] Comm [A] Count [A] Data [A] Data [A] ... [A] Data [A] P + +Everything starting from the Count byte is provided by the I2C subsystem in +the array data->block. But the driver was skipping the Count byte +(data->block[0]) when sending it to the RTL93xx I2C controller. + +Only the actual data could be seen on the wire: + + S Addr Wr [A] Comm [A] Data [A] Data [A] ... [A] Data [A] P + +This wire format is not SMBus Block Write compatible but matches the format +of an I2C Block Write. Simply adding the count byte to the buffer for the +I2C controller is enough to fix the transmission. + +This also affects read because the I2C controller must receive the count +byte + $count * data bytes. + +Fixes: c366be720235 ("i2c: Add driver for the RTL9300 I2C controller") +Signed-off-by: Sven Eckelmann +Cc: # v6.13+ +Reviewed-by: Chris Packham +Tested-by: Chris Packham +Signed-off-by: Andi Shyti +Link: https://lore.kernel.org/r/20250810-i2c-rtl9300-multi-byte-v5-4-cd9dca0db722@narfation.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/i2c/busses/i2c-rtl9300.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- a/drivers/i2c/busses/i2c-rtl9300.c ++++ b/drivers/i2c/busses/i2c-rtl9300.c +@@ -285,15 +285,15 @@ static int rtl9300_i2c_smbus_xfer(struct + ret = -EINVAL; + goto out_unlock; + } +- ret = rtl9300_i2c_config_xfer(i2c, chan, addr, data->block[0]); ++ ret = rtl9300_i2c_config_xfer(i2c, chan, addr, data->block[0] + 1); + if (ret) + goto out_unlock; + if (read_write == I2C_SMBUS_WRITE) { +- ret = rtl9300_i2c_write(i2c, &data->block[1], data->block[0]); ++ ret = rtl9300_i2c_write(i2c, &data->block[0], data->block[0] + 1); + if (ret) + goto out_unlock; + } +- len = data->block[0]; ++ len = data->block[0] + 1; + break; + + default: diff --git a/queue-6.16/i2c-rtl9300-fix-multi-byte-i2c-write.patch b/queue-6.16/i2c-rtl9300-fix-multi-byte-i2c-write.patch new file mode 100644 index 0000000000..434c03171f --- /dev/null +++ b/queue-6.16/i2c-rtl9300-fix-multi-byte-i2c-write.patch @@ -0,0 +1,83 @@ +From d67b740b9edfa46310355e2b68050f79ebf05a4c Mon Sep 17 00:00:00 2001 +From: Harshal Gohel +Date: Sun, 10 Aug 2025 20:05:14 +0200 +Subject: i2c: rtl9300: Fix multi-byte I2C write + +From: Harshal Gohel + +commit d67b740b9edfa46310355e2b68050f79ebf05a4c upstream. + +The RTL93xx I2C controller has 4 32 bit registers to store the bytes for +the upcoming I2C transmission. The first byte is stored in the +least-significant byte of the first register. And the last byte in the most +significant byte of the last register. A map of the transferred bytes to +their order in the registers is: + +reg 0: 0x04_03_02_01 +reg 1: 0x08_07_06_05 +reg 2: 0x0c_0b_0a_09 +reg 3: 0x10_0f_0e_0d + +The i2c_read() function basically demonstrates how the hardware would pick +up bytes from this register set. But the i2c_write() function was just +pushing bytes one after another to the least significant byte of a register +AFTER shifting the last one to the next more significant byte position. + +If you would then have tried to send a buffer with numbers 1-11 using +i2c_write(), you would have ended up with following register content: + +reg 0: 0x01_02_03_04 +reg 1: 0x05_06_07_08 +reg 2: 0x00_09_0a_0b +reg 3: 0x00_00_00_00 + +On the wire, you would then have seen: + + Sr Addr Wr [A] 04 A 03 A 02 A 01 A 08 A 07 A 06 A 05 A 0b A 0a A 09 A P + +But the correct data transmission was expected to be + + Sr Addr Wr [A] 01 A 02 A 03 A 04 A 05 A 06 A 07 A 08 A 09 A 0a A 0b A P + +Because of this multi-byte ordering problem, only single byte i2c_write() +operations were executed correctly (on the wire). + +By shifting the byte directly to the correct end position in the register, +it is possible to avoid this incorrect byte ordering and fix multi-byte +transmissions. + +The second initialization (to 0) of vals was also be dropped because this +array is initialized to 0 on the stack by using `= {};`. This makes the +fix a lot more readable. + +Fixes: c366be720235 ("i2c: Add driver for the RTL9300 I2C controller") +Signed-off-by: Harshal Gohel +Cc: # v6.13+ +Co-developed-by: Sven Eckelmann +Signed-off-by: Sven Eckelmann +Reviewed-by: Chris Packham +Tested-by: Chris Packham +Signed-off-by: Andi Shyti +Link: https://lore.kernel.org/r/20250810-i2c-rtl9300-multi-byte-v5-2-cd9dca0db722@narfation.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/i2c/busses/i2c-rtl9300.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +--- a/drivers/i2c/busses/i2c-rtl9300.c ++++ b/drivers/i2c/busses/i2c-rtl9300.c +@@ -143,10 +143,10 @@ static int rtl9300_i2c_write(struct rtl9 + return -EIO; + + for (i = 0; i < len; i++) { +- if (i % 4 == 0) +- vals[i/4] = 0; +- vals[i/4] <<= 8; +- vals[i/4] |= buf[i]; ++ unsigned int shift = (i % 4) * 8; ++ unsigned int reg = i / 4; ++ ++ vals[reg] |= buf[i] << shift; + } + + return regmap_bulk_write(i2c->regmap, i2c->reg_base + RTL9300_I2C_MST_DATA_WORD0, diff --git a/queue-6.16/i2c-rtl9300-fix-out-of-bounds-bug-in-rtl9300_i2c_smbus_xfer.patch b/queue-6.16/i2c-rtl9300-fix-out-of-bounds-bug-in-rtl9300_i2c_smbus_xfer.patch new file mode 100644 index 0000000000..3a7a88a504 --- /dev/null +++ b/queue-6.16/i2c-rtl9300-fix-out-of-bounds-bug-in-rtl9300_i2c_smbus_xfer.patch @@ -0,0 +1,46 @@ +From 57f312b955938fc4663f430cb57a71f2414f601b Mon Sep 17 00:00:00 2001 +From: Alex Guo +Date: Sun, 10 Aug 2025 20:05:13 +0200 +Subject: i2c: rtl9300: Fix out-of-bounds bug in rtl9300_i2c_smbus_xfer + +From: Alex Guo + +commit 57f312b955938fc4663f430cb57a71f2414f601b upstream. + +The data->block[0] variable comes from user. Without proper check, +the variable may be very large to cause an out-of-bounds bug. + +Fix this bug by checking the value of data->block[0] first. + +1. commit 39244cc75482 ("i2c: ismt: Fix an out-of-bounds bug in + ismt_access()") +2. commit 92fbb6d1296f ("i2c: xgene-slimpro: Fix out-of-bounds bug in + xgene_slimpro_i2c_xfer()") + +Fixes: c366be720235 ("i2c: Add driver for the RTL9300 I2C controller") +Signed-off-by: Alex Guo +Cc: # v6.13+ +Reviewed-by: Chris Packham +Tested-by: Chris Packham +Reviewed-by: Wolfram Sang +Signed-off-by: Sven Eckelmann +Signed-off-by: Andi Shyti +Link: https://lore.kernel.org/r/20250810-i2c-rtl9300-multi-byte-v5-1-cd9dca0db722@narfation.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/i2c/busses/i2c-rtl9300.c | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/drivers/i2c/busses/i2c-rtl9300.c ++++ b/drivers/i2c/busses/i2c-rtl9300.c +@@ -281,6 +281,10 @@ static int rtl9300_i2c_smbus_xfer(struct + ret = rtl9300_i2c_reg_addr_set(i2c, command, 1); + if (ret) + goto out_unlock; ++ if (data->block[0] < 1 || data->block[0] > I2C_SMBUS_BLOCK_MAX) { ++ ret = -EINVAL; ++ goto out_unlock; ++ } + ret = rtl9300_i2c_config_xfer(i2c, chan, addr, data->block[0]); + if (ret) + goto out_unlock; diff --git a/queue-6.16/i2c-rtl9300-increase-timeout-for-transfer-polling.patch b/queue-6.16/i2c-rtl9300-increase-timeout-for-transfer-polling.patch new file mode 100644 index 0000000000..5baa4edfbb --- /dev/null +++ b/queue-6.16/i2c-rtl9300-increase-timeout-for-transfer-polling.patch @@ -0,0 +1,50 @@ +From ceee7776c010c5f09d30985c9e5223b363a6172a Mon Sep 17 00:00:00 2001 +From: Sven Eckelmann +Date: Sun, 10 Aug 2025 20:05:15 +0200 +Subject: i2c: rtl9300: Increase timeout for transfer polling + +From: Sven Eckelmann + +commit ceee7776c010c5f09d30985c9e5223b363a6172a upstream. + +The timeout for transfers was only set to 2ms. Because of this relatively +low limit, 12-byte read operations to the frontend MCU of a RTL8239 POE PSE +chip cluster was consistently resulting in a timeout. + +The original OpenWrt downstream driver [1] was not using any timeout limit +at all. This is also possible by setting the timeout_us parameter of +regmap_read_poll_timeout() to 0. But since the driver currently implements +the ETIMEDOUT error, it is more sensible to increase the timeout in such a +way that communication with the (quite common) Realtek I2C-connected POE +management solution is possible. + +[1] https://git.openwrt.org/?p=openwrt/openwrt.git;a=blob;f=target/linux/realtek/files-6.12/drivers/i2c/busses/i2c-rtl9300.c;h=c4d973195ef39dc56d6207e665d279745525fcac#l202 + +Fixes: c366be720235 ("i2c: Add driver for the RTL9300 I2C controller") +Signed-off-by: Sven Eckelmann +Cc: # v6.13+ +Reviewed-by: Chris Packham +Tested-by: Chris Packham +Signed-off-by: Andi Shyti +Link: https://lore.kernel.org/r/20250810-i2c-rtl9300-multi-byte-v5-3-cd9dca0db722@narfation.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/i2c/busses/i2c-rtl9300.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/i2c/busses/i2c-rtl9300.c b/drivers/i2c/busses/i2c-rtl9300.c +index 4a538b266080..4a282d57e2c1 100644 +--- a/drivers/i2c/busses/i2c-rtl9300.c ++++ b/drivers/i2c/busses/i2c-rtl9300.c +@@ -175,7 +175,7 @@ static int rtl9300_i2c_execute_xfer(struct rtl9300_i2c *i2c, char read_write, + return ret; + + ret = regmap_read_poll_timeout(i2c->regmap, i2c->reg_base + RTL9300_I2C_MST_CTRL1, +- val, !(val & RTL9300_I2C_MST_CTRL1_I2C_TRIG), 100, 2000); ++ val, !(val & RTL9300_I2C_MST_CTRL1_I2C_TRIG), 100, 100000); + if (ret) + return ret; + +-- +2.50.1 + diff --git a/queue-6.16/iio-imu-inv_icm42600-change-invalid-data-error-to-ebusy.patch b/queue-6.16/iio-imu-inv_icm42600-change-invalid-data-error-to-ebusy.patch new file mode 100644 index 0000000000..0526f91bfa --- /dev/null +++ b/queue-6.16/iio-imu-inv_icm42600-change-invalid-data-error-to-ebusy.patch @@ -0,0 +1,49 @@ +From stable+bounces-172723-greg=kroah.com@vger.kernel.org Sun Aug 24 15:02:14 2025 +From: Sasha Levin +Date: Sun, 24 Aug 2025 09:01:36 -0400 +Subject: iio: imu: inv_icm42600: change invalid data error to -EBUSY +To: stable@vger.kernel.org +Cc: Jean-Baptiste Maneyrol , Andy Shevchenko , Sean Nyekjaer , Jonathan Cameron , Sasha Levin +Message-ID: <20250824130136.2747952-3-sashal@kernel.org> + +From: Jean-Baptiste Maneyrol + +[ Upstream commit dfdc31e7ccf3ac1d5ec01d5120c71e14745e3dd8 ] + +Temperature sensor returns the temperature of the mechanical parts +of the chip. If both accel and gyro are off, the temperature sensor is +also automatically turned off and returns invalid data. + +In this case, returning -EBUSY error code is better then -EINVAL and +indicates userspace that it needs to retry reading temperature in +another context. + +Fixes: bc3eb0207fb5 ("iio: imu: inv_icm42600: add temperature sensor support") +Signed-off-by: Jean-Baptiste Maneyrol +Cc: stable@vger.kernel.org +Reviewed-by: Andy Shevchenko +Reviewed-by: Sean Nyekjaer +Link: https://patch.msgid.link/20250808-inv-icm42600-change-temperature-error-code-v1-1-986fbf63b77d@tdk.com +Signed-off-by: Jonathan Cameron +Signed-off-by: Sasha Levin +Signed-off-by: Greg Kroah-Hartman +--- + drivers/iio/imu/inv_icm42600/inv_icm42600_temp.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_temp.c ++++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_temp.c +@@ -32,8 +32,12 @@ static int inv_icm42600_temp_read(struct + goto exit; + + *temp = (s16)be16_to_cpup(raw); ++ /* ++ * Temperature data is invalid if both accel and gyro are off. ++ * Return -EBUSY in this case. ++ */ + if (*temp == INV_ICM42600_DATA_INVALID) +- ret = -EINVAL; ++ ret = -EBUSY; + + exit: + mutex_unlock(&st->lock); diff --git a/queue-6.16/iio-imu-inv_icm42600-convert-to-uxx-and-sxx-integer-types.patch b/queue-6.16/iio-imu-inv_icm42600-convert-to-uxx-and-sxx-integer-types.patch new file mode 100644 index 0000000000..3cc112170d --- /dev/null +++ b/queue-6.16/iio-imu-inv_icm42600-convert-to-uxx-and-sxx-integer-types.patch @@ -0,0 +1,423 @@ +From stable+bounces-172722-greg=kroah.com@vger.kernel.org Sun Aug 24 15:02:14 2025 +From: Sasha Levin +Date: Sun, 24 Aug 2025 09:01:35 -0400 +Subject: iio: imu: inv_icm42600: Convert to uXX and sXX integer types +To: stable@vger.kernel.org +Cc: Andy Shevchenko , Jean-Baptiste Maneyrol , Jonathan Cameron , Sasha Levin +Message-ID: <20250824130136.2747952-2-sashal@kernel.org> + +From: Andy Shevchenko + +[ Upstream commit a4135386fa49c2a170b89296da12c4a3be2089d9 ] + +The driver code is full of intXX_t and uintXX_t types which is +not the pattern we use in the IIO subsystem. Switch the driver +to use kernel internal types for that. No functional changes. + +Signed-off-by: Andy Shevchenko +Acked-by: Jean-Baptiste Maneyrol +Link: https://patch.msgid.link/20250616090423.575736-1-andriy.shevchenko@linux.intel.com +Signed-off-by: Jonathan Cameron +Stable-dep-of: dfdc31e7ccf3 ("iio: imu: inv_icm42600: change invalid data error to -EBUSY") +Signed-off-by: Sasha Levin +Signed-off-by: Greg Kroah-Hartman +--- + drivers/iio/imu/inv_icm42600/inv_icm42600.h | 8 ++-- + drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c | 26 +++++++-------- + drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.c | 22 ++++++------ + drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.h | 10 ++--- + drivers/iio/imu/inv_icm42600/inv_icm42600_core.c | 6 +-- + drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c | 36 ++++++++++----------- + drivers/iio/imu/inv_icm42600/inv_icm42600_temp.c | 6 +-- + 7 files changed, 57 insertions(+), 57 deletions(-) + +--- a/drivers/iio/imu/inv_icm42600/inv_icm42600.h ++++ b/drivers/iio/imu/inv_icm42600/inv_icm42600.h +@@ -164,11 +164,11 @@ struct inv_icm42600_state { + struct inv_icm42600_suspended suspended; + struct iio_dev *indio_gyro; + struct iio_dev *indio_accel; +- uint8_t buffer[2] __aligned(IIO_DMA_MINALIGN); ++ u8 buffer[2] __aligned(IIO_DMA_MINALIGN); + struct inv_icm42600_fifo fifo; + struct { +- int64_t gyro; +- int64_t accel; ++ s64 gyro; ++ s64 accel; + } timestamp; + }; + +@@ -410,7 +410,7 @@ const struct iio_mount_matrix * + inv_icm42600_get_mount_matrix(const struct iio_dev *indio_dev, + const struct iio_chan_spec *chan); + +-uint32_t inv_icm42600_odr_to_period(enum inv_icm42600_odr odr); ++u32 inv_icm42600_odr_to_period(enum inv_icm42600_odr odr); + + int inv_icm42600_set_accel_conf(struct inv_icm42600_state *st, + struct inv_icm42600_sensor_conf *conf, +--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c ++++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c +@@ -177,7 +177,7 @@ static const struct iio_chan_spec inv_ic + */ + struct inv_icm42600_accel_buffer { + struct inv_icm42600_fifo_sensor_data accel; +- int16_t temp; ++ s16 temp; + aligned_s64 timestamp; + }; + +@@ -241,7 +241,7 @@ out_unlock: + + static int inv_icm42600_accel_read_sensor(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, +- int16_t *val) ++ s16 *val) + { + struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev); + struct inv_icm42600_sensor_state *accel_st = iio_priv(indio_dev); +@@ -284,7 +284,7 @@ static int inv_icm42600_accel_read_senso + if (ret) + goto exit; + +- *val = (int16_t)be16_to_cpup(data); ++ *val = (s16)be16_to_cpup(data); + if (*val == INV_ICM42600_DATA_INVALID) + ret = -EINVAL; + exit: +@@ -492,11 +492,11 @@ static int inv_icm42600_accel_read_offse + int *val, int *val2) + { + struct device *dev = regmap_get_device(st->map); +- int64_t val64; +- int32_t bias; ++ s64 val64; ++ s32 bias; + unsigned int reg; +- int16_t offset; +- uint8_t data[2]; ++ s16 offset; ++ u8 data[2]; + int ret; + + if (chan->type != IIO_ACCEL) +@@ -550,7 +550,7 @@ static int inv_icm42600_accel_read_offse + * result in micro (1000000) + * (offset * 5 * 9.806650 * 1000000) / 10000 + */ +- val64 = (int64_t)offset * 5LL * 9806650LL; ++ val64 = (s64)offset * 5LL * 9806650LL; + /* for rounding, add + or - divisor (10000) divided by 2 */ + if (val64 >= 0) + val64 += 10000LL / 2LL; +@@ -568,10 +568,10 @@ static int inv_icm42600_accel_write_offs + int val, int val2) + { + struct device *dev = regmap_get_device(st->map); +- int64_t val64; +- int32_t min, max; ++ s64 val64; ++ s32 min, max; + unsigned int reg, regval; +- int16_t offset; ++ s16 offset; + int ret; + + if (chan->type != IIO_ACCEL) +@@ -596,7 +596,7 @@ static int inv_icm42600_accel_write_offs + inv_icm42600_accel_calibbias[1]; + max = inv_icm42600_accel_calibbias[4] * 1000000L + + inv_icm42600_accel_calibbias[5]; +- val64 = (int64_t)val * 1000000LL + (int64_t)val2; ++ val64 = (s64)val * 1000000LL + (s64)val2; + if (val64 < min || val64 > max) + return -EINVAL; + +@@ -671,7 +671,7 @@ static int inv_icm42600_accel_read_raw(s + int *val, int *val2, long mask) + { + struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev); +- int16_t data; ++ s16 data; + int ret; + + switch (chan->type) { +--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.c ++++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.c +@@ -26,28 +26,28 @@ + #define INV_ICM42600_FIFO_HEADER_ODR_GYRO BIT(0) + + struct inv_icm42600_fifo_1sensor_packet { +- uint8_t header; ++ u8 header; + struct inv_icm42600_fifo_sensor_data data; +- int8_t temp; ++ s8 temp; + } __packed; + #define INV_ICM42600_FIFO_1SENSOR_PACKET_SIZE 8 + + struct inv_icm42600_fifo_2sensors_packet { +- uint8_t header; ++ u8 header; + struct inv_icm42600_fifo_sensor_data accel; + struct inv_icm42600_fifo_sensor_data gyro; +- int8_t temp; ++ s8 temp; + __be16 timestamp; + } __packed; + #define INV_ICM42600_FIFO_2SENSORS_PACKET_SIZE 16 + + ssize_t inv_icm42600_fifo_decode_packet(const void *packet, const void **accel, +- const void **gyro, const int8_t **temp, ++ const void **gyro, const s8 **temp, + const void **timestamp, unsigned int *odr) + { + const struct inv_icm42600_fifo_1sensor_packet *pack1 = packet; + const struct inv_icm42600_fifo_2sensors_packet *pack2 = packet; +- uint8_t header = *((const uint8_t *)packet); ++ u8 header = *((const u8 *)packet); + + /* FIFO empty */ + if (header & INV_ICM42600_FIFO_HEADER_MSG) { +@@ -100,7 +100,7 @@ ssize_t inv_icm42600_fifo_decode_packet( + + void inv_icm42600_buffer_update_fifo_period(struct inv_icm42600_state *st) + { +- uint32_t period_gyro, period_accel, period; ++ u32 period_gyro, period_accel, period; + + if (st->fifo.en & INV_ICM42600_SENSOR_GYRO) + period_gyro = inv_icm42600_odr_to_period(st->conf.gyro.odr); +@@ -204,8 +204,8 @@ int inv_icm42600_buffer_update_watermark + { + size_t packet_size, wm_size; + unsigned int wm_gyro, wm_accel, watermark; +- uint32_t period_gyro, period_accel, period; +- uint32_t latency_gyro, latency_accel, latency; ++ u32 period_gyro, period_accel, period; ++ u32 latency_gyro, latency_accel, latency; + bool restore; + __le16 raw_wm; + int ret; +@@ -459,7 +459,7 @@ int inv_icm42600_buffer_fifo_read(struct + __be16 *raw_fifo_count; + ssize_t i, size; + const void *accel, *gyro, *timestamp; +- const int8_t *temp; ++ const s8 *temp; + unsigned int odr; + int ret; + +@@ -550,7 +550,7 @@ int inv_icm42600_buffer_hwfifo_flush(str + struct inv_icm42600_sensor_state *gyro_st = iio_priv(st->indio_gyro); + struct inv_icm42600_sensor_state *accel_st = iio_priv(st->indio_accel); + struct inv_sensors_timestamp *ts; +- int64_t gyro_ts, accel_ts; ++ s64 gyro_ts, accel_ts; + int ret; + + gyro_ts = iio_get_time_ns(st->indio_gyro); +--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.h ++++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.h +@@ -28,7 +28,7 @@ struct inv_icm42600_state; + struct inv_icm42600_fifo { + unsigned int on; + unsigned int en; +- uint32_t period; ++ u32 period; + struct { + unsigned int gyro; + unsigned int accel; +@@ -41,7 +41,7 @@ struct inv_icm42600_fifo { + size_t accel; + size_t total; + } nb; +- uint8_t data[2080] __aligned(IIO_DMA_MINALIGN); ++ u8 data[2080] __aligned(IIO_DMA_MINALIGN); + }; + + /* FIFO data packet */ +@@ -52,7 +52,7 @@ struct inv_icm42600_fifo_sensor_data { + } __packed; + #define INV_ICM42600_FIFO_DATA_INVALID -32768 + +-static inline int16_t inv_icm42600_fifo_get_sensor_data(__be16 d) ++static inline s16 inv_icm42600_fifo_get_sensor_data(__be16 d) + { + return be16_to_cpu(d); + } +@@ -60,7 +60,7 @@ static inline int16_t inv_icm42600_fifo_ + static inline bool + inv_icm42600_fifo_is_data_valid(const struct inv_icm42600_fifo_sensor_data *s) + { +- int16_t x, y, z; ++ s16 x, y, z; + + x = inv_icm42600_fifo_get_sensor_data(s->x); + y = inv_icm42600_fifo_get_sensor_data(s->y); +@@ -75,7 +75,7 @@ inv_icm42600_fifo_is_data_valid(const st + } + + ssize_t inv_icm42600_fifo_decode_packet(const void *packet, const void **accel, +- const void **gyro, const int8_t **temp, ++ const void **gyro, const s8 **temp, + const void **timestamp, unsigned int *odr); + + extern const struct iio_buffer_setup_ops inv_icm42600_buffer_ops; +--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c ++++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c +@@ -103,7 +103,7 @@ const struct regmap_config inv_icm42600_ + EXPORT_SYMBOL_NS_GPL(inv_icm42600_spi_regmap_config, "IIO_ICM42600"); + + struct inv_icm42600_hw { +- uint8_t whoami; ++ u8 whoami; + const char *name; + const struct inv_icm42600_conf *conf; + }; +@@ -188,9 +188,9 @@ inv_icm42600_get_mount_matrix(const stru + return &st->orientation; + } + +-uint32_t inv_icm42600_odr_to_period(enum inv_icm42600_odr odr) ++u32 inv_icm42600_odr_to_period(enum inv_icm42600_odr odr) + { +- static uint32_t odr_periods[INV_ICM42600_ODR_NB] = { ++ static u32 odr_periods[INV_ICM42600_ODR_NB] = { + /* reserved values */ + 0, 0, 0, + /* 8kHz */ +--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c ++++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c +@@ -77,7 +77,7 @@ static const struct iio_chan_spec inv_ic + */ + struct inv_icm42600_gyro_buffer { + struct inv_icm42600_fifo_sensor_data gyro; +- int16_t temp; ++ s16 temp; + aligned_s64 timestamp; + }; + +@@ -139,7 +139,7 @@ out_unlock: + + static int inv_icm42600_gyro_read_sensor(struct inv_icm42600_state *st, + struct iio_chan_spec const *chan, +- int16_t *val) ++ s16 *val) + { + struct device *dev = regmap_get_device(st->map); + struct inv_icm42600_sensor_conf conf = INV_ICM42600_SENSOR_CONF_INIT; +@@ -179,7 +179,7 @@ static int inv_icm42600_gyro_read_sensor + if (ret) + goto exit; + +- *val = (int16_t)be16_to_cpup(data); ++ *val = (s16)be16_to_cpup(data); + if (*val == INV_ICM42600_DATA_INVALID) + ret = -EINVAL; + exit: +@@ -399,11 +399,11 @@ static int inv_icm42600_gyro_read_offset + int *val, int *val2) + { + struct device *dev = regmap_get_device(st->map); +- int64_t val64; +- int32_t bias; ++ s64 val64; ++ s32 bias; + unsigned int reg; +- int16_t offset; +- uint8_t data[2]; ++ s16 offset; ++ u8 data[2]; + int ret; + + if (chan->type != IIO_ANGL_VEL) +@@ -457,7 +457,7 @@ static int inv_icm42600_gyro_read_offset + * result in nano (1000000000) + * (offset * 64 * Pi * 1000000000) / (2048 * 180) + */ +- val64 = (int64_t)offset * 64LL * 3141592653LL; ++ val64 = (s64)offset * 64LL * 3141592653LL; + /* for rounding, add + or - divisor (2048 * 180) divided by 2 */ + if (val64 >= 0) + val64 += 2048 * 180 / 2; +@@ -475,9 +475,9 @@ static int inv_icm42600_gyro_write_offse + int val, int val2) + { + struct device *dev = regmap_get_device(st->map); +- int64_t val64, min, max; ++ s64 val64, min, max; + unsigned int reg, regval; +- int16_t offset; ++ s16 offset; + int ret; + + if (chan->type != IIO_ANGL_VEL) +@@ -498,11 +498,11 @@ static int inv_icm42600_gyro_write_offse + } + + /* inv_icm42600_gyro_calibbias: min - step - max in nano */ +- min = (int64_t)inv_icm42600_gyro_calibbias[0] * 1000000000LL + +- (int64_t)inv_icm42600_gyro_calibbias[1]; +- max = (int64_t)inv_icm42600_gyro_calibbias[4] * 1000000000LL + +- (int64_t)inv_icm42600_gyro_calibbias[5]; +- val64 = (int64_t)val * 1000000000LL + (int64_t)val2; ++ min = (s64)inv_icm42600_gyro_calibbias[0] * 1000000000LL + ++ (s64)inv_icm42600_gyro_calibbias[1]; ++ max = (s64)inv_icm42600_gyro_calibbias[4] * 1000000000LL + ++ (s64)inv_icm42600_gyro_calibbias[5]; ++ val64 = (s64)val * 1000000000LL + (s64)val2; + if (val64 < min || val64 > max) + return -EINVAL; + +@@ -577,7 +577,7 @@ static int inv_icm42600_gyro_read_raw(st + int *val, int *val2, long mask) + { + struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev); +- int16_t data; ++ s16 data; + int ret; + + switch (chan->type) { +@@ -803,9 +803,9 @@ int inv_icm42600_gyro_parse_fifo(struct + ssize_t i, size; + unsigned int no; + const void *accel, *gyro, *timestamp; +- const int8_t *temp; ++ const s8 *temp; + unsigned int odr; +- int64_t ts_val; ++ s64 ts_val; + /* buffer is copied to userspace, zeroing it to avoid any data leak */ + struct inv_icm42600_gyro_buffer buffer = { }; + +--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_temp.c ++++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_temp.c +@@ -13,7 +13,7 @@ + #include "inv_icm42600.h" + #include "inv_icm42600_temp.h" + +-static int inv_icm42600_temp_read(struct inv_icm42600_state *st, int16_t *temp) ++static int inv_icm42600_temp_read(struct inv_icm42600_state *st, s16 *temp) + { + struct device *dev = regmap_get_device(st->map); + __be16 *raw; +@@ -31,7 +31,7 @@ static int inv_icm42600_temp_read(struct + if (ret) + goto exit; + +- *temp = (int16_t)be16_to_cpup(raw); ++ *temp = (s16)be16_to_cpup(raw); + if (*temp == INV_ICM42600_DATA_INVALID) + ret = -EINVAL; + +@@ -48,7 +48,7 @@ int inv_icm42600_temp_read_raw(struct ii + int *val, int *val2, long mask) + { + struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev); +- int16_t temp; ++ s16 temp; + int ret; + + if (chan->type != IIO_TEMP) diff --git a/queue-6.16/iio-imu-inv_icm42600-use-instead-of-memset.patch b/queue-6.16/iio-imu-inv_icm42600-use-instead-of-memset.patch new file mode 100644 index 0000000000..e4b58be2e7 --- /dev/null +++ b/queue-6.16/iio-imu-inv_icm42600-use-instead-of-memset.patch @@ -0,0 +1,70 @@ +From stable+bounces-172721-greg=kroah.com@vger.kernel.org Sun Aug 24 15:03:07 2025 +From: Sasha Levin +Date: Sun, 24 Aug 2025 09:01:34 -0400 +Subject: iio: imu: inv_icm42600: use = { } instead of memset() +To: stable@vger.kernel.org +Cc: "David Lechner" , "Nuno Sá" , "Andy Shevchenko" , "Jonathan Cameron" , "Sasha Levin" +Message-ID: <20250824130136.2747952-1-sashal@kernel.org> + +From: David Lechner + +[ Upstream commit 352112e2d9aab6a156c2803ae14eb89a9fd93b7d ] + +Use { } instead of memset() to zero-initialize stack memory to simplify +the code. + +Signed-off-by: David Lechner +Reviewed-by: Nuno Sá +Reviewed-by: Andy Shevchenko +Link: https://patch.msgid.link/20250611-iio-zero-init-stack-with-instead-of-memset-v1-16-ebb2d0a24302@baylibre.com +Signed-off-by: Jonathan Cameron +Stable-dep-of: dfdc31e7ccf3 ("iio: imu: inv_icm42600: change invalid data error to -EBUSY") +Signed-off-by: Sasha Levin +Signed-off-by: Greg Kroah-Hartman +--- + drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c | 5 ++--- + drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c | 5 ++--- + 2 files changed, 4 insertions(+), 6 deletions(-) + +--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c ++++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c +@@ -902,7 +902,8 @@ int inv_icm42600_accel_parse_fifo(struct + const int8_t *temp; + unsigned int odr; + int64_t ts_val; +- struct inv_icm42600_accel_buffer buffer; ++ /* buffer is copied to userspace, zeroing it to avoid any data leak */ ++ struct inv_icm42600_accel_buffer buffer = { }; + + /* parse all fifo packets */ + for (i = 0, no = 0; i < st->fifo.count; i += size, ++no) { +@@ -921,8 +922,6 @@ int inv_icm42600_accel_parse_fifo(struct + inv_sensors_timestamp_apply_odr(ts, st->fifo.period, + st->fifo.nb.total, no); + +- /* buffer is copied to userspace, zeroing it to avoid any data leak */ +- memset(&buffer, 0, sizeof(buffer)); + memcpy(&buffer.accel, accel, sizeof(buffer.accel)); + /* convert 8 bits FIFO temperature in high resolution format */ + buffer.temp = temp ? (*temp * 64) : 0; +--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c ++++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c +@@ -806,7 +806,8 @@ int inv_icm42600_gyro_parse_fifo(struct + const int8_t *temp; + unsigned int odr; + int64_t ts_val; +- struct inv_icm42600_gyro_buffer buffer; ++ /* buffer is copied to userspace, zeroing it to avoid any data leak */ ++ struct inv_icm42600_gyro_buffer buffer = { }; + + /* parse all fifo packets */ + for (i = 0, no = 0; i < st->fifo.count; i += size, ++no) { +@@ -825,8 +826,6 @@ int inv_icm42600_gyro_parse_fifo(struct + inv_sensors_timestamp_apply_odr(ts, st->fifo.period, + st->fifo.nb.total, no); + +- /* buffer is copied to userspace, zeroing it to avoid any data leak */ +- memset(&buffer, 0, sizeof(buffer)); + memcpy(&buffer.gyro, gyro, sizeof(buffer.gyro)); + /* convert 8 bits FIFO temperature in high resolution format */ + buffer.temp = temp ? (*temp * 64) : 0; diff --git a/queue-6.16/ixgbe-prevent-from-unwanted-interface-name-changes.patch b/queue-6.16/ixgbe-prevent-from-unwanted-interface-name-changes.patch new file mode 100644 index 0000000000..4734f31021 --- /dev/null +++ b/queue-6.16/ixgbe-prevent-from-unwanted-interface-name-changes.patch @@ -0,0 +1,46 @@ +From stable+bounces-172773-greg=kroah.com@vger.kernel.org Mon Aug 25 05:31:04 2025 +From: Calvin Owens +Date: Sun, 24 Aug 2025 20:30:14 -0700 +Subject: ixgbe: prevent from unwanted interface name changes +To: stable@vger.kernel.org +Cc: jedrzej.jagielski@intel.com, anthony.l.nguyen@intel.com, David.Kaplan@amd.com, dhowells@redhat.com, kyle.leet@gmail.com +Message-ID: <00196d6ecf9781d8bf5526cb0d992d3a0653167c.1756088250.git.calvin@wbinvd.org> + +From: Jedrzej Jagielski + +[ upstream commit e67a0bc3ed4fd8ee1697cb6d937e2b294ec13b5e ] + +Users of the ixgbe driver report that after adding devlink support by +the commit a0285236ab93 ("ixgbe: add initial devlink support") their +configs got broken due to unwanted changes of interface names. It's +caused by automatic phys_port_name generation during devlink port +initialization flow. + +To prevent from that set no_phys_port_name flag for ixgbe devlink ports. + +Reported-by: David Howells +Closes: https://lore.kernel.org/netdev/3452224.1745518016@warthog.procyon.org.uk/ +Reported-by: David Kaplan +Closes: https://lore.kernel.org/netdev/LV3PR12MB92658474624CCF60220157199470A@LV3PR12MB9265.namprd12.prod.outlook.com/ +Fixes: a0285236ab93 ("ixgbe: add initial devlink support") +Signed-off-by: Jedrzej Jagielski +Tested-by: Rinitha S (A Contingent worker at Intel) +Signed-off-by: Tony Nguyen +Cc: stable@vger.kernel.org # 6.16 +Tested-By: Calvin Owens +Signed-off-by: Calvin Owens +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/ethernet/intel/ixgbe/devlink/devlink.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/net/ethernet/intel/ixgbe/devlink/devlink.c ++++ b/drivers/net/ethernet/intel/ixgbe/devlink/devlink.c +@@ -543,6 +543,7 @@ int ixgbe_devlink_register_port(struct i + + attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL; + attrs.phys.port_number = adapter->hw.bus.func; ++ attrs.no_phys_port_name = 1; + ixgbe_devlink_set_switch_id(adapter, &attrs.switch_id); + + devlink_port_attrs_set(devlink_port, &attrs); diff --git a/queue-6.16/series b/queue-6.16/series index 429465083e..85cce3c2bd 100644 --- a/queue-6.16/series +++ b/queue-6.16/series @@ -331,3 +331,14 @@ tracing-limit-access-to-parser-buffer-when-trace_get_user-failed.patch ovl-use-i_mutex_parent-when-locking-parent-in-ovl_create_temp.patch pci-dwc-ensure-that-dw_pcie_wait_for_link-waits-100-ms-after-link-up.patch tls-fix-handling-of-zero-length-records-on-the-rx_list.patch +x86-cpu-amd-ignore-invalid-reset-reason-value.patch +x86-cpu-hygon-add-missing-resctrl_cpu_detect-in-bsp_init-helper.patch +i2c-rtl9300-fix-out-of-bounds-bug-in-rtl9300_i2c_smbus_xfer.patch +i2c-rtl9300-fix-multi-byte-i2c-write.patch +i2c-rtl9300-increase-timeout-for-transfer-polling.patch +i2c-rtl9300-add-missing-count-byte-for-smbus-block-ops.patch +devlink-let-driver-opt-out-of-automatic-phys_port_name-generation.patch +ixgbe-prevent-from-unwanted-interface-name-changes.patch +iio-imu-inv_icm42600-use-instead-of-memset.patch +iio-imu-inv_icm42600-convert-to-uxx-and-sxx-integer-types.patch +iio-imu-inv_icm42600-change-invalid-data-error-to-ebusy.patch diff --git a/queue-6.16/x86-cpu-amd-ignore-invalid-reset-reason-value.patch b/queue-6.16/x86-cpu-amd-ignore-invalid-reset-reason-value.patch new file mode 100644 index 0000000000..8a643962ba --- /dev/null +++ b/queue-6.16/x86-cpu-amd-ignore-invalid-reset-reason-value.patch @@ -0,0 +1,62 @@ +From e9576e078220c50ace9e9087355423de23e25fa5 Mon Sep 17 00:00:00 2001 +From: Yazen Ghannam +Date: Mon, 21 Jul 2025 18:11:54 +0000 +Subject: x86/CPU/AMD: Ignore invalid reset reason value + +From: Yazen Ghannam + +commit e9576e078220c50ace9e9087355423de23e25fa5 upstream. + +The reset reason value may be "all bits set", e.g. 0xFFFFFFFF. This is a +commonly used error response from hardware. This may occur due to a real +hardware issue or when running in a VM. + +The user will see all reset reasons reported in this case. + +Check for an error response value and return early to avoid decoding +invalid data. + +Also, adjust the data variable type to match the hardware register size. + +Fixes: ab8131028710 ("x86/CPU/AMD: Print the reason for the last reset") +Reported-by: Libing He +Signed-off-by: Yazen Ghannam +Signed-off-by: Borislav Petkov (AMD) +Reviewed-by: Mario Limonciello +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/20250721181155.3536023-1-yazen.ghannam@amd.com +Signed-off-by: Greg Kroah-Hartman +--- + arch/x86/kernel/cpu/amd.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +--- a/arch/x86/kernel/cpu/amd.c ++++ b/arch/x86/kernel/cpu/amd.c +@@ -1324,8 +1324,8 @@ static const char * const s5_reset_reaso + + static __init int print_s5_reset_status_mmio(void) + { +- unsigned long value; + void __iomem *addr; ++ u32 value; + int i; + + if (!cpu_feature_enabled(X86_FEATURE_ZEN)) +@@ -1338,12 +1338,16 @@ static __init int print_s5_reset_status_ + value = ioread32(addr); + iounmap(addr); + ++ /* Value with "all bits set" is an error response and should be ignored. */ ++ if (value == U32_MAX) ++ return 0; ++ + for (i = 0; i < ARRAY_SIZE(s5_reset_reason_txt); i++) { + if (!(value & BIT(i))) + continue; + + if (s5_reset_reason_txt[i]) { +- pr_info("x86/amd: Previous system reset reason [0x%08lx]: %s\n", ++ pr_info("x86/amd: Previous system reset reason [0x%08x]: %s\n", + value, s5_reset_reason_txt[i]); + } + } diff --git a/queue-6.16/x86-cpu-hygon-add-missing-resctrl_cpu_detect-in-bsp_init-helper.patch b/queue-6.16/x86-cpu-hygon-add-missing-resctrl_cpu_detect-in-bsp_init-helper.patch new file mode 100644 index 0000000000..9b197cbc37 --- /dev/null +++ b/queue-6.16/x86-cpu-hygon-add-missing-resctrl_cpu_detect-in-bsp_init-helper.patch @@ -0,0 +1,55 @@ +From d8df126349dad855cdfedd6bbf315bad2e901c2f Mon Sep 17 00:00:00 2001 +From: Tianxiang Peng +Date: Mon, 23 Jun 2025 17:31:53 +0800 +Subject: x86/cpu/hygon: Add missing resctrl_cpu_detect() in bsp_init helper + +From: Tianxiang Peng + +commit d8df126349dad855cdfedd6bbf315bad2e901c2f upstream. + +Since + + 923f3a2b48bd ("x86/resctrl: Query LLC monitoring properties once during boot") + +resctrl_cpu_detect() has been moved from common CPU initialization code to +the vendor-specific BSP init helper, while Hygon didn't put that call in their +code. + +This triggers a division by zero fault during early booting stage on our +machines with X86_FEATURE_CQM* supported, where get_rdt_mon_resources() tries +to calculate mon_l3_config with uninitialized boot_cpu_data.x86_cache_occ_scale. + +Add the missing resctrl_cpu_detect() in the Hygon BSP init helper. + + [ bp: Massage commit message. ] + +Fixes: 923f3a2b48bd ("x86/resctrl: Query LLC monitoring properties once during boot") +Signed-off-by: Tianxiang Peng +Signed-off-by: Borislav Petkov (AMD) +Reviewed-by: Hui Li +Cc: +Link: https://lore.kernel.org/20250623093153.3016937-1-txpeng@tencent.com +Signed-off-by: Greg Kroah-Hartman +--- + arch/x86/kernel/cpu/hygon.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/arch/x86/kernel/cpu/hygon.c ++++ b/arch/x86/kernel/cpu/hygon.c +@@ -16,6 +16,7 @@ + #include + #include + #include ++#include + + #include "cpu.h" + +@@ -117,6 +118,8 @@ static void bsp_init_hygon(struct cpuinf + x86_amd_ls_cfg_ssbd_mask = 1ULL << 10; + } + } ++ ++ resctrl_cpu_detect(c); + } + + static void early_init_hygon(struct cpuinfo_x86 *c)