xf86-video-intel: src/sna/kgem.c
Chris Wilson
ickle at kemper.freedesktop.org
Mon Oct 19 05:22:43 PDT 2015
src/sna/kgem.c | 66 ++++++++++++++++++++++++++++++++++++++-------------------
1 file changed, 45 insertions(+), 21 deletions(-)
New commits:
commit ef859c807a4bfad7c8a01a1d63f354f3ef310db5
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Mon Oct 19 13:07:13 2015 +0100
sna: Use the new context param for report GTT size
Since get_aperture_ioctl reports the global GTT size and this may
differ with the per-process GTT size used by execbuffer, query the
per-process GTT size instead.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index bbe2092..156ebc9 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1822,12 +1822,50 @@ no_context_switch(struct kgem *kgem, int new_mode)
(void)new_mode;
}
-void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, unsigned gen)
+static uint64_t get_gtt_size(int fd)
{
struct drm_i915_gem_get_aperture aperture;
+ struct local_i915_gem_context_param {
+ uint32_t context;
+ uint32_t size;
+ uint64_t param;
+#define LOCAL_CONTEXT_PARAM_BAN_PERIOD 0x1
+#define LOCAL_CONTEXT_PARAM_NO_ZEROMAP 0x2
+#define LOCAL_CONTEXT_PARAM_GTT_SIZE 0x3
+ uint64_t value;
+ } p;
+#define LOCAL_I915_GEM_CONTEXT_GETPARAM 0x34
+#define LOCAL_IOCTL_I915_GEM_CONTEXT_GETPARAM DRM_IOWR (DRM_COMMAND_BASE + LOCAL_I915_GEM_CONTEXT_GETPARAM, struct local_i915_gem_context_param)
+
+ memset(&aperture, 0, sizeof(aperture));
+
+ memset(&p, 0, sizeof(p));
+ p.param = LOCAL_CONTEXT_PARAM_GTT_SIZE;
+ if (drmIoctl(fd, LOCAL_IOCTL_I915_GEM_CONTEXT_GETPARAM, &p) == 0)
+ aperture.aper_size = p.value;
+ if (aperture.aper_size == 0)
+ (void)drmIoctl(fd, DRM_IOCTL_I915_GEM_GET_APERTURE, &aperture);
+ if (aperture.aper_size == 0)
+ aperture.aper_size = 64*1024*1024;
+
+ DBG(("%s: aperture size %lld, available now %lld\n",
+ __FUNCTION__,
+ (long long)aperture.aper_size,
+ (long long)aperture.aper_available_size));
+
+ /* clamp aperture to uint32_t for simplicity */
+ if (aperture.aper_size > 0xc0000000)
+ aperture.aper_size = 0xc0000000;
+
+ return aperture.aper_size;
+}
+
+void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, unsigned gen)
+{
size_t totalram;
unsigned half_gpu_max;
unsigned int i, j;
+ uint64_t gtt_size;
DBG(("%s: fd=%d, gen=%d\n", __FUNCTION__, fd, gen));
@@ -1979,23 +2017,10 @@ void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, unsigned gen)
!DBG_NO_CPU && (kgem->has_llc | kgem->has_userptr | kgem->has_caching),
kgem->has_llc, kgem->has_caching, kgem->has_userptr));
- VG_CLEAR(aperture);
- aperture.aper_size = 0;
- (void)do_ioctl(fd, DRM_IOCTL_I915_GEM_GET_APERTURE, &aperture);
- if (aperture.aper_size == 0)
- aperture.aper_size = 64*1024*1024;
-
- DBG(("%s: aperture size %lld, available now %lld\n",
- __FUNCTION__,
- (long long)aperture.aper_size,
- (long long)aperture.aper_available_size));
-
- /* clamp aperture to uint32_t for simplicity */
- if (aperture.aper_size > 0xc0000000)
- aperture.aper_size = 0xc0000000;
- kgem->aperture_total = aperture.aper_size;
- kgem->aperture_high = aperture.aper_size * 3/4;
- kgem->aperture_low = aperture.aper_size * 1/3;
+ gtt_size = get_gtt_size(fd);
+ kgem->aperture_total = gtt_size;
+ kgem->aperture_high = gtt_size * 3/4;
+ kgem->aperture_low = gtt_size * 1/3;
if (gen < 033) {
/* Severe alignment penalties */
kgem->aperture_high /= 2;
@@ -2008,9 +2033,8 @@ void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, unsigned gen)
kgem->aperture_mappable = 256 * 1024 * 1024;
if (dev != NULL)
kgem->aperture_mappable = agp_aperture_size(dev, gen);
- if (kgem->aperture_mappable == 0 ||
- kgem->aperture_mappable > aperture.aper_size)
- kgem->aperture_mappable = aperture.aper_size;
+ if (kgem->aperture_mappable == 0 || kgem->aperture_mappable > gtt_size)
+ kgem->aperture_mappable = gtt_size;
DBG(("%s: aperture mappable=%d [%d MiB]\n", __FUNCTION__,
kgem->aperture_mappable, kgem->aperture_mappable / (1024*1024)));
More information about the xorg-commit
mailing list