1
0
mirror of https://github.com/Yours3lf/rpi-vk-driver.git synced 2025-01-30 22:52:14 +01:00

added code to extract all info from v3d identity registers

This commit is contained in:
Unknown 2020-02-20 23:51:59 +00:00
parent 0eab6f0a0e
commit ebf1150136
4 changed files with 135 additions and 20 deletions

View File

@ -100,12 +100,25 @@ typedef struct VkInstance_T
//supposedly this should contain all the enabled layers?
int enabledExtensions[numInstanceExtensions];
int numEnabledExtensions;
int chipVersion;
int hasTiling;
int hasControlFlow;
int hasEtc1;
int hasThreadedFs;
int hasMadvise;
uint32_t technologyVersion;
uint32_t IDstrUINT;
uint32_t vpmMemorySize;
uint32_t hdrSupported;
uint32_t numSemaphores;
uint32_t numTMUperSlice;
uint32_t numQPUperSlice;
uint32_t numSlices;
uint32_t v3dRevision;
uint32_t tileBufferDoubleBufferModeSupported;
uint32_t tileBufferSize;
uint32_t vriMemorySize;
uint32_t hasTiling;
uint32_t hasControlFlow;
uint32_t hasEtc1;
uint32_t hasThreadedFs;
uint32_t hasMadvise;
uint32_t hasPerfmon;
uint32_t hasFixedRCLorder;
} _instance;
typedef struct VkDevice_T

View File

@ -156,18 +156,63 @@ VKAPI_ATTR VkResult VKAPI_CALL rpi_vkCreateInstance(
int ret = openIoctl(); assert(ret != -1);
(*pInstance)->chipVersion = vc4_get_chip_info(controlFd);
assert(vc4_get_chip_info(controlFd,
&(*pInstance)->technologyVersion,
&(*pInstance)->IDstrUINT,
&(*pInstance)->vpmMemorySize,
&(*pInstance)->hdrSupported,
&(*pInstance)->numSemaphores,
&(*pInstance)->numTMUperSlice,
&(*pInstance)->numQPUperSlice,
&(*pInstance)->numSlices,
&(*pInstance)->v3dRevision,
&(*pInstance)-> tileBufferDoubleBufferModeSupported,
&(*pInstance)->tileBufferSize,
&(*pInstance)->vriMemorySize));
(*pInstance)->hasTiling = vc4_test_tiling(controlFd);
(*pInstance)->hasControlFlow = vc4_has_feature(controlFd, DRM_VC4_PARAM_SUPPORTS_BRANCHES);
(*pInstance)->hasEtc1 = vc4_has_feature(controlFd, DRM_VC4_PARAM_SUPPORTS_ETC1);
(*pInstance)->hasThreadedFs = vc4_has_feature(controlFd, DRM_VC4_PARAM_SUPPORTS_THREADED_FS);
(*pInstance)->hasMadvise = vc4_has_feature(controlFd, DRM_VC4_PARAM_SUPPORTS_MADVISE);
(*pInstance)->hasPerfmon = vc4_has_feature(controlFd, DRM_VC4_PARAM_SUPPORTS_PERFMON);
(*pInstance)->hasFixedRCLorder = vc4_has_feature(controlFd, DRM_VC4_PARAM_SUPPORTS_FIXED_RCL_ORDER);
char IDstring[] = { 0, 0, 0, 0 };
memcpy(IDstring, &(*pInstance)->IDstrUINT, 3);
printf("------------------------------------------\n");
printf("------------------------------------------\n");
printf("V3D chip info: \n");
printf("IDstring %s\n", IDstring);
printf("technologyVersion: %u\n", (*pInstance)->technologyVersion);
printf("v3dRevision %u\n", (*pInstance)->v3dRevision);
printf("vpmMemorySize %u\n", (*pInstance)->vpmMemorySize);
printf("numSemaphores %u\n", (*pInstance)->numSemaphores);
printf("numTMUperSlice %u\n", (*pInstance)->numTMUperSlice);
printf("numQPUperSlice %u\n", (*pInstance)->numQPUperSlice);
printf("numSlices %u\n", (*pInstance)->numSlices);
printf("tileBufferSize %s\n", (*pInstance)->tileBufferSize > 0 ?
(*pInstance)->tileBufferSize > 1 ? "full" : "half" : "quarter");
printf("vriMemorySize %s\n", (*pInstance)->vriMemorySize ? "full" : "half");
printf("hdrSupported %u\n", (*pInstance)->hdrSupported);
printf("tileBufferDoubleBufferModeSupported %u\n", (*pInstance)-> tileBufferDoubleBufferModeSupported);
printf("hasTiling %u\n", (*pInstance)->hasTiling);
printf("hasControlFlow %u\n", (*pInstance)->hasControlFlow);
printf("hasEtc1 %u\n", (*pInstance)->hasEtc1);
printf("hasThreadedFs %u\n", (*pInstance)->hasThreadedFs);
printf("hasMadvise %u\n", (*pInstance)->hasMadvise);
printf("hasPerfmon %u\n", (*pInstance)->hasPerfmon);
printf("hasFixedRCLorder %u\n", (*pInstance)->hasFixedRCLorder);
printf("------------------------------------------\n");
printf("------------------------------------------\n");
assert((*pInstance)->hasTiling);
assert((*pInstance)->hasControlFlow);
assert((*pInstance)->hasEtc1);
assert((*pInstance)->hasThreadedFs);
assert((*pInstance)->hasPerfmon);
return VK_SUCCESS;
}

