Add USB memory pool function

This commit is contained in:
xj 2024-08-01 00:27:38 -07:00
parent 1bc171a131
commit 19269781b4
2 changed files with 93 additions and 14 deletions

View File

@ -11,6 +11,7 @@ History:
Author: AIIT XUOS Lab Author: AIIT XUOS Lab
Modification: re-develop usb_hc_malloc, usb_hc_malloc_align and usb_hc_free functions Modification: re-develop usb_hc_malloc, usb_hc_malloc_align and usb_hc_free functions
*************************************************/ *************************************************/
struct usb_mem_pool usb_mem_pool;
void *usb_hc_malloc(size_t size){ void *usb_hc_malloc(size_t size){
@ -54,13 +55,81 @@ void usb_hc_free(void* ptr){
free(ptr); free(ptr);
} }
int usb_mem_pool_init(){
int rc, count;
uintptr_t phy_addr, vir_addr;
usb_dir_page_t usb_alloc_dir_page(int len, int flag, int headroom_len){ memset(&usb_mem_pool, 0, sizeof(usb_mem_pool));
return NULL;
count = 0;
while(count < MEM_POOL_SIZE){
rc = naive_mmap(&vir_addr, &phy_addr, 4096, true);
if(rc != 0)
goto mmap_error;
usb_mem_pool.pages[count].vir_addr = vir_addr;
usb_mem_pool.pages[count].phy_addr = phy_addr;
count++;
}
return 0;
mmap_error:
return -1;
}
usb_mem_page_t usb_alloc_mem_page(){
usb_mem_page_t selected_page;
int header, tail;
header = usb_mem_pool.header;
tail = usb_mem_pool.tail;
/*
* Check whether the memory pool is full or not.
*/
if((tail + 1) % MEM_POOL_SIZE == header)
return NULL;
selected_page = &usb_mem_pool.pages[tail];
tail++;
if(tail == MEM_POOL_SIZE)
tail = 0;
usb_mem_pool.tail = tail;
return selected_page;
} }
void usb_free_dir_page(usb_dir_page_t page){ void usb_free_mem_page(usb_mem_page_t page){
usb_mem_page_t selected_page;
int header, tail;
header = usb_mem_pool.header;
tail = usb_mem_pool.tail;
/*
* Check whether the memory pool is full or not.
*/
if((header + 1) % MEM_POOL_SIZE == tail)
return;
selected_page = &usb_mem_pool.pages[header];
selected_page->vir_addr = page->vir_addr;
selected_page->phy_addr = page->phy_addr;
header++;
if(header == MEM_POOL_SIZE)
header = 0;
usb_mem_pool.header = header;
} }

View File

@ -26,9 +26,13 @@ Modification: Use usb_malloc, usb_free and usb_align functions
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
#include "usb_config.h" #include "usb_config.h"
#include "usyscall.h"
#define USB_MEM_ALIGNX __attribute__((aligned(CONFIG_USB_ALIGN_SIZE))) #define USB_MEM_ALIGNX __attribute__((aligned(CONFIG_USB_ALIGN_SIZE)))
#define MEM_POOL_SIZE 128
void *usb_hc_malloc(size_t size); void *usb_hc_malloc(size_t size);
void usb_hc_free(); void usb_hc_free();
void *usb_hc_malloc_align(size_t align, size_t size); void *usb_hc_malloc_align(size_t align, size_t size);
@ -37,19 +41,25 @@ void *usb_hc_malloc_align(size_t align, size_t size);
#define usb_free(ptr) usb_hc_free(ptr) #define usb_free(ptr) usb_hc_free(ptr)
#define usb_align(align, size) usb_hc_malloc_align(align, size) #define usb_align(align, size) usb_hc_malloc_align(align, size)
struct usb_dir_page{ struct usb_mem_page{
uint64_t vir_addr; uintptr_t vir_addr;
uint64_t phy_addr; uintptr_t phy_addr;
uint32_t size;
uint32_t len;
uint32_t flag;
uint32_t headroom_len;
}__PACKED;
typedef struct usb_dir_page *usb_dir_page_t; };
usb_dir_page_t usb_alloc_dir_page(int len, int flag, int headroom_len); struct usb_mem_pool{
void usb_free_dir_page(usb_dir_page_t page); int header;
int tail;
struct usb_mem_page pages[MEM_POOL_SIZE];
};
typedef struct usb_mem_page *usb_mem_page_t;
typedef struct usb_mem_pool *usb_mem_pool_t;
int usb_mem_pool_init();
void usb_mem_pool_destory();
usb_mem_page_t usb_alloc_mem_page();
void usb_free_mem_page(usb_mem_page_t page);