Linux_SDK_V1.5.4

Signed-off-by: thead_admin <occ_thead@service.alibaba.com>
This commit is contained in:
thead_admin
2024-04-26 03:07:38 +00:00
committed by Han Gao
parent 89d6663712
commit 7563179071
105 changed files with 3730 additions and 1716 deletions

View File

@@ -2059,6 +2059,12 @@ static void hdmi_av_composer(struct dw_hdmi *hdmi,
drm_scdc_set_scrambling(hdmi->ddc, 0);
}
}
else{
hdmi_writeb(hdmi, 0, HDMI_FC_SCRAMBLER_CTRL);
hdmi_writeb(hdmi, (u8)~HDMI_MC_SWRSTZ_TMDSSWRST_REQ,
HDMI_MC_SWRSTZ);
drm_scdc_set_scrambling(hdmi->ddc, 0);
}
/* Set up horizontal active pixel width */
hdmi_writeb(hdmi, hdisplay >> 8, HDMI_FC_INHACTV1);

View File

@@ -135,17 +135,17 @@ static int hx8279_panel_enable(struct drm_panel *panel)
if (pinfo->enabled)
return 0;
ret = mipi_dsi_dcs_exit_sleep_mode(pinfo->link);
ret = mipi_dsi_dcs_set_display_on(pinfo->link);
if (ret < 0) {
dev_err(panel->dev, "failed to exit sleep mode: %d\n", ret);
dev_err(panel->dev, "failed to set display on: %d\n", ret);
return ret;
}
msleep(120);
ret = mipi_dsi_dcs_set_display_on(pinfo->link);
ret = mipi_dsi_dcs_exit_sleep_mode(pinfo->link);
if (ret < 0) {
dev_err(panel->dev, "failed to set display on: %d\n", ret);
dev_err(panel->dev, "failed to exit sleep mode: %d\n", ret);
return ret;
}

View File

