2015-04-20 16:55:21 -04:00
/*
* Copyright 2014 Advanced Micro Devices , Inc .
* Copyright 2008 Red Hat Inc .
* Copyright 2009 Jerome Glisse .
*
* 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 .
*
*/
# include <drm/drmP.h>
# include "amdgpu.h"
2016-10-22 16:48:25 +08:00
# include "amdgpu_gfx.h"
2015-04-20 16:55:21 -04:00
/*
* GPU scratch registers helpers function .
*/
/**
* amdgpu_gfx_scratch_get - Allocate a scratch register
*
* @ adev : amdgpu_device pointer
* @ reg : scratch register mmio offset
*
* Allocate a CP scratch register for use by the driver ( all asics ) .
* Returns 0 on success or - EINVAL on failure .
*/
int amdgpu_gfx_scratch_get ( struct amdgpu_device * adev , uint32_t * reg )
{
int i ;
for ( i = 0 ; i < adev - > gfx . scratch . num_reg ; i + + ) {
if ( adev - > gfx . scratch . free [ i ] ) {
adev - > gfx . scratch . free [ i ] = false ;
* reg = adev - > gfx . scratch . reg [ i ] ;
return 0 ;
}
}
return - EINVAL ;
}
/**
* amdgpu_gfx_scratch_free - Free a scratch register
*
* @ adev : amdgpu_device pointer
* @ reg : scratch register mmio offset
*
* Free a CP scratch register allocated for use by the driver ( all asics )
*/
void amdgpu_gfx_scratch_free ( struct amdgpu_device * adev , uint32_t reg )
{
int i ;
for ( i = 0 ; i < adev - > gfx . scratch . num_reg ; i + + ) {
if ( adev - > gfx . scratch . reg [ i ] = = reg ) {
adev - > gfx . scratch . free [ i ] = true ;
return ;
}
}
}
2016-06-17 19:31:33 +02:00
/**
* amdgpu_gfx_parse_disable_cu - Parse the disable_cu module parameter
*
* @ mask : array in which the per - shader array disable masks will be stored
* @ max_se : number of SEs
* @ max_sh : number of SHs
*
* The bitmask of CUs to be disabled in the shader array determined by se and
* sh is stored in mask [ se * max_sh + sh ] .
*/
void amdgpu_gfx_parse_disable_cu ( unsigned * mask , unsigned max_se , unsigned max_sh )
{
unsigned se , sh , cu ;
const char * p ;
memset ( mask , 0 , sizeof ( * mask ) * max_se * max_sh ) ;
if ( ! amdgpu_disable_cu | | ! * amdgpu_disable_cu )
return ;
p = amdgpu_disable_cu ;
for ( ; ; ) {
char * next ;
int ret = sscanf ( p , " %u.%u.%u " , & se , & sh , & cu ) ;
if ( ret < 3 ) {
DRM_ERROR ( " amdgpu: could not parse disable_cu \n " ) ;
return ;
}
if ( se < max_se & & sh < max_sh & & cu < 16 ) {
DRM_INFO ( " amdgpu: disabling CU %u.%u.%u \n " , se , sh , cu ) ;
mask [ se * max_sh + sh ] | = 1u < < cu ;
} else {
DRM_ERROR ( " amdgpu: disable_cu %u.%u.%u is out of range \n " ,
se , sh , cu ) ;
}
next = strchr ( p , ' , ' ) ;
if ( ! next )
break ;
p = next + 1 ;
}
}