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_addr = dcbaap_addr;
xhci->dcbaa.context = (void *)dcbaap_phy; xhci->dcbaa_phy = dcbaap_phy;
xhci->dcbaa.context = (void *)dcbaap_addr;
#if 0 #if 0
if ( ! xhci->dcbaa.context ) { if ( ! xhci->dcbaa.context ) {
@ -708,7 +709,9 @@ static int xhci_dcbaa_alloc ( struct xhci_host *xhci ) {
} }
#endif #endif
memset ( (void *)xhci->dcbaa_addr, 0, len ); // memset ( (void *)xhci->dcbaa_addr, 0, len );
memset ( xhci->dcbaa.context, 0, len );
/* Program DCBAA pointer */ /* Program DCBAA pointer */
// dcbaap = (uintptr_t)( xhci->dcbaa.context ); // 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 buffer_len;
size_t array_len; size_t array_len;
uintptr_t addr; uintptr_t addr;
uintptr_t vir_addr, phy_addr, vir_page_addr, phy_page_addr;
unsigned int i; unsigned int i;
int rc; int rc;
@ -749,6 +753,60 @@ static int xhci_scratchpad_alloc ( struct xhci_host *xhci ) {
return 0; 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 */ /* Allocate scratchpad buffers */
buffer_len = ( scratch->count * xhci->pagesize ); buffer_len = ( scratch->count * xhci->pagesize );
scratch->buffer = (uintptr_t)usb_align ( xhci->pagesize, buffer_len ); 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 ),
( ( scratch->array ) + array_len ) ); ( ( scratch->array ) + array_len ) );
return 0; return 0;
#endif
// usb_free ( scratch->array );
err_alloc_array_vir:
usb_free ( scratch->array );
err_alloc_array: err_alloc_array:
usb_free ( scratch->buffer ); // usb_free ( scratch->buffer );
err_alloc: err_alloc:
return rc; return rc;
} }

View File

@ -76,11 +76,16 @@ struct xhci_scratchpad {
/** Scratchpad array */ /** Scratchpad array */
uint64_t *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. * array_phy: Physical address of array.
*/ */
uint64_t *vir_addr; uint64_t *array_addr;
uintptr_t array_phy; 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 */ /** An input control context */
@ -869,9 +874,10 @@ struct xhci_host {
/* /*
* Device context base address array. * 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_addr;
uintptr_t dcbaa_phy;
struct xhci_dcbaa dcbaa; struct xhci_dcbaa dcbaa;
/** Scratchpad buffer */ /** Scratchpad buffer */