linux/drivers/base/regmap
Mark Brown f033c26de5
regmap: Add maple tree based register cache
The current state of the art for sparse register maps is the
rbtree cache.  This works well for most applications but isn't
always ideal for sparser register maps since the rbtree can get
deep, requiring a lot of walking.  Fortunately the kernel has a
data structure intended to address this very problem, the maple
tree.  Provide an initial implementation of a register cache
based on the maple tree to start taking advantage of it.

The entries stored in the maple tree are arrays of register
values, with the maple tree keys holding the register addresses.
We store data in host native format rather than device native
format as we do for rbtree, this will be a benefit for devices
where we don't marshal data within regmap and simplifies the code
but will result in additional CPU overhead when syncing the cache
on devices where we do marshal data in regmap.

This should work well for a lot of devices, though there's some
additional areas that could be looked at such as caching the
last accessed entry like we do for rbtree and trying to minimise
the maple tree level locking. We should also use bulk writes
rather than single register writes when resyncing the cache where
possible, even if we don't store in device native format.

Very small register maps may continue to to better with rbtree
longer term.

Signed-off-by: Mark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20230325-regcache-maple-v3-2-23e271f93dc7@kernel.org
Signed-off-by: Mark Brown <broonie@kernel.org>
2023-04-03 12:53:44 +01:00
..
internal.h regmap: Add maple tree based register cache 2023-04-03 12:53:44 +01:00
Kconfig regmap: Add some basic kunit tests 2023-03-30 12:25:47 +01:00
Makefile regmap: Add maple tree based register cache 2023-04-03 12:53:44 +01:00
regcache-flat.c regmap: add proper SPDX identifiers on files that did not have them. 2019-04-25 20:22:15 +01:00
regcache-maple.c regmap: Add maple tree based register cache 2023-04-03 12:53:44 +01:00
regcache-rbtree.c regmap: Fix possible double-free in regcache_rbtree_exit() 2021-10-12 11:48:43 +01:00
regcache.c regmap: Add maple tree based register cache 2023-04-03 12:53:44 +01:00
regmap-ac97.c regmap: add proper SPDX identifiers on files that did not have them. 2019-04-25 20:22:15 +01:00
regmap-debugfs.c regmap: debugfs: Fix indentation 2022-01-07 19:16:23 +00:00
regmap-fsi.c regmap: Add FSI bus support 2022-11-25 19:17:02 +00:00
regmap-i2c.c regmap-i2c: Set regmap max raw r/w from quirks 2021-05-14 13:25:03 +01:00
regmap-i3c.c regmap: Constify static regmap_bus structs 2022-04-04 08:41:50 +01:00
regmap-irq.c regmap-irq: Add no_status support 2023-03-05 23:38:50 +00:00
regmap-kunit.c regmap: Add maple tree based register cache 2023-04-03 12:53:44 +01:00
regmap-mdio.c regmap: Rework regmap_mdio_c45_{read|write} for new C45 API. 2023-01-16 13:16:09 +00:00
regmap-mmio.c regmap: mmio: replace return 0 with break in switch statement 2022-09-22 12:33:18 +01:00
regmap-ram.c regmap: Add RAM backed register map 2023-03-30 12:25:42 +01:00
regmap-sccb.c regmap: Constify static regmap_bus structs 2022-04-04 08:41:50 +01:00
regmap-sdw-mbq.c regmap: Constify static regmap_bus structs 2022-04-04 08:41:50 +01:00
regmap-sdw.c regmap: sdw: Remove 8-bit value size restriction 2023-03-05 23:38:47 +00:00
regmap-slimbus.c regmap: Constify static regmap_bus structs 2022-04-04 08:41:50 +01:00
regmap-spi-avmm.c regmap: spi-avmm: Use swabXX_array() helpers 2022-09-07 12:42:27 +01:00
regmap-spi.c regmap: spi: Reserve space for register address/padding 2022-08-18 15:02:05 +01:00
regmap-spmi.c regmap: add proper SPDX identifiers on files that did not have them. 2019-04-25 20:22:15 +01:00
regmap-w1.c regmap: Constify static regmap_bus structs 2022-04-04 08:41:50 +01:00
regmap.c regmap: Support paging for buses with reg_read()/reg_write() 2023-03-27 01:42:37 +01:00
trace.h regmap: trace: Remove unneeded blank lines 2022-09-05 13:09:45 +01:00