cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

baboon.c (1886B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Baboon Custom IC Management
      4 *
      5 * The Baboon custom IC controls the IDE, PCMCIA and media bay on the
      6 * PowerBook 190. It multiplexes multiple interrupt sources onto the
      7 * Nubus slot $C interrupt.
      8 */
      9
     10#include <linux/types.h>
     11#include <linux/kernel.h>
     12#include <linux/irq.h>
     13
     14#include <asm/macintosh.h>
     15#include <asm/macints.h>
     16#include <asm/mac_baboon.h>
     17
     18int baboon_present;
     19static volatile struct baboon *baboon;
     20
     21/*
     22 * Baboon initialization.
     23 */
     24
     25void __init baboon_init(void)
     26{
     27	if (macintosh_config->ident != MAC_MODEL_PB190) {
     28		baboon = NULL;
     29		baboon_present = 0;
     30		return;
     31	}
     32
     33	baboon = (struct baboon *) BABOON_BASE;
     34	baboon_present = 1;
     35
     36	pr_debug("Baboon detected at %p\n", baboon);
     37}
     38
     39/*
     40 * Baboon interrupt handler.
     41 * XXX how do you clear a pending IRQ? is it even necessary?
     42 */
     43
     44static void baboon_irq(struct irq_desc *desc)
     45{
     46	short events, irq_bit;
     47	int irq_num;
     48
     49	events = baboon->mb_ifr & 0x07;
     50	irq_num = IRQ_BABOON_0;
     51	irq_bit = 1;
     52	do {
     53		if (events & irq_bit) {
     54			events &= ~irq_bit;
     55			generic_handle_irq(irq_num);
     56		}
     57		++irq_num;
     58		irq_bit <<= 1;
     59	} while (events);
     60}
     61
     62/*
     63 * Register the Baboon interrupt dispatcher on nubus slot $C.
     64 */
     65
     66void __init baboon_register_interrupts(void)
     67{
     68	irq_set_chained_handler(IRQ_NUBUS_C, baboon_irq);
     69}
     70
     71/*
     72 * The means for masking individual Baboon interrupts remains a mystery.
     73 * However, since we only use the IDE IRQ, we can just enable/disable all
     74 * Baboon interrupts. If/when we handle more than one Baboon IRQ, we must
     75 * either figure out how to mask them individually or else implement the
     76 * same workaround that's used for NuBus slots (see nubus_disabled and
     77 * via_nubus_irq_shutdown).
     78 */
     79
     80void baboon_irq_enable(int irq)
     81{
     82	mac_irq_enable(irq_get_irq_data(IRQ_NUBUS_C));
     83}
     84
     85void baboon_irq_disable(int irq)
     86{
     87	mac_irq_disable(irq_get_irq_data(IRQ_NUBUS_C));
     88}