/*-1* SPDX-License-Identifier: BSD-2-Clause2*3* Copyright (c) 2017 Conrad Meyer <[email protected]>4* All rights reserved.5*6* Redistribution and use in source and binary forms, with or without7* modification, are permitted provided that the following conditions8* are met:9* 1. Redistributions of source code must retain the above copyright10* notice, this list of conditions and the following disclaimer.11* 2. Redistributions in binary form must reproduce the above copyright12* notice, this list of conditions and the following disclaimer in the13* documentation and/or other materials provided with the distribution.14*15* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND16* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE17* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE18* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE19* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL20* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS21* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)22* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT23* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY24* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF25* SUCH DAMAGE.26*/2728#include <sys/types.h>29#include <sys/bus.h>30#include <sys/malloc.h>31#include <sys/sysctl.h>3233#include <opencrypto/xform.h>3435#include "ccp.h"36#include "ccp_lsb.h"3738void39ccp_queue_decode_lsb_regions(struct ccp_softc *sc, uint64_t lsbmask,40unsigned queue)41{42struct ccp_queue *qp;43unsigned i;4445qp = &sc->queues[queue];4647qp->lsb_mask = 0;4849for (i = 0; i < MAX_LSB_REGIONS; i++) {50if (((1 << queue) & lsbmask) != 0)51qp->lsb_mask |= (1 << i);52lsbmask >>= MAX_HW_QUEUES;53}5455/*56* Ignore region 0, which has special entries that cannot be used57* generally.58*/59qp->lsb_mask &= ~(1 << 0);60}6162/*63* Look for a private LSB for each queue. There are 7 general purpose LSBs64* total and 5 queues. PSP will reserve some of both. Firmware limits some65* queues' access to some LSBs; we hope it is fairly sane and just use a dumb66* greedy algorithm to assign LSBs to queues.67*/68void69ccp_assign_lsb_regions(struct ccp_softc *sc, uint64_t lsbmask)70{71unsigned q, i;7273for (q = 0; q < nitems(sc->queues); q++) {74if (((1 << q) & sc->valid_queues) == 0)75continue;7677sc->queues[q].private_lsb = -1;7879/* Intentionally skip specialized 0th LSB */80for (i = 1; i < MAX_LSB_REGIONS; i++) {81if ((lsbmask &82(1ull << (q + (MAX_HW_QUEUES * i)))) != 0) {83sc->queues[q].private_lsb = i;84lsbmask &= ~(0x1Full << (MAX_HW_QUEUES * i));85break;86}87}8889if (i == MAX_LSB_REGIONS) {90device_printf(sc->dev,91"Ignoring queue %u with no private LSB\n", q);92sc->valid_queues &= ~(1 << q);93}94}95}969798