From nobody Sat Jul 25 01:34:41 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 41CDD449B32 for ; Tue, 21 Jul 2026 03:39:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784605144; cv=none; b=eQNvLk9bi4wlDzrx8SKiwGNDLsidqnb4iKC0AUz6wZEnQN6reCd7LkXoTb8a2by1M9aJv3rbQg8nwKLIOAB9UokJCbyKO9r92QHvfcEXFFg9aZOrmmuuuU/6WTunPMHP7tEsYPyJu0CZ+WJcw9mYr9i5ubZQ2dc13PDiLpgG8TM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784605144; c=relaxed/simple; bh=v9JXRPUfxHPmOi/HP5FUjyHOagzYDAUzzeedzeQIytg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=FTMroSYJUwKWoWli8VqGUGDkIhaIUDaKWZfh0+tzjm2GkORE5wMO1znbxvKK7phdsri87YQM/mLqhMMi5MSR0CEDxInGuAn4nM8m/azx4OIx45bKFlFIwupNUgBa9HtkKAgCSuAzgbvSPZHr0g7COz2ZM96BoJfwIxc/itefcAk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=OJa8KDUr; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="OJa8KDUr" Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66KNCu0t1675724; Tue, 21 Jul 2026 03:38:46 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pp1; bh=NM/7R9 9hkOluMddz+HFQVasX/1zpzgZC8rf6KtJXGeQ=; b=OJa8KDUrYaoDJ8ZpyXOguS cvs0hfC6Pi3/x0hiAszDPsqQpdtwAXgK7XO1BPKI+fZt1T5FIOhKY7NVQNakPea/ /MssD8BhKFUuyMIXtDAjnjAoGCECWDxEaXDY4SaynHGW3Lmpd7YiXgymsE1AmylH nKXDmrhQ5QRJIjQMZayGAvtZnYMdFc984pS7h8E8xsHtkh1ji5JUSDdF6FgZ1bOO WM9DhCWrIOnm3CtjfoQlf8FtXv2oeXQa9AKH+a4h/8UDUe20wVm2MF1n7Gxmerv9 Zr0tYi0q9I04+//VrrrvN3zxQLxxVp/8VvCaUIe+aU88uCa5Ho8gXbCgS8/9zDhA == Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4fg77aap24-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Jul 2026 03:38:45 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 66L3YicS017703; Tue, 21 Jul 2026 03:38:44 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4fgm6w0nxb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Jul 2026 03:38:44 +0000 (GMT) Received: from smtpav07.fra02v.mail.ibm.com (smtpav07.fra02v.mail.ibm.com [10.20.54.106]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 66L3ccaF28377356 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 21 Jul 2026 03:38:39 GMT Received: from smtpav07.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D5C352004B; Tue, 21 Jul 2026 03:38:38 +0000 (GMT) Received: from smtpav07.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C20D220040; Tue, 21 Jul 2026 03:38:33 +0000 (GMT) Received: from Narayanas-MacBook-Pro.ibm.com (unknown [9.124.218.117]) by smtpav07.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 21 Jul 2026 03:38:33 +0000 (GMT) From: Narayana Murty N To: mahesh@linux.ibm.com, maddy@linux.ibm.com, mpe@ellerman.id.au, christophe.leroy@csgroup.eu, gregkh@linuxfoundation.org, oohall@gmail.com, npiggin@gmail.com Cc: linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, tyreld@linux.ibm.com, vaibhav@linux.ibm.com, sbhat@linux.ibm.com, ganeshgr@linux.ibm.com, sourabhjain@linux.ibm.com, haren@linux.ibm.com, nnmlinux@linux.ibm.com, thuth@redhat.com Subject: [PATCH v3 1/5] powerpc/rtas: Handle ibm,open-errinjct return format Date: Tue, 21 Jul 2026 09:08:01 +0530 Message-ID: <20260721033815.5300-2-nnmlinux@linux.ibm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260721033815.5300-1-nnmlinux@linux.ibm.com> References: <20260721033815.5300-1-nnmlinux@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-ORIG-GUID: l2RZP_Wj_IAkMOHLbthyawBsN66VeM8N X-Proofpoint-Spam-Info: AW1haW4tMjYwNzIxMDAzMCBTYWx0ZWRfX7srmq1mRnfIm nPdcwRr8RMNAXzp8E450L6LB3mll0AfaPXov2+7N+lYsuZ6Q/eJ/F7j0tB1jAwIeY/rwGx4WhHm ZdesS1mh5GTD4OdQj3VkM2DiBymIVgY= X-Proofpoint-GUID: JLaqt-gZ6O7xzQTZsGLxBUoTLl4do0DV X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzIxMDAzMCBTYWx0ZWRfX61NHoE/IDIrb UUlCU7U3N9SNdM5K0jgKXOvM32p1o6rt12j8awveFq8fDlDYNt0FMo86Sg2IkVRXjtcOiCdhsjl Eh434N1+vQnfvapvRIhEuhr13XsCtNdLvD+VdpL43n8Tohf4VmiT76d2Q4p8W/jWaZcvBoKTzUa 9wTE7iCNzJ56Y2u8OnF2qobcJ5ydtgljiXfpDkXDp9i0qqHLeCxYS4D4yUZBu8gOtM3Iu/mfE5z AcmteqLDVP73dJVF/U8QxCiChzDFJru+8AS7Ug88GkR2EPuDSRwLImBgd+YkFg7dyCTf7JZenUc EoDTHeMeN7ToRuBoKsNWSJfn1L3M96cjy/Qjr5TjnOf0B0DtrEQmNC2bPDthEeYPc9oFZjr1528 zYSaZlJrafS4aEDfQ3if3lA9QAhWjZJrepQnAFHHYWNBUARte8ACAdpBadgya2wGN231ZW6O/cU eqgWgZt7Gy0LcPGelgw== X-Authority-Analysis: v=2.4 cv=K7AS2SWI c=1 sm=1 tr=0 ts=6a5ee9c6 cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=1mVJ_uiqAAAA:8 a=VnNF1IyMAAAA:8 a=mrpyPNaNM-fztfjREsEA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 a=h67g7WpEjx8dfGT80pje:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-20_06,2026-07-20_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 suspectscore=0 bulkscore=0 clxscore=1015 priorityscore=1501 spamscore=0 phishscore=0 malwarescore=0 adultscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607210030 PAPR specifies that ibm,open-errinjct has a unique return-cell layout: rets[0] =3D injection session token (output parameter) rets[1] =3D status code This differs from every other RTAS call, where: rets[0] =3D status code rets[1..] =3D output parameters As a result, the existing rtas_call() convention =E2=80=94 return value is = the RTAS status, outputs[] receives the non-status output values =E2=80=94 must= be preserved while correctly extracting status from rets[1] for this one call. Add rtas_token_is_open_errinjct() and rtas_status_from_args() helpers. rtas_status_from_args() selects the correct status cell based on the token, and the output-copy loop in rtas_call() is updated so that for ibm,open-errinjct: rtas_call() return =3D rets[1] (RTAS status) outputs[0] =3D rets[0] (session token) For all other calls the behaviour is unchanged: return value is rets[0] and outputs[] receives rets[1..nret-1]. The sys_rtas userspace path is not modified: copy_to_user() still copies raw RTAS return cells (rets[0..nret-1]) to userspace. Callers passing a single output int (nret =3D=3D 2) are safe because we write at most nret-1 values into outputs[], never all nret cells. Also move the '/* A -1 return code...*/' comment to immediately precede the if (ret =3D=3D -1) check it describes, and remove the redundant stale else branch that re-assigned ret. Reference: OpenPOWER PAPR documentation https://files.openpower.foundation/s/XFgfMaqLMD5Bcm8 Signed-off-by: Narayana Murty N --- arch/powerpc/kernel/rtas.c | 51 ++++++++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c index 8d81c1e7a8db..27d53f34494d 100644 --- a/arch/powerpc/kernel/rtas.c +++ b/arch/powerpc/kernel/rtas.c @@ -1117,6 +1117,29 @@ static bool token_is_restricted_errinjct(s32 token) token =3D=3D rtas_function_token(RTAS_FN_IBM_ERRINJCT); } =20 +/** + * rtas_token_is_open_errinjct() - Test whether @token identifies ibm,open= -errinjct. + */ +static bool rtas_token_is_open_errinjct(int token) +{ + return token =3D=3D rtas_function_token(RTAS_FN_IBM_OPEN_ERRINJCT); +} + +/** + * rtas_status_from_args() - Extract the RTAS status code from a completed + * call's return-cell array. + * + * For ibm,open-errinjct the status lives in rets[1]; for every other + * RTAS function it lives in rets[0]. + */ +static int rtas_status_from_args(int token, struct rtas_args *args, int nr= et) +{ + if (rtas_token_is_open_errinjct(token) && nret > 1) + return be32_to_cpu(args->rets[1]); + + return nret > 0 ? be32_to_cpu(args->rets[0]) : 0; +} + /** * rtas_call() - Invoke an RTAS firmware function. * @token: Identifies the function being invoked. @@ -1213,15 +1236,29 @@ int rtas_call(int token, int nargs, int nret, int *= outputs, ...) va_rtas_call_unlocked(args, token, nargs, nret, list); va_end(list); =20 - /* A -1 return code indicates that the last command couldn't - be completed due to a hardware error. */ - if (be32_to_cpu(args->rets[0]) =3D=3D -1) + ret =3D rtas_status_from_args(token, args, nret); + + /* + * A -1 return code indicates that the last command couldn't + * be completed due to a hardware error. + */ + if (ret =3D=3D -1) buff_copy =3D __fetch_rtas_last_error(NULL); =20 - if (nret > 1 && outputs !=3D NULL) - for (i =3D 0; i < nret-1; ++i) - outputs[i] =3D be32_to_cpu(args->rets[i + 1]); - ret =3D (nret > 0) ? be32_to_cpu(args->rets[0]) : 0; + if (nret > 1 && outputs !=3D NULL) { + if (rtas_token_is_open_errinjct(token)) { + /* + * ibm,open-errinjct: rets[0]=3Dsession token, rets[1]=3Dstatus. + * Expose session token in outputs[0]; skip rets[1] (status). + */ + outputs[0] =3D be32_to_cpu(args->rets[0]); + for (i =3D 1; i < nret - 1; ++i) + outputs[i] =3D be32_to_cpu(args->rets[i + 1]); + } else { + for (i =3D 0; i < nret - 1; ++i) + outputs[i] =3D be32_to_cpu(args->rets[i + 1]); + } + } =20 lockdep_unpin_lock(&rtas_lock, cookie); raw_spin_unlock_irqrestore(&rtas_lock, flags); --=20 2.54.0 From nobody Sat Jul 25 01:34:41 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1C118E571 for ; Tue, 21 Jul 2026 03:39:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784605145; cv=none; b=Gg5iR/16ZenxYUDLXns+Sk4aNOvykqEmA9Qa+tY2V4AJDvwQ1hzvlBKGCnqWgZKN57qYio6fEwRuQBlkzSaGG7myo+w0x/UwUecswAy6+bAVyjlTq69VfBUJ325AwQkS3q0V9zFp/bumTrxCCyGvGyeN3LqKwk2v8ROQe4ubZlQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784605145; c=relaxed/simple; bh=QNMb/4nXES/vPjurtW3PPY651LCzLVrT4/AjDa0vgpQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dr7wvHrDb3FFALUucjazQBN4J+kvoysPXZCjLvhN1HTMSh2Oj4jPaCsbIZvSdG9rWjCNRZ/AYb3Go/mNrlMeUw0mWVQm9gRxNYEdpeD8w3ei4zSloDtJhWOZhn3bbiE4z9+AmJ5wH9HPawBe1Wpe1E3Mrv0E/rg9rH/ypJIzsvU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=GnLOaV+w; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="GnLOaV+w" Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66KND3PB1676443; Tue, 21 Jul 2026 03:38:50 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=FdEP23wB1gY5cRnjD i3zTlaxnfi3YURRFyYUYQF9rDk=; b=GnLOaV+wQtRQecNHBw0MvUcenUAGukO8W kr8JbRldzGiIFYT993UsUnA+H0dQTdqc735rwN8L7w+bqSZyeD/rHaS5dAyPiMoV qmBpYzHdxOYXdCTQlTr8x+bNR38pCAUhQIl/4Uv1TabABli6QuzKkAHsljCACPlm f+aPlaKrmTLQQ82OY/GBtmenmVqF0C3yL4EZXl9T4e3g1WaEpabrFNWGVLiI8LFm hzrXtTqHuC5vX4zHUCI9nOo/+acKKLdzhro+gNPDuxCFsQlO5NgeUF+vWwpL5C2A tSER1y3Fr1r6fRaCV2yz/E5v5wAjmr8KrHhhSCmEuYPbAjQZy8/fw== Received: from ppma11.dal12v.mail.ibm.com (db.9e.1632.ip4.static.sl-reverse.com [50.22.158.219]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4fg77aap2b-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Jul 2026 03:38:49 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 66L3JaEM016190; Tue, 21 Jul 2026 03:38:49 GMT Received: from smtprelay02.fra02v.mail.ibm.com ([9.218.2.226]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4fgpgy8a1v-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Jul 2026 03:38:48 +0000 (GMT) Received: from smtpav07.fra02v.mail.ibm.com (smtpav07.fra02v.mail.ibm.com [10.20.54.106]) by smtprelay02.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 66L3ch3v53412204 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 21 Jul 2026 03:38:43 GMT Received: from smtpav07.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A5E652004B; Tue, 21 Jul 2026 03:38:43 +0000 (GMT) Received: from smtpav07.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 478A820040; Tue, 21 Jul 2026 03:38:39 +0000 (GMT) Received: from Narayanas-MacBook-Pro.ibm.com (unknown [9.124.218.117]) by smtpav07.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 21 Jul 2026 03:38:39 +0000 (GMT) From: Narayana Murty N To: mahesh@linux.ibm.com, maddy@linux.ibm.com, mpe@ellerman.id.au, christophe.leroy@csgroup.eu, gregkh@linuxfoundation.org, oohall@gmail.com, npiggin@gmail.com Cc: linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, tyreld@linux.ibm.com, vaibhav@linux.ibm.com, sbhat@linux.ibm.com, ganeshgr@linux.ibm.com, sourabhjain@linux.ibm.com, haren@linux.ibm.com, nnmlinux@linux.ibm.com, thuth@redhat.com Subject: [PATCH v3 2/5] powerpc/rtas: Allocate ibm,errinjct buffer below RTAS limit Date: Tue, 21 Jul 2026 09:08:02 +0530 Message-ID: <20260721033815.5300-3-nnmlinux@linux.ibm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260721033815.5300-1-nnmlinux@linux.ibm.com> References: <20260721033815.5300-1-nnmlinux@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-ORIG-GUID: twXFHZE4nGCvlxpQbm6v5h019NP8WBoy X-Proofpoint-Spam-Info: AW1haW4tMjYwNzIxMDAzMCBTYWx0ZWRfX2ZpqpFX3Tz+U 0d2QDduG5xWG6BpH7HIyBg3kpobSKXC60O3YSQ0TYGYrI56AJX65MzFpG1PfKsgAlESyQcxLswq JDJgmcJxHLZRfFzJn2cxlxuznaWOFOU= X-Proofpoint-GUID: LdUIXWTSoXhF4F7gsCsaMiykgI9trZnU X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzIxMDAzMCBTYWx0ZWRfXxxgB4Xk9ghYx at6vlVevxydC6EGs9XosBbRsiLasDfzl1aF7QkQP5DORxnpBnzo95ksxif4klwsg74GOeabqKZ3 10O7nzCoua4FtRWsXxO0I8vT3SdfiiIybh4w3FRYtnIlgLdXWS5EC7RBuOitIFmVfqr4fVBEBIQ kq/Rxlu1g9tbo6rmRIVX0/QlB9SKrV6jHLrqGE0RIIKSPWOJAabLcwoLxqySvHPCk/1QXQTWKAo sBV49u1RYXQD2iHedY6hB51+s1FDl9cO8Qi0f+tQ3MS8ly9GBXQt8WKca5YqZmcooFFf0MlB750 EG+zy1xRFshgusg01+qnSvBJzBw6R/NRcpYLkJk2yNEsPXmTTmaqc1KGCmvie9pekRbFS+/IVji 7Bh3P5dQPB0tLOfuT9miJcI68p+J347+UHuNUdeuIWP1+HPlXelkSC1YDSrtYcz/hv3uAtFrtWq ntPNh5otQIEKCkymZDA== X-Authority-Analysis: v=2.4 cv=K7AS2SWI c=1 sm=1 tr=0 ts=6a5ee9ca cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=RAioF0-LDSMA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VnNF1IyMAAAA:8 a=k2PC6WYSJxEsxUIcpbgA:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-20_06,2026-07-20_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 suspectscore=0 bulkscore=0 clxscore=1015 priorityscore=1501 spamscore=0 phishscore=0 malwarescore=0 adultscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607210030 Content-Type: text/plain; charset="utf-8" ibm,errinjct requires a caller-provided work buffer whose physical address is passed to RTAS firmware. A static C array such as: char rtas_errinjct_buf[1024] __aligned(SZ_1K); only guarantees alignment, not physical placement. If the array lands above the RTAS-safe range (RTAS_INSTANTIATE_MAX, 1 GB) or above 4 GB, RTAS receives a truncated or invalid address and the injection call will fail silently or corrupt memory. Instead, introduce rtas_errinjct_buf as a global unsigned long storing the physical address allocated during rtas_initialize() using memblock_phys_alloc_range() with the same rtas_region upper bound used for rtas_rmo_buf. This matches the existing placement model for RTAS-accessible buffers and guarantees the physical address fits in 32 bits. Usage: void *buf =3D __va(rtas_errinjct_buf); /* kernel VA to fill */ u32 buf_phys =3D lower_32_bits(rtas_errinjct_buf); /* PA for RTAS */ Always check upper_32_bits(rtas_errinjct_buf) =3D=3D 0 before passing the lower 32 bits to RTAS. Add rtas_errinjct_mutex to serialise the complete open-session / inject / close-session firmware call sequence. A mutex is required because the sequence involves multiple rtas_call() invocations with possible busy/extended-delay retries that may sleep. Signed-off-by: Narayana Murty N --- arch/powerpc/include/asm/rtas.h | 26 ++++++++++++++++++++++++++ arch/powerpc/kernel/rtas.c | 17 +++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/arch/powerpc/include/asm/rtas.h b/arch/powerpc/include/asm/rta= s.h index d046bbd5017d..59e3c1296018 100644 --- a/arch/powerpc/include/asm/rtas.h +++ b/arch/powerpc/include/asm/rtas.h @@ -4,6 +4,7 @@ #ifdef __KERNEL__ =20 #include +#include #include #include #include @@ -519,6 +520,31 @@ int rtas_get_error_log_max(void); extern spinlock_t rtas_data_buf_lock; extern char rtas_data_buf[RTAS_DATA_BUF_SIZE]; =20 +/* + * RTAS error-injection work buffer. + * + * ibm,errinjct requires a caller-provided work buffer whose physical + * address is passed to firmware. A static C array only guarantees + * alignment, not physical placement; if it lands above the RTAS-safe + * range or above 4 GB, RTAS receives a truncated or bogus address. + * + * rtas_errinjct_buf stores the physical address allocated during + * rtas_initialize() using memblock_phys_alloc_range() with the same + * rtas_region upper bound used for rtas_rmo_buf, matching the existing + * placement model for RTAS-accessible buffers. + * + * Use __va(rtas_errinjct_buf) to obtain the kernel virtual address for + * filling the buffer, and lower_32_bits(rtas_errinjct_buf) to pass the + * physical address to RTAS (after checking upper_32_bits() =3D=3D 0). + * + * rtas_errinjct_mutex must be held across the complete + * ibm,open-errinjct / ibm,errinjct / ibm,close-errinjct sequence. + */ +#define RTAS_ERRINJCT_BUF_SIZE SZ_1K + +extern unsigned long rtas_errinjct_buf; +extern struct mutex rtas_errinjct_mutex; + /* RMO buffer reserved for user-space RTAS use */ extern unsigned long rtas_rmo_buf; =20 diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c index 27d53f34494d..7883f973e8c9 100644 --- a/arch/powerpc/kernel/rtas.c +++ b/arch/powerpc/kernel/rtas.c @@ -769,6 +769,17 @@ EXPORT_SYMBOL_GPL(rtas_data_buf); =20 unsigned long rtas_rmo_buf; =20 +/* + * Physical address of the ibm,errinjct work buffer. Allocated during + * rtas_initialize() using memblock_phys_alloc_range() below rtas_region + * so the address fits in 32 bits and is safe to pass to RTAS firmware. + */ +unsigned long rtas_errinjct_buf; +EXPORT_SYMBOL_GPL(rtas_errinjct_buf); + +DEFINE_MUTEX(rtas_errinjct_mutex); +EXPORT_SYMBOL_GPL(rtas_errinjct_mutex); + /* * If non-NULL, this gets called when the kernel terminates. * This is done like this so rtas_flash can be a module. @@ -2109,6 +2120,12 @@ void __init rtas_initialize(void) panic("ERROR: RTAS: Failed to allocate %lx bytes below %pa\n", PAGE_SIZE, &rtas_region); =20 + rtas_errinjct_buf =3D memblock_phys_alloc_range(RTAS_ERRINJCT_BUF_SIZE, + SZ_1K, 0, rtas_region); + if (!rtas_errinjct_buf) + panic("ERROR: RTAS: Failed to allocate %lu bytes below %pa\n", + (unsigned long)RTAS_ERRINJCT_BUF_SIZE, &rtas_region); + rtas_work_area_reserve_arena(rtas_region); } =20 --=20 2.54.0 From nobody Sat Jul 25 01:34:41 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0A4433B42E5 for ; Tue, 21 Jul 2026 03:39:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784605150; cv=none; b=E0ugc0XRbFdcNUGzUqB38e1hK9AjK1rgzBISZxYW3GL8Ylt6HOdCQdJnJxvNCaVOBcjRenDSmmcuB1b/Xc9y+X1A7wR/MZSpe3fu2Rz6fvvljjNsxYAlUPkbvxpWaNss+tyJM+wF1vFaZZ6ToUbjuFnSm3pASaju68cbL7zazqE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784605150; c=relaxed/simple; bh=SWvJDL22q/nH6uXz3G57sIu8NkdLzAXS0K7ez7Sj8V0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jH37vAyu8bZmQETTHxZk1luaBwg0Br8+BdAIzmnnlfeRY2MGSDJUFi/etlg5tXgitDwIkFYS3C+E01vrenOBz7aomsINW8Pkh96pe3cwSTtpd8C+SpvXwKM3HQUJ8HD4Kqco8JMLPb1A7hzQSe/pq78rGurADXN5JsBzHUC/nOc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=MiRn/R4G; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="MiRn/R4G" Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66KNDX183564509; Tue, 21 Jul 2026 03:38:55 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=reVgyFxZkSRxYcsiO YD0gCtTM9X6pTksaZdCJNKqIJk=; b=MiRn/R4Gx/J6PArrc5Og2+KWWI6xaYDZ8 lSL22p6knn3y7sQZqZy0KcbHQbFo6YORap0IfAnDDe0HvhPs1BMgGC/FArXpZdvQ VMY8wyN9eFNsR+oPm1KKhKvvF++eyW41L2j1rBO+BKXX/5Iqm8uwlm2HYqvxEvB+ pyUqlYQneQSL2oe+198OvL4Wa0xjl5YJEscVipxXFOZN/86JTuNNsePaFDwRqRE7 JrwKm15M4TtqeKO+waoNn3JkC21XDkAV/81LH6MKVShF9494AnSsKCt6wNht0QSt XvKWYNminiyoUMFCzGWJMyow3CRFtoj+P2KJh6yoDgxe8tLI2W4Qg== Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4fg790tp28-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Jul 2026 03:38:54 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 66L3Z2xc016180; Tue, 21 Jul 2026 03:38:53 GMT Received: from smtprelay04.fra02v.mail.ibm.com ([9.218.2.228]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4fgp1g8c9t-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Jul 2026 03:38:53 +0000 (GMT) Received: from smtpav07.fra02v.mail.ibm.com (smtpav07.fra02v.mail.ibm.com [10.20.54.106]) by smtprelay04.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 66L3cmu415204616 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 21 Jul 2026 03:38:48 GMT Received: from smtpav07.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5328520043; Tue, 21 Jul 2026 03:38:48 +0000 (GMT) Received: from smtpav07.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 189D120040; Tue, 21 Jul 2026 03:38:44 +0000 (GMT) Received: from Narayanas-MacBook-Pro.ibm.com (unknown [9.124.218.117]) by smtpav07.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 21 Jul 2026 03:38:43 +0000 (GMT) From: Narayana Murty N To: mahesh@linux.ibm.com, maddy@linux.ibm.com, mpe@ellerman.id.au, christophe.leroy@csgroup.eu, gregkh@linuxfoundation.org, oohall@gmail.com, npiggin@gmail.com Cc: linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, tyreld@linux.ibm.com, vaibhav@linux.ibm.com, sbhat@linux.ibm.com, ganeshgr@linux.ibm.com, sourabhjain@linux.ibm.com, haren@linux.ibm.com, nnmlinux@linux.ibm.com, thuth@redhat.com Subject: [PATCH v3 3/5] powerpc/pseries/eeh: Add RTAS error validation helpers Date: Tue, 21 Jul 2026 09:08:03 +0530 Message-ID: <20260721033815.5300-4-nnmlinux@linux.ibm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260721033815.5300-1-nnmlinux@linux.ibm.com> References: <20260721033815.5300-1-nnmlinux@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-ORIG-GUID: PURSLLYc4Aa32kfoFZzcF4HFc4gyM8T5 X-Authority-Analysis: v=2.4 cv=V6RNF+ni c=1 sm=1 tr=0 ts=6a5ee9cf cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=RAioF0-LDSMA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VwQbUJbxAAAA:8 a=QyXUC8HyAAAA:8 a=VnNF1IyMAAAA:8 a=1AdQuVhvgp6spBBsLJAA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwNzIxMDAzMCBTYWx0ZWRfXwJIIVwKkQISO 8dBRIzqOGWnbLp4JsNzFvcdV9QlRCGDdGMMN6aw4u62WyYHwDf/wKd8SJ9wzzvNPEtnl7Isjqxw kMaK9TlKAGp/TUwliOKd9CizPosTzdw= X-Proofpoint-GUID: l_d5IZRII66fHPNzV_uq7W9esFNkGjC8 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzIxMDAzMCBTYWx0ZWRfXyl1R/jXufulR 4QHFIkQU4/1D6+T6K/dG4+kI6p4FWYC57eUnELmEOHJMXTI9+gJurh+r2w0h+OchY4pvE7t5k40 Ze4hgHJiX35YvYbvvE3/yPJhg8M7eQMqdC5tHL/Xshumw2q8acA5hkCGPeXRKtaB4afzO+ofDGp m4QLqzY+9Ew8WQLN1KSS1TNll2hFFwl55qbwDwctay2N7/qecoj7wkp/EIzKzWQMD08aMe7R3Ww 3/HbyogCCdPk1N40oxBYR9yqo0LJMzJrUAbcB0HLxMqcT1tIwN15aKH83SaJzm6duJQnrnGoFWa LqOmMmvmB1LWn52krILDYCsH8s+Mys49V7GlZuNZ5lVokquwIL/SCSCxisNiyJl2N6GZbCAB++W VgYVOR2tp4NqWVvheIN5q6IlHCv1nXdPmr7+ON4NpqWYYbfuA4FVUd/rwfRVyn3HH1TZtItHMjT VssEk6FaDDxDIOzI6Fg== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-20_06,2026-07-20_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 adultscore=0 bulkscore=0 lowpriorityscore=0 clxscore=1015 spamscore=0 impostorscore=0 phishscore=0 priorityscore=1501 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607210030 Content-Type: text/plain; charset="utf-8" Add validation helpers and buffer-preparation infrastructure used by the RTAS-based EEH error injection implementation. Changes relative to the original submission: - pr_fmt unconditionally defined at the top of the file, not wrapped in an #ifndef guard. - RTAS error-type constants (RTAS_ERR_TYPE_*) are defined as file-local macros in eeh_pseries.c, not in the UAPI header. They are internal PAPR firmware type codes, not generic EEH ABI values. - validate_corrupted_page() drops the unused 'pe' parameter entirely (no __maybe_unused). The mask value is silently accepted since it is not meaningful for this error type. - validate_ioa_bus_error() is removed; callers invoke validate_addr_mask_in_pe() directly. - validate_err_type() and validate_special_event() and validate_corrupted_page() are marked static inline. - prepare_errinjct_buffer() takes an explicit 'void *buf' pointer (kernel virtual address) instead of accessing rtas_errinjct_buf directly, making it easier to test and keeping the global out of the helper. - kernel-doc added for prepare_errinjct_buffer() including a Locking: line stating the caller must hold rtas_errinjct_mutex. Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-kbuild-all/202512101130.EYUo0oZx-lkp@int= el.com/ Signed-off-by: Narayana Murty N --- arch/powerpc/include/uapi/asm/eeh.h | 24 +- arch/powerpc/platforms/pseries/eeh_pseries.c | 250 +++++++++++++++++++ 2 files changed, 271 insertions(+), 3 deletions(-) diff --git a/arch/powerpc/include/uapi/asm/eeh.h b/arch/powerpc/include/uap= i/asm/eeh.h index 3b5c47ff3fc4..2680b22f8917 100644 --- a/arch/powerpc/include/uapi/asm/eeh.h +++ b/arch/powerpc/include/uapi/asm/eeh.h @@ -15,9 +15,27 @@ #define EEH_PE_STATE_STOPPED_DMA 4 /* Stopped DMA only */ #define EEH_PE_STATE_UNAVAIL 5 /* Unavailable */ =20 -/* EEH error types and functions */ -#define EEH_ERR_TYPE_32 0 /* 32-bits error */ -#define EEH_ERR_TYPE_64 1 /* 64-bits error */ +/* + * EEH error types. + * + * EEH_ERR_TYPE_32 and EEH_ERR_TYPE_64 are the original ABI values and must + * not be renumbered. The additional types below are generic identifiers = for + * error-injection types supported by pSeries RTAS. Platform backends may + * return -EOPNOTSUPP for valid generic types that are not supported by th= eir + * firmware. + */ +#define EEH_ERR_TYPE_32 0 /* 32-bits error */ +#define EEH_ERR_TYPE_64 1 /* 64-bits error */ +#define EEH_ERR_TYPE_RECOVERED_SPECIAL_EVENT 0x03 +#define EEH_ERR_TYPE_CORRUPTED_PAGE 0x04 +#define EEH_ERR_TYPE_CORRUPTED_DCACHE_START 0x09 +#define EEH_ERR_TYPE_CORRUPTED_DCACHE_END 0x0a +#define EEH_ERR_TYPE_CORRUPTED_ICACHE_START 0x0b +#define EEH_ERR_TYPE_CORRUPTED_ICACHE_END 0x0c +#define EEH_ERR_TYPE_CORRUPTED_TLB_START 0x0d +#define EEH_ERR_TYPE_CORRUPTED_TLB_END 0x0e + +/* EEH error functions */ #define EEH_ERR_FUNC_MIN 0 #define EEH_ERR_FUNC_LD_MEM_ADDR 0 /* Memory load */ #define EEH_ERR_FUNC_LD_MEM_DATA 1 diff --git a/arch/powerpc/platforms/pseries/eeh_pseries.c b/arch/powerpc/pl= atforms/pseries/eeh_pseries.c index b12ef382fec7..25aad86c696d 100644 --- a/arch/powerpc/platforms/pseries/eeh_pseries.c +++ b/arch/powerpc/platforms/pseries/eeh_pseries.c @@ -1,4 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-or-later +#define pr_fmt(fmt) "EEH: " fmt /* * The file intends to implement the platform dependent EEH operations on = pseries. * Actually, the pseries platform is built based on RTAS heavily. That mea= ns the @@ -31,8 +32,27 @@ #include #include #include +#include #include =20 +/* + * PAPR RTAS firmware error-injection type codes. + * + * These are internal firmware encodings used by ibm,errinjct. They are + * NOT generic EEH ABI values. Only the types actually handled by + * prepare_errinjct_buffer() are defined here. + */ +#define RTAS_ERR_TYPE_RECOVERED_SPECIAL_EVENT 0x03 +#define RTAS_ERR_TYPE_CORRUPTED_PAGE 0x04 +#define RTAS_ERR_TYPE_IOA_BUS_ERROR 0x07 +#define RTAS_ERR_TYPE_CORRUPTED_DCACHE_START 0x09 +#define RTAS_ERR_TYPE_CORRUPTED_DCACHE_END 0x0a +#define RTAS_ERR_TYPE_CORRUPTED_ICACHE_START 0x0b +#define RTAS_ERR_TYPE_CORRUPTED_ICACHE_END 0x0c +#define RTAS_ERR_TYPE_CORRUPTED_TLB_START 0x0d +#define RTAS_ERR_TYPE_CORRUPTED_TLB_END 0x0e +#define RTAS_ERR_TYPE_IOA_BUS_ERROR_64 0x0f + /* RTAS tokens */ static int ibm_set_eeh_option; static int ibm_set_slot_reset; @@ -786,6 +806,236 @@ static int pseries_notify_resume(struct eeh_dev *edev) } #endif =20 +/** + * validate_addr_mask_in_pe() - Validate that addr+mask fall within PE BARs + * @pe: EEH PE containing one or more PCI devices + * @addr: Address to validate + * @mask: Address mask to validate + * + * Checks that @addr is mapped into a BAR/MMIO region of any device + * belonging to the PE. If @mask is non-zero, ensures it is consistent + * with @addr. + * + * Return: 0 if valid, RTAS_INVALID_PARAMETER on failure. + */ +static int validate_addr_mask_in_pe(struct eeh_pe *pe, unsigned long addr, + unsigned long mask) +{ + struct eeh_dev *edev, *tmp; + struct pci_dev *pdev; + int bar; + resource_size_t bar_start, bar_len; + bool valid =3D false; + + /* nothing to validate */ + if (addr =3D=3D 0 && mask =3D=3D 0) + return 0; + + eeh_pe_for_each_dev(pe, edev, tmp) { + pdev =3D eeh_dev_to_pci_dev(edev); + if (!pdev) + continue; + + for (bar =3D 0; bar < PCI_NUM_RESOURCES; bar++) { + bar_start =3D pci_resource_start(pdev, bar); + bar_len =3D pci_resource_len(pdev, bar); + + if (!bar_len) + continue; + + if (addr >=3D bar_start && addr < (bar_start + bar_len)) { + if ((addr & mask) !=3D addr) { + pr_err("Mask 0x%lx invalid for addr 0x%lx in BAR[%d] range 0x%llx-0x%= llx\n", + mask, addr, bar, + (unsigned long long)bar_start, + (unsigned long long)(bar_start + bar_len)); + return RTAS_INVALID_PARAMETER; + } + pr_debug("addr=3D0x%lx mask=3D0x%lx validated in BAR[%d] of %s\n", + addr, mask, bar, pci_name(pdev)); + valid =3D true; + } + } + } + + if (!valid) { + pr_err("addr=3D0x%lx not within any BAR of any device in PE\n", + addr); + return RTAS_INVALID_PARAMETER; + } + + return 0; +} + +/** + * validate_special_event() - Validate parameters for special-event inject= ion + * @addr: Address parameter (must be zero for this type) + * @mask: Mask parameter (must be zero for this type) + * + * Return: 0 if valid, RTAS_INVALID_PARAMETER otherwise. + */ +static inline int validate_special_event(unsigned long addr, unsigned long= mask) +{ + if (addr || mask) { + pr_err("special-event injection must not specify addr/mask\n"); + return RTAS_INVALID_PARAMETER; + } + return 0; +} + +/** + * validate_corrupted_page() - Validate parameters for corrupted-page inje= ction + * @addr: Physical page address (required, must be non-zero) + * + * The mask value is not meaningful for this error type and is ignored. + * + * Return: 0 if valid, RTAS_INVALID_PARAMETER otherwise. + */ +static inline int validate_corrupted_page(unsigned long addr) +{ + if (!addr) { + pr_err("corrupted-page injection requires non-zero addr\n"); + return RTAS_INVALID_PARAMETER; + } + return 0; +} + +/** + * pseries_eeh_type_to_rtas() - Map a generic EEH error type to its RTAS e= ncoding. + * @type: Generic EEH error type (EEH_ERR_TYPE_*) + * + * Translates a userspace-visible generic EEH error type to the correspond= ing + * PAPR RTAS firmware type code. Every supported value appears as an expl= icit + * case; coincidental equality between generic EEH and RTAS values is not = relied + * upon. + * + * Return: RTAS_ERR_TYPE_* value on success, -EINVAL for unsupported types. + */ +static int pseries_eeh_type_to_rtas(int type) +{ + switch (type) { + case EEH_ERR_TYPE_32: + return RTAS_ERR_TYPE_IOA_BUS_ERROR; + case EEH_ERR_TYPE_64: + return RTAS_ERR_TYPE_IOA_BUS_ERROR_64; + case EEH_ERR_TYPE_RECOVERED_SPECIAL_EVENT: + return RTAS_ERR_TYPE_RECOVERED_SPECIAL_EVENT; + case EEH_ERR_TYPE_CORRUPTED_PAGE: + return RTAS_ERR_TYPE_CORRUPTED_PAGE; + case EEH_ERR_TYPE_CORRUPTED_DCACHE_START: + return RTAS_ERR_TYPE_CORRUPTED_DCACHE_START; + case EEH_ERR_TYPE_CORRUPTED_DCACHE_END: + return RTAS_ERR_TYPE_CORRUPTED_DCACHE_END; + case EEH_ERR_TYPE_CORRUPTED_ICACHE_START: + return RTAS_ERR_TYPE_CORRUPTED_ICACHE_START; + case EEH_ERR_TYPE_CORRUPTED_ICACHE_END: + return RTAS_ERR_TYPE_CORRUPTED_ICACHE_END; + case EEH_ERR_TYPE_CORRUPTED_TLB_START: + return RTAS_ERR_TYPE_CORRUPTED_TLB_START; + case EEH_ERR_TYPE_CORRUPTED_TLB_END: + return RTAS_ERR_TYPE_CORRUPTED_TLB_END; + default: + return -EINVAL; + } +} + +/** + * prepare_errinjct_buffer() - Build ibm,errinjct work buffer + * @buf: RTAS error-injection work buffer (kernel virtual address) + * @pe: EEH PE associated with the injection target + * @rtas_type: PAPR firmware error-injection type after generic EEH-to-RTAS + * translation (RTAS_ERR_TYPE_*) + * @func: Error function selector + * @addr: Target address, if applicable + * @mask: Address mask, if applicable + * + * Zeroes @buf and populates it according to the PAPR layout for @rtas_typ= e. + * Performs inline parameter validation for each error type. + * + * Locking: Caller must hold rtas_errinjct_mutex. + * + * Return: 0 on success, RTAS_INVALID_PARAMETER on invalid input. + */ +static int prepare_errinjct_buffer(void *buf, struct eeh_pe *pe, + int rtas_type, int func, + unsigned long addr, unsigned long mask) +{ + __be64 *buf64 =3D (__be64 *)buf; + __be32 *buf32 =3D (__be32 *)buf; + + memset(buf, 0, RTAS_ERRINJCT_BUF_SIZE); + + switch (rtas_type) { + case RTAS_ERR_TYPE_RECOVERED_SPECIAL_EVENT: + /* func: 1 =3D non-persistent, 2 =3D persistent */ + if (func < 1 || func > 2) + return RTAS_INVALID_PARAMETER; + if (validate_special_event(addr, mask)) + return RTAS_INVALID_PARAMETER; + buf32[0] =3D cpu_to_be32(func); + break; + + case RTAS_ERR_TYPE_CORRUPTED_PAGE: + if (validate_corrupted_page(addr)) + return RTAS_INVALID_PARAMETER; + buf32[0] =3D cpu_to_be32(upper_32_bits(addr)); + buf32[1] =3D cpu_to_be32(lower_32_bits(addr)); + break; + + case RTAS_ERR_TYPE_IOA_BUS_ERROR: + if (func < EEH_ERR_FUNC_LD_MEM_ADDR || func > EEH_ERR_FUNC_MAX) + return RTAS_INVALID_PARAMETER; + if (upper_32_bits(addr) || upper_32_bits(mask)) { + pr_err("32-bit IOA injection cannot encode addr=3D%#lx mask=3D%#lx\n", + addr, mask); + return RTAS_INVALID_PARAMETER; + } + if (validate_addr_mask_in_pe(pe, addr, mask)) + return RTAS_INVALID_PARAMETER; + buf32[0] =3D cpu_to_be32((u32)addr); + buf32[1] =3D cpu_to_be32((u32)mask); + buf32[2] =3D cpu_to_be32(pe->addr); + buf32[3] =3D cpu_to_be32(BUID_HI(pe->phb->buid)); + buf32[4] =3D cpu_to_be32(BUID_LO(pe->phb->buid)); + buf32[5] =3D cpu_to_be32(func); + break; + + case RTAS_ERR_TYPE_IOA_BUS_ERROR_64: + if (func < EEH_ERR_FUNC_MIN || func > EEH_ERR_FUNC_MAX) + return RTAS_INVALID_PARAMETER; + if (validate_addr_mask_in_pe(pe, addr, mask)) + return RTAS_INVALID_PARAMETER; + buf64[0] =3D cpu_to_be64(addr); + buf64[1] =3D cpu_to_be64(mask); + buf32[4] =3D cpu_to_be32(pe->addr); + buf32[5] =3D cpu_to_be32(BUID_HI(pe->phb->buid)); + buf32[6] =3D cpu_to_be32(BUID_LO(pe->phb->buid)); + buf32[7] =3D cpu_to_be32(func); + break; + + case RTAS_ERR_TYPE_CORRUPTED_DCACHE_START: + case RTAS_ERR_TYPE_CORRUPTED_DCACHE_END: + case RTAS_ERR_TYPE_CORRUPTED_ICACHE_START: + case RTAS_ERR_TYPE_CORRUPTED_ICACHE_END: + buf32[0] =3D cpu_to_be32(lower_32_bits(addr)); + buf32[1] =3D cpu_to_be32(lower_32_bits(mask)); + break; + + case RTAS_ERR_TYPE_CORRUPTED_TLB_START: + case RTAS_ERR_TYPE_CORRUPTED_TLB_END: + buf32[0] =3D cpu_to_be32(lower_32_bits(addr)); + break; + + default: + pr_err("unsupported RTAS error injection type 0x%x\n", rtas_type); + return RTAS_INVALID_PARAMETER; + } + + pr_debug("errinjct buffer ready: rtas_type=3D0x%x func=3D%d addr=3D0x%lx = mask=3D0x%lx\n", + rtas_type, func, addr, mask); + return 0; +} + /** * pseries_eeh_err_inject - Inject specified error to the indicated PE * @pe: the indicated PE --=20 2.54.0 From nobody Sat Jul 25 01:34:41 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A094FE571 for ; Tue, 21 Jul 2026 03:39:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784605159; cv=none; b=b8YN1JzT9DqgGx7TWX2MDkRptu3LZpFN/P/7/2TmAEpBc8VcBPzI+xE4ON/9oSgwmkyudwfVp+UcfCJR+byVNCSttvX8sBQX6PP+TrCnUUCLQ5dZG67PHEjBjIRU9PV5wCdDkdWAFTW4nQXVrEJz2/YcX9Ktqv6qM7NkL3MHVKU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784605159; c=relaxed/simple; bh=eODcYqSKjD71hnuwnh9D+GJW0d/1gwt90Cxlhs8RYGc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XDfv0tchPZ0PU0iT3JMfVI32JDMiG56gacX8NYMmrDPNgflbSvWprHQSvLOkmiKWXduCqKAlL3Tvcb8TkcUIAxZ6+5XjdlVH+qQR2MAn0KhtNTdOuDA3lfr0NOyjy9/4l9BSv6zBTa3NxSoDnKS38eQ5cJEjYEJulW5DR4WtvCc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=cw3S9R5K; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="cw3S9R5K" Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66KNCsEj3553374; Tue, 21 Jul 2026 03:39:00 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=M+ArTTK3rRQq8hGmD iq2UKONODHvGtnmzeY3btjlVuI=; b=cw3S9R5Kt/Ni6vCqMKdWHLOwdYOhqHoF8 JON10OmKepUuqVNSsv2n5RL/5zn0kWapBdFqogdb6h99WO/m/DTdz8Y5LL5+0Pqx De76DIRJbOtqb/as1hC9ezFG/MJLM02KOGqMZGinVwA0ntmsnULfBmPCExM32Qa8 lp+tH34gjyMnTyPnpjPFSGmTrqRpw+/D87+21LHT3/zw6rJS01QvvMyMDQtISKgY uiECVtkQGoiJFNwAO9TJX7l1B+8Xuk2Vs9R2rK661DBGZ1iOug9vixpaL05DdzlN L91CpRf08fAA/0avggtH7dEW5iatRyeBqlAqy+nilH3DBxeEzFEag== Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4fg7abaph1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Jul 2026 03:39:00 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 66L3Ygab024866; Tue, 21 Jul 2026 03:38:58 GMT Received: from smtprelay07.fra02v.mail.ibm.com ([9.218.2.229]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4fgmtjrj8f-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Jul 2026 03:38:58 +0000 (GMT) Received: from smtpav07.fra02v.mail.ibm.com (smtpav07.fra02v.mail.ibm.com [10.20.54.106]) by smtprelay07.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 66L3crWg51773794 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 21 Jul 2026 03:38:53 GMT Received: from smtpav07.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1615820043; Tue, 21 Jul 2026 03:38:53 +0000 (GMT) Received: from smtpav07.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B751E20040; Tue, 21 Jul 2026 03:38:48 +0000 (GMT) Received: from Narayanas-MacBook-Pro.ibm.com (unknown [9.124.218.117]) by smtpav07.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 21 Jul 2026 03:38:48 +0000 (GMT) From: Narayana Murty N To: mahesh@linux.ibm.com, maddy@linux.ibm.com, mpe@ellerman.id.au, christophe.leroy@csgroup.eu, gregkh@linuxfoundation.org, oohall@gmail.com, npiggin@gmail.com Cc: linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, tyreld@linux.ibm.com, vaibhav@linux.ibm.com, sbhat@linux.ibm.com, ganeshgr@linux.ibm.com, sourabhjain@linux.ibm.com, haren@linux.ibm.com, nnmlinux@linux.ibm.com, thuth@redhat.com Subject: [PATCH v3 4/5] powerpc/pseries/eeh: Implement RTAS-based EEH error injection Date: Tue, 21 Jul 2026 09:08:04 +0530 Message-ID: <20260721033815.5300-5-nnmlinux@linux.ibm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260721033815.5300-1-nnmlinux@linux.ibm.com> References: <20260721033815.5300-1-nnmlinux@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzIxMDAzMCBTYWx0ZWRfXyYJKLi8cyWiX BU5AjOYah565M7/wrNM1cumNii7FB9KvZ1J/1Dbubpoj3jPalgxHP/VrQXCGYlnHtwuNNZQNbZt 2pbBpx07+VkTE+fv3OvDta0cIe+o/xlLTMr+c/ue3DisClN/25gwVtJA1sd4GQzzpPYfGgWAjbo NRsCDAXfMka8lApJgsO2gd8UxyyUps0wgPUkv5e6g9CcI3dk4JBP8uonDAIdtvLOuDeVi9A9UMW wkPToVzKpfILzmlhjK9z99l07TkYizW8KGPF3q/NoqDknttZAmda1wd/F5OlaEEa23b2EGLuqG3 WwffF5cWzOeF33Lip/bg5/FZ6ScZmR3kFR6p25k92bfOzH2D3KMkOSsYnvqPK1Zz6jDXQnOGXU2 QB8g/l5hBm44KdIXr2q5hjeGOZyI5vLrHEaUyzROvvrg6xeMkjtDfWJeDP9IX+L3tkiy+Opbs89 UFspfAvxqXNiWyaJFAg== X-Authority-Analysis: v=2.4 cv=F7ZnsKhN c=1 sm=1 tr=0 ts=6a5ee9d4 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=RAioF0-LDSMA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=YebC9Fa3sO9M_NWgr1QA:9 X-Proofpoint-ORIG-GUID: eRRAsaCgx9EtwqYigp9i_cazDhonYEZu X-Proofpoint-Spam-Info: AW1haW4tMjYwNzIxMDAzMCBTYWx0ZWRfXxxkkzS1o/WRc eiH9fX9VgVbNHXwKr1Y+HS96VLdkweHzgA7kx30ulfqcxAC18QPsqk3MzOIOjQDeMqi24Iuir29 kDVMlDZwo093KxgNcQUUvknXowjRxUE= X-Proofpoint-GUID: spDIAL4xHVg28RlAt5mnn85tueNZtKMC X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-20_06,2026-07-20_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 phishscore=0 bulkscore=0 clxscore=1015 priorityscore=1501 impostorscore=0 lowpriorityscore=0 suspectscore=0 malwarescore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607210030 Content-Type: text/plain; charset="utf-8" Replace legacy MMIO error injection with full PAPR-compliant RTAS error injection supporting 14+ error types via - ibm,open-errinjct - ibm,errinjct - ibm,close-errinjct. Key features: - Complete open-session-inject-close cycle management - Special handling for ibm,open-errinjct output format (token,status) - Comprehensive buffer preparation per PAPR layouts - All pr_* logging uses pr_fmt("EEH: ") prefix Tested with corresponding QEMU patches: https://lore.kernel.org/all/20251029150618.186803-1-nnmlinux@linux.ibm.com/ Signed-off-by: Narayana Murty N --- arch/powerpc/platforms/pseries/eeh_pseries.c | 121 +++++++++++++++---- 1 file changed, 95 insertions(+), 26 deletions(-) diff --git a/arch/powerpc/platforms/pseries/eeh_pseries.c b/arch/powerpc/pl= atforms/pseries/eeh_pseries.c index 25aad86c696d..d32a84009fdc 100644 --- a/arch/powerpc/platforms/pseries/eeh_pseries.c +++ b/arch/powerpc/platforms/pseries/eeh_pseries.c @@ -1037,40 +1037,109 @@ static int prepare_errinjct_buffer(void *buf, stru= ct eeh_pe *pe, } =20 /** - * pseries_eeh_err_inject - Inject specified error to the indicated PE - * @pe: the indicated PE - * @type: error type - * @func: specific error type - * @addr: address - * @mask: address mask - * The routine is called to inject specified error, which is - * determined by @type and @func, to the indicated PE + * pseries_eeh_err_inject - Inject specified error into the indicated PE + * @pe: the indicated PE + * @type: generic EEH error type (EEH_ERR_TYPE_*) + * @func: error function selector (EEH_ERR_FUNC_*) + * @addr: target address, if applicable + * @mask: address mask, if applicable + * + * Implements the EEH error-injection callback for pseries using the RTAS + * ibm,open-errinjct / ibm,errinjct / ibm,close-errinjct firmware services. + * + * Generic EEH error types are translated to RTAS firmware type codes via + * pseries_eeh_type_to_rtas() before the injection session is opened. + * Unsupported generic types are rejected with -EINVAL before any RTAS call + * is made. Existing userspace is unaffected. + * + * Return: 0 on success, negative errno or RTAS error code on failure. */ static int pseries_eeh_err_inject(struct eeh_pe *pe, int type, int func, unsigned long addr, unsigned long mask) { - struct eeh_dev *pdev; - - /* Check on PCI error type */ - if (type !=3D EEH_ERR_TYPE_32 && type !=3D EEH_ERR_TYPE_64) - return -EINVAL; + int open_token, errinjct_token, close_token; + int session_token =3D 0; + bool session_open =3D false; + void *buf; + u32 buf_phys; + int rc; + int rtas_type; =20 - switch (func) { - case EEH_ERR_FUNC_LD_MEM_ADDR: - case EEH_ERR_FUNC_LD_MEM_DATA: - case EEH_ERR_FUNC_ST_MEM_ADDR: - case EEH_ERR_FUNC_ST_MEM_DATA: - /* injects a MMIO error for all pdev's belonging to PE */ - pci_lock_rescan_remove(); - list_for_each_entry(pdev, &pe->edevs, entry) - eeh_pe_inject_mmio_error(pdev->pdev); - pci_unlock_rescan_remove(); - break; - default: + /* Guard: buffer must fit in 32 bits for RTAS */ + if (WARN_ON_ONCE(upper_32_bits(rtas_errinjct_buf))) return -ERANGE; + + /* Map generic EEH ABI to RTAS-internal error type */ + rtas_type =3D pseries_eeh_type_to_rtas(type); + if (rtas_type < 0) { + pr_err("unsupported EEH error type %#x\n", type); + return rtas_type; } =20 - return 0; + /* Verify all three RTAS tokens are available before touching firmware */ + open_token =3D rtas_function_token(RTAS_FN_IBM_OPEN_ERRINJCT); + errinjct_token =3D rtas_function_token(RTAS_FN_IBM_ERRINJCT); + close_token =3D rtas_function_token(RTAS_FN_IBM_CLOSE_ERRINJCT); + + if (open_token =3D=3D RTAS_UNKNOWN_SERVICE || + errinjct_token =3D=3D RTAS_UNKNOWN_SERVICE || + close_token =3D=3D RTAS_UNKNOWN_SERVICE) { + pr_err("ibm,open/errinjct/close-errinjct not available\n"); + return -ENODEV; + } + + buf =3D __va(rtas_errinjct_buf); + buf_phys =3D lower_32_bits(rtas_errinjct_buf); + + mutex_lock(&rtas_errinjct_mutex); + + /* Step 1: open injection session */ + do { + rc =3D rtas_call(open_token, 0, 2, &session_token); + } while (rtas_busy_delay(rc)); + + if (rc) { + pr_err("ibm,open-errinjct failed: status=3D%d\n", rc); + goto out_unlock; + } + session_open =3D true; + + /* Step 2: prepare the work buffer */ + rc =3D prepare_errinjct_buffer(buf, pe, rtas_type, func, addr, mask); + if (rc) { + pr_err("failed to prepare errinjct buffer: rc=3D%d\n", rc); + goto out_close; + } + + /* Step 3: inject the error */ + do { + rc =3D rtas_call(errinjct_token, 3, 1, NULL, + rtas_type, session_token, buf_phys); + } while (rtas_busy_delay(rc)); + + if (rc) + pr_err("ibm,errinjct failed: status=3D%d\n", rc); + +out_close: + /* Step 4: always close the session */ + { + int close_rc; + + if (session_open) { + do { + close_rc =3D rtas_call(close_token, 1, 1, NULL, + session_token); + } while (rtas_busy_delay(close_rc)); + + if (close_rc) + pr_warn("ibm,close-errinjct failed: status=3D%d\n", + close_rc); + } + } + +out_unlock: + mutex_unlock(&rtas_errinjct_mutex); + return rc; } =20 static struct eeh_ops pseries_eeh_ops =3D { --=20 2.54.0 From nobody Sat Jul 25 01:34:41 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 301B23C7DE1 for ; Tue, 21 Jul 2026 03:39:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784605161; cv=none; b=WRtsPpndrxKZN87SvLua2oblW1s+cq73mcYINFHg5XJlbaowN4xjRLxHHUib4GcStENXb9l27LKxVQFr1SvqlS7++5MjorJxI5vNWeOvqggWDqcWlXkLSl0X5DjDptvYsjFMwYiyGZ4ozxGW2OIv3p9osFuVnDvo1f43sNhoe8Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784605161; c=relaxed/simple; bh=+CsoZWw6PQNZLebvwDfjpDjkltNMz8txGbaeOgkCZ6s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mNMohgNXQecWF65k4WRI4jr6k1j+PVpZN+JmbYUAWlah8PjsLnMBr7cnXWmAlaV24PjfMDCdtU/FjKfcE1vMfm0XU9CyciwR+nd9ab2lYUpWkqm+UsHlQfa9RdA5ZOll/j4uS4TA0gffDey1i2D7elXt5s4harCQVT9Xsedqno4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=sagSmeYz; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="sagSmeYz" Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66KNDkeg1678141; Tue, 21 Jul 2026 03:39:05 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=wgRY6Aw5+uPPxoEcp 6lgUbS5VYRuxw6olk/CjcYJu+U=; b=sagSmeYzXOLK9D/EsFgEcs7El9Q0rKMRb gVBCt33llSNQDfTcLZDRa7QQ7FCWnwPr6COuRSyu8UxShVUwLvyeAorXLdBVbj7J MDpR+MgY6x3+0I8tEM36lzft/HMAXBM+vDebxNkMPHr4kpT1PDj+QwINz2ycId4Q zjgHRSEAfH8MuWovPNBFIyuQc3KZw11W1Ml2H9oJAeouSP/yfXZFS/p5Q4jXkn+J KRa95sjx9+s96i9r2ByNLGyVbEJ3QZBjMyBY1iEtgEsJ+YkgFoU/0gqdvvy9b3Rx nRZdDKx+H3vygkzrz2CMi0ZiLLVv37jCPWWYk8L9wQRwE9d12K9Kw== Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4fg77aap2x-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Jul 2026 03:39:04 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 66L3Yh1n024875; Tue, 21 Jul 2026 03:39:03 GMT Received: from smtprelay03.fra02v.mail.ibm.com ([9.218.2.224]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4fgmtjrj8n-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Jul 2026 03:39:03 +0000 (GMT) Received: from smtpav07.fra02v.mail.ibm.com (smtpav07.fra02v.mail.ibm.com [10.20.54.106]) by smtprelay03.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 66L3cwTD52625668 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 21 Jul 2026 03:38:58 GMT Received: from smtpav07.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 11F6320043; Tue, 21 Jul 2026 03:38:58 +0000 (GMT) Received: from smtpav07.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7B79C20040; Tue, 21 Jul 2026 03:38:53 +0000 (GMT) Received: from Narayanas-MacBook-Pro.ibm.com (unknown [9.124.218.117]) by smtpav07.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 21 Jul 2026 03:38:53 +0000 (GMT) From: Narayana Murty N To: mahesh@linux.ibm.com, maddy@linux.ibm.com, mpe@ellerman.id.au, christophe.leroy@csgroup.eu, gregkh@linuxfoundation.org, oohall@gmail.com, npiggin@gmail.com Cc: linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, tyreld@linux.ibm.com, vaibhav@linux.ibm.com, sbhat@linux.ibm.com, ganeshgr@linux.ibm.com, sourabhjain@linux.ibm.com, haren@linux.ibm.com, nnmlinux@linux.ibm.com, thuth@redhat.com Subject: [PATCH v3 5/5] powerpc/powernv/eeh: Map VFIO EEH error injection to OPAL Date: Tue, 21 Jul 2026 09:08:05 +0530 Message-ID: <20260721033815.5300-6-nnmlinux@linux.ibm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260721033815.5300-1-nnmlinux@linux.ibm.com> References: <20260721033815.5300-1-nnmlinux@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-ORIG-GUID: oeChogAieUnV2sqjchYuh3XefzrNoWAi X-Proofpoint-Spam-Info: AW1haW4tMjYwNzIxMDAzMCBTYWx0ZWRfX2Q+Pnt2IMPdm qxbb4akY+H+MDQ/JzgHzegSbfRrvp+HVIYXO1insC8YZZ3EMergGbuSc7oEgMk18GQFhlm2dpJM WofdcjA9NIbXt16A/KjCqWltbviQztw= X-Proofpoint-GUID: dBgdRTxulCZbEq7nEBLESHm7Poei_CHk X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzIxMDAzMCBTYWx0ZWRfXwPyJJeiOziLn bdss8LlLrwPIZtObnmGbJx7oEwDNdIOoH3Sx+4FtTIVUYyqarBAEzhmrmOIDu6K69Vzm8dBmbyq 1sTu93w1N2gDobIbHWoVN7Y54d8069cVQM6jZullASDSf4ETbsFeXsrWIqds1rg+ygHvF4yPnv6 Nm9P6Bh49UsLNV+yu9Ax/KInQrhT2NPtAmF/M1QrCwKliDjpIAjtnB/MUd/Vy/RbMuS/SghvtS1 8kwZXvrrUaDl5aBvgyjIjTC4UB4i5MHNg1H8+OcBitONEuweVZsdcuxYcTId5feFQkHSFdqUlpz q+7IJpYwZK6e0rWjqMncULrwmnmS+sSBoKXQ/rcNqL36rO3ze/1BjtG7wa7yJxnXUNGJ1ybk3XN JH+LjLIDkKkExbb4q6Dp+Eq7xzQpq+0+zrSO7GColubgDySH0aA86DD/HKlaEdv4Q8qsa5/yv0V l0ku5BA07FEp8u6Uecw== X-Authority-Analysis: v=2.4 cv=K7AS2SWI c=1 sm=1 tr=0 ts=6a5ee9d9 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=RAioF0-LDSMA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VnNF1IyMAAAA:8 a=N5Vdv9O42okQTFM43-cA:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-20_06,2026-07-20_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 suspectscore=0 bulkscore=0 clxscore=1015 priorityscore=1501 spamscore=0 phishscore=0 malwarescore=0 adultscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607210030 Content-Type: text/plain; charset="utf-8" The EEH error-injection interface passes the generic userspace ABI values EEH_ERR_TYPE_32 and EEH_ERR_TYPE_64 to the platform backend. The PowerNV backend currently compares those generic values directly with OPAL_ERR_INJECT_TYPE_IOA_BUS_ERR and OPAL_ERR_INJECT_TYPE_IOA_BUS_ERR64. Although the corresponding values are currently numerically identical, this implicitly couples the generic EEH ABI to the OPAL firmware encoding. Explicitly translate the generic EEH error types to their OPAL equivalents in pnv_eeh_err_inject(). Keep the platform-specific encoding within the PowerNV backend and reject unsupported generic types with -EINVAL. No userspace ABI values are changed. Signed-off-by: Narayana Murty N --- arch/powerpc/platforms/powernv/eeh-powernv.c | 36 +++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/arch/powerpc/platforms/powernv/eeh-powernv.c b/arch/powerpc/pl= atforms/powernv/eeh-powernv.c index db3370d1673c..b0bcd014a133 100644 --- a/arch/powerpc/platforms/powernv/eeh-powernv.c +++ b/arch/powerpc/platforms/powernv/eeh-powernv.c @@ -1169,11 +1169,39 @@ static int pnv_eeh_err_inject(struct eeh_pe *pe, in= t type, int func, struct pnv_phb *phb =3D hose->private_data; s64 rc; =20 - if (type !=3D OPAL_ERR_INJECT_TYPE_IOA_BUS_ERR && - type !=3D OPAL_ERR_INJECT_TYPE_IOA_BUS_ERR64) { - pr_warn("%s: Invalid error type %d\n", + /* + * Map generic EEH error-type ABI values to OPAL-specific type codes. + * EEH_ERR_TYPE_32 and EEH_ERR_TYPE_64 are the only types supported by + * OPAL. Additional generic types defined in the UAPI header are valid + * for pSeries RTAS but unsupported here; return -EOPNOTSUPP for those. + * Unknown or invalid values return -EINVAL. + * + * Note: currently OPAL_ERR_INJECT_TYPE_IOA_BUS_ERR =3D=3D 0 =3D=3D + * EEH_ERR_TYPE_32 and OPAL_ERR_INJECT_TYPE_IOA_BUS_ERR64 =3D=3D 1 =3D=3D + * EEH_ERR_TYPE_64, but the explicit switch makes the coupling + * visible and allows the values to diverge independently. + */ + switch (type) { + case EEH_ERR_TYPE_32: + type =3D OPAL_ERR_INJECT_TYPE_IOA_BUS_ERR; + break; + case EEH_ERR_TYPE_64: + type =3D OPAL_ERR_INJECT_TYPE_IOA_BUS_ERR64; + break; + case EEH_ERR_TYPE_RECOVERED_SPECIAL_EVENT: + case EEH_ERR_TYPE_CORRUPTED_PAGE: + case EEH_ERR_TYPE_CORRUPTED_DCACHE_START: + case EEH_ERR_TYPE_CORRUPTED_DCACHE_END: + case EEH_ERR_TYPE_CORRUPTED_ICACHE_START: + case EEH_ERR_TYPE_CORRUPTED_ICACHE_END: + case EEH_ERR_TYPE_CORRUPTED_TLB_START: + case EEH_ERR_TYPE_CORRUPTED_TLB_END: + pr_warn("%s: EEH error type %d not supported by OPAL\n", __func__, type); - return -ERANGE; + return -EOPNOTSUPP; + default: + pr_warn("%s: unsupported EEH error type %d\n", __func__, type); + return -EINVAL; } =20 if (func < OPAL_ERR_INJECT_FUNC_IOA_LD_MEM_ADDR || --=20 2.54.0