| @@ -1977,15 +1977,113 @@ extern int drm_get_platform_dev(struct p | | | @@ -1977,15 +1977,113 @@ extern int drm_get_platform_dev(struct p |
1977 | | | 1977 | |
1978 | /* returns true if currently okay to sleep */ | | 1978 | /* returns true if currently okay to sleep */ |
1979 | static __inline__ bool drm_can_sleep(void) | | 1979 | static __inline__ bool drm_can_sleep(void) |
1980 | { | | 1980 | { |
1981 | #ifdef __NetBSD__ | | 1981 | #ifdef __NetBSD__ |
1982 | return false; /* XXX */ | | 1982 | return false; /* XXX */ |
1983 | #else | | 1983 | #else |
1984 | if (in_atomic() || in_dbg_master() || irqs_disabled()) | | 1984 | if (in_atomic() || in_dbg_master() || irqs_disabled()) |
1985 | return false; | | 1985 | return false; |
1986 | return true; | | 1986 | return true; |
1987 | #endif | | 1987 | #endif |
1988 | } | | 1988 | } |
1989 | | | 1989 | |
| | | 1990 | #ifdef __NetBSD__ |
| | | 1991 | static inline bool |
| | | 1992 | DRM_IS_BUS_SPACE(struct drm_local_map *map) |
| | | 1993 | { |
| | | 1994 | switch (map->type) { |
| | | 1995 | case _DRM_FRAME_BUFFER: |
| | | 1996 | panic("I don't know how to access drm frame buffer memory!"); |
| | | 1997 | |
| | | 1998 | case _DRM_REGISTERS: |
| | | 1999 | return true; |
| | | 2000 | |
| | | 2001 | case _DRM_SHM: |
| | | 2002 | panic("I don't know how to access drm shared memory!"); |
| | | 2003 | |
| | | 2004 | case _DRM_AGP: |
| | | 2005 | panic("I don't know how to access drm agp memory!"); |
| | | 2006 | |
| | | 2007 | case _DRM_SCATTER_GATHER: |
| | | 2008 | panic("I don't know how to access drm scatter-gather memory!"); |
| | | 2009 | |
| | | 2010 | case _DRM_CONSISTENT: |
| | | 2011 | /* |
| | | 2012 | * XXX Old drm uses bus space access for this, but |
| | | 2013 | * consistent maps don't have bus space handles! They |
| | | 2014 | * do, however, have kernel virtual addresses in the |
| | | 2015 | * map->handle, so maybe that's right. |
| | | 2016 | */ |
| | | 2017 | #if 0 |
| | | 2018 | return false; |
| | | 2019 | #endif |
| | | 2020 | panic("I don't know how to access drm consistent memory!"); |
| | | 2021 | |
| | | 2022 | case _DRM_GEM: |
| | | 2023 | panic("I don't know how to access drm gem memory!"); |
| | | 2024 | } |
| | | 2025 | } |
| | | 2026 | |
| | | 2027 | static inline uint8_t |
| | | 2028 | DRM_READ8(struct drm_local_map *map, bus_size_t offset) |
| | | 2029 | { |
| | | 2030 | if (DRM_IS_BUS_SPACE(map)) |
| | | 2031 | return bus_space_read_1(map->lm_data.bus_space.bst, |
| | | 2032 | map->lm_data.bus_space.bsh, offset); |
| | | 2033 | else |
| | | 2034 | return *(volatile uint8_t *)((vaddr_t)map->handle + offset); |
| | | 2035 | } |
| | | 2036 | |
| | | 2037 | static inline uint16_t |
| | | 2038 | DRM_READ16(struct drm_local_map *map, bus_size_t offset) |
| | | 2039 | { |
| | | 2040 | if (DRM_IS_BUS_SPACE(map)) |
| | | 2041 | return bus_space_read_2(map->lm_data.bus_space.bst, |
| | | 2042 | map->lm_data.bus_space.bsh, offset); |
| | | 2043 | else |
| | | 2044 | return *(volatile uint16_t *)((vaddr_t)map->handle + offset); |
| | | 2045 | } |
| | | 2046 | |
| | | 2047 | static inline uint32_t |
| | | 2048 | DRM_READ32(struct drm_local_map *map, bus_size_t offset) |
| | | 2049 | { |
| | | 2050 | if (DRM_IS_BUS_SPACE(map)) |
| | | 2051 | return bus_space_read_4(map->lm_data.bus_space.bst, |
| | | 2052 | map->lm_data.bus_space.bsh, offset); |
| | | 2053 | else |
| | | 2054 | return *(volatile uint32_t *)((vaddr_t)map->handle + offset); |
| | | 2055 | } |
| | | 2056 | |
| | | 2057 | static inline void |
| | | 2058 | DRM_WRITE8(struct drm_local_map *map, bus_size_t offset, uint8_t value) |
| | | 2059 | { |
| | | 2060 | if (DRM_IS_BUS_SPACE(map)) |
| | | 2061 | bus_space_write_1(map->lm_data.bus_space.bst, |
| | | 2062 | map->lm_data.bus_space.bsh, offset, value); |
| | | 2063 | else |
| | | 2064 | *(volatile uint8_t *)((vaddr_t)map->handle + offset) = value; |
| | | 2065 | } |
| | | 2066 | |
| | | 2067 | static inline void |
| | | 2068 | DRM_WRITE16(struct drm_local_map *map, bus_size_t offset, uint16_t value) |
| | | 2069 | { |
| | | 2070 | if (DRM_IS_BUS_SPACE(map)) |
| | | 2071 | bus_space_write_2(map->lm_data.bus_space.bst, |
| | | 2072 | map->lm_data.bus_space.bsh, offset, value); |
| | | 2073 | else |
| | | 2074 | *(volatile uint16_t *)((vaddr_t)map->handle + offset) = value; |
| | | 2075 | } |
| | | 2076 | |
| | | 2077 | static inline void |
| | | 2078 | DRM_WRITE32(struct drm_local_map *map, bus_size_t offset, uint32_t value) |
| | | 2079 | { |
| | | 2080 | if (DRM_IS_BUS_SPACE(map)) |
| | | 2081 | bus_space_write_4(map->lm_data.bus_space.bst, |
| | | 2082 | map->lm_data.bus_space.bsh, offset, value); |
| | | 2083 | else |
| | | 2084 | *(volatile uint32_t *)((vaddr_t)map->handle + offset) = value; |
| | | 2085 | } |
| | | 2086 | #endif /* defined(__NetBSD__) */ |
| | | 2087 | |
1990 | #endif /* __KERNEL__ */ | | 2088 | #endif /* __KERNEL__ */ |
1991 | #endif | | 2089 | #endif |