Re: [PATCH v8 03/28] gunyah: Common types and error codes for Gunyah hypercalls

From: Elliot Berman
Date: Tue Jan 10 2023 - 12:56:18 EST




On 1/9/2023 1:34 PM, Alex Elder wrote:
On 12/19/22 4:58 PM, Elliot Berman wrote:
Add architecture-independent standard error codes, types, and macros for
Gunyah hypercalls.

Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@xxxxxxxxxx>
Signed-off-by: Elliot Berman <quic_eberman@xxxxxxxxxxx>
---
  MAINTAINERS            |  1 +
  include/linux/gunyah.h | 74 ++++++++++++++++++++++++++++++++++++++++++
  2 files changed, 75 insertions(+)
  create mode 100644 include/linux/gunyah.h

diff --git a/MAINTAINERS b/MAINTAINERS
index f32320a9efa4..74e76e0ab14d 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -8941,6 +8941,7 @@ L:    linux-arm-msm@xxxxxxxxxxxxxxx
  S:    Supported
  F:    Documentation/devicetree/bindings/firmware/gunyah-hypervisor.yaml
  F:    Documentation/virt/gunyah/
+F:    include/linux/gunyah.h
  HABANALABS PCI DRIVER
  M:    Oded Gabbay <ogabbay@xxxxxxxxxx>
diff --git a/include/linux/gunyah.h b/include/linux/gunyah.h
new file mode 100644
index 000000000000..824e20a11d27
--- /dev/null
+++ b/include/linux/gunyah.h
@@ -0,0 +1,74 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ */
+
+#ifndef _GUNYAH_H

Maybe use _LINUX_GUNYAH_H?


Ack.

+#define _GUNYAH_H
+
+#include <linux/types.h>

Why is types.h included?

U64_MAX is defined in <linux/limits.h> (in case that's why).

Ack.


Otherwise this just defines a fixed API exposed by Gunyah
so there's not much more for me to comment on.

                    -Alex

+#include <linux/errno.h>
+
+/* Common Gunyah macros */
+#define GH_CAPID_INVAL    U64_MAX
+#define GH_VMID_ROOT_VM    0xff
+
+#define GH_ERROR_OK            0
+
+#define GH_ERROR_UNIMPLEMENTED        -1
+#define GH_ERROR_RETRY            -2
+
+#define GH_ERROR_ARG_INVAL        1
+#define GH_ERROR_ARG_SIZE        2
+#define GH_ERROR_ARG_ALIGN        3
+
+#define GH_ERROR_NOMEM            10
+
+#define GH_ERROR_ADDR_OVFL        20
+#define GH_ERROR_ADDR_UNFL        21
+#define GH_ERROR_ADDR_INVAL        22
+
+#define GH_ERROR_DENIED            30
+#define GH_ERROR_BUSY            31
+#define GH_ERROR_IDLE            32
+
+#define GH_ERROR_IRQ_BOUND        40
+#define GH_ERROR_IRQ_UNBOUND        41
+
+#define GH_ERROR_CSPACE_CAP_NULL    50
+#define GH_ERROR_CSPACE_CAP_REVOKED    51
+#define GH_ERROR_CSPACE_WRONG_OBJ_TYPE    52
+#define GH_ERROR_CSPACE_INSUF_RIGHTS    53
+#define GH_ERROR_CSPACE_FULL        54
+
+#define GH_ERROR_MSGQUEUE_EMPTY        60
+#define GH_ERROR_MSGQUEUE_FULL        61
+
+static inline int gh_remap_error(int gh_error)
+{
+    switch (gh_error) {
+    case GH_ERROR_OK:
+        return 0;
+    case GH_ERROR_NOMEM:
+        return -ENOMEM;
+    case GH_ERROR_DENIED:
+    case GH_ERROR_CSPACE_CAP_NULL:
+    case GH_ERROR_CSPACE_CAP_REVOKED:
+    case GH_ERROR_CSPACE_WRONG_OBJ_TYPE:
+    case GH_ERROR_CSPACE_INSUF_RIGHTS:
+    case GH_ERROR_CSPACE_FULL:
+        return -EACCES;
+    case GH_ERROR_BUSY:
+    case GH_ERROR_IDLE:
+        return -EBUSY;
+    case GH_ERROR_IRQ_BOUND:
+    case GH_ERROR_IRQ_UNBOUND:
+    case GH_ERROR_MSGQUEUE_FULL:
+    case GH_ERROR_MSGQUEUE_EMPTY:
+        return -EPERM;
+    default:
+        return -EINVAL;
+    }
+}
+
+#endif