All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH qemu v3 01/20] Fixing the basic functionality of STM32 timers
  2023-12-02 13:40 [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform ~lbryndza
@ 2023-12-02 11:55 ` ~lbryndza
  2023-12-02 12:05 ` [PATCH qemu v3 02/20] " ~lbryndza
                   ` (19 subsequent siblings)
  20 siblings, 0 replies; 23+ messages in thread
From: ~lbryndza @ 2023-12-02 11:55 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alistair Francis, Peter Maydell

From: Lucjan Bryndza <lbryndza.oss@icloud.com>

The current implementation of timers does not work properly
even in basic functionality. A counter configured to report
an interrupt every 10ms reports the first interrupts after a
few seconds.  There are also no properly implemented count up and
count down modes. This commit fixes bugs with interrupt
reporting and implements the basic modes of the counter's
time-base block.
Add time base registers definitions

Signed-off-by: Lucjan Bryndza <lbryndza.oss@icloud.com>
---
 include/hw/timer/stm32f2xx_timer.h | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/include/hw/timer/stm32f2xx_timer.h b/include/hw/timer/stm32f2xx_timer.h
index 90f40f1746..8112878aa7 100644
--- a/include/hw/timer/stm32f2xx_timer.h
+++ b/include/hw/timer/stm32f2xx_timer.h
@@ -49,9 +49,15 @@
 #define TIM_DMAR     0x4C
 #define TIM_OR       0x50
 
-#define TIM_CR1_CEN   1
+#define TIM_CR1_CEN 0x0001
+#define TIM_CR1_DIR 0x0010
+#define TIM_CR1_CMS 0x0060
+#define TIM_CR1_OPM 0x0008
 
-#define TIM_EGR_UG 1
+#define TIM_SR1_UIF 0x0001
+
+#define TIM_EGR_UG 0x0001
+#define TIM_EGR_TG 0x0040
 
 #define TIM_CCER_CC2E   (1 << 4)
 #define TIM_CCMR1_OC2M2 (1 << 14)
@@ -61,6 +67,7 @@
 
 #define TIM_DIER_UIE  1
 
+
 #define TYPE_STM32F2XX_TIMER "stm32f2xx-timer"
 typedef struct STM32F2XXTimerState STM32F2XXTimerState;
 DECLARE_INSTANCE_CHECKER(STM32F2XXTimerState, STM32F2XXTIMER,
@@ -99,4 +106,9 @@ struct STM32F2XXTimerState {
     uint32_t tim_or;
 };
 
+enum {
+    TIMER_UP_COUNT     = 0,
+    TIMER_DOWN_COUNT   = 1
+};
+
 #endif /* HW_STM32F2XX_TIMER_H */
-- 
2.38.5



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH qemu v3 02/20] Fixing the basic functionality of STM32 timers
  2023-12-02 13:40 [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform ~lbryndza
  2023-12-02 11:55 ` [PATCH qemu v3 01/20] Fixing the basic functionality of STM32 timers ~lbryndza
@ 2023-12-02 12:05 ` ~lbryndza
  2023-12-06 15:52   ` Alex Bennée
  2023-12-02 12:09 ` [PATCH qemu v3 03/20] " ~lbryndza
                   ` (18 subsequent siblings)
  20 siblings, 1 reply; 23+ messages in thread
From: ~lbryndza @ 2023-12-02 12:05 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alistair Francis, Peter Maydell

From: Lucjan Bryndza <lbryndza.oss@icloud.com>

The current implementation of timers does not work properly
even in basic functionality. A counter configured to report
an interrupt every 10ms reports the first interrupts after a
few seconds.  There are also no properly implemented count up an
count down modes. This commit fixes bugs with interrupt
reporting and implements the basic modes of the counter's
time-base block.

Remove wrong qemu timer implementation

Signed-off-by: Lucjan Bryndza <lbryndza.oss@icloud.com>
---
 hw/timer/stm32f2xx_timer.c | 55 ++++----------------------------------
 1 file changed, 5 insertions(+), 50 deletions(-)

diff --git a/hw/timer/stm32f2xx_timer.c b/hw/timer/stm32f2xx_timer.c
index ba8694dcd3..f03f594a17 100644
--- a/hw/timer/stm32f2xx_timer.c
+++ b/hw/timer/stm32f2xx_timer.c
@@ -23,12 +23,17 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "hw/irq.h"
 #include "hw/qdev-properties.h"
 #include "hw/timer/stm32f2xx_timer.h"
 #include "migration/vmstate.h"
 #include "qemu/log.h"
 #include "qemu/module.h"
+#include "qemu/typedefs.h"
+#include "qemu/timer.h"
+#include "qemu/main-loop.h"
+#include "sysemu/dma.h"
 
 #ifndef STM_TIMER_ERR_DEBUG
 #define STM_TIMER_ERR_DEBUG 0
@@ -42,57 +47,7 @@
 
 #define DB_PRINT(fmt, args...) DB_PRINT_L(1, fmt, ## args)
 
-static void stm32f2xx_timer_set_alarm(STM32F2XXTimerState *s, int64_t now);
 
-static void stm32f2xx_timer_interrupt(void *opaque)
-{
-    STM32F2XXTimerState *s = opaque;
-
-    DB_PRINT("Interrupt\n");
-
-    if (s->tim_dier & TIM_DIER_UIE && s->tim_cr1 & TIM_CR1_CEN) {
-        s->tim_sr |= 1;
-        qemu_irq_pulse(s->irq);
-        stm32f2xx_timer_set_alarm(s, s->hit_time);
-    }
-
-    if (s->tim_ccmr1 & (TIM_CCMR1_OC2M2 | TIM_CCMR1_OC2M1) &&
-        !(s->tim_ccmr1 & TIM_CCMR1_OC2M0) &&
-        s->tim_ccmr1 & TIM_CCMR1_OC2PE &&
-        s->tim_ccer & TIM_CCER_CC2E) {
-        /* PWM 2 - Mode 1 */
-        DB_PRINT("PWM2 Duty Cycle: %d%%\n",
-                s->tim_ccr2 / (100 * (s->tim_psc + 1)));
-    }
-}
-
-static inline int64_t stm32f2xx_ns_to_ticks(STM32F2XXTimerState *s, int64_t t)
-{
-    return muldiv64(t, s->freq_hz, 1000000000ULL) / (s->tim_psc + 1);
-}
-
-static void stm32f2xx_timer_set_alarm(STM32F2XXTimerState *s, int64_t now)
-{
-    uint64_t ticks;
-    int64_t now_ticks;
-
-    if (s->tim_arr == 0) {
-        return;
-    }
-
-    DB_PRINT("Alarm set at: 0x%x\n", s->tim_cr1);
-
-    now_ticks = stm32f2xx_ns_to_ticks(s, now);
-    ticks = s->tim_arr - (now_ticks - s->tick_offset);
-
-    DB_PRINT("Alarm set in %d ticks\n", (int) ticks);
-
-    s->hit_time = muldiv64((ticks + (uint64_t) now_ticks) * (s->tim_psc + 1),
-                               1000000000ULL, s->freq_hz);
-
-    timer_mod(s->timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + s->hit_time);
-    DB_PRINT("Wait Time: %" PRId64 " ticks\n", s->hit_time);
-}
 
 static void stm32f2xx_timer_reset(DeviceState *dev)
 {
-- 
2.38.5



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH qemu v3 03/20] Fixing the basic functionality of STM32 timers
  2023-12-02 13:40 [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform ~lbryndza
  2023-12-02 11:55 ` [PATCH qemu v3 01/20] Fixing the basic functionality of STM32 timers ~lbryndza
  2023-12-02 12:05 ` [PATCH qemu v3 02/20] " ~lbryndza
@ 2023-12-02 12:09 ` ~lbryndza
  2023-12-02 12:11 ` [PATCH qemu v3 04/20] " ~lbryndza
                   ` (17 subsequent siblings)
  20 siblings, 0 replies; 23+ messages in thread
From: ~lbryndza @ 2023-12-02 12:09 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alistair Francis, Peter Maydell

From: Lucjan Bryndza <lbryndza.oss@icloud.com>

The current implementation of timers does not work properly
even in basic functionality. A counter configured to report
an interrupt every 10ms reports the first interrupts after a
few seconds.  There are also no properly implemented count up an
count down modes. This commit fixes bugs with interrupt
reporting and implements the basic modes of the counter's
time-base block.

Add timer get counter function

Signed-off-by: Lucjan Bryndza <lbryndza.oss@icloud.com>
---
 hw/timer/stm32f2xx_timer.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/hw/timer/stm32f2xx_timer.c b/hw/timer/stm32f2xx_timer.c
index f03f594a17..0c5586cb8b 100644
--- a/hw/timer/stm32f2xx_timer.c
+++ b/hw/timer/stm32f2xx_timer.c
@@ -48,6 +48,16 @@
 #define DB_PRINT(fmt, args...) DB_PRINT_L(1, fmt, ## args)
 
 
+static uint32_t stm32f2xx_timer_get_count(STM32F2XXTimerState *s)
+{
+    uint64_t cnt = ptimer_get_count(s->timer);
+    if (s->count_mode == TIMER_UP_COUNT) {
+        return s->tim_arr - (cnt & 0xffff);
+    } else {
+        return cnt & 0xffff;
+    }
+}
+
 
 static void stm32f2xx_timer_reset(DeviceState *dev)
 {
-- 
2.38.5



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH qemu v3 04/20] Fixing the basic functionality of STM32 timers
  2023-12-02 13:40 [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform ~lbryndza
                   ` (2 preceding siblings ...)
  2023-12-02 12:09 ` [PATCH qemu v3 03/20] " ~lbryndza
@ 2023-12-02 12:11 ` ~lbryndza
  2023-12-02 12:12 ` [PATCH qemu v3 05/20] " ~lbryndza
                   ` (16 subsequent siblings)
  20 siblings, 0 replies; 23+ messages in thread
From: ~lbryndza @ 2023-12-02 12:11 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alistair Francis, Peter Maydell

From: Lucjan Bryndza <lbryndza.oss@icloud.com>

The current implementation of timers does not work properly
even in basic functionality. A counter configured to report
an interrupt every 10ms reports the first interrupts after a
few seconds.  There are also no properly implemented count up an
count down modes. This commit fixes bugs with interrupt
reporting and implements the basic modes of the counter's
time-base block.

Add stm32 timer set counter function

Signed-off-by: Lucjan Bryndza <lbryndza.oss@icloud.com>
---
 hw/timer/stm32f2xx_timer.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/hw/timer/stm32f2xx_timer.c b/hw/timer/stm32f2xx_timer.c
index 0c5586cb8b..9261090b84 100644
--- a/hw/timer/stm32f2xx_timer.c
+++ b/hw/timer/stm32f2xx_timer.c
@@ -59,6 +59,16 @@ static uint32_t stm32f2xx_timer_get_count(STM32F2XXTimerState *s)
 }
 
 
+static void stm32f2xx_timer_set_count(STM32F2XXTimerState *s, uint32_t cnt)
+{
+    if (s->count_mode == TIMER_UP_COUNT) {
+        ptimer_set_count(s->timer, s->tim_arr - (cnt & 0xffff));
+    } else {
+        ptimer_set_count(s->timer, cnt & 0xffff);
+    }
+}
+
+
 static void stm32f2xx_timer_reset(DeviceState *dev)
 {
     STM32F2XXTimerState *s = STM32F2XXTIMER(dev);
-- 
2.38.5



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH qemu v3 05/20] Fixing the basic functionality of STM32 timers
  2023-12-02 13:40 [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform ~lbryndza
                   ` (3 preceding siblings ...)
  2023-12-02 12:11 ` [PATCH qemu v3 04/20] " ~lbryndza
@ 2023-12-02 12:12 ` ~lbryndza
  2023-12-02 12:13 ` [PATCH qemu v3 06/20] " ~lbryndza
                   ` (15 subsequent siblings)
  20 siblings, 0 replies; 23+ messages in thread
From: ~lbryndza @ 2023-12-02 12:12 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alistair Francis, Peter Maydell

From: Lucjan Bryndza <lbryndza.oss@icloud.com>

The current implementation of timers does not work properly
even in basic functionality. A counter configured to report
an interrupt every 10ms reports the first interrupts after a
few seconds.  There are also no properly implemented count up an
count down modes. This commit fixes bugs with interrupt
reporting and implements the basic modes of the counter's
time-base block.

Add timer update function using ptimer implementation

Signed-off-by: Lucjan Bryndza <lbryndza.oss@icloud.com>
---
 hw/timer/stm32f2xx_timer.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/hw/timer/stm32f2xx_timer.c b/hw/timer/stm32f2xx_timer.c
index 9261090b84..62c98b5f04 100644
--- a/hw/timer/stm32f2xx_timer.c
+++ b/hw/timer/stm32f2xx_timer.c
@@ -68,6 +68,28 @@ static void stm32f2xx_timer_set_count(STM32F2XXTimerState *s, uint32_t cnt)
     }
 }
 
+static void stm32f2xx_timer_update(STM32F2XXTimerState *s)
+{
+    if (s->tim_cr1 & TIM_CR1_DIR) {
+        s->count_mode = TIMER_DOWN_COUNT;
+    } else {
+        s->count_mode = TIMER_UP_COUNT;
+    }
+
+    if (s->tim_cr1 & TIM_CR1_CMS) {
+        s->count_mode = TIMER_UP_COUNT;
+    }
+
+    if (s->tim_cr1 & TIM_CR1_CEN) {
+        DB_PRINT("Enabling timer\n");
+        ptimer_set_freq(s->timer, s->freq_hz);
+        ptimer_run(s->timer, !(s->tim_cr1 & 0x04));
+    } else {
+        DB_PRINT("Disabling timer\n");
+        ptimer_stop(s->timer);
+    }
+}
+
 
 static void stm32f2xx_timer_reset(DeviceState *dev)
 {
-- 
2.38.5



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH qemu v3 06/20] Fixing the basic functionality of STM32 timers
  2023-12-02 13:40 [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform ~lbryndza
                   ` (4 preceding siblings ...)
  2023-12-02 12:12 ` [PATCH qemu v3 05/20] " ~lbryndza
@ 2023-12-02 12:13 ` ~lbryndza
  2023-12-02 12:15 ` [PATCH qemu v3 07/20] " ~lbryndza
                   ` (14 subsequent siblings)
  20 siblings, 0 replies; 23+ messages in thread
From: ~lbryndza @ 2023-12-02 12:13 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alistair Francis, Peter Maydell

From: Lucjan Bryndza <lbryndza.oss@icloud.com>

The current implementation of timers does not work properly
even in basic functionality. A counter configured to report
an interrupt every 10ms reports the first interrupts after a
few seconds.  There are also no properly implemented count up an
count down modes. This commit fixes bugs with interrupt
reporting and implements the basic modes of the counter's
time-base block.

Add timer update UIF

Signed-off-by: Lucjan Bryndza <lbryndza.oss@icloud.com>
---
 hw/timer/stm32f2xx_timer.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/hw/timer/stm32f2xx_timer.c b/hw/timer/stm32f2xx_timer.c
index 62c98b5f04..bd3d1bcf24 100644
--- a/hw/timer/stm32f2xx_timer.c
+++ b/hw/timer/stm32f2xx_timer.c
@@ -90,6 +90,12 @@ static void stm32f2xx_timer_update(STM32F2XXTimerState *s)
     }
 }
 
+static void stm32f2xx_timer_update_uif(STM32F2XXTimerState *s, uint8_t value)
+{
+    s->tim_sr &= ~TIM_SR1_UIF;
+    s->tim_sr |= (value & TIM_SR1_UIF);
+    qemu_set_irq(s->irq, value);
+}
 
 static void stm32f2xx_timer_reset(DeviceState *dev)
 {
-- 
2.38.5



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH qemu v3 07/20] Fixing the basic functionality of STM32 timers
  2023-12-02 13:40 [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform ~lbryndza
                   ` (5 preceding siblings ...)
  2023-12-02 12:13 ` [PATCH qemu v3 06/20] " ~lbryndza
@ 2023-12-02 12:15 ` ~lbryndza
  2023-12-02 12:16 ` [PATCH qemu v3 08/20] " ~lbryndza
                   ` (13 subsequent siblings)
  20 siblings, 0 replies; 23+ messages in thread
From: ~lbryndza @ 2023-12-02 12:15 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alistair Francis, Peter Maydell

From: Lucjan Bryndza <lbryndza.oss@icloud.com>

The current implementation of timers does not work properly
even in basic functionality. A counter configured to report
an interrupt every 10ms reports the first interrupts after a
few seconds.  There are also no properly implemented count up an
count down modes. This commit fixes bugs with interrupt
reporting and implements the basic modes of the counter's
time-base block.

Add timer ticks functions

Signed-off-by: Lucjan Bryndza <lbryndza.oss@icloud.com>
---
 hw/timer/stm32f2xx_timer.c | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/hw/timer/stm32f2xx_timer.c b/hw/timer/stm32f2xx_timer.c
index bd3d1bcf24..cee25252f7 100644
--- a/hw/timer/stm32f2xx_timer.c
+++ b/hw/timer/stm32f2xx_timer.c
@@ -97,6 +97,34 @@ static void stm32f2xx_timer_update_uif(STM32F2XXTimerState *s, uint8_t value)
     qemu_set_irq(s->irq, value);
 }
 
+static void stm32f2xx_timer_tick(void *opaque)
+{
+    STM32F2XXTimerState *s = (STM32F2XXTimerState *)opaque;
+    DB_PRINT("Alarm raised\n");
+    stm32f2xx_timer_update_uif(s, 1);
+
+    if (s->count_mode == TIMER_UP_COUNT) {
+        stm32f2xx_timer_set_count(s, 0);
+    } else {
+        stm32f2xx_timer_set_count(s, s->tim_arr);
+    }
+
+    if (s->tim_cr1 & TIM_CR1_CMS) {
+        if (s->count_mode == TIMER_UP_COUNT) {
+            s->count_mode = TIMER_DOWN_COUNT;
+        } else {
+            s->count_mode = TIMER_UP_COUNT;
+        }
+    }
+
+    if (s->tim_cr1 & TIM_CR1_OPM) {
+        s->tim_cr1 &= ~TIM_CR1_CEN;
+    } else {
+        stm32f2xx_timer_update(s);
+    }
+}
+
+
 static void stm32f2xx_timer_reset(DeviceState *dev)
 {
     STM32F2XXTimerState *s = STM32F2XXTIMER(dev);
-- 
2.38.5



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH qemu v3 08/20] Fixing the basic functionality of STM32 timers
  2023-12-02 13:40 [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform ~lbryndza
                   ` (6 preceding siblings ...)
  2023-12-02 12:15 ` [PATCH qemu v3 07/20] " ~lbryndza
@ 2023-12-02 12:16 ` ~lbryndza
  2023-12-02 12:18 ` [PATCH qemu v3 09/20] " ~lbryndza
                   ` (12 subsequent siblings)
  20 siblings, 0 replies; 23+ messages in thread
From: ~lbryndza @ 2023-12-02 12:16 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alistair Francis, Peter Maydell

From: Lucjan Bryndza <lbryndza.oss@icloud.com>

The current implementation of timers does not work properly
even in basic functionality. A counter configured to report
an interrupt every 10ms reports the first interrupts after a
few seconds.  There are also no properly implemented count up an
count down modes. This commit fixes bugs with interrupt
reporting and implements the basic modes of the counter's
time-base block.

Update time reset functions

Signed-off-by: Lucjan Bryndza <lbryndza.oss@icloud.com>
---
 hw/timer/stm32f2xx_timer.c | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/hw/timer/stm32f2xx_timer.c b/hw/timer/stm32f2xx_timer.c
index cee25252f7..20ca762601 100644
--- a/hw/timer/stm32f2xx_timer.c
+++ b/hw/timer/stm32f2xx_timer.c
@@ -128,8 +128,6 @@ static void stm32f2xx_timer_tick(void *opaque)
 static void stm32f2xx_timer_reset(DeviceState *dev)
 {
     STM32F2XXTimerState *s = STM32F2XXTIMER(dev);
-    int64_t now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
-
     s->tim_cr1 = 0;
     s->tim_cr2 = 0;
     s->tim_smcr = 0;
@@ -148,8 +146,6 @@ static void stm32f2xx_timer_reset(DeviceState *dev)
     s->tim_dcr = 0;
     s->tim_dmar = 0;
     s->tim_or = 0;
-
-    s->tick_offset = stm32f2xx_ns_to_ticks(s, now);
 }
 
 static uint64_t stm32f2xx_timer_read(void *opaque, hwaddr offset,
-- 
2.38.5



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH qemu v3 09/20] Fixing the basic functionality of STM32 timers
  2023-12-02 13:40 [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform ~lbryndza
                   ` (7 preceding siblings ...)
  2023-12-02 12:16 ` [PATCH qemu v3 08/20] " ~lbryndza
@ 2023-12-02 12:18 ` ~lbryndza
  2023-12-02 12:18 ` [PATCH qemu v3 10/20] " ~lbryndza
                   ` (11 subsequent siblings)
  20 siblings, 0 replies; 23+ messages in thread
From: ~lbryndza @ 2023-12-02 12:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alistair Francis, Peter Maydell

From: Lucjan Bryndza <lbryndza.oss@icloud.com>

The current implementation of timers does not work properly
even in basic functionality. A counter configured to report
an interrupt every 10ms reports the first interrupts after a
few seconds.  There are also no properly implemented count up an
count down modes. This commit fixes bugs with interrupt
reporting and implements the basic modes of the counter's
time-base block.

Timer read function modified

Signed-off-by: Lucjan Bryndza <lbryndza.oss@icloud.com>
---
 hw/timer/stm32f2xx_timer.c | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/hw/timer/stm32f2xx_timer.c b/hw/timer/stm32f2xx_timer.c
index 20ca762601..07d82b841a 100644
--- a/hw/timer/stm32f2xx_timer.c
+++ b/hw/timer/stm32f2xx_timer.c
@@ -159,15 +159,18 @@ static uint64_t stm32f2xx_timer_read(void *opaque, hwaddr offset,
     case TIM_CR1:
         return s->tim_cr1;
     case TIM_CR2:
-        return s->tim_cr2;
+        qemu_log_mask(LOG_GUEST_ERROR, "stm32_timer: CR2 not supported");
+        return 0;
     case TIM_SMCR:
-        return s->tim_smcr;
+        qemu_log_mask(LOG_GUEST_ERROR, "stm32_timer: SMCR not supported");
+        return 0;
     case TIM_DIER:
         return s->tim_dier;
     case TIM_SR:
         return s->tim_sr;
     case TIM_EGR:
-        return s->tim_egr;
+        qemu_log_mask(LOG_GUEST_ERROR, "stm32_timer: EGR write only");
+        return 0;
     case TIM_CCMR1:
         return s->tim_ccmr1;
     case TIM_CCMR2:
@@ -175,8 +178,7 @@ static uint64_t stm32f2xx_timer_read(void *opaque, hwaddr offset,
     case TIM_CCER:
         return s->tim_ccer;
     case TIM_CNT:
-        return stm32f2xx_ns_to_ticks(s, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)) -
-               s->tick_offset;
+        return stm32f2xx_timer_get_count(s);
     case TIM_PSC:
         return s->tim_psc;
     case TIM_ARR:
@@ -190,16 +192,17 @@ static uint64_t stm32f2xx_timer_read(void *opaque, hwaddr offset,
     case TIM_CCR4:
         return s->tim_ccr4;
     case TIM_DCR:
-        return s->tim_dcr;
+        qemu_log_mask(LOG_GUEST_ERROR, "stm32_timer: DCR not supported");
+        return 0;
     case TIM_DMAR:
-        return s->tim_dmar;
+        qemu_log_mask(LOG_GUEST_ERROR, "stm32_timer: CR2 not supported");
+        return 0;
     case TIM_OR:
         return s->tim_or;
     default:
         qemu_log_mask(LOG_GUEST_ERROR,
                       "%s: Bad offset 0x%"HWADDR_PRIx"\n", __func__, offset);
     }
-
     return 0;
 }
 
-- 
2.38.5



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH qemu v3 10/20] Fixing the basic functionality of STM32 timers
  2023-12-02 13:40 [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform ~lbryndza
                   ` (8 preceding siblings ...)
  2023-12-02 12:18 ` [PATCH qemu v3 09/20] " ~lbryndza
@ 2023-12-02 12:18 ` ~lbryndza
  2023-12-02 12:19 ` [PATCH qemu v3 11/20] " ~lbryndza
                   ` (10 subsequent siblings)
  20 siblings, 0 replies; 23+ messages in thread
From: ~lbryndza @ 2023-12-02 12:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alistair Francis, Peter Maydell

From: Lucjan Bryndza <lbryndza.oss@icloud.com>

The current implementation of timers does not work properly
even in basic functionality. A counter configured to report
an interrupt every 10ms reports the first interrupts after a
few seconds.  There are also no properly implemented count up an
count down modes. This commit fixes bugs with interrupt
reporting and implements the basic modes of the counter's
time-base block.

Add read CR1 function

Signed-off-by: Lucjan Bryndza <lbryndza.oss@icloud.com>
---
 hw/timer/stm32f2xx_timer.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/hw/timer/stm32f2xx_timer.c b/hw/timer/stm32f2xx_timer.c
index 07d82b841a..1b3fa5da2c 100644
--- a/hw/timer/stm32f2xx_timer.c
+++ b/hw/timer/stm32f2xx_timer.c
@@ -206,6 +206,14 @@ static uint64_t stm32f2xx_timer_read(void *opaque, hwaddr offset,
     return 0;
 }
 
+static void stm32f2xx_update_cr1(STM32F2XXTimerState *s, uint64_t value)
+{
+    s->tim_cr1 = value & 0x3FF;
+    ptimer_transaction_begin(s->timer);
+    stm32f2xx_timer_update(s);
+    ptimer_transaction_commit(s->timer);
+    DB_PRINT("write cr1 = %x\n", s->tim_cr1);
+}
 static void stm32f2xx_timer_write(void *opaque, hwaddr offset,
                         uint64_t val64, unsigned size)
 {
-- 
2.38.5



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH qemu v3 11/20] Fixing the basic functionality of STM32 timers
  2023-12-02 13:40 [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform ~lbryndza
                   ` (9 preceding siblings ...)
  2023-12-02 12:18 ` [PATCH qemu v3 10/20] " ~lbryndza
@ 2023-12-02 12:19 ` ~lbryndza
  2023-12-02 12:19 ` [PATCH qemu v3 12/20] " ~lbryndza
                   ` (9 subsequent siblings)
  20 siblings, 0 replies; 23+ messages in thread
From: ~lbryndza @ 2023-12-02 12:19 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alistair Francis, Peter Maydell

From: Lucjan Bryndza <lbryndza.oss@icloud.com>

The current implementation of timers does not work properly
even in basic functionality. A counter configured to report
an interrupt every 10ms reports the first interrupts after a
few seconds.  There are also no properly implemented count up an
count down modes. This commit fixes bugs with interrupt
reporting and implements the basic modes of the counter's
time-base block.

Add update CR function

Signed-off-by: Lucjan Bryndza <lbryndza.oss@icloud.com>
---
 hw/timer/stm32f2xx_timer.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/hw/timer/stm32f2xx_timer.c b/hw/timer/stm32f2xx_timer.c
index 1b3fa5da2c..96cf189933 100644
--- a/hw/timer/stm32f2xx_timer.c
+++ b/hw/timer/stm32f2xx_timer.c
@@ -214,6 +214,16 @@ static void stm32f2xx_update_cr1(STM32F2XXTimerState *s, uint64_t value)
     ptimer_transaction_commit(s->timer);
     DB_PRINT("write cr1 = %x\n", s->tim_cr1);
 }
+
+static void stm32f2xx_update_sr(STM32F2XXTimerState *s, uint64_t value)
+{
+    s->tim_sr ^= (value ^ 0xFFFF);
+    s->tim_sr &= 0x1eFF;
+    ptimer_transaction_begin(s->timer);
+    stm32f2xx_timer_update_uif(s, s->tim_sr & 0x1);
+    ptimer_transaction_commit(s->timer);
+    DB_PRINT("write sr = %x\n", s->tim_sr);
+}
 static void stm32f2xx_timer_write(void *opaque, hwaddr offset,
                         uint64_t val64, unsigned size)
 {
-- 
2.38.5



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH qemu v3 12/20] Fixing the basic functionality of STM32 timers
  2023-12-02 13:40 [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform ~lbryndza
                   ` (10 preceding siblings ...)
  2023-12-02 12:19 ` [PATCH qemu v3 11/20] " ~lbryndza
@ 2023-12-02 12:19 ` ~lbryndza
  2023-12-02 12:20 ` [PATCH qemu v3 13/20] " ~lbryndza
                   ` (8 subsequent siblings)
  20 siblings, 0 replies; 23+ messages in thread
From: ~lbryndza @ 2023-12-02 12:19 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alistair Francis, Peter Maydell

From: Lucjan Bryndza <lbryndza.oss@icloud.com>

The current implementation of timers does not work properly
even in basic functionality. A counter configured to report
an interrupt every 10ms reports the first interrupts after a
few seconds.  There are also no properly implemented count up an
count down modes. This commit fixes bugs with interrupt
reporting and implements the basic modes of the counter's
time-base block.

Add update PSC function

Signed-off-by: Lucjan Bryndza <lbryndza.oss@icloud.com>
---
 hw/timer/stm32f2xx_timer.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/hw/timer/stm32f2xx_timer.c b/hw/timer/stm32f2xx_timer.c
index 96cf189933..3997521610 100644
--- a/hw/timer/stm32f2xx_timer.c
+++ b/hw/timer/stm32f2xx_timer.c
@@ -224,6 +224,15 @@ static void stm32f2xx_update_sr(STM32F2XXTimerState *s, uint64_t value)
     ptimer_transaction_commit(s->timer);
     DB_PRINT("write sr = %x\n", s->tim_sr);
 }
+
+static void stm32f2xx_update_psc(STM32F2XXTimerState *s, uint64_t value)
+{
+    s->tim_psc = value & 0xffff;
+    ptimer_transaction_begin(s->timer);
+    ptimer_set_freq(s->timer, s->freq_hz);
+    ptimer_transaction_commit(s->timer);
+    DB_PRINT("write psc = %x\n", s->tim_psc);
+}
 static void stm32f2xx_timer_write(void *opaque, hwaddr offset,
                         uint64_t val64, unsigned size)
 {
-- 
2.38.5



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH qemu v3 13/20] Fixing the basic functionality of STM32 timers
  2023-12-02 13:40 [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform ~lbryndza
                   ` (11 preceding siblings ...)
  2023-12-02 12:19 ` [PATCH qemu v3 12/20] " ~lbryndza
@ 2023-12-02 12:20 ` ~lbryndza
  2023-12-02 12:21 ` [PATCH qemu v3 14/20] " ~lbryndza
                   ` (7 subsequent siblings)
  20 siblings, 0 replies; 23+ messages in thread
From: ~lbryndza @ 2023-12-02 12:20 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alistair Francis, Peter Maydell

From: Lucjan Bryndza <lbryndza.oss@icloud.com>

The current implementation of timers does not work properly
even in basic functionality. A counter configured to report
an interrupt every 10ms reports the first interrupts after a
few seconds.  There are also no properly implemented count up an
count down modes. This commit fixes bugs with interrupt
reporting and implements the basic modes of the counter's
time-base block.

Add update egr function

Signed-off-by: Lucjan Bryndza <lbryndza.oss@icloud.com>
---
 hw/timer/stm32f2xx_timer.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/hw/timer/stm32f2xx_timer.c b/hw/timer/stm32f2xx_timer.c
index 3997521610..010b5b41bd 100644
--- a/hw/timer/stm32f2xx_timer.c
+++ b/hw/timer/stm32f2xx_timer.c
@@ -233,6 +233,21 @@ static void stm32f2xx_update_psc(STM32F2XXTimerState *s, uint64_t value)
     ptimer_transaction_commit(s->timer);
     DB_PRINT("write psc = %x\n", s->tim_psc);
 }
+
+static void stm32f2xx_update_egr(STM32F2XXTimerState *s, uint64_t value)
+{
+    s->tim_egr = value & 0x1E;
+    if (value & TIM_EGR_TG) {
+        s->tim_sr |= TIM_EGR_TG;
+    }
+    if (value & TIM_EGR_UG) {
+        /* UG bit - reload */
+        ptimer_transaction_begin(s->timer);
+        ptimer_set_limit(s->timer, s->tim_arr, 1);
+        ptimer_transaction_commit(s->timer);
+    }
+    DB_PRINT("write EGR = %x\n", s->tim_egr);
+}
 static void stm32f2xx_timer_write(void *opaque, hwaddr offset,
                         uint64_t val64, unsigned size)
 {
-- 
2.38.5



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH qemu v3 14/20] Fixing the basic functionality of STM32 timers
  2023-12-02 13:40 [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform ~lbryndza
                   ` (12 preceding siblings ...)
  2023-12-02 12:20 ` [PATCH qemu v3 13/20] " ~lbryndza
@ 2023-12-02 12:21 ` ~lbryndza
  2023-12-02 12:21 ` [PATCH qemu v3 15/20] " ~lbryndza
                   ` (6 subsequent siblings)
  20 siblings, 0 replies; 23+ messages in thread
From: ~lbryndza @ 2023-12-02 12:21 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alistair Francis, Peter Maydell

From: Lucjan Bryndza <lbryndza.oss@icloud.com>

The current implementation of timers does not work properly
even in basic functionality. A counter configured to report
an interrupt every 10ms reports the first interrupts after a
few seconds.  There are also no properly implemented count up an
count down modes. This commit fixes bugs with interrupt
reporting and implements the basic modes of the counter's
time-base block.

Add update cnt function

Signed-off-by: Lucjan Bryndza <lbryndza.oss@icloud.com>
---
 hw/timer/stm32f2xx_timer.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/hw/timer/stm32f2xx_timer.c b/hw/timer/stm32f2xx_timer.c
index 010b5b41bd..0678e718a1 100644
--- a/hw/timer/stm32f2xx_timer.c
+++ b/hw/timer/stm32f2xx_timer.c
@@ -248,6 +248,14 @@ static void stm32f2xx_update_egr(STM32F2XXTimerState *s, uint64_t value)
     }
     DB_PRINT("write EGR = %x\n", s->tim_egr);
 }
+
+static void stm32f2xx_update_cnt(STM32F2XXTimerState *s, uint64_t value)
+{
+    ptimer_transaction_begin(s->timer);
+    stm32f2xx_timer_set_count(s, value & 0xffff);
+    ptimer_transaction_commit(s->timer);
+    DB_PRINT("write cnt = %x\n", stm32f2xx_timer_get_count(s));
+}
 static void stm32f2xx_timer_write(void *opaque, hwaddr offset,
                         uint64_t val64, unsigned size)
 {
-- 
2.38.5



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH qemu v3 15/20] Fixing the basic functionality of STM32 timers
  2023-12-02 13:40 [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform ~lbryndza
                   ` (13 preceding siblings ...)
  2023-12-02 12:21 ` [PATCH qemu v3 14/20] " ~lbryndza
@ 2023-12-02 12:21 ` ~lbryndza
  2023-12-02 12:22 ` [PATCH qemu v3 16/20] " ~lbryndza
                   ` (5 subsequent siblings)
  20 siblings, 0 replies; 23+ messages in thread
From: ~lbryndza @ 2023-12-02 12:21 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alistair Francis, Peter Maydell

From: Lucjan Bryndza <lbryndza.oss@icloud.com>

The current implementation of timers does not work properly
even in basic functionality. A counter configured to report
an interrupt every 10ms reports the first interrupts after a
few seconds.  There are also no properly implemented count up an
count down modes. This commit fixes bugs with interrupt
reporting and implements the basic modes of the counter's
time-base block.

Add update ARR function

Signed-off-by: Lucjan Bryndza <lbryndza.oss@icloud.com>
---
 hw/timer/stm32f2xx_timer.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/hw/timer/stm32f2xx_timer.c b/hw/timer/stm32f2xx_timer.c
index 0678e718a1..800172a3ff 100644
--- a/hw/timer/stm32f2xx_timer.c
+++ b/hw/timer/stm32f2xx_timer.c
@@ -256,6 +256,15 @@ static void stm32f2xx_update_cnt(STM32F2XXTimerState *s, uint64_t value)
     ptimer_transaction_commit(s->timer);
     DB_PRINT("write cnt = %x\n", stm32f2xx_timer_get_count(s));
 }
+
+static void stm32f2xx_update_arr(STM32F2XXTimerState *s, uint64_t value)
+{
+    s->tim_arr = value & 0xffff;
+    ptimer_transaction_begin(s->timer);
+    ptimer_set_limit(s->timer, s->tim_arr, 1);
+    ptimer_transaction_commit(s->timer);
+    DB_PRINT("write arr = %x\n", s->tim_arr);
+}
 static void stm32f2xx_timer_write(void *opaque, hwaddr offset,
                         uint64_t val64, unsigned size)
 {
-- 
2.38.5



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH qemu v3 16/20] Fixing the basic functionality of STM32 timers
  2023-12-02 13:40 [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform ~lbryndza
                   ` (14 preceding siblings ...)
  2023-12-02 12:21 ` [PATCH qemu v3 15/20] " ~lbryndza
@ 2023-12-02 12:22 ` ~lbryndza
  2023-12-02 12:23 ` [PATCH qemu v3 17/20] " ~lbryndza
                   ` (4 subsequent siblings)
  20 siblings, 0 replies; 23+ messages in thread
From: ~lbryndza @ 2023-12-02 12:22 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alistair Francis, Peter Maydell

From: Lucjan Bryndza <lbryndza.oss@icloud.com>

The current implementation of timers does not work properly
even in basic functionality. A counter configured to report
an interrupt every 10ms reports the first interrupts after a
few seconds.  There are also no properly implemented count up an
count down modes. This commit fixes bugs with interrupt
reporting and implements the basic modes of the counter's
time-base block.

Update timer write function

Signed-off-by: Lucjan Bryndza <lbryndza.oss@icloud.com>
---
 hw/timer/stm32f2xx_timer.c | 67 +++++++++++++++-----------------------
 1 file changed, 27 insertions(+), 40 deletions(-)

diff --git a/hw/timer/stm32f2xx_timer.c b/hw/timer/stm32f2xx_timer.c
index 800172a3ff..bb10a276da 100644
--- a/hw/timer/stm32f2xx_timer.c
+++ b/hw/timer/stm32f2xx_timer.c
@@ -265,92 +265,79 @@ static void stm32f2xx_update_arr(STM32F2XXTimerState *s, uint64_t value)
     ptimer_transaction_commit(s->timer);
     DB_PRINT("write arr = %x\n", s->tim_arr);
 }
+
 static void stm32f2xx_timer_write(void *opaque, hwaddr offset,
-                        uint64_t val64, unsigned size)
+                        uint64_t value, unsigned size)
 {
     STM32F2XXTimerState *s = opaque;
-    uint32_t value = val64;
-    int64_t now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
-    uint32_t timer_val = 0;
-
-    DB_PRINT("Write 0x%x, 0x%"HWADDR_PRIx"\n", value, offset);
 
     switch (offset) {
     case TIM_CR1:
-        s->tim_cr1 = value;
+        stm32f2xx_update_cr1(s, value);
         return;
     case TIM_CR2:
-        s->tim_cr2 = value;
+        qemu_log_mask(LOG_GUEST_ERROR, "stm32_timer: CR2 not supported");
         return;
     case TIM_SMCR:
-        s->tim_smcr = value;
+        qemu_log_mask(LOG_GUEST_ERROR, "stm32_timer: SCMR not supported");
         return;
     case TIM_DIER:
-        s->tim_dier = value;
+        s->tim_dier = value & 0x5F5F;
+        DB_PRINT("write dier = %x\n", s->tim_dier);
         return;
     case TIM_SR:
-        /* This is set by hardware and cleared by software */
-        s->tim_sr &= value;
+        stm32f2xx_update_sr(s, value);
         return;
     case TIM_EGR:
-        s->tim_egr = value;
-        if (s->tim_egr & TIM_EGR_UG) {
-            timer_val = 0;
-            break;
-        }
+        stm32f2xx_update_egr(s, value);
         return;
     case TIM_CCMR1:
-        s->tim_ccmr1 = value;
+        s->tim_ccmr1 = value & 0xffff;
+        DB_PRINT("write ccmr1 = %x\n", s->tim_ccmr1);
         return;
     case TIM_CCMR2:
-        s->tim_ccmr2 = value;
+        s->tim_ccmr2 = value & 0xffff;
+        DB_PRINT("write ccmr2 = %x\n", s->tim_ccmr2);
         return;
     case TIM_CCER:
-        s->tim_ccer = value;
+        s->tim_ccer = value & 0x3333;
+        DB_PRINT("write ccer = %x\n", s->tim_ccer);
         return;
     case TIM_PSC:
-        timer_val = stm32f2xx_ns_to_ticks(s, now) - s->tick_offset;
-        s->tim_psc = value & 0xFFFF;
-        break;
+        stm32f2xx_update_psc(s, value);
+        return;
     case TIM_CNT:
-        timer_val = value;
-        break;
+        stm32f2xx_update_cnt(s, value);
+        return;
     case TIM_ARR:
-        s->tim_arr = value;
-        stm32f2xx_timer_set_alarm(s, now);
+        stm32f2xx_update_arr(s, value);
         return;
     case TIM_CCR1:
-        s->tim_ccr1 = value;
+        s->tim_ccr1 = value & 0xffff;
         return;
     case TIM_CCR2:
-        s->tim_ccr2 = value;
+        s->tim_ccr2 = value & 0xffff;
         return;
     case TIM_CCR3:
-        s->tim_ccr3 = value;
+        s->tim_ccr3 = value & 0xffff;
         return;
     case TIM_CCR4:
-        s->tim_ccr4 = value;
+        s->tim_ccr4 = value & 0xffff;
         return;
     case TIM_DCR:
-        s->tim_dcr = value;
+        qemu_log_mask(LOG_GUEST_ERROR, "stm32_timer: DCR not supported");
         return;
     case TIM_DMAR:
-        s->tim_dmar = value;
+        qemu_log_mask(LOG_GUEST_ERROR, "stm32_timer: DMAR not supported");
         return;
     case TIM_OR:
-        s->tim_or = value;
+        qemu_log_mask(LOG_GUEST_ERROR, "stm32_timer: OR not supported");
         return;
     default:
         qemu_log_mask(LOG_GUEST_ERROR,
                       "%s: Bad offset 0x%"HWADDR_PRIx"\n", __func__, offset);
         return;
     }
-
-    /* This means that a register write has affected the timer in a way that
-     * requires a refresh of both tick_offset and the alarm.
-     */
-    s->tick_offset = stm32f2xx_ns_to_ticks(s, now) - timer_val;
-    stm32f2xx_timer_set_alarm(s, now);
 }
 
 static const MemoryRegionOps stm32f2xx_timer_ops = {
-- 
2.38.5



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH qemu v3 17/20] Fixing the basic functionality of STM32 timers
  2023-12-02 13:40 [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform ~lbryndza
                   ` (15 preceding siblings ...)
  2023-12-02 12:22 ` [PATCH qemu v3 16/20] " ~lbryndza
@ 2023-12-02 12:23 ` ~lbryndza
  2023-12-02 12:24 ` [PATCH qemu v3 18/20] " ~lbryndza
                   ` (3 subsequent siblings)
  20 siblings, 0 replies; 23+ messages in thread
From: ~lbryndza @ 2023-12-02 12:23 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alistair Francis, Peter Maydell

From: Lucjan Bryndza <lbryndza.oss@icloud.com>

The current implementation of timers does not work properly
even in basic functionality. A counter configured to report
an interrupt every 10ms reports the first interrupts after a
few seconds.  There are also no properly implemented count up an
count down modes. This commit fixes bugs with interrupt
reporting and implements the basic modes of the counter's
time-base block.

Update configuration structures

Signed-off-by: Lucjan Bryndza <lbryndza.oss@icloud.com>
---
 hw/timer/stm32f2xx_timer.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/hw/timer/stm32f2xx_timer.c b/hw/timer/stm32f2xx_timer.c
index bb10a276da..c237b3053c 100644
--- a/hw/timer/stm32f2xx_timer.c
+++ b/hw/timer/stm32f2xx_timer.c
@@ -348,10 +348,10 @@ static const MemoryRegionOps stm32f2xx_timer_ops = {
 
 static const VMStateDescription vmstate_stm32f2xx_timer = {
     .name = TYPE_STM32F2XX_TIMER,
-    .version_id = 1,
-    .minimum_version_id = 1,
+    .version_id = 2,
+    .minimum_version_id = 2,
     .fields = (VMStateField[]) {
-        VMSTATE_INT64(tick_offset, STM32F2XXTimerState),
+        VMSTATE_INT32(count_mode, STM32F2XXTimerState),
         VMSTATE_UINT32(tim_cr1, STM32F2XXTimerState),
         VMSTATE_UINT32(tim_cr2, STM32F2XXTimerState),
         VMSTATE_UINT32(tim_smcr, STM32F2XXTimerState),
@@ -376,7 +376,7 @@ static const VMStateDescription vmstate_stm32f2xx_timer = {
 
 static Property stm32f2xx_timer_properties[] = {
     DEFINE_PROP_UINT64("clock-frequency", struct STM32F2XXTimerState,
-                       freq_hz, 1000000000),
+                       freq_hz, 0),
     DEFINE_PROP_END_OF_LIST(),
 };
 
-- 
2.38.5



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH qemu v3 18/20] Fixing the basic functionality of STM32 timers
  2023-12-02 13:40 [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform ~lbryndza
                   ` (16 preceding siblings ...)
  2023-12-02 12:23 ` [PATCH qemu v3 17/20] " ~lbryndza
@ 2023-12-02 12:24 ` ~lbryndza
  2023-12-02 12:26 ` [PATCH qemu v3 19/20] " ~lbryndza
                   ` (2 subsequent siblings)
  20 siblings, 0 replies; 23+ messages in thread
From: ~lbryndza @ 2023-12-02 12:24 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alistair Francis, Peter Maydell

From: Lucjan Bryndza <lbryndza.oss@icloud.com>

The current implementation of timers does not work properly
even in basic functionality. A counter configured to report
an interrupt every 10ms reports the first interrupts after a
few seconds.  There are also no properly implemented count up an
count down modes. This commit fixes bugs with interrupt
reporting and implements the basic modes of the counter's
time-base block.

Update timer realize

Signed-off-by: Lucjan Bryndza <lbryndza.oss@icloud.com>
---
 hw/timer/stm32f2xx_timer.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/hw/timer/stm32f2xx_timer.c b/hw/timer/stm32f2xx_timer.c
index c237b3053c..9a992231fa 100644
--- a/hw/timer/stm32f2xx_timer.c
+++ b/hw/timer/stm32f2xx_timer.c
@@ -394,7 +394,11 @@ static void stm32f2xx_timer_init(Object *obj)
 static void stm32f2xx_timer_realize(DeviceState *dev, Error **errp)
 {
     STM32F2XXTimerState *s = STM32F2XXTIMER(dev);
-    s->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, stm32f2xx_timer_interrupt, s);
+    if (s->freq_hz == 0) {
+        error_setg(errp, "stm32f2xx_timer: Timer clock not defined");
+        return;
+    }
+    s->timer = ptimer_init(stm32f2xx_timer_tick, s, PTIMER_POLICY_LEGACY);
 }
 
 static void stm32f2xx_timer_class_init(ObjectClass *klass, void *data)
