Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
7a453308
Commit
7a453308
authored
Sep 12, 2017
by
Corey Minyard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ipmi_si: Move hardcode handling to a separate file.
Signed-off-by:
Corey Minyard
<
cminyard@mvista.com
>
parent
44814ec9
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
154 additions
and
147 deletions
+154
-147
drivers/char/ipmi/Makefile
drivers/char/ipmi/Makefile
+1
-1
drivers/char/ipmi/ipmi_si.h
drivers/char/ipmi/ipmi_si.h
+1
-0
drivers/char/ipmi/ipmi_si_hardcode.c
drivers/char/ipmi/ipmi_si_hardcode.c
+146
-0
drivers/char/ipmi/ipmi_si_intf.c
drivers/char/ipmi/ipmi_si_intf.c
+6
-146
No files found.
drivers/char/ipmi/Makefile
View file @
7a453308
...
...
@@ -3,7 +3,7 @@
#
ipmi_si-y
:=
ipmi_si_intf.o ipmi_kcs_sm.o ipmi_smic_sm.o ipmi_bt_sm.o
\
ipmi_si_hotmod.o
ipmi_si_hotmod.o
ipmi_si_hardcode.o
obj-$(CONFIG_IPMI_HANDLER)
+=
ipmi_msghandler.o
obj-$(CONFIG_IPMI_DEVICE_INTERFACE)
+=
ipmi_devintf.o
...
...
drivers/char/ipmi/ipmi_si.h
View file @
7a453308
...
...
@@ -22,3 +22,4 @@ void ipmi_irq_finish_setup(struct si_sm_io *io);
int
ipmi_si_remove_by_dev
(
struct
device
*
dev
);
void
ipmi_si_remove_by_data
(
int
addr_space
,
enum
si_type
si_type
,
unsigned
long
addr
);
int
ipmi_si_hardcode_find_bmc
(
void
);
drivers/char/ipmi/ipmi_si_hardcode.c
0 → 100644
View file @
7a453308
#include <linux/moduleparam.h>
#include "ipmi_si.h"
#define PFX "ipmi_hardcode: "
/*
* There can be 4 IO ports passed in (with or without IRQs), 4 addresses,
* a default IO port, and 1 ACPI/SPMI address. That sets SI_MAX_DRIVERS.
*/
#define SI_MAX_PARMS 4
static
char
*
si_type
[
SI_MAX_PARMS
];
#define MAX_SI_TYPE_STR 30
static
char
si_type_str
[
MAX_SI_TYPE_STR
];
static
unsigned
long
addrs
[
SI_MAX_PARMS
];
static
unsigned
int
num_addrs
;
static
unsigned
int
ports
[
SI_MAX_PARMS
];
static
unsigned
int
num_ports
;
static
int
irqs
[
SI_MAX_PARMS
];
static
unsigned
int
num_irqs
;
static
int
regspacings
[
SI_MAX_PARMS
];
static
unsigned
int
num_regspacings
;
static
int
regsizes
[
SI_MAX_PARMS
];
static
unsigned
int
num_regsizes
;
static
int
regshifts
[
SI_MAX_PARMS
];
static
unsigned
int
num_regshifts
;
static
int
slave_addrs
[
SI_MAX_PARMS
];
/* Leaving 0 chooses the default value */
static
unsigned
int
num_slave_addrs
;
module_param_string
(
type
,
si_type_str
,
MAX_SI_TYPE_STR
,
0
);
MODULE_PARM_DESC
(
type
,
"Defines the type of each interface, each"
" interface separated by commas. The types are 'kcs',"
" 'smic', and 'bt'. For example si_type=kcs,bt will set"
" the first interface to kcs and the second to bt"
);
module_param_hw_array
(
addrs
,
ulong
,
iomem
,
&
num_addrs
,
0
);
MODULE_PARM_DESC
(
addrs
,
"Sets the memory address of each interface, the"
" addresses separated by commas. Only use if an interface"
" is in memory. Otherwise, set it to zero or leave"
" it blank."
);
module_param_hw_array
(
ports
,
uint
,
ioport
,
&
num_ports
,
0
);
MODULE_PARM_DESC
(
ports
,
"Sets the port address of each interface, the"
" addresses separated by commas. Only use if an interface"
" is a port. Otherwise, set it to zero or leave"
" it blank."
);
module_param_hw_array
(
irqs
,
int
,
irq
,
&
num_irqs
,
0
);
MODULE_PARM_DESC
(
irqs
,
"Sets the interrupt of each interface, the"
" addresses separated by commas. Only use if an interface"
" has an interrupt. Otherwise, set it to zero or leave"
" it blank."
);
module_param_hw_array
(
regspacings
,
int
,
other
,
&
num_regspacings
,
0
);
MODULE_PARM_DESC
(
regspacings
,
"The number of bytes between the start address"
" and each successive register used by the interface. For"
" instance, if the start address is 0xca2 and the spacing"
" is 2, then the second address is at 0xca4. Defaults"
" to 1."
);
module_param_hw_array
(
regsizes
,
int
,
other
,
&
num_regsizes
,
0
);
MODULE_PARM_DESC
(
regsizes
,
"The size of the specific IPMI register in bytes."
" This should generally be 1, 2, 4, or 8 for an 8-bit,"
" 16-bit, 32-bit, or 64-bit register. Use this if you"
" the 8-bit IPMI register has to be read from a larger"
" register."
);
module_param_hw_array
(
regshifts
,
int
,
other
,
&
num_regshifts
,
0
);
MODULE_PARM_DESC
(
regshifts
,
"The amount to shift the data read from the."
" IPMI register, in bits. For instance, if the data"
" is read from a 32-bit word and the IPMI data is in"
" bit 8-15, then the shift would be 8"
);
module_param_hw_array
(
slave_addrs
,
int
,
other
,
&
num_slave_addrs
,
0
);
MODULE_PARM_DESC
(
slave_addrs
,
"Set the default IPMB slave address for"
" the controller. Normally this is 0x20, but can be"
" overridden by this parm. This is an array indexed"
" by interface number."
);
int
ipmi_si_hardcode_find_bmc
(
void
)
{
int
ret
=
-
ENODEV
;
int
i
;
struct
si_sm_io
io
;
char
*
str
;
/* Parse out the si_type string into its components. */
str
=
si_type_str
;
if
(
*
str
!=
'\0'
)
{
for
(
i
=
0
;
(
i
<
SI_MAX_PARMS
)
&&
(
*
str
!=
'\0'
);
i
++
)
{
si_type
[
i
]
=
str
;
str
=
strchr
(
str
,
','
);
if
(
str
)
{
*
str
=
'\0'
;
str
++
;
}
else
{
break
;
}
}
}
memset
(
&
io
,
0
,
sizeof
(
io
));
for
(
i
=
0
;
i
<
SI_MAX_PARMS
;
i
++
)
{
if
(
!
ports
[
i
]
&&
!
addrs
[
i
])
continue
;
io
.
addr_source
=
SI_HARDCODED
;
pr_info
(
PFX
"probing via hardcoded address
\n
"
);
if
(
!
si_type
[
i
]
||
strcmp
(
si_type
[
i
],
"kcs"
)
==
0
)
{
io
.
si_type
=
SI_KCS
;
}
else
if
(
strcmp
(
si_type
[
i
],
"smic"
)
==
0
)
{
io
.
si_type
=
SI_SMIC
;
}
else
if
(
strcmp
(
si_type
[
i
],
"bt"
)
==
0
)
{
io
.
si_type
=
SI_BT
;
}
else
{
pr_warn
(
PFX
"Interface type specified for interface %d, was invalid: %s
\n
"
,
i
,
si_type
[
i
]);
continue
;
}
if
(
ports
[
i
])
{
/* An I/O port */
io
.
addr_data
=
ports
[
i
];
io
.
addr_type
=
IPMI_IO_ADDR_SPACE
;
}
else
if
(
addrs
[
i
])
{
/* A memory port */
io
.
addr_data
=
addrs
[
i
];
io
.
addr_type
=
IPMI_MEM_ADDR_SPACE
;
}
else
{
pr_warn
(
PFX
"Interface type specified for interface %d, but port and address were not set or set to zero.
\n
"
,
i
);
continue
;
}
io
.
addr
=
NULL
;
io
.
regspacing
=
regspacings
[
i
];
if
(
!
io
.
regspacing
)
io
.
regspacing
=
DEFAULT_REGSPACING
;
io
.
regsize
=
regsizes
[
i
];
if
(
!
io
.
regsize
)
io
.
regsize
=
DEFAULT_REGSIZE
;
io
.
regshift
=
regshifts
[
i
];
io
.
irq
=
irqs
[
i
];
if
(
io
.
irq
)
io
.
irq_setup
=
ipmi_std_irq_setup
;
io
.
slave_addr
=
slave_addrs
[
i
];
ret
=
ipmi_si_add_smi
(
&
io
);
}
return
ret
;
}
drivers/char/ipmi/ipmi_si_intf.c
View file @
7a453308
...
...
@@ -291,9 +291,8 @@ struct smi_info {
#define smi_get_stat(smi, stat) \
((unsigned int) atomic_read(&(smi)->stats[SI_STAT_ ## stat]))
#define SI_MAX_PARMS 4
static
int
force_kipmid
[
SI_MAX_PARMS
];
#define IPMI_MAX_INTFS 4
static
int
force_kipmid
[
IPMI_MAX_INTFS
];
static
int
num_force_kipmid
;
#ifdef CONFIG_PCI
static
bool
pci_registered
;
...
...
@@ -302,7 +301,7 @@ static bool pci_registered;
static
bool
parisc_registered
;
#endif
static
unsigned
int
kipmid_max_busy_us
[
SI_MAX_PARM
S
];
static
unsigned
int
kipmid_max_busy_us
[
IPMI_MAX_INTF
S
];
static
int
num_max_busy_us
;
static
bool
unload_when_empty
=
true
;
...
...
@@ -1271,11 +1270,6 @@ static const struct ipmi_smi_handlers handlers = {
.
poll
=
poll
,
};
/*
* There can be 4 IO ports passed in (with or without IRQs), 4 addresses,
* a default IO port, and 1 ACPI/SPMI address. That sets SI_MAX_DRIVERS.
*/
static
LIST_HEAD
(
smi_infos
);
static
DEFINE_MUTEX
(
smi_infos_lock
);
static
int
smi_num
;
/* Used to sequence the SMIs */
...
...
@@ -1290,23 +1284,6 @@ static bool si_tryplatform = true;
#ifdef CONFIG_PCI
static
bool
si_trypci
=
true
;
#endif
static
char
*
si_type
[
SI_MAX_PARMS
];
#define MAX_SI_TYPE_STR 30
static
char
si_type_str
[
MAX_SI_TYPE_STR
];
static
unsigned
long
addrs
[
SI_MAX_PARMS
];
static
unsigned
int
num_addrs
;
static
unsigned
int
ports
[
SI_MAX_PARMS
];
static
unsigned
int
num_ports
;
static
int
irqs
[
SI_MAX_PARMS
];
static
unsigned
int
num_irqs
;
static
int
regspacings
[
SI_MAX_PARMS
];
static
unsigned
int
num_regspacings
;
static
int
regsizes
[
SI_MAX_PARMS
];
static
unsigned
int
num_regsizes
;
static
int
regshifts
[
SI_MAX_PARMS
];
static
unsigned
int
num_regshifts
;
static
int
slave_addrs
[
SI_MAX_PARMS
];
/* Leaving 0 chooses the default value */
static
unsigned
int
num_slave_addrs
;
static
const
char
*
const
addr_space_to_str
[]
=
{
"i/o"
,
"mem"
};
...
...
@@ -1329,48 +1306,6 @@ module_param_named(trypci, si_trypci, bool, 0);
MODULE_PARM_DESC
(
trypci
,
"Setting this to zero will disable the"
" default scan of the interfaces identified via pci"
);
#endif
module_param_string
(
type
,
si_type_str
,
MAX_SI_TYPE_STR
,
0
);
MODULE_PARM_DESC
(
type
,
"Defines the type of each interface, each"
" interface separated by commas. The types are 'kcs',"
" 'smic', and 'bt'. For example si_type=kcs,bt will set"
" the first interface to kcs and the second to bt"
);
module_param_hw_array
(
addrs
,
ulong
,
iomem
,
&
num_addrs
,
0
);
MODULE_PARM_DESC
(
addrs
,
"Sets the memory address of each interface, the"
" addresses separated by commas. Only use if an interface"
" is in memory. Otherwise, set it to zero or leave"
" it blank."
);
module_param_hw_array
(
ports
,
uint
,
ioport
,
&
num_ports
,
0
);
MODULE_PARM_DESC
(
ports
,
"Sets the port address of each interface, the"
" addresses separated by commas. Only use if an interface"
" is a port. Otherwise, set it to zero or leave"
" it blank."
);
module_param_hw_array
(
irqs
,
int
,
irq
,
&
num_irqs
,
0
);
MODULE_PARM_DESC
(
irqs
,
"Sets the interrupt of each interface, the"
" addresses separated by commas. Only use if an interface"
" has an interrupt. Otherwise, set it to zero or leave"
" it blank."
);
module_param_hw_array
(
regspacings
,
int
,
other
,
&
num_regspacings
,
0
);
MODULE_PARM_DESC
(
regspacings
,
"The number of bytes between the start address"
" and each successive register used by the interface. For"
" instance, if the start address is 0xca2 and the spacing"
" is 2, then the second address is at 0xca4. Defaults"
" to 1."
);
module_param_hw_array
(
regsizes
,
int
,
other
,
&
num_regsizes
,
0
);
MODULE_PARM_DESC
(
regsizes
,
"The size of the specific IPMI register in bytes."
" This should generally be 1, 2, 4, or 8 for an 8-bit,"
" 16-bit, 32-bit, or 64-bit register. Use this if you"
" the 8-bit IPMI register has to be read from a larger"
" register."
);
module_param_hw_array
(
regshifts
,
int
,
other
,
&
num_regshifts
,
0
);
MODULE_PARM_DESC
(
regshifts
,
"The amount to shift the data read from the."
" IPMI register, in bits. For instance, if the data"
" is read from a 32-bit word and the IPMI data is in"
" bit 8-15, then the shift would be 8"
);
module_param_hw_array
(
slave_addrs
,
int
,
other
,
&
num_slave_addrs
,
0
);
MODULE_PARM_DESC
(
slave_addrs
,
"Set the default IPMB slave address for"
" the controller. Normally this is 0x20, but can be"
" overridden by this parm. This is an array indexed"
" by interface number."
);
module_param_array
(
force_kipmid
,
int
,
&
num_force_kipmid
,
0
);
MODULE_PARM_DESC
(
force_kipmid
,
"Force the kipmi daemon to be enabled (1) or"
" disabled(0). Normally the IPMI driver auto-detects"
...
...
@@ -1691,64 +1626,6 @@ static struct smi_info *smi_info_alloc(void)
return
info
;
}
static
int
hardcode_find_bmc
(
void
)
{
int
ret
=
-
ENODEV
;
int
i
;
struct
si_sm_io
io
;
memset
(
&
io
,
0
,
sizeof
(
io
));
for
(
i
=
0
;
i
<
SI_MAX_PARMS
;
i
++
)
{
if
(
!
ports
[
i
]
&&
!
addrs
[
i
])
continue
;
io
.
addr_source
=
SI_HARDCODED
;
pr_info
(
PFX
"probing via hardcoded address
\n
"
);
if
(
!
si_type
[
i
]
||
strcmp
(
si_type
[
i
],
"kcs"
)
==
0
)
{
io
.
si_type
=
SI_KCS
;
}
else
if
(
strcmp
(
si_type
[
i
],
"smic"
)
==
0
)
{
io
.
si_type
=
SI_SMIC
;
}
else
if
(
strcmp
(
si_type
[
i
],
"bt"
)
==
0
)
{
io
.
si_type
=
SI_BT
;
}
else
{
pr_warn
(
PFX
"Interface type specified for interface %d, was invalid: %s
\n
"
,
i
,
si_type
[
i
]);
continue
;
}
if
(
ports
[
i
])
{
/* An I/O port */
io
.
addr_data
=
ports
[
i
];
io
.
addr_type
=
IPMI_IO_ADDR_SPACE
;
}
else
if
(
addrs
[
i
])
{
/* A memory port */
io
.
addr_data
=
addrs
[
i
];
io
.
addr_type
=
IPMI_MEM_ADDR_SPACE
;
}
else
{
pr_warn
(
PFX
"Interface type specified for interface %d, but port and address were not set or set to zero.
\n
"
,
i
);
continue
;
}
io
.
addr
=
NULL
;
io
.
regspacing
=
regspacings
[
i
];
if
(
!
io
.
regspacing
)
io
.
regspacing
=
DEFAULT_REGSPACING
;
io
.
regsize
=
regsizes
[
i
];
if
(
!
io
.
regsize
)
io
.
regsize
=
DEFAULT_REGSIZE
;
io
.
regshift
=
regshifts
[
i
];
io
.
irq
=
irqs
[
i
];
if
(
io
.
irq
)
io
.
irq_setup
=
ipmi_std_irq_setup
;
io
.
slave_addr
=
slave_addrs
[
i
];
ret
=
ipmi_si_add_smi
(
&
io
);
}
return
ret
;
}
#ifdef CONFIG_ACPI
/*
...
...
@@ -3349,8 +3226,6 @@ static int try_smi_init(struct smi_info *new_smi)
static
int
init_ipmi_si
(
void
)
{
int
i
;
char
*
str
;
int
rv
;
struct
smi_info
*
e
;
enum
ipmi_addr_src
type
=
SI_INVALID
;
...
...
@@ -3366,26 +3241,11 @@ static int init_ipmi_si(void)
}
}
/* Parse out the si_type string into its components. */
str
=
si_type_str
;
if
(
*
str
!=
'\0'
)
{
for
(
i
=
0
;
(
i
<
SI_MAX_PARMS
)
&&
(
*
str
!=
'\0'
);
i
++
)
{
si_type
[
i
]
=
str
;
str
=
strchr
(
str
,
','
);
if
(
str
)
{
*
str
=
'\0'
;
str
++
;
}
else
{
break
;
}
}
}
pr_info
(
"IPMI System Interface driver.
\n
"
);
/* If the user gave us a device, they presumably want us to use it */
if
(
!
hardcode_find_bmc
())
return
0
;
if
(
!
ipmi_si_
hardcode_find_bmc
())
goto
do_scan
;
#ifdef CONFIG_PCI
if
(
si_trypci
)
{
...
...
@@ -3411,7 +3271,7 @@ static int init_ipmi_si(void)
with multiple BMCs we assume that there will be several instances
of a given type so if we succeed in registering a type then also
try to register everything else of the same type */
do_scan:
mutex_lock
(
&
smi_infos_lock
);
list_for_each_entry
(
e
,
&
smi_infos
,
link
)
{
/* Try to register a device if it has an IRQ and we either
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment