From: "Cédric Le Goater" <clg@kaod.org>
To: qemu-arm@nongnu.org, qemu-devel@nongnu.org
Cc: qemu-block@nongnu.org, "Joel Stanley" <joel@jms.id.au>,
	"Andrew Jeffery" <andrew@aj.id.au>,
	"Markus Armbruster" <armbru@redhat.com>,
	"Peter Maydell" <peter.maydell@linaro.org>,
	"Philippe Mathieu-Daudé" <philmd@linaro.org>,
	"Klaus Jensen" <k.jensen@samsung.com>,
	"Corey Minyard" <cminyard@mvista.com>,
	"Cédric Le Goater" <clg@kaod.org>
Subject: [PATCH 2/8] hw/i2c: only schedule pending master when bus is idle
Date: Tue, 14 Feb 2023 18:18:24 +0100	[thread overview]
Message-ID: <20230214171830.681594-3-clg@kaod.org> (raw)
In-Reply-To: <20230214171830.681594-1-clg@kaod.org>
From: Klaus Jensen <k.jensen@samsung.com>
It is not given that the current master will release the bus after a
transfer ends. Only schedule a pending master if the bus is idle.
Fixes: 37fa5ca42623 ("hw/i2c: support multiple masters")
Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
Acked-by: Corey Minyard <cminyard@mvista.com>
Message-Id: <20221116084312.35808-2-its@irrelevant.dk>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
 include/hw/i2c/i2c.h |  2 ++
 hw/i2c/aspeed_i2c.c  |  2 ++
 hw/i2c/core.c        | 37 ++++++++++++++++++++++---------------
 3 files changed, 26 insertions(+), 15 deletions(-)
diff --git a/include/hw/i2c/i2c.h b/include/hw/i2c/i2c.h
index 9b9581d230..2a3abacd1b 100644
--- a/include/hw/i2c/i2c.h
+++ b/include/hw/i2c/i2c.h
@@ -141,6 +141,8 @@ int i2c_start_send(I2CBus *bus, uint8_t address);
  */
 int i2c_start_send_async(I2CBus *bus, uint8_t address);
 
+void i2c_schedule_pending_master(I2CBus *bus);
+
 void i2c_end_transfer(I2CBus *bus);
 void i2c_nack(I2CBus *bus);
 void i2c_ack(I2CBus *bus);
diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c
index c166fd20fa..1f071a3811 100644
--- a/hw/i2c/aspeed_i2c.c
+++ b/hw/i2c/aspeed_i2c.c
@@ -550,6 +550,8 @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
         }
         SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, M_STOP_CMD, 0);
         aspeed_i2c_set_state(bus, I2CD_IDLE);
+
+        i2c_schedule_pending_master(bus->bus);
     }
 
     if (aspeed_i2c_bus_pkt_mode_en(bus)) {
diff --git a/hw/i2c/core.c b/hw/i2c/core.c
index d4ba8146bf..bed594fe59 100644
--- a/hw/i2c/core.c
+++ b/hw/i2c/core.c
@@ -185,22 +185,39 @@ int i2c_start_transfer(I2CBus *bus, uint8_t address, bool is_recv)
 
 void i2c_bus_master(I2CBus *bus, QEMUBH *bh)
 {
-    if (i2c_bus_busy(bus)) {
-        I2CPendingMaster *node = g_new(struct I2CPendingMaster, 1);
-        node->bh = bh;
+    I2CPendingMaster *node = g_new(struct I2CPendingMaster, 1);
+    node->bh = bh;
+
+    QSIMPLEQ_INSERT_TAIL(&bus->pending_masters, node, entry);
+}
+
+void i2c_schedule_pending_master(I2CBus *bus)
+{
+    I2CPendingMaster *node;
 
-        QSIMPLEQ_INSERT_TAIL(&bus->pending_masters, node, entry);
+    if (i2c_bus_busy(bus)) {
+        /* someone is already controlling the bus; wait for it to release it */
+        return;
+    }
 
+    if (QSIMPLEQ_EMPTY(&bus->pending_masters)) {
         return;
     }
 
-    bus->bh = bh;
+    node = QSIMPLEQ_FIRST(&bus->pending_masters);
+    bus->bh = node->bh;
+
+    QSIMPLEQ_REMOVE_HEAD(&bus->pending_masters, entry);
+    g_free(node);
+
     qemu_bh_schedule(bus->bh);
 }
 
 void i2c_bus_release(I2CBus *bus)
 {
     bus->bh = NULL;
+
+    i2c_schedule_pending_master(bus);
 }
 
 int i2c_start_recv(I2CBus *bus, uint8_t address)
@@ -234,16 +251,6 @@ void i2c_end_transfer(I2CBus *bus)
         g_free(node);
     }
     bus->broadcast = false;
-
-    if (!QSIMPLEQ_EMPTY(&bus->pending_masters)) {
-        I2CPendingMaster *node = QSIMPLEQ_FIRST(&bus->pending_masters);
-        bus->bh = node->bh;
-
-        QSIMPLEQ_REMOVE_HEAD(&bus->pending_masters, entry);
-        g_free(node);
-
-        qemu_bh_schedule(bus->bh);
-    }
 }
 
 int i2c_send(I2CBus *bus, uint8_t data)
