powerpc/pseries: Stop using eeh_ops->init()
Fold pseries_eeh_init() into eeh_pseries_init() rather than having eeh_init() call it via eeh_ops->init(). It's simpler and it'll let us delete eeh_ops.init. Signed-off-by: Oliver O'Halloran <oohall@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20200918093050.37344-3-oohall@gmail.com
This commit is contained in:
parent
82a1ea21f1
commit
1f8fa0cd6a
@ -237,88 +237,6 @@ static unsigned char slot_errbuf[RTAS_ERROR_LOG_MAX];
|
||||
static DEFINE_SPINLOCK(slot_errbuf_lock);
|
||||
static int eeh_error_buf_size;
|
||||
|
||||
/**
|
||||
* pseries_eeh_init - EEH platform dependent initialization
|
||||
*
|
||||
* EEH platform dependent initialization on pseries.
|
||||
*/
|
||||
static int pseries_eeh_init(void)
|
||||
{
|
||||
struct pci_controller *phb;
|
||||
struct pci_dn *pdn;
|
||||
int addr, config_addr;
|
||||
|
||||
/* figure out EEH RTAS function call tokens */
|
||||
ibm_set_eeh_option = rtas_token("ibm,set-eeh-option");
|
||||
ibm_set_slot_reset = rtas_token("ibm,set-slot-reset");
|
||||
ibm_read_slot_reset_state2 = rtas_token("ibm,read-slot-reset-state2");
|
||||
ibm_read_slot_reset_state = rtas_token("ibm,read-slot-reset-state");
|
||||
ibm_slot_error_detail = rtas_token("ibm,slot-error-detail");
|
||||
ibm_get_config_addr_info2 = rtas_token("ibm,get-config-addr-info2");
|
||||
ibm_get_config_addr_info = rtas_token("ibm,get-config-addr-info");
|
||||
ibm_configure_pe = rtas_token("ibm,configure-pe");
|
||||
|
||||
/*
|
||||
* ibm,configure-pe and ibm,configure-bridge have the same semantics,
|
||||
* however ibm,configure-pe can be faster. If we can't find
|
||||
* ibm,configure-pe then fall back to using ibm,configure-bridge.
|
||||
*/
|
||||
if (ibm_configure_pe == RTAS_UNKNOWN_SERVICE)
|
||||
ibm_configure_pe = rtas_token("ibm,configure-bridge");
|
||||
|
||||
/*
|
||||
* Necessary sanity check. We needn't check "get-config-addr-info"
|
||||
* and its variant since the old firmware probably support address
|
||||
* of domain/bus/slot/function for EEH RTAS operations.
|
||||
*/
|
||||
if (ibm_set_eeh_option == RTAS_UNKNOWN_SERVICE ||
|
||||
ibm_set_slot_reset == RTAS_UNKNOWN_SERVICE ||
|
||||
(ibm_read_slot_reset_state2 == RTAS_UNKNOWN_SERVICE &&
|
||||
ibm_read_slot_reset_state == RTAS_UNKNOWN_SERVICE) ||
|
||||
ibm_slot_error_detail == RTAS_UNKNOWN_SERVICE ||
|
||||
ibm_configure_pe == RTAS_UNKNOWN_SERVICE) {
|
||||
pr_info("EEH functionality not supported\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Initialize error log lock and size */
|
||||
spin_lock_init(&slot_errbuf_lock);
|
||||
eeh_error_buf_size = rtas_token("rtas-error-log-max");
|
||||
if (eeh_error_buf_size == RTAS_UNKNOWN_SERVICE) {
|
||||
pr_info("%s: unknown EEH error log size\n",
|
||||
__func__);
|
||||
eeh_error_buf_size = 1024;
|
||||
} else if (eeh_error_buf_size > RTAS_ERROR_LOG_MAX) {
|
||||
pr_info("%s: EEH error log size %d exceeds the maximal %d\n",
|
||||
__func__, eeh_error_buf_size, RTAS_ERROR_LOG_MAX);
|
||||
eeh_error_buf_size = RTAS_ERROR_LOG_MAX;
|
||||
}
|
||||
|
||||
/* Set EEH probe mode */
|
||||
eeh_add_flag(EEH_PROBE_MODE_DEVTREE | EEH_ENABLE_IO_FOR_LOG);
|
||||
|
||||
/* Set EEH machine dependent code */
|
||||
ppc_md.pcibios_bus_add_device = pseries_pcibios_bus_add_device;
|
||||
|
||||
if (is_kdump_kernel() || reset_devices) {
|
||||
pr_info("Issue PHB reset ...\n");
|
||||
list_for_each_entry(phb, &hose_list, list_node) {
|
||||
pdn = list_first_entry(&PCI_DN(phb->dn)->child_list, struct pci_dn, list);
|
||||
addr = (pdn->busno << 16) | (pdn->devfn << 8);
|
||||
config_addr = pseries_eeh_get_config_addr(phb, addr);
|
||||
/* invalid PE config addr */
|
||||
if (config_addr == 0)
|
||||
continue;
|
||||
|
||||
pseries_eeh_phb_reset(phb, config_addr, EEH_RESET_FUNDAMENTAL);
|
||||
pseries_eeh_phb_reset(phb, config_addr, EEH_RESET_DEACTIVATE);
|
||||
pseries_eeh_phb_configure_bridge(phb, config_addr);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pseries_eeh_cap_start(struct pci_dn *pdn)
|
||||
{
|
||||
u32 status;
|
||||
@ -963,7 +881,6 @@ static int pseries_notify_resume(struct eeh_dev *edev)
|
||||
|
||||
static struct eeh_ops pseries_eeh_ops = {
|
||||
.name = "pseries",
|
||||
.init = pseries_eeh_init,
|
||||
.probe = pseries_eeh_probe,
|
||||
.set_option = pseries_eeh_set_option,
|
||||
.get_state = pseries_eeh_get_state,
|
||||
@ -988,7 +905,77 @@ static struct eeh_ops pseries_eeh_ops = {
|
||||
*/
|
||||
static int __init eeh_pseries_init(void)
|
||||
{
|
||||
int ret;
|
||||
struct pci_controller *phb;
|
||||
struct pci_dn *pdn;
|
||||
int ret, addr, config_addr;
|
||||
|
||||
/* figure out EEH RTAS function call tokens */
|
||||
ibm_set_eeh_option = rtas_token("ibm,set-eeh-option");
|
||||
ibm_set_slot_reset = rtas_token("ibm,set-slot-reset");
|
||||
ibm_read_slot_reset_state2 = rtas_token("ibm,read-slot-reset-state2");
|
||||
ibm_read_slot_reset_state = rtas_token("ibm,read-slot-reset-state");
|
||||
ibm_slot_error_detail = rtas_token("ibm,slot-error-detail");
|
||||
ibm_get_config_addr_info2 = rtas_token("ibm,get-config-addr-info2");
|
||||
ibm_get_config_addr_info = rtas_token("ibm,get-config-addr-info");
|
||||
ibm_configure_pe = rtas_token("ibm,configure-pe");
|
||||
|
||||
/*
|
||||
* ibm,configure-pe and ibm,configure-bridge have the same semantics,
|
||||
* however ibm,configure-pe can be faster. If we can't find
|
||||
* ibm,configure-pe then fall back to using ibm,configure-bridge.
|
||||
*/
|
||||
if (ibm_configure_pe == RTAS_UNKNOWN_SERVICE)
|
||||
ibm_configure_pe = rtas_token("ibm,configure-bridge");
|
||||
|
||||
/*
|
||||
* Necessary sanity check. We needn't check "get-config-addr-info"
|
||||
* and its variant since the old firmware probably support address
|
||||
* of domain/bus/slot/function for EEH RTAS operations.
|
||||
*/
|
||||
if (ibm_set_eeh_option == RTAS_UNKNOWN_SERVICE ||
|
||||
ibm_set_slot_reset == RTAS_UNKNOWN_SERVICE ||
|
||||
(ibm_read_slot_reset_state2 == RTAS_UNKNOWN_SERVICE &&
|
||||
ibm_read_slot_reset_state == RTAS_UNKNOWN_SERVICE) ||
|
||||
ibm_slot_error_detail == RTAS_UNKNOWN_SERVICE ||
|
||||
ibm_configure_pe == RTAS_UNKNOWN_SERVICE) {
|
||||
pr_info("EEH functionality not supported\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Initialize error log lock and size */
|
||||
spin_lock_init(&slot_errbuf_lock);
|
||||
eeh_error_buf_size = rtas_token("rtas-error-log-max");
|
||||
if (eeh_error_buf_size == RTAS_UNKNOWN_SERVICE) {
|
||||
pr_info("%s: unknown EEH error log size\n",
|
||||
__func__);
|
||||
eeh_error_buf_size = 1024;
|
||||
} else if (eeh_error_buf_size > RTAS_ERROR_LOG_MAX) {
|
||||
pr_info("%s: EEH error log size %d exceeds the maximal %d\n",
|
||||
__func__, eeh_error_buf_size, RTAS_ERROR_LOG_MAX);
|
||||
eeh_error_buf_size = RTAS_ERROR_LOG_MAX;
|
||||
}
|
||||
|
||||
/* Set EEH probe mode */
|
||||
eeh_add_flag(EEH_PROBE_MODE_DEVTREE | EEH_ENABLE_IO_FOR_LOG);
|
||||
|
||||
/* Set EEH machine dependent code */
|
||||
ppc_md.pcibios_bus_add_device = pseries_pcibios_bus_add_device;
|
||||
|
||||
if (is_kdump_kernel() || reset_devices) {
|
||||
pr_info("Issue PHB reset ...\n");
|
||||
list_for_each_entry(phb, &hose_list, list_node) {
|
||||
pdn = list_first_entry(&PCI_DN(phb->dn)->child_list, struct pci_dn, list);
|
||||
addr = (pdn->busno << 16) | (pdn->devfn << 8);
|
||||
config_addr = pseries_eeh_get_config_addr(phb, addr);
|
||||
/* invalid PE config addr */
|
||||
if (config_addr == 0)
|
||||
continue;
|
||||
|
||||
pseries_eeh_phb_reset(phb, config_addr, EEH_RESET_FUNDAMENTAL);
|
||||
pseries_eeh_phb_reset(phb, config_addr, EEH_RESET_DEACTIVATE);
|
||||
pseries_eeh_phb_configure_bridge(phb, config_addr);
|
||||
}
|
||||
}
|
||||
|
||||
ret = eeh_init(&pseries_eeh_ops);
|
||||
if (!ret)
|
||||
|
Loading…
Reference in New Issue
Block a user