mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull s390 fixes from Martin Schwidefsky: "Assorted bug fixes, the mlock2 system call gets added, and one improvement. The boot from dasd devices is now possible from a wider range of devices" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: s390: remove SALIPL loader s390: wire up mlock2 system call s390: remove g5 elf platform support s390: avoid cache aliasing under z/VM and KVM s390/sclp: _sclp_wait_int(): retain full PSW mask s390/zcrypt: Fix initialisation when zcrypt is built-in s390/zcrypt: Fix kernel crash on systems without AP bus support s390: add support for ipl devices in subchannel sets > 0 s390/ipl: fix out of bounds access in scpdata_write s390/pci_dma: improve debugging of errors during dma map s390/pci_dma: handle dma table failures s390/pci_dma: unify label of invalid translation table entries s390/syscalls: remove system call number calculation s390/cio: simplify css_generate_pgid s390/diag: add a s390 prefix to the diagnose trace point s390/head: fix error message on unsupported hardware
This commit is contained in:
commit
34258a32d9
29 changed files with 247 additions and 278 deletions
|
|
@ -1080,28 +1080,10 @@ void __init chsc_init_cleanup(void)
|
|||
free_page((unsigned long)sei_page);
|
||||
}
|
||||
|
||||
int chsc_enable_facility(int operation_code)
|
||||
int __chsc_enable_facility(struct chsc_sda_area *sda_area, int operation_code)
|
||||
{
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
struct {
|
||||
struct chsc_header request;
|
||||
u8 reserved1:4;
|
||||
u8 format:4;
|
||||
u8 reserved2;
|
||||
u16 operation_code;
|
||||
u32 reserved3;
|
||||
u32 reserved4;
|
||||
u32 operation_data_area[252];
|
||||
struct chsc_header response;
|
||||
u32 reserved5:4;
|
||||
u32 format2:4;
|
||||
u32 reserved6:24;
|
||||
} __attribute__ ((packed)) *sda_area;
|
||||
|
||||
spin_lock_irqsave(&chsc_page_lock, flags);
|
||||
memset(chsc_page, 0, PAGE_SIZE);
|
||||
sda_area = chsc_page;
|
||||
sda_area->request.length = 0x0400;
|
||||
sda_area->request.code = 0x0031;
|
||||
sda_area->operation_code = operation_code;
|
||||
|
|
@ -1119,10 +1101,25 @@ int chsc_enable_facility(int operation_code)
|
|||
default:
|
||||
ret = chsc_error_from_response(sda_area->response.code);
|
||||
}
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int chsc_enable_facility(int operation_code)
|
||||
{
|
||||
struct chsc_sda_area *sda_area;
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
spin_lock_irqsave(&chsc_page_lock, flags);
|
||||
memset(chsc_page, 0, PAGE_SIZE);
|
||||
sda_area = chsc_page;
|
||||
|
||||
ret = __chsc_enable_facility(sda_area, operation_code);
|
||||
if (ret != 0)
|
||||
CIO_CRW_EVENT(2, "chsc: sda (oc=%x) failed (rc=%04x)\n",
|
||||
operation_code, sda_area->response.code);
|
||||
out:
|
||||
|
||||
spin_unlock_irqrestore(&chsc_page_lock, flags);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -115,6 +115,20 @@ struct chsc_scpd {
|
|||
u8 data[PAGE_SIZE - 20];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct chsc_sda_area {
|
||||
struct chsc_header request;
|
||||
u8 :4;
|
||||
u8 format:4;
|
||||
u8 :8;
|
||||
u16 operation_code;
|
||||
u32 :32;
|
||||
u32 :32;
|
||||
u32 operation_data_area[252];
|
||||
struct chsc_header response;
|
||||
u32 :4;
|
||||
u32 format2:4;
|
||||
u32 :24;
|
||||
} __packed __aligned(PAGE_SIZE);
|
||||
|
||||
extern int chsc_get_ssd_info(struct subchannel_id schid,
|
||||
struct chsc_ssd_info *ssd);
|
||||
|
|
@ -122,6 +136,7 @@ extern int chsc_determine_css_characteristics(void);
|
|||
extern int chsc_init(void);
|
||||
extern void chsc_init_cleanup(void);
|
||||
|
||||
int __chsc_enable_facility(struct chsc_sda_area *sda_area, int operation_code);
|
||||
extern int chsc_enable_facility(int);
|
||||
struct channel_subsystem;
|
||||
extern int chsc_secm(struct channel_subsystem *, int);
|
||||
|
|
|
|||
|
|
@ -925,18 +925,32 @@ void reipl_ccw_dev(struct ccw_dev_id *devid)
|
|||
|
||||
int __init cio_get_iplinfo(struct cio_iplinfo *iplinfo)
|
||||
{
|
||||
static struct chsc_sda_area sda_area __initdata;
|
||||
struct subchannel_id schid;
|
||||
struct schib schib;
|
||||
|
||||
schid = *(struct subchannel_id *)&S390_lowcore.subchannel_id;
|
||||
if (!schid.one)
|
||||
return -ENODEV;
|
||||
|
||||
if (schid.ssid) {
|
||||
/*
|
||||
* Firmware should have already enabled MSS but whoever started
|
||||
* the kernel might have initiated a channel subsystem reset.
|
||||
* Ensure that MSS is enabled.
|
||||
*/
|
||||
memset(&sda_area, 0, sizeof(sda_area));
|
||||
if (__chsc_enable_facility(&sda_area, CHSC_SDA_OC_MSS))
|
||||
return -ENODEV;
|
||||
}
|
||||
if (stsch_err(schid, &schib))
|
||||
return -ENODEV;
|
||||
if (schib.pmcw.st != SUBCHANNEL_TYPE_IO)
|
||||
return -ENODEV;
|
||||
if (!schib.pmcw.dnv)
|
||||
return -ENODEV;
|
||||
|
||||
iplinfo->ssid = schid.ssid;
|
||||
iplinfo->devno = schib.pmcw.dev;
|
||||
iplinfo->is_qdio = schib.pmcw.qf;
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -702,17 +702,12 @@ css_generate_pgid(struct channel_subsystem *css, u32 tod_high)
|
|||
css->global_pgid.pgid_high.ext_cssid.version = 0x80;
|
||||
css->global_pgid.pgid_high.ext_cssid.cssid = css->cssid;
|
||||
} else {
|
||||
#ifdef CONFIG_SMP
|
||||
css->global_pgid.pgid_high.cpu_addr = stap();
|
||||
#else
|
||||
css->global_pgid.pgid_high.cpu_addr = 0;
|
||||
#endif
|
||||
}
|
||||
get_cpu_id(&cpu_id);
|
||||
css->global_pgid.cpu_id = cpu_id.ident;
|
||||
css->global_pgid.cpu_model = cpu_id.machine;
|
||||
css->global_pgid.tod_high = tod_high;
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -3,6 +3,9 @@
|
|||
#
|
||||
|
||||
ap-objs := ap_bus.o
|
||||
obj-$(CONFIG_ZCRYPT) += ap.o zcrypt_api.o zcrypt_pcixcc.o
|
||||
obj-$(CONFIG_ZCRYPT) += zcrypt_cex2a.o zcrypt_cex4.o
|
||||
# zcrypt_api depends on ap
|
||||
obj-$(CONFIG_ZCRYPT) += ap.o zcrypt_api.o
|
||||
# msgtype* depend on zcrypt_api
|
||||
obj-$(CONFIG_ZCRYPT) += zcrypt_msgtype6.o zcrypt_msgtype50.o
|
||||
# adapter drivers depend on ap, zcrypt_api and msgtype*
|
||||
obj-$(CONFIG_ZCRYPT) += zcrypt_pcixcc.o zcrypt_cex2a.o zcrypt_cex4.o
|
||||
|
|
|
|||
|
|
@ -74,6 +74,7 @@ static struct device *ap_root_device = NULL;
|
|||
static struct ap_config_info *ap_configuration;
|
||||
static DEFINE_SPINLOCK(ap_device_list_lock);
|
||||
static LIST_HEAD(ap_device_list);
|
||||
static bool initialised;
|
||||
|
||||
/*
|
||||
* Workqueue timer for bus rescan.
|
||||
|
|
@ -1384,6 +1385,9 @@ int ap_driver_register(struct ap_driver *ap_drv, struct module *owner,
|
|||
{
|
||||
struct device_driver *drv = &ap_drv->driver;
|
||||
|
||||
if (!initialised)
|
||||
return -ENODEV;
|
||||
|
||||
drv->bus = &ap_bus_type;
|
||||
drv->probe = ap_device_probe;
|
||||
drv->remove = ap_device_remove;
|
||||
|
|
@ -1808,6 +1812,7 @@ int __init ap_module_init(void)
|
|||
goto out_pm;
|
||||
|
||||
queue_work(system_long_wq, &ap_scan_work);
|
||||
initialised = true;
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
@ -1837,6 +1842,7 @@ void ap_module_exit(void)
|
|||
{
|
||||
int i;
|
||||
|
||||
initialised = false;
|
||||
ap_reset_domain();
|
||||
ap_poll_thread_stop();
|
||||
del_timer_sync(&ap_config_timer);
|
||||
|
|
|
|||
|
|
@ -317,11 +317,9 @@ EXPORT_SYMBOL(zcrypt_device_unregister);
|
|||
|
||||
void zcrypt_msgtype_register(struct zcrypt_ops *zops)
|
||||
{
|
||||
if (zops->owner) {
|
||||
spin_lock_bh(&zcrypt_ops_list_lock);
|
||||
list_add_tail(&zops->list, &zcrypt_ops_list);
|
||||
spin_unlock_bh(&zcrypt_ops_list_lock);
|
||||
}
|
||||
spin_lock_bh(&zcrypt_ops_list_lock);
|
||||
list_add_tail(&zops->list, &zcrypt_ops_list);
|
||||
spin_unlock_bh(&zcrypt_ops_list_lock);
|
||||
}
|
||||
EXPORT_SYMBOL(zcrypt_msgtype_register);
|
||||
|
||||
|
|
@ -342,7 +340,7 @@ struct zcrypt_ops *__ops_lookup(unsigned char *name, int variant)
|
|||
spin_lock_bh(&zcrypt_ops_list_lock);
|
||||
list_for_each_entry(zops, &zcrypt_ops_list, list) {
|
||||
if ((zops->variant == variant) &&
|
||||
(!strncmp(zops->owner->name, name, MODULE_NAME_LEN))) {
|
||||
(!strncmp(zops->name, name, sizeof(zops->name)))) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -96,6 +96,7 @@ struct zcrypt_ops {
|
|||
struct list_head list; /* zcrypt ops list. */
|
||||
struct module *owner;
|
||||
int variant;
|
||||
char name[128];
|
||||
};
|
||||
|
||||
struct zcrypt_device {
|
||||
|
|
|
|||
|
|
@ -513,6 +513,7 @@ static struct zcrypt_ops zcrypt_msgtype50_ops = {
|
|||
.rsa_modexpo = zcrypt_cex2a_modexpo,
|
||||
.rsa_modexpo_crt = zcrypt_cex2a_modexpo_crt,
|
||||
.owner = THIS_MODULE,
|
||||
.name = MSGTYPE50_NAME,
|
||||
.variant = MSGTYPE50_VARIANT_DEFAULT,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1119,6 +1119,7 @@ static long zcrypt_msgtype6_rng(struct zcrypt_device *zdev,
|
|||
*/
|
||||
static struct zcrypt_ops zcrypt_msgtype6_norng_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = MSGTYPE06_NAME,
|
||||
.variant = MSGTYPE06_VARIANT_NORNG,
|
||||
.rsa_modexpo = zcrypt_msgtype6_modexpo,
|
||||
.rsa_modexpo_crt = zcrypt_msgtype6_modexpo_crt,
|
||||
|
|
@ -1127,6 +1128,7 @@ static struct zcrypt_ops zcrypt_msgtype6_norng_ops = {
|
|||
|
||||
static struct zcrypt_ops zcrypt_msgtype6_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = MSGTYPE06_NAME,
|
||||
.variant = MSGTYPE06_VARIANT_DEFAULT,
|
||||
.rsa_modexpo = zcrypt_msgtype6_modexpo,
|
||||
.rsa_modexpo_crt = zcrypt_msgtype6_modexpo_crt,
|
||||
|
|
@ -1136,6 +1138,7 @@ static struct zcrypt_ops zcrypt_msgtype6_ops = {
|
|||
|
||||
static struct zcrypt_ops zcrypt_msgtype6_ep11_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = MSGTYPE06_NAME,
|
||||
.variant = MSGTYPE06_VARIANT_EP11,
|
||||
.rsa_modexpo = NULL,
|
||||
.rsa_modexpo_crt = NULL,
|
||||
|
|
|
|||
Loading…
Reference in a new issue