diff options
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/radeon/atom.c | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/atom.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/atombios_dp.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/atombios_i2c.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 1 |
5 files changed, 19 insertions, 3 deletions
diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c index 15da7ef344a4..ec1593a6a561 100644 --- a/drivers/gpu/drm/radeon/atom.c +++ b/drivers/gpu/drm/radeon/atom.c | |||
| @@ -1217,7 +1217,7 @@ free: | |||
| 1217 | return ret; | 1217 | return ret; |
| 1218 | } | 1218 | } |
| 1219 | 1219 | ||
| 1220 | int atom_execute_table(struct atom_context *ctx, int index, uint32_t * params) | 1220 | int atom_execute_table_scratch_unlocked(struct atom_context *ctx, int index, uint32_t * params) |
| 1221 | { | 1221 | { |
| 1222 | int r; | 1222 | int r; |
| 1223 | 1223 | ||
| @@ -1238,6 +1238,15 @@ int atom_execute_table(struct atom_context *ctx, int index, uint32_t * params) | |||
| 1238 | return r; | 1238 | return r; |
| 1239 | } | 1239 | } |
| 1240 | 1240 | ||
| 1241 | int atom_execute_table(struct atom_context *ctx, int index, uint32_t * params) | ||
| 1242 | { | ||
| 1243 | int r; | ||
| 1244 | mutex_lock(&ctx->scratch_mutex); | ||
| 1245 | r = atom_execute_table_scratch_unlocked(ctx, index, params); | ||
| 1246 | mutex_unlock(&ctx->scratch_mutex); | ||
| 1247 | return r; | ||
| 1248 | } | ||
| 1249 | |||
| 1241 | static int atom_iio_len[] = { 1, 2, 3, 3, 3, 3, 4, 4, 4, 3 }; | 1250 | static int atom_iio_len[] = { 1, 2, 3, 3, 3, 3, 4, 4, 4, 3 }; |
| 1242 | 1251 | ||
| 1243 | static void atom_index_iio(struct atom_context *ctx, int base) | 1252 | static void atom_index_iio(struct atom_context *ctx, int base) |
diff --git a/drivers/gpu/drm/radeon/atom.h b/drivers/gpu/drm/radeon/atom.h index feba6b8d36b3..6d014ddb6b78 100644 --- a/drivers/gpu/drm/radeon/atom.h +++ b/drivers/gpu/drm/radeon/atom.h | |||
| @@ -125,6 +125,7 @@ struct card_info { | |||
| 125 | struct atom_context { | 125 | struct atom_context { |
| 126 | struct card_info *card; | 126 | struct card_info *card; |
| 127 | struct mutex mutex; | 127 | struct mutex mutex; |
| 128 | struct mutex scratch_mutex; | ||
| 128 | void *bios; | 129 | void *bios; |
| 129 | uint32_t cmd_table, data_table; | 130 | uint32_t cmd_table, data_table; |
| 130 | uint16_t *iio; | 131 | uint16_t *iio; |
| @@ -145,6 +146,7 @@ extern int atom_debug; | |||
| 145 | 146 | ||
| 146 | struct atom_context *atom_parse(struct card_info *, void *); | 147 | struct atom_context *atom_parse(struct card_info *, void *); |
| 147 | int atom_execute_table(struct atom_context *, int, uint32_t *); | 148 | int atom_execute_table(struct atom_context *, int, uint32_t *); |
| 149 | int atom_execute_table_scratch_unlocked(struct atom_context *, int, uint32_t *); | ||
| 148 | int atom_asic_init(struct atom_context *); | 150 | int atom_asic_init(struct atom_context *); |
| 149 | void atom_destroy(struct atom_context *); | 151 | void atom_destroy(struct atom_context *); |
| 150 | bool atom_parse_data_header(struct atom_context *ctx, int index, uint16_t *size, | 152 | bool atom_parse_data_header(struct atom_context *ctx, int index, uint16_t *size, |
diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c index 95d5d4ab3335..11ba9d21b89b 100644 --- a/drivers/gpu/drm/radeon/atombios_dp.c +++ b/drivers/gpu/drm/radeon/atombios_dp.c | |||
| @@ -100,6 +100,7 @@ static int radeon_process_aux_ch(struct radeon_i2c_chan *chan, | |||
| 100 | memset(&args, 0, sizeof(args)); | 100 | memset(&args, 0, sizeof(args)); |
| 101 | 101 | ||
| 102 | mutex_lock(&chan->mutex); | 102 | mutex_lock(&chan->mutex); |
| 103 | mutex_lock(&rdev->mode_info.atom_context->scratch_mutex); | ||
| 103 | 104 | ||
| 104 | base = (unsigned char *)(rdev->mode_info.atom_context->scratch + 1); | 105 | base = (unsigned char *)(rdev->mode_info.atom_context->scratch + 1); |
| 105 | 106 | ||
| @@ -113,7 +114,7 @@ static int radeon_process_aux_ch(struct radeon_i2c_chan *chan, | |||
| 113 | if (ASIC_IS_DCE4(rdev)) | 114 | if (ASIC_IS_DCE4(rdev)) |
| 114 | args.v2.ucHPD_ID = chan->rec.hpd; | 115 | args.v2.ucHPD_ID = chan->rec.hpd; |
| 115 | 116 | ||
| 116 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | 117 | atom_execute_table_scratch_unlocked(rdev->mode_info.atom_context, index, (uint32_t *)&args); |
| 117 | 118 | ||
| 118 | *ack = args.v1.ucReplyStatus; | 119 | *ack = args.v1.ucReplyStatus; |
| 119 | 120 | ||
| @@ -147,6 +148,7 @@ static int radeon_process_aux_ch(struct radeon_i2c_chan *chan, | |||
| 147 | 148 | ||
| 148 | r = recv_bytes; | 149 | r = recv_bytes; |
| 149 | done: | 150 | done: |
| 151 | mutex_unlock(&rdev->mode_info.atom_context->scratch_mutex); | ||
| 150 | mutex_unlock(&chan->mutex); | 152 | mutex_unlock(&chan->mutex); |
| 151 | 153 | ||
| 152 | return r; | 154 | return r; |
diff --git a/drivers/gpu/drm/radeon/atombios_i2c.c b/drivers/gpu/drm/radeon/atombios_i2c.c index 9c570fb15b8c..4157780585a0 100644 --- a/drivers/gpu/drm/radeon/atombios_i2c.c +++ b/drivers/gpu/drm/radeon/atombios_i2c.c | |||
| @@ -48,6 +48,7 @@ static int radeon_process_i2c_ch(struct radeon_i2c_chan *chan, | |||
| 48 | memset(&args, 0, sizeof(args)); | 48 | memset(&args, 0, sizeof(args)); |
| 49 | 49 | ||
| 50 | mutex_lock(&chan->mutex); | 50 | mutex_lock(&chan->mutex); |
| 51 | mutex_lock(&rdev->mode_info.atom_context->scratch_mutex); | ||
| 51 | 52 | ||
| 52 | base = (unsigned char *)rdev->mode_info.atom_context->scratch; | 53 | base = (unsigned char *)rdev->mode_info.atom_context->scratch; |
| 53 | 54 | ||
| @@ -82,7 +83,7 @@ static int radeon_process_i2c_ch(struct radeon_i2c_chan *chan, | |||
| 82 | args.ucSlaveAddr = slave_addr << 1; | 83 | args.ucSlaveAddr = slave_addr << 1; |
| 83 | args.ucLineNumber = chan->rec.i2c_id; | 84 | args.ucLineNumber = chan->rec.i2c_id; |
| 84 | 85 | ||
| 85 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | 86 | atom_execute_table_scratch_unlocked(rdev->mode_info.atom_context, index, (uint32_t *)&args); |
| 86 | 87 | ||
| 87 | /* error */ | 88 | /* error */ |
| 88 | if (args.ucStatus != HW_ASSISTED_I2C_STATUS_SUCCESS) { | 89 | if (args.ucStatus != HW_ASSISTED_I2C_STATUS_SUCCESS) { |
| @@ -95,6 +96,7 @@ static int radeon_process_i2c_ch(struct radeon_i2c_chan *chan, | |||
| 95 | radeon_atom_copy_swap(buf, base, num, false); | 96 | radeon_atom_copy_swap(buf, base, num, false); |
| 96 | 97 | ||
| 97 | done: | 98 | done: |
| 99 | mutex_unlock(&rdev->mode_info.atom_context->scratch_mutex); | ||
| 98 | mutex_unlock(&chan->mutex); | 100 | mutex_unlock(&chan->mutex); |
| 99 | 101 | ||
| 100 | return r; | 102 | return r; |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index ea2676954dde..995a8b1770dd 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -952,6 +952,7 @@ int radeon_atombios_init(struct radeon_device *rdev) | |||
| 952 | } | 952 | } |
| 953 | 953 | ||
| 954 | mutex_init(&rdev->mode_info.atom_context->mutex); | 954 | mutex_init(&rdev->mode_info.atom_context->mutex); |
| 955 | mutex_init(&rdev->mode_info.atom_context->scratch_mutex); | ||
| 955 | radeon_atom_initialize_bios_scratch_regs(rdev->ddev); | 956 | radeon_atom_initialize_bios_scratch_regs(rdev->ddev); |
| 956 | atom_allocate_fb_scratch(rdev->mode_info.atom_context); | 957 | atom_allocate_fb_scratch(rdev->mode_info.atom_context); |
| 957 | return 0; | 958 | return 0; |
