亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? synergy.c

?? ARM 嵌入式 系統(tǒng) 設(shè)計與實例開發(fā) 實驗教材 二源碼
?? C
字號:
/* * SN1 Platform specific synergy Support * * Copyright (C) 2000 Silicon Graphics, Inc. * Copyright (C) 2000 Alan Mayer (ajm@sgi.com) */#include <linux/config.h>#include <linux/kernel.h>#include <linux/sched.h>#include <linux/mm.h>#include <linux/spinlock.h>#include <linux/proc_fs.h>#include <asm/ptrace.h>#include <linux/devfs_fs_kernel.h>#include <asm/smp.h>#include <asm/sn/sn_cpuid.h>#include <asm/sn/sn1/bedrock.h>#include <asm/sn/intr.h>#include <asm/sn/addrs.h>#include <asm/sn/synergy.h>int bit_pos_to_irq(int bit);void setclear_mask_b(int irq, int cpuid, int set);void setclear_mask_a(int irq, int cpuid, int set);void * kmalloc(size_t size, int flags);voidsynergy_intr_alloc(int bit, int cpuid) {	return;}intsynergy_intr_connect(int bit, 		int cpuid){	int irq;	unsigned is_b;	irq = bit_pos_to_irq(bit);	is_b = (cpuid_to_slice(cpuid)) & 1;	if (is_b) {		setclear_mask_b(irq,cpuid,1);		setclear_mask_a(irq,cpuid, 0);	} else {		setclear_mask_a(irq, cpuid, 1);		setclear_mask_b(irq, cpuid, 0);	}	return 0;}voidsetclear_mask_a(int irq, int cpuid, int set){	int synergy;	int nasid;	int reg_num;	unsigned long mask;	unsigned long addr;	unsigned long reg;	unsigned long val;	int my_cnode, my_synergy;	int target_cnode, target_synergy;        /*         * Perform some idiot checks ..         */        if ( (irq < 0) || (irq > 255) ||                (cpuid < 0) || (cpuid > 512) ) {                printk("clear_mask_a: Invalid parameter irq %d cpuid %d\n", irq, cpuid);		return;	}	target_cnode = cpuid_to_cnodeid(cpuid);	target_synergy = cpuid_to_synergy(cpuid);	my_cnode = cpuid_to_cnodeid(smp_processor_id());	my_synergy = cpuid_to_synergy(smp_processor_id());	reg_num = irq / 64;	mask = 1;	mask <<= (irq % 64);	switch (reg_num) {		case 0: 			reg = VEC_MASK0A;			addr = VEC_MASK0A_ADDR;			break;		case 1: 			reg = VEC_MASK1A;			addr = VEC_MASK1A_ADDR;			break;		case 2: 			reg = VEC_MASK2A;			addr = VEC_MASK2A_ADDR;			break;		case 3: 			reg = VEC_MASK3A;			addr = VEC_MASK3A_ADDR;			break;		default:			reg = addr = 0;			break;	}	if (my_cnode == target_cnode && my_synergy == target_synergy) {		// local synergy		val = READ_LOCAL_SYNERGY_REG(addr);		if (set) {			val |= mask;		} else {			val &= ~mask;		}		WRITE_LOCAL_SYNERGY_REG(addr, val);		val = READ_LOCAL_SYNERGY_REG(addr);	} else { /* remote synergy */		synergy = cpuid_to_synergy(cpuid);		nasid = cpuid_to_nasid(cpuid);		val = REMOTE_SYNERGY_LOAD(nasid, synergy, reg);		if (set) {			val |= mask;		} else {			val &= ~mask;		}		REMOTE_SYNERGY_STORE(nasid, synergy, reg, val);	}}voidsetclear_mask_b(int irq, int cpuid, int set){	int synergy;	int nasid;	int reg_num;	unsigned long mask;	unsigned long addr;	unsigned long reg;	unsigned long val;	int my_cnode, my_synergy;	int target_cnode, target_synergy;	/*	 * Perform some idiot checks ..	 */	if ( (irq < 0) || (irq > 255) ||		(cpuid < 0) || (cpuid > 512) ) {		printk("clear_mask_b: Invalid parameter irq %d cpuid %d\n", irq, cpuid);		return;	}	target_cnode = cpuid_to_cnodeid(cpuid);	target_synergy = cpuid_to_synergy(cpuid);	my_cnode = cpuid_to_cnodeid(smp_processor_id());	my_synergy = cpuid_to_synergy(smp_processor_id());	reg_num = irq / 64;	mask = 1;	mask <<= (irq % 64);	switch (reg_num) {		case 0: 			reg = VEC_MASK0B;			addr = VEC_MASK0B_ADDR;			break;		case 1: 			reg = VEC_MASK1B;			addr = VEC_MASK1B_ADDR;			break;		case 2: 			reg = VEC_MASK2B;			addr = VEC_MASK2B_ADDR;			break;		case 3: 			reg = VEC_MASK3B;			addr = VEC_MASK3B_ADDR;			break;		default:			reg = addr = 0;			break;	}	if (my_cnode == target_cnode && my_synergy == target_synergy) {		// local synergy		val = READ_LOCAL_SYNERGY_REG(addr);		if (set) {			val |= mask;		} else {			val &= ~mask;		}		WRITE_LOCAL_SYNERGY_REG(addr, val);		val = READ_LOCAL_SYNERGY_REG(addr);	} else { /* remote synergy */		synergy = cpuid_to_synergy(cpuid);		nasid = cpuid_to_nasid(cpuid);		val = REMOTE_SYNERGY_LOAD(nasid, synergy, reg);		if (set) {			val |= mask;		} else {			val &= ~mask;		}		REMOTE_SYNERGY_STORE(nasid, synergy, reg, val);	}}#if defined(CONFIG_IA64_SGI_SYNERGY_PERF)/* * Synergy perf registers. Multiplexed via timer_interrupt */static struct proc_dir_entry *synergy_perf_proc = NULL;/* * read handler for /proc/synergy */static intsynergy_perf_read_proc (char *page, char **start, off_t off,                                 int count, int *eof, void *data){	cnodeid_t       cnode;	nodepda_t       *npdap;	synergy_perf_t	*p;	int		len = 0;	len += sprintf(page+len, "# cnode module slot event synergy-A synergy-B\n");	/* walk the event list for each node */	for (cnode=0; cnode < numnodes; cnode++) {		npdap = NODEPDA(cnode);		if (npdap->synergy_perf_enabled == 0) {			len += sprintf(page+len, "# DISABLED\n");			break;		}		spin_lock_irq(&npdap->synergy_perf_lock);		for (p = npdap->synergy_perf_first; p;) {			uint64_t cnt_a=0, cnt_b=0;			if (p->intervals > 0) {				cnt_a = p->counts[0] * npdap->synergy_active_intervals / p->intervals;				cnt_b = p->counts[1] * npdap->synergy_active_intervals / p->intervals;			}			len += sprintf(page+len, "%d %d %d %12lx %lu %lu\n",				(int)cnode, (int)npdap->module_id, (int)npdap->slotdesc,				p->modesel, cnt_a, cnt_b);			p = p->next;			if (p == npdap->synergy_perf_first)				break;		}		spin_unlock_irq(&npdap->synergy_perf_lock);	}	if (len <= off+count) *eof = 1;	*start = page + off;	len -= off;	if (len>count) len = count;	if (len<0) len = 0;	return len;}static intsynergy_perf_append(uint64_t modesel){	int		cnode;	nodepda_t       *npdap;	synergy_perf_t	*p;	int		err = 0;	/* bit 45 is enable */	modesel |= (1UL << 45);	for (cnode=0; cnode < numnodes; cnode++) {		/* for each node, insert a new synergy_perf entry */		if ((npdap = NODEPDA(cnode)) == NULL) {			printk("synergy_perf_append: cnode=%d NODEPDA(cnode)==NULL, nodepda=%p\n", cnode, nodepda);			continue;		}		/* XX use kmem_alloc_node() when it is implemented */		p = (synergy_perf_t *)kmalloc(sizeof(synergy_perf_t), GFP_KERNEL);		if (p == NULL)			err = -ENOMEM;		else {			memset(p, 0, sizeof(synergy_perf_t));			p->modesel = modesel;			if (npdap->synergy_perf_data == NULL) {				/* circular list */				p->next = p;				npdap->synergy_perf_data = p;				npdap->synergy_perf_first = p;			}			else {				/*				 * Jumble up the insertion order so we get better sampling.				 * Once the list is complete, "first" stays the same so the				 * reporting order is consistent.				 */				p->next = npdap->synergy_perf_first->next;				npdap->synergy_perf_first->next = p;				npdap->synergy_perf_first = p->next;			}		}	}	return err;}static intsynergy_perf_write_proc (struct file *file, const char *buffer,                                unsigned long count, void *data){	int		cnode;	nodepda_t       *npdap;	uint64_t	modesel;	char		cmd[64];	extern long	atoi(char *);    	if (count == sizeof(uint64_t)) {	    if (copy_from_user(&modesel, buffer, sizeof(uint64_t)))		    return -EFAULT;	    synergy_perf_append(modesel);	}	else {	    if (copy_from_user(cmd, buffer, count < sizeof(cmd) ? count : sizeof(cmd)))		    return -EFAULT;	    if (strncmp(cmd, "enable", 6) == 0) {		/* enable counting */		for (cnode=0; cnode < numnodes; cnode++) {			npdap = NODEPDA(cnode);			npdap->synergy_perf_enabled = 1;		}		printk("NOTICE: synergy perf counting enabled\n");	    }	    else	    if (strncmp(cmd, "disable", 7) == 0) {		/* disable counting */		for (cnode=0; cnode < numnodes; cnode++) {			npdap = NODEPDA(cnode);			npdap->synergy_perf_enabled = 0;		}		printk("NOTICE: synergy perf counting disabled\n");	    }	    else	    if (strncmp(cmd, "frequency", 9) == 0) {		/* set the update frequency (timer-interrupts per update) */		int freq;		if (count < 12)			return -EINVAL;		freq = atoi(cmd + 10);		if (freq <= 0 || freq > 100)			return -EINVAL;		for (cnode=0; cnode < numnodes; cnode++) {			npdap = NODEPDA(cnode);			npdap->synergy_perf_freq = (uint64_t)freq;		}		printk("NOTICE: synergy perf freq set to %d\n", freq);	    }	    else		return -EINVAL;	}		return count;}voidsynergy_perf_update(int cpu){	nasid_t		nasid;	cnodeid_t       cnode = cpuid_to_cnodeid(cpu);	struct nodepda_s *npdap;	extern struct nodepda_s *nodepda;	if (nodepda == NULL || (npdap=NODEPDA(cnode)) == NULL || npdap->synergy_perf_enabled == 0 ||		npdap->synergy_perf_data == NULL) {		/* I/O not initialized, or not enabled, or no events to monitor */		return;	}	if (npdap->synergy_inactive_intervals++ % npdap->synergy_perf_freq != 0) {		/* don't multiplex on every timer interrupt */		return;	}	/*	 * Read registers for last interval and increment counters.	 * Hold the per-node synergy_perf_lock so concurrent readers get	 * consistent values.	 */	spin_lock_irq(&npdap->synergy_perf_lock);	nasid = cpuid_to_nasid(cpu);	npdap->synergy_active_intervals++;	npdap->synergy_perf_data->intervals++;	npdap->synergy_perf_data->counts[0] += 0xffffffffffUL &		REMOTE_SYNERGY_LOAD(nasid, 0, PERF_CNTR0_A);	npdap->synergy_perf_data->counts[1] += 0xffffffffffUL &		REMOTE_SYNERGY_LOAD(nasid, 1, PERF_CNTR0_B);	/* skip to next in circular list */	npdap->synergy_perf_data = npdap->synergy_perf_data->next;	spin_unlock_irq(&npdap->synergy_perf_lock);	/* set the counter 0 selection modes for both A and B */	REMOTE_SYNERGY_STORE(nasid, 0, PERF_CNTL0_A, npdap->synergy_perf_data->modesel);	REMOTE_SYNERGY_STORE(nasid, 1, PERF_CNTL0_B, npdap->synergy_perf_data->modesel);	/* and reset the counter registers to zero */	REMOTE_SYNERGY_STORE(nasid, 0, PERF_CNTR0_A, 0UL);	REMOTE_SYNERGY_STORE(nasid, 1, PERF_CNTR0_B, 0UL);}voidsynergy_perf_init(void){        if ((synergy_perf_proc = create_proc_entry("synergy", 0644, NULL)) != NULL) {                synergy_perf_proc->read_proc = synergy_perf_read_proc;                synergy_perf_proc->write_proc = synergy_perf_write_proc;                printk("markgw: synergy_perf_init()\n");        }}#endif /* CONFIG_IA64_SGI_SYNERGY_PERF */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品全国免费观看高清| 欧美亚洲动漫精品| 久久久久99精品一区| 国模套图日韩精品一区二区| 国产亚洲婷婷免费| 91在线观看下载| 亚洲国产裸拍裸体视频在线观看乱了| 欧美日韩视频第一区| 蜜臀av性久久久久av蜜臀妖精 | 国产精品传媒在线| 中文字幕国产一区二区| 国产99久久久国产精品潘金 | 亚洲精品一区二区三区香蕉| 国内精品免费在线观看| 国产精品免费av| 欧美午夜一区二区三区| 麻豆精品视频在线观看| 中文字幕精品综合| 欧美色网站导航| 韩国精品一区二区| 亚洲男人的天堂在线观看| 欧美日韩二区三区| 国产精品18久久久久久久久久久久 | 亚洲丝袜另类动漫二区| 欧美日韩一级片网站| 久草在线在线精品观看| 中文字幕在线视频一区| 欧美精品一卡两卡| 成人精品电影在线观看| 亚洲第一会所有码转帖| 国产欧美日韩三级| 欧美日韩国产片| 成人免费看片app下载| 亚洲一区二区三区中文字幕| 欧美精品一区二区高清在线观看| 久久久久久久久蜜桃| 欧美亚洲综合一区| 国产成人综合在线观看| 偷拍一区二区三区四区| 亚洲视频一区二区免费在线观看| 日韩视频一区二区三区在线播放| 99久久夜色精品国产网站| 日本女人一区二区三区| 亚洲欧美视频在线观看| 国产嫩草影院久久久久| 日韩一级完整毛片| 欧美日韩精品高清| 91麻豆国产福利精品| 国产xxx精品视频大全| 免费观看30秒视频久久| 一区二区久久久久久| 欧美国产日韩在线观看| 精品成人一区二区| 欧美久久久久久蜜桃| 91蜜桃免费观看视频| 成人激情小说乱人伦| 黄色资源网久久资源365| 午夜成人在线视频| 亚洲va中文字幕| 亚洲一区在线观看免费观看电影高清 | 亚洲尤物在线视频观看| 亚洲人成亚洲人成在线观看图片| 欧美国产精品一区二区三区| 精品国产一区a| 欧美一区二区三区在线观看视频| 欧美三级在线看| 欧美日韩一区中文字幕| 在线视频综合导航| 91国产视频在线观看| 99riav久久精品riav| 国产suv一区二区三区88区| 国产精品一区二区在线看| 国产精品一级片| 国产精品小仙女| 成人午夜视频网站| av中文字幕在线不卡| 93久久精品日日躁夜夜躁欧美| 从欧美一区二区三区| 国产91精品免费| 成人18精品视频| 91在线视频播放| 在线亚洲人成电影网站色www| 日本道免费精品一区二区三区| 色综合久久六月婷婷中文字幕| 在线一区二区视频| 制服.丝袜.亚洲.另类.中文| 欧美一区二区视频免费观看| 精品成人一区二区三区| 欧美国产一区二区在线观看| 中文字幕字幕中文在线中不卡视频| 国产精品久久精品日日| 亚洲欧美日韩电影| 天天做天天摸天天爽国产一区 | 中文字幕 久热精品 视频在线| 国产精品理论片| 一区二区三区资源| 天堂影院一区二区| 久久99久久99精品免视看婷婷 | 久久久久久99精品| 欧美激情综合五月色丁香小说| 亚洲欧洲成人自拍| 亚洲成人久久影院| 国产一区二区三区视频在线播放 | 91国模大尺度私拍在线视频| 欧美精品久久久久久久多人混战 | 亚洲一区二区高清| 美女脱光内衣内裤视频久久网站 | 亚洲欧洲中文日韩久久av乱码| 亚洲午夜在线视频| 麻豆传媒一区二区三区| 国产.精品.日韩.另类.中文.在线.播放| 成人av免费网站| 91麻豆精品国产91久久久使用方法 | 9色porny自拍视频一区二区| 在线看国产一区二区| 91精品国产91久久久久久最新毛片| 2021中文字幕一区亚洲| 亚洲欧美国产77777| 精品一区二区三区在线观看| 91亚洲国产成人精品一区二三 | 亚洲国产精品久久一线不卡| 黄页视频在线91| 欧美三级蜜桃2在线观看| 久久久久97国产精华液好用吗| 亚洲影视资源网| 国产精品伊人色| 欧美日韩国产精选| 欧美激情一区在线| 日韩和欧美一区二区三区| 不卡大黄网站免费看| 日韩视频在线观看一区二区| 中文字幕一区二区三区视频 | 日韩一区有码在线| 久久精品99国产国产精| 在线一区二区观看| 国产精品看片你懂得| 久久激五月天综合精品| 欧美性猛片aaaaaaa做受| 国产欧美一区二区精品忘忧草| 全部av―极品视觉盛宴亚洲| 色综合中文字幕国产| 久久综合久久99| 日韩经典一区二区| 欧美日本不卡视频| 亚洲精品国产高清久久伦理二区| 丁香六月综合激情| 久久精品男人天堂av| 免费观看91视频大全| 欧美日韩大陆一区二区| 夜夜嗨av一区二区三区中文字幕 | 日本欧美大码aⅴ在线播放| 91久久免费观看| 最近日韩中文字幕| av在线不卡电影| 国产精品毛片无遮挡高清| 国产精品18久久久久久久久久久久 | 国产成人鲁色资源国产91色综| 91精品国产欧美一区二区成人| 亚洲综合视频在线观看| 在线视频欧美区| 亚洲尤物视频在线| 欧美三区免费完整视频在线观看| 亚洲最大色网站| 在线观看91精品国产入口| 洋洋成人永久网站入口| 91久久免费观看| 亚洲第一电影网| 欧美电影在线免费观看| 日韩国产精品久久| 日韩视频免费观看高清完整版在线观看| 性久久久久久久久久久久| 欧美一区二区三区在线看| 青青草97国产精品免费观看无弹窗版 | 日韩av一级电影| 91精品国产综合久久国产大片| 天堂成人国产精品一区| 日韩欧美另类在线| 激情五月激情综合网| 欧美激情一区二区三区| 99精品国产视频| 亚洲高清视频在线| 日韩视频永久免费| 丁香天五香天堂综合| 亚洲精品自拍动漫在线| 91精品中文字幕一区二区三区| 精品一区二区三区免费视频| 国产免费久久精品| 色综合久久久久| 日本午夜一本久久久综合| 久久影院电视剧免费观看| www.爱久久.com| 性做久久久久久久久| 精品粉嫩aⅴ一区二区三区四区| 波多野结衣精品在线| 亚洲国产日韩综合久久精品| 日韩免费看的电影| 波多野结衣精品在线| 日韩高清一区在线| 国产精品久久久爽爽爽麻豆色哟哟 | 亚洲一区二区三区在线播放|