Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /* pci_sun4v_asm: Hypervisor calls for PCI support.
0003  *
0004  * Copyright (C) 2006, 2008 David S. Miller <davem@davemloft.net>
0005  */
0006 
0007 #include <linux/linkage.h>
0008 #include <asm/hypervisor.h>
0009 
0010     /* %o0: devhandle
0011      * %o1: tsbid
0012      * %o2: num ttes
0013      * %o3: io_attributes
0014      * %o4: io_page_list phys address
0015      *
0016      * returns %o0: -status if status was non-zero, else
0017      *         %o0: num pages mapped
0018      */
0019 ENTRY(pci_sun4v_iommu_map)
0020     mov %o5, %g1
0021     mov HV_FAST_PCI_IOMMU_MAP, %o5
0022     ta  HV_FAST_TRAP
0023     brnz,pn %o0, 1f
0024      sub    %g0, %o0, %o0
0025     mov %o1, %o0
0026 1:  retl
0027      nop
0028 ENDPROC(pci_sun4v_iommu_map)
0029 
0030     /* %o0: devhandle
0031      * %o1: tsbid
0032      * %o2: num ttes
0033      *
0034      * returns %o0: num ttes demapped
0035      */
0036 ENTRY(pci_sun4v_iommu_demap)
0037     mov HV_FAST_PCI_IOMMU_DEMAP, %o5
0038     ta  HV_FAST_TRAP
0039     retl
0040      mov    %o1, %o0
0041 ENDPROC(pci_sun4v_iommu_demap)
0042 
0043     /* %o0: devhandle
0044      * %o1: tsbid
0045      * %o2: &io_attributes
0046      * %o3: &real_address
0047      *
0048      * returns %o0: status
0049      */
0050 ENTRY(pci_sun4v_iommu_getmap)
0051     mov %o2, %o4
0052     mov HV_FAST_PCI_IOMMU_GETMAP, %o5
0053     ta  HV_FAST_TRAP
0054     stx %o1, [%o4]
0055     stx %o2, [%o3]
0056     retl
0057      mov    %o0, %o0
0058 ENDPROC(pci_sun4v_iommu_getmap)
0059 
0060     /* %o0: devhandle
0061      * %o1: pci_device
0062      * %o2: pci_config_offset
0063      * %o3: size
0064      *
0065      * returns %o0: data
0066      *
0067      * If there is an error, the data will be returned
0068      * as all 1's.
0069      */
0070 ENTRY(pci_sun4v_config_get)
0071     mov HV_FAST_PCI_CONFIG_GET, %o5
0072     ta  HV_FAST_TRAP
0073     brnz,a,pn %o1, 1f
0074      mov    -1, %o2
0075 1:  retl
0076      mov    %o2, %o0
0077 ENDPROC(pci_sun4v_config_get)
0078 
0079     /* %o0: devhandle
0080      * %o1: pci_device
0081      * %o2: pci_config_offset
0082      * %o3: size
0083      * %o4: data
0084      *
0085      * returns %o0: status
0086      *
0087      * status will be zero if the operation completed
0088      * successfully, else -1 if not
0089      */
0090 ENTRY(pci_sun4v_config_put)
0091     mov HV_FAST_PCI_CONFIG_PUT, %o5
0092     ta  HV_FAST_TRAP
0093     brnz,a,pn %o1, 1f
0094      mov    -1, %o1
0095 1:  retl
0096      mov    %o1, %o0
0097 ENDPROC(pci_sun4v_config_put)
0098 
0099     /* %o0: devhandle
0100      * %o1: msiqid
0101      * %o2: msiq phys address
0102      * %o3: num entries
0103      *
0104      * returns %o0: status
0105      *
0106      * status will be zero if the operation completed
0107      * successfully, else -1 if not
0108      */
0109 ENTRY(pci_sun4v_msiq_conf)
0110     mov HV_FAST_PCI_MSIQ_CONF, %o5
0111     ta  HV_FAST_TRAP
0112     retl
0113      mov    %o0, %o0
0114 ENDPROC(pci_sun4v_msiq_conf)
0115 
0116     /* %o0: devhandle
0117      * %o1: msiqid
0118      * %o2: &msiq_phys_addr
0119      * %o3: &msiq_num_entries
0120      *
0121      * returns %o0: status
0122      */
0123 ENTRY(pci_sun4v_msiq_info)
0124     mov %o2, %o4
0125     mov HV_FAST_PCI_MSIQ_INFO, %o5
0126     ta  HV_FAST_TRAP
0127     stx %o1, [%o4]
0128     stx %o2, [%o3]
0129     retl
0130      mov    %o0, %o0
0131 ENDPROC(pci_sun4v_msiq_info)
0132 
0133     /* %o0: devhandle
0134      * %o1: msiqid
0135      * %o2: &valid
0136      *
0137      * returns %o0: status
0138      */
0139 ENTRY(pci_sun4v_msiq_getvalid)
0140     mov HV_FAST_PCI_MSIQ_GETVALID, %o5
0141     ta  HV_FAST_TRAP
0142     stx %o1, [%o2]
0143     retl
0144      mov    %o0, %o0
0145 ENDPROC(pci_sun4v_msiq_getvalid)
0146 
0147     /* %o0: devhandle
0148      * %o1: msiqid
0149      * %o2: valid
0150      *
0151      * returns %o0: status
0152      */
0153 ENTRY(pci_sun4v_msiq_setvalid)
0154     mov HV_FAST_PCI_MSIQ_SETVALID, %o5
0155     ta  HV_FAST_TRAP
0156     retl
0157      mov    %o0, %o0
0158 ENDPROC(pci_sun4v_msiq_setvalid)
0159 
0160     /* %o0: devhandle
0161      * %o1: msiqid
0162      * %o2: &state
0163      *
0164      * returns %o0: status
0165      */
0166 ENTRY(pci_sun4v_msiq_getstate)
0167     mov HV_FAST_PCI_MSIQ_GETSTATE, %o5
0168     ta  HV_FAST_TRAP
0169     stx %o1, [%o2]
0170     retl
0171      mov    %o0, %o0
0172 ENDPROC(pci_sun4v_msiq_getstate)
0173 
0174     /* %o0: devhandle
0175      * %o1: msiqid
0176      * %o2: state
0177      *
0178      * returns %o0: status
0179      */
0180 ENTRY(pci_sun4v_msiq_setstate)
0181     mov HV_FAST_PCI_MSIQ_SETSTATE, %o5
0182     ta  HV_FAST_TRAP
0183     retl
0184      mov    %o0, %o0
0185 ENDPROC(pci_sun4v_msiq_setstate)
0186 
0187     /* %o0: devhandle
0188      * %o1: msiqid
0189      * %o2: &head
0190      *
0191      * returns %o0: status
0192      */
0193 ENTRY(pci_sun4v_msiq_gethead)
0194     mov HV_FAST_PCI_MSIQ_GETHEAD, %o5
0195     ta  HV_FAST_TRAP
0196     stx %o1, [%o2]
0197     retl
0198      mov    %o0, %o0
0199 ENDPROC(pci_sun4v_msiq_gethead)
0200 
0201     /* %o0: devhandle
0202      * %o1: msiqid
0203      * %o2: head
0204      *
0205      * returns %o0: status
0206      */
0207 ENTRY(pci_sun4v_msiq_sethead)
0208     mov HV_FAST_PCI_MSIQ_SETHEAD, %o5
0209     ta  HV_FAST_TRAP
0210     retl
0211      mov    %o0, %o0
0212 ENDPROC(pci_sun4v_msiq_sethead)
0213 
0214     /* %o0: devhandle
0215      * %o1: msiqid
0216      * %o2: &tail
0217      *
0218      * returns %o0: status
0219      */
0220 ENTRY(pci_sun4v_msiq_gettail)
0221     mov HV_FAST_PCI_MSIQ_GETTAIL, %o5
0222     ta  HV_FAST_TRAP
0223     stx %o1, [%o2]
0224     retl
0225      mov    %o0, %o0
0226 ENDPROC(pci_sun4v_msiq_gettail)
0227 
0228     /* %o0: devhandle
0229      * %o1: msinum
0230      * %o2: &valid
0231      *
0232      * returns %o0: status
0233      */
0234 ENTRY(pci_sun4v_msi_getvalid)
0235     mov HV_FAST_PCI_MSI_GETVALID, %o5
0236     ta  HV_FAST_TRAP
0237     stx %o1, [%o2]
0238     retl
0239      mov    %o0, %o0
0240 ENDPROC(pci_sun4v_msi_getvalid)
0241 
0242     /* %o0: devhandle
0243      * %o1: msinum
0244      * %o2: valid
0245      *
0246      * returns %o0: status
0247      */
0248 ENTRY(pci_sun4v_msi_setvalid)
0249     mov HV_FAST_PCI_MSI_SETVALID, %o5
0250     ta  HV_FAST_TRAP
0251     retl
0252      mov    %o0, %o0
0253 ENDPROC(pci_sun4v_msi_setvalid)
0254 
0255     /* %o0: devhandle
0256      * %o1: msinum
0257      * %o2: &msiq
0258      *
0259      * returns %o0: status
0260      */
0261 ENTRY(pci_sun4v_msi_getmsiq)
0262     mov HV_FAST_PCI_MSI_GETMSIQ, %o5
0263     ta  HV_FAST_TRAP
0264     stx %o1, [%o2]
0265     retl
0266      mov    %o0, %o0
0267 ENDPROC(pci_sun4v_msi_getmsiq)
0268 
0269     /* %o0: devhandle
0270      * %o1: msinum
0271      * %o2: msitype
0272      * %o3: msiq
0273      *
0274      * returns %o0: status
0275      */
0276 ENTRY(pci_sun4v_msi_setmsiq)
0277     mov HV_FAST_PCI_MSI_SETMSIQ, %o5
0278     ta  HV_FAST_TRAP
0279     retl
0280      mov    %o0, %o0
0281 ENDPROC(pci_sun4v_msi_setmsiq)
0282 
0283     /* %o0: devhandle
0284      * %o1: msinum
0285      * %o2: &state
0286      *
0287      * returns %o0: status
0288      */
0289 ENTRY(pci_sun4v_msi_getstate)
0290     mov HV_FAST_PCI_MSI_GETSTATE, %o5
0291     ta  HV_FAST_TRAP
0292     stx %o1, [%o2]
0293     retl
0294      mov    %o0, %o0
0295 ENDPROC(pci_sun4v_msi_getstate)
0296 
0297     /* %o0: devhandle
0298      * %o1: msinum
0299      * %o2: state
0300      *
0301      * returns %o0: status
0302      */
0303 ENTRY(pci_sun4v_msi_setstate)
0304     mov HV_FAST_PCI_MSI_SETSTATE, %o5
0305     ta  HV_FAST_TRAP
0306     retl
0307      mov    %o0, %o0
0308 ENDPROC(pci_sun4v_msi_setstate)
0309 
0310     /* %o0: devhandle
0311      * %o1: msinum
0312      * %o2: &msiq
0313      *
0314      * returns %o0: status
0315      */
0316 ENTRY(pci_sun4v_msg_getmsiq)
0317     mov HV_FAST_PCI_MSG_GETMSIQ, %o5
0318     ta  HV_FAST_TRAP
0319     stx %o1, [%o2]
0320     retl
0321      mov    %o0, %o0
0322 ENDPROC(pci_sun4v_msg_getmsiq)
0323 
0324     /* %o0: devhandle
0325      * %o1: msinum
0326      * %o2: msiq
0327      *
0328      * returns %o0: status
0329      */
0330 ENTRY(pci_sun4v_msg_setmsiq)
0331     mov HV_FAST_PCI_MSG_SETMSIQ, %o5
0332     ta  HV_FAST_TRAP
0333     retl
0334      mov    %o0, %o0
0335 ENDPROC(pci_sun4v_msg_setmsiq)
0336 
0337     /* %o0: devhandle
0338      * %o1: msinum
0339      * %o2: &valid
0340      *
0341      * returns %o0: status
0342      */
0343 ENTRY(pci_sun4v_msg_getvalid)
0344     mov HV_FAST_PCI_MSG_GETVALID, %o5
0345     ta  HV_FAST_TRAP
0346     stx %o1, [%o2]
0347     retl
0348      mov    %o0, %o0
0349 ENDPROC(pci_sun4v_msg_getvalid)
0350 
0351     /* %o0: devhandle
0352      * %o1: msinum
0353      * %o2: valid
0354      *
0355      * returns %o0: status
0356      */
0357 ENTRY(pci_sun4v_msg_setvalid)
0358     mov HV_FAST_PCI_MSG_SETVALID, %o5
0359     ta  HV_FAST_TRAP
0360     retl
0361      mov    %o0, %o0
0362 ENDPROC(pci_sun4v_msg_setvalid)
0363 
0364     /*
0365      * %o0: devhandle
0366      * %o1: r_addr
0367      * %o2: size
0368      * %o3: pagesize
0369      * %o4: virt
0370      * %o5: &iotsb_num/&iotsb_handle
0371      *
0372      * returns %o0: status
0373      *         %o1: iotsb_num/iotsb_handle
0374      */
0375 ENTRY(pci_sun4v_iotsb_conf)
0376     mov %o5, %g1
0377     mov HV_FAST_PCI_IOTSB_CONF, %o5
0378     ta  HV_FAST_TRAP
0379     retl
0380      stx    %o1, [%g1]
0381 ENDPROC(pci_sun4v_iotsb_conf)
0382 
0383     /*
0384      * %o0: devhandle
0385      * %o1: iotsb_num/iotsb_handle
0386      * %o2: pci_device
0387      *
0388      * returns %o0: status
0389      */
0390 ENTRY(pci_sun4v_iotsb_bind)
0391     mov HV_FAST_PCI_IOTSB_BIND, %o5
0392     ta  HV_FAST_TRAP
0393     retl
0394      nop
0395 ENDPROC(pci_sun4v_iotsb_bind)
0396 
0397     /*
0398      * %o0: devhandle
0399      * %o1: iotsb_num/iotsb_handle
0400      * %o2: index_count
0401      * %o3: iotte_attributes
0402      * %o4: io_page_list_p
0403      * %o5: &mapped
0404      *
0405      * returns %o0: status
0406      *         %o1: #mapped
0407      */
0408 ENTRY(pci_sun4v_iotsb_map)
0409     mov %o5, %g1
0410     mov HV_FAST_PCI_IOTSB_MAP, %o5
0411     ta  HV_FAST_TRAP
0412     retl
0413      stx    %o1, [%g1]
0414 ENDPROC(pci_sun4v_iotsb_map)
0415 
0416     /*
0417      * %o0: devhandle
0418      * %o1: iotsb_num/iotsb_handle
0419      * %o2: iotsb_index
0420      * %o3: #iottes
0421      * %o4: &demapped
0422      *
0423      * returns %o0: status
0424      *         %o1: #demapped
0425      */
0426 ENTRY(pci_sun4v_iotsb_demap)
0427     mov HV_FAST_PCI_IOTSB_DEMAP, %o5
0428     ta  HV_FAST_TRAP
0429     retl
0430      stx    %o1, [%o4]
0431 ENDPROC(pci_sun4v_iotsb_demap)