mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
acpi/nfit, libnvdimm: Introduce nvdimm_security_ops
Some NVDIMMs, like the ones defined by the NVDIMM_FAMILY_INTEL command set, expose a security capability to lock the DIMMs at poweroff and require a passphrase to unlock them. The security model is derived from ATA security. In anticipation of other DIMMs implementing a similar scheme, and to abstract the core security implementation away from the device-specific details, introduce nvdimm_security_ops. Initially only a status retrieval operation, ->state(), is defined, along with the base infrastructure and definitions for future operations. Signed-off-by: Dave Jiang <[email protected]> Co-developed-by: Dan Williams <[email protected]> Signed-off-by: Dan Williams <[email protected]>
This commit is contained in:
parent
9db67581b9
commit
f298939655
9 changed files with 158 additions and 4 deletions
|
|
@ -1,3 +1,4 @@
|
|||
obj-$(CONFIG_ACPI_NFIT) := nfit.o
|
||||
nfit-y := core.o
|
||||
nfit-y += intel.o
|
||||
nfit-$(CONFIG_X86_MCE) += mce.o
|
||||
|
|
|
|||
|
|
@ -1930,6 +1930,16 @@ static void shutdown_dimm_notify(void *data)
|
|||
mutex_unlock(&acpi_desc->init_mutex);
|
||||
}
|
||||
|
||||
static const struct nvdimm_security_ops *acpi_nfit_get_security_ops(int family)
|
||||
{
|
||||
switch (family) {
|
||||
case NVDIMM_FAMILY_INTEL:
|
||||
return intel_security_ops;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static int acpi_nfit_register_dimms(struct acpi_nfit_desc *acpi_desc)
|
||||
{
|
||||
struct nfit_mem *nfit_mem;
|
||||
|
|
@ -1999,7 +2009,8 @@ static int acpi_nfit_register_dimms(struct acpi_nfit_desc *acpi_desc)
|
|||
nvdimm = __nvdimm_create(acpi_desc->nvdimm_bus, nfit_mem,
|
||||
acpi_nfit_dimm_attribute_groups,
|
||||
flags, cmd_mask, flush ? flush->hint_count : 0,
|
||||
nfit_mem->flush_wpq, &nfit_mem->id[0]);
|
||||
nfit_mem->flush_wpq, &nfit_mem->id[0],
|
||||
acpi_nfit_get_security_ops(nfit_mem->family));
|
||||
if (!nvdimm)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
|||
54
drivers/acpi/nfit/intel.c
Normal file
54
drivers/acpi/nfit/intel.c
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/* Copyright(c) 2018 Intel Corporation. All rights reserved. */
|
||||
#include <linux/libnvdimm.h>
|
||||
#include <linux/ndctl.h>
|
||||
#include <linux/acpi.h>
|
||||
#include "intel.h"
|
||||
#include "nfit.h"
|
||||
|
||||
static enum nvdimm_security_state intel_security_state(struct nvdimm *nvdimm)
|
||||
{
|
||||
struct nfit_mem *nfit_mem = nvdimm_provider_data(nvdimm);
|
||||
struct {
|
||||
struct nd_cmd_pkg pkg;
|
||||
struct nd_intel_get_security_state cmd;
|
||||
} nd_cmd = {
|
||||
.pkg = {
|
||||
.nd_command = NVDIMM_INTEL_GET_SECURITY_STATE,
|
||||
.nd_family = NVDIMM_FAMILY_INTEL,
|
||||
.nd_size_out =
|
||||
sizeof(struct nd_intel_get_security_state),
|
||||
.nd_fw_size =
|
||||
sizeof(struct nd_intel_get_security_state),
|
||||
},
|
||||
};
|
||||
int rc;
|
||||
|
||||
if (!test_bit(NVDIMM_INTEL_GET_SECURITY_STATE, &nfit_mem->dsm_mask))
|
||||
return -ENXIO;
|
||||
|
||||
rc = nvdimm_ctl(nvdimm, ND_CMD_CALL, &nd_cmd, sizeof(nd_cmd), NULL);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
if (nd_cmd.cmd.status)
|
||||
return -EIO;
|
||||
|
||||
/* check and see if security is enabled and locked */
|
||||
if (nd_cmd.cmd.state & ND_INTEL_SEC_STATE_UNSUPPORTED)
|
||||
return -ENXIO;
|
||||
else if (nd_cmd.cmd.state & ND_INTEL_SEC_STATE_ENABLED) {
|
||||
if (nd_cmd.cmd.state & ND_INTEL_SEC_STATE_LOCKED)
|
||||
return NVDIMM_SECURITY_LOCKED;
|
||||
else if (nd_cmd.cmd.state & ND_INTEL_SEC_STATE_FROZEN ||
|
||||
nd_cmd.cmd.state & ND_INTEL_SEC_STATE_PLIMIT)
|
||||
return NVDIMM_SECURITY_FROZEN;
|
||||
else
|
||||
return NVDIMM_SECURITY_UNLOCKED;
|
||||
}
|
||||
return NVDIMM_SECURITY_DISABLED;
|
||||
}
|
||||
|
||||
static const struct nvdimm_security_ops __intel_security_ops = {
|
||||
.state = intel_security_state,
|
||||
};
|
||||
const struct nvdimm_security_ops *intel_security_ops = &__intel_security_ops;
|
||||
|
|
@ -35,6 +35,8 @@ struct nd_intel_smart {
|
|||
};
|
||||
} __packed;
|
||||
|
||||
extern const struct nvdimm_security_ops *intel_security_ops;
|
||||
|
||||
#define ND_INTEL_STATUS_SIZE 4
|
||||
#define ND_INTEL_PASSPHRASE_SIZE 32
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue