static irqreturn_t timer_interrupt(int irq, void *dev_id) { struct clock_event_device *evt = &clockevent_xilinx_timer; timer_ack(); evt->event_handler(evt); return IRQ_HANDLED; }
static irqreturn_t timer_interrupt(int irq, void *dev_id) { struct clock_event_device *evt = &clockevent_xilinx_timer; #ifdef CONFIG_HEART_BEAT microblaze_heartbeat(); #endif timer_ack(); evt->event_handler(evt); return IRQ_HANDLED; }
__init void plat_time_init(void) { unsigned int configPR; unsigned int n; unsigned int m; unsigned int p; unsigned int pow2p; pnx8xxx_clockevent.cpumask = cpu_none_mask; clockevents_register_device(&pnx8xxx_clockevent); clocksource_register(&pnx_clocksource); /* Timer 1 start */ configPR = read_c0_config7(); configPR &= ~0x00000008; write_c0_config7(configPR); /* Timer 2 start */ configPR = read_c0_config7(); configPR &= ~0x00000010; write_c0_config7(configPR); /* Timer 3 stop */ configPR = read_c0_config7(); configPR |= 0x00000020; write_c0_config7(configPR); /* PLL0 sets MIPS clock (PLL1 <=> TM1, PLL6 <=> TM2, PLL5 <=> mem) */ /* (but only if CLK_MIPS_CTL select value [bits 3:1] is 1: FIXME) */ n = (PNX8550_CM_PLL0_CTL & PNX8550_CM_PLL_N_MASK) >> 16; m = (PNX8550_CM_PLL0_CTL & PNX8550_CM_PLL_M_MASK) >> 8; p = (PNX8550_CM_PLL0_CTL & PNX8550_CM_PLL_P_MASK) >> 2; pow2p = (1 << p); db_assert(m != 0 && pow2p != 0); /* * Compute the frequency as in the PNX8550 User Manual 1.0, p.186 * (a.k.a. 8-10). Divide by HZ for a timer offset that results in * HZ timer interrupts per second. */ mips_hpt_frequency = 27UL * ((1000000UL * n)/(m * pow2p)); cpj = (mips_hpt_frequency + HZ / 2) / HZ; write_c0_count(0); timer_ack(); /* Setup Timer 2 */ write_c0_count2(0); write_c0_compare2(0xffffffff); setup_irq(PNX8550_INT_TIMER1, &pnx8xxx_timer_irq); setup_irq(PNX8550_INT_TIMER2, &monotonic_irqaction); }
void profile_intr_handler( void ) { unsigned int csr, j ; #ifdef PROC_MICROBLAZE asm( "swi r14, r0, pc" ) ; #else pc = mfspr(SPR_SRR0); #endif //print("PC: "); putnum(pc); print("\r\n"); for(j = 0; j < n_gmon_sections; j++ ){ if((pc >= _gmonparam[j].lowpc) && (pc < _gmonparam[j].highpc)) { _gmonparam[j].kcount[(pc-_gmonparam[j].lowpc)/(4 * binsize)]++; break; } } // Ack the Timer Interrupt timer_ack(); }
static int join_ok(Conn_t *conn) { Reg_t *rtmp = NULL; /* silence gcc 2.7.2.1 */ Lecdb_t *ltmp; const char *elanname; Debug_unit(&conn_unit, "Join_ok called"); dump_conn(conn); if (control_packet != NULL && proper_request() == 1) { /* dump_control(control_packet);*/ /* Do not accept control packets with lecid set to unknown value*/ if (control_packet->lecid != 0) { Debug_unit(&conn_unit,"Lecid set"); ltmp = leciddb_find(control_packet->lecid); if (!ltmp || memcmp(<mp->address, &control_packet->source_addr, sizeof(AtmAddr_t)) != 0) { send_join_response(conn->fd, control_packet, conn->lecid, (unsigned int)LE_STATUS_BAD_LECID); return 0; } } /* Is lan destination address present? */ if (control_packet->source.tag != htons(LANE_DEST_NP)) { rtmp = regdb_find_mac(control_packet->source); /* Do not accept lan multicast address */ if (is_multicast(&control_packet->source)) { Debug_unit(&conn_unit,"Destination lan address is multicast"); send_join_response(conn->fd, control_packet, conn->lecid, ((unsigned int)LE_STATUS_BAD_DEST)); return 0; } /* Duplicate registered Lan-destination, duplicate mac-address */ if (rtmp && memcmp(&rtmp->atm_address,&control_packet->source_addr, sizeof(AtmAddr_t)) != 0) { Debug_unit(&conn_unit,"Duplicate Destination lan, duplicate mac"); send_join_response(conn->fd, control_packet, conn->lecid, ((unsigned int)LE_STATUS_DUPLICATE_REG)); return 0; } } /* Duplicate atm-address */ if ((ltmp =leciddb_find_atm(control_packet->source_addr)) != NULL && ltmp->lecid != conn->lecid) { Debug_unit(&conn_unit,"Duplicate atmaddress"); send_join_response(conn->fd, control_packet, conn->lecid, ((unsigned int)LE_STATUS_DUPLICATE_ADDR)); return 0; } /* If we have elan-name, check it agaist the one in join request */ elanname = get_var_str(&conn_unit, "ELANNAME"); if (elanname) { Debug_unit(&conn_unit, "Compare %s with %s",elanname, control_packet->elan_name); if ((strlen(elanname) != control_packet->elan_name_size) || strncmp(elanname, control_packet->elan_name, control_packet->elan_name_size)) { /* Don't match */ Debug_unit(&conn_unit, "Invalid elan-name set"); send_join_response(conn->fd, control_packet, conn->lecid, ((unsigned int)LE_STATUS_NO_CONFIG)); return 0; } } Debug_unit(&conn_unit,"Control_packet OK."); /* Control_packet OK. */ if (leciddb_find(conn->lecid) == NULL) { leciddb_add(conn->lecid, control_packet->source_addr, conn->fd); } if (control_packet->source.tag != htons(LANE_DEST_NP) && !rtmp) { /* dump_addr(&control_packet->source); */ regdb_add(control_packet->source_addr, control_packet->source); } /* Send join response */ if ((conn->proxy == BL_TRUE || is_proxy() == BL_TRUE) && proxydb_find(conn->lecid) == NULL) { proxydb_add((const Conn_t *)conn, conn->fd); } timer_ack(&conn_unit, conn->timer); send_join_response(conn->fd, control_packet, conn->lecid, (unsigned short)LE_STATUS_SUCCESS); return 1; } return 0; }