1 /**
2 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
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. \n
14 *
15 * Description: Partition manage module -- implementation \n
16 * Author:
17 * History: \n
18 * 2022-09-01, Create file. \n
19 */
20
21 #include <stdint.h>
22 #include <stdbool.h>
23 #include <stddef.h>
24 #include "common_def.h"
25 #include "partition_porting.h"
26 #include "partition_info.h"
27
28 static partition_t g_partition_info;
29
partition_get_global_info(void)30 partition_t *partition_get_global_info(void)
31 {
32 return &g_partition_info;
33 }
34
uapi_partition_init(void)35 errcode_t uapi_partition_init(void)
36 {
37 params_area_t *params_head = (params_area_t *)partition_get_addr();
38 if (params_head->image_id != PARTITION_IMAGE_ID) {
39 return ERRCODE_PARTITION_INIT_ERR;
40 }
41 param_area_data_t *partition = (param_area_data_t *)(partition_get_addr() + params_head->param_item_offset);
42 uint8_t *ids = (uint8_t *)(partition_get_addr() + PARTITION_ITEM_ID_OFFSET);
43
44 partition_t *partition_info = partition_get_global_info();
45 partition_info->image_id = params_head->image_id;
46 partition_info->struct_ver = params_head->struct_ver;
47 partition_info->params_area_ver = params_head->params_area_ver;
48 partition_info->partition_cnt = params_head->param_item_count;
49
50 if (partition_info->partition_cnt < PARTITION_MAX_CNT) {
51 partition_printf("part cnt- %d < max cnt- %d\n", partition_info->partition_cnt, PARTITION_MAX_CNT);
52 return ERRCODE_PARTITION_INIT_ERR;
53 }
54
55 for (uint8_t i = 0; i < PARTITION_MAX_CNT; i++) {
56 partition_info->partition_tbl[i].addr = partition[i].addr;
57 partition_info->partition_tbl[i].size = partition[i].size;
58 partition_info->partition_tbl[i].id = ids[i];
59 }
60
61 return ERRCODE_SUCC;
62 }
63
partition_find_by_addr(uint8_t id,uint8_t * tbl_index)64 STATIC bool partition_find_by_addr(uint8_t id, uint8_t *tbl_index)
65 {
66 partition_t *partition_info = partition_get_global_info();
67 for (uint8_t i = 0; i < partition_info->partition_cnt; i++) {
68 partition_printf("tbl id -%d, find id -%d\n", partition_info->partition_tbl[i].id, id);
69 if (partition_info->partition_tbl[i].id == id) {
70 *tbl_index = i;
71 return true;
72 }
73 }
74 return false;
75 }
76
partition_find_by_path(uint32_t item_id)77 STATIC char *partition_find_by_path(uint32_t item_id)
78 {
79 partition_path_map_t *path_map = NULL;
80 uint32_t path_num = partition_get_path_map(&path_map);
81 if (path_num == 0 || path_map == NULL) {
82 return NULL;
83 }
84
85 for (uint32_t i = 0; i < path_num; i++) {
86 if (path_map[i].item_id == item_id) {
87 return path_map[i].file_path;
88 }
89 }
90 return NULL;
91 }
92
uapi_partition_get_info(partition_ids_t partition_id,partition_information_t * info)93 errcode_t uapi_partition_get_info(partition_ids_t partition_id, partition_information_t *info)
94 {
95 uint8_t tbl_index = 0;
96 if (info == NULL) {
97 return ERRCODE_PARTITION_INVALID_PARAMS;
98 }
99
100 if (partition_find_by_addr(partition_id, &tbl_index)) {
101 partition_t *partition_info = partition_get_global_info();
102 info->type = PARTITION_BY_ADDRESS;
103 info->part_info.addr_info.addr = partition_info->partition_tbl[tbl_index].addr;
104 info->part_info.addr_info.size = partition_info->partition_tbl[tbl_index].size;
105 return ERRCODE_SUCC;
106 }
107
108 char *path = partition_find_by_path(partition_id);
109 if (path != NULL) {
110 info->type = PARTITION_BY_PATH;
111 info->part_info.file_path = path;
112 return ERRCODE_SUCC;
113 }
114 return ERRCODE_PARTITION_CONFIG_NOT_FOUND;
115 }
116