intel_driver.h

intel_driver.h位于src目录下,内容为:

#ifndef INTEL_DRIVER_H
#define INTEL_DRIVER_Hstruct xf86_platform_device;#define INTEL_VERSION 4000
#define INTEL_NAME "intel"
#define INTEL_DRIVER_NAME "intel"#define INTEL_VERSION_MAJOR PACKAGE_VERSION_MAJOR
#define INTEL_VERSION_MINOR PACKAGE_VERSION_MINOR
#define INTEL_VERSION_PATCH PACKAGE_VERSION_PATCHLEVEL#define PCI_CHIP_I810     0x7121
#define PCI_CHIP_I810_DC100 0x7123
#define PCI_CHIP_I810_E     0x7125
#define PCI_CHIP_I815       0x1132#define PCI_CHIP_I830_M       0x3577
#define PCI_CHIP_845_G      0x2562
#define PCI_CHIP_I854       0x358E
#define PCI_CHIP_I855_GM    0x3582
#define PCI_CHIP_I865_G     0x2572#define PCI_CHIP_I915_G       0x2582
#define PCI_CHIP_I915_GM    0x2592
#define PCI_CHIP_E7221_G    0x258A
#define PCI_CHIP_I945_G     0x2772
#define PCI_CHIP_I945_GM        0x27A2
#define PCI_CHIP_I945_GME   0x27AE
#define PCI_CHIP_PINEVIEW_M 0xA011
#define PCI_CHIP_PINEVIEW_G 0xA001
#define PCI_CHIP_Q35_G      0x29B2
#define PCI_CHIP_G33_G      0x29C2
#define PCI_CHIP_Q33_G      0x29D2#define PCI_CHIP_G35_G        0x2982
#define PCI_CHIP_I965_Q     0x2992
#define PCI_CHIP_I965_G     0x29A2
#define PCI_CHIP_I946_GZ    0x2972
#define PCI_CHIP_I965_GM        0x2A02
#define PCI_CHIP_I965_GME       0x2A12
#define PCI_CHIP_GM45_GM    0x2A42
#define PCI_CHIP_G45_E_G    0x2E02
#define PCI_CHIP_G45_G      0x2E22
#define PCI_CHIP_Q45_G      0x2E12
#define PCI_CHIP_G41_G      0x2E32
#define PCI_CHIP_B43_G      0x2E42
#define PCI_CHIP_B43_G1     0x2E92#define PCI_CHIP_IRONLAKE_D_G     0x0042
#define PCI_CHIP_IRONLAKE_M_G       0x0046#define PCI_CHIP_SANDYBRIDGE_GT1  0x0102
#define PCI_CHIP_SANDYBRIDGE_GT2    0x0112
#define PCI_CHIP_SANDYBRIDGE_GT2_PLUS   0x0122
#define PCI_CHIP_SANDYBRIDGE_M_GT1  0x0106
#define PCI_CHIP_SANDYBRIDGE_M_GT2  0x0116
#define PCI_CHIP_SANDYBRIDGE_M_GT2_PLUS 0x0126
#define PCI_CHIP_SANDYBRIDGE_S_GT   0x010A#define PCI_CHIP_IVYBRIDGE_M_GT1  0x0156
#define PCI_CHIP_IVYBRIDGE_M_GT2    0x0166
#define PCI_CHIP_IVYBRIDGE_D_GT1    0x0152
#define PCI_CHIP_IVYBRIDGE_D_GT2    0x0162
#define PCI_CHIP_IVYBRIDGE_S_GT1    0x015a
#define PCI_CHIP_IVYBRIDGE_S_GT2    0x016a#define PCI_CHIP_HASWELL_D_GT1        0x0402
#define PCI_CHIP_HASWELL_D_GT2      0x0412
#define PCI_CHIP_HASWELL_D_GT3      0x0422
#define PCI_CHIP_HASWELL_M_GT1      0x0406
#define PCI_CHIP_HASWELL_M_GT2      0x0416
#define PCI_CHIP_HASWELL_M_GT3      0x0426
#define PCI_CHIP_HASWELL_S_GT1      0x040A
#define PCI_CHIP_HASWELL_S_GT2      0x041A
#define PCI_CHIP_HASWELL_S_GT3      0x042A
#define PCI_CHIP_HASWELL_B_GT1      0x040B
#define PCI_CHIP_HASWELL_B_GT2      0x041B
#define PCI_CHIP_HASWELL_B_GT3      0x042B
#define PCI_CHIP_HASWELL_E_GT1      0x040E
#define PCI_CHIP_HASWELL_E_GT2      0x041E
#define PCI_CHIP_HASWELL_E_GT3      0x042E#define PCI_CHIP_HASWELL_ULT_D_GT1    0x0A02
#define PCI_CHIP_HASWELL_ULT_D_GT2  0x0A12
#define PCI_CHIP_HASWELL_ULT_D_GT3  0x0A22
#define PCI_CHIP_HASWELL_ULT_M_GT1  0x0A06
#define PCI_CHIP_HASWELL_ULT_M_GT2  0x0A16
#define PCI_CHIP_HASWELL_ULT_M_GT3  0x0A26
#define PCI_CHIP_HASWELL_ULT_S_GT1  0x0A0A
#define PCI_CHIP_HASWELL_ULT_S_GT2  0x0A1A
#define PCI_CHIP_HASWELL_ULT_S_GT3  0x0A2A
#define PCI_CHIP_HASWELL_ULT_B_GT1  0x0A0B
#define PCI_CHIP_HASWELL_ULT_B_GT2  0x0A1B
#define PCI_CHIP_HASWELL_ULT_B_GT3  0x0A2B
#define PCI_CHIP_HASWELL_ULT_E_GT1  0x0A0E
#define PCI_CHIP_HASWELL_ULT_E_GT2  0x0A1E
#define PCI_CHIP_HASWELL_ULT_E_GT3  0x0A2E#define PCI_CHIP_HASWELL_CRW_D_GT1    0x0D02
#define PCI_CHIP_HASWELL_CRW_D_GT2  0x0D12
#define PCI_CHIP_HASWELL_CRW_D_GT3  0x0D22
#define PCI_CHIP_HASWELL_CRW_M_GT1  0x0D06
#define PCI_CHIP_HASWELL_CRW_M_GT2  0x0D16
#define PCI_CHIP_HASWELL_CRW_M_GT3  0x0D26
#define PCI_CHIP_HASWELL_CRW_S_GT1  0x0D0A
#define PCI_CHIP_HASWELL_CRW_S_GT2  0x0D1A
#define PCI_CHIP_HASWELL_CRW_S_GT3  0x0D2A
#define PCI_CHIP_HASWELL_CRW_B_GT1  0x0D0B
#define PCI_CHIP_HASWELL_CRW_B_GT2  0x0D1B
#define PCI_CHIP_HASWELL_CRW_B_GT3  0x0D2B
#define PCI_CHIP_HASWELL_CRW_E_GT1  0x0D0E
#define PCI_CHIP_HASWELL_CRW_E_GT2  0x0D1E
#define PCI_CHIP_HASWELL_CRW_E_GT3  0x0D2Estruct intel_device_info {int gen;
};
struct intel_device;int intel_entity_get_devid(int index);int intel_open_device(int entity_num,const struct pci_device *pci,struct xf86_platform_device *dev);
void intel_close_device(int entity_num);
int __intel_peek_fd(ScrnInfoPtr scrn);
struct intel_device *intel_get_device(ScrnInfoPtr scrn, int *fd);
int intel_has_render_node(struct intel_device *dev);
const char *intel_get_master_name(struct intel_device *dev);
const char *intel_get_client_name(struct intel_device *dev);
int intel_get_client_fd(struct intel_device *dev);
int intel_get_device_id(struct intel_device *dev);
int intel_get_master(struct intel_device *dev);
int intel_put_master(struct intel_device *dev);
void intel_put_device(struct intel_device *dev);void intel_detect_chipset(ScrnInfoPtr scrn, struct intel_device *dev);#define IS_DEFAULT_ACCEL_METHOD(x) ({ \enum { NOACCEL, SNA, UXA } default_accel_method__ = DEFAULT_ACCEL_METHOD; \default_accel_method__ == x; \
})#define hosted() (0)#endif /* INTEL_DRIVER_H */

