0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux GIC驅(qū)動數(shù)據(jù)結(jié)構(gòu)分析

麥辣雞腿堡 ? 來源:LoyenWang ? 作者:LoyenWang ? 2023-09-28 15:18 ? 次閱讀

數(shù)據(jù)結(jié)構(gòu)分析

先來張圖:

圖片

  • GIC驅(qū)動中,使用struct gic_chip_data結(jié)構(gòu)體來描述GIC控制器的信息,整個驅(qū)動都是圍繞著該結(jié)構(gòu)體的初始化,驅(qū)動中將函數(shù)指針都初始化好,實(shí)際的工作是由中斷信號觸發(fā),也就是在中斷來臨的時候去進(jìn)行回調(diào);
  • struct irq_chip結(jié)構(gòu),描述的是中斷控制器的底層操作函數(shù)集,這些函數(shù)集最終完成對控制器硬件的操作;
  • struct irq_domain結(jié)構(gòu),用于硬件中斷號和Linux IRQ中斷號(virq,虛擬中斷號)之間的映射;

還是上一下具體的數(shù)據(jù)結(jié)構(gòu)代碼吧,關(guān)鍵注釋如下:

struct irq_chip {
	struct device	*parent_device;     //指向父設(shè)備
	const char	*name;      //  /proc/interrupts中顯示的名字
	unsigned int	(*irq_startup)(struct irq_data *data);  //啟動中斷,如果設(shè)置成NULL,則默認(rèn)為enable
	void		(*irq_shutdown)(struct irq_data *data);     //關(guān)閉中斷,如果設(shè)置成NULL,則默認(rèn)為disable
	void		(*irq_enable)(struct irq_data *data);   //中斷使能,如果設(shè)置成NULL,則默認(rèn)為chip- >unmask
	void		(*irq_disable)(struct irq_data *data);  //中斷禁止


	void		(*irq_ack)(struct irq_data *data);  //開始新的中斷
	void		(*irq_mask)(struct irq_data *data); //中斷源屏蔽
	void		(*irq_mask_ack)(struct irq_data *data); //應(yīng)答并屏蔽中斷
	void		(*irq_unmask)(struct irq_data *data);   //解除中斷屏蔽
	void		(*irq_eoi)(struct irq_data *data);  //中斷處理結(jié)束后調(diào)用


	int		(*irq_set_affinity)(struct irq_data *data, const struct cpumask *dest, bool force); //在SMP中設(shè)置CPU親和力
	int		(*irq_retrigger)(struct irq_data *data);    //重新發(fā)送中斷到CPU
	int		(*irq_set_type)(struct irq_data *data, unsigned int flow_type); //設(shè)置中斷觸發(fā)類型
	int		(*irq_set_wake)(struct irq_data *data, unsigned int on);    //使能/禁止電源管理中的喚醒功能


	void		(*irq_bus_lock)(struct irq_data *data); //慢速芯片總線上的鎖
	void		(*irq_bus_sync_unlock)(struct irq_data *data);  //同步釋放慢速總線芯片的鎖


	void		(*irq_cpu_online)(struct irq_data *data);
	void		(*irq_cpu_offline)(struct irq_data *data);


	void		(*irq_suspend)(struct irq_data *data);
	void		(*irq_resume)(struct irq_data *data);
	void		(*irq_pm_shutdown)(struct irq_data *data);


	void		(*irq_calc_mask)(struct irq_data *data);


	void		(*irq_print_chip)(struct irq_data *data, struct seq_file *p);
	int		(*irq_request_resources)(struct irq_data *data);
	void		(*irq_release_resources)(struct irq_data *data);


	void		(*irq_compose_msi_msg)(struct irq_data *data, struct msi_msg *msg);
	void		(*irq_write_msi_msg)(struct irq_data *data, struct msi_msg *msg);


	int		(*irq_get_irqchip_state)(struct irq_data *data, enum irqchip_irq_state which, bool *state);
	int		(*irq_set_irqchip_state)(struct irq_data *data, enum irqchip_irq_state which, bool state);


	int		(*irq_set_vcpu_affinity)(struct irq_data *data, void *vcpu_info);


	void		(*ipi_send_single)(struct irq_data *data, unsigned int cpu);
	void		(*ipi_send_mask)(struct irq_data *data, const struct cpumask *dest);


	unsigned long	flags;
};


struct irq_domain {
	struct list_head link;  //用于添加到全局鏈表irq_domain_list中
	const char *name;   //IRQ domain的名字
	const struct irq_domain_ops *ops;   //IRQ domain映射操作函數(shù)集
	void *host_data;    //在GIC驅(qū)動中,指向了irq_gic_data
	unsigned int flags; 
	unsigned int mapcount;  //映射中斷的個數(shù)


