On Sun, Jan 31, 2016 at 10:45:42PM +1100, Jonathan Gray wrote: > On Sun, Jan 31, 2016 at 10:12:05AM +0200, Artturi Alm wrote: > > On Sun, Jan 31, 2016 at 01:14:35AM +0100, Patrick Wildt wrote: > > > Hi, > > > > > > one of the reasons Allwinner A20/sun7i-based boards, like the > > > Cubieboard 2 or Banana Pi, don't boot is that the sxitimer does > > > not work for us. We are getting no hardclock ticks and so the > > > system can't work. > > > > > > There's a simple fix for that. We can just not use the sxitimer > > > and instead use the ARM architected timer (agtimer) that is > > > supposed to be a generic implementation for all new cores and > > > already attaches anyway. The sxitimer attachment currently > > > overrides the agtimer. Removing sxitimer thus allows agtimer > > > to actually do its work. > > > > > > Currently sxirtc uncondtionally ties into sxitimer. To make > > > this work, just make sxirtc map its own page instead of relying > > > on the existence of a mapping created by sxitimer. > > > > > > The address/size used for the sxirtc is from a device tree > > > source. > > > > > > Patrick > > > > > > > Hi, > > > > nothing i would change about your diff, given now there's agtimer, > > but it doesn't really seem to even try fixing rtc on A20, and leaves > > ugly glue into sxitimer written just for A20, which imho should also > > get cleaned up. > > > > -Artturi > > There seem to be at least two diffs here, the different rtc handling > for a20 should be split out, store sxirtc_a20 in the softc and fix > the test from > if (BOARD_ID_SUN7I_A20) > to > if (board_id == BOARD_ID_SUN7I_A20) >
Yes, it was quick try during my morning coffee, i'm sorry to have wasted your time with the previous obviously wrong diff. sxitimer a20 support glue cleanup diff inline. -Artturi diff --git a/sys/arch/armv7/sunxi/sun7i.c b/sys/arch/armv7/sunxi/sun7i.c index 0d06b31..d8fcd45 100644 --- a/sys/arch/armv7/sunxi/sun7i.c +++ b/sys/arch/armv7/sunxi/sun7i.c @@ -39,19 +39,6 @@ struct armv7_dev sxia20_devs[] = { .mem = { { CCMU_ADDR, CCMU_SIZE } }, }, - /* Timers/Counters, resources mapped on first unit */ - { .name = "sxitimer", - .unit = 0, - .mem = { { TIMER_ADDR, TIMERx_SIZE }, - { CPUCNTRS_ADDR, CPUCNTRS_ADDR } } - }, - { .name = "sxitimer", - .unit = 1, - }, - { .name = "sxitimer", - .unit = 2, - }, - /* Watchdog Timer */ { .name = "sxidog", .unit = 0, diff --git a/sys/arch/armv7/sunxi/sxitimer.c b/sys/arch/armv7/sunxi/sxitimer.c index c07f85a..97eb51b 100644 --- a/sys/arch/armv7/sunxi/sxitimer.c +++ b/sys/arch/armv7/sunxi/sxitimer.c @@ -44,11 +44,6 @@ #define TIMER_INTV(x) (0x14 + (0x10 * (x))) #define TIMER_CURR(x) (0x18 + (0x10 * (x))) -/* A20 counter, relative to CPUCNTRS_ADDR */ -#define OSC24M_CNT64_CTRL 0x80 -#define OSC24M_CNT64_LOW 0x84 -#define OSC24M_CNT64_HIGH 0x88 - /* A1X counter */ #define CNT64_CTRL 0xa0 #define CNT64_LOW 0xa4 @@ -56,7 +51,6 @@ #define CNT64_CLR_EN (1 << 0) /* clear enable */ #define CNT64_RL_EN (1 << 1) /* read latch enable */ -#define CNT64_SYNCH (1 << 4) /* sync to OSC24M counter */ #define LOSC_CTRL 0x100 #define OSC32K_SRC_SEL (1 << 0) @@ -99,7 +93,6 @@ static struct timecounter sxitimer_timecounter = { bus_space_tag_t sxitimer_iot; bus_space_handle_t sxitimer_ioh; -bus_space_handle_t sxitimer_cntr_ioh; uint32_t sxitimer_freq[] = { TIMER0_FREQUENCY, @@ -120,10 +113,6 @@ uint32_t sxitimer_statvar, sxitimer_statmin; uint32_t sxitimer_tick_nextevt, sxitimer_stat_nextevt; uint32_t sxitimer_ticks_err_cnt, sxitimer_ticks_err_sum; -bus_addr_t cntr64_ctrl = CNT64_CTRL; -bus_addr_t cntr64_low = CNT64_LOW; -bus_addr_t cntr64_high = CNT64_HIGH; - struct sxitimer_softc { struct device sc_dev; }; @@ -140,7 +129,7 @@ void sxitimer_attach(struct device *parent, struct device *self, void *args) { struct armv7_attach_args *aa = args; - uint32_t freq, ival, now, cr, v; + uint32_t freq, ival, now, cr; int unit = self->dv_unit; if (unit != 0) @@ -152,29 +141,10 @@ sxitimer_attach(struct device *parent, struct device *self, void *args) aa->aa_dev->mem[0].size, 0, &sxitimer_ioh)) panic("sxitimer_attach: bus_space_map failed!"); - - if (board_id == BOARD_ID_SUN7I_A20) { - if (bus_space_map(sxitimer_iot, CPUCNTRS_ADDR, CPUCNTRS_SIZE, - 0, &sxitimer_cntr_ioh)) - panic("sxitimer_attach: bus_space_map failed!"); - - cntr64_ctrl = OSC24M_CNT64_CTRL; - cntr64_low = OSC24M_CNT64_LOW; - cntr64_high = OSC24M_CNT64_HIGH; - - v = bus_space_read_4(sxitimer_iot, sxitimer_cntr_ioh, - cntr64_ctrl); - bus_space_write_4(sxitimer_iot, sxitimer_cntr_ioh, cntr64_ctrl, - v | CNT64_SYNCH); - bus_space_write_4(sxitimer_iot, sxitimer_cntr_ioh, cntr64_ctrl, - v & ~CNT64_SYNCH); - } else - sxitimer_cntr_ioh = sxitimer_ioh; - /* clear counter, loop until ready */ - bus_space_write_4(sxitimer_iot, sxitimer_cntr_ioh, cntr64_ctrl, + bus_space_write_4(sxitimer_iot, sxitimer_ioh, CNT64_CTRL, CNT64_CLR_EN); /* XXX as a side-effect counter clk src=OSC24M */ - while (bus_space_read_4(sxitimer_iot, sxitimer_cntr_ioh, cntr64_ctrl) + while (bus_space_read_4(sxitimer_iot, sxitimer_ioh, CNT64_CTRL) & CNT64_CLR_EN) continue; @@ -398,9 +368,8 @@ sxitimer_readcnt64(void) uint32_t low, high; /* latch counter, loop until ready */ - bus_space_write_4(sxitimer_iot, sxitimer_cntr_ioh, - cntr64_ctrl, CNT64_RL_EN); - while (bus_space_read_4(sxitimer_iot, sxitimer_cntr_ioh, cntr64_ctrl) + bus_space_write_4(sxitimer_iot, sxitimer_ioh, CNT64_CTRL, CNT64_RL_EN); + while (bus_space_read_4(sxitimer_iot, sxitimer_ioh, CNT64_CTRL) & CNT64_RL_EN) continue; @@ -409,8 +378,8 @@ sxitimer_readcnt64(void) * iirc. A20 manual mentions that low should be read first. */ /* XXX check above */ - low = bus_space_read_4(sxitimer_iot, sxitimer_cntr_ioh, cntr64_low); - high = bus_space_read_4(sxitimer_iot, sxitimer_cntr_ioh, cntr64_high); + low = bus_space_read_4(sxitimer_iot, sxitimer_ioh, CNT64_LOW); + high = bus_space_read_4(sxitimer_iot, sxitimer_ioh, CNT64_HIGH); return (uint64_t)high << 32 | low; }