Memory modules misconfigured con MacPro7,1

Usuarios de macOS Catalina y Big Sur que utilizan SMBIOS de MacPro7,1 reciben un aviso de error al arrancar: MEMORY MODULES MISCONFIGURED – More than the maximum supported memory is installed in your Mac. Los desarrolladores de OpenCore (OC) tienen un artículo muy completo sobre este problema Fixing MacPro7,1 Memory Errors y la forma de solucionarlo a partir de la versión 0.6.3. Yo me limitaré a traducir lo fundamental y ampliar la información de acuerdo con mi experiencia.

Nota: Lee el artículo Cambiar de Opencore 0.6.8 a 0.6.9 donde se comenta un método más sencillo de realizar esta tarea.

El modelo MacPro7,1 fue puesto a la venta en 2019 y es, hasta la fecha, el Mac más potente y modular, con una orientación claramente profesional. Lleva una CPU Intel Xeon de 8 a 28 núcleos según modelos y tarjetas gráficas AMD Radeon Pro 580X. Carece de iGPU. Aunque no parece un modelo de SMBIOS adecuado a la mayoría de los hackintosh, algunos usuarios que han montado equipos de alto rendimiento con CPU Xeon y gran cantidad de memoria RAM lo utilizan. También lo usan otros usuarios con equipos basados en CPU Intel de 9ª o 10ª generación sin tarjeta gráfica integrada.

Todavía no está del todo claro el mecanismo por el que se genera el aviso. Hasta el lanzamiento de Big Sur, el plugin de Lilu MacProMemoryNotificationDisabler.kext desarrollado por IOIIIO solucionaba el problema y el aviso dejaba de aparecer a costa de generar cierta inestabilidad en algunos sistemas. Pero esta kext no funciona en Big Sur. Lilu aplica los parches como el de esta kext en el espacio de usuario al que Big Sur no deja acceder para esta tarea por lo que ha dejado de funcionar.

Nueva sección Memory en OC 0.6.3

En OC 0.6.3 se incluyó en el archivo config.plist una nueva sección Memory dentro de PlatformInfo, en ella se pueden detallar parámetros de la memoria RAM, según la nomenclatura de la especificación SMBIOS, de forma que macOS no detecte la memoria automáticamente sino que reciba los datos desde esta sección. Memory sólo se utiliza si la clave CustomMemory (dentro de PlatformInfo) está en True. Memory tiene varias subclaves relacionadas con la memoria RAM:

  • DataWidth: ancho de banda en bits del bus, suele tener el valor de 64
  • ErrorConnection: método primario de detección o corrección de errores (ninguno, paridad, ECC…)
  • FormFactor: el tipo de módulo empleado (DIMM, SODIMM…)
  • MaxCapacity: capacidad máxima de memoria, en bytes, soportada por la placa base
  • TotalWidth: valor total del ancho del bus, en bits, incluidos los canales de corrección de errores si los hay; si no existen, el valor de TotalWidth es idéntico a DataWidth
  • Type: tipo de memoria (DDR3, DDR4…)
  • TypeDetail: información adicional sobre la memoria (Synchronous, Buffered, Unbuffered…)
  • Devices: en esta sección se describen todos los bancos de memoria, ocupados o no, y se especifican características de cada uno de ellos:
    • AssetTag: etiqueta de propiedad del módulo de memoria
    • BankLocator: nombre del banco de memoria en que se aloja el módulo
    • DeviceLocator: descripción de la posición del banco en la placa base
    • Manufacturer: fabricante de la memoria
    • PartNumber: código correspondiente al modelo de memoria
    • SerialNumber: número de serie de cada módulo
    • Size: tamaño en MB, 0 indica que está vacío
    • Speed: velocidad máxima de la memoria en MT/s (megatransfers por segundo).

Gracias a esta capacidad nueva de OC es posible configurar la memoria para que sea compatible con la del modelo MacPro7,1. Los usuarios que desean utilizar esta SMBIOS pueden hacerlo sin recibir el aviso «modules misconfigured» y probablemente con mayor estabilidad.

Es recomendable leer el Manual de Referencia de OC 0.6.3 incluido en la carpeta Docs, en él se detallan todas estas propiedades y los valores que pueden tener.

