Skip to content

Commit

Permalink
feat(ipc_interrupt): enable ipc delivery via interrupt in Linux
Browse files Browse the repository at this point in the history
- register ipc_message_handler to receive ipc notification in
  bao-ipcshmem driver
- modify configs to define interrupt_offset in Linux VM
- call bao_ipcshmem_notify in uart_rx_handler in Zephyr

On success, a message like below will appear in dmesg:

[   12.881296] ipc message: freertos has received 1 uart interrupts!

Tested:
- qemu-aarch64-virt
  - linux+freertos
  - linux+zephyr
- rpi4
  - linux+freertos
  • Loading branch information
clachan committed Jul 17, 2023
1 parent ec2e542 commit 21ec0d6
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 3 deletions.
3 changes: 2 additions & 1 deletion demos/linux+freertos/configs/qemu-aarch64-virt.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ struct config config = {
.size = 0x00010000,
.shmem_id = 0,
.interrupt_num = 1,
.interrupts = (irqid_t[]) {52}
.interrupts = (irqid_t[]) {52},
.interrupt_offset = 32
}
},

Expand Down
3 changes: 2 additions & 1 deletion demos/linux+freertos/configs/rpi4.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ struct config config = {
.size = 0x00010000,
.shmem_id = 0,
.interrupt_num = 1,
.interrupts = (irqid_t[]) {52}
.interrupts = (irqid_t[]) {52},
.interrupt_offset = 32
}
},

Expand Down
3 changes: 2 additions & 1 deletion demos/linux+zephyr/configs/qemu-aarch64-virt.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ struct config config = {
.size = 0x00004000,
.shmem_id = 0,
.interrupt_num = 1,
.interrupts = (irqid_t[]) {52}
.interrupts = (irqid_t[]) {52},
.interrupt_offset = 32
}
},

Expand Down
1 change: 1 addition & 0 deletions demos/linux+zephyr/zephyr/app/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ void uart_rx_handler() {
snprintf(msg, MSG_SIZE,
"zephyr has received %ld uart interrupts!\n", irq_count);
bao_ipcshmem_write(shmem, msg, strnlen(msg, MSG_SIZE)+1);
bao_ipcshmem_notify(shmem);
}

void shmem_irq_handler(const struct device *dev) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
From 602da8977a7af47c22e8c79cf6ec70b2d48a8a74 Mon Sep 17 00:00:00 2001
From: Clay Chang <[email protected]>
Date: Mon, 17 Jul 2023 18:49:55 +0800
Subject: [PATCH 3/3] bao-ipcshmem: receive ipc message from ipc interrupt

---
drivers/bao/bao-ipcshmem.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)

diff --git a/drivers/bao/bao-ipcshmem.c b/drivers/bao/bao-ipcshmem.c
index e9cc304ea..6bc6332fd 100644
--- a/drivers/bao/bao-ipcshmem.c
+++ b/drivers/bao/bao-ipcshmem.c
@@ -181,6 +181,15 @@ static struct file_operations bao_ipcshmem_fops = {
.release = bao_ipcshmem_release_fops
};

+static irqreturn_t ipc_message_handler(int irq, void *data)
+{
+ struct bao_ipcshmem *bao = (struct bao_ipcshmem *)data;
+
+ pr_info("ipc message: %s", (char *)bao->read_base);
+
+ return IRQ_HANDLED;
+}
+
int bao_ipcshmem_register(struct platform_device *pdev)
{
int ret = 0;
@@ -194,6 +203,7 @@ int bao_ipcshmem_register(struct platform_device *pdev)
bool rd_in_range, wr_in_range, disjoint;
void* shmem_base_addr = NULL;
int id = -1;
+ unsigned int irq;
struct bao_ipcshmem *bao;

r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -241,6 +251,13 @@ int bao_ipcshmem_register(struct platform_device *pdev)
bao->write_base = shmem_base_addr + write_offset;
bao->physical_base = (void *)r->start;

+ irq = platform_get_irq(pdev, 0);
+ ret = devm_request_irq(&pdev->dev, irq, ipc_message_handler, IRQF_TRIGGER_RISING /*| IRQF_TRIGGER_FALLING*/, bao->label, (void *)bao);
+ if (ret != 0) {
+ pr_err("failed to request irq: ret=%d\n", ret);
+ goto err_unmap;
+ }
+
cdev_init(&bao->cdev, &bao_ipcshmem_fops);
bao->cdev.owner = owner;

--
2.34.1

0 comments on commit 21ec0d6

Please sign in to comment.