|
@@ -20,6 +20,9 @@
|
|
#define CPACF_KMC 0xb92f /* MSA */
|
|
#define CPACF_KMC 0xb92f /* MSA */
|
|
#define CPACF_KIMD 0xb93e /* MSA */
|
|
#define CPACF_KIMD 0xb93e /* MSA */
|
|
#define CPACF_KLMD 0xb93f /* MSA */
|
|
#define CPACF_KLMD 0xb93f /* MSA */
|
|
|
|
+#define CPACF_PCKMO 0xb928 /* MSA3 */
|
|
|
|
+#define CPACF_KMF 0xb92a /* MSA4 */
|
|
|
|
+#define CPACF_KMO 0xb92b /* MSA4 */
|
|
#define CPACF_PCC 0xb92c /* MSA4 */
|
|
#define CPACF_PCC 0xb92c /* MSA4 */
|
|
#define CPACF_KMCTR 0xb92d /* MSA4 */
|
|
#define CPACF_KMCTR 0xb92d /* MSA4 */
|
|
#define CPACF_PPNO 0xb93c /* MSA5 */
|
|
#define CPACF_PPNO 0xb93c /* MSA5 */
|
|
@@ -136,6 +139,7 @@ static inline void __cpacf_query(unsigned int opcode, unsigned char *status)
|
|
register unsigned long r1 asm("1") = (unsigned long) status;
|
|
register unsigned long r1 asm("1") = (unsigned long) status;
|
|
|
|
|
|
asm volatile(
|
|
asm volatile(
|
|
|
|
+ " spm 0\n" /* pckmo doesn't change the cc */
|
|
/* Parameter registers are ignored, but may not be 0 */
|
|
/* Parameter registers are ignored, but may not be 0 */
|
|
"0: .insn rrf,%[opc] << 16,2,2,2,0\n"
|
|
"0: .insn rrf,%[opc] << 16,2,2,2,0\n"
|
|
" brc 1,0b\n" /* handle partial completion */
|
|
" brc 1,0b\n" /* handle partial completion */
|
|
@@ -157,6 +161,12 @@ static inline int cpacf_query(unsigned int opcode, unsigned int func)
|
|
if (!test_facility(17)) /* check for MSA */
|
|
if (!test_facility(17)) /* check for MSA */
|
|
return 0;
|
|
return 0;
|
|
break;
|
|
break;
|
|
|
|
+ case CPACF_PCKMO:
|
|
|
|
+ if (!test_facility(76)) /* check for MSA3 */
|
|
|
|
+ return 0;
|
|
|
|
+ break;
|
|
|
|
+ case CPACF_KMF:
|
|
|
|
+ case CPACF_KMO:
|
|
case CPACF_PCC:
|
|
case CPACF_PCC:
|
|
case CPACF_KMCTR:
|
|
case CPACF_KMCTR:
|
|
if (!test_facility(77)) /* check for MSA4 */
|
|
if (!test_facility(77)) /* check for MSA4 */
|