162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef __ASM_IA64_IOSAPIC_H
362306a36Sopenharmony_ci#define __ASM_IA64_IOSAPIC_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#define	IOSAPIC_REG_SELECT	0x0
662306a36Sopenharmony_ci#define	IOSAPIC_WINDOW		0x10
762306a36Sopenharmony_ci#define	IOSAPIC_EOI		0x40
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#define	IOSAPIC_VERSION		0x1
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci/*
1262306a36Sopenharmony_ci * Redirection table entry
1362306a36Sopenharmony_ci */
1462306a36Sopenharmony_ci#define	IOSAPIC_RTE_LOW(i)	(0x10+i*2)
1562306a36Sopenharmony_ci#define	IOSAPIC_RTE_HIGH(i)	(0x11+i*2)
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define	IOSAPIC_DEST_SHIFT		16
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci/*
2062306a36Sopenharmony_ci * Delivery mode
2162306a36Sopenharmony_ci */
2262306a36Sopenharmony_ci#define	IOSAPIC_DELIVERY_SHIFT		8
2362306a36Sopenharmony_ci#define	IOSAPIC_FIXED			0x0
2462306a36Sopenharmony_ci#define	IOSAPIC_LOWEST_PRIORITY	0x1
2562306a36Sopenharmony_ci#define	IOSAPIC_PMI			0x2
2662306a36Sopenharmony_ci#define	IOSAPIC_NMI			0x4
2762306a36Sopenharmony_ci#define	IOSAPIC_INIT			0x5
2862306a36Sopenharmony_ci#define	IOSAPIC_EXTINT			0x7
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci/*
3162306a36Sopenharmony_ci * Interrupt polarity
3262306a36Sopenharmony_ci */
3362306a36Sopenharmony_ci#define	IOSAPIC_POLARITY_SHIFT		13
3462306a36Sopenharmony_ci#define	IOSAPIC_POL_HIGH		0
3562306a36Sopenharmony_ci#define	IOSAPIC_POL_LOW		1
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci/*
3862306a36Sopenharmony_ci * Trigger mode
3962306a36Sopenharmony_ci */
4062306a36Sopenharmony_ci#define	IOSAPIC_TRIGGER_SHIFT		15
4162306a36Sopenharmony_ci#define	IOSAPIC_EDGE			0
4262306a36Sopenharmony_ci#define	IOSAPIC_LEVEL			1
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci/*
4562306a36Sopenharmony_ci * Mask bit
4662306a36Sopenharmony_ci */
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci#define	IOSAPIC_MASK_SHIFT		16
4962306a36Sopenharmony_ci#define	IOSAPIC_MASK			(1<<IOSAPIC_MASK_SHIFT)
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci#define IOSAPIC_VECTOR_MASK		0xffffff00
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci#ifndef __ASSEMBLY__
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci#define NR_IOSAPICS			256
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci#define iosapic_pcat_compat_init	ia64_native_iosapic_pcat_compat_init
5862306a36Sopenharmony_ci#define __iosapic_read			__ia64_native_iosapic_read
5962306a36Sopenharmony_ci#define __iosapic_write			__ia64_native_iosapic_write
6062306a36Sopenharmony_ci#define iosapic_get_irq_chip		ia64_native_iosapic_get_irq_chip
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ciextern void __init ia64_native_iosapic_pcat_compat_init(void);
6362306a36Sopenharmony_ciextern struct irq_chip *ia64_native_iosapic_get_irq_chip(unsigned long trigger);
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_cistatic inline unsigned int
6662306a36Sopenharmony_ci__ia64_native_iosapic_read(char __iomem *iosapic, unsigned int reg)
6762306a36Sopenharmony_ci{
6862306a36Sopenharmony_ci	writel(reg, iosapic + IOSAPIC_REG_SELECT);
6962306a36Sopenharmony_ci	return readl(iosapic + IOSAPIC_WINDOW);
7062306a36Sopenharmony_ci}
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cistatic inline void
7362306a36Sopenharmony_ci__ia64_native_iosapic_write(char __iomem *iosapic, unsigned int reg, u32 val)
7462306a36Sopenharmony_ci{
7562306a36Sopenharmony_ci	writel(reg, iosapic + IOSAPIC_REG_SELECT);
7662306a36Sopenharmony_ci	writel(val, iosapic + IOSAPIC_WINDOW);
7762306a36Sopenharmony_ci}
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_cistatic inline void iosapic_eoi(char __iomem *iosapic, u32 vector)
8062306a36Sopenharmony_ci{
8162306a36Sopenharmony_ci	writel(vector, iosapic + IOSAPIC_EOI);
8262306a36Sopenharmony_ci}
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ciextern void __init iosapic_system_init (int pcat_compat);
8562306a36Sopenharmony_ciextern int iosapic_init (unsigned long address, unsigned int gsi_base);
8662306a36Sopenharmony_ciextern int iosapic_remove (unsigned int gsi_base);
8762306a36Sopenharmony_ciextern int gsi_to_irq (unsigned int gsi);
8862306a36Sopenharmony_ciextern int iosapic_register_intr (unsigned int gsi, unsigned long polarity,
8962306a36Sopenharmony_ci				  unsigned long trigger);
9062306a36Sopenharmony_ciextern void iosapic_unregister_intr (unsigned int irq);
9162306a36Sopenharmony_ciextern void iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi,
9262306a36Sopenharmony_ci				      unsigned long polarity,
9362306a36Sopenharmony_ci				      unsigned long trigger);
9462306a36Sopenharmony_ciextern int __init iosapic_register_platform_intr (u32 int_type,
9562306a36Sopenharmony_ci					   unsigned int gsi,
9662306a36Sopenharmony_ci					   int pmi_vector,
9762306a36Sopenharmony_ci					   u16 eid, u16 id,
9862306a36Sopenharmony_ci					   unsigned long polarity,
9962306a36Sopenharmony_ci					   unsigned long trigger);
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci#ifdef CONFIG_NUMA
10262306a36Sopenharmony_ciextern void map_iosapic_to_node (unsigned int, int);
10362306a36Sopenharmony_ci#endif
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci# endif /* !__ASSEMBLY__ */
10662306a36Sopenharmony_ci#endif /* __ASM_IA64_IOSAPIC_H */
107