3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * CDDL HEADER START
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * The contents of this file are subject to the terms of the
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Common Development and Distribution License, Version 1.0 only
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * (the "License"). You may not use this file except in compliance
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * with the License.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * or http://www.opensolaris.org/os/licensing.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * See the License for the specific language governing permissions
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * and limitations under the License.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * When distributing Covered Code, include this CDDL HEADER in each
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * If applicable, add the following below this CDDL HEADER, with the
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * fields enclosed by brackets "[]" replaced with your own identifying
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * information: Portions Copyright [yyyy] [name of copyright owner]
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * CDDL HEADER END
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Use is subject to license terms.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#pragma ident "%Z%%M% %I% %E% SMI"
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <stddef.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <stdlib.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <unistd.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <ctype.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <fcntl.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <signal.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <string.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <locale.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <errno.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <assert.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/dditypes.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/param.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/obpdefs.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/fhc.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/sysctrl.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/ac.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/spitregs.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <config_admin.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include "mema_util.h"
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include "mema_test.h"
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include "mema_prom.h"
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#ifdef DEBUG
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DBG (void) printf
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DBG1 (void) printf
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DBG3 (void) printf
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DBG4 (void) printf
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DBG(a, b)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DBG1(a)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DBG3(a, b, c)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DBG4(a, b, c, d)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#endif
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#ifndef P_DER_UE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * <sys/spitregs.h> has these defines inside 'ifdef _KERNEL' at the
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * time of writing. Re-define here if that is still the case.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define P_DER_UE 0x00000000000000200ULL /* UE has occurred */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define P_DER_CE 0x00000000000000100ULL /* CE has occurred */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define P_DER_E_SYND 0x000000000000000FFULL /* SYND<7:0>: ECC syndrome */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#endif /* ! P_DER_UE */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DEV_DEBUG
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#ifdef DEV_DEBUG
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <stdio.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <stdlib.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic FILE *debug_fp;
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int debugging(void);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void dump_ioctl(int, void *);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void dump_ioctl_res(int, void *, int, int);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#else /* DEV_DEBUG */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define dump_ioctl(CMD, ARG)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define dump_ioctl_res(CMD, ARG, RET, ERRNO)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#endif /* DEV_DEBUG */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afsteveltypedef struct {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel uint_t board;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel uint_t bank;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel} mema_bank_t;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic char *mema_opts[] = {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define OPT_BOOT_DISABLE 0
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "disable-at-boot",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define OPT_BOOT_ENABLE 1
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "enable-at-boot",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define OPT_TIMEOUT 2
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "timeout",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel NULL
3db86aab554edbb4244c8d1a1c90f152eee768afstevel};
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define OPT_NEEDS_VALUE(O) ((O) == OPT_TIMEOUT)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define MAX_OPT_LENGTH (sizeof ("disable-at-boot"))
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * For each function there is an array of opt_control structures giving
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * the valid options. The array is terminated by an element with the
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * subopt field set to -1. The group field is used to identify
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * mutually exclusive options, with zero meaning no grouping.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstruct opt_control {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int subopt;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int group;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel};
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Returned set of options.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * If the option takes a value, it will be set in 'val'
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * if the corresponding bit is set in 'bits' is set,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * otherwise the pointer in 'val' is undefined.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define OPT_VAL_ARRAY_SIZE 32 /* # bits in 'bits' */
3db86aab554edbb4244c8d1a1c90f152eee768afsteveltypedef struct {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel unsigned int bits;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *val[OPT_VAL_ARRAY_SIZE];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel} option_set_t;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define OPTSET_INIT(S) ((S).bits = 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define _OPT_TO_BIT(O) (1 << (O))
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define OPTSET_SET_VAL(S, O, V) ((S).bits |= _OPT_TO_BIT(O), \
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (S).val[(O)] = (V))
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define OPTSET_TEST(S, O) (((S).bits & _OPT_TO_BIT(O)) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define OPTSET_VAL(S, O) ((S).val[(O)])
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define OPTSET_IS_EMPTY(S) ((S).bits == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic option_set_t process_options(const char *, struct opt_control *,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int *, char **);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic struct opt_control add_opts[] = {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel {OPT_BOOT_ENABLE, 1},
3db86aab554edbb4244c8d1a1c90f152eee768afstevel {OPT_BOOT_DISABLE, 1},
3db86aab554edbb4244c8d1a1c90f152eee768afstevel {-1, 0}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel};
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic struct opt_control del_opts[] = {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel {OPT_BOOT_ENABLE, 1},
3db86aab554edbb4244c8d1a1c90f152eee768afstevel {OPT_BOOT_DISABLE, 1},
3db86aab554edbb4244c8d1a1c90f152eee768afstevel {OPT_TIMEOUT, 2},
3db86aab554edbb4244c8d1a1c90f152eee768afstevel {-1, 0}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel};
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic struct opt_control stat_opts[] = {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel {OPT_BOOT_ENABLE, 1},
3db86aab554edbb4244c8d1a1c90f152eee768afstevel {OPT_BOOT_DISABLE, 1},
3db86aab554edbb4244c8d1a1c90f152eee768afstevel {-1, 0}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel};
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#if !defined(TEXT_DOMAIN)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define TEXT_DOMAIN "SYS_TEST"
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#endif
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char still_testing[] = "bank %s being tested by process %d";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char no_value[] = "sub-option \"%s\" does not take a value";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char missing_value[] = "sub-option \"%s\" needs a value";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char conflict_opt[] = "sub-option \"%s\" conflicts with \"%s\"";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char unk_subopt[] = "sub-option \"%s\" unknown\n"
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "choose from: %s";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char not_valid[] =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "sub-option \"%s\" not valid for this operation\n"
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "choose from: %s";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char timeout_notnum[] =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "timeout value not a positive integer \"%s\"";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char calloc_fail[] = "memory allocation failed (%d*%d bytes)";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char unk_test[] = "test \"%s\" unknown\n"
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "choose from: %s";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char dup_test[] = "more than one test type specified (\"%s\")";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char dup_num[] = "option specified more than once (\"%s\")";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char no_num[] = "invalid number specified for max_errors(\"%s\")";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char mtest_rw_error[] = "memory test read/write error";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char mtest_lib_error[] = "memory test library error";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char dlist_invalid[] = "invalid disabled-memory-list";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char dlist_write_failed[] = "disabled-memory-list write failed";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char mtest_unknown_error[] = "unknown memory test error";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char ap_invalid[] = "invalid attachment point: %s";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char trans_illegal[] = "illegal transition";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char open_failed[] = "open failed: %s: %s";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char mema_help[] = "\nAc specific options:\n";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char disable_opts[] = "\t-o disable-at-boot\n";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char enable_opts[] = "\t-o enable-at-boot\n";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char timeout_opts[] = "\t-o timeout=# (seconds)\n";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char test_opts[] =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "\t-o {quick, normal, extended},[max_errors=#] -t ap_id [ap_id...]\n";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char private_funcs[] = "\t-x relocate-test ap_id [ap_id...]\n";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char add_is_disabled[] = "memory is disabled at boot";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char add_willbe_disabled[] =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "memory will be disabled at boot";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char add_disab_err[] = "cannot get memory disabled status";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char pfunc_unknown[] = "private function \"%s\" unknown";
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define mema_eid(a, b) (((a) << 8) + (b))
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define mema_str(i) mema_strs[(i)]
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_BK_BUSY 0
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_BK_ID 1
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_BD_ID 2
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_BD_TYPE 3
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_BD_STATE 4
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_MEM_TEST_ID 5
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_MEM_TEST_PAR 6
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_MEM_PERM 7
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_KPM_CANCELLED 8
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_KPM_REFUSED 9
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_KPM_SPAN 10
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_KPM_DUP 11
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_KPM_FAULT 12
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_KPM_RESOURCE 13
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_KPM_NOTSUP 14
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_KPM_NOHANDLES 15
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_KPM_NONRELOC 16
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_KPM_HANDLE 17
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_KPM_BUSY 18
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_KPM_NOTVIABLE 19
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_KPM_SEQUENCE 20
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_KPM_NOWORK 21
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_KPM_NOTFINISHED 22
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_KPM_NOTRUNNING 23
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_VMEM 24
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define CMD_MEM_STAT 25
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define CMD_MEM_ADD 26
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define CMD_MEM_DEL 27
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define CMD_MEM_TEST_START 28
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define CMD_MEM_TEST_STOP 29
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_UNKNOWN 30
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_INTR 31
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_TIMEOUT 32
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define CMD_MEM_RELOCTEST 33
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define AC_DEINTLV 34
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic char *
3db86aab554edbb4244c8d1a1c90f152eee768afstevelmema_strs[] = {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "memory bank busy",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "invalid memory bank",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "invalid board id",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "invalid board type",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "invalid board state",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "invalid memory test id",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "invalid memory test parameter(s)",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "no write permission",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "memory operation cancelled",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "memory operation refused",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "memory already in use (add)",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "memory span duplicate (delete)",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "memory access test failed (add)",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "some resource was not available",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "operation not supported",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "cannot allocate any more handles",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "non-relocatable pages in span",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "bad handle supplied",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "memory in span is being deleted",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "VM viability test failed",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "function called out of sequence",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "no memory to delete",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "delete processing not finished",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "delete processing not running",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "insufficient virtual memory",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "memory stat failed: %s",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "memory add failed: %s",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "memory delete failed: %s",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "memory test start failed: %s",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "memory test stop failed: %s",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "unknown error",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "memory delete killed",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "memory delete timeout",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "memory relocate-test failed: %s",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "memory cannot be de-interleaved"
3db86aab554edbb4244c8d1a1c90f152eee768afstevel};
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_MEM_PERM, EBADF, AC_ERR_MEM_PERM
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_BK_BUSY, EBUSY, AC_ERR_MEM_BK
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_KPM_CANCELLED, EINTR, AC_ERR_KPM_CANCELLED
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_KPM_REFUSED, EINTR, AC_ERR_KPM_REFUSED
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_BK_ID, EINVAL, AC_ERR_MEM_BK
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_BD_ID, EINVAL, AC_ERR_BD
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_BD_TYPE, EINVAL, AC_ERR_BD_TYPE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_BD_STATE, EINVAL, AC_ERR_BD_STATE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_MEM_TEST_ID, EINVAL, AC_ERR_MEM_TEST
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_MEM_TEST_PAR, EINVAL, AC_ERR_MEM_TEST_PAR
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_KPM_SPAN, EINVAL, AC_ERR_KPM_SPAN
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_KPM_DUP, EINVAL, AC_ERR_KPM_DUP?
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_KPM_FAULT, EINVAL, AC_ERR_KPM_FAULT
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_KPM_RESOURCE, EINVAL, AC_ERR_KPM_RESOURCE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_KPM_NOTSUP, EINVAL, AC_ERR_KPM_NOTSUP
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_KPM_NOHANDLES, EINVAL, AC_ERR_KPM_NOHANDLES
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_KPM_NONRELOC, EINVAL, AC_ERR_KPM_NONRELOC
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_KPM_HANDLE, EINVAL, AC_ERR_KPM_HANDLE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_KPM_BUSY, EINVAL, AC_ERR_KPM_BUSY
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_KPM_NOTVIABLE, EINVAL, AC_ERR_KPM_NOTVIABLE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_KPM_SEQUENCE, EINVAL, AC_ERR_KPM_SEQUENCE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_KPM_NOWORK, EINVAL, AC_ERR_KPM_NOWORK
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_KPM_NOTFINISHED, EINVAL, AC_ERR_KPM_NOTFINISHED
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_KPM_NOTRUNNING, EINVAL, AC_ERR_KPM_NOTRUNNING
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_VMEM, ENOMEM, AC_ERR_VMEM
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_INTR, EINTR, AC_ERR_INTR
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_TIMEOUT, EINTR, AC_ERR_TIMEOUT
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * AC_DEINTLV, EINVAL, AC_ERR_MEM_DEINTLV
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afstevelmema_sid(int err, int acerr)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (acerr == AC_ERR_DEFAULT)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_UNKNOWN);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (mema_eid(err, acerr)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EBADF, AC_ERR_MEM_PERM):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_MEM_PERM);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EBUSY, AC_ERR_MEM_BK):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_BK_BUSY);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINTR, AC_ERR_KPM_CANCELLED):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_KPM_CANCELLED);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINTR, AC_ERR_KPM_REFUSED):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_KPM_REFUSED);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINVAL, AC_ERR_MEM_BK):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_BK_ID);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINVAL, AC_ERR_BD):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_BD_ID);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINVAL, AC_ERR_BD_TYPE):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_BD_TYPE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINVAL, AC_ERR_BD_STATE):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_BD_STATE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINVAL, AC_ERR_MEM_TEST):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_MEM_TEST_ID);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINVAL, AC_ERR_MEM_TEST_PAR):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_MEM_TEST_PAR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINVAL, AC_ERR_KPM_SPAN):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_KPM_SPAN);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINVAL, AC_ERR_KPM_DUP):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_KPM_DUP);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINVAL, AC_ERR_KPM_FAULT):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_KPM_FAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINVAL, AC_ERR_KPM_RESOURCE):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_KPM_RESOURCE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINVAL, AC_ERR_KPM_NOTSUP):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_KPM_NOTSUP);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINVAL, AC_ERR_KPM_NOHANDLES):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_KPM_NOHANDLES);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINVAL, AC_ERR_KPM_NONRELOC):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_KPM_NONRELOC);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINVAL, AC_ERR_KPM_HANDLE):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_KPM_HANDLE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINVAL, AC_ERR_KPM_BUSY):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_KPM_BUSY);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINVAL, AC_ERR_KPM_NOTVIABLE):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_KPM_NOTVIABLE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINVAL, AC_ERR_KPM_SEQUENCE):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_KPM_SEQUENCE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINVAL, AC_ERR_KPM_NOWORK):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_KPM_NOWORK);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINVAL, AC_ERR_KPM_NOTFINISHED):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_KPM_NOTFINISHED);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINVAL, AC_ERR_KPM_NOTRUNNING):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_KPM_NOTRUNNING);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(ENOMEM, AC_ERR_VMEM):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_VMEM);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINTR, AC_ERR_INTR):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_INTR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINTR, AC_ERR_TIMEOUT):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_TIMEOUT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case mema_eid(EINVAL, AC_ERR_MEM_DEINTLV):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_DEINTLV);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (AC_UNKNOWN);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelmema_err(ac_cfga_cmd_t *ac, int ret_errno, char **errstring, int cmd)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *cname = mema_str(cmd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *syserr;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char syserr_num[20];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ac) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel syserr = mema_str(mema_sid(ret_errno, ac->errtype));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel syserr = dgettext(TEXT_DOMAIN, syserr);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel syserr = strerror(ret_errno);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* strerror() does its own gettext(). */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (syserr == NULL) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) sprintf(syserr_num, "errno=%d", errno);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel syserr = syserr_num;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, strlen(syserr),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, cname), syserr);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelmema_cmd_init(ac_cfga_cmd_t *ac, void *cmd, char *outputstr, int force)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) memset((void *)ac, 0, sizeof (*ac));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac->errtype = AC_ERR_DEFAULT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac->private = cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac->force = force;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac->outputstr = outputstr;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) memset((void *)outputstr, 0, AC_OUTPUT_LEN);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afstevelap_bk_idx(const char *ap_id)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int id;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *s;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel static char *bank = "bank";
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DBG("ap_bk_idx(%s)\n", ap_id);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((s = strstr(ap_id, bank)) == NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (-1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int n;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel s += strlen(bank);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel n = strlen(s);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DBG3("ap_bk_idx: s=%s, n=%d\n", s, n);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((n != 1) || !isdigit(s[0]))
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (-1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel id = atoi(s);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (id < 0 || id > 1)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (-1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DBG3("ap_bk_idx(%s)=%d\n", s, id);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (id);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic cfga_err_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelap_stat(
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *bank_spec,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int *fdp,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_bank_t *bkp,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_stat_t *stp,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char **errstring)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int fd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int ret, ret_errno;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int bank;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_bank_t bk;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_stat_t stat;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_cfga_cmd_t cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char outputstr[AC_OUTPUT_LEN];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((bank = ap_bk_idx(bank_spec)) == -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, strlen(bank_spec),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, ap_invalid), bank_spec);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel bk.bank = bank;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((fd = open(bank_spec, ((fdp != NULL) ? O_RDWR : O_RDONLY), 0)) ==
3db86aab554edbb4244c8d1a1c90f152eee768afstevel -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *syserr;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char syserr_num[20];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel syserr = strerror(errno);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (syserr == NULL) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) sprintf(syserr_num, "errno=%d", errno);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel syserr = syserr_num;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, strlen(syserr) +
3db86aab554edbb4244c8d1a1c90f152eee768afstevel strlen(bank_spec),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, open_failed), bank_spec, syserr);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_cmd_init(&cmd, &stat, outputstr, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dump_ioctl(AC_MEM_STAT, NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = ioctl(fd, AC_MEM_STAT, &cmd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret_errno = errno;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dump_ioctl_res(AC_MEM_STAT, &stat, ret, ret_errno);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ret == -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_err(&cmd, ret_errno, errstring, CMD_MEM_STAT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (fdp)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *fdp = fd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (stp)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *stp = stat;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (bkp) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel bkp->bank = bk.bank;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel bkp->board = stat.board;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_OK);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelset_disabled_bits(mema_disabled_t *dp, int value)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (value == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *dp &= ~PROM_MEMORY_DISABLED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *dp |= PROM_MEMORY_DISABLED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelset_present_bits(mema_disabled_t *dp, ac_stat_t *asp)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (asp->ostate == SYSC_CFGA_OSTATE_CONFIGURED)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *dp |= PROM_MEMORY_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *dp &= ~PROM_MEMORY_DISABLED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic cfga_err_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelprom_do_options(
3db86aab554edbb4244c8d1a1c90f152eee768afstevel option_set_t do_option,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int board,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_stat_t *asp,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char **errstring)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err_t ret;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_disabled_t disab;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (!prom_read_disabled_list(&disab, board))
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel set_present_bits(&disab, asp);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = CFGA_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (OPTSET_TEST(do_option, OPT_BOOT_ENABLE)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel set_disabled_bits(&disab, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (!prom_viable_disabled_list(&disab)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, 0,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, dlist_invalid));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = CFGA_ERROR;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (!prom_write_disabled_list(&disab, board)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, 0,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, dlist_write_failed));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = CFGA_ERROR;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (OPTSET_TEST(do_option, OPT_BOOT_DISABLE)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel set_disabled_bits(&disab, 1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (!prom_viable_disabled_list(&disab)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, 0,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, dlist_invalid));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = CFGA_ERROR;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (!prom_write_disabled_list(&disab, board)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, 0,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, dlist_write_failed));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = CFGA_ERROR;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ret);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic cfga_err_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelmema_add(
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *bank_spec,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *options,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char **errstring,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int force)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_bank_t bk;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int fd, ret, ret_errno;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel option_set_t do_option;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_cfga_cmd_t cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_stat_t stat;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char outputstr[AC_OUTPUT_LEN];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel do_option = process_options(options, add_opts, &ret, errstring);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ret != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ret);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = ap_stat(bank_spec, &fd, &bk, &stat, errstring);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ret != CFGA_OK)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ret);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (stat.rstate != SYSC_CFGA_RSTATE_CONNECTED ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel stat.ostate != SYSC_CFGA_OSTATE_UNCONFIGURED) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, 0,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, trans_illegal));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (!force) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_disabled_t disab;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (prom_read_disabled_list(&disab, bk.board)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (disab != 0 &&
3db86aab554edbb4244c8d1a1c90f152eee768afstevel !OPTSET_TEST(do_option, OPT_BOOT_ENABLE)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, 0,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, add_is_disabled));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (disab == 0 &&
3db86aab554edbb4244c8d1a1c90f152eee768afstevel OPTSET_TEST(do_option, OPT_BOOT_DISABLE)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, 0,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, add_willbe_disabled));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, 0,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, add_disab_err));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_cmd_init(&cmd, NULL, outputstr, force);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dump_ioctl(AC_MEM_CONFIGURE, NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = ioctl(fd, AC_MEM_CONFIGURE, &cmd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret_errno = errno;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dump_ioctl_res(AC_MEM_CONFIGURE, NULL, ret, ret_errno);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ret == -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_err(&cmd, ret_errno, errstring, CMD_MEM_ADD);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = prom_do_options(do_option, bk.board, &stat, errstring);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ret);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic cfga_err_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelmema_delete(
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *bank_spec,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *options,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char **errstring,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int force)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_bank_t bk;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int fd, ret, ret_errno;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel option_set_t do_option;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_cfga_cmd_t cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_stat_t stat;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char outputstr[AC_OUTPUT_LEN];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int timeout_secs = -1; /* Init to 'use default'. */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel do_option = process_options(options, del_opts, &ret, errstring);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ret != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ret);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (OPTSET_TEST(do_option, OPT_TIMEOUT)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *to_val;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *ep;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel to_val = OPTSET_VAL(do_option, OPT_TIMEOUT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel timeout_secs = (int)strtol(to_val, &ep, 10);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (*ep != '\0' || ep == to_val || timeout_secs < 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, strlen(to_val),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, timeout_notnum), to_val);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = ap_stat(bank_spec, &fd, &bk, &stat, errstring);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ret != CFGA_OK)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ret);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (stat.rstate != SYSC_CFGA_RSTATE_CONNECTED ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel stat.ostate != SYSC_CFGA_OSTATE_CONFIGURED) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, 0,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, trans_illegal));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_cmd_init(&cmd, NULL, outputstr, force);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmd.arg = timeout_secs;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dump_ioctl(AC_MEM_UNCONFIGURE, NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = ioctl(fd, AC_MEM_UNCONFIGURE, &cmd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret_errno = errno;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dump_ioctl_res(AC_MEM_UNCONFIGURE, NULL, ret, ret_errno);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ret == -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_err(&cmd, ret_errno, errstring, CMD_MEM_DEL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = prom_do_options(do_option, bk.board, &stat, errstring);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ret);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*ARGSUSED*/
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_err_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_change_state(
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_cmd_t state_change_cmd,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *ap_id,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *options,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel struct cfga_confirm *confp,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel struct cfga_msg *msgp,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char **errstring,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_flags_t flags)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int force;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err_t rc;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (errstring != NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *errstring = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel force = flags & CFGA_FLAG_FORCE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (state_change_cmd) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case CFGA_CMD_CONFIGURE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rc = mema_add(ap_id, options, errstring, force);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case CFGA_CMD_UNCONFIGURE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rc = mema_delete(ap_id, options, errstring, force);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rc = CFGA_OPNOTSUPP;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (rc);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*ARGSUSED*/
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_err_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_private_func(
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *function,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *ap_id,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *options,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel struct cfga_confirm *confp,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel struct cfga_msg *msgp,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char **errstring,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_flags_t flags)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_bank_t bk;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_stat_t stat;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int fd, ret, ret_errno;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_cfga_cmd_t cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char outputstr[AC_OUTPUT_LEN];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (errstring != NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *errstring = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = ap_stat(ap_id, &fd, &bk, &stat, errstring);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ret != CFGA_OK)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ret);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (strcmp(function, "relocate-test") == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel struct ac_memx_relocate_stats rstat;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_cmd_init(&cmd, NULL, outputstr,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (flags & CFGA_FLAG_FORCE));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmd.arg = AC_MEMX_RELOCATE_ALL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmd.private = &rstat;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) memset((void *)&rstat, 0, sizeof (rstat));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dump_ioctl(AC_MEM_EXERCISE, &cmd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = ioctl(fd, AC_MEM_EXERCISE, &cmd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret_errno = errno;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dump_ioctl_res(AC_MEM_EXERCISE, &cmd, ret, ret_errno);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ret == -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_err(&cmd, ret_errno, errstring, CMD_MEM_RELOCTEST);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_OK);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, strlen(function),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, pfunc_unknown), function);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afstevelmtest_run(
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int fd,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int test_fun,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_bank_t *abkp,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel struct cfga_msg *msgp,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char **errstring,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ulong_t max_errors)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_mem_test_start_t test_start;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_mem_test_stop_t test_stop;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel struct mtest_handle handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int ret, ret_errno;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int res;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_cfga_cmd_t cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char outputstr[AC_OUTPUT_LEN];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) memset((void *)&test_start, 0, sizeof (test_start));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_cmd_init(&cmd, &test_start, outputstr, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dump_ioctl(AC_MEM_TEST_START, &test_start);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = ioctl(fd, AC_MEM_TEST_START, &cmd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret_errno = errno;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dump_ioctl_res(AC_MEM_TEST_START, &test_start, ret, ret_errno);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ret == -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ret_errno == ENOTSUP) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_err(&cmd, ret_errno, errstring,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel CMD_MEM_TEST_START);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_OPNOTSUPP);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ret_errno == EBUSY && test_start.tester_pid > 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Bank appears to be being tested. Check that
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * process 'tester_pid' is still running.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (kill(test_start.tester_pid, 0) != -1 ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel errno != ESRCH) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_ap_log_id_t bname;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* Process still exists. */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) sprintf(bname, "board %d bank%d",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel abkp->board, abkp->bank);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, strlen(bname),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, still_testing),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel bname, test_start.tester_pid);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Do a test stop and re-try the start.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) memset((void *)&test_stop, 0,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (test_stop));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel test_stop.handle = test_start.handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel test_stop.condition = SYSC_CFGA_COND_UNKNOWN;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_cmd_init(&cmd, &test_stop, outputstr, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dump_ioctl(AC_MEM_TEST_STOP, &test_stop);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = ioctl(fd, AC_MEM_TEST_STOP, &cmd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret_errno = errno;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dump_ioctl_res(AC_MEM_TEST_STOP, &test_stop,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret, ret_errno);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Ignore test stop error processing and re-try the
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * start. The error return will be derived from the
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * result of start.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) memset((void *)&test_start, 0,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (test_start));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_cmd_init(&cmd, &test_start, outputstr, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dump_ioctl(AC_MEM_TEST_START, &test_start);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = ioctl(fd, AC_MEM_TEST_START, &cmd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret_errno = errno;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dump_ioctl_res(AC_MEM_TEST_START, &test_start,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret, ret_errno);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* Test return code again to cover the case of a re-try. */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ret == -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_err(&cmd, ret_errno, errstring,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel CMD_MEM_TEST_START);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) memset((void *)&handle, 0, sizeof (handle));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel handle.fd = fd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel handle.drvhandle = (void *)&test_start;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel handle.msgp = msgp;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel handle.bank_size = test_start.bank_size;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel handle.page_size = test_start.page_size;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel handle.line_size = test_start.line_size;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel handle.lines_per_page = test_start.page_size / test_start.line_size;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel handle.condition = CFGA_COND_UNKNOWN;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel handle.max_errors = max_errors;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel res = (*mtest_table[test_fun].test_func)(&handle);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mtest_deallocate_buf_all(&handle);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Convert memory test code to MEMA_ code.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (res) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case MTEST_DONE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel res = CFGA_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case MTEST_LIB_ERROR:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, 0, dgettext(TEXT_DOMAIN,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mtest_lib_error));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel res = CFGA_ERROR;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case MTEST_DEV_ERROR:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, 0, dgettext(TEXT_DOMAIN,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mtest_rw_error));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel res = CFGA_ERROR;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, 0, dgettext(TEXT_DOMAIN,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mtest_unknown_error));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel res = CFGA_ERROR;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel assert(0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) memset((void *)&test_stop, 0, sizeof (test_stop));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel test_stop.handle = test_start.handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (handle.condition) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case CFGA_COND_OK:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel test_stop.condition = SYSC_CFGA_COND_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case CFGA_COND_FAILING:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel test_stop.condition = SYSC_CFGA_COND_FAILING;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case CFGA_COND_FAILED:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel test_stop.condition = SYSC_CFGA_COND_FAILED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case CFGA_COND_UNKNOWN:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel test_stop.condition = SYSC_CFGA_COND_UNKNOWN;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel test_stop.condition = SYSC_CFGA_COND_UNKNOWN;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel assert(0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_cmd_init(&cmd, &test_stop, outputstr, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dump_ioctl(AC_MEM_TEST_STOP, &test_stop);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = ioctl(fd, AC_MEM_TEST_STOP, &cmd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret_errno = errno;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dump_ioctl_res(AC_MEM_TEST_STOP, &test_stop, ret, ret_errno);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ret == -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_err(&cmd, ret_errno, errstring,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel CMD_MEM_TEST_STOP);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (res);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DRVHANDLE(H) (((ac_mem_test_start_t *)(H)->drvhandle)->handle)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelint
3db86aab554edbb4244c8d1a1c90f152eee768afstevelmtest_write(
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mtest_handle_t handle,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel void *page_buf,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel u_longlong_t page_no,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel uint_t line_offset,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel uint_t line_count)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_mem_test_write_t test_write;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int fd, ret, ret_errno;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_cfga_cmd_t cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char outputstr[AC_OUTPUT_LEN];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) memset((void *)&test_write, 0, sizeof (test_write));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel fd = handle->fd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel test_write.handle = DRVHANDLE(handle);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel test_write.page_buf = page_buf;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel test_write.address.page_num = page_no;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel test_write.address.line_offset = line_offset;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (line_count == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel test_write.address.line_count = handle->lines_per_page;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel test_write.address.line_count = line_count;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_cmd_init(&cmd, &test_write, outputstr, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dump_ioctl(AC_MEM_TEST_WRITE, &test_write);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = ioctl(fd, AC_MEM_TEST_WRITE, &cmd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret_errno = errno;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dump_ioctl_res(AC_MEM_TEST_WRITE, &test_write, ret, ret_errno);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ret == -1)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (-1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelint
3db86aab554edbb4244c8d1a1c90f152eee768afstevelmtest_read(
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mtest_handle_t handle,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel void *page_buf,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel u_longlong_t page_no,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel uint_t line_offset,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel uint_t line_count,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel struct mtest_error *errp)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_mem_test_read_t test_read;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sunfire_processor_error_regs_t errbuf;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int fd, ret, ret_errno;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_cfga_cmd_t cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char outputstr[AC_OUTPUT_LEN];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) memset((void *)&test_read, 0, sizeof (test_read));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) memset((void *)&errbuf, 0, sizeof (errbuf));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel fd = handle->fd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel test_read.handle = DRVHANDLE(handle);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel test_read.page_buf = page_buf;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel test_read.address.page_num = page_no;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel test_read.address.line_offset = line_offset;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel test_read.error_buf = &errbuf;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (line_count == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel test_read.address.line_count = handle->lines_per_page;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel test_read.address.line_count = line_count;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_cmd_init(&cmd, &test_read, outputstr, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dump_ioctl(AC_MEM_TEST_READ, &test_read);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = ioctl(fd, AC_MEM_TEST_READ, &cmd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret_errno = errno;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dump_ioctl_res(AC_MEM_TEST_READ, &test_read, ret, ret_errno);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ret == -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ret_errno == EIO) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Special case indicating CE or UE.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (((errbuf.udbh_error_reg | errbuf.udbl_error_reg) &
3db86aab554edbb4244c8d1a1c90f152eee768afstevel P_DER_UE) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel errp->error_type = MTEST_ERR_UE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel errp->error_type = MTEST_ERR_CE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (-1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel errp->error_type = MTEST_ERR_NONE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic char *
3db86aab554edbb4244c8d1a1c90f152eee768afstevelsubopt_help_str(char *opts[])
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *str;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *sep;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int len;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int i, n;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel static const char help_sep[] = ", ";
3db86aab554edbb4244c8d1a1c90f152eee768afstevel static const char help_nil[] = "???";
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel len = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel n = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (i = 0; opts[i] != NULL; i++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel n++;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel len += strlen(opts[i]);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (n == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (strdup(help_nil));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel len += (n - 1) * strlen(help_sep);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel len++;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel str = (char *)malloc(len);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (str == NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *str = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sep = "";
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (i = 0; opts[i] != NULL; i++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) strcat(str, sep);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) strcat(str, opts[i]);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sep = help_sep;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (str);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*ARGSUSED*/
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_err_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_test(
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *ap_id,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *options,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel struct cfga_msg *msgp,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char **errstring,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_flags_t flags)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_bank_t bk;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_stat_t stat;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int test_fun = -1;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int fd, ret;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int maxerr_idx;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel long max_errors = -1;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *ret_p;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (errstring != NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *errstring = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Decode test level and max error number.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (options != NULL && *options != '\0') {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char **opts;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *value;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *cp, *free_cp;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int subopt;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* getsubopt() modifies the input string, so copy it. */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cp = strdup(options);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (cp == NULL) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_LIB_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel free_cp = cp;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel opts = mtest_build_opts(&maxerr_idx);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (opts == NULL) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel free((void *)free_cp);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_LIB_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel while (*cp != '\0') {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel subopt = getsubopt(&cp, opts, &value);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (subopt == -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *hlp;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel hlp = subopt_help_str(opts);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (hlp != NULL) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel strlen(value) + strlen(hlp),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, unk_test),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel value, hlp);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel free((void *)hlp);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, 20,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, calloc_fail),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel strlen(options) + 1, 1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* Free after printing value. */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel free((void *)free_cp);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (test_fun != -1 && subopt != test_fun &&
3db86aab554edbb4244c8d1a1c90f152eee768afstevel subopt != maxerr_idx) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel strlen(opts[subopt]),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, dup_test),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel opts[subopt]);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel free((void *)free_cp);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (subopt < maxerr_idx)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel test_fun = subopt;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (max_errors != -1 && subopt == maxerr_idx) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel strlen(opts[subopt]),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, dup_num),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel opts[subopt]);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel free((void *)free_cp);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (value == NULL) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel 0,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, no_num),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel free((void *)free_cp);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel max_errors = strtol(value, &ret_p, 10);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((ret_p == value) || (*ret_p != '\0') ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (max_errors < 0)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel strlen(value),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, no_num),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel value);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel free((void *)free_cp);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel free((void *)free_cp);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (test_fun == -1)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel test_fun = MTEST_DEFAULT_TEST;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (max_errors == -1)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel max_errors = MAX_ERRORS;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = ap_stat(ap_id, &fd, &bk, &stat, errstring);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ret != CFGA_OK)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ret);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (stat.rstate != SYSC_CFGA_RSTATE_CONNECTED ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel stat.ostate != SYSC_CFGA_OSTATE_UNCONFIGURED) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, 0,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, trans_illegal));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = mtest_run(fd, test_fun, &bk,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ((flags & CFGA_FLAG_VERBOSE) != 0) ? msgp : NULL, errstring,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (ulong_t)max_errors);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ret);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic cfga_stat_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrstate_cvt(sysc_cfga_rstate_t rs)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_stat_t cs;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (rs) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_RSTATE_EMPTY:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs = CFGA_STAT_EMPTY;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_RSTATE_DISCONNECTED:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs = CFGA_STAT_DISCONNECTED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_RSTATE_CONNECTED:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs = CFGA_STAT_CONNECTED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs = CFGA_STAT_NONE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (cs);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic cfga_stat_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelostate_cvt(sysc_cfga_ostate_t os)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_stat_t cs;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (os) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_OSTATE_UNCONFIGURED:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs = CFGA_STAT_UNCONFIGURED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_OSTATE_CONFIGURED:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs = CFGA_STAT_CONFIGURED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs = CFGA_STAT_NONE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (cs);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic cfga_cond_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcond_cvt(sysc_cfga_cond_t sc)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_cond_t cc;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (sc) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_COND_OK:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cc = CFGA_COND_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_COND_FAILING:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cc = CFGA_COND_FAILING;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_COND_FAILED:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cc = CFGA_COND_FAILED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_COND_UNUSABLE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cc = CFGA_COND_UNUSABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_COND_UNKNOWN:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cc = CFGA_COND_UNKNOWN;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (cc);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelinfo_set(ac_stat_t *asp, mema_bank_t *bkp, cfga_info_t info)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_disabled_t disab;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel uint_t board;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel uint_t n;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel u_longlong_t decode;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel uint_t intlv;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *f;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *end;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel end = &info[sizeof (cfga_info_t)];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *info = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel board = bkp->board;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* Print the board number in a way that matches the sysctrl AP. */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel info += snprintf(info, end - info, "slot%d", board);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (asp->real_size == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel info += snprintf(info, end - info, " empty");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((n = asp->real_size) >= 1024) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel n /= 1024;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel f = "Gb";
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel f = "Mb";
3db86aab554edbb4244c8d1a1c90f152eee768afstevel info += snprintf(info, end - info, " %d%s", n, f);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (asp->rstate == SYSC_CFGA_RSTATE_CONNECTED &&
3db86aab554edbb4244c8d1a1c90f152eee768afstevel asp->ostate == SYSC_CFGA_OSTATE_CONFIGURED &&
3db86aab554edbb4244c8d1a1c90f152eee768afstevel asp->use_size != asp->real_size) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((n = asp->use_size) >= 1024) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel n /= 1024;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel f = "Gb";
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel f = "Mb";
3db86aab554edbb4244c8d1a1c90f152eee768afstevel info += snprintf(info, end - info, " (%d%s used)", n, f);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (bkp->bank == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel decode = asp->ac_decode0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel decode = asp->ac_decode1;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel info += snprintf(info, end - info, " base 0x%llx",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel GRP_REALBASE(decode));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (bkp->bank == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel intlv = INTLV0(asp->ac_memctl);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel intlv = INTLV1(asp->ac_memctl);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (intlv != 1)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel info += snprintf(info, end - info, " interleaved %u-way",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel intlv);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (prom_read_disabled_list(&disab, board)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (disab != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel info += snprintf(info, end - info, " disabled at boot");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (asp->rstate == SYSC_CFGA_RSTATE_CONNECTED &&
3db86aab554edbb4244c8d1a1c90f152eee768afstevel asp->ostate == SYSC_CFGA_OSTATE_CONFIGURED &&
3db86aab554edbb4244c8d1a1c90f152eee768afstevel asp->nonrelocatable)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel info += snprintf(info, end - info, " permanent");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelmema_cvt(ac_stat_t *ac, mema_bank_t *bkp, cfga_stat_data_t *cs)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) strcpy(cs->ap_type, "memory");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs->ap_r_state = rstate_cvt(ac->rstate);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs->ap_o_state = ostate_cvt(ac->ostate);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs->ap_cond = cond_cvt(ac->condition);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs->ap_busy = (cfga_busy_t)ac->busy;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs->ap_status_time = ac->status_time;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel info_set(ac, bkp, cs->ap_info);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs->ap_log_id[0] = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs->ap_phys_id[0] = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*ARGSUSED*/
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_err_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_stat(
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *ap_id,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel struct cfga_stat_data *cs,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *options,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char **errstring)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int ret;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_bank_t bk;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_stat_t stat;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel option_set_t do_option;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (errstring != NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *errstring = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel do_option = process_options(options, stat_opts, &ret, errstring);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ret != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ret);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = ap_stat(ap_id, NULL, &bk, &stat, errstring);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ret != CFGA_OK)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ret);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_cvt(&stat, &bk, cs);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = prom_do_options(do_option, bk.board, &stat, errstring);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ret);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*ARGSUSED*/
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_err_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_list(
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *ap_id,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_stat_data_t **ap_list,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int *nlist,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *options,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char **errstring)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (errstring != NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *errstring = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_NOTSUPP);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * cfga_ap_id_cmp -- use default_ap_id_cmp() in libcfgadm
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*ARGSUSED*/
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_err_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_help(struct cfga_msg *msgp, const char *options, cfga_flags_t flags)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (*msgp->message_routine)(msgp->appdata_ptr, mema_help);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (*msgp->message_routine)(msgp->appdata_ptr, disable_opts);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (*msgp->message_routine)(msgp->appdata_ptr, enable_opts);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (*msgp->message_routine)(msgp->appdata_ptr, timeout_opts);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (*msgp->message_routine)(msgp->appdata_ptr, test_opts);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (*msgp->message_routine)(msgp->appdata_ptr, private_funcs);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_OK);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#if 0
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic ac_mem_version_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelget_version(int fd)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_mem_version_t ver;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int ret, ret_errno;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ver = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dump_ioctl(AC_MEM_ADMIN_VER, &ver);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret = ioctl(fd, AC_MEM_ADMIN_VER, &ver);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ret_errno = errno;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dump_ioctl_res(AC_MEM_ADMIN_VER, &ver, ret, ret_errno);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ver);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#endif
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic char *
3db86aab554edbb4244c8d1a1c90f152eee768afstevelopt_help_str(struct opt_control *opts)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *str;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *sep;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int len;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int i, n;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel static const char help_sep[] = ", ";
3db86aab554edbb4244c8d1a1c90f152eee768afstevel static const char help_nil[] = "???";
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel len = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel n = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (i = 0; opts[i].subopt != -1; i++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel n++;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel len += strlen(mema_opts[opts[i].subopt]);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (n == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (strdup(help_nil));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel len += (n - 1) * strlen(help_sep);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel len++;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel str = (char *)malloc(len);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (str == NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *str = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sep = "";
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (i = 0; opts[i].subopt != -1; i++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) strcat(str, sep);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) strcat(str, mema_opts[opts[i].subopt]);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sep = help_sep;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (str);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic option_set_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelprocess_options(
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *options,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel struct opt_control *opts,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int *retp,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char **errstring)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel option_set_t opt_set;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *optcopy, *optcopy_alloc;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *value;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int subopt;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int subopt_err;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int i;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int group;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int need_value;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel OPTSET_INIT(opt_set);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (options == NULL || *options == '\0') {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (opt_set);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel optcopy = optcopy_alloc = strdup(options);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (optcopy_alloc == NULL) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, 20,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, calloc_fail), strlen(options) + 1, 1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *retp = CFGA_LIB_ERROR;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (opt_set);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel subopt_err = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel while (*optcopy != '\0' && subopt_err == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel subopt = getsubopt(&optcopy, mema_opts, &value);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (subopt == -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *hlp;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel hlp = opt_help_str(opts);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, strlen(value) + strlen(hlp),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, unk_subopt), value, hlp);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel free((void *)hlp);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel subopt_err = 1;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (i = 0; opts[i].subopt != -1; i++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (opts[i].subopt == subopt) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel group = opts[i].group;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (opts[i].subopt == -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *hlp;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel hlp = opt_help_str(opts);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel MAX_OPT_LENGTH + strlen(hlp),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, not_valid),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_opts[subopt], hlp);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel free((void *)hlp);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel subopt_err = 1;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel need_value = OPT_NEEDS_VALUE(subopt);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (!need_value && value != NULL) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, MAX_OPT_LENGTH,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, no_value),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_opts[subopt]);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel subopt_err = 1;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (need_value && value == NULL) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, MAX_OPT_LENGTH,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, missing_value),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_opts[subopt]);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel subopt_err = 1;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (OPTSET_TEST(opt_set, subopt)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* Ignore repeated options. */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel continue;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (group != 0 && !OPTSET_IS_EMPTY(opt_set)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (i = 0; opts[i].subopt != -1; i++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (i == subopt)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel continue;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (opts[i].group == group &&
3db86aab554edbb4244c8d1a1c90f152eee768afstevel OPTSET_TEST(opt_set, opts[i].subopt))
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (opts[i].subopt != -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel __fmt_errstring(errstring, MAX_OPT_LENGTH * 2,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dgettext(TEXT_DOMAIN, conflict_opt),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_opts[subopt],
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mema_opts[opts[i].subopt]);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel subopt_err = 1;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel OPTSET_SET_VAL(opt_set, subopt, value);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel free((void *)optcopy_alloc);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (subopt_err) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *retp = CFGA_ERROR;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (opt_set);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#ifdef DEV_DEBUG
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afsteveldebugging(void)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *ep;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel static int inited;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (inited)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (debug_fp != NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel inited = 1;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((ep = getenv("MEMADM_DEBUG")) == NULL) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (*ep == '\0')
3db86aab554edbb4244c8d1a1c90f152eee768afstevel debug_fp = stderr;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((debug_fp = fopen(ep, "a")) == NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fprintf(debug_fp, "\nDebug started, pid=%d\n", (int)getpid());
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afsteveldump_ioctl(
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int cmd,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel void *arg)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (!debugging())
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (cmd) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case AC_MEM_CONFIGURE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fprintf(debug_fp, "IOCTL: AC_MEM_CONFIGURE\n");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case AC_MEM_UNCONFIGURE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fprintf(debug_fp, "IOCTL: AC_MEM_UNCONFIGURE\n");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case AC_MEM_TEST_START:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fprintf(debug_fp, "IOCTL: AC_MEM_TEST_START\n");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case AC_MEM_TEST_STOP: {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_mem_test_stop_t *tstop;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel tstop = (ac_mem_test_stop_t *)arg;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fprintf(debug_fp, "IOCTL: AC_MEM_TEST_STOP handle=%#x "
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "condition=%d\n", tstop->handle, tstop->condition);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case AC_MEM_TEST_READ: {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_mem_test_read_t *tread;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel tread = (ac_mem_test_read_t *)arg;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fprintf(debug_fp, "IOCTL: AC_MEM_TEST_READ handle=%#x "
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "buf=%#p page=%#llx off=%#x count=%#x\n",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel tread->handle, tread->page_buf,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel tread->address.page_num,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel tread->address.line_offset, tread->address.line_count);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case AC_MEM_TEST_WRITE: {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_mem_test_write_t *twrite;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel twrite = (ac_mem_test_write_t *)arg;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fprintf(debug_fp, "IOCTL: AC_MEM_TEST_WRITE handle=%#x "
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "buf=%#p page=%#llx off=%#x count=%#x\n",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel twrite->handle, twrite->page_buf,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel twrite->address.page_num,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel twrite->address.line_offset, twrite->address.line_count);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case AC_MEM_ADMIN_VER:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fprintf(debug_fp, "IOCTL: AC_MEM_ADMIN_VER:\n");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case AC_MEM_STAT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fprintf(debug_fp, "IOCTL: AC_MEM_STAT\n");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case AC_MEM_EXERCISE: {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_cfga_cmd_t *cmdp;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmdp = arg;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fprintf(debug_fp, "IOCTL: AC_MEM_EXERCISE arg=%d\n",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmdp->arg);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fprintf(debug_fp, "IOCTL: unknown (%#x)\n", cmd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fflush(debug_fp);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afsteveldump_ioctl_res(
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int cmd,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel void *arg,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int ret,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int ret_errno)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (!debugging())
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ret == -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fprintf(debug_fp, "IOCTL failed, \"%s\" (errno=%d)\n",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel strerror(ret_errno), ret_errno);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fflush(debug_fp);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fprintf(debug_fp, "IOCTL succeeded, ret=%d\n", ret);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (cmd) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case AC_MEM_CONFIGURE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case AC_MEM_UNCONFIGURE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case AC_MEM_TEST_START: {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_mem_test_start_t *tstart;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel tstart = (ac_mem_test_start_t *)arg;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fprintf(debug_fp, " handle=%#x tester_pid=%d "
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "prev_condition=%d bank_size=%#llx "
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "page_size=%#x line_size=%#x afar_base=%#llx\n",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel tstart->handle, (int)tstart->tester_pid,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel tstart->prev_condition,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel tstart->bank_size, tstart->page_size,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel tstart->line_size, tstart->afar_base);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case AC_MEM_TEST_STOP:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case AC_MEM_TEST_READ: {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_mem_test_read_t *tread;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sunfire_processor_error_regs_t *err;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel tread = (ac_mem_test_read_t *)arg;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = tread->error_buf;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ret_errno == EIO) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fprintf(debug_fp, "module_id=%#llx afsr=%#llx "
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "afar=%#llx udbh_error_reg=%#llx "
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "udbl_error_reg=%#llx\n",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (longlong_t)err->module_id, (longlong_t)err->afsr,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (longlong_t)err->afar,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (longlong_t)err->udbh_error_reg,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (longlong_t)err->udbl_error_reg);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fprintf(debug_fp, "\n");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case AC_MEM_TEST_WRITE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case AC_MEM_ADMIN_VER: {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_mem_version_t *ver;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ver = (ac_mem_version_t *)arg;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fprintf(debug_fp, " version %d\n", *ver);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case AC_MEM_STAT: {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_stat_t *tstat;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel tstat = (ac_stat_t *)arg;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fprintf(debug_fp, " rstate=%u ostate=%u "
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "condition=%u status_time=%#lx board=%u\n",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (uint_t)tstat->rstate, (uint_t)tstat->ostate,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (uint_t)tstat->condition, (ulong_t)tstat->status_time,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel tstat->board);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fprintf(debug_fp, " real_size=%u use_size=%u "
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "busy=%u\n",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel tstat->real_size, tstat->use_size, tstat->busy);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fprintf(debug_fp, " page_size=%#x "
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "phys_pages=%#llx managed=%#llx nonrelocatable=%#llx\n",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel tstat->page_size, (longlong_t)tstat->phys_pages,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (longlong_t)tstat->managed,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (longlong_t)tstat->nonrelocatable);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fprintf(debug_fp, " memctl=%#llx "
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "decode0=%#llx decode1=%#llx\n",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (longlong_t)tstat->ac_memctl, (longlong_t)tstat->ac_decode0,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (longlong_t)tstat->ac_decode1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case AC_MEM_EXERCISE: {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ac_cfga_cmd_t *cmdp;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmdp = arg;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (cmdp->arg) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case AC_MEMX_RELOCATE_ALL: {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel struct ac_memx_relocate_stats *stp;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((stp = cmdp->private) != NULL) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fprintf(debug_fp, " base=%u npgs=%u"
3db86aab554edbb4244c8d1a1c90f152eee768afstevel " nopaget=%u nolock=%u isfree=%u reloc=%u"
3db86aab554edbb4244c8d1a1c90f152eee768afstevel " noreloc=%u\n",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel stp->base, stp->npgs, stp->nopaget,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel stp->nolock, stp->isfree, stp->reloc,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel stp->noreloc);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) fflush(debug_fp);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#endif /* DEV_DEBUG */