/** * drm_kunit_helper_alloc_device - Allocate a mock device for a KUnit test * @test: The test context object * * This allocates a fake struct &device to create a mock for a KUnit * test. The device will also be bound to a fake driver. It will thus be * able to leverage the usual infrastructure and most notably the * device-managed resources just like a "real" device. * * Resources will be cleaned up automatically, but the removal can be * forced using @drm_kunit_helper_free_device. * * Returns: * A pointer to the new device, or an ERR_PTR() otherwise.
*/ struct device *drm_kunit_helper_alloc_device(struct kunit *test)
{ return kunit_device_register(test, KUNIT_DEVICE_NAME);
}
EXPORT_SYMBOL_GPL(drm_kunit_helper_alloc_device);
/** * drm_kunit_helper_free_device - Frees a mock device * @test: The test context object * @dev: The device to free * * Frees a device allocated with drm_kunit_helper_alloc_device().
*/ void drm_kunit_helper_free_device(struct kunit *test, struct device *dev)
{
kunit_device_unregister(test, dev);
}
EXPORT_SYMBOL_GPL(drm_kunit_helper_free_device);
/** * drm_kunit_helper_atomic_state_alloc - Allocates an atomic state * @test: The test context object * @drm: The device to alloc the state for * @ctx: Locking context for that atomic update * * Allocates a empty atomic state. * * The state is tied to the kunit test context, so we must not call * drm_atomic_state_put() on it, it will be done so automatically. * * Returns: * An ERR_PTR on error, a pointer to the newly allocated state otherwise
*/ struct drm_atomic_state *
drm_kunit_helper_atomic_state_alloc(struct kunit *test, struct drm_device *drm, struct drm_modeset_acquire_ctx *ctx)
{ struct drm_atomic_state *state; int ret;
state = drm_atomic_state_alloc(drm); if (!state) return ERR_PTR(-ENOMEM);
ret = kunit_add_action_or_reset(test,
kunit_action_drm_atomic_state_put,
state); if (ret) return ERR_PTR(ret);
/** * drm_kunit_helper_create_primary_plane - Creates a mock primary plane for a KUnit test * @test: The test context object * @drm: The device to alloc the plane for * @funcs: Callbacks for the new plane. Optional. * @helper_funcs: Helpers callbacks for the new plane. Optional. * @formats: array of supported formats (DRM_FORMAT\_\*). Optional. * @num_formats: number of elements in @formats * @modifiers: array of struct drm_format modifiers terminated by * DRM_FORMAT_MOD_INVALID. Optional. * * This allocates and initializes a mock struct &drm_plane meant to be * part of a mock device for a KUnit test. * * Resources will be cleaned up automatically. * * @funcs will default to the default helpers implementations. * @helper_funcs will default to an empty implementation. @formats will * default to XRGB8888 only. @modifiers will default to a linear * modifier only. * * Returns: * A pointer to the new plane, or an ERR_PTR() otherwise.
*/ struct drm_plane *
drm_kunit_helper_create_primary_plane(struct kunit *test, struct drm_device *drm, conststruct drm_plane_funcs *funcs, conststruct drm_plane_helper_funcs *helper_funcs, const uint32_t *formats, unsignedint num_formats, const uint64_t *modifiers)
{ struct drm_plane *plane;
if (!funcs)
funcs = &default_plane_funcs;
if (!helper_funcs)
helper_funcs = &default_plane_helper_funcs;
/** * drm_kunit_helper_create_crtc - Creates a mock CRTC for a KUnit test * @test: The test context object * @drm: The device to alloc the plane for * @primary: Primary plane for CRTC * @cursor: Cursor plane for CRTC. Optional. * @funcs: Callbacks for the new plane. Optional. * @helper_funcs: Helpers callbacks for the new plane. Optional. * * This allocates and initializes a mock struct &drm_crtc meant to be * part of a mock device for a KUnit test. * * Resources will be cleaned up automatically. * * @funcs will default to the default helpers implementations. * @helper_funcs will default to an empty implementation. * * Returns: * A pointer to the new CRTC, or an ERR_PTR() otherwise.
*/ struct drm_crtc *
drm_kunit_helper_create_crtc(struct kunit *test, struct drm_device *drm, struct drm_plane *primary, struct drm_plane *cursor, conststruct drm_crtc_funcs *funcs, conststruct drm_crtc_helper_funcs *helper_funcs)
{ struct drm_crtc *crtc; int ret;
if (!funcs)
funcs = &default_crtc_funcs;
if (!helper_funcs)
helper_funcs = &default_crtc_helper_funcs;
/** * drm_kunit_helper_enable_crtc_connector - Enables a CRTC -> Connector output * @test: The test context object * @drm: The device to alloc the plane for * @crtc: The CRTC to enable * @connector: The Connector to enable * @mode: The display mode to configure the CRTC with * @ctx: Locking context * * This function creates an atomic update to enable the route from @crtc * to @connector, with the given @mode. * * Returns: * * A pointer to the new CRTC, or an ERR_PTR() otherwise. If the error * returned is EDEADLK, the entire atomic sequence must be restarted.
*/ int drm_kunit_helper_enable_crtc_connector(struct kunit *test, struct drm_device *drm, struct drm_crtc *crtc, struct drm_connector *connector, conststruct drm_display_mode *mode, struct drm_modeset_acquire_ctx *ctx)
{ struct drm_atomic_state *state; struct drm_connector_state *conn_state; struct drm_crtc_state *crtc_state; int ret;
state = drm_kunit_helper_atomic_state_alloc(test, drm, ctx); if (IS_ERR(state)) return PTR_ERR(state);
conn_state = drm_atomic_get_connector_state(state, connector); if (IS_ERR(conn_state)) return PTR_ERR(conn_state);
ret = drm_atomic_set_crtc_for_connector(conn_state, crtc); if (ret) return ret;
crtc_state = drm_atomic_get_crtc_state(state, crtc); if (IS_ERR(crtc_state)) return PTR_ERR(crtc_state);
ret = drm_atomic_set_mode_for_crtc(crtc_state, mode); if (ret) return ret;
/** * drm_kunit_add_mode_destroy_action() - Add a drm_destroy_mode kunit action * @test: The test context object * @mode: The drm_display_mode to destroy eventually * * Registers a kunit action that will destroy the drm_display_mode at * the end of the test. * * If an error occurs, the drm_display_mode will be destroyed. * * Returns: * 0 on success, an error code otherwise.
*/ int drm_kunit_add_mode_destroy_action(struct kunit *test, struct drm_display_mode *mode)
{ return kunit_add_action_or_reset(test,
kunit_action_drm_mode_destroy,
mode);
}
EXPORT_SYMBOL_GPL(drm_kunit_add_mode_destroy_action);
/** * drm_kunit_display_mode_from_cea_vic() - return a mode for CEA VIC for a KUnit test * @test: The test context object * @dev: DRM device * @video_code: CEA VIC of the mode * * Creates a new mode matching the specified CEA VIC for a KUnit test. * * Resources will be cleaned up automatically. * * Returns: A new drm_display_mode on success or NULL on failure
*/ struct drm_display_mode *
drm_kunit_display_mode_from_cea_vic(struct kunit *test, struct drm_device *dev,
u8 video_code)
{ struct drm_display_mode *mode; int ret;
mode = drm_display_mode_from_cea_vic(dev, video_code); if (!mode) return NULL;
ret = kunit_add_action_or_reset(test,
kunit_action_drm_mode_destroy,
mode); if (ret) return NULL;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.