1 // Copyright (C) 2022 Beken Corporation
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "mpc_hal.h"
16 #include "mpc_ll.h"
17
mpc_hal_update_block_lut_val(uint32_t * block_lut,uint32_t lut_start_bit,uint32_t lut_end_bit,mpc_block_secure_type_t secure_type)18 static bk_err_t mpc_hal_update_block_lut_val(uint32_t *block_lut, uint32_t lut_start_bit, uint32_t lut_end_bit, mpc_block_secure_type_t secure_type)
19 {
20 BK_RETURN_ON_NULL(block_lut);
21 if ((lut_start_bit > lut_end_bit) ||
22 (lut_start_bit > MPC_BLOCK_LUT_MAX_BIT_NUM) ||
23 (lut_end_bit > MPC_BLOCK_LUT_MAX_BIT_NUM)) {
24 return BK_ERR_MPC_INVALID_LUT_PARAM;
25 }
26
27 for (uint32_t i = lut_start_bit; i < lut_end_bit; i++) {
28 if (secure_type == MPC_BLOCK_NON_SECURE) {
29 *block_lut |= BIT(i);
30 } else {
31 *block_lut &= ~BIT(i);
32 }
33 }
34
35 return BK_OK;
36 }
37
mpc_hal_init(mpc_hal_t * hal)38 bk_err_t mpc_hal_init(mpc_hal_t *hal)
39 {
40 hal->hw = (mpc_hw_t *)MPC_LL_REG_BASE(hal->dev);
41 mpc_ll_init(hal->hw);
42 return BK_OK;
43 }
44
mpc_hal_config_block_lut(mpc_hal_t * hal,uint32_t block_offset,uint32_t block_num,mpc_block_secure_type_t secure_type)45 bk_err_t mpc_hal_config_block_lut(mpc_hal_t *hal, uint32_t block_offset, uint32_t block_num, mpc_block_secure_type_t secure_type)
46 {
47 uint32_t lut_start_bit = block_offset % MPC_BLOCK_LUT_MAX_BIT_NUM;
48 uint32_t block_lut_val = mpc_ll_get_block_lut(hal->hw);
49 bk_err_t ret = BK_OK;
50
51 /* set lut from offset to tail */
52 uint32_t lut_left_bit_num = (block_num > (MPC_BLOCK_LUT_MAX_BIT_NUM - lut_start_bit)) ? (MPC_BLOCK_LUT_MAX_BIT_NUM - lut_start_bit) : block_num;
53 uint32_t lut_end_bit = lut_start_bit + lut_left_bit_num;
54 ret = mpc_hal_update_block_lut_val(&block_lut_val, lut_start_bit, lut_end_bit, secure_type);
55 if (ret != BK_OK) {
56 return ret;
57 }
58 mpc_ll_set_block_lut(hal->hw, block_lut_val);
59
60 uint32_t lut_whole_num = (block_num - lut_left_bit_num) / MPC_BLOCK_LUT_MAX_BIT_NUM;
61 for (uint32_t i = 0; i < lut_whole_num; i++) {
62 if (secure_type == MPC_BLOCK_NON_SECURE) {
63 block_lut_val = (uint32_t)(~0x0);
64 } else {
65 block_lut_val = (uint32_t)(0x0);
66 }
67 mpc_ll_set_block_lut(hal->hw, block_lut_val);
68 }
69
70 lut_end_bit = (block_num - lut_left_bit_num) % MPC_BLOCK_LUT_MAX_BIT_NUM;
71 if (lut_end_bit > 0) {
72 block_lut_val = mpc_ll_get_block_lut(hal->hw);
73 mpc_hal_update_block_lut_val(&block_lut_val, 0, lut_end_bit, secure_type);
74 if (ret != BK_OK) {
75 return ret;
76 }
77 mpc_ll_set_block_lut(hal->hw, block_lut_val);
78 }
79
80 return BK_OK;
81 }
82
83