@@ -136,10 +136,10 @@ static int jadard_prepare(struct drm_panel *panel)
dev_err(pinfo->base.dev, "Failed to enable vspn3v3 supply: %d\n", ret);
goto fail;
}
usleep_range(5000, 6000);
usleep_range(1000, 2000);
gpiod_set_value(pinfo->reset, 1);
msleep(180);
msleep(10);
pinfo->prepared = true;
@@ -165,7 +165,7 @@ static int jadard_enable(struct drm_panel *panel)
return ret;
}
msleep(120);
msleep(10);
ret = mipi_dsi_dcs_set_display_on(pinfo->link);
if (ret < 0) {
@@ -225,7 +225,7 @@ static const struct drm_display_mode jadard_default_mode = {
.width_mm = 62,
.height_mm = 110,
.flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
.flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
};

View File

@@ -29,6 +29,8 @@ static void vs_crtc_reset(struct drm_crtc *crtc)
{
struct vs_crtc_state *state;
vs_crtc_reset_count ++;
if (crtc->state) {
__drm_atomic_helper_crtc_destroy_state(crtc->state);

View File

@@ -11,6 +11,8 @@
#include "vs_type.h"
extern int vs_crtc_reset_count;
struct vs_crtc_funcs {
void (*enable)(struct device *dev, struct drm_crtc *crtc);
void (*disable)(struct device *dev, struct drm_crtc *crtc);

View File

@@ -1345,6 +1345,8 @@ static int dc_suspend(struct device *dev)
clk_set_rate(dc->pixclk[i], dc->pix_clk_rate[i] * 1000);
}
dc_runtime_suspend(dev);
return 0;
}
@@ -1353,10 +1355,14 @@ static int dc_resume(struct device *dev)
int i, ret;
struct vs_dc *dc = dev_get_drvdata(dev);
dev_info(dev,"dc resume\n");
dc_runtime_suspend(dev);
dc_runtime_resume(dev);
regmap_write(dc->hw.vosys_regmap,0x4,0x7); //release dpu reset
ret = dc_hw_init(&dc->hw);
if (ret)
if (ret)
dev_err(dev, "failed to init DC HW\n");
return 0;
}

View File

@@ -34,12 +34,22 @@
#include "dw_mipi_dsi.h"
#include "dw_hdmi_light.h"
/* debug sysfs */
#include <drm/drm_auth.h>
#include "../drm_crtc_internal.h"
#define DRV_NAME "vs-drm"
#define DRV_DESC "VeriSilicon DRM driver"
#define DRV_DATE "20191101"
#define DRV_MAJOR 1
#define DRV_MINOR 0
/* extern exception info */
int vs_crtc_reset_count = 0;
int TotalFailures = 0;
static bool has_iommu = true;
static struct platform_driver vs_drm_platform_driver;
@@ -54,6 +64,225 @@ static const struct file_operations fops = {
.mmap = vs_gem_mmap,
};
static ssize_t log_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
{
// struct device *dev = kobj_to_dev(kobj);
// struct drm_device *drm_dev = dev_get_drvdata(dev);
struct device *dev = kobj_to_dev(kobj);
struct drm_minor *dminor = dev_get_drvdata(dev);
struct drm_device *drm_dev = dminor -> dev;
struct drm_framebuffer *fb;
struct drm_plane *plane;
struct drm_crtc * drm_crtc;
ssize_t len = 0;
/* module version */
const char *module_version = "1.0.0";
const char *build_time = "20230101";
/* module info */
int crtc_count = 0;
unsigned int plane_count = 0;
unsigned int plane_used = 0;
unsigned int plane_free = 0;
unsigned int fb_count = 0;
list_for_each_entry(drm_crtc, &drm_dev->mode_config.crtc_list, head) {
crtc_count++;
}
list_for_each_entry(plane, &drm_dev->mode_config.plane_list, head) {
plane_count++;
if (plane->state && plane->state->fb) {
plane_used++;
}
}
plane_free = plane_count - plane_used;
list_for_each_entry(fb, &drm_dev->mode_config.fb_list, head) {
fb_count++;
}
struct drm_connector *connector;
enum drm_connector_status status;
bool hdmi_on = false;
bool dsi_on = false;
list_for_each_entry(connector, &drm_dev->mode_config.connector_list, head) {
status = connector->status;
if (connector->connector_type == DRM_MODE_CONNECTOR_HDMIA) {
hdmi_on = (status == connector_status_connected);
} else if (connector->connector_type == DRM_MODE_CONNECTOR_DSI) {
dsi_on = (status == connector_status_connected);
}
}
struct drm_file *priv;
kuid_t uid;
int client_count = 0;
list_for_each_entry_reverse(priv, &drm_dev->filelist, lhead) {
client_count++;
}
len += scnprintf(buf + len, PAGE_SIZE - len,
"----------------------------------------MODULE VERSION----------------------------------------\n"
"[Video Sub System] Version: %s, Build Time【%s】\n"
"----------------------------------------MODULE STATUS-----------------------------------------\n"
"CrtcCount PlaneCount PlaneUsed PlaneFree FrameBufferCount ClientCount HDMI DSI\n"
" %d %u %u %u %u %u %s %s\n"
"----------------------------------------EXCEPTION INFO----------------------------------------\n"
"TotalFailures Reset\n"
" %d %d\n",
module_version, build_time,
crtc_count, plane_count, plane_used, plane_count - plane_used , fb_count, client_count, hdmi_on?"on":"off", dsi_on?"on":"off",
TotalFailures, vs_crtc_reset_count
);
len += scnprintf(buf + len, PAGE_SIZE - len,
"-----------------------------------------Client Info-----------------------------------------\n"
"%20s %5s %3s master a %5s %10s\n",
"command","pid","dev","uid","magic");
list_for_each_entry_reverse(priv, &drm_dev->filelist, lhead) {
struct task_struct *task;
bool is_current_master = drm_is_current_master(priv);
rcu_read_lock(); /* locks pid_task()->comm */
task = pid_task(priv->pid, PIDTYPE_PID);
uid = task ? __task_cred(task)->euid : GLOBAL_ROOT_UID;
len += scnprintf(buf + len, PAGE_SIZE - len, "%20s %5d %3d %c %c %5u %10u\n",
task ? task->comm : "<unknown>",
pid_vnr(priv->pid),
priv->minor->index,
is_current_master ? 'y' : 'n',
priv->authenticated ? 'y' : 'n',
// from_kuid_munged(seq_user_ns(m), uid)
uid,
priv->magic);
rcu_read_unlock();
}
if (drm_dev) {
len += scnprintf(buf + len, PAGE_SIZE - len,
"-----------------------------------------MODULE INFO-----------------------------------------\n");
list_for_each_entry(fb, &drm_dev->mode_config.fb_list, head) {
struct drm_format_name_buf format_name;
unsigned int i;
len += scnprintf(buf + len, PAGE_SIZE - len,
"framebuffer[%u]:\n"
"\tallocated by = %s\n"
"\tformat=%s\n"
"\tsize=%ux%u\n",
fb->base.id,
fb->comm,
drm_get_format_name(fb->format->format, &format_name),
fb->width, fb->height
);
for (i = 0; i < fb->format->num_planes; i++) {
len+= scnprintf(buf + len, PAGE_SIZE - len,"\t\tpitch[%u]=%u\n",i, fb->pitches[i]);
}
}
}
list_for_each_entry(drm_crtc, &drm_dev->mode_config.crtc_list, head) {
// struct vs_crtc *crtc = to_vs_crtc(drm_crtc);
struct drm_crtc *crtc = drm_crtc->state->crtc;
struct vs_crtc_state *crtc_state = to_vs_crtc_state(drm_crtc->state);
len += scnprintf(buf + len, PAGE_SIZE - len,
"crtc[%u]: %s\n"
"\tenable= %d\n"
"\tplane_mask=%x\n"
"\tconnector_mask=%x\n"
"\tencoder_mask=%x\n"
"\tmode: " DRM_MODE_FMT "\n",
crtc->base.id, crtc->name,
drm_crtc->state->enable,
drm_crtc->state->plane_mask,
drm_crtc->state->connector_mask,
drm_crtc->state->encoder_mask,
DRM_MODE_ARG(&(drm_crtc->state->mode))
);
}
list_for_each_entry(plane, &drm_dev->mode_config.plane_list, head) {
struct drm_plane_state *state = plane->state;
struct vs_plane_state *plane_state = to_vs_plane_state(state);
struct drm_rect src = drm_plane_state_src(state);
struct drm_rect dest = drm_plane_state_dest(state);
len += scnprintf(buf + len, PAGE_SIZE - len,
"plane[%u]: %s\n"
"\tcrtc=%s\n"
"\tcrtc-pos=" DRM_RECT_FMT "\n"
"\tsrc-pos=" DRM_RECT_FP_FMT "\n"
"\trotation=%x\n"
"\tcolor-encoding=%s\n"
"\tcolor-range=%s\n",
plane->base.id, plane->name,
state->crtc ? state->crtc->name : "(null)",
DRM_RECT_ARG(&dest),
DRM_RECT_FP_ARG(&src),
state->rotation,
drm_get_color_encoding_name(state->color_encoding),
drm_get_color_range_name(state->color_range)
);
}
return len;
}
static ssize_t log_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count)
{
TotalFailures = 0;
vs_crtc_reset_count = 0;
return count;
}
static int period_ms =0;
static ssize_t updatePeriod_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
{
return sprintf(buf,"%u\n",period_ms);
}
static ssize_t updatePeriod_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count)
{
char *start = (char *)buf;
period_ms = simple_strtoul(start, &start, 0);
return count;
}
static struct kobj_attribute log_attr = __ATTR(log, 0664, log_show, log_store);
static struct kobj_attribute updatePeriod_attr = __ATTR(updatePeriod_ms, 0664, updatePeriod_show, updatePeriod_store);
static struct attribute *attrs[] = {
&log_attr.attr,
&updatePeriod_attr.attr,
NULL,
};
static umode_t always_visible(struct kobject *kobj, struct attribute *attr, int index)
{
return 0644;
}
static struct attribute_group vs_dev_attr_group = {
.name = "info",
.is_visible = always_visible,
.attrs = attrs,
};
#ifdef CONFIG_DEBUG_FS
static int vs_debugfs_planes_show(struct seq_file *s, void *data)
{
@@ -239,10 +468,19 @@ static int vs_drm_bind(struct device *dev)
if (ret)
goto err_helper;
ret = sysfs_create_group(&drm_dev->primary->kdev->kobj, &vs_dev_attr_group);
if (ret) {
dev_err(drm_dev->dev, "Failed to create drm dev sysfs.\n");
goto err_drm_dev_register;
}
drm_fbdev_generic_setup(drm_dev, 32);
return 0;
err_drm_dev_register:
drm_dev_unregister(drm_dev);
err_helper:
drm_kms_helper_poll_fini(drm_dev);
err_bind:
@@ -265,6 +503,8 @@ static void vs_drm_unbind(struct device *dev)
drm_dev_unregister(drm_dev);
sysfs_remove_group(&drm_dev->primary->kdev->kobj, &vs_dev_attr_group);
drm_kms_helper_poll_fini(drm_dev);
component_unbind_all(drm_dev->dev, drm_dev);