-- 
2.38.5



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH qemu v3 19/20] Fixing the basic functionality of STM32 timers
  2023-12-02 13:40 [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform ~lbryndza
                   ` (17 preceding siblings ...)
  2023-12-02 12:24 ` [PATCH qemu v3 18/20] " ~lbryndza
@ 2023-12-02 12:26 ` ~lbryndza
  2023-12-02 12:28 ` [PATCH qemu v3 20/20] " ~lbryndza
  2023-12-06  1:04 ` [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform Alistair Francis
  20 siblings, 0 replies; 23+ messages in thread
From: ~lbryndza @ 2023-12-02 12:26 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alistair Francis, Peter Maydell

From: Lucjan Bryndza <lbryndza.oss@icloud.com>

The current implementation of timers does not work properly
even in basic functionality. A counter configured to report
an interrupt every 10ms reports the first interrupts after a
few seconds.  There are also no properly implemented count up an
count down modes. This commit fixes bugs with interrupt
reporting and implements the basic modes of the counter's
time-base block.

Update timer structures

Signed-off-by: Lucjan Bryndza <lbryndza.oss@icloud.com>
---
 include/hw/timer/stm32f2xx_timer.h | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/include/hw/timer/stm32f2xx_timer.h b/include/hw/timer/stm32f2xx_timer.h
index 8112878aa7..c83f7b0d6f 100644
--- a/include/hw/timer/stm32f2xx_timer.h
+++ b/include/hw/timer/stm32f2xx_timer.h
@@ -28,6 +28,7 @@
 #include "hw/sysbus.h"
 #include "qemu/timer.h"
 #include "qom/object.h"
+#include "hw/ptimer.h"
 
 #define TIM_CR1      0x00
 #define TIM_CR2      0x04
@@ -79,12 +80,10 @@ struct STM32F2XXTimerState {
 
     /* <public> */
     MemoryRegion iomem;
-    QEMUTimer *timer;
+    ptimer_state *timer;
     qemu_irq irq;
-
-    int64_t tick_offset;
-    uint64_t hit_time;
     uint64_t freq_hz;
+    int count_mode;
 
     uint32_t tim_cr1;
     uint32_t tim_cr2;
-- 
2.38.5



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH qemu v3 20/20] Fixing the basic functionality of STM32 timers
  2023-12-02 13:40 [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform ~lbryndza
                   ` (18 preceding siblings ...)
  2023-12-02 12:26 ` [PATCH qemu v3 19/20] " ~lbryndza
@ 2023-12-02 12:28 ` ~lbryndza
  2023-12-06  1:04 ` [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform Alistair Francis
  20 siblings, 0 replies; 23+ messages in thread
From: ~lbryndza @ 2023-12-02 12:28 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alistair Francis, Peter Maydell

From: Lucjan Bryndza <lbryndza.oss@icloud.com>

The current implementation of timers does not work properly
even in basic functionality. A counter configured to report
an interrupt every 10ms reports the first interrupts after a
few seconds.  There are also no properly implemented count up an
count down modes. This commit fixes bugs with interrupt
reporting and implements the basic modes of the counter's
time-base block.

Improve clock configuration

Signed-off-by: Lucjan Bryndza <lbryndza.oss@icloud.com>
---
 hw/arm/stm32f405_soc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/arm/stm32f405_soc.c b/hw/arm/stm32f405_soc.c
index a65bbe298d..17d6b2ec4a 100644
--- a/hw/arm/stm32f405_soc.c
+++ b/hw/arm/stm32f405_soc.c
@@ -183,7 +183,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
     /* Timer 2 to 5 */
     for (i = 0; i < STM_NUM_TIMERS; i++) {
         dev = DEVICE(&(s->timer[i]));
-        qdev_prop_set_uint64(dev, "clock-frequency", 1000000000);
+        qdev_prop_set_uint64(dev, "clock-frequency", 48000000);
         if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), errp)) {
             return;
         }
-- 
2.38.5


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform
@ 2023-12-02 13:40 ~lbryndza
  2023-12-02 11:55 ` [PATCH qemu v3 01/20] Fixing the basic functionality of STM32 timers ~lbryndza
                   ` (20 more replies)
  0 siblings, 21 replies; 23+ messages in thread
From: ~lbryndza @ 2023-12-02 13:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alistair Francis, Peter Maydell

Current implementation of T2 - T5 times on the STM32 platform does not
work properly.
After configuring the timer-counter circuit to report interrupts every
10ms, in reality the first interrupt is reported
only once after a few seconds, while subsequent interrupts do not come.
The current code also does not properly emulate the operation of even
the basic functions of the TIME-BASE unit.
This patch contains fixes that reimplements the basic functionality
of the time base unit such as up-counting down-counting , and alternate-
mode up-down counting.
The ptimer() API is used to emulate timers.
After applying the patch, STM32 timer works correctly in its basic
functionality.
The ISIX-RTOS test unit was used to test the patch.
Links and instructions can be found below:

https://github.com/lucckb/isixrtos/blob/master/tests/libisix/01_basic_primitives.cpp
https://github.com/lucckb/isixrtos/blob/master/extras/doc/unit_test_qemu.md


qemu-system-arm -M olimex-stm32-h405  -kernel
build/tests/libisix/isixunittests.binary -nographic
unittests_entry.cpp:146|ISIX VERSION pub/ep0319-157-gb239b35f-dirty
unittests_entry.cpp:83|Exceptions pretest. OK
51 selected tests
[   RUN    ] 01_base_00 TimeBase timer vs systick
[  1001ms  ] ...
[   RUN    ] 01_base_01 Basic heap allocator
[   1ms    ] ...

Lucjan Bryndza (20):
  Fixing the basic functionality of STM32 timers
  Fixing the basic functionality of STM32 timers
  Fixing the basic functionality of STM32 timers
  Fixing the basic functionality of STM32 timers
  Fixing the basic functionality of STM32 timers
  Fixing the basic functionality of STM32 timers
  Fixing the basic functionality of STM32 timers
  Fixing the basic functionality of STM32 timers
  Fixing the basic functionality of STM32 timers
  Fixing the basic functionality of STM32 timers
  Fixing the basic functionality of STM32 timers
  Fixing the basic functionality of STM32 timers
  Fixing the basic functionality of STM32 timers
  Fixing the basic functionality of STM32 timers
  Fixing the basic functionality of STM32 timers
  Fixing the basic functionality of STM32 timers
  Fixing the basic functionality of STM32 timers
  Fixing the basic functionality of STM32 timers
  Fixing the basic functionality of STM32 timers
  Fixing the basic functionality of STM32 timers

 hw/arm/stm32f405_soc.c             |   2 +-
 hw/timer/stm32f2xx_timer.c         | 262 +++++++++++++++++++----------
 include/hw/timer/stm32f2xx_timer.h |  23 ++-
 3 files changed, 189 insertions(+), 98 deletions(-)

-- 
2.38.5


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform
  2023-12-02 13:40 [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform ~lbryndza
                   ` (19 preceding siblings ...)
  2023-12-02 12:28 ` [PATCH qemu v3 20/20] " ~lbryndza
@ 2023-12-06  1:04 ` Alistair Francis
  20 siblings, 0 replies; 23+ messages in thread
From: Alistair Francis @ 2023-12-06  1:04 UTC (permalink / raw)
  To: ~lbryndza; +Cc: qemu-devel, Peter Maydell

On Sat, Dec 2, 2023 at 11:40 PM ~lbryndza <lbryndza@git.sr.ht> wrote:
>
> Current implementation of T2 - T5 times on the STM32 platform does not
> work properly.
> After configuring the timer-counter circuit to report interrupts every
> 10ms, in reality the first interrupt is reported
> only once after a few seconds, while subsequent interrupts do not come.
> The current code also does not properly emulate the operation of even
> the basic functions of the TIME-BASE unit.
> This patch contains fixes that reimplements the basic functionality
> of the time base unit such as up-counting down-counting , and alternate-
> mode up-down counting.
> The ptimer() API is used to emulate timers.
> After applying the patch, STM32 timer works correctly in its basic
> functionality.
> The ISIX-RTOS test unit was used to test the patch.
> Links and instructions can be found below:
>
> https://github.com/lucckb/isixrtos/blob/master/tests/libisix/01_basic_primitives.cpp
> https://github.com/lucckb/isixrtos/blob/master/extras/doc/unit_test_qemu.md
>
>
> qemu-system-arm -M olimex-stm32-h405  -kernel
> build/tests/libisix/isixunittests.binary -nographic
> unittests_entry.cpp:146|ISIX VERSION pub/ep0319-157-gb239b35f-dirty
> unittests_entry.cpp:83|Exceptions pretest. OK
> 51 selected tests
> [   RUN    ] 01_base_00 TimeBase timer vs systick
> [  1001ms  ] ...
> [   RUN    ] 01_base_01 Basic heap allocator
> [   1ms    ] ...

Great! This is a good step in the right direction.

Each patch needs to have a different title though. The idea is that
each patch describes what that patch is doing. So each commit will
have a title and commit message describing that patch. The cover
letter (this email) will then describe the overarching goal.

Alistair

>
> Lucjan Bryndza (20):
>   Fixing the basic functionality of STM32 timers
>   Fixing the basic functionality of STM32 timers
>   Fixing the basic functionality of STM32 timers
>   Fixing the basic functionality of STM32 timers
>   Fixing the basic functionality of STM32 timers
>   Fixing the basic functionality of STM32 timers
>   Fixing the basic functionality of STM32 timers
>   Fixing the basic functionality of STM32 timers
>   Fixing the basic functionality of STM32 timers
>   Fixing the basic functionality of STM32 timers
>   Fixing the basic functionality of STM32 timers
>   Fixing the basic functionality of STM32 timers
>   Fixing the basic functionality of STM32 timers
>   Fixing the basic functionality of STM32 timers
>   Fixing the basic functionality of STM32 timers
>   Fixing the basic functionality of STM32 timers
>   Fixing the basic functionality of STM32 timers
>   Fixing the basic functionality of STM32 timers
>   Fixing the basic functionality of STM32 timers
>   Fixing the basic functionality of STM32 timers
>
>  hw/arm/stm32f405_soc.c             |   2 +-
>  hw/timer/stm32f2xx_timer.c         | 262 +++++++++++++++++++----------
>  include/hw/timer/stm32f2xx_timer.h |  23 ++-
>  3 files changed, 189 insertions(+), 98 deletions(-)
>
> --
> 2.38.5


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH qemu v3 02/20] Fixing the basic functionality of STM32 timers
  2023-12-02 12:05 ` [PATCH qemu v3 02/20] " ~lbryndza
@ 2023-12-06 15:52   ` Alex Bennée
  0 siblings, 0 replies; 23+ messages in thread
