diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-13 14:20:19 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-13 14:20:19 -0800 | 
| commit | c7708fac5a878d6e0f2de0aa19f9749cff4f707f (patch) | |
| tree | 21a59cbe503ca526697f7d0bce5e0e30980bcbc0 /drivers/s390/char/sclp_cmd.c | |
| parent | 3127f23f013eabe9b58132c05061684c49146ba3 (diff) | |
| parent | 6726a807c38d7fd09bc23a0adc738efec6ff9492 (diff) | |
| download | olio-linux-3.10-c7708fac5a878d6e0f2de0aa19f9749cff4f707f.tar.xz olio-linux-3.10-c7708fac5a878d6e0f2de0aa19f9749cff4f707f.zip  | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull s390 update from Martin Schwidefsky:
 "Add support to generate code for the latest machine zEC12, MOD and XOR
  instruction support for the BPF jit compiler, the dasd safe offline
  feature and the big one: the s390 architecture gets PCI support!!
  Right before the world ends on the 21st ;-)"
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: (41 commits)
  s390/qdio: rename the misleading PCI flag of qdio devices
  s390/pci: remove obsolete email addresses
  s390/pci: speed up __iowrite64_copy by using pci store block insn
  s390/pci: enable NEED_DMA_MAP_STATE
  s390/pci: no msleep in potential IRQ context
  s390/pci: fix potential NULL pointer dereference in dma_free_seg_table()
  s390/pci: use kmem_cache_zalloc instead of kmem_cache_alloc/memset
  s390/bpf,jit: add support for XOR instruction
  s390/bpf,jit: add support MOD instruction
  s390/cio: fix pgid reserved check
  vga: compile fix, disable vga for s390
  s390/pci: add PCI Kconfig options
  s390/pci: s390 specific PCI sysfs attributes
  s390/pci: PCI hotplug support via SCLP
  s390/pci: CHSC PCI support for error and availability events
  s390/pci: DMA support
  s390/pci: PCI adapter interrupts for MSI/MSI-X
  s390/bitops: find leftmost bit instruction support
  s390/pci: CLP interface
  s390/pci: base support
  ...
Diffstat (limited to 'drivers/s390/char/sclp_cmd.c')
| -rw-r--r-- | drivers/s390/char/sclp_cmd.c | 81 | 
1 files changed, 71 insertions, 10 deletions
diff --git a/drivers/s390/char/sclp_cmd.c b/drivers/s390/char/sclp_cmd.c index 71ea923c322..c44d13f607b 100644 --- a/drivers/s390/char/sclp_cmd.c +++ b/drivers/s390/char/sclp_cmd.c @@ -1,5 +1,5 @@  /* - * Copyright IBM Corp. 2007, 2009 + * Copyright IBM Corp. 2007,2012   *   * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>,   *	      Peter Oberparleiter <peter.oberparleiter@de.ibm.com> @@ -12,6 +12,7 @@  #include <linux/init.h>  #include <linux/errno.h>  #include <linux/err.h> +#include <linux/export.h>  #include <linux/slab.h>  #include <linux/string.h>  #include <linux/mm.h> @@ -19,10 +20,11 @@  #include <linux/memory.h>  #include <linux/module.h>  #include <linux/platform_device.h> +#include <asm/ctl_reg.h>  #include <asm/chpid.h> -#include <asm/sclp.h>  #include <asm/setup.h> -#include <asm/ctl_reg.h> +#include <asm/page.h> +#include <asm/sclp.h>  #include "sclp.h" @@ -400,17 +402,15 @@ out:  static int sclp_assign_storage(u16 rn)  { -	unsigned long long start, address; +	unsigned long long start;  	int rc;  	rc = do_assign_storage(0x000d0001, rn);  	if (rc) -		goto out; -	start = address = rn2addr(rn); -	for (; address < start + rzm; address += PAGE_SIZE) -		page_set_storage_key(address, PAGE_DEFAULT_KEY, 0); -out: -	return rc; +		return rc; +	start = rn2addr(rn); +	storage_key_init_range(start, start + rzm); +	return 0;  }  static int sclp_unassign_storage(u16 rn) @@ -702,6 +702,67 @@ __initcall(sclp_detect_standby_memory);  #endif /* CONFIG_MEMORY_HOTPLUG */  /* + * PCI I/O adapter configuration related functions. + */ +#define SCLP_CMDW_CONFIGURE_PCI			0x001a0001 +#define SCLP_CMDW_DECONFIGURE_PCI		0x001b0001 + +#define SCLP_RECONFIG_PCI_ATPYE			2 + +struct pci_cfg_sccb { +	struct sccb_header header; +	u8 atype;		/* adapter type */ +	u8 reserved1; +	u16 reserved2; +	u32 aid;		/* adapter identifier */ +} __packed; + +static int do_pci_configure(sclp_cmdw_t cmd, u32 fid) +{ +	struct pci_cfg_sccb *sccb; +	int rc; + +	if (!SCLP_HAS_PCI_RECONFIG) +		return -EOPNOTSUPP; + +	sccb = (struct pci_cfg_sccb *) get_zeroed_page(GFP_KERNEL | GFP_DMA); +	if (!sccb) +		return -ENOMEM; + +	sccb->header.length = PAGE_SIZE; +	sccb->atype = SCLP_RECONFIG_PCI_ATPYE; +	sccb->aid = fid; +	rc = do_sync_request(cmd, sccb); +	if (rc) +		goto out; +	switch (sccb->header.response_code) { +	case 0x0020: +	case 0x0120: +		break; +	default: +		pr_warn("configure PCI I/O adapter failed: cmd=0x%08x  response=0x%04x\n", +			cmd, sccb->header.response_code); +		rc = -EIO; +		break; +	} +out: +	free_page((unsigned long) sccb); +	return rc; +} + +int sclp_pci_configure(u32 fid) +{ +	return do_pci_configure(SCLP_CMDW_CONFIGURE_PCI, fid); +} +EXPORT_SYMBOL(sclp_pci_configure); + +int sclp_pci_deconfigure(u32 fid) +{ +	return do_pci_configure(SCLP_CMDW_DECONFIGURE_PCI, fid); +} +EXPORT_SYMBOL(sclp_pci_deconfigure); + +/*   * Channel path configuration related functions.   */  |