1217044Snwhitehorn/*- 2217044Snwhitehorn * Copyright (C) 2010 Nathan Whitehorn 3224106Snwhitehorn * Copyright (C) 2011 glevand (geoffrey.levand@mail.ru) 4217044Snwhitehorn * All rights reserved. 5217044Snwhitehorn * 6217044Snwhitehorn * Redistribution and use in source and binary forms, with or without 7217044Snwhitehorn * modification, are permitted provided that the following conditions 8217044Snwhitehorn * are met: 9217044Snwhitehorn * 1. Redistributions of source code must retain the above copyright 10217044Snwhitehorn * notice, this list of conditions and the following disclaimer. 11217044Snwhitehorn * 2. Redistributions in binary form must reproduce the above copyright 12217044Snwhitehorn * notice, this list of conditions and the following disclaimer in the 13217044Snwhitehorn * documentation and/or other materials provided with the distribution. 14217044Snwhitehorn * 15217044Snwhitehorn * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16217044Snwhitehorn * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17217044Snwhitehorn * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18217044Snwhitehorn * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 19217044Snwhitehorn * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20217044Snwhitehorn * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 21217044Snwhitehorn * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 22217044Snwhitehorn * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 23217044Snwhitehorn * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 24217044Snwhitehorn * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25217044Snwhitehorn * 26217044Snwhitehorn * $FreeBSD$ 27217044Snwhitehorn */ 28217044Snwhitehorn 29217044Snwhitehorn/* Hypercall stubs. Note: this is all a hack and should die. */ 30217044Snwhitehorn 31217044Snwhitehorn#define hc .long 0x44000022 32217044Snwhitehorn 33217044Snwhitehorn#define LD64_IM(r, highest, higher, high, low) \ 34217044Snwhitehorn lis r,highest; \ 35217044Snwhitehorn addi r,r,higher; \ 36217044Snwhitehorn sldi r,r,32; \ 37217044Snwhitehorn addis r,r,high; \ 38217044Snwhitehorn addi r,r,low; 39217044Snwhitehorn 40217044Snwhitehorn#define SIMPLE_HVCALL(x, c) \ 41217044Snwhitehorn.global x; \ 42217044Snwhitehornx: \ 43217044Snwhitehorn mflr %r0; \ 44217044Snwhitehorn stw %r0,4(%r1); \ 45217044Snwhitehorn clrldi %r3,%r3,32; \ 46217044Snwhitehorn clrldi %r4,%r4,32; \ 47217044Snwhitehorn clrldi %r5,%r5,32; \ 48217044Snwhitehorn clrldi %r6,%r6,32; \ 49217044Snwhitehorn clrldi %r7,%r7,32; \ 50217044Snwhitehorn clrldi %r8,%r8,32; \ 51217044Snwhitehorn clrldi %r9,%r9,32; \ 52217044Snwhitehorn clrldi %r10,%r10,32; \ 53217044Snwhitehorn li %r11,c; \ 54217044Snwhitehorn hc; \ 55217044Snwhitehorn extsw %r3,%r3; \ 56217044Snwhitehorn lwz %r0,4(%r1); \ 57217044Snwhitehorn mtlr %r0; \ 58217044Snwhitehorn blr 59217044Snwhitehorn 60217044SnwhitehornSIMPLE_HVCALL(lv1_open_device, 170) 61217044SnwhitehornSIMPLE_HVCALL(lv1_close_device, 171) 62217044SnwhitehornSIMPLE_HVCALL(lv1_gpu_open, 210) 63217044SnwhitehornSIMPLE_HVCALL(lv1_gpu_context_attribute, 225) 64217044SnwhitehornSIMPLE_HVCALL(lv1_panic, 255) 65217044SnwhitehornSIMPLE_HVCALL(lv1_net_start_tx_dma, 187) 66217044SnwhitehornSIMPLE_HVCALL(lv1_net_stop_tx_dma, 188) 67217044SnwhitehornSIMPLE_HVCALL(lv1_net_start_rx_dma, 189) 68217044SnwhitehornSIMPLE_HVCALL(lv1_net_stop_rx_dma, 190) 69217044Snwhitehorn 70217044Snwhitehorn.global lv1_get_physmem 71217044Snwhitehornlv1_get_physmem: 72217044Snwhitehorn mflr %r0 73217044Snwhitehorn stw %r0,4(%r1) 74217044Snwhitehorn stw %r3,-8(%r1) /* Address for maxmem */ 75217044Snwhitehorn 76217044Snwhitehorn li %r11,69 /* Get PU ID */ 77217044Snwhitehorn hc 78217044Snwhitehorn std %r4,-16(%r1) 79217044Snwhitehorn 80217044Snwhitehorn li %r11,74 /* Get LPAR ID */ 81217044Snwhitehorn hc 82217044Snwhitehorn std %r4,-24(%r1) 83217044Snwhitehorn 84217044Snwhitehorn ld %r3,-24(%r1) 85217044Snwhitehorn LD64_IM(%r4,0x0000,0x0000,0x6269,0x0000 /* "bi" */) 86217044Snwhitehorn LD64_IM(%r5,0x7075,0x0000,0x0000,0x0000 /* "pu" */) 87217044Snwhitehorn ld %r6,-16(%r1) 88217044Snwhitehorn LD64_IM(%r7,0x726d,0x5f73,0x697a,0x6500 /* "rm_size" */) 89217044Snwhitehorn li %r11,91 90217044Snwhitehorn hc 91217044Snwhitehorn extsw %r3,%r3 92217044Snwhitehorn 93217044Snwhitehorn lwz %r5,-8(%r1) 94217044Snwhitehorn std %r4,0(%r5) 95217044Snwhitehorn 96217044Snwhitehorn lwz %r0,4(%r1) 97217044Snwhitehorn mtlr %r0 98217044Snwhitehorn blr 99217044Snwhitehorn 100217044Snwhitehorn.global lv1_setup_address_space 101217044Snwhitehornlv1_setup_address_space: 102217044Snwhitehorn mflr %r0 103217044Snwhitehorn stw %r0,4(%r1) 104217044Snwhitehorn 105217044Snwhitehorn stw %r3,-4(%r1) 106217044Snwhitehorn stw %r4,-8(%r1) 107217044Snwhitehorn 108217044Snwhitehorn li %r3,18 /* PT size: log2(256 KB) */ 109217044Snwhitehorn li %r4,2 /* Two page sizes */ 110217044Snwhitehorn li %r5,24 /* Page sizes: (24 << 56) | (16 << 48) */ 111217044Snwhitehorn sldi %r5,%r5,24 112217044Snwhitehorn li %r6,16 113217044Snwhitehorn sldi %r6,%r6,16 114217044Snwhitehorn or %r5,%r5,%r6 115217044Snwhitehorn sldi %r5,%r5,32 116217044Snwhitehorn 117217044Snwhitehorn li %r11,2 /* lv1_construct_virtual_address_space */ 118217044Snwhitehorn hc 119217044Snwhitehorn 120217044Snwhitehorn lwz %r6,-4(%r1) 121217044Snwhitehorn lwz %r7,-8(%r1) 122217044Snwhitehorn std %r4,0(%r6) 123217044Snwhitehorn std %r5,0(%r7) 124217044Snwhitehorn 125217044Snwhitehorn /* AS_ID in r4 */ 126217044Snwhitehorn mr %r3,%r4 127217044Snwhitehorn li %r11,7 /* lv1_select_virtual_address_space */ 128217044Snwhitehorn hc 129217044Snwhitehorn extsw %r3,%r3 130217044Snwhitehorn 131217044Snwhitehorn lwz %r0,4(%r1) 132217044Snwhitehorn mtlr %r0 133217044Snwhitehorn blr 134217044Snwhitehorn 135217044Snwhitehorn.global lv1_insert_pte 136217044Snwhitehornlv1_insert_pte: 137217044Snwhitehorn mflr %r0 138217044Snwhitehorn stw %r0,4(%r1) 139217044Snwhitehorn 140217044Snwhitehorn mr %r11,%r4 /* Save R4 */ 141217044Snwhitehorn 142217044Snwhitehorn clrldi %r3,%r3,32 143217044Snwhitehorn clrldi %r7,%r5,32 144217044Snwhitehorn 145217044Snwhitehorn sldi %r4,%r3,3 /* Convert ptegidx into base PTE slot */ 146217044Snwhitehorn li %r3,0 /* Current address space */ 147217044Snwhitehorn ld %r5,0(%r11) 148217044Snwhitehorn ld %r6,8(%r11) 149217044Snwhitehorn li %r8,0 /* No other flags */ 150217044Snwhitehorn 151217044Snwhitehorn li %r11,158 152217044Snwhitehorn hc 153217044Snwhitehorn extsw %r3,%r3 154217044Snwhitehorn 155217044Snwhitehorn lwz %r0,4(%r1) 156217044Snwhitehorn mtlr %r0 157217044Snwhitehorn blr 158217044Snwhitehorn 159217044Snwhitehorn.global lv1_gpu_context_allocate 160217044Snwhitehornlv1_gpu_context_allocate: 161217044Snwhitehorn mflr %r0 162217044Snwhitehorn stw %r0,4(%r1) 163217044Snwhitehorn stw %r7,-4(%r1) 164217044Snwhitehorn 165217044Snwhitehorn sldi %r3,%r3,32 166217044Snwhitehorn clrldi %r4,%r4,32 167224106Snwhitehorn or %r3,%r3,%r4 168217044Snwhitehorn clrldi %r4,%r5,32 169217044Snwhitehorn clrldi %r5,%r6,32 170217044Snwhitehorn 171217044Snwhitehorn li %r11,217 172217044Snwhitehorn hc 173217044Snwhitehorn extsw %r3,%r3 174217044Snwhitehorn 175217044Snwhitehorn lwz %r7,-4(%r1) 176217044Snwhitehorn std %r4,0(%r7) 177217044Snwhitehorn 178217044Snwhitehorn lwz %r0,4(%r1) 179217044Snwhitehorn mtlr %r0 180217044Snwhitehorn blr 181217044Snwhitehorn 182217044Snwhitehorn.global lv1_gpu_memory_allocate 183217044Snwhitehornlv1_gpu_memory_allocate: 184217044Snwhitehorn mflr %r0 185217044Snwhitehorn stw %r0,4(%r1) 186217044Snwhitehorn stw %r8,-4(%r1) 187217044Snwhitehorn stw %r9,-8(%r1) 188217044Snwhitehorn 189217044Snwhitehorn li %r11,214 190217044Snwhitehorn hc 191217044Snwhitehorn extsw %r3,%r3 192217044Snwhitehorn 193217044Snwhitehorn lwz %r8,-4(%r1) 194217044Snwhitehorn lwz %r9,-8(%r1) 195217044Snwhitehorn std %r4,0(%r8) 196217044Snwhitehorn std %r5,0(%r9) 197217044Snwhitehorn 198217044Snwhitehorn lwz %r0,4(%r1) 199217044Snwhitehorn mtlr %r0 200217044Snwhitehorn blr 201217044Snwhitehorn 202217044Snwhitehorn.global lv1_net_control 203217044Snwhitehornlv1_net_control: 204217044Snwhitehorn mflr %r0 205217044Snwhitehorn stw %r0,4(%r1) 206217044Snwhitehorn stw %r9,-4(%r1) 207217044Snwhitehorn 208217044Snwhitehorn li %r11,194 209217044Snwhitehorn hc 210217044Snwhitehorn extsw %r3,%r3 211217044Snwhitehorn 212217044Snwhitehorn lwz %r8,-4(%r1) 213217044Snwhitehorn std %r4,0(%r8) 214217044Snwhitehorn 215217044Snwhitehorn lwz %r0,4(%r1) 216217044Snwhitehorn mtlr %r0 217217044Snwhitehorn blr 218217044Snwhitehorn 219217044Snwhitehorn.global lv1_setup_dma 220217044Snwhitehornlv1_setup_dma: 221217044Snwhitehorn mflr %r0 222217044Snwhitehorn stw %r0,4(%r1) 223217044Snwhitehorn stw %r3,-4(%r1) 224217044Snwhitehorn stw %r4,-8(%r1) 225217044Snwhitehorn stw %r5,-12(%r1) 226217044Snwhitehorn 227217044Snwhitehorn lwz %r3,-4(%r1) 228217044Snwhitehorn lwz %r4,-8(%r1) 229217044Snwhitehorn lis %r5,0x0800 /* 128 MB */ 230217044Snwhitehorn li %r6,24 /* log2(IO_PAGESIZE) */ 231217044Snwhitehorn li %r7,0 /* flags */ 232217044Snwhitehorn li %r11,174 /* lv1_allocate_device_dma_region */ 233217044Snwhitehorn hc 234217044Snwhitehorn extsw %r3,%r3 235217044Snwhitehorn cmpdi %r3,0 236217044Snwhitehorn bne 1f 237217044Snwhitehorn std %r4,-24(%r1) 238217044Snwhitehorn 239217044Snwhitehorn lwz %r3,-4(%r1) 240217044Snwhitehorn lwz %r4,-8(%r1) 241217044Snwhitehorn li %r5,0 242217044Snwhitehorn ld %r6,-24(%r1) 243217044Snwhitehorn lis %r7,0x0800 /* 128 MB */ 244217044Snwhitehorn lis %r8,0xf800 /* flags */ 245217044Snwhitehorn sldi %r8,%r8,32 246217044Snwhitehorn li %r11,176 /* lv1_map_device_dma_region */ 247217044Snwhitehorn hc 248217044Snwhitehorn extsw %r3,%r3 249217044Snwhitehorn 250217044Snwhitehorn lwz %r9,-12(%r1) 251217044Snwhitehorn ld %r6,-24(%r1) 252217044Snwhitehorn std %r6,0(%r9) 253217044Snwhitehorn 254217044Snwhitehorn1: lwz %r0,4(%r1) 255217044Snwhitehorn mtlr %r0 256217044Snwhitehorn blr 257217044Snwhitehorn 258224106Snwhitehorn.global lv1_get_repository_node_value 259224106Snwhitehornlv1_get_repository_node_value: 260224106Snwhitehorn mflr %r0 261224106Snwhitehorn stw %r0,4(%r1) 262224106Snwhitehorn 263224106Snwhitehorn sldi %r3,%r3,32 264224106Snwhitehorn clrldi %r4,%r4,32 265224106Snwhitehorn or %r3,%r3,%r4 266224106Snwhitehorn sldi %r4,%r5,32 267224106Snwhitehorn clrldi %r5,%r6,32 268224106Snwhitehorn or %r4,%r4,%r5 269224106Snwhitehorn sldi %r5,%r7,32 270224106Snwhitehorn clrldi %r6,%r8,32 271224106Snwhitehorn or %r5,%r5,%r6 272224106Snwhitehorn sldi %r6,%r9,32 273224106Snwhitehorn clrldi %r7,%r10,32 274224106Snwhitehorn or %r6,%r6,%r7 275224106Snwhitehorn lwz %r7,8(%r1) 276224106Snwhitehorn lwz %r8,12(%r1) 277224106Snwhitehorn sldi %r7,%r7,32 278224106Snwhitehorn or %r7,%r7,%r8 279224106Snwhitehorn 280224106Snwhitehorn li %r11,91 281224106Snwhitehorn hc 282224106Snwhitehorn extsw %r3,%r3 283224106Snwhitehorn 284224106Snwhitehorn lwz %r6,16(%r1) 285224106Snwhitehorn std %r4,0(%r6) 286224106Snwhitehorn lwz %r6,20(%r1) 287224106Snwhitehorn std %r5,0(%r6) 288224106Snwhitehorn 289224106Snwhitehorn lwz %r0,4(%r1) 290224106Snwhitehorn mtlr %r0 291224106Snwhitehorn blr 292224106Snwhitehorn 293224106Snwhitehorn.global lv1_storage_read 294224106Snwhitehornlv1_storage_read: 295224106Snwhitehorn mflr %r0 296224106Snwhitehorn stw %r0,4(%r1) 297224106Snwhitehorn 298224106Snwhitehorn sldi %r3,%r3,32 299224106Snwhitehorn clrldi %r4,%r4,32 300224106Snwhitehorn or %r3,%r3,%r4 301224106Snwhitehorn sldi %r4,%r5,32 302224106Snwhitehorn clrldi %r5,%r6,32 303224106Snwhitehorn or %r4,%r4,%r5 304224106Snwhitehorn sldi %r5,%r7,32 305224106Snwhitehorn clrldi %r6,%r8,32 306224106Snwhitehorn or %r5,%r5,%r6 307224106Snwhitehorn sldi %r6,%r9,32 308224106Snwhitehorn clrldi %r7,%r10,32 309224106Snwhitehorn or %r6,%r6,%r7 310224857Snwhitehorn ld %r7,8(%r1) 311224857Snwhitehorn ld %r8,16(%r1) 312224106Snwhitehorn 313224106Snwhitehorn li %r11,245 314224106Snwhitehorn hc 315224106Snwhitehorn extsw %r3,%r3 316224106Snwhitehorn 317224106Snwhitehorn lwz %r5,24(%r1) 318224106Snwhitehorn std %r4,0(%r5) 319224106Snwhitehorn 320224106Snwhitehorn lwz %r0,4(%r1) 321224106Snwhitehorn mtlr %r0 322224106Snwhitehorn blr 323224106Snwhitehorn 324224106Snwhitehorn.global lv1_storage_check_async_status 325224106Snwhitehornlv1_storage_check_async_status: 326224106Snwhitehorn mflr %r0 327224106Snwhitehorn stw %r0,4(%r1) 328224106Snwhitehorn stw %r7,-4(%r1) 329224106Snwhitehorn 330224106Snwhitehorn sldi %r3,%r3,32 331224106Snwhitehorn clrldi %r4,%r4,32 332224106Snwhitehorn or %r3,%r3,%r4 333224106Snwhitehorn sldi %r4,%r5,32 334224106Snwhitehorn clrldi %r5,%r6,32 335224106Snwhitehorn or %r4,%r4,%r5 336224106Snwhitehorn 337224106Snwhitehorn li %r11,254 338224106Snwhitehorn hc 339224106Snwhitehorn extsw %r3,%r3 340224106Snwhitehorn 341224106Snwhitehorn lwz %r5,-4(%r1) 342224106Snwhitehorn std %r4,0(%r5) 343224106Snwhitehorn 344224106Snwhitehorn lwz %r0,4(%r1) 345224106Snwhitehorn mtlr %r0 346224106Snwhitehorn blr 347