From patchwork Thu Jun 9 09:04:47 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Maydell X-Patchwork-Id: 580239 Delivered-To: patch@linaro.org Received: by 2002:a05:7000:5806:0:0:0:0 with SMTP id j6csp593659max; Thu, 9 Jun 2022 02:16:33 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyl2KaNJQvqO/ksQ1s2lvuMMEx2bqvdL7qMNnLojjxwdEwy56qG1ta53qpLJiOtZp9mkEiT X-Received: by 2002:a05:622a:47:b0:305:1ab:e52d with SMTP id y7-20020a05622a004700b0030501abe52dmr5585007qtw.688.1654766193340; Thu, 09 Jun 2022 02:16:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1654766193; cv=none; d=google.com; s=arc-20160816; b=G9ff8IB1DgcNX82xXebsWaYw9hMe58yJiWKFhWyDf42Zwq8apu6rlV8ERL/Mm1L4MD tdDbUgixCErMLF7kZvOgwSaC9Z+xymb38LLChD65Se1v2W94l42FmmIZHJNgU1EY1h4w Y/SvVh1GeyntoVLKI8qCZ1Lo8jlfIuMHhHPtTgph14aX2ZPDpb/i+37ePXjCMJ2pXnPH 8hILRrhzF0MiyF5ODwaZz5oYOtCxaeUyClLMOyFpL8EbvP98UxK8dMoeDqwqo+dWcW2y inCfMSVyJtHrEymtKyOjV13YQofGAcMSbVLottSyJ7ecjzGmlVeusvJkGepf8ZioU/CS INEA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=815PqLyO6+Q2xJdxQZlA76V7TTOTcj2SZ6F7/EiLTo0=; b=WZuIT1godUURVI5S5qsSvLrpzSLJjlcQ4BiJJzg19pZopB9MELWr3D5k9x9N1bzyal 2OcSu0KzWbm1MVdF1p5hL9eF2lV4gqSrFvGQ9tpjZz2t1J1+u7UifEz61SLCg8B5ZPKg 9swhSkfP/xHhX2B2Suru1nEInxrxhEaeSOFcUdZu/oXf4R/6iXr2wxGdBHHm6f/WWsp5 GrWuwS2r0m1fBcJAiWfFMikEZ6QwTgRSBoz/XPJi23gf/zNJY6LC//ERvPWQ2bBnWyDC jjsMXs+o5URtQEcVumTp5Srik2mLp0IbTBjgUZgoxKkb2w74Q6cpleh9gIPmZZ6jFc18 Hf0g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=zhjXtb+T; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id 188-20020a3703c5000000b006a6a8f5d123si8104461qkd.577.2022.06.09.02.16.33 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Thu, 09 Jun 2022 02:16:33 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=zhjXtb+T; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:55556 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nzEHI-00046M-QV for patch@linaro.org; Thu, 09 Jun 2022 05:16:32 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:39222) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nzE6v-0001Ov-5P for qemu-devel@nongnu.org; Thu, 09 Jun 2022 05:05:50 -0400 Received: from mail-wr1-x435.google.com ([2a00:1450:4864:20::435]:46819) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nzE6t-0005xd-8W for qemu-devel@nongnu.org; Thu, 09 Jun 2022 05:05:48 -0400 Received: by mail-wr1-x435.google.com with SMTP id u8so27137707wrm.13 for ; Thu, 09 Jun 2022 02:05:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=815PqLyO6+Q2xJdxQZlA76V7TTOTcj2SZ6F7/EiLTo0=; b=zhjXtb+TnQRYQTfulh//qntXvpj6PXAqQQ2mn31XIawjv9WtorBmvM5GQFk3d0HTFI lah41ldMiLnJBAf42J7toiOBxje0NiRGKvgWmCgaP0+vZnoiGOu0A1j3tCOaW1DZ6Zlu bAoK0VjfPCGiYtPyG35jWUrrs4kufWN2nBzZyTXwFi62k6MLWA69pU/cwORT8S18ArjC mY0Vk0Oj52hvsc0CaDioKutP+25wr1sqfcoKYjduZkIRuGS9qm5NOXLhQQ6PES3yWLbs 108P+8VwvAzjwyBFMmor0jy5B+a3Eeboq1oDTxGUmL2G/2yV5wCS3r3gB8MyZaetMn5S oX7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=815PqLyO6+Q2xJdxQZlA76V7TTOTcj2SZ6F7/EiLTo0=; b=duFyBLNzIogCoaaWnVoqVmhlgyhtBhy74CL/PfyH8bQVGACc7XSLx+tvgLkYb9HZFj 1+Cv4pyjIjaX6uOU5WM/pU1GvKhURRNc0iEZLDFXenlCbqWJvCfMOiwM3FIDfn4UpbOI Rqu7hViM5dOM2rRJG4cMqRsQAKG7hLrRFcQ9WQmy2C2sJfjkTF5eCuAbVRNHAve4AzTw QqopOlramslBz9f82/nvjduuLsyCthBw+JzVvzvCytZGQBcCHtVWykN/dgaIPZFBpl67 dvmQfhJceALBy2/WvBcqehcQqJKklcPrOBknNFqSAgTC81eshgJEjzxAA5udgaLXmsVE 6wOw== X-Gm-Message-State: AOAM532jd3KpjEcYQ8mLdijmlogrFfHVZrx6DZmltcAggYTQBDvK/HJC CHfR8yslN6/9tIHHY+rIvKbsAJrdJwibvA== X-Received: by 2002:a5d:59a6:0:b0:218:49ff:2712 with SMTP id p6-20020a5d59a6000000b0021849ff2712mr16631531wrr.106.1654765545792; Thu, 09 Jun 2022 02:05:45 -0700 (PDT) Received: from orth.archaic.org.uk (orth.archaic.org.uk. [2001:8b0:1d0::2]) by smtp.gmail.com with ESMTPSA id c13-20020adffb0d000000b002183cf9cd69sm11349796wrr.15.2022.06.09.02.05.44 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Jun 2022 02:05:45 -0700 (PDT) From: Peter Maydell To: qemu-devel@nongnu.org Subject: [PULL 05/55] xlnx_dp: Introduce a vblank signal Date: Thu, 9 Jun 2022 10:04:47 +0100 Message-Id: <20220609090537.1971756-6-peter.maydell@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220609090537.1971756-1-peter.maydell@linaro.org> References: <20220609090537.1971756-1-peter.maydell@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2a00:1450:4864:20::435; envelope-from=peter.maydell@linaro.org; helo=mail-wr1-x435.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" From: Sai Pavan Boddu Add a periodic timer which raises vblank at a frequency of 30Hz. Note that this is a migration compatibility break for the xlnx-zcu102 board type. Signed-off-by: Sai Pavan Boddu Signed-off-by: Edgar E. Iglesias Signed-off-by: Frederic Konrad Acked-by: Alistair Francis Message-id: 20220601172353.3220232-3-fkonrad@xilinx.com Changes by fkonrad: - Switched to transaction-based ptimer API. - Added the DP_INT_VBLNK_START macro. Signed-off-by: Frederic Konrad [PMM: bump vmstate version, add commit message note about compat break] Reviewed-by: Peter Maydell Signed-off-by: Peter Maydell --- include/hw/display/xlnx_dp.h | 3 +++ hw/display/xlnx_dp.c | 30 ++++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/include/hw/display/xlnx_dp.h b/include/hw/display/xlnx_dp.h index 1ef5a89ee74..e86a87f235e 100644 --- a/include/hw/display/xlnx_dp.h +++ b/include/hw/display/xlnx_dp.h @@ -35,6 +35,7 @@ #include "hw/dma/xlnx_dpdma.h" #include "audio/audio.h" #include "qom/object.h" +#include "hw/ptimer.h" #define AUD_CHBUF_MAX_DEPTH (32 * KiB) #define MAX_QEMU_BUFFER_SIZE (4 * KiB) @@ -107,6 +108,8 @@ struct XlnxDPState { */ DPCDState *dpcd; I2CDDCState *edid; + + ptimer_state *vblank; }; #define TYPE_XLNX_DP "xlnx.v-dp" diff --git a/hw/display/xlnx_dp.c b/hw/display/xlnx_dp.c index 0378570459d..ed856b596da 100644 --- a/hw/display/xlnx_dp.c +++ b/hw/display/xlnx_dp.c @@ -114,6 +114,7 @@ #define DP_TX_N_AUD (0x032C >> 2) #define DP_TX_AUDIO_EXT_DATA(n) ((0x0330 + 4 * n) >> 2) #define DP_INT_STATUS (0x03A0 >> 2) +#define DP_INT_VBLNK_START (1 << 13) #define DP_INT_MASK (0x03A4 >> 2) #define DP_INT_EN (0x03A8 >> 2) #define DP_INT_DS (0x03AC >> 2) @@ -260,7 +261,7 @@ typedef enum DPVideoFmt DPVideoFmt; static const VMStateDescription vmstate_dp = { .name = TYPE_XLNX_DP, - .version_id = 1, + .version_id = 2, .fields = (VMStateField[]){ VMSTATE_UINT32_ARRAY(core_registers, XlnxDPState, DP_CORE_REG_ARRAY_SIZE), @@ -270,10 +271,15 @@ static const VMStateDescription vmstate_dp = { DP_VBLEND_REG_ARRAY_SIZE), VMSTATE_UINT32_ARRAY(audio_registers, XlnxDPState, DP_AUDIO_REG_ARRAY_SIZE), + VMSTATE_PTIMER(vblank, XlnxDPState), VMSTATE_END_OF_LIST() } }; +#define DP_VBLANK_PTIMER_POLICY (PTIMER_POLICY_WRAP_AFTER_ONE_PERIOD | \ + PTIMER_POLICY_CONTINUOUS_TRIGGER | \ + PTIMER_POLICY_NO_IMMEDIATE_TRIGGER) + static void xlnx_dp_update_irq(XlnxDPState *s); static uint64_t xlnx_dp_audio_read(void *opaque, hwaddr offset, unsigned size) @@ -773,6 +779,13 @@ static void xlnx_dp_write(void *opaque, hwaddr offset, uint64_t value, break; case DP_TRANSMITTER_ENABLE: s->core_registers[offset] = value & 0x01; + ptimer_transaction_begin(s->vblank); + if (value & 0x1) { + ptimer_run(s->vblank, 0); + } else { + ptimer_stop(s->vblank); + } + ptimer_transaction_commit(s->vblank); break; case DP_FORCE_SCRAMBLER_RESET: /* @@ -1177,9 +1190,6 @@ static void xlnx_dp_update_display(void *opaque) return; } - s->core_registers[DP_INT_STATUS] |= (1 << 13); - xlnx_dp_update_irq(s); - xlnx_dpdma_trigger_vsync_irq(s->dpdma); /* @@ -1275,6 +1285,14 @@ static void xlnx_dp_finalize(Object *obj) fifo8_destroy(&s->rx_fifo); } +static void vblank_hit(void *opaque) +{ + XlnxDPState *s = XLNX_DP(opaque); + + s->core_registers[DP_INT_STATUS] |= DP_INT_VBLNK_START; + xlnx_dp_update_irq(s); +} + static void xlnx_dp_realize(DeviceState *dev, Error **errp) { XlnxDPState *s = XLNX_DP(dev); @@ -1309,6 +1327,10 @@ static void xlnx_dp_realize(DeviceState *dev, Error **errp) &as); AUD_set_volume_out(s->amixer_output_stream, 0, 255, 255); xlnx_dp_audio_activate(s); + s->vblank = ptimer_init(vblank_hit, s, DP_VBLANK_PTIMER_POLICY); + ptimer_transaction_begin(s->vblank); + ptimer_set_freq(s->vblank, 30); + ptimer_transaction_commit(s->vblank); } static void xlnx_dp_reset(DeviceState *dev)