intel_driver.h中声明了intel_device.c中实现的函数,虽然名字一个叫driver、一个叫device。其中内容在下边分析inter_device.c的时候再做讲解。

intel_device.c

intel_device.c位于src目录下,文件内容较长(将近850行),因此在此不全部列出,而是一个函数一个函数来分析。

  • intel_open_device
int intel_open_device(int entity_num,const struct pci_device *pci,struct xf86_platform_device *platform)
{struct intel_device *dev;char *path;int fd, master_count;if (intel_device_key == -1)intel_device_key = xf86AllocateEntityPrivateIndex();if (intel_device_key == -1)return -1;dev = xf86GetEntityPrivate(entity_num, intel_device_key)->ptr;if (dev)return dev->fd;path = get_path(platform);master_count = 1; /* DRM_MASTER is managed by Xserver */fd = get_fd(platform);if (fd == -1) {fd = __intel_open_device(pci, path);if (fd == -1)goto err_path;master_count = 0;}if (path == NULL) {path = find_master_node(fd);if (path == NULL)goto err_close;}if (!__intel_check_device(fd))goto err_close;dev = malloc(sizeof(*dev));if (dev == NULL)goto err_close;/* If hosted under a system compositor, just pretend to be master */if (hosted())master_count++;/* Non-root user holding MASTER, don't let go */if (geteuid() && is_master(fd))master_count++;if (pci)dev->device_id = pci->device_id;elsedev->device_id = __intel_get_device_id(fd);dev->idx = entity_num;dev->fd = fd;dev->open_count = master_count;dev->master_count = master_count;dev->master_node = path;dev->render_node = find_render_node(fd);if (dev->render_node == NULL)dev->render_node = dev->master_node;xf86GetEntityPrivate(entity_num, intel_device_key)->ptr = dev;return fd;err_close:if (master_count == 0) /* Don't close server-fds */close(fd);
err_path:free(path);return -1;
}

