From 86914c9e0be80a2050283b7a4e0acf4c1faad844 Mon Sep 17 00:00:00 2001 From: Clay Chang Date: Mon, 17 Jul 2023 21:16:50 +0800 Subject: [PATCH] feat(ipc_interrupt): enable ipc delivery via interrupt in Linux - 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 Tested: - qemu-aarch64-virt - linux+freertos - linux+zephyr - rip4 - linux+freertos --- .../configs/qemu-aarch64-virt.c | 3 +- demos/linux+freertos/configs/rpi4.c | 3 +- .../linux+zephyr/configs/qemu-aarch64-virt.c | 3 +- demos/linux+zephyr/zephyr/app/src/main.c | 1 + ...ceive-ipc-message-from-ipc-interrupt.patch | 54 +++++++++++++++++++ 5 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 guests/linux/patches/v6.1/0003-bao-ipcshmem-receive-ipc-message-from-ipc-interrupt.patch diff --git a/demos/linux+freertos/configs/qemu-aarch64-virt.c b/demos/linux+freertos/configs/qemu-aarch64-virt.c index f2d4778..34eaa4e 100755 --- a/demos/linux+freertos/configs/qemu-aarch64-virt.c +++ b/demos/linux+freertos/configs/qemu-aarch64-virt.c @@ -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 } }, diff --git a/demos/linux+freertos/configs/rpi4.c b/demos/linux+freertos/configs/rpi4.c index ee06c67..bd6259d 100755 --- a/demos/linux+freertos/configs/rpi4.c +++ b/demos/linux+freertos/configs/rpi4.c @@ -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 } }, diff --git a/demos/linux+zephyr/configs/qemu-aarch64-virt.c b/demos/linux+zephyr/configs/qemu-aarch64-virt.c index f5a21ef..2c4e6b2 100644 --- a/demos/linux+zephyr/configs/qemu-aarch64-virt.c +++ b/demos/linux+zephyr/configs/qemu-aarch64-virt.c @@ -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 } }, diff --git a/demos/linux+zephyr/zephyr/app/src/main.c b/demos/linux+zephyr/zephyr/app/src/main.c index f563fcf..3128f80 100644 --- a/demos/linux+zephyr/zephyr/app/src/main.c +++ b/demos/linux+zephyr/zephyr/app/src/main.c @@ -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) { diff --git a/guests/linux/patches/v6.1/0003-bao-ipcshmem-receive-ipc-message-from-ipc-interrupt.patch b/guests/linux/patches/v6.1/0003-bao-ipcshmem-receive-ipc-message-from-ipc-interrupt.patch new file mode 100644 index 0000000..3b0579a --- /dev/null +++ b/guests/linux/patches/v6.1/0003-bao-ipcshmem-receive-ipc-message-from-ipc-interrupt.patch @@ -0,0 +1,54 @@ +From 602da8977a7af47c22e8c79cf6ec70b2d48a8a74 Mon Sep 17 00:00:00 2001 +From: Clay Chang +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 +