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

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

?? init.c

?? ati driver
?? C
字號:
/*	Copyright (c) 2002, Thomas Kurschel	Part of Radeon kernel driver			Init and clean-up of devices		TBD: support for multiple virtual card per device is	not implemented yet - there is only one per device;	apart from additional device names, we need proper	management of graphics mem to not interfere.*/#include "radeon_driver.h"#include <PCI.h>#include <stdio.h>#include "../regs/dac_regs.h"#include "../shared/mmio.h"// helper macros for easier PCI access#define get_pci(o, s) (*pci_bus->read_pci_config)(pcii->bus, pcii->device, pcii->function, (o), (s))#define set_pci(o, s, v) (*pci_bus->write_pci_config)(pcii->bus, pcii->device, pcii->function, (o), (s), (v))// map frame buffer and registers// mmio_only - true = map registers only (used during detection)status_t Radeon_MapDevice( device_info *di, bool mmio_only ) {	// framebuffer is stored in PCI range 0, 	// register map in PCI range 2	int regs = 2;	int fb   = 0;	char buffer[100];	shared_info *si = di->si;	uint32	tmp;	pci_info *pcii = &(di->pcii);	status_t result;		SHOW_FLOW( 3, "device: %02X%02X%02X",		di->pcii.bus, di->pcii.device, di->pcii.function );		si->ROM_area = si->regs_area = si->memory[mt_local].area = 0;	// enable memory mapped IO and frame buffer	// also, enable bus mastering (some BIOSes seem to 	// disable that, like mine)	tmp = get_pci( PCI_command, 2 );	SHOW_FLOW( 3, "old PCI command state: 0x%08lx", tmp );		tmp |= PCI_command_io | PCI_command_memory | PCI_command_master;	set_pci( PCI_command, 2, tmp );	// registers cannot be accessed directly by user apps,	// they need to clone area for safety reasons	SHOW_INFO( 1, "physical address of memory-mapped I/O: 0x%8lx-0x%8lx", 		di->pcii.u.h0.base_registers[regs], 		di->pcii.u.h0.base_registers[regs] + di->pcii.u.h0.base_register_sizes[regs] - 1 );	sprintf( buffer, "%04X_%04X_%02X%02X%02X regs",		di->pcii.vendor_id, di->pcii.device_id,		di->pcii.bus, di->pcii.device, di->pcii.function );	si->regs_area = map_physical_memory(		buffer,		(void *) di->pcii.u.h0.base_registers[regs],		di->pcii.u.h0.base_register_sizes[regs],		B_ANY_KERNEL_ADDRESS,		/*// for "poke" debugging		B_READ_AREA + B_WRITE_AREA*/0,		(void **)&(di->regs));	if( si->regs_area < 0 ) 		return si->regs_area;	// that's all during detection as we have no clue about ROM or	// frame buffer at this point	if( mmio_only ) 		return B_OK;	// ROM must be explicetely mapped by applications too	sprintf( buffer, "%04X_%04X_%02X%02X%02X ROM",		di->pcii.vendor_id, di->pcii.device_id,		di->pcii.bus, di->pcii.device, di->pcii.function );	si->ROM_area = map_physical_memory(		buffer,		(void *) di->rom.phys_address,		di->rom.size,		B_ANY_KERNEL_ADDRESS,		0,		(void **)&(di->rom.rom_ptr));	if( si->ROM_area < 0 ) {		result = si->ROM_area;		goto err2;	}					if( di->pcii.u.h0.base_register_sizes[fb] > di->local_mem_size ) {		// Radeons allocate more address range then really needed ->		// only map the area that contains physical memory		SHOW_INFO( 1, "restrict frame buffer from 0x%8lx to 0x%8lx bytes", 			di->pcii.u.h0.base_register_sizes[fb],			di->local_mem_size		);		di->pcii.u.h0.base_register_sizes[fb] = di->local_mem_size;	}	// framebuffer can be accessed by everyone	// this is not a perfect solution; preferably, only	// those areas owned by an application are mapped into	// its address space	// (this hack is needed by BeOS to write something onto screen in KDL)	SHOW_INFO( 1, "physical address of framebuffer: 0x%8lx-0x%8lx", 		di->pcii.u.h0.base_registers[fb], 		di->pcii.u.h0.base_registers[fb] + di->pcii.u.h0.base_register_sizes[fb] - 1 );	sprintf(buffer, "%04X_%04X_%02X%02X%02X framebuffer",		di->pcii.vendor_id, di->pcii.device_id,		di->pcii.bus, di->pcii.device, di->pcii.function);	si->memory[mt_local].area = map_physical_memory(		buffer,		(void *) di->pcii.u.h0.base_registers[fb],		di->pcii.u.h0.base_register_sizes[fb],		B_ANY_KERNEL_BLOCK_ADDRESS | B_MTR_WC,		B_READ_AREA + B_WRITE_AREA,		(void **)&(si->local_mem));	if( si->memory[mt_local].area < 0 ) {		SHOW_FLOW0( 3, "couldn't enable WC for frame buffer" );		si->memory[mt_local].area = map_physical_memory(			buffer,			(void *) di->pcii.u.h0.base_registers[fb],			di->pcii.u.h0.base_register_sizes[fb],			B_ANY_KERNEL_BLOCK_ADDRESS,			B_READ_AREA + B_WRITE_AREA,			(void **)&(si->local_mem));	}	SHOW_FLOW( 3, "mapped frame buffer @%p", si->local_mem );	if( si->memory[mt_local].area < 0 ) {		result = si->memory[mt_local].area;		goto err;	}		// save physical address though noone can probably make	// any use of it	si->framebuffer_pci = (void *) di->pcii.u.h0.base_registers_pci[fb];		return B_OK;err:	delete_area( si->ROM_area );err2:	delete_area( si->regs_area );	return result;}// unmap PCI rangesvoid Radeon_UnmapDevice(device_info *di) {	shared_info *si = di->si;	pci_info *pcii = &(di->pcii);	uint32 tmp;	SHOW_FLOW0( 3, "" );	// disable PCI ranges (though it probably won't	// hurt	leaving them enabled)	tmp = get_pci( PCI_command, 2 );	tmp &= ~PCI_command_io | PCI_command_memory | PCI_command_master;	set_pci( PCI_command, 2, tmp );	if( si->regs_area > 0 )		delete_area( si->regs_area );			if( si->ROM_area > 0 )		delete_area( si->ROM_area );			if( si->memory[mt_local].area > 0 )		delete_area( si->memory[mt_local].area );			si->regs_area = si->ROM_area = si->memory[mt_local].area = 0;}// initialize shared infos on first openstatus_t Radeon_FirstOpen( device_info *di ){	status_t result;	char buffer[100];	// B_OS_NAME_LENGTH is too short	shared_info *si;	//uint32 /*dma_block, */dma_offset;	// create shared info; don't allow access by apps -	// they'll clone it 	sprintf( buffer, "%04X_%04X_%02X%02X%02X shared",		di->pcii.vendor_id, di->pcii.device_id,		di->pcii.bus, di->pcii.device, di->pcii.function );	di->shared_area = create_area(		buffer, 		(void **)&(di->si), 		B_ANY_KERNEL_ADDRESS, 		(sizeof(shared_info) + (B_PAGE_SIZE - 1)) & ~(B_PAGE_SIZE - 1), 		B_FULL_LOCK, 0);	if (di->shared_area < 0) {		result = di->shared_area;		goto err8;	}		memset( di->si, 0, sizeof( *di->si ));		si = di->si;		si->log = log_init( 1000000 );	// copy all info into shared info	si->vendor_id = di->pcii.vendor_id;	si->device_id = di->pcii.device_id;	si->revision = di->pcii.revision;		si->asic = di->asic;	si->is_mobility = di->is_mobility;	si->tv_chip = di->tv_chip;	si->new_pll = di->new_pll;		// detecting theatre channel in kernel would lead to code duplication,	// so we let the first accelerant take care of it	si->theatre_channel = -1;	/*	si->ports[0].disp_type = di->disp_type[0];	si->ports[1].disp_type = di->disp_type[1];*/	si->crtc[0].crtc_idx = 0;	si->crtc[0].flatpanel_port = 0;	si->crtc[1].crtc_idx = 1;	si->crtc[1].flatpanel_port = 1;	si->num_crtc = di->num_crtc;		si->flatpanels[0] = di->fp_info;	si->pll = di->pll;/*	si->ram = di->ram;	strcpy( si->ram_type, di->ram_type );*/	//si->local_mem_size = di->local_mem_size;			// create virtual card info; don't allow access by apps -	// they'll clone it 	sprintf( buffer, "%04X_%04X_%02X%02X%02X virtual card 0",		di->pcii.vendor_id, di->pcii.device_id,		di->pcii.bus, di->pcii.device, di->pcii.function );		di->virtual_card_area = create_area(		buffer, 		(void **)&(di->vc), 		B_ANY_KERNEL_ADDRESS, 		(sizeof(virtual_card) + (B_PAGE_SIZE - 1)) & ~(B_PAGE_SIZE - 1), 		B_FULL_LOCK, 0);	if (di->virtual_card_area < 0) {		result = di->virtual_card_area;		goto err7;	}	// currently, we assign fixed ports to this virtual card	di->vc->assigned_crtc[0] = true;	di->vc->assigned_crtc[1] = si->num_crtc > 1;	di->vc->controlled_displays = 		dd_tv_crt | dd_crt | dd_lvds | dd_dvi | dd_ctv | dd_stv;	di->vc->fb_mem_handle = 0;	di->vc->cursor.mem_handle = 0;		// create unique id	di->vc->id = di->virtual_card_area;		result = Radeon_MapDevice( di, false );	if (result < 0) 		goto err6;			// save dac2_cntl register	// on M6, we need to restore that during uninit, else you only get	// garbage on screen on reboot if both CRTCs are used	if( di->asic == rt_m6 )		di->dac2_cntl = INREG( di->regs, RADEON_DAC_CNTL2 );		result = Radeon_InitPCIGART( di );	if( result < 0 )		goto err5;		si->memory[mt_local].size = di->local_mem_size;			si->memory[mt_PCI].area = di->pci_gart.buffer.area;	si->memory[mt_PCI].size = di->pci_gart.buffer.size;	// currently, defaultnon-local memory is PCI memory	si->nonlocal_type = mt_PCI;	Radeon_InitMemController( di );			// currently, we don't support VBI - something is broken there	// (it doesn't change a thing apart from crashing)	result = Radeon_SetupIRQ( di, buffer );	if( result < 0 )		goto err4;	// resolution of 2D register is 1K, resolution of CRTC etc. is higher,	// so 1K is the minimum block size;	// (CP cannot use local mem)	di->memmgr[mt_local] = mem_init( 0, di->local_mem_size, 1024, 		di->local_mem_size / 1024 );	if( di->memmgr[mt_local] == NULL ) {		result = B_NO_MEMORY;		goto err3;	}	// CP requires 4K alignment, which is the most restrictive I found	di->memmgr[mt_PCI] = mem_init( 0, di->pci_gart.buffer.size, 4096, 		di->pci_gart.buffer.size / 4096 );	if( di->memmgr[mt_PCI] == NULL ) {		result = B_NO_MEMORY;		goto err2;	}	// no AGP support		di->memmgr[mt_AGP] = NULL;		// fix AGP settings for IGP chipset	if( di->asic == rt_rs100 || di->asic == rt_rs200 )		Radeon_Fix_AGP();	// time to init Command Processor	result = Radeon_InitCP( di );	if( result != B_OK )		goto err;			result = Radeon_InitDMA( di );	if( result != B_OK )		goto err0;	//	mem_alloc( di->local_memmgr, 0x100000, (void *)-1, &dma_block, &dma_offset );/*	dma_offset = 15 * 1024 * 1024;		si->nonlocal_mem = (uint32 *)((uint32)si->framebuffer + dma_offset);	si->nonlocal_vm_start = (uint32)si->framebuffer_pci + dma_offset;*/		return B_OK;err0:	Radeon_UninitCP( di );err:	mem_destroy( di->memmgr[mt_PCI] );err2:	mem_destroy( di->memmgr[mt_local] );	err3:	Radeon_CleanupIRQ( di );err4:	Radeon_CleanupPCIGART( di );err5:	Radeon_UnmapDevice( di );err6:	delete_area( di->virtual_card_area );err7:	delete_area( di->shared_area );err8:	return result;}// clean up shared info on last close// (we could for device destruction, but this makes// testing easier as everythings gets cleaned up // during tests)void Radeon_LastClose( device_info *di ){	Radeon_UninitCP( di );	// M6 fix - unfortunately, the device is never closed by app_server,	// not even before reboot	if( di->asic == rt_m6 )		OUTREG( di->regs, RADEON_DAC_CNTL2, di->dac2_cntl );			mem_destroy( di->memmgr[mt_local] );		if( di->memmgr[mt_PCI] )		mem_destroy( di->memmgr[mt_PCI] );			if( di->memmgr[mt_AGP] )		mem_destroy( di->memmgr[mt_AGP] );		Radeon_CleanupIRQ( di );	Radeon_CleanupPCIGART( di );	Radeon_UnmapDevice(di);		log_exit( di->si->log );	delete_area( di->virtual_card_area );	delete_area( di->shared_area );}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产91综合一区在线观看| 中文字幕av在线一区二区三区| 伊人夜夜躁av伊人久久| 91丝袜美女网| 国产精品色一区二区三区| 99re这里只有精品6| 亚洲精品高清视频在线观看| 欧美三级电影精品| 久久精品国产免费看久久精品| 欧美激情资源网| 欧美精品v日韩精品v韩国精品v| 亚洲综合偷拍欧美一区色| 欧美一级高清片| 国产91精品一区二区| 亚洲成av人片在www色猫咪| 久久精品日韩一区二区三区| 色噜噜狠狠成人中文综合| 久久激五月天综合精品| 国产精品国产三级国产普通话蜜臀 | 久久99精品一区二区三区三区| 日韩免费观看2025年上映的电影 | 日韩美女视频在线| 亚洲高清免费在线| 3d动漫精品啪啪1区2区免费 | 婷婷中文字幕综合| 欧美一卡二卡三卡四卡| 麻豆精品精品国产自在97香蕉| 精品国产免费一区二区三区四区 | 最新不卡av在线| 欧美三级中文字幕| 暴力调教一区二区三区| 粗大黑人巨茎大战欧美成人| 一区二区三区在线视频免费| 欧美va亚洲va香蕉在线| caoporn国产精品| 狠狠色狠狠色综合系列| 亚洲一区二区三区中文字幕| 久久综合久色欧美综合狠狠| 欧美浪妇xxxx高跟鞋交| 91蜜桃网址入口| 99在线精品一区二区三区| 国模无码大尺度一区二区三区| 亚洲午夜在线电影| 一区二区三区国产| 亚洲视频一区在线| 最新热久久免费视频| 久久久99免费| 欧美精品一区二| 日本一区二区三区高清不卡| 欧美成人三级电影在线| 91精品国产麻豆国产自产在线| 色综合天天综合网国产成人综合天| 成人免费黄色在线| 在线观看不卡视频| av一区二区不卡| 亚洲在线一区二区三区| 国产亚洲欧洲997久久综合| 日韩一二三四区| 久久久久国产精品厨房| 免费在线成人网| 欧美成人vps| 午夜精品久久久久久久久| 日韩精品资源二区在线| www.日韩大片| 亚洲高清在线精品| 奇米一区二区三区| 国产精品美女一区二区在线观看| 欧美美女直播网站| 国产精品456| 香蕉久久一区二区不卡无毒影院| 中文字幕成人网| 中日韩av电影| 亚洲第一电影网| 国产综合一区二区| 97久久精品人人做人人爽50路| www.色综合.com| 91精品国产综合久久久久久久| 日韩亚洲国产中文字幕欧美| 久久久av毛片精品| 一区二区三区日本| 天堂午夜影视日韩欧美一区二区| 奇米精品一区二区三区在线观看一| 精品一区二区三区免费| 99麻豆久久久国产精品免费优播| 欧美日精品一区视频| 亚洲精品在线免费播放| 亚洲欧美一区二区三区孕妇| 麻豆91精品视频| 91一区二区在线观看| 日韩精品一区二区三区视频| 欧美激情中文不卡| 日韩国产欧美在线播放| 99久久99久久久精品齐齐| 欧美一区二区在线播放| 亚洲区小说区图片区qvod| 国产一区二区三区四| 欧美精品乱码久久久久久按摩| 亚洲国产高清在线观看视频| 狠狠久久亚洲欧美| 日韩一区二区三区视频在线观看| 亚洲免费观看在线观看| 99久久婷婷国产综合精品电影| 国产91在线观看| 日本高清不卡一区| xnxx国产精品| 午夜精品福利一区二区三区av| 在线影院国内精品| 国产毛片精品一区| 自拍偷拍欧美激情| 一本久久a久久精品亚洲| 国产成人精品www牛牛影视| 奇米影视一区二区三区| 水野朝阳av一区二区三区| 一区二区三区**美女毛片| 日韩精品电影在线| 亚洲国产你懂的| 亚洲精品高清在线| 亚洲欧美影音先锋| 国产精品五月天| 国产欧美日韩麻豆91| jlzzjlzz欧美大全| 久久久国际精品| 国产精品18久久久久久久久久久久 | 日本不卡一二三区黄网| 一本久道久久综合中文字幕 | 欧美精品在线视频| 最新久久zyz资源站| 成人av网址在线观看| 中文字幕成人av| 欧美三级一区二区| 亚洲国产日韩综合久久精品| 欧美午夜在线观看| 天天av天天翘天天综合网| 欧美一区二区精品久久911| 日本伊人色综合网| www亚洲一区| 成人在线视频一区二区| 一区二区三区在线免费播放| 在线亚洲一区二区| 午夜成人免费电影| 精品福利一区二区三区| 色偷偷久久一区二区三区| 一区二区三区中文字幕| 精品国产乱码久久久久久久| 懂色av一区二区三区免费观看| 亚洲国产精品尤物yw在线观看| 国产清纯在线一区二区www| 欧美特级限制片免费在线观看| 韩日欧美一区二区三区| 日韩av一区二区在线影视| 26uuu另类欧美亚洲曰本| 另类小说综合欧美亚洲| 日韩三级电影网址| 国产精品99久久久久久似苏梦涵 | 蜜臀精品一区二区三区在线观看 | 91视频91自| 色老头久久综合| 欧美二区在线观看| 91麻豆免费观看| 久久99精品久久久久久动态图| 国产三级三级三级精品8ⅰ区| av欧美精品.com| 另类中文字幕网| 亚洲国产日韩一级| 久久久国产精品不卡| 欧美日韩在线不卡| 国内精品免费**视频| 亚洲少妇最新在线视频| 亚洲精品一线二线三线无人区| av在线不卡电影| 极品销魂美女一区二区三区| 亚洲男人的天堂在线aⅴ视频| 日韩欧美一区二区在线视频| 色婷婷亚洲精品| 成人网男人的天堂| 激情小说亚洲一区| 日韩中文欧美在线| 亚洲电影激情视频网站| 亚洲欧洲三级电影| 中文字幕不卡在线观看| 26uuu国产电影一区二区| 欧美剧在线免费观看网站| 在线视频一区二区免费| av毛片久久久久**hd| 国产精品1024| 国产精品99久久久久久宅男| 久久99国产精品久久| 亚洲va欧美va国产va天堂影院| 亚洲久本草在线中文字幕| 日韩极品在线观看| 午夜免费久久看| 日本视频免费一区| 亚洲成av人在线观看| 国产欧美一区在线| 国产精品日产欧美久久久久| 国产欧美一区二区精品性| 久久精品夜色噜噜亚洲aⅴ| 全部av―极品视觉盛宴亚洲| 欧美久久高跟鞋激| 青青草国产成人99久久|