// SPDX-License-Identifier: GPL-2.0 AND MIT
/*
 * Copyright © 2023 Intel Corporation
 */
#include <linux/mm.h>

#include <drm/ttm/ttm_tt.h>
#include <drm/ttm/ttm_pool.h>

#include "ttm_kunit_helpers.h"

struct ttm_pool_test_case {
	const char *description;
	unsigned int order;
	bool use_dma_alloc;
};

struct ttm_pool_test_priv {
	struct ttm_test_devices *devs;

	/* Used to create mock ttm_tts */
	struct ttm_buffer_object *mock_bo;
};

static struct ttm_operation_ctx simple_ctx = {
	.interruptible = true,
	.no_wait_gpu = false,
};

static int ttm_pool_test_init(struct kunit *test)
{
	struct ttm_pool_test_priv *priv;

	priv = kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL);
	KUNIT_ASSERT_NOT_NULL(test, priv);

	priv->devs = ttm_test_devices_basic(test);
	test->priv = priv;

	return 0;
}

static void ttm_pool_test_fini(struct kunit *test)
{
	struct ttm_pool_test_priv *priv = test->priv;

	ttm_test_devices_put(test, priv->devs);
}

static struct ttm_tt *ttm_tt_kunit_init(struct kunit *test,
					uint32_t page_flags,
					enum ttm_caching caching,
					size_t size)
{
	struct ttm_pool_test_priv *priv = test->priv;
	struct ttm_buffer_object *bo;
	struct ttm_tt *tt;
	int err;

	bo = ttm_bo_kunit_init(test, priv->devs, size);
	KUNIT_ASSERT_NOT_NULL(test, bo);
	priv->mock_bo = bo;

	tt = kunit_kzalloc(test, sizeof(*tt), GFP_KERNEL);
	KUNIT_ASSERT_NOT_NULL(test, tt);

	err = ttm_tt_init(tt, priv->mock_bo, page_flags, caching, 0);
	KUNIT_ASSERT_EQ(test, err, 0);

	return tt;
}

static struct ttm_pool *ttm_pool_pre_populated(struct kunit *test,
					       size_t size,
					       enum ttm_caching caching)
{
	struct ttm_pool_test_priv *priv = test->priv;
	struct ttm_test_devices *devs = priv->devs;
	struct ttm_pool *pool;
	struct ttm_tt *tt;
	unsigned long order = __fls(size / PAGE_SIZE);
	int err;

	tt = ttm_tt_kunit_init(test, order, caching, size);
	KUNIT_ASSERT_NOT_NULL(test, tt);

	pool = kunit_kzalloc(test, sizeof(*pool), GFP_KERNEL);
	KUNIT_ASSERT_NOT_NULL(test, pool);

	ttm_pool_init(pool, devs->dev, NUMA_NO_NODE, true, false);

	err = ttm_pool_alloc(pool, tt, &simple_ctx);
	KUNIT_ASSERT_EQ(test, err, 0);

	ttm_pool_free(pool, tt);
	ttm_tt_fini(tt);

	return pool;
}

static const struct ttm_pool_test_case ttm_pool_basic_cases[] = {
	{
		.description = "One page",
		.order = 0,
	},
	{
		.description = "More than one page",
		.order = 2,
	},
	{
		.description = "Above the allocation limit",
		.order = MAX_PAGE_ORDER + 1,
	},
	{
		.description = "One page, with coherent DMA mappings enabled",
		.order = 0,
		.use_dma_alloc = true,
	},
	{
		.description = "Above the allocation limit, with coherent DMA mappings enabled",
		.order = MAX_PAGE_ORDER + 1,
		.use_dma_alloc = true,
	},
};

static void ttm_pool_alloc_case_desc(const struct ttm_pool_test_case *t,
				     char *desc)
{
	strscpy(desc, t->description, KUNIT_PARAM_DESC_SIZE);
}

KUNIT_ARRAY_PARAM(ttm_pool_alloc_basic, ttm_pool_basic_cases,
		  ttm_pool_alloc_case_desc);

