Changeset View
Changeset View
Standalone View
Standalone View
sys/x86/isa/atrtc.c
Show First 20 Lines • Show All 79 Lines • ▼ Show 20 Lines | |||||
int atrtcclock_disable = 0; | int atrtcclock_disable = 0; | ||||
static int rtc_reg = -1; | static int rtc_reg = -1; | ||||
static u_char rtc_statusa = RTCSA_DIVIDER | RTCSA_NOPROF; | static u_char rtc_statusa = RTCSA_DIVIDER | RTCSA_NOPROF; | ||||
static u_char rtc_statusb = RTCSB_24HR; | static u_char rtc_statusb = RTCSB_24HR; | ||||
#ifdef DEV_ACPI | #ifdef DEV_ACPI | ||||
#define _COMPONENT ACPI_TIMER | #define _COMPONENT ACPI_TIMER | ||||
static int acpi_rtc_is_present; | |||||
ACPI_MODULE_NAME("ATRTC") | ACPI_MODULE_NAME("ATRTC") | ||||
#endif | #endif | ||||
/* | /* | ||||
* RTC support routines | * RTC support routines | ||||
*/ | */ | ||||
static inline u_char | static inline u_char | ||||
▲ Show 20 Lines • Show All 102 Lines • ▼ Show 20 Lines | |||||
*/ | */ | ||||
struct atrtc_softc { | struct atrtc_softc { | ||||
int port_rid, intr_rid; | int port_rid, intr_rid; | ||||
struct resource *port_res; | struct resource *port_res; | ||||
struct resource *intr_res; | struct resource *intr_res; | ||||
void *intr_handler; | void *intr_handler; | ||||
struct eventtimer et; | struct eventtimer et; | ||||
int is_active; | |||||
#ifdef DEV_ACPI | #ifdef DEV_ACPI | ||||
ACPI_HANDLE acpi_handle; | ACPI_HANDLE acpi_handle; | ||||
#endif | #endif | ||||
}; | }; | ||||
static int | static int | ||||
rtc_start(struct eventtimer *et, sbintime_t first, sbintime_t period) | rtc_start(struct eventtimer *et, sbintime_t first, sbintime_t period) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 74 Lines • ▼ Show 20 Lines | |||||
static bool | static bool | ||||
atrtc_check_cmos_access(bool is_read, ACPI_PHYSICAL_ADDRESS addr, UINT32 len) | atrtc_check_cmos_access(bool is_read, ACPI_PHYSICAL_ADDRESS addr, UINT32 len) | ||||
{ | { | ||||
/* Block address space wrapping on out-of-bound access */ | /* Block address space wrapping on out-of-bound access */ | ||||
if (addr >= ATRTC_LAST_REG || addr + len > ATRTC_LAST_REG) | if (addr >= ATRTC_LAST_REG || addr + len > ATRTC_LAST_REG) | ||||
return (false); | return (false); | ||||
if (is_read) { | if (is_read || !(acpi_rtc_is_present)) { | ||||
wulf: I do not understand what **!acpi_rtc_is_present** check does here.
This code opens a lot of RTC… | |||||
/* Reading 0x0C will muck with interrupts */ | /* Reading 0x0C will muck with interrupts */ | ||||
if (addr <= RTC_INTR && addr + len > RTC_INTR) | if (addr <= RTC_INTR && addr + len > RTC_INTR) | ||||
return (false); | return (false); | ||||
} else { | } else { | ||||
/* | /* | ||||
* Allow single-byte writes to alarm registers and | * Allow single-byte writes to alarm registers and | ||||
* multi-byte writes to addr >= 0x30, else deny. | * multi-byte writes to addr >= 0x30, else deny. | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 177 Lines • ▼ Show 20 Lines | if (!atrtcclock_disable && | ||||
sc->et.et_frequency = 32768; | sc->et.et_frequency = 32768; | ||||
sc->et.et_min_period = 0x00080000; | sc->et.et_min_period = 0x00080000; | ||||
sc->et.et_max_period = 0x80000000; | sc->et.et_max_period = 0x80000000; | ||||
sc->et.et_start = rtc_start; | sc->et.et_start = rtc_start; | ||||
sc->et.et_stop = rtc_stop; | sc->et.et_stop = rtc_stop; | ||||
sc->et.et_priv = dev; | sc->et.et_priv = dev; | ||||
et_register(&sc->et); | et_register(&sc->et); | ||||
} | } | ||||
sc->is_active = 1; | |||||
return(0); | return(0); | ||||
} | } | ||||
static int | static int | ||||
atrtc_isa_attach(device_t dev) | atrtc_isa_attach(device_t dev) | ||||
{ | { | ||||
return (atrtc_attach(dev)); | return (atrtc_attach(dev)); | ||||
} | } | ||||
#ifdef DEV_ACPI | #ifdef DEV_ACPI | ||||
static int | static int | ||||
atrtc_acpi_attach(device_t dev) | atrtc_acpi_attach(device_t dev) | ||||
{ | { | ||||
int ret; | int ret; | ||||
wulfUnsubmitted Not Done Inline Actionsblank line is missed wulf: blank line is missed | |||||
acpi_rtc_is_present = acpi_DeviceIsPresent(dev); | |||||
if (acpi_rtc_is_present){ | |||||
wulfUnsubmitted Not Done Inline Actions- if (acpi_rtc_is_present){ + if (acpi_rtc_is_present) { wulf: ``` lang=diff
- if (acpi_rtc_is_present){
+ if (acpi_rtc_is_present) {
``` | |||||
ret = atrtc_attach(dev); | ret = atrtc_attach(dev); | ||||
if (ret) | if (ret) | ||||
return (ret); | return (ret); | ||||
}else{ | |||||
wulfUnsubmitted Not Done Inline Actions- }else{ + } else { wulf: ```lang=diff
- }else{
+ } else {
``` | |||||
device_printf(dev, "disabled in acpi handle. Only address space handler\n"); | |||||
} | |||||
(void)atrtc_reg_acpi_cmos_handler(dev); | (void)atrtc_reg_acpi_cmos_handler(dev); | ||||
return (0); | return (0); | ||||
} | } | ||||
static int | static int | ||||
atrtc_acpi_detach(device_t dev) | atrtc_acpi_detach(device_t dev) | ||||
{ | { | ||||
(void)atrtc_unreg_acpi_cmos_handler(dev); | (void)atrtc_unreg_acpi_cmos_handler(dev); | ||||
return (0); | return (0); | ||||
} | } | ||||
#endif /* DEV_ACPI */ | #endif /* DEV_ACPI */ | ||||
static int | static int | ||||
atrtc_resume(device_t dev) | atrtc_resume(device_t dev) | ||||
{ | { | ||||
struct atrtc_softc *sc = device_get_softc(dev); | |||||
wulfUnsubmitted Not Done Inline Actionsblank line is missed wulf: blank line is missed | |||||
if(sc->is_active) | |||||
wulfUnsubmitted Not Done Inline Actions- if(sc->is_active) + if (sc->is_active) wulf: ```lang=diff
- if(sc->is_active)
+ if (sc->is_active)
``` | |||||
atrtc_restore(); | atrtc_restore(); | ||||
return(0); | return(0); | ||||
} | } | ||||
static int | static int | ||||
atrtc_settime(device_t dev __unused, struct timespec *ts) | atrtc_settime(device_t dev __unused, struct timespec *ts) | ||||
{ | { | ||||
struct bcd_clocktime bct; | struct bcd_clocktime bct; | ||||
▲ Show 20 Lines • Show All 124 Lines • Show Last 20 Lines |
I do not understand what !acpi_rtc_is_present check does here.
This code opens a lot of RTC registers for write if execution of _STA method returned 'Not present'.
To make region handler dummy, if it is required, !acpi_rtc_is_present check should be moved to atrtc_acpi_cmos_handler() and should return AE_OK on success.
P.S. soft context is available in atrtc_acpi_cmos_handler(), so acpi_rtc_is_present global variable may be converted to sc->is_present