|
@@ -30,9 +30,6 @@
|
|
|
#include <drm/i915_drm.h>
|
|
|
#include "i915_drv.h"
|
|
|
|
|
|
-#define KB(x) ((x) * 1024)
|
|
|
-#define MB(x) (KB(x) * 1024)
|
|
|
-
|
|
|
/*
|
|
|
* 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
|
|
@@ -81,113 +78,11 @@ void i915_gem_stolen_remove_node(struct drm_i915_private *dev_priv,
|
|
|
|
|
|
static dma_addr_t i915_stolen_to_dma(struct drm_i915_private *dev_priv)
|
|
|
{
|
|
|
- struct pci_dev *pdev = dev_priv->drm.pdev;
|
|
|
struct i915_ggtt *ggtt = &dev_priv->ggtt;
|
|
|
+ dma_addr_t base = intel_graphics_stolen_res.start;
|
|
|
struct resource *r;
|
|
|
- dma_addr_t base;
|
|
|
-
|
|
|
- /* Almost universally we can find the Graphics Base of Stolen Memory
|
|
|
- * at register BSM (0x5c) in the igfx configuration space. On a few
|
|
|
- * (desktop) machines this is also mirrored in the bridge device at
|
|
|
- * different locations, or in the MCHBAR.
|
|
|
- *
|
|
|
- * On 865 we just check the TOUD register.
|
|
|
- *
|
|
|
- * On 830/845/85x the stolen memory base isn't available in any
|
|
|
- * register. We need to calculate it as TOM-TSEG_SIZE-stolen_size.
|
|
|
- *
|
|
|
- */
|
|
|
- base = 0;
|
|
|
- if (INTEL_GEN(dev_priv) >= 3) {
|
|
|
- u32 bsm;
|
|
|
-
|
|
|
- pci_read_config_dword(pdev, INTEL_BSM, &bsm);
|
|
|
-
|
|
|
- base = bsm & INTEL_BSM_MASK;
|
|
|
- } else if (IS_I865G(dev_priv)) {
|
|
|
- u32 tseg_size = 0;
|
|
|
- u16 toud = 0;
|
|
|
- u8 tmp;
|
|
|
-
|
|
|
- pci_bus_read_config_byte(pdev->bus, PCI_DEVFN(0, 0),
|
|
|
- I845_ESMRAMC, &tmp);
|
|
|
-
|
|
|
- if (tmp & TSEG_ENABLE) {
|
|
|
- switch (tmp & I845_TSEG_SIZE_MASK) {
|
|
|
- case I845_TSEG_SIZE_512K:
|
|
|
- tseg_size = KB(512);
|
|
|
- break;
|
|
|
- case I845_TSEG_SIZE_1M:
|
|
|
- tseg_size = MB(1);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- pci_bus_read_config_word(pdev->bus, PCI_DEVFN(0, 0),
|
|
|
- I865_TOUD, &toud);
|
|
|
-
|
|
|
- base = (toud << 16) + tseg_size;
|
|
|
- } else if (IS_I85X(dev_priv)) {
|
|
|
- u32 tseg_size = 0;
|
|
|
- u32 tom;
|
|
|
- u8 tmp;
|
|
|
-
|
|
|
- pci_bus_read_config_byte(pdev->bus, PCI_DEVFN(0, 0),
|
|
|
- I85X_ESMRAMC, &tmp);
|
|
|
-
|
|
|
- if (tmp & TSEG_ENABLE)
|
|
|
- tseg_size = MB(1);
|
|
|
-
|
|
|
- pci_bus_read_config_byte(pdev->bus, PCI_DEVFN(0, 1),
|
|
|
- I85X_DRB3, &tmp);
|
|
|
- tom = tmp * MB(32);
|
|
|
-
|
|
|
- base = tom - tseg_size - ggtt->stolen_size;
|
|
|
- } else if (IS_I845G(dev_priv)) {
|
|
|
- u32 tseg_size = 0;
|
|
|
- u32 tom;
|
|
|
- u8 tmp;
|
|
|
-
|
|
|
- pci_bus_read_config_byte(pdev->bus, PCI_DEVFN(0, 0),
|
|
|
- I845_ESMRAMC, &tmp);
|
|
|
-
|
|
|
- if (tmp & TSEG_ENABLE) {
|
|
|
- switch (tmp & I845_TSEG_SIZE_MASK) {
|
|
|
- case I845_TSEG_SIZE_512K:
|
|
|
- tseg_size = KB(512);
|
|
|
- break;
|
|
|
- case I845_TSEG_SIZE_1M:
|
|
|
- tseg_size = MB(1);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- pci_bus_read_config_byte(pdev->bus, PCI_DEVFN(0, 0),
|
|
|
- I830_DRB3, &tmp);
|
|
|
- tom = tmp * MB(32);
|
|
|
|
|
|
- base = tom - tseg_size - ggtt->stolen_size;
|
|
|
- } else if (IS_I830(dev_priv)) {
|
|
|
- u32 tseg_size = 0;
|
|
|
- u32 tom;
|
|
|
- u8 tmp;
|
|
|
-
|
|
|
- pci_bus_read_config_byte(pdev->bus, PCI_DEVFN(0, 0),
|
|
|
- I830_ESMRAMC, &tmp);
|
|
|
-
|
|
|
- if (tmp & TSEG_ENABLE) {
|
|
|
- if (tmp & I830_TSEG_SIZE_1M)
|
|
|
- tseg_size = MB(1);
|
|
|
- else
|
|
|
- tseg_size = KB(512);
|
|
|
- }
|
|
|
-
|
|
|
- pci_bus_read_config_byte(pdev->bus, PCI_DEVFN(0, 0),
|
|
|
- I830_DRB3, &tmp);
|
|
|
- tom = tmp * MB(32);
|
|
|
-
|
|
|
- base = tom - tseg_size - ggtt->stolen_size;
|
|
|
- }
|
|
|
+ GEM_BUG_ON(overflows_type(intel_graphics_stolen_res.start, base));
|
|
|
|
|
|
if (base == 0 || add_overflows(base, ggtt->stolen_size))
|
|
|
return 0;
|