From patchwork Thu Jan 5 11:12:36 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Gaignard X-Patchwork-Id: 9498885 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 646BA606B5 for ; Thu, 5 Jan 2017 11:13:41 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6C2321FE82 for ; Thu, 5 Jan 2017 11:13:41 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5EB1428325; Thu, 5 Jan 2017 11:13:41 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.1 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id B0D8C1FE82 for ; Thu, 5 Jan 2017 11:13:40 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id D81DA6E85B; Thu, 5 Jan 2017 11:13:37 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-wm0-x233.google.com (mail-wm0-x233.google.com [IPv6:2a00:1450:400c:c09::233]) by gabe.freedesktop.org (Postfix) with ESMTPS id E50466E85B for ; Thu, 5 Jan 2017 11:13:35 +0000 (UTC) Received: by mail-wm0-x233.google.com with SMTP id k184so285199560wme.1 for ; Thu, 05 Jan 2017 03:13:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=yQWpgbm4nyH4JPIrJwsAvk0hvv34+k/T7CX4W83gmm8=; b=OgT5ivVG+j5T5IkCUbhccCfTrM+tHgqXRUIfiD913cRVigd2nLy9FGUZ+gPiI5Y+7W Kc7nXm+kG9WOfV6OEY5VNpNbDPJZj+OylZCT9oe+e8g9t2T6gPHbHsquG+nWWe10jFSO 0hLd7eP9HxYLfEyxjm/t9c3q3USsmGi+oH/BA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=yQWpgbm4nyH4JPIrJwsAvk0hvv34+k/T7CX4W83gmm8=; b=mI26b0vqYbLHeL+adNDdBvGRT69cXBYz+wvrGo1n7pGCHIanYKCbGAc/K/ZtTfK3Fj Vldm+uifwJGp0xV5sxgBtlvMbuXSGIBVx2viWZSzxSzw5kOwVaG5KUEDHs1jcDocU/Mg ZQWga47FI25p2UhmkFGyLmXef0mwISzyiG6rXpBhaBFNG+9Tn+zE1JjNBdG2x1Me1Gwn u7f8gXxIW8gv2wx6Gax1rm2wV4viFbcdBamxUthE1YNUJYk5x8NkbC32Hdr0YxCjkRaq fwUw+W7LlOk0UrT/f5Zna4Ng+QI2oRN0KWeXp7ulkjlVxrTvLQ7Ey6E3wP7V3V/MMKRN 4BJw== X-Gm-Message-State: AIkVDXLbVRAOiiwozicwZgvTdaBURsstP1RGGsrVioTRr/g3tJounWl9fxJUhV+JfGcGhUyZ X-Received: by 10.28.176.200 with SMTP id z191mr61890383wme.17.1483614813889; Thu, 05 Jan 2017 03:13:33 -0800 (PST) Received: from lmenx321.st.com. ([80.215.81.121]) by smtp.gmail.com with ESMTPSA id lr10sm71416463wjb.6.2017.01.05.03.13.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 05 Jan 2017 03:13:33 -0800 (PST) From: Benjamin Gaignard To: dri-devel@lists.freedesktop.org, vincent.abriou@st.com Subject: [PATCH] drm: sti: implement CRC capture API Date: Thu, 5 Jan 2017 12:12:36 +0100 Message-Id: <1483614756-3544-1-git-send-email-benjamin.gaignard@linaro.org> X-Mailer: git-send-email 1.9.1 Cc: Daniel Vetter , Tomeu Vizoso X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP Use CRC API to retrieve the 3 crc values from hardware. Signed-off-by: Benjamin Gaignard --- This patch should be applied on top of drm-misc branch where Tomeu has change crc.lock. I think that wake_up_interruptible() could also be call at the end of drm_crtc_add_crc_entry() to avoid putting it in all drivers. Cc: Tomeu Vizoso Cc: Daniel Vetter --- drivers/gpu/drm/sti/sti_crtc.c | 27 +++++++++++++++++++++++ drivers/gpu/drm/sti/sti_mixer.c | 47 +++++++++++++++++++++++++++++++++++++++++ drivers/gpu/drm/sti/sti_mixer.h | 4 ++++ 3 files changed, 78 insertions(+) diff --git a/drivers/gpu/drm/sti/sti_crtc.c b/drivers/gpu/drm/sti/sti_crtc.c index e992bed..47022b4 100644 --- a/drivers/gpu/drm/sti/sti_crtc.c +++ b/drivers/gpu/drm/sti/sti_crtc.c @@ -20,6 +20,8 @@ #include "sti_vid.h" #include "sti_vtg.h" +#define CRC_SAMPLES 3 + static void sti_crtc_enable(struct drm_crtc *crtc) { struct sti_mixer *mixer = to_sti_mixer(crtc); @@ -253,6 +255,8 @@ int sti_crtc_vblank_cb(struct notifier_block *nb, unsigned long flags; struct sti_private *priv; unsigned int pipe; + u32 crcs[CRC_SAMPLES]; + int ret; priv = crtc->dev->dev_private; pipe = drm_crtc_index(crtc); @@ -275,6 +279,12 @@ int sti_crtc_vblank_cb(struct notifier_block *nb, } spin_unlock_irqrestore(&crtc->dev->event_lock, flags); + if (!sti_mixer_read_crcs(mixer, &crcs[0], &crcs[1], &crcs[2])) { + ret = drm_crtc_add_crc_entry(crtc, false, 0, crcs); + if (!ret) + wake_up_interruptible(&crtc->crc.wq); + } + if (mixer->status == STI_MIXER_DISABLING) { struct drm_plane *p; @@ -343,6 +353,22 @@ static int sti_crtc_late_register(struct drm_crtc *crtc) return 0; } +int sti_set_crc_source(struct drm_crtc *crtc, const char *source, + size_t *values_cnt) +{ + struct sti_mixer *mixer = to_sti_mixer(crtc); + + *values_cnt = CRC_SAMPLES; + + if (!source) + return sti_mixer_set_crc_status(mixer, false); + + if (source && strcmp(source, "auto") == 0) + return sti_mixer_set_crc_status(mixer, true); + + return -EINVAL; +} + static const struct drm_crtc_funcs sti_crtc_funcs = { .set_config = drm_atomic_helper_set_config, .page_flip = drm_atomic_helper_page_flip, @@ -352,6 +378,7 @@ static int sti_crtc_late_register(struct drm_crtc *crtc) .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state, .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state, .late_register = sti_crtc_late_register, + .set_crc_source = sti_set_crc_source, }; bool sti_crtc_is_main(struct drm_crtc *crtc) diff --git a/drivers/gpu/drm/sti/sti_mixer.c b/drivers/gpu/drm/sti/sti_mixer.c index 4ddc58f..4eb5cc5 100644 --- a/drivers/gpu/drm/sti/sti_mixer.c +++ b/drivers/gpu/drm/sti/sti_mixer.c @@ -27,6 +27,13 @@ #define GAM_MIXER_ACT 0x38 #define GAM_MIXER_MBP 0x3C #define GAM_MIXER_MX0 0x80 +#define GAM_MIXER_MISR_CTL 0xA0 +#define GAM_MIXER_MISR_STA 0xA4 +#define GAM_MIXER_SIGN1 0xA8 +#define GAM_MIXER_SIGN2 0xAC +#define GAM_MIXER_SIGN3 0xB0 +#define GAM_MIXER_MISR_AVO 0xB4 +#define GAM_MIXER_MISR_AVS 0xB8 /* id for depth of CRB reg */ #define GAM_DEPTH_VID0_ID 1 @@ -162,6 +169,13 @@ static int mixer_dbg_show(struct seq_file *s, void *arg) DBGFS_DUMP(GAM_MIXER_MBP); DBGFS_DUMP(GAM_MIXER_MX0); mixer_dbg_mxn(s, mixer->regs + GAM_MIXER_MX0); + DBGFS_DUMP(GAM_MIXER_MISR_CTL); + DBGFS_DUMP(GAM_MIXER_MISR_STA); + DBGFS_DUMP(GAM_MIXER_SIGN1); + DBGFS_DUMP(GAM_MIXER_SIGN2); + DBGFS_DUMP(GAM_MIXER_SIGN3); + DBGFS_DUMP(GAM_MIXER_MISR_AVO); + DBGFS_DUMP(GAM_MIXER_MISR_AVS); seq_puts(s, "\n"); return 0; @@ -202,6 +216,36 @@ int sti_mixer_debugfs_init(struct sti_mixer *mixer, struct drm_minor *minor) minor->debugfs_root, minor); } +int sti_mixer_set_crc_status(struct sti_mixer *mixer, bool enable) +{ + if (enable) { + sti_mixer_reg_read(mixer, GAM_MIXER_MISR_STA); + sti_mixer_reg_read(mixer, GAM_MIXER_SIGN1); + sti_mixer_reg_read(mixer, GAM_MIXER_SIGN2); + sti_mixer_reg_read(mixer, GAM_MIXER_SIGN3); + sti_mixer_reg_write(mixer, GAM_MIXER_MISR_CTL, 0x0F); + } else { + sti_mixer_reg_write(mixer, GAM_MIXER_MISR_CTL, 0x00); + } + + return 0; +} + +int sti_mixer_read_crcs(struct sti_mixer *mixer, + u32 *sign1, u32 *sign2, u32 *sign3) +{ + u32 status = sti_mixer_reg_read(mixer, GAM_MIXER_MISR_STA); + + if (!(status & 0x1)) + return -EINVAL; + + *sign1 = sti_mixer_reg_read(mixer, GAM_MIXER_SIGN1); + *sign2 = sti_mixer_reg_read(mixer, GAM_MIXER_SIGN2); + *sign3 = sti_mixer_reg_read(mixer, GAM_MIXER_SIGN3); + + return 0; +} + void sti_mixer_set_background_status(struct sti_mixer *mixer, bool enable) { u32 val = sti_mixer_reg_read(mixer, GAM_MIXER_CTL); @@ -301,6 +345,9 @@ int sti_mixer_active_video_area(struct sti_mixer *mixer, sti_mixer_reg_write(mixer, GAM_MIXER_AVO, ydo << 16 | xdo); sti_mixer_reg_write(mixer, GAM_MIXER_AVS, yds << 16 | xds); + sti_mixer_reg_write(mixer, GAM_MIXER_MISR_AVO, ydo << 16 | xdo); + sti_mixer_reg_write(mixer, GAM_MIXER_MISR_AVS, yds << 16 | xds); + sti_mixer_set_background_color(mixer, bkg_color); sti_mixer_set_background_area(mixer, mode); diff --git a/drivers/gpu/drm/sti/sti_mixer.h b/drivers/gpu/drm/sti/sti_mixer.h index 830a3c4..b16feb1 100644 --- a/drivers/gpu/drm/sti/sti_mixer.h +++ b/drivers/gpu/drm/sti/sti_mixer.h @@ -55,6 +55,10 @@ int sti_mixer_active_video_area(struct sti_mixer *mixer, void sti_mixer_set_background_status(struct sti_mixer *mixer, bool enable); +int sti_mixer_set_crc_status(struct sti_mixer *mixer, bool enable); +int sti_mixer_read_crcs(struct sti_mixer *mixer, + u32 *sign1, u32 *sign2, u32 *sign3); + int sti_mixer_debugfs_init(struct sti_mixer *mixer, struct drm_minor *minor); /* depth in Cross-bar control = z order */