rt-thread/bsp/phytium/libraries/standalone/drivers/pcie/fpcie/fpcie_config.c

99 lines
3.1 KiB
C
Raw Normal View History

/*
* Copyright : (C) 2022 Phytium Information Technology, Inc.
* All Rights Reserved.
*
* This program is OPEN SOURCE software: you can redistribute it and/or modify it
* under the terms of the Phytium Public License as published by the Phytium Technology Co.,Ltd,
* either version 1.0 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the Phytium Public License for more details.
*
*
* FilePath: fpcie_config.c
* Date: 2022-08-10 14:55:11
* LastEditTime: 2022-08-18 08:57:30
* Description: This file is for pcie miscellaneous interrupt enable or disable.
*
* Modify History:
* Ver   Who        Date         Changes
* ----- ------     --------    --------------------------------------
* 1.0 huanghe 2022/8/18 init commit
*/
#include "fpcie.h"
#include "fpcie_hw.h"
/***************************** Include Files *********************************/
/************************** Constant Definitions *****************************/
/**************************** Type Definitions *******************************/
/************************** Variable Definitions *****************************/
/***************** Macros (Inline Functions) Definitions *********************/
/************************** Function Prototypes ******************************/
/**
* @name: FPcieMiscIrqEnable
* @msg: PCIE misc
* @param {FPcie} *instance_p
* @param {fsize_t} peu_num
*/
void FPcieMiscIrqEnable(FPcie *instance_p, fsize_t peu_num)
{
u64 config_address;
u32 reg_value;
FASSERT(instance_p != NULL);
FASSERT(instance_p->is_ready == FT_COMPONENT_IS_READY);
FASSERT(peu_num <= FPCIE_PEU1_C2);
if (peu_num < FPCIE_PEU1_C0)
{
config_address = instance_p->config.peu0_config_address;
}
else
{
config_address = instance_p->config.peu1_config_address;
peu_num -= FPCIE_PEU1_C0;
}
reg_value = FPCIE_READREG(config_address, FPCIE_REG_MISC_INT_ENALBE_OFFSET);
FPCIE_WRITEREG(config_address, FPCIE_REG_MISC_INT_ENALBE_OFFSET, (reg_value | (1 << peu_num)));
}
/**
* @name: FPcieMiscIrqDisable
* @msg: PCIE misc
* @param {FPcie} *instance_p is a pointer to the FPcie instance.
* @param {fsize_t} peu_num is pci-e unit controller selection
*/
void FPcieMiscIrqDisable(FPcie *instance_p, fsize_t peu_num)
{
uintptr_t config_address;
u32 reg_value;
FASSERT(instance_p != NULL);
FASSERT(instance_p->is_ready == FT_COMPONENT_IS_READY);
FASSERT(peu_num <= FPCIE_PEU1_C2);
if (peu_num < FPCIE_PEU1_C0)
{
config_address = instance_p->config.peu0_config_address;
}
else
{
config_address = instance_p->config.peu1_config_address;
peu_num -= FPCIE_PEU1_C0;
}
reg_value = FPCIE_READREG(config_address, FPCIE_REG_MISC_INT_ENALBE_OFFSET);
FPCIE_WRITEREG(config_address, FPCIE_REG_MISC_INT_ENALBE_OFFSET, (reg_value & ~(1 << peu_num)));
}