Commit 9c837fb6 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6

* 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6:
  [SPARC64]: Fix show_stack() when stack argument is NULL.
  [SPARC]: Fix serial console node string creation.
  [SPARC]: Mark SBUS framebuffer ioctls as IGNORE in compat_ioctl.c
  [SPARC64]: asm-sparc64/floppy.h needs linux/pci.h
  [SPARC64]: Fix conflicts in SBUS/PCI/EBUS/ISA DMA handling.
  [VIDEO]: Fix OOPS in all SBUS framebuffer drivers.
  [SPARC64]: Handle mostek clock type in mini_rtc driver.
  [PARTITION]: Sun/Solaris VTOC table corrections
  [SPARC]: Fix floppy on some sun4c systems.
  [SPARC64]: Fix sun4u PCI config space accesses on sun4u.
  [PARTITION] MSDOS: Fix Sun num_partitions handling.
  [SPARC]: Update defconfig.
parents 63332a9d c1f193a7
# #
# Automatically generated make config: don't edit # Automatically generated make config: don't edit
# Linux kernel version: 2.6.22-rc1 # Linux kernel version: 2.6.23-rc1
# Mon May 14 03:25:14 2007 # Wed Jul 25 15:30:21 2007
# #
CONFIG_MMU=y CONFIG_MMU=y
CONFIG_HIGHMEM=y CONFIG_HIGHMEM=y
CONFIG_ZONE_DMA=y CONFIG_ZONE_DMA=y
CONFIG_GENERIC_ISA_DMA=y CONFIG_GENERIC_ISA_DMA=y
CONFIG_ARCH_NO_VIRT_TO_BUS=y
CONFIG_OF=y
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
# #
...@@ -23,12 +25,11 @@ CONFIG_LOCALVERSION="" ...@@ -23,12 +25,11 @@ CONFIG_LOCALVERSION=""
CONFIG_LOCALVERSION_AUTO=y CONFIG_LOCALVERSION_AUTO=y
CONFIG_SWAP=y CONFIG_SWAP=y
CONFIG_SYSVIPC=y CONFIG_SYSVIPC=y
# CONFIG_IPC_NS is not set
CONFIG_SYSVIPC_SYSCTL=y CONFIG_SYSVIPC_SYSCTL=y
CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE=y
# CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_BSD_PROCESS_ACCT is not set
# CONFIG_TASKSTATS is not set # CONFIG_TASKSTATS is not set
# CONFIG_UTS_NS is not set # CONFIG_USER_NS is not set
# CONFIG_AUDIT is not set # CONFIG_AUDIT is not set
# CONFIG_IKCONFIG is not set # CONFIG_IKCONFIG is not set
CONFIG_LOG_BUF_SHIFT=14 CONFIG_LOG_BUF_SHIFT=14
...@@ -63,24 +64,17 @@ CONFIG_SLAB=y ...@@ -63,24 +64,17 @@ CONFIG_SLAB=y
CONFIG_RT_MUTEXES=y CONFIG_RT_MUTEXES=y
# CONFIG_TINY_SHMEM is not set # CONFIG_TINY_SHMEM is not set
CONFIG_BASE_SMALL=0 CONFIG_BASE_SMALL=0
#
# Loadable module support
#
CONFIG_MODULES=y CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_UNLOAD=y
# CONFIG_MODULE_FORCE_UNLOAD is not set # CONFIG_MODULE_FORCE_UNLOAD is not set
# CONFIG_MODVERSIONS is not set # CONFIG_MODVERSIONS is not set
# CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SRCVERSION_ALL is not set
CONFIG_KMOD=y CONFIG_KMOD=y
#
# Block layer
#
CONFIG_BLOCK=y CONFIG_BLOCK=y
# CONFIG_LBD is not set # CONFIG_LBD is not set
# CONFIG_BLK_DEV_IO_TRACE is not set # CONFIG_BLK_DEV_IO_TRACE is not set
# CONFIG_LSF is not set # CONFIG_LSF is not set
# CONFIG_BLK_DEV_BSG is not set
# #
# IO Schedulers # IO Schedulers
...@@ -113,11 +107,14 @@ CONFIG_GENERIC_CALIBRATE_DELAY=y ...@@ -113,11 +107,14 @@ CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_ARCH_MAY_HAVE_PC_FDC=y CONFIG_ARCH_MAY_HAVE_PC_FDC=y
# CONFIG_ARCH_HAS_ILOG2_U32 is not set # CONFIG_ARCH_HAS_ILOG2_U32 is not set
# CONFIG_ARCH_HAS_ILOG2_U64 is not set # CONFIG_ARCH_HAS_ILOG2_U64 is not set
CONFIG_EMULATED_CMPXCHG=y
CONFIG_SUN_PM=y CONFIG_SUN_PM=y
# CONFIG_SUN4 is not set # CONFIG_SUN4 is not set
CONFIG_PCI=y CONFIG_PCI=y
CONFIG_PCI_SYSCALL=y
# CONFIG_ARCH_SUPPORTS_MSI is not set # CONFIG_ARCH_SUPPORTS_MSI is not set
# CONFIG_PCI_DEBUG is not set # CONFIG_PCI_DEBUG is not set
# CONFIG_NO_DMA is not set
CONFIG_SUN_OPENPROMFS=m CONFIG_SUN_OPENPROMFS=m
# CONFIG_SPARC_LED is not set # CONFIG_SPARC_LED is not set
CONFIG_BINFMT_ELF=y CONFIG_BINFMT_ELF=y
...@@ -134,6 +131,7 @@ CONFIG_FLAT_NODE_MEM_MAP=y ...@@ -134,6 +131,7 @@ CONFIG_FLAT_NODE_MEM_MAP=y
CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_SPLIT_PTLOCK_CPUS=4
# CONFIG_RESOURCES_64BIT is not set # CONFIG_RESOURCES_64BIT is not set
CONFIG_ZONE_DMA_FLAG=1 CONFIG_ZONE_DMA_FLAG=1
CONFIG_BOUNCE=y
# #
# Networking # Networking
...@@ -197,25 +195,13 @@ CONFIG_IPV6_TUNNEL=m ...@@ -197,25 +195,13 @@ CONFIG_IPV6_TUNNEL=m
# CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MULTIPLE_TABLES is not set
# CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_SECMARK is not set
# CONFIG_NETFILTER is not set # CONFIG_NETFILTER is not set
#
# DCCP Configuration (EXPERIMENTAL)
#
# CONFIG_IP_DCCP is not set # CONFIG_IP_DCCP is not set
#
# SCTP Configuration (EXPERIMENTAL)
#
CONFIG_IP_SCTP=m CONFIG_IP_SCTP=m
# CONFIG_SCTP_DBG_MSG is not set # CONFIG_SCTP_DBG_MSG is not set
CONFIG_SCTP_DBG_OBJCNT=y CONFIG_SCTP_DBG_OBJCNT=y
# CONFIG_SCTP_HMAC_NONE is not set # CONFIG_SCTP_HMAC_NONE is not set
# CONFIG_SCTP_HMAC_SHA1 is not set # CONFIG_SCTP_HMAC_SHA1 is not set
CONFIG_SCTP_HMAC_MD5=y CONFIG_SCTP_HMAC_MD5=y
#
# TIPC Configuration (EXPERIMENTAL)
#
# CONFIG_TIPC is not set # CONFIG_TIPC is not set
# CONFIG_ATM is not set # CONFIG_ATM is not set
# CONFIG_BRIDGE is not set # CONFIG_BRIDGE is not set
...@@ -253,6 +239,7 @@ CONFIG_AF_RXRPC=m ...@@ -253,6 +239,7 @@ CONFIG_AF_RXRPC=m
# CONFIG_MAC80211 is not set # CONFIG_MAC80211 is not set
# CONFIG_IEEE80211 is not set # CONFIG_IEEE80211 is not set
# CONFIG_RFKILL is not set # CONFIG_RFKILL is not set
# CONFIG_NET_9P is not set
# #
# Device Drivers # Device Drivers
...@@ -267,28 +254,12 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y ...@@ -267,28 +254,12 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
# CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DRIVER is not set
# CONFIG_DEBUG_DEVRES is not set # CONFIG_DEBUG_DEVRES is not set
# CONFIG_SYS_HYPERVISOR is not set # CONFIG_SYS_HYPERVISOR is not set
#
# Connector - unified userspace <-> kernelspace linker
#
# CONFIG_CONNECTOR is not set # CONFIG_CONNECTOR is not set
# CONFIG_MTD is not set # CONFIG_MTD is not set
CONFIG_OF_DEVICE=y
#
# Parallel port support
#
# CONFIG_PARPORT is not set # CONFIG_PARPORT is not set
CONFIG_BLK_DEV=y
#
# Plug and Play support
#
# CONFIG_PNPACPI is not set
#
# Block devices
#
# CONFIG_BLK_DEV_FD is not set # CONFIG_BLK_DEV_FD is not set
# CONFIG_BLK_CPQ_DA is not set
# CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_BLK_DEV_DAC960 is not set # CONFIG_BLK_DEV_DAC960 is not set
# CONFIG_BLK_DEV_UMEM is not set # CONFIG_BLK_DEV_UMEM is not set
...@@ -303,18 +274,11 @@ CONFIG_BLK_DEV_RAM_SIZE=4096 ...@@ -303,18 +274,11 @@ CONFIG_BLK_DEV_RAM_SIZE=4096
CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
# CONFIG_CDROM_PKTCDVD is not set # CONFIG_CDROM_PKTCDVD is not set
# CONFIG_ATA_OVER_ETH is not set # CONFIG_ATA_OVER_ETH is not set
CONFIG_MISC_DEVICES=y
#
# Misc devices
#
# CONFIG_PHANTOM is not set # CONFIG_PHANTOM is not set
# CONFIG_EEPROM_93CX6 is not set
# CONFIG_SGI_IOC4 is not set # CONFIG_SGI_IOC4 is not set
# CONFIG_TIFM_CORE is not set # CONFIG_TIFM_CORE is not set
# CONFIG_BLINK is not set
#
# ATA/ATAPI/MFM/RLL support
#
# CONFIG_IDE is not set # CONFIG_IDE is not set
# #
...@@ -322,6 +286,7 @@ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 ...@@ -322,6 +286,7 @@ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
# #
# CONFIG_RAID_ATTRS is not set # CONFIG_RAID_ATTRS is not set
CONFIG_SCSI=y CONFIG_SCSI=y
CONFIG_SCSI_DMA=y
# CONFIG_SCSI_TGT is not set # CONFIG_SCSI_TGT is not set
# CONFIG_SCSI_NETLINK is not set # CONFIG_SCSI_NETLINK is not set
CONFIG_SCSI_PROC_FS=y CONFIG_SCSI_PROC_FS=y
...@@ -352,12 +317,8 @@ CONFIG_SCSI_WAIT_SCAN=m ...@@ -352,12 +317,8 @@ CONFIG_SCSI_WAIT_SCAN=m
CONFIG_SCSI_SPI_ATTRS=y CONFIG_SCSI_SPI_ATTRS=y
# CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set
# CONFIG_SCSI_ISCSI_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set
# CONFIG_SCSI_SAS_ATTRS is not set
# CONFIG_SCSI_SAS_LIBSAS is not set # CONFIG_SCSI_SAS_LIBSAS is not set
CONFIG_SCSI_LOWLEVEL=y
#
# SCSI low-level drivers
#
# CONFIG_ISCSI_TCP is not set # CONFIG_ISCSI_TCP is not set
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
# CONFIG_SCSI_3W_9XXX is not set # CONFIG_SCSI_3W_9XXX is not set
...@@ -367,7 +328,6 @@ CONFIG_SCSI_SPI_ATTRS=y ...@@ -367,7 +328,6 @@ CONFIG_SCSI_SPI_ATTRS=y
# CONFIG_SCSI_AIC7XXX_OLD is not set # CONFIG_SCSI_AIC7XXX_OLD is not set
# CONFIG_SCSI_AIC79XX is not set # CONFIG_SCSI_AIC79XX is not set
# CONFIG_SCSI_AIC94XX is not set # CONFIG_SCSI_AIC94XX is not set
# CONFIG_SCSI_DPT_I2O is not set
# CONFIG_SCSI_ARCMSR is not set # CONFIG_SCSI_ARCMSR is not set
# CONFIG_MEGARAID_NEWGEN is not set # CONFIG_MEGARAID_NEWGEN is not set
# CONFIG_MEGARAID_LEGACY is not set # CONFIG_MEGARAID_LEGACY is not set
...@@ -389,14 +349,9 @@ CONFIG_SCSI_QLOGICPTI=m ...@@ -389,14 +349,9 @@ CONFIG_SCSI_QLOGICPTI=m
# CONFIG_SCSI_DC390T is not set # CONFIG_SCSI_DC390T is not set
# CONFIG_SCSI_NSP32 is not set # CONFIG_SCSI_NSP32 is not set
# CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_DEBUG is not set
CONFIG_SCSI_ESP_CORE=y
CONFIG_SCSI_SUNESP=y CONFIG_SCSI_SUNESP=y
# CONFIG_SCSI_SRP is not set # CONFIG_SCSI_SRP is not set
# CONFIG_ATA is not set # CONFIG_ATA is not set
#
# Multi-device support (RAID and LVM)
#
# CONFIG_MD is not set # CONFIG_MD is not set
# #
...@@ -412,30 +367,16 @@ CONFIG_SCSI_SUNESP=y ...@@ -412,30 +367,16 @@ CONFIG_SCSI_SUNESP=y
# #
# CONFIG_FIREWIRE is not set # CONFIG_FIREWIRE is not set
# CONFIG_IEEE1394 is not set # CONFIG_IEEE1394 is not set
#
# I2O device support
#
# CONFIG_I2O is not set # CONFIG_I2O is not set
#
# Network device support
#
CONFIG_NETDEVICES=y CONFIG_NETDEVICES=y
# CONFIG_NETDEVICES_MULTIQUEUE is not set
CONFIG_DUMMY=m CONFIG_DUMMY=m
# CONFIG_BONDING is not set # CONFIG_BONDING is not set
# CONFIG_MACVLAN is not set
# CONFIG_EQUALIZER is not set # CONFIG_EQUALIZER is not set
CONFIG_TUN=m CONFIG_TUN=m
#
# ARCnet devices
#
# CONFIG_ARCNET is not set # CONFIG_ARCNET is not set
# CONFIG_PHYLIB is not set # CONFIG_PHYLIB is not set
#
# Ethernet (10 or 100Mbit)
#
CONFIG_NET_ETHERNET=y CONFIG_NET_ETHERNET=y
CONFIG_MII=m CONFIG_MII=m
CONFIG_SUNLANCE=y CONFIG_SUNLANCE=y
...@@ -445,10 +386,6 @@ CONFIG_SUNQE=m ...@@ -445,10 +386,6 @@ CONFIG_SUNQE=m
# CONFIG_SUNGEM is not set # CONFIG_SUNGEM is not set
# CONFIG_CASSINI is not set # CONFIG_CASSINI is not set
# CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_3COM is not set
#
# Tulip family network device support
#
# CONFIG_NET_TULIP is not set # CONFIG_NET_TULIP is not set
# CONFIG_HP100 is not set # CONFIG_HP100 is not set
# CONFIG_NET_PCI is not set # CONFIG_NET_PCI is not set
...@@ -464,7 +401,7 @@ CONFIG_NETDEV_1000=y ...@@ -464,7 +401,7 @@ CONFIG_NETDEV_1000=y
# CONFIG_SIS190 is not set # CONFIG_SIS190 is not set
# CONFIG_SKGE is not set # CONFIG_SKGE is not set
# CONFIG_SKY2 is not set # CONFIG_SKY2 is not set
# CONFIG_SK98LIN is not set # CONFIG_VIA_VELOCITY is not set
# CONFIG_TIGON3 is not set # CONFIG_TIGON3 is not set
# CONFIG_BNX2 is not set # CONFIG_BNX2 is not set
# CONFIG_QLA3XXX is not set # CONFIG_QLA3XXX is not set
...@@ -477,11 +414,6 @@ CONFIG_NETDEV_10000=y ...@@ -477,11 +414,6 @@ CONFIG_NETDEV_10000=y
# CONFIG_MYRI10GE is not set # CONFIG_MYRI10GE is not set
# CONFIG_NETXEN_NIC is not set # CONFIG_NETXEN_NIC is not set
# CONFIG_MLX4_CORE is not set # CONFIG_MLX4_CORE is not set
CONFIG_MLX4_DEBUG=y
#
# Token Ring devices
#
# CONFIG_TR is not set # CONFIG_TR is not set
# #
...@@ -499,15 +431,7 @@ CONFIG_MLX4_DEBUG=y ...@@ -499,15 +431,7 @@ CONFIG_MLX4_DEBUG=y
# CONFIG_NETCONSOLE is not set # CONFIG_NETCONSOLE is not set
# CONFIG_NETPOLL is not set # CONFIG_NETPOLL is not set
# CONFIG_NET_POLL_CONTROLLER is not set # CONFIG_NET_POLL_CONTROLLER is not set
#
# ISDN subsystem
#
# CONFIG_ISDN is not set # CONFIG_ISDN is not set
#
# Telephony Support
#
# CONFIG_PHONE is not set # CONFIG_PHONE is not set
# #
...@@ -515,6 +439,7 @@ CONFIG_MLX4_DEBUG=y ...@@ -515,6 +439,7 @@ CONFIG_MLX4_DEBUG=y
# #
CONFIG_INPUT=y CONFIG_INPUT=y
# CONFIG_INPUT_FF_MEMLESS is not set # CONFIG_INPUT_FF_MEMLESS is not set
# CONFIG_INPUT_POLLDEV is not set
# #
# Userland interfaces # Userland interfaces
...@@ -593,22 +518,13 @@ CONFIG_SERIAL_CORE_CONSOLE=y ...@@ -593,22 +518,13 @@ CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_UNIX98_PTYS=y CONFIG_UNIX98_PTYS=y
CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=256 CONFIG_LEGACY_PTY_COUNT=256
#
# IPMI
#
# CONFIG_IPMI_HANDLER is not set # CONFIG_IPMI_HANDLER is not set
# CONFIG_WATCHDOG is not set # CONFIG_WATCHDOG is not set
CONFIG_HW_RANDOM=m CONFIG_HW_RANDOM=m
CONFIG_JS_RTC=m CONFIG_JS_RTC=m
# CONFIG_R3964 is not set # CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set # CONFIG_APPLICOM is not set
# CONFIG_DRM is not set
# CONFIG_RAW_DRIVER is not set # CONFIG_RAW_DRIVER is not set
#
# TPM devices
#
# CONFIG_TCG_TPM is not set # CONFIG_TCG_TPM is not set
CONFIG_DEVPORT=y CONFIG_DEVPORT=y
# CONFIG_I2C is not set # CONFIG_I2C is not set
...@@ -618,20 +534,24 @@ CONFIG_DEVPORT=y ...@@ -618,20 +534,24 @@ CONFIG_DEVPORT=y
# #
# CONFIG_SPI is not set # CONFIG_SPI is not set
# CONFIG_SPI_MASTER is not set # CONFIG_SPI_MASTER is not set
#
# Dallas's 1-wire bus
#
# CONFIG_W1 is not set # CONFIG_W1 is not set
# CONFIG_POWER_SUPPLY is not set
CONFIG_HWMON=y CONFIG_HWMON=y
# CONFIG_HWMON_VID is not set # CONFIG_HWMON_VID is not set
# CONFIG_SENSORS_ABITUGURU is not set # CONFIG_SENSORS_ABITUGURU is not set
# CONFIG_SENSORS_ABITUGURU3 is not set
# CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71805F is not set
# CONFIG_SENSORS_IT87 is not set
# CONFIG_SENSORS_PC87360 is not set
# CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_PC87427 is not set
# CONFIG_SENSORS_SIS5595 is not set
# CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M1 is not set
# CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SMSC47B397 is not set
# CONFIG_SENSORS_VIA686A is not set
# CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_VT1211 is not set
# CONFIG_SENSORS_VT8231 is not set
# CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627HF is not set
# CONFIG_SENSORS_W83627EHF is not set
# CONFIG_HWMON_DEBUG_CHIP is not set # CONFIG_HWMON_DEBUG_CHIP is not set
# #
...@@ -656,6 +576,7 @@ CONFIG_HWMON=y ...@@ -656,6 +576,7 @@ CONFIG_HWMON=y
# #
# CONFIG_DISPLAY_SUPPORT is not set # CONFIG_DISPLAY_SUPPORT is not set
# CONFIG_VGASTATE is not set # CONFIG_VGASTATE is not set
# CONFIG_VIDEO_OUTPUT_CONTROL is not set
# CONFIG_FB is not set # CONFIG_FB is not set
# #
...@@ -668,16 +589,10 @@ CONFIG_DUMMY_CONSOLE=y ...@@ -668,16 +589,10 @@ CONFIG_DUMMY_CONSOLE=y
# Sound # Sound
# #
# CONFIG_SOUND is not set # CONFIG_SOUND is not set
CONFIG_HID_SUPPORT=y
#
# HID Devices
#
CONFIG_HID=y CONFIG_HID=y
# CONFIG_HID_DEBUG is not set # CONFIG_HID_DEBUG is not set
CONFIG_USB_SUPPORT=y
#
# USB support
#
CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB_ARCH_HAS_OHCI=y CONFIG_USB_ARCH_HAS_OHCI=y
CONFIG_USB_ARCH_HAS_EHCI=y CONFIG_USB_ARCH_HAS_EHCI=y
...@@ -692,29 +607,9 @@ CONFIG_USB_ARCH_HAS_EHCI=y ...@@ -692,29 +607,9 @@ CONFIG_USB_ARCH_HAS_EHCI=y
# #
# CONFIG_USB_GADGET is not set # CONFIG_USB_GADGET is not set
# CONFIG_MMC is not set # CONFIG_MMC is not set
#
# LED devices
#
# CONFIG_NEW_LEDS is not set # CONFIG_NEW_LEDS is not set
#
# LED drivers
#
#
# LED Triggers
#
#
# InfiniBand support
#
# CONFIG_INFINIBAND is not set # CONFIG_INFINIBAND is not set
#
# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
#
# #
# Real Time Clock # Real Time Clock
# #
...@@ -733,6 +628,11 @@ CONFIG_USB_ARCH_HAS_EHCI=y ...@@ -733,6 +628,11 @@ CONFIG_USB_ARCH_HAS_EHCI=y
# DMA Devices # DMA Devices
# #
#
# Userspace I/O
#
# CONFIG_UIO is not set
# #
# Misc Linux/SPARC drivers # Misc Linux/SPARC drivers
# #
...@@ -853,7 +753,6 @@ CONFIG_CIFS=m ...@@ -853,7 +753,6 @@ CONFIG_CIFS=m
# CONFIG_CODA_FS is not set # CONFIG_CODA_FS is not set
CONFIG_AFS_FS=m CONFIG_AFS_FS=m
# CONFIG_AFS_DEBUG is not set # CONFIG_AFS_DEBUG is not set
# CONFIG_9P_FS is not set
# #
# Partition Types # Partition Types
...@@ -927,6 +826,7 @@ CONFIG_MAGIC_SYSRQ=y ...@@ -927,6 +826,7 @@ CONFIG_MAGIC_SYSRQ=y
# CONFIG_HEADERS_CHECK is not set # CONFIG_HEADERS_CHECK is not set
CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_KERNEL=y
CONFIG_DETECT_SOFTLOCKUP=y CONFIG_DETECT_SOFTLOCKUP=y
# CONFIG_SCHED_DEBUG is not set
# CONFIG_SCHEDSTATS is not set # CONFIG_SCHEDSTATS is not set
# CONFIG_TIMER_STATS is not set # CONFIG_TIMER_STATS is not set
# CONFIG_DEBUG_SLAB is not set # CONFIG_DEBUG_SLAB is not set
...@@ -953,10 +853,6 @@ CONFIG_FORCED_INLINING=y ...@@ -953,10 +853,6 @@ CONFIG_FORCED_INLINING=y
CONFIG_KEYS=y CONFIG_KEYS=y
# CONFIG_KEYS_DEBUG_PROC_KEYS is not set # CONFIG_KEYS_DEBUG_PROC_KEYS is not set
# CONFIG_SECURITY is not set # CONFIG_SECURITY is not set
#
# Cryptographic options
#
CONFIG_CRYPTO=y CONFIG_CRYPTO=y
CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI=y
CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_BLKCIPHER=y
...@@ -996,10 +892,7 @@ CONFIG_CRYPTO_MICHAEL_MIC=m ...@@ -996,10 +892,7 @@ CONFIG_CRYPTO_MICHAEL_MIC=m
CONFIG_CRYPTO_CRC32C=m CONFIG_CRYPTO_CRC32C=m
# CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAMELLIA is not set
# CONFIG_CRYPTO_TEST is not set # CONFIG_CRYPTO_TEST is not set
# CONFIG_CRYPTO_HW is not set
#
# Hardware crypto devices
#
# #
# Library routines # Library routines
...@@ -1009,6 +902,7 @@ CONFIG_BITREVERSE=y ...@@ -1009,6 +902,7 @@ CONFIG_BITREVERSE=y
# CONFIG_CRC16 is not set # CONFIG_CRC16 is not set
# CONFIG_CRC_ITU_T is not set # CONFIG_CRC_ITU_T is not set
CONFIG_CRC32=y CONFIG_CRC32=y
# CONFIG_CRC7 is not set
CONFIG_LIBCRC32C=m CONFIG_LIBCRC32C=m
CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=y CONFIG_ZLIB_DEFLATE=y
......
...@@ -415,7 +415,7 @@ static void __init of_console_init(void) ...@@ -415,7 +415,7 @@ static void __init of_console_init(void)
unsigned long flags; unsigned long flags;
const char *type; const char *type;
phandle node; phandle node;
int skip, fd; int skip, tmp, fd;
of_console_path = prom_early_alloc(256); of_console_path = prom_early_alloc(256);
...@@ -442,8 +442,9 @@ static void __init of_console_init(void) ...@@ -442,8 +442,9 @@ static void __init of_console_init(void)
prom_halt(); prom_halt();
} }
tmp = skip;
for_each_node_by_type(dp, type) { for_each_node_by_type(dp, type) {
if (!skip--) if (!tmp--)
break; break;
} }
if (!dp) { if (!dp) {
......
...@@ -8,14 +8,14 @@ EXTRA_CFLAGS := -Werror ...@@ -8,14 +8,14 @@ EXTRA_CFLAGS := -Werror
extra-y := head.o init_task.o vmlinux.lds extra-y := head.o init_task.o vmlinux.lds
obj-y := process.o setup.o cpu.o idprom.o \ obj-y := process.o setup.o cpu.o idprom.o \
traps.o auxio.o una_asm.o sysfs.o \ traps.o auxio.o una_asm.o sysfs.o iommu.o \
irq.o ptrace.o time.o sys_sparc.o signal.o \ irq.o ptrace.o time.o sys_sparc.o signal.o \
unaligned.o central.o pci.o starfire.o semaphore.o \ unaligned.o central.o pci.o starfire.o semaphore.o \
power.o sbus.o iommu_common.o sparc64_ksyms.o chmc.o \ power.o sbus.o iommu_common.o sparc64_ksyms.o chmc.o \
visemul.o prom.o of_device.o hvapi.o sstate.o mdesc.o visemul.o prom.o of_device.o hvapi.o sstate.o mdesc.o
obj-$(CONFIG_STACKTRACE) += stacktrace.o obj-$(CONFIG_STACKTRACE) += stacktrace.o
obj-$(CONFIG_PCI) += ebus.o isa.o pci_common.o pci_iommu.o \ obj-$(CONFIG_PCI) += ebus.o isa.o pci_common.o \
pci_psycho.o pci_sabre.o pci_schizo.o \ pci_psycho.o pci_sabre.o pci_schizo.o \
pci_sun4v.o pci_sun4v_asm.o pci_fire.o pci_sun4v.o pci_sun4v_asm.o pci_fire.o
obj-$(CONFIG_SMP) += smp.o trampoline.o hvtramp.o obj-$(CONFIG_SMP) += smp.o trampoline.o hvtramp.o
......
...@@ -391,6 +391,8 @@ static void __init fill_ebus_device(struct device_node *dp, struct linux_ebus_de ...@@ -391,6 +391,8 @@ static void __init fill_ebus_device(struct device_node *dp, struct linux_ebus_de
sd = &dev->ofdev.dev.archdata; sd = &dev->ofdev.dev.archdata;
sd->prom_node = dp; sd->prom_node = dp;
sd->op = &dev->ofdev; sd->op = &dev->ofdev;
sd->iommu = dev->bus->ofdev.dev.parent->archdata.iommu;
sd->stc = dev->bus->ofdev.dev.parent->archdata.stc;
dev->ofdev.node = dp; dev->ofdev.node = dp;
dev->ofdev.dev.parent = &dev->bus->ofdev.dev; dev->ofdev.dev.parent = &dev->bus->ofdev.dev;
......
...@@ -90,6 +90,8 @@ static void __init isa_fill_devices(struct sparc_isa_bridge *isa_br) ...@@ -90,6 +90,8 @@ static void __init isa_fill_devices(struct sparc_isa_bridge *isa_br)
sd = &isa_dev->ofdev.dev.archdata; sd = &isa_dev->ofdev.dev.archdata;
sd->prom_node = dp; sd->prom_node = dp;
sd->op = &isa_dev->ofdev; sd->op = &isa_dev->ofdev;
sd->iommu = isa_br->ofdev.dev.parent->archdata.iommu;
sd->stc = isa_br->ofdev.dev.parent->archdata.stc;
isa_dev->ofdev.node = dp; isa_dev->ofdev.node = dp;
isa_dev->ofdev.dev.parent = &isa_br->ofdev.dev; isa_dev->ofdev.dev.parent = &isa_br->ofdev.dev;
......
...@@ -283,12 +283,6 @@ int __init pcic_present(void) ...@@ -283,12 +283,6 @@ int __init pcic_present(void)
return pci_controller_scan(pci_is_controller); return pci_controller_scan(pci_is_controller);
} }
const struct pci_iommu_ops *pci_iommu_ops;
EXPORT_SYMBOL(pci_iommu_ops);
extern const struct pci_iommu_ops pci_sun4u_iommu_ops,
pci_sun4v_iommu_ops;
/* Find each controller in the system, attach and initialize /* Find each controller in the system, attach and initialize
* software state structure for each and link into the * software state structure for each and link into the
* pci_pbm_root. Setup the controller enough such * pci_pbm_root. Setup the controller enough such
...@@ -296,11 +290,6 @@ extern const struct pci_iommu_ops pci_sun4u_iommu_ops, ...@@ -296,11 +290,6 @@ extern const struct pci_iommu_ops pci_sun4u_iommu_ops,
*/ */
static void __init pci_controller_probe(void) static void __init pci_controller_probe(void)
{ {
if (tlb_type == hypervisor)
pci_iommu_ops = &pci_sun4v_iommu_ops;
else
pci_iommu_ops = &pci_sun4u_iommu_ops;
printk("PCI: Probing for controllers.\n"); printk("PCI: Probing for controllers.\n");
pci_controller_scan(pci_controller_init); pci_controller_scan(pci_controller_init);
...@@ -406,6 +395,10 @@ struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm, ...@@ -406,6 +395,10 @@ struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm,
sd->op = of_find_device_by_node(node); sd->op = of_find_device_by_node(node);
sd->msi_num = 0xffffffff; sd->msi_num = 0xffffffff;
sd = &sd->op->dev.archdata;
sd->iommu = pbm->iommu;
sd->stc = &pbm->stc;
type = of_get_property(node, "device_type", NULL); type = of_get_property(node, "device_type", NULL);
if (type == NULL) if (type == NULL)
type = ""; type = "";
...@@ -422,10 +415,15 @@ struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm, ...@@ -422,10 +415,15 @@ struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm,
dev->multifunction = 0; /* maybe a lie? */ dev->multifunction = 0; /* maybe a lie? */
if (host_controller) { if (host_controller) {
dev->vendor = 0x108e; if (tlb_type != hypervisor) {
dev->device = 0x8000; pci_read_config_word(dev, PCI_VENDOR_ID,
dev->subsystem_vendor = 0x0000; &dev->vendor);
dev->subsystem_device = 0x0000; pci_read_config_word(dev, PCI_DEVICE_ID,
&dev->device);
} else {
dev->vendor = PCI_VENDOR_ID_SUN;
dev->device = 0x80f0;
}
dev->cfg_size = 256; dev->cfg_size = 256;
dev->class = PCI_CLASS_BRIDGE_HOST << 8; dev->class = PCI_CLASS_BRIDGE_HOST << 8;
sprintf(pci_name(dev), "%04x:%02x:%02x.%d", pci_domain_nr(bus), sprintf(pci_name(dev), "%04x:%02x:%02x.%d", pci_domain_nr(bus),
...@@ -818,7 +816,7 @@ int pci_host_bridge_read_pci_cfg(struct pci_bus *bus_dev, ...@@ -818,7 +816,7 @@ int pci_host_bridge_read_pci_cfg(struct pci_bus *bus_dev,
{ {
static u8 fake_pci_config[] = { static u8 fake_pci_config[] = {
0x8e, 0x10, /* Vendor: 0x108e (Sun) */ 0x8e, 0x10, /* Vendor: 0x108e (Sun) */
0x00, 0x80, /* Device: 0x8000 (PBM) */ 0xf0, 0x80, /* Device: 0x80f0 (Fire) */
0x46, 0x01, /* Command: 0x0146 (SERR, PARITY, MASTER, MEM) */ 0x46, 0x01, /* Command: 0x0146 (SERR, PARITY, MASTER, MEM) */
0xa0, 0x22, /* Status: 0x02a0 (DEVSEL_MED, FB2B, 66MHZ) */ 0xa0, 0x22, /* Status: 0x02a0 (DEVSEL_MED, FB2B, 66MHZ) */
0x00, 0x00, 0x00, 0x06, /* Class: 0x06000000 host bridge */ 0x00, 0x00, 0x00, 0x06, /* Class: 0x06000000 host bridge */
...@@ -1221,4 +1219,51 @@ struct device_node *pci_device_to_OF_node(struct pci_dev *pdev) ...@@ -1221,4 +1219,51 @@ struct device_node *pci_device_to_OF_node(struct pci_dev *pdev)
} }
EXPORT_SYMBOL(pci_device_to_OF_node); EXPORT_SYMBOL(pci_device_to_OF_node);
static void ali_sound_dma_hack(struct pci_dev *pdev, int set_bit)
{
struct pci_dev *ali_isa_bridge;
u8 val;
/* ALI sound chips generate 31-bits of DMA, a special register
* determines what bit 31 is emitted as.
*/
ali_isa_bridge = pci_get_device(PCI_VENDOR_ID_AL,
PCI_DEVICE_ID_AL_M1533,
NULL);
pci_read_config_byte(ali_isa_bridge, 0x7e, &val);
if (set_bit)
val |= 0x01;
else
val &= ~0x01;
pci_write_config_byte(ali_isa_bridge, 0x7e, val);
pci_dev_put(ali_isa_bridge);
}
int pci_dma_supported(struct pci_dev *pdev, u64 device_mask)
{
u64 dma_addr_mask;
if (pdev == NULL) {
dma_addr_mask = 0xffffffff;
} else {
struct iommu *iommu = pdev->dev.archdata.iommu;
dma_addr_mask = iommu->dma_addr_mask;
if (pdev->vendor == PCI_VENDOR_ID_AL &&
pdev->device == PCI_DEVICE_ID_AL_M5451 &&
device_mask == 0x7fffffff) {
ali_sound_dma_hack(pdev,
(dma_addr_mask & 0x80000000) != 0);
return 1;
}
}
if (device_mask >= (1UL << 32UL))
return 0;
return (device_mask & dma_addr_mask) == dma_addr_mask;
}
#endif /* !(CONFIG_PCI) */ #endif /* !(CONFIG_PCI) */
...@@ -44,6 +44,67 @@ static void *sun4u_config_mkaddr(struct pci_pbm_info *pbm, ...@@ -44,6 +44,67 @@ static void *sun4u_config_mkaddr(struct pci_pbm_info *pbm,
return (void *) (pbm->config_space | bus | devfn | reg); return (void *) (pbm->config_space | bus | devfn | reg);
} }
/* At least on Sabre, it is necessary to access all PCI host controller
* registers at their natural size, otherwise zeros are returned.
* Strange but true, and I see no language in the UltraSPARC-IIi
* programmer's manual that mentions this even indirectly.
*/
static int sun4u_read_pci_cfg_host(struct pci_pbm_info *pbm,
unsigned char bus, unsigned int devfn,
int where, int size, u32 *value)
{
u32 tmp32, *addr;
u16 tmp16;
u8 tmp8;
addr = sun4u_config_mkaddr(pbm, bus, devfn, where);
if (!addr)
return PCIBIOS_SUCCESSFUL;
switch (size) {
case 1:
if (where < 8) {
unsigned long align = (unsigned long) addr;
align &= ~1;
pci_config_read16((u16 *)align, &tmp16);
if (where & 1)
*value = tmp16 >> 8;
else
*value = tmp16 & 0xff;
} else {
pci_config_read8((u8 *)addr, &tmp8);
*value = (u32) tmp8;
}
break;
case 2:
if (where < 8) {
pci_config_read16((u16 *)addr, &tmp16);
*value = (u32) tmp16;
} else {
pci_config_read8((u8 *)addr, &tmp8);
*value = (u32) tmp8;
pci_config_read8(((u8 *)addr) + 1, &tmp8);
*value |= ((u32) tmp8) << 8;
}
break;
case 4:
tmp32 = 0xffffffff;
sun4u_read_pci_cfg_host(pbm, bus, devfn,
where, 2, &tmp32);
*value = tmp32;
tmp32 = 0xffffffff;
sun4u_read_pci_cfg_host(pbm, bus, devfn,
where + 2, 2, &tmp32);
*value |= tmp32 << 16;
break;
}
return PCIBIOS_SUCCESSFUL;
}
static int sun4u_read_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn, static int sun4u_read_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn,
int where, int size, u32 *value) int where, int size, u32 *value)
{ {
...@@ -53,10 +114,6 @@ static int sun4u_read_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn, ...@@ -53,10 +114,6 @@ static int sun4u_read_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn,
u16 tmp16; u16 tmp16;
u8 tmp8; u8 tmp8;
if (bus_dev == pbm->pci_bus && devfn == 0x00)
return pci_host_bridge_read_pci_cfg(bus_dev, devfn, where,
size, value);
switch (size) { switch (size) {
case 1: case 1:
*value = 0xff; *value = 0xff;
...@@ -69,6 +126,10 @@ static int sun4u_read_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn, ...@@ -69,6 +126,10 @@ static int sun4u_read_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn,
break; break;
} }
if (!bus_dev->number && !PCI_SLOT(devfn))
return sun4u_read_pci_cfg_host(pbm, bus, devfn, where,
size, value);
addr = sun4u_config_mkaddr(pbm, bus, devfn, where); addr = sun4u_config_mkaddr(pbm, bus, devfn, where);
if (!addr) if (!addr)
return PCIBIOS_SUCCESSFUL; return PCIBIOS_SUCCESSFUL;
...@@ -101,6 +162,53 @@ static int sun4u_read_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn, ...@@ -101,6 +162,53 @@ static int sun4u_read_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn,
return PCIBIOS_SUCCESSFUL; return PCIBIOS_SUCCESSFUL;
} }
static int sun4u_write_pci_cfg_host(struct pci_pbm_info *pbm,
unsigned char bus, unsigned int devfn,
int where, int size, u32 value)
{
u32 *addr;
addr = sun4u_config_mkaddr(pbm, bus, devfn, where);
if (!addr)
return PCIBIOS_SUCCESSFUL;
switch (size) {
case 1:
if (where < 8) {
unsigned long align = (unsigned long) addr;
u16 tmp16;
align &= ~1;
pci_config_read16((u16 *)align, &tmp16);
if (where & 1) {
tmp16 &= 0x00ff;
tmp16 |= value << 8;
} else {
tmp16 &= 0xff00;
tmp16 |= value;
}
pci_config_write16((u16 *)align, tmp16);
} else
pci_config_write8((u8 *)addr, value);
break;
case 2:
if (where < 8) {
pci_config_write16((u16 *)addr, value);
} else {
pci_config_write8((u8 *)addr, value & 0xff);
pci_config_write8(((u8 *)addr) + 1, value >> 8);
}
break;
case 4:
sun4u_write_pci_cfg_host(pbm, bus, devfn,
where, 2, value & 0xffff);
sun4u_write_pci_cfg_host(pbm, bus, devfn,
where + 2, 2, value >> 16);
break;
}
return PCIBIOS_SUCCESSFUL;
}
static int sun4u_write_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn, static int sun4u_write_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn,
int where, int size, u32 value) int where, int size, u32 value)
{ {
...@@ -108,9 +216,10 @@ static int sun4u_write_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn, ...@@ -108,9 +216,10 @@ static int sun4u_write_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn,
unsigned char bus = bus_dev->number; unsigned char bus = bus_dev->number;
u32 *addr; u32 *addr;
if (bus_dev == pbm->pci_bus && devfn == 0x00) if (!bus_dev->number && !PCI_SLOT(devfn))
return pci_host_bridge_write_pci_cfg(bus_dev, devfn, where, return sun4u_write_pci_cfg_host(pbm, bus, devfn, where,
size, value); size, value);
addr = sun4u_config_mkaddr(pbm, bus, devfn, where); addr = sun4u_config_mkaddr(pbm, bus, devfn, where);
if (!addr) if (!addr)
return PCIBIOS_SUCCESSFUL; return PCIBIOS_SUCCESSFUL;
......
...@@ -39,12 +39,12 @@ static void pci_fire_scan_bus(struct pci_pbm_info *pbm) ...@@ -39,12 +39,12 @@ static void pci_fire_scan_bus(struct pci_pbm_info *pbm)
#define FIRE_IOMMU_FLUSH 0x40100UL #define FIRE_IOMMU_FLUSH 0x40100UL
#define FIRE_IOMMU_FLUSHINV 0x40108UL #define FIRE_IOMMU_FLUSHINV 0x40108UL
static void pci_fire_pbm_iommu_init(struct pci_pbm_info *pbm) static int pci_fire_pbm_iommu_init(struct pci_pbm_info *pbm)
{ {
struct iommu *iommu = pbm->iommu; struct iommu *iommu = pbm->iommu;
u32 vdma[2], dma_mask; u32 vdma[2], dma_mask;
u64 control; u64 control;
int tsbsize; int tsbsize, err;
/* No virtual-dma property on these guys, use largest size. */ /* No virtual-dma property on these guys, use largest size. */
vdma[0] = 0xc0000000; /* base */ vdma[0] = 0xc0000000; /* base */
...@@ -68,7 +68,9 @@ static void pci_fire_pbm_iommu_init(struct pci_pbm_info *pbm) ...@@ -68,7 +68,9 @@ static void pci_fire_pbm_iommu_init(struct pci_pbm_info *pbm)
*/ */
fire_write(iommu->iommu_flushinv, ~(u64)0); fire_write(iommu->iommu_flushinv, ~(u64)0);
pci_iommu_table_init(iommu, tsbsize * 8 * 1024, vdma[0], dma_mask); err = iommu_table_init(iommu, tsbsize * 8 * 1024, vdma[0], dma_mask);
if (err)
return err;
fire_write(iommu->iommu_tsbbase, __pa(iommu->page_table) | 0x7UL); fire_write(iommu->iommu_tsbbase, __pa(iommu->page_table) | 0x7UL);
...@@ -78,6 +80,8 @@ static void pci_fire_pbm_iommu_init(struct pci_pbm_info *pbm) ...@@ -78,6 +80,8 @@ static void pci_fire_pbm_iommu_init(struct pci_pbm_info *pbm)
0x00000002 /* Bypass enable */ | 0x00000002 /* Bypass enable */ |
0x00000001 /* Translation enable */); 0x00000001 /* Translation enable */);
fire_write(iommu->iommu_control, control); fire_write(iommu->iommu_control, control);
return 0;
} }
/* Based at pbm->controller_regs */ /* Based at pbm->controller_regs */
...@@ -167,8 +171,8 @@ static void pci_fire_hw_init(struct pci_pbm_info *pbm) ...@@ -167,8 +171,8 @@ static void pci_fire_hw_init(struct pci_pbm_info *pbm)
fire_write(pbm->pbm_regs + FIRE_PEC_IENAB, ~(u64)0); fire_write(pbm->pbm_regs + FIRE_PEC_IENAB, ~(u64)0);
} }
static void pci_fire_pbm_init(struct pci_controller_info *p, static int pci_fire_pbm_init(struct pci_controller_info *p,
struct device_node *dp, u32 portid) struct device_node *dp, u32 portid)
{ {
const struct linux_prom64_registers *regs; const struct linux_prom64_registers *regs;
struct pci_pbm_info *pbm; struct pci_pbm_info *pbm;
...@@ -203,7 +207,8 @@ static void pci_fire_pbm_init(struct pci_controller_info *p, ...@@ -203,7 +207,8 @@ static void pci_fire_pbm_init(struct pci_controller_info *p,
pci_get_pbm_props(pbm); pci_get_pbm_props(pbm);
pci_fire_hw_init(pbm); pci_fire_hw_init(pbm);
pci_fire_pbm_iommu_init(pbm);
return pci_fire_pbm_iommu_init(pbm);
} }
static inline int portid_compare(u32 x, u32 y) static inline int portid_compare(u32 x, u32 y)
...@@ -222,7 +227,8 @@ void fire_pci_init(struct device_node *dp, const char *model_name) ...@@ -222,7 +227,8 @@ void fire_pci_init(struct device_node *dp, const char *model_name)
for (pbm = pci_pbm_root; pbm; pbm = pbm->next) { for (pbm = pci_pbm_root; pbm; pbm = pbm->next) {
if (portid_compare(pbm->portid, portid)) { if (portid_compare(pbm->portid, portid)) {
pci_fire_pbm_init(pbm->parent, dp, portid); if (pci_fire_pbm_init(pbm->parent, dp, portid))
goto fatal_memory_error;
return; return;
} }
} }
...@@ -250,7 +256,9 @@ void fire_pci_init(struct device_node *dp, const char *model_name) ...@@ -250,7 +256,9 @@ void fire_pci_init(struct device_node *dp, const char *model_name)
*/ */
pci_memspace_mask = 0x7fffffffUL; pci_memspace_mask = 0x7fffffffUL;
pci_fire_pbm_init(p, dp, portid); if (pci_fire_pbm_init(p, dp, portid))
goto fatal_memory_error;
return; return;
fatal_memory_error: fatal_memory_error:
......
...@@ -813,16 +813,19 @@ static void psycho_scan_bus(struct pci_pbm_info *pbm) ...@@ -813,16 +813,19 @@ static void psycho_scan_bus(struct pci_pbm_info *pbm)
psycho_register_error_handlers(pbm); psycho_register_error_handlers(pbm);
} }
static void psycho_iommu_init(struct pci_pbm_info *pbm) static int psycho_iommu_init(struct pci_pbm_info *pbm)
{ {
struct iommu *iommu = pbm->iommu; struct iommu *iommu = pbm->iommu;
unsigned long i; unsigned long i;
u64 control; u64 control;
int err;
/* Register addresses. */ /* Register addresses. */
iommu->iommu_control = pbm->controller_regs + PSYCHO_IOMMU_CONTROL; iommu->iommu_control = pbm->controller_regs + PSYCHO_IOMMU_CONTROL;
iommu->iommu_tsbbase = pbm->controller_regs + PSYCHO_IOMMU_TSBBASE; iommu->iommu_tsbbase = pbm->controller_regs + PSYCHO_IOMMU_TSBBASE;
iommu->iommu_flush = pbm->controller_regs + PSYCHO_IOMMU_FLUSH; iommu->iommu_flush = pbm->controller_regs + PSYCHO_IOMMU_FLUSH;
iommu->iommu_tags = iommu->iommu_flush + (0xa580UL - 0x0210UL);
/* PSYCHO's IOMMU lacks ctx flushing. */ /* PSYCHO's IOMMU lacks ctx flushing. */
iommu->iommu_ctxflush = 0; iommu->iommu_ctxflush = 0;
...@@ -845,7 +848,9 @@ static void psycho_iommu_init(struct pci_pbm_info *pbm) ...@@ -845,7 +848,9 @@ static void psycho_iommu_init(struct pci_pbm_info *pbm)
/* Leave diag mode enabled for full-flushing done /* Leave diag mode enabled for full-flushing done
* in pci_iommu.c * in pci_iommu.c
*/ */
pci_iommu_table_init(iommu, IO_TSB_SIZE, 0xc0000000, 0xffffffff); err = iommu_table_init(iommu, IO_TSB_SIZE, 0xc0000000, 0xffffffff);
if (err)
return err;
psycho_write(pbm->controller_regs + PSYCHO_IOMMU_TSBBASE, psycho_write(pbm->controller_regs + PSYCHO_IOMMU_TSBBASE,
__pa(iommu->page_table)); __pa(iommu->page_table));
...@@ -858,6 +863,8 @@ static void psycho_iommu_init(struct pci_pbm_info *pbm) ...@@ -858,6 +863,8 @@ static void psycho_iommu_init(struct pci_pbm_info *pbm)
/* If necessary, hook us up for starfire IRQ translations. */ /* If necessary, hook us up for starfire IRQ translations. */
if (this_is_starfire) if (this_is_starfire)
starfire_hookup(pbm->portid); starfire_hookup(pbm->portid);
return 0;
} }
#define PSYCHO_IRQ_RETRY 0x1a00UL #define PSYCHO_IRQ_RETRY 0x1a00UL
...@@ -1031,15 +1038,12 @@ void psycho_init(struct device_node *dp, char *model_name) ...@@ -1031,15 +1038,12 @@ void psycho_init(struct device_node *dp, char *model_name)
} }
p = kzalloc(sizeof(struct pci_controller_info), GFP_ATOMIC); p = kzalloc(sizeof(struct pci_controller_info), GFP_ATOMIC);
if (!p) { if (!p)
prom_printf("PSYCHO: Fatal memory allocation error.\n"); goto fatal_memory_error;
prom_halt();
}
iommu = kzalloc(sizeof(struct iommu), GFP_ATOMIC); iommu = kzalloc(sizeof(struct iommu), GFP_ATOMIC);
if (!iommu) { if (!iommu)
prom_printf("PSYCHO: Fatal memory allocation error.\n"); goto fatal_memory_error;
prom_halt();
}
p->pbm_A.iommu = p->pbm_B.iommu = iommu; p->pbm_A.iommu = p->pbm_B.iommu = iommu;
p->pbm_A.portid = upa_portid; p->pbm_A.portid = upa_portid;
...@@ -1062,8 +1066,14 @@ void psycho_init(struct device_node *dp, char *model_name) ...@@ -1062,8 +1066,14 @@ void psycho_init(struct device_node *dp, char *model_name)
psycho_controller_hwinit(&p->pbm_A); psycho_controller_hwinit(&p->pbm_A);
psycho_iommu_init(&p->pbm_A); if (psycho_iommu_init(&p->pbm_A))
goto fatal_memory_error;
is_pbm_a = ((pr_regs[0].phys_addr & 0x6000) == 0x2000); is_pbm_a = ((pr_regs[0].phys_addr & 0x6000) == 0x2000);
psycho_pbm_init(p, dp, is_pbm_a); psycho_pbm_init(p, dp, is_pbm_a);
return;
fatal_memory_error:
prom_printf("PSYCHO: Fatal memory allocation error.\n");
prom_halt();
} }
...@@ -672,18 +672,20 @@ static void sabre_scan_bus(struct pci_pbm_info *pbm) ...@@ -672,18 +672,20 @@ static void sabre_scan_bus(struct pci_pbm_info *pbm)
sabre_register_error_handlers(pbm); sabre_register_error_handlers(pbm);
} }
static void sabre_iommu_init(struct pci_pbm_info *pbm, static int sabre_iommu_init(struct pci_pbm_info *pbm,
int tsbsize, unsigned long dvma_offset, int tsbsize, unsigned long dvma_offset,
u32 dma_mask) u32 dma_mask)
{ {
struct iommu *iommu = pbm->iommu; struct iommu *iommu = pbm->iommu;
unsigned long i; unsigned long i;
u64 control; u64 control;
int err;
/* Register addresses. */ /* Register addresses. */
iommu->iommu_control = pbm->controller_regs + SABRE_IOMMU_CONTROL; iommu->iommu_control = pbm->controller_regs + SABRE_IOMMU_CONTROL;
iommu->iommu_tsbbase = pbm->controller_regs + SABRE_IOMMU_TSBBASE; iommu->iommu_tsbbase = pbm->controller_regs + SABRE_IOMMU_TSBBASE;
iommu->iommu_flush = pbm->controller_regs + SABRE_IOMMU_FLUSH; iommu->iommu_flush = pbm->controller_regs + SABRE_IOMMU_FLUSH;
iommu->iommu_tags = iommu->iommu_flush + (0xa580UL - 0x0210UL);
iommu->write_complete_reg = pbm->controller_regs + SABRE_WRSYNC; iommu->write_complete_reg = pbm->controller_regs + SABRE_WRSYNC;
/* Sabre's IOMMU lacks ctx flushing. */ /* Sabre's IOMMU lacks ctx flushing. */
iommu->iommu_ctxflush = 0; iommu->iommu_ctxflush = 0;
...@@ -701,7 +703,10 @@ static void sabre_iommu_init(struct pci_pbm_info *pbm, ...@@ -701,7 +703,10 @@ static void sabre_iommu_init(struct pci_pbm_info *pbm,
/* Leave diag mode enabled for full-flushing done /* Leave diag mode enabled for full-flushing done
* in pci_iommu.c * in pci_iommu.c
*/ */
pci_iommu_table_init(iommu, tsbsize * 1024 * 8, dvma_offset, dma_mask); err = iommu_table_init(iommu, tsbsize * 1024 * 8,
dvma_offset, dma_mask);
if (err)
return err;
sabre_write(pbm->controller_regs + SABRE_IOMMU_TSBBASE, sabre_write(pbm->controller_regs + SABRE_IOMMU_TSBBASE,
__pa(iommu->page_table)); __pa(iommu->page_table));
...@@ -722,6 +727,8 @@ static void sabre_iommu_init(struct pci_pbm_info *pbm, ...@@ -722,6 +727,8 @@ static void sabre_iommu_init(struct pci_pbm_info *pbm,
break; break;
} }
sabre_write(pbm->controller_regs + SABRE_IOMMU_CONTROL, control); sabre_write(pbm->controller_regs + SABRE_IOMMU_CONTROL, control);
return 0;
} }
static void sabre_pbm_init(struct pci_controller_info *p, struct pci_pbm_info *pbm, struct device_node *dp) static void sabre_pbm_init(struct pci_controller_info *p, struct pci_pbm_info *pbm, struct device_node *dp)
...@@ -775,16 +782,12 @@ void sabre_init(struct device_node *dp, char *model_name) ...@@ -775,16 +782,12 @@ void sabre_init(struct device_node *dp, char *model_name)
} }
p = kzalloc(sizeof(*p), GFP_ATOMIC); p = kzalloc(sizeof(*p), GFP_ATOMIC);
if (!p) { if (!p)
prom_printf("SABRE: Error, kmalloc(pci_controller_info) failed.\n"); goto fatal_memory_error;
prom_halt();
}
iommu = kzalloc(sizeof(*iommu), GFP_ATOMIC); iommu = kzalloc(sizeof(*iommu), GFP_ATOMIC);
if (!iommu) { if (!iommu)
prom_printf("SABRE: Error, kmalloc(pci_iommu) failed.\n"); goto fatal_memory_error;
prom_halt();
}
pbm = &p->pbm_A; pbm = &p->pbm_A;
pbm->iommu = iommu; pbm->iommu = iommu;
...@@ -847,10 +850,16 @@ void sabre_init(struct device_node *dp, char *model_name) ...@@ -847,10 +850,16 @@ void sabre_init(struct device_node *dp, char *model_name)
prom_halt(); prom_halt();
} }
sabre_iommu_init(pbm, tsbsize, vdma[0], dma_mask); if (sabre_iommu_init(pbm, tsbsize, vdma[0], dma_mask))
goto fatal_memory_error;
/* /*
* Look for APB underneath. * Look for APB underneath.
*/ */
sabre_pbm_init(p, pbm, dp); sabre_pbm_init(p, pbm, dp);
return;
fatal_memory_error:
prom_printf("SABRE: Fatal memory allocation error.\n");
prom_halt();
} }
...@@ -1148,14 +1148,14 @@ static void schizo_pbm_strbuf_init(struct pci_pbm_info *pbm) ...@@ -1148,14 +1148,14 @@ static void schizo_pbm_strbuf_init(struct pci_pbm_info *pbm)
#define SCHIZO_IOMMU_FLUSH (0x00210UL) #define SCHIZO_IOMMU_FLUSH (0x00210UL)
#define SCHIZO_IOMMU_CTXFLUSH (0x00218UL) #define SCHIZO_IOMMU_CTXFLUSH (0x00218UL)
static void schizo_pbm_iommu_init(struct pci_pbm_info *pbm) static int schizo_pbm_iommu_init(struct pci_pbm_info *pbm)
{ {
struct iommu *iommu = pbm->iommu; struct iommu *iommu = pbm->iommu;
unsigned long i, tagbase, database; unsigned long i, tagbase, database;
struct property *prop; struct property *prop;
u32 vdma[2], dma_mask; u32 vdma[2], dma_mask;
int tsbsize, err;
u64 control; u64 control;
int tsbsize;
prop = of_find_property(pbm->prom_node, "virtual-dma", NULL); prop = of_find_property(pbm->prom_node, "virtual-dma", NULL);
if (prop) { if (prop) {
...@@ -1195,6 +1195,7 @@ static void schizo_pbm_iommu_init(struct pci_pbm_info *pbm) ...@@ -1195,6 +1195,7 @@ static void schizo_pbm_iommu_init(struct pci_pbm_info *pbm)
iommu->iommu_control = pbm->pbm_regs + SCHIZO_IOMMU_CONTROL; iommu->iommu_control = pbm->pbm_regs + SCHIZO_IOMMU_CONTROL;
iommu->iommu_tsbbase = pbm->pbm_regs + SCHIZO_IOMMU_TSBBASE; iommu->iommu_tsbbase = pbm->pbm_regs + SCHIZO_IOMMU_TSBBASE;
iommu->iommu_flush = pbm->pbm_regs + SCHIZO_IOMMU_FLUSH; iommu->iommu_flush = pbm->pbm_regs + SCHIZO_IOMMU_FLUSH;
iommu->iommu_tags = iommu->iommu_flush + (0xa580UL - 0x0210UL);
iommu->iommu_ctxflush = pbm->pbm_regs + SCHIZO_IOMMU_CTXFLUSH; iommu->iommu_ctxflush = pbm->pbm_regs + SCHIZO_IOMMU_CTXFLUSH;
/* We use the main control/status register of SCHIZO as the write /* We use the main control/status register of SCHIZO as the write
...@@ -1219,7 +1220,9 @@ static void schizo_pbm_iommu_init(struct pci_pbm_info *pbm) ...@@ -1219,7 +1220,9 @@ static void schizo_pbm_iommu_init(struct pci_pbm_info *pbm)
/* Leave diag mode enabled for full-flushing done /* Leave diag mode enabled for full-flushing done
* in pci_iommu.c * in pci_iommu.c
*/ */
pci_iommu_table_init(iommu, tsbsize * 8 * 1024, vdma[0], dma_mask); err = iommu_table_init(iommu, tsbsize * 8 * 1024, vdma[0], dma_mask);
if (err)
return err;
schizo_write(iommu->iommu_tsbbase, __pa(iommu->page_table)); schizo_write(iommu->iommu_tsbbase, __pa(iommu->page_table));
...@@ -1236,6 +1239,8 @@ static void schizo_pbm_iommu_init(struct pci_pbm_info *pbm) ...@@ -1236,6 +1239,8 @@ static void schizo_pbm_iommu_init(struct pci_pbm_info *pbm)
control |= SCHIZO_IOMMU_CTRL_ENAB; control |= SCHIZO_IOMMU_CTRL_ENAB;
schizo_write(iommu->iommu_control, control); schizo_write(iommu->iommu_control, control);
return 0;
} }
#define SCHIZO_PCI_IRQ_RETRY (0x1a00UL) #define SCHIZO_PCI_IRQ_RETRY (0x1a00UL)
...@@ -1328,14 +1333,14 @@ static void schizo_pbm_hw_init(struct pci_pbm_info *pbm) ...@@ -1328,14 +1333,14 @@ static void schizo_pbm_hw_init(struct pci_pbm_info *pbm)
} }
} }
static void schizo_pbm_init(struct pci_controller_info *p, static int schizo_pbm_init(struct pci_controller_info *p,
struct device_node *dp, u32 portid, struct device_node *dp, u32 portid,
int chip_type) int chip_type)
{ {
const struct linux_prom64_registers *regs; const struct linux_prom64_registers *regs;
struct pci_pbm_info *pbm; struct pci_pbm_info *pbm;
const char *chipset_name; const char *chipset_name;
int is_pbm_a; int is_pbm_a, err;
switch (chip_type) { switch (chip_type) {
case PBM_CHIP_TYPE_TOMATILLO: case PBM_CHIP_TYPE_TOMATILLO:
...@@ -1406,8 +1411,13 @@ static void schizo_pbm_init(struct pci_controller_info *p, ...@@ -1406,8 +1411,13 @@ static void schizo_pbm_init(struct pci_controller_info *p,
pci_get_pbm_props(pbm); pci_get_pbm_props(pbm);
schizo_pbm_iommu_init(pbm); err = schizo_pbm_iommu_init(pbm);
if (err)
return err;
schizo_pbm_strbuf_init(pbm); schizo_pbm_strbuf_init(pbm);
return 0;
} }
static inline int portid_compare(u32 x, u32 y, int chip_type) static inline int portid_compare(u32 x, u32 y, int chip_type)
...@@ -1431,34 +1441,38 @@ static void __schizo_init(struct device_node *dp, char *model_name, int chip_typ ...@@ -1431,34 +1441,38 @@ static void __schizo_init(struct device_node *dp, char *model_name, int chip_typ
for (pbm = pci_pbm_root; pbm; pbm = pbm->next) { for (pbm = pci_pbm_root; pbm; pbm = pbm->next) {
if (portid_compare(pbm->portid, portid, chip_type)) { if (portid_compare(pbm->portid, portid, chip_type)) {
schizo_pbm_init(pbm->parent, dp, portid, chip_type); if (schizo_pbm_init(pbm->parent, dp,
portid, chip_type))
goto fatal_memory_error;
return; return;
} }
} }
p = kzalloc(sizeof(struct pci_controller_info), GFP_ATOMIC); p = kzalloc(sizeof(struct pci_controller_info), GFP_ATOMIC);
if (!p) if (!p)
goto memfail; goto fatal_memory_error;
iommu = kzalloc(sizeof(struct iommu), GFP_ATOMIC); iommu = kzalloc(sizeof(struct iommu), GFP_ATOMIC);
if (!iommu) if (!iommu)
goto memfail; goto fatal_memory_error;
p->pbm_A.iommu = iommu; p->pbm_A.iommu = iommu;
iommu = kzalloc(sizeof(struct iommu), GFP_ATOMIC); iommu = kzalloc(sizeof(struct iommu), GFP_ATOMIC);
if (!iommu) if (!iommu)
goto memfail; goto fatal_memory_error;
p->pbm_B.iommu = iommu; p->pbm_B.iommu = iommu;
/* Like PSYCHO we have a 2GB aligned area for memory space. */ /* Like PSYCHO we have a 2GB aligned area for memory space. */
pci_memspace_mask = 0x7fffffffUL; pci_memspace_mask = 0x7fffffffUL;
schizo_pbm_init(p, dp, portid, chip_type); if (schizo_pbm_init(p, dp, portid, chip_type))
goto fatal_memory_error;
return; return;
memfail: fatal_memory_error:
prom_printf("SCHIZO: Fatal memory allocation error.\n"); prom_printf("SCHIZO: Fatal memory allocation error.\n");
prom_halt(); prom_halt();
} }
......
This diff is collapsed.
This diff is collapsed.
...@@ -1460,6 +1460,74 @@ static int cmos_set_rtc_time(struct rtc_time *rtc_tm) ...@@ -1460,6 +1460,74 @@ static int cmos_set_rtc_time(struct rtc_time *rtc_tm)
} }
#endif /* CONFIG_PCI */ #endif /* CONFIG_PCI */
static void mostek_get_rtc_time(struct rtc_time *rtc_tm)
{
void __iomem *regs = mstk48t02_regs;
u8 tmp;
spin_lock_irq(&mostek_lock);
tmp = mostek_read(regs + MOSTEK_CREG);
tmp |= MSTK_CREG_READ;
mostek_write(regs + MOSTEK_CREG, tmp);
rtc_tm->tm_sec = MSTK_REG_SEC(regs);
rtc_tm->tm_min = MSTK_REG_MIN(regs);
rtc_tm->tm_hour = MSTK_REG_HOUR(regs);
rtc_tm->tm_mday = MSTK_REG_DOM(regs);
rtc_tm->tm_mon = MSTK_REG_MONTH(regs);
rtc_tm->tm_year = MSTK_CVT_YEAR( MSTK_REG_YEAR(regs) );
rtc_tm->tm_wday = MSTK_REG_DOW(regs);
tmp = mostek_read(regs + MOSTEK_CREG);
tmp &= ~MSTK_CREG_READ;
mostek_write(regs + MOSTEK_CREG, tmp);
spin_unlock_irq(&mostek_lock);
rtc_tm->tm_mon--;
rtc_tm->tm_wday--;
rtc_tm->tm_year -= 1900;
}
static int mostek_set_rtc_time(struct rtc_time *rtc_tm)
{
unsigned char mon, day, hrs, min, sec, wday;
void __iomem *regs = mstk48t02_regs;
unsigned int yrs;
u8 tmp;
yrs = rtc_tm->tm_year + 1900;
mon = rtc_tm->tm_mon + 1;
day = rtc_tm->tm_mday;
wday = rtc_tm->tm_wday + 1;
hrs = rtc_tm->tm_hour;
min = rtc_tm->tm_min;
sec = rtc_tm->tm_sec;
spin_lock_irq(&mostek_lock);
tmp = mostek_read(regs + MOSTEK_CREG);
tmp |= MSTK_CREG_WRITE;
mostek_write(regs + MOSTEK_CREG, tmp);
MSTK_SET_REG_SEC(regs, sec);
MSTK_SET_REG_MIN(regs, min);
MSTK_SET_REG_HOUR(regs, hrs);
MSTK_SET_REG_DOW(regs, wday);
MSTK_SET_REG_DOM(regs, day);
MSTK_SET_REG_MONTH(regs, mon);
MSTK_SET_REG_YEAR(regs, yrs - MSTK_YEAR_ZERO);
tmp = mostek_read(regs + MOSTEK_CREG);
tmp &= ~MSTK_CREG_WRITE;
mostek_write(regs + MOSTEK_CREG, tmp);
spin_unlock_irq(&mostek_lock);
return 0;
}
struct mini_rtc_ops { struct mini_rtc_ops {
void (*get_rtc_time)(struct rtc_time *); void (*get_rtc_time)(struct rtc_time *);
int (*set_rtc_time)(struct rtc_time *); int (*set_rtc_time)(struct rtc_time *);
...@@ -1487,6 +1555,11 @@ static struct mini_rtc_ops cmos_rtc_ops = { ...@@ -1487,6 +1555,11 @@ static struct mini_rtc_ops cmos_rtc_ops = {
}; };
#endif /* CONFIG_PCI */ #endif /* CONFIG_PCI */
static struct mini_rtc_ops mostek_rtc_ops = {
.get_rtc_time = mostek_get_rtc_time,
.set_rtc_time = mostek_set_rtc_time,
};
static struct mini_rtc_ops *mini_rtc_ops; static struct mini_rtc_ops *mini_rtc_ops;
static inline void mini_get_rtc_time(struct rtc_time *time) static inline void mini_get_rtc_time(struct rtc_time *time)
...@@ -1615,6 +1688,8 @@ static int __init rtc_mini_init(void) ...@@ -1615,6 +1688,8 @@ static int __init rtc_mini_init(void)
else if (ds1287_regs) else if (ds1287_regs)
mini_rtc_ops = &cmos_rtc_ops; mini_rtc_ops = &cmos_rtc_ops;
#endif /* CONFIG_PCI */ #endif /* CONFIG_PCI */
else if (mstk48t02_regs)
mini_rtc_ops = &mostek_rtc_ops;
else else
return -ENODEV; return -ENODEV;
......
...@@ -2134,12 +2134,20 @@ static void user_instruction_dump (unsigned int __user *pc) ...@@ -2134,12 +2134,20 @@ static void user_instruction_dump (unsigned int __user *pc)
void show_stack(struct task_struct *tsk, unsigned long *_ksp) void show_stack(struct task_struct *tsk, unsigned long *_ksp)
{ {
unsigned long pc, fp, thread_base, ksp; unsigned long pc, fp, thread_base, ksp;
void *tp = task_stack_page(tsk); struct thread_info *tp;
struct reg_window *rw; struct reg_window *rw;
int count = 0; int count = 0;
ksp = (unsigned long) _ksp; ksp = (unsigned long) _ksp;
if (!tsk)
tsk = current;
tp = task_thread_info(tsk);
if (ksp == 0UL) {
if (tsk == current)
asm("mov %%fp, %0" : "=r" (ksp));
else
ksp = tp->ksp;
}
if (tp == current_thread_info()) if (tp == current_thread_info())
flushw_all(); flushw_all();
...@@ -2168,11 +2176,7 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp) ...@@ -2168,11 +2176,7 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp)
void dump_stack(void) void dump_stack(void)
{ {
unsigned long *ksp; show_stack(current, NULL);
__asm__ __volatile__("mov %%fp, %0"
: "=r" (ksp));
show_stack(current, ksp);
} }
EXPORT_SYMBOL(dump_stack); EXPORT_SYMBOL(dump_stack);
......
...@@ -112,15 +112,12 @@ static void __kprobes unhandled_fault(unsigned long address, ...@@ -112,15 +112,12 @@ static void __kprobes unhandled_fault(unsigned long address,
static void bad_kernel_pc(struct pt_regs *regs, unsigned long vaddr) static void bad_kernel_pc(struct pt_regs *regs, unsigned long vaddr)
{ {
unsigned long *ksp;
printk(KERN_CRIT "OOPS: Bogus kernel PC [%016lx] in fault handler\n", printk(KERN_CRIT "OOPS: Bogus kernel PC [%016lx] in fault handler\n",
regs->tpc); regs->tpc);
printk(KERN_CRIT "OOPS: RPC [%016lx]\n", regs->u_regs[15]); printk(KERN_CRIT "OOPS: RPC [%016lx]\n", regs->u_regs[15]);
print_symbol("RPC: <%s>\n", regs->u_regs[15]); print_symbol("RPC: <%s>\n", regs->u_regs[15]);
printk(KERN_CRIT "OOPS: Fault was to vaddr[%lx]\n", vaddr); printk(KERN_CRIT "OOPS: Fault was to vaddr[%lx]\n", vaddr);
__asm__("mov %%sp, %0" : "=r" (ksp)); dump_stack();
show_stack(current, ksp);
unhandled_fault(regs->tpc, current, regs); unhandled_fault(regs->tpc, current, regs);
} }
......
...@@ -210,6 +210,10 @@ static void __init walk_children(struct device_node *dp, struct sbus_dev *parent ...@@ -210,6 +210,10 @@ static void __init walk_children(struct device_node *dp, struct sbus_dev *parent
sdev->bus = sbus; sdev->bus = sbus;
sdev->parent = parent; sdev->parent = parent;
sdev->ofdev.dev.archdata.iommu =
sbus->ofdev.dev.archdata.iommu;
sdev->ofdev.dev.archdata.stc =
sbus->ofdev.dev.archdata.stc;
fill_sbus_device(dp, sdev); fill_sbus_device(dp, sdev);
...@@ -269,6 +273,11 @@ static void __init build_one_sbus(struct device_node *dp, int num_sbus) ...@@ -269,6 +273,11 @@ static void __init build_one_sbus(struct device_node *dp, int num_sbus)
sdev->bus = sbus; sdev->bus = sbus;
sdev->parent = NULL; sdev->parent = NULL;
sdev->ofdev.dev.archdata.iommu =
sbus->ofdev.dev.archdata.iommu;
sdev->ofdev.dev.archdata.stc =
sbus->ofdev.dev.archdata.stc;
fill_sbus_device(dev_dp, sdev); fill_sbus_device(dev_dp, sdev);
walk_children(dev_dp, sdev, sbus); walk_children(dev_dp, sdev, sbus);
......
...@@ -279,90 +279,91 @@ static void __devinit bw2_do_default_mode(struct bw2_par *par, ...@@ -279,90 +279,91 @@ static void __devinit bw2_do_default_mode(struct bw2_par *par,
} }
} }
struct all_info { static int __devinit bw2_probe(struct of_device *op, const struct of_device_id *match)
struct fb_info info;
struct bw2_par par;
};
static int __devinit bw2_init_one(struct of_device *op)
{ {
struct device_node *dp = op->node; struct device_node *dp = op->node;
struct all_info *all; struct fb_info *info;
struct bw2_par *par;
int linebytes, err; int linebytes, err;
all = kzalloc(sizeof(*all), GFP_KERNEL); info = framebuffer_alloc(sizeof(struct bw2_par), &op->dev);
if (!all)
return -ENOMEM;
spin_lock_init(&all->par.lock); err = -ENOMEM;
if (!info)
goto out_err;
par = info->par;
all->par.physbase = op->resource[0].start; spin_lock_init(&par->lock);
all->par.which_io = op->resource[0].flags & IORESOURCE_BITS;
sbusfb_fill_var(&all->info.var, dp->node, 1); par->physbase = op->resource[0].start;
par->which_io = op->resource[0].flags & IORESOURCE_BITS;
sbusfb_fill_var(&info->var, dp->node, 1);
linebytes = of_getintprop_default(dp, "linebytes", linebytes = of_getintprop_default(dp, "linebytes",
all->info.var.xres); info->var.xres);
all->info.var.red.length = all->info.var.green.length = info->var.red.length = info->var.green.length =
all->info.var.blue.length = all->info.var.bits_per_pixel; info->var.blue.length = info->var.bits_per_pixel;
all->info.var.red.offset = all->info.var.green.offset = info->var.red.offset = info->var.green.offset =
all->info.var.blue.offset = 0; info->var.blue.offset = 0;
all->par.regs = of_ioremap(&op->resource[0], BWTWO_REGISTER_OFFSET, par->regs = of_ioremap(&op->resource[0], BWTWO_REGISTER_OFFSET,
sizeof(struct bw2_regs), "bw2 regs"); sizeof(struct bw2_regs), "bw2 regs");
if (!par->regs)
goto out_release_fb;
if (!of_find_property(dp, "width", NULL)) if (!of_find_property(dp, "width", NULL))
bw2_do_default_mode(&all->par, &all->info, &linebytes); bw2_do_default_mode(par, info, &linebytes);
all->par.fbsize = PAGE_ALIGN(linebytes * all->info.var.yres); par->fbsize = PAGE_ALIGN(linebytes * info->var.yres);
all->info.flags = FBINFO_DEFAULT; info->flags = FBINFO_DEFAULT;
all->info.fbops = &bw2_ops; info->fbops = &bw2_ops;
all->info.screen_base = info->screen_base = of_ioremap(&op->resource[0], 0,
of_ioremap(&op->resource[0], 0, all->par.fbsize, "bw2 ram"); par->fbsize, "bw2 ram");
all->info.par = &all->par; if (!info->screen_base)
goto out_unmap_regs;
bw2_blank(0, &all->info); bw2_blank(0, info);
bw2_init_fix(&all->info, linebytes); bw2_init_fix(info, linebytes);
err= register_framebuffer(&all->info); err = register_framebuffer(info);
if (err < 0) { if (err < 0)
of_iounmap(&op->resource[0], goto out_unmap_screen;
all->par.regs, sizeof(struct bw2_regs));
of_iounmap(&op->resource[0],
all->info.screen_base, all->par.fbsize);
kfree(all);
return err;
}
dev_set_drvdata(&op->dev, all); dev_set_drvdata(&op->dev, info);
printk("%s: bwtwo at %lx:%lx\n", printk("%s: bwtwo at %lx:%lx\n",
dp->full_name, dp->full_name, par->which_io, par->physbase);
all->par.which_io, all->par.physbase);
return 0; return 0;
}
static int __devinit bw2_probe(struct of_device *dev, const struct of_device_id *match) out_unmap_screen:
{ of_iounmap(&op->resource[0], info->screen_base, par->fbsize);
struct of_device *op = to_of_device(&dev->dev);
out_unmap_regs:
of_iounmap(&op->resource[0], par->regs, sizeof(struct bw2_regs));
out_release_fb:
framebuffer_release(info);
return bw2_init_one(op); out_err:
return err;
} }
static int __devexit bw2_remove(struct of_device *op) static int __devexit bw2_remove(struct of_device *op)
{ {
struct all_info *all = dev_get_drvdata(&op->dev); struct fb_info *info = dev_get_drvdata(&op->dev);
struct bw2_par *par = info->par;
unregister_framebuffer(&all->info); unregister_framebuffer(info);
of_iounmap(&op->resource[0], all->par.regs, sizeof(struct bw2_regs)); of_iounmap(&op->resource[0], par->regs, sizeof(struct bw2_regs));
of_iounmap(&op->resource[0], all->info.screen_base, all->par.fbsize); of_iounmap(&op->resource[0], info->screen_base, par->fbsize);
kfree(all); framebuffer_release(info);
dev_set_drvdata(&op->dev, NULL); dev_set_drvdata(&op->dev, NULL);
......
...@@ -448,81 +448,79 @@ static struct sbus_mmap_map __cg14_mmap_map[CG14_MMAP_ENTRIES] __devinitdata = { ...@@ -448,81 +448,79 @@ static struct sbus_mmap_map __cg14_mmap_map[CG14_MMAP_ENTRIES] __devinitdata = {
{ .size = 0 } { .size = 0 }
}; };
struct all_info { static void cg14_unmap_regs(struct of_device *op, struct fb_info *info,
struct fb_info info; struct cg14_par *par)
struct cg14_par par;
};
static void cg14_unmap_regs(struct of_device *op, struct all_info *all)
{ {
if (all->par.regs) if (par->regs)
of_iounmap(&op->resource[0], of_iounmap(&op->resource[0],
all->par.regs, sizeof(struct cg14_regs)); par->regs, sizeof(struct cg14_regs));
if (all->par.clut) if (par->clut)
of_iounmap(&op->resource[0], of_iounmap(&op->resource[0],
all->par.clut, sizeof(struct cg14_clut)); par->clut, sizeof(struct cg14_clut));
if (all->par.cursor) if (par->cursor)
of_iounmap(&op->resource[0], of_iounmap(&op->resource[0],
all->par.cursor, sizeof(struct cg14_cursor)); par->cursor, sizeof(struct cg14_cursor));
if (all->info.screen_base) if (info->screen_base)
of_iounmap(&op->resource[1], of_iounmap(&op->resource[1],
all->info.screen_base, all->par.fbsize); info->screen_base, par->fbsize);
} }
static int __devinit cg14_init_one(struct of_device *op) static int __devinit cg14_probe(struct of_device *op, const struct of_device_id *match)
{ {
struct device_node *dp = op->node; struct device_node *dp = op->node;
struct all_info *all; struct fb_info *info;
struct cg14_par *par;
int is_8mb, linebytes, i, err; int is_8mb, linebytes, i, err;
all = kzalloc(sizeof(*all), GFP_KERNEL); info = framebuffer_alloc(sizeof(struct cg14_par), &op->dev);
if (!all)
return -ENOMEM; err = -ENOMEM;
if (!info)
goto out_err;
par = info->par;
spin_lock_init(&all->par.lock); spin_lock_init(&par->lock);
sbusfb_fill_var(&all->info.var, dp->node, 8); sbusfb_fill_var(&info->var, dp->node, 8);
all->info.var.red.length = 8; info->var.red.length = 8;
all->info.var.green.length = 8; info->var.green.length = 8;
all->info.var.blue.length = 8; info->var.blue.length = 8;
linebytes = of_getintprop_default(dp, "linebytes", linebytes = of_getintprop_default(dp, "linebytes",
all->info.var.xres); info->var.xres);
all->par.fbsize = PAGE_ALIGN(linebytes * all->info.var.yres); par->fbsize = PAGE_ALIGN(linebytes * info->var.yres);
if (!strcmp(dp->parent->name, "sbus") || if (!strcmp(dp->parent->name, "sbus") ||
!strcmp(dp->parent->name, "sbi")) { !strcmp(dp->parent->name, "sbi")) {
all->par.physbase = op->resource[0].start; par->physbase = op->resource[0].start;
all->par.iospace = op->resource[0].flags & IORESOURCE_BITS; par->iospace = op->resource[0].flags & IORESOURCE_BITS;
} else { } else {
all->par.physbase = op->resource[1].start; par->physbase = op->resource[1].start;
all->par.iospace = op->resource[0].flags & IORESOURCE_BITS; par->iospace = op->resource[0].flags & IORESOURCE_BITS;
} }
all->par.regs = of_ioremap(&op->resource[0], 0, par->regs = of_ioremap(&op->resource[0], 0,
sizeof(struct cg14_regs), "cg14 regs"); sizeof(struct cg14_regs), "cg14 regs");
all->par.clut = of_ioremap(&op->resource[0], CG14_CLUT1, par->clut = of_ioremap(&op->resource[0], CG14_CLUT1,
sizeof(struct cg14_clut), "cg14 clut"); sizeof(struct cg14_clut), "cg14 clut");
all->par.cursor = of_ioremap(&op->resource[0], CG14_CURSORREGS, par->cursor = of_ioremap(&op->resource[0], CG14_CURSORREGS,
sizeof(struct cg14_cursor), "cg14 cursor"); sizeof(struct cg14_cursor), "cg14 cursor");
all->info.screen_base = of_ioremap(&op->resource[1], 0, info->screen_base = of_ioremap(&op->resource[1], 0,
all->par.fbsize, "cg14 ram"); par->fbsize, "cg14 ram");
if (!all->par.regs || !all->par.clut || !all->par.cursor || if (!par->regs || !par->clut || !par->cursor || !info->screen_base)
!all->info.screen_base) goto out_unmap_regs;
cg14_unmap_regs(op, all);
is_8mb = (((op->resource[1].end - op->resource[1].start) + 1) == is_8mb = (((op->resource[1].end - op->resource[1].start) + 1) ==
(8 * 1024 * 1024)); (8 * 1024 * 1024));
BUILD_BUG_ON(sizeof(all->par.mmap_map) != sizeof(__cg14_mmap_map)); BUILD_BUG_ON(sizeof(par->mmap_map) != sizeof(__cg14_mmap_map));
memcpy(&all->par.mmap_map, &__cg14_mmap_map, memcpy(&par->mmap_map, &__cg14_mmap_map, sizeof(par->mmap_map));
sizeof(all->par.mmap_map));
for (i = 0; i < CG14_MMAP_ENTRIES; i++) { for (i = 0; i < CG14_MMAP_ENTRIES; i++) {
struct sbus_mmap_map *map = &all->par.mmap_map[i]; struct sbus_mmap_map *map = &par->mmap_map[i];
if (!map->size) if (!map->size)
break; break;
...@@ -536,59 +534,55 @@ static int __devinit cg14_init_one(struct of_device *op) ...@@ -536,59 +534,55 @@ static int __devinit cg14_init_one(struct of_device *op)
map->size *= 2; map->size *= 2;
} }
all->par.mode = MDI_8_PIX; par->mode = MDI_8_PIX;
all->par.ramsize = (is_8mb ? 0x800000 : 0x400000); par->ramsize = (is_8mb ? 0x800000 : 0x400000);
all->info.flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN; info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN;
all->info.fbops = &cg14_ops; info->fbops = &cg14_ops;
all->info.par = &all->par;
__cg14_reset(&all->par); __cg14_reset(par);
if (fb_alloc_cmap(&all->info.cmap, 256, 0)) { if (fb_alloc_cmap(&info->cmap, 256, 0))
cg14_unmap_regs(op, all); goto out_unmap_regs;
kfree(all);
return -ENOMEM;
}
fb_set_cmap(&all->info.cmap, &all->info);
cg14_init_fix(&all->info, linebytes, dp); fb_set_cmap(&info->cmap, info);
err = register_framebuffer(&all->info); cg14_init_fix(info, linebytes, dp);
if (err < 0) {
fb_dealloc_cmap(&all->info.cmap); err = register_framebuffer(info);
cg14_unmap_regs(op, all); if (err < 0)
kfree(all); goto out_dealloc_cmap;
return err;
}
dev_set_drvdata(&op->dev, all); dev_set_drvdata(&op->dev, info);
printk("%s: cgfourteen at %lx:%lx, %dMB\n", printk("%s: cgfourteen at %lx:%lx, %dMB\n",
dp->full_name, dp->full_name,
all->par.iospace, all->par.physbase, par->iospace, par->physbase,
all->par.ramsize >> 20); par->ramsize >> 20);
return 0; return 0;
}
static int __devinit cg14_probe(struct of_device *dev, const struct of_device_id *match) out_dealloc_cmap:
{ fb_dealloc_cmap(&info->cmap);
struct of_device *op = to_of_device(&dev->dev);
out_unmap_regs:
cg14_unmap_regs(op, info, par);
return cg14_init_one(op); out_err:
return err;
} }
static int __devexit cg14_remove(struct of_device *op) static int __devexit cg14_remove(struct of_device *op)
{ {
struct all_info *all = dev_get_drvdata(&op->dev); struct fb_info *info = dev_get_drvdata(&op->dev);
struct cg14_par *par = info->par;
unregister_framebuffer(&all->info); unregister_framebuffer(info);
fb_dealloc_cmap(&all->info.cmap); fb_dealloc_cmap(&info->cmap);
cg14_unmap_regs(op, all); cg14_unmap_regs(op, info, par);
kfree(all); framebuffer_release(info);
dev_set_drvdata(&op->dev, NULL); dev_set_drvdata(&op->dev, NULL);
......
...@@ -353,104 +353,102 @@ static void __devinit cg3_do_default_mode(struct cg3_par *par) ...@@ -353,104 +353,102 @@ static void __devinit cg3_do_default_mode(struct cg3_par *par)
} }
} }
struct all_info { static int __devinit cg3_probe(struct of_device *op,
struct fb_info info; const struct of_device_id *match)
struct cg3_par par;
};
static int __devinit cg3_init_one(struct of_device *op)
{ {
struct device_node *dp = op->node; struct device_node *dp = op->node;
struct all_info *all; struct fb_info *info;
struct cg3_par *par;
int linebytes, err; int linebytes, err;
all = kzalloc(sizeof(*all), GFP_KERNEL); info = framebuffer_alloc(sizeof(struct cg3_par), &op->dev);
if (!all)
return -ENOMEM;
spin_lock_init(&all->par.lock); err = -ENOMEM;
if (!info)
goto out_err;
par = info->par;
all->par.physbase = op->resource[0].start; spin_lock_init(&par->lock);
all->par.which_io = op->resource[0].flags & IORESOURCE_BITS;
sbusfb_fill_var(&all->info.var, dp->node, 8); par->physbase = op->resource[0].start;
all->info.var.red.length = 8; par->which_io = op->resource[0].flags & IORESOURCE_BITS;
all->info.var.green.length = 8;
all->info.var.blue.length = 8; sbusfb_fill_var(&info->var, dp->node, 8);
info->var.red.length = 8;
info->var.green.length = 8;
info->var.blue.length = 8;
if (!strcmp(dp->name, "cgRDI")) if (!strcmp(dp->name, "cgRDI"))
all->par.flags |= CG3_FLAG_RDI; par->flags |= CG3_FLAG_RDI;
if (all->par.flags & CG3_FLAG_RDI) if (par->flags & CG3_FLAG_RDI)
cg3_rdi_maybe_fixup_var(&all->info.var, dp); cg3_rdi_maybe_fixup_var(&info->var, dp);
linebytes = of_getintprop_default(dp, "linebytes", linebytes = of_getintprop_default(dp, "linebytes",
all->info.var.xres); info->var.xres);
all->par.fbsize = PAGE_ALIGN(linebytes * all->info.var.yres); par->fbsize = PAGE_ALIGN(linebytes * info->var.yres);
all->par.regs = of_ioremap(&op->resource[0], CG3_REGS_OFFSET, par->regs = of_ioremap(&op->resource[0], CG3_REGS_OFFSET,
sizeof(struct cg3_regs), "cg3 regs"); sizeof(struct cg3_regs), "cg3 regs");
if (!par->regs)
goto out_release_fb;
all->info.flags = FBINFO_DEFAULT; info->flags = FBINFO_DEFAULT;
all->info.fbops = &cg3_ops; info->fbops = &cg3_ops;
all->info.screen_base = info->screen_base = of_ioremap(&op->resource[0], CG3_RAM_OFFSET,
of_ioremap(&op->resource[0], CG3_RAM_OFFSET, par->fbsize, "cg3 ram");
all->par.fbsize, "cg3 ram"); if (!info->screen_base)
all->info.par = &all->par; goto out_unmap_regs;
cg3_blank(0, &all->info); cg3_blank(0, info);
if (!of_find_property(dp, "width", NULL)) if (!of_find_property(dp, "width", NULL))
cg3_do_default_mode(&all->par); cg3_do_default_mode(par);
if (fb_alloc_cmap(&all->info.cmap, 256, 0)) { if (fb_alloc_cmap(&info->cmap, 256, 0))
of_iounmap(&op->resource[0], goto out_unmap_screen;
all->par.regs, sizeof(struct cg3_regs));
of_iounmap(&op->resource[0], fb_set_cmap(&info->cmap, info);
all->info.screen_base, all->par.fbsize);
kfree(all);
return -ENOMEM;
}
fb_set_cmap(&all->info.cmap, &all->info);
cg3_init_fix(&all->info, linebytes, dp);
err = register_framebuffer(&all->info);
if (err < 0) {
fb_dealloc_cmap(&all->info.cmap);
of_iounmap(&op->resource[0],
all->par.regs, sizeof(struct cg3_regs));
of_iounmap(&op->resource[0],
all->info.screen_base, all->par.fbsize);
kfree(all);
return err;
}
dev_set_drvdata(&op->dev, all); cg3_init_fix(info, linebytes, dp);
err = register_framebuffer(info);
if (err < 0)
goto out_dealloc_cmap;
dev_set_drvdata(&op->dev, info);
printk("%s: cg3 at %lx:%lx\n", printk("%s: cg3 at %lx:%lx\n",
dp->full_name, all->par.which_io, all->par.physbase); dp->full_name, par->which_io, par->physbase);
return 0; return 0;
}
static int __devinit cg3_probe(struct of_device *dev, out_dealloc_cmap:
const struct of_device_id *match) fb_dealloc_cmap(&info->cmap);
{
struct of_device *op = to_of_device(&dev->dev); out_unmap_screen:
of_iounmap(&op->resource[0], info->screen_base, par->fbsize);
out_unmap_regs:
of_iounmap(&op->resource[0], par->regs, sizeof(struct cg3_regs));
out_release_fb:
framebuffer_release(info);
return cg3_init_one(op); out_err:
return err;
} }
static int __devexit cg3_remove(struct of_device *op) static int __devexit cg3_remove(struct of_device *op)
{ {
struct all_info *all = dev_get_drvdata(&op->dev); struct fb_info *info = dev_get_drvdata(&op->dev);
struct cg3_par *par = info->par;
unregister_framebuffer(&all->info); unregister_framebuffer(info);
fb_dealloc_cmap(&all->info.cmap); fb_dealloc_cmap(&info->cmap);
of_iounmap(&op->resource[0], all->par.regs, sizeof(struct cg3_regs)); of_iounmap(&op->resource[0], par->regs, sizeof(struct cg3_regs));
of_iounmap(&op->resource[0], all->info.screen_base, all->par.fbsize); of_iounmap(&op->resource[0], info->screen_base, par->fbsize);
kfree(all); framebuffer_release(info);
dev_set_drvdata(&op->dev, NULL); dev_set_drvdata(&op->dev, NULL);
......
...@@ -653,135 +653,120 @@ static void cg6_chip_init(struct fb_info *info) ...@@ -653,135 +653,120 @@ static void cg6_chip_init(struct fb_info *info)
sbus_writel(info->var.yres - 1, &fbc->clipmaxy); sbus_writel(info->var.yres - 1, &fbc->clipmaxy);
} }
struct all_info { static void cg6_unmap_regs(struct of_device *op, struct fb_info *info,
struct fb_info info; struct cg6_par *par)
struct cg6_par par;
};
static void cg6_unmap_regs(struct of_device *op, struct all_info *all)
{ {
if (all->par.fbc) if (par->fbc)
of_iounmap(&op->resource[0], all->par.fbc, 4096); of_iounmap(&op->resource[0], par->fbc, 4096);
if (all->par.tec) if (par->tec)
of_iounmap(&op->resource[0], of_iounmap(&op->resource[0], par->tec, sizeof(struct cg6_tec));
all->par.tec, sizeof(struct cg6_tec)); if (par->thc)
if (all->par.thc) of_iounmap(&op->resource[0], par->thc, sizeof(struct cg6_thc));
of_iounmap(&op->resource[0], if (par->bt)
all->par.thc, sizeof(struct cg6_thc)); of_iounmap(&op->resource[0], par->bt, sizeof(struct bt_regs));
if (all->par.bt) if (par->fhc)
of_iounmap(&op->resource[0], of_iounmap(&op->resource[0], par->fhc, sizeof(u32));
all->par.bt, sizeof(struct bt_regs));
if (all->par.fhc) if (info->screen_base)
of_iounmap(&op->resource[0], of_iounmap(&op->resource[0], info->screen_base, par->fbsize);
all->par.fhc, sizeof(u32));
if (all->info.screen_base)
of_iounmap(&op->resource[0],
all->info.screen_base, all->par.fbsize);
} }
static int __devinit cg6_init_one(struct of_device *op) static int __devinit cg6_probe(struct of_device *op, const struct of_device_id *match)
{ {
struct device_node *dp = op->node; struct device_node *dp = op->node;
struct all_info *all; struct fb_info *info;
struct cg6_par *par;
int linebytes, err; int linebytes, err;
all = kzalloc(sizeof(*all), GFP_KERNEL); info = framebuffer_alloc(sizeof(struct cg6_par), &op->dev);
if (!all)
return -ENOMEM; err = -ENOMEM;
if (!info)
goto out_err;
par = info->par;
spin_lock_init(&all->par.lock); spin_lock_init(&par->lock);
all->par.physbase = op->resource[0].start; par->physbase = op->resource[0].start;
all->par.which_io = op->resource[0].flags & IORESOURCE_BITS; par->which_io = op->resource[0].flags & IORESOURCE_BITS;
sbusfb_fill_var(&all->info.var, dp->node, 8); sbusfb_fill_var(&info->var, dp->node, 8);
all->info.var.red.length = 8; info->var.red.length = 8;
all->info.var.green.length = 8; info->var.green.length = 8;
all->info.var.blue.length = 8; info->var.blue.length = 8;
linebytes = of_getintprop_default(dp, "linebytes", linebytes = of_getintprop_default(dp, "linebytes",
all->info.var.xres); info->var.xres);
all->par.fbsize = PAGE_ALIGN(linebytes * all->info.var.yres); par->fbsize = PAGE_ALIGN(linebytes * info->var.yres);
if (of_find_property(dp, "dblbuf", NULL)) if (of_find_property(dp, "dblbuf", NULL))
all->par.fbsize *= 4; par->fbsize *= 4;
all->par.fbc = of_ioremap(&op->resource[0], CG6_FBC_OFFSET, par->fbc = of_ioremap(&op->resource[0], CG6_FBC_OFFSET,
4096, "cgsix fbc"); 4096, "cgsix fbc");
all->par.tec = of_ioremap(&op->resource[0], CG6_TEC_OFFSET, par->tec = of_ioremap(&op->resource[0], CG6_TEC_OFFSET,
sizeof(struct cg6_tec), "cgsix tec"); sizeof(struct cg6_tec), "cgsix tec");
all->par.thc = of_ioremap(&op->resource[0], CG6_THC_OFFSET, par->thc = of_ioremap(&op->resource[0], CG6_THC_OFFSET,
sizeof(struct cg6_thc), "cgsix thc"); sizeof(struct cg6_thc), "cgsix thc");
all->par.bt = of_ioremap(&op->resource[0], CG6_BROOKTREE_OFFSET, par->bt = of_ioremap(&op->resource[0], CG6_BROOKTREE_OFFSET,
sizeof(struct bt_regs), "cgsix dac"); sizeof(struct bt_regs), "cgsix dac");
all->par.fhc = of_ioremap(&op->resource[0], CG6_FHC_OFFSET, par->fhc = of_ioremap(&op->resource[0], CG6_FHC_OFFSET,
sizeof(u32), "cgsix fhc"); sizeof(u32), "cgsix fhc");
all->info.flags = FBINFO_DEFAULT | FBINFO_HWACCEL_IMAGEBLIT | info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_IMAGEBLIT |
FBINFO_HWACCEL_COPYAREA | FBINFO_HWACCEL_FILLRECT; FBINFO_HWACCEL_COPYAREA | FBINFO_HWACCEL_FILLRECT;
all->info.fbops = &cg6_ops; info->fbops = &cg6_ops;
all->info.screen_base = of_ioremap(&op->resource[0], CG6_RAM_OFFSET,
all->par.fbsize, "cgsix ram");
if (!all->par.fbc || !all->par.tec || !all->par.thc ||
!all->par.bt || !all->par.fhc || !all->info.screen_base) {
cg6_unmap_regs(op, all);
kfree(all);
return -ENOMEM;
}
all->info.par = &all->par; info->screen_base = of_ioremap(&op->resource[0], CG6_RAM_OFFSET,
par->fbsize, "cgsix ram");
if (!par->fbc || !par->tec || !par->thc ||
!par->bt || !par->fhc || !info->screen_base)
goto out_unmap_regs;
all->info.var.accel_flags = FB_ACCELF_TEXT; info->var.accel_flags = FB_ACCELF_TEXT;
cg6_bt_init(&all->par); cg6_bt_init(par);
cg6_chip_init(&all->info); cg6_chip_init(info);
cg6_blank(0, &all->info); cg6_blank(0, info);
if (fb_alloc_cmap(&all->info.cmap, 256, 0)) { if (fb_alloc_cmap(&info->cmap, 256, 0))
cg6_unmap_regs(op, all); goto out_unmap_regs;
kfree(all);
return -ENOMEM;
}
fb_set_cmap(&all->info.cmap, &all->info); fb_set_cmap(&info->cmap, info);
cg6_init_fix(&all->info, linebytes); cg6_init_fix(info, linebytes);
err = register_framebuffer(&all->info); err = register_framebuffer(info);
if (err < 0) { if (err < 0)
cg6_unmap_regs(op, all); goto out_dealloc_cmap;
fb_dealloc_cmap(&all->info.cmap);
kfree(all);
return err;
}
dev_set_drvdata(&op->dev, all); dev_set_drvdata(&op->dev, info);
printk("%s: CGsix [%s] at %lx:%lx\n", printk("%s: CGsix [%s] at %lx:%lx\n",
dp->full_name, dp->full_name, info->fix.id,
all->info.fix.id, par->which_io, par->physbase);
all->par.which_io, all->par.physbase);
return 0; return 0;
}
static int __devinit cg6_probe(struct of_device *dev, const struct of_device_id *match) out_dealloc_cmap:
{ fb_dealloc_cmap(&info->cmap);
struct of_device *op = to_of_device(&dev->dev);
out_unmap_regs:
cg6_unmap_regs(op, info, par);
return cg6_init_one(op); out_err:
return err;
} }
static int __devexit cg6_remove(struct of_device *op) static int __devexit cg6_remove(struct of_device *op)
{ {
struct all_info *all = dev_get_drvdata(&op->dev); struct fb_info *info = dev_get_drvdata(&op->dev);
struct cg6_par *par = info->par;
unregister_framebuffer(&all->info); unregister_framebuffer(info);
fb_dealloc_cmap(&all->info.cmap); fb_dealloc_cmap(&info->cmap);
cg6_unmap_regs(op, all); cg6_unmap_regs(op, info, par);
kfree(all); framebuffer_release(info);
dev_set_drvdata(&op->dev, NULL); dev_set_drvdata(&op->dev, NULL);
......
...@@ -371,6 +371,8 @@ struct ffb_par { ...@@ -371,6 +371,8 @@ struct ffb_par {
unsigned long fbsize; unsigned long fbsize;
int board_type; int board_type;
u32 pseudo_palette[16];
}; };
static void FFBFifo(struct ffb_par *par, int n) static void FFBFifo(struct ffb_par *par, int n)
...@@ -900,75 +902,67 @@ ffb_init_fix(struct fb_info *info) ...@@ -900,75 +902,67 @@ ffb_init_fix(struct fb_info *info)
info->fix.accel = FB_ACCEL_SUN_CREATOR; info->fix.accel = FB_ACCEL_SUN_CREATOR;
} }
struct all_info { static int __devinit ffb_probe(struct of_device *op, const struct of_device_id *match)
struct fb_info info;
struct ffb_par par;
u32 pseudo_palette[16];
};
static int ffb_init_one(struct of_device *op)
{ {
struct device_node *dp = op->node; struct device_node *dp = op->node;
struct ffb_fbc __iomem *fbc; struct ffb_fbc __iomem *fbc;
struct ffb_dac __iomem *dac; struct ffb_dac __iomem *dac;
struct all_info *all; struct fb_info *info;
int err; struct ffb_par *par;
u32 dac_pnum, dac_rev, dac_mrev; u32 dac_pnum, dac_rev, dac_mrev;
int err;
all = kzalloc(sizeof(*all), GFP_KERNEL); info = framebuffer_alloc(sizeof(struct ffb_par), &op->dev);
if (!all)
return -ENOMEM;
spin_lock_init(&all->par.lock); err = -ENOMEM;
all->par.fbc = of_ioremap(&op->resource[2], 0, if (!info)
sizeof(struct ffb_fbc), "ffb fbc"); goto out_err;
if (!all->par.fbc) {
kfree(all);
return -ENOMEM;
}
all->par.dac = of_ioremap(&op->resource[1], 0, par = info->par;
sizeof(struct ffb_dac), "ffb dac");
if (!all->par.dac) { spin_lock_init(&par->lock);
of_iounmap(&op->resource[2], par->fbc = of_ioremap(&op->resource[2], 0,
all->par.fbc, sizeof(struct ffb_fbc)); sizeof(struct ffb_fbc), "ffb fbc");
kfree(all); if (!par->fbc)
return -ENOMEM; goto out_release_fb;
}
par->dac = of_ioremap(&op->resource[1], 0,
sizeof(struct ffb_dac), "ffb dac");
if (!par->dac)
goto out_unmap_fbc;
all->par.rop_cache = FFB_ROP_NEW; par->rop_cache = FFB_ROP_NEW;
all->par.physbase = op->resource[0].start; par->physbase = op->resource[0].start;
/* Don't mention copyarea, so SCROLL_REDRAW is always /* Don't mention copyarea, so SCROLL_REDRAW is always
* used. It is the fastest on this chip. * used. It is the fastest on this chip.
*/ */
all->info.flags = (FBINFO_DEFAULT | info->flags = (FBINFO_DEFAULT |
/* FBINFO_HWACCEL_COPYAREA | */ /* FBINFO_HWACCEL_COPYAREA | */
FBINFO_HWACCEL_FILLRECT | FBINFO_HWACCEL_FILLRECT |
FBINFO_HWACCEL_IMAGEBLIT); FBINFO_HWACCEL_IMAGEBLIT);
all->info.fbops = &ffb_ops;
all->info.screen_base = (char *) all->par.physbase + FFB_DFB24_POFF; info->fbops = &ffb_ops;
all->info.par = &all->par;
all->info.pseudo_palette = all->pseudo_palette; info->screen_base = (char *) par->physbase + FFB_DFB24_POFF;
info->pseudo_palette = par->pseudo_palette;
sbusfb_fill_var(&all->info.var, dp->node, 32);
all->par.fbsize = PAGE_ALIGN(all->info.var.xres * sbusfb_fill_var(&info->var, dp->node, 32);
all->info.var.yres * par->fbsize = PAGE_ALIGN(info->var.xres * info->var.yres * 4);
4); ffb_fixup_var_rgb(&info->var);
ffb_fixup_var_rgb(&all->info.var);
info->var.accel_flags = FB_ACCELF_TEXT;
all->info.var.accel_flags = FB_ACCELF_TEXT;
if (!strcmp(dp->name, "SUNW,afb")) if (!strcmp(dp->name, "SUNW,afb"))
all->par.flags |= FFB_FLAG_AFB; par->flags |= FFB_FLAG_AFB;
all->par.board_type = of_getintprop_default(dp, "board_type", 0); par->board_type = of_getintprop_default(dp, "board_type", 0);
fbc = all->par.fbc; fbc = par->fbc;
if ((upa_readl(&fbc->ucsr) & FFB_UCSR_ALL_ERRORS) != 0) if ((upa_readl(&fbc->ucsr) & FFB_UCSR_ALL_ERRORS) != 0)
upa_writel(FFB_UCSR_ALL_ERRORS, &fbc->ucsr); upa_writel(FFB_UCSR_ALL_ERRORS, &fbc->ucsr);
dac = all->par.dac; dac = par->dac;
upa_writel(FFB_DAC_DID, &dac->type); upa_writel(FFB_DAC_DID, &dac->type);
dac_pnum = upa_readl(&dac->value); dac_pnum = upa_readl(&dac->value);
dac_rev = (dac_pnum & FFB_DAC_DID_REV) >> FFB_DAC_DID_REV_SHIFT; dac_rev = (dac_pnum & FFB_DAC_DID_REV) >> FFB_DAC_DID_REV_SHIFT;
...@@ -985,76 +979,70 @@ static int ffb_init_one(struct of_device *op) ...@@ -985,76 +979,70 @@ static int ffb_init_one(struct of_device *op)
* cursor logic. We identify Pacifica 1 as not Pacifica 2, the * cursor logic. We identify Pacifica 1 as not Pacifica 2, the
* latter having a part number value of 0x236e. * latter having a part number value of 0x236e.
*/ */
if ((all->par.flags & FFB_FLAG_AFB) || dac_pnum == 0x236e) { if ((par->flags & FFB_FLAG_AFB) || dac_pnum == 0x236e) {
all->par.flags &= ~FFB_FLAG_INVCURSOR; par->flags &= ~FFB_FLAG_INVCURSOR;
} else { } else {
if (dac_mrev < 3) if (dac_mrev < 3)
all->par.flags |= FFB_FLAG_INVCURSOR; par->flags |= FFB_FLAG_INVCURSOR;
} }
ffb_switch_from_graph(&all->par); ffb_switch_from_graph(par);
/* Unblank it just to be sure. When there are multiple /* Unblank it just to be sure. When there are multiple
* FFB/AFB cards in the system, or it is not the OBP * FFB/AFB cards in the system, or it is not the OBP
* chosen console, it will have video outputs off in * chosen console, it will have video outputs off in
* the DAC. * the DAC.
*/ */
ffb_blank(0, &all->info); ffb_blank(0, info);
if (fb_alloc_cmap(&all->info.cmap, 256, 0)) {
printk(KERN_ERR "ffb: Could not allocate color map.\n");
of_iounmap(&op->resource[2],
all->par.fbc, sizeof(struct ffb_fbc));
of_iounmap(&op->resource[1],
all->par.dac, sizeof(struct ffb_dac));
kfree(all);
return -ENOMEM;
}
ffb_init_fix(&all->info); if (fb_alloc_cmap(&info->cmap, 256, 0))
goto out_unmap_dac;
err = register_framebuffer(&all->info);
if (err < 0) { ffb_init_fix(info);
printk(KERN_ERR "ffb: Could not register framebuffer.\n");
fb_dealloc_cmap(&all->info.cmap);
of_iounmap(&op->resource[2],
all->par.fbc, sizeof(struct ffb_fbc));
of_iounmap(&op->resource[1],
all->par.dac, sizeof(struct ffb_dac));
kfree(all);
return err;
}
dev_set_drvdata(&op->dev, all); err = register_framebuffer(info);
if (err < 0)
goto out_dealloc_cmap;
dev_set_drvdata(&op->dev, info);
printk("%s: %s at %016lx, type %d, " printk("%s: %s at %016lx, type %d, "
"DAC pnum[%x] rev[%d] manuf_rev[%d]\n", "DAC pnum[%x] rev[%d] manuf_rev[%d]\n",
dp->full_name, dp->full_name,
((all->par.flags & FFB_FLAG_AFB) ? "AFB" : "FFB"), ((par->flags & FFB_FLAG_AFB) ? "AFB" : "FFB"),
all->par.physbase, all->par.board_type, par->physbase, par->board_type,
dac_pnum, dac_rev, dac_mrev); dac_pnum, dac_rev, dac_mrev);
return 0; return 0;
}
static int __devinit ffb_probe(struct of_device *dev, const struct of_device_id *match) out_dealloc_cmap:
{ fb_dealloc_cmap(&info->cmap);
struct of_device *op = to_of_device(&dev->dev);
out_unmap_dac:
of_iounmap(&op->resource[2], par->fbc, sizeof(struct ffb_fbc));
out_unmap_fbc:
of_iounmap(&op->resource[2], par->fbc, sizeof(struct ffb_fbc));
out_release_fb:
framebuffer_release(info);
return ffb_init_one(op); out_err:
return err;
} }
static int __devexit ffb_remove(struct of_device *op) static int __devexit ffb_remove(struct of_device *op)
{ {
struct all_info *all = dev_get_drvdata(&op->dev); struct fb_info *info = dev_get_drvdata(&op->dev);
struct ffb_par *par = info->par;
unregister_framebuffer(&all->info); unregister_framebuffer(info);
fb_dealloc_cmap(&all->info.cmap); fb_dealloc_cmap(&info->cmap);
of_iounmap(&op->resource[2], all->par.fbc, sizeof(struct ffb_fbc)); of_iounmap(&op->resource[2], par->fbc, sizeof(struct ffb_fbc));
of_iounmap(&op->resource[1], all->par.dac, sizeof(struct ffb_dac)); of_iounmap(&op->resource[1], par->dac, sizeof(struct ffb_dac));
kfree(all); framebuffer_release(info);
dev_set_drvdata(&op->dev, NULL); dev_set_drvdata(&op->dev, NULL);
......
...@@ -525,130 +525,123 @@ static void leo_fixup_var_rgb(struct fb_var_screeninfo *var) ...@@ -525,130 +525,123 @@ static void leo_fixup_var_rgb(struct fb_var_screeninfo *var)
var->transp.length = 0; var->transp.length = 0;
} }
struct all_info { static void leo_unmap_regs(struct of_device *op, struct fb_info *info,
struct fb_info info; struct leo_par *par)
struct leo_par par;
};
static void leo_unmap_regs(struct of_device *op, struct all_info *all)
{ {
if (all->par.lc_ss0_usr) if (par->lc_ss0_usr)
of_iounmap(&op->resource[0], all->par.lc_ss0_usr, 0x1000); of_iounmap(&op->resource[0], par->lc_ss0_usr, 0x1000);
if (all->par.ld_ss0) if (par->ld_ss0)
of_iounmap(&op->resource[0], all->par.ld_ss0, 0x1000); of_iounmap(&op->resource[0], par->ld_ss0, 0x1000);
if (all->par.ld_ss1) if (par->ld_ss1)
of_iounmap(&op->resource[0], all->par.ld_ss1, 0x1000); of_iounmap(&op->resource[0], par->ld_ss1, 0x1000);
if (all->par.lx_krn) if (par->lx_krn)
of_iounmap(&op->resource[0], all->par.lx_krn, 0x1000); of_iounmap(&op->resource[0], par->lx_krn, 0x1000);
if (all->par.cursor) if (par->cursor)
of_iounmap(&op->resource[0], of_iounmap(&op->resource[0],
all->par.cursor, sizeof(struct leo_cursor)); par->cursor, sizeof(struct leo_cursor));
if (all->info.screen_base) if (info->screen_base)
of_iounmap(&op->resource[0], all->info.screen_base, 0x800000); of_iounmap(&op->resource[0], info->screen_base, 0x800000);
} }
static int __devinit leo_init_one(struct of_device *op) static int __devinit leo_probe(struct of_device *op, const struct of_device_id *match)
{ {
struct device_node *dp = op->node; struct device_node *dp = op->node;
struct all_info *all; struct fb_info *info;
struct leo_par *par;
int linebytes, err; int linebytes, err;
all = kzalloc(sizeof(*all), GFP_KERNEL); info = framebuffer_alloc(sizeof(struct leo_par), &op->dev);
if (!all)
return -ENOMEM; err = -ENOMEM;
if (!info)
goto out_err;
par = info->par;
spin_lock_init(&all->par.lock); spin_lock_init(&par->lock);
all->par.physbase = op->resource[0].start; par->physbase = op->resource[0].start;
all->par.which_io = op->resource[0].flags & IORESOURCE_BITS; par->which_io = op->resource[0].flags & IORESOURCE_BITS;
sbusfb_fill_var(&all->info.var, dp->node, 32); sbusfb_fill_var(&info->var, dp->node, 32);
leo_fixup_var_rgb(&all->info.var); leo_fixup_var_rgb(&info->var);
linebytes = of_getintprop_default(dp, "linebytes", linebytes = of_getintprop_default(dp, "linebytes",
all->info.var.xres); info->var.xres);
all->par.fbsize = PAGE_ALIGN(linebytes * all->info.var.yres); par->fbsize = PAGE_ALIGN(linebytes * info->var.yres);
all->par.lc_ss0_usr = par->lc_ss0_usr =
of_ioremap(&op->resource[0], LEO_OFF_LC_SS0_USR, of_ioremap(&op->resource[0], LEO_OFF_LC_SS0_USR,
0x1000, "leolc ss0usr"); 0x1000, "leolc ss0usr");
all->par.ld_ss0 = par->ld_ss0 =
of_ioremap(&op->resource[0], LEO_OFF_LD_SS0, of_ioremap(&op->resource[0], LEO_OFF_LD_SS0,
0x1000, "leold ss0"); 0x1000, "leold ss0");
all->par.ld_ss1 = par->ld_ss1 =
of_ioremap(&op->resource[0], LEO_OFF_LD_SS1, of_ioremap(&op->resource[0], LEO_OFF_LD_SS1,
0x1000, "leold ss1"); 0x1000, "leold ss1");
all->par.lx_krn = par->lx_krn =
of_ioremap(&op->resource[0], LEO_OFF_LX_KRN, of_ioremap(&op->resource[0], LEO_OFF_LX_KRN,
0x1000, "leolx krn"); 0x1000, "leolx krn");
all->par.cursor = par->cursor =
of_ioremap(&op->resource[0], LEO_OFF_LX_CURSOR, of_ioremap(&op->resource[0], LEO_OFF_LX_CURSOR,
sizeof(struct leo_cursor), "leolx cursor"); sizeof(struct leo_cursor), "leolx cursor");
all->info.screen_base = info->screen_base =
of_ioremap(&op->resource[0], LEO_OFF_SS0, of_ioremap(&op->resource[0], LEO_OFF_SS0,
0x800000, "leo ram"); 0x800000, "leo ram");
if (!all->par.lc_ss0_usr || if (!par->lc_ss0_usr ||
!all->par.ld_ss0 || !par->ld_ss0 ||
!all->par.ld_ss1 || !par->ld_ss1 ||
!all->par.lx_krn || !par->lx_krn ||
!all->par.cursor || !par->cursor ||
!all->info.screen_base) { !info->screen_base)
leo_unmap_regs(op, all); goto out_unmap_regs;
kfree(all);
return -ENOMEM;
}
all->info.flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN; info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN;
all->info.fbops = &leo_ops; info->fbops = &leo_ops;
all->info.par = &all->par;
leo_init_wids(&all->info); leo_init_wids(info);
leo_init_hw(&all->info); leo_init_hw(info);
leo_blank(0, &all->info); leo_blank(0, info);
if (fb_alloc_cmap(&all->info.cmap, 256, 0)) { if (fb_alloc_cmap(&info->cmap, 256, 0))
leo_unmap_regs(op, all); goto out_unmap_regs;
kfree(all);
return -ENOMEM;;
}
leo_init_fix(&all->info, dp); leo_init_fix(info, dp);
err = register_framebuffer(&all->info); err = register_framebuffer(info);
if (err < 0) { if (err < 0)
fb_dealloc_cmap(&all->info.cmap); goto out_dealloc_cmap;
leo_unmap_regs(op, all);
kfree(all);
return err;
}
dev_set_drvdata(&op->dev, all); dev_set_drvdata(&op->dev, info);
printk("%s: leo at %lx:%lx\n", printk("%s: leo at %lx:%lx\n",
dp->full_name, dp->full_name,
all->par.which_io, all->par.physbase); par->which_io, par->physbase);
return 0; return 0;
}
static int __devinit leo_probe(struct of_device *dev, const struct of_device_id *match) out_dealloc_cmap:
{ fb_dealloc_cmap(&info->cmap);
struct of_device *op = to_of_device(&dev->dev);
out_unmap_regs:
leo_unmap_regs(op, info, par);
framebuffer_release(info);
return leo_init_one(op); out_err:
return err;
} }
static int __devexit leo_remove(struct of_device *op) static int __devexit leo_remove(struct of_device *op)
{ {
struct all_info *all = dev_get_drvdata(&op->dev); struct fb_info *info = dev_get_drvdata(&op->dev);
struct leo_par *par = info->par;
unregister_framebuffer(&all->info); unregister_framebuffer(info);
fb_dealloc_cmap(&all->info.cmap); fb_dealloc_cmap(&info->cmap);
leo_unmap_regs(op, all); leo_unmap_regs(op, info, par);
kfree(all); framebuffer_release(info);
dev_set_drvdata(&op->dev, NULL); dev_set_drvdata(&op->dev, NULL);
......
...@@ -255,107 +255,95 @@ static void p9100_init_fix(struct fb_info *info, int linebytes, struct device_no ...@@ -255,107 +255,95 @@ static void p9100_init_fix(struct fb_info *info, int linebytes, struct device_no
info->fix.accel = FB_ACCEL_SUN_CGTHREE; info->fix.accel = FB_ACCEL_SUN_CGTHREE;
} }
struct all_info { static int __devinit p9100_probe(struct of_device *op, const struct of_device_id *match)
struct fb_info info;
struct p9100_par par;
};
static int __devinit p9100_init_one(struct of_device *op)
{ {
struct device_node *dp = op->node; struct device_node *dp = op->node;
struct all_info *all; struct fb_info *info;
struct p9100_par *par;
int linebytes, err; int linebytes, err;
all = kzalloc(sizeof(*all), GFP_KERNEL); info = framebuffer_alloc(sizeof(struct p9100_par), &op->dev);
if (!all)
return -ENOMEM; err = -ENOMEM;
if (!info)
goto out_err;
par = info->par;
spin_lock_init(&all->par.lock); spin_lock_init(&par->lock);
/* This is the framebuffer and the only resource apps can mmap. */ /* This is the framebuffer and the only resource apps can mmap. */
all->par.physbase = op->resource[2].start; par->physbase = op->resource[2].start;
all->par.which_io = op->resource[2].flags & IORESOURCE_BITS; par->which_io = op->resource[2].flags & IORESOURCE_BITS;
sbusfb_fill_var(&all->info.var, dp->node, 8);
all->info.var.red.length = 8;
all->info.var.green.length = 8;
all->info.var.blue.length = 8;
linebytes = of_getintprop_default(dp, "linebytes",
all->info.var.xres);
all->par.fbsize = PAGE_ALIGN(linebytes * all->info.var.yres);
all->par.regs = of_ioremap(&op->resource[0], 0,
sizeof(struct p9100_regs), "p9100 regs");
if (!all->par.regs) {
kfree(all);
return -ENOMEM;
}
all->info.flags = FBINFO_DEFAULT; sbusfb_fill_var(&info->var, dp->node, 8);
all->info.fbops = &p9100_ops; info->var.red.length = 8;
all->info.screen_base = of_ioremap(&op->resource[2], 0, info->var.green.length = 8;
all->par.fbsize, "p9100 ram"); info->var.blue.length = 8;
if (!all->info.screen_base) {
of_iounmap(&op->resource[0],
all->par.regs, sizeof(struct p9100_regs));
kfree(all);
return -ENOMEM;
}
all->info.par = &all->par;
p9100_blank(0, &all->info); linebytes = of_getintprop_default(dp, "linebytes", info->var.xres);
par->fbsize = PAGE_ALIGN(linebytes * info->var.yres);
if (fb_alloc_cmap(&all->info.cmap, 256, 0)) { par->regs = of_ioremap(&op->resource[0], 0,
of_iounmap(&op->resource[0], sizeof(struct p9100_regs), "p9100 regs");
all->par.regs, sizeof(struct p9100_regs)); if (!par->regs)
of_iounmap(&op->resource[2], goto out_release_fb;
all->info.screen_base, all->par.fbsize);
kfree(all);
return -ENOMEM;
}
p9100_init_fix(&all->info, linebytes, dp); info->flags = FBINFO_DEFAULT;
info->fbops = &p9100_ops;
err = register_framebuffer(&all->info); info->screen_base = of_ioremap(&op->resource[2], 0,
if (err < 0) { par->fbsize, "p9100 ram");
fb_dealloc_cmap(&all->info.cmap); if (!info->screen_base)
of_iounmap(&op->resource[0], goto out_unmap_regs;
all->par.regs, sizeof(struct p9100_regs));
of_iounmap(&op->resource[2], p9100_blank(0, info);
all->info.screen_base, all->par.fbsize);
kfree(all); if (fb_alloc_cmap(&info->cmap, 256, 0))
return err; goto out_unmap_screen;
}
fb_set_cmap(&all->info.cmap, &all->info);
dev_set_drvdata(&op->dev, all); p9100_init_fix(info, linebytes, dp);
err = register_framebuffer(info);
if (err < 0)
goto out_dealloc_cmap;
fb_set_cmap(&info->cmap, info);
dev_set_drvdata(&op->dev, info);
printk("%s: p9100 at %lx:%lx\n", printk("%s: p9100 at %lx:%lx\n",
dp->full_name, dp->full_name,
all->par.which_io, all->par.physbase); par->which_io, par->physbase);
return 0; return 0;
}
static int __devinit p9100_probe(struct of_device *dev, const struct of_device_id *match) out_dealloc_cmap:
{ fb_dealloc_cmap(&info->cmap);
struct of_device *op = to_of_device(&dev->dev);
out_unmap_screen:
of_iounmap(&op->resource[2], info->screen_base, par->fbsize);
out_unmap_regs:
of_iounmap(&op->resource[0], par->regs, sizeof(struct p9100_regs));
out_release_fb:
framebuffer_release(info);
return p9100_init_one(op); out_err:
return err;
} }
static int __devexit p9100_remove(struct of_device *op) static int __devexit p9100_remove(struct of_device *op)
{ {
struct all_info *all = dev_get_drvdata(&op->dev); struct fb_info *info = dev_get_drvdata(&op->dev);
struct p9100_par *par = info->par;
unregister_framebuffer(&all->info); unregister_framebuffer(info);
fb_dealloc_cmap(&all->info.cmap); fb_dealloc_cmap(&info->cmap);
of_iounmap(&op->resource[0], all->par.regs, sizeof(struct p9100_regs)); of_iounmap(&op->resource[0], par->regs, sizeof(struct p9100_regs));
of_iounmap(&op->resource[2], all->info.screen_base, all->par.fbsize); of_iounmap(&op->resource[2], info->screen_base, par->fbsize);
kfree(all); framebuffer_release(info);
dev_set_drvdata(&op->dev, NULL); dev_set_drvdata(&op->dev, NULL);
......
...@@ -190,17 +190,6 @@ int sbusfb_ioctl_helper(unsigned long cmd, unsigned long arg, ...@@ -190,17 +190,6 @@ int sbusfb_ioctl_helper(unsigned long cmd, unsigned long arg,
EXPORT_SYMBOL(sbusfb_ioctl_helper); EXPORT_SYMBOL(sbusfb_ioctl_helper);
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
struct fbcmap32 {
int index; /* first element (0 origin) */
int count;
u32 red;
u32 green;
u32 blue;
};
#define FBIOPUTCMAP32 _IOW('F', 3, struct fbcmap32)
#define FBIOGETCMAP32 _IOW('F', 4, struct fbcmap32)
static int fbiogetputcmap(struct fb_info *info, unsigned int cmd, unsigned long arg) static int fbiogetputcmap(struct fb_info *info, unsigned int cmd, unsigned long arg)
{ {
struct fbcmap32 __user *argp = (void __user *)arg; struct fbcmap32 __user *argp = (void __user *)arg;
...@@ -223,20 +212,6 @@ static int fbiogetputcmap(struct fb_info *info, unsigned int cmd, unsigned long ...@@ -223,20 +212,6 @@ static int fbiogetputcmap(struct fb_info *info, unsigned int cmd, unsigned long
(unsigned long)p); (unsigned long)p);
} }
struct fbcursor32 {
short set; /* what to set, choose from the list above */
short enable; /* cursor on/off */
struct fbcurpos pos; /* cursor position */
struct fbcurpos hot; /* cursor hot spot */
struct fbcmap32 cmap; /* color map info */
struct fbcurpos size; /* cursor bit map size */
u32 image; /* cursor image bits */
u32 mask; /* cursor mask bits */
};
#define FBIOSCURSOR32 _IOW('F', 24, struct fbcursor32)
#define FBIOGCURSOR32 _IOW('F', 25, struct fbcursor32)
static int fbiogscursor(struct fb_info *info, unsigned long arg) static int fbiogscursor(struct fb_info *info, unsigned long arg)
{ {
struct fbcursor __user *p = compat_alloc_user_space(sizeof(*p)); struct fbcursor __user *p = compat_alloc_user_space(sizeof(*p));
......
...@@ -345,88 +345,82 @@ tcx_init_fix(struct fb_info *info, int linebytes) ...@@ -345,88 +345,82 @@ tcx_init_fix(struct fb_info *info, int linebytes)
info->fix.accel = FB_ACCEL_SUN_TCX; info->fix.accel = FB_ACCEL_SUN_TCX;
} }
struct all_info { static void tcx_unmap_regs(struct of_device *op, struct fb_info *info,
struct fb_info info; struct tcx_par *par)
struct tcx_par par;
};
static void tcx_unmap_regs(struct of_device *op, struct all_info *all)
{ {
if (all->par.tec) if (par->tec)
of_iounmap(&op->resource[7], of_iounmap(&op->resource[7],
all->par.tec, sizeof(struct tcx_tec)); par->tec, sizeof(struct tcx_tec));
if (all->par.thc) if (par->thc)
of_iounmap(&op->resource[9], of_iounmap(&op->resource[9],
all->par.thc, sizeof(struct tcx_thc)); par->thc, sizeof(struct tcx_thc));
if (all->par.bt) if (par->bt)
of_iounmap(&op->resource[8], of_iounmap(&op->resource[8],
all->par.bt, sizeof(struct bt_regs)); par->bt, sizeof(struct bt_regs));
if (all->par.cplane) if (par->cplane)
of_iounmap(&op->resource[4], of_iounmap(&op->resource[4],
all->par.cplane, all->par.fbsize * sizeof(u32)); par->cplane, par->fbsize * sizeof(u32));
if (all->info.screen_base) if (info->screen_base)
of_iounmap(&op->resource[0], of_iounmap(&op->resource[0],
all->info.screen_base, all->par.fbsize); info->screen_base, par->fbsize);
} }
static int __devinit tcx_init_one(struct of_device *op) static int __devinit tcx_init_one(struct of_device *op)
{ {
struct device_node *dp = op->node; struct device_node *dp = op->node;
struct all_info *all; struct fb_info *info;
struct tcx_par *par;
int linebytes, i, err; int linebytes, i, err;
all = kzalloc(sizeof(*all), GFP_KERNEL); info = framebuffer_alloc(sizeof(struct tcx_par), &op->dev);
if (!all)
return -ENOMEM;
spin_lock_init(&all->par.lock); err = -ENOMEM;
if (!info)
goto out_err;
par = info->par;
all->par.lowdepth = spin_lock_init(&par->lock);
par->lowdepth =
(of_find_property(dp, "tcx-8-bit", NULL) != NULL); (of_find_property(dp, "tcx-8-bit", NULL) != NULL);
sbusfb_fill_var(&all->info.var, dp->node, 8); sbusfb_fill_var(&info->var, dp->node, 8);
all->info.var.red.length = 8; info->var.red.length = 8;
all->info.var.green.length = 8; info->var.green.length = 8;
all->info.var.blue.length = 8; info->var.blue.length = 8;
linebytes = of_getintprop_default(dp, "linebytes", linebytes = of_getintprop_default(dp, "linebytes",
all->info.var.xres); info->var.xres);
all->par.fbsize = PAGE_ALIGN(linebytes * all->info.var.yres); par->fbsize = PAGE_ALIGN(linebytes * info->var.yres);
all->par.tec = of_ioremap(&op->resource[7], 0, par->tec = of_ioremap(&op->resource[7], 0,
sizeof(struct tcx_tec), "tcx tec"); sizeof(struct tcx_tec), "tcx tec");
all->par.thc = of_ioremap(&op->resource[9], 0, par->thc = of_ioremap(&op->resource[9], 0,
sizeof(struct tcx_thc), "tcx thc"); sizeof(struct tcx_thc), "tcx thc");
all->par.bt = of_ioremap(&op->resource[8], 0, par->bt = of_ioremap(&op->resource[8], 0,
sizeof(struct bt_regs), "tcx dac"); sizeof(struct bt_regs), "tcx dac");
all->info.screen_base = of_ioremap(&op->resource[0], 0, info->screen_base = of_ioremap(&op->resource[0], 0,
all->par.fbsize, "tcx ram"); par->fbsize, "tcx ram");
if (!all->par.tec || !all->par.thc || if (!par->tec || !par->thc ||
!all->par.bt || !all->info.screen_base) { !par->bt || !info->screen_base)
tcx_unmap_regs(op, all); goto out_unmap_regs;
kfree(all);
return -ENOMEM; memcpy(&par->mmap_map, &__tcx_mmap_map, sizeof(par->mmap_map));
} if (!par->lowdepth) {
par->cplane = of_ioremap(&op->resource[4], 0,
memcpy(&all->par.mmap_map, &__tcx_mmap_map, sizeof(all->par.mmap_map)); par->fbsize * sizeof(u32),
if (!all->par.lowdepth) {
all->par.cplane = of_ioremap(&op->resource[4], 0,
all->par.fbsize * sizeof(u32),
"tcx cplane"); "tcx cplane");
if (!all->par.cplane) { if (!par->cplane)
tcx_unmap_regs(op, all); goto out_unmap_regs;
kfree(all);
return -ENOMEM;
}
} else { } else {
all->par.mmap_map[1].size = SBUS_MMAP_EMPTY; par->mmap_map[1].size = SBUS_MMAP_EMPTY;
all->par.mmap_map[4].size = SBUS_MMAP_EMPTY; par->mmap_map[4].size = SBUS_MMAP_EMPTY;
all->par.mmap_map[5].size = SBUS_MMAP_EMPTY; par->mmap_map[5].size = SBUS_MMAP_EMPTY;
all->par.mmap_map[6].size = SBUS_MMAP_EMPTY; par->mmap_map[6].size = SBUS_MMAP_EMPTY;
} }
all->par.physbase = 0; par->physbase = 0;
all->par.which_io = op->resource[0].flags & IORESOURCE_BITS; par->which_io = op->resource[0].flags & IORESOURCE_BITS;
for (i = 0; i < TCX_MMAP_ENTRIES; i++) { for (i = 0; i < TCX_MMAP_ENTRIES; i++) {
int j; int j;
...@@ -444,53 +438,54 @@ static int __devinit tcx_init_one(struct of_device *op) ...@@ -444,53 +438,54 @@ static int __devinit tcx_init_one(struct of_device *op)
j = i; j = i;
break; break;
}; };
all->par.mmap_map[i].poff = op->resource[j].start; par->mmap_map[i].poff = op->resource[j].start;
} }
all->info.flags = FBINFO_DEFAULT; info->flags = FBINFO_DEFAULT;
all->info.fbops = &tcx_ops; info->fbops = &tcx_ops;
all->info.par = &all->par;
/* Initialize brooktree DAC. */ /* Initialize brooktree DAC. */
sbus_writel(0x04 << 24, &all->par.bt->addr); /* color planes */ sbus_writel(0x04 << 24, &par->bt->addr); /* color planes */
sbus_writel(0xff << 24, &all->par.bt->control); sbus_writel(0xff << 24, &par->bt->control);
sbus_writel(0x05 << 24, &all->par.bt->addr); sbus_writel(0x05 << 24, &par->bt->addr);
sbus_writel(0x00 << 24, &all->par.bt->control); sbus_writel(0x00 << 24, &par->bt->control);
sbus_writel(0x06 << 24, &all->par.bt->addr); /* overlay plane */ sbus_writel(0x06 << 24, &par->bt->addr); /* overlay plane */
sbus_writel(0x73 << 24, &all->par.bt->control); sbus_writel(0x73 << 24, &par->bt->control);
sbus_writel(0x07 << 24, &all->par.bt->addr); sbus_writel(0x07 << 24, &par->bt->addr);
sbus_writel(0x00 << 24, &all->par.bt->control); sbus_writel(0x00 << 24, &par->bt->control);
tcx_reset(&all->info); tcx_reset(info);
tcx_blank(FB_BLANK_UNBLANK, &all->info);
if (fb_alloc_cmap(&all->info.cmap, 256, 0)) {
tcx_unmap_regs(op, all);
kfree(all);
return -ENOMEM;
}
fb_set_cmap(&all->info.cmap, &all->info); tcx_blank(FB_BLANK_UNBLANK, info);
tcx_init_fix(&all->info, linebytes);
err = register_framebuffer(&all->info); if (fb_alloc_cmap(&info->cmap, 256, 0))
if (err < 0) { goto out_unmap_regs;
fb_dealloc_cmap(&all->info.cmap);
tcx_unmap_regs(op, all); fb_set_cmap(&info->cmap, info);
kfree(all); tcx_init_fix(info, linebytes);
return err;
} err = register_framebuffer(info);
if (err < 0)
goto out_dealloc_cmap;
dev_set_drvdata(&op->dev, all); dev_set_drvdata(&op->dev, info);
printk("%s: TCX at %lx:%lx, %s\n", printk("%s: TCX at %lx:%lx, %s\n",
dp->full_name, dp->full_name,
all->par.which_io, par->which_io,
op->resource[0].start, op->resource[0].start,
all->par.lowdepth ? "8-bit only" : "24-bit depth"); par->lowdepth ? "8-bit only" : "24-bit depth");
return 0; return 0;
out_dealloc_cmap:
fb_dealloc_cmap(&info->cmap);
out_unmap_regs:
tcx_unmap_regs(op, info, par);
out_err:
return err;
} }
static int __devinit tcx_probe(struct of_device *dev, const struct of_device_id *match) static int __devinit tcx_probe(struct of_device *dev, const struct of_device_id *match)
...@@ -502,14 +497,15 @@ static int __devinit tcx_probe(struct of_device *dev, const struct of_device_id ...@@ -502,14 +497,15 @@ static int __devinit tcx_probe(struct of_device *dev, const struct of_device_id
static int __devexit tcx_remove(struct of_device *op) static int __devexit tcx_remove(struct of_device *op)
{ {
struct all_info *all = dev_get_drvdata(&op->dev); struct fb_info *info = dev_get_drvdata(&op->dev);
struct tcx_par *par = info->par;
unregister_framebuffer(&all->info); unregister_framebuffer(info);
fb_dealloc_cmap(&all->info.cmap); fb_dealloc_cmap(&info->cmap);
tcx_unmap_regs(op, all); tcx_unmap_regs(op, info, par);
kfree(all); framebuffer_release(info);
dev_set_drvdata(&op->dev, NULL); dev_set_drvdata(&op->dev, NULL);
......
...@@ -115,6 +115,10 @@ ...@@ -115,6 +115,10 @@
#include <linux/dvb/video.h> #include <linux/dvb/video.h>
#include <linux/lp.h> #include <linux/lp.h>
#ifdef CONFIG_SPARC
#include <asm/fbio.h>
#endif
static int do_ioctl32_pointer(unsigned int fd, unsigned int cmd, static int do_ioctl32_pointer(unsigned int fd, unsigned int cmd,
unsigned long arg, struct file *f) unsigned long arg, struct file *f)
{ {
...@@ -3493,6 +3497,22 @@ IGNORE_IOCTL(VFAT_IOCTL_READDIR_SHORT32) ...@@ -3493,6 +3497,22 @@ IGNORE_IOCTL(VFAT_IOCTL_READDIR_SHORT32)
/* loop */ /* loop */
IGNORE_IOCTL(LOOP_CLR_FD) IGNORE_IOCTL(LOOP_CLR_FD)
#ifdef CONFIG_SPARC
/* Sparc framebuffers, handled in sbusfb_compat_ioctl() */
IGNORE_IOCTL(FBIOGTYPE)
IGNORE_IOCTL(FBIOSATTR)
IGNORE_IOCTL(FBIOGATTR)
IGNORE_IOCTL(FBIOSVIDEO)
IGNORE_IOCTL(FBIOGVIDEO)
IGNORE_IOCTL(FBIOSCURPOS)
IGNORE_IOCTL(FBIOGCURPOS)
IGNORE_IOCTL(FBIOGCURMAX)
IGNORE_IOCTL(FBIOPUTCMAP32)
IGNORE_IOCTL(FBIOGETCMAP32)
IGNORE_IOCTL(FBIOSCURSOR32)
IGNORE_IOCTL(FBIOGCURSOR32)
#endif
}; };
#define IOCTL_HASHSIZE 256 #define IOCTL_HASHSIZE 256
......
...@@ -203,6 +203,7 @@ parse_solaris_x86(struct parsed_partitions *state, struct block_device *bdev, ...@@ -203,6 +203,7 @@ parse_solaris_x86(struct parsed_partitions *state, struct block_device *bdev,
Sector sect; Sector sect;
struct solaris_x86_vtoc *v; struct solaris_x86_vtoc *v;
int i; int i;
short max_nparts;
v = (struct solaris_x86_vtoc *)read_dev_sector(bdev, offset+1, &sect); v = (struct solaris_x86_vtoc *)read_dev_sector(bdev, offset+1, &sect);
if (!v) if (!v)
...@@ -218,7 +219,9 @@ parse_solaris_x86(struct parsed_partitions *state, struct block_device *bdev, ...@@ -218,7 +219,9 @@ parse_solaris_x86(struct parsed_partitions *state, struct block_device *bdev,
put_dev_sector(sect); put_dev_sector(sect);
return; return;
} }
for (i=0; i<SOLARIS_X86_NUMSLICE && state->next<state->limit; i++) { /* Ensure we can handle previous case of VTOC with 8 entries gracefully */
max_nparts = le16_to_cpu (v->v_nparts) > 8 ? SOLARIS_X86_NUMSLICE : 8;
for (i=0; i<max_nparts && state->next<state->limit; i++) {
struct solaris_x86_slice *s = &v->v_slice[i]; struct solaris_x86_slice *s = &v->v_slice[i];
if (s->s_size == 0) if (s->s_size == 0)
continue; continue;
......
...@@ -19,34 +19,47 @@ int sun_partition(struct parsed_partitions *state, struct block_device *bdev) ...@@ -19,34 +19,47 @@ int sun_partition(struct parsed_partitions *state, struct block_device *bdev)
Sector sect; Sector sect;
struct sun_disklabel { struct sun_disklabel {
unsigned char info[128]; /* Informative text string */ unsigned char info[128]; /* Informative text string */
unsigned char spare0[14]; struct sun_vtoc {
struct sun_info { __be32 version; /* Layout version */
unsigned char spare1; char volume[8]; /* Volume name */
unsigned char id; __be16 nparts; /* Number of partitions */
unsigned char spare2; struct sun_info { /* Partition hdrs, sec 2 */
unsigned char flags; __be16 id;
} infos[8]; __be16 flags;
unsigned char spare[246]; /* Boot information etc. */ } infos[8];
__be16 padding; /* Alignment padding */
__be32 bootinfo[3]; /* Info needed by mboot */
__be32 sanity; /* To verify vtoc sanity */
__be32 reserved[10]; /* Free space */
__be32 timestamp[8]; /* Partition timestamp */
} vtoc;
__be32 write_reinstruct; /* sectors to skip, writes */
__be32 read_reinstruct; /* sectors to skip, reads */
unsigned char spare[148]; /* Padding */
__be16 rspeed; /* Disk rotational speed */ __be16 rspeed; /* Disk rotational speed */
__be16 pcylcount; /* Physical cylinder count */ __be16 pcylcount; /* Physical cylinder count */
__be16 sparecyl; /* extra sects per cylinder */ __be16 sparecyl; /* extra sects per cylinder */
unsigned char spare2[4]; /* More magic... */ __be16 obs1; /* gap1 */
__be16 obs2; /* gap2 */
__be16 ilfact; /* Interleave factor */ __be16 ilfact; /* Interleave factor */
__be16 ncyl; /* Data cylinder count */ __be16 ncyl; /* Data cylinder count */
__be16 nacyl; /* Alt. cylinder count */ __be16 nacyl; /* Alt. cylinder count */
__be16 ntrks; /* Tracks per cylinder */ __be16 ntrks; /* Tracks per cylinder */
__be16 nsect; /* Sectors per track */ __be16 nsect; /* Sectors per track */
unsigned char spare3[4]; /* Even more magic... */ __be16 obs3; /* bhead - Label head offset */
__be16 obs4; /* ppart - Physical Partition */
struct sun_partition { struct sun_partition {
__be32 start_cylinder; __be32 start_cylinder;
__be32 num_sectors; __be32 num_sectors;
} partitions[8]; } partitions[8];
__be16 magic; /* Magic number */ __be16 magic; /* Magic number */
__be16 csum; /* Label xor'd checksum */ __be16 csum; /* Label xor'd checksum */
} * label; } * label;
struct sun_partition *p; struct sun_partition *p;
unsigned long spc; unsigned long spc;
char b[BDEVNAME_SIZE]; char b[BDEVNAME_SIZE];
int use_vtoc;
int nparts;
label = (struct sun_disklabel *)read_dev_sector(bdev, 0, &sect); label = (struct sun_disklabel *)read_dev_sector(bdev, 0, &sect);
if (!label) if (!label)
...@@ -70,9 +83,22 @@ int sun_partition(struct parsed_partitions *state, struct block_device *bdev) ...@@ -70,9 +83,22 @@ int sun_partition(struct parsed_partitions *state, struct block_device *bdev)
return 0; return 0;
} }
/* All Sun disks have 8 partition entries */ /* Check to see if we can use the VTOC table */
use_vtoc = ((be32_to_cpu(label->vtoc.sanity) == SUN_VTOC_SANITY) &&
(be32_to_cpu(label->vtoc.version) == 1) &&
(be16_to_cpu(label->vtoc.nparts) <= 8));
/* Use 8 partition entries if not specified in validated VTOC */
nparts = (use_vtoc) ? be16_to_cpu(label->vtoc.nparts) : 8;
/*
* So that old Linux-Sun partitions continue to work,
* alow the VTOC to be used under the additional condition ...
*/
use_vtoc = use_vtoc || !(label->vtoc.sanity |
label->vtoc.version | label->vtoc.nparts);
spc = be16_to_cpu(label->ntrks) * be16_to_cpu(label->nsect); spc = be16_to_cpu(label->ntrks) * be16_to_cpu(label->nsect);
for (i = 0; i < 8; i++, p++) { for (i = 0; i < nparts; i++, p++) {
unsigned long st_sector; unsigned long st_sector;
unsigned int num_sectors; unsigned int num_sectors;
...@@ -81,10 +107,12 @@ int sun_partition(struct parsed_partitions *state, struct block_device *bdev) ...@@ -81,10 +107,12 @@ int sun_partition(struct parsed_partitions *state, struct block_device *bdev)
if (num_sectors) { if (num_sectors) {
put_partition(state, slot, st_sector, num_sectors); put_partition(state, slot, st_sector, num_sectors);
state->parts[slot].flags = 0; state->parts[slot].flags = 0;
if (label->infos[i].id == LINUX_RAID_PARTITION) if (use_vtoc) {
state->parts[slot].flags |= ADDPART_FLAG_RAID; if (be16_to_cpu(label->vtoc.infos[i].id) == LINUX_RAID_PARTITION)
if (label->infos[i].id == SUN_WHOLE_DISK) state->parts[slot].flags |= ADDPART_FLAG_RAID;
state->parts[slot].flags |= ADDPART_FLAG_WHOLEDISK; else if (be16_to_cpu(label->vtoc.infos[i].id) == SUN_WHOLE_DISK)
state->parts[slot].flags |= ADDPART_FLAG_WHOLEDISK;
}
} }
slot++; slot++;
} }
......
...@@ -3,5 +3,6 @@ ...@@ -3,5 +3,6 @@
*/ */
#define SUN_LABEL_MAGIC 0xDABE #define SUN_LABEL_MAGIC 0xDABE
#define SUN_VTOC_SANITY 0x600DDEEE
int sun_partition(struct parsed_partitions *state, struct block_device *bdev); int sun_partition(struct parsed_partitions *state, struct block_device *bdev);
...@@ -10,6 +10,10 @@ struct device_node; ...@@ -10,6 +10,10 @@ struct device_node;
struct of_device; struct of_device;
struct dev_archdata { struct dev_archdata {
void *iommu;
void *stc;
void *host_controller;
struct device_node *prom_node; struct device_node *prom_node;
struct of_device *op; struct of_device *op;
}; };
......
...@@ -101,6 +101,29 @@ static struct sun_floppy_ops sun_fdops; ...@@ -101,6 +101,29 @@ static struct sun_floppy_ops sun_fdops;
#define CROSS_64KB(a,s) (0) #define CROSS_64KB(a,s) (0)
/* Routines unique to each controller type on a Sun. */ /* Routines unique to each controller type on a Sun. */
static void sun_set_dor(unsigned char value, int fdc_82077)
{
if (sparc_cpu_model == sun4c) {
unsigned int bits = 0;
if (value & 0x10)
bits |= AUXIO_FLPY_DSEL;
if ((value & 0x80) == 0)
bits |= AUXIO_FLPY_EJCT;
set_auxio(bits, (~bits) & (AUXIO_FLPY_DSEL|AUXIO_FLPY_EJCT));
}
if (fdc_82077) {
sun_fdc->dor_82077 = value;
}
}
static unsigned char sun_read_dir(void)
{
if (sparc_cpu_model == sun4c)
return (get_auxio() & AUXIO_FLPY_DCHG) ? 0x80 : 0;
else
return sun_fdc->dir_82077;
}
static unsigned char sun_82072_fd_inb(int port) static unsigned char sun_82072_fd_inb(int port)
{ {
udelay(5); udelay(5);
...@@ -113,7 +136,7 @@ static unsigned char sun_82072_fd_inb(int port) ...@@ -113,7 +136,7 @@ static unsigned char sun_82072_fd_inb(int port)
case 5: /* FD_DATA */ case 5: /* FD_DATA */
return sun_fdc->data_82072; return sun_fdc->data_82072;
case 7: /* FD_DIR */ case 7: /* FD_DIR */
return (get_auxio() & AUXIO_FLPY_DCHG)? 0x80: 0; return sun_read_dir();
}; };
panic("sun_82072_fd_inb: How did I get here?"); panic("sun_82072_fd_inb: How did I get here?");
} }
...@@ -126,20 +149,7 @@ static void sun_82072_fd_outb(unsigned char value, int port) ...@@ -126,20 +149,7 @@ static void sun_82072_fd_outb(unsigned char value, int port)
printk("floppy: Asked to write to unknown port %d\n", port); printk("floppy: Asked to write to unknown port %d\n", port);
panic("floppy: Port bolixed."); panic("floppy: Port bolixed.");
case 2: /* FD_DOR */ case 2: /* FD_DOR */
/* Oh geese, 82072 on the Sun has no DOR register, sun_set_dor(value, 0);
* the functionality is implemented via the AUXIO
* I/O register. So we must emulate the behavior.
*
* ASSUMPTIONS: There will only ever be one floppy
* drive attached to a Sun controller
* and it will be at drive zero.
*/
{
unsigned bits = 0;
if (value & 0x10) bits |= AUXIO_FLPY_DSEL;
if ((value & 0x80) == 0) bits |= AUXIO_FLPY_EJCT;
set_auxio(bits, (~bits) & (AUXIO_FLPY_DSEL|AUXIO_FLPY_EJCT));
}
break; break;
case 5: /* FD_DATA */ case 5: /* FD_DATA */
sun_fdc->data_82072 = value; sun_fdc->data_82072 = value;
...@@ -161,15 +171,22 @@ static unsigned char sun_82077_fd_inb(int port) ...@@ -161,15 +171,22 @@ static unsigned char sun_82077_fd_inb(int port)
default: default:
printk("floppy: Asked to read unknown port %d\n", port); printk("floppy: Asked to read unknown port %d\n", port);
panic("floppy: Port bolixed."); panic("floppy: Port bolixed.");
case 0: /* FD_STATUS_0 */
return sun_fdc->status1_82077;
case 1: /* FD_STATUS_1 */
return sun_fdc->status2_82077;
case 2: /* FD_DOR */
return sun_fdc->dor_82077;
case 3: /* FD_TDR */
return sun_fdc->tapectl_82077;
case 4: /* FD_STATUS */ case 4: /* FD_STATUS */
return sun_fdc->status_82077 & ~STATUS_DMA; return sun_fdc->status_82077 & ~STATUS_DMA;
case 5: /* FD_DATA */ case 5: /* FD_DATA */
return sun_fdc->data_82077; return sun_fdc->data_82077;
case 7: /* FD_DIR */ case 7: /* FD_DIR */
/* XXX: Is DCL on 0x80 in sun4m? */ return sun_read_dir();
return sun_fdc->dir_82077;
}; };
panic("sun_82072_fd_inb: How did I get here?"); panic("sun_82077_fd_inb: How did I get here?");
} }
static void sun_82077_fd_outb(unsigned char value, int port) static void sun_82077_fd_outb(unsigned char value, int port)
...@@ -180,8 +197,7 @@ static void sun_82077_fd_outb(unsigned char value, int port) ...@@ -180,8 +197,7 @@ static void sun_82077_fd_outb(unsigned char value, int port)
printk("floppy: Asked to write to unknown port %d\n", port); printk("floppy: Asked to write to unknown port %d\n", port);
panic("floppy: Port bolixed."); panic("floppy: Port bolixed.");
case 2: /* FD_DOR */ case 2: /* FD_DOR */
/* Happily, the 82077 has a real DOR register. */ sun_set_dor(value, 1);
sun_fdc->dor_82077 = value;
break; break;
case 5: /* FD_DATA */ case 5: /* FD_DATA */
sun_fdc->data_82077 = value; sun_fdc->data_82077 = value;
...@@ -192,6 +208,9 @@ static void sun_82077_fd_outb(unsigned char value, int port) ...@@ -192,6 +208,9 @@ static void sun_82077_fd_outb(unsigned char value, int port)
case 4: /* FD_STATUS */ case 4: /* FD_STATUS */
sun_fdc->status_82077 = value; sun_fdc->status_82077 = value;
break; break;
case 3: /* FD_TDR */
sun_fdc->tapectl_82077 = value;
break;
}; };
return; return;
} }
...@@ -332,16 +351,17 @@ static int sun_floppy_init(void) ...@@ -332,16 +351,17 @@ static int sun_floppy_init(void)
goto no_sun_fdc; goto no_sun_fdc;
} }
if(sparc_cpu_model == sun4c) { sun_fdops.fd_inb = sun_82077_fd_inb;
sun_fdops.fd_inb = sun_82072_fd_inb; sun_fdops.fd_outb = sun_82077_fd_outb;
sun_fdops.fd_outb = sun_82072_fd_outb; fdc_status = &sun_fdc->status_82077;
fdc_status = &sun_fdc->status_82072;
/* printk("AUXIO @0x%lx\n", auxio_register); */ /* P3 */ if (sun_fdc->dor_82077 == 0x80) {
} else { sun_fdc->dor_82077 = 0x02;
sun_fdops.fd_inb = sun_82077_fd_inb; if (sun_fdc->dor_82077 == 0x80) {
sun_fdops.fd_outb = sun_82077_fd_outb; sun_fdops.fd_inb = sun_82072_fd_inb;
fdc_status = &sun_fdc->status_82077; sun_fdops.fd_outb = sun_82072_fd_outb;
/* printk("DOR @0x%p\n", &sun_fdc->dor_82077); */ /* P3 */ fdc_status = &sun_fdc->status_82072;
}
} }
/* Success... */ /* Success... */
......
This diff is collapsed.
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#define __LINUX_FBIO_H #define __LINUX_FBIO_H
#include <linux/compiler.h> #include <linux/compiler.h>
#include <linux/types.h>
/* Constants used for fbio SunOS compatibility */ /* Constants used for fbio SunOS compatibility */
/* (C) 1996 Miguel de Icaza */ /* (C) 1996 Miguel de Icaza */
...@@ -299,4 +300,31 @@ struct fb_clut32 { ...@@ -299,4 +300,31 @@ struct fb_clut32 {
#define LEO_LD_GBL_MAP 0x01009000 #define LEO_LD_GBL_MAP 0x01009000
#define LEO_UNK2_MAP 0x0100a000 #define LEO_UNK2_MAP 0x0100a000
#ifdef __KERNEL__
struct fbcmap32 {
int index; /* first element (0 origin) */
int count;
u32 red;
u32 green;
u32 blue;
};
#define FBIOPUTCMAP32 _IOW('F', 3, struct fbcmap32)
#define FBIOGETCMAP32 _IOW('F', 4, struct fbcmap32)
struct fbcursor32 {
short set; /* what to set, choose from the list above */
short enable; /* cursor on/off */
struct fbcurpos pos; /* cursor position */
struct fbcurpos hot; /* cursor hot spot */
struct fbcmap32 cmap; /* color map info */
struct fbcurpos size; /* cursor bit map size */
u32 image; /* cursor image bits */
u32 mask; /* cursor mask bits */
};
#define FBIOSCURSOR32 _IOW('F', 24, struct fbcursor32)
#define FBIOGCURSOR32 _IOW('F', 25, struct fbcursor32)
#endif
#endif /* __LINUX_FBIO_H */ #endif /* __LINUX_FBIO_H */
/* $Id: floppy.h,v 1.32 2001/10/26 17:59:36 davem Exp $ /* floppy.h: Sparc specific parts of the Floppy driver.
* asm-sparc64/floppy.h: Sparc specific parts of the Floppy driver.
* *
* Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) * Copyright (C) 1996, 2007 David S. Miller (davem@davemloft.net)
* Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
* *
* Ultra/PCI support added: Sep 1997 Eddie C. Dost (ecd@skynet.be) * Ultra/PCI support added: Sep 1997 Eddie C. Dost (ecd@skynet.be)
...@@ -11,6 +10,7 @@ ...@@ -11,6 +10,7 @@
#define __ASM_SPARC64_FLOPPY_H #define __ASM_SPARC64_FLOPPY_H
#include <linux/init.h> #include <linux/init.h>
#include <linux/pci.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
......
/* $Id: iommu.h,v 1.10 2001/03/08 09:55:56 davem Exp $ /* iommu.h: Definitions for the sun5 IOMMU.
* iommu.h: Definitions for the sun5 IOMMU.
* *
* Copyright (C) 1996, 1999 David S. Miller (davem@caip.rutgers.edu) * Copyright (C) 1996, 1999, 2007 David S. Miller (davem@davemloft.net)
*/ */
#ifndef _SPARC64_IOMMU_H #ifndef _SPARC64_IOMMU_H
#define _SPARC64_IOMMU_H #define _SPARC64_IOMMU_H
...@@ -33,6 +32,7 @@ struct iommu { ...@@ -33,6 +32,7 @@ struct iommu {
unsigned long iommu_tsbbase; unsigned long iommu_tsbbase;
unsigned long iommu_flush; unsigned long iommu_flush;
unsigned long iommu_flushinv; unsigned long iommu_flushinv;
unsigned long iommu_tags;
unsigned long iommu_ctxflush; unsigned long iommu_ctxflush;
unsigned long write_complete_reg; unsigned long write_complete_reg;
unsigned long dummy_page; unsigned long dummy_page;
...@@ -54,4 +54,7 @@ struct strbuf { ...@@ -54,4 +54,7 @@ struct strbuf {
volatile unsigned long __flushflag_buf[(64+(64-1)) / sizeof(long)]; volatile unsigned long __flushflag_buf[(64+(64-1)) / sizeof(long)];
}; };
#endif /* !(_SPARC_IOMMU_H) */ extern int iommu_table_init(struct iommu *iommu, int tsbsize,
u32 dma_offset, u32 dma_addr_mask);
#endif /* !(_SPARC64_IOMMU_H) */
...@@ -117,7 +117,7 @@ static int __devinit ecpp_probe(struct of_device *op, const struct of_device_id ...@@ -117,7 +117,7 @@ static int __devinit ecpp_probe(struct of_device *op, const struct of_device_id
if (!strcmp(parent->name, "dma")) { if (!strcmp(parent->name, "dma")) {
p = parport_pc_probe_port(base, base + 0x400, p = parport_pc_probe_port(base, base + 0x400,
op->irqs[0], PARPORT_DMA_NOFIFO, op->irqs[0], PARPORT_DMA_NOFIFO,
op->dev.parent); op->dev.parent->parent);
if (!p) if (!p)
return -ENOMEM; return -ENOMEM;
dev_set_drvdata(&op->dev, p); dev_set_drvdata(&op->dev, p);
......
This diff is collapsed.
This diff is collapsed.
...@@ -264,7 +264,7 @@ static inline void set_capacity(struct gendisk *disk, sector_t size) ...@@ -264,7 +264,7 @@ static inline void set_capacity(struct gendisk *disk, sector_t size)
#ifdef CONFIG_SOLARIS_X86_PARTITION #ifdef CONFIG_SOLARIS_X86_PARTITION
#define SOLARIS_X86_NUMSLICE 8 #define SOLARIS_X86_NUMSLICE 16
#define SOLARIS_X86_VTOC_SANE (0x600DDEEEUL) #define SOLARIS_X86_VTOC_SANE (0x600DDEEEUL)
struct solaris_x86_slice { struct solaris_x86_slice {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment