summaryrefslogtreecommitdiff
path: root/manuals/volta/gv100/dev_mmu_fault.ref.txt
diff options
context:
space:
mode:
Diffstat (limited to 'manuals/volta/gv100/dev_mmu_fault.ref.txt')
-rw-r--r--manuals/volta/gv100/dev_mmu_fault.ref.txt269
1 files changed, 269 insertions, 0 deletions
diff --git a/manuals/volta/gv100/dev_mmu_fault.ref.txt b/manuals/volta/gv100/dev_mmu_fault.ref.txt
new file mode 100644
index 0000000..e4e62db
--- /dev/null
+++ b/manuals/volta/gv100/dev_mmu_fault.ref.txt
@@ -0,0 +1,269 @@
+Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved.
+
+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 AUTHORS OR COPYRIGHT HOLDERS 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.
+--------------------------------------------------------------------------------
+
+
+1 - INTRODUCTION
+==================
+
+This manual contains information definition of replayable (UVM)
+and non-replayable fault buffer packet in memory. Both type of faults
+use same packet format in memory although separate fault buffers are
+used.
+
+The goal of the UVM feature is to have a single unified virtual memory space
+for both GPU and CPU memory accesses. In addition to the unified address
+space, UVM allows the GPU driver to support demand paging, and seamlessly
+migrate pages from GPU RAM to the primary system memory.
+
+This is done by allowing page faults to be stalling and support replay, and by
+reporting page faults to the operating system or GPU driver in an efficient
+manner.
+
+Non-replayable faults are various mapping and permission related
+faults and are usually fatal.
+
+
+
+2 - GPU FAULT BUFFER
+======================================
+This chapter describes the format of the GPU replayable and
+non-replayable fault reporting buffer used to report page faults.
+
+
+This fault buffer is written to by GMMU based on buffer location info
+set in GMMU registers (NV_PFB_PRI_MMU_REPLAY_FAULT_BUFFER_LO/HI and
+NV_PFB_PRI_MMU_NON_REPLAY_FAULT_BUFFER_LO/HI). The replayable fault
+buffer is managed by the UVM driver. The non-replayable fault buffer
+is managed by RM.
+
+
+The size of the fault buffer is controlled by SIZE register in GMMU
+which can be programmed by SW. If SW does not want to program the SIZE
+(because SW does not know/have enough info) then SW can write a SIZE
+CTL bit (SET_DEFAULT) in GMMU register to set the size to a HW
+recommended value. On that SIZE CTL bit write, GMMU will calculate the
+recommended value based on chip size and so and write the recommended
+value.
+
+
+The buffer can overflow. There is status maintained in GMMU register
+for that. If the buffer has overflowed the GPU will stop writing out new fault
+entries and proceed to drop entries until SW resets the overflow
+status (normally after processing the existing fault packets and so
+GET PTR is changed). This is done to prevent the GPU from overwriting
+unprocessed entries. When faults are dropped they are not lost for
+replayable faults as the requets are buffered in MMU replay buffer;
+however, non-replayable faults are lost as those requests are not
+buffered for further processing; when SW triggers a replay event the
+requests for the dropped replayable faults will be replayed, fault
+again, and then be reported in the fault buffer.
+
+Each entry is of size NV_MMU_FAULT_BUFFER_PACKET_SIZE (=32) bytes and
+contains the fault information necessary for (1) the UVM driver to
+perform necessary page migrations and house keeping in response to a
+replayable fault for replayable fault and (2) the RM to perform
+graceful exit for the non-replayable fault.
+
+The ENGINE_ID field specifies the faulting MMU engine id.
+
+The APERTURE field specifies the GPU physical APERTURE of the instance block
+used for the request. VID_MEM indicates the instance block was stored in the
+GPU devices RAM. SYS_MEM_COHERENT indicates the instance block was stored in
+coherent system memory. SYS_MEM_NONCOHERENT indicates the page table was stored
+in non-coherent system memory.
+
+
+INST_LO is used to specify bits 32:12 of the physical 4KB aligned instance
+block associated with the faulting request. INST_LO is aligned to this 4KB
+boundary and so the bottom 12 bits are not reported in this data structure, and
+this space is used to specify other fields. The instance block contains the
+pointers to the page table used for the memory request.
+
+
+
+
+INST_HI contains the high order bits of the instance block associated with the
+memory request. Space is reserved to allow INST_HI to eventually expand up to
+64 bits.
+
+ADDR_LO and ADDR_HI specify the 4K-aligned address (virtual or
+physical based on ACCESS_TYPE) of the faulting request. Up to 64 bits
+4K-aligned address can be reported; however,the bit width of the
+addresses supported by a given GPU depends on the GPU's family.
+
+PHYS_APERTURE specifies the aperture of the faulting address.
+
+
+FAULT_TYPE indicates the type of fault which occurred. For a list of different
+fault types please see the NV_PFAULT_FAULT_TYPE_* defines in dev_fault.ref.
+
+REPLAYABLE_FAULT(RF) indicates whether this fault is a replayable fault or
+not. This bit is set false when (1) the fault is non-replayable or (2)
+fault is replayable but has been cancelled.
+
+CLIENT indicates which MMU client generated the faulting request.
+
+The ACCESS_TYPE field indicates the type of the faulting request.
+
+MMU_CLIENT_TYPE indicates whether the faulting request originated in a GPC, or
+if it came from another type of HUB client. This field determines how the
+CLIENT field should be interpreted.
+
+
+GPC_ID specifies the GPC which generated the faulting request if MMU_CLIENT_TYPE
+will be NV_PFAULT_MMU_CLIENT_TYPE_GPC, meaning the request came from a GPC
+client. Otherwise the GPC_ID field should be ignored.
+
+
+REPLAYABLE_FAULT_EN (R) is set to true if replayable fault is enabled for
+any client in the instance block. It does not indicate whether the fault is replayable.
+
+VALID (V) indicates that this current buffer entry is VALID.
+
+#define NV_MMU_FAULT_BUF /* ----G */
+#define NV_MMU_FAULT_BUF_ENTRY 0x1F:0x00000000 /* RW--M */
+
+Size of a buffer entry in bytes
+#define NV_MMU_FAULT_BUF_SIZE 32 /* */
+
+#define NV_MMU_FAULT_BUF_ENTRY_INST_APERTURE (9+0*32):(0*32+8) /* RWXVF */
+#define NV_MMU_FAULT_BUF_ENTRY_INST_APERTURE_VID_MEM 0x00000000 /* RW--V */
+#define NV_MMU_FAULT_BUF_ENTRY_INST_APERTURE_SYS_MEM_COHERENT 0x00000002 /* RW--V */
+#define NV_MMU_FAULT_BUF_ENTRY_INST_APERTURE_SYS_MEM_NONCOHERENT 0x00000003 /* RW--V */
+
+#define NV_MMU_FAULT_BUF_ENTRY_INST_LO (31+0*32):(0*32+12) /* RWXVF */
+#define NV_MMU_FAULT_BUF_ENTRY_INST_HI (31+1*32):(1*32+0) /* RWXVF */
+Dword-spanning field define alias
+#define NV_MMU_FAULT_BUF_ENTRY_INST (31+1*32):(0*32+12) /* */
+
+#define NV_MMU_FAULT_BUF_ENTRY_ADDR_PHYS_APERTURE (1+2*32):(2*32+0) /* RWXVF */
+#define NV_MMU_FAULT_BUF_ENTRY_ADDR_LO (31+2*32):(2*32+12) /* RWXVF */
+#define NV_MMU_FAULT_BUF_ENTRY_ADDR_HI (31+3*32):(3*32+0) /* RWXVF */
+Dword-spanning field define alias
+#define NV_MMU_FAULT_BUF_ENTRY_ADDR (31+3*32):(2*32+12) /* */
+
+#define NV_MMU_FAULT_BUF_ENTRY_TIMESTAMP_LO (31+4*32):(4*32+0) /* RWXVF */
+#define NV_MMU_FAULT_BUF_ENTRY_TIMESTAMP_HI (31+5*32):(5*32+0) /* RWXVF */
+Dword-spanning field define alias
+#define NV_MMU_FAULT_BUF_ENTRY_TIMESTAMP (31+5*32):(4*32+0) /* */
+
+#define NV_MMU_FAULT_BUF_ENTRY_ENGINE_ID (8+6*32):(6*32+0) /* RWXVF */
+
+#define NV_MMU_FAULT_BUF_ENTRY_FAULT_TYPE (4+7*32):(7*32+0) /* RWXVF */
+
+#define NV_MMU_FAULT_BUF_ENTRY_REPLAYABLE_FAULT (7+7*32):(7*32+7) /* RWXVF */
+#define NV_MMU_FAULT_BUF_ENTRY_REPLAYABLE_FAULT_FALSE 0x00000000 /* RWX-V */
+#define NV_MMU_FAULT_BUF_ENTRY_REPLAYABLE_FAULT_TRUE 0x00000001 /* RWX-V */
+
+#define NV_MMU_FAULT_BUF_ENTRY_CLIENT (14+7*32):(7*32+8) /* RWXVF */
+
+#define NV_MMU_FAULT_BUF_ENTRY_ACCESS_TYPE (19+7*32):(7*32+16) /* RWXVF */
+
+#define NV_MMU_FAULT_BUF_ENTRY_MMU_CLIENT_TYPE (20+7*32):(7*32+20) /* RWXVF */
+
+#define NV_MMU_FAULT_BUF_ENTRY_GPC_ID (28+7*32):(7*32+24) /* RWXVF */
+
+
+#define NV_MMU_FAULT_BUF_ENTRY_REPLAYABLE_FAULT_EN (30+7*32):(7*32+30) /* RWXVF */
+#define NV_MMU_FAULT_BUF_ENTRY_REPLAYABLE_FAULT_EN_FALSE 0x00000000 /* RWX-V */
+#define NV_MMU_FAULT_BUF_ENTRY_REPLAYABLE_FAULT_EN_TRUE 0x00000001 /* RWX-V */
+
+// NOTE: VALID must be in the last byte in the packet for proper write ordering
+#define NV_MMU_FAULT_BUF_ENTRY_VALID (31+7*32):(7*32+31) /* RWXVF */
+#define NV_MMU_FAULT_BUF_ENTRY_VALID_FALSE 0x00000000 /* RWX-V */
+#define NV_MMU_FAULT_BUF_ENTRY_VALID_TRUE 0x00000001 /* RWX-V */
+
+
+--------------------------------------------------------------------------------
+ KEY LEGEND
+--------------------------------------------------------------------------------
+
+Each define in the .ref file has a 5 field code to say what kind of define it is: i.e. /* RW--R */
+The following legend shows accepted values for each of the 5 fields:
+ Read, Write, Internal State, Declaration/Size, and Define Indicator.
+
+ Read
+ ' ' = Other Information
+ '-' = Field is part of a write-only register
+ 'C' = Value read is always the same, constant value line follows (C)
+ 'R' = Value is read
+
+
+ Write
+ ' ' = Other Information
+ '-' = Must not be written (D), value ignored when written (R,A,F)
+ 'W' = Can be written
+
+
+ Internal State
+ ' ' = Other Information
+ '-' = No internal state
+ 'X' = Internal state, initial value is unknown
+ 'I' = Internal state, initial value is known and follows (I), see "Reset Signal" section for signal.
+ 'E' = Internal state, initial value is known and follows (E), see "Reset Signal" section for signal.
+ 'B' = Internal state, initial value is known and follows (B), see "Reset Signal" section for signal.
+ 'C' = Internal state, initial value is known and follows (C), see "Reset Signal" section for signal.
+
+ 'V' = (legacy) Internal state, initialize at volatile reset
+ 'D' = (legacy) Internal state, default initial value at object creation (legacy: Only used in dev_ram.ref)
+ 'C' = (legacy) Internal state, initial value at object creation
+ 'C' = (legacy) Internal state, class-based initial value at object creation (legacy: Only used in dev_ram.ref)
+
+
+ Declaration/Size
+ ' ' = Other Information
+ '-' = Does Not Apply
+ 'V' = Type is void
+ 'U' = Type is unsigned integer
+ 'S' = Type is signed integer
+ 'F' = Type is IEEE floating point
+ '1' = Byte size (008)
+ '2' = Short size (016)
+ '3' = Three byte size (024)
+ '4' = Word size (032)
+ '8' = Double size (064)
+
+
+ Define Indicator
+ ' ' = Other Information
+ 'C' = Clear value
+ 'D' = Device
+ 'L' = Logical device.
+ 'M' = Memory
+ 'R' = Register
+ 'A' = Array of Registers
+ 'F' = Field
+ 'V' = Value
+ 'T' = Task
+ 'P' = Phantom Register
+
+ 'B' = (legacy) Bundle address
+ 'G' = (legacy) General purpose configuration register
+ 'C' = (legacy) Class
+
+ Reset signal defaults for graphics engine registers.
+ All graphics engine registers use the following defaults for reset signals:
+ 'E' = initialized with engine_reset_
+ 'I' = initialized with context_reset_
+ 'B' = initialized with reset_IB_dly_
+
+ Reset signal
+ For units that differ from the graphics engine defaults, the reset signals should be defined here: