# SPDX-License-Identifier: GPL-2.0-only
menu "Bus options (PCI, PCMCIA, EISA, GSC, ISA)"

config GSC
	bool "VSC/GSC/HSC bus support"
	select HAVE_EISA
	default y
	help
	  The VSC, GSC and HSC busses were used from the earliest 700-series
	  workstations up to and including the C360/J2240 workstations.  They
	  were also used in servers from the E-class to the K-class.  They
	  are not found in B1000, C3000, J5000, A500, L1000, N4000 and upwards.
	  If in doubt, say "Y".

config HPPB
	bool "HP-PB bus support"
	depends on GSC
	help
	  The HP-PB bus was used in the Nova class and K-class servers.
	  If in doubt, say "Y"

config IOMMU_CCIO
	bool "U2/Uturn I/O MMU"
	depends on GSC
	help
	  Say Y here to enable DMA management routines for the first
	  generation of PA-RISC cache-coherent machines.  Programs the
	  U2/Uturn chip in "Virtual Mode" and use the I/O MMU.

config GSC_LASI
	bool "Lasi I/O support"
	depends on GSC
	help
	  Say Y here to support the Lasi multifunction chip found in
	  many PA-RISC workstations & servers.	It includes interfaces
	  for a parallel port, serial port, NCR 53c710 SCSI, Apricot
	  Ethernet, Harmony audio, PS/2 keyboard & mouse, ISDN, telephony
	  and floppy.  Note that you must still enable all the individual
	  drivers for these chips.

config GSC_WAX
	bool "Wax I/O support"
	depends on GSC
	help
	  Say Y here to support the Wax multifunction chip found in some
	  older systems, including B/C/D/R class and 715/64, 715/80 and
	  715/100.  Wax includes an EISA adapter, a serial port (not always
	  used), a HIL interface chip and is also known to be used as the
	  GSC bridge for an X.25 GSC card.

config ISA
	bool "ISA support"
	depends on EISA
	help
	  If you want to plug an ISA card into your EISA bus, say Y here.
	  Most people should say N.

config GSC_DINO
	bool "GSCtoPCI/Dino PCI support"
	depends on PCI && GSC
	help
	  Say Y here to support the Dino & Cujo GSC to PCI bridges found in
	  machines from the B132 to the C360, the J2240 and the A180.  Some
	  GSC/HSC cards (eg gigabit & dual 100 Mbit Ethernet) have a Dino on
	  the card, and you also need to say Y here if you have such a card.
	  Note that Dino also supplies one of the serial ports on certain
	  machines.  If in doubt, say Y.

config PCI_LBA
	bool "LBA/Elroy PCI support"
	depends on PCI
	help
	  Say Y here to support the Elroy PCI Lower Bus Adapter.  This is
	  present on B, C, J, L and N-class machines with 4-digit model
	  numbers and the A400/A500.

config IOSAPIC
	bool
	depends on PCI_LBA
	default PCI_LBA

config IOMMU_SBA
	bool
	depends on PCI_LBA
	default PCI_LBA

endmenu

menu "PA-RISC specific drivers"

config SUPERIO
	bool "SuperIO (SuckyIO) support"
	depends on PCI_LBA
	default y
	help
	  Say Y here to support the SuperIO chip found in Bxxxx, C3xxx and
	  J5xxx+ machines. This enables IDE, Floppy, Parallel Port, and
	  Serial port on those machines.

config CHASSIS_LCD_LED
	bool "Chassis LCD and LED support"
	default y
	select VM_EVENT_COUNTERS
	help
	  Say Y here if you want to enable support for the Heartbeat,
	  Disk/Network activities LEDs on some PA-RISC machines,
	  or support for the LCD that can be found on recent material.
	
	  This has nothing to do with LED State support for A and E class.
	
	  If unsure, say Y.

config PDC_CHASSIS
	bool "PDC chassis state codes support"
	default y
	help
	  Say Y here if you want to enable support for Chassis codes.
	  That includes support for LED State front panel as found on E
	  class, and support for the GSP Virtual Front Panel (LED State and
	  message logging)  as found on high end servers such as A, L and
	  N-class.
	  This driver will also display progress messages on LCD display,
	  such as "INI", "RUN" and "FLT", and might thus clobber messages
	  shown by the LED/LCD driver.
	  This driver updates the state panel (LED and/or LCD) upon system
	  state change (eg: boot, shutdown or panic).
	  
	  If unsure, say Y.


config PDC_CHASSIS_WARN
	bool "PDC chassis warnings support"
	depends on PROC_FS
	default y
	help
	  Say Y here if you want to enable support for Chassis warnings.
	  This will add a proc entry '/proc/chassis' giving some information
	  about the overall health state of the system.
	  This includes NVRAM battery level, overtemp or failures such as
	  fans or power units.

	  If unsure, say Y.


config PDC_STABLE
	tristate "PDC Stable Storage support"
	depends on SYSFS
	default y
	help
	  Say Y here if you want to enable support for accessing Stable Storage
	  variables (PDC non volatile variables such as Primary Boot Path,
	  Console Path, Autoboot, Autosearch, etc) through SysFS.
	
	  If unsure, say Y.
	
	  To compile this driver as a module, choose M here.
	  The module will be called pdc_stable.

endmenu
