Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d5ab7a34 authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky
Browse files

s390/sclp: make early sclp code readable



This patch

 - unifies the old sclp early code and the sclp early printk code, so
   they can use common functions

 - makes sure all sclp early functions and variables have the same
   "sclp_early" prefix

 - converts the sclp early printk code into readable code by using
   existing data structures instead of hard coded magic arrays

 - splits the early sclp code into two files: sclp_early.c and
   sclp_early_core.c. The core file contains everything that is
   required by the kernel decompressor and may not call functions not
   contained within the core file. Otherwise the result would be a
   link error.

 - changes interrupt handling to be completely synchronous. The old
   early sclp code had a small window which allowed to receive several
   interrupts instead of exactly the single expected interrupt. This
   did hide a subtle potential bug, which is fixed with this large
   rework.

 - contains a couple of small cleanups.

Reviewed-by: default avatarPeter Oberparleiter <oberpar@linux.vnet.ibm.com>
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 76fdf141
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -66,7 +66,7 @@ static unsigned long free_mem_end_ptr;

static int puts(const char *s)
{
	_sclp_print_early(s);
	sclp_early_printk(s);
	return 0;
}

+7 −6
Original line number Diff line number Diff line
@@ -101,7 +101,12 @@ struct zpci_report_error_header {
	u8 data[0];	/* Subsequent Data passed verbatim to SCLP ET 24 */
} __packed;

int _sclp_get_core_info_early(struct sclp_core_info *info);
int sclp_early_get_core_info(struct sclp_core_info *info);
void sclp_early_get_ipl_info(struct sclp_ipl_info *info);
void sclp_early_detect(void);
void sclp_early_printk(const char *s);
void __sclp_early_printk(const char *s, unsigned int len);

int _sclp_get_core_info(struct sclp_core_info *info);
int sclp_core_configure(u8 core);
int sclp_core_deconfigure(u8 core);
@@ -110,21 +115,17 @@ int sclp_sdias_copy(void *dest, int blk_num, int nr_blks);
int sclp_chp_configure(struct chp_id chpid);
int sclp_chp_deconfigure(struct chp_id chpid);
int sclp_chp_read_info(struct sclp_chp_info *info);
void sclp_get_ipl_info(struct sclp_ipl_info *info);
int sclp_pci_configure(u32 fid);
int sclp_pci_deconfigure(u32 fid);
int sclp_pci_report(struct zpci_report_error_header *report, u32 fh, u32 fid);
int memcpy_hsa_kernel(void *dest, unsigned long src, size_t count);
int memcpy_hsa_user(void __user *dest, unsigned long src, size_t count);
void sclp_early_detect(void);
void _sclp_print_early(const char *);
void __sclp_print_early(const char *s, unsigned int len);
void sclp_ocf_cpc_name_copy(char *dst);

static inline int sclp_get_core_info(struct sclp_core_info *info, int early)
{
	if (early)
		return _sclp_get_core_info_early(info);
		return sclp_early_get_core_info(info);
	return _sclp_get_core_info(info);
}

+5 −5
Original line number Diff line number Diff line
@@ -41,7 +41,7 @@ static void __init print_machine_type(void)
	get_cpu_id(&id);
	u16_to_hex(type_str, id.machine);
	strcat(mach_str, type_str);
	_sclp_print_early(mach_str);
	sclp_early_printk(mach_str);
}

static void __init u16_to_decimal(char *str, u16 val)
@@ -79,7 +79,7 @@ static void __init print_missing_facilities(void)
			 * z/VM adds a four character prefix.
			 */
			if (strlen(als_str) > 70) {
				_sclp_print_early(als_str);
				sclp_early_printk(als_str);
				*als_str = '\0';
			}
			u16_to_decimal(val_str, i * BITS_PER_LONG + j);
@@ -87,13 +87,13 @@ static void __init print_missing_facilities(void)
			first = 0;
		}
	}
	_sclp_print_early(als_str);
	_sclp_print_early("See Principles of Operations for facility bits");
	sclp_early_printk(als_str);
	sclp_early_printk("See Principles of Operations for facility bits");
}

static void __init facility_mismatch(void)
{
	_sclp_print_early("The Linux kernel requires more recent processor hardware");
	sclp_early_printk("The Linux kernel requires more recent processor hardware");
	print_machine_type();
	print_missing_facilities();
	disabled_wait(0x8badcccc);
+1 −1
Original line number Diff line number Diff line
@@ -9,7 +9,7 @@

static void sclp_early_write(struct console *con, const char *s, unsigned int len)
{
	__sclp_print_early(s, len);
	__sclp_early_printk(s, len);
}

static struct console sclp_early_console = {
+1 −1
Original line number Diff line number Diff line
@@ -1864,7 +1864,7 @@ static int __init s390_ipl_init(void)
{
	char str[8] = {0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40};

	sclp_get_ipl_info(&sclp_ipl_info);
	sclp_early_get_ipl_info(&sclp_ipl_info);
	/*
	 * Fix loadparm: There are systems where the (SCSI) LOADPARM
	 * returned by read SCP info is invalid (contains EBCDIC blanks)
Loading