From patchwork Mon Aug 28 09:37:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Haibo Xu X-Patchwork-Id: 1826680 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=YXgxsiCQ; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=fwts-devel-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4RZ4wN644Jz1yhW for ; Mon, 28 Aug 2023 19:27:48 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1qaYX7-0002lQ-65; Mon, 28 Aug 2023 09:27:41 +0000 Received: from mgamail.intel.com ([192.55.52.115]) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1qaYX2-0002je-Vo for fwts-devel@lists.ubuntu.com; Mon, 28 Aug 2023 09:27:37 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1693214856; x=1724750856; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=zvvA8wKGww3y7XNub0eCUDT1utj+ITzAZkLPdxlHSKc=; b=YXgxsiCQRGj8eL6wZfoPJJ6nV6CRxl2nU0evVR2iCJf3vygSEDJZc00N X+bVo3u8ZePDJm3mZK0zpclTHubfkiwnx1nMi1UzkwYTtPBk58U8KFe5A 5VxjSF4HuS4rP5UQxsTHAV+Q5hjqKbf9C793+1NuZ0K59QIfLoofPfO0T ZdU7RJxGgjXaDMtWRxga9f+LDfqc3N0/8xDlll5GTOc7txWxD3SVY7CZJ 842PYJ2GVlZTXl4J71h2++I+SbWV9pX09noyL02UY1+Iu79F2tCqRWslr 3cygR2TysfuIMWIzzTfQpFy9LrzuV62tog0mq6zQHGjr8uFPmuXRLaAwu A==; X-IronPort-AV: E=McAfee;i="6600,9927,10815"; a="375028376" X-IronPort-AV: E=Sophos;i="6.02,207,1688454000"; d="scan'208";a="375028376" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Aug 2023 02:27:30 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10815"; a="738187292" X-IronPort-AV: E=Sophos;i="6.02,207,1688454000"; d="scan'208";a="738187292" Received: from haibo-optiplex-7090.sh.intel.com ([10.239.159.132]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Aug 2023 02:27:29 -0700 From: Haibo Xu To: fwts-devel@lists.ubuntu.com Subject: [RFC PATCH 2/2] acpi: madt: Add AIA and PLIC sub-tables test for riscv Date: Mon, 28 Aug 2023 17:37:04 +0800 Message-Id: X-Mailer: git-send-email 2.34.1 In-Reply-To: <7106e6c0372debb29b3a4fd2d7bb1bcfa8ef1796.1693215246.git.haibo1.xu@intel.com> References: <7106e6c0372debb29b3a4fd2d7bb1bcfa8ef1796.1693215246.git.haibo1.xu@intel.com> MIME-Version: 1.0 X-BeenThere: fwts-devel@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Firmware Test Suite Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: heinrich.schuchardt@canonical.com Errors-To: fwts-devel-bounces@lists.ubuntu.com Sender: "fwts-devel" --- src/acpi/madt/madt.c | 303 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 302 insertions(+), 1 deletion(-) diff --git a/src/acpi/madt/madt.c b/src/acpi/madt/madt.c index 2b857a08..4f115e8e 100644 --- a/src/acpi/madt/madt.c +++ b/src/acpi/madt/madt.c @@ -586,7 +586,18 @@ static const char *madt_sub_names[] = { /* 0x0e */ "GICR Redistributor", /* 0x0f */ "GIC Interrupt Translation Service (ITS)", /* 0x10 */ "Multiprocessor Wakeup", - /* 0x11 - 0x7f */ "Reserved. OSPM skips structures of the reserved type.", + /* 0x11 */ "FWTS_MADT_CORE_PIC", + /* 0x12 */ "FWTS_MADT_LIO_PIC", + /* 0x13 */ "FWTS_MADT_HT_PIC", + /* 0x14 */ "FWTS_MADT_EIO_PIC", + /* 0x15 */ "FWTS_MADT_MSI_PIC", + /* 0x16 */ "FWTS_MADT_BIO_PIC", + /* 0x17 */ "FWTS_MADT_LPC_PIC", + /* 0x18 */ "FWTS_MADT_RINTC", + /* 0x19 */ "FWTS_MADT_IMSIC", + /* 0x1a */ "FWTS_MADT_APLIC", + /* 0x1b */ "FWTS_MADT_PLIC", + /* 0x1c - 0x7f */ "Reserved. OSPM skips structures of the reserved type.", /* 0x80 - 0xff */ "Reserved for OEM use", NULL }; @@ -1501,6 +1512,280 @@ static void madt_ioapic_sapic_compare(fwts_framework *fw, "SAPIC entry."); } +static int madt_rintc(fwts_framework *fw, + fwts_acpi_madt_sub_table_header *hdr, + uint8_t *data) +{ + /* specific checks for subtable type 0x18: RINTC */ + fwts_acpi_madt_rintc *rintc = (fwts_acpi_madt_rintc *) data; + + if (rintc->version != 1) + fwts_failed(fw, LOG_LEVEL_LOW, + "MADTRINTCVersion", + "MADT %s version field should be 1, " + "but instead got 0x%" PRIx8 ".", + madt_sub_names[hdr->type], rintc->version); + else + fwts_passed(fw, + "MADT %s version field is properly set " + "to 1.", + madt_sub_names[hdr->type]); + + if (rintc->reserved) + fwts_failed(fw, LOG_LEVEL_LOW, + "MADTRINTCReservedNonZero", + "MADT %s reserved field should be 0, " + "instead got 0x%" PRIx8 ".", + madt_sub_names[hdr->type], rintc->reserved); + else + fwts_passed(fw, + "MADT %s reserved field is properly set " + "to 0.", + madt_sub_names[hdr->type]); + + if (rintc->flags & 0xfffffffc) + fwts_failed(fw, LOG_LEVEL_LOW, + "MADTRINTCFlags", + "MADT %s flags, bit 2..31 are reserved " + "and should be 0, but are set as: 0x%" PRIx32 ".", + madt_sub_names[hdr->type], rintc->flags); + else + fwts_passed(fw, + "MADT %s flags, bit 2..31 are reserved " + "and properly set to 0.", + madt_sub_names[hdr->type]); + + madt_find_processor_uid(fw, rintc->uid, "RINTC"); + + return (hdr->length - sizeof(fwts_acpi_madt_sub_table_header)); +} + +static int madt_imsic(fwts_framework *fw, + fwts_acpi_madt_sub_table_header *hdr, + uint8_t *data) +{ + /* specific checks for subtable type 0x19: IMSIC */ + fwts_acpi_madt_imsic *imsic = (fwts_acpi_madt_imsic *) data; + + if (imsic->version != 1) + fwts_failed(fw, LOG_LEVEL_LOW, + "MADTIMSICVersion", + "MADT %s version field should be 1, " + "but instead got 0x%" PRIx8 ".", + madt_sub_names[hdr->type], imsic->version); + else + fwts_passed(fw, + "MADT %s version field is properly set " + "to 1.", + madt_sub_names[hdr->type]); + + if (imsic->reserved) + fwts_failed(fw, LOG_LEVEL_LOW, + "SPECMADTMIMSICReservedNonZero", + "MADT %s reserved field should be 0, " + "instead got 0x%" PRIx8 ".", + madt_sub_names[hdr->type], imsic->reserved); + else + fwts_passed(fw, + "MADT %s reserved field is properly set " + "to 0.", + madt_sub_names[hdr->type]); + + if (imsic->flags) + fwts_failed(fw, LOG_LEVEL_LOW, + "MADTIMSICFlags", + "MADT %s flags field should be 0, " + "but are set as: 0x%" PRIx32 ".", + madt_sub_names[hdr->type], imsic->flags); + else + fwts_passed(fw, + "MADT %s flags field should be 0 " + "and properly set to 0.", + madt_sub_names[hdr->type]); + + if (imsic->num_ids < 63 || imsic->num_ids > 2047) + fwts_failed(fw, LOG_LEVEL_LOW, + "MADTIMSICNumIDs", + "MADT %s num_ids field should be 63..2047, " + "but are set as: 0x%" PRIx16 ".", + madt_sub_names[hdr->type], imsic->num_ids); + else + fwts_passed(fw, + "MADT %s num_ids field should be 63..2047 " + "and properly set.", + madt_sub_names[hdr->type]); + + if (imsic->num_guest_ids < 63 || imsic->num_guest_ids > 2047) + fwts_failed(fw, LOG_LEVEL_LOW, + "MADTIMSICNumGuestIDs", + "MADT %s num_guest_ids field should be 63..2047, " + "but are set as: 0x%" PRIx16 ".", + madt_sub_names[hdr->type], imsic->num_guest_ids); + else + fwts_passed(fw, + "MADT %s num_guest_ids field should be 63..2047 " + "and properly set.", + madt_sub_names[hdr->type]); + + if (imsic->guest_index_bits > 7) + fwts_failed(fw, LOG_LEVEL_LOW, + "MADTIMSICGuestIndexBits", + "MADT %s guest_index_bits field should be 0..7, " + "but are set as: 0x%" PRIx8 ".", + madt_sub_names[hdr->type], imsic->guest_index_bits); + else + fwts_passed(fw, + "MADT %s guest_index_bits field should be 0..7 " + "and properly set.", + madt_sub_names[hdr->type]); + + if (imsic->hart_index_bits > 15) + fwts_failed(fw, LOG_LEVEL_LOW, + "MADTIMSICHartIndexBits", + "MADT %s hart_index_bits field should be 0..15, " + "but are set as: 0x%" PRIx8 ".", + madt_sub_names[hdr->type], imsic->hart_index_bits); + else + fwts_passed(fw, + "MADT %s hart_index_bits field should be 0..15 " + "and properly set.", + madt_sub_names[hdr->type]); + + if (imsic->group_index_bits > 7) + fwts_failed(fw, LOG_LEVEL_LOW, + "MADTIMSICGroupIndexBits", + "MADT %s group_index_bits field should be 0..7, " + "but are set as: 0x%" PRIx8 ".", + madt_sub_names[hdr->type], imsic->group_index_bits); + else + fwts_passed(fw, + "MADT %s group_index_bits field should be 0..7 " + "and properly set.", + madt_sub_names[hdr->type]); + + if (imsic->group_index_shift > 55) + fwts_failed(fw, LOG_LEVEL_LOW, + "MADTIMSICGroupIndexShift", + "MADT %s group_index_shift field should be 0..55, " + "but are set as: 0x%" PRIx8 ".", + madt_sub_names[hdr->type], imsic->group_index_shift); + else + fwts_passed(fw, + "MADT %s group_index_shift field should be 0..55 " + "and properly set.", + madt_sub_names[hdr->type]); + + return (hdr->length - sizeof(fwts_acpi_madt_sub_table_header)); +} + +static int madt_aplic(fwts_framework *fw, + fwts_acpi_madt_sub_table_header *hdr, + uint8_t *data) +{ + /* specific checks for subtable type 0x1a: APLIC */ + fwts_acpi_madt_aplic *aplic = (fwts_acpi_madt_aplic *) data; + + if (aplic->version != 1) + fwts_failed(fw, LOG_LEVEL_LOW, + "MADTAPLICVersion", + "MADT %s version field should be 1, " + "but instead got 0x%" PRIx8 ".", + madt_sub_names[hdr->type], aplic->version); + else + fwts_passed(fw, + "MADT %s version field is properly set " + "to 1.", + madt_sub_names[hdr->type]); + + if (aplic->flags) + fwts_failed(fw, LOG_LEVEL_LOW, + "MADTAPLICFlags", + "MADT %s flags field should be 0, " + "but are set as: 0x%" PRIx32 ".", + madt_sub_names[hdr->type], aplic->flags); + else + fwts_passed(fw, + "MADT %s flags field should be 0 " + "and properly set to 0.", + madt_sub_names[hdr->type]); + + if (aplic->num_sources < 1 || aplic->num_sources > 1023) + fwts_failed(fw, LOG_LEVEL_MEDIUM, + "MADTAPLICNumSources", + "MADT %s num_sources field is %" PRIu16 ", must be 1..1023.", + madt_sub_names[hdr->type], aplic->num_sources); + else + fwts_passed(fw, + "MADT %s num_sources field is %" PRIu16 " and in 1..1023.", + madt_sub_names[hdr->type], aplic->num_sources); + + if (aplic->addr == 0) + fwts_failed(fw, LOG_LEVEL_MEDIUM, + "MADTAPLICADDR", + "MADT %s addr field is 0, appears not defined.", + madt_sub_names[hdr->type]); + else + fwts_passed(fw, + "MADT %s addr field is properly defined.", + madt_sub_names[hdr->type]); + + return (hdr->length - sizeof(fwts_acpi_madt_sub_table_header)); +} + +static int madt_plic(fwts_framework *fw, + fwts_acpi_madt_sub_table_header *hdr, + uint8_t *data) +{ + /* specific checks for subtable type 0x1b: PLIC */ + fwts_acpi_madt_plic *plic = (fwts_acpi_madt_plic *) data; + + if (plic->version != 1) + fwts_failed(fw, LOG_LEVEL_LOW, + "MADTPLICVersion", + "MADT %s version field should be 1, " + "but instead got 0x%" PRIx8 ".", + madt_sub_names[hdr->type], plic->version); + else + fwts_passed(fw, + "MADT %s version field is properly set " + "to 1.", + madt_sub_names[hdr->type]); + + if (plic->num_irqs < 1 || plic->num_irqs > 1023) + fwts_failed(fw, LOG_LEVEL_MEDIUM, + "MADTPLICNumIrqs", + "MADT %s num_irqs field is %" PRIu16 ", must be 1..1023.", + madt_sub_names[hdr->type], plic->num_irqs); + else + fwts_passed(fw, + "MADT %s num_irqs field is %" PRIu16 " and in 1..1023.", + madt_sub_names[hdr->type], plic->num_irqs); + + if (plic->flags) + fwts_failed(fw, LOG_LEVEL_LOW, + "MADTPLICFlags", + "MADT %s flags field should be 0, " + "but are set as: 0x%" PRIx32 ".", + madt_sub_names[hdr->type], plic->flags); + else + fwts_passed(fw, + "MADT %s flags field should be 0 " + "and properly set to 0.", + madt_sub_names[hdr->type]); + + if (plic->base_addr == 0) + fwts_failed(fw, LOG_LEVEL_MEDIUM, + "MADTPLICADDR", + "MADT %s base_addr field is 0, appears not defined.", + madt_sub_names[hdr->type]); + else + fwts_passed(fw, + "MADT %s base_addr field is properly defined.", + madt_sub_names[hdr->type]); + + return (hdr->length - sizeof(fwts_acpi_madt_sub_table_header)); +} + static int madt_subtables(fwts_framework *fw) { fwts_acpi_table_madt *madt = (fwts_acpi_table_madt *)mtable->data; @@ -1684,6 +1969,22 @@ static int madt_subtables(fwts_framework *fw) skip = madt_mp_wakup(fw, hdr, data); break; + case FWTS_MADT_RINTC: + skip = madt_rintc(fw, hdr, data); + break; + + case FWTS_MADT_IMSIC: + skip = madt_imsic(fw, hdr, data); + break; + + case FWTS_MADT_APLIC: + skip = madt_aplic(fw, hdr, data); + break; + + case FWTS_MADT_PLIC: + skip = madt_plic(fw, hdr, data); + break; + case FWTS_MADT_RESERVED: fwts_failed(fw, LOG_LEVEL_MEDIUM, "SPECMADTSubReservedID",