static void ttm_pool_alloc_basic(struct kunit *test)
{
	struct ttm_pool_test_priv *priv = test->priv;
	struct ttm_test_devices *devs = priv->devs;
	const struct ttm_pool_test_case *params = test->param_value;
	struct ttm_tt *tt;
	struct ttm_pool *pool;
	struct page *fst_page, *last_page;
	enum ttm_caching caching = ttm_uncached;
	unsigned int expected_num_pages = 1 << params->order;
	size_t size = expected_num_pages * PAGE_SIZE;
	int err;

	tt = ttm_tt_kunit_init(test, 0, caching, size);
	KUNIT_ASSERT_NOT_NULL(test, tt);

	pool = kunit_kzalloc(test, sizeof(*pool), GFP_KERNEL);
	KUNIT_ASSERT_NOT_NULL(test, pool);

	ttm_pool_init(pool, devs->dev, NUMA_NO_NODE, params->use_dma_alloc,
		      false);

	KUNIT_ASSERT_PTR_EQ(test, pool->dev, devs->dev);
	KUNIT_ASSERT_EQ(test, pool->nid, NUMA_NO_NODE);
	KUNIT_ASSERT_EQ(test, pool->use_dma_alloc, params->use_dma_alloc);

	err = ttm_pool_alloc(pool, tt, &simple_ctx);
	KUNIT_ASSERT_EQ(test, err, 0);
	KUNIT_ASSERT_EQ(test, tt->num_pages, expected_num_pages);

	fst_page = tt->pages[0];
	last_page = tt->pages[tt->num_pages - 1];

	if (params->order <= MAX_PAGE_ORDER) {
		if (params->use_dma_alloc) {
			KUNIT_ASSERT_NOT_NULL(test, (void *)fst_page->private);
			KUNIT_ASSERT_NOT_NULL(test, (void *)last_page->private);
		} else {
			KUNIT_ASSERT_EQ(test, fst_page->private, params->order);
		}
	} else {
		if (params->use_dma_alloc) {
			KUNIT_ASSERT_NOT_NULL(test, (void *)fst_page->private);
			KUNIT_ASSERT_NULL(test, (void *)last_page->private);
		} else {
			/*
			 * We expect to alloc one big block, followed by
			 * order 0 blocks
			 */
			KUNIT_ASSERT_EQ(test, fst_page->private,
					min_t(unsigned int, MAX_PAGE_ORDER,
					      params->order));
			KUNIT_ASSERT_EQ(test, last_page->private, 0);
		}
	}

	ttm_pool_free(pool, tt);
	ttm_tt_fini(tt);
	ttm_pool_fini(pool);
}

static void ttm_pool_alloc_basic_dma_addr(struct kunit *test)
{
	struct ttm_pool_test_priv *priv = test->priv;
	struct ttm_test_devices *devs = priv->devs;
	const struct ttm_pool_test_case *params = test->param_value;
	struct ttm_tt *tt;
	struct ttm_pool *pool;
	struct ttm_buffer_object *bo;
	dma_addr_t dma1, dma2;
	enum ttm_caching caching = ttm_uncached;
	unsigned int expected_num_pages = 1 << params->order;
	size_t size = expected_num_pages * PAGE_SIZE;
	int err;

	tt = kunit_kzalloc(test, sizeof(*tt), GFP_KERNEL);
	KUNIT_ASSERT_NOT_NULL(test, tt);

	bo = ttm_bo_kunit_init(test, devs, size);
	KUNIT_ASSERT_NOT_NULL(test, bo);

	err = ttm_sg_tt_init(tt, bo, 0, caching);
	KUNIT_ASSERT_EQ(test, err, 0);

	pool = kunit_kzalloc(test, sizeof(*pool), GFP_KERNEL);
	KUNIT_ASSERT_NOT_NULL(test, pool);

	ttm_pool_init(pool, devs->dev, NUMA_NO_NODE, true, false);

	err = ttm_pool_alloc(pool, tt, &simple_ctx);
	KUNIT_ASSERT_EQ(test, err, 0);
	KUNIT_ASSERT_EQ(test, tt->num_pages, expected_num_pages);

	dma1 = tt->dma_address[0];
	dma2 = tt->dma_address[tt->num_pages - 1];

	KUNIT_ASSERT_NOT_NULL(test, (void *)(uintptr_t)dma1);
	KUNIT_ASSERT_NOT_NULL(test, (void *)(uintptr_t)dma2);

	ttm_pool_free(pool, tt);
	ttm_tt_fini(tt);
	ttm_pool_fini(pool);
}

