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:
Andreas Fritiofson 2012-02-13 01:19:57 +01:00 committed by Spencer Oliver
parent 813f4a5411
commit 2eb564b756
2 changed files with 20 additions and 0 deletions

View File

@ -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;

View File

@ -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;