diff options
| author | Alex Deucher <alexander.deucher@amd.com> | 2012-03-29 19:04:08 -0400 |
|---|---|---|
| committer | Luis Henriques <luis.henriques@canonical.com> | 2012-05-01 05:59:57 -0400 |
| commit | 1d91e02743890891dd7f0ef86c735f01bb6856b9 (patch) | |
| tree | b2fdc3d05fc56a8d0e710eb3c90853f51a9f710b /drivers/gpu/drm | |
| parent | bd24306d91f3cfd0128a21936e5a9bbed042990e (diff) | |
drm/radeon/kms: fix fans after resume
BugLink: http://bugs.launchpad.net/bugs/983326
commit 402976fe51b2d1a58a29ba06fa1ca5ace3a4cdcd upstream.
On pre-R600 asics, the SpeedFanControl table is not
executed as part of ASIC_Init as it is on newer asics.
Fixes:
https://bugzilla.kernel.org/show_bug.cgi?id=29412
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Tim Gardner <tim.gardner@canonical.com>
Diffstat (limited to 'drivers/gpu/drm')
| -rw-r--r-- | drivers/gpu/drm/radeon/atom.c | 15 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/atom.h | 1 |
2 files changed, 15 insertions, 1 deletions
diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c index 9a0aee2f065..88661eaa2c7 100644 --- a/drivers/gpu/drm/radeon/atom.c +++ b/drivers/gpu/drm/radeon/atom.c | |||
| @@ -1301,8 +1301,11 @@ struct atom_context *atom_parse(struct card_info *card, void *bios) | |||
| 1301 | 1301 | ||
| 1302 | int atom_asic_init(struct atom_context *ctx) | 1302 | int atom_asic_init(struct atom_context *ctx) |
| 1303 | { | 1303 | { |
| 1304 | struct radeon_device *rdev = ctx->card->dev->dev_private; | ||
| 1304 | int hwi = CU16(ctx->data_table + ATOM_DATA_FWI_PTR); | 1305 | int hwi = CU16(ctx->data_table + ATOM_DATA_FWI_PTR); |
| 1305 | uint32_t ps[16]; | 1306 | uint32_t ps[16]; |
| 1307 | int ret; | ||
| 1308 | |||
| 1306 | memset(ps, 0, 64); | 1309 | memset(ps, 0, 64); |
| 1307 | 1310 | ||
| 1308 | ps[0] = cpu_to_le32(CU32(hwi + ATOM_FWI_DEFSCLK_PTR)); | 1311 | ps[0] = cpu_to_le32(CU32(hwi + ATOM_FWI_DEFSCLK_PTR)); |
| @@ -1312,7 +1315,17 @@ int atom_asic_init(struct atom_context *ctx) | |||
| 1312 | 1315 | ||
| 1313 | if (!CU16(ctx->cmd_table + 4 + 2 * ATOM_CMD_INIT)) | 1316 | if (!CU16(ctx->cmd_table + 4 + 2 * ATOM_CMD_INIT)) |
| 1314 | return 1; | 1317 | return 1; |
| 1315 | return atom_execute_table(ctx, ATOM_CMD_INIT, ps); | 1318 | ret = atom_execute_table(ctx, ATOM_CMD_INIT, ps); |
| 1319 | if (ret) | ||
| 1320 | return ret; | ||
| 1321 | |||
| 1322 | memset(ps, 0, 64); | ||
| 1323 | |||
| 1324 | if (rdev->family < CHIP_R600) { | ||
| 1325 | if (CU16(ctx->cmd_table + 4 + 2 * ATOM_CMD_SPDFANCNTL)) | ||
| 1326 | atom_execute_table(ctx, ATOM_CMD_SPDFANCNTL, ps); | ||
| 1327 | } | ||
| 1328 | return ret; | ||
| 1316 | } | 1329 | } |
| 1317 | 1330 | ||
| 1318 | void atom_destroy(struct atom_context *ctx) | 1331 | void atom_destroy(struct atom_context *ctx) |
diff --git a/drivers/gpu/drm/radeon/atom.h b/drivers/gpu/drm/radeon/atom.h index 93cfe2086ba..25fea631dad 100644 --- a/drivers/gpu/drm/radeon/atom.h +++ b/drivers/gpu/drm/radeon/atom.h | |||
| @@ -44,6 +44,7 @@ | |||
| 44 | #define ATOM_CMD_SETSCLK 0x0A | 44 | #define ATOM_CMD_SETSCLK 0x0A |
| 45 | #define ATOM_CMD_SETMCLK 0x0B | 45 | #define ATOM_CMD_SETMCLK 0x0B |
| 46 | #define ATOM_CMD_SETPCLK 0x0C | 46 | #define ATOM_CMD_SETPCLK 0x0C |
| 47 | #define ATOM_CMD_SPDFANCNTL 0x39 | ||
| 47 | 48 | ||
| 48 | #define ATOM_DATA_FWI_PTR 0xC | 49 | #define ATOM_DATA_FWI_PTR 0xC |
| 49 | #define ATOM_DATA_IIO_PTR 0x32 | 50 | #define ATOM_DATA_IIO_PTR 0x32 |
