static int ion_cp_print_debug(struct ion_heap *heap, struct seq_file *s) { unsigned long total_alloc; unsigned long total_size; unsigned long umap_count; unsigned long kmap_count; unsigned long heap_protected; struct ion_cp_heap *cp_heap = container_of(heap, struct ion_cp_heap, heap); mutex_lock(&cp_heap->lock); total_alloc = cp_heap->allocated_bytes; total_size = cp_heap->total_size; umap_count = cp_heap->umap_count; kmap_count = ion_cp_get_total_kmap_count(cp_heap); heap_protected = cp_heap->heap_protected == HEAP_PROTECTED; mutex_unlock(&cp_heap->lock); seq_printf(s, "total bytes currently allocated: %lx\n", total_alloc); seq_printf(s, "total heap size: %lx\n", total_size); seq_printf(s, "umapping count: %lx\n", umap_count); seq_printf(s, "kmapping count: %lx\n", kmap_count); seq_printf(s, "heap protected: %s\n", heap_protected ? "Yes" : "No"); seq_printf(s, "reusable: %s\n", cp_heap->reusable ? "Yes" : "No"); return 0; }
/** * Call release region for SMI memory of this is the last un-mapping. */ static int ion_cp_release_region(struct ion_cp_heap *cp_heap) { int ret_value = 0; if ((cp_heap->umap_count + ion_cp_get_total_kmap_count(cp_heap)) == 0) if (cp_heap->release_region) ret_value = cp_heap->release_region(cp_heap->bus_id); return ret_value; }
static int ion_cp_print_debug(struct ion_heap *heap, struct seq_file *s, const struct rb_root *mem_map) { unsigned long total_alloc; unsigned long total_size; unsigned long umap_count; unsigned long kmap_count; unsigned long heap_protected; struct ion_cp_heap *cp_heap = container_of(heap, struct ion_cp_heap, heap); mutex_lock(&cp_heap->lock); total_alloc = cp_heap->allocated_bytes; total_size = cp_heap->total_size; umap_count = cp_heap->umap_count; kmap_count = ion_cp_get_total_kmap_count(cp_heap); heap_protected = cp_heap->heap_protected == HEAP_PROTECTED; mutex_unlock(&cp_heap->lock); seq_printf(s, "total bytes currently allocated: %lx\n", total_alloc); seq_printf(s, "total heap size: %lx\n", total_size); seq_printf(s, "umapping count: %lx\n", umap_count); seq_printf(s, "kmapping count: %lx\n", kmap_count); seq_printf(s, "heap protected: %s\n", heap_protected ? "Yes" : "No"); seq_printf(s, "reusable: %s\n", cp_heap->reusable ? "Yes" : "No"); if (mem_map) { unsigned long base = cp_heap->base; unsigned long size = cp_heap->total_size; unsigned long end = base+size; unsigned long last_end = base; struct rb_node *n; seq_printf(s, "\nMemory Map\n"); seq_printf(s, "%16.s %14.s %14.s %14.s\n", "client", "start address", "end address", "size (hex)"); for (n = rb_first(mem_map); n; n = rb_next(n)) { struct mem_map_data *data = rb_entry(n, struct mem_map_data, node); const char *client_name = "(null)"; if (last_end < data->addr) { seq_printf(s, "%16.s %14lx %14lx %14lu (%lx)\n", "FREE", last_end, data->addr-1, data->addr-last_end, data->addr-last_end); } if (data->client_name) client_name = data->client_name; seq_printf(s, "%16.s %14lx %14lx %14lu (%lx)\n", client_name, data->addr, data->addr_end, data->size, data->size); last_end = data->addr_end+1; } if (last_end < end) { seq_printf(s, "%16.s %14lx %14lx %14lu (%lx)\n", "FREE", last_end, end-1, end-last_end, end-last_end); } } return 0; }