From: Alex Bennée @ 2023-12-06 15:52 UTC (permalink / raw)
  To: ~lbryndza; +Cc: qemu-devel, ~lbryndza, Alistair Francis, Peter Maydell

~lbryndza <lbryndza@git.sr.ht> writes:

> From: Lucjan Bryndza <lbryndza.oss@icloud.com>
>
> The current implementation of timers does not work properly
> even in basic functionality. A counter configured to report
> an interrupt every 10ms reports the first interrupts after a
> few seconds.  There are also no properly implemented count up an
> count down modes. This commit fixes bugs with interrupt
> reporting and implements the basic modes of the counter's
> time-base block.
>
> Remove wrong qemu timer implementation

I suspect this breaks bisectability of the series. Each point in the
series should still be able to compile and at least function as well as
it did before. So in this case I think this patch needs to be merged
with the patch that brings in the replacement functionality.

>
> Signed-off-by: Lucjan Bryndza <lbryndza.oss@icloud.com>
> ---
>  hw/timer/stm32f2xx_timer.c | 55 ++++----------------------------------
>  1 file changed, 5 insertions(+), 50 deletions(-)
>
> diff --git a/hw/timer/stm32f2xx_timer.c b/hw/timer/stm32f2xx_timer.c
> index ba8694dcd3..f03f594a17 100644
> --- a/hw/timer/stm32f2xx_timer.c
> +++ b/hw/timer/stm32f2xx_timer.c
> @@ -23,12 +23,17 @@
>   */
>  
>  #include "qemu/osdep.h"
> +#include "qapi/error.h"
>  #include "hw/irq.h"
>  #include "hw/qdev-properties.h"
>  #include "hw/timer/stm32f2xx_timer.h"
>  #include "migration/vmstate.h"
>  #include "qemu/log.h"
>  #include "qemu/module.h"
> +#include "qemu/typedefs.h"
> +#include "qemu/timer.h"
> +#include "qemu/main-loop.h"
> +#include "sysemu/dma.h"