View File

@ -52,9 +52,33 @@ static uint32_t align(uint32_t num, uint32_t alignment)
}
}
int vc4_get_chip_info(int fd)
int vc4_get_chip_info(int fd,
uint32_t* technologyVersion,
uint32_t* IDstrUINT,
uint32_t* vpmMemorySize,
uint32_t* hdrSupported,
uint32_t* numSemaphores,
uint32_t* numTMUperSlice,
uint32_t* numQPUperSlice,
uint32_t* numSlices,
uint32_t* v3dRevision,
uint32_t* tileBufferDoubleBufferModeSupported,
uint32_t* tileBufferSize,
uint32_t* vriMemorySize)
{
assert(fd);
assert(technologyVersion);
assert(IDstrUINT);
assert(vpmMemorySize);
assert(hdrSupported);
assert(numSemaphores);
assert(numTMUperSlice);
assert(numQPUperSlice);
assert(numSlices);
assert(v3dRevision);
assert(tileBufferDoubleBufferModeSupported);
assert(tileBufferSize);
assert(vriMemorySize);
struct drm_vc4_get_param ident0 = {
.param = DRM_VC4_PARAM_V3D_IDENT0,
@ -62,6 +86,9 @@ int vc4_get_chip_info(int fd)
struct drm_vc4_get_param ident1 = {
.param = DRM_VC4_PARAM_V3D_IDENT1,
};
struct drm_vc4_get_param ident2 = {
.param = DRM_VC4_PARAM_V3D_IDENT2,
};
int ret;
ret = drmIoctl(fd, DRM_IOCTL_VC4_GET_PARAM, &ident0);
@ -70,7 +97,7 @@ int vc4_get_chip_info(int fd)
/* Backwards compatibility with 2835 kernels which
* only do V3D 2.1.
*/
return 21;
return 0; //21
} else {
fprintf(stderr, "Couldn't get V3D IDENT0: %s\n",
strerror(errno));
@ -83,19 +110,37 @@ int vc4_get_chip_info(int fd)
strerror(errno));
return 0;
}
uint32_t major = (ident0.value >> 24) & 0xff;
uint32_t minor = (ident1.value >> 0) & 0xf;
uint32_t v3d_ver = major * 10 + minor;
if (v3d_ver != 21 && v3d_ver != 26) {
fprintf(stderr, "V3D %d.%d not supported.\n",
v3d_ver / 10,
v3d_ver % 10);
ret = drmIoctl(fd, DRM_IOCTL_VC4_GET_PARAM, &ident2);
if (ret != 0) {
fprintf(stderr, "Couldn't get V3D IDENT2: %s\n",
strerror(errno));
return 0;
}
return v3d_ver;
*technologyVersion = (ident0.value >> 24) & 0xff;
*IDstrUINT = (ident0.value >> 0) & 0x00ffffff;
*vpmMemorySize = ((ident1.value >> 28) & 0xf) * 1024; //multiples of 1K
*hdrSupported = (ident1.value >> 24) & 0xf;
*numSemaphores = (ident1.value >> 16) & 0xff;
*numTMUperSlice = (ident1.value >> 12) & 0xf;
*numQPUperSlice = (ident1.value >> 8) & 0xf;
*numSlices = (ident1.value >> 4) & 0xf;
*v3dRevision = (ident1.value >> 0) & 0xf;
*tileBufferDoubleBufferModeSupported = (ident2.value >> 8) & 0xf;
*tileBufferSize = (ident2.value >> 4) & 0xf;
*vriMemorySize = (ident2.value >> 0) & 0xf;
uint32_t v3d_ver = (*technologyVersion) * 10 + (*v3dRevision);
if(v3d_ver != 21 && v3d_ver != 26)
{
printf("v3d_ver unsupported: %u\n", v3d_ver);
return 0;
}
return 1;
}
int vc4_has_feature(int fd, uint32_t feature)

View File

@ -40,7 +40,19 @@ extern int controlFd;
int openIoctl();
void closeIoctl();
int vc4_get_chip_info(int fd);
int vc4_get_chip_info(int fd,
uint32_t* technologyVersion,
uint32_t* IDstrUINT,
uint32_t* vpmMemorySize,
uint32_t* hdrSupported,
uint32_t* numSemaphores,
uint32_t* numTMUperSlice,
uint32_t* numQPUperSlice,
uint32_t* numSlices,
uint32_t* v3dRevision,
uint32_t* tileBufferDoubleBufferModeSupported,
uint32_t* tileBufferSize,
uint32_t* vriMemorySize);
int vc4_has_feature(int fd, uint32_t feature);
int vc4_test_tiling(int fd);
uint64_t vc4_bo_get_tiling(int fd, uint32_t bo, uint64_t mod);