1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Copyright (C) 2021 Western Digital Corporation or its affiliates.
4 * Copyright (C) 2022 Ventana Micro Systems Inc.
5 */
6
7#ifndef _IRQ_RISCV_APLIC_MAIN_H
8#define _IRQ_RISCV_APLIC_MAIN_H
9
10#include <linux/device.h>
11#include <linux/io.h>
12#include <linux/irq.h>
13#include <linux/irqdomain.h>
14#include <linux/fwnode.h>
15
16#define APLIC_DEFAULT_PRIORITY		1
17
18struct aplic_msicfg {
19	phys_addr_t		base_ppn;
20	u32			hhxs;
21	u32			hhxw;
22	u32			lhxs;
23	u32			lhxw;
24};
25
26struct aplic_priv {
27	struct device		*dev;
28	u32			gsi_base;
29	u32			nr_irqs;
30	u32			nr_idcs;
31	void __iomem		*regs;
32	struct aplic_msicfg	msicfg;
33};
34
35void aplic_irq_unmask(struct irq_data *d);
36void aplic_irq_mask(struct irq_data *d);
37int aplic_irq_set_type(struct irq_data *d, unsigned int type);
38int aplic_irqdomain_translate(struct irq_fwspec *fwspec, u32 gsi_base,
39			      unsigned long *hwirq, unsigned int *type);
40void aplic_init_hw_global(struct aplic_priv *priv, bool msi_mode);
41int aplic_setup_priv(struct aplic_priv *priv, struct device *dev, void __iomem *regs);
42int aplic_direct_setup(struct device *dev, void __iomem *regs);
43#ifdef CONFIG_RISCV_APLIC_MSI
44int aplic_msi_setup(struct device *dev, void __iomem *regs);
45#else
46static inline int aplic_msi_setup(struct device *dev, void __iomem *regs)
47{
48	return -ENODEV;
49}
50#endif
51
52#endif
53