pmac_feature.c

来自「Linux Kernel 2.6.9 for OMAP1710」· C语言 代码 · 共 2,405 行 · 第 1/5 页

C
2,405
字号
	{ PMAC_FTR_IDE_RESET,		core99_ide_reset },	{ PMAC_FTR_GMAC_ENABLE,		core99_gmac_enable },	{ PMAC_FTR_GMAC_PHY_RESET,	core99_gmac_phy_reset },	{ PMAC_FTR_SOUND_CHIP_ENABLE,	core99_sound_chip_enable },	{ PMAC_FTR_AIRPORT_ENABLE,	core99_airport_enable },	{ PMAC_FTR_USB_ENABLE,		core99_usb_enable },	{ PMAC_FTR_1394_ENABLE,		core99_firewire_enable },	{ PMAC_FTR_1394_CABLE_POWER,	core99_firewire_cable_power },	{ PMAC_FTR_SLEEP_STATE,		core99_sleep_state },	{ PMAC_FTR_READ_GPIO,		core99_read_gpio },	{ PMAC_FTR_WRITE_GPIO,		core99_write_gpio },	{ PMAC_FTR_AACK_DELAY_ENABLE,	intrepid_aack_delay_enable },	{ 0, NULL }};#else /* CONFIG_POWER4 *//* G5 features */static struct feature_table_entry g5_features[]  __pmacdata = {	{ PMAC_FTR_GMAC_ENABLE,		g5_gmac_enable },	{ PMAC_FTR_1394_ENABLE,		g5_fw_enable },	{ PMAC_FTR_ENABLE_MPIC,		g5_mpic_enable },#ifdef CONFIG_SMP	{ PMAC_FTR_RESET_CPU,		g5_reset_cpu },#endif /* CONFIG_SMP */	{ PMAC_FTR_READ_GPIO,		core99_read_gpio },	{ PMAC_FTR_WRITE_GPIO,		core99_write_gpio },	{ 0, NULL }};#endif /* CONFIG_POWER4 */static struct pmac_mb_def pmac_mb_defs[] __pmacdata = {	/* Warning: ordering is important as some models may claim	 * beeing compatible with several types	 */#ifndef CONFIG_POWER4	{	"AAPL,8500",			"PowerMac 8500/8600",		PMAC_TYPE_PSURGE,		NULL,		0	},	{	"AAPL,9500",			"PowerMac 9500/9600",		PMAC_TYPE_PSURGE,		NULL,		0	},	{	"AAPL,7200",			"PowerMac 7200",		PMAC_TYPE_PSURGE,		NULL,		0	},	{	"AAPL,7300",			"PowerMac 7200/7300",		PMAC_TYPE_PSURGE,		NULL,		0	},	{	"AAPL,7500",			"PowerMac 7500",		PMAC_TYPE_PSURGE,		NULL,		0	},	{	"AAPL,ShinerESB",		"Apple Network Server",		PMAC_TYPE_ANS,			NULL,		0	},	{	"AAPL,e407",			"Alchemy",		PMAC_TYPE_ALCHEMY,		NULL,		0	},	{	"AAPL,e411",			"Gazelle",		PMAC_TYPE_GAZELLE,		NULL,		0	},	{	"AAPL,3400/2400",		"PowerBook 3400",		PMAC_TYPE_HOOPER,		ohare_features,		PMAC_MB_CAN_SLEEP | PMAC_MB_MOBILE	},	{	"AAPL,3500",			"PowerBook 3500",		PMAC_TYPE_KANGA,		ohare_features,		PMAC_MB_CAN_SLEEP | PMAC_MB_MOBILE	},	{	"AAPL,Gossamer",		"PowerMac G3 (Gossamer)",		PMAC_TYPE_GOSSAMER,		heathrow_desktop_features,		0	},	{	"AAPL,PowerMac G3",		"PowerMac G3 (Silk)",		PMAC_TYPE_SILK,			heathrow_desktop_features,		0	},	{	"AAPL,PowerBook1998",		"PowerBook Wallstreet",		PMAC_TYPE_WALLSTREET,		heathrow_laptop_features,		PMAC_MB_CAN_SLEEP | PMAC_MB_MOBILE	},	{	"PowerBook1,1",			"PowerBook 101 (Lombard)",		PMAC_TYPE_101_PBOOK,		paddington_features,		PMAC_MB_CAN_SLEEP | PMAC_MB_MOBILE	},	{	"iMac,1",			"iMac (first generation)",		PMAC_TYPE_ORIG_IMAC,		paddington_features,		0	},	{	"PowerMac4,1",			"iMac \"Flower Power\"",		PMAC_TYPE_PANGEA_IMAC,		pangea_features,		PMAC_MB_CAN_SLEEP	},	{	"PowerBook4,3",			"iBook 2 rev. 2",		PMAC_TYPE_IBOOK2,		pangea_features,		PMAC_MB_CAN_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE	},	{	"PowerBook4,2",			"iBook 2",		PMAC_TYPE_IBOOK2,		pangea_features,		PMAC_MB_CAN_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE	},	{	"PowerBook4,1",			"iBook 2",		PMAC_TYPE_IBOOK2,		pangea_features,		PMAC_MB_CAN_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE	},	{	"PowerMac4,4",			"eMac",		PMAC_TYPE_EMAC,			core99_features,		PMAC_MB_CAN_SLEEP	},	{	"PowerMac4,2",			"Flat panel iMac",		PMAC_TYPE_FLAT_PANEL_IMAC,	pangea_features,		PMAC_MB_CAN_SLEEP	},	{	"PowerMac1,1",			"Blue&White G3",		PMAC_TYPE_YOSEMITE,		paddington_features,		0	},	{	"PowerMac1,2",			"PowerMac G4 PCI Graphics",		PMAC_TYPE_YIKES,		paddington_features,		0	},	{	"PowerBook2,1",			"iBook (first generation)",		PMAC_TYPE_ORIG_IBOOK,		core99_features,		PMAC_MB_CAN_SLEEP | PMAC_MB_OLD_CORE99 | PMAC_MB_MOBILE	},	{	"PowerMac3,1",			"PowerMac G4 AGP Graphics",		PMAC_TYPE_SAWTOOTH,		core99_features,		PMAC_MB_OLD_CORE99	},	{	"PowerMac3,2",			"PowerMac G4 AGP Graphics",		PMAC_TYPE_SAWTOOTH,		core99_features,		PMAC_MB_OLD_CORE99	},	{	"PowerMac3,3",			"PowerMac G4 AGP Graphics",		PMAC_TYPE_SAWTOOTH,		core99_features,		PMAC_MB_OLD_CORE99	},	{	"PowerMac2,1",			"iMac FireWire",		PMAC_TYPE_FW_IMAC,		core99_features,		PMAC_MB_CAN_SLEEP | PMAC_MB_OLD_CORE99	},	{	"PowerMac2,2",			"iMac FireWire",		PMAC_TYPE_FW_IMAC,		core99_features,		PMAC_MB_CAN_SLEEP | PMAC_MB_OLD_CORE99	},	{	"PowerBook2,2",			"iBook FireWire",		PMAC_TYPE_FW_IBOOK,		core99_features,		PMAC_MB_CAN_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_OLD_CORE99 | PMAC_MB_MOBILE	},	{	"PowerMac5,1",			"PowerMac G4 Cube",		PMAC_TYPE_CUBE,			core99_features,		PMAC_MB_OLD_CORE99	},	{	"PowerMac3,4",			"PowerMac G4 Silver",		PMAC_TYPE_QUICKSILVER,		core99_features,		0	},	{	"PowerMac3,5",			"PowerMac G4 Silver",		PMAC_TYPE_QUICKSILVER,		core99_features,		0	},	{	"PowerBook3,1",			"PowerBook Pismo",		PMAC_TYPE_PISMO,		core99_features,		PMAC_MB_CAN_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_OLD_CORE99 | PMAC_MB_MOBILE	},	{	"PowerBook3,2",			"PowerBook Titanium",		PMAC_TYPE_TITANIUM,		core99_features,		PMAC_MB_CAN_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE	},	{	"PowerBook3,3",			"PowerBook Titanium II",		PMAC_TYPE_TITANIUM2,		core99_features,		PMAC_MB_CAN_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE	},	{	"PowerBook3,4",			"PowerBook Titanium III",		PMAC_TYPE_TITANIUM3,		core99_features,		PMAC_MB_CAN_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE	},	{	"PowerBook3,5",			"PowerBook Titanium IV",		PMAC_TYPE_TITANIUM4,		core99_features,		PMAC_MB_CAN_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE	},	{	"RackMac1,1",			"XServe",		PMAC_TYPE_RACKMAC,		rackmac_features,		0,	},	{	"RackMac1,2",			"XServe rev. 2",		PMAC_TYPE_RACKMAC,		rackmac_features,		0,	},	{	"PowerMac3,6",			"PowerMac G4 Windtunnel",		PMAC_TYPE_WINDTUNNEL,		core99_features,		0,	},	{	"PowerBook5,1",			"PowerBook G4 17\"",		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,		PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,	},	{	"PowerBook5,2",			"PowerBook G4 15\"",		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,		PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,	},	{	"PowerBook5,3",			"PowerBook G4 17\"",		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,		PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,	},	{	"PowerBook5,4",			"PowerBook G4 15\"",		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,		PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,	},	{	"PowerBook5,5",			"PowerBook G4 17\"",		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,		PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,	},	{	"PowerBook6,1",			"PowerBook G4 12\"",		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,		PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,	},	{	"PowerBook6,2",			"PowerBook G4",		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,		PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,	},	{	"PowerBook6,3",			"iBook G4",		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,		PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,	},	{	"PowerBook6,4",			"PowerBook G4 12\"",		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,		PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,	},	{	"PowerBook6,5",			"iBook G4",		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,		PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,	},#else /* CONFIG_POWER4 */	{	"PowerMac7,2",			"PowerMac G5",		PMAC_TYPE_POWERMAC_G5,		g5_features,		0,	},#endif /* CONFIG_POWER4 */};/* * The toplevel feature_call callback */long __pmacpmac_do_feature_call(unsigned int selector, ...){	struct device_node* node;	long param, value;	int i;	feature_call func = NULL;	va_list args;	if (pmac_mb.features)		for (i=0; pmac_mb.features[i].function; i++)			if (pmac_mb.features[i].selector == selector) {				func = pmac_mb.features[i].function;				break;			}	if (!func)		for (i=0; any_features[i].function; i++)			if (any_features[i].selector == selector) {				func = any_features[i].function;				break;			}	if (!func)		return -ENODEV;	va_start(args, selector);	node = (struct device_node*)va_arg(args, void*);	param = va_arg(args, long);	value = va_arg(args, long);	va_end(args);	return func(node, param, value);}static int __initprobe_motherboard(void){	int i;	struct macio_chip* macio = &macio_chips[0];	const char* model = NULL;	struct device_node *dt;	/* Lookup known motherboard type in device-tree. First try an	 * exact match on the "model" property, then try a "compatible"	 * match is none is found.	 */	dt = find_devices("device-tree");	if (dt != NULL)		model = (const char *) get_property(dt, "model", NULL);	for(i=0; model && i<(sizeof(pmac_mb_defs)/sizeof(struct pmac_mb_def)); i++) {	    if (strcmp(model, pmac_mb_defs[i].model_string) == 0) {		pmac_mb = pmac_mb_defs[i];		goto found;	    }	}	for(i=0; i<(sizeof(pmac_mb_defs)/sizeof(struct pmac_mb_def)); i++) {	    if (machine_is_compatible(pmac_mb_defs[i].model_string)) {		pmac_mb = pmac_mb_defs[i];		goto found;	    }	}	/* Fallback to selection depending on mac-io chip type */	switch(macio->type) {#ifndef CONFIG_POWER4	    case macio_grand_central:		pmac_mb.model_id = PMAC_TYPE_PSURGE;		pmac_mb.model_name = "Unknown PowerSurge";		break;	    case macio_ohare:		pmac_mb.model_id = PMAC_TYPE_UNKNOWN_OHARE;		pmac_mb.model_name = "Unknown OHare-based";	    	break;	    case macio_heathrow:		pmac_mb.model_id = PMAC_TYPE_UNKNOWN_HEATHROW;		pmac_mb.model_name = "Unknown Heathrow-based";		pmac_mb.features = heathrow_desktop_features;		break;	    case macio_paddington:		pmac_mb.model_id = PMAC_TYPE_UNKNOWN_PADDINGTON;		pmac_mb.model_name = "Unknown Paddington-based";	    	pmac_mb.features = paddington_features;		break;	    case macio_keylargo:		pmac_mb.model_id = PMAC_TYPE_UNKNOWN_CORE99;		pmac_mb.model_name = "Unknown Keylargo-based";	    	pmac_mb.features = core99_features;		break;	    case macio_pangea:		pmac_mb.model_id = PMAC_TYPE_UNKNOWN_PANGEA;		pmac_mb.model_name = "Unknown Pangea-based";	    	pmac_mb.features = pangea_features;		break;	    case macio_intrepid:		pmac_mb.model_id = PMAC_TYPE_UNKNOWN_INTREPID;		pmac_mb.model_name = "Unknown Intrepid-based";	    	pmac_mb.features = intrepid_features;	    	break;#else /* CONFIG_POWER4 */	    case macio_keylargo2:		pmac_mb.model_id = PMAC_TYPE_UNKNOWN_K2;		pmac_mb.model_name = "Unknown G5";	    	pmac_mb.features = g5_features;	    	break;#endif /* CONFIG_POWER4 */	    default:	    	return -ENODEV;	}found:#ifndef CONFIG_POWER4	/* Fixup Hooper vs. Comet */	if (pmac_mb.model_id == PMAC_TYPE_HOOPER) {		u32* mach_id_ptr = (u32*)ioremap(0xf3000034, 4);		if (!mach_id_ptr)			return -ENODEV;		/* Here, I used to disable the media-bay on comet. It		 * appears this is wrong, the floppy connector is actually		 * a kind of media-bay and works with the current driver.		 */		if ((*mach_id_ptr) & 0x20000000UL)			pmac_mb.model_id = PMAC_TYPE_COMET;		iounmap(mach_id_ptr);	}#endif /* CONFIG_POWER4 */#ifdef CONFIG_6xx	/* Set default value of powersave_nap on machines that support it.	 * It appears that uninorth rev 3 has a problem with it, we don't	 * enable it on those. In theory, the flush-on-lock property is	 * supposed to be set when not supported, but I'm not very confident	 * that all Apple OF revs did it properly, I do it the paranoid way.	 */	while (uninorth_base && uninorth_rev > 3) {		struct device_node* np = find_path_device("/cpus");		if (!np || !np->child) {			printk(KERN_WARNING "Can't find CPU(s) in device tree !\n");			break;		}		np = np->child;		/* Nap mode not supported on SMP */		if (np->sibling)			break;		/* Nap mode not supported if flush-on-lock property is present */		if (get_property(np, "flush-on-lock", NULL))			break;		powersave_nap = 1;		printk(KERN_INFO "Processor NAP mode on idle enabled.\n");		break;	}	/* On CPUs that support it (750FX), lowspeed by default during	 * NAP mode	 */	powersave_lowspeed = 1;#endif /* CONFIG_6xx */#ifdef CONFIG_POWER4	powersave_nap = 1;#endif	/* Check for "mobile" machine */	if (model && (strncmp(model, "PowerBook", 9) == 0		   || strncmp(model, "iBook", 5) == 0))		pmac_mb.board_flags |= PMAC_MB_MOBILE;	printk(KERN_INFO "PowerMac motherboard: %s\n", pmac_mb.model_name);	return 0;}/* Initialize the Core99 UniNorth host bridge and memory controller */static void __initprobe_uninorth(void){	unsigned long actrl;	/* Locate core99 Uni-N */	uninorth_node = of_find_node_by_name(NULL, "uni-n");	/* Locate G5 u3 */	if (uninorth_node == NULL) {		uninorth_node = of_find_node_by_name(NULL, "u3");		uninorth_u3 = 1;	}	if (uninorth_node && uninorth_node->n_addrs > 0) {		unsigned long address = uninorth_node->addrs[0].address;		uninorth_base = ioremap(address, 0x40000);		uninorth_rev = in_be32(UN_REG(UNI_N_VERSION));		if (uninorth_u3)			u3_ht = ioremap(address + U3_HT_CONFIG_BASE, 0x1000);	} else		uninorth_node = NULL;	if (!uninorth_node)		return;	printk(KERN_INFO "Found %s memory controller & host bridge, revision: %d\n",	       uninorth_u3 ? "U3" : "UniNorth", uninorth_rev);	printk(KERN_INFO "Mapped at 0x%08lx\n", (unsigned long)uninorth_base);	/* Set the arbitrer QAck delay according to what Apple does	 */	if (uninorth_rev < 0x11) {		actrl = UN_IN(UNI_N_ARB_CTRL) & ~UNI_N_ARB_CTRL_QACK_DELAY_MASK;		actrl |= ((uninorth_rev < 3) ? UNI_N_ARB_CTRL_QACK_DELAY105 :			UNI_N_ARB_CTRL_QACK_DELAY) << UNI_N_ARB_CTRL_QACK_DELAY_SHIFT;		UN_OUT(UNI_N_ARB_CTRL, actrl);	}	/* Some more magic as done by them in recent MacOS X on UniNorth	 * revs 1.5 to 2.O and Pangea. Seem to toggle the UniN Maxbus/PCI	 * memory timeout	 */	if ((uninorth_rev >= 0x11 && uninorth_rev <= 0x24) || uninorth_rev == 0xc0)		UN_OUT(0x2160, UN_IN(0x2160) & 0x00ffffff);}static void __initprobe_one_macio(const char* name, const char* compat, int type){	struct device_node*	node;	int			i;	volatile u32*		base;	u32*			revp;	node = find_devices(name);	if (!node || !node->n_addrs)		return;	if (compat)		do {			if (device_is_compatible(nod

⌨️ 快捷键说明

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