Lines Matching +full:block +full:- +full:fetch
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2015-2016 Landon Fuller <landon@landonf.org>
74 cfg->core_info = (struct bhnd_core_info) { in bcma_alloc_corecfg()
82 STAILQ_INIT(&cfg->master_ports); in bcma_alloc_corecfg()
83 cfg->num_master_ports = 0; in bcma_alloc_corecfg()
85 STAILQ_INIT(&cfg->dev_ports); in bcma_alloc_corecfg()
86 cfg->num_dev_ports = 0; in bcma_alloc_corecfg()
88 STAILQ_INIT(&cfg->bridge_ports); in bcma_alloc_corecfg()
89 cfg->num_bridge_ports = 0; in bcma_alloc_corecfg()
91 STAILQ_INIT(&cfg->wrapper_ports); in bcma_alloc_corecfg()
92 cfg->num_wrapper_ports = 0; in bcma_alloc_corecfg()
108 STAILQ_FOREACH_SAFE(mport, &corecfg->master_ports, mp_link, mnext) { in bcma_free_corecfg()
112 STAILQ_FOREACH_SAFE(sport, &corecfg->dev_ports, sp_link, snext) { in bcma_free_corecfg()
116 STAILQ_FOREACH_SAFE(sport, &corecfg->bridge_ports, sp_link, snext) { in bcma_free_corecfg()
120 STAILQ_FOREACH_SAFE(sport, &corecfg->wrapper_ports, sp_link, snext) { in bcma_free_corecfg()
138 return (&cfg->dev_ports); in bcma_corecfg_get_port_list()
141 return (&cfg->bridge_ports); in bcma_corecfg_get_port_list()
144 return (&cfg->wrapper_ports); in bcma_corecfg_get_port_list()
168 STAILQ_FOREACH(map, &port->sp_maps, m_link) { in bcma_dinfo_init_port_resource_info()
179 end = map->m_base + map->m_size; in bcma_dinfo_init_port_resource_info()
180 if (map->m_base <= RM_MAX_END && end <= RM_MAX_END) { in bcma_dinfo_init_port_resource_info()
181 map->m_rid = resource_list_add_next( in bcma_dinfo_init_port_resource_info()
182 &dinfo->resources, SYS_RES_MEMORY, in bcma_dinfo_init_port_resource_info()
183 map->m_base, end, map->m_size); in bcma_dinfo_init_port_resource_info()
186 "core%u %s%u.%u: region %llx-%llx extends " in bcma_dinfo_init_port_resource_info()
188 dinfo->corecfg->core_info.core_idx, in bcma_dinfo_init_port_resource_info()
189 bhnd_port_type_name(port->sp_type), in bcma_dinfo_init_port_resource_info()
190 port->sp_num, map->m_region_num, in bcma_dinfo_init_port_resource_info()
191 (unsigned long long) map->m_base, in bcma_dinfo_init_port_resource_info()
199 * Allocate the per-core agent register block for a device info structure.
209 * @retval non-zero resource allocation failed.
219 KASSERT(dinfo->res_agent == NULL, ("double allocation of agent")); in bcma_dinfo_init_agent()
221 /* Verify that the agent register block exists and is in bcma_dinfo_init_agent()
223 if (bhnd_get_port_rid(child, BHND_PORT_AGENT, 0, 0) == -1) in bcma_dinfo_init_agent()
226 /* Fetch the address of the agent register block */ in bcma_dinfo_init_agent()
230 device_printf(bus, "failed fetching agent register block " in bcma_dinfo_init_agent()
238 r_end = r_start + r_count - 1; in bcma_dinfo_init_agent()
240 dinfo->rid_agent = BCMA_AGENT_RID(dinfo); in bcma_dinfo_init_agent()
241 dinfo->res_agent = BHND_BUS_ALLOC_RESOURCE(bus, bus, SYS_RES_MEMORY, in bcma_dinfo_init_agent()
242 &dinfo->rid_agent, r_start, r_end, r_count, RF_ACTIVE|RF_SHAREABLE); in bcma_dinfo_init_agent()
243 if (dinfo->res_agent == NULL) { in bcma_dinfo_init_agent()
244 device_printf(bus, "failed allocating agent register block for " in bcma_dinfo_init_agent()
268 /* Agent block must be mapped */ in bcma_dinfo_init_intrs()
269 if (dinfo->res_agent == NULL) in bcma_dinfo_init_intrs()
273 dmpcfg = bhnd_bus_read_4(dinfo->res_agent, BCMA_DMP_CONFIG); in bcma_dinfo_init_intrs()
277 /* Fetch width of the OOB interrupt bank */ in bcma_dinfo_init_intrs()
278 oobw = bhnd_bus_read_4(dinfo->res_agent, in bcma_dinfo_init_intrs()
286 /* Fetch OOBSEL busline values and populate list of interrupt in bcma_dinfo_init_intrs()
293 if (dinfo->num_intrs == UINT_MAX) in bcma_dinfo_init_intrs()
296 selout = bhnd_bus_read_4(dinfo->res_agent, BCMA_DMP_OOBSELOUT( in bcma_dinfo_init_intrs()
310 STAILQ_INSERT_HEAD(&dinfo->intrs, intr, i_link); in bcma_dinfo_init_intrs()
311 dinfo->num_intrs++; in bcma_dinfo_init_intrs()
333 dinfo->corecfg = NULL; in bcma_alloc_dinfo()
334 dinfo->res_agent = NULL; in bcma_alloc_dinfo()
335 dinfo->rid_agent = -1; in bcma_alloc_dinfo()
337 STAILQ_INIT(&dinfo->intrs); in bcma_alloc_dinfo()
338 dinfo->num_intrs = 0; in bcma_alloc_dinfo()
340 resource_list_init(&dinfo->resources); in bcma_alloc_dinfo()
357 * @retval non-zero initialization failed.
366 KASSERT(dinfo->corecfg == NULL, ("dinfo previously initialized")); in bcma_init_dinfo()
369 dinfo->corecfg = corecfg; in bcma_init_dinfo()
373 bcma_dinfo_init_port_resource_info(bus, dinfo, &corecfg->dev_ports); in bcma_init_dinfo()
374 bcma_dinfo_init_port_resource_info(bus, dinfo, &corecfg->bridge_ports); in bcma_init_dinfo()
375 bcma_dinfo_init_port_resource_info(bus, dinfo, &corecfg->wrapper_ports); in bcma_init_dinfo()
388 STAILQ_FOREACH(intr, &dinfo->intrs, i_link) { in bcma_init_dinfo()
390 if (intr->i_mapped) in bcma_init_dinfo()
394 error = BHND_BUS_MAP_INTR(bus, child, intr->i_sel, in bcma_init_dinfo()
395 &intr->i_irq); in bcma_init_dinfo()
398 "for core %u: %d\n", intr->i_sel, in bcma_init_dinfo()
403 intr->i_mapped = true; in bcma_init_dinfo()
406 intr->i_rid = resource_list_add_next(&dinfo->resources, in bcma_init_dinfo()
407 SYS_RES_IRQ, intr->i_irq, intr->i_irq, 1); in bcma_init_dinfo()
414 dinfo->corecfg = NULL; in bcma_init_dinfo()
430 resource_list_free(&dinfo->resources); in bcma_free_dinfo()
432 if (dinfo->corecfg != NULL) in bcma_free_dinfo()
433 bcma_free_corecfg(dinfo->corecfg); in bcma_free_dinfo()
436 if (dinfo->res_agent != NULL) { in bcma_free_dinfo()
437 bhnd_release_resource(bus, SYS_RES_MEMORY, dinfo->rid_agent, in bcma_free_dinfo()
438 dinfo->res_agent); in bcma_free_dinfo()
442 STAILQ_FOREACH_SAFE(intr, &dinfo->intrs, i_link, inext) { in bcma_free_dinfo()
443 STAILQ_REMOVE(&dinfo->intrs, intr, bcma_intr, i_link); in bcma_free_dinfo()
446 if (intr->i_mapped) { in bcma_free_dinfo()
447 BHND_BUS_UNMAP_INTR(bus, child, intr->i_irq); in bcma_free_dinfo()
448 intr->i_mapped = false; in bcma_free_dinfo()
482 intr->i_bank = bank; in bcma_alloc_intr()
483 intr->i_sel = sel; in bcma_alloc_intr()
484 intr->i_busline = line; in bcma_alloc_intr()
485 intr->i_mapped = false; in bcma_alloc_intr()
486 intr->i_irq = 0; in bcma_alloc_intr()
499 KASSERT(!intr->i_mapped, ("interrupt %u still mapped", intr->i_sel)); in bcma_free_intr()
507 * @param port_num Per-core port number.
519 sport->sp_num = port_num; in bcma_alloc_sport()
520 sport->sp_type = port_type; in bcma_alloc_sport()
521 sport->sp_num_maps = 0; in bcma_alloc_sport()
522 STAILQ_INIT(&sport->sp_maps); in bcma_alloc_sport()
536 STAILQ_FOREACH_SAFE(map, &sport->sp_maps, m_link, mapnext) { in bcma_free_sport()
559 if (dinfo->res_agent == NULL) in bcma_dmp_wait_reset()
566 rst = bhnd_bus_read_4(dinfo->res_agent, BCMA_DMP_RESETSTATUS); in bcma_dmp_wait_reset()
594 if (dinfo->res_agent == NULL) in bcma_dmp_write_reset()
598 rst = bhnd_bus_read_4(dinfo->res_agent, BCMA_DMP_RESETCTRL); in bcma_dmp_write_reset()
602 bhnd_bus_write_4(dinfo->res_agent, BCMA_DMP_RESETCTRL, value); in bcma_dmp_write_reset()
603 bhnd_bus_read_4(dinfo->res_agent, BCMA_DMP_RESETCTRL); /* read-back */ in bcma_dmp_write_reset()