0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040 #ifndef _FSL_HCALLS_H
0041 #define _FSL_HCALLS_H
0042
0043 #include <linux/types.h>
0044 #include <linux/errno.h>
0045 #include <asm/byteorder.h>
0046 #include <asm/epapr_hcalls.h>
0047
0048 #define FH_API_VERSION 1
0049
0050 #define FH_ERR_GET_INFO 1
0051 #define FH_PARTITION_GET_DTPROP 2
0052 #define FH_PARTITION_SET_DTPROP 3
0053 #define FH_PARTITION_RESTART 4
0054 #define FH_PARTITION_GET_STATUS 5
0055 #define FH_PARTITION_START 6
0056 #define FH_PARTITION_STOP 7
0057 #define FH_PARTITION_MEMCPY 8
0058 #define FH_DMA_ENABLE 9
0059 #define FH_DMA_DISABLE 10
0060 #define FH_SEND_NMI 11
0061 #define FH_VMPIC_GET_MSIR 12
0062 #define FH_SYSTEM_RESET 13
0063 #define FH_GET_CORE_STATE 14
0064 #define FH_ENTER_NAP 15
0065 #define FH_EXIT_NAP 16
0066 #define FH_CLAIM_DEVICE 17
0067 #define FH_PARTITION_STOP_DMA 18
0068
0069
0070 #define FH_HCALL_TOKEN(num) _EV_HCALL_TOKEN(EV_FSL_VENDOR_ID, num)
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091 static inline unsigned int fh_send_nmi(unsigned int vcpu_mask)
0092 {
0093 register uintptr_t r11 __asm__("r11");
0094 register uintptr_t r3 __asm__("r3");
0095
0096 r11 = FH_HCALL_TOKEN(FH_SEND_NMI);
0097 r3 = vcpu_mask;
0098
0099 asm volatile("bl epapr_hypercall_start"
0100 : "+r" (r11), "+r" (r3)
0101 : : EV_HCALL_CLOBBERS1
0102 );
0103
0104 return r3;
0105 }
0106
0107
0108 #define FH_DTPROP_MAX_PATHLEN 4096
0109 #define FH_DTPROP_MAX_PROPLEN 32768
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121 static inline unsigned int fh_partition_get_dtprop(int handle,
0122 uint64_t dtpath_addr,
0123 uint64_t propname_addr,
0124 uint64_t propvalue_addr,
0125 uint32_t *propvalue_len)
0126 {
0127 register uintptr_t r11 __asm__("r11");
0128 register uintptr_t r3 __asm__("r3");
0129 register uintptr_t r4 __asm__("r4");
0130 register uintptr_t r5 __asm__("r5");
0131 register uintptr_t r6 __asm__("r6");
0132 register uintptr_t r7 __asm__("r7");
0133 register uintptr_t r8 __asm__("r8");
0134 register uintptr_t r9 __asm__("r9");
0135 register uintptr_t r10 __asm__("r10");
0136
0137 r11 = FH_HCALL_TOKEN(FH_PARTITION_GET_DTPROP);
0138 r3 = handle;
0139
0140 #ifdef CONFIG_PHYS_64BIT
0141 r4 = dtpath_addr >> 32;
0142 r6 = propname_addr >> 32;
0143 r8 = propvalue_addr >> 32;
0144 #else
0145 r4 = 0;
0146 r6 = 0;
0147 r8 = 0;
0148 #endif
0149 r5 = (uint32_t)dtpath_addr;
0150 r7 = (uint32_t)propname_addr;
0151 r9 = (uint32_t)propvalue_addr;
0152 r10 = *propvalue_len;
0153
0154 asm volatile("bl epapr_hypercall_start"
0155 : "+r" (r11),
0156 "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6), "+r" (r7),
0157 "+r" (r8), "+r" (r9), "+r" (r10)
0158 : : EV_HCALL_CLOBBERS8
0159 );
0160
0161 *propvalue_len = r4;
0162 return r3;
0163 }
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175 static inline unsigned int fh_partition_set_dtprop(int handle,
0176 uint64_t dtpath_addr,
0177 uint64_t propname_addr,
0178 uint64_t propvalue_addr,
0179 uint32_t propvalue_len)
0180 {
0181 register uintptr_t r11 __asm__("r11");
0182 register uintptr_t r3 __asm__("r3");
0183 register uintptr_t r4 __asm__("r4");
0184 register uintptr_t r6 __asm__("r6");
0185 register uintptr_t r8 __asm__("r8");
0186 register uintptr_t r5 __asm__("r5");
0187 register uintptr_t r7 __asm__("r7");
0188 register uintptr_t r9 __asm__("r9");
0189 register uintptr_t r10 __asm__("r10");
0190
0191 r11 = FH_HCALL_TOKEN(FH_PARTITION_SET_DTPROP);
0192 r3 = handle;
0193
0194 #ifdef CONFIG_PHYS_64BIT
0195 r4 = dtpath_addr >> 32;
0196 r6 = propname_addr >> 32;
0197 r8 = propvalue_addr >> 32;
0198 #else
0199 r4 = 0;
0200 r6 = 0;
0201 r8 = 0;
0202 #endif
0203 r5 = (uint32_t)dtpath_addr;
0204 r7 = (uint32_t)propname_addr;
0205 r9 = (uint32_t)propvalue_addr;
0206 r10 = propvalue_len;
0207
0208 asm volatile("bl epapr_hypercall_start"
0209 : "+r" (r11),
0210 "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6), "+r" (r7),
0211 "+r" (r8), "+r" (r9), "+r" (r10)
0212 : : EV_HCALL_CLOBBERS8
0213 );
0214
0215 return r3;
0216 }
0217
0218
0219
0220
0221
0222
0223
0224 static inline unsigned int fh_partition_restart(unsigned int partition)
0225 {
0226 register uintptr_t r11 __asm__("r11");
0227 register uintptr_t r3 __asm__("r3");
0228
0229 r11 = FH_HCALL_TOKEN(FH_PARTITION_RESTART);
0230 r3 = partition;
0231
0232 asm volatile("bl epapr_hypercall_start"
0233 : "+r" (r11), "+r" (r3)
0234 : : EV_HCALL_CLOBBERS1
0235 );
0236
0237 return r3;
0238 }
0239
0240 #define FH_PARTITION_STOPPED 0
0241 #define FH_PARTITION_RUNNING 1
0242 #define FH_PARTITION_STARTING 2
0243 #define FH_PARTITION_STOPPING 3
0244 #define FH_PARTITION_PAUSING 4
0245 #define FH_PARTITION_PAUSED 5
0246 #define FH_PARTITION_RESUMING 6
0247
0248
0249
0250
0251
0252
0253
0254
0255 static inline unsigned int fh_partition_get_status(unsigned int partition,
0256 unsigned int *status)
0257 {
0258 register uintptr_t r11 __asm__("r11");
0259 register uintptr_t r3 __asm__("r3");
0260 register uintptr_t r4 __asm__("r4");
0261
0262 r11 = FH_HCALL_TOKEN(FH_PARTITION_GET_STATUS);
0263 r3 = partition;
0264
0265 asm volatile("bl epapr_hypercall_start"
0266 : "+r" (r11), "+r" (r3), "=r" (r4)
0267 : : EV_HCALL_CLOBBERS2
0268 );
0269
0270 *status = r4;
0271
0272 return r3;
0273 }
0274
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285 static inline unsigned int fh_partition_start(unsigned int partition,
0286 uint32_t entry_point, int load)
0287 {
0288 register uintptr_t r11 __asm__("r11");
0289 register uintptr_t r3 __asm__("r3");
0290 register uintptr_t r4 __asm__("r4");
0291 register uintptr_t r5 __asm__("r5");
0292
0293 r11 = FH_HCALL_TOKEN(FH_PARTITION_START);
0294 r3 = partition;
0295 r4 = entry_point;
0296 r5 = load;
0297
0298 asm volatile("bl epapr_hypercall_start"
0299 : "+r" (r11), "+r" (r3), "+r" (r4), "+r" (r5)
0300 : : EV_HCALL_CLOBBERS3
0301 );
0302
0303 return r3;
0304 }
0305
0306
0307
0308
0309
0310
0311
0312 static inline unsigned int fh_partition_stop(unsigned int partition)
0313 {
0314 register uintptr_t r11 __asm__("r11");
0315 register uintptr_t r3 __asm__("r3");
0316
0317 r11 = FH_HCALL_TOKEN(FH_PARTITION_STOP);
0318 r3 = partition;
0319
0320 asm volatile("bl epapr_hypercall_start"
0321 : "+r" (r11), "+r" (r3)
0322 : : EV_HCALL_CLOBBERS1
0323 );
0324
0325 return r3;
0326 }
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339
0340
0341 struct fh_sg_list {
0342 uint64_t source;
0343 uint64_t target;
0344 uint64_t size;
0345 uint64_t reserved;
0346 } __attribute__ ((aligned(32)));
0347
0348
0349
0350
0351
0352
0353
0354
0355
0356
0357 static inline unsigned int fh_partition_memcpy(unsigned int source,
0358 unsigned int target, phys_addr_t sg_list, unsigned int count)
0359 {
0360 register uintptr_t r11 __asm__("r11");
0361 register uintptr_t r3 __asm__("r3");
0362 register uintptr_t r4 __asm__("r4");
0363 register uintptr_t r5 __asm__("r5");
0364 register uintptr_t r6 __asm__("r6");
0365 register uintptr_t r7 __asm__("r7");
0366
0367 r11 = FH_HCALL_TOKEN(FH_PARTITION_MEMCPY);
0368 r3 = source;
0369 r4 = target;
0370 r5 = (uint32_t) sg_list;
0371
0372 #ifdef CONFIG_PHYS_64BIT
0373 r6 = sg_list >> 32;
0374 #else
0375 r6 = 0;
0376 #endif
0377 r7 = count;
0378
0379 asm volatile("bl epapr_hypercall_start"
0380 : "+r" (r11),
0381 "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6), "+r" (r7)
0382 : : EV_HCALL_CLOBBERS5
0383 );
0384
0385 return r3;
0386 }
0387
0388
0389
0390
0391
0392
0393
0394 static inline unsigned int fh_dma_enable(unsigned int liodn)
0395 {
0396 register uintptr_t r11 __asm__("r11");
0397 register uintptr_t r3 __asm__("r3");
0398
0399 r11 = FH_HCALL_TOKEN(FH_DMA_ENABLE);
0400 r3 = liodn;
0401
0402 asm volatile("bl epapr_hypercall_start"
0403 : "+r" (r11), "+r" (r3)
0404 : : EV_HCALL_CLOBBERS1
0405 );
0406
0407 return r3;
0408 }
0409
0410
0411
0412
0413
0414
0415
0416 static inline unsigned int fh_dma_disable(unsigned int liodn)
0417 {
0418 register uintptr_t r11 __asm__("r11");
0419 register uintptr_t r3 __asm__("r3");
0420
0421 r11 = FH_HCALL_TOKEN(FH_DMA_DISABLE);
0422 r3 = liodn;
0423
0424 asm volatile("bl epapr_hypercall_start"
0425 : "+r" (r11), "+r" (r3)
0426 : : EV_HCALL_CLOBBERS1
0427 );
0428
0429 return r3;
0430 }
0431
0432
0433
0434
0435
0436
0437
0438
0439
0440 static inline unsigned int fh_vmpic_get_msir(unsigned int interrupt,
0441 unsigned int *msir_val)
0442 {
0443 register uintptr_t r11 __asm__("r11");
0444 register uintptr_t r3 __asm__("r3");
0445 register uintptr_t r4 __asm__("r4");
0446
0447 r11 = FH_HCALL_TOKEN(FH_VMPIC_GET_MSIR);
0448 r3 = interrupt;
0449
0450 asm volatile("bl epapr_hypercall_start"
0451 : "+r" (r11), "+r" (r3), "=r" (r4)
0452 : : EV_HCALL_CLOBBERS2
0453 );
0454
0455 *msir_val = r4;
0456
0457 return r3;
0458 }
0459
0460
0461
0462
0463
0464
0465 static inline unsigned int fh_system_reset(void)
0466 {
0467 register uintptr_t r11 __asm__("r11");
0468 register uintptr_t r3 __asm__("r3");
0469
0470 r11 = FH_HCALL_TOKEN(FH_SYSTEM_RESET);
0471
0472 asm volatile("bl epapr_hypercall_start"
0473 : "+r" (r11), "=r" (r3)
0474 : : EV_HCALL_CLOBBERS1
0475 );
0476
0477 return r3;
0478 }
0479
0480
0481
0482
0483
0484
0485
0486
0487
0488
0489
0490
0491
0492 static inline unsigned int fh_err_get_info(int queue, uint32_t *bufsize,
0493 uint32_t addr_hi, uint32_t addr_lo, int peek)
0494 {
0495 register uintptr_t r11 __asm__("r11");
0496 register uintptr_t r3 __asm__("r3");
0497 register uintptr_t r4 __asm__("r4");
0498 register uintptr_t r5 __asm__("r5");
0499 register uintptr_t r6 __asm__("r6");
0500 register uintptr_t r7 __asm__("r7");
0501
0502 r11 = FH_HCALL_TOKEN(FH_ERR_GET_INFO);
0503 r3 = queue;
0504 r4 = *bufsize;
0505 r5 = addr_hi;
0506 r6 = addr_lo;
0507 r7 = peek;
0508
0509 asm volatile("bl epapr_hypercall_start"
0510 : "+r" (r11), "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6),
0511 "+r" (r7)
0512 : : EV_HCALL_CLOBBERS5
0513 );
0514
0515 *bufsize = r4;
0516
0517 return r3;
0518 }
0519
0520
0521 #define FH_VCPU_RUN 0
0522 #define FH_VCPU_IDLE 1
0523 #define FH_VCPU_NAP 2
0524
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534 static inline unsigned int fh_get_core_state(unsigned int handle,
0535 unsigned int vcpu, unsigned int *state)
0536 {
0537 register uintptr_t r11 __asm__("r11");
0538 register uintptr_t r3 __asm__("r3");
0539 register uintptr_t r4 __asm__("r4");
0540
0541 r11 = FH_HCALL_TOKEN(FH_GET_CORE_STATE);
0542 r3 = handle;
0543 r4 = vcpu;
0544
0545 asm volatile("bl epapr_hypercall_start"
0546 : "+r" (r11), "+r" (r3), "+r" (r4)
0547 : : EV_HCALL_CLOBBERS2
0548 );
0549
0550 *state = r4;
0551 return r3;
0552 }
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562
0563
0564
0565 static inline unsigned int fh_enter_nap(unsigned int handle, unsigned int vcpu)
0566 {
0567 register uintptr_t r11 __asm__("r11");
0568 register uintptr_t r3 __asm__("r3");
0569 register uintptr_t r4 __asm__("r4");
0570
0571 r11 = FH_HCALL_TOKEN(FH_ENTER_NAP);
0572 r3 = handle;
0573 r4 = vcpu;
0574
0575 asm volatile("bl epapr_hypercall_start"
0576 : "+r" (r11), "+r" (r3), "+r" (r4)
0577 : : EV_HCALL_CLOBBERS2
0578 );
0579
0580 return r3;
0581 }
0582
0583
0584
0585
0586
0587
0588
0589
0590 static inline unsigned int fh_exit_nap(unsigned int handle, unsigned int vcpu)
0591 {
0592 register uintptr_t r11 __asm__("r11");
0593 register uintptr_t r3 __asm__("r3");
0594 register uintptr_t r4 __asm__("r4");
0595
0596 r11 = FH_HCALL_TOKEN(FH_EXIT_NAP);
0597 r3 = handle;
0598 r4 = vcpu;
0599
0600 asm volatile("bl epapr_hypercall_start"
0601 : "+r" (r11), "+r" (r3), "+r" (r4)
0602 : : EV_HCALL_CLOBBERS2
0603 );
0604
0605 return r3;
0606 }
0607
0608
0609
0610
0611
0612
0613 static inline unsigned int fh_claim_device(unsigned int handle)
0614 {
0615 register uintptr_t r11 __asm__("r11");
0616 register uintptr_t r3 __asm__("r3");
0617
0618 r11 = FH_HCALL_TOKEN(FH_CLAIM_DEVICE);
0619 r3 = handle;
0620
0621 asm volatile("bl epapr_hypercall_start"
0622 : "+r" (r11), "+r" (r3)
0623 : : EV_HCALL_CLOBBERS1
0624 );
0625
0626 return r3;
0627 }
0628
0629
0630
0631
0632
0633
0634
0635
0636
0637
0638
0639
0640 static inline unsigned int fh_partition_stop_dma(unsigned int handle)
0641 {
0642 register uintptr_t r11 __asm__("r11");
0643 register uintptr_t r3 __asm__("r3");
0644
0645 r11 = FH_HCALL_TOKEN(FH_PARTITION_STOP_DMA);
0646 r3 = handle;
0647
0648 asm volatile("bl epapr_hypercall_start"
0649 : "+r" (r11), "+r" (r3)
0650 : : EV_HCALL_CLOBBERS1
0651 );
0652
0653 return r3;
0654 }
0655 #endif