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@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2015-10-19 13:07:13 +01:00
parent 3656bcf01e
commit ef859c807a
1 changed files with 45 additions and 21 deletions

View File

@ -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)));