162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Definition of platform feature hooks for PowerMacs 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public 562306a36Sopenharmony_ci * License. See the file "COPYING" in the main directory of this archive 662306a36Sopenharmony_ci * for more details. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Copyright (C) 1998 Paul Mackerras & 962306a36Sopenharmony_ci * Ben. Herrenschmidt. 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * 1262306a36Sopenharmony_ci * Note: I removed media-bay details from the feature stuff, I believe it's 1362306a36Sopenharmony_ci * not worth it, the media-bay driver can directly use the mac-io 1462306a36Sopenharmony_ci * ASIC registers. 1562306a36Sopenharmony_ci * 1662306a36Sopenharmony_ci * Implementation note: Currently, none of these functions will block. 1762306a36Sopenharmony_ci * However, they may internally protect themselves with a spinlock 1862306a36Sopenharmony_ci * for way too long. Be prepared for at least some of these to block 1962306a36Sopenharmony_ci * in the future. 2062306a36Sopenharmony_ci * 2162306a36Sopenharmony_ci * Unless specifically defined, the result code is assumed to be an 2262306a36Sopenharmony_ci * error when negative, 0 is the default success result. Some functions 2362306a36Sopenharmony_ci * may return additional positive result values. 2462306a36Sopenharmony_ci * 2562306a36Sopenharmony_ci * To keep implementation simple, all feature calls are assumed to have 2662306a36Sopenharmony_ci * the prototype parameters (struct device_node* node, int value). 2762306a36Sopenharmony_ci * When either is not used, pass 0. 2862306a36Sopenharmony_ci */ 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#ifdef __KERNEL__ 3162306a36Sopenharmony_ci#ifndef __ASM_POWERPC_PMAC_FEATURE_H 3262306a36Sopenharmony_ci#define __ASM_POWERPC_PMAC_FEATURE_H 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci#include <asm/macio.h> 3562306a36Sopenharmony_ci#include <asm/machdep.h> 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci/* 3862306a36Sopenharmony_ci * Known Mac motherboard models 3962306a36Sopenharmony_ci * 4062306a36Sopenharmony_ci * Please, report any error here to benh@kernel.crashing.org, thanks ! 4162306a36Sopenharmony_ci * 4262306a36Sopenharmony_ci * Note that I don't fully maintain this list for Core99 & MacRISC2 4362306a36Sopenharmony_ci * and I'm considering removing all NewWorld entries from it and 4462306a36Sopenharmony_ci * entirely rely on the model string. 4562306a36Sopenharmony_ci */ 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci/* PowerSurge are the first generation of PCI Pmacs. This include 4862306a36Sopenharmony_ci * all of the Grand-Central based machines. We currently don't 4962306a36Sopenharmony_ci * differentiate most of them. 5062306a36Sopenharmony_ci */ 5162306a36Sopenharmony_ci#define PMAC_TYPE_PSURGE 0x10 /* PowerSurge */ 5262306a36Sopenharmony_ci#define PMAC_TYPE_ANS 0x11 /* Apple Network Server */ 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci/* Here is the infamous serie of OHare based machines 5562306a36Sopenharmony_ci */ 5662306a36Sopenharmony_ci#define PMAC_TYPE_COMET 0x20 /* Believed to be PowerBook 2400 */ 5762306a36Sopenharmony_ci#define PMAC_TYPE_HOOPER 0x21 /* Believed to be PowerBook 3400 */ 5862306a36Sopenharmony_ci#define PMAC_TYPE_KANGA 0x22 /* PowerBook 3500 (first G3) */ 5962306a36Sopenharmony_ci#define PMAC_TYPE_ALCHEMY 0x23 /* Alchemy motherboard base */ 6062306a36Sopenharmony_ci#define PMAC_TYPE_GAZELLE 0x24 /* Spartacus, some 5xxx/6xxx */ 6162306a36Sopenharmony_ci#define PMAC_TYPE_UNKNOWN_OHARE 0x2f /* Unknown, but OHare based */ 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci/* Here are the Heathrow based machines 6462306a36Sopenharmony_ci * FIXME: Differenciate wallstreet,mainstreet,wallstreetII 6562306a36Sopenharmony_ci */ 6662306a36Sopenharmony_ci#define PMAC_TYPE_GOSSAMER 0x30 /* Gossamer motherboard */ 6762306a36Sopenharmony_ci#define PMAC_TYPE_SILK 0x31 /* Desktop PowerMac G3 */ 6862306a36Sopenharmony_ci#define PMAC_TYPE_WALLSTREET 0x32 /* Wallstreet/Mainstreet PowerBook*/ 6962306a36Sopenharmony_ci#define PMAC_TYPE_UNKNOWN_HEATHROW 0x3f /* Unknown but heathrow based */ 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci/* Here are newworld machines based on Paddington (heathrow derivative) 7262306a36Sopenharmony_ci */ 7362306a36Sopenharmony_ci#define PMAC_TYPE_101_PBOOK 0x40 /* 101 PowerBook (aka Lombard) */ 7462306a36Sopenharmony_ci#define PMAC_TYPE_ORIG_IMAC 0x41 /* First generation iMac */ 7562306a36Sopenharmony_ci#define PMAC_TYPE_YOSEMITE 0x42 /* B&W G3 */ 7662306a36Sopenharmony_ci#define PMAC_TYPE_YIKES 0x43 /* Yikes G4 (PCI graphics) */ 7762306a36Sopenharmony_ci#define PMAC_TYPE_UNKNOWN_PADDINGTON 0x4f /* Unknown but paddington based */ 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci/* Core99 machines based on UniNorth 1.0 and 1.5 8062306a36Sopenharmony_ci * 8162306a36Sopenharmony_ci * Note: A single entry here may cover several actual models according 8262306a36Sopenharmony_ci * to the device-tree. (Sawtooth is most tower G4s, FW_IMAC is most 8362306a36Sopenharmony_ci * FireWire based iMacs, etc...). Those machines are too similar to be 8462306a36Sopenharmony_ci * distinguished here, when they need to be differencied, use the 8562306a36Sopenharmony_ci * device-tree "model" or "compatible" property. 8662306a36Sopenharmony_ci */ 8762306a36Sopenharmony_ci#define PMAC_TYPE_ORIG_IBOOK 0x40 /* First iBook model (no firewire) */ 8862306a36Sopenharmony_ci#define PMAC_TYPE_SAWTOOTH 0x41 /* Desktop G4s */ 8962306a36Sopenharmony_ci#define PMAC_TYPE_FW_IMAC 0x42 /* FireWire iMacs (except Pangea based) */ 9062306a36Sopenharmony_ci#define PMAC_TYPE_FW_IBOOK 0x43 /* FireWire iBooks (except iBook2) */ 9162306a36Sopenharmony_ci#define PMAC_TYPE_CUBE 0x44 /* Cube PowerMac */ 9262306a36Sopenharmony_ci#define PMAC_TYPE_QUICKSILVER 0x45 /* QuickSilver G4s */ 9362306a36Sopenharmony_ci#define PMAC_TYPE_PISMO 0x46 /* Pismo PowerBook */ 9462306a36Sopenharmony_ci#define PMAC_TYPE_TITANIUM 0x47 /* Titanium PowerBook */ 9562306a36Sopenharmony_ci#define PMAC_TYPE_TITANIUM2 0x48 /* Titanium II PowerBook (no L3, M6) */ 9662306a36Sopenharmony_ci#define PMAC_TYPE_TITANIUM3 0x49 /* Titanium III PowerBook (with L3 & M7) */ 9762306a36Sopenharmony_ci#define PMAC_TYPE_TITANIUM4 0x50 /* Titanium IV PowerBook (with L3 & M9) */ 9862306a36Sopenharmony_ci#define PMAC_TYPE_EMAC 0x50 /* eMac */ 9962306a36Sopenharmony_ci#define PMAC_TYPE_UNKNOWN_CORE99 0x5f 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci/* MacRisc2 with UniNorth 2.0 */ 10262306a36Sopenharmony_ci#define PMAC_TYPE_RACKMAC 0x80 /* XServe */ 10362306a36Sopenharmony_ci#define PMAC_TYPE_WINDTUNNEL 0x81 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci/* MacRISC2 machines based on the Pangea chipset 10662306a36Sopenharmony_ci */ 10762306a36Sopenharmony_ci#define PMAC_TYPE_PANGEA_IMAC 0x100 /* Flower Power iMac */ 10862306a36Sopenharmony_ci#define PMAC_TYPE_IBOOK2 0x101 /* iBook2 (polycarbonate) */ 10962306a36Sopenharmony_ci#define PMAC_TYPE_FLAT_PANEL_IMAC 0x102 /* Flat panel iMac */ 11062306a36Sopenharmony_ci#define PMAC_TYPE_UNKNOWN_PANGEA 0x10f 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci/* MacRISC2 machines based on the Intrepid chipset 11362306a36Sopenharmony_ci */ 11462306a36Sopenharmony_ci#define PMAC_TYPE_UNKNOWN_INTREPID 0x11f /* Generic */ 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci/* MacRISC4 / G5 machines. We don't have per-machine selection here anymore, 11762306a36Sopenharmony_ci * but rather machine families 11862306a36Sopenharmony_ci */ 11962306a36Sopenharmony_ci#define PMAC_TYPE_POWERMAC_G5 0x150 /* U3 & U3H based */ 12062306a36Sopenharmony_ci#define PMAC_TYPE_POWERMAC_G5_U3L 0x151 /* U3L based desktop */ 12162306a36Sopenharmony_ci#define PMAC_TYPE_IMAC_G5 0x152 /* iMac G5 */ 12262306a36Sopenharmony_ci#define PMAC_TYPE_XSERVE_G5 0x153 /* Xserve G5 */ 12362306a36Sopenharmony_ci#define PMAC_TYPE_UNKNOWN_K2 0x19f /* Any other K2 based */ 12462306a36Sopenharmony_ci#define PMAC_TYPE_UNKNOWN_SHASTA 0x19e /* Any other Shasta based */ 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci/* 12762306a36Sopenharmony_ci * Motherboard flags 12862306a36Sopenharmony_ci */ 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci#define PMAC_MB_CAN_SLEEP 0x00000001 13162306a36Sopenharmony_ci#define PMAC_MB_HAS_FW_POWER 0x00000002 13262306a36Sopenharmony_ci#define PMAC_MB_OLD_CORE99 0x00000004 13362306a36Sopenharmony_ci#define PMAC_MB_MOBILE 0x00000008 13462306a36Sopenharmony_ci#define PMAC_MB_MAY_SLEEP 0x00000010 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci/* 13762306a36Sopenharmony_ci * Feature calls supported on pmac 13862306a36Sopenharmony_ci * 13962306a36Sopenharmony_ci */ 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci/* 14262306a36Sopenharmony_ci * Use this inline wrapper 14362306a36Sopenharmony_ci */ 14462306a36Sopenharmony_cistruct device_node; 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_cistatic inline long pmac_call_feature(int selector, struct device_node* node, 14762306a36Sopenharmony_ci long param, long value) 14862306a36Sopenharmony_ci{ 14962306a36Sopenharmony_ci if (!ppc_md.feature_call || !machine_is(powermac)) 15062306a36Sopenharmony_ci return -ENODEV; 15162306a36Sopenharmony_ci return ppc_md.feature_call(selector, node, param, value); 15262306a36Sopenharmony_ci} 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci/* PMAC_FTR_SERIAL_ENABLE (struct device_node* node, int param, int value) 15562306a36Sopenharmony_ci * enable/disable an SCC side. Pass the node corresponding to the 15662306a36Sopenharmony_ci * channel side as a parameter. 15762306a36Sopenharmony_ci * param is the type of port 15862306a36Sopenharmony_ci * if param is ored with PMAC_SCC_FLAG_XMON, then the SCC is locked enabled 15962306a36Sopenharmony_ci * for use by xmon. 16062306a36Sopenharmony_ci */ 16162306a36Sopenharmony_ci#define PMAC_FTR_SCC_ENABLE PMAC_FTR_DEF(0) 16262306a36Sopenharmony_ci #define PMAC_SCC_ASYNC 0 16362306a36Sopenharmony_ci #define PMAC_SCC_IRDA 1 16462306a36Sopenharmony_ci #define PMAC_SCC_I2S1 2 16562306a36Sopenharmony_ci #define PMAC_SCC_FLAG_XMON 0x00001000 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci/* PMAC_FTR_MODEM_ENABLE (struct device_node* node, 0, int value) 16862306a36Sopenharmony_ci * enable/disable the internal modem. 16962306a36Sopenharmony_ci */ 17062306a36Sopenharmony_ci#define PMAC_FTR_MODEM_ENABLE PMAC_FTR_DEF(1) 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci/* PMAC_FTR_SWIM3_ENABLE (struct device_node* node, 0,int value) 17362306a36Sopenharmony_ci * enable/disable the swim3 (floppy) cell of a mac-io ASIC 17462306a36Sopenharmony_ci */ 17562306a36Sopenharmony_ci#define PMAC_FTR_SWIM3_ENABLE PMAC_FTR_DEF(2) 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci/* PMAC_FTR_MESH_ENABLE (struct device_node* node, 0, int value) 17862306a36Sopenharmony_ci * enable/disable the mesh (scsi) cell of a mac-io ASIC 17962306a36Sopenharmony_ci */ 18062306a36Sopenharmony_ci#define PMAC_FTR_MESH_ENABLE PMAC_FTR_DEF(3) 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci/* PMAC_FTR_IDE_ENABLE (struct device_node* node, int busID, int value) 18362306a36Sopenharmony_ci * enable/disable an IDE port of a mac-io ASIC 18462306a36Sopenharmony_ci * pass the busID parameter 18562306a36Sopenharmony_ci */ 18662306a36Sopenharmony_ci#define PMAC_FTR_IDE_ENABLE PMAC_FTR_DEF(4) 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci/* PMAC_FTR_IDE_RESET (struct device_node* node, int busID, int value) 18962306a36Sopenharmony_ci * assert(1)/release(0) an IDE reset line (mac-io IDE only) 19062306a36Sopenharmony_ci */ 19162306a36Sopenharmony_ci#define PMAC_FTR_IDE_RESET PMAC_FTR_DEF(5) 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci/* PMAC_FTR_BMAC_ENABLE (struct device_node* node, 0, int value) 19462306a36Sopenharmony_ci * enable/disable the bmac (ethernet) cell of a mac-io ASIC, also drive 19562306a36Sopenharmony_ci * it's reset line 19662306a36Sopenharmony_ci */ 19762306a36Sopenharmony_ci#define PMAC_FTR_BMAC_ENABLE PMAC_FTR_DEF(6) 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_ci/* PMAC_FTR_GMAC_ENABLE (struct device_node* node, 0, int value) 20062306a36Sopenharmony_ci * enable/disable the gmac (ethernet) cell of an uninorth ASIC. This 20162306a36Sopenharmony_ci * control the cell's clock. 20262306a36Sopenharmony_ci */ 20362306a36Sopenharmony_ci#define PMAC_FTR_GMAC_ENABLE PMAC_FTR_DEF(7) 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_ci/* PMAC_FTR_GMAC_PHY_RESET (struct device_node* node, 0, 0) 20662306a36Sopenharmony_ci * Perform a HW reset of the PHY connected to a gmac controller. 20762306a36Sopenharmony_ci * Pass the gmac device node, not the PHY node. 20862306a36Sopenharmony_ci */ 20962306a36Sopenharmony_ci#define PMAC_FTR_GMAC_PHY_RESET PMAC_FTR_DEF(8) 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci/* PMAC_FTR_SOUND_CHIP_ENABLE (struct device_node* node, 0, int value) 21262306a36Sopenharmony_ci * enable/disable the sound chip, whatever it is and provided it can 21362306a36Sopenharmony_ci * actually be controlled 21462306a36Sopenharmony_ci */ 21562306a36Sopenharmony_ci#define PMAC_FTR_SOUND_CHIP_ENABLE PMAC_FTR_DEF(9) 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci/* -- add various tweaks related to sound routing -- */ 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci/* PMAC_FTR_AIRPORT_ENABLE (struct device_node* node, 0, int value) 22062306a36Sopenharmony_ci * enable/disable the airport card 22162306a36Sopenharmony_ci */ 22262306a36Sopenharmony_ci#define PMAC_FTR_AIRPORT_ENABLE PMAC_FTR_DEF(10) 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci/* PMAC_FTR_RESET_CPU (NULL, int cpu_nr, 0) 22562306a36Sopenharmony_ci * toggle the reset line of a CPU on an uninorth-based SMP machine 22662306a36Sopenharmony_ci */ 22762306a36Sopenharmony_ci#define PMAC_FTR_RESET_CPU PMAC_FTR_DEF(11) 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci/* PMAC_FTR_USB_ENABLE (struct device_node* node, 0, int value) 23062306a36Sopenharmony_ci * enable/disable an USB cell, along with the power of the USB "pad" 23162306a36Sopenharmony_ci * on keylargo based machines 23262306a36Sopenharmony_ci */ 23362306a36Sopenharmony_ci#define PMAC_FTR_USB_ENABLE PMAC_FTR_DEF(12) 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci/* PMAC_FTR_1394_ENABLE (struct device_node* node, 0, int value) 23662306a36Sopenharmony_ci * enable/disable the firewire cell of an uninorth ASIC. 23762306a36Sopenharmony_ci */ 23862306a36Sopenharmony_ci#define PMAC_FTR_1394_ENABLE PMAC_FTR_DEF(13) 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ci/* PMAC_FTR_1394_CABLE_POWER (struct device_node* node, 0, int value) 24162306a36Sopenharmony_ci * enable/disable the firewire cable power supply of the uninorth 24262306a36Sopenharmony_ci * firewire cell 24362306a36Sopenharmony_ci */ 24462306a36Sopenharmony_ci#define PMAC_FTR_1394_CABLE_POWER PMAC_FTR_DEF(14) 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci/* PMAC_FTR_SLEEP_STATE (struct device_node* node, 0, int value) 24762306a36Sopenharmony_ci * set the sleep state of the motherboard. 24862306a36Sopenharmony_ci * 24962306a36Sopenharmony_ci * Pass -1 as value to query for sleep capability 25062306a36Sopenharmony_ci * Pass 1 to set IOs to sleep 25162306a36Sopenharmony_ci * Pass 0 to set IOs to wake 25262306a36Sopenharmony_ci */ 25362306a36Sopenharmony_ci#define PMAC_FTR_SLEEP_STATE PMAC_FTR_DEF(15) 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci/* PMAC_FTR_GET_MB_INFO (NULL, selector, 0) 25662306a36Sopenharmony_ci * 25762306a36Sopenharmony_ci * returns some motherboard infos. 25862306a36Sopenharmony_ci * selector: 0 - model id 25962306a36Sopenharmony_ci * 1 - model flags (capabilities) 26062306a36Sopenharmony_ci * 2 - model name (cast to const char *) 26162306a36Sopenharmony_ci */ 26262306a36Sopenharmony_ci#define PMAC_FTR_GET_MB_INFO PMAC_FTR_DEF(16) 26362306a36Sopenharmony_ci#define PMAC_MB_INFO_MODEL 0 26462306a36Sopenharmony_ci#define PMAC_MB_INFO_FLAGS 1 26562306a36Sopenharmony_ci#define PMAC_MB_INFO_NAME 2 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci/* PMAC_FTR_READ_GPIO (NULL, int index, 0) 26862306a36Sopenharmony_ci * 26962306a36Sopenharmony_ci * read a GPIO from a mac-io controller of type KeyLargo or Pangea. 27062306a36Sopenharmony_ci * the value returned is a byte (positive), or a negative error code 27162306a36Sopenharmony_ci */ 27262306a36Sopenharmony_ci#define PMAC_FTR_READ_GPIO PMAC_FTR_DEF(17) 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_ci/* PMAC_FTR_WRITE_GPIO (NULL, int index, int value) 27562306a36Sopenharmony_ci * 27662306a36Sopenharmony_ci * write a GPIO of a mac-io controller of type KeyLargo or Pangea. 27762306a36Sopenharmony_ci */ 27862306a36Sopenharmony_ci#define PMAC_FTR_WRITE_GPIO PMAC_FTR_DEF(18) 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci/* PMAC_FTR_ENABLE_MPIC 28162306a36Sopenharmony_ci * 28262306a36Sopenharmony_ci * Enable the MPIC cell 28362306a36Sopenharmony_ci */ 28462306a36Sopenharmony_ci#define PMAC_FTR_ENABLE_MPIC PMAC_FTR_DEF(19) 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci/* PMAC_FTR_AACK_DELAY_ENABLE (NULL, int enable, 0) 28762306a36Sopenharmony_ci * 28862306a36Sopenharmony_ci * Enable/disable the AACK delay on the northbridge for systems using DFS 28962306a36Sopenharmony_ci */ 29062306a36Sopenharmony_ci#define PMAC_FTR_AACK_DELAY_ENABLE PMAC_FTR_DEF(20) 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_ci/* PMAC_FTR_DEVICE_CAN_WAKE 29362306a36Sopenharmony_ci * 29462306a36Sopenharmony_ci * Used by video drivers to inform system that they can actually perform 29562306a36Sopenharmony_ci * wakeup from sleep 29662306a36Sopenharmony_ci */ 29762306a36Sopenharmony_ci#define PMAC_FTR_DEVICE_CAN_WAKE PMAC_FTR_DEF(22) 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci/* Don't use those directly, they are for the sake of pmac_setup.c */ 30162306a36Sopenharmony_ciextern long pmac_do_feature_call(unsigned int selector, ...); 30262306a36Sopenharmony_ciextern void pmac_feature_init(void); 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci/* Video suspend tweak */ 30562306a36Sopenharmony_ciextern void pmac_set_early_video_resume(void (*proc)(void *data), void *data); 30662306a36Sopenharmony_ciextern void pmac_call_early_video_resume(void); 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci#define PMAC_FTR_DEF(x) ((0x6660000) | (x)) 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ci/* The AGP driver registers itself here */ 31162306a36Sopenharmony_ciextern void pmac_register_agp_pm(struct pci_dev *bridge, 31262306a36Sopenharmony_ci int (*suspend)(struct pci_dev *bridge), 31362306a36Sopenharmony_ci int (*resume)(struct pci_dev *bridge)); 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_ci/* Those are meant to be used by video drivers to deal with AGP 31662306a36Sopenharmony_ci * suspend resume properly 31762306a36Sopenharmony_ci */ 31862306a36Sopenharmony_ciextern void pmac_suspend_agp_for_card(struct pci_dev *dev); 31962306a36Sopenharmony_ciextern void pmac_resume_agp_for_card(struct pci_dev *dev); 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ci/* 32262306a36Sopenharmony_ci * The part below is for use by macio_asic.c only, do not rely 32362306a36Sopenharmony_ci * on the data structures or constants below in a normal driver 32462306a36Sopenharmony_ci * 32562306a36Sopenharmony_ci */ 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci#define MAX_MACIO_CHIPS 2 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_cienum { 33062306a36Sopenharmony_ci macio_unknown = 0, 33162306a36Sopenharmony_ci macio_grand_central, 33262306a36Sopenharmony_ci macio_ohare, 33362306a36Sopenharmony_ci macio_ohareII, 33462306a36Sopenharmony_ci macio_heathrow, 33562306a36Sopenharmony_ci macio_gatwick, 33662306a36Sopenharmony_ci macio_paddington, 33762306a36Sopenharmony_ci macio_keylargo, 33862306a36Sopenharmony_ci macio_pangea, 33962306a36Sopenharmony_ci macio_intrepid, 34062306a36Sopenharmony_ci macio_keylargo2, 34162306a36Sopenharmony_ci macio_shasta, 34262306a36Sopenharmony_ci}; 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_cistruct macio_chip 34562306a36Sopenharmony_ci{ 34662306a36Sopenharmony_ci struct device_node *of_node; 34762306a36Sopenharmony_ci int type; 34862306a36Sopenharmony_ci const char *name; 34962306a36Sopenharmony_ci int rev; 35062306a36Sopenharmony_ci volatile u32 __iomem *base; 35162306a36Sopenharmony_ci unsigned long flags; 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_ci /* For use by macio_asic PCI driver */ 35462306a36Sopenharmony_ci struct macio_bus lbus; 35562306a36Sopenharmony_ci}; 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ciextern struct macio_chip macio_chips[MAX_MACIO_CHIPS]; 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci#define MACIO_FLAG_SCCA_ON 0x00000001 36062306a36Sopenharmony_ci#define MACIO_FLAG_SCCB_ON 0x00000002 36162306a36Sopenharmony_ci#define MACIO_FLAG_SCC_LOCKED 0x00000004 36262306a36Sopenharmony_ci#define MACIO_FLAG_AIRPORT_ON 0x00000010 36362306a36Sopenharmony_ci#define MACIO_FLAG_FW_SUPPORTED 0x00000020 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ciextern struct macio_chip* macio_find(struct device_node* child, int type); 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci#define MACIO_FCR32(macio, r) ((macio)->base + ((r) >> 2)) 36862306a36Sopenharmony_ci#define MACIO_FCR8(macio, r) (((volatile u8 __iomem *)((macio)->base)) + (r)) 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci#define MACIO_IN32(r) (in_le32(MACIO_FCR32(macio,r))) 37162306a36Sopenharmony_ci#define MACIO_OUT32(r,v) (out_le32(MACIO_FCR32(macio,r), (v))) 37262306a36Sopenharmony_ci#define MACIO_BIS(r,v) (MACIO_OUT32((r), MACIO_IN32(r) | (v))) 37362306a36Sopenharmony_ci#define MACIO_BIC(r,v) (MACIO_OUT32((r), MACIO_IN32(r) & ~(v))) 37462306a36Sopenharmony_ci#define MACIO_IN8(r) (in_8(MACIO_FCR8(macio,r))) 37562306a36Sopenharmony_ci#define MACIO_OUT8(r,v) (out_8(MACIO_FCR8(macio,r), (v))) 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ci/* 37862306a36Sopenharmony_ci * Those are exported by pmac feature for internal use by arch code 37962306a36Sopenharmony_ci * only like the platform function callbacks, do not use directly in drivers 38062306a36Sopenharmony_ci */ 38162306a36Sopenharmony_ciextern raw_spinlock_t feature_lock; 38262306a36Sopenharmony_ciextern struct device_node *uninorth_node; 38362306a36Sopenharmony_ciextern u32 __iomem *uninorth_base; 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_ci/* 38662306a36Sopenharmony_ci * Uninorth reg. access. Note that Uni-N regs are big endian 38762306a36Sopenharmony_ci */ 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_ci#define UN_REG(r) (uninorth_base + ((r) >> 2)) 39062306a36Sopenharmony_ci#define UN_IN(r) (in_be32(UN_REG(r))) 39162306a36Sopenharmony_ci#define UN_OUT(r,v) (out_be32(UN_REG(r), (v))) 39262306a36Sopenharmony_ci#define UN_BIS(r,v) (UN_OUT((r), UN_IN(r) | (v))) 39362306a36Sopenharmony_ci#define UN_BIC(r,v) (UN_OUT((r), UN_IN(r) & ~(v))) 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ci/* Uninorth variant: 39662306a36Sopenharmony_ci * 39762306a36Sopenharmony_ci * 0 = not uninorth 39862306a36Sopenharmony_ci * 1 = U1.x or U2.x 39962306a36Sopenharmony_ci * 3 = U3 40062306a36Sopenharmony_ci * 4 = U4 40162306a36Sopenharmony_ci */ 40262306a36Sopenharmony_ciextern int pmac_get_uninorth_variant(void); 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci/* 40562306a36Sopenharmony_ci * Power macintoshes have either a CUDA, PMU or SMU controlling 40662306a36Sopenharmony_ci * system reset, power, NVRAM, RTC. 40762306a36Sopenharmony_ci */ 40862306a36Sopenharmony_citypedef enum sys_ctrler_kind { 40962306a36Sopenharmony_ci SYS_CTRLER_UNKNOWN = 0, 41062306a36Sopenharmony_ci SYS_CTRLER_CUDA = 1, 41162306a36Sopenharmony_ci SYS_CTRLER_PMU = 2, 41262306a36Sopenharmony_ci SYS_CTRLER_SMU = 3, 41362306a36Sopenharmony_ci} sys_ctrler_t; 41462306a36Sopenharmony_ciextern sys_ctrler_t sys_ctrler; 41562306a36Sopenharmony_ci 41662306a36Sopenharmony_ci#endif /* __ASM_POWERPC_PMAC_FEATURE_H */ 41762306a36Sopenharmony_ci#endif /* __KERNEL__ */ 418