mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2026-05-09 06:18:05 +02:00
On GFX6-GFX12, except GFX9, SMEM loads on NULL PRT pages would just fault and hang the GPU. The better workaround that we found is to split the address space in two equal parts "LOW"/"HIGH", here's more details: To workaround that, the driver splits the total VA space in half, so that a single bit controls whether it's the "HIGH" or the "LOW" address space. Every sparse residency buffer allocations that might be used with SMEM get two allocations: - the "HIGH" address space is mapped normally and its VA is returned to the application. - the "LOW" address space is explicitly mapped to a zero-initialized buffer when it's allocated or when it's unmapped. Other buffer allocations are always allocated in the "LOW" address. The driver also creates a zero-allocated BO that will be used to map partially resident buffers at creation and when explicitly unmapped. The size is arbitrary but it seems that allocating 8MiB is perfectly reasonable and fast enough in most cases. This BO is marked as read-only for the GPU because the backend compilers don't use SMEM stores. For example this makes the "LOW" half of the HIGH VA range like [0xffff800100000000,0xffffbfffffbfe000], and the "HIGH" half is left for PRT. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
55 lines
1.8 KiB
C
55 lines
1.8 KiB
C
/*
|
|
* Copyright 2014 Advanced Micro Devices, 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.
|
|
*
|
|
*/
|
|
|
|
#ifndef _UTIL_MATH_H_
|
|
#define _UTIL_MATH_H_
|
|
|
|
#define MIN2( A, B ) ( (A)<(B) ? (A) : (B) )
|
|
#define MAX2( A, B ) ( (A)>(B) ? (A) : (B) )
|
|
#define MAX3( A, B, C ) ((A) > (B) ? MAX2(A, C) : MAX2(B, C))
|
|
|
|
#define __align_mask(value, mask) (((value) + (mask)) & ~(mask))
|
|
#define ALIGN(value, alignment) __align_mask(value, (__typeof__(value))((alignment) - 1))
|
|
|
|
static inline unsigned
|
|
util_last_bit64(uint64_t u)
|
|
{
|
|
#if defined(HAVE___BUILTIN_CLZLL)
|
|
return u == 0 ? 0 : 64 - __builtin_clzll(u);
|
|
#elif defined(_MSC_VER) && (_M_AMD64 || _M_ARM64 || _M_IA64)
|
|
unsigned long index;
|
|
if (_BitScanReverse64(&index, u))
|
|
return index + 1;
|
|
else
|
|
return 0;
|
|
#else
|
|
unsigned r = 0;
|
|
while (u) {
|
|
r++;
|
|
u >>= 1;
|
|
}
|
|
return r;
|
|
#endif
|
|
}
|
|
|
|
#endif /*_UTIL_MATH_H_*/
|