diff options
Diffstat (limited to 'drivers/s390/char')
-rw-r--r-- | drivers/s390/char/Kconfig | 2 | ||||
-rw-r--r-- | drivers/s390/char/sclp_cmd.c | 48 | ||||
-rw-r--r-- | drivers/s390/char/sclp_sdias.c | 4 | ||||
-rw-r--r-- | drivers/s390/char/zcore.c | 32 |
4 files changed, 47 insertions, 39 deletions
diff --git a/drivers/s390/char/Kconfig b/drivers/s390/char/Kconfig index a5c6f7e157aa..eaca3e006301 100644 --- a/drivers/s390/char/Kconfig +++ b/drivers/s390/char/Kconfig @@ -115,7 +115,7 @@ config SCLP_ASYNC_ID config HMC_DRV def_tristate m prompt "Support for file transfers from HMC drive CD/DVD-ROM" - depends on S390 && 64BIT + depends on S390 select CRC16 help This option enables support for file transfers from a Hardware diff --git a/drivers/s390/char/sclp_cmd.c b/drivers/s390/char/sclp_cmd.c index 6e14999f9e8f..7be782116dab 100644 --- a/drivers/s390/char/sclp_cmd.c +++ b/drivers/s390/char/sclp_cmd.c @@ -315,10 +315,29 @@ static int sclp_mem_change_state(unsigned long start, unsigned long size, rc |= sclp_assign_storage(incr->rn); else sclp_unassign_storage(incr->rn); + if (rc == 0) + incr->standby = online ? 0 : 1; } return rc ? -EIO : 0; } +static bool contains_standby_increment(unsigned long start, unsigned long end) +{ + struct memory_increment *incr; + unsigned long istart; + + list_for_each_entry(incr, &sclp_mem_list, list) { + istart = rn2addr(incr->rn); + if (end - 1 < istart) + continue; + if (start > istart + sclp_rzm - 1) + continue; + if (incr->standby) + return true; + } + return false; +} + static int sclp_mem_notifier(struct notifier_block *nb, unsigned long action, void *data) { @@ -334,8 +353,16 @@ static int sclp_mem_notifier(struct notifier_block *nb, for_each_clear_bit(id, sclp_storage_ids, sclp_max_storage_id + 1) sclp_attach_storage(id); switch (action) { - case MEM_ONLINE: case MEM_GOING_OFFLINE: + /* + * We do not allow to set memory blocks offline that contain + * standby memory. This is done to simplify the "memory online" + * case. + */ + if (contains_standby_increment(start, start + size)) + rc = -EPERM; + break; + case MEM_ONLINE: case MEM_CANCEL_OFFLINE: break; case MEM_GOING_ONLINE: @@ -361,6 +388,21 @@ static struct notifier_block sclp_mem_nb = { .notifier_call = sclp_mem_notifier, }; +static void __init align_to_block_size(unsigned long long *start, + unsigned long long *size) +{ + unsigned long long start_align, size_align, alignment; + + alignment = memory_block_size_bytes(); + start_align = roundup(*start, alignment); + size_align = rounddown(*start + *size, alignment) - start_align; + + pr_info("Standby memory at 0x%llx (%lluM of %lluM usable)\n", + *start, size_align >> 20, *size >> 20); + *start = start_align; + *size = size_align; +} + static void __init add_memory_merged(u16 rn) { static u16 first_rn, num; @@ -382,7 +424,9 @@ static void __init add_memory_merged(u16 rn) goto skip_add; if (memory_end_set && (start + size > memory_end)) size = memory_end - start; - add_memory(0, start, size); + align_to_block_size(&start, &size); + if (size) + add_memory(0, start, size); skip_add: first_rn = rn; num = 1; diff --git a/drivers/s390/char/sclp_sdias.c b/drivers/s390/char/sclp_sdias.c index 561a0414b352..eb7cb076c001 100644 --- a/drivers/s390/char/sclp_sdias.c +++ b/drivers/s390/char/sclp_sdias.c @@ -178,11 +178,7 @@ int sclp_sdias_copy(void *dest, int start_blk, int nr_blks) sccb.evbuf.event_qual = SDIAS_EQ_STORE_DATA; sccb.evbuf.data_id = SDIAS_DI_FCP_DUMP; sccb.evbuf.event_id = 4712; -#ifdef CONFIG_64BIT sccb.evbuf.asa_size = SDIAS_ASA_SIZE_64; -#else - sccb.evbuf.asa_size = SDIAS_ASA_SIZE_32; -#endif sccb.evbuf.event_status = 0; sccb.evbuf.blk_cnt = nr_blks; sccb.evbuf.asa = (unsigned long)dest; diff --git a/drivers/s390/char/zcore.c b/drivers/s390/char/zcore.c index efcf48481c5f..a68fcfd1d48c 100644 --- a/drivers/s390/char/zcore.c +++ b/drivers/s390/char/zcore.c @@ -212,11 +212,7 @@ static struct zcore_header zcore_header = { .dump_level = 0, .page_size = PAGE_SIZE, .mem_start = 0, -#ifdef CONFIG_64BIT .build_arch = DUMP_ARCH_S390X, -#else - .build_arch = DUMP_ARCH_S390, -#endif }; /* @@ -516,23 +512,6 @@ static const struct file_operations zcore_hsa_fops = { .llseek = no_llseek, }; -#ifdef CONFIG_32BIT - -static void __init set_lc_mask(struct save_area *map) -{ - memset(&map->ext_save, 0xff, sizeof(map->ext_save)); - memset(&map->timer, 0xff, sizeof(map->timer)); - memset(&map->clk_cmp, 0xff, sizeof(map->clk_cmp)); - memset(&map->psw, 0xff, sizeof(map->psw)); - memset(&map->pref_reg, 0xff, sizeof(map->pref_reg)); - memset(&map->acc_regs, 0xff, sizeof(map->acc_regs)); - memset(&map->fp_regs, 0xff, sizeof(map->fp_regs)); - memset(&map->gp_regs, 0xff, sizeof(map->gp_regs)); - memset(&map->ctrl_regs, 0xff, sizeof(map->ctrl_regs)); -} - -#else /* CONFIG_32BIT */ - static void __init set_lc_mask(struct save_area *map) { memset(&map->fp_regs, 0xff, sizeof(map->fp_regs)); @@ -547,8 +526,6 @@ static void __init set_lc_mask(struct save_area *map) memset(&map->ctrl_regs, 0xff, sizeof(map->ctrl_regs)); } -#endif /* CONFIG_32BIT */ - /* * Initialize dump globals for a given architecture */ @@ -688,21 +665,12 @@ static int __init zcore_init(void) if (rc) goto fail; -#ifdef CONFIG_64BIT if (arch == ARCH_S390) { pr_alert("The 64-bit dump tool cannot be used for a " "32-bit system\n"); rc = -EINVAL; goto fail; } -#else /* CONFIG_64BIT */ - if (arch == ARCH_S390X) { - pr_alert("The 32-bit dump tool cannot be used for a " - "64-bit system\n"); - rc = -EINVAL; - goto fail; - } -#endif /* CONFIG_64BIT */ rc = get_mem_info(&mem_size, &mem_end); if (rc) |