279 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			279 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/****************************************************************************
 | 
						|
 | 
						|
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
 | 
						|
 | 
						|
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
 | 
						|
be copied by any method or incorporated into another program without
 | 
						|
the express written consent of Aerospace C.Power. This Information or any portion
 | 
						|
thereof remains the property of Aerospace C.Power. The Information contained herein
 | 
						|
is believed to be accurate and Aerospace C.Power assumes no responsibility or
 | 
						|
liability for its use in any way and conveys no license or title under
 | 
						|
any patent or copyright and makes no representation or warranty that this
 | 
						|
Information is free from patent or copyright infringement.
 | 
						|
 | 
						|
****************************************************************************/
 | 
						|
 | 
						|
/* os shim includes */
 | 
						|
#include "os_types.h"
 | 
						|
 | 
						|
/* mac module internal includes */
 | 
						|
#include "mac_vdev.h"
 | 
						|
#include "mac_pdev.h"
 | 
						|
#include "mac_status.h"
 | 
						|
#include "hw_reg_api.h"
 | 
						|
#include "mac_sys_reg.h"
 | 
						|
#include "mac_cmn_hw.h"
 | 
						|
 | 
						|
/* public api includes */
 | 
						|
#include "plc_fr.h"
 | 
						|
#include "plc_protocol.h"
 | 
						|
#include "chip_reg_base.h"
 | 
						|
#include "multi_nid_sync.h"
 | 
						|
 | 
						|
#if HW_PLATFORM == HW_PLATFORM_SIMU
 | 
						|
 | 
						|
#include "simulator_txrx.h"
 | 
						|
 | 
						|
void mac_config_nid(mac_vdev_t *vdev, uint32_t nid)
 | 
						|
{
 | 
						|
    simulator_config_nid(&g_mac_pdev[vdev->ref_pdev_id]->simu,
 | 
						|
        vdev->vdev_id, nid);
 | 
						|
}
 | 
						|
 | 
						|
