Skip to content

Commit

Permalink
hw/misc: Introduce the Xilinx CFI interface
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
figlesia-xilinx authored and pm215 committed Sep 8, 2023
1 parent 0df1149 commit 5a8559e
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 0 deletions.
6 changes: 6 additions & 0 deletions MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -1026,6 +1026,12 @@ S: Maintained
F: hw/ssi/xlnx-versal-ospi.c
F: include/hw/ssi/xlnx-versal-ospi.h

Xilinx Versal CFI
M: Francisco Iglesias <francisco.iglesias@amd.com>
S: Maintained
F: hw/misc/xlnx-cfi-if.c
F: include/hw/misc/xlnx-cfi-if.h

STM32F100
M: Alexandre Iooss <erdnaxe@crans.org>
L: qemu-arm@nongnu.org
Expand Down
1 change: 1 addition & 0 deletions hw/misc/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ specific_ss.add(when: 'CONFIG_XLNX_VERSAL', if_true: files('xlnx-versal-crl.c'))
system_ss.add(when: 'CONFIG_XLNX_VERSAL', if_true: files(
'xlnx-versal-xramc.c',
'xlnx-versal-pmc-iou-slcr.c',
'xlnx-cfi-if.c',
))
system_ss.add(when: 'CONFIG_STM32F2XX_SYSCFG', if_true: files('stm32f2xx_syscfg.c'))
system_ss.add(when: 'CONFIG_STM32F4XX_SYSCFG', if_true: files('stm32f4xx_syscfg.c'))
Expand Down
34 changes: 34 additions & 0 deletions hw/misc/xlnx-cfi-if.c
Original file line number Diff line number Diff line change
@@ -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)

59 changes: 59 additions & 0 deletions include/hw/misc/xlnx-cfi-if.h
Original file line number Diff line number Diff line change
@@ -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 */

0 comments on commit 5a8559e

Please sign in to comment.