29949e866e40b95795203f3ee46f44a197c946e4stevel * CDDL HEADER START
29949e866e40b95795203f3ee46f44a197c946e4stevel * The contents of this file are subject to the terms of the
29949e866e40b95795203f3ee46f44a197c946e4stevel * Common Development and Distribution License (the "License").
29949e866e40b95795203f3ee46f44a197c946e4stevel * You may not use this file except in compliance with the License.
29949e866e40b95795203f3ee46f44a197c946e4stevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
29949e866e40b95795203f3ee46f44a197c946e4stevel * See the License for the specific language governing permissions
29949e866e40b95795203f3ee46f44a197c946e4stevel * and limitations under the License.
29949e866e40b95795203f3ee46f44a197c946e4stevel * When distributing Covered Code, include this CDDL HEADER in each
29949e866e40b95795203f3ee46f44a197c946e4stevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
29949e866e40b95795203f3ee46f44a197c946e4stevel * If applicable, add the following below this CDDL HEADER, with the
29949e866e40b95795203f3ee46f44a197c946e4stevel * fields enclosed by brackets "[]" replaced with your own identifying
29949e866e40b95795203f3ee46f44a197c946e4stevel * information: Portions Copyright [yyyy] [name of copyright owner]
29949e866e40b95795203f3ee46f44a197c946e4stevel * CDDL HEADER END
85f5803819bea86c07827a9544494e4ad327d95ddp * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
29949e866e40b95795203f3ee46f44a197c946e4stevel * Use is subject to license terms.
29949e866e40b95795203f3ee46f44a197c946e4stevel#pragma ident "%Z%%M% %I% %E% SMI"
29949e866e40b95795203f3ee46f44a197c946e4stevel * Default timeout, in seconds, for delete.
29949e866e40b95795203f3ee46f44a197c946e4stevel * Time is counted when no progress is being made.
29949e866e40b95795203f3ee46f44a197c946e4stevelstatic struct del_status *
29949e866e40b95795203f3ee46f44a197c946e4stevel dsp = (struct del_status *)kmem_zalloc(sizeof (*dsp), KM_SLEEP);
29949e866e40b95795203f3ee46f44a197c946e4stevel for (adsp = ac_del_list; adsp != NULL; adsp = adsp->next) {
29949e866e40b95795203f3ee46f44a197c946e4stevel#endif /* DEBUG */
29949e866e40b95795203f3ee46f44a197c946e4stevel/*ARGSUSED*/
29949e866e40b95795203f3ee46f44a197c946e4stevel for (adsp = ac_del_list; adsp != NULL; adsp = adsp->next) {
29949e866e40b95795203f3ee46f44a197c946e4stevel#endif /* DEBUG */
29949e866e40b95795203f3ee46f44a197c946e4stevel * Cannot delete interleaved banks at the moment.
29949e866e40b95795203f3ee46f44a197c946e4stevel * Determine the physical location of the selected bank
29949e866e40b95795203f3ee46f44a197c946e4stevel * Delete the pages from the cage growth list.
29949e866e40b95795203f3ee46f44a197c946e4stevel if (ret != 0) {
29949e866e40b95795203f3ee46f44a197c946e4stevel /* TODO: Should this be a separate error? */
29949e866e40b95795203f3ee46f44a197c946e4stevel * Add to delete memory list.
29949e866e40b95795203f3ee46f44a197c946e4stevel if ((errs = kphysm_del_span(handle, base, npgs)) != KPHYSM_OK) {
29949e866e40b95795203f3ee46f44a197c946e4stevel * Restore the pages to the cage growth list.
29949e866e40b95795203f3ee46f44a197c946e4stevel * TODO: We should not unconditionally add back
29949e866e40b95795203f3ee46f44a197c946e4stevel * if we conditionally add at memory add time.
29949e866e40b95795203f3ee46f44a197c946e4stevel /* TODO: deal with error return. */
29949e866e40b95795203f3ee46f44a197c946e4stevel if (errs != 0) {
29949e866e40b95795203f3ee46f44a197c946e4stevel "board %d, bank %d, "
29949e866e40b95795203f3ee46f44a197c946e4stevel "kcage_range_add() returned %d",
29949e866e40b95795203f3ee46f44a197c946e4stevel return (0);
29949e866e40b95795203f3ee46f44a197c946e4stevel struct ac_soft_state *asp = (struct ac_soft_state *)(del->ac_softsp);
29949e866e40b95795203f3ee46f44a197c946e4stevel * Determine the physical location of the selected bank
29949e866e40b95795203f3ee46f44a197c946e4stevel decode = (bank == Bank0) ? *asp->ac_memdecode0 : *asp->ac_memdecode1;
29949e866e40b95795203f3ee46f44a197c946e4stevel * Restore the pages to the cage growth list.
29949e866e40b95795203f3ee46f44a197c946e4stevel * TODO: We should not unconditionally add back
29949e866e40b95795203f3ee46f44a197c946e4stevel * if we conditionally add at memory add time.
29949e866e40b95795203f3ee46f44a197c946e4stevel /* TODO: deal with error return. */
29949e866e40b95795203f3ee46f44a197c946e4stevel "board %d, bank %d, "
29949e866e40b95795203f3ee46f44a197c946e4stevel "kcage_range_add() returned %d",
29949e866e40b95795203f3ee46f44a197c946e4stevelac_del_bank_run(struct del_status *dsp, ac_cfga_pkt_t *pkt)
29949e866e40b95795203f3ee46f44a197c946e4stevel if ((errs = kphysm_del_start(dsp->handle, del_comp, (void *)dsp)) !=
29949e866e40b95795203f3ee46f44a197c946e4stevel /* Wait for it to complete. */
29949e866e40b95795203f3ee46f44a197c946e4stevel * If the loop exited due to a signal, we must continue to wait
29949e866e40b95795203f3ee46f44a197c946e4stevel * using cv_wait() as the signal is pending until syscall exit.
29949e866e40b95795203f3ee46f44a197c946e4stevel * set the memory to known state for debugging
29949e866e40b95795203f3ee46f44a197c946e4stevelac_bank_write_pattern(struct bd_list *del, enum ac_bank_id bank)
29949e866e40b95795203f3ee46f44a197c946e4stevel struct ac_soft_state *asp = (struct ac_soft_state *)(del->ac_softsp);
29949e866e40b95795203f3ee46f44a197c946e4stevel * Determine the physical location of the selected bank
29949e866e40b95795203f3ee46f44a197c946e4stevel decode = (bank == Bank0) ? *asp->ac_memdecode0 : *asp->ac_memdecode1;
29949e866e40b95795203f3ee46f44a197c946e4stevel * We need a page_va and a fill buffer for this operation
29949e866e40b95795203f3ee46f44a197c946e4stevel base_va = vmem_alloc(heap_arena, PAGESIZE, VM_SLEEP);
29949e866e40b95795203f3ee46f44a197c946e4stevel * 'empty' the memory
29949e866e40b95795203f3ee46f44a197c946e4stevel /* map current pa */
29949e866e40b95795203f3ee46f44a197c946e4stevel /* fill the target page */
29949e866e40b95795203f3ee46f44a197c946e4stevel /* tear down translation */
29949e866e40b95795203f3ee46f44a197c946e4stevel * clean up temporary resources
29949e866e40b95795203f3ee46f44a197c946e4stevel /* Distinguish the fill buf from memory deleted! */
29949e866e40b95795203f3ee46f44a197c946e4stevel " refused: cage is off");
29949e866e40b95795203f3ee46f44a197c946e4stevel if ((retval = kphysm_del_gethandle(&dsp->handle)) != KPHYSM_OK) {
29949e866e40b95795203f3ee46f44a197c946e4stevel /* verify the board is of the correct type */
29949e866e40b95795203f3ee46f44a197c946e4stevel /* verify the memory condition is acceptable */
29949e866e40b95795203f3ee46f44a197c946e4stevel * at this point, we have an available bank to del.
29949e866e40b95795203f3ee46f44a197c946e4stevel * mark it busy and initiate the del function.
29949e866e40b95795203f3ee46f44a197c946e4stevel if (retval != 0) {
29949e866e40b95795203f3ee46f44a197c946e4stevel ASSERT(mem_info->ostate == SYSC_CFGA_OSTATE_CONFIGURED);
29949e866e40b95795203f3ee46f44a197c946e4stevel ASSERT(board->sc.type == CPU_BOARD || board->sc.type == MEM_BOARD);
29949e866e40b95795203f3ee46f44a197c946e4stevel ASSERT(asp == (struct ac_soft_state *)(board->ac_softsp));
29949e866e40b95795203f3ee46f44a197c946e4stevel ASSERT(mem_info->ostate == SYSC_CFGA_OSTATE_CONFIGURED);
29949e866e40b95795203f3ee46f44a197c946e4stevel if (retval == 0) {
29949e866e40b95795203f3ee46f44a197c946e4stevel /* DEBUG - set memory to known state */
29949e866e40b95795203f3ee46f44a197c946e4stevel * Restore the pages to the cage growth list.