Ignore:
Timestamp:
2019-01-28T15:41:15Z (5 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
8d2289c
Parents:
3fea752
git-author:
Jiri Svoboda <jiri@…> (2018-01-28 07:51:09)
git-committer:
Jiri Svoboda <jiri@…> (2019-01-28 15:41:15)
Message:

Move bcm2835 mbox code from headers to C files (ccheck)

New ccheck rev. found that variable shortcut_inums is defined (non-static)
in a header. The real problem here is that the code of
irc and timer modules is contained in headers instead of C files,
so just move them to the C files.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/genarch/include/genarch/drivers/bcm2835/irc.h

    r3fea752 r67bcd81  
    11/*
     2 * Copyright (c) 2019 Jiri Svoboda
    23 * Copyright (c) 2012 Jan Vesely
    34 * Copyright (c) 2013 Beniamino Galvani
     
    5960#define IRQ_PEND_SHORT_S        10
    6061
    61 unsigned shortcut_inums[] = { 7, 9, 10, 18, 19, 53, 54, 55, 56, 57, 62 };
    62 
    6362typedef struct {
    6463        ioport32_t      irq_basic_pending;
     
    7574#define BCM2835_IRQ_COUNT 96
    7675
    77 static inline void bcm2835_irc_dump(bcm2835_irc_t *regs)
    78 {
    79 #define DUMP_REG(name) \
    80         printf("%s : %08x\n", #name, regs->name);
    81 
    82         DUMP_REG(irq_basic_pending);
    83         DUMP_REG(irq_pending1);
    84         DUMP_REG(irq_pending2);
    85         DUMP_REG(fiq_control);
    86 
    87         for (int i = 0; i < 3; ++i) {
    88                 DUMP_REG(irq_enable[i]);
    89                 DUMP_REG(irq_disable[i]);
    90         }
    91 #undef DUMP_REG
    92 }
    93 
    94 static inline void bcm2835_irc_init(bcm2835_irc_t *regs)
    95 {
    96         /* Disable all interrupts */
    97         regs->irq_disable[BANK_GPU0] = 0xffffffff;
    98         regs->irq_disable[BANK_GPU1] = 0xffffffff;
    99         regs->irq_disable[BANK_ARM]  = 0xffffffff;
    100 
    101         /* Disable FIQ generation */
    102         regs->fiq_control = 0;
    103 }
    104 
    105 static inline int ffs(unsigned int x)
    106 {
    107         int ret;
    108 
    109         asm volatile (
    110             "clz r0, %[x]\n"
    111             "rsb %[ret], r0, #32\n"
    112             : [ret] "=r" (ret)
    113             : [x] "r" (x)
    114             : "r0"
    115         );
    116 
    117         return ret;
    118 }
    119 
    120 static inline unsigned bcm2835_irc_inum_get(bcm2835_irc_t *regs)
    121 {
    122         uint32_t pending;
    123         int inum = -1;
    124 
    125         pending = regs->irq_basic_pending;
    126 
    127         /*
    128          * The basic pending register shows interrupts pending from ARM
    129          * peripherals and it also contains, in order to speed up processing,
    130          * additional information about pending GPU interrupts:
    131          *
    132          *  - bits 0-7 are associated to ARM peripherals
    133          *  - bit 8 is 1 when at least one bit is set in pending register 1
    134          *  - bit 9 is 1 when at least one bit is set in pending register 2
    135          *  - bits 10-20 indicate pending status of selected GPU peripherals
    136          *
    137          *  Reference: BCM2835 ARM Peripherals, p.113
    138          */
    139 
    140         if (pending & IRQ_PEND_ARM_M) {
    141                 inum = MAKE_IRQ(BANK_ARM, ffs(pending & IRQ_PEND_ARM_M) - 1);
    142         } else if (pending & IRQ_PEND_SHORT_M) {
    143                 int pos = (pending & IRQ_PEND_SHORT_M) >> IRQ_PEND_SHORT_S;
    144                 inum = shortcut_inums[ffs(pos) - 1];
    145         } else if (pending & IRQ_PEND_GPU0_M) {
    146                 inum = MAKE_IRQ(BANK_GPU0, ffs(regs->irq_pending1) - 1);
    147         } else if (pending & IRQ_PEND_GPU1_M) {
    148                 inum = MAKE_IRQ(BANK_GPU1, ffs(regs->irq_pending2) - 1);
    149         }
    150 
    151         if (inum < 0) {
    152                 printf("Spurious interrupt!\n");
    153                 bcm2835_irc_dump(regs);
    154                 inum = 0;
    155         }
    156 
    157         return inum;
    158 }
    159 
    160 static inline void bcm2835_irc_enable(bcm2835_irc_t *regs, unsigned inum)
    161 {
    162         assert(inum < BCM2835_IRQ_COUNT);
    163         regs->irq_enable[IRQ_TO_BANK(inum)] |= (1 << IRQ_TO_NUM(inum));
    164 }
    165 
    166 static inline void bcm2835_irc_disable(bcm2835_irc_t *regs, unsigned inum)
    167 {
    168         assert(inum < BCM2835_IRQ_COUNT);
    169         regs->irq_disable[IRQ_TO_BANK(inum)] |= (1 << IRQ_TO_NUM(inum));
    170 }
     76extern void bcm2835_irc_init(bcm2835_irc_t *);
     77extern unsigned bcm2835_irc_inum_get(bcm2835_irc_t *);
     78extern void bcm2835_irc_enable(bcm2835_irc_t *, unsigned);
     79extern void bcm2835_irc_disable(bcm2835_irc_t *, unsigned);
    17180
    17281#endif /* KERN_BCM2835_IRQC_H_ */
Note: See TracChangeset for help on using the changeset viewer.