/*
* Copyright © 2008-2013 Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*
* Authors:
* Eric Anholt <eric@anholt.net>
* Chris Wilson <chris@chris-wilson.co.uk>
*
*/
/*
*/
#include "drmP.h"
#include "i915_drm.h"
#include "i915_drv.h"
/*
* The BIOS typically reserves some of the system's memory for the exclusive
* use of the integrated graphics. This memory is no longer available for
* use by the OS and so the user finds that his system has less memory
* available than he put in. We refer to this memory as stolen.
*
* The BIOS will allocate its framebuffer from the stolen memory. Our
* goal is try to reuse that object for our own fbcon which must always
* be available for panics. Anything else we can reuse the stolen memory
* for is a boon.
*/
{
/* On the machines I have tested the Graphics Base of Stolen Memory
* is unreliable, so on those compute the base by subtracting the
* stolen memory from the Top of Low Usable DRAM which is where the
* BIOS places the graphics stolen memory.
*
* On gen2, the layout is slightly different with the Graphics Segment
* immediately following Top of Memory (or Top of Usable DRAM). Note
* it appears that TOUD is only reported by 865g, so we just use the
* top of memory as determined by the e820 probe.
*
* XXX gen2 requires an unavailable symbol and 945gm fails with
* its value of TOLUD.
*/
base = 0;
if (IS_VALLEYVIEW(dev)) {
/* Read Base Data of Stolen Memory Register (BDSM) directly.
* Note that there is also a MCHBAR miror at 0x1080c0 or
* we could use device 2:0x5c instead.
*/
/* Read Graphics Base of Stolen Memory directly */
#if 0
/* Stolen is immediately below Top of Low Usable DRAM */
} else {
/* Stolen is immediately above Top of Memory */
#endif
}
return base;
}
{
/* Try to over-allocate to reduce reallocations and fragmentation */
if (!compressed_fb)
if (compressed_fb)
if (!compressed_fb)
goto err;
if (HAS_PCH_SPLIT(dev))
} else {
4096, 4096, 0);
if (compressed_llb)
4096, 4096);
if (!compressed_llb)
goto err_fb;
}
DRM_DEBUG_KMS("reserved %d bytes of contiguous stolen space for FBC\n",
size);
return 0;
err:
return -ENOSPC;
}
{
return -ENODEV;
return 0;
/* Release any current block */
}
{
return;
if (dev_priv->compressed_fb)
if (dev_priv->compressed_llb)
}
{
return;
}
{
int bios_reserved = 0;
return 0;
DRM_DEBUG_KMS("found %zd bytes of stolen memory at %08lx\n",
if (IS_VALLEYVIEW(dev))
/* Basic memrange allocator for stolen space */
return 0;
}
#if 0
static struct sg_table *
{
/* We hide that we have no struct page backing our stolen object
* by wrapping the contiguous physical allocation with a fake
* dma mapping in a single scatterlist.
*/
return NULL;
return NULL;
}
return st;
}
#endif
{
BUG();
return -EINVAL;
}
{
/* Should only be called during free */
}
};
static struct drm_i915_gem_object *
struct drm_mm_node *stolen)
{
#if 0
struct drm_i915_gem_object *obj;
return NULL;
goto cleanup;
goto cleanup;
obj->has_dma_mapping = true;
return obj;
#endif
return NULL;
}
struct drm_i915_gem_object *
{
DRM_DEBUG_KMS("Not support stolen object yet");
return NULL;
#if 0
struct drm_i915_gem_object *obj;
struct drm_mm_node *stolen;
return NULL;
if (size == 0)
return NULL;
if (stolen)
return NULL;
if (obj)
return obj;
return NULL;
#endif
}
struct drm_i915_gem_object *
{
return NULL;
DRM_DEBUG_KMS("creating preallocated stolen object: stolen_offset=%x, gtt_offset=%x, size=%x\n",
/* KISS and expect everything to be page-aligned */
if (size == 0)
return NULL;
false);
DRM_DEBUG_KMS("failed to allocate stolen space\n");
return NULL;
}
DRM_DEBUG_KMS("failed to allocate stolen object\n");
return NULL;
}
/* Some objects just need physical mem from stolen space */
if (gtt_offset == 0xffffffff)
return obj;
/* To simplify the initialisation sequence between KMS and GTT,
* we allow construction of the stolen object prior to
* setting up the GTT space. The actual reservation will occur
* later.
*/
false);
DRM_DEBUG_KMS("failed to allocate stolen GTT space\n");
return NULL;
}
} else
return obj;
}
void
{
}
}