xref: /linux/drivers/gpu/drm/ttm/tests/ttm_pool_test.c (revision a1ff5a7d78a036d6c2178ee5acd6ba4946243800)
120404204SKarolina Stolarek // SPDX-License-Identifier: GPL-2.0 AND MIT
220404204SKarolina Stolarek /*
320404204SKarolina Stolarek  * Copyright © 2023 Intel Corporation
420404204SKarolina Stolarek  */
520404204SKarolina Stolarek #include <linux/mm.h>
620404204SKarolina Stolarek 
720404204SKarolina Stolarek #include <drm/ttm/ttm_tt.h>
820404204SKarolina Stolarek #include <drm/ttm/ttm_pool.h>
920404204SKarolina Stolarek 
1020404204SKarolina Stolarek #include "ttm_kunit_helpers.h"
1120404204SKarolina Stolarek 
1220404204SKarolina Stolarek struct ttm_pool_test_case {
1320404204SKarolina Stolarek 	const char *description;
1420404204SKarolina Stolarek 	unsigned int order;
1520404204SKarolina Stolarek 	bool use_dma_alloc;
1620404204SKarolina Stolarek };
1720404204SKarolina Stolarek 
1820404204SKarolina Stolarek struct ttm_pool_test_priv {
1920404204SKarolina Stolarek 	struct ttm_test_devices *devs;
2020404204SKarolina Stolarek 
2120404204SKarolina Stolarek 	/* Used to create mock ttm_tts */
2220404204SKarolina Stolarek 	struct ttm_buffer_object *mock_bo;
2320404204SKarolina Stolarek };
2420404204SKarolina Stolarek 
2520404204SKarolina Stolarek static struct ttm_operation_ctx simple_ctx = {
2620404204SKarolina Stolarek 	.interruptible = true,
2720404204SKarolina Stolarek 	.no_wait_gpu = false,
2820404204SKarolina Stolarek };
2920404204SKarolina Stolarek 
ttm_pool_test_init(struct kunit * test)3020404204SKarolina Stolarek static int ttm_pool_test_init(struct kunit *test)
3120404204SKarolina Stolarek {
3220404204SKarolina Stolarek 	struct ttm_pool_test_priv *priv;
3320404204SKarolina Stolarek 
3420404204SKarolina Stolarek 	priv = kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL);
3520404204SKarolina Stolarek 	KUNIT_ASSERT_NOT_NULL(test, priv);
3620404204SKarolina Stolarek 
3720404204SKarolina Stolarek 	priv->devs = ttm_test_devices_basic(test);
3820404204SKarolina Stolarek 	test->priv = priv;
3920404204SKarolina Stolarek 
4020404204SKarolina Stolarek 	return 0;
4120404204SKarolina Stolarek }
4220404204SKarolina Stolarek 
ttm_pool_test_fini(struct kunit * test)4320404204SKarolina Stolarek static void ttm_pool_test_fini(struct kunit *test)
4420404204SKarolina Stolarek {
4520404204SKarolina Stolarek 	struct ttm_pool_test_priv *priv = test->priv;
4620404204SKarolina Stolarek 
4720404204SKarolina Stolarek 	ttm_test_devices_put(test, priv->devs);
4820404204SKarolina Stolarek }
4920404204SKarolina Stolarek 
ttm_tt_kunit_init(struct kunit * test,u32 page_flags,enum ttm_caching caching,size_t size)5020404204SKarolina Stolarek static struct ttm_tt *ttm_tt_kunit_init(struct kunit *test,
5107430fa5SKarolina Stolarek 					u32 page_flags,
5220404204SKarolina Stolarek 					enum ttm_caching caching,
5320404204SKarolina Stolarek 					size_t size)
5420404204SKarolina Stolarek {
5520404204SKarolina Stolarek 	struct ttm_pool_test_priv *priv = test->priv;
5620404204SKarolina Stolarek 	struct ttm_buffer_object *bo;
5720404204SKarolina Stolarek 	struct ttm_tt *tt;
5820404204SKarolina Stolarek 	int err;
5920404204SKarolina Stolarek 
60588c4c8dSKarolina Stolarek 	bo = ttm_bo_kunit_init(test, priv->devs, size, NULL);
6120404204SKarolina Stolarek 	KUNIT_ASSERT_NOT_NULL(test, bo);
6220404204SKarolina Stolarek 	priv->mock_bo = bo;
6320404204SKarolina Stolarek 
6420404204SKarolina Stolarek 	tt = kunit_kzalloc(test, sizeof(*tt), GFP_KERNEL);
6520404204SKarolina Stolarek 	KUNIT_ASSERT_NOT_NULL(test, tt);
6620404204SKarolina Stolarek 
6720404204SKarolina Stolarek 	err = ttm_tt_init(tt, priv->mock_bo, page_flags, caching, 0);
6820404204SKarolina Stolarek 	KUNIT_ASSERT_EQ(test, err, 0);
6920404204SKarolina Stolarek 
7020404204SKarolina Stolarek 	return tt;
7120404204SKarolina Stolarek }
7220404204SKarolina Stolarek 
ttm_pool_pre_populated(struct kunit * test,size_t size,enum ttm_caching caching)7320404204SKarolina Stolarek static struct ttm_pool *ttm_pool_pre_populated(struct kunit *test,
7420404204SKarolina Stolarek 					       size_t size,
7520404204SKarolina Stolarek 					       enum ttm_caching caching)
7620404204SKarolina Stolarek {
7720404204SKarolina Stolarek 	struct ttm_pool_test_priv *priv = test->priv;
7820404204SKarolina Stolarek 	struct ttm_test_devices *devs = priv->devs;
7920404204SKarolina Stolarek 	struct ttm_pool *pool;
8020404204SKarolina Stolarek 	struct ttm_tt *tt;
8120404204SKarolina Stolarek 	int err;
8220404204SKarolina Stolarek 
83b9bc0549SKarolina Stolarek 	tt = ttm_tt_kunit_init(test, 0, caching, size);
8420404204SKarolina Stolarek 	KUNIT_ASSERT_NOT_NULL(test, tt);
8520404204SKarolina Stolarek 
8620404204SKarolina Stolarek 	pool = kunit_kzalloc(test, sizeof(*pool), GFP_KERNEL);
8720404204SKarolina Stolarek 	KUNIT_ASSERT_NOT_NULL(test, pool);
8820404204SKarolina Stolarek 
8920404204SKarolina Stolarek 	ttm_pool_init(pool, devs->dev, NUMA_NO_NODE, true, false);
9020404204SKarolina Stolarek 
9120404204SKarolina Stolarek 	err = ttm_pool_alloc(pool, tt, &simple_ctx);
9220404204SKarolina Stolarek 	KUNIT_ASSERT_EQ(test, err, 0);
9320404204SKarolina Stolarek 
9420404204SKarolina Stolarek 	ttm_pool_free(pool, tt);
9520404204SKarolina Stolarek 	ttm_tt_fini(tt);
9620404204SKarolina Stolarek 
9720404204SKarolina Stolarek 	return pool;
9820404204SKarolina Stolarek }
9920404204SKarolina Stolarek 
10020404204SKarolina Stolarek static const struct ttm_pool_test_case ttm_pool_basic_cases[] = {
10120404204SKarolina Stolarek 	{
10220404204SKarolina Stolarek 		.description = "One page",
10320404204SKarolina Stolarek 		.order = 0,
10420404204SKarolina Stolarek 	},
10520404204SKarolina Stolarek 	{
10620404204SKarolina Stolarek 		.description = "More than one page",
10720404204SKarolina Stolarek 		.order = 2,
10820404204SKarolina Stolarek 	},
10920404204SKarolina Stolarek 	{
11020404204SKarolina Stolarek 		.description = "Above the allocation limit",
1115e0a760bSKirill A. Shutemov 		.order = MAX_PAGE_ORDER + 1,
11220404204SKarolina Stolarek 	},
11320404204SKarolina Stolarek 	{
11420404204SKarolina Stolarek 		.description = "One page, with coherent DMA mappings enabled",
11520404204SKarolina Stolarek 		.order = 0,
11620404204SKarolina Stolarek 		.use_dma_alloc = true,
11720404204SKarolina Stolarek 	},
11820404204SKarolina Stolarek 	{
11920404204SKarolina Stolarek 		.description = "Above the allocation limit, with coherent DMA mappings enabled",
1205e0a760bSKirill A. Shutemov 		.order = MAX_PAGE_ORDER + 1,
12120404204SKarolina Stolarek 		.use_dma_alloc = true,
12220404204SKarolina Stolarek 	},
12320404204SKarolina Stolarek };
12420404204SKarolina Stolarek 
ttm_pool_alloc_case_desc(const struct ttm_pool_test_case * t,char * desc)12520404204SKarolina Stolarek static void ttm_pool_alloc_case_desc(const struct ttm_pool_test_case *t,
12620404204SKarolina Stolarek 				     char *desc)
12720404204SKarolina Stolarek {
12820404204SKarolina Stolarek 	strscpy(desc, t->description, KUNIT_PARAM_DESC_SIZE);
12920404204SKarolina Stolarek }
13020404204SKarolina Stolarek 
13120404204SKarolina Stolarek KUNIT_ARRAY_PARAM(ttm_pool_alloc_basic, ttm_pool_basic_cases,
13220404204SKarolina Stolarek 		  ttm_pool_alloc_case_desc);
13320404204SKarolina Stolarek 
ttm_pool_alloc_basic(struct kunit * test)13420404204SKarolina Stolarek static void ttm_pool_alloc_basic(struct kunit *test)
13520404204SKarolina Stolarek {
13620404204SKarolina Stolarek 	struct ttm_pool_test_priv *priv = test->priv;
13720404204SKarolina Stolarek 	struct ttm_test_devices *devs = priv->devs;
13820404204SKarolina Stolarek 	const struct ttm_pool_test_case *params = test->param_value;
13920404204SKarolina Stolarek 	struct ttm_tt *tt;
14020404204SKarolina Stolarek 	struct ttm_pool *pool;
14120404204SKarolina Stolarek 	struct page *fst_page, *last_page;
14220404204SKarolina Stolarek 	enum ttm_caching caching = ttm_uncached;
14320404204SKarolina Stolarek 	unsigned int expected_num_pages = 1 << params->order;
14420404204SKarolina Stolarek 	size_t size = expected_num_pages * PAGE_SIZE;
14520404204SKarolina Stolarek 	int err;
14620404204SKarolina Stolarek 
14720404204SKarolina Stolarek 	tt = ttm_tt_kunit_init(test, 0, caching, size);
14820404204SKarolina Stolarek 	KUNIT_ASSERT_NOT_NULL(test, tt);
14920404204SKarolina Stolarek 
15020404204SKarolina Stolarek 	pool = kunit_kzalloc(test, sizeof(*pool), GFP_KERNEL);
15120404204SKarolina Stolarek 	KUNIT_ASSERT_NOT_NULL(test, pool);
15220404204SKarolina Stolarek 
15320404204SKarolina Stolarek 	ttm_pool_init(pool, devs->dev, NUMA_NO_NODE, params->use_dma_alloc,
15420404204SKarolina Stolarek 		      false);
15520404204SKarolina Stolarek 
15620404204SKarolina Stolarek 	KUNIT_ASSERT_PTR_EQ(test, pool->dev, devs->dev);
15720404204SKarolina Stolarek 	KUNIT_ASSERT_EQ(test, pool->nid, NUMA_NO_NODE);
15820404204SKarolina Stolarek 	KUNIT_ASSERT_EQ(test, pool->use_dma_alloc, params->use_dma_alloc);
15920404204SKarolina Stolarek 
16020404204SKarolina Stolarek 	err = ttm_pool_alloc(pool, tt, &simple_ctx);
16120404204SKarolina Stolarek 	KUNIT_ASSERT_EQ(test, err, 0);
16220404204SKarolina Stolarek 	KUNIT_ASSERT_EQ(test, tt->num_pages, expected_num_pages);
16320404204SKarolina Stolarek 
16420404204SKarolina Stolarek 	fst_page = tt->pages[0];
16520404204SKarolina Stolarek 	last_page = tt->pages[tt->num_pages - 1];
16620404204SKarolina Stolarek 
1675e0a760bSKirill A. Shutemov 	if (params->order <= MAX_PAGE_ORDER) {
16820404204SKarolina Stolarek 		if (params->use_dma_alloc) {
16920404204SKarolina Stolarek 			KUNIT_ASSERT_NOT_NULL(test, (void *)fst_page->private);
17020404204SKarolina Stolarek 			KUNIT_ASSERT_NOT_NULL(test, (void *)last_page->private);
17120404204SKarolina Stolarek 		} else {
17220404204SKarolina Stolarek 			KUNIT_ASSERT_EQ(test, fst_page->private, params->order);
17320404204SKarolina Stolarek 		}
17420404204SKarolina Stolarek 	} else {
17520404204SKarolina Stolarek 		if (params->use_dma_alloc) {
17620404204SKarolina Stolarek 			KUNIT_ASSERT_NOT_NULL(test, (void *)fst_page->private);
17720404204SKarolina Stolarek 			KUNIT_ASSERT_NULL(test, (void *)last_page->private);
17820404204SKarolina Stolarek 		} else {
17920404204SKarolina Stolarek 			/*
18020404204SKarolina Stolarek 			 * We expect to alloc one big block, followed by
18120404204SKarolina Stolarek 			 * order 0 blocks
18220404204SKarolina Stolarek 			 */
18320404204SKarolina Stolarek 			KUNIT_ASSERT_EQ(test, fst_page->private,
1845e0a760bSKirill A. Shutemov 					min_t(unsigned int, MAX_PAGE_ORDER,
18520404204SKarolina Stolarek 					      params->order));
18620404204SKarolina Stolarek 			KUNIT_ASSERT_EQ(test, last_page->private, 0);
18720404204SKarolina Stolarek 		}
18820404204SKarolina Stolarek 	}
18920404204SKarolina Stolarek 
19020404204SKarolina Stolarek 	ttm_pool_free(pool, tt);
19120404204SKarolina Stolarek 	ttm_tt_fini(tt);
19220404204SKarolina Stolarek 	ttm_pool_fini(pool);
19320404204SKarolina Stolarek }
19420404204SKarolina Stolarek 
ttm_pool_alloc_basic_dma_addr(struct kunit * test)19520404204SKarolina Stolarek static void ttm_pool_alloc_basic_dma_addr(struct kunit *test)
19620404204SKarolina Stolarek {
19720404204SKarolina Stolarek 	struct ttm_pool_test_priv *priv = test->priv;
19820404204SKarolina Stolarek 	struct ttm_test_devices *devs = priv->devs;
19920404204SKarolina Stolarek 	const struct ttm_pool_test_case *params = test->param_value;
20020404204SKarolina Stolarek 	struct ttm_tt *tt;
20120404204SKarolina Stolarek 	struct ttm_pool *pool;
20220404204SKarolina Stolarek 	struct ttm_buffer_object *bo;
20320404204SKarolina Stolarek 	dma_addr_t dma1, dma2;
20420404204SKarolina Stolarek 	enum ttm_caching caching = ttm_uncached;
20520404204SKarolina Stolarek 	unsigned int expected_num_pages = 1 << params->order;
20620404204SKarolina Stolarek 	size_t size = expected_num_pages * PAGE_SIZE;
20720404204SKarolina Stolarek 	int err;
20820404204SKarolina Stolarek 
20920404204SKarolina Stolarek 	tt = kunit_kzalloc(test, sizeof(*tt), GFP_KERNEL);
21020404204SKarolina Stolarek 	KUNIT_ASSERT_NOT_NULL(test, tt);
21120404204SKarolina Stolarek 
212588c4c8dSKarolina Stolarek 	bo = ttm_bo_kunit_init(test, devs, size, NULL);
21320404204SKarolina Stolarek 	KUNIT_ASSERT_NOT_NULL(test, bo);
21420404204SKarolina Stolarek 
21520404204SKarolina Stolarek 	err = ttm_sg_tt_init(tt, bo, 0, caching);
21620404204SKarolina Stolarek 	KUNIT_ASSERT_EQ(test, err, 0);
21720404204SKarolina Stolarek 
21820404204SKarolina Stolarek 	pool = kunit_kzalloc(test, sizeof(*pool), GFP_KERNEL);
21920404204SKarolina Stolarek 	KUNIT_ASSERT_NOT_NULL(test, pool);
22020404204SKarolina Stolarek 
22120404204SKarolina Stolarek 	ttm_pool_init(pool, devs->dev, NUMA_NO_NODE, true, false);
22220404204SKarolina Stolarek 
22320404204SKarolina Stolarek 	err = ttm_pool_alloc(pool, tt, &simple_ctx);
22420404204SKarolina Stolarek 	KUNIT_ASSERT_EQ(test, err, 0);
22520404204SKarolina Stolarek 	KUNIT_ASSERT_EQ(test, tt->num_pages, expected_num_pages);
22620404204SKarolina Stolarek 
22720404204SKarolina Stolarek 	dma1 = tt->dma_address[0];
22820404204SKarolina Stolarek 	dma2 = tt->dma_address[tt->num_pages - 1];
22920404204SKarolina Stolarek 
2309c319a0fSKarolina Stolarek 	KUNIT_ASSERT_NOT_NULL(test, (void *)(uintptr_t)dma1);
2319c319a0fSKarolina Stolarek 	KUNIT_ASSERT_NOT_NULL(test, (void *)(uintptr_t)dma2);
23220404204SKarolina Stolarek 
23320404204SKarolina Stolarek 	ttm_pool_free(pool, tt);
23420404204SKarolina Stolarek 	ttm_tt_fini(tt);
23520404204SKarolina Stolarek 	ttm_pool_fini(pool);
23620404204SKarolina Stolarek }
23720404204SKarolina Stolarek 
ttm_pool_alloc_order_caching_match(struct kunit * test)23820404204SKarolina Stolarek static void ttm_pool_alloc_order_caching_match(struct kunit *test)
23920404204SKarolina Stolarek {
24020404204SKarolina Stolarek 	struct ttm_tt *tt;
24120404204SKarolina Stolarek 	struct ttm_pool *pool;
24220404204SKarolina Stolarek 	struct ttm_pool_type *pt;
24320404204SKarolina Stolarek 	enum ttm_caching caching = ttm_uncached;
24420404204SKarolina Stolarek 	unsigned int order = 0;
24520404204SKarolina Stolarek 	size_t size = PAGE_SIZE;
24620404204SKarolina Stolarek 	int err;
24720404204SKarolina Stolarek 
24820404204SKarolina Stolarek 	pool = ttm_pool_pre_populated(test, size, caching);
24920404204SKarolina Stolarek 
25020404204SKarolina Stolarek 	pt = &pool->caching[caching].orders[order];
25120404204SKarolina Stolarek 	KUNIT_ASSERT_FALSE(test, list_empty(&pt->pages));
25220404204SKarolina Stolarek 
25320404204SKarolina Stolarek 	tt = ttm_tt_kunit_init(test, 0, caching, size);
25420404204SKarolina Stolarek 	KUNIT_ASSERT_NOT_NULL(test, tt);
25520404204SKarolina Stolarek 
25620404204SKarolina Stolarek 	err = ttm_pool_alloc(pool, tt, &simple_ctx);
25720404204SKarolina Stolarek 	KUNIT_ASSERT_EQ(test, err, 0);
25820404204SKarolina Stolarek 
25920404204SKarolina Stolarek 	KUNIT_ASSERT_TRUE(test, list_empty(&pt->pages));
26020404204SKarolina Stolarek 
26120404204SKarolina Stolarek 	ttm_pool_free(pool, tt);
26220404204SKarolina Stolarek 	ttm_tt_fini(tt);
26320404204SKarolina Stolarek 	ttm_pool_fini(pool);
26420404204SKarolina Stolarek }
26520404204SKarolina Stolarek 
ttm_pool_alloc_caching_mismatch(struct kunit * test)26620404204SKarolina Stolarek static void ttm_pool_alloc_caching_mismatch(struct kunit *test)
26720404204SKarolina Stolarek {
26820404204SKarolina Stolarek 	struct ttm_tt *tt;
26920404204SKarolina Stolarek 	struct ttm_pool *pool;
27020404204SKarolina Stolarek 	struct ttm_pool_type *pt_pool, *pt_tt;
27120404204SKarolina Stolarek 	enum ttm_caching tt_caching = ttm_uncached;
27220404204SKarolina Stolarek 	enum ttm_caching pool_caching = ttm_cached;
27320404204SKarolina Stolarek 	size_t size = PAGE_SIZE;
27420404204SKarolina Stolarek 	unsigned int order = 0;
27520404204SKarolina Stolarek 	int err;
27620404204SKarolina Stolarek 
27720404204SKarolina Stolarek 	pool = ttm_pool_pre_populated(test, size, pool_caching);
27820404204SKarolina Stolarek 
27920404204SKarolina Stolarek 	pt_pool = &pool->caching[pool_caching].orders[order];
28020404204SKarolina Stolarek 	pt_tt = &pool->caching[tt_caching].orders[order];
28120404204SKarolina Stolarek 
28220404204SKarolina Stolarek 	tt = ttm_tt_kunit_init(test, 0, tt_caching, size);
28320404204SKarolina Stolarek 	KUNIT_ASSERT_NOT_NULL(test, tt);
28420404204SKarolina Stolarek 
28520404204SKarolina Stolarek 	KUNIT_ASSERT_FALSE(test, list_empty(&pt_pool->pages));
28620404204SKarolina Stolarek 	KUNIT_ASSERT_TRUE(test, list_empty(&pt_tt->pages));
28720404204SKarolina Stolarek 
28820404204SKarolina Stolarek 	err = ttm_pool_alloc(pool, tt, &simple_ctx);
28920404204SKarolina Stolarek 	KUNIT_ASSERT_EQ(test, err, 0);
29020404204SKarolina Stolarek 
29120404204SKarolina Stolarek 	ttm_pool_free(pool, tt);
29220404204SKarolina Stolarek 	ttm_tt_fini(tt);
29320404204SKarolina Stolarek 
29420404204SKarolina Stolarek 	KUNIT_ASSERT_FALSE(test, list_empty(&pt_pool->pages));
29520404204SKarolina Stolarek 	KUNIT_ASSERT_FALSE(test, list_empty(&pt_tt->pages));
29620404204SKarolina Stolarek 
29720404204SKarolina Stolarek 	ttm_pool_fini(pool);
29820404204SKarolina Stolarek }
29920404204SKarolina Stolarek 
ttm_pool_alloc_order_mismatch(struct kunit * test)30020404204SKarolina Stolarek static void ttm_pool_alloc_order_mismatch(struct kunit *test)
30120404204SKarolina Stolarek {
30220404204SKarolina Stolarek 	struct ttm_tt *tt;
30320404204SKarolina Stolarek 	struct ttm_pool *pool;
30420404204SKarolina Stolarek 	struct ttm_pool_type *pt_pool, *pt_tt;
30520404204SKarolina Stolarek 	enum ttm_caching caching = ttm_uncached;
30620404204SKarolina Stolarek 	unsigned int order = 2;
30720404204SKarolina Stolarek 	size_t fst_size = (1 << order) * PAGE_SIZE;
30820404204SKarolina Stolarek 	size_t snd_size = PAGE_SIZE;
30920404204SKarolina Stolarek 	int err;
31020404204SKarolina Stolarek 
31120404204SKarolina Stolarek 	pool = ttm_pool_pre_populated(test, fst_size, caching);
31220404204SKarolina Stolarek 
31320404204SKarolina Stolarek 	pt_pool = &pool->caching[caching].orders[order];
31420404204SKarolina Stolarek 	pt_tt = &pool->caching[caching].orders[0];
31520404204SKarolina Stolarek 
31620404204SKarolina Stolarek 	tt = ttm_tt_kunit_init(test, 0, caching, snd_size);
31720404204SKarolina Stolarek 	KUNIT_ASSERT_NOT_NULL(test, tt);
31820404204SKarolina Stolarek 
31920404204SKarolina Stolarek 	KUNIT_ASSERT_FALSE(test, list_empty(&pt_pool->pages));
32020404204SKarolina Stolarek 	KUNIT_ASSERT_TRUE(test, list_empty(&pt_tt->pages));
32120404204SKarolina Stolarek 
32220404204SKarolina Stolarek 	err = ttm_pool_alloc(pool, tt, &simple_ctx);
32320404204SKarolina Stolarek 	KUNIT_ASSERT_EQ(test, err, 0);
32420404204SKarolina Stolarek 
32520404204SKarolina Stolarek 	ttm_pool_free(pool, tt);
32620404204SKarolina Stolarek 	ttm_tt_fini(tt);
32720404204SKarolina Stolarek 
32820404204SKarolina Stolarek 	KUNIT_ASSERT_FALSE(test, list_empty(&pt_pool->pages));
32920404204SKarolina Stolarek 	KUNIT_ASSERT_FALSE(test, list_empty(&pt_tt->pages));
33020404204SKarolina Stolarek 
33120404204SKarolina Stolarek 	ttm_pool_fini(pool);
33220404204SKarolina Stolarek }
33320404204SKarolina Stolarek 
ttm_pool_free_dma_alloc(struct kunit * test)33420404204SKarolina Stolarek static void ttm_pool_free_dma_alloc(struct kunit *test)
33520404204SKarolina Stolarek {
33620404204SKarolina Stolarek 	struct ttm_pool_test_priv *priv = test->priv;
33720404204SKarolina Stolarek 	struct ttm_test_devices *devs = priv->devs;
33820404204SKarolina Stolarek 	struct ttm_tt *tt;
33920404204SKarolina Stolarek 	struct ttm_pool *pool;
34020404204SKarolina Stolarek 	struct ttm_pool_type *pt;
34120404204SKarolina Stolarek 	enum ttm_caching caching = ttm_uncached;
34220404204SKarolina Stolarek 	unsigned int order = 2;
34320404204SKarolina Stolarek 	size_t size = (1 << order) * PAGE_SIZE;
34420404204SKarolina Stolarek 
34520404204SKarolina Stolarek 	tt = ttm_tt_kunit_init(test, 0, caching, size);
34620404204SKarolina Stolarek 	KUNIT_ASSERT_NOT_NULL(test, tt);
34720404204SKarolina Stolarek 
34820404204SKarolina Stolarek 	pool = kunit_kzalloc(test, sizeof(*pool), GFP_KERNEL);
34920404204SKarolina Stolarek 	KUNIT_ASSERT_NOT_NULL(test, pool);
35020404204SKarolina Stolarek 
35120404204SKarolina Stolarek 	ttm_pool_init(pool, devs->dev, NUMA_NO_NODE, true, false);
35220404204SKarolina Stolarek 	ttm_pool_alloc(pool, tt, &simple_ctx);
35320404204SKarolina Stolarek 
35420404204SKarolina Stolarek 	pt = &pool->caching[caching].orders[order];
35520404204SKarolina Stolarek 	KUNIT_ASSERT_TRUE(test, list_empty(&pt->pages));
35620404204SKarolina Stolarek 
35720404204SKarolina Stolarek 	ttm_pool_free(pool, tt);
35820404204SKarolina Stolarek 	ttm_tt_fini(tt);
35920404204SKarolina Stolarek 
36020404204SKarolina Stolarek 	KUNIT_ASSERT_FALSE(test, list_empty(&pt->pages));
36120404204SKarolina Stolarek 
36220404204SKarolina Stolarek 	ttm_pool_fini(pool);
36320404204SKarolina Stolarek }
36420404204SKarolina Stolarek 
ttm_pool_free_no_dma_alloc(struct kunit * test)36520404204SKarolina Stolarek static void ttm_pool_free_no_dma_alloc(struct kunit *test)
36620404204SKarolina Stolarek {
36720404204SKarolina Stolarek 	struct ttm_pool_test_priv *priv = test->priv;
36820404204SKarolina Stolarek 	struct ttm_test_devices *devs = priv->devs;
36920404204SKarolina Stolarek 	struct ttm_tt *tt;
37020404204SKarolina Stolarek 	struct ttm_pool *pool;
37120404204SKarolina Stolarek 	struct ttm_pool_type *pt;
37220404204SKarolina Stolarek 	enum ttm_caching caching = ttm_uncached;
37320404204SKarolina Stolarek 	unsigned int order = 2;
37420404204SKarolina Stolarek 	size_t size = (1 << order) * PAGE_SIZE;
37520404204SKarolina Stolarek 
37620404204SKarolina Stolarek 	tt = ttm_tt_kunit_init(test, 0, caching, size);
37720404204SKarolina Stolarek 	KUNIT_ASSERT_NOT_NULL(test, tt);
37820404204SKarolina Stolarek 
37920404204SKarolina Stolarek 	pool = kunit_kzalloc(test, sizeof(*pool), GFP_KERNEL);
38020404204SKarolina Stolarek 	KUNIT_ASSERT_NOT_NULL(test, pool);
38120404204SKarolina Stolarek 
38220404204SKarolina Stolarek 	ttm_pool_init(pool, devs->dev, NUMA_NO_NODE, false, false);
38320404204SKarolina Stolarek 	ttm_pool_alloc(pool, tt, &simple_ctx);
38420404204SKarolina Stolarek 
38520404204SKarolina Stolarek 	pt = &pool->caching[caching].orders[order];
38620404204SKarolina Stolarek 	KUNIT_ASSERT_TRUE(test, list_is_singular(&pt->pages));
38720404204SKarolina Stolarek 
38820404204SKarolina Stolarek 	ttm_pool_free(pool, tt);
38920404204SKarolina Stolarek 	ttm_tt_fini(tt);
39020404204SKarolina Stolarek 
39120404204SKarolina Stolarek 	KUNIT_ASSERT_TRUE(test, list_is_singular(&pt->pages));
39220404204SKarolina Stolarek 
39320404204SKarolina Stolarek 	ttm_pool_fini(pool);
39420404204SKarolina Stolarek }
39520404204SKarolina Stolarek 
ttm_pool_fini_basic(struct kunit * test)39620404204SKarolina Stolarek static void ttm_pool_fini_basic(struct kunit *test)
39720404204SKarolina Stolarek {
39820404204SKarolina Stolarek 	struct ttm_pool *pool;
39920404204SKarolina Stolarek 	struct ttm_pool_type *pt;
40020404204SKarolina Stolarek 	enum ttm_caching caching = ttm_uncached;
40120404204SKarolina Stolarek 	unsigned int order = 0;
40220404204SKarolina Stolarek 	size_t size = PAGE_SIZE;
40320404204SKarolina Stolarek 
40420404204SKarolina Stolarek 	pool = ttm_pool_pre_populated(test, size, caching);
40520404204SKarolina Stolarek 	pt = &pool->caching[caching].orders[order];
40620404204SKarolina Stolarek 
40720404204SKarolina Stolarek 	KUNIT_ASSERT_FALSE(test, list_empty(&pt->pages));
40820404204SKarolina Stolarek 
40920404204SKarolina Stolarek 	ttm_pool_fini(pool);
41020404204SKarolina Stolarek 
41120404204SKarolina Stolarek 	KUNIT_ASSERT_TRUE(test, list_empty(&pt->pages));
41220404204SKarolina Stolarek }
41320404204SKarolina Stolarek 
41420404204SKarolina Stolarek static struct kunit_case ttm_pool_test_cases[] = {
41520404204SKarolina Stolarek 	KUNIT_CASE_PARAM(ttm_pool_alloc_basic, ttm_pool_alloc_basic_gen_params),
41620404204SKarolina Stolarek 	KUNIT_CASE_PARAM(ttm_pool_alloc_basic_dma_addr,
41720404204SKarolina Stolarek 			 ttm_pool_alloc_basic_gen_params),
41820404204SKarolina Stolarek 	KUNIT_CASE(ttm_pool_alloc_order_caching_match),
41920404204SKarolina Stolarek 	KUNIT_CASE(ttm_pool_alloc_caching_mismatch),
42020404204SKarolina Stolarek 	KUNIT_CASE(ttm_pool_alloc_order_mismatch),
42120404204SKarolina Stolarek 	KUNIT_CASE(ttm_pool_free_dma_alloc),
42220404204SKarolina Stolarek 	KUNIT_CASE(ttm_pool_free_no_dma_alloc),
42320404204SKarolina Stolarek 	KUNIT_CASE(ttm_pool_fini_basic),
42420404204SKarolina Stolarek 	{}
42520404204SKarolina Stolarek };
42620404204SKarolina Stolarek 
42720404204SKarolina Stolarek static struct kunit_suite ttm_pool_test_suite = {
42820404204SKarolina Stolarek 	.name = "ttm_pool",
42920404204SKarolina Stolarek 	.init = ttm_pool_test_init,
43020404204SKarolina Stolarek 	.exit = ttm_pool_test_fini,
43120404204SKarolina Stolarek 	.test_cases = ttm_pool_test_cases,
43220404204SKarolina Stolarek };
43320404204SKarolina Stolarek 
43420404204SKarolina Stolarek kunit_test_suites(&ttm_pool_test_suite);
43520404204SKarolina Stolarek 
436*26149e6fSJeff Johnson MODULE_DESCRIPTION("KUnit tests for ttm_pool APIs");
437be487a29SKarolina Stolarek MODULE_LICENSE("GPL and additional rights");
438