Lexar NM790 et linux

Edite du 26/09/2023: le patch définitif a été intégré aux derniers kernel (6.5.5). Tout est rentré dans l’ordre.

Edit du 12/09/2023: un fil de discussion est disponible ici apportant une réponse officielle au problème, et devrait être très prochainement intégré au kernel.

Article original:
Actuellement (au 24/08/2023), si vous avez l’intention d’utiliser le NVME Lexar NM790 sous linux, cela s’avère très compliqué car il ne s’initialise tout simplement pas au démarrage.

Je viens d’en faire l’expérience en clonant mon système sur ce nvme:

NVMe: Device not ready; aborting initialisation, CSTS=0x0

Après plusieurs recherches sur internet (notamment ce lien), il s’agit bien d’un problème connu, mais rassurez-vous il peut tout a fait se résoudre. Cependant inutile d’utiliser le premier patch proposé, car il ne correspond pas à notre nvme:

Non-Volatile memory controller: Shenzhen Longsys Electronics Co., Ltd. Device 1602 (rev 01)
PCI_DEVICE(0x1d97, 0x1602)

Le patch proposant  de modifier drivers/nvme/host/core.c permet de booter correctement sur ce nvme. La modification proposée évite d’avoir NVME_CSTS_RDY à 0.

Cependant j’ai modifié la ligne:

(timeout + 1) / 2, « initialisation »);

en

((timeout + 1) / 2) + 1, « initialisation »);

De fait voici le patch définitif:

diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 3ec38e2b9173..ab2583cb42aa 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -2408,6 +2408,7 @@ int nvme_enable_ctrl(struct nvme_ctrl *ctrl)
	} else {
	        timeout = NVME_CAP_TIMEOUT(ctrl->cap);
	}
+	dev_info(ctrl->device, "[PATCH] nvme core got timeout %u\n",timeout);

	ctrl->ctrl_config |= (NVME_CTRL_PAGE_SHIFT - 12) << NVME_CC_MPS_SHIFT;
	ctrl->ctrl_config |= NVME_CC_AMS_RR | NVME_CC_SHN_NONE;
@@ -2425,8 +2426,9 @@ int nvme_enable_ctrl(struct nvme_ctrl *ctrl)
	ret = ctrl->ops->reg_write32(ctrl, NVME_REG_CC, ctrl->ctrl_config);
	if (ret)
	        return ret;
+	dev_info(ctrl->device, "[PATCH] nvme_wait_ready now wait for %u, previously %u\n",((timeout + 1) / 2) + 1, (timeout + 1) / 2);
	return nvme_wait_ready(ctrl, NVME_CSTS_RDY, NVME_CSTS_RDY,
-			    (timeout + 1) / 2, "initialisation");
+			    ((timeout + 1) / 2) + 1, "initialisation");
}
EXPORT_SYMBOL_GPL(nvme_enable_ctrl);

Il ne vous reste plus qu’à compiler votre propre kernel avec cette modif.

Je vous propose également ma compilation du dernier xanmod 6.4.12 en x64v4 intégrant ce patch: lien cloud