1238438Sdteske/*- 2238438Sdteske * This file is provided under a dual BSD/GPLv2 license. When using or 3249746Sdteske * redistributing this file, you may do so under either license. 4252980Sdteske * 5238438Sdteske * GPL LICENSE SUMMARY 6238438Sdteske * 7238438Sdteske * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved. 8238438Sdteske * 9238438Sdteske * This program is free software; you can redistribute it and/or modify 10238438Sdteske * it under the terms of version 2 of the GNU General Public License as 11238438Sdteske * published by the Free Software Foundation. 12238438Sdteske * 13238438Sdteske * This program is distributed in the hope that it will be useful, but 14238438Sdteske * WITHOUT ANY WARRANTY; without even the implied warranty of 15238438Sdteske * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16252987Sdteske * General Public License for more details. 17238438Sdteske * 18238438Sdteske * You should have received a copy of the GNU General Public License 19238438Sdteske * along with this program; if not, write to the Free Software 20252987Sdteske * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 21238438Sdteske * The full GNU General Public License is included in this distribution 22238438Sdteske * in the file called LICENSE.GPL. 23238438Sdteske * 24238438Sdteske * BSD LICENSE 25238438Sdteske * 26238438Sdteske * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved. 27238438Sdteske * All rights reserved. 28238438Sdteske * 29238438Sdteske * Redistribution and use in source and binary forms, with or without 30238438Sdteske * modification, are permitted provided that the following conditions 31240684Sdteske * are met: 32240684Sdteske * 33244675Sdteske * * Redistributions of source code must retain the above copyright 34240684Sdteske * notice, this list of conditions and the following disclaimer. 35240684Sdteske * * Redistributions in binary form must reproduce the above copyright 36240684Sdteske * notice, this list of conditions and the following disclaimer in 37238438Sdteske * the documentation and/or other materials provided with the 38240684Sdteske * distribution. 39238438Sdteske * 40238438Sdteske * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 41260678Sdteske * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 42260678Sdteske * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 43238438Sdteske * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 44238438Sdteske * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 45238438Sdteske * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 46238438Sdteske * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 47238438Sdteske * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 48238438Sdteske * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 49238438Sdteske * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 50238438Sdteske * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 51238438Sdteske */ 52238438Sdteske 53238438Sdteske#include <sys/cdefs.h> 54238438Sdteske__FBSDID("$FreeBSD: releng/11.0/sys/dev/isci/scil/sci_base_memory_descriptor_list.c 231136 2012-02-07 17:43:58Z jimharris $"); 55238438Sdteske 56238438Sdteske/** 57238438Sdteske * @file 58238438Sdteske * 59250633Sdteske * @brief This file contains the base implementation for the memory 60238438Sdteske * descriptor list. This is currently comprised of MDL iterator 61252178Sdteske * methods. 62238438Sdteske */ 63238438Sdteske 64238438Sdteske#include <dev/isci/scil/sci_base_memory_descriptor_list.h> 65238438Sdteske 66238438Sdteske//****************************************************************************** 67238438Sdteske//* P U B L I C M E T H O D S 68238438Sdteske//****************************************************************************** 69238438Sdteske 70238438Sdteskevoid sci_mdl_first_entry( 71238438Sdteske SCI_MEMORY_DESCRIPTOR_LIST_HANDLE_T mdl 72238438Sdteske) 73238438Sdteske{ 74238438Sdteske SCI_BASE_MEMORY_DESCRIPTOR_LIST_T * base_mdl = (SCI_BASE_MEMORY_DESCRIPTOR_LIST_T*) mdl; 75238438Sdteske 76238438Sdteske base_mdl->next_index = 0; 77238438Sdteske 78238438Sdteske // If this MDL is managing another MDL, then recursively rewind that MDL 79238438Sdteske // object as well. 80238438Sdteske if (base_mdl->next_mdl != SCI_INVALID_HANDLE) 81238438Sdteske sci_mdl_first_entry(base_mdl->next_mdl); 82251242Sdteske} 83251242Sdteske 84238438Sdteske// --------------------------------------------------------------------------- 85238438Sdteske 86238438Sdteskevoid sci_mdl_next_entry( 87238438Sdteske SCI_MEMORY_DESCRIPTOR_LIST_HANDLE_T mdl 88238438Sdteske) 89260678Sdteske{ 90238438Sdteske SCI_BASE_MEMORY_DESCRIPTOR_LIST_T * base_mdl = (SCI_BASE_MEMORY_DESCRIPTOR_LIST_T*) mdl; 91238438Sdteske 92238438Sdteske // If there is at least one more entry left in the array, then change 93238438Sdteske // the next pointer to it. 94238438Sdteske if (base_mdl->next_index < base_mdl->length) 95238438Sdteske 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