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
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){
@ -54,13 +55,81 @@ void usb_hc_free(void* 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){
return NULL;
memset(&usb_mem_pool, 0, sizeof(usb_mem_pool));
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 <string.h>
#include "usb_config.h"
#include "usyscall.h"
#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_free();
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_align(align, size) usb_hc_malloc_align(align, size)
struct usb_dir_page{
uint64_t vir_addr;
uint64_t phy_addr;
uint32_t size;
uint32_t len;
uint32_t flag;
uint32_t headroom_len;
}__PACKED;
struct usb_mem_page{
uintptr_t vir_addr;
uintptr_t phy_addr;
typedef struct usb_dir_page *usb_dir_page_t;
};
usb_dir_page_t usb_alloc_dir_page(int len, int flag, int headroom_len);
void usb_free_dir_page(usb_dir_page_t page);
struct usb_mem_pool{
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);