summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-06-04 12:47:19 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2011-06-04 13:01:11 +0100
commit9d77603d8b95aee4f2408e437c55af15ee05b608 (patch)
tree458d906c5f63cace1d295ab001458119bfb7586c
parent61be94018ae9c403517d53f69357719224fa6ff3 (diff)
intel: Add interface to query aperture sizes.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--configure.ac4
-rw-r--r--intel/Makefile.am3
-rw-r--r--intel/intel_bufmgr.c50
-rw-r--r--intel/intel_bufmgr.h2
4 files changed, 58 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac
index d9c826d8..e776ef57 100644
--- a/configure.ac
+++ b/configure.ac
@@ -51,6 +51,10 @@ PKG_CHECK_MODULES(PTHREADSTUBS, pthread-stubs)
AC_SUBST(PTHREADSTUBS_CFLAGS)
AC_SUBST(PTHREADSTUBS_LIBS)
+PKG_CHECK_MODULES(PCIACCESS, [pciaccess >= 0.10])
+AC_SUBST(PCIACCESS_CFLAGS)
+AC_SUBST(PCIACCESS_LIBS)
+
pkgconfigdir=${libdir}/pkgconfig
AC_SUBST(pkgconfigdir)
AC_ARG_ENABLE([udev],
diff --git a/intel/Makefile.am b/intel/Makefile.am
index 1ae92f86..b6a90143 100644
--- a/intel/Makefile.am
+++ b/intel/Makefile.am
@@ -27,12 +27,13 @@ AM_CFLAGS = \
-I$(top_srcdir) \
-I$(top_srcdir)/intel \
$(PTHREADSTUBS_CFLAGS) \
+ $(PCIACCESS_CFLAGS) \
-I$(top_srcdir)/include/drm
libdrm_intel_la_LTLIBRARIES = libdrm_intel.la
libdrm_intel_ladir = $(libdir)
libdrm_intel_la_LDFLAGS = -version-number 1:0:0 -no-undefined
-libdrm_intel_la_LIBADD = ../libdrm.la @PTHREADSTUBS_LIBS@ @CLOCK_LIB@
+libdrm_intel_la_LIBADD = ../libdrm.la @PTHREADSTUBS_LIBS@ @PCIACCESS_LIBS@ @CLOCK_LIB@
libdrm_intel_la_SOURCES = \
intel_bufmgr.c \
diff --git a/intel/intel_bufmgr.c b/intel/intel_bufmgr.c
index 2df93a58..ab574273 100644
--- a/intel/intel_bufmgr.c
+++ b/intel/intel_bufmgr.c
@@ -36,8 +36,10 @@
#include <errno.h>
#include <drm.h>
#include <i915_drm.h>
+#include <pciaccess.h>
#include "intel_bufmgr.h"
#include "intel_bufmgr_priv.h"
+#include "xf86drm.h"
/** @file intel_bufmgr.c
*
@@ -269,3 +271,51 @@ int drm_intel_get_pipe_from_crtc_id(drm_intel_bufmgr *bufmgr, int crtc_id)
return bufmgr->get_pipe_from_crtc_id(bufmgr, crtc_id);
return -1;
}
+
+static size_t
+drm_intel_probe_agp_aperture_size(int fd)
+{
+ struct pci_device *pci_dev;
+ size_t size = 0;
+ int ret;
+
+ ret = pci_system_init();
+ if (ret)
+ goto err;
+
+ /* XXX handle multiple adaptors? */
+ pci_dev = pci_device_find_by_slot(0, 0, 2, 0);
+ if (pci_dev == NULL)
+ goto err;
+
+ ret = pci_device_probe(pci_dev);
+ if (ret)
+ goto err;
+
+ size = pci_dev->regions[2].size;
+err:
+ pci_system_cleanup ();
+ return size;
+}
+
+int drm_intel_get_aperture_sizes(int fd,
+ size_t *mappable,
+ size_t *total)
+{
+
+ struct drm_i915_gem_get_aperture aperture;
+ int ret;
+
+ ret = drmIoctl(fd, DRM_IOCTL_I915_GEM_GET_APERTURE, &aperture);
+ if (ret)
+ return ret;
+
+ *mappable = 0;
+ /* XXX add a query for the kernel value? */
+ if (*mappable == 0)
+ *mappable = drm_intel_probe_agp_aperture_size(fd);
+ if (*mappable == 0)
+ *mappable = 64 * 1024 * 1024; /* minimum possible value */
+ *total = aperture.aper_size;
+ return 0;
+}
diff --git a/intel/intel_bufmgr.h b/intel/intel_bufmgr.h
index daa18b4c..889ef46c 100644
--- a/intel/intel_bufmgr.h
+++ b/intel/intel_bufmgr.h
@@ -151,6 +151,8 @@ void drm_intel_gem_bo_start_gtt_access(drm_intel_bo *bo, int write_enable);
int drm_intel_get_pipe_from_crtc_id(drm_intel_bufmgr *bufmgr, int crtc_id);
+int drm_intel_get_aperture_sizes(int fd, size_t *mappable, size_t *total);
+
/* drm_intel_bufmgr_fake.c */
drm_intel_bufmgr *drm_intel_bufmgr_fake_init(int fd,
unsigned long low_offset,