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
;
84 int fman_sp_build_buffer_struct(struct fman_sp_int_context_data_copy
*
85 int_context_data_copy
,
86 struct fman_buffer_prefix_content
*
87 buffer_prefix_content
,
88 struct fman_sp_buf_margins
*buf_margins
,
89 struct fman_sp_buffer_offsets
*buffer_offsets
,
90 u8
*internal_buf_offset
)
94 /* Align start of internal context data to 16 byte */
95 int_context_data_copy
->ext_buf_offset
= (u16
)
96 ((buffer_prefix_content
->priv_data_size
& (OFFSET_UNITS
- 1)) ?
97 ((buffer_prefix_content
->priv_data_size
+ OFFSET_UNITS
) &
98 ~(u16
)(OFFSET_UNITS
- 1)) :
99 buffer_prefix_content
->priv_data_size
);
101 /* Translate margin and int_context params to FM parameters */
102 /* Initialize with illegal value. Later we'll set legal values. */
103 buffer_offsets
->prs_result_offset
= (u32
)ILLEGAL_BASE
;
104 buffer_offsets
->time_stamp_offset
= (u32
)ILLEGAL_BASE
;
105 buffer_offsets
->hash_result_offset
= (u32
)ILLEGAL_BASE
;
107 /* Internally the driver supports 4 options
108 * 1. prsResult/timestamp/hashResult selection (in fact 8 options,
109 * but for simplicity we'll
110 * relate to it as 1).
111 * 2. All IC context (from AD) not including debug.
114 /* This case covers the options under 1 */
115 /* Copy size must be in 16-byte granularity. */
116 int_context_data_copy
->size
=
117 (u16
)((buffer_prefix_content
->pass_prs_result
? 32 : 0) +
118 ((buffer_prefix_content
->pass_time_stamp
||
119 buffer_prefix_content
->pass_hash_result
) ? 16 : 0));
121 /* Align start of internal context data to 16 byte */
122 int_context_data_copy
->int_context_offset
=
123 (u8
)(buffer_prefix_content
->pass_prs_result
? 32 :
124 ((buffer_prefix_content
->pass_time_stamp
||
125 buffer_prefix_content
->pass_hash_result
) ? 64 : 0));
127 if (buffer_prefix_content
->pass_prs_result
)
128 buffer_offsets
->prs_result_offset
=
129 int_context_data_copy
->ext_buf_offset
;
130 if (buffer_prefix_content
->pass_time_stamp
)
131 buffer_offsets
->time_stamp_offset
=
132 buffer_prefix_content
->pass_prs_result
?
133 (int_context_data_copy
->ext_buf_offset
+
134 sizeof(struct fman_prs_result
)) :
135 int_context_data_copy
->ext_buf_offset
;
136 if (buffer_prefix_content
->pass_hash_result
)
137 /* If PR is not requested, whether TS is
138 * requested or not, IC will be copied from TS
140 buffer_offsets
->hash_result_offset
=
141 buffer_prefix_content
->pass_prs_result
?
142 (int_context_data_copy
->ext_buf_offset
+
143 sizeof(struct fman_prs_result
) + 8) :
144 int_context_data_copy
->ext_buf_offset
+ 8;
146 if (int_context_data_copy
->size
)
147 buf_margins
->start_margins
=
148 (u16
)(int_context_data_copy
->ext_buf_offset
+
149 int_context_data_copy
->size
);
151 /* No Internal Context passing, STartMargin is
152 * immediately after private_info
154 buf_margins
->start_margins
=
155 buffer_prefix_content
->priv_data_size
;
157 /* align data start */
158 tmp
= (u32
)(buf_margins
->start_margins
%
159 buffer_prefix_content
->data_align
);
161 buf_margins
->start_margins
+=
162 (buffer_prefix_content
->data_align
- tmp
);
163 buffer_offsets
->data_offset
= buf_margins
->start_margins
;