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 --- |