root/drivers/net/ethernet/freescale/enetc/enetc_mailbox.h
/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
/*
 * Copyright 2025-2026 NXP
 *
 * The VSI-to-PSI message generic format:
 *
 * OFFSET  0                               16              24            31
 *        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *  0x0   |       CRC16 (big-endian)      |    CLASS ID   |     CMD ID    |
 *        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *  0x4   |   PROTO VER   |      LEN      |    RESV       | COOKIE|  RESV |
 *        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *  0x8   |                              RESV                             |
 *        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *  0xc   |                              RESV                             |
 *        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *  0x10  |                                                               |
 *  0x14  |                                                               |
 *  0x18  |                          Message Body                         |
 *  0x1c  |                                                               |
 *        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *  0x20  |                                                               |
 *    ~   |              Extended Message Body: LEN x 32B                 |
 *  0x3e0 |                                                               |
 *        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *
 * Field Descriptions:
 * CRC16 (16-bit): Big endian, CRC16 CCITT-FALSE algorithm, It provides the
 * equivalent data integrity check functionality as the FCS for standard
 * Ethernet frames.
 *
 * CLASS ID (8-bit) and CMD ID (8-bit): These are 8-bit fields identifying
 * the command class and the class-specific operations supported. For more
 * details, please refer to the definitions of the relevant class ID and
 * cmd ID in this document.
 *
 * PROTO VER (8-bit): Supported VSI-PSI command protocol version. Currently
 * only support version 0. To be incremented for future protocol extensions.
 *
 * LEN (8-bit): Extended message body length in increments of 32B. The upper
 * limit is given by the physical implementation of the NETC VSI-PSI Messaging
 * mechanism that supports message sizes of up to 1024B (including headers),
 * that are multiple of 32B.
 *
 * COOKIE (4-bit): Optional parameter, which, if not 0, indicates that the
 * command should be execute asynchronously on PSI side. If COOKIE is not 0
 * and the command cannot be executed instantly on the PSI side (it would
 * take longer time to complete), the PSI may enqueue the request in a command
 * queue of up to 15 entries per VSI and, later after command execution, the
 * PSI returns the COOKIE to VSI as part of an asynchronous notification
 * message that indicates the command completion status. If COOKIE is 0 then
 * the command is considered as blocking, the PSI will wait for the execution
 * of the command to complete before updating the PSIMSGRR[MC] field with the
 * corresponding return code.
 *
 * The PSI-to-VSI message generic format:
 *   0               4               8               12          15
 * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
 * |       COOKIE      |   CLASS CODE  |          CLASS ID         |
 * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
 *
 * The PSI to VSI message format is mapped to the following PSI message
 * registers/fields, depending on use case:
 * 1) PSI_RX_control: PSIMSGRR[MC] - for VSI command return code messages
 * (blocking requests), and
 * 2) PSI_TX_control: PSIMSGSR[MC] - for PSI to VSI notification messages
 * (async mode)
 *
 * Note that for some GET messages, there is no COOKIE field, and the CLASS
 * CODE field is expanded to 8 bits.
 */

#ifndef __ENETC_MAILBOX_H
#define __ENETC_MAILBOX_H

#include <linux/crc-itu-t.h>

#define ENETC_CRC_INIT                          0xffff
#define ENETC_MSG_ALIGN                         32
/* s indicates the size of the message */
#define ENETC_MSG_EXT_BODY_LEN(s)               ((s) / ENETC_MSG_ALIGN - 1)
/* l indicates the extended body len (LEN field) of the message */
#define ENETC_MSG_SIZE(l)                       (((l) + 1) * ENETC_MSG_ALIGN)

/* The cookie filed of VSI-to-PSI message */
#define ENETC_VF_MSG_COOKIE                     GENMASK(3, 0)
/* The fileds of PSI-to-VSI message, the message is only 16-bit */
#define ENETC_PF_MSG_COOKIE                     GENMASK(3, 0)
#define ENETC_PF_MSG_CLASS_CODE                 GENMASK(7, 4)
/* Extend the class code to 8-bit for GET messages without COOKIE */
#define ENETC_PF_MSG_CLASS_CODE_U8              GENMASK(7, 0)
#define ENETC_PF_MSG_CLASS_ID                   GENMASK(15, 8)

enum enetc_msg_class_id {
        /* Class ID for PSI-to-VSI messages */
        ENETC_MSG_CLASS_ID_CMD_SUCCESS          = 1,
        ENETC_MSG_CLASS_ID_PERMISSION_DENY,
        ENETC_MSG_CLASS_ID_CMD_NOT_SUPPORT,
        ENETC_MSG_CLASS_ID_PSI_BUSY,
        ENETC_MSG_CLASS_ID_CRC_ERROR,
        ENETC_MSG_CLASS_ID_PROTO_NOT_SUPPORT,
        ENETC_MSG_CLASS_ID_INVALID_MSG_LEN,
        ENETC_MSG_CLASS_ID_CMD_TIMEOUT,
        ENETC_MSG_CLASS_ID_CMD_NOT_PERMITTED,
        ENETC_MSG_CLASS_ID_CMD_FAIL, /* Generic error code for failure */
        ENETC_MSG_CLASS_ID_CMD_DEFERRED         = 0xf,

        /* Common Class ID for PSI-to-VSI and VSI-to-PSI messages */
        ENETC_MSG_CLASS_ID_MAC_FILTER           = 0x20,
        ENETC_MSG_CLASS_ID_IP_REVISION          = 0xf0,
};

enum enetc_msg_mac_filter_cmd_id {
        ENETC_MSG_SET_PRIMARY_MAC,
};

enum enetc_msg_ip_revision_cmd_id {
        ENETC_MSG_GET_IP_MN                     = 1,
};

/* Class-specific error return codes of MAC filter */
enum enetc_mac_filter_class_code {
        ENETC_MF_CLASS_CODE_INVALID_MAC,
};

struct enetc_msg_swbd {
        void *vaddr;
        dma_addr_t dma;
        int size;
};

/* The generic VSI-to-PSI message header */
struct enetc_msg_header {
        __be16 crc16;
        u8 class_id;
        u8 cmd_id;
        u8 proto_ver;
        u8 len;
        u8 resv0;
        u8 cookie;
        u8 resv2[8];
};

struct enetc_mac_addr {
        u8 addr[ETH_ALEN]; /* Network byte order */
};

/* Message format of class_id 0x20 for exact MAC filter.
 * cmd_id 0x0: set primary MAC
 * cmd_id 0x1: Add entries to MAC address filter table
 * cmd_id 0x2: Delete entries from MAC address filter table
 * Note that cmd_id 0x1 and 0x2 are not supported yet.
 */
struct enetc_msg_mac_exact_filter {
        struct enetc_msg_header hdr;
        u8 mac_cnt; /* No need to set for cmd_id 0 */
        u8 resv[3];
        struct enetc_mac_addr mac[];
};

/* The generic message format applies to the following messages:
 * Get IP revision message, class_id 0xf0.
 * cmd_id 1: get IP minor revision
 */
struct enetc_msg_generic {
        struct enetc_msg_header hdr;
        u8 resv[16];
};

#endif