Lines Matching refs:fg
58 extern void xthal_write_map_raw(const xthal_MPU_entry* fg, unsigned int n);
59 extern void xthal_read_map_raw(const xthal_MPU_entry* fg);
60 extern xthal_MPU_entry _xthal_get_entry(const xthal_MPU_entry* fg, const xthal_MPU_entry* bg,
103 xthal_MPU_entry fg[XCHAL_MPU_ENTRIES]; in assert_map_valid() local
104 xthal_read_map(fg); in assert_map_valid()
105 if (xthal_check_map(fg, XCHAL_MPU_ENTRIES)) in assert_map_valid()
111 const xthal_MPU_entry* fg, const xthal_MPU_entry* bg) in assert_attributes_equivalent() argument
115 xthal_MPU_entry e2 = _xthal_get_entry(fg, bg, addr, 0); in assert_attributes_equivalent()
119 static void assert_maps_equivalent(const xthal_MPU_entry* initial, const xthal_MPU_entry* fg, in assert_maps_equivalent() argument
128 assert_attributes_equivalent(XTHAL_MPU_ENTRY_GET_VSTARTADDR(initial[i]), initial, fg, bg); in assert_maps_equivalent()
129 assert_attributes_equivalent(XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i]), initial, fg, bg); in assert_maps_equivalent()
132 assert_attributes_equivalent(XTHAL_MPU_ENTRY_GET_VSTARTADDR(bg[i]), initial, fg, bg); in assert_maps_equivalent()
361 xthal_MPU_entry _xthal_get_entry(const xthal_MPU_entry* fg, const xthal_MPU_entry* bg, in _xthal_get_entry() argument
367 if (XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i]) <= addr) in _xthal_get_entry()
369 if (XTHAL_MPU_ENTRY_GET_VALID(fg[i])) in _xthal_get_entry()
373 return fg[i]; in _xthal_get_entry()
410 static void write_map_entry(xthal_MPU_entry* fg, unsigned en_num, xthal_MPU_entry en) in write_map_entry() argument
415 fg[en_num] = en; in write_map_entry()
418 static void move_map_down(xthal_MPU_entry* fg, int dup, int idx) in move_map_down() argument
426 write_map_entry(fg, i, fg[i - 1]); in move_map_down()
430 static void move_map_up(xthal_MPU_entry* fg, int dup, int idx) in move_map_up() argument
437 write_map_entry(fg, i, fg[i + 1]); in move_map_up()
441 static int bubble_free_to_ip(xthal_MPU_entry* fg, int ip, int required) in bubble_free_to_ip() argument
456 if (XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i]) == XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i + 1])) in bubble_free_to_ip()
458 move_map_up(fg, i, ip); in bubble_free_to_ip()
467 if (!XTHAL_MPU_ENTRY_GET_VALID(fg[0])) in bubble_free_to_ip()
469 move_map_up(fg, 0, ip); in bubble_free_to_ip()
482 if (XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i]) == XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i - 1])) in bubble_free_to_ip()
484 move_map_down(fg, i, ip); in bubble_free_to_ip()
498 static void remove_inaccessible_entries(xthal_MPU_entry* fg, const xthal_MPU_entry* bg) in remove_inaccessible_entries() argument
503 …TRY_GET_VALID(fg[i]) == XTHAL_MPU_ENTRY_GET_VALID(fg[i - 1])) && (XTHAL_MPU_ENTRY_GET_VSTARTADDR(f… in remove_inaccessible_entries()
504 …T_MEMORY_TYPE(fg[i]) == XTHAL_MPU_ENTRY_GET_MEMORY_TYPE(fg[i - 1])) && (XTHAL_MPU_ENTRY_GET_ACCESS… in remove_inaccessible_entries()
508 (!_xthal_in_bgmap(XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i]), bg))) in remove_inaccessible_entries()
509 …HAL_MPU_ENTRY_GET_VALID(fg[i]) && (!XTHAL_MPU_ENTRY_GET_VALID(fg[i - 1])) && (!_xthal_in_bgmap(XTH… in remove_inaccessible_entries()
511 write_map_entry(fg, i, fg[i - 1]); in remove_inaccessible_entries()
536 static int find_entry(xthal_MPU_entry* fg, unsigned first) in find_entry() argument
541 if (XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i]) <= first) in find_entry()
557 static int needed_entries_exist(xthal_MPU_entry* fg, unsigned first, unsigned last) in needed_entries_exist() argument
562 if (XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i]) == first) in needed_entries_exist()
572 if (!XTHAL_MPU_ENTRY_GET_VALID(fg[k])) in needed_entries_exist()
578 if (last == XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[j])) in needed_entries_exist()
582 if (!XTHAL_MPU_ENTRY_GET_VALID(fg[k])) in needed_entries_exist()
595 static int number_available(xthal_MPU_entry* fg) in number_available() argument
604 if (XTHAL_MPU_ENTRY_GET_VALID(fg[i])) in number_available()
614 … if (i && (XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i]) == XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i - 1]))) in number_available()
649 static void safe_region(xthal_MPU_entry* fg, int ip, unsigned end_of_segment, int memoryType, int w… in safe_region() argument
652 …unsigned length = end_of_segment - XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[ip]); // initially keep lengt… in safe_region()
656 int cmemType = XTHAL_MPU_ENTRY_GET_MEMORY_TYPE(fg[ip]); in safe_region()
671 void* addr = (void*) XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[ip]); in safe_region()
677 …XTHAL_MPU_ENTRY_SET_MEMORY_TYPE(fg[ip], covert_to_writethru_memtype(XTHAL_MPU_ENTRY_GET_MEMORY_TYP… in safe_region()
680 if (XTHAL_MPU_ENTRY_GET_ACCESS(fg[ip]) == XTHAL_AR_NONE) in safe_region()
681 XTHAL_MPU_ENTRY_SET_ACCESS(fg[ip], XTHAL_AR_RWXrwx); in safe_region()
683 write_map_entry(fg, ip, fg[ip]); in safe_region()
706 XTHAL_MPU_ENTRY_SET_MEMORY_TYPE(fg[ip], in safe_region()
708 write_map_entry(fg, ip, fg[ip]); in safe_region()
742 static unsigned next_address_to_commit(xthal_MPU_entry* fg, const xthal_MPU_entry* bg, unsigned fir… in next_address_to_commit() argument
745 unsigned current = XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[current_index]); in next_address_to_commit()
746 …return max(first, XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[current_index - 1]), XTHAL_MPU_ENTRY_GET_VSTAR… in next_address_to_commit()
759 static void safe_and_commit_overlaped_regions(xthal_MPU_entry* fg, const xthal_MPU_entry*bg, unsign… in safe_and_commit_overlaped_regions() argument
769 if (XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i]) < last) in safe_and_commit_overlaped_regions()
772 safe_region(fg, i, end_of_segment, memoryType, wb, inv, &post_inv_all); in safe_and_commit_overlaped_regions()
773 end_of_segment = XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i]); in safe_and_commit_overlaped_regions()
776 next = next_address_to_commit(fg, bg, first, i); in safe_and_commit_overlaped_regions()
777 if (next == XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i - 1])) in safe_and_commit_overlaped_regions()
779 XTHAL_MPU_ENTRY_SET_VSTARTADDR(fg[i], next); in safe_and_commit_overlaped_regions()
780 safe_region(fg, i, last, memoryType, wb, inv, &post_inv_all); in safe_and_commit_overlaped_regions()
781 end_of_segment = XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i]); in safe_and_commit_overlaped_regions()
788 for (; i < XCHAL_MPU_ENTRIES && XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i]) < last; i++) in safe_and_commit_overlaped_regions()
790 XTHAL_MPU_ENTRY_SET_MEMORY_TYPE(fg[i], memoryType); in safe_and_commit_overlaped_regions()
791 XTHAL_MPU_ENTRY_SET_ACCESS(fg[i], accessRights); in safe_and_commit_overlaped_regions()
792 XTHAL_MPU_ENTRY_SET_VALID(fg[i], 1); in safe_and_commit_overlaped_regions()
793 write_map_entry(fg, i, fg[i]); in safe_and_commit_overlaped_regions()
797 cachedisadr = xthal_calc_cacheadrdis(fg, XCHAL_MPU_ENTRIES); in safe_and_commit_overlaped_regions()
801 static void handle_invalid_pred(xthal_MPU_entry* fg, const xthal_MPU_entry* bg, unsigned first, int… in handle_invalid_pred() argument
813 if (!ip || XTHAL_MPU_ENTRY_GET_VALID(fg[ip - 1])) in handle_invalid_pred()
817 unsigned fgipm1_addr = XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[ip - 1]); in handle_invalid_pred()
822 unsigned fgip_addr = XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[ip]); in handle_invalid_pred()
849 … xthal_MPU_entry temp = _xthal_get_entry(fg, bg, XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[ip - 1]), 0); in handle_invalid_pred()
850 XTHAL_MPU_ENTRY_SET_VSTARTADDR(temp, XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[ip - 1])); in handle_invalid_pred()
851 write_map_entry(fg, ip - 1, temp); in handle_invalid_pred()
861 static int insert_entry_if_needed_with_existing_attr(xthal_MPU_entry* fg, const xthal_MPU_entry* bg, in insert_entry_if_needed_with_existing_attr() argument
870 if (XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i]) == first) in insert_entry_if_needed_with_existing_attr()
872 if (XTHAL_MPU_ENTRY_GET_VALID(fg[i]) || invalid) in insert_entry_if_needed_with_existing_attr()
884 if (!number_available(fg)) in insert_entry_if_needed_with_existing_attr()
887 ip = find_entry(fg, first); in insert_entry_if_needed_with_existing_attr()
888 ip = bubble_free_to_ip(fg, ip, 1); in insert_entry_if_needed_with_existing_attr()
891 handle_invalid_pred(fg, bg, first, ip); in insert_entry_if_needed_with_existing_attr()
894 n = _xthal_get_entry(fg, bg, first, &infg); in insert_entry_if_needed_with_existing_attr()
900 write_map_entry(fg, ip, n); in insert_entry_if_needed_with_existing_attr()
904 static unsigned int smallest_entry_greater_than_equal(xthal_MPU_entry* fg, unsigned x) in smallest_entry_greater_than_equal() argument
908 if (XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i]) >= x) in smallest_entry_greater_than_equal()
909 return XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i]); in smallest_entry_greater_than_equal()
914 static unsigned int create_aligning_entries_if_required(xthal_MPU_entry* fg, const xthal_MPU_entry*… in create_aligning_entries_if_required() argument
926 if (XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i]) < x) in create_aligning_entries_if_required()
928 if (XTHAL_MPU_ENTRY_GET_VALID(fg[i])) in create_aligning_entries_if_required()
935 next_entry_address = XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i]); in create_aligning_entries_if_required()
936 next_entry_valid = XTHAL_MPU_ENTRY_GET_VALID(fg[i]); in create_aligning_entries_if_required()
950 if ((rv = insert_entry_if_needed_with_existing_attr(fg, bg, x, 1)) != XTHAL_SUCCESS) in create_aligning_entries_if_required()
971 …rv = insert_entry_if_needed_with_existing_attr(fg, bg, XTHAL_MPU_ENTRY_GET_VSTARTADDR(_xthal_get_e… in create_aligning_entries_if_required()
976 if ((rv = insert_entry_if_needed_with_existing_attr(fg, bg, in create_aligning_entries_if_required()
977 …XTHAL_MPU_ENTRY_GET_VSTARTADDR(_xthal_get_entry(fg, bg, XTHAL_MPU_ENTRY_GET_VSTARTADDR(bg[next_bg_… in create_aligning_entries_if_required()
986 …if ((rv = insert_entry_if_needed_with_existing_attr(fg, bg, preceding_bg_entry_x_addr, 0)) != XTHA… in create_aligning_entries_if_required()
998 static unsigned start_initial_region(xthal_MPU_entry* fg, const xthal_MPU_entry* bg, unsigned first, in start_initial_region() argument
1047 xthal_MPU_entry fg[XCHAL_MPU_ENTRIES]; in safe_add_region() local
1052 xthal_read_map(fg); in safe_add_region()
1060 if (!needed_entries_exist(fg, first, last)) in safe_add_region()
1072 if (number_available(fg) < XCHAL_MPU_WORST_CASE_ENTRIES_FOR_REGION) in safe_add_region()
1073 remove_inaccessible_entries(fg, Xthal_mpu_bgmap); in safe_add_region()
1075 assert_maps_equivalent(on_entry, fg, Xthal_mpu_bgmap); in safe_add_region()
1079 if ((rv = create_aligning_entries_if_required(fg, Xthal_mpu_bgmap, first)) != XTHAL_SUCCESS) in safe_add_region()
1099 x = smallest_entry_greater_than_equal(fg, last); in safe_add_region()
1106 …if ((rv = insert_entry_if_needed_with_existing_attr(fg, Xthal_mpu_bgmap, last, 1)) != XTHAL_SUCCES… in safe_add_region()
1109 assert_maps_equivalent(on_entry, fg, Xthal_mpu_bgmap); in safe_add_region()
1114 assert_maps_equivalent(on_entry, fg, Xthal_mpu_bgmap); in safe_add_region()
1119 pbg = XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[get_bg_map_index(Xthal_mpu_bgmap, x)]); in safe_add_region()
1132 …if ((rv = insert_entry_if_needed_with_existing_attr(fg, Xthal_mpu_bgmap, pbg, 0)) != XTHAL_SUCCESS) in safe_add_region()
1135 assert_maps_equivalent(on_entry, fg, Xthal_mpu_bgmap); in safe_add_region()
1140 assert_maps_equivalent(on_entry, fg, Xthal_mpu_bgmap); in safe_add_region()
1143 …if ((rv = insert_entry_if_needed_with_existing_attr(fg, Xthal_mpu_bgmap, last, 1)) != XTHAL_SUCCES… in safe_add_region()
1146 assert_maps_equivalent(on_entry, fg, Xthal_mpu_bgmap); in safe_add_region()
1151 assert_maps_equivalent(on_entry, fg, Xthal_mpu_bgmap); in safe_add_region()
1158 …if ((rv = insert_entry_if_needed_with_existing_attr(fg, Xthal_mpu_bgmap, last, 1)) != XTHAL_SUCCES… in safe_add_region()
1161 assert_maps_equivalent(on_entry, fg, Xthal_mpu_bgmap); in safe_add_region()
1166 assert_maps_equivalent(on_entry, fg, Xthal_mpu_bgmap); in safe_add_region()
1172 …if ((rv = insert_entry_if_needed_with_existing_attr(fg, Xthal_mpu_bgmap, start_initial_region(fg, … in safe_add_region()
1176 assert_maps_equivalent(on_entry, fg, Xthal_mpu_bgmap); in safe_add_region()
1181 assert_maps_equivalent(on_entry, fg, Xthal_mpu_bgmap); in safe_add_region()
1186 …safe_and_commit_overlaped_regions(fg, Xthal_mpu_bgmap, first, last, memoryType, accessRights, writ… in safe_add_region()
1230 static int check_map(const xthal_MPU_entry* fg, unsigned int n, const xthal_MPU_entry* bg) in check_map() argument
1240 if (XTHAL_MPU_ENTRY_GET_VALID(fg[i]) && bad_accessRights(XTHAL_MPU_ENTRY_GET_ACCESS(fg[i]))) in check_map()
1242 if ((XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i]) < current)) in check_map()
1244 if (XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i]) & MPU_VSTART_CORRECTNESS_MASK) in check_map()
1246 current = XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i]); in check_map()
1248 …if (XCHAL_MPU_ALIGN_REQ && XTHAL_MPU_ENTRY_GET_VALID(fg[0]) && XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[0… in check_map()
1249 && !_xthal_in_bgmap(XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[0]), bg)) in check_map()
1252 …if (XCHAL_MPU_ALIGN_REQ && !XTHAL_MPU_ENTRY_GET_VALID(fg[i]) && XTHAL_MPU_ENTRY_GET_VALID(fg[i + 1… in check_map()
1253 && !_xthal_in_bgmap(XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[i + 1]), bg)) in check_map()
1519 void xthal_write_map(const xthal_MPU_entry* fg, unsigned int n) in xthal_write_map() argument
1522 unsigned int cacheadrdis = xthal_calc_cacheadrdis(fg, n); in xthal_write_map()
1525 xthal_write_map_raw(fg, n); in xthal_write_map()
1543 int xthal_check_map(const xthal_MPU_entry* fg, unsigned int n) in xthal_check_map() argument
1546 return check_map(fg, XCHAL_MPU_ENTRIES, Xthal_mpu_bgmap); in xthal_check_map()
1733 unsigned int xthal_calc_cacheadrdis(const xthal_MPU_entry* fg, unsigned int num_entries) in xthal_calc_cacheadrdis() argument
1744 if ((fg_index >= 0 && XTHAL_MPU_ENTRY_GET_VALID(fg[fg_index]))) in xthal_calc_cacheadrdis()
1746 vaddr = XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[fg_index]); in xthal_calc_cacheadrdis()
1750 unsigned int mt = XTHAL_MPU_ENTRY_GET_MEMORY_TYPE(fg[fg_index]); in xthal_calc_cacheadrdis()
1770 || XTHAL_MPU_ENTRY_GET_VALID(fg[fg_index-1]))&& vaddr) in xthal_calc_cacheadrdis()
1775 (XTHAL_MPU_ENTRY_GET_VSTARTADDR(fg[fg_index])) : in xthal_calc_cacheadrdis()