Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[linux-2.6] / arch / sparc64 / kernel / hvcalls.S
1         /* %o0: devhandle
2          * %o1: devino
3          *
4          * returns %o0: sysino
5          */
6 ENTRY(sun4v_devino_to_sysino)
7         mov     HV_FAST_INTR_DEVINO2SYSINO, %o5
8         ta      HV_FAST_TRAP
9         retl
10          mov    %o1, %o0
11 ENDPROC(sun4v_devino_to_sysino)
12
13         /* %o0: sysino
14          *
15          * returns %o0: intr_enabled (HV_INTR_{DISABLED,ENABLED})
16          */
17 ENTRY(sun4v_intr_getenabled)
18         mov     HV_FAST_INTR_GETENABLED, %o5
19         ta      HV_FAST_TRAP
20         retl
21          mov    %o1, %o0
22 ENDPROC(sun4v_intr_getenabled)
23
24         /* %o0: sysino
25          * %o1: intr_enabled (HV_INTR_{DISABLED,ENABLED})
26          */
27 ENTRY(sun4v_intr_setenabled)
28         mov     HV_FAST_INTR_SETENABLED, %o5
29         ta      HV_FAST_TRAP
30         retl
31          nop
32 ENDPROC(sun4v_intr_setenabled)
33
34         /* %o0: sysino
35          *
36          * returns %o0: intr_state (HV_INTR_STATE_*)
37          */
38 ENTRY(sun4v_intr_getstate)
39         mov     HV_FAST_INTR_GETSTATE, %o5
40         ta      HV_FAST_TRAP
41         retl
42          mov    %o1, %o0
43 ENDPROC(sun4v_intr_getstate)
44
45         /* %o0: sysino
46          * %o1: intr_state (HV_INTR_STATE_*)
47          */
48 ENTRY(sun4v_intr_setstate)
49         mov     HV_FAST_INTR_SETSTATE, %o5
50         ta      HV_FAST_TRAP
51         retl
52          nop
53 ENDPROC(sun4v_intr_setstate)
54
55         /* %o0: sysino
56          *
57          * returns %o0: cpuid
58          */
59 ENTRY(sun4v_intr_gettarget)
60         mov     HV_FAST_INTR_GETTARGET, %o5
61         ta      HV_FAST_TRAP
62         retl
63          mov    %o1, %o0
64 ENDPROC(sun4v_intr_gettarget)
65
66         /* %o0: sysino
67          * %o1: cpuid
68          */
69 ENTRY(sun4v_intr_settarget)
70         mov     HV_FAST_INTR_SETTARGET, %o5
71         ta      HV_FAST_TRAP
72         retl
73          nop
74 ENDPROC(sun4v_intr_settarget)
75
76         /* %o0: cpuid
77          * %o1: pc
78          * %o2: rtba
79          * %o3: arg0
80          *
81          * returns %o0: status
82          */
83 ENTRY(sun4v_cpu_start)
84         mov     HV_FAST_CPU_START, %o5
85         ta      HV_FAST_TRAP
86         retl
87          nop
88 ENDPROC(sun4v_cpu_start)
89
90         /* %o0: cpuid
91          *
92          * returns %o0: status
93          */
94 ENTRY(sun4v_cpu_stop)
95         mov     HV_FAST_CPU_STOP, %o5
96         ta      HV_FAST_TRAP
97         retl
98          nop
99 ENDPROC(sun4v_cpu_stop)
100
101         /* returns %o0: status  */
102 ENTRY(sun4v_cpu_yield)
103         mov     HV_FAST_CPU_YIELD, %o5
104         ta      HV_FAST_TRAP
105         retl
106          nop
107 ENDPROC(sun4v_cpu_yield)
108
109         /* %o0: type
110          * %o1: queue paddr
111          * %o2: num queue entries
112          *
113          * returns %o0: status
114          */
115 ENTRY(sun4v_cpu_qconf)
116         mov     HV_FAST_CPU_QCONF, %o5
117         ta      HV_FAST_TRAP
118         retl
119          nop
120 ENDPROC(sun4v_cpu_qconf)
121
122         /* %o0: num cpus in cpu list
123          * %o1: cpu list paddr
124          * %o2: mondo block paddr
125          *
126          * returns %o0: status
127          */
128 ENTRY(sun4v_cpu_mondo_send)
129         mov     HV_FAST_CPU_MONDO_SEND, %o5
130         ta      HV_FAST_TRAP
131         retl
132          nop
133 ENDPROC(sun4v_cpu_mondo_send)
134
135         /* %o0: CPU ID
136          *
137          * returns %o0: -status if status non-zero, else
138          *         %o0: cpu state as HV_CPU_STATE_*
139          */
140 ENTRY(sun4v_cpu_state)
141         mov     HV_FAST_CPU_STATE, %o5
142         ta      HV_FAST_TRAP
143         brnz,pn %o0, 1f
144          sub    %g0, %o0, %o0
145         mov     %o1, %o0
146 1:      retl
147          nop
148 ENDPROC(sun4v_cpu_state)
149
150         /* %o0: virtual address
151          * %o1: must be zero
152          * %o2: TTE
153          * %o3: HV_MMU_* flags
154          *
155          * returns %o0: status
156          */
157 ENTRY(sun4v_mmu_map_perm_addr)
158         mov     HV_FAST_MMU_MAP_PERM_ADDR, %o5
159         ta      HV_FAST_TRAP
160         retl
161          nop
162 ENDPROC(sun4v_mmu_map_perm_addr)
163
164         /* %o0: number of TSB descriptions
165          * %o1: TSB descriptions real address
166          *
167          * returns %o0: status
168          */
169 ENTRY(sun4v_mmu_tsb_ctx0)
170         mov     HV_FAST_MMU_TSB_CTX0, %o5
171         ta      HV_FAST_TRAP
172         retl
173          nop
174 ENDPROC(sun4v_mmu_tsb_ctx0)
175
176         /* %o0: API group number
177          * %o1: pointer to unsigned long major number storage
178          * %o2: pointer to unsigned long minor number storage
179          *
180          * returns %o0: status
181          */
182 ENTRY(sun4v_get_version)
183         mov     HV_CORE_GET_VER, %o5
184         mov     %o1, %o3
185         mov     %o2, %o4
186         ta      HV_CORE_TRAP
187         stx     %o1, [%o3]
188         retl
189          stx    %o2, [%o4]
190 ENDPROC(sun4v_get_version)
191
192         /* %o0: API group number
193          * %o1: desired major number
194          * %o2: desired minor number
195          * %o3: pointer to unsigned long actual minor number storage
196          *
197          * returns %o0: status
198          */
199 ENTRY(sun4v_set_version)
200         mov     HV_CORE_SET_VER, %o5
201         mov     %o3, %o4
202         ta      HV_CORE_TRAP
203         retl
204          stx    %o1, [%o4]
205 ENDPROC(sun4v_set_version)
206
207         /* %o0: pointer to unsigned long time
208          *
209          * returns %o0: status
210          */
211 ENTRY(sun4v_tod_get)
212         mov     %o0, %o4
213         mov     HV_FAST_TOD_GET, %o5
214         ta      HV_FAST_TRAP
215         stx     %o1, [%o4]
216         retl
217          nop
218 ENDPROC(sun4v_tod_get)
219
220         /* %o0: time
221          *
222          * returns %o0: status
223          */
224 ENTRY(sun4v_tod_set)
225         mov     HV_FAST_TOD_SET, %o5
226         ta      HV_FAST_TRAP
227         retl
228          nop
229 ENDPROC(sun4v_tod_set)
230
231         /* %o0: pointer to unsigned long status
232          *
233          * returns %o0: signed character
234          */
235 ENTRY(sun4v_con_getchar)
236         mov     %o0, %o4
237         mov     HV_FAST_CONS_GETCHAR, %o5
238         clr     %o0
239         clr     %o1
240         ta      HV_FAST_TRAP
241         stx     %o0, [%o4]
242         retl
243          sra    %o1, 0, %o0
244 ENDPROC(sun4v_con_getchar)
245
246         /* %o0: signed long character
247          *
248          * returns %o0: status
249          */
250 ENTRY(sun4v_con_putchar)
251         mov     HV_FAST_CONS_PUTCHAR, %o5
252         ta      HV_FAST_TRAP
253         retl
254          sra    %o0, 0, %o0
255 ENDPROC(sun4v_con_putchar)
256
257         /* %o0: buffer real address
258          * %o1: buffer size
259          * %o2: pointer to unsigned long bytes_read
260          *
261          * returns %o0: status
262          */
263 ENTRY(sun4v_con_read)
264         mov     %o2, %o4
265         mov     HV_FAST_CONS_READ, %o5
266         ta      HV_FAST_TRAP
267         brnz    %o0, 1f
268          cmp    %o1, -1         /* break */
269         be,a,pn %icc, 1f
270          mov    %o1, %o0
271         cmp     %o1, -2         /* hup */
272         be,a,pn %icc, 1f
273          mov    %o1, %o0
274         stx     %o1, [%o4]
275 1:      retl
276          nop
277 ENDPROC(sun4v_con_read)
278
279         /* %o0: buffer real address
280          * %o1: buffer size
281          * %o2: pointer to unsigned long bytes_written
282          *
283          * returns %o0: status
284          */
285 ENTRY(sun4v_con_write)
286         mov     %o2, %o4
287         mov     HV_FAST_CONS_WRITE, %o5
288         ta      HV_FAST_TRAP
289         stx     %o1, [%o4]
290         retl
291          nop
292 ENDPROC(sun4v_con_write)
293
294         /* %o0: soft state
295          * %o1: address of description string
296          *
297          * returns %o0: status
298          */
299 ENTRY(sun4v_mach_set_soft_state)
300         mov     HV_FAST_MACH_SET_SOFT_STATE, %o5
301         ta      HV_FAST_TRAP
302         retl
303          nop
304 ENDPROC(sun4v_mach_set_soft_state)
305
306         /* %o0: exit code
307          *
308          * Does not return.
309          */
310 ENTRY(sun4v_mach_exit)
311         mov     HV_FAST_MACH_EXIT, %o5
312         ta      HV_FAST_TRAP
313         retl
314          nop
315 ENDPROC(sun4v_mach_exit)
316
317         /* %o0: buffer real address
318          * %o1: buffer length
319          * %o2: pointer to unsigned long real_buf_len
320          *
321          * returns %o0: status
322          */
323 ENTRY(sun4v_mach_desc)
324         mov     %o2, %o4
325         mov     HV_FAST_MACH_DESC, %o5
326         ta      HV_FAST_TRAP
327         stx     %o1, [%o4]
328         retl
329          nop
330 ENDPROC(sun4v_mach_desc)
331
332         /* %o0: new timeout in milliseconds
333          * %o1: pointer to unsigned long orig_timeout
334          *
335          * returns %o0: status
336          */
337 ENTRY(sun4v_mach_set_watchdog)
338         mov     %o1, %o4
339         mov     HV_FAST_MACH_SET_WATCHDOG, %o5
340         ta      HV_FAST_TRAP
341         stx     %o1, [%o4]
342         retl
343          nop
344 ENDPROC(sun4v_mach_set_watchdog)
345
346         /* No inputs and does not return.  */
347 ENTRY(sun4v_mach_sir)
348         mov     %o1, %o4
349         mov     HV_FAST_MACH_SIR, %o5
350         ta      HV_FAST_TRAP
351         stx     %o1, [%o4]
352         retl
353          nop
354 ENDPROC(sun4v_mach_sir)
355
356         /* %o0: channel
357          * %o1: ra
358          * %o2: num_entries
359          *
360          * returns %o0: status
361          */
362 ENTRY(sun4v_ldc_tx_qconf)
363         mov     HV_FAST_LDC_TX_QCONF, %o5
364         ta      HV_FAST_TRAP
365         retl
366          nop
367 ENDPROC(sun4v_ldc_tx_qconf)
368
369         /* %o0: channel
370          * %o1: pointer to unsigned long ra
371          * %o2: pointer to unsigned long num_entries
372          *
373          * returns %o0: status
374          */
375 ENTRY(sun4v_ldc_tx_qinfo)
376         mov     %o1, %g1
377         mov     %o2, %g2
378         mov     HV_FAST_LDC_TX_QINFO, %o5
379         ta      HV_FAST_TRAP
380         stx     %o1, [%g1]
381         stx     %o2, [%g2]
382         retl
383          nop
384 ENDPROC(sun4v_ldc_tx_qinfo)
385
386         /* %o0: channel
387          * %o1: pointer to unsigned long head_off
388          * %o2: pointer to unsigned long tail_off
389          * %o2: pointer to unsigned long chan_state
390          *
391          * returns %o0: status
392          */
393 ENTRY(sun4v_ldc_tx_get_state)
394         mov     %o1, %g1
395         mov     %o2, %g2
396         mov     %o3, %g3
397         mov     HV_FAST_LDC_TX_GET_STATE, %o5
398         ta      HV_FAST_TRAP
399         stx     %o1, [%g1]
400         stx     %o2, [%g2]
401         stx     %o3, [%g3]
402         retl
403          nop
404 ENDPROC(sun4v_ldc_tx_get_state)
405
406         /* %o0: channel
407          * %o1: tail_off
408          *
409          * returns %o0: status
410          */
411 ENTRY(sun4v_ldc_tx_set_qtail)
412         mov     HV_FAST_LDC_TX_SET_QTAIL, %o5
413         ta      HV_FAST_TRAP
414         retl
415          nop
416 ENDPROC(sun4v_ldc_tx_set_qtail)
417
418         /* %o0: channel
419          * %o1: ra
420          * %o2: num_entries
421          *
422          * returns %o0: status
423          */
424 ENTRY(sun4v_ldc_rx_qconf)
425         mov     HV_FAST_LDC_RX_QCONF, %o5
426         ta      HV_FAST_TRAP
427         retl
428          nop
429 ENDPROC(sun4v_ldc_rx_qconf)
430
431         /* %o0: channel
432          * %o1: pointer to unsigned long ra
433          * %o2: pointer to unsigned long num_entries
434          *
435          * returns %o0: status
436          */
437 ENTRY(sun4v_ldc_rx_qinfo)
438         mov     %o1, %g1
439         mov     %o2, %g2
440         mov     HV_FAST_LDC_RX_QINFO, %o5
441         ta      HV_FAST_TRAP
442         stx     %o1, [%g1]
443         stx     %o2, [%g2]
444         retl
445          nop
446 ENDPROC(sun4v_ldc_rx_qinfo)
447
448         /* %o0: channel
449          * %o1: pointer to unsigned long head_off
450          * %o2: pointer to unsigned long tail_off
451          * %o2: pointer to unsigned long chan_state
452          *
453          * returns %o0: status
454          */
455 ENTRY(sun4v_ldc_rx_get_state)
456         mov     %o1, %g1
457         mov     %o2, %g2
458         mov     %o3, %g3
459         mov     HV_FAST_LDC_RX_GET_STATE, %o5
460         ta      HV_FAST_TRAP
461         stx     %o1, [%g1]
462         stx     %o2, [%g2]
463         stx     %o3, [%g3]
464         retl
465          nop
466 ENDPROC(sun4v_ldc_rx_get_state)
467
468         /* %o0: channel
469          * %o1: head_off
470          *
471          * returns %o0: status
472          */
473 ENTRY(sun4v_ldc_rx_set_qhead)
474         mov     HV_FAST_LDC_RX_SET_QHEAD, %o5
475         ta      HV_FAST_TRAP
476         retl
477          nop
478 ENDPROC(sun4v_ldc_rx_set_qhead)
479
480         /* %o0: channel
481          * %o1: ra
482          * %o2: num_entries
483          *
484          * returns %o0: status
485          */
486 ENTRY(sun4v_ldc_set_map_table)
487         mov     HV_FAST_LDC_SET_MAP_TABLE, %o5
488         ta      HV_FAST_TRAP
489         retl
490          nop
491 ENDPROC(sun4v_ldc_set_map_table)
492
493         /* %o0: channel
494          * %o1: pointer to unsigned long ra
495          * %o2: pointer to unsigned long num_entries
496          *
497          * returns %o0: status
498          */
499 ENTRY(sun4v_ldc_get_map_table)
500         mov     %o1, %g1
501         mov     %o2, %g2
502         mov     HV_FAST_LDC_GET_MAP_TABLE, %o5
503         ta      HV_FAST_TRAP
504         stx     %o1, [%g1]
505         stx     %o2, [%g2]
506         retl
507          nop
508 ENDPROC(sun4v_ldc_get_map_table)
509
510         /* %o0: channel
511          * %o1: dir_code
512          * %o2: tgt_raddr
513          * %o3: lcl_raddr
514          * %o4: len
515          * %o5: pointer to unsigned long actual_len
516          *
517          * returns %o0: status
518          */
519 ENTRY(sun4v_ldc_copy)
520         mov     %o5, %g1
521         mov     HV_FAST_LDC_COPY, %o5
522         ta      HV_FAST_TRAP
523         stx     %o1, [%g1]
524         retl
525          nop
526 ENDPROC(sun4v_ldc_copy)
527
528         /* %o0: channel
529          * %o1: cookie
530          * %o2: pointer to unsigned long ra
531          * %o3: pointer to unsigned long perm
532          *
533          * returns %o0: status
534          */
535 ENTRY(sun4v_ldc_mapin)
536         mov     %o2, %g1
537         mov     %o3, %g2
538         mov     HV_FAST_LDC_MAPIN, %o5
539         ta      HV_FAST_TRAP
540         stx     %o1, [%g1]
541         stx     %o2, [%g2]
542         retl
543          nop
544 ENDPROC(sun4v_ldc_mapin)
545
546         /* %o0: ra
547          *
548          * returns %o0: status
549          */
550 ENTRY(sun4v_ldc_unmap)
551         mov     HV_FAST_LDC_UNMAP, %o5
552         ta      HV_FAST_TRAP
553         retl
554          nop
555 ENDPROC(sun4v_ldc_unmap)
556
557         /* %o0: channel
558          * %o1: cookie
559          * %o2: mte_cookie
560          *
561          * returns %o0: status
562          */
563 ENTRY(sun4v_ldc_revoke)
564         mov     HV_FAST_LDC_REVOKE, %o5
565         ta      HV_FAST_TRAP
566         retl
567          nop
568 ENDPROC(sun4v_ldc_revoke)
569
570         /* %o0: device handle
571          * %o1: device INO
572          * %o2: pointer to unsigned long cookie
573          *
574          * returns %o0: status
575          */
576 ENTRY(sun4v_vintr_get_cookie)
577         mov     %o2, %g1
578         mov     HV_FAST_VINTR_GET_COOKIE, %o5
579         ta      HV_FAST_TRAP
580         stx     %o1, [%g1]
581         retl
582          nop
583 ENDPROC(sun4v_vintr_get_cookie)
584
585         /* %o0: device handle
586          * %o1: device INO
587          * %o2: cookie
588          *
589          * returns %o0: status
590          */
591 ENTRY(sun4v_vintr_set_cookie)
592         mov     HV_FAST_VINTR_SET_COOKIE, %o5
593         ta      HV_FAST_TRAP
594         retl
595          nop
596 ENDPROC(sun4v_vintr_set_cookie)
597
598         /* %o0: device handle
599          * %o1: device INO
600          * %o2: pointer to unsigned long valid_state
601          *
602          * returns %o0: status
603          */
604 ENTRY(sun4v_vintr_get_valid)
605         mov     %o2, %g1
606         mov     HV_FAST_VINTR_GET_VALID, %o5
607         ta      HV_FAST_TRAP
608         stx     %o1, [%g1]
609         retl
610          nop
611 ENDPROC(sun4v_vintr_get_valid)
612
613         /* %o0: device handle
614          * %o1: device INO
615          * %o2: valid_state
616          *
617          * returns %o0: status
618          */
619 ENTRY(sun4v_vintr_set_valid)
620         mov     HV_FAST_VINTR_SET_VALID, %o5
621         ta      HV_FAST_TRAP
622         retl
623          nop
624 ENDPROC(sun4v_vintr_set_valid)
625
626         /* %o0: device handle
627          * %o1: device INO
628          * %o2: pointer to unsigned long state
629          *
630          * returns %o0: status
631          */
632 ENTRY(sun4v_vintr_get_state)
633         mov     %o2, %g1
634         mov     HV_FAST_VINTR_GET_STATE, %o5
635         ta      HV_FAST_TRAP
636         stx     %o1, [%g1]
637         retl
638          nop
639 ENDPROC(sun4v_vintr_get_state)
640
641         /* %o0: device handle
642          * %o1: device INO
643          * %o2: state
644          *
645          * returns %o0: status
646          */
647 ENTRY(sun4v_vintr_set_state)
648         mov     HV_FAST_VINTR_SET_STATE, %o5
649         ta      HV_FAST_TRAP
650         retl
651          nop
652 ENDPROC(sun4v_vintr_set_state)
653
654         /* %o0: device handle
655          * %o1: device INO
656          * %o2: pointer to unsigned long cpuid
657          *
658          * returns %o0: status
659          */
660 ENTRY(sun4v_vintr_get_target)
661         mov     %o2, %g1
662         mov     HV_FAST_VINTR_GET_TARGET, %o5
663         ta      HV_FAST_TRAP
664         stx     %o1, [%g1]
665         retl
666          nop
667 ENDPROC(sun4v_vintr_get_target)
668
669         /* %o0: device handle
670          * %o1: device INO
671          * %o2: cpuid
672          *
673          * returns %o0: status
674          */
675 ENTRY(sun4v_vintr_set_target)
676         mov     HV_FAST_VINTR_SET_TARGET, %o5
677         ta      HV_FAST_TRAP
678         retl
679          nop
680 ENDPROC(sun4v_vintr_set_target)
681
682         /* %o0: NCS sub-function
683          * %o1: sub-function arg real-address
684          * %o2: sub-function arg size
685          *
686          * returns %o0: status
687          */
688 ENTRY(sun4v_ncs_request)
689         mov     HV_FAST_NCS_REQUEST, %o5
690         ta      HV_FAST_TRAP
691         retl
692          nop
693 ENDPROC(sun4v_ncs_request)
694
695 ENTRY(sun4v_svc_send)
696         save    %sp, -192, %sp
697         mov     %i0, %o0
698         mov     %i1, %o1
699         mov     %i2, %o2
700         mov     HV_FAST_SVC_SEND, %o5
701         ta      HV_FAST_TRAP
702         stx     %o1, [%i3]
703         ret
704         restore
705 ENDPROC(sun4v_svc_send)
706
707 ENTRY(sun4v_svc_recv)
708         save    %sp, -192, %sp
709         mov     %i0, %o0
710         mov     %i1, %o1
711         mov     %i2, %o2
712         mov     HV_FAST_SVC_RECV, %o5
713         ta      HV_FAST_TRAP
714         stx     %o1, [%i3]
715         ret
716         restore
717 ENDPROC(sun4v_svc_recv)
718
719 ENTRY(sun4v_svc_getstatus)
720         mov     HV_FAST_SVC_GETSTATUS, %o5
721         mov     %o1, %o4
722         ta      HV_FAST_TRAP
723         stx     %o1, [%o4]
724         retl
725          nop
726 ENDPROC(sun4v_svc_getstatus)
727
728 ENTRY(sun4v_svc_setstatus)
729         mov     HV_FAST_SVC_SETSTATUS, %o5
730         ta      HV_FAST_TRAP
731         retl
732          nop
733 ENDPROC(sun4v_svc_setstatus)
734
735 ENTRY(sun4v_svc_clrstatus)
736         mov     HV_FAST_SVC_CLRSTATUS, %o5
737         ta      HV_FAST_TRAP
738         retl
739          nop
740 ENDPROC(sun4v_svc_clrstatus)
741
742 ENTRY(sun4v_mmustat_conf)
743         mov     %o1, %o4
744         mov     HV_FAST_MMUSTAT_CONF, %o5
745         ta      HV_FAST_TRAP
746         stx     %o1, [%o4]
747         retl
748          nop
749 ENDPROC(sun4v_mmustat_conf)
750
751 ENTRY(sun4v_mmustat_info)
752         mov     %o0, %o4
753         mov     HV_FAST_MMUSTAT_INFO, %o5
754         ta      HV_FAST_TRAP
755         stx     %o1, [%o4]
756         retl
757          nop
758 ENDPROC(sun4v_mmustat_info)
759
760 ENTRY(sun4v_mmu_demap_all)
761         clr     %o0
762         clr     %o1
763         mov     HV_MMU_ALL, %o2
764         mov     HV_FAST_MMU_DEMAP_ALL, %o5
765         ta      HV_FAST_TRAP
766         retl
767          nop
768 ENDPROC(sun4v_mmu_demap_all)