Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 85d3fa02 authored by Dan Williams's avatar Dan Williams
Browse files

tools/testing/nvdimm: simulate multiple flush hints per-dimm



Sample nfit data to test the kernel's handling of the multiple
flush-hint case.

Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent e5ae3b25
Loading
Loading
Loading
Loading
+33 −22
Original line number Original line Diff line number Diff line
@@ -98,6 +98,7 @@
enum {
enum {
	NUM_PM  = 3,
	NUM_PM  = 3,
	NUM_DCR = 5,
	NUM_DCR = 5,
	NUM_HINTS = 8,
	NUM_BDW = NUM_DCR,
	NUM_BDW = NUM_DCR,
	NUM_SPA = NUM_PM + NUM_DCR + NUM_BDW,
	NUM_SPA = NUM_PM + NUM_DCR + NUM_BDW,
	NUM_MEM = NUM_DCR + NUM_BDW + 2 /* spa0 iset */ + 4 /* spa1 iset */,
	NUM_MEM = NUM_DCR + NUM_BDW + 2 /* spa0 iset */ + 4 /* spa1 iset */,
@@ -569,7 +570,8 @@ static int nfit_test0_alloc(struct nfit_test *t)
			+ offsetof(struct acpi_nfit_control_region,
			+ offsetof(struct acpi_nfit_control_region,
					window_size) * NUM_DCR
					window_size) * NUM_DCR
			+ sizeof(struct acpi_nfit_data_region) * NUM_BDW
			+ sizeof(struct acpi_nfit_data_region) * NUM_BDW
			+ sizeof(struct acpi_nfit_flush_address) * NUM_DCR;
			+ (sizeof(struct acpi_nfit_flush_address)
					+ sizeof(u64) * NUM_HINTS) * NUM_DCR;
	int i;
	int i;


	t->nfit_buf = test_alloc(t, nfit_size, &t->nfit_dma);
	t->nfit_buf = test_alloc(t, nfit_size, &t->nfit_dma);
@@ -599,7 +601,8 @@ static int nfit_test0_alloc(struct nfit_test *t)
			return -ENOMEM;
			return -ENOMEM;
		sprintf(t->label[i], "label%d", i);
		sprintf(t->label[i], "label%d", i);


		t->flush[i] = test_alloc(t, 8, &t->flush_dma[i]);
		t->flush[i] = test_alloc(t, sizeof(u64) * NUM_HINTS,
				&t->flush_dma[i]);
		if (!t->flush[i])
		if (!t->flush[i])
			return -ENOMEM;
			return -ENOMEM;
	}
	}
@@ -633,6 +636,8 @@ static int nfit_test1_alloc(struct nfit_test *t)


