mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
Merge branch 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6
* 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6: [S390] Update default configuration. [S390] use generic sys_ptrace [S390] Remove self ptrace IEEE_IP hack. [S390] Convert to SPARSEMEM & SPARSEMEM_VMEMMAP [S390] System z large page support. [S390] Convert machine feature detection code to C. [S390] vmemmap: use clear_table to initialise page tables. [S390] Move stfl to system.h and delete duplicated version. [S390] uaccess_mvcos: #ifdef config dependent code. [S390] cpu topology: Fix possible deadlock. [S390] Add topology_core_siblings to topology.h [S390] cio: Make isc handling more robust. [S390] remove -traditional [S390] Automatically detect added cpus. [S390] smp: Fix locking order. [S390] Add missing ifndef/define to include/asm-s390/sysinfo.h. [S390] Move show_regs to traps.c. [S390] cio: Use strict_strtoul() for attributes.
This commit is contained in:
commit
d67c6f869c
46 changed files with 892 additions and 501 deletions
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/cpu.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <asm/smp.h>
|
||||
#include "sclp.h"
|
||||
|
||||
#define TAG "sclp_config: "
|
||||
|
|
@ -19,9 +20,11 @@ struct conf_mgm_data {
|
|||
u8 ev_qualifier;
|
||||
} __attribute__((packed));
|
||||
|
||||
#define EV_QUAL_CPU_CHANGE 1
|
||||
#define EV_QUAL_CAP_CHANGE 3
|
||||
|
||||
static struct work_struct sclp_cpu_capability_work;
|
||||
static struct work_struct sclp_cpu_change_work;
|
||||
|
||||
static void sclp_cpu_capability_notify(struct work_struct *work)
|
||||
{
|
||||
|
|
@ -37,13 +40,24 @@ static void sclp_cpu_capability_notify(struct work_struct *work)
|
|||
put_online_cpus();
|
||||
}
|
||||
|
||||
static void sclp_cpu_change_notify(struct work_struct *work)
|
||||
{
|
||||
smp_rescan_cpus();
|
||||
}
|
||||
|
||||
static void sclp_conf_receiver_fn(struct evbuf_header *evbuf)
|
||||
{
|
||||
struct conf_mgm_data *cdata;
|
||||
|
||||
cdata = (struct conf_mgm_data *)(evbuf + 1);
|
||||
if (cdata->ev_qualifier == EV_QUAL_CAP_CHANGE)
|
||||
switch (cdata->ev_qualifier) {
|
||||
case EV_QUAL_CPU_CHANGE:
|
||||
schedule_work(&sclp_cpu_change_work);
|
||||
break;
|
||||
case EV_QUAL_CAP_CHANGE:
|
||||
schedule_work(&sclp_cpu_capability_work);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static struct sclp_register sclp_conf_register =
|
||||
|
|
@ -57,6 +71,7 @@ static int __init sclp_conf_init(void)
|
|||
int rc;
|
||||
|
||||
INIT_WORK(&sclp_cpu_capability_work, sclp_cpu_capability_notify);
|
||||
INIT_WORK(&sclp_cpu_change_work, sclp_cpu_change_notify);
|
||||
|
||||
rc = sclp_register(&sclp_conf_register);
|
||||
if (rc) {
|
||||
|
|
|
|||
|
|
@ -318,7 +318,7 @@ ccwgroup_online_store (struct device *dev, struct device_attribute *attr, const
|
|||
{
|
||||
struct ccwgroup_device *gdev;
|
||||
struct ccwgroup_driver *gdrv;
|
||||
unsigned int value;
|
||||
unsigned long value;
|
||||
int ret;
|
||||
|
||||
gdev = to_ccwgroupdev(dev);
|
||||
|
|
@ -329,7 +329,9 @@ ccwgroup_online_store (struct device *dev, struct device_attribute *attr, const
|
|||
if (!try_module_get(gdrv->owner))
|
||||
return -EINVAL;
|
||||
|
||||
value = simple_strtoul(buf, NULL, 0);
|
||||
ret = strict_strtoul(buf, 0, &value);
|
||||
if (ret)
|
||||
goto out;
|
||||
ret = count;
|
||||
if (value == 1)
|
||||
ccwgroup_set_online(gdev);
|
||||
|
|
@ -337,6 +339,7 @@ ccwgroup_online_store (struct device *dev, struct device_attribute *attr, const
|
|||
ccwgroup_set_offline(gdev);
|
||||
else
|
||||
ret = -EINVAL;
|
||||
out:
|
||||
module_put(gdrv->owner);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -407,8 +407,7 @@ cio_modify (struct subchannel *sch)
|
|||
/*
|
||||
* Enable subchannel.
|
||||
*/
|
||||
int cio_enable_subchannel(struct subchannel *sch, unsigned int isc,
|
||||
u32 intparm)
|
||||
int cio_enable_subchannel(struct subchannel *sch, u32 intparm)
|
||||
{
|
||||
char dbf_txt[15];
|
||||
int ccode;
|
||||
|
|
@ -426,7 +425,7 @@ int cio_enable_subchannel(struct subchannel *sch, unsigned int isc,
|
|||
|
||||
for (retry = 5, ret = 0; retry > 0; retry--) {
|
||||
sch->schib.pmcw.ena = 1;
|
||||
sch->schib.pmcw.isc = isc;
|
||||
sch->schib.pmcw.isc = sch->isc;
|
||||
sch->schib.pmcw.intparm = intparm;
|
||||
ret = cio_modify(sch);
|
||||
if (ret == -ENODEV)
|
||||
|
|
@ -600,6 +599,7 @@ cio_validate_subchannel (struct subchannel *sch, struct subchannel_id schid)
|
|||
else
|
||||
sch->opm = chp_get_sch_opm(sch);
|
||||
sch->lpm = sch->schib.pmcw.pam & sch->opm;
|
||||
sch->isc = 3;
|
||||
|
||||
CIO_DEBUG(KERN_INFO, 0,
|
||||
"Detected device %04x on subchannel 0.%x.%04X"
|
||||
|
|
@ -610,13 +610,11 @@ cio_validate_subchannel (struct subchannel *sch, struct subchannel_id schid)
|
|||
|
||||
/*
|
||||
* We now have to initially ...
|
||||
* ... set "interruption subclass"
|
||||
* ... enable "concurrent sense"
|
||||
* ... enable "multipath mode" if more than one
|
||||
* CHPID is available. This is done regardless
|
||||
* whether multiple paths are available for us.
|
||||
*/
|
||||
sch->schib.pmcw.isc = 3; /* could be smth. else */
|
||||
sch->schib.pmcw.csense = 1; /* concurrent sense */
|
||||
sch->schib.pmcw.ena = 0;
|
||||
if ((sch->lpm & (sch->lpm - 1)) != 0)
|
||||
|
|
@ -812,6 +810,7 @@ cio_probe_console(void)
|
|||
* enable console I/O-interrupt subclass 7
|
||||
*/
|
||||
ctl_set_bit(6, 24);
|
||||
console_subchannel.isc = 7;
|
||||
console_subchannel.schib.pmcw.isc = 7;
|
||||
console_subchannel.schib.pmcw.intparm =
|
||||
(u32)(addr_t)&console_subchannel;
|
||||
|
|
|
|||
|
|
@ -74,6 +74,7 @@ struct subchannel {
|
|||
__u8 lpm; /* logical path mask */
|
||||
__u8 opm; /* operational path mask */
|
||||
struct schib schib; /* subchannel information block */
|
||||
int isc; /* desired interruption subclass */
|
||||
struct chsc_ssd_info ssd_info; /* subchannel description */
|
||||
struct device dev; /* entry in device tree */
|
||||
struct css_driver *driver;
|
||||
|
|
@ -85,7 +86,7 @@ struct subchannel {
|
|||
#define to_subchannel(n) container_of(n, struct subchannel, dev)
|
||||
|
||||
extern int cio_validate_subchannel (struct subchannel *, struct subchannel_id);
|
||||
extern int cio_enable_subchannel(struct subchannel *, unsigned int, u32);
|
||||
extern int cio_enable_subchannel(struct subchannel *, u32);
|
||||
extern int cio_disable_subchannel (struct subchannel *);
|
||||
extern int cio_cancel (struct subchannel *);
|
||||
extern int cio_clear (struct subchannel *);
|
||||
|
|
|
|||
|
|
@ -1219,16 +1219,21 @@ static ssize_t cmb_enable_store(struct device *dev,
|
|||
{
|
||||
struct ccw_device *cdev;
|
||||
int ret;
|
||||
unsigned long val;
|
||||
|
||||
ret = strict_strtoul(buf, 16, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
cdev = to_ccwdev(dev);
|
||||
|
||||
switch (buf[0]) {
|
||||
case '0':
|
||||
switch (val) {
|
||||
case 0:
|
||||
ret = disable_cmf(cdev);
|
||||
if (ret)
|
||||
dev_info(&cdev->dev, "disable_cmf failed (%d)\n", ret);
|
||||
break;
|
||||
case '1':
|
||||
case 1:
|
||||
ret = enable_cmf(cdev);
|
||||
if (ret && ret != -EBUSY)
|
||||
dev_info(&cdev->dev, "enable_cmf failed (%d)\n", ret);
|
||||
|
|
|
|||
|
|
@ -705,13 +705,17 @@ css_cm_enable_store(struct device *dev, struct device_attribute *attr,
|
|||
{
|
||||
struct channel_subsystem *css = to_css(dev);
|
||||
int ret;
|
||||
unsigned long val;
|
||||
|
||||
ret = strict_strtoul(buf, 16, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
mutex_lock(&css->mutex);
|
||||
switch (buf[0]) {
|
||||
case '0':
|
||||
switch (val) {
|
||||
case 0:
|
||||
ret = css->cm_enabled ? chsc_secm(css, 0) : 0;
|
||||
break;
|
||||
case '1':
|
||||
case 1:
|
||||
ret = css->cm_enabled ? 0 : chsc_secm(css, 1);
|
||||
break;
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -512,8 +512,8 @@ static ssize_t online_store (struct device *dev, struct device_attribute *attr,
|
|||
const char *buf, size_t count)
|
||||
{
|
||||
struct ccw_device *cdev = to_ccwdev(dev);
|
||||
int i, force;
|
||||
char *tmp;
|
||||
int force, ret;
|
||||
unsigned long i;
|
||||
|
||||
if (atomic_cmpxchg(&cdev->private->onoff, 0, 1) != 0)
|
||||
return -EAGAIN;
|
||||
|
|
@ -525,25 +525,30 @@ static ssize_t online_store (struct device *dev, struct device_attribute *attr,
|
|||
if (!strncmp(buf, "force\n", count)) {
|
||||
force = 1;
|
||||
i = 1;
|
||||
ret = 0;
|
||||
} else {
|
||||
force = 0;
|
||||
i = simple_strtoul(buf, &tmp, 16);
|
||||
ret = strict_strtoul(buf, 16, &i);
|
||||
}
|
||||
|
||||
if (ret)
|
||||
goto out;
|
||||
switch (i) {
|
||||
case 0:
|
||||
online_store_handle_offline(cdev);
|
||||
ret = count;
|
||||
break;
|
||||
case 1:
|
||||
online_store_handle_online(cdev, force);
|
||||
ret = count;
|
||||
break;
|
||||
default:
|
||||
count = -EINVAL;
|
||||
ret = -EINVAL;
|
||||
}
|
||||
out:
|
||||
if (cdev->drv)
|
||||
module_put(cdev->drv->owner);
|
||||
atomic_set(&cdev->private->onoff, 0);
|
||||
return count;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
|
|
|
|||
|
|
@ -555,8 +555,7 @@ ccw_device_recognition(struct ccw_device *cdev)
|
|||
(cdev->private->state != DEV_STATE_BOXED))
|
||||
return -EINVAL;
|
||||
sch = to_subchannel(cdev->dev.parent);
|
||||
ret = cio_enable_subchannel(sch, sch->schib.pmcw.isc,
|
||||
(u32)(addr_t)sch);
|
||||
ret = cio_enable_subchannel(sch, (u32)(addr_t)sch);
|
||||
if (ret != 0)
|
||||
/* Couldn't enable the subchannel for i/o. Sick device. */
|
||||
return ret;
|
||||
|
|
@ -667,8 +666,7 @@ ccw_device_online(struct ccw_device *cdev)
|
|||
sch = to_subchannel(cdev->dev.parent);
|
||||
if (css_init_done && !get_device(&cdev->dev))
|
||||
return -ENODEV;
|
||||
ret = cio_enable_subchannel(sch, sch->schib.pmcw.isc,
|
||||
(u32)(addr_t)sch);
|
||||
ret = cio_enable_subchannel(sch, (u32)(addr_t)sch);
|
||||
if (ret != 0) {
|
||||
/* Couldn't enable the subchannel for i/o. Sick device. */
|
||||
if (ret == -ENODEV)
|
||||
|
|
@ -1048,8 +1046,7 @@ ccw_device_start_id(struct ccw_device *cdev, enum dev_event dev_event)
|
|||
struct subchannel *sch;
|
||||
|
||||
sch = to_subchannel(cdev->dev.parent);
|
||||
if (cio_enable_subchannel(sch, sch->schib.pmcw.isc,
|
||||
(u32)(addr_t)sch) != 0)
|
||||
if (cio_enable_subchannel(sch, (u32)(addr_t)sch) != 0)
|
||||
/* Couldn't enable the subchannel for i/o. Sick device. */
|
||||
return;
|
||||
|
||||
|
|
@ -1082,7 +1079,6 @@ device_trigger_reprobe(struct subchannel *sch)
|
|||
*/
|
||||
sch->lpm = sch->schib.pmcw.pam & sch->opm;
|
||||
/* Re-set some bits in the pmcw that were lost. */
|
||||
sch->schib.pmcw.isc = 3;
|
||||
sch->schib.pmcw.csense = 1;
|
||||
sch->schib.pmcw.ena = 0;
|
||||
if ((sch->lpm & (sch->lpm - 1)) != 0)
|
||||
|
|
|
|||
|
|
@ -508,7 +508,7 @@ ccw_device_stlck(struct ccw_device *cdev)
|
|||
return -ENOMEM;
|
||||
}
|
||||
spin_lock_irqsave(sch->lock, flags);
|
||||
ret = cio_enable_subchannel(sch, 3, (u32)(addr_t)sch);
|
||||
ret = cio_enable_subchannel(sch, (u32)(addr_t)sch);
|
||||
if (ret)
|
||||
goto out_unlock;
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -3663,11 +3663,11 @@ qdio_performance_stats_show(struct bus_type *bus, char *buf)
|
|||
static ssize_t
|
||||
qdio_performance_stats_store(struct bus_type *bus, const char *buf, size_t count)
|
||||
{
|
||||
char *tmp;
|
||||
int i;
|
||||
unsigned long i;
|
||||
int ret;
|
||||
|
||||
i = simple_strtoul(buf, &tmp, 16);
|
||||
if ((i == 0) || (i == 1)) {
|
||||
ret = strict_strtoul(buf, 16, &i);
|
||||
if (!ret && ((i == 0) || (i == 1))) {
|
||||
if (i == qdio_performance_stats)
|
||||
return count;
|
||||
qdio_performance_stats = i;
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
#include <linux/virtio_config.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/virtio_ring.h>
|
||||
#include <linux/pfn.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/kvm_para.h>
|
||||
#include <asm/kvm_virtio.h>
|
||||
|
|
@ -180,11 +181,10 @@ static struct virtqueue *kvm_find_vq(struct virtio_device *vdev,
|
|||
|
||||
config = kvm_vq_config(kdev->desc)+index;
|
||||
|
||||
if (add_shared_memory(config->address,
|
||||
vring_size(config->num, PAGE_SIZE))) {
|
||||
err = -ENOMEM;
|
||||
err = vmem_add_mapping(config->address,
|
||||
vring_size(config->num, PAGE_SIZE));
|
||||
if (err)
|
||||
goto out;
|
||||
}
|
||||
|
||||
vq = vring_new_virtqueue(config->num, vdev, (void *) config->address,
|
||||
kvm_notify, callback);
|
||||
|
|
@ -202,8 +202,8 @@ static struct virtqueue *kvm_find_vq(struct virtio_device *vdev,
|
|||
vq->priv = config;
|
||||
return vq;
|
||||
unmap:
|
||||
remove_shared_memory(config->address, vring_size(config->num,
|
||||
PAGE_SIZE));
|
||||
vmem_remove_mapping(config->address,
|
||||
vring_size(config->num, PAGE_SIZE));
|
||||
out:
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
|
@ -213,8 +213,8 @@ static void kvm_del_vq(struct virtqueue *vq)
|
|||
struct kvm_vqconfig *config = vq->priv;
|
||||
|
||||
vring_del_virtqueue(vq);
|
||||
remove_shared_memory(config->address,
|
||||
vring_size(config->num, PAGE_SIZE));
|
||||
vmem_remove_mapping(config->address,
|
||||
vring_size(config->num, PAGE_SIZE));
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -318,12 +318,13 @@ static int __init kvm_devices_init(void)
|
|||
return rc;
|
||||
}
|
||||
|
||||
if (add_shared_memory((max_pfn) << PAGE_SHIFT, PAGE_SIZE)) {
|
||||
rc = vmem_add_mapping(PFN_PHYS(max_pfn), PAGE_SIZE);
|
||||
if (rc) {
|
||||
device_unregister(&kvm_root);
|
||||
return -ENOMEM;
|
||||
return rc;
|
||||
}
|
||||
|
||||
kvm_devices = (void *) (max_pfn << PAGE_SHIFT);
|
||||
kvm_devices = (void *) PFN_PHYS(max_pfn);
|
||||
|
||||
ctl_set_bit(0, 9);
|
||||
register_external_interrupt(0x2603, kvm_extint_handler);
|
||||
|
|
|
|||
Loading…
Reference in a new issue