P4 to Git Change 1572945 by jatang@jatang-opencl-hsa-stg5 on 2018/06/26 16:09:41

SWDEV-155654 - TDR\BSOD observed while running Nuke Performance Benchmark test on Hawaii Asics.

	Need to support the new power-related appprofile parameters for gfx8 ASICs.

Affected files ...

... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuappprofile.cpp#14 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuappprofile.hpp#8 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpudevice.cpp#592 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gslbe/src/rt/GSLDevice.cpp#183 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gslbe/src/rt/GSLDevice.h#64 edit
This commit is contained in:
foreman
2018-06-26 16:18:18 -04:00
orang tua a7bd1f9ece
melakukan 717c0e3e6c
5 mengubah file dengan 201 tambahan dan 13 penghapusan
@@ -50,6 +50,28 @@ CALGSLDevice::~CALGSLDevice()
{
assert(m_adp == 0); /// CALBE client must call close explicitly. Check that here
if (m_scfg.sclkActivityThresholdPtr.hasValue) {
osMemFree(m_scfg.sclkActivityThresholdPtr.value);
}
if (m_scfg.sclkDownHysteresisPtr.hasValue) {
osMemFree(m_scfg.sclkDownHysteresisPtr.value);
}
if (m_scfg.sclkUpHysteresisPtr.hasValue) {
osMemFree(m_scfg.sclkUpHysteresisPtr.value);
}
if (m_scfg.packagePowerLimitPtr.hasValue) {
osMemFree(m_scfg.packagePowerLimitPtr.value);
}
if (m_scfg.mclkActivityThresholdPtr.hasValue) {
osMemFree(m_scfg.mclkActivityThresholdPtr.value);
}
if (m_scfg.mclkUpHysteresisPtr.hasValue) {
osMemFree(m_scfg.mclkUpHysteresisPtr.value);
}
if (m_scfg.mclkDownHysteresisPtr.hasValue) {
osMemFree(m_scfg.mclkDownHysteresisPtr.value);
}
delete gslDeviceOps_;
}
@@ -123,8 +145,122 @@ CALGSLDevice::getAttribs_int(gsl::gsCtx* cs)
m_attribs.pcieRevisionID = cs->getPciRevID();
}
// Parses a single unsigned integer from a comma separated string of integers such as
// 0x24, 0x9235, 0x123,...
//
// pStr (in) The input string
// pValue (out) The unsigned integer output when parsing is successful
//
// Return Pointer to next location in string following a comma. If no such location is found
// then pointer is null.
static char* getNextValue(char* pStr, uint32* pValue)
{
char* pRetStr = NULL;
if (pStr != NULL) {
if (pValue != NULL) {
*pValue = strtoul(pStr, NULL, 0);
}
pRetStr = strchr(pStr, ',');
if (pRetStr) {
pRetStr++;
}
}
return pRetStr;
}
// Parse string element to extract <deviceid, revisionid, clientid, value> 4-tuples of
// comma-separated uint values and allocate and write those values to output array.
//
// Example input string:
// 0x67A0,0x00,0x06,0x28,0x67A1,0x00,0x06,0x28
//
// Return the number of 4-tuple entries successfully parsed.
static uint32 parse4TupleValues(const char* element, uint32*& values)
{
// Early out if something else (e.g oglPanel) has already set this value
if (values != NULL) {
return 0;
}
const size_t strSize = strlen(element);
if (0 == strSize) {
return 0;
}
char * const str = (char*)alloca(sizeof(char) * (strSize + 1));
char * pCurStr = str;
uint32 curDevID;
uint32 curRevID;
uint32 curClientID;
uint32 curValue;
uint32 numTuples = 0;
// Find size
memcpy(str, element, strSize);
str[strSize] = '\0';
while (pCurStr != NULL) {
pCurStr = getNextValue(pCurStr, &curDevID);
if (pCurStr != NULL) {
pCurStr = getNextValue(pCurStr, &curRevID);
if (pCurStr != NULL) {
pCurStr = getNextValue(pCurStr, &curClientID);
if (pCurStr != NULL) {
pCurStr = getNextValue(pCurStr, &curValue);
numTuples ++;
}
}
}
}
if (numTuples == 0) {
return 0;
}
// Allocate
values = (uint32*)osMemAlloc(numTuples * sizeof(uint32) * 4);
if (!values) {
return 0;
}
// Copy
uint32 * pCurValue = values;
pCurStr = str;
memcpy(str, element, strSize);
str[strSize] = '\0';
while (pCurStr != NULL) {
pCurStr = getNextValue(pCurStr, pCurValue);
pCurValue++;
pCurStr = getNextValue(pCurStr, pCurValue);
pCurValue++;
pCurStr = getNextValue(pCurStr, pCurValue);
pCurValue++;
pCurStr = getNextValue(pCurStr, pCurValue);
pCurValue++;
}
return numTuples;
}
void
CALGSLDevice::parsePowerParam(const char* element, gslRuntimeConfigUint32Value& pwrCount, gslRuntimeConfigUint32pValue& pwrPointer)
{
uint32 count = 0;
uint32* values = NULL;
count = parse4TupleValues(element, values);
if (0 != count) {
pwrCount.hasValue = true;
pwrCount.value = count;
pwrPointer.hasValue = true;
pwrPointer.value = values;
}
}
bool
CALGSLDevice::open(uint32 gpuIndex, bool enableHighPerformanceState, bool reportAsOCL12Device)
CALGSLDevice::open(uint32 gpuIndex, OpenParams& openData)
{
gslDeviceOps_ = new amd::Monitor("GSL Device Ops Lock", true);
if (NULL == gslDeviceOps_) {
@@ -168,11 +304,19 @@ CALGSLDevice::open(uint32 gpuIndex, bool enableHighPerformanceState, bool report
m_scfg.vpuMask.value = m_vpuMask;
m_scfg.bEnableHighPerformanceState.hasValue = true;
m_scfg.bEnableHighPerformanceState.value = enableHighPerformanceState;
m_scfg.bEnableHighPerformanceState.value = openData.enableHighPerformanceState;
m_scfg.bEnableReusableMemCache.hasValue = true;
m_scfg.bEnableReusableMemCache.value = false;
parsePowerParam(openData.sclkThreshold, m_scfg.sclkActivityThresholdCount, m_scfg.sclkActivityThresholdPtr);
parsePowerParam(openData.downHysteresis, m_scfg.sclkDownHysteresisCount, m_scfg.sclkDownHysteresisPtr);
parsePowerParam(openData.upHysteresis, m_scfg.sclkUpHysteresisCount, m_scfg.sclkUpHysteresisPtr);
parsePowerParam(openData.powerLimit, m_scfg.packagePowerLimitCount, m_scfg.packagePowerLimitPtr);
parsePowerParam(openData.mclkThreshold, m_scfg.mclkActivityThresholdCount, m_scfg.mclkActivityThresholdPtr);
parsePowerParam(openData.mclkUpHyst, m_scfg.mclkUpHysteresisCount, m_scfg.mclkUpHysteresisPtr);
parsePowerParam(openData.mclkDownHyst, m_scfg.mclkDownHysteresisCount, m_scfg.mclkDownHysteresisPtr);
m_dcfg.disableMarkUsedInCmdBuf.hasValue = true;
m_dcfg.disableMarkUsedInCmdBuf.value = false;
@@ -181,13 +325,13 @@ CALGSLDevice::open(uint32 gpuIndex, bool enableHighPerformanceState, bool report
m_dcfg.immediateMemoryRelease.value = true;
m_dcfg.bEnableSvm.hasValue = true;
m_dcfg.bEnableSvm.value = reportAsOCL12Device ? false : OPENCL_MAJOR >= 2;
m_dcfg.bEnableSvm.value = openData.reportAsOCL12Device ? false : OPENCL_MAJOR >= 2;
m_dcfg.bEnableFlatAddressing.hasValue = true;
#if defined(ATI_BITS_32) && defined(ATI_OS_LINUX)
m_dcfg.bEnableFlatAddressing.value = false;
#else
m_dcfg.bEnableFlatAddressing.value = reportAsOCL12Device ? false : (OPENCL_MAJOR >= 2);
m_dcfg.bEnableFlatAddressing.value = openData.reportAsOCL12Device ? false : (OPENCL_MAJOR >= 2);
#endif
if (GPU_ENABLE_HW_DEBUG) {
@@ -48,10 +48,22 @@ public:
gslMemObject fMaskObject; //(OUT) gsl memobject of the an MSAA resource F-mask.
};
struct OpenParams {
bool enableHighPerformanceState;
bool reportAsOCL12Device;
const char* sclkThreshold;
const char* downHysteresis;
const char* upHysteresis;
const char* powerLimit;
const char* mclkThreshold;
const char* mclkUpHyst;
const char* mclkDownHyst;
};
CALGSLDevice();
~CALGSLDevice();
bool open(uint32 gpuIndex, bool enableHighPerformanceState, bool reportAsOCL12Device);
bool open(uint32 gpuIndex, OpenParams& openData);
void close();
gslMemObject resAlloc(const CALresourceDesc* desc) const;
@@ -193,6 +205,8 @@ private:
void getAttribs_int(gsl::gsCtx* cs);
bool ResolveAperture(const gslMemObjectAttribTiling tiling) const;
void parsePowerParam(const char* element, gslRuntimeConfigUint32Value& pwrCount, gslRuntimeConfigUint32pValue& pwrPointer);
CALdeviceattribs m_attribs;
gslMemInfo m_memInfo;
gslTextureResourceObject m_textureResource;