提交 a81406b4 编写于 作者: D Dave Airlie

Merge remote branch 'korg/drm-radeon-next' into drm-linus

* korg/drm-radeon-next:
  drm/radeon/kms: rs600: use correct mask for SW interrupt
  gpu/drm/radeon/radeon_irq.c: move a dereference below a NULL test
  drm/radeon/radeon_device.c: move a dereference below a NULL test
  drm/radeon/radeon_fence.c: move a dereference below the NULL test
  drm/radeon/radeon_connectors.c: add a NULL test before dereference
  drm/radeon/kms: fix memory leak
  drm/radeon/kms: add missing breaks in i2c and ss lookups
  drm/radeon/kms: add primary dac adj values table
  drm/radeon/kms: fallback to default connector table
...@@ -114,6 +114,7 @@ static inline struct radeon_i2c_bus_rec radeon_lookup_i2c_gpio(struct radeon_dev ...@@ -114,6 +114,7 @@ static inline struct radeon_i2c_bus_rec radeon_lookup_i2c_gpio(struct radeon_dev
i2c.i2c_id = gpio->sucI2cId.ucAccess; i2c.i2c_id = gpio->sucI2cId.ucAccess;
i2c.valid = true; i2c.valid = true;
break;
} }
} }
...@@ -1026,6 +1027,7 @@ static struct radeon_atom_ss *radeon_atombios_get_ss_info(struct ...@@ -1026,6 +1027,7 @@ static struct radeon_atom_ss *radeon_atombios_get_ss_info(struct
ss->delay = ss_info->asSS_Info[i].ucSS_Delay; ss->delay = ss_info->asSS_Info[i].ucSS_Delay;
ss->range = ss_info->asSS_Info[i].ucSS_Range; ss->range = ss_info->asSS_Info[i].ucSS_Range;
ss->refdiv = ss_info->asSS_Info[i].ucRecommendedRef_Div; ss->refdiv = ss_info->asSS_Info[i].ucRecommendedRef_Div;
break;
} }
} }
} }
......
...@@ -595,6 +595,34 @@ bool radeon_combios_get_clock_info(struct drm_device *dev) ...@@ -595,6 +595,34 @@ bool radeon_combios_get_clock_info(struct drm_device *dev)
return false; return false;
} }
static const uint32_t default_primarydac_adj[CHIP_LAST] = {
0x00000808, /* r100 */
0x00000808, /* rv100 */
0x00000808, /* rs100 */
0x00000808, /* rv200 */
0x00000808, /* rs200 */
0x00000808, /* r200 */
0x00000808, /* rv250 */
0x00000000, /* rs300 */
0x00000808, /* rv280 */
0x00000808, /* r300 */
0x00000808, /* r350 */
0x00000808, /* rv350 */
0x00000808, /* rv380 */
0x00000808, /* r420 */
0x00000808, /* r423 */
0x00000808, /* rv410 */
0x00000000, /* rs400 */
0x00000000, /* rs480 */
};
static void radeon_legacy_get_primary_dac_info_from_table(struct radeon_device *rdev,
struct radeon_encoder_primary_dac *p_dac)
{
p_dac->ps2_pdac_adj = default_primarydac_adj[rdev->family];
return;
}
struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct
radeon_encoder radeon_encoder
*encoder) *encoder)
...@@ -604,20 +632,20 @@ struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct ...@@ -604,20 +632,20 @@ struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct
uint16_t dac_info; uint16_t dac_info;
uint8_t rev, bg, dac; uint8_t rev, bg, dac;
struct radeon_encoder_primary_dac *p_dac = NULL; struct radeon_encoder_primary_dac *p_dac = NULL;
int found = 0;
if (rdev->bios == NULL) p_dac = kzalloc(sizeof(struct radeon_encoder_primary_dac),
return NULL;
/* check CRT table */
dac_info = combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE);
if (dac_info) {
p_dac =
kzalloc(sizeof(struct radeon_encoder_primary_dac),
GFP_KERNEL); GFP_KERNEL);
if (!p_dac) if (!p_dac)
return NULL; return NULL;
if (rdev->bios == NULL)
goto out;
/* check CRT table */
dac_info = combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE);
if (dac_info) {
rev = RBIOS8(dac_info) & 0x3; rev = RBIOS8(dac_info) & 0x3;
if (rev < 2) { if (rev < 2) {
bg = RBIOS8(dac_info + 0x2) & 0xf; bg = RBIOS8(dac_info + 0x2) & 0xf;
...@@ -628,9 +656,13 @@ struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct ...@@ -628,9 +656,13 @@ struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct
dac = RBIOS8(dac_info + 0x3) & 0xf; dac = RBIOS8(dac_info + 0x3) & 0xf;
p_dac->ps2_pdac_adj = (bg << 8) | (dac); p_dac->ps2_pdac_adj = (bg << 8) | (dac);
} }
found = 1;
} }
out:
if (!found) /* fallback to defaults */
radeon_legacy_get_primary_dac_info_from_table(rdev, p_dac);
return p_dac; return p_dac;
} }
......
...@@ -615,7 +615,7 @@ static enum drm_connector_status radeon_vga_detect(struct drm_connector *connect ...@@ -615,7 +615,7 @@ static enum drm_connector_status radeon_vga_detect(struct drm_connector *connect
ret = connector_status_connected; ret = connector_status_connected;
} }
} else { } else {
if (radeon_connector->dac_load_detect) { if (radeon_connector->dac_load_detect && encoder) {
encoder_funcs = encoder->helper_private; encoder_funcs = encoder->helper_private;
ret = encoder_funcs->detect(encoder, connector); ret = encoder_funcs->detect(encoder, connector);
} }
......
...@@ -2145,6 +2145,7 @@ int radeon_master_create(struct drm_device *dev, struct drm_master *master) ...@@ -2145,6 +2145,7 @@ int radeon_master_create(struct drm_device *dev, struct drm_master *master)
&master_priv->sarea); &master_priv->sarea);
if (ret) { if (ret) {
DRM_ERROR("SAREA setup failed\n"); DRM_ERROR("SAREA setup failed\n");
kfree(master_priv);
return ret; return ret;
} }
master_priv->sarea_priv = master_priv->sarea->handle + sizeof(struct drm_sarea); master_priv->sarea_priv = master_priv->sarea->handle + sizeof(struct drm_sarea);
......
...@@ -733,16 +733,18 @@ void radeon_device_fini(struct radeon_device *rdev) ...@@ -733,16 +733,18 @@ void radeon_device_fini(struct radeon_device *rdev)
*/ */
int radeon_suspend_kms(struct drm_device *dev, pm_message_t state) int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
{ {
struct radeon_device *rdev = dev->dev_private; struct radeon_device *rdev;
struct drm_crtc *crtc; struct drm_crtc *crtc;
int r; int r;
if (dev == NULL || rdev == NULL) { if (dev == NULL || dev->dev_private == NULL) {
return -ENODEV; return -ENODEV;
} }
if (state.event == PM_EVENT_PRETHAW) { if (state.event == PM_EVENT_PRETHAW) {
return 0; return 0;
} }
rdev = dev->dev_private;
/* unpin the front buffers */ /* unpin the front buffers */
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
struct radeon_framebuffer *rfb = to_radeon_framebuffer(crtc->fb); struct radeon_framebuffer *rfb = to_radeon_framebuffer(crtc->fb);
......
...@@ -329,8 +329,11 @@ static bool radeon_setup_enc_conn(struct drm_device *dev) ...@@ -329,8 +329,11 @@ static bool radeon_setup_enc_conn(struct drm_device *dev)
ret = radeon_get_atom_connector_info_from_object_table(dev); ret = radeon_get_atom_connector_info_from_object_table(dev);
else else
ret = radeon_get_atom_connector_info_from_supported_devices_table(dev); ret = radeon_get_atom_connector_info_from_supported_devices_table(dev);
} else } else {
ret = radeon_get_legacy_connector_info_from_bios(dev); ret = radeon_get_legacy_connector_info_from_bios(dev);
if (ret == false)
ret = radeon_get_legacy_connector_info_from_table(dev);
}
} else { } else {
if (!ASIC_IS_AVIVO(rdev)) if (!ASIC_IS_AVIVO(rdev))
ret = radeon_get_legacy_connector_info_from_table(dev); ret = radeon_get_legacy_connector_info_from_table(dev);
......
...@@ -140,16 +140,15 @@ int radeon_fence_create(struct radeon_device *rdev, struct radeon_fence **fence) ...@@ -140,16 +140,15 @@ int radeon_fence_create(struct radeon_device *rdev, struct radeon_fence **fence)
bool radeon_fence_signaled(struct radeon_fence *fence) bool radeon_fence_signaled(struct radeon_fence *fence)
{ {
struct radeon_device *rdev = fence->rdev;
unsigned long irq_flags; unsigned long irq_flags;
bool signaled = false; bool signaled = false;
if (rdev->gpu_lockup) { if (!fence)
return true; return true;
}
if (fence == NULL) { if (fence->rdev->gpu_lockup)
return true; return true;
}
write_lock_irqsave(&fence->rdev->fence_drv.lock, irq_flags); write_lock_irqsave(&fence->rdev->fence_drv.lock, irq_flags);
signaled = fence->signaled; signaled = fence->signaled;
/* if we are shuting down report all fence as signaled */ /* if we are shuting down report all fence as signaled */
......
...@@ -289,16 +289,16 @@ int radeon_irq_emit(struct drm_device *dev, void *data, struct drm_file *file_pr ...@@ -289,16 +289,16 @@ int radeon_irq_emit(struct drm_device *dev, void *data, struct drm_file *file_pr
drm_radeon_irq_emit_t *emit = data; drm_radeon_irq_emit_t *emit = data;
int result; int result;
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
return -EINVAL;
LOCK_TEST_WITH_RETURN(dev, file_priv);
if (!dev_priv) { if (!dev_priv) {
DRM_ERROR("called with no initialization\n"); DRM_ERROR("called with no initialization\n");
return -EINVAL; return -EINVAL;
} }
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
return -EINVAL;
LOCK_TEST_WITH_RETURN(dev, file_priv);
result = radeon_emit_irq(dev); result = radeon_emit_irq(dev);
if (DRM_COPY_TO_USER(emit->irq_seq, &result, sizeof(int))) { if (DRM_COPY_TO_USER(emit->irq_seq, &result, sizeof(int))) {
......
...@@ -396,7 +396,7 @@ int rs600_irq_process(struct radeon_device *rdev) ...@@ -396,7 +396,7 @@ int rs600_irq_process(struct radeon_device *rdev)
} }
while (status || r500_disp_int) { while (status || r500_disp_int) {
/* SW interrupt */ /* SW interrupt */
if (G_000040_SW_INT_EN(status)) if (G_000044_SW_INT(status))
radeon_fence_process(rdev); radeon_fence_process(rdev);
/* Vertical blank interrupts */ /* Vertical blank interrupts */
if (G_007EDC_LB_D1_VBLANK_INTERRUPT(r500_disp_int)) if (G_007EDC_LB_D1_VBLANK_INTERRUPT(r500_disp_int))
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册