162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright 2016,2017 IBM Corporation.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci#ifndef __XIVE_INTERNAL_H
662306a36Sopenharmony_ci#define __XIVE_INTERNAL_H
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci/*
962306a36Sopenharmony_ci * A "disabled" interrupt should never fire, to catch problems
1062306a36Sopenharmony_ci * we set its logical number to this
1162306a36Sopenharmony_ci */
1262306a36Sopenharmony_ci#define XIVE_BAD_IRQ		0x7fffffff
1362306a36Sopenharmony_ci#define XIVE_MAX_IRQ		(XIVE_BAD_IRQ - 1)
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/* Each CPU carry one of these with various per-CPU state */
1662306a36Sopenharmony_cistruct xive_cpu {
1762306a36Sopenharmony_ci#ifdef CONFIG_SMP
1862306a36Sopenharmony_ci	/* HW irq number and data of IPI */
1962306a36Sopenharmony_ci	u32 hw_ipi;
2062306a36Sopenharmony_ci	struct xive_irq_data ipi_data;
2162306a36Sopenharmony_ci#endif /* CONFIG_SMP */
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	int chip_id;
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	/* Queue datas. Only one is populated */
2662306a36Sopenharmony_ci#define XIVE_MAX_QUEUES	8
2762306a36Sopenharmony_ci	struct xive_q queue[XIVE_MAX_QUEUES];
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	/*
3062306a36Sopenharmony_ci	 * Pending mask. Each bit corresponds to a priority that
3162306a36Sopenharmony_ci	 * potentially has pending interrupts.
3262306a36Sopenharmony_ci	 */
3362306a36Sopenharmony_ci	u8 pending_prio;
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	/* Cache of HW CPPR */
3662306a36Sopenharmony_ci	u8 cppr;
3762306a36Sopenharmony_ci};
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci/* Backend ops */
4062306a36Sopenharmony_cistruct xive_ops {
4162306a36Sopenharmony_ci	int	(*populate_irq_data)(u32 hw_irq, struct xive_irq_data *data);
4262306a36Sopenharmony_ci	int 	(*configure_irq)(u32 hw_irq, u32 target, u8 prio, u32 sw_irq);
4362306a36Sopenharmony_ci	int	(*get_irq_config)(u32 hw_irq, u32 *target, u8 *prio,
4462306a36Sopenharmony_ci				  u32 *sw_irq);
4562306a36Sopenharmony_ci	int	(*setup_queue)(unsigned int cpu, struct xive_cpu *xc, u8 prio);
4662306a36Sopenharmony_ci	void	(*cleanup_queue)(unsigned int cpu, struct xive_cpu *xc, u8 prio);
4762306a36Sopenharmony_ci	void	(*prepare_cpu)(unsigned int cpu, struct xive_cpu *xc);
4862306a36Sopenharmony_ci	void	(*setup_cpu)(unsigned int cpu, struct xive_cpu *xc);
4962306a36Sopenharmony_ci	void	(*teardown_cpu)(unsigned int cpu, struct xive_cpu *xc);
5062306a36Sopenharmony_ci	bool	(*match)(struct device_node *np);
5162306a36Sopenharmony_ci	void	(*shutdown)(void);
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	void	(*update_pending)(struct xive_cpu *xc);
5462306a36Sopenharmony_ci	void	(*sync_source)(u32 hw_irq);
5562306a36Sopenharmony_ci	u64	(*esb_rw)(u32 hw_irq, u32 offset, u64 data, bool write);
5662306a36Sopenharmony_ci#ifdef CONFIG_SMP
5762306a36Sopenharmony_ci	int	(*get_ipi)(unsigned int cpu, struct xive_cpu *xc);
5862306a36Sopenharmony_ci	void	(*put_ipi)(unsigned int cpu, struct xive_cpu *xc);
5962306a36Sopenharmony_ci#endif
6062306a36Sopenharmony_ci	int	(*debug_show)(struct seq_file *m, void *private);
6162306a36Sopenharmony_ci	int	(*debug_create)(struct dentry *xive_dir);
6262306a36Sopenharmony_ci	const char *name;
6362306a36Sopenharmony_ci};
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_cibool xive_core_init(struct device_node *np, const struct xive_ops *ops,
6662306a36Sopenharmony_ci		    void __iomem *area, u32 offset, u8 max_prio);
6762306a36Sopenharmony_ci__be32 *xive_queue_page_alloc(unsigned int cpu, u32 queue_shift);
6862306a36Sopenharmony_ciint xive_core_debug_init(void);
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_cistatic inline u32 xive_alloc_order(u32 queue_shift)
7162306a36Sopenharmony_ci{
7262306a36Sopenharmony_ci	return (queue_shift > PAGE_SHIFT) ? (queue_shift - PAGE_SHIFT) : 0;
7362306a36Sopenharmony_ci}
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ciextern bool xive_cmdline_disabled;
7662306a36Sopenharmony_ciextern bool xive_has_save_restore;
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci#endif /*  __XIVE_INTERNAL_H */
79