From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 296A342D01 for ; Tue, 20 Jun 2023 04:50:31 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1DA824068E; Tue, 20 Jun 2023 04:50:31 +0200 (CEST) Received: from NAM02-BN1-obe.outbound.protection.outlook.com (mail-bn1nam02on2138.outbound.protection.outlook.com [40.107.212.138]) by mails.dpdk.org (Postfix) with ESMTP id 1C955400D6 for ; Tue, 20 Jun 2023 04:50:29 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Mj2s4+MPlMLnp0zOUhPqRI5sxzhYy85jB3Oknb9wd58m6nU8LjZylosmJxRIQHo9RNmgbbR4Z/ou35rJ292QZnmEJwNm1iCWHe1c/ExiaJhgyJpnWtfQYG+QZugJeMQFNSeCDMwetLZJv4/xtsPuTVspCKg0zkhSHvXmAbUVod/Gt5G89Z9+zgymdcrgyHn/dB/5o86KpS8hkUN2m20Y2mgVCe4HrxlLElpRAb0a6mGTy4gCJqpA7j9Ho5dPmnY/DmhTpRG+JdEQNyFCJKkxCY0JjBYuxoeLEIy2XaaKFkvcfs04+/4h0F+xMvixNYye9IGBugRJtPiIEE3tvztOkg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=qcAlK4MXycul0RM+RMZ+eXODk36KWA0yPb4NBoWIiDk=; b=AB32eBEdxsrc7D3/aHQ9/GuNSNmkanRZr9EfAg25Fhh9LBFg/7IAZapXoV5g7PQYy0C4oB9aHGJAhF1+62F4VssLndmgAwHkov8Y/YYuctKx3L2tZTt4oc/FpYOY0rNMVvzYNdwaYfTY+XkUCVtAb5Rkmo3zDxU66qr4OvllvUTbLhvprasS+IJGMHrquR6yrzWwg6zXhTiUxc0PEM0Fw73zBVM9Q2E0WBgFvbAz8axHrnVDMETNA32svxBksMDnukrTydACV90ACFQvVjYKkQ6qI8kvzd5iF1RBWMSdlDmtkCH4GG2x98G6hqVbAjFEC5H5Djz3H3LlZ6ZoJEF3lQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com; dkim=pass header.d=corigine.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=qcAlK4MXycul0RM+RMZ+eXODk36KWA0yPb4NBoWIiDk=; b=hm2baCy5da3E+SHScixbnTWgxSNKwfcN14gWyN2PnunhhW57sSybH1Q26zXOt/q/8nDo7vDfuYlSf34THvGJfb9LSlMbcp5pkZqEY16AiYxy2j4N3S2zVeExhb3/hA/8Va6P9guDAJuh/erCCJAwWY8CNalPoy+IWzoBTTcmPjE= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=corigine.com; Received: from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5) by CH0PR13MB4716.namprd13.prod.outlook.com (2603:10b6:610:c8::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6500.36; Tue, 20 Jun 2023 02:50:27 +0000 Received: from SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::d2cb:a650:e1ce:2174]) by SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::d2cb:a650:e1ce:2174%4]) with mapi id 15.20.6500.031; Tue, 20 Jun 2023 02:50:27 +0000 From: Chaoyong He To: stable@dpdk.org Cc: oss-drivers@corigine.com, niklas.soderlund@corigine.com, Chaoyong He Subject: [PATCH 22.11 2/2] net/nfp: fix offloading flows Date: Tue, 20 Jun 2023 10:49:58 +0800 Message-Id: <20230620024958.2004152-3-chaoyong.he@corigine.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230620024958.2004152-1-chaoyong.he@corigine.com> References: <20230620024958.2004152-1-chaoyong.he@corigine.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-ClientProxiedBy: SG2PR02CA0031.apcprd02.prod.outlook.com (2603:1096:3:18::19) To SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ0PR13MB5545:EE_|CH0PR13MB4716:EE_ X-MS-Office365-Filtering-Correlation-Id: 4b23ad19-3e7e-4a1a-ab4b-08db71391a45 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: PeepcBmN2CGF5ezHpXqNvZ4l9a9+HJgZB1i/k34LZWb+HPduaX7i5TIFQV4CGT0N2D3KK7S61nAuAO4AKblvg+PMnpGV+cab7uQM9x8RJEPbR2JxMcXj8pzek1TpXbEkYmUhzIIyrzrf6W+eNK2doWUUtoxzgcUWqFFsXg6QmTiKa943/L4cZLFOxP2rDclDDzpYhUUp2oc4kT06LHOsoiJfvpUoNz/L08HlqBlS7arAoSRa69cDlK2Y722AT2rPTLo0TQ40sri5vb6dV7HqAZWSKp7rGvNqI4F+Al0HHn7d+x39+IgOr2ObZZyfK8OoLbZTWONqMN6+RqEUCb2zz+ipfMDHTgoO7zyEzTCcZBbkavlzzYPn79sgRBMquK0EFzrRwlxyeT5DIJkkOOzCkzwXaI07vKHyV2FqL+jbVfKSl1oJyNHQjKKise9p+rgmsOcllLZ9YhJ3ssQZLy60aSADbVMA8bHmEGsDZIV0ScaFZLGnjndMDaqwWVJmsXkDAYGs1ql3Am0zHTErIKN9P3hntUZvAMawRZ5R7wHAsLm7DWpVfdNY1lmhkx8/pQLWy8tA7dvhkqT3dR9yGf4JxIrsxc9fqco9C8Zf7oIt4tqsB9NTuj6GCeqzXfsTCR8oI5YTUfrgevZYYVxwT10YlH73nLCbNsynWbOQDaJjznM= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230028)(4636009)(376002)(396003)(136003)(346002)(366004)(39840400004)(451199021)(478600001)(66946007)(6916009)(36756003)(8676002)(66476007)(66556008)(41300700001)(4326008)(2616005)(83380400001)(38350700002)(38100700002)(66574015)(44832011)(6486002)(86362001)(52116002)(5660300002)(2906002)(316002)(8936002)(30864003)(6506007)(1076003)(6512007)(26005)(186003)(107886003)(6666004); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?MnJKOEFTQ1FqR2JkRkhUVDVGOGZRMkZLRnI5RWdNU0V4bWVRd2xETTRoMFBi?= =?utf-8?B?ckNqMW5xem5FT0tjTTB1T1U1ZEsxQ1UycWswNksyUlY1cFY3M3NOM0JWQ3Z2?= =?utf-8?B?aHJCbGZRVVlycHZ4QUM5aDJyNEFxTGk2b3hPSHp1aklSQW9NeEhWZHdzeUI1?= =?utf-8?B?Z1RVN1JJbU5ROGFJOEVyamE2TmtiamJRckFURWVrYmpzZVRGRkJhaUFnVmRk?= =?utf-8?B?RS96d0VTbFlub3JKcFh4MlhYMG1oM0tYN2NVSnBmK0FDV01uSkNQWDE3c292?= =?utf-8?B?VmhnUjdLYmtER2Z2VUNjQ2FkdEFJZ2RYdkJwWjZ4YXlsdmg3eldYekVvOUUr?= =?utf-8?B?RXFpWEI3UXBNcWI4Mzk2UHl4dDZndFdua2ZEZEMwY3BST3JybCs4eEN1YkFo?= =?utf-8?B?aVpNRXVVajBpQ0d4T0EwQ1I4Y3ErWGl6U2FFM1pWRk9KNEVLSlkrTVREaUtq?= =?utf-8?B?NFhpRTZQK0cvazVYTEN0SXZHTjNUbi9rcERYcW12dGw5d1VEdzVoK1k3aEJ6?= =?utf-8?B?ei9TQ1pZK0xjMTN5UkwvVDRSb2JlSTFvc2dxQUtVdjltRFBNL1BGR0U5SHR5?= =?utf-8?B?clMybCs2aXNFMkl0em5BbkI4TnBUbHFqbWI4d1Z0cTRtVHJ0b0lvZ2grcjZE?= =?utf-8?B?QlA4cmdMWDhwU2NNZXBOV2VjSjhhVmIzTjJGQ1ZNNEFVWXI0ZitxT2RQNEps?= =?utf-8?B?MDBudzM3dUxsRGw0ZVRTMlpXWmFkNEVkSHg0TjdXZVRpOExOLytWUkoyZXFF?= =?utf-8?B?eWE2cEQrZnBtUVlON3A2VERQRStuOGs5d2Y0OFhTdWtrQUFtV0dzQ3c1UzF0?= =?utf-8?B?TmI3eFkxUlU2bzR4V3RCeTQrTlNLaWRsSWc3c2VoUFY4RmJVVjBDU0FNdFR6?= =?utf-8?B?bGRpQ1RudFczWXJJOFFSRkRVNkNZSlNYcklObHVQdk4ybnIxb3BxZVRMS2F0?= =?utf-8?B?cmwrTWVualZNbHR6REM5Nlh4bi85eC84WHJVVWxBd0RlNE9IR0tFNVBTSlJv?= =?utf-8?B?NEZkSVFJdzNLVVpwWVVQTkIvSy9Qd3BOV1RNcmRNUDd0bU1UbUxyNm50TjNx?= =?utf-8?B?UktyUW1CYWFUVGRpakRhQ2dOT1RPK0VGSjBWMVFtK2lBZ0pvV3JFQlN1dXR4?= =?utf-8?B?aTVzK1hzN0dyTER1QThRY2tpQ1NwamZtWWE1NWlCVkxXOXlJT3BqQnBpeXFU?= =?utf-8?B?azdXR05kaVhBbWxUZUZnaHFJQVNWOUtRcmZaSkNxR2QycVEwcU12a1FtQUg0?= =?utf-8?B?R2gyaFAxbkQrRWlPSk5TL0dwNzNJRm14WER4dFJKWUMrSGlSNmY3OXRHWm5C?= =?utf-8?B?QkZWM0pHOUhZeklKZlFYNktwNTQ3cE13NEtQa2NXekVFMFJ3TWtIVGxSdUhw?= =?utf-8?B?V3ptblhheS84TEtINFltOUJyeXFocjVQYUhhSm9VN2ZzN09aYjJCcExwK284?= =?utf-8?B?VW9oOHY5Z2I5MExqVWJkNEcwbWxvNWJVZFJMN3VqNXBPV3BBVXFUR3ZLbFk0?= =?utf-8?B?NmJKcFoxdWtwRitza1BBSWpqM2tsbE51bm45dmRlTW5BemcybmYwVDZkRVpZ?= =?utf-8?B?aTBUa0QzcTFhZGRKaVhRKzBLbHVLQkd3eTNFM2d4d28zdFhINEdxdmVFY2VG?= =?utf-8?B?ZGJnK0NNRVZaUWRHVUNBVVlnWTdsZ0ZpNmdxTjlZb3lhK0s3WllmdDh2UFo1?= =?utf-8?B?dThWT0VsS1ZhbTcwb3p2V3ZMSGhEam9kUTJZRjRjUE1MZDRSTHVKR2NGdXhG?= =?utf-8?B?REVyUmpVNldrNmpXWm96TmlHTlFqRUVDcGVFOXNFVWgwVEZyVEN4SHdRZTZQ?= =?utf-8?B?UkJBeUowMFhkNHRxME82Rkx2L2M5WFVDQTM4NUFnV2NwMTJ1V3ZqQ3BVSUl6?= =?utf-8?B?WkVGRzg2ZzQzV09ZUWtuYlBZZ2tXQklDcDFxZWwxMUppWUl0bkZDQlB6eTlm?= =?utf-8?B?SURIZk9DeENCQ0wwN0pRa25tTDFTVEx2NDdkbW9ieHdnQjhNcWtVZ05FSlhk?= =?utf-8?B?M1YwekZJOEdOenVVb2ROQnlJVGQveGV1bGxwVXp5M3dSTFhEWHFHb09QT0x4?= =?utf-8?B?R2JXTnZlL1REWUl5dUhBQml6eHhkdHJFUFZ5bVpKYjdDL2E1eUlQSW1peVBy?= =?utf-8?B?WUplNHF3Y2hTNkQwNDltZjlKY1NLSVJVbXBKYWFHNDk5YlBMK1lmanJ3TUJi?= =?utf-8?B?T0E9PQ==?= X-OriginatorOrg: corigine.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4b23ad19-3e7e-4a1a-ab4b-08db71391a45 X-MS-Exchange-CrossTenant-AuthSource: SJ0PR13MB5545.namprd13.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Jun 2023 02:50:27.4319 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: fe128f2c-073b-4c20-818e-7246a585940c X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: OP46FKeg4WnsfUb6zGKrWhCsmEW4jf60D/PdYjoHxBUEhcQvsWUXARA1fJcjDNzu1PNJQik7mlmplc8QMBfb0H2wdlRTp9RovaL+QwCgNgM= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR13MB4716 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org [ upstream commit 925c27ec8de92efe69f4cb56e3fc0e413354c739 ] The symbol '_abi_flower_extra_features' is in IMEM for NFP4000, but in EMU_CACHE for NFP3800 because which does not have IMEM. The original logic can't read symbol from EMU_CACHE, so the probe process will fail when we try to offload flows use NFP3800. Modify the related data structure and logics to support read symbol from EMU_CACHE. Fixes: c7e9729da6b5 ("net/nfp: support CPP") Signed-off-by: Chaoyong He Reviewed-by: Niklas Söderlund --- drivers/net/nfp/nfp_ethdev.c | 4 +- drivers/net/nfp/nfpcore/nfp_cpp.h | 7 +- drivers/net/nfp/nfpcore/nfp_cppcore.c | 54 ++++++++--- drivers/net/nfp/nfpcore/nfp_rtsym.c | 135 +++++++++++++++++++++++--- 4 files changed, 174 insertions(+), 26 deletions(-) diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c index dc63b05bd6..29491f6e6d 100644 --- a/drivers/net/nfp/nfp_ethdev.c +++ b/drivers/net/nfp/nfp_ethdev.c @@ -929,6 +929,7 @@ nfp_pf_init(struct rte_pci_device *pci_dev) int ret; int err = 0; uint64_t addr; + uint32_t cpp_id; struct nfp_cpp *cpp; enum nfp_app_fw_id app_fw_id; struct nfp_pf_dev *pf_dev; @@ -1028,7 +1029,8 @@ nfp_pf_init(struct rte_pci_device *pci_dev) goto pf_cleanup; } - pf_dev->hw_queues = nfp_cpp_map_area(pf_dev->cpp, 0, 0, + cpp_id = NFP_CPP_ISLAND_ID(0, NFP_CPP_ACTION_RW, 0, 0); + pf_dev->hw_queues = nfp_cpp_map_area(pf_dev->cpp, cpp_id, addr, NFP_QCP_QUEUE_AREA_SZ, &pf_dev->hwqueues_area); if (pf_dev->hw_queues == NULL) { diff --git a/drivers/net/nfp/nfpcore/nfp_cpp.h b/drivers/net/nfp/nfpcore/nfp_cpp.h index a04a68f546..68851b22e4 100644 --- a/drivers/net/nfp/nfpcore/nfp_cpp.h +++ b/drivers/net/nfp/nfpcore/nfp_cpp.h @@ -34,6 +34,9 @@ struct nfp_cpp { */ uint32_t imb_cat_table[16]; + /* MU access type bit offset */ + uint32_t mu_locality_lsb; + int driver_lock_needed; }; @@ -363,7 +366,7 @@ struct nfp_cpp_area *nfp_cpp_area_alloc_acquire(struct nfp_cpp *cpp, */ void nfp_cpp_area_release_free(struct nfp_cpp_area *area); -uint8_t *nfp_cpp_map_area(struct nfp_cpp *cpp, int domain, int target, +uint8_t *nfp_cpp_map_area(struct nfp_cpp *cpp, uint32_t cpp_id, uint64_t addr, unsigned long size, struct nfp_cpp_area **area); /* @@ -778,4 +781,6 @@ int nfp_cpp_mutex_unlock(struct nfp_cpp_mutex *mutex); */ int nfp_cpp_mutex_trylock(struct nfp_cpp_mutex *mutex); +uint32_t nfp_cpp_mu_locality_lsb(struct nfp_cpp *cpp); + #endif /* !__NFP_CPP_H__ */ diff --git a/drivers/net/nfp/nfpcore/nfp_cppcore.c b/drivers/net/nfp/nfpcore/nfp_cppcore.c index 37799af558..014f6c9df8 100644 --- a/drivers/net/nfp/nfpcore/nfp_cppcore.c +++ b/drivers/net/nfp/nfpcore/nfp_cppcore.c @@ -19,6 +19,7 @@ #include "nfp6000/nfp6000.h" #include "nfp6000/nfp_xpb.h" #include "nfp_nffw.h" +#include "../nfp_logs.h" #define NFP_PL_DEVICE_ID 0x00000004 #define NFP_PL_DEVICE_ID_MASK 0xff @@ -118,6 +119,36 @@ nfp_cpp_area_name(struct nfp_cpp_area *cpp_area) return cpp_area->name; } +#define NFP_IMB_TGTADDRESSMODECFG_MODE_of(_x) (((_x) >> 13) & 0x7) +#define NFP_IMB_TGTADDRESSMODECFG_ADDRMODE RTE_BIT32(12) + +static int +nfp_cpp_set_mu_locality_lsb(struct nfp_cpp *cpp) +{ + int ret; + int mode; + int addr40; + uint32_t imbcppat; + + imbcppat = cpp->imb_cat_table[NFP_CPP_TARGET_MU]; + mode = NFP_IMB_TGTADDRESSMODECFG_MODE_of(imbcppat); + addr40 = imbcppat & NFP_IMB_TGTADDRESSMODECFG_ADDRMODE; + + ret = nfp_cppat_mu_locality_lsb(mode, addr40); + if (ret < 0) + return ret; + + cpp->mu_locality_lsb = ret; + + return 0; +} + +uint32_t +nfp_cpp_mu_locality_lsb(struct nfp_cpp *cpp) +{ + return cpp->mu_locality_lsb; +} + /* * nfp_cpp_area_alloc - allocate a new CPP area * @cpp: CPP handle @@ -142,10 +173,6 @@ nfp_cpp_area_alloc_with_name(struct nfp_cpp *cpp, uint32_t dest, if (!cpp) return NULL; - /* CPP bus uses only a 40-bit address */ - if ((address + size) > (1ULL << 40)) - return NFP_ERRPTR(EFAULT); - /* Remap from cpp_island to cpp_target */ err = nfp_target_cpp(dest, tmp64, &dest, &tmp64, cpp->imb_cat_table); if (err < 0) @@ -588,6 +615,13 @@ nfp_cpp_alloc(struct rte_pci_device *dev, int driver_lock_needed) } } + err = nfp_cpp_set_mu_locality_lsb(cpp); + if (err < 0) { + PMD_DRV_LOG(ERR, "Can't calculate MU locality bit offset"); + free(cpp); + return NULL; + } + return cpp; } @@ -819,8 +853,7 @@ __nfp_cpp_model_autodetect(struct nfp_cpp *cpp, uint32_t *model) /* * nfp_cpp_map_area() - Helper function to map an area * @cpp: NFP CPP handler - * @domain: CPP domain - * @target: CPP target + * @cpp_id: CPP ID * @addr: CPP address * @size: Size of the area * @area: Area handle (output) @@ -828,18 +861,15 @@ __nfp_cpp_model_autodetect(struct nfp_cpp *cpp, uint32_t *model) * Map an area of IOMEM access. To undo the effect of this function call * @nfp_cpp_area_release_free(*area). * - * Return: Pointer to memory mapped area or ERR_PTR + * Return: Pointer to memory mapped area or NULL */ uint8_t * -nfp_cpp_map_area(struct nfp_cpp *cpp, int domain, int target, uint64_t addr, +nfp_cpp_map_area(struct nfp_cpp *cpp, uint32_t cpp_id, uint64_t addr, unsigned long size, struct nfp_cpp_area **area) { uint8_t *res; - uint32_t dest; - - dest = NFP_CPP_ISLAND_ID(target, NFP_CPP_ACTION_RW, 0, domain); - *area = nfp_cpp_area_alloc_acquire(cpp, dest, addr, size); + *area = nfp_cpp_area_alloc_acquire(cpp, cpp_id, addr, size); if (!*area) goto err_eio; diff --git a/drivers/net/nfp/nfpcore/nfp_rtsym.c b/drivers/net/nfp/nfpcore/nfp_rtsym.c index 56bbf05cd8..21879f7eb6 100644 --- a/drivers/net/nfp/nfpcore/nfp_rtsym.c +++ b/drivers/net/nfp/nfpcore/nfp_rtsym.c @@ -14,6 +14,7 @@ #include "nfp_mip.h" #include "nfp_rtsym.h" #include "nfp6000/nfp6000.h" +#include "../nfp_logs.h" /* These need to match the linker */ #define SYM_TGT_LMEM 0 @@ -213,6 +214,113 @@ nfp_rtsym_lookup(struct nfp_rtsym_table *rtbl, const char *name) return NULL; } +static uint64_t +nfp_rtsym_size(const struct nfp_rtsym *sym) +{ + switch (sym->type) { + case NFP_RTSYM_TYPE_NONE: + PMD_DRV_LOG(ERR, "rtsym '%s': type NONE", sym->name); + return 0; + case NFP_RTSYM_TYPE_OBJECT: /* Fall through */ + case NFP_RTSYM_TYPE_FUNCTION: + return sym->size; + case NFP_RTSYM_TYPE_ABS: + return sizeof(uint64_t); + default: + PMD_DRV_LOG(ERR, "rtsym '%s': unknown type: %d", sym->name, sym->type); + return 0; + } +} + +static int +nfp_rtsym_to_dest(struct nfp_cpp *cpp, + const struct nfp_rtsym *sym, + uint8_t action, + uint8_t token, + uint64_t offset, + uint32_t *cpp_id, + uint64_t *addr) +{ + if (sym->type != NFP_RTSYM_TYPE_OBJECT) { + PMD_DRV_LOG(ERR, "rtsym '%s': direct access to non-object rtsym", + sym->name); + return -EINVAL; + } + + *addr = sym->addr + offset; + + if (sym->target >= 0) { + *cpp_id = NFP_CPP_ISLAND_ID(sym->target, action, token, sym->domain); + } else if (sym->target == NFP_RTSYM_TARGET_EMU_CACHE) { + int locality_off = nfp_cpp_mu_locality_lsb(cpp); + + *addr &= ~(NFP_MU_ADDR_ACCESS_TYPE_MASK << locality_off); + *addr |= NFP_MU_ADDR_ACCESS_TYPE_DIRECT << locality_off; + + *cpp_id = NFP_CPP_ISLAND_ID(NFP_CPP_TARGET_MU, action, token, + sym->domain); + } else { + PMD_DRV_LOG(ERR, "rtsym '%s': unhandled target encoding: %d", + sym->name, sym->target); + return -EINVAL; + } + + return 0; +} + +static int +nfp_rtsym_readl(struct nfp_cpp *cpp, + const struct nfp_rtsym *sym, + uint8_t action, + uint8_t token, + uint64_t offset, + uint32_t *value) +{ + int ret; + uint64_t addr; + uint32_t cpp_id; + + if (offset + 4 > nfp_rtsym_size(sym)) { + PMD_DRV_LOG(ERR, "rtsym '%s': readl out of bounds", sym->name); + return -ENXIO; + } + + ret = nfp_rtsym_to_dest(cpp, sym, action, token, offset, &cpp_id, &addr); + if (ret != 0) + return ret; + + return nfp_cpp_readl(cpp, cpp_id, addr, value); +} + +static int +nfp_rtsym_readq(struct nfp_cpp *cpp, + const struct nfp_rtsym *sym, + uint8_t action, + uint8_t token, + uint64_t offset, + uint64_t *value) +{ + int ret; + uint64_t addr; + uint32_t cpp_id; + + if (offset + 8 > nfp_rtsym_size(sym)) { + PMD_DRV_LOG(ERR, "rtsym '%s': readq out of bounds", sym->name); + return -ENXIO; + } + + if (sym->type == NFP_RTSYM_TYPE_ABS) { + *value = sym->addr; + return 0; + } + + ret = nfp_rtsym_to_dest(cpp, sym, action, token, offset, &cpp_id, &addr); + if (ret != 0) + return ret; + + return nfp_cpp_readq(cpp, cpp_id, addr, value); +} + /* * nfp_rtsym_read_le() - Read a simple unsigned scalar value from symbol * @rtbl: NFP RTsym table @@ -229,7 +337,7 @@ uint64_t nfp_rtsym_read_le(struct nfp_rtsym_table *rtbl, const char *name, int *error) { const struct nfp_rtsym *sym; - uint32_t val32, id; + uint32_t val32; uint64_t val; int err; @@ -239,19 +347,13 @@ nfp_rtsym_read_le(struct nfp_rtsym_table *rtbl, const char *name, int *error) goto exit; } - id = NFP_CPP_ISLAND_ID(sym->target, NFP_CPP_ACTION_RW, 0, sym->domain); - -#ifdef DEBUG - printf("Reading symbol %s with size %" PRIu64 " at %" PRIx64 "\n", - name, sym->size, sym->addr); -#endif switch (sym->size) { case 4: - err = nfp_cpp_readl(rtbl->cpp, id, sym->addr, &val32); + err = nfp_rtsym_readl(rtbl->cpp, sym, NFP_CPP_ACTION_RW, 0, 0, &val32); val = val32; break; case 8: - err = nfp_cpp_readq(rtbl->cpp, id, sym->addr, &val); + err = nfp_rtsym_readq(rtbl->cpp, sym, NFP_CPP_ACTION_RW, 0, 0, &val); break; default: printf("rtsym '%s' unsupported size: %" PRId64 "\n", @@ -276,8 +378,11 @@ uint8_t * nfp_rtsym_map(struct nfp_rtsym_table *rtbl, const char *name, unsigned int min_size, struct nfp_cpp_area **area) { - const struct nfp_rtsym *sym; + int ret; uint8_t *mem; + uint64_t addr; + uint32_t cpp_id; + const struct nfp_rtsym *sym; #ifdef DEBUG printf("mapping symbol %s\n", name); @@ -288,14 +393,20 @@ nfp_rtsym_map(struct nfp_rtsym_table *rtbl, const char *name, return NULL; } + ret = nfp_rtsym_to_dest(rtbl->cpp, sym, NFP_CPP_ACTION_RW, 0, 0, + &cpp_id, &addr); + if (ret != 0) { + PMD_DRV_LOG(ERR, "rtsym '%s': mapping failed", name); + return NULL; + } + if (sym->size < min_size) { printf("Symbol %s too small (%" PRIu64 " < %u)\n", name, sym->size, min_size); return NULL; } - mem = nfp_cpp_map_area(rtbl->cpp, sym->domain, sym->target, sym->addr, - sym->size, area); + mem = nfp_cpp_map_area(rtbl->cpp, cpp_id, addr, sym->size, area); if (!mem) { printf("Failed to map symbol %s\n", name); return NULL; -- 2.39.1