| /* |
| * rmm.h |
| * |
| * DSP-BIOS Bridge driver support functions for TI OMAP processors. |
| * |
| * This memory manager provides general heap management and arbitrary |
| * alignment for any number of memory segments, and management of overlay |
| * memory. |
| * |
| * Copyright (C) 2005-2006 Texas Instruments, Inc. |
| * |
| * This package is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| * |
| * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR |
| * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED |
| * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
| */ |
| |
| #ifndef RMM_ |
| #define RMM_ |
| |
| /* |
| * ======== rmm_addr ======== |
| * DSP address + segid |
| */ |
| struct rmm_addr { |
| u32 addr; |
| s32 segid; |
| }; |
| |
| /* |
| * ======== rmm_segment ======== |
| * Memory segment on the DSP available for remote allocations. |
| */ |
| struct rmm_segment { |
| u32 base; /* Base of the segment */ |
| u32 length; /* Size of the segment (target MAUs) */ |
| s32 space; /* Code or data */ |
| u32 number; /* Number of Allocated Blocks */ |
| }; |
| |
| /* |
| * ======== RMM_Target ======== |
| */ |
| struct rmm_target_obj; |
| |
| /* |
| * ======== rmm_alloc ======== |
| * |
| * rmm_alloc is used to remotely allocate or reserve memory on the DSP. |
| * |
| * Parameters: |
| * target - Target returned from rmm_create(). |
| * segid - Memory segment to allocate from. |
| * size - Size (target MAUS) to allocate. |
| * align - alignment. |
| * dsp_address - If reserve is FALSE, the location to store allocated |
| * address on output, otherwise, the DSP address to |
| * reserve. |
| * reserve - If TRUE, reserve the memory specified by dsp_address. |
| * Returns: |
| * 0: Success. |
| * -ENOMEM: Memory allocation on GPP failed. |
| * -ENXIO: Cannot "allocate" overlay memory because it's |
| * already in use. |
| * Requires: |
| * RMM initialized. |
| * Valid target. |
| * dsp_address != NULL. |
| * size > 0 |
| * reserve || target->num_segs > 0. |
| * Ensures: |
| */ |
| extern int rmm_alloc(struct rmm_target_obj *target, u32 segid, u32 size, |
| u32 align, u32 *dsp_address, bool reserve); |
| |
| /* |
| * ======== rmm_create ======== |
| * Create a target object with memory segments for remote allocation. If |
| * seg_tab == NULL or num_segs == 0, memory can only be reserved through |
| * rmm_alloc(). |
| * |
| * Parameters: |
| * target_obj: - Location to store target on output. |
| * seg_tab: - Table of memory segments. |
| * num_segs: - Number of memory segments. |
| * Returns: |
| * 0: Success. |
| * -ENOMEM: Memory allocation failed. |
| * Requires: |
| * RMM initialized. |
| * target_obj != NULL. |
| * num_segs == 0 || seg_tab != NULL. |
| * Ensures: |
| * Success: Valid *target_obj. |
| * Failure: *target_obj == NULL. |
| */ |
| extern int rmm_create(struct rmm_target_obj **target_obj, |
| struct rmm_segment seg_tab[], u32 num_segs); |
| |
| /* |
| * ======== rmm_delete ======== |
| * Delete target allocated in rmm_create(). |
| * |
| * Parameters: |
| * target - Target returned from rmm_create(). |
| * Returns: |
| * Requires: |
| * RMM initialized. |
| * Valid target. |
| * Ensures: |
| */ |
| extern void rmm_delete(struct rmm_target_obj *target); |
| |
| /* |
| * ======== rmm_exit ======== |
| * Exit the RMM module |
| * |
| * Parameters: |
| * Returns: |
| * Requires: |
| * rmm_init successfully called. |
| * Ensures: |
| */ |
| extern void rmm_exit(void); |
| |
| /* |
| * ======== rmm_free ======== |
| * Free or unreserve memory allocated through rmm_alloc(). |
| * |
| * Parameters: |
| * target: - Target returned from rmm_create(). |
| * segid: - Segment of memory to free. |
| * dsp_address: - Address to free or unreserve. |
| * size: - Size of memory to free or unreserve. |
| * reserved: - TRUE if memory was reserved only, otherwise FALSE. |
| * Returns: |
| * Requires: |
| * RMM initialized. |
| * Valid target. |
| * reserved || segid < target->num_segs. |
| * reserve || [dsp_address, dsp_address + size] is a valid memory range. |
| * Ensures: |
| */ |
| extern bool rmm_free(struct rmm_target_obj *target, u32 segid, u32 dsp_addr, |
| u32 size, bool reserved); |
| |
| /* |
| * ======== rmm_init ======== |
| * Initialize the RMM module |
| * |
| * Parameters: |
| * Returns: |
| * TRUE: Success. |
| * FALSE: Failure. |
| * Requires: |
| * Ensures: |
| */ |
| extern bool rmm_init(void); |
| |
| /* |
| * ======== rmm_stat ======== |
| * Obtain memory segment status |
| * |
| * Parameters: |
| * segid: Segment ID of the dynamic loading segment. |
| * mem_stat_buf: Pointer to allocated buffer into which memory stats are |
| * placed. |
| * Returns: |
| * TRUE: Success. |
| * FALSE: Failure. |
| * Requires: |
| * segid < target->num_segs |
| * Ensures: |
| */ |
| extern bool rmm_stat(struct rmm_target_obj *target, enum dsp_memtype segid, |
| struct dsp_memstat *mem_stat_buf); |
| |
| #endif /* RMM_ */ |