|
4 | 4 | * SPDX-License-Identifier: Apache-2.0
|
5 | 5 | */
|
6 | 6 |
|
| 7 | +#define DT_DRV_COMPAT qemu_ivshmem |
| 8 | + |
7 | 9 | #define LOG_LEVEL CONFIG_IVSHMEM_LOG_LEVEL
|
8 | 10 | #include <logging/log.h>
|
9 | 11 | LOG_MODULE_REGISTER(ivshmem);
|
@@ -223,25 +225,42 @@ static const struct ivshmem_driver_api ivshmem_api = {
|
223 | 225 | static int ivshmem_init(const struct device *dev)
|
224 | 226 | {
|
225 | 227 | struct ivshmem *data = dev->data;
|
| 228 | + static bool bdf_lookup_done; |
226 | 229 |
|
227 |
| - data->bdf = pcie_bdf_lookup(PCIE_ID(IVSHMEM_VENDOR_ID, |
228 |
| - IVSHMEM_DEVICE_ID)); |
229 |
| - if (data->bdf == PCIE_BDF_NONE) { |
230 |
| - LOG_WRN("ivshmem device not found"); |
| 230 | + if ((data->bdf == PCIE_BDF_NONE) && bdf_lookup_done) { |
| 231 | + LOG_ERR("One instance of ivshmem with pcie_bdf_lookup() already initialized.\n" |
| 232 | + "Using more than one with PCIE_BDF_NONE parameter might conflict\n" |
| 233 | + "with already initialized instances."); |
231 | 234 | return -ENOTSUP;
|
232 | 235 | }
|
233 |
| - |
| 236 | + if ((data->bdf == PCIE_BDF_NONE) && !bdf_lookup_done) { |
| 237 | + if (data->dev_ven_id) { |
| 238 | + data->bdf = pcie_bdf_lookup(data->dev_ven_id); |
| 239 | + } else { |
| 240 | + data->bdf = pcie_bdf_lookup(PCIE_ID(IVSHMEM_VENDOR_ID, IVSHMEM_DEVICE_ID)); |
| 241 | + } |
| 242 | + if (data->bdf == PCIE_BDF_NONE) { |
| 243 | + LOG_WRN("ivshmem device not found"); |
| 244 | + return -ENOTSUP; |
| 245 | + } |
| 246 | + } |
234 | 247 | LOG_DBG("ivshmem found at bdf 0x%x", data->bdf);
|
| 248 | + bdf_lookup_done = true; |
235 | 249 |
|
236 | 250 | if (!ivshmem_configure(dev)) {
|
237 | 251 | return -EIO;
|
238 | 252 | }
|
239 |
| - |
240 | 253 | return 0;
|
241 | 254 | }
|
242 | 255 |
|
243 |
| -static struct ivshmem ivshmem_data; |
244 |
| - |
245 |
| -DEVICE_DEFINE(ivshmem, CONFIG_IVSHMEM_DEV_NAME, |
246 |
| - ivshmem_init, NULL, &ivshmem_data, NULL, |
247 |
| - POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEVICE, &ivshmem_api); |
| 256 | +#define IVSHMEM_DEVICE_INIT(n) \ |
| 257 | + static struct ivshmem ivshmem_data_##n = { \ |
| 258 | + .bdf = DT_INST_REG_ADDR_BY_IDX(n, 0), \ |
| 259 | + .dev_ven_id = DT_INST_REG_SIZE_BY_IDX(n, 0) \ |
| 260 | + }; \ |
| 261 | + DEVICE_DT_INST_DEFINE(n, &ivshmem_init, NULL, \ |
| 262 | + &ivshmem_data_##n, NULL, \ |
| 263 | + POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEVICE, \ |
| 264 | + &ivshmem_api); |
| 265 | + |
| 266 | +DT_INST_FOREACH_STATUS_OKAY(IVSHMEM_DEVICE_INIT) |
0 commit comments