1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4 */
5 #ifndef _ASM_GUNYAH_H
6 #define _ASM_GUNYAH_H
7
8 #include <linux/irq.h>
9 #include <linux/irqdomain.h>
10
arch_gunyah_fill_irq_fwspec_params(u32 virq,struct irq_fwspec * fwspec)11 static inline int arch_gunyah_fill_irq_fwspec_params(u32 virq,
12 struct irq_fwspec *fwspec)
13 {
14 /* Assume that Gunyah gave us an SPI or ESPI; defensively check it */
15 if (WARN(virq < 32, "Unexpected virq: %d\n", virq)) {
16 return -EINVAL;
17 } else if (virq <= 1019) {
18 fwspec->param_count = 3;
19 fwspec->param[0] = 0; /* GIC_SPI */
20 fwspec->param[1] = virq - 32; /* virq 32 -> SPI 0 */
21 fwspec->param[2] = IRQ_TYPE_EDGE_RISING;
22 } else if (WARN(virq < 4096, "Unexpected virq: %d\n", virq)) {
23 return -EINVAL;
24 } else if (virq < 5120) {
25 fwspec->param_count = 3;
26 fwspec->param[0] = 2; /* GIC_ESPI */
27 fwspec->param[1] = virq - 4096; /* virq 4096 -> ESPI 0 */
28 fwspec->param[2] = IRQ_TYPE_EDGE_RISING;
29 } else {
30 WARN(1, "Unexpected virq: %d\n", virq);
31 return -EINVAL;
32 }
33 return 0;
34 }
35
36 enum arch_gunyah_memtype {
37 /* clang-format off */
38 GUNYAH_MEMTYPE_DEVICE_nGnRnE = 0,
39 GUNYAH_DEVICE_nGnRE = 1,
40 GUNYAH_DEVICE_nGRE = 2,
41 GUNYAH_DEVICE_GRE = 3,
42
43 GUNYAH_NORMAL_NC = 0b0101,
44 GUNYAH_NORMAL_ONC_IWT = 0b0110,
45 GUNYAH_NORMAL_ONC_IWB = 0b0111,
46 GUNYAH_NORMAL_OWT_INC = 0b1001,
47 GUNYAH_NORMAL_WT = 0b1010,
48 GUNYAH_NORMAL_OWT_IWB = 0b1011,
49 GUNYAH_NORMAL_OWB_INC = 0b1101,
50 GUNYAH_NORMAL_OWB_IWT = 0b1110,
51 GUNYAH_NORMAL_WB = 0b1111,
52 /* clang-format on */
53 };
54
55 #define ARCH_GUNYAH_DEFAULT_MEMTYPE GUNYAH_NORMAL_WB
56
57 #endif
58