1 // SPDX-License-Identifier: GPL-2.0
3 /* Copyright (C) 2023-2024 Linaro Ltd. */
6 #include <linux/platform_device.h>
12 /* Is this register ID valid for the current GSI version? */
13 static bool gsi_reg_id_valid(struct gsi
*gsi
, enum gsi_reg_id reg_id
)
16 case INTER_EE_SRC_CH_IRQ_MSK
:
17 case INTER_EE_SRC_EV_CH_IRQ_MSK
:
18 return gsi
->version
>= IPA_VERSION_3_5
;
21 return gsi
->version
>= IPA_VERSION_3_5_1
;
24 return gsi
->version
>= IPA_VERSION_5_0
;
42 case EV_CH_E_CNTXT_10
:
43 case EV_CH_E_CNTXT_11
:
44 case EV_CH_E_CNTXT_12
:
45 case EV_CH_E_CNTXT_13
:
46 case EV_CH_E_SCRATCH_0
:
47 case EV_CH_E_SCRATCH_1
:
49 case EV_CH_E_DOORBELL_0
:
55 case CNTXT_TYPE_IRQ_MSK
:
56 case CNTXT_SRC_CH_IRQ
:
57 case CNTXT_SRC_CH_IRQ_MSK
:
58 case CNTXT_SRC_CH_IRQ_CLR
:
59 case CNTXT_SRC_EV_CH_IRQ
:
60 case CNTXT_SRC_EV_CH_IRQ_MSK
:
61 case CNTXT_SRC_EV_CH_IRQ_CLR
:
62 case CNTXT_SRC_IEOB_IRQ
:
63 case CNTXT_SRC_IEOB_IRQ_MSK
:
64 case CNTXT_SRC_IEOB_IRQ_CLR
:
65 case CNTXT_GLOB_IRQ_STTS
:
66 case CNTXT_GLOB_IRQ_EN
:
67 case CNTXT_GLOB_IRQ_CLR
:
68 case CNTXT_GSI_IRQ_STTS
:
69 case CNTXT_GSI_IRQ_EN
:
70 case CNTXT_GSI_IRQ_CLR
:
82 const struct reg
*gsi_reg(struct gsi
*gsi
, enum gsi_reg_id reg_id
)
84 if (WARN(!gsi_reg_id_valid(gsi
, reg_id
), "invalid reg %u\n", reg_id
))
87 return reg(gsi
->regs
, reg_id
);
90 static const struct regs
*gsi_regs(struct gsi
*gsi
)
92 switch (gsi
->version
) {
94 return &gsi_regs_v3_1
;
96 case IPA_VERSION_3_5_1
:
97 return &gsi_regs_v3_5_1
;
100 return &gsi_regs_v4_0
;
102 case IPA_VERSION_4_5
:
103 case IPA_VERSION_4_7
:
104 return &gsi_regs_v4_5
;
106 case IPA_VERSION_4_9
:
107 return &gsi_regs_v4_9
;
109 case IPA_VERSION_4_11
:
110 return &gsi_regs_v4_11
;
112 case IPA_VERSION_5_0
:
113 case IPA_VERSION_5_5
:
114 return &gsi_regs_v5_0
;
121 /* Sets gsi->virt and I/O maps the "gsi" memory range for registers */
122 int gsi_reg_init(struct gsi
*gsi
, struct platform_device
*pdev
)
124 struct device
*dev
= &pdev
->dev
;
125 struct resource
*res
;
126 resource_size_t size
;
128 /* Get GSI memory range and map it */
129 res
= platform_get_resource_byname(pdev
, IORESOURCE_MEM
, "gsi");
131 dev_err(dev
, "DT error getting \"gsi\" memory property\n");
135 size
= resource_size(res
);
136 if (res
->start
> U32_MAX
|| size
> U32_MAX
- res
->start
) {
137 dev_err(dev
, "DT memory resource \"gsi\" out of range\n");
141 gsi
->regs
= gsi_regs(gsi
);
143 dev_err(dev
, "unsupported IPA version %u (?)\n", gsi
->version
);
147 gsi
->virt
= ioremap(res
->start
, size
);
149 dev_err(dev
, "unable to remap \"gsi\" memory\n");
156 /* Inverse of gsi_reg_init() */
157 void gsi_reg_exit(struct gsi
*gsi
)