Lines Matching full:ipc
3 * Microchip Inter-Processor communication (IPC) driver
21 #include <linux/mailbox/mchp-ipc.h>
44 * struct mchp_ipc_mbox_info - IPC probe message format
46 * @hw_type: IPC implementation available in the hardware
47 * @num_channels: number of IPC channels available in the hardware
49 * Used to retrieve information on the IPC implementation
58 * struct mchp_ipc_init - IPC channel init message format
70 * struct mchp_ipc_status - IPC status message format
85 * struct mchp_ipc_sbi_msg - IPC SBI payload message
93 * the IPC.
173 struct mchp_ipc_sbi_mbox *ipc = (struct mchp_ipc_sbi_mbox *)data; in mchp_ipc_cluster_aggr_isr() local
183 if (irq == ipc->cluster_cfg[hartid].irq) in mchp_ipc_cluster_aggr_isr()
188 memcpy(ipc->cluster_cfg[hartid].buf_base, &status_msg, sizeof(struct mchp_ipc_status)); in mchp_ipc_cluster_aggr_isr()
190 ret = mchp_ipc_sbi_send(SBI_EXT_IPC_STATUS, ipc->cluster_cfg[hartid].buf_base_addr); in mchp_ipc_cluster_aggr_isr()
192 dev_err_ratelimited(ipc->dev, "could not get IHC irq status ret=%d\n", ret); in mchp_ipc_cluster_aggr_isr()
196 memcpy(&status_msg, ipc->cluster_cfg[hartid].buf_base, sizeof(struct mchp_ipc_status)); in mchp_ipc_cluster_aggr_isr()
219 * are unique across all clusters of an IPC, and iterate contiguously in mchp_ipc_cluster_aggr_isr()
224 chan = &ipc->chans[chan_id]; in mchp_ipc_cluster_aggr_isr()
235 mbox_chan_received_data(&ipc->chans[chan_id], (void *)&ipc_msg); in mchp_ipc_cluster_aggr_isr()
240 mbox_chan_txdone(&ipc->chans[chan_id], ret); in mchp_ipc_cluster_aggr_isr()
263 struct mchp_ipc_sbi_mbox *ipc = to_mchp_ipc_mbox(chan->mbox); in mchp_ipc_startup() local
294 dev_err(ipc->dev, "channel %u init failed\n", chan_info->id); in mchp_ipc_startup()
317 switch (ipc->hw_type) { in mchp_ipc_startup()
325 dev_err(ipc->dev, "failed to register interrupt(s)\n"); in mchp_ipc_startup()
362 struct mchp_ipc_sbi_mbox *ipc = to_mchp_ipc_mbox(controller); in mchp_ipc_mbox_xlate() local
365 if (chan_id >= ipc->controller.num_chans) { in mchp_ipc_mbox_xlate()
366 dev_err(ipc->dev, "invalid channel id %d\n", chan_id); in mchp_ipc_mbox_xlate()
370 return &ipc->chans[chan_id]; in mchp_ipc_mbox_xlate()
373 static int mchp_ipc_get_cluster_aggr_irq(struct mchp_ipc_sbi_mbox *ipc) in mchp_ipc_get_cluster_aggr_irq() argument
375 struct platform_device *pdev = to_platform_device(ipc->dev); in mchp_ipc_get_cluster_aggr_irq()
383 irq_name = devm_kasprintf(ipc->dev, GFP_KERNEL, "hart-%lu", hartid); in mchp_ipc_get_cluster_aggr_irq()
388 ipc->cluster_cfg[hartid].irq = ret; in mchp_ipc_get_cluster_aggr_irq()
389 ret = devm_request_irq(ipc->dev, ipc->cluster_cfg[hartid].irq, in mchp_ipc_get_cluster_aggr_irq()
391 "miv-ihc-irq", ipc); in mchp_ipc_get_cluster_aggr_irq()
395 ipc->cluster_cfg[hartid].buf_base = devm_kmalloc(ipc->dev, in mchp_ipc_get_cluster_aggr_irq()
399 if (!ipc->cluster_cfg[hartid].buf_base) in mchp_ipc_get_cluster_aggr_irq()
402 ipc->cluster_cfg[hartid].buf_base_addr = __pa(ipc->cluster_cfg[hartid].buf_base); in mchp_ipc_get_cluster_aggr_irq()
414 struct mchp_ipc_sbi_mbox *ipc; in mchp_ipc_probe() local
424 ipc = devm_kzalloc(dev, sizeof(*ipc), GFP_KERNEL); in mchp_ipc_probe()
425 if (!ipc) in mchp_ipc_probe()
428 platform_set_drvdata(pdev, ipc); in mchp_ipc_probe()
430 ipc->buf_base = devm_kmalloc(dev, sizeof(struct mchp_ipc_mbox_info), GFP_KERNEL); in mchp_ipc_probe()
431 if (!ipc->buf_base) in mchp_ipc_probe()
434 ipc->buf_base_addr = __pa(ipc->buf_base); in mchp_ipc_probe()
436 ret = mchp_ipc_sbi_send(SBI_EXT_IPC_PROBE, ipc->buf_base_addr); in mchp_ipc_probe()
438 return dev_err_probe(dev, ret, "could not probe IPC SBI service\n"); in mchp_ipc_probe()
440 memcpy(&ipc_info, ipc->buf_base, sizeof(struct mchp_ipc_mbox_info)); in mchp_ipc_probe()
441 ipc->controller.num_chans = ipc_info.num_channels; in mchp_ipc_probe()
442 ipc->hw_type = ipc_info.hw_type; in mchp_ipc_probe()
444 ipc->chans = devm_kcalloc(dev, ipc->controller.num_chans, sizeof(*ipc->chans), GFP_KERNEL); in mchp_ipc_probe()
445 if (!ipc->chans) in mchp_ipc_probe()
448 ipc->dev = dev; in mchp_ipc_probe()
449 ipc->controller.txdone_irq = true; in mchp_ipc_probe()
450 ipc->controller.dev = ipc->dev; in mchp_ipc_probe()
451 ipc->controller.ops = &mchp_ipc_ops; in mchp_ipc_probe()
452 ipc->controller.chans = ipc->chans; in mchp_ipc_probe()
453 ipc->controller.of_xlate = mchp_ipc_mbox_xlate; in mchp_ipc_probe()
455 for (chan_id = 0; chan_id < ipc->controller.num_chans; chan_id++) { in mchp_ipc_probe()
460 ipc->chans[chan_id].con_priv = priv; in mchp_ipc_probe()
464 if (ipc->hw_type == MIV_IHC) { in mchp_ipc_probe()
465 ipc->cluster_cfg = devm_kcalloc(dev, num_online_cpus(), in mchp_ipc_probe()
468 if (!ipc->cluster_cfg) in mchp_ipc_probe()
471 if (mchp_ipc_get_cluster_aggr_irq(ipc)) in mchp_ipc_probe()
478 ret = devm_mbox_controller_register(dev, &ipc->controller); in mchp_ipc_probe()
481 "Inter-Processor communication (IPC) registration failed\n"); in mchp_ipc_probe()
487 {.compatible = "microchip,sbi-ipc", },
504 MODULE_DESCRIPTION("Microchip Inter-Processor Communication (IPC) driver");