/* SPDX-License-Identifier: GPL-2.0 */
/* pci_sun4v_asm: Hypervisor calls for PCI support.
*
* Copyright ( C ) 2006 , 2008 David S . Miller < davem @ davemloft . net >
*/
#include <linux/linkage.h>
#include <asm/hypervisor.h>
/* %o0: devhandle
* % o1 : tsbid
* % o2 : num ttes
* % o3 : io_attributes
* % o4 : io_page_list phys address
*
* returns % o0 : - status if status was non - zero , else
* % o0 : num pages mapped
*/
ENTRY(pci_sun4v_iommu_map)
mov %o5, %g1
mov HV_FAST_PCI_IOMMU_MAP, %o5
ta HV_FAST_TRAP
brnz,pn %o0, 1 f
sub %g0, %o0, %o0
mov %o1, %o0
1 : retl
nop
ENDPROC(pci_sun4v_iommu_map)
/* %o0: devhandle
* % o1 : tsbid
* % o2 : num ttes
*
* returns % o0 : num ttes demapped
*/
ENTRY(pci_sun4v_iommu_demap)
mov HV_FAST_PCI_IOMMU_DEMAP, %o5
ta HV_FAST_TRAP
retl
mov %o1, %o0
ENDPROC(pci_sun4v_iommu_demap)
/* %o0: devhandle
* % o1 : tsbid
* % o2 : & io_attributes
* % o3 : & real_address
*
* returns % o0 : status
*/
ENTRY(pci_sun4v_iommu_getmap)
mov %o2, %o4
mov HV_FAST_PCI_IOMMU_GETMAP, %o5
ta HV_FAST_TRAP
stx %o1, [%o4]
stx %o2, [%o3]
retl
mov %o0, %o0
ENDPROC(pci_sun4v_iommu_getmap)
/* %o0: devhandle
* % o1 : pci_device
* % o2 : pci_config_offset
* % o3 : size
*
* returns % o0 : data
*
* If there is an error , the data will be returned
* as all 1 ' s .
*/
ENTRY(pci_sun4v_config_get)
mov HV_FAST_PCI_CONFIG_GET, %o5
ta HV_FAST_TRAP
brnz,a,pn %o1, 1 f
mov -1 , %o2
1 : retl
mov %o2, %o0
ENDPROC(pci_sun4v_config_get)
/* %o0: devhandle
* % o1 : pci_device
* % o2 : pci_config_offset
* % o3 : size
* % o4 : data
*
* returns % o0 : status
*
* status will be zero if the operation completed
* successfully , else - 1 if not
*/
ENTRY(pci_sun4v_config_put)
mov HV_FAST_PCI_CONFIG_PUT, %o5
ta HV_FAST_TRAP
brnz,a,pn %o1, 1 f
mov -1 , %o1
1 : retl
mov %o1, %o0
ENDPROC(pci_sun4v_config_put)
/* %o0: devhandle
* % o1 : msiqid
* % o2 : msiq phys address
* % o3 : num entries
*
* returns % o0 : status
*
* status will be zero if the operation completed
* successfully , else - 1 if not
*/
ENTRY(pci_sun4v_msiq_conf)
mov HV_FAST_PCI_MSIQ_CONF, %o5
ta HV_FAST_TRAP
retl
mov %o0, %o0
ENDPROC(pci_sun4v_msiq_conf)
/* %o0: devhandle
* % o1 : msiqid
* % o2 : & msiq_phys_addr
* % o3 : & msiq_num_entries
*
* returns % o0 : status
*/
ENTRY(pci_sun4v_msiq_info)
mov %o2, %o4
mov HV_FAST_PCI_MSIQ_INFO, %o5
ta HV_FAST_TRAP
stx %o1, [%o4]
stx %o2, [%o3]
retl
mov %o0, %o0
ENDPROC(pci_sun4v_msiq_info)
/* %o0: devhandle
* % o1 : msiqid
* % o2 : & valid
*
* returns % o0 : status
*/
ENTRY(pci_sun4v_msiq_getvalid)
mov HV_FAST_PCI_MSIQ_GETVALID, %o5
ta HV_FAST_TRAP
stx %o1, [%o2]
retl
mov %o0, %o0
ENDPROC(pci_sun4v_msiq_getvalid)
/* %o0: devhandle
* % o1 : msiqid
* % o2 : valid
*
* returns % o0 : status
*/
ENTRY(pci_sun4v_msiq_setvalid)
mov HV_FAST_PCI_MSIQ_SETVALID, %o5
ta HV_FAST_TRAP
retl
mov %o0, %o0
ENDPROC(pci_sun4v_msiq_setvalid)
/* %o0: devhandle
* % o1 : msiqid
* % o2 : & state
*
* returns % o0 : status
*/
ENTRY(pci_sun4v_msiq_getstate)
mov HV_FAST_PCI_MSIQ_GETSTATE, %o5
ta HV_FAST_TRAP
stx %o1, [%o2]
retl
mov %o0, %o0
ENDPROC(pci_sun4v_msiq_getstate)
/* %o0: devhandle
* % o1 : msiqid
* % o2 : state
*
* returns % o0 : status
*/
ENTRY(pci_sun4v_msiq_setstate)
mov HV_FAST_PCI_MSIQ_SETSTATE, %o5
ta HV_FAST_TRAP
retl
mov %o0, %o0
ENDPROC(pci_sun4v_msiq_setstate)
/* %o0: devhandle
* % o1 : msiqid
* % o2 : & head
*
* returns % o0 : status
*/
ENTRY(pci_sun4v_msiq_gethead)
mov HV_FAST_PCI_MSIQ_GETHEAD, %o5
ta HV_FAST_TRAP
stx %o1, [%o2]
retl
mov %o0, %o0
ENDPROC(pci_sun4v_msiq_gethead)
/* %o0: devhandle
* % o1 : msiqid
* % o2 : head
*
* returns % o0 : status
*/
ENTRY(pci_sun4v_msiq_sethead)
mov HV_FAST_PCI_MSIQ_SETHEAD, %o5
ta HV_FAST_TRAP
retl
mov %o0, %o0
ENDPROC(pci_sun4v_msiq_sethead)
/* %o0: devhandle
* % o1 : msiqid
* % o2 : & tail
*
* returns % o0 : status
*/
ENTRY(pci_sun4v_msiq_gettail)
mov HV_FAST_PCI_MSIQ_GETTAIL, %o5
ta HV_FAST_TRAP
stx %o1, [%o2]
retl
mov %o0, %o0
ENDPROC(pci_sun4v_msiq_gettail)
/* %o0: devhandle
* % o1 : msinum
* % o2 : & valid
*
* returns % o0 : status
*/
ENTRY(pci_sun4v_msi_getvalid)
mov HV_FAST_PCI_MSI_GETVALID, %o5
ta HV_FAST_TRAP
stx %o1, [%o2]
retl
mov %o0, %o0
ENDPROC(pci_sun4v_msi_getvalid)
/* %o0: devhandle
* % o1 : msinum
* % o2 : valid
*
* returns % o0 : status
*/
ENTRY(pci_sun4v_msi_setvalid)
mov HV_FAST_PCI_MSI_SETVALID, %o5
ta HV_FAST_TRAP
retl
mov %o0, %o0
ENDPROC(pci_sun4v_msi_setvalid)
/* %o0: devhandle
* % o1 : msinum
* % o2 : & msiq
*
* returns % o0 : status
*/
ENTRY(pci_sun4v_msi_getmsiq)
mov HV_FAST_PCI_MSI_GETMSIQ, %o5
ta HV_FAST_TRAP
stx %o1, [%o2]
retl
mov %o0, %o0
ENDPROC(pci_sun4v_msi_getmsiq)
/* %o0: devhandle
* % o1 : msinum
* % o2 : msitype
* % o3 : msiq
*
* returns % o0 : status
*/
ENTRY(pci_sun4v_msi_setmsiq)
mov HV_FAST_PCI_MSI_SETMSIQ, %o5
ta HV_FAST_TRAP
retl
mov %o0, %o0
ENDPROC(pci_sun4v_msi_setmsiq)
/* %o0: devhandle
* % o1 : msinum
* % o2 : & state
*
* returns % o0 : status
*/
ENTRY(pci_sun4v_msi_getstate)
mov HV_FAST_PCI_MSI_GETSTATE, %o5
ta HV_FAST_TRAP
stx %o1, [%o2]
retl
mov %o0, %o0
ENDPROC(pci_sun4v_msi_getstate)
/* %o0: devhandle
* % o1 : msinum
* % o2 : state
*
* returns % o0 : status
*/
ENTRY(pci_sun4v_msi_setstate)
mov HV_FAST_PCI_MSI_SETSTATE, %o5
ta HV_FAST_TRAP
retl
mov %o0, %o0
ENDPROC(pci_sun4v_msi_setstate)
/* %o0: devhandle
* % o1 : msinum
* % o2 : & msiq
*
* returns % o0 : status
*/
ENTRY(pci_sun4v_msg_getmsiq)
mov HV_FAST_PCI_MSG_GETMSIQ, %o5
ta HV_FAST_TRAP
stx %o1, [%o2]
retl
mov %o0, %o0
ENDPROC(pci_sun4v_msg_getmsiq)
/* %o0: devhandle
* % o1 : msinum
* % o2 : msiq
*
* returns % o0 : status
*/
ENTRY(pci_sun4v_msg_setmsiq)
mov HV_FAST_PCI_MSG_SETMSIQ, %o5
ta HV_FAST_TRAP
retl
mov %o0, %o0
ENDPROC(pci_sun4v_msg_setmsiq)
/* %o0: devhandle
* % o1 : msinum
* % o2 : & valid
*
* returns % o0 : status
*/
ENTRY(pci_sun4v_msg_getvalid)
mov HV_FAST_PCI_MSG_GETVALID, %o5
ta HV_FAST_TRAP
stx %o1, [%o2]
retl
mov %o0, %o0
ENDPROC(pci_sun4v_msg_getvalid)
/* %o0: devhandle
* % o1 : msinum
* % o2 : valid
*
* returns % o0 : status
*/
ENTRY(pci_sun4v_msg_setvalid)
mov HV_FAST_PCI_MSG_SETVALID, %o5
ta HV_FAST_TRAP
retl
mov %o0, %o0
ENDPROC(pci_sun4v_msg_setvalid)
/*
* % o0 : devhandle
* % o1 : r_addr
* % o2 : size
* % o3 : pagesize
* % o4 : virt
* % o5 : & iotsb_num / & iotsb_handle
*
* returns % o0 : status
* % o1 : iotsb_num / iotsb_handle
*/
ENTRY(pci_sun4v_iotsb_conf)
mov %o5, %g1
mov HV_FAST_PCI_IOTSB_CONF, %o5
ta HV_FAST_TRAP
retl
stx %o1, [%g1]
ENDPROC(pci_sun4v_iotsb_conf)
/*
* % o0 : devhandle
* % o1 : iotsb_num / iotsb_handle
* % o2 : pci_device
*
* returns % o0 : status
*/
ENTRY(pci_sun4v_iotsb_bind)
mov HV_FAST_PCI_IOTSB_BIND, %o5
ta HV_FAST_TRAP
retl
nop
ENDPROC(pci_sun4v_iotsb_bind)
/*
* % o0 : devhandle
* % o1 : iotsb_num / iotsb_handle
* % o2 : index_count
* % o3 : iotte_attributes
* % o4 : io_page_list_p
* % o5 : & mapped
*
* returns % o0 : status
* % o1 : # mapped
*/
ENTRY(pci_sun4v_iotsb_map)
mov %o5, %g1
mov HV_FAST_PCI_IOTSB_MAP, %o5
ta HV_FAST_TRAP
retl
stx %o1, [%g1]
ENDPROC(pci_sun4v_iotsb_map)
/*
* % o0 : devhandle
* % o1 : iotsb_num / iotsb_handle
* % o2 : iotsb_index
* % o3 : # iottes
* % o4 : & demapped
*
* returns % o0 : status
* % o1 : # demapped
*/
ENTRY(pci_sun4v_iotsb_demap)
mov HV_FAST_PCI_IOTSB_DEMAP, %o5
ta HV_FAST_TRAP
retl
stx %o1, [%o4]
ENDPROC(pci_sun4v_iotsb_demap)
Messung V0.5 in Prozent C=94 H=98 G=95
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-09-28)
¤
*© Formatika GbR, Deutschland