gsi.c (01a7ee36e7649b3b12212e6648eb017e7f7e1269) gsi.c (3c506add35c74acbe5a42d0a86963d11bef10d25)
1// SPDX-License-Identifier: GPL-2.0
2
3/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
1// SPDX-License-Identifier: GPL-2.0
2
3/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
4 * Copyright (C) 2018-2022 Linaro Ltd.
4 * Copyright (C) 2018-2023 Linaro Ltd.
5 */
6
7#include <linux/types.h>
8#include <linux/bits.h>
9#include <linux/bitfield.h>
10#include <linux/mutex.h>
11#include <linux/completion.h>
12#include <linux/io.h>

--- 2223 unchanged lines hidden (view full) ---

2236 gsi->modem_channel_bitmap = 0;
2237}
2238
2239/* Init function for GSI. GSI hardware does not need to be "ready" */
2240int gsi_init(struct gsi *gsi, struct platform_device *pdev,
2241 enum ipa_version version, u32 count,
2242 const struct ipa_gsi_endpoint_data *data)
2243{
5 */
6
7#include <linux/types.h>
8#include <linux/bits.h>
9#include <linux/bitfield.h>
10#include <linux/mutex.h>
11#include <linux/completion.h>
12#include <linux/io.h>

--- 2223 unchanged lines hidden (view full) ---

2236 gsi->modem_channel_bitmap = 0;
2237}
2238
2239/* Init function for GSI. GSI hardware does not need to be "ready" */
2240int gsi_init(struct gsi *gsi, struct platform_device *pdev,
2241 enum ipa_version version, u32 count,
2242 const struct ipa_gsi_endpoint_data *data)
2243{
2244 struct device *dev = &pdev->dev;
2245 struct resource *res;
2246 resource_size_t size;
2247 u32 adjust;
2248 int ret;
2249
2250 gsi_validate_build();
2251
2244 int ret;
2245
2246 gsi_validate_build();
2247
2252 gsi->dev = dev;
2248 gsi->dev = &pdev->dev;
2253 gsi->version = version;
2254
2255 /* GSI uses NAPI on all channels. Create a dummy network device
2256 * for the channel NAPI contexts to be associated with.
2257 */
2258 init_dummy_netdev(&gsi->dummy_dev);
2249 gsi->version = version;
2250
2251 /* GSI uses NAPI on all channels. Create a dummy network device
2252 * for the channel NAPI contexts to be associated with.
2253 */
2254 init_dummy_netdev(&gsi->dummy_dev);
2259
2260 /* Get GSI memory range and map it */
2261 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "gsi");
2262 if (!res) {
2263 dev_err(dev, "DT error getting \"gsi\" memory property\n");
2264 return -ENODEV;
2265 }
2266
2267 size = resource_size(res);
2268 if (res->start > U32_MAX || size > U32_MAX - res->start) {
2269 dev_err(dev, "DT memory resource \"gsi\" out of range\n");
2270 return -EINVAL;
2271 }
2272
2273 /* Make sure we can make our pointer adjustment if necessary */
2274 adjust = gsi->version < IPA_VERSION_4_5 ? 0 : GSI_EE_REG_ADJUST;
2275 if (res->start < adjust) {
2276 dev_err(dev, "DT memory resource \"gsi\" too low (< %u)\n",
2277 adjust);
2278 return -EINVAL;
2279 }
2280
2281 gsi->virt_raw = ioremap(res->start, size);
2282 if (!gsi->virt_raw) {
2283 dev_err(dev, "unable to remap \"gsi\" memory\n");
2284 return -ENOMEM;
2285 }
2286 /* Most registers are accessed using an adjusted register range */
2287 gsi->virt = gsi->virt_raw - adjust;
2288
2289 init_completion(&gsi->completion);
2290
2255 init_completion(&gsi->completion);
2256
2257 ret = gsi_reg_init(gsi, pdev);
2258 if (ret)
2259 return ret;
2260
2291 ret = gsi_irq_init(gsi, pdev); /* No matching exit required */
2292 if (ret)
2261 ret = gsi_irq_init(gsi, pdev); /* No matching exit required */
2262 if (ret)
2293 goto err_iounmap;
2263 goto err_reg_exit;
2294
2295 ret = gsi_channel_init(gsi, count, data);
2296 if (ret)
2264
2265 ret = gsi_channel_init(gsi, count, data);
2266 if (ret)
2297 goto err_iounmap;
2267 goto err_reg_exit;
2298
2299 mutex_init(&gsi->mutex);
2300
2301 return 0;
2302
2268
2269 mutex_init(&gsi->mutex);
2270
2271 return 0;
2272
2303err_iounmap:
2304 iounmap(gsi->virt_raw);
2273err_reg_exit:
2274 gsi_reg_exit(gsi);
2305
2306 return ret;
2307}
2308
2309/* Inverse of gsi_init() */
2310void gsi_exit(struct gsi *gsi)
2311{
2312 mutex_destroy(&gsi->mutex);
2313 gsi_channel_exit(gsi);
2275
2276 return ret;
2277}
2278
2279/* Inverse of gsi_init() */
2280void gsi_exit(struct gsi *gsi)
2281{
2282 mutex_destroy(&gsi->mutex);
2283 gsi_channel_exit(gsi);
2314 iounmap(gsi->virt_raw);
2284 gsi_reg_exit(gsi);
2315}
2316
2317/* The maximum number of outstanding TREs on a channel. This limits
2318 * a channel's maximum number of transactions outstanding (worst case
2319 * is one TRE per transaction).
2320 *
2321 * The absolute limit is the number of TREs in the channel's TRE ring,
2322 * and in theory we should be able use all of them. But in practice,

--- 21 unchanged lines hidden ---
2285}
2286
2287/* The maximum number of outstanding TREs on a channel. This limits
2288 * a channel's maximum number of transactions outstanding (worst case
2289 * is one TRE per transaction).
2290 *
2291 * The absolute limit is the number of TREs in the channel's TRE ring,
2292 * and in theory we should be able use all of them. But in practice,

--- 21 unchanged lines hidden ---