这个函数本身也不短,分块来分析。先看第1段:

    if (intel_device_key == -1)intel_device_key = xf86AllocateEntityPrivateIndex();if (intel_device_key == -1)return -1;

intel_device_key在同文件中定义,为静态全局变量:

static int intel_device_key = -1;

初始时intel_device_key的值为-1,必定会调用xf86AllocateEntityPrivateIndex()。xf86AllocateEntityPrivateIndex函数在xorg-server源码的hw/xfree86/common/xf86Bus.c中,代码如下:

/** Allocate a private in the entities.*/int
xf86AllocateEntityPrivateIndex(void)
{int idx, i;EntityPtr pEnt;DevUnion *nprivs;idx = xf86EntityPrivateCount++;for (i = 0; i < xf86NumEntities; i++) {pEnt = xf86Entities[i];nprivs = xnfreallocarray(pEnt->entityPrivates,xf86EntityPrivateCount, sizeof(DevUnion));/* Zero the new private */memset(&nprivs[idx], 0, sizeof(DevUnion));pEnt->entityPrivates = nprivs;}return idx;
}

再来看第2段:

    dev = xf86GetEntityPrivate(entity_num, intel_device_key)->ptr;if (dev)return dev->fd;

xf86GetEntityPrivate函数同在xorg-server源码的hw/xfree86/common/xf86Bus.c中,就在xf86AllocateEntityPrivateIndex函数实现的下边,代码如下:

DevUnion *
xf86GetEntityPrivate(int entityIndex, int privIndex)
{if (entityIndex >= xf86NumEntities || privIndex >= xf86EntityPrivateCount)return NULL;return &(xf86Entities[entityIndex]->entityPrivates[privIndex]);
}

接下来看第3段:

path = get_path(platform);

path是函数内部定义的局部变量:char *path;。

这段代码的意思是根据intel_open_device函数的入参struct xf86_platform_device *platform即平台设备指针获得相应的路径。

get_path函数在同文件中实现,代码如下:

#if defined(ODEV_ATTRIB_PATH)
static char *get_path(struct xf86_platform_device *dev)
{const char *path;if (dev == NULL)return NULL;path = xf86_get_platform_device_attrib(dev, ODEV_ATTRIB_PATH);if (path == NULL)return NULL;return strdup(path);
}#elsestatic char *get_path(struct xf86_platform_device *dev)
{return NULL;
}
#endif

接下来看第4段:

    master_count = 1; /* DRM_MASTER is managed by Xserver */fd = get_fd(platform);if (fd == -1) {fd = __intel_open_device(pci, path);if (fd == -1)goto err_path;master_count = 0;}

这段代码的意思是根据intel_open_device函数的入参struct xf86_platform_device *platform即平台设备指针获得相应的文件描述符。如果获取不到,则调用__intel_open_device函数根据intel_open_device函数的入参pci打开设备。

get_path函数在同文件中实现,代码如下:

#if defined(ODEV_ATTRIB_FD)
static int get_fd(struct xf86_platform_device *dev)
{if (dev == NULL)return -1;return xf86_get_platform_device_int_attrib(dev, ODEV_ATTRIB_FD, -1);
}#elsestatic int get_fd(struct xf86_platform_device *dev)
{return -1;
}
#endif

__intel_open_device函数在同文件中实现,代码如下:

static int __intel_open_device(const struct pci_device *pci, const char *path)
{int fd;if (path == NULL) {if (pci == NULL)return -1;fd = __intel_open_device__pci(pci);if (fd == -1)fd = __intel_open_device__legacy(pci);} elsefd = open_cloexec(path);return fd;
}

__intel_open_device函数中包含的2个函数都比较大,我们在下一篇文章中进行分析。