uint32_t mac_get_hw_nid()
 | 
						|
{
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
void mac_config_role(mac_vdev_t *vdev, uint8_t role)
 | 
						|
{
 | 
						|
    (void)vdev;
 | 
						|
    (void)role;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t mac_get_hw_role()
 | 
						|
{
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
void mac_config_tei(mac_vdev_t *vdev, uint16_t tei)
 | 
						|
{
 | 
						|
    simulator_config_tei(&g_mac_pdev[vdev->ref_pdev_id]->simu,
 | 
						|
        vdev->vdev_id, (uint32_t)tei);
 | 
						|
}
 | 
						|
 | 
						|
uint32_t mac_get_hw_tei()
 | 
						|
{
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t mac_enable_hw_ntb_adjust(uint32_t enable)
 | 
						|
{
 | 
						|
    /* kunlun 1 has no this feature */
 | 
						|
    (void)enable;
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
void mac_ena_hw_ntb_wrap_fix(uint8_t enable)
 | 
						|
{
 | 
						|
    (void)enable;
 | 
						|
}
 | 
						|
 | 
						|
/* mac ppm calibration */
 | 
						|
uint32_t mac_ppm_cal_set(PHY_CAL_UNIT_ID cal_unit, \
 | 
						|
    int16_t ppm_err, uint32_t rate_mode)
 | 
						|
{
 | 
						|
    /* kunlun 1 has no this feature */
 | 
						|
    (void)cal_unit;
 | 
						|
    (void)ppm_err;
 | 
						|
    (void)rate_mode;
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
void mac_dump_buf_from_cvg(void)
 | 
						|
{
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
void mac_hw_sync_ppm_clr(uint8_t pdev_id)
 | 
						|
{
 | 
						|
    (void)pdev_id;
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
#else /* HW_PLATFORM */
 | 
						|
int32_t IRAM_ATTR mac_config_ntb_delta_from_isr(uint8_t is_positive, uint32_t delta_ntb)
 | 
						|
{
 | 
						|
    int32_t ret = 0;
 | 
						|
#if ENA_WAR_911
 | 
						|
    /* war for hw bug, low bit overflow high bit not + 1 */
 | 
						|
    uint32_t cur_ntb = mac_sched_get_ntb(NULL);
 | 
						|
    if (is_positive) {
 | 
						|
        /* positive */
 | 
						|
        uint64_t temp_ntb = (uint64_t)cur_ntb + delta_ntb;
 | 
						|
        if (iot_uint64_higher32(temp_ntb) >= 1) {
 | 
						|
            uint32_t temp_delta = MAX_UINT32_NTB - cur_ntb;
 | 
						|
            if (temp_delta > RESERVE_NTB) {
 | 
						|
                uint32_t temp_delta_a = temp_delta - (RESERVE_NTB >> 1);
 | 
						|
                ret = delta_ntb - temp_delta_a;
 | 
						|
                delta_ntb = temp_delta_a;
 | 
						|
                /* drop the other part of delta */
 | 
						|
            } else {
 | 
						|
                /* drop delta */
 | 
						|
                ret = delta_ntb;
 | 
						|
                delta_ntb = 0;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    } else {
 | 
						|
        /* negative */
 | 
						|
        if (cur_ntb < delta_ntb) {
 | 
						|
            ret -= (delta_ntb - cur_ntb);
 | 
						|
            delta_ntb = cur_ntb;
 | 
						|
        }
 | 
						|
    }
 | 
						|
#endif
 | 
						|
 | 
						|
    uint32_t tmp;
 | 
						|
    tmp = RGF_MAC_READ_REG(CFG_NTB_SYNC_1_ADDR);
 | 
						|
    REG_FIELD_SET(CFG_NTB_DELTA_VAL, tmp, delta_ntb);
 | 
						|
    RGF_MAC_WRITE_REG(CFG_NTB_SYNC_1_ADDR, tmp);
 | 
						|
 | 
						|
#if ENA_WAR_728
 | 
						|
    /* Note: not fix this */
 | 
						|
    #define WAR_728_CFG_NTB_DELTA_REG_TIME      3
 | 
						|
    uint32_t ntb_fix_before, ntb_fix_after;
 | 
						|
 | 
						|
    tmp = RGF_MAC_READ_REG(CFG_NTB_SYNC_0_ADDR);
 | 
						|
    ntb_fix_before = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
 | 
						|
    REG_FIELD_SET(CFG_NTB_DELTA_VAL_SIGN, tmp, is_positive);
 | 
						|
    REG_FIELD_SET(CFG_MODIFY_NTB_EN, tmp, 1);
 | 
						|
    RGF_MAC_WRITE_REG(CFG_NTB_SYNC_0_ADDR, tmp);
 | 
						|
    /* Note: not fix this. 3 mschine cycles must be delayed */
 | 
						|
    __asm volatile("nop\n");
 | 
						|
    __asm volatile("nop\n");
 | 
						|
    __asm volatile("nop\n");
 | 
						|
    ntb_fix_after = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
 | 
						|
 | 
						|
    ntb_fix_before += (is_positive ? delta_ntb : (-delta_ntb))
 | 
						|
        + WAR_728_CFG_NTB_DELTA_REG_TIME;
 | 
						|
    ret += ((ntb_fix_before > ntb_fix_after) ? 1 : 0);
 | 
						|
#else
 | 
						|
    tmp = RGF_MAC_READ_REG(CFG_NTB_SYNC_0_ADDR);
 | 
						|
    REG_FIELD_SET(CFG_NTB_DELTA_VAL_SIGN, tmp, is_positive);
 | 
						|
    REG_FIELD_SET(CFG_MODIFY_NTB_EN, tmp, 1);
 | 
						|
    RGF_MAC_WRITE_REG(CFG_NTB_SYNC_0_ADDR, tmp);
 | 
						|
#endif
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
/* mac_config_nid() - config network ID to HW
 | 
						|
 * @vdev:   pointer to mac vdev
 | 
						|
 * @nid:    the network ID to be set
 | 
						|
 */
 | 
						|
void mac_config_nid(mac_vdev_t *vdev, uint32_t nid)
 | 
						|
{
 | 
						|
    uint32_t value;
 | 
						|
    (void)vdev;
 | 
						|
 | 
						|
    value = RGF_MAC_READ_REG(CFG_MYNID_ADDR);
 | 
						|
    value &= ~CFG_MYNID_MASK;
 | 
						|
    value |= (nid << CFG_MYNID_OFFSET) & CFG_MYNID_MASK;
 | 
						|
    RGF_MAC_WRITE_REG(CFG_MYNID_ADDR, value);
 | 
						|
}
 | 
						|
 | 
						|
uint32_t mac_get_hw_nid()
 | 
						|
{
 | 
						|
    return RGF_MAC_READ_REG(CFG_MYNID_ADDR) & CFG_MYNID_MASK;
 | 
						|
}
 | 
						|
 | 
						|
void mac_config_role(mac_vdev_t *vdev, uint8_t role)
 | 
						|
{
 | 
						|
    uint32_t value;
 | 
						|
    (void)vdev;
 | 
						|
 | 
						|
    value = RGF_MAC_READ_REG(CFG_MYSTAT_ADDR);
 | 
						|
    if (role == PLC_DEV_ROLE_CCO) {
 | 
						|
        value |= CFG_CCO_MODE_MASK;
 | 
						|
    } else {
 | 
						|
        value &= ~CFG_CCO_MODE_MASK;
 | 
						|
    }
 | 
						|
    RGF_MAC_WRITE_REG(CFG_MYSTAT_ADDR, value);
 | 
						|
}
 | 
						|
 | 
						|
uint32_t mac_get_hw_role()
 | 
						|
{
 | 
						|
    return RGF_MAC_READ_REG(CFG_MYSTAT_ADDR) & CFG_CCO_MODE_MASK;
 | 
						|
}
 | 
						|
 | 
						|
void mac_config_tei(mac_vdev_t *vdev, uint16_t tei)
 | 
						|
{
 | 
						|
    uint32_t value;
 | 
						|
    (void)vdev;
 | 
						|
 | 
						|
    value = RGF_MAC_READ_REG(CFG_MYTEI_ADDR);
 | 
						|
    value &= ~CFG_MYTEI_MASK;
 | 
						|
    value |= (((uint32_t)tei) << CFG_MYTEI_OFFSET) & CFG_MYTEI_MASK;
 | 
						|
    RGF_MAC_WRITE_REG(CFG_MYTEI_ADDR, value);
 | 
						|
}
 | 
						|
 | 
						|
uint32_t mac_get_hw_tei()
 | 
						|
{
 | 
						|
    return RGF_MAC_READ_REG(CFG_MYTEI_ADDR) & CFG_MYTEI_MASK;
 | 
						|
}
 | 
						|
 | 
						|
void mac_set_sg_sack_snr(uint32_t ena_sw_cfg, int8_t snr)
 | 
						|
{
 | 
						|
    uint32_t tmp;
 | 
						|
    tmp = RGF_MAC_READ_REG(CFG_TX_CTRL1_ADDR);
 | 
						|
    REG_FIELD_SET(CFG_SG_SNR_BY_SW, tmp, ena_sw_cfg);
 | 
						|
    REG_FIELD_SET(CFG_SG_SNR, tmp, snr);
 | 
						|
    RGF_MAC_WRITE_REG(CFG_TX_CTRL1_ADDR, tmp);
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t mac_enable_hw_ntb_adjust(uint32_t enable)
 | 
						|
{
 | 
						|
    /* kunlun 1 has no this feature */
 | 
						|
    (void)enable;
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
void mac_ena_hw_ntb_wrap_fix(uint8_t enable)
 | 
						|
{
 | 
						|
    /* kunlun1 not supported */
 | 
						|
    (void)enable;
 | 
						|
}
 | 
						|
 | 
						|
/* mac ppm calibration */
 | 
						|
uint32_t mac_ppm_cal_set(PHY_CAL_UNIT_ID cal_unit, \
 | 
						|
    int16_t ppm_err, uint32_t rate_mode)
 | 
						|
{
 | 
						|
    (void)cal_unit;
 | 
						|
    (void)ppm_err;
 | 
						|
    (void)rate_mode;
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
void mac_dump_buf_from_cvg(void)
 | 
						|
{
 | 
						|
    phy_get_status_printf_force();
 | 
						|
    mac_get_status_printf();
 | 
						|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
 | 
						|
    mac_dump_buf(MAC_DUMP_TYPE_3, (uint32_t *)INTC_BASEADDR, 7, \
 | 
						|
        (uint32_t *)RGF_MAC_BASEADDR, 86, \
 | 
						|
        (uint32_t *)RGF_RX_BASEADDR, 69, true);
 | 
						|
#endif
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
void IRAM_ATTR mac_hw_sync_ppm_clr(uint8_t pdev_id)
 | 
						|
{
 | 
						|
    if (mac_multi_sync_get_ena(pdev_id)) {
 | 
						|
        /* reset rx ppm */
 | 
						|
        phy_ppm_set(g_phy_ctxt.dep.phy_ppm_init, BB_PPM_RX_ONLY);
 | 
						|
    }
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
#endif /* HW_PLATFORM */
 |