static void nfit_test0_setup(struct nfit_test *t)
static void nfit_test0_setup(struct nfit_test *t)
{
{
	const int flush_hint_size = sizeof(struct acpi_nfit_flush_address)
		+ (sizeof(u64) * NUM_HINTS);
	struct acpi_nfit_desc *acpi_desc;
	struct acpi_nfit_desc *acpi_desc;
	struct acpi_nfit_memory_map *memdev;
	struct acpi_nfit_memory_map *memdev;
	void *nfit_buf = t->nfit_buf;
	void *nfit_buf = t->nfit_buf;
@@ -640,7 +645,7 @@ static void nfit_test0_setup(struct nfit_test *t)
	struct acpi_nfit_control_region *dcr;
	struct acpi_nfit_control_region *dcr;
	struct acpi_nfit_data_region *bdw;
	struct acpi_nfit_data_region *bdw;
	struct acpi_nfit_flush_address *flush;
	struct acpi_nfit_flush_address *flush;
	unsigned int offset;
	unsigned int offset, i;


	/*
	/*
	 * spa0 (interleave first half of dimm0 and dimm1, note storage
	 * spa0 (interleave first half of dimm0 and dimm1, note storage
@@ -1126,37 +1131,41 @@ static void nfit_test0_setup(struct nfit_test *t)
	/* flush0 (dimm0) */
	/* flush0 (dimm0) */
	flush = nfit_buf + offset;
	flush = nfit_buf + offset;
	flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS;
	flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS;
	flush->header.length = sizeof(struct acpi_nfit_flush_address);
	flush->header.length = flush_hint_size;
	flush->device_handle = handle[0];
	flush->device_handle = handle[0];
	flush->hint_count = 1;
	flush->hint_count = NUM_HINTS;
	flush->hint_address[0] = t->flush_dma[0];
	for (i = 0; i < NUM_HINTS; i++)
		flush->hint_address[i] = t->flush_dma[0] + i * sizeof(u64);


	/* flush1 (dimm1) */
	/* flush1 (dimm1) */
	flush = nfit_buf + offset + sizeof(struct acpi_nfit_flush_address) * 1;
	flush = nfit_buf + offset + flush_hint_size * 1;
	flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS;
	flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS;
	flush->header.length = sizeof(struct acpi_nfit_flush_address);
	flush->header.length = flush_hint_size;
	flush->device_handle = handle[1];
	flush->device_handle = handle[1];
	flush->hint_count = 1;
	flush->hint_count = NUM_HINTS;
	flush->hint_address[0] = t->flush_dma[1];
	for (i = 0; i < NUM_HINTS; i++)
		flush->hint_address[i] = t->flush_dma[1] + i * sizeof(u64);


	/* flush2 (dimm2) */
	/* flush2 (dimm2) */
	flush = nfit_buf + offset + sizeof(struct acpi_nfit_flush_address) * 2;
	flush = nfit_buf + offset + flush_hint_size  * 2;
	flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS;
	flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS;
	flush->header.length = sizeof(struct acpi_nfit_flush_address);
	flush->header.length = flush_hint_size;
	flush->device_handle = handle[2];
	flush->device_handle = handle[2];
	flush->hint_count = 1;
	flush->hint_count = NUM_HINTS;
	flush->hint_address[0] = t->flush_dma[2];
	for (i = 0; i < NUM_HINTS; i++)
		flush->hint_address[i] = t->flush_dma[2] + i * sizeof(u64);


	/* flush3 (dimm3) */
	/* flush3 (dimm3) */
	flush = nfit_buf + offset + sizeof(struct acpi_nfit_flush_address) * 3;
	flush = nfit_buf + offset + flush_hint_size * 3;
	flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS;
	flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS;
	flush->header.length = sizeof(struct acpi_nfit_flush_address);
	flush->header.length = flush_hint_size;
	flush->device_handle = handle[3];
	flush->device_handle = handle[3];
	flush->hint_count = 1;
	flush->hint_count = NUM_HINTS;
	flush->hint_address[0] = t->flush_dma[3];
	for (i = 0; i < NUM_HINTS; i++)
		flush->hint_address[i] = t->flush_dma[3] + i * sizeof(u64);


	if (t->setup_hotplug) {
	if (t->setup_hotplug) {
		offset = offset + sizeof(struct acpi_nfit_flush_address) * 4;
		offset = offset + flush_hint_size * 4;
		/* dcr-descriptor4: blk */
		/* dcr-descriptor4: blk */
		dcr = nfit_buf + offset;
		dcr = nfit_buf + offset;
		dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
		dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
@@ -1285,10 +1294,12 @@ static void nfit_test0_setup(struct nfit_test *t)
		/* flush3 (dimm4) */
		/* flush3 (dimm4) */
		flush = nfit_buf + offset;
		flush = nfit_buf + offset;
		flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS;
		flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS;
		flush->header.length = sizeof(struct acpi_nfit_flush_address);
		flush->header.length = flush_hint_size;
		flush->device_handle = handle[4];
		flush->device_handle = handle[4];
		flush->hint_count = 1;
		flush->hint_count = NUM_HINTS;
		flush->hint_address[0] = t->flush_dma[4];
		for (i = 0; i < NUM_HINTS; i++)
			flush->hint_address[i] = t->flush_dma[4]
				+ i * sizeof(u64);
	}
	}


	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);