qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Nicholas Piggin" <npiggin@gmail.com>
To: "Michael Kowal" <kowal@linux.ibm.com>, <qemu-devel@nongnu.org>
Cc: <qemu-ppc@nongnu.org>, <fbarrat@linux.ibm.com>,
	<milesg@linux.ibm.com>, <danielhb413@gmail.com>,
	<david@gibson.dropbear.id.au>, <harshpb@linux.ibm.com>,
	<thuth@redhat.com>, <lvivier@redhat.com>, <pbonzini@redhat.com>
Subject: Re: [PATCH v2 08/14] qtest/xive: Add group-interrupt test
Date: Mon, 10 Mar 2025 14:46:18 +1000	[thread overview]
Message-ID: <D8CBABU0FRD1.1X7KHNS0GJUAK@gmail.com> (raw)
In-Reply-To: <20241210000527.9541-16-kowal@linux.ibm.com>

On Tue Dec 10, 2024 at 10:05 AM AEST, Michael Kowal wrote:
> From: Frederic Barrat <fbarrat@linux.ibm.com>
>
> Add XIVE2 tests for group interrupts and group interrupts that have
> been backlogged.
>
> Signed-off-by: Frederic Barrat <fbarrat@linux.ibm.com>
> Signed-off-by: Michael Kowal <kowal@linux.ibm.com>

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>

> ---
>  tests/qtest/pnv-xive2-test.c | 160 +++++++++++++++++++++++++++++++++++
>  1 file changed, 160 insertions(+)
>
> diff --git a/tests/qtest/pnv-xive2-test.c b/tests/qtest/pnv-xive2-test.c
> index dd19e88861..a4d06550ee 100644
> --- a/tests/qtest/pnv-xive2-test.c
> +++ b/tests/qtest/pnv-xive2-test.c
> @@ -2,6 +2,8 @@
>   * QTest testcase for PowerNV 10 interrupt controller (xive2)
>   *  - Test irq to hardware thread
>   *  - Test 'Pull Thread Context to Odd Thread Reporting Line'
> + *  - Test irq to hardware group
> + *  - Test irq to hardware group going through backlog
>   *
>   * Copyright (c) 2024, IBM Corporation.
>   *
> @@ -315,6 +317,158 @@ static void test_pull_thread_ctx_to_odd_thread_cl(QTestState *qts)
>      word2 = get_tima32(qts, target_pir, TM_QW3_HV_PHYS + TM_WORD2);
>      g_assert_cmphex(xive_get_field32(TM_QW3W2_VT, word2), ==, 0);
>  }
> +
> +static void test_hw_group_irq(QTestState *qts)
> +{
> +    uint32_t irq = 100;
> +    uint32_t irq_data = 0xdeadbeef;
> +    uint32_t end_index = 23;
> +    uint32_t chosen_one;
> +    uint32_t target_nvp = 0x81; /* group size = 4 */
> +    uint8_t priority = 6;
> +    uint32_t reg32;
> +    uint16_t reg16;
> +    uint8_t pq, nsr, cppr;
> +
> +    printf("# ============================================================\n");
> +    printf("# Testing irq %d to hardware group of size 4\n", irq);
> +
> +    /* irq config */
> +    set_eas(qts, irq, end_index, irq_data);
> +    set_end(qts, end_index, target_nvp, priority, true /* group */);
> +
> +    /* enable and trigger irq */
> +    get_esb(qts, irq, XIVE_EOI_PAGE, XIVE_ESB_SET_PQ_00);
> +    set_esb(qts, irq, XIVE_TRIGGER_PAGE, 0, 0);
> +
> +    /* check irq is raised on cpu */
> +    pq = get_esb(qts, irq, XIVE_EOI_PAGE, XIVE_ESB_GET);
> +    g_assert_cmpuint(pq, ==, XIVE_ESB_PENDING);
> +
> +    /* find the targeted vCPU */
> +    for (chosen_one = 0; chosen_one < SMT; chosen_one++) {
> +        reg32 = get_tima32(qts, chosen_one, TM_QW3_HV_PHYS + TM_WORD0);
> +        nsr = reg32 >> 24;
> +        if (nsr == 0x82) {
> +            break;
> +        }
> +    }
> +    g_assert_cmphex(chosen_one, <, SMT);
> +    cppr = (reg32 >> 16) & 0xFF;
> +    g_assert_cmphex(nsr, ==, 0x82);
> +    g_assert_cmphex(cppr, ==, 0xFF);
> +
> +    /* ack the irq */
> +    reg16 = get_tima16(qts, chosen_one, TM_SPC_ACK_HV_REG);
> +    nsr = reg16 >> 8;
> +    cppr = reg16 & 0xFF;
> +    g_assert_cmphex(nsr, ==, 0x82);
> +    g_assert_cmphex(cppr, ==, priority);
> +
> +    /* check irq data is what was configured */
> +    reg32 = qtest_readl(qts, xive_get_queue_addr(end_index));
> +    g_assert_cmphex((reg32 & 0x7fffffff), ==, (irq_data & 0x7fffffff));
> +
> +    /* End Of Interrupt */
> +    set_esb(qts, irq, XIVE_EOI_PAGE, XIVE_ESB_STORE_EOI, 0);
> +    pq = get_esb(qts, irq, XIVE_EOI_PAGE, XIVE_ESB_GET);
> +    g_assert_cmpuint(pq, ==, XIVE_ESB_RESET);
> +
> +    /* reset CPPR */
> +    set_tima8(qts, chosen_one, TM_QW3_HV_PHYS + TM_CPPR, 0xFF);
> +    reg32 = get_tima32(qts, chosen_one, TM_QW3_HV_PHYS + TM_WORD0);
> +    nsr = reg32 >> 24;
> +    cppr = (reg32 >> 16) & 0xFF;
> +    g_assert_cmphex(nsr, ==, 0x00);
> +    g_assert_cmphex(cppr, ==, 0xFF);
> +}
> +
> +static void test_hw_group_irq_backlog(QTestState *qts)
> +{
> +    uint32_t irq = 31;
> +    uint32_t irq_data = 0x01234567;
> +    uint32_t end_index = 129;
> +    uint32_t target_nvp = 0x81; /* group size = 4 */
> +    uint32_t chosen_one = 3;
> +    uint8_t blocking_priority, priority = 3;
> +    uint32_t reg32;
> +    uint16_t reg16;
> +    uint8_t pq, nsr, cppr, lsmfb, i;
> +
> +    printf("# ============================================================\n");
> +    printf("# Testing irq %d to hardware group of size 4 going through " \
> +           "backlog\n",
> +           irq);
> +
> +    /*
> +     * set current priority of all threads in the group to something
> +     * higher than what we're about to trigger
> +     */
> +    blocking_priority = priority - 1;
> +    for (i = 0; i < SMT; i++) {
> +        set_tima8(qts, i, TM_QW3_HV_PHYS + TM_CPPR, blocking_priority);
> +    }
> +
> +    /* irq config */
> +    set_eas(qts, irq, end_index, irq_data);
> +    set_end(qts, end_index, target_nvp, priority, true /* group */);
> +
> +    /* enable and trigger irq */
> +    get_esb(qts, irq, XIVE_EOI_PAGE, XIVE_ESB_SET_PQ_00);
> +    set_esb(qts, irq, XIVE_TRIGGER_PAGE, 0, 0);
> +
> +    /* check irq is raised on cpu */
> +    pq = get_esb(qts, irq, XIVE_EOI_PAGE, XIVE_ESB_GET);
> +    g_assert_cmpuint(pq, ==, XIVE_ESB_PENDING);
> +
> +    /* check no interrupt is pending on the 2 possible targets */
> +    for (i = 0; i < SMT; i++) {
> +        reg32 = get_tima32(qts, i, TM_QW3_HV_PHYS + TM_WORD0);
> +        nsr = reg32 >> 24;
> +        cppr = (reg32 >> 16) & 0xFF;
> +        lsmfb = reg32 & 0xFF;
> +        g_assert_cmphex(nsr, ==, 0x0);
> +        g_assert_cmphex(cppr, ==, blocking_priority);
> +        g_assert_cmphex(lsmfb, ==, priority);
> +    }
> +
> +    /* lower priority of one thread */
> +    set_tima8(qts, chosen_one, TM_QW3_HV_PHYS + TM_CPPR, priority + 1);
> +
> +    /* check backlogged interrupt is presented */
> +    reg32 = get_tima32(qts, chosen_one, TM_QW3_HV_PHYS + TM_WORD0);
> +    nsr = reg32 >> 24;
> +    cppr = (reg32 >> 16) & 0xFF;
> +    g_assert_cmphex(nsr, ==, 0x82);
> +    g_assert_cmphex(cppr, ==, priority + 1);
> +
> +    /* ack the irq */
> +    reg16 = get_tima16(qts, chosen_one, TM_SPC_ACK_HV_REG);
> +    nsr = reg16 >> 8;
> +    cppr = reg16 & 0xFF;
> +    g_assert_cmphex(nsr, ==, 0x82);
> +    g_assert_cmphex(cppr, ==, priority);
> +
> +    /* check irq data is what was configured */
> +    reg32 = qtest_readl(qts, xive_get_queue_addr(end_index));
> +    g_assert_cmphex((reg32 & 0x7fffffff), ==, (irq_data & 0x7fffffff));
> +
> +    /* End Of Interrupt */
> +    set_esb(qts, irq, XIVE_EOI_PAGE, XIVE_ESB_STORE_EOI, 0);
> +    pq = get_esb(qts, irq, XIVE_EOI_PAGE, XIVE_ESB_GET);
> +    g_assert_cmpuint(pq, ==, XIVE_ESB_RESET);
> +
> +    /* reset CPPR */
> +    set_tima8(qts, chosen_one, TM_QW3_HV_PHYS + TM_CPPR, 0xFF);
> +    reg32 = get_tima32(qts, chosen_one, TM_QW3_HV_PHYS + TM_WORD0);
> +    nsr = reg32 >> 24;
> +    cppr = (reg32 >> 16) & 0xFF;
> +    lsmfb = reg32 & 0xFF;
> +    g_assert_cmphex(nsr, ==, 0x00);
> +    g_assert_cmphex(cppr, ==, 0xFF);
> +    g_assert_cmphex(lsmfb, ==, 0xFF);
> +}
> +
>  static void test_xive(void)
>  {
>      QTestState *qts;
> @@ -330,6 +484,12 @@ static void test_xive(void)
>      /* omit reset_state here and use settings from test_hw_irq */
>      test_pull_thread_ctx_to_odd_thread_cl(qts);
>  
> +    reset_state(qts);
> +    test_hw_group_irq(qts);
> +
> +    reset_state(qts);
> +    test_hw_group_irq_backlog(qts);
> +
>      reset_state(qts);
>      test_flush_sync_inject(qts);
>  



  reply	other threads:[~2025-03-10  4:47 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-12-10  0:05 [PATCH v2 00/14] XIVE2 changes to support Group and Crowd operations Michael Kowal
2024-12-10  0:05 ` [PATCH v2 01/14] ppc/xive2: Update NVP save/restore for group attributes Michael Kowal
2025-03-10  3:22   ` Nicholas Piggin
2024-12-10  0:05 ` [PATCH v2 02/14] ppc/xive2: Add grouping level to notification Michael Kowal
2025-03-10  3:27   ` Nicholas Piggin
2024-12-10  0:05 ` [PATCH v2 02/14] ppc/xive: Rename ipb_to_pipr() to xive_ipb_to_pipr() Michael Kowal
2025-03-10  3:45   ` Nicholas Piggin
2024-12-10  0:05 ` [PATCH v2 03/14] ppc/xive2: Add grouping level to notification Michael Kowal
2025-03-10  3:43   ` Nicholas Piggin
2024-12-10  0:05 ` [PATCH v2 03/14] ppc/xive2: Support group-matching when looking for target Michael Kowal
2025-03-10  3:52   ` Nicholas Piggin
2024-12-10  0:05 ` [PATCH v2 04/14] ppc/xive2: Add undelivered group interrupt to backlog Michael Kowal
2024-12-10  0:05 ` [PATCH v2 04/14] ppc/xive2: Support group-matching when looking for target Michael Kowal
2024-12-10  0:05 ` [PATCH v2 05/14] ppc/xive2: Add undelivered group interrupt to backlog Michael Kowal
2025-03-10  4:07   ` Nicholas Piggin
2024-12-10  0:05 ` [PATCH v2 05/14] ppc/xive2: Process group backlog when pushing an OS context Michael Kowal
2024-12-10  0:05 ` [PATCH v2 06/14] " Michael Kowal
2024-12-10  0:05 ` [PATCH v2 06/14] ppc/xive2: Process group backlog when updating the CPPR Michael Kowal
2024-12-10  0:05 ` [PATCH v2 07/14] " Michael Kowal
2025-03-10  4:35   ` Nicholas Piggin
2024-12-10  0:05 ` [PATCH v2 07/14] qtest/xive: Add group-interrupt test Michael Kowal
2024-12-10  0:05 ` [PATCH v2 08/14] Add support for MMIO operations on the NVPG/NVC BAR Michael Kowal
2024-12-10  0:05 ` [PATCH v2 08/14] qtest/xive: Add group-interrupt test Michael Kowal
2025-03-10  4:46   ` Nicholas Piggin [this message]
2024-12-10  0:05 ` [PATCH v2 09/14] ppc/xive2: Add support for MMIO operations on the NVPG/NVC BAR Michael Kowal
2025-03-10  5:10   ` Nicholas Piggin
2024-12-10  0:05 ` [PATCH v2 09/14] ppc/xive2: Support crowd-matching when looking for target Michael Kowal
2024-12-10  0:05 ` [PATCH v2 10/14] ppc/xive2: Check crowd backlog when scanning group backlog Michael Kowal
2024-12-10  0:05 ` [PATCH v2 10/14] ppc/xive2: Support crowd-matching when looking for target Michael Kowal
2025-03-10  7:31   ` Nicholas Piggin
2024-12-10  0:05 ` [PATCH v2 11/14] pnv/xive: Only support crowd size of 0, 2, 4 and 16 Michael Kowal
2025-03-10  5:15   ` Nicholas Piggin
2024-12-10  0:05 ` [PATCH v2 11/14] ppc/xive2: Check crowd backlog when scanning group backlog Michael Kowal
2025-03-10  7:32   ` Nicholas Piggin
2024-12-10  0:05 ` [PATCH v2 12/14] pnv/xive: Support ESB Escalation Michael Kowal
2025-03-10  8:07   ` Nicholas Piggin
2024-12-10  0:05 ` [PATCH v2 13/14] pnv/xive: Fix problem with treating NVGC as a NVP Michael Kowal
2025-03-10  5:19   ` Nicholas Piggin
2024-12-10  0:05 ` [PATCH v2 14/14] qtest/xive: Add test of pool interrupts Michael Kowal
2025-03-10  8:20   ` Nicholas Piggin
2025-03-11 13:16 ` [PATCH v2 00/14] XIVE2 changes to support Group and Crowd operations Nicholas Piggin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=D8CBABU0FRD1.1X7KHNS0GJUAK@gmail.com \
    --to=npiggin@gmail.com \
    --cc=danielhb413@gmail.com \
    --cc=david@gibson.dropbear.id.au \
    --cc=fbarrat@linux.ibm.com \
    --cc=harshpb@linux.ibm.com \
    --cc=kowal@linux.ibm.com \
    --cc=lvivier@redhat.com \
    --cc=milesg@linux.ibm.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    --cc=thuth@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).