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