2 * Copyright 2008 - 2015 Freescale Semiconductor Inc.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 * * Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * * Redistributions in binary form must reproduce the above copyright
9 * notice, this list of conditions and the following disclaimer in the
10 * documentation and/or other materials provided with the distribution.
11 * * Neither the name of Freescale Semiconductor nor the
12 * names of its contributors may be used to endorse or promote products
13 * derived from this software without specific prior written permission.
16 * ALTERNATIVELY, this software may be distributed under the terms of the
17 * GNU General Public License ("GPL") as published by the Free Software
18 * Foundation, either version 2 of that License or (at your option) any
21 * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
22 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
25 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 void fman_sp_set_buf_pools_in_asc_order_of_buf_sizes(struct fman_ext_pools
42 int i
= 0, j
= 0, k
= 0;
44 /* First we copy the external buffers pools information
45 * to an ordered local array
47 for (i
= 0; i
< fm_ext_pools
->num_of_pools_used
; i
++) {
49 buf_size
= fm_ext_pools
->ext_buf_pool
[i
].size
;
51 /* keep sizes in an array according to poolId
54 sizes_array
[fm_ext_pools
->ext_buf_pool
[i
].id
] = buf_size
;
56 /* save poolId in an ordered array according to size */
57 for (j
= 0; j
<= i
; j
++) {
58 /* this is the next free place in the array */
61 fm_ext_pools
->ext_buf_pool
[i
].id
;
63 /* find the right place for this poolId */
64 if (buf_size
< sizes_array
[ordered_array
[j
]]) {
65 /* move the pool_ids one place ahead
66 * to make room for this poolId
68 for (k
= i
; k
> j
; k
--)
72 /* now k==j, this is the place for
76 fm_ext_pools
->ext_buf_pool
[i
].id
;
83 EXPORT_SYMBOL(fman_sp_set_buf_pools_in_asc_order_of_buf_sizes
);
85 int fman_sp_build_buffer_struct(struct fman_sp_int_context_data_copy
*
86 int_context_data_copy
,
87 struct fman_buffer_prefix_content
*
88 buffer_prefix_content
,
89 struct fman_sp_buf_margins
*buf_margins
,
90 struct fman_sp_buffer_offsets
*buffer_offsets
,
91 u8
*internal_buf_offset
)
95 /* Align start of internal context data to 16 byte */
96 int_context_data_copy
->ext_buf_offset
= (u16
)
97 ((buffer_prefix_content
->priv_data_size
& (OFFSET_UNITS
- 1)) ?
98 ((buffer_prefix_content
->priv_data_size
+ OFFSET_UNITS
) &
99 ~(u16
)(OFFSET_UNITS
- 1)) :
100 buffer_prefix_content
->priv_data_size
);
102 /* Translate margin and int_context params to FM parameters */
103 /* Initialize with illegal value. Later we'll set legal values. */
104 buffer_offsets
->prs_result_offset
= (u32
)ILLEGAL_BASE
;
105 buffer_offsets
->time_stamp_offset
= (u32
)ILLEGAL_BASE
;
106 buffer_offsets
->hash_result_offset
= (u32
)ILLEGAL_BASE
;
108 /* Internally the driver supports 4 options
109 * 1. prsResult/timestamp/hashResult selection (in fact 8 options,
110 * but for simplicity we'll
111 * relate to it as 1).
112 * 2. All IC context (from AD) not including debug.
115 /* This case covers the options under 1 */
116 /* Copy size must be in 16-byte granularity. */
117 int_context_data_copy
->size
=
118 (u16
)((buffer_prefix_content
->pass_prs_result
? 32 : 0) +
119 ((buffer_prefix_content
->pass_time_stamp
||
120 buffer_prefix_content
->pass_hash_result
) ? 16 : 0));
122 /* Align start of internal context data to 16 byte */
123 int_context_data_copy
->int_context_offset
=
124 (u8
)(buffer_prefix_content
->pass_prs_result
? 32 :
125 ((buffer_prefix_content
->pass_time_stamp
||
126 buffer_prefix_content
->pass_hash_result
) ? 64 : 0));
128 if (buffer_prefix_content
->pass_prs_result
)
129 buffer_offsets
->prs_result_offset
=
130 int_context_data_copy
->ext_buf_offset
;
131 if (buffer_prefix_content
->pass_time_stamp
)
132 buffer_offsets
->time_stamp_offset
=
133 buffer_prefix_content
->pass_prs_result
?
134 (int_context_data_copy
->ext_buf_offset
+
135 sizeof(struct fman_prs_result
)) :
136 int_context_data_copy
->ext_buf_offset
;
137 if (buffer_prefix_content
->pass_hash_result
)
138 /* If PR is not requested, whether TS is
139 * requested or not, IC will be copied from TS
141 buffer_offsets
->hash_result_offset
=
142 buffer_prefix_content
->pass_prs_result
?
143 (int_context_data_copy
->ext_buf_offset
+
144 sizeof(struct fman_prs_result
) + 8) :
145 int_context_data_copy
->ext_buf_offset
+ 8;
147 if (int_context_data_copy
->size
)
148 buf_margins
->start_margins
=
149 (u16
)(int_context_data_copy
->ext_buf_offset
+
150 int_context_data_copy
->size
);
152 /* No Internal Context passing, STartMargin is
153 * immediately after private_info
155 buf_margins
->start_margins
=
156 buffer_prefix_content
->priv_data_size
;
158 /* align data start */
159 tmp
= (u32
)(buf_margins
->start_margins
%
160 buffer_prefix_content
->data_align
);
162 buf_margins
->start_margins
+=
163 (buffer_prefix_content
->data_align
- tmp
);
164 buffer_offsets
->data_offset
= buf_margins
->start_margins
;
168 EXPORT_SYMBOL(fman_sp_build_buffer_struct
);