mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-03 18:12:25 -04:00
sfc_ef100: NVRAM selftest support code
We have yet another new scheme for NVRAM, and a corresponding new MCDI. Signed-off-by: Edward Cree <ecree@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
39c965f4e6
commit
b3007dfd5b
@@ -1621,6 +1621,35 @@ int efx_mcdi_nvram_types(struct efx_nic *efx, u32 *nvram_types_out)
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* This function finds types using the new NVRAM_PARTITIONS mcdi. */
|
||||
static int efx_new_mcdi_nvram_types(struct efx_nic *efx, u32 *number,
|
||||
u32 *nvram_types)
|
||||
{
|
||||
efx_dword_t *outbuf = kzalloc(MC_CMD_NVRAM_PARTITIONS_OUT_LENMAX_MCDI2,
|
||||
GFP_KERNEL);
|
||||
size_t outlen;
|
||||
int rc;
|
||||
|
||||
if (!outbuf)
|
||||
return -ENOMEM;
|
||||
|
||||
BUILD_BUG_ON(MC_CMD_NVRAM_PARTITIONS_IN_LEN != 0);
|
||||
|
||||
rc = efx_mcdi_rpc(efx, MC_CMD_NVRAM_PARTITIONS, NULL, 0,
|
||||
outbuf, MC_CMD_NVRAM_PARTITIONS_OUT_LENMAX_MCDI2, &outlen);
|
||||
if (rc)
|
||||
goto fail;
|
||||
|
||||
*number = MCDI_DWORD(outbuf, NVRAM_PARTITIONS_OUT_NUM_PARTITIONS);
|
||||
|
||||
memcpy(nvram_types, MCDI_PTR(outbuf, NVRAM_PARTITIONS_OUT_TYPE_ID),
|
||||
*number * sizeof(u32));
|
||||
|
||||
fail:
|
||||
kfree(outbuf);
|
||||
return rc;
|
||||
}
|
||||
|
||||
int efx_mcdi_nvram_info(struct efx_nic *efx, unsigned int type,
|
||||
size_t *size_out, size_t *erase_size_out,
|
||||
bool *protected_out)
|
||||
@@ -1674,6 +1703,39 @@ static int efx_mcdi_nvram_test(struct efx_nic *efx, unsigned int type)
|
||||
}
|
||||
}
|
||||
|
||||
/* This function tests nvram partitions using the new mcdi partition lookup scheme */
|
||||
int efx_new_mcdi_nvram_test_all(struct efx_nic *efx)
|
||||
{
|
||||
u32 *nvram_types = kzalloc(MC_CMD_NVRAM_PARTITIONS_OUT_LENMAX_MCDI2,
|
||||
GFP_KERNEL);
|
||||
unsigned int number;
|
||||
int rc, i;
|
||||
|
||||
if (!nvram_types)
|
||||
return -ENOMEM;
|
||||
|
||||
rc = efx_new_mcdi_nvram_types(efx, &number, nvram_types);
|
||||
if (rc)
|
||||
goto fail;
|
||||
|
||||
/* Require at least one check */
|
||||
rc = -EAGAIN;
|
||||
|
||||
for (i = 0; i < number; i++) {
|
||||
if (nvram_types[i] == NVRAM_PARTITION_TYPE_PARTITION_MAP ||
|
||||
nvram_types[i] == NVRAM_PARTITION_TYPE_DYNAMIC_CONFIG)
|
||||
continue;
|
||||
|
||||
rc = efx_mcdi_nvram_test(efx, nvram_types[i]);
|
||||
if (rc)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
fail:
|
||||
kfree(nvram_types);
|
||||
return rc;
|
||||
}
|
||||
|
||||
int efx_mcdi_nvram_test_all(struct efx_nic *efx)
|
||||
{
|
||||
u32 nvram_types;
|
||||
|
||||
@@ -345,6 +345,7 @@ int efx_mcdi_nvram_types(struct efx_nic *efx, u32 *nvram_types_out);
|
||||
int efx_mcdi_nvram_info(struct efx_nic *efx, unsigned int type,
|
||||
size_t *size_out, size_t *erase_size_out,
|
||||
bool *protected_out);
|
||||
int efx_new_mcdi_nvram_test_all(struct efx_nic *efx);
|
||||
int efx_mcdi_nvram_test_all(struct efx_nic *efx);
|
||||
int efx_mcdi_handle_assertion(struct efx_nic *efx);
|
||||
void efx_mcdi_set_id_led(struct efx_nic *efx, enum efx_led_mode mode);
|
||||
|
||||
Reference in New Issue
Block a user