|
@@ -19,6 +19,7 @@ struct tegra_dc_soc_info {
|
|
|
bool supports_interlacing;
|
|
|
bool supports_cursor;
|
|
|
bool supports_block_linear;
|
|
|
+ unsigned int pitch_align;
|
|
|
};
|
|
|
|
|
|
struct tegra_plane {
|
|
@@ -1283,12 +1284,20 @@ static int tegra_dc_init(struct host1x_client *client)
|
|
|
{
|
|
|
struct drm_device *drm = dev_get_drvdata(client->parent);
|
|
|
struct tegra_dc *dc = host1x_client_to_dc(client);
|
|
|
+ struct tegra_drm *tegra = drm->dev_private;
|
|
|
int err;
|
|
|
|
|
|
drm_crtc_init(drm, &dc->base, &tegra_crtc_funcs);
|
|
|
drm_mode_crtc_set_gamma_size(&dc->base, 256);
|
|
|
drm_crtc_helper_add(&dc->base, &tegra_crtc_helper_funcs);
|
|
|
|
|
|
+ /*
|
|
|
+ * Keep track of the minimum pitch alignment across all display
|
|
|
+ * controllers.
|
|
|
+ */
|
|
|
+ if (dc->soc->pitch_align > tegra->pitch_align)
|
|
|
+ tegra->pitch_align = dc->soc->pitch_align;
|
|
|
+
|
|
|
err = tegra_dc_rgb_init(drm, dc);
|
|
|
if (err < 0 && err != -ENODEV) {
|
|
|
dev_err(dc->dev, "failed to initialize RGB output: %d\n", err);
|
|
@@ -1347,18 +1356,28 @@ static const struct tegra_dc_soc_info tegra20_dc_soc_info = {
|
|
|
.supports_interlacing = false,
|
|
|
.supports_cursor = false,
|
|
|
.supports_block_linear = false,
|
|
|
+ .pitch_align = 8,
|
|
|
};
|
|
|
|
|
|
static const struct tegra_dc_soc_info tegra30_dc_soc_info = {
|
|
|
.supports_interlacing = false,
|
|
|
.supports_cursor = false,
|
|
|
.supports_block_linear = false,
|
|
|
+ .pitch_align = 8,
|
|
|
+};
|
|
|
+
|
|
|
+static const struct tegra_dc_soc_info tegra114_dc_soc_info = {
|
|
|
+ .supports_interlacing = false,
|
|
|
+ .supports_cursor = false,
|
|
|
+ .supports_block_linear = false,
|
|
|
+ .pitch_align = 64,
|
|
|
};
|
|
|
|
|
|
static const struct tegra_dc_soc_info tegra124_dc_soc_info = {
|
|
|
.supports_interlacing = true,
|
|
|
.supports_cursor = true,
|
|
|
.supports_block_linear = true,
|
|
|
+ .pitch_align = 64,
|
|
|
};
|
|
|
|
|
|
static const struct of_device_id tegra_dc_of_match[] = {
|