diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c | 81 |
1 files changed, 75 insertions, 6 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c index 6ac3df856b49..93fbf3551111 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c | |||
@@ -290,26 +290,95 @@ static int amdgpu_cgs_set_camera_voltages(void *cgs_device, uint32_t mask, | |||
290 | return -EPERM; | 290 | return -EPERM; |
291 | } | 291 | } |
292 | 292 | ||
293 | struct cgs_irq_params { | ||
294 | unsigned src_id; | ||
295 | cgs_irq_source_set_func_t set; | ||
296 | cgs_irq_handler_func_t handler; | ||
297 | void *private_data; | ||
298 | }; | ||
299 | |||
300 | static int cgs_set_irq_state(struct amdgpu_device *adev, | ||
301 | struct amdgpu_irq_src *src, | ||
302 | unsigned type, | ||
303 | enum amdgpu_interrupt_state state) | ||
304 | { | ||
305 | struct cgs_irq_params *irq_params = | ||
306 | (struct cgs_irq_params *)src->data; | ||
307 | if (!irq_params) | ||
308 | return -EINVAL; | ||
309 | if (!irq_params->set) | ||
310 | return -EINVAL; | ||
311 | return irq_params->set(irq_params->private_data, | ||
312 | irq_params->src_id, | ||
313 | type, | ||
314 | (int)state); | ||
315 | } | ||
316 | |||
317 | static int cgs_process_irq(struct amdgpu_device *adev, | ||
318 | struct amdgpu_irq_src *source, | ||
319 | struct amdgpu_iv_entry *entry) | ||
320 | { | ||
321 | struct cgs_irq_params *irq_params = | ||
322 | (struct cgs_irq_params *)source->data; | ||
323 | if (!irq_params) | ||
324 | return -EINVAL; | ||
325 | if (!irq_params->handler) | ||
326 | return -EINVAL; | ||
327 | return irq_params->handler(irq_params->private_data, | ||
328 | irq_params->src_id, | ||
329 | entry->iv_entry); | ||
330 | } | ||
331 | |||
332 | static const struct amdgpu_irq_src_funcs cgs_irq_funcs = { | ||
333 | .set = cgs_set_irq_state, | ||
334 | .process = cgs_process_irq, | ||
335 | }; | ||
336 | |||
293 | static int amdgpu_cgs_add_irq_source(void *cgs_device, unsigned src_id, | 337 | static int amdgpu_cgs_add_irq_source(void *cgs_device, unsigned src_id, |
294 | unsigned num_types, | 338 | unsigned num_types, |
295 | cgs_irq_source_set_func_t set, | 339 | cgs_irq_source_set_func_t set, |
296 | cgs_irq_handler_func_t handler, | 340 | cgs_irq_handler_func_t handler, |
297 | void *private_data) | 341 | void *private_data) |
298 | { | 342 | { |
299 | /* TODO */ | 343 | CGS_FUNC_ADEV; |
300 | return 0; | 344 | int ret = 0; |
345 | struct cgs_irq_params *irq_params; | ||
346 | struct amdgpu_irq_src *source = | ||
347 | kzalloc(sizeof(struct amdgpu_irq_src), GFP_KERNEL); | ||
348 | if (!source) | ||
349 | return -ENOMEM; | ||
350 | irq_params = | ||
351 | kzalloc(sizeof(struct cgs_irq_params), GFP_KERNEL); | ||
352 | if (!irq_params) { | ||
353 | kfree(source); | ||
354 | return -ENOMEM; | ||
355 | } | ||
356 | source->num_types = num_types; | ||
357 | source->funcs = &cgs_irq_funcs; | ||
358 | irq_params->src_id = src_id; | ||
359 | irq_params->set = set; | ||
360 | irq_params->handler = handler; | ||
361 | irq_params->private_data = private_data; | ||
362 | source->data = (void *)irq_params; | ||
363 | ret = amdgpu_irq_add_id(adev, src_id, source); | ||
364 | if (ret) { | ||
365 | kfree(irq_params); | ||
366 | kfree(source); | ||
367 | } | ||
368 | |||
369 | return ret; | ||
301 | } | 370 | } |
302 | 371 | ||
303 | static int amdgpu_cgs_irq_get(void *cgs_device, unsigned src_id, unsigned type) | 372 | static int amdgpu_cgs_irq_get(void *cgs_device, unsigned src_id, unsigned type) |
304 | { | 373 | { |
305 | /* TODO */ | 374 | CGS_FUNC_ADEV; |
306 | return 0; | 375 | return amdgpu_irq_get(adev, adev->irq.sources[src_id], type); |
307 | } | 376 | } |
308 | 377 | ||
309 | static int amdgpu_cgs_irq_put(void *cgs_device, unsigned src_id, unsigned type) | 378 | static int amdgpu_cgs_irq_put(void *cgs_device, unsigned src_id, unsigned type) |
310 | { | 379 | { |
311 | /* TODO */ | 380 | CGS_FUNC_ADEV; |
312 | return 0; | 381 | return amdgpu_irq_put(adev, adev->irq.sources[src_id], type); |
313 | } | 382 | } |
314 | 383 | ||
315 | static const struct cgs_ops amdgpu_cgs_ops = { | 384 | static const struct cgs_ops amdgpu_cgs_ops = { |