1 /*
2 * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
3 * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sub license,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial portions
14 * of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
19 * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 */
24
25 #ifndef _via_ds_h_
26 #define _via_ds_h_
27
28 /* Set Data Structure */
29
30 #define SET_SIZE 5000
31
32 typedef struct {
33 unsigned int val;
34 int alloc_next, free_next;
35 } list_item_t;
36
37 typedef struct {
38 int alloc;
39 int free;
40 int trace;
41 list_item_t list[SET_SIZE];
42 } set_t;
43
44 set_t *via_set_init(void);
45 int via_set_add(set_t *set, unsigned int item);
46 int via_set_del(set_t *set, unsigned int item);
47 int via_set_first(set_t *set, unsigned int *item);
48 int via_set_next(set_t *set, unsigned int *item);
49 int via_set_destroy(set_t *set);
50
51 #endif
52
53
54 #ifndef MM_INC
55 #define MM_INC
56
57 struct mem_block_t {
58 struct mem_block_t *next;
59 struct mem_block_t *heap;
60 int ofs,size;
61 int align;
62 int free:1;
63 int reserved:1;
64 };
65 typedef struct mem_block_t TMemBlock;
66 typedef struct mem_block_t *PMemBlock;
67
68 /* a heap is just the first block in a chain */
69 typedef struct mem_block_t memHeap_t;
70
mmBlockSize(PMemBlock b)71 static __inline__ int mmBlockSize(PMemBlock b)
72 {
73 return b->size;
74 }
75
mmOffset(PMemBlock b)76 static __inline__ int mmOffset(PMemBlock b)
77 {
78 return b->ofs;
79 }
80
mmMarkReserved(PMemBlock b)81 static __inline__ void mmMarkReserved(PMemBlock b)
82 {
83 b->reserved = 1;
84 }
85
86 /*
87 * input: total size in bytes
88 * return: a heap pointer if OK, NULL if error
89 */
90
91 memHeap_t *via_mmInit(int ofs, int size);
92
93 memHeap_t *via_mmAddRange(memHeap_t *heap, int ofs, int size);
94
95
96 /*
97 * Allocate 'size' bytes with 2^align2 bytes alignment,
98 * restrict the search to free memory after 'startSearch'
99 * depth and back buffers should be in different 4mb banks
100 * to get better page hits if possible
101 * input: size = size of block
102 * align2 = 2^align2 bytes alignment
103 * startSearch = linear offset from start of heap to begin search
104 * return: pointer to the allocated block, 0 if error
105 */
106
107 PMemBlock via_mmAllocMem(memHeap_t *heap, int size, int align2, int startSearch);
108
109 /*
110 * Free block starts at offset
111 * input: pointer to a block
112 * return: 0 if OK, -1 if error
113 */
114 int via_mmFreeMem(PMemBlock b);
115
116 /*
117 * Reserve 'size' bytes block start at offset
118 * This is used to prevent allocation of memory already used
119 * by the X server for the front buffer, pixmaps, and cursor
120 * input: size, offset
121 * output: 0 if OK, -1 if error
122 */
123 int via_mmReserveMem(memHeap_t *heap, int offset,int size);
124 int via_mmFreeReserved(memHeap_t *heap, int offset);
125
126 /*
127 * destroy MM
128 */
129 void via_mmDestroy(memHeap_t *mmInit);
130
131 /* For debuging purpose. */
132 void via_mmDumpMemInfo(memHeap_t *mmInit);
133
134 #endif
135