提交 f4b23cc2 编写于 作者: L Linus Torvalds

Merge branch 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6

* 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6:
  drm/r600: fix possible NULL pointer derefernce
  drm/radeon/kms: add quirk for ASUS HD 3600 board
  include/linux/vgaarb.h: add missing part of include guard
  drm/nouveau: Fix crashes during fbcon init on single head cards.
  drm/nouveau: fix pcirom vbios shadow breakage from acpi rom patch
  drm/radeon/kms: fix shared ddc harder
  drm/i915: enable low power render writes on GEN3 hardware.
  drm/i915: Define MI_ARB_STATE bits
  vmwgfx: return -EFAULT if copy_to_user fails
  fb: handle allocation failure in alloc_apertures()
  drm: radeon: check kzalloc() result
  drm/ttm: Fix build on architectures without AGP
  drm/radeon/kms: fix gtt MC base alignment on rs4xx/rs690/rs740 asics
  drm/radeon/kms: fix possible mis-detection of sideport on rs690/rs740
  drm/radeon/kms: fix legacy tv-out pal mode
...@@ -4742,6 +4742,16 @@ i915_gem_load(struct drm_device *dev) ...@@ -4742,6 +4742,16 @@ i915_gem_load(struct drm_device *dev)
list_add(&dev_priv->mm.shrink_list, &shrink_list); list_add(&dev_priv->mm.shrink_list, &shrink_list);
spin_unlock(&shrink_list_lock); spin_unlock(&shrink_list_lock);
/* On GEN3 we really need to make sure the ARB C3 LP bit is set */
if (IS_GEN3(dev)) {
u32 tmp = I915_READ(MI_ARB_STATE);
if (!(tmp & MI_ARB_C3_LP_WRITE_ENABLE)) {
/* arb state is a masked write, so set bit + bit in mask */
tmp = MI_ARB_C3_LP_WRITE_ENABLE | (MI_ARB_C3_LP_WRITE_ENABLE << MI_ARB_MASK_SHIFT);
I915_WRITE(MI_ARB_STATE, tmp);
}
}
/* Old X drivers will take 0-2 for front, back, depth buffers */ /* Old X drivers will take 0-2 for front, back, depth buffers */
if (!drm_core_check_feature(dev, DRIVER_MODESET)) if (!drm_core_check_feature(dev, DRIVER_MODESET))
dev_priv->fence_reg_start = 3; dev_priv->fence_reg_start = 3;
......
...@@ -359,6 +359,70 @@ ...@@ -359,6 +359,70 @@
#define LM_BURST_LENGTH 0x00000700 #define LM_BURST_LENGTH 0x00000700
#define LM_FIFO_WATERMARK 0x0000001F #define LM_FIFO_WATERMARK 0x0000001F
#define MI_ARB_STATE 0x020e4 /* 915+ only */ #define MI_ARB_STATE 0x020e4 /* 915+ only */
#define MI_ARB_MASK_SHIFT 16 /* shift for enable bits */
/* Make render/texture TLB fetches lower priorty than associated data
* fetches. This is not turned on by default
*/
#define MI_ARB_RENDER_TLB_LOW_PRIORITY (1 << 15)
/* Isoch request wait on GTT enable (Display A/B/C streams).
* Make isoch requests stall on the TLB update. May cause
* display underruns (test mode only)
*/
#define MI_ARB_ISOCH_WAIT_GTT (1 << 14)
/* Block grant count for isoch requests when block count is
* set to a finite value.
*/
#define MI_ARB_BLOCK_GRANT_MASK (3 << 12)
#define MI_ARB_BLOCK_GRANT_8 (0 << 12) /* for 3 display planes */
#define MI_ARB_BLOCK_GRANT_4 (1 << 12) /* for 2 display planes */
#define MI_ARB_BLOCK_GRANT_2 (2 << 12) /* for 1 display plane */
#define MI_ARB_BLOCK_GRANT_0 (3 << 12) /* don't use */
/* Enable render writes to complete in C2/C3/C4 power states.
* If this isn't enabled, render writes are prevented in low
* power states. That seems bad to me.
*/
#define MI_ARB_C3_LP_WRITE_ENABLE (1 << 11)
/* This acknowledges an async flip immediately instead
* of waiting for 2TLB fetches.
*/
#define MI_ARB_ASYNC_FLIP_ACK_IMMEDIATE (1 << 10)
/* Enables non-sequential data reads through arbiter
*/
#define MI_ARB_DUAL_DATA_PHASE_DISABLE (1 << 9)
/* Disable FSB snooping of cacheable write cycles from binner/render
* command stream
*/
#define MI_ARB_CACHE_SNOOP_DISABLE (1 << 8)
/* Arbiter time slice for non-isoch streams */
#define MI_ARB_TIME_SLICE_MASK (7 << 5)
#define MI_ARB_TIME_SLICE_1 (0 << 5)
#define MI_ARB_TIME_SLICE_2 (1 << 5)
#define MI_ARB_TIME_SLICE_4 (2 << 5)
#define MI_ARB_TIME_SLICE_6 (3 << 5)
#define MI_ARB_TIME_SLICE_8 (4 << 5)
#define MI_ARB_TIME_SLICE_10 (5 << 5)
#define MI_ARB_TIME_SLICE_14 (6 << 5)
#define MI_ARB_TIME_SLICE_16 (7 << 5)
/* Low priority grace period page size */
#define MI_ARB_LOW_PRIORITY_GRACE_4KB (0 << 4) /* default */
#define MI_ARB_LOW_PRIORITY_GRACE_8KB (1 << 4)
/* Disable display A/B trickle feed */
#define MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE (1 << 2)
/* Set display plane priority */
#define MI_ARB_DISPLAY_PRIORITY_A_B (0 << 0) /* display A > display B */
#define MI_ARB_DISPLAY_PRIORITY_B_A (1 << 0) /* display B > display A */
#define CACHE_MODE_0 0x02120 /* 915+ only */ #define CACHE_MODE_0 0x02120 /* 915+ only */
#define CM0_MASK_SHIFT 16 #define CM0_MASK_SHIFT 16
#define CM0_IZ_OPT_DISABLE (1<<6) #define CM0_IZ_OPT_DISABLE (1<<6)
......
...@@ -203,36 +203,26 @@ struct methods { ...@@ -203,36 +203,26 @@ struct methods {
const bool rw; const bool rw;
}; };
static struct methods nv04_methods[] = { static struct methods shadow_methods[] = {
{ "PROM", load_vbios_prom, false },
{ "PRAMIN", load_vbios_pramin, true },
{ "PCIROM", load_vbios_pci, true },
};
static struct methods nv50_methods[] = {
{ "ACPI", load_vbios_acpi, true },
{ "PRAMIN", load_vbios_pramin, true }, { "PRAMIN", load_vbios_pramin, true },
{ "PROM", load_vbios_prom, false }, { "PROM", load_vbios_prom, false },
{ "PCIROM", load_vbios_pci, true }, { "PCIROM", load_vbios_pci, true },
{ "ACPI", load_vbios_acpi, true },
}; };
#define METHODCNT 3
static bool NVShadowVBIOS(struct drm_device *dev, uint8_t *data) static bool NVShadowVBIOS(struct drm_device *dev, uint8_t *data)
{ {
struct drm_nouveau_private *dev_priv = dev->dev_private; const int nr_methods = ARRAY_SIZE(shadow_methods);
struct methods *methods; struct methods *methods = shadow_methods;
int i;
int testscore = 3; int testscore = 3;
int scores[METHODCNT]; int scores[nr_methods], i;
if (nouveau_vbios) { if (nouveau_vbios) {
methods = nv04_methods; for (i = 0; i < nr_methods; i++)
for (i = 0; i < METHODCNT; i++)
if (!strcasecmp(nouveau_vbios, methods[i].desc)) if (!strcasecmp(nouveau_vbios, methods[i].desc))
break; break;
if (i < METHODCNT) { if (i < nr_methods) {
NV_INFO(dev, "Attempting to use BIOS image from %s\n", NV_INFO(dev, "Attempting to use BIOS image from %s\n",
methods[i].desc); methods[i].desc);
...@@ -244,12 +234,7 @@ static bool NVShadowVBIOS(struct drm_device *dev, uint8_t *data) ...@@ -244,12 +234,7 @@ static bool NVShadowVBIOS(struct drm_device *dev, uint8_t *data)
NV_ERROR(dev, "VBIOS source \'%s\' invalid\n", nouveau_vbios); NV_ERROR(dev, "VBIOS source \'%s\' invalid\n", nouveau_vbios);
} }
if (dev_priv->card_type < NV_50) for (i = 0; i < nr_methods; i++) {
methods = nv04_methods;
else
methods = nv50_methods;
for (i = 0; i < METHODCNT; i++) {
NV_TRACE(dev, "Attempting to load BIOS image from %s\n", NV_TRACE(dev, "Attempting to load BIOS image from %s\n",
methods[i].desc); methods[i].desc);
data[0] = data[1] = 0; /* avoid reuse of previous image */ data[0] = data[1] = 0; /* avoid reuse of previous image */
...@@ -260,7 +245,7 @@ static bool NVShadowVBIOS(struct drm_device *dev, uint8_t *data) ...@@ -260,7 +245,7 @@ static bool NVShadowVBIOS(struct drm_device *dev, uint8_t *data)
} }
while (--testscore > 0) { while (--testscore > 0) {
for (i = 0; i < METHODCNT; i++) { for (i = 0; i < nr_methods; i++) {
if (scores[i] == testscore) { if (scores[i] == testscore) {
NV_TRACE(dev, "Using BIOS image from %s\n", NV_TRACE(dev, "Using BIOS image from %s\n",
methods[i].desc); methods[i].desc);
......
...@@ -387,7 +387,8 @@ int nouveau_fbcon_init(struct drm_device *dev) ...@@ -387,7 +387,8 @@ int nouveau_fbcon_init(struct drm_device *dev)
dev_priv->nfbdev = nfbdev; dev_priv->nfbdev = nfbdev;
nfbdev->helper.funcs = &nouveau_fbcon_helper_funcs; nfbdev->helper.funcs = &nouveau_fbcon_helper_funcs;
ret = drm_fb_helper_init(dev, &nfbdev->helper, 2, 4); ret = drm_fb_helper_init(dev, &nfbdev->helper,
nv_two_heads(dev) ? 2 : 1, 4);
if (ret) { if (ret) {
kfree(nfbdev); kfree(nfbdev);
return ret; return ret;
......
...@@ -2354,6 +2354,7 @@ void r100_mc_init(struct radeon_device *rdev) ...@@ -2354,6 +2354,7 @@ void r100_mc_init(struct radeon_device *rdev)
if (rdev->flags & RADEON_IS_IGP) if (rdev->flags & RADEON_IS_IGP)
base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16; base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16;
radeon_vram_location(rdev, &rdev->mc, base); radeon_vram_location(rdev, &rdev->mc, base);
rdev->mc.gtt_base_align = 0;
if (!(rdev->flags & RADEON_IS_AGP)) if (!(rdev->flags & RADEON_IS_AGP))
radeon_gtt_location(rdev, &rdev->mc); radeon_gtt_location(rdev, &rdev->mc);
radeon_update_bandwidth_info(rdev); radeon_update_bandwidth_info(rdev);
......
...@@ -481,6 +481,7 @@ void r300_mc_init(struct radeon_device *rdev) ...@@ -481,6 +481,7 @@ void r300_mc_init(struct radeon_device *rdev)
if (rdev->flags & RADEON_IS_IGP) if (rdev->flags & RADEON_IS_IGP)
base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16; base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16;
radeon_vram_location(rdev, &rdev->mc, base); radeon_vram_location(rdev, &rdev->mc, base);
rdev->mc.gtt_base_align = 0;
if (!(rdev->flags & RADEON_IS_AGP)) if (!(rdev->flags & RADEON_IS_AGP))
radeon_gtt_location(rdev, &rdev->mc); radeon_gtt_location(rdev, &rdev->mc);
radeon_update_bandwidth_info(rdev); radeon_update_bandwidth_info(rdev);
...@@ -1176,6 +1177,8 @@ int r300_cs_parse(struct radeon_cs_parser *p) ...@@ -1176,6 +1177,8 @@ int r300_cs_parse(struct radeon_cs_parser *p)
int r; int r;
track = kzalloc(sizeof(*track), GFP_KERNEL); track = kzalloc(sizeof(*track), GFP_KERNEL);
if (track == NULL)
return -ENOMEM;
r100_cs_track_clear(p->rdev, track); r100_cs_track_clear(p->rdev, track);
p->track = track; p->track = track;
do { do {
......
...@@ -125,6 +125,7 @@ void r520_mc_init(struct radeon_device *rdev) ...@@ -125,6 +125,7 @@ void r520_mc_init(struct radeon_device *rdev)
r520_vram_get_type(rdev); r520_vram_get_type(rdev);
r100_vram_init_sizes(rdev); r100_vram_init_sizes(rdev);
radeon_vram_location(rdev, &rdev->mc, 0); radeon_vram_location(rdev, &rdev->mc, 0);
rdev->mc.gtt_base_align = 0;
if (!(rdev->flags & RADEON_IS_AGP)) if (!(rdev->flags & RADEON_IS_AGP))
radeon_gtt_location(rdev, &rdev->mc); radeon_gtt_location(rdev, &rdev->mc);
radeon_update_bandwidth_info(rdev); radeon_update_bandwidth_info(rdev);
......
...@@ -1179,6 +1179,7 @@ void r600_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc) ...@@ -1179,6 +1179,7 @@ void r600_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
if (rdev->flags & RADEON_IS_IGP) if (rdev->flags & RADEON_IS_IGP)
base = (RREG32(MC_VM_FB_LOCATION) & 0xFFFF) << 24; base = (RREG32(MC_VM_FB_LOCATION) & 0xFFFF) << 24;
radeon_vram_location(rdev, &rdev->mc, base); radeon_vram_location(rdev, &rdev->mc, base);
rdev->mc.gtt_base_align = 0;
radeon_gtt_location(rdev, mc); radeon_gtt_location(rdev, mc);
} }
} }
......
...@@ -538,9 +538,12 @@ int ...@@ -538,9 +538,12 @@ int
r600_prepare_blit_copy(struct drm_device *dev, struct drm_file *file_priv) r600_prepare_blit_copy(struct drm_device *dev, struct drm_file *file_priv)
{ {
drm_radeon_private_t *dev_priv = dev->dev_private; drm_radeon_private_t *dev_priv = dev->dev_private;
int ret;
DRM_DEBUG("\n"); DRM_DEBUG("\n");
r600_nomm_get_vb(dev); ret = r600_nomm_get_vb(dev);
if (ret)
return ret;
dev_priv->blit_vb->file_priv = file_priv; dev_priv->blit_vb->file_priv = file_priv;
......
...@@ -351,6 +351,7 @@ struct radeon_mc { ...@@ -351,6 +351,7 @@ struct radeon_mc {
int vram_mtrr; int vram_mtrr;
bool vram_is_ddr; bool vram_is_ddr;
bool igp_sideport_enabled; bool igp_sideport_enabled;
u64 gtt_base_align;
}; };
bool radeon_combios_sideport_present(struct radeon_device *rdev); bool radeon_combios_sideport_present(struct radeon_device *rdev);
......
...@@ -280,6 +280,15 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev, ...@@ -280,6 +280,15 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev,
} }
} }
/* ASUS HD 3600 board lists the DVI port as HDMI */
if ((dev->pdev->device == 0x9598) &&
(dev->pdev->subsystem_vendor == 0x1043) &&
(dev->pdev->subsystem_device == 0x01e4)) {
if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) {
*connector_type = DRM_MODE_CONNECTOR_DVII;
}
}
/* ASUS HD 3450 board lists the DVI port as HDMI */ /* ASUS HD 3450 board lists the DVI port as HDMI */
if ((dev->pdev->device == 0x95C5) && if ((dev->pdev->device == 0x95C5) &&
(dev->pdev->subsystem_vendor == 0x1043) && (dev->pdev->subsystem_vendor == 0x1043) &&
...@@ -1029,8 +1038,15 @@ bool radeon_atombios_sideport_present(struct radeon_device *rdev) ...@@ -1029,8 +1038,15 @@ bool radeon_atombios_sideport_present(struct radeon_device *rdev)
data_offset); data_offset);
switch (crev) { switch (crev) {
case 1: case 1:
if (igp_info->info.ucMemoryType & 0xf0) /* AMD IGPS */
return true; if ((rdev->family == CHIP_RS690) ||
(rdev->family == CHIP_RS740)) {
if (igp_info->info.ulBootUpMemoryClock)
return true;
} else {
if (igp_info->info.ucMemoryType & 0xf0)
return true;
}
break; break;
case 2: case 2:
if (igp_info->info_2.ucMemoryType & 0x0f) if (igp_info->info_2.ucMemoryType & 0x0f)
......
...@@ -771,14 +771,14 @@ static enum drm_connector_status radeon_dvi_detect(struct drm_connector *connect ...@@ -771,14 +771,14 @@ static enum drm_connector_status radeon_dvi_detect(struct drm_connector *connect
} else } else
ret = connector_status_connected; ret = connector_status_connected;
/* multiple connectors on the same encoder with the same ddc line /* This gets complicated. We have boards with VGA + HDMI with a
* This tends to be HDMI and DVI on the same encoder with the * shared DDC line and we have boards with DVI-D + HDMI with a shared
* same ddc line. If the edid says HDMI, consider the HDMI port * DDC line. The latter is more complex because with DVI<->HDMI adapters
* connected and the DVI port disconnected. If the edid doesn't * you don't really know what's connected to which port as both are digital.
* say HDMI, vice versa.
*/ */
if (radeon_connector->shared_ddc && (ret == connector_status_connected)) { if (radeon_connector->shared_ddc && (ret == connector_status_connected)) {
struct drm_device *dev = connector->dev; struct drm_device *dev = connector->dev;
struct radeon_device *rdev = dev->dev_private;
struct drm_connector *list_connector; struct drm_connector *list_connector;
struct radeon_connector *list_radeon_connector; struct radeon_connector *list_radeon_connector;
list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) { list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) {
...@@ -788,15 +788,10 @@ static enum drm_connector_status radeon_dvi_detect(struct drm_connector *connect ...@@ -788,15 +788,10 @@ static enum drm_connector_status radeon_dvi_detect(struct drm_connector *connect
if (list_radeon_connector->shared_ddc && if (list_radeon_connector->shared_ddc &&
(list_radeon_connector->ddc_bus->rec.i2c_id == (list_radeon_connector->ddc_bus->rec.i2c_id ==
radeon_connector->ddc_bus->rec.i2c_id)) { radeon_connector->ddc_bus->rec.i2c_id)) {
if (drm_detect_hdmi_monitor(radeon_connector->edid)) { /* cases where both connectors are digital */
if (connector->connector_type == DRM_MODE_CONNECTOR_DVID) { if (list_connector->connector_type != DRM_MODE_CONNECTOR_VGA) {
kfree(radeon_connector->edid); /* hpd is our only option in this case */
radeon_connector->edid = NULL; if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {
ret = connector_status_disconnected;
}
} else {
if ((connector->connector_type == DRM_MODE_CONNECTOR_HDMIA) ||
(connector->connector_type == DRM_MODE_CONNECTOR_HDMIB)) {
kfree(radeon_connector->edid); kfree(radeon_connector->edid);
radeon_connector->edid = NULL; radeon_connector->edid = NULL;
ret = connector_status_disconnected; ret = connector_status_disconnected;
......
...@@ -226,20 +226,20 @@ void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc) ...@@ -226,20 +226,20 @@ void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
{ {
u64 size_af, size_bf; u64 size_af, size_bf;
size_af = 0xFFFFFFFF - mc->vram_end; size_af = ((0xFFFFFFFF - mc->vram_end) + mc->gtt_base_align) & ~mc->gtt_base_align;
size_bf = mc->vram_start; size_bf = mc->vram_start & ~mc->gtt_base_align;
if (size_bf > size_af) { if (size_bf > size_af) {
if (mc->gtt_size > size_bf) { if (mc->gtt_size > size_bf) {
dev_warn(rdev->dev, "limiting GTT\n"); dev_warn(rdev->dev, "limiting GTT\n");
mc->gtt_size = size_bf; mc->gtt_size = size_bf;
} }
mc->gtt_start = mc->vram_start - mc->gtt_size; mc->gtt_start = (mc->vram_start & ~mc->gtt_base_align) - mc->gtt_size;
} else { } else {
if (mc->gtt_size > size_af) { if (mc->gtt_size > size_af) {
dev_warn(rdev->dev, "limiting GTT\n"); dev_warn(rdev->dev, "limiting GTT\n");
mc->gtt_size = size_af; mc->gtt_size = size_af;
} }
mc->gtt_start = mc->vram_end + 1; mc->gtt_start = (mc->vram_end + 1 + mc->gtt_base_align) & ~mc->gtt_base_align;
} }
mc->gtt_end = mc->gtt_start + mc->gtt_size - 1; mc->gtt_end = mc->gtt_start + mc->gtt_size - 1;
dev_info(rdev->dev, "GTT: %lluM 0x%08llX - 0x%08llX\n", dev_info(rdev->dev, "GTT: %lluM 0x%08llX - 0x%08llX\n",
......
...@@ -642,8 +642,8 @@ void radeon_legacy_tv_mode_set(struct drm_encoder *encoder, ...@@ -642,8 +642,8 @@ void radeon_legacy_tv_mode_set(struct drm_encoder *encoder,
} }
flicker_removal = (tmp + 500) / 1000; flicker_removal = (tmp + 500) / 1000;
if (flicker_removal < 2) if (flicker_removal < 3)
flicker_removal = 2; flicker_removal = 3;
for (i = 0; i < ARRAY_SIZE(SLOPE_limit); ++i) { for (i = 0; i < ARRAY_SIZE(SLOPE_limit); ++i) {
if (flicker_removal == SLOPE_limit[i]) if (flicker_removal == SLOPE_limit[i])
break; break;
......
...@@ -57,7 +57,9 @@ void rs400_gart_adjust_size(struct radeon_device *rdev) ...@@ -57,7 +57,9 @@ void rs400_gart_adjust_size(struct radeon_device *rdev)
} }
if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480) { if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480) {
/* FIXME: RS400 & RS480 seems to have issue with GART size /* FIXME: RS400 & RS480 seems to have issue with GART size
* if 4G of system memory (needs more testing) */ * if 4G of system memory (needs more testing)
*/
/* XXX is this still an issue with proper alignment? */
rdev->mc.gtt_size = 32 * 1024 * 1024; rdev->mc.gtt_size = 32 * 1024 * 1024;
DRM_ERROR("Forcing to 32M GART size (because of ASIC bug ?)\n"); DRM_ERROR("Forcing to 32M GART size (because of ASIC bug ?)\n");
} }
...@@ -263,6 +265,7 @@ void rs400_mc_init(struct radeon_device *rdev) ...@@ -263,6 +265,7 @@ void rs400_mc_init(struct radeon_device *rdev)
r100_vram_init_sizes(rdev); r100_vram_init_sizes(rdev);
base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16; base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16;
radeon_vram_location(rdev, &rdev->mc, base); radeon_vram_location(rdev, &rdev->mc, base);
rdev->mc.gtt_base_align = rdev->mc.gtt_size - 1;
radeon_gtt_location(rdev, &rdev->mc); radeon_gtt_location(rdev, &rdev->mc);
radeon_update_bandwidth_info(rdev); radeon_update_bandwidth_info(rdev);
} }
......
...@@ -698,6 +698,7 @@ void rs600_mc_init(struct radeon_device *rdev) ...@@ -698,6 +698,7 @@ void rs600_mc_init(struct radeon_device *rdev)
base = G_000004_MC_FB_START(base) << 16; base = G_000004_MC_FB_START(base) << 16;
rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
radeon_vram_location(rdev, &rdev->mc, base); radeon_vram_location(rdev, &rdev->mc, base);
rdev->mc.gtt_base_align = 0;
radeon_gtt_location(rdev, &rdev->mc); radeon_gtt_location(rdev, &rdev->mc);
radeon_update_bandwidth_info(rdev); radeon_update_bandwidth_info(rdev);
} }
......
...@@ -162,6 +162,7 @@ void rs690_mc_init(struct radeon_device *rdev) ...@@ -162,6 +162,7 @@ void rs690_mc_init(struct radeon_device *rdev)
rs690_pm_info(rdev); rs690_pm_info(rdev);
rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
radeon_vram_location(rdev, &rdev->mc, base); radeon_vram_location(rdev, &rdev->mc, base);
rdev->mc.gtt_base_align = rdev->mc.gtt_size - 1;
radeon_gtt_location(rdev, &rdev->mc); radeon_gtt_location(rdev, &rdev->mc);
radeon_update_bandwidth_info(rdev); radeon_update_bandwidth_info(rdev);
} }
......
...@@ -195,6 +195,7 @@ void rv515_mc_init(struct radeon_device *rdev) ...@@ -195,6 +195,7 @@ void rv515_mc_init(struct radeon_device *rdev)
rv515_vram_get_type(rdev); rv515_vram_get_type(rdev);
r100_vram_init_sizes(rdev); r100_vram_init_sizes(rdev);
radeon_vram_location(rdev, &rdev->mc, 0); radeon_vram_location(rdev, &rdev->mc, 0);
rdev->mc.gtt_base_align = 0;
if (!(rdev->flags & RADEON_IS_AGP)) if (!(rdev->flags & RADEON_IS_AGP))
radeon_gtt_location(rdev, &rdev->mc); radeon_gtt_location(rdev, &rdev->mc);
radeon_update_bandwidth_info(rdev); radeon_update_bandwidth_info(rdev);
......
...@@ -40,7 +40,9 @@ ...@@ -40,7 +40,9 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <asm/atomic.h> #include <asm/atomic.h>
#ifdef TTM_HAS_AGP
#include <asm/agp.h> #include <asm/agp.h>
#endif
#include "ttm/ttm_bo_driver.h" #include "ttm/ttm_bo_driver.h"
#include "ttm/ttm_page_alloc.h" #include "ttm/ttm_page_alloc.h"
......
...@@ -972,6 +972,7 @@ int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data, ...@@ -972,6 +972,7 @@ int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data,
ret = copy_from_user(rects, user_rects, rects_size); ret = copy_from_user(rects, user_rects, rects_size);
if (unlikely(ret != 0)) { if (unlikely(ret != 0)) {
DRM_ERROR("Failed to get rects.\n"); DRM_ERROR("Failed to get rects.\n");
ret = -EFAULT;
goto out_free; goto out_free;
} }
......
...@@ -873,6 +873,8 @@ struct fb_info { ...@@ -873,6 +873,8 @@ struct fb_info {
static inline struct apertures_struct *alloc_apertures(unsigned int max_num) { static inline struct apertures_struct *alloc_apertures(unsigned int max_num) {
struct apertures_struct *a = kzalloc(sizeof(struct apertures_struct) struct apertures_struct *a = kzalloc(sizeof(struct apertures_struct)
+ max_num * sizeof(struct aperture), GFP_KERNEL); + max_num * sizeof(struct aperture), GFP_KERNEL);
if (!a)
return NULL;
a->count = max_num; a->count = max_num;
return a; return a;
} }
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
*/ */
#ifndef LINUX_VGA_H #ifndef LINUX_VGA_H
#define LINUX_VGA_H
#include <asm/vga.h> #include <asm/vga.h>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册