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

📄 pmac_setup.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
	l = strlen(node->full_name);	if (bootpath != NULL && bootdevice != NULL	    && strncmp(node->full_name, bootdevice, l) == 0	    && (bootdevice[l] == '/' || bootdevice[l] == 0)) {		boot_host = host;		/*		 * There's a bug in OF 1.0.5.  (Why am I not surprised.)		 * If you pass a path like scsi/sd@1:0 to canon, it returns		 * something like /bandit@F2000000/gc@10/53c94@10000/sd@0,0		 * That is, the scsi target number doesn't get preserved.		 * So we pick the target number out of bootpath and use that.		 */		p = strstr(bootpath, "/sd@");		if (p != NULL) {			p += 4;			boot_target = simple_strtoul(p, NULL, 10);			p = strchr(p, ':');			if (p != NULL)				boot_part = simple_strtoul(p + 1, NULL, 10);		}	}}#endif#if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC)static dev_t __initfind_ide_boot(void){	char *p;	int n;	dev_t __init pmac_find_ide_boot(char *bootdevice, int n);	if (bootdevice == NULL)		return 0;	p = strrchr(bootdevice, '/');	if (p == NULL)		return 0;	n = p - bootdevice;	return pmac_find_ide_boot(bootdevice, n);}#endif /* CONFIG_BLK_DEV_IDE && CONFIG_BLK_DEV_IDE_PMAC */static void __initfind_boot_device(void){#if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC)	boot_dev = find_ide_boot();#endif}static int initializing = 1;/* TODO: Merge the suspend-to-ram with the common code !!! * currently, this is a stub implementation for suspend-to-disk * only */#ifdef CONFIG_SOFTWARE_SUSPENDstatic int pmac_pm_prepare(suspend_state_t state){	printk(KERN_DEBUG "%s(%d)\n", __FUNCTION__, state);	return 0;}static int pmac_pm_enter(suspend_state_t state){	printk(KERN_DEBUG "%s(%d)\n", __FUNCTION__, state);	/* Giveup the lazy FPU & vec so we don't have to back them	 * up from the low level code	 */	enable_kernel_fp();#ifdef CONFIG_ALTIVEC	if (cur_cpu_spec->cpu_features & CPU_FTR_ALTIVEC)		enable_kernel_altivec();#endif /* CONFIG_ALTIVEC */	return 0;}static int pmac_pm_finish(suspend_state_t state){	printk(KERN_DEBUG "%s(%d)\n", __FUNCTION__, state);	/* Restore userland MMU context */	set_context(current->active_mm->context, current->active_mm->pgd);	return 0;}static struct pm_ops pmac_pm_ops = {	.pm_disk_mode	= PM_DISK_SHUTDOWN,	.prepare	= pmac_pm_prepare,	.enter		= pmac_pm_enter,	.finish		= pmac_pm_finish,};#endif /* CONFIG_SOFTWARE_SUSPEND */static int pmac_late_init(void){	initializing = 0;#ifdef CONFIG_SOFTWARE_SUSPEND	pm_set_ops(&pmac_pm_ops);#endif /* CONFIG_SOFTWARE_SUSPEND */	return 0;}late_initcall(pmac_late_init);/* can't be __init - can be called whenever a disk is first accessed */voidnote_bootable_part(dev_t dev, int part, int goodness){	static int found_boot = 0;	char *p;	if (!initializing)		return;	if ((goodness <= current_root_goodness) &&	    ROOT_DEV != DEFAULT_ROOT_DEVICE)		return;	p = strstr(saved_command_line, "root=");	if (p != NULL && (p == saved_command_line || p[-1] == ' '))		return;	if (!found_boot) {		find_boot_device();		found_boot = 1;	}	if (!boot_dev || dev == boot_dev) {		ROOT_DEV = dev + part;		boot_dev = 0;		current_root_goodness = goodness;	}}static voidpmac_restart(char *cmd){#ifdef CONFIG_ADB_CUDA	struct adb_request req;#endif /* CONFIG_ADB_CUDA */	switch (sys_ctrler) {#ifdef CONFIG_ADB_CUDA	case SYS_CTRLER_CUDA:		cuda_request(&req, NULL, 2, CUDA_PACKET,			     CUDA_RESET_SYSTEM);		for (;;)			cuda_poll();		break;#endif /* CONFIG_ADB_CUDA */#ifdef CONFIG_ADB_PMU	case SYS_CTRLER_PMU:		pmu_restart();		break;#endif /* CONFIG_ADB_PMU */	default: ;	}}static voidpmac_power_off(void){#ifdef CONFIG_ADB_CUDA	struct adb_request req;#endif /* CONFIG_ADB_CUDA */	switch (sys_ctrler) {#ifdef CONFIG_ADB_CUDA	case SYS_CTRLER_CUDA:		cuda_request(&req, NULL, 2, CUDA_PACKET,			     CUDA_POWERDOWN);		for (;;)			cuda_poll();		break;#endif /* CONFIG_ADB_CUDA */#ifdef CONFIG_ADB_PMU	case SYS_CTRLER_PMU:		pmu_shutdown();		break;#endif /* CONFIG_ADB_PMU */	default: ;	}}static voidpmac_halt(void){   pmac_power_off();}/* * Read in a property describing some pieces of memory. */static int __initget_mem_prop(char *name, struct mem_pieces *mp){	struct reg_property *rp;	int i, s;	unsigned int *ip;	int nac = prom_n_addr_cells(memory_node);	int nsc = prom_n_size_cells(memory_node);	ip = (unsigned int *) get_property(memory_node, name, &s);	if (ip == NULL) {		printk(KERN_ERR "error: couldn't get %s property on /memory\n",		       name);		return 0;	}	s /= (nsc + nac) * 4;	rp = mp->regions;	for (i = 0; i < s; ++i, ip += nac+nsc) {		if (nac >= 2 && ip[nac-2] != 0)			continue;		rp->address = ip[nac-1];		if (nsc >= 2 && ip[nac+nsc-2] != 0)			rp->size = ~0U;		else			rp->size = ip[nac+nsc-1];		++rp;	}	mp->n_regions = rp - mp->regions;	/* Make sure the pieces are sorted. */	mem_pieces_sort(mp);	mem_pieces_coalesce(mp);	return 1;}/* * On systems with Open Firmware, collect information about * physical RAM and which pieces are already in use. * At this point, we have (at least) the first 8MB mapped with a BAT. * Our text, data, bss use something over 1MB, starting at 0. * Open Firmware may be using 1MB at the 4MB point. */unsigned long __initpmac_find_end_of_memory(void){	unsigned long a, total;	struct mem_pieces phys_mem;	/*	 * Find out where physical memory is, and check that it	 * starts at 0 and is contiguous.  It seems that RAM is	 * always physically contiguous on Power Macintoshes.	 *	 * Supporting discontiguous physical memory isn't hard,	 * it just makes the virtual <-> physical mapping functions	 * more complicated (or else you end up wasting space	 * in mem_map).	 */	memory_node = find_devices("memory");	if (memory_node == NULL || !get_mem_prop("reg", &phys_mem)	    || phys_mem.n_regions == 0)		panic("No RAM??");	a = phys_mem.regions[0].address;	if (a != 0)		panic("RAM doesn't start at physical address 0");	total = phys_mem.regions[0].size;	if (phys_mem.n_regions > 1) {		printk("RAM starting at 0x%x is not contiguous\n",		       phys_mem.regions[1].address);		printk("Using RAM from 0 to 0x%lx\n", total-1);	}	return total;}void __initpmac_init(unsigned long r3, unsigned long r4, unsigned long r5,	  unsigned long r6, unsigned long r7){	/* isa_io_base gets set in pmac_find_bridges */	isa_mem_base = PMAC_ISA_MEM_BASE;	pci_dram_offset = PMAC_PCI_DRAM_OFFSET;	ISA_DMA_THRESHOLD = ~0L;	DMA_MODE_READ = 1;	DMA_MODE_WRITE = 2;	ppc_md.setup_arch     = pmac_setup_arch;	ppc_md.show_cpuinfo   = pmac_show_cpuinfo;	ppc_md.show_percpuinfo = pmac_show_percpuinfo;	ppc_md.init_IRQ       = pmac_pic_init;	ppc_md.get_irq        = pmac_get_irq; /* Changed later on ... */	ppc_md.pcibios_fixup  = pmac_pcibios_fixup;	ppc_md.pcibios_enable_device_hook = pmac_pci_enable_device_hook;	ppc_md.pcibios_after_init = pmac_pcibios_after_init;	ppc_md.phys_mem_access_prot = pci_phys_mem_access_prot;	ppc_md.restart        = pmac_restart;	ppc_md.power_off      = pmac_power_off;	ppc_md.halt           = pmac_halt;	ppc_md.time_init      = pmac_time_init;	ppc_md.set_rtc_time   = pmac_set_rtc_time;	ppc_md.get_rtc_time   = pmac_get_rtc_time;	ppc_md.calibrate_decr = pmac_calibrate_decr;	ppc_md.find_end_of_memory = pmac_find_end_of_memory;	ppc_md.feature_call   = pmac_do_feature_call;#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE)#ifdef CONFIG_BLK_DEV_IDE_PMAC        ppc_ide_md.ide_init_hwif	= pmac_ide_init_hwif_ports;        ppc_ide_md.default_io_base	= pmac_ide_get_base;#endif /* CONFIG_BLK_DEV_IDE_PMAC */#endif /* defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE) */#ifdef CONFIG_BOOTX_TEXT	ppc_md.progress = pmac_progress;#endif /* CONFIG_BOOTX_TEXT */	if (ppc_md.progress) ppc_md.progress("pmac_init(): exit", 0);}#ifdef CONFIG_BOOTX_TEXTstatic void __initpmac_progress(char *s, unsigned short hex){	if (boot_text_mapped) {		btext_drawstring(s);		btext_drawchar('\n');	}}#endif /* CONFIG_BOOTX_TEXT */static int __initpmac_declare_of_platform_devices(void){	struct device_node *np;	np = find_devices("uni-n");	if (np) {		for (np = np->child; np != NULL; np = np->sibling)			if (strncmp(np->name, "i2c", 3) == 0) {				of_platform_device_create(np, "uni-n-i2c",							  NULL);				break;			}	}	np = find_devices("u3");	if (np) {		for (np = np->child; np != NULL; np = np->sibling)			if (strncmp(np->name, "i2c", 3) == 0) {				of_platform_device_create(np, "u3-i2c",							  NULL);				break;			}	}	np = find_devices("valkyrie");	if (np)		of_platform_device_create(np, "valkyrie", NULL);	np = find_devices("platinum");	if (np)		of_platform_device_create(np, "platinum", NULL);	return 0;}device_initcall(pmac_declare_of_platform_devices);

⌨️ 快捷键说明

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