1ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs/* 2ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs * Copyright 2013 Red Hat Inc. 3ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs * 4ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs * Permission is hereby granted, free of charge, to any person obtaining a 5ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs * copy of this software and associated documentation files (the "Software"), 6ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs * to deal in the Software without restriction, including without limitation 7ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs * and/or sell copies of the Software, and to permit persons to whom the 9ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs * Software is furnished to do so, subject to the following conditions: 10ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs * 11ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs * The above copyright notice and this permission notice shall be included in 12ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs * all copies or substantial portions of the Software. 13ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs * 14ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs * OTHER DEALINGS IN THE SOFTWARE. 21ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs * 22ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs * Authors: Ben Skeggs 23ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs */ 24ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs 25ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs#ifdef INCLUDE_PROC 26ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggsprocess(PROC_HOST, #host_init, #host_recv) 27ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs#endif 28ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs 29ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs/****************************************************************************** 30ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs * HOST data segment 31ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs *****************************************************************************/ 32ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs#ifdef INCLUDE_DATA 33ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs// HOST (R)FIFO packet format 34ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs.equ #fifo_process 0x00 35ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs.equ #fifo_message 0x04 36ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs.equ #fifo_data0 0x08 37ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs.equ #fifo_data1 0x0c 38ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs 39ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs// HOST HOST->PWR queue description 40ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs.equ #fifo_qlen 4 // log2(size of queue entry in bytes) 41ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs.equ #fifo_qnum 3 // log2(max number of entries in queue) 42ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs.equ #fifo_qmaskb (1 << #fifo_qnum) // max number of entries in queue 43ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs.equ #fifo_qmaskp (#fifo_qmaskb - 1) 44ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs.equ #fifo_qmaskf ((#fifo_qmaskb << 1) - 1) 45ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs.equ #fifo_qsize (1 << (#fifo_qlen + #fifo_qnum)) 46ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggsfifo_queue: .skip 128 // #fifo_qsize 47ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs 48ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs// HOST PWR->HOST queue description 49ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs.equ #rfifo_qlen 4 // log2(size of queue entry in bytes) 50ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs.equ #rfifo_qnum 3 // log2(max number of entries in queue) 51ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs.equ #rfifo_qmaskb (1 << #rfifo_qnum) // max number of entries in queue 52ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs.equ #rfifo_qmaskp (#rfifo_qmaskb - 1) 53ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs.equ #rfifo_qmaskf ((#rfifo_qmaskb << 1) - 1) 54ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs.equ #rfifo_qsize (1 << (#rfifo_qlen + #rfifo_qnum)) 55ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggsrfifo_queue: .skip 128 // #rfifo_qsize 56ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs#endif 57ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs 58ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs/****************************************************************************** 59ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs * HOST code segment 60ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs *****************************************************************************/ 61ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs#ifdef INCLUDE_CODE 62ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs// HOST->PWR comms - dequeue message(s) for process(es) from FIFO 63ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs// 64ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs// $r15 - current (host) 65ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs// $r0 - zero 66ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggshost_send: 67ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs nv_iord($r1, NV_PPWR_FIFO_GET(0)) 68ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs nv_iord($r2, NV_PPWR_FIFO_PUT(0)) 69ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs cmp b32 $r1 $r2 70ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs bra e #host_send_done 71ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs // calculate address of message 72ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs and $r14 $r1 #fifo_qmaskp 73ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs shl b32 $r14 $r14 #fifo_qlen 74ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs add b32 $r14 #fifo_queue 75ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs 76ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs // read message data, and pass to appropriate process 77ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs ld b32 $r11 D[$r14 + #fifo_data1] 78ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs ld b32 $r12 D[$r14 + #fifo_data0] 79ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs ld b32 $r13 D[$r14 + #fifo_message] 80ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs ld b32 $r14 D[$r14 + #fifo_process] 81ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs call(send) 82ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs 83ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs // increment GET 84ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs add b32 $r1 0x1 85ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs and $r14 $r1 #fifo_qmaskf 86c15ad3ca3238f99ad4a71948bdf81527dcf116a0Ben Skeggs nv_iowr(NV_PPWR_FIFO_GET(0), $r14) 87ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs bra #host_send 88ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs host_send_done: 89ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs ret 90ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs 91ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs// PWR->HOST comms - enqueue message for HOST to RFIFO 92ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs// 93ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs// $r15 - current (host) 94ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs// $r14 - process 95ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs// $r13 - message 96ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs// $r12 - message data 0 97ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs// $r11 - message data 1 98ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs// $r0 - zero 99ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggshost_recv: 100ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs // message from intr handler == HOST->PWR comms pending 101ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs mov $r1 (PROC_KERN & 0x0000ffff) 102ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs sethi $r1 (PROC_KERN & 0xffff0000) 103ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs cmp b32 $r14 $r1 104ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs bra e #host_send 105ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs 106ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs // wait for space in RFIFO 107ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs host_recv_wait: 108ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs nv_iord($r1, NV_PPWR_RFIFO_GET) 109ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs nv_iord($r2, NV_PPWR_RFIFO_PUT) 110ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs xor $r1 #rfifo_qmaskb 111ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs cmp b32 $r1 $r2 112ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs bra e #host_recv_wait 113ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs 114ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs and $r3 $r2 #rfifo_qmaskp 115ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs shl b32 $r3 #rfifo_qlen 116ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs add b32 $r3 #rfifo_queue 117ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs 118ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs // enqueue message 119ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs st b32 D[$r3 + #fifo_data1] $r11 120ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs st b32 D[$r3 + #fifo_data0] $r12 121ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs st b32 D[$r3 + #fifo_message] $r13 122ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs st b32 D[$r3 + #fifo_process] $r14 123ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs 124ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs add b32 $r2 0x1 125ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs and $r2 #rfifo_qmaskf 126ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs nv_iowr(NV_PPWR_RFIFO_PUT, $r2) 127ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs 128ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs // notify host of pending message 129ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs mov $r2 NV_PPWR_INTR_TRIGGER_USER0 130ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs nv_iowr(NV_PPWR_INTR_TRIGGER, $r2) 131ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs ret 132ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs 133ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs// $r15 - current (host) 134ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs// $r0 - zero 135ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggshost_init: 136ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs // store each fifo's base/size in H2D/D2H scratch regs 137ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs mov $r1 #fifo_qsize 138ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs shl b32 $r1 16 139ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs or $r1 #fifo_queue 140ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs nv_iowr(NV_PPWR_H2D, $r1); 141ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs 142ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs mov $r1 #rfifo_qsize 143ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs shl b32 $r1 16 144ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs or $r1 #rfifo_queue 145ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs nv_iowr(NV_PPWR_D2H, $r1); 146ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs 147ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs // enable fifo subintr for first fifo 148ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs mov $r1 1 149ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs nv_iowr(NV_PPWR_FIFO_INTR_EN, $r1) 150ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs ret 151ff4b42c7532e6ed6a5ae3c9cb71395b41a0a4022Ben Skeggs#endif 152