]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/s390/char/sclp_early.c
Merge branch 'topic/exynos' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab...
[karo-tx-linux.git] / drivers / s390 / char / sclp_early.c
index 2c6aac66e2b04e6ec1885c29dd20a2b80207c141..14196ea0fdf3ad878b6fe527733d8390f0ba6a25 100644 (file)
@@ -20,7 +20,9 @@ struct read_info_sccb {
        struct  sccb_header header;     /* 0-7 */
        u16     rnmax;                  /* 8-9 */
        u8      rnsize;                 /* 10 */
-       u8      _reserved0[24 - 11];    /* 11-15 */
+       u8      _reserved0[16 - 11];    /* 11-15 */
+       u16     ncpurl;                 /* 16-17 */
+       u8      _reserved7[24 - 18];    /* 18-23 */
        u8      loadparm[8];            /* 24-31 */
        u8      _reserved1[48 - 32];    /* 32-47 */
        u64     facilities;             /* 48-55 */
@@ -32,13 +34,16 @@ struct read_info_sccb {
        u8      _reserved4[100 - 92];   /* 92-99 */
        u32     rnsize2;                /* 100-103 */
        u64     rnmax2;                 /* 104-111 */
-       u8      _reserved5[4096 - 112]; /* 112-4095 */
+       u8      _reserved5[120 - 112];  /* 112-119 */
+       u16     hcpua;                  /* 120-121 */
+       u8      _reserved6[4096 - 122]; /* 122-4095 */
 } __packed __aligned(PAGE_SIZE);
 
 static char sccb_early[PAGE_SIZE] __aligned(PAGE_SIZE) __initdata;
 static unsigned int sclp_con_has_vt220 __initdata;
 static unsigned int sclp_con_has_linemode __initdata;
 static unsigned long sclp_hsa_size;
+static unsigned int sclp_max_cpu;
 static struct sclp_ipl_info sclp_ipl_info;
 
 u64 sclp_facilities;
@@ -102,6 +107,15 @@ static void __init sclp_facilities_detect(struct read_info_sccb *sccb)
        sclp_rzm = sccb->rnsize ? sccb->rnsize : sccb->rnsize2;
        sclp_rzm <<= 20;
 
+       if (!sccb->hcpua) {
+               if (MACHINE_IS_VM)
+                       sclp_max_cpu = 64;
+               else
+                       sclp_max_cpu = sccb->ncpurl;
+       } else {
+               sclp_max_cpu = sccb->hcpua + 1;
+       }
+
        /* Save IPL information */
        sclp_ipl_info.is_valid = 1;
        if (sccb->flags & 0x2)
@@ -129,6 +143,11 @@ unsigned long long sclp_get_rzm(void)
        return sclp_rzm;
 }
 
+unsigned int sclp_get_max_cpu(void)
+{
+       return sclp_max_cpu;
+}
+
 /*
  * This function will be called after sclp_facilities_detect(), which gets
  * called from early.c code. The sclp_facilities_detect() function retrieves