ppc64: Add basic support for the SMU chip in iMac G5
Subsystems (2)
PATCH 1/1 ppc64: Add basic support for the SMU chip in iMac G5
Hi !
The iMac G5 and latest single-cpu PowerMac G5 have seen the venerable PMU (Power Management Unit) chip been sent to well deserved retirement. It has been replaced by a newcomer, the SMU (System Management Unit ?) which is of course totally undocumented and has no open source darwin driver... The SMU chip is responsible of initializing the chipset & CPU (boot process), power supply control, real time clock, fan control, provides some i2c busses, etc... etc... etc...
This is a very basic driver based on the Open Firmware methods for accessing this chip. It provides synchronous functions only, and does restart, shutdown, and real time clock access. There is still no fan control, at least not until we have figured out how to access the fans via the SMU.
The initial code was written by J. Mayer <[email protected]>, I mostly rewrote it to better adhere to our coding style standards ;)
The patch also updates the g5_defconfig to include the SMU support by default.
arch/ppc64/Kconfig +0 -1
@@ -81,7 +81,6 @@ depends on PPC_MULTIPLATFORM bool " Apple G5 based machines" default y - select ADB_PMU select U3_DART config PPC_MAPLE
arch/ppc64/kernel/misc.S +20 -0
@@ -292,6 +292,26 @@ isync blr +_GLOBAL(flush_inval_dcache_range) + ld r10,PPC64_CACHES@toc(r2) + lwz r7,DCACHEL1LINESIZE(r10) /* Get dcache line size */ + addi r5,r7,-1 + andc r6,r3,r5 /* round low to line bdy */ + subf r8,r6,r4 /* compute length */ + add r8,r8,r5 /* ensure we get enough */ + lwz r9,DCACHEL1LOGLINESIZE(r10)/* Get log-2 of dcache line size */ + srw. r8,r8,r9 /* compute line count */ + beqlr /* nothing to do? */ + sync + isync + mtctr r8 +0: dcbf 0,r6 + add r6,r6,r7 + bdnz 0b + sync + isync + blr + /* * Flush a particular page from the data cache to RAM.
arch/ppc64/kernel/pmac_setup.c +54 -5
106 lines not on this page · raw message
drivers/macintosh/Kconfig +8 -0
@@ -78,6 +78,14 @@ this device; you should do so if your machine is one of those mentioned above. +config PMAC_SMU + bool "Support for SMU based PowerMacs" + depends on PPC_PMAC64 + help + This option adds support for the newer G5 iMacs and PowerMacs based + on the "SMU" system control chip which replaces the old PMU. + If you don't know, say Y. + config PMAC_PBOOK bool "Power management support for PowerBooks" depends on ADB_PMU
drivers/macintosh/Makefile +1 -0
@@ -15,6 +15,7 @@ obj-$(CONFIG_ADB_PMU) += via-pmu.o obj-$(CONFIG_ADB_CUDA) += via-cuda.o obj-$(CONFIG_PMAC_APM_EMU) += apm_emu.o +obj-$(CONFIG_PMAC_SMU) += smu.o obj-$(CONFIG_ADB) += adb.o obj-$(CONFIG_ADB_MACII) += via-macii.o
drivers/macintosh/smu.c new file +364 -0
364 lines not on this page · raw message
include/asm-ppc64/cacheflush.h +1 -0
@@ -28,6 +28,7 @@extern void flush_dcache_range (unsigned long start,unsigned long stop);extern void flush_dcache_phys_range (unsigned long start,unsigned long stop); +extern void flush_inval_dcache_range (unsigned long start,unsigned long stop);#define copy_to_user_page (vma, page, vaddr, dst, src, len) \ do { memcpy(dst, src, len); \
include/asm-ppc/machdep.h +1 -0
@@ -121,6 +121,7 @@SYS_CTRLER_UNKNOWN =0 ,SYS_CTRLER_CUDA =1 ,SYS_CTRLER_PMU =2 , +SYS_CTRLER_SMU =3 , } sys_ctrler_t;extern sys_ctrler_t sys_ctrler;
include/asm-ppc64/smu.h new file +22 -0
@@ -0,0 +1,22 @@ +/* +* Definitions for talking to the SMU chip in newer G5 PowerMacs +*/ + +#include <linux/config.h> + +/* +* Basic routines for use by architecture. To be extended as +* we understand more of the chip +*/ +extern int smu_init (void ); +extern int smu_present (void ); +extern void smu_shutdown (void ); +extern void smu_restart (void ); +extern int smu_get_rtc_time (struct rtc_time *time); +extern int smu_set_rtc_time (struct rtc_time *time); + +/* +* SMU command buffer absolute address, exported by pmac_setup, +* this is allocated very early during boot. +*/ +extern unsigned long smu_cmdbuf_abs;
include/asm-ppc64/machdep.h +17 -0
@@ -135,6 +135,23 @@extern struct machdep_calls ppc_md;extern char cmd_line[COMMAND_LINE_SIZE ]; +#ifdef CONFIG_PPC_PMAC +/* +* Power macintoshes have either a CUDA, PMU or SMU controlling +* system reset, power, NVRAM, RTC. +*/ +typedef enum sys_ctrler_kind { +SYS_CTRLER_UNKNOWN =0 , +SYS_CTRLER_CUDA =1 , +SYS_CTRLER_PMU =2 , +SYS_CTRLER_SMU =3 , +}sys_ctrler_t ; +extern sys_ctrler_t sys_ctrler; + +#endif /* CONFIG_PPC_PMAC */ + + +/* Functions to produce codes on the leds. * The SRC code should be unique for the message category and should * be limited to the lower 24 bits (the upper 8 are set by these funcs),
drivers/macintosh/via-pmu.c +6 -2
@@ -367,9 +367,7 @@printk (KERN_INFO "PMU driver %d initialized for %s, firmware: %02x\n" ,PMU_DRIVER_VERSION , pbook_type[pmu_kind], pmu_version); -#ifndef CONFIG_PPC64 sys_ctrler =SYS_CTRLER_PMU ; -#endif return 1 ; }
@@ -1745,6 +1743,9 @@ {struct adb_request req; +if (via ==NULL ) +return ; +local_irq_disable (); drop_interrupts =1 ;
@@ -1767,6 +1768,9 @@ {struct adb_request req; +if (via ==NULL ) +return ; +local_irq_disable (); drop_interrupts =1 ;
arch/ppc64/kernel/pmac_time.c +77 -42
143 lines not on this page · raw message
arch/ppc64/configs/g5_defconfig +24 -3
@@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.11-rc3-bk6 -# Wed Feb 9 23:34:53 2005 +# Linux kernel version: 2.6.11 +# Thu Mar 10 16:47:04 2005 # CONFIG_64BIT=y CONFIG_MMU=y
@@ -30,6 +30,7 @@ CONFIG_POSIX_MQUEUE=y # CONFIG_BSD_PROCESS_ACCT is not set CONFIG_SYSCTL=y +# CONFIG_AUDIT is not set CONFIG_LOG_BUF_SHIFT=17 CONFIG_HOTPLUG=y CONFIG_KOBJECT_UEVENT=y
@@ -39,6 +40,7 @@ CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set # CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
@@ -48,6 +50,7 @@ CONFIG_CC_ALIGN_LOOPS=0 CONFIG_CC_ALIGN_JUMPS=0 # CONFIG_TINY_SHMEM is not set +CONFIG_BASE_SMALL=0 # # Loadable module support
@@ -94,6 +97,7 @@ # CONFIG_BINFMT_MISC is not set CONFIG_PCI_LEGACY_PROC=y CONFIG_PCI_NAMES=y +# CONFIG_HOTPLUG_CPU is not set # # PCCARD (PCMCIA/CardBus) support
@@ -279,6 +283,7 @@ # CONFIG_SCSI_ATA_PIIX is not set # CONFIG_SCSI_SATA_NV is not set # CONFIG_SCSI_SATA_PROMISE is not set +# CONFIG_SCSI_SATA_QSTOR is not set # CONFIG_SCSI_SATA_SX4 is not set # CONFIG_SCSI_SATA_SIL is not set # CONFIG_SCSI_SATA_SIS is not set
@@ -373,6 +378,7 @@ # CONFIG_ADB=y CONFIG_ADB_PMU=y +CONFIG_PMAC_SMU=y # CONFIG_PMAC_PBOOK is not set # CONFIG_PMAC_BACKLIGHT is not set # CONFIG_INPUT_ADBHID is not set
@@ -697,6 +703,11 @@ CONFIG_MAX_RAW_DEVS=256 # +# TPM devices +# +# CONFIG_TCG_TPM is not set + +# # I2C support # CONFIG_I2C=y
@@ -724,6 +735,7 @@ # CONFIG_I2C_MPC is not set # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_PARPORT_LIGHT is not set +# CONFIG_I2C_PIIX4 is not set # CONFIG_I2C_PROSAVAGE is not set # CONFIG_I2C_SAVAGE4 is not set # CONFIG_SCx200_ACB is not set
@@ -747,7 +759,9 @@ # CONFIG_SENSORS_ASB100 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_FSCHER is not set +# CONFIG_SENSORS_FSCPOS is not set # CONFIG_SENSORS_GL518SM is not set +# CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM75 is not set
@@ -761,6 +775,7 @@ # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_SMSC47B397 is not set +# CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_W83781D is not set
@@ -885,6 +900,8 @@ # CONFIG_USB_EHCI_SPLIT_ISO is not set # CONFIG_USB_EHCI_ROOT_HUB_TT is not set CONFIG_USB_OHCI_HCD=y +# CONFIG_USB_OHCI_BIG_ENDIAN is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y # CONFIG_USB_UHCI_HCD is not set # CONFIG_USB_SL811_HCD is not set
@@ -905,7 +922,7 @@ CONFIG_USB_STORAGE_FREECOM=y CONFIG_USB_STORAGE_ISD200=y CONFIG_USB_STORAGE_DPCM=y -CONFIG_USB_STORAGE_HP8200e=y +# CONFIG_USB_STORAGE_USBAT is not set CONFIG_USB_STORAGE_SDDR09=y CONFIG_USB_STORAGE_SDDR55=y CONFIG_USB_STORAGE_JUMPSHOT=y
@@ -976,6 +993,7 @@ # USB Network Adapters # CONFIG_USB_AX8817X=y +CONFIG_USB_MON=y # # USB port drivers
@@ -1038,6 +1056,7 @@ # CONFIG_USB_PHIDGETKIT is not set # CONFIG_USB_PHIDGETSERVO is not set # CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_TEST is not set #
@@ -1253,6 +1272,7 @@ # CONFIG_DEBUG_KERNEL=y CONFIG_MAGIC_SYSRQ=y +# CONFIG_PRINTK_TIME is not set # CONFIG_SCHEDSTATS is not set # CONFIG_DEBUG_SLAB is not set # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
@@ -1284,6 +1304,7 @@ CONFIG_CRYPTO_SHA256=m CONFIG_CRYPTO_SHA512=m CONFIG_CRYPTO_WP512=m +# CONFIG_CRYPTO_TGR192 is not set CONFIG_CRYPTO_DES=y CONFIG_CRYPTO_BLOWFISH=m CONFIG_CRYPTO_TWOFISH=m