1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 
  26 
  27 /*
  28  * Hypervisor calls called by px nexus driver.
  29 */
  30 
  31 #include <sys/asm_linkage.h>
  32 #include <sys/hypervisor_api.h>
  33 #include <sys/dditypes.h>
  34 #include <px_ioapi.h>
  35 #include "px_lib4v.h"
  36 
  37 #if defined(lint) || defined(__lint)
  38 
  39 /*ARGSUSED*/
  40 uint64_t
  41 hvio_iommu_map(devhandle_t dev_hdl, tsbid_t tsbid, pages_t pages,
  42     io_attributes_t attr, io_page_list_t *io_page_list_p,
  43     pages_t *pages_mapped)
  44 { return (0); }
  45 
  46 /*ARGSUSED*/
  47 uint64_t
  48 hvio_iommu_demap(devhandle_t dev_hdl, tsbid_t tsbid, pages_t pages,
  49     pages_t *pages_demapped)
  50 { return (0); }
  51 
  52 /*ARGSUSED*/
  53 uint64_t
  54 hvio_iommu_getmap(devhandle_t dev_hdl, tsbid_t tsbid, io_attributes_t *attr_p,
  55     r_addr_t *r_addr_p)
  56 { return (0); }
  57 
  58 /*ARGSUSED*/
  59 uint64_t
  60 hvio_iommu_getbypass(devhandle_t dev_hdl, r_addr_t ra, io_attributes_t attr,
  61     io_addr_t *io_addr_p)
  62 { return (0); }
  63 
  64 /*ARGSUSED*/
  65 uint64_t
  66 hvio_peek(devhandle_t dev_hdl, r_addr_t ra, size_t size, uint32_t *status,
  67     uint64_t *data_p)
  68 { return (0); }
  69 
  70 /*ARGSUSED*/
  71 uint64_t
  72 hvio_poke(devhandle_t dev_hdl, r_addr_t ra, uint64_t sizes, uint64_t data,
  73     r_addr_t ra2, uint32_t *rdbk_status)
  74 { return (0); }
  75 
  76 /*ARGSUSED*/
  77 uint64_t
  78 hvio_dma_sync(devhandle_t dev_hdl, r_addr_t ra, size_t num_bytes,
  79     io_sync_direction_t io_sync_direction, size_t *bytes_synched)
  80 { return (0); }
  81 
  82 /*ARGSUSED*/
  83 uint64_t
  84 hvio_msiq_conf(devhandle_t dev_hdl, msiqid_t msiq_id, r_addr_t ra,
  85     uint_t msiq_rec_cnt)
  86 { return (0); }
  87 
  88 /*ARGSUSED*/
  89 uint64_t
  90 hvio_msiq_info(devhandle_t dev_hdl, msiqid_t msiq_id, r_addr_t *r_addr_p,
  91     uint_t *msiq_rec_cnt_p)
  92 { return (0); }
  93         
  94 /*ARGSUSED*/
  95 uint64_t
  96 hvio_msiq_getvalid(devhandle_t dev_hdl, msiqid_t msiq_id,
  97     pci_msiq_valid_state_t *msiq_valid_state)
  98 { return (0); }
  99 
 100 /*ARGSUSED*/
 101 uint64_t
 102 hvio_msiq_setvalid(devhandle_t dev_hdl, msiqid_t msiq_id,
 103     pci_msiq_valid_state_t msiq_valid_state)
 104 { return (0); }
 105 
 106 /*ARGSUSED*/
 107 uint64_t
 108 hvio_msiq_getstate(devhandle_t dev_hdl, msiqid_t msiq_id,
 109     pci_msiq_state_t *msiq_state)
 110 { return (0); }
 111 
 112 /*ARGSUSED*/
 113 uint64_t
 114 hvio_msiq_setstate(devhandle_t dev_hdl, msiqid_t msiq_id,
 115     pci_msiq_state_t msiq_state)
 116 { return (0); }
 117 
 118 /*ARGSUSED*/
 119 uint64_t
 120 hvio_msiq_gethead(devhandle_t dev_hdl, msiqid_t msiq_id,
 121     msiqhead_t *msiq_head)
 122 { return (0); }
 123 
 124 /*ARGSUSED*/
 125 uint64_t
 126 hvio_msiq_sethead(devhandle_t dev_hdl, msiqid_t msiq_id,
 127     msiqhead_t msiq_head)
 128 { return (0); }
 129 
 130 /*ARGSUSED*/
 131 uint64_t
 132 hvio_msiq_gettail(devhandle_t dev_hdl, msiqid_t msiq_id,
 133     msiqtail_t *msiq_tail)
 134 { return (0); }
 135 
 136 /*ARGSUSED*/
 137 uint64_t
 138 hvio_msi_getmsiq(devhandle_t dev_hdl, msinum_t msi_num,
 139     msiqid_t *msiq_id)
 140 { return (0); }
 141 
 142 /*ARGSUSED*/
 143 uint64_t
 144 hvio_msi_setmsiq(devhandle_t dev_hdl, msinum_t msi_num,
 145     msiqid_t msiq_id, msi_type_t msitype)
 146 { return (0); }
 147 
 148 /*ARGSUSED*/
 149 uint64_t
 150 hvio_msi_getvalid(devhandle_t dev_hdl, msinum_t msi_num,
 151     pci_msi_valid_state_t *msi_valid_state)
 152 { return (0); }
 153 
 154 /*ARGSUSED*/
 155 uint64_t
 156 hvio_msi_setvalid(devhandle_t dev_hdl, msinum_t msi_num,
 157     pci_msi_valid_state_t msi_valid_state)
 158 { return (0); }
 159 
 160 /*ARGSUSED*/
 161 uint64_t
 162 hvio_msi_getstate(devhandle_t dev_hdl, msinum_t msi_num,
 163     pci_msi_state_t *msi_state)
 164 { return (0); }
 165 
 166 /*ARGSUSED*/
 167 uint64_t
 168 hvio_msi_setstate(devhandle_t dev_hdl, msinum_t msi_num,
 169     pci_msi_state_t msi_state)
 170 { return (0); }
 171 
 172 /*ARGSUSED*/
 173 uint64_t
 174 hvio_msg_getmsiq(devhandle_t dev_hdl, pcie_msg_type_t msg_type,
 175     msiqid_t *msiq_id)
 176 { return (0); }
 177 
 178 /*ARGSUSED*/
 179 uint64_t
 180 hvio_msg_setmsiq(devhandle_t dev_hdl, pcie_msg_type_t msg_type,
 181     msiqid_t msiq_id)
 182 { return (0); }
 183 
 184 /*ARGSUSED*/
 185 uint64_t
 186 hvio_msg_getvalid(devhandle_t dev_hdl, pcie_msg_type_t msg_type,
 187     pcie_msg_valid_state_t *msg_valid_state)
 188 { return (0); }
 189 
 190 /*ARGSUSED*/
 191 uint64_t
 192 hvio_msg_setvalid(devhandle_t dev_hdl, pcie_msg_type_t msg_type,
 193     pcie_msg_valid_state_t msg_valid_state)
 194 { return (0); }
 195 
 196 /*ARGSUSED*/
 197 uint64_t
 198 pci_error_send(devhandle_t dev_hdl, devino_t devino, pci_device_t bdf)
 199 { return (0); }
 200 
 201 /*
 202  * First arg to both of these functions is a dummy, to accomodate how
 203  * hv_hpriv() works.
 204  */
 205 /*ARGSUSED*/
 206 int
 207 px_phys_acc_4v(uint64_t dummy, uint64_t from_addr, uint64_t to_addr)
 208 { return (0); }
 209 
 210 /*ARGSUSED*/
 211 uint64_t
 212 pci_iov_root_configured(devhandle_t dev_hdl)
 213 { return (0); }
 214 
 215 #else   /* lint || __lint */
 216 
 217         /*
 218          * arg0 - devhandle
 219          * arg1 - tsbid
 220          * arg2 - pages
 221          * arg3 - io_attributes
 222          * arg4 - io_page_list_p
 223          *
 224          * ret1 - pages_mapped
 225          */
 226         ENTRY(hvio_iommu_map)
 227         save    %sp, -SA(MINFRAME64), %sp
 228         mov     %i0, %o0
 229         mov     %i1, %o1
 230         mov     %i2, %o2
 231         mov     %i3, %o3
 232         mov     %i4, %o4
 233         mov     HVIO_IOMMU_MAP, %o5
 234         ta      FAST_TRAP
 235         brnz    %o0, 1f
 236         mov     %o0, %i0
 237         stuw    %o1, [%i5]
 238 1:
 239         ret
 240         restore
 241         SET_SIZE(hvio_iommu_map)
 242 
 243         /*
 244          * arg0 - devhandle
 245          * arg1 - tsbid
 246          * arg2 - pages
 247          *
 248          * ret1 - pages_demapped
 249          */
 250         ENTRY(hvio_iommu_demap)
 251         mov     HVIO_IOMMU_DEMAP, %o5
 252         ta      FAST_TRAP
 253         brz,a   %o0, 1f
 254         stuw    %o1, [%o3]
 255 1:      retl
 256         nop
 257         SET_SIZE(hvio_iommu_demap)
 258 
 259         /*
 260          * arg0 - devhandle
 261          * arg1 - tsbid
 262          *
 263          *
 264          * ret0 - status
 265          * ret1 - io_attributes
 266          * ret2 - r_addr
 267          */
 268         ENTRY(hvio_iommu_getmap)
 269         mov     %o2, %o4
 270         mov     HVIO_IOMMU_GETMAP, %o5
 271         ta      FAST_TRAP
 272         brnz    %o0, 1f
 273         nop
 274         stx     %o2, [%o3]
 275         st      %o1, [%o4]
 276 1:
 277         retl
 278         nop
 279         SET_SIZE(hvio_iommu_getmap)
 280 
 281         /*
 282          * arg0 - devhandle
 283          * arg1 - r_addr
 284          * arg2 - io_attributes
 285          *
 286          *
 287          * ret0 - status
 288          * ret1 - io_addr
 289          */
 290         ENTRY(hvio_iommu_getbypass)
 291         mov     HVIO_IOMMU_GETBYPASS, %o5
 292         ta      FAST_TRAP
 293         brz,a   %o0, 1f
 294         stx     %o1, [%o3]
 295 1:      retl
 296         nop
 297         SET_SIZE(hvio_iommu_getbypass)
 298 
 299         /*
 300          * arg0 - devhandle
 301          * arg1 - r_addr
 302          * arg2 - size
 303          *
 304          * ret1 - error_flag
 305          * ret2 - data
 306          */
 307         ENTRY(hvio_peek)
 308         mov     HVIO_PEEK, %o5
 309         ta      FAST_TRAP
 310         brnz    %o0, 1f
 311         nop
 312         stx     %o2, [%o4]
 313         st      %o1, [%o3]
 314 1:
 315         retl
 316         nop
 317         SET_SIZE(hvio_peek)
 318 
 319         /*
 320          * arg0 - devhandle
 321          * arg1 - r_addr
 322          * arg2 - sizes
 323          * arg3 - data
 324          * arg4 - r_addr2
 325          *
 326          * ret1 - error_flag
 327          */
 328         ENTRY(hvio_poke)
 329         save    %sp, -SA(MINFRAME64), %sp
 330         mov     %i0, %o0
 331         mov     %i1, %o1
 332         mov     %i2, %o2
 333         mov     %i3, %o3
 334         mov     %i4, %o4
 335         mov     HVIO_POKE, %o5
 336         ta      FAST_TRAP
 337         brnz    %o0, 1f
 338         mov     %o0, %i0
 339         stuw    %o1, [%i5]
 340 1:
 341         ret
 342         restore
 343         SET_SIZE(hvio_poke)
 344 
 345         /*
 346          * arg0 - devhandle
 347          * arg1 - r_addr
 348          * arg2 - num_bytes
 349          * arg3 - io_sync_direction
 350          *
 351          * ret0 - status
 352          * ret1 - bytes_synched
 353          */
 354         ENTRY(hvio_dma_sync)
 355         mov     HVIO_DMA_SYNC, %o5
 356         ta      FAST_TRAP
 357         brz,a   %o0, 1f
 358         stx     %o1, [%o4]
 359 1:      retl
 360         nop
 361         SET_SIZE(hvio_dma_sync)
 362 
 363         /*
 364          * arg0 - devhandle
 365          * arg1 - msiq_id
 366          * arg2 - r_addr
 367          * arg3 - nentries
 368          *
 369          * ret0 - status
 370          */
 371         ENTRY(hvio_msiq_conf)
 372         mov     HVIO_MSIQ_CONF, %o5
 373         ta      FAST_TRAP
 374         retl
 375         nop
 376         SET_SIZE(hvio_msiq_conf)
 377 
 378         /*
 379          * arg0 - devhandle
 380          * arg1 - msiq_id
 381          *
 382          * ret0 - status
 383          * ret1 - r_addr
 384          * ret1 - nentries
 385          */
 386         ENTRY(hvio_msiq_info)
 387         mov     %o2, %o4
 388         mov     HVIO_MSIQ_INFO, %o5
 389         ta      FAST_TRAP
 390         brnz    %o0, 1f
 391         nop
 392         stx     %o1, [%o4]
 393         stuw    %o2, [%o3]
 394 1:      retl
 395         nop
 396         SET_SIZE(hvio_msiq_info)
 397 
 398         /*
 399          * arg0 - devhandle
 400          * arg1 - msiq_id
 401          *
 402          * ret0 - status
 403          * ret1 - msiq_valid_state
 404          */
 405         ENTRY(hvio_msiq_getvalid)
 406         mov     HVIO_MSIQ_GETVALID, %o5
 407         ta      FAST_TRAP
 408         brz,a   %o0, 1f
 409         stuw    %o1, [%o2]
 410 1:      retl
 411         nop
 412         SET_SIZE(hvio_msiq_getvalid)
 413 
 414         /*
 415          * arg0 - devhandle
 416          * arg1 - msiq_id
 417          * arg2 - msiq_valid_state
 418          *
 419          * ret0 - status
 420          */
 421         ENTRY(hvio_msiq_setvalid)
 422         mov     HVIO_MSIQ_SETVALID, %o5
 423         ta      FAST_TRAP
 424         retl
 425         nop
 426         SET_SIZE(hvio_msiq_setvalid)
 427 
 428         /*
 429          * arg0 - devhandle
 430          * arg1 - msiq_id
 431          *
 432          * ret0 - status
 433          * ret1 - msiq_state
 434          */
 435         ENTRY(hvio_msiq_getstate)
 436         mov     HVIO_MSIQ_GETSTATE, %o5
 437         ta      FAST_TRAP
 438         brz,a   %o0, 1f
 439         stuw    %o1, [%o2]
 440 1:      retl
 441         nop
 442         SET_SIZE(hvio_msiq_getstate)
 443 
 444         /*
 445          * arg0 - devhandle
 446          * arg1 - msiq_id
 447          * arg2 - msiq_state
 448          *
 449          * ret0 - status
 450          */
 451         ENTRY(hvio_msiq_setstate)
 452         mov     HVIO_MSIQ_SETSTATE, %o5
 453         ta      FAST_TRAP
 454         retl
 455         nop
 456         SET_SIZE(hvio_msiq_setstate)
 457 
 458         /*
 459          * arg0 - devhandle
 460          * arg1 - msiq_id
 461          *
 462          * ret0 - status
 463          * ret1 - msiq_head
 464          */
 465         ENTRY(hvio_msiq_gethead)
 466         mov     HVIO_MSIQ_GETHEAD, %o5
 467         ta      FAST_TRAP
 468         brz,a   %o0, 1f
 469         stx     %o1, [%o2]
 470 1:      retl
 471         nop
 472         SET_SIZE(hvio_msiq_gethead)
 473 
 474         /*
 475          * arg0 - devhandle
 476          * arg1 - msiq_id
 477          * arg2 - msiq_head
 478          *
 479          * ret0 - status
 480          */
 481         ENTRY(hvio_msiq_sethead)
 482         mov     HVIO_MSIQ_SETHEAD, %o5
 483         ta      FAST_TRAP
 484         retl
 485         nop
 486         SET_SIZE(hvio_msiq_sethead)
 487 
 488         /*
 489          * arg0 - devhandle
 490          * arg1 - msiq_id
 491          *
 492          * ret0 - status
 493          * ret1 - msiq_tail
 494          */
 495         ENTRY(hvio_msiq_gettail)
 496         mov     HVIO_MSIQ_GETTAIL, %o5
 497         ta      FAST_TRAP
 498         brz,a   %o0, 1f
 499         stx     %o1, [%o2]
 500 1:      retl
 501         nop
 502         SET_SIZE(hvio_msiq_gettail)
 503 
 504         /*
 505          * arg0 - devhandle
 506          * arg1 - msi_num
 507          *
 508          * ret0 - status
 509          * ret1 - msiq_id
 510          */
 511         ENTRY(hvio_msi_getmsiq)
 512         mov     HVIO_MSI_GETMSIQ, %o5
 513         ta      FAST_TRAP
 514         brz,a   %o0, 1f
 515         stuw    %o1, [%o2]
 516 1:      retl
 517         nop
 518         SET_SIZE(hvio_msi_getmsiq)
 519 
 520         /*
 521          * arg0 - devhandle
 522          * arg1 - msi_num
 523          * arg2 - msiq_id
 524          * arg2 - msitype
 525          *
 526          * ret0 - status
 527          */
 528         ENTRY(hvio_msi_setmsiq)
 529         mov     HVIO_MSI_SETMSIQ, %o5
 530         ta      FAST_TRAP
 531         retl
 532         nop
 533         SET_SIZE(hvio_msi_setmsiq)
 534 
 535         /*
 536          * arg0 - devhandle
 537          * arg1 - msi_num
 538          *
 539          * ret0 - status
 540          * ret1 - msi_valid_state
 541          */
 542         ENTRY(hvio_msi_getvalid)
 543         mov     HVIO_MSI_GETVALID, %o5
 544         ta      FAST_TRAP
 545         brz,a   %o0, 1f
 546         stuw    %o1, [%o2]
 547 1:      retl
 548         nop
 549         SET_SIZE(hvio_msi_getvalid)
 550 
 551         /*
 552          * arg0 - devhandle
 553          * arg1 - msi_num
 554          * arg2 - msi_valid_state
 555          *
 556          * ret0 - status
 557          */
 558         ENTRY(hvio_msi_setvalid)
 559         mov     HVIO_MSI_SETVALID, %o5
 560         ta      FAST_TRAP
 561         retl
 562         nop
 563         SET_SIZE(hvio_msi_setvalid)
 564 
 565         /*
 566          * arg0 - devhandle
 567          * arg1 - msi_num
 568          *
 569          * ret0 - status
 570          * ret1 - msi_state
 571          */
 572         ENTRY(hvio_msi_getstate)
 573         mov     HVIO_MSI_GETSTATE, %o5
 574         ta      FAST_TRAP
 575         brz,a   %o0, 1f
 576         stuw    %o1, [%o2]
 577 1:      retl
 578         nop
 579         SET_SIZE(hvio_msi_getstate)
 580 
 581         /*
 582          * arg0 - devhandle
 583          * arg1 - msi_num
 584          * arg2 - msi_state
 585          *
 586          * ret0 - status
 587          */
 588         ENTRY(hvio_msi_setstate)
 589         mov     HVIO_MSI_SETSTATE, %o5
 590         ta      FAST_TRAP
 591         retl
 592         nop
 593         SET_SIZE(hvio_msi_setstate)
 594 
 595         /*
 596          * arg0 - devhandle
 597          * arg1 - msg_type
 598          *
 599          * ret0 - status
 600          * ret1 - msiq_id
 601          */
 602         ENTRY(hvio_msg_getmsiq)
 603         mov     HVIO_MSG_GETMSIQ, %o5
 604         ta      FAST_TRAP
 605         brz,a   %o0, 1f
 606         stuw    %o1, [%o2]
 607 1:      retl
 608         nop
 609         SET_SIZE(hvio_msg_getmsiq)
 610 
 611         /*
 612          * arg0 - devhandle
 613          * arg1 - msg_type
 614          * arg2 - msiq_id
 615          *
 616          * ret0 - status
 617          */
 618         ENTRY(hvio_msg_setmsiq)
 619         mov     HVIO_MSG_SETMSIQ, %o5
 620         ta      FAST_TRAP
 621         retl
 622         nop
 623         SET_SIZE(hvio_msg_setmsiq)
 624 
 625         /*
 626          * arg0 - devhandle
 627          * arg1 - msg_type
 628          *
 629          * ret0 - status
 630          * ret1 - msg_valid_state
 631          */
 632         ENTRY(hvio_msg_getvalid)
 633         mov     HVIO_MSG_GETVALID, %o5
 634         ta      FAST_TRAP
 635         brz,a   %o0, 1f
 636         stuw    %o1, [%o2]
 637 1:      retl
 638         nop
 639         SET_SIZE(hvio_msg_getvalid)
 640 
 641         /*
 642          * arg0 - devhandle
 643          * arg1 - msg_type
 644          * arg2 - msg_valid_state
 645          *
 646          * ret0 - status
 647          */
 648         ENTRY(hvio_msg_setvalid)
 649         mov     HVIO_MSG_SETVALID, %o5
 650         ta      FAST_TRAP
 651         retl
 652         nop
 653         SET_SIZE(hvio_msg_setvalid)
 654         
 655         /*
 656          * arg0 - devhandle
 657          * arg1 - devino
 658          * arg2 - pci_device
 659          *
 660          * ret0 - status
 661          */
 662         ENTRY(pci_error_send)
 663         mov     PCI_ERROR_SEND, %o5
 664         ta      FAST_TRAP
 665         retl
 666         nop
 667         SET_SIZE(pci_error_send)
 668 
 669 #define SHIFT_REGS      mov %o1,%o0; mov %o2,%o1; mov %o3,%o2; mov %o4,%o3
 670 
 671 ! px_phys_acc_4v: Do physical address read.
 672 !
 673 ! After SHIFT_REGS:
 674 ! %o0 is "from" address
 675 ! %o1 is "to" address
 676 !
 677 ! Assumes 8 byte data and that alignment is correct.
 678 !
 679 ! Always returns success (0) in %o0
 680 
 681         ! px_phys_acc_4v must not be split across pages.
 682         !
 683         ! ATTN: Be sure that the alignment value is larger than the size of
 684         ! the px_phys_acc_4v function.
 685         !
 686         .align  0x40
 687 
 688         ENTRY(px_phys_acc_4v)
 689 
 690         SHIFT_REGS
 691         ldx     [%o0], %g1
 692         stx     %g1, [%o1]
 693         membar  #Sync                   ! Make sure the loads take
 694         mov     %g0, %o0
 695         done
 696         SET_SIZE(px_phys_acc_4v)
 697 
 698         /*
 699          * arg0 - devhandle
 700          *
 701          * ret0 - status
 702          */
 703         ENTRY(pci_iov_root_configured)
 704         mov     PCI_IOV_ROOT_CONFIGURED, %o5
 705         ta      FAST_TRAP
 706         retl
 707         nop
 708         SET_SIZE(pci_iov_root_configured)
 709 
 710 #endif  /* lint || __lint */