isci: Intel(R) C600 Series Chipset Storage Control Unit Driver
[linux-flexiantxendom0-3.2.10.git] / drivers / scsi / isci / core / sci_memory_descriptor_list.h
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  *   * Neither the name of Intel Corporation nor the names of its
40  *     contributors may be used to endorse or promote products derived
41  *     from this software without specific prior written permission.
42  *
43  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
44  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
45  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
46  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
47  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
48  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
49  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
50  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
51  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
52  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
53  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
54  */
55
56 #ifndef _SCI_MEMORY_DESCRIPTOR_LIST_H_
57 #define _SCI_MEMORY_DESCRIPTOR_LIST_H_
58
59 /**
60  * This file contains all of the basic data types utilized by an SCI user or
61  *    implementor.
62  *
63  *
64  */
65
66
67 #include "sci_types.h"
68
69 struct sci_base_memory_descriptor_list;
70
71 /**
72  *
73  *
74  * SCI_MDE_ATTRIBUTES These constants depict memory attributes for the Memory
75  * Descriptor Entries (MDEs) contained in the MDL.
76  */
77 #define SCI_MDE_ATTRIBUTE_CACHEABLE              0x0001
78 #define SCI_MDE_ATTRIBUTE_PHYSICALLY_CONTIGUOUS  0x0002
79
80 /**
81  * struct sci_physical_memory_descriptor - This structure defines a description
82  *    of a memory location for the SCI implementation.
83  *
84  *
85  */
86 struct sci_physical_memory_descriptor {
87         /**
88          * This field contains the virtual address associated with this descriptor
89          * element. This field shall be zero when the descriptor is retrieved from
90          * the SCI implementation.  The user shall set this field prior
91          * sci_controller_start()
92          */
93         void *virtual_address;
94
95         /**
96          * This field contains the physical address associated with this desciptor
97          * element. This field shall be zero when the descriptor is retrieved from
98          * the SCI implementation.  The user shall set this field prior
99          * sci_controller_start()
100          */
101         dma_addr_t physical_address;
102
103         /**
104          * This field contains the size requirement for this memory descriptor.
105          * A value of zero for this field indicates the end of the descriptor
106          * list.  The value should be treated as read only for an SCI user.
107          */
108         u32 constant_memory_size;
109
110         /**
111          * This field contains the alignment requirement for this memory
112          * descriptor.  A value of zero for this field indicates the end of the
113          * descriptor list.  All other values indicate the number of bytes to
114          * achieve the necessary alignment.  The value should be treated as
115          * read only for an SCI user.
116          */
117         u32 constant_memory_alignment;
118
119         /**
120          * This field contains an indication regarding the desired memory
121          * attributes for this memory descriptor entry.
122          * Notes:
123          * - If the cacheable attribute is set, the user can allocate
124          *   memory that is backed by cache for better performance. It
125          *   is not required that the memory be backed by cache.
126          * - If the physically contiguous attribute is set, then the
127          *   entire memory must be physically contiguous across all
128          *   page boundaries.
129          */
130         u16 constant_memory_attributes;
131
132 };
133
134 /**
135  * sci_mdl_first_entry() - This method simply rewinds the MDL iterator back to
136  *    the first memory descriptor entry in the list.
137  * @mdl: This parameter specifies the memory descriptor list that is to be
138  *    rewound.
139  *
140  */
141 void sci_mdl_first_entry(
142         struct sci_base_memory_descriptor_list *mdl);
143
144 /**
145  * sci_mdl_next_entry() - This method simply updates the "current" pointer to
146  *    the next sequential memory descriptor.
147  * @mdl: This parameter specifies the memory descriptor list for which to
148  *    return the next memory descriptor entry in the list.
149  *
150  * none.
151  */
152 void sci_mdl_next_entry(
153         struct sci_base_memory_descriptor_list *mdl);
154
155 /**
156  * sci_mdl_get_current_entry() - This method simply returns the current memory
157  *    descriptor entry.
158  * @mdl: This parameter specifies the memory descriptor list for which to
159  *    return the current memory descriptor entry.
160  *
161  * This method returns a pointer to the current physical memory descriptor in
162  * the MDL. NULL This value is returned if there are no descriptors in the list.
163  */
164 struct sci_physical_memory_descriptor *sci_mdl_get_current_entry(
165         struct sci_base_memory_descriptor_list *mdl);
166
167
168 #endif  /* _SCI_MEMORY_DESCRIPTOR_LIST_H_ */
169