diff mbox

[04/13] cuda: port SET_AUTO_RATE command to new framework

Message ID 1453581610-23179-5-git-send-email-hpoussin@reactos.org (mailing list archive)
State New, archived
Headers show

Commit Message

Hervé Poussineau Jan. 23, 2016, 8:40 p.m. UTC
Take requested autopoll rate into account

Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
 hw/misc/macio/cuda.c | 31 +++++++++++++++++++++++++++----
 hw/ppc/mac.h         |  1 +
 2 files changed, 28 insertions(+), 4 deletions(-)

Comments

Hervé Poussineau Jan. 24, 2016, 6:33 p.m. UTC | #1
Le 23/01/2016 21:40, Hervé Poussineau a écrit :
> Take requested autopoll rate into account
>
> Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
> ---
>   hw/misc/macio/cuda.c | 31 +++++++++++++++++++++++++++----
>   hw/ppc/mac.h         |  1 +
>   2 files changed, 28 insertions(+), 4 deletions(-)
>
> diff --git a/hw/misc/macio/cuda.c b/hw/misc/macio/cuda.c
> index 37406fc..9ec642f 100644
> --- a/hw/misc/macio/cuda.c
> +++ b/hw/misc/macio/cuda.c
> @@ -105,7 +105,6 @@
>   #define CUDA_COMBINED_FORMAT_IIC	0x25
>
>   #define CUDA_TIMER_FREQ (4700000 / 6)
> -#define CUDA_ADB_POLL_FREQ 50
>
>   /* CUDA returns time_t's offset from Jan 1, 1904, not 1970 */
>   #define RTC_OFFSET                      2082844800
> @@ -531,7 +530,7 @@ static void cuda_adb_poll(void *opaque)
>       }
>       timer_mod(s->adb_poll_timer,
>                      qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
> -                   (get_ticks_per_sec() / CUDA_ADB_POLL_FREQ));
> +                   (get_ticks_per_sec() / (1000 / s->auto_rate_ms)));
>   }
>
>   /* description of commands */
> @@ -559,7 +558,7 @@ static bool cuda_cmd_autopoll(CUDAState *s,
>           if (autopoll) {
>               timer_mod(s->adb_poll_timer,
>                         qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
> -                      (get_ticks_per_sec() / CUDA_ADB_POLL_FREQ));
> +                      (get_ticks_per_sec() / (1000 / s->auto_rate_ms)));
>           } else {
>               timer_del(s->adb_poll_timer);
>           }
> @@ -567,8 +566,32 @@ static bool cuda_cmd_autopoll(CUDAState *s,
>       return true;
>   }
>
> +static bool cuda_cmd_set_autorate(CUDAState *s,
> +                                  const uint8_t *in_data, int in_len,
> +                                  uint8_t *out_data, int *out_len)
> +{
> +    if (in_len != 1) {
> +        return false;
> +    }
> +
> +    /* we don't want a period of 0 ms */
> +    /* FIXME: check what real hardware does */
> +    if (in_data[0] == 0) {
> +        return;

This 'return' should be changed into a 'return false'.

> +    }
> +
> +    s->auto_rate_ms = in_data[0];
> +    if (s->autopoll) {
> +        timer_mod(s->adb_poll_timer,
> +                  qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
> +                  (get_ticks_per_sec() / (1000 / s->auto_rate_ms)));
> +    }
> +    return true;
> +}
> +
>   static const CudaCommand handlers[] = {
>       { CUDA_AUTOPOLL, "AUTOPOLL", cuda_cmd_autopoll },
> +    { CUDA_SET_AUTO_RATE, "SET_AUTO_RATE",  cuda_cmd_set_autorate },
>   };
>
>   static void cuda_receive_packet(CUDAState *s,
> @@ -618,7 +641,6 @@ static void cuda_receive_packet(CUDAState *s,
>           return;
>       case CUDA_FILE_SERVER_FLAG:
>       case CUDA_SET_DEVICE_LIST:
> -    case CUDA_SET_AUTO_RATE:
>       case CUDA_SET_POWER_MESSAGES:
>           cuda_send_packet_to_host(s, obuf, 3);
>           return;
> @@ -824,6 +846,7 @@ static void cuda_realizefn(DeviceState *dev, Error **errp)
>       s->tick_offset = (uint32_t)mktimegm(&tm) + RTC_OFFSET;
>
>       s->adb_poll_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, cuda_adb_poll, s);
> +    s->auto_rate_ms = 20;
>   }
>
>   static void cuda_initfn(Object *obj)
> diff --git a/hw/ppc/mac.h b/hw/ppc/mac.h
> index e375ed2..90fcb69 100644
> --- a/hw/ppc/mac.h
> +++ b/hw/ppc/mac.h
> @@ -111,6 +111,7 @@ typedef struct CUDAState {
>       int data_out_index;
>
>       qemu_irq irq;
> +    uint8_t auto_rate_ms;
>       uint8_t autopoll;
>       uint8_t data_in[128];
>       uint8_t data_out[16];
>
David Gibson Jan. 24, 2016, 11:21 p.m. UTC | #2
On Sat, Jan 23, 2016 at 09:40:01PM +0100, Hervé Poussineau wrote:
> Take requested autopoll rate into account

Commit message needs some work - as far as I can tell this is
not just moving this to the new framework, but implementing it -
previously the command was silently ignored.

> 
> Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
> ---
>  hw/misc/macio/cuda.c | 31 +++++++++++++++++++++++++++----
>  hw/ppc/mac.h         |  1 +
>  2 files changed, 28 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/misc/macio/cuda.c b/hw/misc/macio/cuda.c
> index 37406fc..9ec642f 100644
> --- a/hw/misc/macio/cuda.c
> +++ b/hw/misc/macio/cuda.c
> @@ -105,7 +105,6 @@
>  #define CUDA_COMBINED_FORMAT_IIC	0x25
>  
>  #define CUDA_TIMER_FREQ (4700000 / 6)
> -#define CUDA_ADB_POLL_FREQ 50
>  
>  /* CUDA returns time_t's offset from Jan 1, 1904, not 1970 */
>  #define RTC_OFFSET                      2082844800
> @@ -531,7 +530,7 @@ static void cuda_adb_poll(void *opaque)
>      }
>      timer_mod(s->adb_poll_timer,
>                     qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
> -                   (get_ticks_per_sec() / CUDA_ADB_POLL_FREQ));
> +                   (get_ticks_per_sec() / (1000 / s->auto_rate_ms)));

I believe you can reduce the rounding errors by expressing this as:
        (s->auto_rate_ms * get_ticks_per_sec()) / 1000
	

>  }
>  
>  /* description of commands */
> @@ -559,7 +558,7 @@ static bool cuda_cmd_autopoll(CUDAState *s,
>          if (autopoll) {
>              timer_mod(s->adb_poll_timer,
>                        qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
> -                      (get_ticks_per_sec() / CUDA_ADB_POLL_FREQ));
> +                      (get_ticks_per_sec() / (1000 / s->auto_rate_ms)));
>          } else {
>              timer_del(s->adb_poll_timer);
>          }
> @@ -567,8 +566,32 @@ static bool cuda_cmd_autopoll(CUDAState *s,
>      return true;
>  }
>  
> +static bool cuda_cmd_set_autorate(CUDAState *s,
> +                                  const uint8_t *in_data, int in_len,
> +                                  uint8_t *out_data, int *out_len)
> +{
> +    if (in_len != 1) {
> +        return false;
> +    }
> +
> +    /* we don't want a period of 0 ms */
> +    /* FIXME: check what real hardware does */
> +    if (in_data[0] == 0) {
> +        return;
> +    }
> +
> +    s->auto_rate_ms = in_data[0];
> +    if (s->autopoll) {
> +        timer_mod(s->adb_poll_timer,
> +                  qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
> +                  (get_ticks_per_sec() / (1000 / s->auto_rate_ms)));

IIUC this will make the next even occur in auto_rate_ms milliseconds,
rather than auto_rate_ms from the previous event.  i.e. it discards
any time elapsed on the currently running timer.

That may be the intended behaviour, or at least close enough that it
doesn't matter, but I think it deserves comment.

> +    }
> +    return true;
> +}
> +
>  static const CudaCommand handlers[] = {
>      { CUDA_AUTOPOLL, "AUTOPOLL", cuda_cmd_autopoll },
> +    { CUDA_SET_AUTO_RATE, "SET_AUTO_RATE",  cuda_cmd_set_autorate },
>  };
>  
>  static void cuda_receive_packet(CUDAState *s,
> @@ -618,7 +641,6 @@ static void cuda_receive_packet(CUDAState *s,
>          return;
>      case CUDA_FILE_SERVER_FLAG:
>      case CUDA_SET_DEVICE_LIST:
> -    case CUDA_SET_AUTO_RATE:
>      case CUDA_SET_POWER_MESSAGES:
>          cuda_send_packet_to_host(s, obuf, 3);
>          return;
> @@ -824,6 +846,7 @@ static void cuda_realizefn(DeviceState *dev, Error **errp)
>      s->tick_offset = (uint32_t)mktimegm(&tm) + RTC_OFFSET;
>  
>      s->adb_poll_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, cuda_adb_poll, s);
> +    s->auto_rate_ms = 20;
>  }
>  
>  static void cuda_initfn(Object *obj)
> diff --git a/hw/ppc/mac.h b/hw/ppc/mac.h
> index e375ed2..90fcb69 100644
> --- a/hw/ppc/mac.h
> +++ b/hw/ppc/mac.h
> @@ -111,6 +111,7 @@ typedef struct CUDAState {
>      int data_out_index;
>  
>      qemu_irq irq;
> +    uint8_t auto_rate_ms;
>      uint8_t autopoll;
>      uint8_t data_in[128];
>      uint8_t data_out[16];
Mark Cave-Ayland Feb. 7, 2016, 7:27 p.m. UTC | #3
On 23/01/16 20:40, Hervé Poussineau wrote:

> Take requested autopoll rate into account
> 
> Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
> ---
>  hw/misc/macio/cuda.c | 31 +++++++++++++++++++++++++++----
>  hw/ppc/mac.h         |  1 +
>  2 files changed, 28 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/misc/macio/cuda.c b/hw/misc/macio/cuda.c
> index 37406fc..9ec642f 100644
> --- a/hw/misc/macio/cuda.c
> +++ b/hw/misc/macio/cuda.c
> @@ -105,7 +105,6 @@
>  #define CUDA_COMBINED_FORMAT_IIC	0x25
>  
>  #define CUDA_TIMER_FREQ (4700000 / 6)
> -#define CUDA_ADB_POLL_FREQ 50
>  
>  /* CUDA returns time_t's offset from Jan 1, 1904, not 1970 */
>  #define RTC_OFFSET                      2082844800
> @@ -531,7 +530,7 @@ static void cuda_adb_poll(void *opaque)
>      }
>      timer_mod(s->adb_poll_timer,
>                     qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
> -                   (get_ticks_per_sec() / CUDA_ADB_POLL_FREQ));
> +                   (get_ticks_per_sec() / (1000 / s->auto_rate_ms)));
>  }
>  
>  /* description of commands */
> @@ -559,7 +558,7 @@ static bool cuda_cmd_autopoll(CUDAState *s,
>          if (autopoll) {
>              timer_mod(s->adb_poll_timer,
>                        qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
> -                      (get_ticks_per_sec() / CUDA_ADB_POLL_FREQ));
> +                      (get_ticks_per_sec() / (1000 / s->auto_rate_ms)));
>          } else {
>              timer_del(s->adb_poll_timer);
>          }
> @@ -567,8 +566,32 @@ static bool cuda_cmd_autopoll(CUDAState *s,
>      return true;
>  }
>  
> +static bool cuda_cmd_set_autorate(CUDAState *s,
> +                                  const uint8_t *in_data, int in_len,
> +                                  uint8_t *out_data, int *out_len)
> +{
> +    if (in_len != 1) {
> +        return false;
> +    }
> +
> +    /* we don't want a period of 0 ms */
> +    /* FIXME: check what real hardware does */
> +    if (in_data[0] == 0) {
> +        return;
> +    }
> +
> +    s->auto_rate_ms = in_data[0];
> +    if (s->autopoll) {
> +        timer_mod(s->adb_poll_timer,
> +                  qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
> +                  (get_ticks_per_sec() / (1000 / s->auto_rate_ms)));
> +    }
> +    return true;
> +}
> +
>  static const CudaCommand handlers[] = {
>      { CUDA_AUTOPOLL, "AUTOPOLL", cuda_cmd_autopoll },
> +    { CUDA_SET_AUTO_RATE, "SET_AUTO_RATE",  cuda_cmd_set_autorate },
>  };
>  
>  static void cuda_receive_packet(CUDAState *s,
> @@ -618,7 +641,6 @@ static void cuda_receive_packet(CUDAState *s,
>          return;
>      case CUDA_FILE_SERVER_FLAG:
>      case CUDA_SET_DEVICE_LIST:
> -    case CUDA_SET_AUTO_RATE:
>      case CUDA_SET_POWER_MESSAGES:
>          cuda_send_packet_to_host(s, obuf, 3);
>          return;
> @@ -824,6 +846,7 @@ static void cuda_realizefn(DeviceState *dev, Error **errp)
>      s->tick_offset = (uint32_t)mktimegm(&tm) + RTC_OFFSET;
>  
>      s->adb_poll_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, cuda_adb_poll, s);
> +    s->auto_rate_ms = 20;

Can we call this s->autopoll_rate_ms instead for consistency?

>  }
>  
>  static void cuda_initfn(Object *obj)
> diff --git a/hw/ppc/mac.h b/hw/ppc/mac.h
> index e375ed2..90fcb69 100644
> --- a/hw/ppc/mac.h
> +++ b/hw/ppc/mac.h
> @@ -111,6 +111,7 @@ typedef struct CUDAState {
>      int data_out_index;
>  
>      qemu_irq irq;
> +    uint8_t auto_rate_ms;
>      uint8_t autopoll;
>      uint8_t data_in[128];
>      uint8_t data_out[16];
> 

I think that the autopoll rate field will also need adding to
VMStateDescription for CUDA (along with a corresponding increase in
version number).


ATB,

Mark.
diff mbox

Patch

diff --git a/hw/misc/macio/cuda.c b/hw/misc/macio/cuda.c
index 37406fc..9ec642f 100644
--- a/hw/misc/macio/cuda.c
+++ b/hw/misc/macio/cuda.c
@@ -105,7 +105,6 @@ 
 #define CUDA_COMBINED_FORMAT_IIC	0x25
 
 #define CUDA_TIMER_FREQ (4700000 / 6)
-#define CUDA_ADB_POLL_FREQ 50
 
 /* CUDA returns time_t's offset from Jan 1, 1904, not 1970 */
 #define RTC_OFFSET                      2082844800
@@ -531,7 +530,7 @@  static void cuda_adb_poll(void *opaque)
     }
     timer_mod(s->adb_poll_timer,
                    qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
-                   (get_ticks_per_sec() / CUDA_ADB_POLL_FREQ));
+                   (get_ticks_per_sec() / (1000 / s->auto_rate_ms)));
 }
 
 /* description of commands */
@@ -559,7 +558,7 @@  static bool cuda_cmd_autopoll(CUDAState *s,
         if (autopoll) {
             timer_mod(s->adb_poll_timer,
                       qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
-                      (get_ticks_per_sec() / CUDA_ADB_POLL_FREQ));
+                      (get_ticks_per_sec() / (1000 / s->auto_rate_ms)));
         } else {
             timer_del(s->adb_poll_timer);
         }
@@ -567,8 +566,32 @@  static bool cuda_cmd_autopoll(CUDAState *s,
     return true;
 }
 
+static bool cuda_cmd_set_autorate(CUDAState *s,
+                                  const uint8_t *in_data, int in_len,
+                                  uint8_t *out_data, int *out_len)
+{
+    if (in_len != 1) {
+        return false;
+    }
+
+    /* we don't want a period of 0 ms */
+    /* FIXME: check what real hardware does */
+    if (in_data[0] == 0) {
+        return;
+    }
+
+    s->auto_rate_ms = in_data[0];
+    if (s->autopoll) {
+        timer_mod(s->adb_poll_timer,
+                  qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
+                  (get_ticks_per_sec() / (1000 / s->auto_rate_ms)));
+    }
+    return true;
+}
+
 static const CudaCommand handlers[] = {
     { CUDA_AUTOPOLL, "AUTOPOLL", cuda_cmd_autopoll },
+    { CUDA_SET_AUTO_RATE, "SET_AUTO_RATE",  cuda_cmd_set_autorate },
 };
 
 static void cuda_receive_packet(CUDAState *s,
@@ -618,7 +641,6 @@  static void cuda_receive_packet(CUDAState *s,
         return;
     case CUDA_FILE_SERVER_FLAG:
     case CUDA_SET_DEVICE_LIST:
-    case CUDA_SET_AUTO_RATE:
     case CUDA_SET_POWER_MESSAGES:
         cuda_send_packet_to_host(s, obuf, 3);
         return;
@@ -824,6 +846,7 @@  static void cuda_realizefn(DeviceState *dev, Error **errp)
     s->tick_offset = (uint32_t)mktimegm(&tm) + RTC_OFFSET;
 
     s->adb_poll_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, cuda_adb_poll, s);
+    s->auto_rate_ms = 20;
 }
 
 static void cuda_initfn(Object *obj)
diff --git a/hw/ppc/mac.h b/hw/ppc/mac.h
index e375ed2..90fcb69 100644
--- a/hw/ppc/mac.h
+++ b/hw/ppc/mac.h
@@ -111,6 +111,7 @@  typedef struct CUDAState {
     int data_out_index;
 
     qemu_irq irq;
+    uint8_t auto_rate_ms;
     uint8_t autopoll;
     uint8_t data_in[128];
     uint8_t data_out[16];