-- 
2.39.1
next prev parent reply	other threads:[~2023-02-14 17:21 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-14 17:18 [PATCH 0/8] aspeed: I2C fixes, -drive removal (first step) Cédric Le Goater
2023-02-14 17:18 ` [PATCH 1/8] m25p80: Improve error when the backend file size does not match the device Cédric Le Goater
2023-02-15 19:52   ` Peter Delevoryas
2023-02-16  8:47     ` Philippe Mathieu-Daudé
2023-02-14 17:18 ` Cédric Le Goater [this message]
2023-02-14 17:18 ` [PATCH 3/8] hw/misc: add a toy i2c echo device Cédric Le Goater
2023-02-15 10:55   ` Philippe Mathieu-Daudé
2023-02-15 11:09     ` Cédric Le Goater
2023-02-15 12:26       ` Philippe Mathieu-Daudé
2023-02-17  8:24         ` Cédric Le Goater
2023-02-14 17:18 ` [PATCH 4/8] tests/avocado/machine_aspeed.py: Add I2C slave tests Cédric Le Goater
2023-02-14 17:18 ` [PATCH 5/8] aspeed/smc: Replace SysBus IRQs with GPIO lines Cédric Le Goater
2023-02-15 10:56   ` Philippe Mathieu-Daudé
2023-02-14 17:18 ` [PATCH 6/8] aspeed/smc: Wire CS lines at reset Cédric Le Goater
2023-02-14 17:18 ` [PATCH 7/8] aspeed: Introduce a spi_boot region under the SoC Cédric Le Goater
2023-02-15 11:02   ` Philippe Mathieu-Daudé
2023-03-01 13:27     ` Cédric Le Goater
2023-02-14 17:18 ` [PATCH 8/8] aspeed: Add a boot_rom overlap region in the SoC spi_boot container Cédric Le Goater
2023-02-15  6:38 ` [PATCH 0/8] aspeed: I2C fixes, -drive removal (first step) Markus Armbruster
2023-02-15  8:32   ` Cédric Le Goater
2023-02-15 12:35     ` Markus Armbruster
2023-02-17  8:22       ` Cédric Le Goater
2023-02-15 10:45 ` Philippe Mathieu-Daudé
2023-02-17  8:26   ` Cédric Le Goater
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox
  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):
  git send-email \
    --in-reply-to=20230214171830.681594-3-clg@kaod.org \
    --to=clg@kaod.org \
    --cc=andrew@aj.id.au \
    --cc=armbru@redhat.com \
    --cc=cminyard@mvista.com \
    --cc=joel@jms.id.au \
    --cc=k.jensen@samsung.com \
    --cc=peter.maydell@linaro.org \
    --cc=philmd@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY
  https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
  Be sure your reply has a Subject: header at the top and a blank line
  before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).