Home | History | Annotate | Download | only in ppc

Lines Matching refs:chunk

112   hw_memory_chunk *chunk = NULL;
118 chunk = hw_memory->heap;
120 while (chunk != NULL) {
121 if (chunk->available)
123 ASSERT(chunk->next == NULL
124 || chunk->address < chunk->next->address);
125 ASSERT(chunk->next == NULL
126 || chunk->address + chunk->size == chunk->next->address);
127 chunk = chunk->next;
133 chunk = hw_memory->heap;
135 while (chunk != NULL) {
136 if (chunk->available) {
137 available[curr].base = H2BE_cell(chunk->address);
138 available[curr].size = H2BE_cell(chunk->size);
141 chunk = chunk->next;
253 hw_memory_chunk *chunk = NULL;
306 /* find a chunk candidate, either according to address or alignment */
308 chunk = hw_memory->heap;
309 while (chunk != NULL) {
310 if ((address + size) <= (chunk->address + chunk->size))
312 chunk = chunk->next;
314 if (chunk == NULL || address < chunk->address || !chunk->available)
329 /* now find an aligned chunk that fits */
330 chunk = hw_memory->heap;
331 while (chunk != NULL) {
332 address = ((chunk->address + align_mask) & ~align_mask);
333 if ((chunk->available)
334 && (chunk->address + chunk->size >= address + size))
336 chunk = chunk->next;
338 if (chunk == NULL)
348 /* break off a bit before this chunk if needed */
349 ASSERT(address >= chunk->address);
350 if (address > chunk->address) {
352 /* insert a new chunk */
353 next_chunk->next = chunk->next;
354 chunk->next = next_chunk;
357 next_chunk->size = chunk->address + chunk->size - next_chunk->address;
359 chunk->size = next_chunk->address - chunk->address;
360 /* make this new chunk the one to allocate */
361 chunk = next_chunk;
363 ASSERT(address == chunk->address);
365 /* break off a bit after this chunk if needed */
366 ASSERT(address + size <= chunk->address + chunk->size);
367 if (address + size < chunk->address + chunk->size) {
370 next_chunk->next = chunk->next;
371 chunk->next = next_chunk;
374 next_chunk->size = chunk->address + chunk->size - next_chunk->address;
376 chunk->size = next_chunk->address - chunk->address;
378 ASSERT(address + size == chunk->address + chunk->size);
381 chunk->available = 0;
406 hw_memory_chunk *chunk;
441 /* try to free the corresponding memory chunk */
442 chunk = hw_memory->heap;
443 while (chunk != NULL) {
444 if (chunk->address == address
445 && chunk->size == length) {
447 if (chunk->available)
448 device_error(me, "memory chunk 0x%lx (size 0x%lx) already available",
452 /* free this chunk */
456 chunk->available = 1;
460 else if (chunk->address >= address
461 && chunk->address + chunk->size <= address + length) {
463 if (!chunk->available) {
465 (unsigned long) chunk->address,
466 (unsigned long) chunk->size,
469 chunk->available = 1;
472 chunk = chunk->next;
474 if (chunk == NULL) {
481 chunk = hw_memory->heap;
482 while (chunk != NULL) {
483 if (chunk->available
484 && chunk->next != NULL && chunk->next->available) {
486 hw_memory_chunk *delete = chunk->next;
487 ASSERT(chunk->address + chunk->size == delete->address);
488 chunk->size += delete->size;
489 chunk->next = delete->next;
493 chunk = chunk->next;