From patchwork Wed Mar 10 04:09:43 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 12126907 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 41978C433E0 for ; Wed, 10 Mar 2021 04:13:30 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id CAFB764FE3 for ; Wed, 10 Mar 2021 04:13:29 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org CAFB764FE3 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:47970 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJqDw-0000be-ON for qemu-devel@archiver.kernel.org; Tue, 09 Mar 2021 23:13:28 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:48102) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAl-0003Tp-FM; Tue, 09 Mar 2021 23:10:13 -0500 Received: from bilbo.ozlabs.org ([203.11.71.1]:56169 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAj-00046u-DP; Tue, 09 Mar 2021 23:10:11 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id 4DwJWd15hVz9sS8; Wed, 10 Mar 2021 15:10:05 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1615349405; bh=Q6YsQnQ2NHBT3n+G/C9i0pub6lxo+cLVM7w8a9XTAsM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KGhojhca97gCNoft/CunYWbI1HFyiO2GvjHwWwMxIe1buWhbOcxS1sLIUJExNZUoN rrU5tDj0Gpja+qQxHlnB3b4tg0yWDzocTgNEzhttqFozcgaGLQi6UKIpUm+LBlvT8E QBRhHjCN7+mJpAlz3THAYHKCDrb4pLT6Balzh1Ok= From: David Gibson To: peter.maydell@linaro.org, groug@kaod.org Subject: [PULL 01/20] hw/display/sm501: Remove dead code for non-32-bit RGB surfaces Date: Wed, 10 Mar 2021 15:09:43 +1100 Message-Id: <20210310041002.333813-2-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210310041002.333813-1-david@gibson.dropbear.id.au> References: <20210310041002.333813-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Received-SPF: pass client-ip=203.11.71.1; envelope-from=dgibson@ozlabs.org; helo=ozlabs.org X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.249, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: David Gibson , qemu-ppc@nongnu.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Peter Maydell For a long time now the UI layer has guaranteed that the console surface is always 32 bits per pixel RGB. Remove the legacy dead code from the sm501 display device which was handling the possibility that the console surface was some other format. Signed-off-by: Peter Maydell Message-Id: <20210212180653.27588-2-peter.maydell@linaro.org> Acked-by: BALATON Zoltan Signed-off-by: David Gibson --- hw/display/sm501.c | 91 +++------------------------------------------- 1 file changed, 6 insertions(+), 85 deletions(-) diff --git a/hw/display/sm501.c b/hw/display/sm501.c index 8966b69bc7..aba447c18b 100644 --- a/hw/display/sm501.c +++ b/hw/display/sm501.c @@ -1558,89 +1558,9 @@ typedef void draw_hwc_line_func(uint8_t *d, const uint8_t *s, int width, const uint8_t *palette, int c_x, int c_y); -#define DEPTH 8 -#include "sm501_template.h" - -#define DEPTH 15 -#include "sm501_template.h" - -#define BGR_FORMAT -#define DEPTH 15 -#include "sm501_template.h" - -#define DEPTH 16 -#include "sm501_template.h" - -#define BGR_FORMAT -#define DEPTH 16 -#include "sm501_template.h" - #define DEPTH 32 #include "sm501_template.h" -#define BGR_FORMAT -#define DEPTH 32 -#include "sm501_template.h" - -static draw_line_func *draw_line8_funcs[] = { - draw_line8_8, - draw_line8_15, - draw_line8_16, - draw_line8_32, - draw_line8_32bgr, - draw_line8_15bgr, - draw_line8_16bgr, -}; - -static draw_line_func *draw_line16_funcs[] = { - draw_line16_8, - draw_line16_15, - draw_line16_16, - draw_line16_32, - draw_line16_32bgr, - draw_line16_15bgr, - draw_line16_16bgr, -}; - -static draw_line_func *draw_line32_funcs[] = { - draw_line32_8, - draw_line32_15, - draw_line32_16, - draw_line32_32, - draw_line32_32bgr, - draw_line32_15bgr, - draw_line32_16bgr, -}; - -static draw_hwc_line_func *draw_hwc_line_funcs[] = { - draw_hwc_line_8, - draw_hwc_line_15, - draw_hwc_line_16, - draw_hwc_line_32, - draw_hwc_line_32bgr, - draw_hwc_line_15bgr, - draw_hwc_line_16bgr, -}; - -static inline int get_depth_index(DisplaySurface *surface) -{ - switch (surface_bits_per_pixel(surface)) { - default: - case 8: - return 0; - case 15: - return 1; - case 16: - return 2; - case 32: - if (is_surface_bgr(surface)) { - return 4; - } else { - return 3; - } - } -} - static void sm501_update_display(void *opaque) { SM501State *s = (SM501State *)opaque; @@ -1652,7 +1572,6 @@ static void sm501_update_display(void *opaque) int height = get_height(s, crt); int src_bpp = get_bpp(s, crt); int dst_bpp = surface_bytes_per_pixel(surface); - int dst_depth_index = get_depth_index(surface); draw_line_func *draw_line = NULL; draw_hwc_line_func *draw_hwc_line = NULL; int full_update = 0; @@ -1662,6 +1581,8 @@ static void sm501_update_display(void *opaque) uint8_t hwc_palette[3 * 3]; uint8_t *hwc_src = NULL; + assert(dst_bpp == 4); /* Output is always 32-bit RGB */ + if (!((crt ? s->dc_crt_control : s->dc_panel_control) & SM501_DC_CRT_CONTROL_ENABLE)) { return; @@ -1674,13 +1595,13 @@ static void sm501_update_display(void *opaque) /* choose draw_line function */ switch (src_bpp) { case 1: - draw_line = draw_line8_funcs[dst_depth_index]; + draw_line = draw_line8_32; break; case 2: - draw_line = draw_line16_funcs[dst_depth_index]; + draw_line = draw_line16_32; break; case 4: - draw_line = draw_line32_funcs[dst_depth_index]; + draw_line = draw_line32_32; break; default: qemu_log_mask(LOG_GUEST_ERROR, "sm501: update display" @@ -1691,7 +1612,7 @@ static void sm501_update_display(void *opaque) /* set up to draw hardware cursor */ if (is_hwc_enabled(s, crt)) { /* choose cursor draw line function */ - draw_hwc_line = draw_hwc_line_funcs[dst_depth_index]; + draw_hwc_line = draw_hwc_line_32; hwc_src = get_hwc_address(s, crt); c_x = get_hwc_x(s, crt); c_y = get_hwc_y(s, crt); From patchwork Wed Mar 10 04:09:44 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 12126915 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3A655C433DB for ; Wed, 10 Mar 2021 04:16:11 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id D2AC864FE7 for ; Wed, 10 Mar 2021 04:16:10 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D2AC864FE7 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:56498 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJqGX-0004Fo-Sf for qemu-devel@archiver.kernel.org; Tue, 09 Mar 2021 23:16:09 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:48100) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAl-0003Tk-Dw; Tue, 09 Mar 2021 23:10:13 -0500 Received: from ozlabs.org ([203.11.71.1]:36845) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAi-000477-Ua; Tue, 09 Mar 2021 23:10:11 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id 4DwJWd21NDz9sWL; Wed, 10 Mar 2021 15:10:05 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1615349405; bh=FoD6B3IN6nlky86cPe2d7zQCD4SjMyjVayDMdmmA0pE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=i0EiVE0POq0EYq/V5+a7FUd4LQ7rwkNvS39pVuz6qCOEJUAvyKHipT+36GU8Nz9nn AbFHxb8da/9dIh6+WPJa4sfY4HEjajybLETi7Zx2xOUZkzUVztTPnaEO1HZcHB5Ywq v7qLKyTrnX09MmvMdYcA2KLfp+mYPDeGbP1UxfhI= From: David Gibson To: peter.maydell@linaro.org, groug@kaod.org Subject: [PULL 02/20] hw/display/sm501: Expand out macros in template header Date: Wed, 10 Mar 2021 15:09:44 +1100 Message-Id: <20210310041002.333813-3-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210310041002.333813-1-david@gibson.dropbear.id.au> References: <20210310041002.333813-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Received-SPF: pass client-ip=203.11.71.1; envelope-from=dgibson@ozlabs.org; helo=ozlabs.org X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.249, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: David Gibson , qemu-ppc@nongnu.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Peter Maydell Now that we only include sm501_template.h for the DEPTH==32 case, we can expand out the uses of the BPP, PIXEL_TYPE and PIXEL_NAME macros in that header. Signed-off-by: Peter Maydell Message-Id: <20210212180653.27588-3-peter.maydell@linaro.org> Acked-by: BALATON Zoltan Signed-off-by: David Gibson --- hw/display/sm501_template.h | 60 +++++++++++-------------------------- 1 file changed, 17 insertions(+), 43 deletions(-) diff --git a/hw/display/sm501_template.h b/hw/display/sm501_template.h index a60abad019..28537a05d9 100644 --- a/hw/display/sm501_template.h +++ b/hw/display/sm501_template.h @@ -22,28 +22,8 @@ * THE SOFTWARE. */ -#if DEPTH == 8 -#define BPP 1 -#define PIXEL_TYPE uint8_t -#elif DEPTH == 15 || DEPTH == 16 -#define BPP 2 -#define PIXEL_TYPE uint16_t -#elif DEPTH == 32 -#define BPP 4 -#define PIXEL_TYPE uint32_t -#else -#error unsupport depth -#endif - -#ifdef BGR_FORMAT -#define PIXEL_NAME glue(DEPTH, bgr) -#else -#define PIXEL_NAME DEPTH -#endif /* BGR_FORMAT */ - - -static void glue(draw_line8_, PIXEL_NAME)( - uint8_t *d, const uint8_t *s, int width, const uint32_t *pal) +static void draw_line8_32(uint8_t *d, const uint8_t *s, int width, + const uint32_t *pal) { uint8_t v, r, g, b; do { @@ -51,14 +31,14 @@ static void glue(draw_line8_, PIXEL_NAME)( r = (pal[v] >> 16) & 0xff; g = (pal[v] >> 8) & 0xff; b = (pal[v] >> 0) & 0xff; - *(PIXEL_TYPE *)d = glue(rgb_to_pixel, PIXEL_NAME)(r, g, b); + *(uint32_t *)d = rgb_to_pixel32(r, g, b); s++; - d += BPP; + d += 4; } while (--width != 0); } -static void glue(draw_line16_, PIXEL_NAME)( - uint8_t *d, const uint8_t *s, int width, const uint32_t *pal) +static void draw_line16_32(uint8_t *d, const uint8_t *s, int width, + const uint32_t *pal) { uint16_t rgb565; uint8_t r, g, b; @@ -68,14 +48,14 @@ static void glue(draw_line16_, PIXEL_NAME)( r = (rgb565 >> 8) & 0xf8; g = (rgb565 >> 3) & 0xfc; b = (rgb565 << 3) & 0xf8; - *(PIXEL_TYPE *)d = glue(rgb_to_pixel, PIXEL_NAME)(r, g, b); + *(uint32_t *)d = rgb_to_pixel32(r, g, b); s += 2; - d += BPP; + d += 4; } while (--width != 0); } -static void glue(draw_line32_, PIXEL_NAME)( - uint8_t *d, const uint8_t *s, int width, const uint32_t *pal) +static void draw_line32_32(uint8_t *d, const uint8_t *s, int width, + const uint32_t *pal) { uint8_t r, g, b; @@ -83,17 +63,17 @@ static void glue(draw_line32_, PIXEL_NAME)( r = s[2]; g = s[1]; b = s[0]; - *(PIXEL_TYPE *)d = glue(rgb_to_pixel, PIXEL_NAME)(r, g, b); + *(uint32_t *)d = rgb_to_pixel32(r, g, b); s += 4; - d += BPP; + d += 4; } while (--width != 0); } /** * Draw hardware cursor image on the given line. */ -static void glue(draw_hwc_line_, PIXEL_NAME)(uint8_t *d, const uint8_t *s, - int width, const uint8_t *palette, int c_x, int c_y) +static void draw_hwc_line_32(uint8_t *d, const uint8_t *s, int width, + const uint8_t *palette, int c_x, int c_y) { int i; uint8_t r, g, b, v, bitset = 0; @@ -101,7 +81,7 @@ static void glue(draw_hwc_line_, PIXEL_NAME)(uint8_t *d, const uint8_t *s, /* get cursor position */ assert(0 <= c_y && c_y < SM501_HWC_HEIGHT); s += SM501_HWC_WIDTH * c_y / 4; /* 4 pixels per byte */ - d += c_x * BPP; + d += c_x * 4; for (i = 0; i < SM501_HWC_WIDTH && c_x + i < width; i++) { /* get pixel value */ @@ -118,14 +98,8 @@ static void glue(draw_hwc_line_, PIXEL_NAME)(uint8_t *d, const uint8_t *s, r = palette[v * 3 + 0]; g = palette[v * 3 + 1]; b = palette[v * 3 + 2]; - *(PIXEL_TYPE *)d = glue(rgb_to_pixel, PIXEL_NAME)(r, g, b); + *(uint32_t *)d = rgb_to_pixel32(r, g, b); } - d += BPP; + d += 4; } } - -#undef DEPTH -#undef BPP -#undef PIXEL_TYPE -#undef PIXEL_NAME -#undef BGR_FORMAT From patchwork Wed Mar 10 04:09:45 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 12126919 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 39B5EC433DB for ; Wed, 10 Mar 2021 04:16:58 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id C4F7064FE3 for ; Wed, 10 Mar 2021 04:16:57 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C4F7064FE3 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:57944 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJqHI-0004vv-Vo for qemu-devel@archiver.kernel.org; Tue, 09 Mar 2021 23:16:57 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:48114) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAn-0003UC-E9; Tue, 09 Mar 2021 23:10:15 -0500 Received: from bilbo.ozlabs.org ([203.11.71.1]:53019 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAk-000479-Bb; Tue, 09 Mar 2021 23:10:12 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id 4DwJWd2bB8z9sWR; Wed, 10 Mar 2021 15:10:05 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1615349405; bh=HP6BC7ZgaqPiHS+GRbApM2a5OYHOkhJ4BhBo3OvB/GQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ViKCR+QB8jJwL648gkhqmescYVZKdsUVfqZddXvvocBWnFQoku8fTJI7dvd2T2hb4 lDWbj0dDfVGGbEjtUZx5+0vZKUs7i+indkrrVxPDq8byaJpI6eP82Rza1S1EaZKxOw rWTW99QCxK3QUjE/G8V5kroprGJTgAD/+7jYzJkY= From: David Gibson To: peter.maydell@linaro.org, groug@kaod.org Subject: [PULL 03/20] hw/display/sm501: Inline template header into C file Date: Wed, 10 Mar 2021 15:09:45 +1100 Message-Id: <20210310041002.333813-4-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210310041002.333813-1-david@gibson.dropbear.id.au> References: <20210310041002.333813-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Received-SPF: pass client-ip=203.11.71.1; envelope-from=dgibson@ozlabs.org; helo=ozlabs.org X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.249, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: David Gibson , qemu-ppc@nongnu.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Peter Maydell We no longer need to include sm501_template.h multiple times, so we can simply inline its contents into sm501.c. Signed-off-by: Peter Maydell Message-Id: <20210212180653.27588-4-peter.maydell@linaro.org> Acked-by: BALATON Zoltan Signed-off-by: David Gibson --- hw/display/sm501.c | 83 +++++++++++++++++++++++++++- hw/display/sm501_template.h | 105 ------------------------------------ 2 files changed, 81 insertions(+), 107 deletions(-) delete mode 100644 hw/display/sm501_template.h diff --git a/hw/display/sm501.c b/hw/display/sm501.c index aba447c18b..8789722ef2 100644 --- a/hw/display/sm501.c +++ b/hw/display/sm501.c @@ -1558,8 +1558,87 @@ typedef void draw_hwc_line_func(uint8_t *d, const uint8_t *s, int width, const uint8_t *palette, int c_x, int c_y); -#define DEPTH 32 -#include "sm501_template.h" +static void draw_line8_32(uint8_t *d, const uint8_t *s, int width, + const uint32_t *pal) +{ + uint8_t v, r, g, b; + do { + v = ldub_p(s); + r = (pal[v] >> 16) & 0xff; + g = (pal[v] >> 8) & 0xff; + b = (pal[v] >> 0) & 0xff; + *(uint32_t *)d = rgb_to_pixel32(r, g, b); + s++; + d += 4; + } while (--width != 0); +} + +static void draw_line16_32(uint8_t *d, const uint8_t *s, int width, + const uint32_t *pal) +{ + uint16_t rgb565; + uint8_t r, g, b; + + do { + rgb565 = lduw_le_p(s); + r = (rgb565 >> 8) & 0xf8; + g = (rgb565 >> 3) & 0xfc; + b = (rgb565 << 3) & 0xf8; + *(uint32_t *)d = rgb_to_pixel32(r, g, b); + s += 2; + d += 4; + } while (--width != 0); +} + +static void draw_line32_32(uint8_t *d, const uint8_t *s, int width, + const uint32_t *pal) +{ + uint8_t r, g, b; + + do { + r = s[2]; + g = s[1]; + b = s[0]; + *(uint32_t *)d = rgb_to_pixel32(r, g, b); + s += 4; + d += 4; + } while (--width != 0); +} + +/** + * Draw hardware cursor image on the given line. + */ +static void draw_hwc_line_32(uint8_t *d, const uint8_t *s, int width, + const uint8_t *palette, int c_x, int c_y) +{ + int i; + uint8_t r, g, b, v, bitset = 0; + + /* get cursor position */ + assert(0 <= c_y && c_y < SM501_HWC_HEIGHT); + s += SM501_HWC_WIDTH * c_y / 4; /* 4 pixels per byte */ + d += c_x * 4; + + for (i = 0; i < SM501_HWC_WIDTH && c_x + i < width; i++) { + /* get pixel value */ + if (i % 4 == 0) { + bitset = ldub_p(s); + s++; + } + v = bitset & 3; + bitset >>= 2; + + /* write pixel */ + if (v) { + v--; + r = palette[v * 3 + 0]; + g = palette[v * 3 + 1]; + b = palette[v * 3 + 2]; + *(uint32_t *)d = rgb_to_pixel32(r, g, b); + } + d += 4; + } +} static void sm501_update_display(void *opaque) { diff --git a/hw/display/sm501_template.h b/hw/display/sm501_template.h deleted file mode 100644 index 28537a05d9..0000000000 --- a/hw/display/sm501_template.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Pixel drawing function templates for QEMU SM501 Device - * - * Copyright (c) 2008 Shin-ichiro KAWASAKI - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -static void draw_line8_32(uint8_t *d, const uint8_t *s, int width, - const uint32_t *pal) -{ - uint8_t v, r, g, b; - do { - v = ldub_p(s); - r = (pal[v] >> 16) & 0xff; - g = (pal[v] >> 8) & 0xff; - b = (pal[v] >> 0) & 0xff; - *(uint32_t *)d = rgb_to_pixel32(r, g, b); - s++; - d += 4; - } while (--width != 0); -} - -static void draw_line16_32(uint8_t *d, const uint8_t *s, int width, - const uint32_t *pal) -{ - uint16_t rgb565; - uint8_t r, g, b; - - do { - rgb565 = lduw_le_p(s); - r = (rgb565 >> 8) & 0xf8; - g = (rgb565 >> 3) & 0xfc; - b = (rgb565 << 3) & 0xf8; - *(uint32_t *)d = rgb_to_pixel32(r, g, b); - s += 2; - d += 4; - } while (--width != 0); -} - -static void draw_line32_32(uint8_t *d, const uint8_t *s, int width, - const uint32_t *pal) -{ - uint8_t r, g, b; - - do { - r = s[2]; - g = s[1]; - b = s[0]; - *(uint32_t *)d = rgb_to_pixel32(r, g, b); - s += 4; - d += 4; - } while (--width != 0); -} - -/** - * Draw hardware cursor image on the given line. - */ -static void draw_hwc_line_32(uint8_t *d, const uint8_t *s, int width, - const uint8_t *palette, int c_x, int c_y) -{ - int i; - uint8_t r, g, b, v, bitset = 0; - - /* get cursor position */ - assert(0 <= c_y && c_y < SM501_HWC_HEIGHT); - s += SM501_HWC_WIDTH * c_y / 4; /* 4 pixels per byte */ - d += c_x * 4; - - for (i = 0; i < SM501_HWC_WIDTH && c_x + i < width; i++) { - /* get pixel value */ - if (i % 4 == 0) { - bitset = ldub_p(s); - s++; - } - v = bitset & 3; - bitset >>= 2; - - /* write pixel */ - if (v) { - v--; - r = palette[v * 3 + 0]; - g = palette[v * 3 + 1]; - b = palette[v * 3 + 2]; - *(uint32_t *)d = rgb_to_pixel32(r, g, b); - } - d += 4; - } -} From patchwork Wed Mar 10 04:09:46 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 12126909 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C21B6C433DB for ; Wed, 10 Mar 2021 04:13:31 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 538E664DA3 for ; Wed, 10 Mar 2021 04:13:31 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 538E664DA3 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:48070 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJqDy-0000e5-6M for qemu-devel@archiver.kernel.org; Tue, 09 Mar 2021 23:13:30 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:48098) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAl-0003Ti-D2; Tue, 09 Mar 2021 23:10:13 -0500 Received: from bilbo.ozlabs.org ([203.11.71.1]:54035 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAi-00047A-QD; Tue, 09 Mar 2021 23:10:10 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id 4DwJWd2yPpz9sWT; Wed, 10 Mar 2021 15:10:05 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1615349405; bh=uxtevDW1LKqCTh9ft/IK1UJZ8brhnol69QHZu/WwkrY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PrV2Vj2rc3mxXqCT1PivFRcQztLbNfH9Mf7t52mb6Mr4FqNdJaxgkAvO4r2qkjTfb te4NHYLJmG2E5iRvh8zw7/lRmXP1I2886x/ZAjoFTO5RclbTpyaEIO9qmKnrPKb9Rq gYsoKCYZfqGPkldUeGXdm9PI6dBy5gvKml2tteY0= From: David Gibson To: peter.maydell@linaro.org, groug@kaod.org Subject: [PULL 04/20] spapr_drc.c: do not call spapr_drc_detach() in drc_isolate_logical() Date: Wed, 10 Mar 2021 15:09:46 +1100 Message-Id: <20210310041002.333813-5-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210310041002.333813-1-david@gibson.dropbear.id.au> References: <20210310041002.333813-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Received-SPF: pass client-ip=203.11.71.1; envelope-from=dgibson@ozlabs.org; helo=ozlabs.org X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.249, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Daniel Henrique Barboza , qemu-ppc@nongnu.org, qemu-devel@nongnu.org, David Gibson Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza drc_isolate_logical() is used to move the DRC from the "Configured" to the "Available" state, erroring out if the DRC is in the unexpected "Unisolate" state and doing nothing (with RTAS_OUT_SUCCESS) if the DRC is already in "Available" or in "Unusable" state. When moving from "Configured" to "Available", the DRC is moved to the LOGICAL_AVAILABLE state, a drc->unplug_requested check is done and, if true, spapr_drc_detach() is called. What spapr_drc_detach() does then is: - set drc->unplug_requested to true. In fact, this is the only place where unplug_request is set to true; - does nothing else if drc->state != drck->empty_state. If the DRC state is equal to drck->empty_state, spapr_drc_release() is called. For logical DRCs, drck->empty_state = LOGICAL_UNUSABLE. In short, calling spapr_drc_detach() in drc_isolate_logical() does nothing. It'll set unplug_request to true again ('again' since it was already true - otherwise the function wouldn't be called), and will return without calling spapr_drc_release() because the DRC is not in LOGICAL_UNUSABLE, since drc_isolate_logical() just moved it to LOGICAL_AVAILABLE. The only place where the logical DRC is released is when called from drc_set_unusable(), when it is moved to the "Unusable" state. As it should, according to PAPR. Even though calling spapr_drc_detach() in drc_isolate_logical() is benign, removing it will avoid further thought about the matter. So let's go ahead and do that. As a note, this logic was introduced in commit bbf5c878ab76. Since then, the DRC handling code was refactored and enhanced, and PAPR itself went through some changes in the DRC area as well. It is expected that some assumptions we had back then are now deprecated. Signed-off-by: Daniel Henrique Barboza Message-Id: <20210211225246.17315-2-danielhb413@gmail.com> Reviewed-by: Greg Kurz Signed-off-by: David Gibson --- hw/ppc/spapr_drc.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c index 8571d5bafe..84bd3c881f 100644 --- a/hw/ppc/spapr_drc.c +++ b/hw/ppc/spapr_drc.c @@ -132,19 +132,6 @@ static uint32_t drc_isolate_logical(SpaprDrc *drc) drc->state = SPAPR_DRC_STATE_LOGICAL_AVAILABLE; - /* if we're awaiting release, but still in an unconfigured state, - * it's likely the guest is still in the process of configuring - * the device and is transitioning the devices to an ISOLATED - * state as a part of that process. so we only complete the - * removal when this transition happens for a device in a - * configured state, as suggested by the state diagram from PAPR+ - * 2.7, 13.4 - */ - if (drc->unplug_requested) { - uint32_t drc_index = spapr_drc_index(drc); - trace_spapr_drc_set_isolation_state_finalizing(drc_index); - spapr_drc_detach(drc); - } return RTAS_OUT_SUCCESS; } From patchwork Wed Mar 10 04:09:47 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 12126921 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-20.3 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, LOTS_OF_MONEY,MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,NORMAL_HTTP_TO_IP, NUMERIC_HTTP_ADDR,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D8D95C433E0 for ; Wed, 10 Mar 2021 04:18:16 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2E9F364FE7 for ; Wed, 10 Mar 2021 04:18:16 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2E9F364FE7 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:34170 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJqIZ-0006qB-3S for qemu-devel@archiver.kernel.org; Tue, 09 Mar 2021 23:18:15 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:48242) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAv-0003YA-6D; Tue, 09 Mar 2021 23:10:22 -0500 Received: from bilbo.ozlabs.org ([203.11.71.1]:36025 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAn-00049j-Ir; Tue, 09 Mar 2021 23:10:19 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id 4DwJWd3K1Bz9sWd; Wed, 10 Mar 2021 15:10:05 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1615349405; bh=gltb/WAulraKQKbJHU2n31ynLrRCz/lSbF/rkDkX3bA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RG5Z0qL/lpwGs7UG1QlwyVdEuFtwPXuAg8Wx6PpzO+tVGgymziZmNrvL+VTHk64m8 9od9q8N4SuLAPlFDIW+Nw5wiK4ryi5cxCWxPF1t21Q/3xHDBCoNta2QjjzoNDLRlmU M7XTMa3fI1iHYS5VW/jQ/FzOqoZMgjMF/cg+ADmg= From: David Gibson To: peter.maydell@linaro.org, groug@kaod.org Subject: [PULL 05/20] pseries: Update SLOF firmware image Date: Wed, 10 Mar 2021 15:09:47 +1100 Message-Id: <20210310041002.333813-6-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210310041002.333813-1-david@gibson.dropbear.id.au> References: <20210310041002.333813-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Received-SPF: pass client-ip=203.11.71.1; envelope-from=dgibson@ozlabs.org; helo=ozlabs.org X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.249, LOTS_OF_MONEY=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Alexey Kardashevskiy , qemu-ppc@nongnu.org, qemu-devel@nongnu.org, David Gibson Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Alexey Kardashevskiy This is mostly compiler warnings fixed but while doing this, a bug in MIN() in tcgbios was found. Alexey Kardashevskiy (14): helpers: Define MIN() libc: Compile with -Wextra elf: Compile with -Wextra usb: Compile with -Wextra veth: Compile with -Wextra virtio: Compile with -Wextra e1000: Compile with -Wextra libnet: Compile with -Wextra libhv: Compile with -Wextra libnvram: Compile with -Wextra libtpm: Compile with -Wextra slof/prim: Compile with -Wextra Makefile: Actually compile with -Wextra version: update to 20210217 Thomas Huth (1): virtio-serial: Remove superfluous serial-* words Signed-off-by: Alexey Kardashevskiy Signed-off-by: David Gibson --- pc-bios/README | 2 +- pc-bios/slof.bin | Bin 968368 -> 968888 bytes roms/SLOF | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pc-bios/README b/pc-bios/README index db7129ef64..c101c9a04f 100644 --- a/pc-bios/README +++ b/pc-bios/README @@ -14,7 +14,7 @@ - SLOF (Slimline Open Firmware) is a free IEEE 1275 Open Firmware implementation for certain IBM POWER hardware. The sources are at https://github.com/aik/SLOF, and the image currently in qemu is - built from git tag qemu-slof-20200717. + built from git tag qemu-slof-20210217. - sgabios (the Serial Graphics Adapter option ROM) provides a means for legacy x86 software to communicate with an attached serial console as diff --git a/pc-bios/slof.bin b/pc-bios/slof.bin index 448dcada367f32130ff6ccc6dcb482dcc3fa853e..3f3918a9e144e12f6e39fab6fc1c9ec9cf9d2898 100644 GIT binary patch delta 227085 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 delta 225144 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 X-Patchwork-Id: 12126923 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9E7CEC433DB for ; Wed, 10 Mar 2021 04:18:47 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 3618864DAE for ; Wed, 10 Mar 2021 04:18:47 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3618864DAE Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:36598 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJqJ4-00085u-BW for qemu-devel@archiver.kernel.org; Tue, 09 Mar 2021 23:18:46 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:48146) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAq-0003V1-MA; Tue, 09 Mar 2021 23:10:17 -0500 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:60343 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAn-00049l-ML; Tue, 09 Mar 2021 23:10:16 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id 4DwJWd4NBrz9sWj; Wed, 10 Mar 2021 15:10:05 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1615349405; bh=bZDeJIV/dSEv3elG+JNS/uxowSW6o9DUHddOb/b6j6M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ExvS3lIXw91MD5foa7X3M+Oy9Eyz7rNQZOAmaArdluf00ZiIoT4QbgCZE8Df7+sDI aSazaZSXuj4rXQjv7hmYbpFXFS1nyxKy1FEIx5PJXo7Zu41K4VCHGOG5RsXmSnbk9H ytn2Dmwi98p7/gy7ykpUClhFqRJjLiUxNoGznPd4= From: David Gibson To: peter.maydell@linaro.org, groug@kaod.org Subject: [PULL 06/20] spapr_drc.c: use spapr_drc_release() in isolate_physical/set_unusable Date: Wed, 10 Mar 2021 15:09:48 +1100 Message-Id: <20210310041002.333813-7-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210310041002.333813-1-david@gibson.dropbear.id.au> References: <20210310041002.333813-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Received-SPF: pass client-ip=2401:3900:2:1::2; envelope-from=dgibson@ozlabs.org; helo=ozlabs.org X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.249, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Daniel Henrique Barboza , qemu-ppc@nongnu.org, qemu-devel@nongnu.org, David Gibson Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza When moving a physical DRC to "Available", drc_isolate_physical() will move the DRC state to STATE_PHYSICAL_POWERON and, if the DRC is marked for unplug, call spapr_drc_detach(). For physical DRCs, drck->empty_state is STATE_PHYSICAL_POWERON, meaning that we're sure that spapr_drc_detach() will end up calling spapr_drc_release() in the end. Likewise, for logical DRCs, drc_set_unusable will move the DRC to "Unusable" state, setting drc->state to STATE_LOGICAL_UNUSABLE, which is the drck->empty_state for logical DRCs. spapr_drc_detach() will call spapr_drc_release() in this case as well. In both scenarios, spapr_drc_detach() is being used as a spapr_drc_release(), wrapper, where we also set unplug_requested (which is already true, otherwise spapr_drc_detach() wouldn't be called in the first place) and check if drc->state == drck->empty_state, which we also know it's guaranteed to be true because we just set it. Just use spapr_drc_release() in these functions to be clear of our intentions in both these functions. Reviewed-by: Greg Kurz Reviewed-by: David Gibson Signed-off-by: Daniel Henrique Barboza Message-Id: <20210222194531.62717-2-danielhb413@gmail.com> Signed-off-by: David Gibson --- hw/ppc/spapr_drc.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c index 84bd3c881f..555a25517d 100644 --- a/hw/ppc/spapr_drc.c +++ b/hw/ppc/spapr_drc.c @@ -50,6 +50,20 @@ uint32_t spapr_drc_index(SpaprDrc *drc) | (drc->id & DRC_INDEX_ID_MASK); } +static void spapr_drc_release(SpaprDrc *drc) +{ + SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); + + drck->release(drc->dev); + + drc->unplug_requested = false; + g_free(drc->fdt); + drc->fdt = NULL; + drc->fdt_start_offset = 0; + object_property_del(OBJECT(drc), "device"); + drc->dev = NULL; +} + static uint32_t drc_isolate_physical(SpaprDrc *drc) { switch (drc->state) { @@ -68,7 +82,7 @@ static uint32_t drc_isolate_physical(SpaprDrc *drc) if (drc->unplug_requested) { uint32_t drc_index = spapr_drc_index(drc); trace_spapr_drc_set_isolation_state_finalizing(drc_index); - spapr_drc_detach(drc); + spapr_drc_release(drc); } return RTAS_OUT_SUCCESS; @@ -209,7 +223,7 @@ static uint32_t drc_set_unusable(SpaprDrc *drc) if (drc->unplug_requested) { uint32_t drc_index = spapr_drc_index(drc); trace_spapr_drc_set_allocation_state_finalizing(drc_index); - spapr_drc_detach(drc); + spapr_drc_release(drc); } return RTAS_OUT_SUCCESS; @@ -372,20 +386,6 @@ void spapr_drc_attach(SpaprDrc *drc, DeviceState *d) NULL, 0); } -static void spapr_drc_release(SpaprDrc *drc) -{ - SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); - - drck->release(drc->dev); - - drc->unplug_requested = false; - g_free(drc->fdt); - drc->fdt = NULL; - drc->fdt_start_offset = 0; - object_property_del(OBJECT(drc), "device"); - drc->dev = NULL; -} - void spapr_drc_detach(SpaprDrc *drc) { SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); From patchwork Wed Mar 10 04:09:49 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 12126911 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 281DBC433E0 for ; Wed, 10 Mar 2021 04:14:21 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A694E64DA3 for ; Wed, 10 Mar 2021 04:14:20 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A694E64DA3 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:50482 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJqEl-0001d7-N8 for qemu-devel@archiver.kernel.org; Tue, 09 Mar 2021 23:14:19 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:48200) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAt-0003XN-MQ; Tue, 09 Mar 2021 23:10:19 -0500 Received: from ozlabs.org ([2401:3900:2:1::2]:46873) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAp-0004AK-GU; Tue, 09 Mar 2021 23:10:19 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id 4DwJWd4llSz9sWk; Wed, 10 Mar 2021 15:10:05 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1615349405; bh=qGRtth8AG1yIZEl7POTTF1M9jfJA3TCZ89tWJmhyp/k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=l2AgfdWZypufFM60p510D22xnZlKePQ3XnUyIYhARc97AJN0jK/06Z0ojfWGn6vJ4 b+yD4CYry/lfv6EiUL6mTqTLI64BQaM7s5/vIY1LkHdMtSWXIVWdHZkI/7omyh3Lih rVjYRqIr5rKCKI7047CWwlzG97Y8d+JYYu3agHMA= From: David Gibson To: peter.maydell@linaro.org, groug@kaod.org Subject: [PULL 07/20] spapr: rename spapr_drc_detach() to spapr_drc_unplug_request() Date: Wed, 10 Mar 2021 15:09:49 +1100 Message-Id: <20210310041002.333813-8-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210310041002.333813-1-david@gibson.dropbear.id.au> References: <20210310041002.333813-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Received-SPF: pass client-ip=2401:3900:2:1::2; envelope-from=dgibson@ozlabs.org; helo=ozlabs.org X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.249, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Daniel Henrique Barboza , qemu-ppc@nongnu.org, qemu-devel@nongnu.org, David Gibson Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza spapr_drc_detach() is not the best name for what the function does. The function does not detach the DRC, it makes an uncommited attempt to do it. It'll mark the DRC as pending unplug, via the 'unplug_request' flag, and only if the DRC state is drck->empty_state it will detach the DRC, via spapr_drc_release(). This is a contrast with its pair spapr_drc_attach(), where the function is indeed creating the DRC QOM object. If you know what spapr_drc_attach() does, you can be misled into thinking that spapr_drc_detach() is removing the DRC from QEMU internal state, which isn't true. The current role of this function is better described as a request for detach, since there's no guarantee that we're going to detach the DRC in the end. Rename the function to spapr_drc_unplug_request to reflect what is is doing. The initial idea was to change the name to spapr_drc_detach_request(), and later on change the unplug_request flag to detach_request. However, unplug_request is a migratable boolean for a long time now and renaming it is not worth the trouble. spapr_drc_unplug_request() setting drc->unplug_request is more natural than spapr_drc_detach_request setting drc->unplug_request. Reviewed-by: Greg Kurz Reviewed-by: David Gibson Signed-off-by: Daniel Henrique Barboza Message-Id: <20210222194531.62717-3-danielhb413@gmail.com> Signed-off-by: David Gibson --- hw/ppc/spapr.c | 6 +++--- hw/ppc/spapr_drc.c | 4 ++-- hw/ppc/spapr_pci.c | 4 ++-- hw/ppc/trace-events | 2 +- include/hw/ppc/spapr_drc.h | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 85fe65f894..b066df68cb 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -3654,7 +3654,7 @@ static void spapr_memory_unplug_request(HotplugHandler *hotplug_dev, addr / SPAPR_MEMORY_BLOCK_SIZE); g_assert(drc); - spapr_drc_detach(drc); + spapr_drc_unplug_request(drc); addr += SPAPR_MEMORY_BLOCK_SIZE; } @@ -3722,7 +3722,7 @@ void spapr_core_unplug_request(HotplugHandler *hotplug_dev, DeviceState *dev, g_assert(drc); if (!spapr_drc_unplug_requested(drc)) { - spapr_drc_detach(drc); + spapr_drc_unplug_request(drc); spapr_hotplug_req_remove_by_index(drc); } } @@ -3985,7 +3985,7 @@ static void spapr_phb_unplug_request(HotplugHandler *hotplug_dev, assert(drc); if (!spapr_drc_unplug_requested(drc)) { - spapr_drc_detach(drc); + spapr_drc_unplug_request(drc); spapr_hotplug_req_remove_by_index(drc); } } diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c index 555a25517d..67041fb212 100644 --- a/hw/ppc/spapr_drc.c +++ b/hw/ppc/spapr_drc.c @@ -386,11 +386,11 @@ void spapr_drc_attach(SpaprDrc *drc, DeviceState *d) NULL, 0); } -void spapr_drc_detach(SpaprDrc *drc) +void spapr_drc_unplug_request(SpaprDrc *drc) { SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); - trace_spapr_drc_detach(spapr_drc_index(drc)); + trace_spapr_drc_unplug_request(spapr_drc_index(drc)); g_assert(drc->dev); diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c index f1c7479816..b00e9609ae 100644 --- a/hw/ppc/spapr_pci.c +++ b/hw/ppc/spapr_pci.c @@ -1723,12 +1723,12 @@ static void spapr_pci_unplug_request(HotplugHandler *plug_handler, * functions, even if their unplug weren't requested * beforehand. */ - spapr_drc_detach(func_drc); + spapr_drc_unplug_request(func_drc); } } } - spapr_drc_detach(drc); + spapr_drc_unplug_request(drc); /* if this isn't func 0, defer unplug event. otherwise signal removal * for all present functions diff --git a/hw/ppc/trace-events b/hw/ppc/trace-events index 1e91984526..b4bbfbb013 100644 --- a/hw/ppc/trace-events +++ b/hw/ppc/trace-events @@ -50,7 +50,7 @@ spapr_drc_set_allocation_state(uint32_t index, int state) "drc: 0x%"PRIx32", sta spapr_drc_set_allocation_state_finalizing(uint32_t index) "drc: 0x%"PRIx32 spapr_drc_set_configured(uint32_t index) "drc: 0x%"PRIx32 spapr_drc_attach(uint32_t index) "drc: 0x%"PRIx32 -spapr_drc_detach(uint32_t index) "drc: 0x%"PRIx32 +spapr_drc_unplug_request(uint32_t index) "drc: 0x%"PRIx32 spapr_drc_awaiting_quiesce(uint32_t index) "drc: 0x%"PRIx32 spapr_drc_reset(uint32_t index) "drc: 0x%"PRIx32 spapr_drc_realize(uint32_t index) "drc: 0x%"PRIx32 diff --git a/include/hw/ppc/spapr_drc.h b/include/hw/ppc/spapr_drc.h index 8982927d5c..02a63b3666 100644 --- a/include/hw/ppc/spapr_drc.h +++ b/include/hw/ppc/spapr_drc.h @@ -243,7 +243,7 @@ int spapr_dt_drc(void *fdt, int offset, Object *owner, uint32_t drc_type_mask); * beforehand (eg. check drc->dev at pre-plug). */ void spapr_drc_attach(SpaprDrc *drc, DeviceState *d); -void spapr_drc_detach(SpaprDrc *drc); +void spapr_drc_unplug_request(SpaprDrc *drc); /* * Reset all DRCs, causing pending hot-plug/unplug requests to complete. From patchwork Wed Mar 10 04:09:50 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 12126931 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-21.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id BCC42C433DB for ; Wed, 10 Mar 2021 04:20:49 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 4F2C064FE8 for ; Wed, 10 Mar 2021 04:20:49 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4F2C064FE8 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:44626 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJqL2-00031U-Df for qemu-devel@archiver.kernel.org; Tue, 09 Mar 2021 23:20:48 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:48246) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAv-0003YD-6c; Tue, 09 Mar 2021 23:10:22 -0500 Received: from bilbo.ozlabs.org ([203.11.71.1]:37053 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAp-0004AE-I7; Tue, 09 Mar 2021 23:10:20 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id 4DwJWd55ZDz9sWl; Wed, 10 Mar 2021 15:10:05 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1615349405; bh=eQUX6ay0aol2kTGvcnnrcbxBcIo1BZ2oHa9zhrP+hP0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=flb1dwiJXjSf15kx2YodxbGiGFJFxxB6T0SCNrPHdwu2CcCHHSOrq03Cbc9PUFnz/ M1OqbD6rZtVDu9aPMLW3GjKzla6A/hwTITNmFWaOXFZ2BAaGhic6DluBsHpHGHOzVV AwZYsDGVNyzAeG9BhaFl4QKrFnxM52oK01ZlXqig= From: David Gibson To: peter.maydell@linaro.org, groug@kaod.org Subject: [PULL 08/20] docs/system: Extend PPC section Date: Wed, 10 Mar 2021 15:09:50 +1100 Message-Id: <20210310041002.333813-9-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210310041002.333813-1-david@gibson.dropbear.id.au> References: <20210310041002.333813-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Received-SPF: pass client-ip=203.11.71.1; envelope-from=dgibson@ozlabs.org; helo=ozlabs.org X-Spam_score_int: 2 X-Spam_score: 0.2 X-Spam_bar: / X-Spam_report: (0.2 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.249, PDS_OTHER_BAD_TLD=1.999, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: David Gibson , qemu-ppc@nongnu.org, qemu-devel@nongnu.org, =?utf-8?q?C=C3=A9dric_Le_Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Cédric Le Goater This moves the current documentation in files specific to each platform family. PowerNV machine is updated, the other machines need to be done. Signed-off-by: Cédric Le Goater Message-Id: <20210222133956.156001-1-clg@kaod.org> Reviewed-by: Greg Kurz [dwg: Trivial capitalization fix] Signed-off-by: David Gibson --- docs/system/ppc/embedded.rst | 10 ++ docs/system/ppc/powermac.rst | 34 ++++++ docs/system/ppc/powernv.rst | 193 +++++++++++++++++++++++++++++++++++ docs/system/ppc/prep.rst | 18 ++++ docs/system/ppc/pseries.rst | 12 +++ docs/system/target-ppc.rst | 53 +++------- 6 files changed, 282 insertions(+), 38 deletions(-) create mode 100644 docs/system/ppc/embedded.rst create mode 100644 docs/system/ppc/powermac.rst create mode 100644 docs/system/ppc/powernv.rst create mode 100644 docs/system/ppc/prep.rst create mode 100644 docs/system/ppc/pseries.rst diff --git a/docs/system/ppc/embedded.rst b/docs/system/ppc/embedded.rst new file mode 100644 index 0000000000..cfffbda24d --- /dev/null +++ b/docs/system/ppc/embedded.rst @@ -0,0 +1,10 @@ +Embedded family boards +====================== + +- ``bamboo`` bamboo +- ``mpc8544ds`` mpc8544ds +- ``ppce500`` generic paravirt e500 platform +- ``ref405ep`` ref405ep +- ``sam460ex`` aCube Sam460ex +- ``taihu`` taihu +- ``virtex-ml507`` Xilinx Virtex ML507 reference design diff --git a/docs/system/ppc/powermac.rst b/docs/system/ppc/powermac.rst new file mode 100644 index 0000000000..04334ba210 --- /dev/null +++ b/docs/system/ppc/powermac.rst @@ -0,0 +1,34 @@ +PowerMac family boards (``g3beige``, ``mac99``) +================================================================== + +Use the executable ``qemu-system-ppc`` to simulate a complete PowerMac +PowerPC system. + +- ``g3beige`` Heathrow based PowerMAC +- ``mac99`` Mac99 based PowerMAC + +Supported devices +----------------- + +QEMU emulates the following PowerMac peripherals: + + * UniNorth or Grackle PCI Bridge + * PCI VGA compatible card with VESA Bochs Extensions + * 2 PMAC IDE interfaces with hard disk and CD-ROM support + * NE2000 PCI adapters + * Non Volatile RAM + * VIA-CUDA with ADB keyboard and mouse. + + +Missing devices +--------------- + + * To be identified + +Firmware +-------- + +Since version 0.9.1, QEMU uses OpenBIOS https://www.openbios.org/ for +the g3beige and mac99 PowerMac and the 40p machines. OpenBIOS is a free +(GPL v2) portable firmware implementation. The goal is to implement a +100% IEEE 1275-1994 (referred to as Open Firmware) compliant firmware. diff --git a/docs/system/ppc/powernv.rst b/docs/system/ppc/powernv.rst new file mode 100644 index 0000000000..43c58bc32e --- /dev/null +++ b/docs/system/ppc/powernv.rst @@ -0,0 +1,193 @@ +PowerNV family boards (``powernv8``, ``powernv9``) +================================================================== + +PowerNV (as Non-Virtualized) is the "baremetal" platform using the +OPAL firmware. It runs Linux on IBM and OpenPOWER systems and it can +be used as an hypervisor OS, running KVM guests, or simply as a host +OS. + +The PowerNV QEMU machine tries to emulate a PowerNV system at the +level of the skiboot firmware, which loads the OS and provides some +runtime services. Power Systems have a lower firmware (HostBoot) that +does low level system initialization, like DRAM training. This is +beyond the scope of what QEMU addresses today. + +Supported devices +----------------- + + * Multi processor support for POWER8, POWER8NVL and POWER9. + * XSCOM, serial communication sideband bus to configure chiplets + * Simple LPC Controller + * Processor Service Interface (PSI) Controller + * Interrupt Controller, XICS (POWER8) and XIVE (POWER9) + * POWER8 PHB3 PCIe Host bridge and POWER9 PHB4 PCIe Host bridge + * Simple OCC is an on-chip microcontroller used for power management + tasks + * iBT device to handle BMC communication, with the internal BMC + simulator provided by QEMU or an external BMC such as an Aspeed + QEMU machine. + * PNOR containing the different firmware partitions. + +Missing devices +--------------- + +A lot is missing, among which : + + * POWER10 processor + * XIVE2 (POWER10) interrupt controller + * I2C controllers (yet to be merged) + * NPU/NPU2/NPU3 controllers + * EEH support for PCIe Host bridge controllers + * NX controller + * VAS controller + * chipTOD (Time Of Day) + * Self Boot Engine (SBE). + * FSI bus + +Firmware +-------- + +The OPAL firmware (OpenPower Abstraction Layer) for OpenPower systems +includes the runtime services `skiboot` and the bootloader kernel and +initramfs `skiroot`. Source code can be found on GitHub: + + https://github.com/open-power. + +Prebuilt images of `skiboot` and `skiboot` are made available on the `OpenPOWER `__ site. To boot a POWER9 machine, use the `witherspoon `__ images. For POWER8, use +the `palmetto `__ images. + +QEMU includes a prebuilt image of `skiboot` which is updated when a +more recent version is required by the models. + +Boot options +------------ + +Here is a simple setup with one e1000e NIC : + +.. code-block:: bash + + $ qemu-system-ppc64 -m 2G -machine powernv9 -smp 2,cores=2,threads=1 \ + -accel tcg,thread=single \ + -device e1000e,netdev=net0,mac=C0:FF:EE:00:00:02,bus=pcie.0,addr=0x0 \ + -netdev user,id=net0,hostfwd=::20022-:22,hostname=pnv \ + -kernel ./zImage.epapr \ + -initrd ./rootfs.cpio.xz \ + -nographic + +and a SATA disk : + +.. code-block:: bash + + -device ich9-ahci,id=sata0,bus=pcie.1,addr=0x0 \ + -drive file=./ubuntu-ppc64le.qcow2,if=none,id=drive0,format=qcow2,cache=none \ + -device ide-hd,bus=sata0.0,unit=0,drive=drive0,id=ide,bootindex=1 \ + +Complex PCIe configuration +~~~~~~~~~~~~~~~~~~~~~~~~~~ +Six PHBs are defined per chip (POWER9) but no default PCI layout is +provided (to be compatible with libvirt). One PCI device can be added +on any of the available PCIe slots using command line options such as: + +.. code-block:: bash + + -device e1000e,netdev=net0,mac=C0:FF:EE:00:00:02,bus=pcie.0,addr=0x0 + -netdev bridge,id=net0,helper=/usr/libexec/qemu-bridge-helper,br=virbr0,id=hostnet0 + + -device megasas,id=scsi0,bus=pcie.0,addr=0x0 + -drive file=./ubuntu-ppc64le.qcow2,if=none,id=drive-scsi0-0-0-0,format=qcow2,cache=none + -device scsi-hd,bus=scsi0.0,channel=0,scsi-id=0,lun=0,drive=drive-scsi0-0-0-0,id=scsi0-0-0-0,bootindex=2 + +Here is a full example with two different storage controllers on +different PHBs, each with a disk, the second PHB is empty : + +.. code-block:: bash + + $ qemu-system-ppc64 -m 2G -machine powernv9 -smp 2,cores=2,threads=1 -accel tcg,thread=single \ + -kernel ./zImage.epapr -initrd ./rootfs.cpio.xz -bios ./skiboot.lid \ + \ + -device megasas,id=scsi0,bus=pcie.0,addr=0x0 \ + -drive file=./rhel7-ppc64le.qcow2,if=none,id=drive-scsi0-0-0-0,format=qcow2,cache=none \ + -device scsi-hd,bus=scsi0.0,channel=0,scsi-id=0,lun=0,drive=drive-scsi0-0-0-0,id=scsi0-0-0-0,bootindex=2 \ + \ + -device pcie-pci-bridge,id=bridge1,bus=pcie.1,addr=0x0 \ + \ + -device ich9-ahci,id=sata0,bus=bridge1,addr=0x1 \ + -drive file=./ubuntu-ppc64le.qcow2,if=none,id=drive0,format=qcow2,cache=none \ + -device ide-hd,bus=sata0.0,unit=0,drive=drive0,id=ide,bootindex=1 \ + -device e1000e,netdev=net0,mac=C0:FF:EE:00:00:02,bus=bridge1,addr=0x2 \ + -netdev bridge,helper=/usr/libexec/qemu-bridge-helper,br=virbr0,id=net0 \ + -device nec-usb-xhci,bus=bridge1,addr=0x7 \ + \ + -serial mon:stdio -nographic + +You can also use VIRTIO devices : + +.. code-block:: bash + + -drive file=./fedora-ppc64le.qcow2,if=none,snapshot=on,id=drive0 \ + -device virtio-blk-pci,drive=drive0,id=blk0,bus=pcie.0 \ + \ + -netdev tap,helper=/usr/lib/qemu/qemu-bridge-helper,br=virbr0,id=netdev0 \ + -device virtio-net-pci,netdev=netdev0,id=net0,bus=pcie.1 \ + \ + -fsdev local,id=fsdev0,path=$HOME,security_model=passthrough \ + -device virtio-9p-pci,fsdev=fsdev0,mount_tag=host,bus=pcie.2 + +Multi sockets +~~~~~~~~~~~~~ + +The number of sockets is deduced from the number of CPUs and the +number of cores. ``-smp 2,cores=1`` will define a machine with 2 +sockets of 1 core, whereas ``-smp 2,cores=2`` will define a machine +with 1 socket of 2 cores. ``-smp 8,cores=2``, 4 sockets of 2 cores. + +BMC configuration +~~~~~~~~~~~~~~~~~ + +OpenPOWER systems negotiate the shutdown and reboot with their +BMC. The QEMU PowerNV machine embeds an IPMI BMC simulator using the +iBT interface and should offer the same power features. + +If you want to define your own BMC, use ``-nodefaults`` and specify +one on the command line : + +.. code-block:: bash + + -device ipmi-bmc-sim,id=bmc0 -device isa-ipmi-bt,bmc=bmc0,irq=10 + +The files `palmetto-SDR.bin `__ +and `palmetto-FRU.bin `__ +define a Sensor Data Record repository and a Field Replaceable Unit +inventory for a palmetto BMC. They can be used to extend the QEMU BMC +simulator. + +.. code-block:: bash + + -device ipmi-bmc-sim,sdrfile=./palmetto-SDR.bin,fruareasize=256,frudatafile=./palmetto-FRU.bin,id=bmc0 \ + -device isa-ipmi-bt,bmc=bmc0,irq=10 + +The PowerNV machine can also be run with an external IPMI BMC device +connected to a remote QEMU machine acting as BMC, using these options +: + +.. code-block:: bash + + -chardev socket,id=ipmi0,host=localhost,port=9002,reconnect=10 \ + -device ipmi-bmc-extern,id=bmc0,chardev=ipmi0 \ + -device isa-ipmi-bt,bmc=bmc0,irq=10 \ + -nodefaults + +NVRAM +~~~~~ + +Use a MTD drive to add a PNOR to the machine, and get a NVRAM : + +.. code-block:: bash + + -drive file=./witherspoon.pnor,format=raw,if=mtd + +CAVEATS +------- + + * No support for multiple HW threads (SMT=1). Same as pseries. + * CPU can hang when doing intensive I/Os. Use ``-append powersave=off`` in that case. diff --git a/docs/system/ppc/prep.rst b/docs/system/ppc/prep.rst new file mode 100644 index 0000000000..bd9eb8eabd --- /dev/null +++ b/docs/system/ppc/prep.rst @@ -0,0 +1,18 @@ +Prep machine (``40p``) +================================================================== + +Use the executable ``qemu-system-ppc`` to simulate a complete 40P (PREP) + +Supported devices +----------------- + +QEMU emulates the following 40P (PREP) peripherals: + + * PCI Bridge + * PCI VGA compatible card with VESA Bochs Extensions + * 2 IDE interfaces with hard disk and CD-ROM support + * Floppy disk + * PCnet network adapters + * Serial port + * PREP Non Volatile RAM + * PC compatible keyboard and mouse. diff --git a/docs/system/ppc/pseries.rst b/docs/system/ppc/pseries.rst new file mode 100644 index 0000000000..932d4dd17d --- /dev/null +++ b/docs/system/ppc/pseries.rst @@ -0,0 +1,12 @@ +pSeries family boards (``pseries``) +=================================== + +Supported devices +----------------- + +Missing devices +--------------- + + +Firmware +-------- diff --git a/docs/system/target-ppc.rst b/docs/system/target-ppc.rst index a2f04c533c..67905b8f2a 100644 --- a/docs/system/target-ppc.rst +++ b/docs/system/target-ppc.rst @@ -3,45 +3,22 @@ PowerPC System emulator ----------------------- -Use the executable ``qemu-system-ppc`` to simulate a complete 40P (PREP) -or PowerMac PowerPC system. +Board-specific documentation +============================ -QEMU emulates the following PowerMac peripherals: +You can get a complete list by running ``qemu-system-ppc64 --machine +help``. -- UniNorth or Grackle PCI Bridge +.. + This table of contents should be kept sorted alphabetically + by the title text of each file, which isn't the same ordering + as an alphabetical sort by filename. -- PCI VGA compatible card with VESA Bochs Extensions +.. toctree:: + :maxdepth: 1 -- 2 PMAC IDE interfaces with hard disk and CD-ROM support - -- NE2000 PCI adapters - -- Non Volatile RAM - -- VIA-CUDA with ADB keyboard and mouse. - -QEMU emulates the following 40P (PREP) peripherals: - -- PCI Bridge - -- PCI VGA compatible card with VESA Bochs Extensions - -- 2 IDE interfaces with hard disk and CD-ROM support - -- Floppy disk - -- PCnet network adapters - -- Serial port - -- PREP Non Volatile RAM - -- PC compatible keyboard and mouse. - -Since version 0.9.1, QEMU uses OpenBIOS https://www.openbios.org/ for -the g3beige and mac99 PowerMac and the 40p machines. OpenBIOS is a free -(GPL v2) portable firmware implementation. The goal is to implement a -100% IEEE 1275-1994 (referred to as Open Firmware) compliant firmware. - -More information is available at -http://perso.magic.fr/l_indien/qemu-ppc/. + ppc/embedded + ppc/powermac + ppc/powernv + ppc/prep + ppc/pseries From patchwork Wed Mar 10 04:09:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 12126905 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 91FE2C433DB for ; Wed, 10 Mar 2021 04:12:40 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 1DA8264FE3 for ; Wed, 10 Mar 2021 04:12:40 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1DA8264FE3 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:43754 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJqD8-00073l-UT for qemu-devel@archiver.kernel.org; Tue, 09 Mar 2021 23:12:38 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:48168) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAs-0003Wo-9o; Tue, 09 Mar 2021 23:10:19 -0500 Received: from bilbo.ozlabs.org ([203.11.71.1]:52309 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAp-0004AI-GY; Tue, 09 Mar 2021 23:10:18 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id 4DwJWd5WJZz9sWm; Wed, 10 Mar 2021 15:10:05 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1615349405; bh=Yx8ESnsJE3vs1w3ajs3bxZmdzxPCWN7CoE8nMMMBGJg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ovIgFI+cHFOIlxA6ejTwf1kUzupByRUhPmKAS0/x1QbPhRyyhob59vUmp+CjX8rQ1 K6Ov4+Qo3NfQ3XzkaL5zAeOMCPhOGscdPXgZ2653jjqpIbvftoMJs4KyLy8kL3PWiS CYyi14x4hR0ZZvEBsk1OZzN8P/IiZlwNTxHuDl2k= From: David Gibson To: peter.maydell@linaro.org, groug@kaod.org Subject: [PULL 09/20] target/ppc: Fix bcdsub. emulation when result overflows Date: Wed, 10 Mar 2021 15:09:51 +1100 Message-Id: <20210310041002.333813-10-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210310041002.333813-1-david@gibson.dropbear.id.au> References: <20210310041002.333813-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Received-SPF: pass client-ip=203.11.71.1; envelope-from=dgibson@ozlabs.org; helo=ozlabs.org X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.249, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paul Clarke , David Gibson , qemu-ppc@nongnu.org, qemu-devel@nongnu.org, Fabiano Rosas Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Fabiano Rosas The commit d03b174a83 (target/ppc: simplify bcdadd/sub functions) meant to simplify some of the code but it inadvertently altered the way the CR6 field is set after the operation has overflowed. The CR6 bits are set based on the *unbounded* result of the operation, so we need to look at the result before returning from bcd_add_mag, otherwise we will look at 0 when it overflows. Consider the following subtraction: v0 = 0x9999999999999999999999999999999c (maximum positive BCD value) v1 = 0x0000000000000000000000000000001d (negative one BCD value) bcdsub. v0,v0,v1,0 The Power ISA 2.07B says: If the unbounded result is greater than zero, do the following. If PS=0, the sign code of the result is set to 0b1100. If PS=1, the sign code of the result is set to 0b1111. If the operation overflows, CR field 6 is set to 0b0101. Otherwise, CR field 6 is set to 0b0100. POWER9 hardware: vr0 = 0x0000000000000000000000000000000c (positive zero BCD value) cr6 = 0b0101 (0x5) (positive, overflow) QEMU: vr0 = 0x0000000000000000000000000000000c (positive zero BCD value) cr6 = 0b0011 (0x3) (zero, overflow) <--- wrong This patch reverts the part of d03b174a83 that introduced the problem and adds a test-case to avoid further regressions: before: $ make run-tcg-tests-ppc64le-linux-user (...) TEST bcdsub on ppc64le bcdsub: qemu/tests/tcg/ppc64le/bcdsub.c:58: test_bcdsub_gt: Assertion `(cr >> 4) == ((1 << 2) | (1 << 0))' failed. Fixes: d03b174a83 (target/ppc: simplify bcdadd/sub functions) Reported-by: Paul Clarke Signed-off-by: Fabiano Rosas Message-Id: <20210222194035.2723056-1-farosas@linux.ibm.com> Signed-off-by: David Gibson --- target/ppc/int_helper.c | 13 ++- tests/tcg/configure.sh | 6 ++ tests/tcg/ppc64/Makefile.target | 13 +++ tests/tcg/ppc64le/Makefile.target | 12 +++ tests/tcg/ppc64le/bcdsub.c | 130 ++++++++++++++++++++++++++++++ 5 files changed, 171 insertions(+), 3 deletions(-) create mode 100644 tests/tcg/ppc64/Makefile.target create mode 100644 tests/tcg/ppc64le/Makefile.target create mode 100644 tests/tcg/ppc64le/bcdsub.c diff --git a/target/ppc/int_helper.c b/target/ppc/int_helper.c index 0b682a1f94..429de28494 100644 --- a/target/ppc/int_helper.c +++ b/target/ppc/int_helper.c @@ -2175,14 +2175,17 @@ static int bcd_cmp_mag(ppc_avr_t *a, ppc_avr_t *b) return 0; } -static void bcd_add_mag(ppc_avr_t *t, ppc_avr_t *a, ppc_avr_t *b, int *invalid, +static int bcd_add_mag(ppc_avr_t *t, ppc_avr_t *a, ppc_avr_t *b, int *invalid, int *overflow) { int carry = 0; int i; + int is_zero = 1; + for (i = 1; i <= 31; i++) { uint8_t digit = bcd_get_digit(a, i, invalid) + bcd_get_digit(b, i, invalid) + carry; + is_zero &= (digit == 0); if (digit > 9) { carry = 1; digit -= 10; @@ -2194,6 +2197,7 @@ static void bcd_add_mag(ppc_avr_t *t, ppc_avr_t *a, ppc_avr_t *b, int *invalid, } *overflow = carry; + return is_zero; } static void bcd_sub_mag(ppc_avr_t *t, ppc_avr_t *a, ppc_avr_t *b, int *invalid, @@ -2225,14 +2229,15 @@ uint32_t helper_bcdadd(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, uint32_t ps) int sgnb = bcd_get_sgn(b); int invalid = (sgna == 0) || (sgnb == 0); int overflow = 0; + int zero = 0; uint32_t cr = 0; ppc_avr_t result = { .u64 = { 0, 0 } }; if (!invalid) { if (sgna == sgnb) { result.VsrB(BCD_DIG_BYTE(0)) = bcd_preferred_sgn(sgna, ps); - bcd_add_mag(&result, a, b, &invalid, &overflow); - cr = bcd_cmp_zero(&result); + zero = bcd_add_mag(&result, a, b, &invalid, &overflow); + cr = (sgna > 0) ? CRF_GT : CRF_LT; } else { int magnitude = bcd_cmp_mag(a, b); if (magnitude > 0) { @@ -2255,6 +2260,8 @@ uint32_t helper_bcdadd(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, uint32_t ps) cr = CRF_SO; } else if (overflow) { cr |= CRF_SO; + } else if (zero) { + cr |= CRF_EQ; } *r = result; diff --git a/tests/tcg/configure.sh b/tests/tcg/configure.sh index 36b8a73a54..ce304f4933 100755 --- a/tests/tcg/configure.sh +++ b/tests/tcg/configure.sh @@ -251,6 +251,12 @@ for target in $target_list; do echo "CROSS_CC_HAS_ARMV8_MTE=y" >> $config_target_mak fi ;; + ppc*) + if do_compiler "$target_compiler" $target_compiler_cflags \ + -mpower8-vector -o $TMPE $TMPC; then + echo "CROSS_CC_HAS_POWER8_VECTOR=y" >> $config_target_mak + fi + ;; esac enabled_cross_compilers="$enabled_cross_compilers $target_compiler" diff --git a/tests/tcg/ppc64/Makefile.target b/tests/tcg/ppc64/Makefile.target new file mode 100644 index 0000000000..0c6a4585fc --- /dev/null +++ b/tests/tcg/ppc64/Makefile.target @@ -0,0 +1,13 @@ +# -*- Mode: makefile -*- +# +# ppc64 specific tweaks + +VPATH += $(SRC_PATH)/tests/tcg/ppc64 +VPATH += $(SRC_PATH)/tests/tcg/ppc64le + +ifneq ($(DOCKER_IMAGE)$(CROSS_CC_HAS_POWER8_VECTOR),) +PPC64_TESTS=bcdsub +endif +bcdsub: CFLAGS += -mpower8-vector + +TESTS += $(PPC64_TESTS) diff --git a/tests/tcg/ppc64le/Makefile.target b/tests/tcg/ppc64le/Makefile.target new file mode 100644 index 0000000000..1acfcff94a --- /dev/null +++ b/tests/tcg/ppc64le/Makefile.target @@ -0,0 +1,12 @@ +# -*- Mode: makefile -*- +# +# ppc64le specific tweaks + +VPATH += $(SRC_PATH)/tests/tcg/ppc64le + +ifneq ($(DOCKER_IMAGE)$(CROSS_CC_HAS_POWER8_VECTOR),) +PPC64LE_TESTS=bcdsub +endif +bcdsub: CFLAGS += -mpower8-vector + +TESTS += $(PPC64LE_TESTS) diff --git a/tests/tcg/ppc64le/bcdsub.c b/tests/tcg/ppc64le/bcdsub.c new file mode 100644 index 0000000000..8c188cae6d --- /dev/null +++ b/tests/tcg/ppc64le/bcdsub.c @@ -0,0 +1,130 @@ +#include +#include +#include + +#define CRF_LT (1 << 3) +#define CRF_GT (1 << 2) +#define CRF_EQ (1 << 1) +#define CRF_SO (1 << 0) +#define UNDEF 0 + +#define BCDSUB(vra, vrb, ps) \ + asm ("bcdsub. %1,%2,%3,%4;" \ + "mfocrf %0,0b10;" \ + : "=r" (cr), "=v" (vrt) \ + : "v" (vra), "v" (vrb), "i" (ps) \ + : ); + +#define TEST(vra, vrb, ps, exp_res, exp_cr6) \ + do { \ + __int128 vrt = 0; \ + int cr = 0; \ + BCDSUB(vra, vrb, ps); \ + if (exp_res) \ + assert(vrt == exp_res); \ + assert((cr >> 4) == exp_cr6); \ + } while (0) + + +/* + * Unbounded result is equal to zero: + * sign = (PS) ? 0b1111 : 0b1100 + * CR6 = 0b0010 + */ +void test_bcdsub_eq(void) +{ + __int128 a, b; + + /* maximum positive BCD value */ + a = b = (((__int128) 0x9999999999999999) << 64 | 0x999999999999999c); + + TEST(a, b, 0, 0xc, CRF_EQ); + TEST(a, b, 1, 0xf, CRF_EQ); +} + +/* + * Unbounded result is greater than zero: + * sign = (PS) ? 0b1111 : 0b1100 + * CR6 = (overflow) ? 0b0101 : 0b0100 + */ +void test_bcdsub_gt(void) +{ + __int128 a, b, c; + + /* maximum positive BCD value */ + a = (((__int128) 0x9999999999999999) << 64 | 0x999999999999999c); + + /* negative one BCD value */ + b = (__int128) 0x1d; + + TEST(a, b, 0, 0xc, (CRF_GT | CRF_SO)); + TEST(a, b, 1, 0xf, (CRF_GT | CRF_SO)); + + c = (((__int128) 0x9999999999999999) << 64 | 0x999999999999998c); + + TEST(c, b, 0, a, CRF_GT); + TEST(c, b, 1, (a | 0x3), CRF_GT); +} + +/* + * Unbounded result is less than zero: + * sign = 0b1101 + * CR6 = (overflow) ? 0b1001 : 0b1000 + */ +void test_bcdsub_lt(void) +{ + __int128 a, b; + + /* positive zero BCD value */ + a = (__int128) 0xc; + + /* positive one BCD value */ + b = (__int128) 0x1c; + + TEST(a, b, 0, 0x1d, CRF_LT); + TEST(a, b, 1, 0x1d, CRF_LT); + + /* maximum negative BCD value */ + a = (((__int128) 0x9999999999999999) << 64 | 0x999999999999999d); + + /* positive one BCD value */ + b = (__int128) 0x1c; + + TEST(a, b, 0, 0xd, (CRF_LT | CRF_SO)); + TEST(a, b, 1, 0xd, (CRF_LT | CRF_SO)); +} + +void test_bcdsub_invalid(void) +{ + __int128 a, b; + + /* positive one BCD value */ + a = (__int128) 0x1c; + b = 0xf00; + + TEST(a, b, 0, UNDEF, CRF_SO); + TEST(a, b, 1, UNDEF, CRF_SO); + + TEST(b, a, 0, UNDEF, CRF_SO); + TEST(b, a, 1, UNDEF, CRF_SO); + + a = 0xbad; + + TEST(a, b, 0, UNDEF, CRF_SO); + TEST(a, b, 1, UNDEF, CRF_SO); +} + +int main(void) +{ + struct sigaction action; + + action.sa_handler = _exit; + sigaction(SIGABRT, &action, NULL); + + test_bcdsub_eq(); + test_bcdsub_gt(); + test_bcdsub_lt(); + test_bcdsub_invalid(); + + return 0; +} From patchwork Wed Mar 10 04:09:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 12126903 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 384EAC433E0 for ; Wed, 10 Mar 2021 04:11:57 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id B184F64FE3 for ; Wed, 10 Mar 2021 04:11:56 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B184F64FE3 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:41286 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJqCR-00061h-Qi for qemu-devel@archiver.kernel.org; Tue, 09 Mar 2021 23:11:55 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:48166) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAs-0003Wn-9D; Tue, 09 Mar 2021 23:10:19 -0500 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:35073 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAp-0004AO-GK; Tue, 09 Mar 2021 23:10:18 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id 4DwJWd5t4Cz9sWp; Wed, 10 Mar 2021 15:10:05 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1615349405; bh=v/NiisTvwZjjJreAZMnQLch913SxxNiDzagydM1u/7c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kB4yk/01mKd5tYIll6K2EYLoRFssFgiBWV2m/FwP6wJ3U3a2QaLArPWmiVTNJ7YJq t1wy2W8vSTrPHb7n/9RwpXJz/OffEJLyT9ShERK8WyIAQt/k+G0NFRlO7P8SoTCaPA Nf8EXjrab7jtifog2huwvgq+/r1y7lprbXncQSQo= From: David Gibson To: peter.maydell@linaro.org, groug@kaod.org Subject: [PULL 10/20] spapr_drc.c: introduce unplug_timeout_timer Date: Wed, 10 Mar 2021 15:09:52 +1100 Message-Id: <20210310041002.333813-11-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210310041002.333813-1-david@gibson.dropbear.id.au> References: <20210310041002.333813-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Received-SPF: pass client-ip=2401:3900:2:1::2; envelope-from=dgibson@ozlabs.org; helo=ozlabs.org X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.249, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Daniel Henrique Barboza , qemu-ppc@nongnu.org, qemu-devel@nongnu.org, David Gibson Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza The LoPAR spec provides no way for the guest kernel to report failure of hotplug/hotunplug events. This wouldn't be bad if those operations were granted to always succeed, but that's far for the reality. What ends up happening is that, in the case of a failed hotunplug, regardless of whether it was a QEMU error or a guest misbehavior, the pSeries machine is retaining the unplug state of the device in the running guest. This state is cleanup in machine reset, where it is assumed that this state represents a device that is pending unplug, and the device is hotunpluged from the board. Until the reset occurs, any hotunplug operation of the same device is forbid because there is a pending unplug state. This behavior has at least one undesirable side effect. A long standing pending unplug state is, more often than not, the result of a hotunplug error. The user had to dealt with it, since retrying to unplug the device is noy allowed, and then in the machine reset we're removing the device from the guest. This means that we're failing the user twice - failed to hotunplug when asked, then hotunplugged without notice. Solutions to this problem range between trying to predict when the hotunplug will fail and forbid the operation from the QEMU layer, from opening up the IRQ queue to allow for multiple hotunplug attempts, from telling the users to 'reboot the machine if something goes wrong'. The first solution is flawed because we can't fully predict guest behavior from QEMU, the second solution is a trial and error remediation that counts on a hope that the unplug will eventually succeed, and the third is ... well. This patch introduces a crude, but effective solution to hotunplug errors in the pSeries machine. For each unplug done, we'll timeout after some time. If a certain amount of time passes, we'll cleanup the hotunplug state from the machine. During the timeout period, any unplug operations in the same device will still be blocked. After that, we'll assume that the guest failed the operation, and allow the user to try again. If the timeout is too short we'll prevent legitimate hotunplug situations to occur, so we'll need to overestimate the regular time an unplug operation takes to succeed to account that. The true solution for the hotunplug errors in the pSeries machines is a PAPR change to allow for the guest to warn the platform about it. For now, the work done in this timeout design can be used for the new PAPR 'abort hcall' in the future, given that for both cases we'll need code to cleanup the existing unplug states of the DRCs. At this moment we're adding the basic wiring of the timer into the DRC. Next patch will use the timer to timeout failed CPU hotunplugs. Signed-off-by: Daniel Henrique Barboza Message-Id: <20210222194531.62717-4-danielhb413@gmail.com> Signed-off-by: David Gibson --- hw/ppc/spapr_drc.c | 40 ++++++++++++++++++++++++++++++++++++++ include/hw/ppc/spapr_drc.h | 4 ++++ 2 files changed, 44 insertions(+) diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c index 67041fb212..27adbc5c30 100644 --- a/hw/ppc/spapr_drc.c +++ b/hw/ppc/spapr_drc.c @@ -57,6 +57,8 @@ static void spapr_drc_release(SpaprDrc *drc) drck->release(drc->dev); drc->unplug_requested = false; + timer_del(drc->unplug_timeout_timer); + g_free(drc->fdt); drc->fdt = NULL; drc->fdt_start_offset = 0; @@ -370,6 +372,17 @@ static void prop_get_fdt(Object *obj, Visitor *v, const char *name, } while (fdt_depth != 0); } +static void spapr_drc_start_unplug_timeout_timer(SpaprDrc *drc) +{ + SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); + + if (drck->unplug_timeout_seconds != 0) { + timer_mod(drc->unplug_timeout_timer, + qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + + drck->unplug_timeout_seconds * 1000); + } +} + void spapr_drc_attach(SpaprDrc *drc, DeviceState *d) { trace_spapr_drc_attach(spapr_drc_index(drc)); @@ -475,11 +488,23 @@ static bool spapr_drc_needed(void *opaque) spapr_drc_unplug_requested(drc); } +static int spapr_drc_post_load(void *opaque, int version_id) +{ + SpaprDrc *drc = opaque; + + if (drc->unplug_requested) { + spapr_drc_start_unplug_timeout_timer(drc); + } + + return 0; +} + static const VMStateDescription vmstate_spapr_drc = { .name = "spapr_drc", .version_id = 1, .minimum_version_id = 1, .needed = spapr_drc_needed, + .post_load = spapr_drc_post_load, .fields = (VMStateField []) { VMSTATE_UINT32(state, SpaprDrc), VMSTATE_END_OF_LIST() @@ -490,6 +515,15 @@ static const VMStateDescription vmstate_spapr_drc = { } }; +static void drc_unplug_timeout_cb(void *opaque) +{ + SpaprDrc *drc = opaque; + + if (drc->unplug_requested) { + drc->unplug_requested = false; + } +} + static void drc_realize(DeviceState *d, Error **errp) { SpaprDrc *drc = SPAPR_DR_CONNECTOR(d); @@ -512,6 +546,11 @@ static void drc_realize(DeviceState *d, Error **errp) object_property_add_alias(root_container, link_name, drc->owner, child_name); g_free(link_name); + + drc->unplug_timeout_timer = timer_new_ms(QEMU_CLOCK_VIRTUAL, + drc_unplug_timeout_cb, + drc); + vmstate_register(VMSTATE_IF(drc), spapr_drc_index(drc), &vmstate_spapr_drc, drc); trace_spapr_drc_realize_complete(spapr_drc_index(drc)); @@ -529,6 +568,7 @@ static void drc_unrealize(DeviceState *d) name = g_strdup_printf("%x", spapr_drc_index(drc)); object_property_del(root_container, name); g_free(name); + timer_free(drc->unplug_timeout_timer); } SpaprDrc *spapr_dr_connector_new(Object *owner, const char *type, diff --git a/include/hw/ppc/spapr_drc.h b/include/hw/ppc/spapr_drc.h index 02a63b3666..38ec4c8091 100644 --- a/include/hw/ppc/spapr_drc.h +++ b/include/hw/ppc/spapr_drc.h @@ -187,6 +187,8 @@ typedef struct SpaprDrc { bool unplug_requested; void *fdt; int fdt_start_offset; + + QEMUTimer *unplug_timeout_timer; } SpaprDrc; struct SpaprMachineState; @@ -209,6 +211,8 @@ typedef struct SpaprDrcClass { int (*dt_populate)(SpaprDrc *drc, struct SpaprMachineState *spapr, void *fdt, int *fdt_start_offset, Error **errp); + + int unplug_timeout_seconds; } SpaprDrcClass; typedef struct SpaprDrcPhysical { From patchwork Wed Mar 10 04:09:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 12126925 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D1C59C433DB for ; Wed, 10 Mar 2021 04:19:02 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 67B6064FE3 for ; Wed, 10 Mar 2021 04:19:02 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 67B6064FE3 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:37248 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJqJJ-0008PT-B4 for qemu-devel@archiver.kernel.org; Tue, 09 Mar 2021 23:19:01 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:48202) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAt-0003XO-Ot; Tue, 09 Mar 2021 23:10:19 -0500 Received: from bilbo.ozlabs.org ([203.11.71.1]:34123 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAp-0004AL-Gn; Tue, 09 Mar 2021 23:10:19 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id 4DwJWd6Fc9z9sWr; Wed, 10 Mar 2021 15:10:05 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1615349405; bh=3JVFh3T5/1SjVQVjHQbKQS4RpDisM0JMdcKLl9/GTMc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eUXCMsH3S8bFAWQNMif5Pt2XOcHYsxTCnyUTRZVUViIhzlTs1ZW4GkS7hi/p5y0Fx vZ9k8qBFEXwvPksv5TbI6h0ICQfcX1MAwcXMR3WPVxrbmGXk43VcEwVmFzXyR7JO9E A7ZBsJvhmXbBBY75D9F83628vj9BYU2FQv9x87dw= From: David Gibson To: peter.maydell@linaro.org, groug@kaod.org Subject: [PULL 11/20] spapr_drc.c: add hotunplug timeout for CPUs Date: Wed, 10 Mar 2021 15:09:53 +1100 Message-Id: <20210310041002.333813-12-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210310041002.333813-1-david@gibson.dropbear.id.au> References: <20210310041002.333813-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Received-SPF: pass client-ip=203.11.71.1; envelope-from=dgibson@ozlabs.org; helo=ozlabs.org X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.249, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Daniel Henrique Barboza , qemu-ppc@nongnu.org, qemu-devel@nongnu.org, David Gibson , Xujun Ma Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza There is a reliable way to make a CPU hotunplug fail in the pseries machine. Hotplug a CPU A, then offline all other CPUs inside the guest but A. When trying to hotunplug A the guest kernel will refuse to do it, because A is now the last online CPU of the guest. PAPR has no 'error callback' in this situation to report back to the platform, so the guest kernel will deny the unplug in silent and QEMU will never know what happened. The unplug pending state of A will remain until the guest is shutdown or rebooted. Previous attempts of fixing it (see [1] and [2]) were aimed at trying to mitigate the effects of the problem. In [1] we were trying to guess which guest CPUs were online to forbid hotunplug of the last online CPU in the QEMU layer, avoiding the scenario described above because QEMU is now failing in behalf of the guest. This is not robust because the last online CPU of the guest can change while we're in the middle of the unplug process, and our initial assumptions are now invalid. In [2] we were accepting that our unplug process is uncertain and the user should be allowed to spam the IRQ hotunplug queue of the guest in case the CPU hotunplug fails. This patch presents another alternative, using the timeout infrastructure introduced in the previous patch. CPU hotunplugs in the pSeries machine will now timeout after 15 seconds. This is a long time for a single CPU unplug to occur, regardless of guest load - although the user is *strongly* encouraged to *not* hotunplug devices from a guest under high load - and we can be sure that something went wrong if it takes longer than that for the guest to release the CPU (the same can't be said about memory hotunplug - more on that in the next patch). Timing out the unplug operation will reset the unplug state of the CPU and allow the user to try it again, regardless of the error situation that prevented the hotunplug to occur. Of all the not so pretty fixes/mitigations for CPU hotunplug errors in pSeries, timing out the operation is an admission that we have no control in the process, and must assume the worst case if the operation doesn't succeed in a sensible time frame. [1] https://lists.gnu.org/archive/html/qemu-devel/2021-01/msg03353.html [2] https://lists.gnu.org/archive/html/qemu-devel/2021-01/msg04400.html Reported-by: Xujun Ma Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1911414 Reviewed-by: David Gibson Signed-off-by: Daniel Henrique Barboza Message-Id: <20210222194531.62717-5-danielhb413@gmail.com> Signed-off-by: David Gibson --- hw/ppc/spapr.c | 4 ++++ hw/ppc/spapr_drc.c | 13 +++++++++++++ include/hw/ppc/spapr_drc.h | 1 + 3 files changed, 18 insertions(+) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index b066df68cb..ecce8abf14 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -3724,6 +3724,10 @@ void spapr_core_unplug_request(HotplugHandler *hotplug_dev, DeviceState *dev, if (!spapr_drc_unplug_requested(drc)) { spapr_drc_unplug_request(drc); spapr_hotplug_req_remove_by_index(drc); + } else { + error_setg(errp, "core-id %d unplug is still pending, %d seconds " + "timeout remaining", + cc->core_id, spapr_drc_unplug_timeout_remaining_sec(drc)); } } diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c index 27adbc5c30..fd2e45640f 100644 --- a/hw/ppc/spapr_drc.c +++ b/hw/ppc/spapr_drc.c @@ -409,6 +409,8 @@ void spapr_drc_unplug_request(SpaprDrc *drc) drc->unplug_requested = true; + spapr_drc_start_unplug_timeout_timer(drc); + if (drc->state != drck->empty_state) { trace_spapr_drc_awaiting_quiesce(spapr_drc_index(drc)); return; @@ -417,6 +419,16 @@ void spapr_drc_unplug_request(SpaprDrc *drc) spapr_drc_release(drc); } +int spapr_drc_unplug_timeout_remaining_sec(SpaprDrc *drc) +{ + if (drc->unplug_requested && timer_pending(drc->unplug_timeout_timer)) { + return (qemu_timeout_ns_to_ms(drc->unplug_timeout_timer->expire_time) - + qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL)) / 1000; + } + + return 0; +} + bool spapr_drc_reset(SpaprDrc *drc) { SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); @@ -710,6 +722,7 @@ static void spapr_drc_cpu_class_init(ObjectClass *k, void *data) drck->drc_name_prefix = "CPU "; drck->release = spapr_core_release; drck->dt_populate = spapr_core_dt_populate; + drck->unplug_timeout_seconds = 15; } static void spapr_drc_pci_class_init(ObjectClass *k, void *data) diff --git a/include/hw/ppc/spapr_drc.h b/include/hw/ppc/spapr_drc.h index 38ec4c8091..26599c385a 100644 --- a/include/hw/ppc/spapr_drc.h +++ b/include/hw/ppc/spapr_drc.h @@ -248,6 +248,7 @@ int spapr_dt_drc(void *fdt, int offset, Object *owner, uint32_t drc_type_mask); */ void spapr_drc_attach(SpaprDrc *drc, DeviceState *d); void spapr_drc_unplug_request(SpaprDrc *drc); +int spapr_drc_unplug_timeout_remaining_sec(SpaprDrc *drc); /* * Reset all DRCs, causing pending hot-plug/unplug requests to complete. From patchwork Wed Mar 10 04:09:54 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 12126927 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8DDA2C433DB for ; Wed, 10 Mar 2021 04:20:26 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 3537764FE8 for ; Wed, 10 Mar 2021 04:20:26 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3537764FE8 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:42742 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJqKf-0002GJ-8q for qemu-devel@archiver.kernel.org; Tue, 09 Mar 2021 23:20:25 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:48244) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAv-0003YB-5z; Tue, 09 Mar 2021 23:10:22 -0500 Received: from bilbo.ozlabs.org ([203.11.71.1]:60447 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAr-0004B5-A8; Tue, 09 Mar 2021 23:10:20 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id 4DwJWd6mvzz9sWt; Wed, 10 Mar 2021 15:10:05 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1615349405; bh=ttqKw3/8vhGEqMYnJ02/Vpxxt+60FjIhg9CyKKVKHD0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Qc2HBBhSGDs+XoNqlca3Z2k8Vz6ceP47onCrlWKGuQmqOZHimeMCTq66j9SZhTkca S0u79w2EuF2aUdJqyrMRGHwzHosRWwY1EhXOOv01OcWcQGvXlCS6kGsxk7YODY7YwB owa850Rbh0XGNuxvAVaMwnJsWdVgDunsIllHV+Iw= From: David Gibson To: peter.maydell@linaro.org, groug@kaod.org Subject: [PULL 12/20] spapr_drc.c: use DRC reconfiguration to cleanup DIMM unplug state Date: Wed, 10 Mar 2021 15:09:54 +1100 Message-Id: <20210310041002.333813-13-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210310041002.333813-1-david@gibson.dropbear.id.au> References: <20210310041002.333813-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Received-SPF: pass client-ip=203.11.71.1; envelope-from=dgibson@ozlabs.org; helo=ozlabs.org X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.249, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Daniel Henrique Barboza , qemu-ppc@nongnu.org, qemu-devel@nongnu.org, David Gibson Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza Handling errors in memory hotunplug in the pSeries machine is more complex than any other device type, because there are all the complications that other devices has, and more. For instance, determining a timeout for a DIMM hotunplug must consider if it's a Hash-MMU or a Radix-MMU guest, because Hash guests takes longer to hotunplug DIMMs. The size of the DIMM is also a factor, given that longer DIMMs naturally takes longer to be hotunplugged from the kernel. And there's also the guest memory usage to be considered: if there's a process that is consuming memory that would be lost by the DIMM unplug, the kernel will postpone the unplug process until the process finishes, and then initiate the regular hotunplug process. The first two considerations are manageable, but the last one is a deal breaker. There is no sane way for the pSeries machine to determine the memory load in the guest when attempting a DIMM hotunplug - and even if there was a way, the guest can start using all the RAM in the middle of the unplug process and invalidate our previous assumptions - and in result we can't even begin to calculate a timeout for the operation. This means that we can't implement a viable timeout mechanism for memory unplug in pSeries. Going back to why we would consider an unplug timeout, the reason is that we can't know if the kernel is giving up the unplug. Turns out that, sometimes, we can. Consider a failed memory hotunplug attempt where the kernel will error out with the following message: 'pseries-hotplug-mem: Memory indexed-count-remove failed, adding any removed LMBs' This happens when there is a LMB that the kernel gave up in removing, and the LMBs previously marked for removal are now being added back. This happens in the pseries kernel in [1], dlpar_memory_remove_by_ic() into dlpar_add_lmb(), and after that update_lmb_associativity_index(). In this function, the kernel is configuring the LMB DRC connector again. Note that this is a valid usage in LOPAR, as stated in section "ibm,configure-connector RTAS Call": 'A subsequent sequence of calls to ibm,configure-connector with the same entry from the “ibm,drc-indexes” or “ibm,drc-info” property will restart the configuration of devices which were not completely configured.' We can use this kernel behavior in our favor. If a DRC connector reconfiguration for a LMB that we marked as unplug pending happens, this indicates that the kernel changed its mind about the unplug and is reasserting that it will keep using all the LMBs of the DIMM. In this case, it's safe to assume that the whole DIMM device unplug was cancelled. This patch hops into rtas_ibm_configure_connector() and, in the scenario described above, clear the unplug state for the DIMM device. This will not solve all the problems we still have with memory unplug, but it will cover this case where the kernel reconfigures LMBs after a failed unplug. We are a bit more resilient, without using an unreliable timeout, and we didn't make the remaining error cases any worse. [1] arch/powerpc/platforms/pseries/hotplug-memory.c Signed-off-by: Daniel Henrique Barboza Message-Id: <20210222194531.62717-6-danielhb413@gmail.com> Signed-off-by: David Gibson --- hw/ppc/spapr.c | 43 ++++++++++++++++++++++++++++++++++++++++++ hw/ppc/spapr_drc.c | 10 ++++++++++ include/hw/ppc/spapr.h | 2 ++ 3 files changed, 55 insertions(+) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index ecce8abf14..6eaddb12cb 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -3575,6 +3575,49 @@ static SpaprDimmState *spapr_recover_pending_dimm_state(SpaprMachineState *ms, return spapr_pending_dimm_unplugs_add(ms, avail_lmbs, dimm); } +void spapr_clear_pending_dimm_unplug_state(SpaprMachineState *spapr, + DeviceState *dev) +{ + SpaprDimmState *ds; + PCDIMMDevice *dimm; + SpaprDrc *drc; + uint32_t nr_lmbs; + uint64_t size, addr_start, addr; + int i; + + if (!dev) { + return; + } + + dimm = PC_DIMM(dev); + ds = spapr_pending_dimm_unplugs_find(spapr, dimm); + + /* + * 'ds == NULL' would mean that the DIMM doesn't have a pending + * unplug state, but one of its DRC is marked as unplug_requested. + * This is bad and weird enough to g_assert() out. + */ + g_assert(ds); + + spapr_pending_dimm_unplugs_remove(spapr, ds); + + size = memory_device_get_region_size(MEMORY_DEVICE(dimm), &error_abort); + nr_lmbs = size / SPAPR_MEMORY_BLOCK_SIZE; + + addr_start = object_property_get_uint(OBJECT(dimm), PC_DIMM_ADDR_PROP, + &error_abort); + + addr = addr_start; + for (i = 0; i < nr_lmbs; i++) { + drc = spapr_drc_by_id(TYPE_SPAPR_DRC_LMB, + addr / SPAPR_MEMORY_BLOCK_SIZE); + g_assert(drc); + + drc->unplug_requested = false; + addr += SPAPR_MEMORY_BLOCK_SIZE; + } +} + /* Callback to be called during DRC release. */ void spapr_lmb_release(DeviceState *dev) { diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c index fd2e45640f..8c4997d795 100644 --- a/hw/ppc/spapr_drc.c +++ b/hw/ppc/spapr_drc.c @@ -1230,6 +1230,16 @@ static void rtas_ibm_configure_connector(PowerPCCPU *cpu, drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); + /* + * This indicates that the kernel is reconfiguring a LMB due to + * a failed hotunplug. Clear the pending unplug state for the whole + * DIMM. + */ + if (spapr_drc_type(drc) == SPAPR_DR_CONNECTOR_TYPE_LMB && + drc->unplug_requested) { + spapr_clear_pending_dimm_unplug_state(spapr, drc->dev); + } + if (!drc->fdt) { void *fdt; int fdt_size; diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index ccbeeca1de..d6edeaaaff 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -847,6 +847,8 @@ int spapr_hpt_shift_for_ramsize(uint64_t ramsize); int spapr_reallocate_hpt(SpaprMachineState *spapr, int shift, Error **errp); void spapr_clear_pending_events(SpaprMachineState *spapr); void spapr_clear_pending_hotplug_events(SpaprMachineState *spapr); +void spapr_clear_pending_dimm_unplug_state(SpaprMachineState *spapr, + DeviceState *dev); int spapr_max_server_number(SpaprMachineState *spapr); void spapr_store_hpte(PowerPCCPU *cpu, hwaddr ptex, uint64_t pte0, uint64_t pte1); From patchwork Wed Mar 10 04:09:55 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 12126913 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1E27FC433DB for ; Wed, 10 Mar 2021 04:15:21 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 8951364FE7 for ; Wed, 10 Mar 2021 04:15:20 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8951364FE7 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:53000 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJqFj-0002ea-I0 for qemu-devel@archiver.kernel.org; Tue, 09 Mar 2021 23:15:19 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:48240) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAv-0003Y8-5o; Tue, 09 Mar 2021 23:10:22 -0500 Received: from bilbo.ozlabs.org ([203.11.71.1]:33217 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAt-0004Ci-DF; Tue, 09 Mar 2021 23:10:20 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id 4DwJWf05W4z9sWv; Wed, 10 Mar 2021 15:10:05 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1615349406; bh=3paUsi6KnBsr8WjgCeruHmBju+Ztd+zKZLwU9qHUkXU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jWKR5mVDFPgs+hEyzQa/oF0P35CTw7qPcheTUHrX6P/o3FIF/2QJpq4N8wooqRTlc EnwpBvNgE1KOv2UiTU1A6JzNChZo0JL50ck8IiSRtvOBQkI0HkQN7mNdXZbd6/5i20 UdLmMqtggv660pnYtdQYxQyil3+XXCIwAfgPqDxw= From: David Gibson To: peter.maydell@linaro.org, groug@kaod.org Subject: [PULL 13/20] hw/net: fsl_etsec: Fix build error when HEX_DUMP is on Date: Wed, 10 Mar 2021 15:09:55 +1100 Message-Id: <20210310041002.333813-14-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210310041002.333813-1-david@gibson.dropbear.id.au> References: <20210310041002.333813-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Received-SPF: pass client-ip=203.11.71.1; envelope-from=dgibson@ozlabs.org; helo=ozlabs.org X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.249, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Bin Meng , qemu-ppc@nongnu.org, qemu-devel@nongnu.org, David Gibson Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Bin Meng "qemu-common.h" should be included to provide the forward declaration of qemu_hexdump() when HEX_DUMP is on. Signed-off-by: Bin Meng Message-Id: <20210228050431.24647-1-bmeng.cn@gmail.com> Signed-off-by: David Gibson --- hw/net/fsl_etsec/etsec.c | 1 + hw/net/fsl_etsec/rings.c | 1 + 2 files changed, 2 insertions(+) diff --git a/hw/net/fsl_etsec/etsec.c b/hw/net/fsl_etsec/etsec.c index 93886bba60..bd9d62b559 100644 --- a/hw/net/fsl_etsec/etsec.c +++ b/hw/net/fsl_etsec/etsec.c @@ -27,6 +27,7 @@ */ #include "qemu/osdep.h" +#include "qemu-common.h" #include "hw/sysbus.h" #include "hw/irq.h" #include "hw/ptimer.h" diff --git a/hw/net/fsl_etsec/rings.c b/hw/net/fsl_etsec/rings.c index fe055d3381..d6be0d7d18 100644 --- a/hw/net/fsl_etsec/rings.c +++ b/hw/net/fsl_etsec/rings.c @@ -22,6 +22,7 @@ * THE SOFTWARE. */ #include "qemu/osdep.h" +#include "qemu-common.h" #include "net/checksum.h" #include "qemu/log.h" #include "etsec.h" From patchwork Wed Mar 10 04:09:56 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 12126935 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-21.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0F5E6C433E0 for ; Wed, 10 Mar 2021 04:22:39 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 831E064FE3 for ; Wed, 10 Mar 2021 04:22:38 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 831E064FE3 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:50522 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJqMn-0005z5-II for qemu-devel@archiver.kernel.org; Tue, 09 Mar 2021 23:22:37 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:48270) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAw-0003YQ-VM; Tue, 09 Mar 2021 23:10:23 -0500 Received: from ozlabs.org ([2401:3900:2:1::2]:55963) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAv-0004E7-Au; Tue, 09 Mar 2021 23:10:22 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id 4DwJWf0SZYz9sX2; Wed, 10 Mar 2021 15:10:06 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1615349406; bh=uJfNzO/IH/PKiESK8g5yg4+400F3gnzkruuBjogzggs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eLCNl026PJj7kOhBi77/2+xRX8xoKd2J7qP85C2mWAzbl2vEH7TD1Fi/6rJGnkuuT DdhF07d+6I4WebKLs/VyuABBp3plbYHTAjo3bxJ+Ltni7NHxj7OEs+tIvunVb0ERS1 GD+zMwvL5GUhugyR0QpI12iFO5/US+U3MFeCGhYc= From: David Gibson To: peter.maydell@linaro.org, groug@kaod.org Subject: [PULL 14/20] hw/ppc: e500: Add missing in the eTSEC node Date: Wed, 10 Mar 2021 15:09:56 +1100 Message-Id: <20210310041002.333813-15-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210310041002.333813-1-david@gibson.dropbear.id.au> References: <20210310041002.333813-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Received-SPF: pass client-ip=2401:3900:2:1::2; envelope-from=dgibson@ozlabs.org; helo=ozlabs.org X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.249, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Bin Meng , qemu-ppc@nongnu.org, qemu-devel@nongnu.org, David Gibson Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Bin Meng The eTSEC node should provide an empty property in the eTSEC node, otherwise of_translate_address() in the Linux kernel fails to get the eTSEC register base, reporting: OF: ** translation for device /platform@f00000000/ethernet@0/queue-group ** OF: bus is default (na=1, ns=1) on /platform@f00000000/ethernet@0 OF: translating address: 00000000 OF: parent bus is default (na=1, ns=1) on /platform@f00000000 OF: no ranges; cannot translate Per devicetree spec v0.3 [1] chapter 2.3.8: If the property is not present in a bus node, it is assumed that no mapping exists between children of the node and the parent address space. This is why of_translate_address() aborts the address translation. Apparently U-Boot devicetree parser seems to be tolerant with missing as this was not noticed when testing with U-Boot. The empty property is present in all kernel shipped dtsi files for eTSEC, Let's add it to conform with the spec. [1] https://github.com/devicetree-org/devicetree-specification/releases/download/v0.3/devicetree-specification-v0.3.pdf Fixes: fdfb7f2cdb2d ("e500: Add support for eTSEC in device tree") Signed-off-by: Bin Meng Message-Id: <1614158919-9473-1-git-send-email-bmeng.cn@gmail.com> Signed-off-by: David Gibson --- hw/ppc/e500.c | 1 + 1 file changed, 1 insertion(+) diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c index 01517a6c6c..1d94485ac8 100644 --- a/hw/ppc/e500.c +++ b/hw/ppc/e500.c @@ -231,6 +231,7 @@ static int create_devtree_etsec(SysBusDevice *sbdev, PlatformDevtreeData *data) assert(irq2 >= 0); qemu_fdt_add_subnode(fdt, node); + qemu_fdt_setprop(fdt, node, "ranges", NULL, 0); qemu_fdt_setprop_string(fdt, node, "device_type", "network"); qemu_fdt_setprop_string(fdt, node, "compatible", "fsl,etsec2"); qemu_fdt_setprop_string(fdt, node, "model", "eTSEC"); From patchwork Wed Mar 10 04:09:57 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 12126929 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8F57BC433DB for ; Wed, 10 Mar 2021 04:20:40 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 1E57164FE8 for ; Wed, 10 Mar 2021 04:20:39 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1E57164FE8 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:43832 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJqKt-0002hb-1e for qemu-devel@archiver.kernel.org; Tue, 09 Mar 2021 23:20:39 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:48268) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAw-0003YI-Q9; Tue, 09 Mar 2021 23:10:22 -0500 Received: from bilbo.ozlabs.org ([203.11.71.1]:38577 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAv-0004E4-AW; Tue, 09 Mar 2021 23:10:22 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id 4DwJWf0tGWz9sXG; Wed, 10 Mar 2021 15:10:06 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1615349406; bh=4oySvY0VN7t1ZKMssZ+OTi1q2plRJDlm+3pnVW+mj8I=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pnY38UJYMEnwJUS5xbV1ZdgF1mKkJrOPhCcn+KoaldEV+RUjSGynsE9y2X3yrRRfr 60qQC5F6vMZ8aVWwhdEnYlgr7NofyPzEIyuMDUKmiQCdSIHl+YTno4+kXR0gnFUBQ8 0OE5K+2T082LSjhUHgviCeaBU21WOFW2UpKt+6QA= From: David Gibson To: peter.maydell@linaro.org, groug@kaod.org Subject: [PULL 15/20] spapr.c: add 'unplug already in progress' message for PHB unplug Date: Wed, 10 Mar 2021 15:09:57 +1100 Message-Id: <20210310041002.333813-16-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210310041002.333813-1-david@gibson.dropbear.id.au> References: <20210310041002.333813-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Received-SPF: pass client-ip=203.11.71.1; envelope-from=dgibson@ozlabs.org; helo=ozlabs.org X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.249, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Daniel Henrique Barboza , qemu-ppc@nongnu.org, qemu-devel@nongnu.org, David Gibson Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza Both CPU hotunplug and PC_DIMM unplug reports an user warning, mentioning that the hotunplug is in progress, if consecutive 'device_del' are issued in quick succession. Do the same for PHBs in spapr_phb_unplug_request(). Signed-off-by: Daniel Henrique Barboza Message-Id: <20210226163301.419727-4-danielhb413@gmail.com> Reviewed-by: Greg Kurz Signed-off-by: David Gibson --- hw/ppc/spapr.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 6eaddb12cb..aca3ef9d58 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -4034,6 +4034,10 @@ static void spapr_phb_unplug_request(HotplugHandler *hotplug_dev, if (!spapr_drc_unplug_requested(drc)) { spapr_drc_unplug_request(drc); spapr_hotplug_req_remove_by_index(drc); + } else { + error_setg(errp, + "PCI Host Bridge unplug already in progress for device %s", + dev->id); } } From patchwork Wed Mar 10 04:09:58 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 12126943 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 85CF8C433DB for ; Wed, 10 Mar 2021 04:27:56 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A902064FE8 for ; Wed, 10 Mar 2021 04:27:55 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A902064FE8 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:33450 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJqRu-0002MW-O5 for qemu-devel@archiver.kernel.org; Tue, 09 Mar 2021 23:27:54 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:48312) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqBH-0004BY-QL; Tue, 09 Mar 2021 23:10:43 -0500 Received: from bilbo.ozlabs.org ([203.11.71.1]:33263 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqBG-0004F1-2O; Tue, 09 Mar 2021 23:10:43 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id 4DwJWf1X15z9sXN; Wed, 10 Mar 2021 15:10:06 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1615349406; bh=3AWS7FrYmGGQRJ+786Ab9WyJLHqat13pZhoq+1nqIjQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=laoFRDlwyy8NCL7QCUeCiPYefEcKhnT8ucoJMtaTkAzQ7H5IErai5H7DQznLKRhrP 08O0+fhO+AxazAlapz+2lIna4FWZXJMwFbNrK3Q2JP1cz7j0iFrWmCyy/p6gqyodUK 9C2uj8IUZJmfIA6FAfhIeDnMlCPEN75nVQ9NH++U= From: David Gibson To: peter.maydell@linaro.org, groug@kaod.org Subject: [PULL 16/20] spapr_pci.c: add 'unplug already in progress' message for PCI unplug Date: Wed, 10 Mar 2021 15:09:58 +1100 Message-Id: <20210310041002.333813-17-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210310041002.333813-1-david@gibson.dropbear.id.au> References: <20210310041002.333813-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Received-SPF: pass client-ip=203.11.71.1; envelope-from=dgibson@ozlabs.org; helo=ozlabs.org X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.249, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Daniel Henrique Barboza , qemu-ppc@nongnu.org, qemu-devel@nongnu.org, David Gibson Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza Hotunplug for all other devices are warning the user when the hotunplug is already in progress. Do the same for PCI devices in spapr_pci_unplug_request(). Signed-off-by: Daniel Henrique Barboza Message-Id: <20210226163301.419727-5-danielhb413@gmail.com> Reviewed-by: Greg Kurz Signed-off-by: David Gibson --- hw/ppc/spapr_pci.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c index b00e9609ae..feba18cb12 100644 --- a/hw/ppc/spapr_pci.c +++ b/hw/ppc/spapr_pci.c @@ -1743,6 +1743,10 @@ static void spapr_pci_unplug_request(HotplugHandler *plug_handler, } } } + } else { + error_setg(errp, + "PCI device unplug already in progress for device %s", + drc->dev->id); } } From patchwork Wed Mar 10 04:09:59 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 12126939 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DBAA2C433DB for ; Wed, 10 Mar 2021 04:24:15 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 69AE864FEE for ; Wed, 10 Mar 2021 04:24:15 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 69AE864FEE Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:55120 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJqOM-0007wi-JY for qemu-devel@archiver.kernel.org; Tue, 09 Mar 2021 23:24:14 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:48286) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAy-0003bY-Lu; Tue, 09 Mar 2021 23:10:24 -0500 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:36357 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAw-0004F4-Rx; Tue, 09 Mar 2021 23:10:24 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id 4DwJWf244Qz9sXk; Wed, 10 Mar 2021 15:10:06 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1615349406; bh=FAmvpoIycEat6ZCPtDntwu118saVz3Q8BNqsP/GslpA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FEdDTNo6G2c90I/+T0i9+RhnwUP9wRa91GV2G8Vcmsxc+NxkLsPigkbMHBjJxeWuK R1L2+JLeHpTYCufn/qDJPG1RfzQJqKT9h3MX4IivWlXHX+0bDDcDxle6Ad72oKk2Lv 61HWnPuT0zI4Ta12qvorC0qwzBPgMHfDfdRYv4U0= From: David Gibson To: peter.maydell@linaro.org, groug@kaod.org Subject: [PULL 17/20] qemu_timer.c: add timer_deadline_ms() helper Date: Wed, 10 Mar 2021 15:09:59 +1100 Message-Id: <20210310041002.333813-18-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210310041002.333813-1-david@gibson.dropbear.id.au> References: <20210310041002.333813-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Received-SPF: pass client-ip=2401:3900:2:1::2; envelope-from=dgibson@ozlabs.org; helo=ozlabs.org X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.249, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paolo Bonzini , Daniel Henrique Barboza , qemu-ppc@nongnu.org, qemu-devel@nongnu.org, David Gibson Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza The pSeries machine is using QEMUTimer internals to return the timeout in seconds for a timer object, in hw/ppc/spapr.c, function spapr_drc_unplug_timeout_remaining_sec(). Create a helper in qemu-timer.c to retrieve the deadline for a QEMUTimer object, in ms, to avoid exposing timer internals to the PPC code. CC: Paolo Bonzini Acked-by: Paolo Bonzini Signed-off-by: Daniel Henrique Barboza Message-Id: <20210301124133.23800-2-danielhb413@gmail.com> Reviewed-by: Greg Kurz Signed-off-by: David Gibson --- hw/ppc/spapr_drc.c | 5 ++--- include/qemu/timer.h | 8 ++++++++ util/qemu-timer.c | 13 +++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c index 8c4997d795..98b626acf9 100644 --- a/hw/ppc/spapr_drc.c +++ b/hw/ppc/spapr_drc.c @@ -421,9 +421,8 @@ void spapr_drc_unplug_request(SpaprDrc *drc) int spapr_drc_unplug_timeout_remaining_sec(SpaprDrc *drc) { - if (drc->unplug_requested && timer_pending(drc->unplug_timeout_timer)) { - return (qemu_timeout_ns_to_ms(drc->unplug_timeout_timer->expire_time) - - qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL)) / 1000; + if (drc->unplug_requested) { + return timer_deadline_ms(drc->unplug_timeout_timer) / 1000; } return 0; diff --git a/include/qemu/timer.h b/include/qemu/timer.h index 1678238384..5e76e3f8c2 100644 --- a/include/qemu/timer.h +++ b/include/qemu/timer.h @@ -795,6 +795,14 @@ static inline int64_t get_max_clock_jump(void) return 60 * NANOSECONDS_PER_SECOND; } +/** + * timer_deadline_ms: + * + * Returns the remaining miliseconds for @timer to expire, or zero + * if the timer is no longer pending. + */ +int64_t timer_deadline_ms(QEMUTimer *timer); + /* * Low level clock functions */ diff --git a/util/qemu-timer.c b/util/qemu-timer.c index 81c28af517..02424bc1b6 100644 --- a/util/qemu-timer.c +++ b/util/qemu-timer.c @@ -243,6 +243,19 @@ int64_t timerlist_deadline_ns(QEMUTimerList *timer_list) return delta; } +/* + * Returns the time remaining for the deadline, in ms. + */ +int64_t timer_deadline_ms(QEMUTimer *timer) +{ + if (timer_pending(timer)) { + return qemu_timeout_ns_to_ms(timer->expire_time) - + qemu_clock_get_ms(timer->timer_list->clock->type); + } + + return 0; +} + /* Calculate the soonest deadline across all timerlists attached * to the clock. This is used for the icount timeout so we * ignore whether or not the clock should be used in deadline From patchwork Wed Mar 10 04:10:00 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 12126937 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4D671C433DB for ; Wed, 10 Mar 2021 04:22:57 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id D7A8164FE3 for ; Wed, 10 Mar 2021 04:22:56 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D7A8164FE3 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:51730 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJqN6-0006TG-0S for qemu-devel@archiver.kernel.org; Tue, 09 Mar 2021 23:22:56 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:48368) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqBL-0004Jm-9e; Tue, 09 Mar 2021 23:10:47 -0500 Received: from bilbo.ozlabs.org ([203.11.71.1]:60833 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqBH-0004FT-N7; Tue, 09 Mar 2021 23:10:46 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id 4DwJWf2QfLz9sf9; Wed, 10 Mar 2021 15:10:06 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1615349406; bh=RDDaoxGlqZ067yRviJA7gZVjML6Hf1+QMpsvVlDJQto=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VFruNws5cnc9GidZp4B8EsTjLOmUovgYF8gktlEqJs/s32fgC2ND1MQHNiE2aBCXS 8aBUQab91vnDp28CEGrJiP6+9B+ZBcZXf1OVzMJsfSMSOl69MWuUp7wym/4AKPIxDG h/4xf8mERAs8siBQ4LhwWtJ9uqjPb84IEZVY1o0o= From: David Gibson To: peter.maydell@linaro.org, groug@kaod.org Subject: [PULL 18/20] target/ppc: fix icount support on Book-e vms accessing SPRs Date: Wed, 10 Mar 2021 15:10:00 +1100 Message-Id: <20210310041002.333813-19-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210310041002.333813-1-david@gibson.dropbear.id.au> References: <20210310041002.333813-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Received-SPF: pass client-ip=203.11.71.1; envelope-from=dgibson@ozlabs.org; helo=ozlabs.org X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.249, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paolo Bonzini , Vitaly Cheptsov , qemu-ppc@nongnu.org, qemu-devel@nongnu.org, David Gibson Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Vitaly Cheptsov Failing to guard SPR access with gen_io_start/gen_stop_exception causes "Bad icount read" exceptions when running VMs with e500mc and e500v2 CPUs with an icount parameter. Cc: David Gibson Cc: Greg Kurz Cc: Paolo Bonzini Signed-off-by: Vitaly Cheptsov Message-Id: <20210303140851.78383-1-cheptsov@ispras.ru> Signed-off-by: David Gibson --- target/ppc/translate_init.c.inc | 36 +++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/target/ppc/translate_init.c.inc b/target/ppc/translate_init.c.inc index e7324e85cd..09c9ae2c98 100644 --- a/target/ppc/translate_init.c.inc +++ b/target/ppc/translate_init.c.inc @@ -567,35 +567,71 @@ static void spr_write_601_ubatl(DisasContext *ctx, int sprn, int gprn) #if !defined(CONFIG_USER_ONLY) static void spr_read_40x_pit(DisasContext *ctx, int gprn, int sprn) { + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { + gen_io_start(); + } gen_helper_load_40x_pit(cpu_gpr[gprn], cpu_env); + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { + gen_stop_exception(ctx); + } } static void spr_write_40x_pit(DisasContext *ctx, int sprn, int gprn) { + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { + gen_io_start(); + } gen_helper_store_40x_pit(cpu_env, cpu_gpr[gprn]); + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { + gen_stop_exception(ctx); + } } static void spr_write_40x_dbcr0(DisasContext *ctx, int sprn, int gprn) { + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { + gen_io_start(); + } gen_store_spr(sprn, cpu_gpr[gprn]); gen_helper_store_40x_dbcr0(cpu_env, cpu_gpr[gprn]); /* We must stop translation as we may have rebooted */ gen_stop_exception(ctx); + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { + gen_stop_exception(ctx); + } } static void spr_write_40x_sler(DisasContext *ctx, int sprn, int gprn) { + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { + gen_io_start(); + } gen_helper_store_40x_sler(cpu_env, cpu_gpr[gprn]); + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { + gen_stop_exception(ctx); + } } static void spr_write_booke_tcr(DisasContext *ctx, int sprn, int gprn) { + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { + gen_io_start(); + } gen_helper_store_booke_tcr(cpu_env, cpu_gpr[gprn]); + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { + gen_stop_exception(ctx); + } } static void spr_write_booke_tsr(DisasContext *ctx, int sprn, int gprn) { + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { + gen_io_start(); + } gen_helper_store_booke_tsr(cpu_env, cpu_gpr[gprn]); + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { + gen_stop_exception(ctx); + } } #endif From patchwork Wed Mar 10 04:10:01 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 12126941 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A86A1C433E0 for ; Wed, 10 Mar 2021 04:25:34 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 09DBA64FE8 for ; Wed, 10 Mar 2021 04:25:34 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 09DBA64FE8 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:58574 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJqPc-00014D-VW for qemu-devel@archiver.kernel.org; Tue, 09 Mar 2021 23:25:32 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:48294) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAz-0003cm-Fm; Tue, 09 Mar 2021 23:10:25 -0500 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:58943 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqAx-0004FY-Qk; Tue, 09 Mar 2021 23:10:25 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id 4DwJWf2kCtz9shn; Wed, 10 Mar 2021 15:10:06 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1615349406; bh=Pvi76breuEyFm035IaxECDDmYM+pX4UKxGtWO8tdvFM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lKuxTZyUKnxjxQWi9f+DOI61fjPbSmJ5tQo9hA+TvUHVHg8iyDwvK5T9Cwwvmu5QG VKcGxiI5w4xshlPzH75Q1Upm2odY+316JRhDRH/nTFgCIVWshnFIUk8Q5npTaL921Z QLY5Qx+hqAC05wHe/Y5aMdANbM5npnZ67lJlNjSo= From: David Gibson To: peter.maydell@linaro.org, groug@kaod.org Subject: [PULL 19/20] spapr.c: remove duplicated assert in spapr_memory_unplug_request() Date: Wed, 10 Mar 2021 15:10:01 +1100 Message-Id: <20210310041002.333813-20-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210310041002.333813-1-david@gibson.dropbear.id.au> References: <20210310041002.333813-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Received-SPF: pass client-ip=2401:3900:2:1::2; envelope-from=dgibson@ozlabs.org; helo=ozlabs.org X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.249, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Daniel Henrique Barboza , qemu-ppc@nongnu.org, qemu-devel@nongnu.org, David Gibson Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza We are asserting the existence of the first DRC LMB after sending unplug requests to all LMBs of the DIMM, where every DRC is being asserted inside the loop. This means that the first DRC is being asserted twice. Remove the duplicated assert. Signed-off-by: Daniel Henrique Barboza Message-Id: <20210302141019.153729-2-danielhb413@gmail.com> Signed-off-by: David Gibson --- hw/ppc/spapr.c | 1 - 1 file changed, 1 deletion(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index aca3ef9d58..b579830832 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -3703,7 +3703,6 @@ static void spapr_memory_unplug_request(HotplugHandler *hotplug_dev, drc = spapr_drc_by_id(TYPE_SPAPR_DRC_LMB, addr_start / SPAPR_MEMORY_BLOCK_SIZE); - g_assert(drc); spapr_hotplug_req_remove_by_count_indexed(SPAPR_DR_CONNECTOR_TYPE_LMB, nr_lmbs, spapr_drc_index(drc)); } From patchwork Wed Mar 10 04:10:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 12126945 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8D838C433E0 for ; Wed, 10 Mar 2021 04:29:30 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id E5A6664FE3 for ; Wed, 10 Mar 2021 04:29:29 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E5A6664FE3 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:35806 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJqTP-0003M4-VI for qemu-devel@archiver.kernel.org; Tue, 09 Mar 2021 23:29:28 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:48338) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqBJ-0004GV-Pk; Tue, 09 Mar 2021 23:10:45 -0500 Received: from bilbo.ozlabs.org ([203.11.71.1]:55091 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJqBH-0004FU-MY; Tue, 09 Mar 2021 23:10:45 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id 4DwJWf3NNZz9sj0; Wed, 10 Mar 2021 15:10:06 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1615349406; bh=MUfs4+JETeZLAXM9XzFlrhnaPX5y/Vtl3oI/tTgM+sw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MpeWv7ee6r98bXNw+a2bQmkKFbW5AWRMwbRFVq1ArWL2je6+Kcf2PLmQEIon4Nm/t njU+DBDeX3nPvsbu/5sw0AjMnm9nXH30YtUU8plR4te4i/Ns4wIWwpoU2H0pHeqZPh FKVefwpJI88ZZz/rZ+i/QNaVDYs+cGsGG4m73Jsk= From: David Gibson To: peter.maydell@linaro.org, groug@kaod.org Subject: [PULL 20/20] spapr.c: send QAPI event when memory hotunplug fails Date: Wed, 10 Mar 2021 15:10:02 +1100 Message-Id: <20210310041002.333813-21-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210310041002.333813-1-david@gibson.dropbear.id.au> References: <20210310041002.333813-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Received-SPF: pass client-ip=203.11.71.1; envelope-from=dgibson@ozlabs.org; helo=ozlabs.org X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.249, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Daniel Henrique Barboza , qemu-ppc@nongnu.org, qemu-devel@nongnu.org, David Gibson Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza Recent changes allowed the pSeries machine to rollback the hotunplug process for the DIMM when the guest kernel signals, via a reconfiguration of the DR connector, that it's not going to release the LMBs. Let's also warn QAPI listerners about it. One place to do it would be right after the unplug state is cleaned up, spapr_clear_pending_dimm_unplug_state(). This would mean that the function is now doing more than cleaning up the pending dimm state though. This patch does the following changes in spapr.c: - send a QAPI event to inform that we experienced a failure in the hotunplug of the DIMM; - rename spapr_clear_pending_dimm_unplug_state() to spapr_memory_unplug_rollback(). This is a better fit for what the function is now doing, and it makes callers care more about what the function goal is and less about spapr.c internals such as clearing the pending dimm unplug state. Reviewed-by: Greg Kurz Signed-off-by: Daniel Henrique Barboza Message-Id: <20210302141019.153729-3-danielhb413@gmail.com> Signed-off-by: David Gibson --- hw/ppc/spapr.c | 13 +++++++++++-- hw/ppc/spapr_drc.c | 5 ++--- include/hw/ppc/spapr.h | 3 +-- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index b579830832..d56418ca29 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -28,6 +28,7 @@ #include "qemu-common.h" #include "qemu/datadir.h" #include "qapi/error.h" +#include "qapi/qapi-events-machine.h" #include "qapi/visitor.h" #include "sysemu/sysemu.h" #include "sysemu/hostmem.h" @@ -3575,14 +3576,14 @@ static SpaprDimmState *spapr_recover_pending_dimm_state(SpaprMachineState *ms, return spapr_pending_dimm_unplugs_add(ms, avail_lmbs, dimm); } -void spapr_clear_pending_dimm_unplug_state(SpaprMachineState *spapr, - DeviceState *dev) +void spapr_memory_unplug_rollback(SpaprMachineState *spapr, DeviceState *dev) { SpaprDimmState *ds; PCDIMMDevice *dimm; SpaprDrc *drc; uint32_t nr_lmbs; uint64_t size, addr_start, addr; + g_autofree char *qapi_error = NULL; int i; if (!dev) { @@ -3616,6 +3617,14 @@ void spapr_clear_pending_dimm_unplug_state(SpaprMachineState *spapr, drc->unplug_requested = false; addr += SPAPR_MEMORY_BLOCK_SIZE; } + + /* + * Tell QAPI that something happened and the memory + * hotunplug wasn't successful. + */ + qapi_error = g_strdup_printf("Memory hotunplug rejected by the guest " + "for device %s", dev->id); + qapi_event_send_mem_unplug_error(dev->id, qapi_error); } /* Callback to be called during DRC release. */ diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c index 98b626acf9..8a71b03800 100644 --- a/hw/ppc/spapr_drc.c +++ b/hw/ppc/spapr_drc.c @@ -1231,12 +1231,11 @@ static void rtas_ibm_configure_connector(PowerPCCPU *cpu, /* * This indicates that the kernel is reconfiguring a LMB due to - * a failed hotunplug. Clear the pending unplug state for the whole - * DIMM. + * a failed hotunplug. Rollback the DIMM unplug process. */ if (spapr_drc_type(drc) == SPAPR_DR_CONNECTOR_TYPE_LMB && drc->unplug_requested) { - spapr_clear_pending_dimm_unplug_state(spapr, drc->dev); + spapr_memory_unplug_rollback(spapr, drc->dev); } if (!drc->fdt) { diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index d6edeaaaff..47cebaf3ac 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -847,8 +847,7 @@ int spapr_hpt_shift_for_ramsize(uint64_t ramsize); int spapr_reallocate_hpt(SpaprMachineState *spapr, int shift, Error **errp); void spapr_clear_pending_events(SpaprMachineState *spapr); void spapr_clear_pending_hotplug_events(SpaprMachineState *spapr); -void spapr_clear_pending_dimm_unplug_state(SpaprMachineState *spapr, - DeviceState *dev); +void spapr_memory_unplug_rollback(SpaprMachineState *spapr, DeviceState *dev); int spapr_max_server_number(SpaprMachineState *spapr); void spapr_store_hpte(PowerPCCPU *cpu, hwaddr ptex, uint64_t pte0, uint64_t pte1);