blob: 4b731b24dc16c79d2e688edafe9ac20837f60e45 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * ipmi_si_sm.h
3 *
4 * State machine interface for low-level IPMI system management
5 * interface state machines. This code is the interface between
6 * the ipmi_smi code (that handles the policy of a KCS, SMIC, or
7 * BT interface) and the actual low-level state machine.
8 *
9 * Author: MontaVista Software, Inc.
10 * Corey Minyard <minyard@mvista.com>
11 * source@mvista.com
12 *
13 * Copyright 2002 MontaVista Software Inc.
14 *
15 * This program is free software; you can redistribute it and/or modify it
16 * under the terms of the GNU General Public License as published by the
17 * Free Software Foundation; either version 2 of the License, or (at your
18 * option) any later version.
19 *
20 *
21 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
22 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
27 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
29 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
30 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 * You should have received a copy of the GNU General Public License along
33 * with this program; if not, write to the Free Software Foundation, Inc.,
34 * 675 Mass Ave, Cambridge, MA 02139, USA.
35 */
36
37/* This is defined by the state machines themselves, it is an opaque
38 data type for them to use. */
39struct si_sm_data;
40
41/* The structure for doing I/O in the state machine. The state
42 machine doesn't have the actual I/O routines, they are done through
43 this interface. */
44struct si_sm_io
45{
46 unsigned char (*inputb)(struct si_sm_io *io, unsigned int offset);
47 void (*outputb)(struct si_sm_io *io,
48 unsigned int offset,
49 unsigned char b);
50
51 /* Generic info used by the actual handling routines, the
52 state machine shouldn't touch these. */
Al Viro1b75d8b2005-05-04 05:40:22 +010053 void __iomem *addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -070054 int regspacing;
55 int regsize;
56 int regshift;
Corey Minyardb0defcd2006-03-26 01:37:20 -080057 int addr_type;
58 long addr_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -070059};
60
61/* Results of SMI events. */
62enum si_sm_result
63{
64 SI_SM_CALL_WITHOUT_DELAY, /* Call the driver again immediately */
65 SI_SM_CALL_WITH_DELAY, /* Delay some before calling again. */
Corey Minyardc3e7e792005-11-07 01:00:02 -080066 SI_SM_CALL_WITH_TICK_DELAY, /* Delay at least 1 tick before calling again. */
Linus Torvalds1da177e2005-04-16 15:20:36 -070067 SI_SM_TRANSACTION_COMPLETE, /* A transaction is finished. */
68 SI_SM_IDLE, /* The SM is in idle state. */
69 SI_SM_HOSED, /* The hardware violated the state machine. */
70 SI_SM_ATTN /* The hardware is asserting attn and the
71 state machine is idle. */
72};
73
74/* Handlers for the SMI state machine. */
75struct si_sm_handlers
76{
77 /* Put the version number of the state machine here so the
78 upper layer can print it. */
79 char *version;
80
81 /* Initialize the data and return the amount of I/O space to
82 reserve for the space. */
83 unsigned int (*init_data)(struct si_sm_data *smi,
84 struct si_sm_io *io);
85
86 /* Start a new transaction in the state machine. This will
87 return -2 if the state machine is not idle, -1 if the size
88 is invalid (to large or too small), or 0 if the transaction
89 is successfully completed. */
90 int (*start_transaction)(struct si_sm_data *smi,
91 unsigned char *data, unsigned int size);
92
93 /* Return the results after the transaction. This will return
94 -1 if the buffer is too small, zero if no transaction is
95 present, or the actual length of the result data. */
96 int (*get_result)(struct si_sm_data *smi,
97 unsigned char *data, unsigned int length);
98
99 /* Call this periodically (for a polled interface) or upon
100 receiving an interrupt (for a interrupt-driven interface).
101 If interrupt driven, you should probably poll this
102 periodically when not in idle state. This should be called
103 with the time that passed since the last call, if it is
104 significant. Time is in microseconds. */
105 enum si_sm_result (*event)(struct si_sm_data *smi, long time);
106
107 /* Attempt to detect an SMI. Returns 0 on success or nonzero
108 on failure. */
109 int (*detect)(struct si_sm_data *smi);
110
111 /* The interface is shutting down, so clean it up. */
112 void (*cleanup)(struct si_sm_data *smi);
113
114 /* Return the size of the SMI structure in bytes. */
115 int (*size)(void);
116};
117
118/* Current state machines that we can use. */
119extern struct si_sm_handlers kcs_smi_handlers;
120extern struct si_sm_handlers smic_smi_handlers;
121extern struct si_sm_handlers bt_smi_handlers;
122