Prerrequisitos

  • dmidecode: herramienta proveniente del mundo Linix que proporciona información sobre el hardware tal como está descrito en BIOS según el estándar SMBIOS – DMI. Acidanthera tiene una versión específica para macOS, la versión actual es 3.2c. Se descarga como un archivo ejecutable que conviene copiar a la carpeta /usr/local/bin para que esté accesible en la variable PATH. Con esta herramienta obtenemos información de los parámetros SMBIOS del ordenador a través de I/O Registry.
  • Archivo config.plist de ejemplo, hay que rellenarlo con nuestros datos:
<key>PlatformInfo</key>
	<dict>
		<key>Memory</key>
		<dict>
			<key>DataWidth</key>
			<integer></integer>
			<key>ErrorCorrection</key>
			<integer></integer>
			<key>FormFactor</key>
			<integer></integer>
			<key>MaxCapacity</key>
			<integer></integer>
			<key></key>
			<integer></integer>
			<key>Type</key>
			<integer></integer>
			<key>TypeDetail</key>
			<integer></integer>
			<key>Devices</key>
			<array>
				<dict>
					<key>AssetTag</key>
					<string></string>
					<key>BankLocator</key>
					<string></string>
					<key>DeviceLocator</key>
					<string></string>
					<key>Manufacturer</key>
					<string></string>
					<key>PartNumber</key>
					<string></string>
					<key>SerialNumber</key>
					<string></string>
					<key>Size</key>
					<integer>0</integer>
					<key>Speed</key>
					<integer>0</integer>	
				</dict>
				<dict>
					<key>AssetTag</key>
					<string></string>
					<key>BankLocator</key>
					<string></string>
					<key>DeviceLocator</key>
					<string></string>
					<key>Manufacturer</key>
					<string></string>
					<key>PartNumber</key>
					<string></string>
					<key>SerialNumber</key>
					<string></string>
					<key>Size</key>
					<integer>0</integer>
					<key>Speed</key>
					<integer>0</integer>	
				</dict>
				<!-- sigue hasta 12 Devices en total -->
			</array>
		</dict>
	</dict>

Memoria del MacPro y OpenCore

Este modelo de MacPro tiene un controlador específico para la memoria, es un controlador de 6 canales que soporta 12 ranuras de memoria DDR4 ECC y acepta módulos de 8 a 128GB hasta alcanzar un máximo de 1,5TB de RAM. Las 12 ranuras pueden estar ocupadas en su totalidad o no.
Desde OC hay que configurar exactamente 12 ranuras rellenando con datos reales obtenidos desde dmidecode las que están ocupadas por módulos DIMM y con datos ficticios el resto de ranuras. La finalidad es que macOS vea las 12 ranuras que espera encontrar en un Mac de este modelo, obteniendo de cada una valores reales o ficticios que le ayuden a configurar los módulos ocupados y vacíos.

Detectar la memoria real de nuestro PC

Con dmidecode vamos a averiguar el valor de cada una de las propiedades enumeradas más arriba: DataWidth / ErrorConnection / FormFactor / MaxCapacity / TotalWidth / Type / TypeDetail / Devices. Y dentro de cada Device: AssetTag / BankLocator / DeviceLocator / Manufacturer / PartNumber / SerialNumber / Size / Speed.
En mi PC hay 4 ranuras de memoria, 2 de ellas están ocupadas por módulos DIMM DDR4 (16×2 = 32Gb en total) y 2 están vacías.

Desde Terminal podemos ejecutar dmidecode con el parámetro -t memory que produce una salida con todas las propiedades de todos los módulos de memoria RAM. Pero es más cómodo obtener cada propiedad por separado.

DataWidth=64

dmidecode -t memory | grep "Data Width:"
	Data Width: 64 bits
	Data Width: Unknown
	Data Width: 64 bits
	Data Width: Unknown

ErrorCorrection=3 (None)

dmidecode -t memory | grep "Error Correction Type:"
	Error Correction Type: None

FormFactor=9 (DIMM)

dmidecode -t memory | grep "Form Factor:"
	Form Factor: DIMM
	Form Factor: DIMM
	Form Factor: DIMM
	Form Factor: DIMM

MaxCapacity=137438953472

8GB   - 8589934592 Bytes
16GB  - 17179869184 Bytes
32GB  - 34359738368 Bytes
64GB  - 68719476736 Bytes
128GB - 137438953472 Bytes
256GB - 274877906944 Bytes

TotalWidth=64

