Lines 317-379
Link Here
|
317 |
up(&nvkms_lock); |
317 |
up(&nvkms_lock); |
318 |
} |
318 |
} |
319 |
|
319 |
|
320 |
|
320 |
|
321 |
/************************************************************************* |
321 |
/************************************************************************* |
322 |
* Interface with resman. |
322 |
* Interface with resman. |
323 |
*************************************************************************/ |
323 |
*************************************************************************/ |
324 |
|
324 |
|
325 |
static nvidia_modeset_rm_ops_t __rm_ops = { 0 }; |
325 |
static const nvidia_modeset_rm_ops_t *__rm_ops; |
|
|
326 |
|
326 |
static nvidia_modeset_callbacks_t nvkms_rm_callbacks = { |
327 |
static nvidia_modeset_callbacks_t nvkms_rm_callbacks = { |
327 |
nvkms_suspend, |
328 |
.suspend = nvkms_suspend, |
328 |
nvkms_resume |
329 |
.resume = nvkms_resume |
329 |
}; |
330 |
}; |
330 |
|
331 |
|
331 |
static int nvkms_alloc_rm(void) |
332 |
static int nvkms_alloc_rm(void) |
332 |
{ |
333 |
{ |
333 |
NV_STATUS nvstatus; |
334 |
NV_STATUS nvstatus; |
334 |
int ret; |
335 |
int ret; |
|
|
336 |
const char * version_string = NV_VERSION_STRING; |
335 |
|
337 |
|
336 |
__rm_ops.version_string = NV_VERSION_STRING; |
338 |
nvstatus = nvidia_get_rm_ops(&__rm_ops, &version_string); |
337 |
|
|
|
338 |
nvstatus = nvidia_get_rm_ops(&__rm_ops); |
339 |
|
339 |
|
340 |
if (nvstatus != NV_OK) { |
340 |
if (nvstatus != NV_OK) { |
341 |
printk(KERN_ERR NVKMS_LOG_PREFIX "Version mismatch: " |
341 |
printk(KERN_ERR NVKMS_LOG_PREFIX "Version mismatch: " |
342 |
"nvidia.ko(%s) nvidia-modeset.ko(%s)\n", |
342 |
"nvidia.ko(%s) nvidia-modeset.ko(%s)\n", |
343 |
__rm_ops.version_string, NV_VERSION_STRING); |
343 |
version_string, NV_VERSION_STRING); |
344 |
return -EINVAL; |
344 |
return -EINVAL; |
345 |
} |
345 |
} |
346 |
|
346 |
|
347 |
ret = __rm_ops.set_callbacks(&nvkms_rm_callbacks); |
347 |
ret = __rm_ops->set_callbacks(&nvkms_rm_callbacks); |
348 |
if (ret < 0) { |
348 |
if (ret < 0) { |
349 |
printk(KERN_ERR NVKMS_LOG_PREFIX "Failed to register callbacks\n"); |
349 |
printk(KERN_ERR NVKMS_LOG_PREFIX "Failed to register callbacks\n"); |
350 |
return ret; |
350 |
return ret; |
351 |
} |
351 |
} |
352 |
|
352 |
|
353 |
return 0; |
353 |
return 0; |
354 |
} |
354 |
} |
355 |
|
355 |
|
356 |
static void nvkms_free_rm(void) |
356 |
static void nvkms_free_rm(void) |
357 |
{ |
357 |
{ |
358 |
__rm_ops.set_callbacks(NULL); |
358 |
__rm_ops->set_callbacks(NULL); |
359 |
} |
359 |
} |
360 |
|
360 |
|
361 |
void NVKMS_API_CALL nvkms_call_rm(void *ops) |
361 |
void NVKMS_API_CALL nvkms_call_rm(void *ops) |
362 |
{ |
362 |
{ |
363 |
nvidia_modeset_stack_ptr stack = NULL; |
363 |
nvidia_modeset_stack_ptr stack = NULL; |
364 |
|
364 |
|
365 |
if (__rm_ops.alloc_stack(&stack) != 0) { |
365 |
if (__rm_ops->alloc_stack(&stack) != 0) { |
366 |
return; |
366 |
return; |
367 |
} |
367 |
} |
368 |
|
368 |
|
369 |
__rm_ops.op(stack, ops); |
369 |
__rm_ops->op(stack, ops); |
370 |
|
370 |
|
371 |
__rm_ops.free_stack(stack); |
371 |
__rm_ops->free_stack(stack); |
372 |
} |
372 |
} |
373 |
|
373 |
|
374 |
/************************************************************************* |
374 |
/************************************************************************* |
375 |
* ref_ptr implementation. |
375 |
* ref_ptr implementation. |
376 |
*************************************************************************/ |
376 |
*************************************************************************/ |
377 |
|
377 |
|
378 |
struct nvkms_ref_ptr { |
378 |
struct nvkms_ref_ptr { |
379 |
struct kref refcnt; |
379 |
struct kref refcnt; |
Lines 685-732
Link Here
|
685 |
return data; |
685 |
return data; |
686 |
} |
686 |
} |
687 |
|
687 |
|
688 |
NvBool NVKMS_API_CALL nvkms_open_gpu(NvU32 gpuId) |
688 |
NvBool NVKMS_API_CALL nvkms_open_gpu(NvU32 gpuId) |
689 |
{ |
689 |
{ |
690 |
nvidia_modeset_stack_ptr stack = NULL; |
690 |
nvidia_modeset_stack_ptr stack = NULL; |
691 |
NvBool ret; |
691 |
NvBool ret; |
692 |
|
692 |
|
693 |
if (__rm_ops.alloc_stack(&stack) != 0) { |
693 |
if (__rm_ops->alloc_stack(&stack) != 0) { |
694 |
return NV_FALSE; |
694 |
return NV_FALSE; |
695 |
} |
695 |
} |
696 |
|
696 |
|
697 |
ret = __rm_ops.open_gpu(gpuId, stack) == 0; |
697 |
ret = __rm_ops->open_gpu(gpuId, stack) == 0; |
698 |
|
698 |
|
699 |
__rm_ops.free_stack(stack); |
699 |
__rm_ops->free_stack(stack); |
700 |
|
700 |
|
701 |
return ret; |
701 |
return ret; |
702 |
} |
702 |
} |
703 |
|
703 |
|
704 |
void NVKMS_API_CALL nvkms_close_gpu(NvU32 gpuId) |
704 |
void NVKMS_API_CALL nvkms_close_gpu(NvU32 gpuId) |
705 |
{ |
705 |
{ |
706 |
nvidia_modeset_stack_ptr stack = NULL; |
706 |
nvidia_modeset_stack_ptr stack = NULL; |
707 |
|
707 |
|
708 |
if (__rm_ops.alloc_stack(&stack) != 0) { |
708 |
if (__rm_ops->alloc_stack(&stack) != 0) { |
709 |
return; |
709 |
return; |
710 |
} |
710 |
} |
711 |
|
711 |
|
712 |
__rm_ops.close_gpu(gpuId, stack); |
712 |
__rm_ops->close_gpu(gpuId, stack); |
713 |
|
713 |
|
714 |
__rm_ops.free_stack(stack); |
714 |
__rm_ops->free_stack(stack); |
715 |
} |
715 |
} |
716 |
|
716 |
|
717 |
NvU32 NVKMS_API_CALL nvkms_enumerate_gpus(nv_gpu_info_t *gpu_info) |
717 |
NvU32 NVKMS_API_CALL nvkms_enumerate_gpus(nv_gpu_info_t *gpu_info) |
718 |
{ |
718 |
{ |
719 |
return __rm_ops.enumerate_gpus(gpu_info); |
719 |
return __rm_ops->enumerate_gpus(gpu_info); |
720 |
} |
720 |
} |
721 |
|
721 |
|
722 |
NvBool NVKMS_API_CALL nvkms_allow_write_combining(void) |
722 |
NvBool NVKMS_API_CALL nvkms_allow_write_combining(void) |
723 |
{ |
723 |
{ |
724 |
return __rm_ops.system_info.allow_write_combining; |
724 |
return __rm_ops->system_info.allow_write_combining; |
725 |
} |
725 |
} |
726 |
|
726 |
|
727 |
/************************************************************************* |
727 |
/************************************************************************* |
728 |
* Common to both user-space and kapi NVKMS interfaces |
728 |
* Common to both user-space and kapi NVKMS interfaces |
729 |
*************************************************************************/ |
729 |
*************************************************************************/ |
730 |
|
730 |
|
731 |
static void nvkms_kapi_event_work_queue_callback(NVKMS_WORK_FUNC_ARG_T *arg) |
731 |
static void nvkms_kapi_event_work_queue_callback(NVKMS_WORK_FUNC_ARG_T *arg) |
732 |
{ |
732 |
{ |