}
EXPORT_IF_KUNIT(amdgpu_dm_wb_connector_get_modes);
-static int amdgpu_dm_wb_prepare_job(struct drm_writeback_connector *wb_connector,
+STATIC_IFN_KUNIT int amdgpu_dm_wb_prepare_job(struct drm_writeback_connector *wb_connector,
struct drm_writeback_job *job)
{
struct amdgpu_framebuffer *afb;
amdgpu_bo_unreserve(rbo);
return r;
}
+EXPORT_IF_KUNIT(amdgpu_dm_wb_prepare_job);
-static void amdgpu_dm_wb_cleanup_job(struct drm_writeback_connector *connector,
+STATIC_IFN_KUNIT void amdgpu_dm_wb_cleanup_job(struct drm_writeback_connector *connector,
struct drm_writeback_job *job)
{
struct amdgpu_bo *rbo;
amdgpu_bo_unreserve(rbo);
amdgpu_bo_unref(&rbo);
}
+EXPORT_IF_KUNIT(amdgpu_dm_wb_cleanup_job);
static const struct drm_encoder_helper_funcs amdgpu_dm_wb_encoder_helper_funcs = {
.atomic_check = amdgpu_dm_wb_encoder_atomic_check,
struct drm_crtc_state *crtc_state,
struct drm_connector_state *conn_state);
int amdgpu_dm_wb_connector_get_modes(struct drm_connector *connector);
+int amdgpu_dm_wb_prepare_job(struct drm_writeback_connector *wb_connector,
+ struct drm_writeback_job *job);
+void amdgpu_dm_wb_cleanup_job(struct drm_writeback_connector *connector,
+ struct drm_writeback_job *job);
#endif
#endif
KUNIT_EXPECT_EQ(test, wbcon->base.encoder.possible_crtcs, 0x1);
}
+/* Tests for amdgpu_dm_wb_prepare_job / amdgpu_dm_wb_cleanup_job */
+
+/**
+ * dm_test_wb_prepare_job_no_fb - Verify prepare_job early return without a framebuffer
+ * @test: KUnit test context
+ *
+ * When job->fb is NULL there is nothing to pin, so amdgpu_dm_wb_prepare_job()
+ * must return 0 without touching any buffer object.
+ */
+static void dm_test_wb_prepare_job_no_fb(struct kunit *test)
+{
+ struct drm_writeback_job *job;
+ int ret;
+
+ job = kunit_kzalloc(test, sizeof(*job), GFP_KERNEL);
+ KUNIT_ASSERT_NOT_NULL(test, job);
+
+ job->fb = NULL;
+ ret = amdgpu_dm_wb_prepare_job(NULL, job);
+ KUNIT_EXPECT_EQ(test, ret, 0);
+}
+
+/**
+ * dm_test_wb_cleanup_job_no_fb - Verify cleanup_job early return without a framebuffer
+ * @test: KUnit test context
+ *
+ * When job->fb is NULL there is nothing to unpin, so amdgpu_dm_wb_cleanup_job()
+ * must return immediately.
+ */
+static void dm_test_wb_cleanup_job_no_fb(struct kunit *test)
+{
+ struct drm_writeback_job *job;
+
+ job = kunit_kzalloc(test, sizeof(*job), GFP_KERNEL);
+ KUNIT_ASSERT_NOT_NULL(test, job);
+
+ job->fb = NULL;
+ /* Should return without dereferencing any buffer object. */
+ amdgpu_dm_wb_cleanup_job(NULL, job);
+}
+
static struct kunit_case dm_wb_test_cases[] = {
/* amdgpu_dm_wb_encoder_atomic_check */
KUNIT_CASE(dm_test_wb_atomic_check_no_job),
KUNIT_CASE(dm_test_wb_get_modes_bounded_by_max),
/* amdgpu_dm_wb_connector_init */
KUNIT_CASE(dm_test_wb_connector_init_success),
+ /* amdgpu_dm_wb_prepare_job / amdgpu_dm_wb_cleanup_job */
+ KUNIT_CASE(dm_test_wb_prepare_job_no_fb),
+ KUNIT_CASE(dm_test_wb_cleanup_job_no_fb),
{}
};