Implant scratchpad buffer functions

This commit is contained in:
xj 2024-07-05 06:05:54 -07:00
parent ab573e238e
commit 7cb39f992c
2 changed files with 77 additions and 7 deletions

View File

@ -698,7 +698,8 @@ static int xhci_dcbaa_alloc ( struct xhci_host *xhci ) {
}
xhci->dcbaa_addr = dcbaap_addr;
xhci->dcbaa.context = (void *)dcbaap_phy;
xhci->dcbaa_phy = dcbaap_phy;
xhci->dcbaa.context = (void *)dcbaap_addr;
#if 0
if ( ! xhci->dcbaa.context ) {
@ -708,7 +709,9 @@ static int xhci_dcbaa_alloc ( struct xhci_host *xhci ) {
}
#endif
memset ( (void *)xhci->dcbaa_addr, 0, len );
// memset ( (void *)xhci->dcbaa_addr, 0, len );
memset ( xhci->dcbaa.context, 0, len );
/* Program DCBAA pointer */
// dcbaap = (uintptr_t)( xhci->dcbaa.context );
@ -739,6 +742,7 @@ static int xhci_scratchpad_alloc ( struct xhci_host *xhci ) {
size_t buffer_len;
size_t array_len;
uintptr_t addr;
uintptr_t vir_addr, phy_addr, vir_page_addr, phy_page_addr;
unsigned int i;
int rc;
@ -749,6 +753,60 @@ static int xhci_scratchpad_alloc ( struct xhci_host *xhci ) {
return 0;
}
/* Allocate buffer to store */
array_len = scratch->count * sizeof ( scratch->array[0] );
rc = naive_mmap(&vir_addr, &phy_addr, array_len, false);
if(rc != 0){
USB_LOG_ERR("XHCI %s could not allocate scratch buffer\n", xhci->name );
rc = -ENOMEM;
goto err_alloc;
}
scratch->array_addr = (void *)vir_addr;
memset(scratch->array_addr, 0, array_len);
scratch->array_phy = phy_addr;
/*
* Allocate memory for storing all virtual address of physical pages allocated to xHCI as scratchpad buffer.
*/
buffer_len = scratch->count * sizeof ( scratch->sp_buffers[0] );
scratch->sp_buffers = usb_align(xhci_align (buffer_len), buffer_len);
if(!scratch->sp_buffers){
USB_LOG_ERR("XHCI %s could not allocate scratchpad buffers\n",
xhci->name );
goto err_alloc_array;
}
/*
* Allocate physical page one by one, and store its physical address in vir_addr.
*/
for(i = 0; i < scratch->count; i++){
rc = naive_mmap(&vir_page_addr, &phy_page_addr, xhci->pagesize, false);
if(rc != 0){
USB_LOG_ERR("XHCI %s could not allocate scratchpad buffers\n",
xhci->name );
goto err_alloc_array_vir;
}
scratch->sp_buffers[i] = (void *)vir_page_addr;
scratch->array_addr[i] = phy_page_addr;
}
/*
* PLEASE NOTICE:
* The value that write to context[0] is the physical address of the memory region, which holds all physical address of memory pages
* that are allocated to xHCI as scratchpad buffers. The byte order of the physical address should be little end.
*/
USB_ASSERT ( xhci->dcbaa.context != NULL );
xhci->dcbaa.context[0] = scratch->array_phy;
return 0;
#if 0
/* Allocate scratchpad buffers */
buffer_len = ( scratch->count * xhci->pagesize );
scratch->buffer = (uintptr_t)usb_align ( xhci->pagesize, buffer_len );
@ -787,10 +845,16 @@ static int xhci_scratchpad_alloc ( struct xhci_host *xhci ) {
( scratch->array ),
( ( scratch->array ) + array_len ) );
return 0;
#endif
// usb_free ( scratch->array );
err_alloc_array_vir:
usb_free ( scratch->array );
err_alloc_array:
usb_free ( scratch->buffer );
// usb_free ( scratch->buffer );
err_alloc:
return rc;
}

View File

@ -76,11 +76,16 @@ struct xhci_scratchpad {
/** Scratchpad array */
uint64_t *array;
/*
* vir_addr: Vitual address array. It holds all the virtual address of the pages allocated to xHCI scratchpad buffer.
* array_addr: address array. It holds all the virtual address of the memory allocated to xHCI for storing all
* physical address of scratchpad buffer.
* array_phy: Physical address of array.
*/
uint64_t *vir_addr;
uint64_t *array_addr;
uintptr_t array_phy;
/*
* sp_buffers: scratchpad buffers. It holds all the virtual address of memory pages that are allocated to xHCI.
*/
void **sp_buffers;
};
/** An input control context */
@ -869,9 +874,10 @@ struct xhci_host {
/*
* Device context base address array.
*
* dcbaa_addr holds the virtual address of the dcbaa, meanwhile acbaa keeps the value that should be writen to XHCI_OP_DCBAAP.
* dcbaa_addr holds the virtual address of the dcbaa, meanwhile dcbaa_phy keeps the value that should be writen to XHCI_OP_DCBAAP.
*/
uintptr_t dcbaa_addr;
uintptr_t dcbaa_phy;
struct xhci_dcbaa dcbaa;
/** Scratchpad buffer */