xf86-video-intel源码分析6 —— intel_device.c和intel_driver.h(1)相关推荐

  1. video.js 源码分析(JavaScript)

    video.js 源码分析(JavaScript) 组织结构 继承关系 运行机制 插件的运行机制 插件的定义 插件的运行 控制条是如何运行的 UI与JavaScript对象的衔接 类的挂载方式 存储 ...

  2. Redis源码分析之小型测试框架testhelp.h和redis-check-aof.c日志检测

    使用的是redis 3.2版本 test中的文件主要分为以下几个: 1.memtest.c 内存检测 2.redis_benchmark.c 用于redis性能测试的实现,后续会当做单独的一个章节进行 ...

  3. SDL2源码分析之OpenGL ES在windows上的渲染过程

    SDL2源码分析之OpenGL ES在windows上的渲染过程 更新于2018年11月4日. 更新于2018年11月21日. ffmpeg + SDL2实现的简易播放器 ffmpeg和SDL非常强大 ...

  4. FFmpeg简述,源码分析,录制/压缩/水印/剪切/旋转/滤镜/美颜/上传视频等(CPU软编码和解码)

    > ffmpeg源码分析 ffmpeg源码简析(一)结构总览- https://blog.csdn.net/Louis_815/article/details/79621056 FFmpeg的库 ...

  5. xf86-video-intel源码分析1 —— 源码目录结构概览

    在<Spectacle/Flameshot/X11 Xlib截屏问题现象及解决方法>一文(链接如下)中提到, Spectacle/Flameshot/X11 Xlib截屏问题现象及解决方法 ...

  6. JDK源码分析 NIO实现

    总列表:http://hg.openjdk.java.net/ 小版本:http://hg.openjdk.java.net/jdk8u jdk:http://hg.openjdk.java.net/ ...

  7. Java并发基础:了解无锁CAS就从源码分析

    CAS的全称为Compare And Swap,直译就是比较交换.是一条CPU的原子指令,其作用是让CPU先进行比较两个值是否相等,然后原子地更新某个位置的值,其实现方式是基于硬件平台的汇编指令,在i ...

  8. golang源码分析-启动过程概述

    golang源码分析-启动过程概述 golang语言作为根据CSP模型实现的一种强类型的语言,本文主要就是通过简单的实例来分析一下golang语言的启动流程,为深入了解与学习做铺垫. golang代码 ...

  9. linux nDPI 协议检测 源码分析

    关于nDPI的基本功能就不在这介绍了,有兴趣了解的读者可以阅读官方的快速入门指南:https://github.com/ntop/nDPI/blob/dev/doc/nDPI_QuickStartGu ...

最新文章

  1. paypal提现软件_PayPal软件工程师生命中的一天
  2. 对网络骚扰和霸凌说不!神经网络可以做得更好
  3. python套接字编程_Python网络编程 Python套接字编程
  4. Java基础:JavaNIO 之 内存映射文件原理
  5. PCB电路设计10大基本原则
  6. iOS自动偏移64个像素
  7. 信息系统项目管理师-信息文档与配置管理核心知识点思维脑图
  8. MySQL数据迁移到SQL Server
  9. windows linux 传文件_2种windows到linux上传文件的方法
  10. 真来了!已有高校正式通知:排查近5年硕博学位论文!
  11. 订阅机票时要注意的几个教训
  12. 电脑系统及软件安装日期查看
  13. micropython入门 stm32_STM32F4系列使用MicroPython开发
  14. discuzdiy图片模块_Discuz各类幻灯片的制作方法 - 完全支持DIY
  15. VIVO内置应用卸载指南(IQOO NEO5为例)
  16. Android studio离线安装教程
  17. oracle招聘ocp认证,OracleOCP认证要通过哪些考试?
  18. Python爬取《哆啦A梦-伴我同行2》影评,这部的寓意是啥?词云来剧透!
  19. catia 螺钉外螺纹_请问catia如何画螺杆和螺栓上的螺纹
  20. 使用freenom注册免费顶级域名并在梅林上使用DDNS

热门文章

  1. PTA程序设计天梯赛 L2题解报告(40/40)
  2. .NET 组件集 Componentone 发布更新:Blazor Edition + 跨平台数据组件
  3. 多久变形金刚2拍摄电影
  4. 高德地图看各省分界线_从高德采集最新的省市区三级坐标和行政区域边界,用js在浏览器中运行...
  5. NS3下的802.15.4模块(lr-wpan)
  6. android 发短信 oppo,oppo手机怎么自动回复短信?oppo手机自动回复信息设置教程
  7. 禅卡塔罗;追随它的指引,你会得到更多
  8. 翻转棋c语言算法,有没有人懂黑白棋(翻转棋)的核心算法
  9. 忘记了电脑登陆密码,只记得PIN密码时可以登陆电脑怎么修改密码
  10. 海滩生存java_野外求生技巧:海滨生存技能,不同地形的生存要领