Seems odd to increase the includes needed when the rest of the patch
just deletes code.

<snip>

-- 
Alex Bennée
Virtualisation Tech Lead @ Linaro


^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2023-12-06 15:53 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-12-02 13:40 [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform ~lbryndza
2023-12-02 11:55 ` [PATCH qemu v3 01/20] Fixing the basic functionality of STM32 timers ~lbryndza
2023-12-02 12:05 ` [PATCH qemu v3 02/20] " ~lbryndza
2023-12-06 15:52   ` Alex Bennée
2023-12-02 12:09 ` [PATCH qemu v3 03/20] " ~lbryndza
2023-12-02 12:11 ` [PATCH qemu v3 04/20] " ~lbryndza
2023-12-02 12:12 ` [PATCH qemu v3 05/20] " ~lbryndza
2023-12-02 12:13 ` [PATCH qemu v3 06/20] " ~lbryndza
2023-12-02 12:15 ` [PATCH qemu v3 07/20] " ~lbryndza
2023-12-02 12:16 ` [PATCH qemu v3 08/20] " ~lbryndza
2023-12-02 12:18 ` [PATCH qemu v3 09/20] " ~lbryndza
2023-12-02 12:18 ` [PATCH qemu v3 10/20] " ~lbryndza
2023-12-02 12:19 ` [PATCH qemu v3 11/20] " ~lbryndza
2023-12-02 12:19 ` [PATCH qemu v3 12/20] " ~lbryndza
2023-12-02 12:20 ` [PATCH qemu v3 13/20] " ~lbryndza
2023-12-02 12:21 ` [PATCH qemu v3 14/20] " ~lbryndza
2023-12-02 12:21 ` [PATCH qemu v3 15/20] " ~lbryndza
2023-12-02 12:22 ` [PATCH qemu v3 16/20] " ~lbryndza
2023-12-02 12:23 ` [PATCH qemu v3 17/20] " ~lbryndza
2023-12-02 12:24 ` [PATCH qemu v3 18/20] " ~lbryndza
2023-12-02 12:26 ` [PATCH qemu v3 19/20] " ~lbryndza
2023-12-02 12:28 ` [PATCH qemu v3 20/20] " ~lbryndza
2023-12-06  1:04 ` [PATCH qemu v3 00/20] Fix malfunctioning of T2-T5 timers on the STM32 platform Alistair Francis

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.