From 06b98125680694daa946197e4ec0a8b81e9084cf Mon Sep 17 00:00:00 2001 From: Lucas Fryzek Date: Mon, 8 Jul 2024 21:53:33 +0100 Subject: Get more tracing working --- config_kernel.h | 1 + drvemu.c | 100 ++++++++++++++++++++-- pvr_ioctl.h | 20 +++++ pvr_ioctl.inc | 251 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 363 insertions(+), 9 deletions(-) create mode 100644 pvr_ioctl.h create mode 100644 pvr_ioctl.inc diff --git a/config_kernel.h b/config_kernel.h index b3df0b9..88b7dba 100644 --- a/config_kernel.h +++ b/config_kernel.h @@ -40,3 +40,4 @@ #define PVR_DRI_DRM_NOT_PCI #define DC_NOHW_BUFFER_WIDTH 1920 #define DC_NOHW_BUFFER_HEIGHT 1080 +#define SUPPORT_DMABUF diff --git a/drvemu.c b/drvemu.c index 5499675..5d8f407 100644 --- a/drvemu.c +++ b/drvemu.c @@ -33,7 +33,10 @@ #include #include #include -//#include +#include + +#define DRM_IOCTL_PVR_SRVKM DRM_IOWR(PVR_DRM_SRVKM_CMD, PVRSRV_BRIDGE_PACKAGE) +#include "pvr_ioctl.h" static int false_fd = 10241024; @@ -42,27 +45,101 @@ static int false_fd = 10241024; if(!orig_##func) \ orig_##func = dlsym(RTLD_NEXT, #func); -int open(const char *pathname, int flags, mode_t mode) { - printf("Called open on %s (%d)\n", pathname, flags); - PROLOG(open); - return orig_open(pathname, flags, mode); -} - int open64(const char *pathname, int flags, ...) { printf("Called open64 on %s (%d)\n", pathname, flags); PROLOG(open64); + int fd = orig_open64(pathname, flags); if (strcmp(pathname, "/dev/dri/renderD128") == 0) { printf("Spoofing FD!\n"); return false_fd; } + return fd; } +int fcntl(int fd, int op, int arg) { + printf("Called fcntl on %d\n", fd); + PROLOG(fcntl); + + if (fd == false_fd) + return 0; + + return orig_fcntl(fd, op, arg); +} + #define DEV_NAME "pvr" #define DEV_DATE "20110701" #define DEV_DESC "Imagination Technologies PVR DRM" +void get_misc_info(SGX_MISC_INFO *info) { + switch(info->eRequest) { + case SGX_MISC_INFO_REQUEST_DRIVER_SGXREV: + info->uData.sSGXFeatures.ui32BuildOptions = SGX_BUILD_OPTIONS; + info->uData.sSGXFeatures.ui32DDKBuild = 3759903; + info->uData.sSGXFeatures.ui32DDKVersion = (1 << 16) | (14 << 8); + break; + default: + printf("Unimplemented misc req %d\n", info->eRequest); + assert(false); + break; + } +} + +static bool pvrsrv_ioctl(int fd, PVRSRV_BRIDGE_PACKAGE *bridge_package) { + int ioctl_nr = _IOC_NR(bridge_package->ui32BridgeID); + printf(">>> pvr_ioctl(%s)(0x%x)\n", pvrsrv_ioctl_names[ioctl_nr], bridge_package->ui32BridgeID); + switch(ioctl_nr) { + case _IOC_NR(PVRSRV_BRIDGE_CONNECT_SERVICES): { + PVRSRV_BRIDGE_OUT_CONNECT_SERVICES *data = bridge_package->pvParamOut; + data->eError = PVRSRV_OK; + data->hKernelServices = (void*)0x2; + break; + } + case _IOC_NR(PVRSRV_BRIDGE_ENUM_DEVICES): { + PVRSRV_BRIDGE_OUT_ENUMDEVICE *out = bridge_package->pvParamOut; + out->eError = PVRSRV_OK; + out->ui32NumDevices = 1; + out->asDeviceIdentifier[0].eDeviceType = PVRSRV_DEVICE_TYPE_SGX; + out->asDeviceIdentifier[0].eDeviceClass = PVRSRV_DEVICE_CLASS_3D; + out->asDeviceIdentifier[0].ui32DeviceIndex = 0; + out->asDeviceIdentifier[0].pszPDumpDevName = NULL; + out->asDeviceIdentifier[0].pszPDumpRegName = NULL; + break; + } + case _IOC_NR(PVRSRV_BRIDGE_ACQUIRE_DEVICEINFO): { + PVRSRV_BRIDGE_OUT_ACQUIRE_DEVICEINFO *out = bridge_package->pvParamOut; + out->eError = PVRSRV_OK; + out->hDevCookie = (void*)0x1; + break; + } + case _IOC_NR(PVRSRV_BRIDGE_SGX_GETMISCINFO): { + printf("Get misc info!\n"); + PVRSRV_BRIDGE_IN_SGXGETMISCINFO *in = bridge_package->pvParamIn; + PVRSRV_BRIDGE_RETURN *out = bridge_package->pvParamOut; + out->eError = PVRSRV_OK; + get_misc_info(in->psMiscInfo); + break; + } +#if 0 + case _IOC_NR(PVRSRV_BRIDGE_SGX_DEVINITPART2): { + PVRSRV_BRIDGE_OUT_SGXDEVINITPART2 *out = bridge_package->pvParamOut; + out->eError = PVRSRV_OK; + out->ui32KMBuildOptions = SGX_BUILD_OPTIONS; + printf("Input size is 0x%x\n", bridge_package->ui32InBufferSize); + printf("Build options 0x%x\n", SGX_BUILD_OPTIONS); + //out->ui32KMBuildOptions = 0x36a118; + break; + } +#endif + default: + printf("Unimplemented pvrsrv ioctl %d, may be %s\n", ioctl_nr, pvrsrv_ioctl_names[ioctl_nr]); + assert(false); + break; + } + return false; +} + static bool spoof_ioctl(int fd, int request, void *ptr) { int ioctl_nr = _IOC_NR(request); switch(ioctl_nr) { @@ -108,10 +185,9 @@ static bool spoof_ioctl(int fd, int request, void *ptr) { printf(">>> ioctl(DRM_IOCTL_DROP_MASTER)\n"); return 0; case PVR_DRM_SRVKM_CMD: - printf("srv command 0x%x\n", PVR_DRM_SRVKM_CMD); //fwrite(ptr, 1, sizeof(PVRSRV_BRIDGE_PACKAGE), log_file); //PPRINT(stdout, ptr, PVRSRV_BRIDGE_PACKAGE); - //return pvrsrv_ioctl(fd, ptr); + return pvrsrv_ioctl(fd, ptr); break; case PVR_DRM_IS_MASTER_CMD: printf(">>> ioctl(PVR_DRM_IS_MASTER_CMD) 0x%x\n", PVR_DRM_SRVKM_CMD); @@ -147,6 +223,12 @@ int ioctl(int fd, int request, ...) { return orig_ioctl(fd, request, ptr); } +int open(const char *pathname, int flags, mode_t mode) { + printf("Called open on %s (%d)\n", pathname, flags); + PROLOG(open); + return orig_open(pathname, flags, mode); +} + int openat(int dirfd, const char *pathname, int flags, ...) { printf("Called openat on %s (%d) (%d)\n", pathname, dirfd, flags); PROLOG(openat); diff --git a/pvr_ioctl.h b/pvr_ioctl.h new file mode 100644 index 0000000..5802079 --- /dev/null +++ b/pvr_ioctl.h @@ -0,0 +1,20 @@ +#ifndef PVR_IOCTL_H +#define PVR_IOCTL_H + +#if 0 +#define PVRSRV_IOWR(INDEX) (INDEX) +#define PVRSRV_IOCTL(NAME, VALUE) NAME = (VALUE), + +enum pvrsrv_ioctl { +#include "pvr_ioctl.inc" +}; + +#undef PVRSRV_IOCTL +#endif +#define PVRSRV_IOCTL(NAME, VALUE) [ _IOC_NR(NAME) ] = #NAME, + +const char *pvrsrv_ioctl_names[] = { +#include "pvr_ioctl.inc" +}; + +#endif diff --git a/pvr_ioctl.inc b/pvr_ioctl.inc new file mode 100644 index 0000000..094299f --- /dev/null +++ b/pvr_ioctl.inc @@ -0,0 +1,251 @@ + +#define PVRSRV_BRIDGE_UMKM_CMD_FIRST 0UL +PVRSRV_IOCTL(PVRSRV_BRIDGE_UM_KM_COMPAT_CHECK, 0) +#define PVRSRV_BRIDGE_UMKM_CMD_LAST (0) + +#define PVRSRV_BRIDGE_CORE_CMD_FIRST (PVRSRV_BRIDGE_UMKM_CMD_LAST + 1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_ENUM_DEVICES, PVRSRV_BRIDGE_CORE_CMD_FIRST+0) /*!< enumerate device bridge index */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_ACQUIRE_DEVICEINFO, PVRSRV_BRIDGE_CORE_CMD_FIRST+1) /*!< acquire device data bridge index */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_RELEASE_DEVICEINFO, PVRSRV_BRIDGE_CORE_CMD_FIRST+2) /*!< release device data bridge index */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_CREATE_DEVMEMCONTEXT, PVRSRV_BRIDGE_CORE_CMD_FIRST+3) /*!< create device addressable memory context */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_DESTROY_DEVMEMCONTEXT, PVRSRV_BRIDGE_CORE_CMD_FIRST+4) /*!< destroy device addressable memory context */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_GET_DEVMEM_HEAPINFO, PVRSRV_BRIDGE_CORE_CMD_FIRST+5) /*!< get device memory heap info */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_ALLOC_DEVICEMEM, PVRSRV_BRIDGE_CORE_CMD_FIRST+6) /*!< alloc device memory bridge index */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_FREE_DEVICEMEM, PVRSRV_BRIDGE_CORE_CMD_FIRST+7) /*!< free device memory bridge index */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_GETFREE_DEVICEMEM, PVRSRV_BRIDGE_CORE_CMD_FIRST+8) /*!< get free device memory bridge index */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_CREATE_COMMANDQUEUE, PVRSRV_BRIDGE_CORE_CMD_FIRST+9) /*!< create Cmd Q bridge index */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_DESTROY_COMMANDQUEUE, PVRSRV_BRIDGE_CORE_CMD_FIRST+10) /*!< destroy Cmd Q bridge index */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_MHANDLE_TO_MMAP_DATA, PVRSRV_BRIDGE_CORE_CMD_FIRST+11) /*!< generate mmap data from a memory handle */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_CONNECT_SERVICES, PVRSRV_BRIDGE_CORE_CMD_FIRST+12) /*!< services connect bridge index */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_DISCONNECT_SERVICES, PVRSRV_BRIDGE_CORE_CMD_FIRST+13) /*!< services disconnect bridge index */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_WRAP_DEVICE_MEM, PVRSRV_BRIDGE_CORE_CMD_FIRST+14) /*!< wrap device memory bridge index */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_GET_DEVICEMEMINFO, PVRSRV_BRIDGE_CORE_CMD_FIRST+15) /*!< read the kernel meminfo record */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_RESERVE_DEV_VIRTMEM, PVRSRV_BRIDGE_CORE_CMD_FIRST+16) +PVRSRV_IOCTL(PVRSRV_BRIDGE_FREE_DEV_VIRTMEM, PVRSRV_BRIDGE_CORE_CMD_FIRST+17) +PVRSRV_IOCTL(PVRSRV_BRIDGE_MAP_EXT_MEMORY, PVRSRV_BRIDGE_CORE_CMD_FIRST+18) +PVRSRV_IOCTL(PVRSRV_BRIDGE_UNMAP_EXT_MEMORY, PVRSRV_BRIDGE_CORE_CMD_FIRST+19) +PVRSRV_IOCTL(PVRSRV_BRIDGE_MAP_DEV_MEMORY, PVRSRV_BRIDGE_CORE_CMD_FIRST+20) +PVRSRV_IOCTL(PVRSRV_BRIDGE_UNMAP_DEV_MEMORY, PVRSRV_BRIDGE_CORE_CMD_FIRST+21) +PVRSRV_IOCTL(PVRSRV_BRIDGE_MAP_MEM_INFO_TO_USER, PVRSRV_BRIDGE_CORE_CMD_FIRST+22) +PVRSRV_IOCTL(PVRSRV_BRIDGE_UNMAP_MEM_INFO_FROM_USER, PVRSRV_BRIDGE_CORE_CMD_FIRST+23) +PVRSRV_IOCTL(PVRSRV_BRIDGE_EXPORT_DEVICEMEM, PVRSRV_BRIDGE_CORE_CMD_FIRST+24) +PVRSRV_IOCTL(PVRSRV_BRIDGE_RELEASE_MMAP_DATA, PVRSRV_BRIDGE_CORE_CMD_FIRST+25) +PVRSRV_IOCTL(PVRSRV_BRIDGE_CHG_DEV_MEM_ATTRIBS, PVRSRV_BRIDGE_CORE_CMD_FIRST+26) +#define PVRSRV_BRIDGE_MAP_DEV_MEMORY_2 PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+27) +#define PVRSRV_BRIDGE_EXPORT_DEVICEMEM_2 PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+28) +#if defined (SUPPORT_ION) +PVRSRV_IOCTL(PVRSRV_BRIDGE_MAP_ION_HANDLE, PVRSRV_BRIDGE_CORE_CMD_FIRST+29) +PVRSRV_IOCTL(PVRSRV_BRIDGE_UNMAP_ION_HANDLE, PVRSRV_BRIDGE_CORE_CMD_FIRST+30) +#define PVRSRV_BRIDGE_ION_CMD_LAST (PVRSRV_BRIDGE_CORE_CMD_FIRST+30) +#else +#define PVRSRV_BRIDGE_ION_CMD_LAST (PVRSRV_BRIDGE_CORE_CMD_FIRST+28) +#endif +#if defined (SUPPORT_DMABUF) +#define PVRSRV_BRIDGE_DMABUF_CMD_FIRST (PVRSRV_BRIDGE_ION_CMD_LAST+1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_MAP_DMABUF, PVRSRV_BRIDGE_DMABUF_CMD_FIRST+0) +PVRSRV_IOCTL(PVRSRV_BRIDGE_UNMAP_DMABUF, PVRSRV_BRIDGE_DMABUF_CMD_FIRST+1) +#define PVRSRV_BRIDGE_DMABUF_CMD_LAST (PVRSRV_BRIDGE_DMABUF_CMD_FIRST+1) +#else +#define PVRSRV_BRIDGE_DMABUF_CMD_LAST PVRSRV_BRIDGE_ION_CMD_LAST +#endif +#define PVRSRV_BRIDGE_CORE_CMD_LAST PVRSRV_BRIDGE_DMABUF_CMD_LAST +/* SIM */ +#define PVRSRV_BRIDGE_SIM_CMD_FIRST (PVRSRV_BRIDGE_CORE_CMD_LAST+1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_PROCESS_SIMISR_EVENT, PVRSRV_BRIDGE_SIM_CMD_FIRST+0) /*!< RTSIM pseudo ISR */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_REGISTER_SIM_PROCESS, PVRSRV_BRIDGE_SIM_CMD_FIRST+1) /*!< Register RTSIM process thread */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_UNREGISTER_SIM_PROCESS, PVRSRV_BRIDGE_SIM_CMD_FIRST+2) /*!< Unregister RTSIM process thread */ +#define PVRSRV_BRIDGE_SIM_CMD_LAST (PVRSRV_BRIDGE_SIM_CMD_FIRST+2) + +/* User Mapping */ +#define PVRSRV_BRIDGE_MAPPING_CMD_FIRST (PVRSRV_BRIDGE_SIM_CMD_LAST+1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_MAPPHYSTOUSERSPACE, PVRSRV_BRIDGE_MAPPING_CMD_FIRST+0) /*!< map CPU phys to user space */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_UNMAPPHYSTOUSERSPACE, PVRSRV_BRIDGE_MAPPING_CMD_FIRST+1) /*!< unmap CPU phys to user space */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_GETPHYSTOUSERSPACEMAP, PVRSRV_BRIDGE_MAPPING_CMD_FIRST+2) /*!< get user copy of Phys to Lin loopup table */ +#define PVRSRV_BRIDGE_MAPPING_CMD_LAST (PVRSRV_BRIDGE_MAPPING_CMD_FIRST+2) + +#define PVRSRV_BRIDGE_STATS_CMD_FIRST (PVRSRV_BRIDGE_MAPPING_CMD_LAST+1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_GET_FB_STATS, PVRSRV_BRIDGE_STATS_CMD_FIRST+0) /*!< Get FB memory stats */ +#define PVRSRV_BRIDGE_STATS_CMD_LAST (PVRSRV_BRIDGE_STATS_CMD_FIRST+0) + +/* API to retrieve misc. info. from services */ +#define PVRSRV_BRIDGE_MISC_CMD_FIRST (PVRSRV_BRIDGE_STATS_CMD_LAST+1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_GET_MISC_INFO, PVRSRV_BRIDGE_MISC_CMD_FIRST+0) /*!< misc. info. */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_RELEASE_MISC_INFO, PVRSRV_BRIDGE_MISC_CMD_FIRST+1) /*!< misc. info. */ +#define PVRSRV_BRIDGE_MISC_CMD_LAST (PVRSRV_BRIDGE_MISC_CMD_FIRST+1) + +/* Overlay ioctls */ + +#if defined (SUPPORT_OVERLAY_ROTATE_BLIT) +#define PVRSRV_BRIDGE_OVERLAY_CMD_FIRST (PVRSRV_BRIDGE_MISC_CMD_LAST+1) +#define PVRSRV_BRIDGE_INIT_3D_OVL_BLT_RES PVRSRV_IOWR(PVRSRV_BRIDGE_OVERLAY_CMD_FIRST+0) /*!< 3D Overlay rotate blit init */ +#define PVRSRV_BRIDGE_DEINIT_3D_OVL_BLT_RES PVRSRV_IOWR(PVRSRV_BRIDGE_OVERLAY_CMD_FIRST+1) /*!< 3D Overlay rotate blit deinit */ +#define PVRSRV_BRIDGE_OVERLAY_CMD_LAST (PVRSRV_BRIDGE_OVERLAY_CMD_FIRST+1) +#else +#define PVRSRV_BRIDGE_OVERLAY_CMD_LAST PVRSRV_BRIDGE_MISC_CMD_LAST +#endif + +/* PDUMP */ +#if defined(PDUMP) +#define PVRSRV_BRIDGE_PDUMP_CMD_FIRST (PVRSRV_BRIDGE_OVERLAY_CMD_LAST+1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_PDUMP_INIT, PVRSRV_BRIDGE_PDUMP_CMD_FIRST+0) /*!< pdump command structure */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_PDUMP_MEMPOL, PVRSRV_BRIDGE_PDUMP_CMD_FIRST+1) /*!< pdump command structure */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_PDUMP_DUMPMEM, PVRSRV_BRIDGE_PDUMP_CMD_FIRST+2) /*!< pdump command structure */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_PDUMP_REG, PVRSRV_BRIDGE_PDUMP_CMD_FIRST+3) /*!< pdump command structure */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_PDUMP_REGPOL, PVRSRV_BRIDGE_PDUMP_CMD_FIRST+4) /*!< pdump command structure */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_PDUMP_COMMENT, PVRSRV_BRIDGE_PDUMP_CMD_FIRST+5) /*!< pdump command structure */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_PDUMP_SETFRAME, PVRSRV_BRIDGE_PDUMP_CMD_FIRST+6) /*!< pdump command structure */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_PDUMP_ISCAPTURING, PVRSRV_BRIDGE_PDUMP_CMD_FIRST+7) /*!< pdump command structure */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_PDUMP_DUMPBITMAP, PVRSRV_BRIDGE_PDUMP_CMD_FIRST+8) /*!< pdump command structure */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_PDUMP_DUMPREADREG, PVRSRV_BRIDGE_PDUMP_CMD_FIRST+9) /*!< pdump command structure */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_PDUMP_SYNCPOL, PVRSRV_BRIDGE_PDUMP_CMD_FIRST+10) /*!< pdump command structure */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_PDUMP_DUMPSYNC, PVRSRV_BRIDGE_PDUMP_CMD_FIRST+11) /*!< pdump command structure */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_PDUMP_MEMPAGES, PVRSRV_BRIDGE_PDUMP_CMD_FIRST+12) /*!< pdump command structure */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_PDUMP_DRIVERINFO, PVRSRV_BRIDGE_PDUMP_CMD_FIRST+13) /*!< pdump command structure */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_PDUMP_DUMPPDDEVPADDR, PVRSRV_BRIDGE_PDUMP_CMD_FIRST+15) /*!< pdump command structure */ +PVRSRV_IOCTL(PVRSRV_BRIDGE_PDUMP_CYCLE_COUNT_REG_READ, PVRSRV_BRIDGE_PDUMP_CMD_FIRST+16) +PVRSRV_IOCTL(PVRSRV_BRIDGE_PDUMP_STARTINITPHASE, PVRSRV_BRIDGE_PDUMP_CMD_FIRST+17) +PVRSRV_IOCTL(PVRSRV_BRIDGE_PDUMP_STOPINITPHASE, PVRSRV_BRIDGE_PDUMP_CMD_FIRST+18) +#define PVRSRV_BRIDGE_PDUMP_CMD_LAST (PVRSRV_BRIDGE_PDUMP_CMD_FIRST+18) +#else +/* Note we are carefull here not to leave a large gap in the ioctl numbers. + * (Some ports may use these values to index into an array where large gaps can + * waste memory) */ +#define PVRSRV_BRIDGE_PDUMP_CMD_LAST PVRSRV_BRIDGE_OVERLAY_CMD_LAST +#endif + +/* DisplayClass APIs */ +#define PVRSRV_BRIDGE_OEM_CMD_FIRST (PVRSRV_BRIDGE_PDUMP_CMD_LAST+1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_GET_OEMJTABLE, PVRSRV_BRIDGE_OEM_CMD_FIRST+0) /*!< Get OEM Jtable */ +#define PVRSRV_BRIDGE_OEM_CMD_LAST (PVRSRV_BRIDGE_OEM_CMD_FIRST+0) + +/* device class enum */ +#define PVRSRV_BRIDGE_DEVCLASS_CMD_FIRST (PVRSRV_BRIDGE_OEM_CMD_LAST+1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_MAP_DEVICECLASS_MEMORY, PVRSRV_BRIDGE_DEVCLASS_CMD_FIRST+0) +PVRSRV_IOCTL(PVRSRV_BRIDGE_UNMAP_DEVICECLASS_MEMORY, PVRSRV_BRIDGE_DEVCLASS_CMD_FIRST+1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_ENUM_CLASS, PVRSRV_BRIDGE_DEVCLASS_CMD_FIRST+2) +#define PVRSRV_BRIDGE_DEVCLASS_CMD_LAST (PVRSRV_BRIDGE_DEVCLASS_CMD_FIRST+2) + +/* display class API */ +#define PVRSRV_BRIDGE_DISPCLASS_CMD_FIRST (PVRSRV_BRIDGE_DEVCLASS_CMD_LAST+1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_OPEN_DISPCLASS_DEVICE, PVRSRV_BRIDGE_DISPCLASS_CMD_FIRST+0) +PVRSRV_IOCTL(PVRSRV_BRIDGE_CLOSE_DISPCLASS_DEVICE, PVRSRV_BRIDGE_DISPCLASS_CMD_FIRST+1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_ENUM_DISPCLASS_FORMATS, PVRSRV_BRIDGE_DISPCLASS_CMD_FIRST+2) +PVRSRV_IOCTL(PVRSRV_BRIDGE_ENUM_DISPCLASS_DIMS, PVRSRV_BRIDGE_DISPCLASS_CMD_FIRST+3) +PVRSRV_IOCTL(PVRSRV_BRIDGE_GET_DISPCLASS_SYSBUFFER, PVRSRV_BRIDGE_DISPCLASS_CMD_FIRST+4) +PVRSRV_IOCTL(PVRSRV_BRIDGE_GET_DISPCLASS_INFO, PVRSRV_BRIDGE_DISPCLASS_CMD_FIRST+5) +PVRSRV_IOCTL(PVRSRV_BRIDGE_CREATE_DISPCLASS_SWAPCHAIN, PVRSRV_BRIDGE_DISPCLASS_CMD_FIRST+6) +PVRSRV_IOCTL(PVRSRV_BRIDGE_DESTROY_DISPCLASS_SWAPCHAIN, PVRSRV_BRIDGE_DISPCLASS_CMD_FIRST+7) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SET_DISPCLASS_DSTRECT, PVRSRV_BRIDGE_DISPCLASS_CMD_FIRST+8) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SET_DISPCLASS_SRCRECT, PVRSRV_BRIDGE_DISPCLASS_CMD_FIRST+9) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SET_DISPCLASS_DSTCOLOURKEY, PVRSRV_BRIDGE_DISPCLASS_CMD_FIRST+10) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SET_DISPCLASS_SRCCOLOURKEY, PVRSRV_BRIDGE_DISPCLASS_CMD_FIRST+11) +PVRSRV_IOCTL(PVRSRV_BRIDGE_GET_DISPCLASS_BUFFERS, PVRSRV_BRIDGE_DISPCLASS_CMD_FIRST+12) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SWAP_DISPCLASS_TO_BUFFER, PVRSRV_BRIDGE_DISPCLASS_CMD_FIRST+13) +#define PVRSRV_BRIDGE_SWAP_DISPCLASS_TO_BUFFER2 PVRSRV_IOWR(PVRSRV_BRIDGE_DISPCLASS_CMD_FIRST+14) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SWAP_DISPCLASS_TO_SYSTEM, PVRSRV_BRIDGE_DISPCLASS_CMD_FIRST+15) +#define PVRSRV_BRIDGE_DISPCLASS_CMD_LAST (PVRSRV_BRIDGE_DISPCLASS_CMD_FIRST+15) + +/* buffer class API */ +#define PVRSRV_BRIDGE_BUFCLASS_CMD_FIRST (PVRSRV_BRIDGE_DISPCLASS_CMD_LAST+1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_OPEN_BUFFERCLASS_DEVICE, PVRSRV_BRIDGE_BUFCLASS_CMD_FIRST+0) +PVRSRV_IOCTL(PVRSRV_BRIDGE_CLOSE_BUFFERCLASS_DEVICE, PVRSRV_BRIDGE_BUFCLASS_CMD_FIRST+1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_GET_BUFFERCLASS_INFO, PVRSRV_BRIDGE_BUFCLASS_CMD_FIRST+2) +PVRSRV_IOCTL(PVRSRV_BRIDGE_GET_BUFFERCLASS_BUFFER, PVRSRV_BRIDGE_BUFCLASS_CMD_FIRST+3) +#define PVRSRV_BRIDGE_BUFCLASS_CMD_LAST (PVRSRV_BRIDGE_BUFCLASS_CMD_FIRST+3) + +/* Wrap/Unwrap external memory */ +#define PVRSRV_BRIDGE_WRAP_CMD_FIRST (PVRSRV_BRIDGE_BUFCLASS_CMD_LAST+1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_WRAP_EXT_MEMORY, PVRSRV_BRIDGE_WRAP_CMD_FIRST+0) +PVRSRV_IOCTL(PVRSRV_BRIDGE_UNWRAP_EXT_MEMORY, PVRSRV_BRIDGE_WRAP_CMD_FIRST+1) +#define PVRSRV_BRIDGE_WRAP_CMD_LAST (PVRSRV_BRIDGE_WRAP_CMD_FIRST+1) + +/* Shared memory */ +#define PVRSRV_BRIDGE_SHAREDMEM_CMD_FIRST (PVRSRV_BRIDGE_WRAP_CMD_LAST+1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_ALLOC_SHARED_SYS_MEM, PVRSRV_BRIDGE_SHAREDMEM_CMD_FIRST+0) +PVRSRV_IOCTL(PVRSRV_BRIDGE_FREE_SHARED_SYS_MEM, PVRSRV_BRIDGE_SHAREDMEM_CMD_FIRST+1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_MAP_MEMINFO_MEM, PVRSRV_BRIDGE_SHAREDMEM_CMD_FIRST+2) +PVRSRV_IOCTL(PVRSRV_BRIDGE_UNMAP_MEMINFO_MEM, PVRSRV_BRIDGE_SHAREDMEM_CMD_FIRST+3) +#define PVRSRV_BRIDGE_SHAREDMEM_CMD_LAST (PVRSRV_BRIDGE_SHAREDMEM_CMD_FIRST+3) + +/* Intialisation Service support */ +#define PVRSRV_BRIDGE_INITSRV_CMD_FIRST (PVRSRV_BRIDGE_SHAREDMEM_CMD_LAST+1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_INITSRV_CONNECT, PVRSRV_BRIDGE_INITSRV_CMD_FIRST+0) +PVRSRV_IOCTL(PVRSRV_BRIDGE_INITSRV_DISCONNECT, PVRSRV_BRIDGE_INITSRV_CMD_FIRST+1) +#define PVRSRV_BRIDGE_INITSRV_CMD_LAST (PVRSRV_BRIDGE_INITSRV_CMD_FIRST+1) + +/* Event Objects */ +#define PVRSRV_BRIDGE_EVENT_OBJECT_CMD_FIRST (PVRSRV_BRIDGE_INITSRV_CMD_LAST+1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_EVENT_OBJECT_WAIT, PVRSRV_BRIDGE_EVENT_OBJECT_CMD_FIRST+0) +PVRSRV_IOCTL(PVRSRV_BRIDGE_EVENT_OBJECT_OPEN, PVRSRV_BRIDGE_EVENT_OBJECT_CMD_FIRST+1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_EVENT_OBJECT_CLOSE, PVRSRV_BRIDGE_EVENT_OBJECT_CMD_FIRST+2) +#define PVRSRV_BRIDGE_EVENT_OBJECT_CMD_LAST (PVRSRV_BRIDGE_EVENT_OBJECT_CMD_FIRST+2) + +/* Sync ops */ +#define PVRSRV_BRIDGE_SYNC_OPS_CMD_FIRST (PVRSRV_BRIDGE_EVENT_OBJECT_CMD_LAST+1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_CREATE_SYNC_INFO_MOD_OBJ, PVRSRV_BRIDGE_SYNC_OPS_CMD_FIRST+0) +PVRSRV_IOCTL(PVRSRV_BRIDGE_DESTROY_SYNC_INFO_MOD_OBJ, PVRSRV_BRIDGE_SYNC_OPS_CMD_FIRST+1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_MODIFY_PENDING_SYNC_OPS, PVRSRV_BRIDGE_SYNC_OPS_CMD_FIRST+2) +PVRSRV_IOCTL(PVRSRV_BRIDGE_MODIFY_COMPLETE_SYNC_OPS, PVRSRV_BRIDGE_SYNC_OPS_CMD_FIRST+3) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SYNC_OPS_TAKE_TOKEN, PVRSRV_BRIDGE_SYNC_OPS_CMD_FIRST+4) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SYNC_OPS_FLUSH_TO_TOKEN, PVRSRV_BRIDGE_SYNC_OPS_CMD_FIRST+5) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SYNC_OPS_FLUSH_TO_MOD_OBJ, PVRSRV_BRIDGE_SYNC_OPS_CMD_FIRST+6) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SYNC_OPS_FLUSH_TO_DELTA, PVRSRV_BRIDGE_SYNC_OPS_CMD_FIRST+7) +PVRSRV_IOCTL(PVRSRV_BRIDGE_ALLOC_SYNC_INFO, PVRSRV_BRIDGE_SYNC_OPS_CMD_FIRST+8) +PVRSRV_IOCTL(PVRSRV_BRIDGE_FREE_SYNC_INFO, PVRSRV_BRIDGE_SYNC_OPS_CMD_FIRST+9) +#define PVRSRV_BRIDGE_SYNC_OPS_CMD_LAST (PVRSRV_BRIDGE_SYNC_OPS_CMD_FIRST+9) + +/* For sgx_bridge.h (msvdx_bridge.h should probably use these defines too) */ +#define PVRSRV_BRIDGE_LAST_NON_DEVICE_CMD (PVRSRV_BRIDGE_SYNC_OPS_CMD_LAST+1) +/* For sgx_bridge.h (msvdx_bridge.h should probably use these defines too) */ +#define PVRSRV_BRIDGE_LAST_NON_DEVICE_CMD (PVRSRV_BRIDGE_SYNC_OPS_CMD_LAST+1) + +#define PVRSRV_BRIDGE_SGX_CMD_BASE (PVRSRV_BRIDGE_LAST_NON_DEVICE_CMD+1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_GETCLIENTINFO , PVRSRV_BRIDGE_SGX_CMD_BASE+0) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_RELEASECLIENTINFO , PVRSRV_BRIDGE_SGX_CMD_BASE+1) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_GETINTERNALDEVINFO, PVRSRV_BRIDGE_SGX_CMD_BASE+2) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_DOKICK , PVRSRV_BRIDGE_SGX_CMD_BASE+3) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_GETPHYSPAGEADDR , PVRSRV_BRIDGE_SGX_CMD_BASE+4) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_READREGISTRYDWORD , PVRSRV_BRIDGE_SGX_CMD_BASE+5) + +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_2DQUERYBLTSCOMPLETE , PVRSRV_BRIDGE_SGX_CMD_BASE+9) + +#if defined(TRANSFER_QUEUE) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_SUBMITTRANSFER , PVRSRV_BRIDGE_SGX_CMD_BASE+13) +#endif +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_GETMISCINFO , PVRSRV_BRIDGE_SGX_CMD_BASE+14) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGXINFO_FOR_SRVINIT , PVRSRV_BRIDGE_SGX_CMD_BASE+15) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_DEVINITPART2 , PVRSRV_BRIDGE_SGX_CMD_BASE+16) + +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC , PVRSRV_BRIDGE_SGX_CMD_BASE+17) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_UNREFSHAREDPBDESC , PVRSRV_BRIDGE_SGX_CMD_BASE+18) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC , PVRSRV_BRIDGE_SGX_CMD_BASE+19) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_REGISTER_HW_RENDER_CONTEXT, PVRSRV_BRIDGE_SGX_CMD_BASE+20) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_FLUSH_HW_RENDER_TARGET, PVRSRV_BRIDGE_SGX_CMD_BASE+21) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_UNREGISTER_HW_RENDER_CONTEXT, PVRSRV_BRIDGE_SGX_CMD_BASE+22) +#if defined(SGX_FEATURE_2D_HARDWARE) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_SUBMIT2D , PVRSRV_BRIDGE_SGX_CMD_BASE+23) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_REGISTER_HW_2D_CONTEXT, PVRSRV_BRIDGE_SGX_CMD_BASE+24) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_UNREGISTER_HW_2D_CONTEXT, PVRSRV_BRIDGE_SGX_CMD_BASE+25) +#endif +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_REGISTER_HW_TRANSFER_CONTEXT, PVRSRV_BRIDGE_SGX_CMD_BASE+26) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_UNREGISTER_HW_TRANSFER_CONTEXT, PVRSRV_BRIDGE_SGX_CMD_BASE+27) + +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_SCHEDULE_PROCESS_QUEUES , PVRSRV_BRIDGE_SGX_CMD_BASE+28) + +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_READ_HWPERF_CB , PVRSRV_BRIDGE_SGX_CMD_BASE+29) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_SET_RENDER_CONTEXT_PRIORITY , PVRSRV_BRIDGE_SGX_CMD_BASE+30) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_SET_TRANSFER_CONTEXT_PRIORITY , PVRSRV_BRIDGE_SGX_CMD_BASE+31) + +#if defined(PDUMP) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_PDUMP_BUFFER_ARRAY , PVRSRV_BRIDGE_SGX_CMD_BASE+32) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_PDUMP_3D_SIGNATURE_REGISTERS, PVRSRV_BRIDGE_SGX_CMD_BASE+33) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_PDUMP_COUNTER_REGISTERS, PVRSRV_BRIDGE_SGX_CMD_BASE+34) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_PDUMP_TA_SIGNATURE_REGISTERS, PVRSRV_BRIDGE_SGX_CMD_BASE+35) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_PDUMP_HWPERFCB , PVRSRV_BRIDGE_SGX_CMD_BASE+36) +PVRSRV_IOCTL(PVRSRV_BRIDGE_SGX_PDUMP_SAVEMEM , PVRSRV_BRIDGE_SGX_CMD_BASE+37) +#endif + +/* *REMEMBER* to update PVRSRV_BRIDGE_LAST_SGX_CMD if you add/remove a command! + * You need to ensure all PVRSRV_BRIDGE_SGX_CMD_BASE+ offsets are sequential! + */ +#define PVRSRV_BRIDGE_LAST_SGX_CMD (PVRSRV_BRIDGE_SGX_CMD_BASE+37) -- cgit