dmidecode -t memory | grep "Total Width:"
	Total Width: 64 bits
	Total Width: Unknown
	Total Width: 64 bits
	Total Width: Unknown

Type=26 (DDR4)

dmidecode -t memory | grep "Type:"
	Type: DDR4
	Type: Unknown
	Type: DDR4
	Type: Unknown

TypeDetail=7 (Synchronous)

dmidecode -t memory | grep "Type Detail:"
	Type Detail: Synchronous
	Type Detail: None
	Type Detail: Synchronous
	Type Detail: None

Devices

Aquí es donde se definen las 12 ranuras de memoria. Las que están ocupadas se rellenan con datos obtenidos desde dmidecode. Las que están vacías se rellenan parcialmente con datos ficticios para que macOS interprete que también están ocupadas. A las propiedades Size y Speed les asignamos el valor de 1 para evitar errores si se dejan con valor 0 o en blanco.

AssetTag

dmidecode -t memory | grep "Asset Tag:"
	Asset Tag: 9876543210
	Asset Tag: Unknown
	Asset Tag: 9876543210
	Asset Tag: Unknown

Si dmidecode devuelve Not Specified, AssetTag se deja en blanco.

BankLocator

dmidecode -t memory | grep "Bank Locator:"
	Bank Locator: BANK 0
	Bank Locator: BANK 1
	Bank Locator: BANK 2
	Bank Locator: BANK 3

Si dmidecode devuelve Not Specified, BankLocator se deja en blanco.

DeviceLocator

dmidecode -t memory | grep "Locator:"
	Locator: ChannelA-DIMM0
	Locator: ChannelA-DIMM1
	Locator: ChannelB-DIMM0
	Locator: ChannelB-DIMM1

Las ranuras vacías se rellenan con un valor informativo (yo utilizo Libre).

Manufacturer

dmidecode -t memory | grep "Manufacturer:"
	Manufacturer: 029E
	Manufacturer: Unknown
	Manufacturer: 029E
	Manufacturer: Unknown

Manufacturer devuelve un código que se corresponde con el fabricante, en este caso es Corsair.

PartNumber

dmidecode -t memory | grep "Part Number:"
	Part Number: CMK32GX4M2B3200C16
	Part Number: Unknown
	Part Number: CMK32GX4M2B3200C16
	Part Number: Unknown

Las ranuras vacías se rellenan con 0.

SerialNumber

dmidecode -t memory | grep "Serial Number:"
	Serial Number: 00000000
	Serial Number: Unknown
	Serial Number: 00000000
	Serial Number: Unknown

Las ranuras vacías se rellenan con 0.

Size (en MB)

1GB  - 1024
2GB  - 2048
4GB  - 4096
8GB  - 8192
16GB - 16384
32GB - 32768
64GB - 65536
12GB - 131072

Las ranuras vacías se rellenan con 1.

Speed

dmidecode -t memory | grep "Speed:"
	Speed: 3200 MT/s
	Speed: Unknown
	Speed: 3200 MT/s
	Speed: Unknown

Las ranuras vacías se rellenan con 1.

Al final se obtiene un código similar a este:

		<key>Memory</key>
		<dict>
			<key>DataWidth</key>
			<integer>64</integer>
			<key>ErrorCorrection</key>
			<integer>3</integer>
			<key>FormFactor</key>
			<integer>9</integer>
			<key>MaxCapacity</key>
			<integer>137438953472</integer>
			<key>TotalWidth</key>
			<integer>64</integer>
			<key>Type</key>
			<integer>26</integer>
			<key>TypeDetail</key>
			<integer>7</integer>
			<key>Devices</key>
			<array>
				<dict> <!-- datos reales -->
					<key>AssetTag</key>
					<string>9876543210</string>
					<key>BankLocator</key>
					<string>BANK 0</string>
					<key>DeviceLocator</key>
					<string>ChannelA-DIMM0</string>
					<key>Manufacturer</key>
					<string>Corsair</string>
					<key>PartNumber</key>
					<string>CMK32GX4M2B3200C16</string>
					<key>SerialNumber</key>
					<string>00000000</string>
					<key>Size</key>
					<integer>16384</integer>
					<key>Speed</key>
					<integer>3200</integer>
				</dict>
				<dict> <!-- datos ficticios -->
					<key>AssetTag</key>
					<string></string>
					<key>BankLocator</key>
					<string>BANK 1</string>
					<key>DeviceLocator</key>
					<string>Libre</string>
					<key>Manufacturer</key>
					<string>Casa</string>
					<key>PartNumber</key>
					<string>0</string>
					<key>SerialNumber</key>
					<string>0</string>
					<key>Size</key>
					<integer>1</integer>
					<key>Speed</key>
					<integer>1</integer>
				</dict>
                                <!-- sigue hasta 12 Devices en total -->

