forked from mirrors/linux
		
	ipmi: Add SMBus interface driver (SSIF)
This patch adds the SMBus interface to the IPMI driver. Signed-off-by: Corey Minyard <minyard@acm.org> Documentation/IPMI.txt | 32 drivers/char/ipmi/Kconfig | 11 drivers/char/ipmi/Makefile | 1 drivers/char/ipmi/ipmi_smb.c | 1737 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 1769 insertions(+), 12 deletions(-)
This commit is contained in:
		
							parent
							
								
									99ab32f3b5
								
							
						
					
					
						commit
						259307074b
					
				
					 4 changed files with 1950 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -42,7 +42,13 @@ The driver interface depends on your hardware.  If your system
 | 
			
		|||
properly provides the SMBIOS info for IPMI, the driver will detect it
 | 
			
		||||
and just work.  If you have a board with a standard interface (These
 | 
			
		||||
will generally be either "KCS", "SMIC", or "BT", consult your hardware
 | 
			
		||||
manual), choose the 'IPMI SI handler' option.
 | 
			
		||||
manual), choose the 'IPMI SI handler' option.  A driver also exists
 | 
			
		||||
for direct I2C access to the IPMI management controller.  Some boards
 | 
			
		||||
support this, but it is unknown if it will work on every board.  For
 | 
			
		||||
this, choose 'IPMI SMBus handler', but be ready to try to do some
 | 
			
		||||
figuring to see if it will work on your system if the SMBIOS/APCI
 | 
			
		||||
information is wrong or not present.  It is fairly safe to have both
 | 
			
		||||
these enabled and let the drivers auto-detect what is present.
 | 
			
		||||
 | 
			
		||||
You should generally enable ACPI on your system, as systems with IPMI
 | 
			
		||||
can have ACPI tables describing them.
 | 
			
		||||
| 
						 | 
				
			
			@ -52,7 +58,8 @@ their job correctly, the IPMI controller should be automatically
 | 
			
		|||
detected (via ACPI or SMBIOS tables) and should just work.  Sadly,
 | 
			
		||||
many boards do not have this information.  The driver attempts
 | 
			
		||||
standard defaults, but they may not work.  If you fall into this
 | 
			
		||||
situation, you need to read the section below named 'The SI Driver'.
 | 
			
		||||
situation, you need to read the section below named 'The SI Driver' or
 | 
			
		||||
"The SMBus Driver" on how to hand-configure your system.
 | 
			
		||||
 | 
			
		||||
IPMI defines a standard watchdog timer.  You can enable this with the
 | 
			
		||||
'IPMI Watchdog Timer' config option.  If you compile the driver into
 | 
			
		||||
| 
						 | 
				
			
			@ -97,7 +104,12 @@ driver, each open file for this device ties in to the message handler
 | 
			
		|||
as an IPMI user.
 | 
			
		||||
 | 
			
		||||
ipmi_si - A driver for various system interfaces.  This supports KCS,
 | 
			
		||||
SMIC, and BT interfaces.
 | 
			
		||||
SMIC, and BT interfaces.  Unless you have an SMBus interface or your
 | 
			
		||||
own custom interface, you probably need to use this.
 | 
			
		||||
 | 
			
		||||
ipmi_ssif - A driver for accessing BMCs on the SMBus. It uses the
 | 
			
		||||
I2C kernel driver's SMBus interfaces to send and receive IPMI messages
 | 
			
		||||
over the SMBus.
 | 
			
		||||
 | 
			
		||||
ipmi_watchdog - IPMI requires systems to have a very capable watchdog
 | 
			
		||||
timer.  This driver implements the standard Linux watchdog timer
 | 
			
		||||
| 
						 | 
				
			
			@ -476,6 +488,62 @@ for specifying an interface.  Note that when removing an interface,
 | 
			
		|||
only the first three parameters (si type, address type, and address)
 | 
			
		||||
are used for the comparison.  Any options are ignored for removing.
 | 
			
		||||
 | 
			
		||||
The SMBus Driver (SSIF)
 | 
			
		||||
-----------------------
 | 
			
		||||
 | 
			
		||||
The SMBus driver allows up to 4 SMBus devices to be configured in the
 | 
			
		||||
system.  By default, the driver will only register with something it
 | 
			
		||||
finds in DMI or ACPI tables.  You can change this
 | 
			
		||||
at module load time (for a module) with:
 | 
			
		||||
 | 
			
		||||
  modprobe ipmi_ssif.o
 | 
			
		||||
	addr=<i2caddr1>[,<i2caddr2>[,...]]
 | 
			
		||||
	adapter=<adapter1>[,<adapter2>[...]]
 | 
			
		||||
	dbg=<flags1>,<flags2>...
 | 
			
		||||
        slave_addrs=<addr1>,<addr2>,...
 | 
			
		||||
	[dbg_probe=1]
 | 
			
		||||
 | 
			
		||||