static void ttm_pool_alloc_order_caching_match(struct kunit *test)
{
	struct ttm_tt *tt;
	struct ttm_pool *pool;
	struct ttm_pool_type *pt;
	enum ttm_caching caching = ttm_uncached;
	unsigned int order = 0;
	size_t size = PAGE_SIZE;
	int err;

	pool = ttm_pool_pre_populated(test, size, caching);

	pt = &pool->caching[caching].orders[order];
	KUNIT_ASSERT_FALSE(test, list_empty(&pt->pages));

	tt = ttm_tt_kunit_init(test, 0, caching, size);
	KUNIT_ASSERT_NOT_NULL(test, tt);

	err = ttm_pool_alloc(pool, tt, &simple_ctx);
	KUNIT_ASSERT_EQ(test, err, 0);

	KUNIT_ASSERT_TRUE(test, list_empty(&pt->pages));

	ttm_pool_free(pool, tt);
	ttm_tt_fini(tt);
	ttm_pool_fini(pool);
}

static void ttm_pool_alloc_caching_mismatch(struct kunit *test)
{
	struct ttm_tt *tt;
	struct ttm_pool *pool;
	struct ttm_pool_type *pt_pool, *pt_tt;
	enum ttm_caching tt_caching = ttm_uncached;
	enum ttm_caching pool_caching = ttm_cached;
	size_t size = PAGE_SIZE;
	unsigned int order = 0;
	int err;

	pool = ttm_pool_pre_populated(test, size, pool_caching);

	pt_pool = &pool->caching[pool_caching].orders[order];
	pt_tt = &pool->caching[tt_caching].orders[order];

	tt = ttm_tt_kunit_init(test, 0, tt_caching, size);
	KUNIT_ASSERT_NOT_NULL(test, tt);

	KUNIT_ASSERT_FALSE(test, list_empty(&pt_pool->pages));
	KUNIT_ASSERT_TRUE(test, list_empty(&pt_tt->pages));

	err = ttm_pool_alloc(pool, tt, &simple_ctx);
	KUNIT_ASSERT_EQ(test, err, 0);

	ttm_pool_free(pool, tt);
	ttm_tt_fini(tt);

	KUNIT_ASSERT_FALSE(test, list_empty(&pt_pool->pages));
	KUNIT_ASSERT_FALSE(test, list_empty(&pt_tt->pages));

	ttm_pool_fini(pool);
}

static void ttm_pool_alloc_order_mismatch(struct kunit *test)
{
	struct ttm_tt *tt;
	struct ttm_pool *pool;
	struct ttm_pool_type *pt_pool, *pt_tt;
	enum ttm_caching caching = ttm_uncached;
	unsigned int order = 2;
	size_t fst_size = (1 << order) * PAGE_SIZE;
	size_t snd_size = PAGE_SIZE;
	int err;

	pool = ttm_pool_pre_populated(test, fst_size, caching);

	pt_pool = &pool->caching[caching].orders[order];
	pt_tt = &pool->caching[caching].orders[0];

	tt = ttm_tt_kunit_init(test, 0, caching, snd_size);
	KUNIT_ASSERT_NOT_NULL(test, tt);

	KUNIT_ASSERT_FALSE(test, list_empty(&pt_pool->pages));
	KUNIT_ASSERT_TRUE(test, list_empty(&pt_tt->pages));

	err = ttm_pool_alloc(pool, tt, &simple_ctx);
	KUNIT_ASSERT_EQ(test, err, 0);

	ttm_pool_free(pool, tt);
	ttm_tt_fini(tt);

	KUNIT_ASSERT_FALSE(test, list_empty(&pt_pool->pages));
	KUNIT_ASSERT_FALSE(test, list_empty(&pt_tt->pages));

	ttm_pool_fini(pool);
}

