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

📄 intel-agp.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 4 页
字号:
	page_order = size->page_order;	num_entries = size->num_entries;	agp_bridge->gatt_table_real = NULL;	pci_read_config_dword(intel_i830_private.i830_dev,I810_MMADDR,&temp);	temp &= 0xfff80000;	intel_i830_private.registers = ioremap(temp,128 * 4096);	if (!intel_i830_private.registers)		return -ENOMEM;	temp = readl(intel_i830_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;}/* Return the gatt table to a sane state. Use the top of stolen * memory for the GTT. */static int intel_i830_free_gatt_table(struct agp_bridge_data *bridge){	return 0;}static int intel_i830_fetch_size(void){	u16 gmch_ctrl;	struct aper_size_info_fixed *values;	values = A_SIZE_FIX(agp_bridge->driver->aperture_sizes);	if (agp_bridge->dev->device != PCI_DEVICE_ID_INTEL_82830_HB &&	    agp_bridge->dev->device != PCI_DEVICE_ID_INTEL_82845G_HB) {		/* 855GM/852GM/865G has 128MB aperture size */		agp_bridge->previous_size = agp_bridge->current_size = (void *) values;		agp_bridge->aperture_size_idx = 0;		return values[0].size;	}	pci_read_config_word(agp_bridge->dev,I830_GMCH_CTRL,&gmch_ctrl);	if ((gmch_ctrl & I830_GMCH_MEM_MASK) == I830_GMCH_MEM_128M) {		agp_bridge->previous_size = agp_bridge->current_size = (void *) values;		agp_bridge->aperture_size_idx = 0;		return values[0].size;	} else {		agp_bridge->previous_size = agp_bridge->current_size = (void *) (values + 1);		agp_bridge->aperture_size_idx = 1;		return values[1].size;	}	return 0;}static int intel_i830_configure(void){	struct aper_size_info_fixed *current_size;	u32 temp;	u16 gmch_ctrl;	int i;	current_size = A_SIZE_FIX(agp_bridge->current_size);	pci_read_config_dword(intel_i830_private.i830_dev,I810_GMADDR,&temp);	agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);	pci_read_config_word(agp_bridge->dev,I830_GMCH_CTRL,&gmch_ctrl);	gmch_ctrl |= I830_GMCH_ENABLED;	pci_write_config_word(agp_bridge->dev,I830_GMCH_CTRL,gmch_ctrl);	writel(agp_bridge->gatt_bus_addr|I810_PGETBL_ENABLED, intel_i830_private.registers+I810_PGETBL_CTL);	readl(intel_i830_private.registers+I810_PGETBL_CTL);	/* PCI Posting. */	if (agp_bridge->driver->needs_scratch_page) {		for (i = intel_i830_private.gtt_entries; i < current_size->num_entries; i++) {			writel(agp_bridge->scratch_page, intel_i830_private.registers+I810_PTE_BASE+(i*4));			readl(intel_i830_private.registers+I810_PTE_BASE+(i*4));	/* PCI Posting. */		}	}	global_cache_flush();	return 0;}static void intel_i830_cleanup(void){	iounmap(intel_i830_private.registers);}static int intel_i830_insert_entries(struct agp_memory *mem,off_t pg_start, int type){	int i,j,num_entries;	void *temp;	temp = agp_bridge->current_size;	num_entries = A_SIZE_FIX(temp)->num_entries;	if (pg_start < intel_i830_private.gtt_entries) {		printk (KERN_DEBUG PFX "pg_start == 0x%.8lx,intel_i830_private.gtt_entries == 0x%.8x\n",				pg_start,intel_i830_private.gtt_entries);		printk (KERN_INFO PFX "Trying to insert into local/stolen memory\n");		return -EINVAL;	}	if ((pg_start + mem->page_count) > num_entries)		return -EINVAL;	/* The i830 can't check the GTT for entries since its read only,	 * depend on the caller to make the correct offset decisions.	 */	if ((type != 0 && type != AGP_PHYS_MEMORY) ||		(mem->type != 0 && mem->type != AGP_PHYS_MEMORY))		return -EINVAL;	global_cache_flush();	/* FIXME: Necessary ?*/	for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {		writel(agp_bridge->driver->mask_memory(agp_bridge,			mem->memory[i], mem->type),			intel_i830_private.registers+I810_PTE_BASE+(j*4));		readl(intel_i830_private.registers+I810_PTE_BASE+(j*4));	/* PCI Posting. */	}	global_cache_flush();	agp_bridge->driver->tlb_flush(mem);	return 0;}static int intel_i830_remove_entries(struct agp_memory *mem,off_t pg_start,				int type){	int i;	global_cache_flush();	if (pg_start < intel_i830_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_i830_private.registers+I810_PTE_BASE+(i*4));		readl(intel_i830_private.registers+I810_PTE_BASE+(i*4));	/* PCI Posting. */	}	global_cache_flush();	agp_bridge->driver->tlb_flush(mem);	return 0;}static struct agp_memory *intel_i830_alloc_by_type(size_t pg_count,int type){	if (type == AGP_PHYS_MEMORY)		return alloc_agpphysmem_i8xx(pg_count, type);	/* always return NULL for other allocation types for now */	return NULL;}static int intel_i915_configure(void){	struct aper_size_info_fixed *current_size;	u32 temp;	u16 gmch_ctrl;	int i;	current_size = A_SIZE_FIX(agp_bridge->current_size);	pci_read_config_dword(intel_i830_private.i830_dev, I915_GMADDR, &temp);	agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);	pci_read_config_word(agp_bridge->dev,I830_GMCH_CTRL,&gmch_ctrl);	gmch_ctrl |= I830_GMCH_ENABLED;	pci_write_config_word(agp_bridge->dev,I830_GMCH_CTRL,gmch_ctrl);	writel(agp_bridge->gatt_bus_addr|I810_PGETBL_ENABLED, intel_i830_private.registers+I810_PGETBL_CTL);	readl(intel_i830_private.registers+I810_PGETBL_CTL);	/* PCI Posting. */	if (agp_bridge->driver->needs_scratch_page) {		for (i = intel_i830_private.gtt_entries; i < current_size->num_entries; i++) {			writel(agp_bridge->scratch_page, intel_i830_private.gtt+i);			readl(intel_i830_private.gtt+i);	/* PCI Posting. */		}	}	global_cache_flush();	return 0;}static void intel_i915_cleanup(void){	iounmap(intel_i830_private.gtt);	iounmap(intel_i830_private.registers);}static int intel_i915_insert_entries(struct agp_memory *mem,off_t pg_start,				int type){	int i,j,num_entries;	void *temp;	temp = agp_bridge->current_size;	num_entries = A_SIZE_FIX(temp)->num_entries;	if (pg_start < intel_i830_private.gtt_entries) {		printk (KERN_DEBUG PFX "pg_start == 0x%.8lx,intel_i830_private.gtt_entries == 0x%.8x\n",				pg_start,intel_i830_private.gtt_entries);		printk (KERN_INFO PFX "Trying to insert into local/stolen memory\n");		return -EINVAL;	}	if ((pg_start + mem->page_count) > num_entries)		return -EINVAL;	/* The i830 can't check the GTT for entries since its read only,	 * depend on the caller to make the correct offset decisions.	 */	if ((type != 0 && type != AGP_PHYS_MEMORY) ||		(mem->type != 0 && mem->type != AGP_PHYS_MEMORY))		return -EINVAL;	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], mem->type), intel_i830_private.gtt+j);		readl(intel_i830_private.gtt+j);	/* PCI Posting. */	}	global_cache_flush();	agp_bridge->driver->tlb_flush(mem);	return 0;}static int intel_i915_remove_entries(struct agp_memory *mem,off_t pg_start,				int type){	int i;	global_cache_flush();	if (pg_start < intel_i830_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_i830_private.gtt+i);		readl(intel_i830_private.gtt+i);	}	global_cache_flush();	agp_bridge->driver->tlb_flush(mem);	return 0;}static int intel_i915_fetch_size(void){	struct aper_size_info_fixed *values;	u32 temp, offset = 0;#define I915_256MB_ADDRESS_MASK (1<<27)	values = A_SIZE_FIX(agp_bridge->driver->aperture_sizes);	pci_read_config_dword(intel_i830_private.i830_dev, I915_GMADDR, &temp);	if (temp & I915_256MB_ADDRESS_MASK)		offset = 0;	/* 128MB aperture */	else		offset = 2;	/* 256MB aperture */	agp_bridge->previous_size = agp_bridge->current_size = (void *)(values + offset);	return values[offset].size;}/* 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;	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_i830_private.i830_dev, I915_MMADDR, &temp);	pci_read_config_dword(intel_i830_private.i830_dev, I915_PTEADDR,&temp2);	intel_i830_private.gtt = ioremap(temp2, 256 * 1024);	if (!intel_i830_private.gtt)		return -ENOMEM;	temp &= 0xfff80000;	intel_i830_private.registers = ioremap(temp,128 * 4096);	if (!intel_i830_private.registers)		return -ENOMEM;	temp = readl(intel_i830_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 */

⌨️ 快捷键说明

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