aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c81
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
293struct 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
300static 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
317static 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
332static const struct amdgpu_irq_src_funcs cgs_irq_funcs = {
333 .set = cgs_set_irq_state,
334 .process = cgs_process_irq,
335};
336
293static int amdgpu_cgs_add_irq_source(void *cgs_device, unsigned src_id, 337static 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
303static int amdgpu_cgs_irq_get(void *cgs_device, unsigned src_id, unsigned type) 372static 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
309static int amdgpu_cgs_irq_put(void *cgs_device, unsigned src_id, unsigned type) 378static 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
315static const struct cgs_ops amdgpu_cgs_ops = { 384static const struct cgs_ops amdgpu_cgs_ops = {