mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 18:10:52 +07:00
Merge branch 'ipmi' (IPMI patches from Corey Minyard)
Merge emailed patches from Corey Minyard: "Remove some bogus docs, Fix ACPI/IPMI interactions, fix some warnings, and add register spacing detection for PCI interfaces." * ipmi: IPMI: Detect register spacing on PCI interfaces IPMI: Fix some uninitialized warning IPMI: Change link order ACPI: Reorder IPMI driver before any other ACPI drivers IPMI: Remove SMBus driver info from the docs
This commit is contained in:
commit
cba8d1cb66
@ -42,13 +42,7 @@ 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. 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.
|
||||
manual), choose the 'IPMI SI handler' option.
|
||||
|
||||
You should generally enable ACPI on your system, as systems with IPMI
|
||||
can have ACPI tables describing them.
|
||||
@ -58,8 +52,7 @@ 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' or
|
||||
"The SMBus Driver" on how to hand-configure your system.
|
||||
situation, you need to read the section below named 'The SI Driver'.
|
||||
|
||||
IPMI defines a standard watchdog timer. You can enable this with the
|
||||
'IPMI Watchdog Timer' config option. If you compile the driver into
|
||||
@ -104,12 +97,7 @@ 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. Unless you have an SMBus interface or your
|
||||
own custom interface, you probably need to use this.
|
||||
|
||||
ipmi_smb - 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.
|
||||
SMIC, and BT interfaces.
|
||||
|
||||
ipmi_watchdog - IPMI requires systems to have a very capable watchdog
|
||||
timer. This driver implements the standard Linux watchdog timer
|
||||
@ -482,53 +470,6 @@ 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
|
||||
----------------
|
||||
|
||||
The SMBus driver allows up to 4 SMBus devices to be configured in the
|
||||
system. By default, the driver will register any SMBus interfaces it finds
|
||||
in the I2C address range of 0x20 to 0x4f on any adapter. You can change this
|
||||
at module load time (for a module) with:
|
||||
|
||||
modprobe ipmi_smb.o
|
||||
addr=<adapter1>,<i2caddr1>[,<adapter2>,<i2caddr2>[,...]]
|
||||
dbg=<flags1>,<flags2>...
|
||||
[defaultprobe=1] [dbg_probe=1]
|
||||
|
||||
The addresses are specified in pairs, the first is the adapter ID and the
|
||||
second is the I2C address on that adapter.
|
||||
|
||||
The debug flags are bit flags for each BMC found, they are:
|
||||
IPMI messages: 1, driver state: 2, timing: 4, I2C probe: 8
|
||||
|
||||
Setting smb_defaultprobe to zero disabled the default probing of SMBus
|
||||
interfaces at address range 0x20 to 0x4f. This means that only the
|
||||
BMCs specified on the smb_addr line will be detected.
|
||||
|
||||
Setting smb_dbg_probe to 1 will enable debugging of the probing and
|
||||
detection process for BMCs on the SMBusses.
|
||||
|
||||
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. The default address range will not be used when a smb_addr
|
||||
parameter is provided.
|
||||
|
||||
When compiled into the kernel, the addresses can be specified on the
|
||||
kernel command line as:
|
||||
|
||||
ipmb_smb.addr=<adapter1>,<i2caddr1>[,<adapter2>,<i2caddr2>[,...]]
|
||||
ipmi_smb.dbg=<flags1>,<flags2>...
|
||||
ipmi_smb.defaultprobe=0 ipmi_smb.dbg_probe=1
|
||||
|
||||
These are the same options as on the module command line.
|
||||
|
||||
Note that you might need some I2C changes if CONFIG_IPMI_PANIC_EVENT
|
||||
is enabled along with this, so the I2C driver knows to run to
|
||||
completion during sending a panic event.
|
||||
|
||||
|
||||
Other Pieces
|
||||
------------
|
||||
|
@ -17,6 +17,10 @@ obj-$(CONFIG_PARISC) += parisc/
|
||||
obj-$(CONFIG_RAPIDIO) += rapidio/
|
||||
obj-y += video/
|
||||
obj-y += idle/
|
||||
|
||||
# IPMI must come before ACPI in order to provide IPMI opregion support
|
||||
obj-$(CONFIG_IPMI_HANDLER) += char/ipmi/
|
||||
|
||||
obj-$(CONFIG_ACPI) += acpi/
|
||||
obj-$(CONFIG_SFI) += sfi/
|
||||
# PnP must come after ACPI since it will eventually need to check if acpi
|
||||
|
@ -47,6 +47,10 @@ acpi-y += video_detect.o
|
||||
endif
|
||||
|
||||
# These are (potentially) separate modules
|
||||
|
||||
# IPMI may be used by other drivers, so it has to initialise before them
|
||||
obj-$(CONFIG_ACPI_IPMI) += acpi_ipmi.o
|
||||
|
||||
obj-$(CONFIG_ACPI_AC) += ac.o
|
||||
obj-$(CONFIG_ACPI_BUTTON) += button.o
|
||||
obj-$(CONFIG_ACPI_FAN) += fan.o
|
||||
@ -70,6 +74,5 @@ processor-y += processor_idle.o processor_thermal.o
|
||||
processor-$(CONFIG_CPU_FREQ) += processor_perflib.o
|
||||
|
||||
obj-$(CONFIG_ACPI_PROCESSOR_AGGREGATOR) += acpi_pad.o
|
||||
obj-$(CONFIG_ACPI_IPMI) += acpi_ipmi.o
|
||||
|
||||
obj-$(CONFIG_ACPI_APEI) += apei/
|
||||
|
@ -52,7 +52,6 @@ obj-$(CONFIG_TELCLOCK) += tlclk.o
|
||||
obj-$(CONFIG_MWAVE) += mwave/
|
||||
obj-$(CONFIG_AGP) += agp/
|
||||
obj-$(CONFIG_PCMCIA) += pcmcia/
|
||||
obj-$(CONFIG_IPMI_HANDLER) += ipmi/
|
||||
|
||||
obj-$(CONFIG_HANGCHECK_TIMER) += hangcheck-timer.o
|
||||
obj-$(CONFIG_TCG_TPM) += tpm/
|
||||
|
@ -1880,7 +1880,7 @@ int ipmi_request_supply_msgs(ipmi_user_t user,
|
||||
struct ipmi_recv_msg *supplied_recv,
|
||||
int priority)
|
||||
{
|
||||
unsigned char saddr, lun;
|
||||
unsigned char saddr = 0, lun = 0;
|
||||
int rv;
|
||||
|
||||
if (!user)
|
||||
|
@ -2424,6 +2424,38 @@ static void ipmi_pci_cleanup(struct smi_info *info)
|
||||
pci_disable_device(pdev);
|
||||
}
|
||||
|
||||
static int __devinit ipmi_pci_probe_regspacing(struct smi_info *info)
|
||||
{
|
||||
if (info->si_type == SI_KCS) {
|
||||
unsigned char status;
|
||||
int regspacing;
|
||||
|
||||
info->io.regsize = DEFAULT_REGSIZE;
|
||||
info->io.regshift = 0;
|
||||
info->io_size = 2;
|
||||
info->handlers = &kcs_smi_handlers;
|
||||
|
||||
/* detect 1, 4, 16byte spacing */
|
||||
for (regspacing = DEFAULT_REGSPACING; regspacing <= 16;) {
|
||||
info->io.regspacing = regspacing;
|
||||
if (info->io_setup(info)) {
|
||||
dev_err(info->dev,
|
||||
"Could not setup I/O space\n");
|
||||
return DEFAULT_REGSPACING;
|
||||
}
|
||||
/* write invalid cmd */
|
||||
info->io.outputb(&info->io, 1, 0x10);
|
||||
/* read status back */
|
||||
status = info->io.inputb(&info->io, 1);
|
||||
info->io_cleanup(info);
|
||||
if (status)
|
||||
return regspacing;
|
||||
regspacing *= 4;
|
||||
}
|
||||
}
|
||||
return DEFAULT_REGSPACING;
|
||||
}
|
||||
|
||||
static int __devinit ipmi_pci_probe(struct pci_dev *pdev,
|
||||
const struct pci_device_id *ent)
|
||||
{
|
||||
@ -2476,8 +2508,8 @@ static int __devinit ipmi_pci_probe(struct pci_dev *pdev,
|
||||
}
|
||||
info->io.addr_data = pci_resource_start(pdev, 0);
|
||||
|
||||
info->io.regspacing = DEFAULT_REGSPACING;
|
||||
info->io.regsize = DEFAULT_REGSPACING;
|
||||
info->io.regspacing = ipmi_pci_probe_regspacing(info);
|
||||
info->io.regsize = DEFAULT_REGSIZE;
|
||||
info->io.regshift = 0;
|
||||
|
||||
info->irq = pdev->irq;
|
||||
|
Loading…
Reference in New Issue
Block a user