The addresses are normal I2C addresses.  The adapter is the string
 | 
			
		||||
name of the adapter, as shown in /sys/class/i2c-adapter/i2c-<n>/name.
 | 
			
		||||
It is *NOT* i2c-<n> itself.
 | 
			
		||||
 | 
			
		||||
The debug flags are bit flags for each BMC found, they are:
 | 
			
		||||
IPMI messages: 1, driver state: 2, timing: 4, I2C probe: 8
 | 
			
		||||
 | 
			
		||||
Setting dbg_probe to 1 will enable debugging of the probing and
 | 
			
		||||
detection process for BMCs on the SMBusses.
 | 
			
		||||
 | 
			
		||||
The slave_addrs specifies the IPMI address of the local BMC.  This is
 | 
			
		||||
usually 0x20 and the driver defaults to that, but in case it's not, it
 | 
			
		||||
can be specified when the driver starts up.
 | 
			
		||||
 | 
			
		||||
Discovering the IPMI compliant BMC on the SMBus can cause devices on
 | 
			
		||||
the I2C bus to fail. The SMBus driver writes a "Get Device ID" IPMI
 | 
			
		||||
message as a block write to the I2C bus and waits for a response.
 | 
			
		||||
This action can be detrimental to some I2C devices. It is highly
 | 
			
		||||
recommended that the known I2C address be given to the SMBus driver in
 | 
			
		||||
the smb_addr parameter unless you have DMI or ACPI data to tell the
 | 
			
		||||
driver what to use.
 | 
			
		||||
 | 
			
		||||
When compiled into the kernel, the addresses can be specified on the
 | 
			
		||||
kernel command line as:
 | 
			
		||||
 | 
			
		||||
  ipmb_ssif.addr=<i2caddr1>[,<i2caddr2>[...]]
 | 
			
		||||
	ipmi_ssif.adapter=<adapter1>[,<adapter2>[...]]
 | 
			
		||||
	ipmi_ssif.dbg=<flags1>[,<flags2>[...]]
 | 
			
		||||
	ipmi_ssif.dbg_probe=1
 | 
			
		||||
        ipmi_ssif.slave_addrs=<addr1>[,<addr2>[...]]
 | 
			
		||||
 | 
			
		||||
These are the same options as on the module command line.
 | 
			
		||||
 | 
			
		||||
The I2C driver does not support non-blocking access or polling, so
 | 
			
		||||
this driver cannod to IPMI panic events, extend the watchdog at panic
 | 
			
		||||
time, or other panic-related IPMI functions without special kernel
 | 
			
		||||
patches and driver modifications.  You can get those at the openipmi
 | 
			
		||||
web page.
 | 
			
		||||
 | 
			
		||||
The driver supports a hot add and remove of interfaces through the I2C
 | 
			
		||||
sysfs interface.
 | 
			
		||||
 | 
			
		||||
Other Pieces
 | 
			
		||||
------------
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -62,6 +62,14 @@ config IPMI_SI_PROBE_DEFAULTS
 | 
			
		|||
	 only be available on older systems if the "ipmi_si_intf.trydefaults=1"
 | 
			
		||||
	 boot argument is passed.
 | 
			
		||||
 | 
			
		||||
config IPMI_SSIF
 | 
			
		||||
       tristate 'IPMI SMBus handler (SSIF)'
 | 
			
		||||
       select I2C
 | 
			
		||||
       help
 | 
			
		||||
         Provides a driver for a SMBus interface to a BMC, meaning that you
 | 
			
		||||
	 have a driver that must be accessed over an I2C bus instead of a
 | 
			
		||||
	 standard interface.  This module requires I2C support.
 | 
			
		||||
 | 
			
		||||
config IPMI_WATCHDOG
 | 
			
		||||
       tristate 'IPMI Watchdog Timer'
 | 
			
		||||
       help
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,5 +7,6 @@ ipmi_si-y := ipmi_si_intf.o ipmi_kcs_sm.o ipmi_smic_sm.o ipmi_bt_sm.o
 | 
			
		|||
obj-$(CONFIG_IPMI_HANDLER) += ipmi_msghandler.o
 | 
			
		||||
obj-$(CONFIG_IPMI_DEVICE_INTERFACE) += ipmi_devintf.o
 | 
			
		||||
obj-$(CONFIG_IPMI_SI) += ipmi_si.o
 | 
			
		||||
obj-$(CONFIG_IPMI_SSIF) += ipmi_ssif.o
 | 
			
		||||
obj-$(CONFIG_IPMI_WATCHDOG) += ipmi_watchdog.o
 | 
			
		||||
obj-$(CONFIG_IPMI_POWEROFF) += ipmi_poweroff.o
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										1870
									
								
								drivers/char/ipmi/ipmi_ssif.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1870
									
								
								drivers/char/ipmi/ipmi_ssif.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
		Loading…
	
		Reference in a new issue