⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 intel-agp.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	if (mask_type != 0 && mask_type != AGP_PHYS_MEMORY &&	    mask_type != INTEL_AGP_CACHED_MEMORY)		goto out_err;	if (!mem->is_flushed)		global_cache_flush();	for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {		writel(agp_bridge->driver->mask_memory(agp_bridge,			mem->memory[i], mask_type), intel_private.gtt+j);	}	readl(intel_private.gtt+j-1);	agp_bridge->driver->tlb_flush(mem); out:	ret = 0; out_err:	mem->is_flushed = 1;	return ret;}static int intel_i915_remove_entries(struct agp_memory *mem,off_t pg_start,				int type){	int i;	if (mem->page_count == 0)		return 0;	if (pg_start < intel_private.gtt_entries) {		printk (KERN_INFO PFX "Trying to disable local/stolen memory\n");		return -EINVAL;	}	for (i = pg_start; i < (mem->page_count + pg_start); i++) {		writel(agp_bridge->scratch_page, intel_private.gtt+i);	}	readl(intel_private.gtt+i-1);	agp_bridge->driver->tlb_flush(mem);	return 0;}/* Return the aperture size by just checking the resource length.  The effect * described in the spec of the MSAC registers is just changing of the * resource size. */static int intel_i9xx_fetch_size(void){	int num_sizes = ARRAY_SIZE(intel_i830_sizes);	int aper_size; /* size in megabytes */	int i;	aper_size = pci_resource_len(intel_private.pcidev, 2) / MB(1);	for (i = 0; i < num_sizes; i++) {		if (aper_size == intel_i830_sizes[i].size) {			agp_bridge->current_size = intel_i830_sizes + i;			agp_bridge->previous_size = agp_bridge->current_size;			return aper_size;		}	}	return 0;}/* The intel i915 automatically initializes the agp aperture during POST. * Use the memory already set aside for in the GTT. */static int intel_i915_create_gatt_table(struct agp_bridge_data *bridge){	int page_order;	struct aper_size_info_fixed *size;	int num_entries;	u32 temp, temp2;	int gtt_map_size = 256 * 1024;	size = agp_bridge->current_size;	page_order = size->page_order;	num_entries = size->num_entries;	agp_bridge->gatt_table_real = NULL;	pci_read_config_dword(intel_private.pcidev, I915_MMADDR, &temp);	pci_read_config_dword(intel_private.pcidev, I915_PTEADDR,&temp2);	if (IS_G33)	    gtt_map_size = 1024 * 1024; /* 1M on G33 */	intel_private.gtt = ioremap(temp2, gtt_map_size);	if (!intel_private.gtt)		return -ENOMEM;	temp &= 0xfff80000;	intel_private.registers = ioremap(temp,128 * 4096);	if (!intel_private.registers) {		iounmap(intel_private.gtt);		return -ENOMEM;	}	temp = readl(intel_private.registers+I810_PGETBL_CTL) & 0xfffff000;	global_cache_flush();	/* FIXME: ? */	/* we have to call this as early as possible after the MMIO base address is known */	intel_i830_init_gtt_entries();	agp_bridge->gatt_table = NULL;	agp_bridge->gatt_bus_addr = temp;	return 0;}/* * The i965 supports 36-bit physical addresses, but to keep * the format of the GTT the same, the bits that don't fit * in a 32-bit word are shifted down to bits 4..7. * * Gcc is smart enough to notice that "(addr >> 28) & 0xf0" * is always zero on 32-bit architectures, so no need to make * this conditional. */static unsigned long intel_i965_mask_memory(struct agp_bridge_data *bridge,	unsigned long addr, int type){	/* Shift high bits down */	addr |= (addr >> 28) & 0xf0;	/* Type checking must be done elsewhere */	return addr | bridge->driver->masks[type].mask;}/* The intel i965 automatically initializes the agp aperture during POST. * Use the memory already set aside for in the GTT. */static int intel_i965_create_gatt_table(struct agp_bridge_data *bridge){       int page_order;       struct aper_size_info_fixed *size;       int num_entries;       u32 temp;       size = agp_bridge->current_size;       page_order = size->page_order;       num_entries = size->num_entries;       agp_bridge->gatt_table_real = NULL;       pci_read_config_dword(intel_private.pcidev, I915_MMADDR, &temp);       temp &= 0xfff00000;       intel_private.gtt = ioremap((temp + (512 * 1024)) , 512 * 1024);	if (!intel_private.gtt)		return -ENOMEM;       intel_private.registers = ioremap(temp,128 * 4096);       if (!intel_private.registers) {		iounmap(intel_private.gtt);		return -ENOMEM;	}       temp = readl(intel_private.registers+I810_PGETBL_CTL) & 0xfffff000;       global_cache_flush();   /* FIXME: ? */       /* we have to call this as early as possible after the MMIO base address is known */       intel_i830_init_gtt_entries();       agp_bridge->gatt_table = NULL;       agp_bridge->gatt_bus_addr = temp;       return 0;}static int intel_fetch_size(void){	int i;	u16 temp;	struct aper_size_info_16 *values;	pci_read_config_word(agp_bridge->dev, INTEL_APSIZE, &temp);	values = A_SIZE_16(agp_bridge->driver->aperture_sizes);	for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) {		if (temp == values[i].size_value) {			agp_bridge->previous_size = agp_bridge->current_size = (void *) (values + i);			agp_bridge->aperture_size_idx = i;			return values[i].size;		}	}	return 0;}static int __intel_8xx_fetch_size(u8 temp){	int i;	struct aper_size_info_8 *values;	values = A_SIZE_8(agp_bridge->driver->aperture_sizes);	for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) {		if (temp == values[i].size_value) {			agp_bridge->previous_size =				agp_bridge->current_size = (void *) (values + i);			agp_bridge->aperture_size_idx = i;			return values[i].size;		}	}	return 0;}static int intel_8xx_fetch_size(void){	u8 temp;	pci_read_config_byte(agp_bridge->dev, INTEL_APSIZE, &temp);	return __intel_8xx_fetch_size(temp);}static int intel_815_fetch_size(void){	u8 temp;	/* Intel 815 chipsets have a _weird_ APSIZE register with only	 * one non-reserved bit, so mask the others out ... */	pci_read_config_byte(agp_bridge->dev, INTEL_APSIZE, &temp);	temp &= (1 << 3);	return __intel_8xx_fetch_size(temp);}static void intel_tlbflush(struct agp_memory *mem){	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2200);	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280);}static void intel_8xx_tlbflush(struct agp_memory *mem){	u32 temp;	pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp);	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp & ~(1 << 7));	pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp);	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp | (1 << 7));}static void intel_cleanup(void){	u16 temp;	struct aper_size_info_16 *previous_size;	previous_size = A_SIZE_16(agp_bridge->previous_size);	pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp);	pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp & ~(1 << 9));	pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, previous_size->size_value);}static void intel_8xx_cleanup(void){	u16 temp;	struct aper_size_info_8 *previous_size;	previous_size = A_SIZE_8(agp_bridge->previous_size);	pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp);	pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp & ~(1 << 9));	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, previous_size->size_value);}static int intel_configure(void){	u32 temp;	u16 temp2;	struct aper_size_info_16 *current_size;	current_size = A_SIZE_16(agp_bridge->current_size);	/* aperture size */	pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);	/* address to map to */	pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);	agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);	/* attbase - aperture base */	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);	/* agpctrl */	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280);	/* paccfg/nbxcfg */	pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp2);	pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG,			(temp2 & ~(1 << 10)) | (1 << 9));	/* clear any possible error conditions */	pci_write_config_byte(agp_bridge->dev, INTEL_ERRSTS + 1, 7);	return 0;}static int intel_815_configure(void){	u32 temp, addr;	u8 temp2;	struct aper_size_info_8 *current_size;	/* attbase - aperture base */	/* the Intel 815 chipset spec. says that bits 29-31 in the	* ATTBASE register are reserved -> try not to write them */	if (agp_bridge->gatt_bus_addr & INTEL_815_ATTBASE_MASK) {		printk (KERN_EMERG PFX "gatt bus addr too high");		return -EINVAL;	}	current_size = A_SIZE_8(agp_bridge->current_size);	/* aperture size */	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE,			current_size->size_value);	/* address to map to */	pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);	agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);	pci_read_config_dword(agp_bridge->dev, INTEL_ATTBASE, &addr);	addr &= INTEL_815_ATTBASE_MASK;	addr |= agp_bridge->gatt_bus_addr;	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, addr);	/* agpctrl */	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);	/* apcont */	pci_read_config_byte(agp_bridge->dev, INTEL_815_APCONT, &temp2);	pci_write_config_byte(agp_bridge->dev, INTEL_815_APCONT, temp2 | (1 << 1));	/* clear any possible error conditions */	/* Oddness : this chipset seems to have no ERRSTS register ! */	return 0;}static void intel_820_tlbflush(struct agp_memory *mem){	return;}static void intel_820_cleanup(void){	u8 temp;	struct aper_size_info_8 *previous_size;	previous_size = A_SIZE_8(agp_bridge->previous_size);	pci_read_config_byte(agp_bridge->dev, INTEL_I820_RDCR, &temp);	pci_write_config_byte(agp_bridge->dev, INTEL_I820_RDCR,			temp & ~(1 << 1));	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE,			previous_size->size_value);}static int intel_820_configure(void){	u32 temp;	u8 temp2;	struct aper_size_info_8 *current_size;	current_size = A_SIZE_8(agp_bridge->current_size);	/* aperture size */	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);	/* address to map to */	pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);	agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);	/* attbase - aperture base */	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);	/* agpctrl */	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);	/* global enable aperture access */	/* This flag is not accessed through MCHCFG register as in */	/* i850 chipset. */	pci_read_config_byte(agp_bridge->dev, INTEL_I820_RDCR, &temp2);	pci_write_config_byte(agp_bridge->dev, INTEL_I820_RDCR, temp2 | (1 << 1));	/* clear any possible AGP-related error conditions */	pci_write_config_word(agp_bridge->dev, INTEL_I820_ERRSTS, 0x001c);	return 0;}static int intel_840_configure(void){	u32 temp;	u16 temp2;	struct aper_size_info_8 *current_size;	current_size = A_SIZE_8(agp_bridge->current_size);	/* aperture size */	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);	/* address to map to */	pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);	agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);	/* attbase - aperture base */	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);	/* agpctrl */	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);	/* mcgcfg */	pci_read_config_word(agp_bridge->dev, INTEL_I840_MCHCFG, &temp2);	pci_write_config_word(agp_bridge->dev, INTEL_I840_MCHCFG, temp2 | (1 << 9));	/* clear any possible error conditions */	pci_write_config_word(agp_bridge->dev, INTEL_I840_ERRSTS, 0xc000);	return 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -