mirror of
https://github.com/raspberrypi/userland.git
synced 2025-12-06 04:49:12 +00:00
vcdbg: Use dma driver to access gpu memory
This commit is contained in:
@@ -139,6 +139,40 @@ int OpenVideoCoreMemory( VC_MEM_ACCESS_HANDLE_T *vcHandlePtr )
|
|||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
|
struct fb_dmacopy {
|
||||||
|
uint32_t dst;
|
||||||
|
uint32_t src;
|
||||||
|
uint32_t length;
|
||||||
|
};
|
||||||
|
#define FBIODMACOPY _IOW('z', 0x22, struct fb_dmacopy)
|
||||||
|
|
||||||
|
static int vc_mem_copy(uint32_t dst, uint32_t src, uint32_t length)
|
||||||
|
{
|
||||||
|
const char *filename = "/dev/fb0";
|
||||||
|
int memFd;
|
||||||
|
struct fb_dmacopy ioparam;
|
||||||
|
|
||||||
|
ioparam.dst = dst;
|
||||||
|
ioparam.src = src;
|
||||||
|
ioparam.length = length;
|
||||||
|
|
||||||
|
if (( memFd = open( filename, O_RDWR | O_SYNC )) < 0 )
|
||||||
|
{
|
||||||
|
ERR( "Unable to open '%s': %s(%d)\n", filename, strerror( errno ), errno );
|
||||||
|
return -errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ioctl( memFd, FBIODMACOPY, &ioparam ) != 0 )
|
||||||
|
{
|
||||||
|
ERR( "Failed to get memory size via ioctl: %s(%d)\n",
|
||||||
|
strerror( errno ), errno );
|
||||||
|
close( memFd );
|
||||||
|
return -errno;
|
||||||
|
}
|
||||||
|
close( memFd );
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int OpenVideoCoreMemoryFile( const char *filename, VC_MEM_ACCESS_HANDLE_T *vcHandlePtr )
|
int OpenVideoCoreMemoryFile( const char *filename, VC_MEM_ACCESS_HANDLE_T *vcHandlePtr )
|
||||||
{
|
{
|
||||||
return OpenVideoCoreMemoryFileWithOffset( filename, vcHandlePtr, 0 );
|
return OpenVideoCoreMemoryFileWithOffset( filename, vcHandlePtr, 0 );
|
||||||
@@ -533,6 +567,7 @@ static int AccessVideoCoreMemory( VC_MEM_ACCESS_HANDLE_T vcHandle,
|
|||||||
VC_MEM_ADDR_T vcMemAddr,
|
VC_MEM_ADDR_T vcMemAddr,
|
||||||
size_t numBytes )
|
size_t numBytes )
|
||||||
{
|
{
|
||||||
|
VC_MEM_ADDR_T origVcMemAddr = vcMemAddr;
|
||||||
DBG( "%s %zu bytes @ 0x%08x", mem_op == WRITE_MEM ? "Write" : "Read", numBytes, vcMemAddr );
|
DBG( "%s %zu bytes @ 0x%08x", mem_op == WRITE_MEM ? "Write" : "Read", numBytes, vcMemAddr );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -587,6 +622,15 @@ static int AccessVideoCoreMemory( VC_MEM_ACCESS_HANDLE_T vcHandle,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
// DMA allows memory to be accessed above 1008M and is more coherent so try this first
|
||||||
|
if (mem_op == READ_MEM)
|
||||||
|
{
|
||||||
|
DBG( "AccessVideoCoreMemory: %p, %x, %d", buf, origVcMemAddr, numBytes );
|
||||||
|
int s = vc_mem_copy((uint32_t)buf, (uint32_t)origVcMemAddr, numBytes);
|
||||||
|
if (s == 0)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
uint8_t *mapAddr;
|
uint8_t *mapAddr;
|
||||||
size_t mapSize;
|
size_t mapSize;
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#define VC_MEM_IOC_MEM_SIZE _IOR( VC_MEM_IOC_MAGIC, 1, unsigned int )
|
#define VC_MEM_IOC_MEM_SIZE _IOR( VC_MEM_IOC_MAGIC, 1, unsigned int )
|
||||||
#define VC_MEM_IOC_MEM_BASE _IOR( VC_MEM_IOC_MAGIC, 2, unsigned int )
|
#define VC_MEM_IOC_MEM_BASE _IOR( VC_MEM_IOC_MAGIC, 2, unsigned int )
|
||||||
#define VC_MEM_IOC_MEM_LOAD _IOR( VC_MEM_IOC_MAGIC, 3, unsigned int )
|
#define VC_MEM_IOC_MEM_LOAD _IOR( VC_MEM_IOC_MAGIC, 3, unsigned int )
|
||||||
|
#define VC_MEM_IOC_MEM_COPY _IOWR( VC_MEM_IOC_MAGIC, 4, char *)
|
||||||
|
|
||||||
#if defined( __KERNEL__ )
|
#if defined( __KERNEL__ )
|
||||||
#define VC_MEM_TO_ARM_ADDR_MASK 0x3FFFFFFF
|
#define VC_MEM_TO_ARM_ADDR_MASK 0x3FFFFFFF
|
||||||
|
|||||||
Reference in New Issue
Block a user