Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
* 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: drm/radeon/kms/atom: fix handling of FB scratch indices drm/radeon/kms/DCE4.1: fix Select_CrtcSource EncodeMode setting for DP bridges (v2) drm/radeon/kms/DCE4.1: ss is not supported on the internal pplls drm/radeon/kms/DCE4.1: fix dig encoder to transmitter mapping ttm: Fix error-path using an uninitialized value
This commit is contained in:
commit
f91f6cfd4f
@ -277,7 +277,12 @@ static uint32_t atom_get_src_int(atom_exec_context *ctx, uint8_t attr,
|
|||||||
case ATOM_ARG_FB:
|
case ATOM_ARG_FB:
|
||||||
idx = U8(*ptr);
|
idx = U8(*ptr);
|
||||||
(*ptr)++;
|
(*ptr)++;
|
||||||
val = gctx->scratch[((gctx->fb_base + idx) / 4)];
|
if ((gctx->fb_base + (idx * 4)) > gctx->scratch_size_bytes) {
|
||||||
|
DRM_ERROR("ATOM: fb read beyond scratch region: %d vs. %d\n",
|
||||||
|
gctx->fb_base + (idx * 4), gctx->scratch_size_bytes);
|
||||||
|
val = 0;
|
||||||
|
} else
|
||||||
|
val = gctx->scratch[(gctx->fb_base / 4) + idx];
|
||||||
if (print)
|
if (print)
|
||||||
DEBUG("FB[0x%02X]", idx);
|
DEBUG("FB[0x%02X]", idx);
|
||||||
break;
|
break;
|
||||||
@ -531,7 +536,11 @@ static void atom_put_dst(atom_exec_context *ctx, int arg, uint8_t attr,
|
|||||||
case ATOM_ARG_FB:
|
case ATOM_ARG_FB:
|
||||||
idx = U8(*ptr);
|
idx = U8(*ptr);
|
||||||
(*ptr)++;
|
(*ptr)++;
|
||||||
gctx->scratch[((gctx->fb_base + idx) / 4)] = val;
|
if ((gctx->fb_base + (idx * 4)) > gctx->scratch_size_bytes) {
|
||||||
|
DRM_ERROR("ATOM: fb write beyond scratch region: %d vs. %d\n",
|
||||||
|
gctx->fb_base + (idx * 4), gctx->scratch_size_bytes);
|
||||||
|
} else
|
||||||
|
gctx->scratch[(gctx->fb_base / 4) + idx] = val;
|
||||||
DEBUG("FB[0x%02X]", idx);
|
DEBUG("FB[0x%02X]", idx);
|
||||||
break;
|
break;
|
||||||
case ATOM_ARG_PLL:
|
case ATOM_ARG_PLL:
|
||||||
@ -1370,11 +1379,13 @@ int atom_allocate_fb_scratch(struct atom_context *ctx)
|
|||||||
|
|
||||||
usage_bytes = firmware_usage->asFirmwareVramReserveInfo[0].usFirmwareUseInKb * 1024;
|
usage_bytes = firmware_usage->asFirmwareVramReserveInfo[0].usFirmwareUseInKb * 1024;
|
||||||
}
|
}
|
||||||
|
ctx->scratch_size_bytes = 0;
|
||||||
if (usage_bytes == 0)
|
if (usage_bytes == 0)
|
||||||
usage_bytes = 20 * 1024;
|
usage_bytes = 20 * 1024;
|
||||||
/* allocate some scratch memory */
|
/* allocate some scratch memory */
|
||||||
ctx->scratch = kzalloc(usage_bytes, GFP_KERNEL);
|
ctx->scratch = kzalloc(usage_bytes, GFP_KERNEL);
|
||||||
if (!ctx->scratch)
|
if (!ctx->scratch)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
ctx->scratch_size_bytes = usage_bytes;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -137,6 +137,7 @@ struct atom_context {
|
|||||||
int cs_equal, cs_above;
|
int cs_equal, cs_above;
|
||||||
int io_mode;
|
int io_mode;
|
||||||
uint32_t *scratch;
|
uint32_t *scratch;
|
||||||
|
int scratch_size_bytes;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern int atom_debug;
|
extern int atom_debug;
|
||||||
|
@ -466,7 +466,7 @@ static void atombios_crtc_program_ss(struct drm_crtc *crtc,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
args.v2.ucEnable = enable;
|
args.v2.ucEnable = enable;
|
||||||
if ((ss->percentage == 0) || (ss->type & ATOM_EXTERNAL_SS_MASK))
|
if ((ss->percentage == 0) || (ss->type & ATOM_EXTERNAL_SS_MASK) || ASIC_IS_DCE41(rdev))
|
||||||
args.v2.ucEnable = ATOM_DISABLE;
|
args.v2.ucEnable = ATOM_DISABLE;
|
||||||
} else if (ASIC_IS_DCE3(rdev)) {
|
} else if (ASIC_IS_DCE3(rdev)) {
|
||||||
args.v1.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage);
|
args.v1.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage);
|
||||||
|
@ -1638,7 +1638,17 @@ atombios_set_encoder_crtc_source(struct drm_encoder *encoder)
|
|||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
args.v2.ucCRTC = radeon_crtc->crtc_id;
|
args.v2.ucCRTC = radeon_crtc->crtc_id;
|
||||||
args.v2.ucEncodeMode = atombios_get_encoder_mode(encoder);
|
if (radeon_encoder_is_dp_bridge(encoder)) {
|
||||||
|
struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
|
||||||
|
|
||||||
|
if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)
|
||||||
|
args.v2.ucEncodeMode = ATOM_ENCODER_MODE_LVDS;
|
||||||
|
else if (connector->connector_type == DRM_MODE_CONNECTOR_VGA)
|
||||||
|
args.v2.ucEncodeMode = ATOM_ENCODER_MODE_CRT;
|
||||||
|
else
|
||||||
|
args.v2.ucEncodeMode = atombios_get_encoder_mode(encoder);
|
||||||
|
} else
|
||||||
|
args.v2.ucEncodeMode = atombios_get_encoder_mode(encoder);
|
||||||
switch (radeon_encoder->encoder_id) {
|
switch (radeon_encoder->encoder_id) {
|
||||||
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
|
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
|
||||||
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
|
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
|
||||||
@ -1756,10 +1766,15 @@ static int radeon_atom_pick_dig_encoder(struct drm_encoder *encoder)
|
|||||||
if (ASIC_IS_DCE4(rdev)) {
|
if (ASIC_IS_DCE4(rdev)) {
|
||||||
dig = radeon_encoder->enc_priv;
|
dig = radeon_encoder->enc_priv;
|
||||||
if (ASIC_IS_DCE41(rdev)) {
|
if (ASIC_IS_DCE41(rdev)) {
|
||||||
if (dig->linkb)
|
/* ontario follows DCE4 */
|
||||||
return 1;
|
if (rdev->family == CHIP_PALM) {
|
||||||
else
|
if (dig->linkb)
|
||||||
return 0;
|
return 1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
} else
|
||||||
|
/* llano follows DCE3.2 */
|
||||||
|
return radeon_crtc->crtc_id;
|
||||||
} else {
|
} else {
|
||||||
switch (radeon_encoder->encoder_id) {
|
switch (radeon_encoder->encoder_id) {
|
||||||
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
|
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
|
||||||
|
@ -321,7 +321,7 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object *bo,
|
|||||||
struct ttm_mem_type_manager *man = &bdev->man[new_mem->mem_type];
|
struct ttm_mem_type_manager *man = &bdev->man[new_mem->mem_type];
|
||||||
struct ttm_tt *ttm = bo->ttm;
|
struct ttm_tt *ttm = bo->ttm;
|
||||||
struct ttm_mem_reg *old_mem = &bo->mem;
|
struct ttm_mem_reg *old_mem = &bo->mem;
|
||||||
struct ttm_mem_reg old_copy;
|
struct ttm_mem_reg old_copy = *old_mem;
|
||||||
void *old_iomap;
|
void *old_iomap;
|
||||||
void *new_iomap;
|
void *new_iomap;
|
||||||
int ret;
|
int ret;
|
||||||
|
Loading…
Reference in New Issue
Block a user