diff --git a/debian.qcom-x1e/changelog b/debian.qcom-x1e/changelog index 81920b5e93ef5f..46c8ebadf4ff7f 100644 --- a/debian.qcom-x1e/changelog +++ b/debian.qcom-x1e/changelog @@ -1,3 +1,9 @@ +linux-qcom-x1e (7.2.2-jg-0sp11v8) resolute; urgency=medium + + * Test ordered GPI event-ring pointer reads on SP11 touch and pen. + + -- Leon Silcott Thu, 03 Sep 2026 09:53:40 +0100 + linux-qcom-x1e (7.2.2-jg-0) resolute; urgency=medium * arm64: dts: qcom: x1-lenovo-ideacentre-mini-01q8x10: discriminate compatible strings diff --git a/drivers/dma/qcom/gpi.c b/drivers/dma/qcom/gpi.c index b7678b174ecfa6..47bebc5bfa3757 100644 --- a/drivers/dma/qcom/gpi.c +++ b/drivers/dma/qcom/gpi.c @@ -662,8 +662,14 @@ static inline u32 gpi_read_reg(struct gpii *gpii, void __iomem *addr) static phys_addr_t gpi_read_ev_rp(struct gpii *gpii) { - u32 lsb = gpi_read_reg(gpii, gpii->ev_ring_rp_lsb_reg); - u32 msb; + u32 lsb, msb; + + /* + * The event read pointer publishes entries written by the device into + * coherent memory. Use ordered MMIO reads so those writes are visible + * before the caller consumes an event from the ring. + */ + lsb = readl(gpii->ev_ring_rp_lsb_reg); /* * Denali publishes and may inspect the event ring before either QSPI @@ -674,7 +680,7 @@ static phys_addr_t gpi_read_ev_rp(struct gpii *gpii) if (!gpii_has_denali_qspi(gpii)) return lsb; - msb = gpi_read_reg(gpii, gpii->ev_ring_rp_lsb_reg + 4); + msb = readl(gpii->ev_ring_rp_lsb_reg + 4); return ((phys_addr_t)msb << 32) | lsb; }