Lines Matching +full:console +full:- +full:size
1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause AND BSD-2-Clause
5 * // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
7 * Freescale DPAA2 Platforms Console Driver
9 * Copyright 2015-2016 Freescale Semiconductor Inc.
12 …* git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/drivers/soc/fsl/dpaa2-console.c…
15 * Copyright (c) 2022-2023 Bjoern A. Zeeb
41 * - https://www.nxp.com.cn/docs/en/application-note/AN13329.pdf
42 * - DPAA2UM
43 …* - git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/drivers/soc/fsl/dpaa2-console…
71 /* Table 6-1. MC Memory Map */
114 vm_size_t size; member
133 #define DPAA2_MC_READ_4(_sc, _r) bus_read_4((_sc)->res, (_r))
168 bus_space_read_region_1(cd->bst, cd->bsh, offset + count, p + count, l); in dpaa2_cons_read_bs()
170 len -= l; in dpaa2_cons_read_bs()
175 bus_space_read_region_8(cd->bst, cd->bsh, offset + count, (uint64_t *)(p + count), l); in dpaa2_cons_read_bs()
178 len -= l; in dpaa2_cons_read_bs()
182 bus_space_read_region_4(cd->bst, cd->bsh, offset + count, (uint32_t *)(p + count), l); in dpaa2_cons_read_bs()
185 len -= l; in dpaa2_cons_read_bs()
189 bus_space_read_region_2(cd->bst, cd->bsh, offset + count, (uint16_t *)(p + count), l); in dpaa2_cons_read_bs()
192 len -= l; in dpaa2_cons_read_bs()
195 bus_space_read_region_1(cd->bst, cd->bsh, offset + count, p + count, len); in dpaa2_cons_read_bs()
213 cd = cdev->si_drv1; in dpaa2_cons_open()
214 if (cd->size == 0) in dpaa2_cons_open()
217 mtx_lock(&cd->mtx); in dpaa2_cons_open()
222 cd->hdr_magic = hdr.magic; in dpaa2_cons_open()
223 if (cd->hdr_magic != cd->magic) { in dpaa2_cons_open()
224 mtx_unlock(&cd->mtx); in dpaa2_cons_open()
228 cd->hdr_eobyte = hdr.eobyte; in dpaa2_cons_open()
229 cd->hdr_start = hdr.start; in dpaa2_cons_open()
230 cd->hdr_len = hdr.len; in dpaa2_cons_open()
232 cd->start = cd->hdr_start - cd->offset; in dpaa2_cons_open()
233 cd->end = cd->start + cd->hdr_len; in dpaa2_cons_open()
235 wrapped = cd->hdr_eobyte & LOG_HEADER_FLAG_BUFFER_WRAPAROUND; in dpaa2_cons_open()
236 cd->eod = cd->start + LAST_BYTE(cd->hdr_eobyte); in dpaa2_cons_open()
238 if (wrapped && cd->eod != cd->end) in dpaa2_cons_open()
239 cd->cur = cd->eod + 1; in dpaa2_cons_open()
241 cd->cur = cd->start; in dpaa2_cons_open()
242 mtx_unlock(&cd->mtx); in dpaa2_cons_open()
252 cd = cdev->si_drv1; in dpaa2_cons_close()
253 mtx_lock(&cd->mtx); in dpaa2_cons_close()
254 cd->hdr_magic = cd->hdr_eobyte = cd->hdr_start = cd->hdr_len = 0; in dpaa2_cons_close()
255 cd->start = cd->end = 0; in dpaa2_cons_close()
256 mtx_unlock(&cd->mtx); in dpaa2_cons_close()
266 size_t len, size, count; in dpaa2_cons_read() local
270 cd = cdev->si_drv1; in dpaa2_cons_read()
271 mtx_lock(&cd->mtx); in dpaa2_cons_read()
272 if (cd->cur == cd->eod) { in dpaa2_cons_read()
273 mtx_unlock(&cd->mtx); in dpaa2_cons_read()
275 } else if (cd->cur > cd->eod) { in dpaa2_cons_read()
276 len = (cd->end - cd->cur) + (cd->eod - cd->start); in dpaa2_cons_read()
278 len = cd->eod - cd->cur; in dpaa2_cons_read()
280 size = cd->end - cd->cur; in dpaa2_cons_read()
282 if (len > size) { in dpaa2_cons_read()
283 /* dump cur [size] */ in dpaa2_cons_read()
284 while (uio->uio_resid > 0) { in dpaa2_cons_read()
285 count = imin(sizeof(buf), uio->uio_resid); in dpaa2_cons_read()
286 if (count > size) in dpaa2_cons_read()
287 count = size; in dpaa2_cons_read()
289 rlen = dpaa2_cons_read_bs(cd, cd->cur, buf, count); in dpaa2_cons_read()
294 cd->cur += count; in dpaa2_cons_read()
295 len -= count; in dpaa2_cons_read()
296 size -= count; in dpaa2_cons_read()
297 mtx_unlock(&cd->mtx); in dpaa2_cons_read()
299 if (error != 0 || uio->uio_resid == 0) in dpaa2_cons_read()
301 mtx_lock(&cd->mtx); in dpaa2_cons_read()
303 cd->cur = cd->start; in dpaa2_cons_read()
307 while (len > 0 && uio->uio_resid > 0) { in dpaa2_cons_read()
308 count = imin(sizeof(buf), uio->uio_resid); in dpaa2_cons_read()
312 rlen = dpaa2_cons_read_bs(cd, cd->cur, buf, count); in dpaa2_cons_read()
316 cd->cur += count; in dpaa2_cons_read()
317 len -= count; in dpaa2_cons_read()
318 mtx_unlock(&cd->mtx); in dpaa2_cons_read()
320 if (error != 0 || uio->uio_resid == 0) in dpaa2_cons_read()
322 mtx_lock(&cd->mtx); in dpaa2_cons_read()
324 mtx_unlock(&cd->mtx); in dpaa2_cons_read()
329 dpaa2_cons_create_dev(device_t dev, bus_addr_t pa, size_t size, in dpaa2_cons_create_dev() argument
341 error = bus_space_map(sc->bst, pa, size, 0, &cd->bsh); in dpaa2_cons_create_dev()
344 __func__, (uintmax_t)pa, size, error); in dpaa2_cons_create_dev()
348 cd->bst = sc->bst; in dpaa2_cons_create_dev()
349 cd->size = size; in dpaa2_cons_create_dev()
354 __func__, (uintmax_t)pa, size, error); in dpaa2_cons_create_dev()
355 bus_space_unmap(cd->bst, cd->bsh, cd->size); in dpaa2_cons_create_dev()
356 cd->size = 0; in dpaa2_cons_create_dev()
364 "%#010x != %#010x, no console?\n", __func__, in dpaa2_cons_create_dev()
365 (uintmax_t)pa, size, hdr.magic, magic); in dpaa2_cons_create_dev()
366 bus_space_unmap(cd->bst, cd->bsh, cd->size); in dpaa2_cons_create_dev()
367 cd->size = 0; in dpaa2_cons_create_dev()
371 if (hdr.start - offset > size) { in dpaa2_cons_create_dev()
372 device_printf(dev, "%s: range wrong for %#jx/%zu: %u - %zu > %zu\n", in dpaa2_cons_create_dev()
373 __func__, (uintmax_t)pa, size, hdr.start, offset, size); in dpaa2_cons_create_dev()
374 bus_space_unmap(cd->bst, cd->bsh, cd->size); in dpaa2_cons_create_dev()
375 cd->size = 0; in dpaa2_cons_create_dev()
379 cd->offset = offset; in dpaa2_cons_create_dev()
380 cd->magic = magic; in dpaa2_cons_create_dev()
381 mtx_init(&cd->mtx, "dpaa2 cons", NULL, MTX_DEF); in dpaa2_cons_create_dev()
390 error = make_dev_s(&md_args, &cd->cdev, "%s", devsw->d_name); in dpaa2_cons_create_dev()
393 __func__, (uintmax_t)pa, size, error); in dpaa2_cons_create_dev()
394 mtx_destroy(&cd->mtx); in dpaa2_cons_create_dev()
395 bus_space_unmap(cd->bst, cd->bsh, cd->size); in dpaa2_cons_create_dev()
396 cd->size = 0; in dpaa2_cons_create_dev()
401 device_printf(dev, "dpaa2 console %s at pa %#jx size %#010zx " in dpaa2_cons_create_dev()
403 "%#010x eobyte %#010x\n", devsw->d_name, (uintmax_t)pa, in dpaa2_cons_create_dev()
404 size, size, offset, hdr.magic, hdr.start, hdr.len, hdr.eobyte); in dpaa2_cons_create_dev()
416 dpaa2_cons_create_dev(dev, (bus_addr_t)(sc->mcfba + MC_BUFFER_OFFSET), in dpaa2_cons_attach_common()
418 &dpaa2_mc_cons_cdevsw, &sc->mc_cd); in dpaa2_cons_attach_common()
420 dpaa2_cons_create_dev(dev, (bus_addr_t)(sc->mcfba + AIOP_BUFFER_OFFSET), in dpaa2_cons_attach_common()
422 &dpaa2_aiop_cons_cdevsw, &sc->aiop_cd); in dpaa2_cons_attach_common()
431 bus_space_unmap(cd->bst, cd->bsh, cd->size); in dpaa2_cons_detach_common()
432 mtx_destroy(&cd->mtx); in dpaa2_cons_detach_common()
442 if (sc->aiop_cd.cdev != NULL) in dpaa2_cons_detach()
443 destroy_dev(sc->aiop_cd.cdev); in dpaa2_cons_detach()
444 if (sc->mc_cd.cdev != NULL) in dpaa2_cons_detach()
445 destroy_dev(sc->mc_cd.cdev); in dpaa2_cons_detach()
447 if (sc->aiop_cd.size != 0) in dpaa2_cons_detach()
448 dpaa2_cons_detach_common(&sc->aiop_cd); in dpaa2_cons_detach()
449 if (sc->mc_cd.size != 0) in dpaa2_cons_detach()
450 dpaa2_cons_detach_common(&sc->mc_cd); in dpaa2_cons_detach()
452 if (sc->res != NULL) in dpaa2_cons_detach()
453 bus_release_resource(dev, SYS_RES_MEMORY, rman_get_rid(sc->res), in dpaa2_cons_detach()
454 sc->res); in dpaa2_cons_detach()
468 device_set_desc(dev, "DPAA2 Console Driver"); in dpaa2_cons_acpi_probe()
482 sc->res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE); in dpaa2_cons_acpi_attach()
483 if (sc->res == NULL) { in dpaa2_cons_acpi_attach()
487 sc->bst = rman_get_bustag(sc->res); in dpaa2_cons_acpi_attach()
491 sc->mcfba |= val; in dpaa2_cons_acpi_attach()
494 sc->mcfba |= ((uint64_t)val << 32); in dpaa2_cons_acpi_attach()
520 { "fsl,dpaa2-console", 1 },
531 if (!ofw_bus_search_compatible(dev, compat_data)->ocd_data) in dpaa2_cons_fdt_probe()
534 device_set_desc(dev, "DPAA2 Console Driver"); in dpaa2_cons_fdt_probe()
548 sc->res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE); in dpaa2_cons_fdt_attach()
549 if (sc->res == NULL) { in dpaa2_cons_fdt_attach()
553 sc->bst = rman_get_bustag(sc->res); in dpaa2_cons_fdt_attach()
557 sc->mcfba |= val; in dpaa2_cons_fdt_attach()
560 sc->mcfba |= ((uint64_t)val << 32); in dpaa2_cons_fdt_attach()