	/* Optional data */
	struct fwnode_handle *fwnode;
	enum irq_domain_bus_token bus_token;
	struct irq_domain_chip_generic *gc;
#ifdef	CONFIG_IRQ_DOMAIN_HIERARCHY
	struct irq_domain *parent;  //支持級聯(lián)的話,指向父設(shè)備
#endif
#ifdef CONFIG_GENERIC_IRQ_DEBUGFS
	struct dentry		*debugfs_file;
#endif


	/* reverse map data. The linear map gets appended to the irq_domain */
	irq_hw_number_t hwirq_max;  //IRQ domain支持中斷數(shù)量的最大值
	unsigned int revmap_direct_max_irq;
	unsigned int revmap_size;   //線性映射的大小
	struct radix_tree_root revmap_tree; //Radix Tree映射的根節(jié)點(diǎn)
	unsigned int linear_revmap[];   //線性映射用到的查找表
};


struct irq_domain_ops {
	int (*match)(struct irq_domain *d, struct device_node *node,
		     enum irq_domain_bus_token bus_token);      // 用于中斷控制器設(shè)備與IRQ domain的匹配
	int (*select)(struct irq_domain *d, struct irq_fwspec *fwspec,
		      enum irq_domain_bus_token bus_token);
	int (*map)(struct irq_domain *d, unsigned int virq, irq_hw_number_t hw);    //用于硬件中斷號與Linux中斷號的映射
	void (*unmap)(struct irq_domain *d, unsigned int virq);
	int (*xlate)(struct irq_domain *d, struct device_node *node,
		     const u32 *intspec, unsigned int intsize,
		     unsigned long *out_hwirq, unsigned int *out_type);     //通過device_node,解析硬件中斷號和觸發(fā)方式


#ifdef	CONFIG_IRQ_DOMAIN_HIERARCHY
	/* extended V2 interfaces to support hierarchy irq_domains */
	int (*alloc)(struct irq_domain *d, unsigned int virq,
		     unsigned int nr_irqs, void *arg);
	void (*free)(struct irq_domain *d, unsigned int virq,
		     unsigned int nr_irqs);
	void (*activate)(struct irq_domain *d, struct irq_data *irq_data);
	void (*deactivate)(struct irq_domain *d, struct irq_data *irq_data);
	int (*translate)(struct irq_domain *d, struct irq_fwspec *fwspec,
			 unsigned long *out_hwirq, unsigned int *out_type);
#endif
};
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 控制器

    關(guān)注

    112

    文章

    16037

    瀏覽量

    176678
  • 嵌入式
    +關(guān)注

    關(guān)注

    5052

    文章

    18913

    瀏覽量

    300837
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11171

    瀏覽量

    208482
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    569

    瀏覽量

    40063
  • gic
    gic
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    6260
收藏 人收藏

    評論

    相關(guān)推薦

    數(shù)據(jù)結(jié)構(gòu)與算法分析(Java版)(pdf)

    數(shù)據(jù)結(jié)構(gòu)與算法分析(Java版)(pdf)http://www.ibeifeng.com/read.php?tid=4812&u=73481【中文】Java數(shù)據(jù)結(jié)構(gòu)和算法中文第二
    發(fā)表于 12-20 21:22

    數(shù)據(jù)結(jié)構(gòu)與算法分析

    數(shù)據(jù)結(jié)構(gòu)與算法分析
    發(fā)表于 06-05 10:46

    數(shù)據(jù)結(jié)構(gòu)與算法分析:C語音第二版

    數(shù)據(jù)結(jié)構(gòu)與算法分析:C語音第二版,經(jīng)典資料與你分析
    發(fā)表于 12-10 10:57

    基于公共數(shù)據(jù)結(jié)構(gòu)的EDA仿真波形分析技術(shù)

    基于公共數(shù)據(jù)結(jié)構(gòu)的EDA仿真波形分析技術(shù):現(xiàn)有的EDA仿真工具缺乏對仿真數(shù)據(jù)分析處理功能,影響了仿真分析的效率。本文提出一種基于公共波形
    發(fā)表于 10-23 16:49 ?21次下載

    C#數(shù)據(jù)結(jié)構(gòu)和算法分析_ 魏寶剛

    數(shù)據(jù)結(jié)構(gòu)與算法分析》描述了各種類型的數(shù)據(jù)結(jié)構(gòu),包括線性表、樹、堆、圖,以及查找、排序等算法。自始至終將數(shù)據(jù)結(jié)構(gòu)的基本原理與算法分析緊密結(jié)合
    發(fā)表于 12-15 16:46 ?0次下載
    C#<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>和算法<b class='flag-5'>分析</b>_ 魏寶剛

    數(shù)據(jù)結(jié)構(gòu)是什么_數(shù)據(jù)結(jié)構(gòu)有什么用

    數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)存儲、組織數(shù)據(jù)的方式。數(shù)據(jù)結(jié)構(gòu)是指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。通常情況下,精心選擇的數(shù)據(jù)結(jié)構(gòu)可以帶來更高
    發(fā)表于 11-17 14:45 ?1.6w次閱讀
    <b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>是什么_<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>有什么用

    什么是數(shù)據(jù)結(jié)構(gòu)?為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)?數(shù)據(jù)結(jié)構(gòu)的應(yīng)用實(shí)例分析

    本文檔的主要內(nèi)容詳細(xì)介紹的是什么是數(shù)據(jù)結(jié)構(gòu)?為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)的應(yīng)用實(shí)例分析包括了:數(shù)據(jù)結(jié)構(gòu)在串口通信當(dāng)中的應(yīng)用,
    發(fā)表于 09-26 15:45 ?14次下載
    什么是<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>?為什么要學(xué)習(xí)<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>?<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>的應(yīng)用實(shí)例<b class='flag-5'>分析</b>

    Linux 內(nèi)核數(shù)據(jù)結(jié)構(gòu):位圖(Bitmap)

    除了各種鏈?zhǔn)胶蜆湫?b class='flag-5'>數(shù)據(jù)結(jié)構(gòu),Linux內(nèi)核還提供了位圖接口。位圖在Linux內(nèi)核中大量使用。下面的源代碼文件包含這些結(jié)構(gòu)的通用接口。
    發(fā)表于 05-14 17:24 ?3436次閱讀

    你知道Linux內(nèi)核數(shù)據(jù)結(jié)構(gòu)中雙向鏈表的作用?

    Linux 內(nèi)核提供一套雙向鏈表的實(shí)現(xiàn),你可以在 include/linux/list.h 中找到。我們以雙向鏈表著手開始介紹 Linux 內(nèi)核中的數(shù)據(jù)結(jié)構(gòu) ,因?yàn)檫@個是在
    發(fā)表于 05-14 17:27 ?1854次閱讀

    Linux0.11-進(jìn)程控制塊數(shù)據(jù)結(jié)構(gòu)

    嵌入式Linux中文站收集整理Linux0.11版本內(nèi)核學(xué)習(xí)筆記,本文分析Linux進(jìn)程控制模塊的數(shù)據(jù)結(jié)構(gòu)
    發(fā)表于 05-15 15:22 ?936次閱讀

    數(shù)據(jù)結(jié)構(gòu)與算法分析—C語言描述

    數(shù)據(jù)結(jié)構(gòu)與算法分析:C語言描述》曾被評為20世紀(jì)頂尖的30部計(jì)算機(jī)著作之一,作者在數(shù)據(jù)結(jié)構(gòu)和算法分析方面卓有建樹,他的數(shù)據(jù)結(jié)構(gòu)和算法
    發(fā)表于 10-14 08:00 ?17次下載
    <b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>與算法<b class='flag-5'>分析</b>—C語言描述

    數(shù)據(jù)結(jié)構(gòu)與算法分析——Java語言描述

    數(shù)據(jù)結(jié)構(gòu)與算法分析——Java語言描述說明。
    發(fā)表于 05-31 14:25 ?22次下載

    Linux內(nèi)核的鏈表數(shù)據(jù)結(jié)構(gòu)

    Linux內(nèi)核實(shí)現(xiàn)了自己的鏈表數(shù)據(jù)結(jié)構(gòu),它的設(shè)計(jì)與傳統(tǒng)的方式不同,非常巧妙也很通用。
    的頭像 發(fā)表于 03-24 11:34 ?795次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核的鏈表<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>

    Linux內(nèi)核代碼中常用的數(shù)據(jù)結(jié)構(gòu)有哪些?

    Linux內(nèi)核代碼中廣泛使用了數(shù)據(jù)結(jié)構(gòu)和算法,其中最常用的兩個是鏈表和紅黑樹。
    發(fā)表于 07-20 09:39 ?472次閱讀

    Linux內(nèi)核中使用的數(shù)據(jù)結(jié)構(gòu)

    Linux內(nèi)核代碼中廣泛使用了數(shù)據(jù)結(jié)構(gòu)和算法,其中最常用的兩個是鏈表和紅黑樹。 鏈表 Linux內(nèi)核代碼大量使用了鏈表這種數(shù)據(jù)結(jié)構(gòu)。鏈表是在解決數(shù)組不能動態(tài)擴(kuò)展這個缺陷而產(chǎn)生的一種
    的頭像 發(fā)表于 11-09 14:24 ?415次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核中使用的<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>