Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 7 kB image not shown  

Quelle  com.fuc   Sprache: unbekannt

 
Spracherkennung für: .fuc vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]

/* fuc microcode util functions for gf100 PGRAPH
 *
 * 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_CODE
// queue_put - add request to queue
//
// In : $r13 queue pointer
// $r14 command
// $r15 data
//
queue_put:
 // make sure we have space..
 ld b32 $r8 D[$r13 + 0x0] // GET
 ld b32 $r9 D[$r13 + 0x4] // PUT
 xor $r8 8
 cmpu b32 $r8 $r9
 bra ne #queue_put_next
  mov $r15 E_CMD_OVERFLOW
  call(error)
  ret

 // store cmd/data on queue
 queue_put_next:
 and $r8 $r9 7
 shl b32 $r8 3
 add b32 $r8 $r13
 add b32 $r8 8
 st b32 D[$r8 + 0x0] $r14
 st b32 D[$r8 + 0x4] $r15

 // update PUT
 add b32 $r9 1
 and $r9 0xf
 st b32 D[$r13 + 0x4] $r9
 ret

// queue_get - fetch request from queue
//
// In : $r13 queue pointer
//
// Out: $p1  clear on success (data available)
// $r14 command
//  $r15 data
//
queue_get:
 bset $flags $p1
 ld b32 $r8 D[$r13 + 0x0] // GET
 ld b32 $r9 D[$r13 + 0x4] // PUT
 cmpu b32 $r8 $r9
 bra e #queue_get_done
  // fetch first cmd/data pair
  and $r9 $r8 7
  shl b32 $r9 3
  add b32 $r9 $r13
  add b32 $r9 8
  ld b32 $r14 D[$r9 + 0x0]
  ld b32 $r15 D[$r9 + 0x4]

  // update GET
  add b32 $r8 1
  and $r8 0xf
  st b32 D[$r13 + 0x0] $r8
  bclr $flags $p1
queue_get_done:
 ret

// nv_rd32 - read 32-bit value from nv register
//
// In : $r14 register
// Out: $r15 value
//
nv_rd32:
 mov b32 $r12 $r14
 bset $r12 31   // MMIO_CTRL_PENDING
 nv_iowr(NV_PGRAPH_FECS_MMIO_CTRL, 0, $r12)
 nv_rd32_wait:
  nv_iord($r12, NV_PGRAPH_FECS_MMIO_CTRL, 0)
  xbit $r12 $r12 31
  bra ne #nv_rd32_wait
 mov $r10 6   // DONE_MMIO_RD
 call(wait_doneo)
 nv_iord($r15, NV_PGRAPH_FECS_MMIO_RDVAL, 0)
 ret

// nv_wr32 - write 32-bit value to nv register
//
// In : $r14 register
//      $r15 value
//
nv_wr32:
 nv_iowr(NV_PGRAPH_FECS_MMIO_WRVAL, 0, $r15)
 mov b32 $r12 $r14
 bset $r12 31   // MMIO_CTRL_PENDING
 bset $r12 30   // MMIO_CTRL_WRITE
 nv_iowr(NV_PGRAPH_FECS_MMIO_CTRL, 0, $r12)
 nv_wr32_wait:
  nv_iord($r12, NV_PGRAPH_FECS_MMIO_CTRL, 0)
  xbit $r12 $r12 31
  bra ne #nv_wr32_wait
 ret

// wait_donez - wait on FUC_DONE bit to become clear
//
// In : $r10 bit to wait on
//
wait_donez:
 trace_set(T_WAIT);
 nv_iowr(NV_PGRAPH_FECS_CC_SCRATCH_VAL(6), 0, $r10)
 wait_donez_ne:
  nv_iord($r8, NV_PGRAPH_FECS_SIGNAL, 0)
  xbit $r8 $r8 $r10
  bra ne #wait_donez_ne
 trace_clr(T_WAIT)
 ret

// wait_doneo - wait on FUC_DONE bit to become set
//
// In : $r10 bit to wait on
//
wait_doneo:
 trace_set(T_WAIT);
 nv_iowr(NV_PGRAPH_FECS_CC_SCRATCH_VAL(6), 0, $r10)
 wait_doneo_e:
  nv_iord($r8, NV_PGRAPH_FECS_SIGNAL, 0)
  xbit $r8 $r8 $r10
  bra e #wait_doneo_e
 trace_clr(T_WAIT)
 ret

// mmctx_size - determine size of a mmio list transfer
//
// In : $r14 mmio list head
//      $r15 mmio list tail
// Out: $r15 transfer size (in bytes)
//
mmctx_size:
 clear b32 $r9
 nv_mmctx_size_loop:
  ld b32 $r8 D[$r14]
  shr b32 $r8 26
  add b32 $r8 1
  shl b32 $r8 2
  add b32 $r9 $r8
  add b32 $r14 4
  cmpu b32 $r14 $r15
  bra ne #nv_mmctx_size_loop
 mov b32 $r15 $r9
 ret

// mmctx_xfer - execute a list of mmio transfers
//
// In : $r10 flags
//  bit 0: direction (0 = save, 1 = load)
//  bit 1: set if first transfer
//  bit 2: set if last transfer
// $r11 base
// $r12 mmio list head
// $r13 mmio list tail
// $r14 multi_stride
// $r15 multi_mask
//
mmctx_xfer:
 trace_set(T_MMCTX)
 clear b32 $r9
 or $r11 $r11
 bra e #mmctx_base_disabled
  nv_iowr(NV_PGRAPH_FECS_MMCTX_BASE, 0, $r11)
  bset $r9 0   // BASE_EN
 mmctx_base_disabled:
 or $r14 $r14
 bra e #mmctx_multi_disabled
  nv_iowr(NV_PGRAPH_FECS_MMCTX_MULTI_STRIDE, 0, $r14)
  nv_iowr(NV_PGRAPH_FECS_MMCTX_MULTI_MASK, 0, $r15)
  bset $r9 1   // MULTI_EN
 mmctx_multi_disabled:

 xbit $r11 $r10 0
 shl b32 $r11 16   // DIR
 bset $r11 12   // QLIMIT = 0x10
 xbit $r14 $r10 1
 shl b32 $r14 17
 or $r11 $r14   // START_TRIGGER
 nv_iowr(NV_PGRAPH_FECS_MMCTX_CTRL, 0, $r11)

 // loop over the mmio list, and send requests to the hw
 mmctx_exec_loop:
  // wait for space in mmctx queue
  mmctx_wait_free:
   nv_iord($r14, NV_PGRAPH_FECS_MMCTX_CTRL, 0)
   and $r14 0x1f
   bra e #mmctx_wait_free

  // queue up an entry
  ld b32 $r14 D[$r12]
  or $r14 $r9
  nv_iowr(NV_PGRAPH_FECS_MMCTX_QUEUE, 0, $r14)
  add b32 $r12 4
  cmpu b32 $r12 $r13
  bra ne #mmctx_exec_loop

 xbit $r11 $r10 2
 bra ne #mmctx_stop
  // wait for queue to empty
  mmctx_fini_wait:
   nv_iord($r11, NV_PGRAPH_FECS_MMCTX_CTRL, 0)
   and $r11 0x1f
   cmpu b32 $r11 0x10
   bra ne #mmctx_fini_wait
  mov $r10 5   // DONE_MMCTX
  call(wait_donez)
  bra #mmctx_done
 mmctx_stop:
  xbit $r11 $r10 0
  shl b32 $r11 16   // DIR
  bset $r11 12   // QLIMIT = 0x10
  bset $r11 18   // STOP_TRIGGER
  nv_iowr(NV_PGRAPH_FECS_MMCTX_CTRL, 0, $r11)
  mmctx_stop_wait:
   // wait for STOP_TRIGGER to clear
   nv_iord($r11, NV_PGRAPH_FECS_MMCTX_CTRL, 0)
   xbit $r11 $r11 18
   bra ne #mmctx_stop_wait
 mmctx_done:
 trace_clr(T_MMCTX)
 ret

// Wait for DONE_STRAND
//
strand_wait:
 push $r10
 mov $r10 2
 call(wait_donez)
 pop $r10
 ret

// unknown - call before issuing strand commands
//
strand_pre:
 mov $r9 NV_PGRAPH_FECS_STRAND_CMD_ENABLE
 nv_iowr(NV_PGRAPH_FECS_STRAND_CMD, 0x3f, $r9)
 call(strand_wait)
 ret

// unknown - call after issuing strand commands
//
strand_post:
 mov $r9 NV_PGRAPH_FECS_STRAND_CMD_DISABLE
 nv_iowr(NV_PGRAPH_FECS_STRAND_CMD, 0x3f, $r9)
 call(strand_wait)
 ret

// Selects strand set?!
//
// In: $r14 id
//
strand_set:
 mov $r12 0xf
 nv_iowr(NV_PGRAPH_FECS_STRAND_FILTER, 0x3f, $r12)
 mov $r12 NV_PGRAPH_FECS_STRAND_CMD_DEACTIVATE_FILTER
 nv_iowr(NV_PGRAPH_FECS_STRAND_CMD, 0x3f, $r12)
 nv_iowr(NV_PGRAPH_FECS_STRAND_FILTER, 0x3f, $r14)
 mov $r12 NV_PGRAPH_FECS_STRAND_CMD_ACTIVATE_FILTER
 nv_iowr(NV_PGRAPH_FECS_STRAND_CMD, 0x3f, $r12)
 call(strand_wait)
 ret

// Initialise strand context data
//
// In : $r15 context base
// Out: $r15 context size (in bytes)
//
// Strandset(?) 3 hardcoded currently
//
strand_ctx_init:
 trace_set(T_STRINIT)
 call(strand_pre)
 mov $r14 3
 call(strand_set)

 clear b32 $r12
 nv_iowr(NV_PGRAPH_FECS_STRAND_SELECT, 0x3f, $r12)
 mov $r12 NV_PGRAPH_FECS_STRAND_CMD_SEEK
 nv_iowr(NV_PGRAPH_FECS_STRAND_CMD, 0x3f, $r12)
 call(strand_wait)
 sub b32 $r12 $r0 1
 nv_iowr(NV_PGRAPH_FECS_STRAND_DATA, 0x3f, $r12)
 mov $r12 NV_PGRAPH_FECS_STRAND_CMD_GET_INFO
 nv_iowr(NV_PGRAPH_FECS_STRAND_CMD, 0x3f, $r12)
 call(strand_wait)
 call(strand_post)

 // read the size of each strand, poke the context offset of
 // each into STRAND_{SAVE,LOAD}_SWBASE now, no need to worry
 // about it later then.
 nv_mkio($r8, NV_PGRAPH_FECS_STRAND_SAVE_SWBASE, 0x00)
 nv_iord($r9, NV_PGRAPH_FECS_STRANDS_CNT, 0x00)
 shr b32 $r14 $r15 8
 ctx_init_strand_loop:
  iowr I[$r8 + 0x000] $r14 // STRAND_SAVE_SWBASE
  iowr I[$r8 + 0x100] $r14 // STRAND_LOAD_SWBASE
  iord $r10 I[$r8 + 0x200] // STRAND_SIZE
  shr b32 $r10 6
  add b32 $r10 1
  add b32 $r14 $r10
  add b32 $r8 4
  sub b32 $r9 1
  bra ne #ctx_init_strand_loop

 shl b32 $r14 8
 sub b32 $r15 $r14 $r15
 trace_clr(T_STRINIT)
 ret
#endif

[ Dauer der Verarbeitung: 0.39 Sekunden  ]