Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * Copyright (c) 2015-2018, Intel Corporation.
^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) #ifndef __KCS_BMC_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) #define __KCS_BMC_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #include <linux/miscdevice.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) /* Different phases of the KCS BMC module.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12)  *  KCS_PHASE_IDLE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13)  *            BMC should not be expecting nor sending any data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14)  *  KCS_PHASE_WRITE_START:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15)  *            BMC is receiving a WRITE_START command from system software.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16)  *  KCS_PHASE_WRITE_DATA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17)  *            BMC is receiving a data byte from system software.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18)  *  KCS_PHASE_WRITE_END_CMD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19)  *            BMC is waiting a last data byte from system software.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20)  *  KCS_PHASE_WRITE_DONE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21)  *            BMC has received the whole request from system software.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22)  *  KCS_PHASE_WAIT_READ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23)  *            BMC is waiting the response from the upper IPMI service.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24)  *  KCS_PHASE_READ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25)  *            BMC is transferring the response to system software.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26)  *  KCS_PHASE_ABORT_ERROR1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27)  *            BMC is waiting error status request from system software.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28)  *  KCS_PHASE_ABORT_ERROR2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29)  *            BMC is waiting for idle status afer error from system software.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30)  *  KCS_PHASE_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31)  *            BMC has detected a protocol violation at the interface level.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) enum kcs_phases {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 	KCS_PHASE_IDLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	KCS_PHASE_WRITE_START,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	KCS_PHASE_WRITE_DATA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	KCS_PHASE_WRITE_END_CMD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 	KCS_PHASE_WRITE_DONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	KCS_PHASE_WAIT_READ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	KCS_PHASE_READ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	KCS_PHASE_ABORT_ERROR1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	KCS_PHASE_ABORT_ERROR2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	KCS_PHASE_ERROR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) /* IPMI 2.0 - Table 9-4, KCS Interface Status Codes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) enum kcs_errors {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	KCS_NO_ERROR                = 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	KCS_ABORTED_BY_COMMAND      = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	KCS_ILLEGAL_CONTROL_CODE    = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	KCS_LENGTH_ERROR            = 0x06,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	KCS_UNSPECIFIED_ERROR       = 0xFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) /* IPMI 2.0 - 9.5, KCS Interface Registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59)  * @idr: Input Data Register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60)  * @odr: Output Data Register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61)  * @str: Status Register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) struct kcs_ioreg {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	u32 idr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	u32 odr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	u32 str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) struct kcs_bmc {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	u32 channel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	int running;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	/* Setup by BMC KCS controller driver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	struct kcs_ioreg ioreg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	u8 (*io_inputb)(struct kcs_bmc *kcs_bmc, u32 reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	void (*io_outputb)(struct kcs_bmc *kcs_bmc, u32 reg, u8 b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	enum kcs_phases phase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 	enum kcs_errors error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	wait_queue_head_t queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	bool data_in_avail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	int  data_in_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	u8  *data_in;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	int  data_out_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	int  data_out_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	u8  *data_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	struct mutex mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	u8 *kbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	struct miscdevice miscdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	unsigned long priv[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) static inline void *kcs_bmc_priv(struct kcs_bmc *kcs_bmc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	return kcs_bmc->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) int kcs_bmc_handle_event(struct kcs_bmc *kcs_bmc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) struct kcs_bmc *kcs_bmc_alloc(struct device *dev, int sizeof_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 					u32 channel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #endif /* __KCS_BMC_H__ */