Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  hub.fuc   Sprache: unbekannt

 
/* fuc microcode for gf100 PGRAPH/HUB
 *
 * Copyright 2011 Red Hat Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 *
 * Authors: Ben Skeggs
 */

#ifdef INCLUDE_DATA
hub_mmio_list_head: .b32 #hub_mmio_list_base
hub_mmio_list_tail: .b32 #hub_mmio_list_next

gpc_count:  .b32 0
rop_count:  .b32 0
cmd_queue:  queue_init

ctx_current:  .b32 0

.align 256
chan_data:
chan_mmio_count: .b32 0
chan_mmio_address: .b32 0

.align 256
xfer_data:   .skip 256

hub_mmio_list_base:
.b32 0x0417e91c // 0x17e91c, 2
hub_mmio_list_next:
#endif

#ifdef INCLUDE_CODE
// reports an exception to the host
//
// In: $r15 error code (see os.h)
//
error:
 nv_iowr(NV_PGRAPH_FECS_CC_SCRATCH_VAL(5), 0, $r15)
 mov $r15 1
 nv_iowr(NV_PGRAPH_FECS_INTR_UP_SET, 0, $r15)
 ret

// HUB fuc initialisation, executed by triggering ucode start, will
// fall through to main loop after completion.
//
// Output:
//   CC_SCRATCH[0]:
//      31:31: set to signal completion
//   CC_SCRATCH[1]:
//       31:0: total PGRAPH context size
//
init:
 clear b32 $r0
 mov $xdbase $r0

 // setup stack
 nv_iord($r1, NV_PGRAPH_FECS_CAPS, 0)
 extr $r1 $r1 9:17
 shl b32 $r1 8
 mov $sp $r1

 // enable fifo access
 mov $r2 NV_PGRAPH_FECS_ACCESS_FIFO
 nv_iowr(NV_PGRAPH_FECS_ACCESS, 0, $r2)

 // setup i0 handler, and route all interrupts to it
 mov $r1 #ih
 mov $iv0 $r1

 clear b32 $r2
 nv_iowr(NV_PGRAPH_FECS_INTR_ROUTE, 0, $r2)

 // route HUB_CHSW_PULSE to fuc interrupt 8
 mov $r2 0x2003  // { HUB_CHSW_PULSE, ZERO } -> intr 8
 nv_iowr(NV_PGRAPH_FECS_IROUTE, 0, $r2)

 // not sure what these are, route them because NVIDIA does, and
 // the IRQ handler will signal the host if we ever get one.. we
 // may find out if/why we need to handle these if so..
 //
 mov $r2 0x2004  // { 0x04, ZERO } -> intr 9
 nv_iowr(NV_PGRAPH_FECS_IROUTE, 1, $r2)
 mov $r2 0x200b  // { HUB_FIRMWARE_MTHD, ZERO } -> intr 10
 nv_iowr(NV_PGRAPH_FECS_IROUTE, 2, $r2)
 mov $r2 0x200c  // { 0x0c, ZERO } -> intr 15
 nv_iowr(NV_PGRAPH_FECS_IROUTE, 7, $r2)

 // enable all INTR_UP interrupts
 sub b32 $r3 $r0 1
 nv_iowr(NV_PGRAPH_FECS_INTR_UP_EN, 0, $r3)

 // enable fifo, ctxsw, 9, fwmthd, 15 interrupts
 imm32($r2, 0x8704)
 nv_iowr(NV_PGRAPH_FECS_INTR_EN_SET, 0, $r2)

 // fifo level triggered, rest edge
 mov $r2 NV_PGRAPH_FECS_INTR_MODE_FIFO_LEVEL
 nv_iowr(NV_PGRAPH_FECS_INTR_MODE, 0, $r2)

 // enable interrupts
 bset $flags ie0

 // fetch enabled GPC/ROP counts
 nv_rd32($r14, 0x409604)
 extr $r1 $r15 16:20
 st b32 D[$r0 + #rop_count] $r1
 and $r15 0x1f
 st b32 D[$r0 + #gpc_count] $r15

 // set BAR_REQMASK to GPC mask
 mov $r1 1
 shl b32 $r1 $r15
 sub b32 $r1 1
 nv_iowr(NV_PGRAPH_FECS_BAR_MASK0, 0, $r1)
 nv_iowr(NV_PGRAPH_FECS_BAR_MASK1, 0, $r1)

 // context size calculation, reserve first 256 bytes for use by fuc
 mov $r1 256

 //
 mov $r15 2
 call(ctx_4170s)
 call(ctx_4170w)
 mov $r15 0x10
 call(ctx_86c)

 // calculate size of mmio context data
 ld b32 $r14 D[$r0 + #hub_mmio_list_head]
 ld b32 $r15 D[$r0 + #hub_mmio_list_tail]
 call(mmctx_size)

 // set mmctx base addresses now so we don't have to do it later,
 // they don't (currently) ever change
 shr b32 $r4 $r1 8
 nv_iowr(NV_PGRAPH_FECS_MMCTX_SAVE_SWBASE, 0, $r4)
 nv_iowr(NV_PGRAPH_FECS_MMCTX_LOAD_SWBASE, 0, $r4)
 add b32 $r3 0x1300
 add b32 $r1 $r15
 shr b32 $r15 2
 nv_iowr(NV_PGRAPH_FECS_MMCTX_LOAD_COUNT, 0, $r15) // wtf??

 // strands, base offset needs to be aligned to 256 bytes
 shr b32 $r1 8
 add b32 $r1 1
 shl b32 $r1 8
 mov b32 $r15 $r1
 call(strand_ctx_init)
 add b32 $r1 $r15

 // initialise each GPC in sequence by passing in the offset of its
 // context data in GPCn_CC_SCRATCH[1], and starting its FUC (which
 // has previously been uploaded by the host) running.
 //
 // the GPC fuc init sequence will set GPCn_CC_SCRATCH[0] bit 31
 // when it has completed, and return the size of its context data
 // in GPCn_CC_SCRATCH[1]
 //
 ld b32 $r3 D[$r0 + #gpc_count]
 imm32($r4, 0x502000)
 init_gpc:
  // setup, and start GPC ucode running
  add b32 $r14 $r4 0x804
  mov b32 $r15 $r1
  call(nv_wr32)   // CC_SCRATCH[1] = ctx offset
  add b32 $r14 $r4 0x10c
  clear b32 $r15
  call(nv_wr32)
  add b32 $r14 $r4 0x104
  call(nv_wr32)   // ENTRY
  add b32 $r14 $r4 0x100
  mov $r15 2   // CTRL_START_TRIGGER
  call(nv_wr32)   // CTRL

  // wait for it to complete, and adjust context size
  add b32 $r14 $r4 0x800
  init_gpc_wait:
   call(nv_rd32)
   xbit $r15 $r15 31
   bra e #init_gpc_wait
  add b32 $r14 $r4 0x804
  call(nv_rd32)
  add b32 $r1 $r15

  // next!
  add b32 $r4 0x8000
  sub b32 $r3 1
  bra ne #init_gpc

 //
 mov $r15 0
 call(ctx_86c)
 mov $r15 0
 call(ctx_4170s)

 // save context size, and tell host we're ready
 nv_iowr(NV_PGRAPH_FECS_CC_SCRATCH_VAL(1), 0, $r1)
 clear b32 $r1
 bset $r1 31
 nv_iowr(NV_PGRAPH_FECS_CC_SCRATCH_SET(0), 0, $r1)

// Main program loop, very simple, sleeps until woken up by the interrupt
// handler, pulls a command from the queue and executes its handler
//
wait:
 // sleep until we have something to do
 sleep $p0
 bset $flags $p0
main:
 mov $r13 #cmd_queue
 call(queue_get)
 bra $p1 #wait

 // context switch, requested by GPU?
 cmpu b32 $r14 0x4001
 bra ne #main_not_ctx_switch
  trace_set(T_AUTO)
  nv_iord($r1, NV_PGRAPH_FECS_CHAN_ADDR, 0)
  nv_iord($r2, NV_PGRAPH_FECS_CHAN_NEXT, 0)

  xbit $r3 $r1 31
  bra e #chsw_no_prev
   xbit $r3 $r2 31
   bra e #chsw_prev_no_next
    push $r2
    mov b32 $r2 $r1
    trace_set(T_SAVE)
    bclr $flags $p1
    bset $flags $p2
    call(ctx_xfer)
    trace_clr(T_SAVE);
    pop $r2
    trace_set(T_LOAD);
    bset $flags $p1
    call(ctx_xfer)
    trace_clr(T_LOAD);
    bra #chsw_done
   chsw_prev_no_next:
    push $r2
    mov b32 $r2 $r1
    bclr $flags $p1
    bclr $flags $p2
    call(ctx_xfer)
    pop $r2
    nv_iowr(NV_PGRAPH_FECS_CHAN_ADDR, 0, $r2)
    bra #chsw_done
  chsw_no_prev:
   xbit $r3 $r2 31
   bra e #chsw_done
    bset $flags $p1
    bclr $flags $p2
    call(ctx_xfer)

  // ack the context switch request
  chsw_done:
  mov $r2 NV_PGRAPH_FECS_CHSW_ACK
  nv_iowr(NV_PGRAPH_FECS_CHSW, 0, $r2)
  trace_clr(T_AUTO)
  bra #main

 // request to set current channel? (*not* a context switch)
 main_not_ctx_switch:
 cmpu b32 $r14 0x0001
 bra ne #main_not_ctx_chan
  mov b32 $r2 $r15
  call(ctx_chan)
  bra #main_done

 // request to store current channel context?
 main_not_ctx_chan:
 cmpu b32 $r14 0x0002
 bra ne #main_not_ctx_save
  trace_set(T_SAVE)
  bclr $flags $p1
  bclr $flags $p2
  call(ctx_xfer)
  trace_clr(T_SAVE)
  bra #main_done

 main_not_ctx_save:
  shl b32 $r15 $r14 16
  or $r15 E_BAD_COMMAND
  call(error)
  bra #main

 main_done:
 clear b32 $r2
 bset $r2 31
 nv_iowr(NV_PGRAPH_FECS_CC_SCRATCH_SET(0), 0, $r2)
 bra #main

// interrupt handler
ih:
 push $r0
 push $r8
 mov $r8 $flags
 push $r8
 push $r9
 push $r10
 push $r11
 push $r13
 push $r14
 push $r15
 clear b32 $r0

 // incoming fifo command?
 nv_iord($r10, NV_PGRAPH_FECS_INTR, 0)
 and $r11 $r10 NV_PGRAPH_FECS_INTR_FIFO
 bra e #ih_no_fifo
  // queue incoming fifo command for later processing
  mov $r13 #cmd_queue
  nv_iord($r14, NV_PGRAPH_FECS_FIFO_CMD, 0)
  nv_iord($r15, NV_PGRAPH_FECS_FIFO_DATA, 0)
  call(queue_put)
  add b32 $r11 0x400
  mov $r14 1
  nv_iowr(NV_PGRAPH_FECS_FIFO_ACK, 0, $r14)

 // context switch request?
 ih_no_fifo:
 and $r11 $r10 NV_PGRAPH_FECS_INTR_CHSW
 bra e #ih_no_ctxsw
  // enqueue a context switch for later processing
  mov $r13 #cmd_queue
  mov $r14 0x4001
  call(queue_put)

 // firmware method?
 ih_no_ctxsw:
 and $r11 $r10 NV_PGRAPH_FECS_INTR_FWMTHD
 bra e #ih_no_fwmthd
  // none we handle; report to host and ack
  nv_rd32($r15, NV_PGRAPH_TRAPPED_DATA_LO)
  nv_iowr(NV_PGRAPH_FECS_CC_SCRATCH_VAL(4), 0, $r15)
  nv_rd32($r15, NV_PGRAPH_TRAPPED_ADDR)
  nv_iowr(NV_PGRAPH_FECS_CC_SCRATCH_VAL(3), 0, $r15)
  extr $r14 $r15 16:18
  shl b32 $r14 $r14 2
  imm32($r15, NV_PGRAPH_FE_OBJECT_TABLE(0))
  add b32 $r14 $r15
  call(nv_rd32)
  nv_iowr(NV_PGRAPH_FECS_CC_SCRATCH_VAL(2), 0, $r15)
  mov $r15 E_BAD_FWMTHD
  call(error)
  mov $r11 0x100
  nv_wr32(0x400144, $r11)

 // anything we didn't handle, bring it to the host's attention
 ih_no_fwmthd:
 mov $r11 0x504 // FIFO | CHSW | FWMTHD
 not b32 $r11
 and $r11 $r10 $r11
 bra e #ih_no_other
  nv_iowr(NV_PGRAPH_FECS_INTR_UP_SET, 0, $r11)

 // ack, and wake up main()
 ih_no_other:
 nv_iowr(NV_PGRAPH_FECS_INTR_ACK, 0, $r10)

 pop $r15
 pop $r14
 pop $r13
 pop $r11
 pop $r10
 pop $r9
 pop $r8
 mov $flags $r8
 pop $r8
 pop $r0
 bclr $flags $p0
 iret

#if CHIPSET < GK100
// Not real sure, but, MEM_CMD 7 will hang forever if this isn't done
ctx_4160s:
 mov $r15 1
 nv_wr32(0x404160, $r15)
 ctx_4160s_wait:
  nv_rd32($r15, 0x404160)
  xbit $r15 $r15 4
  bra e #ctx_4160s_wait
 ret

// Without clearing again at end of xfer, some things cause PGRAPH
// to hang with STATUS=0x00000007 until it's cleared.. fbcon can
// still function with it set however...
ctx_4160c:
 clear b32 $r15
 nv_wr32(0x404160, $r15)
 ret
#endif

// Again, not real sure
//
// In: $r15 value to set 0x404170 to
//
ctx_4170s:
 or $r15 0x10
 nv_wr32(0x404170, $r15)
 ret

// Waits for a ctx_4170s() call to complete
//
ctx_4170w:
 nv_rd32($r15, 0x404170)
 and $r15 0x10
 bra ne #ctx_4170w
 ret

// Disables various things, waits a bit, and re-enables them..
//
// Not sure how exactly this helps, perhaps "ENABLE" is not such a
// good description for the bits we turn off?  Anyways, without this,
// funny things happen.
//
ctx_redswitch:
 mov $r14 NV_PGRAPH_FECS_RED_SWITCH_ENABLE_GPC
 or  $r14 NV_PGRAPH_FECS_RED_SWITCH_POWER_ROP
 or  $r14 NV_PGRAPH_FECS_RED_SWITCH_POWER_GPC
 or  $r14 NV_PGRAPH_FECS_RED_SWITCH_POWER_MAIN
 nv_iowr(NV_PGRAPH_FECS_RED_SWITCH, 0, $r14)
 mov $r15 8
 ctx_redswitch_delay:
  sub b32 $r15 1
  bra ne #ctx_redswitch_delay
 or  $r14 NV_PGRAPH_FECS_RED_SWITCH_ENABLE_ROP
 or  $r14 NV_PGRAPH_FECS_RED_SWITCH_ENABLE_MAIN
 nv_iowr(NV_PGRAPH_FECS_RED_SWITCH, 0, $r14)
 ret

// Not a clue what this is for, except that unless the value is 0x10, the
// strand context is saved (and presumably restored) incorrectly..
//
// In: $r15 value to set to (0x00/0x10 are used)
//
ctx_86c:
 nv_iowr(NV_PGRAPH_FECS_UNK86C, 0, $r15)
 nv_wr32(0x408a14, $r15)
 nv_wr32(NV_PGRAPH_GPCX_GPCCS_UNK86C, $r15)
 ret

// In: $r15 NV_PGRAPH_FECS_MEM_CMD_*
ctx_mem:
 nv_iowr(NV_PGRAPH_FECS_MEM_CMD, 0, $r15)
 ctx_mem_wait:
  nv_iord($r15, NV_PGRAPH_FECS_MEM_CMD, 0)
  or $r15 $r15
  bra ne #ctx_mem_wait
 ret

// ctx_load - load's a channel's ctxctl data, and selects its vm
//
// In: $r2 channel address
//
ctx_load:
 trace_set(T_CHAN)

 // switch to channel, somewhat magic in parts..
 mov $r10 12  // DONE_UNK12
 call(wait_donez)
 clear b32 $r15
 nv_iowr(0x409a24, 0, $r15)
 nv_iowr(NV_PGRAPH_FECS_CHAN_NEXT, 0, $r2)
 nv_iowr(NV_PGRAPH_FECS_MEM_CHAN, 0, $r2)
 mov $r15 NV_PGRAPH_FECS_MEM_CMD_LOAD_CHAN
 call(ctx_mem)
 nv_iowr(NV_PGRAPH_FECS_CHAN_ADDR, 0, $r2)

 // load channel header, fetch PGRAPH context pointer
 mov $xtargets $r0
 bclr $r2 31
 shl b32 $r2 4
 add b32 $r2 2

 trace_set(T_LCHAN)
 nv_iowr(NV_PGRAPH_FECS_MEM_BASE, 0, $r2)
 imm32($r2, NV_PGRAPH_FECS_MEM_TARGET_UNK31)
 or  $r2 NV_PGRAPH_FECS_MEM_TARGET_AS_VRAM
 nv_iowr(NV_PGRAPH_FECS_MEM_TARGET, 0, $r2)
 mov $r1 0x10   // chan + 0x0210
 mov $r2 #xfer_data
 sethi $r2 0x00020000  // 16 bytes
 xdld $r1 $r2
 xdwait
 trace_clr(T_LCHAN)

 // update current context
 ld b32 $r1 D[$r0 + #xfer_data + 4]
 shl b32 $r1 24
 ld b32 $r2 D[$r0 + #xfer_data + 0]
 shr b32 $r2 8
 or $r1 $r2
 st b32 D[$r0 + #ctx_current] $r1

 // set transfer base to start of context, and fetch context header
 trace_set(T_LCTXH)
 nv_iowr(NV_PGRAPH_FECS_MEM_BASE, 0, $r1)
 mov $r2 NV_PGRAPH_FECS_MEM_TARGET_AS_VM
 nv_iowr(NV_PGRAPH_FECS_MEM_TARGET, 0, $r2)
 mov $r1 #chan_data
 sethi $r1 0x00060000  // 256 bytes
 xdld $r0 $r1
 xdwait
 trace_clr(T_LCTXH)

 trace_clr(T_CHAN)
 ret

// ctx_chan - handler for HUB_SET_CHAN command, will set a channel as
//            the active channel for ctxctl, but not actually transfer
//            any context data.  intended for use only during initial
//            context construction.
//
// In: $r2 channel address
//
ctx_chan:
#if CHIPSET < GK100
 call(ctx_4160s)
#endif
 call(ctx_load)
 mov $r10 12   // DONE_UNK12
 call(wait_donez)
 mov $r15 5 // MEM_CMD 5 ???
 call(ctx_mem)
#if CHIPSET < GK100
 call(ctx_4160c)
#endif
 ret

// Execute per-context state overrides list
//
// Only executed on the first load of a channel.  Might want to look into
// removing this and having the host directly modify the channel's context
// to change this state...  The nouveau DRM already builds this list as
// it's definitely needed for NVIDIA's, so we may as well use it for now
//
// Input: $r1 mmio list length
//
ctx_mmio_exec:
 // set transfer base to be the mmio list
 ld b32 $r3 D[$r0 + #chan_mmio_address]
 nv_iowr(NV_PGRAPH_FECS_MEM_BASE, 0, $r3)

 clear b32 $r3
 ctx_mmio_loop:
  // fetch next 256 bytes of mmio list if necessary
  and $r4 $r3 0xff
  bra ne #ctx_mmio_pull
   mov $r5 #xfer_data
   sethi $r5 0x00060000 // 256 bytes
   xdld $r3 $r5
   xdwait

  // execute a single list entry
  ctx_mmio_pull:
  ld b32 $r14 D[$r4 + #xfer_data + 0x00]
  ld b32 $r15 D[$r4 + #xfer_data + 0x04]
  call(nv_wr32)

  // next!
  add b32 $r3 8
  sub b32 $r1 1
  bra ne #ctx_mmio_loop

 // set transfer base back to the current context
 ctx_mmio_done:
 ld b32 $r3 D[$r0 + #ctx_current]
 nv_iowr(NV_PGRAPH_FECS_MEM_BASE, 0, $r3)

 // disable the mmio list now, we don't need/want to execute it again
 st b32 D[$r0 + #chan_mmio_count] $r0
 mov $r1 #chan_data
 sethi $r1 0x00060000  // 256 bytes
 xdst $r0 $r1
 xdwait
 ret

// Transfer HUB context data between GPU and storage area
//
// In: $r2 channel address
//     $p1 clear on save, set on load
//     $p2 set if opposite direction done/will be done, so:
//  on save it means: "a load will follow this save"
//  on load it means: "a save preceeded this load"
//
ctx_xfer:
 // according to mwk, some kind of wait for idle
 mov $r14 4
 nv_iowr(0x409c08, 0, $r14)
 ctx_xfer_idle:
  nv_iord($r14, 0x409c00, 0)
  and $r14 0x2000
  bra ne #ctx_xfer_idle

 bra not $p1 #ctx_xfer_pre
 bra $p2 #ctx_xfer_pre_load
 ctx_xfer_pre:
  mov $r15 0x10
  call(ctx_86c)
#if CHIPSET < GK100
  call(ctx_4160s)
#endif
  bra not $p1 #ctx_xfer_exec

 ctx_xfer_pre_load:
  mov $r15 2
  call(ctx_4170s)
  call(ctx_4170w)
  call(ctx_redswitch)
  clear b32 $r15
  call(ctx_4170s)
  call(ctx_load)

 // fetch context pointer, and initiate xfer on all GPCs
 ctx_xfer_exec:
 ld b32 $r1 D[$r0 + #ctx_current]

 clear b32 $r2
 nv_iowr(NV_PGRAPH_FECS_BAR, 0, $r2)

 nv_wr32(0x41a500, $r1) // GPC_BCAST_WRCMD_DATA = ctx pointer
 xbit $r15 $flags $p1
 xbit $r2 $flags $p2
 shl b32 $r2 1
 or $r15 $r2
 nv_wr32(0x41a504, $r15) // GPC_BCAST_WRCMD_CMD = GPC_XFER(type)

 // strands
 call(strand_pre)
 clear b32 $r2
 nv_iowr(NV_PGRAPH_FECS_STRAND_SELECT, 0x3f, $r2)
 xbit $r2 $flags $p1 // SAVE/LOAD
 add b32 $r2 NV_PGRAPH_FECS_STRAND_CMD_SAVE
 nv_iowr(NV_PGRAPH_FECS_STRAND_CMD, 0x3f, $r2)

 // mmio context
 xbit $r10 $flags $p1 // direction
 or $r10 6  // first, last
 mov $r11 0  // base = 0
 ld b32 $r12 D[$r0 + #hub_mmio_list_head]
 ld b32 $r13 D[$r0 + #hub_mmio_list_tail]
 mov $r14 0  // not multi
 call(mmctx_xfer)

 // wait for GPCs to all complete
 mov $r10 8  // DONE_BAR
 call(wait_doneo)

 // wait for strand xfer to complete
 call(strand_wait)

 // post-op
 bra $p1 #ctx_xfer_post
  mov $r10 12  // DONE_UNK12
  call(wait_donez)
  mov $r15 5 // MEM_CMD 5 ???
  call(ctx_mem)

 bra $p2 #ctx_xfer_done
 ctx_xfer_post:
  mov $r15 2
  call(ctx_4170s)
  clear b32 $r15
  call(ctx_86c)
  call(strand_post)
  call(ctx_4170w)
  clear b32 $r15
  call(ctx_4170s)

  bra not $p1 #ctx_xfer_no_post_mmio
  ld b32 $r1 D[$r0 + #chan_mmio_count]
  or $r1 $r1
  bra e #ctx_xfer_no_post_mmio
   call(ctx_mmio_exec)

  ctx_xfer_no_post_mmio:
#if CHIPSET < GK100
  call(ctx_4160c)
#endif

 ctx_xfer_done:
 ret
#endif

[ Dauer der Verarbeitung: 0.3 Sekunden  (vorverarbeitet)  ]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge