sci_base_memory_descriptor_list.c revision 231136
1/*- 2 * This file is provided under a dual BSD/GPLv2 license. When using or 3 * redistributing this file, you may do so under either license. 4 * 5 * GPL LICENSE SUMMARY 6 * 7 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved. 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of version 2 of the GNU General Public License as 11 * published by the Free Software Foundation. 12 * 13 * This program is distributed in the hope that it will be useful, but 14 * WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program; if not, write to the Free Software 20 * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 21 * The full GNU General Public License is included in this distribution 22 * in the file called LICENSE.GPL. 23 * 24 * BSD LICENSE 25 * 26 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved. 27 * All rights reserved. 28 * 29 * Redistribution and use in source and binary forms, with or without 30 * modification, are permitted provided that the following conditions 31 * are met: 32 * 33 * * Redistributions of source code must retain the above copyright 34 * notice, this list of conditions and the following disclaimer. 35 * * Redistributions in binary form must reproduce the above copyright 36 * notice, this list of conditions and the following disclaimer in 37 * the documentation and/or other materials provided with the 38 * distribution. 39 * 40 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 41 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 42 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 43 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 44 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 45 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 46 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 47 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 48 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 49 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 50 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 51 */ 52 53#include <sys/cdefs.h> 54__FBSDID("$FreeBSD: head/sys/dev/isci/scil/sci_base_memory_descriptor_list.c 231136 2012-02-07 17:43:58Z jimharris $"); 55 56/** 57 * @file 58 * 59 * @brief This file contains the base implementation for the memory 60 * descriptor list. This is currently comprised of MDL iterator 61 * methods. 62 */ 63 64#include <dev/isci/scil/sci_base_memory_descriptor_list.h> 65 66//****************************************************************************** 67//* P U B L I C M E T H O D S 68//****************************************************************************** 69 70void sci_mdl_first_entry( 71 SCI_MEMORY_DESCRIPTOR_LIST_HANDLE_T mdl 72) 73{ 74 SCI_BASE_MEMORY_DESCRIPTOR_LIST_T * base_mdl = (SCI_BASE_MEMORY_DESCRIPTOR_LIST_T*) mdl; 75 76 base_mdl->next_index = 0; 77 78 // If this MDL is managing another MDL, then recursively rewind that MDL 79 // object as well. 80 if (base_mdl->next_mdl != SCI_INVALID_HANDLE) 81 sci_mdl_first_entry(base_mdl->next_mdl); 82} 83 84// --------------------------------------------------------------------------- 85 86void sci_mdl_next_entry( 87 SCI_MEMORY_DESCRIPTOR_LIST_HANDLE_T mdl 88) 89{ 90 SCI_BASE_MEMORY_DESCRIPTOR_LIST_T * base_mdl = (SCI_BASE_MEMORY_DESCRIPTOR_LIST_T*) mdl; 91 92 // If there is at least one more entry left in the array, then change 93 // the next pointer to it. 94 if (base_mdl->next_index < base_mdl->length) 95 base_mdl->next_index++; 96 else if (base_mdl->next_index == base_mdl->length) 97 { 98 // This MDL has exhausted it's set of entries. If this MDL is managing 99 // another MDL, then start iterating through that MDL. 100 if (base_mdl->next_mdl != SCI_INVALID_HANDLE) 101 sci_mdl_next_entry(base_mdl->next_mdl); 102 } 103} 104 105// --------------------------------------------------------------------------- 106 107SCI_PHYSICAL_MEMORY_DESCRIPTOR_T * sci_mdl_get_current_entry( 108 SCI_MEMORY_DESCRIPTOR_LIST_HANDLE_T mdl 109) 110{ 111 SCI_BASE_MEMORY_DESCRIPTOR_LIST_T * base_mdl = (SCI_BASE_MEMORY_DESCRIPTOR_LIST_T*) mdl; 112 113 if (base_mdl->next_index < base_mdl->length) 114 return & base_mdl->mde_array[base_mdl->next_index]; 115 else if (base_mdl->next_index == base_mdl->length) 116 { 117 // This MDL has exhausted it's set of entries. If this MDL is managing 118 // another MDL, then return it's current entry. 119 if (base_mdl->next_mdl != SCI_INVALID_HANDLE) 120 return sci_mdl_get_current_entry(base_mdl->next_mdl); 121 } 122 123 return NULL; 124} 125 126//****************************************************************************** 127//* P R O T E C T E D M E T H O D S 128//****************************************************************************** 129 130void sci_base_mdl_construct( 131 SCI_BASE_MEMORY_DESCRIPTOR_LIST_T * mdl, 132 SCI_PHYSICAL_MEMORY_DESCRIPTOR_T * mde_array, 133 U32 mde_array_length, 134 SCI_MEMORY_DESCRIPTOR_LIST_HANDLE_T next_mdl 135) 136{ 137 mdl->length = mde_array_length; 138 mdl->mde_array = mde_array; 139 mdl->next_index = 0; 140 mdl->next_mdl = next_mdl; 141} 142 143// --------------------------------------------------------------------------- 144 145BOOL sci_base_mde_is_valid( 146 SCI_PHYSICAL_MEMORY_DESCRIPTOR_T * mde, 147 U32 alignment, 148 U32 size, 149 U16 attributes 150) 151{ 152 // Only need the lower 32 bits to ensure alignment is met. 153 U32 physical_address = sci_cb_physical_address_lower(mde->physical_address); 154 155 if ( 156 ((physical_address & (alignment - 1)) != 0) 157 || (mde->constant_memory_alignment != alignment) 158 || (mde->constant_memory_size != size) 159 || (mde->virtual_address == NULL) 160 || (mde->constant_memory_attributes != attributes) 161 ) 162 { 163 return FALSE; 164 } 165 166 return TRUE; 167} 168 169