From b242e9c35ae998f1f732deff174c4513a5f34ad1 Mon Sep 17 00:00:00 2001 From: Mandy Lavi Date: Thu, 19 Nov 2015 07:18:04 +0200 Subject: fmd: Add support for IPF after HMan fmd: change cc owners attribute from uint8 to unit16 fmd: change manip owner attribute from uint8 to unit16 fmd: add risc load monitor in sysfs fmd: Fix modification of nodes pointed by HM fmd: add missing fields in pcd_manip_hdr_insrt_ip Signed-off-by: Mandy Lavi diff --git a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_cc.c b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_cc.c index 13a5c15..c7ddc88 100644 --- a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_cc.c +++ b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_cc.c @@ -844,6 +844,7 @@ static t_Handle BuildNewAd( t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams) { t_FmPcdCcNode *p_FmPcdCcNodeTmp; + t_Handle h_OrigAd = NULL; p_FmPcdCcNodeTmp = (t_FmPcdCcNode*)XX_Malloc(sizeof(t_FmPcdCcNode)); if (!p_FmPcdCcNodeTmp) @@ -874,6 +875,7 @@ static t_Handle BuildNewAd( { if (p_FmPcdCcNextEngineParams->h_Manip) { + h_OrigAd = p_CcNode->h_Ad; if (AllocAndFillAdForContLookupManip( p_FmPcdCcNextEngineParams->params.ccParams.h_CcNode) != E_OK) @@ -884,7 +886,7 @@ static t_Handle BuildNewAd( } } FillAdOfTypeContLookup(h_Ad, NULL, p_CcNode->h_FmPcd, p_FmPcdCcNodeTmp, - p_FmPcdCcNextEngineParams->h_Manip, NULL); + h_OrigAd ? NULL : p_FmPcdCcNextEngineParams->h_Manip, NULL); } #if (DPAA_VERSION >= 11) @@ -3573,6 +3575,7 @@ static t_Error UpdatePtrWhichPointOnCrntMdfNode( t_FmPcdCcNextEngineParams *p_NextEngineParams = NULL; t_CcNodeInformation ccNodeInfo = { 0 }; t_Handle h_NewAd; + t_Handle h_OrigAd = NULL; /* Building a list of all action descriptors that point to the previous node */ if (!LIST_IsEmpty(&p_CcNode->ccPrevNodesLst)) @@ -3592,13 +3595,14 @@ static t_Error UpdatePtrWhichPointOnCrntMdfNode( RETURN_ERROR(MAJOR, E_NO_MEMORY, NO_MSG); IOMemSet32(h_NewAd, 0, FM_PCD_CC_AD_ENTRY_SIZE); + h_OrigAd = p_CcNode->h_Ad; BuildNewAd(h_NewAd, p_FmPcdModifyCcKeyAdditionalParams, p_CcNode, p_NextEngineParams); ccNodeInfo.h_CcNode = h_NewAd; EnqueueNodeInfoToRelevantLst(h_NewLst, &ccNodeInfo, NULL); - if (p_NextEngineParams->h_Manip) + if (p_NextEngineParams->h_Manip && !h_OrigAd) FmPcdManipUpdateOwner(p_NextEngineParams->h_Manip, FALSE); } return E_OK; diff --git a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_cc.h b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_cc.h index 00d3f05..d148ff4 100644 --- a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_cc.h +++ b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_cc.h @@ -326,7 +326,7 @@ typedef struct uint8_t offset; uint8_t prsArrayOffset; bool ctrlFlow; - uint8_t owners; + uint16_t owners; uint8_t ccKeySizeAccExtraction; uint8_t sizeOfExtraction; @@ -361,7 +361,7 @@ typedef struct { t_FmPcdCcNode *p_FmPcdCcNode; bool occupied; - uint8_t owners; + uint16_t owners; volatile bool lock; } t_FmPcdCcNodeArray; @@ -382,7 +382,7 @@ typedef struct t_List fmPortsLst; t_FmPcdLock *p_Lock; uint8_t numOfEntries; - uint8_t owners; + uint16_t owners; t_Handle h_FmPcdCcSavedManipParams; bool modifiedState; uint32_t requiredAction; diff --git a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.c b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.c index ba81535..f7be4d9 100644 --- a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.c +++ b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.c @@ -1017,6 +1017,7 @@ static t_Error BuildHmct(t_FmPcdManip *p_Manip, /* If this node has a nextManip, and no parsing is required, the old table must be copied to the new table the old table and should be freed */ if (p_FmPcdManipParams->h_NextManip && + (p_Manip->nextManipType == e_FM_PCD_MANIP_HDR) && (MANIP_DONT_REPARSE(p_Manip))) { if (new) @@ -1028,14 +1029,6 @@ static t_Error BuildHmct(t_FmPcdManip *p_Manip, p_Manip->unifiedPosition = e_MANIP_UNIFIED_FIRST; - /* The HMTD of the next Manip is never going to be used */ - if (((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->muramAllocate) - FM_MURAM_FreeMem( - ((t_FmPcd *)((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_FmPcd)->h_FmMuram, - ((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad); - else - XX_Free(((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad); - ((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad = NULL; } } else @@ -1058,15 +1051,23 @@ static t_Error CreateManipActionNew(t_FmPcdManip *p_Manip, uint8_t *p_OldHmct, *p_TmpHmctPtr, *p_TmpDataPtr; /* set Manip structure */ + + p_Manip->dontParseAfterManip = + p_FmPcdManipParams->u.hdr.dontParseAfterManip; + if (p_FmPcdManipParams->h_NextManip) - { - if (p_FmPcdManipParams->u.hdr.dontParseAfterManip) + { /* Next Header manipulation exists */ + p_Manip->nextManipType = MANIP_GET_TYPE(p_FmPcdManipParams->h_NextManip); + + if ((p_Manip->nextManipType == e_FM_PCD_MANIP_HDR) && p_Manip->dontParseAfterManip) nextSize = (uint32_t)(GetHmctSize(p_FmPcdManipParams->h_NextManip) + GetDataSize(p_FmPcdManipParams->h_NextManip)); - else - p_Manip->cascadedNext = TRUE; + else /* either parsing is required or next manip is Frag; no table merging. */ + p_Manip->cascaded = TRUE; + /* pass up the "cascaded" attribute. The whole chain is cascaded + * if something is cascaded along the way. */ + if (MANIP_IS_CASCADED(p_FmPcdManipParams->h_NextManip)) + p_Manip->cascaded = TRUE; } - p_Manip->dontParseAfterManip = - p_FmPcdManipParams->u.hdr.dontParseAfterManip; /* Allocate new table */ /* calculate table size according to manip parameters */ @@ -1105,9 +1106,9 @@ static t_Error CreateManipActionNew(t_FmPcdManip *p_Manip, ("MURAM allocation for HdrManip node shadow")); } - - if (p_FmPcdManipParams->h_NextManip && - (MANIP_DONT_REPARSE(p_Manip))) + if (p_FmPcdManipParams->h_NextManip + && (p_Manip->nextManipType == e_FM_PCD_MANIP_HDR) + && (MANIP_DONT_REPARSE(p_Manip))) { p_OldHmct = (uint8_t *)GetManipInfo(p_FmPcdManipParams->h_NextManip, e_MANIP_HMCT); @@ -1157,18 +1158,28 @@ static t_Error CreateManipActionNew(t_FmPcdManip *p_Manip, /* Build HMTD (table descriptor) */ tmpReg = HMTD_CFG_TYPE; /* NADEN = 0 */ + /* add parseAfterManip */ if (!p_Manip->dontParseAfterManip) tmpReg |= HMTD_CFG_PRS_AFTER_HM; /* create cascade */ - if (p_FmPcdManipParams->h_NextManip && - !MANIP_DONT_REPARSE(p_Manip)) + /*if (p_FmPcdManipParams->h_NextManip + && (!MANIP_DONT_REPARSE(p_Manip) || (p_Manip->nextManipType != e_FM_PCD_MANIP_HDR)))*/ + if (p_Manip->cascaded) { + uint16_t nextAd; /* indicate that there's another HM table descriptor */ tmpReg |= HMTD_CFG_NEXT_AD_EN; - WRITE_UINT16( - ((t_Hmtd *)p_Manip->h_Ad)->nextAdIdx, - (uint16_t)((uint32_t)(XX_VirtToPhys(MANIP_GET_HMTD_PTR(p_FmPcdManipParams->h_NextManip)) - (((t_FmPcd*)p_Manip->h_FmPcd)->physicalMuramBase)) >> 4)); + /* get address of next HMTD (table descriptor; h_Ad). + * If the next HMTD was removed due to table unifing, get the address + * of the "next next" as written in the h_Ad of the next h_Manip node. + */ + if (p_Manip->unifiedPosition != e_MANIP_UNIFIED_FIRST) + nextAd = (uint16_t)((uint32_t)(XX_VirtToPhys(MANIP_GET_HMTD_PTR(p_FmPcdManipParams->h_NextManip)) - (((t_FmPcd*)p_Manip->h_FmPcd)->physicalMuramBase)) >> 4); + else + nextAd = ((t_Hmtd *)((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad)->nextAdIdx; + + WRITE_UINT16(((t_Hmtd *)p_Manip->h_Ad)->nextAdIdx, nextAd); } WRITE_UINT16(((t_Hmtd *)p_Manip->h_Ad)->cfg, tmpReg); @@ -1178,6 +1189,19 @@ static t_Error CreateManipActionNew(t_FmPcdManip *p_Manip, WRITE_UINT8(((t_Hmtd *)p_Manip->h_Ad)->opCode, HMAN_OC); + if (p_Manip->unifiedPosition == e_MANIP_UNIFIED_FIRST) + { + /* The HMTD of the next Manip is never going to be used */ + if (((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->muramAllocate) + FM_MURAM_FreeMem( + ((t_FmPcd *)((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_FmPcd)->h_FmMuram, + ((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad); + else + XX_Free(((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad); + ((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad = NULL; + } + + return E_OK; } @@ -2606,12 +2630,11 @@ static t_Error CheckManipParamsAndSetType(t_FmPcdManip *p_Manip, RETURN_ERROR( MAJOR, E_INVALID_STATE, ("h_NextManip is already a part of another chain")); - if (MANIP_GET_TYPE(p_ManipParams->h_NextManip) - != e_FM_PCD_MANIP_HDR) - RETURN_ERROR( - MAJOR, - E_NOT_SUPPORTED, - ("For a Header Manipulation node - no support of h_NextManip of type other than Header Manipulation.")); + if ((MANIP_GET_TYPE(p_ManipParams->h_NextManip) + != e_FM_PCD_MANIP_HDR) && + (MANIP_GET_TYPE(p_ManipParams->h_NextManip) + != e_FM_PCD_MANIP_FRAG)) + RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("For a Header Manipulation node - no support of h_NextManip of type other than Header Manipulation or Fragmentation.")); } if (p_ManipParams->u.hdr.rmv) @@ -4673,8 +4696,8 @@ t_Error FmPcdManipCheckParamsForCcNextEngine( p_Manip->ownerTmp++; break; case (HMAN_OC): - if ((p_FmPcdCcNextEngineParams->nextEngine == e_FM_PCD_CC) - && MANIP_IS_CASCADE_NEXT(p_Manip)) + if (( p_FmPcdCcNextEngineParams->nextEngine == e_FM_PCD_CC) + && MANIP_IS_CASCADED(p_Manip)) RETURN_ERROR( MINOR, E_INVALID_STATE, @@ -5262,7 +5285,7 @@ t_Error FM_PCD_ManipNodeReplace(t_Handle h_Manip, * (1) If this is an independent node, all its owners should be updated. * * (2) If it is the head of a cascaded chain (it does not have a "prev" but - * it has a "next" and it has a "cascaded-next" indication), the next + * it has a "next" and it has a "cascaded" indication), the next * node remains unchanged, and the behavior is as in (1). * * (3) If it is not the head, but a part of a cascaded chain, in can be diff --git a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.h b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.h index de7e4c8..b85d861 100644 --- a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.h +++ b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.h @@ -279,7 +279,7 @@ } /* position regarding Manip SW structure */ #define MANIP_IS_FIRST(h_Manip) (!(((t_FmPcdManip *)h_Manip)->h_PrevManip)) -#define MANIP_IS_CASCADE_NEXT(h_Manip) (((t_FmPcdManip *)h_Manip)->cascadedNext) +#define MANIP_IS_CASCADED(h_Manip) (((t_FmPcdManip *)h_Manip)->cascaded) #define MANIP_IS_UNIFIED(h_Manip) (!(((t_FmPcdManip *)h_Manip)->unifiedPosition == e_MANIP_UNIFIED_NONE)) #define MANIP_IS_UNIFIED_NON_FIRST(h_Manip) ((((t_FmPcdManip *)h_Manip)->unifiedPosition == e_MANIP_UNIFIED_MID) || \ (((t_FmPcdManip *)h_Manip)->unifiedPosition == e_MANIP_UNIFIED_LAST)) @@ -482,6 +482,7 @@ typedef struct{ bool insrt; t_Handle h_NextManip; t_Handle h_PrevManip; + e_FmPcdManipType nextManipType; /* HdrManip parameters*/ uint8_t *p_Hmct; uint8_t *p_Data; @@ -490,11 +491,11 @@ typedef struct{ bool custom; uint16_t tableSize; uint8_t dataSize; - bool cascadedNext; + bool cascaded; e_ManipUnifiedPosition unifiedPosition; /* end HdrManip */ uint8_t *p_Template; - uint8_t owner; + uint16_t owner; uint32_t updateParams; uint32_t shadowUpdateParams; bool frag; diff --git a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_fm.h b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_fm.h index 05202a2..95e382c 100644 --- a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_fm.h +++ b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_fm.h @@ -234,6 +234,7 @@ typedef struct { struct class *fm_class; struct device_attribute *dev_attr_stats; struct device_attribute *dev_attr_regs; + struct device_attribute *dev_attr_risc_load; struct device_attribute *dev_pcd_attr_stats; struct device_attribute *dev_plcr_attr_regs; diff --git a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.h b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.h index 3b6fb59..af158e9 100644 --- a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.h +++ b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.h @@ -429,6 +429,13 @@ typedef struct ioc_compat_fm_pcd_manip_hdr_insrt_ip_params_t { uint8_t last_pid_offset; /**< the offset of the last Protocol within the inserted header */ uint16_t id; /**< 16 bit New IP ID */ + bool dont_frag_overwrite; + /**< IPv4 only. DF is overwritten with the hash-result next-to-last byte. + * This byte is configured to be overwritten when RPD is set. */ + uint8_t last_dst_offset; + /**< IPv6 only. if routing extension exist, user should set the offset of the destination address + * in order to calculate UDP checksum pseudo header; + * Otherwise set it to '0'. */ ioc_compat_fm_pcd_manip_hdr_insrt_t insrt; /**< size and data to be inserted. */ } ioc_compat_fm_pcd_manip_hdr_insrt_ip_params_t; #endif /* (DPAA_VERSION >= 11) */ diff --git a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_sysfs_fm.c b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_sysfs_fm.c index dd3bc3e..3545634 100644 --- a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_sysfs_fm.c +++ b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_sysfs_fm.c @@ -44,6 +44,7 @@ #endif #include "../../fman/Peripherals/FM/fm.h" +#include static int fm_get_counter(void *h_fm, e_FmCounters cnt_e, uint32_t *cnt_val); @@ -225,6 +226,46 @@ static const struct sysfs_stats_t fm_sysfs_stats[] = { }; +static ssize_t show_fm_risc_load(struct device *dev, + struct device_attribute *attr, char *buf) +{ + t_LnxWrpFmDev *p_wrp_fm_dev = NULL; + unsigned long flags; + int m =0; + int err =0; + unsigned n = 0; + t_FmCtrlMon util; + uint8_t i =0 ; + + if (attr == NULL || buf == NULL || dev == NULL) + return -EINVAL; + + p_wrp_fm_dev = (t_LnxWrpFmDev *) dev_get_drvdata(dev); + if (WARN_ON(p_wrp_fm_dev == NULL)) + return -EINVAL; + + if (!p_wrp_fm_dev->active || !p_wrp_fm_dev->h_Dev) + return -EIO; + + local_irq_save(flags); + + /* Calculate risc load */ + FM_CtrlMonStart(p_wrp_fm_dev->h_Dev); + msleep(1000); + FM_CtrlMonStop(p_wrp_fm_dev->h_Dev); + + for (i = 0; i < FM_NUM_OF_CTRL; i++) { + err |= FM_CtrlMonGetCounters(p_wrp_fm_dev->h_Dev, i, &util); + m = snprintf(&buf[n],PAGE_SIZE,"\tRisc%u: util-%u%%, efficiency-%u%%\n", + i, util.percentCnt[0], util.percentCnt[1]); + n=m+n; + } + + local_irq_restore(flags); + + return n; +} + /* Fm stats and regs dumps via sysfs */ static ssize_t show_fm_dma_stats(struct device *dev, struct device_attribute *attr, char *buf) @@ -598,6 +639,7 @@ static ssize_t show_fm_schemes(struct device *dev, /* FM */ static DEVICE_ATTR(enq_total_frame, S_IRUGO, show_fm_stats, NULL); static DEVICE_ATTR(deq_total_frame, S_IRUGO, show_fm_stats, NULL); +static DEVICE_ATTR(fm_risc_load_val, S_IRUGO, show_fm_risc_load, NULL); static DEVICE_ATTR(deq_0, S_IRUGO, show_fm_stats, NULL); static DEVICE_ATTR(deq_1, S_IRUGO, show_fm_stats, NULL); static DEVICE_ATTR(deq_2, S_IRUGO, show_fm_stats, NULL); @@ -1211,6 +1253,7 @@ int fm_sysfs_create(struct device *dev) /* store to remove them when module is disabled */ p_wrp_fm_dev->dev_attr_regs = &dev_attr_fm_regs; + p_wrp_fm_dev->dev_attr_risc_load = &dev_attr_fm_risc_load_val; p_wrp_fm_dev->dev_fm_fpm_attr_regs = &dev_attr_fm_fpm_regs; p_wrp_fm_dev->dev_fm_kg_attr_regs = &dev_attr_fm_kg_regs; p_wrp_fm_dev->dev_fm_kg_pe_attr_regs = &dev_attr_fm_kg_pe_regs; @@ -1239,6 +1282,9 @@ int fm_sysfs_create(struct device *dev) if (device_create_file(dev, &dev_attr_fm_regs) != 0) return -EIO; + if (device_create_file(dev, &dev_attr_fm_risc_load_val) != 0) + return -EIO; + if (device_create_file(dev, &dev_attr_fm_fpm_regs) != 0) return -EIO; diff --git a/include/uapi/linux/fmd/Peripherals/fm_pcd_ioctls.h b/include/uapi/linux/fmd/Peripherals/fm_pcd_ioctls.h index ad655cc..325f186 100644 --- a/include/uapi/linux/fmd/Peripherals/fm_pcd_ioctls.h +++ b/include/uapi/linux/fmd/Peripherals/fm_pcd_ioctls.h @@ -2091,6 +2091,13 @@ typedef struct ioc_fm_pcd_manip_hdr_insrt_ip_params_t { uint8_t last_pid_offset; /**< the offset of the last Protocol within the inserted header */ uint16_t id; /**< 16 bit New IP ID */ + bool dont_frag_overwrite; + /**< IPv4 only. DF is overwritten with the hash-result next-to-last byte. + * This byte is configured to be overwritten when RPD is set. */ + uint8_t last_dst_offset; + /**< IPv6 only. if routing extension exist, user should set the offset of the destination address + * in order to calculate UDP checksum pseudo header; + * Otherwise set it to '0'. */ ioc_fm_pcd_manip_hdr_insrt_t insrt; /**< size and data to be inserted. */ } ioc_fm_pcd_manip_hdr_insrt_ip_params_t; #endif /* (DPAA_VERSION >= 11) */ -- cgit v0.10.2