DWC3 event buffer functions

This commit is contained in:
xj 2024-09-12 05:21:03 -07:00
parent 62c6017222
commit 7d575c4cea
1 changed files with 79 additions and 0 deletions

View File

@ -322,7 +322,69 @@ void dwc3_free_scratch_buffers(struct dwc3 *dwc){
int dwc3_alloc_event_buffers(struct dwc3 *dwc, uint32_t length){
int num;
int i;
num = DWC3_NUM_INT(dwc->hwparams.hwparams1);
dwc->num_event_buffers = num;
dwc->ev_buffs = usb_malloc(num * sizeof(*dwc->ev_buffs));
if (!dwc->ev_buffs)
return -ENOMEM;
for (i = 0; i < num; i++) {
struct dwc3_event_buffer *evt;
evt = dwc3_alloc_one_event_buffer(dwc, length);
if(evt == NULL){
goto err_alloc_evt;
}
dwc->ev_buffs[i] = evt;
}
return 0;
err_alloc_evt:
i = i - 1;
for(; i >= 0; i--){
usb_free(dwc->ev_buffs[i]);
}
return -ENOMEM;
}
struct dwc3_event_buffer *dwc3_alloc_one_event_buffer(struct dwc3 *dwc, unsigned length){
struct dwc3_event_buffer *evt;
uintptr_t phy_addr, vir_addr;
int ret;
evt = usb_malloc(sizeof(*evt));
if(evt == NULL){
return NULL;
}
evt->dwc = dwc;
evt->length = length;
vir_addr = USB_MEM_VIRADDR_ALLOC;
phy_addr = 0;
evt->buf = (void *)vir_addr;
ret = naive_mmap(&vir_addr, &phy_addr, length, true);
if(ret != 0){
USB_LOG_ERR("could not allocate DWC3 event buffers!\n");
goto err_evt;
}
evt->dma = phy_addr;
err_evt:
usb_free(evt);
return NULL;
}
@ -332,6 +394,23 @@ void dwc3_free_event_buffers(struct dwc3 *dwc){
int dwc3_event_buffers_setup(struct dwc3 *dwc){
struct dwc3_event_buffer *evt;
int n;
for (n = 0; n < dwc->num_event_buffers; n++) {
evt = dwc->ev_buffs[n];
evt->lpos = 0;
dwc3_writel(dwc->regs_vir, DWC3_GEVNTADRLO(n),
lower_32_bits(evt->dma));
dwc3_writel(dwc->regs_vir, DWC3_GEVNTADRHI(n),
upper_32_bits(evt->dma));
dwc3_writel(dwc->regs_vir, DWC3_GEVNTSIZ(n),
DWC3_GEVNTSIZ_SIZE(evt->length));
dwc3_writel(dwc->regs_vir, DWC3_GEVNTCOUNT(n), 0);
}
return 0;
}