Recuerda que es imprescindible que haya 12 Devices en total, sin este requisito el aviso de error seguirá apareciendo. Una vez completado el archivo config.plist, después de reiniciar, el aviso deja de salir y la memoria es bien detectada de acuerdo con esta configuración.

Puedes descargar la EFI completa desde aquí.

9 comentarios en «Memory modules misconfigured con MacPro7,1»

  1. Hola Pol, muchas gracias por responder, entonces la diferencia sería si la gráfica es integrada o no? Sobre el funcionamiento de hardware, hay alguna diferencia?
    Disculpa tanta preguntas, que tengas un buen día y gracias por tan valioso material.

    Responder
    • Sí, dicho en pocas palabras, si usas gráfica integrada al monitor pones iMac, si es la gráfica dedicada la que lleva la imagen al monitor coges MacPro o iMacPro.
      Hay otras posibles diferencias pero esa es la principal.
      El funcionamiento de discos SSD, wifi, bluetooth, audio, etc., suele ser igual en esas SMBIOS distintas. Eso no cambia.

      Responder
  2. Hola pol, soy nuevo en el mundo hackintosh y tengo una curiosidad, no sé si puedas iluminarme. Cuál es la diferencia entre una iMac 19.1 y un Macpro7.1? Yo tengo configurada mi hackintosh con la iMac 19.1. Gracias de antemano.

    Responder
    • Buenos días, Serghi. La diferencia fundamental es que utilizamos uno u otro modelo de SMBIOS dependiendo del hardware que utilizamos.
      iMac19,1 es una buena opción para un equipo que tiene una CPU Intel de 8ª o 9ª generación (aquellas cuya numeración empieza por 8 o por 9, por ejemplo i7-8700 o i9-9700) y que tiene activada la tarjeta gráfica integrada en la CPU, usándola como salida para el monitor.
      MacPro7,1 es una buena opción para un equipo cuya CPU Intel no tiene gráfica integrada (o si la tiene, está desactivada en BIOS) y en cambio utiliza una gráfica AMD (RX580, RX6600, etc.) como salida para el monitor.
      Esta sería la diferencia principal. ¿Por qué? Por el tipo de ordenador Mac que usa cada modelo de SMBIOS. El Mac Pro de 2019 (MacPro7,1) tiene una CPU Xeon sin gráfica integrada y lleva una gráfica AMD Radeon Pro 580. El iMac de 2019 (iMac19,1) lleva CPU de las familias 8ª o 9ª con tarjeta gráfica integrada (Intel 630) aunque también lleva gráfica externa AMD Radeon Pro 570.
      En resumen: si la gráfica integrada en la CPU lleva la imagen al monitor, usa iMac19,1. Si tienes una tarjeta AMD de los modelos RX580 o superior, usa MacPro7,1 pero también valdría iMacPro1,1.

      Responder
  3. Perfecta guía, ya me tenía hasta el moño el mensajito de la memoria, no conseguí hacerlo con lo que encontré por ahí y, con este manual, a la primera, mil gracias.

    Responder
    • Gracias. Los autores de OpenCore han sacado una kext nueva, RestrictEvents kext, para resolver avisos de memory misconfiguration como el de este artículo. De esta forma puedes o bien rellenar bien la sección memory de config.plist o bien utilizar esta extensión.

      Responder
    • Buenos días, la añado al final del artículo, he cambiado los números de serie, el resto está igual que la que a mí me funciona.
      Pero tengo 32gb de RAM. Si tienes otra cantidad, has de modificar config.plist o no arrancará bien. Y puede ser que tu RAM sea diferente en alguna característica, repasa con dmidecode y pon tus datos si no son idénticos a los míos. Incluso la capacidad máxima de memoria que acepta la placa base.
      En fin, usa la EFI pero repasa esos datos por si acaso.

      Nota: no uso audio de la placa porque tengo altavoz bluetooth, recuerda añadir el audio si tú sí lo utilizas (kext y config.plist).

      Responder

Responder a pol Cancelar la respuesta