1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2021 Marvell.
9 #include "roc_bphy_irq.h"
11 #define ROC_BPHY_MEMZONE_NAME "roc_bphy_mz"
12 #define ROC_BPHY_CTR_DEV_PATH "/dev/otx-bphy-ctr"
14 #define ROC_BPHY_IOC_MAGIC 0xF3
15 #define ROC_BPHY_IOC_GET_BPHY_MAX_IRQ _IOR(ROC_BPHY_IOC_MAGIC, 3, uint64_t)
16 #define ROC_BPHY_IOC_GET_BPHY_BMASK_IRQ _IOR(ROC_BPHY_IOC_MAGIC, 4, uint64_t)
18 struct roc_bphy_irq_chip *
19 roc_bphy_intr_init(void)
21 struct roc_bphy_irq_chip *irq_chip;
22 uint64_t max_irq, i, avail_irqs;
25 fd = open(ROC_BPHY_CTR_DEV_PATH, O_RDWR | O_SYNC);
27 plt_err("Failed to open %s", ROC_BPHY_CTR_DEV_PATH);
31 ret = ioctl(fd, ROC_BPHY_IOC_GET_BPHY_MAX_IRQ, &max_irq);
33 plt_err("Failed to get max irq number via ioctl");
37 ret = ioctl(fd, ROC_BPHY_IOC_GET_BPHY_BMASK_IRQ, &avail_irqs);
39 plt_err("Failed to get available irqs bitmask via ioctl");
43 irq_chip = plt_zmalloc(sizeof(*irq_chip), 0);
44 if (irq_chip == NULL) {
45 plt_err("Failed to alloc irq_chip");
50 irq_chip->max_irq = max_irq;
51 irq_chip->avail_irq_bmask = avail_irqs;
53 plt_zmalloc(irq_chip->max_irq * sizeof(*irq_chip->irq_vecs), 0);
54 if (irq_chip->irq_vecs == NULL) {
55 plt_err("Failed to alloc irq_chip irq_vecs");
59 irq_chip->mz_name = plt_zmalloc(strlen(ROC_BPHY_MEMZONE_NAME) + 1, 0);
60 if (irq_chip->mz_name == NULL) {
61 plt_err("Failed to alloc irq_chip name");
64 plt_strlcpy(irq_chip->mz_name, ROC_BPHY_MEMZONE_NAME,
65 strlen(ROC_BPHY_MEMZONE_NAME) + 1);
67 for (i = 0; i < irq_chip->max_irq; i++) {
68 irq_chip->irq_vecs[i].fd = -1;
69 irq_chip->irq_vecs[i].handler_cpu = -1;
75 plt_free(irq_chip->irq_vecs);
87 roc_bphy_intr_fini(struct roc_bphy_irq_chip *irq_chip)
92 close(irq_chip->intfd);
93 plt_free(irq_chip->mz_name);
94 plt_free(irq_chip->irq_vecs);