1 /* $NetBSD: mlxreg.h,v 1.8 2008/09/08 23:36:54 gmcgarry Exp $ */ 2 3 /*- 4 * Copyright (c) 2001 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Andrew Doran. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 /*- 33 * Copyright (c) 1999 Michael Smith 34 * All rights reserved. 35 * 36 * Redistribution and use in source and binary forms, with or without 37 * modification, are permitted provided that the following conditions 38 * are met: 39 * 1. Redistributions of source code must retain the above copyright 40 * notice, this list of conditions and the following disclaimer. 41 * 2. Redistributions in binary form must reproduce the above copyright 42 * notice, this list of conditions and the following disclaimer in the 43 * documentation and/or other materials provided with the distribution. 44 * 45 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 46 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 47 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 48 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 49 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 50 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 51 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 52 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 53 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 54 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 55 * SUCH DAMAGE. 56 * 57 * from FreeBSD: mlxreg.h,v 1.5.2.2 2000/04/24 19:40:50 msmith Exp 58 */ 59 60 #ifndef _IC_MLXREG_H_ 61 #define _IC_MLXREG_H_ 62 63 #define MLX_SECTOR_SIZE 512 64 65 /* 66 * Selected command codes. 67 */ 68 #define MLX_CMD_ENQUIRY_OLD 0x05 69 #define MLX_CMD_ENQUIRY 0x53 70 #define MLX_CMD_ENQUIRY2 0x1c 71 #define MLX_CMD_ENQSYSDRIVE 0x19 72 #define MLX_CMD_READSG 0xb6 73 #define MLX_CMD_WRITESG 0xb7 74 #define MLX_CMD_READSG_OLD 0x82 75 #define MLX_CMD_WRITESG_OLD 0x83 76 #define MLX_CMD_FLUSH 0x0a 77 #define MLX_CMD_LOGOP 0x72 78 #define MLX_CMD_REBUILDASYNC 0x16 79 #define MLX_CMD_CHECKASYNC 0x1e 80 #define MLX_CMD_REBUILDSTAT 0x0c 81 #define MLX_CMD_STOPCHANNEL 0x13 82 #define MLX_CMD_STARTCHANNEL 0x12 83 #define MLX_CMD_READ_CONFIG 0x4e 84 #define MLX_CMD_WRITE_CONFIG 0x4f 85 #define MLX_CMD_READ_DK_CONFIG 0x4a 86 #define MLX_CMD_WRITE_DK_CONFIG 0x4b 87 #define MLX_CMD_DIRECT_CDB 0x04 88 #define MLX_CMD_DEVICE_STATE 0x50 89 #define MLX_CMD_READ_CONFIG2 0x3d 90 #define MLX_CMD_WRITE_CONFIG2 0x3c 91 92 #ifdef _KERNEL 93 94 /* 95 * Status values. 96 */ 97 #define MLX_STATUS_OK 0x0000 98 #define MLX_STATUS_RDWROFFLINE 0x0002 /* read/write claims drive is offline */ 99 #define MLX_STATUS_WEDGED 0xdeaf /* controller not listening */ 100 #define MLX_STATUS_LOST 0xdead /* never came back */ 101 #define MLX_STATUS_BUSY 0xbabe /* command is in controller */ 102 103 /* 104 * V1 (EISA) interface. 105 */ 106 #define MLX_V1REG_IE 0x09 107 #define MLX_V1REG_IDB 0x0d 108 #define MLX_V1REG_ODB_EN 0x0e 109 #define MLX_V1REG_ODB 0x0f 110 #define MLX_V1REG_MAILBOX 0x10 111 112 #define MLX_V1_IDB_FULL 0x01 /* mailbox is full */ 113 #define MLX_V1_IDB_INIT_BUSY 0x02 /* init in progress */ 114 115 #define MLX_V1_IDB_SACK 0x02 /* acknowledge status read */ 116 #define MLX_V1_IDB_RESET 0x10 /* reset controller */ 117 118 #define MLX_V1_ODB_SAVAIL 0x01 /* status is available */ 119 #define MLX_V1_ODB_RESET 0x02 /* reset controller */ 120 121 #define MLX_V1_FWERROR_PEND 0x04 /* firmware error pending */ 122 123 /* 124 * V2/V3 interface. 125 */ 126 #define MLX_V3REG_MAILBOX 0x00 127 #define MLX_V3REG_STATUS_IDENT 0x0d 128 #define MLX_V3REG_STATUS 0x0e 129 #define MLX_V3REG_IDB 0x40 130 #define MLX_V3REG_ODB 0x41 131 #define MLX_V3REG_IE 0x43 132 #define MLX_V3REG_FWERROR 0x3f 133 #define MLX_V3REG_FWERROR_PARAM1 0x00 134 #define MLX_V3REG_FWERROR_PARAM2 0x01 135 136 #define MLX_V3_IDB_FULL 0x01 /* mailbox is full */ 137 #define MLX_V3_IDB_INIT_BUSY 0x02 /* init in progress */ 138 139 #define MLX_V3_IDB_SACK 0x02 /* acknowledge status read */ 140 #define MLX_V3_IDB_RESET 0x08 /* reset controller */ 141 142 #define MLX_V3_ODB_SAVAIL 0x01 /* status is available */ 143 144 #define MLX_V3_FWERROR_PEND 0x04 /* firmware error pending */ 145 146 /* 147 * V4 interface. 148 */ 149 #define MLX_V4REG_MAILBOX 0x1000 150 #define MLX_V4REG_STATUS_IDENT 0x1018 151 #define MLX_V4REG_STATUS 0x101a 152 #define MLX_V4REG_IDB 0x0020 153 #define MLX_V4REG_ODB 0x002c 154 #define MLX_V4REG_IE 0x0034 155 #define MLX_V4REG_FWERROR 0x103f 156 #define MLX_V4REG_FWERROR_PARAM1 0x1000 157 #define MLX_V4REG_FWERROR_PARAM2 0x1001 158 159 #define MLX_V4_IDB_FULL 0x01 /* mailbox is full */ 160 #define MLX_V4_IDB_INIT_BUSY 0x02 /* initialisation in progress */ 161 162 #define MLX_V4_IDB_HWMBOX_CMD 0x01 /* posted hardware mailbox command */ 163 #define MLX_V4_IDB_SACK 0x02 /* acknowledge status read */ 164 #define MLX_V4_IDB_MEMMBOX_CMD 0x10 /* posted memory mailbox command */ 165 166 #define MLX_V4_ODB_HWSAVAIL 0x01 /* status available for hardware m/b */ 167 #define MLX_V4_ODB_MEMSAVAIL 0x02 /* status available for memory m/b */ 168 169 #define MLX_V4_ODB_HWMBOX_ACK 0x01 /* ack status read from hardware m/b */ 170 #define MLX_V4_ODB_MEMMBOX_ACK 0x02 /* ack status read from memory m/b */ 171 172 #define MLX_V4_IE_MASK 0xfb /* message unit interrupt mask */ 173 #define MLX_V4_IE_DISINT 0x04 /* interrupt disable bit */ 174 175 #define MLX_V4_FWERROR_PEND 0x04 /* firmware error pending */ 176 177 /* 178 * V5 interface. 179 */ 180 #define MLX_V5REG_MAILBOX 0x50 181 #define MLX_V5REG_STATUS_IDENT 0x5d 182 #define MLX_V5REG_STATUS 0x5e 183 #define MLX_V5REG_IDB 0x60 184 #define MLX_V5REG_ODB 0x61 185 #define MLX_V5REG_IE 0x34 186 #define MLX_V5REG_FWERROR 0x63 187 #define MLX_V5REG_FWERROR_PARAM1 0x50 188 #define MLX_V5REG_FWERROR_PARAM2 0x51 189 190 #define MLX_V5_IDB_EMPTY 0x01 /* mailbox is empty */ 191 #define MLX_V5_IDB_INIT_DONE 0x02 /* initialisation has completed */ 192 193 #define MLX_V5_IDB_HWMBOX_CMD 0x01 /* posted hardware mailbox command */ 194 #define MLX_V5_IDB_SACK 0x02 /* acknowledge status read */ 195 #define MLX_V5_IDB_RESET 0x08 /* reset request */ 196 #define MLX_V5_IDB_MEMMBOX_CMD 0x10 /* posted memory mailbox command */ 197 198 #define MLX_V5_ODB_HWSAVAIL 0x01 /* status available for hardware m/b */ 199 #define MLX_V5_ODB_MEMSAVAIL 0x02 /* status available for memory m/b */ 200 201 #define MLX_V5_ODB_HWMBOX_ACK 0x01 /* ack status read from hardware m/b */ 202 #define MLX_V5_ODB_MEMMBOX_ACK 0x02 /* ack status read from memory m/b */ 203 204 #define MLX_V5_IE_DISINT 0x04 /* interrupt disable bit */ 205 206 #define MLX_V5_FWERROR_PEND 0x04 /* firmware error pending */ 207 208 #endif /* _KERNEL */ 209 210 /* 211 * Scatter-gather list format, type 1, kind 00. 212 */ 213 struct mlx_sgentry { 214 u_int32_t sge_addr; 215 u_int32_t sge_count; 216 } __packed; 217 218 /* 219 * Command result buffers, as placed in system memory by the controller. 220 */ 221 struct mlx_enquiry_old { 222 u_int8_t me_num_sys_drvs; 223 u_int8_t me_res1[3]; 224 u_int32_t me_drvsize[8]; 225 u_int16_t me_flash_age; 226 u_int8_t me_status_flags; 227 u_int8_t me_free_state_change_count; 228 u_int8_t me_fwminor; 229 u_int8_t me_fwmajor; 230 u_int8_t me_rebuild_flag; 231 u_int8_t me_max_commands; 232 u_int8_t me_offline_sd_count; 233 u_int8_t me_res3; 234 u_int8_t me_critical_sd_count; 235 u_int8_t me_res4[3]; 236 u_int8_t me_dead_count; 237 u_int8_t me_res5; 238 u_int8_t me_rebuild_count; 239 u_int8_t me_misc_flags; 240 struct { 241 u_int8_t dd_targ; 242 u_int8_t dd_chan; 243 } __packed me_dead[20]; 244 } __packed; 245 246 struct mlx_enquiry { 247 u_int8_t me_num_sys_drvs; 248 u_int8_t me_res1[3]; 249 u_int32_t me_drvsize[32]; 250 u_int16_t me_flash_age; 251 u_int8_t me_status_flags; 252 #define MLX_ENQ_SFLAG_DEFWRERR 0x01 /* deferred write error indicator */ 253 #define MLX_ENQ_SFLAG_BATTLOW 0x02 /* battery low */ 254 u_int8_t me_res2; 255 u_int8_t me_fwminor; 256 u_int8_t me_fwmajor; 257 u_int8_t me_rebuild_flag; 258 u_int8_t me_max_commands; 259 u_int8_t me_offline_sd_count; 260 u_int8_t me_res3; 261 u_int16_t me_event_log_seq_num; 262 u_int8_t me_critical_sd_count; 263 u_int8_t me_res4[3]; 264 u_int8_t me_dead_count; 265 u_int8_t me_res5; 266 u_int8_t me_rebuild_count; 267 u_int8_t me_misc_flags; 268 #define MLX_ENQ_MISC_BBU 0x08 /* battery backup present */ 269 struct { 270 u_int8_t dd_targ; 271 u_int8_t dd_chan; 272 } __packed me_dead[20]; 273 } __packed; 274 275 struct mlx_enquiry2 { 276 u_int8_t me_hardware_id[4]; 277 u_int8_t me_firmware_id[4]; 278 u_int32_t me_res1; 279 u_int8_t me_configured_channels; 280 u_int8_t me_actual_channels; 281 u_int8_t me_max_targets; 282 u_int8_t me_max_tags; 283 u_int8_t me_max_sys_drives; 284 u_int8_t me_max_arms; 285 u_int8_t me_max_spans; 286 u_int8_t me_res2; 287 u_int32_t me_res3; 288 u_int32_t me_mem_size; 289 u_int32_t me_cache_size; 290 u_int32_t me_flash_size; 291 u_int32_t me_nvram_size; 292 u_int16_t me_mem_type; 293 u_int16_t me_clock_speed; 294 u_int16_t me_mem_speed; 295 u_int16_t me_hardware_speed; 296 u_int8_t me_res4[12]; 297 u_int16_t me_max_commands; 298 u_int16_t me_max_sg; 299 u_int16_t me_max_dp; 300 u_int16_t me_max_iod; 301 u_int16_t me_max_comb; 302 u_int8_t me_latency; 303 u_int8_t me_res5; 304 u_int8_t me_scsi_timeout; 305 u_int8_t me_res6; 306 u_int16_t me_min_freelines; 307 u_int8_t me_res7[8]; 308 u_int8_t me_rate_const; 309 u_int8_t me_res8[11]; 310 u_int16_t me_physblk; 311 u_int16_t me_logblk; 312 u_int16_t me_maxblk; 313 u_int16_t me_blocking_factor; 314 u_int16_t me_cacheline; 315 u_int8_t me_scsi_cap; 316 u_int8_t me_res9[5]; 317 u_int16_t me_firmware_build; 318 u_int8_t me_fault_mgmt_type; 319 u_int8_t me_res10; 320 u_int32_t me_firmware_features; 321 u_int8_t me_res11[8]; 322 } __packed; 323 324 /* MLX_CMD_ENQSYSDRIVE returns an array of 32 of these. */ 325 struct mlx_enq_sys_drive { 326 u_int32_t sd_size; 327 u_int8_t sd_state; 328 u_int8_t sd_raidlevel; 329 u_int16_t sd_res1; 330 } __packed; 331 332 /* 333 * MLX_CMD_LOGOP/MLX_LOGOP_GET 334 * 335 * Bitfields: 336 * 337 * 0-4 el_target SCSI target 338 * 5-7 el_target SCSI channel 339 * 0-6 el_errorcode error code 340 * 7-7 el_errorcode validity (?) 341 * 0-3 el_sense sense key 342 * 4-4 el_sense reserved 343 * 5-5 el_sense ILI 344 * 6-6 el_sense EOM 345 * 7-7 el_sense filemark 346 */ 347 struct mlx_eventlog_entry { 348 u_int8_t el_type; 349 u_int8_t el_length; 350 u_int8_t el_target; 351 u_int8_t el_lun; 352 u_int16_t el_seqno; 353 u_int8_t el_errorcode; 354 u_int8_t el_segment; 355 u_int8_t el_sense; 356 u_int8_t el_information[4]; 357 u_int8_t el_addsense; 358 u_int8_t el_csi[4]; 359 u_int8_t el_asc; 360 u_int8_t el_asq; 361 u_int8_t el_res3[12]; 362 } __packed; 363 364 #define MLX_LOGOP_GET 0x00 /* operation codes for MLX_CMD_LOGOP */ 365 #define MLX_LOGMSG_SENSE 0x00 /* log message contents codes */ 366 367 struct mlx_rebuild_stat { 368 u_int32_t rb_drive; 369 u_int32_t rb_size; 370 u_int32_t rb_remaining; 371 } __packed; 372 373 struct mlx_config { 374 u_int16_t cf_flags1; 375 #define MLX_CF2_ACTV_NEG 0x0002 376 #define MLX_CF2_NORSTRTRY 0x0080 377 #define MLX_CF2_STRGWRK 0x0100 378 #define MLX_CF2_HPSUPP 0x0200 379 #define MLX_CF2_NODISCN 0x0400 380 #define MLX_CF2_ARM 0x2000 381 #define MLX_CF2_OFM 0x8000 382 #define MLX_CF2_AEMI (MLX_CF2_ARM | MLX_CF2_OFM) 383 u_int8_t cf_oemid; 384 u_int8_t cf_oem_model; 385 u_int8_t cf_physical_sector; 386 u_int8_t cf_logical_sector; 387 u_int8_t cf_blockfactor; 388 u_int8_t cf_flags2; 389 #define MLX_CF2_READAH 0x01 390 #define MLX_CF2_BIOSDLY 0x02 391 #define MLX_CF2_REASS1S 0x10 392 #define MLX_CF2_FUAENABL 0x40 393 #define MLX_CF2_R5ALLS 0x80 394 u_int8_t cf_rcrate; 395 u_int8_t cf_res1; 396 u_int8_t cf_blocks_per_cache_line; 397 u_int8_t cf_blocks_per_stripe; 398 u_int8_t cf_scsi_param_0; 399 u_int8_t cf_scsi_param_1; 400 u_int8_t cf_scsi_param_2; 401 u_int8_t cf_scsi_param_3; 402 u_int8_t cf_scsi_param_4; 403 u_int8_t cf_scsi_param_5; 404 u_int8_t cf_scsi_initiator_id; 405 u_int8_t cf_res2; 406 u_int8_t cf_startup_mode; 407 u_int8_t cf_simultaneous_spinup_devices; 408 u_int8_t cf_delay_between_spinups; 409 u_int8_t cf_res3; 410 u_int16_t cf_checksum; 411 } __packed; 412 413 struct mlx_config2 { 414 struct mlx_config cf2_cf; 415 u_int8_t cf2_reserved0[26]; 416 u_int8_t cf2_flags; 417 #define MLX_CF2_BIOS_DIS 0x01 418 #define MLX_CF2_CDROM_DIS 0x02 419 #define MLX_CF2_GEOM_255 0x20 420 u_int8_t cf2_reserved1[9]; 421 u_int16_t cf2_checksum; 422 } __packed; 423 424 struct mlx_sys_drv_span { 425 u_int32_t sp_start_lba; 426 u_int32_t sp_nblks; 427 u_int8_t sp_arm[8]; 428 } __packed; 429 430 struct mlx_sys_drv { 431 u_int8_t sd_status; 432 u_int8_t sd_ext_status; 433 u_int8_t sd_mod1; 434 u_int8_t sd_mod2; 435 u_int8_t sd_raidlevel; 436 #define MLX_SYS_DRV_WRITEBACK (1<<7) 437 #define MLX_SYS_DRV_RAID0 0 438 #define MLX_SYS_DRV_RAID1 1 439 #define MLX_SYS_DRV_RAID3 3 440 #define MLX_SYS_DRV_RAID5 5 441 #define MLX_SYS_DRV_RAID6 6 442 #define MLX_SYS_DRV_JBOD 7 443 u_int8_t sd_valid_arms; 444 u_int8_t sd_valid_spans; 445 u_int8_t sd_init_state; 446 #define MLX_SYS_DRV_INITTED 0x81; 447 struct mlx_sys_drv_span sd_span[4]; 448 } __packed; 449 450 struct mlx_phys_drv { 451 u_int8_t pd_flags1; 452 #define MLX_PHYS_DRV_PRESENT 0x01 453 u_int8_t pd_flags2; 454 #define MLX_PHYS_DRV_OTHER 0x00 455 #define MLX_PHYS_DRV_DISK 0x01 456 #define MLX_PHYS_DRV_SEQUENTIAL 0x02 457 #define MLX_PHYS_DRV_CDROM 0x03 458 #define MLX_PHYS_DRV_FAST20 0x08 459 #define MLX_PHYS_DRV_SYNC 0x10 460 #define MLX_PHYS_DRV_FAST 0x20 461 #define MLX_PHYS_DRV_WIDE 0x40 462 #define MLX_PHYS_DRV_TAG 0x80 463 u_int8_t pd_status; 464 #define MLX_PHYS_DRV_DEAD 0x00 465 #define MLX_PHYS_DRV_WRONLY 0x02 466 #define MLX_PHYS_DRV_ONLINE 0x03 467 #define MLX_PHYS_DRV_STANDBY 0x10 468 u_int8_t pd_res1; 469 u_int8_t pd_period; 470 u_int8_t pd_offset; 471 u_int32_t pd_config_size; 472 } __packed; 473 474 struct mlx_core_cfg { 475 u_int8_t cc_num_sys_drives; 476 u_int8_t cc_res1[3]; 477 struct mlx_sys_drv cc_sys_drives[32]; 478 struct mlx_phys_drv cc_phys_drives[5 * 16]; 479 } __packed; 480 481 /* 482 * Bitfields: 483 * 484 * 0-3 dcdb_target SCSI target 485 * 4-7 dcdb_target SCSI channel 486 * 0-3 dcdb_length CDB length 487 * 4-7 dcdb_length high 4 bits of `datasize' 488 */ 489 struct mlx_dcdb { 490 u_int8_t dcdb_target; 491 u_int8_t dcdb_flags; 492 #define MLX_DCDB_NO_DATA 0x00 493 #define MLX_DCDB_DATA_IN 0x01 494 #define MLX_DCDB_DATA_OUT 0x02 495 #define MLX_DCDB_EARLY_STATUS 0x04 496 #define MLX_DCDB_TIMEOUT_10S 0x10 /* This lot is wrong? [ad] */ 497 #define MLX_DCDB_TIMEOUT_60S 0x20 498 #define MLX_DCDB_TIMEOUT_20M 0x30 499 #define MLX_DCDB_TIMEOUT_24H 0x40 500 #define MLX_DCDB_NO_AUTO_SENSE 0x40 /* XXX ?? */ 501 #define MLX_DCDB_DISCONNECT 0x80 502 u_int16_t dcdb_datasize; 503 u_int32_t dcdb_physaddr; 504 u_int8_t dcdb_length; 505 u_int8_t dcdb_sense_length; 506 u_int8_t dcdb_cdb[12]; 507 u_int8_t dcdb_sense[64]; 508 u_int8_t dcdb_status; 509 u_int8_t res1; 510 } __packed; 511 512 struct mlx_bbtable_entry { 513 u_int32_t bbt_block_number; 514 u_int8_t bbt_extent; 515 u_int8_t bbt_res1; 516 u_int8_t bbt_entry_type; 517 u_int8_t bbt_system_drive; /* high 3 bits reserved */ 518 } __packed; 519 520 #endif /* !_IC_MLXREG_H_ */ 521