• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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