From 7d575c4ceafe666e570a3c6cd2d599b29a8f889b Mon Sep 17 00:00:00 2001 From: xj Date: Thu, 12 Sep 2024 05:21:03 -0700 Subject: [PATCH] DWC3 event buffer functions --- .../drivers/usb/components/port/dwc3/dwc3.c | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/port/dwc3/dwc3.c b/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/port/dwc3/dwc3.c index 8e65f940f..e11ebdf38 100644 --- a/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/port/dwc3/dwc3.c +++ b/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/port/dwc3/dwc3.c @@ -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; }