/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#include <cma.h>
#include <fcntl.h>
#include <unistd.h>
#include <strings.h>
#include <errno.h>
#include <time.h>
#include <fm/fmd_agent.h>
#include <sys/processor.h>
#ifndef opl
/*
* hc-scheme resource.
*
* If the fault is found to be diagnosed under the old topology, the resource
* will not exist in the current topology, then we fall back to legacy retire
* (using the "cpu" scheme ASRU).
*/
static boolean_t
{
#ifdef i386
char *name;
#endif
return (B_TRUE);
#ifdef i386
/*
* x86 has moved from "motherboard/chip/cpu" topo to
* "motherboard/chip/core/strand"
*/
== 0 && nhcl == 3 &&
return (B_TRUE);
#endif
return (B_FALSE);
}
/* ARGSUSED */
int
{
int i, err;
/*
* For the cached faults which were diagnosed under the old
* topology, we fall back to retire by using cpu-scheme ASRUs.
* Under xVM Dom0, since logic cpuid in "cpu" scheme ASRU makes no
* sense, the fault should be ignored.
*/
if (old_topo_fault(nvl)) {
#ifdef i386
if (! cma_is_native)
return (CMA_RA_FAILURE);
#endif
}
/*
*/
} else {
if (repair) {
} else {
for (i = 0; i < cma.cma_cpu_tries; i++) {
if (err == FMD_AGENT_RETIRE_DONE)
break;
NULL);
}
}
}
if (err == FMD_AGENT_RETIRE_DONE) {
if (repair)
else
} else {
rc = CMA_RA_FAILURE;
#ifdef sun4v
/* libldom requests are processed asynchronously */
#endif
}
}
} else {
}
return (rc);
}
#else /* opl */
/* ARGSUSED 4 */
int
{
/* OPL has ASRU in "hc" scheme */
&hc_spec_nvl) != 0) {
"cma_cpu_hc_retire lookup hc_spec_nvl failed\n");
return (CMA_RA_FAILURE);
}
"cma_cpu_hc_retire lookup cpuid array failed\n");
return (CMA_RA_FAILURE);
}
for (i = 0; i < nprs; i++) {
if (nvlist_lookup_uint32(hc_prs[i],
FM_FMRI_CPU_ID, &cpuid) != 0) {
return (CMA_RA_FAILURE);
}
!= CMA_RA_SUCCESS) {
return (CMA_RA_FAILURE);
}
}
return (CMA_RA_SUCCESS);
}
#endif /* opl */
/*
* The rest of this file uses ASRUs to do retire, this is now not the
* preferable way, but it's still needed for some circumstances when
* retire via topo methods can't work, ie.
*
* 1) There are legacy platforms which don't have full topology.
* 2) The resources in the FMD cached faults may not be set or exist in the
* up-to-dated topology.
*/
/* ARGSUSED */
static int
{
if (cma.cma_cpu_doonline) {
B_TRUE);
} else {
cpuid);
}
/* OPL performs the blacklist in the service processor */
#ifndef opl
if (cma.cma_cpu_dounblacklist) {
} else {
}
#endif /* opl */
return (err);
}
/* ARGSUSED */
static int
{
if (cma.cma_cpu_dooffline) {
if (cma.cma_cpu_forcedoffline)
B_FALSE);
} else {
cpuid);
}
/* OPL performs the blacklist in the service processor */
#ifndef opl
if (cma.cma_cpu_doblacklist) {
} else {
cpuid);
}
#endif /* opl */
return (err);
}
static int
{
if (repair)
else
}
const char *
{
switch (state) {
case P_OFFLINE:
return (PS_OFFLINE);
case P_ONLINE:
return (PS_ONLINE);
case P_FAULTED:
return (PS_FAULTED);
case P_POWEROFF:
return (PS_POWEROFF);
case P_NOINTR:
return (PS_NOINTR);
case P_SPARE:
return (PS_SPARE);
default:
return ("unknown");
}
}
int
{
return (CMA_RA_FAILURE);
}
}