1 /*
2  * rmm.h
3  *
4  * DSP-BIOS Bridge driver support functions for TI OMAP processors.
5  *
6  * This memory manager provides general heap management and arbitrary
7  * alignment for any number of memory segments, and management of overlay
8  * memory.
9  *
10  * Copyright (C) 2005-2006 Texas Instruments, Inc.
11  *
12  * This package is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU General Public License version 2 as
14  * published by the Free Software Foundation.
15  *
16  * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
18  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
19  */
20 
21 #ifndef RMM_
22 #define RMM_
23 
24 /*
25  *  ======== rmm_addr ========
26  *  DSP address + segid
27  */
28 struct rmm_addr {
29 	u32 addr;
30 	s32 segid;
31 };
32 
33 /*
34  *  ======== rmm_segment ========
35  *  Memory segment on the DSP available for remote allocations.
36  */
37 struct rmm_segment {
38 	u32 base;		/* Base of the segment */
39 	u32 length;		/* Size of the segment (target MAUs) */
40 	s32 space;		/* Code or data */
41 	u32 number;		/* Number of Allocated Blocks */
42 };
43 
44 /*
45  *  ======== RMM_Target ========
46  */
47 struct rmm_target_obj;
48 
49 /*
50  *  ======== rmm_alloc ========
51  *
52  *  rmm_alloc is used to remotely allocate or reserve memory on the DSP.
53  *
54  *  Parameters:
55  *      target          - Target returned from rmm_create().
56  *      segid           - Memory segment to allocate from.
57  *      size            - Size (target MAUS) to allocate.
58  *      align           - alignment.
59  *      dsp_address     - If reserve is FALSE, the location to store allocated
60  *                        address on output, otherwise, the DSP address to
61  *                        reserve.
62  *      reserve         - If TRUE, reserve the memory specified by dsp_address.
63  *  Returns:
64  *      0:                Success.
65  *      -ENOMEM:            Memory allocation on GPP failed.
66  *      -ENXIO:     Cannot "allocate" overlay memory because it's
67  *                              already in use.
68  *  Requires:
69  *      RMM initialized.
70  *      Valid target.
71  *      dsp_address != NULL.
72  *      size > 0
73  *      reserve || target->num_segs > 0.
74  *  Ensures:
75  */
76 extern int rmm_alloc(struct rmm_target_obj *target, u32 segid, u32 size,
77 			u32 align, u32 *dsp_address, bool reserve);
78 
79 /*
80  *  ======== rmm_create ========
81  *  Create a target object with memory segments for remote allocation. If
82  *  seg_tab == NULL or num_segs == 0, memory can only be reserved through
83  *  rmm_alloc().
84  *
85  *  Parameters:
86  *      target_obj:        - Location to store target on output.
87  *      seg_tab:         - Table of memory segments.
88  *      num_segs:        - Number of memory segments.
89  *  Returns:
90  *      0:        Success.
91  *      -ENOMEM:    Memory allocation failed.
92  *  Requires:
93  *      RMM initialized.
94  *      target_obj != NULL.
95  *      num_segs == 0 || seg_tab != NULL.
96  *  Ensures:
97  *      Success:        Valid *target_obj.
98  *      Failure:        *target_obj == NULL.
99  */
100 extern int rmm_create(struct rmm_target_obj **target_obj,
101 			     struct rmm_segment seg_tab[], u32 num_segs);
102 
103 /*
104  *  ======== rmm_delete ========
105  *  Delete target allocated in rmm_create().
106  *
107  *  Parameters:
108  *      target          - Target returned from rmm_create().
109  *  Returns:
110  *  Requires:
111  *      RMM initialized.
112  *      Valid target.
113  *  Ensures:
114  */
115 extern void rmm_delete(struct rmm_target_obj *target);
116 
117 /*
118  *  ======== rmm_free ========
119  *  Free or unreserve memory allocated through rmm_alloc().
120  *
121  *  Parameters:
122  *      target:         - Target returned from rmm_create().
123  *      segid:          - Segment of memory to free.
124  *      dsp_address:    - Address to free or unreserve.
125  *      size:           - Size of memory to free or unreserve.
126  *      reserved:       - TRUE if memory was reserved only, otherwise FALSE.
127  *  Returns:
128  *  Requires:
129  *      RMM initialized.
130  *      Valid target.
131  *      reserved || segid < target->num_segs.
132  *      reserve || [dsp_address, dsp_address + size] is a valid memory range.
133  *  Ensures:
134  */
135 extern bool rmm_free(struct rmm_target_obj *target, u32 segid, u32 dsp_addr,
136 		     u32 size, bool reserved);
137 
138 /*
139  *  ======== rmm_stat ========
140  *  Obtain  memory segment status
141  *
142  *  Parameters:
143  *      segid:       Segment ID of the dynamic loading segment.
144  *      mem_stat_buf: Pointer to allocated buffer into which memory stats are
145  *                   placed.
146  *  Returns:
147  *      TRUE:   Success.
148  *      FALSE:  Failure.
149  *  Requires:
150  *      segid < target->num_segs
151  *  Ensures:
152  */
153 extern bool rmm_stat(struct rmm_target_obj *target, enum dsp_memtype segid,
154 		     struct dsp_memstat *mem_stat_buf);
155 
156 #endif /* RMM_ */
157