/*
 * CXL CDAT Structure
 *
 * Copyright (C) 2021 Avery Design Systems, Inc.
 *
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
 * See the COPYING file in the top-level directory.
 */

#ifndef CXL_CDAT_H
#define CXL_CDAT_H

#include "hw/cxl/cxl_pci.h"
#include "hw/pci/pcie_doe.h"

/*
 * Reference:
 *   Coherent Device Attribute Table (CDAT) Specification, Rev. 1.03, July. 2022
 *   Compute Express Link (CXL) Specification, Rev. 3.0, Aug. 2022
 */
/* Table Access DOE - CXL r3.0 8.1.11 */
#define CXL_DOE_TABLE_ACCESS      2
#define CXL_DOE_PROTOCOL_CDAT     ((CXL_DOE_TABLE_ACCESS << 16) | CXL_VENDOR_ID)

/* Read Entry - CXL r3.0 8.1.11.1 */
#define CXL_DOE_TAB_TYPE_CDAT 0
#define CXL_DOE_TAB_ENT_MAX 0xFFFF

/* Read Entry Request - CXL r3.0 8.1.11.1 Table 8-13 */
#define CXL_DOE_TAB_REQ 0
typedef struct CDATReq {
    DOEHeader header;
    uint8_t req_code;
    uint8_t table_type;
    uint16_t entry_handle;
} QEMU_PACKED CDATReq;

/* Read Entry Response - CXL r3.0 8.1.11.1 Table 8-14 */
#define CXL_DOE_TAB_RSP 0
typedef struct CDATRsp {
    DOEHeader header;
    uint8_t rsp_code;
    uint8_t table_type;
    uint16_t entry_handle;
} QEMU_PACKED CDATRsp;

/* CDAT Table Format - CDAT Table 1 */
#define CXL_CDAT_REV 2
typedef struct CDATTableHeader {
    uint32_t length;
    uint8_t revision;
    uint8_t checksum;
    uint8_t reserved[6];
    uint32_t sequence;
} QEMU_PACKED CDATTableHeader;

/* CDAT Structure Types - CDAT Table 2 */
typedef enum {
    CDAT_TYPE_DSMAS = 0,
    CDAT_TYPE_DSLBIS = 1,
    CDAT_TYPE_DSMSCIS = 2,
    CDAT_TYPE_DSIS = 3,
    CDAT_TYPE_DSEMTS = 4,
    CDAT_TYPE_SSLBIS = 5,
} CDATType;

typedef struct CDATSubHeader {
    uint8_t type;
    uint8_t reserved;
    uint16_t length;
} CDATSubHeader;

/* Device Scoped Memory Affinity Structure - CDAT Table 3 */
typedef struct CDATDsmas {
    CDATSubHeader header;
    uint8_t DSMADhandle;
    uint8_t flags;
#define CDAT_DSMAS_FLAG_NV              (1 << 2)
#define CDAT_DSMAS_FLAG_SHAREABLE       (1 << 3)
#define CDAT_DSMAS_FLAG_HW_COHERENT     (1 << 4)
#define CDAT_DSMAS_FLAG_DYNAMIC_CAP     (1 << 5)
    uint16_t reserved;
    uint64_t DPA_base;
    uint64_t DPA_length;
} QEMU_PACKED CDATDsmas;

/* Device Scoped Latency and Bandwidth Information Structure - CDAT Table 5 */
typedef struct CDATDslbis {
    CDATSubHeader header;
    uint8_t handle;
    /* Definitions of these fields refer directly to HMAT fields */
    uint8_t flags;
    uint8_t data_type;
    uint8_t reserved;
    uint64_t entry_base_unit;
    uint16_t entry[3];
    uint16_t reserved2;
} QEMU_PACKED CDATDslbis;

/* Device Scoped Memory Side Cache Information Structure - CDAT Table 6 */
typedef struct CDATDsmscis {
    CDATSubHeader header;
    uint8_t DSMAS_handle;
    uint8_t reserved[3];
    uint64_t memory_side_cache_size;
    uint32_t cache_attributes;
} QEMU_PACKED CDATDsmscis;

/* Device Scoped Initiator Structure - CDAT Table 7 */
typedef struct CDATDsis {
    CDATSubHeader header;
    uint8_t flags;
    uint8_t handle;
    uint16_t reserved;
} QEMU_PACKED CDATDsis;

/* Device Scoped EFI Memory Type Structure - CDAT Table 8 */
typedef struct CDATDsemts {
    CDATSubHeader header;
    uint8_t DSMAS_handle;
    uint8_t EFI_memory_type_attr;
    uint16_t reserved;
    uint64_t DPA_offset;
    uint64_t DPA_length;
} QEMU_PACKED CDATDsemts;

/* Switch Scoped Latency and Bandwidth Information Structure - CDAT Table 9 */
typedef struct CDATSslbisHeader {
    CDATSubHeader header;
    uint8_t data_type;
    uint8_t reserved[3];
    uint64_t entry_base_unit;
} QEMU_PACKED CDATSslbisHeader;

#define CDAT_PORT_ID_USP 0x100
/* Switch Scoped Latency and Bandwidth Entry - CDAT Table 10 */
typedef struct CDATSslbe {
    uint16_t port_x_id;
    uint16_t port_y_id;
    uint16_t latency_bandwidth;
    uint16_t reserved;
} QEMU_PACKED CDATSslbe;

typedef struct CDATSslbis {
    CDATSslbisHeader sslbis_header;
    CDATSslbe sslbe[];
} QEMU_PACKED CDATSslbis;

typedef struct CDATEntry {
    void *base;
    uint32_t length;
} CDATEntry;

typedef struct CDATObject {
    CDATEntry *entry;
    int entry_len;

    int (*build_cdat_table)(CDATSubHeader ***cdat_table, void *priv);
    void (*free_cdat_table)(CDATSubHeader **cdat_table, int num, void *priv);
    bool to_update;
    void *private;
    char *filename;
    uint8_t *buf;
    struct CDATSubHeader **built_buf;
    int built_buf_len;
} CDATObject;
#endif /* CXL_CDAT_H */
