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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? eeprom.c

?? linux for amd development lx8
?? C
字號:
/* * Driver for the EEPROM encryption key storage on the Geode GX  * Copyright (C) 2003 Advanced Micro Devices, Inc.  All Rights Reserved. *//* This driver allows the user to read and write the 238 bytes of user   on the EEPROM.  This is the space above the access control bytes and   the hidden key, which couldn't be read even if we wanted to.  As far   as the user is concerned, he can seek, read and (if the bytes are set),   write up to 238 bytes of general storage.   Setting the key and the access control bytes is handled by the ioctl   commands.*/#include <linux/kernel.h>#include <linux/module.h>#include <linux/fs.h>#include <linux/miscdevice.h>#include <asm/io.h>#include <asm/uaccess.h>#include <asm/delay.h>#include "geode_crypto.h"static inteeprom_read_dev(struct geode_crypt_driver *driver, u8 *data, int offset, 		int size) {	u32 ctrl = readl(driver->base + EEPROM_CTRL_REG);	int i = 0;	int ret = -EINVAL;	/* Sanity check */	if (offset + size > 255) return -EINVAL;		/* Just a simple wait loop */		for(i = 0; i < size; i++) {		u32 reg = ctrl;		u32 value = 0;		writel(0x0 | ((offset + i) & 0xFF), 		       driver->base + EEPROM_ADDR_REG);				reg &= ~EEPROM_CTRL_WRITE;		reg |= EEPROM_CTRL_START;				writel(reg, driver->base + EEPROM_CTRL_REG);				while(1) {			reg = readl(driver->base + EEPROM_CTRL_REG);			if (reg & EEPROM_CTRL_EXCEPT) goto exit_read;			else if (!(reg & EEPROM_CTRL_START)) break;			udelay(10);		}		value = readl(driver->base + EEPROM_DATA_REG);		data[i] = value & 0xFF;    	}	ret = 0; exit_read:	writel(ctrl | EEPROM_CTRL_EXCEPT, driver->base + EEPROM_CTRL_REG);	return ret;}static int eeprom_write_dev(struct geode_crypt_driver *driver, u8 *data, 		 int offset, int size) {	int i = 0;	int ret = -EINVAL;	u32 in = readl(driver->base + EEPROM_SEC_REG);	u32 mask = offset < 127 ? EEPROM_ACCESS_WPL : EEPROM_ACCESS_WPU;	u32 ctrl = readl(driver->base + EEPROM_CTRL_REG);	/* Sanity check */	if (offset + size > 255) return -EINVAL;		/* Make sure that we have permission to write */	if ((in & mask) != mask) return -EACCES;		/* Just a simple wait loop */		for(i = 0; i < size; i++) {		u32 reg = 0;		writel(0x0 | ((offset + i) & 0xFF), 		       driver->base + EEPROM_ADDR_REG);		writel(0x0 | (data[i] & 0xFF), driver->base + EEPROM_DATA_REG);				writel(ctrl | EEPROM_CTRL_WRITE | EEPROM_CTRL_START,		       driver->base + EEPROM_CTRL_REG);		 while(1) {			 reg = readl(driver->base + EEPROM_CTRL_REG);			 if (reg & EEPROM_CTRL_EXCEPT) goto exit_write;			 else if (!(reg & EEPROM_CTRL_START)) break;			 udelay(10);		 }		 	}	ret = 0; exit_write:	writel(ctrl  | EEPROM_CTRL_EXCEPT, driver->base + EEPROM_CTRL_REG);	return ret;}static loff_t eeprom_lseek(struct file * file, loff_t offset, int orig) {			switch(orig) {	case 0:		if (offset < 0 || offset > 237) return -EINVAL;		file->f_pos = (unsigned int) offset;		return file->f_pos;			case 1:		if (file->f_pos + offset > 237) return -EINVAL;		if (file->f_pos + offset < 0) return -EINVAL;		file->f_pos += offset;		return file->f_pos;    	default:		return -EINVAL;	}}static ssize_t eeprom_write(struct file *filep, const char *buffer, 	     size_t count, loff_t * ppos) {	struct geode_crypt_driver *driver = 		(struct geode_crypt_driver *) filep->private_data;	u8 local[238]; 	int len, ret;		if (filep->f_pos > 237) return 0; 	len = (filep->f_pos + count > 237) ? 238 - filep->f_pos : count;	if (copy_from_user(local, buffer, len))		return -EFAULT;		down(&driver->eeprom_mutex); 	ret = eeprom_write_dev(driver, local, 18 + filep->f_pos, len);	up(&driver->eeprom_mutex);  	if (ret) return ret;			*ppos += len;	return len;}static ssize_t eeprom_read(struct file *filep, char *buffer, size_t count, loff_t * ppos) {		struct geode_crypt_driver *driver = 		(struct geode_crypt_driver *) filep->private_data;		u8 local[238]; 	int len, ret;	if (filep->f_pos > EEPROM_SIZE) return 0; 	len = (filep->f_pos + count > EEPROM_SIZE) 		? (EEPROM_SIZE + 1) - filep->f_pos : count;	down(&driver->eeprom_mutex); 	ret = eeprom_read_dev(driver, local, 			      EEPROM_ID_OFFSET + filep->f_pos, len);	up(&driver->eeprom_mutex);   	if (ret) return ret;  	if (copy_to_user(buffer, local, len))		return -EFAULT;	*ppos += len;	return len;}  static int eeprom_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, 	     unsigned long arg) {	struct geode_crypt_driver *driver = 		(struct geode_crypt_driver *) filp->private_data;	u32 in, mask;	/* Return -EINVAL if there is an exepction on the device */	in = readl(driver->base + EEPROM_CTRL_REG);	if (in & EEPROM_CTRL_EXCEPT) 	  return -EINVAL;	switch(cmd) {	case EIOCSKEYOFF:		in |= EEPROM_CTRL_KEYDISABLE;		writel(in, driver->base + EEPROM_CTRL_REG);		return 0;    	case EIOCSLOCKUP:	case EIOCSLOCKLW:		mask = (cmd == EIOCSLOCKLW) ? 			EEPROM_ACCESS_WPL : EEPROM_ACCESS_WPU;	  		in = readl(driver->base + EEPROM_SEC_REG);	  		/* If write access is enabled, then we can lock it */		/* This will take effect on the next reset */	  		if ((in & mask) == mask) {			char ctrl = 0x00;		  			eeprom_read_dev(driver, &ctrl, 0, 1);			ctrl &= ~mask;			eeprom_write_dev(driver, &ctrl, 0, 1);		}    		return 0;    	case EIOSKEY: {		u8 key[32];		if (!arg) return -EINVAL;		copy_from_user((u8 *) key, (u8 *) arg, sizeof(key));		return eeprom_write_dev(driver, (u8 *) key, 					EEPROM_KEY_OFFSET, 16);	}	case EIOGPERMS: {		int ret = 0;				in = readl(driver->base + EEPROM_SEC_REG);		if ((in & EEPROM_ACCESS_WPL) == EEPROM_ACCESS_WPL) 			ret |= EEPROM_LOWER_RW;		if ((in & EEPROM_ACCESS_WPU) == EEPROM_ACCESS_WPL) 			ret |= EEPROM_UPPER_RW;		return ret;	}	}	return -EINVAL;}extern struct geode_crypt_driver *crypto_driver;static int eeprom_open(struct inode * inode, struct file * filp) {	filp->private_data = (void *) crypto_driver;	return 0;}static struct file_operations geode_eeprom_fops = {	owner:          THIS_MODULE,	open:           eeprom_open,	read:           eeprom_read,	write:          eeprom_write,	llseek:         eeprom_lseek,	ioctl:		eeprom_ioctl,}; struct miscdevice geode_eeprom_device = {	GEODE_EEPROM_MINOR_DEV,	"geode_eeprom",	&geode_eeprom_fops};

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国内精品在线播放| 93久久精品日日躁夜夜躁欧美| 日本一区二区电影| 欧美男女性生活在线直播观看| 懂色av一区二区三区免费看| 天堂va蜜桃一区二区三区漫画版 | 99久久久精品| 久久国产尿小便嘘嘘尿| 亚洲影视在线播放| 中文字幕一区不卡| 欧美mv日韩mv国产网站app| 欧美在线不卡一区| 成人成人成人在线视频| 激情久久五月天| 日日夜夜免费精品视频| 亚洲男女毛片无遮挡| 一区二区三区色| 国产三级欧美三级| 91精品国产综合久久久久久久久久 | 欧美色图免费看| 成人深夜视频在线观看| 午夜国产不卡在线观看视频| 一区二区三区久久久| 国产精品欧美一级免费| 国产丝袜欧美中文另类| 精品99一区二区| 欧美一级电影网站| 欧美理论电影在线| 欧美日韩亚洲综合一区| 色一情一伦一子一伦一区| av中文一区二区三区| 丁香啪啪综合成人亚洲小说| 国产中文字幕一区| 国产精品99久| 高潮精品一区videoshd| 丁香网亚洲国际| 国产精品18久久久久| 国产精品资源站在线| 激情综合网av| 国产精品白丝jk白祙喷水网站 | 成人一区二区视频| 成人国产精品免费| 99精品视频免费在线观看| 99视频一区二区| 91捆绑美女网站| 欧美亚洲尤物久久| 91精品国产综合久久精品性色 | 日韩午夜三级在线| 精品日本一线二线三线不卡| 精品少妇一区二区三区在线播放| 日韩欧美www| 久久尤物电影视频在线观看| 国产欧美日韩卡一| 国产精品久久久久久妇女6080| 18欧美亚洲精品| 一区二区成人在线观看| 日本女人一区二区三区| 日本不卡免费在线视频| 国产麻豆视频一区| www.性欧美| 欧美午夜一区二区| 日韩精品专区在线影院重磅| 久久精品夜色噜噜亚洲aⅴ| 欧美激情综合五月色丁香小说| 国产精品成人免费| 五月天视频一区| 国产老女人精品毛片久久| 99国产精品久久久久久久久久久 | 欧美三级电影一区| 欧美一区二区日韩一区二区| 26uuu成人网一区二区三区| 国产欧美中文在线| 亚洲综合图片区| 欧美久久久影院| 国产亚洲一区二区在线观看| 亚洲精品老司机| 久久国产精品99精品国产| 成人手机电影网| 3751色影院一区二区三区| 国产女人18水真多18精品一级做| 亚洲麻豆国产自偷在线| 欧美aⅴ一区二区三区视频| 丁香婷婷综合激情五月色| 精品视频在线免费观看| 国产亚洲欧美激情| 亚洲国产日韩在线一区模特| 国内欧美视频一区二区 | 国产丝袜美腿一区二区三区| 亚洲综合免费观看高清完整版在线 | 蜜臀av国产精品久久久久| 国产成人免费在线观看不卡| 欧美在线一二三四区| 久久精品视频一区二区三区| 亚洲丰满少妇videoshd| 国产盗摄一区二区| 91精品国产乱| 亚洲一区在线视频| 成人精品高清在线| 欧美草草影院在线视频| 亚洲美女视频在线| 国产风韵犹存在线视精品| 欧美日韩国产成人在线免费| 国产精品久久久久婷婷二区次| 欧美bbbbb| 欧美日本视频在线| 中文字幕综合网| 国产成人在线免费观看| 欧美一区二区女人| 亚洲国产中文字幕在线视频综合| 成人免费电影视频| 久久久久99精品国产片| 六月丁香综合在线视频| 欧美日韩国产欧美日美国产精品| 国产精品欧美极品| 国产成人精品影视| 久久免费偷拍视频| 久久精品久久99精品久久| 69久久夜色精品国产69蝌蚪网| 亚洲精品视频在线观看网站| 成人福利视频网站| 久久精品亚洲国产奇米99| 精品在线视频一区| 日韩欧美一二区| 日韩制服丝袜先锋影音| 欧美视频一区二区三区四区 | 久久99精品久久久久久| 欧美裸体bbwbbwbbw| 午夜伊人狠狠久久| 欧美日韩一级片在线观看| 亚洲综合激情另类小说区| 色屁屁一区二区| 亚洲精品第1页| 91福利国产成人精品照片| 亚洲天堂成人在线观看| 99视频在线精品| 亚洲精品写真福利| 色婷婷久久久综合中文字幕| 亚洲女子a中天字幕| 91麻豆精品在线观看| 一区二区在线观看视频在线观看| 色呦呦国产精品| 亚洲黄色免费电影| 欧美性感一类影片在线播放| 亚州成人在线电影| 欧美高清激情brazzers| 色婷婷综合五月| 亚洲精品视频一区| 在线观看国产日韩| 日韩成人午夜电影| 日韩欧美在线综合网| 国产一区二区三区| 国产精品白丝在线| 欧美日韩在线不卡| 麻豆精品一区二区三区| 国产亚洲一区二区三区在线观看 | 国产色产综合色产在线视频| 风间由美一区二区三区在线观看 | 成人app在线| 亚洲图片有声小说| 日韩精品一区二区三区在线观看 | 久久9热精品视频| 国产欧美精品一区二区三区四区 | 欧美吻胸吃奶大尺度电影 | 中文字幕第一区综合| 99久久久精品免费观看国产蜜| 亚洲午夜av在线| 色综合av在线| 久久精品二区亚洲w码| 国产精品毛片久久久久久久| 欧美色图一区二区三区| 亚洲色图另类专区| 欧美一级日韩一级| 丁香婷婷综合网| 天天综合网天天综合色| 国产亚洲精品aa午夜观看| 日本韩国视频一区二区| 免费精品视频在线| 成人免费在线视频观看| 欧美一卡2卡三卡4卡5免费| 高清av一区二区| 人人狠狠综合久久亚洲| 欧美国产乱子伦| 3751色影院一区二区三区| 99天天综合性| 久久精工是国产品牌吗| 亚洲精品美国一| 久久久久久久久蜜桃| 欧美日本一区二区三区四区| 粉嫩在线一区二区三区视频| 午夜精品久久久久久不卡8050| 国产亚洲一区二区三区| 7777精品伊人久久久大香线蕉完整版| 成人免费看黄yyy456| 蜜桃视频在线一区| 亚洲一区中文日韩| 国产精品成人在线观看| 久久一区二区视频| 911精品国产一区二区在线| 91免费看视频| 国产成人精品三级|