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