radeon-gallium: Support new info ioctls in addition to classic getparams.

This makes non-hybrid kernels like newttm from drm-next-radeon work
while avoiding breakage with Fedora/Ubuntu/etc.
This commit is contained in:
Corbin Simpson 2009-05-11 09:04:15 -07:00
parent 7c3d7353d7
commit 2e22bd8460
2 changed files with 41 additions and 12 deletions

View file

@ -152,44 +152,62 @@ static void radeon_r300_flush_cs(struct r300_winsys* winsys)
/* Helper function to do the ioctls needed for setup and init. */
static void do_ioctls(struct r300_winsys* winsys, int fd)
{
struct drm_radeon_gem_info info = {0};
struct drm_radeon_gem_info gem_info = {0};
drm_radeon_getparam_t gp = {0};
struct drm_radeon_info info = {0};
int target = 0;
int retval;
info.value = ⌖
gp.value = ⌖
/* First, get the number of pixel pipes */
gp.param = RADEON_PARAM_NUM_GB_PIPES;
retval = drmCommandWriteRead(fd, DRM_RADEON_GETPARAM, &gp, sizeof(gp));
info.request = RADEON_INFO_NUM_GB_PIPES;
retval = drmCommandWriteRead(fd, DRM_RADEON_INFO, &info, sizeof(info));
if (retval) {
fprintf(stderr, "%s: Failed to get GB pipe count, error number %d\n",
fprintf(stderr, "%s: New ioctl for GB pipe count failed "
"(error number %d), trying classic ioctl...\n",
__FUNCTION__, retval);
exit(1);
gp.param = RADEON_PARAM_NUM_GB_PIPES;
retval = drmCommandWriteRead(fd, DRM_RADEON_GETPARAM, &gp,
sizeof(gp));
if (retval) {
fprintf(stderr, "%s: Failed to get GB pipe count, "
"error number %d\n", __FUNCTION__, retval);
exit(1);
}
}
winsys->gb_pipes = target;
/* Then, get PCI ID */
gp.param = RADEON_PARAM_DEVICE_ID;
retval = drmCommandWriteRead(fd, DRM_RADEON_GETPARAM, &gp, sizeof(gp));
info.request = RADEON_INFO_DEVICE_ID;
retval = drmCommandWriteRead(fd, DRM_RADEON_INFO, &info, sizeof(info));
if (retval) {
fprintf(stderr, "%s: Failed to get PCI ID, error number %d\n",
fprintf(stderr, "%s: New ioctl for PCI ID failed "
"(error number %d), trying classic ioctl...\n",
__FUNCTION__, retval);
exit(1);
gp.param = RADEON_PARAM_DEVICE_ID;
retval = drmCommandWriteRead(fd, DRM_RADEON_GETPARAM, &gp,
sizeof(gp));
if (retval) {
fprintf(stderr, "%s: Failed to get PCI ID, "
"error number %d\n", __FUNCTION__, retval);
exit(1);
}
}
winsys->pci_id = target;
/* Finally, retrieve MM info */
retval = drmCommandWriteRead(fd, DRM_RADEON_GEM_INFO,
&info, sizeof(info));
&gem_info, sizeof(gem_info));
if (retval) {
fprintf(stderr, "%s: Failed to get MM info, error number %d\n",
__FUNCTION__, retval);
exit(1);
}
winsys->gart_size = info.gart_size;
winsys->gart_size = gem_info.gart_size;
/* XXX */
winsys->vram_size = info.vram_visible;
winsys->vram_size = gem_info.vram_visible;
}
struct r300_winsys*

View file

@ -31,5 +31,16 @@
#include "radeon_buffer.h"
/* protect us from bonghits */
#ifndef RADEON_INFO_NUM_GB_PIPES
#define RADEON_INFO_NUM_GB_PIPES 0
#endif
#ifndef RADEON_INFO_DEVICE_ID
#define RADEON_INFO_DEVICE_ID 0
#endif
#ifndef DRM_RADEON_INFO
#define DRM_RADEON_INFO 0x1
#endif
struct r300_winsys*
radeon_create_r300_winsys(int fd, struct radeon_winsys* old_winsys);