videocodec_kernel.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include <linux/uaccess.h>
  2. #include <linux/module.h>
  3. #include <linux/fs.h>
  4. #include <linux/platform_device.h>
  5. #include <linux/cdev.h>
  6. #include <linux/interrupt.h>
  7. #include <asm/io.h>
  8. #include <linux/sched.h>
  9. #include <linux/wait.h>
  10. #include <linux/spinlock.h>
  11. #include <linux/delay.h>
  12. /* #include <linux/earlysuspend.h> */
  13. #include <linux/mm.h>
  14. #include <linux/vmalloc.h>
  15. #include <linux/dma-mapping.h>
  16. #include <linux/slab.h>
  17. /* #include <linux/aee.h> */
  18. #include <linux/timer.h>
  19. #include <linux/cache.h>
  20. /* #include <linux/printk.h> */
  21. #ifdef pr_fmt
  22. #undef pr_fmt
  23. #endif
  24. #define pr_fmt(fmt) "["KBUILD_MODNAME"]" fmt
  25. #define MODULE_MFV_LOGE(...) pr_err(__VA_ARGS__)
  26. unsigned long pmem_user_v2p_video(unsigned long va)
  27. {
  28. unsigned long pageOffset = (va & (PAGE_SIZE - 1));
  29. pgd_t *pgd;
  30. pud_t *pud;
  31. pmd_t *pmd;
  32. pte_t *pte;
  33. unsigned long pa;
  34. if (NULL == current) {
  35. MODULE_MFV_LOGE("[ERROR] pmem_user_v2p_video, current is NULL!\n");
  36. return 0;
  37. }
  38. if (NULL == current->mm) {
  39. MODULE_MFV_LOGE("[ERROR] pmem_user_v2p_video, current->mm is NULL! tgid=0x%x, name=%s\n",
  40. current->tgid, current->comm);
  41. return 0;
  42. }
  43. pgd = pgd_offset(current->mm, va); /* what is tsk->mm */
  44. if (pgd_none(*pgd) || pgd_bad(*pgd)) {
  45. MODULE_MFV_LOGE("[ERROR] pmem_user_v2p(), va=0x%lx, pgd invalid!\n", va);
  46. return 0;
  47. }
  48. pud = pud_offset(pgd, va);
  49. if (pud_none(*pud) || pud_bad(*pud)) {
  50. MODULE_MFV_LOGE("[ERROR] pmem_user_v2p(), va=0x%lx, pud invalid!\n", va);
  51. return 0;
  52. }
  53. pmd = pmd_offset(pud, va);
  54. if (pmd_none(*pmd) || pmd_bad(*pmd)) {
  55. MODULE_MFV_LOGE("[ERROR] pmem_user_v2p(), va=0x%lx, pmd invalid!\n", va);
  56. return 0;
  57. }
  58. pte = pte_offset_map(pmd, va);
  59. if (pte_present(*pte)) {
  60. pa = (pte_val(*pte) & PHYS_MASK & (PAGE_MASK)) | pageOffset;
  61. pte_unmap(pte);
  62. return pa;
  63. }
  64. MODULE_MFV_LOGE("[ERROR] pmem_user_v2p(), va=0x%lx, pte invalid!\n", va);
  65. return 0;
  66. }
  67. EXPORT_SYMBOL(pmem_user_v2p_video);