From: Sasha Levin Date: Tue, 16 Jul 2024 14:21:05 +0000 (-0400) Subject: Fixes for 5.10 X-Git-Tag: v4.19.318~18^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8623b3c807c5e6033e7977d5b84a5a4aa0c8d270;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 5.10 Signed-off-by: Sasha Levin --- diff --git a/queue-5.10/i2c-mark-hostnotify-target-address-as-used.patch b/queue-5.10/i2c-mark-hostnotify-target-address-as-used.patch new file mode 100644 index 00000000000..1c573037842 --- /dev/null +++ b/queue-5.10/i2c-mark-hostnotify-target-address-as-used.patch @@ -0,0 +1,39 @@ +From 666e3acbaf1bd0083e3548d95fb1d95dcece5840 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Jul 2024 10:55:07 +0200 +Subject: i2c: mark HostNotify target address as used + +From: Wolfram Sang + +[ Upstream commit bd9f5348089b65612e5ca976e2ae22f005340331 ] + +I2C core handles the local target for receiving HostNotify alerts. There +is no separate driver bound to that address. That means userspace can +access it if desired, leading to further complications if controllers +are not capable of reading their own local target. Bind the local target +to the dummy driver so it will be marked as "handled by the kernel" if +the HostNotify feature is used. That protects aginst userspace access +and prevents other drivers binding to it. + +Fixes: 2a71593da34d ("i2c: smbus: add core function handling SMBus host-notify") +Signed-off-by: Wolfram Sang +Signed-off-by: Sasha Levin +--- + drivers/i2c/i2c-core-base.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c +index e8a89e18c640e..6fac638e423ac 100644 +--- a/drivers/i2c/i2c-core-base.c ++++ b/drivers/i2c/i2c-core-base.c +@@ -969,6 +969,7 @@ EXPORT_SYMBOL_GPL(i2c_unregister_device); + + static const struct i2c_device_id dummy_id[] = { + { "dummy", 0 }, ++ { "smbus_host_notify", 0 }, + { }, + }; + +-- +2.43.0 + diff --git a/queue-5.10/i2c-rcar-add-r-car-gen4-support.patch b/queue-5.10/i2c-rcar-add-r-car-gen4-support.patch new file mode 100644 index 00000000000..86f51e1bb15 --- /dev/null +++ b/queue-5.10/i2c-rcar-add-r-car-gen4-support.patch @@ -0,0 +1,40 @@ +From ad485b0caaceb2c7e40e5d9bf16225e0cd7cdac8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 3 Feb 2022 15:33:17 +0100 +Subject: i2c: rcar: Add R-Car Gen4 support + +From: Geert Uytterhoeven + +[ Upstream commit ea01b71b07993d5c518496692f476a3c6b5d9786 ] + +Add support for the I2C Bus Interface on R-Car Gen4 SoCs (e.g. R-Car +S4-8) by matching on a family-specific compatible value. + +While I2C on R-Car Gen4 does support some extra features (Slave Clock +Stretch Select), for now it is treated the same as I2C on R-Car Gen3. + +Signed-off-by: Geert Uytterhoeven +Reviewed-by: Wolfram Sang +[wsa: removed incorrect "FM+" from commit message] +Signed-off-by: Wolfram Sang +Stable-dep-of: ea5ea84c9d35 ("i2c: rcar: ensure Gen3+ reset does not disturb local targets") +Signed-off-by: Sasha Levin +--- + drivers/i2c/busses/i2c-rcar.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c +index 029d999708261..720c3fd757ef2 100644 +--- a/drivers/i2c/busses/i2c-rcar.c ++++ b/drivers/i2c/busses/i2c-rcar.c +@@ -950,6 +950,7 @@ static const struct of_device_id rcar_i2c_dt_ids[] = { + { .compatible = "renesas,rcar-gen1-i2c", .data = (void *)I2C_RCAR_GEN1 }, + { .compatible = "renesas,rcar-gen2-i2c", .data = (void *)I2C_RCAR_GEN2 }, + { .compatible = "renesas,rcar-gen3-i2c", .data = (void *)I2C_RCAR_GEN3 }, ++ { .compatible = "renesas,rcar-gen4-i2c", .data = (void *)I2C_RCAR_GEN3 }, + {}, + }; + MODULE_DEVICE_TABLE(of, rcar_i2c_dt_ids); +-- +2.43.0 + diff --git a/queue-5.10/i2c-rcar-bring-hardware-to-known-state-when-probing.patch b/queue-5.10/i2c-rcar-bring-hardware-to-known-state-when-probing.patch new file mode 100644 index 00000000000..c9b4e1ea069 --- /dev/null +++ b/queue-5.10/i2c-rcar-bring-hardware-to-known-state-when-probing.patch @@ -0,0 +1,71 @@ +From 03c09167c3426dea763bd74b3eecabf340ab1d4f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 7 Jul 2024 10:28:46 +0200 +Subject: i2c: rcar: bring hardware to known state when probing + +From: Wolfram Sang + +[ Upstream commit 4e36c0f20cb1c74c7bd7ea31ba432c1c4a989031 ] + +When probing, the hardware is not brought into a known state. This may +be a problem when a hypervisor restarts Linux without resetting the +hardware, leaving an old state running. Make sure the hardware gets +initialized, especially interrupts should be cleared and disabled. + +Reported-by: Dirk Behme +Reported-by: Geert Uytterhoeven +Closes: https://lore.kernel.org/r/20240702045535.2000393-1-dirk.behme@de.bosch.com +Fixes: 6ccbe607132b ("i2c: add Renesas R-Car I2C driver") +Signed-off-by: Wolfram Sang +Signed-off-by: Andi Shyti +Signed-off-by: Sasha Levin +--- + drivers/i2c/busses/i2c-rcar.c | 17 ++++++++++++----- + 1 file changed, 12 insertions(+), 5 deletions(-) + +diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c +index 6a7a7a074a975..029d999708261 100644 +--- a/drivers/i2c/busses/i2c-rcar.c ++++ b/drivers/i2c/busses/i2c-rcar.c +@@ -220,6 +220,14 @@ static void rcar_i2c_init(struct rcar_i2c_priv *priv) + + } + ++static void rcar_i2c_reset_slave(struct rcar_i2c_priv *priv) ++{ ++ rcar_i2c_write(priv, ICSIER, 0); ++ rcar_i2c_write(priv, ICSSR, 0); ++ rcar_i2c_write(priv, ICSCR, SDBS); ++ rcar_i2c_write(priv, ICSAR, 0); /* Gen2: must be 0 if not using slave */ ++} ++ + static int rcar_i2c_bus_barrier(struct rcar_i2c_priv *priv) + { + int ret; +@@ -888,11 +896,8 @@ static int rcar_unreg_slave(struct i2c_client *slave) + + /* ensure no irq is running before clearing ptr */ + disable_irq(priv->irq); +- rcar_i2c_write(priv, ICSIER, 0); +- rcar_i2c_write(priv, ICSSR, 0); ++ rcar_i2c_reset_slave(priv); + enable_irq(priv->irq); +- rcar_i2c_write(priv, ICSCR, SDBS); +- rcar_i2c_write(priv, ICSAR, 0); /* Gen2: must be 0 if not using slave */ + + priv->slave = NULL; + +@@ -1004,7 +1009,9 @@ static int rcar_i2c_probe(struct platform_device *pdev) + goto out_pm_disable; + } + +- rcar_i2c_write(priv, ICSAR, 0); /* Gen2: must be 0 if not using slave */ ++ /* Bring hardware to known state */ ++ rcar_i2c_init(priv); ++ rcar_i2c_reset_slave(priv); + + if (priv->devtype < I2C_RCAR_GEN3) { + irqflags |= IRQF_NO_THREAD; +-- +2.43.0 + diff --git a/queue-5.10/i2c-rcar-clear-no_rxdma-flag-after-resetting.patch b/queue-5.10/i2c-rcar-clear-no_rxdma-flag-after-resetting.patch new file mode 100644 index 00000000000..507204a1abb --- /dev/null +++ b/queue-5.10/i2c-rcar-clear-no_rxdma-flag-after-resetting.patch @@ -0,0 +1,39 @@ +From 0ef922b34a68faddb50f607cc496e392f4fd8739 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Jul 2024 13:03:00 +0200 +Subject: i2c: rcar: clear NO_RXDMA flag after resetting + +From: Wolfram Sang + +[ Upstream commit fea6b5ebb71a2830b042e42de7ae255017ac3ce8 ] + +We should allow RXDMA only if the reset was really successful, so clear +the flag after the reset call. + +Fixes: 0e864b552b23 ("i2c: rcar: reset controller is mandatory for Gen3+") +Signed-off-by: Wolfram Sang +Signed-off-by: Andi Shyti +Signed-off-by: Sasha Levin +--- + drivers/i2c/busses/i2c-rcar.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c +index db3a5b80f1aa8..8a8c2403641b0 100644 +--- a/drivers/i2c/busses/i2c-rcar.c ++++ b/drivers/i2c/busses/i2c-rcar.c +@@ -826,10 +826,10 @@ static int rcar_i2c_master_xfer(struct i2c_adapter *adap, + + /* Gen3+ needs a reset. That also allows RXDMA once */ + if (priv->devtype >= I2C_RCAR_GEN3) { +- priv->flags &= ~ID_P_NO_RXDMA; + ret = rcar_i2c_do_reset(priv); + if (ret) + goto out; ++ priv->flags &= ~ID_P_NO_RXDMA; + } + + rcar_i2c_init(priv); +-- +2.43.0 + diff --git a/queue-5.10/i2c-rcar-ensure-gen3-reset-does-not-disturb-local-ta.patch b/queue-5.10/i2c-rcar-ensure-gen3-reset-does-not-disturb-local-ta.patch new file mode 100644 index 00000000000..74e513ebbf5 --- /dev/null +++ b/queue-5.10/i2c-rcar-ensure-gen3-reset-does-not-disturb-local-ta.patch @@ -0,0 +1,59 @@ +From a3968f79d29edca4560844461b1f06d3459f8e1c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Jul 2024 10:30:44 +0200 +Subject: i2c: rcar: ensure Gen3+ reset does not disturb local targets + +From: Wolfram Sang + +[ Upstream commit ea5ea84c9d3570dc06e8fc5ee2273eaa584aa3ac ] + +R-Car Gen3+ needs a reset before every controller transfer. That erases +configuration of a potentially in parallel running local target +instance. To avoid this disruption, avoid controller transfers if a +local target is running. Also, disable SMBusHostNotify because it +requires being a controller and local target at the same time. + +Fixes: 3b770017b03a ("i2c: rcar: handle RXDMA HW behaviour on Gen3") +Signed-off-by: Wolfram Sang +Signed-off-by: Andi Shyti +Signed-off-by: Sasha Levin +--- + drivers/i2c/busses/i2c-rcar.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c +index 41c9d15c3bc69..db3a5b80f1aa8 100644 +--- a/drivers/i2c/busses/i2c-rcar.c ++++ b/drivers/i2c/busses/i2c-rcar.c +@@ -796,6 +796,10 @@ static int rcar_i2c_do_reset(struct rcar_i2c_priv *priv) + { + int ret; + ++ /* Don't reset if a slave instance is currently running */ ++ if (priv->slave) ++ return -EISCONN; ++ + ret = reset_control_reset(priv->rstc); + if (ret) + return ret; +@@ -1027,6 +1031,7 @@ static int rcar_i2c_probe(struct platform_device *pdev) + if (of_property_read_bool(dev->of_node, "smbus")) + priv->flags |= ID_P_HOST_NOTIFY; + ++ /* R-Car Gen3+ needs a reset before every transfer */ + if (priv->devtype >= I2C_RCAR_GEN3) { + priv->rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL); + if (IS_ERR(priv->rstc)) +@@ -1035,6 +1040,9 @@ static int rcar_i2c_probe(struct platform_device *pdev) + ret = reset_control_status(priv->rstc); + if (ret < 0) + goto out_pm_put; ++ ++ /* hard reset disturbs HostNotify local target, so disable it */ ++ priv->flags &= ~ID_P_HOST_NOTIFY; + } + + ret = platform_get_irq(pdev, 0); +-- +2.43.0 + diff --git a/queue-5.10/i2c-rcar-introduce-gen4-devices.patch b/queue-5.10/i2c-rcar-introduce-gen4-devices.patch new file mode 100644 index 00000000000..b977ba52542 --- /dev/null +++ b/queue-5.10/i2c-rcar-introduce-gen4-devices.patch @@ -0,0 +1,77 @@ +From 86e1a9c427731a3fb27408606ef68388f0d563bb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Dec 2023 08:43:57 +0100 +Subject: i2c: rcar: introduce Gen4 devices + +From: Wolfram Sang + +[ Upstream commit 2b523c46e81ebd621515ab47117f95de197dfcbf ] + +So far, we treated Gen4 as Gen3. But we are soon adding FM+ as a Gen4 +specific feature, so prepare the code for the new devtype. + +Signed-off-by: Wolfram Sang +Reviewed-by: Geert Uytterhoeven +Reviewed-by: Andi Shyti +Signed-off-by: Wolfram Sang +Stable-dep-of: ea5ea84c9d35 ("i2c: rcar: ensure Gen3+ reset does not disturb local targets") +Signed-off-by: Sasha Levin +--- + drivers/i2c/busses/i2c-rcar.c | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c +index 4b0222e5f584c..41c9d15c3bc69 100644 +--- a/drivers/i2c/busses/i2c-rcar.c ++++ b/drivers/i2c/busses/i2c-rcar.c +@@ -116,6 +116,7 @@ enum rcar_i2c_type { + I2C_RCAR_GEN1, + I2C_RCAR_GEN2, + I2C_RCAR_GEN3, ++ I2C_RCAR_GEN4, + }; + + struct rcar_i2c_priv { +@@ -380,8 +381,8 @@ static void rcar_i2c_dma_unmap(struct rcar_i2c_priv *priv) + dma_unmap_single(chan->device->dev, sg_dma_address(&priv->sg), + sg_dma_len(&priv->sg), priv->dma_direction); + +- /* Gen3 can only do one RXDMA per transfer and we just completed it */ +- if (priv->devtype == I2C_RCAR_GEN3 && ++ /* Gen3+ can only do one RXDMA per transfer and we just completed it */ ++ if (priv->devtype >= I2C_RCAR_GEN3 && + priv->dma_direction == DMA_FROM_DEVICE) + priv->flags |= ID_P_NO_RXDMA; + +@@ -819,8 +820,8 @@ static int rcar_i2c_master_xfer(struct i2c_adapter *adap, + if (ret < 0) + goto out; + +- /* Gen3 needs a reset before allowing RXDMA once */ +- if (priv->devtype == I2C_RCAR_GEN3) { ++ /* Gen3+ needs a reset. That also allows RXDMA once */ ++ if (priv->devtype >= I2C_RCAR_GEN3) { + priv->flags &= ~ID_P_NO_RXDMA; + ret = rcar_i2c_do_reset(priv); + if (ret) +@@ -948,7 +949,7 @@ static const struct of_device_id rcar_i2c_dt_ids[] = { + { .compatible = "renesas,rcar-gen1-i2c", .data = (void *)I2C_RCAR_GEN1 }, + { .compatible = "renesas,rcar-gen2-i2c", .data = (void *)I2C_RCAR_GEN2 }, + { .compatible = "renesas,rcar-gen3-i2c", .data = (void *)I2C_RCAR_GEN3 }, +- { .compatible = "renesas,rcar-gen4-i2c", .data = (void *)I2C_RCAR_GEN3 }, ++ { .compatible = "renesas,rcar-gen4-i2c", .data = (void *)I2C_RCAR_GEN4 }, + {}, + }; + MODULE_DEVICE_TABLE(of, rcar_i2c_dt_ids); +@@ -1026,7 +1027,7 @@ static int rcar_i2c_probe(struct platform_device *pdev) + if (of_property_read_bool(dev->of_node, "smbus")) + priv->flags |= ID_P_HOST_NOTIFY; + +- if (priv->devtype == I2C_RCAR_GEN3) { ++ if (priv->devtype >= I2C_RCAR_GEN3) { + priv->rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL); + if (IS_ERR(priv->rstc)) + goto out_pm_put; +-- +2.43.0 + diff --git a/queue-5.10/i2c-rcar-reset-controller-is-mandatory-for-gen3.patch b/queue-5.10/i2c-rcar-reset-controller-is-mandatory-for-gen3.patch new file mode 100644 index 00000000000..278a5403c41 --- /dev/null +++ b/queue-5.10/i2c-rcar-reset-controller-is-mandatory-for-gen3.patch @@ -0,0 +1,81 @@ +From 74729221ade8531ef9ca40ddac13bb15030f1ff8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Sep 2023 14:53:49 +0200 +Subject: i2c: rcar: reset controller is mandatory for Gen3+ + +From: Wolfram Sang + +[ Upstream commit 0e864b552b2302e40b2277629ebac79544a5c433 ] + +Initially, we only needed a reset controller to make sure RXDMA works at +least once per transfer. Meanwhile, documentation has been updated. It +now says that a reset has to be performed prior every transaction, even +if it is non-DMA. So, make the reset controller a requirement instead of +being optional. And bail out if resetting fails. + +Signed-off-by: Wolfram Sang +Reviewed-by: Geert Uytterhoeven +Signed-off-by: Wolfram Sang +Stable-dep-of: ea5ea84c9d35 ("i2c: rcar: ensure Gen3+ reset does not disturb local targets") +Signed-off-by: Sasha Levin +--- + drivers/i2c/busses/i2c-rcar.c | 29 ++++++++++++++--------------- + 1 file changed, 14 insertions(+), 15 deletions(-) + +diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c +index 720c3fd757ef2..4b0222e5f584c 100644 +--- a/drivers/i2c/busses/i2c-rcar.c ++++ b/drivers/i2c/busses/i2c-rcar.c +@@ -821,12 +821,10 @@ static int rcar_i2c_master_xfer(struct i2c_adapter *adap, + + /* Gen3 needs a reset before allowing RXDMA once */ + if (priv->devtype == I2C_RCAR_GEN3) { +- priv->flags |= ID_P_NO_RXDMA; +- if (!IS_ERR(priv->rstc)) { +- ret = rcar_i2c_do_reset(priv); +- if (ret == 0) +- priv->flags &= ~ID_P_NO_RXDMA; +- } ++ priv->flags &= ~ID_P_NO_RXDMA; ++ ret = rcar_i2c_do_reset(priv); ++ if (ret) ++ goto out; + } + + rcar_i2c_init(priv); +@@ -1019,15 +1017,6 @@ static int rcar_i2c_probe(struct platform_device *pdev) + irqhandler = rcar_i2c_gen2_irq; + } + +- if (priv->devtype == I2C_RCAR_GEN3) { +- priv->rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL); +- if (!IS_ERR(priv->rstc)) { +- ret = reset_control_status(priv->rstc); +- if (ret < 0) +- priv->rstc = ERR_PTR(-ENOTSUPP); +- } +- } +- + /* Stay always active when multi-master to keep arbitration working */ + if (of_property_read_bool(dev->of_node, "multi-master")) + priv->flags |= ID_P_PM_BLOCKED; +@@ -1037,6 +1026,16 @@ static int rcar_i2c_probe(struct platform_device *pdev) + if (of_property_read_bool(dev->of_node, "smbus")) + priv->flags |= ID_P_HOST_NOTIFY; + ++ if (priv->devtype == I2C_RCAR_GEN3) { ++ priv->rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL); ++ if (IS_ERR(priv->rstc)) ++ goto out_pm_put; ++ ++ ret = reset_control_status(priv->rstc); ++ if (ret < 0) ++ goto out_pm_put; ++ } ++ + ret = platform_get_irq(pdev, 0); + if (ret < 0) + goto out_pm_put; +-- +2.43.0 + diff --git a/queue-5.10/series b/queue-5.10/series index 5cb6b66d58d..37045af3883 100644 --- a/queue-5.10/series +++ b/queue-5.10/series @@ -97,3 +97,10 @@ ipv6-annotate-data-races-around-cnf.disable_ipv6.patch ipv6-prevent-null-dereference-in-ip6_output.patch bpf-allow-reads-from-uninit-stack.patch nilfs2-fix-kernel-bug-on-rename-operation-of-broken-directory.patch +i2c-rcar-bring-hardware-to-known-state-when-probing.patch +i2c-mark-hostnotify-target-address-as-used.patch +i2c-rcar-add-r-car-gen4-support.patch +i2c-rcar-reset-controller-is-mandatory-for-gen3.patch +i2c-rcar-introduce-gen4-devices.patch +i2c-rcar-ensure-gen3-reset-does-not-disturb-local-ta.patch +i2c-rcar-clear-no_rxdma-flag-after-resetting.patch