* [PATCH 0/2] regmap: Redo fixes for raw I/O length restrictions
@ 2023-07-12 11:16 Mark Brown
2023-07-12 11:16 ` [PATCH 1/2] regmap: Drop initial version of maximum transfer length fixes Mark Brown
2023-07-12 11:16 ` [PATCH 2/2] regmap: Account for register length in SMBus I/O limits Mark Brown
0 siblings, 2 replies; 3+ messages in thread
From: Mark Brown @ 2023-07-12 11:16 UTC (permalink / raw)
To: Ansuel Smith, Jim Wylder, Xu Yilun, matthew.gerlach, Mark Brown; +Cc: stable
During the v6.4 release there was an attempt to address the fact that
the specification of maximum I/O sizes for raw buses in the core does
not take account of the register or pad bits in the maxium length.
After this was merged it was realised that there are number of custom
bus implementations in drivers which were relying on the prior behavior
in various ways.
This should be factored out into the core but that will require
coordination with all the buses involved so let's fall back to the
original interface and add the accounting to the I2C bus where the
omission was originally observed.
Signed-off-by: Mark Brown <broonie@kernel.org>
---
Mark Brown (2):
regmap: Drop initial version of maximum transfer length fixes
regmap: Account for register length in SMBus I/O limits
drivers/base/regmap/regmap-i2c.c | 8 ++++----
drivers/base/regmap/regmap-spi-avmm.c | 2 +-
drivers/base/regmap/regmap.c | 6 ++----
3 files changed, 7 insertions(+), 9 deletions(-)
---
base-commit: 06c2afb862f9da8dc5efa4b6076a0e48c3fbaaa5
change-id: 20230708-regmap-max-transfer-dadeb827143f
Best regards,
--
Mark Brown <broonie@kernel.org>
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 1/2] regmap: Drop initial version of maximum transfer length fixes
2023-07-12 11:16 [PATCH 0/2] regmap: Redo fixes for raw I/O length restrictions Mark Brown
@ 2023-07-12 11:16 ` Mark Brown
2023-07-12 11:16 ` [PATCH 2/2] regmap: Account for register length in SMBus I/O limits Mark Brown
1 sibling, 0 replies; 3+ messages in thread
From: Mark Brown @ 2023-07-12 11:16 UTC (permalink / raw)
To: Ansuel Smith, Jim Wylder, Xu Yilun, matthew.gerlach, Mark Brown
When problems were noticed with the register address not being taken
into account when limiting raw transfers with I2C devices we fixed this
in the core. Unfortunately it has subsequently been realised that a lot
of buses were relying on the prior behaviour, partly due to unclear
documentation not making it obvious what was intended in the core. This
is all more involved to fix than is sensible for a fix commit so let's
just drop the original fixes, a separate commit will fix the originally
observed problem in an I2C specific way
Fixes: 3981514180c9 ("regmap: Account for register length when chunking")
Fixes: c8e796895e23 ("regmap: spi-avmm: Fix regmap_bus max_raw_write")
Signed-off-by: Mark Brown <broonie@kernel.org>
---
drivers/base/regmap/regmap-spi-avmm.c | 2 +-
drivers/base/regmap/regmap.c | 6 ++----
2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/drivers/base/regmap/regmap-spi-avmm.c b/drivers/base/regmap/regmap-spi-avmm.c
index 6af692844c19..4c2b94b3e30b 100644
--- a/drivers/base/regmap/regmap-spi-avmm.c
+++ b/drivers/base/regmap/regmap-spi-avmm.c
@@ -660,7 +660,7 @@ static const struct regmap_bus regmap_spi_avmm_bus = {
.reg_format_endian_default = REGMAP_ENDIAN_NATIVE,
.val_format_endian_default = REGMAP_ENDIAN_NATIVE,
.max_raw_read = SPI_AVMM_VAL_SIZE * MAX_READ_CNT,
- .max_raw_write = SPI_AVMM_REG_SIZE + SPI_AVMM_VAL_SIZE * MAX_WRITE_CNT,
+ .max_raw_write = SPI_AVMM_VAL_SIZE * MAX_WRITE_CNT,
.free_context = spi_avmm_bridge_ctx_free,
};
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
index 89a7f1c459c1..1bfd1727b4da 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -2082,8 +2082,6 @@ int _regmap_raw_write(struct regmap *map, unsigned int reg,
size_t val_count = val_len / val_bytes;
size_t chunk_count, chunk_bytes;
size_t chunk_regs = val_count;
- size_t max_data = map->max_raw_write - map->format.reg_bytes -
- map->format.pad_bytes;
int ret, i;
if (!val_count)
@@ -2091,8 +2089,8 @@ int _regmap_raw_write(struct regmap *map, unsigned int reg,
if (map->use_single_write)
chunk_regs = 1;
- else if (map->max_raw_write && val_len > max_data)
- chunk_regs = max_data / val_bytes;
+ else if (map->max_raw_write && val_len > map->max_raw_write)
+ chunk_regs = map->max_raw_write / val_bytes;
chunk_count = val_count / chunk_regs;
chunk_bytes = chunk_regs * val_bytes;
--
2.39.2
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 2/2] regmap: Account for register length in SMBus I/O limits
2023-07-12 11:16 [PATCH 0/2] regmap: Redo fixes for raw I/O length restrictions Mark Brown
2023-07-12 11:16 ` [PATCH 1/2] regmap: Drop initial version of maximum transfer length fixes Mark Brown
@ 2023-07-12 11:16 ` Mark Brown
1 sibling, 0 replies; 3+ messages in thread
From: Mark Brown @ 2023-07-12 11:16 UTC (permalink / raw)
To: Ansuel Smith, Jim Wylder, Xu Yilun, matthew.gerlach, Mark Brown; +Cc: stable
The SMBus I2C buses have limits on the size of transfers they can do but
do not factor in the register length meaning we may try to do a transfer
longer than our length limit, the core will not take care of this.
Future changes will factor this out into the core but there are a number
of users that assume current behaviour so let's just do something
conservative here.
This does not take account padding bits but practically speaking these
are very rarely if ever used on I2C buses given that they generally run
slowly enough to mean there's no issue.
Signed-off-by: Mark Brown <broonie@kernel.org>
Cc: stable@kernel.org
---
drivers/base/regmap/regmap-i2c.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/base/regmap/regmap-i2c.c b/drivers/base/regmap/regmap-i2c.c
index 980e5ce6a3a3..3ec611dc0c09 100644
--- a/drivers/base/regmap/regmap-i2c.c
+++ b/drivers/base/regmap/regmap-i2c.c
@@ -242,8 +242,8 @@ static int regmap_i2c_smbus_i2c_read(void *context, const void *reg,
static const struct regmap_bus regmap_i2c_smbus_i2c_block = {
.write = regmap_i2c_smbus_i2c_write,
.read = regmap_i2c_smbus_i2c_read,
- .max_raw_read = I2C_SMBUS_BLOCK_MAX,
- .max_raw_write = I2C_SMBUS_BLOCK_MAX,
+ .max_raw_read = I2C_SMBUS_BLOCK_MAX - 1,
+ .max_raw_write = I2C_SMBUS_BLOCK_MAX - 1,
};
static int regmap_i2c_smbus_i2c_write_reg16(void *context, const void *data,
@@ -299,8 +299,8 @@ static int regmap_i2c_smbus_i2c_read_reg16(void *context, const void *reg,
static const struct regmap_bus regmap_i2c_smbus_i2c_block_reg16 = {
.write = regmap_i2c_smbus_i2c_write_reg16,
.read = regmap_i2c_smbus_i2c_read_reg16,
- .max_raw_read = I2C_SMBUS_BLOCK_MAX,
- .max_raw_write = I2C_SMBUS_BLOCK_MAX,
+ .max_raw_read = I2C_SMBUS_BLOCK_MAX - 2,
+ .max_raw_write = I2C_SMBUS_BLOCK_MAX - 2,
};
static const struct regmap_bus *regmap_get_i2c_bus(struct i2c_client *i2c,
--
2.39.2
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2023-07-15 11:48 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-07-12 11:16 [PATCH 0/2] regmap: Redo fixes for raw I/O length restrictions Mark Brown
2023-07-12 11:16 ` [PATCH 1/2] regmap: Drop initial version of maximum transfer length fixes Mark Brown
2023-07-12 11:16 ` [PATCH 2/2] regmap: Account for register length in SMBus I/O limits Mark Brown
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox