diff mbox

[01/13] cuda: add a framework to handle commands

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

Commit Message

Hervé Poussineau Jan. 23, 2016, 8:39 p.m. UTC
Next commits will port existing CUDA commands to this framework.

Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
 hw/misc/macio/cuda.c | 34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

Comments

David Gibson Jan. 24, 2016, 11:10 p.m. UTC | #1
On Sat, Jan 23, 2016 at 09:39:58PM +0100, Hervé Poussineau wrote:
> Next commits will port existing CUDA commands to this framework.
> 
> Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>

Reviewed-by: David Gibson <david@gibson.dropbear.id.au>

> ---
>  hw/misc/macio/cuda.c | 34 ++++++++++++++++++++++++++++++++++
>  1 file changed, 34 insertions(+)
> 
> diff --git a/hw/misc/macio/cuda.c b/hw/misc/macio/cuda.c
> index 9db4c64..69f69c2 100644
> --- a/hw/misc/macio/cuda.c
> +++ b/hw/misc/macio/cuda.c
> @@ -534,13 +534,47 @@ static void cuda_adb_poll(void *opaque)
>                     (get_ticks_per_sec() / CUDA_ADB_POLL_FREQ));
>  }
>  
> +/* description of commands */
> +typedef struct CudaCommand {
> +    uint8_t command;
> +    const char *name;
> +    bool (*handler)(CUDAState *s,
> +                    const uint8_t *in_args, int in_len,
> +                    uint8_t *out_args, int *out_len);
> +} CudaCommand;
> +
> +static const CudaCommand handlers[] = {
> +};
> +
>  static void cuda_receive_packet(CUDAState *s,
>                                  const uint8_t *data, int len)
>  {
>      uint8_t obuf[16] = { CUDA_PACKET, 0, data[0] };
>      int autopoll;
> +    int i, out_len = 0;
>      uint32_t ti;
>  
> +    for (i = 0; i < ARRAY_SIZE(handlers); i++) {
> +        const CudaCommand *desc = &handlers[i];
> +        if (desc->command == data[0]) {
> +            CUDA_DPRINTF("handling command %s\n", desc->name);
> +            out_len = 0;
> +            if (desc->handler(s, data + 1, len - 1, obuf + 3, &out_len)) {
> +                cuda_send_packet_to_host(s, obuf, 3 + out_len);
> +            } else {
> +                qemu_log_mask(LOG_GUEST_ERROR,
> +                              "CUDA: %s: wrong parameters %d\n",
> +                              desc->name, len);
> +                obuf[0] = ERROR_PACKET;
> +                obuf[1] = 0x5; /* bad parameters */
> +                obuf[2] = CUDA_PACKET;
> +                obuf[3] = data[0];
> +                cuda_send_packet_to_host(s, obuf, 4);
> +            }
> +            return;
> +        }
> +    }
> +
>      switch(data[0]) {
>      case CUDA_AUTOPOLL:
>          autopoll = (data[1] != 0);
diff mbox

Patch

diff --git a/hw/misc/macio/cuda.c b/hw/misc/macio/cuda.c
index 9db4c64..69f69c2 100644
--- a/hw/misc/macio/cuda.c
+++ b/hw/misc/macio/cuda.c
@@ -534,13 +534,47 @@  static void cuda_adb_poll(void *opaque)
                    (get_ticks_per_sec() / CUDA_ADB_POLL_FREQ));
 }
 
+/* description of commands */
+typedef struct CudaCommand {
+    uint8_t command;
+    const char *name;
+    bool (*handler)(CUDAState *s,
+                    const uint8_t *in_args, int in_len,
+                    uint8_t *out_args, int *out_len);
+} CudaCommand;
+
+static const CudaCommand handlers[] = {
+};
+
 static void cuda_receive_packet(CUDAState *s,
                                 const uint8_t *data, int len)
 {
     uint8_t obuf[16] = { CUDA_PACKET, 0, data[0] };
     int autopoll;
+    int i, out_len = 0;
     uint32_t ti;
 
+    for (i = 0; i < ARRAY_SIZE(handlers); i++) {
+        const CudaCommand *desc = &handlers[i];
+        if (desc->command == data[0]) {
+            CUDA_DPRINTF("handling command %s\n", desc->name);
+            out_len = 0;
+            if (desc->handler(s, data + 1, len - 1, obuf + 3, &out_len)) {
+                cuda_send_packet_to_host(s, obuf, 3 + out_len);
+            } else {
+                qemu_log_mask(LOG_GUEST_ERROR,
+                              "CUDA: %s: wrong parameters %d\n",
+                              desc->name, len);
+                obuf[0] = ERROR_PACKET;
+                obuf[1] = 0x5; /* bad parameters */
+                obuf[2] = CUDA_PACKET;
+                obuf[3] = data[0];
+                cuda_send_packet_to_host(s, obuf, 4);
+            }
+            return;
+        }
+    }
+
     switch(data[0]) {
     case CUDA_AUTOPOLL:
         autopoll = (data[1] != 0);