^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #ifndef _POWERPC_PMI_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define _POWERPC_PMI_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Definitions for talking with PMI device on PowerPC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * PMI (Platform Management Interrupt) is a way to communicate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * with the BMC (Baseboard Management Controller) via interrupts.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Unlike IPMI it is bidirectional and has a low latency.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * (C) Copyright IBM Deutschland Entwicklung GmbH 2005
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * Author: Christian Krafft <krafft@de.ibm.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #ifdef __KERNEL__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define PMI_TYPE_FREQ_CHANGE 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define PMI_TYPE_POWER_BUTTON 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define PMI_READ_TYPE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define PMI_READ_DATA0 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define PMI_READ_DATA1 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define PMI_READ_DATA2 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define PMI_WRITE_TYPE 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define PMI_WRITE_DATA0 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define PMI_WRITE_DATA1 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define PMI_WRITE_DATA2 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define PMI_ACK 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define PMI_TIMEOUT 100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) u8 type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) u8 data0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) u8 data1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) u8 data2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) } pmi_message_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) struct pmi_handler {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) struct list_head node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) u8 type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) void (*handle_pmi_message) (pmi_message_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) int pmi_register_handler(struct pmi_handler *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) void pmi_unregister_handler(struct pmi_handler *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) int pmi_send_message(pmi_message_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #endif /* __KERNEL__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #endif /* _POWERPC_PMI_H */