13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* 23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * GLX Hardware Device Driver common code 33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Copyright (C) 1999 Wittawat Yamwong 43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * copy of this software and associated documentation files (the "Software"), 73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * to deal in the Software without restriction, including without limitation 83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Software is furnished to do so, subject to the following conditions: 113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * The above copyright notice and this permission notice shall be included 133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * in all copies or substantial portions of the Software. 143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * KEITH WHITWELL, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM, 193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE 213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/** 263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Memory manager code. Primarily used by device drivers to manage texture 273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * heaps, etc. 283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#ifndef MM_H 323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define MM_H 333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstruct mem_block { 363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct mem_block *next, *prev; 373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct mem_block *next_free, *prev_free; 383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct mem_block *heap; 393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned ofs; 403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned size; 413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned free:1; 423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned reserved:1; 433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}; 443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/** 483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * input: total size in bytes 493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * return: a heap pointer if OK, NULL if error 503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgextern struct mem_block *mmInit(unsigned ofs, unsigned size); 523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/** 543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Allocate 'size' bytes with 2^align2 bytes alignment, 553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * restrict the search to free memory after 'startSearch' 563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * depth and back buffers should be in different 4mb banks 573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * to get better page hits if possible 583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * input: size = size of block 593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * align2 = 2^align2 bytes alignment 603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * startSearch = linear offset from start of heap to begin search 613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * return: pointer to the allocated block, 0 if error 623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgextern struct mem_block *mmAllocMem(struct mem_block *heap, unsigned size, 643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned align2, unsigned startSearch); 653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/** 673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Free block starts at offset 683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * input: pointer to a block 693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * return: 0 if OK, -1 if error 703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgextern int mmFreeMem(struct mem_block *b); 723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/** 743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Free block starts at offset 753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * input: pointer to a heap, start offset 763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * return: pointer to a block 773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgextern struct mem_block *mmFindBlock(struct mem_block *heap, unsigned start); 793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/** 813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * destroy MM 823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgextern void mmDestroy(struct mem_block *mmInit); 843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/** 863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * For debuging purpose. 873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgextern void mmDumpMemInfo(const struct mem_block *mmInit); 893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#endif 91