target: add function to get number of bytes available in working area
This is a much cleaner solution to the problem of allocating as much working area as possible than what is currently being done in most/all flash drivers (which is: try an arbitrary sized chunk, if it fails, pick a smaller number, rinse and repeat). Use this function to find out how much working area is available, limit or restrict that amount at will and then simply allocate it. Change-Id: Ib7d5d0b7485aed3e0a4fad60c1bedb7dfd16146f Signed-off-by: Andreas Fritiofson <andreas.fritiofson@gmail.com> Reviewed-on: http://openocd.zylin.com/446 Tested-by: jenkins Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
This commit is contained in:
parent
813f4a5411
commit
2eb564b756
|
@ -1502,6 +1502,25 @@ void target_free_all_working_areas(struct target *target)
|
||||||
target_free_all_working_areas_restore(target, 1);
|
target_free_all_working_areas_restore(target, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Find the largest number of bytes that can be allocated */
|
||||||
|
uint32_t target_get_working_area_avail(struct target *target)
|
||||||
|
{
|
||||||
|
struct working_area *c = target->working_areas;
|
||||||
|
uint32_t max_size = 0;
|
||||||
|
|
||||||
|
if (c == NULL)
|
||||||
|
return target->working_area_size;
|
||||||
|
|
||||||
|
while (c) {
|
||||||
|
if (c->free && max_size < c->size)
|
||||||
|
max_size = c->size;
|
||||||
|
|
||||||
|
c = c->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return max_size;
|
||||||
|
}
|
||||||
|
|
||||||
int target_arch_state(struct target *target)
|
int target_arch_state(struct target *target)
|
||||||
{
|
{
|
||||||
int retval;
|
int retval;
|
||||||
|
|
|
@ -540,6 +540,7 @@ int target_alloc_working_area_try(struct target *target,
|
||||||
uint32_t size, struct working_area **area);
|
uint32_t size, struct working_area **area);
|
||||||
int target_free_working_area(struct target *target, struct working_area *area);
|
int target_free_working_area(struct target *target, struct working_area *area);
|
||||||
void target_free_all_working_areas(struct target *target);
|
void target_free_all_working_areas(struct target *target);
|
||||||
|
uint32_t target_get_working_area_avail(struct target *target);
|
||||||
|
|
||||||
extern struct target *all_targets;
|
extern struct target *all_targets;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue