本文整理汇总了C++中bus_space_read_4函数的典型用法代码示例。如果您正苦于以下问题:C++ bus_space_read_4函数的具体用法?C++ bus_space_read_4怎么用?C++ bus_space_read_4使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了bus_space_read_4函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: igma_reg_read
static u_int32_t
igma_reg_read(const struct igma_chip *cd, int r)
{
return bus_space_read_4(cd->mmiot, cd->mmioh, r);
}
开发者ID:ryoon,项目名称:netbsd-xhci,代码行数:5,代码来源:igma.c
示例2: acpi_timer_read
static __inline uint32_t
acpi_timer_read(void)
{
return (bus_space_read_4(acpi_timer_bst, acpi_timer_bsh, 0));
}
开发者ID:ele7enxxh,项目名称:dtrace-pf,代码行数:6,代码来源:acpi_timer.c
示例3: grfiv_attach
static void
grfiv_attach(struct device *parent, struct device *self, void *aux)
{
struct obio_attach_args *oa = (struct obio_attach_args *)aux;
struct grfbus_softc *sc;
struct grfmode *gm;
u_long base, length;
u_int32_t vbase1, vbase2;
sc = (struct grfbus_softc *)self;
sc->card_id = 0;
switch (current_mac_model->class) {
case MACH_CLASSQ2:
if (current_mac_model->machineid != MACH_MACLC575) {
sc->sc_basepa = VALKYRIE_BASE;
length = 0x00100000; /* 1MB */
if (sc->sc_basepa <= mac68k_video.mv_phys &&
mac68k_video.mv_phys < (sc->sc_basepa + length)) {
sc->sc_fbofs =
mac68k_video.mv_phys - sc->sc_basepa;
} else {
sc->sc_basepa =
m68k_trunc_page(mac68k_video.mv_phys);
sc->sc_fbofs =
m68k_page_offset(mac68k_video.mv_phys);
length = mac68k_video.mv_len + sc->sc_fbofs;
}
printf(" @ %lx: Valkyrie video subsystem\n",
sc->sc_basepa + sc->sc_fbofs);
break;
}
/* See note in grfiv_match() */
/*FALLTHROUGH*/
case MACH_CLASSQ:
base = DAFB_CONTROL_BASE;
sc->sc_tag = oa->oa_tag;
if (bus_space_map(sc->sc_tag, base, 0x20, 0, &sc->sc_regh)) {
printf(": failed to map DAFB register space\n");
return;
}
sc->sc_basepa = DAFB_BASE;
length = 0x00100000; /* 1MB */
/* Compute the current frame buffer offset */
vbase1 = bus_space_read_4(sc->sc_tag, sc->sc_regh, 0x0) & 0xfff;
#if 1
/*
* XXX The following exists because the DAFB v7 in these
* systems doesn't return reasonable values to use for fbofs.
* Ken'ichi Ishizaka gets credit for this hack. (sar 19990426)
* (Does this get us the correct result for _all_ DAFB-
* equipped systems and monitor combinations? It seems
* possible, if not likely...)
*/
switch (current_mac_model->machineid) {
case MACH_MACLC475:
case MACH_MACLC475_33:
case MACH_MACLC575:
case MACH_MACQ605:
case MACH_MACQ605_33:
vbase1 &= 0x3f;
break;
}
#endif
vbase2 = bus_space_read_4(sc->sc_tag, sc->sc_regh, 0x4) & 0xf;
sc->sc_fbofs = (vbase1 << 9) | (vbase2 << 5);
printf(" @ %lx: DAFB video subsystem, monitor sense %x\n",
sc->sc_basepa + sc->sc_fbofs,
(bus_space_read_4(sc->sc_tag, sc->sc_regh, 0x1c) & 0x7));
bus_space_unmap(sc->sc_tag, sc->sc_regh, 0x20);
break;
case MACH_CLASSAV:
sc->sc_basepa = CIVIC_BASE;
length = 0x00200000; /* 2MB */
if (mac68k_video.mv_phys >= sc->sc_basepa &&
mac68k_video.mv_phys < (sc->sc_basepa + length)) {
sc->sc_fbofs = mac68k_video.mv_phys - sc->sc_basepa;
} else {
sc->sc_basepa = m68k_trunc_page(mac68k_video.mv_phys);
sc->sc_fbofs = m68k_page_offset(mac68k_video.mv_phys);
length = mac68k_video.mv_len + sc->sc_fbofs;
}
printf(" @ %lx: CIVIC video subsystem\n",
sc->sc_basepa + sc->sc_fbofs);
break;
case MACH_CLASSIIci:
case MACH_CLASSIIsi:
sc->sc_basepa = m68k_trunc_page(mac68k_video.mv_phys);
sc->sc_fbofs = m68k_page_offset(mac68k_video.mv_phys);
length = mac68k_video.mv_len + sc->sc_fbofs;
printf(" @ %lx: RBV video subsystem, ",
//.........这里部分代码省略.........
开发者ID:lacombar,项目名称:netbsd-alc,代码行数:101,代码来源:grf_obio.c
示例4: obio_attach
/*
* Attach all the sub-devices we can find
*/
void
obio_attach(struct device *parent, struct device *self, void *aux)
{
struct obio_softc *sc = (struct obio_softc *)self;
struct pci_attach_args *pa = aux;
struct confargs ca;
bus_space_handle_t bsh;
int node, child, namelen, error;
u_int reg[20];
int intr[6], parent_intr = 0, parent_nintr = 0;
char name[32];
char compat[32];
#ifdef OBIO_SPEED_CONTROL
sc->sc_voltage = -1;
sc->sc_busspeed = -1;
#endif
switch (PCI_PRODUCT(pa->pa_id)) {
case PCI_PRODUCT_APPLE_GC:
case PCI_PRODUCT_APPLE_OHARE:
case PCI_PRODUCT_APPLE_HEATHROW:
case PCI_PRODUCT_APPLE_PADDINGTON:
case PCI_PRODUCT_APPLE_KEYLARGO:
case PCI_PRODUCT_APPLE_PANGEA_MACIO:
case PCI_PRODUCT_APPLE_INTREPID:
node = pcidev_to_ofdev(pa->pa_pc, pa->pa_tag);
if (node == -1)
node = OF_finddevice("mac-io");
if (node == -1)
node = OF_finddevice("/pci/mac-io");
break;
case PCI_PRODUCT_APPLE_K2:
node = OF_finddevice("mac-io");
break;
default:
node = -1;
break;
}
if (node == -1)
panic("macio not found or unknown");
sc->sc_node = node;
#if defined (PMAC_G5)
if (OF_getprop(node, "assigned-addresses", reg, sizeof(reg)) < 20)
{
return;
}
#else
if (OF_getprop(node, "assigned-addresses", reg, sizeof(reg)) < 12)
return;
#endif /* PMAC_G5 */
/*
* XXX
* This relies on the primary obio always attaching first which is
* true on the PowerBook 3400c and similar machines but may or may
* not work on others. We can't rely on the node name since Apple
* didn't follow anything remotely resembling a consistent naming
* scheme.
*/
if (obio0 == NULL)
obio0 = sc;
ca.ca_baseaddr = reg[2];
ca.ca_tag = pa->pa_memt;
sc->sc_tag = pa->pa_memt;
error = bus_space_map (pa->pa_memt, ca.ca_baseaddr, 0x80, 0, &bsh);
if (error)
panic(": failed to map mac-io %#x", ca.ca_baseaddr);
sc->sc_bh = bsh;
printf(": addr 0x%x\n", ca.ca_baseaddr);
/* Enable internal modem (KeyLargo) */
if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_APPLE_KEYLARGO) {
aprint_normal("%s: enabling KeyLargo internal modem\n",
self->dv_xname);
bus_space_write_4(ca.ca_tag, bsh, 0x40,
bus_space_read_4(ca.ca_tag, bsh, 0x40) & ~(1<<25));
}
/* Enable internal modem (Pangea) */
if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_APPLE_PANGEA_MACIO) {
/* set reset */
bus_space_write_1(ca.ca_tag, bsh, 0x006a + 0x03, 0x04);
/* power modem on */
bus_space_write_1(ca.ca_tag, bsh, 0x006a + 0x02, 0x04);
/* unset reset */
bus_space_write_1(ca.ca_tag, bsh, 0x006a + 0x03, 0x05);
}
/* Gatwick and Paddington use same product ID */
namelen = OF_getprop(node, "compatible", compat, sizeof(compat));
//.........这里部分代码省略.........
开发者ID:lacombar,项目名称:netbsd-alc,代码行数:101,代码来源:obio.c
示例5: wi_pci_attach
//.........这里部分代码省略.........
return;
}
if (pci_mapreg_map(pa, WI_TMD_IO, PCI_MAPREG_TYPE_IO, 0,
&iot, &ioh, NULL, NULL) != 0) {
aprint_error(": can't map I/O space\n");
return;
}
break;
default:
if (pci_mapreg_map(pa, WI_PCI_CBMA,
PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT,
0, &iot, &ioh, NULL, NULL) != 0) {
aprint_error(": can't map mem space\n");
return;
}
memt = iot;
memh = ioh;
sc->sc_pci = 1;
break;
}
pci_aprint_devinfo(pa, NULL);
sc->sc_enabled = 1;
sc->sc_enable = wi_pci_enable;
sc->sc_iot = iot;
sc->sc_ioh = ioh;
/* Make sure interrupts are disabled. */
CSR_WRITE_2(sc, WI_INT_EN, 0);
CSR_WRITE_2(sc, WI_EVENT_ACK, 0xFFFF);
if (wpp->wpp_chip == CHIP_PLX_OTHER) {
uint32_t command;
#define WI_LOCAL_INTCSR 0x4c
#define WI_LOCAL_INTEN 0x40 /* poke this into INTCSR */
command = bus_space_read_4(plxt, plxh, WI_LOCAL_INTCSR);
command |= WI_LOCAL_INTEN;
bus_space_write_4(plxt, plxh, WI_LOCAL_INTCSR, command);
}
/* Map and establish the interrupt. */
if (pci_intr_map(pa, &ih)) {
aprint_error_dev(self, "couldn't map interrupt\n");
return;
}
intrstr = pci_intr_string(pc, ih, intrbuf, sizeof(intrbuf));
psc->psc_ih = ih;
sc->sc_ih = pci_intr_establish(pc, ih, IPL_NET, wi_intr, sc);
if (sc->sc_ih == NULL) {
aprint_error_dev(self, "couldn't establish interrupt");
if (intrstr != NULL)
aprint_error(" at %s", intrstr);
aprint_error("\n");
return;
}
aprint_normal_dev(self, "interrupting at %s\n", intrstr);
switch (wpp->wpp_chip) {
case CHIP_PLX_OTHER:
case CHIP_PLX_9052:
/*
* Setup the PLX chip for level interrupts and config index 1
* XXX - should really reset the PLX chip too.
*/
bus_space_write_1(memt, memh,
WI_PLX_COR_OFFSET, WI_PLX_COR_VALUE);
break;
case CHIP_TMD_7160:
/* Enable I/O mode and level interrupts on the embedded
* card. The card's COR is the first byte of BAR 0.
*/
bus_space_write_1(tmdt, tmdh, 0, WI_COR_IOMODE);
break;
default:
/* reset HFA3842 MAC core */
wi_pci_reset(sc);
break;
}
printf("%s:", device_xname(self));
if (wi_attach(sc, 0) != 0) {
aprint_error_dev(self, "failed to attach controller\n");
pci_intr_disestablish(pa->pa_pc, sc->sc_ih);
return;
}
if (!wpp->wpp_chip)
sc->sc_reset = wi_pci_reset;
if (pmf_device_register(self, NULL, NULL))
pmf_class_network_register(self, &sc->sc_if);
else
aprint_error_dev(self, "couldn't establish power handler\n");
}
开发者ID:ryo,项目名称:netbsd-src,代码行数:101,代码来源:if_wi_pci.c
示例6: exynos_device_register
void
exynos_device_register(device_t self, void *aux)
{
if (device_is_a(self, "armperiph")
&& device_is_a(device_parent(self), "mainbus")) {
/*
* XXX KLUDGE ALERT XXX
* The iot mainbus supplies is completely wrong since it scales
* addresses by 2. The simplest remedy is to replace with our
* bus space used for the armcore registers (which armperiph uses).
*/
struct mainbus_attach_args * const mb = aux;
mb->mb_iot = &armv7_generic_bs_tag;
return;
}
if (device_is_a(self, "armgic")
&& device_is_a(device_parent(self), "armperiph")) {
/*
* The Exynos4420 armgic is located at a different location!
*/
extern uint32_t exynos_soc_id;
switch (EXYNOS_PRODUCT_ID(exynos_soc_id)) {
#ifdef EXYNOS5
case 0xe5410:
/* offsets not changed on matt's request */
#if 0
mpcaa->mpcaa_memh = EXYNOS_CORE_VBASE;
mpcaa->mpcaa_off1 = EXYNOS5_GIC_IOP_DISTRIBUTOR_OFFSET;
mpcaa->mpcaa_off2 = EXYNOS5_GIC_IOP_CONTROLLER_OFFSET;
#endif
break;
case 0xe5422: {
struct mpcore_attach_args * const mpcaa = aux;
mpcaa->mpcaa_memh = EXYNOS_CORE_VBASE;
mpcaa->mpcaa_off1 = EXYNOS5_GIC_IOP_DISTRIBUTOR_OFFSET;
mpcaa->mpcaa_off2 = EXYNOS5_GIC_IOP_CONTROLLER_OFFSET;
break;
}
#endif
#ifdef EXYNOS4
case 0xe4410:
case 0xe4412: {
struct mpcore_attach_args * const mpcaa = aux;
mpcaa->mpcaa_memh = EXYNOS_CORE_VBASE;
mpcaa->mpcaa_off1 = EXYNOS4_GIC_DISTRIBUTOR_OFFSET;
mpcaa->mpcaa_off2 = EXYNOS4_GIC_CNTR_OFFSET;
break;
}
#endif
default:
panic("%s: unknown SoC product id %#x", __func__,
(u_int)EXYNOS_PRODUCT_ID(exynos_soc_id));
}
return;
}
if (device_is_a(self, "armgtmr") || device_is_a(self, "mct")) {
#ifdef EXYNOS5
/*
* The global timer is dependent on the MCT running.
*/
bus_size_t o = EXYNOS5_MCT_OFFSET + MCT_G_TCON;
uint32_t v = bus_space_read_4(&armv7_generic_bs_tag, exynos_core_bsh,
o);
v |= G_TCON_START;
bus_space_write_4(&armv7_generic_bs_tag, exynos_core_bsh, o, v);
#endif
/*
* The frequencies of the timers are the reference
* frequency.
*/
prop_dictionary_set_uint32(device_properties(self),
"frequency", EXYNOS_F_IN_FREQ);
return;
}
}
开发者ID:ryo,项目名称:netbsd-src,代码行数:79,代码来源:exynos_soc.c
示例7: ibm4xx_show_pci_map
void
ibm4xx_show_pci_map(void)
{
pci_chipset_tag_t pc = &genppc_ibm4xx_chipset;
paddr_t la, lm, pl, ph;
pcitag_t tag;
setup_pcicfg_window();
printf("Local -> PCI map\n");
la = bus_space_read_4(pcicfg_iot, pcicfg_ioh, PCIL_PMM0LA);
lm = bus_space_read_4(pcicfg_iot, pcicfg_ioh, PCIL_PMM0MA);
pl = bus_space_read_4(pcicfg_iot, pcicfg_ioh, PCIL_PMM0PCILA);
ph = bus_space_read_4(pcicfg_iot, pcicfg_ioh, PCIL_PMM0PCIHA);
printf("0: %08lx,%08lx -> %08lx%08lx %sprefetchable, %s\n", la, lm, ph, pl,
(lm & 2) ? "":"not ",
(lm & 1) ? "enabled":"disabled");
la = bus_space_read_4(pcicfg_iot, pcicfg_ioh, PCIL_PMM1LA);
lm = bus_space_read_4(pcicfg_iot, pcicfg_ioh, PCIL_PMM1MA);
pl = bus_space_read_4(pcicfg_iot, pcicfg_ioh, PCIL_PMM1PCILA);
ph = bus_space_read_4(pcicfg_iot, pcicfg_ioh, PCIL_PMM1PCIHA);
printf("1: %08lx,%08lx -> %08lx%08lx %sprefetchable, %s\n", la, lm, ph, pl,
(lm & 2) ? "":"not ",
(lm & 1) ? "enabled":"disabled");
la = bus_space_read_4(pcicfg_iot, pcicfg_ioh, PCIL_PMM2LA);
lm = bus_space_read_4(pcicfg_iot, pcicfg_ioh, PCIL_PMM2MA);
pl = bus_space_read_4(pcicfg_iot, pcicfg_ioh, PCIL_PMM2PCILA);
ph = bus_space_read_4(pcicfg_iot, pcicfg_ioh, PCIL_PMM2PCIHA);
printf("2: %08lx,%08lx -> %08lx%08lx %sprefetchable, %s\n", la, lm, ph, pl,
(lm & 2) ? "":"not ",
(lm & 1) ? "enabled":"disabled");
printf("PCI -> Local map\n");
tag = pci_make_tag(pc, 0, 0, 0);
pl = pci_conf_read(pc, tag, PCIC_PTM1BAR);
la = bus_space_read_4(pcicfg_iot, pcicfg_ioh, PCIL_PTM1LA);
lm = bus_space_read_4(pcicfg_iot, pcicfg_ioh, PCIL_PTM1MS);
printf("1: %08lx -> %08lx,%08lx %s\n", pl, la, lm,
(lm & 1)?"enabled":"disabled");
pl = pci_conf_read(pc, tag, PCIC_PTM2BAR);
la = bus_space_read_4(pcicfg_iot, pcicfg_ioh, PCIL_PTM2LA);
lm = bus_space_read_4(pcicfg_iot, pcicfg_ioh, PCIL_PTM2MS);
printf("2: %08lx -> %08lx,%08lx %s\n", pl, la, lm,
(lm & 1)?"enabled":"disabled");
}
开发者ID:ryo,项目名称:netbsd-src,代码行数:45,代码来源:ibm405gp.c
示例8: ohci_pci_attach
void
ohci_pci_attach(struct device *parent, struct device *self, void *aux)
{
struct ohci_pci_softc *sc = (struct ohci_pci_softc *)self;
struct pci_attach_args *pa = (struct pci_attach_args *)aux;
pci_chipset_tag_t pc = pa->pa_pc;
char const *intrstr;
pci_intr_handle_t ih;
int s;
const char *vendor;
char *devname = sc->sc.sc_bus.bdev.dv_xname;
/* Map I/O registers */
if (pci_mapreg_map(pa, PCI_CBMEM, PCI_MAPREG_TYPE_MEM, 0,
&sc->sc.iot, &sc->sc.ioh, NULL, &sc->sc.sc_size, 0)) {
printf(": can't map mem space\n");
return;
}
/* Record what interrupts were enabled by SMM/BIOS. */
sc->sc.sc_intre = bus_space_read_4(sc->sc.iot, sc->sc.ioh,
OHCI_INTERRUPT_ENABLE);
/* Disable interrupts, so we don't get any spurious ones. */
bus_space_write_4(sc->sc.iot, sc->sc.ioh, OHCI_INTERRUPT_DISABLE,
OHCI_MIE);
sc->sc_pc = pc;
sc->sc.sc_bus.dmatag = pa->pa_dmat;
bus_space_barrier(sc->sc.iot, sc->sc.ioh, 0, sc->sc.sc_size,
BUS_SPACE_BARRIER_READ|BUS_SPACE_BARRIER_WRITE);
bus_space_write_4(sc->sc.iot, sc->sc.ioh,
OHCI_INTERRUPT_DISABLE, OHCI_MIE);
s = splusb();
/* Map and establish the interrupt. */
if (pci_intr_map(pa, &ih)) {
printf(": couldn't map interrupt\n");
bus_space_unmap(sc->sc.iot, sc->sc.ioh, sc->sc.sc_size);
splx(s);
return;
}
intrstr = pci_intr_string(pc, ih);
sc->sc_ih = pci_intr_establish(pc, ih, IPL_USB, ohci_intr, sc, devname);
if (sc->sc_ih == NULL) {
printf(": couldn't establish interrupt");
if (intrstr != NULL)
printf(" at %s", intrstr);
printf("\n");
bus_space_unmap(sc->sc.iot, sc->sc.ioh, sc->sc.sc_size);
splx(s);
return;
}
printf(": %s", intrstr);
/* Figure out vendor for root hub descriptor. */
vendor = pci_findvendor(pa->pa_id);
sc->sc.sc_id_vendor = PCI_VENDOR(pa->pa_id);
if (vendor)
strlcpy(sc->sc.sc_vendor, vendor, sizeof (sc->sc.sc_vendor));
else
snprintf(sc->sc.sc_vendor, sizeof (sc->sc.sc_vendor),
"vendor 0x%04x", PCI_VENDOR(pa->pa_id));
/* Display revision and perform legacy emulation handover. */
if (ohci_checkrev(&sc->sc) != USBD_NORMAL_COMPLETION ||
ohci_handover(&sc->sc) != USBD_NORMAL_COMPLETION) {
bus_space_unmap(sc->sc.iot, sc->sc.ioh, sc->sc.sc_size);
pci_intr_disestablish(sc->sc_pc, sc->sc_ih);
splx(s);
return;
}
/* Ignore interrupts for now */
sc->sc.sc_bus.dying = 1;
config_defer(self, ohci_pci_attach_deferred);
splx(s);
return;
}
开发者ID:appleorange1,项目名称:bitrig,代码行数:84,代码来源:ohci_pci.c
示例9: malo_hal_read4
static __inline uint32_t
malo_hal_read4(struct malo_hal *mh, bus_size_t off)
{
return bus_space_read_4(mh->mh_iot, mh->mh_ioh, off);
}
开发者ID:coyizumi,项目名称:cs111,代码行数:5,代码来源:if_malohal.c
示例10: rex3_read
static uint32_t
rex3_read(struct newport_devconfig *dc, bus_size_t rexreg)
{
return bus_space_read_4(dc->dc_st, dc->dc_sh, NEWPORT_REX3_OFFSET +
rexreg);
}
开发者ID:MarginC,项目名称:kame,代码行数:6,代码来源:newport.c
示例11: wiibus_csr_read
static uint32_t
wiibus_csr_read(struct wiibus_softc *sc, uint16_t reg)
{
return (bus_space_read_4(sc->sc_tag, sc->sc_handle, reg));
}
开发者ID:coyizumi,项目名称:cs111,代码行数:6,代码来源:wii_bus.c
示例12: iof_attach
void
iof_attach(struct device *parent, struct device *self, void *aux)
{
struct iof_softc *sc = (struct iof_softc *)self;
struct pci_attach_args *pa = aux;
pci_intr_handle_t ih;
bus_space_tag_t memt;
bus_space_handle_t memh;
bus_size_t memsize;
const char *intrstr;
printf(": ");
if (pci_mapreg_map(pa, PCI_MAPREG_START, PCI_MAPREG_TYPE_MEM, 0,
&memt, &memh, NULL, &memsize, 0)) {
printf("can't map mem space\n");
return;
}
sc->sc_pc = pa->pa_pc;
sc->sc_tag = pa->pa_tag;
sc->sc_dmat = pa->pa_dmat;
/*
* Build a suitable bus_space_handle by restoring the original
* non-swapped subword access methods.
*
* XXX This is horrible and will need to be rethought if
* XXX IOC4 exist as real, removable PCI cards and
* XXX we ever support them cards not plugged to xbridges.
*/
sc->sc_mem_bus_space = malloc(sizeof (*sc->sc_mem_bus_space),
M_DEVBUF, M_NOWAIT);
if (sc->sc_mem_bus_space == NULL) {
printf("can't allocate bus_space\n");
goto unmap;
}
bcopy(memt, sc->sc_mem_bus_space, sizeof(*sc->sc_mem_bus_space));
sc->sc_mem_bus_space->_space_read_1 = xbow_read_1;
sc->sc_mem_bus_space->_space_read_2 = xbow_read_2;
sc->sc_mem_bus_space->_space_read_raw_2 = xbow_read_raw_2;
sc->sc_mem_bus_space->_space_write_1 = xbow_write_1;
sc->sc_mem_bus_space->_space_write_2 = xbow_write_2;
sc->sc_mem_bus_space->_space_write_raw_2 = xbow_write_raw_2;
sc->sc_memt = sc->sc_mem_bus_space;
sc->sc_memh = memh;
sc->sc_mcr = bus_space_read_4(sc->sc_memt, sc->sc_memh, IOC4_MCR);
/*
* Acknowledge all pending interrupts, and disable them.
*/
bus_space_write_4(sc->sc_memt, sc->sc_memh, IOC4_SIO_IEC, ~0x0);
bus_space_write_4(sc->sc_memt, sc->sc_memh, IOC4_SIO_IES, 0x0);
bus_space_write_4(sc->sc_memt, sc->sc_memh, IOC4_SIO_IR,
bus_space_read_4(sc->sc_memt, sc->sc_memh, IOC4_SIO_IR));
bus_space_write_4(sc->sc_memt, sc->sc_memh, IOC4_OTHER_IEC, ~0x0);
bus_space_write_4(sc->sc_memt, sc->sc_memh, IOC4_OTHER_IES, 0x0);
bus_space_write_4(sc->sc_memt, sc->sc_memh, IOC4_OTHER_IR,
bus_space_read_4(sc->sc_memt, sc->sc_memh, IOC4_OTHER_IR));
if (pci_intr_map(pa, &ih) != 0) {
printf("failed to map interrupt!\n");
goto unmap;
}
intrstr = pci_intr_string(sc->sc_pc, ih);
sc->sc_ih = pci_intr_establish(sc->sc_pc, ih, IPL_TTY, iof_intr,
sc, self->dv_xname);
if (sc->sc_ih == NULL) {
printf("failed to establish interrupt at %s\n", intrstr);
goto unmap;
}
printf("%s\n", intrstr);
/*
* Attach other sub-devices.
*/
iof_attach_child(self, "com", IOC4_UARTA_BASE, IOC4DEV_SERIAL_A);
iof_attach_child(self, "com", IOC4_UARTB_BASE, IOC4DEV_SERIAL_B);
iof_attach_child(self, "com", IOC4_UARTC_BASE, IOC4DEV_SERIAL_C);
iof_attach_child(self, "com", IOC4_UARTD_BASE, IOC4DEV_SERIAL_D);
iof_attach_child(self, "iockbc", IOC4_KBC_BASE, IOC4DEV_KBC);
iof_attach_child(self, "dsrtc", IOC4_BYTEBUS_0, IOC4DEV_RTC);
return;
unmap:
bus_space_unmap(memt, memh, memsize);
}
开发者ID:alenichev,项目名称:openbsd-kernel,代码行数:96,代码来源:iof.c
示例13: imxahci_attach
void
imxahci_attach(struct device *parent, struct device *self, void *args)
{
struct armv7_attach_args *aa = args;
struct imxahci_softc *imxsc = (struct imxahci_softc *) self;
struct ahci_softc *sc = &imxsc->sc;
uint32_t timeout = 0x100000;
sc->sc_iot = aa->aa_iot;
sc->sc_ios = aa->aa_dev->mem[0].size;
sc->sc_dmat = aa->aa_dmat;
if (bus_space_map(sc->sc_iot, aa->aa_dev->mem[0].addr,
aa->aa_dev->mem[0].size, 0, &sc->sc_ioh))
panic("imxahci_attach: bus_space_map failed!");
sc->sc_ih = arm_intr_establish(aa->aa_dev->irq[0], IPL_BIO,
ahci_intr, sc, sc->sc_dev.dv_xname);
if (sc->sc_ih == NULL) {
printf(": unable to establish interrupt\n");
goto unmap;
}
imxsc->sc_clk = clk_get("ahb");
if (imxsc->sc_clk == NULL) {
printf(": can't get clock\n");
goto unmap;
}
clk_enable(imxsc->sc_clk);
/* power it up */
clk_enable(clk_get("sata_ref_100m"));
clk_enable(clk_get("sata"));
delay(100);
/* power phy up */
imxiomuxc_enable_sata();
/* setup */
bus_space_write_4(sc->sc_iot, sc->sc_ioh, SATA_P0PHYCR,
bus_space_read_4(sc->sc_iot, sc->sc_ioh, SATA_P0PHYCR) & ~SATA_P0PHYCR_TEST_PDDQ);
bus_space_write_4(sc->sc_iot, sc->sc_ioh, SATA_GHC, SATA_GHC_HR);
while (!bus_space_read_4(sc->sc_iot, sc->sc_ioh, SATA_VERSIONR));
bus_space_write_4(sc->sc_iot, sc->sc_ioh, SATA_CAP,
bus_space_read_4(sc->sc_iot, sc->sc_ioh, SATA_CAP) | SATA_CAP_SSS);
bus_space_write_4(sc->sc_iot, sc->sc_ioh, SATA_PI, 1);
bus_space_write_4(sc->sc_iot, sc->sc_ioh, SATA_TIMER1MS, clk_get_rate(imxsc->sc_clk));
while (!(bus_space_read_4(sc->sc_iot, sc->sc_ioh, SATA_P0SSTS) & 0xF) && timeout--);
if (ahci_attach(sc) != 0) {
/* error printed by ahci_attach */
goto irq;
}
return;
irq:
arm_intr_disestablish(sc->sc_ih);
unmap:
bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios);
}
开发者ID:SylvestreG,项目名称:bitrig,代码行数:66,代码来源:imxahci.c
示例14: obiosdhc_attach
static void
obiosdhc_attach(device_t parent, device_t self, void *aux)
{
struct obiosdhc_softc * const sc = device_private(self);
struct obio_attach_args * const oa = aux;
prop_dictionary_t prop = device_properties(self);
uint32_t clkd, stat;
int error, timo, clksft, n;
bool support8bit = false;
const char *transfer_mode = "PIO";
#ifdef TI_AM335X
size_t i;
#endif
prop_dictionary_get_bool(prop, "8bit", &support8bit);
sc->sc.sc_dmat = oa->obio_dmat;
sc->sc.sc_dev = self;
sc->sc.sc_flags |= SDHC_FLAG_32BIT_ACCESS;
sc->sc.sc_flags |= SDHC_FLAG_NO_LED_ON;
sc->sc.sc_flags |= SDHC_FLAG_RSP136_CRC;
sc->sc.sc_flags |= SDHC_FLAG_SINGLE_ONLY;
if (support8bit)
sc->sc.sc_flags |= SDHC_FLAG_8BIT_MODE;
#ifdef TI_AM335X
sc->sc.sc_flags |= SDHC_FLAG_WAIT_RESET;
sc->sc.sc_flags &= ~SDHC_FLAG_SINGLE_ONLY;
#endif
#if defined(OMAP_3530)
sc->sc.sc_flags &= ~SDHC_FLAG_SINGLE_ONLY;
#endif
sc->sc.sc_host = sc->sc_hosts;
sc->sc.sc_clkbase = 96000; /* 96MHZ */
if (!prop_dictionary_get_uint32(prop, "clkmask", &sc->sc.sc_clkmsk))
sc->sc.sc_clkmsk = 0x0000ffc0;
sc->sc.sc_vendor_rod = obiosdhc_rod;
sc->sc.sc_vendor_write_protect = obiosdhc_write_protect;
sc->sc.sc_vendor_card_detect = obiosdhc_card_detect;
sc->sc.sc_vendor_bus_clock = obiosdhc_bus_clock;
sc->sc_bst = oa->obio_iot;
clksft = ffs(sc->sc.sc_clkmsk) - 1;
error = bus_space_map(sc->sc_bst, oa->obio_addr, oa->obio_size, 0,
&sc->sc_bsh);
if (error) {
aprint_error_dev(self,
"can't map registers: %d\n", error);
return;
}
bus_space_subregion(sc->sc_bst, sc->sc_bsh, OMAP3_SDMMC_SDHC_OFFSET,
OMAP3_SDMMC_SDHC_SIZE, &sc->sc_sdhc_bsh);
#if NEDMA > 0
if (oa->obio_edmabase != -1) {
cv_init(&sc->sc_edma_cv, "sdhcedma");
sc->sc_edma_fifo = oa->obio_addr +
OMAP3_SDMMC_SDHC_OFFSET + SDHC_DATA;
obiosdhc_edma_init(sc, oa->obio_edmabase);
sc->sc.sc_flags |= SDHC_FLAG_USE_DMA;
sc->sc.sc_flags |= SDHC_FLAG_EXTERNAL_DMA;
sc->sc.sc_flags |= SDHC_FLAG_EXTDMA_DMAEN;
sc->sc.sc_flags &= ~SDHC_FLAG_SINGLE_ONLY;
sc->sc.sc_vendor_transfer_data_dma = obiosdhc_edma_xfer_data;
transfer_mode = "EDMA";
}
#endif
aprint_naive("\n");
aprint_normal(": SDHC controller (%s)\n", transfer_mode);
#ifdef TI_AM335X
/* XXX Not really AM335X-specific. */
for (i = 0; i < __arraycount(am335x_sdhc); i++)
if ((oa->obio_addr == am335x_sdhc[i].as_base_addr) &&
(oa->obio_intr == am335x_sdhc[i].as_intr)) {
prcm_module_enable(&am335x_sdhc[i].as_module);
break;
}
KASSERT(i < __arraycount(am335x_sdhc));
#endif
/* XXXXXX: Turn-on regulator via I2C. */
/* XXXXXX: And enable ICLOCK/FCLOCK. */
/* MMCHS Soft reset */
bus_space_write_4(sc->sc_bst, sc->sc_bsh, MMCHS_SYSCONFIG,
SYSCONFIG_SOFTRESET);
timo = 3000000; /* XXXX 3 sec. */
while (timo--) {
if (bus_space_read_4(sc->sc_bst, sc->sc_bsh, MMCHS_SYSSTATUS) &
SYSSTATUS_RESETDONE)
break;
delay(1);
}
if (timo == 0)
aprint_error_dev(self, "Soft reset timeout\n");
bus_space_write_4(sc->sc_bst, sc->sc_bsh, MMCHS_SYSCONFIG,
SYSCONFIG_ENAWAKEUP | SYSCONFIG_AUTOIDLE | SYSCONFIG_SIDLEMODE_AUTO |
//.........这里部分代码省略.........
开发者ID:yazshel,项目名称:netbsd-kernel,代码行数:101,代码来源:omap3_sdhc.c
示例15: platform_mp_start_ap
void
platform_mp_start_ap(void)
{
bus_space_handle_t scu;
bus_space_handle_t src;
uint32_t val;
int i;
if (bus_space_map(fdtbus_bs_tag, SCU_PHYSBASE, SCU_SIZE, 0, &scu) != 0)
panic("Couldn't map the SCU\n");
if (bus_space_map(fdtbus_bs_tag, SRC_PHYSBASE, SRC_SIZE, 0, &src) != 0)
panic("Couldn't map the system reset controller (SRC)\n");
/*
* Invalidate SCU cache tags. The 0x0000ffff constant invalidates all
* ways on all cores 0-3. Per the ARM docs, it's harmless to write to
* the bits for cores that are not present.
*/
bus_space_write_4(fdtbus_bs_tag, scu, SCU_INV_TAGS_REG, 0x0000ffff);
/*
* Erratum ARM/MP: 764369 (problems with cache maintenance).
* Setting the "disable-migratory bit" in the undocumented SCU
* Diagnostic Control Register helps work around the problem.
*/
val = bus_space_read_4(fdtbus_bs_tag, scu, SCU_DIAG_CONTROL);
bus_space_write_4(fdtbus_bs_tag, scu, SCU_DIAG_CONTROL,
val | SCU_DIAG_DISABLE_MIGBIT);
/*
* Enable the SCU, then clean the cache on this core. After these two
* operations the cache tag ram in the SCU is coherent with the contents
* of the cache on this core. The other cores aren't running yet so
* their caches can't contain valid data yet, but we've initialized
* their SCU tag ram above, so they will be coherent from startup.
*/
val = bus_space_read_4(fdtbus_bs_tag, scu, SCU_CONTROL_REG);
bus_space_write_4(fdtbus_bs_tag, scu, SCU_CONTROL_REG,
val | SCU_CONTROL_ENABLE);
cpu_idcache_wbinv_all();
/*
* For each AP core, set the entry point address and argument registers,
* and set the core-enable and core-reset bits in the control register.
*/
val = bus_space_read_4(fdtbus_bs_tag, src, SRC_CONTROL_REG);
for (i=1; i < mp_ncpus; i++) {
bus_space_write_4(fdtbus_bs_tag, src, SRC_GPR0_C1FUNC + 8*i,
pmap_kextract((vm_offset_t)mpentry));
bus_space_write_4(fdtbus_bs_tag, src, SRC_GPR1_C1ARG + 8*i, 0);
val |= ((1 << (SRC_CONTROL_C1ENA_SHIFT - 1 + i )) |
( 1 << (SRC_CONTROL_C1RST_SHIFT - 1 + i)));
}
bus_space_write_4(fdtbus_bs_tag, src, 0, val);
armv7_sev();
bus_space_unmap(fdtbus_bs_tag, scu, SCU_SIZE);
bus_space_unmap(fdtbus_bs_tag, src, SRC_SIZE);
}
开发者ID:ChristosKa,项目名称:freebsd,代码行数:63,代码来源:imx6_mp.c
示例16: fimd_attach
static int
fimd_attach(device_t dev)
{
struct panel_info panel;
struct fimd_softc *sc;
device_t gpio_dev;
int reg;
sc = device_get_softc(dev);
sc->dev = dev;
if (bus_alloc_resources(dev, fimd_spec, sc->res)) {
device_printf(dev, "could not allocate resources\n");
return (ENXIO);
}
/* Memory interface */
sc->bst = rman_get_bustag(sc->res[0]);
sc->bsh = rman_get_bushandle(sc->res[0]);
sc->bst_disp = rman_get_bustag(sc->res[1]);
sc->bsh_disp = rman_get_bushandle(sc->res[1]);
sc->bst_sysreg = rman_get_bustag(sc->res[2]);
sc->bsh_sysreg = rman_get_bushandle(sc->res[2]);
if (get_panel_info(sc, &panel)) {
device_printf(dev, "Can't get panel info\n");
return (ENXIO);
}
panel.fixvclk = 0;
panel.ivclk = 0;
panel.clkval_f = 2;
sc->panel = &panel;
/* Get the GPIO device, we need this to give power to USB */
gpio_dev = devclass_get_device(devclass_find("gpio"), 0);
if (gpio_dev == NULL) {
/* TODO */
}
reg = bus_space_read_4(sc->bst_sysreg, sc->bsh_sysreg, 0x214);
reg |= FIMDBYPASS_DISP1;
bus_space_write_4(sc->bst_sysreg, sc->bsh_sysreg, 0x214, reg);
sc->sc_info.fb_width = panel.width;
sc->sc_info.fb_height = panel.height;
sc->sc_info.fb_stride = sc->sc_info.fb_width * 2;
sc->sc_info.fb_bpp = sc->sc_info.fb_depth = 16;
sc->sc_info.fb_size = sc->sc_info.fb_height * sc->sc_info.fb_stride;
sc->sc_info.fb_vbase = (intptr_t)kmem_alloc_contig(kernel_arena,
sc->sc_info.fb_size, M_ZERO, 0, ~0, PAGE_SIZE, 0, VM_MEMATTR_UNCACHEABLE);
sc->sc_info.fb_pbase = (intptr_t)vtophys(sc->sc_info.fb_vbase);
#if 0
printf("%dx%d [%d]\n", sc->sc_info.fb_width, sc->sc_info.fb_height,
sc->sc_info.fb_stride);
printf("pbase == 0x%08x\n", sc->sc_info.fb_pbase);
#endif
memset((int8_t *)sc->sc_info.fb_vbase, 0x0, sc->sc_info.fb_size);
fimd_init(sc);
sc->sc_info.fb_name = device_get_nameunit(dev);
/* Ask newbus to attach framebuffer device to me. */
sc->sc_fbd = device_add_child(dev, "fbd", device_get_unit(dev));
if (sc->sc_fbd == NULL)
device_printf(dev, "Can't attach fbd device\n");
if (device_probe_and_attach(sc->sc_fbd) != 0) {
device_printf(sc->dev, "Failed to attach fbd device\n");
}
return (0);
}
开发者ID:coyizumi,项目名称:cs111,代码行数:77,代码来源:exynos5_fimd.c
示例17: exynos5410_usb2phy_enable
static void
exynos5410_usb2phy_enable(bus_space_handle_t usb2phy_bsh)
{
uint32_t phyhost; //, phyotg;
uint32_t phyhsic;
uint32_t ehcictrl, ohcictrl;
/* host configuration: */
phyhost = bus_space_read_4(&armv7_generic_bs_tag, usb2phy_bsh,
USB_PHY_HOST_CTRL0);
/* host phy reference clock; assumption its 24 MHz now */
phyhost &= ~HOST_CTRL0_FSEL_MASK;
phyhost |= __SHIFTIN(FSEL_CLKSEL_24M, HOST_CTRL0_FSEL_MASK);
/* enable normal mode of operation */
phyhost &= ~(HOST_CTRL0_FORCESUSPEND | HOST_CTRL0_FORCESLEEP);
/* host phy reset */
phyhost &= ~(HOST_CTRL0_PHY_SWRST | HOST_CTRL0_PHY_SWRST_ALL |
HOST_CTRL0_SIDDQ | HOST_CTRL0_FORCESUSPEND |
HOST_CTRL0_FORCESLEEP);
/* host link reset */
phyhost |= HOST_CTRL0_LINK_SWRST | HOST_CTRL0_UTMI_SWRST |
HOST_CTRL0_COMMONON_N;
/* do the reset */
bus_space_write_4(&armv7_generic_bs_tag, usb2phy_bsh, USB_PHY_HOST_CTRL0,
phyhost);
DELAY(10000);
phyhost &= ~(HOST_CTRL0_LINK_SWRST | HOST_CTRL0_UTMI_SWRST);
bus_space_write_4(&armv7_generic_bs_tag, usb2phy_bsh, USB_PHY_HOST_CTRL0,
phyhost);
/* HSIC control */
phyhsic =
__SHIFTIN(HSIC_CTRL_REFCLKDIV_12, HSIC_CTRL_REFCLKDIV_MASK) |
__SHIFTIN(HSIC_CTRL_REFCLKSEL_DEFAULT, HSIC_CTRL_REFCLKSEL_MASK) |
HSIC_CTRL_PHY_SWRST;
bus_space_write_4(&armv7_generic_bs_tag, usb2phy_bsh, USB_PHY_HSIC_CTRL1,
phyhsic);
bus_space_write_4(&armv7_generic_bs_tag, usb2phy_bsh, USB_PHY_HSIC_CTRL2,
phyhsic);
DELAY(10);
phyhsic &= ~HSIC_CTRL_PHY_SWRST;
bus_space_write_4(&armv7_generic_bs_tag, usb2phy_bsh, USB_PHY_HSIC_CTRL1,
phyhsic);
bus_space_write_4(&armv7_generic_bs_tag, usb2phy_bsh, USB_PHY_HSIC_CTRL2,
phyhsic);
DELAY(80);
#if 0
/* otg configuration: */
phyotg = bus_space_read_4(&armv7_generic_bs_tag, usb2phy_bsh,
USB_PHY_OTG_SYS);
/* otg phy refrence clock: assumption its 24 Mhz now */
phyotg &= ~OTG_SYS_FSEL_MASK;
phyotg |= __SHIFTIN(OTG_SYS_FSEL_MASK, FSEL_CLKSEL_24M);
/* enable normal mode of operation */
phyotg &= ~(OTG_SYS_FORCESUSPEND | OTG_SYS_FORCESLEEP |
OTG_SYS_SIDDQ_UOTG | OTG_SYS_REFCLKSEL_MASK |
OTG_SYS_COMMON_ON);
/* OTG phy and link reset */
phyotg |= OTG_SYS_PHY0_SWRST | OTG_SYS_PHYLINK_SWRST |
OTG_SYS_OTGDISABLE | OTG_SYS_REFCLKSEL_MASK;
/* do the reset */
bus_space_write_4(&armv7_generic_bs_tag, usb2phy_bsh,
USB_PHY_OTG_SYS, phyotg);
DELAY(10000);
phyotg &= ~(OTG_SYS_PHY0_SWRST | OTG_SYS_LINK_SWRST_UOTG |
OTG_SYS_PHYLINK_SWRST);
bus_space_write_4(&armv7_generic_bs_tag, usb2phy_bsh,
USB_PHY_OTG_SYS, phyotg);
#endif
/* enable EHCI DMA burst: */
ehcictrl = bus_space_read_4(&armv7_generic_bs_tag, usb2phy_bsh,
USB_PHY_HOST_EHCICTRL);
ehcictrl |= HOST_EHCICTRL_ENA_INCRXALIGN |
HOST_EHCICTRL_ENA_INCR4 | HOST_EHCICTRL_ENA_INCR8 |
HOST_EHCICTRL_ENA_INCR16;
bus_space_write_4(&armv7_generic_bs_tag, usb2phy_bsh,
USB_PHY_HOST_EHCICTRL, ehcictrl);
/* Set OHCI suspend */
ohcictrl = bus_space_read_4(&armv7_generic_bs_tag, usb2phy_bsh,
USB_PHY_HOST_OHCICTRL);
ohcictrl |= HOST_OHCICTRL_SUSPLGCY;
bus_space_write_4(&armv7_generic_bs_tag, usb2phy_bsh,
USB_PHY_HOST_OHCICTRL, ohcictrl);
}
开发者ID:ryo,项目名称:netbsd-src,代码行数:98,代码来源:exynos_soc.c
示例18: amptimer_get_timecount
u_int
amptimer_get_timecount(struct timecounter *tc)
{
struct amptimer_softc *sc = amptimer_timecounter.tc_priv;
return bus_space_read_4(sc->sc_iot, sc->sc_ioh, GTIMER_CNT_LOW);
}
开发者ID:SylvestreG,项目名称:bitrig,代码行数:6,代码来源:amptimer.c
示例19: sackbc_attach
static void
sackbc_attach(device_t parent, device_t self, void *aux)
{
struct sackbc_softc *sc = device_private(self);
struct sacc_softc *psc = device_private(parent);
struct sa1111_attach_args *aa = (struct sa1111_attach_args *)aux;
device_t child;
uint32_t tmp, clock_bit;
int intr, slot;
switch (aa->sa_addr) {
case SACC_KBD0: clock_bit = (1<<6); intr = 21; break;
case SACC_KBD1: clock_bit = (1<<5); intr = 18; break;
default:
return;
}
if (aa->sa_size <= 0)
aa->sa_size = SACCKBD_SIZE;
if (aa->sa_intr == SACCCF_INTR_DEFAULT)
aa->sa_intr = intr;
sc->dev = self;
sc->iot = psc->sc_iot;
if (bus_space_subregion(psc->sc_iot, psc->sc_ioh,
aa->sa_addr, aa->sa_size, &sc->ioh)) {
aprint_normal(": can't map subregion\n");
return;
}
/* enable clock for PS/2 kbd or mouse */
tmp = bus_space_read_4(psc->sc_iot, psc->sc_ioh, SACCSC_SKPCR);
bus_space_write_4(psc->sc_iot, psc->sc_ioh, SACCSC_SKPCR,
tmp | clock_bit);
sc->ih_rx = NULL;
sc->intr = aa->sa_intr;
sc->polling = 0;
tmp = bus_space_read_4(sc->iot, sc->ioh, SACCKBD_CR);
bus_space_write_4(sc->iot, sc->ioh, SACCKBD_CR, tmp | KBDCR_ENA);
/* XXX: this is necessary to get keyboard working. but I don't know why */
bus_space_write_4(sc->iot, sc->ioh, SACCKBD_CLKDIV, 2);
tmp = bus_space_read_4(sc->iot, sc->ioh, SACCKBD_STAT);
if ((tmp & KBDSTAT_ENA) == 0) {
printf("??? can't enable KBD controller\n");
return;
}
printf("\n");
sc->pt = pckbport_attach(sc, &sackbc_ops);
/*
* Although there is no such thing as SLOT for SA-1111 kbd
* controller, pckbd and pms drivers require it.
*/
for (slot = PCKBPORT_KBD_SLOT; slot <= PCKBPORT_AUX_SLOT; ++slot) {
child = pckbport_attach_slot(self, sc->pt, slot);
if (child == NULL)
continue;
sc->slot = slot;
rnd_attach_source(&sc->rnd_source, device_xname(child),
RND_TYPE_TTY, RND_FLAG_DEFAULT|RND_FLAG_ESTIMATE_VALUE);
/* only one of KBD_SLOT or AUX_SLOT is used. */
break;
}
}
开发者ID:krytarowski,项目名称:netbsd-current-src-sys,代码行数:71,代码来源:sa1111_kbc.c
示例20: amptimer_intr
int
amptimer_intr(void *frame)
{
struct amptimer_softc *sc = amptimer_cd.cd_devs[0];
struct amptimer_pcpu_softc *pc = &sc->sc_pstat[CPU_INFO_UNIT(curcpu())];
uint64_t now;
uint64_t nextevent;
uint32_t r, reg;
#if defined(USE_GTIMER_CMP)
int skip = 1;
#else
int64_t delay;
#endif
int rc = 0;
/*
* DSR - I know that the tick timer is 64 bits, but the following
* code deals with rollover, so there is no point in dealing
* with the 64 bit math, just let the 32 bit rollover
* do the right thing
*/
now = amptimer_readcnt64(sc);
while (pc->pc_nexttickevent <= now) {
pc->pc_nexttickevent += sc->sc_ticks_per_intr;
pc->pc_ticks_err_sum += sc->sc_ticks_err_cnt;
/* looping a few times is fas
|
请发表评论