18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * ipmi_si.h
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Interface from the device-specific interfaces (OF, DMI, ACPI, PCI,
68c2ecf20Sopenharmony_ci * etc) to the base ipmi system interface code.
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#ifndef __IPMI_SI_H__
108c2ecf20Sopenharmony_ci#define __IPMI_SI_H__
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <linux/ipmi.h>
138c2ecf20Sopenharmony_ci#include <linux/interrupt.h>
148c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci#define SI_DEVICE_NAME "ipmi_si"
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci#define DEFAULT_REGSPACING	1
198c2ecf20Sopenharmony_ci#define DEFAULT_REGSIZE		1
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_cienum si_type {
228c2ecf20Sopenharmony_ci	SI_TYPE_INVALID, SI_KCS, SI_SMIC, SI_BT
238c2ecf20Sopenharmony_ci};
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_cienum ipmi_addr_space {
268c2ecf20Sopenharmony_ci	IPMI_IO_ADDR_SPACE, IPMI_MEM_ADDR_SPACE
278c2ecf20Sopenharmony_ci};
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci/*
308c2ecf20Sopenharmony_ci * The structure for doing I/O in the state machine.  The state
318c2ecf20Sopenharmony_ci * machine doesn't have the actual I/O routines, they are done through
328c2ecf20Sopenharmony_ci * this interface.
338c2ecf20Sopenharmony_ci */
348c2ecf20Sopenharmony_cistruct si_sm_io {
358c2ecf20Sopenharmony_ci	unsigned char (*inputb)(const struct si_sm_io *io, unsigned int offset);
368c2ecf20Sopenharmony_ci	void (*outputb)(const struct si_sm_io *io,
378c2ecf20Sopenharmony_ci			unsigned int  offset,
388c2ecf20Sopenharmony_ci			unsigned char b);
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci	/*
418c2ecf20Sopenharmony_ci	 * Generic info used by the actual handling routines, the
428c2ecf20Sopenharmony_ci	 * state machine shouldn't touch these.
438c2ecf20Sopenharmony_ci	 */
448c2ecf20Sopenharmony_ci	void __iomem *addr;
458c2ecf20Sopenharmony_ci	unsigned int regspacing;
468c2ecf20Sopenharmony_ci	unsigned int regsize;
478c2ecf20Sopenharmony_ci	unsigned int regshift;
488c2ecf20Sopenharmony_ci	enum ipmi_addr_space addr_space;
498c2ecf20Sopenharmony_ci	unsigned long addr_data;
508c2ecf20Sopenharmony_ci	enum ipmi_addr_src addr_source; /* ACPI, PCI, SMBIOS, hardcode, etc. */
518c2ecf20Sopenharmony_ci	void (*addr_source_cleanup)(struct si_sm_io *io);
528c2ecf20Sopenharmony_ci	void *addr_source_data;
538c2ecf20Sopenharmony_ci	union ipmi_smi_info_union addr_info;
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci	int (*io_setup)(struct si_sm_io *info);
568c2ecf20Sopenharmony_ci	void (*io_cleanup)(struct si_sm_io *info);
578c2ecf20Sopenharmony_ci	unsigned int io_size;
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_ci	int irq;
608c2ecf20Sopenharmony_ci	int (*irq_setup)(struct si_sm_io *io);
618c2ecf20Sopenharmony_ci	void *irq_handler_data;
628c2ecf20Sopenharmony_ci	void (*irq_cleanup)(struct si_sm_io *io);
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci	u8 slave_addr;
658c2ecf20Sopenharmony_ci	enum si_type si_type;
668c2ecf20Sopenharmony_ci	struct device *dev;
678c2ecf20Sopenharmony_ci};
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ciint ipmi_si_add_smi(struct si_sm_io *io);
708c2ecf20Sopenharmony_ciirqreturn_t ipmi_si_irq_handler(int irq, void *data);
718c2ecf20Sopenharmony_civoid ipmi_irq_start_cleanup(struct si_sm_io *io);
728c2ecf20Sopenharmony_ciint ipmi_std_irq_setup(struct si_sm_io *io);
738c2ecf20Sopenharmony_civoid ipmi_irq_finish_setup(struct si_sm_io *io);
748c2ecf20Sopenharmony_ciint ipmi_si_remove_by_dev(struct device *dev);
758c2ecf20Sopenharmony_cistruct device *ipmi_si_remove_by_data(int addr_space, enum si_type si_type,
768c2ecf20Sopenharmony_ci				      unsigned long addr);
778c2ecf20Sopenharmony_civoid ipmi_hardcode_init(void);
788c2ecf20Sopenharmony_civoid ipmi_si_hardcode_exit(void);
798c2ecf20Sopenharmony_civoid ipmi_si_hotmod_exit(void);
808c2ecf20Sopenharmony_ciint ipmi_si_hardcode_match(int addr_space, unsigned long addr);
818c2ecf20Sopenharmony_civoid ipmi_si_platform_init(void);
828c2ecf20Sopenharmony_civoid ipmi_si_platform_shutdown(void);
838c2ecf20Sopenharmony_civoid ipmi_remove_platform_device_by_name(char *name);
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_ciextern struct platform_driver ipmi_platform_driver;
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ci#ifdef CONFIG_PCI
888c2ecf20Sopenharmony_civoid ipmi_si_pci_init(void);
898c2ecf20Sopenharmony_civoid ipmi_si_pci_shutdown(void);
908c2ecf20Sopenharmony_ci#else
918c2ecf20Sopenharmony_cistatic inline void ipmi_si_pci_init(void) { }
928c2ecf20Sopenharmony_cistatic inline void ipmi_si_pci_shutdown(void) { }
938c2ecf20Sopenharmony_ci#endif
948c2ecf20Sopenharmony_ci#ifdef CONFIG_PARISC
958c2ecf20Sopenharmony_civoid ipmi_si_parisc_init(void);
968c2ecf20Sopenharmony_civoid ipmi_si_parisc_shutdown(void);
978c2ecf20Sopenharmony_ci#else
988c2ecf20Sopenharmony_cistatic inline void ipmi_si_parisc_init(void) { }
998c2ecf20Sopenharmony_cistatic inline void ipmi_si_parisc_shutdown(void) { }
1008c2ecf20Sopenharmony_ci#endif
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ciint ipmi_si_port_setup(struct si_sm_io *io);
1038c2ecf20Sopenharmony_ciint ipmi_si_mem_setup(struct si_sm_io *io);
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_ci#endif /* __IPMI_SI_H__ */
106