static void ttm_pool_free_dma_alloc(struct kunit *test)
{
	struct ttm_pool_test_priv *priv = test->priv;
	struct ttm_test_devices *devs = priv->devs;
	struct ttm_tt *tt;
	struct ttm_pool *pool;
	struct ttm_pool_type *pt;
	enum ttm_caching caching = ttm_uncached;
	unsigned int order = 2;
	size_t size = (1 << order) * PAGE_SIZE;

	tt = ttm_tt_kunit_init(test, 0, caching, size);
	KUNIT_ASSERT_NOT_NULL(test, tt);

	pool = kunit_kzalloc(test, sizeof(*pool), GFP_KERNEL);
	KUNIT_ASSERT_NOT_NULL(test, pool);

	ttm_pool_init(pool, devs->dev, NUMA_NO_NODE, true, false);
	ttm_pool_alloc(pool, tt, &simple_ctx);

	pt = &pool->caching[caching].orders[order];
	KUNIT_ASSERT_TRUE(test, list_empty(&pt->pages));

	ttm_pool_free(pool, tt);
	ttm_tt_fini(tt);

	KUNIT_ASSERT_FALSE(test, list_empty(&pt->pages));

	ttm_pool_fini(pool);
}

static void ttm_pool_free_no_dma_alloc(struct kunit *test)
{
	struct ttm_pool_test_priv *priv = test->priv;
	struct ttm_test_devices *devs = priv->devs;
	struct ttm_tt *tt;
	struct ttm_pool *pool;
	struct ttm_pool_type *pt;
	enum ttm_caching caching = ttm_uncached;
	unsigned int order = 2;
	size_t size = (1 << order) * PAGE_SIZE;

	tt = ttm_tt_kunit_init(test, 0, caching, size);
	KUNIT_ASSERT_NOT_NULL(test, tt);

	pool = kunit_kzalloc(test, sizeof(*pool), GFP_KERNEL);
	KUNIT_ASSERT_NOT_NULL(test, pool);

	ttm_pool_init(pool, devs->dev, NUMA_NO_NODE, false, false);
	ttm_pool_alloc(pool, tt, &simple_ctx);

	pt = &pool->caching[caching].orders[order];
	KUNIT_ASSERT_TRUE(test, list_is_singular(&pt->pages));

	ttm_pool_free(pool, tt);
	ttm_tt_fini(tt);

	KUNIT_ASSERT_TRUE(test, list_is_singular(&pt->pages));

	ttm_pool_fini(pool);
}

static void ttm_pool_fini_basic(struct kunit *test)
{
	struct ttm_pool *pool;
	struct ttm_pool_type *pt;
	enum ttm_caching caching = ttm_uncached;
	unsigned int order = 0;
	size_t size = PAGE_SIZE;

	pool = ttm_pool_pre_populated(test, size, caching);
	pt = &pool->caching[caching].orders[order];

	KUNIT_ASSERT_FALSE(test, list_empty(&pt->pages));

	ttm_pool_fini(pool);

	KUNIT_ASSERT_TRUE(test, list_empty(&pt->pages));
}

static struct kunit_case ttm_pool_test_cases[] = {
	KUNIT_CASE_PARAM(ttm_pool_alloc_basic, ttm_pool_alloc_basic_gen_params),
	KUNIT_CASE_PARAM(ttm_pool_alloc_basic_dma_addr,
			 ttm_pool_alloc_basic_gen_params),
	KUNIT_CASE(ttm_pool_alloc_order_caching_match),
	KUNIT_CASE(ttm_pool_alloc_caching_mismatch),
	KUNIT_CASE(ttm_pool_alloc_order_mismatch),
	KUNIT_CASE(ttm_pool_free_dma_alloc),
	KUNIT_CASE(ttm_pool_free_no_dma_alloc),
	KUNIT_CASE(ttm_pool_fini_basic),
	{}
};

static struct kunit_suite ttm_pool_test_suite = {
	.name = "ttm_pool",
	.init = ttm_pool_test_init,
	.exit = ttm_pool_test_fini,
	.test_cases = ttm_pool_test_cases,
};

kunit_test_suites(&ttm_pool_test_suite);

MODULE_LICENSE("GPL");
