Deleted Added
sdiff udiff text old ( 4762:c94e103c83ad ) new ( 4870:fcc39d001154 )
full compact
1/*
2 * Copyright (c) 2004-2005 The Regents of The University of Michigan
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 26 unchanged lines hidden (view full) ---

35 */
36
37#include <sys/time.h>
38
39#include <deque>
40#include <string>
41#include <vector>
42
43#include "base/time.hh"
44#include "base/trace.hh"
45#include "dev/pitreg.h"
46#include "dev/rtcreg.h"
47#include "dev/alpha/tsunami_cchip.hh"
48#include "dev/alpha/tsunami.hh"
49#include "dev/alpha/tsunami_io.hh"
50#include "dev/alpha/tsunamireg.h"
51#include "mem/packet.hh"
52#include "mem/packet_access.hh"
53#include "mem/port.hh"
54#include "sim/system.hh"
55
56using namespace std;
57//Should this be AlphaISA?
58using namespace TheISA;
59
60TsunamiIO::RTC::RTC(const string &n, Tsunami* tsunami,
61 const TsunamiIO::Params *p)
62 : _name(n), event(tsunami, p->frequency), addr(0)
63{
64 memset(clock_data, 0, sizeof(clock_data));
65 stat_regA = RTCA_32768HZ | RTCA_1024HZ;
66 stat_regB = RTCB_PRDC_IE |RTCB_BIN | RTCB_24HR;
67
68 year = p->time.tm_year;
69
70 if (p->year_is_bcd) {
71 // The datasheet says that the year field can be either BCD or
72 // years since 1900. Linux seems to be happy with years since
73 // 1900.
74 year = year % 100;
75 int tens = year / 10;
76 int ones = year % 10;
77 year = (tens << 4) + ones;
78 }
79
80 // Unix is 0-11 for month, data seet says start at 1
81 mon = p->time.tm_mon + 1;
82 mday = p->time.tm_mday;
83 hour = p->time.tm_hour;
84 min = p->time.tm_min;
85 sec = p->time.tm_sec;
86
87 // Datasheet says 1 is sunday
88 wday = p->time.tm_wday + 1;
89
90 DPRINTFN("Real-time clock set to %s", asctime(&p->time));
91}
92
93void
94TsunamiIO::RTC::writeAddr(const uint8_t data)
95{
96 if (data <= RTC_STAT_REGD)
97 addr = data;
98 else

--- 330 unchanged lines hidden (view full) ---

429}
430
431const char *
432TsunamiIO::PITimer::Counter::CounterEvent::description()
433{
434 return "tsunami 8254 Interval timer";
435}
436
437TsunamiIO::TsunamiIO(const Params *p)
438 : BasicPioDevice(p), tsunami(p->tsunami), pitimer(p->name + "pitimer"),
439 rtc(p->name + ".rtc", p->tsunami, p)
440{
441 pioSize = 0x100;
442
443 // set the back pointer from tsunami to myself
444 tsunami->io = this;
445
446 timerData = 0;
447 picr = 0;

--- 4 unchanged lines hidden (view full) ---

452TsunamiIO::frequency() const
453{
454 return Clock::Frequency / params()->frequency;
455}
456
457Tick
458TsunamiIO::read(PacketPtr pkt)
459{
460 assert(pkt->result == Packet::Unknown);
461 assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
462
463 Addr daddr = pkt->getAddr() - pioAddr;
464
465 DPRINTF(Tsunami, "io read va=%#x size=%d IOPorrt=%#x\n", pkt->getAddr(),
466 pkt->getSize(), daddr);
467
468 pkt->allocate();

--- 42 unchanged lines hidden (view full) ---

511 if (daddr == TSDEV_PIC1_ISR)
512 pkt->set<uint64_t>(picr);
513 else
514 panic("I/O Read - invalid addr - va %#x size %d\n",
515 pkt->getAddr(), pkt->getSize());
516 } else {
517 panic("I/O Read - invalid size - va %#x size %d\n", pkt->getAddr(), pkt->getSize());
518 }
519 pkt->result = Packet::Success;
520 return pioDelay;
521}
522
523Tick
524TsunamiIO::write(PacketPtr pkt)
525{
526 assert(pkt->result == Packet::Unknown);
527 assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
528 Addr daddr = pkt->getAddr() - pioAddr;
529
530 DPRINTF(Tsunami, "io write - va=%#x size=%d IOPort=%#x Data=%#x\n",
531 pkt->getAddr(), pkt->getSize(), pkt->getAddr() & 0xfff, (uint32_t)pkt->get<uint8_t>());
532
533 assert(pkt->getSize() == sizeof(uint8_t));
534

--- 56 unchanged lines hidden (view full) ---

591 case TSDEV_DMA1_MASK:
592 case TSDEV_DMA2_MASK:
593 case TSDEV_CTRL_PORTB:
594 break;
595 default:
596 panic("I/O Write - va%#x size %d data %#x\n", pkt->getAddr(), pkt->getSize(), pkt->get<uint8_t>());
597 }
598
599 pkt->result = Packet::Success;
600 return pioDelay;
601}
602
603void
604TsunamiIO::postPIC(uint8_t bitvector)
605{
606 //PIC2 Is not implemented, because nothing of interest there
607 picr |= bitvector;

--- 41 unchanged lines hidden (view full) ---

649 UNSERIALIZE_SCALAR(picr);
650 UNSERIALIZE_SCALAR(picInterrupting);
651
652 // Unserialize the timers
653 pitimer.unserialize("pitimer", cp, section);
654 rtc.unserialize("rtc", cp, section);
655}
656
657TsunamiIO *
658TsunamiIOParams::create()
659{
660 return new TsunamiIO(this);
661}