Browse Source
Introduce the Xilinx Configuration Frame Interface (CFI) for transmitting CFI data packets between the Xilinx Configuration Frame Unit models (CFU_APB, CFU_FDRO and CFU_SFR), the Xilinx CFRAME controller (CFRAME_REG) and the Xilinx CFRAME broadcast controller (CFRAME_BCAST_REG) models (when emulating bitstream programming and readback). Signed-off-by: Francisco Iglesias <francisco.iglesias@amd.com> Reviewed-by: Sai Pavan Boddu <sai.pavan.boddu@amd.com> Acked-by: Edgar E. Iglesias <edgar@zeroasic.com> Message-id: 20230831165701.2016397-2-francisco.iglesias@amd.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>pull/251/head
committed by
Peter Maydell
4 changed files with 100 additions and 0 deletions
@ -0,0 +1,34 @@ |
|||
/*
|
|||
* Xilinx CFI interface |
|||
* |
|||
* Copyright (C) 2023, Advanced Micro Devices, Inc. |
|||
* |
|||
* Written by Francisco Iglesias <francisco.iglesias@amd.com> |
|||
* |
|||
* SPDX-License-Identifier: GPL-2.0-or-later |
|||
*/ |
|||
#include "qemu/osdep.h" |
|||
#include "hw/misc/xlnx-cfi-if.h" |
|||
|
|||
void xlnx_cfi_transfer_packet(XlnxCfiIf *cfi_if, XlnxCfiPacket *pkt) |
|||
{ |
|||
XlnxCfiIfClass *xcic = XLNX_CFI_IF_GET_CLASS(cfi_if); |
|||
|
|||
if (xcic->cfi_transfer_packet) { |
|||
xcic->cfi_transfer_packet(cfi_if, pkt); |
|||
} |
|||
} |
|||
|
|||
static const TypeInfo xlnx_cfi_if_info = { |
|||
.name = TYPE_XLNX_CFI_IF, |
|||
.parent = TYPE_INTERFACE, |
|||
.class_size = sizeof(XlnxCfiIfClass), |
|||
}; |
|||
|
|||
static void xlnx_cfi_if_register_types(void) |
|||
{ |
|||
type_register_static(&xlnx_cfi_if_info); |
|||
} |
|||
|
|||
type_init(xlnx_cfi_if_register_types) |
|||
|
|||
@ -0,0 +1,59 @@ |
|||
/*
|
|||
* Xilinx CFI interface |
|||
* |
|||
* Copyright (C) 2023, Advanced Micro Devices, Inc. |
|||
* |
|||
* Written by Francisco Iglesias <francisco.iglesias@amd.com> |
|||
* |
|||
* SPDX-License-Identifier: GPL-2.0-or-later |
|||
*/ |
|||
#ifndef XLNX_CFI_IF_H |
|||
#define XLNX_CFI_IF_H 1 |
|||
|
|||
#include "qemu/help-texts.h" |
|||
#include "hw/hw.h" |
|||
#include "qom/object.h" |
|||
|
|||
#define TYPE_XLNX_CFI_IF "xlnx-cfi-if" |
|||
typedef struct XlnxCfiIfClass XlnxCfiIfClass; |
|||
DECLARE_CLASS_CHECKERS(XlnxCfiIfClass, XLNX_CFI_IF, TYPE_XLNX_CFI_IF) |
|||
|
|||
#define XLNX_CFI_IF(obj) \ |
|||
INTERFACE_CHECK(XlnxCfiIf, (obj), TYPE_XLNX_CFI_IF) |
|||
|
|||
typedef enum { |
|||
PACKET_TYPE_CFU = 0x52, |
|||
PACKET_TYPE_CFRAME = 0xA1, |
|||
} xlnx_cfi_packet_type; |
|||
|
|||
typedef enum { |
|||
CFRAME_FAR = 1, |
|||
CFRAME_SFR = 2, |
|||
CFRAME_FDRI = 4, |
|||
CFRAME_CMD = 6, |
|||
} xlnx_cfi_reg_addr; |
|||
|
|||
typedef struct XlnxCfiPacket { |
|||
uint8_t reg_addr; |
|||
uint32_t data[4]; |
|||
} XlnxCfiPacket; |
|||
|
|||
typedef struct XlnxCfiIf { |
|||
Object Parent; |
|||
} XlnxCfiIf; |
|||
|
|||
typedef struct XlnxCfiIfClass { |
|||
InterfaceClass parent; |
|||
|
|||
void (*cfi_transfer_packet)(XlnxCfiIf *cfi_if, XlnxCfiPacket *pkt); |
|||
} XlnxCfiIfClass; |
|||
|
|||
/**
|
|||
* Transfer a XlnxCfiPacket. |
|||
* |
|||
* @cfi_if: the object implementing this interface |
|||
* @XlnxCfiPacket: a pointer to the XlnxCfiPacket to transfer |
|||
*/ |
|||
void xlnx_cfi_transfer_packet(XlnxCfiIf *cfi_if, XlnxCfiPacket *pkt); |
|||
|
|||
#endif /* XLNX_CFI_IF_H */ |
|||
Loading…
Reference in new issue