Commit e509965e authored by Luben Tuikov's avatar Luben Tuikov Committed by Alex Deucher

drm/amdgpu: Move up ras_hw_supported

Move ras_hw_supported into struct amdgpu_dev.
The dependency is:
struct amdgpu_ras <== struct amdgpu_dev <== ASIC,
read as "struct amdgpu_ras depends on struct
amdgpu_dev, which depends on the hardware."

This can be loosely understood as, "if RAS is
supported, which is property of the ASIC (struct
amdgpu_dev), then we can access struct
amdgpu_ras."

v2: Fix a typo: must binary AND in ternary cond
    in amdgpu_ras.c

Cc: Alexander Deucher <Alexander.Deucher@amd.com>
Cc: John Clements <john.clements@amd.com>
Cc: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: default avatarLuben Tuikov <luben.tuikov@amd.com>
Acked-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarJohn Clements <John.Clements@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent acdae216
...@@ -1073,7 +1073,8 @@ struct amdgpu_device { ...@@ -1073,7 +1073,8 @@ struct amdgpu_device {
atomic_t throttling_logging_enabled; atomic_t throttling_logging_enabled;
struct ratelimit_state throttling_logging_rs; struct ratelimit_state throttling_logging_rs;
uint32_t ras_features; uint32_t ras_hw_supported;
uint32_t ras_features;
bool in_pci_err_recovery; bool in_pci_err_recovery;
struct pci_saved_state *pci_state; struct pci_saved_state *pci_state;
......
...@@ -611,11 +611,9 @@ static void amdgpu_ras_parse_status_code(struct amdgpu_device *adev, ...@@ -611,11 +611,9 @@ static void amdgpu_ras_parse_status_code(struct amdgpu_device *adev,
/* feature ctl begin */ /* feature ctl begin */
static int amdgpu_ras_is_feature_allowed(struct amdgpu_device *adev, static int amdgpu_ras_is_feature_allowed(struct amdgpu_device *adev,
struct ras_common_if *head) struct ras_common_if *head)
{ {
struct amdgpu_ras *con = amdgpu_ras_get_context(adev); return adev->ras_hw_supported & BIT(head->block);
return con->hw_supported & BIT(head->block);
} }
static int amdgpu_ras_is_feature_enabled(struct amdgpu_device *adev, static int amdgpu_ras_is_feature_enabled(struct amdgpu_device *adev,
...@@ -2069,8 +2067,7 @@ static bool amdgpu_ras_asic_supported(struct amdgpu_device *adev) ...@@ -2069,8 +2067,7 @@ static bool amdgpu_ras_asic_supported(struct amdgpu_device *adev)
* force enable gfx ras, ignore vbios gfx ras flag * force enable gfx ras, ignore vbios gfx ras flag
* due to GC EDC can not write * due to GC EDC can not write
*/ */
static void amdgpu_ras_get_quirks(struct amdgpu_device *adev, static void amdgpu_ras_get_quirks(struct amdgpu_device *adev)
uint32_t *hw_supported)
{ {
struct atom_context *ctx = adev->mode_info.atom_context; struct atom_context *ctx = adev->mode_info.atom_context;
...@@ -2078,8 +2075,8 @@ static void amdgpu_ras_get_quirks(struct amdgpu_device *adev, ...@@ -2078,8 +2075,8 @@ static void amdgpu_ras_get_quirks(struct amdgpu_device *adev,
return; return;
if (strnstr(ctx->vbios_version, "D16406", if (strnstr(ctx->vbios_version, "D16406",
sizeof(ctx->vbios_version))) sizeof(ctx->vbios_version)))
*hw_supported |= (1 << AMDGPU_RAS_BLOCK__GFX); adev->ras_hw_supported |= (1 << AMDGPU_RAS_BLOCK__GFX);
} }
/* /*
...@@ -2091,11 +2088,9 @@ static void amdgpu_ras_get_quirks(struct amdgpu_device *adev, ...@@ -2091,11 +2088,9 @@ static void amdgpu_ras_get_quirks(struct amdgpu_device *adev,
* we have to initialize ras as normal. but need check if operation is * we have to initialize ras as normal. but need check if operation is
* allowed or not in each function. * allowed or not in each function.
*/ */
static void amdgpu_ras_check_supported(struct amdgpu_device *adev, static void amdgpu_ras_check_supported(struct amdgpu_device *adev)
uint32_t *hw_supported, uint32_t *supported)
{ {
*hw_supported = 0; adev->ras_hw_supported = adev->ras_features = 0;
*supported = 0;
if (amdgpu_sriov_vf(adev) || !adev->is_atom_fw || if (amdgpu_sriov_vf(adev) || !adev->is_atom_fw ||
!amdgpu_ras_asic_supported(adev)) !amdgpu_ras_asic_supported(adev))
...@@ -2104,34 +2099,34 @@ static void amdgpu_ras_check_supported(struct amdgpu_device *adev, ...@@ -2104,34 +2099,34 @@ static void amdgpu_ras_check_supported(struct amdgpu_device *adev,
if (!adev->gmc.xgmi.connected_to_cpu) { if (!adev->gmc.xgmi.connected_to_cpu) {
if (amdgpu_atomfirmware_mem_ecc_supported(adev)) { if (amdgpu_atomfirmware_mem_ecc_supported(adev)) {
dev_info(adev->dev, "MEM ECC is active.\n"); dev_info(adev->dev, "MEM ECC is active.\n");
*hw_supported |= (1 << AMDGPU_RAS_BLOCK__UMC | adev->ras_hw_supported |= (1 << AMDGPU_RAS_BLOCK__UMC |
1 << AMDGPU_RAS_BLOCK__DF); 1 << AMDGPU_RAS_BLOCK__DF);
} else { } else {
dev_info(adev->dev, "MEM ECC is not presented.\n"); dev_info(adev->dev, "MEM ECC is not presented.\n");
} }
if (amdgpu_atomfirmware_sram_ecc_supported(adev)) { if (amdgpu_atomfirmware_sram_ecc_supported(adev)) {
dev_info(adev->dev, "SRAM ECC is active.\n"); dev_info(adev->dev, "SRAM ECC is active.\n");
*hw_supported |= ~(1 << AMDGPU_RAS_BLOCK__UMC | adev->ras_hw_supported |= ~(1 << AMDGPU_RAS_BLOCK__UMC |
1 << AMDGPU_RAS_BLOCK__DF); 1 << AMDGPU_RAS_BLOCK__DF);
} else { } else {
dev_info(adev->dev, "SRAM ECC is not presented.\n"); dev_info(adev->dev, "SRAM ECC is not presented.\n");
} }
} else { } else {
/* driver only manages a few IP blocks RAS feature /* driver only manages a few IP blocks RAS feature
* when GPU is connected cpu through XGMI */ * when GPU is connected cpu through XGMI */
*hw_supported |= (1 << AMDGPU_RAS_BLOCK__GFX | adev->ras_hw_supported |= (1 << AMDGPU_RAS_BLOCK__GFX |
1 << AMDGPU_RAS_BLOCK__SDMA | 1 << AMDGPU_RAS_BLOCK__SDMA |
1 << AMDGPU_RAS_BLOCK__MMHUB); 1 << AMDGPU_RAS_BLOCK__MMHUB);
} }
amdgpu_ras_get_quirks(adev, hw_supported); amdgpu_ras_get_quirks(adev);
/* hw_supported needs to be aligned with RAS block mask. */ /* hw_supported needs to be aligned with RAS block mask. */
*hw_supported &= AMDGPU_RAS_BLOCK_MASK; adev->ras_hw_supported &= AMDGPU_RAS_BLOCK_MASK;
*supported = amdgpu_ras_enable == 0 ? 0 : adev->ras_features = amdgpu_ras_enable == 0 ? 0 :
*hw_supported & amdgpu_ras_mask; adev->ras_hw_supported & amdgpu_ras_mask;
} }
int amdgpu_ras_init(struct amdgpu_device *adev) int amdgpu_ras_init(struct amdgpu_device *adev)
...@@ -2152,9 +2147,9 @@ int amdgpu_ras_init(struct amdgpu_device *adev) ...@@ -2152,9 +2147,9 @@ int amdgpu_ras_init(struct amdgpu_device *adev)
amdgpu_ras_set_context(adev, con); amdgpu_ras_set_context(adev, con);
amdgpu_ras_check_supported(adev, &con->hw_supported, amdgpu_ras_check_supported(adev);
&adev->ras_features);
if (!con->hw_supported || (adev->asic_type == CHIP_VEGA10)) { if (!adev->ras_hw_supported || adev->asic_type == CHIP_VEGA10) {
/* set gfx block ras context feature for VEGA20 Gaming /* set gfx block ras context feature for VEGA20 Gaming
* send ras disable cmd to ras ta during ras late init. * send ras disable cmd to ras ta during ras late init.
*/ */
...@@ -2208,8 +2203,9 @@ int amdgpu_ras_init(struct amdgpu_device *adev) ...@@ -2208,8 +2203,9 @@ int amdgpu_ras_init(struct amdgpu_device *adev)
} }
dev_info(adev->dev, "RAS INFO: ras initialized successfully, " dev_info(adev->dev, "RAS INFO: ras initialized successfully, "
"hardware ability[%x] ras_mask[%x]\n", "hardware ability[%x] ras_mask[%x]\n",
con->hw_supported, adev->ras_features); adev->ras_hw_supported, adev->ras_features);
return 0; return 0;
release_con: release_con:
amdgpu_ras_set_context(adev, NULL); amdgpu_ras_set_context(adev, NULL);
...@@ -2415,10 +2411,8 @@ int amdgpu_ras_fini(struct amdgpu_device *adev) ...@@ -2415,10 +2411,8 @@ int amdgpu_ras_fini(struct amdgpu_device *adev)
void amdgpu_ras_global_ras_isr(struct amdgpu_device *adev) void amdgpu_ras_global_ras_isr(struct amdgpu_device *adev)
{ {
uint32_t hw_supported, supported; amdgpu_ras_check_supported(adev);
if (!adev->ras_hw_supported)
amdgpu_ras_check_supported(adev, &hw_supported, &supported);
if (!hw_supported)
return; return;
if (atomic_cmpxchg(&amdgpu_ras_in_intr, 0, 1) == 0) { if (atomic_cmpxchg(&amdgpu_ras_in_intr, 0, 1) == 0) {
......
...@@ -313,7 +313,6 @@ struct ras_common_if { ...@@ -313,7 +313,6 @@ struct ras_common_if {
struct amdgpu_ras { struct amdgpu_ras {
/* ras infrastructure */ /* ras infrastructure */
/* for ras itself. */ /* for ras itself. */
uint32_t hw_supported;
uint32_t features; uint32_t features;
struct list_head head; struct list_head head;
/* sysfs */ /* sysfs */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment