nfit, libnvdimm: clarify "commands" vs "_DSMs"
Clarify the distinction between "commands", the ioctls userspace calls to request the kernel take some action on a given dimm device, and "_DSMs", the actual function numbers used in the firmware interface to the DIMM. _DSMs are ACPI specific whereas commands are Linux kernel generic. This is in preparation for breaking the 1:1 implicit relationship between the kernel ioctl number space and the firmware specific function numbers. Cc: Jerry Hoemann <jerry.hoemann@hpe.com> Cc: Christoph Hellwig <hch@infradead.org> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
Родитель
40abf9be8f
Коммит
e3654eca70
|
@ -175,7 +175,7 @@ static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
|
||||||
union acpi_object in_obj, in_buf, *out_obj;
|
union acpi_object in_obj, in_buf, *out_obj;
|
||||||
struct device *dev = acpi_desc->dev;
|
struct device *dev = acpi_desc->dev;
|
||||||
const char *cmd_name, *dimm_name;
|
const char *cmd_name, *dimm_name;
|
||||||
unsigned long dsm_mask;
|
unsigned long cmd_mask;
|
||||||
acpi_handle handle;
|
acpi_handle handle;
|
||||||
const u8 *uuid;
|
const u8 *uuid;
|
||||||
u32 offset;
|
u32 offset;
|
||||||
|
@ -189,7 +189,7 @@ static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
|
||||||
return -ENOTTY;
|
return -ENOTTY;
|
||||||
dimm_name = nvdimm_name(nvdimm);
|
dimm_name = nvdimm_name(nvdimm);
|
||||||
cmd_name = nvdimm_cmd_name(cmd);
|
cmd_name = nvdimm_cmd_name(cmd);
|
||||||
dsm_mask = nfit_mem->dsm_mask;
|
cmd_mask = nvdimm_cmd_mask(nvdimm);
|
||||||
desc = nd_cmd_dimm_desc(cmd);
|
desc = nd_cmd_dimm_desc(cmd);
|
||||||
uuid = to_nfit_uuid(NFIT_DEV_DIMM);
|
uuid = to_nfit_uuid(NFIT_DEV_DIMM);
|
||||||
handle = adev->handle;
|
handle = adev->handle;
|
||||||
|
@ -197,7 +197,7 @@ static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
|
||||||
struct acpi_device *adev = to_acpi_dev(acpi_desc);
|
struct acpi_device *adev = to_acpi_dev(acpi_desc);
|
||||||
|
|
||||||
cmd_name = nvdimm_bus_cmd_name(cmd);
|
cmd_name = nvdimm_bus_cmd_name(cmd);
|
||||||
dsm_mask = nd_desc->dsm_mask;
|
cmd_mask = nd_desc->cmd_mask;
|
||||||
desc = nd_cmd_bus_desc(cmd);
|
desc = nd_cmd_bus_desc(cmd);
|
||||||
uuid = to_nfit_uuid(NFIT_DEV_BUS);
|
uuid = to_nfit_uuid(NFIT_DEV_BUS);
|
||||||
handle = adev->handle;
|
handle = adev->handle;
|
||||||
|
@ -207,7 +207,7 @@ static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
|
||||||
if (!desc || (cmd && (desc->out_num + desc->in_num == 0)))
|
if (!desc || (cmd && (desc->out_num + desc->in_num == 0)))
|
||||||
return -ENOTTY;
|
return -ENOTTY;
|
||||||
|
|
||||||
if (!test_bit(cmd, &dsm_mask))
|
if (!test_bit(cmd, &cmd_mask))
|
||||||
return -ENOTTY;
|
return -ENOTTY;
|
||||||
|
|
||||||
in_obj.type = ACPI_TYPE_PACKAGE;
|
in_obj.type = ACPI_TYPE_PACKAGE;
|
||||||
|
@ -926,7 +926,8 @@ static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc,
|
||||||
const u8 *uuid = to_nfit_uuid(NFIT_DEV_DIMM);
|
const u8 *uuid = to_nfit_uuid(NFIT_DEV_DIMM);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
nfit_mem->dsm_mask = acpi_desc->dimm_dsm_force_en;
|
/* nfit test assumes 1:1 relationship between commands and dsms */
|
||||||
|
nfit_mem->dsm_mask = acpi_desc->dimm_cmd_force_en;
|
||||||
adev = to_acpi_dev(acpi_desc);
|
adev = to_acpi_dev(acpi_desc);
|
||||||
if (!adev)
|
if (!adev)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -976,9 +977,13 @@ static int acpi_nfit_register_dimms(struct acpi_nfit_desc *acpi_desc)
|
||||||
if (rc)
|
if (rc)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For now there is 1:1 relationship between cmd_mask and
|
||||||
|
* dsm_mask.
|
||||||
|
*/
|
||||||
nvdimm = nvdimm_create(acpi_desc->nvdimm_bus, nfit_mem,
|
nvdimm = nvdimm_create(acpi_desc->nvdimm_bus, nfit_mem,
|
||||||
acpi_nfit_dimm_attribute_groups,
|
acpi_nfit_dimm_attribute_groups,
|
||||||
flags, &nfit_mem->dsm_mask);
|
flags, nfit_mem->dsm_mask);
|
||||||
if (!nvdimm)
|
if (!nvdimm)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
@ -1007,14 +1012,14 @@ static void acpi_nfit_init_dsms(struct acpi_nfit_desc *acpi_desc)
|
||||||
struct acpi_device *adev;
|
struct acpi_device *adev;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
nd_desc->dsm_mask = acpi_desc->bus_dsm_force_en;
|
nd_desc->cmd_mask = acpi_desc->bus_cmd_force_en;
|
||||||
adev = to_acpi_dev(acpi_desc);
|
adev = to_acpi_dev(acpi_desc);
|
||||||
if (!adev)
|
if (!adev)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (i = ND_CMD_ARS_CAP; i <= ND_CMD_CLEAR_ERROR; i++)
|
for (i = ND_CMD_ARS_CAP; i <= ND_CMD_CLEAR_ERROR; i++)
|
||||||
if (acpi_check_dsm(adev->handle, uuid, 1, 1ULL << i))
|
if (acpi_check_dsm(adev->handle, uuid, 1, 1ULL << i))
|
||||||
set_bit(i, &nd_desc->dsm_mask);
|
set_bit(i, &nd_desc->cmd_mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t range_index_show(struct device *dev,
|
static ssize_t range_index_show(struct device *dev,
|
||||||
|
|
|
@ -132,8 +132,8 @@ struct acpi_nfit_desc {
|
||||||
size_t ars_status_size;
|
size_t ars_status_size;
|
||||||
struct work_struct work;
|
struct work_struct work;
|
||||||
unsigned int cancel:1;
|
unsigned int cancel:1;
|
||||||
unsigned long dimm_dsm_force_en;
|
unsigned long dimm_cmd_force_en;
|
||||||
unsigned long bus_dsm_force_en;
|
unsigned long bus_cmd_force_en;
|
||||||
int (*blk_do_io)(struct nd_blk_region *ndbr, resource_size_t dpa,
|
int (*blk_do_io)(struct nd_blk_region *ndbr, resource_size_t dpa,
|
||||||
void *iobuf, u64 len, int rw);
|
void *iobuf, u64 len, int rw);
|
||||||
};
|
};
|
||||||
|
|
|
@ -589,24 +589,24 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm,
|
||||||
void __user *p = (void __user *) arg;
|
void __user *p = (void __user *) arg;
|
||||||
struct device *dev = &nvdimm_bus->dev;
|
struct device *dev = &nvdimm_bus->dev;
|
||||||
const char *cmd_name, *dimm_name;
|
const char *cmd_name, *dimm_name;
|
||||||
unsigned long dsm_mask;
|
unsigned long cmd_mask;
|
||||||
void *buf;
|
void *buf;
|
||||||
int rc, i;
|
int rc, i;
|
||||||
|
|
||||||
if (nvdimm) {
|
if (nvdimm) {
|
||||||
desc = nd_cmd_dimm_desc(cmd);
|
desc = nd_cmd_dimm_desc(cmd);
|
||||||
cmd_name = nvdimm_cmd_name(cmd);
|
cmd_name = nvdimm_cmd_name(cmd);
|
||||||
dsm_mask = nvdimm->dsm_mask ? *(nvdimm->dsm_mask) : 0;
|
cmd_mask = nvdimm->cmd_mask;
|
||||||
dimm_name = dev_name(&nvdimm->dev);
|
dimm_name = dev_name(&nvdimm->dev);
|
||||||
} else {
|
} else {
|
||||||
desc = nd_cmd_bus_desc(cmd);
|
desc = nd_cmd_bus_desc(cmd);
|
||||||
cmd_name = nvdimm_bus_cmd_name(cmd);
|
cmd_name = nvdimm_bus_cmd_name(cmd);
|
||||||
dsm_mask = nd_desc->dsm_mask;
|
cmd_mask = nd_desc->cmd_mask;
|
||||||
dimm_name = "bus";
|
dimm_name = "bus";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!desc || (desc->out_num + desc->in_num == 0) ||
|
if (!desc || (desc->out_num + desc->in_num == 0) ||
|
||||||
!test_bit(cmd, &dsm_mask))
|
!test_bit(cmd, &cmd_mask))
|
||||||
return -ENOTTY;
|
return -ENOTTY;
|
||||||
|
|
||||||
/* fail write commands (when read-only) */
|
/* fail write commands (when read-only) */
|
||||||
|
|
|
@ -251,7 +251,7 @@ static ssize_t commands_show(struct device *dev,
|
||||||
struct nvdimm_bus *nvdimm_bus = to_nvdimm_bus(dev);
|
struct nvdimm_bus *nvdimm_bus = to_nvdimm_bus(dev);
|
||||||
struct nvdimm_bus_descriptor *nd_desc = nvdimm_bus->nd_desc;
|
struct nvdimm_bus_descriptor *nd_desc = nvdimm_bus->nd_desc;
|
||||||
|
|
||||||
for_each_set_bit(cmd, &nd_desc->dsm_mask, BITS_PER_LONG)
|
for_each_set_bit(cmd, &nd_desc->cmd_mask, BITS_PER_LONG)
|
||||||
len += sprintf(buf + len, "%s ", nvdimm_bus_cmd_name(cmd));
|
len += sprintf(buf + len, "%s ", nvdimm_bus_cmd_name(cmd));
|
||||||
len += sprintf(buf + len, "\n");
|
len += sprintf(buf + len, "\n");
|
||||||
return len;
|
return len;
|
||||||
|
|
|
@ -37,9 +37,9 @@ static int __validate_dimm(struct nvdimm_drvdata *ndd)
|
||||||
|
|
||||||
nvdimm = to_nvdimm(ndd->dev);
|
nvdimm = to_nvdimm(ndd->dev);
|
||||||
|
|
||||||
if (!nvdimm->dsm_mask)
|
if (!nvdimm->cmd_mask)
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
if (!test_bit(ND_CMD_GET_CONFIG_DATA, nvdimm->dsm_mask))
|
if (!test_bit(ND_CMD_GET_CONFIG_DATA, &nvdimm->cmd_mask))
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -263,6 +263,12 @@ const char *nvdimm_name(struct nvdimm *nvdimm)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(nvdimm_name);
|
EXPORT_SYMBOL_GPL(nvdimm_name);
|
||||||
|
|
||||||
|
unsigned long nvdimm_cmd_mask(struct nvdimm *nvdimm)
|
||||||
|
{
|
||||||
|
return nvdimm->cmd_mask;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(nvdimm_cmd_mask);
|
||||||
|
|
||||||
void *nvdimm_provider_data(struct nvdimm *nvdimm)
|
void *nvdimm_provider_data(struct nvdimm *nvdimm)
|
||||||
{
|
{
|
||||||
if (nvdimm)
|
if (nvdimm)
|
||||||
|
@ -277,10 +283,10 @@ static ssize_t commands_show(struct device *dev,
|
||||||
struct nvdimm *nvdimm = to_nvdimm(dev);
|
struct nvdimm *nvdimm = to_nvdimm(dev);
|
||||||
int cmd, len = 0;
|
int cmd, len = 0;
|
||||||
|
|
||||||
if (!nvdimm->dsm_mask)
|
if (!nvdimm->cmd_mask)
|
||||||
return sprintf(buf, "\n");
|
return sprintf(buf, "\n");
|
||||||
|
|
||||||
for_each_set_bit(cmd, nvdimm->dsm_mask, BITS_PER_LONG)
|
for_each_set_bit(cmd, &nvdimm->cmd_mask, BITS_PER_LONG)
|
||||||
len += sprintf(buf + len, "%s ", nvdimm_cmd_name(cmd));
|
len += sprintf(buf + len, "%s ", nvdimm_cmd_name(cmd));
|
||||||
len += sprintf(buf + len, "\n");
|
len += sprintf(buf + len, "\n");
|
||||||
return len;
|
return len;
|
||||||
|
@ -340,7 +346,7 @@ EXPORT_SYMBOL_GPL(nvdimm_attribute_group);
|
||||||
|
|
||||||
struct nvdimm *nvdimm_create(struct nvdimm_bus *nvdimm_bus, void *provider_data,
|
struct nvdimm *nvdimm_create(struct nvdimm_bus *nvdimm_bus, void *provider_data,
|
||||||
const struct attribute_group **groups, unsigned long flags,
|
const struct attribute_group **groups, unsigned long flags,
|
||||||
unsigned long *dsm_mask)
|
unsigned long cmd_mask)
|
||||||
{
|
{
|
||||||
struct nvdimm *nvdimm = kzalloc(sizeof(*nvdimm), GFP_KERNEL);
|
struct nvdimm *nvdimm = kzalloc(sizeof(*nvdimm), GFP_KERNEL);
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
|
@ -355,7 +361,7 @@ struct nvdimm *nvdimm_create(struct nvdimm_bus *nvdimm_bus, void *provider_data,
|
||||||
}
|
}
|
||||||
nvdimm->provider_data = provider_data;
|
nvdimm->provider_data = provider_data;
|
||||||
nvdimm->flags = flags;
|
nvdimm->flags = flags;
|
||||||
nvdimm->dsm_mask = dsm_mask;
|
nvdimm->cmd_mask = cmd_mask;
|
||||||
atomic_set(&nvdimm->busy, 0);
|
atomic_set(&nvdimm->busy, 0);
|
||||||
dev = &nvdimm->dev;
|
dev = &nvdimm->dev;
|
||||||
dev_set_name(dev, "nmem%d", nvdimm->id);
|
dev_set_name(dev, "nmem%d", nvdimm->id);
|
||||||
|
|
|
@ -37,7 +37,7 @@ struct nvdimm_bus {
|
||||||
struct nvdimm {
|
struct nvdimm {
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
void *provider_data;
|
void *provider_data;
|
||||||
unsigned long *dsm_mask;
|
unsigned long cmd_mask;
|
||||||
struct device dev;
|
struct device dev;
|
||||||
atomic_t busy;
|
atomic_t busy;
|
||||||
int id;
|
int id;
|
||||||
|
|
|
@ -68,7 +68,7 @@ struct nd_mapping {
|
||||||
|
|
||||||
struct nvdimm_bus_descriptor {
|
struct nvdimm_bus_descriptor {
|
||||||
const struct attribute_group **attr_groups;
|
const struct attribute_group **attr_groups;
|
||||||
unsigned long dsm_mask;
|
unsigned long cmd_mask;
|
||||||
char *provider_name;
|
char *provider_name;
|
||||||
ndctl_fn ndctl;
|
ndctl_fn ndctl;
|
||||||
int (*flush_probe)(struct nvdimm_bus_descriptor *nd_desc);
|
int (*flush_probe)(struct nvdimm_bus_descriptor *nd_desc);
|
||||||
|
@ -130,10 +130,11 @@ struct nd_region *to_nd_region(struct device *dev);
|
||||||
struct nd_blk_region *to_nd_blk_region(struct device *dev);
|
struct nd_blk_region *to_nd_blk_region(struct device *dev);
|
||||||
struct nvdimm_bus_descriptor *to_nd_desc(struct nvdimm_bus *nvdimm_bus);
|
struct nvdimm_bus_descriptor *to_nd_desc(struct nvdimm_bus *nvdimm_bus);
|
||||||
const char *nvdimm_name(struct nvdimm *nvdimm);
|
const char *nvdimm_name(struct nvdimm *nvdimm);
|
||||||
|
unsigned long nvdimm_cmd_mask(struct nvdimm *nvdimm);
|
||||||
void *nvdimm_provider_data(struct nvdimm *nvdimm);
|
void *nvdimm_provider_data(struct nvdimm *nvdimm);
|
||||||
struct nvdimm *nvdimm_create(struct nvdimm_bus *nvdimm_bus, void *provider_data,
|
struct nvdimm *nvdimm_create(struct nvdimm_bus *nvdimm_bus, void *provider_data,
|
||||||
const struct attribute_group **groups, unsigned long flags,
|
const struct attribute_group **groups, unsigned long flags,
|
||||||
unsigned long *dsm_mask);
|
unsigned long cmd_mask);
|
||||||
const struct nd_cmd_desc *nd_cmd_dimm_desc(int cmd);
|
const struct nd_cmd_desc *nd_cmd_dimm_desc(int cmd);
|
||||||
const struct nd_cmd_desc *nd_cmd_bus_desc(int cmd);
|
const struct nd_cmd_desc *nd_cmd_bus_desc(int cmd);
|
||||||
u32 nd_cmd_in_size(struct nvdimm *nvdimm, int cmd,
|
u32 nd_cmd_in_size(struct nvdimm *nvdimm, int cmd,
|
||||||
|
|
|
@ -344,8 +344,9 @@ static int nfit_test_ctl(struct nvdimm_bus_descriptor *nd_desc,
|
||||||
|
|
||||||
if (nvdimm) {
|
if (nvdimm) {
|
||||||
struct nfit_mem *nfit_mem = nvdimm_provider_data(nvdimm);
|
struct nfit_mem *nfit_mem = nvdimm_provider_data(nvdimm);
|
||||||
|
unsigned long cmd_mask = nvdimm_cmd_mask(nvdimm);
|
||||||
|
|
||||||
if (!nfit_mem || !test_bit(cmd, &nfit_mem->dsm_mask))
|
if (!nfit_mem || !test_bit(cmd, &cmd_mask))
|
||||||
return -ENOTTY;
|
return -ENOTTY;
|
||||||
|
|
||||||
/* lookup label space for the given dimm */
|
/* lookup label space for the given dimm */
|
||||||
|
@ -374,7 +375,7 @@ static int nfit_test_ctl(struct nvdimm_bus_descriptor *nd_desc,
|
||||||
} else {
|
} else {
|
||||||
struct ars_state *ars_state = &t->ars_state;
|
struct ars_state *ars_state = &t->ars_state;
|
||||||
|
|
||||||
if (!nd_desc || !test_bit(cmd, &nd_desc->dsm_mask))
|
if (!nd_desc || !test_bit(cmd, &nd_desc->cmd_mask))
|
||||||
return -ENOTTY;
|
return -ENOTTY;
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
|
@ -1251,13 +1252,13 @@ static void nfit_test0_setup(struct nfit_test *t)
|
||||||
post_ars_status(&t->ars_state, t->spa_set_dma[0], SPA0_SIZE);
|
post_ars_status(&t->ars_state, t->spa_set_dma[0], SPA0_SIZE);
|
||||||
|
|
||||||
acpi_desc = &t->acpi_desc;
|
acpi_desc = &t->acpi_desc;
|
||||||
set_bit(ND_CMD_GET_CONFIG_SIZE, &acpi_desc->dimm_dsm_force_en);
|
set_bit(ND_CMD_GET_CONFIG_SIZE, &acpi_desc->dimm_cmd_force_en);
|
||||||
set_bit(ND_CMD_GET_CONFIG_DATA, &acpi_desc->dimm_dsm_force_en);
|
set_bit(ND_CMD_GET_CONFIG_DATA, &acpi_desc->dimm_cmd_force_en);
|
||||||
set_bit(ND_CMD_SET_CONFIG_DATA, &acpi_desc->dimm_dsm_force_en);
|
set_bit(ND_CMD_SET_CONFIG_DATA, &acpi_desc->dimm_cmd_force_en);
|
||||||
set_bit(ND_CMD_ARS_CAP, &acpi_desc->bus_dsm_force_en);
|
set_bit(ND_CMD_ARS_CAP, &acpi_desc->bus_cmd_force_en);
|
||||||
set_bit(ND_CMD_ARS_START, &acpi_desc->bus_dsm_force_en);
|
set_bit(ND_CMD_ARS_START, &acpi_desc->bus_cmd_force_en);
|
||||||
set_bit(ND_CMD_ARS_STATUS, &acpi_desc->bus_dsm_force_en);
|
set_bit(ND_CMD_ARS_STATUS, &acpi_desc->bus_cmd_force_en);
|
||||||
set_bit(ND_CMD_CLEAR_ERROR, &acpi_desc->bus_dsm_force_en);
|
set_bit(ND_CMD_CLEAR_ERROR, &acpi_desc->bus_cmd_force_en);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nfit_test1_setup(struct nfit_test *t)
|
static void nfit_test1_setup(struct nfit_test *t)
|
||||||
|
@ -1315,10 +1316,10 @@ static void nfit_test1_setup(struct nfit_test *t)
|
||||||
post_ars_status(&t->ars_state, t->spa_set_dma[0], SPA2_SIZE);
|
post_ars_status(&t->ars_state, t->spa_set_dma[0], SPA2_SIZE);
|
||||||
|
|
||||||
acpi_desc = &t->acpi_desc;
|
acpi_desc = &t->acpi_desc;
|
||||||
set_bit(ND_CMD_ARS_CAP, &acpi_desc->bus_dsm_force_en);
|
set_bit(ND_CMD_ARS_CAP, &acpi_desc->bus_cmd_force_en);
|
||||||
set_bit(ND_CMD_ARS_START, &acpi_desc->bus_dsm_force_en);
|
set_bit(ND_CMD_ARS_START, &acpi_desc->bus_cmd_force_en);
|
||||||
set_bit(ND_CMD_ARS_STATUS, &acpi_desc->bus_dsm_force_en);
|
set_bit(ND_CMD_ARS_STATUS, &acpi_desc->bus_cmd_force_en);
|
||||||
set_bit(ND_CMD_CLEAR_ERROR, &acpi_desc->bus_dsm_force_en);
|
set_bit(ND_CMD_CLEAR_ERROR, &acpi_desc->bus_cmd_force_en);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nfit_test_blk_do_io(struct nd_blk_region *ndbr, resource_size_t dpa,
|
static int nfit_test_blk_do_io(struct nd_blk_region *ndbr, resource_size_t dpa,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче