1 // SPDX-License-Identifier: GPL-2.0
3 * Xilinx Inter Processor Interrupt(IPI) Mailbox Driver
5 * Copyright (C) 2018 Xilinx, Inc.
8 #include <linux/arm-smccc.h>
9 #include <linux/cpuhotplug.h>
10 #include <linux/delay.h>
11 #include <linux/device.h>
12 #include <linux/interrupt.h>
13 #include <linux/irqdomain.h>
15 #include <linux/kernel.h>
16 #include <linux/mailbox_controller.h>
17 #include <linux/mailbox/zynqmp-ipi-message.h>
18 #include <linux/module.h>
20 #include <linux/of_address.h>
21 #include <linux/of_irq.h>
22 #include <linux/platform_device.h>
24 /* IPI agent ID any */
25 #define IPI_ID_ANY 0xFFUL
27 /* indicate if ZynqMP IPI mailbox driver uses SMC calls or HVC calls */
31 /* Default IPI SMC function IDs */
32 #define SMC_IPI_MAILBOX_OPEN 0x82001000U
33 #define SMC_IPI_MAILBOX_RELEASE 0x82001001U
34 #define SMC_IPI_MAILBOX_STATUS_ENQUIRY 0x82001002U
35 #define SMC_IPI_MAILBOX_NOTIFY 0x82001003U
36 #define SMC_IPI_MAILBOX_ACK 0x82001004U
37 #define SMC_IPI_MAILBOX_ENABLE_IRQ 0x82001005U
38 #define SMC_IPI_MAILBOX_DISABLE_IRQ 0x82001006U
41 #define IPI_SMC_ENQUIRY_DIRQ_MASK 0x00000001UL /* Flag to indicate if
42 * notification interrupt
45 #define IPI_SMC_ACK_EIRQ_MASK 0x00000001UL /* Flag to indicate if
46 * notification interrupt
50 /* IPI mailbox status */
51 #define IPI_MB_STATUS_IDLE 0
52 #define IPI_MB_STATUS_SEND_PENDING 1
53 #define IPI_MB_STATUS_RECV_PENDING 2
55 #define IPI_MB_CHNL_TX 0 /* IPI mailbox TX channel */
56 #define IPI_MB_CHNL_RX 1 /* IPI mailbox RX channel */
58 /* IPI Message Buffer Information */
59 #define RESP_OFFSET 0x20U
60 #define DEST_OFFSET 0x40U
61 #define IPI_BUF_SIZE 0x20U
62 #define DST_BIT_POS 9U
63 #define SRC_BITMASK GENMASK(11, 8)
70 static int tx_poll_period
= 5;
71 module_param_named(tx_poll_period
, tx_poll_period
, int, 0644);
72 MODULE_PARM_DESC(tx_poll_period
, "Poll period waiting for ack after send.");
75 * struct zynqmp_ipi_mchan - Description of a Xilinx ZynqMP IPI mailbox channel
76 * @is_opened: indicate if the IPI channel is opened
77 * @req_buf: local to remote request buffer start address
78 * @resp_buf: local to remote response buffer start address
79 * @req_buf_size: request buffer size
80 * @resp_buf_size: response buffer size
81 * @rx_buf: receive buffer to pass received message to client
82 * @chan_type: channel type
84 struct zynqmp_ipi_mchan
{
86 void __iomem
*req_buf
;
87 void __iomem
*resp_buf
;
91 unsigned int chan_type
;
94 struct zynqmp_ipi_mbox
;
96 typedef int (*setup_ipi_fn
)(struct zynqmp_ipi_mbox
*ipi_mbox
, struct device_node
*node
);
99 * struct zynqmp_ipi_mbox - Description of a ZynqMP IPI mailbox
101 * @pdata: pointer to the IPI private data
102 * @dev: device pointer corresponding to the Xilinx ZynqMP
104 * @remote_id: remote IPI agent ID
105 * @mbox: mailbox Controller
106 * @mchans: array for channels, tx channel and rx channel.
107 * @setup_ipi_fn: Function Pointer to set up IPI Channels
109 struct zynqmp_ipi_mbox
{
110 struct zynqmp_ipi_pdata
*pdata
;
113 struct mbox_controller mbox
;
114 struct zynqmp_ipi_mchan mchans
[2];
115 setup_ipi_fn setup_ipi_fn
;
119 * struct zynqmp_ipi_pdata - Description of z ZynqMP IPI agent platform data.
121 * @dev: device pointer corresponding to the Xilinx ZynqMP
123 * @irq: IPI agent interrupt ID
124 * @method: IPI SMC or HVC is going to be used
125 * @local_id: local IPI agent ID
126 * @virq_sgi: IRQ number mapped to SGI
127 * @num_mboxes: number of mailboxes of this IPI agent
128 * @ipi_mboxes: IPI mailboxes of this IPI agent
130 struct zynqmp_ipi_pdata
{
137 struct zynqmp_ipi_mbox ipi_mboxes
[] __counted_by(num_mboxes
);
140 static DEFINE_PER_CPU(struct zynqmp_ipi_pdata
*, per_cpu_pdata
);
142 static struct device_driver zynqmp_ipi_mbox_driver
= {
143 .owner
= THIS_MODULE
,
144 .name
= "zynqmp-ipi-mbox",
147 static void zynqmp_ipi_fw_call(struct zynqmp_ipi_mbox
*ipi_mbox
,
148 unsigned long a0
, unsigned long a3
,
149 struct arm_smccc_res
*res
)
151 struct zynqmp_ipi_pdata
*pdata
= ipi_mbox
->pdata
;
152 unsigned long a1
, a2
;
154 a1
= pdata
->local_id
;
155 a2
= ipi_mbox
->remote_id
;
156 if (pdata
->method
== USE_SMC
)
157 arm_smccc_smc(a0
, a1
, a2
, a3
, 0, 0, 0, 0, res
);
159 arm_smccc_hvc(a0
, a1
, a2
, a3
, 0, 0, 0, 0, res
);
163 * zynqmp_ipi_interrupt - Interrupt handler for IPI notification
165 * @irq: Interrupt number
166 * @data: ZynqMP IPI mailbox platform data.
168 * Return: -EINVAL if there is no instance
169 * IRQ_NONE if the interrupt is not ours.
170 * IRQ_HANDLED if the rx interrupt was successfully handled.
172 static irqreturn_t
zynqmp_ipi_interrupt(int irq
, void *data
)
174 struct zynqmp_ipi_pdata
*pdata
= data
;
175 struct mbox_chan
*chan
;
176 struct zynqmp_ipi_mbox
*ipi_mbox
;
177 struct zynqmp_ipi_mchan
*mchan
;
178 struct zynqmp_ipi_message
*msg
;
180 struct arm_smccc_res res
;
181 int ret
, i
, status
= IRQ_NONE
;
184 arg0
= SMC_IPI_MAILBOX_STATUS_ENQUIRY
;
185 arg3
= IPI_SMC_ENQUIRY_DIRQ_MASK
;
186 for (i
= 0; i
< pdata
->num_mboxes
; i
++) {
187 ipi_mbox
= &pdata
->ipi_mboxes
[i
];
188 mchan
= &ipi_mbox
->mchans
[IPI_MB_CHNL_RX
];
189 chan
= &ipi_mbox
->mbox
.chans
[IPI_MB_CHNL_RX
];
190 zynqmp_ipi_fw_call(ipi_mbox
, arg0
, arg3
, &res
);
191 ret
= (int)(res
.a0
& 0xFFFFFFFF);
192 if (ret
> 0 && ret
& IPI_MB_STATUS_RECV_PENDING
) {
193 if (mchan
->is_opened
) {
196 msg
->len
= mchan
->req_buf_size
;
197 memcpy_fromio(msg
->data
, mchan
->req_buf
,
200 mbox_chan_received_data(chan
, (void *)msg
);
201 status
= IRQ_HANDLED
;
208 static irqreturn_t
zynqmp_sgi_interrupt(int irq
, void *data
)
210 struct zynqmp_ipi_pdata
**pdata_ptr
= data
;
211 struct zynqmp_ipi_pdata
*pdata
= *pdata_ptr
;
213 return zynqmp_ipi_interrupt(irq
, pdata
);
217 * zynqmp_ipi_peek_data - Peek to see if there are any rx messages.
219 * @chan: Channel Pointer
221 * Return: 'true' if there is pending rx data, 'false' if there is none.
223 static bool zynqmp_ipi_peek_data(struct mbox_chan
*chan
)
225 struct device
*dev
= chan
->mbox
->dev
;
226 struct zynqmp_ipi_mbox
*ipi_mbox
= dev_get_drvdata(dev
);
227 struct zynqmp_ipi_mchan
*mchan
= chan
->con_priv
;
230 struct arm_smccc_res res
;
232 if (WARN_ON(!ipi_mbox
)) {
233 dev_err(dev
, "no platform drv data??\n");
237 arg0
= SMC_IPI_MAILBOX_STATUS_ENQUIRY
;
238 zynqmp_ipi_fw_call(ipi_mbox
, arg0
, 0, &res
);
239 ret
= (int)(res
.a0
& 0xFFFFFFFF);
241 if (mchan
->chan_type
== IPI_MB_CHNL_TX
) {
242 /* TX channel, check if the message has been acked
243 * by the remote, if yes, response is available.
245 if (ret
< 0 || ret
& IPI_MB_STATUS_SEND_PENDING
)
249 } else if (ret
> 0 && ret
& IPI_MB_STATUS_RECV_PENDING
) {
250 /* RX channel, check if there is message arrived. */
257 * zynqmp_ipi_last_tx_done - See if the last tx message is sent
259 * @chan: Channel pointer
261 * Return: 'true' is no pending tx data, 'false' if there are any.
263 static bool zynqmp_ipi_last_tx_done(struct mbox_chan
*chan
)
265 struct device
*dev
= chan
->mbox
->dev
;
266 struct zynqmp_ipi_mbox
*ipi_mbox
= dev_get_drvdata(dev
);
267 struct zynqmp_ipi_mchan
*mchan
= chan
->con_priv
;
270 struct arm_smccc_res res
;
272 if (WARN_ON(!ipi_mbox
)) {
273 dev_err(dev
, "no platform drv data??\n");
277 if (mchan
->chan_type
== IPI_MB_CHNL_TX
) {
278 /* We only need to check if the message been taken
279 * by the remote in the TX channel
281 arg0
= SMC_IPI_MAILBOX_STATUS_ENQUIRY
;
282 zynqmp_ipi_fw_call(ipi_mbox
, arg0
, 0, &res
);
283 /* Check the SMC call status, a0 of the result */
284 ret
= (int)(res
.a0
& 0xFFFFFFFF);
285 if (ret
< 0 || ret
& IPI_MB_STATUS_SEND_PENDING
)
289 /* Always true for the response message in RX channel */
294 * zynqmp_ipi_send_data - Send data
296 * @chan: Channel Pointer
297 * @data: Message Pointer
299 * Return: 0 if all goes good, else appropriate error messages.
301 static int zynqmp_ipi_send_data(struct mbox_chan
*chan
, void *data
)
303 struct device
*dev
= chan
->mbox
->dev
;
304 struct zynqmp_ipi_mbox
*ipi_mbox
= dev_get_drvdata(dev
);
305 struct zynqmp_ipi_mchan
*mchan
= chan
->con_priv
;
306 struct zynqmp_ipi_message
*msg
= data
;
308 struct arm_smccc_res res
;
310 if (WARN_ON(!ipi_mbox
)) {
311 dev_err(dev
, "no platform drv data??\n");
315 if (mchan
->chan_type
== IPI_MB_CHNL_TX
) {
316 /* Send request message */
317 if (msg
&& msg
->len
> mchan
->req_buf_size
&& mchan
->req_buf
) {
318 dev_err(dev
, "channel %d message length %u > max %lu\n",
319 mchan
->chan_type
, (unsigned int)msg
->len
,
320 mchan
->req_buf_size
);
323 if (msg
&& msg
->len
&& mchan
->req_buf
)
324 memcpy_toio(mchan
->req_buf
, msg
->data
, msg
->len
);
325 /* Kick IPI mailbox to send message */
326 arg0
= SMC_IPI_MAILBOX_NOTIFY
;
327 zynqmp_ipi_fw_call(ipi_mbox
, arg0
, 0, &res
);
329 /* Send response message */
330 if (msg
&& msg
->len
> mchan
->resp_buf_size
&& mchan
->resp_buf
) {
331 dev_err(dev
, "channel %d message length %u > max %lu\n",
332 mchan
->chan_type
, (unsigned int)msg
->len
,
333 mchan
->resp_buf_size
);
336 if (msg
&& msg
->len
&& mchan
->resp_buf
)
337 memcpy_toio(mchan
->resp_buf
, msg
->data
, msg
->len
);
338 arg0
= SMC_IPI_MAILBOX_ACK
;
339 zynqmp_ipi_fw_call(ipi_mbox
, arg0
, IPI_SMC_ACK_EIRQ_MASK
,
346 * zynqmp_ipi_startup - Startup the IPI channel
348 * @chan: Channel pointer
350 * Return: 0 if all goes good, else return corresponding error message
352 static int zynqmp_ipi_startup(struct mbox_chan
*chan
)
354 struct device
*dev
= chan
->mbox
->dev
;
355 struct zynqmp_ipi_mbox
*ipi_mbox
= dev_get_drvdata(dev
);
356 struct zynqmp_ipi_mchan
*mchan
= chan
->con_priv
;
358 struct arm_smccc_res res
;
360 unsigned int nchan_type
;
362 if (mchan
->is_opened
)
365 /* If no channel has been opened, open the IPI mailbox */
366 nchan_type
= (mchan
->chan_type
+ 1) % 2;
367 if (!ipi_mbox
->mchans
[nchan_type
].is_opened
) {
368 arg0
= SMC_IPI_MAILBOX_OPEN
;
369 zynqmp_ipi_fw_call(ipi_mbox
, arg0
, 0, &res
);
370 /* Check the SMC call status, a0 of the result */
371 ret
= (int)(res
.a0
& 0xFFFFFFFF);
373 dev_err(dev
, "SMC to open the IPI channel failed.\n");
379 /* If it is RX channel, enable the IPI notification interrupt */
380 if (mchan
->chan_type
== IPI_MB_CHNL_RX
) {
381 arg0
= SMC_IPI_MAILBOX_ENABLE_IRQ
;
382 zynqmp_ipi_fw_call(ipi_mbox
, arg0
, 0, &res
);
384 mchan
->is_opened
= 1;
390 * zynqmp_ipi_shutdown - Shutdown the IPI channel
392 * @chan: Channel pointer
394 static void zynqmp_ipi_shutdown(struct mbox_chan
*chan
)
396 struct device
*dev
= chan
->mbox
->dev
;
397 struct zynqmp_ipi_mbox
*ipi_mbox
= dev_get_drvdata(dev
);
398 struct zynqmp_ipi_mchan
*mchan
= chan
->con_priv
;
400 struct arm_smccc_res res
;
401 unsigned int chan_type
;
403 if (!mchan
->is_opened
)
406 /* If it is RX channel, disable notification interrupt */
407 chan_type
= mchan
->chan_type
;
408 if (chan_type
== IPI_MB_CHNL_RX
) {
409 arg0
= SMC_IPI_MAILBOX_DISABLE_IRQ
;
410 zynqmp_ipi_fw_call(ipi_mbox
, arg0
, 0, &res
);
412 /* Release IPI mailbox if no other channel is opened */
413 chan_type
= (chan_type
+ 1) % 2;
414 if (!ipi_mbox
->mchans
[chan_type
].is_opened
) {
415 arg0
= SMC_IPI_MAILBOX_RELEASE
;
416 zynqmp_ipi_fw_call(ipi_mbox
, arg0
, 0, &res
);
419 mchan
->is_opened
= 0;
422 /* ZynqMP IPI mailbox operations */
423 static const struct mbox_chan_ops zynqmp_ipi_chan_ops
= {
424 .startup
= zynqmp_ipi_startup
,
425 .shutdown
= zynqmp_ipi_shutdown
,
426 .peek_data
= zynqmp_ipi_peek_data
,
427 .last_tx_done
= zynqmp_ipi_last_tx_done
,
428 .send_data
= zynqmp_ipi_send_data
,
432 * zynqmp_ipi_of_xlate - Translate of phandle to IPI mailbox channel
434 * @mbox: mailbox controller pointer
435 * @p: phandle pointer
437 * Return: Mailbox channel, else return error pointer.
439 static struct mbox_chan
*zynqmp_ipi_of_xlate(struct mbox_controller
*mbox
,
440 const struct of_phandle_args
*p
)
442 struct mbox_chan
*chan
;
443 struct device
*dev
= mbox
->dev
;
444 unsigned int chan_type
;
446 /* Only supports TX and RX channels */
447 chan_type
= p
->args
[0];
448 if (chan_type
!= IPI_MB_CHNL_TX
&& chan_type
!= IPI_MB_CHNL_RX
) {
449 dev_err(dev
, "req chnl failure: invalid chnl type %u.\n",
451 return ERR_PTR(-EINVAL
);
453 chan
= &mbox
->chans
[chan_type
];
458 * zynqmp_ipi_mbox_get_buf_res - Get buffer resource from the IPI dev node
460 * @node: IPI mbox device child node
461 * @name: name of the IPI buffer
462 * @res: pointer to where the resource information will be stored.
464 * Return: 0 for success, negative value for failure
466 static int zynqmp_ipi_mbox_get_buf_res(struct device_node
*node
,
468 struct resource
*res
)
472 index
= of_property_match_string(node
, "reg-names", name
);
474 ret
= of_address_to_resource(node
, index
, res
);
483 * zynqmp_ipi_mbox_dev_release() - release the existence of a ipi mbox dev
485 * @dev: the ipi mailbox device
487 * This is to avoid the no device release() function kernel warning.
490 static void zynqmp_ipi_mbox_dev_release(struct device
*dev
)
496 * zynqmp_ipi_mbox_probe - probe IPI mailbox resource from device node
498 * @ipi_mbox: pointer to IPI mailbox private data structure
499 * @node: IPI mailbox device node
501 * Return: 0 for success, negative value for failure
503 static int zynqmp_ipi_mbox_probe(struct zynqmp_ipi_mbox
*ipi_mbox
,
504 struct device_node
*node
)
506 struct mbox_chan
*chans
;
507 struct mbox_controller
*mbox
;
508 struct device
*dev
, *mdev
;
511 dev
= ipi_mbox
->pdata
->dev
;
512 /* Initialize dev for IPI mailbox */
513 ipi_mbox
->dev
.parent
= dev
;
514 ipi_mbox
->dev
.release
= NULL
;
515 ipi_mbox
->dev
.of_node
= node
;
516 dev_set_name(&ipi_mbox
->dev
, "%s", of_node_full_name(node
));
517 dev_set_drvdata(&ipi_mbox
->dev
, ipi_mbox
);
518 ipi_mbox
->dev
.release
= zynqmp_ipi_mbox_dev_release
;
519 ipi_mbox
->dev
.driver
= &zynqmp_ipi_mbox_driver
;
520 ret
= device_register(&ipi_mbox
->dev
);
522 dev_err(dev
, "Failed to register ipi mbox dev.\n");
523 put_device(&ipi_mbox
->dev
);
526 mdev
= &ipi_mbox
->dev
;
528 /* Get the IPI remote agent ID */
529 ret
= of_property_read_u32(node
, "xlnx,ipi-id", &ipi_mbox
->remote_id
);
531 dev_err(dev
, "No IPI remote ID is specified.\n");
535 ret
= ipi_mbox
->setup_ipi_fn(ipi_mbox
, node
);
537 dev_err(dev
, "Failed to set up IPI Buffers.\n");
541 mbox
= &ipi_mbox
->mbox
;
543 mbox
->ops
= &zynqmp_ipi_chan_ops
;
545 mbox
->txdone_irq
= false;
546 mbox
->txdone_poll
= true;
547 mbox
->txpoll_period
= tx_poll_period
;
548 mbox
->of_xlate
= zynqmp_ipi_of_xlate
;
549 chans
= devm_kzalloc(mdev
, 2 * sizeof(*chans
), GFP_KERNEL
);
553 chans
[IPI_MB_CHNL_TX
].con_priv
= &ipi_mbox
->mchans
[IPI_MB_CHNL_TX
];
554 chans
[IPI_MB_CHNL_RX
].con_priv
= &ipi_mbox
->mchans
[IPI_MB_CHNL_RX
];
555 ipi_mbox
->mchans
[IPI_MB_CHNL_TX
].chan_type
= IPI_MB_CHNL_TX
;
556 ipi_mbox
->mchans
[IPI_MB_CHNL_RX
].chan_type
= IPI_MB_CHNL_RX
;
557 ret
= devm_mbox_controller_register(mdev
, mbox
);
560 "Failed to register mbox_controller(%d)\n", ret
);
563 "Registered ZynqMP IPI mbox with TX/RX channels.\n");
568 * zynqmp_ipi_setup - set up IPI Buffers for classic flow
570 * @ipi_mbox: pointer to IPI mailbox private data structure
571 * @node: IPI mailbox device node
573 * This will be used to set up IPI Buffers for ZynqMP SOC if user
574 * wishes to use classic driver usage model on new SOC's with only
577 * Note that bufferless IPIs and mixed usage of buffered and bufferless
578 * IPIs are not supported with this flow.
580 * This will be invoked with compatible string "xlnx,zynqmp-ipi-mailbox".
582 * Return: 0 for success, negative value for failure
584 static int zynqmp_ipi_setup(struct zynqmp_ipi_mbox
*ipi_mbox
,
585 struct device_node
*node
)
587 struct zynqmp_ipi_mchan
*mchan
;
593 mdev
= &ipi_mbox
->dev
;
595 mchan
= &ipi_mbox
->mchans
[IPI_MB_CHNL_TX
];
596 name
= "local_request_region";
597 ret
= zynqmp_ipi_mbox_get_buf_res(node
, name
, &res
);
599 mchan
->req_buf_size
= resource_size(&res
);
600 mchan
->req_buf
= devm_ioremap(mdev
, res
.start
,
601 mchan
->req_buf_size
);
602 if (!mchan
->req_buf
) {
603 dev_err(mdev
, "Unable to map IPI buffer I/O memory\n");
606 } else if (ret
!= -ENODEV
) {
607 dev_err(mdev
, "Unmatched resource %s, %d.\n", name
, ret
);
611 name
= "remote_response_region";
612 ret
= zynqmp_ipi_mbox_get_buf_res(node
, name
, &res
);
614 mchan
->resp_buf_size
= resource_size(&res
);
615 mchan
->resp_buf
= devm_ioremap(mdev
, res
.start
,
616 mchan
->resp_buf_size
);
617 if (!mchan
->resp_buf
) {
618 dev_err(mdev
, "Unable to map IPI buffer I/O memory\n");
621 } else if (ret
!= -ENODEV
) {
622 dev_err(mdev
, "Unmatched resource %s.\n", name
);
625 mchan
->rx_buf
= devm_kzalloc(mdev
,
626 mchan
->resp_buf_size
+
627 sizeof(struct zynqmp_ipi_message
),
632 mchan
= &ipi_mbox
->mchans
[IPI_MB_CHNL_RX
];
633 name
= "remote_request_region";
634 ret
= zynqmp_ipi_mbox_get_buf_res(node
, name
, &res
);
636 mchan
->req_buf_size
= resource_size(&res
);
637 mchan
->req_buf
= devm_ioremap(mdev
, res
.start
,
638 mchan
->req_buf_size
);
639 if (!mchan
->req_buf
) {
640 dev_err(mdev
, "Unable to map IPI buffer I/O memory\n");
643 } else if (ret
!= -ENODEV
) {
644 dev_err(mdev
, "Unmatched resource %s.\n", name
);
648 name
= "local_response_region";
649 ret
= zynqmp_ipi_mbox_get_buf_res(node
, name
, &res
);
651 mchan
->resp_buf_size
= resource_size(&res
);
652 mchan
->resp_buf
= devm_ioremap(mdev
, res
.start
,
653 mchan
->resp_buf_size
);
654 if (!mchan
->resp_buf
) {
655 dev_err(mdev
, "Unable to map IPI buffer I/O memory\n");
658 } else if (ret
!= -ENODEV
) {
659 dev_err(mdev
, "Unmatched resource %s.\n", name
);
662 mchan
->rx_buf
= devm_kzalloc(mdev
,
663 mchan
->resp_buf_size
+
664 sizeof(struct zynqmp_ipi_message
),
673 * versal_ipi_setup - Set up IPIs to support mixed usage of
674 * Buffered and Bufferless IPIs.
676 * @ipi_mbox: pointer to IPI mailbox private data structure
677 * @node: IPI mailbox device node
679 * Return: 0 for success, negative value for failure
681 static int versal_ipi_setup(struct zynqmp_ipi_mbox
*ipi_mbox
,
682 struct device_node
*node
)
684 struct zynqmp_ipi_mchan
*tx_mchan
, *rx_mchan
;
685 struct resource host_res
, remote_res
;
686 struct device_node
*parent_node
;
687 int host_idx
, remote_idx
;
690 tx_mchan
= &ipi_mbox
->mchans
[IPI_MB_CHNL_TX
];
691 rx_mchan
= &ipi_mbox
->mchans
[IPI_MB_CHNL_RX
];
692 parent_node
= of_get_parent(node
);
693 mdev
= &ipi_mbox
->dev
;
695 host_idx
= zynqmp_ipi_mbox_get_buf_res(parent_node
, "msg", &host_res
);
696 remote_idx
= zynqmp_ipi_mbox_get_buf_res(node
, "msg", &remote_res
);
699 * Only set up buffers if both sides claim to have msg buffers.
700 * This is because each buffered IPI's corresponding msg buffers
701 * are reserved for use by other buffered IPI's.
703 if (!host_idx
&& !remote_idx
) {
704 u32 host_src
, host_dst
, remote_src
, remote_dst
;
707 buff_sz
= resource_size(&host_res
);
709 host_src
= host_res
.start
& SRC_BITMASK
;
710 remote_src
= remote_res
.start
& SRC_BITMASK
;
712 host_dst
= (host_src
>> DST_BIT_POS
) * DEST_OFFSET
;
713 remote_dst
= (remote_src
>> DST_BIT_POS
) * DEST_OFFSET
;
715 /* Validate that IPI IDs is within IPI Message buffer space. */
716 if (host_dst
>= buff_sz
|| remote_dst
>= buff_sz
) {
718 "Invalid IPI Message buffer values: %x %x\n",
719 host_dst
, remote_dst
);
723 tx_mchan
->req_buf
= devm_ioremap(mdev
,
724 host_res
.start
| remote_dst
,
726 if (!tx_mchan
->req_buf
) {
727 dev_err(mdev
, "Unable to map IPI buffer I/O memory\n");
731 tx_mchan
->resp_buf
= devm_ioremap(mdev
,
732 (remote_res
.start
| host_dst
) +
733 RESP_OFFSET
, IPI_BUF_SIZE
);
734 if (!tx_mchan
->resp_buf
) {
735 dev_err(mdev
, "Unable to map IPI buffer I/O memory\n");
739 rx_mchan
->req_buf
= devm_ioremap(mdev
,
740 remote_res
.start
| host_dst
,
742 if (!rx_mchan
->req_buf
) {
743 dev_err(mdev
, "Unable to map IPI buffer I/O memory\n");
747 rx_mchan
->resp_buf
= devm_ioremap(mdev
,
748 (host_res
.start
| remote_dst
) +
749 RESP_OFFSET
, IPI_BUF_SIZE
);
750 if (!rx_mchan
->resp_buf
) {
751 dev_err(mdev
, "Unable to map IPI buffer I/O memory\n");
755 tx_mchan
->resp_buf_size
= IPI_BUF_SIZE
;
756 tx_mchan
->req_buf_size
= IPI_BUF_SIZE
;
757 tx_mchan
->rx_buf
= devm_kzalloc(mdev
, IPI_BUF_SIZE
+
758 sizeof(struct zynqmp_ipi_message
),
760 if (!tx_mchan
->rx_buf
)
763 rx_mchan
->resp_buf_size
= IPI_BUF_SIZE
;
764 rx_mchan
->req_buf_size
= IPI_BUF_SIZE
;
765 rx_mchan
->rx_buf
= devm_kzalloc(mdev
, IPI_BUF_SIZE
+
766 sizeof(struct zynqmp_ipi_message
),
768 if (!rx_mchan
->rx_buf
)
775 static int xlnx_mbox_cpuhp_start(unsigned int cpu
)
777 struct zynqmp_ipi_pdata
*pdata
;
779 pdata
= get_cpu_var(per_cpu_pdata
);
780 put_cpu_var(per_cpu_pdata
);
781 enable_percpu_irq(pdata
->virq_sgi
, IRQ_TYPE_NONE
);
786 static int xlnx_mbox_cpuhp_down(unsigned int cpu
)
788 struct zynqmp_ipi_pdata
*pdata
;
790 pdata
= get_cpu_var(per_cpu_pdata
);
791 put_cpu_var(per_cpu_pdata
);
792 disable_percpu_irq(pdata
->virq_sgi
);
797 static void xlnx_disable_percpu_irq(void *data
)
799 struct zynqmp_ipi_pdata
*pdata
;
801 pdata
= *this_cpu_ptr(&per_cpu_pdata
);
803 disable_percpu_irq(pdata
->virq_sgi
);
806 static int xlnx_mbox_init_sgi(struct platform_device
*pdev
,
808 struct zynqmp_ipi_pdata
*pdata
)
814 * IRQ related structures are used for the following:
815 * for each SGI interrupt ensure its mapped by GIC IRQ domain
816 * and that each corresponding linux IRQ for the HW IRQ has
817 * a handler for when receiving an interrupt from the remote
820 struct irq_domain
*domain
;
821 struct irq_fwspec sgi_fwspec
;
822 struct device_node
*interrupt_parent
= NULL
;
823 struct device
*dev
= &pdev
->dev
;
825 /* Find GIC controller to map SGIs. */
826 interrupt_parent
= of_irq_find_parent(dev
->of_node
);
827 if (!interrupt_parent
) {
828 dev_err(&pdev
->dev
, "Failed to find property for Interrupt parent\n");
832 /* Each SGI needs to be associated with GIC's IRQ domain. */
833 domain
= irq_find_host(interrupt_parent
);
834 of_node_put(interrupt_parent
);
836 /* Each mapping needs GIC domain when finding IRQ mapping. */
837 sgi_fwspec
.fwnode
= domain
->fwnode
;
840 * When irq domain looks at mapping each arg is as follows:
841 * 3 args for: interrupt type (SGI), interrupt # (set later), type
843 sgi_fwspec
.param_count
= 1;
845 /* Set SGI's hwirq */
846 sgi_fwspec
.param
[0] = sgi_num
;
847 pdata
->virq_sgi
= irq_create_fwspec_mapping(&sgi_fwspec
);
849 for_each_possible_cpu(cpu
)
850 per_cpu(per_cpu_pdata
, cpu
) = pdata
;
852 ret
= request_percpu_irq(pdata
->virq_sgi
, zynqmp_sgi_interrupt
, pdev
->name
,
856 irq_dispose_mapping(pdata
->virq_sgi
);
860 irq_set_status_flags(pdata
->virq_sgi
, IRQ_PER_CPU
);
862 /* Setup function for the CPU hot-plug cases */
863 cpuhp_setup_state(CPUHP_AP_ONLINE_DYN
, "mailbox/sgi:starting",
864 xlnx_mbox_cpuhp_start
, xlnx_mbox_cpuhp_down
);
869 static void xlnx_mbox_cleanup_sgi(struct zynqmp_ipi_pdata
*pdata
)
871 cpuhp_remove_state(CPUHP_AP_ONLINE_DYN
);
873 on_each_cpu(xlnx_disable_percpu_irq
, NULL
, 1);
875 irq_clear_status_flags(pdata
->virq_sgi
, IRQ_PER_CPU
);
876 free_percpu_irq(pdata
->virq_sgi
, &per_cpu_pdata
);
877 irq_dispose_mapping(pdata
->virq_sgi
);
881 * zynqmp_ipi_free_mboxes - Free IPI mailboxes devices
883 * @pdata: IPI private data
885 static void zynqmp_ipi_free_mboxes(struct zynqmp_ipi_pdata
*pdata
)
887 struct zynqmp_ipi_mbox
*ipi_mbox
;
890 if (pdata
->irq
< MAX_SGI
)
891 xlnx_mbox_cleanup_sgi(pdata
);
893 i
= pdata
->num_mboxes
;
894 for (; i
>= 0; i
--) {
895 ipi_mbox
= &pdata
->ipi_mboxes
[i
];
896 if (ipi_mbox
->dev
.parent
) {
897 mbox_controller_unregister(&ipi_mbox
->mbox
);
898 if (device_is_registered(&ipi_mbox
->dev
))
899 device_unregister(&ipi_mbox
->dev
);
904 static int zynqmp_ipi_probe(struct platform_device
*pdev
)
906 struct device
*dev
= &pdev
->dev
;
907 struct device_node
*nc
, *np
= pdev
->dev
.of_node
;
908 struct zynqmp_ipi_pdata __percpu
*pdata
;
909 struct of_phandle_args out_irq
;
910 struct zynqmp_ipi_mbox
*mbox
;
911 int num_mboxes
, ret
= -EINVAL
;
914 num_mboxes
= of_get_available_child_count(np
);
915 if (num_mboxes
== 0) {
916 dev_err(dev
, "mailbox nodes not available\n");
920 pdata
= devm_kzalloc(dev
, struct_size(pdata
, ipi_mboxes
, num_mboxes
),
926 /* Get the IPI local agents ID */
927 ret
= of_property_read_u32(np
, "xlnx,ipi-id", &pdata
->local_id
);
929 dev_err(dev
, "No IPI local ID is specified.\n");
933 ipi_fn
= (setup_ipi_fn
)device_get_match_data(&pdev
->dev
);
936 "Mbox Compatible String is missing IPI Setup fn.\n");
940 pdata
->num_mboxes
= num_mboxes
;
942 mbox
= pdata
->ipi_mboxes
;
943 for_each_available_child_of_node(np
, nc
) {
945 mbox
->setup_ipi_fn
= ipi_fn
;
947 ret
= zynqmp_ipi_mbox_probe(mbox
, nc
);
950 dev_err(dev
, "failed to probe subdev.\n");
957 ret
= of_irq_parse_one(dev_of_node(dev
), 0, &out_irq
);
959 dev_err(dev
, "failed to parse interrupts\n");
962 ret
= out_irq
.args
[1];
965 * If Interrupt number is in SGI range, then request SGI else request
970 ret
= xlnx_mbox_init_sgi(pdev
, pdata
->irq
, pdata
);
974 ret
= platform_get_irq(pdev
, 0);
979 ret
= devm_request_irq(dev
, pdata
->irq
, zynqmp_ipi_interrupt
,
980 IRQF_SHARED
, dev_name(dev
), pdata
);
984 dev_err(dev
, "IRQ %d is not requested successfully.\n",
989 platform_set_drvdata(pdev
, pdata
);
993 zynqmp_ipi_free_mboxes(pdata
);
997 static void zynqmp_ipi_remove(struct platform_device
*pdev
)
999 struct zynqmp_ipi_pdata
*pdata
;
1001 pdata
= platform_get_drvdata(pdev
);
1002 zynqmp_ipi_free_mboxes(pdata
);
1005 static const struct of_device_id zynqmp_ipi_of_match
[] = {
1006 { .compatible
= "xlnx,zynqmp-ipi-mailbox",
1007 .data
= &zynqmp_ipi_setup
,
1009 { .compatible
= "xlnx,versal-ipi-mailbox",
1010 .data
= &versal_ipi_setup
,
1014 MODULE_DEVICE_TABLE(of
, zynqmp_ipi_of_match
);
1016 static struct platform_driver zynqmp_ipi_driver
= {
1017 .probe
= zynqmp_ipi_probe
,
1018 .remove
= zynqmp_ipi_remove
,
1020 .name
= "zynqmp-ipi",
1021 .of_match_table
= of_match_ptr(zynqmp_ipi_of_match
),
1025 static int __init
zynqmp_ipi_init(void)
1027 return platform_driver_register(&zynqmp_ipi_driver
);
1029 subsys_initcall(zynqmp_ipi_init
);
1031 static void __exit
zynqmp_ipi_exit(void)
1033 platform_driver_unregister(&zynqmp_ipi_driver
);
1035 module_exit(zynqmp_ipi_exit
);
1037 MODULE_LICENSE("GPL v2");
1038 MODULE_DESCRIPTION("Xilinx ZynqMP IPI Mailbox driver");
1039 MODULE_AUTHOR("Xilinx Inc.");